@sidekick-coder/zenith-kit 0.3.2 → 0.3.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/dist/client/index.d.mts +17 -2
- package/dist/client/index.mjs +2 -2
- package/dist/components/index.es.js +78 -71
- package/dist/server/index.d.mts +40 -3
- package/dist/server/index.mjs +4 -4
- package/dist/shared/index.d.mts +1 -1
- package/package.json +1 -1
- package/tsdown.config.ts +2 -1
package/dist/client/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./chunk-0Lt9GpW0.mjs";import{toast as t}from"vue-sonner";import n from"qs";import{debounce as r,get as i,has as a,orderBy as o,set as s,unset as c}from"lodash-es";import*as l from"valibot";import{format as u}from"date-fns";import{defineAbility as d,subject as f}from"@casl/ability";import{createMemoryHistory as p,createRouter as m,createWebHistory as h}from"vue-router";import{computed as g,getCurrentInstance as _,getCurrentScope as ee,hasInjectionContext as te,inject as ne,isRef as v,nextTick as re,onMounted as ie,provide as ae,ref as y,shallowRef as b,toRef as x,toValue as S,unref as oe,watch as C,watchEffect as se}from"vue";import{toTypedSchema as ce}from"@vee-validate/valibot";import{useForm as le}from"vee-validate";import{useRouteQuery as ue}from"@vueuse/router";async function w(e){try{return[null,await e()]}catch(e){return[e,null]}}w.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var T=class{static __container_entry_key=`FetchService`;async handleError(e){if(e.headers.get(`Content-Type`)?.includes(`json`)){let n=await e.json().catch(()=>({message:$t(`Internal Server Error`)}));return n.message&&t.error(n.message),n}return t.error($t(`Internal Server Error`)),{message:$t(`Internal Server Error`)}}buildUrl(e,t){if(!t)return e;let r=n.stringify(t,{arrayFormat:`brackets`});return e+`?`+r}buildRequestInit(e){let t={...e};return e.data&&(t.body=JSON.stringify(e.data),t.headers={...t.headers,"Content-Type":`application/json`}),t}async parseResponse(e){return e.headers.get(`Content-Type`)?.includes(`json`)?e.json():e.text()}async fetch(e,t={}){throw Error(`Method not implemented`)}async try(e,t={}){return w(()=>this.fetch(e,t))}async get(e,t={}){return this.fetch(e,{...t,method:`GET`})}async post(e,t={}){return this.fetch(e,{...t,method:`POST`})}async put(e,t={}){return this.fetch(e,{...t,method:`PUT`})}async delete(e,t={}){return this.fetch(e,{...t,method:`DELETE`})}},de=class e extends Error{status=500;constructor(e,t=500){super(e),this.name=`BaseException`,this.status=t}static fromError(t){return new e(t.message,500)}},fe=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new de(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}unset(e){let t=this.getKey(e);this.entries.delete(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const E=globalThis.clientContainer||new fe;globalThis.clientContainer=E;const D=E.proxy(T);function O(...e){return e.reduce((e,t)=>t(e),class{})}function pe(e,...t){return t.reduce((e,t)=>t(e),e)}function me(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function k(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}function A(e){return class extends e{created_at;updated_at}}function j(e){return class extends e{deleted_at=null}}O(k,A,j);var he=class{static __container_entry_key=`AuthService`;user;constructor(e={}){this.user=e.user||null}async logout(e){let[t]=await D.try(`/auth/logout`,{method:`POST`});t||(window.location.href=e?.redirect||`/`)}},ge=class extends T{async fetch(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i);return await this.parseResponse(i)}},_e=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}};function ve(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;if(i&&typeof i==`object`){ve(i,e,n);continue}n[e]=i}return n}function ye(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function be(e=``){return e+ye()}var xe=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let r=n.value;return typeof r!=`object`||Array.isArray(r)?!1:a(r,e.substring(t.length+1))}get(e,t){let n=this.entries.get(e);if(n)return n.value;if(!e.includes(`.`))return t;let r=e.split(`.`)[0],a=this.entries.get(r);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:i(o,e.substring(r.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),s(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(c(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return ve(this.toRecord())}};const Se=E.proxy(xe);function Ce(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function we(e){let t={},r=e.split(`?`)[1];return r?n.parse(r):t}var Te=class extends T{async fetch(e,t={}){return!e.startsWith(`http://`)&&!e.startsWith(`https://`)?this.fetchInternal(e,t):this.fetchExternal(e,t)}async fetchExternal(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}async fetchInternal(e,t={}){let n=E.get(`RouterService`),r=t.method||`GET`,i=n.resolve(r,e),a=new _e({prefix:Se.get(`cookie.prefix`,``)});if(E.has(`cookies`)&&a.load(E.get(`cookies`)),!i||!i.handler)throw Error(`Route not found for ${r} ${e}`);return await n.execute(i,{url:e,params:Ce(i.path,e),query:t.query||we(e),body:t.data||t.body,method:r.toLowerCase(),cookie:a})}},M=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},Ee=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new M,this.debug&&this.logger.debug(`emmitter loaded with debug mode enabled`)}static create(t){return new e(t)}setDebug(e){this.debug=e,this.debug&&this.logger.debug(`debug mode enabled`)}setLogger(e){this.logger=e}on(e,t,n){let r=n?.id||be();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=(n,i)=>{t(n,i),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,t,n){let i=r(t,n?.debounce||300),a=this.on(e,i,n);return a&&(a.originalListener=t),a}onAnyOf(e,t,n){let r=[];for(let i of e){let e=this.on(i,t,n);e&&r.push(e)}return r}off(e,t){this.handlers=this.handlers.filter(n=>!(n.event===e&&(n.listener===t||n.originalListener===t))),this.debug&&this.logger.debug(`handler removed`,{event:e})}emit(e,t){this.debug&&this.logger.debug(`emitting event`,{event:e,args:t});let n=this.handlers.filter(t=>t.event===e);for(let r of n)w.sync(()=>r.listener(t,{event:e}))}async emitAndWait(e,t){let n=this.handlers.filter(t=>t.event===e);this.debug&&this.logger.debug(`emitting event and wait`,{handlers:n.length,event:e,args:t});for await(let r of n)await r.listener(t,{event:e})}list(){return this.handlers}listByEvent(e){return this.handlers.filter(t=>t.event===e)}remove(e){let t=Array.isArray(e)?e:[e];this.handlers=this.handlers.filter(e=>!t.includes(e.id)),this.debug&&this.logger.debug(`handlers removed`,{ids:t})}clear(){this.handlers=[],this.debug&&this.logger.debug(`all handlers cleared`)}hasHandlers(){return this.handlers.length>0}},De=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},Oe=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new M,e.onError&&(this.onError=e.onError)}setOnError(e){this.onError=e}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=o(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await w(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}on(e,t){let n=new De;n.hook_id=`custom:${e}:${Date.now()}`,n[e]=t,this.add(n)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}};const N=()=>l.pipe(l.union([l.string(),l.number()]),l.transform(Number),l.integer()),ke=()=>l.pipe(l.union([l.string(),l.boolean()]),l.transform(e=>e===!0||e===`true`)),Ae=()=>l.pipe(l.union([l.string(),l.date()]),l.transform(e=>e instanceof Date?e:new Date(e)),l.transform(e=>e&&u(e,`yyyy-MM-dd`))),je=()=>l.pipe(l.union([l.string(),l.date()]),l.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),u(e,`yyyy-MM-dd HH:mm`))))),P=(e=l.any())=>l.pipe(l.union([l.string(),l.array(l.string())]),l.transform(e=>Array.isArray(e)?e:e.split(`,`)),l.array(e)),Me=()=>l.pipe(P(),l.transform(e=>e.map(Number))),Ne=()=>l.pipe(l.union([l.string(),l.record(l.string(),l.any())]),l.transform(e=>typeof e==`string`?n.parse(e):e),l.transform(e=>{let t={};for(let n in e)s(t,n,i(e,n));return t}));function F(){return Ne()}F.number=N,F.boolean=ke,F.date=Ae,F.datetime=je,F.array=P,F.arrayNumber=Me,F.object=Ne;const Pe=()=>l.pipe(l.string(),l.transform(e=>{let t=e.split(/[;\n]/).filter(Boolean).filter(e=>e.includes(`=`)).map(e=>e.trim().split(`=`)),n=Object.fromEntries(t),r={};for(let[e,t]of Object.entries(n)){let n=t;t.startsWith(`bool:`)&&(n=t.replace(`bool:`,``).trim()===`true`),s(r,e,n)}return r})),Fe=(e={})=>l.object({page:l.optional(N(),1),limit:l.optional(N(),e.maxLimit||100),orderBy:l.nullish(e.orderFields?P(l.picklist(e.orderFields)):P(l.string()),[]),orderDirection:l.nullish(P(l.union([l.literal(`asc`),l.literal(`desc`)])),[])});function Ie(e={}){return Fe(e)}Ie.base=Fe;var Le=e({array:()=>P,arrayNumber:()=>Me,base:()=>Fe,boolean:()=>ke,date:()=>Ae,datetime:()=>je,keyValue:()=>Pe,number:()=>N,object:()=>Ne,pagination:()=>Ie,url:()=>F});const I=new class{static __container_entry_key=`ValidatorService`;v={...l,extras:Le};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=l.safeParse(n,e);if(!a){let e=l.flatten(i),t=[];e.root&&t.push(...e.root),e.nested&&Object.entries(e.nested).forEach(e=>{let[n,r]=e;t.push(...r.map(e=>`${n}: ${e}`))});let n=new de(t.length?t.join(`, `):`Validation failed`,422);throw n.name=`ValidationError`,Object.assign(n,{messages:t}),n}return r}async validateAsync(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=await l.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=l.flatten(i),n={...t.root,...t.nested};throw Object.assign(e,{details:n}),e}return r}isValid(e,t){let n=typeof t==`function`?t(this.v):t,{success:r}=l.safeParse(n,e);return r}};function L(){return I.create(e=>e.object({id:e.number(),dashboard_id:e.number(),name:e.string(),value:e.nullable(e.string())}))}L.create=I.create(e=>e.pick(L(),[`dashboard_id`,`name`,`value`])),L.update=I.create(e=>e.partial(L.create));function R(){return I.create(e=>e.object({id:e.number(),name:e.string(),description:e.nullable(e.string()),created_at:e.string(),updated_at:e.string(),deleted_at:e.nullable(e.string()),metas:e.optional(e.record(e.string(),e.any()))}))}R.create=I.create(e=>e.pick(R(),[`name`,`description`])),R.update=I.create(e=>e.partial(R.create)),l.object({id:l.number(),permission_id:l.number(),assignable_type:l.string(),assignable_id:l.string(),created_at:l.string(),updated_at:l.string()}),l.object({id:l.number(),name:l.nullable(l.string()),description:l.nullable(l.string()),action:l.string(),subject:l.string(),conditions:l.nullable(l.string()),created_at:l.string(),updated_at:l.string(),expires_at:l.string()}),l.object({id:l.number(),name:l.nullable(l.string()),type:l.string(),user_id:l.number(),token:l.string(),created_at:l.string(),updated_at:l.string(),expires_at:l.string()});function z(){return l.object({id:l.number(),name:l.optional(l.string()),email:l.pipe(l.string(),l.email()),password:l.pipe(l.string(),l.minLength(6)),username:l.pipe(l.string(),l.regex(/^[a-zA-Z0-9_-]+$/)),verified_at:l.nullable(l.string()),created_at:l.string(),updated_at:l.string(),deleted_at:l.nullable(l.string())})}z.create=()=>l.omit(z(),[`id`,`verified_at`,`created_at`,`updated_at`,`deleted_at`]),z.update=()=>l.partial(z.create());async function Re(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function ze(e,t,n){let r=e.listeners||[];r.find(e=>e.event===t&&e.listener===n)||(r.push({event:t,listener:n}),e.listeners=r)}function Be(e){return class extends e{constructor(...e){super(...e),typeof this.constructor.boot==`function`&&this.constructor.boot.apply(this.constructor)}static listeners=[];static on(e,t){return ze(this,e,t)}static async emit(e,...t){return Re(this,e,...t)}}}Be.emit=Re,Be.on=ze;var Ve=class extends O(k){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=w.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},He=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>Ve.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new M().child({label:`acl`}),this.ability=d(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=f(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=f(t,n);return this.ability.cannot(e,r)}subject(e,t){return f(e,t)}};O(k,A,j),O(k,A,j),O(k,A,j);var Ue=class extends O(k,me(De)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}};O(k);var We=class extends O(k){id;name;version;enabled;aliases;version_channel;version_available_channels};O(k,A,j);const B=E.proxy(Ee);var Ge=class{static __container_entry_key=`LayoutService`;components=new Map;options={};currendId=null;setCurrent(e){this.currendId=e,B.emit(`layout:change`,e)}add(e,t,n){this.components.set(e,t),this.options=n||{}}has(e){return this.components.has(e)}get(e){let t=this.components.get(e);if(!t)throw new de(`Layout ${e} not found`);return t}getOptions(){return this.options}getCurrent(){return this.currendId?this.get(this.currendId):null}setOptions(e={}){this.options=e,B.emit(`layout:set-options`,e)}},Ke=class extends Oe{addImports(e){let t=[];for(let[n,r]of Object.entries(e)){let e=new(r.default||r);e.hook_id=e.hook_id||n,t.push(e)}t.forEach(e=>this.add(e))}},qe=class extends O(k){id;label;layout;to;target;group;order;icon;parent};const Je=E.proxy(He);var Ye=class{static __container_entry_key=`MenuService`;items=new Map;add(...e){for(let t of e)t.id||=JSON.stringify(t),this.items.set(t.id,qe.from(t))}remove(e){this.items.delete(e)}list(e={}){let t=JSON.parse(JSON.stringify(Array.from(this.items.values())));return e.layout&&(t=t.filter(t=>t.layout===e.layout)),e.group&&(t=t.filter(t=>t.group===e.group||t.parent===e.group)),e.parent&&(t=t.filter(t=>t.parent===e.parent)),e.allowed!==void 0&&e.allowed===!0&&(t=t.filter(e=>Je.can(`view`,e))),t.sort((e,t)=>(e.order?e.order:98)-(t.order?t.order:98)),t}clear(){this.items.clear()}};const Xe=e=>{let t=Se.get(`setup`),n=!t?.need_database&&!t?.need_users;return n&&e.path.startsWith(`/setup`)?`/`:n?!0:e.path.startsWith(`/setup`)?e.path===`/setup`?!0:t?.need_database?e.path===`/setup/database`?!0:`/setup/database`:t?.need_users?e.path===`/setup/user`?!0:`/setup/user`:!0:`/setup`};function Ze(e,t={}){let n=[];for(let[r,i]of Object.entries(e)){if(t.exclude?.some(e=>typeof e==`string`?r.includes(e):e.test(r)))continue;let e=r.replace(/\.vue$/,``).split(`/`).filter(e=>e&&!e.startsWith(`.`)).map(e=>{let t=e;return t.startsWith(`[`)&&t.endsWith(`]`)&&(t=`:`+t.slice(1,-1)),t});t.strip?.length&&(e=e.filter(e=>!t.strip.some(t=>typeof t==`string`?e===t:t.test(e))));let a=e.join(`/`).replace(/index$/,``);t.prefix&&(a=t.prefix+`/`+a),a.startsWith(`/`)||(a=`/`+a),a.endsWith(`/`)&&(a=a.slice(0,-1));let o={path:a,component:i,beforeEnter:[]};t.guards&&Array.isArray(t.guards)&&(o.beforeEnter=t.guards),t.guards&&typeof t.guards==`function`&&(o.beforeEnter=t.guards(o)),n.push(o)}return t.refine&&(n=t.refine(n)),n}function Qe(){let e=import.meta.env.SSR,t=m({history:e?p():h(),routes:[],scrollBehavior(e,t,n){return n||{top:0}}});return t.beforeEach(Xe),t.auto=(e,n={})=>{let r=Ze(e,n);return r.forEach(e=>t.addRoute(e)),r},t}var $e=class{static __container_entry_key=`ToastService`;success(e,t){console.log(`Success:`,e,t)}error(e,t){console.error(`Error:`,e,t)}};const et=new WeakMap,tt=(...e)=>{let t=e[0],n=_()?.proxy??ee();if(n==null&&!te())throw Error(`injectLocal must be called in setup`);return n&&et.has(n)&&t in et.get(n)?et.get(n)[t]:ne(...e)},V=typeof window<`u`&&typeof document<`u`;typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope;const nt=Object.prototype.toString,rt=e=>nt.call(e)===`[object Object]`,it=()=>{};function at(e,t){function n(...n){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,n),{fn:t,thisArg:this,args:n})).then(r).catch(i)})}return n}const ot=e=>e();function st(e,t={}){let n,r,i=it,a=e=>{clearTimeout(e),i(),i=it},o;return s=>{let c=S(e),l=S(t.maxWait);return n&&a(n),c<=0||l!==void 0&&l<=0?(r&&=(a(r),void 0),Promise.resolve(s())):new Promise((e,u)=>{i=t.rejectOnCancel?u:e,o=s,l&&!r&&(r=setTimeout(()=>{n&&a(n),r=void 0,e(o())},l)),n=setTimeout(()=>{r&&a(r),r=void 0,e(s())},c)})}}function ct(e,t){if(typeof e==`number`)return e+t;let n=e.match(/^-?\d+\.?\d*/)?.[0]||``,r=e.slice(n.length),i=Number.parseFloat(n)+t;return Number.isNaN(i)?e:i+r}function H(e){return e.endsWith(`rem`)?Number.parseFloat(e)*16:Number.parseFloat(e)}function lt(e){return Array.isArray(e)?e:[e]}function ut(e){return e||_()}function dt(e,t,n={}){let{eventFilter:r=ot,...i}=n;return C(e,at(r,t),i)}function ft(e,t=!0,n){ut(n)?ie(e,n):t?e():re(e)}function pt(e,t,n={}){let{debounce:r=0,maxWait:i=void 0,...a}=n;return dt(e,t,{...a,eventFilter:st(r,{maxWait:i})})}function mt(e,t,n){return C(e,t,{...n,immediate:!0})}const ht=V?window:void 0;V&&window.document,V&&window.navigator,V&&window.location;function gt(e){let t=S(e);return t?.$el??t}function _t(...e){let t=(e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)),n=g(()=>{let t=lt(S(e[0])).filter(e=>e!=null);return t.every(e=>typeof e!=`string`)?t:void 0});return mt(()=>[n.value?.map(e=>gt(e))??[ht].filter(e=>e!=null),lt(S(n.value?e[1]:e[0])),lt(oe(n.value?e[2]:e[1])),S(n.value?e[3]:e[2])],([e,n,r,i],a,o)=>{if(!e?.length||!n?.length||!r?.length)return;let s=rt(i)?{...i}:i,c=e.flatMap(e=>n.flatMap(n=>r.map(r=>t(e,n,r,s))));o(()=>{c.forEach(e=>e())})},{flush:`post`})}function vt(){let e=b(!1),t=_();return t&&ie(()=>{e.value=!0},t),e}function yt(e){let t=vt();return g(()=>(t.value,!!e()))}const bt=Symbol(`vueuse-ssr-width`);function xt(){let e=te()?tt(bt,null):null;return typeof e==`number`?e:void 0}function U(e,t={}){let{window:n=ht,ssrWidth:r=xt()}=t,i=yt(()=>n&&`matchMedia`in n&&typeof n.matchMedia==`function`),a=b(typeof r==`number`),o=b(),s=b(!1);return se(()=>{if(a.value){a.value=!i.value,s.value=S(e).split(`,`).some(e=>{let t=e.includes(`not all`),n=e.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),i=e.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),a=!!(n||i);return n&&a&&(a=r>=H(n[1])),i&&a&&(a=r<=H(i[1])),t?!a:a});return}i.value&&(o.value=n.matchMedia(S(e)),s.value=o.value.matches)}),_t(o,`change`,e=>{s.value=e.matches},{passive:!0}),g(()=>s.value)}const St={sm:640,md:768,lg:1024,xl:1280,"2xl":1536};function Ct(e,t={}){function n(t,n){let r=S(e[S(t)]);return n!=null&&(r=ct(r,n)),typeof r==`number`&&(r=`${r}px`),r}let{window:r=ht,strategy:i=`min-width`,ssrWidth:a=xt()}=t,o=typeof a==`number`,s=o?b(!1):{value:!0};o&&ft(()=>s.value=!!r);function c(e,t){return!s.value&&o?e===`min`?a>=H(t):a<=H(t):r?r.matchMedia(`(${e}-width: ${t})`).matches:!1}let l=e=>U(()=>`(min-width: ${n(e)})`,t),u=e=>U(()=>`(max-width: ${n(e)})`,t),d=Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>i===`min-width`?l(t):u(t),enumerable:!0,configurable:!0}),e),{});function f(){let t=Object.keys(e).map(e=>[e,d[e],H(n(e))]).sort((e,t)=>e[2]-t[2]);return g(()=>t.filter(([,e])=>e.value).map(([e])=>e))}return Object.assign(d,{greaterOrEqual:l,smallerOrEqual:u,greater(e){return U(()=>`(min-width: ${n(e,.1)})`,t)},smaller(e){return U(()=>`(max-width: ${n(e,-.1)})`,t)},between(e,r){return U(()=>`(min-width: ${n(e)}) and (max-width: ${n(r,-.1)})`,t)},isGreater(e){return c(`min`,n(e,.1))},isGreaterOrEqual(e){return c(`min`,n(e))},isSmaller(e){return c(`max`,n(e,-.1))},isSmallerOrEqual(e){return c(`max`,n(e))},isInBetween(e,t){return c(`min`,n(e))&&c(`max`,n(t,-.1))},current:f,active(){let e=f();return g(()=>e.value.length===0?``:e.value.at(i===`min-width`?-1:0))}})}function wt(){return Ct(St)}function W(e){let t=/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*[\d.]+)?\)/.exec(e);if(!t)throw Error(`Invalid RGB color format: `+e);return{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3])}}function G(e){let t=/rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\d.]+)\)/.exec(e);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:parseFloat(t[4])}:{...W(e),a:1}}function Tt(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)throw Error(`Invalid HEX color format: `+e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}}function K(e){let t=/hsla?\((\d+),\s*(\d+)%,\s*(\d+)%(?:,\s*[\d.]+)?\)/.exec(e);if(!t)throw Error(`Invalid HSL color format: `+e);let n=parseInt(t[1])/360,r=parseInt(t[2])/100,i=parseInt(t[3])/100,a,o,s;if(r===0)a=o=s=i;else{let e=(e,t,n)=>(n<0&&(n+=1),n>1&&--n,n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e),t=i<.5?i*(1+r):i+r-i*r,c=2*i-t;a=e(c,t,n+1/3),o=e(c,t,n),s=e(c,t,n-1/3)}return{r:Math.round(a*255),g:Math.round(o*255),b:Math.round(s*255)}}function q(e,t,n){e/=255,t/=255,n/=255;let r=Math.max(e,t,n),i=Math.min(e,t,n),a=(r+i)/2;if(r===i)return{h:0,s:0,l:Math.round(a*100)};let o=r-i,s=a>.5?o/(2-r-i):o/(r+i),c=0;switch(r){case e:c=((t-n)/o+(t<n?6:0))*60;break;case t:c=((n-e)/o+2)*60;break;case n:c=((e-t)/o+4)*60;break}return{h:Math.round(c),s:Math.round(s*100),l:Math.round(a*100)}}function J(e,t,n){let r=e=>{let t=e.toString(16);return t.length===1?`0`+t:t};return`#${r(e)}${r(t)}${r(n)}`}function Et(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function Dt(e){let t=/oklch\(([\d.]+)\s+([\d.]+)\s+([\d.]+)\)/.exec(e);if(!t)throw Error(`Invalid OKLCH color format: `+e);return{l:parseFloat(t[1]),c:parseFloat(t[2]),h:parseFloat(t[3])}}function Ot(e){let{l:t,c:n,h:r}=Dt(e),i=r*Math.PI/180,a=n*Math.cos(i),o=n*Math.sin(i),s=t+.3963377774*a+.2158037573*o,c=t-.1055613458*a-.0638541728*o,l=t-.0894841775*a-1.291485548*o,u=s*s*s,d=c*c*c,f=l*l*l,p=4.0767416621*u-3.3077115913*d+.2309699292*f,m=-1.2684380046*u+2.6097574011*d-.3413193965*f,h=-.0041960863*u-.7034186147*d+1.707614701*f,g=e=>e>=.0031308?1.055*e**(1/2.4)-.055:12.92*e;return p=g(p),m=g(m),h=g(h),{r:Math.round(Math.max(0,Math.min(1,p))*255),g:Math.round(Math.max(0,Math.min(1,m))*255),b:Math.round(Math.max(0,Math.min(1,h))*255)}}function Y(e,t,n){e/=255,t/=255,n/=255;let r=e=>e>=.04045?((e+.055)/1.055)**2.4:e/12.92;e=r(e),t=r(t),n=r(n);let i=.4122214708*e+.5363325363*t+.0514459929*n,a=.2119034982*e+.6806995451*t+.1073969566*n,o=.0883024619*e+.2817188376*t+.6299787005*n,s=Math.cbrt(i),c=Math.cbrt(a),l=Math.cbrt(o),u=.2104542553*s+.793617785*c-.0040720468*l,d=1.9779984951*s-2.428592205*c+.4505937099*l,f=.0259040371*s+.7827717662*c-.808675766*l,p=Math.sqrt(d*d+f*f),m=180/Math.PI*Math.atan2(f,d);return m<0&&(m+=360),{l:Math.round(u*1e3)/1e3,c:Math.round(p*1e3)/1e3,h:Math.round(m*1e3)/1e3}}function X(e){let t=v(e)?e:y(S(e));return g({get(){return t.value?t.value.startsWith(`#`)?`hex`:/^rgba/.test(t.value)?`rgba`:/^rgb/.test(t.value)?`rgb`:/^oklch/.test(t.value)?`oklch`:/^hsla/.test(t.value)?`hsla`:/^hsl/.test(t.value)?`hsl`:`unknown`:null},set(e){if(!t.value||!e)return;let n=Z(t).value;if(n){if(e===`hex`){t.value=J(n.r,n.g,n.b);return}if(e===`rgb`){t.value=`rgb(${n.r}, ${n.g}, ${n.b})`;return}if(e===`rgba`){t.value=`rgba(${n.r}, ${n.g}, ${n.b}, 1)`;return}if(e===`hsl`){let e=q(n.r,n.g,n.b);t.value=`hsl(${e.h}, ${e.s}%, ${e.l}%)`;return}if(e===`hsla`){let e=q(n.r,n.g,n.b);t.value=`hsla(${e.h}, ${e.s}%, ${e.l}%)`;return}if(e===`oklch`){let e=Y(n.r,n.g,n.b);t.value=`oklch(${e.l} ${e.c} ${e.h})`;return}}}})}function Z(e){let t=v(e)?e:y(S(e)),n=X(t);return g({get(){if(!t.value)return null;if(n.value===`rgba`){let e=G(t.value);return{r:e.r,g:e.g,b:e.b}}return n.value===`rgb`?W(t.value):n.value===`hex`&&t.value.length===7?Tt(t.value):n.value===`hsl`?K(t.value):n.value===`oklch`?Ot(t.value):null},set(){if(t.value){if(n.value===`rgb`){let e=W(t.value);t.value=`rgb(${e.r}, ${e.g}, ${e.b})`}if(n.value===`rgba`){let e=G(t.value);t.value=`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}}}})}function kt(e){let t=v(e)?e:y(S(e)),n=X(t),r=Z(t);return g({get(){return r.value?n.value===`rgba`?G(t.value):{...r.value,a:1}:null},set(e){if(!(!e||!t.value)){if(n.value===`rgba`){t.value=`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`;return}if(n.value===`rgb`){t.value=`rgb(${e.r}, ${e.g}, ${e.b})`;return}}}})}function At(e){let t=v(e)?e:y(S(e)),n=X(t),r=Z(t);return g({get(){return r.value?q(r.value.r,r.value.g,r.value.b):null},set(e){if(!(!e||!t.value)){if(n.value===`hsl`){t.value=`hsl(${e.h}, ${e.s}%, ${e.l}%)`;return}if(n.value===`hsla`){t.value=`hsla(${e.h}, ${e.s}%, ${e.l}%)`;return}if(n.value===`hex`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=J(n.r,n.g,n.b);return}if(n.value===`rgba`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=`rgba(${n.r}, ${n.g}, ${n.b}, 1)`;return}if(n.value===`rgb`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=`rgb(${n.r}, ${n.g}, ${n.b})`;return}if(n.value===`oklch`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`),r=Y(n.r,n.g,n.b);t.value=`oklch(${r.l} ${r.c} ${r.h})`;return}}}})}function jt(e){let t=v(e)?e:y(S(e)),n=X(t),r=Z(t);return g({get(){return r.value?J(r.value.r,r.value.g,r.value.b):null},set(e){if(e&&n.value===`hex`){t.value=e.startsWith(`#`)?e:`#${e}`;return}}})}function Mt(e){let t=v(e)?e:y(S(e)),n=X(t),r=jt(t),i=Z(t),a=kt(t);return{type:n,color:t,hex:r,rgb:i,hsl:At(t),oklch:g({get(){return i.value?Y(i.value.r,i.value.g,i.value.b):null},set(e){if(!e)return;if(n.value===`oklch`){t.value=`oklch(${e.l} ${e.c} ${e.h})`;return}let r=Ot(`oklch(${e.l} ${e.c} ${e.h})`);if(n.value===`hex`){t.value=J(r.r,r.g,r.b);return}if(n.value===`rgb`){t.value=`rgb(${r.r}, ${r.g}, ${r.b})`;return}}}),rgba:a}}const Nt=Symbol(`dashboard`);function Pt(e){ae(Nt,e)}function Ft(){let e=ne(Nt);if(!e)throw Error(`useDashboard must be used inside a component that calls provideDashboard`);return e}const It=Symbol(`dashboard-widget`);function Lt(e){ae(It,e)}function Rt(){let e=ne(It);if(!e)throw Error(`useDashboardWidget must be used inside a component that calls provideDashboardWidget`);return e}function zt(e,t){let n=E.get(`state`),r=n[e];!r&&t?.default!==void 0&&(r=t.default()),r&&t?.transform&&(r=t.transform(r));let i=y(r),a=t=>{n[e]=t,E.set(`state`,n)};return C(i,a,{deep:!0}),g({get:()=>i.value,set:e=>{i.value=e,a(e)}})}const Bt=new Set;function Vt(e,t={}){let n=t.key||e,r=zt(n,{default:()=>({items:[],page:1,total:0,total_pages:1})}),i=y(!1),a=x(t.page||1),o=x(t.query||{}),s=x(t.limit||10),c=x(t.orderBy||null),l=x(t.orderDirection||null),u=g(()=>r.value.total),d=g(()=>r.value.total_pages),f=g(()=>{let e=Array.isArray(r.value.items)?r.value.items:[];return t.refine&&(e=t.refine(e)),t.serialize?e.map(e=>t.serialize(e)):e});async function p(){if(i.value)return;i.value=!0;let t=JSON.parse(JSON.stringify({...o.value,page:a.value,limit:s.value,orderBy:c.value?c.value:void 0,orderDirection:l.value?l.value:void 0})),[n,u]=await D.try(e,{method:`GET`,query:t});if(n){i.value=!1,console.error(n);return}if(r.value=u,import.meta.env.SSR){i.value=!1;return}await new Promise(e=>setTimeout(e,800)),i.value=!1}async function m(){if(a.value===1){await p();return}a.value=1}function h(e,t){JSON.stringify(e)!==JSON.stringify(t)&&m()}C([a,s],p),C([c,l],m,{deep:!0}),pt(()=>JSON.parse(JSON.stringify(o.value)),h,{debounce:t.debounce||1e3});async function _(){if(!Bt.has(n)&&f.value.length){Bt.add(n);return}Bt.add(n),await p()}return{page:a,limit:s,orderBy:c,orderDirection:l,total:u,totalPages:d,items:f,loading:i,load:p,reset:m,query:o,hydrate:_}}const Ht=Wt,Ut=ce;function Wt(e,t={}){return le({...t,validationSchema:ce(e)})}const Gt=globalThis,Q=Gt.layout||new Ge;Gt.layout=Q;function Kt(){let e=y(Q.getOptions()),t=()=>{e.value=Q.getOptions()};return B.on(`layout:change`,t),B.on(`layout:set-options`,t),e}function qt(e=!1,t){let n=y(e),r=y(t?.timeout??500);function i(e){n.value=e}let a=g({get(){return n.value},set(e){if(e){n.value=!0;return}setTimeout(()=>i(!1),r.value)}});return Object.assign(a,{set:i})}const $=y(new Map);function Jt(){function e(...e){e.forEach(e=>{e.layout||=`admin`,$.value.set(e.id,e)})}function t(e){typeof e==`string`&&$.value.delete(e)}function n(e){Array.from($.value.values()).filter(t=>t.group===e||t.parent===e).forEach(e=>$.value.delete(e.id))}function r(e){e.forEach(e=>t(e))}function i(e){e.forEach(e=>n(e))}function a(){$.value.clear()}return{items:g(()=>Array.from($.value.values())),add:e,remove:t,removeGroup:n,removeMany:r,removeManyGroup:i,clear:a}}const Yt=E.proxy(`route`),Xt=E.proxy(`router`),Zt=(e,t,n)=>ue(e,t,{route:Yt,router:Xt,...n}),Qt=E.proxy(he);var en=class{static __container_entry_key=`DashboardWidgetRegistry`;definitions=new Map;register(...e){for(let t of e)this.definitions.set(t.id,t)}get(e){return this.definitions.get(e)||null}list(){return Array.from(this.definitions.values())}};const tn=E.proxy(en),nn=E.proxy(Ke),rn=E.proxy(M),an=E.proxy(Ye),on=E.proxy($e),sn=`vee-validate`,cn=E.proxy(sn),ln=`Vue`,un=E.proxy(`Vue`),dn=`VueRouter`,fn=E.proxy(dn);var pn=class{id;name;definition_id;columns;rows;x;y;order;options;constructor(e){Object.assign(this,e),this.id||=be(),this.options||={}}},mn=class{id;name;description;icon;constructor(){this.id=``,this.name=``,this.description=``,this.icon=``}component(){return null}actions(){return[]}};const hn=80;var gn=class e{data;definition;emmitter;constructor({data:e,definition:t}){this.data=e,this.definition=t,this.emmitter=new Ee}static fromData(t){let n=tn.get(t.definition_id);return n||(n=new mn,n.name=`Unknown: ${t.definition_id}`,n.id=t.definition_id,console.warn(`DashboardWidgetDefinition not found for id: ${t.definition_id}. Using unknown definition.`)),new e({data:t,definition:n})}setEmmitter(e){this.emmitter=e}get id(){return this.data.id}get name(){return this.data.name}set name(e){this.update({name:e})}get options(){return this.data.options||{}}get definition_id(){return this.data.definition_id}component(){return this.definition.component()}actions(){return this.definition.actions()}get columns(){return this.data.columns||{}}set columns(e){let t=JSON.parse(JSON.stringify(this.data.columns||{}));Object.assign(t,e),this.update({columns:t})}get rows(){return this.data.rows||{}}set rows(e){let t=JSON.parse(JSON.stringify(this.data.rows||{}));Object.assign(t,e),this.update({rows:t})}get x(){return this.data.x||{}}set x(e){let t=JSON.parse(JSON.stringify(this.data.x||{}));Object.assign(t,e),this.update({x:t})}get y(){return this.data.y||{}}set y(e){let t=JSON.parse(JSON.stringify(this.data.y||{}));Object.assign(t,e),this.update({y:t})}get classes(){let e=new Set;return Array.from(e.values()).join(` `)}computeStyles(e){let t=new Map,n=e.breakpoint??`base`,r=this.x[n]??0,i=this.y[n]??0,a=this.columns[n]??1,o=this.rows[n]??1,s=e.contianerWidth/12;return t.set(`position`,`absolute`),t.set(`left`,`${r*s}px`),t.set(`top`,`${i*80}px`),t.set(`width`,`${a*s-10}px`),t.set(`height`,`${o*80}px`),Array.from(t.entries()).map(([e,t])=>`${e}: ${t};`).join(` `)}update(e){Object.assign(this.data,e),this.emmitter.emit(`widget:updated`,{id:this.id,data:this.data})}setOption(e,t){let n=JSON.parse(JSON.stringify(this.data.options||{}));s(n,e,t),this.update({options:n})}setX(e,t=void 0){let n=JSON.parse(JSON.stringify(this.x));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({x:n})}setY(e,t=void 0){let n=JSON.parse(JSON.stringify(this.y));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({y:n})}setColumn(e,t=void 0){let n=JSON.parse(JSON.stringify(this.columns));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({columns:n})}setRow(e,t=void 0){let n=JSON.parse(JSON.stringify(this.rows));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({rows:n})}},_n=class{name=``;description=``;widgets=[];emmitter;containerWidth=0;constructor(){this.emmitter=new Ee}setName(e){return this.name=e,this}setDescription(e){return this.description=e,this}setContainerWidth(e){return this.containerWidth=e,this}setWidgets(e){this.widgets=[];for(let t of e){let e=gn.fromData(t);e.setEmmitter(this.emmitter),this.widgets.push(e)}return this}findLastRow(){let e=0;for(let t of this.widgets){let n=t.rows?.base??0,r=(t.y?.base??0)+n;r>e&&(e=r)}return e}addWidget(e={}){e.columns||={base:4},e.rows||={base:4},e.x||={base:0},e.y||={base:this.findLastRow()};let t=new pn(e),n=gn.fromData(t);n.setEmmitter(this.emmitter),this.widgets.push(n)}removeWidget(e){this.widgets=this.widgets.filter((t,n)=>n!==e)}removeWidgetById(e){this.widgets=this.widgets.filter(t=>t.id!==e)}updateWidget(e,t){this.widgets=this.widgets.map((n,r)=>r===e?t:n)}duplicateWidget(e){let t=JSON.parse(JSON.stringify(this.widgets[e]));[...this.widgets].splice(e+1,0,t)}},vn=class e extends mn{static renderer;constructor(){super(),this.name=`Chart`,this.id=`chart`}static setRenderer(t){e.renderer=t}component(){return e.renderer}async chartOptions(e){return{grid:{left:`3%`,right:`4%`,bottom:`3%`,containLabel:!0},title:{text:`ECharts Getting Started Example`},tooltip:{},xAxis:{data:[`shirt`,`cardigan`,`chiffon`,`pants`,`heels`,`socks`]},yAxis:{},series:[{name:`sales`,type:`bar`,data:[5,20,36,10,10,20]}]}}},yn=class extends pe(Ue){},bn=class extends pe(We){addPagesFolder(e,t){Xt.auto(e,t)}async load(){}};function xn(e,t={}){return Ze(e,t)}function Sn(e){return e}function Cn(e){return e}const wn=D;function Tn(e){return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e.accept||`*/*`,n.multiple=e.multiple||!1,n.onchange=n=>{let r=n.target,i=Array.from(r.files);t(e.multiple?Array.from(i):i[0])},n.oncancel=()=>{t(e.multiple?[]:null)},n.click()})}function En(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{e.target?.result instanceof ArrayBuffer?t(new Uint8Array(e.target.result)):n(Error(`Failed to read file as ArrayBuffer`))},r.onerror=()=>{n(r.error)},r.readAsArrayBuffer(e)})}async function Dn(e){let t=new FormData;return t.append(`file`,e.file),e.directory&&t.append(`directory`,e.directory),wn(`/api/drives/${e.driveId}/upload`,{method:`POST`,body:t,query:{directory:e.directory}})}const On={pick:Tn,upload:Dn,toUint8Array:En};function kn(e){let t=e;for(let[e,n]of Object.entries(Yt.params)){let r=`:${e}`;t=t.replace(r,String(n))}return t}const An=t;function jn(e){let t=e.exclude||[`/auth/login`,`/auth/register`];return n=>{if(!Qt.user&&!t.includes(n.path))return typeof e.redirect==`function`?e.redirect(n):e.redirect}}const Mn=jn({redirect:e=>`/auth/login?redirect=`+encodeURIComponent(e.fullPath)});function Nn(e){return()=>{if(Qt.user)return e.redirect}}const Pn=Nn({redirect:`/`});export{wn as $fetch,On as $file,An as $toast,he as AuthService,hn as DASHBOARD_ROW_HEIGHT,_n as Dashboard,gn as DashboardWidget,pn as DashboardWidgetData,mn as DashboardWidgetDefinition,vn as DashboardWidgetDefinitionChart,en as DashboardWidgetRegistry,ge as FetchBrowserService,Te as FetchNodeService,T as FetchService,Ge as LayoutService,Ke as LifecycleService,qe as MenuItemEntity,Ye as MenuService,yn as ModuleEntity,bn as PluginEntity,$e as ToastService,sn as VEE_VALIDATE_CONTAINER_KEY,ln as VUE_CONTAINER_KEY,dn as VUE_ROUTER_CONTAINER_KEY,Je as acl,Qt as auth,Mn as authGuard,Ze as auto,xn as autoRoutes,Se as config,E as container,jn as createAuthGuard,Nn as createGuestGuard,be as createId,Qe as createRouter,tn as dashboardRegistry,Sn as defineColumns,Cn as defineFormFields,B as emmitter,W as extracRGB,Dt as extractOKLCH,G as extractRGBA,D as fetcher,Pn as guestGuard,Tt as hexToRGB,K as hslToRgb,Q as layout,nn as lifecycle,rn as logger,an as menu,Ot as oklchToRgb,kn as parseTo,Pt as provideDashboard,Lt as provideDashboardWidget,J as rgbToHex,q as rgbToHsl,Y as rgbToOklch,Et as rgbaToString,Yt as route,Xt as router,Xe as setupGuard,Ut as toTypedSchema,on as toast,wt as useBreakpoints,Mt as useColor,X as useColorType,Ft as useDashboard,Rt as useDashboardWidget,Vt as useFetchPagination,Ht as useForm,At as useHSL,jt as useHex,Kt as useLayoutOptions,qt as useLoading,Jt as useMenu,Z as useRGB,kt as useRGBA,Zt as useRouteQuery,zt as useState,Wt as useValibotForm,cn as veeValidate,un as vue,fn as vueRouter};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiJGZldGNoIiwiQ29ra2llTWFwRW50aXR5IiwiTGlmZWN5Y2xlU2VydmljZSIsIlBlcm1pc3Npb24iLCJzdWJqZWN0IiwiY3JlYXRlU3ViamVjdCIsIkJhc2VFbnRpdHlNaXhpbiIsIkJhc2VFbnRpdHlNaXhpbiIsIkJhc2VFbnRpdHlNaXhpbiIsIk1vZHVsZSIsIlBsdWdpbkVudGl0eSIsIkJhc2VMaWZlY3ljbGVTZXJ2aWNlIiwiY3JlYXRlVnVlUm91dGVyIiwidXNlQnJlYWtwb2ludHMiLCJjb3JlVXNlQnJlYWtwb2ludHMiLCJkaSIsIiRmZXRjaCIsInZlZVZhbGlkYXRlVG9UeXBlZFNjaGVtYSIsInVzZVZlZVZhbGlkYXRlRm9ybSIsIkxheW91dE1hbmFnZXIiLCJ2dWVVc2VyUm91dGVRdWVyeSIsIkJhc2UiLCJCYXNlIiwiJG9yaWdpbmFsIiwidG9hc3QiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GZXRjaFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvZmV0Y2hlci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvY29tcG9zZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9BdXRoU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvRmV0Y2hCcm93c2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mbGF0dGVuLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jcmVhdGVJZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb25maWcudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoTm9kZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy91cmxWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMva2V5VmFsdWVWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvcGFnaW5hdGlvblZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy9pbmRleC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVmFsaWRhdG9yU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvZGFzaGJvYXJkTWV0YVNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy91c2VyU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUGVybWlzc2lvbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQWNsRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlTWV0YUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZVVwbG9hZFNlc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUm9sZUVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9lbW1pdHRlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGF5b3V0U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvTWVudUl0ZW1FbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvYWNsLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9NZW51U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZ3VhcmRzL3NldHVwR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1RvYXN0U2VydmljZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL3NoYXJlZC9kaXN0L2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWV1c2UvY29yZS9kaXN0L2luZGV4LmpzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VCcmVha3BvaW50LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VDb2xvci50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlRGFzaGJvYXJkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VEYXNoYm9hcmRXaWRnZXQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2NvbXBvc2FibGVzL3VzZVN0YXRlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VGZXRjaFBhZ2luYXRpb24udHMiLCIuLi8uLi9zcmMvY2xpZW50L2NvbXBvc2FibGVzL3VzZUZvcm0udHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvbGF5b3V0LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VMYXlvdXRPcHRpb25zLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VMb2FkaW5nLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VNZW51LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3JvdXRlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3JvdXRlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlUm91dGVRdWVyeS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9hdXRoLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9yZWdpc3RyeS9EYXNoYm9hcmRXaWRnZXRSZWdpc3RyeS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9kYXNoYm9hcmRSZWdpc3RyeS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9saWZlY3ljbGUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvbG9nZ2VyLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL21lbnUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvdG9hc3QudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvdmVlVmFsaWRhdGUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvdnVlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3Z1ZVJvdXRlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvRGFzaGJvYXJkV2lkZ2V0RGF0YS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbi50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvRGFzaGJvYXJkV2lkZ2V0LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9EYXNoYm9hcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldERlZmluaXRpb25DaGFydC50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2F1dG9QYWdlcy50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZGVmaW5lQ29sdW1ucy50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZGVmaW5lRm9ybUZpZWxkcy50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZmV0Y2hlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZmlsZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvcGFyc2VUby50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvdG9hc3QudHMiLCIuLi8uLi9zcmMvY2xpZW50L2d1YXJkcy9hdXRoR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2d1YXJkcy9ndWVzdEd1YXJkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImludGVyZmFjZSBUcnllciB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogYW55XG59XG5cbmludGVyZmFjZSBUcnllckFzeW5jIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4gfCBhbnlcbn1cblxudHlwZSBUcnlDYXRjaFJlc3VsdDxUIGV4dGVuZHMgVHJ5ZXI+ID0gW251bGwsIFJldHVyblR5cGU8VD5dIHwgW0Vycm9yLCBudWxsXVxuXG50eXBlIFRyeUNhdGNoQXN5bmNSZXN1bHQ8VCBleHRlbmRzIFRyeWVyQXN5bmM+ID0gW251bGwsIEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj5dIHwgW0Vycm9yLCBudWxsXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCBleHRlbmRzIFRyeWVyQXN5bmM+KHRyeWVyOiBUKTogUHJvbWlzZTxUcnlDYXRjaEFzeW5jUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG5cbnRyeUNhdGNoLnN5bmMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIFRyeWVyPih0cnllcjogVCk6IFRyeUNhdGNoUmVzdWx0PFQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cbiIsImltcG9ydCB7IHRvYXN0IH0gZnJvbSAndnVlLXNvbm5lcidcbmltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGludGVyZmFjZSBGZXRjaE9wdGlvbnMgZXh0ZW5kcyBSZXF1ZXN0SW5pdCB7XG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdGZXRjaFNlcnZpY2UnXG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRXJyb3IocmVzcG9uc2U6IFJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LmluY2x1ZGVzKCdqc29uJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gKHsgbWVzc2FnZTogJHQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpIH0pKVxuXG4gICAgICAgICAgICBpZiAoZGF0YS5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdG9hc3QuZXJyb3IoZGF0YS5tZXNzYWdlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgICB9XG5cbiAgICAgICAgdG9hc3QuZXJyb3IoJHQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiAkdCgnSW50ZXJuYWwgU2VydmVyIEVycm9yJyksXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYnVpbGRVcmwodXJsOiBzdHJpbmcsIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55Pik6IHN0cmluZyB7XG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcXMuc3RyaW5naWZ5KHF1ZXJ5LCB7IGFycmF5Rm9ybWF0OiAnYnJhY2tldHMnIH0pXG5cbiAgICAgICAgcmV0dXJuIHVybCArICc/JyArIHF1ZXJ5U3RyaW5nXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkUmVxdWVzdEluaXQob3B0aW9uczogRmV0Y2hPcHRpb25zKTogUmVxdWVzdEluaXQge1xuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0geyAuLi5vcHRpb25zIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5kYXRhKSB7XG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSlcbiAgICAgICAgICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgIC4uLmZldGNoT3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmV0Y2hPcHRpb25zXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LmluY2x1ZGVzKCdqc29uJykpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxUPlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKSBhcyBQcm9taXNlPFQ+XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KF91cmw6IHN0cmluZywgX29wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRyeTxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyeUNhdGNoKCgpID0+IHRoaXMuZmV0Y2g8VD4odXJsLCBvcHRpb25zKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBwb3N0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcHV0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGU8VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoPFQ+KHVybCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzOiBudW1iZXIgPSA1MDBcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gJ0Jhc2VFeGNlcHRpb24nXG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogQmFzZUV4Y2VwdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUV4Y2VwdGlvbihlcnJvci5tZXNzYWdlLCA1MDApXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBUaGUgY29uc3RydWN0b3IgJHtwYXlsb2FkLm5hbWV9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllci4gQ29uc2lkZXIgYWRkaW5nIGEgc3RhdGljIHByb3BlcnR5IF9fY29udGFpbmVyX2VudHJ5X2tleSB0byBhdm9pZCBwb3RlbnRpYWwgY29uZmxpY3RzLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAga2V5ID0gKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocGF5bG9hZDogRW50cnlLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgdmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBheWxvYWQ6IEVudHJ5S2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocGF5bG9hZDogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEVudHJ5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQgaW4gY29udGFpbmVyLmApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChwYXlsb2FkOiBFbnRyeUtleSk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBzaW5nbGV0b248VD4oY2xhc3NDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4pOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2xhc3NDb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXNzQ29uc3RydWN0b3IoKVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgbmV3SW5zdGFuY2UpXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZW50cmllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eTxUID0gdW5rbm93bj4oa2V5OiBFbnRyeUtleSk6IFQge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50cnlbcHJvcF1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZW50cnkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5W3Byb3BdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiAoX3RhcmdldCwgcHJvcCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBlbnRyeVtwcm9wXSA9IHZhbHVlXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGtleXMoKTogRW50cnlLZXlbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5rZXlzKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbnRhaW5lclNlcnZpY2UgZnJvbSBcIiNzaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50c1wiO1xuXG5jb25zdCBjb250YWluZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNsaWVudENvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG5cbmdsb2JhbFRoaXMuY2xpZW50Q29udGFpbmVyID0gY29udGFpbmVyXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRhaW5lciBhcyBDb250YWluZXJTZXJ2aWNlXG4iLCJpbXBvcnQgRmV0Y2hTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgZmV0Y2hlciA9IGNvbnRhaW5lci5wcm94eTxGZXRjaFNlcnZpY2U+KEZldGNoU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgZmV0Y2hlclxuIiwiaW1wb3J0IHR5cGUgeyBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi90eXBpbmcudHMnXG5cbmV4cG9ydCB0eXBlIEFueUNsYXNzID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+XG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgbWl4aW5zIGludG8gYSBzaW5nbGUgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQuXG4gKiBBbGxvd3MgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLWxpa2UgYmVoYXZpb3IgYnkgYXBwbHlpbmcgbWl4aW5zIHNlcXVlbnRpYWxseS5cbiAqIFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgaW5jbHVkZXMgYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2U8XG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3Rvcjxhbnk+KSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGNsYXNzIHt9IGFzIGFueSkgYXMgYW55XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgY29tcG9zZSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYmFzZSBjbGFzc1xuICogXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2VFbnRpdHksIFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VXaXRoPFxuICAgIFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3IsXG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oXG4gICAgYmFzZUNsYXNzOiBUQmFzZSxcbiAgICAuLi5taXhpbnM6IE1cbik6IFRCYXNlICYgVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBiYXNlQ2xhc3MgYXMgYW55KSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KFNvdXJjZTogVEJhc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSB7XG4gICAgICAgIGNsYXNzIE1peGVkIGV4dGVuZHMgVGFyZ2V0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IG1ldGhvZHNcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKFNvdXJjZS5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBNaXhlZC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTb3VyY2UucHJvdG90eXBlLCBrZXkpIVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNaXhlZCBhcyBUVGFyZ2V0ICYgVEJhc2VcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5pbnRlcmZhY2UgQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMge1xuICAgIHBhcnNlPzogKGRhdGE6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYXNlRW50aXR5KG9wdGlvbnM6IENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gb3B0aW9ucy5wYXJzZShkYXRhKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAoY29udHJ1Y3RvciBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMgYXMgYW55KT8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKHRoaXMgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRpbWVzdGFtcE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgY3JlYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgICAgICBwdWJsaWMgdXBkYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNvZnREZWxldGVNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGRlbGV0ZWRfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgUm9sZSBmcm9tICcuL1JvbGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGVtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHVzZXJuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbFxuXG4gICAgcHVibGljIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdXG4gICAgcHVibGljIHJvbGVzPzogUm9sZVtdXG5cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxzKCl7XG4gICAgICAgIGNvbnN0IFtmaXJzdE5hbWUsIHNlY29uZE5hbWVdID0gdGhpcy5uYW1lLnNwbGl0KCcgJylcblxuICAgICAgICBpZiAoIXNlY29uZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIGNvbnN0IGIgPSBzZWNvbmROYW1lWzBdLnRvVXBwZXJDYXNlKClcblxuICAgICAgICByZXR1cm4gYSArIGJcbiAgICB9XG59XG4iLCJpbXBvcnQgJGZldGNoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzJ1xuaW1wb3J0IFVzZXIgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzJ1xuXG5pbnRlcmZhY2UgTG9nb3V0T3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0F1dGhTZXJ2aWNlJ1xuICAgIHB1YmxpYyB1c2VyOiBVc2VyIHwgbnVsbFxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBdXRoU2VydmljZT4gPSB7fSkge1xuICAgICAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXIgfHwgbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2dvdXQob3B0aW9ucz86IExvZ291dE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0ICRmZXRjaC50cnkoJy9hdXRoL2xvZ291dCcsIHsgbWV0aG9kOiAnUE9TVCcgfSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBvcHRpb25zPy5yZWRpcmVjdCB8fCAnLydcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEZldGNoT3B0aW9ucyB9IGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hCcm93c2VyU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5oYW5kbGVFcnJvcihyZXNwb25zZSlcblxuICAgICAgICAgICAgdGhyb3cgcmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG5cbiAgICAgICAgcmV0dXJuIHBhcnNlZFxuICAgIH1cbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29va2llTWFwRW50aXR5T3B0aW9ucyB7XG4gICAgY29va2llcz86IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwcmVmaXg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29va2llTWFwRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb29raWVNYXBFbnRpdHknXG5cbiAgICBwdWJsaWMgY29va2llczogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBwcmVmaXg6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IENvb2tpZU1hcEVudGl0eU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb29raWVzID0gZGF0YT8uY29va2llcyB8fCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIHRoaXMucHJlZml4ID0gZGF0YT8ucHJlZml4IHx8ICcnXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IE1hcDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICAgICAgaWYgKGNvb2tpZXMgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb29raWVzKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb29raWVzW2tleV0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvb2tpZXMuZ2V0KGZ1bGxOYW1lKSB8fCBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2Ugd2FudCB0byBhbGxvdyBhbnkgb3B0aW9ucyB0byBiZSBwYXNzZWQgaGVyZSwgYXMgdGhleSBtYXkgYmUgdXNlZCBieSB0aGUgdW5kZXJseWluZyBjb29raWVcbiAgICAvLyAgZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgdGhpcy5jb29raWVzLnNldChmdWxsTmFtZSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCh0aGlzLnByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1bnByZWZpeGVkS2V5ID0ga2V5LnNsaWNlKHRoaXMucHJlZml4Lmxlbmd0aClcblxuICAgICAgICAgICAgICAgIHJlc3VsdFt1bnByZWZpeGVkS2V5XSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbihvYmo6IGFueSwgcHJlZml4ID0gJycsIHJlczogYW55ID0ge30pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGNvbnN0IGlzSW5kZXggPSAvXlxcZCskLy50ZXN0KGtleSlcbiAgICAgICAgY29uc3QgbmV3S2V5ID0gaXNJbmRleCA/IGAke3ByZWZpeH1bJHtrZXl9XWAgOiBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXlcblxuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZmxhdHRlbih2YWx1ZSwgbmV3S2V5LCByZXMpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzW25ld0tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIHJldHVybiByZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuZmxhdHRlbihvYmo6IGFueSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBzZXQocmVzdWx0LCBrZXksIHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG59XG4iLCJmdW5jdGlvbiB1dWlkKCl7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5jcnlwdG8gJiYgc2VsZi5jcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gc2VsZi5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvICYmIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gd2luZG93LmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgY3J5cHRvLnJhbmRvbVVVSURcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwXG4gICAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4XG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJZChwcmVmaXggPSAnJykge1xuICAgIHJldHVybiBwcmVmaXggKyB1dWlkKClcbn0iLCJpbXBvcnQgeyBnZXQsIHNldCwgaGFzLCB1bnNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi91dGlscydcblxuaW50ZXJmYWNlIEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHZhbHVlOiBhbnlcbiAgICBzb3VyY2U6IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb25maWdTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIEVudHJ5PlxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXAoKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmVuZHNXaXRoKCc6Ym9vbGVhbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnOmJvb2xlYW4nLCAnJykudHJpbSgpID09PSAndHJ1ZSdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdLCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBlbnRyeS52YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IHRydWUgOiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzKHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUID0gYW55IHwgdW5kZWZpbmVkPihrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkudmFsdWUgYXMgVFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnkudmFsdWUgOiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldCh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCBkZWZhdWx0VmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPbmU8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5czogc3RyaW5nW10sIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldDxUPihrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ3J1bnRpbWUnKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBsZXQgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcHJpbWFyeVZhbHVlID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIHNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgdmFsdWUpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZXQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAoIXByaW1hcnlWYWx1ZSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB1bnNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogJ3J1bnRpbWUnLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKClcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVtcCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW4odGhpcy50b1JlY29yZCgpKVxuICAgIH1cbn1cbiIsImltcG9ydCBDb25maWdTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGNvbmZpZyA9IGNvbnRhaW5lci5wcm94eTxDb25maWdTZXJ2aWNlPihDb25maWdTZXJ2aWNlKVxuXG5pZiAoaW1wb3J0Lm1ldGEuZW52LkRFVikge1xuICAgIGdsb2JhbFRoaXMuY29uZmlnID0gY29uZmlnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZ1xuIiwiaW1wb3J0IHFzIGZyb20gJ3FzJyBcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUGFyYW1zKHJvdXRlUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgIGNvbnN0IHJvdXRlU2VnbWVudHMgPSByb3V0ZVBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCByZXF1ZXN0U2VnbWVudHMgPSByZXF1ZXN0UGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlU2VnbWVudCA9IHJvdXRlU2VnbWVudHNbaV1cbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSByZXF1ZXN0U2VnbWVudHNbaV1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcm91dGVTZWdtZW50LnNsaWNlKDEpIC8vIFJlbW92ZSB0aGUgJzonIHByZWZpeFxuICAgICAgICAgICAgcGFyYW1zW3BhcmFtTmFtZV0gPSByZXF1ZXN0U2VnbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudCA9PT0gJyonKSB7XG4gICAgICAgICAgICAvLyBDYXB0dXJlIGFsbCByZW1haW5pbmcgc2VnbWVudHMgYXMgYSBzaW5nbGUgcGF0aFxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSByZXF1ZXN0U2VnbWVudHMuc2xpY2UoaSlcbiAgICAgICAgICAgIHBhcmFtc1snKiddID0gcmVtYWluaW5nU2VnbWVudHMuam9pbignLycpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxRdWVyeShyZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcmVxdWVzdFBhdGguc3BsaXQoJz8nKVsxXVxuXG4gICAgaWYgKCFxdWVyeVN0cmluZykge1xuICAgICAgICByZXR1cm4gcXVlcnlcbiAgICB9XG5cbiAgICByZXR1cm4gcXMucGFyc2UocXVlcnlTdHJpbmcpXG59XG4iLCJpbXBvcnQgdHlwZSB7IEZldGNoT3B0aW9ucyB9IGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBDb2traWVNYXBFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb25maWcudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgeyBwYXJzZVVybFBhcmFtcywgcGFyc2VVcmxRdWVyeSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvcGFyc2VSb3V0ZVVybC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hOb2RlU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBpc0ludGVybmFsID0gIXVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXVybC5zdGFydHNXaXRoKCdodHRwczovLycpXG5cbiAgICAgICAgaWYgKCFpc0ludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEV4dGVybmFsPFQ+KHVybCwgb3B0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoSW50ZXJuYWw8VD4odXJsLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBmZXRjaEV4dGVybmFsPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGZldGNoSW50ZXJuYWw8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHJvdXRlciA9ICBjb250YWluZXIuZ2V0PGFueT4oJ1JvdXRlclNlcnZpY2UnKVxuICAgICAgICBjb25zdCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCAnR0VUJ1xuICAgICAgICBjb25zdCByb3V0ZSA9IHJvdXRlci5yZXNvbHZlKG1ldGhvZCwgdXJsKVxuICAgICAgICBjb25zdCBjb29raWUgPSBuZXcgQ29ra2llTWFwRW50aXR5KHtcbiAgICAgICAgICAgIHByZWZpeDogY29uZmlnLmdldCgnY29va2llLnByZWZpeCcsICcnKVxuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgaWYgKGNvbnRhaW5lci5oYXMoJ2Nvb2tpZXMnKSkge1xuICAgICAgICAgICAgY29va2llLmxvYWQoY29udGFpbmVyLmdldDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PignY29va2llcycpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyb3V0ZSB8fCAhcm91dGUuaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0ZSBub3QgZm91bmQgZm9yICR7bWV0aG9kfSAke3VybH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcm91dGVyLmV4ZWN1dGUocm91dGUsIHtcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgcGFyYW1zOiBwYXJzZVVybFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpLFxuICAgICAgICAgICAgcXVlcnk6IG9wdGlvbnMucXVlcnkgfHwgcGFyc2VVcmxRdWVyeSh1cmwpLFxuICAgICAgICAgICAgYm9keTogb3B0aW9ucy5kYXRhIHx8IG9wdGlvbnMuYm9keSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBjb29raWU6IGNvb2tpZVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiByZXN1bHQgYXMgUHJvbWlzZTxUPlxuICAgIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG4vLyBAdHMtbm9jaGVja1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dnZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMb2dnZXJTZXJ2aWNlJyBcblxuICAgIHB1YmxpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZXJyb3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cblxuICAgIHB1YmxpYyBjaGlsZChvcHRpb25zOiBhbnkpOiBMb2dnZXJTZXJ2aWNlIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgICAgICByZXR1cm4gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgY3JlYXRlSWQsIHRyeUNhdGNoIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXgudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1taXR0ZXJMaXN0ZW5lck9wdGlvbnMge1xuICAgIGV2ZW50OiBzdHJpbmdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRW1taXR0ZXJMaXN0ZW5lciB7XG4gICAgKGRhdGE6IGFueSwgb3B0aW9uczogRW1taXR0ZXJMaXN0ZW5lck9wdGlvbnMpOiB2b2lkXG59XG5cbmludGVyZmFjZSBFbW1pdHRlckhhbmRsZXIge1xuICAgIGlkOiBzdHJpbmdcbiAgICBldmVudDogc3RyaW5nXG4gICAgbGlzdGVuZXI6IEVtbWl0dGVyTGlzdGVuZXJcbiAgICBvcmlnaW5hbExpc3RlbmVyPzogRW1taXR0ZXJMaXN0ZW5lclxufVxuXG5pbnRlcmZhY2UgT25PcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIHVuaXF1ZT86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIE9uRGVib3VuY2VPcHRpb25zIGV4dGVuZHMgT25PcHRpb25zIHtcbiAgICBkZWJvdW5jZT86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVtbWl0dGVyU2VydmljZU9wdGlvbnMge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW1taXR0ZXJTZXJ2aWNlPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRW1taXR0ZXJTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IgKG9wdGlvbnM/OiBFbW1pdHRlclNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zPy5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnM/LmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbW1pdHRlciBsb2FkZWQgd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGU8RXZlbnRzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KG9wdGlvbnM/OiBFbW1pdHRlclNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgRW1taXR0ZXJTZXJ2aWNlPEV2ZW50cz4ob3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGVidWcoZGVidWc6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdkZWJ1ZyBtb2RlIGVuYWJsZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgb248SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaWQgPSBvcHRpb25zPy5pZCB8fCBjcmVhdGVJZCgpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnVuaXF1ZSkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gdGhpcy5oYW5kbGVycy5zb21lKGggPT4gKGguZXZlbnQgPT09IGV2ZW50ICYmIGgubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB8fCBoLmlkID09PSBpZClcblxuICAgICAgICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcjogRW1taXR0ZXJIYW5kbGVyID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIGxpc3RlbmVyXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZXJzLnB1c2goaGFuZGxlcilcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXIgYWRkZWQnLCBoYW5kbGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IChhcmdzOiBhbnksIG9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIoYXJncywgb3B0aW9ucylcblxuICAgICAgICAgICAgdGhpcy5vZmYoZXZlbnQsIHdyYXBwZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vbihldmVudCwgd3JhcHBlciBhcyBhbnksIG9wdGlvbnMpXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgb25EZWJvdW5jZTxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbkRlYm91bmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZGVib3VuY2VkID0gZGVib3VuY2UobGlzdGVuZXIsIG9wdGlvbnM/LmRlYm91bmNlIHx8IDMwMClcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vbihldmVudCwgZGVib3VuY2VkIGFzIGFueSwgb3B0aW9ucylcblxuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlci5vcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uQW55T2Y8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnRzOiBLW10sIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyW11cbiAgICBwdWJsaWMgb25BbnlPZihldmVudHM6IHN0cmluZ1tdLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBoYW5kbGVyczogRW1taXR0ZXJIYW5kbGVyW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vbihldmVudCwgbGlzdGVuZXIgYXMgYW55LCBvcHRpb25zKVxuXG4gICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1c2goaGFuZGxlcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiB7XG4gICAgICAgICAgICBpZiAoaC5ldmVudCA9PT0gZXZlbnQgJiYgKGgubGlzdGVuZXIgPT09IGxpc3RlbmVyIHx8IGgub3JpZ2luYWxMaXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVyIHJlbW92ZWQnLCB7IGV2ZW50IH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgYXJnczogRXZlbnRzW0tdKTogdm9pZFxuICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpOiB2b2lkXG4gICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSkge1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1pdHRpbmcgZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgYXJnc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHRyeUNhdGNoLnN5bmMoKCkgPT4gaGFuZGxlci5saXN0ZW5lcihhcmdzLCB7IGV2ZW50IH0pKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBhcmdzOiBFdmVudHNbS10pOiBQcm9taXNlPHZvaWQ+XG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpOiBQcm9taXNlPHZvaWQ+XG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1pdHRpbmcgZXZlbnQgYW5kIHdhaXQnLCB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyLmxpc3RlbmVyKGFyZ3MsIHsgZXZlbnQgfSlcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3RCeUV2ZW50KGV2ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZShwYXlsb2FkOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+ICFpZHMuaW5jbHVkZXMoaC5pZCkpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVycyByZW1vdmVkJywgeyBpZHMgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IFtdXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhbGwgaGFuZGxlcnMgY2xlYXJlZCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzSGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCA+IDBcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVIb29rIHtcbiAgICBwdWJsaWMgaG9va19pZDogc3RyaW5nXG4gICAgcHVibGljIGhvb2tfYWxpYXNlcz86IHN0cmluZ1tdXG4gICAgcHVibGljIG9yZGVyPzogbnVtYmVyXG4gICAgcHVibGljIHN1Ymhvb2tzPzogTGlmZWN5Y2xlSG9va1tdXG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHJlZ2lzdGVyICovXG4gICAgcHVibGljIGFzeW5jIG9uUmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGxvYWQgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Mb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBib290ICovXG4gICAgcHVibGljIGFzeW5jIG9uQm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Ugc2h1dGRvd24gKi9cbiAgICBwdWJsaWMgYXN5bmMgb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG59XG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbnR5cGUgTGlmZWN5Y2xlTWV0aG9kID0gJ3JlZ2lzdGVyJyB8ICdsb2FkJyB8ICdib290JyB8ICdzaHV0ZG93bidcblxuaW50ZXJmYWNlIExpc3RPcHRpb25zIHtcbiAgICBpbmNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBleGNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgaG9va3M/OiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMaWZlY3ljbGVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhvb2tzOiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuaG9va3MgPSBkYXRhLmhvb2tzID8/IG5ldyBNYXAoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgXG4gICAgICAgIGlmIChkYXRhLm9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvciA9IGRhdGEub25FcnJvclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldE9uRXJyb3IoaGFuZGxlcjogUmVxdWlyZWQ8TGlmZWN5Y2xlU2VydmljZU9wdGlvbnM+WydvbkVycm9yJ10pIHtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gaGFuZGxlclxuICAgIH1cblxuXG4gICAgcHVibGljIG9uRXJyb3IoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY29udGV4dCB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBob29rICR7Y29udGV4dC5tZXRob2R9ICgke2NvbnRleHQuaG9va0lkfSk6YCwgZXJyb3IpXG4gICAgfVxuXG4gICAgcHVibGljIG1hcEFsaWFzZXMoYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IGFsbCA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYWxsKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLmhvb2tfYWxpYXNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRBbGlhcyA9IGhvb2suaG9va19hbGlhc2VzLmZpbmQoYWxpYXMgPT4gYXJncy5pbmNsdWRlcyhhbGlhcykpXG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Qob3B0aW9ucz86IExpc3RPcHRpb25zKSB7XG4gICAgICAgIGxldCBob29rcyA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhjbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5leGNsdWRlKSA/IG9wdGlvbnMuZXhjbHVkZSA6IFtvcHRpb25zLmV4Y2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gIWlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZSkgPyBvcHRpb25zLmluY2x1ZGUgOiBbb3B0aW9ucy5pbmNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+IGlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MgPSBvcmRlckJ5KGhvb2tzLCBbJ29yZGVyJ10sIFsnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGhvb2tzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCguLi5wYXlsb2FkOiAoTGlmZWN5Y2xlSG9vayB8IENvbnN0cnVjdG9yPExpZmVjeWNsZUhvb2s+KVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF5bG9hZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2gobmV3IGl0ZW0oKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZXMucHVzaChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGluc3RhbmNlcykge1xuICAgICAgICAgICAgaWYgKCFob29rLmhvb2tfaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdTa2lwcGluZyBob29rIHdpdGhvdXQgaG9va19pZDonLCBob29rKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaG9va3Muc2V0KGhvb2suaG9va19pZCwgaG9vaylcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWRkICcgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLnN1Ymhvb2tzKSB7XG4gICAgICAgICAgICAgICAgaG9vay5zdWJob29rcy5mb3JFYWNoKHN1Ymhvb2sgPT4gdGhpcy5hZGQoc3ViaG9vaykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdE1ldGhvZChtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5saXN0KG9wdGlvbnMpIFxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgZW1pdHRpbmcgJHttZXRob2R9IGZvciBob29rczpgLCB7XG4gICAgICAgICAgICAgICAgaG9va3M6IGhvb2tzLm1hcChob29rID0+IGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5saXN0KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXI6ICgpID0+IFByb21pc2UuYWxsKFtob29rLnJlZ2lzdGVyKCksIGhvb2sub25SZWdpc3RlcigpXSksXG4gICAgICAgICAgICAgICAgbG9hZDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2subG9hZCgpLCBob29rLm9uTG9hZCgpXSksXG4gICAgICAgICAgICAgICAgYm9vdDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suYm9vdCgpLCBob29rLm9uQm9vdCgpXSksXG4gICAgICAgICAgICAgICAgc2h1dGRvd246ICgpID0+IFByb21pc2UuYWxsKFtob29rLnNodXRkb3duKCksIGhvb2sub25TaHV0ZG93bigpXSksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBtYXBbbWV0aG9kXSgpKVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IsIHsgaG9va0lkOiBob29rLmhvb2tfaWQsIG1ldGhvZCB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7bWV0aG9kfSBgICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQocGF5bG9hZDogTGlmZWN5Y2xlTWV0aG9kIHwgTGlmZWN5Y2xlTWV0aG9kW10sIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtZXRob2RzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRNZXRob2QobWV0aG9kLCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uKG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kLCBoYW5kbGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGggPSBuZXcgTGlmZWN5Y2xlSG9vaygpXG5cbiAgICAgICAgaC5ob29rX2lkID0gYGN1c3RvbToke21ldGhvZH06JHtEYXRlLm5vdygpfWBcblxuICAgICAgICBoW21ldGhvZF0gPSBoYW5kbGVyXG5cbiAgICAgICAgdGhpcy5hZGQoaClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3JlZ2lzdGVyJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnbG9hZCcsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJvb3Qob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Jvb3QnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzaHV0ZG93bicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvb2tzLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCB7IGdldCwgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0IHFzIGZyb20gJ3FzJ1xuXG5leHBvcnQgY29uc3QgbnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYubnVtYmVyKCldKSxcbiAgICB2LnRyYW5zZm9ybShOdW1iZXIpLFxuICAgIHYuaW50ZWdlcigpLFxuKVxuXG5leHBvcnQgY29uc3QgYm9vbGVhbiA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmJvb2xlYW4oKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiA9PT0gdHJ1ZSB8fCB2ID09PSAndHJ1ZScpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZSA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmRhdGUoKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiBpbnN0YW5jZW9mIERhdGUgPyB2IDogbmV3IERhdGUodikpLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiA/IGZvcm1hdCh2LCAneXl5eS1NTS1kZCcpIDogdiksXG4pXG5cbmV4cG9ydCBjb25zdCBkYXRldGltZSA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmRhdGUoKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4ge1xuICAgICAgICBpZiAoIXYpIHJldHVybiB2XG5cbiAgICAgICAgaWYgKHYgPT09ICdudWxsJykgcmV0dXJuIG51bGxcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gbmV3IERhdGUodilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQodiwgJ3l5eXktTU0tZGQgSEg6bW0nKVxuICAgIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgYXJyYXkgPSA8VCBleHRlbmRzIHYuQmFzZVNjaGVtYTxhbnksIGFueSwgYW55Pj4oc2NoZW1hOiBUID0gdi5hbnkoKSBhcyBhbnkgYXMgVCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuYXJyYXkodi5zdHJpbmcoKSldKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogdmFsdWUuc3BsaXQoJywnKSksXG4gICAgdi5hcnJheShzY2hlbWEpLFxuKVxuXG5leHBvcnQgY29uc3QgYXJyYXlOdW1iZXIgPSAoKSA9PiB2LnBpcGUoXG4gICAgYXJyYXkoKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB2YWx1ZS5tYXAoTnVtYmVyKSksXG4pXG5cbmV4cG9ydCBjb25zdCBvYmplY3QgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5yZWNvcmQodi5zdHJpbmcoKSwgdi5hbnkoKSldKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gcXMucGFyc2UodmFsdWUpIDogdmFsdWUpLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgc2V0KHJlc3VsdCwga2V5LCBnZXQodmFsdWUsIGtleSkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSksXG4pXG5cbmV4cG9ydCBmdW5jdGlvbiB1cmwoKSB7XG4gICAgcmV0dXJuIG9iamVjdCgpXG59XG5cbnVybC5udW1iZXIgPSBudW1iZXJcbnVybC5ib29sZWFuID0gYm9vbGVhbiBcbnVybC5kYXRlID0gZGF0ZSBcbnVybC5kYXRldGltZSA9IGRhdGV0aW1lXG51cmwuYXJyYXkgPSBhcnJheVxudXJsLmFycmF5TnVtYmVyID0gYXJyYXlOdW1iZXJcbnVybC5vYmplY3QgPSBvYmplY3RcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCcgXG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBjb25zdCBrZXlWYWx1ZSA9ICgpID0+IHYucGlwZSh2LnN0cmluZygpLCB2LnRyYW5zZm9ybSgodmFsdWUpID0+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gdmFsdWUuc3BsaXQoL1s7XFxuXS8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmZpbHRlcihsID0+IGwuaW5jbHVkZXMoJz0nKSlcbiAgICAgICAgLm1hcChsID0+IGwudHJpbSgpLnNwbGl0KCc9JykpXG5cbiAgICBjb25zdCBvYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcykgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgbGV0IHBhcnNlZFZhbHVlOiBhbnkgPSB2YWx1ZVxuXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdib29sOicpKSB7XG4gICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ2Jvb2w6JywgJycpLnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICBzZXQocmVzdWx0LCBrZXksIHBhcnNlZFZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn0pKVxuIiwiaW1wb3J0IHsgbnVtYmVyLCBhcnJheSB9IGZyb20gJy4vdXJsVmFsaWRhdG9yLnRzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25QYXJhbXMge1xuICAgIG1heExpbWl0PzogbnVtYmVyXG4gICAgb3JkZXJGaWVsZHM/OiBzdHJpbmdbXVxufVxuXG5cbmV4cG9ydCBjb25zdCBiYXNlID0gKG9wdGlvbnM6IFBhZ2luYXRpb25QYXJhbXMgPSB7fSkgPT4gdi5vYmplY3Qoe1xuICAgIHBhZ2U6IHYub3B0aW9uYWwobnVtYmVyKCksIDEpLFxuICAgIGxpbWl0OiB2Lm9wdGlvbmFsKG51bWJlcigpLCBvcHRpb25zLm1heExpbWl0IHx8IDEwMCksXG4gICAgb3JkZXJCeTogdi5udWxsaXNoKG9wdGlvbnMub3JkZXJGaWVsZHMgPyBhcnJheSh2LnBpY2tsaXN0KG9wdGlvbnMub3JkZXJGaWVsZHMpKSA6IGFycmF5KHYuc3RyaW5nKCkpLCBbXSksXG4gICAgb3JkZXJEaXJlY3Rpb246IHYubnVsbGlzaChhcnJheSh2LnVuaW9uKFt2LmxpdGVyYWwoJ2FzYycpLCB2LmxpdGVyYWwoJ2Rlc2MnKV0pKSwgW10pLFxufSlcblxuZXhwb3J0IGZ1bmN0aW9uIHBhZ2luYXRpb24ob3B0aW9uczogUGFnaW5hdGlvblBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIGJhc2Uob3B0aW9ucylcbn1cblxucGFnaW5hdGlvbi5iYXNlID0gYmFzZVxuIiwiZXhwb3J0ICogZnJvbSAnLi91cmxWYWxpZGF0b3IudHMnXG5leHBvcnQgKiBmcm9tICcuL2tleVZhbHVlVmFsaWRhdG9yLnRzJ1xuZXhwb3J0ICogZnJvbSAnLi9wYWdpbmF0aW9uVmFsaWRhdG9yLnRzJ1xuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0ICogYXMgZXh0cmFzIGZyb20gJyNzaGFyZWQvdmFsaWRhdG9ycy9pbmRleC50cydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJy4uL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IHR5cGUgVmFsaWJvdCA9IHR5cGVvZiB2ICYgeyBleHRyYXM6IHR5cGVvZiBleHRyYXMgfVxuXG5leHBvcnQgdHlwZSBWYWxpYm90U2NoZW1hID0gdi5CYXNlU2NoZW1hPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuZXhwb3J0IHR5cGUgVmFsaWJvdE9iamVjdFNjaGVtYSA9IHYuT2JqZWN0U2NoZW1hPGFueSwgYW55PlxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYUFzeW5jID0gdi5CYXNlU2NoZW1hQXN5bmM8dW5rbm93biwgdW5rbm93biwgdi5CYXNlSXNzdWU8dW5rbm93bj4+XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yQ2FsbGJhY2s8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+IHtcbiAgICAoX3Y6IFZhbGlib3QpOiBUXG59XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvckNhbGxiYWNrQXN5bmM8VCBleHRlbmRzIFZhbGlib3RTY2hlbWFBc3luYz4gPSB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JSZXN1bHQ8VCBleHRlbmRzIHYuQmFzZVNjaGVtYTxhbnksIGFueSwgYW55Pj4gPSB2LkluZmVyT3V0cHV0PFQ+XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRlUGF5bG9hZDxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA9IFZhbGlib3RTY2hlbWE+ID0gVmFsaWRhdG9yQ2FsbGJhY2s8VD4gfCBUXG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRlUmVzdWx0PFQgZXh0ZW5kcyBWYWxpZGF0ZVBheWxvYWQ+ID1cbiAgICBUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA/IHYuSW5mZXJPdXRwdXQ8VD4gOlxuICAgIFQgZXh0ZW5kcyBWYWxpZGF0b3JDYWxsYmFjazxpbmZlciBVPiA/IHYuSW5mZXJPdXRwdXQ8VT4gOlxuICAgIHVua25vd25cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYWxpZGF0b3JTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdWYWxpZGF0b3JTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHY6IFZhbGlib3QgPSB7XG4gICAgICAgIC4uLnYsXG4gICAgICAgIGV4dHJhcyxcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihjYjogVmFsaWRhdG9yQ2FsbGJhY2s8VD4pIHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMudilcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGU8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPikge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSB2LnNhZmVQYXJzZShzY2hlbWEsIHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gW10gYXMgc3RyaW5nW11cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ucm9vdCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4uZmxhdHRlbi5yb290KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmxhdHRlbi5uZXN0ZWQpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhmbGF0dGVuLm5lc3RlZCkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnkgYXMgW3N0cmluZywgc3RyaW5nW11dXG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCguLi52YWx1ZS5tYXAoKHYpID0+IGAke2tleX06ICR7dn1gKSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXMubGVuZ3RoID8gbWVzc2FnZXMuam9pbignLCAnKSA6ICdWYWxpZGF0aW9uIGZhaWxlZCdcblxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQmFzZUV4Y2VwdGlvbihtZXNzYWdlLCA0MjIpXG5cbiAgICAgICAgICAgIGVycm9yLm5hbWUgPSAnVmFsaWRhdGlvbkVycm9yJ1xuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IG1lc3NhZ2VzLCB9KVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUFzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRvckNhbGxiYWNrQXN5bmM8VD4gfCBUKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgb3V0cHV0LCBpc3N1ZXMsIHN1Y2Nlc3MgfSA9IGF3YWl0IHYuc2FmZVBhcnNlQXN5bmMoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1ZhbGlkYXRpb24gZmFpbGVkJylcbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW4gPSB2LmZsYXR0ZW4oaXNzdWVzKVxuICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgICAuLi5mbGF0dGVuLnJvb3QsXG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5uZXN0ZWQsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZGV0YWlscywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWYWxpZDxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4ocGF5bG9hZDogYW55LCBjYjogVmFsaWRhdGVQYXlsb2FkPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfVxufVxuXG4iLCJpbXBvcnQgVmFsaWRhdG9yU2VydmljZSBmcm9tIFwiLi4vc2VydmljZXMvVmFsaWRhdG9yU2VydmljZVwiXG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yU2VydmljZSgpXG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRvclxuIiwiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JSZXN1bHQgfSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMnXG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJyNzaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMnXG5cblxuZXhwb3J0IHR5cGUgRGFzaGJvYXJkTWV0YVNjaGVtYSA9IFZhbGlkYXRvclJlc3VsdDxSZXR1cm5UeXBlPHR5cGVvZiBkYXNoYm9hcmRNZXRhU2NoZW1hPj5cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZE1ldGFTY2hlbWEoKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGUodiA9PiB2Lm9iamVjdCh7XG4gICAgICAgIGlkOiB2Lm51bWJlcigpLFxuICAgICAgICBkYXNoYm9hcmRfaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYuc3RyaW5nKCksXG4gICAgICAgIHZhbHVlOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIH0pKVxufVxuXG5kYXNoYm9hcmRNZXRhU2NoZW1hLmNyZWF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBpY2soZGFzaGJvYXJkTWV0YVNjaGVtYSgpLCBbJ2Rhc2hib2FyZF9pZCcsICduYW1lJywgJ3ZhbHVlJ10pKVxuXG5kYXNoYm9hcmRNZXRhU2NoZW1hLnVwZGF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBhcnRpYWwoZGFzaGJvYXJkTWV0YVNjaGVtYS5jcmVhdGUpKVxuIiwiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JSZXN1bHQgfSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMnXG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJyNzaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMnXG5cbmV4cG9ydCB0eXBlIERhc2hib2FyZFNjaGVtYSA9IFZhbGlkYXRvclJlc3VsdDxSZXR1cm5UeXBlPHR5cGVvZiBkYXNoYm9hcmRTY2hlbWE+PlxuXG5leHBvcnQgZnVuY3Rpb24gZGFzaGJvYXJkU2NoZW1hKCkge1xuICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5vYmplY3Qoe1xuICAgICAgICBpZDogdi5udW1iZXIoKSxcbiAgICAgICAgbmFtZTogdi5zdHJpbmcoKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlbGV0ZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG5cbiAgICAgICAgbWV0YXM6IHYub3B0aW9uYWwodi5yZWNvcmQodi5zdHJpbmcoKSwgdi5hbnkoKSkpLFxuICAgIH0pKVxufVxuXG5kYXNoYm9hcmRTY2hlbWEuY3JlYXRlID0gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYucGljayhkYXNoYm9hcmRTY2hlbWEoKSwgWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ10pKVxuXG5kYXNoYm9hcmRTY2hlbWEudXBkYXRlID0gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYucGFydGlhbChkYXNoYm9hcmRTY2hlbWEuY3JlYXRlKSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbkFzc2lnbm1lbnQgPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHBlcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIHBlcm1pc3Npb25faWQ6IHYubnVtYmVyKCksXG4gICAgYXNzaWduYWJsZV90eXBlOiB2LnN0cmluZygpLFxuICAgIGFzc2lnbmFibGVfaWQ6IHYuc3RyaW5nKCksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHBlcm1pc3Npb25TY2hlbWE+XG5cbmV4cG9ydCBjb25zdCBwZXJtaXNzaW9uU2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIG5hbWU6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgZGVzY3JpcHRpb246IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgYWN0aW9uOiB2LnN0cmluZygpLFxuICAgIHN1YmplY3Q6IHYuc3RyaW5nKCksXG4gICAgY29uZGl0aW9uczogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgZXhwaXJlc19hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFRva2VuID0gdi5JbmZlck91dHB1dDx0eXBlb2YgdG9rZW5TY2hlbWE+XG5cbmV4cG9ydCBjb25zdCB0b2tlblNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBuYW1lOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIHR5cGU6IHYuc3RyaW5nKCksXG4gICAgdXNlcl9pZDogdi5udW1iZXIoKSxcbiAgICB0b2tlbjogdi5zdHJpbmcoKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgZXhwaXJlc19hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmZ1bmN0aW9uIHVzZXJTY2hlbWEoKSB7XG4gICAgcmV0dXJuIHYub2JqZWN0KHtcbiAgICAgICAgaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgICAgIGVtYWlsOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5lbWFpbCgpKSxcbiAgICAgICAgcGFzc3dvcmQ6IHYucGlwZSh2LnN0cmluZygpLCB2Lm1pbkxlbmd0aCg2KSksXG4gICAgICAgIHVzZXJuYW1lOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5yZWdleCgvXlthLXpBLVowLTlfLV0rJC8pKSxcbiAgICAgICAgdmVyaWZpZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlbGV0ZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSlcbiAgICB9KVxufVxuXG51c2VyU2NoZW1hLmNyZWF0ZSA9ICgpID0+IHYub21pdCh1c2VyU2NoZW1hKCksIFsnaWQnLCAndmVyaWZpZWRfYXQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2RlbGV0ZWRfYXQnXSlcbnVzZXJTY2hlbWEudXBkYXRlID0gKCkgPT4gdi5wYXJ0aWFsKHVzZXJTY2hlbWEuY3JlYXRlKCkpXG5cbmV4cG9ydCBkZWZhdWx0IHVzZXJTY2hlbWFcbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXIge1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbWl0SG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgeyAgICAgICAgICAgICAgICBcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGZvciBhd2FpdCAoY29uc3QgbCBvZiBsaXN0ZW5lcnMuZmlsdGVyKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50KSkge1xuICAgICAgICBhd2FpdCBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Ib29rKGNvbnN0cnVjdG9yOiBhbnksIGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGNvbnN0IGV4aXN0cyA9IGxpc3RlbmVycy5maW5kKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICBldmVudCxcbiAgICAgICAgbGlzdGVuZXIgXG4gICAgfSlcblxuICAgIGNvbnN0cnVjdG9yLmxpc3RlbmVycyA9IGxpc3RlbmVyc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSG9va3NTdGF0aWM8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdC5hcHBseSh0aGlzLmNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBsaXN0ZW5lcnMgPSBbXSBhcyBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICByZXR1cm4gb25Ib29rKHRoaXMsIGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZW1pdChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRIb29rKHRoaXMsIGV2ZW50LCAuLi5hcmdzKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBIb29rczxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgbGlzdGVuZXJzOiBMaXN0ZW5lcltdXG5cbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGxpc3RlbmVyIFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVycy5maW5kSW5kZXgoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcigobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQpXG5cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcHVibGljIGFzeW5jIGVtaXRBc3luYyhldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuSG9va3NTdGF0aWMuZW1pdCA9IGVtaXRIb29rXG5Ib29rc1N0YXRpYy5vbiA9IG9uSG9va1xuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgb3JpZ2luOiBzdHJpbmdcbiAgICBwdWJsaWMgc3ViamVjdDogc3RyaW5nXG4gICAgcHVibGljIGFjdGlvbjogc3RyaW5nXG4gICAgcHVibGljIGNvbmRpdGlvbnM6IHN0cmluZyB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbnVsbFxuXG4gICAgcHVibGljIGdldCBlZGl0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luID09PSAnY3VzdG9tJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyc2VkQ29uZGl0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCBqc29uXSA9IHRyeUNhdGNoLnN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmRpdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5jb25kaXRpb25zIGFzIHN0cmluZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGVycm9yID8ge30gOiBqc29uXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lQWJpbGl0eSwgc3ViamVjdCBhcyBjcmVhdGVTdWJqZWN0IH0gZnJvbSAnQGNhc2wvYWJpbGl0eSdcbmltcG9ydCBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNsRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdBY2xFbnRpdHknXG5cbiAgICBwdWJsaWMgYWJpbGl0eTogUmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lQWJpbGl0eT5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBY2xFbnRpdHk+ID0ge30pIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBkYXRhLnBlcm1pc3Npb25zIHx8IFtdXG4gICAgICAgIGNvbnN0IHBlcm1zID0gcGVybWlzc2lvbnMubWFwKChwZXJtaXNzaW9uKSA9PiBQZXJtaXNzaW9uLmZyb20ocGVybWlzc2lvbikpXG5cbiAgICAgICAgXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtc1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKCkuY2hpbGQoeyBsYWJlbDogJ2FjbCcgfSlcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYWJpbGl0eSA9IGRlZmluZUFiaWxpdHkoKGNhbikgPT4ge1xuICAgICAgICAgICAgcGVybXMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbihwZXJtaXNzaW9uLmFjdGlvbiwgcGVybWlzc2lvbi5zdWJqZWN0LCBwZXJtaXNzaW9uLnBhcnNlZENvbmRpdGlvbnMpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScsIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuKGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblxuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW5ub3QoYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWJqZWN0KHN1YmplY3Q6IHN0cmluZywgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcbiAgICB9XG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZUVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBkcml2ZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWV0eXBlOiBzdHJpbmdcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIGNsaWVudF9uYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZmlsZW5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwdWJsaWM6IGJvb2xlYW5cblxuICAgIC8vIGR5bmFtaWNcbiAgICBwdWJsaWMgdXJsPzogc3RyaW5nXG4gICAgcHVibGljIG1ldGFzPzogUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgcHVibGljIGlzSW1hZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWV0eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVNZXRhIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGZpbGVfaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZyB8IG51bGxcbn1cbiIsImltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHlNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRTZXNzaW9uIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBwdXJwb3NlOiBzdHJpbmdcbiAgICBwdWJsaWMgbWltZV90eXBlczogc3RyaW5nXG4gICAgcHVibGljIG1heF9zaXplOiBudW1iZXJcblxuICAgIC8vIGR5bmFtaWMgXG4gICAgcHVibGljIHVwbG9hZF91cmw/OiBzdHJpbmdcbiAgICBwdWJsaWMgY3JlYXRlX2ZpbGVfdXJsPzogc3RyaW5nXG5cbiAgICBwdWJsaWMgZ2V0UGFyc2VkTWltZVR5cGVzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWltZV90eXBlcy5zcGxpdCgnLCcpLm1hcCh0eXBlID0+IHR5cGUudHJpbSgpKVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0FsbG93ZWRNaW1lVHlwZShtaW1lVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IHRoaXMuZ2V0UGFyc2VkTWltZVR5cGVzKClcbiAgICAgICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5pbmNsdWRlcyhtaW1lVHlwZSkgfHwgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKCcqLyonKVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0FsbG93ZWRTaXplKHNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc2l6ZSA8PSB0aGlzLm1heF9zaXplXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgTW9kdWxlTWFuaWZlc3QgZnJvbSAnLi9Nb2R1bGVNYW5pZmVzdEVudGl0eS50cydcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB7IGNvbXBvc2UsIG1peGluIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5pbnRlcmZhY2UgTW9kdWxlVXBncmFkZUluZm8ge1xuICAgIHNvdXJjZTogJ2dpdCcgfCAnemlwJ1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIG1peGluKExpZmVjeWNsZUhvb2spKSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICAgIHB1YmxpYyBidWlsZDogTW9kdWxlTWFuaWZlc3RbJ2J1aWxkJ10gPSB7fVxuICAgIHB1YmxpYyBkaXJlY3Rvcnk6IHN0cmluZ1xuXG4gICAgcHVibGljIHVwZ3JhZGVfaW5mbz86IE1vZHVsZVVwZ3JhZGVJbmZvXG5cbiAgICBwdWJsaWMgc2V0RGF0YShkYXRhOiBQYXJ0aWFsPE1vZHVsZSB8IE1vZHVsZU1hbmlmZXN0Pikge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbHRlcigoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZmlsdGVyZWQpXG5cbiAgICAgICAgdGhpcy5ob29rX2lkID0gYG1vZHVsZToke3RoaXMuaWR9YFxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RCdWlsZEltcG9ydCB7XG4gICAgZnJvbTogc3RyaW5nXG4gICAgdG8/OiBzdHJpbmdcbiAgICB0eXBlOiAnZ2xvYmFsX2ltcG9ydCdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RCdWlsZCB7XG4gICAgaW1wb3J0cz86IE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnRbXVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGVNYW5pZmVzdCBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhdXRob3I/OiBzdHJpbmdcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBidWlsZD86IE1vZHVsZU1hbmlmZXN0QnVpbGRcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhbGlhc2VzOiBzdHJpbmdbXVxuICAgIHB1YmxpYyB2ZXJzaW9uX2NoYW5uZWw6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uX2F2YWlsYWJsZV9jaGFubmVsczogc3RyaW5nW11cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcbmltcG9ydCB7IEVtbWl0dGVyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5cbmNvbnN0IGVtbWl0dGVyID0gY29udGFpbmVyLnByb3h5PEVtbWl0dGVyU2VydmljZT4oRW1taXR0ZXJTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBlbW1pdHRlclxuIiwiaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiB9IGZyb20gXCIjc2hhcmVkL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgRGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiXG5pbXBvcnQgZW1taXR0ZXIgZnJvbSAnLi4vZmFjYWRlcy9lbW1pdHRlci50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGF5b3V0U2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTGF5b3V0U2VydmljZSdcbiAgICBwdWJsaWMgY29tcG9uZW50czogTWFwPHN0cmluZywgRGVmaW5lQ29tcG9uZW50PiA9IG5ldyBNYXAoKVxuICAgIHB1YmxpYyBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgY3VycmVuZElkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gICAgcHVibGljIHNldEN1cnJlbnQoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmN1cnJlbmRJZCA9IGlkXG5cbiAgICAgICAgZW1taXR0ZXIuZW1pdCgnbGF5b3V0OmNoYW5nZScsIGlkKVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGQobmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IERlZmluZUNvbXBvbmVudCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMuc2V0KG5hbWUsIGNvbXBvbmVudClcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXMobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHMuaGFzKG5hbWUpXG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmNvbXBvbmVudHMuZ2V0KG5hbWUpXG5cbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYExheW91dCAke25hbWV9IG5vdCBmb3VuZGApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVuZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuY3VycmVuZElkKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRPcHRpb25zKG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcblxuICAgICAgICBlbW1pdHRlci5lbWl0KCdsYXlvdXQ6c2V0LW9wdGlvbnMnLCBvcHRpb25zKVxuICAgIH1cbn1cbiIsImltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyc7XG5pbXBvcnQgQmFzZUxpZmVjeWNsZVNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlU2VydmljZSBleHRlbmRzIEJhc2VMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgYWRkSW1wb3J0cyhpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KXtcbiAgICAgICAgY29uc3QgaG9va3M6IExpZmVjeWNsZUhvb2tbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbW9kXSBvZiBPYmplY3QuZW50cmllcyhpbXBvcnRzKSkge1xuICAgICAgICAgICAgY29uc3QgSG9va0NsYXNzID0gbW9kLmRlZmF1bHQgfHwgbW9kXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBIb29rQ2xhc3MoKSBhcyBMaWZlY3ljbGVIb29rXG5cbiAgICAgICAgICAgIGluc3RhbmNlLmhvb2tfaWQgPSBpbnN0YW5jZS5ob29rX2lkIHx8IG5hbWVcblxuICAgICAgICAgICAgaG9va3MucHVzaChpbnN0YW5jZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGhvb2tzLmZvckVhY2goaG9vayA9PiB0aGlzLmFkZChob29rKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZW51SXRlbSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIGxhYmVsOiBzdHJpbmdcbiAgICBwdWJsaWMgbGF5b3V0OiBzdHJpbmdcblxuICAgIHB1YmxpYyB0bz86IHN0cmluZ1xuXG4gICAgcHVibGljIHRhcmdldD86ICdfYmxhbmsnIHwgJ19zZWxmJyB8ICdfcGFyZW50JyB8ICdfdG9wJ1xuICAgIHB1YmxpYyBncm91cD86IHN0cmluZ1xuICAgIHB1YmxpYyBvcmRlcj86IG51bWJlclxuICAgIHB1YmxpYyBpY29uPzogc3RyaW5nXG4gICAgcHVibGljIHBhcmVudD86IHN0cmluZ1xufVxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IEFjbEVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cydcblxuY29uc3QgYWNsID0gY29udGFpbmVyLnByb3h5PEFjbEVudGl0eT4oQWNsRW50aXR5KVxuXG5leHBvcnQgZGVmYXVsdCBhY2xcbiIsImltcG9ydCBNZW51SXRlbSBmcm9tICcjY2xpZW50L2VudGl0aWVzL01lbnVJdGVtRW50aXR5LnRzJ1xuaW1wb3J0IGFjbCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYWNsLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGaWx0ZXIge1xuICAgIGxheW91dD86IHN0cmluZ1xuICAgIGdyb3VwPzogc3RyaW5nXG4gICAgcGFyZW50Pzogc3RyaW5nXG4gICAgYWxsb3dlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVudVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ01lbnVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGl0ZW1zOiBNYXA8c3RyaW5nLCBNZW51SXRlbT4gPSBuZXcgTWFwKClcblxuICAgIHB1YmxpYyBhZGQoLi4uaXRlbTogT21pdDxQYXJ0aWFsPE1lbnVJdGVtPiwgJ21lcmdlJyB8ICdmcm9tJz5bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbSkge1xuXG4gICAgICAgICAgICBpZiAoIWkuaWQpIHtcbiAgICAgICAgICAgICAgICBpLmlkID0gSlNPTi5zdHJpbmdpZnkoaSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pdGVtcy5zZXQoaS5pZCwgTWVudUl0ZW0uZnJvbShpKSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoaWQ6IE1lbnVJdGVtWydpZCddKSB7XG4gICAgICAgIHRoaXMuaXRlbXMuZGVsZXRlKGlkKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KGZpbHRlcjogTGlzdEZpbHRlciA9IHt9KSB7XG4gICAgICAgIGxldCBpdGVtcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh0aGlzLml0ZW1zLnZhbHVlcygpKSkpIGFzIE1lbnVJdGVtW11cblxuXG4gICAgICAgIGlmIChmaWx0ZXIubGF5b3V0KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGkubGF5b3V0ID09PSBmaWx0ZXIubGF5b3V0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlci5ncm91cCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLmdyb3VwID09PSBmaWx0ZXIuZ3JvdXAgfHwgaS5wYXJlbnQgPT09IGZpbHRlci5ncm91cClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIucGFyZW50KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGkucGFyZW50ID09PSBmaWx0ZXIucGFyZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlci5hbGxvd2VkICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyLmFsbG93ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gYWNsLmNhbigndmlldycsIGkpKVxuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JkZXJBID0gYS5vcmRlciA/IGEub3JkZXIgOiA5OFxuICAgICAgICAgICAgY29uc3Qgb3JkZXJCID0gYi5vcmRlciA/IGIub3JkZXIgOiA5OFxuXG4gICAgICAgICAgICByZXR1cm4gb3JkZXJBIC0gb3JkZXJCXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLml0ZW1zLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25HdWFyZCB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgY29uZmlnIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb25maWcudHMnXG5cbmNvbnN0IHNldHVwR3VhcmQ6IE5hdmlnYXRpb25HdWFyZCA9ICh0bykgPT4ge1xuICAgIGNvbnN0IHNldHVwID0gY29uZmlnLmdldDxhbnk+KCdzZXR1cCcpXG4gICAgXG4gICAgY29uc3QgY29tcGxldGVkID0gIXNldHVwPy5uZWVkX2RhdGFiYXNlICYmICFzZXR1cD8ubmVlZF91c2Vyc1xuICAgIFxuICAgIGlmIChjb21wbGV0ZWQgJiYgdG8ucGF0aC5zdGFydHNXaXRoKCcvc2V0dXAnKSkge1xuICAgICAgICByZXR1cm4gJy8nXG4gICAgfVxuICAgIFxuICAgIGlmIChjb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0by5wYXRoLnN0YXJ0c1dpdGgoJy9zZXR1cCcpKSB7XG4gICAgICAgIHJldHVybiAnL3NldHVwJ1xuICAgIH1cbiAgICBcbiAgICBpZiAodG8ucGF0aCA9PT0gJy9zZXR1cCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9ICAgIFxuXG4gICAgaWYgKHNldHVwPy5uZWVkX2RhdGFiYXNlKSB7XG4gICAgICAgIHJldHVybiB0by5wYXRoICE9PSAnL3NldHVwL2RhdGFiYXNlJyA/ICcvc2V0dXAvZGF0YWJhc2UnIDogdHJ1ZVxuICAgIH1cblxuICAgIGlmIChzZXR1cD8ubmVlZF91c2Vycykge1xuICAgICAgICByZXR1cm4gdG8ucGF0aCAhPT0gJy9zZXR1cC91c2VyJyA/ICcvc2V0dXAvdXNlcicgOiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0dXBHdWFyZFxuIiwiaW1wb3J0IHtcbiAgICBjcmVhdGVSb3V0ZXIgYXMgY3JlYXRlVnVlUm91dGVyLFxuICAgIGNyZWF0ZU1lbW9yeUhpc3RvcnksXG4gICAgY3JlYXRlV2ViSGlzdG9yeVxufSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQsIFJvdXRlciBhcyBWdWVSb3V0ZXIgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZVJlY29yZFJhdyB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgdHlwZSB7IERlZmluZUNvbXBvbmVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBzZXR1cEd1YXJkIGZyb20gJyNjbGllbnQvZ3VhcmRzL3NldHVwR3VhcmQudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVyIGV4dGVuZHMgVnVlUm91dGVyIHtcbiAgICBhdXRvOiB0eXBlb2YgYXV0bztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRvT3B0aW9ucyB7XG4gICAgZ3VhcmRzPzogTmF2aWdhdGlvbkd1YXJkW10gfCAoKHJlY29yZDogUm91dGVSZWNvcmRSYXcpID0+IE5hdmlnYXRpb25HdWFyZFtdKTtcbiAgICBzdHJpcD86IChzdHJpbmcgfCBSZWdFeHApW107XG4gICAgZXhjbHVkZT86IChzdHJpbmcgfCBSZWdFeHApW107XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHJlZmluZT86IChyZWNvcmRzOiBSb3V0ZVJlY29yZFJhd1tdKSA9PiBSb3V0ZVJlY29yZFJhd1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXV0byhpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVDb21wb25lbnQgfCAoKCkgPT4gUHJvbWlzZTxEZWZpbmVDb21wb25lbnQ+KT4sIG9wdGlvbnM6IEF1dG9PcHRpb25zID0ge30pOiBSb3V0ZVJlY29yZFJhd1tdIHtcbiAgICBsZXQgcm91dGVzOiBSb3V0ZVJlY29yZFJhd1tdID0gW11cblxuICAgIGZvciAoY29uc3QgW2ZpbGVuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKGltcG9ydHMpKSB7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZT8uc29tZShydWxlID0+XG4gICAgICAgICAgICB0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGZpbGVuYW1lLmluY2x1ZGVzKHJ1bGUpXG4gICAgICAgICAgICAgICAgOiBydWxlLnRlc3QoZmlsZW5hbWUpXG4gICAgICAgICkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFydHMgPSBmaWxlbmFtZVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLnZ1ZSQvLCAnJylcbiAgICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gcCAmJiAhcC5zdGFydHNXaXRoKCcuJykpXG4gICAgICAgICAgICAubWFwKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwID0gcGFydFxuXG4gICAgICAgICAgICAgICAgaWYgKHAuc3RhcnRzV2l0aCgnWycpICYmIHAuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICAgICAgICAgICAgICBwID0gJzonICsgcC5zbGljZSgxLCAtMSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcFxuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIC8vIFN0cmlwIHNwZWNpZmljIHNlZ21lbnRzXG4gICAgICAgIGlmIChvcHRpb25zLnN0cmlwPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhcnRzID0gcGFydHMuZmlsdGVyKHAgPT5cbiAgICAgICAgICAgICAgICAhb3B0aW9ucy5zdHJpcCEuc29tZShydWxlID0+XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBydWxlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBwID09PSBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bGUudGVzdChwKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXRoID0gcGFydHMuam9pbignLycpLnJlcGxhY2UoL2luZGV4JC8sICcnKVxuXG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCkge1xuICAgICAgICAgICAgcGF0aCA9IG9wdGlvbnMucHJlZml4ICsgJy8nICsgcGF0aFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgcGF0aCA9ICcvJyArIHBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIERlZmluZUNvbXBvbmVudCxcbiAgICAgICAgICAgIGJlZm9yZUVudGVyOiBbXSBhcyBOYXZpZ2F0aW9uR3VhcmRbXSxcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKG9wdGlvbnMuZ3VhcmRzICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5ndWFyZHMpKSB7XG4gICAgICAgICAgICByZWNvcmQuYmVmb3JlRW50ZXIgPSBvcHRpb25zLmd1YXJkc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZ3VhcmRzICYmIHR5cGVvZiBvcHRpb25zLmd1YXJkcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmVjb3JkLmJlZm9yZUVudGVyID0gb3B0aW9ucy5ndWFyZHMocmVjb3JkKVxuICAgICAgICB9XG5cbiAgICAgICAgcm91dGVzLnB1c2gocmVjb3JkKVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlZmluZSkge1xuICAgICAgICByb3V0ZXMgPSBvcHRpb25zLnJlZmluZShyb3V0ZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJvdXRlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVyKCkge1xuICAgIGNvbnN0IHNzciA9IGltcG9ydC5tZXRhLmVudi5TU1JcblxuICAgIGNvbnN0IHJvdXRlciA9IGNyZWF0ZVZ1ZVJvdXRlcih7XG4gICAgICAgIGhpc3Rvcnk6IHNzciA/IGNyZWF0ZU1lbW9yeUhpc3RvcnkoKSA6IGNyZWF0ZVdlYkhpc3RvcnkoKSxcbiAgICAgICAgcm91dGVzOiBbXSxcbiAgICAgICAgc2Nyb2xsQmVoYXZpb3IodG8sIGZyb20sIHNhdmVkUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGlmIChzYXZlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNhdmVkUG9zaXRpb25cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiAwIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KSBhcyBhbnkgYXMgUm91dGVyXG5cbiAgICByb3V0ZXIuYmVmb3JlRWFjaChzZXR1cEd1YXJkKVxuXG4gICAgcm91dGVyLmF1dG8gPSAoaW1wb3J0czogUmVjb3JkPHN0cmluZywgRGVmaW5lQ29tcG9uZW50IHwgKCgpID0+IFByb21pc2U8RGVmaW5lQ29tcG9uZW50Pik+LCBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGF1dG9Sb3V0ZXMgPSBhdXRvKGltcG9ydHMsIG9wdGlvbnMpXG4gICAgICAgIFxuICAgICAgICBhdXRvUm91dGVzLmZvckVhY2gocm91dGUgPT4gcm91dGVyLmFkZFJvdXRlKHJvdXRlKSlcblxuICAgICAgICByZXR1cm4gYXV0b1JvdXRlc1xuICAgIH1cblxuICAgIHJldHVybiByb3V0ZXJcbn1cblxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9hc3RTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdUb2FzdFNlcnZpY2UnXG5cbiAgICBwdWJsaWMgc3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzOicsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgbWVzc2FnZSwgb3B0aW9ucylcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb21wdXRlZCwgY3VzdG9tUmVmLCBlZmZlY3RTY29wZSwgZ2V0Q3VycmVudEluc3RhbmNlLCBnZXRDdXJyZW50U2NvcGUsIGhhc0luamVjdGlvbkNvbnRleHQsIGluamVjdCwgaXNSZWFjdGl2ZSwgaXNSZWYsIG5leHRUaWNrLCBvbkJlZm9yZU1vdW50LCBvbkJlZm9yZVVubW91bnQsIG9uTW91bnRlZCwgb25TY29wZURpc3Bvc2UsIG9uVW5tb3VudGVkLCBwcm92aWRlLCByZWFjdGl2ZSwgcmVhZG9ubHksIHJlZiwgc2hhbGxvd1JlYWRvbmx5LCBzaGFsbG93UmVmLCB0b1JlZiBhcyB0b1JlZiQxLCB0b1JlZnMgYXMgdG9SZWZzJDEsIHRvVmFsdWUsIHVucmVmLCB3YXRjaCwgd2F0Y2hFZmZlY3QgfSBmcm9tIFwidnVlXCI7XG5cbi8vI3JlZ2lvbiBjb21wdXRlZEVhZ2VyL2luZGV4LnRzXG4vKipcbipcbiogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb24uXG4qXG4qIE5vdGU6IElmIHlvdSBhcmUgdXNpbmcgVnVlIDMuNCssIHlvdSBjYW4gc3RyYWlnaHQgdXNlIGNvbXB1dGVkIGluc3RlYWQuXG4qIEJlY2F1c2UgaW4gVnVlIDMuNCssIGlmIGNvbXB1dGVkIG5ldyB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UsXG4qIGNvbXB1dGVkLCBlZmZlY3QsIHdhdGNoLCB3YXRjaEVmZmVjdCwgcmVuZGVyIGRlcGVuZGVuY2llcyB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQuXG4qIHJlZmVyOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvY29yZS9wdWxsLzU5MTJcbipcbiogQHBhcmFtIGZuIGVmZmVjdCBmdW5jdGlvblxuKiBAcGFyYW0gb3B0aW9ucyBXYXRjaE9wdGlvbnNCYXNlXG4qIEByZXR1cm5zIHJlYWRvbmx5IHNoYWxsb3dSZWZcbiovXG5mdW5jdGlvbiBjb21wdXRlZEVhZ2VyKGZuLCBvcHRpb25zKSB7XG5cdHZhciBfb3B0aW9ucyRmbHVzaDtcblx0Y29uc3QgcmVzdWx0ID0gc2hhbGxvd1JlZigpO1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0cmVzdWx0LnZhbHVlID0gZm4oKTtcblx0fSwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0Zmx1c2g6IChfb3B0aW9ucyRmbHVzaCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5mbHVzaCkgIT09IG51bGwgJiYgX29wdGlvbnMkZmx1c2ggIT09IHZvaWQgMCA/IF9vcHRpb25zJGZsdXNoIDogXCJzeW5jXCJcblx0fSk7XG5cdHJldHVybiByZWFkb25seShyZXN1bHQpO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgY29tcHV0ZWRFYWdlcmAgaW5zdGVhZCAqL1xuY29uc3QgZWFnZXJDb21wdXRlZCA9IGNvbXB1dGVkRWFnZXI7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGNvbXB1dGVkV2l0aENvbnRyb2wvaW5kZXgudHNcbi8qKlxuKiBFeHBsaWNpdGx5IGRlZmluZSB0aGUgZGVwcyBvZiBjb21wdXRlZC5cbipcbiogQHBhcmFtIHNvdXJjZVxuKiBAcGFyYW0gZm5cbiovXG5mdW5jdGlvbiBjb21wdXRlZFdpdGhDb250cm9sKHNvdXJjZSwgZm4sIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgdiA9IHZvaWQgMDtcblx0bGV0IHRyYWNrO1xuXHRsZXQgdHJpZ2dlcjtcblx0bGV0IGRpcnR5ID0gdHJ1ZTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4ge1xuXHRcdGRpcnR5ID0gdHJ1ZTtcblx0XHR0cmlnZ2VyKCk7XG5cdH07XG5cdHdhdGNoKHNvdXJjZSwgdXBkYXRlLCB7XG5cdFx0Zmx1c2g6IFwic3luY1wiLFxuXHRcdC4uLm9wdGlvbnNcblx0fSk7XG5cdGNvbnN0IGdldCQxID0gdHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIgPyBmbiA6IGZuLmdldDtcblx0Y29uc3Qgc2V0JDEgPSB0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIiA/IHZvaWQgMCA6IGZuLnNldDtcblx0Y29uc3QgcmVzdWx0ID0gY3VzdG9tUmVmKChfdHJhY2ssIF90cmlnZ2VyKSA9PiB7XG5cdFx0dHJhY2sgPSBfdHJhY2s7XG5cdFx0dHJpZ2dlciA9IF90cmlnZ2VyO1xuXHRcdHJldHVybiB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdGlmIChkaXJ0eSkge1xuXHRcdFx0XHRcdHYgPSBnZXQkMSh2KTtcblx0XHRcdFx0XHRkaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRyYWNrKCk7XG5cdFx0XHRcdHJldHVybiB2O1xuXHRcdFx0fSxcblx0XHRcdHNldCh2JDEpIHtcblx0XHRcdFx0c2V0JDEgPT09IG51bGwgfHwgc2V0JDEgPT09IHZvaWQgMCB8fCBzZXQkMSh2JDEpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xuXHRyZXN1bHQudHJpZ2dlciA9IHVwZGF0ZTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYGNvbXB1dGVkV2l0aENvbnRyb2xgIGluc3RlYWQgKi9cbmNvbnN0IGNvbnRyb2xsZWRDb21wdXRlZCA9IGNvbXB1dGVkV2l0aENvbnRyb2w7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHRyeU9uU2NvcGVEaXNwb3NlL2luZGV4LnRzXG4vKipcbiogQ2FsbCBvblNjb3BlRGlzcG9zZSgpIGlmIGl0J3MgaW5zaWRlIGFuIGVmZmVjdCBzY29wZSBsaWZlY3ljbGUsIGlmIG5vdCwgZG8gbm90aGluZ1xuKlxuKiBAcGFyYW0gZm5cbiovXG5mdW5jdGlvbiB0cnlPblNjb3BlRGlzcG9zZShmbiwgZmFpbFNpbGVudGx5KSB7XG5cdGlmIChnZXRDdXJyZW50U2NvcGUoKSkge1xuXHRcdG9uU2NvcGVEaXNwb3NlKGZuLCBmYWlsU2lsZW50bHkpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlRXZlbnRIb29rL2luZGV4LnRzXG4vKipcbiogVXRpbGl0eSBmb3IgY3JlYXRpbmcgZXZlbnQgaG9va3NcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlRXZlbnRIb29rXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gY3JlYXRlRXZlbnRIb29rKCkge1xuXHRjb25zdCBmbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRjb25zdCBvZmYgPSAoZm4pID0+IHtcblx0XHRmbnMuZGVsZXRlKGZuKTtcblx0fTtcblx0Y29uc3QgY2xlYXIgPSAoKSA9PiB7XG5cdFx0Zm5zLmNsZWFyKCk7XG5cdH07XG5cdGNvbnN0IG9uID0gKGZuKSA9PiB7XG5cdFx0Zm5zLmFkZChmbik7XG5cdFx0Y29uc3Qgb2ZmRm4gPSAoKSA9PiBvZmYoZm4pO1xuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKG9mZkZuKTtcblx0XHRyZXR1cm4geyBvZmY6IG9mZkZuIH07XG5cdH07XG5cdGNvbnN0IHRyaWdnZXIgPSAoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChBcnJheS5mcm9tKGZucykubWFwKChmbikgPT4gZm4oLi4uYXJncykpKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRvbixcblx0XHRvZmYsXG5cdFx0dHJpZ2dlcixcblx0XHRjbGVhclxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVHbG9iYWxTdGF0ZS9pbmRleC50c1xuLyoqXG4qIEtlZXAgc3RhdGVzIGluIHRoZSBnbG9iYWwgc2NvcGUgdG8gYmUgcmV1c2FibGUgYWNyb3NzIFZ1ZSBpbnN0YW5jZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZUdsb2JhbFN0YXRlXG4qIEBwYXJhbSBzdGF0ZUZhY3RvcnkgQSBmYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgc3RhdGVcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxTdGF0ZShzdGF0ZUZhY3RvcnkpIHtcblx0bGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5cdGxldCBzdGF0ZTtcblx0Y29uc3Qgc2NvcGUgPSBlZmZlY3RTY29wZSh0cnVlKTtcblx0cmV0dXJuICgoLi4uYXJncykgPT4ge1xuXHRcdGlmICghaW5pdGlhbGl6ZWQpIHtcblx0XHRcdHN0YXRlID0gc2NvcGUucnVuKCgpID0+IHN0YXRlRmFjdG9yeSguLi5hcmdzKSk7XG5cdFx0XHRpbml0aWFsaXplZCA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBzdGF0ZTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHByb3ZpZGVMb2NhbC9tYXAudHNcbmNvbnN0IGxvY2FsUHJvdmlkZWRTdGF0ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBpbmplY3RMb2NhbC9pbmRleC50c1xuLyoqXG4qIE9uIHRoZSBiYXNpcyBvZiBgaW5qZWN0YCwgaXQgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBjYWxsIGluamVjdCB0byBvYnRhaW4gdGhlIHZhbHVlIGFmdGVyIGNhbGwgcHJvdmlkZSBpbiB0aGUgc2FtZSBjb21wb25lbnQuXG4qXG4qIEBleGFtcGxlXG4qIGBgYHRzXG4qIGluamVjdExvY2FsKCdNeUluamVjdGlvbktleScsIDEpXG4qIGNvbnN0IGluamVjdGVkVmFsdWUgPSBpbmplY3RMb2NhbCgnTXlJbmplY3Rpb25LZXknKSAvLyBpbmplY3RlZFZhbHVlID09PSAxXG4qIGBgYFxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmNvbnN0IGluamVjdExvY2FsID0gKC4uLmFyZ3MpID0+IHtcblx0dmFyIF9nZXRDdXJyZW50SW5zdGFuY2U7XG5cdGNvbnN0IGtleSA9IGFyZ3NbMF07XG5cdGNvbnN0IGluc3RhbmNlID0gKF9nZXRDdXJyZW50SW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKSkgPT09IG51bGwgfHwgX2dldEN1cnJlbnRJbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dldEN1cnJlbnRJbnN0YW5jZS5wcm94eTtcblx0Y29uc3Qgb3duZXIgPSBpbnN0YW5jZSAhPT0gbnVsbCAmJiBpbnN0YW5jZSAhPT0gdm9pZCAwID8gaW5zdGFuY2UgOiBnZXRDdXJyZW50U2NvcGUoKTtcblx0aWYgKG93bmVyID09IG51bGwgJiYgIWhhc0luamVjdGlvbkNvbnRleHQoKSkgdGhyb3cgbmV3IEVycm9yKFwiaW5qZWN0TG9jYWwgbXVzdCBiZSBjYWxsZWQgaW4gc2V0dXBcIik7XG5cdGlmIChvd25lciAmJiBsb2NhbFByb3ZpZGVkU3RhdGVNYXAuaGFzKG93bmVyKSAmJiBrZXkgaW4gbG9jYWxQcm92aWRlZFN0YXRlTWFwLmdldChvd25lcikpIHJldHVybiBsb2NhbFByb3ZpZGVkU3RhdGVNYXAuZ2V0KG93bmVyKVtrZXldO1xuXHRyZXR1cm4gaW5qZWN0KC4uLmFyZ3MpO1xufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcHJvdmlkZUxvY2FsL2luZGV4LnRzXG4vKipcbiogT24gdGhlIGJhc2lzIG9mIGBwcm92aWRlYCwgaXQgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBjYWxsIGluamVjdCB0byBvYnRhaW4gdGhlIHZhbHVlIGFmdGVyIGNhbGwgcHJvdmlkZSBpbiB0aGUgc2FtZSBjb21wb25lbnQuXG4qXG4qIEBleGFtcGxlXG4qIGBgYHRzXG4qIHByb3ZpZGVMb2NhbCgnTXlJbmplY3Rpb25LZXknLCAxKVxuKiBjb25zdCBpbmplY3RlZFZhbHVlID0gaW5qZWN0TG9jYWwoJ015SW5qZWN0aW9uS2V5JykgLy8gaW5qZWN0ZWRWYWx1ZSA9PT0gMVxuKiBgYGBcbiovXG5mdW5jdGlvbiBwcm92aWRlTG9jYWwoa2V5LCB2YWx1ZSkge1xuXHR2YXIgX2dldEN1cnJlbnRJbnN0YW5jZTtcblx0Y29uc3QgaW5zdGFuY2UgPSAoX2dldEN1cnJlbnRJbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpKSA9PT0gbnVsbCB8fCBfZ2V0Q3VycmVudEluc3RhbmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZ2V0Q3VycmVudEluc3RhbmNlLnByb3h5O1xuXHRjb25zdCBvd25lciA9IGluc3RhbmNlICE9PSBudWxsICYmIGluc3RhbmNlICE9PSB2b2lkIDAgPyBpbnN0YW5jZSA6IGdldEN1cnJlbnRTY29wZSgpO1xuXHRpZiAob3duZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwicHJvdmlkZUxvY2FsIG11c3QgYmUgY2FsbGVkIGluIHNldHVwXCIpO1xuXHRpZiAoIWxvY2FsUHJvdmlkZWRTdGF0ZU1hcC5oYXMob3duZXIpKSBsb2NhbFByb3ZpZGVkU3RhdGVNYXAuc2V0KG93bmVyLCBPYmplY3QuY3JlYXRlKG51bGwpKTtcblx0Y29uc3QgbG9jYWxQcm92aWRlZFN0YXRlID0gbG9jYWxQcm92aWRlZFN0YXRlTWFwLmdldChvd25lcik7XG5cdGxvY2FsUHJvdmlkZWRTdGF0ZVtrZXldID0gdmFsdWU7XG5cdHJldHVybiBwcm92aWRlKGtleSwgdmFsdWUpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVJbmplY3Rpb25TdGF0ZS9pbmRleC50c1xuLyoqXG4qIENyZWF0ZSBnbG9iYWwgc3RhdGUgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgaW50byBjb21wb25lbnRzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9jcmVhdGVJbmplY3Rpb25TdGF0ZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZUluamVjdGlvblN0YXRlKGNvbXBvc2FibGUsIG9wdGlvbnMpIHtcblx0Y29uc3Qga2V5ID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbmplY3Rpb25LZXkpIHx8IFN5bWJvbChjb21wb3NhYmxlLm5hbWUgfHwgXCJJbmplY3Rpb25TdGF0ZVwiKTtcblx0Y29uc3QgZGVmYXVsdFZhbHVlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcblx0Y29uc3QgdXNlUHJvdmlkaW5nU3RhdGUgPSAoLi4uYXJncykgPT4ge1xuXHRcdGNvbnN0IHN0YXRlID0gY29tcG9zYWJsZSguLi5hcmdzKTtcblx0XHRwcm92aWRlTG9jYWwoa2V5LCBzdGF0ZSk7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9O1xuXHRjb25zdCB1c2VJbmplY3RlZFN0YXRlID0gKCkgPT4gaW5qZWN0TG9jYWwoa2V5LCBkZWZhdWx0VmFsdWUpO1xuXHRyZXR1cm4gW3VzZVByb3ZpZGluZ1N0YXRlLCB1c2VJbmplY3RlZFN0YXRlXTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlUmVmL2luZGV4LnRzXG4vKipcbiogUmV0dXJucyBhIGBkZWVwUmVmYCBvciBgc2hhbGxvd1JlZmAgZGVwZW5kaW5nIG9uIHRoZSBgZGVlcGAgcGFyYW0uXG4qXG4qIEBleGFtcGxlIGNyZWF0ZVJlZigxKSAvLyBTaGFsbG93UmVmPG51bWJlcj5cbiogQGV4YW1wbGUgY3JlYXRlUmVmKDEsIGZhbHNlKSAvLyBTaGFsbG93UmVmPG51bWJlcj5cbiogQGV4YW1wbGUgY3JlYXRlUmVmKDEsIHRydWUpIC8vIFJlZjxudW1iZXI+XG4qIEBleGFtcGxlIGNyZWF0ZVJlZihcInN0cmluZ1wiKSAvLyBTaGFsbG93UmVmPHN0cmluZz5cbiogQGV4YW1wbGUgY3JlYXRlUmVmPFwiQVwifFwiQlwiPihcIkFcIiwgdHJ1ZSkgLy8gUmVmPFwiQVwifFwiQlwiPlxuKlxuKiBAcGFyYW0gdmFsdWVcbiogQHBhcmFtIGRlZXBcbiogQHJldHVybnMgdGhlIGBkZWVwUmVmYCBvciBgc2hhbGxvd1JlZmBcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVSZWYodmFsdWUsIGRlZXApIHtcblx0aWYgKGRlZXAgPT09IHRydWUpIHJldHVybiByZWYodmFsdWUpO1xuXHRlbHNlIHJldHVybiBzaGFsbG93UmVmKHZhbHVlKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXRpbHMvaXMudHNcbmNvbnN0IGlzQ2xpZW50ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCI7XG5jb25zdCBpc1dvcmtlciA9IHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWxUaGlzIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7XG5jb25zdCBpc0RlZiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgIT09IFwidW5kZWZpbmVkXCI7XG5jb25zdCBub3ROdWxsaXNoID0gKHZhbCkgPT4gdmFsICE9IG51bGw7XG5jb25zdCBhc3NlcnQgPSAoY29uZGl0aW9uLCAuLi5pbmZvcykgPT4ge1xuXHRpZiAoIWNvbmRpdGlvbikgY29uc29sZS53YXJuKC4uLmluZm9zKTtcbn07XG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCBpc09iamVjdCA9ICh2YWwpID0+IHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbmNvbnN0IG5vdyA9ICgpID0+IERhdGUubm93KCk7XG5jb25zdCB0aW1lc3RhbXAgPSAoKSA9PiArRGF0ZS5ub3coKTtcbmNvbnN0IGNsYW1wID0gKG4sIG1pbiwgbWF4KSA9PiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuY29uc3QgcmFuZCA9IChtaW4sIG1heCkgPT4ge1xuXHRtaW4gPSBNYXRoLmNlaWwobWluKTtcblx0bWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuXHRyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcbn07XG5jb25zdCBoYXNPd24gPSAodmFsLCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGtleSk7XG5jb25zdCBpc0lPUyA9IC8qIEBfX1BVUkVfXyAqLyBnZXRJc0lPUygpO1xuZnVuY3Rpb24gZ2V0SXNJT1MoKSB7XG5cdHZhciBfd2luZG93LCBfd2luZG93MiwgX3dpbmRvdzM7XG5cdHJldHVybiBpc0NsaWVudCAmJiAhISgoX3dpbmRvdyA9IHdpbmRvdykgPT09IG51bGwgfHwgX3dpbmRvdyA9PT0gdm9pZCAwIHx8IChfd2luZG93ID0gX3dpbmRvdy5uYXZpZ2F0b3IpID09PSBudWxsIHx8IF93aW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3cudXNlckFnZW50KSAmJiAoL2lQKD86YWR8aG9uZXxvZCkvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpIHx8ICgoX3dpbmRvdzIgPSB3aW5kb3cpID09PSBudWxsIHx8IF93aW5kb3cyID09PSB2b2lkIDAgfHwgKF93aW5kb3cyID0gX3dpbmRvdzIubmF2aWdhdG9yKSA9PT0gbnVsbCB8fCBfd2luZG93MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdzIubWF4VG91Y2hQb2ludHMpID4gMiAmJiAvaVBhZHxNYWNpbnRvc2gvLnRlc3QoKF93aW5kb3czID0gd2luZG93KSA9PT0gbnVsbCB8fCBfd2luZG93MyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdzMubmF2aWdhdG9yLnVzZXJBZ2VudCkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0b1JlZi9pbmRleC50c1xuZnVuY3Rpb24gdG9SZWYoLi4uYXJncykge1xuXHRpZiAoYXJncy5sZW5ndGggIT09IDEpIHJldHVybiB0b1JlZiQxKC4uLmFyZ3MpO1xuXHRjb25zdCByID0gYXJnc1swXTtcblx0cmV0dXJuIHR5cGVvZiByID09PSBcImZ1bmN0aW9uXCIgPyByZWFkb25seShjdXN0b21SZWYoKCkgPT4gKHtcblx0XHRnZXQ6IHIsXG5cdFx0c2V0OiBub29wXG5cdH0pKSkgOiByZWYocik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL2ZpbHRlcnMudHNcbi8qKlxuKiBAaW50ZXJuYWxcbiovXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJXcmFwcGVyKGZpbHRlciwgZm4pIHtcblx0ZnVuY3Rpb24gd3JhcHBlciguLi5hcmdzKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFByb21pc2UucmVzb2x2ZShmaWx0ZXIoKCkgPT4gZm4uYXBwbHkodGhpcywgYXJncyksIHtcblx0XHRcdFx0Zm4sXG5cdFx0XHRcdHRoaXNBcmc6IHRoaXMsXG5cdFx0XHRcdGFyZ3Ncblx0XHRcdH0pKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHdyYXBwZXI7XG59XG5jb25zdCBieXBhc3NGaWx0ZXIgPSAoaW52b2tlJDEpID0+IHtcblx0cmV0dXJuIGludm9rZSQxKCk7XG59O1xuLyoqXG4qIENyZWF0ZSBhbiBFdmVudEZpbHRlciB0aGF0IGRlYm91bmNlIHRoZSBldmVudHNcbiovXG5mdW5jdGlvbiBkZWJvdW5jZUZpbHRlcihtcywgb3B0aW9ucyA9IHt9KSB7XG5cdGxldCB0aW1lcjtcblx0bGV0IG1heFRpbWVyO1xuXHRsZXQgbGFzdFJlamVjdG9yID0gbm9vcDtcblx0Y29uc3QgX2NsZWFyVGltZW91dCA9ICh0aW1lciQxKSA9PiB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVyJDEpO1xuXHRcdGxhc3RSZWplY3RvcigpO1xuXHRcdGxhc3RSZWplY3RvciA9IG5vb3A7XG5cdH07XG5cdGxldCBsYXN0SW52b2tlcjtcblx0Y29uc3QgZmlsdGVyID0gKGludm9rZSQxKSA9PiB7XG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0b1ZhbHVlKG1zKTtcblx0XHRjb25zdCBtYXhEdXJhdGlvbiA9IHRvVmFsdWUob3B0aW9ucy5tYXhXYWl0KTtcblx0XHRpZiAodGltZXIpIF9jbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdGlmIChkdXJhdGlvbiA8PSAwIHx8IG1heER1cmF0aW9uICE9PSB2b2lkIDAgJiYgbWF4RHVyYXRpb24gPD0gMCkge1xuXHRcdFx0aWYgKG1heFRpbWVyKSB7XG5cdFx0XHRcdF9jbGVhclRpbWVvdXQobWF4VGltZXIpO1xuXHRcdFx0XHRtYXhUaW1lciA9IHZvaWQgMDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoaW52b2tlJDEoKSk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRsYXN0UmVqZWN0b3IgPSBvcHRpb25zLnJlamVjdE9uQ2FuY2VsID8gcmVqZWN0IDogcmVzb2x2ZTtcblx0XHRcdGxhc3RJbnZva2VyID0gaW52b2tlJDE7XG5cdFx0XHRpZiAobWF4RHVyYXRpb24gJiYgIW1heFRpbWVyKSBtYXhUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAodGltZXIpIF9jbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0XHRtYXhUaW1lciA9IHZvaWQgMDtcblx0XHRcdFx0cmVzb2x2ZShsYXN0SW52b2tlcigpKTtcblx0XHRcdH0sIG1heER1cmF0aW9uKTtcblx0XHRcdHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmIChtYXhUaW1lcikgX2NsZWFyVGltZW91dChtYXhUaW1lcik7XG5cdFx0XHRcdG1heFRpbWVyID0gdm9pZCAwO1xuXHRcdFx0XHRyZXNvbHZlKGludm9rZSQxKCkpO1xuXHRcdFx0fSwgZHVyYXRpb24pO1xuXHRcdH0pO1xuXHR9O1xuXHRyZXR1cm4gZmlsdGVyO1xufVxuZnVuY3Rpb24gdGhyb3R0bGVGaWx0ZXIoLi4uYXJncykge1xuXHRsZXQgbGFzdEV4ZWMgPSAwO1xuXHRsZXQgdGltZXI7XG5cdGxldCBpc0xlYWRpbmcgPSB0cnVlO1xuXHRsZXQgbGFzdFJlamVjdG9yID0gbm9vcDtcblx0bGV0IGxhc3RWYWx1ZTtcblx0bGV0IG1zO1xuXHRsZXQgdHJhaWxpbmc7XG5cdGxldCBsZWFkaW5nO1xuXHRsZXQgcmVqZWN0T25DYW5jZWw7XG5cdGlmICghaXNSZWYoYXJnc1swXSkgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwib2JqZWN0XCIpICh7ZGVsYXk6IG1zLCB0cmFpbGluZyA9IHRydWUsIGxlYWRpbmcgPSB0cnVlLCByZWplY3RPbkNhbmNlbCA9IGZhbHNlfSA9IGFyZ3NbMF0pO1xuXHRlbHNlIFttcywgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSwgcmVqZWN0T25DYW5jZWwgPSBmYWxzZV0gPSBhcmdzO1xuXHRjb25zdCBjbGVhciA9ICgpID0+IHtcblx0XHRpZiAodGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHR0aW1lciA9IHZvaWQgMDtcblx0XHRcdGxhc3RSZWplY3RvcigpO1xuXHRcdFx0bGFzdFJlamVjdG9yID0gbm9vcDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGZpbHRlciA9IChfaW52b2tlKSA9PiB7XG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0b1ZhbHVlKG1zKTtcblx0XHRjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIGxhc3RFeGVjO1xuXHRcdGNvbnN0IGludm9rZSQxID0gKCkgPT4ge1xuXHRcdFx0cmV0dXJuIGxhc3RWYWx1ZSA9IF9pbnZva2UoKTtcblx0XHR9O1xuXHRcdGNsZWFyKCk7XG5cdFx0aWYgKGR1cmF0aW9uIDw9IDApIHtcblx0XHRcdGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcblx0XHRcdHJldHVybiBpbnZva2UkMSgpO1xuXHRcdH1cblx0XHRpZiAoZWxhcHNlZCA+IGR1cmF0aW9uKSB7XG5cdFx0XHRsYXN0RXhlYyA9IERhdGUubm93KCk7XG5cdFx0XHRpZiAobGVhZGluZyB8fCAhaXNMZWFkaW5nKSBpbnZva2UkMSgpO1xuXHRcdH0gZWxzZSBpZiAodHJhaWxpbmcpIGxhc3RWYWx1ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGxhc3RSZWplY3RvciA9IHJlamVjdE9uQ2FuY2VsID8gcmVqZWN0IDogcmVzb2x2ZTtcblx0XHRcdHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcblx0XHRcdFx0aXNMZWFkaW5nID0gdHJ1ZTtcblx0XHRcdFx0cmVzb2x2ZShpbnZva2UkMSgpKTtcblx0XHRcdFx0Y2xlYXIoKTtcblx0XHRcdH0sIE1hdGgubWF4KDAsIGR1cmF0aW9uIC0gZWxhcHNlZCkpO1xuXHRcdH0pO1xuXHRcdGlmICghbGVhZGluZyAmJiAhdGltZXIpIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBpc0xlYWRpbmcgPSB0cnVlLCBkdXJhdGlvbik7XG5cdFx0aXNMZWFkaW5nID0gZmFsc2U7XG5cdFx0cmV0dXJuIGxhc3RWYWx1ZTtcblx0fTtcblx0cmV0dXJuIGZpbHRlcjtcbn1cbi8qKlxuKiBFdmVudEZpbHRlciB0aGF0IGdpdmVzIGV4dHJhIGNvbnRyb2xzIHRvIHBhdXNlIGFuZCByZXN1bWUgdGhlIGZpbHRlclxuKlxuKiBAcGFyYW0gZXh0ZW5kRmlsdGVyICBFeHRyYSBmaWx0ZXIgdG8gYXBwbHkgd2hlbiB0aGUgUGF1c2FibGVGaWx0ZXIgaXMgYWN0aXZlLCBkZWZhdWx0IHRvIG5vbmVcbiogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGZpbHRlclxuKi9cbmZ1bmN0aW9uIHBhdXNhYmxlRmlsdGVyKGV4dGVuZEZpbHRlciA9IGJ5cGFzc0ZpbHRlciwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFN0YXRlID0gXCJhY3RpdmVcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNBY3RpdmUgPSB0b1JlZihpbml0aWFsU3RhdGUgPT09IFwiYWN0aXZlXCIpO1xuXHRmdW5jdGlvbiBwYXVzZSgpIHtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGZ1bmN0aW9uIHJlc3VtZSgpIHtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG5cdH1cblx0Y29uc3QgZXZlbnRGaWx0ZXIgPSAoLi4uYXJncykgPT4ge1xuXHRcdGlmIChpc0FjdGl2ZS52YWx1ZSkgZXh0ZW5kRmlsdGVyKC4uLmFyZ3MpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdGlzQWN0aXZlOiByZWFkb25seShpc0FjdGl2ZSksXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGV2ZW50RmlsdGVyXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL2dlbmVyYWwudHNcbmZ1bmN0aW9uIHByb21pc2VUaW1lb3V0KG1zLCB0aHJvd09uVGltZW91dCA9IGZhbHNlLCByZWFzb24gPSBcIlRpbWVvdXRcIikge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGlmICh0aHJvd09uVGltZW91dCkgc2V0VGltZW91dCgoKSA9PiByZWplY3QocmVhc29uKSwgbXMpO1xuXHRcdGVsc2Ugc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG5cdH0pO1xufVxuZnVuY3Rpb24gaWRlbnRpdHkoYXJnKSB7XG5cdHJldHVybiBhcmc7XG59XG4vKipcbiogQ3JlYXRlIHNpbmdsZXRvbiBwcm9taXNlIGZ1bmN0aW9uXG4qXG4qIEBleGFtcGxlXG4qIGBgYFxuKiBjb25zdCBwcm9taXNlID0gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShhc3luYyAoKSA9PiB7IC4uLiB9KVxuKlxuKiBhd2FpdCBwcm9taXNlKClcbiogYXdhaXQgcHJvbWlzZSgpIC8vIGFsbCBvZiB0aGVtIHdpbGwgYmUgYmluZCB0byBhIHNpbmdsZSBwcm9taXNlIGluc3RhbmNlXG4qIGF3YWl0IHByb21pc2UoKSAvLyBhbmQgYmUgcmVzb2x2ZWQgdG9nZXRoZXJcbiogYGBgXG4qL1xuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShmbikge1xuXHRsZXQgX3Byb21pc2U7XG5cdGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG5cdFx0aWYgKCFfcHJvbWlzZSkgX3Byb21pc2UgPSBmbigpO1xuXHRcdHJldHVybiBfcHJvbWlzZTtcblx0fVxuXHR3cmFwcGVyLnJlc2V0ID0gYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IF9wcmV2ID0gX3Byb21pc2U7XG5cdFx0X3Byb21pc2UgPSB2b2lkIDA7XG5cdFx0aWYgKF9wcmV2KSBhd2FpdCBfcHJldjtcblx0fTtcblx0cmV0dXJuIHdyYXBwZXI7XG59XG5mdW5jdGlvbiBpbnZva2UoZm4pIHtcblx0cmV0dXJuIGZuKCk7XG59XG5mdW5jdGlvbiBjb250YWluc1Byb3Aob2JqLCAuLi5wcm9wcykge1xuXHRyZXR1cm4gcHJvcHMuc29tZSgoaykgPT4gayBpbiBvYmopO1xufVxuZnVuY3Rpb24gaW5jcmVhc2VXaXRoVW5pdCh0YXJnZXQsIGRlbHRhKSB7XG5cdHZhciBfdGFyZ2V0JG1hdGNoO1xuXHRpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHRhcmdldCArIGRlbHRhO1xuXHRjb25zdCB2YWx1ZSA9ICgoX3RhcmdldCRtYXRjaCA9IHRhcmdldC5tYXRjaCgvXi0/XFxkK1xcLj9cXGQqLykpID09PSBudWxsIHx8IF90YXJnZXQkbWF0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YXJnZXQkbWF0Y2hbMF0pIHx8IFwiXCI7XG5cdGNvbnN0IHVuaXQgPSB0YXJnZXQuc2xpY2UodmFsdWUubGVuZ3RoKTtcblx0Y29uc3QgcmVzdWx0ID0gTnVtYmVyLnBhcnNlRmxvYXQodmFsdWUpICsgZGVsdGE7XG5cdGlmIChOdW1iZXIuaXNOYU4ocmVzdWx0KSkgcmV0dXJuIHRhcmdldDtcblx0cmV0dXJuIHJlc3VsdCArIHVuaXQ7XG59XG4vKipcbiogR2V0IGEgcHggdmFsdWUgZm9yIFNTUiB1c2UsIGRvIG5vdCByZWx5IG9uIHRoaXMgbWV0aG9kIG91dHNpZGUgb2YgU1NSIGFzIFJFTSB1bml0IGlzIGFzc3VtZWQgYXQgMTZweCwgd2hpY2ggbWlnaHQgbm90IGJlIHRoZSBjYXNlIG9uIHRoZSBjbGllbnRcbiovXG5mdW5jdGlvbiBweFZhbHVlKHB4KSB7XG5cdHJldHVybiBweC5lbmRzV2l0aChcInJlbVwiKSA/IE51bWJlci5wYXJzZUZsb2F0KHB4KSAqIDE2IDogTnVtYmVyLnBhcnNlRmxvYXQocHgpO1xufVxuLyoqXG4qIENyZWF0ZSBhIG5ldyBzdWJzZXQgb2JqZWN0IGJ5IGdpdmluZyBrZXlzXG4qL1xuZnVuY3Rpb24gb2JqZWN0UGljayhvYmosIGtleXMsIG9taXRVbmRlZmluZWQgPSBmYWxzZSkge1xuXHRyZXR1cm4ga2V5cy5yZWR1Y2UoKG4sIGspID0+IHtcblx0XHRpZiAoayBpbiBvYmopIHtcblx0XHRcdGlmICghb21pdFVuZGVmaW5lZCB8fCBvYmpba10gIT09IHZvaWQgMCkgbltrXSA9IG9ialtrXTtcblx0XHR9XG5cdFx0cmV0dXJuIG47XG5cdH0sIHt9KTtcbn1cbi8qKlxuKiBDcmVhdGUgYSBuZXcgc3Vic2V0IG9iamVjdCBieSBvbWl0IGdpdmluZyBrZXlzXG4qL1xuZnVuY3Rpb24gb2JqZWN0T21pdChvYmosIGtleXMsIG9taXRVbmRlZmluZWQgPSBmYWxzZSkge1xuXHRyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHtcblx0XHRyZXR1cm4gKCFvbWl0VW5kZWZpbmVkIHx8IHZhbHVlICE9PSB2b2lkIDApICYmICFrZXlzLmluY2x1ZGVzKGtleSk7XG5cdH0pKTtcbn1cbmZ1bmN0aW9uIG9iamVjdEVudHJpZXMob2JqKSB7XG5cdHJldHVybiBPYmplY3QuZW50cmllcyhvYmopO1xufVxuZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL3BvcnQudHNcbmZ1bmN0aW9uIGNhY2hlU3RyaW5nRnVuY3Rpb24oZm4pIHtcblx0Y29uc3QgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHRyZXR1cm4gKChzdHIpID0+IHtcblx0XHRyZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpO1xuXHR9KTtcbn1cbmNvbnN0IGh5cGhlbmF0ZVJFID0gL1xcQihbQS1aXSkvZztcbmNvbnN0IGh5cGhlbmF0ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsIFwiLSQxXCIpLnRvTG93ZXJDYXNlKCkpO1xuY29uc3QgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbmNvbnN0IGNhbWVsaXplID0gY2FjaGVTdHJpbmdGdW5jdGlvbigoc3RyKSA9PiB7XG5cdHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCAoXywgYykgPT4gYyA/IGMudG9VcHBlckNhc2UoKSA6IFwiXCIpO1xufSk7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL3Z1ZS50c1xuZnVuY3Rpb24gZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCkge1xuXHRyZXR1cm4gdGFyZ2V0IHx8IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVTaGFyZWRDb21wb3NhYmxlL2luZGV4LnRzXG4vKipcbiogTWFrZSBhIGNvbXBvc2FibGUgZnVuY3Rpb24gdXNhYmxlIHdpdGggbXVsdGlwbGUgVnVlIGluc3RhbmNlcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlU2hhcmVkQ29tcG9zYWJsZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVNoYXJlZENvbXBvc2FibGUoY29tcG9zYWJsZSkge1xuXHRpZiAoIWlzQ2xpZW50KSByZXR1cm4gY29tcG9zYWJsZTtcblx0bGV0IHN1YnNjcmliZXJzID0gMDtcblx0bGV0IHN0YXRlO1xuXHRsZXQgc2NvcGU7XG5cdGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XG5cdFx0c3Vic2NyaWJlcnMgLT0gMTtcblx0XHRpZiAoc2NvcGUgJiYgc3Vic2NyaWJlcnMgPD0gMCkge1xuXHRcdFx0c2NvcGUuc3RvcCgpO1xuXHRcdFx0c3RhdGUgPSB2b2lkIDA7XG5cdFx0XHRzY29wZSA9IHZvaWQgMDtcblx0XHR9XG5cdH07XG5cdHJldHVybiAoKC4uLmFyZ3MpID0+IHtcblx0XHRzdWJzY3JpYmVycyArPSAxO1xuXHRcdGlmICghc2NvcGUpIHtcblx0XHRcdHNjb3BlID0gZWZmZWN0U2NvcGUodHJ1ZSk7XG5cdFx0XHRzdGF0ZSA9IHNjb3BlLnJ1bigoKSA9PiBjb21wb3NhYmxlKC4uLmFyZ3MpKTtcblx0XHR9XG5cdFx0dHJ5T25TY29wZURpc3Bvc2UoZGlzcG9zZSk7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gZXh0ZW5kUmVmL2luZGV4LnRzXG5mdW5jdGlvbiBleHRlbmRSZWYocmVmJDEsIGV4dGVuZCwgeyBlbnVtZXJhYmxlID0gZmFsc2UsIHVud3JhcCA9IHRydWUgfSA9IHt9KSB7XG5cdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4dGVuZCkpIHtcblx0XHRpZiAoa2V5ID09PSBcInZhbHVlXCIpIGNvbnRpbnVlO1xuXHRcdGlmIChpc1JlZih2YWx1ZSkgJiYgdW53cmFwKSBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVmJDEsIGtleSwge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUudmFsdWU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0KHYpIHtcblx0XHRcdFx0dmFsdWUudmFsdWUgPSB2O1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGVcblx0XHR9KTtcblx0XHRlbHNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWYkMSwga2V5LCB7XG5cdFx0XHR2YWx1ZSxcblx0XHRcdGVudW1lcmFibGVcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gcmVmJDE7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGdldC9pbmRleC50c1xuZnVuY3Rpb24gZ2V0KG9iaiwga2V5KSB7XG5cdGlmIChrZXkgPT0gbnVsbCkgcmV0dXJuIHVucmVmKG9iaik7XG5cdHJldHVybiB1bnJlZihvYmopW2tleV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGlzRGVmaW5lZC9pbmRleC50c1xuZnVuY3Rpb24gaXNEZWZpbmVkKHYpIHtcblx0cmV0dXJuIHVucmVmKHYpICE9IG51bGw7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIG1ha2VEZXN0cnVjdHVyYWJsZS9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIG1ha2VEZXN0cnVjdHVyYWJsZShvYmosIGFycikge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdGNvbnN0IGNsb25lID0geyAuLi5vYmogfTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xvbmUsIFN5bWJvbC5pdGVyYXRvciwge1xuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHR2YWx1ZSgpIHtcblx0XHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdFx0cmV0dXJuIHsgbmV4dDogKCkgPT4gKHtcblx0XHRcdFx0XHR2YWx1ZTogYXJyW2luZGV4KytdLFxuXHRcdFx0XHRcdGRvbmU6IGluZGV4ID4gYXJyLmxlbmd0aFxuXHRcdFx0XHR9KSB9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBjbG9uZTtcblx0fSBlbHNlIHJldHVybiBPYmplY3QuYXNzaWduKFsuLi5hcnJdLCBvYmopO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGlmeS9pbmRleC50c1xuLyoqXG4qIENvbnZlcnRzIHBsYWluIGZ1bmN0aW9uIGludG8gYSByZWFjdGl2ZSBmdW5jdGlvbi5cbiogVGhlIGNvbnZlcnRlZCBmdW5jdGlvbiBhY2NlcHRzIHJlZnMgYXMgaXQncyBhcmd1bWVudHNcbiogYW5kIHJldHVybnMgYSBDb21wdXRlZFJlZiwgd2l0aCBwcm9wZXIgdHlwaW5nLlxuKlxuKiBAcGFyYW0gZm4gLSBTb3VyY2UgZnVuY3Rpb25cbiogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVhY3RpZnkoZm4sIG9wdGlvbnMpIHtcblx0Y29uc3QgdW5yZWZGbiA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY29tcHV0ZWRHZXR0ZXIpID09PSBmYWxzZSA/IHVucmVmIDogdG9WYWx1ZTtcblx0cmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0XHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gZm4uYXBwbHkodGhpcywgYXJncy5tYXAoKGkpID0+IHVucmVmRm4oaSkpKSk7XG5cdH07XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWFjdGlmeWAgaW5zdGVhZCAqL1xuY29uc3QgY3JlYXRlUmVhY3RpdmVGbiA9IHJlYWN0aWZ5O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGlmeU9iamVjdC9pbmRleC50c1xuLyoqXG4qIEFwcGx5IGByZWFjdGlmeWAgdG8gYW4gb2JqZWN0XG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVhY3RpZnlPYmplY3Qob2JqLCBvcHRpb25zT3JLZXlzID0ge30pIHtcblx0bGV0IGtleXMgPSBbXTtcblx0bGV0IG9wdGlvbnM7XG5cdGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnNPcktleXMpKSBrZXlzID0gb3B0aW9uc09yS2V5cztcblx0ZWxzZSB7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnNPcktleXM7XG5cdFx0Y29uc3QgeyBpbmNsdWRlT3duUHJvcGVydGllcyA9IHRydWUgfSA9IG9wdGlvbnNPcktleXM7XG5cdFx0a2V5cy5wdXNoKC4uLk9iamVjdC5rZXlzKG9iaikpO1xuXHRcdGlmIChpbmNsdWRlT3duUHJvcGVydGllcykga2V5cy5wdXNoKC4uLk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikpO1xuXHR9XG5cdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoa2V5cy5tYXAoKGtleSkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG5cdFx0cmV0dXJuIFtrZXksIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVhY3RpZnkodmFsdWUuYmluZChvYmopLCBvcHRpb25zKSA6IHZhbHVlXTtcblx0fSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0b1JlYWN0aXZlL2luZGV4LnRzXG4vKipcbiogQ29udmVydHMgcmVmIHRvIHJlYWN0aXZlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy90b1JlYWN0aXZlXG4qIEBwYXJhbSBvYmplY3RSZWYgQSByZWYgb2Ygb2JqZWN0XG4qL1xuZnVuY3Rpb24gdG9SZWFjdGl2ZShvYmplY3RSZWYpIHtcblx0aWYgKCFpc1JlZihvYmplY3RSZWYpKSByZXR1cm4gcmVhY3RpdmUob2JqZWN0UmVmKTtcblx0cmV0dXJuIHJlYWN0aXZlKG5ldyBQcm94eSh7fSwge1xuXHRcdGdldChfLCBwLCByZWNlaXZlcikge1xuXHRcdFx0cmV0dXJuIHVucmVmKFJlZmxlY3QuZ2V0KG9iamVjdFJlZi52YWx1ZSwgcCwgcmVjZWl2ZXIpKTtcblx0XHR9LFxuXHRcdHNldChfLCBwLCB2YWx1ZSkge1xuXHRcdFx0aWYgKGlzUmVmKG9iamVjdFJlZi52YWx1ZVtwXSkgJiYgIWlzUmVmKHZhbHVlKSkgb2JqZWN0UmVmLnZhbHVlW3BdLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRlbHNlIG9iamVjdFJlZi52YWx1ZVtwXSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblx0XHRkZWxldGVQcm9wZXJ0eShfLCBwKSB7XG5cdFx0XHRyZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShvYmplY3RSZWYudmFsdWUsIHApO1xuXHRcdH0sXG5cdFx0aGFzKF8sIHApIHtcblx0XHRcdHJldHVybiBSZWZsZWN0LmhhcyhvYmplY3RSZWYudmFsdWUsIHApO1xuXHRcdH0sXG5cdFx0b3duS2V5cygpIHtcblx0XHRcdHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RSZWYudmFsdWUpO1xuXHRcdH0sXG5cdFx0Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH1cblx0fSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGl2ZUNvbXB1dGVkL2luZGV4LnRzXG4vKipcbiogQ29tcHV0ZWQgcmVhY3RpdmUgb2JqZWN0LlxuKi9cbmZ1bmN0aW9uIHJlYWN0aXZlQ29tcHV0ZWQoZm4pIHtcblx0cmV0dXJuIHRvUmVhY3RpdmUoY29tcHV0ZWQoZm4pKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpdmVPbWl0L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBvbWl0IGZpZWxkcyBmcm9tIGEgcmVhY3RpdmUgb2JqZWN0XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3JlYWN0aXZlT21pdFxuKi9cbmZ1bmN0aW9uIHJlYWN0aXZlT21pdChvYmosIC4uLmtleXMpIHtcblx0Y29uc3QgZmxhdEtleXMgPSBrZXlzLmZsYXQoKTtcblx0Y29uc3QgcHJlZGljYXRlID0gZmxhdEtleXNbMF07XG5cdHJldHVybiByZWFjdGl2ZUNvbXB1dGVkKCgpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09IFwiZnVuY3Rpb25cIiA/IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0b1JlZnMkMShvYmopKS5maWx0ZXIoKFtrLCB2XSkgPT4gIXByZWRpY2F0ZSh0b1ZhbHVlKHYpLCBrKSkpIDogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRvUmVmcyQxKG9iaikpLmZpbHRlcigoZSkgPT4gIWZsYXRLZXlzLmluY2x1ZGVzKGVbMF0pKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGl2ZVBpY2svaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IHBpY2sgZmllbGRzIGZyb20gYSByZWFjdGl2ZSBvYmplY3RcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvcmVhY3RpdmVQaWNrXG4qL1xuZnVuY3Rpb24gcmVhY3RpdmVQaWNrKG9iaiwgLi4ua2V5cykge1xuXHRjb25zdCBmbGF0S2V5cyA9IGtleXMuZmxhdCgpO1xuXHRjb25zdCBwcmVkaWNhdGUgPSBmbGF0S2V5c1swXTtcblx0cmV0dXJuIHJlYWN0aXZlQ29tcHV0ZWQoKCkgPT4gdHlwZW9mIHByZWRpY2F0ZSA9PT0gXCJmdW5jdGlvblwiID8gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRvUmVmcyQxKG9iaikpLmZpbHRlcigoW2ssIHZdKSA9PiBwcmVkaWNhdGUodG9WYWx1ZSh2KSwgaykpKSA6IE9iamVjdC5mcm9tRW50cmllcyhmbGF0S2V5cy5tYXAoKGspID0+IFtrLCB0b1JlZihvYmosIGspXSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVmQXV0b1Jlc2V0L2luZGV4LnRzXG4vKipcbiogQ3JlYXRlIGEgcmVmIHdoaWNoIHdpbGwgYmUgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgYWZ0ZXIgc29tZSB0aW1lLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9yZWZBdXRvUmVzZXRcbiogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgd2hpY2ggd2lsbCBiZSBzZXQuXG4qIEBwYXJhbSBhZnRlck1zICAgICAgQSB6ZXJvLW9yLWdyZWF0ZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuKi9cbmZ1bmN0aW9uIHJlZkF1dG9SZXNldChkZWZhdWx0VmFsdWUsIGFmdGVyTXMgPSAxZTQpIHtcblx0cmV0dXJuIGN1c3RvbVJlZigodHJhY2ssIHRyaWdnZXIpID0+IHtcblx0XHRsZXQgdmFsdWUgPSB0b1ZhbHVlKGRlZmF1bHRWYWx1ZSk7XG5cdFx0bGV0IHRpbWVyO1xuXHRcdGNvbnN0IHJlc2V0QWZ0ZXIgPSAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHZhbHVlID0gdG9WYWx1ZShkZWZhdWx0VmFsdWUpO1xuXHRcdFx0dHJpZ2dlcigpO1xuXHRcdH0sIHRvVmFsdWUoYWZ0ZXJNcykpO1xuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0dHJhY2soKTtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldChuZXdWYWx1ZSkge1xuXHRcdFx0XHR2YWx1ZSA9IG5ld1ZhbHVlO1xuXHRcdFx0XHR0cmlnZ2VyKCk7XG5cdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHRcdHRpbWVyID0gcmVzZXRBZnRlcigpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmQXV0b1Jlc2V0YCBpbnN0ZWFkICovXG5jb25zdCBhdXRvUmVzZXRSZWYgPSByZWZBdXRvUmVzZXQ7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURlYm91bmNlRm4vaW5kZXgudHNcbi8qKlxuKiBEZWJvdW5jZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGVib3VuY2VGblxuKiBAcGFyYW0gIGZuICAgICAgICAgIEEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZGVsYXkgbWlsbGlzZWNvbmRzIGRlYm91bmNlZC5cbiogQHBhcmFtICBtcyAgICAgICAgICBBIHplcm8tb3ItZ3JlYXRlciBkZWxheSBpbiBtaWxsaXNlY29uZHMuIEZvciBldmVudCBjYWxsYmFja3MsIHZhbHVlcyBhcm91bmQgMTAwIG9yIDI1MCAob3IgZXZlbiBoaWdoZXIpIGFyZSBtb3N0IHVzZWZ1bC5cbiogQHBhcmFtICBvcHRpb25zICAgICBPcHRpb25zXG4qXG4qIEByZXR1cm4gQSBuZXcsIGRlYm91bmNlLCBmdW5jdGlvbi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEZWJvdW5jZUZuKGZuLCBtcyA9IDIwMCwgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBjcmVhdGVGaWx0ZXJXcmFwcGVyKGRlYm91bmNlRmlsdGVyKG1zLCBvcHRpb25zKSwgZm4pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZEZWJvdW5jZWQvaW5kZXgudHNcbi8qKlxuKiBEZWJvdW5jZSB1cGRhdGVzIG9mIGEgcmVmLlxuKlxuKiBAcmV0dXJuIEEgbmV3IGRlYm91bmNlZCByZWYuXG4qL1xuZnVuY3Rpb24gcmVmRGVib3VuY2VkKHZhbHVlLCBtcyA9IDIwMCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGRlYm91bmNlZCA9IHJlZih0b1ZhbHVlKHZhbHVlKSk7XG5cdGNvbnN0IHVwZGF0ZXIgPSB1c2VEZWJvdW5jZUZuKCgpID0+IHtcblx0XHRkZWJvdW5jZWQudmFsdWUgPSB2YWx1ZS52YWx1ZTtcblx0fSwgbXMsIG9wdGlvbnMpO1xuXHR3YXRjaCh2YWx1ZSwgKCkgPT4gdXBkYXRlcigpKTtcblx0cmV0dXJuIHNoYWxsb3dSZWFkb25seShkZWJvdW5jZWQpO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmRGVib3VuY2VkYCBpbnN0ZWFkICovXG5jb25zdCBkZWJvdW5jZWRSZWYgPSByZWZEZWJvdW5jZWQ7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWZEZWJvdW5jZWRgIGluc3RlYWQgKi9cbmNvbnN0IHVzZURlYm91bmNlID0gcmVmRGVib3VuY2VkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZEZWZhdWx0L2luZGV4LnRzXG4vKipcbiogQXBwbHkgZGVmYXVsdCB2YWx1ZSB0byBhIHJlZi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiByZWZEZWZhdWx0KHNvdXJjZSwgZGVmYXVsdFZhbHVlKSB7XG5cdHJldHVybiBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0dmFyIF9zb3VyY2UkdmFsdWU7XG5cdFx0XHRyZXR1cm4gKF9zb3VyY2UkdmFsdWUgPSBzb3VyY2UudmFsdWUpICE9PSBudWxsICYmIF9zb3VyY2UkdmFsdWUgIT09IHZvaWQgMCA/IF9zb3VyY2UkdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHNvdXJjZS52YWx1ZSA9IHZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHJlZk1hbnVhbFJlc2V0L2luZGV4LnRzXG4vKipcbiogQ3JlYXRlIGEgcmVmIHdpdGggbWFudWFsIHJlc2V0IGZ1bmN0aW9uYWxpdHkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3JlZk1hbnVhbFJlc2V0XG4qIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHdoaWNoIHdpbGwgYmUgc2V0LlxuKi9cbmZ1bmN0aW9uIHJlZk1hbnVhbFJlc2V0KGRlZmF1bHRWYWx1ZSkge1xuXHRsZXQgdmFsdWUgPSB0b1ZhbHVlKGRlZmF1bHRWYWx1ZSk7XG5cdGxldCB0cmlnZ2VyO1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHR2YWx1ZSA9IHRvVmFsdWUoZGVmYXVsdFZhbHVlKTtcblx0XHR0cmlnZ2VyKCk7XG5cdH07XG5cdGNvbnN0IHJlZlZhbHVlID0gY3VzdG9tUmVmKCh0cmFjaywgX3RyaWdnZXIpID0+IHtcblx0XHR0cmlnZ2VyID0gX3RyaWdnZXI7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0dHJhY2soKTtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldChuZXdWYWx1ZSkge1xuXHRcdFx0XHR2YWx1ZSA9IG5ld1ZhbHVlO1xuXHRcdFx0XHR0cmlnZ2VyKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSk7XG5cdHJlZlZhbHVlLnJlc2V0ID0gcmVzZXQ7XG5cdHJldHVybiByZWZWYWx1ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGhyb3R0bGVGbi9pbmRleC50c1xuLyoqXG4qIFRocm90dGxlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgcmF0ZSBsaW1pdGluZ1xuKiBleGVjdXRpb24gb2YgaGFuZGxlcnMgb24gZXZlbnRzIGxpa2UgcmVzaXplIGFuZCBzY3JvbGwuXG4qXG4qIEBwYXJhbSAgIGZuICAgICAgICAgICAgIEEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZGVsYXkgbWlsbGlzZWNvbmRzLiBUaGUgYHRoaXNgIGNvbnRleHQgYW5kIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoLCBhcy1pcyxcbiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBgY2FsbGJhY2tgIHdoZW4gdGhlIHRocm90dGxlZC1mdW5jdGlvbiBpcyBleGVjdXRlZC5cbiogQHBhcmFtICAgbXMgICAgICAgICAgICAgQSB6ZXJvLW9yLWdyZWF0ZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBGb3IgZXZlbnQgY2FsbGJhY2tzLCB2YWx1ZXMgYXJvdW5kIDEwMCBvciAyNTAgKG9yIGV2ZW4gaGlnaGVyKSBhcmUgbW9zdCB1c2VmdWwuXG4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgdmFsdWU6IDIwMClcbipcbiogQHBhcmFtIFt0cmFpbGluZ10gaWYgdHJ1ZSwgY2FsbCBmbiBhZ2FpbiBhZnRlciB0aGUgdGltZSBpcyB1cCAoZGVmYXVsdCB2YWx1ZTogZmFsc2UpXG4qXG4qIEBwYXJhbSBbbGVhZGluZ10gaWYgdHJ1ZSwgY2FsbCBmbiBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBtcyB0aW1lb3V0IChkZWZhdWx0IHZhbHVlOiB0cnVlKVxuKlxuKiBAcGFyYW0gW3JlamVjdE9uQ2FuY2VsXSBpZiB0cnVlLCByZWplY3QgdGhlIGxhc3QgY2FsbCBpZiBpdCdzIGJlZW4gY2FuY2VsIChkZWZhdWx0IHZhbHVlOiBmYWxzZSlcbipcbiogQHJldHVybiAgQSBuZXcsIHRocm90dGxlZCwgZnVuY3Rpb24uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVGhyb3R0bGVGbihmbiwgbXMgPSAyMDAsIHRyYWlsaW5nID0gZmFsc2UsIGxlYWRpbmcgPSB0cnVlLCByZWplY3RPbkNhbmNlbCA9IGZhbHNlKSB7XG5cdHJldHVybiBjcmVhdGVGaWx0ZXJXcmFwcGVyKHRocm90dGxlRmlsdGVyKG1zLCB0cmFpbGluZywgbGVhZGluZywgcmVqZWN0T25DYW5jZWwpLCBmbik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHJlZlRocm90dGxlZC9pbmRleC50c1xuLyoqXG4qIFRocm90dGxlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgcmF0ZSBsaW1pdGluZ1xuKiBleGVjdXRpb24gb2YgaGFuZGxlcnMgb24gZXZlbnRzIGxpa2UgcmVzaXplIGFuZCBzY3JvbGwuXG4qXG4qIEBwYXJhbSB2YWx1ZSBSZWYgdmFsdWUgdG8gYmUgd2F0Y2hlZCB3aXRoIHRocm90dGxlIGVmZmVjdFxuKiBAcGFyYW0gIGRlbGF5ICBBIHplcm8tb3ItZ3JlYXRlciBkZWxheSBpbiBtaWxsaXNlY29uZHMuIEZvciBldmVudCBjYWxsYmFja3MsIHZhbHVlcyBhcm91bmQgMTAwIG9yIDI1MCAob3IgZXZlbiBoaWdoZXIpIGFyZSBtb3N0IHVzZWZ1bC5cbiogQHBhcmFtIHRyYWlsaW5nIGlmIHRydWUsIHVwZGF0ZSB0aGUgdmFsdWUgYWdhaW4gYWZ0ZXIgdGhlIGRlbGF5IHRpbWUgaXMgdXBcbiogQHBhcmFtIGxlYWRpbmcgaWYgdHJ1ZSwgdXBkYXRlIHRoZSB2YWx1ZSBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBtcyB0aW1lb3V0XG4qL1xuZnVuY3Rpb24gcmVmVGhyb3R0bGVkKHZhbHVlLCBkZWxheSA9IDIwMCwgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSkge1xuXHRpZiAoZGVsYXkgPD0gMCkgcmV0dXJuIHZhbHVlO1xuXHRjb25zdCB0aHJvdHRsZWQgPSByZWYodG9WYWx1ZSh2YWx1ZSkpO1xuXHRjb25zdCB1cGRhdGVyID0gdXNlVGhyb3R0bGVGbigoKSA9PiB7XG5cdFx0dGhyb3R0bGVkLnZhbHVlID0gdmFsdWUudmFsdWU7XG5cdH0sIGRlbGF5LCB0cmFpbGluZywgbGVhZGluZyk7XG5cdHdhdGNoKHZhbHVlLCAoKSA9PiB1cGRhdGVyKCkpO1xuXHRyZXR1cm4gdGhyb3R0bGVkO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmVGhyb3R0bGVkYCBpbnN0ZWFkICovXG5jb25zdCB0aHJvdHRsZWRSZWYgPSByZWZUaHJvdHRsZWQ7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWZUaHJvdHRsZWRgIGluc3RlYWQgKi9cbmNvbnN0IHVzZVRocm90dGxlID0gcmVmVGhyb3R0bGVkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZXaXRoQ29udHJvbC9pbmRleC50c1xuLyoqXG4qIEZpbmUtZ3JhaW5lZCBjb250cm9scyBvdmVyIHJlZiBhbmQgaXRzIHJlYWN0aXZpdHkuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVmV2l0aENvbnRyb2woaW5pdGlhbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGxldCBzb3VyY2UgPSBpbml0aWFsO1xuXHRsZXQgdHJhY2s7XG5cdGxldCB0cmlnZ2VyO1xuXHRjb25zdCByZWYkMSA9IGN1c3RvbVJlZigoX3RyYWNrLCBfdHJpZ2dlcikgPT4ge1xuXHRcdHRyYWNrID0gX3RyYWNrO1xuXHRcdHRyaWdnZXIgPSBfdHJpZ2dlcjtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRyZXR1cm4gZ2V0JDEoKTtcblx0XHRcdH0sXG5cdFx0XHRzZXQodikge1xuXHRcdFx0XHRzZXQkMSh2KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9KTtcblx0ZnVuY3Rpb24gZ2V0JDEodHJhY2tpbmcgPSB0cnVlKSB7XG5cdFx0aWYgKHRyYWNraW5nKSB0cmFjaygpO1xuXHRcdHJldHVybiBzb3VyY2U7XG5cdH1cblx0ZnVuY3Rpb24gc2V0JDEodmFsdWUsIHRyaWdnZXJpbmcgPSB0cnVlKSB7XG5cdFx0dmFyIF9vcHRpb25zJG9uQmVmb3JlQ2hhbiwgX29wdGlvbnMkb25DaGFuZ2VkO1xuXHRcdGlmICh2YWx1ZSA9PT0gc291cmNlKSByZXR1cm47XG5cdFx0Y29uc3Qgb2xkID0gc291cmNlO1xuXHRcdGlmICgoKF9vcHRpb25zJG9uQmVmb3JlQ2hhbiA9IG9wdGlvbnMub25CZWZvcmVDaGFuZ2UpID09PSBudWxsIHx8IF9vcHRpb25zJG9uQmVmb3JlQ2hhbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkb25CZWZvcmVDaGFuLmNhbGwob3B0aW9ucywgdmFsdWUsIG9sZCkpID09PSBmYWxzZSkgcmV0dXJuO1xuXHRcdHNvdXJjZSA9IHZhbHVlO1xuXHRcdChfb3B0aW9ucyRvbkNoYW5nZWQgPSBvcHRpb25zLm9uQ2hhbmdlZCkgPT09IG51bGwgfHwgX29wdGlvbnMkb25DaGFuZ2VkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25DaGFuZ2VkLmNhbGwob3B0aW9ucywgdmFsdWUsIG9sZCk7XG5cdFx0aWYgKHRyaWdnZXJpbmcpIHRyaWdnZXIoKTtcblx0fVxuXHQvKipcblx0KiBHZXQgdGhlIHZhbHVlIHdpdGhvdXQgdHJhY2tlZCBpbiB0aGUgcmVhY3Rpdml0eSBzeXN0ZW1cblx0Ki9cblx0Y29uc3QgdW50cmFja2VkR2V0ID0gKCkgPT4gZ2V0JDEoZmFsc2UpO1xuXHQvKipcblx0KiBTZXQgdGhlIHZhbHVlIHdpdGhvdXQgdHJpZ2dlcmluZyB0aGUgcmVhY3Rpdml0eSBzeXN0ZW1cblx0Ki9cblx0Y29uc3Qgc2lsZW50U2V0ID0gKHYpID0+IHNldCQxKHYsIGZhbHNlKTtcblx0LyoqXG5cdCogR2V0IHRoZSB2YWx1ZSB3aXRob3V0IHRyYWNrZWQgaW4gdGhlIHJlYWN0aXZpdHkgc3lzdGVtLlxuXHQqXG5cdCogQWxpYXMgZm9yIGB1bnRyYWNrZWRHZXQoKWBcblx0Ki9cblx0Y29uc3QgcGVlayA9ICgpID0+IGdldCQxKGZhbHNlKTtcblx0LyoqXG5cdCogU2V0IHRoZSB2YWx1ZSB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIHJlYWN0aXZpdHkgc3lzdGVtXG5cdCpcblx0KiBBbGlhcyBmb3IgYHNpbGVudFNldCh2KWBcblx0Ki9cblx0Y29uc3QgbGF5ID0gKHYpID0+IHNldCQxKHYsIGZhbHNlKTtcblx0cmV0dXJuIGV4dGVuZFJlZihyZWYkMSwge1xuXHRcdGdldDogZ2V0JDEsXG5cdFx0c2V0OiBzZXQkMSxcblx0XHR1bnRyYWNrZWRHZXQsXG5cdFx0c2lsZW50U2V0LFxuXHRcdHBlZWssXG5cdFx0bGF5XG5cdH0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHJlZldpdGhDb250cm9sYCBpbnN0ZWFkICovXG5jb25zdCBjb250cm9sbGVkUmVmID0gcmVmV2l0aENvbnRyb2w7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNldC9pbmRleC50c1xuLyoqXG4qICBTaG9ydGhhbmQgZm9yIGByZWYudmFsdWUgPSB4YFxuKi9cbmZ1bmN0aW9uIHNldCguLi5hcmdzKSB7XG5cdGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuXHRcdGNvbnN0IFtyZWYkMSwgdmFsdWVdID0gYXJncztcblx0XHRyZWYkMS52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cdGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbnN0IFt0YXJnZXQsIGtleSwgdmFsdWVdID0gYXJncztcblx0XHR0YXJnZXRba2V5XSA9IHZhbHVlO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoV2l0aEZpbHRlci9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyID0gYnlwYXNzRmlsdGVyLC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0cmV0dXJuIHdhdGNoKHNvdXJjZSwgY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgY2IpLCB3YXRjaE9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaFBhdXNhYmxlL2luZGV4LnRzXG4vKiogQGRlcHJlY2F0ZWQgVXNlIFZ1ZSdzIGJ1aWx0LWluIGB3YXRjaGAgaW5zdGVhZC4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb24uICovXG5mdW5jdGlvbiB3YXRjaFBhdXNhYmxlKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyOiBmaWx0ZXIsIGluaXRpYWxTdGF0ZSA9IFwiYWN0aXZlXCIsLi4ud2F0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyLCBwYXVzZSwgcmVzdW1lLCBpc0FjdGl2ZSB9ID0gcGF1c2FibGVGaWx0ZXIoZmlsdGVyLCB7IGluaXRpYWxTdGF0ZSB9KTtcblx0cmV0dXJuIHtcblx0XHRzdG9wOiB3YXRjaFdpdGhGaWx0ZXIoc291cmNlLCBjYiwge1xuXHRcdFx0Li4ud2F0Y2hPcHRpb25zLFxuXHRcdFx0ZXZlbnRGaWx0ZXJcblx0XHR9KSxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWUsXG5cdFx0aXNBY3RpdmVcblx0fTtcbn1cbi8qKiBAZGVwcmVjYXRlZCBVc2UgVnVlJ3MgYnVpbHQtaW4gYHdhdGNoYCBpbnN0ZWFkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbi4gKi9cbmNvbnN0IHBhdXNhYmxlV2F0Y2ggPSB3YXRjaFBhdXNhYmxlO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzeW5jUmVmL2luZGV4LnRzXG4vKipcbiogVHdvLXdheSByZWZzIHN5bmNocm9uaXphdGlvbi5cbiogRnJvbSB0aGUgc2V0IHRoZW9yeSBwZXJzcGVjdGl2ZSB0byByZXN0cmljdCB0aGUgb3B0aW9uJ3MgdHlwZVxuKiBDaGVjayBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuKiAxLiBMID0gUlxuKiAyLiBMIOKIqSBSIOKJoCDiiIVcbiogMy4gTCDiioYgUlxuKiA0LiBMIOKIqSBSID0g4oiFXG4qL1xuZnVuY3Rpb24gc3luY1JlZihsZWZ0LCByaWdodCwgLi4uW29wdGlvbnNdKSB7XG5cdGNvbnN0IHsgZmx1c2ggPSBcInN5bmNcIiwgZGVlcCA9IGZhbHNlLCBpbW1lZGlhdGUgPSB0cnVlLCBkaXJlY3Rpb24gPSBcImJvdGhcIiwgdHJhbnNmb3JtID0ge30gfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IHdhdGNoZXJzID0gW107XG5cdGNvbnN0IHRyYW5zZm9ybUxUUiA9IFwibHRyXCIgaW4gdHJhbnNmb3JtICYmIHRyYW5zZm9ybS5sdHIgfHwgKCh2KSA9PiB2KTtcblx0Y29uc3QgdHJhbnNmb3JtUlRMID0gXCJydGxcIiBpbiB0cmFuc2Zvcm0gJiYgdHJhbnNmb3JtLnJ0bCB8fCAoKHYpID0+IHYpO1xuXHRpZiAoZGlyZWN0aW9uID09PSBcImJvdGhcIiB8fCBkaXJlY3Rpb24gPT09IFwibHRyXCIpIHdhdGNoZXJzLnB1c2god2F0Y2hQYXVzYWJsZShsZWZ0LCAobmV3VmFsdWUpID0+IHtcblx0XHR3YXRjaGVycy5mb3JFYWNoKCh3KSA9PiB3LnBhdXNlKCkpO1xuXHRcdHJpZ2h0LnZhbHVlID0gdHJhbnNmb3JtTFRSKG5ld1ZhbHVlKTtcblx0XHR3YXRjaGVycy5mb3JFYWNoKCh3KSA9PiB3LnJlc3VtZSgpKTtcblx0fSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0aW1tZWRpYXRlXG5cdH0pKTtcblx0aWYgKGRpcmVjdGlvbiA9PT0gXCJib3RoXCIgfHwgZGlyZWN0aW9uID09PSBcInJ0bFwiKSB3YXRjaGVycy5wdXNoKHdhdGNoUGF1c2FibGUocmlnaHQsIChuZXdWYWx1ZSkgPT4ge1xuXHRcdHdhdGNoZXJzLmZvckVhY2goKHcpID0+IHcucGF1c2UoKSk7XG5cdFx0bGVmdC52YWx1ZSA9IHRyYW5zZm9ybVJUTChuZXdWYWx1ZSk7XG5cdFx0d2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5yZXN1bWUoKSk7XG5cdH0sIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGltbWVkaWF0ZVxuXHR9KSk7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0d2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5zdG9wKCkpO1xuXHR9O1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3luY1JlZnMvaW5kZXgudHNcbi8qKlxuKiBLZWVwIHRhcmdldCByZWYocykgaW4gc3luYyB3aXRoIHRoZSBzb3VyY2UgcmVmXG4qXG4qIEBwYXJhbSBzb3VyY2Ugc291cmNlIHJlZlxuKiBAcGFyYW0gdGFyZ2V0c1xuKi9cbmZ1bmN0aW9uIHN5bmNSZWZzKHNvdXJjZSwgdGFyZ2V0cywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZmx1c2ggPSBcInN5bmNcIiwgZGVlcCA9IGZhbHNlLCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB0YXJnZXRzQXJyYXkgPSB0b0FycmF5KHRhcmdldHMpO1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCAobmV3VmFsdWUpID0+IHRhcmdldHNBcnJheS5mb3JFYWNoKCh0YXJnZXQpID0+IHRhcmdldC52YWx1ZSA9IG5ld1ZhbHVlKSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0aW1tZWRpYXRlXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0b1JlZnMvaW5kZXgudHNcbi8qKlxuKiBFeHRlbmRlZCBgdG9SZWZzYCB0aGF0IGFsc28gYWNjZXB0cyByZWZzIG9mIGFuIG9iamVjdC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdG9SZWZzXG4qIEBwYXJhbSBvYmplY3RSZWYgQSByZWYgb3Igbm9ybWFsIG9iamVjdCBvciBhcnJheS5cbiogQHBhcmFtIG9wdGlvbnMgT3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3RSZWYsIG9wdGlvbnMgPSB7fSkge1xuXHRpZiAoIWlzUmVmKG9iamVjdFJlZikpIHJldHVybiB0b1JlZnMkMShvYmplY3RSZWYpO1xuXHRjb25zdCByZXN1bHQgPSBBcnJheS5pc0FycmF5KG9iamVjdFJlZi52YWx1ZSkgPyBBcnJheS5mcm9tKHsgbGVuZ3RoOiBvYmplY3RSZWYudmFsdWUubGVuZ3RoIH0pIDoge307XG5cdGZvciAoY29uc3Qga2V5IGluIG9iamVjdFJlZi52YWx1ZSkgcmVzdWx0W2tleV0gPSBjdXN0b21SZWYoKCkgPT4gKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gb2JqZWN0UmVmLnZhbHVlW2tleV07XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0dmFyIF90b1ZhbHVlO1xuXHRcdFx0aWYgKChfdG9WYWx1ZSA9IHRvVmFsdWUob3B0aW9ucy5yZXBsYWNlUmVmKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogdHJ1ZSkgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0UmVmLnZhbHVlKSkge1xuXHRcdFx0XHRjb25zdCBjb3B5ID0gWy4uLm9iamVjdFJlZi52YWx1ZV07XG5cdFx0XHRcdGNvcHlba2V5XSA9IHY7XG5cdFx0XHRcdG9iamVjdFJlZi52YWx1ZSA9IGNvcHk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBuZXdPYmplY3QgPSB7XG5cdFx0XHRcdFx0Li4ub2JqZWN0UmVmLnZhbHVlLFxuXHRcdFx0XHRcdFtrZXldOiB2XG5cdFx0XHRcdH07XG5cdFx0XHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdPYmplY3QsIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3RSZWYudmFsdWUpKTtcblx0XHRcdFx0b2JqZWN0UmVmLnZhbHVlID0gbmV3T2JqZWN0O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBvYmplY3RSZWYudmFsdWVba2V5XSA9IHY7XG5cdFx0fVxuXHR9KSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHRyeU9uQmVmb3JlTW91bnQvaW5kZXgudHNcbi8qKlxuKiBDYWxsIG9uQmVmb3JlTW91bnQoKSBpZiBpdCdzIGluc2lkZSBhIGNvbXBvbmVudCBsaWZlY3ljbGUsIGlmIG5vdCwganVzdCBjYWxsIHRoZSBmdW5jdGlvblxuKlxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIHN5bmMgaWYgc2V0IHRvIGZhbHNlLCBpdCB3aWxsIHJ1biBpbiB0aGUgbmV4dFRpY2soKSBvZiBWdWVcbiogQHBhcmFtIHRhcmdldFxuKi9cbmZ1bmN0aW9uIHRyeU9uQmVmb3JlTW91bnQoZm4sIHN5bmMgPSB0cnVlLCB0YXJnZXQpIHtcblx0aWYgKGdldExpZmVDeWNsZVRhcmdldCh0YXJnZXQpKSBvbkJlZm9yZU1vdW50KGZuLCB0YXJnZXQpO1xuXHRlbHNlIGlmIChzeW5jKSBmbigpO1xuXHRlbHNlIG5leHRUaWNrKGZuKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdHJ5T25CZWZvcmVVbm1vdW50L2luZGV4LnRzXG4vKipcbiogQ2FsbCBvbkJlZm9yZVVubW91bnQoKSBpZiBpdCdzIGluc2lkZSBhIGNvbXBvbmVudCBsaWZlY3ljbGUsIGlmIG5vdCwgZG8gbm90aGluZ1xuKlxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIHRhcmdldFxuKi9cbmZ1bmN0aW9uIHRyeU9uQmVmb3JlVW5tb3VudChmbiwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25CZWZvcmVVbm1vdW50KGZuLCB0YXJnZXQpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0cnlPbk1vdW50ZWQvaW5kZXgudHNcbi8qKlxuKiBDYWxsIG9uTW91bnRlZCgpIGlmIGl0J3MgaW5zaWRlIGEgY29tcG9uZW50IGxpZmVjeWNsZSwgaWYgbm90LCBqdXN0IGNhbGwgdGhlIGZ1bmN0aW9uXG4qXG4qIEBwYXJhbSBmblxuKiBAcGFyYW0gc3luYyBpZiBzZXQgdG8gZmFsc2UsIGl0IHdpbGwgcnVuIGluIHRoZSBuZXh0VGljaygpIG9mIFZ1ZVxuKiBAcGFyYW0gdGFyZ2V0XG4qL1xuZnVuY3Rpb24gdHJ5T25Nb3VudGVkKGZuLCBzeW5jID0gdHJ1ZSwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25Nb3VudGVkKGZuLCB0YXJnZXQpO1xuXHRlbHNlIGlmIChzeW5jKSBmbigpO1xuXHRlbHNlIG5leHRUaWNrKGZuKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdHJ5T25Vbm1vdW50ZWQvaW5kZXgudHNcbi8qKlxuKiBDYWxsIG9uVW5tb3VudGVkKCkgaWYgaXQncyBpbnNpZGUgYSBjb21wb25lbnQgbGlmZWN5Y2xlLCBpZiBub3QsIGRvIG5vdGhpbmdcbipcbiogQHBhcmFtIGZuXG4qIEBwYXJhbSB0YXJnZXRcbiovXG5mdW5jdGlvbiB0cnlPblVubW91bnRlZChmbiwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25Vbm1vdW50ZWQoZm4sIHRhcmdldCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVudGlsL2luZGV4LnRzXG5mdW5jdGlvbiBjcmVhdGVVbnRpbChyLCBpc05vdCA9IGZhbHNlKSB7XG5cdGZ1bmN0aW9uIHRvTWF0Y2goY29uZGl0aW9uLCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgdGltZW91dCwgdGhyb3dPblRpbWVvdXQgfSA9IHt9KSB7XG5cdFx0bGV0IHN0b3AgPSBudWxsO1xuXHRcdGNvbnN0IHByb21pc2VzID0gW25ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHRzdG9wID0gd2F0Y2gociwgKHYpID0+IHtcblx0XHRcdFx0aWYgKGNvbmRpdGlvbih2KSAhPT0gaXNOb3QpIHtcblx0XHRcdFx0XHRpZiAoc3RvcCkgc3RvcCgpO1xuXHRcdFx0XHRcdGVsc2UgbmV4dFRpY2soKCkgPT4gc3RvcCA9PT0gbnVsbCB8fCBzdG9wID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdG9wKCkpO1xuXHRcdFx0XHRcdHJlc29sdmUodik7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHtcblx0XHRcdFx0Zmx1c2gsXG5cdFx0XHRcdGRlZXAsXG5cdFx0XHRcdGltbWVkaWF0ZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fSldO1xuXHRcdGlmICh0aW1lb3V0ICE9IG51bGwpIHByb21pc2VzLnB1c2gocHJvbWlzZVRpbWVvdXQodGltZW91dCwgdGhyb3dPblRpbWVvdXQpLnRoZW4oKCkgPT4gdG9WYWx1ZShyKSkuZmluYWxseSgoKSA9PiBzdG9wID09PSBudWxsIHx8IHN0b3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0b3AoKSkpO1xuXHRcdHJldHVybiBQcm9taXNlLnJhY2UocHJvbWlzZXMpO1xuXHR9XG5cdGZ1bmN0aW9uIHRvQmUodmFsdWUsIG9wdGlvbnMpIHtcblx0XHRpZiAoIWlzUmVmKHZhbHVlKSkgcmV0dXJuIHRvTWF0Y2goKHYpID0+IHYgPT09IHZhbHVlLCBvcHRpb25zKTtcblx0XHRjb25zdCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgdGltZW91dCwgdGhyb3dPblRpbWVvdXQgfSA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuXHRcdGxldCBzdG9wID0gbnVsbDtcblx0XHRjb25zdCBwcm9taXNlcyA9IFtuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0c3RvcCA9IHdhdGNoKFtyLCB2YWx1ZV0sIChbdjEsIHYyXSkgPT4ge1xuXHRcdFx0XHRpZiAoaXNOb3QgIT09ICh2MSA9PT0gdjIpKSB7XG5cdFx0XHRcdFx0aWYgKHN0b3ApIHN0b3AoKTtcblx0XHRcdFx0XHRlbHNlIG5leHRUaWNrKCgpID0+IHN0b3AgPT09IG51bGwgfHwgc3RvcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RvcCgpKTtcblx0XHRcdFx0XHRyZXNvbHZlKHYxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwge1xuXHRcdFx0XHRmbHVzaCxcblx0XHRcdFx0ZGVlcCxcblx0XHRcdFx0aW1tZWRpYXRlOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9KV07XG5cdFx0aWYgKHRpbWVvdXQgIT0gbnVsbCkgcHJvbWlzZXMucHVzaChwcm9taXNlVGltZW91dCh0aW1lb3V0LCB0aHJvd09uVGltZW91dCkudGhlbigoKSA9PiB0b1ZhbHVlKHIpKS5maW5hbGx5KCgpID0+IHtcblx0XHRcdHN0b3AgPT09IG51bGwgfHwgc3RvcCA9PT0gdm9pZCAwIHx8IHN0b3AoKTtcblx0XHRcdHJldHVybiB0b1ZhbHVlKHIpO1xuXHRcdH0pKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yYWNlKHByb21pc2VzKTtcblx0fVxuXHRmdW5jdGlvbiB0b0JlVHJ1dGh5KG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gdG9NYXRjaCgodikgPT4gQm9vbGVhbih2KSwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gdG9CZU51bGwob3B0aW9ucykge1xuXHRcdHJldHVybiB0b0JlKG51bGwsIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIHRvQmVVbmRlZmluZWQob3B0aW9ucykge1xuXHRcdHJldHVybiB0b0JlKHZvaWQgMCwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gdG9CZU5hTihvcHRpb25zKSB7XG5cdFx0cmV0dXJuIHRvTWF0Y2goTnVtYmVyLmlzTmFOLCBvcHRpb25zKTtcblx0fVxuXHRmdW5jdGlvbiB0b0NvbnRhaW5zKHZhbHVlLCBvcHRpb25zKSB7XG5cdFx0cmV0dXJuIHRvTWF0Y2goKHYpID0+IHtcblx0XHRcdGNvbnN0IGFycmF5ID0gQXJyYXkuZnJvbSh2KTtcblx0XHRcdHJldHVybiBhcnJheS5pbmNsdWRlcyh2YWx1ZSkgfHwgYXJyYXkuaW5jbHVkZXModG9WYWx1ZSh2YWx1ZSkpO1xuXHRcdH0sIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIGNoYW5nZWQob3B0aW9ucykge1xuXHRcdHJldHVybiBjaGFuZ2VkVGltZXMoMSwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gY2hhbmdlZFRpbWVzKG4gPSAxLCBvcHRpb25zKSB7XG5cdFx0bGV0IGNvdW50ID0gLTE7XG5cdFx0cmV0dXJuIHRvTWF0Y2goKCkgPT4ge1xuXHRcdFx0Y291bnQgKz0gMTtcblx0XHRcdHJldHVybiBjb3VudCA+PSBuO1xuXHRcdH0sIG9wdGlvbnMpO1xuXHR9XG5cdGlmIChBcnJheS5pc0FycmF5KHRvVmFsdWUocikpKSByZXR1cm4ge1xuXHRcdHRvTWF0Y2gsXG5cdFx0dG9Db250YWlucyxcblx0XHRjaGFuZ2VkLFxuXHRcdGNoYW5nZWRUaW1lcyxcblx0XHRnZXQgbm90KCkge1xuXHRcdFx0cmV0dXJuIGNyZWF0ZVVudGlsKHIsICFpc05vdCk7XG5cdFx0fVxuXHR9O1xuXHRlbHNlIHJldHVybiB7XG5cdFx0dG9NYXRjaCxcblx0XHR0b0JlLFxuXHRcdHRvQmVUcnV0aHksXG5cdFx0dG9CZU51bGwsXG5cdFx0dG9CZU5hTixcblx0XHR0b0JlVW5kZWZpbmVkLFxuXHRcdGNoYW5nZWQsXG5cdFx0Y2hhbmdlZFRpbWVzLFxuXHRcdGdldCBub3QoKSB7XG5cdFx0XHRyZXR1cm4gY3JlYXRlVW50aWwociwgIWlzTm90KTtcblx0XHR9XG5cdH07XG59XG5mdW5jdGlvbiB1bnRpbChyKSB7XG5cdHJldHVybiBjcmVhdGVVbnRpbChyKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlEaWZmZXJlbmNlL2luZGV4LnRzXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcih2YWx1ZSwgb3RoVmFsKSB7XG5cdHJldHVybiB2YWx1ZSA9PT0gb3RoVmFsO1xufVxuLyoqXG4qIFJlYWN0aXZlIGdldCBhcnJheSBkaWZmZXJlbmNlIG9mIHR3byBhcnJheVxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheURpZmZlcmVuY2VcbiogQHJldHVybnMgLSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gYXJyYXlcbiogQHBhcmFtIGFyZ3NcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheURpZmZlcmVuY2UoLi4uYXJncykge1xuXHR2YXIgX2FyZ3MkLCBfYXJncyQyO1xuXHRjb25zdCBsaXN0ID0gYXJnc1swXTtcblx0Y29uc3QgdmFsdWVzID0gYXJnc1sxXTtcblx0bGV0IGNvbXBhcmVGbiA9IChfYXJncyQgPSBhcmdzWzJdKSAhPT0gbnVsbCAmJiBfYXJncyQgIT09IHZvaWQgMCA/IF9hcmdzJCA6IGRlZmF1bHRDb21wYXJhdG9yO1xuXHRjb25zdCB7IHN5bW1ldHJpYyA9IGZhbHNlIH0gPSAoX2FyZ3MkMiA9IGFyZ3NbM10pICE9PSBudWxsICYmIF9hcmdzJDIgIT09IHZvaWQgMCA/IF9hcmdzJDIgOiB7fTtcblx0aWYgKHR5cGVvZiBjb21wYXJlRm4gPT09IFwic3RyaW5nXCIpIHtcblx0XHRjb25zdCBrZXkgPSBjb21wYXJlRm47XG5cdFx0Y29tcGFyZUZuID0gKHZhbHVlLCBvdGhWYWwpID0+IHZhbHVlW2tleV0gPT09IG90aFZhbFtrZXldO1xuXHR9XG5cdGNvbnN0IGRpZmYxID0gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5maWx0ZXIoKHgpID0+IHRvVmFsdWUodmFsdWVzKS5maW5kSW5kZXgoKHkpID0+IGNvbXBhcmVGbih4LCB5KSkgPT09IC0xKSk7XG5cdGlmIChzeW1tZXRyaWMpIHtcblx0XHRjb25zdCBkaWZmMiA9IGNvbXB1dGVkKCgpID0+IHRvVmFsdWUodmFsdWVzKS5maWx0ZXIoKHgpID0+IHRvVmFsdWUobGlzdCkuZmluZEluZGV4KCh5KSA9PiBjb21wYXJlRm4oeCwgeSkpID09PSAtMSkpO1xuXHRcdHJldHVybiBjb21wdXRlZCgoKSA9PiBzeW1tZXRyaWMgPyBbLi4udG9WYWx1ZShkaWZmMSksIC4uLnRvVmFsdWUoZGlmZjIpXSA6IHRvVmFsdWUoZGlmZjEpKTtcblx0fSBlbHNlIHJldHVybiBkaWZmMTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlFdmVyeS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5ldmVyeWBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlFdmVyeVxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zICoqdHJ1ZSoqIGlmIHRoZSBgZm5gIGZ1bmN0aW9uIHJldHVybnMgYSAqKnRydXRoeSoqIHZhbHVlIGZvciBldmVyeSBlbGVtZW50IGZyb20gdGhlIGFycmF5LiBPdGhlcndpc2UsICoqZmFsc2UqKi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheUV2ZXJ5KGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLmV2ZXJ5KChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaWx0ZXIvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkuZmlsdGVyYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUZpbHRlclxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGBsaXN0YC4gRWFjaCB0aW1lIGBmbmAgZXhlY3V0ZXMsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgbmV3IGFycmF5LlxuKlxuKiBAcmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiBhIHBvcnRpb24gb2YgdGhlIGdpdmVuIGFycmF5LCBmaWx0ZXJlZCBkb3duIHRvIGp1c3QgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGdpdmVuIGFycmF5IHRoYXQgcGFzcyB0aGUgdGVzdCBpbXBsZW1lbnRlZCBieSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uIElmIG5vIGVsZW1lbnRzIHBhc3MgdGhlIHRlc3QsIGFuIGVtcHR5IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlGaWx0ZXIobGlzdCwgZm4pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkubWFwKChpKSA9PiB0b1ZhbHVlKGkpKS5maWx0ZXIoZm4pKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaW5kL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmZpbmRgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5RmluZFxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSB0aGF0IHNhdGlzZmllcyB0aGUgcHJvdmlkZWQgdGVzdGluZyBmdW5jdGlvbi4gT3RoZXJ3aXNlLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlGaW5kKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKHRvVmFsdWUobGlzdCkuZmluZCgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheUZpbmRJbmRleC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5maW5kSW5kZXhgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5RmluZEluZGV4XG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGZuIC0gYSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbipcbiogQHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSB0aGF0IHBhc3NlcyB0aGUgdGVzdC4gT3RoZXJ3aXNlLCBcIi0xXCIuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlGaW5kSW5kZXgobGlzdCwgZm4pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkuZmluZEluZGV4KChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaW5kTGFzdC9pbmRleC50c1xuZnVuY3Rpb24gZmluZExhc3QoYXJyLCBjYikge1xuXHRsZXQgaW5kZXggPSBhcnIubGVuZ3RoO1xuXHR3aGlsZSAoaW5kZXgtLSA+IDApIGlmIChjYihhcnJbaW5kZXhdLCBpbmRleCwgYXJyKSkgcmV0dXJuIGFycltpbmRleF07XG59XG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmZpbmRMYXN0YFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUZpbmRMYXN0XG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGZuIC0gYSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbipcbiogQHJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIHRlc3RpbmcgZnVuY3Rpb24uIE90aGVyd2lzZSwgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5RmluZExhc3QobGlzdCwgZm4pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUoIUFycmF5LnByb3RvdHlwZS5maW5kTGFzdCA/IGZpbmRMYXN0KHRvVmFsdWUobGlzdCksIChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpIDogdG9WYWx1ZShsaXN0KS5maW5kTGFzdCgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheUluY2x1ZGVzL2luZGV4LnRzXG5mdW5jdGlvbiBpc0FycmF5SW5jbHVkZXNPcHRpb25zKG9iaikge1xuXHRyZXR1cm4gaXNPYmplY3Qob2JqKSAmJiBjb250YWluc1Byb3Aob2JqLCBcImZvcm1JbmRleFwiLCBcImNvbXBhcmF0b3JcIik7XG59XG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmluY2x1ZGVzYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUluY2x1ZGVzXG4qXG4qIEByZXR1cm5zIHRydWUgaWYgdGhlIGB2YWx1ZWAgaXMgZm91bmQgaW4gdGhlIGFycmF5LiBPdGhlcndpc2UsIGZhbHNlLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5SW5jbHVkZXMoLi4uYXJncykge1xuXHR2YXIgX2NvbXBhcmF0b3I7XG5cdGNvbnN0IGxpc3QgPSBhcmdzWzBdO1xuXHRjb25zdCB2YWx1ZSA9IGFyZ3NbMV07XG5cdGxldCBjb21wYXJhdG9yID0gYXJnc1syXTtcblx0bGV0IGZvcm1JbmRleCA9IDA7XG5cdGlmIChpc0FycmF5SW5jbHVkZXNPcHRpb25zKGNvbXBhcmF0b3IpKSB7XG5cdFx0dmFyIF9jb21wYXJhdG9yJGZyb21JbmRleDtcblx0XHRmb3JtSW5kZXggPSAoX2NvbXBhcmF0b3IkZnJvbUluZGV4ID0gY29tcGFyYXRvci5mcm9tSW5kZXgpICE9PSBudWxsICYmIF9jb21wYXJhdG9yJGZyb21JbmRleCAhPT0gdm9pZCAwID8gX2NvbXBhcmF0b3IkZnJvbUluZGV4IDogMDtcblx0XHRjb21wYXJhdG9yID0gY29tcGFyYXRvci5jb21wYXJhdG9yO1xuXHR9XG5cdGlmICh0eXBlb2YgY29tcGFyYXRvciA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGNvbnN0IGtleSA9IGNvbXBhcmF0b3I7XG5cdFx0Y29tcGFyYXRvciA9IChlbGVtZW50LCB2YWx1ZSQxKSA9PiBlbGVtZW50W2tleV0gPT09IHRvVmFsdWUodmFsdWUkMSk7XG5cdH1cblx0Y29tcGFyYXRvciA9IChfY29tcGFyYXRvciA9IGNvbXBhcmF0b3IpICE9PSBudWxsICYmIF9jb21wYXJhdG9yICE9PSB2b2lkIDAgPyBfY29tcGFyYXRvciA6ICgoZWxlbWVudCwgdmFsdWUkMSkgPT4gZWxlbWVudCA9PT0gdG9WYWx1ZSh2YWx1ZSQxKSk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLnNsaWNlKGZvcm1JbmRleCkuc29tZSgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBjb21wYXJhdG9yKHRvVmFsdWUoZWxlbWVudCksIHRvVmFsdWUodmFsdWUpLCBpbmRleCwgdG9WYWx1ZShhcnJheSkpKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5Sm9pbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5qb2luYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUpvaW5cbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gc2VwYXJhdG9yIC0gYSBzdHJpbmcgdG8gc2VwYXJhdGUgZWFjaCBwYWlyIG9mIGFkamFjZW50IGVsZW1lbnRzIG9mIHRoZSBhcnJheS4gSWYgb21pdHRlZCwgdGhlIGFycmF5IGVsZW1lbnRzIGFyZSBzZXBhcmF0ZWQgd2l0aCBhIGNvbW1hIChcIixcIikuXG4qXG4qIEByZXR1cm5zIGEgc3RyaW5nIHdpdGggYWxsIGFycmF5IGVsZW1lbnRzIGpvaW5lZC4gSWYgYXJyLmxlbmd0aCBpcyAwLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5Sm9pbihsaXN0LCBzZXBhcmF0b3IpIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkubWFwKChpKSA9PiB0b1ZhbHVlKGkpKS5qb2luKHRvVmFsdWUoc2VwYXJhdG9yKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheU1hcC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5tYXBgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5TWFwXG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGZuIC0gYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBmb3IgZXZlcnkgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gYGxpc3RgLiBFYWNoIHRpbWUgYGZuYCBleGVjdXRlcywgdGhlIHJldHVybmVkIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBuZXcgYXJyYXkuXG4qXG4qIEByZXR1cm5zIGEgbmV3IGFycmF5IHdpdGggZWFjaCBlbGVtZW50IGJlaW5nIHRoZSByZXN1bHQgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5TWFwKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLm1hcCgoaSkgPT4gdG9WYWx1ZShpKSkubWFwKGZuKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5UmVkdWNlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LnJlZHVjZWBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlSZWR1Y2VcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gcmVkdWNlciAtIGEgXCJyZWR1Y2VyXCIgZnVuY3Rpb24uXG4qIEBwYXJhbSBhcmdzXG4qXG4qIEByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHJlc3VsdHMgZnJvbSBydW5uaW5nIHRoZSBcInJlZHVjZXJcIiBjYWxsYmFjayBmdW5jdGlvbiB0byBjb21wbGV0aW9uIG92ZXIgdGhlIGVudGlyZSBhcnJheS5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheVJlZHVjZShsaXN0LCByZWR1Y2VyLCAuLi5hcmdzKSB7XG5cdGNvbnN0IHJlZHVjZUNhbGxiYWNrID0gKHN1bSwgdmFsdWUsIGluZGV4KSA9PiByZWR1Y2VyKHRvVmFsdWUoc3VtKSwgdG9WYWx1ZSh2YWx1ZSksIGluZGV4KTtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCByZXNvbHZlZCA9IHRvVmFsdWUobGlzdCk7XG5cdFx0cmV0dXJuIGFyZ3MubGVuZ3RoID8gcmVzb2x2ZWQucmVkdWNlKHJlZHVjZUNhbGxiYWNrLCB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiID8gdG9WYWx1ZShhcmdzWzBdKCkpIDogdG9WYWx1ZShhcmdzWzBdKSkgOiByZXNvbHZlZC5yZWR1Y2UocmVkdWNlQ2FsbGJhY2spO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlTb21lL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LnNvbWVgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5U29tZVxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zICoqdHJ1ZSoqIGlmIHRoZSBgZm5gIGZ1bmN0aW9uIHJldHVybnMgYSAqKnRydXRoeSoqIHZhbHVlIGZvciBhbnkgZWxlbWVudCBmcm9tIHRoZSBhcnJheS4gT3RoZXJ3aXNlLCAqKmZhbHNlKiouXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlTb21lKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLnNvbWUoKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gZm4odG9WYWx1ZShlbGVtZW50KSwgaW5kZXgsIGFycmF5KSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheVVuaXF1ZS9pbmRleC50c1xuZnVuY3Rpb24gdW5pcShhcnJheSkge1xuXHRyZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFycmF5KSk7XG59XG5mdW5jdGlvbiB1bmlxdWVFbGVtZW50c0J5KGFycmF5LCBmbikge1xuXHRyZXR1cm4gYXJyYXkucmVkdWNlKChhY2MsIHYpID0+IHtcblx0XHRpZiAoIWFjYy5zb21lKCh4KSA9PiBmbih2LCB4LCBhcnJheSkpKSBhY2MucHVzaCh2KTtcblx0XHRyZXR1cm4gYWNjO1xuXHR9LCBbXSk7XG59XG4vKipcbiogcmVhY3RpdmUgdW5pcXVlIGFycmF5XG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5VW5pcXVlXG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGNvbXBhcmVGblxuKiBAcmV0dXJucyBBIGNvbXB1dGVkIHJlZiB0aGF0IHJldHVybnMgYSB1bmlxdWUgYXJyYXkgb2YgaXRlbXMuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlVbmlxdWUobGlzdCwgY29tcGFyZUZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcmVzb2x2ZWRMaXN0ID0gdG9WYWx1ZShsaXN0KS5tYXAoKGVsZW1lbnQpID0+IHRvVmFsdWUoZWxlbWVudCkpO1xuXHRcdHJldHVybiBjb21wYXJlRm4gPyB1bmlxdWVFbGVtZW50c0J5KHJlc29sdmVkTGlzdCwgY29tcGFyZUZuKSA6IHVuaXEocmVzb2x2ZWRMaXN0KTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvdW50ZXIvaW5kZXgudHNcbi8qKlxuKiBCYXNpYyBjb3VudGVyIHdpdGggdXRpbGl0eSBmdW5jdGlvbnMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNvdW50ZXJcbiogQHBhcmFtIFtpbml0aWFsVmFsdWVdXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlQ291bnRlcihpbml0aWFsVmFsdWUgPSAwLCBvcHRpb25zID0ge30pIHtcblx0bGV0IF9pbml0aWFsVmFsdWUgPSB1bnJlZihpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBjb3VudCA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgeyBtYXggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG1pbiA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaW5jID0gKGRlbHRhID0gMSkgPT4gY291bnQudmFsdWUgPSBNYXRoLm1heChNYXRoLm1pbihtYXgsIGNvdW50LnZhbHVlICsgZGVsdGEpLCBtaW4pO1xuXHRjb25zdCBkZWMgPSAoZGVsdGEgPSAxKSA9PiBjb3VudC52YWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KG1pbiwgY291bnQudmFsdWUgLSBkZWx0YSksIG1heCk7XG5cdGNvbnN0IGdldCQxID0gKCkgPT4gY291bnQudmFsdWU7XG5cdGNvbnN0IHNldCQxID0gKHZhbCkgPT4gY291bnQudmFsdWUgPSBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsKSk7XG5cdGNvbnN0IHJlc2V0ID0gKHZhbCA9IF9pbml0aWFsVmFsdWUpID0+IHtcblx0XHRfaW5pdGlhbFZhbHVlID0gdmFsO1xuXHRcdHJldHVybiBzZXQkMSh2YWwpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdGNvdW50OiBzaGFsbG93UmVhZG9ubHkoY291bnQpLFxuXHRcdGluYyxcblx0XHRkZWMsXG5cdFx0Z2V0OiBnZXQkMSxcblx0XHRzZXQ6IHNldCQxLFxuXHRcdHJlc2V0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURhdGVGb3JtYXQvaW5kZXgudHNcbmNvbnN0IFJFR0VYX1BBUlNFID0gL14oXFxkezR9KVstL10/KFxcZHsxLDJ9KT9bLS9dPyhcXGR7MCwyfSlbVFxcc10qKFxcZHsxLDJ9KT86PyhcXGR7MSwyfSk/Oj8oXFxkezEsMn0pP1suOl0/KFxcZCspPyQvaTtcbmNvbnN0IFJFR0VYX0ZPUk1BVCA9IC9bWU1ESGhtc11vfFxcWyhbXlxcXV0rKVxcXXxZezEsNH18TXsxLDR9fER7MSwyfXxkezEsNH18SHsxLDJ9fGh7MSwyfXxhezEsMn18QXsxLDJ9fG17MSwyfXxzezEsMn18WnsxLDJ9fHp7MSw0fXxTU1MvZztcbmZ1bmN0aW9uIGRlZmF1bHRNZXJpZGllbShob3VycywgbWludXRlcywgaXNMb3dlcmNhc2UsIGhhc1BlcmlvZCkge1xuXHRsZXQgbSA9IGhvdXJzIDwgMTIgPyBcIkFNXCIgOiBcIlBNXCI7XG5cdGlmIChoYXNQZXJpb2QpIG0gPSBtLnNwbGl0KFwiXCIpLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MgKz0gYCR7Y3Vycn0uYCwgXCJcIik7XG5cdHJldHVybiBpc0xvd2VyY2FzZSA/IG0udG9Mb3dlckNhc2UoKSA6IG07XG59XG5mdW5jdGlvbiBmb3JtYXRPcmRpbmFsKG51bSkge1xuXHRjb25zdCBzdWZmaXhlcyA9IFtcblx0XHRcInRoXCIsXG5cdFx0XCJzdFwiLFxuXHRcdFwibmRcIixcblx0XHRcInJkXCJcblx0XTtcblx0Y29uc3QgdiA9IG51bSAlIDEwMDtcblx0cmV0dXJuIG51bSArIChzdWZmaXhlc1sodiAtIDIwKSAlIDEwXSB8fCBzdWZmaXhlc1t2XSB8fCBzdWZmaXhlc1swXSk7XG59XG5mdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUsIGZvcm1hdFN0ciwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRjdXN0b21NZXJpZGk7XG5cdGNvbnN0IHllYXJzID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHRjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcblx0Y29uc3QgZGF5cyA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHRjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcblx0Y29uc3QgbWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpO1xuXHRjb25zdCBzZWNvbmRzID0gZGF0ZS5nZXRTZWNvbmRzKCk7XG5cdGNvbnN0IG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG5cdGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF5KCk7XG5cdGNvbnN0IG1lcmlkaWVtID0gKF9vcHRpb25zJGN1c3RvbU1lcmlkaSA9IG9wdGlvbnMuY3VzdG9tTWVyaWRpZW0pICE9PSBudWxsICYmIF9vcHRpb25zJGN1c3RvbU1lcmlkaSAhPT0gdm9pZCAwID8gX29wdGlvbnMkY3VzdG9tTWVyaWRpIDogZGVmYXVsdE1lcmlkaWVtO1xuXHRjb25zdCBzdHJpcFRpbWVab25lID0gKGRhdGVTdHJpbmcpID0+IHtcblx0XHR2YXIgX2RhdGVTdHJpbmckc3BsaXQkO1xuXHRcdHJldHVybiAoX2RhdGVTdHJpbmckc3BsaXQkID0gZGF0ZVN0cmluZy5zcGxpdChcIiBcIilbMV0pICE9PSBudWxsICYmIF9kYXRlU3RyaW5nJHNwbGl0JCAhPT0gdm9pZCAwID8gX2RhdGVTdHJpbmckc3BsaXQkIDogXCJcIjtcblx0fTtcblx0Y29uc3QgbWF0Y2hlcyA9IHtcblx0XHRZbzogKCkgPT4gZm9ybWF0T3JkaW5hbCh5ZWFycyksXG5cdFx0WVk6ICgpID0+IFN0cmluZyh5ZWFycykuc2xpY2UoLTIpLFxuXHRcdFlZWVk6ICgpID0+IHllYXJzLFxuXHRcdE06ICgpID0+IG1vbnRoICsgMSxcblx0XHRNbzogKCkgPT4gZm9ybWF0T3JkaW5hbChtb250aCArIDEpLFxuXHRcdE1NOiAoKSA9PiBgJHttb250aCArIDF9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0TU1NOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgbW9udGg6IFwic2hvcnRcIiB9KSxcblx0XHRNTU1NOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgbW9udGg6IFwibG9uZ1wiIH0pLFxuXHRcdEQ6ICgpID0+IFN0cmluZyhkYXlzKSxcblx0XHREbzogKCkgPT4gZm9ybWF0T3JkaW5hbChkYXlzKSxcblx0XHRERDogKCkgPT4gYCR7ZGF5c31gLnBhZFN0YXJ0KDIsIFwiMFwiKSxcblx0XHRIOiAoKSA9PiBTdHJpbmcoaG91cnMpLFxuXHRcdEhvOiAoKSA9PiBmb3JtYXRPcmRpbmFsKGhvdXJzKSxcblx0XHRISDogKCkgPT4gYCR7aG91cnN9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0aDogKCkgPT4gYCR7aG91cnMgJSAxMiB8fCAxMn1gLnBhZFN0YXJ0KDEsIFwiMFwiKSxcblx0XHRobzogKCkgPT4gZm9ybWF0T3JkaW5hbChob3VycyAlIDEyIHx8IDEyKSxcblx0XHRoaDogKCkgPT4gYCR7aG91cnMgJSAxMiB8fCAxMn1gLnBhZFN0YXJ0KDIsIFwiMFwiKSxcblx0XHRtOiAoKSA9PiBTdHJpbmcobWludXRlcyksXG5cdFx0bW86ICgpID0+IGZvcm1hdE9yZGluYWwobWludXRlcyksXG5cdFx0bW06ICgpID0+IGAke21pbnV0ZXN9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0czogKCkgPT4gU3RyaW5nKHNlY29uZHMpLFxuXHRcdHNvOiAoKSA9PiBmb3JtYXRPcmRpbmFsKHNlY29uZHMpLFxuXHRcdHNzOiAoKSA9PiBgJHtzZWNvbmRzfWAucGFkU3RhcnQoMiwgXCIwXCIpLFxuXHRcdFNTUzogKCkgPT4gYCR7bWlsbGlzZWNvbmRzfWAucGFkU3RhcnQoMywgXCIwXCIpLFxuXHRcdGQ6ICgpID0+IGRheSxcblx0XHRkZDogKCkgPT4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IHdlZWtkYXk6IFwibmFycm93XCIgfSksXG5cdFx0ZGRkOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgd2Vla2RheTogXCJzaG9ydFwiIH0pLFxuXHRcdGRkZGQ6ICgpID0+IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB3ZWVrZGF5OiBcImxvbmdcIiB9KSxcblx0XHRBOiAoKSA9PiBtZXJpZGllbShob3VycywgbWludXRlcyksXG5cdFx0QUE6ICgpID0+IG1lcmlkaWVtKGhvdXJzLCBtaW51dGVzLCBmYWxzZSwgdHJ1ZSksXG5cdFx0YTogKCkgPT4gbWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIHRydWUpLFxuXHRcdGFhOiAoKSA9PiBtZXJpZGllbShob3VycywgbWludXRlcywgdHJ1ZSwgdHJ1ZSksXG5cdFx0ejogKCkgPT4gc3RyaXBUaW1lWm9uZShkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgdGltZVpvbmVOYW1lOiBcInNob3J0T2Zmc2V0XCIgfSkpLFxuXHRcdHp6OiAoKSA9PiBzdHJpcFRpbWVab25lKGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB0aW1lWm9uZU5hbWU6IFwic2hvcnRPZmZzZXRcIiB9KSksXG5cdFx0enp6OiAoKSA9PiBzdHJpcFRpbWVab25lKGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB0aW1lWm9uZU5hbWU6IFwic2hvcnRPZmZzZXRcIiB9KSksXG5cdFx0enp6ejogKCkgPT4gc3RyaXBUaW1lWm9uZShkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgdGltZVpvbmVOYW1lOiBcImxvbmdPZmZzZXRcIiB9KSlcblx0fTtcblx0cmV0dXJuIGZvcm1hdFN0ci5yZXBsYWNlKFJFR0VYX0ZPUk1BVCwgKG1hdGNoLCAkMSkgPT4ge1xuXHRcdHZhciBfcmVmLCBfbWF0Y2hlcyRtYXRjaDtcblx0XHRyZXR1cm4gKF9yZWYgPSAkMSAhPT0gbnVsbCAmJiAkMSAhPT0gdm9pZCAwID8gJDEgOiAoX21hdGNoZXMkbWF0Y2ggPSBtYXRjaGVzW21hdGNoXSkgPT09IG51bGwgfHwgX21hdGNoZXMkbWF0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9tYXRjaGVzJG1hdGNoLmNhbGwobWF0Y2hlcykpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBtYXRjaDtcblx0fSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVEYXRlKGRhdGUpIHtcblx0aWYgKGRhdGUgPT09IG51bGwpIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoTmFOKTtcblx0aWYgKGRhdGUgPT09IHZvaWQgMCkgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcblx0aWYgKHR5cGVvZiBkYXRlID09PSBcInN0cmluZ1wiICYmICEvWiQvaS50ZXN0KGRhdGUpKSB7XG5cdFx0Y29uc3QgZCA9IGRhdGUubWF0Y2goUkVHRVhfUEFSU0UpO1xuXHRcdGlmIChkKSB7XG5cdFx0XHRjb25zdCBtID0gZFsyXSAtIDEgfHwgMDtcblx0XHRcdGNvbnN0IG1zID0gKGRbN10gfHwgXCIwXCIpLnN1YnN0cmluZygwLCAzKTtcblx0XHRcdHJldHVybiBuZXcgRGF0ZShkWzFdLCBtLCBkWzNdIHx8IDEsIGRbNF0gfHwgMCwgZFs1XSB8fCAwLCBkWzZdIHx8IDAsIG1zKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xufVxuLyoqXG4qIEdldCB0aGUgZm9ybWF0dGVkIGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBzdHJpbmcgb2YgdG9rZW5zIHBhc3NlZCBpbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGF0ZUZvcm1hdFxuKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGZvcm1hdCwgY2FuIGVpdGhlciBiZSBhIGBEYXRlYCBvYmplY3QsIGEgdGltZXN0YW1wLCBvciBhIHN0cmluZ1xuKiBAcGFyYW0gZm9ybWF0U3RyIC0gVGhlIGNvbWJpbmF0aW9uIG9mIHRva2VucyB0byBmb3JtYXQgdGhlIGRhdGVcbiogQHBhcmFtIG9wdGlvbnMgLSBVc2VEYXRlRm9ybWF0T3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURhdGVGb3JtYXQoZGF0ZSwgZm9ybWF0U3RyID0gXCJISDptbTpzc1wiLCBvcHRpb25zID0ge30pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IGZvcm1hdERhdGUobm9ybWFsaXplRGF0ZSh0b1ZhbHVlKGRhdGUpKSwgdG9WYWx1ZShmb3JtYXRTdHIpLCBvcHRpb25zKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUludGVydmFsRm4vaW5kZXgudHNcbi8qKlxuKiBXcmFwcGVyIGZvciBgc2V0SW50ZXJ2YWxgIHdpdGggY29udHJvbHNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSW50ZXJ2YWxGblxuKiBAcGFyYW0gY2JcbiogQHBhcmFtIGludGVydmFsXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwgPSAxZTMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIGltbWVkaWF0ZUNhbGxiYWNrID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGxldCB0aW1lciA9IG51bGw7XG5cdGNvbnN0IGlzQWN0aXZlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGZ1bmN0aW9uIGNsZWFuKCkge1xuXHRcdGlmICh0aW1lcikge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbCh0aW1lcik7XG5cdFx0XHR0aW1lciA9IG51bGw7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHBhdXNlKCkge1xuXHRcdGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xlYW4oKTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoKSB7XG5cdFx0Y29uc3QgaW50ZXJ2YWxWYWx1ZSA9IHRvVmFsdWUoaW50ZXJ2YWwpO1xuXHRcdGlmIChpbnRlcnZhbFZhbHVlIDw9IDApIHJldHVybjtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG5cdFx0aWYgKGltbWVkaWF0ZUNhbGxiYWNrKSBjYigpO1xuXHRcdGNsZWFuKCk7XG5cdFx0aWYgKGlzQWN0aXZlLnZhbHVlKSB0aW1lciA9IHNldEludGVydmFsKGNiLCBpbnRlcnZhbFZhbHVlKTtcblx0fVxuXHRpZiAoaW1tZWRpYXRlICYmIGlzQ2xpZW50KSByZXN1bWUoKTtcblx0aWYgKGlzUmVmKGludGVydmFsKSB8fCB0eXBlb2YgaW50ZXJ2YWwgPT09IFwiZnVuY3Rpb25cIikgdHJ5T25TY29wZURpc3Bvc2Uod2F0Y2goaW50ZXJ2YWwsICgpID0+IHtcblx0XHRpZiAoaXNBY3RpdmUudmFsdWUgJiYgaXNDbGllbnQpIHJlc3VtZSgpO1xuXHR9KSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHBhdXNlKTtcblx0cmV0dXJuIHtcblx0XHRpc0FjdGl2ZTogc2hhbGxvd1JlYWRvbmx5KGlzQWN0aXZlKSxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlSW50ZXJ2YWwvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUludGVydmFsKGludGVydmFsID0gMWUzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBjb250cm9sczogZXhwb3NlQ29udHJvbHMgPSBmYWxzZSwgaW1tZWRpYXRlID0gdHJ1ZSwgY2FsbGJhY2sgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNvdW50ZXIgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCB1cGRhdGUgPSAoKSA9PiBjb3VudGVyLnZhbHVlICs9IDE7XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdGNvdW50ZXIudmFsdWUgPSAwO1xuXHR9O1xuXHRjb25zdCBjb250cm9scyA9IHVzZUludGVydmFsRm4oY2FsbGJhY2sgPyAoKSA9PiB7XG5cdFx0dXBkYXRlKCk7XG5cdFx0Y2FsbGJhY2soY291bnRlci52YWx1ZSk7XG5cdH0gOiB1cGRhdGUsIGludGVydmFsLCB7IGltbWVkaWF0ZSB9KTtcblx0aWYgKGV4cG9zZUNvbnRyb2xzKSByZXR1cm4ge1xuXHRcdGNvdW50ZXI6IHNoYWxsb3dSZWFkb25seShjb3VudGVyKSxcblx0XHRyZXNldCxcblx0XHQuLi5jb250cm9sc1xuXHR9O1xuXHRlbHNlIHJldHVybiBzaGFsbG93UmVhZG9ubHkoY291bnRlcik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUxhc3RDaGFuZ2VkL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VMYXN0Q2hhbmdlZChzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkaW5pdGlhbFZhbHVlO1xuXHRjb25zdCBtcyA9IHNoYWxsb3dSZWYoKF9vcHRpb25zJGluaXRpYWxWYWx1ZSA9IG9wdGlvbnMuaW5pdGlhbFZhbHVlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRpbml0aWFsVmFsdWUgIT09IHZvaWQgMCA/IF9vcHRpb25zJGluaXRpYWxWYWx1ZSA6IG51bGwpO1xuXHR3YXRjaChzb3VyY2UsICgpID0+IG1zLnZhbHVlID0gdGltZXN0YW1wKCksIG9wdGlvbnMpO1xuXHRyZXR1cm4gc2hhbGxvd1JlYWRvbmx5KG1zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZW91dEZuL2luZGV4LnRzXG4vKipcbiogV3JhcHBlciBmb3IgYHNldFRpbWVvdXRgIHdpdGggY29udHJvbHMuXG4qXG4qIEBwYXJhbSBjYlxuKiBAcGFyYW0gaW50ZXJ2YWxcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VUaW1lb3V0Rm4oY2IsIGludGVydmFsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBpbW1lZGlhdGVDYWxsYmFjayA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1BlbmRpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHRpbWVyO1xuXHRmdW5jdGlvbiBjbGVhcigpIHtcblx0XHRpZiAodGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHR0aW1lciA9IHZvaWQgMDtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gc3RvcCgpIHtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRjbGVhcigpO1xuXHR9XG5cdGZ1bmN0aW9uIHN0YXJ0KC4uLmFyZ3MpIHtcblx0XHRpZiAoaW1tZWRpYXRlQ2FsbGJhY2spIGNiKCk7XG5cdFx0Y2xlYXIoKTtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRpc1BlbmRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdHRpbWVyID0gdm9pZCAwO1xuXHRcdFx0Y2IoLi4uYXJncyk7XG5cdFx0fSwgdG9WYWx1ZShpbnRlcnZhbCkpO1xuXHR9XG5cdGlmIChpbW1lZGlhdGUpIHtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlmIChpc0NsaWVudCkgc3RhcnQoKTtcblx0fVxuXHR0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcblx0cmV0dXJuIHtcblx0XHRpc1BlbmRpbmc6IHNoYWxsb3dSZWFkb25seShpc1BlbmRpbmcpLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZW91dC9pbmRleC50c1xuZnVuY3Rpb24gdXNlVGltZW91dChpbnRlcnZhbCA9IDFlMywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIGNhbGxiYWNrIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjb250cm9scyA9IHVzZVRpbWVvdXRGbihjYWxsYmFjayAhPT0gbnVsbCAmJiBjYWxsYmFjayAhPT0gdm9pZCAwID8gY2FsbGJhY2sgOiBub29wLCBpbnRlcnZhbCwgb3B0aW9ucyk7XG5cdGNvbnN0IHJlYWR5ID0gY29tcHV0ZWQoKCkgPT4gIWNvbnRyb2xzLmlzUGVuZGluZy52YWx1ZSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHRyZWFkeSxcblx0XHQuLi5jb250cm9sc1xuXHR9O1xuXHRlbHNlIHJldHVybiByZWFkeTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVG9OdW1iZXIvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IGNvbnZlcnQgYSBzdHJpbmcgcmVmIHRvIG51bWJlci5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUb051bWJlcih2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbWV0aG9kID0gXCJwYXJzZUZsb2F0XCIsIHJhZGl4LCBuYW5Ub1plcm8gfSA9IG9wdGlvbnM7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0bGV0IHJlc29sdmVkID0gdG9WYWx1ZSh2YWx1ZSk7XG5cdFx0aWYgKHR5cGVvZiBtZXRob2QgPT09IFwiZnVuY3Rpb25cIikgcmVzb2x2ZWQgPSBtZXRob2QocmVzb2x2ZWQpO1xuXHRcdGVsc2UgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJzdHJpbmdcIikgcmVzb2x2ZWQgPSBOdW1iZXJbbWV0aG9kXShyZXNvbHZlZCwgcmFkaXgpO1xuXHRcdGlmIChuYW5Ub1plcm8gJiYgTnVtYmVyLmlzTmFOKHJlc29sdmVkKSkgcmVzb2x2ZWQgPSAwO1xuXHRcdHJldHVybiByZXNvbHZlZDtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRvU3RyaW5nL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBjb252ZXJ0IGEgcmVmIHRvIHN0cmluZy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVG9TdHJpbmdcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUb1N0cmluZyh2YWx1ZSkge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gYCR7dG9WYWx1ZSh2YWx1ZSl9YCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRvZ2dsZS9pbmRleC50c1xuLyoqXG4qIEEgYm9vbGVhbiByZWYgd2l0aCBhIHRvZ2dsZXJcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVG9nZ2xlXG4qIEBwYXJhbSBbaW5pdGlhbFZhbHVlXVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVRvZ2dsZShpbml0aWFsVmFsdWUgPSBmYWxzZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdHJ1dGh5VmFsdWUgPSB0cnVlLCBmYWxzeVZhbHVlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHZhbHVlSXNSZWYgPSBpc1JlZihpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBfdmFsdWUgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGZ1bmN0aW9uIHRvZ2dsZSh2YWx1ZSkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRfdmFsdWUudmFsdWUgPSB2YWx1ZTtcblx0XHRcdHJldHVybiBfdmFsdWUudmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHRydXRoeSA9IHRvVmFsdWUodHJ1dGh5VmFsdWUpO1xuXHRcdFx0X3ZhbHVlLnZhbHVlID0gX3ZhbHVlLnZhbHVlID09PSB0cnV0aHkgPyB0b1ZhbHVlKGZhbHN5VmFsdWUpIDogdHJ1dGh5O1xuXHRcdFx0cmV0dXJuIF92YWx1ZS52YWx1ZTtcblx0XHR9XG5cdH1cblx0aWYgKHZhbHVlSXNSZWYpIHJldHVybiB0b2dnbGU7XG5cdGVsc2UgcmV0dXJuIFtfdmFsdWUsIHRvZ2dsZV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoQXJyYXkvaW5kZXgudHNcbi8qKlxuKiBXYXRjaCBmb3IgYW4gYXJyYXkgd2l0aCBhZGRpdGlvbnMgYW5kIHJlbW92YWxzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy93YXRjaEFycmF5XG4qL1xuZnVuY3Rpb24gd2F0Y2hBcnJheShzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG5cdGxldCBvbGRMaXN0ID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbW1lZGlhdGUpID8gW10gOiBbLi4udHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiID8gc291cmNlKCkgOiBBcnJheS5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UgOiB0b1ZhbHVlKHNvdXJjZSldO1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCAobmV3TGlzdCwgXywgb25DbGVhbnVwKSA9PiB7XG5cdFx0Y29uc3Qgb2xkTGlzdFJlbWFpbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBvbGRMaXN0Lmxlbmd0aCB9KTtcblx0XHRjb25zdCBhZGRlZCA9IFtdO1xuXHRcdGZvciAoY29uc3Qgb2JqIG9mIG5ld0xpc3QpIHtcblx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvbGRMaXN0Lmxlbmd0aDsgaSsrKSBpZiAoIW9sZExpc3RSZW1haW5zW2ldICYmIG9iaiA9PT0gb2xkTGlzdFtpXSkge1xuXHRcdFx0XHRvbGRMaXN0UmVtYWluc1tpXSA9IHRydWU7XG5cdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWZvdW5kKSBhZGRlZC5wdXNoKG9iaik7XG5cdFx0fVxuXHRcdGNvbnN0IHJlbW92ZWQgPSBvbGRMaXN0LmZpbHRlcigoXyQxLCBpKSA9PiAhb2xkTGlzdFJlbWFpbnNbaV0pO1xuXHRcdGNiKG5ld0xpc3QsIG9sZExpc3QsIGFkZGVkLCByZW1vdmVkLCBvbkNsZWFudXApO1xuXHRcdG9sZExpc3QgPSBbLi4ubmV3TGlzdF07XG5cdH0sIG9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaEF0TW9zdC9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hBdE1vc3Qoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRjb25zdCB7IGNvdW50LC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0Y29uc3QgY3VycmVudCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHsgc3RvcCwgcmVzdW1lLCBwYXVzZSB9ID0gd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgKC4uLmFyZ3MpID0+IHtcblx0XHRjdXJyZW50LnZhbHVlICs9IDE7XG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPj0gdG9WYWx1ZShjb3VudCkpIG5leHRUaWNrKCgpID0+IHN0b3AoKSk7XG5cdFx0Y2IoLi4uYXJncyk7XG5cdH0sIHdhdGNoT3B0aW9ucyk7XG5cdHJldHVybiB7XG5cdFx0Y291bnQ6IGN1cnJlbnQsXG5cdFx0c3RvcCxcblx0XHRyZXN1bWUsXG5cdFx0cGF1c2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hEZWJvdW5jZWQvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoRGVib3VuY2VkKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRlYm91bmNlID0gMCwgbWF4V2FpdCA9IHZvaWQgMCwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB3YXRjaFdpdGhGaWx0ZXIoc291cmNlLCBjYiwge1xuXHRcdC4uLndhdGNoT3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogZGVib3VuY2VGaWx0ZXIoZGVib3VuY2UsIHsgbWF4V2FpdCB9KVxuXHR9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHdhdGNoRGVib3VuY2VkYCBpbnN0ZWFkICovXG5jb25zdCBkZWJvdW5jZWRXYXRjaCA9IHdhdGNoRGVib3VuY2VkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaERlZXAvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHdhdGNoaW5nIHZhbHVlIHdpdGgge2RlZXA6IHRydWV9XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3dhdGNoRGVlcFxuKi9cbmZ1bmN0aW9uIHdhdGNoRGVlcChzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG5cdHJldHVybiB3YXRjaChzb3VyY2UsIGNiLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRkZWVwOiB0cnVlXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaElnbm9yYWJsZS9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hJZ25vcmFibGUoc291cmNlLCBjYiwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZXZlbnRGaWx0ZXIgPSBieXBhc3NGaWx0ZXIsLi4ud2F0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRjb25zdCBmaWx0ZXJlZENiID0gY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgY2IpO1xuXHRsZXQgaWdub3JlVXBkYXRlcztcblx0bGV0IGlnbm9yZVByZXZBc3luY1VwZGF0ZXM7XG5cdGxldCBzdG9wO1xuXHRpZiAod2F0Y2hPcHRpb25zLmZsdXNoID09PSBcInN5bmNcIikge1xuXHRcdGxldCBpZ25vcmUgPSBmYWxzZTtcblx0XHRpZ25vcmVQcmV2QXN5bmNVcGRhdGVzID0gKCkgPT4ge307XG5cdFx0aWdub3JlVXBkYXRlcyA9ICh1cGRhdGVyKSA9PiB7XG5cdFx0XHRpZ25vcmUgPSB0cnVlO1xuXHRcdFx0dXBkYXRlcigpO1xuXHRcdFx0aWdub3JlID0gZmFsc2U7XG5cdFx0fTtcblx0XHRzdG9wID0gd2F0Y2goc291cmNlLCAoLi4uYXJncykgPT4ge1xuXHRcdFx0aWYgKCFpZ25vcmUpIGZpbHRlcmVkQ2IoLi4uYXJncyk7XG5cdFx0fSwgd2F0Y2hPcHRpb25zKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBkaXNwb3NhYmxlcyA9IFtdO1xuXHRcdGxldCBpZ25vcmVDb3VudGVyID0gMDtcblx0XHRsZXQgc3luY0NvdW50ZXIgPSAwO1xuXHRcdGlnbm9yZVByZXZBc3luY1VwZGF0ZXMgPSAoKSA9PiB7XG5cdFx0XHRpZ25vcmVDb3VudGVyID0gc3luY0NvdW50ZXI7XG5cdFx0fTtcblx0XHRkaXNwb3NhYmxlcy5wdXNoKHdhdGNoKHNvdXJjZSwgKCkgPT4ge1xuXHRcdFx0c3luY0NvdW50ZXIrKztcblx0XHR9LCB7XG5cdFx0XHQuLi53YXRjaE9wdGlvbnMsXG5cdFx0XHRmbHVzaDogXCJzeW5jXCJcblx0XHR9KSk7XG5cdFx0aWdub3JlVXBkYXRlcyA9ICh1cGRhdGVyKSA9PiB7XG5cdFx0XHRjb25zdCBzeW5jQ291bnRlclByZXYgPSBzeW5jQ291bnRlcjtcblx0XHRcdHVwZGF0ZXIoKTtcblx0XHRcdGlnbm9yZUNvdW50ZXIgKz0gc3luY0NvdW50ZXIgLSBzeW5jQ291bnRlclByZXY7XG5cdFx0fTtcblx0XHRkaXNwb3NhYmxlcy5wdXNoKHdhdGNoKHNvdXJjZSwgKC4uLmFyZ3MpID0+IHtcblx0XHRcdGNvbnN0IGlnbm9yZSA9IGlnbm9yZUNvdW50ZXIgPiAwICYmIGlnbm9yZUNvdW50ZXIgPT09IHN5bmNDb3VudGVyO1xuXHRcdFx0aWdub3JlQ291bnRlciA9IDA7XG5cdFx0XHRzeW5jQ291bnRlciA9IDA7XG5cdFx0XHRpZiAoaWdub3JlKSByZXR1cm47XG5cdFx0XHRmaWx0ZXJlZENiKC4uLmFyZ3MpO1xuXHRcdH0sIHdhdGNoT3B0aW9ucykpO1xuXHRcdHN0b3AgPSAoKSA9PiB7XG5cdFx0XHRkaXNwb3NhYmxlcy5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG5cdFx0fTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHN0b3AsXG5cdFx0aWdub3JlVXBkYXRlcyxcblx0XHRpZ25vcmVQcmV2QXN5bmNVcGRhdGVzXG5cdH07XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGB3YXRjaElnbm9yYWJsZWAgaW5zdGVhZCAqL1xuY29uc3QgaWdub3JhYmxlV2F0Y2ggPSB3YXRjaElnbm9yYWJsZTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hJbW1lZGlhdGUvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHdhdGNoaW5nIHZhbHVlIHdpdGgge2ltbWVkaWF0ZTogdHJ1ZX1cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvd2F0Y2hJbW1lZGlhdGVcbiovXG5mdW5jdGlvbiB3YXRjaEltbWVkaWF0ZShzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG5cdHJldHVybiB3YXRjaChzb3VyY2UsIGNiLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRpbW1lZGlhdGU6IHRydWVcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoT25jZS9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3Igd2F0Y2hpbmcgdmFsdWUgd2l0aCB7IG9uY2U6IHRydWUgfVxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy93YXRjaE9uY2VcbiovXG5mdW5jdGlvbiB3YXRjaE9uY2Uoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCBjYiwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0b25jZTogdHJ1ZVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hUaHJvdHRsZWQvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoVGhyb3R0bGVkKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocm90dGxlID0gMCwgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB3YXRjaFdpdGhGaWx0ZXIoc291cmNlLCBjYiwge1xuXHRcdC4uLndhdGNoT3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogdGhyb3R0bGVGaWx0ZXIodGhyb3R0bGUsIHRyYWlsaW5nLCBsZWFkaW5nKVxuXHR9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHdhdGNoVGhyb3R0bGVkYCBpbnN0ZWFkICovXG5jb25zdCB0aHJvdHRsZWRXYXRjaCA9IHdhdGNoVGhyb3R0bGVkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaFRyaWdnZXJhYmxlL2luZGV4LnRzXG5mdW5jdGlvbiB3YXRjaFRyaWdnZXJhYmxlKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgY2xlYW51cEZuO1xuXHRmdW5jdGlvbiBvbkVmZmVjdCgpIHtcblx0XHRpZiAoIWNsZWFudXBGbikgcmV0dXJuO1xuXHRcdGNvbnN0IGZuID0gY2xlYW51cEZuO1xuXHRcdGNsZWFudXBGbiA9IHZvaWQgMDtcblx0XHRmbigpO1xuXHR9XG5cdC8qKiBSZWdpc3RlciB0aGUgZnVuY3Rpb24gYGNsZWFudXBGbmAgKi9cblx0ZnVuY3Rpb24gb25DbGVhbnVwKGNhbGxiYWNrKSB7XG5cdFx0Y2xlYW51cEZuID0gY2FsbGJhY2s7XG5cdH1cblx0Y29uc3QgX2NiID0gKHZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xuXHRcdG9uRWZmZWN0KCk7XG5cdFx0cmV0dXJuIGNiKHZhbHVlLCBvbGRWYWx1ZSwgb25DbGVhbnVwKTtcblx0fTtcblx0Y29uc3QgcmVzID0gd2F0Y2hJZ25vcmFibGUoc291cmNlLCBfY2IsIG9wdGlvbnMpO1xuXHRjb25zdCB7IGlnbm9yZVVwZGF0ZXMgfSA9IHJlcztcblx0Y29uc3QgdHJpZ2dlciA9ICgpID0+IHtcblx0XHRsZXQgcmVzJDE7XG5cdFx0aWdub3JlVXBkYXRlcygoKSA9PiB7XG5cdFx0XHRyZXMkMSA9IF9jYihnZXRXYXRjaFNvdXJjZXMoc291cmNlKSwgZ2V0T2xkVmFsdWUoc291cmNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHJlcyQxO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdC4uLnJlcyxcblx0XHR0cmlnZ2VyXG5cdH07XG59XG5mdW5jdGlvbiBnZXRXYXRjaFNvdXJjZXMoc291cmNlcykge1xuXHRpZiAoaXNSZWFjdGl2ZShzb3VyY2VzKSkgcmV0dXJuIHNvdXJjZXM7XG5cdGlmIChBcnJheS5pc0FycmF5KHNvdXJjZXMpKSByZXR1cm4gc291cmNlcy5tYXAoKGl0ZW0pID0+IHRvVmFsdWUoaXRlbSkpO1xuXHRyZXR1cm4gdG9WYWx1ZShzb3VyY2VzKTtcbn1cbmZ1bmN0aW9uIGdldE9sZFZhbHVlKHNvdXJjZSkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheShzb3VyY2UpID8gc291cmNlLm1hcCgoKSA9PiB2b2lkIDApIDogdm9pZCAwO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3aGVuZXZlci9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3Igd2F0Y2hpbmcgdmFsdWUgdG8gYmUgdHJ1dGh5XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3doZW5ldmVyXG4qL1xuZnVuY3Rpb24gd2hlbmV2ZXIoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRjb25zdCBzdG9wID0gd2F0Y2goc291cmNlLCAodiwgb3YsIG9uSW52YWxpZGF0ZSkgPT4ge1xuXHRcdGlmICh2KSB7XG5cdFx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9uY2UpIG5leHRUaWNrKCgpID0+IHN0b3AoKSk7XG5cdFx0XHRjYih2LCBvdiwgb25JbnZhbGlkYXRlKTtcblx0XHR9XG5cdH0sIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdG9uY2U6IGZhbHNlXG5cdH0pO1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBhc3NlcnQsIGF1dG9SZXNldFJlZiwgYnlwYXNzRmlsdGVyLCBjYW1lbGl6ZSwgY2xhbXAsIGNvbXB1dGVkRWFnZXIsIGNvbXB1dGVkV2l0aENvbnRyb2wsIGNvbnRhaW5zUHJvcCwgY29udHJvbGxlZENvbXB1dGVkLCBjb250cm9sbGVkUmVmLCBjcmVhdGVFdmVudEhvb2ssIGNyZWF0ZUZpbHRlcldyYXBwZXIsIGNyZWF0ZUdsb2JhbFN0YXRlLCBjcmVhdGVJbmplY3Rpb25TdGF0ZSwgY3JlYXRlUmVhY3RpdmVGbiwgY3JlYXRlUmVmLCBjcmVhdGVTaGFyZWRDb21wb3NhYmxlLCBjcmVhdGVTaW5nbGV0b25Qcm9taXNlLCBkZWJvdW5jZUZpbHRlciwgZGVib3VuY2VkUmVmLCBkZWJvdW5jZWRXYXRjaCwgZWFnZXJDb21wdXRlZCwgZXh0ZW5kUmVmLCBmb3JtYXREYXRlLCBnZXQsIGdldExpZmVDeWNsZVRhcmdldCwgaGFzT3duLCBoeXBoZW5hdGUsIGlkZW50aXR5LCBpZ25vcmFibGVXYXRjaCwgaW5jcmVhc2VXaXRoVW5pdCwgaW5qZWN0TG9jYWwsIGludm9rZSwgaXNDbGllbnQsIGlzRGVmLCBpc0RlZmluZWQsIGlzSU9TLCBpc09iamVjdCwgaXNXb3JrZXIsIG1ha2VEZXN0cnVjdHVyYWJsZSwgbm9vcCwgbm9ybWFsaXplRGF0ZSwgbm90TnVsbGlzaCwgbm93LCBvYmplY3RFbnRyaWVzLCBvYmplY3RPbWl0LCBvYmplY3RQaWNrLCBwYXVzYWJsZUZpbHRlciwgcGF1c2FibGVXYXRjaCwgcHJvbWlzZVRpbWVvdXQsIHByb3ZpZGVMb2NhbCwgcHhWYWx1ZSwgcmFuZCwgcmVhY3RpZnksIHJlYWN0aWZ5T2JqZWN0LCByZWFjdGl2ZUNvbXB1dGVkLCByZWFjdGl2ZU9taXQsIHJlYWN0aXZlUGljaywgcmVmQXV0b1Jlc2V0LCByZWZEZWJvdW5jZWQsIHJlZkRlZmF1bHQsIHJlZk1hbnVhbFJlc2V0LCByZWZUaHJvdHRsZWQsIHJlZldpdGhDb250cm9sLCBzZXQsIHN5bmNSZWYsIHN5bmNSZWZzLCB0aHJvdHRsZUZpbHRlciwgdGhyb3R0bGVkUmVmLCB0aHJvdHRsZWRXYXRjaCwgdGltZXN0YW1wLCB0b0FycmF5LCB0b1JlYWN0aXZlLCB0b1JlZiwgdG9SZWZzLCB0cnlPbkJlZm9yZU1vdW50LCB0cnlPbkJlZm9yZVVubW91bnQsIHRyeU9uTW91bnRlZCwgdHJ5T25TY29wZURpc3Bvc2UsIHRyeU9uVW5tb3VudGVkLCB1bnRpbCwgdXNlQXJyYXlEaWZmZXJlbmNlLCB1c2VBcnJheUV2ZXJ5LCB1c2VBcnJheUZpbHRlciwgdXNlQXJyYXlGaW5kLCB1c2VBcnJheUZpbmRJbmRleCwgdXNlQXJyYXlGaW5kTGFzdCwgdXNlQXJyYXlJbmNsdWRlcywgdXNlQXJyYXlKb2luLCB1c2VBcnJheU1hcCwgdXNlQXJyYXlSZWR1Y2UsIHVzZUFycmF5U29tZSwgdXNlQXJyYXlVbmlxdWUsIHVzZUNvdW50ZXIsIHVzZURhdGVGb3JtYXQsIHVzZURlYm91bmNlLCB1c2VEZWJvdW5jZUZuLCB1c2VJbnRlcnZhbCwgdXNlSW50ZXJ2YWxGbiwgdXNlTGFzdENoYW5nZWQsIHVzZVRocm90dGxlLCB1c2VUaHJvdHRsZUZuLCB1c2VUaW1lb3V0LCB1c2VUaW1lb3V0Rm4sIHVzZVRvTnVtYmVyLCB1c2VUb1N0cmluZywgdXNlVG9nZ2xlLCB3YXRjaEFycmF5LCB3YXRjaEF0TW9zdCwgd2F0Y2hEZWJvdW5jZWQsIHdhdGNoRGVlcCwgd2F0Y2hJZ25vcmFibGUsIHdhdGNoSW1tZWRpYXRlLCB3YXRjaE9uY2UsIHdhdGNoUGF1c2FibGUsIHdhdGNoVGhyb3R0bGVkLCB3YXRjaFRyaWdnZXJhYmxlLCB3YXRjaFdpdGhGaWx0ZXIsIHdoZW5ldmVyIH07IiwiaW1wb3J0IHsgYnlwYXNzRmlsdGVyLCBjYW1lbGl6ZSwgY2xhbXAsIGNvbXB1dGVkV2l0aENvbnRyb2wsIGNvbnRhaW5zUHJvcCwgY3JlYXRlRXZlbnRIb29rLCBjcmVhdGVGaWx0ZXJXcmFwcGVyLCBjcmVhdGVSZWYsIGNyZWF0ZVNpbmdsZXRvblByb21pc2UsIGRlYm91bmNlRmlsdGVyLCBoYXNPd24sIGlkZW50aXR5LCBpbmNyZWFzZVdpdGhVbml0LCBpbmplY3RMb2NhbCwgaXNDbGllbnQsIGlzRGVmLCBpc0lPUywgaXNPYmplY3QsIGlzV29ya2VyLCBtYWtlRGVzdHJ1Y3R1cmFibGUsIG5vb3AsIG5vdE51bGxpc2gsIG9iamVjdEVudHJpZXMsIG9iamVjdE9taXQsIG9iamVjdFBpY2ssIHBhdXNhYmxlRmlsdGVyLCBwcm9taXNlVGltZW91dCwgcHJvdmlkZUxvY2FsLCBweFZhbHVlLCBzeW5jUmVmLCB0aHJvdHRsZUZpbHRlciwgdGltZXN0YW1wLCB0b0FycmF5LCB0b1JlZiwgdG9SZWZzLCB0cnlPbk1vdW50ZWQsIHRyeU9uU2NvcGVEaXNwb3NlLCB0cnlPblVubW91bnRlZCwgdW50aWwsIHVzZURlYm91bmNlRm4sIHVzZUludGVydmFsRm4sIHVzZVRocm90dGxlRm4sIHVzZVRpbWVvdXRGbiwgd2F0Y2hJZ25vcmFibGUsIHdhdGNoSW1tZWRpYXRlLCB3YXRjaE9uY2UsIHdhdGNoUGF1c2FibGUsIHdhdGNoV2l0aEZpbHRlciwgd2hlbmV2ZXIgfSBmcm9tIFwiQHZ1ZXVzZS9zaGFyZWRcIjtcbmltcG9ydCB7IEZyYWdtZW50LCBUcmFuc2l0aW9uR3JvdXAsIGNvbXB1dGVkLCBjdXN0b21SZWYsIGRlZmluZUNvbXBvbmVudCwgZ2V0Q3VycmVudEluc3RhbmNlLCBnZXRDdXJyZW50U2NvcGUsIGgsIGhhc0luamVjdGlvbkNvbnRleHQsIGluamVjdCwgaXNSZWFkb25seSwgaXNSZWYsIG1hcmtSYXcsIG5leHRUaWNrLCBvbkJlZm9yZVVwZGF0ZSwgb25Nb3VudGVkLCBvblVwZGF0ZWQsIHJlYWN0aXZlLCByZWFkb25seSwgcmVmLCBzaGFsbG93UmVhY3RpdmUsIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgdG9SYXcsIHRvVmFsdWUsIHVucmVmLCB3YXRjaCwgd2F0Y2hFZmZlY3QgfSBmcm9tIFwidnVlXCI7XG5cbmV4cG9ydCAqIGZyb20gXCJAdnVldXNlL3NoYXJlZFwiXG5cbi8vI3JlZ2lvbiBjb21wdXRlZEFzeW5jL2luZGV4LnRzXG5mdW5jdGlvbiBjb21wdXRlZEFzeW5jKGV2YWx1YXRpb25DYWxsYmFjaywgaW5pdGlhbFN0YXRlLCBvcHRpb25zT3JSZWYpIHtcblx0dmFyIF9nbG9iYWxUaGlzJHJlcG9ydEVycjtcblx0bGV0IG9wdGlvbnM7XG5cdGlmIChpc1JlZihvcHRpb25zT3JSZWYpKSBvcHRpb25zID0geyBldmFsdWF0aW5nOiBvcHRpb25zT3JSZWYgfTtcblx0ZWxzZSBvcHRpb25zID0gb3B0aW9uc09yUmVmIHx8IHt9O1xuXHRjb25zdCB7IGxhenkgPSBmYWxzZSwgZmx1c2ggPSBcInN5bmNcIiwgZXZhbHVhdGluZyA9IHZvaWQgMCwgc2hhbGxvdyA9IHRydWUsIG9uRXJyb3IgPSAoX2dsb2JhbFRoaXMkcmVwb3J0RXJyID0gZ2xvYmFsVGhpcy5yZXBvcnRFcnJvcikgIT09IG51bGwgJiYgX2dsb2JhbFRoaXMkcmVwb3J0RXJyICE9PSB2b2lkIDAgPyBfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgOiBub29wIH0gPSBvcHRpb25zO1xuXHRjb25zdCBzdGFydGVkID0gc2hhbGxvd1JlZighbGF6eSk7XG5cdGNvbnN0IGN1cnJlbnQgPSBzaGFsbG93ID8gc2hhbGxvd1JlZihpbml0aWFsU3RhdGUpIDogcmVmKGluaXRpYWxTdGF0ZSk7XG5cdGxldCBjb3VudGVyID0gMDtcblx0d2F0Y2hFZmZlY3QoYXN5bmMgKG9uSW52YWxpZGF0ZSkgPT4ge1xuXHRcdGlmICghc3RhcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGNvdW50ZXIrKztcblx0XHRjb25zdCBjb3VudGVyQXRCZWdpbm5pbmcgPSBjb3VudGVyO1xuXHRcdGxldCBoYXNGaW5pc2hlZCA9IGZhbHNlO1xuXHRcdGlmIChldmFsdWF0aW5nKSBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcblx0XHRcdGV2YWx1YXRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBldmFsdWF0aW9uQ2FsbGJhY2soKGNhbmNlbENhbGxiYWNrKSA9PiB7XG5cdFx0XHRcdG9uSW52YWxpZGF0ZSgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGV2YWx1YXRpbmcpIGV2YWx1YXRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAoIWhhc0ZpbmlzaGVkKSBjYW5jZWxDYWxsYmFjaygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGNvdW50ZXJBdEJlZ2lubmluZyA9PT0gY291bnRlcikgY3VycmVudC52YWx1ZSA9IHJlc3VsdDtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoZXZhbHVhdGluZyAmJiBjb3VudGVyQXRCZWdpbm5pbmcgPT09IGNvdW50ZXIpIGV2YWx1YXRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdGhhc0ZpbmlzaGVkID0gdHJ1ZTtcblx0XHR9XG5cdH0sIHsgZmx1c2ggfSk7XG5cdGlmIChsYXp5KSByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHN0YXJ0ZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBjdXJyZW50LnZhbHVlO1xuXHR9KTtcblx0ZWxzZSByZXR1cm4gY3VycmVudDtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYGNvbXB1dGVkQXN5bmNgIGluc3RlYWQgKi9cbmNvbnN0IGFzeW5jQ29tcHV0ZWQgPSBjb21wdXRlZEFzeW5jO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjb21wdXRlZEluamVjdC9pbmRleC50c1xuZnVuY3Rpb24gY29tcHV0ZWRJbmplY3Qoa2V5LCBvcHRpb25zLCBkZWZhdWx0U291cmNlLCB0cmVhdERlZmF1bHRBc0ZhY3RvcnkpIHtcblx0bGV0IHNvdXJjZSA9IGluamVjdChrZXkpO1xuXHRpZiAoZGVmYXVsdFNvdXJjZSkgc291cmNlID0gaW5qZWN0KGtleSwgZGVmYXVsdFNvdXJjZSk7XG5cdGlmICh0cmVhdERlZmF1bHRBc0ZhY3RvcnkpIHNvdXJjZSA9IGluamVjdChrZXksIGRlZmF1bHRTb3VyY2UsIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSk7XG5cdGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gY29tcHV0ZWQoKG9sZFZhbHVlKSA9PiBvcHRpb25zKHNvdXJjZSwgb2xkVmFsdWUpKTtcblx0ZWxzZSByZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldDogKG9sZFZhbHVlKSA9PiBvcHRpb25zLmdldChzb3VyY2UsIG9sZFZhbHVlKSxcblx0XHRzZXQ6IG9wdGlvbnMuc2V0XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVSZXVzYWJsZVRlbXBsYXRlL2luZGV4LnRzXG4vKipcbiogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGBkZWZpbmVgIGFuZCBgcmV1c2VgIGNvbXBvbmVudHMgaW4gcGFpcixcbiogSXQgYWxzbyBhbGxvdyB0byBwYXNzIGEgZ2VuZXJpYyB0byBiaW5kIHdpdGggdHlwZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlUmV1c2FibGVUZW1wbGF0ZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldXNhYmxlVGVtcGxhdGUob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5oZXJpdEF0dHJzID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcmVuZGVyID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBkZWZpbmUgPSBkZWZpbmVDb21wb25lbnQoeyBzZXR1cChfLCB7IHNsb3RzIH0pIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0cmVuZGVyLnZhbHVlID0gc2xvdHMuZGVmYXVsdDtcblx0XHR9O1xuXHR9IH0pO1xuXHRjb25zdCByZXVzZSA9IGRlZmluZUNvbXBvbmVudCh7XG5cdFx0aW5oZXJpdEF0dHJzLFxuXHRcdHByb3BzOiBvcHRpb25zLnByb3BzLFxuXHRcdHNldHVwKHByb3BzLCB7IGF0dHJzLCBzbG90cyB9KSB7XG5cdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHR2YXIgX3JlbmRlciR2YWx1ZTtcblx0XHRcdFx0aWYgKCFyZW5kZXIudmFsdWUgJiYgdHJ1ZSkgdGhyb3cgbmV3IEVycm9yKFwiW1Z1ZVVzZV0gRmFpbGVkIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gb2YgcmV1c2FibGUgdGVtcGxhdGVcIik7XG5cdFx0XHRcdGNvbnN0IHZub2RlID0gKF9yZW5kZXIkdmFsdWUgPSByZW5kZXIudmFsdWUpID09PSBudWxsIHx8IF9yZW5kZXIkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yZW5kZXIkdmFsdWUuY2FsbChyZW5kZXIsIHtcblx0XHRcdFx0XHQuLi5vcHRpb25zLnByb3BzID09IG51bGwgPyBrZXlzVG9DYW1lbEtlYmFiQ2FzZShhdHRycykgOiBwcm9wcyxcblx0XHRcdFx0XHQkc2xvdHM6IHNsb3RzXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gaW5oZXJpdEF0dHJzICYmICh2bm9kZSA9PT0gbnVsbCB8fCB2bm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdm5vZGUubGVuZ3RoKSA9PT0gMSA/IHZub2RlWzBdIDogdm5vZGU7XG5cdFx0XHR9O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBtYWtlRGVzdHJ1Y3R1cmFibGUoe1xuXHRcdGRlZmluZSxcblx0XHRyZXVzZVxuXHR9LCBbZGVmaW5lLCByZXVzZV0pO1xufVxuZnVuY3Rpb24ga2V5c1RvQ2FtZWxLZWJhYkNhc2Uob2JqKSB7XG5cdGNvbnN0IG5ld09iaiA9IHt9O1xuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmopIG5ld09ialtjYW1lbGl6ZShrZXkpXSA9IG9ialtrZXldO1xuXHRyZXR1cm4gbmV3T2JqO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVUZW1wbGF0ZVByb21pc2UvaW5kZXgudHNcbi8qKlxuKiBDcmVhdGVzIGEgdGVtcGxhdGUgcHJvbWlzZSBjb21wb25lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZVRlbXBsYXRlUHJvbWlzZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVRlbXBsYXRlUHJvbWlzZShvcHRpb25zID0ge30pIHtcblx0bGV0IGluZGV4ID0gMDtcblx0Y29uc3QgaW5zdGFuY2VzID0gcmVmKFtdKTtcblx0ZnVuY3Rpb24gY3JlYXRlKC4uLmFyZ3MpIHtcblx0XHRjb25zdCBwcm9wcyA9IHNoYWxsb3dSZWFjdGl2ZSh7XG5cdFx0XHRrZXk6IGluZGV4KyssXG5cdFx0XHRhcmdzLFxuXHRcdFx0cHJvbWlzZTogdm9pZCAwLFxuXHRcdFx0cmVzb2x2ZTogKCkgPT4ge30sXG5cdFx0XHRyZWplY3Q6ICgpID0+IHt9LFxuXHRcdFx0aXNSZXNvbHZpbmc6IGZhbHNlLFxuXHRcdFx0b3B0aW9uc1xuXHRcdH0pO1xuXHRcdGluc3RhbmNlcy52YWx1ZS5wdXNoKHByb3BzKTtcblx0XHRwcm9wcy5wcm9taXNlID0gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG5cdFx0XHRwcm9wcy5yZXNvbHZlID0gKHYpID0+IHtcblx0XHRcdFx0cHJvcHMuaXNSZXNvbHZpbmcgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gX3Jlc29sdmUodik7XG5cdFx0XHR9O1xuXHRcdFx0cHJvcHMucmVqZWN0ID0gX3JlamVjdDtcblx0XHR9KS5maW5hbGx5KCgpID0+IHtcblx0XHRcdHByb3BzLnByb21pc2UgPSB2b2lkIDA7XG5cdFx0XHRjb25zdCBpbmRleCQxID0gaW5zdGFuY2VzLnZhbHVlLmluZGV4T2YocHJvcHMpO1xuXHRcdFx0aWYgKGluZGV4JDEgIT09IC0xKSBpbnN0YW5jZXMudmFsdWUuc3BsaWNlKGluZGV4JDEsIDEpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcm9wcy5wcm9taXNlO1xuXHR9XG5cdGZ1bmN0aW9uIHN0YXJ0KC4uLmFyZ3MpIHtcblx0XHRpZiAob3B0aW9ucy5zaW5nbGV0b24gJiYgaW5zdGFuY2VzLnZhbHVlLmxlbmd0aCA+IDApIHJldHVybiBpbnN0YW5jZXMudmFsdWVbMF0ucHJvbWlzZTtcblx0XHRyZXR1cm4gY3JlYXRlKC4uLmFyZ3MpO1xuXHR9XG5cdGNvbnN0IGNvbXBvbmVudCA9IGRlZmluZUNvbXBvbmVudCgoXywgeyBzbG90cyB9KSA9PiB7XG5cdFx0Y29uc3QgcmVuZGVyTGlzdCA9ICgpID0+IGluc3RhbmNlcy52YWx1ZS5tYXAoKHByb3BzKSA9PiB7XG5cdFx0XHR2YXIgX3Nsb3RzJGRlZmF1bHQ7XG5cdFx0XHRyZXR1cm4gaChGcmFnbWVudCwgeyBrZXk6IHByb3BzLmtleSB9LCAoX3Nsb3RzJGRlZmF1bHQgPSBzbG90cy5kZWZhdWx0KSA9PT0gbnVsbCB8fCBfc2xvdHMkZGVmYXVsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Nsb3RzJGRlZmF1bHQuY2FsbChzbG90cywgcHJvcHMpKTtcblx0XHR9KTtcblx0XHRpZiAob3B0aW9ucy50cmFuc2l0aW9uKSByZXR1cm4gKCkgPT4gaChUcmFuc2l0aW9uR3JvdXAsIG9wdGlvbnMudHJhbnNpdGlvbiwgcmVuZGVyTGlzdCk7XG5cdFx0cmV0dXJuIHJlbmRlckxpc3Q7XG5cdH0pO1xuXHRjb21wb25lbnQuc3RhcnQgPSBzdGFydDtcblx0cmV0dXJuIGNvbXBvbmVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlVW5yZWZGbi9pbmRleC50c1xuLyoqXG4qIE1ha2UgYSBwbGFpbiBmdW5jdGlvbiBhY2NlcHRpbmcgcmVmIGFuZCByYXcgdmFsdWVzIGFzIGFyZ3VtZW50cy5cbiogUmV0dXJucyB0aGUgc2FtZSB2YWx1ZSB0aGUgdW5jb252ZXJ0ZWQgZnVuY3Rpb24gcmV0dXJucywgd2l0aCBwcm9wZXIgdHlwaW5nLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVVucmVmRm4oZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0XHRyZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncy5tYXAoKGkpID0+IHRvVmFsdWUoaSkpKTtcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gX2NvbmZpZ3VyYWJsZS50c1xuY29uc3QgZGVmYXVsdFdpbmRvdyA9IGlzQ2xpZW50ID8gd2luZG93IDogdm9pZCAwO1xuY29uc3QgZGVmYXVsdERvY3VtZW50ID0gaXNDbGllbnQgPyB3aW5kb3cuZG9jdW1lbnQgOiB2b2lkIDA7XG5jb25zdCBkZWZhdWx0TmF2aWdhdG9yID0gaXNDbGllbnQgPyB3aW5kb3cubmF2aWdhdG9yIDogdm9pZCAwO1xuY29uc3QgZGVmYXVsdExvY2F0aW9uID0gaXNDbGllbnQgPyB3aW5kb3cubG9jYXRpb24gOiB2b2lkIDA7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVucmVmRWxlbWVudC9pbmRleC50c1xuLyoqXG4qIEdldCB0aGUgZG9tIGVsZW1lbnQgb2YgYSByZWYgb2YgZWxlbWVudCBvciBWdWUgY29tcG9uZW50IGluc3RhbmNlXG4qXG4qIEBwYXJhbSBlbFJlZlxuKi9cbmZ1bmN0aW9uIHVucmVmRWxlbWVudChlbFJlZikge1xuXHR2YXIgXyRlbDtcblx0Y29uc3QgcGxhaW4gPSB0b1ZhbHVlKGVsUmVmKTtcblx0cmV0dXJuIChfJGVsID0gcGxhaW4gPT09IG51bGwgfHwgcGxhaW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBsYWluLiRlbCkgIT09IG51bGwgJiYgXyRlbCAhPT0gdm9pZCAwID8gXyRlbCA6IHBsYWluO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFdmVudExpc3RlbmVyL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VFdmVudExpc3RlbmVyKC4uLmFyZ3MpIHtcblx0Y29uc3QgcmVnaXN0ZXIgPSAoZWwsIGV2ZW50LCBsaXN0ZW5lciwgb3B0aW9ucykgPT4ge1xuXHRcdGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zKTtcblx0XHRyZXR1cm4gKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuXHR9O1xuXHRjb25zdCBmaXJzdFBhcmFtVGFyZ2V0cyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB0ZXN0ID0gdG9BcnJheSh0b1ZhbHVlKGFyZ3NbMF0pKS5maWx0ZXIoKGUpID0+IGUgIT0gbnVsbCk7XG5cdFx0cmV0dXJuIHRlc3QuZXZlcnkoKGUpID0+IHR5cGVvZiBlICE9PSBcInN0cmluZ1wiKSA/IHRlc3QgOiB2b2lkIDA7XG5cdH0pO1xuXHRyZXR1cm4gd2F0Y2hJbW1lZGlhdGUoKCkgPT4ge1xuXHRcdHZhciBfZmlyc3RQYXJhbVRhcmdldHMkdmEsIF9maXJzdFBhcmFtVGFyZ2V0cyR2YTI7XG5cdFx0cmV0dXJuIFtcblx0XHRcdChfZmlyc3RQYXJhbVRhcmdldHMkdmEgPSAoX2ZpcnN0UGFyYW1UYXJnZXRzJHZhMiA9IGZpcnN0UGFyYW1UYXJnZXRzLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlyc3RQYXJhbVRhcmdldHMkdmEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlyc3RQYXJhbVRhcmdldHMkdmEyLm1hcCgoZSkgPT4gdW5yZWZFbGVtZW50KGUpKSkgIT09IG51bGwgJiYgX2ZpcnN0UGFyYW1UYXJnZXRzJHZhICE9PSB2b2lkIDAgPyBfZmlyc3RQYXJhbVRhcmdldHMkdmEgOiBbZGVmYXVsdFdpbmRvd10uZmlsdGVyKChlKSA9PiBlICE9IG51bGwpLFxuXHRcdFx0dG9BcnJheSh0b1ZhbHVlKGZpcnN0UGFyYW1UYXJnZXRzLnZhbHVlID8gYXJnc1sxXSA6IGFyZ3NbMF0pKSxcblx0XHRcdHRvQXJyYXkodW5yZWYoZmlyc3RQYXJhbVRhcmdldHMudmFsdWUgPyBhcmdzWzJdIDogYXJnc1sxXSkpLFxuXHRcdFx0dG9WYWx1ZShmaXJzdFBhcmFtVGFyZ2V0cy52YWx1ZSA/IGFyZ3NbM10gOiBhcmdzWzJdKVxuXHRcdF07XG5cdH0sIChbcmF3X3RhcmdldHMsIHJhd19ldmVudHMsIHJhd19saXN0ZW5lcnMsIHJhd19vcHRpb25zXSwgXywgb25DbGVhbnVwKSA9PiB7XG5cdFx0aWYgKCEocmF3X3RhcmdldHMgPT09IG51bGwgfHwgcmF3X3RhcmdldHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd190YXJnZXRzLmxlbmd0aCkgfHwgIShyYXdfZXZlbnRzID09PSBudWxsIHx8IHJhd19ldmVudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd19ldmVudHMubGVuZ3RoKSB8fCAhKHJhd19saXN0ZW5lcnMgPT09IG51bGwgfHwgcmF3X2xpc3RlbmVycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmF3X2xpc3RlbmVycy5sZW5ndGgpKSByZXR1cm47XG5cdFx0Y29uc3Qgb3B0aW9uc0Nsb25lID0gaXNPYmplY3QocmF3X29wdGlvbnMpID8geyAuLi5yYXdfb3B0aW9ucyB9IDogcmF3X29wdGlvbnM7XG5cdFx0Y29uc3QgY2xlYW51cHMgPSByYXdfdGFyZ2V0cy5mbGF0TWFwKChlbCkgPT4gcmF3X2V2ZW50cy5mbGF0TWFwKChldmVudCkgPT4gcmF3X2xpc3RlbmVycy5tYXAoKGxpc3RlbmVyKSA9PiByZWdpc3RlcihlbCwgZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zQ2xvbmUpKSkpO1xuXHRcdG9uQ2xlYW51cCgoKSA9PiB7XG5cdFx0XHRjbGVhbnVwcy5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG5cdFx0fSk7XG5cdH0sIHsgZmx1c2g6IFwicG9zdFwiIH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBvbkNsaWNrT3V0c2lkZS9pbmRleC50c1xubGV0IF9pT1NXb3JrYXJvdW5kID0gZmFsc2U7XG5mdW5jdGlvbiBvbkNsaWNrT3V0c2lkZSh0YXJnZXQsIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpZ25vcmUgPSBbXSwgY2FwdHVyZSA9IHRydWUsIGRldGVjdElmcmFtZSA9IGZhbHNlLCBjb250cm9scyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRpZiAoIXdpbmRvdyQxKSByZXR1cm4gY29udHJvbHMgPyB7XG5cdFx0c3RvcDogbm9vcCxcblx0XHRjYW5jZWw6IG5vb3AsXG5cdFx0dHJpZ2dlcjogbm9vcFxuXHR9IDogbm9vcDtcblx0aWYgKGlzSU9TICYmICFfaU9TV29ya2Fyb3VuZCkge1xuXHRcdF9pT1NXb3JrYXJvdW5kID0gdHJ1ZTtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHRBcnJheS5mcm9tKHdpbmRvdyQxLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goKGVsKSA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgbm9vcCwgbGlzdGVuZXJPcHRpb25zKSk7XG5cdFx0d2luZG93JDEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBub29wLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGxldCBzaG91bGRMaXN0ZW4gPSB0cnVlO1xuXHRjb25zdCBzaG91bGRJZ25vcmUgPSAoZXZlbnQpID0+IHtcblx0XHRyZXR1cm4gdG9WYWx1ZShpZ25vcmUpLnNvbWUoKHRhcmdldCQxKSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIHRhcmdldCQxID09PSBcInN0cmluZ1wiKSByZXR1cm4gQXJyYXkuZnJvbSh3aW5kb3ckMS5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRhcmdldCQxKSkuc29tZSgoZWwpID0+IGVsID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoZWwpKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXQkMSk7XG5cdFx0XHRcdHJldHVybiBlbCAmJiAoZXZlbnQudGFyZ2V0ID09PSBlbCB8fCBldmVudC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhlbCkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0YXJnZXQgaGFzIG11bHRpcGxlIHJvb3QgZWxlbWVudHMuXG5cdCogUmVmZXJlbmNlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdGVzdC11dGlscy9ibG9iL2NjYjQ2MGJlNTVmOWY2YmUwNWFiNzA4NTAwYTQxZWM4YWRmNmY0YmMvc3JjL3Z1ZS13cmFwcGVyLnRzI0wyMVxuXHQqL1xuXHRmdW5jdGlvbiBoYXNNdWx0aXBsZVJvb3RzKHRhcmdldCQxKSB7XG5cdFx0Y29uc3Qgdm0gPSB0b1ZhbHVlKHRhcmdldCQxKTtcblx0XHRyZXR1cm4gdm0gJiYgdm0uJC5zdWJUcmVlLnNoYXBlRmxhZyA9PT0gMTY7XG5cdH1cblx0ZnVuY3Rpb24gY2hlY2tNdWx0aXBsZVJvb3RzKHRhcmdldCQxLCBldmVudCkge1xuXHRcdGNvbnN0IHZtID0gdG9WYWx1ZSh0YXJnZXQkMSk7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB2bS4kLnN1YlRyZWUgJiYgdm0uJC5zdWJUcmVlLmNoaWxkcmVuO1xuXHRcdGlmIChjaGlsZHJlbiA9PSBudWxsIHx8ICFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gY2hpbGQuZWwgPT09IGV2ZW50LnRhcmdldCB8fCBldmVudC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhjaGlsZC5lbCkpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRpZiAoZXZlbnQudGFyZ2V0ID09IG51bGwpIHJldHVybjtcblx0XHRpZiAoIShlbCBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIGhhc011bHRpcGxlUm9vdHModGFyZ2V0KSAmJiBjaGVja011bHRpcGxlUm9vdHModGFyZ2V0LCBldmVudCkpIHJldHVybjtcblx0XHRpZiAoIWVsIHx8IGVsID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoZWwpKSByZXR1cm47XG5cdFx0aWYgKFwiZGV0YWlsXCIgaW4gZXZlbnQgJiYgZXZlbnQuZGV0YWlsID09PSAwKSBzaG91bGRMaXN0ZW4gPSAhc2hvdWxkSWdub3JlKGV2ZW50KTtcblx0XHRpZiAoIXNob3VsZExpc3Rlbikge1xuXHRcdFx0c2hvdWxkTGlzdGVuID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGFuZGxlcihldmVudCk7XG5cdH07XG5cdGxldCBpc1Byb2Nlc3NpbmdDbGljayA9IGZhbHNlO1xuXHRjb25zdCBjbGVhbnVwID0gW1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiY2xpY2tcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRpZiAoIWlzUHJvY2Vzc2luZ0NsaWNrKSB7XG5cdFx0XHRcdGlzUHJvY2Vzc2luZ0NsaWNrID0gdHJ1ZTtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0aXNQcm9jZXNzaW5nQ2xpY2sgPSBmYWxzZTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdGxpc3RlbmVyKGV2ZW50KTtcblx0XHRcdH1cblx0XHR9LCB7XG5cdFx0XHRwYXNzaXZlOiB0cnVlLFxuXHRcdFx0Y2FwdHVyZVxuXHRcdH0pLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwicG9pbnRlcmRvd25cIiwgKGUpID0+IHtcblx0XHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0XHRzaG91bGRMaXN0ZW4gPSAhc2hvdWxkSWdub3JlKGUpICYmICEhKGVsICYmICFlLmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKGVsKSk7XG5cdFx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pLFxuXHRcdGRldGVjdElmcmFtZSAmJiB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImJsdXJcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dmFyIF93aW5kb3ckZG9jdW1lbnQkYWN0aTtcblx0XHRcdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRcdFx0aWYgKCgoX3dpbmRvdyRkb2N1bWVudCRhY3RpID0gd2luZG93JDEuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IG51bGwgfHwgX3dpbmRvdyRkb2N1bWVudCRhY3RpID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfd2luZG93JGRvY3VtZW50JGFjdGkudGFnTmFtZSkgPT09IFwiSUZSQU1FXCIgJiYgIShlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuY29udGFpbnMod2luZG93JDEuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpKSBoYW5kbGVyKGV2ZW50KTtcblx0XHRcdH0sIDApO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuXHRdLmZpbHRlcihCb29sZWFuKTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IGNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRpZiAoY29udHJvbHMpIHJldHVybiB7XG5cdFx0c3RvcCxcblx0XHRjYW5jZWw6ICgpID0+IHtcblx0XHRcdHNob3VsZExpc3RlbiA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0dHJpZ2dlcjogKGV2ZW50KSA9PiB7XG5cdFx0XHRzaG91bGRMaXN0ZW4gPSB0cnVlO1xuXHRcdFx0bGlzdGVuZXIoZXZlbnQpO1xuXHRcdFx0c2hvdWxkTGlzdGVuID0gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTW91bnRlZC9pbmRleC50c1xuLyoqXG4qIE1vdW50ZWQgc3RhdGUgaW4gcmVmLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNb3VudGVkXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTW91bnRlZCgpIHtcblx0Y29uc3QgaXNNb3VudGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGlmIChpbnN0YW5jZSkgb25Nb3VudGVkKCgpID0+IHtcblx0XHRpc01vdW50ZWQudmFsdWUgPSB0cnVlO1xuXHR9LCBpbnN0YW5jZSk7XG5cdHJldHVybiBpc01vdW50ZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN1cHBvcnRlZC9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZVN1cHBvcnRlZChjYWxsYmFjaykge1xuXHRjb25zdCBpc01vdW50ZWQgPSB1c2VNb3VudGVkKCk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aXNNb3VudGVkLnZhbHVlO1xuXHRcdHJldHVybiBCb29sZWFuKGNhbGxiYWNrKCkpO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTXV0YXRpb25PYnNlcnZlci9pbmRleC50c1xuLyoqXG4qIFdhdGNoIGZvciBjaGFuZ2VzIGJlaW5nIG1hZGUgdG8gdGhlIERPTSB0cmVlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNdXRhdGlvbk9ic2VydmVyXG4qIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL011dGF0aW9uT2JzZXJ2ZXIgTXV0YXRpb25PYnNlcnZlciBNRE5cbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gY2FsbGJhY2tcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VNdXRhdGlvbk9ic2VydmVyKHRhcmdldCwgY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LC4uLm11dGF0aW9uT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0bGV0IG9ic2VydmVyO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJNdXRhdGlvbk9ic2VydmVyXCIgaW4gd2luZG93JDEpO1xuXHRjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuXHRcdGlmIChvYnNlcnZlcikge1xuXHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0b2JzZXJ2ZXIgPSB2b2lkIDA7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaChjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgaXRlbXMgPSB0b0FycmF5KHRvVmFsdWUodGFyZ2V0KSkubWFwKHVucmVmRWxlbWVudCkuZmlsdGVyKG5vdE51bGxpc2gpO1xuXHRcdHJldHVybiBuZXcgU2V0KGl0ZW1zKTtcblx0fSksIChuZXdUYXJnZXRzKSA9PiB7XG5cdFx0Y2xlYW51cCgpO1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiBuZXdUYXJnZXRzLnNpemUpIHtcblx0XHRcdG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuXHRcdFx0bmV3VGFyZ2V0cy5mb3JFYWNoKChlbCkgPT4gb2JzZXJ2ZXIub2JzZXJ2ZShlbCwgbXV0YXRpb25PcHRpb25zKSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdGZsdXNoOiBcInBvc3RcIlxuXHR9KTtcblx0Y29uc3QgdGFrZVJlY29yZHMgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIG9ic2VydmVyID09PSBudWxsIHx8IG9ic2VydmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvYnNlcnZlci50YWtlUmVjb3JkcygpO1xuXHR9O1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdHN0b3BXYXRjaCgpO1xuXHRcdGNsZWFudXAoKTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c3RvcCxcblx0XHR0YWtlUmVjb3Jkc1xuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBvbkVsZW1lbnRSZW1vdmFsL2luZGV4LnRzXG4vKipcbiogRmlyZXMgd2hlbiB0aGUgZWxlbWVudCBvciBhbnkgZWxlbWVudCBjb250YWluaW5nIGl0IGlzIHJlbW92ZWQuXG4qXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIGNhbGxiYWNrXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gb25FbGVtZW50UmVtb3ZhbCh0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuZG9jdW1lbnQsIGZsdXNoID0gXCJzeW5jXCIgfSA9IG9wdGlvbnM7XG5cdGlmICghd2luZG93JDEgfHwgIWRvY3VtZW50JDEpIHJldHVybiBub29wO1xuXHRsZXQgc3RvcEZuO1xuXHRjb25zdCBjbGVhbnVwQW5kVXBkYXRlID0gKGZuKSA9PiB7XG5cdFx0c3RvcEZuID09PSBudWxsIHx8IHN0b3BGbiA9PT0gdm9pZCAwIHx8IHN0b3BGbigpO1xuXHRcdHN0b3BGbiA9IGZuO1xuXHR9O1xuXHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRpZiAoZWwpIHtcblx0XHRcdGNvbnN0IHsgc3RvcCB9ID0gdXNlTXV0YXRpb25PYnNlcnZlcihkb2N1bWVudCQxLCAobXV0YXRpb25zTGlzdCkgPT4ge1xuXHRcdFx0XHRpZiAobXV0YXRpb25zTGlzdC5tYXAoKG11dGF0aW9uKSA9PiBbLi4ubXV0YXRpb24ucmVtb3ZlZE5vZGVzXSkuZmxhdCgpLnNvbWUoKG5vZGUpID0+IG5vZGUgPT09IGVsIHx8IG5vZGUuY29udGFpbnMoZWwpKSkgY2FsbGJhY2sobXV0YXRpb25zTGlzdCk7XG5cdFx0XHR9LCB7XG5cdFx0XHRcdHdpbmRvdzogd2luZG93JDEsXG5cdFx0XHRcdGNoaWxkTGlzdDogdHJ1ZSxcblx0XHRcdFx0c3VidHJlZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0XHRjbGVhbnVwQW5kVXBkYXRlKHN0b3ApO1xuXHRcdH1cblx0fSwgeyBmbHVzaCB9KTtcblx0Y29uc3Qgc3RvcEhhbmRsZSA9ICgpID0+IHtcblx0XHRzdG9wV2F0Y2goKTtcblx0XHRjbGVhbnVwQW5kVXBkYXRlKCk7XG5cdH07XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHN0b3BIYW5kbGUpO1xuXHRyZXR1cm4gc3RvcEhhbmRsZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25LZXlTdHJva2UvaW5kZXgudHNcbmZ1bmN0aW9uIGNyZWF0ZUtleVByZWRpY2F0ZShrZXlGaWx0ZXIpIHtcblx0aWYgKHR5cGVvZiBrZXlGaWx0ZXIgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGtleUZpbHRlcjtcblx0ZWxzZSBpZiAodHlwZW9mIGtleUZpbHRlciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIChldmVudCkgPT4gZXZlbnQua2V5ID09PSBrZXlGaWx0ZXI7XG5cdGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoa2V5RmlsdGVyKSkgcmV0dXJuIChldmVudCkgPT4ga2V5RmlsdGVyLmluY2x1ZGVzKGV2ZW50LmtleSk7XG5cdHJldHVybiAoKSA9PiB0cnVlO1xufVxuZnVuY3Rpb24gb25LZXlTdHJva2UoLi4uYXJncykge1xuXHRsZXQga2V5O1xuXHRsZXQgaGFuZGxlcjtcblx0bGV0IG9wdGlvbnMgPSB7fTtcblx0aWYgKGFyZ3MubGVuZ3RoID09PSAzKSB7XG5cdFx0a2V5ID0gYXJnc1swXTtcblx0XHRoYW5kbGVyID0gYXJnc1sxXTtcblx0XHRvcHRpb25zID0gYXJnc1syXTtcblx0fSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikgaWYgKHR5cGVvZiBhcmdzWzFdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0a2V5ID0gdHJ1ZTtcblx0XHRoYW5kbGVyID0gYXJnc1swXTtcblx0XHRvcHRpb25zID0gYXJnc1sxXTtcblx0fSBlbHNlIHtcblx0XHRrZXkgPSBhcmdzWzBdO1xuXHRcdGhhbmRsZXIgPSBhcmdzWzFdO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGtleSA9IHRydWU7XG5cdFx0aGFuZGxlciA9IGFyZ3NbMF07XG5cdH1cblx0Y29uc3QgeyB0YXJnZXQgPSBkZWZhdWx0V2luZG93LCBldmVudE5hbWUgPSBcImtleWRvd25cIiwgcGFzc2l2ZSA9IGZhbHNlLCBkZWR1cGUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcHJlZGljYXRlID0gY3JlYXRlS2V5UHJlZGljYXRlKGtleSk7XG5cdGNvbnN0IGxpc3RlbmVyID0gKGUpID0+IHtcblx0XHRpZiAoZS5yZXBlYXQgJiYgdG9WYWx1ZShkZWR1cGUpKSByZXR1cm47XG5cdFx0aWYgKHByZWRpY2F0ZShlKSkgaGFuZGxlcihlKTtcblx0fTtcblx0cmV0dXJuIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBldmVudE5hbWUsIGxpc3RlbmVyLCBwYXNzaXZlKTtcbn1cbi8qKlxuKiBMaXN0ZW4gdG8gdGhlIGtleWRvd24gZXZlbnQgb2YgdGhlIGdpdmVuIGtleS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvb25LZXlTdHJva2VcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaGFuZGxlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uS2V5RG93bihrZXksIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb25LZXlTdHJva2Uoa2V5LCBoYW5kbGVyLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudE5hbWU6IFwia2V5ZG93blwiXG5cdH0pO1xufVxuLyoqXG4qIExpc3RlbiB0byB0aGUga2V5cHJlc3MgZXZlbnQgb2YgdGhlIGdpdmVuIGtleS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvb25LZXlTdHJva2VcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaGFuZGxlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uS2V5UHJlc3NlZChrZXksIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb25LZXlTdHJva2Uoa2V5LCBoYW5kbGVyLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudE5hbWU6IFwia2V5cHJlc3NcIlxuXHR9KTtcbn1cbi8qKlxuKiBMaXN0ZW4gdG8gdGhlIGtleXVwIGV2ZW50IG9mIHRoZSBnaXZlbiBrZXkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL29uS2V5U3Ryb2tlXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGhhbmRsZXJcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiBvbktleVVwKGtleSwgaGFuZGxlciwgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBvbktleVN0cm9rZShrZXksIGhhbmRsZXIsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGV2ZW50TmFtZTogXCJrZXl1cFwiXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBvbkxvbmdQcmVzcy9pbmRleC50c1xuY29uc3QgREVGQVVMVF9ERUxBWSA9IDUwMDtcbmNvbnN0IERFRkFVTFRfVEhSRVNIT0xEID0gMTA7XG5mdW5jdGlvbiBvbkxvbmdQcmVzcyh0YXJnZXQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcblx0dmFyIF9vcHRpb25zJG1vZGlmaWVyczEwLCBfb3B0aW9ucyRtb2RpZmllcnMxMTtcblx0Y29uc3QgZWxlbWVudFJlZiA9IGNvbXB1dGVkKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpKTtcblx0bGV0IHRpbWVvdXQ7XG5cdGxldCBwb3NTdGFydDtcblx0bGV0IHN0YXJ0VGltZXN0YW1wO1xuXHRsZXQgaGFzTG9uZ1ByZXNzZWQgPSBmYWxzZTtcblx0ZnVuY3Rpb24gY2xlYXIoKSB7XG5cdFx0aWYgKHRpbWVvdXQpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHRcdHRpbWVvdXQgPSB2b2lkIDA7XG5cdFx0fVxuXHRcdHBvc1N0YXJ0ID0gdm9pZCAwO1xuXHRcdHN0YXJ0VGltZXN0YW1wID0gdm9pZCAwO1xuXHRcdGhhc0xvbmdQcmVzc2VkID0gZmFsc2U7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0RGVsYXkoZXYpIHtcblx0XHRjb25zdCBkZWxheSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZWxheTtcblx0XHRpZiAodHlwZW9mIGRlbGF5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBkZWxheShldik7XG5cdFx0cmV0dXJuIGRlbGF5ICE9PSBudWxsICYmIGRlbGF5ICE9PSB2b2lkIDAgPyBkZWxheSA6IERFRkFVTFRfREVMQVk7XG5cdH1cblx0ZnVuY3Rpb24gb25SZWxlYXNlKGV2KSB7XG5cdFx0dmFyIF9vcHRpb25zJG1vZGlmaWVycywgX29wdGlvbnMkbW9kaWZpZXJzMiwgX29wdGlvbnMkbW9kaWZpZXJzMztcblx0XHRjb25zdCBbX3N0YXJ0VGltZXN0YW1wLCBfcG9zU3RhcnQsIF9oYXNMb25nUHJlc3NlZF0gPSBbXG5cdFx0XHRzdGFydFRpbWVzdGFtcCxcblx0XHRcdHBvc1N0YXJ0LFxuXHRcdFx0aGFzTG9uZ1ByZXNzZWRcblx0XHRdO1xuXHRcdGNsZWFyKCk7XG5cdFx0aWYgKCEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9uTW91c2VVcCkgfHwgIV9wb3NTdGFydCB8fCAhX3N0YXJ0VGltZXN0YW1wKSByZXR1cm47XG5cdFx0aWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzLnNlbGYpICYmIGV2LnRhcmdldCAhPT0gZWxlbWVudFJlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzMiA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnMyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnMyLnByZXZlbnQpIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnMzID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczMuc3RvcCkgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0Y29uc3QgZHggPSBldi54IC0gX3Bvc1N0YXJ0Lng7XG5cdFx0Y29uc3QgZHkgPSBldi55IC0gX3Bvc1N0YXJ0Lnk7XG5cdFx0Y29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuXHRcdG9wdGlvbnMub25Nb3VzZVVwKGV2LnRpbWVTdGFtcCAtIF9zdGFydFRpbWVzdGFtcCwgZGlzdGFuY2UsIF9oYXNMb25nUHJlc3NlZCk7XG5cdH1cblx0ZnVuY3Rpb24gb25Eb3duKGV2KSB7XG5cdFx0dmFyIF9vcHRpb25zJG1vZGlmaWVyczQsIF9vcHRpb25zJG1vZGlmaWVyczUsIF9vcHRpb25zJG1vZGlmaWVyczY7XG5cdFx0aWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzNCA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnM0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnM0LnNlbGYpICYmIGV2LnRhcmdldCAhPT0gZWxlbWVudFJlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGNsZWFyKCk7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnM1ID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczUucHJldmVudCkgZXYucHJldmVudERlZmF1bHQoKTtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczYgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzNiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzNi5zdG9wKSBldi5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRwb3NTdGFydCA9IHtcblx0XHRcdHg6IGV2LngsXG5cdFx0XHR5OiBldi55XG5cdFx0fTtcblx0XHRzdGFydFRpbWVzdGFtcCA9IGV2LnRpbWVTdGFtcDtcblx0XHR0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRoYXNMb25nUHJlc3NlZCA9IHRydWU7XG5cdFx0XHRoYW5kbGVyKGV2KTtcblx0XHR9LCBnZXREZWxheShldikpO1xuXHR9XG5cdGZ1bmN0aW9uIG9uTW92ZShldikge1xuXHRcdHZhciBfb3B0aW9ucyRtb2RpZmllcnM3LCBfb3B0aW9ucyRtb2RpZmllcnM4LCBfb3B0aW9ucyRtb2RpZmllcnM5LCBfb3B0aW9ucyRkaXN0YW5jZVRocmU7XG5cdFx0aWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzNyA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnM3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnM3LnNlbGYpICYmIGV2LnRhcmdldCAhPT0gZWxlbWVudFJlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmICghcG9zU3RhcnQgfHwgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kaXN0YW5jZVRocmVzaG9sZCkgPT09IGZhbHNlKSByZXR1cm47XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnM4ID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczgucHJldmVudCkgZXYucHJldmVudERlZmF1bHQoKTtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczkgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzOSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzOS5zdG9wKSBldi5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRjb25zdCBkeCA9IGV2LnggLSBwb3NTdGFydC54O1xuXHRcdGNvbnN0IGR5ID0gZXYueSAtIHBvc1N0YXJ0Lnk7XG5cdFx0aWYgKE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkgPj0gKChfb3B0aW9ucyRkaXN0YW5jZVRocmUgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGlzdGFuY2VUaHJlc2hvbGQpICE9PSBudWxsICYmIF9vcHRpb25zJGRpc3RhbmNlVGhyZSAhPT0gdm9pZCAwID8gX29wdGlvbnMkZGlzdGFuY2VUaHJlIDogREVGQVVMVF9USFJFU0hPTEQpKSBjbGVhcigpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRjYXB0dXJlOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzMTAgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzMTAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczEwLmNhcHR1cmUsXG5cdFx0b25jZTogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczExID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczExID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnMxMS5vbmNlXG5cdH07XG5cdGNvbnN0IGNsZWFudXAgPSBbXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihlbGVtZW50UmVmLCBcInBvaW50ZXJkb3duXCIsIG9uRG93biwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsZW1lbnRSZWYsIFwicG9pbnRlcm1vdmVcIiwgb25Nb3ZlLCBsaXN0ZW5lck9wdGlvbnMpLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWxlbWVudFJlZiwgW1wicG9pbnRlcnVwXCIsIFwicG9pbnRlcmxlYXZlXCJdLCBvblJlbGVhc2UsIGxpc3RlbmVyT3B0aW9ucylcblx0XTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IGNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25TdGFydFR5cGluZy9pbmRleC50c1xuZnVuY3Rpb24gaXNGb2N1c2VkRWxlbWVudEVkaXRhYmxlKCkge1xuXHRjb25zdCB7IGFjdGl2ZUVsZW1lbnQsIGJvZHkgfSA9IGRvY3VtZW50O1xuXHRpZiAoIWFjdGl2ZUVsZW1lbnQpIHJldHVybiBmYWxzZTtcblx0aWYgKGFjdGl2ZUVsZW1lbnQgPT09IGJvZHkpIHJldHVybiBmYWxzZTtcblx0c3dpdGNoIChhY3RpdmVFbGVtZW50LnRhZ05hbWUpIHtcblx0XHRjYXNlIFwiSU5QVVRcIjpcblx0XHRjYXNlIFwiVEVYVEFSRUFcIjogcmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGFjdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xufVxuZnVuY3Rpb24gaXNUeXBlZENoYXJWYWxpZCh7IGtleUNvZGUsIG1ldGFLZXksIGN0cmxLZXksIGFsdEtleSB9KSB7XG5cdGlmIChtZXRhS2V5IHx8IGN0cmxLZXkgfHwgYWx0S2V5KSByZXR1cm4gZmFsc2U7XG5cdGlmIChrZXlDb2RlID49IDQ4ICYmIGtleUNvZGUgPD0gNTcgfHwga2V5Q29kZSA+PSA5NiAmJiBrZXlDb2RlIDw9IDEwNSkgcmV0dXJuIHRydWU7XG5cdGlmIChrZXlDb2RlID49IDY1ICYmIGtleUNvZGUgPD0gOTApIHJldHVybiB0cnVlO1xuXHRyZXR1cm4gZmFsc2U7XG59XG4vKipcbiogRmlyZXMgd2hlbiB1c2VycyBzdGFydCB0eXBpbmcgb24gbm9uLWVkaXRhYmxlIGVsZW1lbnRzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9vblN0YXJ0VHlwaW5nXG4qIEBwYXJhbSBjYWxsYmFja1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uU3RhcnRUeXBpbmcoY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBrZXlkb3duID0gKGV2ZW50KSA9PiB7XG5cdFx0aWYgKCFpc0ZvY3VzZWRFbGVtZW50RWRpdGFibGUoKSAmJiBpc1R5cGVkQ2hhclZhbGlkKGV2ZW50KSkgY2FsbGJhY2soZXZlbnQpO1xuXHR9O1xuXHRpZiAoZG9jdW1lbnQkMSkgdXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcImtleWRvd25cIiwga2V5ZG93biwgeyBwYXNzaXZlOiB0cnVlIH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0ZW1wbGF0ZVJlZi9pbmRleC50c1xuLyoqXG4qIEBkZXByZWNhdGVkIFVzZSBWdWUncyBidWlsdC1pbiBgdXNlVGVtcGxhdGVSZWZgIGluc3RlYWQuXG4qXG4qIFNob3J0aGFuZCBmb3IgYmluZGluZyByZWYgdG8gdGVtcGxhdGUgZWxlbWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdGVtcGxhdGVSZWZcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaW5pdGlhbFZhbHVlXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdGVtcGxhdGVSZWYoa2V5LCBpbml0aWFsVmFsdWUgPSBudWxsKSB7XG5cdGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGxldCBfdHJpZ2dlciA9ICgpID0+IHt9O1xuXHRjb25zdCBlbGVtZW50ID0gY3VzdG9tUmVmKCh0cmFjaywgdHJpZ2dlcikgPT4ge1xuXHRcdF90cmlnZ2VyID0gdHJpZ2dlcjtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHR2YXIgX2luc3RhbmNlJHByb3h5JCRyZWZzLCBfaW5zdGFuY2UkcHJveHk7XG5cdFx0XHRcdHRyYWNrKCk7XG5cdFx0XHRcdHJldHVybiAoX2luc3RhbmNlJHByb3h5JCRyZWZzID0gaW5zdGFuY2UgPT09IG51bGwgfHwgaW5zdGFuY2UgPT09IHZvaWQgMCB8fCAoX2luc3RhbmNlJHByb3h5ID0gaW5zdGFuY2UucHJveHkpID09PSBudWxsIHx8IF9pbnN0YW5jZSRwcm94eSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2luc3RhbmNlJHByb3h5LiRyZWZzW2tleV0pICE9PSBudWxsICYmIF9pbnN0YW5jZSRwcm94eSQkcmVmcyAhPT0gdm9pZCAwID8gX2luc3RhbmNlJHByb3h5JCRyZWZzIDogaW5pdGlhbFZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldCgpIHt9XG5cdFx0fTtcblx0fSk7XG5cdHRyeU9uTW91bnRlZChfdHJpZ2dlcik7XG5cdG9uVXBkYXRlZChfdHJpZ2dlcik7XG5cdHJldHVybiBlbGVtZW50O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBY3RpdmVFbGVtZW50L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFjdGl2ZUVsZW1lbnRcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBY3RpdmVFbGVtZW50KG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkZG9jdW1lbnQ7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGRlZXAgPSB0cnVlLCB0cmlnZ2VyT25SZW1vdmFsID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRvY3VtZW50JDEgPSAoX29wdGlvbnMkZG9jdW1lbnQgPSBvcHRpb25zLmRvY3VtZW50KSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRkb2N1bWVudCAhPT0gdm9pZCAwID8gX29wdGlvbnMkZG9jdW1lbnQgOiB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuZG9jdW1lbnQ7XG5cdGNvbnN0IGdldERlZXBBY3RpdmVFbGVtZW50ID0gKCkgPT4ge1xuXHRcdGxldCBlbGVtZW50ID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmFjdGl2ZUVsZW1lbnQ7XG5cdFx0aWYgKGRlZXApIHtcblx0XHRcdHZhciBfZWxlbWVudCRzaGFkb3dSb290O1xuXHRcdFx0d2hpbGUgKGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWxlbWVudC5zaGFkb3dSb290KSBlbGVtZW50ID0gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgfHwgKF9lbGVtZW50JHNoYWRvd1Jvb3QgPSBlbGVtZW50LnNoYWRvd1Jvb3QpID09PSBudWxsIHx8IF9lbGVtZW50JHNoYWRvd1Jvb3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lbGVtZW50JHNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudDtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW1lbnQ7XG5cdH07XG5cdGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHRyaWdnZXIgPSAoKSA9PiB7XG5cdFx0YWN0aXZlRWxlbWVudC52YWx1ZSA9IGdldERlZXBBY3RpdmVFbGVtZW50KCk7XG5cdH07XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRcdGNhcHR1cmU6IHRydWUsXG5cdFx0XHRwYXNzaXZlOiB0cnVlXG5cdFx0fTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImJsdXJcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0dHJpZ2dlcigpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJmb2N1c1wiLCB0cmlnZ2VyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGlmICh0cmlnZ2VyT25SZW1vdmFsKSBvbkVsZW1lbnRSZW1vdmFsKGFjdGl2ZUVsZW1lbnQsIHRyaWdnZXIsIHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgfSk7XG5cdHRyaWdnZXIoKTtcblx0cmV0dXJuIGFjdGl2ZUVsZW1lbnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVJhZkZuL2luZGV4LnRzXG4vKipcbiogQ2FsbCBmdW5jdGlvbiBvbiBldmVyeSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4gV2l0aCBjb250cm9scyBvZiBwYXVzaW5nIGFuZCByZXN1bWluZy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmFmRm5cbiogQHBhcmFtIGZuXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlUmFmRm4oZm4sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIGZwc0xpbWl0ID0gbnVsbCwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIG9uY2UgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNBY3RpdmUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaW50ZXJ2YWxMaW1pdCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBsaW1pdCA9IHRvVmFsdWUoZnBzTGltaXQpO1xuXHRcdHJldHVybiBsaW1pdCA/IDFlMyAvIGxpbWl0IDogbnVsbDtcblx0fSk7XG5cdGxldCBwcmV2aW91c0ZyYW1lVGltZXN0YW1wID0gMDtcblx0bGV0IHJhZklkID0gbnVsbDtcblx0ZnVuY3Rpb24gbG9vcCh0aW1lc3RhbXAkMSkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUgfHwgIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0aWYgKCFwcmV2aW91c0ZyYW1lVGltZXN0YW1wKSBwcmV2aW91c0ZyYW1lVGltZXN0YW1wID0gdGltZXN0YW1wJDE7XG5cdFx0Y29uc3QgZGVsdGEgPSB0aW1lc3RhbXAkMSAtIHByZXZpb3VzRnJhbWVUaW1lc3RhbXA7XG5cdFx0aWYgKGludGVydmFsTGltaXQudmFsdWUgJiYgZGVsdGEgPCBpbnRlcnZhbExpbWl0LnZhbHVlKSB7XG5cdFx0XHRyYWZJZCA9IHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IHRpbWVzdGFtcCQxO1xuXHRcdGZuKHtcblx0XHRcdGRlbHRhLFxuXHRcdFx0dGltZXN0YW1wOiB0aW1lc3RhbXAkMVxuXHRcdH0pO1xuXHRcdGlmIChvbmNlKSB7XG5cdFx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0cmFmSWQgPSBudWxsO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRyYWZJZCA9IHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoKSB7XG5cdFx0aWYgKCFpc0FjdGl2ZS52YWx1ZSAmJiB3aW5kb3ckMSkge1xuXHRcdFx0aXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuXHRcdFx0cHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IDA7XG5cdFx0XHRyYWZJZCA9IHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gcGF1c2UoKSB7XG5cdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0XHRpZiAocmFmSWQgIT0gbnVsbCAmJiB3aW5kb3ckMSkge1xuXHRcdFx0d2luZG93JDEuY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuXHRcdFx0cmFmSWQgPSBudWxsO1xuXHRcdH1cblx0fVxuXHRpZiAoaW1tZWRpYXRlKSByZXN1bWUoKTtcblx0dHJ5T25TY29wZURpc3Bvc2UocGF1c2UpO1xuXHRyZXR1cm4ge1xuXHRcdGlzQWN0aXZlOiByZWFkb25seShpc0FjdGl2ZSksXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFuaW1hdGUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBXZWIgQW5pbWF0aW9ucyBBUElcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQW5pbWF0ZVxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBrZXlmcmFtZXNcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VBbmltYXRlKHRhcmdldCwga2V5ZnJhbWVzLCBvcHRpb25zKSB7XG5cdGxldCBjb25maWc7XG5cdGxldCBhbmltYXRlT3B0aW9ucztcblx0aWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG5cdFx0Y29uZmlnID0gb3B0aW9ucztcblx0XHRhbmltYXRlT3B0aW9ucyA9IG9iamVjdE9taXQob3B0aW9ucywgW1xuXHRcdFx0XCJ3aW5kb3dcIixcblx0XHRcdFwiaW1tZWRpYXRlXCIsXG5cdFx0XHRcImNvbW1pdFN0eWxlc1wiLFxuXHRcdFx0XCJwZXJzaXN0XCIsXG5cdFx0XHRcIm9uUmVhZHlcIixcblx0XHRcdFwib25FcnJvclwiXG5cdFx0XSk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uZmlnID0geyBkdXJhdGlvbjogb3B0aW9ucyB9O1xuXHRcdGFuaW1hdGVPcHRpb25zID0gb3B0aW9ucztcblx0fVxuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpbW1lZGlhdGUgPSB0cnVlLCBjb21taXRTdHlsZXMsIHBlcnNpc3QsIHBsYXliYWNrUmF0ZTogX3BsYXliYWNrUmF0ZSA9IDEsIG9uUmVhZHksIG9uRXJyb3IgPSAoZSkgPT4ge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH0gfSA9IGNvbmZpZztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIEhUTUxFbGVtZW50ICYmIFwiYW5pbWF0ZVwiIGluIEhUTUxFbGVtZW50LnByb3RvdHlwZSk7XG5cdGNvbnN0IGFuaW1hdGUgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IHN0b3JlID0gc2hhbGxvd1JlYWN0aXZlKHtcblx0XHRzdGFydFRpbWU6IG51bGwsXG5cdFx0Y3VycmVudFRpbWU6IG51bGwsXG5cdFx0dGltZWxpbmU6IG51bGwsXG5cdFx0cGxheWJhY2tSYXRlOiBfcGxheWJhY2tSYXRlLFxuXHRcdHBlbmRpbmc6IGZhbHNlLFxuXHRcdHBsYXlTdGF0ZTogaW1tZWRpYXRlID8gXCJpZGxlXCIgOiBcInBhdXNlZFwiLFxuXHRcdHJlcGxhY2VTdGF0ZTogXCJhY3RpdmVcIlxuXHR9KTtcblx0Y29uc3QgcGVuZGluZyA9IGNvbXB1dGVkKCgpID0+IHN0b3JlLnBlbmRpbmcpO1xuXHRjb25zdCBwbGF5U3RhdGUgPSBjb21wdXRlZCgoKSA9PiBzdG9yZS5wbGF5U3RhdGUpO1xuXHRjb25zdCByZXBsYWNlU3RhdGUgPSBjb21wdXRlZCgoKSA9PiBzdG9yZS5yZXBsYWNlU3RhdGUpO1xuXHRjb25zdCBzdGFydFRpbWUgPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHN0b3JlLnN0YXJ0VGltZTtcblx0XHR9LFxuXHRcdHNldCh2YWx1ZSkge1xuXHRcdFx0c3RvcmUuc3RhcnRUaW1lID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZS5zdGFydFRpbWUgPSB2YWx1ZTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBjdXJyZW50VGltZSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RvcmUuY3VycmVudFRpbWU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHN0b3JlLmN1cnJlbnRUaW1lID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkge1xuXHRcdFx0XHRhbmltYXRlLnZhbHVlLmN1cnJlbnRUaW1lID0gdmFsdWU7XG5cdFx0XHRcdHN5bmNSZXN1bWUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRjb25zdCB0aW1lbGluZSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RvcmUudGltZWxpbmU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHN0b3JlLnRpbWVsaW5lID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZS50aW1lbGluZSA9IHZhbHVlO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHBsYXliYWNrUmF0ZSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RvcmUucGxheWJhY2tSYXRlO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHRzdG9yZS5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblx0XHRcdGlmIChhbmltYXRlLnZhbHVlKSBhbmltYXRlLnZhbHVlLnBsYXliYWNrUmF0ZSA9IHZhbHVlO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHBsYXkgPSAoKSA9PiB7XG5cdFx0aWYgKGFuaW1hdGUudmFsdWUpIHRyeSB7XG5cdFx0XHRhbmltYXRlLnZhbHVlLnBsYXkoKTtcblx0XHRcdHN5bmNSZXN1bWUoKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRzeW5jUGF1c2UoKTtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0fVxuXHRcdGVsc2UgdXBkYXRlKCk7XG5cdH07XG5cdGNvbnN0IHBhdXNlID0gKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWU7XG5cdFx0XHQoX2FuaW1hdGUkdmFsdWUgPSBhbmltYXRlLnZhbHVlKSA9PT0gbnVsbCB8fCBfYW5pbWF0ZSR2YWx1ZSA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlLnBhdXNlKCk7XG5cdFx0XHRzeW5jUGF1c2UoKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcmV2ZXJzZSA9ICgpID0+IHtcblx0XHRpZiAoIWFuaW1hdGUudmFsdWUpIHVwZGF0ZSgpO1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWUyO1xuXHRcdFx0KF9hbmltYXRlJHZhbHVlMiA9IGFuaW1hdGUudmFsdWUpID09PSBudWxsIHx8IF9hbmltYXRlJHZhbHVlMiA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlMi5yZXZlcnNlKCk7XG5cdFx0XHRzeW5jUmVzdW1lKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0c3luY1BhdXNlKCk7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZmluaXNoID0gKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWUzO1xuXHRcdFx0KF9hbmltYXRlJHZhbHVlMyA9IGFuaW1hdGUudmFsdWUpID09PSBudWxsIHx8IF9hbmltYXRlJHZhbHVlMyA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlMy5maW5pc2goKTtcblx0XHRcdHN5bmNQYXVzZSgpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdHZhciBfYW5pbWF0ZSR2YWx1ZTQ7XG5cdFx0XHQoX2FuaW1hdGUkdmFsdWU0ID0gYW5pbWF0ZS52YWx1ZSkgPT09IG51bGwgfHwgX2FuaW1hdGUkdmFsdWU0ID09PSB2b2lkIDAgfHwgX2FuaW1hdGUkdmFsdWU0LmNhbmNlbCgpO1xuXHRcdFx0c3luY1BhdXNlKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH07XG5cdHdhdGNoKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpLCAoZWwpID0+IHtcblx0XHRpZiAoZWwpIHVwZGF0ZSh0cnVlKTtcblx0XHRlbHNlIGFuaW1hdGUudmFsdWUgPSB2b2lkIDA7XG5cdH0pO1xuXHR3YXRjaCgoKSA9PiBrZXlmcmFtZXMsICh2YWx1ZSkgPT4ge1xuXHRcdGlmIChhbmltYXRlLnZhbHVlKSB7XG5cdFx0XHR1cGRhdGUoKTtcblx0XHRcdGNvbnN0IHRhcmdldEVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0XHRpZiAodGFyZ2V0RWwpIGFuaW1hdGUudmFsdWUuZWZmZWN0ID0gbmV3IEtleWZyYW1lRWZmZWN0KHRhcmdldEVsLCB0b1ZhbHVlKHZhbHVlKSwgYW5pbWF0ZU9wdGlvbnMpO1xuXHRcdH1cblx0fSwgeyBkZWVwOiB0cnVlIH0pO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4gdXBkYXRlKHRydWUpLCBmYWxzZSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKGNhbmNlbCk7XG5cdGZ1bmN0aW9uIHVwZGF0ZShpbml0KSB7XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8ICFlbCkgcmV0dXJuO1xuXHRcdGlmICghYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZSA9IGVsLmFuaW1hdGUodG9WYWx1ZShrZXlmcmFtZXMpLCBhbmltYXRlT3B0aW9ucyk7XG5cdFx0aWYgKHBlcnNpc3QpIGFuaW1hdGUudmFsdWUucGVyc2lzdCgpO1xuXHRcdGlmIChfcGxheWJhY2tSYXRlICE9PSAxKSBhbmltYXRlLnZhbHVlLnBsYXliYWNrUmF0ZSA9IF9wbGF5YmFja1JhdGU7XG5cdFx0aWYgKGluaXQgJiYgIWltbWVkaWF0ZSkgYW5pbWF0ZS52YWx1ZS5wYXVzZSgpO1xuXHRcdGVsc2Ugc3luY1Jlc3VtZSgpO1xuXHRcdG9uUmVhZHkgPT09IG51bGwgfHwgb25SZWFkeSA9PT0gdm9pZCAwIHx8IG9uUmVhZHkoYW5pbWF0ZS52YWx1ZSk7XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIoYW5pbWF0ZSwgW1xuXHRcdFwiY2FuY2VsXCIsXG5cdFx0XCJmaW5pc2hcIixcblx0XHRcInJlbW92ZVwiXG5cdF0sIHN5bmNQYXVzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcihhbmltYXRlLCBcImZpbmlzaFwiLCAoKSA9PiB7XG5cdFx0dmFyIF9hbmltYXRlJHZhbHVlNTtcblx0XHRpZiAoY29tbWl0U3R5bGVzKSAoX2FuaW1hdGUkdmFsdWU1ID0gYW5pbWF0ZS52YWx1ZSkgPT09IG51bGwgfHwgX2FuaW1hdGUkdmFsdWU1ID09PSB2b2lkIDAgfHwgX2FuaW1hdGUkdmFsdWU1LmNvbW1pdFN0eWxlcygpO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRjb25zdCB7IHJlc3VtZTogcmVzdW1lUmVmLCBwYXVzZTogcGF1c2VSZWYgfSA9IHVzZVJhZkZuKCgpID0+IHtcblx0XHRpZiAoIWFuaW1hdGUudmFsdWUpIHJldHVybjtcblx0XHRzdG9yZS5wZW5kaW5nID0gYW5pbWF0ZS52YWx1ZS5wZW5kaW5nO1xuXHRcdHN0b3JlLnBsYXlTdGF0ZSA9IGFuaW1hdGUudmFsdWUucGxheVN0YXRlO1xuXHRcdHN0b3JlLnJlcGxhY2VTdGF0ZSA9IGFuaW1hdGUudmFsdWUucmVwbGFjZVN0YXRlO1xuXHRcdHN0b3JlLnN0YXJ0VGltZSA9IGFuaW1hdGUudmFsdWUuc3RhcnRUaW1lO1xuXHRcdHN0b3JlLmN1cnJlbnRUaW1lID0gYW5pbWF0ZS52YWx1ZS5jdXJyZW50VGltZTtcblx0XHRzdG9yZS50aW1lbGluZSA9IGFuaW1hdGUudmFsdWUudGltZWxpbmU7XG5cdFx0c3RvcmUucGxheWJhY2tSYXRlID0gYW5pbWF0ZS52YWx1ZS5wbGF5YmFja1JhdGU7XG5cdH0sIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcblx0ZnVuY3Rpb24gc3luY1Jlc3VtZSgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHJlc3VtZVJlZigpO1xuXHR9XG5cdGZ1bmN0aW9uIHN5bmNQYXVzZSgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgd2luZG93JDEpIHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShwYXVzZVJlZik7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRhbmltYXRlLFxuXHRcdHBsYXksXG5cdFx0cGF1c2UsXG5cdFx0cmV2ZXJzZSxcblx0XHRmaW5pc2gsXG5cdFx0Y2FuY2VsLFxuXHRcdHBlbmRpbmcsXG5cdFx0cGxheVN0YXRlLFxuXHRcdHJlcGxhY2VTdGF0ZSxcblx0XHRzdGFydFRpbWUsXG5cdFx0Y3VycmVudFRpbWUsXG5cdFx0dGltZWxpbmUsXG5cdFx0cGxheWJhY2tSYXRlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFzeW5jUXVldWUvaW5kZXgudHNcbi8qKlxuKiBBc3luY2hyb25vdXMgcXVldWUgdGFzayBjb250cm9sbGVyLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBc3luY1F1ZXVlXG4qIEBwYXJhbSB0YXNrc1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUFzeW5jUXVldWUodGFza3MsIG9wdGlvbnMpIHtcblx0Y29uc3QgeyBpbnRlcnJ1cHQgPSB0cnVlLCBvbkVycm9yID0gbm9vcCwgb25GaW5pc2hlZCA9IG5vb3AsIHNpZ25hbCB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgcHJvbWlzZVN0YXRlID0ge1xuXHRcdGFib3J0ZWQ6IFwiYWJvcnRlZFwiLFxuXHRcdGZ1bGZpbGxlZDogXCJmdWxmaWxsZWRcIixcblx0XHRwZW5kaW5nOiBcInBlbmRpbmdcIixcblx0XHRyZWplY3RlZDogXCJyZWplY3RlZFwiXG5cdH07XG5cdGNvbnN0IHJlc3VsdCA9IHJlYWN0aXZlKEFycmF5LmZyb20oQXJyYXkuZnJvbSh7IGxlbmd0aDogdGFza3MubGVuZ3RoIH0pLCAoKSA9PiAoe1xuXHRcdHN0YXRlOiBwcm9taXNlU3RhdGUucGVuZGluZyxcblx0XHRkYXRhOiBudWxsXG5cdH0pKSk7XG5cdGNvbnN0IGFjdGl2ZUluZGV4ID0gc2hhbGxvd1JlZigtMSk7XG5cdGlmICghdGFza3MgfHwgdGFza3MubGVuZ3RoID09PSAwKSB7XG5cdFx0b25GaW5pc2hlZCgpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRhY3RpdmVJbmRleCxcblx0XHRcdHJlc3VsdFxuXHRcdH07XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlUmVzdWx0KHN0YXRlLCByZXMpIHtcblx0XHRhY3RpdmVJbmRleC52YWx1ZSsrO1xuXHRcdHJlc3VsdFthY3RpdmVJbmRleC52YWx1ZV0uZGF0YSA9IHJlcztcblx0XHRyZXN1bHRbYWN0aXZlSW5kZXgudmFsdWVdLnN0YXRlID0gc3RhdGU7XG5cdH1cblx0dGFza3MucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG5cdFx0cmV0dXJuIHByZXYudGhlbigocHJldlJlcykgPT4ge1xuXHRcdFx0dmFyIF9yZXN1bHQkYWN0aXZlSW5kZXgkdjtcblx0XHRcdGlmIChzaWduYWwgPT09IG51bGwgfHwgc2lnbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaWduYWwuYWJvcnRlZCkge1xuXHRcdFx0XHR1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLmFib3J0ZWQsIC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCgoX3Jlc3VsdCRhY3RpdmVJbmRleCR2ID0gcmVzdWx0W2FjdGl2ZUluZGV4LnZhbHVlXSkgPT09IG51bGwgfHwgX3Jlc3VsdCRhY3RpdmVJbmRleCR2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcmVzdWx0JGFjdGl2ZUluZGV4JHYuc3RhdGUpID09PSBwcm9taXNlU3RhdGUucmVqZWN0ZWQgJiYgaW50ZXJydXB0KSB7XG5cdFx0XHRcdG9uRmluaXNoZWQoKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZG9uZSA9IGN1cnIocHJldlJlcykudGhlbigoY3VycmVudFJlcykgPT4ge1xuXHRcdFx0XHR1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLmZ1bGZpbGxlZCwgY3VycmVudFJlcyk7XG5cdFx0XHRcdGlmIChhY3RpdmVJbmRleC52YWx1ZSA9PT0gdGFza3MubGVuZ3RoIC0gMSkgb25GaW5pc2hlZCgpO1xuXHRcdFx0XHRyZXR1cm4gY3VycmVudFJlcztcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCFzaWduYWwpIHJldHVybiBkb25lO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmFjZShbZG9uZSwgd2hlbkFib3J0ZWQoc2lnbmFsKV0pO1xuXHRcdH0pLmNhdGNoKChlKSA9PiB7XG5cdFx0XHRpZiAoc2lnbmFsID09PSBudWxsIHx8IHNpZ25hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2lnbmFsLmFib3J0ZWQpIHtcblx0XHRcdFx0dXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5hYm9ydGVkLCBlKTtcblx0XHRcdFx0cmV0dXJuIGU7XG5cdFx0XHR9XG5cdFx0XHR1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLnJlamVjdGVkLCBlKTtcblx0XHRcdG9uRXJyb3IoKTtcblx0XHRcdGlmIChhY3RpdmVJbmRleC52YWx1ZSA9PT0gdGFza3MubGVuZ3RoIC0gMSkgb25GaW5pc2hlZCgpO1xuXHRcdFx0cmV0dXJuIGU7XG5cdFx0fSk7XG5cdH0sIFByb21pc2UucmVzb2x2ZSgpKTtcblx0cmV0dXJuIHtcblx0XHRhY3RpdmVJbmRleCxcblx0XHRyZXN1bHRcblx0fTtcbn1cbmZ1bmN0aW9uIHdoZW5BYm9ydGVkKHNpZ25hbCkge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IGVycm9yID0gLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcImFib3J0ZWRcIik7XG5cdFx0aWYgKHNpZ25hbC5hYm9ydGVkKSByZWplY3QoZXJyb3IpO1xuXHRcdGVsc2Ugc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiByZWplY3QoZXJyb3IpLCB7IG9uY2U6IHRydWUgfSk7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBc3luY1N0YXRlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYXN5bmMgc3RhdGUuIFdpbGwgbm90IGJsb2NrIHlvdXIgc2V0dXAgZnVuY3Rpb24gYW5kIHdpbGwgdHJpZ2dlciBjaGFuZ2VzIG9uY2VcbiogdGhlIHByb21pc2UgaXMgcmVhZHkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFzeW5jU3RhdGVcbiogQHBhcmFtIHByb21pc2UgICAgICAgICBUaGUgcHJvbWlzZSAvIGFzeW5jIGZ1bmN0aW9uIHRvIGJlIHJlc29sdmVkXG4qIEBwYXJhbSBpbml0aWFsU3RhdGUgICAgVGhlIGluaXRpYWwgc3RhdGUsIHVzZWQgdW50aWwgdGhlIGZpcnN0IGV2YWx1YXRpb24gZmluaXNoZXNcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VBc3luY1N0YXRlKHByb21pc2UsIGluaXRpYWxTdGF0ZSwgb3B0aW9ucykge1xuXHR2YXIgX2dsb2JhbFRoaXMkcmVwb3J0RXJyO1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIGRlbGF5ID0gMCwgb25FcnJvciA9IChfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgPSBnbG9iYWxUaGlzLnJlcG9ydEVycm9yKSAhPT0gbnVsbCAmJiBfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgIT09IHZvaWQgMCA/IF9nbG9iYWxUaGlzJHJlcG9ydEVyciA6IG5vb3AsIG9uU3VjY2VzcyA9IG5vb3AsIHJlc2V0T25FeGVjdXRlID0gdHJ1ZSwgc2hhbGxvdyA9IHRydWUsIHRocm93RXJyb3IgfSA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuXHRjb25zdCBzdGF0ZSA9IHNoYWxsb3cgPyBzaGFsbG93UmVmKGluaXRpYWxTdGF0ZSkgOiByZWYoaW5pdGlhbFN0YXRlKTtcblx0Y29uc3QgaXNSZWFkeSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBpc0xvYWRpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGxldCBleGVjdXRpb25zQ291bnQgPSAwO1xuXHRhc3luYyBmdW5jdGlvbiBleGVjdXRlKGRlbGF5JDEgPSAwLCAuLi5hcmdzKSB7XG5cdFx0Y29uc3QgZXhlY3V0aW9uSWQgPSBleGVjdXRpb25zQ291bnQgKz0gMTtcblx0XHRpZiAocmVzZXRPbkV4ZWN1dGUpIHN0YXRlLnZhbHVlID0gdG9WYWx1ZShpbml0aWFsU3RhdGUpO1xuXHRcdGVycm9yLnZhbHVlID0gdm9pZCAwO1xuXHRcdGlzUmVhZHkudmFsdWUgPSBmYWxzZTtcblx0XHRpc0xvYWRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlmIChkZWxheSQxID4gMCkgYXdhaXQgcHJvbWlzZVRpbWVvdXQoZGVsYXkkMSk7XG5cdFx0Y29uc3QgX3Byb21pc2UgPSB0eXBlb2YgcHJvbWlzZSA9PT0gXCJmdW5jdGlvblwiID8gcHJvbWlzZSguLi5hcmdzKSA6IHByb21pc2U7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGRhdGEgPSBhd2FpdCBfcHJvbWlzZTtcblx0XHRcdGlmIChleGVjdXRpb25JZCA9PT0gZXhlY3V0aW9uc0NvdW50KSB7XG5cdFx0XHRcdHN0YXRlLnZhbHVlID0gZGF0YTtcblx0XHRcdFx0aXNSZWFkeS52YWx1ZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRvblN1Y2Nlc3MoZGF0YSk7XG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoZXhlY3V0aW9uSWQgPT09IGV4ZWN1dGlvbnNDb3VudCkgZXJyb3IudmFsdWUgPSBlO1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHRcdGlmICh0aHJvd0Vycm9yKSB0aHJvdyBlO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoZXhlY3V0aW9uSWQgPT09IGV4ZWN1dGlvbnNDb3VudCkgaXNMb2FkaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdGlmIChpbW1lZGlhdGUpIGV4ZWN1dGUoZGVsYXkpO1xuXHRjb25zdCBzaGVsbCA9IHtcblx0XHRzdGF0ZSxcblx0XHRpc1JlYWR5LFxuXHRcdGlzTG9hZGluZyxcblx0XHRlcnJvcixcblx0XHRleGVjdXRlLFxuXHRcdGV4ZWN1dGVJbW1lZGlhdGU6ICguLi5hcmdzKSA9PiBleGVjdXRlKDAsIC4uLmFyZ3MpXG5cdH07XG5cdGZ1bmN0aW9uIHdhaXRVbnRpbElzTG9hZGVkKCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR1bnRpbChpc0xvYWRpbmcpLnRvQmUoZmFsc2UpLnRoZW4oKCkgPT4gcmVzb2x2ZShzaGVsbCkpLmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHQuLi5zaGVsbCxcblx0XHR0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdFx0XHRyZXR1cm4gd2FpdFVudGlsSXNMb2FkZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0XHR9XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJhc2U2NC9zZXJpYWxpemF0aW9uLnRzXG5jb25zdCBkZWZhdWx0cyA9IHtcblx0YXJyYXk6ICh2KSA9PiBKU09OLnN0cmluZ2lmeSh2KSxcblx0b2JqZWN0OiAodikgPT4gSlNPTi5zdHJpbmdpZnkodiksXG5cdHNldDogKHYpID0+IEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odikpLFxuXHRtYXA6ICh2KSA9PiBKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXModikpLFxuXHRudWxsOiAoKSA9PiBcIlwiXG59O1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNlcmlhbGl6YXRpb24odGFyZ2V0KSB7XG5cdGlmICghdGFyZ2V0KSByZXR1cm4gZGVmYXVsdHMubnVsbDtcblx0aWYgKHRhcmdldCBpbnN0YW5jZW9mIE1hcCkgcmV0dXJuIGRlZmF1bHRzLm1hcDtcblx0ZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgU2V0KSByZXR1cm4gZGVmYXVsdHMuc2V0O1xuXHRlbHNlIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHJldHVybiBkZWZhdWx0cy5hcnJheTtcblx0ZWxzZSByZXR1cm4gZGVmYXVsdHMub2JqZWN0O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCYXNlNjQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUJhc2U2NCh0YXJnZXQsIG9wdGlvbnMpIHtcblx0Y29uc3QgYmFzZTY0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgcHJvbWlzZSA9IHNoYWxsb3dSZWYoKTtcblx0ZnVuY3Rpb24gZXhlY3V0ZSgpIHtcblx0XHRpZiAoIWlzQ2xpZW50KSByZXR1cm47XG5cdFx0cHJvbWlzZS52YWx1ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IF90YXJnZXQgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0XHRcdGlmIChfdGFyZ2V0ID09IG51bGwpIHJlc29sdmUoXCJcIik7XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBfdGFyZ2V0ID09PSBcInN0cmluZ1wiKSByZXNvbHZlKGJsb2JUb0Jhc2U2NChuZXcgQmxvYihbX3RhcmdldF0sIHsgdHlwZTogXCJ0ZXh0L3BsYWluXCIgfSkpKTtcblx0XHRcdFx0ZWxzZSBpZiAoX3RhcmdldCBpbnN0YW5jZW9mIEJsb2IpIHJlc29sdmUoYmxvYlRvQmFzZTY0KF90YXJnZXQpKTtcblx0XHRcdFx0ZWxzZSBpZiAoX3RhcmdldCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXNvbHZlKHdpbmRvdy5idG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4ubmV3IFVpbnQ4QXJyYXkoX3RhcmdldCkpKSk7XG5cdFx0XHRcdGVsc2UgaWYgKF90YXJnZXQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgcmVzb2x2ZShfdGFyZ2V0LnRvRGF0YVVSTChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHlwZSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnF1YWxpdHkpKTtcblx0XHRcdFx0ZWxzZSBpZiAoX3RhcmdldCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHtcblx0XHRcdFx0XHRjb25zdCBpbWcgPSBfdGFyZ2V0LmNsb25lTm9kZShmYWxzZSk7XG5cdFx0XHRcdFx0aW1nLmNyb3NzT3JpZ2luID0gXCJBbm9ueW1vdXNcIjtcblx0XHRcdFx0XHRpbWdMb2FkZWQoaW1nKS50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG5cdFx0XHRcdFx0XHRjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXHRcdFx0XHRcdFx0Y2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xuXHRcdFx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG5cdFx0XHRcdFx0XHRjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUoY2FudmFzLnRvRGF0YVVSTChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHlwZSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnF1YWxpdHkpKTtcblx0XHRcdFx0XHR9KS5jYXRjaChyZWplY3QpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBfdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2VyaWFsaXplZCA9ICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNlcmlhbGl6ZXIpIHx8IGdldERlZmF1bHRTZXJpYWxpemF0aW9uKF90YXJnZXQpKShfdGFyZ2V0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZShibG9iVG9CYXNlNjQobmV3IEJsb2IoW3NlcmlhbGl6ZWRdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pKSk7XG5cdFx0XHRcdH0gZWxzZSByZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcInRhcmdldCBpcyB1bnN1cHBvcnRlZCB0eXBlc1wiKSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHByb21pc2UudmFsdWUudGhlbigocmVzKSA9PiB7XG5cdFx0XHRiYXNlNjQudmFsdWUgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRhdGFVcmwpID09PSBmYWxzZSA/IHJlcy5yZXBsYWNlKC9eZGF0YTouKj87YmFzZTY0LC8sIFwiXCIpIDogcmVzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcm9taXNlLnZhbHVlO1xuXHR9XG5cdGlmIChpc1JlZih0YXJnZXQpIHx8IHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIikgd2F0Y2godGFyZ2V0LCBleGVjdXRlLCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0ZWxzZSBleGVjdXRlKCk7XG5cdHJldHVybiB7XG5cdFx0YmFzZTY0LFxuXHRcdHByb21pc2UsXG5cdFx0ZXhlY3V0ZVxuXHR9O1xufVxuZnVuY3Rpb24gaW1nTG9hZGVkKGltZykge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGlmICghaW1nLmNvbXBsZXRlKSB7XG5cdFx0XHRpbWcub25sb2FkID0gKCkgPT4ge1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9O1xuXHRcdFx0aW1nLm9uZXJyb3IgPSByZWplY3Q7XG5cdFx0fSBlbHNlIHJlc29sdmUoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBibG9iVG9CYXNlNjQoYmxvYikge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IGZyID0gbmV3IEZpbGVSZWFkZXIoKTtcblx0XHRmci5vbmxvYWQgPSAoZSkgPT4ge1xuXHRcdFx0cmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuXHRcdH07XG5cdFx0ZnIub25lcnJvciA9IHJlamVjdDtcblx0XHRmci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQmF0dGVyeS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIEJhdHRlcnkgU3RhdHVzIEFQSS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQmF0dGVyeVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUJhdHRlcnkob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGV2ZW50cyQxID0gW1xuXHRcdFwiY2hhcmdpbmdjaGFuZ2VcIixcblx0XHRcImNoYXJnaW5ndGltZWNoYW5nZVwiLFxuXHRcdFwiZGlzY2hhcmdpbmd0aW1lY2hhbmdlXCIsXG5cdFx0XCJsZXZlbGNoYW5nZVwiXG5cdF07XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImdldEJhdHRlcnlcIiBpbiBuYXZpZ2F0b3IkMSAmJiB0eXBlb2YgbmF2aWdhdG9yJDEuZ2V0QmF0dGVyeSA9PT0gXCJmdW5jdGlvblwiKTtcblx0Y29uc3QgY2hhcmdpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgY2hhcmdpbmdUaW1lID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZGlzY2hhcmdpbmdUaW1lID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgbGV2ZWwgPSBzaGFsbG93UmVmKDEpO1xuXHRsZXQgYmF0dGVyeTtcblx0ZnVuY3Rpb24gdXBkYXRlQmF0dGVyeUluZm8oKSB7XG5cdFx0Y2hhcmdpbmcudmFsdWUgPSB0aGlzLmNoYXJnaW5nO1xuXHRcdGNoYXJnaW5nVGltZS52YWx1ZSA9IHRoaXMuY2hhcmdpbmdUaW1lIHx8IDA7XG5cdFx0ZGlzY2hhcmdpbmdUaW1lLnZhbHVlID0gdGhpcy5kaXNjaGFyZ2luZ1RpbWUgfHwgMDtcblx0XHRsZXZlbC52YWx1ZSA9IHRoaXMubGV2ZWw7XG5cdH1cblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBuYXZpZ2F0b3IkMS5nZXRCYXR0ZXJ5KCkudGhlbigoX2JhdHRlcnkpID0+IHtcblx0XHRiYXR0ZXJ5ID0gX2JhdHRlcnk7XG5cdFx0dXBkYXRlQmF0dGVyeUluZm8uY2FsbChiYXR0ZXJ5KTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGJhdHRlcnksIGV2ZW50cyQxLCB1cGRhdGVCYXR0ZXJ5SW5mbywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRjaGFyZ2luZyxcblx0XHRjaGFyZ2luZ1RpbWUsXG5cdFx0ZGlzY2hhcmdpbmdUaW1lLFxuXHRcdGxldmVsXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJsdWV0b290aC9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZUJsdWV0b290aChvcHRpb25zKSB7XG5cdGxldCB7IGFjY2VwdEFsbERldmljZXMgPSBmYWxzZSB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgeyBmaWx0ZXJzID0gdm9pZCAwLCBvcHRpb25hbFNlcnZpY2VzID0gdm9pZCAwLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiYmx1ZXRvb3RoXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBkZXZpY2UgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0d2F0Y2goZGV2aWNlLCAoKSA9PiB7XG5cdFx0Y29ubmVjdFRvQmx1ZXRvb3RoR0FUVFNlcnZlcigpO1xuXHR9KTtcblx0YXN5bmMgZnVuY3Rpb24gcmVxdWVzdERldmljZSgpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdGlmIChmaWx0ZXJzICYmIGZpbHRlcnMubGVuZ3RoID4gMCkgYWNjZXB0QWxsRGV2aWNlcyA9IGZhbHNlO1xuXHRcdHRyeSB7XG5cdFx0XHRkZXZpY2UudmFsdWUgPSBhd2FpdCAobmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvciQxLmJsdWV0b290aC5yZXF1ZXN0RGV2aWNlKHtcblx0XHRcdFx0YWNjZXB0QWxsRGV2aWNlcyxcblx0XHRcdFx0ZmlsdGVycyxcblx0XHRcdFx0b3B0aW9uYWxTZXJ2aWNlc1xuXHRcdFx0fSkpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBlcnI7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHNlcnZlciA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgaXNDb25uZWN0ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cdFx0aXNDb25uZWN0ZWQudmFsdWUgPSBmYWxzZTtcblx0XHRkZXZpY2UudmFsdWUgPSB2b2lkIDA7XG5cdFx0c2VydmVyLnZhbHVlID0gdm9pZCAwO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RUb0JsdWV0b290aEdBVFRTZXJ2ZXIoKSB7XG5cdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdGlmIChkZXZpY2UudmFsdWUgJiYgZGV2aWNlLnZhbHVlLmdhdHQpIHtcblx0XHRcdHVzZUV2ZW50TGlzdGVuZXIoZGV2aWNlLCBcImdhdHRzZXJ2ZXJkaXNjb25uZWN0ZWRcIiwgcmVzZXQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHNlcnZlci52YWx1ZSA9IGF3YWl0IGRldmljZS52YWx1ZS5nYXR0LmNvbm5lY3QoKTtcblx0XHRcdFx0aXNDb25uZWN0ZWQudmFsdWUgPSBzZXJ2ZXIudmFsdWUuY29ubmVjdGVkO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdGVycm9yLnZhbHVlID0gZXJyO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdHZhciBfZGV2aWNlJHZhbHVlJGdhdHQ7XG5cdFx0aWYgKGRldmljZS52YWx1ZSkgKF9kZXZpY2UkdmFsdWUkZ2F0dCA9IGRldmljZS52YWx1ZS5nYXR0KSA9PT0gbnVsbCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQgPT09IHZvaWQgMCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQuY29ubmVjdCgpO1xuXHR9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHZhciBfZGV2aWNlJHZhbHVlJGdhdHQyO1xuXHRcdGlmIChkZXZpY2UudmFsdWUpIChfZGV2aWNlJHZhbHVlJGdhdHQyID0gZGV2aWNlLnZhbHVlLmdhdHQpID09PSBudWxsIHx8IF9kZXZpY2UkdmFsdWUkZ2F0dDIgPT09IHZvaWQgMCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQyLmRpc2Nvbm5lY3QoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNDb25uZWN0ZWQ6IHJlYWRvbmx5KGlzQ29ubmVjdGVkKSxcblx0XHRkZXZpY2UsXG5cdFx0cmVxdWVzdERldmljZSxcblx0XHRzZXJ2ZXIsXG5cdFx0ZXJyb3Jcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU1NSV2lkdGgvaW5kZXgudHNcbmNvbnN0IHNzcldpZHRoU3ltYm9sID0gU3ltYm9sKFwidnVldXNlLXNzci13aWR0aFwiKTtcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VTU1JXaWR0aCgpIHtcblx0Y29uc3Qgc3NyV2lkdGggPSBoYXNJbmplY3Rpb25Db250ZXh0KCkgPyBpbmplY3RMb2NhbChzc3JXaWR0aFN5bWJvbCwgbnVsbCkgOiBudWxsO1xuXHRyZXR1cm4gdHlwZW9mIHNzcldpZHRoID09PSBcIm51bWJlclwiID8gc3NyV2lkdGggOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBwcm92aWRlU1NSV2lkdGgod2lkdGgsIGFwcCkge1xuXHRpZiAoYXBwICE9PSB2b2lkIDApIGFwcC5wcm92aWRlKHNzcldpZHRoU3ltYm9sLCB3aWR0aCk7XG5cdGVsc2UgcHJvdmlkZUxvY2FsKHNzcldpZHRoU3ltYm9sLCB3aWR0aCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1lZGlhUXVlcnkvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBNZWRpYSBRdWVyeS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWVkaWFRdWVyeVxuKiBAcGFyYW0gcXVlcnlcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VNZWRpYVF1ZXJ5KHF1ZXJ5LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3NyV2lkdGggPSAvKiBAX19QVVJFX18gKi8gdXNlU1NSV2lkdGgoKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwibWF0Y2hNZWRpYVwiIGluIHdpbmRvdyQxICYmIHR5cGVvZiB3aW5kb3ckMS5tYXRjaE1lZGlhID09PSBcImZ1bmN0aW9uXCIpO1xuXHRjb25zdCBzc3JTdXBwb3J0ID0gc2hhbGxvd1JlZih0eXBlb2Ygc3NyV2lkdGggPT09IFwibnVtYmVyXCIpO1xuXHRjb25zdCBtZWRpYVF1ZXJ5ID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBtYXRjaGVzID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQpID0+IHtcblx0XHRtYXRjaGVzLnZhbHVlID0gZXZlbnQubWF0Y2hlcztcblx0fTtcblx0d2F0Y2hFZmZlY3QoKCkgPT4ge1xuXHRcdGlmIChzc3JTdXBwb3J0LnZhbHVlKSB7XG5cdFx0XHRzc3JTdXBwb3J0LnZhbHVlID0gIWlzU3VwcG9ydGVkLnZhbHVlO1xuXHRcdFx0bWF0Y2hlcy52YWx1ZSA9IHRvVmFsdWUocXVlcnkpLnNwbGl0KFwiLFwiKS5zb21lKChxdWVyeVN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBub3QgPSBxdWVyeVN0cmluZy5pbmNsdWRlcyhcIm5vdCBhbGxcIik7XG5cdFx0XHRcdGNvbnN0IG1pbldpZHRoID0gcXVlcnlTdHJpbmcubWF0Y2goL1xcKFxccyptaW4td2lkdGg6XFxzKigtP1xcZCsoPzpcXC5cXGQqKT9bYS16XStcXHMqKVxcKS8pO1xuXHRcdFx0XHRjb25zdCBtYXhXaWR0aCA9IHF1ZXJ5U3RyaW5nLm1hdGNoKC9cXChcXHMqbWF4LXdpZHRoOlxccyooLT9cXGQrKD86XFwuXFxkKik/W2Etel0rXFxzKilcXCkvKTtcblx0XHRcdFx0bGV0IHJlcyA9IEJvb2xlYW4obWluV2lkdGggfHwgbWF4V2lkdGgpO1xuXHRcdFx0XHRpZiAobWluV2lkdGggJiYgcmVzKSByZXMgPSBzc3JXaWR0aCA+PSBweFZhbHVlKG1pbldpZHRoWzFdKTtcblx0XHRcdFx0aWYgKG1heFdpZHRoICYmIHJlcykgcmVzID0gc3NyV2lkdGggPD0gcHhWYWx1ZShtYXhXaWR0aFsxXSk7XG5cdFx0XHRcdHJldHVybiBub3QgPyAhcmVzIDogcmVzO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRtZWRpYVF1ZXJ5LnZhbHVlID0gd2luZG93JDEubWF0Y2hNZWRpYSh0b1ZhbHVlKHF1ZXJ5KSk7XG5cdFx0bWF0Y2hlcy52YWx1ZSA9IG1lZGlhUXVlcnkudmFsdWUubWF0Y2hlcztcblx0fSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIobWVkaWFRdWVyeSwgXCJjaGFuZ2VcIiwgaGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gbWF0Y2hlcy52YWx1ZSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJyZWFrcG9pbnRzL2JyZWFrcG9pbnRzLnRzXG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBUYWlsd2luZCBWMlxuKlxuKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYnJlYWtwb2ludHNcbiovXG5jb25zdCBicmVha3BvaW50c1RhaWx3aW5kID0ge1xuXHRcInNtXCI6IDY0MCxcblx0XCJtZFwiOiA3NjgsXG5cdFwibGdcIjogMTAyNCxcblx0XCJ4bFwiOiAxMjgwLFxuXHRcIjJ4bFwiOiAxNTM2XG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gQm9vdHN0cmFwIFY1XG4qXG4qIEBzZWUgaHR0cHM6Ly9nZXRib290c3RyYXAuY29tL2RvY3MvNS4wL2xheW91dC9icmVha3BvaW50c1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzQm9vdHN0cmFwVjUgPSB7XG5cdHhzOiAwLFxuXHRzbTogNTc2LFxuXHRtZDogNzY4LFxuXHRsZzogOTkyLFxuXHR4bDogMTIwMCxcblx0eHhsOiAxNDAwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gVnVldGlmeSBWMlxuKlxuKiBAc2VlIGh0dHBzOi8vdjIudnVldGlmeWpzLmNvbS9lbi9mZWF0dXJlcy9icmVha3BvaW50cy9cbiovXG5jb25zdCBicmVha3BvaW50c1Z1ZXRpZnlWMiA9IHtcblx0eHM6IDAsXG5cdHNtOiA2MDAsXG5cdG1kOiA5NjAsXG5cdGxnOiAxMjY0LFxuXHR4bDogMTkwNFxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIFZ1ZXRpZnkgVjNcbipcbiogQHNlZSBodHRwczovL3Z1ZXRpZnlqcy5jb20vZW4vc3R5bGVzL2Zsb2F0LyNvdmVydmlld1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzVnVldGlmeVYzID0ge1xuXHR4czogMCxcblx0c206IDYwMCxcblx0bWQ6IDk2MCxcblx0bGc6IDEyODAsXG5cdHhsOiAxOTIwLFxuXHR4eGw6IDI1NjBcbn07XG4vKipcbiogQWxpYXMgdG8gYGJyZWFrcG9pbnRzVnVldGlmeVYyYFxuKlxuKiBAZGVwcmVjYXRlZCBleHBsaWN0bHkgdXNlIGBicmVha3BvaW50c1Z1ZXRpZnlWMmAgb3IgYGJyZWFrcG9pbnRzVnVldGlmeVYzYCBpbnN0ZWFkXG4qL1xuY29uc3QgYnJlYWtwb2ludHNWdWV0aWZ5ID0gYnJlYWtwb2ludHNWdWV0aWZ5VjI7XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBBbnQgRGVzaWduXG4qXG4qIEBzZWUgaHR0cHM6Ly9hbnQuZGVzaWduL2NvbXBvbmVudHMvbGF5b3V0LyNicmVha3BvaW50LXdpZHRoXG4qL1xuY29uc3QgYnJlYWtwb2ludHNBbnREZXNpZ24gPSB7XG5cdHhzOiA0ODAsXG5cdHNtOiA1NzYsXG5cdG1kOiA3NjgsXG5cdGxnOiA5OTIsXG5cdHhsOiAxMjAwLFxuXHR4eGw6IDE2MDBcbn07XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBRdWFzYXIgVjJcbipcbiogQHNlZSBodHRwczovL3F1YXNhci5kZXYvc3R5bGUvYnJlYWtwb2ludHNcbiovXG5jb25zdCBicmVha3BvaW50c1F1YXNhciA9IHtcblx0eHM6IDAsXG5cdHNtOiA2MDAsXG5cdG1kOiAxMDI0LFxuXHRsZzogMTQ0MCxcblx0eGw6IDE5MjBcbn07XG4vKipcbiogU2VtYXRpYyBCcmVha3BvaW50c1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzU2VtYXRpYyA9IHtcblx0bW9iaWxlUzogMzIwLFxuXHRtb2JpbGVNOiAzNzUsXG5cdG1vYmlsZUw6IDQyNSxcblx0dGFibGV0OiA3NjgsXG5cdGxhcHRvcDogMTAyNCxcblx0bGFwdG9wTDogMTQ0MCxcblx0ZGVza3RvcDRLOiAyNTYwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gTWFzdGVyIENTU1xuKlxuKiBAc2VlIGh0dHBzOi8vZG9jcy5tYXN0ZXIuY28vY3NzL2JyZWFrcG9pbnRzXG4qL1xuY29uc3QgYnJlYWtwb2ludHNNYXN0ZXJDc3MgPSB7XG5cdFwiM3hzXCI6IDM2MCxcblx0XCIyeHNcIjogNDgwLFxuXHRcInhzXCI6IDYwMCxcblx0XCJzbVwiOiA3NjgsXG5cdFwibWRcIjogMTAyNCxcblx0XCJsZ1wiOiAxMjgwLFxuXHRcInhsXCI6IDE0NDAsXG5cdFwiMnhsXCI6IDE2MDAsXG5cdFwiM3hsXCI6IDE5MjAsXG5cdFwiNHhsXCI6IDI1NjBcbn07XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBQcmltZUZsZXhcbipcbiogQHNlZSBodHRwczovL3ByaW1lZmxleC5vcmcvaW5zdGFsbGF0aW9uXG4qL1xuY29uc3QgYnJlYWtwb2ludHNQcmltZUZsZXggPSB7XG5cdHNtOiA1NzYsXG5cdG1kOiA3NjgsXG5cdGxnOiA5OTIsXG5cdHhsOiAxMjAwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gRWxlbWVudFVJL0VsZW1lbnRQbHVzXG4qXG4qIEBzZWUgaHR0cHM6Ly9lbGVtZW50LmVsZW1lLmlvLyMvZW4tVVMvY29tcG9uZW50L2xheW91dFxuKiBAc2VlIGh0dHBzOi8vZWxlbWVudC1wbHVzLm9yZy9lbi1VUy9jb21wb25lbnQvbGF5b3V0Lmh0bWxcbiovXG5jb25zdCBicmVha3BvaW50c0VsZW1lbnQgPSB7XG5cdHhzOiAwLFxuXHRzbTogNzY4LFxuXHRtZDogOTkyLFxuXHRsZzogMTIwMCxcblx0eGw6IDE5MjBcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJyZWFrcG9pbnRzL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSB2aWV3cG9ydCBicmVha3BvaW50c1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VCcmVha3BvaW50c1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBvcHRpb25zID0ge30pIHtcblx0ZnVuY3Rpb24gZ2V0VmFsdWUkMShrLCBkZWx0YSkge1xuXHRcdGxldCB2ID0gdG9WYWx1ZShicmVha3BvaW50c1t0b1ZhbHVlKGspXSk7XG5cdFx0aWYgKGRlbHRhICE9IG51bGwpIHYgPSBpbmNyZWFzZVdpdGhVbml0KHYsIGRlbHRhKTtcblx0XHRpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHYgPSBgJHt2fXB4YDtcblx0XHRyZXR1cm4gdjtcblx0fVxuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBzdHJhdGVneSA9IFwibWluLXdpZHRoXCIsIHNzcldpZHRoID0gLyogQF9fUFVSRV9fICovIHVzZVNTUldpZHRoKCkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHNzclN1cHBvcnQgPSB0eXBlb2Ygc3NyV2lkdGggPT09IFwibnVtYmVyXCI7XG5cdGNvbnN0IG1vdW50ZWQgPSBzc3JTdXBwb3J0ID8gc2hhbGxvd1JlZihmYWxzZSkgOiB7IHZhbHVlOiB0cnVlIH07XG5cdGlmIChzc3JTdXBwb3J0KSB0cnlPbk1vdW50ZWQoKCkgPT4gbW91bnRlZC52YWx1ZSA9ICEhd2luZG93JDEpO1xuXHRmdW5jdGlvbiBtYXRjaChxdWVyeSwgc2l6ZSkge1xuXHRcdGlmICghbW91bnRlZC52YWx1ZSAmJiBzc3JTdXBwb3J0KSByZXR1cm4gcXVlcnkgPT09IFwibWluXCIgPyBzc3JXaWR0aCA+PSBweFZhbHVlKHNpemUpIDogc3NyV2lkdGggPD0gcHhWYWx1ZShzaXplKTtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIHdpbmRvdyQxLm1hdGNoTWVkaWEoYCgke3F1ZXJ5fS13aWR0aDogJHtzaXplfSlgKS5tYXRjaGVzO1xuXHR9XG5cdGNvbnN0IGdyZWF0ZXJPckVxdWFsID0gKGspID0+IHtcblx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1pbi13aWR0aDogJHtnZXRWYWx1ZSQxKGspfSlgLCBvcHRpb25zKTtcblx0fTtcblx0Y29uc3Qgc21hbGxlck9yRXF1YWwgPSAoaykgPT4ge1xuXHRcdHJldHVybiB1c2VNZWRpYVF1ZXJ5KCgpID0+IGAobWF4LXdpZHRoOiAke2dldFZhbHVlJDEoayl9KWAsIG9wdGlvbnMpO1xuXHR9O1xuXHRjb25zdCBzaG9ydGN1dE1ldGhvZHMgPSBPYmplY3Qua2V5cyhicmVha3BvaW50cykucmVkdWNlKChzaG9ydGN1dHMsIGspID0+IHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hvcnRjdXRzLCBrLCB7XG5cdFx0XHRnZXQ6ICgpID0+IHN0cmF0ZWd5ID09PSBcIm1pbi13aWR0aFwiID8gZ3JlYXRlck9yRXF1YWwoaykgOiBzbWFsbGVyT3JFcXVhbChrKSxcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHR9KTtcblx0XHRyZXR1cm4gc2hvcnRjdXRzO1xuXHR9LCB7fSk7XG5cdGZ1bmN0aW9uIGN1cnJlbnQoKSB7XG5cdFx0Y29uc3QgcG9pbnRzID0gT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLm1hcCgoaykgPT4gW1xuXHRcdFx0ayxcblx0XHRcdHNob3J0Y3V0TWV0aG9kc1trXSxcblx0XHRcdHB4VmFsdWUoZ2V0VmFsdWUkMShrKSlcblx0XHRdKS5zb3J0KChhLCBiKSA9PiBhWzJdIC0gYlsyXSk7XG5cdFx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHBvaW50cy5maWx0ZXIoKFssIHZdKSA9PiB2LnZhbHVlKS5tYXAoKFtrXSkgPT4gaykpO1xuXHR9XG5cdHJldHVybiBPYmplY3QuYXNzaWduKHNob3J0Y3V0TWV0aG9kcywge1xuXHRcdGdyZWF0ZXJPckVxdWFsLFxuXHRcdHNtYWxsZXJPckVxdWFsLFxuXHRcdGdyZWF0ZXIoaykge1xuXHRcdFx0cmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUkMShrLCAuMSl9KWAsIG9wdGlvbnMpO1xuXHRcdH0sXG5cdFx0c21hbGxlcihrKSB7XG5cdFx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1heC13aWR0aDogJHtnZXRWYWx1ZSQxKGssIC0uMSl9KWAsIG9wdGlvbnMpO1xuXHRcdH0sXG5cdFx0YmV0d2VlbihhLCBiKSB7XG5cdFx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1pbi13aWR0aDogJHtnZXRWYWx1ZSQxKGEpfSkgYW5kIChtYXgtd2lkdGg6ICR7Z2V0VmFsdWUkMShiLCAtLjEpfSlgLCBvcHRpb25zKTtcblx0XHR9LFxuXHRcdGlzR3JlYXRlcihrKSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2goXCJtaW5cIiwgZ2V0VmFsdWUkMShrLCAuMSkpO1xuXHRcdH0sXG5cdFx0aXNHcmVhdGVyT3JFcXVhbChrKSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2goXCJtaW5cIiwgZ2V0VmFsdWUkMShrKSk7XG5cdFx0fSxcblx0XHRpc1NtYWxsZXIoaykge1xuXHRcdFx0cmV0dXJuIG1hdGNoKFwibWF4XCIsIGdldFZhbHVlJDEoaywgLS4xKSk7XG5cdFx0fSxcblx0XHRpc1NtYWxsZXJPckVxdWFsKGspIHtcblx0XHRcdHJldHVybiBtYXRjaChcIm1heFwiLCBnZXRWYWx1ZSQxKGspKTtcblx0XHR9LFxuXHRcdGlzSW5CZXR3ZWVuKGEsIGIpIHtcblx0XHRcdHJldHVybiBtYXRjaChcIm1pblwiLCBnZXRWYWx1ZSQxKGEpKSAmJiBtYXRjaChcIm1heFwiLCBnZXRWYWx1ZSQxKGIsIC0uMSkpO1xuXHRcdH0sXG5cdFx0Y3VycmVudCxcblx0XHRhY3RpdmUoKSB7XG5cdFx0XHRjb25zdCBicHMgPSBjdXJyZW50KCk7XG5cdFx0XHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gYnBzLnZhbHVlLmxlbmd0aCA9PT0gMCA/IFwiXCIgOiBicHMudmFsdWUuYXQoc3RyYXRlZ3kgPT09IFwibWluLXdpZHRoXCIgPyAtMSA6IDApKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCcm9hZGNhc3RDaGFubmVsL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgQnJvYWRjYXN0Q2hhbm5lbFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VCcm9hZGNhc3RDaGFubmVsXG4qIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Jyb2FkY2FzdENoYW5uZWxcbiogQHBhcmFtIG9wdGlvbnNcbipcbiovXG5mdW5jdGlvbiB1c2VCcm9hZGNhc3RDaGFubmVsKG9wdGlvbnMpIHtcblx0Y29uc3QgeyBuYW1lLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiQnJvYWRjYXN0Q2hhbm5lbFwiIGluIHdpbmRvdyQxKTtcblx0Y29uc3QgaXNDbG9zZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgY2hhbm5lbCA9IHJlZigpO1xuXHRjb25zdCBkYXRhID0gcmVmKCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgcG9zdCA9IChkYXRhJDEpID0+IHtcblx0XHRpZiAoY2hhbm5lbC52YWx1ZSkgY2hhbm5lbC52YWx1ZS5wb3N0TWVzc2FnZShkYXRhJDEpO1xuXHR9O1xuXHRjb25zdCBjbG9zZSA9ICgpID0+IHtcblx0XHRpZiAoY2hhbm5lbC52YWx1ZSkgY2hhbm5lbC52YWx1ZS5jbG9zZSgpO1xuXHRcdGlzQ2xvc2VkLnZhbHVlID0gdHJ1ZTtcblx0fTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0XHRjaGFubmVsLnZhbHVlID0gbmV3IEJyb2FkY2FzdENoYW5uZWwobmFtZSk7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihjaGFubmVsLCBcIm1lc3NhZ2VcIiwgKGUpID0+IHtcblx0XHRcdGRhdGEudmFsdWUgPSBlLmRhdGE7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGNoYW5uZWwsIFwibWVzc2FnZWVycm9yXCIsIChlKSA9PiB7XG5cdFx0XHRlcnJvci52YWx1ZSA9IGU7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGNoYW5uZWwsIFwiY2xvc2VcIiwgKCkgPT4ge1xuXHRcdFx0aXNDbG9zZWQudmFsdWUgPSB0cnVlO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH0pO1xuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0Y2xvc2UoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y2hhbm5lbCxcblx0XHRkYXRhLFxuXHRcdHBvc3QsXG5cdFx0Y2xvc2UsXG5cdFx0ZXJyb3IsXG5cdFx0aXNDbG9zZWRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQnJvd3NlckxvY2F0aW9uL2luZGV4LnRzXG5jb25zdCBXUklUQUJMRV9QUk9QRVJUSUVTID0gW1xuXHRcImhhc2hcIixcblx0XCJob3N0XCIsXG5cdFwiaG9zdG5hbWVcIixcblx0XCJocmVmXCIsXG5cdFwicGF0aG5hbWVcIixcblx0XCJwb3J0XCIsXG5cdFwicHJvdG9jb2xcIixcblx0XCJzZWFyY2hcIlxuXTtcbi8qKlxuKiBSZWFjdGl2ZSBicm93c2VyIGxvY2F0aW9uLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VCcm93c2VyTG9jYXRpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VCcm93c2VyTG9jYXRpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJlZnMgPSBPYmplY3QuZnJvbUVudHJpZXMoV1JJVEFCTEVfUFJPUEVSVElFUy5tYXAoKGtleSkgPT4gW2tleSwgcmVmKCldKSk7XG5cdGZvciAoY29uc3QgW2tleSwgcmVmJDFdIG9mIG9iamVjdEVudHJpZXMocmVmcykpIHdhdGNoKHJlZiQxLCAodmFsdWUpID0+IHtcblx0XHRpZiAoISh3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEubG9jYXRpb24pIHx8IHdpbmRvdyQxLmxvY2F0aW9uW2tleV0gPT09IHZhbHVlKSByZXR1cm47XG5cdFx0d2luZG93JDEubG9jYXRpb25ba2V5XSA9IHZhbHVlO1xuXHR9KTtcblx0Y29uc3QgYnVpbGRTdGF0ZSA9ICh0cmlnZ2VyKSA9PiB7XG5cdFx0dmFyIF93aW5kb3ckbG9jYXRpb247XG5cdFx0Y29uc3QgeyBzdGF0ZTogc3RhdGUkMSwgbGVuZ3RoIH0gPSAod2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmhpc3RvcnkpIHx8IHt9O1xuXHRcdGNvbnN0IHsgb3JpZ2luIH0gPSAod2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmxvY2F0aW9uKSB8fCB7fTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBXUklUQUJMRV9QUk9QRVJUSUVTKSByZWZzW2tleV0udmFsdWUgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwIHx8IChfd2luZG93JGxvY2F0aW9uID0gd2luZG93JDEubG9jYXRpb24pID09PSBudWxsIHx8IF93aW5kb3ckbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckbG9jYXRpb25ba2V5XTtcblx0XHRyZXR1cm4gcmVhY3RpdmUoe1xuXHRcdFx0dHJpZ2dlcixcblx0XHRcdHN0YXRlOiBzdGF0ZSQxLFxuXHRcdFx0bGVuZ3RoLFxuXHRcdFx0b3JpZ2luLFxuXHRcdFx0Li4ucmVmc1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBzdGF0ZSA9IHJlZihidWlsZFN0YXRlKFwibG9hZFwiKSk7XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwicG9wc3RhdGVcIiwgKCkgPT4gc3RhdGUudmFsdWUgPSBidWlsZFN0YXRlKFwicG9wc3RhdGVcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJoYXNoY2hhbmdlXCIsICgpID0+IHN0YXRlLnZhbHVlID0gYnVpbGRTdGF0ZShcImhhc2hjaGFuZ2VcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDYWNoZWQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUNhY2hlZChyZWZWYWx1ZSwgY29tcGFyYXRvciA9IChhLCBiKSA9PiBhID09PSBiLCBvcHRpb25zKSB7XG5cdGNvbnN0IHsgZGVlcFJlZnMgPSB0cnVlLC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgY2FjaGVkVmFsdWUgPSBjcmVhdGVSZWYocmVmVmFsdWUudmFsdWUsIGRlZXBSZWZzKTtcblx0d2F0Y2goKCkgPT4gcmVmVmFsdWUudmFsdWUsICh2YWx1ZSkgPT4ge1xuXHRcdGlmICghY29tcGFyYXRvcih2YWx1ZSwgY2FjaGVkVmFsdWUudmFsdWUpKSBjYWNoZWRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuXHR9LCB3YXRjaE9wdGlvbnMpO1xuXHRyZXR1cm4gY2FjaGVkVmFsdWU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBlcm1pc3Npb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBQZXJtaXNzaW9ucyBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVBlcm1pc3Npb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQZXJtaXNzaW9uKHBlcm1pc3Npb25EZXNjLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBjb250cm9scyA9IGZhbHNlLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwicGVybWlzc2lvbnNcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IHBlcm1pc3Npb25TdGF0dXMgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGRlc2MgPSB0eXBlb2YgcGVybWlzc2lvbkRlc2MgPT09IFwic3RyaW5nXCIgPyB7IG5hbWU6IHBlcm1pc3Npb25EZXNjIH0gOiBwZXJtaXNzaW9uRGVzYztcblx0Y29uc3Qgc3RhdGUgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcblx0XHR2YXIgX3Blcm1pc3Npb25TdGF0dXMkdmFsLCBfcGVybWlzc2lvblN0YXR1cyR2YWwyO1xuXHRcdHN0YXRlLnZhbHVlID0gKF9wZXJtaXNzaW9uU3RhdHVzJHZhbCA9IChfcGVybWlzc2lvblN0YXR1cyR2YWwyID0gcGVybWlzc2lvblN0YXR1cy52YWx1ZSkgPT09IG51bGwgfHwgX3Blcm1pc3Npb25TdGF0dXMkdmFsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Blcm1pc3Npb25TdGF0dXMkdmFsMi5zdGF0ZSkgIT09IG51bGwgJiYgX3Blcm1pc3Npb25TdGF0dXMkdmFsICE9PSB2b2lkIDAgPyBfcGVybWlzc2lvblN0YXR1cyR2YWwgOiBcInByb21wdFwiO1xuXHR9O1xuXHR1c2VFdmVudExpc3RlbmVyKHBlcm1pc3Npb25TdGF0dXMsIFwiY2hhbmdlXCIsIHVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRjb25zdCBxdWVyeSA9IGNyZWF0ZVNpbmdsZXRvblByb21pc2UoYXN5bmMgKCkgPT4ge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRpZiAoIXBlcm1pc3Npb25TdGF0dXMudmFsdWUpIHRyeSB7XG5cdFx0XHRwZXJtaXNzaW9uU3RhdHVzLnZhbHVlID0gYXdhaXQgbmF2aWdhdG9yJDEucGVybWlzc2lvbnMucXVlcnkoZGVzYyk7XG5cdFx0fSBjYXRjaCAoX3VudXNlZCkge1xuXHRcdFx0cGVybWlzc2lvblN0YXR1cy52YWx1ZSA9IHZvaWQgMDtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dXBkYXRlKCk7XG5cdFx0fVxuXHRcdGlmIChjb250cm9scykgcmV0dXJuIHRvUmF3KHBlcm1pc3Npb25TdGF0dXMudmFsdWUpO1xuXHR9KTtcblx0cXVlcnkoKTtcblx0aWYgKGNvbnRyb2xzKSByZXR1cm4ge1xuXHRcdHN0YXRlLFxuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHF1ZXJ5XG5cdH07XG5cdGVsc2UgcmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDbGlwYm9hcmQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUNsaXBib2FyZChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgcmVhZCA9IGZhbHNlLCBzb3VyY2UsIGNvcGllZER1cmluZyA9IDE1MDAsIGxlZ2FjeSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0NsaXBib2FyZEFwaVN1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJjbGlwYm9hcmRcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IHBlcm1pc3Npb25SZWFkID0gdXNlUGVybWlzc2lvbihcImNsaXBib2FyZC1yZWFkXCIpO1xuXHRjb25zdCBwZXJtaXNzaW9uV3JpdGUgPSB1c2VQZXJtaXNzaW9uKFwiY2xpcGJvYXJkLXdyaXRlXCIpO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IGNvbXB1dGVkKCgpID0+IGlzQ2xpcGJvYXJkQXBpU3VwcG9ydGVkLnZhbHVlIHx8IGxlZ2FjeSk7XG5cdGNvbnN0IHRleHQgPSBzaGFsbG93UmVmKFwiXCIpO1xuXHRjb25zdCBjb3BpZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgdGltZW91dCA9IHVzZVRpbWVvdXRGbigoKSA9PiBjb3BpZWQudmFsdWUgPSBmYWxzZSwgY29waWVkRHVyaW5nLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVRleHQoKSB7XG5cdFx0bGV0IHVzZUxlZ2FjeSA9ICEoaXNDbGlwYm9hcmRBcGlTdXBwb3J0ZWQudmFsdWUgJiYgaXNBbGxvd2VkKHBlcm1pc3Npb25SZWFkLnZhbHVlKSk7XG5cdFx0aWYgKCF1c2VMZWdhY3kpIHRyeSB7XG5cdFx0XHR0ZXh0LnZhbHVlID0gYXdhaXQgbmF2aWdhdG9yJDEuY2xpcGJvYXJkLnJlYWRUZXh0KCk7XG5cdFx0fSBjYXRjaCAoX3VudXNlZCkge1xuXHRcdFx0dXNlTGVnYWN5ID0gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHVzZUxlZ2FjeSkgdGV4dC52YWx1ZSA9IGxlZ2FjeVJlYWQoKTtcblx0fVxuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgcmVhZCkgdXNlRXZlbnRMaXN0ZW5lcihbXCJjb3B5XCIsIFwiY3V0XCJdLCB1cGRhdGVUZXh0LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdGFzeW5jIGZ1bmN0aW9uIGNvcHkodmFsdWUgPSB0b1ZhbHVlKHNvdXJjZSkpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0bGV0IHVzZUxlZ2FjeSA9ICEoaXNDbGlwYm9hcmRBcGlTdXBwb3J0ZWQudmFsdWUgJiYgaXNBbGxvd2VkKHBlcm1pc3Npb25Xcml0ZS52YWx1ZSkpO1xuXHRcdFx0aWYgKCF1c2VMZWdhY3kpIHRyeSB7XG5cdFx0XHRcdGF3YWl0IG5hdmlnYXRvciQxLmNsaXBib2FyZC53cml0ZVRleHQodmFsdWUpO1xuXHRcdFx0fSBjYXRjaCAoX3VudXNlZDIpIHtcblx0XHRcdFx0dXNlTGVnYWN5ID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmICh1c2VMZWdhY3kpIGxlZ2FjeUNvcHkodmFsdWUpO1xuXHRcdFx0dGV4dC52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0Y29waWVkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdHRpbWVvdXQuc3RhcnQoKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gbGVnYWN5Q29weSh2YWx1ZSkge1xuXHRcdGNvbnN0IHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXHRcdHRhLnZhbHVlID0gdmFsdWU7XG5cdFx0dGEuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0dGEuc3R5bGUub3BhY2l0eSA9IFwiMFwiO1xuXHRcdHRhLnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIFwiXCIpO1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpO1xuXHRcdHRhLnNlbGVjdCgpO1xuXHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcblx0XHR0YS5yZW1vdmUoKTtcblx0fVxuXHRmdW5jdGlvbiBsZWdhY3lSZWFkKCkge1xuXHRcdHZhciBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8sIF9kb2N1bWVudCwgX2RvY3VtZW50JGdldFNlbGVjdGlvMjtcblx0XHRyZXR1cm4gKF9kb2N1bWVudCRnZXRTZWxlY3RpbyA9IChfZG9jdW1lbnQgPSBkb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50ID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCRnZXRTZWxlY3RpbzIgPSBfZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8yID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCRnZXRTZWxlY3RpbzIgPSBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8yLmNhbGwoX2RvY3VtZW50KSkgPT09IG51bGwgfHwgX2RvY3VtZW50JGdldFNlbGVjdGlvMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50JGdldFNlbGVjdGlvMi50b1N0cmluZygpKSAhPT0gbnVsbCAmJiBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8gIT09IHZvaWQgMCA/IF9kb2N1bWVudCRnZXRTZWxlY3RpbyA6IFwiXCI7XG5cdH1cblx0ZnVuY3Rpb24gaXNBbGxvd2VkKHN0YXR1cykge1xuXHRcdHJldHVybiBzdGF0dXMgPT09IFwiZ3JhbnRlZFwiIHx8IHN0YXR1cyA9PT0gXCJwcm9tcHRcIjtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHRleHQ6IHJlYWRvbmx5KHRleHQpLFxuXHRcdGNvcGllZDogcmVhZG9ubHkoY29waWVkKSxcblx0XHRjb3B5XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNsaXBib2FyZEl0ZW1zL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDbGlwYm9hcmRJdGVtcyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgcmVhZCA9IGZhbHNlLCBzb3VyY2UsIGNvcGllZER1cmluZyA9IDE1MDAgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImNsaXBib2FyZFwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgY29udGVudCA9IHJlZihbXSk7XG5cdGNvbnN0IGNvcGllZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCB0aW1lb3V0ID0gdXNlVGltZW91dEZuKCgpID0+IGNvcGllZC52YWx1ZSA9IGZhbHNlLCBjb3BpZWREdXJpbmcsIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcblx0ZnVuY3Rpb24gdXBkYXRlQ29udGVudCgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIG5hdmlnYXRvciQxLmNsaXBib2FyZC5yZWFkKCkudGhlbigoaXRlbXMpID0+IHtcblx0XHRcdGNvbnRlbnQudmFsdWUgPSBpdGVtcztcblx0XHR9KTtcblx0fVxuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgcmVhZCkgdXNlRXZlbnRMaXN0ZW5lcihbXCJjb3B5XCIsIFwiY3V0XCJdLCB1cGRhdGVDb250ZW50LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdGFzeW5jIGZ1bmN0aW9uIGNvcHkodmFsdWUgPSB0b1ZhbHVlKHNvdXJjZSkpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0YXdhaXQgbmF2aWdhdG9yJDEuY2xpcGJvYXJkLndyaXRlKHZhbHVlKTtcblx0XHRcdGNvbnRlbnQudmFsdWUgPSB2YWx1ZTtcblx0XHRcdGNvcGllZC52YWx1ZSA9IHRydWU7XG5cdFx0XHR0aW1lb3V0LnN0YXJ0KCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y29udGVudDogc2hhbGxvd1JlYWRvbmx5KGNvbnRlbnQpLFxuXHRcdGNvcGllZDogcmVhZG9ubHkoY29waWVkKSxcblx0XHRjb3B5LFxuXHRcdHJlYWQ6IHVwZGF0ZUNvbnRlbnRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ2xvbmVkL2luZGV4LnRzXG5mdW5jdGlvbiBjbG9uZUZuSlNPTihzb3VyY2UpIHtcblx0cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc291cmNlKSk7XG59XG5mdW5jdGlvbiB1c2VDbG9uZWQoc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgY2xvbmVkID0gcmVmKHt9KTtcblx0Y29uc3QgaXNNb2RpZmllZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRsZXQgX2xhc3RTeW5jID0gZmFsc2U7XG5cdGNvbnN0IHsgbWFudWFsLCBjbG9uZSA9IGNsb25lRm5KU09OLCBkZWVwID0gdHJ1ZSwgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0d2F0Y2goY2xvbmVkLCAoKSA9PiB7XG5cdFx0aWYgKF9sYXN0U3luYykge1xuXHRcdFx0X2xhc3RTeW5jID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlzTW9kaWZpZWQudmFsdWUgPSB0cnVlO1xuXHR9LCB7XG5cdFx0ZGVlcDogdHJ1ZSxcblx0XHRmbHVzaDogXCJzeW5jXCJcblx0fSk7XG5cdGZ1bmN0aW9uIHN5bmMoKSB7XG5cdFx0X2xhc3RTeW5jID0gdHJ1ZTtcblx0XHRpc01vZGlmaWVkLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xvbmVkLnZhbHVlID0gY2xvbmUodG9WYWx1ZShzb3VyY2UpKTtcblx0fVxuXHRpZiAoIW1hbnVhbCAmJiAoaXNSZWYoc291cmNlKSB8fCB0eXBlb2Ygc291cmNlID09PSBcImZ1bmN0aW9uXCIpKSB3YXRjaChzb3VyY2UsIHN5bmMsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGRlZXAsXG5cdFx0aW1tZWRpYXRlXG5cdH0pO1xuXHRlbHNlIHN5bmMoKTtcblx0cmV0dXJuIHtcblx0XHRjbG9uZWQsXG5cdFx0aXNNb2RpZmllZCxcblx0XHRzeW5jXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNzci1oYW5kbGVycy50c1xuY29uc3QgX2dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDoge307XG5jb25zdCBnbG9iYWxLZXkgPSBcIl9fdnVldXNlX3Nzcl9oYW5kbGVyc19fXCI7XG5jb25zdCBoYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBnZXRIYW5kbGVycygpO1xuZnVuY3Rpb24gZ2V0SGFuZGxlcnMoKSB7XG5cdGlmICghKGdsb2JhbEtleSBpbiBfZ2xvYmFsKSkgX2dsb2JhbFtnbG9iYWxLZXldID0gX2dsb2JhbFtnbG9iYWxLZXldIHx8IHt9O1xuXHRyZXR1cm4gX2dsb2JhbFtnbG9iYWxLZXldO1xufVxuZnVuY3Rpb24gZ2V0U1NSSGFuZGxlcihrZXksIGZhbGxiYWNrKSB7XG5cdHJldHVybiBoYW5kbGVyc1trZXldIHx8IGZhbGxiYWNrO1xufVxuZnVuY3Rpb24gc2V0U1NSSGFuZGxlcihrZXksIGZuKSB7XG5cdGhhbmRsZXJzW2tleV0gPSBmbjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkRGFyay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGRhcmsgdGhlbWUgcHJlZmVyZW5jZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUHJlZmVycmVkRGFya1xuKiBAcGFyYW0gW29wdGlvbnNdXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlUHJlZmVycmVkRGFyayhvcHRpb25zKSB7XG5cdHJldHVybiB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKVwiLCBvcHRpb25zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3RvcmFnZS9ndWVzcy50c1xuZnVuY3Rpb24gZ3Vlc3NTZXJpYWxpemVyVHlwZShyYXdJbml0KSB7XG5cdHJldHVybiByYXdJbml0ID09IG51bGwgPyBcImFueVwiIDogcmF3SW5pdCBpbnN0YW5jZW9mIFNldCA/IFwic2V0XCIgOiByYXdJbml0IGluc3RhbmNlb2YgTWFwID8gXCJtYXBcIiA6IHJhd0luaXQgaW5zdGFuY2VvZiBEYXRlID8gXCJkYXRlXCIgOiB0eXBlb2YgcmF3SW5pdCA9PT0gXCJib29sZWFuXCIgPyBcImJvb2xlYW5cIiA6IHR5cGVvZiByYXdJbml0ID09PSBcInN0cmluZ1wiID8gXCJzdHJpbmdcIiA6IHR5cGVvZiByYXdJbml0ID09PSBcIm9iamVjdFwiID8gXCJvYmplY3RcIiA6ICFOdW1iZXIuaXNOYU4ocmF3SW5pdCkgPyBcIm51bWJlclwiIDogXCJhbnlcIjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3RvcmFnZS9pbmRleC50c1xuY29uc3QgU3RvcmFnZVNlcmlhbGl6ZXJzID0ge1xuXHRib29sZWFuOiB7XG5cdFx0cmVhZDogKHYpID0+IHYgPT09IFwidHJ1ZVwiLFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdG9iamVjdDoge1xuXHRcdHJlYWQ6ICh2KSA9PiBKU09OLnBhcnNlKHYpLFxuXHRcdHdyaXRlOiAodikgPT4gSlNPTi5zdHJpbmdpZnkodilcblx0fSxcblx0bnVtYmVyOiB7XG5cdFx0cmVhZDogKHYpID0+IE51bWJlci5wYXJzZUZsb2F0KHYpLFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdGFueToge1xuXHRcdHJlYWQ6ICh2KSA9PiB2LFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdHN0cmluZzoge1xuXHRcdHJlYWQ6ICh2KSA9PiB2LFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdG1hcDoge1xuXHRcdHJlYWQ6ICh2KSA9PiBuZXcgTWFwKEpTT04ucGFyc2UodikpLFxuXHRcdHdyaXRlOiAodikgPT4gSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh2LmVudHJpZXMoKSkpXG5cdH0sXG5cdHNldDoge1xuXHRcdHJlYWQ6ICh2KSA9PiBuZXcgU2V0KEpTT04ucGFyc2UodikpLFxuXHRcdHdyaXRlOiAodikgPT4gSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh2KSlcblx0fSxcblx0ZGF0ZToge1xuXHRcdHJlYWQ6ICh2KSA9PiBuZXcgRGF0ZSh2KSxcblx0XHR3cml0ZTogKHYpID0+IHYudG9JU09TdHJpbmcoKVxuXHR9XG59O1xuY29uc3QgY3VzdG9tU3RvcmFnZUV2ZW50TmFtZSA9IFwidnVldXNlLXN0b3JhZ2VcIjtcbi8qKlxuKiBSZWFjdGl2ZSBMb2NhbFN0b3JhZ2UvU2Vzc2lvblN0b3JhZ2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVN0b3JhZ2VcbiovXG5mdW5jdGlvbiB1c2VTdG9yYWdlKGtleSwgZGVmYXVsdHMkMSwgc3RvcmFnZSwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRzZXJpYWxpemVyO1xuXHRjb25zdCB7IGZsdXNoID0gXCJwcmVcIiwgZGVlcCA9IHRydWUsIGxpc3RlblRvU3RvcmFnZUNoYW5nZXMgPSB0cnVlLCB3cml0ZURlZmF1bHRzID0gdHJ1ZSwgbWVyZ2VEZWZhdWx0cyA9IGZhbHNlLCBzaGFsbG93LCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZXZlbnRGaWx0ZXIsIG9uRXJyb3IgPSAoZSkgPT4ge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH0sIGluaXRPbk1vdW50ZWQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRhdGEgPSAoc2hhbGxvdyA/IHNoYWxsb3dSZWYgOiByZWYpKHR5cGVvZiBkZWZhdWx0cyQxID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0cyQxKCkgOiBkZWZhdWx0cyQxKTtcblx0Y29uc3Qga2V5Q29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGtleSkpO1xuXHRpZiAoIXN0b3JhZ2UpIHRyeSB7XG5cdFx0c3RvcmFnZSA9IGdldFNTUkhhbmRsZXIoXCJnZXREZWZhdWx0U3RvcmFnZVwiLCAoKSA9PiBkZWZhdWx0V2luZG93ID09PSBudWxsIHx8IGRlZmF1bHRXaW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlZmF1bHRXaW5kb3cubG9jYWxTdG9yYWdlKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0b25FcnJvcihlKTtcblx0fVxuXHRpZiAoIXN0b3JhZ2UpIHJldHVybiBkYXRhO1xuXHRjb25zdCByYXdJbml0ID0gdG9WYWx1ZShkZWZhdWx0cyQxKTtcblx0Y29uc3QgdHlwZSA9IGd1ZXNzU2VyaWFsaXplclR5cGUocmF3SW5pdCk7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSAoX29wdGlvbnMkc2VyaWFsaXplciA9IG9wdGlvbnMuc2VyaWFsaXplcikgIT09IG51bGwgJiYgX29wdGlvbnMkc2VyaWFsaXplciAhPT0gdm9pZCAwID8gX29wdGlvbnMkc2VyaWFsaXplciA6IFN0b3JhZ2VTZXJpYWxpemVyc1t0eXBlXTtcblx0Y29uc3QgeyBwYXVzZTogcGF1c2VXYXRjaCwgcmVzdW1lOiByZXN1bWVXYXRjaCB9ID0gd2F0Y2hQYXVzYWJsZShkYXRhLCAobmV3VmFsdWUpID0+IHdyaXRlKG5ld1ZhbHVlKSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0ZXZlbnRGaWx0ZXJcblx0fSk7XG5cdHdhdGNoKGtleUNvbXB1dGVkLCAoKSA9PiB1cGRhdGUoKSwgeyBmbHVzaCB9KTtcblx0bGV0IGZpcnN0TW91bnRlZCA9IGZhbHNlO1xuXHRjb25zdCBvblN0b3JhZ2VFdmVudCA9IChldikgPT4ge1xuXHRcdGlmIChpbml0T25Nb3VudGVkICYmICFmaXJzdE1vdW50ZWQpIHJldHVybjtcblx0XHR1cGRhdGUoZXYpO1xuXHR9O1xuXHRjb25zdCBvblN0b3JhZ2VDdXN0b21FdmVudCA9IChldikgPT4ge1xuXHRcdGlmIChpbml0T25Nb3VudGVkICYmICFmaXJzdE1vdW50ZWQpIHJldHVybjtcblx0XHR1cGRhdGVGcm9tQ3VzdG9tRXZlbnQoZXYpO1xuXHR9O1xuXHQvKipcblx0KiBUaGUgY3VzdG9tIGV2ZW50IGlzIG5lZWRlZCBmb3Igc2FtZS1kb2N1bWVudCBzeW5jaW5nIHdoZW4gdXNpbmcgY3VzdG9tXG5cdCogc3RvcmFnZSBiYWNrZW5kcywgYnV0IGl0IGRvZXNuJ3Qgd29yayBhY3Jvc3MgZGlmZmVyZW50IGRvY3VtZW50cy5cblx0KlxuXHQqIFRPRE86IENvbnNpZGVyIGltcGxlbWVudGluZyBhIEJyb2FkY2FzdENoYW5uZWwtYmFzZWQgc29sdXRpb24gdGhhdCBmaXhlcyB0aGlzLlxuXHQqL1xuXHRpZiAod2luZG93JDEgJiYgbGlzdGVuVG9TdG9yYWdlQ2hhbmdlcykgaWYgKHN0b3JhZ2UgaW5zdGFuY2VvZiBTdG9yYWdlKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInN0b3JhZ2VcIiwgb25TdG9yYWdlRXZlbnQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0ZWxzZSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBjdXN0b21TdG9yYWdlRXZlbnROYW1lLCBvblN0b3JhZ2VDdXN0b21FdmVudCk7XG5cdGlmIChpbml0T25Nb3VudGVkKSB0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGZpcnN0TW91bnRlZCA9IHRydWU7XG5cdFx0dXBkYXRlKCk7XG5cdH0pO1xuXHRlbHNlIHVwZGF0ZSgpO1xuXHRmdW5jdGlvbiBkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG5cdFx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0XHRjb25zdCBwYXlsb2FkID0ge1xuXHRcdFx0XHRrZXk6IGtleUNvbXB1dGVkLnZhbHVlLFxuXHRcdFx0XHRvbGRWYWx1ZSxcblx0XHRcdFx0bmV3VmFsdWUsXG5cdFx0XHRcdHN0b3JhZ2VBcmVhOiBzdG9yYWdlXG5cdFx0XHR9O1xuXHRcdFx0d2luZG93JDEuZGlzcGF0Y2hFdmVudChzdG9yYWdlIGluc3RhbmNlb2YgU3RvcmFnZSA/IG5ldyBTdG9yYWdlRXZlbnQoXCJzdG9yYWdlXCIsIHBheWxvYWQpIDogbmV3IEN1c3RvbUV2ZW50KGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUsIHsgZGV0YWlsOiBwYXlsb2FkIH0pKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gd3JpdGUodikge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvbGRWYWx1ZSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXlDb21wdXRlZC52YWx1ZSk7XG5cdFx0XHRpZiAodiA9PSBudWxsKSB7XG5cdFx0XHRcdGRpc3BhdGNoV3JpdGVFdmVudChvbGRWYWx1ZSwgbnVsbCk7XG5cdFx0XHRcdHN0b3JhZ2UucmVtb3ZlSXRlbShrZXlDb21wdXRlZC52YWx1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplci53cml0ZSh2KTtcblx0XHRcdFx0aWYgKG9sZFZhbHVlICE9PSBzZXJpYWxpemVkKSB7XG5cdFx0XHRcdFx0c3RvcmFnZS5zZXRJdGVtKGtleUNvbXB1dGVkLnZhbHVlLCBzZXJpYWxpemVkKTtcblx0XHRcdFx0XHRkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIHNlcmlhbGl6ZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gcmVhZChldmVudCkge1xuXHRcdGNvbnN0IHJhd1ZhbHVlID0gZXZlbnQgPyBldmVudC5uZXdWYWx1ZSA6IHN0b3JhZ2UuZ2V0SXRlbShrZXlDb21wdXRlZC52YWx1ZSk7XG5cdFx0aWYgKHJhd1ZhbHVlID09IG51bGwpIHtcblx0XHRcdGlmICh3cml0ZURlZmF1bHRzICYmIHJhd0luaXQgIT0gbnVsbCkgc3RvcmFnZS5zZXRJdGVtKGtleUNvbXB1dGVkLnZhbHVlLCBzZXJpYWxpemVyLndyaXRlKHJhd0luaXQpKTtcblx0XHRcdHJldHVybiByYXdJbml0O1xuXHRcdH0gZWxzZSBpZiAoIWV2ZW50ICYmIG1lcmdlRGVmYXVsdHMpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0XHRcdGlmICh0eXBlb2YgbWVyZ2VEZWZhdWx0cyA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbWVyZ2VEZWZhdWx0cyh2YWx1ZSwgcmF3SW5pdCk7XG5cdFx0XHRlbHNlIGlmICh0eXBlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHtcblx0XHRcdFx0Li4ucmF3SW5pdCxcblx0XHRcdFx0Li4udmFsdWVcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcmF3VmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiByYXdWYWx1ZTtcblx0XHRlbHNlIHJldHVybiBzZXJpYWxpemVyLnJlYWQocmF3VmFsdWUpO1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZShldmVudCkge1xuXHRcdGlmIChldmVudCAmJiBldmVudC5zdG9yYWdlQXJlYSAhPT0gc3RvcmFnZSkgcmV0dXJuO1xuXHRcdGlmIChldmVudCAmJiBldmVudC5rZXkgPT0gbnVsbCkge1xuXHRcdFx0ZGF0YS52YWx1ZSA9IHJhd0luaXQ7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChldmVudCAmJiBldmVudC5rZXkgIT09IGtleUNvbXB1dGVkLnZhbHVlKSByZXR1cm47XG5cdFx0cGF1c2VXYXRjaCgpO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzZXJpYWxpemVkRGF0YSA9IHNlcmlhbGl6ZXIud3JpdGUoZGF0YS52YWx1ZSk7XG5cdFx0XHRpZiAoZXZlbnQgPT09IHZvaWQgMCB8fCAoZXZlbnQgPT09IG51bGwgfHwgZXZlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV2ZW50Lm5ld1ZhbHVlKSAhPT0gc2VyaWFsaXplZERhdGEpIGRhdGEudmFsdWUgPSByZWFkKGV2ZW50KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoZXZlbnQpIG5leHRUaWNrKHJlc3VtZVdhdGNoKTtcblx0XHRcdGVsc2UgcmVzdW1lV2F0Y2goKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlRnJvbUN1c3RvbUV2ZW50KGV2ZW50KSB7XG5cdFx0dXBkYXRlKGV2ZW50LmRldGFpbCk7XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvbG9yTW9kZS9pbmRleC50c1xuY29uc3QgQ1NTX0RJU0FCTEVfVFJBTlMgPSBcIiosKjo6YmVmb3JlLCo6OmFmdGVyey13ZWJraXQtdHJhbnNpdGlvbjpub25lIWltcG9ydGFudDstbW96LXRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7LW8tdHJhbnNpdGlvbjpub25lIWltcG9ydGFudDstbXMtdHJhbnNpdGlvbjpub25lIWltcG9ydGFudDt0cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50fVwiO1xuLyoqXG4qIFJlYWN0aXZlIGNvbG9yIG1vZGUgd2l0aCBhdXRvIGRhdGEgcGVyc2lzdGVuY2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNvbG9yTW9kZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUNvbG9yTW9kZShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBzZWxlY3RvciA9IFwiaHRtbFwiLCBhdHRyaWJ1dGUgPSBcImNsYXNzXCIsIGluaXRpYWxWYWx1ZSA9IFwiYXV0b1wiLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3RvcmFnZSwgc3RvcmFnZUtleSA9IFwidnVldXNlLWNvbG9yLXNjaGVtZVwiLCBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzID0gdHJ1ZSwgc3RvcmFnZVJlZiwgZW1pdEF1dG8sIGRpc2FibGVUcmFuc2l0aW9uID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgbW9kZXMgPSB7XG5cdFx0YXV0bzogXCJcIixcblx0XHRsaWdodDogXCJsaWdodFwiLFxuXHRcdGRhcms6IFwiZGFya1wiLFxuXHRcdC4uLm9wdGlvbnMubW9kZXMgfHwge31cblx0fTtcblx0Y29uc3QgcHJlZmVycmVkRGFyayA9IHVzZVByZWZlcnJlZERhcmsoeyB3aW5kb3c6IHdpbmRvdyQxIH0pO1xuXHRjb25zdCBzeXN0ZW0gPSBjb21wdXRlZCgoKSA9PiBwcmVmZXJyZWREYXJrLnZhbHVlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIpO1xuXHRjb25zdCBzdG9yZSA9IHN0b3JhZ2VSZWYgfHwgKHN0b3JhZ2VLZXkgPT0gbnVsbCA/IHRvUmVmKGluaXRpYWxWYWx1ZSkgOiB1c2VTdG9yYWdlKHN0b3JhZ2VLZXksIGluaXRpYWxWYWx1ZSwgc3RvcmFnZSwge1xuXHRcdHdpbmRvdzogd2luZG93JDEsXG5cdFx0bGlzdGVuVG9TdG9yYWdlQ2hhbmdlc1xuXHR9KSk7XG5cdGNvbnN0IHN0YXRlID0gY29tcHV0ZWQoKCkgPT4gc3RvcmUudmFsdWUgPT09IFwiYXV0b1wiID8gc3lzdGVtLnZhbHVlIDogc3RvcmUudmFsdWUpO1xuXHRjb25zdCB1cGRhdGVIVE1MQXR0cnMgPSBnZXRTU1JIYW5kbGVyKFwidXBkYXRlSFRNTEF0dHJzXCIsIChzZWxlY3RvciQxLCBhdHRyaWJ1dGUkMSwgdmFsdWUpID0+IHtcblx0XHRjb25zdCBlbCA9IHR5cGVvZiBzZWxlY3RvciQxID09PSBcInN0cmluZ1wiID8gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IkMSkgOiB1bnJlZkVsZW1lbnQoc2VsZWN0b3IkMSk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGNvbnN0IGNsYXNzZXNUb0FkZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdFx0Y29uc3QgY2xhc3Nlc1RvUmVtb3ZlID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0XHRsZXQgYXR0cmlidXRlVG9DaGFuZ2UgPSBudWxsO1xuXHRcdGlmIChhdHRyaWJ1dGUkMSA9PT0gXCJjbGFzc1wiKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50ID0gdmFsdWUuc3BsaXQoL1xccy9nKTtcblx0XHRcdE9iamVjdC52YWx1ZXMobW9kZXMpLmZsYXRNYXAoKGkpID0+IChpIHx8IFwiXCIpLnNwbGl0KC9cXHMvZykpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKCh2KSA9PiB7XG5cdFx0XHRcdGlmIChjdXJyZW50LmluY2x1ZGVzKHYpKSBjbGFzc2VzVG9BZGQuYWRkKHYpO1xuXHRcdFx0XHRlbHNlIGNsYXNzZXNUb1JlbW92ZS5hZGQodik7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgYXR0cmlidXRlVG9DaGFuZ2UgPSB7XG5cdFx0XHRrZXk6IGF0dHJpYnV0ZSQxLFxuXHRcdFx0dmFsdWVcblx0XHR9O1xuXHRcdGlmIChjbGFzc2VzVG9BZGQuc2l6ZSA9PT0gMCAmJiBjbGFzc2VzVG9SZW1vdmUuc2l6ZSA9PT0gMCAmJiBhdHRyaWJ1dGVUb0NoYW5nZSA9PT0gbnVsbCkgcmV0dXJuO1xuXHRcdGxldCBzdHlsZTtcblx0XHRpZiAoZGlzYWJsZVRyYW5zaXRpb24pIHtcblx0XHRcdHN0eWxlID0gd2luZG93JDEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdFx0c3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoQ1NTX0RJU0FCTEVfVFJBTlMpKTtcblx0XHRcdHdpbmRvdyQxLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGMgb2YgY2xhc3Nlc1RvQWRkKSBlbC5jbGFzc0xpc3QuYWRkKGMpO1xuXHRcdGZvciAoY29uc3QgYyBvZiBjbGFzc2VzVG9SZW1vdmUpIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7XG5cdFx0aWYgKGF0dHJpYnV0ZVRvQ2hhbmdlKSBlbC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlVG9DaGFuZ2Uua2V5LCBhdHRyaWJ1dGVUb0NoYW5nZS52YWx1ZSk7XG5cdFx0aWYgKGRpc2FibGVUcmFuc2l0aW9uKSB7XG5cdFx0XHR3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKHN0eWxlKS5vcGFjaXR5O1xuXHRcdFx0ZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzdHlsZSk7XG5cdFx0fVxuXHR9KTtcblx0ZnVuY3Rpb24gZGVmYXVsdE9uQ2hhbmdlZChtb2RlKSB7XG5cdFx0dmFyIF9tb2RlcyRtb2RlO1xuXHRcdHVwZGF0ZUhUTUxBdHRycyhzZWxlY3RvciwgYXR0cmlidXRlLCAoX21vZGVzJG1vZGUgPSBtb2Rlc1ttb2RlXSkgIT09IG51bGwgJiYgX21vZGVzJG1vZGUgIT09IHZvaWQgMCA/IF9tb2RlcyRtb2RlIDogbW9kZSk7XG5cdH1cblx0ZnVuY3Rpb24gb25DaGFuZ2VkKG1vZGUpIHtcblx0XHRpZiAob3B0aW9ucy5vbkNoYW5nZWQpIG9wdGlvbnMub25DaGFuZ2VkKG1vZGUsIGRlZmF1bHRPbkNoYW5nZWQpO1xuXHRcdGVsc2UgZGVmYXVsdE9uQ2hhbmdlZChtb2RlKTtcblx0fVxuXHR3YXRjaChzdGF0ZSwgb25DaGFuZ2VkLCB7XG5cdFx0Zmx1c2g6IFwicG9zdFwiLFxuXHRcdGltbWVkaWF0ZTogdHJ1ZVxuXHR9KTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IG9uQ2hhbmdlZChzdGF0ZS52YWx1ZSkpO1xuXHRjb25zdCBhdXRvID0gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBlbWl0QXV0byA/IHN0b3JlLnZhbHVlIDogc3RhdGUudmFsdWU7XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0c3RvcmUudmFsdWUgPSB2O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBPYmplY3QuYXNzaWduKGF1dG8sIHtcblx0XHRzdG9yZSxcblx0XHRzeXN0ZW0sXG5cdFx0c3RhdGVcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvbmZpcm1EaWFsb2cvaW5kZXgudHNcbi8qKlxuKiBIb29rcyBmb3IgY3JlYXRpbmcgY29uZmlybSBkaWFsb2dzLiBVc2VmdWwgZm9yIG1vZGFsIHdpbmRvd3MsIHBvcHVwcyBhbmQgbG9naW5zLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDb25maXJtRGlhbG9nL1xuKiBAcGFyYW0gcmV2ZWFsZWQgYGJvb2xlYW5gIGByZWZgIHRoYXQgaGFuZGxlcyBhIG1vZGFsIHdpbmRvd1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUNvbmZpcm1EaWFsb2cocmV2ZWFsZWQgPSBzaGFsbG93UmVmKGZhbHNlKSkge1xuXHRjb25zdCBjb25maXJtSG9vayA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBjYW5jZWxIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHJldmVhbEhvb2sgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0bGV0IF9yZXNvbHZlID0gbm9vcDtcblx0Y29uc3QgcmV2ZWFsID0gKGRhdGEpID0+IHtcblx0XHRyZXZlYWxIb29rLnRyaWdnZXIoZGF0YSk7XG5cdFx0cmV2ZWFsZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0X3Jlc29sdmUgPSByZXNvbHZlO1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBjb25maXJtID0gKGRhdGEpID0+IHtcblx0XHRyZXZlYWxlZC52YWx1ZSA9IGZhbHNlO1xuXHRcdGNvbmZpcm1Ib29rLnRyaWdnZXIoZGF0YSk7XG5cdFx0X3Jlc29sdmUoe1xuXHRcdFx0ZGF0YSxcblx0XHRcdGlzQ2FuY2VsZWQ6IGZhbHNlXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IGNhbmNlbCA9IChkYXRhKSA9PiB7XG5cdFx0cmV2ZWFsZWQudmFsdWUgPSBmYWxzZTtcblx0XHRjYW5jZWxIb29rLnRyaWdnZXIoZGF0YSk7XG5cdFx0X3Jlc29sdmUoe1xuXHRcdFx0ZGF0YSxcblx0XHRcdGlzQ2FuY2VsZWQ6IHRydWVcblx0XHR9KTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1JldmVhbGVkOiBjb21wdXRlZCgoKSA9PiByZXZlYWxlZC52YWx1ZSksXG5cdFx0cmV2ZWFsLFxuXHRcdGNvbmZpcm0sXG5cdFx0Y2FuY2VsLFxuXHRcdG9uUmV2ZWFsOiByZXZlYWxIb29rLm9uLFxuXHRcdG9uQ29uZmlybTogY29uZmlybUhvb2sub24sXG5cdFx0b25DYW5jZWw6IGNhbmNlbEhvb2sub25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ291bnRkb3duL2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDgob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IDFlMywgaW1tZWRpYXRlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlIH0pO1xuXHR9XG5cdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIDFlMywgeyBpbW1lZGlhdGU6IGZhbHNlIH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIGNvdW50ZG93biB0aW1lciBpbiBzZWNvbmRzLlxuKlxuKiBAcGFyYW0gaW5pdGlhbENvdW50ZG93blxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDb3VudGRvd25cbiovXG5mdW5jdGlvbiB1c2VDb3VudGRvd24oaW5pdGlhbENvdW50ZG93biwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHJlbWFpbmluZyA9IHNoYWxsb3dSZWYodG9WYWx1ZShpbml0aWFsQ291bnRkb3duKSk7XG5cdGNvbnN0IHsgc2NoZWR1bGVyID0gZ2V0RGVmYXVsdFNjaGVkdWxlciQ4KG9wdGlvbnMpLCBvblRpY2ssIG9uQ29tcGxldGUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNvbnRyb2xzID0gc2NoZWR1bGVyKCgpID0+IHtcblx0XHRjb25zdCB2YWx1ZSA9IHJlbWFpbmluZy52YWx1ZSAtIDE7XG5cdFx0cmVtYWluaW5nLnZhbHVlID0gdmFsdWUgPCAwID8gMCA6IHZhbHVlO1xuXHRcdG9uVGljayA9PT0gbnVsbCB8fCBvblRpY2sgPT09IHZvaWQgMCB8fCBvblRpY2soKTtcblx0XHRpZiAocmVtYWluaW5nLnZhbHVlIDw9IDApIHtcblx0XHRcdGNvbnRyb2xzLnBhdXNlKCk7XG5cdFx0XHRvbkNvbXBsZXRlID09PSBudWxsIHx8IG9uQ29tcGxldGUgPT09IHZvaWQgMCB8fCBvbkNvbXBsZXRlKCk7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgcmVzZXQgPSAoY291bnRkb3duKSA9PiB7XG5cdFx0dmFyIF90b1ZhbHVlO1xuXHRcdHJlbWFpbmluZy52YWx1ZSA9IChfdG9WYWx1ZSA9IHRvVmFsdWUoY291bnRkb3duKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogdG9WYWx1ZShpbml0aWFsQ291bnRkb3duKTtcblx0fTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRjb250cm9scy5wYXVzZSgpO1xuXHRcdHJlc2V0KCk7XG5cdH07XG5cdGNvbnN0IHJlc3VtZSA9ICgpID0+IHtcblx0XHRpZiAoIWNvbnRyb2xzLmlzQWN0aXZlLnZhbHVlKSB7XG5cdFx0XHRpZiAocmVtYWluaW5nLnZhbHVlID4gMCkgY29udHJvbHMucmVzdW1lKCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzdGFydCA9IChjb3VudGRvd24pID0+IHtcblx0XHRyZXNldChjb3VudGRvd24pO1xuXHRcdGNvbnRyb2xzLnJlc3VtZSgpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHJlbWFpbmluZyxcblx0XHRyZXNldCxcblx0XHRzdG9wLFxuXHRcdHN0YXJ0LFxuXHRcdHBhdXNlOiBjb250cm9scy5wYXVzZSxcblx0XHRyZXN1bWUsXG5cdFx0aXNBY3RpdmU6IGNvbnRyb2xzLmlzQWN0aXZlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNzc1N1cHBvcnRzL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDc3NTdXBwb3J0cyguLi5hcmdzKSB7XG5cdGxldCBvcHRpb25zID0ge307XG5cdGlmICh0eXBlb2YgdG9WYWx1ZShhcmdzLmF0KC0xKSkgPT09IFwib2JqZWN0XCIpIG9wdGlvbnMgPSBhcmdzLnBvcCgpO1xuXHRjb25zdCBbcHJvcCwgdmFsdWVdID0gYXJncztcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3NyVmFsdWUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpO1xuXHRyZXR1cm4geyBpc1N1cHBvcnRlZDogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlzTW91bnRlZC52YWx1ZTtcblx0XHRpZiAoIWlzQ2xpZW50KSByZXR1cm4gc3NyVmFsdWU7XG5cdFx0cmV0dXJuIGFyZ3MubGVuZ3RoID09PSAyID8gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLkNTUy5zdXBwb3J0cyh0b1ZhbHVlKHByb3ApLCB0b1ZhbHVlKHZhbHVlKSkgOiB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuQ1NTLnN1cHBvcnRzKHRvVmFsdWUocHJvcCkpO1xuXHR9KSB9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDc3NWYXIvaW5kZXgudHNcbi8qKlxuKiBNYW5pcHVsYXRlIENTUyB2YXJpYWJsZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNzc1ZhclxuKiBAcGFyYW0gcHJvcFxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlQ3NzVmFyKHByb3AsIHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGluaXRpYWxWYWx1ZSwgb2JzZXJ2ZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB2YXJpYWJsZSA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgZWxSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF93aW5kb3ckZG9jdW1lbnQ7XG5cdFx0cmV0dXJuIHVucmVmRWxlbWVudCh0YXJnZXQpIHx8ICh3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwIHx8IChfd2luZG93JGRvY3VtZW50ID0gd2luZG93JDEuZG9jdW1lbnQpID09PSBudWxsIHx8IF93aW5kb3ckZG9jdW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcblx0fSk7XG5cdGZ1bmN0aW9uIHVwZGF0ZUNzc1ZhcigpIHtcblx0XHRjb25zdCBrZXkgPSB0b1ZhbHVlKHByb3ApO1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZShlbFJlZik7XG5cdFx0aWYgKGVsICYmIHdpbmRvdyQxICYmIGtleSkge1xuXHRcdFx0dmFyIF93aW5kb3ckZ2V0Q29tcHV0ZWRTdDtcblx0XHRcdHZhcmlhYmxlLnZhbHVlID0gKChfd2luZG93JGdldENvbXB1dGVkU3QgPSB3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKGVsKS5nZXRQcm9wZXJ0eVZhbHVlKGtleSkpID09PSBudWxsIHx8IF93aW5kb3ckZ2V0Q29tcHV0ZWRTdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdyRnZXRDb21wdXRlZFN0LnRyaW0oKSkgfHwgdmFyaWFibGUudmFsdWUgfHwgaW5pdGlhbFZhbHVlO1xuXHRcdH1cblx0fVxuXHRpZiAob2JzZXJ2ZSkgdXNlTXV0YXRpb25PYnNlcnZlcihlbFJlZiwgdXBkYXRlQ3NzVmFyLCB7XG5cdFx0YXR0cmlidXRlRmlsdGVyOiBbXCJzdHlsZVwiLCBcImNsYXNzXCJdLFxuXHRcdHdpbmRvdzogd2luZG93JDFcblx0fSk7XG5cdHdhdGNoKFtlbFJlZiwgKCkgPT4gdG9WYWx1ZShwcm9wKV0sIChfLCBvbGQpID0+IHtcblx0XHRpZiAob2xkWzBdICYmIG9sZFsxXSkgb2xkWzBdLnN0eWxlLnJlbW92ZVByb3BlcnR5KG9sZFsxXSk7XG5cdFx0dXBkYXRlQ3NzVmFyKCk7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHR3YXRjaChbdmFyaWFibGUsIGVsUmVmXSwgKFt2YWwsIGVsXSkgPT4ge1xuXHRcdGNvbnN0IHJhd19wcm9wID0gdG9WYWx1ZShwcm9wKTtcblx0XHRpZiAoKGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zdHlsZSkgJiYgcmF3X3Byb3ApIGlmICh2YWwgPT0gbnVsbCkgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkocmF3X3Byb3ApO1xuXHRcdGVsc2UgZWwuc3R5bGUuc2V0UHJvcGVydHkocmF3X3Byb3AsIHZhbCk7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHRyZXR1cm4gdmFyaWFibGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUN1cnJlbnRFbGVtZW50L2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDdXJyZW50RWxlbWVudChyb290Q29tcG9uZW50KSB7XG5cdGNvbnN0IHZtID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gY29tcHV0ZWRXaXRoQ29udHJvbCgoKSA9PiBudWxsLCAoKSA9PiByb290Q29tcG9uZW50ID8gdW5yZWZFbGVtZW50KHJvb3RDb21wb25lbnQpIDogdm0ucHJveHkuJGVsKTtcblx0b25VcGRhdGVkKGN1cnJlbnRFbGVtZW50LnRyaWdnZXIpO1xuXHRvbk1vdW50ZWQoY3VycmVudEVsZW1lbnQudHJpZ2dlcik7XG5cdHJldHVybiBjdXJyZW50RWxlbWVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ3ljbGVMaXN0L2luZGV4LnRzXG4vKipcbiogQ3ljbGUgdGhyb3VnaCBhIGxpc3Qgb2YgaXRlbXNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQ3ljbGVMaXN0XG4qL1xuZnVuY3Rpb24gdXNlQ3ljbGVMaXN0KGxpc3QsIG9wdGlvbnMpIHtcblx0Y29uc3Qgc3RhdGUgPSBzaGFsbG93UmVmKGdldEluaXRpYWxWYWx1ZSgpKTtcblx0Y29uc3QgbGlzdFJlZiA9IHRvUmVmKGxpc3QpO1xuXHRjb25zdCBpbmRleCA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHR2YXIgX29wdGlvbnMkZmFsbGJhY2tJbmRlO1xuXHRcdFx0Y29uc3QgdGFyZ2V0TGlzdCA9IGxpc3RSZWYudmFsdWU7XG5cdFx0XHRsZXQgaW5kZXgkMSA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2V0SW5kZXhPZikgPyBvcHRpb25zLmdldEluZGV4T2Yoc3RhdGUudmFsdWUsIHRhcmdldExpc3QpIDogdGFyZ2V0TGlzdC5pbmRleE9mKHN0YXRlLnZhbHVlKTtcblx0XHRcdGlmIChpbmRleCQxIDwgMCkgaW5kZXgkMSA9IChfb3B0aW9ucyRmYWxsYmFja0luZGUgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmFsbGJhY2tJbmRleCkgIT09IG51bGwgJiYgX29wdGlvbnMkZmFsbGJhY2tJbmRlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRmYWxsYmFja0luZGUgOiAwO1xuXHRcdFx0cmV0dXJuIGluZGV4JDE7XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0c2V0KHYpO1xuXHRcdH1cblx0fSk7XG5cdGZ1bmN0aW9uIHNldChpKSB7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdCA9IGxpc3RSZWYudmFsdWU7XG5cdFx0Y29uc3QgbGVuZ3RoID0gdGFyZ2V0TGlzdC5sZW5ndGg7XG5cdFx0Y29uc3QgdmFsdWUgPSB0YXJnZXRMaXN0WyhpICUgbGVuZ3RoICsgbGVuZ3RoKSAlIGxlbmd0aF07XG5cdFx0c3RhdGUudmFsdWUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblx0ZnVuY3Rpb24gc2hpZnQoZGVsdGEgPSAxKSB7XG5cdFx0cmV0dXJuIHNldChpbmRleC52YWx1ZSArIGRlbHRhKTtcblx0fVxuXHRmdW5jdGlvbiBuZXh0KG4gPSAxKSB7XG5cdFx0cmV0dXJuIHNoaWZ0KG4pO1xuXHR9XG5cdGZ1bmN0aW9uIHByZXYobiA9IDEpIHtcblx0XHRyZXR1cm4gc2hpZnQoLW4pO1xuXHR9XG5cdGZ1bmN0aW9uIGdldEluaXRpYWxWYWx1ZSgpIHtcblx0XHR2YXIgX3RvVmFsdWUsIF9vcHRpb25zJGluaXRpYWxWYWx1ZTtcblx0XHRyZXR1cm4gKF90b1ZhbHVlID0gdG9WYWx1ZSgoX29wdGlvbnMkaW5pdGlhbFZhbHVlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmluaXRpYWxWYWx1ZSkgIT09IG51bGwgJiYgX29wdGlvbnMkaW5pdGlhbFZhbHVlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRpbml0aWFsVmFsdWUgOiB0b1ZhbHVlKGxpc3QpWzBdKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogdm9pZCAwO1xuXHR9XG5cdHdhdGNoKGxpc3RSZWYsICgpID0+IHNldChpbmRleC52YWx1ZSkpO1xuXHRyZXR1cm4ge1xuXHRcdHN0YXRlLFxuXHRcdGluZGV4LFxuXHRcdG5leHQsXG5cdFx0cHJldixcblx0XHRnbzogc2V0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURhcmsvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBkYXJrIG1vZGUgd2l0aCBhdXRvIGRhdGEgcGVyc2lzdGVuY2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURhcmtcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEYXJrKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHZhbHVlRGFyayA9IFwiZGFya1wiLCB2YWx1ZUxpZ2h0ID0gXCJcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgbW9kZSA9IHVzZUNvbG9yTW9kZSh7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRvbkNoYW5nZWQ6IChtb2RlJDEsIGRlZmF1bHRIYW5kbGVyKSA9PiB7XG5cdFx0XHR2YXIgX29wdGlvbnMkb25DaGFuZ2VkO1xuXHRcdFx0aWYgKG9wdGlvbnMub25DaGFuZ2VkKSAoX29wdGlvbnMkb25DaGFuZ2VkID0gb3B0aW9ucy5vbkNoYW5nZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uQ2hhbmdlZCA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uQ2hhbmdlZC5jYWxsKG9wdGlvbnMsIG1vZGUkMSA9PT0gXCJkYXJrXCIsIGRlZmF1bHRIYW5kbGVyLCBtb2RlJDEpO1xuXHRcdFx0ZWxzZSBkZWZhdWx0SGFuZGxlcihtb2RlJDEpO1xuXHRcdH0sXG5cdFx0bW9kZXM6IHtcblx0XHRcdGRhcms6IHZhbHVlRGFyayxcblx0XHRcdGxpZ2h0OiB2YWx1ZUxpZ2h0XG5cdFx0fVxuXHR9KTtcblx0Y29uc3Qgc3lzdGVtID0gY29tcHV0ZWQoKCkgPT4gbW9kZS5zeXN0ZW0udmFsdWUpO1xuXHRyZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBtb2RlLnZhbHVlID09PSBcImRhcmtcIjtcblx0XHR9LFxuXHRcdHNldCh2KSB7XG5cdFx0XHRjb25zdCBtb2RlVmFsID0gdiA/IFwiZGFya1wiIDogXCJsaWdodFwiO1xuXHRcdFx0aWYgKHN5c3RlbS52YWx1ZSA9PT0gbW9kZVZhbCkgbW9kZS52YWx1ZSA9IFwiYXV0b1wiO1xuXHRcdFx0ZWxzZSBtb2RlLnZhbHVlID0gbW9kZVZhbDtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNYW51YWxSZWZIaXN0b3J5L2luZGV4LnRzXG5mdW5jdGlvbiBmbkJ5cGFzcyh2KSB7XG5cdHJldHVybiB2O1xufVxuZnVuY3Rpb24gZm5TZXRTb3VyY2Uoc291cmNlLCB2YWx1ZSkge1xuXHRyZXR1cm4gc291cmNlLnZhbHVlID0gdmFsdWU7XG59XG5mdW5jdGlvbiBkZWZhdWx0RHVtcChjbG9uZSkge1xuXHRyZXR1cm4gY2xvbmUgPyB0eXBlb2YgY2xvbmUgPT09IFwiZnVuY3Rpb25cIiA/IGNsb25lIDogY2xvbmVGbkpTT04gOiBmbkJ5cGFzcztcbn1cbmZ1bmN0aW9uIGRlZmF1bHRQYXJzZShjbG9uZSkge1xuXHRyZXR1cm4gY2xvbmUgPyB0eXBlb2YgY2xvbmUgPT09IFwiZnVuY3Rpb25cIiA/IGNsb25lIDogY2xvbmVGbkpTT04gOiBmbkJ5cGFzcztcbn1cbi8qKlxuKiBUcmFjayB0aGUgY2hhbmdlIGhpc3Rvcnkgb2YgYSByZWYsIGFsc28gcHJvdmlkZXMgdW5kbyBhbmQgcmVkbyBmdW5jdGlvbmFsaXR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNYW51YWxSZWZIaXN0b3J5XG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VNYW51YWxSZWZIaXN0b3J5KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY2xvbmUgPSBmYWxzZSwgZHVtcCA9IGRlZmF1bHREdW1wKGNsb25lKSwgcGFyc2UgPSBkZWZhdWx0UGFyc2UoY2xvbmUpLCBzZXRTb3VyY2UgPSBmblNldFNvdXJjZSB9ID0gb3B0aW9ucztcblx0ZnVuY3Rpb24gX2NyZWF0ZUhpc3RvcnlSZWNvcmQoKSB7XG5cdFx0cmV0dXJuIG1hcmtSYXcoe1xuXHRcdFx0c25hcHNob3Q6IGR1bXAoc291cmNlLnZhbHVlKSxcblx0XHRcdHRpbWVzdGFtcDogdGltZXN0YW1wKClcblx0XHR9KTtcblx0fVxuXHRjb25zdCBsYXN0ID0gcmVmKF9jcmVhdGVIaXN0b3J5UmVjb3JkKCkpO1xuXHRjb25zdCB1bmRvU3RhY2sgPSByZWYoW10pO1xuXHRjb25zdCByZWRvU3RhY2sgPSByZWYoW10pO1xuXHRjb25zdCBfc2V0U291cmNlID0gKHJlY29yZCkgPT4ge1xuXHRcdHNldFNvdXJjZShzb3VyY2UsIHBhcnNlKHJlY29yZC5zbmFwc2hvdCkpO1xuXHRcdGxhc3QudmFsdWUgPSByZWNvcmQ7XG5cdH07XG5cdGNvbnN0IGNvbW1pdCA9ICgpID0+IHtcblx0XHR1bmRvU3RhY2sudmFsdWUudW5zaGlmdChsYXN0LnZhbHVlKTtcblx0XHRsYXN0LnZhbHVlID0gX2NyZWF0ZUhpc3RvcnlSZWNvcmQoKTtcblx0XHRpZiAob3B0aW9ucy5jYXBhY2l0eSAmJiB1bmRvU3RhY2sudmFsdWUubGVuZ3RoID4gb3B0aW9ucy5jYXBhY2l0eSkgdW5kb1N0YWNrLnZhbHVlLnNwbGljZShvcHRpb25zLmNhcGFjaXR5LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXHRcdGlmIChyZWRvU3RhY2sudmFsdWUubGVuZ3RoKSByZWRvU3RhY2sudmFsdWUuc3BsaWNlKDAsIHJlZG9TdGFjay52YWx1ZS5sZW5ndGgpO1xuXHR9O1xuXHRjb25zdCBjbGVhciA9ICgpID0+IHtcblx0XHR1bmRvU3RhY2sudmFsdWUuc3BsaWNlKDAsIHVuZG9TdGFjay52YWx1ZS5sZW5ndGgpO1xuXHRcdHJlZG9TdGFjay52YWx1ZS5zcGxpY2UoMCwgcmVkb1N0YWNrLnZhbHVlLmxlbmd0aCk7XG5cdH07XG5cdGNvbnN0IHVuZG8gPSAoKSA9PiB7XG5cdFx0Y29uc3Qgc3RhdGUgPSB1bmRvU3RhY2sudmFsdWUuc2hpZnQoKTtcblx0XHRpZiAoc3RhdGUpIHtcblx0XHRcdHJlZG9TdGFjay52YWx1ZS51bnNoaWZ0KGxhc3QudmFsdWUpO1xuXHRcdFx0X3NldFNvdXJjZShzdGF0ZSk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCByZWRvID0gKCkgPT4ge1xuXHRcdGNvbnN0IHN0YXRlID0gcmVkb1N0YWNrLnZhbHVlLnNoaWZ0KCk7XG5cdFx0aWYgKHN0YXRlKSB7XG5cdFx0XHR1bmRvU3RhY2sudmFsdWUudW5zaGlmdChsYXN0LnZhbHVlKTtcblx0XHRcdF9zZXRTb3VyY2Uoc3RhdGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcmVzZXQgPSAoKSA9PiB7XG5cdFx0X3NldFNvdXJjZShsYXN0LnZhbHVlKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRzb3VyY2UsXG5cdFx0dW5kb1N0YWNrLFxuXHRcdHJlZG9TdGFjayxcblx0XHRsYXN0LFxuXHRcdGhpc3Rvcnk6IGNvbXB1dGVkKCgpID0+IFtsYXN0LnZhbHVlLCAuLi51bmRvU3RhY2sudmFsdWVdKSxcblx0XHRjYW5VbmRvOiBjb21wdXRlZCgoKSA9PiB1bmRvU3RhY2sudmFsdWUubGVuZ3RoID4gMCksXG5cdFx0Y2FuUmVkbzogY29tcHV0ZWQoKCkgPT4gcmVkb1N0YWNrLnZhbHVlLmxlbmd0aCA+IDApLFxuXHRcdGNsZWFyLFxuXHRcdGNvbW1pdCxcblx0XHRyZXNldCxcblx0XHR1bmRvLFxuXHRcdHJlZG9cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUmVmSGlzdG9yeS9pbmRleC50c1xuLyoqXG4qIFRyYWNrIHRoZSBjaGFuZ2UgaGlzdG9yeSBvZiBhIHJlZiwgYWxzbyBwcm92aWRlcyB1bmRvIGFuZCByZWRvIGZ1bmN0aW9uYWxpdHkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVJlZkhpc3RvcnlcbiogQHBhcmFtIHNvdXJjZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVJlZkhpc3Rvcnkoc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkZWVwID0gZmFsc2UsIGZsdXNoID0gXCJwcmVcIiwgZXZlbnRGaWx0ZXIsIHNob3VsZENvbW1pdCA9ICgpID0+IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHsgZXZlbnRGaWx0ZXI6IGNvbXBvc2VkRmlsdGVyLCBwYXVzZSwgcmVzdW1lOiByZXN1bWVUcmFja2luZywgaXNBY3RpdmU6IGlzVHJhY2tpbmcgfSA9IHBhdXNhYmxlRmlsdGVyKGV2ZW50RmlsdGVyKTtcblx0bGV0IGxhc3RSYXdWYWx1ZSA9IHNvdXJjZS52YWx1ZTtcblx0Y29uc3QgeyBpZ25vcmVVcGRhdGVzLCBpZ25vcmVQcmV2QXN5bmNVcGRhdGVzLCBzdG9wIH0gPSB3YXRjaElnbm9yYWJsZShzb3VyY2UsIGNvbW1pdCwge1xuXHRcdGRlZXAsXG5cdFx0Zmx1c2gsXG5cdFx0ZXZlbnRGaWx0ZXI6IGNvbXBvc2VkRmlsdGVyXG5cdH0pO1xuXHRmdW5jdGlvbiBzZXRTb3VyY2Uoc291cmNlJDEsIHZhbHVlKSB7XG5cdFx0aWdub3JlUHJldkFzeW5jVXBkYXRlcygpO1xuXHRcdGlnbm9yZVVwZGF0ZXMoKCkgPT4ge1xuXHRcdFx0c291cmNlJDEudmFsdWUgPSB2YWx1ZTtcblx0XHRcdGxhc3RSYXdWYWx1ZSA9IHZhbHVlO1xuXHRcdH0pO1xuXHR9XG5cdGNvbnN0IG1hbnVhbEhpc3RvcnkgPSB1c2VNYW51YWxSZWZIaXN0b3J5KHNvdXJjZSwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0Y2xvbmU6IG9wdGlvbnMuY2xvbmUgfHwgZGVlcCxcblx0XHRzZXRTb3VyY2Vcblx0fSk7XG5cdGNvbnN0IHsgY2xlYXIsIGNvbW1pdDogbWFudWFsQ29tbWl0IH0gPSBtYW51YWxIaXN0b3J5O1xuXHRmdW5jdGlvbiBjb21taXQoKSB7XG5cdFx0aWdub3JlUHJldkFzeW5jVXBkYXRlcygpO1xuXHRcdGlmICghc2hvdWxkQ29tbWl0KGxhc3RSYXdWYWx1ZSwgc291cmNlLnZhbHVlKSkgcmV0dXJuO1xuXHRcdGxhc3RSYXdWYWx1ZSA9IHNvdXJjZS52YWx1ZTtcblx0XHRtYW51YWxDb21taXQoKTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoY29tbWl0Tm93KSB7XG5cdFx0cmVzdW1lVHJhY2tpbmcoKTtcblx0XHRpZiAoY29tbWl0Tm93KSBjb21taXQoKTtcblx0fVxuXHRmdW5jdGlvbiBiYXRjaChmbikge1xuXHRcdGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNhbmNlbCA9ICgpID0+IGNhbmNlbGVkID0gdHJ1ZTtcblx0XHRpZ25vcmVVcGRhdGVzKCgpID0+IHtcblx0XHRcdGZuKGNhbmNlbCk7XG5cdFx0fSk7XG5cdFx0aWYgKCFjYW5jZWxlZCkgY29tbWl0KCk7XG5cdH1cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblx0XHRzdG9wKCk7XG5cdFx0Y2xlYXIoKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdC4uLm1hbnVhbEhpc3RvcnksXG5cdFx0aXNUcmFja2luZyxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWUsXG5cdFx0Y29tbWl0LFxuXHRcdGJhdGNoLFxuXHRcdGRpc3Bvc2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGVib3VuY2VkUmVmSGlzdG9yeS9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3IgW3VzZVJlZkhpc3RvcnldKGh0dHBzOi8vdnVldXNlLm9yZy91c2VSZWZIaXN0b3J5KSB3aXRoIGRlYm91bmNlIGZpbHRlci5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGVib3VuY2VkUmVmSGlzdG9yeVxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRGVib3VuY2VkUmVmSGlzdG9yeShzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBmaWx0ZXIgPSBvcHRpb25zLmRlYm91bmNlID8gZGVib3VuY2VGaWx0ZXIob3B0aW9ucy5kZWJvdW5jZSkgOiB2b2lkIDA7XG5cdHJldHVybiB7IC4uLnVzZVJlZkhpc3Rvcnkoc291cmNlLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogZmlsdGVyXG5cdH0pIH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURldmljZU1vdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIERldmljZU1vdGlvbkV2ZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEZXZpY2VNb3Rpb25cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEZXZpY2VNb3Rpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHJlcXVlc3RQZXJtaXNzaW9ucyA9IGZhbHNlLCBldmVudEZpbHRlciA9IGJ5cGFzc0ZpbHRlciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiBEZXZpY2VNb3Rpb25FdmVudCAhPT0gXCJ1bmRlZmluZWRcIik7XG5cdGNvbnN0IHJlcXVpcmVQZXJtaXNzaW9ucyA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gaXNTdXBwb3J0ZWQudmFsdWUgJiYgXCJyZXF1ZXN0UGVybWlzc2lvblwiIGluIERldmljZU1vdGlvbkV2ZW50ICYmIHR5cGVvZiBEZXZpY2VNb3Rpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbiA9PT0gXCJmdW5jdGlvblwiKTtcblx0Y29uc3QgcGVybWlzc2lvbkdyYW50ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgYWNjZWxlcmF0aW9uID0gcmVmKHtcblx0XHR4OiBudWxsLFxuXHRcdHk6IG51bGwsXG5cdFx0ejogbnVsbFxuXHR9KTtcblx0Y29uc3Qgcm90YXRpb25SYXRlID0gcmVmKHtcblx0XHRhbHBoYTogbnVsbCxcblx0XHRiZXRhOiBudWxsLFxuXHRcdGdhbW1hOiBudWxsXG5cdH0pO1xuXHRjb25zdCBpbnRlcnZhbCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkgPSByZWYoe1xuXHRcdHg6IG51bGwsXG5cdFx0eTogbnVsbCxcblx0XHR6OiBudWxsXG5cdH0pO1xuXHRmdW5jdGlvbiBpbml0KCkge1xuXHRcdGlmICh3aW5kb3ckMSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkZXZpY2Vtb3Rpb25cIiwgY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgKGV2ZW50KSA9PiB7XG5cdFx0XHR2YXIgX2V2ZW50JGFjY2VsZXJhdGlvbiwgX2V2ZW50JGFjY2VsZXJhdGlvbjIsIF9ldmVudCRhY2NlbGVyYXRpb24zLCBfZXZlbnQkYWNjZWxlcmF0aW9uSW4sIF9ldmVudCRhY2NlbGVyYXRpb25JbjIsIF9ldmVudCRhY2NlbGVyYXRpb25JbjMsIF9ldmVudCRyb3RhdGlvblJhdGUsIF9ldmVudCRyb3RhdGlvblJhdGUyLCBfZXZlbnQkcm90YXRpb25SYXRlMztcblx0XHRcdGFjY2VsZXJhdGlvbi52YWx1ZSA9IHtcblx0XHRcdFx0eDogKChfZXZlbnQkYWNjZWxlcmF0aW9uID0gZXZlbnQuYWNjZWxlcmF0aW9uKSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uLngpIHx8IG51bGwsXG5cdFx0XHRcdHk6ICgoX2V2ZW50JGFjY2VsZXJhdGlvbjIgPSBldmVudC5hY2NlbGVyYXRpb24pID09PSBudWxsIHx8IF9ldmVudCRhY2NlbGVyYXRpb24yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uMi55KSB8fCBudWxsLFxuXHRcdFx0XHR6OiAoKF9ldmVudCRhY2NlbGVyYXRpb24zID0gZXZlbnQuYWNjZWxlcmF0aW9uKSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbjMueikgfHwgbnVsbFxuXHRcdFx0fTtcblx0XHRcdGFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkudmFsdWUgPSB7XG5cdFx0XHRcdHg6ICgoX2V2ZW50JGFjY2VsZXJhdGlvbkluID0gZXZlbnQuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eSkgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbkluID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uSW4ueCkgfHwgbnVsbCxcblx0XHRcdFx0eTogKChfZXZlbnQkYWNjZWxlcmF0aW9uSW4yID0gZXZlbnQuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eSkgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbkluMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbkluMi55KSB8fCBudWxsLFxuXHRcdFx0XHR6OiAoKF9ldmVudCRhY2NlbGVyYXRpb25JbjMgPSBldmVudC5hY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5KSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uSW4zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uSW4zLnopIHx8IG51bGxcblx0XHRcdH07XG5cdFx0XHRyb3RhdGlvblJhdGUudmFsdWUgPSB7XG5cdFx0XHRcdGFscGhhOiAoKF9ldmVudCRyb3RhdGlvblJhdGUgPSBldmVudC5yb3RhdGlvblJhdGUpID09PSBudWxsIHx8IF9ldmVudCRyb3RhdGlvblJhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRyb3RhdGlvblJhdGUuYWxwaGEpIHx8IG51bGwsXG5cdFx0XHRcdGJldGE6ICgoX2V2ZW50JHJvdGF0aW9uUmF0ZTIgPSBldmVudC5yb3RhdGlvblJhdGUpID09PSBudWxsIHx8IF9ldmVudCRyb3RhdGlvblJhdGUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkcm90YXRpb25SYXRlMi5iZXRhKSB8fCBudWxsLFxuXHRcdFx0XHRnYW1tYTogKChfZXZlbnQkcm90YXRpb25SYXRlMyA9IGV2ZW50LnJvdGF0aW9uUmF0ZSkgPT09IG51bGwgfHwgX2V2ZW50JHJvdGF0aW9uUmF0ZTMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRyb3RhdGlvblJhdGUzLmdhbW1hKSB8fCBudWxsXG5cdFx0XHR9O1xuXHRcdFx0aW50ZXJ2YWwudmFsdWUgPSBldmVudC5pbnRlcnZhbDtcblx0XHR9KSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR9XG5cdGNvbnN0IGVuc3VyZVBlcm1pc3Npb25zID0gYXN5bmMgKCkgPT4ge1xuXHRcdGlmICghcmVxdWlyZVBlcm1pc3Npb25zLnZhbHVlKSBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0aWYgKHBlcm1pc3Npb25HcmFudGVkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKHJlcXVpcmVQZXJtaXNzaW9ucy52YWx1ZSkge1xuXHRcdFx0Y29uc3QgcmVxdWVzdFBlcm1pc3Npb24gPSBEZXZpY2VNb3Rpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChhd2FpdCByZXF1ZXN0UGVybWlzc2lvbigpID09PSBcImdyYW50ZWRcIikge1xuXHRcdFx0XHRcdHBlcm1pc3Npb25HcmFudGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdFx0XHRpbml0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBpZiAocmVxdWVzdFBlcm1pc3Npb25zICYmIHJlcXVpcmVQZXJtaXNzaW9ucy52YWx1ZSkgZW5zdXJlUGVybWlzc2lvbnMoKS50aGVuKCgpID0+IGluaXQoKSk7XG5cdGVsc2UgaW5pdCgpO1xuXHRyZXR1cm4ge1xuXHRcdGFjY2VsZXJhdGlvbixcblx0XHRhY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5LFxuXHRcdHJvdGF0aW9uUmF0ZSxcblx0XHRpbnRlcnZhbCxcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRyZXF1aXJlUGVybWlzc2lvbnMsXG5cdFx0ZW5zdXJlUGVybWlzc2lvbnMsXG5cdFx0cGVybWlzc2lvbkdyYW50ZWRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGV2aWNlT3JpZW50YXRpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBEZXZpY2VPcmllbnRhdGlvbkV2ZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEZXZpY2VPcmllbnRhdGlvblxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURldmljZU9yaWVudGF0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJEZXZpY2VPcmllbnRhdGlvbkV2ZW50XCIgaW4gd2luZG93JDEpO1xuXHRjb25zdCBpc0Fic29sdXRlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGFscGhhID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgYmV0YSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGdhbW1hID0gc2hhbGxvd1JlZihudWxsKTtcblx0aWYgKHdpbmRvdyQxICYmIGlzU3VwcG9ydGVkLnZhbHVlKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImRldmljZW9yaWVudGF0aW9uXCIsIChldmVudCkgPT4ge1xuXHRcdGlzQWJzb2x1dGUudmFsdWUgPSBldmVudC5hYnNvbHV0ZTtcblx0XHRhbHBoYS52YWx1ZSA9IGV2ZW50LmFscGhhO1xuXHRcdGJldGEudmFsdWUgPSBldmVudC5iZXRhO1xuXHRcdGdhbW1hLnZhbHVlID0gZXZlbnQuZ2FtbWE7XG5cdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRpc0Fic29sdXRlLFxuXHRcdGFscGhhLFxuXHRcdGJldGEsXG5cdFx0Z2FtbWFcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGV2aWNlUGl4ZWxSYXRpby9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgdHJhY2sgYHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvYC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGV2aWNlUGl4ZWxSYXRpb1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURldmljZVBpeGVsUmF0aW8ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHBpeGVsUmF0aW8gPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCBxdWVyeSA9IHVzZU1lZGlhUXVlcnkoKCkgPT4gYChyZXNvbHV0aW9uOiAke3BpeGVsUmF0aW8udmFsdWV9ZHBweClgLCBvcHRpb25zKTtcblx0bGV0IHN0b3AgPSBub29wO1xuXHRpZiAod2luZG93JDEpIHN0b3AgPSB3YXRjaEltbWVkaWF0ZShxdWVyeSwgKCkgPT4gcGl4ZWxSYXRpby52YWx1ZSA9IHdpbmRvdyQxLmRldmljZVBpeGVsUmF0aW8pO1xuXHRyZXR1cm4ge1xuXHRcdHBpeGVsUmF0aW86IHJlYWRvbmx5KHBpeGVsUmF0aW8pLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGV2aWNlc0xpc3QvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgZW51bWVyYXRlRGV2aWNlc2AgbGlzdGluZyBhdmFpbGFibGUgaW5wdXQvb3V0cHV0IGRldmljZXNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGV2aWNlc0xpc3RcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEZXZpY2VzTGlzdChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgcmVxdWVzdFBlcm1pc3Npb25zID0gZmFsc2UsIGNvbnN0cmFpbnRzID0ge1xuXHRcdGF1ZGlvOiB0cnVlLFxuXHRcdHZpZGVvOiB0cnVlXG5cdH0sIG9uVXBkYXRlZDogb25VcGRhdGVkJDEgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRldmljZXMgPSByZWYoW10pO1xuXHRjb25zdCB2aWRlb0lucHV0cyA9IGNvbXB1dGVkKCgpID0+IGRldmljZXMudmFsdWUuZmlsdGVyKChpKSA9PiBpLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiKSk7XG5cdGNvbnN0IGF1ZGlvSW5wdXRzID0gY29tcHV0ZWQoKCkgPT4gZGV2aWNlcy52YWx1ZS5maWx0ZXIoKGkpID0+IGkua2luZCA9PT0gXCJhdWRpb2lucHV0XCIpKTtcblx0Y29uc3QgYXVkaW9PdXRwdXRzID0gY29tcHV0ZWQoKCkgPT4gZGV2aWNlcy52YWx1ZS5maWx0ZXIoKGkpID0+IGkua2luZCA9PT0gXCJhdWRpb291dHB1dFwiKSk7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMgJiYgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMpO1xuXHRjb25zdCBwZXJtaXNzaW9uR3JhbnRlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRsZXQgc3RyZWFtO1xuXHRhc3luYyBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGRldmljZXMudmFsdWUgPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuXHRcdG9uVXBkYXRlZCQxID09PSBudWxsIHx8IG9uVXBkYXRlZCQxID09PSB2b2lkIDAgfHwgb25VcGRhdGVkJDEoZGV2aWNlcy52YWx1ZSk7XG5cdFx0aWYgKHN0cmVhbSkge1xuXHRcdFx0c3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcblx0XHRcdHN0cmVhbSA9IG51bGw7XG5cdFx0fVxuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVBlcm1pc3Npb25zKCkge1xuXHRcdGNvbnN0IGRldmljZU5hbWUgPSBjb25zdHJhaW50cy52aWRlbyA/IFwiY2FtZXJhXCIgOiBcIm1pY3JvcGhvbmVcIjtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm4gZmFsc2U7XG5cdFx0aWYgKHBlcm1pc3Npb25HcmFudGVkLnZhbHVlKSByZXR1cm4gdHJ1ZTtcblx0XHRjb25zdCB7IHN0YXRlLCBxdWVyeSB9ID0gdXNlUGVybWlzc2lvbihkZXZpY2VOYW1lLCB7IGNvbnRyb2xzOiB0cnVlIH0pO1xuXHRcdGF3YWl0IHF1ZXJ5KCk7XG5cdFx0aWYgKHN0YXRlLnZhbHVlICE9PSBcImdyYW50ZWRcIikge1xuXHRcdFx0bGV0IGdyYW50ZWQgPSB0cnVlO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgYWxsRGV2aWNlcyA9IGF3YWl0IG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCk7XG5cdFx0XHRcdGNvbnN0IGhhc0NhbWVyYSA9IGFsbERldmljZXMuc29tZSgoZGV2aWNlKSA9PiBkZXZpY2Uua2luZCA9PT0gXCJ2aWRlb2lucHV0XCIpO1xuXHRcdFx0XHRjb25zdCBoYXNNaWNyb3Bob25lID0gYWxsRGV2aWNlcy5zb21lKChkZXZpY2UpID0+IGRldmljZS5raW5kID09PSBcImF1ZGlvaW5wdXRcIiB8fCBkZXZpY2Uua2luZCA9PT0gXCJhdWRpb291dHB1dFwiKTtcblx0XHRcdFx0Y29uc3RyYWludHMudmlkZW8gPSBoYXNDYW1lcmEgPyBjb25zdHJhaW50cy52aWRlbyA6IGZhbHNlO1xuXHRcdFx0XHRjb25zdHJhaW50cy5hdWRpbyA9IGhhc01pY3JvcGhvbmUgPyBjb25zdHJhaW50cy5hdWRpbyA6IGZhbHNlO1xuXHRcdFx0XHRzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKTtcblx0XHRcdH0gY2F0Y2ggKF91bnVzZWQpIHtcblx0XHRcdFx0c3RyZWFtID0gbnVsbDtcblx0XHRcdFx0Z3JhbnRlZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dXBkYXRlKCk7XG5cdFx0XHRwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IGdyYW50ZWQ7XG5cdFx0fSBlbHNlIHBlcm1pc3Npb25HcmFudGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRyZXR1cm4gcGVybWlzc2lvbkdyYW50ZWQudmFsdWU7XG5cdH1cblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0aWYgKHJlcXVlc3RQZXJtaXNzaW9ucykgZW5zdXJlUGVybWlzc2lvbnMoKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcywgXCJkZXZpY2VjaGFuZ2VcIiwgdXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0dXBkYXRlKCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRkZXZpY2VzLFxuXHRcdGVuc3VyZVBlcm1pc3Npb25zLFxuXHRcdHBlcm1pc3Npb25HcmFudGVkLFxuXHRcdHZpZGVvSW5wdXRzLFxuXHRcdGF1ZGlvSW5wdXRzLFxuXHRcdGF1ZGlvT3V0cHV0cyxcblx0XHRpc1N1cHBvcnRlZFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEaXNwbGF5TWVkaWEvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgbWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYWAgc3RyZWFtaW5nXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURpc3BsYXlNZWRpYVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZURpc3BsYXlNZWRpYShvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGVuYWJsZWQ7XG5cdGNvbnN0IGVuYWJsZWQgPSBzaGFsbG93UmVmKChfb3B0aW9ucyRlbmFibGVkID0gb3B0aW9ucy5lbmFibGVkKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRlbmFibGVkICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRlbmFibGVkIDogZmFsc2UpO1xuXHRjb25zdCB2aWRlbyA9IG9wdGlvbnMudmlkZW87XG5cdGNvbnN0IGF1ZGlvID0gb3B0aW9ucy5hdWRpbztcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHtcblx0XHR2YXIgX25hdmlnYXRvciRtZWRpYURldmljO1xuXHRcdHJldHVybiBuYXZpZ2F0b3IkMSA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IkMSA9PT0gdm9pZCAwIHx8IChfbmF2aWdhdG9yJG1lZGlhRGV2aWMgPSBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMpID09PSBudWxsIHx8IF9uYXZpZ2F0b3IkbWVkaWFEZXZpYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX25hdmlnYXRvciRtZWRpYURldmljLmdldERpc3BsYXlNZWRpYTtcblx0fSk7XG5cdGNvbnN0IGNvbnN0cmFpbnQgPSB7XG5cdFx0YXVkaW8sXG5cdFx0dmlkZW9cblx0fTtcblx0Y29uc3Qgc3RyZWFtID0gc2hhbGxvd1JlZigpO1xuXHRhc3luYyBmdW5jdGlvbiBfc3RhcnQoKSB7XG5cdFx0dmFyIF9zdHJlYW0kdmFsdWU7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCBzdHJlYW0udmFsdWUpIHJldHVybjtcblx0XHRzdHJlYW0udmFsdWUgPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZ2V0RGlzcGxheU1lZGlhKGNvbnN0cmFpbnQpO1xuXHRcdChfc3RyZWFtJHZhbHVlID0gc3RyZWFtLnZhbHVlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJHZhbHVlID09PSB2b2lkIDAgfHwgX3N0cmVhbSR2YWx1ZS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB1c2VFdmVudExpc3RlbmVyKHQsIFwiZW5kZWRcIiwgc3RvcCwgeyBwYXNzaXZlOiB0cnVlIH0pKTtcblx0XHRyZXR1cm4gc3RyZWFtLnZhbHVlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIF9zdG9wKCkge1xuXHRcdHZhciBfc3RyZWFtJHZhbHVlMjtcblx0XHQoX3N0cmVhbSR2YWx1ZTIgPSBzdHJlYW0udmFsdWUpID09PSBudWxsIHx8IF9zdHJlYW0kdmFsdWUyID09PSB2b2lkIDAgfHwgX3N0cmVhbSR2YWx1ZTIuZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuXHRcdHN0cmVhbS52YWx1ZSA9IHZvaWQgMDtcblx0fVxuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdF9zdG9wKCk7XG5cdFx0ZW5hYmxlZC52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuXHRcdGF3YWl0IF9zdGFydCgpO1xuXHRcdGlmIChzdHJlYW0udmFsdWUpIGVuYWJsZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBzdHJlYW0udmFsdWU7XG5cdH1cblx0d2F0Y2goZW5hYmxlZCwgKHYpID0+IHtcblx0XHRpZiAodikgX3N0YXJ0KCk7XG5cdFx0ZWxzZSBfc3RvcCgpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdHJlYW0sXG5cdFx0c3RhcnQsXG5cdFx0c3RvcCxcblx0XHRlbmFibGVkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURvY3VtZW50VmlzaWJpbGl0eS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgdHJhY2sgYGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZWAuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURvY3VtZW50VmlzaWJpbGl0eVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURvY3VtZW50VmlzaWJpbGl0eShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCB9ID0gb3B0aW9ucztcblx0aWYgKCFkb2N1bWVudCQxKSByZXR1cm4gc2hhbGxvd1JlZihcInZpc2libGVcIik7XG5cdGNvbnN0IHZpc2liaWxpdHkgPSBzaGFsbG93UmVmKGRvY3VtZW50JDEudmlzaWJpbGl0eVN0YXRlKTtcblx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInZpc2liaWxpdHljaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdHZpc2liaWxpdHkudmFsdWUgPSBkb2N1bWVudCQxLnZpc2liaWxpdHlTdGF0ZTtcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4gdmlzaWJpbGl0eTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRHJhZ2dhYmxlL2luZGV4LnRzXG5jb25zdCBkZWZhdWx0U2Nyb2xsQ29uZmlnID0ge1xuXHRzcGVlZDogMixcblx0bWFyZ2luOiAzMCxcblx0ZGlyZWN0aW9uOiBcImJvdGhcIlxufTtcbmZ1bmN0aW9uIGNsYW1wQ29udGFpbmVyU2Nyb2xsKGNvbnRhaW5lcikge1xuXHRpZiAoY29udGFpbmVyLnNjcm9sbExlZnQgPiBjb250YWluZXIuc2Nyb2xsV2lkdGggLSBjb250YWluZXIuY2xpZW50V2lkdGgpIGNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgY29udGFpbmVyLnNjcm9sbFdpZHRoIC0gY29udGFpbmVyLmNsaWVudFdpZHRoKTtcblx0aWYgKGNvbnRhaW5lci5zY3JvbGxUb3AgPiBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gY29udGFpbmVyLmNsaWVudEhlaWdodCkgY29udGFpbmVyLnNjcm9sbFRvcCA9IE1hdGgubWF4KDAsIGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSBjb250YWluZXIuY2xpZW50SGVpZ2h0KTtcbn1cbi8qKlxuKiBNYWtlIGVsZW1lbnRzIGRyYWdnYWJsZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRHJhZ2dhYmxlXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEcmFnZ2FibGUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0dmFyIF90b1ZhbHVlLCBfdG9WYWx1ZTIsIF90b1ZhbHVlMywgX3Njcm9sbENvbmZpZyRkaXJlY3RpO1xuXHRjb25zdCB7IHBvaW50ZXJUeXBlcywgcHJldmVudERlZmF1bHQ6IHByZXZlbnREZWZhdWx0JDEsIHN0b3BQcm9wYWdhdGlvbiwgZXhhY3QsIG9uTW92ZSwgb25FbmQsIG9uU3RhcnQsIGluaXRpYWxWYWx1ZSwgYXhpcyA9IFwiYm90aFwiLCBkcmFnZ2luZ0VsZW1lbnQgPSBkZWZhdWx0V2luZG93LCBjb250YWluZXJFbGVtZW50LCBoYW5kbGU6IGRyYWdnaW5nSGFuZGxlID0gdGFyZ2V0LCBidXR0b25zID0gWzBdLCByZXN0cmljdEluVmlldywgYXV0b1Njcm9sbCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBwb3NpdGlvbiA9IHJlZigoX3RvVmFsdWUgPSB0b1ZhbHVlKGluaXRpYWxWYWx1ZSkpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IHByZXNzZWREZWx0YSA9IHJlZigpO1xuXHRjb25zdCBmaWx0ZXJFdmVudCA9IChlKSA9PiB7XG5cdFx0aWYgKHBvaW50ZXJUeXBlcykgcmV0dXJuIHBvaW50ZXJUeXBlcy5pbmNsdWRlcyhlLnBvaW50ZXJUeXBlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblx0Y29uc3QgaGFuZGxlRXZlbnQgPSAoZSkgPT4ge1xuXHRcdGlmICh0b1ZhbHVlKHByZXZlbnREZWZhdWx0JDEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0aWYgKHRvVmFsdWUoc3RvcFByb3BhZ2F0aW9uKSkgZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblx0Y29uc3Qgc2Nyb2xsQ29uZmlnID0gdG9WYWx1ZShhdXRvU2Nyb2xsKTtcblx0Y29uc3Qgc2Nyb2xsU2V0dGluZ3MgPSB0eXBlb2Ygc2Nyb2xsQ29uZmlnID09PSBcIm9iamVjdFwiID8ge1xuXHRcdHNwZWVkOiAoX3RvVmFsdWUyID0gdG9WYWx1ZShzY3JvbGxDb25maWcuc3BlZWQpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZTIgIT09IHZvaWQgMCA/IF90b1ZhbHVlMiA6IGRlZmF1bHRTY3JvbGxDb25maWcuc3BlZWQsXG5cdFx0bWFyZ2luOiAoX3RvVmFsdWUzID0gdG9WYWx1ZShzY3JvbGxDb25maWcubWFyZ2luKSkgIT09IG51bGwgJiYgX3RvVmFsdWUzICE9PSB2b2lkIDAgPyBfdG9WYWx1ZTMgOiBkZWZhdWx0U2Nyb2xsQ29uZmlnLm1hcmdpbixcblx0XHRkaXJlY3Rpb246IChfc2Nyb2xsQ29uZmlnJGRpcmVjdGkgPSBzY3JvbGxDb25maWcuZGlyZWN0aW9uKSAhPT0gbnVsbCAmJiBfc2Nyb2xsQ29uZmlnJGRpcmVjdGkgIT09IHZvaWQgMCA/IF9zY3JvbGxDb25maWckZGlyZWN0aSA6IGRlZmF1bHRTY3JvbGxDb25maWcuZGlyZWN0aW9uXG5cdH0gOiBkZWZhdWx0U2Nyb2xsQ29uZmlnO1xuXHRjb25zdCBnZXRTY3JvbGxBeGlzVmFsdWVzID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyBbdmFsdWUsIHZhbHVlXSA6IFt2YWx1ZS54LCB2YWx1ZS55XTtcblx0Y29uc3QgaGFuZGxlQXV0b1Njcm9sbCA9IChjb250YWluZXIsIHRhcmdldFJlY3QsIHBvc2l0aW9uJDEpID0+IHtcblx0XHRjb25zdCB7IGNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQsIHNjcm9sbExlZnQsIHNjcm9sbFRvcCwgc2Nyb2xsV2lkdGgsIHNjcm9sbEhlaWdodCB9ID0gY29udGFpbmVyO1xuXHRcdGNvbnN0IFttYXJnaW5YLCBtYXJnaW5ZXSA9IGdldFNjcm9sbEF4aXNWYWx1ZXMoc2Nyb2xsU2V0dGluZ3MubWFyZ2luKTtcblx0XHRjb25zdCBbc3BlZWRYLCBzcGVlZFldID0gZ2V0U2Nyb2xsQXhpc1ZhbHVlcyhzY3JvbGxTZXR0aW5ncy5zcGVlZCk7XG5cdFx0bGV0IGRlbHRhWCA9IDA7XG5cdFx0bGV0IGRlbHRhWSA9IDA7XG5cdFx0aWYgKHNjcm9sbFNldHRpbmdzLmRpcmVjdGlvbiA9PT0gXCJ4XCIgfHwgc2Nyb2xsU2V0dGluZ3MuZGlyZWN0aW9uID09PSBcImJvdGhcIikge1xuXHRcdFx0aWYgKHBvc2l0aW9uJDEueCA8IG1hcmdpblggJiYgc2Nyb2xsTGVmdCA+IDApIGRlbHRhWCA9IC1zcGVlZFg7XG5cdFx0XHRlbHNlIGlmIChwb3NpdGlvbiQxLnggKyB0YXJnZXRSZWN0LndpZHRoID4gY2xpZW50V2lkdGggLSBtYXJnaW5YICYmIHNjcm9sbExlZnQgPCBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoKSBkZWx0YVggPSBzcGVlZFg7XG5cdFx0fVxuXHRcdGlmIChzY3JvbGxTZXR0aW5ncy5kaXJlY3Rpb24gPT09IFwieVwiIHx8IHNjcm9sbFNldHRpbmdzLmRpcmVjdGlvbiA9PT0gXCJib3RoXCIpIHtcblx0XHRcdGlmIChwb3NpdGlvbiQxLnkgPCBtYXJnaW5ZICYmIHNjcm9sbFRvcCA+IDApIGRlbHRhWSA9IC1zcGVlZFk7XG5cdFx0XHRlbHNlIGlmIChwb3NpdGlvbiQxLnkgKyB0YXJnZXRSZWN0LmhlaWdodCA+IGNsaWVudEhlaWdodCAtIG1hcmdpblkgJiYgc2Nyb2xsVG9wIDwgc2Nyb2xsSGVpZ2h0IC0gY2xpZW50SGVpZ2h0KSBkZWx0YVkgPSBzcGVlZFk7XG5cdFx0fVxuXHRcdGlmIChkZWx0YVggfHwgZGVsdGFZKSBjb250YWluZXIuc2Nyb2xsQnkoe1xuXHRcdFx0bGVmdDogZGVsdGFYLFxuXHRcdFx0dG9wOiBkZWx0YVksXG5cdFx0XHRiZWhhdmlvcjogXCJhdXRvXCJcblx0XHR9KTtcblx0fTtcblx0bGV0IGF1dG9TY3JvbGxJbnRlcnZhbCA9IG51bGw7XG5cdGNvbnN0IHN0YXJ0QXV0b1Njcm9sbCA9ICgpID0+IHtcblx0XHRjb25zdCBjb250YWluZXIgPSB0b1ZhbHVlKGNvbnRhaW5lckVsZW1lbnQpO1xuXHRcdGlmIChjb250YWluZXIgJiYgIWF1dG9TY3JvbGxJbnRlcnZhbCkgYXV0b1Njcm9sbEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0Y29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdGNvbnN0IHsgeCwgeSB9ID0gcG9zaXRpb24udmFsdWU7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVBvc2l0aW9uID0ge1xuXHRcdFx0XHR4OiB4IC0gY29udGFpbmVyLnNjcm9sbExlZnQsXG5cdFx0XHRcdHk6IHkgLSBjb250YWluZXIuc2Nyb2xsVG9wXG5cdFx0XHR9O1xuXHRcdFx0aWYgKHJlbGF0aXZlUG9zaXRpb24ueCA+PSAwICYmIHJlbGF0aXZlUG9zaXRpb24ueSA+PSAwKSB7XG5cdFx0XHRcdGhhbmRsZUF1dG9TY3JvbGwoY29udGFpbmVyLCB0YXJnZXRSZWN0LCByZWxhdGl2ZVBvc2l0aW9uKTtcblx0XHRcdFx0cmVsYXRpdmVQb3NpdGlvbi54ICs9IGNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuXHRcdFx0XHRyZWxhdGl2ZVBvc2l0aW9uLnkgKz0gY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHRcdFx0cG9zaXRpb24udmFsdWUgPSByZWxhdGl2ZVBvc2l0aW9uO1xuXHRcdFx0fVxuXHRcdH0sIDFlMyAvIDYwKTtcblx0fTtcblx0Y29uc3Qgc3RvcEF1dG9TY3JvbGwgPSAoKSA9PiB7XG5cdFx0aWYgKGF1dG9TY3JvbGxJbnRlcnZhbCkge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsSW50ZXJ2YWwpO1xuXHRcdFx0YXV0b1Njcm9sbEludGVydmFsID0gbnVsbDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGlzUG9pbnRlck5lYXJFZGdlID0gKHBvaW50ZXIsIGNvbnRhaW5lciwgbWFyZ2luLCB0YXJnZXRSZWN0KSA9PiB7XG5cdFx0Y29uc3QgW21hcmdpblgsIG1hcmdpblldID0gdHlwZW9mIG1hcmdpbiA9PT0gXCJudW1iZXJcIiA/IFttYXJnaW4sIG1hcmdpbl0gOiBbbWFyZ2luLngsIG1hcmdpbi55XTtcblx0XHRjb25zdCB7IGNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQgfSA9IGNvbnRhaW5lcjtcblx0XHRyZXR1cm4gcG9pbnRlci54IDwgbWFyZ2luWCB8fCBwb2ludGVyLnggKyB0YXJnZXRSZWN0LndpZHRoID4gY2xpZW50V2lkdGggLSBtYXJnaW5YIHx8IHBvaW50ZXIueSA8IG1hcmdpblkgfHwgcG9pbnRlci55ICsgdGFyZ2V0UmVjdC5oZWlnaHQgPiBjbGllbnRIZWlnaHQgLSBtYXJnaW5ZO1xuXHR9O1xuXHRjb25zdCBjaGVja0F1dG9TY3JvbGwgPSAoKSA9PiB7XG5cdFx0aWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgfHwgIXByZXNzZWREZWx0YS52YWx1ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IGNvbnRhaW5lciA9IHRvVmFsdWUoY29udGFpbmVyRWxlbWVudCk7XG5cdFx0aWYgKCFjb250YWluZXIpIHJldHVybjtcblx0XHRjb25zdCB0YXJnZXRSZWN0ID0gdG9WYWx1ZSh0YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGNvbnN0IHsgeCwgeSB9ID0gcG9zaXRpb24udmFsdWU7XG5cdFx0aWYgKGlzUG9pbnRlck5lYXJFZGdlKHtcblx0XHRcdHg6IHggLSBjb250YWluZXIuc2Nyb2xsTGVmdCxcblx0XHRcdHk6IHkgLSBjb250YWluZXIuc2Nyb2xsVG9wXG5cdFx0fSwgY29udGFpbmVyLCBzY3JvbGxTZXR0aW5ncy5tYXJnaW4sIHRhcmdldFJlY3QpKSBzdGFydEF1dG9TY3JvbGwoKTtcblx0XHRlbHNlIHN0b3BBdXRvU2Nyb2xsKCk7XG5cdH07XG5cdGlmICh0b1ZhbHVlKGF1dG9TY3JvbGwpKSB3YXRjaChwb3NpdGlvbiwgY2hlY2tBdXRvU2Nyb2xsKTtcblx0Y29uc3Qgc3RhcnQgPSAoZSkgPT4ge1xuXHRcdHZhciBfY29udGFpbmVyJGdldEJvdW5kaW47XG5cdFx0aWYgKCF0b1ZhbHVlKGJ1dHRvbnMpLmluY2x1ZGVzKGUuYnV0dG9uKSkgcmV0dXJuO1xuXHRcdGlmICh0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpIHx8ICFmaWx0ZXJFdmVudChlKSkgcmV0dXJuO1xuXHRcdGlmICh0b1ZhbHVlKGV4YWN0KSAmJiBlLnRhcmdldCAhPT0gdG9WYWx1ZSh0YXJnZXQpKSByZXR1cm47XG5cdFx0Y29uc3QgY29udGFpbmVyID0gdG9WYWx1ZShjb250YWluZXJFbGVtZW50KTtcblx0XHRjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyID09PSBudWxsIHx8IGNvbnRhaW5lciA9PT0gdm9pZCAwIHx8IChfY29udGFpbmVyJGdldEJvdW5kaW4gPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSA9PT0gbnVsbCB8fCBfY29udGFpbmVyJGdldEJvdW5kaW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jb250YWluZXIkZ2V0Qm91bmRpbi5jYWxsKGNvbnRhaW5lcik7XG5cdFx0Y29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCBwb3MgPSB7XG5cdFx0XHR4OiBlLmNsaWVudFggLSAoY29udGFpbmVyID8gdGFyZ2V0UmVjdC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0ICsgKGF1dG9TY3JvbGwgPyAwIDogY29udGFpbmVyLnNjcm9sbExlZnQpIDogdGFyZ2V0UmVjdC5sZWZ0KSxcblx0XHRcdHk6IGUuY2xpZW50WSAtIChjb250YWluZXIgPyB0YXJnZXRSZWN0LnRvcCAtIGNvbnRhaW5lclJlY3QudG9wICsgKGF1dG9TY3JvbGwgPyAwIDogY29udGFpbmVyLnNjcm9sbFRvcCkgOiB0YXJnZXRSZWN0LnRvcClcblx0XHR9O1xuXHRcdGlmICgob25TdGFydCA9PT0gbnVsbCB8fCBvblN0YXJ0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblN0YXJ0KHBvcywgZSkpID09PSBmYWxzZSkgcmV0dXJuO1xuXHRcdHByZXNzZWREZWx0YS52YWx1ZSA9IHBvcztcblx0XHRoYW5kbGVFdmVudChlKTtcblx0fTtcblx0Y29uc3QgbW92ZSA9IChlKSA9PiB7XG5cdFx0aWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgfHwgIWZpbHRlckV2ZW50KGUpKSByZXR1cm47XG5cdFx0aWYgKCFwcmVzc2VkRGVsdGEudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBjb250YWluZXIgPSB0b1ZhbHVlKGNvbnRhaW5lckVsZW1lbnQpO1xuXHRcdGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgY2xhbXBDb250YWluZXJTY3JvbGwoY29udGFpbmVyKTtcblx0XHRjb25zdCB0YXJnZXRSZWN0ID0gdG9WYWx1ZSh0YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGxldCB7IHgsIHkgfSA9IHBvc2l0aW9uLnZhbHVlO1xuXHRcdGlmIChheGlzID09PSBcInhcIiB8fCBheGlzID09PSBcImJvdGhcIikge1xuXHRcdFx0eCA9IGUuY2xpZW50WCAtIHByZXNzZWREZWx0YS52YWx1ZS54O1xuXHRcdFx0aWYgKGNvbnRhaW5lcikgeCA9IE1hdGgubWluKE1hdGgubWF4KDAsIHgpLCBjb250YWluZXIuc2Nyb2xsV2lkdGggLSB0YXJnZXRSZWN0LndpZHRoKTtcblx0XHR9XG5cdFx0aWYgKGF4aXMgPT09IFwieVwiIHx8IGF4aXMgPT09IFwiYm90aFwiKSB7XG5cdFx0XHR5ID0gZS5jbGllbnRZIC0gcHJlc3NlZERlbHRhLnZhbHVlLnk7XG5cdFx0XHRpZiAoY29udGFpbmVyKSB5ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgeSksIGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSB0YXJnZXRSZWN0LmhlaWdodCk7XG5cdFx0fVxuXHRcdGlmICh0b1ZhbHVlKGF1dG9TY3JvbGwpICYmIGNvbnRhaW5lcikge1xuXHRcdFx0aWYgKGF1dG9TY3JvbGxJbnRlcnZhbCA9PT0gbnVsbCkgaGFuZGxlQXV0b1Njcm9sbChjb250YWluZXIsIHRhcmdldFJlY3QsIHtcblx0XHRcdFx0eCxcblx0XHRcdFx0eVxuXHRcdFx0fSk7XG5cdFx0XHR4ICs9IGNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuXHRcdFx0eSArPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuXHRcdH1cblx0XHRpZiAoY29udGFpbmVyICYmIChyZXN0cmljdEluVmlldyB8fCBhdXRvU2Nyb2xsKSkge1xuXHRcdFx0aWYgKGF4aXMgIT09IFwieVwiKSB7XG5cdFx0XHRcdGNvbnN0IHJlbGF0aXZlWCA9IHggLSBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdFx0aWYgKHJlbGF0aXZlWCA8IDApIHggPSBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdFx0ZWxzZSBpZiAocmVsYXRpdmVYID4gY29udGFpbmVyLmNsaWVudFdpZHRoIC0gdGFyZ2V0UmVjdC53aWR0aCkgeCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIHRhcmdldFJlY3Qud2lkdGggKyBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdH1cblx0XHRcdGlmIChheGlzICE9PSBcInhcIikge1xuXHRcdFx0XHRjb25zdCByZWxhdGl2ZVkgPSB5IC0gY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHRcdFx0aWYgKHJlbGF0aXZlWSA8IDApIHkgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuXHRcdFx0XHRlbHNlIGlmIChyZWxhdGl2ZVkgPiBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdGFyZ2V0UmVjdC5oZWlnaHQpIHkgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdGFyZ2V0UmVjdC5oZWlnaHQgKyBjb250YWluZXIuc2Nyb2xsVG9wO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRwb3NpdGlvbi52YWx1ZSA9IHtcblx0XHRcdHgsXG5cdFx0XHR5XG5cdFx0fTtcblx0XHRvbk1vdmUgPT09IG51bGwgfHwgb25Nb3ZlID09PSB2b2lkIDAgfHwgb25Nb3ZlKHBvc2l0aW9uLnZhbHVlLCBlKTtcblx0XHRoYW5kbGVFdmVudChlKTtcblx0fTtcblx0Y29uc3QgZW5kID0gKGUpID0+IHtcblx0XHRpZiAodG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSB8fCAhZmlsdGVyRXZlbnQoZSkpIHJldHVybjtcblx0XHRpZiAoIXByZXNzZWREZWx0YS52YWx1ZSkgcmV0dXJuO1xuXHRcdHByZXNzZWREZWx0YS52YWx1ZSA9IHZvaWQgMDtcblx0XHRpZiAoYXV0b1Njcm9sbCkgc3RvcEF1dG9TY3JvbGwoKTtcblx0XHRvbkVuZCA9PT0gbnVsbCB8fCBvbkVuZCA9PT0gdm9pZCAwIHx8IG9uRW5kKHBvc2l0aW9uLnZhbHVlLCBlKTtcblx0XHRoYW5kbGVFdmVudChlKTtcblx0fTtcblx0aWYgKGlzQ2xpZW50KSB7XG5cdFx0Y29uc3QgY29uZmlnID0gKCkgPT4ge1xuXHRcdFx0dmFyIF9vcHRpb25zJGNhcHR1cmU7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjYXB0dXJlOiAoX29wdGlvbnMkY2FwdHVyZSA9IG9wdGlvbnMuY2FwdHVyZSkgIT09IG51bGwgJiYgX29wdGlvbnMkY2FwdHVyZSAhPT0gdm9pZCAwID8gX29wdGlvbnMkY2FwdHVyZSA6IHRydWUsXG5cdFx0XHRcdHBhc3NpdmU6ICF0b1ZhbHVlKHByZXZlbnREZWZhdWx0JDEpXG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkcmFnZ2luZ0hhbmRsZSwgXCJwb2ludGVyZG93blwiLCBzdGFydCwgY29uZmlnKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGRyYWdnaW5nRWxlbWVudCwgXCJwb2ludGVybW92ZVwiLCBtb3ZlLCBjb25maWcpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZHJhZ2dpbmdFbGVtZW50LCBcInBvaW50ZXJ1cFwiLCBlbmQsIGNvbmZpZyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHQuLi50b1JlZnMocG9zaXRpb24pLFxuXHRcdHBvc2l0aW9uLFxuXHRcdGlzRHJhZ2dpbmc6IGNvbXB1dGVkKCgpID0+ICEhcHJlc3NlZERlbHRhLnZhbHVlKSxcblx0XHRzdHlsZTogY29tcHV0ZWQoKCkgPT4gYFxuICAgICAgbGVmdDogJHtwb3NpdGlvbi52YWx1ZS54fXB4O1xuICAgICAgdG9wOiAke3Bvc2l0aW9uLnZhbHVlLnl9cHg7XG4gICAgICAke2F1dG9TY3JvbGwgPyBcInRleHQtd3JhcDogbm93cmFwO1wiIDogXCJcIn1cbiAgICBgKVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEcm9wWm9uZS9pbmRleC50c1xuZnVuY3Rpb24gdXNlRHJvcFpvbmUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgaXNPdmVyRHJvcFpvbmUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZmlsZXMgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRsZXQgY291bnRlciA9IDA7XG5cdGxldCBpc1ZhbGlkID0gdHJ1ZTtcblx0aWYgKGlzQ2xpZW50KSB7XG5cdFx0dmFyIF9vcHRpb25zJG11bHRpcGxlLCBfb3B0aW9ucyRwcmV2ZW50RGVmYXU7XG5cdFx0Y29uc3QgX29wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8geyBvbkRyb3A6IG9wdGlvbnMgfSA6IG9wdGlvbnM7XG5cdFx0Y29uc3QgbXVsdGlwbGUgPSAoX29wdGlvbnMkbXVsdGlwbGUgPSBfb3B0aW9ucy5tdWx0aXBsZSkgIT09IG51bGwgJiYgX29wdGlvbnMkbXVsdGlwbGUgIT09IHZvaWQgMCA/IF9vcHRpb25zJG11bHRpcGxlIDogdHJ1ZTtcblx0XHRjb25zdCBwcmV2ZW50RGVmYXVsdEZvclVuaGFuZGxlZCA9IChfb3B0aW9ucyRwcmV2ZW50RGVmYXUgPSBfb3B0aW9ucy5wcmV2ZW50RGVmYXVsdEZvclVuaGFuZGxlZCkgIT09IG51bGwgJiYgX29wdGlvbnMkcHJldmVudERlZmF1ICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRwcmV2ZW50RGVmYXUgOiBmYWxzZTtcblx0XHRjb25zdCBnZXRGaWxlcyA9IChldmVudCkgPT4ge1xuXHRcdFx0dmFyIF9ldmVudCRkYXRhVHJhbnNmZXIkZiwgX2V2ZW50JGRhdGFUcmFuc2Zlcjtcblx0XHRcdGNvbnN0IGxpc3QgPSBBcnJheS5mcm9tKChfZXZlbnQkZGF0YVRyYW5zZmVyJGYgPSAoX2V2ZW50JGRhdGFUcmFuc2ZlciA9IGV2ZW50LmRhdGFUcmFuc2ZlcikgPT09IG51bGwgfHwgX2V2ZW50JGRhdGFUcmFuc2ZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGRhdGFUcmFuc2Zlci5maWxlcykgIT09IG51bGwgJiYgX2V2ZW50JGRhdGFUcmFuc2ZlciRmICE9PSB2b2lkIDAgPyBfZXZlbnQkZGF0YVRyYW5zZmVyJGYgOiBbXSk7XG5cdFx0XHRyZXR1cm4gbGlzdC5sZW5ndGggPT09IDAgPyBudWxsIDogbXVsdGlwbGUgPyBsaXN0IDogW2xpc3RbMF1dO1xuXHRcdH07XG5cdFx0Y29uc3QgY2hlY2tEYXRhVHlwZXMgPSAodHlwZXMpID0+IHtcblx0XHRcdGNvbnN0IGRhdGFUeXBlcyA9IHVucmVmKF9vcHRpb25zLmRhdGFUeXBlcyk7XG5cdFx0XHRpZiAodHlwZW9mIGRhdGFUeXBlcyA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZGF0YVR5cGVzKHR5cGVzKTtcblx0XHRcdGlmICghKGRhdGFUeXBlcyA9PT0gbnVsbCB8fCBkYXRhVHlwZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGFUeXBlcy5sZW5ndGgpKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGlmICh0eXBlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblx0XHRcdHJldHVybiB0eXBlcy5ldmVyeSgodHlwZSkgPT4gZGF0YVR5cGVzLnNvbWUoKGFsbG93ZWRUeXBlKSA9PiB0eXBlLmluY2x1ZGVzKGFsbG93ZWRUeXBlKSkpO1xuXHRcdH07XG5cdFx0Y29uc3QgY2hlY2tWYWxpZGl0eSA9IChpdGVtcykgPT4ge1xuXHRcdFx0aWYgKF9vcHRpb25zLmNoZWNrVmFsaWRpdHkpIHJldHVybiBfb3B0aW9ucy5jaGVja1ZhbGlkaXR5KGl0ZW1zKTtcblx0XHRcdGNvbnN0IGRhdGFUeXBlc1ZhbGlkID0gY2hlY2tEYXRhVHlwZXMoQXJyYXkuZnJvbShpdGVtcyAhPT0gbnVsbCAmJiBpdGVtcyAhPT0gdm9pZCAwID8gaXRlbXMgOiBbXSkubWFwKChpdGVtKSA9PiBpdGVtLnR5cGUpKTtcblx0XHRcdGNvbnN0IG11bHRpcGxlRmlsZXNWYWxpZCA9IG11bHRpcGxlIHx8IGl0ZW1zLmxlbmd0aCA8PSAxO1xuXHRcdFx0cmV0dXJuIGRhdGFUeXBlc1ZhbGlkICYmIG11bHRpcGxlRmlsZXNWYWxpZDtcblx0XHR9O1xuXHRcdGNvbnN0IGlzU2FmYXJpID0gKCkgPT4gL14oPzooPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEoXCJjaHJvbWVcIiBpbiB3aW5kb3cpO1xuXHRcdGNvbnN0IGhhbmRsZURyYWdFdmVudCA9IChldmVudCwgZXZlbnRUeXBlKSA9PiB7XG5cdFx0XHR2YXIgX2V2ZW50JGRhdGFUcmFuc2ZlcjIsIF9yZWY7XG5cdFx0XHRjb25zdCBkYXRhVHJhbnNmZXJJdGVtTGlzdCA9IChfZXZlbnQkZGF0YVRyYW5zZmVyMiA9IGV2ZW50LmRhdGFUcmFuc2ZlcikgPT09IG51bGwgfHwgX2V2ZW50JGRhdGFUcmFuc2ZlcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRkYXRhVHJhbnNmZXIyLml0ZW1zO1xuXHRcdFx0aXNWYWxpZCA9IChfcmVmID0gZGF0YVRyYW5zZmVySXRlbUxpc3QgJiYgY2hlY2tWYWxpZGl0eShkYXRhVHJhbnNmZXJJdGVtTGlzdCkpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBmYWxzZTtcblx0XHRcdGlmIChwcmV2ZW50RGVmYXVsdEZvclVuaGFuZGxlZCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmICghaXNTYWZhcmkoKSAmJiAhaXNWYWxpZCkge1xuXHRcdFx0XHRpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwibm9uZVwiO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKGV2ZW50LmRhdGFUcmFuc2ZlcikgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcImNvcHlcIjtcblx0XHRcdGNvbnN0IGN1cnJlbnRGaWxlcyA9IGdldEZpbGVzKGV2ZW50KTtcblx0XHRcdHN3aXRjaCAoZXZlbnRUeXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJlbnRlclwiOlxuXHRcdFx0XHRcdHZhciBfb3B0aW9ucyRvbkVudGVyO1xuXHRcdFx0XHRcdGNvdW50ZXIgKz0gMTtcblx0XHRcdFx0XHRpc092ZXJEcm9wWm9uZS52YWx1ZSA9IHRydWU7XG5cdFx0XHRcdFx0KF9vcHRpb25zJG9uRW50ZXIgPSBfb3B0aW9ucy5vbkVudGVyKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkVudGVyID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25FbnRlci5jYWxsKF9vcHRpb25zLCBudWxsLCBldmVudCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJvdmVyXCI6XG5cdFx0XHRcdFx0dmFyIF9vcHRpb25zJG9uT3Zlcjtcblx0XHRcdFx0XHQoX29wdGlvbnMkb25PdmVyID0gX29wdGlvbnMub25PdmVyKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbk92ZXIgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvbk92ZXIuY2FsbChfb3B0aW9ucywgbnVsbCwgZXZlbnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibGVhdmVcIjpcblx0XHRcdFx0XHR2YXIgX29wdGlvbnMkb25MZWF2ZTtcblx0XHRcdFx0XHRjb3VudGVyIC09IDE7XG5cdFx0XHRcdFx0aWYgKGNvdW50ZXIgPT09IDApIGlzT3ZlckRyb3Bab25lLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdFx0KF9vcHRpb25zJG9uTGVhdmUgPSBfb3B0aW9ucy5vbkxlYXZlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkxlYXZlID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25MZWF2ZS5jYWxsKF9vcHRpb25zLCBudWxsLCBldmVudCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJkcm9wXCI6XG5cdFx0XHRcdFx0Y291bnRlciA9IDA7XG5cdFx0XHRcdFx0aXNPdmVyRHJvcFpvbmUudmFsdWUgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAoaXNWYWxpZCkge1xuXHRcdFx0XHRcdFx0dmFyIF9vcHRpb25zJG9uRHJvcDtcblx0XHRcdFx0XHRcdGZpbGVzLnZhbHVlID0gY3VycmVudEZpbGVzO1xuXHRcdFx0XHRcdFx0KF9vcHRpb25zJG9uRHJvcCA9IF9vcHRpb25zLm9uRHJvcCkgPT09IG51bGwgfHwgX29wdGlvbnMkb25Ecm9wID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25Ecm9wLmNhbGwoX29wdGlvbnMsIGN1cnJlbnRGaWxlcywgZXZlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImRyYWdlbnRlclwiLCAoZXZlbnQpID0+IGhhbmRsZURyYWdFdmVudChldmVudCwgXCJlbnRlclwiKSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJhZ292ZXJcIiwgKGV2ZW50KSA9PiBoYW5kbGVEcmFnRXZlbnQoZXZlbnQsIFwib3ZlclwiKSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJhZ2xlYXZlXCIsIChldmVudCkgPT4gaGFuZGxlRHJhZ0V2ZW50KGV2ZW50LCBcImxlYXZlXCIpKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkcm9wXCIsIChldmVudCkgPT4gaGFuZGxlRHJhZ0V2ZW50KGV2ZW50LCBcImRyb3BcIikpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0ZmlsZXMsXG5cdFx0aXNPdmVyRHJvcFpvbmVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUmVzaXplT2JzZXJ2ZXIvaW5kZXgudHNcbi8qKlxuKiBSZXBvcnRzIGNoYW5nZXMgdG8gdGhlIGRpbWVuc2lvbnMgb2YgYW4gRWxlbWVudCdzIGNvbnRlbnQgb3IgdGhlIGJvcmRlci1ib3hcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmVzaXplT2JzZXJ2ZXJcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gY2FsbGJhY2tcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VSZXNpemVPYnNlcnZlcih0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywuLi5vYnNlcnZlck9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGxldCBvYnNlcnZlcjtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG5cdFx0aWYgKG9ic2VydmVyKSB7XG5cdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHRvYnNlcnZlciA9IHZvaWQgMDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHN0b3BXYXRjaCA9IHdhdGNoKGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBfdGFyZ2V0cyA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShfdGFyZ2V0cykgPyBfdGFyZ2V0cy5tYXAoKGVsKSA9PiB1bnJlZkVsZW1lbnQoZWwpKSA6IFt1bnJlZkVsZW1lbnQoX3RhcmdldHMpXTtcblx0fSksIChlbHMpID0+IHtcblx0XHRjbGVhbnVwKCk7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHdpbmRvdyQxKSB7XG5cdFx0XHRvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihjYWxsYmFjayk7XG5cdFx0XHRmb3IgKGNvbnN0IF9lbCBvZiBlbHMpIGlmIChfZWwpIG9ic2VydmVyLm9ic2VydmUoX2VsLCBvYnNlcnZlck9wdGlvbnMpO1xuXHRcdH1cblx0fSwge1xuXHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRmbHVzaDogXCJwb3N0XCJcblx0fSk7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0Y2xlYW51cCgpO1xuXHRcdHN0b3BXYXRjaCgpO1xuXHR9O1xuXHR0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUVsZW1lbnRCb3VuZGluZy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGJvdW5kaW5nIGJveCBvZiBhbiBIVE1MIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRCb3VuZGluZ1xuKiBAcGFyYW0gdGFyZ2V0XG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudEJvdW5kaW5nKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgcmVzZXQgPSB0cnVlLCB3aW5kb3dSZXNpemUgPSB0cnVlLCB3aW5kb3dTY3JvbGwgPSB0cnVlLCBpbW1lZGlhdGUgPSB0cnVlLCB1cGRhdGVUaW1pbmcgPSBcInN5bmNcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaGVpZ2h0ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgYm90dG9tID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgbGVmdCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHJpZ2h0ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgdG9wID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3Qgd2lkdGggPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCB4ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgeSA9IHNoYWxsb3dSZWYoMCk7XG5cdGZ1bmN0aW9uIHJlY2FsY3VsYXRlKCkge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKCFlbCkge1xuXHRcdFx0aWYgKHJlc2V0KSB7XG5cdFx0XHRcdGhlaWdodC52YWx1ZSA9IDA7XG5cdFx0XHRcdGJvdHRvbS52YWx1ZSA9IDA7XG5cdFx0XHRcdGxlZnQudmFsdWUgPSAwO1xuXHRcdFx0XHRyaWdodC52YWx1ZSA9IDA7XG5cdFx0XHRcdHRvcC52YWx1ZSA9IDA7XG5cdFx0XHRcdHdpZHRoLnZhbHVlID0gMDtcblx0XHRcdFx0eC52YWx1ZSA9IDA7XG5cdFx0XHRcdHkudmFsdWUgPSAwO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0aGVpZ2h0LnZhbHVlID0gcmVjdC5oZWlnaHQ7XG5cdFx0Ym90dG9tLnZhbHVlID0gcmVjdC5ib3R0b207XG5cdFx0bGVmdC52YWx1ZSA9IHJlY3QubGVmdDtcblx0XHRyaWdodC52YWx1ZSA9IHJlY3QucmlnaHQ7XG5cdFx0dG9wLnZhbHVlID0gcmVjdC50b3A7XG5cdFx0d2lkdGgudmFsdWUgPSByZWN0LndpZHRoO1xuXHRcdHgudmFsdWUgPSByZWN0Lng7XG5cdFx0eS52YWx1ZSA9IHJlY3QueTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGUoKSB7XG5cdFx0aWYgKHVwZGF0ZVRpbWluZyA9PT0gXCJzeW5jXCIpIHJlY2FsY3VsYXRlKCk7XG5cdFx0ZWxzZSBpZiAodXBkYXRlVGltaW5nID09PSBcIm5leHQtZnJhbWVcIikgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlY2FsY3VsYXRlKCkpO1xuXHR9XG5cdHVzZVJlc2l6ZU9ic2VydmVyKHRhcmdldCwgdXBkYXRlKTtcblx0d2F0Y2goKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCksIChlbGUpID0+ICFlbGUgJiYgdXBkYXRlKCkpO1xuXHR1c2VNdXRhdGlvbk9ic2VydmVyKHRhcmdldCwgdXBkYXRlLCB7IGF0dHJpYnV0ZUZpbHRlcjogW1wic3R5bGVcIiwgXCJjbGFzc1wiXSB9KTtcblx0aWYgKHdpbmRvd1Njcm9sbCkgdXNlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB1cGRhdGUsIHtcblx0XHRjYXB0dXJlOiB0cnVlLFxuXHRcdHBhc3NpdmU6IHRydWVcblx0fSk7XG5cdGlmICh3aW5kb3dSZXNpemUpIHVzZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0aWYgKGltbWVkaWF0ZSkgdXBkYXRlKCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGhlaWdodCxcblx0XHRib3R0b20sXG5cdFx0bGVmdCxcblx0XHRyaWdodCxcblx0XHR0b3AsXG5cdFx0d2lkdGgsXG5cdFx0eCxcblx0XHR5LFxuXHRcdHVwZGF0ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50QnlQb2ludC9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ3KG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiBpbnRlcnZhbCA9PT0gXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiA/IChjYikgPT4gdXNlUmFmRm4oY2IsIHsgaW1tZWRpYXRlIH0pIDogKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCBpbnRlcnZhbCwgeyBpbW1lZGlhdGUgfSk7XG5cdH1cblx0cmV0dXJuIHVzZVJhZkZuO1xufVxuLyoqXG4qIFJlYWN0aXZlIGVsZW1lbnQgYnkgcG9pbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRCeVBvaW50XG4qIEBwYXJhbSBvcHRpb25zIC0gVXNlRWxlbWVudEJ5UG9pbnRPcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudEJ5UG9pbnQob3B0aW9ucykge1xuXHRjb25zdCB7IHgsIHksIGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50LCBtdWx0aXBsZSwgc2NoZWR1bGVyID0gZ2V0RGVmYXVsdFNjaGVkdWxlciQ3KG9wdGlvbnMpIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4ge1xuXHRcdGlmICh0b1ZhbHVlKG11bHRpcGxlKSkgcmV0dXJuIGRvY3VtZW50JDEgJiYgXCJlbGVtZW50c0Zyb21Qb2ludFwiIGluIGRvY3VtZW50JDE7XG5cdFx0cmV0dXJuIGRvY3VtZW50JDEgJiYgXCJlbGVtZW50RnJvbVBvaW50XCIgaW4gZG9jdW1lbnQkMTtcblx0fSk7XG5cdGNvbnN0IGVsZW1lbnQgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGVsZW1lbnQsXG5cdFx0Li4uc2NoZWR1bGVyKCgpID0+IHtcblx0XHRcdHZhciBfZG9jdW1lbnQkZWxlbWVudHNGcm8sIF9kb2N1bWVudCRlbGVtZW50RnJvbTtcblx0XHRcdGVsZW1lbnQudmFsdWUgPSB0b1ZhbHVlKG11bHRpcGxlKSA/IChfZG9jdW1lbnQkZWxlbWVudHNGcm8gPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuZWxlbWVudHNGcm9tUG9pbnQodG9WYWx1ZSh4KSwgdG9WYWx1ZSh5KSkpICE9PSBudWxsICYmIF9kb2N1bWVudCRlbGVtZW50c0ZybyAhPT0gdm9pZCAwID8gX2RvY3VtZW50JGVsZW1lbnRzRnJvIDogW10gOiAoX2RvY3VtZW50JGVsZW1lbnRGcm9tID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmVsZW1lbnRGcm9tUG9pbnQodG9WYWx1ZSh4KSwgdG9WYWx1ZSh5KSkpICE9PSBudWxsICYmIF9kb2N1bWVudCRlbGVtZW50RnJvbSAhPT0gdm9pZCAwID8gX2RvY3VtZW50JGVsZW1lbnRGcm9tIDogbnVsbDtcblx0XHR9KVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50SG92ZXIvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUVsZW1lbnRIb3ZlcihlbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZGVsYXlFbnRlciA9IDAsIGRlbGF5TGVhdmUgPSAwLCB0cmlnZ2VyT25SZW1vdmFsID0gZmFsc2UsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0hvdmVyZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHRpbWVyO1xuXHRjb25zdCB0b2dnbGUgPSAoZW50ZXJpbmcpID0+IHtcblx0XHRjb25zdCBkZWxheSA9IGVudGVyaW5nID8gZGVsYXlFbnRlciA6IGRlbGF5TGVhdmU7XG5cdFx0aWYgKHRpbWVyKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0dGltZXIgPSB2b2lkIDA7XG5cdFx0fVxuXHRcdGlmIChkZWxheSkgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGlzSG92ZXJlZC52YWx1ZSA9IGVudGVyaW5nLCBkZWxheSk7XG5cdFx0ZWxzZSBpc0hvdmVyZWQudmFsdWUgPSBlbnRlcmluZztcblx0fTtcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIGlzSG92ZXJlZDtcblx0dXNlRXZlbnRMaXN0ZW5lcihlbCwgXCJtb3VzZWVudGVyXCIsICgpID0+IHRvZ2dsZSh0cnVlKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKGVsLCBcIm1vdXNlbGVhdmVcIiwgKCkgPT4gdG9nZ2xlKGZhbHNlKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRpZiAodHJpZ2dlck9uUmVtb3ZhbCkgb25FbGVtZW50UmVtb3ZhbChjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQoZWwpKSwgKCkgPT4gdG9nZ2xlKGZhbHNlKSk7XG5cdHJldHVybiBpc0hvdmVyZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUVsZW1lbnRTaXplL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgc2l6ZSBvZiBhbiBIVE1MIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRTaXplXG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudFNpemUodGFyZ2V0LCBpbml0aWFsU2l6ZSA9IHtcblx0d2lkdGg6IDAsXG5cdGhlaWdodDogMFxufSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGJveCA9IFwiY29udGVudC1ib3hcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTVkcgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF91bnJlZkVsZW1lbnQ7XG5cdFx0cmV0dXJuIChfdW5yZWZFbGVtZW50ID0gdW5yZWZFbGVtZW50KHRhcmdldCkpID09PSBudWxsIHx8IF91bnJlZkVsZW1lbnQgPT09IHZvaWQgMCB8fCAoX3VucmVmRWxlbWVudCA9IF91bnJlZkVsZW1lbnQubmFtZXNwYWNlVVJJKSA9PT0gbnVsbCB8fCBfdW5yZWZFbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdW5yZWZFbGVtZW50LmluY2x1ZGVzKFwic3ZnXCIpO1xuXHR9KTtcblx0Y29uc3Qgd2lkdGggPSBzaGFsbG93UmVmKGluaXRpYWxTaXplLndpZHRoKTtcblx0Y29uc3QgaGVpZ2h0ID0gc2hhbGxvd1JlZihpbml0aWFsU2l6ZS5oZWlnaHQpO1xuXHRjb25zdCB7IHN0b3A6IHN0b3AxIH0gPSB1c2VSZXNpemVPYnNlcnZlcih0YXJnZXQsIChbZW50cnldKSA9PiB7XG5cdFx0Y29uc3QgYm94U2l6ZSA9IGJveCA9PT0gXCJib3JkZXItYm94XCIgPyBlbnRyeS5ib3JkZXJCb3hTaXplIDogYm94ID09PSBcImNvbnRlbnQtYm94XCIgPyBlbnRyeS5jb250ZW50Qm94U2l6ZSA6IGVudHJ5LmRldmljZVBpeGVsQ29udGVudEJveFNpemU7XG5cdFx0aWYgKHdpbmRvdyQxICYmIGlzU1ZHLnZhbHVlKSB7XG5cdFx0XHRjb25zdCAkZWxlbSA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdFx0aWYgKCRlbGVtKSB7XG5cdFx0XHRcdGNvbnN0IHJlY3QgPSAkZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdFx0d2lkdGgudmFsdWUgPSByZWN0LndpZHRoO1xuXHRcdFx0XHRoZWlnaHQudmFsdWUgPSByZWN0LmhlaWdodDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGJveFNpemUpIHtcblx0XHRcdGNvbnN0IGZvcm1hdEJveFNpemUgPSB0b0FycmF5KGJveFNpemUpO1xuXHRcdFx0d2lkdGgudmFsdWUgPSBmb3JtYXRCb3hTaXplLnJlZHVjZSgoYWNjLCB7IGlubGluZVNpemUgfSkgPT4gYWNjICsgaW5saW5lU2l6ZSwgMCk7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSBmb3JtYXRCb3hTaXplLnJlZHVjZSgoYWNjLCB7IGJsb2NrU2l6ZSB9KSA9PiBhY2MgKyBibG9ja1NpemUsIDApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aWR0aC52YWx1ZSA9IGVudHJ5LmNvbnRlbnRSZWN0LndpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gZW50cnkuY29udGVudFJlY3QuaGVpZ2h0O1xuXHRcdH1cblx0fSwgb3B0aW9ucyk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgZWxlID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKGVsZSkge1xuXHRcdFx0d2lkdGgudmFsdWUgPSBcIm9mZnNldFdpZHRoXCIgaW4gZWxlID8gZWxlLm9mZnNldFdpZHRoIDogaW5pdGlhbFNpemUud2lkdGg7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSBcIm9mZnNldEhlaWdodFwiIGluIGVsZSA/IGVsZS5vZmZzZXRIZWlnaHQgOiBpbml0aWFsU2l6ZS5oZWlnaHQ7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3Qgc3RvcDIgPSB3YXRjaCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSwgKGVsZSkgPT4ge1xuXHRcdHdpZHRoLnZhbHVlID0gZWxlID8gaW5pdGlhbFNpemUud2lkdGggOiAwO1xuXHRcdGhlaWdodC52YWx1ZSA9IGVsZSA/IGluaXRpYWxTaXplLmhlaWdodCA6IDA7XG5cdH0pO1xuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdHN0b3AxKCk7XG5cdFx0c3RvcDIoKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHdpZHRoLFxuXHRcdGhlaWdodCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUludGVyc2VjdGlvbk9ic2VydmVyL2luZGV4LnRzXG4vKipcbiogRGV0ZWN0cyB0aGF0IGEgdGFyZ2V0IGVsZW1lbnQncyB2aXNpYmlsaXR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VJbnRlcnNlY3Rpb25PYnNlcnZlclxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBjYWxsYmFja1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUludGVyc2VjdGlvbk9ic2VydmVyKHRhcmdldCwgY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHJvb3QsIHJvb3RNYXJnaW4sIHRocmVzaG9sZCA9IDAsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJJbnRlcnNlY3Rpb25PYnNlcnZlclwiIGluIHdpbmRvdyQxKTtcblx0Y29uc3QgdGFyZ2V0cyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gdG9BcnJheSh0b1ZhbHVlKHRhcmdldCkpLm1hcCh1bnJlZkVsZW1lbnQpLmZpbHRlcihub3ROdWxsaXNoKTtcblx0fSk7XG5cdGxldCBjbGVhbnVwID0gbm9vcDtcblx0Y29uc3QgaXNBY3RpdmUgPSBzaGFsbG93UmVmKGltbWVkaWF0ZSk7XG5cdGNvbnN0IHN0b3BXYXRjaCA9IGlzU3VwcG9ydGVkLnZhbHVlID8gd2F0Y2goKCkgPT4gW1xuXHRcdHRhcmdldHMudmFsdWUsXG5cdFx0dW5yZWZFbGVtZW50KHJvb3QpLFxuXHRcdHRvVmFsdWUocm9vdE1hcmdpbiksXG5cdFx0aXNBY3RpdmUudmFsdWVcblx0XSwgKFt0YXJnZXRzJDEsIHJvb3QkMSwgcm9vdE1hcmdpbiQxXSkgPT4ge1xuXHRcdGNsZWFudXAoKTtcblx0XHRpZiAoIWlzQWN0aXZlLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKCF0YXJnZXRzJDEubGVuZ3RoKSByZXR1cm47XG5cdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIHtcblx0XHRcdHJvb3Q6IHVucmVmRWxlbWVudChyb290JDEpLFxuXHRcdFx0cm9vdE1hcmdpbjogcm9vdE1hcmdpbiQxLFxuXHRcdFx0dGhyZXNob2xkXG5cdFx0fSk7XG5cdFx0dGFyZ2V0cyQxLmZvckVhY2goKGVsKSA9PiBlbCAmJiBvYnNlcnZlci5vYnNlcnZlKGVsKSk7XG5cdFx0Y2xlYW51cCA9ICgpID0+IHtcblx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdGNsZWFudXAgPSBub29wO1xuXHRcdH07XG5cdH0sIHtcblx0XHRpbW1lZGlhdGUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pIDogbm9vcDtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRjbGVhbnVwKCk7XG5cdFx0c3RvcFdhdGNoKCk7XG5cdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNBY3RpdmUsXG5cdFx0cGF1c2UoKSB7XG5cdFx0XHRjbGVhbnVwKCk7XG5cdFx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0cmVzdW1lKCkge1xuXHRcdFx0aXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuXHRcdH0sXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50VmlzaWJpbGl0eS9pbmRleC50c1xuLyoqXG4qIFRyYWNrcyB0aGUgdmlzaWJpbGl0eSBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgdmlld3BvcnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRWaXNpYmlsaXR5XG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudFZpc2liaWxpdHkoZWxlbWVudCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHNjcm9sbFRhcmdldCwgdGhyZXNob2xkID0gMCwgcm9vdE1hcmdpbiwgb25jZSA9IGZhbHNlLCBpbml0aWFsVmFsdWUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZWxlbWVudElzVmlzaWJsZSA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgeyBzdG9wIH0gPSB1c2VJbnRlcnNlY3Rpb25PYnNlcnZlcihlbGVtZW50LCAoaW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyaWVzKSA9PiB7XG5cdFx0bGV0IGlzSW50ZXJzZWN0aW5nID0gZWxlbWVudElzVmlzaWJsZS52YWx1ZTtcblx0XHRsZXQgbGF0ZXN0VGltZSA9IDA7XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBpbnRlcnNlY3Rpb25PYnNlcnZlckVudHJpZXMpIGlmIChlbnRyeS50aW1lID49IGxhdGVzdFRpbWUpIHtcblx0XHRcdGxhdGVzdFRpbWUgPSBlbnRyeS50aW1lO1xuXHRcdFx0aXNJbnRlcnNlY3RpbmcgPSBlbnRyeS5pc0ludGVyc2VjdGluZztcblx0XHR9XG5cdFx0ZWxlbWVudElzVmlzaWJsZS52YWx1ZSA9IGlzSW50ZXJzZWN0aW5nO1xuXHRcdGlmIChvbmNlKSB3YXRjaE9uY2UoZWxlbWVudElzVmlzaWJsZSwgKCkgPT4ge1xuXHRcdFx0c3RvcCgpO1xuXHRcdH0pO1xuXHR9LCB7XG5cdFx0cm9vdDogc2Nyb2xsVGFyZ2V0LFxuXHRcdHdpbmRvdzogd2luZG93JDEsXG5cdFx0dGhyZXNob2xkLFxuXHRcdHJvb3RNYXJnaW5cblx0fSk7XG5cdHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFdmVudEJ1cy9pbnRlcm5hbC50c1xuY29uc3QgZXZlbnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRXZlbnRCdXMvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VFdmVudEJ1cyhrZXkpIHtcblx0Y29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50U2NvcGUoKTtcblx0ZnVuY3Rpb24gb24obGlzdGVuZXIpIHtcblx0XHR2YXIgX3Njb3BlJGNsZWFudXBzO1xuXHRcdGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50cy5nZXQoa2V5KSB8fCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuXHRcdGV2ZW50cy5zZXQoa2V5LCBsaXN0ZW5lcnMpO1xuXHRcdGNvbnN0IF9vZmYgPSAoKSA9PiBvZmYobGlzdGVuZXIpO1xuXHRcdHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB2b2lkIDAgfHwgKF9zY29wZSRjbGVhbnVwcyA9IHNjb3BlLmNsZWFudXBzKSA9PT0gbnVsbCB8fCBfc2NvcGUkY2xlYW51cHMgPT09IHZvaWQgMCB8fCBfc2NvcGUkY2xlYW51cHMucHVzaChfb2ZmKTtcblx0XHRyZXR1cm4gX29mZjtcblx0fVxuXHRmdW5jdGlvbiBvbmNlKGxpc3RlbmVyKSB7XG5cdFx0ZnVuY3Rpb24gX2xpc3RlbmVyKC4uLmFyZ3MpIHtcblx0XHRcdG9mZihfbGlzdGVuZXIpO1xuXHRcdFx0bGlzdGVuZXIoLi4uYXJncyk7XG5cdFx0fVxuXHRcdHJldHVybiBvbihfbGlzdGVuZXIpO1xuXHR9XG5cdGZ1bmN0aW9uIG9mZihsaXN0ZW5lcikge1xuXHRcdGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50cy5nZXQoa2V5KTtcblx0XHRpZiAoIWxpc3RlbmVycykgcmV0dXJuO1xuXHRcdGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuXHRcdGlmICghbGlzdGVuZXJzLnNpemUpIHJlc2V0KCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cdFx0ZXZlbnRzLmRlbGV0ZShrZXkpO1xuXHR9XG5cdGZ1bmN0aW9uIGVtaXQoZXZlbnQsIHBheWxvYWQpIHtcblx0XHR2YXIgX2V2ZW50cyRnZXQ7XG5cdFx0KF9ldmVudHMkZ2V0ID0gZXZlbnRzLmdldChrZXkpKSA9PT0gbnVsbCB8fCBfZXZlbnRzJGdldCA9PT0gdm9pZCAwIHx8IF9ldmVudHMkZ2V0LmZvckVhY2goKHYpID0+IHYoZXZlbnQsIHBheWxvYWQpKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdG9uLFxuXHRcdG9uY2UsXG5cdFx0b2ZmLFxuXHRcdGVtaXQsXG5cdFx0cmVzZXRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRXZlbnRTb3VyY2UvaW5kZXgudHNcbmZ1bmN0aW9uIHJlc29sdmVOZXN0ZWRPcHRpb25zJDEob3B0aW9ucykge1xuXHRpZiAob3B0aW9ucyA9PT0gdHJ1ZSkgcmV0dXJuIHt9O1xuXHRyZXR1cm4gb3B0aW9ucztcbn1cbi8qKlxuKiBSZWFjdGl2ZSB3cmFwcGVyIGZvciBFdmVudFNvdXJjZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRXZlbnRTb3VyY2VcbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRTb3VyY2UvRXZlbnRTb3VyY2UgRXZlbnRTb3VyY2VcbiogQHBhcmFtIHVybFxuKiBAcGFyYW0gZXZlbnRzXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRXZlbnRTb3VyY2UodXJsLCBldmVudHMkMSA9IFtdLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgZXZlbnQgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBkYXRhID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3Qgc3RhdHVzID0gc2hhbGxvd1JlZihcIkNPTk5FQ1RJTkdcIik7XG5cdGNvbnN0IGV2ZW50U291cmNlID0gcmVmKG51bGwpO1xuXHRjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHVybFJlZiA9IHRvUmVmKHVybCk7XG5cdGNvbnN0IGxhc3RFdmVudElkID0gc2hhbGxvd1JlZihudWxsKTtcblx0bGV0IGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcblx0bGV0IHJldHJpZWQgPSAwO1xuXHRjb25zdCB7IHdpdGhDcmVkZW50aWFscyA9IGZhbHNlLCBpbW1lZGlhdGUgPSB0cnVlLCBhdXRvQ29ubmVjdCA9IHRydWUsIGF1dG9SZWNvbm5lY3QsIHNlcmlhbGl6ZXIgPSB7IHJlYWQ6ICh2KSA9PiB2IH0gfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNsb3NlID0gKCkgPT4ge1xuXHRcdGlmIChpc0NsaWVudCAmJiBldmVudFNvdXJjZS52YWx1ZSkge1xuXHRcdFx0ZXZlbnRTb3VyY2UudmFsdWUuY2xvc2UoKTtcblx0XHRcdGV2ZW50U291cmNlLnZhbHVlID0gbnVsbDtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwiQ0xPU0VEXCI7XG5cdFx0XHRleHBsaWNpdGx5Q2xvc2VkID0gdHJ1ZTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IF9pbml0ID0gKCkgPT4ge1xuXHRcdGlmIChleHBsaWNpdGx5Q2xvc2VkIHx8IHR5cGVvZiB1cmxSZWYudmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblx0XHRjb25zdCBlcyA9IG5ldyBFdmVudFNvdXJjZSh1cmxSZWYudmFsdWUsIHsgd2l0aENyZWRlbnRpYWxzIH0pO1xuXHRcdHN0YXR1cy52YWx1ZSA9IFwiQ09OTkVDVElOR1wiO1xuXHRcdGV2ZW50U291cmNlLnZhbHVlID0gZXM7XG5cdFx0ZXMub25vcGVuID0gKCkgPT4ge1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJPUEVOXCI7XG5cdFx0XHRlcnJvci52YWx1ZSA9IG51bGw7XG5cdFx0fTtcblx0XHRlcy5vbmVycm9yID0gKGUpID0+IHtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwiQ0xPU0VEXCI7XG5cdFx0XHRlcnJvci52YWx1ZSA9IGU7XG5cdFx0XHRpZiAoZXMucmVhZHlTdGF0ZSA9PT0gMiAmJiAhZXhwbGljaXRseUNsb3NlZCAmJiBhdXRvUmVjb25uZWN0KSB7XG5cdFx0XHRcdGVzLmNsb3NlKCk7XG5cdFx0XHRcdGNvbnN0IHsgcmV0cmllcyA9IC0xLCBkZWxheSA9IDFlMywgb25GYWlsZWQgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zJDEoYXV0b1JlY29ubmVjdCk7XG5cdFx0XHRcdHJldHJpZWQgKz0gMTtcblx0XHRcdFx0aWYgKHR5cGVvZiByZXRyaWVzID09PSBcIm51bWJlclwiICYmIChyZXRyaWVzIDwgMCB8fCByZXRyaWVkIDwgcmV0cmllcykpIHNldFRpbWVvdXQoX2luaXQsIGRlbGF5KTtcblx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIHJldHJpZXMgPT09IFwiZnVuY3Rpb25cIiAmJiByZXRyaWVzKCkpIHNldFRpbWVvdXQoX2luaXQsIGRlbGF5KTtcblx0XHRcdFx0ZWxzZSBvbkZhaWxlZCA9PT0gbnVsbCB8fCBvbkZhaWxlZCA9PT0gdm9pZCAwIHx8IG9uRmFpbGVkKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRlcy5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuXHRcdFx0dmFyIF9zZXJpYWxpemVyJHJlYWQ7XG5cdFx0XHRldmVudC52YWx1ZSA9IG51bGw7XG5cdFx0XHRkYXRhLnZhbHVlID0gKF9zZXJpYWxpemVyJHJlYWQgPSBzZXJpYWxpemVyLnJlYWQoZS5kYXRhKSkgIT09IG51bGwgJiYgX3NlcmlhbGl6ZXIkcmVhZCAhPT0gdm9pZCAwID8gX3NlcmlhbGl6ZXIkcmVhZCA6IG51bGw7XG5cdFx0XHRsYXN0RXZlbnRJZC52YWx1ZSA9IGUubGFzdEV2ZW50SWQ7XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IGV2ZW50X25hbWUgb2YgZXZlbnRzJDEpIHVzZUV2ZW50TGlzdGVuZXIoZXMsIGV2ZW50X25hbWUsIChlKSA9PiB7XG5cdFx0XHR2YXIgX3NlcmlhbGl6ZXIkcmVhZDIsIF9lJGxhc3RFdmVudElkO1xuXHRcdFx0ZXZlbnQudmFsdWUgPSBldmVudF9uYW1lO1xuXHRcdFx0ZGF0YS52YWx1ZSA9IChfc2VyaWFsaXplciRyZWFkMiA9IHNlcmlhbGl6ZXIucmVhZChlLmRhdGEpKSAhPT0gbnVsbCAmJiBfc2VyaWFsaXplciRyZWFkMiAhPT0gdm9pZCAwID8gX3NlcmlhbGl6ZXIkcmVhZDIgOiBudWxsO1xuXHRcdFx0bGFzdEV2ZW50SWQudmFsdWUgPSAoX2UkbGFzdEV2ZW50SWQgPSBlLmxhc3RFdmVudElkKSAhPT0gbnVsbCAmJiBfZSRsYXN0RXZlbnRJZCAhPT0gdm9pZCAwID8gX2UkbGFzdEV2ZW50SWQgOiBudWxsO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fTtcblx0Y29uc3Qgb3BlbiA9ICgpID0+IHtcblx0XHRpZiAoIWlzQ2xpZW50KSByZXR1cm47XG5cdFx0Y2xvc2UoKTtcblx0XHRleHBsaWNpdGx5Q2xvc2VkID0gZmFsc2U7XG5cdFx0cmV0cmllZCA9IDA7XG5cdFx0X2luaXQoKTtcblx0fTtcblx0aWYgKGltbWVkaWF0ZSkgb3BlbigpO1xuXHRpZiAoYXV0b0Nvbm5lY3QpIHdhdGNoKHVybFJlZiwgb3Blbik7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKGNsb3NlKTtcblx0cmV0dXJuIHtcblx0XHRldmVudFNvdXJjZSxcblx0XHRldmVudCxcblx0XHRkYXRhLFxuXHRcdHN0YXR1cyxcblx0XHRlcnJvcixcblx0XHRvcGVuLFxuXHRcdGNsb3NlLFxuXHRcdGxhc3RFdmVudElkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUV5ZURyb3BwZXIvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBbRXllRHJvcHBlciBBUEldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FeWVEcm9wcGVyX0FQSSlcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRXllRHJvcHBlclxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUV5ZURyb3BwZXIob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFZhbHVlID0gXCJcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgXCJFeWVEcm9wcGVyXCIgaW4gd2luZG93KTtcblx0Y29uc3Qgc1JHQkhleCA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0YXN5bmMgZnVuY3Rpb24gb3BlbihvcGVuT3B0aW9ucykge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBuZXcgd2luZG93LkV5ZURyb3BwZXIoKS5vcGVuKG9wZW5PcHRpb25zKTtcblx0XHRzUkdCSGV4LnZhbHVlID0gcmVzdWx0LnNSR0JIZXg7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHNSR0JIZXgsXG5cdFx0b3BlblxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGYXZpY29uL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VGYXZpY29uKG5ld0ljb24gPSBudWxsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBiYXNlVXJsID0gXCJcIiwgcmVsID0gXCJpY29uXCIsIGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBmYXZpY29uID0gdG9SZWYobmV3SWNvbik7XG5cdGNvbnN0IGFwcGx5SWNvbiA9IChpY29uKSA9PiB7XG5cdFx0Y29uc3QgZWxlbWVudHMgPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuaGVhZC5xdWVyeVNlbGVjdG9yQWxsKGBsaW5rW3JlbCo9XCIke3JlbH1cIl1gKTtcblx0XHRpZiAoIWVsZW1lbnRzIHx8IGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29uc3QgbGluayA9IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcblx0XHRcdGlmIChsaW5rKSB7XG5cdFx0XHRcdGxpbmsucmVsID0gcmVsO1xuXHRcdFx0XHRsaW5rLmhyZWYgPSBgJHtiYXNlVXJsfSR7aWNvbn1gO1xuXHRcdFx0XHRsaW5rLnR5cGUgPSBgaW1hZ2UvJHtpY29uLnNwbGl0KFwiLlwiKS5wb3AoKX1gO1xuXHRcdFx0XHRkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCB8fCBkb2N1bWVudCQxLmhlYWQuYXBwZW5kKGxpbmspO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbGVtZW50cyA9PT0gbnVsbCB8fCBlbGVtZW50cyA9PT0gdm9pZCAwIHx8IGVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiBlbC5ocmVmID0gYCR7YmFzZVVybH0ke2ljb259YCk7XG5cdH07XG5cdHdhdGNoKGZhdmljb24sIChpLCBvKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpID09PSBcInN0cmluZ1wiICYmIGkgIT09IG8pIGFwcGx5SWNvbihpKTtcblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHJldHVybiBmYXZpY29uO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGZXRjaC9pbmRleC50c1xuY29uc3QgcGF5bG9hZE1hcHBpbmcgPSB7XG5cdGpzb246IFwiYXBwbGljYXRpb24vanNvblwiLFxuXHR0ZXh0OiBcInRleHQvcGxhaW5cIlxufTtcbi8qKlxuKiAhISFJTVBPUlRBTlQhISFcbipcbiogSWYgeW91IHVwZGF0ZSB0aGUgVXNlRmV0Y2hPcHRpb25zIGludGVyZmFjZSwgYmUgc3VyZSB0byB1cGRhdGUgdGhpcyBvYmplY3RcbiogdG8gaW5jbHVkZSB0aGUgbmV3IG9wdGlvbnNcbiovXG5mdW5jdGlvbiBpc0ZldGNoT3B0aW9ucyhvYmopIHtcblx0cmV0dXJuIG9iaiAmJiBjb250YWluc1Byb3Aob2JqLCBcImltbWVkaWF0ZVwiLCBcInJlZmV0Y2hcIiwgXCJpbml0aWFsRGF0YVwiLCBcInRpbWVvdXRcIiwgXCJiZWZvcmVGZXRjaFwiLCBcImFmdGVyRmV0Y2hcIiwgXCJvbkZldGNoRXJyb3JcIiwgXCJmZXRjaFwiLCBcInVwZGF0ZURhdGFPbkVycm9yXCIpO1xufVxuY29uc3QgcmVBYnNvbHV0ZSA9IC9eKD86W2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pO1xuZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcblx0cmV0dXJuIHJlQWJzb2x1dGUudGVzdCh1cmwpO1xufVxuZnVuY3Rpb24gaGVhZGVyc1RvT2JqZWN0KGhlYWRlcnMpIHtcblx0aWYgKHR5cGVvZiBIZWFkZXJzICE9PSBcInVuZGVmaW5lZFwiICYmIGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGhlYWRlcnMuZW50cmllcygpKTtcblx0cmV0dXJuIGhlYWRlcnM7XG59XG5mdW5jdGlvbiBjb21iaW5lQ2FsbGJhY2tzKGNvbWJpbmF0aW9uLCAuLi5jYWxsYmFja3MpIHtcblx0aWYgKGNvbWJpbmF0aW9uID09PSBcIm92ZXJ3cml0ZVwiKSByZXR1cm4gYXN5bmMgKGN0eCkgPT4ge1xuXHRcdGxldCBjYWxsYmFjaztcblx0XHRmb3IgKGxldCBpID0gY2FsbGJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoY2FsbGJhY2tzW2ldICE9IG51bGwpIHtcblx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2tzW2ldO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmIChjYWxsYmFjaykgcmV0dXJuIHtcblx0XHRcdC4uLmN0eCxcblx0XHRcdC4uLmF3YWl0IGNhbGxiYWNrKGN0eClcblx0XHR9O1xuXHRcdHJldHVybiBjdHg7XG5cdH07XG5cdGVsc2UgcmV0dXJuIGFzeW5jIChjdHgpID0+IHtcblx0XHRmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykgaWYgKGNhbGxiYWNrKSBjdHggPSB7XG5cdFx0XHQuLi5jdHgsXG5cdFx0XHQuLi5hd2FpdCBjYWxsYmFjayhjdHgpXG5cdFx0fTtcblx0XHRyZXR1cm4gY3R4O1xuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlRmV0Y2goY29uZmlnID0ge30pIHtcblx0Y29uc3QgX2NvbWJpbmF0aW9uID0gY29uZmlnLmNvbWJpbmF0aW9uIHx8IFwiY2hhaW5cIjtcblx0Y29uc3QgX29wdGlvbnMgPSBjb25maWcub3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgX2ZldGNoT3B0aW9ucyA9IGNvbmZpZy5mZXRjaE9wdGlvbnMgfHwge307XG5cdGZ1bmN0aW9uIHVzZUZhY3RvcnlGZXRjaCh1cmwsIC4uLmFyZ3MpIHtcblx0XHRjb25zdCBjb21wdXRlZFVybCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdGNvbnN0IGJhc2VVcmwgPSB0b1ZhbHVlKGNvbmZpZy5iYXNlVXJsKTtcblx0XHRcdGNvbnN0IHRhcmdldFVybCA9IHRvVmFsdWUodXJsKTtcblx0XHRcdHJldHVybiBiYXNlVXJsICYmICFpc0Fic29sdXRlVVJMKHRhcmdldFVybCkgPyBqb2luUGF0aHMoYmFzZVVybCwgdGFyZ2V0VXJsKSA6IHRhcmdldFVybDtcblx0XHR9KTtcblx0XHRsZXQgb3B0aW9ucyA9IF9vcHRpb25zO1xuXHRcdGxldCBmZXRjaE9wdGlvbnMgPSBfZmV0Y2hPcHRpb25zO1xuXHRcdGlmIChhcmdzLmxlbmd0aCA+IDApIGlmIChpc0ZldGNoT3B0aW9ucyhhcmdzWzBdKSkgb3B0aW9ucyA9IHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5hcmdzWzBdLFxuXHRcdFx0YmVmb3JlRmV0Y2g6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5iZWZvcmVGZXRjaCwgYXJnc1swXS5iZWZvcmVGZXRjaCksXG5cdFx0XHRhZnRlckZldGNoOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMuYWZ0ZXJGZXRjaCwgYXJnc1swXS5hZnRlckZldGNoKSxcblx0XHRcdG9uRmV0Y2hFcnJvcjogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLm9uRmV0Y2hFcnJvciwgYXJnc1swXS5vbkZldGNoRXJyb3IpXG5cdFx0fTtcblx0XHRlbHNlIGZldGNoT3B0aW9ucyA9IHtcblx0XHRcdC4uLmZldGNoT3B0aW9ucyxcblx0XHRcdC4uLmFyZ3NbMF0sXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdC4uLmhlYWRlcnNUb09iamVjdChmZXRjaE9wdGlvbnMuaGVhZGVycykgfHwge30sXG5cdFx0XHRcdC4uLmhlYWRlcnNUb09iamVjdChhcmdzWzBdLmhlYWRlcnMpIHx8IHt9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpZiAoYXJncy5sZW5ndGggPiAxICYmIGlzRmV0Y2hPcHRpb25zKGFyZ3NbMV0pKSBvcHRpb25zID0ge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLmFyZ3NbMV0sXG5cdFx0XHRiZWZvcmVGZXRjaDogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLmJlZm9yZUZldGNoLCBhcmdzWzFdLmJlZm9yZUZldGNoKSxcblx0XHRcdGFmdGVyRmV0Y2g6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5hZnRlckZldGNoLCBhcmdzWzFdLmFmdGVyRmV0Y2gpLFxuXHRcdFx0b25GZXRjaEVycm9yOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMub25GZXRjaEVycm9yLCBhcmdzWzFdLm9uRmV0Y2hFcnJvcilcblx0XHR9O1xuXHRcdHJldHVybiB1c2VGZXRjaChjb21wdXRlZFVybCwgZmV0Y2hPcHRpb25zLCBvcHRpb25zKTtcblx0fVxuXHRyZXR1cm4gdXNlRmFjdG9yeUZldGNoO1xufVxuZnVuY3Rpb24gdXNlRmV0Y2godXJsLCAuLi5hcmdzKSB7XG5cdHZhciBfZGVmYXVsdFdpbmRvdyRmZXRjaCwgX2dsb2JhbFRoaXM7XG5cdGNvbnN0IHN1cHBvcnRzQWJvcnQgPSB0eXBlb2YgQWJvcnRDb250cm9sbGVyID09PSBcImZ1bmN0aW9uXCI7XG5cdGxldCBmZXRjaE9wdGlvbnMgPSB7fTtcblx0bGV0IG9wdGlvbnMgPSB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdHJlZmV0Y2g6IGZhbHNlLFxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0dXBkYXRlRGF0YU9uRXJyb3I6IGZhbHNlXG5cdH07XG5cdGNvbnN0IGNvbmZpZyA9IHtcblx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0cGF5bG9hZDogdm9pZCAwXG5cdH07XG5cdGlmIChhcmdzLmxlbmd0aCA+IDApIGlmIChpc0ZldGNoT3B0aW9ucyhhcmdzWzBdKSkgb3B0aW9ucyA9IHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdC4uLmFyZ3NbMF1cblx0fTtcblx0ZWxzZSBmZXRjaE9wdGlvbnMgPSBhcmdzWzBdO1xuXHRpZiAoYXJncy5sZW5ndGggPiAxKSB7XG5cdFx0aWYgKGlzRmV0Y2hPcHRpb25zKGFyZ3NbMV0pKSBvcHRpb25zID0ge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLmFyZ3NbMV1cblx0XHR9O1xuXHR9XG5cdGNvbnN0IHsgZmV0Y2ggPSAoX2RlZmF1bHRXaW5kb3ckZmV0Y2ggPSBkZWZhdWx0V2luZG93ID09PSBudWxsIHx8IGRlZmF1bHRXaW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlZmF1bHRXaW5kb3cuZmV0Y2gpICE9PSBudWxsICYmIF9kZWZhdWx0V2luZG93JGZldGNoICE9PSB2b2lkIDAgPyBfZGVmYXVsdFdpbmRvdyRmZXRjaCA6IChfZ2xvYmFsVGhpcyA9IGdsb2JhbFRoaXMpID09PSBudWxsIHx8IF9nbG9iYWxUaGlzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZ2xvYmFsVGhpcy5mZXRjaCwgaW5pdGlhbERhdGEsIHRpbWVvdXQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJlc3BvbnNlRXZlbnQgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgZXJyb3JFdmVudCA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBmaW5hbGx5RXZlbnQgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgaXNGaW5pc2hlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBpc0ZldGNoaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGFib3J0ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgc3RhdHVzQ29kZSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHJlc3BvbnNlID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBkYXRhID0gc2hhbGxvd1JlZihpbml0aWFsRGF0YSB8fCBudWxsKTtcblx0Y29uc3QgY2FuQWJvcnQgPSBjb21wdXRlZCgoKSA9PiBzdXBwb3J0c0Fib3J0ICYmIGlzRmV0Y2hpbmcudmFsdWUpO1xuXHRsZXQgY29udHJvbGxlcjtcblx0bGV0IHRpbWVyO1xuXHRjb25zdCBhYm9ydCA9IChyZWFzb24pID0+IHtcblx0XHRpZiAoc3VwcG9ydHNBYm9ydCkge1xuXHRcdFx0Y29udHJvbGxlciA9PT0gbnVsbCB8fCBjb250cm9sbGVyID09PSB2b2lkIDAgfHwgY29udHJvbGxlci5hYm9ydChyZWFzb24pO1xuXHRcdFx0Y29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblx0XHRcdGNvbnRyb2xsZXIuc2lnbmFsLm9uYWJvcnQgPSAoKSA9PiBhYm9ydGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGZldGNoT3B0aW9ucyA9IHtcblx0XHRcdFx0Li4uZmV0Y2hPcHRpb25zLFxuXHRcdFx0XHRzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblx0Y29uc3QgbG9hZGluZyA9IChpc0xvYWRpbmcpID0+IHtcblx0XHRpc0ZldGNoaW5nLnZhbHVlID0gaXNMb2FkaW5nO1xuXHRcdGlzRmluaXNoZWQudmFsdWUgPSAhaXNMb2FkaW5nO1xuXHR9O1xuXHRpZiAodGltZW91dCkgdGltZXIgPSB1c2VUaW1lb3V0Rm4oYWJvcnQsIHRpbWVvdXQsIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcblx0bGV0IGV4ZWN1dGVDb3VudGVyID0gMDtcblx0Y29uc3QgZXhlY3V0ZSA9IGFzeW5jICh0aHJvd09uRmFpbGVkID0gZmFsc2UpID0+IHtcblx0XHR2YXIgX2NvbnRleHQkb3B0aW9ucztcblx0XHRhYm9ydCgpO1xuXHRcdGxvYWRpbmcodHJ1ZSk7XG5cdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdHN0YXR1c0NvZGUudmFsdWUgPSBudWxsO1xuXHRcdGFib3J0ZWQudmFsdWUgPSBmYWxzZTtcblx0XHRleGVjdXRlQ291bnRlciArPSAxO1xuXHRcdGNvbnN0IGN1cnJlbnRFeGVjdXRlQ291bnRlciA9IGV4ZWN1dGVDb3VudGVyO1xuXHRcdGNvbnN0IGRlZmF1bHRGZXRjaE9wdGlvbnMgPSB7XG5cdFx0XHRtZXRob2Q6IGNvbmZpZy5tZXRob2QsXG5cdFx0XHRoZWFkZXJzOiB7fVxuXHRcdH07XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHRvVmFsdWUoY29uZmlnLnBheWxvYWQpO1xuXHRcdGlmIChwYXlsb2FkKSB7XG5cdFx0XHR2YXIgX3BheWxvYWRNYXBwaW5nJGNvbmZpO1xuXHRcdFx0Y29uc3QgaGVhZGVycyA9IGhlYWRlcnNUb09iamVjdChkZWZhdWx0RmV0Y2hPcHRpb25zLmhlYWRlcnMpO1xuXHRcdFx0Y29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGF5bG9hZCk7XG5cdFx0XHRpZiAoIWNvbmZpZy5wYXlsb2FkVHlwZSAmJiBwYXlsb2FkICYmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBBcnJheS5pc0FycmF5KHByb3RvKSkgJiYgIShwYXlsb2FkIGluc3RhbmNlb2YgRm9ybURhdGEpKSBjb25maWcucGF5bG9hZFR5cGUgPSBcImpzb25cIjtcblx0XHRcdGlmIChjb25maWcucGF5bG9hZFR5cGUpIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSAoX3BheWxvYWRNYXBwaW5nJGNvbmZpID0gcGF5bG9hZE1hcHBpbmdbY29uZmlnLnBheWxvYWRUeXBlXSkgIT09IG51bGwgJiYgX3BheWxvYWRNYXBwaW5nJGNvbmZpICE9PSB2b2lkIDAgPyBfcGF5bG9hZE1hcHBpbmckY29uZmkgOiBjb25maWcucGF5bG9hZFR5cGU7XG5cdFx0XHRkZWZhdWx0RmV0Y2hPcHRpb25zLmJvZHkgPSBjb25maWcucGF5bG9hZFR5cGUgPT09IFwianNvblwiID8gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkgOiBwYXlsb2FkO1xuXHRcdH1cblx0XHRsZXQgaXNDYW5jZWxlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNvbnRleHQgPSB7XG5cdFx0XHR1cmw6IHRvVmFsdWUodXJsKSxcblx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0Li4uZGVmYXVsdEZldGNoT3B0aW9ucyxcblx0XHRcdFx0Li4uZmV0Y2hPcHRpb25zXG5cdFx0XHR9LFxuXHRcdFx0Y2FuY2VsOiAoKSA9PiB7XG5cdFx0XHRcdGlzQ2FuY2VsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0aWYgKG9wdGlvbnMuYmVmb3JlRmV0Y2gpIE9iamVjdC5hc3NpZ24oY29udGV4dCwgYXdhaXQgb3B0aW9ucy5iZWZvcmVGZXRjaChjb250ZXh0KSk7XG5cdFx0aWYgKGlzQ2FuY2VsZWQgfHwgIWZldGNoKSB7XG5cdFx0XHRsb2FkaW5nKGZhbHNlKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXHRcdGxldCByZXNwb25zZURhdGEgPSBudWxsO1xuXHRcdGlmICh0aW1lcikgdGltZXIuc3RhcnQoKTtcblx0XHRyZXR1cm4gZmV0Y2goY29udGV4dC51cmwsIHtcblx0XHRcdC4uLmRlZmF1bHRGZXRjaE9wdGlvbnMsXG5cdFx0XHQuLi5jb250ZXh0Lm9wdGlvbnMsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdC4uLmhlYWRlcnNUb09iamVjdChkZWZhdWx0RmV0Y2hPcHRpb25zLmhlYWRlcnMpLFxuXHRcdFx0XHQuLi5oZWFkZXJzVG9PYmplY3QoKF9jb250ZXh0JG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnMpID09PSBudWxsIHx8IF9jb250ZXh0JG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jb250ZXh0JG9wdGlvbnMuaGVhZGVycylcblx0XHRcdH1cblx0XHR9KS50aGVuKGFzeW5jIChmZXRjaFJlc3BvbnNlKSA9PiB7XG5cdFx0XHRyZXNwb25zZS52YWx1ZSA9IGZldGNoUmVzcG9uc2U7XG5cdFx0XHRzdGF0dXNDb2RlLnZhbHVlID0gZmV0Y2hSZXNwb25zZS5zdGF0dXM7XG5cdFx0XHRyZXNwb25zZURhdGEgPSBhd2FpdCBmZXRjaFJlc3BvbnNlLmNsb25lKClbY29uZmlnLnR5cGVdKCk7XG5cdFx0XHRpZiAoIWZldGNoUmVzcG9uc2Uub2spIHtcblx0XHRcdFx0ZGF0YS52YWx1ZSA9IGluaXRpYWxEYXRhIHx8IG51bGw7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihmZXRjaFJlc3BvbnNlLnN0YXR1c1RleHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9wdGlvbnMuYWZ0ZXJGZXRjaCkgKHtkYXRhOiByZXNwb25zZURhdGF9ID0gYXdhaXQgb3B0aW9ucy5hZnRlckZldGNoKHtcblx0XHRcdFx0ZGF0YTogcmVzcG9uc2VEYXRhLFxuXHRcdFx0XHRyZXNwb25zZTogZmV0Y2hSZXNwb25zZSxcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0ZXhlY3V0ZVxuXHRcdFx0fSkpO1xuXHRcdFx0ZGF0YS52YWx1ZSA9IHJlc3BvbnNlRGF0YTtcblx0XHRcdHJlc3BvbnNlRXZlbnQudHJpZ2dlcihmZXRjaFJlc3BvbnNlKTtcblx0XHRcdHJldHVybiBmZXRjaFJlc3BvbnNlO1xuXHRcdH0pLmNhdGNoKGFzeW5jIChmZXRjaEVycm9yKSA9PiB7XG5cdFx0XHRsZXQgZXJyb3JEYXRhID0gZmV0Y2hFcnJvci5tZXNzYWdlIHx8IGZldGNoRXJyb3IubmFtZTtcblx0XHRcdGlmIChvcHRpb25zLm9uRmV0Y2hFcnJvcikgKHtlcnJvcjogZXJyb3JEYXRhLCBkYXRhOiByZXNwb25zZURhdGF9ID0gYXdhaXQgb3B0aW9ucy5vbkZldGNoRXJyb3Ioe1xuXHRcdFx0XHRkYXRhOiByZXNwb25zZURhdGEsXG5cdFx0XHRcdGVycm9yOiBmZXRjaEVycm9yLFxuXHRcdFx0XHRyZXNwb25zZTogcmVzcG9uc2UudmFsdWUsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdGV4ZWN1dGVcblx0XHRcdH0pKTtcblx0XHRcdGVycm9yLnZhbHVlID0gZXJyb3JEYXRhO1xuXHRcdFx0aWYgKG9wdGlvbnMudXBkYXRlRGF0YU9uRXJyb3IpIGRhdGEudmFsdWUgPSByZXNwb25zZURhdGE7XG5cdFx0XHRlcnJvckV2ZW50LnRyaWdnZXIoZmV0Y2hFcnJvcik7XG5cdFx0XHRpZiAodGhyb3dPbkZhaWxlZCkgdGhyb3cgZmV0Y2hFcnJvcjtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0pLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0aWYgKGN1cnJlbnRFeGVjdXRlQ291bnRlciA9PT0gZXhlY3V0ZUNvdW50ZXIpIGxvYWRpbmcoZmFsc2UpO1xuXHRcdFx0aWYgKHRpbWVyKSB0aW1lci5zdG9wKCk7XG5cdFx0XHRmaW5hbGx5RXZlbnQudHJpZ2dlcihudWxsKTtcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgcmVmZXRjaCA9IHRvUmVmKG9wdGlvbnMucmVmZXRjaCk7XG5cdHdhdGNoKFtyZWZldGNoLCB0b1JlZih1cmwpXSwgKFtyZWZldGNoJDFdKSA9PiByZWZldGNoJDEgJiYgZXhlY3V0ZSgpLCB7IGRlZXA6IHRydWUgfSk7XG5cdGNvbnN0IHNoZWxsID0ge1xuXHRcdGlzRmluaXNoZWQ6IHJlYWRvbmx5KGlzRmluaXNoZWQpLFxuXHRcdGlzRmV0Y2hpbmc6IHJlYWRvbmx5KGlzRmV0Y2hpbmcpLFxuXHRcdHN0YXR1c0NvZGUsXG5cdFx0cmVzcG9uc2UsXG5cdFx0ZXJyb3IsXG5cdFx0ZGF0YSxcblx0XHRjYW5BYm9ydCxcblx0XHRhYm9ydGVkLFxuXHRcdGFib3J0LFxuXHRcdGV4ZWN1dGUsXG5cdFx0b25GZXRjaFJlc3BvbnNlOiByZXNwb25zZUV2ZW50Lm9uLFxuXHRcdG9uRmV0Y2hFcnJvcjogZXJyb3JFdmVudC5vbixcblx0XHRvbkZldGNoRmluYWxseTogZmluYWxseUV2ZW50Lm9uLFxuXHRcdGdldDogc2V0TWV0aG9kKFwiR0VUXCIpLFxuXHRcdHB1dDogc2V0TWV0aG9kKFwiUFVUXCIpLFxuXHRcdHBvc3Q6IHNldE1ldGhvZChcIlBPU1RcIiksXG5cdFx0ZGVsZXRlOiBzZXRNZXRob2QoXCJERUxFVEVcIiksXG5cdFx0cGF0Y2g6IHNldE1ldGhvZChcIlBBVENIXCIpLFxuXHRcdGhlYWQ6IHNldE1ldGhvZChcIkhFQURcIiksXG5cdFx0b3B0aW9uczogc2V0TWV0aG9kKFwiT1BUSU9OU1wiKSxcblx0XHRqc29uOiBzZXRUeXBlKFwianNvblwiKSxcblx0XHR0ZXh0OiBzZXRUeXBlKFwidGV4dFwiKSxcblx0XHRibG9iOiBzZXRUeXBlKFwiYmxvYlwiKSxcblx0XHRhcnJheUJ1ZmZlcjogc2V0VHlwZShcImFycmF5QnVmZmVyXCIpLFxuXHRcdGZvcm1EYXRhOiBzZXRUeXBlKFwiZm9ybURhdGFcIilcblx0fTtcblx0ZnVuY3Rpb24gc2V0TWV0aG9kKG1ldGhvZCkge1xuXHRcdHJldHVybiAocGF5bG9hZCwgcGF5bG9hZFR5cGUpID0+IHtcblx0XHRcdGlmICghaXNGZXRjaGluZy52YWx1ZSkge1xuXHRcdFx0XHRjb25maWcubWV0aG9kID0gbWV0aG9kO1xuXHRcdFx0XHRjb25maWcucGF5bG9hZCA9IHBheWxvYWQ7XG5cdFx0XHRcdGNvbmZpZy5wYXlsb2FkVHlwZSA9IHBheWxvYWRUeXBlO1xuXHRcdFx0XHRpZiAoaXNSZWYoY29uZmlnLnBheWxvYWQpKSB3YXRjaChbcmVmZXRjaCwgdG9SZWYoY29uZmlnLnBheWxvYWQpXSwgKFtyZWZldGNoJDFdKSA9PiByZWZldGNoJDEgJiYgZXhlY3V0ZSgpLCB7IGRlZXA6IHRydWUgfSk7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0Li4uc2hlbGwsXG5cdFx0XHRcdFx0dGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHdhaXRVbnRpbEZpbmlzaGVkKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0ZnVuY3Rpb24gd2FpdFVudGlsRmluaXNoZWQoKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHVudGlsKGlzRmluaXNoZWQpLnRvQmUodHJ1ZSkudGhlbigoKSA9PiByZXNvbHZlKHNoZWxsKSkuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fVxuXHRmdW5jdGlvbiBzZXRUeXBlKHR5cGUpIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0aWYgKCFpc0ZldGNoaW5nLnZhbHVlKSB7XG5cdFx0XHRcdGNvbmZpZy50eXBlID0gdHlwZTtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHQuLi5zaGVsbCxcblx0XHRcdFx0XHR0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gd2FpdFVudGlsRmluaXNoZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRpZiAob3B0aW9ucy5pbW1lZGlhdGUpIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gZXhlY3V0ZSgpKTtcblx0cmV0dXJuIHtcblx0XHQuLi5zaGVsbCxcblx0XHR0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdFx0XHRyZXR1cm4gd2FpdFVudGlsRmluaXNoZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0XHR9XG5cdH07XG59XG5mdW5jdGlvbiBqb2luUGF0aHMoc3RhcnQsIGVuZCkge1xuXHRpZiAoIXN0YXJ0LmVuZHNXaXRoKFwiL1wiKSAmJiAhZW5kLnN0YXJ0c1dpdGgoXCIvXCIpKSByZXR1cm4gYCR7c3RhcnR9LyR7ZW5kfWA7XG5cdGlmIChzdGFydC5lbmRzV2l0aChcIi9cIikgJiYgZW5kLnN0YXJ0c1dpdGgoXCIvXCIpKSByZXR1cm4gYCR7c3RhcnQuc2xpY2UoMCwgLTEpfSR7ZW5kfWA7XG5cdHJldHVybiBgJHtzdGFydH0ke2VuZH1gO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGaWxlRGlhbG9nL2luZGV4LnRzXG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG5cdG11bHRpcGxlOiB0cnVlLFxuXHRhY2NlcHQ6IFwiKlwiLFxuXHRyZXNldDogZmFsc2UsXG5cdGRpcmVjdG9yeTogZmFsc2Vcbn07XG5mdW5jdGlvbiBwcmVwYXJlSW5pdGlhbEZpbGVzKGZpbGVzKSB7XG5cdGlmICghZmlsZXMpIHJldHVybiBudWxsO1xuXHRpZiAoZmlsZXMgaW5zdGFuY2VvZiBGaWxlTGlzdCkgcmV0dXJuIGZpbGVzO1xuXHRjb25zdCBkdCA9IG5ldyBEYXRhVHJhbnNmZXIoKTtcblx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSBkdC5pdGVtcy5hZGQoZmlsZSk7XG5cdHJldHVybiBkdC5maWxlcztcbn1cbi8qKlxuKiBPcGVuIGZpbGUgZGlhbG9nIHdpdGggZWFzZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRmlsZURpYWxvZ1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUZpbGVEaWFsb2cob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGZpbGVzID0gcmVmKHByZXBhcmVJbml0aWFsRmlsZXMob3B0aW9ucy5pbml0aWFsRmlsZXMpKTtcblx0Y29uc3QgeyBvbjogb25DaGFuZ2UsIHRyaWdnZXI6IGNoYW5nZVRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCB7IG9uOiBvbkNhbmNlbCwgdHJpZ2dlcjogY2FuY2VsVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IGlucHV0UmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfdW5yZWZFbGVtZW50O1xuXHRcdGNvbnN0IGlucHV0ID0gKF91bnJlZkVsZW1lbnQgPSB1bnJlZkVsZW1lbnQob3B0aW9ucy5pbnB1dCkpICE9PSBudWxsICYmIF91bnJlZkVsZW1lbnQgIT09IHZvaWQgMCA/IF91bnJlZkVsZW1lbnQgOiBkb2N1bWVudCQxID8gZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikgOiB2b2lkIDA7XG5cdFx0aWYgKGlucHV0KSB7XG5cdFx0XHRpbnB1dC50eXBlID0gXCJmaWxlXCI7XG5cdFx0XHRpbnB1dC5vbmNoYW5nZSA9IChldmVudCkgPT4ge1xuXHRcdFx0XHRmaWxlcy52YWx1ZSA9IGV2ZW50LnRhcmdldC5maWxlcztcblx0XHRcdFx0Y2hhbmdlVHJpZ2dlcihmaWxlcy52YWx1ZSk7XG5cdFx0XHR9O1xuXHRcdFx0aW5wdXQub25jYW5jZWwgPSAoKSA9PiB7XG5cdFx0XHRcdGNhbmNlbFRyaWdnZXIoKTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiBpbnB1dDtcblx0fSk7XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdGZpbGVzLnZhbHVlID0gbnVsbDtcblx0XHRpZiAoaW5wdXRSZWYudmFsdWUgJiYgaW5wdXRSZWYudmFsdWUudmFsdWUpIHtcblx0XHRcdGlucHV0UmVmLnZhbHVlLnZhbHVlID0gXCJcIjtcblx0XHRcdGNoYW5nZVRyaWdnZXIobnVsbCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBhcHBseU9wdGlvbnMgPSAob3B0aW9ucyQxKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSBpbnB1dFJlZi52YWx1ZTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwubXVsdGlwbGUgPSB0b1ZhbHVlKG9wdGlvbnMkMS5tdWx0aXBsZSk7XG5cdFx0ZWwuYWNjZXB0ID0gdG9WYWx1ZShvcHRpb25zJDEuYWNjZXB0KTtcblx0XHRlbC53ZWJraXRkaXJlY3RvcnkgPSB0b1ZhbHVlKG9wdGlvbnMkMS5kaXJlY3RvcnkpO1xuXHRcdGlmIChoYXNPd24ob3B0aW9ucyQxLCBcImNhcHR1cmVcIikpIGVsLmNhcHR1cmUgPSB0b1ZhbHVlKG9wdGlvbnMkMS5jYXB0dXJlKTtcblx0fTtcblx0Y29uc3Qgb3BlbiA9IChsb2NhbE9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBlbCA9IGlucHV0UmVmLnZhbHVlO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRjb25zdCBtZXJnZWRPcHRpb25zID0ge1xuXHRcdFx0Li4uREVGQVVMVF9PUFRJT05TLFxuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLmxvY2FsT3B0aW9uc1xuXHRcdH07XG5cdFx0YXBwbHlPcHRpb25zKG1lcmdlZE9wdGlvbnMpO1xuXHRcdGlmICh0b1ZhbHVlKG1lcmdlZE9wdGlvbnMucmVzZXQpKSByZXNldCgpO1xuXHRcdGVsLmNsaWNrKCk7XG5cdH07XG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRhcHBseU9wdGlvbnMob3B0aW9ucyk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGZpbGVzOiByZWFkb25seShmaWxlcyksXG5cdFx0b3Blbixcblx0XHRyZXNldCxcblx0XHRvbkNhbmNlbCxcblx0XHRvbkNoYW5nZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGaWxlU3lzdGVtQWNjZXNzL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VGaWxlU3lzdGVtQWNjZXNzKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogX3dpbmRvdyA9IGRlZmF1bHRXaW5kb3csIGRhdGFUeXBlID0gXCJUZXh0XCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHdpbmRvdyQxID0gX3dpbmRvdztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwic2hvd1NhdmVGaWxlUGlja2VyXCIgaW4gd2luZG93JDEgJiYgXCJzaG93T3BlbkZpbGVQaWNrZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGNvbnN0IGZpbGVIYW5kbGUgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGRhdGEgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGZpbGUgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGZpbGVOYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfZmlsZSR2YWx1ZSRuYW1lLCBfZmlsZSR2YWx1ZTtcblx0XHRyZXR1cm4gKF9maWxlJHZhbHVlJG5hbWUgPSAoX2ZpbGUkdmFsdWUgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWUubmFtZSkgIT09IG51bGwgJiYgX2ZpbGUkdmFsdWUkbmFtZSAhPT0gdm9pZCAwID8gX2ZpbGUkdmFsdWUkbmFtZSA6IFwiXCI7XG5cdH0pO1xuXHRjb25zdCBmaWxlTUlNRSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX2ZpbGUkdmFsdWUkdHlwZSwgX2ZpbGUkdmFsdWUyO1xuXHRcdHJldHVybiAoX2ZpbGUkdmFsdWUkdHlwZSA9IChfZmlsZSR2YWx1ZTIgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlMi50eXBlKSAhPT0gbnVsbCAmJiBfZmlsZSR2YWx1ZSR0eXBlICE9PSB2b2lkIDAgPyBfZmlsZSR2YWx1ZSR0eXBlIDogXCJcIjtcblx0fSk7XG5cdGNvbnN0IGZpbGVTaXplID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfZmlsZSR2YWx1ZSRzaXplLCBfZmlsZSR2YWx1ZTM7XG5cdFx0cmV0dXJuIChfZmlsZSR2YWx1ZSRzaXplID0gKF9maWxlJHZhbHVlMyA9IGZpbGUudmFsdWUpID09PSBudWxsIHx8IF9maWxlJHZhbHVlMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWUzLnNpemUpICE9PSBudWxsICYmIF9maWxlJHZhbHVlJHNpemUgIT09IHZvaWQgMCA/IF9maWxlJHZhbHVlJHNpemUgOiAwO1xuXHR9KTtcblx0Y29uc3QgZmlsZUxhc3RNb2RpZmllZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX2ZpbGUkdmFsdWUkbGFzdE1vZGlmLCBfZmlsZSR2YWx1ZTQ7XG5cdFx0cmV0dXJuIChfZmlsZSR2YWx1ZSRsYXN0TW9kaWYgPSAoX2ZpbGUkdmFsdWU0ID0gZmlsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGUkdmFsdWU0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsZSR2YWx1ZTQubGFzdE1vZGlmaWVkKSAhPT0gbnVsbCAmJiBfZmlsZSR2YWx1ZSRsYXN0TW9kaWYgIT09IHZvaWQgMCA/IF9maWxlJHZhbHVlJGxhc3RNb2RpZiA6IDA7XG5cdH0pO1xuXHRhc3luYyBmdW5jdGlvbiBvcGVuKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgW2hhbmRsZV0gPSBhd2FpdCB3aW5kb3ckMS5zaG93T3BlbkZpbGVQaWNrZXIoe1xuXHRcdFx0Li4udG9WYWx1ZShvcHRpb25zKSxcblx0XHRcdC4uLl9vcHRpb25zXG5cdFx0fSk7XG5cdFx0ZmlsZUhhbmRsZS52YWx1ZSA9IGhhbmRsZTtcblx0XHRhd2FpdCB1cGRhdGVEYXRhKCk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gY3JlYXRlKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0ZmlsZUhhbmRsZS52YWx1ZSA9IGF3YWl0IHdpbmRvdyQxLnNob3dTYXZlRmlsZVBpY2tlcih7XG5cdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0Li4uX29wdGlvbnNcblx0XHR9KTtcblx0XHRkYXRhLnZhbHVlID0gdm9pZCAwO1xuXHRcdGF3YWl0IHVwZGF0ZURhdGEoKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBzYXZlKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKCFmaWxlSGFuZGxlLnZhbHVlKSByZXR1cm4gc2F2ZUFzKF9vcHRpb25zKTtcblx0XHRpZiAoZGF0YS52YWx1ZSkge1xuXHRcdFx0Y29uc3Qgd3JpdGFibGVTdHJlYW0gPSBhd2FpdCBmaWxlSGFuZGxlLnZhbHVlLmNyZWF0ZVdyaXRhYmxlKCk7XG5cdFx0XHRhd2FpdCB3cml0YWJsZVN0cmVhbS53cml0ZShkYXRhLnZhbHVlKTtcblx0XHRcdGF3YWl0IHdyaXRhYmxlU3RyZWFtLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHVwZGF0ZUZpbGUoKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBzYXZlQXMoX29wdGlvbnMgPSB7fSkge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRmaWxlSGFuZGxlLnZhbHVlID0gYXdhaXQgd2luZG93JDEuc2hvd1NhdmVGaWxlUGlja2VyKHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5fb3B0aW9uc1xuXHRcdH0pO1xuXHRcdGlmIChkYXRhLnZhbHVlKSB7XG5cdFx0XHRjb25zdCB3cml0YWJsZVN0cmVhbSA9IGF3YWl0IGZpbGVIYW5kbGUudmFsdWUuY3JlYXRlV3JpdGFibGUoKTtcblx0XHRcdGF3YWl0IHdyaXRhYmxlU3RyZWFtLndyaXRlKGRhdGEudmFsdWUpO1xuXHRcdFx0YXdhaXQgd3JpdGFibGVTdHJlYW0uY2xvc2UoKTtcblx0XHR9XG5cdFx0YXdhaXQgdXBkYXRlRmlsZSgpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGUoKSB7XG5cdFx0dmFyIF9maWxlSGFuZGxlJHZhbHVlO1xuXHRcdGZpbGUudmFsdWUgPSBhd2FpdCAoKF9maWxlSGFuZGxlJHZhbHVlID0gZmlsZUhhbmRsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGVIYW5kbGUkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlSGFuZGxlJHZhbHVlLmdldEZpbGUoKSk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gdXBkYXRlRGF0YSgpIHtcblx0XHR2YXIgX2ZpbGUkdmFsdWU1LCBfZmlsZSR2YWx1ZTY7XG5cdFx0YXdhaXQgdXBkYXRlRmlsZSgpO1xuXHRcdGNvbnN0IHR5cGUgPSB0b1ZhbHVlKGRhdGFUeXBlKTtcblx0XHRpZiAodHlwZSA9PT0gXCJUZXh0XCIpIGRhdGEudmFsdWUgPSBhd2FpdCAoKF9maWxlJHZhbHVlNSA9IGZpbGUudmFsdWUpID09PSBudWxsIHx8IF9maWxlJHZhbHVlNSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWU1LnRleHQoKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJBcnJheUJ1ZmZlclwiKSBkYXRhLnZhbHVlID0gYXdhaXQgKChfZmlsZSR2YWx1ZTYgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZTYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlNi5hcnJheUJ1ZmZlcigpKTtcblx0XHRlbHNlIGlmICh0eXBlID09PSBcIkJsb2JcIikgZGF0YS52YWx1ZSA9IGZpbGUudmFsdWU7XG5cdH1cblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShkYXRhVHlwZSksIHVwZGF0ZURhdGEpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGRhdGEsXG5cdFx0ZmlsZSxcblx0XHRmaWxlTmFtZSxcblx0XHRmaWxlTUlNRSxcblx0XHRmaWxlU2l6ZSxcblx0XHRmaWxlTGFzdE1vZGlmaWVkLFxuXHRcdG9wZW4sXG5cdFx0Y3JlYXRlLFxuXHRcdHNhdmUsXG5cdFx0c2F2ZUFzLFxuXHRcdHVwZGF0ZURhdGFcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRm9jdXMvaW5kZXgudHNcbi8qKlxuKiBUcmFjayBvciBzZXQgdGhlIGZvY3VzIHN0YXRlIG9mIGEgRE9NIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZvY3VzXG4qIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50IGZvciB0aGUgZm9jdXMgYW5kIGJsdXIgZXZlbnRzLlxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUZvY3VzKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFZhbHVlID0gZmFsc2UsIGZvY3VzVmlzaWJsZSA9IGZhbHNlLCBwcmV2ZW50U2Nyb2xsID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlubmVyRm9jdXNlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCB0YXJnZXRFbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCkpO1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBcImZvY3VzXCIsIChldmVudCkgPT4ge1xuXHRcdHZhciBfbWF0Y2hlcywgX3JlZjtcblx0XHRpZiAoIWZvY3VzVmlzaWJsZSB8fCAoKF9tYXRjaGVzID0gKF9yZWYgPSBldmVudC50YXJnZXQpLm1hdGNoZXMpID09PSBudWxsIHx8IF9tYXRjaGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWF0Y2hlcy5jYWxsKF9yZWYsIFwiOmZvY3VzLXZpc2libGVcIikpKSBpbm5lckZvY3VzZWQudmFsdWUgPSB0cnVlO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIFwiYmx1clwiLCAoKSA9PiBpbm5lckZvY3VzZWQudmFsdWUgPSBmYWxzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0Y29uc3QgZm9jdXNlZCA9IGNvbXB1dGVkKHtcblx0XHRnZXQ6ICgpID0+IGlubmVyRm9jdXNlZC52YWx1ZSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHZhciBfdGFyZ2V0RWxlbWVudCR2YWx1ZSwgX3RhcmdldEVsZW1lbnQkdmFsdWUyO1xuXHRcdFx0aWYgKCF2YWx1ZSAmJiBpbm5lckZvY3VzZWQudmFsdWUpIChfdGFyZ2V0RWxlbWVudCR2YWx1ZSA9IHRhcmdldEVsZW1lbnQudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlID09PSB2b2lkIDAgfHwgX3RhcmdldEVsZW1lbnQkdmFsdWUuYmx1cigpO1xuXHRcdFx0ZWxzZSBpZiAodmFsdWUgJiYgIWlubmVyRm9jdXNlZC52YWx1ZSkgKF90YXJnZXRFbGVtZW50JHZhbHVlMiA9IHRhcmdldEVsZW1lbnQudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlMiA9PT0gdm9pZCAwIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlMi5mb2N1cyh7IHByZXZlbnRTY3JvbGwgfSk7XG5cdFx0fVxuXHR9KTtcblx0d2F0Y2godGFyZ2V0RWxlbWVudCwgKCkgPT4ge1xuXHRcdGZvY3VzZWQudmFsdWUgPSBpbml0aWFsVmFsdWU7XG5cdH0sIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pO1xuXHRyZXR1cm4geyBmb2N1c2VkIH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUZvY3VzV2l0aGluL2luZGV4LnRzXG5jb25zdCBFVkVOVF9GT0NVU19JTiA9IFwiZm9jdXNpblwiO1xuY29uc3QgRVZFTlRfRk9DVVNfT1VUID0gXCJmb2N1c291dFwiO1xuY29uc3QgUFNFVURPX0NMQVNTX0ZPQ1VTX1dJVEhJTiA9IFwiOmZvY3VzLXdpdGhpblwiO1xuLyoqXG4qIFRyYWNrIGlmIGZvY3VzIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHRhcmdldCBlbGVtZW50XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZvY3VzV2l0aGluXG4qIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50IHRvIHRyYWNrXG4qIEBwYXJhbSBvcHRpb25zIEZvY3VzIHdpdGhpbiBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRm9jdXNXaXRoaW4odGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgdGFyZ2V0RWxlbWVudCA9IGNvbXB1dGVkKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpKTtcblx0Y29uc3QgX2ZvY3VzZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZm9jdXNlZCA9IGNvbXB1dGVkKCgpID0+IF9mb2N1c2VkLnZhbHVlKTtcblx0Y29uc3QgYWN0aXZlRWxlbWVudCA9IHVzZUFjdGl2ZUVsZW1lbnQob3B0aW9ucyk7XG5cdGlmICghd2luZG93JDEgfHwgIWFjdGl2ZUVsZW1lbnQudmFsdWUpIHJldHVybiB7IGZvY3VzZWQgfTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgRVZFTlRfRk9DVVNfSU4sICgpID0+IF9mb2N1c2VkLnZhbHVlID0gdHJ1ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBFVkVOVF9GT0NVU19PVVQsICgpID0+IHtcblx0XHR2YXIgX3RhcmdldEVsZW1lbnQkdmFsdWUkLCBfdGFyZ2V0RWxlbWVudCR2YWx1ZSwgX3RhcmdldEVsZW1lbnQkdmFsdWUkMjtcblx0XHRyZXR1cm4gX2ZvY3VzZWQudmFsdWUgPSAoX3RhcmdldEVsZW1lbnQkdmFsdWUkID0gKF90YXJnZXRFbGVtZW50JHZhbHVlID0gdGFyZ2V0RWxlbWVudC52YWx1ZSkgPT09IG51bGwgfHwgX3RhcmdldEVsZW1lbnQkdmFsdWUgPT09IHZvaWQgMCB8fCAoX3RhcmdldEVsZW1lbnQkdmFsdWUkMiA9IF90YXJnZXRFbGVtZW50JHZhbHVlLm1hdGNoZXMpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlJDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YXJnZXRFbGVtZW50JHZhbHVlJDIuY2FsbChfdGFyZ2V0RWxlbWVudCR2YWx1ZSwgUFNFVURPX0NMQVNTX0ZPQ1VTX1dJVEhJTikpICE9PSBudWxsICYmIF90YXJnZXRFbGVtZW50JHZhbHVlJCAhPT0gdm9pZCAwID8gX3RhcmdldEVsZW1lbnQkdmFsdWUkIDogZmFsc2U7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHJldHVybiB7IGZvY3VzZWQgfTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRnBzL2luZGV4LnRzXG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlRnBzKG9wdGlvbnMpIHtcblx0dmFyIF9vcHRpb25zJGV2ZXJ5O1xuXHRjb25zdCBmcHMgPSBzaGFsbG93UmVmKDApO1xuXHRpZiAodHlwZW9mIHBlcmZvcm1hbmNlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZnBzO1xuXHRjb25zdCBldmVyeSA9IChfb3B0aW9ucyRldmVyeSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ldmVyeSkgIT09IG51bGwgJiYgX29wdGlvbnMkZXZlcnkgIT09IHZvaWQgMCA/IF9vcHRpb25zJGV2ZXJ5IDogMTA7XG5cdGxldCBsYXN0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cdGxldCB0aWNrcyA9IDA7XG5cdHVzZVJhZkZuKCgpID0+IHtcblx0XHR0aWNrcyArPSAxO1xuXHRcdGlmICh0aWNrcyA+PSBldmVyeSkge1xuXHRcdFx0Y29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cdFx0XHRjb25zdCBkaWZmID0gbm93IC0gbGFzdDtcblx0XHRcdGZwcy52YWx1ZSA9IE1hdGgucm91bmQoMWUzIC8gKGRpZmYgLyB0aWNrcykpO1xuXHRcdFx0bGFzdCA9IG5vdztcblx0XHRcdHRpY2tzID0gMDtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZnBzO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGdWxsc2NyZWVuL2luZGV4LnRzXG5jb25zdCBldmVudEhhbmRsZXJzID0gW1xuXHRcImZ1bGxzY3JlZW5jaGFuZ2VcIixcblx0XCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFwid2Via2l0ZW5kZnVsbHNjcmVlblwiLFxuXHRcIm1vemZ1bGxzY3JlZW5jaGFuZ2VcIixcblx0XCJNU0Z1bGxzY3JlZW5DaGFuZ2VcIlxuXTtcbi8qKlxuKiBSZWFjdGl2ZSBGdWxsc2NyZWVuIEFQSS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRnVsbHNjcmVlblxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRnVsbHNjcmVlbih0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50LCBhdXRvRXhpdCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB0YXJnZXRSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF91bnJlZkVsZW1lbnQ7XG5cdFx0cmV0dXJuIChfdW5yZWZFbGVtZW50ID0gdW5yZWZFbGVtZW50KHRhcmdldCkpICE9PSBudWxsICYmIF91bnJlZkVsZW1lbnQgIT09IHZvaWQgMCA/IF91bnJlZkVsZW1lbnQgOiBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuZG9jdW1lbnRFbGVtZW50O1xuXHR9KTtcblx0Y29uc3QgaXNGdWxsc2NyZWVuID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHJlcXVlc3RNZXRob2QgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdFwicmVxdWVzdEZ1bGxzY3JlZW5cIixcblx0XHRcdFwid2Via2l0UmVxdWVzdEZ1bGxzY3JlZW5cIixcblx0XHRcdFwid2Via2l0RW50ZXJGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtb3pSZXF1ZXN0RnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtc1JlcXVlc3RGdWxsc2NyZWVuXCJcblx0XHRdLmZpbmQoKG0pID0+IGRvY3VtZW50JDEgJiYgbSBpbiBkb2N1bWVudCQxIHx8IHRhcmdldFJlZi52YWx1ZSAmJiBtIGluIHRhcmdldFJlZi52YWx1ZSk7XG5cdH0pO1xuXHRjb25zdCBleGl0TWV0aG9kID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiBbXG5cdFx0XHRcImV4aXRGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEV4aXRGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEV4aXRGdWxsU2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdENhbmNlbEZ1bGxTY3JlZW5cIixcblx0XHRcdFwibW96Q2FuY2VsRnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtc0V4aXRGdWxsc2NyZWVuXCJcblx0XHRdLmZpbmQoKG0pID0+IGRvY3VtZW50JDEgJiYgbSBpbiBkb2N1bWVudCQxIHx8IHRhcmdldFJlZi52YWx1ZSAmJiBtIGluIHRhcmdldFJlZi52YWx1ZSk7XG5cdH0pO1xuXHRjb25zdCBmdWxsc2NyZWVuRW5hYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0XCJmdWxsU2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdElzRnVsbFNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlblwiLFxuXHRcdFx0XCJtb3pGdWxsU2NyZWVuXCIsXG5cdFx0XHRcIm1zRnVsbHNjcmVlbkVsZW1lbnRcIlxuXHRcdF0uZmluZCgobSkgPT4gZG9jdW1lbnQkMSAmJiBtIGluIGRvY3VtZW50JDEgfHwgdGFyZ2V0UmVmLnZhbHVlICYmIG0gaW4gdGFyZ2V0UmVmLnZhbHVlKTtcblx0fSk7XG5cdGNvbnN0IGZ1bGxzY3JlZW5FbGVtZW50TWV0aG9kID0gW1xuXHRcdFwiZnVsbHNjcmVlbkVsZW1lbnRcIixcblx0XHRcIndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50XCIsXG5cdFx0XCJtb3pGdWxsU2NyZWVuRWxlbWVudFwiLFxuXHRcdFwibXNGdWxsc2NyZWVuRWxlbWVudFwiXG5cdF0uZmluZCgobSkgPT4gZG9jdW1lbnQkMSAmJiBtIGluIGRvY3VtZW50JDEpO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gdGFyZ2V0UmVmLnZhbHVlICYmIGRvY3VtZW50JDEgJiYgcmVxdWVzdE1ldGhvZC52YWx1ZSAhPT0gdm9pZCAwICYmIGV4aXRNZXRob2QudmFsdWUgIT09IHZvaWQgMCAmJiBmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZSAhPT0gdm9pZCAwKTtcblx0Y29uc3QgaXNDdXJyZW50RWxlbWVudEZ1bGxTY3JlZW4gPSAoKSA9PiB7XG5cdFx0aWYgKGZ1bGxzY3JlZW5FbGVtZW50TWV0aG9kKSByZXR1cm4gKGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMVtmdWxsc2NyZWVuRWxlbWVudE1ldGhvZF0pID09PSB0YXJnZXRSZWYudmFsdWU7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXHRjb25zdCBpc0VsZW1lbnRGdWxsU2NyZWVuID0gKCkgPT4ge1xuXHRcdGlmIChmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZSkgaWYgKGRvY3VtZW50JDEgJiYgZG9jdW1lbnQkMVtmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZV0gIT0gbnVsbCkgcmV0dXJuIGRvY3VtZW50JDFbZnVsbHNjcmVlbkVuYWJsZWQudmFsdWVdO1xuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3QgdGFyZ2V0JDEgPSB0YXJnZXRSZWYudmFsdWU7XG5cdFx0XHRpZiAoKHRhcmdldCQxID09PSBudWxsIHx8IHRhcmdldCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQkMVtmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZV0pICE9IG51bGwpIHJldHVybiBCb29sZWFuKHRhcmdldCQxW2Z1bGxzY3JlZW5FbmFibGVkLnZhbHVlXSk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0YXN5bmMgZnVuY3Rpb24gZXhpdCgpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8ICFpc0Z1bGxzY3JlZW4udmFsdWUpIHJldHVybjtcblx0XHRpZiAoZXhpdE1ldGhvZC52YWx1ZSkgaWYgKChkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDFbZXhpdE1ldGhvZC52YWx1ZV0pICE9IG51bGwpIGF3YWl0IGRvY3VtZW50JDFbZXhpdE1ldGhvZC52YWx1ZV0oKTtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHRhcmdldCQxID0gdGFyZ2V0UmVmLnZhbHVlO1xuXHRcdFx0aWYgKCh0YXJnZXQkMSA9PT0gbnVsbCB8fCB0YXJnZXQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0JDFbZXhpdE1ldGhvZC52YWx1ZV0pICE9IG51bGwpIGF3YWl0IHRhcmdldCQxW2V4aXRNZXRob2QudmFsdWVdKCk7XG5cdFx0fVxuXHRcdGlzRnVsbHNjcmVlbi52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGVudGVyKCkge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUgfHwgaXNGdWxsc2NyZWVuLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKGlzRWxlbWVudEZ1bGxTY3JlZW4oKSkgYXdhaXQgZXhpdCgpO1xuXHRcdGNvbnN0IHRhcmdldCQxID0gdGFyZ2V0UmVmLnZhbHVlO1xuXHRcdGlmIChyZXF1ZXN0TWV0aG9kLnZhbHVlICYmICh0YXJnZXQkMSA9PT0gbnVsbCB8fCB0YXJnZXQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0JDFbcmVxdWVzdE1ldGhvZC52YWx1ZV0pICE9IG51bGwpIHtcblx0XHRcdGF3YWl0IHRhcmdldCQxW3JlcXVlc3RNZXRob2QudmFsdWVdKCk7XG5cdFx0XHRpc0Z1bGxzY3JlZW4udmFsdWUgPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRhc3luYyBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdFx0YXdhaXQgKGlzRnVsbHNjcmVlbi52YWx1ZSA/IGV4aXQoKSA6IGVudGVyKCkpO1xuXHR9XG5cdGNvbnN0IGhhbmRsZXJDYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWUgPSBpc0VsZW1lbnRGdWxsU2NyZWVuKCk7XG5cdFx0aWYgKCFpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWUgfHwgaXNFbGVtZW50RnVsbFNjcmVlblZhbHVlICYmIGlzQ3VycmVudEVsZW1lbnRGdWxsU2NyZWVuKCkpIGlzRnVsbHNjcmVlbi52YWx1ZSA9IGlzRWxlbWVudEZ1bGxTY3JlZW5WYWx1ZTtcblx0fTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdGNhcHR1cmU6IGZhbHNlLFxuXHRcdHBhc3NpdmU6IHRydWVcblx0fTtcblx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBldmVudEhhbmRsZXJzLCBoYW5kbGVyQ2FsbGJhY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldFJlZiksIGV2ZW50SGFuZGxlcnMsIGhhbmRsZXJDYWxsYmFjaywgbGlzdGVuZXJPcHRpb25zKTtcblx0dHJ5T25Nb3VudGVkKGhhbmRsZXJDYWxsYmFjaywgZmFsc2UpO1xuXHRpZiAoYXV0b0V4aXQpIHRyeU9uU2NvcGVEaXNwb3NlKGV4aXQpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzRnVsbHNjcmVlbixcblx0XHRlbnRlcixcblx0XHRleGl0LFxuXHRcdHRvZ2dsZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VHYW1lcGFkL2luZGV4LnRzXG4vKipcbiogTWFwcyBhIHN0YW5kYXJkIHN0YW5kYXJkIGdhbWVwYWQgdG8gYW4gWGJveCAzNjAgQ29udHJvbGxlci5cbiovXG5mdW5jdGlvbiBtYXBHYW1lcGFkVG9YYm94MzYwQ29udHJvbGxlcihnYW1lcGFkKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGdhbWVwYWQudmFsdWUpIHJldHVybiB7XG5cdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdGE6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1swXSxcblx0XHRcdFx0YjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzFdLFxuXHRcdFx0XHR4OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMl0sXG5cdFx0XHRcdHk6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1szXVxuXHRcdFx0fSxcblx0XHRcdGJ1bXBlcjoge1xuXHRcdFx0XHRsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNF0sXG5cdFx0XHRcdHJpZ2h0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNV1cblx0XHRcdH0sXG5cdFx0XHR0cmlnZ2Vyczoge1xuXHRcdFx0XHRsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNl0sXG5cdFx0XHRcdHJpZ2h0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbN11cblx0XHRcdH0sXG5cdFx0XHRzdGljazoge1xuXHRcdFx0XHRsZWZ0OiB7XG5cdFx0XHRcdFx0aG9yaXpvbnRhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzBdLFxuXHRcdFx0XHRcdHZlcnRpY2FsOiBnYW1lcGFkLnZhbHVlLmF4ZXNbMV0sXG5cdFx0XHRcdFx0YnV0dG9uOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTBdXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJpZ2h0OiB7XG5cdFx0XHRcdFx0aG9yaXpvbnRhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzJdLFxuXHRcdFx0XHRcdHZlcnRpY2FsOiBnYW1lcGFkLnZhbHVlLmF4ZXNbM10sXG5cdFx0XHRcdFx0YnV0dG9uOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTFdXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkcGFkOiB7XG5cdFx0XHRcdHVwOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTJdLFxuXHRcdFx0XHRkb3duOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTNdLFxuXHRcdFx0XHRsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTRdLFxuXHRcdFx0XHRyaWdodDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzE1XVxuXHRcdFx0fSxcblx0XHRcdGJhY2s6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1s4XSxcblx0XHRcdHN0YXJ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbOV1cblx0XHR9O1xuXHRcdHJldHVybiBudWxsO1xuXHR9KTtcbn1cbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VHYW1lcGFkKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJnZXRHYW1lcGFkc1wiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgZ2FtZXBhZHMgPSByZWYoW10pO1xuXHRjb25zdCBvbkNvbm5lY3RlZEhvb2sgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3Qgb25EaXNjb25uZWN0ZWRIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHN0YXRlRnJvbUdhbWVwYWQgPSAoZ2FtZXBhZCkgPT4ge1xuXHRcdGNvbnN0IGhhcHRpY0FjdHVhdG9ycyA9IFtdO1xuXHRcdGNvbnN0IHZpYnJhdGlvbkFjdHVhdG9yID0gXCJ2aWJyYXRpb25BY3R1YXRvclwiIGluIGdhbWVwYWQgPyBnYW1lcGFkLnZpYnJhdGlvbkFjdHVhdG9yIDogbnVsbDtcblx0XHRpZiAodmlicmF0aW9uQWN0dWF0b3IpIGhhcHRpY0FjdHVhdG9ycy5wdXNoKHZpYnJhdGlvbkFjdHVhdG9yKTtcblx0XHRpZiAoZ2FtZXBhZC5oYXB0aWNBY3R1YXRvcnMpIGhhcHRpY0FjdHVhdG9ycy5wdXNoKC4uLmdhbWVwYWQuaGFwdGljQWN0dWF0b3JzKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWQ6IGdhbWVwYWQuaWQsXG5cdFx0XHRpbmRleDogZ2FtZXBhZC5pbmRleCxcblx0XHRcdGNvbm5lY3RlZDogZ2FtZXBhZC5jb25uZWN0ZWQsXG5cdFx0XHRtYXBwaW5nOiBnYW1lcGFkLm1hcHBpbmcsXG5cdFx0XHR0aW1lc3RhbXA6IGdhbWVwYWQudGltZXN0YW1wLFxuXHRcdFx0dmlicmF0aW9uQWN0dWF0b3I6IGdhbWVwYWQudmlicmF0aW9uQWN0dWF0b3IsXG5cdFx0XHRoYXB0aWNBY3R1YXRvcnMsXG5cdFx0XHRheGVzOiBnYW1lcGFkLmF4ZXMubWFwKChheGVzKSA9PiBheGVzKSxcblx0XHRcdGJ1dHRvbnM6IGdhbWVwYWQuYnV0dG9ucy5tYXAoKGJ1dHRvbikgPT4gKHtcblx0XHRcdFx0cHJlc3NlZDogYnV0dG9uLnByZXNzZWQsXG5cdFx0XHRcdHRvdWNoZWQ6IGJ1dHRvbi50b3VjaGVkLFxuXHRcdFx0XHR2YWx1ZTogYnV0dG9uLnZhbHVlXG5cdFx0XHR9KSlcblx0XHR9O1xuXHR9O1xuXHRjb25zdCB1cGRhdGVHYW1lcGFkU3RhdGUgPSAoKSA9PiB7XG5cdFx0Y29uc3QgX2dhbWVwYWRzID0gKG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IkMS5nZXRHYW1lcGFkcygpKSB8fCBbXTtcblx0XHRmb3IgKGNvbnN0IGdhbWVwYWQgb2YgX2dhbWVwYWRzKSBpZiAoZ2FtZXBhZCAmJiBnYW1lcGFkcy52YWx1ZVtnYW1lcGFkLmluZGV4XSkgZ2FtZXBhZHMudmFsdWVbZ2FtZXBhZC5pbmRleF0gPSBzdGF0ZUZyb21HYW1lcGFkKGdhbWVwYWQpO1xuXHR9O1xuXHRjb25zdCB7IGlzQWN0aXZlLCBwYXVzZSwgcmVzdW1lIH0gPSB1c2VSYWZGbih1cGRhdGVHYW1lcGFkU3RhdGUpO1xuXHRjb25zdCBvbkdhbWVwYWRDb25uZWN0ZWQgPSAoZ2FtZXBhZCkgPT4ge1xuXHRcdGlmICghZ2FtZXBhZHMudmFsdWUuc29tZSgoeyBpbmRleCB9KSA9PiBpbmRleCA9PT0gZ2FtZXBhZC5pbmRleCkpIHtcblx0XHRcdGdhbWVwYWRzLnZhbHVlLnB1c2goc3RhdGVGcm9tR2FtZXBhZChnYW1lcGFkKSk7XG5cdFx0XHRvbkNvbm5lY3RlZEhvb2sudHJpZ2dlcihnYW1lcGFkLmluZGV4KTtcblx0XHR9XG5cdFx0cmVzdW1lKCk7XG5cdH07XG5cdGNvbnN0IG9uR2FtZXBhZERpc2Nvbm5lY3RlZCA9IChnYW1lcGFkKSA9PiB7XG5cdFx0Z2FtZXBhZHMudmFsdWUgPSBnYW1lcGFkcy52YWx1ZS5maWx0ZXIoKHgpID0+IHguaW5kZXggIT09IGdhbWVwYWQuaW5kZXgpO1xuXHRcdG9uRGlzY29ubmVjdGVkSG9vay50cmlnZ2VyKGdhbWVwYWQuaW5kZXgpO1xuXHR9O1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0dXNlRXZlbnRMaXN0ZW5lcihcImdhbWVwYWRjb25uZWN0ZWRcIiwgKGUpID0+IG9uR2FtZXBhZENvbm5lY3RlZChlLmdhbWVwYWQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKFwiZ2FtZXBhZGRpc2Nvbm5lY3RlZFwiLCAoZSkgPT4gb25HYW1lcGFkRGlzY29ubmVjdGVkKGUuZ2FtZXBhZCksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgX2dhbWVwYWRzID0gKG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IkMS5nZXRHYW1lcGFkcygpKSB8fCBbXTtcblx0XHRmb3IgKGNvbnN0IGdhbWVwYWQgb2YgX2dhbWVwYWRzKSBpZiAoZ2FtZXBhZCAmJiBnYW1lcGFkcy52YWx1ZVtnYW1lcGFkLmluZGV4XSkgb25HYW1lcGFkQ29ubmVjdGVkKGdhbWVwYWQpO1xuXHR9KTtcblx0cGF1c2UoKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRvbkNvbm5lY3RlZDogb25Db25uZWN0ZWRIb29rLm9uLFxuXHRcdG9uRGlzY29ubmVjdGVkOiBvbkRpc2Nvbm5lY3RlZEhvb2sub24sXG5cdFx0Z2FtZXBhZHMsXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGlzQWN0aXZlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUdlb2xvY2F0aW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgR2VvbG9jYXRpb24gQVBJLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VHZW9sb2NhdGlvblxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUdlb2xvY2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGVuYWJsZUhpZ2hBY2N1cmFjeSA9IHRydWUsIG1heGltdW1BZ2UgPSAzZTQsIHRpbWVvdXQgPSAyN2UzLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiZ2VvbG9jYXRpb25cIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IGxvY2F0ZWRBdCA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgY29vcmRzID0gcmVmKHtcblx0XHRhY2N1cmFjeTogMCxcblx0XHRsYXRpdHVkZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRcdGxvbmdpdHVkZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRcdGFsdGl0dWRlOiBudWxsLFxuXHRcdGFsdGl0dWRlQWNjdXJhY3k6IG51bGwsXG5cdFx0aGVhZGluZzogbnVsbCxcblx0XHRzcGVlZDogbnVsbFxuXHR9KTtcblx0ZnVuY3Rpb24gdXBkYXRlUG9zaXRpb24ocG9zaXRpb24pIHtcblx0XHRsb2NhdGVkQXQudmFsdWUgPSBwb3NpdGlvbi50aW1lc3RhbXA7XG5cdFx0Y29vcmRzLnZhbHVlID0gcG9zaXRpb24uY29vcmRzO1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0fVxuXHRsZXQgd2F0Y2hlcjtcblx0ZnVuY3Rpb24gcmVzdW1lKCkge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgd2F0Y2hlciA9IG5hdmlnYXRvciQxLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24odXBkYXRlUG9zaXRpb24sIChlcnIpID0+IGVycm9yLnZhbHVlID0gZXJyLCB7XG5cdFx0XHRlbmFibGVIaWdoQWNjdXJhY3ksXG5cdFx0XHRtYXhpbXVtQWdlLFxuXHRcdFx0dGltZW91dFxuXHRcdH0pO1xuXHR9XG5cdGlmIChpbW1lZGlhdGUpIHJlc3VtZSgpO1xuXHRmdW5jdGlvbiBwYXVzZSgpIHtcblx0XHRpZiAod2F0Y2hlciAmJiBuYXZpZ2F0b3IkMSkgbmF2aWdhdG9yJDEuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh3YXRjaGVyKTtcblx0fVxuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0cGF1c2UoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y29vcmRzLFxuXHRcdGxvY2F0ZWRBdCxcblx0XHRlcnJvcixcblx0XHRyZXN1bWUsXG5cdFx0cGF1c2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlSWRsZS9pbmRleC50c1xuY29uc3QgZGVmYXVsdEV2ZW50cyQxID0gW1xuXHRcIm1vdXNlbW92ZVwiLFxuXHRcIm1vdXNlZG93blwiLFxuXHRcInJlc2l6ZVwiLFxuXHRcImtleWRvd25cIixcblx0XCJ0b3VjaHN0YXJ0XCIsXG5cdFwid2hlZWxcIlxuXTtcbmNvbnN0IG9uZU1pbnV0ZSA9IDZlNDtcbi8qKlxuKiBUcmFja3Mgd2hldGhlciB0aGUgdXNlciBpcyBiZWluZyBpbmFjdGl2ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSWRsZVxuKiBAcGFyYW0gdGltZW91dCBkZWZhdWx0IHRvIDEgbWludXRlXG4qIEBwYXJhbSBvcHRpb25zIElkbGVPcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlSWRsZSh0aW1lb3V0ID0gb25lTWludXRlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbml0aWFsU3RhdGUgPSBmYWxzZSwgbGlzdGVuRm9yVmlzaWJpbGl0eUNoYW5nZSA9IHRydWUsIGV2ZW50czogZXZlbnRzJDEgPSBkZWZhdWx0RXZlbnRzJDEsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBldmVudEZpbHRlciA9IHRocm90dGxlRmlsdGVyKDUwKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaWRsZSA9IHNoYWxsb3dSZWYoaW5pdGlhbFN0YXRlKTtcblx0Y29uc3QgbGFzdEFjdGl2ZSA9IHNoYWxsb3dSZWYodGltZXN0YW1wKCkpO1xuXHRjb25zdCBpc1BlbmRpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHRpbWVyO1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHRpZGxlLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHR0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gaWRsZS52YWx1ZSA9IHRydWUsIHRpbWVvdXQpO1xuXHR9O1xuXHRjb25zdCBvbkV2ZW50ID0gY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgKCkgPT4ge1xuXHRcdGxhc3RBY3RpdmUudmFsdWUgPSB0aW1lc3RhbXAoKTtcblx0XHRyZXNldCgpO1xuXHR9KTtcblx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0Y29uc3QgZG9jdW1lbnQkMSA9IHdpbmRvdyQxLmRvY3VtZW50O1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzJDEpIHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIGV2ZW50LCAoKSA9PiB7XG5cdFx0XHRpZiAoIWlzUGVuZGluZy52YWx1ZSkgcmV0dXJuO1xuXHRcdFx0b25FdmVudCgpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0aWYgKGxpc3RlbkZvclZpc2liaWxpdHlDaGFuZ2UpIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsICgpID0+IHtcblx0XHRcdGlmIChkb2N1bWVudCQxLmhpZGRlbiB8fCAhaXNQZW5kaW5nLnZhbHVlKSByZXR1cm47XG5cdFx0XHRvbkV2ZW50KCk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHRzdGFydCgpO1xuXHR9XG5cdGZ1bmN0aW9uIHN0YXJ0KCkge1xuXHRcdGlmIChpc1BlbmRpbmcudmFsdWUpIHJldHVybjtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlmICghaW5pdGlhbFN0YXRlKSByZXNldCgpO1xuXHR9XG5cdGZ1bmN0aW9uIHN0b3AoKSB7XG5cdFx0aWRsZS52YWx1ZSA9IGluaXRpYWxTdGF0ZTtcblx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdGlzUGVuZGluZy52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0aWRsZSxcblx0XHRsYXN0QWN0aXZlLFxuXHRcdHJlc2V0LFxuXHRcdHN0b3AsXG5cdFx0c3RhcnQsXG5cdFx0aXNQZW5kaW5nOiBzaGFsbG93UmVhZG9ubHkoaXNQZW5kaW5nKVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VJbWFnZS9pbmRleC50c1xuYXN5bmMgZnVuY3Rpb24gbG9hZEltYWdlKG9wdGlvbnMpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcblx0XHRjb25zdCB7IHNyYywgc3Jjc2V0LCBzaXplcywgY2xhc3M6IGNsYXp6LCBsb2FkaW5nLCBjcm9zc29yaWdpbiwgcmVmZXJyZXJQb2xpY3ksIHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nLCBmZXRjaFByaW9yaXR5LCBpc21hcCwgdXNlbWFwIH0gPSBvcHRpb25zO1xuXHRcdGltZy5zcmMgPSBzcmM7XG5cdFx0aWYgKHNyY3NldCAhPSBudWxsKSBpbWcuc3Jjc2V0ID0gc3Jjc2V0O1xuXHRcdGlmIChzaXplcyAhPSBudWxsKSBpbWcuc2l6ZXMgPSBzaXplcztcblx0XHRpZiAoY2xhenogIT0gbnVsbCkgaW1nLmNsYXNzTmFtZSA9IGNsYXp6O1xuXHRcdGlmIChsb2FkaW5nICE9IG51bGwpIGltZy5sb2FkaW5nID0gbG9hZGluZztcblx0XHRpZiAoY3Jvc3NvcmlnaW4gIT0gbnVsbCkgaW1nLmNyb3NzT3JpZ2luID0gY3Jvc3NvcmlnaW47XG5cdFx0aWYgKHJlZmVycmVyUG9saWN5ICE9IG51bGwpIGltZy5yZWZlcnJlclBvbGljeSA9IHJlZmVycmVyUG9saWN5O1xuXHRcdGlmICh3aWR0aCAhPSBudWxsKSBpbWcud2lkdGggPSB3aWR0aDtcblx0XHRpZiAoaGVpZ2h0ICE9IG51bGwpIGltZy5oZWlnaHQgPSBoZWlnaHQ7XG5cdFx0aWYgKGRlY29kaW5nICE9IG51bGwpIGltZy5kZWNvZGluZyA9IGRlY29kaW5nO1xuXHRcdGlmIChmZXRjaFByaW9yaXR5ICE9IG51bGwpIGltZy5mZXRjaFByaW9yaXR5ID0gZmV0Y2hQcmlvcml0eTtcblx0XHRpZiAoaXNtYXAgIT0gbnVsbCkgaW1nLmlzTWFwID0gaXNtYXA7XG5cdFx0aWYgKHVzZW1hcCAhPSBudWxsKSBpbWcudXNlTWFwID0gdXNlbWFwO1xuXHRcdGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltZyk7XG5cdFx0aW1nLm9uZXJyb3IgPSByZWplY3Q7XG5cdH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIGxvYWQgYW4gaW1hZ2UgaW4gdGhlIGJyb3dzZXIsIHlvdSBjYW4gd2FpdCB0aGUgcmVzdWx0IHRvIGRpc3BsYXkgaXQgb3Igc2hvdyBhIGZhbGxiYWNrLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VJbWFnZVxuKiBAcGFyYW0gb3B0aW9ucyBJbWFnZSBhdHRyaWJ1dGVzLCBhcyB1c2VkIGluIHRoZSA8aW1nPiB0YWdcbiogQHBhcmFtIGFzeW5jU3RhdGVPcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlSW1hZ2Uob3B0aW9ucywgYXN5bmNTdGF0ZU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBzdGF0ZSA9IHVzZUFzeW5jU3RhdGUoKCkgPT4gbG9hZEltYWdlKHRvVmFsdWUob3B0aW9ucykpLCB2b2lkIDAsIHtcblx0XHRyZXNldE9uRXhlY3V0ZTogdHJ1ZSxcblx0XHQuLi5hc3luY1N0YXRlT3B0aW9uc1xuXHR9KTtcblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShvcHRpb25zKSwgKCkgPT4gc3RhdGUuZXhlY3V0ZShhc3luY1N0YXRlT3B0aW9ucy5kZWxheSksIHsgZGVlcDogdHJ1ZSB9KTtcblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBfcmVzb2x2ZS1lbGVtZW50LnRzXG4vKipcbiogUmVzb2x2ZXMgYW4gZWxlbWVudCBmcm9tIGEgZ2l2ZW4gZWxlbWVudCwgd2luZG93LCBvciBkb2N1bWVudC5cbipcbiogQGludGVybmFsXG4qL1xuZnVuY3Rpb24gcmVzb2x2ZUVsZW1lbnQoZWwpIHtcblx0aWYgKHR5cGVvZiBXaW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgZWwgaW5zdGFuY2VvZiBXaW5kb3cpIHJldHVybiBlbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdGlmICh0eXBlb2YgRG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgZWwgaW5zdGFuY2VvZiBEb2N1bWVudCkgcmV0dXJuIGVsLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGVsO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTY3JvbGwvaW5kZXgudHNcbi8qKlxuKiBXZSBoYXZlIHRvIGNoZWNrIGlmIHRoZSBzY3JvbGwgYW1vdW50IGlzIGNsb3NlIGVub3VnaCB0byBzb21lIHRocmVzaG9sZCBpbiBvcmRlciB0b1xuKiBtb3JlIGFjY3VyYXRlbHkgY2FsY3VsYXRlIGFycml2ZWRTdGF0ZS4gVGhpcyBpcyBiZWNhdXNlIHNjcm9sbFRvcC9zY3JvbGxMZWZ0IGFyZSBub24tcm91bmRlZFxuKiBudW1iZXJzLCB3aGlsZSBzY3JvbGxIZWlnaHQvc2Nyb2xsV2lkdGggYW5kIGNsaWVudEhlaWdodC9jbGllbnRXaWR0aCBhcmUgcm91bmRlZC5cbiogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvc2Nyb2xsSGVpZ2h0I2RldGVybWluZV9pZl9hbl9lbGVtZW50X2hhc19iZWVuX3RvdGFsbHlfc2Nyb2xsZWRcbiovXG5jb25zdCBBUlJJVkVEX1NUQVRFX1RIUkVTSE9MRF9QSVhFTFMgPSAxO1xuLyoqXG4qIFJlYWN0aXZlIHNjcm9sbC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2Nyb2xsXG4qIEBwYXJhbSBlbGVtZW50XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU2Nyb2xsKGVsZW1lbnQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocm90dGxlID0gMCwgaWRsZSA9IDIwMCwgb25TdG9wID0gbm9vcCwgb25TY3JvbGwgPSBub29wLCBvZmZzZXQgPSB7XG5cdFx0bGVmdDogMCxcblx0XHRyaWdodDogMCxcblx0XHR0b3A6IDAsXG5cdFx0Ym90dG9tOiAwXG5cdH0sIG9ic2VydmU6IF9vYnNlcnZlID0geyBtdXRhdGlvbjogZmFsc2UgfSwgZXZlbnRMaXN0ZW5lck9wdGlvbnMgPSB7XG5cdFx0Y2FwdHVyZTogZmFsc2UsXG5cdFx0cGFzc2l2ZTogdHJ1ZVxuXHR9LCBiZWhhdmlvciA9IFwiYXV0b1wiLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgb25FcnJvciA9IChlKSA9PiB7XG5cdFx0Y29uc29sZS5lcnJvcihlKTtcblx0fSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgb2JzZXJ2ZSA9IHR5cGVvZiBfb2JzZXJ2ZSA9PT0gXCJib29sZWFuXCIgPyB7IG11dGF0aW9uOiBfb2JzZXJ2ZSB9IDogX29ic2VydmU7XG5cdGNvbnN0IGludGVybmFsWCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGludGVybmFsWSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHggPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGludGVybmFsWC52YWx1ZTtcblx0XHR9LFxuXHRcdHNldCh4JDEpIHtcblx0XHRcdHNjcm9sbFRvKHgkMSwgdm9pZCAwKTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCB5ID0gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpbnRlcm5hbFkudmFsdWU7XG5cdFx0fSxcblx0XHRzZXQoeSQxKSB7XG5cdFx0XHRzY3JvbGxUbyh2b2lkIDAsIHkkMSk7XG5cdFx0fVxuXHR9KTtcblx0ZnVuY3Rpb24gc2Nyb2xsVG8oX3gsIF95KSB7XG5cdFx0dmFyIF9yZWYsIF90b1ZhbHVlLCBfdG9WYWx1ZTIsIF9kb2N1bWVudDtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0Y29uc3QgX2VsZW1lbnQgPSB0b1ZhbHVlKGVsZW1lbnQpO1xuXHRcdGlmICghX2VsZW1lbnQpIHJldHVybjtcblx0XHQoX3JlZiA9IF9lbGVtZW50IGluc3RhbmNlb2YgRG9jdW1lbnQgPyB3aW5kb3ckMS5kb2N1bWVudC5ib2R5IDogX2VsZW1lbnQpID09PSBudWxsIHx8IF9yZWYgPT09IHZvaWQgMCB8fCBfcmVmLnNjcm9sbFRvKHtcblx0XHRcdHRvcDogKF90b1ZhbHVlID0gdG9WYWx1ZShfeSkpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHkudmFsdWUsXG5cdFx0XHRsZWZ0OiAoX3RvVmFsdWUyID0gdG9WYWx1ZShfeCkpICE9PSBudWxsICYmIF90b1ZhbHVlMiAhPT0gdm9pZCAwID8gX3RvVmFsdWUyIDogeC52YWx1ZSxcblx0XHRcdGJlaGF2aW9yOiB0b1ZhbHVlKGJlaGF2aW9yKVxuXHRcdH0pO1xuXHRcdGNvbnN0IHNjcm9sbENvbnRhaW5lciA9IChfZWxlbWVudCA9PT0gbnVsbCB8fCBfZWxlbWVudCA9PT0gdm9pZCAwIHx8IChfZG9jdW1lbnQgPSBfZWxlbWVudC5kb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB8fCAoX2VsZW1lbnQgPT09IG51bGwgfHwgX2VsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lbGVtZW50LmRvY3VtZW50RWxlbWVudCkgfHwgX2VsZW1lbnQ7XG5cdFx0aWYgKHggIT0gbnVsbCkgaW50ZXJuYWxYLnZhbHVlID0gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbExlZnQ7XG5cdFx0aWYgKHkgIT0gbnVsbCkgaW50ZXJuYWxZLnZhbHVlID0gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcDtcblx0fVxuXHRjb25zdCBpc1Njcm9sbGluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBhcnJpdmVkU3RhdGUgPSByZWFjdGl2ZSh7XG5cdFx0bGVmdDogdHJ1ZSxcblx0XHRyaWdodDogZmFsc2UsXG5cdFx0dG9wOiB0cnVlLFxuXHRcdGJvdHRvbTogZmFsc2Vcblx0fSk7XG5cdGNvbnN0IGRpcmVjdGlvbnMgPSByZWFjdGl2ZSh7XG5cdFx0bGVmdDogZmFsc2UsXG5cdFx0cmlnaHQ6IGZhbHNlLFxuXHRcdHRvcDogZmFsc2UsXG5cdFx0Ym90dG9tOiBmYWxzZVxuXHR9KTtcblx0Y29uc3Qgb25TY3JvbGxFbmQgPSAoZSkgPT4ge1xuXHRcdGlmICghaXNTY3JvbGxpbmcudmFsdWUpIHJldHVybjtcblx0XHRpc1Njcm9sbGluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdGRpcmVjdGlvbnMubGVmdCA9IGZhbHNlO1xuXHRcdGRpcmVjdGlvbnMucmlnaHQgPSBmYWxzZTtcblx0XHRkaXJlY3Rpb25zLnRvcCA9IGZhbHNlO1xuXHRcdGRpcmVjdGlvbnMuYm90dG9tID0gZmFsc2U7XG5cdFx0b25TdG9wKGUpO1xuXHR9O1xuXHRjb25zdCBvblNjcm9sbEVuZERlYm91bmNlZCA9IHVzZURlYm91bmNlRm4ob25TY3JvbGxFbmQsIHRocm90dGxlICsgaWRsZSk7XG5cdGNvbnN0IHNldEFycml2ZWRTdGF0ZSA9ICh0YXJnZXQpID0+IHtcblx0XHR2YXIgX2RvY3VtZW50Mjtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0Y29uc3QgZWwgPSAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwIHx8IChfZG9jdW1lbnQyID0gdGFyZ2V0LmRvY3VtZW50KSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZG9jdW1lbnQyLmRvY3VtZW50RWxlbWVudCkgfHwgKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldC5kb2N1bWVudEVsZW1lbnQpIHx8IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdGNvbnN0IHsgZGlzcGxheSwgZmxleERpcmVjdGlvbiwgZGlyZWN0aW9uIH0gPSB3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKGVsKTtcblx0XHRjb25zdCBkaXJlY3Rpb25NdWx0aXBsZXIgPSBkaXJlY3Rpb24gPT09IFwicnRsXCIgPyAtMSA6IDE7XG5cdFx0Y29uc3Qgc2Nyb2xsTGVmdCA9IGVsLnNjcm9sbExlZnQ7XG5cdFx0ZGlyZWN0aW9ucy5sZWZ0ID0gc2Nyb2xsTGVmdCA8IGludGVybmFsWC52YWx1ZTtcblx0XHRkaXJlY3Rpb25zLnJpZ2h0ID0gc2Nyb2xsTGVmdCA+IGludGVybmFsWC52YWx1ZTtcblx0XHRjb25zdCBsZWZ0ID0gTWF0aC5hYnMoc2Nyb2xsTGVmdCAqIGRpcmVjdGlvbk11bHRpcGxlcikgPD0gKG9mZnNldC5sZWZ0IHx8IDApO1xuXHRcdGNvbnN0IHJpZ2h0ID0gTWF0aC5hYnMoc2Nyb2xsTGVmdCAqIGRpcmVjdGlvbk11bHRpcGxlcikgKyBlbC5jbGllbnRXaWR0aCA+PSBlbC5zY3JvbGxXaWR0aCAtIChvZmZzZXQucmlnaHQgfHwgMCkgLSBBUlJJVkVEX1NUQVRFX1RIUkVTSE9MRF9QSVhFTFM7XG5cdFx0aWYgKGRpc3BsYXkgPT09IFwiZmxleFwiICYmIGZsZXhEaXJlY3Rpb24gPT09IFwicm93LXJldmVyc2VcIikge1xuXHRcdFx0YXJyaXZlZFN0YXRlLmxlZnQgPSByaWdodDtcblx0XHRcdGFycml2ZWRTdGF0ZS5yaWdodCA9IGxlZnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFycml2ZWRTdGF0ZS5sZWZ0ID0gbGVmdDtcblx0XHRcdGFycml2ZWRTdGF0ZS5yaWdodCA9IHJpZ2h0O1xuXHRcdH1cblx0XHRpbnRlcm5hbFgudmFsdWUgPSBzY3JvbGxMZWZ0O1xuXHRcdGxldCBzY3JvbGxUb3AgPSBlbC5zY3JvbGxUb3A7XG5cdFx0aWYgKHRhcmdldCA9PT0gd2luZG93JDEuZG9jdW1lbnQgJiYgIXNjcm9sbFRvcCkgc2Nyb2xsVG9wID0gd2luZG93JDEuZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG5cdFx0ZGlyZWN0aW9ucy50b3AgPSBzY3JvbGxUb3AgPCBpbnRlcm5hbFkudmFsdWU7XG5cdFx0ZGlyZWN0aW9ucy5ib3R0b20gPSBzY3JvbGxUb3AgPiBpbnRlcm5hbFkudmFsdWU7XG5cdFx0Y29uc3QgdG9wID0gTWF0aC5hYnMoc2Nyb2xsVG9wKSA8PSAob2Zmc2V0LnRvcCB8fCAwKTtcblx0XHRjb25zdCBib3R0b20gPSBNYXRoLmFicyhzY3JvbGxUb3ApICsgZWwuY2xpZW50SGVpZ2h0ID49IGVsLnNjcm9sbEhlaWdodCAtIChvZmZzZXQuYm90dG9tIHx8IDApIC0gQVJSSVZFRF9TVEFURV9USFJFU0hPTERfUElYRUxTO1xuXHRcdC8qKlxuXHRcdCogcmV2ZXJzZSBjb2x1bW5zIGFuZCByb3dzIGJlaGF2ZSBleGFjdGx5IHRoZSBvdGhlciB3YXkgYXJvdW5kLFxuXHRcdCogYm90dG9tIGlzIHRyZWF0ZWQgYXMgdG9wIGFuZCB0b3AgaXMgdHJlYXRlZCBhcyB0aGUgbmVnYXRpdmUgdmVyc2lvbiBvZiBib3R0b21cblx0XHQqL1xuXHRcdGlmIChkaXNwbGF5ID09PSBcImZsZXhcIiAmJiBmbGV4RGlyZWN0aW9uID09PSBcImNvbHVtbi1yZXZlcnNlXCIpIHtcblx0XHRcdGFycml2ZWRTdGF0ZS50b3AgPSBib3R0b207XG5cdFx0XHRhcnJpdmVkU3RhdGUuYm90dG9tID0gdG9wO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhcnJpdmVkU3RhdGUudG9wID0gdG9wO1xuXHRcdFx0YXJyaXZlZFN0YXRlLmJvdHRvbSA9IGJvdHRvbTtcblx0XHR9XG5cdFx0aW50ZXJuYWxZLnZhbHVlID0gc2Nyb2xsVG9wO1xuXHR9O1xuXHRjb25zdCBvblNjcm9sbEhhbmRsZXIgPSAoZSkgPT4ge1xuXHRcdHZhciBfZG9jdW1lbnRFbGVtZW50O1xuXHRcdGlmICghd2luZG93JDEpIHJldHVybjtcblx0XHRzZXRBcnJpdmVkU3RhdGUoKF9kb2N1bWVudEVsZW1lbnQgPSBlLnRhcmdldC5kb2N1bWVudEVsZW1lbnQpICE9PSBudWxsICYmIF9kb2N1bWVudEVsZW1lbnQgIT09IHZvaWQgMCA/IF9kb2N1bWVudEVsZW1lbnQgOiBlLnRhcmdldCk7XG5cdFx0aXNTY3JvbGxpbmcudmFsdWUgPSB0cnVlO1xuXHRcdG9uU2Nyb2xsRW5kRGVib3VuY2VkKGUpO1xuXHRcdG9uU2Nyb2xsKGUpO1xuXHR9O1xuXHR1c2VFdmVudExpc3RlbmVyKGVsZW1lbnQsIFwic2Nyb2xsXCIsIHRocm90dGxlID8gdXNlVGhyb3R0bGVGbihvblNjcm9sbEhhbmRsZXIsIHRocm90dGxlLCB0cnVlLCBmYWxzZSkgOiBvblNjcm9sbEhhbmRsZXIsIGV2ZW50TGlzdGVuZXJPcHRpb25zKTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgX2VsZW1lbnQgPSB0b1ZhbHVlKGVsZW1lbnQpO1xuXHRcdFx0aWYgKCFfZWxlbWVudCkgcmV0dXJuO1xuXHRcdFx0c2V0QXJyaXZlZFN0YXRlKF9lbGVtZW50KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fSk7XG5cdGlmICgob2JzZXJ2ZSA9PT0gbnVsbCB8fCBvYnNlcnZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvYnNlcnZlLm11dGF0aW9uKSAmJiBlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCAhPT0gd2luZG93JDEgJiYgZWxlbWVudCAhPT0gZG9jdW1lbnQpIHVzZU11dGF0aW9uT2JzZXJ2ZXIoZWxlbWVudCwgKCkgPT4ge1xuXHRcdGNvbnN0IF9lbGVtZW50ID0gdG9WYWx1ZShlbGVtZW50KTtcblx0XHRpZiAoIV9lbGVtZW50KSByZXR1cm47XG5cdFx0c2V0QXJyaXZlZFN0YXRlKF9lbGVtZW50KTtcblx0fSwge1xuXHRcdGF0dHJpYnV0ZXM6IHRydWUsXG5cdFx0Y2hpbGRMaXN0OiB0cnVlLFxuXHRcdHN1YnRyZWU6IHRydWVcblx0fSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgXCJzY3JvbGxlbmRcIiwgb25TY3JvbGxFbmQsIGV2ZW50TGlzdGVuZXJPcHRpb25zKTtcblx0cmV0dXJuIHtcblx0XHR4LFxuXHRcdHksXG5cdFx0aXNTY3JvbGxpbmcsXG5cdFx0YXJyaXZlZFN0YXRlLFxuXHRcdGRpcmVjdGlvbnMsXG5cdFx0bWVhc3VyZSgpIHtcblx0XHRcdGNvbnN0IF9lbGVtZW50ID0gdG9WYWx1ZShlbGVtZW50KTtcblx0XHRcdGlmICh3aW5kb3ckMSAmJiBfZWxlbWVudCkgc2V0QXJyaXZlZFN0YXRlKF9lbGVtZW50KTtcblx0XHR9XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUluZmluaXRlU2Nyb2xsL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgaW5maW5pdGUgc2Nyb2xsLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VJbmZpbml0ZVNjcm9sbFxuKi9cbmZ1bmN0aW9uIHVzZUluZmluaXRlU2Nyb2xsKGVsZW1lbnQsIG9uTG9hZE1vcmUsIG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkZGlzdGFuY2U7XG5cdGNvbnN0IHsgZGlyZWN0aW9uID0gXCJib3R0b21cIiwgaW50ZXJ2YWwgPSAxMDAsIGNhbkxvYWRNb3JlID0gKCkgPT4gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgc3RhdGUgPSByZWFjdGl2ZSh1c2VTY3JvbGwoZWxlbWVudCwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0b2Zmc2V0OiB7XG5cdFx0XHRbZGlyZWN0aW9uXTogKF9vcHRpb25zJGRpc3RhbmNlID0gb3B0aW9ucy5kaXN0YW5jZSkgIT09IG51bGwgJiYgX29wdGlvbnMkZGlzdGFuY2UgIT09IHZvaWQgMCA/IF9vcHRpb25zJGRpc3RhbmNlIDogMCxcblx0XHRcdC4uLm9wdGlvbnMub2Zmc2V0XG5cdFx0fVxuXHR9KSk7XG5cdGNvbnN0IHByb21pc2UgPSByZWYoKTtcblx0Y29uc3QgaXNMb2FkaW5nID0gY29tcHV0ZWQoKCkgPT4gISFwcm9taXNlLnZhbHVlKTtcblx0Y29uc3Qgb2JzZXJ2ZWRFbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsZW1lbnQpKTtcblx0fSk7XG5cdGNvbnN0IGlzRWxlbWVudFZpc2libGUgPSB1c2VFbGVtZW50VmlzaWJpbGl0eShvYnNlcnZlZEVsZW1lbnQpO1xuXHRjb25zdCBjYW5Mb2FkID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmICghb2JzZXJ2ZWRFbGVtZW50LnZhbHVlKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIGNhbkxvYWRNb3JlKG9ic2VydmVkRWxlbWVudC52YWx1ZSk7XG5cdH0pO1xuXHRmdW5jdGlvbiBjaGVja0FuZExvYWQoKSB7XG5cdFx0c3RhdGUubWVhc3VyZSgpO1xuXHRcdGlmICghb2JzZXJ2ZWRFbGVtZW50LnZhbHVlIHx8ICFpc0VsZW1lbnRWaXNpYmxlLnZhbHVlIHx8ICFjYW5Mb2FkLnZhbHVlIHx8IHByb21pc2UudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCB7IHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0LCBzY3JvbGxXaWR0aCwgY2xpZW50V2lkdGggfSA9IG9ic2VydmVkRWxlbWVudC52YWx1ZTtcblx0XHRjb25zdCBpc05hcnJvd2VyID0gZGlyZWN0aW9uID09PSBcImJvdHRvbVwiIHx8IGRpcmVjdGlvbiA9PT0gXCJ0b3BcIiA/IHNjcm9sbEhlaWdodCA8PSBjbGllbnRIZWlnaHQgOiBzY3JvbGxXaWR0aCA8PSBjbGllbnRXaWR0aDtcblx0XHRpZiAoc3RhdGUuYXJyaXZlZFN0YXRlW2RpcmVjdGlvbl0gfHwgaXNOYXJyb3dlcikgcHJvbWlzZS52YWx1ZSA9IFByb21pc2UuYWxsKFtvbkxvYWRNb3JlKHN0YXRlKSwgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgaW50ZXJ2YWwpKV0pLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0cHJvbWlzZS52YWx1ZSA9IG51bGw7XG5cdFx0XHRuZXh0VGljaygoKSA9PiBjaGVja0FuZExvYWQoKSk7XG5cdFx0fSk7XG5cdH1cblx0dHJ5T25Vbm1vdW50ZWQod2F0Y2goKCkgPT4gW1xuXHRcdHN0YXRlLmFycml2ZWRTdGF0ZVtkaXJlY3Rpb25dLFxuXHRcdGlzRWxlbWVudFZpc2libGUudmFsdWUsXG5cdFx0Y2FuTG9hZC52YWx1ZVxuXHRdLCBjaGVja0FuZExvYWQsIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pKTtcblx0cmV0dXJuIHtcblx0XHRpc0xvYWRpbmcsXG5cdFx0cmVzZXQoKSB7XG5cdFx0XHRuZXh0VGljaygoKSA9PiBjaGVja0FuZExvYWQoKSk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VLZXlNb2RpZmllci9pbmRleC50c1xuY29uc3QgZGVmYXVsdEV2ZW50cyA9IFtcblx0XCJtb3VzZWRvd25cIixcblx0XCJtb3VzZXVwXCIsXG5cdFwia2V5ZG93blwiLFxuXHRcImtleXVwXCJcbl07XG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlS2V5TW9kaWZpZXIobW9kaWZpZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50czogZXZlbnRzJDEgPSBkZWZhdWx0RXZlbnRzLCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgaW5pdGlhbCA9IG51bGwgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHN0YXRlID0gc2hhbGxvd1JlZihpbml0aWFsKTtcblx0aWYgKGRvY3VtZW50JDEpIGV2ZW50cyQxLmZvckVhY2goKGxpc3RlbmVyRXZlbnQpID0+IHtcblx0XHR1c2VFdmVudExpc3RlbmVyKGRvY3VtZW50JDEsIGxpc3RlbmVyRXZlbnQsIChldnQpID0+IHtcblx0XHRcdGlmICh0eXBlb2YgZXZ0LmdldE1vZGlmaWVyU3RhdGUgPT09IFwiZnVuY3Rpb25cIikgc3RhdGUudmFsdWUgPSBldnQuZ2V0TW9kaWZpZXJTdGF0ZShtb2RpZmllcik7XG5cdFx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR9KTtcblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VMb2NhbFN0b3JhZ2UvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBMb2NhbFN0b3JhZ2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUxvY2FsU3RvcmFnZVxuKiBAcGFyYW0ga2V5XG4qIEBwYXJhbSBpbml0aWFsVmFsdWVcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VMb2NhbFN0b3JhZ2Uoa2V5LCBpbml0aWFsVmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gdXNlU3RvcmFnZShrZXksIGluaXRpYWxWYWx1ZSwgd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmxvY2FsU3RvcmFnZSwgb3B0aW9ucyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1hZ2ljS2V5cy9hbGlhc01hcC50c1xuY29uc3QgRGVmYXVsdE1hZ2ljS2V5c0FsaWFzTWFwID0ge1xuXHRjdHJsOiBcImNvbnRyb2xcIixcblx0Y29tbWFuZDogXCJtZXRhXCIsXG5cdGNtZDogXCJtZXRhXCIsXG5cdG9wdGlvbjogXCJhbHRcIixcblx0dXA6IFwiYXJyb3d1cFwiLFxuXHRkb3duOiBcImFycm93ZG93blwiLFxuXHRsZWZ0OiBcImFycm93bGVmdFwiLFxuXHRyaWdodDogXCJhcnJvd3JpZ2h0XCJcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1hZ2ljS2V5cy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGtleXMgcHJlc3NlZCBzdGF0ZSwgd2l0aCBtYWdpY2FsIGtleXMgY29tYmluYXRpb24gc3VwcG9ydC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWFnaWNLZXlzXG4qL1xuZnVuY3Rpb24gdXNlTWFnaWNLZXlzKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHJlYWN0aXZlOiB1c2VSZWFjdGl2ZSA9IGZhbHNlLCB0YXJnZXQgPSBkZWZhdWx0V2luZG93LCBhbGlhc01hcCA9IERlZmF1bHRNYWdpY0tleXNBbGlhc01hcCwgcGFzc2l2ZSA9IHRydWUsIG9uRXZlbnRGaXJlZCA9IG5vb3AgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGN1cnJlbnQgPSByZWFjdGl2ZSgvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKTtcblx0Y29uc3Qgb2JqID0ge1xuXHRcdHRvSlNPTigpIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9LFxuXHRcdGN1cnJlbnRcblx0fTtcblx0Y29uc3QgcmVmcyA9IHVzZVJlYWN0aXZlID8gcmVhY3RpdmUob2JqKSA6IG9iajtcblx0Y29uc3QgbWV0YURlcHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRjb25zdCBkZXBzTWFwID0gbmV3IE1hcChbXG5cdFx0W1wiTWV0YVwiLCBtZXRhRGVwc10sXG5cdFx0W1wiU2hpZnRcIiwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKV0sXG5cdFx0W1wiQWx0XCIsIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCldXG5cdF0pO1xuXHRjb25zdCB1c2VkS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdGZ1bmN0aW9uIHNldFJlZnMoa2V5LCB2YWx1ZSkge1xuXHRcdGlmIChrZXkgaW4gcmVmcykgaWYgKHVzZVJlYWN0aXZlKSByZWZzW2tleV0gPSB2YWx1ZTtcblx0XHRlbHNlIHJlZnNba2V5XS52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXHRcdGN1cnJlbnQuY2xlYXIoKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiB1c2VkS2V5cykgc2V0UmVmcyhrZXksIGZhbHNlKTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGVEZXBzKHZhbHVlLCBlLCBrZXlzJDEpIHtcblx0XHRpZiAoIXZhbHVlIHx8IHR5cGVvZiBlLmdldE1vZGlmaWVyU3RhdGUgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgW21vZGlmaWVyLCBkZXBzU2V0XSBvZiBkZXBzTWFwKSBpZiAoZS5nZXRNb2RpZmllclN0YXRlKG1vZGlmaWVyKSkge1xuXHRcdFx0a2V5cyQxLmZvckVhY2goKGtleSkgPT4gZGVwc1NldC5hZGQoa2V5KSk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gY2xlYXJEZXBzKHZhbHVlLCBrZXkpIHtcblx0XHRpZiAodmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBkZXBzTWFwS2V5ID0gYCR7a2V5WzBdLnRvVXBwZXJDYXNlKCl9JHtrZXkuc2xpY2UoMSl9YDtcblx0XHRjb25zdCBkZXBzID0gZGVwc01hcC5nZXQoZGVwc01hcEtleSk7XG5cdFx0aWYgKCFbXCJzaGlmdFwiLCBcImFsdFwiXS5pbmNsdWRlcyhrZXkpIHx8ICFkZXBzKSByZXR1cm47XG5cdFx0Y29uc3QgZGVwc0FycmF5ID0gQXJyYXkuZnJvbShkZXBzKTtcblx0XHRjb25zdCBkZXBzSW5kZXggPSBkZXBzQXJyYXkuaW5kZXhPZihrZXkpO1xuXHRcdGRlcHNBcnJheS5mb3JFYWNoKChrZXkkMSwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCA+PSBkZXBzSW5kZXgpIHtcblx0XHRcdFx0Y3VycmVudC5kZWxldGUoa2V5JDEpO1xuXHRcdFx0XHRzZXRSZWZzKGtleSQxLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0ZGVwcy5jbGVhcigpO1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZVJlZnMoZSwgdmFsdWUpIHtcblx0XHR2YXIgX2Uka2V5LCBfZSRjb2RlO1xuXHRcdGNvbnN0IGtleSA9IChfZSRrZXkgPSBlLmtleSkgPT09IG51bGwgfHwgX2Uka2V5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZSRrZXkudG9Mb3dlckNhc2UoKTtcblx0XHRjb25zdCB2YWx1ZXMgPSBbKF9lJGNvZGUgPSBlLmNvZGUpID09PSBudWxsIHx8IF9lJGNvZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lJGNvZGUudG9Mb3dlckNhc2UoKSwga2V5XS5maWx0ZXIoQm9vbGVhbik7XG5cdFx0aWYgKCFrZXkpIHJldHVybjtcblx0XHRpZiAoa2V5KSBpZiAodmFsdWUpIGN1cnJlbnQuYWRkKGtleSk7XG5cdFx0ZWxzZSBjdXJyZW50LmRlbGV0ZShrZXkpO1xuXHRcdGZvciAoY29uc3Qga2V5JDEgb2YgdmFsdWVzKSB7XG5cdFx0XHR1c2VkS2V5cy5hZGQoa2V5JDEpO1xuXHRcdFx0c2V0UmVmcyhrZXkkMSwgdmFsdWUpO1xuXHRcdH1cblx0XHR1cGRhdGVEZXBzKHZhbHVlLCBlLCBbLi4uY3VycmVudCwgLi4udmFsdWVzXSk7XG5cdFx0Y2xlYXJEZXBzKHZhbHVlLCBrZXkpO1xuXHRcdGlmIChrZXkgPT09IFwibWV0YVwiICYmICF2YWx1ZSkge1xuXHRcdFx0bWV0YURlcHMuZm9yRWFjaCgoa2V5JDEpID0+IHtcblx0XHRcdFx0Y3VycmVudC5kZWxldGUoa2V5JDEpO1xuXHRcdFx0XHRzZXRSZWZzKGtleSQxLCBmYWxzZSk7XG5cdFx0XHR9KTtcblx0XHRcdG1ldGFEZXBzLmNsZWFyKCk7XG5cdFx0fVxuXHR9XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImtleWRvd25cIiwgKGUpID0+IHtcblx0XHR1cGRhdGVSZWZzKGUsIHRydWUpO1xuXHRcdHJldHVybiBvbkV2ZW50RmlyZWQoZSk7XG5cdH0sIHsgcGFzc2l2ZSB9KTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwia2V5dXBcIiwgKGUpID0+IHtcblx0XHR1cGRhdGVSZWZzKGUsIGZhbHNlKTtcblx0XHRyZXR1cm4gb25FdmVudEZpcmVkKGUpO1xuXHR9LCB7IHBhc3NpdmUgfSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHJlc2V0LCB7IHBhc3NpdmUgfSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCByZXNldCwgeyBwYXNzaXZlIH0pO1xuXHRjb25zdCBwcm94eSA9IG5ldyBQcm94eShyZWZzLCB7IGdldCh0YXJnZXQkMSwgcHJvcCwgcmVjKSB7XG5cdFx0aWYgKHR5cGVvZiBwcm9wICE9PSBcInN0cmluZ1wiKSByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0JDEsIHByb3AsIHJlYyk7XG5cdFx0cHJvcCA9IHByb3AudG9Mb3dlckNhc2UoKTtcblx0XHRpZiAocHJvcCBpbiBhbGlhc01hcCkgcHJvcCA9IGFsaWFzTWFwW3Byb3BdO1xuXHRcdGlmICghKHByb3AgaW4gcmVmcykpIGlmICgvWytfLV0vLnRlc3QocHJvcCkpIHtcblx0XHRcdGNvbnN0IGtleXMkMSA9IHByb3Auc3BsaXQoL1srXy1dL2cpLm1hcCgoaSkgPT4gaS50cmltKCkpO1xuXHRcdFx0cmVmc1twcm9wXSA9IGNvbXB1dGVkKCgpID0+IGtleXMkMS5tYXAoKGtleSkgPT4gdG9WYWx1ZShwcm94eVtrZXldKSkuZXZlcnkoQm9vbGVhbikpO1xuXHRcdH0gZWxzZSByZWZzW3Byb3BdID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdFx0Y29uc3QgciA9IFJlZmxlY3QuZ2V0KHRhcmdldCQxLCBwcm9wLCByZWMpO1xuXHRcdHJldHVybiB1c2VSZWFjdGl2ZSA/IHRvVmFsdWUocikgOiByO1xuXHR9IH0pO1xuXHRyZXR1cm4gcHJveHk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1lZGlhQ29udHJvbHMvaW5kZXgudHNcbi8qKlxuKiBBdXRvbWF0aWNhbGx5IGNoZWNrIGlmIHRoZSByZWYgZXhpc3RzIGFuZCBpZiBpdCBkb2VzIHJ1biB0aGUgY2IgZm5cbiovXG5mdW5jdGlvbiB1c2luZ0VsUmVmKHNvdXJjZSwgY2IpIHtcblx0aWYgKHRvVmFsdWUoc291cmNlKSkgY2IodG9WYWx1ZShzb3VyY2UpKTtcbn1cbi8qKlxuKiBDb252ZXJ0cyBhIFRpbWVSYW5nZSBvYmplY3QgdG8gYW4gYXJyYXlcbiovXG5mdW5jdGlvbiB0aW1lUmFuZ2VUb0FycmF5KHRpbWVSYW5nZXMpIHtcblx0bGV0IHJhbmdlcyA9IFtdO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVSYW5nZXMubGVuZ3RoOyArK2kpIHJhbmdlcyA9IFsuLi5yYW5nZXMsIFt0aW1lUmFuZ2VzLnN0YXJ0KGkpLCB0aW1lUmFuZ2VzLmVuZChpKV1dO1xuXHRyZXR1cm4gcmFuZ2VzO1xufVxuLyoqXG4qIENvbnZlcnRzIGEgVGV4dFRyYWNrTGlzdCBvYmplY3QgdG8gYW4gYXJyYXkgb2YgYFVzZU1lZGlhVGV4dFRyYWNrYFxuKi9cbmZ1bmN0aW9uIHRyYWNrc1RvQXJyYXkodHJhY2tzKSB7XG5cdHJldHVybiBBcnJheS5mcm9tKHRyYWNrcykubWFwKCh7IGxhYmVsLCBraW5kLCBsYW5ndWFnZSwgbW9kZSwgYWN0aXZlQ3VlcywgY3VlcywgaW5CYW5kTWV0YWRhdGFUcmFja0Rpc3BhdGNoVHlwZSB9LCBpZCkgPT4gKHtcblx0XHRpZCxcblx0XHRsYWJlbCxcblx0XHRraW5kLFxuXHRcdGxhbmd1YWdlLFxuXHRcdG1vZGUsXG5cdFx0YWN0aXZlQ3Vlcyxcblx0XHRjdWVzLFxuXHRcdGluQmFuZE1ldGFkYXRhVHJhY2tEaXNwYXRjaFR5cGVcblx0fSkpO1xufVxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG5cdHNyYzogXCJcIixcblx0dHJhY2tzOiBbXVxufTtcbmZ1bmN0aW9uIHVzZU1lZGlhQ29udHJvbHModGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0dGFyZ2V0ID0gdG9SZWYodGFyZ2V0KTtcblx0b3B0aW9ucyA9IHtcblx0XHQuLi5kZWZhdWx0T3B0aW9ucyxcblx0XHQuLi5vcHRpb25zXG5cdH07XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRjb25zdCBjdXJyZW50VGltZSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGR1cmF0aW9uID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3Qgc2Vla2luZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCB2b2x1bWUgPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCB3YWl0aW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGVuZGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHBsYXlpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgcmF0ZSA9IHNoYWxsb3dSZWYoMSk7XG5cdGNvbnN0IHN0YWxsZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgYnVmZmVyZWQgPSByZWYoW10pO1xuXHRjb25zdCB0cmFja3MgPSByZWYoW10pO1xuXHRjb25zdCBzZWxlY3RlZFRyYWNrID0gc2hhbGxvd1JlZigtMSk7XG5cdGNvbnN0IGlzUGljdHVyZUluUGljdHVyZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBtdXRlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmUgPSBCb29sZWFuKGRvY3VtZW50JDEgJiYgXCJwaWN0dXJlSW5QaWN0dXJlRW5hYmxlZFwiIGluIGRvY3VtZW50JDEpO1xuXHRjb25zdCBzb3VyY2VFcnJvckV2ZW50ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHBsYXliYWNrRXJyb3JFdmVudCA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHQvKipcblx0KiBEaXNhYmxlcyB0aGUgc3BlY2lmaWVkIHRyYWNrLiBJZiBubyB0cmFjayBpcyBzcGVjaWZpZWQgdGhlblxuXHQqIGFsbCB0cmFja3Mgd2lsbCBiZSBkaXNhYmxlZFxuXHQqXG5cdCogQHBhcmFtIHRyYWNrIFRoZSBpZCBvZiB0aGUgdHJhY2sgdG8gZGlzYWJsZVxuXHQqL1xuXHRjb25zdCBkaXNhYmxlVHJhY2sgPSAodHJhY2spID0+IHtcblx0XHR1c2luZ0VsUmVmKHRhcmdldCwgKGVsKSA9PiB7XG5cdFx0XHRpZiAodHJhY2spIHtcblx0XHRcdFx0Y29uc3QgaWQgPSB0eXBlb2YgdHJhY2sgPT09IFwibnVtYmVyXCIgPyB0cmFjayA6IHRyYWNrLmlkO1xuXHRcdFx0XHRlbC50ZXh0VHJhY2tzW2lkXS5tb2RlID0gXCJkaXNhYmxlZFwiO1xuXHRcdFx0fSBlbHNlIGZvciAobGV0IGkgPSAwOyBpIDwgZWwudGV4dFRyYWNrcy5sZW5ndGg7ICsraSkgZWwudGV4dFRyYWNrc1tpXS5tb2RlID0gXCJkaXNhYmxlZFwiO1xuXHRcdFx0c2VsZWN0ZWRUcmFjay52YWx1ZSA9IC0xO1xuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBFbmFibGVzIHRoZSBzcGVjaWZpZWQgdHJhY2sgYW5kIGRpc2FibGVzIHRoZVxuXHQqIG90aGVyIHRyYWNrcyB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZFxuXHQqXG5cdCogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayBvZiB0aGUgaWQgb2YgdGhlIHRyYWNrIHRvIGVuYWJsZVxuXHQqIEBwYXJhbSBkaXNhYmxlVHJhY2tzIERpc2FibGUgYWxsIG90aGVyIHRyYWNrc1xuXHQqL1xuXHRjb25zdCBlbmFibGVUcmFjayA9ICh0cmFjaywgZGlzYWJsZVRyYWNrcyA9IHRydWUpID0+IHtcblx0XHR1c2luZ0VsUmVmKHRhcmdldCwgKGVsKSA9PiB7XG5cdFx0XHRjb25zdCBpZCA9IHR5cGVvZiB0cmFjayA9PT0gXCJudW1iZXJcIiA/IHRyYWNrIDogdHJhY2suaWQ7XG5cdFx0XHRpZiAoZGlzYWJsZVRyYWNrcykgZGlzYWJsZVRyYWNrKCk7XG5cdFx0XHRlbC50ZXh0VHJhY2tzW2lkXS5tb2RlID0gXCJzaG93aW5nXCI7XG5cdFx0XHRzZWxlY3RlZFRyYWNrLnZhbHVlID0gaWQ7XG5cdFx0fSk7XG5cdH07XG5cdC8qKlxuXHQqIFRvZ2dsZSBwaWN0dXJlIGluIHBpY3R1cmUgbW9kZSBmb3IgdGhlIHBsYXllci5cblx0Ki9cblx0Y29uc3QgdG9nZ2xlUGljdHVyZUluUGljdHVyZSA9ICgpID0+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dXNpbmdFbFJlZih0YXJnZXQsIGFzeW5jIChlbCkgPT4ge1xuXHRcdFx0XHRpZiAoc3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlKSBpZiAoIWlzUGljdHVyZUluUGljdHVyZS52YWx1ZSkgZWwucmVxdWVzdFBpY3R1cmVJblBpY3R1cmUoKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG5cdFx0XHRcdGVsc2UgZG9jdW1lbnQkMS5leGl0UGljdHVyZUluUGljdHVyZSgpLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBpbmplY3Qgc291cmNlcyB0byB0aGUgbWVkaWEgZWxlbWVudC4gVGhlIHNvdXJjZXMgd2lsbCBiZVxuXHQqIGFwcGVuZGVkIGFzIGNoaWxkcmVuIHRvIHRoZSBtZWRpYSBlbGVtZW50IGFzIGA8c291cmNlPmAgZWxlbWVudHMuXG5cdCovXG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHJldHVybjtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0Y29uc3Qgc3JjID0gdG9WYWx1ZShvcHRpb25zLnNyYyk7XG5cdFx0bGV0IHNvdXJjZXMgPSBbXTtcblx0XHRpZiAoIXNyYykgcmV0dXJuO1xuXHRcdGlmICh0eXBlb2Ygc3JjID09PSBcInN0cmluZ1wiKSBzb3VyY2VzID0gW3sgc3JjIH1dO1xuXHRcdGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSkgc291cmNlcyA9IHNyYztcblx0XHRlbHNlIGlmIChpc09iamVjdChzcmMpKSBzb3VyY2VzID0gW3NyY107XG5cdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcInNvdXJjZVwiKS5mb3JFYWNoKChlKSA9PiB7XG5cdFx0XHRlLnJlbW92ZSgpO1xuXHRcdH0pO1xuXHRcdHNvdXJjZXMuZm9yRWFjaCgoeyBzcmM6IHNyYyQxLCB0eXBlLCBtZWRpYSB9KSA9PiB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoXCJzb3VyY2VcIik7XG5cdFx0XHRzb3VyY2Uuc2V0QXR0cmlidXRlKFwic3JjXCIsIHNyYyQxKTtcblx0XHRcdHNvdXJjZS5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIHR5cGUgfHwgXCJcIik7XG5cdFx0XHRzb3VyY2Uuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEgfHwgXCJcIik7XG5cdFx0XHR1c2VFdmVudExpc3RlbmVyKHNvdXJjZSwgXCJlcnJvclwiLCBzb3VyY2VFcnJvckV2ZW50LnRyaWdnZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0XHRlbC5hcHBlbmRDaGlsZChzb3VyY2UpO1xuXHRcdH0pO1xuXHRcdGVsLmxvYWQoKTtcblx0fSk7XG5cdC8qKlxuXHQqIEFwcGx5IGNvbXBvc2FibGUgc3RhdGUgdG8gdGhlIGVsZW1lbnQsIGFsc28gd2hlbiBlbGVtZW50IGlzIGNoYW5nZWRcblx0Ki9cblx0d2F0Y2goW3RhcmdldCwgdm9sdW1lXSwgKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRlbC52b2x1bWUgPSB2b2x1bWUudmFsdWU7XG5cdH0pO1xuXHR3YXRjaChbdGFyZ2V0LCBtdXRlZF0sICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwubXV0ZWQgPSBtdXRlZC52YWx1ZTtcblx0fSk7XG5cdHdhdGNoKFt0YXJnZXQsIHJhdGVdLCAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGVsLnBsYXliYWNrUmF0ZSA9IHJhdGUudmFsdWU7XG5cdH0pO1xuXHQvKipcblx0KiBMb2FkIFRyYWNrc1xuXHQqL1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKCFkb2N1bWVudCQxKSByZXR1cm47XG5cdFx0Y29uc3QgdGV4dFRyYWNrcyA9IHRvVmFsdWUob3B0aW9ucy50cmFja3MpO1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghdGV4dFRyYWNrcyB8fCAhdGV4dFRyYWNrcy5sZW5ndGggfHwgIWVsKSByZXR1cm47XG5cdFx0LyoqXG5cdFx0KiBUaGUgTWVkaWFBUEkgcHJvdmlkZXMgYW4gQVBJIGZvciBhZGRpbmcgdGV4dCB0cmFja3MsIGJ1dCB0aGV5IGRvbid0IGN1cnJlbnRseVxuXHRcdCogaGF2ZSBhbiBBUEkgZm9yIHJlbW92aW5nIHRleHQgdHJhY2tzLCBzbyBpbnN0ZWFkIHdlIHdpbGwganVzdCBjcmVhdGUgYW5kIHJlbW92ZVxuXHRcdCogdGhlIHRyYWNrcyBtYW51YWxseSB1c2luZyB0aGUgSFRNTCBhcGkuXG5cdFx0Ki9cblx0XHRlbC5xdWVyeVNlbGVjdG9yQWxsKFwidHJhY2tcIikuZm9yRWFjaCgoZSkgPT4gZS5yZW1vdmUoKSk7XG5cdFx0dGV4dFRyYWNrcy5mb3JFYWNoKCh7IGRlZmF1bHQ6IGlzRGVmYXVsdCwga2luZCwgbGFiZWwsIHNyYywgc3JjTGFuZyB9LCBpKSA9PiB7XG5cdFx0XHRjb25zdCB0cmFjayA9IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChcInRyYWNrXCIpO1xuXHRcdFx0dHJhY2suZGVmYXVsdCA9IGlzRGVmYXVsdCB8fCBmYWxzZTtcblx0XHRcdHRyYWNrLmtpbmQgPSBraW5kO1xuXHRcdFx0dHJhY2subGFiZWwgPSBsYWJlbDtcblx0XHRcdHRyYWNrLnNyYyA9IHNyYztcblx0XHRcdHRyYWNrLnNyY2xhbmcgPSBzcmNMYW5nO1xuXHRcdFx0aWYgKHRyYWNrLmRlZmF1bHQpIHNlbGVjdGVkVHJhY2sudmFsdWUgPSBpO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQodHJhY2spO1xuXHRcdH0pO1xuXHR9KTtcblx0LyoqXG5cdCogVGhpcyB3aWxsIGFsbG93IHVzIHRvIHVwZGF0ZSB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIHRpbWV1cGRhdGUgZXZlbnRcblx0KiB3aXRob3V0IHNldHRpbmcgdGhlIG1lZGlhcyBjdXJyZW50IHBvc2l0aW9uLCBidXQgaWYgdGhlIHVzZXIgY2hhbmdlcyB0aGVcblx0KiBjdXJyZW50IHRpbWUgdmlhIHRoZSByZWYsIHRoZW4gdGhlIG1lZGlhIHdpbGwgc2Vlay5cblx0KlxuXHQqIElmIHdlIGRpZCBub3QgdXNlIGFuIGlnbm9yYWJsZSB3YXRjaCwgdGhlbiB0aGUgY3VycmVudCB0aW1lIHVwZGF0ZSBmcm9tXG5cdCogdGhlIHRpbWV1cGRhdGUgZXZlbnQgd291bGQgY2F1c2UgdGhlIG1lZGlhIHRvIHN0dXR0ZXIuXG5cdCovXG5cdGNvbnN0IHsgaWdub3JlVXBkYXRlczogaWdub3JlQ3VycmVudFRpbWVVcGRhdGVzIH0gPSB3YXRjaElnbm9yYWJsZShjdXJyZW50VGltZSwgKHRpbWUpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwuY3VycmVudFRpbWUgPSB0aW1lO1xuXHR9KTtcblx0LyoqXG5cdCogVXNpbmcgYW4gaWdub3JhYmxlIHdhdGNoIHNvIHdlIGNhbiBjb250cm9sIHRoZSBwbGF5IHN0YXRlIHVzaW5nIGEgcmVmIGFuZCBub3Rcblx0KiBhIGZ1bmN0aW9uXG5cdCovXG5cdGNvbnN0IHsgaWdub3JlVXBkYXRlczogaWdub3JlUGxheWluZ1VwZGF0ZXMgfSA9IHdhdGNoSWdub3JhYmxlKHBsYXlpbmcsIChpc1BsYXlpbmcpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0aWYgKGlzUGxheWluZykgZWwucGxheSgpLmNhdGNoKChlKSA9PiB7XG5cdFx0XHRwbGF5YmFja0Vycm9yRXZlbnQudHJpZ2dlcihlKTtcblx0XHRcdHRocm93IGU7XG5cdFx0fSk7XG5cdFx0ZWxzZSBlbC5wYXVzZSgpO1xuXHR9KTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidGltZXVwZGF0ZVwiLCAoKSA9PiBpZ25vcmVDdXJyZW50VGltZVVwZGF0ZXMoKCkgPT4gY3VycmVudFRpbWUudmFsdWUgPSB0b1ZhbHVlKHRhcmdldCkuY3VycmVudFRpbWUpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkdXJhdGlvbmNoYW5nZVwiLCAoKSA9PiBkdXJhdGlvbi52YWx1ZSA9IHRvVmFsdWUodGFyZ2V0KS5kdXJhdGlvbiwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicHJvZ3Jlc3NcIiwgKCkgPT4gYnVmZmVyZWQudmFsdWUgPSB0aW1lUmFuZ2VUb0FycmF5KHRvVmFsdWUodGFyZ2V0KS5idWZmZXJlZCksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInNlZWtpbmdcIiwgKCkgPT4gc2Vla2luZy52YWx1ZSA9IHRydWUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInNlZWtlZFwiLCAoKSA9PiBzZWVraW5nLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXCJ3YWl0aW5nXCIsIFwibG9hZHN0YXJ0XCJdLCAoKSA9PiB7XG5cdFx0d2FpdGluZy52YWx1ZSA9IHRydWU7XG5cdFx0aWdub3JlUGxheWluZ1VwZGF0ZXMoKCkgPT4gcGxheWluZy52YWx1ZSA9IGZhbHNlKTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwibG9hZGVkZGF0YVwiLCAoKSA9PiB3YWl0aW5nLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBsYXlpbmdcIiwgKCkgPT4ge1xuXHRcdHdhaXRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRlbmRlZC52YWx1ZSA9IGZhbHNlO1xuXHRcdGlnbm9yZVBsYXlpbmdVcGRhdGVzKCgpID0+IHBsYXlpbmcudmFsdWUgPSB0cnVlKTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicmF0ZWNoYW5nZVwiLCAoKSA9PiByYXRlLnZhbHVlID0gdG9WYWx1ZSh0YXJnZXQpLnBsYXliYWNrUmF0ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwic3RhbGxlZFwiLCAoKSA9PiBzdGFsbGVkLnZhbHVlID0gdHJ1ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZW5kZWRcIiwgKCkgPT4gZW5kZWQudmFsdWUgPSB0cnVlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwYXVzZVwiLCAoKSA9PiBpZ25vcmVQbGF5aW5nVXBkYXRlcygoKSA9PiBwbGF5aW5nLnZhbHVlID0gZmFsc2UpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwbGF5XCIsICgpID0+IGlnbm9yZVBsYXlpbmdVcGRhdGVzKCgpID0+IHBsYXlpbmcudmFsdWUgPSB0cnVlKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZW50ZXJwaWN0dXJlaW5waWN0dXJlXCIsICgpID0+IGlzUGljdHVyZUluUGljdHVyZS52YWx1ZSA9IHRydWUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImxlYXZlcGljdHVyZWlucGljdHVyZVwiLCAoKSA9PiBpc1BpY3R1cmVJblBpY3R1cmUudmFsdWUgPSBmYWxzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidm9sdW1lY2hhbmdlXCIsICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0dm9sdW1lLnZhbHVlID0gZWwudm9sdW1lO1xuXHRcdG11dGVkLnZhbHVlID0gZWwubXV0ZWQ7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdC8qKlxuXHQqIFRoZSBmb2xsb3dpbmcgbGlzdGVuZXJzIG5lZWQgdG8gbGlzdGVuIHRvIGEgbmVzdGVkXG5cdCogb2JqZWN0IG9uIHRoZSB0YXJnZXQsIHNvIHdlIHdpbGwgaGF2ZSB0byB1c2UgYSBuZXN0ZWRcblx0KiB3YXRjaCBhbmQgbWFudWFsbHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnNcblx0Ki9cblx0Y29uc3QgbGlzdGVuZXJzID0gW107XG5cdGNvbnN0IHN0b3AgPSB3YXRjaChbdGFyZ2V0XSwgKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRzdG9wKCk7XG5cdFx0bGlzdGVuZXJzWzBdID0gdXNlRXZlbnRMaXN0ZW5lcihlbC50ZXh0VHJhY2tzLCBcImFkZHRyYWNrXCIsICgpID0+IHRyYWNrcy52YWx1ZSA9IHRyYWNrc1RvQXJyYXkoZWwudGV4dFRyYWNrcyksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0bGlzdGVuZXJzWzFdID0gdXNlRXZlbnRMaXN0ZW5lcihlbC50ZXh0VHJhY2tzLCBcInJlbW92ZXRyYWNrXCIsICgpID0+IHRyYWNrcy52YWx1ZSA9IHRyYWNrc1RvQXJyYXkoZWwudGV4dFRyYWNrcyksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0bGlzdGVuZXJzWzJdID0gdXNlRXZlbnRMaXN0ZW5lcihlbC50ZXh0VHJhY2tzLCBcImNoYW5nZVwiLCAoKSA9PiB0cmFja3MudmFsdWUgPSB0cmFja3NUb0FycmF5KGVsLnRleHRUcmFja3MpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4gbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcigpKSk7XG5cdHJldHVybiB7XG5cdFx0Y3VycmVudFRpbWUsXG5cdFx0ZHVyYXRpb24sXG5cdFx0d2FpdGluZyxcblx0XHRzZWVraW5nLFxuXHRcdGVuZGVkLFxuXHRcdHN0YWxsZWQsXG5cdFx0YnVmZmVyZWQsXG5cdFx0cGxheWluZyxcblx0XHRyYXRlLFxuXHRcdHZvbHVtZSxcblx0XHRtdXRlZCxcblx0XHR0cmFja3MsXG5cdFx0c2VsZWN0ZWRUcmFjayxcblx0XHRlbmFibGVUcmFjayxcblx0XHRkaXNhYmxlVHJhY2ssXG5cdFx0c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlLFxuXHRcdHRvZ2dsZVBpY3R1cmVJblBpY3R1cmUsXG5cdFx0aXNQaWN0dXJlSW5QaWN0dXJlLFxuXHRcdG9uU291cmNlRXJyb3I6IHNvdXJjZUVycm9yRXZlbnQub24sXG5cdFx0b25QbGF5YmFja0Vycm9yOiBwbGF5YmFja0Vycm9yRXZlbnQub25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTWVtb2l6ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGZ1bmN0aW9uIHJlc3VsdCBjYWNoZSBiYXNlZCBvbiBhcmd1bWVudHNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VNZW1vaXplKHJlc29sdmVyLCBvcHRpb25zKSB7XG5cdGNvbnN0IGluaXRDYWNoZSA9ICgpID0+IHtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhY2hlKSByZXR1cm4gc2hhbGxvd1JlYWN0aXZlKG9wdGlvbnMuY2FjaGUpO1xuXHRcdHJldHVybiBzaGFsbG93UmVhY3RpdmUoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7XG5cdH07XG5cdGNvbnN0IGNhY2hlID0gaW5pdENhY2hlKCk7XG5cdC8qKlxuXHQqIEdlbmVyYXRlIGtleSBmcm9tIGFyZ3Ncblx0Ki9cblx0Y29uc3QgZ2VuZXJhdGVLZXkgPSAoLi4uYXJncykgPT4gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5nZXRLZXkpID8gb3B0aW9ucy5nZXRLZXkoLi4uYXJncykgOiBKU09OLnN0cmluZ2lmeShhcmdzKTtcblx0LyoqXG5cdCogTG9hZCBkYXRhIGFuZCBzYXZlIGluIGNhY2hlXG5cdCovXG5cdGNvbnN0IF9sb2FkRGF0YSA9IChrZXksIC4uLmFyZ3MpID0+IHtcblx0XHRjYWNoZS5zZXQoa2V5LCByZXNvbHZlciguLi5hcmdzKSk7XG5cdFx0cmV0dXJuIGNhY2hlLmdldChrZXkpO1xuXHR9O1xuXHRjb25zdCBsb2FkRGF0YSA9ICguLi5hcmdzKSA9PiBfbG9hZERhdGEoZ2VuZXJhdGVLZXkoLi4uYXJncyksIC4uLmFyZ3MpO1xuXHQvKipcblx0KiBEZWxldGUga2V5IGZyb20gY2FjaGVcblx0Ki9cblx0Y29uc3QgZGVsZXRlRGF0YSA9ICguLi5hcmdzKSA9PiB7XG5cdFx0Y2FjaGUuZGVsZXRlKGdlbmVyYXRlS2V5KC4uLmFyZ3MpKTtcblx0fTtcblx0LyoqXG5cdCogQ2xlYXIgY2FjaGVkIGRhdGFcblx0Ki9cblx0Y29uc3QgY2xlYXJEYXRhID0gKCkgPT4ge1xuXHRcdGNhY2hlLmNsZWFyKCk7XG5cdH07XG5cdGNvbnN0IG1lbW9pemVkID0gKC4uLmFyZ3MpID0+IHtcblx0XHRjb25zdCBrZXkgPSBnZW5lcmF0ZUtleSguLi5hcmdzKTtcblx0XHRpZiAoY2FjaGUuaGFzKGtleSkpIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcblx0XHRyZXR1cm4gX2xvYWREYXRhKGtleSwgLi4uYXJncyk7XG5cdH07XG5cdG1lbW9pemVkLmxvYWQgPSBsb2FkRGF0YTtcblx0bWVtb2l6ZWQuZGVsZXRlID0gZGVsZXRlRGF0YTtcblx0bWVtb2l6ZWQuY2xlYXIgPSBjbGVhckRhdGE7XG5cdG1lbW9pemVkLmdlbmVyYXRlS2V5ID0gZ2VuZXJhdGVLZXk7XG5cdG1lbW9pemVkLmNhY2hlID0gY2FjaGU7XG5cdHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTWVtb3J5L2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDYob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlQ2FsbGJhY2tcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IDFlMywgaW1tZWRpYXRlLCBpbW1lZGlhdGVDYWxsYmFjayB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCBpbnRlcnZhbCwge1xuXHRcdFx0aW1tZWRpYXRlLFxuXHRcdFx0aW1tZWRpYXRlQ2FsbGJhY2tcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gdXNlSW50ZXJ2YWxGbjtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBNZW1vcnkgSW5mby5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWVtb3J5XG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTWVtb3J5KG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBtZW1vcnkgPSByZWYoKTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBcIm1lbW9yeVwiIGluIHBlcmZvcm1hbmNlKTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0Y29uc3QgeyBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDYgfSA9IG9wdGlvbnM7XG5cdFx0c2NoZWR1bGVyKCgpID0+IHtcblx0XHRcdG1lbW9yeS52YWx1ZSA9IHBlcmZvcm1hbmNlLm1lbW9yeTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdG1lbW9yeVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNb3VzZS9pbmRleC50c1xuY29uc3QgVXNlTW91c2VCdWlsdGluRXh0cmFjdG9ycyA9IHtcblx0cGFnZTogKGV2ZW50KSA9PiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXSxcblx0Y2xpZW50OiAoZXZlbnQpID0+IFtldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZXSxcblx0c2NyZWVuOiAoZXZlbnQpID0+IFtldmVudC5zY3JlZW5YLCBldmVudC5zY3JlZW5ZXSxcblx0bW92ZW1lbnQ6IChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ID8gW2V2ZW50Lm1vdmVtZW50WCwgZXZlbnQubW92ZW1lbnRZXSA6IG51bGxcbn07XG4vKipcbiogUmVhY3RpdmUgbW91c2UgcG9zaXRpb24uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1vdXNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTW91c2Uob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdHlwZSA9IFwicGFnZVwiLCB0b3VjaCA9IHRydWUsIHJlc2V0T25Ub3VjaEVuZHMgPSBmYWxzZSwgaW5pdGlhbFZhbHVlID0ge1xuXHRcdHg6IDAsXG5cdFx0eTogMFxuXHR9LCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgdGFyZ2V0ID0gd2luZG93JDEsIHNjcm9sbCA9IHRydWUsIGV2ZW50RmlsdGVyIH0gPSBvcHRpb25zO1xuXHRsZXQgX3ByZXZNb3VzZUV2ZW50ID0gbnVsbDtcblx0bGV0IF9wcmV2U2Nyb2xsWCA9IDA7XG5cdGxldCBfcHJldlNjcm9sbFkgPSAwO1xuXHRjb25zdCB4ID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUueCk7XG5cdGNvbnN0IHkgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZS55KTtcblx0Y29uc3Qgc291cmNlVHlwZSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGV4dHJhY3RvciA9IHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIgPyB0eXBlIDogVXNlTW91c2VCdWlsdGluRXh0cmFjdG9yc1t0eXBlXTtcblx0Y29uc3QgbW91c2VIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZXh0cmFjdG9yKGV2ZW50KTtcblx0XHRfcHJldk1vdXNlRXZlbnQgPSBldmVudDtcblx0XHRpZiAocmVzdWx0KSB7XG5cdFx0XHRbeC52YWx1ZSwgeS52YWx1ZV0gPSByZXN1bHQ7XG5cdFx0XHRzb3VyY2VUeXBlLnZhbHVlID0gXCJtb3VzZVwiO1xuXHRcdH1cblx0XHRpZiAod2luZG93JDEpIHtcblx0XHRcdF9wcmV2U2Nyb2xsWCA9IHdpbmRvdyQxLnNjcm9sbFg7XG5cdFx0XHRfcHJldlNjcm9sbFkgPSB3aW5kb3ckMS5zY3JvbGxZO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgdG91Y2hIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0aWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gZXh0cmFjdG9yKGV2ZW50LnRvdWNoZXNbMF0pO1xuXHRcdFx0aWYgKHJlc3VsdCkge1xuXHRcdFx0XHRbeC52YWx1ZSwgeS52YWx1ZV0gPSByZXN1bHQ7XG5cdFx0XHRcdHNvdXJjZVR5cGUudmFsdWUgPSBcInRvdWNoXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzY3JvbGxIYW5kbGVyID0gKCkgPT4ge1xuXHRcdGlmICghX3ByZXZNb3VzZUV2ZW50IHx8ICF3aW5kb3ckMSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvcyA9IGV4dHJhY3RvcihfcHJldk1vdXNlRXZlbnQpO1xuXHRcdGlmIChfcHJldk1vdXNlRXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ICYmIHBvcykge1xuXHRcdFx0eC52YWx1ZSA9IHBvc1swXSArIHdpbmRvdyQxLnNjcm9sbFggLSBfcHJldlNjcm9sbFg7XG5cdFx0XHR5LnZhbHVlID0gcG9zWzFdICsgd2luZG93JDEuc2Nyb2xsWSAtIF9wcmV2U2Nyb2xsWTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdHgudmFsdWUgPSBpbml0aWFsVmFsdWUueDtcblx0XHR5LnZhbHVlID0gaW5pdGlhbFZhbHVlLnk7XG5cdH07XG5cdGNvbnN0IG1vdXNlSGFuZGxlcldyYXBwZXIgPSBldmVudEZpbHRlciA/IChldmVudCkgPT4gZXZlbnRGaWx0ZXIoKCkgPT4gbW91c2VIYW5kbGVyKGV2ZW50KSwge30pIDogKGV2ZW50KSA9PiBtb3VzZUhhbmRsZXIoZXZlbnQpO1xuXHRjb25zdCB0b3VjaEhhbmRsZXJXcmFwcGVyID0gZXZlbnRGaWx0ZXIgPyAoZXZlbnQpID0+IGV2ZW50RmlsdGVyKCgpID0+IHRvdWNoSGFuZGxlcihldmVudCksIHt9KSA6IChldmVudCkgPT4gdG91Y2hIYW5kbGVyKGV2ZW50KTtcblx0Y29uc3Qgc2Nyb2xsSGFuZGxlcldyYXBwZXIgPSBldmVudEZpbHRlciA/ICgpID0+IGV2ZW50RmlsdGVyKCgpID0+IHNjcm9sbEhhbmRsZXIoKSwge30pIDogKCkgPT4gc2Nyb2xsSGFuZGxlcigpO1xuXHRpZiAodGFyZ2V0KSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcIm1vdXNlbW92ZVwiLCBcImRyYWdvdmVyXCJdLCBtb3VzZUhhbmRsZXJXcmFwcGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGlmICh0b3VjaCAmJiB0eXBlICE9PSBcIm1vdmVtZW50XCIpIHtcblx0XHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXCJ0b3VjaHN0YXJ0XCIsIFwidG91Y2htb3ZlXCJdLCB0b3VjaEhhbmRsZXJXcmFwcGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdFx0aWYgKHJlc2V0T25Ub3VjaEVuZHMpIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRvdWNoZW5kXCIsIHJlc2V0LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdH1cblx0XHRpZiAoc2Nyb2xsICYmIHR5cGUgPT09IFwicGFnZVwiKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInNjcm9sbFwiLCBzY3JvbGxIYW5kbGVyV3JhcHBlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHgsXG5cdFx0eSxcblx0XHRzb3VyY2VUeXBlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1vdXNlSW5FbGVtZW50L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgbW91c2UgcG9zaXRpb24gcmVsYXRlZCB0byBhbiBlbGVtZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNb3VzZUluRWxlbWVudFxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTW91c2VJbkVsZW1lbnQodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3dSZXNpemUgPSB0cnVlLCB3aW5kb3dTY3JvbGwgPSB0cnVlLCBoYW5kbGVPdXRzaWRlID0gdHJ1ZSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHR5cGUgPSBvcHRpb25zLnR5cGUgfHwgXCJwYWdlXCI7XG5cdGNvbnN0IHsgeCwgeSwgc291cmNlVHlwZSB9ID0gdXNlTW91c2Uob3B0aW9ucyk7XG5cdGNvbnN0IHRhcmdldFJlZiA9IHNoYWxsb3dSZWYodGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmRvY3VtZW50LmJvZHkpO1xuXHRjb25zdCBlbGVtZW50WCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGVsZW1lbnRZID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZWxlbWVudFBvc2l0aW9uWCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGVsZW1lbnRQb3NpdGlvblkgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBlbGVtZW50SGVpZ2h0ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZWxlbWVudFdpZHRoID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgaXNPdXRzaWRlID0gc2hhbGxvd1JlZih0cnVlKTtcblx0ZnVuY3Rpb24gdXBkYXRlKCkge1xuXHRcdGlmICghd2luZG93JDEpIHJldHVybjtcblx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXRSZWYpO1xuXHRcdGlmICghZWwgfHwgIShlbCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XG5cdFx0Zm9yIChjb25zdCByZWN0IG9mIGVsLmdldENsaWVudFJlY3RzKCkpIHtcblx0XHRcdGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSByZWN0O1xuXHRcdFx0ZWxlbWVudFBvc2l0aW9uWC52YWx1ZSA9IGxlZnQgKyAodHlwZSA9PT0gXCJwYWdlXCIgPyB3aW5kb3ckMS5wYWdlWE9mZnNldCA6IDApO1xuXHRcdFx0ZWxlbWVudFBvc2l0aW9uWS52YWx1ZSA9IHRvcCArICh0eXBlID09PSBcInBhZ2VcIiA/IHdpbmRvdyQxLnBhZ2VZT2Zmc2V0IDogMCk7XG5cdFx0XHRlbGVtZW50SGVpZ2h0LnZhbHVlID0gaGVpZ2h0O1xuXHRcdFx0ZWxlbWVudFdpZHRoLnZhbHVlID0gd2lkdGg7XG5cdFx0XHRjb25zdCBlbFggPSB4LnZhbHVlIC0gZWxlbWVudFBvc2l0aW9uWC52YWx1ZTtcblx0XHRcdGNvbnN0IGVsWSA9IHkudmFsdWUgLSBlbGVtZW50UG9zaXRpb25ZLnZhbHVlO1xuXHRcdFx0aXNPdXRzaWRlLnZhbHVlID0gd2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwIHx8IGVsWCA8IDAgfHwgZWxZIDwgMCB8fCBlbFggPiB3aWR0aCB8fCBlbFkgPiBoZWlnaHQ7XG5cdFx0XHRpZiAoaGFuZGxlT3V0c2lkZSB8fCAhaXNPdXRzaWRlLnZhbHVlKSB7XG5cdFx0XHRcdGVsZW1lbnRYLnZhbHVlID0gZWxYO1xuXHRcdFx0XHRlbGVtZW50WS52YWx1ZSA9IGVsWTtcblx0XHRcdH1cblx0XHRcdGlmICghaXNPdXRzaWRlLnZhbHVlKSBicmVhaztcblx0XHR9XG5cdH1cblx0Y29uc3Qgc3RvcEZuTGlzdCA9IFtdO1xuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdHN0b3BGbkxpc3QuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRcdHN0b3BGbkxpc3QubGVuZ3RoID0gMDtcblx0fVxuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdHVwZGF0ZSgpO1xuXHR9KTtcblx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0Y29uc3QgeyBzdG9wOiBzdG9wUmVzaXplT2JzZXJ2ZXIgfSA9IHVzZVJlc2l6ZU9ic2VydmVyKHRhcmdldFJlZiwgdXBkYXRlKTtcblx0XHRjb25zdCB7IHN0b3A6IHN0b3BNdXRhdGlvbk9ic2VydmVyIH0gPSB1c2VNdXRhdGlvbk9ic2VydmVyKHRhcmdldFJlZiwgdXBkYXRlLCB7IGF0dHJpYnV0ZUZpbHRlcjogW1wic3R5bGVcIiwgXCJjbGFzc1wiXSB9KTtcblx0XHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaChbXG5cdFx0XHR0YXJnZXRSZWYsXG5cdFx0XHR4LFxuXHRcdFx0eVxuXHRcdF0sIHVwZGF0ZSk7XG5cdFx0c3RvcEZuTGlzdC5wdXNoKHN0b3BSZXNpemVPYnNlcnZlciwgc3RvcE11dGF0aW9uT2JzZXJ2ZXIsIHN0b3BXYXRjaCk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJtb3VzZWxlYXZlXCIsICgpID0+IGlzT3V0c2lkZS52YWx1ZSA9IHRydWUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHRpZiAod2luZG93U2Nyb2xsKSBzdG9wRm5MaXN0LnB1c2godXNlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB1cGRhdGUsIHtcblx0XHRcdGNhcHR1cmU6IHRydWUsXG5cdFx0XHRwYXNzaXZlOiB0cnVlXG5cdFx0fSkpO1xuXHRcdGlmICh3aW5kb3dSZXNpemUpIHN0b3BGbkxpc3QucHVzaCh1c2VFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHgsXG5cdFx0eSxcblx0XHRzb3VyY2VUeXBlLFxuXHRcdGVsZW1lbnRYLFxuXHRcdGVsZW1lbnRZLFxuXHRcdGVsZW1lbnRQb3NpdGlvblgsXG5cdFx0ZWxlbWVudFBvc2l0aW9uWSxcblx0XHRlbGVtZW50SGVpZ2h0LFxuXHRcdGVsZW1lbnRXaWR0aCxcblx0XHRpc091dHNpZGUsXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNb3VzZVByZXNzZWQvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBtb3VzZSBwcmVzc2luZyBzdGF0ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTW91c2VQcmVzc2VkXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTW91c2VQcmVzc2VkKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRvdWNoID0gdHJ1ZSwgZHJhZyA9IHRydWUsIGNhcHR1cmUgPSBmYWxzZSwgaW5pdGlhbFZhbHVlID0gZmFsc2UsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBwcmVzc2VkID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBzb3VyY2VUeXBlID0gc2hhbGxvd1JlZihudWxsKTtcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHtcblx0XHRwcmVzc2VkLFxuXHRcdHNvdXJjZVR5cGVcblx0fTtcblx0Y29uc3Qgb25QcmVzc2VkID0gKHNyY1R5cGUpID0+IChldmVudCkgPT4ge1xuXHRcdHZhciBfb3B0aW9ucyRvblByZXNzZWQ7XG5cdFx0cHJlc3NlZC52YWx1ZSA9IHRydWU7XG5cdFx0c291cmNlVHlwZS52YWx1ZSA9IHNyY1R5cGU7XG5cdFx0KF9vcHRpb25zJG9uUHJlc3NlZCA9IG9wdGlvbnMub25QcmVzc2VkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblByZXNzZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvblByZXNzZWQuY2FsbChvcHRpb25zLCBldmVudCk7XG5cdH07XG5cdGNvbnN0IG9uUmVsZWFzZWQgPSAoZXZlbnQpID0+IHtcblx0XHR2YXIgX29wdGlvbnMkb25SZWxlYXNlZDtcblx0XHRwcmVzc2VkLnZhbHVlID0gZmFsc2U7XG5cdFx0c291cmNlVHlwZS52YWx1ZSA9IG51bGw7XG5cdFx0KF9vcHRpb25zJG9uUmVsZWFzZWQgPSBvcHRpb25zLm9uUmVsZWFzZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uUmVsZWFzZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvblJlbGVhc2VkLmNhbGwob3B0aW9ucywgZXZlbnQpO1xuXHR9O1xuXHRjb25zdCB0YXJnZXQgPSBjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQob3B0aW9ucy50YXJnZXQpIHx8IHdpbmRvdyQxKTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdHBhc3NpdmU6IHRydWUsXG5cdFx0Y2FwdHVyZVxuXHR9O1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJtb3VzZWRvd25cIiwgb25QcmVzc2VkKFwibW91c2VcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwibW91c2VsZWF2ZVwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm1vdXNldXBcIiwgb25SZWxlYXNlZCwgbGlzdGVuZXJPcHRpb25zKTtcblx0aWYgKGRyYWcpIHtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkcmFnc3RhcnRcIiwgb25QcmVzc2VkKFwibW91c2VcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkcm9wXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkcmFnZW5kXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0aWYgKHRvdWNoKSB7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidG91Y2hzdGFydFwiLCBvblByZXNzZWQoXCJ0b3VjaFwiKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInRvdWNoZW5kXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJ0b3VjaGNhbmNlbFwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0cHJlc3NlZCxcblx0XHRzb3VyY2VUeXBlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU5hdmlnYXRvckxhbmd1YWdlL2luZGV4LnRzXG4vKipcbipcbiogUmVhY3RpdmUgdXNlTmF2aWdhdG9yTGFuZ3VhZ2VcbipcbiogRGV0ZWN0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHVzZXIgbGFuZ3VhZ2UgYW5kIHJldHVybnMgYSByZWFjdGl2ZSBsYW5ndWFnZVxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VOYXZpZ2F0b3JMYW5ndWFnZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZU5hdmlnYXRvckxhbmd1YWdlKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBuYXZpZ2F0b3IkMSA9IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5uYXZpZ2F0b3I7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImxhbmd1YWdlXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBsYW5ndWFnZSA9IHNoYWxsb3dSZWYobmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvciQxLmxhbmd1YWdlKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJsYW5ndWFnZWNoYW5nZVwiLCAoKSA9PiB7XG5cdFx0aWYgKG5hdmlnYXRvciQxKSBsYW5ndWFnZS52YWx1ZSA9IG5hdmlnYXRvciQxLmxhbmd1YWdlO1xuXHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0bGFuZ3VhZ2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTmV0d29yay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIE5ldHdvcmsgc3RhdHVzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VOZXR3b3JrXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTmV0d29yayhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgbmF2aWdhdG9yJDEgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEubmF2aWdhdG9yO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJjb25uZWN0aW9uXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBpc09ubGluZSA9IHNoYWxsb3dSZWYodHJ1ZSk7XG5cdGNvbnN0IHNhdmVEYXRhID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IG9mZmxpbmVBdCA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3Qgb25saW5lQXQgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IGRvd25saW5rID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCBkb3dubGlua01heCA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3QgcnR0ID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCBlZmZlY3RpdmVUeXBlID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCB0eXBlID0gc2hhbGxvd1JlZihcInVua25vd25cIik7XG5cdGNvbnN0IGNvbm5lY3Rpb24gPSBpc1N1cHBvcnRlZC52YWx1ZSAmJiBuYXZpZ2F0b3IkMS5jb25uZWN0aW9uO1xuXHRmdW5jdGlvbiB1cGRhdGVOZXR3b3JrSW5mb3JtYXRpb24oKSB7XG5cdFx0aWYgKCFuYXZpZ2F0b3IkMSkgcmV0dXJuO1xuXHRcdGlzT25saW5lLnZhbHVlID0gbmF2aWdhdG9yJDEub25MaW5lO1xuXHRcdG9mZmxpbmVBdC52YWx1ZSA9IGlzT25saW5lLnZhbHVlID8gdm9pZCAwIDogRGF0ZS5ub3coKTtcblx0XHRvbmxpbmVBdC52YWx1ZSA9IGlzT25saW5lLnZhbHVlID8gRGF0ZS5ub3coKSA6IHZvaWQgMDtcblx0XHRpZiAoY29ubmVjdGlvbikge1xuXHRcdFx0ZG93bmxpbmsudmFsdWUgPSBjb25uZWN0aW9uLmRvd25saW5rO1xuXHRcdFx0ZG93bmxpbmtNYXgudmFsdWUgPSBjb25uZWN0aW9uLmRvd25saW5rTWF4O1xuXHRcdFx0ZWZmZWN0aXZlVHlwZS52YWx1ZSA9IGNvbm5lY3Rpb24uZWZmZWN0aXZlVHlwZTtcblx0XHRcdHJ0dC52YWx1ZSA9IGNvbm5lY3Rpb24ucnR0O1xuXHRcdFx0c2F2ZURhdGEudmFsdWUgPSBjb25uZWN0aW9uLnNhdmVEYXRhO1xuXHRcdFx0dHlwZS52YWx1ZSA9IGNvbm5lY3Rpb24udHlwZTtcblx0XHR9XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwib2ZmbGluZVwiLCAoKSA9PiB7XG5cdFx0XHRpc09ubGluZS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0b2ZmbGluZUF0LnZhbHVlID0gRGF0ZS5ub3coKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwib25saW5lXCIsICgpID0+IHtcblx0XHRcdGlzT25saW5lLnZhbHVlID0gdHJ1ZTtcblx0XHRcdG9ubGluZUF0LnZhbHVlID0gRGF0ZS5ub3coKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGlmIChjb25uZWN0aW9uKSB1c2VFdmVudExpc3RlbmVyKGNvbm5lY3Rpb24sIFwiY2hhbmdlXCIsIHVwZGF0ZU5ldHdvcmtJbmZvcm1hdGlvbiwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXBkYXRlTmV0d29ya0luZm9ybWF0aW9uKCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNPbmxpbmU6IHJlYWRvbmx5KGlzT25saW5lKSxcblx0XHRzYXZlRGF0YTogcmVhZG9ubHkoc2F2ZURhdGEpLFxuXHRcdG9mZmxpbmVBdDogcmVhZG9ubHkob2ZmbGluZUF0KSxcblx0XHRvbmxpbmVBdDogcmVhZG9ubHkob25saW5lQXQpLFxuXHRcdGRvd25saW5rOiByZWFkb25seShkb3dubGluayksXG5cdFx0ZG93bmxpbmtNYXg6IHJlYWRvbmx5KGRvd25saW5rTWF4KSxcblx0XHRlZmZlY3RpdmVUeXBlOiByZWFkb25seShlZmZlY3RpdmVUeXBlKSxcblx0XHRydHQ6IHJlYWRvbmx5KHJ0dCksXG5cdFx0dHlwZTogcmVhZG9ubHkodHlwZSlcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTm93L2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDUob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIsIGltbWVkaWF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIGludGVydmFsID09PSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiID8gKGZuKSA9PiB1c2VSYWZGbihmbiwgeyBpbW1lZGlhdGUgfSkgOiAoZm4pID0+IHVzZUludGVydmFsRm4oZm4sIGludGVydmFsLCBvcHRpb25zKTtcblx0fVxuXHRyZXR1cm4gdXNlUmFmRm47XG59XG4vKipcbiogUmVhY3RpdmUgY3VycmVudCBEYXRlIGluc3RhbmNlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VOb3dcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VOb3cob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkNShvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgbm93ID0gcmVmKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4gbm93LnZhbHVlID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG5cdGNvbnN0IGNvbnRyb2xzID0gc2NoZWR1bGVyKHVwZGF0ZSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHRub3csXG5cdFx0Li4uY29udHJvbHNcblx0fTtcblx0ZWxzZSByZXR1cm4gbm93O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VPYmplY3RVcmwvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBVUkwgcmVwcmVzZW50aW5nIGFuIG9iamVjdC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlT2JqZWN0VXJsXG4qIEBwYXJhbSBvYmplY3RcbiovXG5mdW5jdGlvbiB1c2VPYmplY3RVcmwob2JqZWN0KSB7XG5cdGNvbnN0IHVybCA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgcmVsZWFzZSA9ICgpID0+IHtcblx0XHRpZiAodXJsLnZhbHVlKSBVUkwucmV2b2tlT2JqZWN0VVJMKHVybC52YWx1ZSk7XG5cdFx0dXJsLnZhbHVlID0gdm9pZCAwO1xuXHR9O1xuXHR3YXRjaCgoKSA9PiB0b1ZhbHVlKG9iamVjdCksIChuZXdPYmplY3QpID0+IHtcblx0XHRyZWxlYXNlKCk7XG5cdFx0aWYgKG5ld09iamVjdCkgdXJsLnZhbHVlID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXdPYmplY3QpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UocmVsZWFzZSk7XG5cdHJldHVybiByZWFkb25seSh1cmwpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi9tYXRoL3VzZUNsYW1wL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBjbGFtcCBhIHZhbHVlIGJldHdlZW4gdHdvIG90aGVyIHZhbHVlcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQ2xhbXBcbiogQHBhcmFtIHZhbHVlIG51bWJlclxuKiBAcGFyYW0gbWluXG4qIEBwYXJhbSBtYXhcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VDbGFtcCh2YWx1ZSwgbWluLCBtYXgpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8IGlzUmVhZG9ubHkodmFsdWUpKSByZXR1cm4gY29tcHV0ZWQoKCkgPT4gY2xhbXAodG9WYWx1ZSh2YWx1ZSksIHRvVmFsdWUobWluKSwgdG9WYWx1ZShtYXgpKSk7XG5cdGNvbnN0IF92YWx1ZSA9IHJlZih2YWx1ZSk7XG5cdHJldHVybiBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIF92YWx1ZS52YWx1ZSA9IGNsYW1wKF92YWx1ZS52YWx1ZSwgdG9WYWx1ZShtaW4pLCB0b1ZhbHVlKG1heCkpO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlJDEpIHtcblx0XHRcdF92YWx1ZS52YWx1ZSA9IGNsYW1wKHZhbHVlJDEsIHRvVmFsdWUobWluKSwgdG9WYWx1ZShtYXgpKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VPZmZzZXRQYWdpbmF0aW9uL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VPZmZzZXRQYWdpbmF0aW9uKG9wdGlvbnMpIHtcblx0Y29uc3QgeyB0b3RhbCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgcGFnZVNpemUgPSAxMCwgcGFnZSA9IDEsIG9uUGFnZUNoYW5nZSA9IG5vb3AsIG9uUGFnZVNpemVDaGFuZ2UgPSBub29wLCBvblBhZ2VDb3VudENoYW5nZSA9IG5vb3AgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGN1cnJlbnRQYWdlU2l6ZSA9IHVzZUNsYW1wKHBhZ2VTaXplLCAxLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXHRjb25zdCBwYWdlQ291bnQgPSBjb21wdXRlZCgoKSA9PiBNYXRoLm1heCgxLCBNYXRoLmNlaWwodG9WYWx1ZSh0b3RhbCkgLyB0b1ZhbHVlKGN1cnJlbnRQYWdlU2l6ZSkpKSk7XG5cdGNvbnN0IGN1cnJlbnRQYWdlID0gdXNlQ2xhbXAocGFnZSwgMSwgcGFnZUNvdW50KTtcblx0Y29uc3QgaXNGaXJzdFBhZ2UgPSBjb21wdXRlZCgoKSA9PiBjdXJyZW50UGFnZS52YWx1ZSA9PT0gMSk7XG5cdGNvbnN0IGlzTGFzdFBhZ2UgPSBjb21wdXRlZCgoKSA9PiBjdXJyZW50UGFnZS52YWx1ZSA9PT0gcGFnZUNvdW50LnZhbHVlKTtcblx0aWYgKGlzUmVmKHBhZ2UpKSBzeW5jUmVmKHBhZ2UsIGN1cnJlbnRQYWdlLCB7IGRpcmVjdGlvbjogaXNSZWFkb25seShwYWdlKSA/IFwibHRyXCIgOiBcImJvdGhcIiB9KTtcblx0aWYgKGlzUmVmKHBhZ2VTaXplKSkgc3luY1JlZihwYWdlU2l6ZSwgY3VycmVudFBhZ2VTaXplLCB7IGRpcmVjdGlvbjogaXNSZWFkb25seShwYWdlU2l6ZSkgPyBcImx0clwiIDogXCJib3RoXCIgfSk7XG5cdGZ1bmN0aW9uIHByZXYoKSB7XG5cdFx0Y3VycmVudFBhZ2UudmFsdWUtLTtcblx0fVxuXHRmdW5jdGlvbiBuZXh0KCkge1xuXHRcdGN1cnJlbnRQYWdlLnZhbHVlKys7XG5cdH1cblx0Y29uc3QgcmV0dXJuVmFsdWUgPSB7XG5cdFx0Y3VycmVudFBhZ2UsXG5cdFx0Y3VycmVudFBhZ2VTaXplLFxuXHRcdHBhZ2VDb3VudCxcblx0XHRpc0ZpcnN0UGFnZSxcblx0XHRpc0xhc3RQYWdlLFxuXHRcdHByZXYsXG5cdFx0bmV4dFxuXHR9O1xuXHR3YXRjaChjdXJyZW50UGFnZSwgKCkgPT4ge1xuXHRcdG9uUGFnZUNoYW5nZShyZWFjdGl2ZShyZXR1cm5WYWx1ZSkpO1xuXHR9KTtcblx0d2F0Y2goY3VycmVudFBhZ2VTaXplLCAoKSA9PiB7XG5cdFx0b25QYWdlU2l6ZUNoYW5nZShyZWFjdGl2ZShyZXR1cm5WYWx1ZSkpO1xuXHR9KTtcblx0d2F0Y2gocGFnZUNvdW50LCAoKSA9PiB7XG5cdFx0b25QYWdlQ291bnRDaGFuZ2UocmVhY3RpdmUocmV0dXJuVmFsdWUpKTtcblx0fSk7XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlT25saW5lL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgb25saW5lIHN0YXRlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VPbmxpbmVcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VPbmxpbmUob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaXNPbmxpbmUgfSA9IHVzZU5ldHdvcmsob3B0aW9ucyk7XG5cdHJldHVybiBpc09ubGluZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUGFnZUxlYXZlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgc3RhdGUgdG8gc2hvdyB3aGV0aGVyIG1vdXNlIGxlYXZlcyB0aGUgcGFnZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUGFnZUxlYXZlXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlUGFnZUxlYXZlKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0xlZnQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdGlmICghd2luZG93JDEpIHJldHVybjtcblx0XHRldmVudCA9IGV2ZW50IHx8IHdpbmRvdyQxLmV2ZW50O1xuXHRcdGlzTGVmdC52YWx1ZSA9ICEoZXZlbnQucmVsYXRlZFRhcmdldCB8fCBldmVudC50b0VsZW1lbnQpO1xuXHR9O1xuXHRpZiAod2luZG93JDEpIHtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm1vdXNlb3V0XCIsIGhhbmRsZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMS5kb2N1bWVudCwgXCJtb3VzZWxlYXZlXCIsIGhhbmRsZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMS5kb2N1bWVudCwgXCJtb3VzZWVudGVyXCIsIGhhbmRsZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIGlzTGVmdDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2NyZWVuT3JpZW50YXRpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBzY3JlZW4gb3JpZW50YXRpb25cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2NyZWVuT3JpZW50YXRpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VTY3JlZW5PcmllbnRhdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwic2NyZWVuXCIgaW4gd2luZG93JDEgJiYgXCJvcmllbnRhdGlvblwiIGluIHdpbmRvdyQxLnNjcmVlbik7XG5cdGNvbnN0IHNjcmVlbk9yaWVudGF0aW9uID0gaXNTdXBwb3J0ZWQudmFsdWUgPyB3aW5kb3ckMS5zY3JlZW4ub3JpZW50YXRpb24gOiB7fTtcblx0Y29uc3Qgb3JpZW50YXRpb24gPSByZWYoc2NyZWVuT3JpZW50YXRpb24udHlwZSk7XG5cdGNvbnN0IGFuZ2xlID0gc2hhbGxvd1JlZihzY3JlZW5PcmllbnRhdGlvbi5hbmdsZSB8fCAwKTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm9yaWVudGF0aW9uY2hhbmdlXCIsICgpID0+IHtcblx0XHRvcmllbnRhdGlvbi52YWx1ZSA9IHNjcmVlbk9yaWVudGF0aW9uLnR5cGU7XG5cdFx0YW5nbGUudmFsdWUgPSBzY3JlZW5PcmllbnRhdGlvbi5hbmdsZTtcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRjb25zdCBsb2NrT3JpZW50YXRpb24gPSAodHlwZSkgPT4ge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiB0eXBlb2Ygc2NyZWVuT3JpZW50YXRpb24ubG9jayA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gc2NyZWVuT3JpZW50YXRpb24ubG9jayh0eXBlKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIk5vdCBzdXBwb3J0ZWRcIikpO1xuXHR9O1xuXHRjb25zdCB1bmxvY2tPcmllbnRhdGlvbiA9ICgpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdHlwZW9mIHNjcmVlbk9yaWVudGF0aW9uLnVubG9jayA9PT0gXCJmdW5jdGlvblwiKSBzY3JlZW5PcmllbnRhdGlvbi51bmxvY2soKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRvcmllbnRhdGlvbixcblx0XHRhbmdsZSxcblx0XHRsb2NrT3JpZW50YXRpb24sXG5cdFx0dW5sb2NrT3JpZW50YXRpb25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUGFyYWxsYXgvaW5kZXgudHNcbi8qKlxuKiBDcmVhdGUgcGFyYWxsYXggZWZmZWN0IGVhc2lseS4gSXQgdXNlcyBgdXNlRGV2aWNlT3JpZW50YXRpb25gIGFuZCBmYWxsYmFjayB0byBgdXNlTW91c2VgXG4qIGlmIG9yaWVudGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4qXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VQYXJhbGxheCh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRldmljZU9yaWVudGF0aW9uVGlsdEFkanVzdCA9IChpKSA9PiBpLCBkZXZpY2VPcmllbnRhdGlvblJvbGxBZGp1c3QgPSAoaSkgPT4gaSwgbW91c2VUaWx0QWRqdXN0ID0gKGkpID0+IGksIG1vdXNlUm9sbEFkanVzdCA9IChpKSA9PiBpLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3Qgb3JpZW50YXRpb24gPSByZWFjdGl2ZSh1c2VEZXZpY2VPcmllbnRhdGlvbih7IHdpbmRvdzogd2luZG93JDEgfSkpO1xuXHRjb25zdCBzY3JlZW5PcmllbnRhdGlvbiA9IHJlYWN0aXZlKHVzZVNjcmVlbk9yaWVudGF0aW9uKHsgd2luZG93OiB3aW5kb3ckMSB9KSk7XG5cdGNvbnN0IHsgZWxlbWVudFg6IHgsIGVsZW1lbnRZOiB5LCBlbGVtZW50V2lkdGg6IHdpZHRoLCBlbGVtZW50SGVpZ2h0OiBoZWlnaHQgfSA9IHVzZU1vdXNlSW5FbGVtZW50KHRhcmdldCwge1xuXHRcdGhhbmRsZU91dHNpZGU6IGZhbHNlLFxuXHRcdHdpbmRvdzogd2luZG93JDFcblx0fSk7XG5cdGNvbnN0IHNvdXJjZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRpZiAob3JpZW50YXRpb24uaXNTdXBwb3J0ZWQgJiYgKG9yaWVudGF0aW9uLmFscGhhICE9IG51bGwgJiYgb3JpZW50YXRpb24uYWxwaGEgIT09IDAgfHwgb3JpZW50YXRpb24uZ2FtbWEgIT0gbnVsbCAmJiBvcmllbnRhdGlvbi5nYW1tYSAhPT0gMCkpIHJldHVybiBcImRldmljZU9yaWVudGF0aW9uXCI7XG5cdFx0cmV0dXJuIFwibW91c2VcIjtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0cm9sbDogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0aWYgKHNvdXJjZS52YWx1ZSA9PT0gXCJkZXZpY2VPcmllbnRhdGlvblwiKSB7XG5cdFx0XHRcdGxldCB2YWx1ZTtcblx0XHRcdFx0c3dpdGNoIChzY3JlZW5PcmllbnRhdGlvbi5vcmllbnRhdGlvbikge1xuXHRcdFx0XHRcdGNhc2UgXCJsYW5kc2NhcGUtcHJpbWFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSBvcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcImxhbmRzY2FwZS1zZWNvbmRhcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gLW9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwicG9ydHJhaXQtcHJpbWFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSAtb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInBvcnRyYWl0LXNlY29uZGFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSBvcmllbnRhdGlvbi5iZXRhIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiB2YWx1ZSA9IC1vcmllbnRhdGlvbi5iZXRhIC8gOTA7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGRldmljZU9yaWVudGF0aW9uUm9sbEFkanVzdCh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgcmV0dXJuIG1vdXNlUm9sbEFkanVzdCgtKHkudmFsdWUgLSBoZWlnaHQudmFsdWUgLyAyKSAvIGhlaWdodC52YWx1ZSk7XG5cdFx0fSksXG5cdFx0dGlsdDogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0aWYgKHNvdXJjZS52YWx1ZSA9PT0gXCJkZXZpY2VPcmllbnRhdGlvblwiKSB7XG5cdFx0XHRcdGxldCB2YWx1ZTtcblx0XHRcdFx0c3dpdGNoIChzY3JlZW5PcmllbnRhdGlvbi5vcmllbnRhdGlvbikge1xuXHRcdFx0XHRcdGNhc2UgXCJsYW5kc2NhcGUtcHJpbWFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSBvcmllbnRhdGlvbi5iZXRhIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwibGFuZHNjYXBlLXNlY29uZGFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSAtb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInBvcnRyYWl0LXByaW1hcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gb3JpZW50YXRpb24uZ2FtbWEgLyA5MDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJwb3J0cmFpdC1zZWNvbmRhcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gLW9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiB2YWx1ZSA9IG9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGRldmljZU9yaWVudGF0aW9uVGlsdEFkanVzdCh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgcmV0dXJuIG1vdXNlVGlsdEFkanVzdCgoeC52YWx1ZSAtIHdpZHRoLnZhbHVlIC8gMikgLyB3aWR0aC52YWx1ZSk7XG5cdFx0fSksXG5cdFx0c291cmNlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBhcmVudEVsZW1lbnQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVBhcmVudEVsZW1lbnQoZWxlbWVudCA9IHVzZUN1cnJlbnRFbGVtZW50KCkpIHtcblx0Y29uc3QgcGFyZW50RWxlbWVudCA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KGVsZW1lbnQpO1xuXHRcdGlmIChlbCkgcGFyZW50RWxlbWVudC52YWx1ZSA9IGVsLnBhcmVudEVsZW1lbnQ7XG5cdH07XG5cdHRyeU9uTW91bnRlZCh1cGRhdGUpO1xuXHR3YXRjaCgoKSA9PiB0b1ZhbHVlKGVsZW1lbnQpLCB1cGRhdGUpO1xuXHRyZXR1cm4gcGFyZW50RWxlbWVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUGVyZm9ybWFuY2VPYnNlcnZlci9pbmRleC50c1xuLyoqXG4qIE9ic2VydmUgcGVyZm9ybWFuY2UgbWV0cmljcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUGVyZm9ybWFuY2VPYnNlcnZlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVBlcmZvcm1hbmNlT2JzZXJ2ZXIob3B0aW9ucywgY2FsbGJhY2spIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaW1tZWRpYXRlID0gdHJ1ZSwuLi5wZXJmb3JtYW5jZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcIlBlcmZvcm1hbmNlT2JzZXJ2ZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGxldCBvYnNlcnZlcjtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRvYnNlcnZlciA9PT0gbnVsbCB8fCBvYnNlcnZlciA9PT0gdm9pZCAwIHx8IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0fTtcblx0Y29uc3Qgc3RhcnQgPSAoKSA9PiB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0XHRzdG9wKCk7XG5cdFx0XHRvYnNlcnZlciA9IG5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGNhbGxiYWNrKTtcblx0XHRcdG9ic2VydmVyLm9ic2VydmUocGVyZm9ybWFuY2VPcHRpb25zKTtcblx0XHR9XG5cdH07XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHN0b3ApO1xuXHRpZiAoaW1tZWRpYXRlKSBzdGFydCgpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUG9pbnRlci9pbmRleC50c1xuY29uc3QgZGVmYXVsdFN0YXRlID0ge1xuXHR4OiAwLFxuXHR5OiAwLFxuXHRwb2ludGVySWQ6IDAsXG5cdHByZXNzdXJlOiAwLFxuXHR0aWx0WDogMCxcblx0dGlsdFk6IDAsXG5cdHdpZHRoOiAwLFxuXHRoZWlnaHQ6IDAsXG5cdHR3aXN0OiAwLFxuXHRwb2ludGVyVHlwZTogbnVsbFxufTtcbmNvbnN0IGtleXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmtleXMoZGVmYXVsdFN0YXRlKTtcbi8qKlxuKiBSZWFjdGl2ZSBwb2ludGVyIHN0YXRlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQb2ludGVyXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlUG9pbnRlcihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0YXJnZXQgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0luc2lkZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzdGF0ZSA9IHNoYWxsb3dSZWYob3B0aW9ucy5pbml0aWFsVmFsdWUgfHwge30pO1xuXHRPYmplY3QuYXNzaWduKHN0YXRlLnZhbHVlLCBkZWZhdWx0U3RhdGUsIHN0YXRlLnZhbHVlKTtcblx0Y29uc3QgaGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdGlzSW5zaWRlLnZhbHVlID0gdHJ1ZTtcblx0XHRpZiAob3B0aW9ucy5wb2ludGVyVHlwZXMgJiYgIW9wdGlvbnMucG9pbnRlclR5cGVzLmluY2x1ZGVzKGV2ZW50LnBvaW50ZXJUeXBlKSkgcmV0dXJuO1xuXHRcdHN0YXRlLnZhbHVlID0gb2JqZWN0UGljayhldmVudCwga2V5cywgZmFsc2UpO1xuXHR9O1xuXHRpZiAodGFyZ2V0KSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcblx0XHRcdFwicG9pbnRlcmRvd25cIixcblx0XHRcdFwicG9pbnRlcm1vdmVcIixcblx0XHRcdFwicG9pbnRlcnVwXCJcblx0XHRdLCBoYW5kbGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBvaW50ZXJsZWF2ZVwiLCAoKSA9PiBpc0luc2lkZS52YWx1ZSA9IGZhbHNlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0Li4udG9SZWZzKHN0YXRlKSxcblx0XHRpc0luc2lkZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQb2ludGVyTG9jay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHBvaW50ZXIgbG9jay5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUG9pbnRlckxvY2tcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVBvaW50ZXJMb2NrKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBkb2N1bWVudCQxICYmIFwicG9pbnRlckxvY2tFbGVtZW50XCIgaW4gZG9jdW1lbnQkMSk7XG5cdGNvbnN0IGVsZW1lbnQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHRyaWdnZXJFbGVtZW50ID0gc2hhbGxvd1JlZigpO1xuXHRsZXQgdGFyZ2V0RWxlbWVudDtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInBvaW50ZXJsb2NrY2hhbmdlXCIsICgpID0+IHtcblx0XHRcdHZhciBfcG9pbnRlckxvY2tFbGVtZW50O1xuXHRcdFx0Y29uc3QgY3VycmVudEVsZW1lbnQgPSAoX3BvaW50ZXJMb2NrRWxlbWVudCA9IGRvY3VtZW50JDEucG9pbnRlckxvY2tFbGVtZW50KSAhPT0gbnVsbCAmJiBfcG9pbnRlckxvY2tFbGVtZW50ICE9PSB2b2lkIDAgPyBfcG9pbnRlckxvY2tFbGVtZW50IDogZWxlbWVudC52YWx1ZTtcblx0XHRcdGlmICh0YXJnZXRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ID09PSB0YXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdGVsZW1lbnQudmFsdWUgPSBkb2N1bWVudCQxLnBvaW50ZXJMb2NrRWxlbWVudDtcblx0XHRcdFx0aWYgKCFlbGVtZW50LnZhbHVlKSB0YXJnZXRFbGVtZW50ID0gdHJpZ2dlckVsZW1lbnQudmFsdWUgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInBvaW50ZXJsb2NrZXJyb3JcIiwgKCkgPT4ge1xuXHRcdFx0dmFyIF9wb2ludGVyTG9ja0VsZW1lbnQyO1xuXHRcdFx0Y29uc3QgY3VycmVudEVsZW1lbnQgPSAoX3BvaW50ZXJMb2NrRWxlbWVudDIgPSBkb2N1bWVudCQxLnBvaW50ZXJMb2NrRWxlbWVudCkgIT09IG51bGwgJiYgX3BvaW50ZXJMb2NrRWxlbWVudDIgIT09IHZvaWQgMCA/IF9wb2ludGVyTG9ja0VsZW1lbnQyIDogZWxlbWVudC52YWx1ZTtcblx0XHRcdGlmICh0YXJnZXRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ID09PSB0YXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdGNvbnN0IGFjdGlvbiA9IGRvY3VtZW50JDEucG9pbnRlckxvY2tFbGVtZW50ID8gXCJyZWxlYXNlXCIgOiBcImFjcXVpcmVcIjtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gJHthY3Rpb259IHBvaW50ZXIgbG9jay5gKTtcblx0XHRcdH1cblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGxvY2soZSkge1xuXHRcdHZhciBfdW5yZWZFbGVtZW50O1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHRocm93IG5ldyBFcnJvcihcIlBvaW50ZXIgTG9jayBBUEkgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuXCIpO1xuXHRcdHRyaWdnZXJFbGVtZW50LnZhbHVlID0gZSBpbnN0YW5jZW9mIEV2ZW50ID8gZS5jdXJyZW50VGFyZ2V0IDogbnVsbDtcblx0XHR0YXJnZXRFbGVtZW50ID0gZSBpbnN0YW5jZW9mIEV2ZW50ID8gKF91bnJlZkVsZW1lbnQgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KSkgIT09IG51bGwgJiYgX3VucmVmRWxlbWVudCAhPT0gdm9pZCAwID8gX3VucmVmRWxlbWVudCA6IHRyaWdnZXJFbGVtZW50LnZhbHVlIDogdW5yZWZFbGVtZW50KGUpO1xuXHRcdGlmICghdGFyZ2V0RWxlbWVudCkgdGhyb3cgbmV3IEVycm9yKFwiVGFyZ2V0IGVsZW1lbnQgdW5kZWZpbmVkLlwiKTtcblx0XHR0YXJnZXRFbGVtZW50LnJlcXVlc3RQb2ludGVyTG9jaygpO1xuXHRcdHJldHVybiBhd2FpdCB1bnRpbChlbGVtZW50KS50b0JlKHRhcmdldEVsZW1lbnQpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHVubG9jaygpIHtcblx0XHRpZiAoIWVsZW1lbnQudmFsdWUpIHJldHVybiBmYWxzZTtcblx0XHRkb2N1bWVudCQxLmV4aXRQb2ludGVyTG9jaygpO1xuXHRcdGF3YWl0IHVudGlsKGVsZW1lbnQpLnRvQmVOdWxsKCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRlbGVtZW50LFxuXHRcdHRyaWdnZXJFbGVtZW50LFxuXHRcdGxvY2ssXG5cdFx0dW5sb2NrXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBvaW50ZXJTd2lwZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHN3aXBlIGRldGVjdGlvbiBiYXNlZCBvbiBQb2ludGVyRXZlbnRzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQb2ludGVyU3dpcGVcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVBvaW50ZXJTd2lwZSh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB0YXJnZXRSZWYgPSB0b1JlZih0YXJnZXQpO1xuXHRjb25zdCB7IHRocmVzaG9sZCA9IDUwLCBvblN3aXBlLCBvblN3aXBlRW5kLCBvblN3aXBlU3RhcnQsIGRpc2FibGVUZXh0U2VsZWN0ID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHBvc1N0YXJ0ID0gcmVhY3RpdmUoe1xuXHRcdHg6IDAsXG5cdFx0eTogMFxuXHR9KTtcblx0Y29uc3QgdXBkYXRlUG9zU3RhcnQgPSAoeCwgeSkgPT4ge1xuXHRcdHBvc1N0YXJ0LnggPSB4O1xuXHRcdHBvc1N0YXJ0LnkgPSB5O1xuXHR9O1xuXHRjb25zdCBwb3NFbmQgPSByZWFjdGl2ZSh7XG5cdFx0eDogMCxcblx0XHR5OiAwXG5cdH0pO1xuXHRjb25zdCB1cGRhdGVQb3NFbmQgPSAoeCwgeSkgPT4ge1xuXHRcdHBvc0VuZC54ID0geDtcblx0XHRwb3NFbmQueSA9IHk7XG5cdH07XG5cdGNvbnN0IGRpc3RhbmNlWCA9IGNvbXB1dGVkKCgpID0+IHBvc1N0YXJ0LnggLSBwb3NFbmQueCk7XG5cdGNvbnN0IGRpc3RhbmNlWSA9IGNvbXB1dGVkKCgpID0+IHBvc1N0YXJ0LnkgLSBwb3NFbmQueSk7XG5cdGNvbnN0IHsgbWF4LCBhYnMgfSA9IE1hdGg7XG5cdGNvbnN0IGlzVGhyZXNob2xkRXhjZWVkZWQgPSBjb21wdXRlZCgoKSA9PiBtYXgoYWJzKGRpc3RhbmNlWC52YWx1ZSksIGFicyhkaXN0YW5jZVkudmFsdWUpKSA+PSB0aHJlc2hvbGQpO1xuXHRjb25zdCBpc1N3aXBpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaXNQb2ludGVyRG93biA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBkaXJlY3Rpb24gPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKCFpc1RocmVzaG9sZEV4Y2VlZGVkLnZhbHVlKSByZXR1cm4gXCJub25lXCI7XG5cdFx0aWYgKGFicyhkaXN0YW5jZVgudmFsdWUpID4gYWJzKGRpc3RhbmNlWS52YWx1ZSkpIHJldHVybiBkaXN0YW5jZVgudmFsdWUgPiAwID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCI7XG5cdFx0ZWxzZSByZXR1cm4gZGlzdGFuY2VZLnZhbHVlID4gMCA/IFwidXBcIiA6IFwiZG93blwiO1xuXHR9KTtcblx0Y29uc3QgZXZlbnRJc0FsbG93ZWQgPSAoZSkgPT4ge1xuXHRcdHZhciBfcmVmLCBfb3B0aW9ucyRwb2ludGVyVHlwZXMsIF9vcHRpb25zJHBvaW50ZXJUeXBlczI7XG5cdFx0Y29uc3QgaXNSZWxlYXNpbmdCdXR0b24gPSBlLmJ1dHRvbnMgPT09IDA7XG5cdFx0Y29uc3QgaXNQcmltYXJ5QnV0dG9uID0gZS5idXR0b25zID09PSAxO1xuXHRcdHJldHVybiAoX3JlZiA9IChfb3B0aW9ucyRwb2ludGVyVHlwZXMgPSAoX29wdGlvbnMkcG9pbnRlclR5cGVzMiA9IG9wdGlvbnMucG9pbnRlclR5cGVzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRwb2ludGVyVHlwZXMyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRwb2ludGVyVHlwZXMyLmluY2x1ZGVzKGUucG9pbnRlclR5cGUpKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRwb2ludGVyVHlwZXMgIT09IHZvaWQgMCA/IF9vcHRpb25zJHBvaW50ZXJUeXBlcyA6IGlzUmVsZWFzaW5nQnV0dG9uIHx8IGlzUHJpbWFyeUJ1dHRvbikgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IHRydWU7XG5cdH07XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRjb25zdCBzdG9wcyA9IFtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwb2ludGVyZG93blwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKCFldmVudElzQWxsb3dlZChlKSkgcmV0dXJuO1xuXHRcdFx0aXNQb2ludGVyRG93bi52YWx1ZSA9IHRydWU7XG5cdFx0XHRjb25zdCBldmVudFRhcmdldCA9IGUudGFyZ2V0O1xuXHRcdFx0ZXZlbnRUYXJnZXQgPT09IG51bGwgfHwgZXZlbnRUYXJnZXQgPT09IHZvaWQgMCB8fCBldmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG5cdFx0XHRjb25zdCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSA9IGU7XG5cdFx0XHR1cGRhdGVQb3NTdGFydCh4LCB5KTtcblx0XHRcdHVwZGF0ZVBvc0VuZCh4LCB5KTtcblx0XHRcdG9uU3dpcGVTdGFydCA9PT0gbnVsbCB8fCBvblN3aXBlU3RhcnQgPT09IHZvaWQgMCB8fCBvblN3aXBlU3RhcnQoZSk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwb2ludGVybW92ZVwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKCFldmVudElzQWxsb3dlZChlKSkgcmV0dXJuO1xuXHRcdFx0aWYgKCFpc1BvaW50ZXJEb3duLnZhbHVlKSByZXR1cm47XG5cdFx0XHRjb25zdCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSA9IGU7XG5cdFx0XHR1cGRhdGVQb3NFbmQoeCwgeSk7XG5cdFx0XHRpZiAoIWlzU3dpcGluZy52YWx1ZSAmJiBpc1RocmVzaG9sZEV4Y2VlZGVkLnZhbHVlKSBpc1N3aXBpbmcudmFsdWUgPSB0cnVlO1xuXHRcdFx0aWYgKGlzU3dpcGluZy52YWx1ZSkgb25Td2lwZSA9PT0gbnVsbCB8fCBvblN3aXBlID09PSB2b2lkIDAgfHwgb25Td2lwZShlKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBvaW50ZXJ1cFwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKCFldmVudElzQWxsb3dlZChlKSkgcmV0dXJuO1xuXHRcdFx0aWYgKGlzU3dpcGluZy52YWx1ZSkgb25Td2lwZUVuZCA9PT0gbnVsbCB8fCBvblN3aXBlRW5kID09PSB2b2lkIDAgfHwgb25Td2lwZUVuZChlLCBkaXJlY3Rpb24udmFsdWUpO1xuXHRcdFx0aXNQb2ludGVyRG93bi52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0aXNTd2lwaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKVxuXHRdO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdHZhciBfdGFyZ2V0UmVmJHZhbHVlO1xuXHRcdChfdGFyZ2V0UmVmJHZhbHVlID0gdGFyZ2V0UmVmLnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWUgPSBfdGFyZ2V0UmVmJHZhbHVlLnN0eWxlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZS5zZXRQcm9wZXJ0eShcInRvdWNoLWFjdGlvblwiLCBcInBhbi15XCIpO1xuXHRcdGlmIChkaXNhYmxlVGV4dFNlbGVjdCkge1xuXHRcdFx0dmFyIF90YXJnZXRSZWYkdmFsdWUyLCBfdGFyZ2V0UmVmJHZhbHVlMywgX3RhcmdldFJlZiR2YWx1ZTQ7XG5cdFx0XHQoX3RhcmdldFJlZiR2YWx1ZTIgPSB0YXJnZXRSZWYudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWUyID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWUyID0gX3RhcmdldFJlZiR2YWx1ZTIuc3R5bGUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWUyID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZTIuc2V0UHJvcGVydHkoXCItd2Via2l0LXVzZXItc2VsZWN0XCIsIFwibm9uZVwiKTtcblx0XHRcdChfdGFyZ2V0UmVmJHZhbHVlMyA9IHRhcmdldFJlZi52YWx1ZSkgPT09IG51bGwgfHwgX3RhcmdldFJlZiR2YWx1ZTMgPT09IHZvaWQgMCB8fCAoX3RhcmdldFJlZiR2YWx1ZTMgPSBfdGFyZ2V0UmVmJHZhbHVlMy5zdHlsZSkgPT09IG51bGwgfHwgX3RhcmdldFJlZiR2YWx1ZTMgPT09IHZvaWQgMCB8fCBfdGFyZ2V0UmVmJHZhbHVlMy5zZXRQcm9wZXJ0eShcIi1tcy11c2VyLXNlbGVjdFwiLCBcIm5vbmVcIik7XG5cdFx0XHQoX3RhcmdldFJlZiR2YWx1ZTQgPSB0YXJnZXRSZWYudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWU0ID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWU0ID0gX3RhcmdldFJlZiR2YWx1ZTQuc3R5bGUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWU0ID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZTQuc2V0UHJvcGVydHkoXCJ1c2VyLXNlbGVjdFwiLCBcIm5vbmVcIik7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHN0b3BzLmZvckVhY2goKHMpID0+IHMoKSk7XG5cdHJldHVybiB7XG5cdFx0aXNTd2lwaW5nOiByZWFkb25seShpc1N3aXBpbmcpLFxuXHRcdGRpcmVjdGlvbjogcmVhZG9ubHkoZGlyZWN0aW9uKSxcblx0XHRwb3NTdGFydDogcmVhZG9ubHkocG9zU3RhcnQpLFxuXHRcdHBvc0VuZDogcmVhZG9ubHkocG9zRW5kKSxcblx0XHRkaXN0YW5jZVgsXG5cdFx0ZGlzdGFuY2VZLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkQ29sb3JTY2hlbWUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBwcmVmZXJzLWNvbG9yLXNjaGVtZSBtZWRpYSBxdWVyeS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUHJlZmVycmVkQ29sb3JTY2hlbWVcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZENvbG9yU2NoZW1lKG9wdGlvbnMpIHtcblx0Y29uc3QgaXNMaWdodCA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KVwiLCBvcHRpb25zKTtcblx0Y29uc3QgaXNEYXJrID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzRGFyay52YWx1ZSkgcmV0dXJuIFwiZGFya1wiO1xuXHRcdGlmIChpc0xpZ2h0LnZhbHVlKSByZXR1cm4gXCJsaWdodFwiO1xuXHRcdHJldHVybiBcIm5vLXByZWZlcmVuY2VcIjtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZENvbnRyYXN0L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgcHJlZmVycy1jb250cmFzdCBtZWRpYSBxdWVyeS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUHJlZmVycmVkQ29udHJhc3RcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZENvbnRyYXN0KG9wdGlvbnMpIHtcblx0Y29uc3QgaXNNb3JlID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbnRyYXN0OiBtb3JlKVwiLCBvcHRpb25zKTtcblx0Y29uc3QgaXNMZXNzID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbnRyYXN0OiBsZXNzKVwiLCBvcHRpb25zKTtcblx0Y29uc3QgaXNDdXN0b20gPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtY29udHJhc3Q6IGN1c3RvbSlcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzTW9yZS52YWx1ZSkgcmV0dXJuIFwibW9yZVwiO1xuXHRcdGlmIChpc0xlc3MudmFsdWUpIHJldHVybiBcImxlc3NcIjtcblx0XHRpZiAoaXNDdXN0b20udmFsdWUpIHJldHVybiBcImN1c3RvbVwiO1xuXHRcdHJldHVybiBcIm5vLXByZWZlcmVuY2VcIjtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZExhbmd1YWdlcy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIE5hdmlnYXRvciBMYW5ndWFnZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZExhbmd1YWdlc1xuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZExhbmd1YWdlcyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHNoYWxsb3dSZWYoW1wiZW5cIl0pO1xuXHRjb25zdCBuYXZpZ2F0b3IkMSA9IHdpbmRvdyQxLm5hdmlnYXRvcjtcblx0Y29uc3QgdmFsdWUgPSBzaGFsbG93UmVmKG5hdmlnYXRvciQxLmxhbmd1YWdlcyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwibGFuZ3VhZ2VjaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdHZhbHVlLnZhbHVlID0gbmF2aWdhdG9yJDEubGFuZ3VhZ2VzO1xuXHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkUmVkdWNlZE1vdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHByZWZlcnMtcmVkdWNlZC1tb3Rpb24gbWVkaWEgcXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZFJlZHVjZWRNb3Rpb25cbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZFJlZHVjZWRNb3Rpb24ob3B0aW9ucykge1xuXHRjb25zdCBpc1JlZHVjZWQgPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSlcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzUmVkdWNlZC52YWx1ZSkgcmV0dXJuIFwicmVkdWNlXCI7XG5cdFx0cmV0dXJuIFwibm8tcHJlZmVyZW5jZVwiO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkUmVkdWNlZFRyYW5zcGFyZW5jeS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHByZWZlcnMtcmVkdWNlZC10cmFuc3BhcmVuY3kgbWVkaWEgcXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZFJlZHVjZWRUcmFuc3BhcmVuY3lcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZFJlZHVjZWRUcmFuc3BhcmVuY3kob3B0aW9ucykge1xuXHRjb25zdCBpc1JlZHVjZWQgPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtcmVkdWNlZC10cmFuc3BhcmVuY3k6IHJlZHVjZSlcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzUmVkdWNlZC52YWx1ZSkgcmV0dXJuIFwicmVkdWNlXCI7XG5cdFx0cmV0dXJuIFwibm8tcHJlZmVyZW5jZVwiO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJldmlvdXMvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVByZXZpb3VzKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcblx0Y29uc3QgcHJldmlvdXMgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdHdhdGNoKHRvUmVmKHZhbHVlKSwgKF8sIG9sZFZhbHVlKSA9PiB7XG5cdFx0cHJldmlvdXMudmFsdWUgPSBvbGRWYWx1ZTtcblx0fSwgeyBmbHVzaDogXCJzeW5jXCIgfSk7XG5cdHJldHVybiByZWFkb25seShwcmV2aW91cyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNjcmVlblNhZmVBcmVhL2luZGV4LnRzXG5jb25zdCB0b3BWYXJOYW1lID0gXCItLXZ1ZXVzZS1zYWZlLWFyZWEtdG9wXCI7XG5jb25zdCByaWdodFZhck5hbWUgPSBcIi0tdnVldXNlLXNhZmUtYXJlYS1yaWdodFwiO1xuY29uc3QgYm90dG9tVmFyTmFtZSA9IFwiLS12dWV1c2Utc2FmZS1hcmVhLWJvdHRvbVwiO1xuY29uc3QgbGVmdFZhck5hbWUgPSBcIi0tdnVldXNlLXNhZmUtYXJlYS1sZWZ0XCI7XG4vKipcbiogUmVhY3RpdmUgYGVudihzYWZlLWFyZWEtaW5zZXQtKilgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcmVlblNhZmVBcmVhXG4qL1xuZnVuY3Rpb24gdXNlU2NyZWVuU2FmZUFyZWEoKSB7XG5cdGNvbnN0IHRvcCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IHJpZ2h0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgYm90dG9tID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgbGVmdCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGlmIChpc0NsaWVudCkge1xuXHRcdGNvbnN0IHRvcENzc1ZhciA9IHVzZUNzc1Zhcih0b3BWYXJOYW1lKTtcblx0XHRjb25zdCByaWdodENzc1ZhciA9IHVzZUNzc1ZhcihyaWdodFZhck5hbWUpO1xuXHRcdGNvbnN0IGJvdHRvbUNzc1ZhciA9IHVzZUNzc1Zhcihib3R0b21WYXJOYW1lKTtcblx0XHRjb25zdCBsZWZ0Q3NzVmFyID0gdXNlQ3NzVmFyKGxlZnRWYXJOYW1lKTtcblx0XHR0b3BDc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpXCI7XG5cdFx0cmlnaHRDc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtcmlnaHQsIDBweClcIjtcblx0XHRib3R0b21Dc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwcHgpXCI7XG5cdFx0bGVmdENzc1Zhci52YWx1ZSA9IFwiZW52KHNhZmUtYXJlYS1pbnNldC1sZWZ0LCAwcHgpXCI7XG5cdFx0dHJ5T25Nb3VudGVkKHVwZGF0ZSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1c2VEZWJvdW5jZUZuKHVwZGF0ZSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGUoKSB7XG5cdFx0dG9wLnZhbHVlID0gZ2V0VmFsdWUodG9wVmFyTmFtZSk7XG5cdFx0cmlnaHQudmFsdWUgPSBnZXRWYWx1ZShyaWdodFZhck5hbWUpO1xuXHRcdGJvdHRvbS52YWx1ZSA9IGdldFZhbHVlKGJvdHRvbVZhck5hbWUpO1xuXHRcdGxlZnQudmFsdWUgPSBnZXRWYWx1ZShsZWZ0VmFyTmFtZSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR0b3AsXG5cdFx0cmlnaHQsXG5cdFx0Ym90dG9tLFxuXHRcdGxlZnQsXG5cdFx0dXBkYXRlXG5cdH07XG59XG5mdW5jdGlvbiBnZXRWYWx1ZShwb3NpdGlvbikge1xuXHRyZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUocG9zaXRpb24pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTY3JpcHRUYWcvaW5kZXgudHNcbi8qKlxuKiBBc3luYyBzY3JpcHQgdGFnIGxvYWRpbmcuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcmlwdFRhZ1xuKiBAcGFyYW0gc3JjXG4qIEBwYXJhbSBvbkxvYWRlZFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVNjcmlwdFRhZyhzcmMsIG9uTG9hZGVkID0gbm9vcCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW1tZWRpYXRlID0gdHJ1ZSwgbWFudWFsID0gZmFsc2UsIHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiLCBhc3luYyA9IHRydWUsIGNyb3NzT3JpZ2luLCByZWZlcnJlclBvbGljeSwgbm9Nb2R1bGUsIGRlZmVyLCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgYXR0cnMgPSB7fSwgbm9uY2UgPSB2b2lkIDAgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHNjcmlwdFRhZyA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGxldCBfcHJvbWlzZSA9IG51bGw7XG5cdC8qKlxuXHQqIExvYWQgdGhlIHNjcmlwdCBzcGVjaWZpZWQgdmlhIGBzcmNgLlxuXHQqXG5cdCogQHBhcmFtIHdhaXRGb3JTY3JpcHRMb2FkIFdoZXRoZXIgaWYgdGhlIFByb21pc2Ugc2hvdWxkIHJlc29sdmUgb25jZSB0aGUgXCJsb2FkXCIgZXZlbnQgaXMgZW1pdHRlZCBieSB0aGUgPHNjcmlwdD4gYXR0cmlidXRlLCBvciByaWdodCBhZnRlciBhcHBlbmRpbmcgaXQgdG8gdGhlIERPTS5cblx0KiBAcmV0dXJucyBQcm9taXNlPEhUTUxTY3JpcHRFbGVtZW50PlxuXHQqL1xuXHRjb25zdCBsb2FkU2NyaXB0ID0gKHdhaXRGb3JTY3JpcHRMb2FkKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Y29uc3QgcmVzb2x2ZVdpdGhFbGVtZW50ID0gKGVsJDEpID0+IHtcblx0XHRcdHNjcmlwdFRhZy52YWx1ZSA9IGVsJDE7XG5cdFx0XHRyZXNvbHZlKGVsJDEpO1xuXHRcdFx0cmV0dXJuIGVsJDE7XG5cdFx0fTtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHtcblx0XHRcdHJlc29sdmUoZmFsc2UpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZXQgc2hvdWxkQXBwZW5kID0gZmFsc2U7XG5cdFx0bGV0IGVsID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHt0b1ZhbHVlKHNyYyl9XCJdYCk7XG5cdFx0aWYgKCFlbCkge1xuXHRcdFx0ZWwgPSBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdFx0XHRlbC50eXBlID0gdHlwZTtcblx0XHRcdGVsLmFzeW5jID0gYXN5bmM7XG5cdFx0XHRlbC5zcmMgPSB0b1ZhbHVlKHNyYyk7XG5cdFx0XHRpZiAoZGVmZXIpIGVsLmRlZmVyID0gZGVmZXI7XG5cdFx0XHRpZiAoY3Jvc3NPcmlnaW4pIGVsLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47XG5cdFx0XHRpZiAobm9Nb2R1bGUpIGVsLm5vTW9kdWxlID0gbm9Nb2R1bGU7XG5cdFx0XHRpZiAocmVmZXJyZXJQb2xpY3kpIGVsLnJlZmVycmVyUG9saWN5ID0gcmVmZXJyZXJQb2xpY3k7XG5cdFx0XHRpZiAobm9uY2UpIGVsLm5vbmNlID0gbm9uY2U7XG5cdFx0XHRPYmplY3QuZW50cmllcyhhdHRycykuZm9yRWFjaCgoW25hbWUsIHZhbHVlXSkgPT4gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpO1xuXHRcdFx0c2hvdWxkQXBwZW5kID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKGVsLmhhc0F0dHJpYnV0ZShcImRhdGEtbG9hZGVkXCIpKSByZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwiZXJyb3JcIiwgKGV2ZW50KSA9PiByZWplY3QoZXZlbnQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwiYWJvcnRcIiwgKGV2ZW50KSA9PiByZWplY3QoZXZlbnQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwibG9hZFwiLCAoKSA9PiB7XG5cdFx0XHRlbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxvYWRlZFwiLCBcInRydWVcIik7XG5cdFx0XHRvbkxvYWRlZChlbCk7XG5cdFx0XHRyZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0aWYgKHNob3VsZEFwcGVuZCkgZWwgPSBkb2N1bWVudCQxLmhlYWQuYXBwZW5kQ2hpbGQoZWwpO1xuXHRcdGlmICghd2FpdEZvclNjcmlwdExvYWQpIHJlc29sdmVXaXRoRWxlbWVudChlbCk7XG5cdH0pO1xuXHQvKipcblx0KiBFeHBvc2VkIHNpbmdsZXRvbiB3cmFwcGVyIGZvciBgbG9hZFNjcmlwdGAsIGF2b2lkaW5nIGNhbGxpbmcgaXQgdHdpY2UuXG5cdCpcblx0KiBAcGFyYW0gd2FpdEZvclNjcmlwdExvYWQgV2hldGhlciBpZiB0aGUgUHJvbWlzZSBzaG91bGQgcmVzb2x2ZSBvbmNlIHRoZSBcImxvYWRcIiBldmVudCBpcyBlbWl0dGVkIGJ5IHRoZSA8c2NyaXB0PiBhdHRyaWJ1dGUsIG9yIHJpZ2h0IGFmdGVyIGFwcGVuZGluZyBpdCB0byB0aGUgRE9NLlxuXHQqIEByZXR1cm5zIFByb21pc2U8SFRNTFNjcmlwdEVsZW1lbnQ+XG5cdCovXG5cdGNvbnN0IGxvYWQgPSAod2FpdEZvclNjcmlwdExvYWQgPSB0cnVlKSA9PiB7XG5cdFx0aWYgKCFfcHJvbWlzZSkgX3Byb21pc2UgPSBsb2FkU2NyaXB0KHdhaXRGb3JTY3JpcHRMb2FkKTtcblx0XHRyZXR1cm4gX3Byb21pc2U7XG5cdH07XG5cdC8qKlxuXHQqIFVubG9hZCB0aGUgc2NyaXB0IHNwZWNpZmllZCBieSBgc3JjYC5cblx0Ki9cblx0Y29uc3QgdW5sb2FkID0gKCkgPT4ge1xuXHRcdGlmICghZG9jdW1lbnQkMSkgcmV0dXJuO1xuXHRcdF9wcm9taXNlID0gbnVsbDtcblx0XHRpZiAoc2NyaXB0VGFnLnZhbHVlKSBzY3JpcHRUYWcudmFsdWUgPSBudWxsO1xuXHRcdGNvbnN0IGVsID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHt0b1ZhbHVlKHNyYyl9XCJdYCk7XG5cdFx0aWYgKGVsKSBkb2N1bWVudCQxLmhlYWQucmVtb3ZlQ2hpbGQoZWwpO1xuXHR9O1xuXHRpZiAoaW1tZWRpYXRlICYmICFtYW51YWwpIHRyeU9uTW91bnRlZChsb2FkKTtcblx0aWYgKCFtYW51YWwpIHRyeU9uVW5tb3VudGVkKHVubG9hZCk7XG5cdHJldHVybiB7XG5cdFx0c2NyaXB0VGFnLFxuXHRcdGxvYWQsXG5cdFx0dW5sb2FkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNjcm9sbExvY2svaW5kZXgudHNcbmZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3dTY3JvbGwoZWxlKSB7XG5cdGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlKTtcblx0aWYgKHN0eWxlLm92ZXJmbG93WCA9PT0gXCJzY3JvbGxcIiB8fCBzdHlsZS5vdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHwgc3R5bGUub3ZlcmZsb3dYID09PSBcImF1dG9cIiAmJiBlbGUuY2xpZW50V2lkdGggPCBlbGUuc2Nyb2xsV2lkdGggfHwgc3R5bGUub3ZlcmZsb3dZID09PSBcImF1dG9cIiAmJiBlbGUuY2xpZW50SGVpZ2h0IDwgZWxlLnNjcm9sbEhlaWdodCkgcmV0dXJuIHRydWU7XG5cdGVsc2Uge1xuXHRcdGNvbnN0IHBhcmVudCA9IGVsZS5wYXJlbnROb2RlO1xuXHRcdGlmICghcGFyZW50IHx8IHBhcmVudC50YWdOYW1lID09PSBcIkJPRFlcIikgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjaGVja092ZXJmbG93U2Nyb2xsKHBhcmVudCk7XG5cdH1cbn1cbmZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KHJhd0V2ZW50KSB7XG5cdGNvbnN0IGUgPSByYXdFdmVudCB8fCB3aW5kb3cuZXZlbnQ7XG5cdGNvbnN0IF90YXJnZXQgPSBlLnRhcmdldDtcblx0aWYgKGNoZWNrT3ZlcmZsb3dTY3JvbGwoX3RhcmdldCkpIHJldHVybiBmYWxzZTtcblx0aWYgKGUudG91Y2hlcy5sZW5ndGggPiAxKSByZXR1cm4gdHJ1ZTtcblx0aWYgKGUucHJldmVudERlZmF1bHQpIGUucHJldmVudERlZmF1bHQoKTtcblx0cmV0dXJuIGZhbHNlO1xufVxuY29uc3QgZWxJbml0aWFsT3ZlcmZsb3cgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbi8qKlxuKiBMb2NrIHNjcm9sbGluZyBvZiB0aGUgZWxlbWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2Nyb2xsTG9ja1xuKiBAcGFyYW0gZWxlbWVudFxuKi9cbmZ1bmN0aW9uIHVzZVNjcm9sbExvY2soZWxlbWVudCwgaW5pdGlhbFN0YXRlID0gZmFsc2UpIHtcblx0Y29uc3QgaXNMb2NrZWQgPSBzaGFsbG93UmVmKGluaXRpYWxTdGF0ZSk7XG5cdGxldCBzdG9wVG91Y2hNb3ZlTGlzdGVuZXIgPSBudWxsO1xuXHRsZXQgaW5pdGlhbE92ZXJmbG93ID0gXCJcIjtcblx0d2F0Y2godG9SZWYoZWxlbWVudCksIChlbCkgPT4ge1xuXHRcdGNvbnN0IHRhcmdldCA9IHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWwpKTtcblx0XHRpZiAodGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBlbGUgPSB0YXJnZXQ7XG5cdFx0XHRpZiAoIWVsSW5pdGlhbE92ZXJmbG93LmdldChlbGUpKSBlbEluaXRpYWxPdmVyZmxvdy5zZXQoZWxlLCBlbGUuc3R5bGUub3ZlcmZsb3cpO1xuXHRcdFx0aWYgKGVsZS5zdHlsZS5vdmVyZmxvdyAhPT0gXCJoaWRkZW5cIikgaW5pdGlhbE92ZXJmbG93ID0gZWxlLnN0eWxlLm92ZXJmbG93O1xuXHRcdFx0aWYgKGVsZS5zdHlsZS5vdmVyZmxvdyA9PT0gXCJoaWRkZW5cIikgcmV0dXJuIGlzTG9ja2VkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpc0xvY2tlZC52YWx1ZSkgcmV0dXJuIGVsZS5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0fVxuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0Y29uc3QgbG9jayA9ICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWxlbWVudCkpO1xuXHRcdGlmICghZWwgfHwgaXNMb2NrZWQudmFsdWUpIHJldHVybjtcblx0XHRpZiAoaXNJT1MpIHN0b3BUb3VjaE1vdmVMaXN0ZW5lciA9IHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwidG91Y2htb3ZlXCIsIChlKSA9PiB7XG5cdFx0XHRwcmV2ZW50RGVmYXVsdChlKTtcblx0XHR9LCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXHRcdGVsLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcblx0XHRpc0xvY2tlZC52YWx1ZSA9IHRydWU7XG5cdH07XG5cdGNvbnN0IHVubG9jayA9ICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWxlbWVudCkpO1xuXHRcdGlmICghZWwgfHwgIWlzTG9ja2VkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKGlzSU9TKSBzdG9wVG91Y2hNb3ZlTGlzdGVuZXIgPT09IG51bGwgfHwgc3RvcFRvdWNoTW92ZUxpc3RlbmVyID09PSB2b2lkIDAgfHwgc3RvcFRvdWNoTW92ZUxpc3RlbmVyKCk7XG5cdFx0ZWwuc3R5bGUub3ZlcmZsb3cgPSBpbml0aWFsT3ZlcmZsb3c7XG5cdFx0ZWxJbml0aWFsT3ZlcmZsb3cuZGVsZXRlKGVsKTtcblx0XHRpc0xvY2tlZC52YWx1ZSA9IGZhbHNlO1xuXHR9O1xuXHR0cnlPblNjb3BlRGlzcG9zZSh1bmxvY2spO1xuXHRyZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpc0xvY2tlZC52YWx1ZTtcblx0XHR9LFxuXHRcdHNldCh2KSB7XG5cdFx0XHRpZiAodikgbG9jaygpO1xuXHRcdFx0ZWxzZSB1bmxvY2soKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTZXNzaW9uU3RvcmFnZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFNlc3Npb25TdG9yYWdlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTZXNzaW9uU3RvcmFnZVxuKiBAcGFyYW0ga2V5XG4qIEBwYXJhbSBpbml0aWFsVmFsdWVcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTZXNzaW9uU3RvcmFnZShrZXksIGluaXRpYWxWYWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB1c2VTdG9yYWdlKGtleSwgaW5pdGlhbFZhbHVlLCB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuc2Vzc2lvblN0b3JhZ2UsIG9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTaGFyZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFdlYiBTaGFyZSBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNoYXJlXG4qIEBwYXJhbSBzaGFyZU9wdGlvbnNcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VTaGFyZShzaGFyZU9wdGlvbnMgPSB7fSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IF9uYXZpZ2F0b3IgPSBuYXZpZ2F0b3IkMTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IF9uYXZpZ2F0b3IgJiYgXCJjYW5TaGFyZVwiIGluIF9uYXZpZ2F0b3IpO1xuXHRjb25zdCBzaGFyZSA9IGFzeW5jIChvdmVycmlkZU9wdGlvbnMgPSB7fSkgPT4ge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdFx0Li4udG9WYWx1ZShzaGFyZU9wdGlvbnMpLFxuXHRcdFx0XHQuLi50b1ZhbHVlKG92ZXJyaWRlT3B0aW9ucylcblx0XHRcdH07XG5cdFx0XHRsZXQgZ3JhbnRlZCA9IGZhbHNlO1xuXHRcdFx0aWYgKF9uYXZpZ2F0b3IuY2FuU2hhcmUpIGdyYW50ZWQgPSBfbmF2aWdhdG9yLmNhblNoYXJlKGRhdGEpO1xuXHRcdFx0aWYgKGdyYW50ZWQpIHJldHVybiBfbmF2aWdhdG9yLnNoYXJlKGRhdGEpO1xuXHRcdH1cblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzaGFyZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTb3J0ZWQvaW5kZXgudHNcbmNvbnN0IGRlZmF1bHRTb3J0Rm4gPSAoc291cmNlLCBjb21wYXJlRm4pID0+IHNvdXJjZS5zb3J0KGNvbXBhcmVGbik7XG5jb25zdCBkZWZhdWx0Q29tcGFyZSA9IChhLCBiKSA9PiBhIC0gYjtcbmZ1bmN0aW9uIHVzZVNvcnRlZCguLi5hcmdzKSB7XG5cdGNvbnN0IFtzb3VyY2VdID0gYXJncztcblx0bGV0IGNvbXBhcmVGbiA9IGRlZmF1bHRDb21wYXJlO1xuXHRsZXQgb3B0aW9ucyA9IHt9O1xuXHRpZiAoYXJncy5sZW5ndGggPT09IDIpIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdHZhciBfb3B0aW9ucyRjb21wYXJlRm47XG5cdFx0b3B0aW9ucyA9IGFyZ3NbMV07XG5cdFx0Y29tcGFyZUZuID0gKF9vcHRpb25zJGNvbXBhcmVGbiA9IG9wdGlvbnMuY29tcGFyZUZuKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRjb21wYXJlRm4gIT09IHZvaWQgMCA/IF9vcHRpb25zJGNvbXBhcmVGbiA6IGRlZmF1bHRDb21wYXJlO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBfYXJncyQ7XG5cdFx0Y29tcGFyZUZuID0gKF9hcmdzJCA9IGFyZ3NbMV0pICE9PSBudWxsICYmIF9hcmdzJCAhPT0gdm9pZCAwID8gX2FyZ3MkIDogZGVmYXVsdENvbXBhcmU7XG5cdH1cblx0ZWxzZSBpZiAoYXJncy5sZW5ndGggPiAyKSB7XG5cdFx0dmFyIF9hcmdzJDIsIF9hcmdzJDM7XG5cdFx0Y29tcGFyZUZuID0gKF9hcmdzJDIgPSBhcmdzWzFdKSAhPT0gbnVsbCAmJiBfYXJncyQyICE9PSB2b2lkIDAgPyBfYXJncyQyIDogZGVmYXVsdENvbXBhcmU7XG5cdFx0b3B0aW9ucyA9IChfYXJncyQzID0gYXJnc1syXSkgIT09IG51bGwgJiYgX2FyZ3MkMyAhPT0gdm9pZCAwID8gX2FyZ3MkMyA6IHt9O1xuXHR9XG5cdGNvbnN0IHsgZGlydHkgPSBmYWxzZSwgc29ydEZuID0gZGVmYXVsdFNvcnRGbiB9ID0gb3B0aW9ucztcblx0aWYgKCFkaXJ0eSkgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHNvcnRGbihbLi4udG9WYWx1ZShzb3VyY2UpXSwgY29tcGFyZUZuKSk7XG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRjb25zdCByZXN1bHQgPSBzb3J0Rm4odG9WYWx1ZShzb3VyY2UpLCBjb21wYXJlRm4pO1xuXHRcdGlmIChpc1JlZihzb3VyY2UpKSBzb3VyY2UudmFsdWUgPSByZXN1bHQ7XG5cdFx0ZWxzZSBzb3VyY2Uuc3BsaWNlKDAsIHNvdXJjZS5sZW5ndGgsIC4uLnJlc3VsdCk7XG5cdH0pO1xuXHRyZXR1cm4gc291cmNlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTcGVlY2hSZWNvZ25pdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFNwZWVjaFJlY29nbml0aW9uLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTcGVlY2hSZWNvZ25pdGlvblxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TcGVlY2hSZWNvZ25pdGlvbiBTcGVlY2hSZWNvZ25pdGlvblxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVNwZWVjaFJlY29nbml0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGludGVyaW1SZXN1bHRzID0gdHJ1ZSwgY29udGludW91cyA9IHRydWUsIG1heEFsdGVybmF0aXZlcyA9IDEsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBsYW5nID0gdG9SZWYob3B0aW9ucy5sYW5nIHx8IFwiZW4tVVNcIik7XG5cdGNvbnN0IGlzTGlzdGVuaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGlzRmluYWwgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgcmVzdWx0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGxldCByZWNvZ25pdGlvbjtcblx0Y29uc3Qgc3RhcnQgPSAoKSA9PiB7XG5cdFx0aXNMaXN0ZW5pbmcudmFsdWUgPSB0cnVlO1xuXHR9O1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdGlzTGlzdGVuaW5nLnZhbHVlID0gZmFsc2U7XG5cdH07XG5cdGNvbnN0IHRvZ2dsZSA9ICh2YWx1ZSA9ICFpc0xpc3RlbmluZy52YWx1ZSkgPT4ge1xuXHRcdGlmICh2YWx1ZSkgc3RhcnQoKTtcblx0XHRlbHNlIHN0b3AoKTtcblx0fTtcblx0Y29uc3QgU3BlZWNoUmVjb2duaXRpb24gPSB3aW5kb3ckMSAmJiAod2luZG93JDEuU3BlZWNoUmVjb2duaXRpb24gfHwgd2luZG93JDEud2Via2l0U3BlZWNoUmVjb2duaXRpb24pO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gU3BlZWNoUmVjb2duaXRpb24pO1xuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcblx0XHRyZWNvZ25pdGlvbiA9IG5ldyBTcGVlY2hSZWNvZ25pdGlvbigpO1xuXHRcdHJlY29nbml0aW9uLmNvbnRpbnVvdXMgPSBjb250aW51b3VzO1xuXHRcdHJlY29nbml0aW9uLmludGVyaW1SZXN1bHRzID0gaW50ZXJpbVJlc3VsdHM7XG5cdFx0cmVjb2duaXRpb24ubGFuZyA9IHRvVmFsdWUobGFuZyk7XG5cdFx0cmVjb2duaXRpb24ubWF4QWx0ZXJuYXRpdmVzID0gbWF4QWx0ZXJuYXRpdmVzO1xuXHRcdHJlY29nbml0aW9uLm9uc3RhcnQgPSAoKSA9PiB7XG5cdFx0XHRpc0xpc3RlbmluZy52YWx1ZSA9IHRydWU7XG5cdFx0XHRpc0ZpbmFsLnZhbHVlID0gZmFsc2U7XG5cdFx0fTtcblx0XHR3YXRjaChsYW5nLCAobGFuZyQxKSA9PiB7XG5cdFx0XHRpZiAocmVjb2duaXRpb24gJiYgIWlzTGlzdGVuaW5nLnZhbHVlKSByZWNvZ25pdGlvbi5sYW5nID0gbGFuZyQxO1xuXHRcdH0pO1xuXHRcdHJlY29nbml0aW9uLm9ucmVzdWx0ID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRjb25zdCBjdXJyZW50UmVzdWx0ID0gZXZlbnQucmVzdWx0c1tldmVudC5yZXN1bHRJbmRleF07XG5cdFx0XHRjb25zdCB7IHRyYW5zY3JpcHQgfSA9IGN1cnJlbnRSZXN1bHRbMF07XG5cdFx0XHRpc0ZpbmFsLnZhbHVlID0gY3VycmVudFJlc3VsdC5pc0ZpbmFsO1xuXHRcdFx0cmVzdWx0LnZhbHVlID0gdHJhbnNjcmlwdDtcblx0XHRcdGVycm9yLnZhbHVlID0gdm9pZCAwO1xuXHRcdH07XG5cdFx0cmVjb2duaXRpb24ub25lcnJvciA9IChldmVudCkgPT4ge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBldmVudDtcblx0XHR9O1xuXHRcdHJlY29nbml0aW9uLm9uZW5kID0gKCkgPT4ge1xuXHRcdFx0aXNMaXN0ZW5pbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdHJlY29nbml0aW9uLmxhbmcgPSB0b1ZhbHVlKGxhbmcpO1xuXHRcdH07XG5cdFx0d2F0Y2goaXNMaXN0ZW5pbmcsIChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IHtcblx0XHRcdGlmIChuZXdWYWx1ZSA9PT0gb2xkVmFsdWUpIHJldHVybjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuZXdWYWx1ZSkgcmVjb2duaXRpb24uc3RhcnQoKTtcblx0XHRcdFx0ZWxzZSByZWNvZ25pdGlvbi5zdG9wKCk7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0ZXJyb3IudmFsdWUgPSBlcnI7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHN0b3AoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNMaXN0ZW5pbmcsXG5cdFx0aXNGaW5hbCxcblx0XHRyZWNvZ25pdGlvbixcblx0XHRyZXN1bHQsXG5cdFx0ZXJyb3IsXG5cdFx0dG9nZ2xlLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3BlZWNoU3ludGhlc2lzL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgU3BlZWNoU3ludGhlc2lzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTcGVlY2hTeW50aGVzaXNcbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU3BlZWNoU3ludGhlc2lzIFNwZWVjaFN5bnRoZXNpc1xuKi9cbmZ1bmN0aW9uIHVzZVNwZWVjaFN5bnRoZXNpcyh0ZXh0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBwaXRjaCA9IDEsIHJhdGUgPSAxLCB2b2x1bWUgPSAxLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgb25Cb3VuZGFyeSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgc3ludGggPSB3aW5kb3ckMSAmJiB3aW5kb3ckMS5zcGVlY2hTeW50aGVzaXM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBzeW50aCk7XG5cdGNvbnN0IGlzUGxheWluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzdGF0dXMgPSBzaGFsbG93UmVmKFwiaW5pdFwiKTtcblx0Y29uc3Qgc3Bva2VuVGV4dCA9IHRvUmVmKHRleHQgfHwgXCJcIik7XG5cdGNvbnN0IGxhbmcgPSB0b1JlZihvcHRpb25zLmxhbmcgfHwgXCJlbi1VU1wiKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IHRvZ2dsZSA9ICh2YWx1ZSA9ICFpc1BsYXlpbmcudmFsdWUpID0+IHtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSB2YWx1ZTtcblx0fTtcblx0Y29uc3QgYmluZEV2ZW50c0ZvclV0dGVyYW5jZSA9ICh1dHRlcmFuY2UkMSkgPT4ge1xuXHRcdHV0dGVyYW5jZSQxLmxhbmcgPSB0b1ZhbHVlKGxhbmcpO1xuXHRcdHV0dGVyYW5jZSQxLnZvaWNlID0gdG9WYWx1ZShvcHRpb25zLnZvaWNlKSB8fCBudWxsO1xuXHRcdHV0dGVyYW5jZSQxLnBpdGNoID0gdG9WYWx1ZShwaXRjaCk7XG5cdFx0dXR0ZXJhbmNlJDEucmF0ZSA9IHRvVmFsdWUocmF0ZSk7XG5cdFx0dXR0ZXJhbmNlJDEudm9sdW1lID0gdG9WYWx1ZSh2b2x1bWUpO1xuXHRcdHV0dGVyYW5jZSQxLm9uc3RhcnQgPSAoKSA9PiB7XG5cdFx0XHRpc1BsYXlpbmcudmFsdWUgPSB0cnVlO1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJwbGF5XCI7XG5cdFx0fTtcblx0XHR1dHRlcmFuY2UkMS5vbnBhdXNlID0gKCkgPT4ge1xuXHRcdFx0aXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcInBhdXNlXCI7XG5cdFx0fTtcblx0XHR1dHRlcmFuY2UkMS5vbnJlc3VtZSA9ICgpID0+IHtcblx0XHRcdGlzUGxheWluZy52YWx1ZSA9IHRydWU7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcInBsYXlcIjtcblx0XHR9O1xuXHRcdHV0dGVyYW5jZSQxLm9uZW5kID0gKCkgPT4ge1xuXHRcdFx0aXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcImVuZFwiO1xuXHRcdH07XG5cdFx0dXR0ZXJhbmNlJDEub25lcnJvciA9IChldmVudCkgPT4ge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBldmVudDtcblx0XHR9O1xuXHRcdHV0dGVyYW5jZSQxLm9uYm91bmRhcnkgPSAoZXZlbnQpID0+IHtcblx0XHRcdG9uQm91bmRhcnkgPT09IG51bGwgfHwgb25Cb3VuZGFyeSA9PT0gdm9pZCAwIHx8IG9uQm91bmRhcnkoZXZlbnQpO1xuXHRcdH07XG5cdH07XG5cdGNvbnN0IHV0dGVyYW5jZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRzdGF0dXMudmFsdWUgPSBcImluaXRcIjtcblx0XHRjb25zdCBuZXdVdHRlcmFuY2UgPSBuZXcgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKHNwb2tlblRleHQudmFsdWUpO1xuXHRcdGJpbmRFdmVudHNGb3JVdHRlcmFuY2UobmV3VXR0ZXJhbmNlKTtcblx0XHRyZXR1cm4gbmV3VXR0ZXJhbmNlO1xuXHR9KTtcblx0Y29uc3Qgc3BlYWsgPSAoKSA9PiB7XG5cdFx0c3ludGguY2FuY2VsKCk7XG5cdFx0aWYgKHV0dGVyYW5jZSkgc3ludGguc3BlYWsodXR0ZXJhbmNlLnZhbHVlKTtcblx0fTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRzeW50aC5jYW5jZWwoKTtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0YmluZEV2ZW50c0ZvclV0dGVyYW5jZSh1dHRlcmFuY2UudmFsdWUpO1xuXHRcdHdhdGNoKGxhbmcsIChsYW5nJDEpID0+IHtcblx0XHRcdGlmICh1dHRlcmFuY2UudmFsdWUgJiYgIWlzUGxheWluZy52YWx1ZSkgdXR0ZXJhbmNlLnZhbHVlLmxhbmcgPSBsYW5nJDE7XG5cdFx0fSk7XG5cdFx0aWYgKG9wdGlvbnMudm9pY2UpIHdhdGNoKG9wdGlvbnMudm9pY2UsICgpID0+IHtcblx0XHRcdHN5bnRoLmNhbmNlbCgpO1xuXHRcdH0pO1xuXHRcdHdhdGNoKGlzUGxheWluZywgKCkgPT4ge1xuXHRcdFx0aWYgKGlzUGxheWluZy52YWx1ZSkgc3ludGgucmVzdW1lKCk7XG5cdFx0XHRlbHNlIHN5bnRoLnBhdXNlKCk7XG5cdFx0fSk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdGlzUGxheWluZy52YWx1ZSA9IGZhbHNlO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRpc1BsYXlpbmcsXG5cdFx0c3RhdHVzLFxuXHRcdHV0dGVyYW5jZSxcblx0XHRlcnJvcixcblx0XHRzdG9wLFxuXHRcdHRvZ2dsZSxcblx0XHRzcGVha1xuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTdGVwcGVyL2luZGV4LnRzXG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlU3RlcHBlcihzdGVwcywgaW5pdGlhbFN0ZXApIHtcblx0Y29uc3Qgc3RlcHNSZWYgPSByZWYoc3RlcHMpO1xuXHRjb25zdCBzdGVwTmFtZXMgPSBjb21wdXRlZCgoKSA9PiBBcnJheS5pc0FycmF5KHN0ZXBzUmVmLnZhbHVlKSA/IHN0ZXBzUmVmLnZhbHVlIDogT2JqZWN0LmtleXMoc3RlcHNSZWYudmFsdWUpKTtcblx0Y29uc3QgaW5kZXggPSByZWYoc3RlcE5hbWVzLnZhbHVlLmluZGV4T2YoaW5pdGlhbFN0ZXAgIT09IG51bGwgJiYgaW5pdGlhbFN0ZXAgIT09IHZvaWQgMCA/IGluaXRpYWxTdGVwIDogc3RlcE5hbWVzLnZhbHVlWzBdKSk7XG5cdGNvbnN0IGN1cnJlbnQgPSBjb21wdXRlZCgoKSA9PiBhdChpbmRleC52YWx1ZSkpO1xuXHRjb25zdCBpc0ZpcnN0ID0gY29tcHV0ZWQoKCkgPT4gaW5kZXgudmFsdWUgPT09IDApO1xuXHRjb25zdCBpc0xhc3QgPSBjb21wdXRlZCgoKSA9PiBpbmRleC52YWx1ZSA9PT0gc3RlcE5hbWVzLnZhbHVlLmxlbmd0aCAtIDEpO1xuXHRjb25zdCBuZXh0ID0gY29tcHV0ZWQoKCkgPT4gc3RlcE5hbWVzLnZhbHVlW2luZGV4LnZhbHVlICsgMV0pO1xuXHRjb25zdCBwcmV2aW91cyA9IGNvbXB1dGVkKCgpID0+IHN0ZXBOYW1lcy52YWx1ZVtpbmRleC52YWx1ZSAtIDFdKTtcblx0ZnVuY3Rpb24gYXQoaW5kZXgkMSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHN0ZXBzUmVmLnZhbHVlKSkgcmV0dXJuIHN0ZXBzUmVmLnZhbHVlW2luZGV4JDFdO1xuXHRcdHJldHVybiBzdGVwc1JlZi52YWx1ZVtzdGVwTmFtZXMudmFsdWVbaW5kZXgkMV1dO1xuXHR9XG5cdGZ1bmN0aW9uIGdldChzdGVwKSB7XG5cdFx0aWYgKCFzdGVwTmFtZXMudmFsdWUuaW5jbHVkZXMoc3RlcCkpIHJldHVybjtcblx0XHRyZXR1cm4gYXQoc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkpO1xuXHR9XG5cdGZ1bmN0aW9uIGdvVG8oc3RlcCkge1xuXHRcdGlmIChzdGVwTmFtZXMudmFsdWUuaW5jbHVkZXMoc3RlcCkpIGluZGV4LnZhbHVlID0gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCk7XG5cdH1cblx0ZnVuY3Rpb24gZ29Ub05leHQoKSB7XG5cdFx0aWYgKGlzTGFzdC52YWx1ZSkgcmV0dXJuO1xuXHRcdGluZGV4LnZhbHVlKys7XG5cdH1cblx0ZnVuY3Rpb24gZ29Ub1ByZXZpb3VzKCkge1xuXHRcdGlmIChpc0ZpcnN0LnZhbHVlKSByZXR1cm47XG5cdFx0aW5kZXgudmFsdWUtLTtcblx0fVxuXHRmdW5jdGlvbiBnb0JhY2tUbyhzdGVwKSB7XG5cdFx0aWYgKGlzQWZ0ZXIoc3RlcCkpIGdvVG8oc3RlcCk7XG5cdH1cblx0ZnVuY3Rpb24gaXNOZXh0KHN0ZXApIHtcblx0XHRyZXR1cm4gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkgPT09IGluZGV4LnZhbHVlICsgMTtcblx0fVxuXHRmdW5jdGlvbiBpc1ByZXZpb3VzKHN0ZXApIHtcblx0XHRyZXR1cm4gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkgPT09IGluZGV4LnZhbHVlIC0gMTtcblx0fVxuXHRmdW5jdGlvbiBpc0N1cnJlbnQoc3RlcCkge1xuXHRcdHJldHVybiBzdGVwTmFtZXMudmFsdWUuaW5kZXhPZihzdGVwKSA9PT0gaW5kZXgudmFsdWU7XG5cdH1cblx0ZnVuY3Rpb24gaXNCZWZvcmUoc3RlcCkge1xuXHRcdHJldHVybiBpbmRleC52YWx1ZSA8IHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApO1xuXHR9XG5cdGZ1bmN0aW9uIGlzQWZ0ZXIoc3RlcCkge1xuXHRcdHJldHVybiBpbmRleC52YWx1ZSA+IHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0c3RlcHM6IHN0ZXBzUmVmLFxuXHRcdHN0ZXBOYW1lcyxcblx0XHRpbmRleCxcblx0XHRjdXJyZW50LFxuXHRcdG5leHQsXG5cdFx0cHJldmlvdXMsXG5cdFx0aXNGaXJzdCxcblx0XHRpc0xhc3QsXG5cdFx0YXQsXG5cdFx0Z2V0LFxuXHRcdGdvVG8sXG5cdFx0Z29Ub05leHQsXG5cdFx0Z29Ub1ByZXZpb3VzLFxuXHRcdGdvQmFja1RvLFxuXHRcdGlzTmV4dCxcblx0XHRpc1ByZXZpb3VzLFxuXHRcdGlzQ3VycmVudCxcblx0XHRpc0JlZm9yZSxcblx0XHRpc0FmdGVyXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN0b3JhZ2VBc3luYy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFN0b3JhZ2UgaW4gd2l0aCBhc3luYyBzdXBwb3J0LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTdG9yYWdlQXN5bmNcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaW5pdGlhbFZhbHVlXG4qIEBwYXJhbSBzdG9yYWdlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU3RvcmFnZUFzeW5jKGtleSwgaW5pdGlhbFZhbHVlLCBzdG9yYWdlLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJHNlcmlhbGl6ZXI7XG5cdGNvbnN0IHsgZmx1c2ggPSBcInByZVwiLCBkZWVwID0gdHJ1ZSwgbGlzdGVuVG9TdG9yYWdlQ2hhbmdlcyA9IHRydWUsIHdyaXRlRGVmYXVsdHMgPSB0cnVlLCBtZXJnZURlZmF1bHRzID0gZmFsc2UsIHNoYWxsb3csIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBldmVudEZpbHRlciwgb25FcnJvciA9IChlKSA9PiB7XG5cdFx0Y29uc29sZS5lcnJvcihlKTtcblx0fSwgb25SZWFkeSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcmF3SW5pdCA9IHRvVmFsdWUoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgdHlwZSA9IGd1ZXNzU2VyaWFsaXplclR5cGUocmF3SW5pdCk7XG5cdGNvbnN0IGRhdGEgPSAoc2hhbGxvdyA/IHNoYWxsb3dSZWYgOiByZWYpKHRvVmFsdWUoaW5pdGlhbFZhbHVlKSk7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSAoX29wdGlvbnMkc2VyaWFsaXplciA9IG9wdGlvbnMuc2VyaWFsaXplcikgIT09IG51bGwgJiYgX29wdGlvbnMkc2VyaWFsaXplciAhPT0gdm9pZCAwID8gX29wdGlvbnMkc2VyaWFsaXplciA6IFN0b3JhZ2VTZXJpYWxpemVyc1t0eXBlXTtcblx0aWYgKCFzdG9yYWdlKSB0cnkge1xuXHRcdHN0b3JhZ2UgPSBnZXRTU1JIYW5kbGVyKFwiZ2V0RGVmYXVsdFN0b3JhZ2VBc3luY1wiLCAoKSA9PiBkZWZhdWx0V2luZG93ID09PSBudWxsIHx8IGRlZmF1bHRXaW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlZmF1bHRXaW5kb3cubG9jYWxTdG9yYWdlKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0b25FcnJvcihlKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZWFkKGV2ZW50KSB7XG5cdFx0aWYgKCFzdG9yYWdlIHx8IGV2ZW50ICYmIGV2ZW50LmtleSAhPT0ga2V5KSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJhd1ZhbHVlID0gZXZlbnQgPyBldmVudC5uZXdWYWx1ZSA6IGF3YWl0IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXHRcdFx0aWYgKHJhd1ZhbHVlID09IG51bGwpIHtcblx0XHRcdFx0ZGF0YS52YWx1ZSA9IHJhd0luaXQ7XG5cdFx0XHRcdGlmICh3cml0ZURlZmF1bHRzICYmIHJhd0luaXQgIT09IG51bGwpIGF3YWl0IHN0b3JhZ2Uuc2V0SXRlbShrZXksIGF3YWl0IHNlcmlhbGl6ZXIud3JpdGUocmF3SW5pdCkpO1xuXHRcdFx0fSBlbHNlIGlmIChtZXJnZURlZmF1bHRzKSB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gYXdhaXQgc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0XHRcdFx0aWYgKHR5cGVvZiBtZXJnZURlZmF1bHRzID09PSBcImZ1bmN0aW9uXCIpIGRhdGEudmFsdWUgPSBtZXJnZURlZmF1bHRzKHZhbHVlLCByYXdJbml0KTtcblx0XHRcdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIGRhdGEudmFsdWUgPSB7XG5cdFx0XHRcdFx0Li4ucmF3SW5pdCxcblx0XHRcdFx0XHQuLi52YWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRlbHNlIGRhdGEudmFsdWUgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBkYXRhLnZhbHVlID0gYXdhaXQgc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fVxuXHRjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRyZWFkKCkudGhlbigoKSA9PiB7XG5cdFx0XHRvblJlYWR5ID09PSBudWxsIHx8IG9uUmVhZHkgPT09IHZvaWQgMCB8fCBvblJlYWR5KGRhdGEudmFsdWUpO1xuXHRcdFx0cmVzb2x2ZShkYXRhKTtcblx0XHR9KTtcblx0fSk7XG5cdGlmICh3aW5kb3ckMSAmJiBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInN0b3JhZ2VcIiwgKGUpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gcmVhZChlKSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0aWYgKHN0b3JhZ2UpIHdhdGNoV2l0aEZpbHRlcihkYXRhLCBhc3luYyAoKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChkYXRhLnZhbHVlID09IG51bGwpIGF3YWl0IHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuXHRcdFx0ZWxzZSBhd2FpdCBzdG9yYWdlLnNldEl0ZW0oa2V5LCBhd2FpdCBzZXJpYWxpemVyLndyaXRlKGRhdGEudmFsdWUpKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0ZXZlbnRGaWx0ZXJcblx0fSk7XG5cdE9iamVjdC5hc3NpZ24oZGF0YSwge1xuXHRcdHRoZW46IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpLFxuXHRcdGNhdGNoOiBwcm9taXNlLmNhdGNoLmJpbmQocHJvbWlzZSlcblx0fSk7XG5cdHJldHVybiBkYXRhO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTdHlsZVRhZy9pbmRleC50c1xubGV0IF9pZCA9IDA7XG4vKipcbiogSW5qZWN0IDxzdHlsZT4gZWxlbWVudCBpbiBoZWFkLlxuKlxuKiBPdmVybG9hZDogT21pdHRlZCBpZFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTdHlsZVRhZ1xuKiBAcGFyYW0gY3NzXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU3R5bGVUYWcoY3NzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgaXNMb2FkZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgaW1tZWRpYXRlID0gdHJ1ZSwgbWFudWFsID0gZmFsc2UsIGlkID0gYHZ1ZXVzZV9zdHlsZXRhZ18keysrX2lkfWAgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNzc1JlZiA9IHNoYWxsb3dSZWYoY3NzKTtcblx0bGV0IHN0b3AgPSAoKSA9PiB7fTtcblx0Y29uc3QgbG9hZCA9ICgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHJldHVybjtcblx0XHRjb25zdCBlbCA9IGRvY3VtZW50JDEuZ2V0RWxlbWVudEJ5SWQoaWQpIHx8IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdGlmICghZWwuaXNDb25uZWN0ZWQpIHtcblx0XHRcdGVsLmlkID0gaWQ7XG5cdFx0XHRpZiAob3B0aW9ucy5ub25jZSkgZWwubm9uY2UgPSBvcHRpb25zLm5vbmNlO1xuXHRcdFx0aWYgKG9wdGlvbnMubWVkaWEpIGVsLm1lZGlhID0gb3B0aW9ucy5tZWRpYTtcblx0XHRcdGRvY3VtZW50JDEuaGVhZC5hcHBlbmRDaGlsZChlbCk7XG5cdFx0fVxuXHRcdGlmIChpc0xvYWRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdHN0b3AgPSB3YXRjaChjc3NSZWYsICh2YWx1ZSkgPT4ge1xuXHRcdFx0ZWwudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0XHRpc0xvYWRlZC52YWx1ZSA9IHRydWU7XG5cdH07XG5cdGNvbnN0IHVubG9hZCA9ICgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEgfHwgIWlzTG9hZGVkLnZhbHVlKSByZXR1cm47XG5cdFx0c3RvcCgpO1xuXHRcdGRvY3VtZW50JDEuaGVhZC5yZW1vdmVDaGlsZChkb2N1bWVudCQxLmdldEVsZW1lbnRCeUlkKGlkKSk7XG5cdFx0aXNMb2FkZWQudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0aWYgKGltbWVkaWF0ZSAmJiAhbWFudWFsKSB0cnlPbk1vdW50ZWQobG9hZCk7XG5cdGlmICghbWFudWFsKSB0cnlPblNjb3BlRGlzcG9zZSh1bmxvYWQpO1xuXHRyZXR1cm4ge1xuXHRcdGlkLFxuXHRcdGNzczogY3NzUmVmLFxuXHRcdHVubG9hZCxcblx0XHRsb2FkLFxuXHRcdGlzTG9hZGVkOiByZWFkb25seShpc0xvYWRlZClcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3dpcGUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBzd2lwZSBkZXRlY3Rpb24uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVN3aXBlXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTd2lwZSh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocmVzaG9sZCA9IDUwLCBvblN3aXBlLCBvblN3aXBlRW5kLCBvblN3aXBlU3RhcnQsIHBhc3NpdmUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjb29yZHNTdGFydCA9IHJlYWN0aXZlKHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IGNvb3Jkc0VuZCA9IHJlYWN0aXZlKHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IGRpZmZYID0gY29tcHV0ZWQoKCkgPT4gY29vcmRzU3RhcnQueCAtIGNvb3Jkc0VuZC54KTtcblx0Y29uc3QgZGlmZlkgPSBjb21wdXRlZCgoKSA9PiBjb29yZHNTdGFydC55IC0gY29vcmRzRW5kLnkpO1xuXHRjb25zdCB7IG1heCwgYWJzIH0gPSBNYXRoO1xuXHRjb25zdCBpc1RocmVzaG9sZEV4Y2VlZGVkID0gY29tcHV0ZWQoKCkgPT4gbWF4KGFicyhkaWZmWC52YWx1ZSksIGFicyhkaWZmWS52YWx1ZSkpID49IHRocmVzaG9sZCk7XG5cdGNvbnN0IGlzU3dpcGluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBkaXJlY3Rpb24gPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKCFpc1RocmVzaG9sZEV4Y2VlZGVkLnZhbHVlKSByZXR1cm4gXCJub25lXCI7XG5cdFx0aWYgKGFicyhkaWZmWC52YWx1ZSkgPiBhYnMoZGlmZlkudmFsdWUpKSByZXR1cm4gZGlmZlgudmFsdWUgPiAwID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCI7XG5cdFx0ZWxzZSByZXR1cm4gZGlmZlkudmFsdWUgPiAwID8gXCJ1cFwiIDogXCJkb3duXCI7XG5cdH0pO1xuXHRjb25zdCBnZXRUb3VjaEV2ZW50Q29vcmRzID0gKGUpID0+IFtlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFldO1xuXHRjb25zdCB1cGRhdGVDb29yZHNTdGFydCA9ICh4LCB5KSA9PiB7XG5cdFx0Y29vcmRzU3RhcnQueCA9IHg7XG5cdFx0Y29vcmRzU3RhcnQueSA9IHk7XG5cdH07XG5cdGNvbnN0IHVwZGF0ZUNvb3Jkc0VuZCA9ICh4LCB5KSA9PiB7XG5cdFx0Y29vcmRzRW5kLnggPSB4O1xuXHRcdGNvb3Jkc0VuZC55ID0geTtcblx0fTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdHBhc3NpdmUsXG5cdFx0Y2FwdHVyZTogIXBhc3NpdmVcblx0fTtcblx0Y29uc3Qgb25Ub3VjaEVuZCA9IChlKSA9PiB7XG5cdFx0aWYgKGlzU3dpcGluZy52YWx1ZSkgb25Td2lwZUVuZCA9PT0gbnVsbCB8fCBvblN3aXBlRW5kID09PSB2b2lkIDAgfHwgb25Td2lwZUVuZChlLCBkaXJlY3Rpb24udmFsdWUpO1xuXHRcdGlzU3dpcGluZy52YWx1ZSA9IGZhbHNlO1xuXHR9O1xuXHRjb25zdCBzdG9wcyA9IFtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJ0b3VjaHN0YXJ0XCIsIChlKSA9PiB7XG5cdFx0XHRpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMSkgcmV0dXJuO1xuXHRcdFx0Y29uc3QgW3gsIHldID0gZ2V0VG91Y2hFdmVudENvb3JkcyhlKTtcblx0XHRcdHVwZGF0ZUNvb3Jkc1N0YXJ0KHgsIHkpO1xuXHRcdFx0dXBkYXRlQ29vcmRzRW5kKHgsIHkpO1xuXHRcdFx0b25Td2lwZVN0YXJ0ID09PSBudWxsIHx8IG9uU3dpcGVTdGFydCA9PT0gdm9pZCAwIHx8IG9uU3dpcGVTdGFydChlKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRvdWNobW92ZVwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKGUudG91Y2hlcy5sZW5ndGggIT09IDEpIHJldHVybjtcblx0XHRcdGNvbnN0IFt4LCB5XSA9IGdldFRvdWNoRXZlbnRDb29yZHMoZSk7XG5cdFx0XHR1cGRhdGVDb29yZHNFbmQoeCwgeSk7XG5cdFx0XHRpZiAobGlzdGVuZXJPcHRpb25zLmNhcHR1cmUgJiYgIWxpc3RlbmVyT3B0aW9ucy5wYXNzaXZlICYmIE1hdGguYWJzKGRpZmZYLnZhbHVlKSA+IE1hdGguYWJzKGRpZmZZLnZhbHVlKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKCFpc1N3aXBpbmcudmFsdWUgJiYgaXNUaHJlc2hvbGRFeGNlZWRlZC52YWx1ZSkgaXNTd2lwaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpc1N3aXBpbmcudmFsdWUpIG9uU3dpcGUgPT09IG51bGwgfHwgb25Td2lwZSA9PT0gdm9pZCAwIHx8IG9uU3dpcGUoZSk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgW1widG91Y2hlbmRcIiwgXCJ0b3VjaGNhbmNlbFwiXSwgb25Ub3VjaEVuZCwgbGlzdGVuZXJPcHRpb25zKVxuXHRdO1xuXHRjb25zdCBzdG9wID0gKCkgPT4gc3RvcHMuZm9yRWFjaCgocykgPT4gcygpKTtcblx0cmV0dXJuIHtcblx0XHRpc1N3aXBpbmcsXG5cdFx0ZGlyZWN0aW9uLFxuXHRcdGNvb3Jkc1N0YXJ0LFxuXHRcdGNvb3Jkc0VuZCxcblx0XHRsZW5ndGhYOiBkaWZmWCxcblx0XHRsZW5ndGhZOiBkaWZmWSxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRlbXBsYXRlUmVmc0xpc3QvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VUZW1wbGF0ZVJlZnNMaXN0KCkge1xuXHRjb25zdCByZWZzID0gcmVmKFtdKTtcblx0cmVmcy52YWx1ZS5zZXQgPSAoZWwpID0+IHtcblx0XHRpZiAoZWwpIHJlZnMudmFsdWUucHVzaChlbCk7XG5cdH07XG5cdG9uQmVmb3JlVXBkYXRlKCgpID0+IHtcblx0XHRyZWZzLnZhbHVlLmxlbmd0aCA9IDA7XG5cdH0pO1xuXHRyZXR1cm4gcmVmcztcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGV4dERpcmVjdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGRpciBvZiB0aGUgZWxlbWVudCdzIHRleHQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRleHREaXJlY3Rpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUZXh0RGlyZWN0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50LCBzZWxlY3RvciA9IFwiaHRtbFwiLCBvYnNlcnZlID0gZmFsc2UsIGluaXRpYWxWYWx1ZSA9IFwibHRyXCIgfSA9IG9wdGlvbnM7XG5cdGZ1bmN0aW9uIGdldFZhbHVlJDEoKSB7XG5cdFx0dmFyIF9yZWYsIF9kb2N1bWVudCRxdWVyeVNlbGVjdDtcblx0XHRyZXR1cm4gKF9yZWYgPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCB8fCAoX2RvY3VtZW50JHF1ZXJ5U2VsZWN0ID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkgPT09IG51bGwgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZG9jdW1lbnQkcXVlcnlTZWxlY3QuZ2V0QXR0cmlidXRlKFwiZGlyXCIpKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogaW5pdGlhbFZhbHVlO1xuXHR9XG5cdGNvbnN0IGRpciA9IHJlZihnZXRWYWx1ZSQxKCkpO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4gZGlyLnZhbHVlID0gZ2V0VmFsdWUkMSgpKTtcblx0aWYgKG9ic2VydmUgJiYgZG9jdW1lbnQkMSkgdXNlTXV0YXRpb25PYnNlcnZlcihkb2N1bWVudCQxLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLCAoKSA9PiBkaXIudmFsdWUgPSBnZXRWYWx1ZSQxKCksIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcblx0cmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZGlyLnZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KHYpIHtcblx0XHRcdHZhciBfZG9jdW1lbnQkcXVlcnlTZWxlY3QyLCBfZG9jdW1lbnQkcXVlcnlTZWxlY3QzO1xuXHRcdFx0ZGlyLnZhbHVlID0gdjtcblx0XHRcdGlmICghZG9jdW1lbnQkMSkgcmV0dXJuO1xuXHRcdFx0aWYgKGRpci52YWx1ZSkgKF9kb2N1bWVudCRxdWVyeVNlbGVjdDIgPSBkb2N1bWVudCQxLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkcXVlcnlTZWxlY3QyID09PSB2b2lkIDAgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0Mi5zZXRBdHRyaWJ1dGUoXCJkaXJcIiwgZGlyLnZhbHVlKTtcblx0XHRcdGVsc2UgKF9kb2N1bWVudCRxdWVyeVNlbGVjdDMgPSBkb2N1bWVudCQxLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkcXVlcnlTZWxlY3QzID09PSB2b2lkIDAgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0My5yZW1vdmVBdHRyaWJ1dGUoXCJkaXJcIik7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGV4dFNlbGVjdGlvbi9pbmRleC50c1xuZnVuY3Rpb24gZ2V0UmFuZ2VzRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pIHtcblx0dmFyIF9zZWxlY3Rpb24kcmFuZ2VDb3VudDtcblx0Y29uc3QgcmFuZ2VDb3VudCA9IChfc2VsZWN0aW9uJHJhbmdlQ291bnQgPSBzZWxlY3Rpb24ucmFuZ2VDb3VudCkgIT09IG51bGwgJiYgX3NlbGVjdGlvbiRyYW5nZUNvdW50ICE9PSB2b2lkIDAgPyBfc2VsZWN0aW9uJHJhbmdlQ291bnQgOiAwO1xuXHRyZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogcmFuZ2VDb3VudCB9LCAoXywgaSkgPT4gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSkpO1xufVxuLyoqXG4qIFJlYWN0aXZlbHkgdHJhY2sgdXNlciB0ZXh0IHNlbGVjdGlvbiBiYXNlZCBvbiBbYFdpbmRvdy5nZXRTZWxlY3Rpb25gXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldFNlbGVjdGlvbikuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRleHRTZWxlY3Rpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUZXh0U2VsZWN0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX3dpbmRvdyRnZXRTZWxlY3Rpb247XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHNlbGVjdGlvbiA9IHNoYWxsb3dSZWYoKF93aW5kb3ckZ2V0U2VsZWN0aW9uID0gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmdldFNlbGVjdGlvbigpKSAhPT0gbnVsbCAmJiBfd2luZG93JGdldFNlbGVjdGlvbiAhPT0gdm9pZCAwID8gX3dpbmRvdyRnZXRTZWxlY3Rpb24gOiBudWxsKTtcblx0Y29uc3QgdGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX3NlbGVjdGlvbiR2YWx1ZSR0b1N0LCBfc2VsZWN0aW9uJHZhbHVlO1xuXHRcdHJldHVybiAoX3NlbGVjdGlvbiR2YWx1ZSR0b1N0ID0gKF9zZWxlY3Rpb24kdmFsdWUgPSBzZWxlY3Rpb24udmFsdWUpID09PSBudWxsIHx8IF9zZWxlY3Rpb24kdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZWxlY3Rpb24kdmFsdWUudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX3NlbGVjdGlvbiR2YWx1ZSR0b1N0ICE9PSB2b2lkIDAgPyBfc2VsZWN0aW9uJHZhbHVlJHRvU3QgOiBcIlwiO1xuXHR9KTtcblx0Y29uc3QgcmFuZ2VzID0gY29tcHV0ZWQoKCkgPT4gc2VsZWN0aW9uLnZhbHVlID8gZ2V0UmFuZ2VzRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24udmFsdWUpIDogW10pO1xuXHRjb25zdCByZWN0cyA9IGNvbXB1dGVkKCgpID0+IHJhbmdlcy52YWx1ZS5tYXAoKHJhbmdlKSA9PiByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpO1xuXHRmdW5jdGlvbiBvblNlbGVjdGlvbkNoYW5nZSgpIHtcblx0XHRzZWxlY3Rpb24udmFsdWUgPSBudWxsO1xuXHRcdGlmICh3aW5kb3ckMSkgc2VsZWN0aW9uLnZhbHVlID0gd2luZG93JDEuZ2V0U2VsZWN0aW9uKCk7XG5cdH1cblx0aWYgKHdpbmRvdyQxKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLmRvY3VtZW50LCBcInNlbGVjdGlvbmNoYW5nZVwiLCBvblNlbGVjdGlvbkNoYW5nZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4ge1xuXHRcdHRleHQsXG5cdFx0cmVjdHMsXG5cdFx0cmFuZ2VzLFxuXHRcdHNlbGVjdGlvblxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUZXh0YXJlYUF1dG9zaXplL2luZGV4LnRzXG4vKipcbiogQ2FsbCB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCksIGlmIG5vdCBhdmFpbGFibGUsIGp1c3QgY2FsbCB0aGUgZnVuY3Rpb25cbipcbiogQHBhcmFtIHdpbmRvd1xuKiBAcGFyYW0gZm5cbiovXG5mdW5jdGlvbiB0cnlSZXF1ZXN0QW5pbWF0aW9uRnJhbWUod2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBmbikge1xuXHRpZiAod2luZG93JDEgJiYgdHlwZW9mIHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gXCJmdW5jdGlvblwiKSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuXHRlbHNlIGZuKCk7XG59XG5mdW5jdGlvbiB1c2VUZXh0YXJlYUF1dG9zaXplKG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkaW5wdXQsIF9vcHRpb25zJHN0eWxlUHJvcDtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgdGV4dGFyZWEgPSB0b1JlZihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZWxlbWVudCk7XG5cdGNvbnN0IGlucHV0ID0gdG9SZWYoKF9vcHRpb25zJGlucHV0ID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmlucHV0KSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRpbnB1dCAhPT0gdm9pZCAwID8gX29wdGlvbnMkaW5wdXQgOiBcIlwiKTtcblx0Y29uc3Qgc3R5bGVQcm9wID0gKF9vcHRpb25zJHN0eWxlUHJvcCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zdHlsZVByb3ApICE9PSBudWxsICYmIF9vcHRpb25zJHN0eWxlUHJvcCAhPT0gdm9pZCAwID8gX29wdGlvbnMkc3R5bGVQcm9wIDogXCJoZWlnaHRcIjtcblx0Y29uc3QgdGV4dGFyZWFTY3JvbGxIZWlnaHQgPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCB0ZXh0YXJlYU9sZFdpZHRoID0gc2hhbGxvd1JlZigwKTtcblx0ZnVuY3Rpb24gdHJpZ2dlclJlc2l6ZSgpIHtcblx0XHR2YXIgX3RleHRhcmVhJHZhbHVlO1xuXHRcdGlmICghdGV4dGFyZWEudmFsdWUpIHJldHVybjtcblx0XHRsZXQgaGVpZ2h0ID0gXCJcIjtcblx0XHR0ZXh0YXJlYS52YWx1ZS5zdHlsZVtzdHlsZVByb3BdID0gXCIxcHhcIjtcblx0XHR0ZXh0YXJlYVNjcm9sbEhlaWdodC52YWx1ZSA9IChfdGV4dGFyZWEkdmFsdWUgPSB0ZXh0YXJlYS52YWx1ZSkgPT09IG51bGwgfHwgX3RleHRhcmVhJHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGV4dGFyZWEkdmFsdWUuc2Nyb2xsSGVpZ2h0O1xuXHRcdGNvbnN0IF9zdHlsZVRhcmdldCA9IHRvVmFsdWUob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnN0eWxlVGFyZ2V0KTtcblx0XHRpZiAoX3N0eWxlVGFyZ2V0KSBfc3R5bGVUYXJnZXQuc3R5bGVbc3R5bGVQcm9wXSA9IGAke3RleHRhcmVhU2Nyb2xsSGVpZ2h0LnZhbHVlfXB4YDtcblx0XHRlbHNlIGhlaWdodCA9IGAke3RleHRhcmVhU2Nyb2xsSGVpZ2h0LnZhbHVlfXB4YDtcblx0XHR0ZXh0YXJlYS52YWx1ZS5zdHlsZVtzdHlsZVByb3BdID0gaGVpZ2h0O1xuXHR9XG5cdHdhdGNoKFtpbnB1dCwgdGV4dGFyZWFdLCAoKSA9PiBuZXh0VGljayh0cmlnZ2VyUmVzaXplKSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHdhdGNoKHRleHRhcmVhU2Nyb2xsSGVpZ2h0LCAoKSA9PiB7XG5cdFx0dmFyIF9vcHRpb25zJG9uUmVzaXplO1xuXHRcdHJldHVybiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkb25SZXNpemUgPSBvcHRpb25zLm9uUmVzaXplKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblJlc2l6ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkb25SZXNpemUuY2FsbChvcHRpb25zKTtcblx0fSk7XG5cdHVzZVJlc2l6ZU9ic2VydmVyKHRleHRhcmVhLCAoW3sgY29udGVudFJlY3QgfV0pID0+IHtcblx0XHRpZiAodGV4dGFyZWFPbGRXaWR0aC52YWx1ZSA9PT0gY29udGVudFJlY3Qud2lkdGgpIHJldHVybjtcblx0XHR0cnlSZXF1ZXN0QW5pbWF0aW9uRnJhbWUod2luZG93JDEsICgpID0+IHtcblx0XHRcdHRleHRhcmVhT2xkV2lkdGgudmFsdWUgPSBjb250ZW50UmVjdC53aWR0aDtcblx0XHRcdHRyaWdnZXJSZXNpemUoKTtcblx0XHR9KTtcblx0fSk7XG5cdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2F0Y2gpIHdhdGNoKG9wdGlvbnMud2F0Y2gsIHRyaWdnZXJSZXNpemUsIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0ZGVlcDogdHJ1ZVxuXHR9KTtcblx0cmV0dXJuIHtcblx0XHR0ZXh0YXJlYSxcblx0XHRpbnB1dCxcblx0XHR0cmlnZ2VyUmVzaXplXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRocm90dGxlZFJlZkhpc3RvcnkvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIFt1c2VSZWZIaXN0b3J5XShodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmVmSGlzdG9yeSkgd2l0aCB0aHJvdHRsZWQgZmlsdGVyLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VUaHJvdHRsZWRSZWZIaXN0b3J5XG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VUaHJvdHRsZWRSZWZIaXN0b3J5KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdGhyb3R0bGUgPSAyMDAsIHRyYWlsaW5nID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZmlsdGVyID0gdGhyb3R0bGVGaWx0ZXIodGhyb3R0bGUsIHRyYWlsaW5nKTtcblx0cmV0dXJuIHsgLi4udXNlUmVmSGlzdG9yeShzb3VyY2UsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGV2ZW50RmlsdGVyOiBmaWx0ZXJcblx0fSkgfTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZUFnby9pbmRleC50c1xuY29uc3QgREVGQVVMVF9VTklUUyA9IFtcblx0e1xuXHRcdG1heDogNmU0LFxuXHRcdHZhbHVlOiAxZTMsXG5cdFx0bmFtZTogXCJzZWNvbmRcIlxuXHR9LFxuXHR7XG5cdFx0bWF4OiAyNzZlNCxcblx0XHR2YWx1ZTogNmU0LFxuXHRcdG5hbWU6IFwibWludXRlXCJcblx0fSxcblx0e1xuXHRcdG1heDogNzJlNixcblx0XHR2YWx1ZTogMzZlNSxcblx0XHRuYW1lOiBcImhvdXJcIlxuXHR9LFxuXHR7XG5cdFx0bWF4OiA1MTg0ZTUsXG5cdFx0dmFsdWU6IDg2NGU1LFxuXHRcdG5hbWU6IFwiZGF5XCJcblx0fSxcblx0e1xuXHRcdG1heDogMjQxOTJlNSxcblx0XHR2YWx1ZTogNjA0OGU1LFxuXHRcdG5hbWU6IFwid2Vla1wiXG5cdH0sXG5cdHtcblx0XHRtYXg6IDI4NTEyZTYsXG5cdFx0dmFsdWU6IDI1OTJlNixcblx0XHRuYW1lOiBcIm1vbnRoXCJcblx0fSxcblx0e1xuXHRcdG1heDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRcdHZhbHVlOiAzMTUzNmU2LFxuXHRcdG5hbWU6IFwieWVhclwiXG5cdH1cbl07XG5jb25zdCBERUZBVUxUX01FU1NBR0VTID0ge1xuXHRqdXN0Tm93OiBcImp1c3Qgbm93XCIsXG5cdHBhc3Q6IChuKSA9PiBuLm1hdGNoKC9cXGQvKSA/IGAke259IGFnb2AgOiBuLFxuXHRmdXR1cmU6IChuKSA9PiBuLm1hdGNoKC9cXGQvKSA/IGBpbiAke259YCA6IG4sXG5cdG1vbnRoOiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcImxhc3QgbW9udGhcIiA6IFwibmV4dCBtb250aFwiIDogYCR7bn0gbW9udGgke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdHllYXI6IChuLCBwYXN0KSA9PiBuID09PSAxID8gcGFzdCA/IFwibGFzdCB5ZWFyXCIgOiBcIm5leHQgeWVhclwiIDogYCR7bn0geWVhciR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcblx0ZGF5OiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcInllc3RlcmRheVwiIDogXCJ0b21vcnJvd1wiIDogYCR7bn0gZGF5JHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHR3ZWVrOiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcImxhc3Qgd2Vla1wiIDogXCJuZXh0IHdlZWtcIiA6IGAke259IHdlZWske24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdGhvdXI6IChuKSA9PiBgJHtufSBob3VyJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHRtaW51dGU6IChuKSA9PiBgJHtufSBtaW51dGUke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdHNlY29uZDogKG4pID0+IGAke259IHNlY29uZCR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcblx0aW52YWxpZDogXCJcIlxufTtcbmZ1bmN0aW9uIERFRkFVTFRfRk9STUFUVEVSKGRhdGUpIHtcblx0cmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDQob3B0aW9ucykge1xuXHRpZiAoXCJ1cGRhdGVJbnRlcnZhbFwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IHVwZGF0ZUludGVydmFsID0gM2U0IH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIHVwZGF0ZUludGVydmFsKTtcblx0fVxuXHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCAzZTQpO1xufVxuLyoqXG4qIFJlYWN0aXZlIHRpbWUgYWdvIGZvcm1hdHRlci5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVGltZUFnb1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVRpbWVBZ28odGltZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkNChvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBub3csLi4uY29udHJvbHMgfSA9IHVzZU5vdyh7XG5cdFx0c2NoZWR1bGVyLFxuXHRcdGNvbnRyb2xzOiB0cnVlXG5cdH0pO1xuXHRjb25zdCB0aW1lQWdvID0gY29tcHV0ZWQoKCkgPT4gZm9ybWF0VGltZUFnbyhuZXcgRGF0ZSh0b1ZhbHVlKHRpbWUpKSwgb3B0aW9ucywgdG9WYWx1ZShub3cpKSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHR0aW1lQWdvLFxuXHRcdC4uLmNvbnRyb2xzXG5cdH07XG5cdGVsc2UgcmV0dXJuIHRpbWVBZ287XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lQWdvKGZyb20sIG9wdGlvbnMgPSB7fSwgbm93ID0gRGF0ZS5ub3coKSkge1xuXHRjb25zdCB7IG1heCwgbWVzc2FnZXMgPSBERUZBVUxUX01FU1NBR0VTLCBmdWxsRGF0ZUZvcm1hdHRlciA9IERFRkFVTFRfRk9STUFUVEVSLCB1bml0cyA9IERFRkFVTFRfVU5JVFMsIHNob3dTZWNvbmQgPSBmYWxzZSwgcm91bmRpbmcgPSBcInJvdW5kXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJvdW5kRm4gPSB0eXBlb2Ygcm91bmRpbmcgPT09IFwibnVtYmVyXCIgPyAobikgPT4gK24udG9GaXhlZChyb3VuZGluZykgOiBNYXRoW3JvdW5kaW5nXTtcblx0Y29uc3QgZGlmZiA9ICtub3cgLSArZnJvbTtcblx0Y29uc3QgYWJzRGlmZiA9IE1hdGguYWJzKGRpZmYpO1xuXHRmdW5jdGlvbiBnZXRWYWx1ZSQxKGRpZmYkMSwgdW5pdCkge1xuXHRcdHJldHVybiByb3VuZEZuKE1hdGguYWJzKGRpZmYkMSkgLyB1bml0LnZhbHVlKTtcblx0fVxuXHRmdW5jdGlvbiBmb3JtYXQoZGlmZiQxLCB1bml0KSB7XG5cdFx0Y29uc3QgdmFsID0gZ2V0VmFsdWUkMShkaWZmJDEsIHVuaXQpO1xuXHRcdGNvbnN0IHBhc3QgPSBkaWZmJDEgPiAwO1xuXHRcdGNvbnN0IHN0ciA9IGFwcGx5Rm9ybWF0KHVuaXQubmFtZSwgdmFsLCBwYXN0KTtcblx0XHRyZXR1cm4gYXBwbHlGb3JtYXQocGFzdCA/IFwicGFzdFwiIDogXCJmdXR1cmVcIiwgc3RyLCBwYXN0KTtcblx0fVxuXHRmdW5jdGlvbiBhcHBseUZvcm1hdChuYW1lLCB2YWwsIGlzUGFzdCkge1xuXHRcdGNvbnN0IGZvcm1hdHRlciA9IG1lc3NhZ2VzW25hbWVdO1xuXHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmb3JtYXR0ZXIodmFsLCBpc1Bhc3QpO1xuXHRcdHJldHVybiBmb3JtYXR0ZXIucmVwbGFjZShcInswfVwiLCB2YWwudG9TdHJpbmcoKSk7XG5cdH1cblx0aWYgKGFic0RpZmYgPCA2ZTQgJiYgIXNob3dTZWNvbmQpIHJldHVybiBtZXNzYWdlcy5qdXN0Tm93O1xuXHRpZiAodHlwZW9mIG1heCA9PT0gXCJudW1iZXJcIiAmJiBhYnNEaWZmID4gbWF4KSByZXR1cm4gZnVsbERhdGVGb3JtYXR0ZXIobmV3IERhdGUoZnJvbSkpO1xuXHRpZiAodHlwZW9mIG1heCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHZhciBfdW5pdHMkZmluZDtcblx0XHRjb25zdCB1bml0TWF4ID0gKF91bml0cyRmaW5kID0gdW5pdHMuZmluZCgoaSkgPT4gaS5uYW1lID09PSBtYXgpKSA9PT0gbnVsbCB8fCBfdW5pdHMkZmluZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3VuaXRzJGZpbmQubWF4O1xuXHRcdGlmICh1bml0TWF4ICYmIGFic0RpZmYgPiB1bml0TWF4KSByZXR1cm4gZnVsbERhdGVGb3JtYXR0ZXIobmV3IERhdGUoZnJvbSkpO1xuXHR9XG5cdGZvciAoY29uc3QgW2lkeCwgdW5pdF0gb2YgdW5pdHMuZW50cmllcygpKSB7XG5cdFx0aWYgKGdldFZhbHVlJDEoZGlmZiwgdW5pdCkgPD0gMCAmJiB1bml0c1tpZHggLSAxXSkgcmV0dXJuIGZvcm1hdChkaWZmLCB1bml0c1tpZHggLSAxXSk7XG5cdFx0aWYgKGFic0RpZmYgPCB1bml0Lm1heCkgcmV0dXJuIGZvcm1hdChkaWZmLCB1bml0KTtcblx0fVxuXHRyZXR1cm4gbWVzc2FnZXMuaW52YWxpZDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZUFnb0ludGwvaW5kZXgudHNcbmNvbnN0IFVOSVRTID0gW1xuXHR7XG5cdFx0bmFtZTogXCJ5ZWFyXCIsXG5cdFx0bXM6IDMxNTM2ZTZcblx0fSxcblx0e1xuXHRcdG5hbWU6IFwibW9udGhcIixcblx0XHRtczogMjU5MmU2XG5cdH0sXG5cdHtcblx0XHRuYW1lOiBcIndlZWtcIixcblx0XHRtczogNjA0OGU1XG5cdH0sXG5cdHtcblx0XHRuYW1lOiBcImRheVwiLFxuXHRcdG1zOiA4NjRlNVxuXHR9LFxuXHR7XG5cdFx0bmFtZTogXCJob3VyXCIsXG5cdFx0bXM6IDM2ZTVcblx0fSxcblx0e1xuXHRcdG5hbWU6IFwibWludXRlXCIsXG5cdFx0bXM6IDZlNFxuXHR9LFxuXHR7XG5cdFx0bmFtZTogXCJzZWNvbmRcIixcblx0XHRtczogMWUzXG5cdH1cbl07XG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDMob3B0aW9ucykge1xuXHRpZiAoXCJ1cGRhdGVJbnRlcnZhbFwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IHVwZGF0ZUludGVydmFsID0gM2U0IH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIHVwZGF0ZUludGVydmFsKTtcblx0fVxuXHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCAzZTQpO1xufVxuZnVuY3Rpb24gdXNlVGltZUFnb0ludGwodGltZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkMyhvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBub3csLi4uY29udHJvbHMgfSA9IHVzZU5vdyh7XG5cdFx0c2NoZWR1bGVyLFxuXHRcdGNvbnRyb2xzOiB0cnVlXG5cdH0pO1xuXHRjb25zdCByZXN1bHQgPSBjb21wdXRlZCgoKSA9PiBnZXRUaW1lQWdvSW50bFJlc3VsdChuZXcgRGF0ZSh0b1ZhbHVlKHRpbWUpKSwgb3B0aW9ucywgdG9WYWx1ZShub3cpKSk7XG5cdGNvbnN0IHBhcnRzID0gY29tcHV0ZWQoKCkgPT4gcmVzdWx0LnZhbHVlLnBhcnRzKTtcblx0Y29uc3QgdGltZUFnb0ludGwgPSBjb21wdXRlZCgoKSA9PiBmb3JtYXRUaW1lQWdvSW50bFBhcnRzKHBhcnRzLnZhbHVlLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRsb2NhbGU6IHJlc3VsdC52YWx1ZS5yZXNvbHZlZExvY2FsZVxuXHR9KSk7XG5cdHJldHVybiBleHBvc2VDb250cm9scyA/IHtcblx0XHR0aW1lQWdvSW50bCxcblx0XHRwYXJ0cyxcblx0XHQuLi5jb250cm9sc1xuXHR9IDogdGltZUFnb0ludGw7XG59XG4vKipcbiogTm9uLXJlYWN0aXZlIHZlcnNpb24gb2YgdXNlVGltZUFnb0ludGxcbiovXG5mdW5jdGlvbiBmb3JtYXRUaW1lQWdvSW50bChmcm9tLCBvcHRpb25zID0ge30sIG5vdyA9IERhdGUubm93KCkpIHtcblx0Y29uc3QgeyBwYXJ0cywgcmVzb2x2ZWRMb2NhbGUgfSA9IGdldFRpbWVBZ29JbnRsUmVzdWx0KGZyb20sIG9wdGlvbnMsIG5vdyk7XG5cdHJldHVybiBmb3JtYXRUaW1lQWdvSW50bFBhcnRzKHBhcnRzLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRsb2NhbGU6IHJlc29sdmVkTG9jYWxlXG5cdH0pO1xufVxuLyoqXG4qIEdldCBwYXJ0cyBmcm9tIGBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzYC5cbiovXG5mdW5jdGlvbiBnZXRUaW1lQWdvSW50bFJlc3VsdChmcm9tLCBvcHRpb25zID0ge30sIG5vdyA9IERhdGUubm93KCkpIHtcblx0dmFyIF9vcHRpb25zJHVuaXRzO1xuXHRjb25zdCB7IGxvY2FsZSwgcmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgbnVtZXJpYzogXCJhdXRvXCIgfSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcnRmID0gbmV3IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0KGxvY2FsZSwgcmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyk7XG5cdGNvbnN0IHsgbG9jYWxlOiByZXNvbHZlZExvY2FsZSB9ID0gcnRmLnJlc29sdmVkT3B0aW9ucygpO1xuXHRjb25zdCBkaWZmID0gK2Zyb20gLSArbm93O1xuXHRjb25zdCBhYnNEaWZmID0gTWF0aC5hYnMoZGlmZik7XG5cdGNvbnN0IHVuaXRzID0gKF9vcHRpb25zJHVuaXRzID0gb3B0aW9ucy51bml0cykgIT09IG51bGwgJiYgX29wdGlvbnMkdW5pdHMgIT09IHZvaWQgMCA/IF9vcHRpb25zJHVuaXRzIDogVU5JVFM7XG5cdGZvciAoY29uc3QgeyBuYW1lLCBtcyB9IG9mIHVuaXRzKSBpZiAoYWJzRGlmZiA+PSBtcykgcmV0dXJuIHtcblx0XHRyZXNvbHZlZExvY2FsZSxcblx0XHRwYXJ0czogcnRmLmZvcm1hdFRvUGFydHMoTWF0aC5yb3VuZChkaWZmIC8gbXMpLCBuYW1lKVxuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHJlc29sdmVkTG9jYWxlLFxuXHRcdHBhcnRzOiBydGYuZm9ybWF0VG9QYXJ0cygwLCB1bml0c1t1bml0cy5sZW5ndGggLSAxXS5uYW1lKVxuXHR9O1xufVxuLyoqXG4qIEZvcm1hdCBwYXJ0cyBpbnRvIGEgc3RyaW5nXG4qL1xuZnVuY3Rpb24gZm9ybWF0VGltZUFnb0ludGxQYXJ0cyhwYXJ0cywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5zZXJ0U3BhY2UgPSB0cnVlLCBqb2luUGFydHMsIGxvY2FsZSB9ID0gb3B0aW9ucztcblx0aWYgKHR5cGVvZiBqb2luUGFydHMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGpvaW5QYXJ0cyhwYXJ0cywgbG9jYWxlKTtcblx0aWYgKCFpbnNlcnRTcGFjZSkgcmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZSkuam9pbihcIlwiKTtcblx0cmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZS50cmltKCkpLmpvaW4oXCIgXCIpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUaW1lb3V0UG9sbC9pbmRleC50c1xuZnVuY3Rpb24gdXNlVGltZW91dFBvbGwoZm4sIGludGVydmFsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBpbW1lZGlhdGVDYWxsYmFjayA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB7IHN0YXJ0IH0gPSB1c2VUaW1lb3V0Rm4obG9vcCwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlIH0pO1xuXHRjb25zdCBpc0FjdGl2ZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRhc3luYyBmdW5jdGlvbiBsb29wKCkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUpIHJldHVybjtcblx0XHRhd2FpdCBmbigpO1xuXHRcdHN0YXJ0KCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzdW1lKCkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUpIHtcblx0XHRcdGlzQWN0aXZlLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpbW1lZGlhdGVDYWxsYmFjaykgZm4oKTtcblx0XHRcdHN0YXJ0KCk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHBhdXNlKCkge1xuXHRcdGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG5cdH1cblx0aWYgKGltbWVkaWF0ZSAmJiBpc0NsaWVudCkgcmVzdW1lKCk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHBhdXNlKTtcblx0cmV0dXJuIHtcblx0XHRpc0FjdGl2ZSxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZXN0YW1wL2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDIob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIsIGltbWVkaWF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIGludGVydmFsID09PSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiID8gKGNiKSA9PiB1c2VSYWZGbihjYiwgeyBpbW1lZGlhdGUgfSkgOiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIGludGVydmFsLCB7IGltbWVkaWF0ZSB9KTtcblx0fVxuXHRyZXR1cm4gdXNlUmFmRm47XG59XG5mdW5jdGlvbiB1c2VUaW1lc3RhbXAob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIG9mZnNldCA9IDAsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkMihvcHRpb25zKSwgY2FsbGJhY2sgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHRzID0gc2hhbGxvd1JlZih0aW1lc3RhbXAoKSArIG9mZnNldCk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHRzLnZhbHVlID0gdGltZXN0YW1wKCkgKyBvZmZzZXQ7XG5cdGNvbnN0IGNvbnRyb2xzID0gc2NoZWR1bGVyKGNhbGxiYWNrID8gKCkgPT4ge1xuXHRcdHVwZGF0ZSgpO1xuXHRcdGNhbGxiYWNrKHRzLnZhbHVlKTtcblx0fSA6IHVwZGF0ZSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHR0aW1lc3RhbXA6IHRzLFxuXHRcdC4uLmNvbnRyb2xzXG5cdH07XG5cdGVsc2UgcmV0dXJuIHRzO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUaXRsZS9pbmRleC50c1xuZnVuY3Rpb24gdXNlVGl0bGUobmV3VGl0bGUgPSBudWxsLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF9kb2N1bWVudCR0aXRsZSwgX3JlZjtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgcmVzdG9yZU9uVW5tb3VudCA9ICh0KSA9PiB0IH0gPSBvcHRpb25zO1xuXHRjb25zdCBvcmlnaW5hbFRpdGxlID0gKF9kb2N1bWVudCR0aXRsZSA9IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS50aXRsZSkgIT09IG51bGwgJiYgX2RvY3VtZW50JHRpdGxlICE9PSB2b2lkIDAgPyBfZG9jdW1lbnQkdGl0bGUgOiBcIlwiO1xuXHRjb25zdCB0aXRsZSA9IHRvUmVmKChfcmVmID0gbmV3VGl0bGUgIT09IG51bGwgJiYgbmV3VGl0bGUgIT09IHZvaWQgMCA/IG5ld1RpdGxlIDogZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLnRpdGxlKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogbnVsbCk7XG5cdGNvbnN0IGlzUmVhZG9ubHkkMSA9ICEhKG5ld1RpdGxlICYmIHR5cGVvZiBuZXdUaXRsZSA9PT0gXCJmdW5jdGlvblwiKTtcblx0ZnVuY3Rpb24gZm9ybWF0KHQpIHtcblx0XHRpZiAoIShcInRpdGxlVGVtcGxhdGVcIiBpbiBvcHRpb25zKSkgcmV0dXJuIHQ7XG5cdFx0Y29uc3QgdGVtcGxhdGUgPSBvcHRpb25zLnRpdGxlVGVtcGxhdGUgfHwgXCIlc1wiO1xuXHRcdHJldHVybiB0eXBlb2YgdGVtcGxhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHRlbXBsYXRlKHQpIDogdG9WYWx1ZSh0ZW1wbGF0ZSkucmVwbGFjZSgvJXMvZywgdCk7XG5cdH1cblx0d2F0Y2godGl0bGUsIChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IHtcblx0XHRpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlICYmIGRvY3VtZW50JDEpIGRvY3VtZW50JDEudGl0bGUgPSBmb3JtYXQobmV3VmFsdWUgIT09IG51bGwgJiYgbmV3VmFsdWUgIT09IHZvaWQgMCA/IG5ld1ZhbHVlIDogXCJcIik7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHRpZiAob3B0aW9ucy5vYnNlcnZlICYmICFvcHRpb25zLnRpdGxlVGVtcGxhdGUgJiYgZG9jdW1lbnQkMSAmJiAhaXNSZWFkb25seSQxKSB7XG5cdFx0dmFyIF9kb2N1bWVudCRoZWFkO1xuXHRcdHVzZU11dGF0aW9uT2JzZXJ2ZXIoKF9kb2N1bWVudCRoZWFkID0gZG9jdW1lbnQkMS5oZWFkKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkaGVhZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50JGhlYWQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpLCAoKSA9PiB7XG5cdFx0XHRpZiAoZG9jdW1lbnQkMSAmJiBkb2N1bWVudCQxLnRpdGxlICE9PSB0aXRsZS52YWx1ZSkgdGl0bGUudmFsdWUgPSBmb3JtYXQoZG9jdW1lbnQkMS50aXRsZSk7XG5cdFx0fSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdGlmIChyZXN0b3JlT25Vbm1vdW50KSB7XG5cdFx0XHRjb25zdCByZXN0b3JlZFRpdGxlID0gcmVzdG9yZU9uVW5tb3VudChvcmlnaW5hbFRpdGxlLCB0aXRsZS52YWx1ZSB8fCBcIlwiKTtcblx0XHRcdGlmIChyZXN0b3JlZFRpdGxlICE9IG51bGwgJiYgZG9jdW1lbnQkMSkgZG9jdW1lbnQkMS50aXRsZSA9IHJlc3RvcmVkVGl0bGU7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHRpdGxlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUcmFuc2l0aW9uL2luZGV4LnRzXG5jb25zdCBfVHJhbnNpdGlvblByZXNldHMgPSB7XG5cdGVhc2VJblNpbmU6IFtcblx0XHQuMTIsXG5cdFx0MCxcblx0XHQuMzksXG5cdFx0MFxuXHRdLFxuXHRlYXNlT3V0U2luZTogW1xuXHRcdC42MSxcblx0XHQxLFxuXHRcdC44OCxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dFNpbmU6IFtcblx0XHQuMzcsXG5cdFx0MCxcblx0XHQuNjMsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5RdWFkOiBbXG5cdFx0LjExLFxuXHRcdDAsXG5cdFx0LjUsXG5cdFx0MFxuXHRdLFxuXHRlYXNlT3V0UXVhZDogW1xuXHRcdC41LFxuXHRcdDEsXG5cdFx0Ljg5LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0UXVhZDogW1xuXHRcdC40NSxcblx0XHQwLFxuXHRcdC41NSxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbkN1YmljOiBbXG5cdFx0LjMyLFxuXHRcdDAsXG5cdFx0LjY3LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dEN1YmljOiBbXG5cdFx0LjMzLFxuXHRcdDEsXG5cdFx0LjY4LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0Q3ViaWM6IFtcblx0XHQuNjUsXG5cdFx0MCxcblx0XHQuMzUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5RdWFydDogW1xuXHRcdC41LFxuXHRcdDAsXG5cdFx0Ljc1LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dFF1YXJ0OiBbXG5cdFx0LjI1LFxuXHRcdDEsXG5cdFx0LjUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5PdXRRdWFydDogW1xuXHRcdC43Nixcblx0XHQwLFxuXHRcdC4yNCxcblx0XHQxXG5cdF0sXG5cdGVhc2VJblF1aW50OiBbXG5cdFx0LjY0LFxuXHRcdDAsXG5cdFx0Ljc4LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dFF1aW50OiBbXG5cdFx0LjIyLFxuXHRcdDEsXG5cdFx0LjM2LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0UXVpbnQ6IFtcblx0XHQuODMsXG5cdFx0MCxcblx0XHQuMTcsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5FeHBvOiBbXG5cdFx0LjcsXG5cdFx0MCxcblx0XHQuODQsXG5cdFx0MFxuXHRdLFxuXHRlYXNlT3V0RXhwbzogW1xuXHRcdC4xNixcblx0XHQxLFxuXHRcdC4zLFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0RXhwbzogW1xuXHRcdC44Nyxcblx0XHQwLFxuXHRcdC4xMyxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbkNpcmM6IFtcblx0XHQuNTUsXG5cdFx0MCxcblx0XHQxLFxuXHRcdC40NVxuXHRdLFxuXHRlYXNlT3V0Q2lyYzogW1xuXHRcdDAsXG5cdFx0LjU1LFxuXHRcdC40NSxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dENpcmM6IFtcblx0XHQuODUsXG5cdFx0MCxcblx0XHQuMTUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5CYWNrOiBbXG5cdFx0LjM2LFxuXHRcdDAsXG5cdFx0LjY2LFxuXHRcdC0uNTZcblx0XSxcblx0ZWFzZU91dEJhY2s6IFtcblx0XHQuMzQsXG5cdFx0MS41Nixcblx0XHQuNjQsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5PdXRCYWNrOiBbXG5cdFx0LjY4LFxuXHRcdC0uNixcblx0XHQuMzIsXG5cdFx0MS42XG5cdF1cbn07XG4vKipcbiogQ29tbW9uIHRyYW5zaXRpb25zXG4qXG4qIEBzZWUgaHR0cHM6Ly9lYXNpbmdzLm5ldFxuKi9cbmNvbnN0IFRyYW5zaXRpb25QcmVzZXRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5hc3NpZ24oe30sIHsgbGluZWFyOiBpZGVudGl0eSB9LCBfVHJhbnNpdGlvblByZXNldHMpO1xuLyoqXG4qIENyZWF0ZSBhbiBlYXNpbmcgZnVuY3Rpb24gZnJvbSBjdWJpYyBiZXppZXIgcG9pbnRzLlxuKi9cbmZ1bmN0aW9uIGNyZWF0ZUVhc2luZ0Z1bmN0aW9uKFtwMCwgcDEsIHAyLCBwM10pIHtcblx0Y29uc3QgYSA9IChhMSwgYTIpID0+IDEgLSAzICogYTIgKyAzICogYTE7XG5cdGNvbnN0IGIgPSAoYTEsIGEyKSA9PiAzICogYTIgLSA2ICogYTE7XG5cdGNvbnN0IGMgPSAoYTEpID0+IDMgKiBhMTtcblx0Y29uc3QgY2FsY0JlemllciA9ICh0LCBhMSwgYTIpID0+ICgoYShhMSwgYTIpICogdCArIGIoYTEsIGEyKSkgKiB0ICsgYyhhMSkpICogdDtcblx0Y29uc3QgZ2V0U2xvcGUgPSAodCwgYTEsIGEyKSA9PiAzICogYShhMSwgYTIpICogdCAqIHQgKyAyICogYihhMSwgYTIpICogdCArIGMoYTEpO1xuXHRjb25zdCBnZXRUZm9yWCA9ICh4KSA9PiB7XG5cdFx0bGV0IGFHdWVzc1QgPSB4O1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgNDsgKytpKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50U2xvcGUgPSBnZXRTbG9wZShhR3Vlc3NULCBwMCwgcDIpO1xuXHRcdFx0aWYgKGN1cnJlbnRTbG9wZSA9PT0gMCkgcmV0dXJuIGFHdWVzc1Q7XG5cdFx0XHRjb25zdCBjdXJyZW50WCA9IGNhbGNCZXppZXIoYUd1ZXNzVCwgcDAsIHAyKSAtIHg7XG5cdFx0XHRhR3Vlc3NUIC09IGN1cnJlbnRYIC8gY3VycmVudFNsb3BlO1xuXHRcdH1cblx0XHRyZXR1cm4gYUd1ZXNzVDtcblx0fTtcblx0cmV0dXJuICh4KSA9PiBwMCA9PT0gcDEgJiYgcDIgPT09IHAzID8geCA6IGNhbGNCZXppZXIoZ2V0VGZvclgoeCksIHAxLCBwMyk7XG59XG5mdW5jdGlvbiBsZXJwKGEsIGIsIGFscGhhKSB7XG5cdHJldHVybiBhICsgYWxwaGEgKiAoYiAtIGEpO1xufVxuZnVuY3Rpb24gZGVmYXVsdEludGVycG9sYXRpb24oYSwgYiwgdCkge1xuXHRjb25zdCBhVmFsID0gdG9WYWx1ZShhKTtcblx0Y29uc3QgYlZhbCA9IHRvVmFsdWUoYik7XG5cdGlmICh0eXBlb2YgYVZhbCA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGxlcnAoYVZhbCwgYlZhbCwgdCk7XG5cdGlmIChBcnJheS5pc0FycmF5KGFWYWwpICYmIEFycmF5LmlzQXJyYXkoYlZhbCkpIHJldHVybiBhVmFsLm1hcCgodiwgaSkgPT4gbGVycCh2LCB0b1ZhbHVlKGJWYWxbaV0pLCB0KSk7XG5cdHRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIHRyYW5zaXRpb24gdHlwZSwgc3BlY2lmeSBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLlwiKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVhc2luZyhlYXNpbmcpIHtcblx0dmFyIF90b1ZhbHVlO1xuXHRyZXR1cm4gdHlwZW9mIGVhc2luZyA9PT0gXCJmdW5jdGlvblwiID8gZWFzaW5nIDogKF90b1ZhbHVlID0gdG9WYWx1ZShlYXNpbmcpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZSAhPT0gdm9pZCAwID8gX3RvVmFsdWUgOiBpZGVudGl0eTtcbn1cbi8qKlxuKiBUcmFuc2l0aW9uIGZyb20gb25lIHZhbHVlIHRvIGFub3RoZXIuXG4qXG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIGZyb21cbiogQHBhcmFtIHRvXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdHJhbnNpdGlvbihzb3VyY2UsIGZyb20sIHRvLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF90b1ZhbHVlMjtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgZnJvbVZhbCA9IHRvVmFsdWUoZnJvbSk7XG5cdGNvbnN0IHRvVmFsID0gdG9WYWx1ZSh0byk7XG5cdGNvbnN0IGR1cmF0aW9uID0gKF90b1ZhbHVlMiA9IHRvVmFsdWUob3B0aW9ucy5kdXJhdGlvbikpICE9PSBudWxsICYmIF90b1ZhbHVlMiAhPT0gdm9pZCAwID8gX3RvVmFsdWUyIDogMWUzO1xuXHRjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXHRjb25zdCBlbmRBdCA9IERhdGUubm93KCkgKyBkdXJhdGlvbjtcblx0Y29uc3QgaW50ZXJwb2xhdGlvbiA9IHR5cGVvZiBvcHRpb25zLmludGVycG9sYXRpb24gPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaW50ZXJwb2xhdGlvbiA6IGRlZmF1bHRJbnRlcnBvbGF0aW9uO1xuXHRjb25zdCB0cmFucyA9IHR5cGVvZiBvcHRpb25zLmVhc2luZyAhPT0gXCJ1bmRlZmluZWRcIiA/IG5vcm1hbGl6ZUVhc2luZyhvcHRpb25zLmVhc2luZykgOiBub3JtYWxpemVFYXNpbmcob3B0aW9ucy50cmFuc2l0aW9uKTtcblx0Y29uc3QgZWFzZSA9IHR5cGVvZiB0cmFucyA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnMgOiBjcmVhdGVFYXNpbmdGdW5jdGlvbih0cmFucyk7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdHNvdXJjZS52YWx1ZSA9IGZyb21WYWw7XG5cdFx0Y29uc3QgdGljayA9ICgpID0+IHtcblx0XHRcdHZhciBfb3B0aW9ucyRhYm9ydDtcblx0XHRcdGlmICgoX29wdGlvbnMkYWJvcnQgPSBvcHRpb25zLmFib3J0KSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRhYm9ydCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkYWJvcnQuY2FsbChvcHRpb25zKSkge1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cdFx0XHRzb3VyY2UudmFsdWUgPSBpbnRlcnBvbGF0aW9uKGZyb21WYWwsIHRvVmFsLCBlYXNlKChub3cgLSBzdGFydGVkQXQpIC8gZHVyYXRpb24pKTtcblx0XHRcdGlmIChub3cgPCBlbmRBdCkgd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCB8fCB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0c291cmNlLnZhbHVlID0gdG9WYWw7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRpY2soKTtcblx0fSk7XG59XG4vKipcbiogVHJhbnNpdGlvbiBmcm9tIG9uZSB2YWx1ZSB0byBhbm90aGVyLlxuKiBAZGVwcmVjYXRlZCBUaGUgYGV4ZWN1dGVUcmFuc2l0aW9uYCBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgYHRyYW5zaXRpb25gIGluc3RlYWQuXG4qXG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIGZyb21cbiogQHBhcmFtIHRvXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gZXhlY3V0ZVRyYW5zaXRpb24oc291cmNlLCBmcm9tLCB0bywgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiB0cmFuc2l0aW9uKHNvdXJjZSwgZnJvbSwgdG8sIG9wdGlvbnMpO1xufVxuLyoqXG4qIEZvbGxvdyB2YWx1ZSB3aXRoIGEgdHJhbnNpdGlvbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVHJhbnNpdGlvblxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVHJhbnNpdGlvbihzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgY3VycmVudElkID0gMDtcblx0Y29uc3Qgc291cmNlVmFsID0gKCkgPT4ge1xuXHRcdGNvbnN0IHYgPSB0b1ZhbHVlKHNvdXJjZSk7XG5cdFx0cmV0dXJuIHR5cGVvZiBvcHRpb25zLmludGVycG9sYXRpb24gPT09IFwidW5kZWZpbmVkXCIgJiYgQXJyYXkuaXNBcnJheSh2KSA/IHYubWFwKHRvVmFsdWUpIDogdjtcblx0fTtcblx0Y29uc3Qgb3V0cHV0UmVmID0gc2hhbGxvd1JlZihzb3VyY2VWYWwoKSk7XG5cdHdhdGNoKHNvdXJjZVZhbCwgYXN5bmMgKHRvKSA9PiB7XG5cdFx0dmFyIF9vcHRpb25zJG9uU3RhcnRlZCwgX29wdGlvbnMkb25GaW5pc2hlZDtcblx0XHRpZiAodG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSkgcmV0dXJuO1xuXHRcdGNvbnN0IGlkID0gKytjdXJyZW50SWQ7XG5cdFx0aWYgKG9wdGlvbnMuZGVsYXkpIGF3YWl0IHByb21pc2VUaW1lb3V0KHRvVmFsdWUob3B0aW9ucy5kZWxheSkpO1xuXHRcdGlmIChpZCAhPT0gY3VycmVudElkKSByZXR1cm47XG5cdFx0KF9vcHRpb25zJG9uU3RhcnRlZCA9IG9wdGlvbnMub25TdGFydGVkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblN0YXJ0ZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvblN0YXJ0ZWQuY2FsbChvcHRpb25zKTtcblx0XHRhd2FpdCB0cmFuc2l0aW9uKG91dHB1dFJlZiwgb3V0cHV0UmVmLnZhbHVlLCB0bywge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdGFib3J0OiAoKSA9PiB7XG5cdFx0XHRcdHZhciBfb3B0aW9ucyRhYm9ydDI7XG5cdFx0XHRcdHJldHVybiBpZCAhPT0gY3VycmVudElkIHx8ICgoX29wdGlvbnMkYWJvcnQyID0gb3B0aW9ucy5hYm9ydCkgPT09IG51bGwgfHwgX29wdGlvbnMkYWJvcnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRhYm9ydDIuY2FsbChvcHRpb25zKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0KF9vcHRpb25zJG9uRmluaXNoZWQgPSBvcHRpb25zLm9uRmluaXNoZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uRmluaXNoZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvbkZpbmlzaGVkLmNhbGwob3B0aW9ucyk7XG5cdH0sIHsgZGVlcDogdHJ1ZSB9KTtcblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSwgKGRpc2FibGVkKSA9PiB7XG5cdFx0aWYgKGRpc2FibGVkKSB7XG5cdFx0XHRjdXJyZW50SWQrKztcblx0XHRcdG91dHB1dFJlZi52YWx1ZSA9IHNvdXJjZVZhbCgpO1xuXHRcdH1cblx0fSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRjdXJyZW50SWQrKztcblx0fSk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpID8gc291cmNlVmFsKCkgOiBvdXRwdXRSZWYudmFsdWUpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VVcmxTZWFyY2hQYXJhbXMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBVUkxTZWFyY2hQYXJhbXNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVXJsU2VhcmNoUGFyYW1zXG4qIEBwYXJhbSBtb2RlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVXJsU2VhcmNoUGFyYW1zKG1vZGUgPSBcImhpc3RvcnlcIiwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFZhbHVlID0ge30sIHJlbW92ZU51bGxpc2hWYWx1ZXMgPSB0cnVlLCByZW1vdmVGYWxzeVZhbHVlcyA9IGZhbHNlLCB3cml0ZTogZW5hYmxlV3JpdGUgPSB0cnVlLCB3cml0ZU1vZGUgPSBcInJlcGxhY2VcIiwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHN0cmluZ2lmeSA9IChwYXJhbXMpID0+IHBhcmFtcy50b1N0cmluZygpIH0gPSBvcHRpb25zO1xuXHRpZiAoIXdpbmRvdyQxKSByZXR1cm4gcmVhY3RpdmUoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3Qgc3RhdGUgPSByZWFjdGl2ZSh7fSk7XG5cdGZ1bmN0aW9uIGdldFJhd1BhcmFtcygpIHtcblx0XHRpZiAobW9kZSA9PT0gXCJoaXN0b3J5XCIpIHJldHVybiB3aW5kb3ckMS5sb2NhdGlvbi5zZWFyY2ggfHwgXCJcIjtcblx0XHRlbHNlIGlmIChtb2RlID09PSBcImhhc2hcIikge1xuXHRcdFx0Y29uc3QgaGFzaCA9IHdpbmRvdyQxLmxvY2F0aW9uLmhhc2ggfHwgXCJcIjtcblx0XHRcdGNvbnN0IGluZGV4ID0gaGFzaC5pbmRleE9mKFwiP1wiKTtcblx0XHRcdHJldHVybiBpbmRleCA+IDAgPyBoYXNoLnNsaWNlKGluZGV4KSA6IFwiXCI7XG5cdFx0fSBlbHNlIHJldHVybiAod2luZG93JDEubG9jYXRpb24uaGFzaCB8fCBcIlwiKS5yZXBsYWNlKC9eIy8sIFwiXCIpO1xuXHR9XG5cdGZ1bmN0aW9uIGNvbnN0cnVjdFF1ZXJ5KHBhcmFtcykge1xuXHRcdGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5KHBhcmFtcyk7XG5cdFx0aWYgKG1vZGUgPT09IFwiaGlzdG9yeVwiKSByZXR1cm4gYCR7c3RyaW5naWZpZWQgPyBgPyR7c3RyaW5naWZpZWR9YCA6IFwiXCJ9JHt3aW5kb3ckMS5sb2NhdGlvbi5oYXNoIHx8IFwiXCJ9YDtcblx0XHRpZiAobW9kZSA9PT0gXCJoYXNoLXBhcmFtc1wiKSByZXR1cm4gYCR7d2luZG93JDEubG9jYXRpb24uc2VhcmNoIHx8IFwiXCJ9JHtzdHJpbmdpZmllZCA/IGAjJHtzdHJpbmdpZmllZH1gIDogXCJcIn1gO1xuXHRcdGNvbnN0IGhhc2ggPSB3aW5kb3ckMS5sb2NhdGlvbi5oYXNoIHx8IFwiI1wiO1xuXHRcdGNvbnN0IGluZGV4ID0gaGFzaC5pbmRleE9mKFwiP1wiKTtcblx0XHRpZiAoaW5kZXggPiAwKSByZXR1cm4gYCR7d2luZG93JDEubG9jYXRpb24uc2VhcmNoIHx8IFwiXCJ9JHtoYXNoLnNsaWNlKDAsIGluZGV4KX0ke3N0cmluZ2lmaWVkID8gYD8ke3N0cmluZ2lmaWVkfWAgOiBcIlwifWA7XG5cdFx0cmV0dXJuIGAke3dpbmRvdyQxLmxvY2F0aW9uLnNlYXJjaCB8fCBcIlwifSR7aGFzaH0ke3N0cmluZ2lmaWVkID8gYD8ke3N0cmluZ2lmaWVkfWAgOiBcIlwifWA7XG5cdH1cblx0ZnVuY3Rpb24gcmVhZCgpIHtcblx0XHRyZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyhnZXRSYXdQYXJhbXMoKSk7XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlU3RhdGUocGFyYW1zKSB7XG5cdFx0Y29uc3QgdW51c2VkS2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoc3RhdGUpKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBwYXJhbXMua2V5cygpKSB7XG5cdFx0XHRjb25zdCBwYXJhbXNGb3JLZXkgPSBwYXJhbXMuZ2V0QWxsKGtleSk7XG5cdFx0XHRzdGF0ZVtrZXldID0gcGFyYW1zRm9yS2V5Lmxlbmd0aCA+IDEgPyBwYXJhbXNGb3JLZXkgOiBwYXJhbXMuZ2V0KGtleSkgfHwgXCJcIjtcblx0XHRcdHVudXNlZEtleXMuZGVsZXRlKGtleSk7XG5cdFx0fVxuXHRcdEFycmF5LmZyb20odW51c2VkS2V5cykuZm9yRWFjaCgoa2V5KSA9PiBkZWxldGUgc3RhdGVba2V5XSk7XG5cdH1cblx0Y29uc3QgeyBwYXVzZSwgcmVzdW1lIH0gPSB3YXRjaFBhdXNhYmxlKHN0YXRlLCAoKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhcIlwiKTtcblx0XHRPYmplY3Qua2V5cyhzdGF0ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG5cdFx0XHRjb25zdCBtYXBFbnRyeSA9IHN0YXRlW2tleV07XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShtYXBFbnRyeSkpIG1hcEVudHJ5LmZvckVhY2goKHZhbHVlKSA9PiBwYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpKTtcblx0XHRcdGVsc2UgaWYgKHJlbW92ZU51bGxpc2hWYWx1ZXMgJiYgbWFwRW50cnkgPT0gbnVsbCkgcGFyYW1zLmRlbGV0ZShrZXkpO1xuXHRcdFx0ZWxzZSBpZiAocmVtb3ZlRmFsc3lWYWx1ZXMgJiYgIW1hcEVudHJ5KSBwYXJhbXMuZGVsZXRlKGtleSk7XG5cdFx0XHRlbHNlIHBhcmFtcy5zZXQoa2V5LCBtYXBFbnRyeSk7XG5cdFx0fSk7XG5cdFx0d3JpdGUocGFyYW1zLCBmYWxzZSk7XG5cdH0sIHsgZGVlcDogdHJ1ZSB9KTtcblx0ZnVuY3Rpb24gd3JpdGUocGFyYW1zLCBzaG91bGRVcGRhdGUsIHNob3VsZFdyaXRlSGlzdG9yeSA9IHRydWUpIHtcblx0XHRwYXVzZSgpO1xuXHRcdGlmIChzaG91bGRVcGRhdGUpIHVwZGF0ZVN0YXRlKHBhcmFtcyk7XG5cdFx0aWYgKHdyaXRlTW9kZSA9PT0gXCJyZXBsYWNlXCIpIHdpbmRvdyQxLmhpc3RvcnkucmVwbGFjZVN0YXRlKHdpbmRvdyQxLmhpc3Rvcnkuc3RhdGUsIHdpbmRvdyQxLmRvY3VtZW50LnRpdGxlLCB3aW5kb3ckMS5sb2NhdGlvbi5wYXRobmFtZSArIGNvbnN0cnVjdFF1ZXJ5KHBhcmFtcykpO1xuXHRcdGVsc2UgaWYgKHNob3VsZFdyaXRlSGlzdG9yeSkgd2luZG93JDEuaGlzdG9yeS5wdXNoU3RhdGUod2luZG93JDEuaGlzdG9yeS5zdGF0ZSwgd2luZG93JDEuZG9jdW1lbnQudGl0bGUsIHdpbmRvdyQxLmxvY2F0aW9uLnBhdGhuYW1lICsgY29uc3RydWN0UXVlcnkocGFyYW1zKSk7XG5cdFx0bmV4dFRpY2soKCkgPT4gcmVzdW1lKCkpO1xuXHR9XG5cdGZ1bmN0aW9uIG9uQ2hhbmdlZCgpIHtcblx0XHRpZiAoIWVuYWJsZVdyaXRlKSByZXR1cm47XG5cdFx0d3JpdGUocmVhZCgpLCB0cnVlLCBmYWxzZSk7XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwicG9wc3RhdGVcIiwgb25DaGFuZ2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRpZiAobW9kZSAhPT0gXCJoaXN0b3J5XCIpIHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiaGFzaGNoYW5nZVwiLCBvbkNoYW5nZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGNvbnN0IGluaXRpYWwgPSByZWFkKCk7XG5cdGlmIChpbml0aWFsLmtleXMoKS5uZXh0KCkudmFsdWUpIHVwZGF0ZVN0YXRlKGluaXRpYWwpO1xuXHRlbHNlIE9iamVjdC5hc3NpZ24oc3RhdGUsIGluaXRpYWxWYWx1ZSk7XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVXNlck1lZGlhL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYG1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWFgIHN0cmVhbWluZ1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VVc2VyTWVkaWFcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VVc2VyTWVkaWEob3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRlbmFibGVkLCBfb3B0aW9ucyRhdXRvU3dpdGNoO1xuXHRjb25zdCBlbmFibGVkID0gc2hhbGxvd1JlZigoX29wdGlvbnMkZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCkgIT09IG51bGwgJiYgX29wdGlvbnMkZW5hYmxlZCAhPT0gdm9pZCAwID8gX29wdGlvbnMkZW5hYmxlZCA6IGZhbHNlKTtcblx0Y29uc3QgYXV0b1N3aXRjaCA9IHNoYWxsb3dSZWYoKF9vcHRpb25zJGF1dG9Td2l0Y2ggPSBvcHRpb25zLmF1dG9Td2l0Y2gpICE9PSBudWxsICYmIF9vcHRpb25zJGF1dG9Td2l0Y2ggIT09IHZvaWQgMCA/IF9vcHRpb25zJGF1dG9Td2l0Y2ggOiB0cnVlKTtcblx0Y29uc3QgY29uc3RyYWludHMgPSByZWYob3B0aW9ucy5jb25zdHJhaW50cyk7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB7XG5cdFx0dmFyIF9uYXZpZ2F0b3IkbWVkaWFEZXZpYztcblx0XHRyZXR1cm4gbmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCB8fCAoX25hdmlnYXRvciRtZWRpYURldmljID0gbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzKSA9PT0gbnVsbCB8fCBfbmF2aWdhdG9yJG1lZGlhRGV2aWMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uYXZpZ2F0b3IkbWVkaWFEZXZpYy5nZXRVc2VyTWVkaWE7XG5cdH0pO1xuXHRjb25zdCBzdHJlYW0gPSBzaGFsbG93UmVmKCk7XG5cdGZ1bmN0aW9uIGdldERldmljZU9wdGlvbnModHlwZSkge1xuXHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0Y2FzZSBcInZpZGVvXCI6XG5cdFx0XHRcdGlmIChjb25zdHJhaW50cy52YWx1ZSkgcmV0dXJuIGNvbnN0cmFpbnRzLnZhbHVlLnZpZGVvIHx8IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJhdWRpb1wiOlxuXHRcdFx0XHRpZiAoY29uc3RyYWludHMudmFsdWUpIHJldHVybiBjb25zdHJhaW50cy52YWx1ZS5hdWRpbyB8fCBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIF9zdGFydCgpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8IHN0cmVhbS52YWx1ZSkgcmV0dXJuO1xuXHRcdHN0cmVhbS52YWx1ZSA9IGF3YWl0IG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuXHRcdFx0dmlkZW86IGdldERldmljZU9wdGlvbnMoXCJ2aWRlb1wiKSxcblx0XHRcdGF1ZGlvOiBnZXREZXZpY2VPcHRpb25zKFwiYXVkaW9cIilcblx0XHR9KTtcblx0XHRyZXR1cm4gc3RyZWFtLnZhbHVlO1xuXHR9XG5cdGZ1bmN0aW9uIF9zdG9wKCkge1xuXHRcdHZhciBfc3RyZWFtJHZhbHVlO1xuXHRcdChfc3RyZWFtJHZhbHVlID0gc3RyZWFtLnZhbHVlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJHZhbHVlID09PSB2b2lkIDAgfHwgX3N0cmVhbSR2YWx1ZS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG5cdFx0c3RyZWFtLnZhbHVlID0gdm9pZCAwO1xuXHR9XG5cdGZ1bmN0aW9uIHN0b3AoKSB7XG5cdFx0X3N0b3AoKTtcblx0XHRlbmFibGVkLnZhbHVlID0gZmFsc2U7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gc3RhcnQoKSB7XG5cdFx0YXdhaXQgX3N0YXJ0KCk7XG5cdFx0aWYgKHN0cmVhbS52YWx1ZSkgZW5hYmxlZC52YWx1ZSA9IHRydWU7XG5cdFx0cmV0dXJuIHN0cmVhbS52YWx1ZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZXN0YXJ0KCkge1xuXHRcdF9zdG9wKCk7XG5cdFx0cmV0dXJuIGF3YWl0IHN0YXJ0KCk7XG5cdH1cblx0d2F0Y2goZW5hYmxlZCwgKHYpID0+IHtcblx0XHRpZiAodikgX3N0YXJ0KCk7XG5cdFx0ZWxzZSBfc3RvcCgpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0d2F0Y2goY29uc3RyYWludHMsICgpID0+IHtcblx0XHRpZiAoYXV0b1N3aXRjaC52YWx1ZSAmJiBzdHJlYW0udmFsdWUpIHJlc3RhcnQoKTtcblx0fSwge1xuXHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRkZWVwOiB0cnVlXG5cdH0pO1xuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0c3RvcCgpO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdHJlYW0sXG5cdFx0c3RhcnQsXG5cdFx0c3RvcCxcblx0XHRyZXN0YXJ0LFxuXHRcdGNvbnN0cmFpbnRzLFxuXHRcdGVuYWJsZWQsXG5cdFx0YXV0b1N3aXRjaFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VWTW9kZWwvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHYtbW9kZWwgYmluZGluZywgcHJvcHMgKyBlbWl0IC0+IHJlZlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VWTW9kZWxcbiogQHBhcmFtIHByb3BzXG4qIEBwYXJhbSBrZXkgKGRlZmF1bHQgJ21vZGVsVmFsdWUnKVxuKiBAcGFyYW0gZW1pdFxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVZNb2RlbChwcm9wcywga2V5LCBlbWl0LCBvcHRpb25zID0ge30pIHtcblx0dmFyIF92bSQkZW1pdCwgX3ZtJHByb3h5O1xuXHRjb25zdCB7IGNsb25lID0gZmFsc2UsIHBhc3NpdmUgPSBmYWxzZSwgZXZlbnROYW1lLCBkZWVwID0gZmFsc2UsIGRlZmF1bHRWYWx1ZSwgc2hvdWxkRW1pdCB9ID0gb3B0aW9ucztcblx0Y29uc3Qgdm0gPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcblx0Y29uc3QgX2VtaXQgPSBlbWl0IHx8ICh2bSA9PT0gbnVsbCB8fCB2bSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdm0uZW1pdCkgfHwgKHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgfHwgKF92bSQkZW1pdCA9IHZtLiRlbWl0KSA9PT0gbnVsbCB8fCBfdm0kJGVtaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF92bSQkZW1pdC5iaW5kKHZtKSkgfHwgKHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgfHwgKF92bSRwcm94eSA9IHZtLnByb3h5KSA9PT0gbnVsbCB8fCBfdm0kcHJveHkgPT09IHZvaWQgMCB8fCAoX3ZtJHByb3h5ID0gX3ZtJHByb3h5LiRlbWl0KSA9PT0gbnVsbCB8fCBfdm0kcHJveHkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF92bSRwcm94eS5iaW5kKHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2bS5wcm94eSkpO1xuXHRsZXQgZXZlbnQgPSBldmVudE5hbWU7XG5cdGlmICgha2V5KSBrZXkgPSBcIm1vZGVsVmFsdWVcIjtcblx0ZXZlbnQgPSBldmVudCB8fCBgdXBkYXRlOiR7a2V5LnRvU3RyaW5nKCl9YDtcblx0Y29uc3QgY2xvbmVGbiA9ICh2YWwpID0+ICFjbG9uZSA/IHZhbCA6IHR5cGVvZiBjbG9uZSA9PT0gXCJmdW5jdGlvblwiID8gY2xvbmUodmFsKSA6IGNsb25lRm5KU09OKHZhbCk7XG5cdGNvbnN0IGdldFZhbHVlJDEgPSAoKSA9PiBpc0RlZihwcm9wc1trZXldKSA/IGNsb25lRm4ocHJvcHNba2V5XSkgOiBkZWZhdWx0VmFsdWU7XG5cdGNvbnN0IHRyaWdnZXJFbWl0ID0gKHZhbHVlKSA9PiB7XG5cdFx0aWYgKHNob3VsZEVtaXQpIHtcblx0XHRcdGlmIChzaG91bGRFbWl0KHZhbHVlKSkgX2VtaXQoZXZlbnQsIHZhbHVlKTtcblx0XHR9IGVsc2UgX2VtaXQoZXZlbnQsIHZhbHVlKTtcblx0fTtcblx0aWYgKHBhc3NpdmUpIHtcblx0XHRjb25zdCBwcm94eSA9IHJlZihnZXRWYWx1ZSQxKCkpO1xuXHRcdGxldCBpc1VwZGF0aW5nID0gZmFsc2U7XG5cdFx0d2F0Y2goKCkgPT4gcHJvcHNba2V5XSwgKHYpID0+IHtcblx0XHRcdGlmICghaXNVcGRhdGluZykge1xuXHRcdFx0XHRpc1VwZGF0aW5nID0gdHJ1ZTtcblx0XHRcdFx0cHJveHkudmFsdWUgPSBjbG9uZUZuKHYpO1xuXHRcdFx0XHRuZXh0VGljaygoKSA9PiBpc1VwZGF0aW5nID0gZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHdhdGNoKHByb3h5LCAodikgPT4ge1xuXHRcdFx0aWYgKCFpc1VwZGF0aW5nICYmICh2ICE9PSBwcm9wc1trZXldIHx8IGRlZXApKSB0cmlnZ2VyRW1pdCh2KTtcblx0XHR9LCB7IGRlZXAgfSk7XG5cdFx0cmV0dXJuIHByb3h5O1xuXHR9IGVsc2UgcmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZ2V0VmFsdWUkMSgpO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHR0cmlnZ2VyRW1pdCh2YWx1ZSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVk1vZGVscy9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3IgcHJvcHMgdi1tb2RlbCBiaW5kaW5nLiBUaGluayBsaWtlIGB0b1JlZnMocHJvcHMpYCBidXQgY2hhbmdlcyB3aWxsIGFsc28gZW1pdCBvdXQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVZNb2RlbHNcbiogQHBhcmFtIHByb3BzXG4qIEBwYXJhbSBlbWl0XG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVk1vZGVscyhwcm9wcywgZW1pdCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHJldCA9IHt9O1xuXHRmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykgcmV0W2tleV0gPSB1c2VWTW9kZWwocHJvcHMsIGtleSwgZW1pdCwgb3B0aW9ucyk7XG5cdHJldHVybiByZXQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVZpYnJhdGUvaW5kZXgudHNcbmZ1bmN0aW9uIGdldERlZmF1bHRTY2hlZHVsZXIkMShvcHRpb25zID0geyBpbnRlcnZhbDogMCB9KSB7XG5cdGNvbnN0IHsgaW50ZXJ2YWwgfSA9IG9wdGlvbnM7XG5cdGlmIChpbnRlcnZhbCA9PT0gMCkgcmV0dXJuO1xuXHRyZXR1cm4gKGZuKSA9PiB1c2VJbnRlcnZhbEZuKGZuLCBpbnRlcnZhbCwge1xuXHRcdGltbWVkaWF0ZTogZmFsc2UsXG5cdFx0aW1tZWRpYXRlQ2FsbGJhY2s6IGZhbHNlXG5cdH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIHZpYnJhdGVcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVmlicmF0ZVxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9WaWJyYXRpb25fQVBJXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVmlicmF0ZShvcHRpb25zKSB7XG5cdGNvbnN0IHsgcGF0dGVybiA9IFtdLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDEob3B0aW9ucyksIG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zIHx8IHt9O1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gdHlwZW9mIG5hdmlnYXRvciQxICE9PSBcInVuZGVmaW5lZFwiICYmIFwidmlicmF0ZVwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgcGF0dGVyblJlZiA9IHRvUmVmKHBhdHRlcm4pO1xuXHRjb25zdCB2aWJyYXRlID0gKHBhdHRlcm4kMSA9IHBhdHRlcm5SZWYudmFsdWUpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIG5hdmlnYXRvciQxLnZpYnJhdGUocGF0dGVybiQxKTtcblx0fTtcblx0Y29uc3QgaW50ZXJ2YWxDb250cm9scyA9IHNjaGVkdWxlciA9PT0gbnVsbCB8fCBzY2hlZHVsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVkdWxlcih2aWJyYXRlKTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIG5hdmlnYXRvciQxLnZpYnJhdGUoMCk7XG5cdFx0aW50ZXJ2YWxDb250cm9scyA9PT0gbnVsbCB8fCBpbnRlcnZhbENvbnRyb2xzID09PSB2b2lkIDAgfHwgaW50ZXJ2YWxDb250cm9scy5wYXVzZSgpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHBhdHRlcm4sXG5cdFx0aW50ZXJ2YWxDb250cm9scyxcblx0XHR2aWJyYXRlLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVmlydHVhbExpc3QvaW5kZXgudHNcbi8qKlxuKiBQbGVhc2UgY29uc2lkZXIgdXNpbmcgW2B2dWUtdmlydHVhbC1zY3JvbGxlcmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9Ba3J5dW0vdnVlLXZpcnR1YWwtc2Nyb2xsZXIpIGlmIHlvdSBhcmUgbG9va2luZyBmb3IgbW9yZSBmZWF0dXJlcy5cbiovXG5mdW5jdGlvbiB1c2VWaXJ0dWFsTGlzdChsaXN0LCBvcHRpb25zKSB7XG5cdGNvbnN0IHsgY29udGFpbmVyU3R5bGUsIHdyYXBwZXJQcm9wcywgc2Nyb2xsVG8sIGNhbGN1bGF0ZVJhbmdlLCBjdXJyZW50TGlzdCwgY29udGFpbmVyUmVmIH0gPSBcIml0ZW1IZWlnaHRcIiBpbiBvcHRpb25zID8gdXNlVmVydGljYWxWaXJ0dWFsTGlzdChvcHRpb25zLCBsaXN0KSA6IHVzZUhvcml6b250YWxWaXJ0dWFsTGlzdChvcHRpb25zLCBsaXN0KTtcblx0cmV0dXJuIHtcblx0XHRsaXN0OiBjdXJyZW50TGlzdCxcblx0XHRzY3JvbGxUbyxcblx0XHRjb250YWluZXJQcm9wczoge1xuXHRcdFx0cmVmOiBjb250YWluZXJSZWYsXG5cdFx0XHRvblNjcm9sbDogKCkgPT4ge1xuXHRcdFx0XHRjYWxjdWxhdGVSYW5nZSgpO1xuXHRcdFx0fSxcblx0XHRcdHN0eWxlOiBjb250YWluZXJTdHlsZVxuXHRcdH0sXG5cdFx0d3JhcHBlclByb3BzXG5cdH07XG59XG5mdW5jdGlvbiB1c2VWaXJ0dWFsTGlzdFJlc291cmNlcyhsaXN0KSB7XG5cdGNvbnN0IGNvbnRhaW5lclJlZiA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHNpemUgPSB1c2VFbGVtZW50U2l6ZShjb250YWluZXJSZWYpO1xuXHRjb25zdCBjdXJyZW50TGlzdCA9IHJlZihbXSk7XG5cdGNvbnN0IHNvdXJjZSA9IHNoYWxsb3dSZWYobGlzdCk7XG5cdHJldHVybiB7XG5cdFx0c3RhdGU6IHJlZih7XG5cdFx0XHRzdGFydDogMCxcblx0XHRcdGVuZDogMTBcblx0XHR9KSxcblx0XHRzb3VyY2UsXG5cdFx0Y3VycmVudExpc3QsXG5cdFx0c2l6ZSxcblx0XHRjb250YWluZXJSZWZcblx0fTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUdldFZpZXdDYXBhY2l0eShzdGF0ZSwgc291cmNlLCBpdGVtU2l6ZSkge1xuXHRyZXR1cm4gKGNvbnRhaW5lclNpemUpID0+IHtcblx0XHRpZiAodHlwZW9mIGl0ZW1TaXplID09PSBcIm51bWJlclwiKSByZXR1cm4gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG5cdFx0Y29uc3QgeyBzdGFydCA9IDAgfSA9IHN0YXRlLnZhbHVlO1xuXHRcdGxldCBzdW0gPSAwO1xuXHRcdGxldCBjYXBhY2l0eSA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc291cmNlLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzaXplID0gaXRlbVNpemUoaSk7XG5cdFx0XHRzdW0gKz0gc2l6ZTtcblx0XHRcdGNhcGFjaXR5ID0gaTtcblx0XHRcdGlmIChzdW0gPiBjb250YWluZXJTaXplKSBicmVhaztcblx0XHR9XG5cdFx0cmV0dXJuIGNhcGFjaXR5IC0gc3RhcnQ7XG5cdH07XG59XG5mdW5jdGlvbiBjcmVhdGVHZXRPZmZzZXQoc291cmNlLCBpdGVtU2l6ZSkge1xuXHRyZXR1cm4gKHNjcm9sbERpcmVjdGlvbikgPT4ge1xuXHRcdGlmICh0eXBlb2YgaXRlbVNpemUgPT09IFwibnVtYmVyXCIpIHJldHVybiBNYXRoLmZsb29yKHNjcm9sbERpcmVjdGlvbiAvIGl0ZW1TaXplKSArIDE7XG5cdFx0bGV0IHN1bSA9IDA7XG5cdFx0bGV0IG9mZnNldCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UudmFsdWUubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHNpemUgPSBpdGVtU2l6ZShpKTtcblx0XHRcdHN1bSArPSBzaXplO1xuXHRcdFx0aWYgKHN1bSA+PSBzY3JvbGxEaXJlY3Rpb24pIHtcblx0XHRcdFx0b2Zmc2V0ID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvZmZzZXQgKyAxO1xuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FsY3VsYXRlUmFuZ2UodHlwZSwgb3ZlcnNjYW4sIGdldE9mZnNldCwgZ2V0Vmlld0NhcGFjaXR5LCB7IGNvbnRhaW5lclJlZiwgc3RhdGUsIGN1cnJlbnRMaXN0LCBzb3VyY2UgfSkge1xuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBjb250YWluZXJSZWYudmFsdWU7XG5cdFx0aWYgKGVsZW1lbnQpIHtcblx0XHRcdGNvbnN0IG9mZnNldCA9IGdldE9mZnNldCh0eXBlID09PSBcInZlcnRpY2FsXCIgPyBlbGVtZW50LnNjcm9sbFRvcCA6IGVsZW1lbnQuc2Nyb2xsTGVmdCk7XG5cdFx0XHRjb25zdCB2aWV3Q2FwYWNpdHkgPSBnZXRWaWV3Q2FwYWNpdHkodHlwZSA9PT0gXCJ2ZXJ0aWNhbFwiID8gZWxlbWVudC5jbGllbnRIZWlnaHQgOiBlbGVtZW50LmNsaWVudFdpZHRoKTtcblx0XHRcdGNvbnN0IGZyb20gPSBvZmZzZXQgLSBvdmVyc2Nhbjtcblx0XHRcdGNvbnN0IHRvID0gb2Zmc2V0ICsgdmlld0NhcGFjaXR5ICsgb3ZlcnNjYW47XG5cdFx0XHRzdGF0ZS52YWx1ZSA9IHtcblx0XHRcdFx0c3RhcnQ6IGZyb20gPCAwID8gMCA6IGZyb20sXG5cdFx0XHRcdGVuZDogdG8gPiBzb3VyY2UudmFsdWUubGVuZ3RoID8gc291cmNlLnZhbHVlLmxlbmd0aCA6IHRvXG5cdFx0XHR9O1xuXHRcdFx0Y3VycmVudExpc3QudmFsdWUgPSBzb3VyY2UudmFsdWUuc2xpY2Uoc3RhdGUudmFsdWUuc3RhcnQsIHN0YXRlLnZhbHVlLmVuZCkubWFwKChlbGUsIGluZGV4KSA9PiAoe1xuXHRcdFx0XHRkYXRhOiBlbGUsXG5cdFx0XHRcdGluZGV4OiBpbmRleCArIHN0YXRlLnZhbHVlLnN0YXJ0XG5cdFx0XHR9KSk7XG5cdFx0fVxuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlR2V0RGlzdGFuY2UoaXRlbVNpemUsIHNvdXJjZSkge1xuXHRyZXR1cm4gKGluZGV4KSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGluZGV4ICogaXRlbVNpemU7XG5cdFx0cmV0dXJuIHNvdXJjZS52YWx1ZS5zbGljZSgwLCBpbmRleCkucmVkdWNlKChzdW0sIF8sIGkpID0+IHN1bSArIGl0ZW1TaXplKGkpLCAwKTtcblx0fTtcbn1cbmZ1bmN0aW9uIHVzZVdhdGNoRm9yU2l6ZXMoc2l6ZSwgbGlzdCwgY29udGFpbmVyUmVmLCBjYWxjdWxhdGVSYW5nZSkge1xuXHR3YXRjaChbXG5cdFx0c2l6ZS53aWR0aCxcblx0XHRzaXplLmhlaWdodCxcblx0XHQoKSA9PiB0b1ZhbHVlKGxpc3QpLFxuXHRcdGNvbnRhaW5lclJlZlxuXHRdLCAoKSA9PiB7XG5cdFx0Y2FsY3VsYXRlUmFuZ2UoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21wdXRlZFRvdGFsU2l6ZShpdGVtU2l6ZSwgc291cmNlKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHNvdXJjZS52YWx1ZS5sZW5ndGggKiBpdGVtU2l6ZTtcblx0XHRyZXR1cm4gc291cmNlLnZhbHVlLnJlZHVjZSgoc3VtLCBfLCBpbmRleCkgPT4gc3VtICsgaXRlbVNpemUoaW5kZXgpLCAwKTtcblx0fSk7XG59XG5jb25zdCBzY3JvbGxUb0RpY3Rpb25hcnlGb3JFbGVtZW50U2Nyb2xsS2V5ID0ge1xuXHRob3Jpem9udGFsOiBcInNjcm9sbExlZnRcIixcblx0dmVydGljYWw6IFwic2Nyb2xsVG9wXCJcbn07XG5mdW5jdGlvbiBjcmVhdGVTY3JvbGxUbyh0eXBlLCBjYWxjdWxhdGVSYW5nZSwgZ2V0RGlzdGFuY2UsIGNvbnRhaW5lclJlZikge1xuXHRyZXR1cm4gKGluZGV4KSA9PiB7XG5cdFx0aWYgKGNvbnRhaW5lclJlZi52YWx1ZSkge1xuXHRcdFx0Y29udGFpbmVyUmVmLnZhbHVlW3Njcm9sbFRvRGljdGlvbmFyeUZvckVsZW1lbnRTY3JvbGxLZXlbdHlwZV1dID0gZ2V0RGlzdGFuY2UoaW5kZXgpO1xuXHRcdFx0Y2FsY3VsYXRlUmFuZ2UoKTtcblx0XHR9XG5cdH07XG59XG5mdW5jdGlvbiB1c2VIb3Jpem9udGFsVmlydHVhbExpc3Qob3B0aW9ucywgbGlzdCkge1xuXHRjb25zdCByZXNvdXJjZXMgPSB1c2VWaXJ0dWFsTGlzdFJlc291cmNlcyhsaXN0KTtcblx0Y29uc3QgeyBzdGF0ZSwgc291cmNlLCBjdXJyZW50TGlzdCwgc2l6ZSwgY29udGFpbmVyUmVmIH0gPSByZXNvdXJjZXM7XG5cdGNvbnN0IGNvbnRhaW5lclN0eWxlID0geyBvdmVyZmxvd1g6IFwiYXV0b1wiIH07XG5cdGNvbnN0IHsgaXRlbVdpZHRoLCBvdmVyc2NhbiA9IDUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGdldFZpZXdDYXBhY2l0eSA9IGNyZWF0ZUdldFZpZXdDYXBhY2l0eShzdGF0ZSwgc291cmNlLCBpdGVtV2lkdGgpO1xuXHRjb25zdCBjYWxjdWxhdGVSYW5nZSA9IGNyZWF0ZUNhbGN1bGF0ZVJhbmdlKFwiaG9yaXpvbnRhbFwiLCBvdmVyc2NhbiwgY3JlYXRlR2V0T2Zmc2V0KHNvdXJjZSwgaXRlbVdpZHRoKSwgZ2V0Vmlld0NhcGFjaXR5LCByZXNvdXJjZXMpO1xuXHRjb25zdCBnZXREaXN0YW5jZUxlZnQgPSBjcmVhdGVHZXREaXN0YW5jZShpdGVtV2lkdGgsIHNvdXJjZSk7XG5cdGNvbnN0IG9mZnNldExlZnQgPSBjb21wdXRlZCgoKSA9PiBnZXREaXN0YW5jZUxlZnQoc3RhdGUudmFsdWUuc3RhcnQpKTtcblx0Y29uc3QgdG90YWxXaWR0aCA9IGNyZWF0ZUNvbXB1dGVkVG90YWxTaXplKGl0ZW1XaWR0aCwgc291cmNlKTtcblx0dXNlV2F0Y2hGb3JTaXplcyhzaXplLCBsaXN0LCBjb250YWluZXJSZWYsIGNhbGN1bGF0ZVJhbmdlKTtcblx0cmV0dXJuIHtcblx0XHRzY3JvbGxUbzogY3JlYXRlU2Nyb2xsVG8oXCJob3Jpem9udGFsXCIsIGNhbGN1bGF0ZVJhbmdlLCBnZXREaXN0YW5jZUxlZnQsIGNvbnRhaW5lclJlZiksXG5cdFx0Y2FsY3VsYXRlUmFuZ2UsXG5cdFx0d3JhcHBlclByb3BzOiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0XHRyZXR1cm4geyBzdHlsZToge1xuXHRcdFx0XHRoZWlnaHQ6IFwiMTAwJVwiLFxuXHRcdFx0XHR3aWR0aDogYCR7dG90YWxXaWR0aC52YWx1ZSAtIG9mZnNldExlZnQudmFsdWV9cHhgLFxuXHRcdFx0XHRtYXJnaW5MZWZ0OiBgJHtvZmZzZXRMZWZ0LnZhbHVlfXB4YCxcblx0XHRcdFx0ZGlzcGxheTogXCJmbGV4XCJcblx0XHRcdH0gfTtcblx0XHR9KSxcblx0XHRjb250YWluZXJTdHlsZSxcblx0XHRjdXJyZW50TGlzdCxcblx0XHRjb250YWluZXJSZWZcblx0fTtcbn1cbmZ1bmN0aW9uIHVzZVZlcnRpY2FsVmlydHVhbExpc3Qob3B0aW9ucywgbGlzdCkge1xuXHRjb25zdCByZXNvdXJjZXMgPSB1c2VWaXJ0dWFsTGlzdFJlc291cmNlcyhsaXN0KTtcblx0Y29uc3QgeyBzdGF0ZSwgc291cmNlLCBjdXJyZW50TGlzdCwgc2l6ZSwgY29udGFpbmVyUmVmIH0gPSByZXNvdXJjZXM7XG5cdGNvbnN0IGNvbnRhaW5lclN0eWxlID0geyBvdmVyZmxvd1k6IFwiYXV0b1wiIH07XG5cdGNvbnN0IHsgaXRlbUhlaWdodCwgb3ZlcnNjYW4gPSA1IH0gPSBvcHRpb25zO1xuXHRjb25zdCBnZXRWaWV3Q2FwYWNpdHkgPSBjcmVhdGVHZXRWaWV3Q2FwYWNpdHkoc3RhdGUsIHNvdXJjZSwgaXRlbUhlaWdodCk7XG5cdGNvbnN0IGNhbGN1bGF0ZVJhbmdlID0gY3JlYXRlQ2FsY3VsYXRlUmFuZ2UoXCJ2ZXJ0aWNhbFwiLCBvdmVyc2NhbiwgY3JlYXRlR2V0T2Zmc2V0KHNvdXJjZSwgaXRlbUhlaWdodCksIGdldFZpZXdDYXBhY2l0eSwgcmVzb3VyY2VzKTtcblx0Y29uc3QgZ2V0RGlzdGFuY2VUb3AgPSBjcmVhdGVHZXREaXN0YW5jZShpdGVtSGVpZ2h0LCBzb3VyY2UpO1xuXHRjb25zdCBvZmZzZXRUb3AgPSBjb21wdXRlZCgoKSA9PiBnZXREaXN0YW5jZVRvcChzdGF0ZS52YWx1ZS5zdGFydCkpO1xuXHRjb25zdCB0b3RhbEhlaWdodCA9IGNyZWF0ZUNvbXB1dGVkVG90YWxTaXplKGl0ZW1IZWlnaHQsIHNvdXJjZSk7XG5cdHVzZVdhdGNoRm9yU2l6ZXMoc2l6ZSwgbGlzdCwgY29udGFpbmVyUmVmLCBjYWxjdWxhdGVSYW5nZSk7XG5cdHJldHVybiB7XG5cdFx0Y2FsY3VsYXRlUmFuZ2UsXG5cdFx0c2Nyb2xsVG86IGNyZWF0ZVNjcm9sbFRvKFwidmVydGljYWxcIiwgY2FsY3VsYXRlUmFuZ2UsIGdldERpc3RhbmNlVG9wLCBjb250YWluZXJSZWYpLFxuXHRcdGNvbnRhaW5lclN0eWxlLFxuXHRcdHdyYXBwZXJQcm9wczogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHsgc3R5bGU6IHtcblx0XHRcdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdFx0XHRoZWlnaHQ6IGAke3RvdGFsSGVpZ2h0LnZhbHVlIC0gb2Zmc2V0VG9wLnZhbHVlfXB4YCxcblx0XHRcdFx0bWFyZ2luVG9wOiBgJHtvZmZzZXRUb3AudmFsdWV9cHhgXG5cdFx0XHR9IH07XG5cdFx0fSksXG5cdFx0Y3VycmVudExpc3QsXG5cdFx0Y29udGFpbmVyUmVmXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdha2VMb2NrL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgU2NyZWVuIFdha2UgTG9jayBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdha2VMb2NrXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlV2FrZUxvY2sob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCByZXF1ZXN0ZWRUeXBlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHNlbnRpbmVsID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgZG9jdW1lbnRWaXNpYmlsaXR5ID0gdXNlRG9jdW1lbnRWaXNpYmlsaXR5KHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgfSk7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcIndha2VMb2NrXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBpc0FjdGl2ZSA9IGNvbXB1dGVkKCgpID0+ICEhc2VudGluZWwudmFsdWUgJiYgZG9jdW1lbnRWaXNpYmlsaXR5LnZhbHVlID09PSBcInZpc2libGVcIik7XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoc2VudGluZWwsIFwicmVsZWFzZVwiLCAoKSA9PiB7XG5cdFx0XHR2YXIgX3NlbnRpbmVsJHZhbHVlJHR5cGUsIF9zZW50aW5lbCR2YWx1ZTtcblx0XHRcdHJlcXVlc3RlZFR5cGUudmFsdWUgPSAoX3NlbnRpbmVsJHZhbHVlJHR5cGUgPSAoX3NlbnRpbmVsJHZhbHVlID0gc2VudGluZWwudmFsdWUpID09PSBudWxsIHx8IF9zZW50aW5lbCR2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbnRpbmVsJHZhbHVlLnR5cGUpICE9PSBudWxsICYmIF9zZW50aW5lbCR2YWx1ZSR0eXBlICE9PSB2b2lkIDAgPyBfc2VudGluZWwkdmFsdWUkdHlwZSA6IGZhbHNlO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHR3aGVuZXZlcigoKSA9PiBkb2N1bWVudFZpc2liaWxpdHkudmFsdWUgPT09IFwidmlzaWJsZVwiICYmIChkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEudmlzaWJpbGl0eVN0YXRlKSA9PT0gXCJ2aXNpYmxlXCIgJiYgcmVxdWVzdGVkVHlwZS52YWx1ZSwgKHR5cGUpID0+IHtcblx0XHRcdHJlcXVlc3RlZFR5cGUudmFsdWUgPSBmYWxzZTtcblx0XHRcdGZvcmNlUmVxdWVzdCh0eXBlKTtcblx0XHR9KTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBmb3JjZVJlcXVlc3QodHlwZSkge1xuXHRcdHZhciBfc2VudGluZWwkdmFsdWUyO1xuXHRcdGF3YWl0ICgoX3NlbnRpbmVsJHZhbHVlMiA9IHNlbnRpbmVsLnZhbHVlKSA9PT0gbnVsbCB8fCBfc2VudGluZWwkdmFsdWUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2VudGluZWwkdmFsdWUyLnJlbGVhc2UoKSk7XG5cdFx0c2VudGluZWwudmFsdWUgPSBpc1N1cHBvcnRlZC52YWx1ZSA/IGF3YWl0IG5hdmlnYXRvciQxLndha2VMb2NrLnJlcXVlc3QodHlwZSkgOiBudWxsO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QodHlwZSkge1xuXHRcdGlmIChkb2N1bWVudFZpc2liaWxpdHkudmFsdWUgPT09IFwidmlzaWJsZVwiKSBhd2FpdCBmb3JjZVJlcXVlc3QodHlwZSk7XG5cdFx0ZWxzZSByZXF1ZXN0ZWRUeXBlLnZhbHVlID0gdHlwZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZWxlYXNlKCkge1xuXHRcdHJlcXVlc3RlZFR5cGUudmFsdWUgPSBmYWxzZTtcblx0XHRjb25zdCBzID0gc2VudGluZWwudmFsdWU7XG5cdFx0c2VudGluZWwudmFsdWUgPSBudWxsO1xuXHRcdGF3YWl0IChzID09PSBudWxsIHx8IHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHMucmVsZWFzZSgpKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbnRpbmVsLFxuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzQWN0aXZlLFxuXHRcdHJlcXVlc3QsXG5cdFx0Zm9yY2VSZXF1ZXN0LFxuXHRcdHJlbGVhc2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViTm90aWZpY2F0aW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgdXNlV2ViTm90aWZpY2F0aW9uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdlYk5vdGlmaWNhdGlvblxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9ub3RpZmljYXRpb25cbiovXG5mdW5jdGlvbiB1c2VXZWJOb3RpZmljYXRpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHJlcXVlc3RQZXJtaXNzaW9uczogX3JlcXVlc3RGb3JQZXJtaXNzaW9ucyA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRlZmF1bHRXZWJOb3RpZmljYXRpb25PcHRpb25zID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHtcblx0XHRpZiAoIXdpbmRvdyQxIHx8ICEoXCJOb3RpZmljYXRpb25cIiBpbiB3aW5kb3ckMSkpIHJldHVybiBmYWxzZTtcblx0XHRpZiAoTm90aWZpY2F0aW9uLnBlcm1pc3Npb24gPT09IFwiZ3JhbnRlZFwiKSByZXR1cm4gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgbm90aWZpY2F0aW9uJDEgPSBuZXcgTm90aWZpY2F0aW9uKFwiXCIpO1xuXHRcdFx0bm90aWZpY2F0aW9uJDEub25zaG93ID0gKCkgPT4ge1xuXHRcdFx0XHRub3RpZmljYXRpb24kMS5jbG9zZSgpO1xuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoZS5uYW1lID09PSBcIlR5cGVFcnJvclwiKSByZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9KTtcblx0Y29uc3QgcGVybWlzc2lvbkdyYW50ZWQgPSBzaGFsbG93UmVmKGlzU3VwcG9ydGVkLnZhbHVlICYmIFwicGVybWlzc2lvblwiIGluIE5vdGlmaWNhdGlvbiAmJiBOb3RpZmljYXRpb24ucGVybWlzc2lvbiA9PT0gXCJncmFudGVkXCIpO1xuXHRjb25zdCBub3RpZmljYXRpb24gPSByZWYobnVsbCk7XG5cdGNvbnN0IGVuc3VyZVBlcm1pc3Npb25zID0gYXN5bmMgKCkgPT4ge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRpZiAoIXBlcm1pc3Npb25HcmFudGVkLnZhbHVlICYmIE5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uICE9PSBcImRlbmllZFwiKSB7XG5cdFx0XHRpZiAoYXdhaXQgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkgPT09IFwiZ3JhbnRlZFwiKSBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZTtcblx0fTtcblx0Y29uc3QgeyBvbjogb25DbGljaywgdHJpZ2dlcjogY2xpY2tUcmlnZ2VyIH0gPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgeyBvbjogb25TaG93LCB0cmlnZ2VyOiBzaG93VHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHsgb246IG9uRXJyb3IsIHRyaWdnZXI6IGVycm9yVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHsgb246IG9uQ2xvc2UsIHRyaWdnZXI6IGNsb3NlVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHNob3cgPSBhc3luYyAob3ZlcnJpZGVzKSA9PiB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCAhcGVybWlzc2lvbkdyYW50ZWQudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBvcHRpb25zJDEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0V2ViTm90aWZpY2F0aW9uT3B0aW9ucywgb3ZlcnJpZGVzKTtcblx0XHRub3RpZmljYXRpb24udmFsdWUgPSBuZXcgTm90aWZpY2F0aW9uKG9wdGlvbnMkMS50aXRsZSB8fCBcIlwiLCBvcHRpb25zJDEpO1xuXHRcdG5vdGlmaWNhdGlvbi52YWx1ZS5vbmNsaWNrID0gY2xpY2tUcmlnZ2VyO1xuXHRcdG5vdGlmaWNhdGlvbi52YWx1ZS5vbnNob3cgPSBzaG93VHJpZ2dlcjtcblx0XHRub3RpZmljYXRpb24udmFsdWUub25lcnJvciA9IGVycm9yVHJpZ2dlcjtcblx0XHRub3RpZmljYXRpb24udmFsdWUub25jbG9zZSA9IGNsb3NlVHJpZ2dlcjtcblx0XHRyZXR1cm4gbm90aWZpY2F0aW9uLnZhbHVlO1xuXHR9O1xuXHRjb25zdCBjbG9zZSA9ICgpID0+IHtcblx0XHRpZiAobm90aWZpY2F0aW9uLnZhbHVlKSBub3RpZmljYXRpb24udmFsdWUuY2xvc2UoKTtcblx0XHRub3RpZmljYXRpb24udmFsdWUgPSBudWxsO1xuXHR9O1xuXHRpZiAoX3JlcXVlc3RGb3JQZXJtaXNzaW9ucykgdHJ5T25Nb3VudGVkKGVuc3VyZVBlcm1pc3Npb25zKTtcblx0dHJ5T25TY29wZURpc3Bvc2UoY2xvc2UpO1xuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgd2luZG93JDEpIHtcblx0XHRjb25zdCBkb2N1bWVudCQxID0gd2luZG93JDEuZG9jdW1lbnQ7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInZpc2liaWxpdHljaGFuZ2VcIiwgKGUpID0+IHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmIChkb2N1bWVudCQxLnZpc2liaWxpdHlTdGF0ZSA9PT0gXCJ2aXNpYmxlXCIpIGNsb3NlKCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRub3RpZmljYXRpb24sXG5cdFx0ZW5zdXJlUGVybWlzc2lvbnMsXG5cdFx0cGVybWlzc2lvbkdyYW50ZWQsXG5cdFx0c2hvdyxcblx0XHRjbG9zZSxcblx0XHRvbkNsaWNrLFxuXHRcdG9uU2hvdyxcblx0XHRvbkVycm9yLFxuXHRcdG9uQ2xvc2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViU29ja2V0L2luZGV4LnRzXG5jb25zdCBERUZBVUxUX1BJTkdfTUVTU0FHRSA9IFwicGluZ1wiO1xuZnVuY3Rpb24gcmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucykge1xuXHRpZiAob3B0aW9ucyA9PT0gdHJ1ZSkgcmV0dXJuIHt9O1xuXHRyZXR1cm4gb3B0aW9ucztcbn1cbmZ1bmN0aW9uIGdldERlZmF1bHRTY2hlZHVsZXIob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IGludGVydmFsID0gMWUzIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIGludGVydmFsLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdH1cblx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgMWUzLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG59XG4vKipcbiogUmVhY3RpdmUgV2ViU29ja2V0IGNsaWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlV2ViU29ja2V0XG4qIEBwYXJhbSB1cmxcbiovXG5mdW5jdGlvbiB1c2VXZWJTb2NrZXQodXJsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBvbkNvbm5lY3RlZCwgb25EaXNjb25uZWN0ZWQsIG9uRXJyb3IsIG9uTWVzc2FnZSwgaW1tZWRpYXRlID0gdHJ1ZSwgYXV0b0Nvbm5lY3QgPSB0cnVlLCBhdXRvQ2xvc2UgPSB0cnVlLCBwcm90b2NvbHMgPSBbXSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZGF0YSA9IHJlZihudWxsKTtcblx0Y29uc3Qgc3RhdHVzID0gc2hhbGxvd1JlZihcIkNMT1NFRFwiKTtcblx0Y29uc3Qgd3NSZWYgPSByZWYoKTtcblx0Y29uc3QgdXJsUmVmID0gdG9SZWYodXJsKTtcblx0bGV0IGhlYXJ0YmVhdFBhdXNlO1xuXHRsZXQgaGVhcnRiZWF0UmVzdW1lO1xuXHRsZXQgZXhwbGljaXRseUNsb3NlZCA9IGZhbHNlO1xuXHRsZXQgcmV0cmllZCA9IDA7XG5cdGxldCBidWZmZXJlZERhdGEgPSBbXTtcblx0bGV0IHJldHJ5VGltZW91dDtcblx0bGV0IHBvbmdUaW1lb3V0V2FpdDtcblx0Y29uc3QgX3NlbmRCdWZmZXIgPSAoKSA9PiB7XG5cdFx0aWYgKGJ1ZmZlcmVkRGF0YS5sZW5ndGggJiYgd3NSZWYudmFsdWUgJiYgc3RhdHVzLnZhbHVlID09PSBcIk9QRU5cIikge1xuXHRcdFx0Zm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVyZWREYXRhKSB3c1JlZi52YWx1ZS5zZW5kKGJ1ZmZlcik7XG5cdFx0XHRidWZmZXJlZERhdGEgPSBbXTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0UmV0cnkgPSAoKSA9PiB7XG5cdFx0aWYgKHJldHJ5VGltZW91dCAhPSBudWxsKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQocmV0cnlUaW1lb3V0KTtcblx0XHRcdHJldHJ5VGltZW91dCA9IHZvaWQgMDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0SGVhcnRiZWF0ID0gKCkgPT4ge1xuXHRcdGNsZWFyVGltZW91dChwb25nVGltZW91dFdhaXQpO1xuXHRcdHBvbmdUaW1lb3V0V2FpdCA9IHZvaWQgMDtcblx0fTtcblx0Y29uc3QgY2xvc2UgPSAoY29kZSA9IDFlMywgcmVhc29uKSA9PiB7XG5cdFx0cmVzZXRSZXRyeSgpO1xuXHRcdGlmICghaXNDbGllbnQgJiYgIWlzV29ya2VyIHx8ICF3c1JlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGV4cGxpY2l0bHlDbG9zZWQgPSB0cnVlO1xuXHRcdHJlc2V0SGVhcnRiZWF0KCk7XG5cdFx0aGVhcnRiZWF0UGF1c2UgPT09IG51bGwgfHwgaGVhcnRiZWF0UGF1c2UgPT09IHZvaWQgMCB8fCBoZWFydGJlYXRQYXVzZSgpO1xuXHRcdHdzUmVmLnZhbHVlLmNsb3NlKGNvZGUsIHJlYXNvbik7XG5cdFx0d3NSZWYudmFsdWUgPSB2b2lkIDA7XG5cdH07XG5cdGNvbnN0IHNlbmQgPSAoZGF0YSQxLCB1c2VCdWZmZXIgPSB0cnVlKSA9PiB7XG5cdFx0aWYgKCF3c1JlZi52YWx1ZSB8fCBzdGF0dXMudmFsdWUgIT09IFwiT1BFTlwiKSB7XG5cdFx0XHRpZiAodXNlQnVmZmVyKSBidWZmZXJlZERhdGEucHVzaChkYXRhJDEpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRfc2VuZEJ1ZmZlcigpO1xuXHRcdHdzUmVmLnZhbHVlLnNlbmQoZGF0YSQxKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblx0Y29uc3QgX2luaXQgPSAoKSA9PiB7XG5cdFx0aWYgKGV4cGxpY2l0bHlDbG9zZWQgfHwgdHlwZW9mIHVybFJlZi52YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuXHRcdGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmxSZWYudmFsdWUsIHByb3RvY29scyk7XG5cdFx0d3NSZWYudmFsdWUgPSB3cztcblx0XHRzdGF0dXMudmFsdWUgPSBcIkNPTk5FQ1RJTkdcIjtcblx0XHR3cy5vbm9wZW4gPSAoKSA9PiB7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcIk9QRU5cIjtcblx0XHRcdHJldHJpZWQgPSAwO1xuXHRcdFx0b25Db25uZWN0ZWQgPT09IG51bGwgfHwgb25Db25uZWN0ZWQgPT09IHZvaWQgMCB8fCBvbkNvbm5lY3RlZCh3cyk7XG5cdFx0XHRoZWFydGJlYXRSZXN1bWUgPT09IG51bGwgfHwgaGVhcnRiZWF0UmVzdW1lID09PSB2b2lkIDAgfHwgaGVhcnRiZWF0UmVzdW1lKCk7XG5cdFx0XHRfc2VuZEJ1ZmZlcigpO1xuXHRcdH07XG5cdFx0d3Mub25jbG9zZSA9IChldikgPT4ge1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJDTE9TRURcIjtcblx0XHRcdHJlc2V0SGVhcnRiZWF0KCk7XG5cdFx0XHRoZWFydGJlYXRQYXVzZSA9PT0gbnVsbCB8fCBoZWFydGJlYXRQYXVzZSA9PT0gdm9pZCAwIHx8IGhlYXJ0YmVhdFBhdXNlKCk7XG5cdFx0XHRvbkRpc2Nvbm5lY3RlZCA9PT0gbnVsbCB8fCBvbkRpc2Nvbm5lY3RlZCA9PT0gdm9pZCAwIHx8IG9uRGlzY29ubmVjdGVkKHdzLCBldik7XG5cdFx0XHRpZiAoIWV4cGxpY2l0bHlDbG9zZWQgJiYgb3B0aW9ucy5hdXRvUmVjb25uZWN0ICYmICh3c1JlZi52YWx1ZSA9PSBudWxsIHx8IHdzID09PSB3c1JlZi52YWx1ZSkpIHtcblx0XHRcdFx0Y29uc3QgeyByZXRyaWVzID0gLTEsIGRlbGF5ID0gMWUzLCBvbkZhaWxlZCB9ID0gcmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucy5hdXRvUmVjb25uZWN0KTtcblx0XHRcdFx0aWYgKCh0eXBlb2YgcmV0cmllcyA9PT0gXCJmdW5jdGlvblwiID8gcmV0cmllcyA6ICgpID0+IHR5cGVvZiByZXRyaWVzID09PSBcIm51bWJlclwiICYmIChyZXRyaWVzIDwgMCB8fCByZXRyaWVkIDwgcmV0cmllcykpKHJldHJpZWQpKSB7XG5cdFx0XHRcdFx0cmV0cmllZCArPSAxO1xuXHRcdFx0XHRcdGNvbnN0IGRlbGF5VGltZSA9IHR5cGVvZiBkZWxheSA9PT0gXCJmdW5jdGlvblwiID8gZGVsYXkocmV0cmllZCkgOiBkZWxheTtcblx0XHRcdFx0XHRyZXRyeVRpbWVvdXQgPSBzZXRUaW1lb3V0KF9pbml0LCBkZWxheVRpbWUpO1xuXHRcdFx0XHR9IGVsc2Ugb25GYWlsZWQgPT09IG51bGwgfHwgb25GYWlsZWQgPT09IHZvaWQgMCB8fCBvbkZhaWxlZCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0d3Mub25lcnJvciA9IChlKSA9PiB7XG5cdFx0XHRvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCB8fCBvbkVycm9yKHdzLCBlKTtcblx0XHR9O1xuXHRcdHdzLm9ubWVzc2FnZSA9IChlKSA9PiB7XG5cdFx0XHRpZiAob3B0aW9ucy5oZWFydGJlYXQpIHtcblx0XHRcdFx0cmVzZXRIZWFydGJlYXQoKTtcblx0XHRcdFx0Y29uc3QgeyBtZXNzYWdlID0gREVGQVVMVF9QSU5HX01FU1NBR0UsIHJlc3BvbnNlTWVzc2FnZSA9IG1lc3NhZ2UgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMuaGVhcnRiZWF0KTtcblx0XHRcdFx0aWYgKGUuZGF0YSA9PT0gdG9WYWx1ZShyZXNwb25zZU1lc3NhZ2UpKSByZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRkYXRhLnZhbHVlID0gZS5kYXRhO1xuXHRcdFx0b25NZXNzYWdlID09PSBudWxsIHx8IG9uTWVzc2FnZSA9PT0gdm9pZCAwIHx8IG9uTWVzc2FnZSh3cywgZSk7XG5cdFx0fTtcblx0fTtcblx0aWYgKG9wdGlvbnMuaGVhcnRiZWF0KSB7XG5cdFx0Y29uc3QgeyBtZXNzYWdlID0gREVGQVVMVF9QSU5HX01FU1NBR0UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIocmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucy5oZWFydGJlYXQpKSwgcG9uZ1RpbWVvdXQgPSAxZTMgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMuaGVhcnRiZWF0KTtcblx0XHRjb25zdCB7IHBhdXNlLCByZXN1bWUgfSA9IHNjaGVkdWxlcigoKSA9PiB7XG5cdFx0XHRzZW5kKHRvVmFsdWUobWVzc2FnZSksIGZhbHNlKTtcblx0XHRcdGlmIChwb25nVGltZW91dFdhaXQgIT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0cG9uZ1RpbWVvdXRXYWl0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGNsb3NlKCk7XG5cdFx0XHRcdGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcblx0XHRcdH0sIHBvbmdUaW1lb3V0KTtcblx0XHR9KTtcblx0XHRoZWFydGJlYXRQYXVzZSA9IHBhdXNlO1xuXHRcdGhlYXJ0YmVhdFJlc3VtZSA9IHJlc3VtZTtcblx0fVxuXHRpZiAoYXV0b0Nsb3NlKSB7XG5cdFx0aWYgKGlzQ2xpZW50KSB1c2VFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsICgpID0+IGNsb3NlKCksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHR0cnlPblNjb3BlRGlzcG9zZShjbG9zZSk7XG5cdH1cblx0Y29uc3Qgb3BlbiA9ICgpID0+IHtcblx0XHRpZiAoIWlzQ2xpZW50ICYmICFpc1dvcmtlcikgcmV0dXJuO1xuXHRcdGNsb3NlKCk7XG5cdFx0ZXhwbGljaXRseUNsb3NlZCA9IGZhbHNlO1xuXHRcdHJldHJpZWQgPSAwO1xuXHRcdF9pbml0KCk7XG5cdH07XG5cdGlmIChpbW1lZGlhdGUpIG9wZW4oKTtcblx0aWYgKGF1dG9Db25uZWN0KSB3YXRjaCh1cmxSZWYsIG9wZW4pO1xuXHRyZXR1cm4ge1xuXHRcdGRhdGEsXG5cdFx0c3RhdHVzLFxuXHRcdGNsb3NlLFxuXHRcdHNlbmQsXG5cdFx0b3Blbixcblx0XHR3czogd3NSZWZcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViV29ya2VyL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VXZWJXb3JrZXIoYXJnMCwgd29ya2VyT3B0aW9ucywgb3B0aW9ucykge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcblx0Y29uc3QgZGF0YSA9IHJlZihudWxsKTtcblx0Y29uc3Qgd29ya2VyID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBwb3N0ID0gKC4uLmFyZ3MpID0+IHtcblx0XHRpZiAoIXdvcmtlci52YWx1ZSkgcmV0dXJuO1xuXHRcdHdvcmtlci52YWx1ZS5wb3N0TWVzc2FnZSguLi5hcmdzKTtcblx0fTtcblx0Y29uc3QgdGVybWluYXRlID0gZnVuY3Rpb24gdGVybWluYXRlJDEoKSB7XG5cdFx0aWYgKCF3b3JrZXIudmFsdWUpIHJldHVybjtcblx0XHR3b3JrZXIudmFsdWUudGVybWluYXRlKCk7XG5cdH07XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGlmICh0eXBlb2YgYXJnMCA9PT0gXCJzdHJpbmdcIikgd29ya2VyLnZhbHVlID0gbmV3IFdvcmtlcihhcmcwLCB3b3JrZXJPcHRpb25zKTtcblx0XHRlbHNlIGlmICh0eXBlb2YgYXJnMCA9PT0gXCJmdW5jdGlvblwiKSB3b3JrZXIudmFsdWUgPSBhcmcwKCk7XG5cdFx0ZWxzZSB3b3JrZXIudmFsdWUgPSBhcmcwO1xuXHRcdHdvcmtlci52YWx1ZS5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuXHRcdFx0ZGF0YS52YWx1ZSA9IGUuZGF0YTtcblx0XHR9O1xuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRcdGlmICh3b3JrZXIudmFsdWUpIHdvcmtlci52YWx1ZS50ZXJtaW5hdGUoKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGRhdGEsXG5cdFx0cG9zdCxcblx0XHR0ZXJtaW5hdGUsXG5cdFx0d29ya2VyXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdlYldvcmtlckZuL2xpYi9kZXBzUGFyc2VyLnRzXG4vKipcbipcbiogQ29uY2F0ZW5hdGVzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcuXG4qIHRoaXMgc3RyaW5nIHdpbGwgdGhlbiBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIFwiaW1wb3J0U2NyaXB0c1wiIGZ1bmN0aW9uXG4qXG4qIEBwYXJhbSBkZXBzIGFycmF5IG9mIHN0cmluZ1xuKiBAcGFyYW0gbG9jYWxEZXBzIGFycmF5IG9mIGZ1bmN0aW9uXG4qIEByZXR1cm5zIGEgc3RyaW5nIGNvbXBvc2VkIGJ5IHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBhcnJheVxuKiBlbGVtZW50cyBcImRlcHNcIiBhbmQgXCJpbXBvcnRTY3JpcHRzXCIuXG4qXG4qIEBleGFtcGxlXG4qIGRlcHNQYXJzZXIoWydkZW1vMScsICdkZW1vMiddKSAvLyByZXR1cm4gaW1wb3J0U2NyaXB0cygnZGVtbzEnLCAnZGVtbzInKVxuKi9cbmZ1bmN0aW9uIGRlcHNQYXJzZXIoZGVwcywgbG9jYWxEZXBzKSB7XG5cdGlmIChkZXBzLmxlbmd0aCA9PT0gMCAmJiBsb2NhbERlcHMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcblx0Y29uc3QgZGVwc1N0cmluZyA9IGRlcHMubWFwKChkZXApID0+IGAnJHtkZXB9J2ApLnRvU3RyaW5nKCk7XG5cdGNvbnN0IGRlcHNGdW5jdGlvblN0cmluZyA9IGxvY2FsRGVwcy5maWx0ZXIoKGRlcCkgPT4gdHlwZW9mIGRlcCA9PT0gXCJmdW5jdGlvblwiKS5tYXAoKGZuKSA9PiB7XG5cdFx0Y29uc3Qgc3RyID0gZm4udG9TdHJpbmcoKTtcblx0XHRpZiAoc3RyLnRyaW0oKS5zdGFydHNXaXRoKFwiZnVuY3Rpb25cIikpIHJldHVybiBzdHI7XG5cdFx0ZWxzZSByZXR1cm4gYGNvbnN0ICR7Zm4ubmFtZX0gPSAke3N0cn1gO1xuXHR9KS5qb2luKFwiO1wiKTtcblx0Y29uc3QgaW1wb3J0U3RyaW5nID0gYGltcG9ydFNjcmlwdHMoJHtkZXBzU3RyaW5nfSk7YDtcblx0cmV0dXJuIGAke2RlcHNTdHJpbmcudHJpbSgpID09PSBcIlwiID8gXCJcIiA6IGltcG9ydFN0cmluZ30gJHtkZXBzRnVuY3Rpb25TdHJpbmd9YDtcbn1cbnZhciBkZXBzUGFyc2VyX2RlZmF1bHQgPSBkZXBzUGFyc2VyO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9saWIvam9iUnVubmVyLnRzXG4vKipcbiogVGhpcyBmdW5jdGlvbiBhY2NlcHRzIGFzIGEgcGFyYW1ldGVyIGEgZnVuY3Rpb24gXCJ1c2VyRnVuY1wiXG4qIEFuZCBhcyBhIHJlc3VsdCByZXR1cm5zIGFuIGFub255bW91cyBmdW5jdGlvbi5cbiogVGhpcyBhbm9ueW1vdXMgZnVuY3Rpb24sIGFjY2VwdHMgYXMgYXJndW1lbnRzLFxuKiB0aGUgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiBcInVzZUFyZ3NcIiBhbmQgcmV0dXJucyBhIFByb21pc2VcbiogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhcyBhIHdyYXBwZXIsIG9ubHkgaW5zaWRlIGEgV29ya2VyXG4qIGJlY2F1c2UgaXQgZGVwZW5kcyBieSBcInBvc3RNZXNzYWdlXCIuXG4qXG4qIEBwYXJhbSB1c2VyRnVuYyB7RnVuY3Rpb259IGZuIHRoZSBmdW5jdGlvbiB0byBydW4gd2l0aCB3ZWIgd29ya2VyXG4qXG4qIEByZXR1cm5zIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHBhcmFtZXRlcnNcbiogdG8gYmUgcGFzc2VkIHRvIHRoZSBcInVzZXJGdW5jXCIgZnVuY3Rpb25cbiovXG5mdW5jdGlvbiBqb2JSdW5uZXIodXNlckZ1bmMpIHtcblx0cmV0dXJuIChlKSA9PiB7XG5cdFx0Y29uc3QgdXNlckZ1bmNBcmdzID0gZS5kYXRhWzBdO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodXNlckZ1bmMuYXBwbHkodm9pZCAwLCB1c2VyRnVuY0FyZ3MpKS50aGVuKChyZXN1bHQpID0+IHtcblx0XHRcdHBvc3RNZXNzYWdlKFtcIlNVQ0NFU1NcIiwgcmVzdWx0XSk7XG5cdFx0fSkuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRwb3N0TWVzc2FnZShbXCJFUlJPUlwiLCBlcnJvcl0pO1xuXHRcdH0pO1xuXHR9O1xufVxudmFyIGpvYlJ1bm5lcl9kZWZhdWx0ID0gam9iUnVubmVyO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9saWIvY3JlYXRlV29ya2VyQmxvYlVybC50c1xuLyoqXG4qIENvbnZlcnRzIHRoZSBcImZuXCIgZnVuY3Rpb24gaW50byB0aGUgc3ludGF4IG5lZWRlZCB0byBiZSBleGVjdXRlZCB3aXRoaW4gYSB3ZWIgd29ya2VyXG4qXG4qIEBwYXJhbSBmbiB0aGUgZnVuY3Rpb24gdG8gcnVuIHdpdGggd2ViIHdvcmtlclxuKiBAcGFyYW0gZGVwcyBhcnJheSBvZiBzdHJpbmdzLCBpbXBvcnRlZCBpbnRvIHRoZSB3b3JrZXIgdGhyb3VnaCBcImltcG9ydFNjcmlwdHNcIlxuKiBAcGFyYW0gbG9jYWxEZXBzIGFycmF5IG9mIGZ1bmN0aW9uLCBsb2NhbCBkZXBlbmRlbmNpZXNcbipcbiogQHJldHVybnMgYSBibG9iIHVybCwgY29udGFpbmluZyB0aGUgY29kZSBvZiBcImZuXCIgYXMgYSBzdHJpbmdcbipcbiogQGV4YW1wbGVcbiogY3JlYXRlV29ya2VyQmxvYlVybCgoYSxiKSA9PiBhK2IsIFtdKVxuKiAvLyByZXR1cm4gXCJvbm1lc3NhZ2U9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgoYSxiKSA9PiBhICsgYilcbiogLnRoZW4ocG9zdE1lc3NhZ2UoWydTVUNDRVNTJywgcmVzdWx0XSkpXG4qIC5jYXRjaChwb3N0TWVzc2FnZShbJ0VSUk9SJywgZXJyb3JdKVwiXG4qL1xuZnVuY3Rpb24gY3JlYXRlV29ya2VyQmxvYlVybChmbiwgZGVwcywgbG9jYWxEZXBzKSB7XG5cdGNvbnN0IGJsb2JDb2RlID0gYCR7ZGVwc1BhcnNlcl9kZWZhdWx0KGRlcHMsIGxvY2FsRGVwcyl9OyBvbm1lc3NhZ2U9KCR7am9iUnVubmVyX2RlZmF1bHR9KSgke2ZufSlgO1xuXHRjb25zdCBibG9iID0gbmV3IEJsb2IoW2Jsb2JDb2RlXSwgeyB0eXBlOiBcInRleHQvamF2YXNjcmlwdFwiIH0pO1xuXHRyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbn1cbnZhciBjcmVhdGVXb3JrZXJCbG9iVXJsX2RlZmF1bHQgPSBjcmVhdGVXb3JrZXJCbG9iVXJsO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9pbmRleC50c1xuLyoqXG4qIFJ1biBleHBlbnNpdmUgZnVuY3Rpb24gd2l0aG91dCBibG9ja2luZyB0aGUgVUksIHVzaW5nIGEgc2ltcGxlIHN5bnRheCB0aGF0IG1ha2VzIHVzZSBvZiBQcm9taXNlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXZWJXb3JrZXJGblxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VXZWJXb3JrZXJGbihmbiwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZGVwZW5kZW5jaWVzID0gW10sIGxvY2FsRGVwZW5kZW5jaWVzID0gW10sIHRpbWVvdXQsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCB3b3JrZXIgPSByZWYoKTtcblx0Y29uc3Qgd29ya2VyU3RhdHVzID0gc2hhbGxvd1JlZihcIlBFTkRJTkdcIik7XG5cdGNvbnN0IHByb21pc2UgPSByZWYoe30pO1xuXHRjb25zdCB0aW1lb3V0SWQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHdvcmtlclRlcm1pbmF0ZSA9IChzdGF0dXMgPSBcIlBFTkRJTkdcIikgPT4ge1xuXHRcdGlmICh3b3JrZXIudmFsdWUgJiYgd29ya2VyLnZhbHVlLl91cmwgJiYgd2luZG93JDEpIHtcblx0XHRcdHdvcmtlci52YWx1ZS50ZXJtaW5hdGUoKTtcblx0XHRcdFVSTC5yZXZva2VPYmplY3RVUkwod29ya2VyLnZhbHVlLl91cmwpO1xuXHRcdFx0cHJvbWlzZS52YWx1ZSA9IHt9O1xuXHRcdFx0d29ya2VyLnZhbHVlID0gdm9pZCAwO1xuXHRcdFx0d2luZG93JDEuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZC52YWx1ZSk7XG5cdFx0XHR3b3JrZXJTdGF0dXMudmFsdWUgPSBzdGF0dXM7XG5cdFx0fVxuXHR9O1xuXHR3b3JrZXJUZXJtaW5hdGUoKTtcblx0dHJ5T25TY29wZURpc3Bvc2Uod29ya2VyVGVybWluYXRlKTtcblx0Y29uc3QgZ2VuZXJhdGVXb3JrZXIgPSAoKSA9PiB7XG5cdFx0Y29uc3QgYmxvYlVybCA9IGNyZWF0ZVdvcmtlckJsb2JVcmxfZGVmYXVsdChmbiwgZGVwZW5kZW5jaWVzLCBsb2NhbERlcGVuZGVuY2llcyk7XG5cdFx0Y29uc3QgbmV3V29ya2VyID0gbmV3IFdvcmtlcihibG9iVXJsKTtcblx0XHRuZXdXb3JrZXIuX3VybCA9IGJsb2JVcmw7XG5cdFx0bmV3V29ya2VyLm9ubWVzc2FnZSA9IChlKSA9PiB7XG5cdFx0XHRjb25zdCB7IHJlc29sdmUgPSAoKSA9PiB7fSwgcmVqZWN0ID0gKCkgPT4ge30gfSA9IHByb21pc2UudmFsdWU7XG5cdFx0XHRjb25zdCBbc3RhdHVzLCByZXN1bHRdID0gZS5kYXRhO1xuXHRcdFx0c3dpdGNoIChzdGF0dXMpIHtcblx0XHRcdFx0Y2FzZSBcIlNVQ0NFU1NcIjpcblx0XHRcdFx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHRcdFx0d29ya2VyVGVybWluYXRlKHN0YXR1cyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0cmVqZWN0KHJlc3VsdCk7XG5cdFx0XHRcdFx0d29ya2VyVGVybWluYXRlKFwiRVJST1JcIik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRuZXdXb3JrZXIub25lcnJvciA9IChlKSA9PiB7XG5cdFx0XHRjb25zdCB7IHJlamVjdCA9ICgpID0+IHt9IH0gPSBwcm9taXNlLnZhbHVlO1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0cmVqZWN0KGUpO1xuXHRcdFx0d29ya2VyVGVybWluYXRlKFwiRVJST1JcIik7XG5cdFx0fTtcblx0XHRpZiAodGltZW91dCkgdGltZW91dElkLnZhbHVlID0gc2V0VGltZW91dCgoKSA9PiB3b3JrZXJUZXJtaW5hdGUoXCJUSU1FT1VUX0VYUElSRURcIiksIHRpbWVvdXQpO1xuXHRcdHJldHVybiBuZXdXb3JrZXI7XG5cdH07XG5cdGNvbnN0IGNhbGxXb3JrZXIgPSAoLi4uZm5BcmdzKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0dmFyIF93b3JrZXIkdmFsdWU7XG5cdFx0cHJvbWlzZS52YWx1ZSA9IHtcblx0XHRcdHJlc29sdmUsXG5cdFx0XHRyZWplY3Rcblx0XHR9O1xuXHRcdChfd29ya2VyJHZhbHVlID0gd29ya2VyLnZhbHVlKSA9PT0gbnVsbCB8fCBfd29ya2VyJHZhbHVlID09PSB2b2lkIDAgfHwgX3dvcmtlciR2YWx1ZS5wb3N0TWVzc2FnZShbWy4uLmZuQXJnc11dKTtcblx0XHR3b3JrZXJTdGF0dXMudmFsdWUgPSBcIlJVTk5JTkdcIjtcblx0fSk7XG5cdGNvbnN0IHdvcmtlckZuID0gKC4uLmZuQXJncykgPT4ge1xuXHRcdGlmICh3b3JrZXJTdGF0dXMudmFsdWUgPT09IFwiUlVOTklOR1wiKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiW3VzZVdlYldvcmtlckZuXSBZb3UgY2FuIG9ubHkgcnVuIG9uZSBpbnN0YW5jZSBvZiB0aGUgd29ya2VyIGF0IGEgdGltZS5cIik7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcblx0XHR9XG5cdFx0d29ya2VyLnZhbHVlID0gZ2VuZXJhdGVXb3JrZXIoKTtcblx0XHRyZXR1cm4gY2FsbFdvcmtlciguLi5mbkFyZ3MpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHdvcmtlckZuLFxuXHRcdHdvcmtlclN0YXR1cyxcblx0XHR3b3JrZXJUZXJtaW5hdGVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2luZG93Rm9jdXMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IHRyYWNrIHdpbmRvdyBmb2N1cyB3aXRoIGB3aW5kb3cub25mb2N1c2AgYW5kIGB3aW5kb3cub25ibHVyYC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlV2luZG93Rm9jdXNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VXaW5kb3dGb2N1cyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBmb2N1c2VkID0gc2hhbGxvd1JlZih3aW5kb3ckMS5kb2N1bWVudC5oYXNGb2N1cygpKTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiYmx1clwiLCAoKSA9PiB7XG5cdFx0Zm9jdXNlZC52YWx1ZSA9IGZhbHNlO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImZvY3VzXCIsICgpID0+IHtcblx0XHRmb2N1c2VkLnZhbHVlID0gdHJ1ZTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0cmV0dXJuIGZvY3VzZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdpbmRvd1Njcm9sbC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHdpbmRvdyBzY3JvbGwuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdpbmRvd1Njcm9sbFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVdpbmRvd1Njcm9sbChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywuLi5yZXN0IH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gdXNlU2Nyb2xsKHdpbmRvdyQxLCByZXN0KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2luZG93U2l6ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHdpbmRvdyBzaXplLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXaW5kb3dTaXplXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlV2luZG93U2l6ZShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaW5pdGlhbFdpZHRoID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBpbml0aWFsSGVpZ2h0ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBsaXN0ZW5PcmllbnRhdGlvbiA9IHRydWUsIGluY2x1ZGVTY3JvbGxiYXIgPSB0cnVlLCB0eXBlID0gXCJpbm5lclwiIH0gPSBvcHRpb25zO1xuXHRjb25zdCB3aWR0aCA9IHNoYWxsb3dSZWYoaW5pdGlhbFdpZHRoKTtcblx0Y29uc3QgaGVpZ2h0ID0gc2hhbGxvd1JlZihpbml0aWFsSGVpZ2h0KTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4ge1xuXHRcdGlmICh3aW5kb3ckMSkgaWYgKHR5cGUgPT09IFwib3V0ZXJcIikge1xuXHRcdFx0d2lkdGgudmFsdWUgPSB3aW5kb3ckMS5vdXRlcldpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gd2luZG93JDEub3V0ZXJIZWlnaHQ7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSBcInZpc3VhbFwiICYmIHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0KSB7XG5cdFx0XHRjb25zdCB7IHdpZHRoOiB2aXN1YWxWaWV3cG9ydFdpZHRoLCBoZWlnaHQ6IHZpc3VhbFZpZXdwb3J0SGVpZ2h0LCBzY2FsZSB9ID0gd2luZG93JDEudmlzdWFsVmlld3BvcnQ7XG5cdFx0XHR3aWR0aC52YWx1ZSA9IE1hdGgucm91bmQodmlzdWFsVmlld3BvcnRXaWR0aCAqIHNjYWxlKTtcblx0XHRcdGhlaWdodC52YWx1ZSA9IE1hdGgucm91bmQodmlzdWFsVmlld3BvcnRIZWlnaHQgKiBzY2FsZSk7XG5cdFx0fSBlbHNlIGlmIChpbmNsdWRlU2Nyb2xsYmFyKSB7XG5cdFx0XHR3aWR0aC52YWx1ZSA9IHdpbmRvdyQxLmlubmVyV2lkdGg7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSB3aW5kb3ckMS5pbm5lckhlaWdodDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2lkdGgudmFsdWUgPSB3aW5kb3ckMS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSB3aW5kb3ckMS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXHRcdH1cblx0fTtcblx0dXBkYXRlKCk7XG5cdHRyeU9uTW91bnRlZCh1cGRhdGUpO1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0dXNlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGlmICh3aW5kb3ckMSAmJiB0eXBlID09PSBcInZpc3VhbFwiICYmIHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0KSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0LCBcInJlc2l6ZVwiLCB1cGRhdGUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGlmIChsaXN0ZW5PcmllbnRhdGlvbikgd2F0Y2godXNlTWVkaWFRdWVyeShcIihvcmllbnRhdGlvbjogcG9ydHJhaXQpXCIpLCAoKSA9PiB1cGRhdGUoKSk7XG5cdHJldHVybiB7XG5cdFx0d2lkdGgsXG5cdFx0aGVpZ2h0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgRGVmYXVsdE1hZ2ljS2V5c0FsaWFzTWFwLCBTdG9yYWdlU2VyaWFsaXplcnMsIFRyYW5zaXRpb25QcmVzZXRzLCBhc3luY0NvbXB1dGVkLCBicmVha3BvaW50c0FudERlc2lnbiwgYnJlYWtwb2ludHNCb290c3RyYXBWNSwgYnJlYWtwb2ludHNFbGVtZW50LCBicmVha3BvaW50c01hc3RlckNzcywgYnJlYWtwb2ludHNQcmltZUZsZXgsIGJyZWFrcG9pbnRzUXVhc2FyLCBicmVha3BvaW50c1NlbWF0aWMsIGJyZWFrcG9pbnRzVGFpbHdpbmQsIGJyZWFrcG9pbnRzVnVldGlmeSwgYnJlYWtwb2ludHNWdWV0aWZ5VjIsIGJyZWFrcG9pbnRzVnVldGlmeVYzLCBjbG9uZUZuSlNPTiwgY29tcHV0ZWRBc3luYywgY29tcHV0ZWRJbmplY3QsIGNyZWF0ZUZldGNoLCBjcmVhdGVSZXVzYWJsZVRlbXBsYXRlLCBjcmVhdGVUZW1wbGF0ZVByb21pc2UsIGNyZWF0ZVVucmVmRm4sIGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUsIGRlZmF1bHREb2N1bWVudCwgZGVmYXVsdExvY2F0aW9uLCBkZWZhdWx0TmF2aWdhdG9yLCBkZWZhdWx0V2luZG93LCBleGVjdXRlVHJhbnNpdGlvbiwgZm9ybWF0VGltZUFnbywgZm9ybWF0VGltZUFnb0ludGwsIGZvcm1hdFRpbWVBZ29JbnRsUGFydHMsIGdldFNTUkhhbmRsZXIsIG1hcEdhbWVwYWRUb1hib3gzNjBDb250cm9sbGVyLCBvbkNsaWNrT3V0c2lkZSwgb25FbGVtZW50UmVtb3ZhbCwgb25LZXlEb3duLCBvbktleVByZXNzZWQsIG9uS2V5U3Ryb2tlLCBvbktleVVwLCBvbkxvbmdQcmVzcywgb25TdGFydFR5cGluZywgcHJvdmlkZVNTUldpZHRoLCBzZXRTU1JIYW5kbGVyLCB0ZW1wbGF0ZVJlZiwgdHJhbnNpdGlvbiwgdW5yZWZFbGVtZW50LCB1c2VBY3RpdmVFbGVtZW50LCB1c2VBbmltYXRlLCB1c2VBc3luY1F1ZXVlLCB1c2VBc3luY1N0YXRlLCB1c2VCYXNlNjQsIHVzZUJhdHRlcnksIHVzZUJsdWV0b290aCwgdXNlQnJlYWtwb2ludHMsIHVzZUJyb2FkY2FzdENoYW5uZWwsIHVzZUJyb3dzZXJMb2NhdGlvbiwgdXNlQ2FjaGVkLCB1c2VDbGlwYm9hcmQsIHVzZUNsaXBib2FyZEl0ZW1zLCB1c2VDbG9uZWQsIHVzZUNvbG9yTW9kZSwgdXNlQ29uZmlybURpYWxvZywgdXNlQ291bnRkb3duLCB1c2VDc3NTdXBwb3J0cywgdXNlQ3NzVmFyLCB1c2VDdXJyZW50RWxlbWVudCwgdXNlQ3ljbGVMaXN0LCB1c2VEYXJrLCB1c2VEZWJvdW5jZWRSZWZIaXN0b3J5LCB1c2VEZXZpY2VNb3Rpb24sIHVzZURldmljZU9yaWVudGF0aW9uLCB1c2VEZXZpY2VQaXhlbFJhdGlvLCB1c2VEZXZpY2VzTGlzdCwgdXNlRGlzcGxheU1lZGlhLCB1c2VEb2N1bWVudFZpc2liaWxpdHksIHVzZURyYWdnYWJsZSwgdXNlRHJvcFpvbmUsIHVzZUVsZW1lbnRCb3VuZGluZywgdXNlRWxlbWVudEJ5UG9pbnQsIHVzZUVsZW1lbnRIb3ZlciwgdXNlRWxlbWVudFNpemUsIHVzZUVsZW1lbnRWaXNpYmlsaXR5LCB1c2VFdmVudEJ1cywgdXNlRXZlbnRMaXN0ZW5lciwgdXNlRXZlbnRTb3VyY2UsIHVzZUV5ZURyb3BwZXIsIHVzZUZhdmljb24sIHVzZUZldGNoLCB1c2VGaWxlRGlhbG9nLCB1c2VGaWxlU3lzdGVtQWNjZXNzLCB1c2VGb2N1cywgdXNlRm9jdXNXaXRoaW4sIHVzZUZwcywgdXNlRnVsbHNjcmVlbiwgdXNlR2FtZXBhZCwgdXNlR2VvbG9jYXRpb24sIHVzZUlkbGUsIHVzZUltYWdlLCB1c2VJbmZpbml0ZVNjcm9sbCwgdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIsIHVzZUtleU1vZGlmaWVyLCB1c2VMb2NhbFN0b3JhZ2UsIHVzZU1hZ2ljS2V5cywgdXNlTWFudWFsUmVmSGlzdG9yeSwgdXNlTWVkaWFDb250cm9scywgdXNlTWVkaWFRdWVyeSwgdXNlTWVtb2l6ZSwgdXNlTWVtb3J5LCB1c2VNb3VudGVkLCB1c2VNb3VzZSwgdXNlTW91c2VJbkVsZW1lbnQsIHVzZU1vdXNlUHJlc3NlZCwgdXNlTXV0YXRpb25PYnNlcnZlciwgdXNlTmF2aWdhdG9yTGFuZ3VhZ2UsIHVzZU5ldHdvcmssIHVzZU5vdywgdXNlT2JqZWN0VXJsLCB1c2VPZmZzZXRQYWdpbmF0aW9uLCB1c2VPbmxpbmUsIHVzZVBhZ2VMZWF2ZSwgdXNlUGFyYWxsYXgsIHVzZVBhcmVudEVsZW1lbnQsIHVzZVBlcmZvcm1hbmNlT2JzZXJ2ZXIsIHVzZVBlcm1pc3Npb24sIHVzZVBvaW50ZXIsIHVzZVBvaW50ZXJMb2NrLCB1c2VQb2ludGVyU3dpcGUsIHVzZVByZWZlcnJlZENvbG9yU2NoZW1lLCB1c2VQcmVmZXJyZWRDb250cmFzdCwgdXNlUHJlZmVycmVkRGFyaywgdXNlUHJlZmVycmVkTGFuZ3VhZ2VzLCB1c2VQcmVmZXJyZWRSZWR1Y2VkTW90aW9uLCB1c2VQcmVmZXJyZWRSZWR1Y2VkVHJhbnNwYXJlbmN5LCB1c2VQcmV2aW91cywgdXNlUmFmRm4sIHVzZVJlZkhpc3RvcnksIHVzZVJlc2l6ZU9ic2VydmVyLCB1c2VTU1JXaWR0aCwgdXNlU2NyZWVuT3JpZW50YXRpb24sIHVzZVNjcmVlblNhZmVBcmVhLCB1c2VTY3JpcHRUYWcsIHVzZVNjcm9sbCwgdXNlU2Nyb2xsTG9jaywgdXNlU2Vzc2lvblN0b3JhZ2UsIHVzZVNoYXJlLCB1c2VTb3J0ZWQsIHVzZVNwZWVjaFJlY29nbml0aW9uLCB1c2VTcGVlY2hTeW50aGVzaXMsIHVzZVN0ZXBwZXIsIHVzZVN0b3JhZ2UsIHVzZVN0b3JhZ2VBc3luYywgdXNlU3R5bGVUYWcsIHVzZVN1cHBvcnRlZCwgdXNlU3dpcGUsIHVzZVRlbXBsYXRlUmVmc0xpc3QsIHVzZVRleHREaXJlY3Rpb24sIHVzZVRleHRTZWxlY3Rpb24sIHVzZVRleHRhcmVhQXV0b3NpemUsIHVzZVRocm90dGxlZFJlZkhpc3RvcnksIHVzZVRpbWVBZ28sIHVzZVRpbWVBZ29JbnRsLCB1c2VUaW1lb3V0UG9sbCwgdXNlVGltZXN0YW1wLCB1c2VUaXRsZSwgdXNlVHJhbnNpdGlvbiwgdXNlVXJsU2VhcmNoUGFyYW1zLCB1c2VVc2VyTWVkaWEsIHVzZVZNb2RlbCwgdXNlVk1vZGVscywgdXNlVmlicmF0ZSwgdXNlVmlydHVhbExpc3QsIHVzZVdha2VMb2NrLCB1c2VXZWJOb3RpZmljYXRpb24sIHVzZVdlYlNvY2tldCwgdXNlV2ViV29ya2VyLCB1c2VXZWJXb3JrZXJGbiwgdXNlV2luZG93Rm9jdXMsIHVzZVdpbmRvd1Njcm9sbCwgdXNlV2luZG93U2l6ZSB9OyIsImltcG9ydCB7IGJyZWFrcG9pbnRzVGFpbHdpbmQsIHVzZUJyZWFrcG9pbnRzIGFzIGNvcmVVc2VCcmVha3BvaW50cyB9IGZyb20gJ0B2dWV1c2UvY29yZSdcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJyZWFrcG9pbnRzKCkge1xuICAgIHJldHVybiBjb3JlVXNlQnJlYWtwb2ludHMoYnJlYWtwb2ludHNUYWlsd2luZClcbn1cbiIsImltcG9ydCB7IHJlZiwgdG9WYWx1ZSwgaXNSZWYsIGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ3Z1ZSdcblxuZXhwb3J0IGludGVyZmFjZSBSR0Ige1xuICAgIHI6IG51bWJlclxuICAgIGc6IG51bWJlclxuICAgIGI6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJHQkEgZXh0ZW5kcyBSR0Ige1xuICAgIGE6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhTTCB7XG4gICAgaDogbnVtYmVyXG4gICAgczogbnVtYmVyXG4gICAgbDogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT0tMQ0gge1xuICAgIGw6IG51bWJlclxuICAgIGM6IG51bWJlclxuICAgIGg6IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjUkdCKGNvbG9yOiBzdHJpbmcpOiBSR0Ige1xuICAgIGNvbnN0IHJnYk1hdGNoID0gL3JnYmE/XFwoKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrKSg/OixcXHMqW1xcZC5dKyk/XFwpLy5leGVjKGNvbG9yKVxuXG4gICAgaWYgKCFyZ2JNYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUkdCIGNvbG9yIGZvcm1hdDogJyArIGNvbG9yKVxuICAgIH0gICAgXG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogcGFyc2VJbnQocmdiTWF0Y2hbMV0pLFxuICAgICAgICBnOiBwYXJzZUludChyZ2JNYXRjaFsyXSksXG4gICAgICAgIGI6IHBhcnNlSW50KHJnYk1hdGNoWzNdKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSR0JBKGNvbG9yOiBzdHJpbmcpOiBSR0JBIHtcbiAgICBjb25zdCByZ2JhTWF0Y2ggPSAvcmdiYVxcKChcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkKyksXFxzKihbXFxkLl0rKVxcKS8uZXhlYyhjb2xvcilcbiAgICBpZiAoIXJnYmFNYXRjaCkge1xuICAgICAgICAvLyBmYWxsYmFjayB0byByZ2Igd2l0aCBhbHBoYSAxXG4gICAgICAgIGNvbnN0IHJnYiA9IGV4dHJhY1JHQihjb2xvcilcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnJnYixcbiAgICAgICAgICAgIGE6IDEgXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogcGFyc2VJbnQocmdiYU1hdGNoWzFdKSxcbiAgICAgICAgZzogcGFyc2VJbnQocmdiYU1hdGNoWzJdKSxcbiAgICAgICAgYjogcGFyc2VJbnQocmdiYU1hdGNoWzNdKSxcbiAgICAgICAgYTogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNF0pXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9SR0IoaGV4OiBzdHJpbmcpOiBSR0Ige1xuICAgIGNvbnN0IGhleE1hdGNoID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGhleClcblxuICAgIGlmICghaGV4TWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEhFWCBjb2xvciBmb3JtYXQ6ICcgKyBoZXgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogcGFyc2VJbnQoaGV4TWF0Y2hbMV0sIDE2KSxcbiAgICAgICAgZzogcGFyc2VJbnQoaGV4TWF0Y2hbMl0sIDE2KSxcbiAgICAgICAgYjogcGFyc2VJbnQoaGV4TWF0Y2hbM10sIDE2KVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbFRvUmdiKGhzbDogc3RyaW5nKTogUkdCIHtcbiAgICBjb25zdCBoc2xNYXRjaCA9IC9oc2xhP1xcKChcXGQrKSxcXHMqKFxcZCspJSxcXHMqKFxcZCspJSg/OixcXHMqW1xcZC5dKyk/XFwpLy5leGVjKGhzbClcblxuICAgIGlmICghaHNsTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEhTTCBjb2xvciBmb3JtYXQ6ICcgKyBoc2wpXG4gICAgfVxuXG4gICAgY29uc3QgaCA9IHBhcnNlSW50KGhzbE1hdGNoWzFdKSAvIDM2MFxuICAgIGNvbnN0IHMgPSBwYXJzZUludChoc2xNYXRjaFsyXSkgLyAxMDBcbiAgICBjb25zdCBsID0gcGFyc2VJbnQoaHNsTWF0Y2hbM10pIC8gMTAwXG5cbiAgICBsZXQgcjogbnVtYmVyXG4gICAgbGV0IGc6IG51bWJlclxuICAgIGxldCBiOiBudW1iZXJcblxuICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgIHIgPSBnID0gYiA9IGxcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBodWUycmdiID0gKHA6IG51bWJlciwgcTogbnVtYmVyLCB0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmICh0IDwgMCkgdCArPSAxXG4gICAgICAgICAgICBpZiAodCA+IDEpIHQgLT0gMVxuICAgICAgICAgICAgaWYgKHQgPCAxIC8gNikgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHRcbiAgICAgICAgICAgIGlmICh0IDwgMSAvIDIpIHJldHVybiBxXG4gICAgICAgICAgICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDZcbiAgICAgICAgICAgIHJldHVybiBwXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogc1xuICAgICAgICBjb25zdCBwID0gMiAqIGwgLSBxXG5cbiAgICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKVxuICAgICAgICBnID0gaHVlMnJnYihwLCBxLCBoKVxuICAgICAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMSAvIDMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogTWF0aC5yb3VuZChyICogMjU1KSxcbiAgICAgICAgZzogTWF0aC5yb3VuZChnICogMjU1KSxcbiAgICAgICAgYjogTWF0aC5yb3VuZChiICogMjU1KVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvSHNsKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBIU0wge1xuICAgIHIgLz0gMjU1XG4gICAgZyAvPSAyNTVcbiAgICBiIC89IDI1NVxuXG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYilcbiAgICBjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKVxuICAgIGNvbnN0IGwgPSAobWF4ICsgbWluKSAvIDJcblxuICAgIGlmIChtYXggPT09IG1pbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaDogMCxcbiAgICAgICAgICAgIHM6IDAsXG4gICAgICAgICAgICBsOiBNYXRoLnJvdW5kKGwgKiAxMDApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkID0gbWF4IC0gbWluXG4gICAgY29uc3QgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pXG4gICAgbGV0IGggPSAwXG5cbiAgICBzd2l0Y2ggKG1heCkge1xuICAgIGNhc2UgcjpcbiAgICAgICAgaCA9ICgoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKSkgKiA2MFxuICAgICAgICBicmVha1xuICAgIGNhc2UgZzpcbiAgICAgICAgaCA9ICgoYiAtIHIpIC8gZCArIDIpICogNjBcbiAgICAgICAgYnJlYWtcbiAgICBjYXNlIGI6XG4gICAgICAgIGggPSAoKHIgLSBnKSAvIGQgKyA0KSAqIDYwXG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgaDogTWF0aC5yb3VuZChoKSxcbiAgICAgICAgczogTWF0aC5yb3VuZChzICogMTAwKSxcbiAgICAgICAgbDogTWF0aC5yb3VuZChsICogMTAwKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvSGV4KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvSGV4ID0gKG46IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBoZXggPSBuLnRvU3RyaW5nKDE2KVxuICAgICAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PT0gMSA/ICcwJyArIGhleCA6IGhleFxuICAgIH1cblxuICAgIHJldHVybiBgIyR7dG9IZXgocil9JHt0b0hleChnKX0ke3RvSGV4KGIpfWBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYmFUb1N0cmluZyhyZ2JhOiBSR0JBKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJnYmEoJHtyZ2JhLnJ9LCAke3JnYmEuZ30sICR7cmdiYS5ifSwgJHtyZ2JhLmF9KWBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RPS0xDSChjb2xvcjogc3RyaW5nKTogT0tMQ0gge1xuICAgIGNvbnN0IG9rbGNoTWF0Y2ggPSAvb2tsY2hcXCgoW1xcZC5dKylcXHMrKFtcXGQuXSspXFxzKyhbXFxkLl0rKVxcKS8uZXhlYyhjb2xvcilcblxuICAgIGlmICghb2tsY2hNYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgT0tMQ0ggY29sb3IgZm9ybWF0OiAnICsgY29sb3IpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbDogcGFyc2VGbG9hdChva2xjaE1hdGNoWzFdKSxcbiAgICAgICAgYzogcGFyc2VGbG9hdChva2xjaE1hdGNoWzJdKSxcbiAgICAgICAgaDogcGFyc2VGbG9hdChva2xjaE1hdGNoWzNdKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9rbGNoVG9SZ2IoY29sb3I6IHN0cmluZyk6IFJHQiB7XG4gICAgY29uc3Qgb2tsY2ggPSBleHRyYWN0T0tMQ0goY29sb3IpXG4gICAgY29uc3QgeyBsLCBjLCBoIH0gPSBva2xjaFxuICAgIFxuICAgIGNvbnN0IGhSYWQgPSAoaCAqIE1hdGguUEkpIC8gMTgwXG4gICAgY29uc3QgYSA9IGMgKiBNYXRoLmNvcyhoUmFkKVxuICAgIGNvbnN0IGIgPSBjICogTWF0aC5zaW4oaFJhZClcbiAgICBcbiAgICBjb25zdCBsXyA9IGwgKyAwLjM5NjMzNzc3NzQgKiBhICsgMC4yMTU4MDM3NTczICogYlxuICAgIGNvbnN0IG1fID0gbCAtIDAuMTA1NTYxMzQ1OCAqIGEgLSAwLjA2Mzg1NDE3MjggKiBiXG4gICAgY29uc3Qgc18gPSBsIC0gMC4wODk0ODQxNzc1ICogYSAtIDEuMjkxNDg1NTQ4MCAqIGJcbiAgICBcbiAgICBjb25zdCBsMyA9IGxfICogbF8gKiBsX1xuICAgIGNvbnN0IG0zID0gbV8gKiBtXyAqIG1fXG4gICAgY29uc3QgczMgPSBzXyAqIHNfICogc19cbiAgICBcbiAgICBsZXQgciA9ICs0LjA3Njc0MTY2MjEgKiBsMyAtIDMuMzA3NzExNTkxMyAqIG0zICsgMC4yMzA5Njk5MjkyICogczNcbiAgICBsZXQgZyA9IC0xLjI2ODQzODAwNDYgKiBsMyArIDIuNjA5NzU3NDAxMSAqIG0zIC0gMC4zNDEzMTkzOTY1ICogczNcbiAgICBsZXQgYmx1ZSA9IC0wLjAwNDE5NjA4NjMgKiBsMyAtIDAuNzAzNDE4NjE0NyAqIG0zICsgMS43MDc2MTQ3MDEwICogczNcbiAgICBcbiAgICBjb25zdCBnYW1tYUNvcnJlY3QgPSAodmFsOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICBpZiAodmFsID49IDAuMDAzMTMwOCkge1xuICAgICAgICAgICAgcmV0dXJuIDEuMDU1ICogTWF0aC5wb3codmFsLCAxIC8gMi40KSAtIDAuMDU1XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiAxMi45MiAqIHZhbFxuICAgIH1cbiAgICBcbiAgICByID0gZ2FtbWFDb3JyZWN0KHIpXG4gICAgZyA9IGdhbW1hQ29ycmVjdChnKVxuICAgIGJsdWUgPSBnYW1tYUNvcnJlY3QoYmx1ZSlcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgICByOiBNYXRoLnJvdW5kKE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHIpKSAqIDI1NSksXG4gICAgICAgIGc6IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgZykpICogMjU1KSxcbiAgICAgICAgYjogTWF0aC5yb3VuZChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBibHVlKSkgKiAyNTUpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiVG9Pa2xjaChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogT0tMQ0gge1xuICAgIHIgPSByIC8gMjU1XG4gICAgZyA9IGcgLyAyNTVcbiAgICBiID0gYiAvIDI1NVxuICAgIFxuICAgIGNvbnN0IGdhbW1hRXhwYW5kID0gKHZhbDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgaWYgKHZhbCA+PSAwLjA0MDQ1KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5wb3coKHZhbCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiB2YWwgLyAxMi45MlxuICAgIH1cbiAgICBcbiAgICByID0gZ2FtbWFFeHBhbmQocilcbiAgICBnID0gZ2FtbWFFeHBhbmQoZylcbiAgICBiID0gZ2FtbWFFeHBhbmQoYilcbiAgICBcbiAgICBjb25zdCBsID0gMC40MTIyMjE0NzA4ICogciArIDAuNTM2MzMyNTM2MyAqIGcgKyAwLjA1MTQ0NTk5MjkgKiBiXG4gICAgY29uc3QgbSA9IDAuMjExOTAzNDk4MiAqIHIgKyAwLjY4MDY5OTU0NTEgKiBnICsgMC4xMDczOTY5NTY2ICogYlxuICAgIGNvbnN0IHMgPSAwLjA4ODMwMjQ2MTkgKiByICsgMC4yODE3MTg4Mzc2ICogZyArIDAuNjI5OTc4NzAwNSAqIGJcbiAgICBcbiAgICBjb25zdCBsXyA9IE1hdGguY2JydChsKVxuICAgIGNvbnN0IG1fID0gTWF0aC5jYnJ0KG0pXG4gICAgY29uc3Qgc18gPSBNYXRoLmNicnQocylcbiAgICBcbiAgICBjb25zdCBMID0gMC4yMTA0NTQyNTUzICogbF8gKyAwLjc5MzYxNzc4NTAgKiBtXyAtIDAuMDA0MDcyMDQ2OCAqIHNfXG4gICAgY29uc3QgYSA9IDEuOTc3OTk4NDk1MSAqIGxfIC0gMi40Mjg1OTIyMDUwICogbV8gKyAwLjQ1MDU5MzcwOTkgKiBzX1xuICAgIGNvbnN0IGJfID0gMC4wMjU5MDQwMzcxICogbF8gKyAwLjc4Mjc3MTc2NjIgKiBtXyAtIDAuODA4Njc1NzY2MCAqIHNfXG4gICAgXG4gICAgY29uc3QgQyA9IE1hdGguc3FydChhICogYSArIGJfICogYl8pXG4gICAgbGV0IEggPSBNYXRoLmF0YW4yKGJfLCBhKSAqICgxODAgLyBNYXRoLlBJKVxuICAgIFxuICAgIGlmIChIIDwgMCkge1xuICAgICAgICBIICs9IDM2MFxuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgICBsOiBNYXRoLnJvdW5kKEwgKiAxMDAwKSAvIDEwMDAsXG4gICAgICAgIGM6IE1hdGgucm91bmQoQyAqIDEwMDApIC8gMTAwMCxcbiAgICAgICAgaDogTWF0aC5yb3VuZChIICogMTAwMCkgLyAxMDAwXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29sb3JUeXBlKHBheWxvYWQ/OiBNYXliZVJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPikge1xuICAgIGNvbnN0IGNvbG9yID0gaXNSZWYocGF5bG9hZCkgPyBwYXlsb2FkIDogcmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KHRvVmFsdWUocGF5bG9hZCkpXG4gICAgXG4gICAgcmV0dXJuIGNvbXB1dGVkPHN0cmluZyB8IG51bGw+KHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgaWYgKCFjb2xvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb2xvci52YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hleCdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9ecmdiYS8udGVzdChjb2xvci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JnYmEnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvXnJnYi8udGVzdChjb2xvci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JnYidcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9eb2tsY2gvLnRlc3QoY29sb3IudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdva2xjaCdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9eaHNsYS8udGVzdChjb2xvci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hzbGEnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvXmhzbC8udGVzdChjb2xvci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hzbCdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICd1bmtub3duJ1xuICAgICAgICB9LFxuICAgICAgICBzZXQodHlwZSkge1xuICAgICAgICAgICAgaWYgKCFjb2xvci52YWx1ZSB8fCAhdHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UmdiID0gdXNlUkdCKGNvbG9yKS52YWx1ZVxuXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRSZ2IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdoZXgnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSByZ2JUb0hleChjdXJyZW50UmdiLnIsIGN1cnJlbnRSZ2IuZywgY3VycmVudFJnYi5iKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGByZ2IoJHtjdXJyZW50UmdiLnJ9LCAke2N1cnJlbnRSZ2IuZ30sICR7Y3VycmVudFJnYi5ifSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAncmdiYScpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGByZ2JhKCR7Y3VycmVudFJnYi5yfSwgJHtjdXJyZW50UmdiLmd9LCAke2N1cnJlbnRSZ2IuYn0sIDEpYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2hzbCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoc2wgPSByZ2JUb0hzbChjdXJyZW50UmdiLnIsIGN1cnJlbnRSZ2IuZywgY3VycmVudFJnYi5iKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYGhzbCgke2hzbC5ofSwgJHtoc2wuc30lLCAke2hzbC5sfSUpYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2hzbGEnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaHNsID0gcmdiVG9Ic2woY3VycmVudFJnYi5yLCBjdXJyZW50UmdiLmcsIGN1cnJlbnRSZ2IuYilcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGBoc2xhKCR7aHNsLmh9LCAke2hzbC5zfSUsICR7aHNsLmx9JSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnb2tsY2gnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2tsY2ggPSByZ2JUb09rbGNoKGN1cnJlbnRSZ2IuciwgY3VycmVudFJnYi5nLCBjdXJyZW50UmdiLmIpXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgb2tsY2goJHtva2xjaC5sfSAke29rbGNoLmN9ICR7b2tsY2guaH0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJHQihwYXlsb2FkPzogTWF5YmVSZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjb2xvciA9IGlzUmVmKHBheWxvYWQpID8gcGF5bG9hZCA6IHJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPih0b1ZhbHVlKHBheWxvYWQpKVxuICAgIFxuICAgIGNvbnN0IHR5cGUgPSB1c2VDb2xvclR5cGUoY29sb3IpXG5cbiAgICByZXR1cm4gY29tcHV0ZWQ8UkdCIHwgbnVsbD4oe1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBpZiAoIWNvbG9yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2JhJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJnYmEgPSBleHRyYWN0UkdCQShjb2xvci52YWx1ZSlcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHI6IHJnYmEucixcbiAgICAgICAgICAgICAgICAgICAgZzogcmdiYS5nLFxuICAgICAgICAgICAgICAgICAgICBiOiByZ2JhLmIgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjUkdCKGNvbG9yLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ2hleCcgJiYgY29sb3IudmFsdWUubGVuZ3RoID09PSA3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhleFRvUkdCKGNvbG9yLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ2hzbCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHNsVG9SZ2IoY29sb3IudmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAnb2tsY2gnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9rbGNoVG9SZ2IoY29sb3IudmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHNldCgpe1xuICAgICAgICAgICAgaWYgKCFjb2xvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2IgPSBleHRyYWNSR0IoY29sb3IudmFsdWUpXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiKCR7cmdiLnJ9LCAke3JnYi5nfSwgJHtyZ2IuYn0pYFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2JhJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJnYmEgPSBleHRyYWN0UkdCQShjb2xvci52YWx1ZSlcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGByZ2JhKCR7cmdiYS5yfSwgJHtyZ2JhLmd9LCAke3JnYmEuYn0sICR7cmdiYS5hfSlgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUkdCQShwYXlsb2FkPzogTWF5YmVSZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjb2xvciA9IGlzUmVmKHBheWxvYWQpID8gcGF5bG9hZCA6IHJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPih0b1ZhbHVlKHBheWxvYWQpKVxuICAgIFxuICAgIGNvbnN0IHR5cGUgPSB1c2VDb2xvclR5cGUoY29sb3IpXG4gICAgY29uc3QgcmdiID0gdXNlUkdCKGNvbG9yKVxuXG4gICAgcmV0dXJuIGNvbXB1dGVkPFJHQkEgfCBudWxsPih7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGlmICghcmdiLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2JhJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHRyYWN0UkdCQShjb2xvci52YWx1ZSEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucmdiLnZhbHVlLFxuICAgICAgICAgICAgICAgIGE6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlIHx8ICFjb2xvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYmEnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiYSgke3ZhbHVlLnJ9LCAke3ZhbHVlLmd9LCAke3ZhbHVlLmJ9LCAke3ZhbHVlLmF9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2InKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiKCR7dmFsdWUucn0sICR7dmFsdWUuZ30sICR7dmFsdWUuYn0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUhTTChwYXlsb2FkPzogTWF5YmVSZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjb2xvciA9IGlzUmVmKHBheWxvYWQpID8gcGF5bG9hZCA6IHJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPih0b1ZhbHVlKHBheWxvYWQpKVxuICAgIFxuICAgIGNvbnN0IHR5cGUgPSB1c2VDb2xvclR5cGUoY29sb3IpXG4gICAgY29uc3QgcmdiID0gdXNlUkdCKGNvbG9yKVxuXG4gICAgcmV0dXJuIGNvbXB1dGVkPEhTTCB8IG51bGw+KHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgaWYgKCFyZ2IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmdiVG9Ic2wocmdiLnZhbHVlLnIsIHJnYi52YWx1ZS5nLCByZ2IudmFsdWUuYilcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlIHx8ICFjb2xvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ2hzbCcpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGBoc2woJHt2YWx1ZS5ofSwgJHt2YWx1ZS5zfSUsICR7dmFsdWUubH0lKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoc2xhJykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYGhzbGEoJHt2YWx1ZS5ofSwgJHt2YWx1ZS5zfSUsICR7dmFsdWUubH0lKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoZXgnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmdiID0gaHNsVG9SZ2IoYGhzbCgke3ZhbHVlLmh9LCAke3ZhbHVlLnN9JSwgJHt2YWx1ZS5sfSUpYClcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IHJnYlRvSGV4KHJnYi5yLCByZ2IuZywgcmdiLmIpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiYScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2IgPSBoc2xUb1JnYihgaHNsKCR7dmFsdWUuaH0sICR7dmFsdWUuc30lLCAke3ZhbHVlLmx9JSlgKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYmEoJHtyZ2Iucn0sICR7cmdiLmd9LCAke3JnYi5ifSwgMSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJnYiA9IGhzbFRvUmdiKGBoc2woJHt2YWx1ZS5ofSwgJHt2YWx1ZS5zfSUsICR7dmFsdWUubH0lKWApXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiKCR7cmdiLnJ9LCAke3JnYi5nfSwgJHtyZ2IuYn0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ29rbGNoJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJnYiA9IGhzbFRvUmdiKGBoc2woJHt2YWx1ZS5ofSwgJHt2YWx1ZS5zfSUsICR7dmFsdWUubH0lKWApXG4gICAgICAgICAgICAgICAgY29uc3Qgb2tsY2ggPSByZ2JUb09rbGNoKHJnYi5yLCByZ2IuZywgcmdiLmIpXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgb2tsY2goJHtva2xjaC5sfSAke29rbGNoLmN9ICR7b2tsY2guaH0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUhleChwYXlsb2FkPzogTWF5YmVSZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjb2xvciA9IGlzUmVmKHBheWxvYWQpID8gcGF5bG9hZCA6IHJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPih0b1ZhbHVlKHBheWxvYWQpKVxuICAgIFxuICAgIGNvbnN0IHR5cGUgPSB1c2VDb2xvclR5cGUoY29sb3IpXG4gICAgY29uc3QgcmdiID0gdXNlUkdCKGNvbG9yKVxuXG4gICAgcmV0dXJuIGNvbXB1dGVkPHN0cmluZyB8IG51bGw+KHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgaWYgKCFyZ2IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmdiVG9IZXgocmdiLnZhbHVlLnIsIHJnYi52YWx1ZS5nLCByZ2IudmFsdWUuYilcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAnaGV4Jykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gdmFsdWUuc3RhcnRzV2l0aCgnIycpID8gdmFsdWUgOiBgIyR7dmFsdWV9YFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29sb3IocGF5bG9hZD86IE1heWJlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBpc1JlZihwYXlsb2FkKSA/IHBheWxvYWQgOiByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odG9WYWx1ZShwYXlsb2FkKSkgICAgXG4gICAgY29uc3QgdHlwZSA9IHVzZUNvbG9yVHlwZShjb2xvcilcbiAgICBjb25zdCBoZXggPSB1c2VIZXgoY29sb3IpXG4gICAgY29uc3QgcmdiID0gdXNlUkdCKGNvbG9yKVxuICAgIGNvbnN0IHJnYmEgPSB1c2VSR0JBKGNvbG9yKVxuICAgIGNvbnN0IGhzbCA9IHVzZUhTTChjb2xvcilcblxuICAgIFxuICAgIGNvbnN0IG9rbGNoID0gY29tcHV0ZWQ8T0tMQ0ggfCBudWxsPih7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGlmICghcmdiLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJnYlRvT2tsY2gocmdiLnZhbHVlLnIsIHJnYi52YWx1ZS5nLCByZ2IudmFsdWUuYilcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAnb2tsY2gnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgb2tsY2goJHt2YWx1ZS5sfSAke3ZhbHVlLmN9ICR7dmFsdWUuaH0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZ2IgPSBva2xjaFRvUmdiKGBva2xjaCgke3ZhbHVlLmx9ICR7dmFsdWUuY30gJHt2YWx1ZS5ofSlgKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ2hleCcpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IHJnYlRvSGV4KHJnYi5yLCByZ2IuZywgcmdiLmIpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiJykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYigke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBjb2xvcixcbiAgICAgICAgaGV4LFxuICAgICAgICByZ2IsXG4gICAgICAgIGhzbCxcbiAgICAgICAgb2tsY2gsXG4gICAgICAgIHJnYmFcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBpbmplY3QsIHByb3ZpZGUgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIERhc2hib2FyZEVudGl0eSBmcm9tICcjY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZC50cydcblxuY29uc3QgREFTSEJPQVJEX0tFWSA9IFN5bWJvbCgnZGFzaGJvYXJkJylcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYXNoYm9hcmQoZW50aXR5OiBSZWY8RGFzaGJvYXJkRW50aXR5Pikge1xuICAgIHByb3ZpZGUoREFTSEJPQVJEX0tFWSwgZW50aXR5KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRGFzaGJvYXJkKCkge1xuICAgIGNvbnN0IGVudGl0eSA9IGluamVjdDxSZWY8RGFzaGJvYXJkRW50aXR5IHwgdW5kZWZpbmVkPj4oREFTSEJPQVJEX0tFWSlcblxuICAgIGlmICghZW50aXR5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlRGFzaGJvYXJkIG11c3QgYmUgdXNlZCBpbnNpZGUgYSBjb21wb25lbnQgdGhhdCBjYWxscyBwcm92aWRlRGFzaGJvYXJkJylcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5IGFzIFJlZjxEYXNoYm9hcmRFbnRpdHk+XG59XG4iLCJpbXBvcnQgeyBpbmplY3QsIHByb3ZpZGUgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIERhc2hib2FyZFdpZGdldCBmcm9tICcjY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldC50cydcblxuY29uc3QgS0VZID0gU3ltYm9sKCdkYXNoYm9hcmQtd2lkZ2V0JylcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYXNoYm9hcmRXaWRnZXQoZW50aXR5OiBSZWY8RGFzaGJvYXJkV2lkZ2V0Pikge1xuICAgIHByb3ZpZGUoS0VZLCBlbnRpdHkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXNoYm9hcmRXaWRnZXQoKSB7XG4gICAgY29uc3QgZW50aXR5ID0gaW5qZWN0KEtFWSlcblxuICAgIGlmICghZW50aXR5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlRGFzaGJvYXJkV2lkZ2V0IG11c3QgYmUgdXNlZCBpbnNpZGUgYSBjb21wb25lbnQgdGhhdCBjYWxscyBwcm92aWRlRGFzaGJvYXJkV2lkZ2V0JylcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5IGFzIFJlZjxEYXNoYm9hcmRXaWRnZXQ+XG59XG4iLCJpbXBvcnQgeyByZWYsIHdhdGNoIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBkaSBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZVN0YXRlT3B0aW9ucyB7XG4gICAgZGVmYXVsdD86ICgpID0+IGFueVxuICAgIHRyYW5zZm9ybT86ICh2YWx1ZTogYW55KSA9PiBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0YXRlPFQ+KGtleTogc3RyaW5nLCBvcHRpb25zPzogVXNlU3RhdGVPcHRpb25zKTogUmVmPFQ+IHtcbiAgICBjb25zdCByZWZzID0gZGkuZ2V0PFJlY29yZDxzdHJpbmcsIGFueT4+KCdzdGF0ZScpXG5cbiAgICBsZXQgdmFsdWUgPSByZWZzW2tleV1cblxuICAgIGlmICghdmFsdWUgJiYgb3B0aW9ucz8uZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlID0gb3B0aW9ucy5kZWZhdWx0KClcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgJiYgb3B0aW9ucz8udHJhbnNmb3JtKSB7XG4gICAgICAgIHZhbHVlID0gb3B0aW9ucy50cmFuc2Zvcm0odmFsdWUpXG4gICAgfVxuICAgIFxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICBjb25zdCBzdGF0ZSA9IHJlZjxUPih2YWx1ZSlcblxuICAgIGNvbnN0IHVwZGF0ZSA9IChuZXdWYWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHJlZnNba2V5XSA9IG5ld1ZhbHVlXG4gICAgICAgIFxuICAgICAgICBkaS5zZXQoJ3N0YXRlJywgcmVmcylcbiAgICB9XG4gICAgXG4gICAgd2F0Y2goc3RhdGUsIHVwZGF0ZSwgeyBkZWVwOiB0cnVlIH0pXG5cbiAgICAvLyBMb2dpYyB0byBpbml0aWFsaXplIGFuZCBtYW5hZ2Ugc3RhdGVcbiAgICByZXR1cm4gY29tcHV0ZWQ8VD4oe1xuICAgICAgICBnZXQ6ICgpID0+IHN0YXRlLnZhbHVlLFxuICAgICAgICBzZXQ6IChuZXdWYWx1ZTogVCkgPT4ge1xuICAgICAgICAgICAgc3RhdGUudmFsdWUgPSBuZXdWYWx1ZVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB1cGRhdGUobmV3VmFsdWUpXG4gICAgICAgIH1cbiAgICB9KVxufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiwgdG9SZWYsIHdhdGNoIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBNYXliZVJlZiwgUmVmIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgd2F0Y2hEZWJvdW5jZWQgfSBmcm9tICdAdnVldXNlL2NvcmUnXG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJy4vdXNlU3RhdGUudHMnXG5pbXBvcnQgdHlwZSBQYWdpbmF0aW9uIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvUGFnaW5hdGlvbkVudGl0eS50cydcbmltcG9ydCAkZmV0Y2ggZnJvbSAnI2NsaWVudC9mYWNhZGVzL2ZldGNoZXIudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRmV0Y2hQYWdpbmF0aW9uT3B0aW9ucyB7XG4gICAga2V5Pzogc3RyaW5nXG4gICAgcXVlcnk/OiBNYXliZVJlZjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgIHBhZ2U/OiBNYXliZVJlZjxudW1iZXI+XG4gICAgc2VyaWFsaXplPzogKGl0ZW06IGFueSkgPT4gYW55XG4gICAgcmVmaW5lPzogKGl0ZW1zOiBhbnlbXSkgPT4gYW55W11cbiAgICBsaW1pdD86IG51bWJlclxuICAgIG9yZGVyQnk/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGxcbiAgICBvcmRlckRpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnIHwgKCdhc2MnIHwgJ2Rlc2MnKVtdIHwgbnVsbFxuICAgIGRlYm91bmNlPzogbnVtYmVyXG4gICAgaW1tZWRpYXRlPzogYm9vbGVhblxufVxuXG5jb25zdCBoeWRyYXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VGZXRjaFBhZ2luYXRpb248VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IFVzZUZldGNoUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5IHx8IHVybFxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSB1c2VTdGF0ZTxQYWdpbmF0aW9uPihrZXksIHtcbiAgICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgICB0b3RhbDogMCxcbiAgICAgICAgICAgIHRvdGFsX3BhZ2VzOiAxLFxuICAgICAgICB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBsb2FkaW5nID0gcmVmKGZhbHNlKVxuXG4gICAgY29uc3QgcGFnZSA9IHRvUmVmKG9wdGlvbnMucGFnZSB8fCAxKSBhcyBSZWY8bnVtYmVyPlxuICAgIGNvbnN0IHF1ZXJ5ID0gdG9SZWYob3B0aW9ucy5xdWVyeSB8fCB7fSkgYXMgUmVmPFJlY29yZDxzdHJpbmcsIGFueT4+XG4gICAgY29uc3QgbGltaXQgPSB0b1JlZihvcHRpb25zLmxpbWl0IHx8IDEwKSBhcyBSZWY8bnVtYmVyPlxuICAgIGNvbnN0IG9yZGVyQnkgPSB0b1JlZihvcHRpb25zLm9yZGVyQnkgfHwgbnVsbCkgYXMgUmVmPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5cbiAgICBjb25zdCBvcmRlckRpcmVjdGlvbiA9IHRvUmVmKG9wdGlvbnMub3JkZXJEaXJlY3Rpb24gfHwgbnVsbCkgYXMgUmVmPCdhc2MnIHwgJ2Rlc2MnIHwgKCdhc2MnIHwgJ2Rlc2MnKVtdIHwgbnVsbD5cblxuICAgIGNvbnN0IHRvdGFsID0gY29tcHV0ZWQoKCkgPT4gcmVzcG9uc2UudmFsdWUudG90YWwpXG4gICAgY29uc3QgdG90YWxQYWdlcyA9IGNvbXB1dGVkKCgpID0+IHJlc3BvbnNlLnZhbHVlLnRvdGFsX3BhZ2VzKVxuICAgIGNvbnN0IGl0ZW1zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBsZXQgaXRlbXMgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlLml0ZW1zKSA/IHJlc3BvbnNlLnZhbHVlLml0ZW1zIDogW11cblxuICAgICAgICBpZiAob3B0aW9ucy5yZWZpbmUpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gb3B0aW9ucy5yZWZpbmUoaXRlbXMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5zZXJpYWxpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtcy5tYXAoaSA9PiBvcHRpb25zLnNlcmlhbGl6ZSEoaSkpIGFzIFRbXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zIGFzIFRbXVxuICAgIH0pXG5cbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkKCkge1xuICAgICAgICBpZiAobG9hZGluZy52YWx1ZSkgcmV0dXJuXG5cbiAgICAgICAgbG9hZGluZy52YWx1ZSA9IHRydWVcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIC4uLnF1ZXJ5LnZhbHVlLFxuICAgICAgICAgICAgcGFnZTogcGFnZS52YWx1ZSxcbiAgICAgICAgICAgIGxpbWl0OiBsaW1pdC52YWx1ZSxcbiAgICAgICAgICAgIG9yZGVyQnk6IG9yZGVyQnkudmFsdWUgPyBvcmRlckJ5LnZhbHVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3JkZXJEaXJlY3Rpb246IG9yZGVyRGlyZWN0aW9uLnZhbHVlID8gb3JkZXJEaXJlY3Rpb24udmFsdWUgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0XSA9IGF3YWl0ICRmZXRjaC50cnk8UGFnaW5hdGlvbj4odXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcXVlcnk6IHBhcmFtc1xuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICByZXNwb25zZS52YWx1ZSA9IHJlc3VsdFxuXG4gICAgICAgIGlmIChpbXBvcnQubWV0YS5lbnYuU1NSKSB7XG4gICAgICAgICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDgwMCkpXG5cbiAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlXG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgIGlmIChwYWdlLnZhbHVlID09PSAxKSB7XG4gICAgICAgICAgICBhd2FpdCBsb2FkKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcGFnZS52YWx1ZSA9IDFcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblF1ZXJ5Q2hhbmdlKG5ld0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sIG9sZERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgY29uc3QgaXNFcXVhbCA9IEpTT04uc3RyaW5naWZ5KG5ld0RhdGEpID09PSBKU09OLnN0cmluZ2lmeShvbGREYXRhKVxuXG4gICAgICAgIGlmICghaXNFcXVhbCkge1xuICAgICAgICAgICAgcmVzZXQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2F0Y2goW3BhZ2UsIGxpbWl0XSwgbG9hZClcbiAgICB3YXRjaChbb3JkZXJCeSwgb3JkZXJEaXJlY3Rpb25dLCByZXNldCwgeyBkZWVwOiB0cnVlIH0pXG5cbiAgICB3YXRjaERlYm91bmNlZChcbiAgICAgICAgKCkgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShxdWVyeS52YWx1ZSkpLFxuICAgICAgICBvblF1ZXJ5Q2hhbmdlLFxuICAgICAgICB7XG4gICAgICAgICAgICBkZWJvdW5jZTogb3B0aW9ucy5kZWJvdW5jZSB8fCAxMDAwXG4gICAgICAgIH1cbiAgICApXG5cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGUoKSB7XG4gICAgICAgIGlmICghaHlkcmF0ZWQuaGFzKGtleSkgJiYgaXRlbXMudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBoeWRyYXRlZC5hZGQoa2V5KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBoeWRyYXRlZC5hZGQoa2V5KVxuXG4gICAgICAgIGF3YWl0IGxvYWQoKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHBhZ2UsXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBvcmRlckJ5LFxuICAgICAgICBvcmRlckRpcmVjdGlvbixcbiAgICAgICAgdG90YWwsXG4gICAgICAgIHRvdGFsUGFnZXMsXG4gICAgICAgIGl0ZW1zLFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgICBsb2FkLFxuICAgICAgICByZXNldCxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGh5ZHJhdGVcbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0eXBlIFZhbGlib3RPYmplY3RTY2hlbWEsIHR5cGUgVmFsaWJvdFNjaGVtYSwgdHlwZSBWYWxpZGF0ZVBheWxvYWQsIHR5cGUgVmFsaWRhdG9yUmVzdWx0IH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cyc7XG5pbXBvcnQgeyB0b1R5cGVkU2NoZW1hIGFzICB2ZWVWYWxpZGF0ZVRvVHlwZWRTY2hlbWEgfSBmcm9tICdAdmVlLXZhbGlkYXRlL3ZhbGlib3QnO1xuaW1wb3J0IHsgdXNlRm9ybSBhcyB1c2VWZWVWYWxpZGF0ZUZvcm0sIHR5cGUgRm9ybUNvbnRleHQsIHR5cGUgRm9ybU9wdGlvbnMsIHR5cGUgR2VuZXJpY09iamVjdCB9IGZyb20gJ3ZlZS12YWxpZGF0ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWJvdEZvcm1PcHRpb25zPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hID0gVmFsaWJvdFNjaGVtYT4gXG4gICAgZXh0ZW5kcyBPbWl0PEZvcm1PcHRpb25zPFZhbGlkYXRlUGF5bG9hZDxUPiwgVmFsaWRhdG9yUmVzdWx0PFQ+PiwgJ3ZhbGlkYXRpb25TY2hlbWEnPiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlib3RGb3JtUmVzdWx0T2JqZWN0PFQgZXh0ZW5kcyBWYWxpYm90T2JqZWN0U2NoZW1hPlxuICAgIGV4dGVuZHMgR2VuZXJpY09iamVjdCxcbiAgICBGb3JtQ29udGV4dDxWYWxpZGF0b3JSZXN1bHQ8VD4+XG4gICAge31cblxuZXhwb3J0IGNvbnN0IHVzZUZvcm0gPSB1c2VWYWxpYm90Rm9ybTtcblxuZXhwb3J0IGNvbnN0IHRvVHlwZWRTY2hlbWEgPSB2ZWVWYWxpZGF0ZVRvVHlwZWRTY2hlbWE7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VWYWxpYm90Rm9ybTxUIGV4dGVuZHMgVmFsaWJvdE9iamVjdFNjaGVtYSA9IFZhbGlib3RPYmplY3RTY2hlbWE+KHNjaGVtYTogVCwgb3B0aW9uczogVmFsaWJvdEZvcm1PcHRpb25zPFQ+ID0ge30pOiBGb3JtQ29udGV4dDxWYWxpZGF0b3JSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gdXNlVmVlVmFsaWRhdGVGb3JtKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgdmFsaWRhdGlvblNjaGVtYTogdmVlVmFsaWRhdGVUb1R5cGVkU2NoZW1hKHNjaGVtYSBhcyBhbnkpLFxuICAgIH0pIGFzIGFueVxufVxuIiwiaW1wb3J0IExheW91dE1hbmFnZXIgZnJvbSBcIiNjbGllbnQvc2VydmljZXMvTGF5b3V0U2VydmljZS50c1wiO1xuXG5jb25zdCBnID0gZ2xvYmFsVGhpcyBhcyBhbnlcblxuY29uc3QgbGF5b3V0ID0gZy5sYXlvdXQgfHwgbmV3IExheW91dE1hbmFnZXIoKVxuXG5nLmxheW91dCA9IGxheW91dFxuXG5leHBvcnQgZGVmYXVsdCBsYXlvdXRcbiIsImltcG9ydCBlbW1pdHRlciBmcm9tIFwiI2NsaWVudC9mYWNhZGVzL2VtbWl0dGVyLnRzXCJcbmltcG9ydCBsYXlvdXQgZnJvbSBcIiNjbGllbnQvZmFjYWRlcy9sYXlvdXQudHNcIlxuaW1wb3J0IHsgcmVmIH0gZnJvbSBcInZ1ZVwiXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VMYXlvdXRPcHRpb25zKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSByZWYobGF5b3V0LmdldE9wdGlvbnMoKSlcblxuICAgIGNvbnN0IHJlZnJlc2ggPSAoKSA9PiB7XG4gICAgICAgIG9wdGlvbnMudmFsdWUgPSBsYXlvdXQuZ2V0T3B0aW9ucygpXG4gICAgfVxuXG4gICAgZW1taXR0ZXIub24oJ2xheW91dDpjaGFuZ2UnLCByZWZyZXNoKVxuICAgIGVtbWl0dGVyLm9uKCdsYXlvdXQ6c2V0LW9wdGlvbnMnLCByZWZyZXNoKVxuXG4gICAgcmV0dXJuIG9wdGlvbnNcbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCByZWYgIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnXG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgICB0aW1lb3V0PzogbnVtYmVyXG59XG5cbmludGVyZmFjZSBMb2FkaW5nUmVmIGV4dGVuZHMgUmVmPGJvb2xlYW4+IHtcbiAgICBzZXQ6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlTG9hZGluZyhkZWZhdWx0VmFsdWUgPSBmYWxzZSwgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHJlZihkZWZhdWx0VmFsdWUpXG4gICAgY29uc3QgdGltZW91dCA9IHJlZihvcHRpb25zPy50aW1lb3V0ID8/IDUwMClcblxuICAgIGZ1bmN0aW9uIHNldCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgbG9hZGluZyA9IGNvbXB1dGVkKHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWUgPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHNldChmYWxzZSksIHRpbWVvdXQudmFsdWUpXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgbG9hZGluZ1JlZjogTG9hZGluZ1JlZiA9IE9iamVjdC5hc3NpZ24obG9hZGluZywgeyBzZXQgfSlcblxuICAgIHJldHVybiBsb2FkaW5nUmVmXG5cbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCByZWYgfSBmcm9tICd2dWUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUJhc2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIG9yZGVyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVTaW5nbGUgIGV4dGVuZHMgTWVudUJhc2Uge1xuICAgIGljb246IHN0cmluZztcbiAgICB0bzogc3RyaW5nO1xuICAgIHRhcmdldD86ICdfYmxhbmsnIHwgJ19zZWxmJyB8ICdfcGFyZW50JyB8ICdfdG9wJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW51V2l0aENoaWxkcmVuIGV4dGVuZHMgTWVudUJhc2Uge1xuICAgIGljb246IHN0cmluZztcbiAgICBjaGlsZHJlbjogT21pdDxNZW51U2luZ2xlLCAnaWNvbic+W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUdyb3VwIGV4dGVuZHMgTWVudUJhc2Uge1xuICAgIGdyb3VwOiBib29sZWFuO1xuICAgIGl0ZW1zOiBNZW51SXRlbVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVJdGVtIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB0bz86IHN0cmluZztcbiAgICB0YXJnZXQ/OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCc7XG4gICAgZ3JvdXA/OiBzdHJpbmdcbiAgICBvcmRlcj86IG51bWJlcjtcbiAgICBpY29uPzogc3RyaW5nXG4gICAgcGFyZW50Pzogc3RyaW5nXG4gICAgbGF5b3V0Pzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFVzZU1lbnUgPSBSZXR1cm5UeXBlPHR5cGVvZiB1c2VNZW51PlxuXG5jb25zdCBpdGVtcyA9IHJlZjxNYXA8c3RyaW5nLCBNZW51SXRlbT4+KG5ldyBNYXAoKSlcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lbnUoKSB7XG4gICAgZnVuY3Rpb24gYWRkKC4uLml0ZW06IE1lbnVJdGVtW10pIHtcbiAgICAgICAgaXRlbS5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpLmxheW91dCkge1xuICAgICAgICAgICAgICAgIGkubGF5b3V0ID0gJ2FkbWluJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpdGVtcy52YWx1ZS5zZXQoaS5pZCwgaSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmUoaXRlbTogTWVudUl0ZW0gfCBNZW51SXRlbVsnaWQnXSkge1xuXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGl0ZW1zLnZhbHVlLmRlbGV0ZShpdGVtKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlR3JvdXAoZ3JvdXBJZDogc3RyaW5nKSB7XG4gICAgICAgIEFycmF5LmZyb20oaXRlbXMudmFsdWUudmFsdWVzKCkpXG4gICAgICAgICAgICAuZmlsdGVyKGkgPT4gaS5ncm91cCA9PT0gZ3JvdXBJZCB8fCBpLnBhcmVudCA9PT0gZ3JvdXBJZClcbiAgICAgICAgICAgIC5mb3JFYWNoKGkgPT4gaXRlbXMudmFsdWUuZGVsZXRlKGkuaWQpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZU1hbnkoaXRlbUlkczogc3RyaW5nW10pIHtcbiAgICAgICAgaXRlbUlkcy5mb3JFYWNoKGlkID0+IHJlbW92ZShpZCkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlTWFueUdyb3VwKGdyb3VwSWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBncm91cElkcy5mb3JFYWNoKGlkID0+IHJlbW92ZUdyb3VwKGlkKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgaXRlbXMudmFsdWUuY2xlYXIoKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGl0ZW1zOiBjb21wdXRlZCgoKSA9PiBBcnJheS5mcm9tKGl0ZW1zLnZhbHVlLnZhbHVlcygpKSksXG4gICAgICAgIGFkZCxcbiAgICAgICAgcmVtb3ZlLFxuICAgICAgICByZW1vdmVHcm91cCxcbiAgICAgICAgcmVtb3ZlTWFueSxcbiAgICAgICAgcmVtb3ZlTWFueUdyb3VwLFxuICAgICAgICBjbGVhclxuICAgIH1cbn0iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgdHlwZSB7IFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkR2VuZXJpYyB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5cbmNvbnN0IHJvdXRlID0gY29udGFpbmVyLnByb3h5PFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkR2VuZXJpYz4oJ3JvdXRlJylcblxuZXhwb3J0IGRlZmF1bHQgcm91dGVcblxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZXIgfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5cbmNvbnN0IHJvdXRlciA9IGNvbnRhaW5lci5wcm94eTxSb3V0ZXI+KCdyb3V0ZXInKVxuXG5leHBvcnQgZGVmYXVsdCByb3V0ZXJcbiIsImltcG9ydCByb3V0ZSBmcm9tICcjY2xpZW50L2ZhY2FkZXMvcm91dGUudHMnXG5pbXBvcnQgcm91dGVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9yb3V0ZXIudHMnXG5cbmltcG9ydCB7IHVzZVJvdXRlUXVlcnkgYXMgdnVlVXNlclJvdXRlUXVlcnkgfSBmcm9tICdAdnVldXNlL3JvdXRlcidcblxuY29uc3QgemVuaXRoVXNlUm91dGVRdWVyeT0gKGtleTogYW55LCBkZWZhdWx0VmFsdWU6IGFueSwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgcmV0dXJuIHZ1ZVVzZXJSb3V0ZVF1ZXJ5KGtleSwgZGVmYXVsdFZhbHVlLCB7XG4gICAgICAgIHJvdXRlLFxuICAgICAgICByb3V0ZXIsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgdXNlUm91dGVRdWVyeSA9IHplbml0aFVzZVJvdXRlUXVlcnkgYXMgdHlwZW9mIHZ1ZVVzZXJSb3V0ZVF1ZXJ5XG5cbiIsImltcG9ydCBBdXRoU2VydmljZSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL0F1dGhTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgYXV0aCA9IGNvbnRhaW5lci5wcm94eTxBdXRoU2VydmljZT4oQXV0aFNlcnZpY2UpXG5cbmlmIChpbXBvcnQubWV0YS5lbnYuREVWICYmICFpbXBvcnQubWV0YS5lbnYuU1NSKSB7XG4gICAgKHdpbmRvdyBhcyBhbnkpLmF1dGggPSBhdXRoXG59XG5cbmV4cG9ydCBkZWZhdWx0IGF1dGhcbiIsImltcG9ydCB0eXBlIERhc2hib2FyZFdpZGdldERlZmluaXRpb24gZnJvbSAnI2NsaWVudC9lbnRpdGllcy9EYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmRXaWRnZXRSZWdpc3RyeSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRGFzaGJvYXJkV2lkZ2V0UmVnaXN0cnknXG4gICAgcHJpdmF0ZSBkZWZpbml0aW9uczogTWFwPHN0cmluZywgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbj4gPSBuZXcgTWFwKClcblxuICAgIHB1YmxpYyByZWdpc3RlciguLi5kZWZpbml0aW9uOiBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWYgb2YgZGVmaW5pdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kZWZpbml0aW9ucy5zZXQoZGVmLmlkLCBkZWYpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpOiBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmluaXRpb25zLmdldChpZCkgfHwgbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCk6IERhc2hib2FyZFdpZGdldERlZmluaXRpb25bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGVmaW5pdGlvbnMudmFsdWVzKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IERhc2hib2FyZFdpZGdldFJlZ2lzdHJ5IGZyb20gJyNjbGllbnQvcmVnaXN0cnkvRGFzaGJvYXJkV2lkZ2V0UmVnaXN0cnkudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBkYXNoYm9hcmRSZWdpc3RyeSA9IGNvbnRhaW5lci5wcm94eTxEYXNoYm9hcmRXaWRnZXRSZWdpc3RyeT4oRGFzaGJvYXJkV2lkZ2V0UmVnaXN0cnkpXG5cbmV4cG9ydCBkZWZhdWx0IGRhc2hib2FyZFJlZ2lzdHJ5XG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuaW1wb3J0IExpZmVjeWNsZVNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzJ1xuXG5jb25zdCBsaWZlY3ljbGUgPSBjb250YWluZXIucHJveHk8TGlmZWN5Y2xlU2VydmljZT4oTGlmZWN5Y2xlU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbGlmZWN5Y2xlXG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBsb2dnZXIgPSBjb250YWluZXIucHJveHk8TG9nZ2VyU2VydmljZT4oTG9nZ2VyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbG9nZ2VyXG4iLCJpbXBvcnQgTWVudVNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9NZW51U2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IG1lbnUgPSBjb250YWluZXIucHJveHk8TWVudVNlcnZpY2U+KE1lbnVTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBtZW51XG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgVG9hc3RTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvVG9hc3RTZXJ2aWNlLnRzJ1xuXG5jb25zdCB0b2FzdCA9IGNvbnRhaW5lci5wcm94eTxUb2FzdFNlcnZpY2U+KFRvYXN0U2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgdG9hc3RcbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCAqIGFzIFZlZVZhbGlkYXRlIGZyb20gJ3ZlZS12YWxpZGF0ZSdcblxuZXhwb3J0IGNvbnN0IFZFRV9WQUxJREFURV9DT05UQUlORVJfS0VZID0gJ3ZlZS12YWxpZGF0ZSdcblxuY29uc3QgdmVlVmFsaWRhdGUgPSBjb250YWluZXIucHJveHk8dHlwZW9mIFZlZVZhbGlkYXRlPihWRUVfVkFMSURBVEVfQ09OVEFJTkVSX0tFWSlcblxuZXhwb3J0IGRlZmF1bHQgdmVlVmFsaWRhdGVcbiIsIlxuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0ICogYXMgVnVlIGZyb20gJ3Z1ZSdcblxuZXhwb3J0IGNvbnN0IFZVRV9DT05UQUlORVJfS0VZID0gJ1Z1ZSdcblxuY29uc3QgdnVlID0gY29udGFpbmVyLnByb3h5PHR5cGVvZiBWdWU+KFZVRV9DT05UQUlORVJfS0VZKVxuXG5leHBvcnQgZGVmYXVsdCB2dWVcbiIsIlxuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0ICogYXMgVnVlUm91dGVyIGZyb20gJ3Z1ZS1yb3V0ZXInXG5cbmV4cG9ydCBjb25zdCBWVUVfUk9VVEVSX0NPTlRBSU5FUl9LRVkgPSAnVnVlUm91dGVyJ1xuXG5jb25zdCB2dWVSb3V0ZXIgPSBjb250YWluZXIucHJveHk8dHlwZW9mIFZ1ZVJvdXRlcj4oVlVFX1JPVVRFUl9DT05UQUlORVJfS0VZKVxuXG5leHBvcnQgZGVmYXVsdCB2dWVSb3V0ZXJcbiIsImltcG9ydCB7IGNyZWF0ZUlkIH0gZnJvbSAnI3NoYXJlZC91dGlscy9pbmRleC50cydcblxuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRHcmlkVW5pdCB7XG4gICAgYmFzZT86IG51bWJlclxuICAgIHNtPzogbnVtYmVyXG4gICAgbWQ/OiBudW1iZXJcbiAgICBsZz86IG51bWJlclxuICAgIHhsPzogbnVtYmVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZFdpZGdldERhdGEge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZWZpbml0aW9uX2lkOiBzdHJpbmdcbiAgICBwdWJsaWMgY29sdW1uczogRGFzaGJvYXJkR3JpZFVuaXQgXG4gICAgcHVibGljIHJvd3M6IERhc2hib2FyZEdyaWRVbml0XG4gICAgcHVibGljIHg6IERhc2hib2FyZEdyaWRVbml0XG4gICAgcHVibGljIHk6IERhc2hib2FyZEdyaWRVbml0XG4gICAgcHVibGljIG9yZGVyOiBudW1iZXJcbiAgICBwdWJsaWMgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxEYXNoYm9hcmRXaWRnZXREYXRhPikge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG5cbiAgICAgICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gY3JlYXRlSWQoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHt9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFdpZGdldEFjdGlvbiB7XG4gICAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgY29tcG9uZW50OiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbiB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGljb24/OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmlkID0gJydcbiAgICAgICAgdGhpcy5uYW1lID0gJydcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9ICcnXG4gICAgICAgIHRoaXMuaWNvbiA9ICcnXG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBhY3Rpb25zKCk6IERhc2hib2FyZFdpZGdldEFjdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxufVxuIiwiaW1wb3J0IEVtbWl0dGVyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cydcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB0eXBlIERhc2hib2FyZFdpZGdldERhdGEgZnJvbSAnLi9EYXNoYm9hcmRXaWRnZXREYXRhJ1xuaW1wb3J0IERhc2hib2FyZFdpZGdldERlZmluaXRpb24gZnJvbSAnLi9EYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uJ1xuaW1wb3J0IGRhc2hib2FyZFJlZ2lzdHJ5IGZyb20gJyNjbGllbnQvZmFjYWRlcy9kYXNoYm9hcmRSZWdpc3RyeS50cydcblxuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9ST1dfSEVJR0hUID0gODBcblxuaW50ZXJmYWNlIERhc2hib2FyZFdpZGdldE9wdGlvbnMge1xuICAgIGRhdGE6IERhc2hib2FyZFdpZGdldERhdGFcbiAgICBkZWZpbml0aW9uOiBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uXG59XG5cbmludGVyZmFjZSBTdHlsZXNPcHRpb25zIHtcbiAgICBjb250aWFuZXJXaWR0aDogbnVtYmVyXG4gICAgYnJlYWtwb2ludD86ICdiYXNlJyB8ICdzbScgfCAnbWQnIHwgJ3hsJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmRXaWRnZXQge1xuICAgIHB1YmxpYyBkYXRhOiBEYXNoYm9hcmRXaWRnZXREYXRhXG4gICAgcHVibGljIGRlZmluaXRpb246IERhc2hib2FyZFdpZGdldERlZmluaXRpb25cbiAgICBwdWJsaWMgZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IoeyBkYXRhLCBkZWZpbml0aW9uIH06IERhc2hib2FyZFdpZGdldE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YVxuICAgICAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uXG4gICAgICAgIHRoaXMuZW1taXR0ZXIgPSBuZXcgRW1taXR0ZXJTZXJ2aWNlKClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21EYXRhKGRhdGE6IERhc2hib2FyZFdpZGdldERhdGEpIHtcbiAgICAgICAgbGV0IGRlZiA9IGRhc2hib2FyZFJlZ2lzdHJ5LmdldChkYXRhLmRlZmluaXRpb25faWQpXG5cbiAgICAgICAgaWYgKCFkZWYpIHtcbiAgICAgICAgICAgIGRlZiA9IG5ldyBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uKClcbiAgICAgICAgICAgIGRlZi5uYW1lID0gYFVua25vd246ICR7ZGF0YS5kZWZpbml0aW9uX2lkfWBcbiAgICAgICAgICAgIGRlZi5pZCA9IGRhdGEuZGVmaW5pdGlvbl9pZFxuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYERhc2hib2FyZFdpZGdldERlZmluaXRpb24gbm90IGZvdW5kIGZvciBpZDogJHtkYXRhLmRlZmluaXRpb25faWR9LiBVc2luZyB1bmtub3duIGRlZmluaXRpb24uYClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRGFzaGJvYXJkV2lkZ2V0KHtcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBkZWZpbml0aW9uOiBkZWYsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHNldEVtbWl0dGVyKGVtbWl0dGVyOiBFbW1pdHRlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5lbW1pdHRlciA9IGVtbWl0dGVyXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmlkXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubmFtZVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudXBkYXRlKHsgbmFtZTogdmFsdWUgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG9wdGlvbnMoKTogRGFzaGJvYXJkV2lkZ2V0RGF0YVsnb3B0aW9ucyddIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5vcHRpb25zIHx8IHt9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgZ2V0IGRlZmluaXRpb25faWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5kZWZpbml0aW9uX2lkXG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbi5jb21wb25lbnQoKVxuICAgIH1cblxuICAgIHB1YmxpYyBhY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uLmFjdGlvbnMoKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sdW1ucygpOiBEYXNoYm9hcmRXaWRnZXREYXRhWydjb2x1bW5zJ10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmNvbHVtbnMgfHwge31cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvbHVtbnMocGF5bG9hZDogRGFzaGJvYXJkV2lkZ2V0RGF0YVsnY29sdW1ucyddKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS5jb2x1bW5zIHx8IHt9KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsnY29sdW1ucyddXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5zLCBwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgY29sdW1ucyB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93cygpOiBEYXNoYm9hcmRXaWRnZXREYXRhWydyb3dzJ10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnJvd3MgfHwge31cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJvd3MocGF5bG9hZDogRGFzaGJvYXJkV2lkZ2V0RGF0YVsncm93cyddKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS5yb3dzIHx8IHt9KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsncm93cyddXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihyb3dzLCBwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgcm93cyB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgeCgpOiBEYXNoYm9hcmRXaWRnZXREYXRhWyd4J10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnggfHwge31cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHgocGF5bG9hZDogRGFzaGJvYXJkV2lkZ2V0RGF0YVsneCddKSB7XG4gICAgICAgIGNvbnN0IHggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS54IHx8IHt9KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsneCddXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih4LCBwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgeCB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgeSgpOiBEYXNoYm9hcmRXaWRnZXREYXRhWyd5J10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnkgfHwge31cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHkocGF5bG9hZDogRGFzaGJvYXJkV2lkZ2V0RGF0YVsneSddKSB7XG4gICAgICAgIGNvbnN0IHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS55IHx8IHt9KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsneSddXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih5LCBwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgeSB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShjbGFzc2VzLnZhbHVlcygpKS5qb2luKCcgJylcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcHV0ZVN0eWxlcyhvcHRpb25zOiBTdHlsZXNPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gb3B0aW9ucy5icmVha3BvaW50ID8/ICdiYXNlJ1xuXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLnhbYnJlYWtwb2ludF0gPz8gMFxuICAgICAgICBjb25zdCB5ID0gdGhpcy55W2JyZWFrcG9pbnRdID8/IDBcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuY29sdW1uc1ticmVha3BvaW50XSA/PyAxXG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnJvd3NbYnJlYWtwb2ludF0gPz8gMVxuXG4gICAgICAgIGNvbnN0IGNvbFNpemUgPSBvcHRpb25zLmNvbnRpYW5lcldpZHRoIC8gMTJcbiAgICAgICAgY29uc3Qgcm93U2l6ZSA9IERBU0hCT0FSRF9ST1dfSEVJR0hUXG5cbiAgICAgICAgc3R5bGVzLnNldCgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICBzdHlsZXMuc2V0KCdsZWZ0JywgYCR7eCAqIGNvbFNpemV9cHhgKVxuICAgICAgICBzdHlsZXMuc2V0KCd0b3AnLCBgJHt5ICogcm93U2l6ZX1weGApXG4gICAgICAgIHN0eWxlcy5zZXQoJ3dpZHRoJywgYCR7Y29scyAqIGNvbFNpemUgLSAxMH1weGApIC8vIHBhZGRpbmcgYW5kIHNjcm9sbGJhciBjb21wZW5zYXRpb25cbiAgICAgICAgc3R5bGVzLnNldCgnaGVpZ2h0JywgYCR7cm93cyAqIHJvd1NpemV9cHhgKVxuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHN0eWxlcy5lbnRyaWVzKCkpXG4gICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06ICR7dmFsdWV9O2ApXG4gICAgICAgICAgICAuam9pbignICcpXG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZShwYXlsb2FkOiBQYXJ0aWFsPERhc2hib2FyZFdpZGdldERhdGE+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXRhLCBwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW1taXR0ZXIuZW1pdCgnd2lkZ2V0OnVwZGF0ZWQnLCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRPcHRpb24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLm9wdGlvbnMgfHwge30pKVxuXG4gICAgICAgIHNldChvcHRpb25zLCBrZXksIHZhbHVlKVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgb3B0aW9ucyB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRYKGJyZWFrcG9pbnQ6ICdiYXNlJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy54KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsneCddXG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB4W2JyZWFrcG9pbnRdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgeFticmVha3BvaW50XSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZSh7IHggfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0WShicmVha3BvaW50OiAnYmFzZScgfCAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnLCB2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMueSkpIGFzIERhc2hib2FyZFdpZGdldERhdGFbJ3knXVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgeVticmVha3BvaW50XVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHlbYnJlYWtwb2ludF0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyB5IH0pXG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbHVtbihicmVha3BvaW50OiAnYmFzZScgfCAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnLCB2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY29sdW1ucykpIGFzIERhc2hib2FyZFdpZGdldERhdGFbJ2NvbHVtbnMnXVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgY29sdW1uc1ticmVha3BvaW50XVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbHVtbnNbYnJlYWtwb2ludF0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyBjb2x1bW5zIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvdyhicmVha3BvaW50OiAnYmFzZScgfCAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnLCB2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucm93cykpIGFzIERhc2hib2FyZFdpZGdldERhdGFbJ3Jvd3MnXVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93c1ticmVha3BvaW50XVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJvd3NbYnJlYWtwb2ludF0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyByb3dzIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IEVtbWl0dGVyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cydcbmltcG9ydCBEYXNoYm9hcmRXaWRnZXREYXRhIGZyb20gJy4vRGFzaGJvYXJkV2lkZ2V0RGF0YSdcbmltcG9ydCBEYXNoYm9hcmRXaWRnZXQgZnJvbSAnLi9EYXNoYm9hcmRXaWRnZXQnXG5pbXBvcnQgdHlwZSB7IERhc2hib2FyZFNjaGVtYSB9IGZyb20gJyNzaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRTY2hlbWEudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkT3B0aW9ucyB7XG4gICAgZGFzaGJvYXJkOiBEYXNoYm9hcmRTY2hlbWFcbiAgICB3aWRnZXRzPzogRGFzaGJvYXJkV2lkZ2V0RGF0YVtdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZCB7XG4gICAgcHVibGljIG5hbWU6IERhc2hib2FyZFNjaGVtYVsnbmFtZSddID0gJydcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IERhc2hib2FyZFNjaGVtYVsnZGVzY3JpcHRpb24nXSA9ICcnXG4gICAgcHVibGljIHdpZGdldHM6IERhc2hib2FyZFdpZGdldFtdID0gW11cbiAgICBwdWJsaWMgZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZVxuICAgIHB1YmxpYyBjb250YWluZXJXaWR0aDogbnVtYmVyID0gMFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW1taXR0ZXIgPSBuZXcgRW1taXR0ZXJTZXJ2aWNlKClcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDb250YWluZXJXaWR0aCh3aWR0aDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSB3aWR0aFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRXaWRnZXRzKHdpZGdldHM6IERhc2hib2FyZFdpZGdldERhdGFbXSkge1xuXG4gICAgICAgIHRoaXMud2lkZ2V0cyA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCB3IG9mIHdpZGdldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZGdldCA9IERhc2hib2FyZFdpZGdldC5mcm9tRGF0YSh3KVxuXG4gICAgICAgICAgICB3aWRnZXQuc2V0RW1taXR0ZXIodGhpcy5lbW1pdHRlcilcblxuICAgICAgICAgICAgdGhpcy53aWRnZXRzLnB1c2god2lkZ2V0KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZExhc3RSb3coKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDAgXG5cbiAgICAgICAgZm9yIChjb25zdCB3aWRnZXQgb2YgdGhpcy53aWRnZXRzKSB7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gd2lkZ2V0LnJvd3M/LmJhc2UgPz8gMFxuICAgICAgICAgICAgY29uc3QgeSA9IHdpZGdldC55Py5iYXNlID8/IDBcblxuICAgICAgICAgICAgY29uc3QgYm90dG9tID0geSArIHJvd3NcblxuICAgICAgICAgICAgaWYgKGJvdHRvbSA+IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJvdHRvbVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkV2lkZ2V0KHBheWxvYWQ6IFBhcnRpYWw8RGFzaGJvYXJkV2lkZ2V0RGF0YT4gPSB7fSkge1xuICAgICAgICBpZiAoIXBheWxvYWQuY29sdW1ucykge1xuICAgICAgICAgICAgcGF5bG9hZC5jb2x1bW5zID0geyBiYXNlOiA0LCB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBheWxvYWQucm93cykge1xuICAgICAgICAgICAgcGF5bG9hZC5yb3dzID0geyBiYXNlOiA0LCB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBheWxvYWQueCkge1xuICAgICAgICAgICAgcGF5bG9hZC54ID0geyBiYXNlOiAwLCB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBheWxvYWQueSkge1xuICAgICAgICAgICAgcGF5bG9hZC55ID0geyBiYXNlOiB0aGlzLmZpbmRMYXN0Um93KCksIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRGFzaGJvYXJkV2lkZ2V0RGF0YShwYXlsb2FkKVxuXG4gICAgICAgIGNvbnN0IHdpZGdldCA9IERhc2hib2FyZFdpZGdldC5mcm9tRGF0YShkYXRhKVxuXG4gICAgICAgIHdpZGdldC5zZXRFbW1pdHRlcih0aGlzLmVtbWl0dGVyKVxuXG4gICAgICAgIHRoaXMud2lkZ2V0cy5wdXNoKHdpZGdldClcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlV2lkZ2V0KGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy53aWRnZXRzID0gdGhpcy53aWRnZXRzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpXG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZVdpZGdldEJ5SWQoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMuZmlsdGVyKCh3KSA9PiB3LmlkICE9PSBpZClcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlV2lkZ2V0KGluZGV4OiBudW1iZXIsIHdpZGdldDogRGFzaGJvYXJkV2lkZ2V0KSB7XG4gICAgICAgIHRoaXMud2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAoKHcsIGkpID0+IGkgPT09IGluZGV4ID8gd2lkZ2V0IDogdylcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVwbGljYXRlV2lkZ2V0KGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY29weTogRGFzaGJvYXJkV2lkZ2V0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLndpZGdldHNbaW5kZXhdKSlcblxuICAgICAgICBjb25zdCB1cGRhdGVkID0gWy4uLnRoaXMud2lkZ2V0c11cblxuICAgICAgICB1cGRhdGVkLnNwbGljZShpbmRleCArIDEsIDAsIGNvcHkpXG4gICAgfVxufVxuIiwiaW1wb3J0IERhc2hib2FyZFdpZGdldERlZmluaXRpb24gZnJvbSAnLi9EYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uJ1xuaW1wb3J0IHR5cGUgRGFzaGJvYXJkV2lkZ2V0RGF0YSBmcm9tICcuL0Rhc2hib2FyZFdpZGdldERhdGEnXG5cbi8qKlxuICAgICogQ29tcG9uZW50IHRvIGJlIHVzZWQgZm9yIGNoYXJ0IHdpZGdldHMgaW4gdGhlIGRhc2hib2FyZC5cbiAgICAqIFBsdWdpbnMgY2FuIGV4dGVuZCB0aGlzIGNsYXNzIHRvIGNyZWF0ZSB0aGVpciBvd24gY2hhcnQgd2lkZ2V0cy5cbiAgICAqIEBleGFtcGxlXG4gICAgKiBjbGFzcyBNeUNoYXJ0V2lkZ2V0IGV4dGVuZHMgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbkNoYXJ0IHtcbiAgICAqICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAqICAgICAgICAgc3VwZXIoKVxuICAgICogICAgICAgICB0aGlzLm5hbWUgPSAnTXkgQ2hhcnQgV2lkZ2V0J1xuICAgICogICAgICAgICB0aGlzLmlkID0gJ215LWNoYXJ0LXdpZGdldCdcbiAgICAqICAgICB9XG4gICAgKiB9XG4gICAgKi9cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uQ2hhcnQgZXh0ZW5kcyBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZW5kZXJlcjogYW55IFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5uYW1lID0gJ0NoYXJ0J1xuICAgICAgICB0aGlzLmlkID0gJ2NoYXJ0J1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0UmVuZGVyZXIocmVuZGVyZXI6IGFueSkge1xuICAgICAgICBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uQ2hhcnQucmVuZGVyZXIgPSByZW5kZXJlclxuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uQ2hhcnQucmVuZGVyZXJcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gY2hhcnQgb3B0aW9ucyBmb3IgdGhlIGNoYXJ0IHdpZGdldC4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwbHVnaW5zIHRvIHByb3ZpZGUgY3VzdG9tIGNoYXJ0IG9wdGlvbnMuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0byBiZSBleHRlbmRlZCBsYXRlclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgYXN5bmMgY2hhcnRPcHRpb25zKHBheWxvYWQ6IERhc2hib2FyZFdpZGdldERhdGFbJ29wdGlvbnMnXSk6IFByb21pc2U8YW55PntcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMyUnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAnNCUnLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgICAgICAgICBjb250YWluTGFiZWw6IHRydWUgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGU6IHsgdGV4dDogJ0VDaGFydHMgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUnIH0sXG4gICAgICAgICAgICB0b29sdGlwOiB7fSxcbiAgICAgICAgICAgIHhBeGlzOiB7IGRhdGE6IFsnc2hpcnQnLCAnY2FyZGlnYW4nLCAnY2hpZmZvbicsICdwYW50cycsICdoZWVscycsICdzb2NrcyddIH0sXG4gICAgICAgICAgICB5QXhpczoge30sXG4gICAgICAgICAgICBzZXJpZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzYWxlcycsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdiYXInLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBbNSwgMjAsIDM2LCAxMCwgMTAsIDIwXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgIFxufVxuIiwiaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMnXG5pbXBvcnQgcm91dGVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9yb3V0ZXIudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB0eXBlIHsgQXV0b09wdGlvbnMgfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgICBwdWJsaWMgYWRkUGFnZXNGb2xkZXIoaW1wb3J0czogYW55LCBvcHRpb25zPzogQXV0b09wdGlvbnMpIHtcbiAgICAgICAgcm91dGVyLmF1dG8oaW1wb3J0cywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbG9hZCBhZGRpdGlvbmFsIGRhdGEgZnJvbSB0aGUgcGx1Z2luJ3MgZGlyZWN0b3J5IGlmIG5lZWRlZFxuICAgIH1cbn1cbiIsImltcG9ydCB7IGF1dG8gfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IEF1dG9PcHRpb25zIH0gZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBEZWZpbmVDb21wb25lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSB7IFJvdXRlUmVjb3JkUmF3IH0gZnJvbSAndnVlLXJvdXRlcidcblxuLyoqIEBkZXByZWNhdGVkIFVzZSBhdXRvIGZyb20gUm91dGVyU2VydmljZSBpbnN0ZWFkICovXG5leHBvcnQgZnVuY3Rpb24gYXV0b1JvdXRlcyhcbiAgICBpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVDb21wb25lbnQgfCAoKCkgPT4gUHJvbWlzZTxEZWZpbmVDb21wb25lbnQ+KT4sXG4gICAgb3B0aW9uczogQXV0b09wdGlvbnMgPSB7fVxuKTogUm91dGVSZWNvcmRSYXdbXSB7XG4gICAgcmV0dXJuIGF1dG8oaW1wb3J0cywgb3B0aW9ucylcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlQ29sdW1uPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGlkPzogc3RyaW5nXG4gICAgbGFiZWw/OiBzdHJpbmdcbiAgICBmaWVsZD86IGtleW9mIFQgfCAoKHJvdzogVCkgPT4gYW55KSB8IChzdHJpbmcgJiB7fSlcbiAgICBzb3J0YWJsZT86IGJvb2xlYW5cbiAgICB3aWR0aD86IHN0cmluZyB8IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29sdW1uczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oY29sdW1uczogRGF0YVRhYmxlQ29sdW1uPFQ+W10pIHtcbiAgICByZXR1cm4gY29sdW1uc1xufVxuIiwiZXhwb3J0IGludGVyZmFjZSBEZWZpbmVGb3JtRmllbGQge1xuICAgIGNvbXBvbmVudDpcbiAgICAndGV4dC1maWVsZCdcbiAgICB8ICd0ZXh0YXJlYSdcbiAgICB8ICdzZWxlY3QnXG4gICAgfCAnYXV0b2NvbXBsZXRlJ1xuICAgIHwgJ3N3aXRjaCdcbiAgICB8ICdmaWxlLXVwbG9hZCdcbiAgICB8ICdpbWFnZS11cGxvYWQnXG4gICAgfCAnY29sb3ItcGlja2VyJ1xuICAgIHwgJ3N0cmluZy1saXN0LWlucHV0J1xuICAgIHwgJ2pzb24taW5wdXQnXG4gICAgfCAnZGF0ZS1waWNrZXInXG4gICAgfCAnaGlkZGVuJ1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRm9ybUZpZWxkcyhmaWVsZDogUmVjb3JkPHN0cmluZywgRGVmaW5lRm9ybUZpZWxkPikge1xuICAgIHJldHVybiBmaWVsZFxufVxuXG4iLCJpbXBvcnQgJG9yaWdpbmFsIGZyb20gXCIjY2xpZW50L2ZhY2FkZXMvZmV0Y2hlci50c1wiO1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGZldGNoZXIgZmFjYWRlICovXG5leHBvcnQgY29uc3QgJGZldGNoID0gJG9yaWdpbmFsO1xuIiwiaW1wb3J0IHsgJGZldGNoIH0gZnJvbSAnLi9mZXRjaGVyJ1xuXG5pbnRlcmZhY2UgUGlja09wdGlvbnMge1xuICAgIGFjY2VwdD86IHN0cmluZ1xuICAgIG11bHRpcGxlPzogYm9vbGVhblxufVxuXG50eXBlIFBpY2tSZXN1bHQ8VCBleHRlbmRzIFBpY2tPcHRpb25zPiA9IFRbJ211bHRpcGxlJ10gZXh0ZW5kcyB0cnVlID8gRmlsZVtdIDogRmlsZSB8IG51bGxcblxuZnVuY3Rpb24gcGljazxUIGV4dGVuZHMgUGlja09wdGlvbnM+KG9wdGlvbnM6IFQpOiBQcm9taXNlPFBpY2tSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXG5cbiAgICAgICAgaW5wdXQudHlwZSA9ICdmaWxlJ1xuICAgICAgICBpbnB1dC5hY2NlcHQgPSBvcHRpb25zLmFjY2VwdCB8fCAnKi8qJ1xuICAgICAgICBpbnB1dC5tdWx0aXBsZSA9IG9wdGlvbnMubXVsdGlwbGUgfHwgZmFsc2VcblxuICAgICAgICBpbnB1dC5vbmNoYW5nZSA9IChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20odGFyZ2V0LmZpbGVzIGFzIEZpbGVMaXN0KSBhcyBGaWxlW11cblxuICAgICAgICAgICAgcmVzb2x2ZSgob3B0aW9ucy5tdWx0aXBsZSA/IEFycmF5LmZyb20oZmlsZXMpIDogZmlsZXNbMF0pIGFzIFBpY2tSZXN1bHQ8VD4pXG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dC5vbmNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUob3B0aW9ucy5tdWx0aXBsZSA/IFtdIDogKG51bGwgYXMgYW55KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0LmNsaWNrKClcbiAgICB9KVxufVxuXG5mdW5jdGlvbiB0b1VpbnQ4QXJyYXkoZmlsZTogRmlsZSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcblxuICAgICAgICByZWFkZXIub25sb2FkID0gKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLnRhcmdldD8ucmVzdWx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KGUudGFyZ2V0LnJlc3VsdCkpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZWFkIGZpbGUgYXMgQXJyYXlCdWZmZXInKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KHJlYWRlci5lcnJvcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKVxuICAgIH0pXG59XG5cbmludGVyZmFjZSBVcGxvYWRPcHRpb25zIHtcbiAgICBkcml2ZUlkOiBzdHJpbmdcbiAgICBmaWxlOiBGaWxlXG4gICAgZGlyZWN0b3J5Pzogc3RyaW5nXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZChvcHRpb25zOiBVcGxvYWRPcHRpb25zKXtcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgICBcbiAgICBmb3JtLmFwcGVuZCgnZmlsZScsIG9wdGlvbnMuZmlsZSlcblxuICAgIGlmIChvcHRpb25zLmRpcmVjdG9yeSkge1xuICAgICAgICBmb3JtLmFwcGVuZCgnZGlyZWN0b3J5Jywgb3B0aW9ucy5kaXJlY3RvcnkpXG4gICAgfVxuXG4gICAgcmV0dXJuICRmZXRjaChgL2FwaS9kcml2ZXMvJHtvcHRpb25zLmRyaXZlSWR9L3VwbG9hZGAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IGZvcm0sXG4gICAgICAgIHF1ZXJ5OiB7IGRpcmVjdG9yeTogb3B0aW9ucy5kaXJlY3RvcnksIH1cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgJGZpbGUgPSB7XG4gICAgcGljayxcbiAgICB1cGxvYWQsXG4gICAgdG9VaW50OEFycmF5LFxufSIsImltcG9ydCByb3V0ZSBmcm9tICcjY2xpZW50L2ZhY2FkZXMvcm91dGUudHMnIFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUbyh0bzogc3RyaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9IHRvXG5cbiAgICAvLyByZXBsYWNlIDpwYXJhbSB3aXRoIHJvdXRlIHBhcmFtIHZhbHVlXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocm91dGUucGFyYW1zKSkge1xuICAgICAgICBjb25zdCBwYXJhbVBsYWNlaG9sZGVyID0gYDoke2tleX1gXG5cbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UocGFyYW1QbGFjZWhvbGRlciwgU3RyaW5nKHZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbiIsImltcG9ydCB7IHRvYXN0IH0gZnJvbSAndnVlLXNvbm5lcidcblxuZXhwb3J0IGNvbnN0ICR0b2FzdCA9IHRvYXN0XG4iLCJpbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25HdWFyZCwgUm91dGVMb2NhdGlvbk5vcm1hbGl6ZWQgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IGF1dGggZnJvbSAnI2NsaWVudC9mYWNhZGVzL2F1dGgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEd1YXJkT3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q6IHN0cmluZyB8ICgodG86IFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkKSA9PiBzdHJpbmcpXG4gICAgZXhjbHVkZT86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdXRoR3VhcmQob3B0aW9uczogQXV0aEd1YXJkT3B0aW9ucyk6IE5hdmlnYXRpb25HdWFyZCB7XG4gICAgY29uc3QgZXhjbHVkZSA9IG9wdGlvbnMuZXhjbHVkZSB8fCBbJy9hdXRoL2xvZ2luJywgJy9hdXRoL3JlZ2lzdGVyJ11cblxuICAgIHJldHVybiAodG8pID0+IHtcblxuICAgICAgICBpZiAoIWF1dGgudXNlciAmJiAhZXhjbHVkZS5pbmNsdWRlcyh0by5wYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RQYXRoID0gdHlwZW9mIG9wdGlvbnMucmVkaXJlY3QgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnJlZGlyZWN0KHRvKSA6IG9wdGlvbnMucmVkaXJlY3RcblxuICAgICAgICAgICAgcmV0dXJuIHJlZGlyZWN0UGF0aFxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBhdXRoR3VhcmQgPSBjcmVhdGVBdXRoR3VhcmQoe1xuICAgIHJlZGlyZWN0OiB0byA9PiAnL2F1dGgvbG9naW4/cmVkaXJlY3Q9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0by5mdWxsUGF0aCksXG59KVxuXG5leHBvcnQgZGVmYXVsdCBhdXRoR3VhcmRcbiIsImltcG9ydCBhdXRoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9hdXRoLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1ZXN0R3VhcmRPcHRpb25zIHtcbiAgICByZWRpcmVjdDogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHdWVzdEd1YXJkKG9wdGlvbnM6IEd1ZXN0R3VhcmRPcHRpb25zKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGF1dGgudXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucmVkaXJlY3RcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgZ3Vlc3RHdWFyZCA9IGNyZWF0ZUd1ZXN0R3VhcmQoe1xuICAgIHJlZGlyZWN0OiAnLydcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IGd1ZXN0R3VhcmRcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNTUsNTZdLCJtYXBwaW5ncyI6IjJ4QkFZQSxlQUFzQixFQUErQixFQUEyQyxDQUM1RixHQUFJLENBRUEsTUFBTyxDQUFDLEtBRE8sTUFBTSxHQUFPLENBQ1AsT0FDaEIsRUFBTyxDQUNaLE1BQU8sQ0FBQyxFQUFjLEtBQUssRUFJbkMsRUFBUyxLQUFPLFNBQTJCLEVBQTZCLENBQ3BFLEdBQUksQ0FFQSxNQUFPLENBQUMsS0FETyxHQUFPLENBQ0QsT0FDaEIsRUFBTyxDQUNaLE1BQU8sQ0FBQyxFQUFjLEtBQUssR0NqQm5DLElBQXFCLEVBQXJCLEtBQWtDLENBQzlCLE9BQWMsc0JBQXdCLGVBRXRDLE1BQWdCLFlBQVksRUFBb0IsQ0FDNUMsR0FBSSxFQUFTLFFBQVEsSUFBSSxlQUFlLEVBQUUsU0FBUyxPQUFPLENBQUUsQ0FDeEQsSUFBTSxFQUFPLE1BQU0sRUFBUyxNQUFNLENBQzdCLFdBQWEsQ0FBRSxRQUFTLEdBQUcsd0JBQXdCLENBQUUsRUFBRSxDQU01RCxPQUpJLEVBQUssU0FDTCxFQUFNLE1BQU0sRUFBSyxRQUFRLENBR3RCLEVBS1gsT0FGQSxFQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxDQUVqQyxDQUNILFFBQVMsR0FBRyx3QkFBd0IsQ0FDdkMsQ0FHTCxTQUFtQixFQUFhLEVBQXFDLENBQ2pFLEdBQUksQ0FBQyxFQUNELE9BQU8sRUFHWCxJQUFNLEVBQWMsRUFBRyxVQUFVLEVBQU8sQ0FBRSxZQUFhLFdBQVksQ0FBQyxDQUVwRSxPQUFPLEVBQU0sSUFBTSxFQUd2QixpQkFBMkIsRUFBb0MsQ0FDM0QsSUFBTSxFQUE0QixDQUFFLEdBQUcsRUFBUyxDQVVoRCxPQVJJLEVBQVEsT0FDUixFQUFhLEtBQU8sS0FBSyxVQUFVLEVBQVEsS0FBSyxDQUNoRCxFQUFhLFFBQVUsQ0FDbkIsR0FBRyxFQUFhLFFBQ2hC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
|
|
1
|
+
import{t as e}from"./chunk-0Lt9GpW0.mjs";import{toast as t}from"vue-sonner";import n from"qs";import{debounce as r,get as i,has as a,orderBy as o,set as s,unset as c}from"lodash-es";import*as l from"valibot";import{format as u}from"date-fns";import{defineAbility as d,subject as f}from"@casl/ability";import{createMemoryHistory as p,createRouter as m,createWebHistory as h}from"vue-router";import{computed as g,getCurrentInstance as _,getCurrentScope as ee,hasInjectionContext as te,inject as ne,isRef as v,nextTick as re,onMounted as ie,provide as ae,ref as y,shallowRef as b,toRef as x,toValue as S,unref as oe,watch as C,watchEffect as se}from"vue";import{toTypedSchema as ce}from"@vee-validate/valibot";import{useForm as le}from"vee-validate";import"@unhead/vue";import{useRouteQuery as ue}from"@vueuse/router";import{clsx as de}from"clsx";import{twMerge as fe}from"tailwind-merge";async function w(e){try{return[null,await e()]}catch(e){return[e,null]}}w.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var T=class{static __container_entry_key=`FetchService`;async handleError(e){if(e.headers.get(`Content-Type`)?.includes(`json`)){let n=await e.json().catch(()=>({message:$t(`Internal Server Error`)}));return n.message&&t.error(n.message),n}return t.error($t(`Internal Server Error`)),{message:$t(`Internal Server Error`)}}buildUrl(e,t){if(!t)return e;let r=n.stringify(t,{arrayFormat:`brackets`});return e+`?`+r}buildRequestInit(e){let t={...e};return e.data&&(t.body=JSON.stringify(e.data),t.headers={...t.headers,"Content-Type":`application/json`}),t}async parseResponse(e){return e.headers.get(`Content-Type`)?.includes(`json`)?e.json():e.text()}async fetch(e,t={}){throw Error(`Method not implemented`)}async try(e,t={}){return w(()=>this.fetch(e,t))}async get(e,t={}){return this.fetch(e,{...t,method:`GET`})}async post(e,t={}){return this.fetch(e,{...t,method:`POST`})}async put(e,t={}){return this.fetch(e,{...t,method:`PUT`})}async delete(e,t={}){return this.fetch(e,{...t,method:`DELETE`})}},pe=class e extends Error{status=500;constructor(e,t=500){super(e),this.name=`BaseException`,this.status=t}static fromError(t){return new e(t.message,500)}},me=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new pe(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}unset(e){let t=this.getKey(e);this.entries.delete(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const E=globalThis.clientContainer||new me;globalThis.clientContainer=E;const D=E.proxy(T);function O(...e){return e.reduce((e,t)=>t(e),class{})}function he(e,...t){return t.reduce((e,t)=>t(e),e)}function ge(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function k(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}function A(e){return class extends e{created_at;updated_at}}function j(e){return class extends e{deleted_at=null}}O(k,A,j);var _e=class{static __container_entry_key=`AuthService`;user;constructor(e={}){this.user=e.user||null}async logout(e){let[t]=await D.try(`/auth/logout`,{method:`POST`});t||(window.location.href=e?.redirect||`/`)}},ve=class extends T{async fetch(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i);return await this.parseResponse(i)}},ye=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}};function be(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;if(i&&typeof i==`object`){be(i,e,n);continue}n[e]=i}return n}function xe(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function Se(e=``){return e+xe()}var Ce=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let r=n.value;return typeof r!=`object`||Array.isArray(r)?!1:a(r,e.substring(t.length+1))}get(e,t){let n=this.entries.get(e);if(n)return n.value;if(!e.includes(`.`))return t;let r=e.split(`.`)[0],a=this.entries.get(r);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:i(o,e.substring(r.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),s(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(c(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return be(this.toRecord())}};const we=E.proxy(Ce);function Te(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function Ee(e){let t={},r=e.split(`?`)[1];return r?n.parse(r):t}var De=class extends T{async fetch(e,t={}){return!e.startsWith(`http://`)&&!e.startsWith(`https://`)?this.fetchInternal(e,t):this.fetchExternal(e,t)}async fetchExternal(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}async fetchInternal(e,t={}){let n=E.get(`RouterService`),r=t.method||`GET`,i=n.resolve(r,e),a=new ye({prefix:we.get(`cookie.prefix`,``)});if(E.has(`cookies`)&&a.load(E.get(`cookies`)),!i||!i.handler)throw Error(`Route not found for ${r} ${e}`);return await n.execute(i,{url:e,params:Te(i.path,e),query:t.query||Ee(e),body:t.data||t.body,method:r.toLowerCase(),cookie:a})}},M=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},Oe=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new M,this.debug&&this.logger.debug(`emmitter loaded with debug mode enabled`)}static create(t){return new e(t)}setDebug(e){this.debug=e,this.debug&&this.logger.debug(`debug mode enabled`)}setLogger(e){this.logger=e}on(e,t,n){let r=n?.id||Se();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=(n,i)=>{t(n,i),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,t,n){let i=r(t,n?.debounce||300),a=this.on(e,i,n);return a&&(a.originalListener=t),a}onAnyOf(e,t,n){let r=[];for(let i of e){let e=this.on(i,t,n);e&&r.push(e)}return r}off(e,t){this.handlers=this.handlers.filter(n=>!(n.event===e&&(n.listener===t||n.originalListener===t))),this.debug&&this.logger.debug(`handler removed`,{event:e})}emit(e,t){this.debug&&this.logger.debug(`emitting event`,{event:e,args:t});let n=this.handlers.filter(t=>t.event===e);for(let r of n)w.sync(()=>r.listener(t,{event:e}))}async emitAndWait(e,t){let n=this.handlers.filter(t=>t.event===e);this.debug&&this.logger.debug(`emitting event and wait`,{handlers:n.length,event:e,args:t});for await(let r of n)await r.listener(t,{event:e})}list(){return this.handlers}listByEvent(e){return this.handlers.filter(t=>t.event===e)}remove(e){let t=Array.isArray(e)?e:[e];this.handlers=this.handlers.filter(e=>!t.includes(e.id)),this.debug&&this.logger.debug(`handlers removed`,{ids:t})}clear(){this.handlers=[],this.debug&&this.logger.debug(`all handlers cleared`)}hasHandlers(){return this.handlers.length>0}},ke=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},Ae=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new M,e.onError&&(this.onError=e.onError)}setOnError(e){this.onError=e}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=o(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await w(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}on(e,t){let n=new ke;n.hook_id=`custom:${e}:${Date.now()}`,n[e]=t,this.add(n)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}};const N=()=>l.pipe(l.union([l.string(),l.number()]),l.transform(Number),l.integer()),je=()=>l.pipe(l.union([l.string(),l.boolean()]),l.transform(e=>e===!0||e===`true`)),Me=()=>l.pipe(l.union([l.string(),l.date()]),l.transform(e=>e instanceof Date?e:new Date(e)),l.transform(e=>e&&u(e,`yyyy-MM-dd`))),Ne=()=>l.pipe(l.union([l.string(),l.date()]),l.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),u(e,`yyyy-MM-dd HH:mm`))))),P=(e=l.any())=>l.pipe(l.union([l.string(),l.array(l.string())]),l.transform(e=>Array.isArray(e)?e:e.split(`,`)),l.array(e)),Pe=()=>l.pipe(P(),l.transform(e=>e.map(Number))),Fe=()=>l.pipe(l.union([l.string(),l.record(l.string(),l.any())]),l.transform(e=>typeof e==`string`?n.parse(e):e),l.transform(e=>{let t={};for(let n in e)s(t,n,i(e,n));return t}));function F(){return Fe()}F.number=N,F.boolean=je,F.date=Me,F.datetime=Ne,F.array=P,F.arrayNumber=Pe,F.object=Fe;const Ie=()=>l.pipe(l.string(),l.transform(e=>{let t=e.split(/[;\n]/).filter(Boolean).filter(e=>e.includes(`=`)).map(e=>e.trim().split(`=`)),n=Object.fromEntries(t),r={};for(let[e,t]of Object.entries(n)){let n=t;t.startsWith(`bool:`)&&(n=t.replace(`bool:`,``).trim()===`true`),s(r,e,n)}return r})),Le=(e={})=>l.object({page:l.optional(N(),1),limit:l.optional(N(),e.maxLimit||100),orderBy:l.nullish(e.orderFields?P(l.picklist(e.orderFields)):P(l.string()),[]),orderDirection:l.nullish(P(l.union([l.literal(`asc`),l.literal(`desc`)])),[])});function Re(e={}){return Le(e)}Re.base=Le;var ze=e({array:()=>P,arrayNumber:()=>Pe,base:()=>Le,boolean:()=>je,date:()=>Me,datetime:()=>Ne,keyValue:()=>Ie,number:()=>N,object:()=>Fe,pagination:()=>Re,url:()=>F});const I=new class{static __container_entry_key=`ValidatorService`;v={...l,extras:ze};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=l.safeParse(n,e);if(!a){let e=l.flatten(i),t=[];e.root&&t.push(...e.root),e.nested&&Object.entries(e.nested).forEach(e=>{let[n,r]=e;t.push(...r.map(e=>`${n}: ${e}`))});let n=new pe(t.length?t.join(`, `):`Validation failed`,422);throw n.name=`ValidationError`,Object.assign(n,{messages:t}),n}return r}async validateAsync(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=await l.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=l.flatten(i),n={...t.root,...t.nested};throw Object.assign(e,{details:n}),e}return r}isValid(e,t){let n=typeof t==`function`?t(this.v):t,{success:r}=l.safeParse(n,e);return r}};function L(){return I.create(e=>e.object({id:e.number(),dashboard_id:e.number(),name:e.string(),value:e.nullable(e.string())}))}L.create=I.create(e=>e.pick(L(),[`dashboard_id`,`name`,`value`])),L.update=I.create(e=>e.partial(L.create));function R(){return I.create(e=>e.object({id:e.number(),name:e.string(),description:e.nullable(e.string()),created_at:e.string(),updated_at:e.string(),deleted_at:e.nullable(e.string()),metas:e.optional(e.record(e.string(),e.any()))}))}R.create=I.create(e=>e.pick(R(),[`name`,`description`])),R.update=I.create(e=>e.partial(R.create)),l.object({id:l.number(),permission_id:l.number(),assignable_type:l.string(),assignable_id:l.string(),created_at:l.string(),updated_at:l.string()}),l.object({id:l.number(),name:l.nullable(l.string()),description:l.nullable(l.string()),action:l.string(),subject:l.string(),conditions:l.nullable(l.string()),created_at:l.string(),updated_at:l.string(),expires_at:l.string()}),l.object({id:l.number(),name:l.nullable(l.string()),type:l.string(),user_id:l.number(),token:l.string(),created_at:l.string(),updated_at:l.string(),expires_at:l.string()});function z(){return l.object({id:l.number(),name:l.optional(l.string()),email:l.pipe(l.string(),l.email()),password:l.pipe(l.string(),l.minLength(6)),username:l.pipe(l.string(),l.regex(/^[a-zA-Z0-9_-]+$/)),verified_at:l.nullable(l.string()),created_at:l.string(),updated_at:l.string(),deleted_at:l.nullable(l.string())})}z.create=()=>l.omit(z(),[`id`,`verified_at`,`created_at`,`updated_at`,`deleted_at`]),z.update=()=>l.partial(z.create());async function Be(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function Ve(e,t,n){let r=e.listeners||[];r.find(e=>e.event===t&&e.listener===n)||(r.push({event:t,listener:n}),e.listeners=r)}function He(e){return class extends e{constructor(...e){super(...e),typeof this.constructor.boot==`function`&&this.constructor.boot.apply(this.constructor)}static listeners=[];static on(e,t){return Ve(this,e,t)}static async emit(e,...t){return Be(this,e,...t)}}}He.emit=Be,He.on=Ve;var Ue=class extends O(k){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=w.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},We=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>Ue.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new M().child({label:`acl`}),this.ability=d(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=f(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=f(t,n);return this.ability.cannot(e,r)}subject(e,t){return f(e,t)}};O(k,A,j),O(k,A,j),O(k,A,j);var Ge=class extends O(k,ge(ke)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}};O(k);var Ke=class extends O(k){id;name;version;enabled;aliases;version_channel;version_available_channels};O(k,A,j);const B=E.proxy(Oe);var qe=class{static __container_entry_key=`LayoutService`;components=new Map;options={};currendId=null;setCurrent(e){this.currendId=e,B.emit(`layout:change`,e)}add(e,t,n){this.components.set(e,t),this.options=n||{}}has(e){return this.components.has(e)}get(e){let t=this.components.get(e);if(!t)throw new pe(`Layout ${e} not found`);return t}getOptions(){return this.options}getCurrent(){return this.currendId?this.get(this.currendId):null}setOptions(e={}){this.options=e,B.emit(`layout:set-options`,e)}},Je=class extends Ae{addImports(e){let t=[];for(let[n,r]of Object.entries(e)){let e=new(r.default||r);e.hook_id=e.hook_id||n,t.push(e)}t.forEach(e=>this.add(e))}},Ye=class extends O(k){id;label;layout;to;target;group;order;icon;parent};const Xe=E.proxy(We);var Ze=class{static __container_entry_key=`MenuService`;items=new Map;add(...e){for(let t of e)t.id||=JSON.stringify(t),this.items.set(t.id,Ye.from(t))}remove(e){this.items.delete(e)}list(e={}){let t=JSON.parse(JSON.stringify(Array.from(this.items.values())));return e.layout&&(t=t.filter(t=>t.layout===e.layout)),e.group&&(t=t.filter(t=>t.group===e.group||t.parent===e.group)),e.parent&&(t=t.filter(t=>t.parent===e.parent)),e.allowed!==void 0&&e.allowed===!0&&(t=t.filter(e=>Xe.can(`view`,e))),t.sort((e,t)=>(e.order?e.order:98)-(t.order?t.order:98)),t}clear(){this.items.clear()}};const Qe=e=>{let t=we.get(`setup`),n=!t?.need_database&&!t?.need_users;return n&&e.path.startsWith(`/setup`)?`/`:n?!0:e.path.startsWith(`/setup`)?e.path===`/setup`?!0:t?.need_database?e.path===`/setup/database`?!0:`/setup/database`:t?.need_users?e.path===`/setup/user`?!0:`/setup/user`:!0:`/setup`};function $e(e,t={}){let n=[];for(let[r,i]of Object.entries(e)){if(t.exclude?.some(e=>typeof e==`string`?r.includes(e):e.test(r)))continue;let e=r.replace(/\.vue$/,``).split(`/`).filter(e=>e&&!e.startsWith(`.`)).map(e=>{let t=e;return t.startsWith(`[`)&&t.endsWith(`]`)&&(t=`:`+t.slice(1,-1)),t});t.strip?.length&&(e=e.filter(e=>!t.strip.some(t=>typeof t==`string`?e===t:t.test(e))));let a=e.join(`/`).replace(/index$/,``);t.prefix&&(a=t.prefix+`/`+a),a.startsWith(`/`)||(a=`/`+a),a.endsWith(`/`)&&(a=a.slice(0,-1));let o={path:a,component:i,beforeEnter:[]};t.guards&&Array.isArray(t.guards)&&(o.beforeEnter=t.guards),t.guards&&typeof t.guards==`function`&&(o.beforeEnter=t.guards(o)),n.push(o)}return t.refine&&(n=t.refine(n)),n}function et(){let e=import.meta.env.SSR,t=m({history:e?p():h(),routes:[],scrollBehavior(e,t,n){return n||{top:0}}});return t.beforeEach(Qe),t.auto=(e,n={})=>{let r=$e(e,n);return r.forEach(e=>t.addRoute(e)),r},t}var tt=class{static __container_entry_key=`ToastService`;success(e,t){console.log(`Success:`,e,t)}error(e,t){console.error(`Error:`,e,t)}};const nt=new WeakMap,rt=(...e)=>{let t=e[0],n=_()?.proxy??ee();if(n==null&&!te())throw Error(`injectLocal must be called in setup`);return n&&nt.has(n)&&t in nt.get(n)?nt.get(n)[t]:ne(...e)},V=typeof window<`u`&&typeof document<`u`;typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope;const it=Object.prototype.toString,at=e=>it.call(e)===`[object Object]`,ot=()=>{};function st(e,t){function n(...n){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,n),{fn:t,thisArg:this,args:n})).then(r).catch(i)})}return n}const ct=e=>e();function lt(e,t={}){let n,r,i=ot,a=e=>{clearTimeout(e),i(),i=ot},o;return s=>{let c=S(e),l=S(t.maxWait);return n&&a(n),c<=0||l!==void 0&&l<=0?(r&&=(a(r),void 0),Promise.resolve(s())):new Promise((e,u)=>{i=t.rejectOnCancel?u:e,o=s,l&&!r&&(r=setTimeout(()=>{n&&a(n),r=void 0,e(o())},l)),n=setTimeout(()=>{r&&a(r),r=void 0,e(s())},c)})}}function ut(e,t){if(typeof e==`number`)return e+t;let n=e.match(/^-?\d+\.?\d*/)?.[0]||``,r=e.slice(n.length),i=Number.parseFloat(n)+t;return Number.isNaN(i)?e:i+r}function H(e){return e.endsWith(`rem`)?Number.parseFloat(e)*16:Number.parseFloat(e)}function dt(e){return Array.isArray(e)?e:[e]}function ft(e){return e||_()}function pt(e,t,n={}){let{eventFilter:r=ct,...i}=n;return C(e,st(r,t),i)}function mt(e,t=!0,n){ft(n)?ie(e,n):t?e():re(e)}function ht(e,t,n={}){let{debounce:r=0,maxWait:i=void 0,...a}=n;return pt(e,t,{...a,eventFilter:lt(r,{maxWait:i})})}function gt(e,t,n){return C(e,t,{...n,immediate:!0})}const _t=V?window:void 0;V&&window.document,V&&window.navigator,V&&window.location;function vt(e){let t=S(e);return t?.$el??t}function yt(...e){let t=(e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)),n=g(()=>{let t=dt(S(e[0])).filter(e=>e!=null);return t.every(e=>typeof e!=`string`)?t:void 0});return gt(()=>[n.value?.map(e=>vt(e))??[_t].filter(e=>e!=null),dt(S(n.value?e[1]:e[0])),dt(oe(n.value?e[2]:e[1])),S(n.value?e[3]:e[2])],([e,n,r,i],a,o)=>{if(!e?.length||!n?.length||!r?.length)return;let s=at(i)?{...i}:i,c=e.flatMap(e=>n.flatMap(n=>r.map(r=>t(e,n,r,s))));o(()=>{c.forEach(e=>e())})},{flush:`post`})}function bt(){let e=b(!1),t=_();return t&&ie(()=>{e.value=!0},t),e}function xt(e){let t=bt();return g(()=>(t.value,!!e()))}const St=Symbol(`vueuse-ssr-width`);function Ct(){let e=te()?rt(St,null):null;return typeof e==`number`?e:void 0}function U(e,t={}){let{window:n=_t,ssrWidth:r=Ct()}=t,i=xt(()=>n&&`matchMedia`in n&&typeof n.matchMedia==`function`),a=b(typeof r==`number`),o=b(),s=b(!1);return se(()=>{if(a.value){a.value=!i.value,s.value=S(e).split(`,`).some(e=>{let t=e.includes(`not all`),n=e.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),i=e.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),a=!!(n||i);return n&&a&&(a=r>=H(n[1])),i&&a&&(a=r<=H(i[1])),t?!a:a});return}i.value&&(o.value=n.matchMedia(S(e)),s.value=o.value.matches)}),yt(o,`change`,e=>{s.value=e.matches},{passive:!0}),g(()=>s.value)}const wt={sm:640,md:768,lg:1024,xl:1280,"2xl":1536};function Tt(e,t={}){function n(t,n){let r=S(e[S(t)]);return n!=null&&(r=ut(r,n)),typeof r==`number`&&(r=`${r}px`),r}let{window:r=_t,strategy:i=`min-width`,ssrWidth:a=Ct()}=t,o=typeof a==`number`,s=o?b(!1):{value:!0};o&&mt(()=>s.value=!!r);function c(e,t){return!s.value&&o?e===`min`?a>=H(t):a<=H(t):r?r.matchMedia(`(${e}-width: ${t})`).matches:!1}let l=e=>U(()=>`(min-width: ${n(e)})`,t),u=e=>U(()=>`(max-width: ${n(e)})`,t),d=Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>i===`min-width`?l(t):u(t),enumerable:!0,configurable:!0}),e),{});function f(){let t=Object.keys(e).map(e=>[e,d[e],H(n(e))]).sort((e,t)=>e[2]-t[2]);return g(()=>t.filter(([,e])=>e.value).map(([e])=>e))}return Object.assign(d,{greaterOrEqual:l,smallerOrEqual:u,greater(e){return U(()=>`(min-width: ${n(e,.1)})`,t)},smaller(e){return U(()=>`(max-width: ${n(e,-.1)})`,t)},between(e,r){return U(()=>`(min-width: ${n(e)}) and (max-width: ${n(r,-.1)})`,t)},isGreater(e){return c(`min`,n(e,.1))},isGreaterOrEqual(e){return c(`min`,n(e))},isSmaller(e){return c(`max`,n(e,-.1))},isSmallerOrEqual(e){return c(`max`,n(e))},isInBetween(e,t){return c(`min`,n(e))&&c(`max`,n(t,-.1))},current:f,active(){let e=f();return g(()=>e.value.length===0?``:e.value.at(i===`min-width`?-1:0))}})}function Et(){return Tt(wt)}function W(e){let t=/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*[\d.]+)?\)/.exec(e);if(!t)throw Error(`Invalid RGB color format: `+e);return{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3])}}function G(e){let t=/rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\d.]+)\)/.exec(e);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:parseFloat(t[4])}:{...W(e),a:1}}function Dt(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)throw Error(`Invalid HEX color format: `+e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}}function K(e){let t=/hsla?\((\d+),\s*(\d+)%,\s*(\d+)%(?:,\s*[\d.]+)?\)/.exec(e);if(!t)throw Error(`Invalid HSL color format: `+e);let n=parseInt(t[1])/360,r=parseInt(t[2])/100,i=parseInt(t[3])/100,a,o,s;if(r===0)a=o=s=i;else{let e=(e,t,n)=>(n<0&&(n+=1),n>1&&--n,n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e),t=i<.5?i*(1+r):i+r-i*r,c=2*i-t;a=e(c,t,n+1/3),o=e(c,t,n),s=e(c,t,n-1/3)}return{r:Math.round(a*255),g:Math.round(o*255),b:Math.round(s*255)}}function q(e,t,n){e/=255,t/=255,n/=255;let r=Math.max(e,t,n),i=Math.min(e,t,n),a=(r+i)/2;if(r===i)return{h:0,s:0,l:Math.round(a*100)};let o=r-i,s=a>.5?o/(2-r-i):o/(r+i),c=0;switch(r){case e:c=((t-n)/o+(t<n?6:0))*60;break;case t:c=((n-e)/o+2)*60;break;case n:c=((e-t)/o+4)*60;break}return{h:Math.round(c),s:Math.round(s*100),l:Math.round(a*100)}}function J(e,t,n){let r=e=>{let t=e.toString(16);return t.length===1?`0`+t:t};return`#${r(e)}${r(t)}${r(n)}`}function Ot(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function kt(e){let t=/oklch\(([\d.]+)\s+([\d.]+)\s+([\d.]+)\)/.exec(e);if(!t)throw Error(`Invalid OKLCH color format: `+e);return{l:parseFloat(t[1]),c:parseFloat(t[2]),h:parseFloat(t[3])}}function At(e){let{l:t,c:n,h:r}=kt(e),i=r*Math.PI/180,a=n*Math.cos(i),o=n*Math.sin(i),s=t+.3963377774*a+.2158037573*o,c=t-.1055613458*a-.0638541728*o,l=t-.0894841775*a-1.291485548*o,u=s*s*s,d=c*c*c,f=l*l*l,p=4.0767416621*u-3.3077115913*d+.2309699292*f,m=-1.2684380046*u+2.6097574011*d-.3413193965*f,h=-.0041960863*u-.7034186147*d+1.707614701*f,g=e=>e>=.0031308?1.055*e**(1/2.4)-.055:12.92*e;return p=g(p),m=g(m),h=g(h),{r:Math.round(Math.max(0,Math.min(1,p))*255),g:Math.round(Math.max(0,Math.min(1,m))*255),b:Math.round(Math.max(0,Math.min(1,h))*255)}}function Y(e,t,n){e/=255,t/=255,n/=255;let r=e=>e>=.04045?((e+.055)/1.055)**2.4:e/12.92;e=r(e),t=r(t),n=r(n);let i=.4122214708*e+.5363325363*t+.0514459929*n,a=.2119034982*e+.6806995451*t+.1073969566*n,o=.0883024619*e+.2817188376*t+.6299787005*n,s=Math.cbrt(i),c=Math.cbrt(a),l=Math.cbrt(o),u=.2104542553*s+.793617785*c-.0040720468*l,d=1.9779984951*s-2.428592205*c+.4505937099*l,f=.0259040371*s+.7827717662*c-.808675766*l,p=Math.sqrt(d*d+f*f),m=180/Math.PI*Math.atan2(f,d);return m<0&&(m+=360),{l:Math.round(u*1e3)/1e3,c:Math.round(p*1e3)/1e3,h:Math.round(m*1e3)/1e3}}function X(e){let t=v(e)?e:y(S(e));return g({get(){return t.value?t.value.startsWith(`#`)?`hex`:/^rgba/.test(t.value)?`rgba`:/^rgb/.test(t.value)?`rgb`:/^oklch/.test(t.value)?`oklch`:/^hsla/.test(t.value)?`hsla`:/^hsl/.test(t.value)?`hsl`:`unknown`:null},set(e){if(!t.value||!e)return;let n=Z(t).value;if(n){if(e===`hex`){t.value=J(n.r,n.g,n.b);return}if(e===`rgb`){t.value=`rgb(${n.r}, ${n.g}, ${n.b})`;return}if(e===`rgba`){t.value=`rgba(${n.r}, ${n.g}, ${n.b}, 1)`;return}if(e===`hsl`){let e=q(n.r,n.g,n.b);t.value=`hsl(${e.h}, ${e.s}%, ${e.l}%)`;return}if(e===`hsla`){let e=q(n.r,n.g,n.b);t.value=`hsla(${e.h}, ${e.s}%, ${e.l}%)`;return}if(e===`oklch`){let e=Y(n.r,n.g,n.b);t.value=`oklch(${e.l} ${e.c} ${e.h})`;return}}}})}function Z(e){let t=v(e)?e:y(S(e)),n=X(t);return g({get(){if(!t.value)return null;if(n.value===`rgba`){let e=G(t.value);return{r:e.r,g:e.g,b:e.b}}return n.value===`rgb`?W(t.value):n.value===`hex`&&t.value.length===7?Dt(t.value):n.value===`hsl`?K(t.value):n.value===`oklch`?At(t.value):null},set(){if(t.value){if(n.value===`rgb`){let e=W(t.value);t.value=`rgb(${e.r}, ${e.g}, ${e.b})`}if(n.value===`rgba`){let e=G(t.value);t.value=`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}}}})}function jt(e){let t=v(e)?e:y(S(e)),n=X(t),r=Z(t);return g({get(){return r.value?n.value===`rgba`?G(t.value):{...r.value,a:1}:null},set(e){if(!(!e||!t.value)){if(n.value===`rgba`){t.value=`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`;return}if(n.value===`rgb`){t.value=`rgb(${e.r}, ${e.g}, ${e.b})`;return}}}})}function Mt(e){let t=v(e)?e:y(S(e)),n=X(t),r=Z(t);return g({get(){return r.value?q(r.value.r,r.value.g,r.value.b):null},set(e){if(!(!e||!t.value)){if(n.value===`hsl`){t.value=`hsl(${e.h}, ${e.s}%, ${e.l}%)`;return}if(n.value===`hsla`){t.value=`hsla(${e.h}, ${e.s}%, ${e.l}%)`;return}if(n.value===`hex`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=J(n.r,n.g,n.b);return}if(n.value===`rgba`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=`rgba(${n.r}, ${n.g}, ${n.b}, 1)`;return}if(n.value===`rgb`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=`rgb(${n.r}, ${n.g}, ${n.b})`;return}if(n.value===`oklch`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`),r=Y(n.r,n.g,n.b);t.value=`oklch(${r.l} ${r.c} ${r.h})`;return}}}})}function Nt(e){let t=v(e)?e:y(S(e)),n=X(t),r=Z(t);return g({get(){return r.value?J(r.value.r,r.value.g,r.value.b):null},set(e){if(e&&n.value===`hex`){t.value=e.startsWith(`#`)?e:`#${e}`;return}}})}function Pt(e){let t=v(e)?e:y(S(e)),n=X(t),r=Nt(t),i=Z(t),a=jt(t);return{type:n,color:t,hex:r,rgb:i,hsl:Mt(t),oklch:g({get(){return i.value?Y(i.value.r,i.value.g,i.value.b):null},set(e){if(!e)return;if(n.value===`oklch`){t.value=`oklch(${e.l} ${e.c} ${e.h})`;return}let r=At(`oklch(${e.l} ${e.c} ${e.h})`);if(n.value===`hex`){t.value=J(r.r,r.g,r.b);return}if(n.value===`rgb`){t.value=`rgb(${r.r}, ${r.g}, ${r.b})`;return}}}),rgba:a}}const Ft=Symbol(`dashboard`);function It(e){ae(Ft,e)}function Lt(){let e=ne(Ft);if(!e)throw Error(`useDashboard must be used inside a component that calls provideDashboard`);return e}const Rt=Symbol(`dashboard-widget`);function zt(e){ae(Rt,e)}function Bt(){let e=ne(Rt);if(!e)throw Error(`useDashboardWidget must be used inside a component that calls provideDashboardWidget`);return e}function Vt(e,t){let n=E.get(`state`),r=n[e];!r&&t?.default!==void 0&&(r=t.default()),r&&t?.transform&&(r=t.transform(r));let i=y(r),a=t=>{n[e]=t,E.set(`state`,n)};return C(i,a,{deep:!0}),g({get:()=>i.value,set:e=>{i.value=e,a(e)}})}const Ht=new Set;function Ut(e,t={}){let n=t.key||e,r=Vt(n,{default:()=>({items:[],page:1,total:0,total_pages:1})}),i=y(!1),a=x(t.page||1),o=x(t.query||{}),s=x(t.limit||10),c=x(t.orderBy||null),l=x(t.orderDirection||null),u=g(()=>r.value.total),d=g(()=>r.value.total_pages),f=g(()=>{let e=Array.isArray(r.value.items)?r.value.items:[];return t.refine&&(e=t.refine(e)),t.serialize?e.map(e=>t.serialize(e)):e});async function p(){if(i.value)return;i.value=!0;let t=JSON.parse(JSON.stringify({...o.value,page:a.value,limit:s.value,orderBy:c.value?c.value:void 0,orderDirection:l.value?l.value:void 0})),[n,u]=await D.try(e,{method:`GET`,query:t});if(n){i.value=!1,console.error(n);return}if(r.value=u,import.meta.env.SSR){i.value=!1;return}await new Promise(e=>setTimeout(e,800)),i.value=!1}async function m(){if(a.value===1){await p();return}a.value=1}function h(e,t){JSON.stringify(e)!==JSON.stringify(t)&&m()}C([a,s],p),C([c,l],m,{deep:!0}),ht(()=>JSON.parse(JSON.stringify(o.value)),h,{debounce:t.debounce||1e3});async function _(){if(!Ht.has(n)&&f.value.length){Ht.add(n);return}Ht.add(n),await p()}return{page:a,limit:s,orderBy:c,orderDirection:l,total:u,totalPages:d,items:f,loading:i,load:p,reset:m,query:o,hydrate:_}}const Wt=Kt,Gt=ce;function Kt(e,t={}){return le({...t,validationSchema:ce(e)})}const qt=`unhead-vue`,Jt=E.proxy(qt),Yt=(...e)=>Jt.useHead(...e),Xt=globalThis,Q=Xt.layout||new qe;Xt.layout=Q;function Zt(){let e=y(Q.getOptions()),t=()=>{e.value=Q.getOptions()};return B.on(`layout:change`,t),B.on(`layout:set-options`,t),e}function Qt(e=!1,t){let n=y(e),r=y(t?.timeout??500);function i(e){n.value=e}let a=g({get(){return n.value},set(e){if(e){n.value=!0;return}setTimeout(()=>i(!1),r.value)}});return Object.assign(a,{set:i})}const $=y(new Map);function en(){function e(...e){e.forEach(e=>{e.layout||=`admin`,$.value.set(e.id,e)})}function t(e){typeof e==`string`&&$.value.delete(e)}function n(e){Array.from($.value.values()).filter(t=>t.group===e||t.parent===e).forEach(e=>$.value.delete(e.id))}function r(e){e.forEach(e=>t(e))}function i(e){e.forEach(e=>n(e))}function a(){$.value.clear()}return{items:g(()=>Array.from($.value.values())),add:e,remove:t,removeGroup:n,removeMany:r,removeManyGroup:i,clear:a}}const tn=E.proxy(`route`),nn=E.proxy(`router`),rn=(e,t,n)=>ue(e,t,{route:tn,router:nn,...n}),an=E.proxy(_e);var on=class{static __container_entry_key=`DashboardWidgetRegistry`;definitions=new Map;register(...e){for(let t of e)this.definitions.set(t.id,t)}get(e){return this.definitions.get(e)||null}list(){return Array.from(this.definitions.values())}};const sn=E.proxy(on),cn=E.proxy(Je),ln=E.proxy(M),un=E.proxy(Ze),dn=E.proxy(tt),fn=`vee-validate`,pn=E.proxy(fn),mn=`Vue`,hn=E.proxy(`Vue`),gn=`VueRouter`,_n=E.proxy(gn);var vn=class{id;name;definition_id;columns;rows;x;y;order;options;constructor(e){Object.assign(this,e),this.id||=Se(),this.options||={}}},yn=class{id;name;description;icon;constructor(){this.id=``,this.name=``,this.description=``,this.icon=``}component(){return null}actions(){return[]}};const bn=80;var xn=class e{data;definition;emmitter;constructor({data:e,definition:t}){this.data=e,this.definition=t,this.emmitter=new Oe}static fromData(t){let n=sn.get(t.definition_id);return n||(n=new yn,n.name=`Unknown: ${t.definition_id}`,n.id=t.definition_id,console.warn(`DashboardWidgetDefinition not found for id: ${t.definition_id}. Using unknown definition.`)),new e({data:t,definition:n})}setEmmitter(e){this.emmitter=e}get id(){return this.data.id}get name(){return this.data.name}set name(e){this.update({name:e})}get options(){return this.data.options||{}}get definition_id(){return this.data.definition_id}component(){return this.definition.component()}actions(){return this.definition.actions()}get columns(){return this.data.columns||{}}set columns(e){let t=JSON.parse(JSON.stringify(this.data.columns||{}));Object.assign(t,e),this.update({columns:t})}get rows(){return this.data.rows||{}}set rows(e){let t=JSON.parse(JSON.stringify(this.data.rows||{}));Object.assign(t,e),this.update({rows:t})}get x(){return this.data.x||{}}set x(e){let t=JSON.parse(JSON.stringify(this.data.x||{}));Object.assign(t,e),this.update({x:t})}get y(){return this.data.y||{}}set y(e){let t=JSON.parse(JSON.stringify(this.data.y||{}));Object.assign(t,e),this.update({y:t})}get classes(){let e=new Set;return Array.from(e.values()).join(` `)}computeStyles(e){let t=new Map,n=e.breakpoint??`base`,r=this.x[n]??0,i=this.y[n]??0,a=this.columns[n]??1,o=this.rows[n]??1,s=e.contianerWidth/12;return t.set(`position`,`absolute`),t.set(`left`,`${r*s}px`),t.set(`top`,`${i*80}px`),t.set(`width`,`${a*s-10}px`),t.set(`height`,`${o*80}px`),Array.from(t.entries()).map(([e,t])=>`${e}: ${t};`).join(` `)}update(e){Object.assign(this.data,e),this.emmitter.emit(`widget:updated`,{id:this.id,data:this.data})}setOption(e,t){let n=JSON.parse(JSON.stringify(this.data.options||{}));s(n,e,t),this.update({options:n})}setX(e,t=void 0){let n=JSON.parse(JSON.stringify(this.x));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({x:n})}setY(e,t=void 0){let n=JSON.parse(JSON.stringify(this.y));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({y:n})}setColumn(e,t=void 0){let n=JSON.parse(JSON.stringify(this.columns));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({columns:n})}setRow(e,t=void 0){let n=JSON.parse(JSON.stringify(this.rows));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({rows:n})}},Sn=class{name=``;description=``;widgets=[];emmitter;containerWidth=0;constructor(){this.emmitter=new Oe}setName(e){return this.name=e,this}setDescription(e){return this.description=e,this}setContainerWidth(e){return this.containerWidth=e,this}setWidgets(e){this.widgets=[];for(let t of e){let e=xn.fromData(t);e.setEmmitter(this.emmitter),this.widgets.push(e)}return this}findLastRow(){let e=0;for(let t of this.widgets){let n=t.rows?.base??0,r=(t.y?.base??0)+n;r>e&&(e=r)}return e}addWidget(e={}){e.columns||={base:4},e.rows||={base:4},e.x||={base:0},e.y||={base:this.findLastRow()};let t=new vn(e),n=xn.fromData(t);n.setEmmitter(this.emmitter),this.widgets.push(n)}removeWidget(e){this.widgets=this.widgets.filter((t,n)=>n!==e)}removeWidgetById(e){this.widgets=this.widgets.filter(t=>t.id!==e)}updateWidget(e,t){this.widgets=this.widgets.map((n,r)=>r===e?t:n)}duplicateWidget(e){let t=JSON.parse(JSON.stringify(this.widgets[e]));[...this.widgets].splice(e+1,0,t)}},Cn=class e extends yn{static renderer;constructor(){super(),this.name=`Chart`,this.id=`chart`}static setRenderer(t){e.renderer=t}component(){return e.renderer}async chartOptions(e){return{grid:{left:`3%`,right:`4%`,bottom:`3%`,containLabel:!0},title:{text:`ECharts Getting Started Example`},tooltip:{},xAxis:{data:[`shirt`,`cardigan`,`chiffon`,`pants`,`heels`,`socks`]},yAxis:{},series:[{name:`sales`,type:`bar`,data:[5,20,36,10,10,20]}]}}},wn=class extends he(Ge){},Tn=class extends he(Ke){addPagesFolder(e,t){nn.auto(e,t)}async load(){}};function En(e,t={}){return $e(e,t)}function Dn(e){return e}function On(e){return e}const kn=D;function An(e){return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e.accept||`*/*`,n.multiple=e.multiple||!1,n.onchange=n=>{let r=n.target,i=Array.from(r.files);t(e.multiple?Array.from(i):i[0])},n.oncancel=()=>{t(e.multiple?[]:null)},n.click()})}function jn(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{e.target?.result instanceof ArrayBuffer?t(new Uint8Array(e.target.result)):n(Error(`Failed to read file as ArrayBuffer`))},r.onerror=()=>{n(r.error)},r.readAsArrayBuffer(e)})}async function Mn(e){let t=new FormData;return t.append(`file`,e.file),e.directory&&t.append(`directory`,e.directory),kn(`/api/drives/${e.driveId}/upload`,{method:`POST`,body:t,query:{directory:e.directory}})}const Nn={pick:An,upload:Mn,toUint8Array:jn};function Pn(e){let t=e;for(let[e,n]of Object.entries(tn.params)){let r=`:${e}`;t=t.replace(r,String(n))}return t}const Fn=t;function In(...e){return fe(e)}function Ln(...e){return de(e)}function Rn(...e){return fe(de(e))}function zn(e){let t=e.exclude||[`/auth/login`,`/auth/register`];return n=>{if(!an.user&&!t.includes(n.path))return typeof e.redirect==`function`?e.redirect(n):e.redirect}}const Bn=zn({redirect:e=>`/auth/login?redirect=`+encodeURIComponent(e.fullPath)});function Vn(e){return()=>{if(an.user)return e.redirect}}const Hn=Vn({redirect:`/`});export{kn as $fetch,Nn as $file,Fn as $toast,_e as AuthService,bn as DASHBOARD_ROW_HEIGHT,Sn as Dashboard,xn as DashboardWidget,vn as DashboardWidgetData,yn as DashboardWidgetDefinition,Cn as DashboardWidgetDefinitionChart,on as DashboardWidgetRegistry,ve as FetchBrowserService,De as FetchNodeService,T as FetchService,qe as LayoutService,Je as LifecycleService,Ye as MenuItemEntity,Ze as MenuService,wn as ModuleEntity,Tn as PluginEntity,tt as ToastService,qt as UNHEAD_VUE_CONTAINER_KEY,fn as VEE_VALIDATE_CONTAINER_KEY,mn as VUE_CONTAINER_KEY,gn as VUE_ROUTER_CONTAINER_KEY,Xe as acl,an as auth,Bn as authGuard,$e as auto,En as autoRoutes,Ln as clsx,Rn as cn,we as config,E as container,zn as createAuthGuard,Vn as createGuestGuard,Se as createId,et as createRouter,sn as dashboardRegistry,Dn as defineColumns,On as defineFormFields,B as emmitter,W as extracRGB,kt as extractOKLCH,G as extractRGBA,D as fetcher,Hn as guestGuard,Dt as hexToRGB,K as hslToRgb,Q as layout,cn as lifecycle,ln as logger,un as menu,At as oklchToRgb,Pn as parseTo,It as provideDashboard,zt as provideDashboardWidget,J as rgbToHex,q as rgbToHsl,Y as rgbToOklch,Ot as rgbaToString,tn as route,nn as router,Qe as setupGuard,Gt as toTypedSchema,dn as toast,In as twMerge,Jt as unheadVue,Et as useBreakpoints,Pt as useColor,X as useColorType,Lt as useDashboard,Bt as useDashboardWidget,Ut as useFetchPagination,Wt as useForm,Mt as useHSL,Yt as useHead,Nt as useHex,Zt as useLayoutOptions,Qt as useLoading,en as useMenu,Z as useRGB,jt as useRGBA,rn as useRouteQuery,Vt as useState,Kt as useValibotForm,pn as veeValidate,hn as vue,_n as vueRouter};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiJGZldGNoIiwiQ29ra2llTWFwRW50aXR5IiwiTGlmZWN5Y2xlU2VydmljZSIsIlBlcm1pc3Npb24iLCJzdWJqZWN0IiwiY3JlYXRlU3ViamVjdCIsIkJhc2VFbnRpdHlNaXhpbiIsIkJhc2VFbnRpdHlNaXhpbiIsIkJhc2VFbnRpdHlNaXhpbiIsIk1vZHVsZSIsIlBsdWdpbkVudGl0eSIsIkJhc2VMaWZlY3ljbGVTZXJ2aWNlIiwiY3JlYXRlVnVlUm91dGVyIiwidXNlQnJlYWtwb2ludHMiLCJjb3JlVXNlQnJlYWtwb2ludHMiLCJkaSIsIiRmZXRjaCIsInZlZVZhbGlkYXRlVG9UeXBlZFNjaGVtYSIsInVzZVZlZVZhbGlkYXRlRm9ybSIsIkxheW91dE1hbmFnZXIiLCJ2dWVVc2VyUm91dGVRdWVyeSIsIkJhc2UiLCJCYXNlIiwiJG9yaWdpbmFsIiwidG9hc3QiLCJvcmlnaW5hbFR3TWVyZ2UiLCJvcmlnaW5hbENsc3giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GZXRjaFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvZmV0Y2hlci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvY29tcG9zZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9BdXRoU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvRmV0Y2hCcm93c2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mbGF0dGVuLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jcmVhdGVJZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb25maWcudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoTm9kZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy91cmxWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMva2V5VmFsdWVWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvcGFnaW5hdGlvblZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy9pbmRleC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVmFsaWRhdG9yU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvZGFzaGJvYXJkTWV0YVNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy91c2VyU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUGVybWlzc2lvbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQWNsRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlTWV0YUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZVVwbG9hZFNlc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUm9sZUVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9lbW1pdHRlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGF5b3V0U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvTWVudUl0ZW1FbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvYWNsLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9NZW51U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZ3VhcmRzL3NldHVwR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1RvYXN0U2VydmljZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL3NoYXJlZC9kaXN0L2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWV1c2UvY29yZS9kaXN0L2luZGV4LmpzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VCcmVha3BvaW50LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VDb2xvci50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlRGFzaGJvYXJkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VEYXNoYm9hcmRXaWRnZXQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2NvbXBvc2FibGVzL3VzZVN0YXRlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VGZXRjaFBhZ2luYXRpb24udHMiLCIuLi8uLi9zcmMvY2xpZW50L2NvbXBvc2FibGVzL3VzZUZvcm0udHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvdW5oZWFkVnVlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VIZWFkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2xheW91dC50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlTGF5b3V0T3B0aW9ucy50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlTG9hZGluZy50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlTWVudS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9yb3V0ZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9yb3V0ZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L2NvbXBvc2FibGVzL3VzZVJvdXRlUXVlcnkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvYXV0aC50cyIsIi4uLy4uL3NyYy9jbGllbnQvcmVnaXN0cnkvRGFzaGJvYXJkV2lkZ2V0UmVnaXN0cnkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvZGFzaGJvYXJkUmVnaXN0cnkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvbGlmZWN5Y2xlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2xvZ2dlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9tZW51LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3RvYXN0LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3ZlZVZhbGlkYXRlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3Z1ZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy92dWVSb3V0ZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldERhdGEudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldERlZmluaXRpb24udHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldC50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvRGFzaGJvYXJkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9EYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uQ2hhcnQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC91dGlscy9hdXRvUGFnZXMudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2RlZmluZUNvbHVtbnMudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2RlZmluZUZvcm1GaWVsZHMudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2ZldGNoZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2ZpbGUudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL3BhcnNlVG8udHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL3RvYXN0LnRzIiwiLi4vLi4vc3JjL2NsaWVudC91dGlscy90d01lcmdlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvYXV0aEd1YXJkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvZ3Vlc3RHdWFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbnRlcmZhY2UgVHJ5ZXIge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IGFueVxufVxuXG5pbnRlcmZhY2UgVHJ5ZXJBc3luYyB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxhbnk+IHwgYW55XG59XG5cbnR5cGUgVHJ5Q2F0Y2hSZXN1bHQ8VCBleHRlbmRzIFRyeWVyPiA9IFtudWxsLCBSZXR1cm5UeXBlPFQ+XSB8IFtFcnJvciwgbnVsbF1cblxudHlwZSBUcnlDYXRjaEFzeW5jUmVzdWx0PFQgZXh0ZW5kcyBUcnllckFzeW5jPiA9IFtudWxsLCBBd2FpdGVkPFJldHVyblR5cGU8VD4+XSB8IFtFcnJvciwgbnVsbF1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyeUNhdGNoPFQgZXh0ZW5kcyBUcnllckFzeW5jPih0cnllcjogVCk6IFByb21pc2U8VHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUPj4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuXG50cnlDYXRjaC5zeW5jID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBUcnllcj4odHJ5ZXI6IFQpOiBUcnlDYXRjaFJlc3VsdDxUPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0b2FzdCB9IGZyb20gJ3Z1ZS1zb25uZXInXG5pbXBvcnQgcXMgZnJvbSAncXMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hPcHRpb25zIGV4dGVuZHMgUmVxdWVzdEluaXQge1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PlxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRmV0Y2hTZXJ2aWNlJ1xuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUVycm9yKHJlc3BvbnNlOiBSZXNwb25zZSkge1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnanNvbicpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+ICh7IG1lc3NhZ2U6ICR0KCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKSB9KSlcblxuICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRvYXN0LmVycm9yKGRhdGEubWVzc2FnZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgfVxuXG4gICAgICAgIHRvYXN0LmVycm9yKCR0KCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKSlcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogJHQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpLFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkVXJsKHVybDogc3RyaW5nLCBxdWVyeT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHFzLnN0cmluZ2lmeShxdWVyeSwgeyBhcnJheUZvcm1hdDogJ2JyYWNrZXRzJyB9KVxuXG4gICAgICAgIHJldHVybiB1cmwgKyAnPycgKyBxdWVyeVN0cmluZ1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZFJlcXVlc3RJbml0KG9wdGlvbnM6IEZldGNoT3B0aW9ucyk6IFJlcXVlc3RJbml0IHtcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHsgLi4ub3B0aW9ucyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAuLi5mZXRjaE9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZldGNoT3B0aW9uc1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBwYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnanNvbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpIGFzIFByb21pc2U8VD5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCkgYXMgUHJvbWlzZTxUPlxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaDxUPihfdXJsOiBzdHJpbmcsIF9vcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0cnk8VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cnlDYXRjaCgoKSA9PiB0aGlzLmZldGNoPFQ+KHVybCwgb3B0aW9ucykpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcG9zdDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHB1dDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlPFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHN0YXR1czogbnVtYmVyID0gNTAwXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyID0gNTAwKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubmFtZSA9ICdCYXNlRXhjZXB0aW9uJ1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1c1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUVycm9yKGVycm9yOiBFcnJvcik6IEJhc2VFeGNlcHRpb24ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VFeGNlcHRpb24oZXJyb3IubWVzc2FnZSwgNTAwKVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gXCIjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50c1wiXG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IG9iamVjdD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5cbnR5cGUgRW50cnlLZXkgPSBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RvclxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb250YWluZXJTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGVudHJpZXMgPSBuZXcgTWFwPEVudHJ5S2V5LCBhbnk+KClcblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVjb3JkKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHJlY29yZFtTdHJpbmcoa2V5KV0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0S2V5KHBheWxvYWQ6IEVudHJ5S2V5KTogRW50cnlLZXkge1xuICAgICAgICBsZXQga2V5ID0gcGF5bG9hZFxuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGtleSA9IHBheWxvYWQubmFtZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNDb25zdHJ1Y3RvciA9IHR5cGVvZiBwYXlsb2FkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcGF5bG9hZCAhPT0gJ3N5bWJvbCdcblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAhKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgV2FybmluZzogVGhlIGNvbnN0cnVjdG9yICR7cGF5bG9hZC5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIuIENvbnNpZGVyIGFkZGluZyBhIHN0YXRpYyBwcm9wZXJ0eSBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgdG8gYXZvaWQgcG90ZW50aWFsIGNvbmZsaWN0cy5gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGtleSA9IChwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ga2V5XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KHBheWxvYWQ6IEVudHJ5S2V5LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHZhbHVlKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwYXlsb2FkOiBFbnRyeUtleSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuaGFzKGtleSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHBheWxvYWQ6IEVudHJ5S2V5KTogVCB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBFbnRyeSB3aXRoIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgbm90IGZvdW5kIGluIGNvbnRhaW5lci5gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZXQocGF5bG9hZDogRW50cnlLZXkpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2luZ2xldG9uPFQ+KGNsYXNzQ29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+KTogVCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGNsYXNzQ29uc3RydWN0b3IubmFtZVxuICAgICAgICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGV4aXN0aW5nSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0luc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyBjbGFzc0NvbnN0cnVjdG9yKClcbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIG5ld0luc3RhbmNlKVxuICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2VcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChlbnRyaWVzOiBSZWNvcmQ8YW55LCBhbnk+KTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHk8VCA9IHVua25vd24+KGtleTogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQ8VD4oa2V5KSBhcyBhbnlcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVudHJ5W3Byb3BdXG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGVudHJ5KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeVtwcm9wXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogKF90YXJnZXQsIHByb3AsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgZW50cnlbcHJvcF0gPSB2YWx1ZVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkgYXMgVFxuICAgIH1cblxuICAgIHB1YmxpYyBrZXlzKCk6IEVudHJ5S2V5W10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMua2V5cygpKVxuICAgIH1cbn1cbiIsImltcG9ydCBDb250YWluZXJTZXJ2aWNlIGZyb20gXCIjc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHNcIjtcblxuY29uc3QgY29udGFpbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5jbGllbnRDb250YWluZXIgfHwgbmV3IENvbnRhaW5lclNlcnZpY2UoKVxuXG5nbG9iYWxUaGlzLmNsaWVudENvbnRhaW5lciA9IGNvbnRhaW5lclxuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXIgYXMgQ29udGFpbmVyU2VydmljZVxuIiwiaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGZldGNoZXIgPSBjb250YWluZXIucHJveHk8RmV0Y2hTZXJ2aWNlPihGZXRjaFNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGZldGNoZXJcbiIsImltcG9ydCB0eXBlIHsgVW5pb25Ub0ludGVyc2VjdGlvbiB9IGZyb20gJy4vdHlwaW5nLnRzJ1xuXG5leHBvcnQgdHlwZSBBbnlDbGFzcyA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueVxuZXhwb3J0IHR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcbmV4cG9ydCB0eXBlIE1peGluPFQ+ID0gKGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3RvcjxUPlxuXG4vKipcbiAqIENvbXBvc2VzIG11bHRpcGxlIG1peGlucyBpbnRvIGEgc2luZ2xlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkLlxuICogQWxsb3dzIGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS1saWtlIGJlaGF2aW9yIGJ5IGFwcGx5aW5nIG1peGlucyBzZXF1ZW50aWFsbHkuXG4gKiBcbiAqIEBwYXJhbSBtaXhpbnMgLSBBcnJheSBvZiBtaXhpbiBmdW5jdGlvbnMgdG8gY29tcG9zZVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGluY2x1ZGVzIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZShUaW1lc3RhbXAsIFNvZnREZWxldGUpIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICogICAgIHN1cGVyKClcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlPFxuICAgIE0gZXh0ZW5kcyBBcnJheTwoYmFzZTogQ29uc3RydWN0b3I8YW55PikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oLi4ubWl4aW5zOiBNKTogVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBjbGFzcyB7fSBhcyBhbnkpIGFzIGFueVxufVxuXG4vKipcbiAqIEFsdGVybmF0aXZlIGNvbXBvc2UgZnVuY3Rpb24gdGhhdCBzdGFydHMgd2l0aCBhIGJhc2UgY2xhc3NcbiAqIFxuICogQHBhcmFtIGJhc2VDbGFzcyAtIFRoZSBiYXNlIGNsYXNzIHRvIHN0YXJ0IHdpdGhcbiAqIEBwYXJhbSBtaXhpbnMgLSBBcnJheSBvZiBtaXhpbiBmdW5jdGlvbnMgdG8gYXBwbHlcbiAqIEByZXR1cm5zIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBleHRlbmRzIHRoZSBiYXNlIGNsYXNzIHdpdGggYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlV2l0aChCYXNlRW50aXR5LCBUaW1lc3RhbXAsIFNvZnREZWxldGUpIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICogICAgIHN1cGVyKClcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlV2l0aDxcbiAgICBUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yLFxuICAgIE0gZXh0ZW5kcyBBcnJheTwoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPGFueT4+XG4+KFxuICAgIGJhc2VDbGFzczogVEJhc2UsXG4gICAgLi4ubWl4aW5zOiBNXG4pOiBUQmFzZSAmIFVuaW9uVG9JbnRlcnNlY3Rpb248UmV0dXJuVHlwZTxNW251bWJlcl0+PiB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKGJhc2UsIG1peGluKSA9PiBtaXhpbihiYXNlKSwgYmFzZUNsYXNzIGFzIGFueSkgYXMgYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXhpbjxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihTb3VyY2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIDxUVGFyZ2V0IGV4dGVuZHMgQ29uc3RydWN0b3I+KFRhcmdldDogVFRhcmdldCkge1xuICAgICAgICBjbGFzcyBNaXhlZCBleHRlbmRzIFRhcmdldCB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZSguLi5hcmdzKVxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgc291cmNlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29weSBtZXRob2RzXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhTb3VyY2UucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgTWl4ZWQucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU291cmNlLnByb3RvdHlwZSwga2V5KSFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gTWl4ZWQgYXMgVFRhcmdldCAmIFRCYXNlXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuaW50ZXJmYWNlIENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zIHtcbiAgICBwYXJzZT86IChkYXRhOiBhbnkpID0+IGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmFzZUVudGl0eShvcHRpb25zOiBDcmVhdGVCYXNlRW50aXR5T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29udHJ1Y3RvcigpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IC4uLmRhdGEgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG9wdGlvbnMucGFyc2UoZGF0YSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBCYXNlRW50aXR5PFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBCYXNlKSBhcyBhbnlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29udHJ1Y3RvcigpIGFzIGFueVxuXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udHJ1Y3Rvcj8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKGNvbnRydWN0b3IgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzIGFzIGFueSk/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9ICh0aGlzIGFzIGFueSkucGFyc2UoZGF0YSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG1lcmdlKGRhdGE6IFBhcnRpYWw8dGhpcz4pOiB0aGlzIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBUaW1lc3RhbXBNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGNyZWF0ZWRfYXQ6IERhdGUgfCBzdHJpbmdcbiAgICAgICAgcHVibGljIHVwZGF0ZWRfYXQ6IERhdGUgfCBzdHJpbmdcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTb2Z0RGVsZXRlTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPihiYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7XG4gICAgICAgIHB1YmxpYyBkZWxldGVkX2F0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCB0eXBlIFJvbGUgZnJvbSAnLi9Sb2xlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBlbWFpbDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB1c2VybmFtZTogc3RyaW5nXG4gICAgcHVibGljIHBhc3N3b3JkPzogc3RyaW5nXG4gICAgcHVibGljIHZlcmlmaWVkX2F0PzogRGF0ZSB8IHN0cmluZyB8IG51bGxcblxuICAgIHB1YmxpYyBwZXJtaXNzaW9ucz86IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyByb2xlcz86IFJvbGVbXVxuXG4gICAgcHVibGljIGdldCBpbml0aWFscygpe1xuICAgICAgICBjb25zdCBbZmlyc3ROYW1lLCBzZWNvbmROYW1lXSA9IHRoaXMubmFtZS5zcGxpdCgnICcpXG5cbiAgICAgICAgaWYgKCFzZWNvbmROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGEgPSBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICBjb25zdCBiID0gc2Vjb25kTmFtZVswXS50b1VwcGVyQ2FzZSgpXG5cbiAgICAgICAgcmV0dXJuIGEgKyBiXG4gICAgfVxufVxuIiwiaW1wb3J0ICRmZXRjaCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvZmV0Y2hlci50cydcbmltcG9ydCBVc2VyIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS50cydcblxuaW50ZXJmYWNlIExvZ291dE9wdGlvbnMge1xuICAgIHJlZGlyZWN0Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdBdXRoU2VydmljZSdcbiAgICBwdWJsaWMgdXNlcjogVXNlciB8IG51bGxcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8QXV0aFNlcnZpY2U+ID0ge30pIHtcbiAgICAgICAgdGhpcy51c2VyID0gZGF0YS51c2VyIHx8IG51bGxcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9nb3V0KG9wdGlvbnM/OiBMb2dvdXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCAkZmV0Y2gudHJ5KCcvYXV0aC9sb2dvdXQnLCB7IG1ldGhvZDogJ1BPU1QnIH0pXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gb3B0aW9ucz8ucmVkaXJlY3QgfHwgJy8nXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGZXRjaE9wdGlvbnMgfSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBGZXRjaFNlcnZpY2UgZnJvbSAnLi9GZXRjaFNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZldGNoQnJvd3NlclNlcnZpY2UgZXh0ZW5kcyBGZXRjaFNlcnZpY2Uge1xuICAgIHB1YmxpYyBhc3luYyBmZXRjaDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgZnVsbFVybCA9IHRoaXMuYnVpbGRVcmwodXJsLCBvcHRpb25zLnF1ZXJ5KVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB0aGlzLmJ1aWxkUmVxdWVzdEluaXQob3B0aW9ucylcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZ1bGxVcmwsIGZldGNoT3B0aW9ucylcblxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG5cbiAgICAgICAgICAgIHRocm93IHJlc3VsdFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gYXdhaXQgdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlKVxuXG4gICAgICAgIHJldHVybiBwYXJzZWRcbiAgICB9XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIENvb2tpZU1hcEVudGl0eU9wdGlvbnMge1xuICAgIGNvb2tpZXM/OiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHJlZml4Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZU1hcEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29va2llTWFwRW50aXR5J1xuXG4gICAgcHVibGljIGNvb2tpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgcHJlZml4OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY29va2llcyA9IGRhdGE/LmNvb2tpZXMgfHwgbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICB0aGlzLnByZWZpeCA9IGRhdGE/LnByZWZpeCB8fCAnJ1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBNYXA8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIGlmIChjb29raWVzIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29va2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29va2llc1trZXldKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICByZXR1cm4gdGhpcy5jb29raWVzLmdldChmdWxsTmFtZSkgfHwgZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIFdlIHdhbnQgdG8gYWxsb3cgYW55IG9wdGlvbnMgdG8gYmUgcGFzc2VkIGhlcmUsIGFzIHRoZXkgbWF5IGJlIHVzZWQgYnkgdGhlIHVuZGVybHlpbmcgY29va2llXG4gICAgLy8gIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHRoaXMuY29va2llcy5zZXQoZnVsbE5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgodGhpcy5wcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5wcmVmaXhlZEtleSA9IGtleS5zbGljZSh0aGlzLnByZWZpeC5sZW5ndGgpXG5cbiAgICAgICAgICAgICAgICByZXN1bHRbdW5wcmVmaXhlZEtleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbn1cbiIsImltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4ob2JqOiBhbnksIHByZWZpeCA9ICcnLCByZXM6IGFueSA9IHt9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBjb25zdCBpc0luZGV4ID0gL15cXGQrJC8udGVzdChrZXkpXG4gICAgICAgIGNvbnN0IG5ld0tleSA9IGlzSW5kZXggPyBgJHtwcmVmaXh9WyR7a2V5fV1gIDogcHJlZml4ID8gYCR7cHJlZml4fS4ke2tleX1gIDoga2V5XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGZsYXR0ZW4odmFsdWUsIG5ld0tleSwgcmVzKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc1tuZXdLZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmZsYXR0ZW4ob2JqOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgc2V0KHJlc3VsdCwga2V5LCB2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxufVxuIiwiZnVuY3Rpb24gdXVpZCgpe1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuY3J5cHRvICYmIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGVudmlyb25tZW50cyB3aXRob3V0IGNyeXB0by5yYW5kb21VVUlEXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMFxuICAgICAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4OFxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNilcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSWQocHJlZml4ID0gJycpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgdXVpZCgpXG59IiwiaW1wb3J0IHsgZ2V0LCBzZXQsIGhhcywgdW5zZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmludGVyZmFjZSBFbnRyeSB7XG4gICAga2V5OiBzdHJpbmdcbiAgICB2YWx1ZTogYW55XG4gICAgc291cmNlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29uZmlnU2VydmljZSdcblxuICAgIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFbnRyeT5cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZVZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aCgnOmJvb2xlYW4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoJzpib29sZWFuJywgJycpLnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21FbnRyaWVzKGVudHJpZXM6IFtzdHJpbmcsIGFueV1bXSwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHJlY29yZFtrZXldID0gZW50cnkudmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWNvcmRcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhcyh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlIGFzIFRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IGVudHJ5LnZhbHVlIDogZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBnZXQodmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgZGVmYXVsdFZhbHVlKVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T25lPFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleXM6IHN0cmluZ1tdLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQ8VD4oa2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHNvdXJjZSA9ICdydW50aW1lJyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgbGV0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICh0eXBlb2YgcHJpbWFyeVZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHByaW1hcnlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHByaW1hcnlWYWx1ZSA9IHt9XG4gICAgICAgIH1cblxuICAgICAgICBzZXQocHJpbWFyeVZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIHZhbHVlKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHVuc2V0KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5VmFsdWUpIHJldHVyblxuXG4gICAgICAgIGlmICh0eXBlb2YgcHJpbWFyeVZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHByaW1hcnlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdW5zZXQocHJpbWFyeVZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6ICdydW50aW1lJyxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW50cmllcy5jbGVhcigpXG4gICAgfVxuXG4gICAgcHVibGljIGR1bXAoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuKHRoaXMudG9SZWNvcmQoKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBjb25maWcgPSBjb250YWluZXIucHJveHk8Q29uZmlnU2VydmljZT4oQ29uZmlnU2VydmljZSlcblxuaWYgKGltcG9ydC5tZXRhLmVudi5ERVYpIHtcbiAgICBnbG9iYWxUaGlzLmNvbmZpZyA9IGNvbmZpZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25maWdcbiIsImltcG9ydCBxcyBmcm9tICdxcycgXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybFBhcmFtcyhyb3V0ZVBhdGg6IHN0cmluZywgcmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICBjb25zdCByb3V0ZVNlZ21lbnRzID0gcm91dGVQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG4gICAgY29uc3QgcmVxdWVzdFNlZ21lbnRzID0gcmVxdWVzdFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVTZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSByb3V0ZVNlZ21lbnRzW2ldXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50ID0gcmVxdWVzdFNlZ21lbnRzW2ldXG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJvdXRlU2VnbWVudC5zbGljZSgxKSAvLyBSZW1vdmUgdGhlICc6JyBwcmVmaXhcbiAgICAgICAgICAgIHBhcmFtc1twYXJhbU5hbWVdID0gcmVxdWVzdFNlZ21lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQgPT09ICcqJykge1xuICAgICAgICAgICAgLy8gQ2FwdHVyZSBhbGwgcmVtYWluaW5nIHNlZ21lbnRzIGFzIGEgc2luZ2xlIHBhdGhcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1NlZ21lbnRzID0gcmVxdWVzdFNlZ21lbnRzLnNsaWNlKGkpXG4gICAgICAgICAgICBwYXJhbXNbJyonXSA9IHJlbWFpbmluZ1NlZ21lbnRzLmpvaW4oJy8nKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUXVlcnkocmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHJlcXVlc3RQYXRoLnNwbGl0KCc/JylbMV1cblxuICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5XG4gICAgfVxuXG4gICAgcmV0dXJuIHFzLnBhcnNlKHF1ZXJ5U3RyaW5nKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGZXRjaE9wdGlvbnMgfSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBGZXRjaFNlcnZpY2UgZnJvbSAnLi9GZXRjaFNlcnZpY2UudHMnXG5pbXBvcnQgQ29ra2llTWFwRW50aXR5IGZyb20gJyNzaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29uZmlnLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHsgcGFyc2VVcmxQYXJhbXMsIHBhcnNlVXJsUXVlcnkgfSBmcm9tICcjc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZldGNoTm9kZVNlcnZpY2UgZXh0ZW5kcyBGZXRjaFNlcnZpY2Uge1xuICAgIHB1YmxpYyBhc3luYyBmZXRjaDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgaXNJbnRlcm5hbCA9ICF1cmwuc3RhcnRzV2l0aCgnaHR0cDovLycpICYmICF1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKVxuXG4gICAgICAgIGlmICghaXNJbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hFeHRlcm5hbDxUPih1cmwsIG9wdGlvbnMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEludGVybmFsPFQ+KHVybCwgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZmV0Y2hFeHRlcm5hbDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgZnVsbFVybCA9IHRoaXMuYnVpbGRVcmwodXJsLCBvcHRpb25zLnF1ZXJ5KVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB0aGlzLmJ1aWxkUmVxdWVzdEluaXQob3B0aW9ucylcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZ1bGxVcmwsIGZldGNoT3B0aW9ucylcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUVycm9yKHJlc3BvbnNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBmZXRjaEludGVybmFsPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByb3V0ZXIgPSAgY29udGFpbmVyLmdldDxhbnk+KCdSb3V0ZXJTZXJ2aWNlJylcbiAgICAgICAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgJ0dFVCdcbiAgICAgICAgY29uc3Qgcm91dGUgPSByb3V0ZXIucmVzb2x2ZShtZXRob2QsIHVybClcbiAgICAgICAgY29uc3QgY29va2llID0gbmV3IENva2tpZU1hcEVudGl0eSh7XG4gICAgICAgICAgICBwcmVmaXg6IGNvbmZpZy5nZXQoJ2Nvb2tpZS5wcmVmaXgnLCAnJylcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIGlmIChjb250YWluZXIuaGFzKCdjb29raWVzJykpIHtcbiAgICAgICAgICAgIGNvb2tpZS5sb2FkKGNvbnRhaW5lci5nZXQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oJ2Nvb2tpZXMnKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcm91dGUgfHwgIXJvdXRlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGUgbm90IGZvdW5kIGZvciAke21ldGhvZH0gJHt1cmx9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJvdXRlci5leGVjdXRlKHJvdXRlLCB7XG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyc2VVcmxQYXJhbXMocm91dGUucGF0aCwgdXJsKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5IHx8IHBhcnNlVXJsUXVlcnkodXJsKSxcbiAgICAgICAgICAgIGJvZHk6IG9wdGlvbnMuZGF0YSB8fCBvcHRpb25zLmJvZHksXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZC50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgY29va2llOiBjb29raWVcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0IGFzIFByb21pc2U8VD5cbiAgICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuLy8gQHRzLW5vY2hlY2tcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTG9nZ2VyU2VydmljZScgXG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hpbGQob3B0aW9uczogYW55KTogTG9nZ2VyU2VydmljZSB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICAgICAgcmV0dXJuIG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB7IGNyZWF0ZUlkLCB0cnlDYXRjaCB9IGZyb20gJy4uL3V0aWxzL2luZGV4LnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtbWl0dGVyTGlzdGVuZXJPcHRpb25zIHtcbiAgICBldmVudDogc3RyaW5nXG59XG5leHBvcnQgaW50ZXJmYWNlIEVtbWl0dGVyTGlzdGVuZXIge1xuICAgIChkYXRhOiBhbnksIG9wdGlvbnM6IEVtbWl0dGVyTGlzdGVuZXJPcHRpb25zKTogdm9pZFxufVxuXG5pbnRlcmZhY2UgRW1taXR0ZXJIYW5kbGVyIHtcbiAgICBpZDogc3RyaW5nXG4gICAgZXZlbnQ6IHN0cmluZ1xuICAgIGxpc3RlbmVyOiBFbW1pdHRlckxpc3RlbmVyXG4gICAgb3JpZ2luYWxMaXN0ZW5lcj86IEVtbWl0dGVyTGlzdGVuZXJcbn1cblxuaW50ZXJmYWNlIE9uT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICB1bmlxdWU/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBPbkRlYm91bmNlT3B0aW9ucyBleHRlbmRzIE9uT3B0aW9ucyB7XG4gICAgZGVib3VuY2U/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlclNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtbWl0dGVyU2VydmljZTxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0VtbWl0dGVyU2VydmljZSdcblxuICAgIHB1YmxpYyBoYW5kbGVyczogRW1taXR0ZXJIYW5kbGVyW10gPSBbXVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhblxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucz8uZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zPy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1taXR0ZXIgbG9hZGVkIHdpdGggZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEVtbWl0dGVyU2VydmljZTxFdmVudHM+KG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldERlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gICAgfVxuXG4gICAgcHVibGljIG9uPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlkID0gb3B0aW9ucz8uaWQgfHwgY3JlYXRlSWQoKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy51bmlxdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuaGFuZGxlcnMuc29tZShoID0+IChoLmV2ZW50ID09PSBldmVudCAmJiBoLmxpc3RlbmVyID09PSBsaXN0ZW5lcikgfHwgaC5pZCA9PT0gaWQpXG5cbiAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXI6IEVtbWl0dGVySGFuZGxlciA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKGhhbmRsZXIpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVyIGFkZGVkJywgaGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSAoYXJnczogYW55LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGFyZ3MsIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIHRoaXMub2ZmKGV2ZW50LCB3cmFwcGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub24oZXZlbnQsIHdyYXBwZXIgYXMgYW55LCBvcHRpb25zKVxuICAgIH1cblxuXG4gICAgcHVibGljIG9uRGVib3VuY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlZCA9IGRlYm91bmNlKGxpc3RlbmVyLCBvcHRpb25zPy5kZWJvdW5jZSB8fCAzMDApXG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub24oZXZlbnQsIGRlYm91bmNlZCBhcyBhbnksIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIub3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RlbmVyXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbkFueU9mPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50czogS1tdLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJbXVxuICAgIHB1YmxpYyBvbkFueU9mKGV2ZW50czogc3RyaW5nW10sIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnM6IEVtbWl0dGVySGFuZGxlcltdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub24oZXZlbnQsIGxpc3RlbmVyIGFzIGFueSwgb3B0aW9ucylcblxuICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5wdXNoKGhhbmRsZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlcnNcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4ge1xuICAgICAgICAgICAgaWYgKGguZXZlbnQgPT09IGV2ZW50ICYmIChoLmxpc3RlbmVyID09PSBsaXN0ZW5lciB8fCBoLm9yaWdpbmFsTGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciByZW1vdmVkJywgeyBldmVudCB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogdm9pZFxuICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0cnlDYXRjaC5zeW5jKCgpID0+IGhhbmRsZXIubGlzdGVuZXIoYXJncywgeyBldmVudCB9KSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0QW5kV2FpdDxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgYXJnczogRXZlbnRzW0tdKTogUHJvbWlzZTx2b2lkPlxuICAgIHB1YmxpYyBhc3luYyBlbWl0QW5kV2FpdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogUHJvbWlzZTx2b2lkPlxuICAgIHB1YmxpYyBhc3luYyBlbWl0QW5kV2FpdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50IGFuZCB3YWl0Jywge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzOiBoYW5kbGVycy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgYXJnc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5saXN0ZW5lcihhcmdzLCB7IGV2ZW50IH0pXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0QnlFdmVudChldmVudDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUocGF5bG9hZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiAhaWRzLmluY2x1ZGVzKGguaWQpKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlcnMgcmVtb3ZlZCcsIHsgaWRzIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWxsIGhhbmRsZXJzIGNsZWFyZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0hhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggPiAwXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlSG9vayB7XG4gICAgcHVibGljIGhvb2tfaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBob29rX2FsaWFzZXM/OiBzdHJpbmdbXVxuICAgIHB1YmxpYyBvcmRlcj86IG51bWJlclxuICAgIHB1YmxpYyBzdWJob29rcz86IExpZmVjeWNsZUhvb2tbXVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgYm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSByZWdpc3RlciAqL1xuICAgIHB1YmxpYyBhc3luYyBvblJlZ2lzdGVyKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBsb2FkICovXG4gICAgcHVibGljIGFzeW5jIG9uTG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgYm9vdCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHNodXRkb3duICovXG4gICAgcHVibGljIGFzeW5jIG9uU2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnLi4vdXRpbHMvdHJ5Q2F0Y2gudHMnXG5pbXBvcnQgeyBvcmRlckJ5IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG50eXBlIExpZmVjeWNsZU1ldGhvZCA9ICdyZWdpc3RlcicgfCAnbG9hZCcgfCAnYm9vdCcgfCAnc2h1dGRvd24nXG5cbmludGVyZmFjZSBMaXN0T3B0aW9ucyB7XG4gICAgaW5jbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgZXhjbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGhvb2tzPzogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG4gICAgb25FcnJvcj86IChlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHsgaG9va0lkOiBzdHJpbmc7IG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kIH0pID0+IHZvaWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTGlmZWN5Y2xlU2VydmljZSdcblxuICAgIHB1YmxpYyBob29rczogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz5cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IExpZmVjeWNsZVNlcnZpY2VPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgPz8gdGhpcy5kZWJ1Z1xuICAgICAgICB0aGlzLmhvb2tzID0gZGF0YS5ob29rcyA/PyBuZXcgTWFwKClcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciA/PyBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgICAgIFxuICAgICAgICBpZiAoZGF0YS5vbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IgPSBkYXRhLm9uRXJyb3JcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRPbkVycm9yKGhhbmRsZXI6IFJlcXVpcmVkPExpZmVjeWNsZVNlcnZpY2VPcHRpb25zPlsnb25FcnJvciddKSB7XG4gICAgICAgIHRoaXMub25FcnJvciA9IGhhbmRsZXJcbiAgICB9XG5cblxuICAgIHB1YmxpYyBvbkVycm9yKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGNvbnRleHQgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaG9vayAke2NvbnRleHQubWV0aG9kfSAoJHtjb250ZXh0Lmhvb2tJZH0pOmAsIGVycm9yKVxuICAgIH1cblxuICAgIHB1YmxpYyBtYXBBbGlhc2VzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXVxuICAgICAgICBjb25zdCBhbGwgPSBBcnJheS5mcm9tKHRoaXMuaG9va3MudmFsdWVzKCkpXG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGFsbCkge1xuICAgICAgICAgICAgaWYgKGFyZ3MuaW5jbHVkZXMoaG9vay5ob29rX2lkKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG9vay5ob29rX2FsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkQWxpYXMgPSBob29rLmhvb2tfYWxpYXNlcy5maW5kKGFsaWFzID0+IGFyZ3MuaW5jbHVkZXMoYWxpYXMpKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRBbGlhcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChob29rLmhvb2tfaWQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KG9wdGlvbnM/OiBMaXN0T3B0aW9ucykge1xuICAgICAgICBsZXQgaG9va3MgPSBBcnJheS5mcm9tKHRoaXMuaG9va3MudmFsdWVzKCkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmV4Y2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuZXhjbHVkZSkgPyBvcHRpb25zLmV4Y2x1ZGUgOiBbb3B0aW9ucy5leGNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+ICFpZHMuaW5jbHVkZXMoaG9vay5ob29rX2lkKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pbmNsdWRlKSB7XG4gICAgICAgICAgICBsZXQgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmluY2x1ZGUpID8gb3B0aW9ucy5pbmNsdWRlIDogW29wdGlvbnMuaW5jbHVkZV1cblxuICAgICAgICAgICAgaWRzID0gdGhpcy5tYXBBbGlhc2VzKGlkcylcblxuICAgICAgICAgICAgaG9va3MgPSBob29rcy5maWx0ZXIoaG9vayA9PiBpZHMuaW5jbHVkZXMoaG9vay5ob29rX2lkKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGhvb2tzID0gb3JkZXJCeShob29rcywgWydvcmRlciddLCBbJ2FzYyddKVxuXG4gICAgICAgIHJldHVybiBob29rc1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoLi4ucGF5bG9hZDogKExpZmVjeWNsZUhvb2sgfCBDb25zdHJ1Y3RvcjxMaWZlY3ljbGVIb29rPilbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnN0YW5jZXM6IExpZmVjeWNsZUhvb2tbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBheWxvYWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKG5ldyBpdGVtKCkpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2goaXRlbSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBpbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGlmICghaG9vay5ob29rX2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignU2tpcHBpbmcgaG9vayB3aXRob3V0IGhvb2tfaWQ6JywgaG9vaylcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmhvb2tzLnNldChob29rLmhvb2tfaWQsIGhvb2spXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FkZCAnICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG9vay5zdWJob29rcykge1xuICAgICAgICAgICAgICAgIGhvb2suc3ViaG9va3MuZm9yRWFjaChzdWJob29rID0+IHRoaXMuYWRkKHN1Ymhvb2spKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRNZXRob2QobWV0aG9kOiBMaWZlY3ljbGVNZXRob2QsIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBob29rcyA9IHRoaXMubGlzdChvcHRpb25zKSBcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGVtaXR0aW5nICR7bWV0aG9kfSBmb3IgaG9va3M6YCwge1xuICAgICAgICAgICAgICAgIGhvb2tzOiBob29rcy5tYXAoaG9vayA9PiBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIHRoaXMubGlzdChvcHRpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5yZWdpc3RlcigpLCBob29rLm9uUmVnaXN0ZXIoKV0pLFxuICAgICAgICAgICAgICAgIGxvYWQ6ICgpID0+IFByb21pc2UuYWxsKFtob29rLmxvYWQoKSwgaG9vay5vbkxvYWQoKV0pLFxuICAgICAgICAgICAgICAgIGJvb3Q6ICgpID0+IFByb21pc2UuYWxsKFtob29rLmJvb3QoKSwgaG9vay5vbkJvb3QoKV0pLFxuICAgICAgICAgICAgICAgIHNodXRkb3duOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5zaHV0ZG93bigpLCBob29rLm9uU2h1dGRvd24oKV0pLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gbWFwW21ldGhvZF0oKSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yLCB7IGhvb2tJZDogaG9vay5ob29rX2lkLCBtZXRob2QgfSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke21ldGhvZH0gYCArIGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0KHBheWxvYWQ6IExpZmVjeWNsZU1ldGhvZCB8IExpZmVjeWNsZU1ldGhvZFtdLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbWV0aG9kcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG5cbiAgICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0TWV0aG9kKG1ldGhvZCwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbihtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgaGFuZGxlcjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgICAgICBjb25zdCBoID0gbmV3IExpZmVjeWNsZUhvb2soKVxuXG4gICAgICAgIGguaG9va19pZCA9IGBjdXN0b206JHttZXRob2R9OiR7RGF0ZS5ub3coKX1gXG5cbiAgICAgICAgaFttZXRob2RdID0gaGFuZGxlclxuXG4gICAgICAgIHRoaXMuYWRkKGgpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdyZWdpc3RlcicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2xvYWQnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBib290KG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdib290Jywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2h1dGRvd24nLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob29rcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnXG5pbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCBxcyBmcm9tICdxcydcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2Lm51bWJlcigpXSksXG4gICAgdi50cmFuc2Zvcm0oTnVtYmVyKSxcbiAgICB2LmludGVnZXIoKSxcbilcblxuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5ib29sZWFuKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPT09IHRydWUgfHwgdiA9PT0gJ3RydWUnKSxcbilcblxuZXhwb3J0IGNvbnN0IGRhdGUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgaW5zdGFuY2VvZiBEYXRlID8gdiA6IG5ldyBEYXRlKHYpKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPyBmb3JtYXQodiwgJ3l5eXktTU0tZGQnKSA6IHYpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZXRpbWUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHtcbiAgICAgICAgaWYgKCF2KSByZXR1cm4gdlxuXG4gICAgICAgIGlmICh2ID09PSAnbnVsbCcpIHJldHVybiBudWxsXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdiA9IG5ldyBEYXRlKHYpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0KHYsICd5eXl5LU1NLWRkIEhIOm1tJylcbiAgICB9KSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5ID0gPFQgZXh0ZW5kcyB2LkJhc2VTY2hlbWE8YW55LCBhbnksIGFueT4+KHNjaGVtYTogVCA9IHYuYW55KCkgYXMgYW55IGFzIFQpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmFycmF5KHYuc3RyaW5nKCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLnNwbGl0KCcsJykpLFxuICAgIHYuYXJyYXkoc2NoZW1hKSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5TnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIGFycmF5KCksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdmFsdWUubWFwKE51bWJlcikpLFxuKVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0ID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYucmVjb3JkKHYuc3RyaW5nKCksIHYuYW55KCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHFzLnBhcnNlKHZhbHVlKSA6IHZhbHVlKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHNldChyZXN1bHQsIGtleSwgZ2V0KHZhbHVlLCBrZXkpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0pLFxuKVxuXG5leHBvcnQgZnVuY3Rpb24gdXJsKCkge1xuICAgIHJldHVybiBvYmplY3QoKVxufVxuXG51cmwubnVtYmVyID0gbnVtYmVyXG51cmwuYm9vbGVhbiA9IGJvb2xlYW4gXG51cmwuZGF0ZSA9IGRhdGUgXG51cmwuZGF0ZXRpbWUgPSBkYXRldGltZVxudXJsLmFycmF5ID0gYXJyYXlcbnVybC5hcnJheU51bWJlciA9IGFycmF5TnVtYmVyXG51cmwub2JqZWN0ID0gb2JqZWN0XG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnIFxuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG5leHBvcnQgY29uc3Qga2V5VmFsdWUgPSAoKSA9PiB2LnBpcGUodi5zdHJpbmcoKSwgdi50cmFuc2Zvcm0oKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZW50cmllcyA9IHZhbHVlLnNwbGl0KC9bO1xcbl0vKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5maWx0ZXIobCA9PiBsLmluY2x1ZGVzKCc9JykpXG4gICAgICAgIC5tYXAobCA9PiBsLnRyaW0oKS5zcGxpdCgnPScpKVxuXG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGxldCBwYXJzZWRWYWx1ZTogYW55ID0gdmFsdWVcblxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnYm9vbDonKSkge1xuICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdib29sOicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHJlc3VsdCwga2V5LCBwYXJzZWRWYWx1ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59KSlcbiIsImltcG9ydCB7IG51bWJlciwgYXJyYXkgfSBmcm9tICcuL3VybFZhbGlkYXRvci50cydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0aW9uUGFyYW1zIHtcbiAgICBtYXhMaW1pdD86IG51bWJlclxuICAgIG9yZGVyRmllbGRzPzogc3RyaW5nW11cbn1cblxuXG5leHBvcnQgY29uc3QgYmFzZSA9IChvcHRpb25zOiBQYWdpbmF0aW9uUGFyYW1zID0ge30pID0+IHYub2JqZWN0KHtcbiAgICBwYWdlOiB2Lm9wdGlvbmFsKG51bWJlcigpLCAxKSxcbiAgICBsaW1pdDogdi5vcHRpb25hbChudW1iZXIoKSwgb3B0aW9ucy5tYXhMaW1pdCB8fCAxMDApLFxuICAgIG9yZGVyQnk6IHYubnVsbGlzaChvcHRpb25zLm9yZGVyRmllbGRzID8gYXJyYXkodi5waWNrbGlzdChvcHRpb25zLm9yZGVyRmllbGRzKSkgOiBhcnJheSh2LnN0cmluZygpKSwgW10pLFxuICAgIG9yZGVyRGlyZWN0aW9uOiB2Lm51bGxpc2goYXJyYXkodi51bmlvbihbdi5saXRlcmFsKCdhc2MnKSwgdi5saXRlcmFsKCdkZXNjJyldKSksIFtdKSxcbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBwYWdpbmF0aW9uKG9wdGlvbnM6IFBhZ2luYXRpb25QYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiBiYXNlKG9wdGlvbnMpXG59XG5cbnBhZ2luYXRpb24uYmFzZSA9IGJhc2VcbiIsImV4cG9ydCAqIGZyb20gJy4vdXJsVmFsaWRhdG9yLnRzJ1xuZXhwb3J0ICogZnJvbSAnLi9rZXlWYWx1ZVZhbGlkYXRvci50cydcbmV4cG9ydCAqIGZyb20gJy4vcGFnaW5hdGlvblZhbGlkYXRvci50cydcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCAqIGFzIGV4dHJhcyBmcm9tICcjc2hhcmVkL3ZhbGlkYXRvcnMvaW5kZXgudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCB0eXBlIFZhbGlib3QgPSB0eXBlb2YgdiAmIHsgZXh0cmFzOiB0eXBlb2YgZXh0cmFzIH1cblxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYSA9IHYuQmFzZVNjaGVtYTx1bmtub3duLCB1bmtub3duLCB2LkJhc2VJc3N1ZTx1bmtub3duPj5cbmV4cG9ydCB0eXBlIFZhbGlib3RPYmplY3RTY2hlbWEgPSB2Lk9iamVjdFNjaGVtYTxhbnksIGFueT5cbmV4cG9ydCB0eXBlIFZhbGlib3RTY2hlbWFBc3luYyA9IHYuQmFzZVNjaGVtYUFzeW5jPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckNhbGxiYWNrPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPiB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+ID0ge1xuICAgIChfdjogVmFsaWJvdCk6IFRcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yUmVzdWx0PFQgZXh0ZW5kcyB2LkJhc2VTY2hlbWE8YW55LCBhbnksIGFueT4+ID0gdi5JbmZlck91dHB1dDxUPlxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVBheWxvYWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPSBWYWxpYm90U2NoZW1hPiA9IFZhbGlkYXRvckNhbGxiYWNrPFQ+IHwgVFxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVJlc3VsdDxUIGV4dGVuZHMgVmFsaWRhdGVQYXlsb2FkPiA9XG4gICAgVCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPyB2LkluZmVyT3V0cHV0PFQ+IDpcbiAgICBUIGV4dGVuZHMgVmFsaWRhdG9yQ2FsbGJhY2s8aW5mZXIgVT4gPyB2LkluZmVyT3V0cHV0PFU+IDpcbiAgICB1bmtub3duXG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmFsaWRhdG9yU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVmFsaWRhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyB2OiBWYWxpYm90ID0ge1xuICAgICAgICAuLi52LFxuICAgICAgICBleHRyYXMsXG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZTxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4oY2I6IFZhbGlkYXRvckNhbGxiYWNrPFQ+KSB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLnYpXG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0ZVBheWxvYWQ8VD4pIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBvdXRwdXQsIGlzc3Vlcywgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZmxhdHRlbiA9IHYuZmxhdHRlbihpc3N1ZXMpXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IFtdIGFzIHN0cmluZ1tdXG5cbiAgICAgICAgICAgIGlmIChmbGF0dGVuLnJvb3QpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKC4uLmZsYXR0ZW4ucm9vdClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ubmVzdGVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZmxhdHRlbi5uZXN0ZWQpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5IGFzIFtzdHJpbmcsIHN0cmluZ1tdXVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4udmFsdWUubWFwKCh2KSA9PiBgJHtrZXl9OiAke3Z9YCkpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzLmxlbmd0aCA/IG1lc3NhZ2VzLmpvaW4oJywgJykgOiAnVmFsaWRhdGlvbiBmYWlsZWQnXG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEJhc2VFeGNlcHRpb24obWVzc2FnZSwgNDIyKVxuXG4gICAgICAgICAgICBlcnJvci5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcidcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBtZXNzYWdlcywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBc3luYzxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYUFzeW5jPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQ+IHwgVCkge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSBhd2FpdCB2LnNhZmVQYXJzZUFzeW5jKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdWYWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5yb290LFxuICAgICAgICAgICAgICAgIC4uLmZsYXR0ZW4ubmVzdGVkLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGRldGFpbHMsIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IHN1Y2Nlc3MgfSA9IHYuc2FmZVBhcnNlKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbn1cblxuIiwiaW1wb3J0IFZhbGlkYXRvclNlcnZpY2UgZnJvbSBcIi4uL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2VcIlxuXG5leHBvcnQgY29uc3QgdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvclNlcnZpY2UoKVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0b3JcbiIsImltcG9ydCB0eXBlIHsgVmFsaWRhdG9yUmVzdWx0IH0gZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlLnRzJ1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcjc2hhcmVkL2ZhY2FkZXMvdmFsaWRhdG9yLnRzJ1xuXG5cbmV4cG9ydCB0eXBlIERhc2hib2FyZE1ldGFTY2hlbWEgPSBWYWxpZGF0b3JSZXN1bHQ8UmV0dXJuVHlwZTx0eXBlb2YgZGFzaGJvYXJkTWV0YVNjaGVtYT4+XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoYm9hcmRNZXRhU2NoZW1hKCkge1xuICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5vYmplY3Qoe1xuICAgICAgICBpZDogdi5udW1iZXIoKSxcbiAgICAgICAgZGFzaGJvYXJkX2lkOiB2Lm51bWJlcigpLFxuICAgICAgICBuYW1lOiB2LnN0cmluZygpLFxuICAgICAgICB2YWx1ZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICB9KSlcbn1cblxuZGFzaGJvYXJkTWV0YVNjaGVtYS5jcmVhdGUgPSB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5waWNrKGRhc2hib2FyZE1ldGFTY2hlbWEoKSwgWydkYXNoYm9hcmRfaWQnLCAnbmFtZScsICd2YWx1ZSddKSlcblxuZGFzaGJvYXJkTWV0YVNjaGVtYS51cGRhdGUgPSB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5wYXJ0aWFsKGRhc2hib2FyZE1ldGFTY2hlbWEuY3JlYXRlKSlcbiIsImltcG9ydCB0eXBlIHsgVmFsaWRhdG9yUmVzdWx0IH0gZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlLnRzJ1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcjc2hhcmVkL2ZhY2FkZXMvdmFsaWRhdG9yLnRzJ1xuXG5leHBvcnQgdHlwZSBEYXNoYm9hcmRTY2hlbWEgPSBWYWxpZGF0b3JSZXN1bHQ8UmV0dXJuVHlwZTx0eXBlb2YgZGFzaGJvYXJkU2NoZW1hPj5cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZFNjaGVtYSgpIHtcbiAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYub2JqZWN0KHtcbiAgICAgICAgaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgICAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICBkZWxldGVkX2F0OiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuXG4gICAgICAgIG1ldGFzOiB2Lm9wdGlvbmFsKHYucmVjb3JkKHYuc3RyaW5nKCksIHYuYW55KCkpKSxcbiAgICB9KSlcbn1cblxuZGFzaGJvYXJkU2NoZW1hLmNyZWF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBpY2soZGFzaGJvYXJkU2NoZW1hKCksIFsnbmFtZScsICdkZXNjcmlwdGlvbiddKSlcblxuZGFzaGJvYXJkU2NoZW1hLnVwZGF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBhcnRpYWwoZGFzaGJvYXJkU2NoZW1hLmNyZWF0ZSkpXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25Bc3NpZ25tZW50ID0gdi5JbmZlck91dHB1dDx0eXBlb2YgcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWE+XG5cbmV4cG9ydCBjb25zdCBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBwZXJtaXNzaW9uX2lkOiB2Lm51bWJlcigpLFxuICAgIGFzc2lnbmFibGVfdHlwZTogdi5zdHJpbmcoKSxcbiAgICBhc3NpZ25hYmxlX2lkOiB2LnN0cmluZygpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb24gPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uU2NoZW1hPlxuXG5leHBvcnQgY29uc3QgcGVybWlzc2lvblNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBuYW1lOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGRlc2NyaXB0aW9uOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGFjdGlvbjogdi5zdHJpbmcoKSxcbiAgICBzdWJqZWN0OiB2LnN0cmluZygpLFxuICAgIGNvbmRpdGlvbnM6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIGV4cGlyZXNfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBUb2tlbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHRva2VuU2NoZW1hPlxuXG5leHBvcnQgY29uc3QgdG9rZW5TY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgbmFtZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICB0eXBlOiB2LnN0cmluZygpLFxuICAgIHVzZXJfaWQ6IHYubnVtYmVyKCksXG4gICAgdG9rZW46IHYuc3RyaW5nKCksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIGV4cGlyZXNfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5mdW5jdGlvbiB1c2VyU2NoZW1hKCkge1xuICAgIHJldHVybiB2Lm9iamVjdCh7XG4gICAgICAgIGlkOiB2Lm51bWJlcigpLFxuICAgICAgICBuYW1lOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgICAgICBlbWFpbDogdi5waXBlKHYuc3RyaW5nKCksIHYuZW1haWwoKSksXG4gICAgICAgIHBhc3N3b3JkOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5taW5MZW5ndGgoNikpLFxuICAgICAgICB1c2VybmFtZTogdi5waXBlKHYuc3RyaW5nKCksIHYucmVnZXgoL15bYS16QS1aMC05Xy1dKyQvKSksXG4gICAgICAgIHZlcmlmaWVkX2F0OiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgICAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICBkZWxldGVkX2F0OiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpXG4gICAgfSlcbn1cblxudXNlclNjaGVtYS5jcmVhdGUgPSAoKSA9PiB2Lm9taXQodXNlclNjaGVtYSgpLCBbJ2lkJywgJ3ZlcmlmaWVkX2F0JywgJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsICdkZWxldGVkX2F0J10pXG51c2VyU2NoZW1hLnVwZGF0ZSA9ICgpID0+IHYucGFydGlhbCh1c2VyU2NoZW1hLmNyZWF0ZSgpKVxuXG5leHBvcnQgZGVmYXVsdCB1c2VyU2NoZW1hXG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbmVyIHtcbiAgICBldmVudDogc3RyaW5nXG4gICAgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW1pdEhvb2soY29uc3RydWN0b3I6IGFueSwgZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHsgICAgICAgICAgICAgICAgXG4gICAgY29uc3QgbGlzdGVuZXJzID0gY29uc3RydWN0b3IubGlzdGVuZXJzIHx8IFtdXG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGwgb2YgbGlzdGVuZXJzLmZpbHRlcigobDogYW55KSA9PiBsLmV2ZW50ID09PSBldmVudCkpIHtcbiAgICAgICAgYXdhaXQgbC5saXN0ZW5lciguLi5hcmdzKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uSG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gY29uc3RydWN0b3IubGlzdGVuZXJzIHx8IFtdXG5cbiAgICBjb25zdCBleGlzdHMgPSBsaXN0ZW5lcnMuZmluZCgobDogYW55KSA9PiBsLmV2ZW50ID09PSBldmVudCAmJiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcilcblxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLnB1c2goeyBcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyIFxuICAgIH0pXG5cbiAgICBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgPSBsaXN0ZW5lcnNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhvb2tzU3RhdGljPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpLmJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpLmJvb3QuYXBwbHkodGhpcy5jb25zdHJ1Y3RvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgbGlzdGVuZXJzID0gW10gYXMgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPlxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uSG9vayh0aGlzLCBldmVudCwgbGlzdGVuZXIpXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHJldHVybiBlbWl0SG9vayh0aGlzLCBldmVudCwgLi4uYXJncylcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSG9va3M8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIGxpc3RlbmVyczogTGlzdGVuZXJbXVxuXG4gICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goeyBcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciBcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb2ZmKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnMuZmluZEluZGV4KChsKSA9PiBsLmV2ZW50ID09PSBldmVudCAmJiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcilcblxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5maWx0ZXIoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50KVxuXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbCBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHB1YmxpYyBhc3luYyBlbWl0QXN5bmMoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcigobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgbCBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkhvb2tzU3RhdGljLmVtaXQgPSBlbWl0SG9va1xuSG9va3NTdGF0aWMub24gPSBvbkhvb2tcbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIG9yaWdpbjogc3RyaW5nXG4gICAgcHVibGljIHN1YmplY3Q6IHN0cmluZ1xuICAgIHB1YmxpYyBhY3Rpb246IHN0cmluZ1xuICAgIHB1YmxpYyBjb25kaXRpb25zOiBzdHJpbmcgfCBudWxsIHwgUmVjb3JkPHN0cmluZywgYW55PiA9IG51bGxcblxuICAgIHB1YmxpYyBnZXQgZWRpdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbiA9PT0gJ2N1c3RvbSdcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhcnNlZENvbmRpdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwganNvbl0gPSB0cnlDYXRjaC5zeW5jKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25kaXRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuY29uZGl0aW9ucyBhcyBzdHJpbmcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBlcnJvciA/IHt9IDoganNvblxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZUFiaWxpdHksIHN1YmplY3QgYXMgY3JlYXRlU3ViamVjdCB9IGZyb20gJ0BjYXNsL2FiaWxpdHknXG5pbXBvcnQgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjbEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQWNsRW50aXR5J1xuXG4gICAgcHVibGljIGFiaWxpdHk6IFJldHVyblR5cGU8dHlwZW9mIGRlZmluZUFiaWxpdHk+XG4gICAgcHVibGljIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8QWNsRW50aXR5PiA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gZGF0YS5wZXJtaXNzaW9ucyB8fCBbXVxuICAgICAgICBjb25zdCBwZXJtcyA9IHBlcm1pc3Npb25zLm1hcCgocGVybWlzc2lvbikgPT4gUGVybWlzc2lvbi5mcm9tKHBlcm1pc3Npb24pKVxuXG4gICAgICAgIFxuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybXNcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpLmNoaWxkKHsgbGFiZWw6ICdhY2wnIH0pXG4gICAgICAgIFxuICAgICAgICB0aGlzLmFiaWxpdHkgPSBkZWZpbmVBYmlsaXR5KChjYW4pID0+IHtcbiAgICAgICAgICAgIHBlcm1zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICBjYW4ocGVybWlzc2lvbi5hY3Rpb24sIHBlcm1pc3Npb24uc3ViamVjdCwgcGVybWlzc2lvbi5wYXJzZWRDb25kaXRpb25zKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMucGVybWlzc2lvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNhbihhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgY2Fubm90KGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3ViamVjdChzdWJqZWN0OiBzdHJpbmcsIG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICByZXR1cm4gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG4gICAgfVxufVxuIiwiaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHlNaXhpbiwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZHJpdmU6IHN0cmluZ1xuICAgIHB1YmxpYyBtaW1ldHlwZTogc3RyaW5nXG4gICAgcHVibGljIHB1cnBvc2U6IHN0cmluZ1xuICAgIHB1YmxpYyBjbGllbnRfbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGZpbGVuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcHVibGljOiBib29sZWFuXG5cbiAgICAvLyBkeW5hbWljXG4gICAgcHVibGljIHVybD86IHN0cmluZ1xuICAgIHB1YmxpYyBtZXRhcz86IFJlY29yZDxzdHJpbmcsIGFueT5cblxuICAgIHB1YmxpYyBpc0ltYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5taW1ldHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlTWV0YSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBmaWxlX2lkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmcgfCBudWxsXG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkU2Vzc2lvbiBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWVfdHlwZXM6IHN0cmluZ1xuICAgIHB1YmxpYyBtYXhfc2l6ZTogbnVtYmVyXG5cbiAgICAvLyBkeW5hbWljIFxuICAgIHB1YmxpYyB1cGxvYWRfdXJsPzogc3RyaW5nXG4gICAgcHVibGljIGNyZWF0ZV9maWxlX3VybD86IHN0cmluZ1xuXG4gICAgcHVibGljIGdldFBhcnNlZE1pbWVUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWVfdHlwZXMuc3BsaXQoJywnKS5tYXAodHlwZSA9PiB0eXBlLnRyaW0oKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkTWltZVR5cGUobWltZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLmdldFBhcnNlZE1pbWVUeXBlcygpXG4gICAgICAgIHJldHVybiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMobWltZVR5cGUpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygnKi8qJylcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkU2l6ZShzaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNpemUgPD0gdGhpcy5tYXhfc2l6ZVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIE1vZHVsZU1hbmlmZXN0IGZyb20gJy4vTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuaW50ZXJmYWNlIE1vZHVsZVVwZ3JhZGVJbmZvIHtcbiAgICBzb3VyY2U6ICdnaXQnIHwgJ3ppcCdcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBtaXhpbihMaWZlY3ljbGVIb29rKSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgYnVpbGQ6IE1vZHVsZU1hbmlmZXN0WydidWlsZCddID0ge31cbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyB1cGdyYWRlX2luZm8/OiBNb2R1bGVVcGdyYWRlSW5mb1xuXG4gICAgcHVibGljIHNldERhdGEoZGF0YTogUGFydGlhbDxNb2R1bGUgfCBNb2R1bGVNYW5pZmVzdD4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIClcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpbHRlcmVkKVxuXG4gICAgICAgIHRoaXMuaG9va19pZCA9IGBtb2R1bGU6JHt0aGlzLmlkfWBcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnQge1xuICAgIGZyb206IHN0cmluZ1xuICAgIHRvPzogc3RyaW5nXG4gICAgdHlwZTogJ2dsb2JhbF9pbXBvcnQnXG59XG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGQge1xuICAgIGltcG9ydHM/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0W11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlTWFuaWZlc3QgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYXV0aG9yPzogc3RyaW5nXG4gICAgcHVibGljIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgYnVpbGQ/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYWxpYXNlczogc3RyaW5nW11cbiAgICBwdWJsaWMgdmVyc2lvbl9jaGFubmVsOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbl9hdmFpbGFibGVfY2hhbm5lbHM6IHN0cmluZ1tdXG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvbGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbn1cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5pbXBvcnQgeyBFbW1pdHRlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuXG5jb25zdCBlbW1pdHRlciA9IGNvbnRhaW5lci5wcm94eTxFbW1pdHRlclNlcnZpY2U+KEVtbWl0dGVyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgZW1taXR0ZXJcbiIsImltcG9ydCB7IEJhc2VFeGNlcHRpb24gfSBmcm9tIFwiI3NoYXJlZC9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IERlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIlxuaW1wb3J0IGVtbWl0dGVyIGZyb20gJy4uL2ZhY2FkZXMvZW1taXR0ZXIudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExheW91dFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xheW91dFNlcnZpY2UnXG4gICAgcHVibGljIGNvbXBvbmVudHM6IE1hcDxzdHJpbmcsIERlZmluZUNvbXBvbmVudD4gPSBuZXcgTWFwKClcbiAgICBwdWJsaWMgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG4gICAgcHVibGljIGN1cnJlbmRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAgIHB1YmxpYyBzZXRDdXJyZW50KGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jdXJyZW5kSWQgPSBpZFxuXG4gICAgICAgIGVtbWl0dGVyLmVtaXQoJ2xheW91dDpjaGFuZ2UnLCBpZClcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKG5hbWU6IHN0cmluZywgY29tcG9uZW50OiBEZWZpbmVDb21wb25lbnQsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnNldChuYW1lLCBjb21wb25lbnQpXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKG5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRzLmhhcyhuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jb21wb25lbnRzLmdldChuYW1lKVxuXG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBMYXlvdXQgJHtuYW1lfSBub3QgZm91bmRgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VycmVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbmRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldCh0aGlzLmN1cnJlbmRJZClcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG5cbiAgICAgICAgZW1taXR0ZXIuZW1pdCgnbGF5b3V0OnNldC1vcHRpb25zJywgb3B0aW9ucylcbiAgICB9XG59XG4iLCJpbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnO1xuaW1wb3J0IEJhc2VMaWZlY3ljbGVTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgcHVibGljIGFkZEltcG9ydHMoaW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55Pil7XG4gICAgICAgIGNvbnN0IGhvb2tzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1vZF0gb2YgT2JqZWN0LmVudHJpZXMoaW1wb3J0cykpIHtcbiAgICAgICAgICAgIGNvbnN0IEhvb2tDbGFzcyA9IG1vZC5kZWZhdWx0IHx8IG1vZFxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgSG9va0NsYXNzKCkgYXMgTGlmZWN5Y2xlSG9va1xuXG4gICAgICAgICAgICBpbnN0YW5jZS5ob29rX2lkID0gaW5zdGFuY2UuaG9va19pZCB8fCBuYW1lXG5cbiAgICAgICAgICAgIGhvb2tzLnB1c2goaW5zdGFuY2UpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcy5mb3JFYWNoKGhvb2sgPT4gdGhpcy5hZGQoaG9vaykpXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVudUl0ZW0gZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nXG4gICAgcHVibGljIGxheW91dDogc3RyaW5nXG5cbiAgICBwdWJsaWMgdG8/OiBzdHJpbmdcblxuICAgIHB1YmxpYyB0YXJnZXQ/OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCdcbiAgICBwdWJsaWMgZ3JvdXA/OiBzdHJpbmdcbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgaWNvbj86IHN0cmluZ1xuICAgIHB1YmxpYyBwYXJlbnQ/OiBzdHJpbmdcbn1cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCBBY2xFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMnXG5cbmNvbnN0IGFjbCA9IGNvbnRhaW5lci5wcm94eTxBY2xFbnRpdHk+KEFjbEVudGl0eSlcblxuZXhwb3J0IGRlZmF1bHQgYWNsXG4iLCJpbXBvcnQgTWVudUl0ZW0gZnJvbSAnI2NsaWVudC9lbnRpdGllcy9NZW51SXRlbUVudGl0eS50cydcbmltcG9ydCBhY2wgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2FjbC50cydcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RmlsdGVyIHtcbiAgICBsYXlvdXQ/OiBzdHJpbmdcbiAgICBncm91cD86IHN0cmluZ1xuICAgIHBhcmVudD86IHN0cmluZ1xuICAgIGFsbG93ZWQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lbnVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdNZW51U2VydmljZSdcblxuICAgIHB1YmxpYyBpdGVtczogTWFwPHN0cmluZywgTWVudUl0ZW0+ID0gbmV3IE1hcCgpXG5cbiAgICBwdWJsaWMgYWRkKC4uLml0ZW06IE9taXQ8UGFydGlhbDxNZW51SXRlbT4sICdtZXJnZScgfCAnZnJvbSc+W10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW0pIHtcblxuICAgICAgICAgICAgaWYgKCFpLmlkKSB7XG4gICAgICAgICAgICAgICAgaS5pZCA9IEpTT04uc3RyaW5naWZ5KGkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KGkuaWQsIE1lbnVJdGVtLmZyb20oaSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKGlkOiBNZW51SXRlbVsnaWQnXSkge1xuICAgICAgICB0aGlzLml0ZW1zLmRlbGV0ZShpZClcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChmaWx0ZXI6IExpc3RGaWx0ZXIgPSB7fSkge1xuICAgICAgICBsZXQgaXRlbXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odGhpcy5pdGVtcy52YWx1ZXMoKSkpKSBhcyBNZW51SXRlbVtdXG5cblxuICAgICAgICBpZiAoZmlsdGVyLmxheW91dCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLmxheW91dCA9PT0gZmlsdGVyLmxheW91dClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIuZ3JvdXApIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gaS5ncm91cCA9PT0gZmlsdGVyLmdyb3VwIHx8IGkucGFyZW50ID09PSBmaWx0ZXIuZ3JvdXApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVyLnBhcmVudCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLnBhcmVudCA9PT0gZmlsdGVyLnBhcmVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIuYWxsb3dlZCAhPT0gdW5kZWZpbmVkICYmIGZpbHRlci5hbGxvd2VkID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGFjbC5jYW4oJ3ZpZXcnLCBpKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQSA9IGEub3JkZXIgPyBhLm9yZGVyIDogOThcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQiA9IGIub3JkZXIgPyBiLm9yZGVyIDogOThcblxuICAgICAgICAgICAgcmV0dXJuIG9yZGVyQSAtIG9yZGVyQlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29uZmlnLnRzJ1xuXG5jb25zdCBzZXR1cEd1YXJkOiBOYXZpZ2F0aW9uR3VhcmQgPSAodG8pID0+IHtcbiAgICBjb25zdCBzZXR1cCA9IGNvbmZpZy5nZXQ8YW55Pignc2V0dXAnKVxuICAgIFxuICAgIGNvbnN0IGNvbXBsZXRlZCA9ICFzZXR1cD8ubmVlZF9kYXRhYmFzZSAmJiAhc2V0dXA/Lm5lZWRfdXNlcnNcbiAgICBcbiAgICBpZiAoY29tcGxldGVkICYmIHRvLnBhdGguc3RhcnRzV2l0aCgnL3NldHVwJykpIHtcbiAgICAgICAgcmV0dXJuICcvJ1xuICAgIH1cbiAgICBcbiAgICBpZiAoY29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIFxuICAgIGlmICghdG8ucGF0aC5zdGFydHNXaXRoKCcvc2V0dXAnKSkge1xuICAgICAgICByZXR1cm4gJy9zZXR1cCdcbiAgICB9XG4gICAgXG4gICAgaWYgKHRvLnBhdGggPT09ICcvc2V0dXAnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfSAgICBcblxuICAgIGlmIChzZXR1cD8ubmVlZF9kYXRhYmFzZSkge1xuICAgICAgICByZXR1cm4gdG8ucGF0aCAhPT0gJy9zZXR1cC9kYXRhYmFzZScgPyAnL3NldHVwL2RhdGFiYXNlJyA6IHRydWVcbiAgICB9XG5cbiAgICBpZiAoc2V0dXA/Lm5lZWRfdXNlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRvLnBhdGggIT09ICcvc2V0dXAvdXNlcicgPyAnL3NldHVwL3VzZXInIDogdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldHVwR3VhcmRcbiIsImltcG9ydCB7XG4gICAgY3JlYXRlUm91dGVyIGFzIGNyZWF0ZVZ1ZVJvdXRlcixcbiAgICBjcmVhdGVNZW1vcnlIaXN0b3J5LFxuICAgIGNyZWF0ZVdlYkhpc3Rvcnlcbn0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkd1YXJkLCBSb3V0ZXIgYXMgVnVlUm91dGVyIH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCB0eXBlIHsgUm91dGVSZWNvcmRSYXcgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBEZWZpbmVDb21wb25lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgc2V0dXBHdWFyZCBmcm9tICcjY2xpZW50L2d1YXJkcy9zZXR1cEd1YXJkLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlciBleHRlbmRzIFZ1ZVJvdXRlciB7XG4gICAgYXV0bzogdHlwZW9mIGF1dG87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b09wdGlvbnMge1xuICAgIGd1YXJkcz86IE5hdmlnYXRpb25HdWFyZFtdIHwgKChyZWNvcmQ6IFJvdXRlUmVjb3JkUmF3KSA9PiBOYXZpZ2F0aW9uR3VhcmRbXSk7XG4gICAgc3RyaXA/OiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICAgIGV4Y2x1ZGU/OiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICByZWZpbmU/OiAocmVjb3JkczogUm91dGVSZWNvcmRSYXdbXSkgPT4gUm91dGVSZWNvcmRSYXdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1dG8oaW1wb3J0czogUmVjb3JkPHN0cmluZywgRGVmaW5lQ29tcG9uZW50IHwgKCgpID0+IFByb21pc2U8RGVmaW5lQ29tcG9uZW50Pik+LCBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9KTogUm91dGVSZWNvcmRSYXdbXSB7XG4gICAgbGV0IHJvdXRlczogUm91dGVSZWNvcmRSYXdbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlbmFtZSwgY29tcG9uZW50XSBvZiBPYmplY3QuZW50cmllcyhpbXBvcnRzKSkge1xuXG4gICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGU/LnNvbWUocnVsZSA9PlxuICAgICAgICAgICAgdHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBmaWxlbmFtZS5pbmNsdWRlcyhydWxlKVxuICAgICAgICAgICAgICAgIDogcnVsZS50ZXN0KGZpbGVuYW1lKVxuICAgICAgICApKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnRzID0gZmlsZW5hbWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC52dWUkLywgJycpXG4gICAgICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAgICAgLmZpbHRlcihwID0+IHAgJiYgIXAuc3RhcnRzV2l0aCgnLicpKVxuICAgICAgICAgICAgLm1hcChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcCA9IHBhcnRcblxuICAgICAgICAgICAgICAgIGlmIChwLnN0YXJ0c1dpdGgoJ1snKSAmJiBwLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcCA9ICc6JyArIHAuc2xpY2UoMSwgLTEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBcbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAvLyBTdHJpcCBzcGVjaWZpYyBzZWdtZW50c1xuICAgICAgICBpZiAob3B0aW9ucy5zdHJpcD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLmZpbHRlcihwID0+XG4gICAgICAgICAgICAgICAgIW9wdGlvbnMuc3RyaXAhLnNvbWUocnVsZSA9PlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcCA9PT0gcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBydWxlLnRlc3QocClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKS5yZXBsYWNlKC9pbmRleCQvLCAnJylcblxuICAgICAgICBpZiAob3B0aW9ucy5wcmVmaXgpIHtcbiAgICAgICAgICAgIHBhdGggPSBvcHRpb25zLnByZWZpeCArICcvJyArIHBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHBhdGggPSAnLycgKyBwYXRoXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBEZWZpbmVDb21wb25lbnQsXG4gICAgICAgICAgICBiZWZvcmVFbnRlcjogW10gYXMgTmF2aWdhdGlvbkd1YXJkW10sXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChvcHRpb25zLmd1YXJkcyAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuZ3VhcmRzKSkge1xuICAgICAgICAgICAgcmVjb3JkLmJlZm9yZUVudGVyID0gb3B0aW9ucy5ndWFyZHNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmd1YXJkcyAmJiB0eXBlb2Ygb3B0aW9ucy5ndWFyZHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWZvcmVFbnRlciA9IG9wdGlvbnMuZ3VhcmRzKHJlY29yZClcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRlcy5wdXNoKHJlY29yZClcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yZWZpbmUpIHtcbiAgICAgICAgcm91dGVzID0gb3B0aW9ucy5yZWZpbmUocm91dGVzKVxuICAgIH1cblxuICAgIHJldHVybiByb3V0ZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcigpIHtcbiAgICBjb25zdCBzc3IgPSBpbXBvcnQubWV0YS5lbnYuU1NSXG5cbiAgICBjb25zdCByb3V0ZXIgPSBjcmVhdGVWdWVSb3V0ZXIoe1xuICAgICAgICBoaXN0b3J5OiBzc3IgPyBjcmVhdGVNZW1vcnlIaXN0b3J5KCkgOiBjcmVhdGVXZWJIaXN0b3J5KCksXG4gICAgICAgIHJvdXRlczogW10sXG4gICAgICAgIHNjcm9sbEJlaGF2aW9yKHRvLCBmcm9tLCBzYXZlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBpZiAoc2F2ZWRQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZFBvc2l0aW9uXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRvcDogMCB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSkgYXMgYW55IGFzIFJvdXRlclxuXG4gICAgcm91dGVyLmJlZm9yZUVhY2goc2V0dXBHdWFyZClcblxuICAgIHJvdXRlci5hdXRvID0gKGltcG9ydHM6IFJlY29yZDxzdHJpbmcsIERlZmluZUNvbXBvbmVudCB8ICgoKSA9PiBQcm9taXNlPERlZmluZUNvbXBvbmVudD4pPiwgb3B0aW9uczogQXV0b09wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBhdXRvUm91dGVzID0gYXV0byhpbXBvcnRzLCBvcHRpb25zKVxuICAgICAgICBcbiAgICAgICAgYXV0b1JvdXRlcy5mb3JFYWNoKHJvdXRlID0+IHJvdXRlci5hZGRSb3V0ZShyb3V0ZSkpXG5cbiAgICAgICAgcmV0dXJuIGF1dG9Sb3V0ZXNcbiAgICB9XG5cbiAgICByZXR1cm4gcm91dGVyXG59XG5cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvYXN0U2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVG9hc3RTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHN1Y2Nlc3MobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCBtZXNzYWdlLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIGN1c3RvbVJlZiwgZWZmZWN0U2NvcGUsIGdldEN1cnJlbnRJbnN0YW5jZSwgZ2V0Q3VycmVudFNjb3BlLCBoYXNJbmplY3Rpb25Db250ZXh0LCBpbmplY3QsIGlzUmVhY3RpdmUsIGlzUmVmLCBuZXh0VGljaywgb25CZWZvcmVNb3VudCwgb25CZWZvcmVVbm1vdW50LCBvbk1vdW50ZWQsIG9uU2NvcGVEaXNwb3NlLCBvblVubW91bnRlZCwgcHJvdmlkZSwgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgdG9SZWYgYXMgdG9SZWYkMSwgdG9SZWZzIGFzIHRvUmVmcyQxLCB0b1ZhbHVlLCB1bnJlZiwgd2F0Y2gsIHdhdGNoRWZmZWN0IH0gZnJvbSBcInZ1ZVwiO1xuXG4vLyNyZWdpb24gY29tcHV0ZWRFYWdlci9pbmRleC50c1xuLyoqXG4qXG4qIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9uLlxuKlxuKiBOb3RlOiBJZiB5b3UgYXJlIHVzaW5nIFZ1ZSAzLjQrLCB5b3UgY2FuIHN0cmFpZ2h0IHVzZSBjb21wdXRlZCBpbnN0ZWFkLlxuKiBCZWNhdXNlIGluIFZ1ZSAzLjQrLCBpZiBjb21wdXRlZCBuZXcgdmFsdWUgZG9lcyBub3QgY2hhbmdlLFxuKiBjb21wdXRlZCwgZWZmZWN0LCB3YXRjaCwgd2F0Y2hFZmZlY3QsIHJlbmRlciBkZXBlbmRlbmNpZXMgd2lsbCBub3QgYmUgdHJpZ2dlcmVkLlxuKiByZWZlcjogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL2NvcmUvcHVsbC81OTEyXG4qXG4qIEBwYXJhbSBmbiBlZmZlY3QgZnVuY3Rpb25cbiogQHBhcmFtIG9wdGlvbnMgV2F0Y2hPcHRpb25zQmFzZVxuKiBAcmV0dXJucyByZWFkb25seSBzaGFsbG93UmVmXG4qL1xuZnVuY3Rpb24gY29tcHV0ZWRFYWdlcihmbiwgb3B0aW9ucykge1xuXHR2YXIgX29wdGlvbnMkZmx1c2g7XG5cdGNvbnN0IHJlc3VsdCA9IHNoYWxsb3dSZWYoKTtcblx0d2F0Y2hFZmZlY3QoKCkgPT4ge1xuXHRcdHJlc3VsdC52YWx1ZSA9IGZuKCk7XG5cdH0sIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGZsdXNoOiAoX29wdGlvbnMkZmx1c2ggPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmx1c2gpICE9PSBudWxsICYmIF9vcHRpb25zJGZsdXNoICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRmbHVzaCA6IFwic3luY1wiXG5cdH0pO1xuXHRyZXR1cm4gcmVhZG9ubHkocmVzdWx0KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYGNvbXB1dGVkRWFnZXJgIGluc3RlYWQgKi9cbmNvbnN0IGVhZ2VyQ29tcHV0ZWQgPSBjb21wdXRlZEVhZ2VyO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjb21wdXRlZFdpdGhDb250cm9sL2luZGV4LnRzXG4vKipcbiogRXhwbGljaXRseSBkZWZpbmUgdGhlIGRlcHMgb2YgY29tcHV0ZWQuXG4qXG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIGZuXG4qL1xuZnVuY3Rpb24gY29tcHV0ZWRXaXRoQ29udHJvbChzb3VyY2UsIGZuLCBvcHRpb25zID0ge30pIHtcblx0bGV0IHYgPSB2b2lkIDA7XG5cdGxldCB0cmFjaztcblx0bGV0IHRyaWdnZXI7XG5cdGxldCBkaXJ0eSA9IHRydWU7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcblx0XHRkaXJ0eSA9IHRydWU7XG5cdFx0dHJpZ2dlcigpO1xuXHR9O1xuXHR3YXRjaChzb3VyY2UsIHVwZGF0ZSwge1xuXHRcdGZsdXNoOiBcInN5bmNcIixcblx0XHQuLi5vcHRpb25zXG5cdH0pO1xuXHRjb25zdCBnZXQkMSA9IHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiID8gZm4gOiBmbi5nZXQ7XG5cdGNvbnN0IHNldCQxID0gdHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIgPyB2b2lkIDAgOiBmbi5zZXQ7XG5cdGNvbnN0IHJlc3VsdCA9IGN1c3RvbVJlZigoX3RyYWNrLCBfdHJpZ2dlcikgPT4ge1xuXHRcdHRyYWNrID0gX3RyYWNrO1xuXHRcdHRyaWdnZXIgPSBfdHJpZ2dlcjtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRpZiAoZGlydHkpIHtcblx0XHRcdFx0XHR2ID0gZ2V0JDEodik7XG5cdFx0XHRcdFx0ZGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0cmFjaygpO1xuXHRcdFx0XHRyZXR1cm4gdjtcblx0XHRcdH0sXG5cdFx0XHRzZXQodiQxKSB7XG5cdFx0XHRcdHNldCQxID09PSBudWxsIHx8IHNldCQxID09PSB2b2lkIDAgfHwgc2V0JDEodiQxKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9KTtcblx0cmVzdWx0LnRyaWdnZXIgPSB1cGRhdGU7XG5cdHJldHVybiByZXN1bHQ7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGBjb21wdXRlZFdpdGhDb250cm9sYCBpbnN0ZWFkICovXG5jb25zdCBjb250cm9sbGVkQ29tcHV0ZWQgPSBjb21wdXRlZFdpdGhDb250cm9sO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0cnlPblNjb3BlRGlzcG9zZS9pbmRleC50c1xuLyoqXG4qIENhbGwgb25TY29wZURpc3Bvc2UoKSBpZiBpdCdzIGluc2lkZSBhbiBlZmZlY3Qgc2NvcGUgbGlmZWN5Y2xlLCBpZiBub3QsIGRvIG5vdGhpbmdcbipcbiogQHBhcmFtIGZuXG4qL1xuZnVuY3Rpb24gdHJ5T25TY29wZURpc3Bvc2UoZm4sIGZhaWxTaWxlbnRseSkge1xuXHRpZiAoZ2V0Q3VycmVudFNjb3BlKCkpIHtcblx0XHRvblNjb3BlRGlzcG9zZShmbiwgZmFpbFNpbGVudGx5KTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGNyZWF0ZUV2ZW50SG9vay9pbmRleC50c1xuLyoqXG4qIFV0aWxpdHkgZm9yIGNyZWF0aW5nIGV2ZW50IGhvb2tzXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZUV2ZW50SG9va1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50SG9vaygpIHtcblx0Y29uc3QgZm5zID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0Y29uc3Qgb2ZmID0gKGZuKSA9PiB7XG5cdFx0Zm5zLmRlbGV0ZShmbik7XG5cdH07XG5cdGNvbnN0IGNsZWFyID0gKCkgPT4ge1xuXHRcdGZucy5jbGVhcigpO1xuXHR9O1xuXHRjb25zdCBvbiA9IChmbikgPT4ge1xuXHRcdGZucy5hZGQoZm4pO1xuXHRcdGNvbnN0IG9mZkZuID0gKCkgPT4gb2ZmKGZuKTtcblx0XHR0cnlPblNjb3BlRGlzcG9zZShvZmZGbik7XG5cdFx0cmV0dXJuIHsgb2ZmOiBvZmZGbiB9O1xuXHR9O1xuXHRjb25zdCB0cmlnZ2VyID0gKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShmbnMpLm1hcCgoZm4pID0+IGZuKC4uLmFyZ3MpKSk7XG5cdH07XG5cdHJldHVybiB7XG5cdFx0b24sXG5cdFx0b2ZmLFxuXHRcdHRyaWdnZXIsXG5cdFx0Y2xlYXJcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlR2xvYmFsU3RhdGUvaW5kZXgudHNcbi8qKlxuKiBLZWVwIHN0YXRlcyBpbiB0aGUgZ2xvYmFsIHNjb3BlIHRvIGJlIHJldXNhYmxlIGFjcm9zcyBWdWUgaW5zdGFuY2VzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9jcmVhdGVHbG9iYWxTdGF0ZVxuKiBAcGFyYW0gc3RhdGVGYWN0b3J5IEEgZmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIHN0YXRlXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gY3JlYXRlR2xvYmFsU3RhdGUoc3RhdGVGYWN0b3J5KSB7XG5cdGxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xuXHRsZXQgc3RhdGU7XG5cdGNvbnN0IHNjb3BlID0gZWZmZWN0U2NvcGUodHJ1ZSk7XG5cdHJldHVybiAoKC4uLmFyZ3MpID0+IHtcblx0XHRpZiAoIWluaXRpYWxpemVkKSB7XG5cdFx0XHRzdGF0ZSA9IHNjb3BlLnJ1bigoKSA9PiBzdGF0ZUZhY3RvcnkoLi4uYXJncykpO1xuXHRcdFx0aW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RhdGU7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBwcm92aWRlTG9jYWwvbWFwLnRzXG5jb25zdCBsb2NhbFByb3ZpZGVkU3RhdGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gaW5qZWN0TG9jYWwvaW5kZXgudHNcbi8qKlxuKiBPbiB0aGUgYmFzaXMgb2YgYGluamVjdGAsIGl0IGlzIGFsbG93ZWQgdG8gZGlyZWN0bHkgY2FsbCBpbmplY3QgdG8gb2J0YWluIHRoZSB2YWx1ZSBhZnRlciBjYWxsIHByb3ZpZGUgaW4gdGhlIHNhbWUgY29tcG9uZW50LlxuKlxuKiBAZXhhbXBsZVxuKiBgYGB0c1xuKiBpbmplY3RMb2NhbCgnTXlJbmplY3Rpb25LZXknLCAxKVxuKiBjb25zdCBpbmplY3RlZFZhbHVlID0gaW5qZWN0TG9jYWwoJ015SW5qZWN0aW9uS2V5JykgLy8gaW5qZWN0ZWRWYWx1ZSA9PT0gMVxuKiBgYGBcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5jb25zdCBpbmplY3RMb2NhbCA9ICguLi5hcmdzKSA9PiB7XG5cdHZhciBfZ2V0Q3VycmVudEluc3RhbmNlO1xuXHRjb25zdCBrZXkgPSBhcmdzWzBdO1xuXHRjb25zdCBpbnN0YW5jZSA9IChfZ2V0Q3VycmVudEluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCkpID09PSBudWxsIHx8IF9nZXRDdXJyZW50SW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nZXRDdXJyZW50SW5zdGFuY2UucHJveHk7XG5cdGNvbnN0IG93bmVyID0gaW5zdGFuY2UgIT09IG51bGwgJiYgaW5zdGFuY2UgIT09IHZvaWQgMCA/IGluc3RhbmNlIDogZ2V0Q3VycmVudFNjb3BlKCk7XG5cdGlmIChvd25lciA9PSBudWxsICYmICFoYXNJbmplY3Rpb25Db250ZXh0KCkpIHRocm93IG5ldyBFcnJvcihcImluamVjdExvY2FsIG11c3QgYmUgY2FsbGVkIGluIHNldHVwXCIpO1xuXHRpZiAob3duZXIgJiYgbG9jYWxQcm92aWRlZFN0YXRlTWFwLmhhcyhvd25lcikgJiYga2V5IGluIGxvY2FsUHJvdmlkZWRTdGF0ZU1hcC5nZXQob3duZXIpKSByZXR1cm4gbG9jYWxQcm92aWRlZFN0YXRlTWFwLmdldChvd25lcilba2V5XTtcblx0cmV0dXJuIGluamVjdCguLi5hcmdzKTtcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHByb3ZpZGVMb2NhbC9pbmRleC50c1xuLyoqXG4qIE9uIHRoZSBiYXNpcyBvZiBgcHJvdmlkZWAsIGl0IGlzIGFsbG93ZWQgdG8gZGlyZWN0bHkgY2FsbCBpbmplY3QgdG8gb2J0YWluIHRoZSB2YWx1ZSBhZnRlciBjYWxsIHByb3ZpZGUgaW4gdGhlIHNhbWUgY29tcG9uZW50LlxuKlxuKiBAZXhhbXBsZVxuKiBgYGB0c1xuKiBwcm92aWRlTG9jYWwoJ015SW5qZWN0aW9uS2V5JywgMSlcbiogY29uc3QgaW5qZWN0ZWRWYWx1ZSA9IGluamVjdExvY2FsKCdNeUluamVjdGlvbktleScpIC8vIGluamVjdGVkVmFsdWUgPT09IDFcbiogYGBgXG4qL1xuZnVuY3Rpb24gcHJvdmlkZUxvY2FsKGtleSwgdmFsdWUpIHtcblx0dmFyIF9nZXRDdXJyZW50SW5zdGFuY2U7XG5cdGNvbnN0IGluc3RhbmNlID0gKF9nZXRDdXJyZW50SW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKSkgPT09IG51bGwgfHwgX2dldEN1cnJlbnRJbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dldEN1cnJlbnRJbnN0YW5jZS5wcm94eTtcblx0Y29uc3Qgb3duZXIgPSBpbnN0YW5jZSAhPT0gbnVsbCAmJiBpbnN0YW5jZSAhPT0gdm9pZCAwID8gaW5zdGFuY2UgOiBnZXRDdXJyZW50U2NvcGUoKTtcblx0aWYgKG93bmVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInByb3ZpZGVMb2NhbCBtdXN0IGJlIGNhbGxlZCBpbiBzZXR1cFwiKTtcblx0aWYgKCFsb2NhbFByb3ZpZGVkU3RhdGVNYXAuaGFzKG93bmVyKSkgbG9jYWxQcm92aWRlZFN0YXRlTWFwLnNldChvd25lciwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cdGNvbnN0IGxvY2FsUHJvdmlkZWRTdGF0ZSA9IGxvY2FsUHJvdmlkZWRTdGF0ZU1hcC5nZXQob3duZXIpO1xuXHRsb2NhbFByb3ZpZGVkU3RhdGVba2V5XSA9IHZhbHVlO1xuXHRyZXR1cm4gcHJvdmlkZShrZXksIHZhbHVlKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlSW5qZWN0aW9uU3RhdGUvaW5kZXgudHNcbi8qKlxuKiBDcmVhdGUgZ2xvYmFsIHN0YXRlIHRoYXQgY2FuIGJlIGluamVjdGVkIGludG8gY29tcG9uZW50cy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlSW5qZWN0aW9uU3RhdGVcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVJbmplY3Rpb25TdGF0ZShjb21wb3NhYmxlLCBvcHRpb25zKSB7XG5cdGNvbnN0IGtleSA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaW5qZWN0aW9uS2V5KSB8fCBTeW1ib2woY29tcG9zYWJsZS5uYW1lIHx8IFwiSW5qZWN0aW9uU3RhdGVcIik7XG5cdGNvbnN0IGRlZmF1bHRWYWx1ZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZWZhdWx0VmFsdWU7XG5cdGNvbnN0IHVzZVByb3ZpZGluZ1N0YXRlID0gKC4uLmFyZ3MpID0+IHtcblx0XHRjb25zdCBzdGF0ZSA9IGNvbXBvc2FibGUoLi4uYXJncyk7XG5cdFx0cHJvdmlkZUxvY2FsKGtleSwgc3RhdGUpO1xuXHRcdHJldHVybiBzdGF0ZTtcblx0fTtcblx0Y29uc3QgdXNlSW5qZWN0ZWRTdGF0ZSA9ICgpID0+IGluamVjdExvY2FsKGtleSwgZGVmYXVsdFZhbHVlKTtcblx0cmV0dXJuIFt1c2VQcm92aWRpbmdTdGF0ZSwgdXNlSW5qZWN0ZWRTdGF0ZV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGNyZWF0ZVJlZi9pbmRleC50c1xuLyoqXG4qIFJldHVybnMgYSBgZGVlcFJlZmAgb3IgYHNoYWxsb3dSZWZgIGRlcGVuZGluZyBvbiB0aGUgYGRlZXBgIHBhcmFtLlxuKlxuKiBAZXhhbXBsZSBjcmVhdGVSZWYoMSkgLy8gU2hhbGxvd1JlZjxudW1iZXI+XG4qIEBleGFtcGxlIGNyZWF0ZVJlZigxLCBmYWxzZSkgLy8gU2hhbGxvd1JlZjxudW1iZXI+XG4qIEBleGFtcGxlIGNyZWF0ZVJlZigxLCB0cnVlKSAvLyBSZWY8bnVtYmVyPlxuKiBAZXhhbXBsZSBjcmVhdGVSZWYoXCJzdHJpbmdcIikgLy8gU2hhbGxvd1JlZjxzdHJpbmc+XG4qIEBleGFtcGxlIGNyZWF0ZVJlZjxcIkFcInxcIkJcIj4oXCJBXCIsIHRydWUpIC8vIFJlZjxcIkFcInxcIkJcIj5cbipcbiogQHBhcmFtIHZhbHVlXG4qIEBwYXJhbSBkZWVwXG4qIEByZXR1cm5zIHRoZSBgZGVlcFJlZmAgb3IgYHNoYWxsb3dSZWZgXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gY3JlYXRlUmVmKHZhbHVlLCBkZWVwKSB7XG5cdGlmIChkZWVwID09PSB0cnVlKSByZXR1cm4gcmVmKHZhbHVlKTtcblx0ZWxzZSByZXR1cm4gc2hhbGxvd1JlZih2YWx1ZSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL2lzLnRzXG5jb25zdCBpc0NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xuY29uc3QgaXNXb3JrZXIgPSB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsVGhpcyBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlO1xuY29uc3QgaXNEZWYgPSAodmFsKSA9PiB0eXBlb2YgdmFsICE9PSBcInVuZGVmaW5lZFwiO1xuY29uc3Qgbm90TnVsbGlzaCA9ICh2YWwpID0+IHZhbCAhPSBudWxsO1xuY29uc3QgYXNzZXJ0ID0gKGNvbmRpdGlvbiwgLi4uaW5mb3MpID0+IHtcblx0aWYgKCFjb25kaXRpb24pIGNvbnNvbGUud2FybiguLi5pbmZvcyk7XG59O1xuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuY29uc3QgaXNPYmplY3QgPSAodmFsKSA9PiB0b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBPYmplY3RdXCI7XG5jb25zdCBub3cgPSAoKSA9PiBEYXRlLm5vdygpO1xuY29uc3QgdGltZXN0YW1wID0gKCkgPT4gK0RhdGUubm93KCk7XG5jb25zdCBjbGFtcCA9IChuLCBtaW4sIG1heCkgPT4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG4pKTtcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbmNvbnN0IHJhbmQgPSAobWluLCBtYXgpID0+IHtcblx0bWluID0gTWF0aC5jZWlsKG1pbik7XG5cdG1heCA9IE1hdGguZmxvb3IobWF4KTtcblx0cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG59O1xuY29uc3QgaGFzT3duID0gKHZhbCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsLCBrZXkpO1xuY29uc3QgaXNJT1MgPSAvKiBAX19QVVJFX18gKi8gZ2V0SXNJT1MoKTtcbmZ1bmN0aW9uIGdldElzSU9TKCkge1xuXHR2YXIgX3dpbmRvdywgX3dpbmRvdzIsIF93aW5kb3czO1xuXHRyZXR1cm4gaXNDbGllbnQgJiYgISEoKF93aW5kb3cgPSB3aW5kb3cpID09PSBudWxsIHx8IF93aW5kb3cgPT09IHZvaWQgMCB8fCAoX3dpbmRvdyA9IF93aW5kb3cubmF2aWdhdG9yKSA9PT0gbnVsbCB8fCBfd2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfd2luZG93LnVzZXJBZ2VudCkgJiYgKC9pUCg/OmFkfGhvbmV8b2QpLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSB8fCAoKF93aW5kb3cyID0gd2luZG93KSA9PT0gbnVsbCB8fCBfd2luZG93MiA9PT0gdm9pZCAwIHx8IChfd2luZG93MiA9IF93aW5kb3cyLm5hdmlnYXRvcikgPT09IG51bGwgfHwgX3dpbmRvdzIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3cyLm1heFRvdWNoUG9pbnRzKSA+IDIgJiYgL2lQYWR8TWFjaW50b3NoLy50ZXN0KChfd2luZG93MyA9IHdpbmRvdykgPT09IG51bGwgfHwgX3dpbmRvdzMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3czLm5hdmlnYXRvci51c2VyQWdlbnQpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdG9SZWYvaW5kZXgudHNcbmZ1bmN0aW9uIHRvUmVmKC4uLmFyZ3MpIHtcblx0aWYgKGFyZ3MubGVuZ3RoICE9PSAxKSByZXR1cm4gdG9SZWYkMSguLi5hcmdzKTtcblx0Y29uc3QgciA9IGFyZ3NbMF07XG5cdHJldHVybiB0eXBlb2YgciA9PT0gXCJmdW5jdGlvblwiID8gcmVhZG9ubHkoY3VzdG9tUmVmKCgpID0+ICh7XG5cdFx0Z2V0OiByLFxuXHRcdHNldDogbm9vcFxuXHR9KSkpIDogcmVmKHIpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1dGlscy9maWx0ZXJzLnRzXG4vKipcbiogQGludGVybmFsXG4qL1xuZnVuY3Rpb24gY3JlYXRlRmlsdGVyV3JhcHBlcihmaWx0ZXIsIGZuKSB7XG5cdGZ1bmN0aW9uIHdyYXBwZXIoLi4uYXJncykge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRQcm9taXNlLnJlc29sdmUoZmlsdGVyKCgpID0+IGZuLmFwcGx5KHRoaXMsIGFyZ3MpLCB7XG5cdFx0XHRcdGZuLFxuXHRcdFx0XHR0aGlzQXJnOiB0aGlzLFxuXHRcdFx0XHRhcmdzXG5cdFx0XHR9KSkudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB3cmFwcGVyO1xufVxuY29uc3QgYnlwYXNzRmlsdGVyID0gKGludm9rZSQxKSA9PiB7XG5cdHJldHVybiBpbnZva2UkMSgpO1xufTtcbi8qKlxuKiBDcmVhdGUgYW4gRXZlbnRGaWx0ZXIgdGhhdCBkZWJvdW5jZSB0aGUgZXZlbnRzXG4qL1xuZnVuY3Rpb24gZGVib3VuY2VGaWx0ZXIobXMsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgdGltZXI7XG5cdGxldCBtYXhUaW1lcjtcblx0bGV0IGxhc3RSZWplY3RvciA9IG5vb3A7XG5cdGNvbnN0IF9jbGVhclRpbWVvdXQgPSAodGltZXIkMSkgPT4ge1xuXHRcdGNsZWFyVGltZW91dCh0aW1lciQxKTtcblx0XHRsYXN0UmVqZWN0b3IoKTtcblx0XHRsYXN0UmVqZWN0b3IgPSBub29wO1xuXHR9O1xuXHRsZXQgbGFzdEludm9rZXI7XG5cdGNvbnN0IGZpbHRlciA9IChpbnZva2UkMSkgPT4ge1xuXHRcdGNvbnN0IGR1cmF0aW9uID0gdG9WYWx1ZShtcyk7XG5cdFx0Y29uc3QgbWF4RHVyYXRpb24gPSB0b1ZhbHVlKG9wdGlvbnMubWF4V2FpdCk7XG5cdFx0aWYgKHRpbWVyKSBfY2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRpZiAoZHVyYXRpb24gPD0gMCB8fCBtYXhEdXJhdGlvbiAhPT0gdm9pZCAwICYmIG1heER1cmF0aW9uIDw9IDApIHtcblx0XHRcdGlmIChtYXhUaW1lcikge1xuXHRcdFx0XHRfY2xlYXJUaW1lb3V0KG1heFRpbWVyKTtcblx0XHRcdFx0bWF4VGltZXIgPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGludm9rZSQxKCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0bGFzdFJlamVjdG9yID0gb3B0aW9ucy5yZWplY3RPbkNhbmNlbCA/IHJlamVjdCA6IHJlc29sdmU7XG5cdFx0XHRsYXN0SW52b2tlciA9IGludm9rZSQxO1xuXHRcdFx0aWYgKG1heER1cmF0aW9uICYmICFtYXhUaW1lcikgbWF4VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0aWYgKHRpbWVyKSBfY2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdFx0bWF4VGltZXIgPSB2b2lkIDA7XG5cdFx0XHRcdHJlc29sdmUobGFzdEludm9rZXIoKSk7XG5cdFx0XHR9LCBtYXhEdXJhdGlvbik7XG5cdFx0XHR0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAobWF4VGltZXIpIF9jbGVhclRpbWVvdXQobWF4VGltZXIpO1xuXHRcdFx0XHRtYXhUaW1lciA9IHZvaWQgMDtcblx0XHRcdFx0cmVzb2x2ZShpbnZva2UkMSgpKTtcblx0XHRcdH0sIGR1cmF0aW9uKTtcblx0XHR9KTtcblx0fTtcblx0cmV0dXJuIGZpbHRlcjtcbn1cbmZ1bmN0aW9uIHRocm90dGxlRmlsdGVyKC4uLmFyZ3MpIHtcblx0bGV0IGxhc3RFeGVjID0gMDtcblx0bGV0IHRpbWVyO1xuXHRsZXQgaXNMZWFkaW5nID0gdHJ1ZTtcblx0bGV0IGxhc3RSZWplY3RvciA9IG5vb3A7XG5cdGxldCBsYXN0VmFsdWU7XG5cdGxldCBtcztcblx0bGV0IHRyYWlsaW5nO1xuXHRsZXQgbGVhZGluZztcblx0bGV0IHJlamVjdE9uQ2FuY2VsO1xuXHRpZiAoIWlzUmVmKGFyZ3NbMF0pICYmIHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiKSAoe2RlbGF5OiBtcywgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSwgcmVqZWN0T25DYW5jZWwgPSBmYWxzZX0gPSBhcmdzWzBdKTtcblx0ZWxzZSBbbXMsIHRyYWlsaW5nID0gdHJ1ZSwgbGVhZGluZyA9IHRydWUsIHJlamVjdE9uQ2FuY2VsID0gZmFsc2VdID0gYXJncztcblx0Y29uc3QgY2xlYXIgPSAoKSA9PiB7XG5cdFx0aWYgKHRpbWVyKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0dGltZXIgPSB2b2lkIDA7XG5cdFx0XHRsYXN0UmVqZWN0b3IoKTtcblx0XHRcdGxhc3RSZWplY3RvciA9IG5vb3A7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBmaWx0ZXIgPSAoX2ludm9rZSkgPT4ge1xuXHRcdGNvbnN0IGR1cmF0aW9uID0gdG9WYWx1ZShtcyk7XG5cdFx0Y29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSBsYXN0RXhlYztcblx0XHRjb25zdCBpbnZva2UkMSA9ICgpID0+IHtcblx0XHRcdHJldHVybiBsYXN0VmFsdWUgPSBfaW52b2tlKCk7XG5cdFx0fTtcblx0XHRjbGVhcigpO1xuXHRcdGlmIChkdXJhdGlvbiA8PSAwKSB7XG5cdFx0XHRsYXN0RXhlYyA9IERhdGUubm93KCk7XG5cdFx0XHRyZXR1cm4gaW52b2tlJDEoKTtcblx0XHR9XG5cdFx0aWYgKGVsYXBzZWQgPiBkdXJhdGlvbikge1xuXHRcdFx0bGFzdEV4ZWMgPSBEYXRlLm5vdygpO1xuXHRcdFx0aWYgKGxlYWRpbmcgfHwgIWlzTGVhZGluZykgaW52b2tlJDEoKTtcblx0XHR9IGVsc2UgaWYgKHRyYWlsaW5nKSBsYXN0VmFsdWUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRsYXN0UmVqZWN0b3IgPSByZWplY3RPbkNhbmNlbCA/IHJlamVjdCA6IHJlc29sdmU7XG5cdFx0XHR0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRsYXN0RXhlYyA9IERhdGUubm93KCk7XG5cdFx0XHRcdGlzTGVhZGluZyA9IHRydWU7XG5cdFx0XHRcdHJlc29sdmUoaW52b2tlJDEoKSk7XG5cdFx0XHRcdGNsZWFyKCk7XG5cdFx0XHR9LCBNYXRoLm1heCgwLCBkdXJhdGlvbiAtIGVsYXBzZWQpKTtcblx0XHR9KTtcblx0XHRpZiAoIWxlYWRpbmcgJiYgIXRpbWVyKSB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gaXNMZWFkaW5nID0gdHJ1ZSwgZHVyYXRpb24pO1xuXHRcdGlzTGVhZGluZyA9IGZhbHNlO1xuXHRcdHJldHVybiBsYXN0VmFsdWU7XG5cdH07XG5cdHJldHVybiBmaWx0ZXI7XG59XG4vKipcbiogRXZlbnRGaWx0ZXIgdGhhdCBnaXZlcyBleHRyYSBjb250cm9scyB0byBwYXVzZSBhbmQgcmVzdW1lIHRoZSBmaWx0ZXJcbipcbiogQHBhcmFtIGV4dGVuZEZpbHRlciAgRXh0cmEgZmlsdGVyIHRvIGFwcGx5IHdoZW4gdGhlIFBhdXNhYmxlRmlsdGVyIGlzIGFjdGl2ZSwgZGVmYXVsdCB0byBub25lXG4qIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBmaWx0ZXJcbiovXG5mdW5jdGlvbiBwYXVzYWJsZUZpbHRlcihleHRlbmRGaWx0ZXIgPSBieXBhc3NGaWx0ZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluaXRpYWxTdGF0ZSA9IFwiYWN0aXZlXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzQWN0aXZlID0gdG9SZWYoaW5pdGlhbFN0YXRlID09PSBcImFjdGl2ZVwiKTtcblx0ZnVuY3Rpb24gcGF1c2UoKSB7XG5cdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoKSB7XG5cdFx0aXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuXHR9XG5cdGNvbnN0IGV2ZW50RmlsdGVyID0gKC4uLmFyZ3MpID0+IHtcblx0XHRpZiAoaXNBY3RpdmUudmFsdWUpIGV4dGVuZEZpbHRlciguLi5hcmdzKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc0FjdGl2ZTogcmVhZG9ubHkoaXNBY3RpdmUpLFxuXHRcdHBhdXNlLFxuXHRcdHJlc3VtZSxcblx0XHRldmVudEZpbHRlclxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1dGlscy9nZW5lcmFsLnRzXG5mdW5jdGlvbiBwcm9taXNlVGltZW91dChtcywgdGhyb3dPblRpbWVvdXQgPSBmYWxzZSwgcmVhc29uID0gXCJUaW1lb3V0XCIpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRpZiAodGhyb3dPblRpbWVvdXQpIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KHJlYXNvbiksIG1zKTtcblx0XHRlbHNlIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuXHR9KTtcbn1cbmZ1bmN0aW9uIGlkZW50aXR5KGFyZykge1xuXHRyZXR1cm4gYXJnO1xufVxuLyoqXG4qIENyZWF0ZSBzaW5nbGV0b24gcHJvbWlzZSBmdW5jdGlvblxuKlxuKiBAZXhhbXBsZVxuKiBgYGBcbiogY29uc3QgcHJvbWlzZSA9IGNyZWF0ZVNpbmdsZXRvblByb21pc2UoYXN5bmMgKCkgPT4geyAuLi4gfSlcbipcbiogYXdhaXQgcHJvbWlzZSgpXG4qIGF3YWl0IHByb21pc2UoKSAvLyBhbGwgb2YgdGhlbSB3aWxsIGJlIGJpbmQgdG8gYSBzaW5nbGUgcHJvbWlzZSBpbnN0YW5jZVxuKiBhd2FpdCBwcm9taXNlKCkgLy8gYW5kIGJlIHJlc29sdmVkIHRvZ2V0aGVyXG4qIGBgYFxuKi9cbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZXRvblByb21pc2UoZm4pIHtcblx0bGV0IF9wcm9taXNlO1xuXHRmdW5jdGlvbiB3cmFwcGVyKCkge1xuXHRcdGlmICghX3Byb21pc2UpIF9wcm9taXNlID0gZm4oKTtcblx0XHRyZXR1cm4gX3Byb21pc2U7XG5cdH1cblx0d3JhcHBlci5yZXNldCA9IGFzeW5jICgpID0+IHtcblx0XHRjb25zdCBfcHJldiA9IF9wcm9taXNlO1xuXHRcdF9wcm9taXNlID0gdm9pZCAwO1xuXHRcdGlmIChfcHJldikgYXdhaXQgX3ByZXY7XG5cdH07XG5cdHJldHVybiB3cmFwcGVyO1xufVxuZnVuY3Rpb24gaW52b2tlKGZuKSB7XG5cdHJldHVybiBmbigpO1xufVxuZnVuY3Rpb24gY29udGFpbnNQcm9wKG9iaiwgLi4ucHJvcHMpIHtcblx0cmV0dXJuIHByb3BzLnNvbWUoKGspID0+IGsgaW4gb2JqKTtcbn1cbmZ1bmN0aW9uIGluY3JlYXNlV2l0aFVuaXQodGFyZ2V0LCBkZWx0YSkge1xuXHR2YXIgX3RhcmdldCRtYXRjaDtcblx0aWYgKHR5cGVvZiB0YXJnZXQgPT09IFwibnVtYmVyXCIpIHJldHVybiB0YXJnZXQgKyBkZWx0YTtcblx0Y29uc3QgdmFsdWUgPSAoKF90YXJnZXQkbWF0Y2ggPSB0YXJnZXQubWF0Y2goL14tP1xcZCtcXC4/XFxkKi8pKSA9PT0gbnVsbCB8fCBfdGFyZ2V0JG1hdGNoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGFyZ2V0JG1hdGNoWzBdKSB8fCBcIlwiO1xuXHRjb25zdCB1bml0ID0gdGFyZ2V0LnNsaWNlKHZhbHVlLmxlbmd0aCk7XG5cdGNvbnN0IHJlc3VsdCA9IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSArIGRlbHRhO1xuXHRpZiAoTnVtYmVyLmlzTmFOKHJlc3VsdCkpIHJldHVybiB0YXJnZXQ7XG5cdHJldHVybiByZXN1bHQgKyB1bml0O1xufVxuLyoqXG4qIEdldCBhIHB4IHZhbHVlIGZvciBTU1IgdXNlLCBkbyBub3QgcmVseSBvbiB0aGlzIG1ldGhvZCBvdXRzaWRlIG9mIFNTUiBhcyBSRU0gdW5pdCBpcyBhc3N1bWVkIGF0IDE2cHgsIHdoaWNoIG1pZ2h0IG5vdCBiZSB0aGUgY2FzZSBvbiB0aGUgY2xpZW50XG4qL1xuZnVuY3Rpb24gcHhWYWx1ZShweCkge1xuXHRyZXR1cm4gcHguZW5kc1dpdGgoXCJyZW1cIikgPyBOdW1iZXIucGFyc2VGbG9hdChweCkgKiAxNiA6IE51bWJlci5wYXJzZUZsb2F0KHB4KTtcbn1cbi8qKlxuKiBDcmVhdGUgYSBuZXcgc3Vic2V0IG9iamVjdCBieSBnaXZpbmcga2V5c1xuKi9cbmZ1bmN0aW9uIG9iamVjdFBpY2sob2JqLCBrZXlzLCBvbWl0VW5kZWZpbmVkID0gZmFsc2UpIHtcblx0cmV0dXJuIGtleXMucmVkdWNlKChuLCBrKSA9PiB7XG5cdFx0aWYgKGsgaW4gb2JqKSB7XG5cdFx0XHRpZiAoIW9taXRVbmRlZmluZWQgfHwgb2JqW2tdICE9PSB2b2lkIDApIG5ba10gPSBvYmpba107XG5cdFx0fVxuXHRcdHJldHVybiBuO1xuXHR9LCB7fSk7XG59XG4vKipcbiogQ3JlYXRlIGEgbmV3IHN1YnNldCBvYmplY3QgYnkgb21pdCBnaXZpbmcga2V5c1xuKi9cbmZ1bmN0aW9uIG9iamVjdE9taXQob2JqLCBrZXlzLCBvbWl0VW5kZWZpbmVkID0gZmFsc2UpIHtcblx0cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhvYmopLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB7XG5cdFx0cmV0dXJuICghb21pdFVuZGVmaW5lZCB8fCB2YWx1ZSAhPT0gdm9pZCAwKSAmJiAha2V5cy5pbmNsdWRlcyhrZXkpO1xuXHR9KSk7XG59XG5mdW5jdGlvbiBvYmplY3RFbnRyaWVzKG9iaikge1xuXHRyZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqKTtcbn1cbmZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1dGlscy9wb3J0LnRzXG5mdW5jdGlvbiBjYWNoZVN0cmluZ0Z1bmN0aW9uKGZuKSB7XG5cdGNvbnN0IGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0cmV0dXJuICgoc3RyKSA9PiB7XG5cdFx0cmV0dXJuIGNhY2hlW3N0cl0gfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKTtcblx0fSk7XG59XG5jb25zdCBoeXBoZW5hdGVSRSA9IC9cXEIoW0EtWl0pL2c7XG5jb25zdCBoeXBoZW5hdGUgPSBjYWNoZVN0cmluZ0Z1bmN0aW9uKChzdHIpID0+IHN0ci5yZXBsYWNlKGh5cGhlbmF0ZVJFLCBcIi0kMVwiKS50b0xvd2VyQ2FzZSgpKTtcbmNvbnN0IGNhbWVsaXplUkUgPSAvLShcXHcpL2c7XG5jb25zdCBjYW1lbGl6ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4ge1xuXHRyZXR1cm4gc3RyLnJlcGxhY2UoY2FtZWxpemVSRSwgKF8sIGMpID0+IGMgPyBjLnRvVXBwZXJDYXNlKCkgOiBcIlwiKTtcbn0pO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1dGlscy92dWUudHNcbmZ1bmN0aW9uIGdldExpZmVDeWNsZVRhcmdldCh0YXJnZXQpIHtcblx0cmV0dXJuIHRhcmdldCB8fCBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlU2hhcmVkQ29tcG9zYWJsZS9pbmRleC50c1xuLyoqXG4qIE1ha2UgYSBjb21wb3NhYmxlIGZ1bmN0aW9uIHVzYWJsZSB3aXRoIG11bHRpcGxlIFZ1ZSBpbnN0YW5jZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZVNoYXJlZENvbXBvc2FibGVcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVTaGFyZWRDb21wb3NhYmxlKGNvbXBvc2FibGUpIHtcblx0aWYgKCFpc0NsaWVudCkgcmV0dXJuIGNvbXBvc2FibGU7XG5cdGxldCBzdWJzY3JpYmVycyA9IDA7XG5cdGxldCBzdGF0ZTtcblx0bGV0IHNjb3BlO1xuXHRjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuXHRcdHN1YnNjcmliZXJzIC09IDE7XG5cdFx0aWYgKHNjb3BlICYmIHN1YnNjcmliZXJzIDw9IDApIHtcblx0XHRcdHNjb3BlLnN0b3AoKTtcblx0XHRcdHN0YXRlID0gdm9pZCAwO1xuXHRcdFx0c2NvcGUgPSB2b2lkIDA7XG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gKCguLi5hcmdzKSA9PiB7XG5cdFx0c3Vic2NyaWJlcnMgKz0gMTtcblx0XHRpZiAoIXNjb3BlKSB7XG5cdFx0XHRzY29wZSA9IGVmZmVjdFNjb3BlKHRydWUpO1xuXHRcdFx0c3RhdGUgPSBzY29wZS5ydW4oKCkgPT4gY29tcG9zYWJsZSguLi5hcmdzKSk7XG5cdFx0fVxuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKGRpc3Bvc2UpO1xuXHRcdHJldHVybiBzdGF0ZTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGV4dGVuZFJlZi9pbmRleC50c1xuZnVuY3Rpb24gZXh0ZW5kUmVmKHJlZiQxLCBleHRlbmQsIHsgZW51bWVyYWJsZSA9IGZhbHNlLCB1bndyYXAgPSB0cnVlIH0gPSB7fSkge1xuXHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHRlbmQpKSB7XG5cdFx0aWYgKGtleSA9PT0gXCJ2YWx1ZVwiKSBjb250aW51ZTtcblx0XHRpZiAoaXNSZWYodmFsdWUpICYmIHVud3JhcCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlZiQxLCBrZXksIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlLnZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldCh2KSB7XG5cdFx0XHRcdHZhbHVlLnZhbHVlID0gdjtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlXG5cdFx0fSk7XG5cdFx0ZWxzZSBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVmJDEsIGtleSwge1xuXHRcdFx0dmFsdWUsXG5cdFx0XHRlbnVtZXJhYmxlXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHJlZiQxO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBnZXQvaW5kZXgudHNcbmZ1bmN0aW9uIGdldChvYmosIGtleSkge1xuXHRpZiAoa2V5ID09IG51bGwpIHJldHVybiB1bnJlZihvYmopO1xuXHRyZXR1cm4gdW5yZWYob2JqKVtrZXldO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBpc0RlZmluZWQvaW5kZXgudHNcbmZ1bmN0aW9uIGlzRGVmaW5lZCh2KSB7XG5cdHJldHVybiB1bnJlZih2KSAhPSBudWxsO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBtYWtlRGVzdHJ1Y3R1cmFibGUvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiBtYWtlRGVzdHJ1Y3R1cmFibGUob2JqLCBhcnIpIHtcblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRjb25zdCBjbG9uZSA9IHsgLi4ub2JqIH07XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb25lLCBTeW1ib2wuaXRlcmF0b3IsIHtcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0dmFsdWUoKSB7XG5cdFx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRcdHJldHVybiB7IG5leHQ6ICgpID0+ICh7XG5cdFx0XHRcdFx0dmFsdWU6IGFycltpbmRleCsrXSxcblx0XHRcdFx0XHRkb25lOiBpbmRleCA+IGFyci5sZW5ndGhcblx0XHRcdFx0fSkgfTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0gZWxzZSByZXR1cm4gT2JqZWN0LmFzc2lnbihbLi4uYXJyXSwgb2JqKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpZnkvaW5kZXgudHNcbi8qKlxuKiBDb252ZXJ0cyBwbGFpbiBmdW5jdGlvbiBpbnRvIGEgcmVhY3RpdmUgZnVuY3Rpb24uXG4qIFRoZSBjb252ZXJ0ZWQgZnVuY3Rpb24gYWNjZXB0cyByZWZzIGFzIGl0J3MgYXJndW1lbnRzXG4qIGFuZCByZXR1cm5zIGEgQ29tcHV0ZWRSZWYsIHdpdGggcHJvcGVyIHR5cGluZy5cbipcbiogQHBhcmFtIGZuIC0gU291cmNlIGZ1bmN0aW9uXG4qIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHJlYWN0aWZ5KGZuLCBvcHRpb25zKSB7XG5cdGNvbnN0IHVucmVmRm4gPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbXB1dGVkR2V0dGVyKSA9PT0gZmFsc2UgPyB1bnJlZiA6IHRvVmFsdWU7XG5cdHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG5cdFx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IGZuLmFwcGx5KHRoaXMsIGFyZ3MubWFwKChpKSA9PiB1bnJlZkZuKGkpKSkpO1xuXHR9O1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVhY3RpZnlgIGluc3RlYWQgKi9cbmNvbnN0IGNyZWF0ZVJlYWN0aXZlRm4gPSByZWFjdGlmeTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpZnlPYmplY3QvaW5kZXgudHNcbi8qKlxuKiBBcHBseSBgcmVhY3RpZnlgIHRvIGFuIG9iamVjdFxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHJlYWN0aWZ5T2JqZWN0KG9iaiwgb3B0aW9uc09yS2V5cyA9IHt9KSB7XG5cdGxldCBrZXlzID0gW107XG5cdGxldCBvcHRpb25zO1xuXHRpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zT3JLZXlzKSkga2V5cyA9IG9wdGlvbnNPcktleXM7XG5cdGVsc2Uge1xuXHRcdG9wdGlvbnMgPSBvcHRpb25zT3JLZXlzO1xuXHRcdGNvbnN0IHsgaW5jbHVkZU93blByb3BlcnRpZXMgPSB0cnVlIH0gPSBvcHRpb25zT3JLZXlzO1xuXHRcdGtleXMucHVzaCguLi5PYmplY3Qua2V5cyhvYmopKTtcblx0XHRpZiAoaW5jbHVkZU93blByb3BlcnRpZXMpIGtleXMucHVzaCguLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopKTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGtleXMubWFwKChrZXkpID0+IHtcblx0XHRjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuXHRcdHJldHVybiBba2V5LCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHJlYWN0aWZ5KHZhbHVlLmJpbmQob2JqKSwgb3B0aW9ucykgOiB2YWx1ZV07XG5cdH0pKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdG9SZWFjdGl2ZS9pbmRleC50c1xuLyoqXG4qIENvbnZlcnRzIHJlZiB0byByZWFjdGl2ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdG9SZWFjdGl2ZVxuKiBAcGFyYW0gb2JqZWN0UmVmIEEgcmVmIG9mIG9iamVjdFxuKi9cbmZ1bmN0aW9uIHRvUmVhY3RpdmUob2JqZWN0UmVmKSB7XG5cdGlmICghaXNSZWYob2JqZWN0UmVmKSkgcmV0dXJuIHJlYWN0aXZlKG9iamVjdFJlZik7XG5cdHJldHVybiByZWFjdGl2ZShuZXcgUHJveHkoe30sIHtcblx0XHRnZXQoXywgcCwgcmVjZWl2ZXIpIHtcblx0XHRcdHJldHVybiB1bnJlZihSZWZsZWN0LmdldChvYmplY3RSZWYudmFsdWUsIHAsIHJlY2VpdmVyKSk7XG5cdFx0fSxcblx0XHRzZXQoXywgcCwgdmFsdWUpIHtcblx0XHRcdGlmIChpc1JlZihvYmplY3RSZWYudmFsdWVbcF0pICYmICFpc1JlZih2YWx1ZSkpIG9iamVjdFJlZi52YWx1ZVtwXS52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0ZWxzZSBvYmplY3RSZWYudmFsdWVbcF0gPSB2YWx1ZTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdFx0ZGVsZXRlUHJvcGVydHkoXywgcCkge1xuXHRcdFx0cmV0dXJuIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkob2JqZWN0UmVmLnZhbHVlLCBwKTtcblx0XHR9LFxuXHRcdGhhcyhfLCBwKSB7XG5cdFx0XHRyZXR1cm4gUmVmbGVjdC5oYXMob2JqZWN0UmVmLnZhbHVlLCBwKTtcblx0XHR9LFxuXHRcdG93bktleXMoKSB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0UmVmLnZhbHVlKTtcblx0XHR9LFxuXHRcdGdldE93blByb3BlcnR5RGVzY3JpcHRvcigpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdH0pKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpdmVDb21wdXRlZC9pbmRleC50c1xuLyoqXG4qIENvbXB1dGVkIHJlYWN0aXZlIG9iamVjdC5cbiovXG5mdW5jdGlvbiByZWFjdGl2ZUNvbXB1dGVkKGZuKSB7XG5cdHJldHVybiB0b1JlYWN0aXZlKGNvbXB1dGVkKGZuKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHJlYWN0aXZlT21pdC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgb21pdCBmaWVsZHMgZnJvbSBhIHJlYWN0aXZlIG9iamVjdFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9yZWFjdGl2ZU9taXRcbiovXG5mdW5jdGlvbiByZWFjdGl2ZU9taXQob2JqLCAuLi5rZXlzKSB7XG5cdGNvbnN0IGZsYXRLZXlzID0ga2V5cy5mbGF0KCk7XG5cdGNvbnN0IHByZWRpY2F0ZSA9IGZsYXRLZXlzWzBdO1xuXHRyZXR1cm4gcmVhY3RpdmVDb21wdXRlZCgoKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSBcImZ1bmN0aW9uXCIgPyBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModG9SZWZzJDEob2JqKSkuZmlsdGVyKChbaywgdl0pID0+ICFwcmVkaWNhdGUodG9WYWx1ZSh2KSwgaykpKSA6IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0b1JlZnMkMShvYmopKS5maWx0ZXIoKGUpID0+ICFmbGF0S2V5cy5pbmNsdWRlcyhlWzBdKSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpdmVQaWNrL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBwaWNrIGZpZWxkcyBmcm9tIGEgcmVhY3RpdmUgb2JqZWN0XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3JlYWN0aXZlUGlja1xuKi9cbmZ1bmN0aW9uIHJlYWN0aXZlUGljayhvYmosIC4uLmtleXMpIHtcblx0Y29uc3QgZmxhdEtleXMgPSBrZXlzLmZsYXQoKTtcblx0Y29uc3QgcHJlZGljYXRlID0gZmxhdEtleXNbMF07XG5cdHJldHVybiByZWFjdGl2ZUNvbXB1dGVkKCgpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09IFwiZnVuY3Rpb25cIiA/IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0b1JlZnMkMShvYmopKS5maWx0ZXIoKFtrLCB2XSkgPT4gcHJlZGljYXRlKHRvVmFsdWUodiksIGspKSkgOiBPYmplY3QuZnJvbUVudHJpZXMoZmxhdEtleXMubWFwKChrKSA9PiBbaywgdG9SZWYob2JqLCBrKV0pKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHJlZkF1dG9SZXNldC9pbmRleC50c1xuLyoqXG4qIENyZWF0ZSBhIHJlZiB3aGljaCB3aWxsIGJlIHJlc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlIGFmdGVyIHNvbWUgdGltZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvcmVmQXV0b1Jlc2V0XG4qIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHdoaWNoIHdpbGwgYmUgc2V0LlxuKiBAcGFyYW0gYWZ0ZXJNcyAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiovXG5mdW5jdGlvbiByZWZBdXRvUmVzZXQoZGVmYXVsdFZhbHVlLCBhZnRlck1zID0gMWU0KSB7XG5cdHJldHVybiBjdXN0b21SZWYoKHRyYWNrLCB0cmlnZ2VyKSA9PiB7XG5cdFx0bGV0IHZhbHVlID0gdG9WYWx1ZShkZWZhdWx0VmFsdWUpO1xuXHRcdGxldCB0aW1lcjtcblx0XHRjb25zdCByZXNldEFmdGVyID0gKCkgPT4gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR2YWx1ZSA9IHRvVmFsdWUoZGVmYXVsdFZhbHVlKTtcblx0XHRcdHRyaWdnZXIoKTtcblx0XHR9LCB0b1ZhbHVlKGFmdGVyTXMpKTtcblx0XHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdHRyYWNrKCk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQobmV3VmFsdWUpIHtcblx0XHRcdFx0dmFsdWUgPSBuZXdWYWx1ZTtcblx0XHRcdFx0dHJpZ2dlcigpO1xuXHRcdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0XHR0aW1lciA9IHJlc2V0QWZ0ZXIoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHJlZkF1dG9SZXNldGAgaW5zdGVhZCAqL1xuY29uc3QgYXV0b1Jlc2V0UmVmID0gcmVmQXV0b1Jlc2V0O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEZWJvdW5jZUZuL2luZGV4LnRzXG4vKipcbiogRGVib3VuY2UgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURlYm91bmNlRm5cbiogQHBhcmFtICBmbiAgICAgICAgICBBIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGRlbGF5IG1pbGxpc2Vjb25kcyBkZWJvdW5jZWQuXG4qIEBwYXJhbSAgbXMgICAgICAgICAgQSB6ZXJvLW9yLWdyZWF0ZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBGb3IgZXZlbnQgY2FsbGJhY2tzLCB2YWx1ZXMgYXJvdW5kIDEwMCBvciAyNTAgKG9yIGV2ZW4gaGlnaGVyKSBhcmUgbW9zdCB1c2VmdWwuXG4qIEBwYXJhbSAgb3B0aW9ucyAgICAgT3B0aW9uc1xuKlxuKiBAcmV0dXJuIEEgbmV3LCBkZWJvdW5jZSwgZnVuY3Rpb24uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlRGVib3VuY2VGbihmbiwgbXMgPSAyMDAsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gY3JlYXRlRmlsdGVyV3JhcHBlcihkZWJvdW5jZUZpbHRlcihtcywgb3B0aW9ucyksIGZuKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVmRGVib3VuY2VkL2luZGV4LnRzXG4vKipcbiogRGVib3VuY2UgdXBkYXRlcyBvZiBhIHJlZi5cbipcbiogQHJldHVybiBBIG5ldyBkZWJvdW5jZWQgcmVmLlxuKi9cbmZ1bmN0aW9uIHJlZkRlYm91bmNlZCh2YWx1ZSwgbXMgPSAyMDAsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBkZWJvdW5jZWQgPSByZWYodG9WYWx1ZSh2YWx1ZSkpO1xuXHRjb25zdCB1cGRhdGVyID0gdXNlRGVib3VuY2VGbigoKSA9PiB7XG5cdFx0ZGVib3VuY2VkLnZhbHVlID0gdmFsdWUudmFsdWU7XG5cdH0sIG1zLCBvcHRpb25zKTtcblx0d2F0Y2godmFsdWUsICgpID0+IHVwZGF0ZXIoKSk7XG5cdHJldHVybiBzaGFsbG93UmVhZG9ubHkoZGVib3VuY2VkKTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHJlZkRlYm91bmNlZGAgaW5zdGVhZCAqL1xuY29uc3QgZGVib3VuY2VkUmVmID0gcmVmRGVib3VuY2VkO1xuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmRGVib3VuY2VkYCBpbnN0ZWFkICovXG5jb25zdCB1c2VEZWJvdW5jZSA9IHJlZkRlYm91bmNlZDtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVmRGVmYXVsdC9pbmRleC50c1xuLyoqXG4qIEFwcGx5IGRlZmF1bHQgdmFsdWUgdG8gYSByZWYuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVmRGVmYXVsdChzb3VyY2UsIGRlZmF1bHRWYWx1ZSkge1xuXHRyZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHZhciBfc291cmNlJHZhbHVlO1xuXHRcdFx0cmV0dXJuIChfc291cmNlJHZhbHVlID0gc291cmNlLnZhbHVlKSAhPT0gbnVsbCAmJiBfc291cmNlJHZhbHVlICE9PSB2b2lkIDAgPyBfc291cmNlJHZhbHVlIDogZGVmYXVsdFZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHRzb3VyY2UudmFsdWUgPSB2YWx1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZNYW51YWxSZXNldC9pbmRleC50c1xuLyoqXG4qIENyZWF0ZSBhIHJlZiB3aXRoIG1hbnVhbCByZXNldCBmdW5jdGlvbmFsaXR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9yZWZNYW51YWxSZXNldFxuKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB3aGljaCB3aWxsIGJlIHNldC5cbiovXG5mdW5jdGlvbiByZWZNYW51YWxSZXNldChkZWZhdWx0VmFsdWUpIHtcblx0bGV0IHZhbHVlID0gdG9WYWx1ZShkZWZhdWx0VmFsdWUpO1xuXHRsZXQgdHJpZ2dlcjtcblx0Y29uc3QgcmVzZXQgPSAoKSA9PiB7XG5cdFx0dmFsdWUgPSB0b1ZhbHVlKGRlZmF1bHRWYWx1ZSk7XG5cdFx0dHJpZ2dlcigpO1xuXHR9O1xuXHRjb25zdCByZWZWYWx1ZSA9IGN1c3RvbVJlZigodHJhY2ssIF90cmlnZ2VyKSA9PiB7XG5cdFx0dHJpZ2dlciA9IF90cmlnZ2VyO1xuXHRcdHJldHVybiB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdHRyYWNrKCk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQobmV3VmFsdWUpIHtcblx0XHRcdFx0dmFsdWUgPSBuZXdWYWx1ZTtcblx0XHRcdFx0dHJpZ2dlcigpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xuXHRyZWZWYWx1ZS5yZXNldCA9IHJlc2V0O1xuXHRyZXR1cm4gcmVmVmFsdWU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRocm90dGxlRm4vaW5kZXgudHNcbi8qKlxuKiBUaHJvdHRsZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi4gRXNwZWNpYWxseSB1c2VmdWwgZm9yIHJhdGUgbGltaXRpbmdcbiogZXhlY3V0aW9uIG9mIGhhbmRsZXJzIG9uIGV2ZW50cyBsaWtlIHJlc2l6ZSBhbmQgc2Nyb2xsLlxuKlxuKiBAcGFyYW0gICBmbiAgICAgICAgICAgICBBIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGRlbGF5IG1pbGxpc2Vjb25kcy4gVGhlIGB0aGlzYCBjb250ZXh0IGFuZCBhbGwgYXJndW1lbnRzIGFyZSBwYXNzZWQgdGhyb3VnaCwgYXMtaXMsXG4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYGNhbGxiYWNrYCB3aGVuIHRoZSB0aHJvdHRsZWQtZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG4qIEBwYXJhbSAgIG1zICAgICAgICAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gRm9yIGV2ZW50IGNhbGxiYWNrcywgdmFsdWVzIGFyb3VuZCAxMDAgb3IgMjUwIChvciBldmVuIGhpZ2hlcikgYXJlIG1vc3QgdXNlZnVsLlxuKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHZhbHVlOiAyMDApXG4qXG4qIEBwYXJhbSBbdHJhaWxpbmddIGlmIHRydWUsIGNhbGwgZm4gYWdhaW4gYWZ0ZXIgdGhlIHRpbWUgaXMgdXAgKGRlZmF1bHQgdmFsdWU6IGZhbHNlKVxuKlxuKiBAcGFyYW0gW2xlYWRpbmddIGlmIHRydWUsIGNhbGwgZm4gb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgbXMgdGltZW91dCAoZGVmYXVsdCB2YWx1ZTogdHJ1ZSlcbipcbiogQHBhcmFtIFtyZWplY3RPbkNhbmNlbF0gaWYgdHJ1ZSwgcmVqZWN0IHRoZSBsYXN0IGNhbGwgaWYgaXQncyBiZWVuIGNhbmNlbCAoZGVmYXVsdCB2YWx1ZTogZmFsc2UpXG4qXG4qIEByZXR1cm4gIEEgbmV3LCB0aHJvdHRsZWQsIGZ1bmN0aW9uLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVRocm90dGxlRm4oZm4sIG1zID0gMjAwLCB0cmFpbGluZyA9IGZhbHNlLCBsZWFkaW5nID0gdHJ1ZSwgcmVqZWN0T25DYW5jZWwgPSBmYWxzZSkge1xuXHRyZXR1cm4gY3JlYXRlRmlsdGVyV3JhcHBlcih0aHJvdHRsZUZpbHRlcihtcywgdHJhaWxpbmcsIGxlYWRpbmcsIHJlamVjdE9uQ2FuY2VsKSwgZm4pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZUaHJvdHRsZWQvaW5kZXgudHNcbi8qKlxuKiBUaHJvdHRsZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi4gRXNwZWNpYWxseSB1c2VmdWwgZm9yIHJhdGUgbGltaXRpbmdcbiogZXhlY3V0aW9uIG9mIGhhbmRsZXJzIG9uIGV2ZW50cyBsaWtlIHJlc2l6ZSBhbmQgc2Nyb2xsLlxuKlxuKiBAcGFyYW0gdmFsdWUgUmVmIHZhbHVlIHRvIGJlIHdhdGNoZWQgd2l0aCB0aHJvdHRsZSBlZmZlY3RcbiogQHBhcmFtICBkZWxheSAgQSB6ZXJvLW9yLWdyZWF0ZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBGb3IgZXZlbnQgY2FsbGJhY2tzLCB2YWx1ZXMgYXJvdW5kIDEwMCBvciAyNTAgKG9yIGV2ZW4gaGlnaGVyKSBhcmUgbW9zdCB1c2VmdWwuXG4qIEBwYXJhbSB0cmFpbGluZyBpZiB0cnVlLCB1cGRhdGUgdGhlIHZhbHVlIGFnYWluIGFmdGVyIHRoZSBkZWxheSB0aW1lIGlzIHVwXG4qIEBwYXJhbSBsZWFkaW5nIGlmIHRydWUsIHVwZGF0ZSB0aGUgdmFsdWUgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgbXMgdGltZW91dFxuKi9cbmZ1bmN0aW9uIHJlZlRocm90dGxlZCh2YWx1ZSwgZGVsYXkgPSAyMDAsIHRyYWlsaW5nID0gdHJ1ZSwgbGVhZGluZyA9IHRydWUpIHtcblx0aWYgKGRlbGF5IDw9IDApIHJldHVybiB2YWx1ZTtcblx0Y29uc3QgdGhyb3R0bGVkID0gcmVmKHRvVmFsdWUodmFsdWUpKTtcblx0Y29uc3QgdXBkYXRlciA9IHVzZVRocm90dGxlRm4oKCkgPT4ge1xuXHRcdHRocm90dGxlZC52YWx1ZSA9IHZhbHVlLnZhbHVlO1xuXHR9LCBkZWxheSwgdHJhaWxpbmcsIGxlYWRpbmcpO1xuXHR3YXRjaCh2YWx1ZSwgKCkgPT4gdXBkYXRlcigpKTtcblx0cmV0dXJuIHRocm90dGxlZDtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHJlZlRocm90dGxlZGAgaW5zdGVhZCAqL1xuY29uc3QgdGhyb3R0bGVkUmVmID0gcmVmVGhyb3R0bGVkO1xuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmVGhyb3R0bGVkYCBpbnN0ZWFkICovXG5jb25zdCB1c2VUaHJvdHRsZSA9IHJlZlRocm90dGxlZDtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVmV2l0aENvbnRyb2wvaW5kZXgudHNcbi8qKlxuKiBGaW5lLWdyYWluZWQgY29udHJvbHMgb3ZlciByZWYgYW5kIGl0cyByZWFjdGl2aXR5LlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHJlZldpdGhDb250cm9sKGluaXRpYWwsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgc291cmNlID0gaW5pdGlhbDtcblx0bGV0IHRyYWNrO1xuXHRsZXQgdHJpZ2dlcjtcblx0Y29uc3QgcmVmJDEgPSBjdXN0b21SZWYoKF90cmFjaywgX3RyaWdnZXIpID0+IHtcblx0XHR0cmFjayA9IF90cmFjaztcblx0XHR0cmlnZ2VyID0gX3RyaWdnZXI7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0cmV0dXJuIGdldCQxKCk7XG5cdFx0XHR9LFxuXHRcdFx0c2V0KHYpIHtcblx0XHRcdFx0c2V0JDEodik7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSk7XG5cdGZ1bmN0aW9uIGdldCQxKHRyYWNraW5nID0gdHJ1ZSkge1xuXHRcdGlmICh0cmFja2luZykgdHJhY2soKTtcblx0XHRyZXR1cm4gc291cmNlO1xuXHR9XG5cdGZ1bmN0aW9uIHNldCQxKHZhbHVlLCB0cmlnZ2VyaW5nID0gdHJ1ZSkge1xuXHRcdHZhciBfb3B0aW9ucyRvbkJlZm9yZUNoYW4sIF9vcHRpb25zJG9uQ2hhbmdlZDtcblx0XHRpZiAodmFsdWUgPT09IHNvdXJjZSkgcmV0dXJuO1xuXHRcdGNvbnN0IG9sZCA9IHNvdXJjZTtcblx0XHRpZiAoKChfb3B0aW9ucyRvbkJlZm9yZUNoYW4gPSBvcHRpb25zLm9uQmVmb3JlQ2hhbmdlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkJlZm9yZUNoYW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG9uQmVmb3JlQ2hhbi5jYWxsKG9wdGlvbnMsIHZhbHVlLCBvbGQpKSA9PT0gZmFsc2UpIHJldHVybjtcblx0XHRzb3VyY2UgPSB2YWx1ZTtcblx0XHQoX29wdGlvbnMkb25DaGFuZ2VkID0gb3B0aW9ucy5vbkNoYW5nZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uQ2hhbmdlZCA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uQ2hhbmdlZC5jYWxsKG9wdGlvbnMsIHZhbHVlLCBvbGQpO1xuXHRcdGlmICh0cmlnZ2VyaW5nKSB0cmlnZ2VyKCk7XG5cdH1cblx0LyoqXG5cdCogR2V0IHRoZSB2YWx1ZSB3aXRob3V0IHRyYWNrZWQgaW4gdGhlIHJlYWN0aXZpdHkgc3lzdGVtXG5cdCovXG5cdGNvbnN0IHVudHJhY2tlZEdldCA9ICgpID0+IGdldCQxKGZhbHNlKTtcblx0LyoqXG5cdCogU2V0IHRoZSB2YWx1ZSB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIHJlYWN0aXZpdHkgc3lzdGVtXG5cdCovXG5cdGNvbnN0IHNpbGVudFNldCA9ICh2KSA9PiBzZXQkMSh2LCBmYWxzZSk7XG5cdC8qKlxuXHQqIEdldCB0aGUgdmFsdWUgd2l0aG91dCB0cmFja2VkIGluIHRoZSByZWFjdGl2aXR5IHN5c3RlbS5cblx0KlxuXHQqIEFsaWFzIGZvciBgdW50cmFja2VkR2V0KClgXG5cdCovXG5cdGNvbnN0IHBlZWsgPSAoKSA9PiBnZXQkMShmYWxzZSk7XG5cdC8qKlxuXHQqIFNldCB0aGUgdmFsdWUgd2l0aG91dCB0cmlnZ2VyaW5nIHRoZSByZWFjdGl2aXR5IHN5c3RlbVxuXHQqXG5cdCogQWxpYXMgZm9yIGBzaWxlbnRTZXQodilgXG5cdCovXG5cdGNvbnN0IGxheSA9ICh2KSA9PiBzZXQkMSh2LCBmYWxzZSk7XG5cdHJldHVybiBleHRlbmRSZWYocmVmJDEsIHtcblx0XHRnZXQ6IGdldCQxLFxuXHRcdHNldDogc2V0JDEsXG5cdFx0dW50cmFja2VkR2V0LFxuXHRcdHNpbGVudFNldCxcblx0XHRwZWVrLFxuXHRcdGxheVxuXHR9LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWZXaXRoQ29udHJvbGAgaW5zdGVhZCAqL1xuY29uc3QgY29udHJvbGxlZFJlZiA9IHJlZldpdGhDb250cm9sO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzZXQvaW5kZXgudHNcbi8qKlxuKiAgU2hvcnRoYW5kIGZvciBgcmVmLnZhbHVlID0geGBcbiovXG5mdW5jdGlvbiBzZXQoLi4uYXJncykge1xuXHRpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcblx0XHRjb25zdCBbcmVmJDEsIHZhbHVlXSA9IGFyZ3M7XG5cdFx0cmVmJDEudmFsdWUgPSB2YWx1ZTtcblx0fVxuXHRpZiAoYXJncy5sZW5ndGggPT09IDMpIHtcblx0XHRjb25zdCBbdGFyZ2V0LCBrZXksIHZhbHVlXSA9IGFyZ3M7XG5cdFx0dGFyZ2V0W2tleV0gPSB2YWx1ZTtcblx0fVxufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaFdpdGhGaWx0ZXIvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoV2l0aEZpbHRlcihzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBldmVudEZpbHRlciA9IGJ5cGFzc0ZpbHRlciwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB3YXRjaChzb3VyY2UsIGNyZWF0ZUZpbHRlcldyYXBwZXIoZXZlbnRGaWx0ZXIsIGNiKSwgd2F0Y2hPcHRpb25zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hQYXVzYWJsZS9pbmRleC50c1xuLyoqIEBkZXByZWNhdGVkIFVzZSBWdWUncyBidWlsdC1pbiBgd2F0Y2hgIGluc3RlYWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9uLiAqL1xuZnVuY3Rpb24gd2F0Y2hQYXVzYWJsZShzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBldmVudEZpbHRlcjogZmlsdGVyLCBpbml0aWFsU3RhdGUgPSBcImFjdGl2ZVwiLC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBldmVudEZpbHRlciwgcGF1c2UsIHJlc3VtZSwgaXNBY3RpdmUgfSA9IHBhdXNhYmxlRmlsdGVyKGZpbHRlciwgeyBpbml0aWFsU3RhdGUgfSk7XG5cdHJldHVybiB7XG5cdFx0c3RvcDogd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgY2IsIHtcblx0XHRcdC4uLndhdGNoT3B0aW9ucyxcblx0XHRcdGV2ZW50RmlsdGVyXG5cdFx0fSksXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGlzQWN0aXZlXG5cdH07XG59XG4vKiogQGRlcHJlY2F0ZWQgVXNlIFZ1ZSdzIGJ1aWx0LWluIGB3YXRjaGAgaW5zdGVhZC4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb24uICovXG5jb25zdCBwYXVzYWJsZVdhdGNoID0gd2F0Y2hQYXVzYWJsZTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3luY1JlZi9pbmRleC50c1xuLyoqXG4qIFR3by13YXkgcmVmcyBzeW5jaHJvbml6YXRpb24uXG4qIEZyb20gdGhlIHNldCB0aGVvcnkgcGVyc3BlY3RpdmUgdG8gcmVzdHJpY3QgdGhlIG9wdGlvbidzIHR5cGVcbiogQ2hlY2sgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjpcbiogMS4gTCA9IFJcbiogMi4gTCDiiKkgUiDiiaAg4oiFXG4qIDMuIEwg4oqGIFJcbiogNC4gTCDiiKkgUiA9IOKIhVxuKi9cbmZ1bmN0aW9uIHN5bmNSZWYobGVmdCwgcmlnaHQsIC4uLltvcHRpb25zXSkge1xuXHRjb25zdCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgaW1tZWRpYXRlID0gdHJ1ZSwgZGlyZWN0aW9uID0gXCJib3RoXCIsIHRyYW5zZm9ybSA9IHt9IH0gPSBvcHRpb25zIHx8IHt9O1xuXHRjb25zdCB3YXRjaGVycyA9IFtdO1xuXHRjb25zdCB0cmFuc2Zvcm1MVFIgPSBcImx0clwiIGluIHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0ubHRyIHx8ICgodikgPT4gdik7XG5cdGNvbnN0IHRyYW5zZm9ybVJUTCA9IFwicnRsXCIgaW4gdHJhbnNmb3JtICYmIHRyYW5zZm9ybS5ydGwgfHwgKCh2KSA9PiB2KTtcblx0aWYgKGRpcmVjdGlvbiA9PT0gXCJib3RoXCIgfHwgZGlyZWN0aW9uID09PSBcImx0clwiKSB3YXRjaGVycy5wdXNoKHdhdGNoUGF1c2FibGUobGVmdCwgKG5ld1ZhbHVlKSA9PiB7XG5cdFx0d2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5wYXVzZSgpKTtcblx0XHRyaWdodC52YWx1ZSA9IHRyYW5zZm9ybUxUUihuZXdWYWx1ZSk7XG5cdFx0d2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5yZXN1bWUoKSk7XG5cdH0sIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGltbWVkaWF0ZVxuXHR9KSk7XG5cdGlmIChkaXJlY3Rpb24gPT09IFwiYm90aFwiIHx8IGRpcmVjdGlvbiA9PT0gXCJydGxcIikgd2F0Y2hlcnMucHVzaCh3YXRjaFBhdXNhYmxlKHJpZ2h0LCAobmV3VmFsdWUpID0+IHtcblx0XHR3YXRjaGVycy5mb3JFYWNoKCh3KSA9PiB3LnBhdXNlKCkpO1xuXHRcdGxlZnQudmFsdWUgPSB0cmFuc2Zvcm1SVEwobmV3VmFsdWUpO1xuXHRcdHdhdGNoZXJzLmZvckVhY2goKHcpID0+IHcucmVzdW1lKCkpO1xuXHR9LCB7XG5cdFx0Zmx1c2gsXG5cdFx0ZGVlcCxcblx0XHRpbW1lZGlhdGVcblx0fSkpO1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdHdhdGNoZXJzLmZvckVhY2goKHcpID0+IHcuc3RvcCgpKTtcblx0fTtcblx0cmV0dXJuIHN0b3A7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHN5bmNSZWZzL2luZGV4LnRzXG4vKipcbiogS2VlcCB0YXJnZXQgcmVmKHMpIGluIHN5bmMgd2l0aCB0aGUgc291cmNlIHJlZlxuKlxuKiBAcGFyYW0gc291cmNlIHNvdXJjZSByZWZcbiogQHBhcmFtIHRhcmdldHNcbiovXG5mdW5jdGlvbiBzeW5jUmVmcyhzb3VyY2UsIHRhcmdldHMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgdGFyZ2V0c0FycmF5ID0gdG9BcnJheSh0YXJnZXRzKTtcblx0cmV0dXJuIHdhdGNoKHNvdXJjZSwgKG5ld1ZhbHVlKSA9PiB0YXJnZXRzQXJyYXkuZm9yRWFjaCgodGFyZ2V0KSA9PiB0YXJnZXQudmFsdWUgPSBuZXdWYWx1ZSksIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGltbWVkaWF0ZVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdG9SZWZzL2luZGV4LnRzXG4vKipcbiogRXh0ZW5kZWQgYHRvUmVmc2AgdGhhdCBhbHNvIGFjY2VwdHMgcmVmcyBvZiBhbiBvYmplY3QuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3RvUmVmc1xuKiBAcGFyYW0gb2JqZWN0UmVmIEEgcmVmIG9yIG5vcm1hbCBvYmplY3Qgb3IgYXJyYXkuXG4qIEBwYXJhbSBvcHRpb25zIE9wdGlvbnNcbiovXG5mdW5jdGlvbiB0b1JlZnMob2JqZWN0UmVmLCBvcHRpb25zID0ge30pIHtcblx0aWYgKCFpc1JlZihvYmplY3RSZWYpKSByZXR1cm4gdG9SZWZzJDEob2JqZWN0UmVmKTtcblx0Y29uc3QgcmVzdWx0ID0gQXJyYXkuaXNBcnJheShvYmplY3RSZWYudmFsdWUpID8gQXJyYXkuZnJvbSh7IGxlbmd0aDogb2JqZWN0UmVmLnZhbHVlLmxlbmd0aCB9KSA6IHt9O1xuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmplY3RSZWYudmFsdWUpIHJlc3VsdFtrZXldID0gY3VzdG9tUmVmKCgpID0+ICh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIG9iamVjdFJlZi52YWx1ZVtrZXldO1xuXHRcdH0sXG5cdFx0c2V0KHYpIHtcblx0XHRcdHZhciBfdG9WYWx1ZTtcblx0XHRcdGlmICgoX3RvVmFsdWUgPSB0b1ZhbHVlKG9wdGlvbnMucmVwbGFjZVJlZikpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHRydWUpIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFJlZi52YWx1ZSkpIHtcblx0XHRcdFx0Y29uc3QgY29weSA9IFsuLi5vYmplY3RSZWYudmFsdWVdO1xuXHRcdFx0XHRjb3B5W2tleV0gPSB2O1xuXHRcdFx0XHRvYmplY3RSZWYudmFsdWUgPSBjb3B5O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbmV3T2JqZWN0ID0ge1xuXHRcdFx0XHRcdC4uLm9iamVjdFJlZi52YWx1ZSxcblx0XHRcdFx0XHRba2V5XTogdlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3T2JqZWN0LCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0UmVmLnZhbHVlKSk7XG5cdFx0XHRcdG9iamVjdFJlZi52YWx1ZSA9IG5ld09iamVjdDtcblx0XHRcdH1cblx0XHRcdGVsc2Ugb2JqZWN0UmVmLnZhbHVlW2tleV0gPSB2O1xuXHRcdH1cblx0fSkpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0cnlPbkJlZm9yZU1vdW50L2luZGV4LnRzXG4vKipcbiogQ2FsbCBvbkJlZm9yZU1vdW50KCkgaWYgaXQncyBpbnNpZGUgYSBjb21wb25lbnQgbGlmZWN5Y2xlLCBpZiBub3QsIGp1c3QgY2FsbCB0aGUgZnVuY3Rpb25cbipcbiogQHBhcmFtIGZuXG4qIEBwYXJhbSBzeW5jIGlmIHNldCB0byBmYWxzZSwgaXQgd2lsbCBydW4gaW4gdGhlIG5leHRUaWNrKCkgb2YgVnVlXG4qIEBwYXJhbSB0YXJnZXRcbiovXG5mdW5jdGlvbiB0cnlPbkJlZm9yZU1vdW50KGZuLCBzeW5jID0gdHJ1ZSwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25CZWZvcmVNb3VudChmbiwgdGFyZ2V0KTtcblx0ZWxzZSBpZiAoc3luYykgZm4oKTtcblx0ZWxzZSBuZXh0VGljayhmbik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHRyeU9uQmVmb3JlVW5tb3VudC9pbmRleC50c1xuLyoqXG4qIENhbGwgb25CZWZvcmVVbm1vdW50KCkgaWYgaXQncyBpbnNpZGUgYSBjb21wb25lbnQgbGlmZWN5Y2xlLCBpZiBub3QsIGRvIG5vdGhpbmdcbipcbiogQHBhcmFtIGZuXG4qIEBwYXJhbSB0YXJnZXRcbiovXG5mdW5jdGlvbiB0cnlPbkJlZm9yZVVubW91bnQoZm4sIHRhcmdldCkge1xuXHRpZiAoZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCkpIG9uQmVmb3JlVW5tb3VudChmbiwgdGFyZ2V0KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdHJ5T25Nb3VudGVkL2luZGV4LnRzXG4vKipcbiogQ2FsbCBvbk1vdW50ZWQoKSBpZiBpdCdzIGluc2lkZSBhIGNvbXBvbmVudCBsaWZlY3ljbGUsIGlmIG5vdCwganVzdCBjYWxsIHRoZSBmdW5jdGlvblxuKlxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIHN5bmMgaWYgc2V0IHRvIGZhbHNlLCBpdCB3aWxsIHJ1biBpbiB0aGUgbmV4dFRpY2soKSBvZiBWdWVcbiogQHBhcmFtIHRhcmdldFxuKi9cbmZ1bmN0aW9uIHRyeU9uTW91bnRlZChmbiwgc3luYyA9IHRydWUsIHRhcmdldCkge1xuXHRpZiAoZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCkpIG9uTW91bnRlZChmbiwgdGFyZ2V0KTtcblx0ZWxzZSBpZiAoc3luYykgZm4oKTtcblx0ZWxzZSBuZXh0VGljayhmbik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHRyeU9uVW5tb3VudGVkL2luZGV4LnRzXG4vKipcbiogQ2FsbCBvblVubW91bnRlZCgpIGlmIGl0J3MgaW5zaWRlIGEgY29tcG9uZW50IGxpZmVjeWNsZSwgaWYgbm90LCBkbyBub3RoaW5nXG4qXG4qIEBwYXJhbSBmblxuKiBAcGFyYW0gdGFyZ2V0XG4qL1xuZnVuY3Rpb24gdHJ5T25Vbm1vdW50ZWQoZm4sIHRhcmdldCkge1xuXHRpZiAoZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCkpIG9uVW5tb3VudGVkKGZuLCB0YXJnZXQpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1bnRpbC9pbmRleC50c1xuZnVuY3Rpb24gY3JlYXRlVW50aWwociwgaXNOb3QgPSBmYWxzZSkge1xuXHRmdW5jdGlvbiB0b01hdGNoKGNvbmRpdGlvbiwgeyBmbHVzaCA9IFwic3luY1wiLCBkZWVwID0gZmFsc2UsIHRpbWVvdXQsIHRocm93T25UaW1lb3V0IH0gPSB7fSkge1xuXHRcdGxldCBzdG9wID0gbnVsbDtcblx0XHRjb25zdCBwcm9taXNlcyA9IFtuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0c3RvcCA9IHdhdGNoKHIsICh2KSA9PiB7XG5cdFx0XHRcdGlmIChjb25kaXRpb24odikgIT09IGlzTm90KSB7XG5cdFx0XHRcdFx0aWYgKHN0b3ApIHN0b3AoKTtcblx0XHRcdFx0XHRlbHNlIG5leHRUaWNrKCgpID0+IHN0b3AgPT09IG51bGwgfHwgc3RvcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RvcCgpKTtcblx0XHRcdFx0XHRyZXNvbHZlKHYpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB7XG5cdFx0XHRcdGZsdXNoLFxuXHRcdFx0XHRkZWVwLFxuXHRcdFx0XHRpbW1lZGlhdGU6IHRydWVcblx0XHRcdH0pO1xuXHRcdH0pXTtcblx0XHRpZiAodGltZW91dCAhPSBudWxsKSBwcm9taXNlcy5wdXNoKHByb21pc2VUaW1lb3V0KHRpbWVvdXQsIHRocm93T25UaW1lb3V0KS50aGVuKCgpID0+IHRvVmFsdWUocikpLmZpbmFsbHkoKCkgPT4gc3RvcCA9PT0gbnVsbCB8fCBzdG9wID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdG9wKCkpKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yYWNlKHByb21pc2VzKTtcblx0fVxuXHRmdW5jdGlvbiB0b0JlKHZhbHVlLCBvcHRpb25zKSB7XG5cdFx0aWYgKCFpc1JlZih2YWx1ZSkpIHJldHVybiB0b01hdGNoKCh2KSA9PiB2ID09PSB2YWx1ZSwgb3B0aW9ucyk7XG5cdFx0Y29uc3QgeyBmbHVzaCA9IFwic3luY1wiLCBkZWVwID0gZmFsc2UsIHRpbWVvdXQsIHRocm93T25UaW1lb3V0IH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcblx0XHRsZXQgc3RvcCA9IG51bGw7XG5cdFx0Y29uc3QgcHJvbWlzZXMgPSBbbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdHN0b3AgPSB3YXRjaChbciwgdmFsdWVdLCAoW3YxLCB2Ml0pID0+IHtcblx0XHRcdFx0aWYgKGlzTm90ICE9PSAodjEgPT09IHYyKSkge1xuXHRcdFx0XHRcdGlmIChzdG9wKSBzdG9wKCk7XG5cdFx0XHRcdFx0ZWxzZSBuZXh0VGljaygoKSA9PiBzdG9wID09PSBudWxsIHx8IHN0b3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0b3AoKSk7XG5cdFx0XHRcdFx0cmVzb2x2ZSh2MSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHtcblx0XHRcdFx0Zmx1c2gsXG5cdFx0XHRcdGRlZXAsXG5cdFx0XHRcdGltbWVkaWF0ZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fSldO1xuXHRcdGlmICh0aW1lb3V0ICE9IG51bGwpIHByb21pc2VzLnB1c2gocHJvbWlzZVRpbWVvdXQodGltZW91dCwgdGhyb3dPblRpbWVvdXQpLnRoZW4oKCkgPT4gdG9WYWx1ZShyKSkuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRzdG9wID09PSBudWxsIHx8IHN0b3AgPT09IHZvaWQgMCB8fCBzdG9wKCk7XG5cdFx0XHRyZXR1cm4gdG9WYWx1ZShyKTtcblx0XHR9KSk7XG5cdFx0cmV0dXJuIFByb21pc2UucmFjZShwcm9taXNlcyk7XG5cdH1cblx0ZnVuY3Rpb24gdG9CZVRydXRoeShvcHRpb25zKSB7XG5cdFx0cmV0dXJuIHRvTWF0Y2goKHYpID0+IEJvb2xlYW4odiksIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIHRvQmVOdWxsKG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gdG9CZShudWxsLCBvcHRpb25zKTtcblx0fVxuXHRmdW5jdGlvbiB0b0JlVW5kZWZpbmVkKG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gdG9CZSh2b2lkIDAsIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIHRvQmVOYU4ob3B0aW9ucykge1xuXHRcdHJldHVybiB0b01hdGNoKE51bWJlci5pc05hTiwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gdG9Db250YWlucyh2YWx1ZSwgb3B0aW9ucykge1xuXHRcdHJldHVybiB0b01hdGNoKCh2KSA9PiB7XG5cdFx0XHRjb25zdCBhcnJheSA9IEFycmF5LmZyb20odik7XG5cdFx0XHRyZXR1cm4gYXJyYXkuaW5jbHVkZXModmFsdWUpIHx8IGFycmF5LmluY2x1ZGVzKHRvVmFsdWUodmFsdWUpKTtcblx0XHR9LCBvcHRpb25zKTtcblx0fVxuXHRmdW5jdGlvbiBjaGFuZ2VkKG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gY2hhbmdlZFRpbWVzKDEsIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIGNoYW5nZWRUaW1lcyhuID0gMSwgb3B0aW9ucykge1xuXHRcdGxldCBjb3VudCA9IC0xO1xuXHRcdHJldHVybiB0b01hdGNoKCgpID0+IHtcblx0XHRcdGNvdW50ICs9IDE7XG5cdFx0XHRyZXR1cm4gY291bnQgPj0gbjtcblx0XHR9LCBvcHRpb25zKTtcblx0fVxuXHRpZiAoQXJyYXkuaXNBcnJheSh0b1ZhbHVlKHIpKSkgcmV0dXJuIHtcblx0XHR0b01hdGNoLFxuXHRcdHRvQ29udGFpbnMsXG5cdFx0Y2hhbmdlZCxcblx0XHRjaGFuZ2VkVGltZXMsXG5cdFx0Z2V0IG5vdCgpIHtcblx0XHRcdHJldHVybiBjcmVhdGVVbnRpbChyLCAhaXNOb3QpO1xuXHRcdH1cblx0fTtcblx0ZWxzZSByZXR1cm4ge1xuXHRcdHRvTWF0Y2gsXG5cdFx0dG9CZSxcblx0XHR0b0JlVHJ1dGh5LFxuXHRcdHRvQmVOdWxsLFxuXHRcdHRvQmVOYU4sXG5cdFx0dG9CZVVuZGVmaW5lZCxcblx0XHRjaGFuZ2VkLFxuXHRcdGNoYW5nZWRUaW1lcyxcblx0XHRnZXQgbm90KCkge1xuXHRcdFx0cmV0dXJuIGNyZWF0ZVVudGlsKHIsICFpc05vdCk7XG5cdFx0fVxuXHR9O1xufVxuZnVuY3Rpb24gdW50aWwocikge1xuXHRyZXR1cm4gY3JlYXRlVW50aWwocik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5RGlmZmVyZW5jZS9pbmRleC50c1xuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmF0b3IodmFsdWUsIG90aFZhbCkge1xuXHRyZXR1cm4gdmFsdWUgPT09IG90aFZhbDtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBnZXQgYXJyYXkgZGlmZmVyZW5jZSBvZiB0d28gYXJyYXlcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlEaWZmZXJlbmNlXG4qIEByZXR1cm5zIC0gdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIGFycmF5XG4qIEBwYXJhbSBhcmdzXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlEaWZmZXJlbmNlKC4uLmFyZ3MpIHtcblx0dmFyIF9hcmdzJCwgX2FyZ3MkMjtcblx0Y29uc3QgbGlzdCA9IGFyZ3NbMF07XG5cdGNvbnN0IHZhbHVlcyA9IGFyZ3NbMV07XG5cdGxldCBjb21wYXJlRm4gPSAoX2FyZ3MkID0gYXJnc1syXSkgIT09IG51bGwgJiYgX2FyZ3MkICE9PSB2b2lkIDAgPyBfYXJncyQgOiBkZWZhdWx0Q29tcGFyYXRvcjtcblx0Y29uc3QgeyBzeW1tZXRyaWMgPSBmYWxzZSB9ID0gKF9hcmdzJDIgPSBhcmdzWzNdKSAhPT0gbnVsbCAmJiBfYXJncyQyICE9PSB2b2lkIDAgPyBfYXJncyQyIDoge307XG5cdGlmICh0eXBlb2YgY29tcGFyZUZuID09PSBcInN0cmluZ1wiKSB7XG5cdFx0Y29uc3Qga2V5ID0gY29tcGFyZUZuO1xuXHRcdGNvbXBhcmVGbiA9ICh2YWx1ZSwgb3RoVmFsKSA9PiB2YWx1ZVtrZXldID09PSBvdGhWYWxba2V5XTtcblx0fVxuXHRjb25zdCBkaWZmMSA9IGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkuZmlsdGVyKCh4KSA9PiB0b1ZhbHVlKHZhbHVlcykuZmluZEluZGV4KCh5KSA9PiBjb21wYXJlRm4oeCwgeSkpID09PSAtMSkpO1xuXHRpZiAoc3ltbWV0cmljKSB7XG5cdFx0Y29uc3QgZGlmZjIgPSBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKHZhbHVlcykuZmlsdGVyKCh4KSA9PiB0b1ZhbHVlKGxpc3QpLmZpbmRJbmRleCgoeSkgPT4gY29tcGFyZUZuKHgsIHkpKSA9PT0gLTEpKTtcblx0XHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gc3ltbWV0cmljID8gWy4uLnRvVmFsdWUoZGlmZjEpLCAuLi50b1ZhbHVlKGRpZmYyKV0gOiB0b1ZhbHVlKGRpZmYxKSk7XG5cdH0gZWxzZSByZXR1cm4gZGlmZjE7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5RXZlcnkvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkuZXZlcnlgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5RXZlcnlcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gZm4gLSBhIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuKlxuKiBAcmV0dXJucyAqKnRydWUqKiBpZiB0aGUgYGZuYCBmdW5jdGlvbiByZXR1cm5zIGEgKip0cnV0aHkqKiB2YWx1ZSBmb3IgZXZlcnkgZWxlbWVudCBmcm9tIHRoZSBhcnJheS4gT3RoZXJ3aXNlLCAqKmZhbHNlKiouXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlFdmVyeShsaXN0LCBmbikge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5ldmVyeSgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5RmlsdGVyL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmZpbHRlcmBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlGaWx0ZXJcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gZm4gLSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGZvciBldmVyeSBlbGVtZW50IG9mIHRoZSBnaXZlbiBgbGlzdGAuIEVhY2ggdGltZSBgZm5gIGV4ZWN1dGVzLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIG5ldyBhcnJheS5cbipcbiogQHJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgYSBwb3J0aW9uIG9mIHRoZSBnaXZlbiBhcnJheSwgZmlsdGVyZWQgZG93biB0byBqdXN0IHRoZSBlbGVtZW50cyBmcm9tIHRoZSBnaXZlbiBhcnJheSB0aGF0IHBhc3MgdGhlIHRlc3QgaW1wbGVtZW50ZWQgYnkgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLiBJZiBubyBlbGVtZW50cyBwYXNzIHRoZSB0ZXN0LCBhbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5RmlsdGVyKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLm1hcCgoaSkgPT4gdG9WYWx1ZShpKSkuZmlsdGVyKGZuKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5RmluZC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5maW5kYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUZpbmRcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gZm4gLSBhIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuKlxuKiBAcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIHRlc3RpbmcgZnVuY3Rpb24uIE90aGVyd2lzZSwgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5RmluZChsaXN0LCBmbikge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZSh0b1ZhbHVlKGxpc3QpLmZpbmQoKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gZm4odG9WYWx1ZShlbGVtZW50KSwgaW5kZXgsIGFycmF5KSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaW5kSW5kZXgvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkuZmluZEluZGV4YFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUZpbmRJbmRleFxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgdGhhdCBwYXNzZXMgdGhlIHRlc3QuIE90aGVyd2lzZSwgXCItMVwiLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5RmluZEluZGV4KGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLmZpbmRJbmRleCgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5RmluZExhc3QvaW5kZXgudHNcbmZ1bmN0aW9uIGZpbmRMYXN0KGFyciwgY2IpIHtcblx0bGV0IGluZGV4ID0gYXJyLmxlbmd0aDtcblx0d2hpbGUgKGluZGV4LS0gPiAwKSBpZiAoY2IoYXJyW2luZGV4XSwgaW5kZXgsIGFycikpIHJldHVybiBhcnJbaW5kZXhdO1xufVxuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5maW5kTGFzdGBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlGaW5kTGFzdFxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IHRoYXQgc2F0aXNmaWVzIHRoZSBwcm92aWRlZCB0ZXN0aW5nIGZ1bmN0aW9uLiBPdGhlcndpc2UsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheUZpbmRMYXN0KGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKCFBcnJheS5wcm90b3R5cGUuZmluZExhc3QgPyBmaW5kTGFzdCh0b1ZhbHVlKGxpc3QpLCAoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSA6IHRvVmFsdWUobGlzdCkuZmluZExhc3QoKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gZm4odG9WYWx1ZShlbGVtZW50KSwgaW5kZXgsIGFycmF5KSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlJbmNsdWRlcy9pbmRleC50c1xuZnVuY3Rpb24gaXNBcnJheUluY2x1ZGVzT3B0aW9ucyhvYmopIHtcblx0cmV0dXJuIGlzT2JqZWN0KG9iaikgJiYgY29udGFpbnNQcm9wKG9iaiwgXCJmb3JtSW5kZXhcIiwgXCJjb21wYXJhdG9yXCIpO1xufVxuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5pbmNsdWRlc2BcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlJbmNsdWRlc1xuKlxuKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBgdmFsdWVgIGlzIGZvdW5kIGluIHRoZSBhcnJheS4gT3RoZXJ3aXNlLCBmYWxzZS5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheUluY2x1ZGVzKC4uLmFyZ3MpIHtcblx0dmFyIF9jb21wYXJhdG9yO1xuXHRjb25zdCBsaXN0ID0gYXJnc1swXTtcblx0Y29uc3QgdmFsdWUgPSBhcmdzWzFdO1xuXHRsZXQgY29tcGFyYXRvciA9IGFyZ3NbMl07XG5cdGxldCBmb3JtSW5kZXggPSAwO1xuXHRpZiAoaXNBcnJheUluY2x1ZGVzT3B0aW9ucyhjb21wYXJhdG9yKSkge1xuXHRcdHZhciBfY29tcGFyYXRvciRmcm9tSW5kZXg7XG5cdFx0Zm9ybUluZGV4ID0gKF9jb21wYXJhdG9yJGZyb21JbmRleCA9IGNvbXBhcmF0b3IuZnJvbUluZGV4KSAhPT0gbnVsbCAmJiBfY29tcGFyYXRvciRmcm9tSW5kZXggIT09IHZvaWQgMCA/IF9jb21wYXJhdG9yJGZyb21JbmRleCA6IDA7XG5cdFx0Y29tcGFyYXRvciA9IGNvbXBhcmF0b3IuY29tcGFyYXRvcjtcblx0fVxuXHRpZiAodHlwZW9mIGNvbXBhcmF0b3IgPT09IFwic3RyaW5nXCIpIHtcblx0XHRjb25zdCBrZXkgPSBjb21wYXJhdG9yO1xuXHRcdGNvbXBhcmF0b3IgPSAoZWxlbWVudCwgdmFsdWUkMSkgPT4gZWxlbWVudFtrZXldID09PSB0b1ZhbHVlKHZhbHVlJDEpO1xuXHR9XG5cdGNvbXBhcmF0b3IgPSAoX2NvbXBhcmF0b3IgPSBjb21wYXJhdG9yKSAhPT0gbnVsbCAmJiBfY29tcGFyYXRvciAhPT0gdm9pZCAwID8gX2NvbXBhcmF0b3IgOiAoKGVsZW1lbnQsIHZhbHVlJDEpID0+IGVsZW1lbnQgPT09IHRvVmFsdWUodmFsdWUkMSkpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5zbGljZShmb3JtSW5kZXgpLnNvbWUoKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gY29tcGFyYXRvcih0b1ZhbHVlKGVsZW1lbnQpLCB0b1ZhbHVlKHZhbHVlKSwgaW5kZXgsIHRvVmFsdWUoYXJyYXkpKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheUpvaW4vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkuam9pbmBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlKb2luXG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIHNlcGFyYXRvciAtIGEgc3RyaW5nIHRvIHNlcGFyYXRlIGVhY2ggcGFpciBvZiBhZGphY2VudCBlbGVtZW50cyBvZiB0aGUgYXJyYXkuIElmIG9taXR0ZWQsIHRoZSBhcnJheSBlbGVtZW50cyBhcmUgc2VwYXJhdGVkIHdpdGggYSBjb21tYSAoXCIsXCIpLlxuKlxuKiBAcmV0dXJucyBhIHN0cmluZyB3aXRoIGFsbCBhcnJheSBlbGVtZW50cyBqb2luZWQuIElmIGFyci5sZW5ndGggaXMgMCwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheUpvaW4obGlzdCwgc2VwYXJhdG9yKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLm1hcCgoaSkgPT4gdG9WYWx1ZShpKSkuam9pbih0b1ZhbHVlKHNlcGFyYXRvcikpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlNYXAvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkubWFwYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheU1hcFxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGBsaXN0YC4gRWFjaCB0aW1lIGBmbmAgZXhlY3V0ZXMsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgbmV3IGFycmF5LlxuKlxuKiBAcmV0dXJucyBhIG5ldyBhcnJheSB3aXRoIGVhY2ggZWxlbWVudCBiZWluZyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheU1hcChsaXN0LCBmbikge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5tYXAoKGkpID0+IHRvVmFsdWUoaSkpLm1hcChmbikpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheVJlZHVjZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5yZWR1Y2VgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5UmVkdWNlXG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIHJlZHVjZXIgLSBhIFwicmVkdWNlclwiIGZ1bmN0aW9uLlxuKiBAcGFyYW0gYXJnc1xuKlxuKiBAcmV0dXJucyB0aGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gcnVubmluZyB0aGUgXCJyZWR1Y2VyXCIgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY29tcGxldGlvbiBvdmVyIHRoZSBlbnRpcmUgYXJyYXkuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlSZWR1Y2UobGlzdCwgcmVkdWNlciwgLi4uYXJncykge1xuXHRjb25zdCByZWR1Y2VDYWxsYmFjayA9IChzdW0sIHZhbHVlLCBpbmRleCkgPT4gcmVkdWNlcih0b1ZhbHVlKHN1bSksIHRvVmFsdWUodmFsdWUpLCBpbmRleCk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcmVzb2x2ZWQgPSB0b1ZhbHVlKGxpc3QpO1xuXHRcdHJldHVybiBhcmdzLmxlbmd0aCA/IHJlc29sdmVkLnJlZHVjZShyZWR1Y2VDYWxsYmFjaywgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIiA/IHRvVmFsdWUoYXJnc1swXSgpKSA6IHRvVmFsdWUoYXJnc1swXSkpIDogcmVzb2x2ZWQucmVkdWNlKHJlZHVjZUNhbGxiYWNrKTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5U29tZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5zb21lYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheVNvbWVcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gZm4gLSBhIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuKlxuKiBAcmV0dXJucyAqKnRydWUqKiBpZiB0aGUgYGZuYCBmdW5jdGlvbiByZXR1cm5zIGEgKip0cnV0aHkqKiB2YWx1ZSBmb3IgYW55IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkuIE90aGVyd2lzZSwgKipmYWxzZSoqLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5U29tZShsaXN0LCBmbikge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5zb21lKChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlVbmlxdWUvaW5kZXgudHNcbmZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcblx0cmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhcnJheSkpO1xufVxuZnVuY3Rpb24gdW5pcXVlRWxlbWVudHNCeShhcnJheSwgZm4pIHtcblx0cmV0dXJuIGFycmF5LnJlZHVjZSgoYWNjLCB2KSA9PiB7XG5cdFx0aWYgKCFhY2Muc29tZSgoeCkgPT4gZm4odiwgeCwgYXJyYXkpKSkgYWNjLnB1c2godik7XG5cdFx0cmV0dXJuIGFjYztcblx0fSwgW10pO1xufVxuLyoqXG4qIHJlYWN0aXZlIHVuaXF1ZSBhcnJheVxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheVVuaXF1ZVxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBjb21wYXJlRm5cbiogQHJldHVybnMgQSBjb21wdXRlZCByZWYgdGhhdCByZXR1cm5zIGEgdW5pcXVlIGFycmF5IG9mIGl0ZW1zLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5VW5pcXVlKGxpc3QsIGNvbXBhcmVGbikge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHJlc29sdmVkTGlzdCA9IHRvVmFsdWUobGlzdCkubWFwKChlbGVtZW50KSA9PiB0b1ZhbHVlKGVsZW1lbnQpKTtcblx0XHRyZXR1cm4gY29tcGFyZUZuID8gdW5pcXVlRWxlbWVudHNCeShyZXNvbHZlZExpc3QsIGNvbXBhcmVGbikgOiB1bmlxKHJlc29sdmVkTGlzdCk7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDb3VudGVyL2luZGV4LnRzXG4vKipcbiogQmFzaWMgY291bnRlciB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDb3VudGVyXG4qIEBwYXJhbSBbaW5pdGlhbFZhbHVlXVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUNvdW50ZXIoaW5pdGlhbFZhbHVlID0gMCwgb3B0aW9ucyA9IHt9KSB7XG5cdGxldCBfaW5pdGlhbFZhbHVlID0gdW5yZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgY291bnQgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IHsgbWF4ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBtaW4gPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGluYyA9IChkZWx0YSA9IDEpID0+IGNvdW50LnZhbHVlID0gTWF0aC5tYXgoTWF0aC5taW4obWF4LCBjb3VudC52YWx1ZSArIGRlbHRhKSwgbWluKTtcblx0Y29uc3QgZGVjID0gKGRlbHRhID0gMSkgPT4gY291bnQudmFsdWUgPSBNYXRoLm1pbihNYXRoLm1heChtaW4sIGNvdW50LnZhbHVlIC0gZGVsdGEpLCBtYXgpO1xuXHRjb25zdCBnZXQkMSA9ICgpID0+IGNvdW50LnZhbHVlO1xuXHRjb25zdCBzZXQkMSA9ICh2YWwpID0+IGNvdW50LnZhbHVlID0gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbCkpO1xuXHRjb25zdCByZXNldCA9ICh2YWwgPSBfaW5pdGlhbFZhbHVlKSA9PiB7XG5cdFx0X2luaXRpYWxWYWx1ZSA9IHZhbDtcblx0XHRyZXR1cm4gc2V0JDEodmFsKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRjb3VudDogc2hhbGxvd1JlYWRvbmx5KGNvdW50KSxcblx0XHRpbmMsXG5cdFx0ZGVjLFxuXHRcdGdldDogZ2V0JDEsXG5cdFx0c2V0OiBzZXQkMSxcblx0XHRyZXNldFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEYXRlRm9ybWF0L2luZGV4LnRzXG5jb25zdCBSRUdFWF9QQVJTRSA9IC9eKFxcZHs0fSlbLS9dPyhcXGR7MSwyfSk/Wy0vXT8oXFxkezAsMn0pW1RcXHNdKihcXGR7MSwyfSk/Oj8oXFxkezEsMn0pPzo/KFxcZHsxLDJ9KT9bLjpdPyhcXGQrKT8kL2k7XG5jb25zdCBSRUdFWF9GT1JNQVQgPSAvW1lNREhobXNdb3xcXFsoW15cXF1dKylcXF18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXsxLDJ9fEF7MSwyfXxtezEsMn18c3sxLDJ9fFp7MSwyfXx6ezEsNH18U1NTL2c7XG5mdW5jdGlvbiBkZWZhdWx0TWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXJjYXNlLCBoYXNQZXJpb2QpIHtcblx0bGV0IG0gPSBob3VycyA8IDEyID8gXCJBTVwiIDogXCJQTVwiO1xuXHRpZiAoaGFzUGVyaW9kKSBtID0gbS5zcGxpdChcIlwiKS5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICs9IGAke2N1cnJ9LmAsIFwiXCIpO1xuXHRyZXR1cm4gaXNMb3dlcmNhc2UgPyBtLnRvTG93ZXJDYXNlKCkgOiBtO1xufVxuZnVuY3Rpb24gZm9ybWF0T3JkaW5hbChudW0pIHtcblx0Y29uc3Qgc3VmZml4ZXMgPSBbXG5cdFx0XCJ0aFwiLFxuXHRcdFwic3RcIixcblx0XHRcIm5kXCIsXG5cdFx0XCJyZFwiXG5cdF07XG5cdGNvbnN0IHYgPSBudW0gJSAxMDA7XG5cdHJldHVybiBudW0gKyAoc3VmZml4ZXNbKHYgLSAyMCkgJSAxMF0gfHwgc3VmZml4ZXNbdl0gfHwgc3VmZml4ZXNbMF0pO1xufVxuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXRTdHIsIG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkY3VzdG9tTWVyaWRpO1xuXHRjb25zdCB5ZWFycyA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0Y29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG5cdGNvbnN0IGRheXMgPSBkYXRlLmdldERhdGUoKTtcblx0Y29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG5cdGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcblx0Y29uc3Qgc2Vjb25kcyA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuXHRjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuXHRjb25zdCBkYXkgPSBkYXRlLmdldERheSgpO1xuXHRjb25zdCBtZXJpZGllbSA9IChfb3B0aW9ucyRjdXN0b21NZXJpZGkgPSBvcHRpb25zLmN1c3RvbU1lcmlkaWVtKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRjdXN0b21NZXJpZGkgIT09IHZvaWQgMCA/IF9vcHRpb25zJGN1c3RvbU1lcmlkaSA6IGRlZmF1bHRNZXJpZGllbTtcblx0Y29uc3Qgc3RyaXBUaW1lWm9uZSA9IChkYXRlU3RyaW5nKSA9PiB7XG5cdFx0dmFyIF9kYXRlU3RyaW5nJHNwbGl0JDtcblx0XHRyZXR1cm4gKF9kYXRlU3RyaW5nJHNwbGl0JCA9IGRhdGVTdHJpbmcuc3BsaXQoXCIgXCIpWzFdKSAhPT0gbnVsbCAmJiBfZGF0ZVN0cmluZyRzcGxpdCQgIT09IHZvaWQgMCA/IF9kYXRlU3RyaW5nJHNwbGl0JCA6IFwiXCI7XG5cdH07XG5cdGNvbnN0IG1hdGNoZXMgPSB7XG5cdFx0WW86ICgpID0+IGZvcm1hdE9yZGluYWwoeWVhcnMpLFxuXHRcdFlZOiAoKSA9PiBTdHJpbmcoeWVhcnMpLnNsaWNlKC0yKSxcblx0XHRZWVlZOiAoKSA9PiB5ZWFycyxcblx0XHRNOiAoKSA9PiBtb250aCArIDEsXG5cdFx0TW86ICgpID0+IGZvcm1hdE9yZGluYWwobW9udGggKyAxKSxcblx0XHRNTTogKCkgPT4gYCR7bW9udGggKyAxfWAucGFkU3RhcnQoMiwgXCIwXCIpLFxuXHRcdE1NTTogKCkgPT4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IG1vbnRoOiBcInNob3J0XCIgfSksXG5cdFx0TU1NTTogKCkgPT4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IG1vbnRoOiBcImxvbmdcIiB9KSxcblx0XHREOiAoKSA9PiBTdHJpbmcoZGF5cyksXG5cdFx0RG86ICgpID0+IGZvcm1hdE9yZGluYWwoZGF5cyksXG5cdFx0REQ6ICgpID0+IGAke2RheXN9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0SDogKCkgPT4gU3RyaW5nKGhvdXJzKSxcblx0XHRIbzogKCkgPT4gZm9ybWF0T3JkaW5hbChob3VycyksXG5cdFx0SEg6ICgpID0+IGAke2hvdXJzfWAucGFkU3RhcnQoMiwgXCIwXCIpLFxuXHRcdGg6ICgpID0+IGAke2hvdXJzICUgMTIgfHwgMTJ9YC5wYWRTdGFydCgxLCBcIjBcIiksXG5cdFx0aG86ICgpID0+IGZvcm1hdE9yZGluYWwoaG91cnMgJSAxMiB8fCAxMiksXG5cdFx0aGg6ICgpID0+IGAke2hvdXJzICUgMTIgfHwgMTJ9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0bTogKCkgPT4gU3RyaW5nKG1pbnV0ZXMpLFxuXHRcdG1vOiAoKSA9PiBmb3JtYXRPcmRpbmFsKG1pbnV0ZXMpLFxuXHRcdG1tOiAoKSA9PiBgJHttaW51dGVzfWAucGFkU3RhcnQoMiwgXCIwXCIpLFxuXHRcdHM6ICgpID0+IFN0cmluZyhzZWNvbmRzKSxcblx0XHRzbzogKCkgPT4gZm9ybWF0T3JkaW5hbChzZWNvbmRzKSxcblx0XHRzczogKCkgPT4gYCR7c2Vjb25kc31gLnBhZFN0YXJ0KDIsIFwiMFwiKSxcblx0XHRTU1M6ICgpID0+IGAke21pbGxpc2Vjb25kc31gLnBhZFN0YXJ0KDMsIFwiMFwiKSxcblx0XHRkOiAoKSA9PiBkYXksXG5cdFx0ZGQ6ICgpID0+IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB3ZWVrZGF5OiBcIm5hcnJvd1wiIH0pLFxuXHRcdGRkZDogKCkgPT4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IHdlZWtkYXk6IFwic2hvcnRcIiB9KSxcblx0XHRkZGRkOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgd2Vla2RheTogXCJsb25nXCIgfSksXG5cdFx0QTogKCkgPT4gbWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMpLFxuXHRcdEFBOiAoKSA9PiBtZXJpZGllbShob3VycywgbWludXRlcywgZmFsc2UsIHRydWUpLFxuXHRcdGE6ICgpID0+IG1lcmlkaWVtKGhvdXJzLCBtaW51dGVzLCB0cnVlKSxcblx0XHRhYTogKCkgPT4gbWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIHRydWUsIHRydWUpLFxuXHRcdHo6ICgpID0+IHN0cmlwVGltZVpvbmUoZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IHRpbWVab25lTmFtZTogXCJzaG9ydE9mZnNldFwiIH0pKSxcblx0XHR6ejogKCkgPT4gc3RyaXBUaW1lWm9uZShkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgdGltZVpvbmVOYW1lOiBcInNob3J0T2Zmc2V0XCIgfSkpLFxuXHRcdHp6ejogKCkgPT4gc3RyaXBUaW1lWm9uZShkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgdGltZVpvbmVOYW1lOiBcInNob3J0T2Zmc2V0XCIgfSkpLFxuXHRcdHp6eno6ICgpID0+IHN0cmlwVGltZVpvbmUoZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IHRpbWVab25lTmFtZTogXCJsb25nT2Zmc2V0XCIgfSkpXG5cdH07XG5cdHJldHVybiBmb3JtYXRTdHIucmVwbGFjZShSRUdFWF9GT1JNQVQsIChtYXRjaCwgJDEpID0+IHtcblx0XHR2YXIgX3JlZiwgX21hdGNoZXMkbWF0Y2g7XG5cdFx0cmV0dXJuIChfcmVmID0gJDEgIT09IG51bGwgJiYgJDEgIT09IHZvaWQgMCA/ICQxIDogKF9tYXRjaGVzJG1hdGNoID0gbWF0Y2hlc1ttYXRjaF0pID09PSBudWxsIHx8IF9tYXRjaGVzJG1hdGNoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWF0Y2hlcyRtYXRjaC5jYWxsKG1hdGNoZXMpKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogbWF0Y2g7XG5cdH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplRGF0ZShkYXRlKSB7XG5cdGlmIChkYXRlID09PSBudWxsKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKE5hTik7XG5cdGlmIChkYXRlID09PSB2b2lkIDApIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTtcblx0aWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG5cdGlmICh0eXBlb2YgZGF0ZSA9PT0gXCJzdHJpbmdcIiAmJiAhL1okL2kudGVzdChkYXRlKSkge1xuXHRcdGNvbnN0IGQgPSBkYXRlLm1hdGNoKFJFR0VYX1BBUlNFKTtcblx0XHRpZiAoZCkge1xuXHRcdFx0Y29uc3QgbSA9IGRbMl0gLSAxIHx8IDA7XG5cdFx0XHRjb25zdCBtcyA9IChkWzddIHx8IFwiMFwiKS5zdWJzdHJpbmcoMCwgMyk7XG5cdFx0XHRyZXR1cm4gbmV3IERhdGUoZFsxXSwgbSwgZFszXSB8fCAxLCBkWzRdIHx8IDAsIGRbNV0gfHwgMCwgZFs2XSB8fCAwLCBtcyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbn1cbi8qKlxuKiBHZXQgdGhlIGZvcm1hdHRlZCBkYXRlIGFjY29yZGluZyB0byB0aGUgc3RyaW5nIG9mIHRva2VucyBwYXNzZWQgaW4uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURhdGVGb3JtYXRcbiogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBmb3JtYXQsIGNhbiBlaXRoZXIgYmUgYSBgRGF0ZWAgb2JqZWN0LCBhIHRpbWVzdGFtcCwgb3IgYSBzdHJpbmdcbiogQHBhcmFtIGZvcm1hdFN0ciAtIFRoZSBjb21iaW5hdGlvbiBvZiB0b2tlbnMgdG8gZm9ybWF0IHRoZSBkYXRlXG4qIEBwYXJhbSBvcHRpb25zIC0gVXNlRGF0ZUZvcm1hdE9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEYXRlRm9ybWF0KGRhdGUsIGZvcm1hdFN0ciA9IFwiSEg6bW06c3NcIiwgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiBmb3JtYXREYXRlKG5vcm1hbGl6ZURhdGUodG9WYWx1ZShkYXRlKSksIHRvVmFsdWUoZm9ybWF0U3RyKSwgb3B0aW9ucykpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VJbnRlcnZhbEZuL2luZGV4LnRzXG4vKipcbiogV3JhcHBlciBmb3IgYHNldEludGVydmFsYCB3aXRoIGNvbnRyb2xzXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUludGVydmFsRm5cbiogQHBhcmFtIGNiXG4qIEBwYXJhbSBpbnRlcnZhbFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUludGVydmFsRm4oY2IsIGludGVydmFsID0gMWUzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBpbW1lZGlhdGVDYWxsYmFjayA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRsZXQgdGltZXIgPSBudWxsO1xuXHRjb25zdCBpc0FjdGl2ZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRmdW5jdGlvbiBjbGVhbigpIHtcblx0XHRpZiAodGltZXIpIHtcblx0XHRcdGNsZWFySW50ZXJ2YWwodGltZXIpO1xuXHRcdFx0dGltZXIgPSBudWxsO1xuXHRcdH1cblx0fVxuXHRmdW5jdGlvbiBwYXVzZSgpIHtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHRcdGNsZWFuKCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzdW1lKCkge1xuXHRcdGNvbnN0IGludGVydmFsVmFsdWUgPSB0b1ZhbHVlKGludGVydmFsKTtcblx0XHRpZiAoaW50ZXJ2YWxWYWx1ZSA8PSAwKSByZXR1cm47XG5cdFx0aXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuXHRcdGlmIChpbW1lZGlhdGVDYWxsYmFjaykgY2IoKTtcblx0XHRjbGVhbigpO1xuXHRcdGlmIChpc0FjdGl2ZS52YWx1ZSkgdGltZXIgPSBzZXRJbnRlcnZhbChjYiwgaW50ZXJ2YWxWYWx1ZSk7XG5cdH1cblx0aWYgKGltbWVkaWF0ZSAmJiBpc0NsaWVudCkgcmVzdW1lKCk7XG5cdGlmIChpc1JlZihpbnRlcnZhbCkgfHwgdHlwZW9mIGludGVydmFsID09PSBcImZ1bmN0aW9uXCIpIHRyeU9uU2NvcGVEaXNwb3NlKHdhdGNoKGludGVydmFsLCAoKSA9PiB7XG5cdFx0aWYgKGlzQWN0aXZlLnZhbHVlICYmIGlzQ2xpZW50KSByZXN1bWUoKTtcblx0fSkpO1xuXHR0cnlPblNjb3BlRGlzcG9zZShwYXVzZSk7XG5cdHJldHVybiB7XG5cdFx0aXNBY3RpdmU6IHNoYWxsb3dSZWFkb25seShpc0FjdGl2ZSksXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUludGVydmFsL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VJbnRlcnZhbChpbnRlcnZhbCA9IDFlMywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIGltbWVkaWF0ZSA9IHRydWUsIGNhbGxiYWNrIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjb3VudGVyID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4gY291bnRlci52YWx1ZSArPSAxO1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHRjb3VudGVyLnZhbHVlID0gMDtcblx0fTtcblx0Y29uc3QgY29udHJvbHMgPSB1c2VJbnRlcnZhbEZuKGNhbGxiYWNrID8gKCkgPT4ge1xuXHRcdHVwZGF0ZSgpO1xuXHRcdGNhbGxiYWNrKGNvdW50ZXIudmFsdWUpO1xuXHR9IDogdXBkYXRlLCBpbnRlcnZhbCwgeyBpbW1lZGlhdGUgfSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHRjb3VudGVyOiBzaGFsbG93UmVhZG9ubHkoY291bnRlciksXG5cdFx0cmVzZXQsXG5cdFx0Li4uY29udHJvbHNcblx0fTtcblx0ZWxzZSByZXR1cm4gc2hhbGxvd1JlYWRvbmx5KGNvdW50ZXIpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VMYXN0Q2hhbmdlZC9pbmRleC50c1xuZnVuY3Rpb24gdXNlTGFzdENoYW5nZWQoc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGluaXRpYWxWYWx1ZTtcblx0Y29uc3QgbXMgPSBzaGFsbG93UmVmKChfb3B0aW9ucyRpbml0aWFsVmFsdWUgPSBvcHRpb25zLmluaXRpYWxWYWx1ZSkgIT09IG51bGwgJiYgX29wdGlvbnMkaW5pdGlhbFZhbHVlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRpbml0aWFsVmFsdWUgOiBudWxsKTtcblx0d2F0Y2goc291cmNlLCAoKSA9PiBtcy52YWx1ZSA9IHRpbWVzdGFtcCgpLCBvcHRpb25zKTtcblx0cmV0dXJuIHNoYWxsb3dSZWFkb25seShtcyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRpbWVvdXRGbi9pbmRleC50c1xuLyoqXG4qIFdyYXBwZXIgZm9yIGBzZXRUaW1lb3V0YCB3aXRoIGNvbnRyb2xzLlxuKlxuKiBAcGFyYW0gY2JcbiogQHBhcmFtIGludGVydmFsXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVGltZW91dEZuKGNiLCBpbnRlcnZhbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW1tZWRpYXRlID0gdHJ1ZSwgaW1tZWRpYXRlQ2FsbGJhY2sgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNQZW5kaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGxldCB0aW1lcjtcblx0ZnVuY3Rpb24gY2xlYXIoKSB7XG5cdFx0aWYgKHRpbWVyKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0dGltZXIgPSB2b2lkIDA7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHN0b3AoKSB7XG5cdFx0aXNQZW5kaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xlYXIoKTtcblx0fVxuXHRmdW5jdGlvbiBzdGFydCguLi5hcmdzKSB7XG5cdFx0aWYgKGltbWVkaWF0ZUNhbGxiYWNrKSBjYigpO1xuXHRcdGNsZWFyKCk7XG5cdFx0aXNQZW5kaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHR0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0aXNQZW5kaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHR0aW1lciA9IHZvaWQgMDtcblx0XHRcdGNiKC4uLmFyZ3MpO1xuXHRcdH0sIHRvVmFsdWUoaW50ZXJ2YWwpKTtcblx0fVxuXHRpZiAoaW1tZWRpYXRlKSB7XG5cdFx0aXNQZW5kaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRpZiAoaXNDbGllbnQpIHN0YXJ0KCk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiB7XG5cdFx0aXNQZW5kaW5nOiBzaGFsbG93UmVhZG9ubHkoaXNQZW5kaW5nKSxcblx0XHRzdGFydCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRpbWVvdXQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVRpbWVvdXQoaW50ZXJ2YWwgPSAxZTMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNvbnRyb2xzOiBleHBvc2VDb250cm9scyA9IGZhbHNlLCBjYWxsYmFjayB9ID0gb3B0aW9ucztcblx0Y29uc3QgY29udHJvbHMgPSB1c2VUaW1lb3V0Rm4oY2FsbGJhY2sgIT09IG51bGwgJiYgY2FsbGJhY2sgIT09IHZvaWQgMCA/IGNhbGxiYWNrIDogbm9vcCwgaW50ZXJ2YWwsIG9wdGlvbnMpO1xuXHRjb25zdCByZWFkeSA9IGNvbXB1dGVkKCgpID0+ICFjb250cm9scy5pc1BlbmRpbmcudmFsdWUpO1xuXHRpZiAoZXhwb3NlQ29udHJvbHMpIHJldHVybiB7XG5cdFx0cmVhZHksXG5cdFx0Li4uY29udHJvbHNcblx0fTtcblx0ZWxzZSByZXR1cm4gcmVhZHk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRvTnVtYmVyL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBjb252ZXJ0IGEgc3RyaW5nIHJlZiB0byBudW1iZXIuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVG9OdW1iZXIodmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG1ldGhvZCA9IFwicGFyc2VGbG9hdFwiLCByYWRpeCwgbmFuVG9aZXJvIH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGxldCByZXNvbHZlZCA9IHRvVmFsdWUodmFsdWUpO1xuXHRcdGlmICh0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIpIHJlc29sdmVkID0gbWV0aG9kKHJlc29sdmVkKTtcblx0XHRlbHNlIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwic3RyaW5nXCIpIHJlc29sdmVkID0gTnVtYmVyW21ldGhvZF0ocmVzb2x2ZWQsIHJhZGl4KTtcblx0XHRpZiAobmFuVG9aZXJvICYmIE51bWJlci5pc05hTihyZXNvbHZlZCkpIHJlc29sdmVkID0gMDtcblx0XHRyZXR1cm4gcmVzb2x2ZWQ7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUb1N0cmluZy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgY29udmVydCBhIHJlZiB0byBzdHJpbmcuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRvU3RyaW5nXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVG9TdHJpbmcodmFsdWUpIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IGAke3RvVmFsdWUodmFsdWUpfWApO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUb2dnbGUvaW5kZXgudHNcbi8qKlxuKiBBIGJvb2xlYW4gcmVmIHdpdGggYSB0b2dnbGVyXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRvZ2dsZVxuKiBAcGFyYW0gW2luaXRpYWxWYWx1ZV1cbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUb2dnbGUoaW5pdGlhbFZhbHVlID0gZmFsc2UsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRydXRoeVZhbHVlID0gdHJ1ZSwgZmFsc3lWYWx1ZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB2YWx1ZUlzUmVmID0gaXNSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgX3ZhbHVlID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUpO1xuXHRmdW5jdGlvbiB0b2dnbGUodmFsdWUpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0X3ZhbHVlLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRyZXR1cm4gX3ZhbHVlLnZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCB0cnV0aHkgPSB0b1ZhbHVlKHRydXRoeVZhbHVlKTtcblx0XHRcdF92YWx1ZS52YWx1ZSA9IF92YWx1ZS52YWx1ZSA9PT0gdHJ1dGh5ID8gdG9WYWx1ZShmYWxzeVZhbHVlKSA6IHRydXRoeTtcblx0XHRcdHJldHVybiBfdmFsdWUudmFsdWU7XG5cdFx0fVxuXHR9XG5cdGlmICh2YWx1ZUlzUmVmKSByZXR1cm4gdG9nZ2xlO1xuXHRlbHNlIHJldHVybiBbX3ZhbHVlLCB0b2dnbGVdO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaEFycmF5L2luZGV4LnRzXG4vKipcbiogV2F0Y2ggZm9yIGFuIGFycmF5IHdpdGggYWRkaXRpb25zIGFuZCByZW1vdmFscy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvd2F0Y2hBcnJheVxuKi9cbmZ1bmN0aW9uIHdhdGNoQXJyYXkoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRsZXQgb2xkTGlzdCA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaW1tZWRpYXRlKSA/IFtdIDogWy4uLnR5cGVvZiBzb3VyY2UgPT09IFwiZnVuY3Rpb25cIiA/IHNvdXJjZSgpIDogQXJyYXkuaXNBcnJheShzb3VyY2UpID8gc291cmNlIDogdG9WYWx1ZShzb3VyY2UpXTtcblx0cmV0dXJuIHdhdGNoKHNvdXJjZSwgKG5ld0xpc3QsIF8sIG9uQ2xlYW51cCkgPT4ge1xuXHRcdGNvbnN0IG9sZExpc3RSZW1haW5zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogb2xkTGlzdC5sZW5ndGggfSk7XG5cdFx0Y29uc3QgYWRkZWQgPSBbXTtcblx0XHRmb3IgKGNvbnN0IG9iaiBvZiBuZXdMaXN0KSB7XG5cdFx0XHRsZXQgZm91bmQgPSBmYWxzZTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb2xkTGlzdC5sZW5ndGg7IGkrKykgaWYgKCFvbGRMaXN0UmVtYWluc1tpXSAmJiBvYmogPT09IG9sZExpc3RbaV0pIHtcblx0XHRcdFx0b2xkTGlzdFJlbWFpbnNbaV0gPSB0cnVlO1xuXHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFmb3VuZCkgYWRkZWQucHVzaChvYmopO1xuXHRcdH1cblx0XHRjb25zdCByZW1vdmVkID0gb2xkTGlzdC5maWx0ZXIoKF8kMSwgaSkgPT4gIW9sZExpc3RSZW1haW5zW2ldKTtcblx0XHRjYihuZXdMaXN0LCBvbGRMaXN0LCBhZGRlZCwgcmVtb3ZlZCwgb25DbGVhbnVwKTtcblx0XHRvbGRMaXN0ID0gWy4uLm5ld0xpc3RdO1xuXHR9LCBvcHRpb25zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hBdE1vc3QvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoQXRNb3N0KHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcblx0Y29uc3QgeyBjb3VudCwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGN1cnJlbnQgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCB7IHN0b3AsIHJlc3VtZSwgcGF1c2UgfSA9IHdhdGNoV2l0aEZpbHRlcihzb3VyY2UsICguLi5hcmdzKSA9PiB7XG5cdFx0Y3VycmVudC52YWx1ZSArPSAxO1xuXHRcdGlmIChjdXJyZW50LnZhbHVlID49IHRvVmFsdWUoY291bnQpKSBuZXh0VGljaygoKSA9PiBzdG9wKCkpO1xuXHRcdGNiKC4uLmFyZ3MpO1xuXHR9LCB3YXRjaE9wdGlvbnMpO1xuXHRyZXR1cm4ge1xuXHRcdGNvdW50OiBjdXJyZW50LFxuXHRcdHN0b3AsXG5cdFx0cmVzdW1lLFxuXHRcdHBhdXNlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoRGVib3VuY2VkL2luZGV4LnRzXG5mdW5jdGlvbiB3YXRjaERlYm91bmNlZChzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkZWJvdW5jZSA9IDAsIG1heFdhaXQgPSB2b2lkIDAsLi4ud2F0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgY2IsIHtcblx0XHQuLi53YXRjaE9wdGlvbnMsXG5cdFx0ZXZlbnRGaWx0ZXI6IGRlYm91bmNlRmlsdGVyKGRlYm91bmNlLCB7IG1heFdhaXQgfSlcblx0fSk7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGB3YXRjaERlYm91bmNlZGAgaW5zdGVhZCAqL1xuY29uc3QgZGVib3VuY2VkV2F0Y2ggPSB3YXRjaERlYm91bmNlZDtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hEZWVwL2luZGV4LnRzXG4vKipcbiogU2hvcnRoYW5kIGZvciB3YXRjaGluZyB2YWx1ZSB3aXRoIHtkZWVwOiB0cnVlfVxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy93YXRjaERlZXBcbiovXG5mdW5jdGlvbiB3YXRjaERlZXAoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCBjYiwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0ZGVlcDogdHJ1ZVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hJZ25vcmFibGUvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoSWdub3JhYmxlKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyID0gYnlwYXNzRmlsdGVyLC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0Y29uc3QgZmlsdGVyZWRDYiA9IGNyZWF0ZUZpbHRlcldyYXBwZXIoZXZlbnRGaWx0ZXIsIGNiKTtcblx0bGV0IGlnbm9yZVVwZGF0ZXM7XG5cdGxldCBpZ25vcmVQcmV2QXN5bmNVcGRhdGVzO1xuXHRsZXQgc3RvcDtcblx0aWYgKHdhdGNoT3B0aW9ucy5mbHVzaCA9PT0gXCJzeW5jXCIpIHtcblx0XHRsZXQgaWdub3JlID0gZmFsc2U7XG5cdFx0aWdub3JlUHJldkFzeW5jVXBkYXRlcyA9ICgpID0+IHt9O1xuXHRcdGlnbm9yZVVwZGF0ZXMgPSAodXBkYXRlcikgPT4ge1xuXHRcdFx0aWdub3JlID0gdHJ1ZTtcblx0XHRcdHVwZGF0ZXIoKTtcblx0XHRcdGlnbm9yZSA9IGZhbHNlO1xuXHRcdH07XG5cdFx0c3RvcCA9IHdhdGNoKHNvdXJjZSwgKC4uLmFyZ3MpID0+IHtcblx0XHRcdGlmICghaWdub3JlKSBmaWx0ZXJlZENiKC4uLmFyZ3MpO1xuXHRcdH0sIHdhdGNoT3B0aW9ucyk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgZGlzcG9zYWJsZXMgPSBbXTtcblx0XHRsZXQgaWdub3JlQ291bnRlciA9IDA7XG5cdFx0bGV0IHN5bmNDb3VudGVyID0gMDtcblx0XHRpZ25vcmVQcmV2QXN5bmNVcGRhdGVzID0gKCkgPT4ge1xuXHRcdFx0aWdub3JlQ291bnRlciA9IHN5bmNDb3VudGVyO1xuXHRcdH07XG5cdFx0ZGlzcG9zYWJsZXMucHVzaCh3YXRjaChzb3VyY2UsICgpID0+IHtcblx0XHRcdHN5bmNDb3VudGVyKys7XG5cdFx0fSwge1xuXHRcdFx0Li4ud2F0Y2hPcHRpb25zLFxuXHRcdFx0Zmx1c2g6IFwic3luY1wiXG5cdFx0fSkpO1xuXHRcdGlnbm9yZVVwZGF0ZXMgPSAodXBkYXRlcikgPT4ge1xuXHRcdFx0Y29uc3Qgc3luY0NvdW50ZXJQcmV2ID0gc3luY0NvdW50ZXI7XG5cdFx0XHR1cGRhdGVyKCk7XG5cdFx0XHRpZ25vcmVDb3VudGVyICs9IHN5bmNDb3VudGVyIC0gc3luY0NvdW50ZXJQcmV2O1xuXHRcdH07XG5cdFx0ZGlzcG9zYWJsZXMucHVzaCh3YXRjaChzb3VyY2UsICguLi5hcmdzKSA9PiB7XG5cdFx0XHRjb25zdCBpZ25vcmUgPSBpZ25vcmVDb3VudGVyID4gMCAmJiBpZ25vcmVDb3VudGVyID09PSBzeW5jQ291bnRlcjtcblx0XHRcdGlnbm9yZUNvdW50ZXIgPSAwO1xuXHRcdFx0c3luY0NvdW50ZXIgPSAwO1xuXHRcdFx0aWYgKGlnbm9yZSkgcmV0dXJuO1xuXHRcdFx0ZmlsdGVyZWRDYiguLi5hcmdzKTtcblx0XHR9LCB3YXRjaE9wdGlvbnMpKTtcblx0XHRzdG9wID0gKCkgPT4ge1xuXHRcdFx0ZGlzcG9zYWJsZXMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzdG9wLFxuXHRcdGlnbm9yZVVwZGF0ZXMsXG5cdFx0aWdub3JlUHJldkFzeW5jVXBkYXRlc1xuXHR9O1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgd2F0Y2hJZ25vcmFibGVgIGluc3RlYWQgKi9cbmNvbnN0IGlnbm9yYWJsZVdhdGNoID0gd2F0Y2hJZ25vcmFibGU7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoSW1tZWRpYXRlL2luZGV4LnRzXG4vKipcbiogU2hvcnRoYW5kIGZvciB3YXRjaGluZyB2YWx1ZSB3aXRoIHtpbW1lZGlhdGU6IHRydWV9XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3dhdGNoSW1tZWRpYXRlXG4qL1xuZnVuY3Rpb24gd2F0Y2hJbW1lZGlhdGUoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCBjYiwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0aW1tZWRpYXRlOiB0cnVlXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaE9uY2UvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHdhdGNoaW5nIHZhbHVlIHdpdGggeyBvbmNlOiB0cnVlIH1cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvd2F0Y2hPbmNlXG4qL1xuZnVuY3Rpb24gd2F0Y2hPbmNlKHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcblx0cmV0dXJuIHdhdGNoKHNvdXJjZSwgY2IsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdG9uY2U6IHRydWVcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoVGhyb3R0bGVkL2luZGV4LnRzXG5mdW5jdGlvbiB3YXRjaFRocm90dGxlZChzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0aHJvdHRsZSA9IDAsIHRyYWlsaW5nID0gdHJ1ZSwgbGVhZGluZyA9IHRydWUsLi4ud2F0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgY2IsIHtcblx0XHQuLi53YXRjaE9wdGlvbnMsXG5cdFx0ZXZlbnRGaWx0ZXI6IHRocm90dGxlRmlsdGVyKHRocm90dGxlLCB0cmFpbGluZywgbGVhZGluZylcblx0fSk7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGB3YXRjaFRocm90dGxlZGAgaW5zdGVhZCAqL1xuY29uc3QgdGhyb3R0bGVkV2F0Y2ggPSB3YXRjaFRocm90dGxlZDtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hUcmlnZ2VyYWJsZS9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hUcmlnZ2VyYWJsZShzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcblx0bGV0IGNsZWFudXBGbjtcblx0ZnVuY3Rpb24gb25FZmZlY3QoKSB7XG5cdFx0aWYgKCFjbGVhbnVwRm4pIHJldHVybjtcblx0XHRjb25zdCBmbiA9IGNsZWFudXBGbjtcblx0XHRjbGVhbnVwRm4gPSB2b2lkIDA7XG5cdFx0Zm4oKTtcblx0fVxuXHQvKiogUmVnaXN0ZXIgdGhlIGZ1bmN0aW9uIGBjbGVhbnVwRm5gICovXG5cdGZ1bmN0aW9uIG9uQ2xlYW51cChjYWxsYmFjaykge1xuXHRcdGNsZWFudXBGbiA9IGNhbGxiYWNrO1xuXHR9XG5cdGNvbnN0IF9jYiA9ICh2YWx1ZSwgb2xkVmFsdWUpID0+IHtcblx0XHRvbkVmZmVjdCgpO1xuXHRcdHJldHVybiBjYih2YWx1ZSwgb2xkVmFsdWUsIG9uQ2xlYW51cCk7XG5cdH07XG5cdGNvbnN0IHJlcyA9IHdhdGNoSWdub3JhYmxlKHNvdXJjZSwgX2NiLCBvcHRpb25zKTtcblx0Y29uc3QgeyBpZ25vcmVVcGRhdGVzIH0gPSByZXM7XG5cdGNvbnN0IHRyaWdnZXIgPSAoKSA9PiB7XG5cdFx0bGV0IHJlcyQxO1xuXHRcdGlnbm9yZVVwZGF0ZXMoKCkgPT4ge1xuXHRcdFx0cmVzJDEgPSBfY2IoZ2V0V2F0Y2hTb3VyY2VzKHNvdXJjZSksIGdldE9sZFZhbHVlKHNvdXJjZSkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiByZXMkMTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHQuLi5yZXMsXG5cdFx0dHJpZ2dlclxuXHR9O1xufVxuZnVuY3Rpb24gZ2V0V2F0Y2hTb3VyY2VzKHNvdXJjZXMpIHtcblx0aWYgKGlzUmVhY3RpdmUoc291cmNlcykpIHJldHVybiBzb3VyY2VzO1xuXHRpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VzKSkgcmV0dXJuIHNvdXJjZXMubWFwKChpdGVtKSA9PiB0b1ZhbHVlKGl0ZW0pKTtcblx0cmV0dXJuIHRvVmFsdWUoc291cmNlcyk7XG59XG5mdW5jdGlvbiBnZXRPbGRWYWx1ZShzb3VyY2UpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkoc291cmNlKSA/IHNvdXJjZS5tYXAoKCkgPT4gdm9pZCAwKSA6IHZvaWQgMDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2hlbmV2ZXIvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHdhdGNoaW5nIHZhbHVlIHRvIGJlIHRydXRoeVxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy93aGVuZXZlclxuKi9cbmZ1bmN0aW9uIHdoZW5ldmVyKHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcblx0Y29uc3Qgc3RvcCA9IHdhdGNoKHNvdXJjZSwgKHYsIG92LCBvbkludmFsaWRhdGUpID0+IHtcblx0XHRpZiAodikge1xuXHRcdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vbmNlKSBuZXh0VGljaygoKSA9PiBzdG9wKCkpO1xuXHRcdFx0Y2Iodiwgb3YsIG9uSW52YWxpZGF0ZSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRvbmNlOiBmYWxzZVxuXHR9KTtcblx0cmV0dXJuIHN0b3A7XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgYXNzZXJ0LCBhdXRvUmVzZXRSZWYsIGJ5cGFzc0ZpbHRlciwgY2FtZWxpemUsIGNsYW1wLCBjb21wdXRlZEVhZ2VyLCBjb21wdXRlZFdpdGhDb250cm9sLCBjb250YWluc1Byb3AsIGNvbnRyb2xsZWRDb21wdXRlZCwgY29udHJvbGxlZFJlZiwgY3JlYXRlRXZlbnRIb29rLCBjcmVhdGVGaWx0ZXJXcmFwcGVyLCBjcmVhdGVHbG9iYWxTdGF0ZSwgY3JlYXRlSW5qZWN0aW9uU3RhdGUsIGNyZWF0ZVJlYWN0aXZlRm4sIGNyZWF0ZVJlZiwgY3JlYXRlU2hhcmVkQ29tcG9zYWJsZSwgY3JlYXRlU2luZ2xldG9uUHJvbWlzZSwgZGVib3VuY2VGaWx0ZXIsIGRlYm91bmNlZFJlZiwgZGVib3VuY2VkV2F0Y2gsIGVhZ2VyQ29tcHV0ZWQsIGV4dGVuZFJlZiwgZm9ybWF0RGF0ZSwgZ2V0LCBnZXRMaWZlQ3ljbGVUYXJnZXQsIGhhc093biwgaHlwaGVuYXRlLCBpZGVudGl0eSwgaWdub3JhYmxlV2F0Y2gsIGluY3JlYXNlV2l0aFVuaXQsIGluamVjdExvY2FsLCBpbnZva2UsIGlzQ2xpZW50LCBpc0RlZiwgaXNEZWZpbmVkLCBpc0lPUywgaXNPYmplY3QsIGlzV29ya2VyLCBtYWtlRGVzdHJ1Y3R1cmFibGUsIG5vb3AsIG5vcm1hbGl6ZURhdGUsIG5vdE51bGxpc2gsIG5vdywgb2JqZWN0RW50cmllcywgb2JqZWN0T21pdCwgb2JqZWN0UGljaywgcGF1c2FibGVGaWx0ZXIsIHBhdXNhYmxlV2F0Y2gsIHByb21pc2VUaW1lb3V0LCBwcm92aWRlTG9jYWwsIHB4VmFsdWUsIHJhbmQsIHJlYWN0aWZ5LCByZWFjdGlmeU9iamVjdCwgcmVhY3RpdmVDb21wdXRlZCwgcmVhY3RpdmVPbWl0LCByZWFjdGl2ZVBpY2ssIHJlZkF1dG9SZXNldCwgcmVmRGVib3VuY2VkLCByZWZEZWZhdWx0LCByZWZNYW51YWxSZXNldCwgcmVmVGhyb3R0bGVkLCByZWZXaXRoQ29udHJvbCwgc2V0LCBzeW5jUmVmLCBzeW5jUmVmcywgdGhyb3R0bGVGaWx0ZXIsIHRocm90dGxlZFJlZiwgdGhyb3R0bGVkV2F0Y2gsIHRpbWVzdGFtcCwgdG9BcnJheSwgdG9SZWFjdGl2ZSwgdG9SZWYsIHRvUmVmcywgdHJ5T25CZWZvcmVNb3VudCwgdHJ5T25CZWZvcmVVbm1vdW50LCB0cnlPbk1vdW50ZWQsIHRyeU9uU2NvcGVEaXNwb3NlLCB0cnlPblVubW91bnRlZCwgdW50aWwsIHVzZUFycmF5RGlmZmVyZW5jZSwgdXNlQXJyYXlFdmVyeSwgdXNlQXJyYXlGaWx0ZXIsIHVzZUFycmF5RmluZCwgdXNlQXJyYXlGaW5kSW5kZXgsIHVzZUFycmF5RmluZExhc3QsIHVzZUFycmF5SW5jbHVkZXMsIHVzZUFycmF5Sm9pbiwgdXNlQXJyYXlNYXAsIHVzZUFycmF5UmVkdWNlLCB1c2VBcnJheVNvbWUsIHVzZUFycmF5VW5pcXVlLCB1c2VDb3VudGVyLCB1c2VEYXRlRm9ybWF0LCB1c2VEZWJvdW5jZSwgdXNlRGVib3VuY2VGbiwgdXNlSW50ZXJ2YWwsIHVzZUludGVydmFsRm4sIHVzZUxhc3RDaGFuZ2VkLCB1c2VUaHJvdHRsZSwgdXNlVGhyb3R0bGVGbiwgdXNlVGltZW91dCwgdXNlVGltZW91dEZuLCB1c2VUb051bWJlciwgdXNlVG9TdHJpbmcsIHVzZVRvZ2dsZSwgd2F0Y2hBcnJheSwgd2F0Y2hBdE1vc3QsIHdhdGNoRGVib3VuY2VkLCB3YXRjaERlZXAsIHdhdGNoSWdub3JhYmxlLCB3YXRjaEltbWVkaWF0ZSwgd2F0Y2hPbmNlLCB3YXRjaFBhdXNhYmxlLCB3YXRjaFRocm90dGxlZCwgd2F0Y2hUcmlnZ2VyYWJsZSwgd2F0Y2hXaXRoRmlsdGVyLCB3aGVuZXZlciB9OyIsImltcG9ydCB7IGJ5cGFzc0ZpbHRlciwgY2FtZWxpemUsIGNsYW1wLCBjb21wdXRlZFdpdGhDb250cm9sLCBjb250YWluc1Byb3AsIGNyZWF0ZUV2ZW50SG9vaywgY3JlYXRlRmlsdGVyV3JhcHBlciwgY3JlYXRlUmVmLCBjcmVhdGVTaW5nbGV0b25Qcm9taXNlLCBkZWJvdW5jZUZpbHRlciwgaGFzT3duLCBpZGVudGl0eSwgaW5jcmVhc2VXaXRoVW5pdCwgaW5qZWN0TG9jYWwsIGlzQ2xpZW50LCBpc0RlZiwgaXNJT1MsIGlzT2JqZWN0LCBpc1dvcmtlciwgbWFrZURlc3RydWN0dXJhYmxlLCBub29wLCBub3ROdWxsaXNoLCBvYmplY3RFbnRyaWVzLCBvYmplY3RPbWl0LCBvYmplY3RQaWNrLCBwYXVzYWJsZUZpbHRlciwgcHJvbWlzZVRpbWVvdXQsIHByb3ZpZGVMb2NhbCwgcHhWYWx1ZSwgc3luY1JlZiwgdGhyb3R0bGVGaWx0ZXIsIHRpbWVzdGFtcCwgdG9BcnJheSwgdG9SZWYsIHRvUmVmcywgdHJ5T25Nb3VudGVkLCB0cnlPblNjb3BlRGlzcG9zZSwgdHJ5T25Vbm1vdW50ZWQsIHVudGlsLCB1c2VEZWJvdW5jZUZuLCB1c2VJbnRlcnZhbEZuLCB1c2VUaHJvdHRsZUZuLCB1c2VUaW1lb3V0Rm4sIHdhdGNoSWdub3JhYmxlLCB3YXRjaEltbWVkaWF0ZSwgd2F0Y2hPbmNlLCB3YXRjaFBhdXNhYmxlLCB3YXRjaFdpdGhGaWx0ZXIsIHdoZW5ldmVyIH0gZnJvbSBcIkB2dWV1c2Uvc2hhcmVkXCI7XG5pbXBvcnQgeyBGcmFnbWVudCwgVHJhbnNpdGlvbkdyb3VwLCBjb21wdXRlZCwgY3VzdG9tUmVmLCBkZWZpbmVDb21wb25lbnQsIGdldEN1cnJlbnRJbnN0YW5jZSwgZ2V0Q3VycmVudFNjb3BlLCBoLCBoYXNJbmplY3Rpb25Db250ZXh0LCBpbmplY3QsIGlzUmVhZG9ubHksIGlzUmVmLCBtYXJrUmF3LCBuZXh0VGljaywgb25CZWZvcmVVcGRhdGUsIG9uTW91bnRlZCwgb25VcGRhdGVkLCByZWFjdGl2ZSwgcmVhZG9ubHksIHJlZiwgc2hhbGxvd1JlYWN0aXZlLCBzaGFsbG93UmVhZG9ubHksIHNoYWxsb3dSZWYsIHRvUmF3LCB0b1ZhbHVlLCB1bnJlZiwgd2F0Y2gsIHdhdGNoRWZmZWN0IH0gZnJvbSBcInZ1ZVwiO1xuXG5leHBvcnQgKiBmcm9tIFwiQHZ1ZXVzZS9zaGFyZWRcIlxuXG4vLyNyZWdpb24gY29tcHV0ZWRBc3luYy9pbmRleC50c1xuZnVuY3Rpb24gY29tcHV0ZWRBc3luYyhldmFsdWF0aW9uQ2FsbGJhY2ssIGluaXRpYWxTdGF0ZSwgb3B0aW9uc09yUmVmKSB7XG5cdHZhciBfZ2xvYmFsVGhpcyRyZXBvcnRFcnI7XG5cdGxldCBvcHRpb25zO1xuXHRpZiAoaXNSZWYob3B0aW9uc09yUmVmKSkgb3B0aW9ucyA9IHsgZXZhbHVhdGluZzogb3B0aW9uc09yUmVmIH07XG5cdGVsc2Ugb3B0aW9ucyA9IG9wdGlvbnNPclJlZiB8fCB7fTtcblx0Y29uc3QgeyBsYXp5ID0gZmFsc2UsIGZsdXNoID0gXCJzeW5jXCIsIGV2YWx1YXRpbmcgPSB2b2lkIDAsIHNoYWxsb3cgPSB0cnVlLCBvbkVycm9yID0gKF9nbG9iYWxUaGlzJHJlcG9ydEVyciA9IGdsb2JhbFRoaXMucmVwb3J0RXJyb3IpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJHJlcG9ydEVyciAhPT0gdm9pZCAwID8gX2dsb2JhbFRoaXMkcmVwb3J0RXJyIDogbm9vcCB9ID0gb3B0aW9ucztcblx0Y29uc3Qgc3RhcnRlZCA9IHNoYWxsb3dSZWYoIWxhenkpO1xuXHRjb25zdCBjdXJyZW50ID0gc2hhbGxvdyA/IHNoYWxsb3dSZWYoaW5pdGlhbFN0YXRlKSA6IHJlZihpbml0aWFsU3RhdGUpO1xuXHRsZXQgY291bnRlciA9IDA7XG5cdHdhdGNoRWZmZWN0KGFzeW5jIChvbkludmFsaWRhdGUpID0+IHtcblx0XHRpZiAoIXN0YXJ0ZWQudmFsdWUpIHJldHVybjtcblx0XHRjb3VudGVyKys7XG5cdFx0Y29uc3QgY291bnRlckF0QmVnaW5uaW5nID0gY291bnRlcjtcblx0XHRsZXQgaGFzRmluaXNoZWQgPSBmYWxzZTtcblx0XHRpZiAoZXZhbHVhdGluZykgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG5cdFx0XHRldmFsdWF0aW5nLnZhbHVlID0gdHJ1ZTtcblx0XHR9KTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgZXZhbHVhdGlvbkNhbGxiYWNrKChjYW5jZWxDYWxsYmFjaykgPT4ge1xuXHRcdFx0XHRvbkludmFsaWRhdGUoKCkgPT4ge1xuXHRcdFx0XHRcdGlmIChldmFsdWF0aW5nKSBldmFsdWF0aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKCFoYXNGaW5pc2hlZCkgY2FuY2VsQ2FsbGJhY2soKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChjb3VudGVyQXRCZWdpbm5pbmcgPT09IGNvdW50ZXIpIGN1cnJlbnQudmFsdWUgPSByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKGV2YWx1YXRpbmcgJiYgY291bnRlckF0QmVnaW5uaW5nID09PSBjb3VudGVyKSBldmFsdWF0aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRoYXNGaW5pc2hlZCA9IHRydWU7XG5cdFx0fVxuXHR9LCB7IGZsdXNoIH0pO1xuXHRpZiAobGF6eSkgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcblx0XHRzdGFydGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRyZXR1cm4gY3VycmVudC52YWx1ZTtcblx0fSk7XG5cdGVsc2UgcmV0dXJuIGN1cnJlbnQ7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGBjb21wdXRlZEFzeW5jYCBpbnN0ZWFkICovXG5jb25zdCBhc3luY0NvbXB1dGVkID0gY29tcHV0ZWRBc3luYztcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY29tcHV0ZWRJbmplY3QvaW5kZXgudHNcbmZ1bmN0aW9uIGNvbXB1dGVkSW5qZWN0KGtleSwgb3B0aW9ucywgZGVmYXVsdFNvdXJjZSwgdHJlYXREZWZhdWx0QXNGYWN0b3J5KSB7XG5cdGxldCBzb3VyY2UgPSBpbmplY3Qoa2V5KTtcblx0aWYgKGRlZmF1bHRTb3VyY2UpIHNvdXJjZSA9IGluamVjdChrZXksIGRlZmF1bHRTb3VyY2UpO1xuXHRpZiAodHJlYXREZWZhdWx0QXNGYWN0b3J5KSBzb3VyY2UgPSBpbmplY3Qoa2V5LCBkZWZhdWx0U291cmNlLCB0cmVhdERlZmF1bHRBc0ZhY3RvcnkpO1xuXHRpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGNvbXB1dGVkKChvbGRWYWx1ZSkgPT4gb3B0aW9ucyhzb3VyY2UsIG9sZFZhbHVlKSk7XG5cdGVsc2UgcmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQ6IChvbGRWYWx1ZSkgPT4gb3B0aW9ucy5nZXQoc291cmNlLCBvbGRWYWx1ZSksXG5cdFx0c2V0OiBvcHRpb25zLnNldFxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlUmV1c2FibGVUZW1wbGF0ZS9pbmRleC50c1xuLyoqXG4qIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBgZGVmaW5lYCBhbmQgYHJldXNlYCBjb21wb25lbnRzIGluIHBhaXIsXG4qIEl0IGFsc28gYWxsb3cgdG8gcGFzcyBhIGdlbmVyaWMgdG8gYmluZCB3aXRoIHR5cGUuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZVJldXNhYmxlVGVtcGxhdGVcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVSZXVzYWJsZVRlbXBsYXRlKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluaGVyaXRBdHRycyA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJlbmRlciA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgZGVmaW5lID0gZGVmaW5lQ29tcG9uZW50KHsgc2V0dXAoXywgeyBzbG90cyB9KSB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHJlbmRlci52YWx1ZSA9IHNsb3RzLmRlZmF1bHQ7XG5cdFx0fTtcblx0fSB9KTtcblx0Y29uc3QgcmV1c2UgPSBkZWZpbmVDb21wb25lbnQoe1xuXHRcdGluaGVyaXRBdHRycyxcblx0XHRwcm9wczogb3B0aW9ucy5wcm9wcyxcblx0XHRzZXR1cChwcm9wcywgeyBhdHRycywgc2xvdHMgfSkge1xuXHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0dmFyIF9yZW5kZXIkdmFsdWU7XG5cdFx0XHRcdGlmICghcmVuZGVyLnZhbHVlICYmIHRydWUpIHRocm93IG5ldyBFcnJvcihcIltWdWVVc2VdIEZhaWxlZCB0byBmaW5kIHRoZSBkZWZpbml0aW9uIG9mIHJldXNhYmxlIHRlbXBsYXRlXCIpO1xuXHRcdFx0XHRjb25zdCB2bm9kZSA9IChfcmVuZGVyJHZhbHVlID0gcmVuZGVyLnZhbHVlKSA9PT0gbnVsbCB8fCBfcmVuZGVyJHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcmVuZGVyJHZhbHVlLmNhbGwocmVuZGVyLCB7XG5cdFx0XHRcdFx0Li4ub3B0aW9ucy5wcm9wcyA9PSBudWxsID8ga2V5c1RvQ2FtZWxLZWJhYkNhc2UoYXR0cnMpIDogcHJvcHMsXG5cdFx0XHRcdFx0JHNsb3RzOiBzbG90c1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGluaGVyaXRBdHRycyAmJiAodm5vZGUgPT09IG51bGwgfHwgdm5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZub2RlLmxlbmd0aCkgPT09IDEgPyB2bm9kZVswXSA6IHZub2RlO1xuXHRcdFx0fTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gbWFrZURlc3RydWN0dXJhYmxlKHtcblx0XHRkZWZpbmUsXG5cdFx0cmV1c2Vcblx0fSwgW2RlZmluZSwgcmV1c2VdKTtcbn1cbmZ1bmN0aW9uIGtleXNUb0NhbWVsS2ViYWJDYXNlKG9iaikge1xuXHRjb25zdCBuZXdPYmogPSB7fTtcblx0Zm9yIChjb25zdCBrZXkgaW4gb2JqKSBuZXdPYmpbY2FtZWxpemUoa2V5KV0gPSBvYmpba2V5XTtcblx0cmV0dXJuIG5ld09iajtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlVGVtcGxhdGVQcm9taXNlL2luZGV4LnRzXG4vKipcbiogQ3JlYXRlcyBhIHRlbXBsYXRlIHByb21pc2UgY29tcG9uZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9jcmVhdGVUZW1wbGF0ZVByb21pc2VcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVUZW1wbGF0ZVByb21pc2Uob3B0aW9ucyA9IHt9KSB7XG5cdGxldCBpbmRleCA9IDA7XG5cdGNvbnN0IGluc3RhbmNlcyA9IHJlZihbXSk7XG5cdGZ1bmN0aW9uIGNyZWF0ZSguLi5hcmdzKSB7XG5cdFx0Y29uc3QgcHJvcHMgPSBzaGFsbG93UmVhY3RpdmUoe1xuXHRcdFx0a2V5OiBpbmRleCsrLFxuXHRcdFx0YXJncyxcblx0XHRcdHByb21pc2U6IHZvaWQgMCxcblx0XHRcdHJlc29sdmU6ICgpID0+IHt9LFxuXHRcdFx0cmVqZWN0OiAoKSA9PiB7fSxcblx0XHRcdGlzUmVzb2x2aW5nOiBmYWxzZSxcblx0XHRcdG9wdGlvbnNcblx0XHR9KTtcblx0XHRpbnN0YW5jZXMudmFsdWUucHVzaChwcm9wcyk7XG5cdFx0cHJvcHMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuXHRcdFx0cHJvcHMucmVzb2x2ZSA9ICh2KSA9PiB7XG5cdFx0XHRcdHByb3BzLmlzUmVzb2x2aW5nID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIF9yZXNvbHZlKHYpO1xuXHRcdFx0fTtcblx0XHRcdHByb3BzLnJlamVjdCA9IF9yZWplY3Q7XG5cdFx0fSkuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRwcm9wcy5wcm9taXNlID0gdm9pZCAwO1xuXHRcdFx0Y29uc3QgaW5kZXgkMSA9IGluc3RhbmNlcy52YWx1ZS5pbmRleE9mKHByb3BzKTtcblx0XHRcdGlmIChpbmRleCQxICE9PSAtMSkgaW5zdGFuY2VzLnZhbHVlLnNwbGljZShpbmRleCQxLCAxKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gcHJvcHMucHJvbWlzZTtcblx0fVxuXHRmdW5jdGlvbiBzdGFydCguLi5hcmdzKSB7XG5cdFx0aWYgKG9wdGlvbnMuc2luZ2xldG9uICYmIGluc3RhbmNlcy52YWx1ZS5sZW5ndGggPiAwKSByZXR1cm4gaW5zdGFuY2VzLnZhbHVlWzBdLnByb21pc2U7XG5cdFx0cmV0dXJuIGNyZWF0ZSguLi5hcmdzKTtcblx0fVxuXHRjb25zdCBjb21wb25lbnQgPSBkZWZpbmVDb21wb25lbnQoKF8sIHsgc2xvdHMgfSkgPT4ge1xuXHRcdGNvbnN0IHJlbmRlckxpc3QgPSAoKSA9PiBpbnN0YW5jZXMudmFsdWUubWFwKChwcm9wcykgPT4ge1xuXHRcdFx0dmFyIF9zbG90cyRkZWZhdWx0O1xuXHRcdFx0cmV0dXJuIGgoRnJhZ21lbnQsIHsga2V5OiBwcm9wcy5rZXkgfSwgKF9zbG90cyRkZWZhdWx0ID0gc2xvdHMuZGVmYXVsdCkgPT09IG51bGwgfHwgX3Nsb3RzJGRlZmF1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zbG90cyRkZWZhdWx0LmNhbGwoc2xvdHMsIHByb3BzKSk7XG5cdFx0fSk7XG5cdFx0aWYgKG9wdGlvbnMudHJhbnNpdGlvbikgcmV0dXJuICgpID0+IGgoVHJhbnNpdGlvbkdyb3VwLCBvcHRpb25zLnRyYW5zaXRpb24sIHJlbmRlckxpc3QpO1xuXHRcdHJldHVybiByZW5kZXJMaXN0O1xuXHR9KTtcblx0Y29tcG9uZW50LnN0YXJ0ID0gc3RhcnQ7XG5cdHJldHVybiBjb21wb25lbnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGNyZWF0ZVVucmVmRm4vaW5kZXgudHNcbi8qKlxuKiBNYWtlIGEgcGxhaW4gZnVuY3Rpb24gYWNjZXB0aW5nIHJlZiBhbmQgcmF3IHZhbHVlcyBhcyBhcmd1bWVudHMuXG4qIFJldHVybnMgdGhlIHNhbWUgdmFsdWUgdGhlIHVuY29udmVydGVkIGZ1bmN0aW9uIHJldHVybnMsIHdpdGggcHJvcGVyIHR5cGluZy5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVVbnJlZkZuKGZuKSB7XG5cdHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MubWFwKChpKSA9PiB0b1ZhbHVlKGkpKSk7XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIF9jb25maWd1cmFibGUudHNcbmNvbnN0IGRlZmF1bHRXaW5kb3cgPSBpc0NsaWVudCA/IHdpbmRvdyA6IHZvaWQgMDtcbmNvbnN0IGRlZmF1bHREb2N1bWVudCA9IGlzQ2xpZW50ID8gd2luZG93LmRvY3VtZW50IDogdm9pZCAwO1xuY29uc3QgZGVmYXVsdE5hdmlnYXRvciA9IGlzQ2xpZW50ID8gd2luZG93Lm5hdmlnYXRvciA6IHZvaWQgMDtcbmNvbnN0IGRlZmF1bHRMb2NhdGlvbiA9IGlzQ2xpZW50ID8gd2luZG93LmxvY2F0aW9uIDogdm9pZCAwO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1bnJlZkVsZW1lbnQvaW5kZXgudHNcbi8qKlxuKiBHZXQgdGhlIGRvbSBlbGVtZW50IG9mIGEgcmVmIG9mIGVsZW1lbnQgb3IgVnVlIGNvbXBvbmVudCBpbnN0YW5jZVxuKlxuKiBAcGFyYW0gZWxSZWZcbiovXG5mdW5jdGlvbiB1bnJlZkVsZW1lbnQoZWxSZWYpIHtcblx0dmFyIF8kZWw7XG5cdGNvbnN0IHBsYWluID0gdG9WYWx1ZShlbFJlZik7XG5cdHJldHVybiAoXyRlbCA9IHBsYWluID09PSBudWxsIHx8IHBsYWluID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwbGFpbi4kZWwpICE9PSBudWxsICYmIF8kZWwgIT09IHZvaWQgMCA/IF8kZWwgOiBwbGFpbjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRXZlbnRMaXN0ZW5lci9pbmRleC50c1xuZnVuY3Rpb24gdXNlRXZlbnRMaXN0ZW5lciguLi5hcmdzKSB7XG5cdGNvbnN0IHJlZ2lzdGVyID0gKGVsLCBldmVudCwgbGlzdGVuZXIsIG9wdGlvbnMpID0+IHtcblx0XHRlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuICgpID0+IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zKTtcblx0fTtcblx0Y29uc3QgZmlyc3RQYXJhbVRhcmdldHMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgdGVzdCA9IHRvQXJyYXkodG9WYWx1ZShhcmdzWzBdKSkuZmlsdGVyKChlKSA9PiBlICE9IG51bGwpO1xuXHRcdHJldHVybiB0ZXN0LmV2ZXJ5KChlKSA9PiB0eXBlb2YgZSAhPT0gXCJzdHJpbmdcIikgPyB0ZXN0IDogdm9pZCAwO1xuXHR9KTtcblx0cmV0dXJuIHdhdGNoSW1tZWRpYXRlKCgpID0+IHtcblx0XHR2YXIgX2ZpcnN0UGFyYW1UYXJnZXRzJHZhLCBfZmlyc3RQYXJhbVRhcmdldHMkdmEyO1xuXHRcdHJldHVybiBbXG5cdFx0XHQoX2ZpcnN0UGFyYW1UYXJnZXRzJHZhID0gKF9maXJzdFBhcmFtVGFyZ2V0cyR2YTIgPSBmaXJzdFBhcmFtVGFyZ2V0cy52YWx1ZSkgPT09IG51bGwgfHwgX2ZpcnN0UGFyYW1UYXJnZXRzJHZhMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpcnN0UGFyYW1UYXJnZXRzJHZhMi5tYXAoKGUpID0+IHVucmVmRWxlbWVudChlKSkpICE9PSBudWxsICYmIF9maXJzdFBhcmFtVGFyZ2V0cyR2YSAhPT0gdm9pZCAwID8gX2ZpcnN0UGFyYW1UYXJnZXRzJHZhIDogW2RlZmF1bHRXaW5kb3ddLmZpbHRlcigoZSkgPT4gZSAhPSBudWxsKSxcblx0XHRcdHRvQXJyYXkodG9WYWx1ZShmaXJzdFBhcmFtVGFyZ2V0cy52YWx1ZSA/IGFyZ3NbMV0gOiBhcmdzWzBdKSksXG5cdFx0XHR0b0FycmF5KHVucmVmKGZpcnN0UGFyYW1UYXJnZXRzLnZhbHVlID8gYXJnc1syXSA6IGFyZ3NbMV0pKSxcblx0XHRcdHRvVmFsdWUoZmlyc3RQYXJhbVRhcmdldHMudmFsdWUgPyBhcmdzWzNdIDogYXJnc1syXSlcblx0XHRdO1xuXHR9LCAoW3Jhd190YXJnZXRzLCByYXdfZXZlbnRzLCByYXdfbGlzdGVuZXJzLCByYXdfb3B0aW9uc10sIF8sIG9uQ2xlYW51cCkgPT4ge1xuXHRcdGlmICghKHJhd190YXJnZXRzID09PSBudWxsIHx8IHJhd190YXJnZXRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiByYXdfdGFyZ2V0cy5sZW5ndGgpIHx8ICEocmF3X2V2ZW50cyA9PT0gbnVsbCB8fCByYXdfZXZlbnRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiByYXdfZXZlbnRzLmxlbmd0aCkgfHwgIShyYXdfbGlzdGVuZXJzID09PSBudWxsIHx8IHJhd19saXN0ZW5lcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd19saXN0ZW5lcnMubGVuZ3RoKSkgcmV0dXJuO1xuXHRcdGNvbnN0IG9wdGlvbnNDbG9uZSA9IGlzT2JqZWN0KHJhd19vcHRpb25zKSA/IHsgLi4ucmF3X29wdGlvbnMgfSA6IHJhd19vcHRpb25zO1xuXHRcdGNvbnN0IGNsZWFudXBzID0gcmF3X3RhcmdldHMuZmxhdE1hcCgoZWwpID0+IHJhd19ldmVudHMuZmxhdE1hcCgoZXZlbnQpID0+IHJhd19saXN0ZW5lcnMubWFwKChsaXN0ZW5lcikgPT4gcmVnaXN0ZXIoZWwsIGV2ZW50LCBsaXN0ZW5lciwgb3B0aW9uc0Nsb25lKSkpKTtcblx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0Y2xlYW51cHMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRcdH0pO1xuXHR9LCB7IGZsdXNoOiBcInBvc3RcIiB9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25DbGlja091dHNpZGUvaW5kZXgudHNcbmxldCBfaU9TV29ya2Fyb3VuZCA9IGZhbHNlO1xuZnVuY3Rpb24gb25DbGlja091dHNpZGUodGFyZ2V0LCBoYW5kbGVyLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaWdub3JlID0gW10sIGNhcHR1cmUgPSB0cnVlLCBkZXRlY3RJZnJhbWUgPSBmYWxzZSwgY29udHJvbHMgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIGNvbnRyb2xzID8ge1xuXHRcdHN0b3A6IG5vb3AsXG5cdFx0Y2FuY2VsOiBub29wLFxuXHRcdHRyaWdnZXI6IG5vb3Bcblx0fSA6IG5vb3A7XG5cdGlmIChpc0lPUyAmJiAhX2lPU1dvcmthcm91bmQpIHtcblx0XHRfaU9TV29ya2Fyb3VuZCA9IHRydWU7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0QXJyYXkuZnJvbSh3aW5kb3ckMS5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKS5mb3JFYWNoKChlbCkgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG5vb3AsIGxpc3RlbmVyT3B0aW9ucykpO1xuXHRcdHdpbmRvdyQxLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgbm9vcCwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRsZXQgc2hvdWxkTGlzdGVuID0gdHJ1ZTtcblx0Y29uc3Qgc2hvdWxkSWdub3JlID0gKGV2ZW50KSA9PiB7XG5cdFx0cmV0dXJuIHRvVmFsdWUoaWdub3JlKS5zb21lKCh0YXJnZXQkMSkgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiB0YXJnZXQkMSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIEFycmF5LmZyb20od2luZG93JDEuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0YXJnZXQkMSkpLnNvbWUoKGVsKSA9PiBlbCA9PT0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKGVsKSk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0JDEpO1xuXHRcdFx0XHRyZXR1cm4gZWwgJiYgKGV2ZW50LnRhcmdldCA9PT0gZWwgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoZWwpKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblx0LyoqXG5cdCogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdGFyZ2V0IGhhcyBtdWx0aXBsZSByb290IGVsZW1lbnRzLlxuXHQqIFJlZmVyZW5jZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Rlc3QtdXRpbHMvYmxvYi9jY2I0NjBiZTU1ZjlmNmJlMDVhYjcwODUwMGE0MWVjOGFkZjZmNGJjL3NyYy92dWUtd3JhcHBlci50cyNMMjFcblx0Ki9cblx0ZnVuY3Rpb24gaGFzTXVsdGlwbGVSb290cyh0YXJnZXQkMSkge1xuXHRcdGNvbnN0IHZtID0gdG9WYWx1ZSh0YXJnZXQkMSk7XG5cdFx0cmV0dXJuIHZtICYmIHZtLiQuc3ViVHJlZS5zaGFwZUZsYWcgPT09IDE2O1xuXHR9XG5cdGZ1bmN0aW9uIGNoZWNrTXVsdGlwbGVSb290cyh0YXJnZXQkMSwgZXZlbnQpIHtcblx0XHRjb25zdCB2bSA9IHRvVmFsdWUodGFyZ2V0JDEpO1xuXHRcdGNvbnN0IGNoaWxkcmVuID0gdm0uJC5zdWJUcmVlICYmIHZtLiQuc3ViVHJlZS5jaGlsZHJlbjtcblx0XHRpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCAhQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gY2hpbGRyZW4uc29tZSgoY2hpbGQpID0+IGNoaWxkLmVsID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoY2hpbGQuZWwpKTtcblx0fVxuXHRjb25zdCBsaXN0ZW5lciA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKGV2ZW50LnRhcmdldCA9PSBudWxsKSByZXR1cm47XG5cdFx0aWYgKCEoZWwgaW5zdGFuY2VvZiBFbGVtZW50KSAmJiBoYXNNdWx0aXBsZVJvb3RzKHRhcmdldCkgJiYgY2hlY2tNdWx0aXBsZVJvb3RzKHRhcmdldCwgZXZlbnQpKSByZXR1cm47XG5cdFx0aWYgKCFlbCB8fCBlbCA9PT0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKGVsKSkgcmV0dXJuO1xuXHRcdGlmIChcImRldGFpbFwiIGluIGV2ZW50ICYmIGV2ZW50LmRldGFpbCA9PT0gMCkgc2hvdWxkTGlzdGVuID0gIXNob3VsZElnbm9yZShldmVudCk7XG5cdFx0aWYgKCFzaG91bGRMaXN0ZW4pIHtcblx0XHRcdHNob3VsZExpc3RlbiA9IHRydWU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhhbmRsZXIoZXZlbnQpO1xuXHR9O1xuXHRsZXQgaXNQcm9jZXNzaW5nQ2xpY2sgPSBmYWxzZTtcblx0Y29uc3QgY2xlYW51cCA9IFtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImNsaWNrXCIsIChldmVudCkgPT4ge1xuXHRcdFx0aWYgKCFpc1Byb2Nlc3NpbmdDbGljaykge1xuXHRcdFx0XHRpc1Byb2Nlc3NpbmdDbGljayA9IHRydWU7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdGlzUHJvY2Vzc2luZ0NsaWNrID0gZmFsc2U7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0XHRsaXN0ZW5lcihldmVudCk7XG5cdFx0XHR9XG5cdFx0fSwge1xuXHRcdFx0cGFzc2l2ZTogdHJ1ZSxcblx0XHRcdGNhcHR1cmVcblx0XHR9KSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInBvaW50ZXJkb3duXCIsIChlKSA9PiB7XG5cdFx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdFx0c2hvdWxkTGlzdGVuID0gIXNob3VsZElnbm9yZShlKSAmJiAhIShlbCAmJiAhZS5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhlbCkpO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KSxcblx0XHRkZXRlY3RJZnJhbWUgJiYgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJibHVyXCIsIChldmVudCkgPT4ge1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHZhciBfd2luZG93JGRvY3VtZW50JGFjdGk7XG5cdFx0XHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0XHRcdGlmICgoKF93aW5kb3ckZG9jdW1lbnQkYWN0aSA9IHdpbmRvdyQxLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpID09PSBudWxsIHx8IF93aW5kb3ckZG9jdW1lbnQkYWN0aSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdyRkb2N1bWVudCRhY3RpLnRhZ05hbWUpID09PSBcIklGUkFNRVwiICYmICEoZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLmNvbnRhaW5zKHdpbmRvdyQxLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSkgaGFuZGxlcihldmVudCk7XG5cdFx0XHR9LCAwKTtcblx0XHR9LCB7IHBhc3NpdmU6IHRydWUgfSlcblx0XS5maWx0ZXIoQm9vbGVhbik7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiBjbGVhbnVwLmZvckVhY2goKGZuKSA9PiBmbigpKTtcblx0aWYgKGNvbnRyb2xzKSByZXR1cm4ge1xuXHRcdHN0b3AsXG5cdFx0Y2FuY2VsOiAoKSA9PiB7XG5cdFx0XHRzaG91bGRMaXN0ZW4gPSBmYWxzZTtcblx0XHR9LFxuXHRcdHRyaWdnZXI6IChldmVudCkgPT4ge1xuXHRcdFx0c2hvdWxkTGlzdGVuID0gdHJ1ZTtcblx0XHRcdGxpc3RlbmVyKGV2ZW50KTtcblx0XHRcdHNob3VsZExpc3RlbiA9IGZhbHNlO1xuXHRcdH1cblx0fTtcblx0cmV0dXJuIHN0b3A7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1vdW50ZWQvaW5kZXgudHNcbi8qKlxuKiBNb3VudGVkIHN0YXRlIGluIHJlZi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTW91bnRlZFxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZU1vdW50ZWQoKSB7XG5cdGNvbnN0IGlzTW91bnRlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuXHRpZiAoaW5zdGFuY2UpIG9uTW91bnRlZCgoKSA9PiB7XG5cdFx0aXNNb3VudGVkLnZhbHVlID0gdHJ1ZTtcblx0fSwgaW5zdGFuY2UpO1xuXHRyZXR1cm4gaXNNb3VudGVkO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTdXBwb3J0ZWQvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VTdXBwb3J0ZWQoY2FsbGJhY2spIHtcblx0Y29uc3QgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlzTW91bnRlZC52YWx1ZTtcblx0XHRyZXR1cm4gQm9vbGVhbihjYWxsYmFjaygpKTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU11dGF0aW9uT2JzZXJ2ZXIvaW5kZXgudHNcbi8qKlxuKiBXYXRjaCBmb3IgY2hhbmdlcyBiZWluZyBtYWRlIHRvIHRoZSBET00gdHJlZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTXV0YXRpb25PYnNlcnZlclxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9NdXRhdGlvbk9ic2VydmVyIE11dGF0aW9uT2JzZXJ2ZXIgTUROXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIGNhbGxiYWNrXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTXV0YXRpb25PYnNlcnZlcih0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywuLi5tdXRhdGlvbk9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGxldCBvYnNlcnZlcjtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiTXV0YXRpb25PYnNlcnZlclwiIGluIHdpbmRvdyQxKTtcblx0Y29uc3QgY2xlYW51cCA9ICgpID0+IHtcblx0XHRpZiAob2JzZXJ2ZXIpIHtcblx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdG9ic2VydmVyID0gdm9pZCAwO1xuXHRcdH1cblx0fTtcblx0Y29uc3Qgc3RvcFdhdGNoID0gd2F0Y2goY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IGl0ZW1zID0gdG9BcnJheSh0b1ZhbHVlKHRhcmdldCkpLm1hcCh1bnJlZkVsZW1lbnQpLmZpbHRlcihub3ROdWxsaXNoKTtcblx0XHRyZXR1cm4gbmV3IFNldChpdGVtcyk7XG5cdH0pLCAobmV3VGFyZ2V0cykgPT4ge1xuXHRcdGNsZWFudXAoKTtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgbmV3VGFyZ2V0cy5zaXplKSB7XG5cdFx0XHRvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcblx0XHRcdG5ld1RhcmdldHMuZm9yRWFjaCgoZWwpID0+IG9ic2VydmVyLm9ic2VydmUoZWwsIG11dGF0aW9uT3B0aW9ucykpO1xuXHRcdH1cblx0fSwge1xuXHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRmbHVzaDogXCJwb3N0XCJcblx0fSk7XG5cdGNvbnN0IHRha2VSZWNvcmRzID0gKCkgPT4ge1xuXHRcdHJldHVybiBvYnNlcnZlciA9PT0gbnVsbCB8fCBvYnNlcnZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JzZXJ2ZXIudGFrZVJlY29yZHMoKTtcblx0fTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRzdG9wV2F0Y2goKTtcblx0XHRjbGVhbnVwKCk7XG5cdH07XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHN0b3ApO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHN0b3AsXG5cdFx0dGFrZVJlY29yZHNcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25FbGVtZW50UmVtb3ZhbC9pbmRleC50c1xuLyoqXG4qIEZpcmVzIHdoZW4gdGhlIGVsZW1lbnQgb3IgYW55IGVsZW1lbnQgY29udGFpbmluZyBpdCBpcyByZW1vdmVkLlxuKlxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBjYWxsYmFja1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uRWxlbWVudFJlbW92YWwodGFyZ2V0LCBjYWxsYmFjaywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGRvY3VtZW50OiBkb2N1bWVudCQxID0gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmRvY3VtZW50LCBmbHVzaCA9IFwic3luY1wiIH0gPSBvcHRpb25zO1xuXHRpZiAoIXdpbmRvdyQxIHx8ICFkb2N1bWVudCQxKSByZXR1cm4gbm9vcDtcblx0bGV0IHN0b3BGbjtcblx0Y29uc3QgY2xlYW51cEFuZFVwZGF0ZSA9IChmbikgPT4ge1xuXHRcdHN0b3BGbiA9PT0gbnVsbCB8fCBzdG9wRm4gPT09IHZvaWQgMCB8fCBzdG9wRm4oKTtcblx0XHRzdG9wRm4gPSBmbjtcblx0fTtcblx0Y29uc3Qgc3RvcFdhdGNoID0gd2F0Y2hFZmZlY3QoKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKGVsKSB7XG5cdFx0XHRjb25zdCB7IHN0b3AgfSA9IHVzZU11dGF0aW9uT2JzZXJ2ZXIoZG9jdW1lbnQkMSwgKG11dGF0aW9uc0xpc3QpID0+IHtcblx0XHRcdFx0aWYgKG11dGF0aW9uc0xpc3QubWFwKChtdXRhdGlvbikgPT4gWy4uLm11dGF0aW9uLnJlbW92ZWROb2Rlc10pLmZsYXQoKS5zb21lKChub2RlKSA9PiBub2RlID09PSBlbCB8fCBub2RlLmNvbnRhaW5zKGVsKSkpIGNhbGxiYWNrKG11dGF0aW9uc0xpc3QpO1xuXHRcdFx0fSwge1xuXHRcdFx0XHR3aW5kb3c6IHdpbmRvdyQxLFxuXHRcdFx0XHRjaGlsZExpc3Q6IHRydWUsXG5cdFx0XHRcdHN1YnRyZWU6IHRydWVcblx0XHRcdH0pO1xuXHRcdFx0Y2xlYW51cEFuZFVwZGF0ZShzdG9wKTtcblx0XHR9XG5cdH0sIHsgZmx1c2ggfSk7XG5cdGNvbnN0IHN0b3BIYW5kbGUgPSAoKSA9PiB7XG5cdFx0c3RvcFdhdGNoKCk7XG5cdFx0Y2xlYW51cEFuZFVwZGF0ZSgpO1xuXHR9O1xuXHR0cnlPblNjb3BlRGlzcG9zZShzdG9wSGFuZGxlKTtcblx0cmV0dXJuIHN0b3BIYW5kbGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIG9uS2V5U3Ryb2tlL2luZGV4LnRzXG5mdW5jdGlvbiBjcmVhdGVLZXlQcmVkaWNhdGUoa2V5RmlsdGVyKSB7XG5cdGlmICh0eXBlb2Yga2V5RmlsdGVyID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBrZXlGaWx0ZXI7XG5cdGVsc2UgaWYgKHR5cGVvZiBrZXlGaWx0ZXIgPT09IFwic3RyaW5nXCIpIHJldHVybiAoZXZlbnQpID0+IGV2ZW50LmtleSA9PT0ga2V5RmlsdGVyO1xuXHRlbHNlIGlmIChBcnJheS5pc0FycmF5KGtleUZpbHRlcikpIHJldHVybiAoZXZlbnQpID0+IGtleUZpbHRlci5pbmNsdWRlcyhldmVudC5rZXkpO1xuXHRyZXR1cm4gKCkgPT4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG9uS2V5U3Ryb2tlKC4uLmFyZ3MpIHtcblx0bGV0IGtleTtcblx0bGV0IGhhbmRsZXI7XG5cdGxldCBvcHRpb25zID0ge307XG5cdGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuXHRcdGtleSA9IGFyZ3NbMF07XG5cdFx0aGFuZGxlciA9IGFyZ3NbMV07XG5cdFx0b3B0aW9ucyA9IGFyZ3NbMl07XG5cdH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdGtleSA9IHRydWU7XG5cdFx0aGFuZGxlciA9IGFyZ3NbMF07XG5cdFx0b3B0aW9ucyA9IGFyZ3NbMV07XG5cdH0gZWxzZSB7XG5cdFx0a2V5ID0gYXJnc1swXTtcblx0XHRoYW5kbGVyID0gYXJnc1sxXTtcblx0fVxuXHRlbHNlIHtcblx0XHRrZXkgPSB0cnVlO1xuXHRcdGhhbmRsZXIgPSBhcmdzWzBdO1xuXHR9XG5cdGNvbnN0IHsgdGFyZ2V0ID0gZGVmYXVsdFdpbmRvdywgZXZlbnROYW1lID0gXCJrZXlkb3duXCIsIHBhc3NpdmUgPSBmYWxzZSwgZGVkdXBlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHByZWRpY2F0ZSA9IGNyZWF0ZUtleVByZWRpY2F0ZShrZXkpO1xuXHRjb25zdCBsaXN0ZW5lciA9IChlKSA9PiB7XG5cdFx0aWYgKGUucmVwZWF0ICYmIHRvVmFsdWUoZGVkdXBlKSkgcmV0dXJuO1xuXHRcdGlmIChwcmVkaWNhdGUoZSkpIGhhbmRsZXIoZSk7XG5cdH07XG5cdHJldHVybiB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLCBsaXN0ZW5lciwgcGFzc2l2ZSk7XG59XG4vKipcbiogTGlzdGVuIHRvIHRoZSBrZXlkb3duIGV2ZW50IG9mIHRoZSBnaXZlbiBrZXkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL29uS2V5U3Ryb2tlXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGhhbmRsZXJcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiBvbktleURvd24oa2V5LCBoYW5kbGVyLCBvcHRpb25zID0ge30pIHtcblx0cmV0dXJuIG9uS2V5U3Ryb2tlKGtleSwgaGFuZGxlciwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0ZXZlbnROYW1lOiBcImtleWRvd25cIlxuXHR9KTtcbn1cbi8qKlxuKiBMaXN0ZW4gdG8gdGhlIGtleXByZXNzIGV2ZW50IG9mIHRoZSBnaXZlbiBrZXkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL29uS2V5U3Ryb2tlXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGhhbmRsZXJcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiBvbktleVByZXNzZWQoa2V5LCBoYW5kbGVyLCBvcHRpb25zID0ge30pIHtcblx0cmV0dXJuIG9uS2V5U3Ryb2tlKGtleSwgaGFuZGxlciwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0ZXZlbnROYW1lOiBcImtleXByZXNzXCJcblx0fSk7XG59XG4vKipcbiogTGlzdGVuIHRvIHRoZSBrZXl1cCBldmVudCBvZiB0aGUgZ2l2ZW4ga2V5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9vbktleVN0cm9rZVxuKiBAcGFyYW0ga2V5XG4qIEBwYXJhbSBoYW5kbGVyXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gb25LZXlVcChrZXksIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb25LZXlTdHJva2Uoa2V5LCBoYW5kbGVyLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudE5hbWU6IFwia2V5dXBcIlxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25Mb25nUHJlc3MvaW5kZXgudHNcbmNvbnN0IERFRkFVTFRfREVMQVkgPSA1MDA7XG5jb25zdCBERUZBVUxUX1RIUkVTSE9MRCA9IDEwO1xuZnVuY3Rpb24gb25Mb25nUHJlc3ModGFyZ2V0LCBoYW5kbGVyLCBvcHRpb25zKSB7XG5cdHZhciBfb3B0aW9ucyRtb2RpZmllcnMxMCwgX29wdGlvbnMkbW9kaWZpZXJzMTE7XG5cdGNvbnN0IGVsZW1lbnRSZWYgPSBjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSk7XG5cdGxldCB0aW1lb3V0O1xuXHRsZXQgcG9zU3RhcnQ7XG5cdGxldCBzdGFydFRpbWVzdGFtcDtcblx0bGV0IGhhc0xvbmdQcmVzc2VkID0gZmFsc2U7XG5cdGZ1bmN0aW9uIGNsZWFyKCkge1xuXHRcdGlmICh0aW1lb3V0KSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZW91dCk7XG5cdFx0XHR0aW1lb3V0ID0gdm9pZCAwO1xuXHRcdH1cblx0XHRwb3NTdGFydCA9IHZvaWQgMDtcblx0XHRzdGFydFRpbWVzdGFtcCA9IHZvaWQgMDtcblx0XHRoYXNMb25nUHJlc3NlZCA9IGZhbHNlO1xuXHR9XG5cdGZ1bmN0aW9uIGdldERlbGF5KGV2KSB7XG5cdFx0Y29uc3QgZGVsYXkgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVsYXk7XG5cdFx0aWYgKHR5cGVvZiBkZWxheSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZGVsYXkoZXYpO1xuXHRcdHJldHVybiBkZWxheSAhPT0gbnVsbCAmJiBkZWxheSAhPT0gdm9pZCAwID8gZGVsYXkgOiBERUZBVUxUX0RFTEFZO1xuXHR9XG5cdGZ1bmN0aW9uIG9uUmVsZWFzZShldikge1xuXHRcdHZhciBfb3B0aW9ucyRtb2RpZmllcnMsIF9vcHRpb25zJG1vZGlmaWVyczIsIF9vcHRpb25zJG1vZGlmaWVyczM7XG5cdFx0Y29uc3QgW19zdGFydFRpbWVzdGFtcCwgX3Bvc1N0YXJ0LCBfaGFzTG9uZ1ByZXNzZWRdID0gW1xuXHRcdFx0c3RhcnRUaW1lc3RhbXAsXG5cdFx0XHRwb3NTdGFydCxcblx0XHRcdGhhc0xvbmdQcmVzc2VkXG5cdFx0XTtcblx0XHRjbGVhcigpO1xuXHRcdGlmICghKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vbk1vdXNlVXApIHx8ICFfcG9zU3RhcnQgfHwgIV9zdGFydFRpbWVzdGFtcCkgcmV0dXJuO1xuXHRcdGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVycyA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVycy5zZWxmKSAmJiBldi50YXJnZXQgIT09IGVsZW1lbnRSZWYudmFsdWUpIHJldHVybjtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczIgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzMi5wcmV2ZW50KSBldi5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzMyA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnMzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnMzLnN0b3ApIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGNvbnN0IGR4ID0gZXYueCAtIF9wb3NTdGFydC54O1xuXHRcdGNvbnN0IGR5ID0gZXYueSAtIF9wb3NTdGFydC55O1xuXHRcdGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcblx0XHRvcHRpb25zLm9uTW91c2VVcChldi50aW1lU3RhbXAgLSBfc3RhcnRUaW1lc3RhbXAsIGRpc3RhbmNlLCBfaGFzTG9uZ1ByZXNzZWQpO1xuXHR9XG5cdGZ1bmN0aW9uIG9uRG93bihldikge1xuXHRcdHZhciBfb3B0aW9ucyRtb2RpZmllcnM0LCBfb3B0aW9ucyRtb2RpZmllcnM1LCBfb3B0aW9ucyRtb2RpZmllcnM2O1xuXHRcdGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczQgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzNC5zZWxmKSAmJiBldi50YXJnZXQgIT09IGVsZW1lbnRSZWYudmFsdWUpIHJldHVybjtcblx0XHRjbGVhcigpO1xuXHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzNSA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnM1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnM1LnByZXZlbnQpIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnM2ID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczYuc3RvcCkgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0cG9zU3RhcnQgPSB7XG5cdFx0XHR4OiBldi54LFxuXHRcdFx0eTogZXYueVxuXHRcdH07XG5cdFx0c3RhcnRUaW1lc3RhbXAgPSBldi50aW1lU3RhbXA7XG5cdFx0dGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0aGFzTG9uZ1ByZXNzZWQgPSB0cnVlO1xuXHRcdFx0aGFuZGxlcihldik7XG5cdFx0fSwgZ2V0RGVsYXkoZXYpKTtcblx0fVxuXHRmdW5jdGlvbiBvbk1vdmUoZXYpIHtcblx0XHR2YXIgX29wdGlvbnMkbW9kaWZpZXJzNywgX29wdGlvbnMkbW9kaWZpZXJzOCwgX29wdGlvbnMkbW9kaWZpZXJzOSwgX29wdGlvbnMkZGlzdGFuY2VUaHJlO1xuXHRcdGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczcgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzNyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzNy5zZWxmKSAmJiBldi50YXJnZXQgIT09IGVsZW1lbnRSZWYudmFsdWUpIHJldHVybjtcblx0XHRpZiAoIXBvc1N0YXJ0IHx8IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGlzdGFuY2VUaHJlc2hvbGQpID09PSBmYWxzZSkgcmV0dXJuO1xuXHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzOCA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnM4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnM4LnByZXZlbnQpIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnM5ID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczkuc3RvcCkgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0Y29uc3QgZHggPSBldi54IC0gcG9zU3RhcnQueDtcblx0XHRjb25zdCBkeSA9IGV2LnkgLSBwb3NTdGFydC55O1xuXHRcdGlmIChNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpID49ICgoX29wdGlvbnMkZGlzdGFuY2VUaHJlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRpc3RhbmNlVGhyZXNob2xkKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRkaXN0YW5jZVRocmUgIT09IHZvaWQgMCA/IF9vcHRpb25zJGRpc3RhbmNlVGhyZSA6IERFRkFVTFRfVEhSRVNIT0xEKSkgY2xlYXIoKTtcblx0fVxuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7XG5cdFx0Y2FwdHVyZTogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczEwID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczEwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnMxMC5jYXB0dXJlLFxuXHRcdG9uY2U6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnMxMSA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnMxMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzMTEub25jZVxuXHR9O1xuXHRjb25zdCBjbGVhbnVwID0gW1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWxlbWVudFJlZiwgXCJwb2ludGVyZG93blwiLCBvbkRvd24sIGxpc3RlbmVyT3B0aW9ucyksXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihlbGVtZW50UmVmLCBcInBvaW50ZXJtb3ZlXCIsIG9uTW92ZSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsZW1lbnRSZWYsIFtcInBvaW50ZXJ1cFwiLCBcInBvaW50ZXJsZWF2ZVwiXSwgb25SZWxlYXNlLCBsaXN0ZW5lck9wdGlvbnMpXG5cdF07XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiBjbGVhbnVwLmZvckVhY2goKGZuKSA9PiBmbigpKTtcblx0cmV0dXJuIHN0b3A7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIG9uU3RhcnRUeXBpbmcvaW5kZXgudHNcbmZ1bmN0aW9uIGlzRm9jdXNlZEVsZW1lbnRFZGl0YWJsZSgpIHtcblx0Y29uc3QgeyBhY3RpdmVFbGVtZW50LCBib2R5IH0gPSBkb2N1bWVudDtcblx0aWYgKCFhY3RpdmVFbGVtZW50KSByZXR1cm4gZmFsc2U7XG5cdGlmIChhY3RpdmVFbGVtZW50ID09PSBib2R5KSByZXR1cm4gZmFsc2U7XG5cdHN3aXRjaCAoYWN0aXZlRWxlbWVudC50YWdOYW1lKSB7XG5cdFx0Y2FzZSBcIklOUFVUXCI6XG5cdFx0Y2FzZSBcIlRFWFRBUkVBXCI6IHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBhY3RpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKTtcbn1cbmZ1bmN0aW9uIGlzVHlwZWRDaGFyVmFsaWQoeyBrZXlDb2RlLCBtZXRhS2V5LCBjdHJsS2V5LCBhbHRLZXkgfSkge1xuXHRpZiAobWV0YUtleSB8fCBjdHJsS2V5IHx8IGFsdEtleSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoa2V5Q29kZSA+PSA0OCAmJiBrZXlDb2RlIDw9IDU3IHx8IGtleUNvZGUgPj0gOTYgJiYga2V5Q29kZSA8PSAxMDUpIHJldHVybiB0cnVlO1xuXHRpZiAoa2V5Q29kZSA+PSA2NSAmJiBrZXlDb2RlIDw9IDkwKSByZXR1cm4gdHJ1ZTtcblx0cmV0dXJuIGZhbHNlO1xufVxuLyoqXG4qIEZpcmVzIHdoZW4gdXNlcnMgc3RhcnQgdHlwaW5nIG9uIG5vbi1lZGl0YWJsZSBlbGVtZW50cy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvb25TdGFydFR5cGluZ1xuKiBAcGFyYW0gY2FsbGJhY2tcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiBvblN0YXJ0VHlwaW5nKGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCB9ID0gb3B0aW9ucztcblx0Y29uc3Qga2V5ZG93biA9IChldmVudCkgPT4ge1xuXHRcdGlmICghaXNGb2N1c2VkRWxlbWVudEVkaXRhYmxlKCkgJiYgaXNUeXBlZENoYXJWYWxpZChldmVudCkpIGNhbGxiYWNrKGV2ZW50KTtcblx0fTtcblx0aWYgKGRvY3VtZW50JDEpIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJrZXlkb3duXCIsIGtleWRvd24sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdGVtcGxhdGVSZWYvaW5kZXgudHNcbi8qKlxuKiBAZGVwcmVjYXRlZCBVc2UgVnVlJ3MgYnVpbHQtaW4gYHVzZVRlbXBsYXRlUmVmYCBpbnN0ZWFkLlxuKlxuKiBTaG9ydGhhbmQgZm9yIGJpbmRpbmcgcmVmIHRvIHRlbXBsYXRlIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3RlbXBsYXRlUmVmXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGluaXRpYWxWYWx1ZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHRlbXBsYXRlUmVmKGtleSwgaW5pdGlhbFZhbHVlID0gbnVsbCkge1xuXHRjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuXHRsZXQgX3RyaWdnZXIgPSAoKSA9PiB7fTtcblx0Y29uc3QgZWxlbWVudCA9IGN1c3RvbVJlZigodHJhY2ssIHRyaWdnZXIpID0+IHtcblx0XHRfdHJpZ2dlciA9IHRyaWdnZXI7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0dmFyIF9pbnN0YW5jZSRwcm94eSQkcmVmcywgX2luc3RhbmNlJHByb3h5O1xuXHRcdFx0XHR0cmFjaygpO1xuXHRcdFx0XHRyZXR1cm4gKF9pbnN0YW5jZSRwcm94eSQkcmVmcyA9IGluc3RhbmNlID09PSBudWxsIHx8IGluc3RhbmNlID09PSB2b2lkIDAgfHwgKF9pbnN0YW5jZSRwcm94eSA9IGluc3RhbmNlLnByb3h5KSA9PT0gbnVsbCB8fCBfaW5zdGFuY2UkcHJveHkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9pbnN0YW5jZSRwcm94eS4kcmVmc1trZXldKSAhPT0gbnVsbCAmJiBfaW5zdGFuY2UkcHJveHkkJHJlZnMgIT09IHZvaWQgMCA/IF9pbnN0YW5jZSRwcm94eSQkcmVmcyA6IGluaXRpYWxWYWx1ZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQoKSB7fVxuXHRcdH07XG5cdH0pO1xuXHR0cnlPbk1vdW50ZWQoX3RyaWdnZXIpO1xuXHRvblVwZGF0ZWQoX3RyaWdnZXIpO1xuXHRyZXR1cm4gZWxlbWVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQWN0aXZlRWxlbWVudC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBY3RpdmVFbGVtZW50XG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQWN0aXZlRWxlbWVudChvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGRvY3VtZW50O1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBkZWVwID0gdHJ1ZSwgdHJpZ2dlck9uUmVtb3ZhbCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBkb2N1bWVudCQxID0gKF9vcHRpb25zJGRvY3VtZW50ID0gb3B0aW9ucy5kb2N1bWVudCkgIT09IG51bGwgJiYgX29wdGlvbnMkZG9jdW1lbnQgIT09IHZvaWQgMCA/IF9vcHRpb25zJGRvY3VtZW50IDogd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmRvY3VtZW50O1xuXHRjb25zdCBnZXREZWVwQWN0aXZlRWxlbWVudCA9ICgpID0+IHtcblx0XHRsZXQgZWxlbWVudCA9IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS5hY3RpdmVFbGVtZW50O1xuXHRcdGlmIChkZWVwKSB7XG5cdFx0XHR2YXIgX2VsZW1lbnQkc2hhZG93Um9vdDtcblx0XHRcdHdoaWxlIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsZW1lbnQuc2hhZG93Um9vdCkgZWxlbWVudCA9IGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdm9pZCAwIHx8IChfZWxlbWVudCRzaGFkb3dSb290ID0gZWxlbWVudC5zaGFkb3dSb290KSA9PT0gbnVsbCB8fCBfZWxlbWVudCRzaGFkb3dSb290ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZWxlbWVudCRzaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQ7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtZW50O1xuXHR9O1xuXHRjb25zdCBhY3RpdmVFbGVtZW50ID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCB0cmlnZ2VyID0gKCkgPT4ge1xuXHRcdGFjdGl2ZUVsZW1lbnQudmFsdWUgPSBnZXREZWVwQWN0aXZlRWxlbWVudCgpO1xuXHR9O1xuXHRpZiAod2luZG93JDEpIHtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7XG5cdFx0XHRjYXB0dXJlOiB0cnVlLFxuXHRcdFx0cGFzc2l2ZTogdHJ1ZVxuXHRcdH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJibHVyXCIsIChldmVudCkgPT4ge1xuXHRcdFx0aWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgIT09IG51bGwpIHJldHVybjtcblx0XHRcdHRyaWdnZXIoKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiZm9jdXNcIiwgdHJpZ2dlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRpZiAodHJpZ2dlck9uUmVtb3ZhbCkgb25FbGVtZW50UmVtb3ZhbChhY3RpdmVFbGVtZW50LCB0cmlnZ2VyLCB7IGRvY3VtZW50OiBkb2N1bWVudCQxIH0pO1xuXHR0cmlnZ2VyKCk7XG5cdHJldHVybiBhY3RpdmVFbGVtZW50O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VSYWZGbi9pbmRleC50c1xuLyoqXG4qIENhbGwgZnVuY3Rpb24gb24gZXZlcnkgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAuIFdpdGggY29udHJvbHMgb2YgcGF1c2luZyBhbmQgcmVzdW1pbmcuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVJhZkZuXG4qIEBwYXJhbSBmblxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVJhZkZuKGZuLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBmcHNMaW1pdCA9IG51bGwsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBvbmNlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzQWN0aXZlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGludGVydmFsTGltaXQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgbGltaXQgPSB0b1ZhbHVlKGZwc0xpbWl0KTtcblx0XHRyZXR1cm4gbGltaXQgPyAxZTMgLyBsaW1pdCA6IG51bGw7XG5cdH0pO1xuXHRsZXQgcHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IDA7XG5cdGxldCByYWZJZCA9IG51bGw7XG5cdGZ1bmN0aW9uIGxvb3AodGltZXN0YW1wJDEpIHtcblx0XHRpZiAoIWlzQWN0aXZlLnZhbHVlIHx8ICF3aW5kb3ckMSkgcmV0dXJuO1xuXHRcdGlmICghcHJldmlvdXNGcmFtZVRpbWVzdGFtcCkgcHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IHRpbWVzdGFtcCQxO1xuXHRcdGNvbnN0IGRlbHRhID0gdGltZXN0YW1wJDEgLSBwcmV2aW91c0ZyYW1lVGltZXN0YW1wO1xuXHRcdGlmIChpbnRlcnZhbExpbWl0LnZhbHVlICYmIGRlbHRhIDwgaW50ZXJ2YWxMaW1pdC52YWx1ZSkge1xuXHRcdFx0cmFmSWQgPSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHByZXZpb3VzRnJhbWVUaW1lc3RhbXAgPSB0aW1lc3RhbXAkMTtcblx0XHRmbih7XG5cdFx0XHRkZWx0YSxcblx0XHRcdHRpbWVzdGFtcDogdGltZXN0YW1wJDFcblx0XHR9KTtcblx0XHRpZiAob25jZSkge1xuXHRcdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0XHRcdHJhZklkID0gbnVsbDtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cmFmSWQgPSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzdW1lKCkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUgJiYgd2luZG93JDEpIHtcblx0XHRcdGlzQWN0aXZlLnZhbHVlID0gdHJ1ZTtcblx0XHRcdHByZXZpb3VzRnJhbWVUaW1lc3RhbXAgPSAwO1xuXHRcdFx0cmFmSWQgPSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHBhdXNlKCkge1xuXHRcdGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG5cdFx0aWYgKHJhZklkICE9IG51bGwgJiYgd2luZG93JDEpIHtcblx0XHRcdHdpbmRvdyQxLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcblx0XHRcdHJhZklkID0gbnVsbDtcblx0XHR9XG5cdH1cblx0aWYgKGltbWVkaWF0ZSkgcmVzdW1lKCk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHBhdXNlKTtcblx0cmV0dXJuIHtcblx0XHRpc0FjdGl2ZTogcmVhZG9ubHkoaXNBY3RpdmUpLFxuXHRcdHBhdXNlLFxuXHRcdHJlc3VtZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBbmltYXRlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgV2ViIEFuaW1hdGlvbnMgQVBJXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFuaW1hdGVcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0ga2V5ZnJhbWVzXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlQW5pbWF0ZSh0YXJnZXQsIGtleWZyYW1lcywgb3B0aW9ucykge1xuXHRsZXQgY29uZmlnO1xuXHRsZXQgYW5pbWF0ZU9wdGlvbnM7XG5cdGlmIChpc09iamVjdChvcHRpb25zKSkge1xuXHRcdGNvbmZpZyA9IG9wdGlvbnM7XG5cdFx0YW5pbWF0ZU9wdGlvbnMgPSBvYmplY3RPbWl0KG9wdGlvbnMsIFtcblx0XHRcdFwid2luZG93XCIsXG5cdFx0XHRcImltbWVkaWF0ZVwiLFxuXHRcdFx0XCJjb21taXRTdHlsZXNcIixcblx0XHRcdFwicGVyc2lzdFwiLFxuXHRcdFx0XCJvblJlYWR5XCIsXG5cdFx0XHRcIm9uRXJyb3JcIlxuXHRcdF0pO1xuXHR9IGVsc2Uge1xuXHRcdGNvbmZpZyA9IHsgZHVyYXRpb246IG9wdGlvbnMgfTtcblx0XHRhbmltYXRlT3B0aW9ucyA9IG9wdGlvbnM7XG5cdH1cblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaW1tZWRpYXRlID0gdHJ1ZSwgY29tbWl0U3R5bGVzLCBwZXJzaXN0LCBwbGF5YmFja1JhdGU6IF9wbGF5YmFja1JhdGUgPSAxLCBvblJlYWR5LCBvbkVycm9yID0gKGUpID0+IHtcblx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHR9IH0gPSBjb25maWc7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBIVE1MRWxlbWVudCAmJiBcImFuaW1hdGVcIiBpbiBIVE1MRWxlbWVudC5wcm90b3R5cGUpO1xuXHRjb25zdCBhbmltYXRlID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCBzdG9yZSA9IHNoYWxsb3dSZWFjdGl2ZSh7XG5cdFx0c3RhcnRUaW1lOiBudWxsLFxuXHRcdGN1cnJlbnRUaW1lOiBudWxsLFxuXHRcdHRpbWVsaW5lOiBudWxsLFxuXHRcdHBsYXliYWNrUmF0ZTogX3BsYXliYWNrUmF0ZSxcblx0XHRwZW5kaW5nOiBmYWxzZSxcblx0XHRwbGF5U3RhdGU6IGltbWVkaWF0ZSA/IFwiaWRsZVwiIDogXCJwYXVzZWRcIixcblx0XHRyZXBsYWNlU3RhdGU6IFwiYWN0aXZlXCJcblx0fSk7XG5cdGNvbnN0IHBlbmRpbmcgPSBjb21wdXRlZCgoKSA9PiBzdG9yZS5wZW5kaW5nKTtcblx0Y29uc3QgcGxheVN0YXRlID0gY29tcHV0ZWQoKCkgPT4gc3RvcmUucGxheVN0YXRlKTtcblx0Y29uc3QgcmVwbGFjZVN0YXRlID0gY29tcHV0ZWQoKCkgPT4gc3RvcmUucmVwbGFjZVN0YXRlKTtcblx0Y29uc3Qgc3RhcnRUaW1lID0gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBzdG9yZS5zdGFydFRpbWU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHN0b3JlLnN0YXJ0VGltZSA9IHZhbHVlO1xuXHRcdFx0aWYgKGFuaW1hdGUudmFsdWUpIGFuaW1hdGUudmFsdWUuc3RhcnRUaW1lID0gdmFsdWU7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgY3VycmVudFRpbWUgPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHN0b3JlLmN1cnJlbnRUaW1lO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHRzdG9yZS5jdXJyZW50VGltZSA9IHZhbHVlO1xuXHRcdFx0aWYgKGFuaW1hdGUudmFsdWUpIHtcblx0XHRcdFx0YW5pbWF0ZS52YWx1ZS5jdXJyZW50VGltZSA9IHZhbHVlO1xuXHRcdFx0XHRzeW5jUmVzdW1lKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgdGltZWxpbmUgPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHN0b3JlLnRpbWVsaW5lO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHRzdG9yZS50aW1lbGluZSA9IHZhbHVlO1xuXHRcdFx0aWYgKGFuaW1hdGUudmFsdWUpIGFuaW1hdGUudmFsdWUudGltZWxpbmUgPSB2YWx1ZTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBwbGF5YmFja1JhdGUgPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHN0b3JlLnBsYXliYWNrUmF0ZTtcblx0XHR9LFxuXHRcdHNldCh2YWx1ZSkge1xuXHRcdFx0c3RvcmUucGxheWJhY2tSYXRlID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZS5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBwbGF5ID0gKCkgPT4ge1xuXHRcdGlmIChhbmltYXRlLnZhbHVlKSB0cnkge1xuXHRcdFx0YW5pbWF0ZS52YWx1ZS5wbGF5KCk7XG5cdFx0XHRzeW5jUmVzdW1lKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0c3luY1BhdXNlKCk7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0XHRlbHNlIHVwZGF0ZSgpO1xuXHR9O1xuXHRjb25zdCBwYXVzZSA9ICgpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0dmFyIF9hbmltYXRlJHZhbHVlO1xuXHRcdFx0KF9hbmltYXRlJHZhbHVlID0gYW5pbWF0ZS52YWx1ZSkgPT09IG51bGwgfHwgX2FuaW1hdGUkdmFsdWUgPT09IHZvaWQgMCB8fCBfYW5pbWF0ZSR2YWx1ZS5wYXVzZSgpO1xuXHRcdFx0c3luY1BhdXNlKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJldmVyc2UgPSAoKSA9PiB7XG5cdFx0aWYgKCFhbmltYXRlLnZhbHVlKSB1cGRhdGUoKTtcblx0XHR0cnkge1xuXHRcdFx0dmFyIF9hbmltYXRlJHZhbHVlMjtcblx0XHRcdChfYW5pbWF0ZSR2YWx1ZTIgPSBhbmltYXRlLnZhbHVlKSA9PT0gbnVsbCB8fCBfYW5pbWF0ZSR2YWx1ZTIgPT09IHZvaWQgMCB8fCBfYW5pbWF0ZSR2YWx1ZTIucmV2ZXJzZSgpO1xuXHRcdFx0c3luY1Jlc3VtZSgpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHN5bmNQYXVzZSgpO1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGZpbmlzaCA9ICgpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0dmFyIF9hbmltYXRlJHZhbHVlMztcblx0XHRcdChfYW5pbWF0ZSR2YWx1ZTMgPSBhbmltYXRlLnZhbHVlKSA9PT0gbnVsbCB8fCBfYW5pbWF0ZSR2YWx1ZTMgPT09IHZvaWQgMCB8fCBfYW5pbWF0ZSR2YWx1ZTMuZmluaXNoKCk7XG5cdFx0XHRzeW5jUGF1c2UoKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgY2FuY2VsID0gKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWU0O1xuXHRcdFx0KF9hbmltYXRlJHZhbHVlNCA9IGFuaW1hdGUudmFsdWUpID09PSBudWxsIHx8IF9hbmltYXRlJHZhbHVlNCA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlNC5jYW5jZWwoKTtcblx0XHRcdHN5bmNQYXVzZSgpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0fVxuXHR9O1xuXHR3YXRjaCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSwgKGVsKSA9PiB7XG5cdFx0aWYgKGVsKSB1cGRhdGUodHJ1ZSk7XG5cdFx0ZWxzZSBhbmltYXRlLnZhbHVlID0gdm9pZCAwO1xuXHR9KTtcblx0d2F0Y2goKCkgPT4ga2V5ZnJhbWVzLCAodmFsdWUpID0+IHtcblx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkge1xuXHRcdFx0dXBkYXRlKCk7XG5cdFx0XHRjb25zdCB0YXJnZXRFbCA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdFx0aWYgKHRhcmdldEVsKSBhbmltYXRlLnZhbHVlLmVmZmVjdCA9IG5ldyBLZXlmcmFtZUVmZmVjdCh0YXJnZXRFbCwgdG9WYWx1ZSh2YWx1ZSksIGFuaW1hdGVPcHRpb25zKTtcblx0XHR9XG5cdH0sIHsgZGVlcDogdHJ1ZSB9KTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IHVwZGF0ZSh0cnVlKSwgZmFsc2UpO1xuXHR0cnlPblNjb3BlRGlzcG9zZShjYW5jZWwpO1xuXHRmdW5jdGlvbiB1cGRhdGUoaW5pdCkge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCAhZWwpIHJldHVybjtcblx0XHRpZiAoIWFuaW1hdGUudmFsdWUpIGFuaW1hdGUudmFsdWUgPSBlbC5hbmltYXRlKHRvVmFsdWUoa2V5ZnJhbWVzKSwgYW5pbWF0ZU9wdGlvbnMpO1xuXHRcdGlmIChwZXJzaXN0KSBhbmltYXRlLnZhbHVlLnBlcnNpc3QoKTtcblx0XHRpZiAoX3BsYXliYWNrUmF0ZSAhPT0gMSkgYW5pbWF0ZS52YWx1ZS5wbGF5YmFja1JhdGUgPSBfcGxheWJhY2tSYXRlO1xuXHRcdGlmIChpbml0ICYmICFpbW1lZGlhdGUpIGFuaW1hdGUudmFsdWUucGF1c2UoKTtcblx0XHRlbHNlIHN5bmNSZXN1bWUoKTtcblx0XHRvblJlYWR5ID09PSBudWxsIHx8IG9uUmVhZHkgPT09IHZvaWQgMCB8fCBvblJlYWR5KGFuaW1hdGUudmFsdWUpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHR1c2VFdmVudExpc3RlbmVyKGFuaW1hdGUsIFtcblx0XHRcImNhbmNlbFwiLFxuXHRcdFwiZmluaXNoXCIsXG5cdFx0XCJyZW1vdmVcIlxuXHRdLCBzeW5jUGF1c2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoYW5pbWF0ZSwgXCJmaW5pc2hcIiwgKCkgPT4ge1xuXHRcdHZhciBfYW5pbWF0ZSR2YWx1ZTU7XG5cdFx0aWYgKGNvbW1pdFN0eWxlcykgKF9hbmltYXRlJHZhbHVlNSA9IGFuaW1hdGUudmFsdWUpID09PSBudWxsIHx8IF9hbmltYXRlJHZhbHVlNSA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlNS5jb21taXRTdHlsZXMoKTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0Y29uc3QgeyByZXN1bWU6IHJlc3VtZVJlZiwgcGF1c2U6IHBhdXNlUmVmIH0gPSB1c2VSYWZGbigoKSA9PiB7XG5cdFx0aWYgKCFhbmltYXRlLnZhbHVlKSByZXR1cm47XG5cdFx0c3RvcmUucGVuZGluZyA9IGFuaW1hdGUudmFsdWUucGVuZGluZztcblx0XHRzdG9yZS5wbGF5U3RhdGUgPSBhbmltYXRlLnZhbHVlLnBsYXlTdGF0ZTtcblx0XHRzdG9yZS5yZXBsYWNlU3RhdGUgPSBhbmltYXRlLnZhbHVlLnJlcGxhY2VTdGF0ZTtcblx0XHRzdG9yZS5zdGFydFRpbWUgPSBhbmltYXRlLnZhbHVlLnN0YXJ0VGltZTtcblx0XHRzdG9yZS5jdXJyZW50VGltZSA9IGFuaW1hdGUudmFsdWUuY3VycmVudFRpbWU7XG5cdFx0c3RvcmUudGltZWxpbmUgPSBhbmltYXRlLnZhbHVlLnRpbWVsaW5lO1xuXHRcdHN0b3JlLnBsYXliYWNrUmF0ZSA9IGFuaW1hdGUudmFsdWUucGxheWJhY2tSYXRlO1xuXHR9LCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdGZ1bmN0aW9uIHN5bmNSZXN1bWUoKSB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSByZXN1bWVSZWYoKTtcblx0fVxuXHRmdW5jdGlvbiBzeW5jUGF1c2UoKSB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHdpbmRvdyQxKSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocGF1c2VSZWYpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0YW5pbWF0ZSxcblx0XHRwbGF5LFxuXHRcdHBhdXNlLFxuXHRcdHJldmVyc2UsXG5cdFx0ZmluaXNoLFxuXHRcdGNhbmNlbCxcblx0XHRwZW5kaW5nLFxuXHRcdHBsYXlTdGF0ZSxcblx0XHRyZXBsYWNlU3RhdGUsXG5cdFx0c3RhcnRUaW1lLFxuXHRcdGN1cnJlbnRUaW1lLFxuXHRcdHRpbWVsaW5lLFxuXHRcdHBsYXliYWNrUmF0ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBc3luY1F1ZXVlL2luZGV4LnRzXG4vKipcbiogQXN5bmNocm9ub3VzIHF1ZXVlIHRhc2sgY29udHJvbGxlci5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXN5bmNRdWV1ZVxuKiBAcGFyYW0gdGFza3NcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VBc3luY1F1ZXVlKHRhc2tzLCBvcHRpb25zKSB7XG5cdGNvbnN0IHsgaW50ZXJydXB0ID0gdHJ1ZSwgb25FcnJvciA9IG5vb3AsIG9uRmluaXNoZWQgPSBub29wLCBzaWduYWwgfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IHByb21pc2VTdGF0ZSA9IHtcblx0XHRhYm9ydGVkOiBcImFib3J0ZWRcIixcblx0XHRmdWxmaWxsZWQ6IFwiZnVsZmlsbGVkXCIsXG5cdFx0cGVuZGluZzogXCJwZW5kaW5nXCIsXG5cdFx0cmVqZWN0ZWQ6IFwicmVqZWN0ZWRcIlxuXHR9O1xuXHRjb25zdCByZXN1bHQgPSByZWFjdGl2ZShBcnJheS5mcm9tKEFycmF5LmZyb20oeyBsZW5ndGg6IHRhc2tzLmxlbmd0aCB9KSwgKCkgPT4gKHtcblx0XHRzdGF0ZTogcHJvbWlzZVN0YXRlLnBlbmRpbmcsXG5cdFx0ZGF0YTogbnVsbFxuXHR9KSkpO1xuXHRjb25zdCBhY3RpdmVJbmRleCA9IHNoYWxsb3dSZWYoLTEpO1xuXHRpZiAoIXRhc2tzIHx8IHRhc2tzLmxlbmd0aCA9PT0gMCkge1xuXHRcdG9uRmluaXNoZWQoKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0YWN0aXZlSW5kZXgsXG5cdFx0XHRyZXN1bHRcblx0XHR9O1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZVJlc3VsdChzdGF0ZSwgcmVzKSB7XG5cdFx0YWN0aXZlSW5kZXgudmFsdWUrKztcblx0XHRyZXN1bHRbYWN0aXZlSW5kZXgudmFsdWVdLmRhdGEgPSByZXM7XG5cdFx0cmVzdWx0W2FjdGl2ZUluZGV4LnZhbHVlXS5zdGF0ZSA9IHN0YXRlO1xuXHR9XG5cdHRhc2tzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuXHRcdHJldHVybiBwcmV2LnRoZW4oKHByZXZSZXMpID0+IHtcblx0XHRcdHZhciBfcmVzdWx0JGFjdGl2ZUluZGV4JHY7XG5cdFx0XHRpZiAoc2lnbmFsID09PSBudWxsIHx8IHNpZ25hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2lnbmFsLmFib3J0ZWQpIHtcblx0XHRcdFx0dXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5hYm9ydGVkLCAvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiYWJvcnRlZFwiKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICgoKF9yZXN1bHQkYWN0aXZlSW5kZXgkdiA9IHJlc3VsdFthY3RpdmVJbmRleC52YWx1ZV0pID09PSBudWxsIHx8IF9yZXN1bHQkYWN0aXZlSW5kZXgkdiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Jlc3VsdCRhY3RpdmVJbmRleCR2LnN0YXRlKSA9PT0gcHJvbWlzZVN0YXRlLnJlamVjdGVkICYmIGludGVycnVwdCkge1xuXHRcdFx0XHRvbkZpbmlzaGVkKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGRvbmUgPSBjdXJyKHByZXZSZXMpLnRoZW4oKGN1cnJlbnRSZXMpID0+IHtcblx0XHRcdFx0dXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5mdWxmaWxsZWQsIGN1cnJlbnRSZXMpO1xuXHRcdFx0XHRpZiAoYWN0aXZlSW5kZXgudmFsdWUgPT09IHRhc2tzLmxlbmd0aCAtIDEpIG9uRmluaXNoZWQoKTtcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRSZXM7XG5cdFx0XHR9KTtcblx0XHRcdGlmICghc2lnbmFsKSByZXR1cm4gZG9uZTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJhY2UoW2RvbmUsIHdoZW5BYm9ydGVkKHNpZ25hbCldKTtcblx0XHR9KS5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0aWYgKHNpZ25hbCA9PT0gbnVsbCB8fCBzaWduYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNpZ25hbC5hYm9ydGVkKSB7XG5cdFx0XHRcdHVwZGF0ZVJlc3VsdChwcm9taXNlU3RhdGUuYWJvcnRlZCwgZSk7XG5cdFx0XHRcdHJldHVybiBlO1xuXHRcdFx0fVxuXHRcdFx0dXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5yZWplY3RlZCwgZSk7XG5cdFx0XHRvbkVycm9yKCk7XG5cdFx0XHRpZiAoYWN0aXZlSW5kZXgudmFsdWUgPT09IHRhc2tzLmxlbmd0aCAtIDEpIG9uRmluaXNoZWQoKTtcblx0XHRcdHJldHVybiBlO1xuXHRcdH0pO1xuXHR9LCBQcm9taXNlLnJlc29sdmUoKSk7XG5cdHJldHVybiB7XG5cdFx0YWN0aXZlSW5kZXgsXG5cdFx0cmVzdWx0XG5cdH07XG59XG5mdW5jdGlvbiB3aGVuQWJvcnRlZChzaWduYWwpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBlcnJvciA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJhYm9ydGVkXCIpO1xuXHRcdGlmIChzaWduYWwuYWJvcnRlZCkgcmVqZWN0KGVycm9yKTtcblx0XHRlbHNlIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4gcmVqZWN0KGVycm9yKSwgeyBvbmNlOiB0cnVlIH0pO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXN5bmNTdGF0ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGFzeW5jIHN0YXRlLiBXaWxsIG5vdCBibG9jayB5b3VyIHNldHVwIGZ1bmN0aW9uIGFuZCB3aWxsIHRyaWdnZXIgY2hhbmdlcyBvbmNlXG4qIHRoZSBwcm9taXNlIGlzIHJlYWR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBc3luY1N0YXRlXG4qIEBwYXJhbSBwcm9taXNlICAgICAgICAgVGhlIHByb21pc2UgLyBhc3luYyBmdW5jdGlvbiB0byBiZSByZXNvbHZlZFxuKiBAcGFyYW0gaW5pdGlhbFN0YXRlICAgIFRoZSBpbml0aWFsIHN0YXRlLCB1c2VkIHVudGlsIHRoZSBmaXJzdCBldmFsdWF0aW9uIGZpbmlzaGVzXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlQXN5bmNTdGF0ZShwcm9taXNlLCBpbml0aWFsU3RhdGUsIG9wdGlvbnMpIHtcblx0dmFyIF9nbG9iYWxUaGlzJHJlcG9ydEVycjtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBkZWxheSA9IDAsIG9uRXJyb3IgPSAoX2dsb2JhbFRoaXMkcmVwb3J0RXJyID0gZ2xvYmFsVGhpcy5yZXBvcnRFcnJvcikgIT09IG51bGwgJiYgX2dsb2JhbFRoaXMkcmVwb3J0RXJyICE9PSB2b2lkIDAgPyBfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgOiBub29wLCBvblN1Y2Nlc3MgPSBub29wLCByZXNldE9uRXhlY3V0ZSA9IHRydWUsIHNoYWxsb3cgPSB0cnVlLCB0aHJvd0Vycm9yIH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcblx0Y29uc3Qgc3RhdGUgPSBzaGFsbG93ID8gc2hhbGxvd1JlZihpbml0aWFsU3RhdGUpIDogcmVmKGluaXRpYWxTdGF0ZSk7XG5cdGNvbnN0IGlzUmVhZHkgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaXNMb2FkaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRsZXQgZXhlY3V0aW9uc0NvdW50ID0gMDtcblx0YXN5bmMgZnVuY3Rpb24gZXhlY3V0ZShkZWxheSQxID0gMCwgLi4uYXJncykge1xuXHRcdGNvbnN0IGV4ZWN1dGlvbklkID0gZXhlY3V0aW9uc0NvdW50ICs9IDE7XG5cdFx0aWYgKHJlc2V0T25FeGVjdXRlKSBzdGF0ZS52YWx1ZSA9IHRvVmFsdWUoaW5pdGlhbFN0YXRlKTtcblx0XHRlcnJvci52YWx1ZSA9IHZvaWQgMDtcblx0XHRpc1JlYWR5LnZhbHVlID0gZmFsc2U7XG5cdFx0aXNMb2FkaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRpZiAoZGVsYXkkMSA+IDApIGF3YWl0IHByb21pc2VUaW1lb3V0KGRlbGF5JDEpO1xuXHRcdGNvbnN0IF9wcm9taXNlID0gdHlwZW9mIHByb21pc2UgPT09IFwiZnVuY3Rpb25cIiA/IHByb21pc2UoLi4uYXJncykgOiBwcm9taXNlO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgX3Byb21pc2U7XG5cdFx0XHRpZiAoZXhlY3V0aW9uSWQgPT09IGV4ZWN1dGlvbnNDb3VudCkge1xuXHRcdFx0XHRzdGF0ZS52YWx1ZSA9IGRhdGE7XG5cdFx0XHRcdGlzUmVhZHkudmFsdWUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0b25TdWNjZXNzKGRhdGEpO1xuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKGV4ZWN1dGlvbklkID09PSBleGVjdXRpb25zQ291bnQpIGVycm9yLnZhbHVlID0gZTtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0XHRpZiAodGhyb3dFcnJvcikgdGhyb3cgZTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKGV4ZWN1dGlvbklkID09PSBleGVjdXRpb25zQ291bnQpIGlzTG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXHRpZiAoaW1tZWRpYXRlKSBleGVjdXRlKGRlbGF5KTtcblx0Y29uc3Qgc2hlbGwgPSB7XG5cdFx0c3RhdGUsXG5cdFx0aXNSZWFkeSxcblx0XHRpc0xvYWRpbmcsXG5cdFx0ZXJyb3IsXG5cdFx0ZXhlY3V0ZSxcblx0XHRleGVjdXRlSW1tZWRpYXRlOiAoLi4uYXJncykgPT4gZXhlY3V0ZSgwLCAuLi5hcmdzKVxuXHR9O1xuXHRmdW5jdGlvbiB3YWl0VW50aWxJc0xvYWRlZCgpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dW50aWwoaXNMb2FkaW5nKS50b0JlKGZhbHNlKS50aGVuKCgpID0+IHJlc29sdmUoc2hlbGwpKS5jYXRjaChyZWplY3QpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0Li4uc2hlbGwsXG5cdFx0dGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuXHRcdFx0cmV0dXJuIHdhaXRVbnRpbElzTG9hZGVkKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCYXNlNjQvc2VyaWFsaXphdGlvbi50c1xuY29uc3QgZGVmYXVsdHMgPSB7XG5cdGFycmF5OiAodikgPT4gSlNPTi5zdHJpbmdpZnkodiksXG5cdG9iamVjdDogKHYpID0+IEpTT04uc3RyaW5naWZ5KHYpLFxuXHRzZXQ6ICh2KSA9PiBKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHYpKSxcblx0bWFwOiAodikgPT4gSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmZyb21FbnRyaWVzKHYpKSxcblx0bnVsbDogKCkgPT4gXCJcIlxufTtcbmZ1bmN0aW9uIGdldERlZmF1bHRTZXJpYWxpemF0aW9uKHRhcmdldCkge1xuXHRpZiAoIXRhcmdldCkgcmV0dXJuIGRlZmF1bHRzLm51bGw7XG5cdGlmICh0YXJnZXQgaW5zdGFuY2VvZiBNYXApIHJldHVybiBkZWZhdWx0cy5tYXA7XG5cdGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIGRlZmF1bHRzLnNldDtcblx0ZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSByZXR1cm4gZGVmYXVsdHMuYXJyYXk7XG5cdGVsc2UgcmV0dXJuIGRlZmF1bHRzLm9iamVjdDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQmFzZTY0L2luZGV4LnRzXG5mdW5jdGlvbiB1c2VCYXNlNjQodGFyZ2V0LCBvcHRpb25zKSB7XG5cdGNvbnN0IGJhc2U2NCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IHByb21pc2UgPSBzaGFsbG93UmVmKCk7XG5cdGZ1bmN0aW9uIGV4ZWN1dGUoKSB7XG5cdFx0aWYgKCFpc0NsaWVudCkgcmV0dXJuO1xuXHRcdHByb21pc2UudmFsdWUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBfdGFyZ2V0ID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdFx0XHRpZiAoX3RhcmdldCA9PSBudWxsKSByZXNvbHZlKFwiXCIpO1xuXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgX3RhcmdldCA9PT0gXCJzdHJpbmdcIikgcmVzb2x2ZShibG9iVG9CYXNlNjQobmV3IEJsb2IoW190YXJnZXRdLCB7IHR5cGU6IFwidGV4dC9wbGFpblwiIH0pKSk7XG5cdFx0XHRcdGVsc2UgaWYgKF90YXJnZXQgaW5zdGFuY2VvZiBCbG9iKSByZXNvbHZlKGJsb2JUb0Jhc2U2NChfdGFyZ2V0KSk7XG5cdFx0XHRcdGVsc2UgaWYgKF90YXJnZXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgcmVzb2x2ZSh3aW5kb3cuYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLm5ldyBVaW50OEFycmF5KF90YXJnZXQpKSkpO1xuXHRcdFx0XHRlbHNlIGlmIChfdGFyZ2V0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHJlc29sdmUoX3RhcmdldC50b0RhdGFVUkwob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnR5cGUsIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5xdWFsaXR5KSk7XG5cdFx0XHRcdGVsc2UgaWYgKF90YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG5cdFx0XHRcdFx0Y29uc3QgaW1nID0gX3RhcmdldC5jbG9uZU5vZGUoZmFsc2UpO1xuXHRcdFx0XHRcdGltZy5jcm9zc09yaWdpbiA9IFwiQW5vbnltb3VzXCI7XG5cdFx0XHRcdFx0aW1nTG9hZGVkKGltZykudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuXHRcdFx0XHRcdFx0Y29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblx0XHRcdFx0XHRcdGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcblx0XHRcdFx0XHRcdGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuXHRcdFx0XHRcdFx0Y3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKGNhbnZhcy50b0RhdGFVUkwob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnR5cGUsIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5xdWFsaXR5KSk7XG5cdFx0XHRcdFx0fSkuY2F0Y2gocmVqZWN0KTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgX3RhcmdldCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdGNvbnN0IHNlcmlhbGl6ZWQgPSAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zZXJpYWxpemVyKSB8fCBnZXREZWZhdWx0U2VyaWFsaXphdGlvbihfdGFyZ2V0KSkoX3RhcmdldCk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc29sdmUoYmxvYlRvQmFzZTY0KG5ldyBCbG9iKFtzZXJpYWxpemVkXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KSkpO1xuXHRcdFx0XHR9IGVsc2UgcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJ0YXJnZXQgaXMgdW5zdXBwb3J0ZWQgdHlwZXNcIikpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRwcm9taXNlLnZhbHVlLnRoZW4oKHJlcykgPT4ge1xuXHRcdFx0YmFzZTY0LnZhbHVlID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kYXRhVXJsKSA9PT0gZmFsc2UgPyByZXMucmVwbGFjZSgvXmRhdGE6Lio/O2Jhc2U2NCwvLCBcIlwiKSA6IHJlcztcblx0XHR9KTtcblx0XHRyZXR1cm4gcHJvbWlzZS52YWx1ZTtcblx0fVxuXHRpZiAoaXNSZWYodGFyZ2V0KSB8fCB0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIpIHdhdGNoKHRhcmdldCwgZXhlY3V0ZSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdGVsc2UgZXhlY3V0ZSgpO1xuXHRyZXR1cm4ge1xuXHRcdGJhc2U2NCxcblx0XHRwcm9taXNlLFxuXHRcdGV4ZWN1dGVcblx0fTtcbn1cbmZ1bmN0aW9uIGltZ0xvYWRlZChpbWcpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRpZiAoIWltZy5jb21wbGV0ZSkge1xuXHRcdFx0aW1nLm9ubG9hZCA9ICgpID0+IHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fTtcblx0XHRcdGltZy5vbmVycm9yID0gcmVqZWN0O1xuXHRcdH0gZWxzZSByZXNvbHZlKCk7XG5cdH0pO1xufVxuZnVuY3Rpb24gYmxvYlRvQmFzZTY0KGJsb2IpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBmciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cdFx0ZnIub25sb2FkID0gKGUpID0+IHtcblx0XHRcdHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcblx0XHR9O1xuXHRcdGZyLm9uZXJyb3IgPSByZWplY3Q7XG5cdFx0ZnIucmVhZEFzRGF0YVVSTChibG9iKTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJhdHRlcnkvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBCYXR0ZXJ5IFN0YXR1cyBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUJhdHRlcnlcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VCYXR0ZXJ5KG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zO1xuXHRjb25zdCBldmVudHMkMSA9IFtcblx0XHRcImNoYXJnaW5nY2hhbmdlXCIsXG5cdFx0XCJjaGFyZ2luZ3RpbWVjaGFuZ2VcIixcblx0XHRcImRpc2NoYXJnaW5ndGltZWNoYW5nZVwiLFxuXHRcdFwibGV2ZWxjaGFuZ2VcIlxuXHRdO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJnZXRCYXR0ZXJ5XCIgaW4gbmF2aWdhdG9yJDEgJiYgdHlwZW9mIG5hdmlnYXRvciQxLmdldEJhdHRlcnkgPT09IFwiZnVuY3Rpb25cIik7XG5cdGNvbnN0IGNoYXJnaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGNoYXJnaW5nVGltZSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGRpc2NoYXJnaW5nVGltZSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGxldmVsID0gc2hhbGxvd1JlZigxKTtcblx0bGV0IGJhdHRlcnk7XG5cdGZ1bmN0aW9uIHVwZGF0ZUJhdHRlcnlJbmZvKCkge1xuXHRcdGNoYXJnaW5nLnZhbHVlID0gdGhpcy5jaGFyZ2luZztcblx0XHRjaGFyZ2luZ1RpbWUudmFsdWUgPSB0aGlzLmNoYXJnaW5nVGltZSB8fCAwO1xuXHRcdGRpc2NoYXJnaW5nVGltZS52YWx1ZSA9IHRoaXMuZGlzY2hhcmdpbmdUaW1lIHx8IDA7XG5cdFx0bGV2ZWwudmFsdWUgPSB0aGlzLmxldmVsO1xuXHR9XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgbmF2aWdhdG9yJDEuZ2V0QmF0dGVyeSgpLnRoZW4oKF9iYXR0ZXJ5KSA9PiB7XG5cdFx0YmF0dGVyeSA9IF9iYXR0ZXJ5O1xuXHRcdHVwZGF0ZUJhdHRlcnlJbmZvLmNhbGwoYmF0dGVyeSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihiYXR0ZXJ5LCBldmVudHMkMSwgdXBkYXRlQmF0dGVyeUluZm8sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y2hhcmdpbmcsXG5cdFx0Y2hhcmdpbmdUaW1lLFxuXHRcdGRpc2NoYXJnaW5nVGltZSxcblx0XHRsZXZlbFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCbHVldG9vdGgvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VCbHVldG9vdGgob3B0aW9ucykge1xuXHRsZXQgeyBhY2NlcHRBbGxEZXZpY2VzID0gZmFsc2UgfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IHsgZmlsdGVycyA9IHZvaWQgMCwgb3B0aW9uYWxTZXJ2aWNlcyA9IHZvaWQgMCwgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImJsdWV0b290aFwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgZGV2aWNlID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdHdhdGNoKGRldmljZSwgKCkgPT4ge1xuXHRcdGNvbm5lY3RUb0JsdWV0b290aEdBVFRTZXJ2ZXIoKTtcblx0fSk7XG5cdGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3REZXZpY2UoKSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0XHRpZiAoZmlsdGVycyAmJiBmaWx0ZXJzLmxlbmd0aCA+IDApIGFjY2VwdEFsbERldmljZXMgPSBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0ZGV2aWNlLnZhbHVlID0gYXdhaXQgKG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IkMS5ibHVldG9vdGgucmVxdWVzdERldmljZSh7XG5cdFx0XHRcdGFjY2VwdEFsbERldmljZXMsXG5cdFx0XHRcdGZpbHRlcnMsXG5cdFx0XHRcdG9wdGlvbmFsU2VydmljZXNcblx0XHRcdH0pKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGVycm9yLnZhbHVlID0gZXJyO1xuXHRcdH1cblx0fVxuXHRjb25zdCBzZXJ2ZXIgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGlzQ29ubmVjdGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXHRcdGlzQ29ubmVjdGVkLnZhbHVlID0gZmFsc2U7XG5cdFx0ZGV2aWNlLnZhbHVlID0gdm9pZCAwO1xuXHRcdHNlcnZlci52YWx1ZSA9IHZvaWQgMDtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBjb25uZWN0VG9CbHVldG9vdGhHQVRUU2VydmVyKCkge1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0XHRpZiAoZGV2aWNlLnZhbHVlICYmIGRldmljZS52YWx1ZS5nYXR0KSB7XG5cdFx0XHR1c2VFdmVudExpc3RlbmVyKGRldmljZSwgXCJnYXR0c2VydmVyZGlzY29ubmVjdGVkXCIsIHJlc2V0LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRzZXJ2ZXIudmFsdWUgPSBhd2FpdCBkZXZpY2UudmFsdWUuZ2F0dC5jb25uZWN0KCk7XG5cdFx0XHRcdGlzQ29ubmVjdGVkLnZhbHVlID0gc2VydmVyLnZhbHVlLmNvbm5lY3RlZDtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRlcnJvci52YWx1ZSA9IGVycjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0dHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHR2YXIgX2RldmljZSR2YWx1ZSRnYXR0O1xuXHRcdGlmIChkZXZpY2UudmFsdWUpIChfZGV2aWNlJHZhbHVlJGdhdHQgPSBkZXZpY2UudmFsdWUuZ2F0dCkgPT09IG51bGwgfHwgX2RldmljZSR2YWx1ZSRnYXR0ID09PSB2b2lkIDAgfHwgX2RldmljZSR2YWx1ZSRnYXR0LmNvbm5lY3QoKTtcblx0fSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHR2YXIgX2RldmljZSR2YWx1ZSRnYXR0Mjtcblx0XHRpZiAoZGV2aWNlLnZhbHVlKSAoX2RldmljZSR2YWx1ZSRnYXR0MiA9IGRldmljZS52YWx1ZS5nYXR0KSA9PT0gbnVsbCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQyID09PSB2b2lkIDAgfHwgX2RldmljZSR2YWx1ZSRnYXR0Mi5kaXNjb25uZWN0KCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzQ29ubmVjdGVkOiByZWFkb25seShpc0Nvbm5lY3RlZCksXG5cdFx0ZGV2aWNlLFxuXHRcdHJlcXVlc3REZXZpY2UsXG5cdFx0c2VydmVyLFxuXHRcdGVycm9yXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNTUldpZHRoL2luZGV4LnRzXG5jb25zdCBzc3JXaWR0aFN5bWJvbCA9IFN5bWJvbChcInZ1ZXVzZS1zc3Itd2lkdGhcIik7XG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlU1NSV2lkdGgoKSB7XG5cdGNvbnN0IHNzcldpZHRoID0gaGFzSW5qZWN0aW9uQ29udGV4dCgpID8gaW5qZWN0TG9jYWwoc3NyV2lkdGhTeW1ib2wsIG51bGwpIDogbnVsbDtcblx0cmV0dXJuIHR5cGVvZiBzc3JXaWR0aCA9PT0gXCJudW1iZXJcIiA/IHNzcldpZHRoIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gcHJvdmlkZVNTUldpZHRoKHdpZHRoLCBhcHApIHtcblx0aWYgKGFwcCAhPT0gdm9pZCAwKSBhcHAucHJvdmlkZShzc3JXaWR0aFN5bWJvbCwgd2lkdGgpO1xuXHRlbHNlIHByb3ZpZGVMb2NhbChzc3JXaWR0aFN5bWJvbCwgd2lkdGgpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNZWRpYVF1ZXJ5L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgTWVkaWEgUXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1lZGlhUXVlcnlcbiogQHBhcmFtIHF1ZXJ5XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTWVkaWFRdWVyeShxdWVyeSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHNzcldpZHRoID0gLyogQF9fUFVSRV9fICovIHVzZVNTUldpZHRoKCkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcIm1hdGNoTWVkaWFcIiBpbiB3aW5kb3ckMSAmJiB0eXBlb2Ygd2luZG93JDEubWF0Y2hNZWRpYSA9PT0gXCJmdW5jdGlvblwiKTtcblx0Y29uc3Qgc3NyU3VwcG9ydCA9IHNoYWxsb3dSZWYodHlwZW9mIHNzcldpZHRoID09PSBcIm51bWJlclwiKTtcblx0Y29uc3QgbWVkaWFRdWVyeSA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgbWF0Y2hlcyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBoYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0bWF0Y2hlcy52YWx1ZSA9IGV2ZW50Lm1hdGNoZXM7XG5cdH07XG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRpZiAoc3NyU3VwcG9ydC52YWx1ZSkge1xuXHRcdFx0c3NyU3VwcG9ydC52YWx1ZSA9ICFpc1N1cHBvcnRlZC52YWx1ZTtcblx0XHRcdG1hdGNoZXMudmFsdWUgPSB0b1ZhbHVlKHF1ZXJ5KS5zcGxpdChcIixcIikuc29tZSgocXVlcnlTdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgbm90ID0gcXVlcnlTdHJpbmcuaW5jbHVkZXMoXCJub3QgYWxsXCIpO1xuXHRcdFx0XHRjb25zdCBtaW5XaWR0aCA9IHF1ZXJ5U3RyaW5nLm1hdGNoKC9cXChcXHMqbWluLXdpZHRoOlxccyooLT9cXGQrKD86XFwuXFxkKik/W2Etel0rXFxzKilcXCkvKTtcblx0XHRcdFx0Y29uc3QgbWF4V2lkdGggPSBxdWVyeVN0cmluZy5tYXRjaCgvXFwoXFxzKm1heC13aWR0aDpcXHMqKC0/XFxkKyg/OlxcLlxcZCopP1thLXpdK1xccyopXFwpLyk7XG5cdFx0XHRcdGxldCByZXMgPSBCb29sZWFuKG1pbldpZHRoIHx8IG1heFdpZHRoKTtcblx0XHRcdFx0aWYgKG1pbldpZHRoICYmIHJlcykgcmVzID0gc3NyV2lkdGggPj0gcHhWYWx1ZShtaW5XaWR0aFsxXSk7XG5cdFx0XHRcdGlmIChtYXhXaWR0aCAmJiByZXMpIHJlcyA9IHNzcldpZHRoIDw9IHB4VmFsdWUobWF4V2lkdGhbMV0pO1xuXHRcdFx0XHRyZXR1cm4gbm90ID8gIXJlcyA6IHJlcztcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0bWVkaWFRdWVyeS52YWx1ZSA9IHdpbmRvdyQxLm1hdGNoTWVkaWEodG9WYWx1ZShxdWVyeSkpO1xuXHRcdG1hdGNoZXMudmFsdWUgPSBtZWRpYVF1ZXJ5LnZhbHVlLm1hdGNoZXM7XG5cdH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKG1lZGlhUXVlcnksIFwiY2hhbmdlXCIsIGhhbmRsZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IG1hdGNoZXMudmFsdWUpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCcmVha3BvaW50cy9icmVha3BvaW50cy50c1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gVGFpbHdpbmQgVjJcbipcbiogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JyZWFrcG9pbnRzXG4qL1xuY29uc3QgYnJlYWtwb2ludHNUYWlsd2luZCA9IHtcblx0XCJzbVwiOiA2NDAsXG5cdFwibWRcIjogNzY4LFxuXHRcImxnXCI6IDEwMjQsXG5cdFwieGxcIjogMTI4MCxcblx0XCIyeGxcIjogMTUzNlxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIEJvb3RzdHJhcCBWNVxuKlxuKiBAc2VlIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzUuMC9sYXlvdXQvYnJlYWtwb2ludHNcbiovXG5jb25zdCBicmVha3BvaW50c0Jvb3RzdHJhcFY1ID0ge1xuXHR4czogMCxcblx0c206IDU3Nixcblx0bWQ6IDc2OCxcblx0bGc6IDk5Mixcblx0eGw6IDEyMDAsXG5cdHh4bDogMTQwMFxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIFZ1ZXRpZnkgVjJcbipcbiogQHNlZSBodHRwczovL3YyLnZ1ZXRpZnlqcy5jb20vZW4vZmVhdHVyZXMvYnJlYWtwb2ludHMvXG4qL1xuY29uc3QgYnJlYWtwb2ludHNWdWV0aWZ5VjIgPSB7XG5cdHhzOiAwLFxuXHRzbTogNjAwLFxuXHRtZDogOTYwLFxuXHRsZzogMTI2NCxcblx0eGw6IDE5MDRcbn07XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBWdWV0aWZ5IFYzXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV0aWZ5anMuY29tL2VuL3N0eWxlcy9mbG9hdC8jb3ZlcnZpZXdcbiovXG5jb25zdCBicmVha3BvaW50c1Z1ZXRpZnlWMyA9IHtcblx0eHM6IDAsXG5cdHNtOiA2MDAsXG5cdG1kOiA5NjAsXG5cdGxnOiAxMjgwLFxuXHR4bDogMTkyMCxcblx0eHhsOiAyNTYwXG59O1xuLyoqXG4qIEFsaWFzIHRvIGBicmVha3BvaW50c1Z1ZXRpZnlWMmBcbipcbiogQGRlcHJlY2F0ZWQgZXhwbGljdGx5IHVzZSBgYnJlYWtwb2ludHNWdWV0aWZ5VjJgIG9yIGBicmVha3BvaW50c1Z1ZXRpZnlWM2AgaW5zdGVhZFxuKi9cbmNvbnN0IGJyZWFrcG9pbnRzVnVldGlmeSA9IGJyZWFrcG9pbnRzVnVldGlmeVYyO1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gQW50IERlc2lnblxuKlxuKiBAc2VlIGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2xheW91dC8jYnJlYWtwb2ludC13aWR0aFxuKi9cbmNvbnN0IGJyZWFrcG9pbnRzQW50RGVzaWduID0ge1xuXHR4czogNDgwLFxuXHRzbTogNTc2LFxuXHRtZDogNzY4LFxuXHRsZzogOTkyLFxuXHR4bDogMTIwMCxcblx0eHhsOiAxNjAwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gUXVhc2FyIFYyXG4qXG4qIEBzZWUgaHR0cHM6Ly9xdWFzYXIuZGV2L3N0eWxlL2JyZWFrcG9pbnRzXG4qL1xuY29uc3QgYnJlYWtwb2ludHNRdWFzYXIgPSB7XG5cdHhzOiAwLFxuXHRzbTogNjAwLFxuXHRtZDogMTAyNCxcblx0bGc6IDE0NDAsXG5cdHhsOiAxOTIwXG59O1xuLyoqXG4qIFNlbWF0aWMgQnJlYWtwb2ludHNcbiovXG5jb25zdCBicmVha3BvaW50c1NlbWF0aWMgPSB7XG5cdG1vYmlsZVM6IDMyMCxcblx0bW9iaWxlTTogMzc1LFxuXHRtb2JpbGVMOiA0MjUsXG5cdHRhYmxldDogNzY4LFxuXHRsYXB0b3A6IDEwMjQsXG5cdGxhcHRvcEw6IDE0NDAsXG5cdGRlc2t0b3A0SzogMjU2MFxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIE1hc3RlciBDU1NcbipcbiogQHNlZSBodHRwczovL2RvY3MubWFzdGVyLmNvL2Nzcy9icmVha3BvaW50c1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzTWFzdGVyQ3NzID0ge1xuXHRcIjN4c1wiOiAzNjAsXG5cdFwiMnhzXCI6IDQ4MCxcblx0XCJ4c1wiOiA2MDAsXG5cdFwic21cIjogNzY4LFxuXHRcIm1kXCI6IDEwMjQsXG5cdFwibGdcIjogMTI4MCxcblx0XCJ4bFwiOiAxNDQwLFxuXHRcIjJ4bFwiOiAxNjAwLFxuXHRcIjN4bFwiOiAxOTIwLFxuXHRcIjR4bFwiOiAyNTYwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gUHJpbWVGbGV4XG4qXG4qIEBzZWUgaHR0cHM6Ly9wcmltZWZsZXgub3JnL2luc3RhbGxhdGlvblxuKi9cbmNvbnN0IGJyZWFrcG9pbnRzUHJpbWVGbGV4ID0ge1xuXHRzbTogNTc2LFxuXHRtZDogNzY4LFxuXHRsZzogOTkyLFxuXHR4bDogMTIwMFxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIEVsZW1lbnRVSS9FbGVtZW50UGx1c1xuKlxuKiBAc2VlIGh0dHBzOi8vZWxlbWVudC5lbGVtZS5pby8jL2VuLVVTL2NvbXBvbmVudC9sYXlvdXRcbiogQHNlZSBodHRwczovL2VsZW1lbnQtcGx1cy5vcmcvZW4tVVMvY29tcG9uZW50L2xheW91dC5odG1sXG4qL1xuY29uc3QgYnJlYWtwb2ludHNFbGVtZW50ID0ge1xuXHR4czogMCxcblx0c206IDc2OCxcblx0bWQ6IDk5Mixcblx0bGc6IDEyMDAsXG5cdHhsOiAxOTIwXG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCcmVha3BvaW50cy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgdmlld3BvcnQgYnJlYWtwb2ludHNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQnJlYWtwb2ludHNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VCcmVha3BvaW50cyhicmVha3BvaW50cywgb3B0aW9ucyA9IHt9KSB7XG5cdGZ1bmN0aW9uIGdldFZhbHVlJDEoaywgZGVsdGEpIHtcblx0XHRsZXQgdiA9IHRvVmFsdWUoYnJlYWtwb2ludHNbdG9WYWx1ZShrKV0pO1xuXHRcdGlmIChkZWx0YSAhPSBudWxsKSB2ID0gaW5jcmVhc2VXaXRoVW5pdCh2LCBkZWx0YSk7XG5cdFx0aWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB2ID0gYCR7dn1weGA7XG5cdFx0cmV0dXJuIHY7XG5cdH1cblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3RyYXRlZ3kgPSBcIm1pbi13aWR0aFwiLCBzc3JXaWR0aCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTU1JXaWR0aCgpIH0gPSBvcHRpb25zO1xuXHRjb25zdCBzc3JTdXBwb3J0ID0gdHlwZW9mIHNzcldpZHRoID09PSBcIm51bWJlclwiO1xuXHRjb25zdCBtb3VudGVkID0gc3NyU3VwcG9ydCA/IHNoYWxsb3dSZWYoZmFsc2UpIDogeyB2YWx1ZTogdHJ1ZSB9O1xuXHRpZiAoc3NyU3VwcG9ydCkgdHJ5T25Nb3VudGVkKCgpID0+IG1vdW50ZWQudmFsdWUgPSAhIXdpbmRvdyQxKTtcblx0ZnVuY3Rpb24gbWF0Y2gocXVlcnksIHNpemUpIHtcblx0XHRpZiAoIW1vdW50ZWQudmFsdWUgJiYgc3NyU3VwcG9ydCkgcmV0dXJuIHF1ZXJ5ID09PSBcIm1pblwiID8gc3NyV2lkdGggPj0gcHhWYWx1ZShzaXplKSA6IHNzcldpZHRoIDw9IHB4VmFsdWUoc2l6ZSk7XG5cdFx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiB3aW5kb3ckMS5tYXRjaE1lZGlhKGAoJHtxdWVyeX0td2lkdGg6ICR7c2l6ZX0pYCkubWF0Y2hlcztcblx0fVxuXHRjb25zdCBncmVhdGVyT3JFcXVhbCA9IChrKSA9PiB7XG5cdFx0cmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUkMShrKX0pYCwgb3B0aW9ucyk7XG5cdH07XG5cdGNvbnN0IHNtYWxsZXJPckVxdWFsID0gKGspID0+IHtcblx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1heC13aWR0aDogJHtnZXRWYWx1ZSQxKGspfSlgLCBvcHRpb25zKTtcblx0fTtcblx0Y29uc3Qgc2hvcnRjdXRNZXRob2RzID0gT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLnJlZHVjZSgoc2hvcnRjdXRzLCBrKSA9PiB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHNob3J0Y3V0cywgaywge1xuXHRcdFx0Z2V0OiAoKSA9PiBzdHJhdGVneSA9PT0gXCJtaW4td2lkdGhcIiA/IGdyZWF0ZXJPckVxdWFsKGspIDogc21hbGxlck9yRXF1YWwoayksXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHNob3J0Y3V0cztcblx0fSwge30pO1xuXHRmdW5jdGlvbiBjdXJyZW50KCkge1xuXHRcdGNvbnN0IHBvaW50cyA9IE9iamVjdC5rZXlzKGJyZWFrcG9pbnRzKS5tYXAoKGspID0+IFtcblx0XHRcdGssXG5cdFx0XHRzaG9ydGN1dE1ldGhvZHNba10sXG5cdFx0XHRweFZhbHVlKGdldFZhbHVlJDEoaykpXG5cdFx0XSkuc29ydCgoYSwgYikgPT4gYVsyXSAtIGJbMl0pO1xuXHRcdHJldHVybiBjb21wdXRlZCgoKSA9PiBwb2ludHMuZmlsdGVyKChbLCB2XSkgPT4gdi52YWx1ZSkubWFwKChba10pID0+IGspKTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbihzaG9ydGN1dE1ldGhvZHMsIHtcblx0XHRncmVhdGVyT3JFcXVhbCxcblx0XHRzbWFsbGVyT3JFcXVhbCxcblx0XHRncmVhdGVyKGspIHtcblx0XHRcdHJldHVybiB1c2VNZWRpYVF1ZXJ5KCgpID0+IGAobWluLXdpZHRoOiAke2dldFZhbHVlJDEoaywgLjEpfSlgLCBvcHRpb25zKTtcblx0XHR9LFxuXHRcdHNtYWxsZXIoaykge1xuXHRcdFx0cmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtYXgtd2lkdGg6ICR7Z2V0VmFsdWUkMShrLCAtLjEpfSlgLCBvcHRpb25zKTtcblx0XHR9LFxuXHRcdGJldHdlZW4oYSwgYikge1xuXHRcdFx0cmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUkMShhKX0pIGFuZCAobWF4LXdpZHRoOiAke2dldFZhbHVlJDEoYiwgLS4xKX0pYCwgb3B0aW9ucyk7XG5cdFx0fSxcblx0XHRpc0dyZWF0ZXIoaykge1xuXHRcdFx0cmV0dXJuIG1hdGNoKFwibWluXCIsIGdldFZhbHVlJDEoaywgLjEpKTtcblx0XHR9LFxuXHRcdGlzR3JlYXRlck9yRXF1YWwoaykge1xuXHRcdFx0cmV0dXJuIG1hdGNoKFwibWluXCIsIGdldFZhbHVlJDEoaykpO1xuXHRcdH0sXG5cdFx0aXNTbWFsbGVyKGspIHtcblx0XHRcdHJldHVybiBtYXRjaChcIm1heFwiLCBnZXRWYWx1ZSQxKGssIC0uMSkpO1xuXHRcdH0sXG5cdFx0aXNTbWFsbGVyT3JFcXVhbChrKSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2goXCJtYXhcIiwgZ2V0VmFsdWUkMShrKSk7XG5cdFx0fSxcblx0XHRpc0luQmV0d2VlbihhLCBiKSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2goXCJtaW5cIiwgZ2V0VmFsdWUkMShhKSkgJiYgbWF0Y2goXCJtYXhcIiwgZ2V0VmFsdWUkMShiLCAtLjEpKTtcblx0XHR9LFxuXHRcdGN1cnJlbnQsXG5cdFx0YWN0aXZlKCkge1xuXHRcdFx0Y29uc3QgYnBzID0gY3VycmVudCgpO1xuXHRcdFx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IGJwcy52YWx1ZS5sZW5ndGggPT09IDAgPyBcIlwiIDogYnBzLnZhbHVlLmF0KHN0cmF0ZWd5ID09PSBcIm1pbi13aWR0aFwiID8gLTEgOiAwKSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQnJvYWRjYXN0Q2hhbm5lbC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIEJyb2FkY2FzdENoYW5uZWxcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQnJvYWRjYXN0Q2hhbm5lbFxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ccm9hZGNhc3RDaGFubmVsXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qL1xuZnVuY3Rpb24gdXNlQnJvYWRjYXN0Q2hhbm5lbChvcHRpb25zKSB7XG5cdGNvbnN0IHsgbmFtZSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcIkJyb2FkY2FzdENoYW5uZWxcIiBpbiB3aW5kb3ckMSk7XG5cdGNvbnN0IGlzQ2xvc2VkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGNoYW5uZWwgPSByZWYoKTtcblx0Y29uc3QgZGF0YSA9IHJlZigpO1xuXHRjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHBvc3QgPSAoZGF0YSQxKSA9PiB7XG5cdFx0aWYgKGNoYW5uZWwudmFsdWUpIGNoYW5uZWwudmFsdWUucG9zdE1lc3NhZ2UoZGF0YSQxKTtcblx0fTtcblx0Y29uc3QgY2xvc2UgPSAoKSA9PiB7XG5cdFx0aWYgKGNoYW5uZWwudmFsdWUpIGNoYW5uZWwudmFsdWUuY2xvc2UoKTtcblx0XHRpc0Nsb3NlZC52YWx1ZSA9IHRydWU7XG5cdH07XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgdHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHRlcnJvci52YWx1ZSA9IG51bGw7XG5cdFx0Y2hhbm5lbC52YWx1ZSA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKG5hbWUpO1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoY2hhbm5lbCwgXCJtZXNzYWdlXCIsIChlKSA9PiB7XG5cdFx0XHRkYXRhLnZhbHVlID0gZS5kYXRhO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihjaGFubmVsLCBcIm1lc3NhZ2VlcnJvclwiLCAoZSkgPT4ge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBlO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihjaGFubmVsLCBcImNsb3NlXCIsICgpID0+IHtcblx0XHRcdGlzQ2xvc2VkLnZhbHVlID0gdHJ1ZTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdGNsb3NlKCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGNoYW5uZWwsXG5cdFx0ZGF0YSxcblx0XHRwb3N0LFxuXHRcdGNsb3NlLFxuXHRcdGVycm9yLFxuXHRcdGlzQ2xvc2VkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJyb3dzZXJMb2NhdGlvbi9pbmRleC50c1xuY29uc3QgV1JJVEFCTEVfUFJPUEVSVElFUyA9IFtcblx0XCJoYXNoXCIsXG5cdFwiaG9zdFwiLFxuXHRcImhvc3RuYW1lXCIsXG5cdFwiaHJlZlwiLFxuXHRcInBhdGhuYW1lXCIsXG5cdFwicG9ydFwiLFxuXHRcInByb3RvY29sXCIsXG5cdFwic2VhcmNoXCJcbl07XG4vKipcbiogUmVhY3RpdmUgYnJvd3NlciBsb2NhdGlvbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQnJvd3NlckxvY2F0aW9uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQnJvd3NlckxvY2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCByZWZzID0gT2JqZWN0LmZyb21FbnRyaWVzKFdSSVRBQkxFX1BST1BFUlRJRVMubWFwKChrZXkpID0+IFtrZXksIHJlZigpXSkpO1xuXHRmb3IgKGNvbnN0IFtrZXksIHJlZiQxXSBvZiBvYmplY3RFbnRyaWVzKHJlZnMpKSB3YXRjaChyZWYkMSwgKHZhbHVlKSA9PiB7XG5cdFx0aWYgKCEod2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmxvY2F0aW9uKSB8fCB3aW5kb3ckMS5sb2NhdGlvbltrZXldID09PSB2YWx1ZSkgcmV0dXJuO1xuXHRcdHdpbmRvdyQxLmxvY2F0aW9uW2tleV0gPSB2YWx1ZTtcblx0fSk7XG5cdGNvbnN0IGJ1aWxkU3RhdGUgPSAodHJpZ2dlcikgPT4ge1xuXHRcdHZhciBfd2luZG93JGxvY2F0aW9uO1xuXHRcdGNvbnN0IHsgc3RhdGU6IHN0YXRlJDEsIGxlbmd0aCB9ID0gKHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5oaXN0b3J5KSB8fCB7fTtcblx0XHRjb25zdCB7IG9yaWdpbiB9ID0gKHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5sb2NhdGlvbikgfHwge307XG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgV1JJVEFCTEVfUFJPUEVSVElFUykgcmVmc1trZXldLnZhbHVlID0gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCB8fCAoX3dpbmRvdyRsb2NhdGlvbiA9IHdpbmRvdyQxLmxvY2F0aW9uKSA9PT0gbnVsbCB8fCBfd2luZG93JGxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfd2luZG93JGxvY2F0aW9uW2tleV07XG5cdFx0cmV0dXJuIHJlYWN0aXZlKHtcblx0XHRcdHRyaWdnZXIsXG5cdFx0XHRzdGF0ZTogc3RhdGUkMSxcblx0XHRcdGxlbmd0aCxcblx0XHRcdG9yaWdpbixcblx0XHRcdC4uLnJlZnNcblx0XHR9KTtcblx0fTtcblx0Y29uc3Qgc3RhdGUgPSByZWYoYnVpbGRTdGF0ZShcImxvYWRcIikpO1xuXHRpZiAod2luZG93JDEpIHtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInBvcHN0YXRlXCIsICgpID0+IHN0YXRlLnZhbHVlID0gYnVpbGRTdGF0ZShcInBvcHN0YXRlXCIpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiaGFzaGNoYW5nZVwiLCAoKSA9PiBzdGF0ZS52YWx1ZSA9IGJ1aWxkU3RhdGUoXCJoYXNoY2hhbmdlXCIpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ2FjaGVkL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDYWNoZWQocmVmVmFsdWUsIGNvbXBhcmF0b3IgPSAoYSwgYikgPT4gYSA9PT0gYiwgb3B0aW9ucykge1xuXHRjb25zdCB7IGRlZXBSZWZzID0gdHJ1ZSwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IGNhY2hlZFZhbHVlID0gY3JlYXRlUmVmKHJlZlZhbHVlLnZhbHVlLCBkZWVwUmVmcyk7XG5cdHdhdGNoKCgpID0+IHJlZlZhbHVlLnZhbHVlLCAodmFsdWUpID0+IHtcblx0XHRpZiAoIWNvbXBhcmF0b3IodmFsdWUsIGNhY2hlZFZhbHVlLnZhbHVlKSkgY2FjaGVkVmFsdWUudmFsdWUgPSB2YWx1ZTtcblx0fSwgd2F0Y2hPcHRpb25zKTtcblx0cmV0dXJuIGNhY2hlZFZhbHVlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQZXJtaXNzaW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgUGVybWlzc2lvbnMgQVBJLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQZXJtaXNzaW9uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlUGVybWlzc2lvbihwZXJtaXNzaW9uRGVzYywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHMgPSBmYWxzZSwgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcInBlcm1pc3Npb25zXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBwZXJtaXNzaW9uU3RhdHVzID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBkZXNjID0gdHlwZW9mIHBlcm1pc3Npb25EZXNjID09PSBcInN0cmluZ1wiID8geyBuYW1lOiBwZXJtaXNzaW9uRGVzYyB9IDogcGVybWlzc2lvbkRlc2M7XG5cdGNvbnN0IHN0YXRlID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCB1cGRhdGUgPSAoKSA9PiB7XG5cdFx0dmFyIF9wZXJtaXNzaW9uU3RhdHVzJHZhbCwgX3Blcm1pc3Npb25TdGF0dXMkdmFsMjtcblx0XHRzdGF0ZS52YWx1ZSA9IChfcGVybWlzc2lvblN0YXR1cyR2YWwgPSAoX3Blcm1pc3Npb25TdGF0dXMkdmFsMiA9IHBlcm1pc3Npb25TdGF0dXMudmFsdWUpID09PSBudWxsIHx8IF9wZXJtaXNzaW9uU3RhdHVzJHZhbDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9wZXJtaXNzaW9uU3RhdHVzJHZhbDIuc3RhdGUpICE9PSBudWxsICYmIF9wZXJtaXNzaW9uU3RhdHVzJHZhbCAhPT0gdm9pZCAwID8gX3Blcm1pc3Npb25TdGF0dXMkdmFsIDogXCJwcm9tcHRcIjtcblx0fTtcblx0dXNlRXZlbnRMaXN0ZW5lcihwZXJtaXNzaW9uU3RhdHVzLCBcImNoYW5nZVwiLCB1cGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0Y29uc3QgcXVlcnkgPSBjcmVhdGVTaW5nbGV0b25Qcm9taXNlKGFzeW5jICgpID0+IHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKCFwZXJtaXNzaW9uU3RhdHVzLnZhbHVlKSB0cnkge1xuXHRcdFx0cGVybWlzc2lvblN0YXR1cy52YWx1ZSA9IGF3YWl0IG5hdmlnYXRvciQxLnBlcm1pc3Npb25zLnF1ZXJ5KGRlc2MpO1xuXHRcdH0gY2F0Y2ggKF91bnVzZWQpIHtcblx0XHRcdHBlcm1pc3Npb25TdGF0dXMudmFsdWUgPSB2b2lkIDA7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHVwZGF0ZSgpO1xuXHRcdH1cblx0XHRpZiAoY29udHJvbHMpIHJldHVybiB0b1JhdyhwZXJtaXNzaW9uU3RhdHVzLnZhbHVlKTtcblx0fSk7XG5cdHF1ZXJ5KCk7XG5cdGlmIChjb250cm9scykgcmV0dXJuIHtcblx0XHRzdGF0ZSxcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRxdWVyeVxuXHR9O1xuXHRlbHNlIHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ2xpcGJvYXJkL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDbGlwYm9hcmQob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIHJlYWQgPSBmYWxzZSwgc291cmNlLCBjb3BpZWREdXJpbmcgPSAxNTAwLCBsZWdhY3kgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNDbGlwYm9hcmRBcGlTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiY2xpcGJvYXJkXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBwZXJtaXNzaW9uUmVhZCA9IHVzZVBlcm1pc3Npb24oXCJjbGlwYm9hcmQtcmVhZFwiKTtcblx0Y29uc3QgcGVybWlzc2lvbldyaXRlID0gdXNlUGVybWlzc2lvbihcImNsaXBib2FyZC13cml0ZVwiKTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSBjb21wdXRlZCgoKSA9PiBpc0NsaXBib2FyZEFwaVN1cHBvcnRlZC52YWx1ZSB8fCBsZWdhY3kpO1xuXHRjb25zdCB0ZXh0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgY29waWVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHRpbWVvdXQgPSB1c2VUaW1lb3V0Rm4oKCkgPT4gY29waWVkLnZhbHVlID0gZmFsc2UsIGNvcGllZER1cmluZywgeyBpbW1lZGlhdGU6IGZhbHNlIH0pO1xuXHRhc3luYyBmdW5jdGlvbiB1cGRhdGVUZXh0KCkge1xuXHRcdGxldCB1c2VMZWdhY3kgPSAhKGlzQ2xpcGJvYXJkQXBpU3VwcG9ydGVkLnZhbHVlICYmIGlzQWxsb3dlZChwZXJtaXNzaW9uUmVhZC52YWx1ZSkpO1xuXHRcdGlmICghdXNlTGVnYWN5KSB0cnkge1xuXHRcdFx0dGV4dC52YWx1ZSA9IGF3YWl0IG5hdmlnYXRvciQxLmNsaXBib2FyZC5yZWFkVGV4dCgpO1xuXHRcdH0gY2F0Y2ggKF91bnVzZWQpIHtcblx0XHRcdHVzZUxlZ2FjeSA9IHRydWU7XG5cdFx0fVxuXHRcdGlmICh1c2VMZWdhY3kpIHRleHQudmFsdWUgPSBsZWdhY3lSZWFkKCk7XG5cdH1cblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHJlYWQpIHVzZUV2ZW50TGlzdGVuZXIoW1wiY29weVwiLCBcImN1dFwiXSwgdXBkYXRlVGV4dCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRhc3luYyBmdW5jdGlvbiBjb3B5KHZhbHVlID0gdG9WYWx1ZShzb3VyY2UpKSB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHZhbHVlICE9IG51bGwpIHtcblx0XHRcdGxldCB1c2VMZWdhY3kgPSAhKGlzQ2xpcGJvYXJkQXBpU3VwcG9ydGVkLnZhbHVlICYmIGlzQWxsb3dlZChwZXJtaXNzaW9uV3JpdGUudmFsdWUpKTtcblx0XHRcdGlmICghdXNlTGVnYWN5KSB0cnkge1xuXHRcdFx0XHRhd2FpdCBuYXZpZ2F0b3IkMS5jbGlwYm9hcmQud3JpdGVUZXh0KHZhbHVlKTtcblx0XHRcdH0gY2F0Y2ggKF91bnVzZWQyKSB7XG5cdFx0XHRcdHVzZUxlZ2FjeSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAodXNlTGVnYWN5KSBsZWdhY3lDb3B5KHZhbHVlKTtcblx0XHRcdHRleHQudmFsdWUgPSB2YWx1ZTtcblx0XHRcdGNvcGllZC52YWx1ZSA9IHRydWU7XG5cdFx0XHR0aW1lb3V0LnN0YXJ0KCk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIGxlZ2FjeUNvcHkodmFsdWUpIHtcblx0XHRjb25zdCB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcblx0XHR0YS52YWx1ZSA9IHZhbHVlO1xuXHRcdHRhLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuXHRcdHRhLnN0eWxlLm9wYWNpdHkgPSBcIjBcIjtcblx0XHR0YS5zZXRBdHRyaWJ1dGUoXCJyZWFkb25seVwiLCBcIlwiKTtcblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTtcblx0XHR0YS5zZWxlY3QoKTtcblx0XHRkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XG5cdFx0dGEucmVtb3ZlKCk7XG5cdH1cblx0ZnVuY3Rpb24gbGVnYWN5UmVhZCgpIHtcblx0XHR2YXIgX2RvY3VtZW50JGdldFNlbGVjdGlvLCBfZG9jdW1lbnQsIF9kb2N1bWVudCRnZXRTZWxlY3RpbzI7XG5cdFx0cmV0dXJuIChfZG9jdW1lbnQkZ2V0U2VsZWN0aW8gPSAoX2RvY3VtZW50ID0gZG9jdW1lbnQpID09PSBudWxsIHx8IF9kb2N1bWVudCA9PT0gdm9pZCAwIHx8IChfZG9jdW1lbnQkZ2V0U2VsZWN0aW8yID0gX2RvY3VtZW50LmdldFNlbGVjdGlvbikgPT09IG51bGwgfHwgX2RvY3VtZW50JGdldFNlbGVjdGlvMiA9PT0gdm9pZCAwIHx8IChfZG9jdW1lbnQkZ2V0U2VsZWN0aW8yID0gX2RvY3VtZW50JGdldFNlbGVjdGlvMi5jYWxsKF9kb2N1bWVudCkpID09PSBudWxsIHx8IF9kb2N1bWVudCRnZXRTZWxlY3RpbzIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kb2N1bWVudCRnZXRTZWxlY3RpbzIudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX2RvY3VtZW50JGdldFNlbGVjdGlvICE9PSB2b2lkIDAgPyBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8gOiBcIlwiO1xuXHR9XG5cdGZ1bmN0aW9uIGlzQWxsb3dlZChzdGF0dXMpIHtcblx0XHRyZXR1cm4gc3RhdHVzID09PSBcImdyYW50ZWRcIiB8fCBzdGF0dXMgPT09IFwicHJvbXB0XCI7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHR0ZXh0OiByZWFkb25seSh0ZXh0KSxcblx0XHRjb3BpZWQ6IHJlYWRvbmx5KGNvcGllZCksXG5cdFx0Y29weVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDbGlwYm9hcmRJdGVtcy9pbmRleC50c1xuZnVuY3Rpb24gdXNlQ2xpcGJvYXJkSXRlbXMob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIHJlYWQgPSBmYWxzZSwgc291cmNlLCBjb3BpZWREdXJpbmcgPSAxNTAwIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJjbGlwYm9hcmRcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IGNvbnRlbnQgPSByZWYoW10pO1xuXHRjb25zdCBjb3BpZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgdGltZW91dCA9IHVzZVRpbWVvdXRGbigoKSA9PiBjb3BpZWQudmFsdWUgPSBmYWxzZSwgY29waWVkRHVyaW5nLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdGZ1bmN0aW9uIHVwZGF0ZUNvbnRlbnQoKSB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBuYXZpZ2F0b3IkMS5jbGlwYm9hcmQucmVhZCgpLnRoZW4oKGl0ZW1zKSA9PiB7XG5cdFx0XHRjb250ZW50LnZhbHVlID0gaXRlbXM7XG5cdFx0fSk7XG5cdH1cblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHJlYWQpIHVzZUV2ZW50TGlzdGVuZXIoW1wiY29weVwiLCBcImN1dFwiXSwgdXBkYXRlQ29udGVudCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRhc3luYyBmdW5jdGlvbiBjb3B5KHZhbHVlID0gdG9WYWx1ZShzb3VyY2UpKSB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHZhbHVlICE9IG51bGwpIHtcblx0XHRcdGF3YWl0IG5hdmlnYXRvciQxLmNsaXBib2FyZC53cml0ZSh2YWx1ZSk7XG5cdFx0XHRjb250ZW50LnZhbHVlID0gdmFsdWU7XG5cdFx0XHRjb3BpZWQudmFsdWUgPSB0cnVlO1xuXHRcdFx0dGltZW91dC5zdGFydCgpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGNvbnRlbnQ6IHNoYWxsb3dSZWFkb25seShjb250ZW50KSxcblx0XHRjb3BpZWQ6IHJlYWRvbmx5KGNvcGllZCksXG5cdFx0Y29weSxcblx0XHRyZWFkOiB1cGRhdGVDb250ZW50XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNsb25lZC9pbmRleC50c1xuZnVuY3Rpb24gY2xvbmVGbkpTT04oc291cmNlKSB7XG5cdHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNvdXJjZSkpO1xufVxuZnVuY3Rpb24gdXNlQ2xvbmVkKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGNsb25lZCA9IHJlZih7fSk7XG5cdGNvbnN0IGlzTW9kaWZpZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IF9sYXN0U3luYyA9IGZhbHNlO1xuXHRjb25zdCB7IG1hbnVhbCwgY2xvbmUgPSBjbG9uZUZuSlNPTiwgZGVlcCA9IHRydWUsIGltbWVkaWF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdHdhdGNoKGNsb25lZCwgKCkgPT4ge1xuXHRcdGlmIChfbGFzdFN5bmMpIHtcblx0XHRcdF9sYXN0U3luYyA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpc01vZGlmaWVkLnZhbHVlID0gdHJ1ZTtcblx0fSwge1xuXHRcdGRlZXA6IHRydWUsXG5cdFx0Zmx1c2g6IFwic3luY1wiXG5cdH0pO1xuXHRmdW5jdGlvbiBzeW5jKCkge1xuXHRcdF9sYXN0U3luYyA9IHRydWU7XG5cdFx0aXNNb2RpZmllZC52YWx1ZSA9IGZhbHNlO1xuXHRcdGNsb25lZC52YWx1ZSA9IGNsb25lKHRvVmFsdWUoc291cmNlKSk7XG5cdH1cblx0aWYgKCFtYW51YWwgJiYgKGlzUmVmKHNvdXJjZSkgfHwgdHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiKSkgd2F0Y2goc291cmNlLCBzeW5jLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRkZWVwLFxuXHRcdGltbWVkaWF0ZVxuXHR9KTtcblx0ZWxzZSBzeW5jKCk7XG5cdHJldHVybiB7XG5cdFx0Y2xvbmVkLFxuXHRcdGlzTW9kaWZpZWQsXG5cdFx0c3luY1xuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzc3ItaGFuZGxlcnMudHNcbmNvbnN0IF9nbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHt9O1xuY29uc3QgZ2xvYmFsS2V5ID0gXCJfX3Z1ZXVzZV9zc3JfaGFuZGxlcnNfX1wiO1xuY29uc3QgaGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gZ2V0SGFuZGxlcnMoKTtcbmZ1bmN0aW9uIGdldEhhbmRsZXJzKCkge1xuXHRpZiAoIShnbG9iYWxLZXkgaW4gX2dsb2JhbCkpIF9nbG9iYWxbZ2xvYmFsS2V5XSA9IF9nbG9iYWxbZ2xvYmFsS2V5XSB8fCB7fTtcblx0cmV0dXJuIF9nbG9iYWxbZ2xvYmFsS2V5XTtcbn1cbmZ1bmN0aW9uIGdldFNTUkhhbmRsZXIoa2V5LCBmYWxsYmFjaykge1xuXHRyZXR1cm4gaGFuZGxlcnNba2V5XSB8fCBmYWxsYmFjaztcbn1cbmZ1bmN0aW9uIHNldFNTUkhhbmRsZXIoa2V5LCBmbikge1xuXHRoYW5kbGVyc1trZXldID0gZm47XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZERhcmsvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBkYXJrIHRoZW1lIHByZWZlcmVuY2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZERhcmtcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZERhcmsob3B0aW9ucykge1xuXHRyZXR1cm4gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylcIiwgb3B0aW9ucyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN0b3JhZ2UvZ3Vlc3MudHNcbmZ1bmN0aW9uIGd1ZXNzU2VyaWFsaXplclR5cGUocmF3SW5pdCkge1xuXHRyZXR1cm4gcmF3SW5pdCA9PSBudWxsID8gXCJhbnlcIiA6IHJhd0luaXQgaW5zdGFuY2VvZiBTZXQgPyBcInNldFwiIDogcmF3SW5pdCBpbnN0YW5jZW9mIE1hcCA/IFwibWFwXCIgOiByYXdJbml0IGluc3RhbmNlb2YgRGF0ZSA/IFwiZGF0ZVwiIDogdHlwZW9mIHJhd0luaXQgPT09IFwiYm9vbGVhblwiID8gXCJib29sZWFuXCIgOiB0eXBlb2YgcmF3SW5pdCA9PT0gXCJzdHJpbmdcIiA/IFwic3RyaW5nXCIgOiB0eXBlb2YgcmF3SW5pdCA9PT0gXCJvYmplY3RcIiA/IFwib2JqZWN0XCIgOiAhTnVtYmVyLmlzTmFOKHJhd0luaXQpID8gXCJudW1iZXJcIiA6IFwiYW55XCI7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN0b3JhZ2UvaW5kZXgudHNcbmNvbnN0IFN0b3JhZ2VTZXJpYWxpemVycyA9IHtcblx0Ym9vbGVhbjoge1xuXHRcdHJlYWQ6ICh2KSA9PiB2ID09PSBcInRydWVcIixcblx0XHR3cml0ZTogKHYpID0+IFN0cmluZyh2KVxuXHR9LFxuXHRvYmplY3Q6IHtcblx0XHRyZWFkOiAodikgPT4gSlNPTi5wYXJzZSh2KSxcblx0XHR3cml0ZTogKHYpID0+IEpTT04uc3RyaW5naWZ5KHYpXG5cdH0sXG5cdG51bWJlcjoge1xuXHRcdHJlYWQ6ICh2KSA9PiBOdW1iZXIucGFyc2VGbG9hdCh2KSxcblx0XHR3cml0ZTogKHYpID0+IFN0cmluZyh2KVxuXHR9LFxuXHRhbnk6IHtcblx0XHRyZWFkOiAodikgPT4gdixcblx0XHR3cml0ZTogKHYpID0+IFN0cmluZyh2KVxuXHR9LFxuXHRzdHJpbmc6IHtcblx0XHRyZWFkOiAodikgPT4gdixcblx0XHR3cml0ZTogKHYpID0+IFN0cmluZyh2KVxuXHR9LFxuXHRtYXA6IHtcblx0XHRyZWFkOiAodikgPT4gbmV3IE1hcChKU09OLnBhcnNlKHYpKSxcblx0XHR3cml0ZTogKHYpID0+IEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odi5lbnRyaWVzKCkpKVxuXHR9LFxuXHRzZXQ6IHtcblx0XHRyZWFkOiAodikgPT4gbmV3IFNldChKU09OLnBhcnNlKHYpKSxcblx0XHR3cml0ZTogKHYpID0+IEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odikpXG5cdH0sXG5cdGRhdGU6IHtcblx0XHRyZWFkOiAodikgPT4gbmV3IERhdGUodiksXG5cdFx0d3JpdGU6ICh2KSA9PiB2LnRvSVNPU3RyaW5nKClcblx0fVxufTtcbmNvbnN0IGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUgPSBcInZ1ZXVzZS1zdG9yYWdlXCI7XG4vKipcbiogUmVhY3RpdmUgTG9jYWxTdG9yYWdlL1Nlc3Npb25TdG9yYWdlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTdG9yYWdlXG4qL1xuZnVuY3Rpb24gdXNlU3RvcmFnZShrZXksIGRlZmF1bHRzJDEsIHN0b3JhZ2UsIG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkc2VyaWFsaXplcjtcblx0Y29uc3QgeyBmbHVzaCA9IFwicHJlXCIsIGRlZXAgPSB0cnVlLCBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzID0gdHJ1ZSwgd3JpdGVEZWZhdWx0cyA9IHRydWUsIG1lcmdlRGVmYXVsdHMgPSBmYWxzZSwgc2hhbGxvdywgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGV2ZW50RmlsdGVyLCBvbkVycm9yID0gKGUpID0+IHtcblx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHR9LCBpbml0T25Nb3VudGVkIH0gPSBvcHRpb25zO1xuXHRjb25zdCBkYXRhID0gKHNoYWxsb3cgPyBzaGFsbG93UmVmIDogcmVmKSh0eXBlb2YgZGVmYXVsdHMkMSA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdHMkMSgpIDogZGVmYXVsdHMkMSk7XG5cdGNvbnN0IGtleUNvbXB1dGVkID0gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShrZXkpKTtcblx0aWYgKCFzdG9yYWdlKSB0cnkge1xuXHRcdHN0b3JhZ2UgPSBnZXRTU1JIYW5kbGVyKFwiZ2V0RGVmYXVsdFN0b3JhZ2VcIiwgKCkgPT4gZGVmYXVsdFdpbmRvdyA9PT0gbnVsbCB8fCBkZWZhdWx0V2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWZhdWx0V2luZG93LmxvY2FsU3RvcmFnZSkoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdG9uRXJyb3IoZSk7XG5cdH1cblx0aWYgKCFzdG9yYWdlKSByZXR1cm4gZGF0YTtcblx0Y29uc3QgcmF3SW5pdCA9IHRvVmFsdWUoZGVmYXVsdHMkMSk7XG5cdGNvbnN0IHR5cGUgPSBndWVzc1NlcmlhbGl6ZXJUeXBlKHJhd0luaXQpO1xuXHRjb25zdCBzZXJpYWxpemVyID0gKF9vcHRpb25zJHNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXIpICE9PSBudWxsICYmIF9vcHRpb25zJHNlcmlhbGl6ZXIgIT09IHZvaWQgMCA/IF9vcHRpb25zJHNlcmlhbGl6ZXIgOiBTdG9yYWdlU2VyaWFsaXplcnNbdHlwZV07XG5cdGNvbnN0IHsgcGF1c2U6IHBhdXNlV2F0Y2gsIHJlc3VtZTogcmVzdW1lV2F0Y2ggfSA9IHdhdGNoUGF1c2FibGUoZGF0YSwgKG5ld1ZhbHVlKSA9PiB3cml0ZShuZXdWYWx1ZSksIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGV2ZW50RmlsdGVyXG5cdH0pO1xuXHR3YXRjaChrZXlDb21wdXRlZCwgKCkgPT4gdXBkYXRlKCksIHsgZmx1c2ggfSk7XG5cdGxldCBmaXJzdE1vdW50ZWQgPSBmYWxzZTtcblx0Y29uc3Qgb25TdG9yYWdlRXZlbnQgPSAoZXYpID0+IHtcblx0XHRpZiAoaW5pdE9uTW91bnRlZCAmJiAhZmlyc3RNb3VudGVkKSByZXR1cm47XG5cdFx0dXBkYXRlKGV2KTtcblx0fTtcblx0Y29uc3Qgb25TdG9yYWdlQ3VzdG9tRXZlbnQgPSAoZXYpID0+IHtcblx0XHRpZiAoaW5pdE9uTW91bnRlZCAmJiAhZmlyc3RNb3VudGVkKSByZXR1cm47XG5cdFx0dXBkYXRlRnJvbUN1c3RvbUV2ZW50KGV2KTtcblx0fTtcblx0LyoqXG5cdCogVGhlIGN1c3RvbSBldmVudCBpcyBuZWVkZWQgZm9yIHNhbWUtZG9jdW1lbnQgc3luY2luZyB3aGVuIHVzaW5nIGN1c3RvbVxuXHQqIHN0b3JhZ2UgYmFja2VuZHMsIGJ1dCBpdCBkb2Vzbid0IHdvcmsgYWNyb3NzIGRpZmZlcmVudCBkb2N1bWVudHMuXG5cdCpcblx0KiBUT0RPOiBDb25zaWRlciBpbXBsZW1lbnRpbmcgYSBCcm9hZGNhc3RDaGFubmVsLWJhc2VkIHNvbHV0aW9uIHRoYXQgZml4ZXMgdGhpcy5cblx0Ki9cblx0aWYgKHdpbmRvdyQxICYmIGxpc3RlblRvU3RvcmFnZUNoYW5nZXMpIGlmIChzdG9yYWdlIGluc3RhbmNlb2YgU3RvcmFnZSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJzdG9yYWdlXCIsIG9uU3RvcmFnZUV2ZW50LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdGVsc2UgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgY3VzdG9tU3RvcmFnZUV2ZW50TmFtZSwgb25TdG9yYWdlQ3VzdG9tRXZlbnQpO1xuXHRpZiAoaW5pdE9uTW91bnRlZCkgdHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHRmaXJzdE1vdW50ZWQgPSB0cnVlO1xuXHRcdHVwZGF0ZSgpO1xuXHR9KTtcblx0ZWxzZSB1cGRhdGUoKTtcblx0ZnVuY3Rpb24gZGlzcGF0Y2hXcml0ZUV2ZW50KG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuXHRcdGlmICh3aW5kb3ckMSkge1xuXHRcdFx0Y29uc3QgcGF5bG9hZCA9IHtcblx0XHRcdFx0a2V5OiBrZXlDb21wdXRlZC52YWx1ZSxcblx0XHRcdFx0b2xkVmFsdWUsXG5cdFx0XHRcdG5ld1ZhbHVlLFxuXHRcdFx0XHRzdG9yYWdlQXJlYTogc3RvcmFnZVxuXHRcdFx0fTtcblx0XHRcdHdpbmRvdyQxLmRpc3BhdGNoRXZlbnQoc3RvcmFnZSBpbnN0YW5jZW9mIFN0b3JhZ2UgPyBuZXcgU3RvcmFnZUV2ZW50KFwic3RvcmFnZVwiLCBwYXlsb2FkKSA6IG5ldyBDdXN0b21FdmVudChjdXN0b21TdG9yYWdlRXZlbnROYW1lLCB7IGRldGFpbDogcGF5bG9hZCB9KSk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHdyaXRlKHYpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb2xkVmFsdWUgPSBzdG9yYWdlLmdldEl0ZW0oa2V5Q29tcHV0ZWQudmFsdWUpO1xuXHRcdFx0aWYgKHYgPT0gbnVsbCkge1xuXHRcdFx0XHRkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIG51bGwpO1xuXHRcdFx0XHRzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5Q29tcHV0ZWQudmFsdWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc2VyaWFsaXplZCA9IHNlcmlhbGl6ZXIud3JpdGUodik7XG5cdFx0XHRcdGlmIChvbGRWYWx1ZSAhPT0gc2VyaWFsaXplZCkge1xuXHRcdFx0XHRcdHN0b3JhZ2Uuc2V0SXRlbShrZXlDb21wdXRlZC52YWx1ZSwgc2VyaWFsaXplZCk7XG5cdFx0XHRcdFx0ZGlzcGF0Y2hXcml0ZUV2ZW50KG9sZFZhbHVlLCBzZXJpYWxpemVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHJlYWQoZXZlbnQpIHtcblx0XHRjb25zdCByYXdWYWx1ZSA9IGV2ZW50ID8gZXZlbnQubmV3VmFsdWUgOiBzdG9yYWdlLmdldEl0ZW0oa2V5Q29tcHV0ZWQudmFsdWUpO1xuXHRcdGlmIChyYXdWYWx1ZSA9PSBudWxsKSB7XG5cdFx0XHRpZiAod3JpdGVEZWZhdWx0cyAmJiByYXdJbml0ICE9IG51bGwpIHN0b3JhZ2Uuc2V0SXRlbShrZXlDb21wdXRlZC52YWx1ZSwgc2VyaWFsaXplci53cml0ZShyYXdJbml0KSk7XG5cdFx0XHRyZXR1cm4gcmF3SW5pdDtcblx0XHR9IGVsc2UgaWYgKCFldmVudCAmJiBtZXJnZURlZmF1bHRzKSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHNlcmlhbGl6ZXIucmVhZChyYXdWYWx1ZSk7XG5cdFx0XHRpZiAodHlwZW9mIG1lcmdlRGVmYXVsdHMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG1lcmdlRGVmYXVsdHModmFsdWUsIHJhd0luaXQpO1xuXHRcdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB7XG5cdFx0XHRcdC4uLnJhd0luaXQsXG5cdFx0XHRcdC4uLnZhbHVlXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHJhd1ZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gcmF3VmFsdWU7XG5cdFx0ZWxzZSByZXR1cm4gc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGUoZXZlbnQpIHtcblx0XHRpZiAoZXZlbnQgJiYgZXZlbnQuc3RvcmFnZUFyZWEgIT09IHN0b3JhZ2UpIHJldHVybjtcblx0XHRpZiAoZXZlbnQgJiYgZXZlbnQua2V5ID09IG51bGwpIHtcblx0XHRcdGRhdGEudmFsdWUgPSByYXdJbml0O1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZXZlbnQgJiYgZXZlbnQua2V5ICE9PSBrZXlDb21wdXRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdHBhdXNlV2F0Y2goKTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc2VyaWFsaXplZERhdGEgPSBzZXJpYWxpemVyLndyaXRlKGRhdGEudmFsdWUpO1xuXHRcdFx0aWYgKGV2ZW50ID09PSB2b2lkIDAgfHwgKGV2ZW50ID09PSBudWxsIHx8IGV2ZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBldmVudC5uZXdWYWx1ZSkgIT09IHNlcmlhbGl6ZWREYXRhKSBkYXRhLnZhbHVlID0gcmVhZChldmVudCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKGV2ZW50KSBuZXh0VGljayhyZXN1bWVXYXRjaCk7XG5cdFx0XHRlbHNlIHJlc3VtZVdhdGNoKCk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZUZyb21DdXN0b21FdmVudChldmVudCkge1xuXHRcdHVwZGF0ZShldmVudC5kZXRhaWwpO1xuXHR9XG5cdHJldHVybiBkYXRhO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDb2xvck1vZGUvaW5kZXgudHNcbmNvbnN0IENTU19ESVNBQkxFX1RSQU5TID0gXCIqLCo6OmJlZm9yZSwqOjphZnRlcnstd2Via2l0LXRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7LW1vei10cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50Oy1vLXRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7LW1zLXRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7dHJhbnNpdGlvbjpub25lIWltcG9ydGFudH1cIjtcbi8qKlxuKiBSZWFjdGl2ZSBjb2xvciBtb2RlIHdpdGggYXV0byBkYXRhIHBlcnNpc3RlbmNlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDb2xvck1vZGVcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VDb2xvck1vZGUob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgc2VsZWN0b3IgPSBcImh0bWxcIiwgYXR0cmlidXRlID0gXCJjbGFzc1wiLCBpbml0aWFsVmFsdWUgPSBcImF1dG9cIiwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHN0b3JhZ2UsIHN0b3JhZ2VLZXkgPSBcInZ1ZXVzZS1jb2xvci1zY2hlbWVcIiwgbGlzdGVuVG9TdG9yYWdlQ2hhbmdlcyA9IHRydWUsIHN0b3JhZ2VSZWYsIGVtaXRBdXRvLCBkaXNhYmxlVHJhbnNpdGlvbiA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG1vZGVzID0ge1xuXHRcdGF1dG86IFwiXCIsXG5cdFx0bGlnaHQ6IFwibGlnaHRcIixcblx0XHRkYXJrOiBcImRhcmtcIixcblx0XHQuLi5vcHRpb25zLm1vZGVzIHx8IHt9XG5cdH07XG5cdGNvbnN0IHByZWZlcnJlZERhcmsgPSB1c2VQcmVmZXJyZWREYXJrKHsgd2luZG93OiB3aW5kb3ckMSB9KTtcblx0Y29uc3Qgc3lzdGVtID0gY29tcHV0ZWQoKCkgPT4gcHJlZmVycmVkRGFyay52YWx1ZSA/IFwiZGFya1wiIDogXCJsaWdodFwiKTtcblx0Y29uc3Qgc3RvcmUgPSBzdG9yYWdlUmVmIHx8IChzdG9yYWdlS2V5ID09IG51bGwgPyB0b1JlZihpbml0aWFsVmFsdWUpIDogdXNlU3RvcmFnZShzdG9yYWdlS2V5LCBpbml0aWFsVmFsdWUsIHN0b3JhZ2UsIHtcblx0XHR3aW5kb3c6IHdpbmRvdyQxLFxuXHRcdGxpc3RlblRvU3RvcmFnZUNoYW5nZXNcblx0fSkpO1xuXHRjb25zdCBzdGF0ZSA9IGNvbXB1dGVkKCgpID0+IHN0b3JlLnZhbHVlID09PSBcImF1dG9cIiA/IHN5c3RlbS52YWx1ZSA6IHN0b3JlLnZhbHVlKTtcblx0Y29uc3QgdXBkYXRlSFRNTEF0dHJzID0gZ2V0U1NSSGFuZGxlcihcInVwZGF0ZUhUTUxBdHRyc1wiLCAoc2VsZWN0b3IkMSwgYXR0cmlidXRlJDEsIHZhbHVlKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0eXBlb2Ygc2VsZWN0b3IkMSA9PT0gXCJzdHJpbmdcIiA/IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yJDEpIDogdW5yZWZFbGVtZW50KHNlbGVjdG9yJDEpO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRjb25zdCBjbGFzc2VzVG9BZGQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdGNvbnN0IGNsYXNzZXNUb1JlbW92ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdFx0bGV0IGF0dHJpYnV0ZVRvQ2hhbmdlID0gbnVsbDtcblx0XHRpZiAoYXR0cmlidXRlJDEgPT09IFwiY2xhc3NcIikge1xuXHRcdFx0Y29uc3QgY3VycmVudCA9IHZhbHVlLnNwbGl0KC9cXHMvZyk7XG5cdFx0XHRPYmplY3QudmFsdWVzKG1vZGVzKS5mbGF0TWFwKChpKSA9PiAoaSB8fCBcIlwiKS5zcGxpdCgvXFxzL2cpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaCgodikgPT4ge1xuXHRcdFx0XHRpZiAoY3VycmVudC5pbmNsdWRlcyh2KSkgY2xhc3Nlc1RvQWRkLmFkZCh2KTtcblx0XHRcdFx0ZWxzZSBjbGFzc2VzVG9SZW1vdmUuYWRkKHYpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGF0dHJpYnV0ZVRvQ2hhbmdlID0ge1xuXHRcdFx0a2V5OiBhdHRyaWJ1dGUkMSxcblx0XHRcdHZhbHVlXG5cdFx0fTtcblx0XHRpZiAoY2xhc3Nlc1RvQWRkLnNpemUgPT09IDAgJiYgY2xhc3Nlc1RvUmVtb3ZlLnNpemUgPT09IDAgJiYgYXR0cmlidXRlVG9DaGFuZ2UgPT09IG51bGwpIHJldHVybjtcblx0XHRsZXQgc3R5bGU7XG5cdFx0aWYgKGRpc2FibGVUcmFuc2l0aW9uKSB7XG5cdFx0XHRzdHlsZSA9IHdpbmRvdyQxLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblx0XHRcdHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKENTU19ESVNBQkxFX1RSQU5TKSk7XG5cdFx0XHR3aW5kb3ckMS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBjIG9mIGNsYXNzZXNUb0FkZCkgZWwuY2xhc3NMaXN0LmFkZChjKTtcblx0XHRmb3IgKGNvbnN0IGMgb2YgY2xhc3Nlc1RvUmVtb3ZlKSBlbC5jbGFzc0xpc3QucmVtb3ZlKGMpO1xuXHRcdGlmIChhdHRyaWJ1dGVUb0NoYW5nZSkgZWwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZVRvQ2hhbmdlLmtleSwgYXR0cmlidXRlVG9DaGFuZ2UudmFsdWUpO1xuXHRcdGlmIChkaXNhYmxlVHJhbnNpdGlvbikge1xuXHRcdFx0d2luZG93JDEuZ2V0Q29tcHV0ZWRTdHlsZShzdHlsZSkub3BhY2l0eTtcblx0XHRcdGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc3R5bGUpO1xuXHRcdH1cblx0fSk7XG5cdGZ1bmN0aW9uIGRlZmF1bHRPbkNoYW5nZWQobW9kZSkge1xuXHRcdHZhciBfbW9kZXMkbW9kZTtcblx0XHR1cGRhdGVIVE1MQXR0cnMoc2VsZWN0b3IsIGF0dHJpYnV0ZSwgKF9tb2RlcyRtb2RlID0gbW9kZXNbbW9kZV0pICE9PSBudWxsICYmIF9tb2RlcyRtb2RlICE9PSB2b2lkIDAgPyBfbW9kZXMkbW9kZSA6IG1vZGUpO1xuXHR9XG5cdGZ1bmN0aW9uIG9uQ2hhbmdlZChtb2RlKSB7XG5cdFx0aWYgKG9wdGlvbnMub25DaGFuZ2VkKSBvcHRpb25zLm9uQ2hhbmdlZChtb2RlLCBkZWZhdWx0T25DaGFuZ2VkKTtcblx0XHRlbHNlIGRlZmF1bHRPbkNoYW5nZWQobW9kZSk7XG5cdH1cblx0d2F0Y2goc3RhdGUsIG9uQ2hhbmdlZCwge1xuXHRcdGZsdXNoOiBcInBvc3RcIixcblx0XHRpbW1lZGlhdGU6IHRydWVcblx0fSk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiBvbkNoYW5nZWQoc3RhdGUudmFsdWUpKTtcblx0Y29uc3QgYXV0byA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZW1pdEF1dG8gPyBzdG9yZS52YWx1ZSA6IHN0YXRlLnZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KHYpIHtcblx0XHRcdHN0b3JlLnZhbHVlID0gdjtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbihhdXRvLCB7XG5cdFx0c3RvcmUsXG5cdFx0c3lzdGVtLFxuXHRcdHN0YXRlXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDb25maXJtRGlhbG9nL2luZGV4LnRzXG4vKipcbiogSG9va3MgZm9yIGNyZWF0aW5nIGNvbmZpcm0gZGlhbG9ncy4gVXNlZnVsIGZvciBtb2RhbCB3aW5kb3dzLCBwb3B1cHMgYW5kIGxvZ2lucy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQ29uZmlybURpYWxvZy9cbiogQHBhcmFtIHJldmVhbGVkIGBib29sZWFuYCBgcmVmYCB0aGF0IGhhbmRsZXMgYSBtb2RhbCB3aW5kb3dcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VDb25maXJtRGlhbG9nKHJldmVhbGVkID0gc2hhbGxvd1JlZihmYWxzZSkpIHtcblx0Y29uc3QgY29uZmlybUhvb2sgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgY2FuY2VsSG9vayA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCByZXZlYWxIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGxldCBfcmVzb2x2ZSA9IG5vb3A7XG5cdGNvbnN0IHJldmVhbCA9IChkYXRhKSA9PiB7XG5cdFx0cmV2ZWFsSG9vay50cmlnZ2VyKGRhdGEpO1xuXHRcdHJldmVhbGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdF9yZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgY29uZmlybSA9IChkYXRhKSA9PiB7XG5cdFx0cmV2ZWFsZWQudmFsdWUgPSBmYWxzZTtcblx0XHRjb25maXJtSG9vay50cmlnZ2VyKGRhdGEpO1xuXHRcdF9yZXNvbHZlKHtcblx0XHRcdGRhdGEsXG5cdFx0XHRpc0NhbmNlbGVkOiBmYWxzZVxuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBjYW5jZWwgPSAoZGF0YSkgPT4ge1xuXHRcdHJldmVhbGVkLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2FuY2VsSG9vay50cmlnZ2VyKGRhdGEpO1xuXHRcdF9yZXNvbHZlKHtcblx0XHRcdGRhdGEsXG5cdFx0XHRpc0NhbmNlbGVkOiB0cnVlXG5cdFx0fSk7XG5cdH07XG5cdHJldHVybiB7XG5cdFx0aXNSZXZlYWxlZDogY29tcHV0ZWQoKCkgPT4gcmV2ZWFsZWQudmFsdWUpLFxuXHRcdHJldmVhbCxcblx0XHRjb25maXJtLFxuXHRcdGNhbmNlbCxcblx0XHRvblJldmVhbDogcmV2ZWFsSG9vay5vbixcblx0XHRvbkNvbmZpcm06IGNvbmZpcm1Ib29rLm9uLFxuXHRcdG9uQ2FuY2VsOiBjYW5jZWxIb29rLm9uXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvdW50ZG93bi9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ4KG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSAxZTMsIGltbWVkaWF0ZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIGludGVydmFsLCB7IGltbWVkaWF0ZSB9KTtcblx0fVxuXHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCAxZTMsIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBjb3VudGRvd24gdGltZXIgaW4gc2Vjb25kcy5cbipcbiogQHBhcmFtIGluaXRpYWxDb3VudGRvd25cbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQ291bnRkb3duXG4qL1xuZnVuY3Rpb24gdXNlQ291bnRkb3duKGluaXRpYWxDb3VudGRvd24sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCByZW1haW5pbmcgPSBzaGFsbG93UmVmKHRvVmFsdWUoaW5pdGlhbENvdW50ZG93bikpO1xuXHRjb25zdCB7IHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkOChvcHRpb25zKSwgb25UaWNrLCBvbkNvbXBsZXRlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjb250cm9scyA9IHNjaGVkdWxlcigoKSA9PiB7XG5cdFx0Y29uc3QgdmFsdWUgPSByZW1haW5pbmcudmFsdWUgLSAxO1xuXHRcdHJlbWFpbmluZy52YWx1ZSA9IHZhbHVlIDwgMCA/IDAgOiB2YWx1ZTtcblx0XHRvblRpY2sgPT09IG51bGwgfHwgb25UaWNrID09PSB2b2lkIDAgfHwgb25UaWNrKCk7XG5cdFx0aWYgKHJlbWFpbmluZy52YWx1ZSA8PSAwKSB7XG5cdFx0XHRjb250cm9scy5wYXVzZSgpO1xuXHRcdFx0b25Db21wbGV0ZSA9PT0gbnVsbCB8fCBvbkNvbXBsZXRlID09PSB2b2lkIDAgfHwgb25Db21wbGV0ZSgpO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHJlc2V0ID0gKGNvdW50ZG93bikgPT4ge1xuXHRcdHZhciBfdG9WYWx1ZTtcblx0XHRyZW1haW5pbmcudmFsdWUgPSAoX3RvVmFsdWUgPSB0b1ZhbHVlKGNvdW50ZG93bikpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHRvVmFsdWUoaW5pdGlhbENvdW50ZG93bik7XG5cdH07XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0Y29udHJvbHMucGF1c2UoKTtcblx0XHRyZXNldCgpO1xuXHR9O1xuXHRjb25zdCByZXN1bWUgPSAoKSA9PiB7XG5cdFx0aWYgKCFjb250cm9scy5pc0FjdGl2ZS52YWx1ZSkge1xuXHRcdFx0aWYgKHJlbWFpbmluZy52YWx1ZSA+IDApIGNvbnRyb2xzLnJlc3VtZSgpO1xuXHRcdH1cblx0fTtcblx0Y29uc3Qgc3RhcnQgPSAoY291bnRkb3duKSA9PiB7XG5cdFx0cmVzZXQoY291bnRkb3duKTtcblx0XHRjb250cm9scy5yZXN1bWUoKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRyZW1haW5pbmcsXG5cdFx0cmVzZXQsXG5cdFx0c3RvcCxcblx0XHRzdGFydCxcblx0XHRwYXVzZTogY29udHJvbHMucGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGlzQWN0aXZlOiBjb250cm9scy5pc0FjdGl2ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDc3NTdXBwb3J0cy9pbmRleC50c1xuZnVuY3Rpb24gdXNlQ3NzU3VwcG9ydHMoLi4uYXJncykge1xuXHRsZXQgb3B0aW9ucyA9IHt9O1xuXHRpZiAodHlwZW9mIHRvVmFsdWUoYXJncy5hdCgtMSkpID09PSBcIm9iamVjdFwiKSBvcHRpb25zID0gYXJncy5wb3AoKTtcblx0Y29uc3QgW3Byb3AsIHZhbHVlXSA9IGFyZ3M7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHNzclZhbHVlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzTW91bnRlZCA9IHVzZU1vdW50ZWQoKTtcblx0cmV0dXJuIHsgaXNTdXBwb3J0ZWQ6IGNvbXB1dGVkKCgpID0+IHtcblx0XHRpc01vdW50ZWQudmFsdWU7XG5cdFx0aWYgKCFpc0NsaWVudCkgcmV0dXJuIHNzclZhbHVlO1xuXHRcdHJldHVybiBhcmdzLmxlbmd0aCA9PT0gMiA/IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5DU1Muc3VwcG9ydHModG9WYWx1ZShwcm9wKSwgdG9WYWx1ZSh2YWx1ZSkpIDogd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLkNTUy5zdXBwb3J0cyh0b1ZhbHVlKHByb3ApKTtcblx0fSkgfTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ3NzVmFyL2luZGV4LnRzXG4vKipcbiogTWFuaXB1bGF0ZSBDU1MgdmFyaWFibGVzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDc3NWYXJcbiogQHBhcmFtIHByb3BcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUNzc1Zhcihwcm9wLCB0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpbml0aWFsVmFsdWUsIG9ic2VydmUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgdmFyaWFibGUgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IGVsUmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfd2luZG93JGRvY3VtZW50O1xuXHRcdHJldHVybiB1bnJlZkVsZW1lbnQodGFyZ2V0KSB8fCAod2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCB8fCAoX3dpbmRvdyRkb2N1bWVudCA9IHdpbmRvdyQxLmRvY3VtZW50KSA9PT0gbnVsbCB8fCBfd2luZG93JGRvY3VtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfd2luZG93JGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG5cdH0pO1xuXHRmdW5jdGlvbiB1cGRhdGVDc3NWYXIoKSB7XG5cdFx0Y29uc3Qga2V5ID0gdG9WYWx1ZShwcm9wKTtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUoZWxSZWYpO1xuXHRcdGlmIChlbCAmJiB3aW5kb3ckMSAmJiBrZXkpIHtcblx0XHRcdHZhciBfd2luZG93JGdldENvbXB1dGVkU3Q7XG5cdFx0XHR2YXJpYWJsZS52YWx1ZSA9ICgoX3dpbmRvdyRnZXRDb21wdXRlZFN0ID0gd2luZG93JDEuZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZ2V0UHJvcGVydHlWYWx1ZShrZXkpKSA9PT0gbnVsbCB8fCBfd2luZG93JGdldENvbXB1dGVkU3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckZ2V0Q29tcHV0ZWRTdC50cmltKCkpIHx8IHZhcmlhYmxlLnZhbHVlIHx8IGluaXRpYWxWYWx1ZTtcblx0XHR9XG5cdH1cblx0aWYgKG9ic2VydmUpIHVzZU11dGF0aW9uT2JzZXJ2ZXIoZWxSZWYsIHVwZGF0ZUNzc1Zhciwge1xuXHRcdGF0dHJpYnV0ZUZpbHRlcjogW1wic3R5bGVcIiwgXCJjbGFzc1wiXSxcblx0XHR3aW5kb3c6IHdpbmRvdyQxXG5cdH0pO1xuXHR3YXRjaChbZWxSZWYsICgpID0+IHRvVmFsdWUocHJvcCldLCAoXywgb2xkKSA9PiB7XG5cdFx0aWYgKG9sZFswXSAmJiBvbGRbMV0pIG9sZFswXS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShvbGRbMV0pO1xuXHRcdHVwZGF0ZUNzc1ZhcigpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0d2F0Y2goW3ZhcmlhYmxlLCBlbFJlZl0sIChbdmFsLCBlbF0pID0+IHtcblx0XHRjb25zdCByYXdfcHJvcCA9IHRvVmFsdWUocHJvcCk7XG5cdFx0aWYgKChlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc3R5bGUpICYmIHJhd19wcm9wKSBpZiAodmFsID09IG51bGwpIGVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KHJhd19wcm9wKTtcblx0XHRlbHNlIGVsLnN0eWxlLnNldFByb3BlcnR5KHJhd19wcm9wLCB2YWwpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHZhcmlhYmxlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDdXJyZW50RWxlbWVudC9pbmRleC50c1xuZnVuY3Rpb24gdXNlQ3VycmVudEVsZW1lbnQocm9vdENvbXBvbmVudCkge1xuXHRjb25zdCB2bSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuXHRjb25zdCBjdXJyZW50RWxlbWVudCA9IGNvbXB1dGVkV2l0aENvbnRyb2woKCkgPT4gbnVsbCwgKCkgPT4gcm9vdENvbXBvbmVudCA/IHVucmVmRWxlbWVudChyb290Q29tcG9uZW50KSA6IHZtLnByb3h5LiRlbCk7XG5cdG9uVXBkYXRlZChjdXJyZW50RWxlbWVudC50cmlnZ2VyKTtcblx0b25Nb3VudGVkKGN1cnJlbnRFbGVtZW50LnRyaWdnZXIpO1xuXHRyZXR1cm4gY3VycmVudEVsZW1lbnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUN5Y2xlTGlzdC9pbmRleC50c1xuLyoqXG4qIEN5Y2xlIHRocm91Z2ggYSBsaXN0IG9mIGl0ZW1zXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUN5Y2xlTGlzdFxuKi9cbmZ1bmN0aW9uIHVzZUN5Y2xlTGlzdChsaXN0LCBvcHRpb25zKSB7XG5cdGNvbnN0IHN0YXRlID0gc2hhbGxvd1JlZihnZXRJbml0aWFsVmFsdWUoKSk7XG5cdGNvbnN0IGxpc3RSZWYgPSB0b1JlZihsaXN0KTtcblx0Y29uc3QgaW5kZXggPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0dmFyIF9vcHRpb25zJGZhbGxiYWNrSW5kZTtcblx0XHRcdGNvbnN0IHRhcmdldExpc3QgPSBsaXN0UmVmLnZhbHVlO1xuXHRcdFx0bGV0IGluZGV4JDEgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmdldEluZGV4T2YpID8gb3B0aW9ucy5nZXRJbmRleE9mKHN0YXRlLnZhbHVlLCB0YXJnZXRMaXN0KSA6IHRhcmdldExpc3QuaW5kZXhPZihzdGF0ZS52YWx1ZSk7XG5cdFx0XHRpZiAoaW5kZXgkMSA8IDApIGluZGV4JDEgPSAoX29wdGlvbnMkZmFsbGJhY2tJbmRlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZhbGxiYWNrSW5kZXgpICE9PSBudWxsICYmIF9vcHRpb25zJGZhbGxiYWNrSW5kZSAhPT0gdm9pZCAwID8gX29wdGlvbnMkZmFsbGJhY2tJbmRlIDogMDtcblx0XHRcdHJldHVybiBpbmRleCQxO1xuXHRcdH0sXG5cdFx0c2V0KHYpIHtcblx0XHRcdHNldCh2KTtcblx0XHR9XG5cdH0pO1xuXHRmdW5jdGlvbiBzZXQoaSkge1xuXHRcdGNvbnN0IHRhcmdldExpc3QgPSBsaXN0UmVmLnZhbHVlO1xuXHRcdGNvbnN0IGxlbmd0aCA9IHRhcmdldExpc3QubGVuZ3RoO1xuXHRcdGNvbnN0IHZhbHVlID0gdGFyZ2V0TGlzdFsoaSAlIGxlbmd0aCArIGxlbmd0aCkgJSBsZW5ndGhdO1xuXHRcdHN0YXRlLnZhbHVlID0gdmFsdWU7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cdGZ1bmN0aW9uIHNoaWZ0KGRlbHRhID0gMSkge1xuXHRcdHJldHVybiBzZXQoaW5kZXgudmFsdWUgKyBkZWx0YSk7XG5cdH1cblx0ZnVuY3Rpb24gbmV4dChuID0gMSkge1xuXHRcdHJldHVybiBzaGlmdChuKTtcblx0fVxuXHRmdW5jdGlvbiBwcmV2KG4gPSAxKSB7XG5cdFx0cmV0dXJuIHNoaWZ0KC1uKTtcblx0fVxuXHRmdW5jdGlvbiBnZXRJbml0aWFsVmFsdWUoKSB7XG5cdFx0dmFyIF90b1ZhbHVlLCBfb3B0aW9ucyRpbml0aWFsVmFsdWU7XG5cdFx0cmV0dXJuIChfdG9WYWx1ZSA9IHRvVmFsdWUoKF9vcHRpb25zJGluaXRpYWxWYWx1ZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbml0aWFsVmFsdWUpICE9PSBudWxsICYmIF9vcHRpb25zJGluaXRpYWxWYWx1ZSAhPT0gdm9pZCAwID8gX29wdGlvbnMkaW5pdGlhbFZhbHVlIDogdG9WYWx1ZShsaXN0KVswXSkpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHZvaWQgMDtcblx0fVxuXHR3YXRjaChsaXN0UmVmLCAoKSA9PiBzZXQoaW5kZXgudmFsdWUpKTtcblx0cmV0dXJuIHtcblx0XHRzdGF0ZSxcblx0XHRpbmRleCxcblx0XHRuZXh0LFxuXHRcdHByZXYsXG5cdFx0Z286IHNldFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEYXJrL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgZGFyayBtb2RlIHdpdGggYXV0byBkYXRhIHBlcnNpc3RlbmNlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEYXJrXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRGFyayhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB2YWx1ZURhcmsgPSBcImRhcmtcIiwgdmFsdWVMaWdodCA9IFwiXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG1vZGUgPSB1c2VDb2xvck1vZGUoe1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0b25DaGFuZ2VkOiAobW9kZSQxLCBkZWZhdWx0SGFuZGxlcikgPT4ge1xuXHRcdFx0dmFyIF9vcHRpb25zJG9uQ2hhbmdlZDtcblx0XHRcdGlmIChvcHRpb25zLm9uQ2hhbmdlZCkgKF9vcHRpb25zJG9uQ2hhbmdlZCA9IG9wdGlvbnMub25DaGFuZ2VkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkNoYW5nZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvbkNoYW5nZWQuY2FsbChvcHRpb25zLCBtb2RlJDEgPT09IFwiZGFya1wiLCBkZWZhdWx0SGFuZGxlciwgbW9kZSQxKTtcblx0XHRcdGVsc2UgZGVmYXVsdEhhbmRsZXIobW9kZSQxKTtcblx0XHR9LFxuXHRcdG1vZGVzOiB7XG5cdFx0XHRkYXJrOiB2YWx1ZURhcmssXG5cdFx0XHRsaWdodDogdmFsdWVMaWdodFxuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHN5c3RlbSA9IGNvbXB1dGVkKCgpID0+IG1vZGUuc3lzdGVtLnZhbHVlKTtcblx0cmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gbW9kZS52YWx1ZSA9PT0gXCJkYXJrXCI7XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0Y29uc3QgbW9kZVZhbCA9IHYgPyBcImRhcmtcIiA6IFwibGlnaHRcIjtcblx0XHRcdGlmIChzeXN0ZW0udmFsdWUgPT09IG1vZGVWYWwpIG1vZGUudmFsdWUgPSBcImF1dG9cIjtcblx0XHRcdGVsc2UgbW9kZS52YWx1ZSA9IG1vZGVWYWw7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTWFudWFsUmVmSGlzdG9yeS9pbmRleC50c1xuZnVuY3Rpb24gZm5CeXBhc3Modikge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIGZuU2V0U291cmNlKHNvdXJjZSwgdmFsdWUpIHtcblx0cmV0dXJuIHNvdXJjZS52YWx1ZSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gZGVmYXVsdER1bXAoY2xvbmUpIHtcblx0cmV0dXJuIGNsb25lID8gdHlwZW9mIGNsb25lID09PSBcImZ1bmN0aW9uXCIgPyBjbG9uZSA6IGNsb25lRm5KU09OIDogZm5CeXBhc3M7XG59XG5mdW5jdGlvbiBkZWZhdWx0UGFyc2UoY2xvbmUpIHtcblx0cmV0dXJuIGNsb25lID8gdHlwZW9mIGNsb25lID09PSBcImZ1bmN0aW9uXCIgPyBjbG9uZSA6IGNsb25lRm5KU09OIDogZm5CeXBhc3M7XG59XG4vKipcbiogVHJhY2sgdGhlIGNoYW5nZSBoaXN0b3J5IG9mIGEgcmVmLCBhbHNvIHByb3ZpZGVzIHVuZG8gYW5kIHJlZG8gZnVuY3Rpb25hbGl0eS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWFudWFsUmVmSGlzdG9yeVxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTWFudWFsUmVmSGlzdG9yeShzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNsb25lID0gZmFsc2UsIGR1bXAgPSBkZWZhdWx0RHVtcChjbG9uZSksIHBhcnNlID0gZGVmYXVsdFBhcnNlKGNsb25lKSwgc2V0U291cmNlID0gZm5TZXRTb3VyY2UgfSA9IG9wdGlvbnM7XG5cdGZ1bmN0aW9uIF9jcmVhdGVIaXN0b3J5UmVjb3JkKCkge1xuXHRcdHJldHVybiBtYXJrUmF3KHtcblx0XHRcdHNuYXBzaG90OiBkdW1wKHNvdXJjZS52YWx1ZSksXG5cdFx0XHR0aW1lc3RhbXA6IHRpbWVzdGFtcCgpXG5cdFx0fSk7XG5cdH1cblx0Y29uc3QgbGFzdCA9IHJlZihfY3JlYXRlSGlzdG9yeVJlY29yZCgpKTtcblx0Y29uc3QgdW5kb1N0YWNrID0gcmVmKFtdKTtcblx0Y29uc3QgcmVkb1N0YWNrID0gcmVmKFtdKTtcblx0Y29uc3QgX3NldFNvdXJjZSA9IChyZWNvcmQpID0+IHtcblx0XHRzZXRTb3VyY2Uoc291cmNlLCBwYXJzZShyZWNvcmQuc25hcHNob3QpKTtcblx0XHRsYXN0LnZhbHVlID0gcmVjb3JkO1xuXHR9O1xuXHRjb25zdCBjb21taXQgPSAoKSA9PiB7XG5cdFx0dW5kb1N0YWNrLnZhbHVlLnVuc2hpZnQobGFzdC52YWx1ZSk7XG5cdFx0bGFzdC52YWx1ZSA9IF9jcmVhdGVIaXN0b3J5UmVjb3JkKCk7XG5cdFx0aWYgKG9wdGlvbnMuY2FwYWNpdHkgJiYgdW5kb1N0YWNrLnZhbHVlLmxlbmd0aCA+IG9wdGlvbnMuY2FwYWNpdHkpIHVuZG9TdGFjay52YWx1ZS5zcGxpY2Uob3B0aW9ucy5jYXBhY2l0eSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblx0XHRpZiAocmVkb1N0YWNrLnZhbHVlLmxlbmd0aCkgcmVkb1N0YWNrLnZhbHVlLnNwbGljZSgwLCByZWRvU3RhY2sudmFsdWUubGVuZ3RoKTtcblx0fTtcblx0Y29uc3QgY2xlYXIgPSAoKSA9PiB7XG5cdFx0dW5kb1N0YWNrLnZhbHVlLnNwbGljZSgwLCB1bmRvU3RhY2sudmFsdWUubGVuZ3RoKTtcblx0XHRyZWRvU3RhY2sudmFsdWUuc3BsaWNlKDAsIHJlZG9TdGFjay52YWx1ZS5sZW5ndGgpO1xuXHR9O1xuXHRjb25zdCB1bmRvID0gKCkgPT4ge1xuXHRcdGNvbnN0IHN0YXRlID0gdW5kb1N0YWNrLnZhbHVlLnNoaWZ0KCk7XG5cdFx0aWYgKHN0YXRlKSB7XG5cdFx0XHRyZWRvU3RhY2sudmFsdWUudW5zaGlmdChsYXN0LnZhbHVlKTtcblx0XHRcdF9zZXRTb3VyY2Uoc3RhdGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcmVkbyA9ICgpID0+IHtcblx0XHRjb25zdCBzdGF0ZSA9IHJlZG9TdGFjay52YWx1ZS5zaGlmdCgpO1xuXHRcdGlmIChzdGF0ZSkge1xuXHRcdFx0dW5kb1N0YWNrLnZhbHVlLnVuc2hpZnQobGFzdC52YWx1ZSk7XG5cdFx0XHRfc2V0U291cmNlKHN0YXRlKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdF9zZXRTb3VyY2UobGFzdC52YWx1ZSk7XG5cdH07XG5cdHJldHVybiB7XG5cdFx0c291cmNlLFxuXHRcdHVuZG9TdGFjayxcblx0XHRyZWRvU3RhY2ssXG5cdFx0bGFzdCxcblx0XHRoaXN0b3J5OiBjb21wdXRlZCgoKSA9PiBbbGFzdC52YWx1ZSwgLi4udW5kb1N0YWNrLnZhbHVlXSksXG5cdFx0Y2FuVW5kbzogY29tcHV0ZWQoKCkgPT4gdW5kb1N0YWNrLnZhbHVlLmxlbmd0aCA+IDApLFxuXHRcdGNhblJlZG86IGNvbXB1dGVkKCgpID0+IHJlZG9TdGFjay52YWx1ZS5sZW5ndGggPiAwKSxcblx0XHRjbGVhcixcblx0XHRjb21taXQsXG5cdFx0cmVzZXQsXG5cdFx0dW5kbyxcblx0XHRyZWRvXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVJlZkhpc3RvcnkvaW5kZXgudHNcbi8qKlxuKiBUcmFjayB0aGUgY2hhbmdlIGhpc3Rvcnkgb2YgYSByZWYsIGFsc28gcHJvdmlkZXMgdW5kbyBhbmQgcmVkbyBmdW5jdGlvbmFsaXR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VSZWZIaXN0b3J5XG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VSZWZIaXN0b3J5KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZGVlcCA9IGZhbHNlLCBmbHVzaCA9IFwicHJlXCIsIGV2ZW50RmlsdGVyLCBzaG91bGRDb21taXQgPSAoKSA9PiB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyOiBjb21wb3NlZEZpbHRlciwgcGF1c2UsIHJlc3VtZTogcmVzdW1lVHJhY2tpbmcsIGlzQWN0aXZlOiBpc1RyYWNraW5nIH0gPSBwYXVzYWJsZUZpbHRlcihldmVudEZpbHRlcik7XG5cdGxldCBsYXN0UmF3VmFsdWUgPSBzb3VyY2UudmFsdWU7XG5cdGNvbnN0IHsgaWdub3JlVXBkYXRlcywgaWdub3JlUHJldkFzeW5jVXBkYXRlcywgc3RvcCB9ID0gd2F0Y2hJZ25vcmFibGUoc291cmNlLCBjb21taXQsIHtcblx0XHRkZWVwLFxuXHRcdGZsdXNoLFxuXHRcdGV2ZW50RmlsdGVyOiBjb21wb3NlZEZpbHRlclxuXHR9KTtcblx0ZnVuY3Rpb24gc2V0U291cmNlKHNvdXJjZSQxLCB2YWx1ZSkge1xuXHRcdGlnbm9yZVByZXZBc3luY1VwZGF0ZXMoKTtcblx0XHRpZ25vcmVVcGRhdGVzKCgpID0+IHtcblx0XHRcdHNvdXJjZSQxLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRsYXN0UmF3VmFsdWUgPSB2YWx1ZTtcblx0XHR9KTtcblx0fVxuXHRjb25zdCBtYW51YWxIaXN0b3J5ID0gdXNlTWFudWFsUmVmSGlzdG9yeShzb3VyY2UsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGNsb25lOiBvcHRpb25zLmNsb25lIHx8IGRlZXAsXG5cdFx0c2V0U291cmNlXG5cdH0pO1xuXHRjb25zdCB7IGNsZWFyLCBjb21taXQ6IG1hbnVhbENvbW1pdCB9ID0gbWFudWFsSGlzdG9yeTtcblx0ZnVuY3Rpb24gY29tbWl0KCkge1xuXHRcdGlnbm9yZVByZXZBc3luY1VwZGF0ZXMoKTtcblx0XHRpZiAoIXNob3VsZENvbW1pdChsYXN0UmF3VmFsdWUsIHNvdXJjZS52YWx1ZSkpIHJldHVybjtcblx0XHRsYXN0UmF3VmFsdWUgPSBzb3VyY2UudmFsdWU7XG5cdFx0bWFudWFsQ29tbWl0KCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzdW1lKGNvbW1pdE5vdykge1xuXHRcdHJlc3VtZVRyYWNraW5nKCk7XG5cdFx0aWYgKGNvbW1pdE5vdykgY29tbWl0KCk7XG5cdH1cblx0ZnVuY3Rpb24gYmF0Y2goZm4pIHtcblx0XHRsZXQgY2FuY2VsZWQgPSBmYWxzZTtcblx0XHRjb25zdCBjYW5jZWwgPSAoKSA9PiBjYW5jZWxlZCA9IHRydWU7XG5cdFx0aWdub3JlVXBkYXRlcygoKSA9PiB7XG5cdFx0XHRmbihjYW5jZWwpO1xuXHRcdH0pO1xuXHRcdGlmICghY2FuY2VsZWQpIGNvbW1pdCgpO1xuXHR9XG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cdFx0c3RvcCgpO1xuXHRcdGNsZWFyKCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHQuLi5tYW51YWxIaXN0b3J5LFxuXHRcdGlzVHJhY2tpbmcsXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGNvbW1pdCxcblx0XHRiYXRjaCxcblx0XHRkaXNwb3NlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURlYm91bmNlZFJlZkhpc3RvcnkvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIFt1c2VSZWZIaXN0b3J5XShodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmVmSGlzdG9yeSkgd2l0aCBkZWJvdW5jZSBmaWx0ZXIuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURlYm91bmNlZFJlZkhpc3RvcnlcbiogQHBhcmFtIHNvdXJjZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZURlYm91bmNlZFJlZkhpc3Rvcnkoc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgZmlsdGVyID0gb3B0aW9ucy5kZWJvdW5jZSA/IGRlYm91bmNlRmlsdGVyKG9wdGlvbnMuZGVib3VuY2UpIDogdm9pZCAwO1xuXHRyZXR1cm4geyAuLi51c2VSZWZIaXN0b3J5KHNvdXJjZSwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0ZXZlbnRGaWx0ZXI6IGZpbHRlclxuXHR9KSB9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEZXZpY2VNb3Rpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBEZXZpY2VNb3Rpb25FdmVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGV2aWNlTW90aW9uXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRGV2aWNlTW90aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCByZXF1ZXN0UGVybWlzc2lvbnMgPSBmYWxzZSwgZXZlbnRGaWx0ZXIgPSBieXBhc3NGaWx0ZXIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB0eXBlb2YgRGV2aWNlTW90aW9uRXZlbnQgIT09IFwidW5kZWZpbmVkXCIpO1xuXHRjb25zdCByZXF1aXJlUGVybWlzc2lvbnMgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IGlzU3VwcG9ydGVkLnZhbHVlICYmIFwicmVxdWVzdFBlcm1pc3Npb25cIiBpbiBEZXZpY2VNb3Rpb25FdmVudCAmJiB0eXBlb2YgRGV2aWNlTW90aW9uRXZlbnQucmVxdWVzdFBlcm1pc3Npb24gPT09IFwiZnVuY3Rpb25cIik7XG5cdGNvbnN0IHBlcm1pc3Npb25HcmFudGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGFjY2VsZXJhdGlvbiA9IHJlZih7XG5cdFx0eDogbnVsbCxcblx0XHR5OiBudWxsLFxuXHRcdHo6IG51bGxcblx0fSk7XG5cdGNvbnN0IHJvdGF0aW9uUmF0ZSA9IHJlZih7XG5cdFx0YWxwaGE6IG51bGwsXG5cdFx0YmV0YTogbnVsbCxcblx0XHRnYW1tYTogbnVsbFxuXHR9KTtcblx0Y29uc3QgaW50ZXJ2YWwgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBhY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5ID0gcmVmKHtcblx0XHR4OiBudWxsLFxuXHRcdHk6IG51bGwsXG5cdFx0ejogbnVsbFxuXHR9KTtcblx0ZnVuY3Rpb24gaW5pdCgpIHtcblx0XHRpZiAod2luZG93JDEpIHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiZGV2aWNlbW90aW9uXCIsIGNyZWF0ZUZpbHRlcldyYXBwZXIoZXZlbnRGaWx0ZXIsIChldmVudCkgPT4ge1xuXHRcdFx0dmFyIF9ldmVudCRhY2NlbGVyYXRpb24sIF9ldmVudCRhY2NlbGVyYXRpb24yLCBfZXZlbnQkYWNjZWxlcmF0aW9uMywgX2V2ZW50JGFjY2VsZXJhdGlvbkluLCBfZXZlbnQkYWNjZWxlcmF0aW9uSW4yLCBfZXZlbnQkYWNjZWxlcmF0aW9uSW4zLCBfZXZlbnQkcm90YXRpb25SYXRlLCBfZXZlbnQkcm90YXRpb25SYXRlMiwgX2V2ZW50JHJvdGF0aW9uUmF0ZTM7XG5cdFx0XHRhY2NlbGVyYXRpb24udmFsdWUgPSB7XG5cdFx0XHRcdHg6ICgoX2V2ZW50JGFjY2VsZXJhdGlvbiA9IGV2ZW50LmFjY2VsZXJhdGlvbikgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbi54KSB8fCBudWxsLFxuXHRcdFx0XHR5OiAoKF9ldmVudCRhY2NlbGVyYXRpb24yID0gZXZlbnQuYWNjZWxlcmF0aW9uKSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbjIueSkgfHwgbnVsbCxcblx0XHRcdFx0ejogKChfZXZlbnQkYWNjZWxlcmF0aW9uMyA9IGV2ZW50LmFjY2VsZXJhdGlvbikgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRhY2NlbGVyYXRpb24zLnopIHx8IG51bGxcblx0XHRcdH07XG5cdFx0XHRhY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5LnZhbHVlID0ge1xuXHRcdFx0XHR4OiAoKF9ldmVudCRhY2NlbGVyYXRpb25JbiA9IGV2ZW50LmFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkpID09PSBudWxsIHx8IF9ldmVudCRhY2NlbGVyYXRpb25JbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbkluLngpIHx8IG51bGwsXG5cdFx0XHRcdHk6ICgoX2V2ZW50JGFjY2VsZXJhdGlvbkluMiA9IGV2ZW50LmFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkpID09PSBudWxsIHx8IF9ldmVudCRhY2NlbGVyYXRpb25JbjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRhY2NlbGVyYXRpb25JbjIueSkgfHwgbnVsbCxcblx0XHRcdFx0ejogKChfZXZlbnQkYWNjZWxlcmF0aW9uSW4zID0gZXZlbnQuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eSkgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbkluMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbkluMy56KSB8fCBudWxsXG5cdFx0XHR9O1xuXHRcdFx0cm90YXRpb25SYXRlLnZhbHVlID0ge1xuXHRcdFx0XHRhbHBoYTogKChfZXZlbnQkcm90YXRpb25SYXRlID0gZXZlbnQucm90YXRpb25SYXRlKSA9PT0gbnVsbCB8fCBfZXZlbnQkcm90YXRpb25SYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkcm90YXRpb25SYXRlLmFscGhhKSB8fCBudWxsLFxuXHRcdFx0XHRiZXRhOiAoKF9ldmVudCRyb3RhdGlvblJhdGUyID0gZXZlbnQucm90YXRpb25SYXRlKSA9PT0gbnVsbCB8fCBfZXZlbnQkcm90YXRpb25SYXRlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JHJvdGF0aW9uUmF0ZTIuYmV0YSkgfHwgbnVsbCxcblx0XHRcdFx0Z2FtbWE6ICgoX2V2ZW50JHJvdGF0aW9uUmF0ZTMgPSBldmVudC5yb3RhdGlvblJhdGUpID09PSBudWxsIHx8IF9ldmVudCRyb3RhdGlvblJhdGUzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkcm90YXRpb25SYXRlMy5nYW1tYSkgfHwgbnVsbFxuXHRcdFx0fTtcblx0XHRcdGludGVydmFsLnZhbHVlID0gZXZlbnQuaW50ZXJ2YWw7XG5cdFx0fSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fVxuXHRjb25zdCBlbnN1cmVQZXJtaXNzaW9ucyA9IGFzeW5jICgpID0+IHtcblx0XHRpZiAoIXJlcXVpcmVQZXJtaXNzaW9ucy52YWx1ZSkgcGVybWlzc2lvbkdyYW50ZWQudmFsdWUgPSB0cnVlO1xuXHRcdGlmIChwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmIChyZXF1aXJlUGVybWlzc2lvbnMudmFsdWUpIHtcblx0XHRcdGNvbnN0IHJlcXVlc3RQZXJtaXNzaW9uID0gRGV2aWNlTW90aW9uRXZlbnQucmVxdWVzdFBlcm1pc3Npb247XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoYXdhaXQgcmVxdWVzdFBlcm1pc3Npb24oKSA9PT0gXCJncmFudGVkXCIpIHtcblx0XHRcdFx0XHRwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0XHRcdFx0aW5pdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgaWYgKHJlcXVlc3RQZXJtaXNzaW9ucyAmJiByZXF1aXJlUGVybWlzc2lvbnMudmFsdWUpIGVuc3VyZVBlcm1pc3Npb25zKCkudGhlbigoKSA9PiBpbml0KCkpO1xuXHRlbHNlIGluaXQoKTtcblx0cmV0dXJuIHtcblx0XHRhY2NlbGVyYXRpb24sXG5cdFx0YWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eSxcblx0XHRyb3RhdGlvblJhdGUsXG5cdFx0aW50ZXJ2YWwsXG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0cmVxdWlyZVBlcm1pc3Npb25zLFxuXHRcdGVuc3VyZVBlcm1pc3Npb25zLFxuXHRcdHBlcm1pc3Npb25HcmFudGVkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURldmljZU9yaWVudGF0aW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgRGV2aWNlT3JpZW50YXRpb25FdmVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGV2aWNlT3JpZW50YXRpb25cbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEZXZpY2VPcmllbnRhdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiRGV2aWNlT3JpZW50YXRpb25FdmVudFwiIGluIHdpbmRvdyQxKTtcblx0Y29uc3QgaXNBYnNvbHV0ZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBhbHBoYSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGJldGEgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBnYW1tYSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGlmICh3aW5kb3ckMSAmJiBpc1N1cHBvcnRlZC52YWx1ZSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkZXZpY2VvcmllbnRhdGlvblwiLCAoZXZlbnQpID0+IHtcblx0XHRpc0Fic29sdXRlLnZhbHVlID0gZXZlbnQuYWJzb2x1dGU7XG5cdFx0YWxwaGEudmFsdWUgPSBldmVudC5hbHBoYTtcblx0XHRiZXRhLnZhbHVlID0gZXZlbnQuYmV0YTtcblx0XHRnYW1tYS52YWx1ZSA9IGV2ZW50LmdhbW1hO1xuXHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNBYnNvbHV0ZSxcblx0XHRhbHBoYSxcblx0XHRiZXRhLFxuXHRcdGdhbW1hXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURldmljZVBpeGVsUmF0aW8vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IHRyYWNrIGB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb2AuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURldmljZVBpeGVsUmF0aW9cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEZXZpY2VQaXhlbFJhdGlvKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBwaXhlbFJhdGlvID0gc2hhbGxvd1JlZigxKTtcblx0Y29uc3QgcXVlcnkgPSB1c2VNZWRpYVF1ZXJ5KCgpID0+IGAocmVzb2x1dGlvbjogJHtwaXhlbFJhdGlvLnZhbHVlfWRwcHgpYCwgb3B0aW9ucyk7XG5cdGxldCBzdG9wID0gbm9vcDtcblx0aWYgKHdpbmRvdyQxKSBzdG9wID0gd2F0Y2hJbW1lZGlhdGUocXVlcnksICgpID0+IHBpeGVsUmF0aW8udmFsdWUgPSB3aW5kb3ckMS5kZXZpY2VQaXhlbFJhdGlvKTtcblx0cmV0dXJuIHtcblx0XHRwaXhlbFJhdGlvOiByZWFkb25seShwaXhlbFJhdGlvKSxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURldmljZXNMaXN0L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYGVudW1lcmF0ZURldmljZXNgIGxpc3RpbmcgYXZhaWxhYmxlIGlucHV0L291dHB1dCBkZXZpY2VzXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURldmljZXNMaXN0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRGV2aWNlc0xpc3Qob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIHJlcXVlc3RQZXJtaXNzaW9ucyA9IGZhbHNlLCBjb25zdHJhaW50cyA9IHtcblx0XHRhdWRpbzogdHJ1ZSxcblx0XHR2aWRlbzogdHJ1ZVxuXHR9LCBvblVwZGF0ZWQ6IG9uVXBkYXRlZCQxIH0gPSBvcHRpb25zO1xuXHRjb25zdCBkZXZpY2VzID0gcmVmKFtdKTtcblx0Y29uc3QgdmlkZW9JbnB1dHMgPSBjb21wdXRlZCgoKSA9PiBkZXZpY2VzLnZhbHVlLmZpbHRlcigoaSkgPT4gaS5raW5kID09PSBcInZpZGVvaW5wdXRcIikpO1xuXHRjb25zdCBhdWRpb0lucHV0cyA9IGNvbXB1dGVkKCgpID0+IGRldmljZXMudmFsdWUuZmlsdGVyKChpKSA9PiBpLmtpbmQgPT09IFwiYXVkaW9pbnB1dFwiKSk7XG5cdGNvbnN0IGF1ZGlvT3V0cHV0cyA9IGNvbXB1dGVkKCgpID0+IGRldmljZXMudmFsdWUuZmlsdGVyKChpKSA9PiBpLmtpbmQgPT09IFwiYXVkaW9vdXRwdXRcIikpO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKTtcblx0Y29uc3QgcGVybWlzc2lvbkdyYW50ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHN0cmVhbTtcblx0YXN5bmMgZnVuY3Rpb24gdXBkYXRlKCkge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRkZXZpY2VzLnZhbHVlID0gYXdhaXQgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKTtcblx0XHRvblVwZGF0ZWQkMSA9PT0gbnVsbCB8fCBvblVwZGF0ZWQkMSA9PT0gdm9pZCAwIHx8IG9uVXBkYXRlZCQxKGRldmljZXMudmFsdWUpO1xuXHRcdGlmIChzdHJlYW0pIHtcblx0XHRcdHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG5cdFx0XHRzdHJlYW0gPSBudWxsO1xuXHRcdH1cblx0fVxuXHRhc3luYyBmdW5jdGlvbiBlbnN1cmVQZXJtaXNzaW9ucygpIHtcblx0XHRjb25zdCBkZXZpY2VOYW1lID0gY29uc3RyYWludHMudmlkZW8gPyBcImNhbWVyYVwiIDogXCJtaWNyb3Bob25lXCI7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuIGZhbHNlO1xuXHRcdGlmIChwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSkgcmV0dXJuIHRydWU7XG5cdFx0Y29uc3QgeyBzdGF0ZSwgcXVlcnkgfSA9IHVzZVBlcm1pc3Npb24oZGV2aWNlTmFtZSwgeyBjb250cm9sczogdHJ1ZSB9KTtcblx0XHRhd2FpdCBxdWVyeSgpO1xuXHRcdGlmIChzdGF0ZS52YWx1ZSAhPT0gXCJncmFudGVkXCIpIHtcblx0XHRcdGxldCBncmFudGVkID0gdHJ1ZTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGFsbERldmljZXMgPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuXHRcdFx0XHRjb25zdCBoYXNDYW1lcmEgPSBhbGxEZXZpY2VzLnNvbWUoKGRldmljZSkgPT4gZGV2aWNlLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiKTtcblx0XHRcdFx0Y29uc3QgaGFzTWljcm9waG9uZSA9IGFsbERldmljZXMuc29tZSgoZGV2aWNlKSA9PiBkZXZpY2Uua2luZCA9PT0gXCJhdWRpb2lucHV0XCIgfHwgZGV2aWNlLmtpbmQgPT09IFwiYXVkaW9vdXRwdXRcIik7XG5cdFx0XHRcdGNvbnN0cmFpbnRzLnZpZGVvID0gaGFzQ2FtZXJhID8gY29uc3RyYWludHMudmlkZW8gOiBmYWxzZTtcblx0XHRcdFx0Y29uc3RyYWludHMuYXVkaW8gPSBoYXNNaWNyb3Bob25lID8gY29uc3RyYWludHMuYXVkaW8gOiBmYWxzZTtcblx0XHRcdFx0c3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShjb25zdHJhaW50cyk7XG5cdFx0XHR9IGNhdGNoIChfdW51c2VkKSB7XG5cdFx0XHRcdHN0cmVhbSA9IG51bGw7XG5cdFx0XHRcdGdyYW50ZWQgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHVwZGF0ZSgpO1xuXHRcdFx0cGVybWlzc2lvbkdyYW50ZWQudmFsdWUgPSBncmFudGVkO1xuXHRcdH0gZWxzZSBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0cmV0dXJuIHBlcm1pc3Npb25HcmFudGVkLnZhbHVlO1xuXHR9XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdGlmIChyZXF1ZXN0UGVybWlzc2lvbnMpIGVuc3VyZVBlcm1pc3Npb25zKCk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMsIFwiZGV2aWNlY2hhbmdlXCIsIHVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRcdHVwZGF0ZSgpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0ZGV2aWNlcyxcblx0XHRlbnN1cmVQZXJtaXNzaW9ucyxcblx0XHRwZXJtaXNzaW9uR3JhbnRlZCxcblx0XHR2aWRlb0lucHV0cyxcblx0XHRhdWRpb0lucHV0cyxcblx0XHRhdWRpb091dHB1dHMsXG5cdFx0aXNTdXBwb3J0ZWRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGlzcGxheU1lZGlhL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYG1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWFgIHN0cmVhbWluZ1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEaXNwbGF5TWVkaWFcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEaXNwbGF5TWVkaWEob3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRlbmFibGVkO1xuXHRjb25zdCBlbmFibGVkID0gc2hhbGxvd1JlZigoX29wdGlvbnMkZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCkgIT09IG51bGwgJiYgX29wdGlvbnMkZW5hYmxlZCAhPT0gdm9pZCAwID8gX29wdGlvbnMkZW5hYmxlZCA6IGZhbHNlKTtcblx0Y29uc3QgdmlkZW8gPSBvcHRpb25zLnZpZGVvO1xuXHRjb25zdCBhdWRpbyA9IG9wdGlvbnMuYXVkaW87XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB7XG5cdFx0dmFyIF9uYXZpZ2F0b3IkbWVkaWFEZXZpYztcblx0XHRyZXR1cm4gbmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCB8fCAoX25hdmlnYXRvciRtZWRpYURldmljID0gbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzKSA9PT0gbnVsbCB8fCBfbmF2aWdhdG9yJG1lZGlhRGV2aWMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uYXZpZ2F0b3IkbWVkaWFEZXZpYy5nZXREaXNwbGF5TWVkaWE7XG5cdH0pO1xuXHRjb25zdCBjb25zdHJhaW50ID0ge1xuXHRcdGF1ZGlvLFxuXHRcdHZpZGVvXG5cdH07XG5cdGNvbnN0IHN0cmVhbSA9IHNoYWxsb3dSZWYoKTtcblx0YXN5bmMgZnVuY3Rpb24gX3N0YXJ0KCkge1xuXHRcdHZhciBfc3RyZWFtJHZhbHVlO1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUgfHwgc3RyZWFtLnZhbHVlKSByZXR1cm47XG5cdFx0c3RyZWFtLnZhbHVlID0gYXdhaXQgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYShjb25zdHJhaW50KTtcblx0XHQoX3N0cmVhbSR2YWx1ZSA9IHN0cmVhbS52YWx1ZSkgPT09IG51bGwgfHwgX3N0cmVhbSR2YWx1ZSA9PT0gdm9pZCAwIHx8IF9zdHJlYW0kdmFsdWUuZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdXNlRXZlbnRMaXN0ZW5lcih0LCBcImVuZGVkXCIsIHN0b3AsIHsgcGFzc2l2ZTogdHJ1ZSB9KSk7XG5cdFx0cmV0dXJuIHN0cmVhbS52YWx1ZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBfc3RvcCgpIHtcblx0XHR2YXIgX3N0cmVhbSR2YWx1ZTI7XG5cdFx0KF9zdHJlYW0kdmFsdWUyID0gc3RyZWFtLnZhbHVlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJHZhbHVlMiA9PT0gdm9pZCAwIHx8IF9zdHJlYW0kdmFsdWUyLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcblx0XHRzdHJlYW0udmFsdWUgPSB2b2lkIDA7XG5cdH1cblx0ZnVuY3Rpb24gc3RvcCgpIHtcblx0XHRfc3RvcCgpO1xuXHRcdGVuYWJsZWQudmFsdWUgPSBmYWxzZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBzdGFydCgpIHtcblx0XHRhd2FpdCBfc3RhcnQoKTtcblx0XHRpZiAoc3RyZWFtLnZhbHVlKSBlbmFibGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRyZXR1cm4gc3RyZWFtLnZhbHVlO1xuXHR9XG5cdHdhdGNoKGVuYWJsZWQsICh2KSA9PiB7XG5cdFx0aWYgKHYpIF9zdGFydCgpO1xuXHRcdGVsc2UgX3N0b3AoKTtcblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c3RyZWFtLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3AsXG5cdFx0ZW5hYmxlZFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEb2N1bWVudFZpc2liaWxpdHkvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IHRyYWNrIGBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGVgLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEb2N1bWVudFZpc2liaWxpdHlcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEb2N1bWVudFZpc2liaWxpdHkob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGlmICghZG9jdW1lbnQkMSkgcmV0dXJuIHNoYWxsb3dSZWYoXCJ2aXNpYmxlXCIpO1xuXHRjb25zdCB2aXNpYmlsaXR5ID0gc2hhbGxvd1JlZihkb2N1bWVudCQxLnZpc2liaWxpdHlTdGF0ZSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsICgpID0+IHtcblx0XHR2aXNpYmlsaXR5LnZhbHVlID0gZG9jdW1lbnQkMS52aXNpYmlsaXR5U3RhdGU7XG5cdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHZpc2liaWxpdHk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURyYWdnYWJsZS9pbmRleC50c1xuY29uc3QgZGVmYXVsdFNjcm9sbENvbmZpZyA9IHtcblx0c3BlZWQ6IDIsXG5cdG1hcmdpbjogMzAsXG5cdGRpcmVjdGlvbjogXCJib3RoXCJcbn07XG5mdW5jdGlvbiBjbGFtcENvbnRhaW5lclNjcm9sbChjb250YWluZXIpIHtcblx0aWYgKGNvbnRhaW5lci5zY3JvbGxMZWZ0ID4gY29udGFpbmVyLnNjcm9sbFdpZHRoIC0gY29udGFpbmVyLmNsaWVudFdpZHRoKSBjb250YWluZXIuc2Nyb2xsTGVmdCA9IE1hdGgubWF4KDAsIGNvbnRhaW5lci5zY3JvbGxXaWR0aCAtIGNvbnRhaW5lci5jbGllbnRXaWR0aCk7XG5cdGlmIChjb250YWluZXIuc2Nyb2xsVG9wID4gY29udGFpbmVyLnNjcm9sbEhlaWdodCAtIGNvbnRhaW5lci5jbGllbnRIZWlnaHQpIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBNYXRoLm1heCgwLCBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gY29udGFpbmVyLmNsaWVudEhlaWdodCk7XG59XG4vKipcbiogTWFrZSBlbGVtZW50cyBkcmFnZ2FibGUuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURyYWdnYWJsZVxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRHJhZ2dhYmxlKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfdG9WYWx1ZSwgX3RvVmFsdWUyLCBfdG9WYWx1ZTMsIF9zY3JvbGxDb25maWckZGlyZWN0aTtcblx0Y29uc3QgeyBwb2ludGVyVHlwZXMsIHByZXZlbnREZWZhdWx0OiBwcmV2ZW50RGVmYXVsdCQxLCBzdG9wUHJvcGFnYXRpb24sIGV4YWN0LCBvbk1vdmUsIG9uRW5kLCBvblN0YXJ0LCBpbml0aWFsVmFsdWUsIGF4aXMgPSBcImJvdGhcIiwgZHJhZ2dpbmdFbGVtZW50ID0gZGVmYXVsdFdpbmRvdywgY29udGFpbmVyRWxlbWVudCwgaGFuZGxlOiBkcmFnZ2luZ0hhbmRsZSA9IHRhcmdldCwgYnV0dG9ucyA9IFswXSwgcmVzdHJpY3RJblZpZXcsIGF1dG9TY3JvbGwgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcG9zaXRpb24gPSByZWYoKF90b1ZhbHVlID0gdG9WYWx1ZShpbml0aWFsVmFsdWUpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZSAhPT0gdm9pZCAwID8gX3RvVmFsdWUgOiB7XG5cdFx0eDogMCxcblx0XHR5OiAwXG5cdH0pO1xuXHRjb25zdCBwcmVzc2VkRGVsdGEgPSByZWYoKTtcblx0Y29uc3QgZmlsdGVyRXZlbnQgPSAoZSkgPT4ge1xuXHRcdGlmIChwb2ludGVyVHlwZXMpIHJldHVybiBwb2ludGVyVHlwZXMuaW5jbHVkZXMoZS5wb2ludGVyVHlwZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cdGNvbnN0IGhhbmRsZUV2ZW50ID0gKGUpID0+IHtcblx0XHRpZiAodG9WYWx1ZShwcmV2ZW50RGVmYXVsdCQxKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGlmICh0b1ZhbHVlKHN0b3BQcm9wYWdhdGlvbikpIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH07XG5cdGNvbnN0IHNjcm9sbENvbmZpZyA9IHRvVmFsdWUoYXV0b1Njcm9sbCk7XG5cdGNvbnN0IHNjcm9sbFNldHRpbmdzID0gdHlwZW9mIHNjcm9sbENvbmZpZyA9PT0gXCJvYmplY3RcIiA/IHtcblx0XHRzcGVlZDogKF90b1ZhbHVlMiA9IHRvVmFsdWUoc2Nyb2xsQ29uZmlnLnNwZWVkKSkgIT09IG51bGwgJiYgX3RvVmFsdWUyICE9PSB2b2lkIDAgPyBfdG9WYWx1ZTIgOiBkZWZhdWx0U2Nyb2xsQ29uZmlnLnNwZWVkLFxuXHRcdG1hcmdpbjogKF90b1ZhbHVlMyA9IHRvVmFsdWUoc2Nyb2xsQ29uZmlnLm1hcmdpbikpICE9PSBudWxsICYmIF90b1ZhbHVlMyAhPT0gdm9pZCAwID8gX3RvVmFsdWUzIDogZGVmYXVsdFNjcm9sbENvbmZpZy5tYXJnaW4sXG5cdFx0ZGlyZWN0aW9uOiAoX3Njcm9sbENvbmZpZyRkaXJlY3RpID0gc2Nyb2xsQ29uZmlnLmRpcmVjdGlvbikgIT09IG51bGwgJiYgX3Njcm9sbENvbmZpZyRkaXJlY3RpICE9PSB2b2lkIDAgPyBfc2Nyb2xsQ29uZmlnJGRpcmVjdGkgOiBkZWZhdWx0U2Nyb2xsQ29uZmlnLmRpcmVjdGlvblxuXHR9IDogZGVmYXVsdFNjcm9sbENvbmZpZztcblx0Y29uc3QgZ2V0U2Nyb2xsQXhpc1ZhbHVlcyA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiID8gW3ZhbHVlLCB2YWx1ZV0gOiBbdmFsdWUueCwgdmFsdWUueV07XG5cdGNvbnN0IGhhbmRsZUF1dG9TY3JvbGwgPSAoY29udGFpbmVyLCB0YXJnZXRSZWN0LCBwb3NpdGlvbiQxKSA9PiB7XG5cdFx0Y29uc3QgeyBjbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0LCBzY3JvbGxMZWZ0LCBzY3JvbGxUb3AsIHNjcm9sbFdpZHRoLCBzY3JvbGxIZWlnaHQgfSA9IGNvbnRhaW5lcjtcblx0XHRjb25zdCBbbWFyZ2luWCwgbWFyZ2luWV0gPSBnZXRTY3JvbGxBeGlzVmFsdWVzKHNjcm9sbFNldHRpbmdzLm1hcmdpbik7XG5cdFx0Y29uc3QgW3NwZWVkWCwgc3BlZWRZXSA9IGdldFNjcm9sbEF4aXNWYWx1ZXMoc2Nyb2xsU2V0dGluZ3Muc3BlZWQpO1xuXHRcdGxldCBkZWx0YVggPSAwO1xuXHRcdGxldCBkZWx0YVkgPSAwO1xuXHRcdGlmIChzY3JvbGxTZXR0aW5ncy5kaXJlY3Rpb24gPT09IFwieFwiIHx8IHNjcm9sbFNldHRpbmdzLmRpcmVjdGlvbiA9PT0gXCJib3RoXCIpIHtcblx0XHRcdGlmIChwb3NpdGlvbiQxLnggPCBtYXJnaW5YICYmIHNjcm9sbExlZnQgPiAwKSBkZWx0YVggPSAtc3BlZWRYO1xuXHRcdFx0ZWxzZSBpZiAocG9zaXRpb24kMS54ICsgdGFyZ2V0UmVjdC53aWR0aCA+IGNsaWVudFdpZHRoIC0gbWFyZ2luWCAmJiBzY3JvbGxMZWZ0IDwgc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCkgZGVsdGFYID0gc3BlZWRYO1xuXHRcdH1cblx0XHRpZiAoc2Nyb2xsU2V0dGluZ3MuZGlyZWN0aW9uID09PSBcInlcIiB8fCBzY3JvbGxTZXR0aW5ncy5kaXJlY3Rpb24gPT09IFwiYm90aFwiKSB7XG5cdFx0XHRpZiAocG9zaXRpb24kMS55IDwgbWFyZ2luWSAmJiBzY3JvbGxUb3AgPiAwKSBkZWx0YVkgPSAtc3BlZWRZO1xuXHRcdFx0ZWxzZSBpZiAocG9zaXRpb24kMS55ICsgdGFyZ2V0UmVjdC5oZWlnaHQgPiBjbGllbnRIZWlnaHQgLSBtYXJnaW5ZICYmIHNjcm9sbFRvcCA8IHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodCkgZGVsdGFZID0gc3BlZWRZO1xuXHRcdH1cblx0XHRpZiAoZGVsdGFYIHx8IGRlbHRhWSkgY29udGFpbmVyLnNjcm9sbEJ5KHtcblx0XHRcdGxlZnQ6IGRlbHRhWCxcblx0XHRcdHRvcDogZGVsdGFZLFxuXHRcdFx0YmVoYXZpb3I6IFwiYXV0b1wiXG5cdFx0fSk7XG5cdH07XG5cdGxldCBhdXRvU2Nyb2xsSW50ZXJ2YWwgPSBudWxsO1xuXHRjb25zdCBzdGFydEF1dG9TY3JvbGwgPSAoKSA9PiB7XG5cdFx0Y29uc3QgY29udGFpbmVyID0gdG9WYWx1ZShjb250YWluZXJFbGVtZW50KTtcblx0XHRpZiAoY29udGFpbmVyICYmICFhdXRvU2Nyb2xsSW50ZXJ2YWwpIGF1dG9TY3JvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcblx0XHRcdGNvbnN0IHRhcmdldFJlY3QgPSB0b1ZhbHVlKHRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0XHRjb25zdCB7IHgsIHkgfSA9IHBvc2l0aW9uLnZhbHVlO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQb3NpdGlvbiA9IHtcblx0XHRcdFx0eDogeCAtIGNvbnRhaW5lci5zY3JvbGxMZWZ0LFxuXHRcdFx0XHR5OiB5IC0gY29udGFpbmVyLnNjcm9sbFRvcFxuXHRcdFx0fTtcblx0XHRcdGlmIChyZWxhdGl2ZVBvc2l0aW9uLnggPj0gMCAmJiByZWxhdGl2ZVBvc2l0aW9uLnkgPj0gMCkge1xuXHRcdFx0XHRoYW5kbGVBdXRvU2Nyb2xsKGNvbnRhaW5lciwgdGFyZ2V0UmVjdCwgcmVsYXRpdmVQb3NpdGlvbik7XG5cdFx0XHRcdHJlbGF0aXZlUG9zaXRpb24ueCArPSBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdFx0cmVsYXRpdmVQb3NpdGlvbi55ICs9IGNvbnRhaW5lci5zY3JvbGxUb3A7XG5cdFx0XHRcdHBvc2l0aW9uLnZhbHVlID0gcmVsYXRpdmVQb3NpdGlvbjtcblx0XHRcdH1cblx0XHR9LCAxZTMgLyA2MCk7XG5cdH07XG5cdGNvbnN0IHN0b3BBdXRvU2Nyb2xsID0gKCkgPT4ge1xuXHRcdGlmIChhdXRvU2Nyb2xsSW50ZXJ2YWwpIHtcblx0XHRcdGNsZWFySW50ZXJ2YWwoYXV0b1Njcm9sbEludGVydmFsKTtcblx0XHRcdGF1dG9TY3JvbGxJbnRlcnZhbCA9IG51bGw7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBpc1BvaW50ZXJOZWFyRWRnZSA9IChwb2ludGVyLCBjb250YWluZXIsIG1hcmdpbiwgdGFyZ2V0UmVjdCkgPT4ge1xuXHRcdGNvbnN0IFttYXJnaW5YLCBtYXJnaW5ZXSA9IHR5cGVvZiBtYXJnaW4gPT09IFwibnVtYmVyXCIgPyBbbWFyZ2luLCBtYXJnaW5dIDogW21hcmdpbi54LCBtYXJnaW4ueV07XG5cdFx0Y29uc3QgeyBjbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXI7XG5cdFx0cmV0dXJuIHBvaW50ZXIueCA8IG1hcmdpblggfHwgcG9pbnRlci54ICsgdGFyZ2V0UmVjdC53aWR0aCA+IGNsaWVudFdpZHRoIC0gbWFyZ2luWCB8fCBwb2ludGVyLnkgPCBtYXJnaW5ZIHx8IHBvaW50ZXIueSArIHRhcmdldFJlY3QuaGVpZ2h0ID4gY2xpZW50SGVpZ2h0IC0gbWFyZ2luWTtcblx0fTtcblx0Y29uc3QgY2hlY2tBdXRvU2Nyb2xsID0gKCkgPT4ge1xuXHRcdGlmICh0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpIHx8ICFwcmVzc2VkRGVsdGEudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBjb250YWluZXIgPSB0b1ZhbHVlKGNvbnRhaW5lckVsZW1lbnQpO1xuXHRcdGlmICghY29udGFpbmVyKSByZXR1cm47XG5cdFx0Y29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCB7IHgsIHkgfSA9IHBvc2l0aW9uLnZhbHVlO1xuXHRcdGlmIChpc1BvaW50ZXJOZWFyRWRnZSh7XG5cdFx0XHR4OiB4IC0gY29udGFpbmVyLnNjcm9sbExlZnQsXG5cdFx0XHR5OiB5IC0gY29udGFpbmVyLnNjcm9sbFRvcFxuXHRcdH0sIGNvbnRhaW5lciwgc2Nyb2xsU2V0dGluZ3MubWFyZ2luLCB0YXJnZXRSZWN0KSkgc3RhcnRBdXRvU2Nyb2xsKCk7XG5cdFx0ZWxzZSBzdG9wQXV0b1Njcm9sbCgpO1xuXHR9O1xuXHRpZiAodG9WYWx1ZShhdXRvU2Nyb2xsKSkgd2F0Y2gocG9zaXRpb24sIGNoZWNrQXV0b1Njcm9sbCk7XG5cdGNvbnN0IHN0YXJ0ID0gKGUpID0+IHtcblx0XHR2YXIgX2NvbnRhaW5lciRnZXRCb3VuZGluO1xuXHRcdGlmICghdG9WYWx1ZShidXR0b25zKS5pbmNsdWRlcyhlLmJ1dHRvbikpIHJldHVybjtcblx0XHRpZiAodG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSB8fCAhZmlsdGVyRXZlbnQoZSkpIHJldHVybjtcblx0XHRpZiAodG9WYWx1ZShleGFjdCkgJiYgZS50YXJnZXQgIT09IHRvVmFsdWUodGFyZ2V0KSkgcmV0dXJuO1xuXHRcdGNvbnN0IGNvbnRhaW5lciA9IHRvVmFsdWUoY29udGFpbmVyRWxlbWVudCk7XG5cdFx0Y29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lciA9PT0gbnVsbCB8fCBjb250YWluZXIgPT09IHZvaWQgMCB8fCAoX2NvbnRhaW5lciRnZXRCb3VuZGluID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkgPT09IG51bGwgfHwgX2NvbnRhaW5lciRnZXRCb3VuZGluID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY29udGFpbmVyJGdldEJvdW5kaW4uY2FsbChjb250YWluZXIpO1xuXHRcdGNvbnN0IHRhcmdldFJlY3QgPSB0b1ZhbHVlKHRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgcG9zID0ge1xuXHRcdFx0eDogZS5jbGllbnRYIC0gKGNvbnRhaW5lciA/IHRhcmdldFJlY3QubGVmdCAtIGNvbnRhaW5lclJlY3QubGVmdCArIChhdXRvU2Nyb2xsID8gMCA6IGNvbnRhaW5lci5zY3JvbGxMZWZ0KSA6IHRhcmdldFJlY3QubGVmdCksXG5cdFx0XHR5OiBlLmNsaWVudFkgLSAoY29udGFpbmVyID8gdGFyZ2V0UmVjdC50b3AgLSBjb250YWluZXJSZWN0LnRvcCArIChhdXRvU2Nyb2xsID8gMCA6IGNvbnRhaW5lci5zY3JvbGxUb3ApIDogdGFyZ2V0UmVjdC50b3ApXG5cdFx0fTtcblx0XHRpZiAoKG9uU3RhcnQgPT09IG51bGwgfHwgb25TdGFydCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TdGFydChwb3MsIGUpKSA9PT0gZmFsc2UpIHJldHVybjtcblx0XHRwcmVzc2VkRGVsdGEudmFsdWUgPSBwb3M7XG5cdFx0aGFuZGxlRXZlbnQoZSk7XG5cdH07XG5cdGNvbnN0IG1vdmUgPSAoZSkgPT4ge1xuXHRcdGlmICh0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpIHx8ICFmaWx0ZXJFdmVudChlKSkgcmV0dXJuO1xuXHRcdGlmICghcHJlc3NlZERlbHRhLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgY29udGFpbmVyID0gdG9WYWx1ZShjb250YWluZXJFbGVtZW50KTtcblx0XHRpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIGNsYW1wQ29udGFpbmVyU2Nyb2xsKGNvbnRhaW5lcik7XG5cdFx0Y29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRsZXQgeyB4LCB5IH0gPSBwb3NpdGlvbi52YWx1ZTtcblx0XHRpZiAoYXhpcyA9PT0gXCJ4XCIgfHwgYXhpcyA9PT0gXCJib3RoXCIpIHtcblx0XHRcdHggPSBlLmNsaWVudFggLSBwcmVzc2VkRGVsdGEudmFsdWUueDtcblx0XHRcdGlmIChjb250YWluZXIpIHggPSBNYXRoLm1pbihNYXRoLm1heCgwLCB4KSwgY29udGFpbmVyLnNjcm9sbFdpZHRoIC0gdGFyZ2V0UmVjdC53aWR0aCk7XG5cdFx0fVxuXHRcdGlmIChheGlzID09PSBcInlcIiB8fCBheGlzID09PSBcImJvdGhcIikge1xuXHRcdFx0eSA9IGUuY2xpZW50WSAtIHByZXNzZWREZWx0YS52YWx1ZS55O1xuXHRcdFx0aWYgKGNvbnRhaW5lcikgeSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHkpLCBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gdGFyZ2V0UmVjdC5oZWlnaHQpO1xuXHRcdH1cblx0XHRpZiAodG9WYWx1ZShhdXRvU2Nyb2xsKSAmJiBjb250YWluZXIpIHtcblx0XHRcdGlmIChhdXRvU2Nyb2xsSW50ZXJ2YWwgPT09IG51bGwpIGhhbmRsZUF1dG9TY3JvbGwoY29udGFpbmVyLCB0YXJnZXRSZWN0LCB7XG5cdFx0XHRcdHgsXG5cdFx0XHRcdHlcblx0XHRcdH0pO1xuXHRcdFx0eCArPSBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdHkgKz0gY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHR9XG5cdFx0aWYgKGNvbnRhaW5lciAmJiAocmVzdHJpY3RJblZpZXcgfHwgYXV0b1Njcm9sbCkpIHtcblx0XHRcdGlmIChheGlzICE9PSBcInlcIikge1xuXHRcdFx0XHRjb25zdCByZWxhdGl2ZVggPSB4IC0gY29udGFpbmVyLnNjcm9sbExlZnQ7XG5cdFx0XHRcdGlmIChyZWxhdGl2ZVggPCAwKSB4ID0gY29udGFpbmVyLnNjcm9sbExlZnQ7XG5cdFx0XHRcdGVsc2UgaWYgKHJlbGF0aXZlWCA+IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIHRhcmdldFJlY3Qud2lkdGgpIHggPSBjb250YWluZXIuY2xpZW50V2lkdGggLSB0YXJnZXRSZWN0LndpZHRoICsgY29udGFpbmVyLnNjcm9sbExlZnQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoYXhpcyAhPT0gXCJ4XCIpIHtcblx0XHRcdFx0Y29uc3QgcmVsYXRpdmVZID0geSAtIGNvbnRhaW5lci5zY3JvbGxUb3A7XG5cdFx0XHRcdGlmIChyZWxhdGl2ZVkgPCAwKSB5ID0gY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHRcdFx0ZWxzZSBpZiAocmVsYXRpdmVZID4gY29udGFpbmVyLmNsaWVudEhlaWdodCAtIHRhcmdldFJlY3QuaGVpZ2h0KSB5ID0gY29udGFpbmVyLmNsaWVudEhlaWdodCAtIHRhcmdldFJlY3QuaGVpZ2h0ICsgY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cG9zaXRpb24udmFsdWUgPSB7XG5cdFx0XHR4LFxuXHRcdFx0eVxuXHRcdH07XG5cdFx0b25Nb3ZlID09PSBudWxsIHx8IG9uTW92ZSA9PT0gdm9pZCAwIHx8IG9uTW92ZShwb3NpdGlvbi52YWx1ZSwgZSk7XG5cdFx0aGFuZGxlRXZlbnQoZSk7XG5cdH07XG5cdGNvbnN0IGVuZCA9IChlKSA9PiB7XG5cdFx0aWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgfHwgIWZpbHRlckV2ZW50KGUpKSByZXR1cm47XG5cdFx0aWYgKCFwcmVzc2VkRGVsdGEudmFsdWUpIHJldHVybjtcblx0XHRwcmVzc2VkRGVsdGEudmFsdWUgPSB2b2lkIDA7XG5cdFx0aWYgKGF1dG9TY3JvbGwpIHN0b3BBdXRvU2Nyb2xsKCk7XG5cdFx0b25FbmQgPT09IG51bGwgfHwgb25FbmQgPT09IHZvaWQgMCB8fCBvbkVuZChwb3NpdGlvbi52YWx1ZSwgZSk7XG5cdFx0aGFuZGxlRXZlbnQoZSk7XG5cdH07XG5cdGlmIChpc0NsaWVudCkge1xuXHRcdGNvbnN0IGNvbmZpZyA9ICgpID0+IHtcblx0XHRcdHZhciBfb3B0aW9ucyRjYXB0dXJlO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Y2FwdHVyZTogKF9vcHRpb25zJGNhcHR1cmUgPSBvcHRpb25zLmNhcHR1cmUpICE9PSBudWxsICYmIF9vcHRpb25zJGNhcHR1cmUgIT09IHZvaWQgMCA/IF9vcHRpb25zJGNhcHR1cmUgOiB0cnVlLFxuXHRcdFx0XHRwYXNzaXZlOiAhdG9WYWx1ZShwcmV2ZW50RGVmYXVsdCQxKVxuXHRcdFx0fTtcblx0XHR9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZHJhZ2dpbmdIYW5kbGUsIFwicG9pbnRlcmRvd25cIiwgc3RhcnQsIGNvbmZpZyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkcmFnZ2luZ0VsZW1lbnQsIFwicG9pbnRlcm1vdmVcIiwgbW92ZSwgY29uZmlnKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGRyYWdnaW5nRWxlbWVudCwgXCJwb2ludGVydXBcIiwgZW5kLCBjb25maWcpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0Li4udG9SZWZzKHBvc2l0aW9uKSxcblx0XHRwb3NpdGlvbixcblx0XHRpc0RyYWdnaW5nOiBjb21wdXRlZCgoKSA9PiAhIXByZXNzZWREZWx0YS52YWx1ZSksXG5cdFx0c3R5bGU6IGNvbXB1dGVkKCgpID0+IGBcbiAgICAgIGxlZnQ6ICR7cG9zaXRpb24udmFsdWUueH1weDtcbiAgICAgIHRvcDogJHtwb3NpdGlvbi52YWx1ZS55fXB4O1xuICAgICAgJHthdXRvU2Nyb2xsID8gXCJ0ZXh0LXdyYXA6IG5vd3JhcDtcIiA6IFwiXCJ9XG4gICAgYClcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRHJvcFpvbmUvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZURyb3Bab25lKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGlzT3ZlckRyb3Bab25lID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGZpbGVzID0gc2hhbGxvd1JlZihudWxsKTtcblx0bGV0IGNvdW50ZXIgPSAwO1xuXHRsZXQgaXNWYWxpZCA9IHRydWU7XG5cdGlmIChpc0NsaWVudCkge1xuXHRcdHZhciBfb3B0aW9ucyRtdWx0aXBsZSwgX29wdGlvbnMkcHJldmVudERlZmF1O1xuXHRcdGNvbnN0IF9vcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIiA/IHsgb25Ecm9wOiBvcHRpb25zIH0gOiBvcHRpb25zO1xuXHRcdGNvbnN0IG11bHRpcGxlID0gKF9vcHRpb25zJG11bHRpcGxlID0gX29wdGlvbnMubXVsdGlwbGUpICE9PSBudWxsICYmIF9vcHRpb25zJG11bHRpcGxlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRtdWx0aXBsZSA6IHRydWU7XG5cdFx0Y29uc3QgcHJldmVudERlZmF1bHRGb3JVbmhhbmRsZWQgPSAoX29wdGlvbnMkcHJldmVudERlZmF1ID0gX29wdGlvbnMucHJldmVudERlZmF1bHRGb3JVbmhhbmRsZWQpICE9PSBudWxsICYmIF9vcHRpb25zJHByZXZlbnREZWZhdSAhPT0gdm9pZCAwID8gX29wdGlvbnMkcHJldmVudERlZmF1IDogZmFsc2U7XG5cdFx0Y29uc3QgZ2V0RmlsZXMgPSAoZXZlbnQpID0+IHtcblx0XHRcdHZhciBfZXZlbnQkZGF0YVRyYW5zZmVyJGYsIF9ldmVudCRkYXRhVHJhbnNmZXI7XG5cdFx0XHRjb25zdCBsaXN0ID0gQXJyYXkuZnJvbSgoX2V2ZW50JGRhdGFUcmFuc2ZlciRmID0gKF9ldmVudCRkYXRhVHJhbnNmZXIgPSBldmVudC5kYXRhVHJhbnNmZXIpID09PSBudWxsIHx8IF9ldmVudCRkYXRhVHJhbnNmZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRkYXRhVHJhbnNmZXIuZmlsZXMpICE9PSBudWxsICYmIF9ldmVudCRkYXRhVHJhbnNmZXIkZiAhPT0gdm9pZCAwID8gX2V2ZW50JGRhdGFUcmFuc2ZlciRmIDogW10pO1xuXHRcdFx0cmV0dXJuIGxpc3QubGVuZ3RoID09PSAwID8gbnVsbCA6IG11bHRpcGxlID8gbGlzdCA6IFtsaXN0WzBdXTtcblx0XHR9O1xuXHRcdGNvbnN0IGNoZWNrRGF0YVR5cGVzID0gKHR5cGVzKSA9PiB7XG5cdFx0XHRjb25zdCBkYXRhVHlwZXMgPSB1bnJlZihfb3B0aW9ucy5kYXRhVHlwZXMpO1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhVHlwZXMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGRhdGFUeXBlcyh0eXBlcyk7XG5cdFx0XHRpZiAoIShkYXRhVHlwZXMgPT09IG51bGwgfHwgZGF0YVR5cGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhVHlwZXMubGVuZ3RoKSkgcmV0dXJuIHRydWU7XG5cdFx0XHRpZiAodHlwZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRyZXR1cm4gdHlwZXMuZXZlcnkoKHR5cGUpID0+IGRhdGFUeXBlcy5zb21lKChhbGxvd2VkVHlwZSkgPT4gdHlwZS5pbmNsdWRlcyhhbGxvd2VkVHlwZSkpKTtcblx0XHR9O1xuXHRcdGNvbnN0IGNoZWNrVmFsaWRpdHkgPSAoaXRlbXMpID0+IHtcblx0XHRcdGlmIChfb3B0aW9ucy5jaGVja1ZhbGlkaXR5KSByZXR1cm4gX29wdGlvbnMuY2hlY2tWYWxpZGl0eShpdGVtcyk7XG5cdFx0XHRjb25zdCBkYXRhVHlwZXNWYWxpZCA9IGNoZWNrRGF0YVR5cGVzKEFycmF5LmZyb20oaXRlbXMgIT09IG51bGwgJiYgaXRlbXMgIT09IHZvaWQgMCA/IGl0ZW1zIDogW10pLm1hcCgoaXRlbSkgPT4gaXRlbS50eXBlKSk7XG5cdFx0XHRjb25zdCBtdWx0aXBsZUZpbGVzVmFsaWQgPSBtdWx0aXBsZSB8fCBpdGVtcy5sZW5ndGggPD0gMTtcblx0XHRcdHJldHVybiBkYXRhVHlwZXNWYWxpZCAmJiBtdWx0aXBsZUZpbGVzVmFsaWQ7XG5cdFx0fTtcblx0XHRjb25zdCBpc1NhZmFyaSA9ICgpID0+IC9eKD86KD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhKFwiY2hyb21lXCIgaW4gd2luZG93KTtcblx0XHRjb25zdCBoYW5kbGVEcmFnRXZlbnQgPSAoZXZlbnQsIGV2ZW50VHlwZSkgPT4ge1xuXHRcdFx0dmFyIF9ldmVudCRkYXRhVHJhbnNmZXIyLCBfcmVmO1xuXHRcdFx0Y29uc3QgZGF0YVRyYW5zZmVySXRlbUxpc3QgPSAoX2V2ZW50JGRhdGFUcmFuc2ZlcjIgPSBldmVudC5kYXRhVHJhbnNmZXIpID09PSBudWxsIHx8IF9ldmVudCRkYXRhVHJhbnNmZXIyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkZGF0YVRyYW5zZmVyMi5pdGVtcztcblx0XHRcdGlzVmFsaWQgPSAoX3JlZiA9IGRhdGFUcmFuc2Zlckl0ZW1MaXN0ICYmIGNoZWNrVmFsaWRpdHkoZGF0YVRyYW5zZmVySXRlbUxpc3QpKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogZmFsc2U7XG5cdFx0XHRpZiAocHJldmVudERlZmF1bHRGb3JVbmhhbmRsZWQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRpZiAoIWlzU2FmYXJpKCkgJiYgIWlzVmFsaWQpIHtcblx0XHRcdFx0aWYgKGV2ZW50LmRhdGFUcmFuc2ZlcikgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcIm5vbmVcIjtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmIChldmVudC5kYXRhVHJhbnNmZXIpIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJjb3B5XCI7XG5cdFx0XHRjb25zdCBjdXJyZW50RmlsZXMgPSBnZXRGaWxlcyhldmVudCk7XG5cdFx0XHRzd2l0Y2ggKGV2ZW50VHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiZW50ZXJcIjpcblx0XHRcdFx0XHR2YXIgX29wdGlvbnMkb25FbnRlcjtcblx0XHRcdFx0XHRjb3VudGVyICs9IDE7XG5cdFx0XHRcdFx0aXNPdmVyRHJvcFpvbmUudmFsdWUgPSB0cnVlO1xuXHRcdFx0XHRcdChfb3B0aW9ucyRvbkVudGVyID0gX29wdGlvbnMub25FbnRlcikgPT09IG51bGwgfHwgX29wdGlvbnMkb25FbnRlciA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uRW50ZXIuY2FsbChfb3B0aW9ucywgbnVsbCwgZXZlbnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwib3ZlclwiOlxuXHRcdFx0XHRcdHZhciBfb3B0aW9ucyRvbk92ZXI7XG5cdFx0XHRcdFx0KF9vcHRpb25zJG9uT3ZlciA9IF9vcHRpb25zLm9uT3ZlcikgPT09IG51bGwgfHwgX29wdGlvbnMkb25PdmVyID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25PdmVyLmNhbGwoX29wdGlvbnMsIG51bGwsIGV2ZW50KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImxlYXZlXCI6XG5cdFx0XHRcdFx0dmFyIF9vcHRpb25zJG9uTGVhdmU7XG5cdFx0XHRcdFx0Y291bnRlciAtPSAxO1xuXHRcdFx0XHRcdGlmIChjb3VudGVyID09PSAwKSBpc092ZXJEcm9wWm9uZS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdChfb3B0aW9ucyRvbkxlYXZlID0gX29wdGlvbnMub25MZWF2ZSkgPT09IG51bGwgfHwgX29wdGlvbnMkb25MZWF2ZSA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uTGVhdmUuY2FsbChfb3B0aW9ucywgbnVsbCwgZXZlbnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiZHJvcFwiOlxuXHRcdFx0XHRcdGNvdW50ZXIgPSAwO1xuXHRcdFx0XHRcdGlzT3ZlckRyb3Bab25lLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKGlzVmFsaWQpIHtcblx0XHRcdFx0XHRcdHZhciBfb3B0aW9ucyRvbkRyb3A7XG5cdFx0XHRcdFx0XHRmaWxlcy52YWx1ZSA9IGN1cnJlbnRGaWxlcztcblx0XHRcdFx0XHRcdChfb3B0aW9ucyRvbkRyb3AgPSBfb3B0aW9ucy5vbkRyb3ApID09PSBudWxsIHx8IF9vcHRpb25zJG9uRHJvcCA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uRHJvcC5jYWxsKF9vcHRpb25zLCBjdXJyZW50RmlsZXMsIGV2ZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkcmFnZW50ZXJcIiwgKGV2ZW50KSA9PiBoYW5kbGVEcmFnRXZlbnQoZXZlbnQsIFwiZW50ZXJcIikpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImRyYWdvdmVyXCIsIChldmVudCkgPT4gaGFuZGxlRHJhZ0V2ZW50KGV2ZW50LCBcIm92ZXJcIikpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImRyYWdsZWF2ZVwiLCAoZXZlbnQpID0+IGhhbmRsZURyYWdFdmVudChldmVudCwgXCJsZWF2ZVwiKSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJvcFwiLCAoZXZlbnQpID0+IGhhbmRsZURyYWdFdmVudChldmVudCwgXCJkcm9wXCIpKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGZpbGVzLFxuXHRcdGlzT3ZlckRyb3Bab25lXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVJlc2l6ZU9ic2VydmVyL2luZGV4LnRzXG4vKipcbiogUmVwb3J0cyBjaGFuZ2VzIHRvIHRoZSBkaW1lbnNpb25zIG9mIGFuIEVsZW1lbnQncyBjb250ZW50IG9yIHRoZSBib3JkZXItYm94XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVJlc2l6ZU9ic2VydmVyXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIGNhbGxiYWNrXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlUmVzaXplT2JzZXJ2ZXIodGFyZ2V0LCBjYWxsYmFjaywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csLi4ub2JzZXJ2ZXJPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRsZXQgb2JzZXJ2ZXI7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93JDEpO1xuXHRjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuXHRcdGlmIChvYnNlcnZlcikge1xuXHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0b2JzZXJ2ZXIgPSB2b2lkIDA7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaChjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgX3RhcmdldHMgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0cmV0dXJuIEFycmF5LmlzQXJyYXkoX3RhcmdldHMpID8gX3RhcmdldHMubWFwKChlbCkgPT4gdW5yZWZFbGVtZW50KGVsKSkgOiBbdW5yZWZFbGVtZW50KF90YXJnZXRzKV07XG5cdH0pLCAoZWxzKSA9PiB7XG5cdFx0Y2xlYW51cCgpO1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiB3aW5kb3ckMSkge1xuXHRcdFx0b2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoY2FsbGJhY2spO1xuXHRcdFx0Zm9yIChjb25zdCBfZWwgb2YgZWxzKSBpZiAoX2VsKSBvYnNlcnZlci5vYnNlcnZlKF9lbCwgb2JzZXJ2ZXJPcHRpb25zKTtcblx0XHR9XG5cdH0sIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pO1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdGNsZWFudXAoKTtcblx0XHRzdG9wV2F0Y2goKTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50Qm91bmRpbmcvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBib3VuZGluZyBib3ggb2YgYW4gSFRNTCBlbGVtZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VFbGVtZW50Qm91bmRpbmdcbiogQHBhcmFtIHRhcmdldFxuKi9cbmZ1bmN0aW9uIHVzZUVsZW1lbnRCb3VuZGluZyh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHJlc2V0ID0gdHJ1ZSwgd2luZG93UmVzaXplID0gdHJ1ZSwgd2luZG93U2Nyb2xsID0gdHJ1ZSwgaW1tZWRpYXRlID0gdHJ1ZSwgdXBkYXRlVGltaW5nID0gXCJzeW5jXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGhlaWdodCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGJvdHRvbSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGxlZnQgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCByaWdodCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHRvcCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHdpZHRoID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgeCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHkgPSBzaGFsbG93UmVmKDApO1xuXHRmdW5jdGlvbiByZWNhbGN1bGF0ZSgpIHtcblx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdGlmICghZWwpIHtcblx0XHRcdGlmIChyZXNldCkge1xuXHRcdFx0XHRoZWlnaHQudmFsdWUgPSAwO1xuXHRcdFx0XHRib3R0b20udmFsdWUgPSAwO1xuXHRcdFx0XHRsZWZ0LnZhbHVlID0gMDtcblx0XHRcdFx0cmlnaHQudmFsdWUgPSAwO1xuXHRcdFx0XHR0b3AudmFsdWUgPSAwO1xuXHRcdFx0XHR3aWR0aC52YWx1ZSA9IDA7XG5cdFx0XHRcdHgudmFsdWUgPSAwO1xuXHRcdFx0XHR5LnZhbHVlID0gMDtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGhlaWdodC52YWx1ZSA9IHJlY3QuaGVpZ2h0O1xuXHRcdGJvdHRvbS52YWx1ZSA9IHJlY3QuYm90dG9tO1xuXHRcdGxlZnQudmFsdWUgPSByZWN0LmxlZnQ7XG5cdFx0cmlnaHQudmFsdWUgPSByZWN0LnJpZ2h0O1xuXHRcdHRvcC52YWx1ZSA9IHJlY3QudG9wO1xuXHRcdHdpZHRoLnZhbHVlID0gcmVjdC53aWR0aDtcblx0XHR4LnZhbHVlID0gcmVjdC54O1xuXHRcdHkudmFsdWUgPSByZWN0Lnk7XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlKCkge1xuXHRcdGlmICh1cGRhdGVUaW1pbmcgPT09IFwic3luY1wiKSByZWNhbGN1bGF0ZSgpO1xuXHRcdGVsc2UgaWYgKHVwZGF0ZVRpbWluZyA9PT0gXCJuZXh0LWZyYW1lXCIpIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZWNhbGN1bGF0ZSgpKTtcblx0fVxuXHR1c2VSZXNpemVPYnNlcnZlcih0YXJnZXQsIHVwZGF0ZSk7XG5cdHdhdGNoKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpLCAoZWxlKSA9PiAhZWxlICYmIHVwZGF0ZSgpKTtcblx0dXNlTXV0YXRpb25PYnNlcnZlcih0YXJnZXQsIHVwZGF0ZSwgeyBhdHRyaWJ1dGVGaWx0ZXI6IFtcInN0eWxlXCIsIFwiY2xhc3NcIl0gfSk7XG5cdGlmICh3aW5kb3dTY3JvbGwpIHVzZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdXBkYXRlLCB7XG5cdFx0Y2FwdHVyZTogdHJ1ZSxcblx0XHRwYXNzaXZlOiB0cnVlXG5cdH0pO1xuXHRpZiAod2luZG93UmVzaXplKSB1c2VFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGlmIChpbW1lZGlhdGUpIHVwZGF0ZSgpO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRoZWlnaHQsXG5cdFx0Ym90dG9tLFxuXHRcdGxlZnQsXG5cdFx0cmlnaHQsXG5cdFx0dG9wLFxuXHRcdHdpZHRoLFxuXHRcdHgsXG5cdFx0eSxcblx0XHR1cGRhdGVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRWxlbWVudEJ5UG9pbnQvaW5kZXgudHNcbmZ1bmN0aW9uIGdldERlZmF1bHRTY2hlZHVsZXIkNyhvcHRpb25zKSB7XG5cdGlmIChcImludGVydmFsXCIgaW4gb3B0aW9ucyB8fCBcImltbWVkaWF0ZVwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IGludGVydmFsID0gXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiwgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gaW50ZXJ2YWwgPT09IFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIgPyAoY2IpID0+IHVzZVJhZkZuKGNiLCB7IGltbWVkaWF0ZSB9KSA6IChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlIH0pO1xuXHR9XG5cdHJldHVybiB1c2VSYWZGbjtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBlbGVtZW50IGJ5IHBvaW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VFbGVtZW50QnlQb2ludFxuKiBAcGFyYW0gb3B0aW9ucyAtIFVzZUVsZW1lbnRCeVBvaW50T3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUVsZW1lbnRCeVBvaW50KG9wdGlvbnMpIHtcblx0Y29uc3QgeyB4LCB5LCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgbXVsdGlwbGUsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkNyhvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHtcblx0XHRpZiAodG9WYWx1ZShtdWx0aXBsZSkpIHJldHVybiBkb2N1bWVudCQxICYmIFwiZWxlbWVudHNGcm9tUG9pbnRcIiBpbiBkb2N1bWVudCQxO1xuXHRcdHJldHVybiBkb2N1bWVudCQxICYmIFwiZWxlbWVudEZyb21Qb2ludFwiIGluIGRvY3VtZW50JDE7XG5cdH0pO1xuXHRjb25zdCBlbGVtZW50ID0gc2hhbGxvd1JlZihudWxsKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRlbGVtZW50LFxuXHRcdC4uLnNjaGVkdWxlcigoKSA9PiB7XG5cdFx0XHR2YXIgX2RvY3VtZW50JGVsZW1lbnRzRnJvLCBfZG9jdW1lbnQkZWxlbWVudEZyb207XG5cdFx0XHRlbGVtZW50LnZhbHVlID0gdG9WYWx1ZShtdWx0aXBsZSkgPyAoX2RvY3VtZW50JGVsZW1lbnRzRnJvID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmVsZW1lbnRzRnJvbVBvaW50KHRvVmFsdWUoeCksIHRvVmFsdWUoeSkpKSAhPT0gbnVsbCAmJiBfZG9jdW1lbnQkZWxlbWVudHNGcm8gIT09IHZvaWQgMCA/IF9kb2N1bWVudCRlbGVtZW50c0ZybyA6IFtdIDogKF9kb2N1bWVudCRlbGVtZW50RnJvbSA9IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS5lbGVtZW50RnJvbVBvaW50KHRvVmFsdWUoeCksIHRvVmFsdWUoeSkpKSAhPT0gbnVsbCAmJiBfZG9jdW1lbnQkZWxlbWVudEZyb20gIT09IHZvaWQgMCA/IF9kb2N1bWVudCRlbGVtZW50RnJvbSA6IG51bGw7XG5cdFx0fSlcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRWxlbWVudEhvdmVyL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VFbGVtZW50SG92ZXIoZWwsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRlbGF5RW50ZXIgPSAwLCBkZWxheUxlYXZlID0gMCwgdHJpZ2dlck9uUmVtb3ZhbCA9IGZhbHNlLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNIb3ZlcmVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGxldCB0aW1lcjtcblx0Y29uc3QgdG9nZ2xlID0gKGVudGVyaW5nKSA9PiB7XG5cdFx0Y29uc3QgZGVsYXkgPSBlbnRlcmluZyA/IGRlbGF5RW50ZXIgOiBkZWxheUxlYXZlO1xuXHRcdGlmICh0aW1lcikge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdHRpbWVyID0gdm9pZCAwO1xuXHRcdH1cblx0XHRpZiAoZGVsYXkpIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBpc0hvdmVyZWQudmFsdWUgPSBlbnRlcmluZywgZGVsYXkpO1xuXHRcdGVsc2UgaXNIb3ZlcmVkLnZhbHVlID0gZW50ZXJpbmc7XG5cdH07XG5cdGlmICghd2luZG93JDEpIHJldHVybiBpc0hvdmVyZWQ7XG5cdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwibW91c2VlbnRlclwiLCAoKSA9PiB0b2dnbGUodHJ1ZSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0dXNlRXZlbnRMaXN0ZW5lcihlbCwgXCJtb3VzZWxlYXZlXCIsICgpID0+IHRvZ2dsZShmYWxzZSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0aWYgKHRyaWdnZXJPblJlbW92YWwpIG9uRWxlbWVudFJlbW92YWwoY29tcHV0ZWQoKCkgPT4gdW5yZWZFbGVtZW50KGVsKSksICgpID0+IHRvZ2dsZShmYWxzZSkpO1xuXHRyZXR1cm4gaXNIb3ZlcmVkO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50U2l6ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHNpemUgb2YgYW4gSFRNTCBlbGVtZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VFbGVtZW50U2l6ZVxuKi9cbmZ1bmN0aW9uIHVzZUVsZW1lbnRTaXplKHRhcmdldCwgaW5pdGlhbFNpemUgPSB7XG5cdHdpZHRoOiAwLFxuXHRoZWlnaHQ6IDBcbn0sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBib3ggPSBcImNvbnRlbnQtYm94XCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU1ZHID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfdW5yZWZFbGVtZW50O1xuXHRcdHJldHVybiAoX3VucmVmRWxlbWVudCA9IHVucmVmRWxlbWVudCh0YXJnZXQpKSA9PT0gbnVsbCB8fCBfdW5yZWZFbGVtZW50ID09PSB2b2lkIDAgfHwgKF91bnJlZkVsZW1lbnQgPSBfdW5yZWZFbGVtZW50Lm5hbWVzcGFjZVVSSSkgPT09IG51bGwgfHwgX3VucmVmRWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3VucmVmRWxlbWVudC5pbmNsdWRlcyhcInN2Z1wiKTtcblx0fSk7XG5cdGNvbnN0IHdpZHRoID0gc2hhbGxvd1JlZihpbml0aWFsU2l6ZS53aWR0aCk7XG5cdGNvbnN0IGhlaWdodCA9IHNoYWxsb3dSZWYoaW5pdGlhbFNpemUuaGVpZ2h0KTtcblx0Y29uc3QgeyBzdG9wOiBzdG9wMSB9ID0gdXNlUmVzaXplT2JzZXJ2ZXIodGFyZ2V0LCAoW2VudHJ5XSkgPT4ge1xuXHRcdGNvbnN0IGJveFNpemUgPSBib3ggPT09IFwiYm9yZGVyLWJveFwiID8gZW50cnkuYm9yZGVyQm94U2l6ZSA6IGJveCA9PT0gXCJjb250ZW50LWJveFwiID8gZW50cnkuY29udGVudEJveFNpemUgOiBlbnRyeS5kZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplO1xuXHRcdGlmICh3aW5kb3ckMSAmJiBpc1NWRy52YWx1ZSkge1xuXHRcdFx0Y29uc3QgJGVsZW0gPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRcdGlmICgkZWxlbSkge1xuXHRcdFx0XHRjb25zdCByZWN0ID0gJGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0XHRcdHdpZHRoLnZhbHVlID0gcmVjdC53aWR0aDtcblx0XHRcdFx0aGVpZ2h0LnZhbHVlID0gcmVjdC5oZWlnaHQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChib3hTaXplKSB7XG5cdFx0XHRjb25zdCBmb3JtYXRCb3hTaXplID0gdG9BcnJheShib3hTaXplKTtcblx0XHRcdHdpZHRoLnZhbHVlID0gZm9ybWF0Qm94U2l6ZS5yZWR1Y2UoKGFjYywgeyBpbmxpbmVTaXplIH0pID0+IGFjYyArIGlubGluZVNpemUsIDApO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gZm9ybWF0Qm94U2l6ZS5yZWR1Y2UoKGFjYywgeyBibG9ja1NpemUgfSkgPT4gYWNjICsgYmxvY2tTaXplLCAwKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2lkdGgudmFsdWUgPSBlbnRyeS5jb250ZW50UmVjdC53aWR0aDtcblx0XHRcdGhlaWdodC52YWx1ZSA9IGVudHJ5LmNvbnRlbnRSZWN0LmhlaWdodDtcblx0XHR9XG5cdH0sIG9wdGlvbnMpO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IGVsZSA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdGlmIChlbGUpIHtcblx0XHRcdHdpZHRoLnZhbHVlID0gXCJvZmZzZXRXaWR0aFwiIGluIGVsZSA/IGVsZS5vZmZzZXRXaWR0aCA6IGluaXRpYWxTaXplLndpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gXCJvZmZzZXRIZWlnaHRcIiBpbiBlbGUgPyBlbGUub2Zmc2V0SGVpZ2h0IDogaW5pdGlhbFNpemUuaGVpZ2h0O1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHN0b3AyID0gd2F0Y2goKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCksIChlbGUpID0+IHtcblx0XHR3aWR0aC52YWx1ZSA9IGVsZSA/IGluaXRpYWxTaXplLndpZHRoIDogMDtcblx0XHRoZWlnaHQudmFsdWUgPSBlbGUgPyBpbml0aWFsU2l6ZS5oZWlnaHQgOiAwO1xuXHR9KTtcblx0ZnVuY3Rpb24gc3RvcCgpIHtcblx0XHRzdG9wMSgpO1xuXHRcdHN0b3AyKCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR3aWR0aCxcblx0XHRoZWlnaHQsXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VJbnRlcnNlY3Rpb25PYnNlcnZlci9pbmRleC50c1xuLyoqXG4qIERldGVjdHMgdGhhdCBhIHRhcmdldCBlbGVtZW50J3MgdmlzaWJpbGl0eS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gY2FsbGJhY2tcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VJbnRlcnNlY3Rpb25PYnNlcnZlcih0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyByb290LCByb290TWFyZ2luLCB0aHJlc2hvbGQgPSAwLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGNvbnN0IHRhcmdldHMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0cmV0dXJuIHRvQXJyYXkodG9WYWx1ZSh0YXJnZXQpKS5tYXAodW5yZWZFbGVtZW50KS5maWx0ZXIobm90TnVsbGlzaCk7XG5cdH0pO1xuXHRsZXQgY2xlYW51cCA9IG5vb3A7XG5cdGNvbnN0IGlzQWN0aXZlID0gc2hhbGxvd1JlZihpbW1lZGlhdGUpO1xuXHRjb25zdCBzdG9wV2F0Y2ggPSBpc1N1cHBvcnRlZC52YWx1ZSA/IHdhdGNoKCgpID0+IFtcblx0XHR0YXJnZXRzLnZhbHVlLFxuXHRcdHVucmVmRWxlbWVudChyb290KSxcblx0XHR0b1ZhbHVlKHJvb3RNYXJnaW4pLFxuXHRcdGlzQWN0aXZlLnZhbHVlXG5cdF0sIChbdGFyZ2V0cyQxLCByb290JDEsIHJvb3RNYXJnaW4kMV0pID0+IHtcblx0XHRjbGVhbnVwKCk7XG5cdFx0aWYgKCFpc0FjdGl2ZS52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmICghdGFyZ2V0cyQxLmxlbmd0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGNhbGxiYWNrLCB7XG5cdFx0XHRyb290OiB1bnJlZkVsZW1lbnQocm9vdCQxKSxcblx0XHRcdHJvb3RNYXJnaW46IHJvb3RNYXJnaW4kMSxcblx0XHRcdHRocmVzaG9sZFxuXHRcdH0pO1xuXHRcdHRhcmdldHMkMS5mb3JFYWNoKChlbCkgPT4gZWwgJiYgb2JzZXJ2ZXIub2JzZXJ2ZShlbCkpO1xuXHRcdGNsZWFudXAgPSAoKSA9PiB7XG5cdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHRjbGVhbnVwID0gbm9vcDtcblx0XHR9O1xuXHR9LCB7XG5cdFx0aW1tZWRpYXRlLFxuXHRcdGZsdXNoOiBcInBvc3RcIlxuXHR9KSA6IG5vb3A7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0Y2xlYW51cCgpO1xuXHRcdHN0b3BXYXRjaCgpO1xuXHRcdGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG5cdH07XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHN0b3ApO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzQWN0aXZlLFxuXHRcdHBhdXNlKCkge1xuXHRcdFx0Y2xlYW51cCgpO1xuXHRcdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0XHR9LFxuXHRcdHJlc3VtZSgpIHtcblx0XHRcdGlzQWN0aXZlLnZhbHVlID0gdHJ1ZTtcblx0XHR9LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRWxlbWVudFZpc2liaWxpdHkvaW5kZXgudHNcbi8qKlxuKiBUcmFja3MgdGhlIHZpc2liaWxpdHkgb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHZpZXdwb3J0LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VFbGVtZW50VmlzaWJpbGl0eVxuKi9cbmZ1bmN0aW9uIHVzZUVsZW1lbnRWaXNpYmlsaXR5KGVsZW1lbnQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBzY3JvbGxUYXJnZXQsIHRocmVzaG9sZCA9IDAsIHJvb3RNYXJnaW4sIG9uY2UgPSBmYWxzZSwgaW5pdGlhbFZhbHVlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IHsgc3RvcCB9ID0gdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZWxlbWVudCwgKGludGVyc2VjdGlvbk9ic2VydmVyRW50cmllcykgPT4ge1xuXHRcdGxldCBpc0ludGVyc2VjdGluZyA9IGVsZW1lbnRJc1Zpc2libGUudmFsdWU7XG5cdFx0bGV0IGxhdGVzdFRpbWUgPSAwO1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyaWVzKSBpZiAoZW50cnkudGltZSA+PSBsYXRlc3RUaW1lKSB7XG5cdFx0XHRsYXRlc3RUaW1lID0gZW50cnkudGltZTtcblx0XHRcdGlzSW50ZXJzZWN0aW5nID0gZW50cnkuaXNJbnRlcnNlY3Rpbmc7XG5cdFx0fVxuXHRcdGVsZW1lbnRJc1Zpc2libGUudmFsdWUgPSBpc0ludGVyc2VjdGluZztcblx0XHRpZiAob25jZSkgd2F0Y2hPbmNlKGVsZW1lbnRJc1Zpc2libGUsICgpID0+IHtcblx0XHRcdHN0b3AoKTtcblx0XHR9KTtcblx0fSwge1xuXHRcdHJvb3Q6IHNjcm9sbFRhcmdldCxcblx0XHR3aW5kb3c6IHdpbmRvdyQxLFxuXHRcdHRocmVzaG9sZCxcblx0XHRyb290TWFyZ2luXG5cdH0pO1xuXHRyZXR1cm4gZWxlbWVudElzVmlzaWJsZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRXZlbnRCdXMvaW50ZXJuYWwudHNcbmNvbnN0IGV2ZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUV2ZW50QnVzL2luZGV4LnRzXG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlRXZlbnRCdXMoa2V5KSB7XG5cdGNvbnN0IHNjb3BlID0gZ2V0Q3VycmVudFNjb3BlKCk7XG5cdGZ1bmN0aW9uIG9uKGxpc3RlbmVyKSB7XG5cdFx0dmFyIF9zY29wZSRjbGVhbnVwcztcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSBldmVudHMuZ2V0KGtleSkgfHwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0XHRsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcblx0XHRldmVudHMuc2V0KGtleSwgbGlzdGVuZXJzKTtcblx0XHRjb25zdCBfb2ZmID0gKCkgPT4gb2ZmKGxpc3RlbmVyKTtcblx0XHRzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdm9pZCAwIHx8IChfc2NvcGUkY2xlYW51cHMgPSBzY29wZS5jbGVhbnVwcykgPT09IG51bGwgfHwgX3Njb3BlJGNsZWFudXBzID09PSB2b2lkIDAgfHwgX3Njb3BlJGNsZWFudXBzLnB1c2goX29mZik7XG5cdFx0cmV0dXJuIF9vZmY7XG5cdH1cblx0ZnVuY3Rpb24gb25jZShsaXN0ZW5lcikge1xuXHRcdGZ1bmN0aW9uIF9saXN0ZW5lciguLi5hcmdzKSB7XG5cdFx0XHRvZmYoX2xpc3RlbmVyKTtcblx0XHRcdGxpc3RlbmVyKC4uLmFyZ3MpO1xuXHRcdH1cblx0XHRyZXR1cm4gb24oX2xpc3RlbmVyKTtcblx0fVxuXHRmdW5jdGlvbiBvZmYobGlzdGVuZXIpIHtcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSBldmVudHMuZ2V0KGtleSk7XG5cdFx0aWYgKCFsaXN0ZW5lcnMpIHJldHVybjtcblx0XHRsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcblx0XHRpZiAoIWxpc3RlbmVycy5zaXplKSByZXNldCgpO1xuXHR9XG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXHRcdGV2ZW50cy5kZWxldGUoa2V5KTtcblx0fVxuXHRmdW5jdGlvbiBlbWl0KGV2ZW50LCBwYXlsb2FkKSB7XG5cdFx0dmFyIF9ldmVudHMkZ2V0O1xuXHRcdChfZXZlbnRzJGdldCA9IGV2ZW50cy5nZXQoa2V5KSkgPT09IG51bGwgfHwgX2V2ZW50cyRnZXQgPT09IHZvaWQgMCB8fCBfZXZlbnRzJGdldC5mb3JFYWNoKCh2KSA9PiB2KGV2ZW50LCBwYXlsb2FkKSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRvbixcblx0XHRvbmNlLFxuXHRcdG9mZixcblx0XHRlbWl0LFxuXHRcdHJlc2V0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUV2ZW50U291cmNlL2luZGV4LnRzXG5mdW5jdGlvbiByZXNvbHZlTmVzdGVkT3B0aW9ucyQxKG9wdGlvbnMpIHtcblx0aWYgKG9wdGlvbnMgPT09IHRydWUpIHJldHVybiB7fTtcblx0cmV0dXJuIG9wdGlvbnM7XG59XG4vKipcbiogUmVhY3RpdmUgd3JhcHBlciBmb3IgRXZlbnRTb3VyY2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUV2ZW50U291cmNlXG4qIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50U291cmNlL0V2ZW50U291cmNlIEV2ZW50U291cmNlXG4qIEBwYXJhbSB1cmxcbiogQHBhcmFtIGV2ZW50c1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUV2ZW50U291cmNlKHVybCwgZXZlbnRzJDEgPSBbXSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGV2ZW50ID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgZGF0YSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHN0YXR1cyA9IHNoYWxsb3dSZWYoXCJDT05ORUNUSU5HXCIpO1xuXHRjb25zdCBldmVudFNvdXJjZSA9IHJlZihudWxsKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCB1cmxSZWYgPSB0b1JlZih1cmwpO1xuXHRjb25zdCBsYXN0RXZlbnRJZCA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGxldCBleHBsaWNpdGx5Q2xvc2VkID0gZmFsc2U7XG5cdGxldCByZXRyaWVkID0gMDtcblx0Y29uc3QgeyB3aXRoQ3JlZGVudGlhbHMgPSBmYWxzZSwgaW1tZWRpYXRlID0gdHJ1ZSwgYXV0b0Nvbm5lY3QgPSB0cnVlLCBhdXRvUmVjb25uZWN0LCBzZXJpYWxpemVyID0geyByZWFkOiAodikgPT4gdiB9IH0gPSBvcHRpb25zO1xuXHRjb25zdCBjbG9zZSA9ICgpID0+IHtcblx0XHRpZiAoaXNDbGllbnQgJiYgZXZlbnRTb3VyY2UudmFsdWUpIHtcblx0XHRcdGV2ZW50U291cmNlLnZhbHVlLmNsb3NlKCk7XG5cdFx0XHRldmVudFNvdXJjZS52YWx1ZSA9IG51bGw7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcIkNMT1NFRFwiO1xuXHRcdFx0ZXhwbGljaXRseUNsb3NlZCA9IHRydWU7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBfaW5pdCA9ICgpID0+IHtcblx0XHRpZiAoZXhwbGljaXRseUNsb3NlZCB8fCB0eXBlb2YgdXJsUmVmLnZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG5cdFx0Y29uc3QgZXMgPSBuZXcgRXZlbnRTb3VyY2UodXJsUmVmLnZhbHVlLCB7IHdpdGhDcmVkZW50aWFscyB9KTtcblx0XHRzdGF0dXMudmFsdWUgPSBcIkNPTk5FQ1RJTkdcIjtcblx0XHRldmVudFNvdXJjZS52YWx1ZSA9IGVzO1xuXHRcdGVzLm9ub3BlbiA9ICgpID0+IHtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwiT1BFTlwiO1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdH07XG5cdFx0ZXMub25lcnJvciA9IChlKSA9PiB7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcIkNMT1NFRFwiO1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBlO1xuXHRcdFx0aWYgKGVzLnJlYWR5U3RhdGUgPT09IDIgJiYgIWV4cGxpY2l0bHlDbG9zZWQgJiYgYXV0b1JlY29ubmVjdCkge1xuXHRcdFx0XHRlcy5jbG9zZSgpO1xuXHRcdFx0XHRjb25zdCB7IHJldHJpZXMgPSAtMSwgZGVsYXkgPSAxZTMsIG9uRmFpbGVkIH0gPSByZXNvbHZlTmVzdGVkT3B0aW9ucyQxKGF1dG9SZWNvbm5lY3QpO1xuXHRcdFx0XHRyZXRyaWVkICs9IDE7XG5cdFx0XHRcdGlmICh0eXBlb2YgcmV0cmllcyA9PT0gXCJudW1iZXJcIiAmJiAocmV0cmllcyA8IDAgfHwgcmV0cmllZCA8IHJldHJpZXMpKSBzZXRUaW1lb3V0KF9pbml0LCBkZWxheSk7XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiByZXRyaWVzID09PSBcImZ1bmN0aW9uXCIgJiYgcmV0cmllcygpKSBzZXRUaW1lb3V0KF9pbml0LCBkZWxheSk7XG5cdFx0XHRcdGVsc2Ugb25GYWlsZWQgPT09IG51bGwgfHwgb25GYWlsZWQgPT09IHZvaWQgMCB8fCBvbkZhaWxlZCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0ZXMub25tZXNzYWdlID0gKGUpID0+IHtcblx0XHRcdHZhciBfc2VyaWFsaXplciRyZWFkO1xuXHRcdFx0ZXZlbnQudmFsdWUgPSBudWxsO1xuXHRcdFx0ZGF0YS52YWx1ZSA9IChfc2VyaWFsaXplciRyZWFkID0gc2VyaWFsaXplci5yZWFkKGUuZGF0YSkpICE9PSBudWxsICYmIF9zZXJpYWxpemVyJHJlYWQgIT09IHZvaWQgMCA/IF9zZXJpYWxpemVyJHJlYWQgOiBudWxsO1xuXHRcdFx0bGFzdEV2ZW50SWQudmFsdWUgPSBlLmxhc3RFdmVudElkO1xuXHRcdH07XG5cdFx0Zm9yIChjb25zdCBldmVudF9uYW1lIG9mIGV2ZW50cyQxKSB1c2VFdmVudExpc3RlbmVyKGVzLCBldmVudF9uYW1lLCAoZSkgPT4ge1xuXHRcdFx0dmFyIF9zZXJpYWxpemVyJHJlYWQyLCBfZSRsYXN0RXZlbnRJZDtcblx0XHRcdGV2ZW50LnZhbHVlID0gZXZlbnRfbmFtZTtcblx0XHRcdGRhdGEudmFsdWUgPSAoX3NlcmlhbGl6ZXIkcmVhZDIgPSBzZXJpYWxpemVyLnJlYWQoZS5kYXRhKSkgIT09IG51bGwgJiYgX3NlcmlhbGl6ZXIkcmVhZDIgIT09IHZvaWQgMCA/IF9zZXJpYWxpemVyJHJlYWQyIDogbnVsbDtcblx0XHRcdGxhc3RFdmVudElkLnZhbHVlID0gKF9lJGxhc3RFdmVudElkID0gZS5sYXN0RXZlbnRJZCkgIT09IG51bGwgJiYgX2UkbGFzdEV2ZW50SWQgIT09IHZvaWQgMCA/IF9lJGxhc3RFdmVudElkIDogbnVsbDtcblx0XHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdH07XG5cdGNvbnN0IG9wZW4gPSAoKSA9PiB7XG5cdFx0aWYgKCFpc0NsaWVudCkgcmV0dXJuO1xuXHRcdGNsb3NlKCk7XG5cdFx0ZXhwbGljaXRseUNsb3NlZCA9IGZhbHNlO1xuXHRcdHJldHJpZWQgPSAwO1xuXHRcdF9pbml0KCk7XG5cdH07XG5cdGlmIChpbW1lZGlhdGUpIG9wZW4oKTtcblx0aWYgKGF1dG9Db25uZWN0KSB3YXRjaCh1cmxSZWYsIG9wZW4pO1xuXHR0cnlPblNjb3BlRGlzcG9zZShjbG9zZSk7XG5cdHJldHVybiB7XG5cdFx0ZXZlbnRTb3VyY2UsXG5cdFx0ZXZlbnQsXG5cdFx0ZGF0YSxcblx0XHRzdGF0dXMsXG5cdFx0ZXJyb3IsXG5cdFx0b3Blbixcblx0XHRjbG9zZSxcblx0XHRsYXN0RXZlbnRJZFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFeWVEcm9wcGVyL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgW0V5ZURyb3BwZXIgQVBJXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXllRHJvcHBlcl9BUEkpXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUV5ZURyb3BwZXJcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VFeWVEcm9wcGVyKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluaXRpYWxWYWx1ZSA9IFwiXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIFwiRXllRHJvcHBlclwiIGluIHdpbmRvdyk7XG5cdGNvbnN0IHNSR0JIZXggPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGFzeW5jIGZ1bmN0aW9uIG9wZW4ob3Blbk9wdGlvbnMpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IHdpbmRvdy5FeWVEcm9wcGVyKCkub3BlbihvcGVuT3B0aW9ucyk7XG5cdFx0c1JHQkhleC52YWx1ZSA9IHJlc3VsdC5zUkdCSGV4O1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzUkdCSGV4LFxuXHRcdG9wZW5cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRmF2aWNvbi9pbmRleC50c1xuZnVuY3Rpb24gdXNlRmF2aWNvbihuZXdJY29uID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgYmFzZVVybCA9IFwiXCIsIHJlbCA9IFwiaWNvblwiLCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCB9ID0gb3B0aW9ucztcblx0Y29uc3QgZmF2aWNvbiA9IHRvUmVmKG5ld0ljb24pO1xuXHRjb25zdCBhcHBseUljb24gPSAoaWNvbikgPT4ge1xuXHRcdGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmhlYWQucXVlcnlTZWxlY3RvckFsbChgbGlua1tyZWwqPVwiJHtyZWx9XCJdYCk7XG5cdFx0aWYgKCFlbGVtZW50cyB8fCBlbGVtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnN0IGxpbmsgPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG5cdFx0XHRpZiAobGluaykge1xuXHRcdFx0XHRsaW5rLnJlbCA9IHJlbDtcblx0XHRcdFx0bGluay5ocmVmID0gYCR7YmFzZVVybH0ke2ljb259YDtcblx0XHRcdFx0bGluay50eXBlID0gYGltYWdlLyR7aWNvbi5zcGxpdChcIi5cIikucG9wKCl9YDtcblx0XHRcdFx0ZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgfHwgZG9jdW1lbnQkMS5oZWFkLmFwcGVuZChsaW5rKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0ZWxlbWVudHMgPT09IG51bGwgfHwgZWxlbWVudHMgPT09IHZvaWQgMCB8fCBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4gZWwuaHJlZiA9IGAke2Jhc2VVcmx9JHtpY29ufWApO1xuXHR9O1xuXHR3YXRjaChmYXZpY29uLCAoaSwgbykgPT4ge1xuXHRcdGlmICh0eXBlb2YgaSA9PT0gXCJzdHJpbmdcIiAmJiBpICE9PSBvKSBhcHBseUljb24oaSk7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHRyZXR1cm4gZmF2aWNvbjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRmV0Y2gvaW5kZXgudHNcbmNvbnN0IHBheWxvYWRNYXBwaW5nID0ge1xuXHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb25cIixcblx0dGV4dDogXCJ0ZXh0L3BsYWluXCJcbn07XG4vKipcbiogISEhSU1QT1JUQU5UISEhXG4qXG4qIElmIHlvdSB1cGRhdGUgdGhlIFVzZUZldGNoT3B0aW9ucyBpbnRlcmZhY2UsIGJlIHN1cmUgdG8gdXBkYXRlIHRoaXMgb2JqZWN0XG4qIHRvIGluY2x1ZGUgdGhlIG5ldyBvcHRpb25zXG4qL1xuZnVuY3Rpb24gaXNGZXRjaE9wdGlvbnMob2JqKSB7XG5cdHJldHVybiBvYmogJiYgY29udGFpbnNQcm9wKG9iaiwgXCJpbW1lZGlhdGVcIiwgXCJyZWZldGNoXCIsIFwiaW5pdGlhbERhdGFcIiwgXCJ0aW1lb3V0XCIsIFwiYmVmb3JlRmV0Y2hcIiwgXCJhZnRlckZldGNoXCIsIFwib25GZXRjaEVycm9yXCIsIFwiZmV0Y2hcIiwgXCJ1cGRhdGVEYXRhT25FcnJvclwiKTtcbn1cbmNvbnN0IHJlQWJzb2x1dGUgPSAvXig/OlthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaTtcbmZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG5cdHJldHVybiByZUFic29sdXRlLnRlc3QodXJsKTtcbn1cbmZ1bmN0aW9uIGhlYWRlcnNUb09iamVjdChoZWFkZXJzKSB7XG5cdGlmICh0eXBlb2YgSGVhZGVycyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhoZWFkZXJzLmVudHJpZXMoKSk7XG5cdHJldHVybiBoZWFkZXJzO1xufVxuZnVuY3Rpb24gY29tYmluZUNhbGxiYWNrcyhjb21iaW5hdGlvbiwgLi4uY2FsbGJhY2tzKSB7XG5cdGlmIChjb21iaW5hdGlvbiA9PT0gXCJvdmVyd3JpdGVcIikgcmV0dXJuIGFzeW5jIChjdHgpID0+IHtcblx0XHRsZXQgY2FsbGJhY2s7XG5cdFx0Zm9yIChsZXQgaSA9IGNhbGxiYWNrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGNhbGxiYWNrc1tpXSAhPSBudWxsKSB7XG5cdFx0XHRjYWxsYmFjayA9IGNhbGxiYWNrc1tpXTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpZiAoY2FsbGJhY2spIHJldHVybiB7XG5cdFx0XHQuLi5jdHgsXG5cdFx0XHQuLi5hd2FpdCBjYWxsYmFjayhjdHgpXG5cdFx0fTtcblx0XHRyZXR1cm4gY3R4O1xuXHR9O1xuXHRlbHNlIHJldHVybiBhc3luYyAoY3R4KSA9PiB7XG5cdFx0Zm9yIChjb25zdCBjYWxsYmFjayBvZiBjYWxsYmFja3MpIGlmIChjYWxsYmFjaykgY3R4ID0ge1xuXHRcdFx0Li4uY3R4LFxuXHRcdFx0Li4uYXdhaXQgY2FsbGJhY2soY3R4KVxuXHRcdH07XG5cdFx0cmV0dXJuIGN0eDtcblx0fTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZldGNoKGNvbmZpZyA9IHt9KSB7XG5cdGNvbnN0IF9jb21iaW5hdGlvbiA9IGNvbmZpZy5jb21iaW5hdGlvbiB8fCBcImNoYWluXCI7XG5cdGNvbnN0IF9vcHRpb25zID0gY29uZmlnLm9wdGlvbnMgfHwge307XG5cdGNvbnN0IF9mZXRjaE9wdGlvbnMgPSBjb25maWcuZmV0Y2hPcHRpb25zIHx8IHt9O1xuXHRmdW5jdGlvbiB1c2VGYWN0b3J5RmV0Y2godXJsLCAuLi5hcmdzKSB7XG5cdFx0Y29uc3QgY29tcHV0ZWRVcmwgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0XHRjb25zdCBiYXNlVXJsID0gdG9WYWx1ZShjb25maWcuYmFzZVVybCk7XG5cdFx0XHRjb25zdCB0YXJnZXRVcmwgPSB0b1ZhbHVlKHVybCk7XG5cdFx0XHRyZXR1cm4gYmFzZVVybCAmJiAhaXNBYnNvbHV0ZVVSTCh0YXJnZXRVcmwpID8gam9pblBhdGhzKGJhc2VVcmwsIHRhcmdldFVybCkgOiB0YXJnZXRVcmw7XG5cdFx0fSk7XG5cdFx0bGV0IG9wdGlvbnMgPSBfb3B0aW9ucztcblx0XHRsZXQgZmV0Y2hPcHRpb25zID0gX2ZldGNoT3B0aW9ucztcblx0XHRpZiAoYXJncy5sZW5ndGggPiAwKSBpZiAoaXNGZXRjaE9wdGlvbnMoYXJnc1swXSkpIG9wdGlvbnMgPSB7XG5cdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0Li4uYXJnc1swXSxcblx0XHRcdGJlZm9yZUZldGNoOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMuYmVmb3JlRmV0Y2gsIGFyZ3NbMF0uYmVmb3JlRmV0Y2gpLFxuXHRcdFx0YWZ0ZXJGZXRjaDogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLmFmdGVyRmV0Y2gsIGFyZ3NbMF0uYWZ0ZXJGZXRjaCksXG5cdFx0XHRvbkZldGNoRXJyb3I6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5vbkZldGNoRXJyb3IsIGFyZ3NbMF0ub25GZXRjaEVycm9yKVxuXHRcdH07XG5cdFx0ZWxzZSBmZXRjaE9wdGlvbnMgPSB7XG5cdFx0XHQuLi5mZXRjaE9wdGlvbnMsXG5cdFx0XHQuLi5hcmdzWzBdLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHQuLi5oZWFkZXJzVG9PYmplY3QoZmV0Y2hPcHRpb25zLmhlYWRlcnMpIHx8IHt9LFxuXHRcdFx0XHQuLi5oZWFkZXJzVG9PYmplY3QoYXJnc1swXS5oZWFkZXJzKSB8fCB7fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0aWYgKGFyZ3MubGVuZ3RoID4gMSAmJiBpc0ZldGNoT3B0aW9ucyhhcmdzWzFdKSkgb3B0aW9ucyA9IHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5hcmdzWzFdLFxuXHRcdFx0YmVmb3JlRmV0Y2g6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5iZWZvcmVGZXRjaCwgYXJnc1sxXS5iZWZvcmVGZXRjaCksXG5cdFx0XHRhZnRlckZldGNoOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMuYWZ0ZXJGZXRjaCwgYXJnc1sxXS5hZnRlckZldGNoKSxcblx0XHRcdG9uRmV0Y2hFcnJvcjogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLm9uRmV0Y2hFcnJvciwgYXJnc1sxXS5vbkZldGNoRXJyb3IpXG5cdFx0fTtcblx0XHRyZXR1cm4gdXNlRmV0Y2goY29tcHV0ZWRVcmwsIGZldGNoT3B0aW9ucywgb3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIHVzZUZhY3RvcnlGZXRjaDtcbn1cbmZ1bmN0aW9uIHVzZUZldGNoKHVybCwgLi4uYXJncykge1xuXHR2YXIgX2RlZmF1bHRXaW5kb3ckZmV0Y2gsIF9nbG9iYWxUaGlzO1xuXHRjb25zdCBzdXBwb3J0c0Fib3J0ID0gdHlwZW9mIEFib3J0Q29udHJvbGxlciA9PT0gXCJmdW5jdGlvblwiO1xuXHRsZXQgZmV0Y2hPcHRpb25zID0ge307XG5cdGxldCBvcHRpb25zID0ge1xuXHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRyZWZldGNoOiBmYWxzZSxcblx0XHR0aW1lb3V0OiAwLFxuXHRcdHVwZGF0ZURhdGFPbkVycm9yOiBmYWxzZVxuXHR9O1xuXHRjb25zdCBjb25maWcgPSB7XG5cdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdHBheWxvYWQ6IHZvaWQgMFxuXHR9O1xuXHRpZiAoYXJncy5sZW5ndGggPiAwKSBpZiAoaXNGZXRjaE9wdGlvbnMoYXJnc1swXSkpIG9wdGlvbnMgPSB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHQuLi5hcmdzWzBdXG5cdH07XG5cdGVsc2UgZmV0Y2hPcHRpb25zID0gYXJnc1swXTtcblx0aWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuXHRcdGlmIChpc0ZldGNoT3B0aW9ucyhhcmdzWzFdKSkgb3B0aW9ucyA9IHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5hcmdzWzFdXG5cdFx0fTtcblx0fVxuXHRjb25zdCB7IGZldGNoID0gKF9kZWZhdWx0V2luZG93JGZldGNoID0gZGVmYXVsdFdpbmRvdyA9PT0gbnVsbCB8fCBkZWZhdWx0V2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWZhdWx0V2luZG93LmZldGNoKSAhPT0gbnVsbCAmJiBfZGVmYXVsdFdpbmRvdyRmZXRjaCAhPT0gdm9pZCAwID8gX2RlZmF1bHRXaW5kb3ckZmV0Y2ggOiAoX2dsb2JhbFRoaXMgPSBnbG9iYWxUaGlzKSA9PT0gbnVsbCB8fCBfZ2xvYmFsVGhpcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dsb2JhbFRoaXMuZmV0Y2gsIGluaXRpYWxEYXRhLCB0aW1lb3V0IH0gPSBvcHRpb25zO1xuXHRjb25zdCByZXNwb25zZUV2ZW50ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IGVycm9yRXZlbnQgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgZmluYWxseUV2ZW50ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IGlzRmluaXNoZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaXNGZXRjaGluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBhYm9ydGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHN0YXR1c0NvZGUgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCByZXNwb25zZSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgZGF0YSA9IHNoYWxsb3dSZWYoaW5pdGlhbERhdGEgfHwgbnVsbCk7XG5cdGNvbnN0IGNhbkFib3J0ID0gY29tcHV0ZWQoKCkgPT4gc3VwcG9ydHNBYm9ydCAmJiBpc0ZldGNoaW5nLnZhbHVlKTtcblx0bGV0IGNvbnRyb2xsZXI7XG5cdGxldCB0aW1lcjtcblx0Y29uc3QgYWJvcnQgPSAocmVhc29uKSA9PiB7XG5cdFx0aWYgKHN1cHBvcnRzQWJvcnQpIHtcblx0XHRcdGNvbnRyb2xsZXIgPT09IG51bGwgfHwgY29udHJvbGxlciA9PT0gdm9pZCAwIHx8IGNvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcblx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cdFx0XHRjb250cm9sbGVyLnNpZ25hbC5vbmFib3J0ID0gKCkgPT4gYWJvcnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0XHRmZXRjaE9wdGlvbnMgPSB7XG5cdFx0XHRcdC4uLmZldGNoT3B0aW9ucyxcblx0XHRcdFx0c2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbFxuXHRcdFx0fTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGxvYWRpbmcgPSAoaXNMb2FkaW5nKSA9PiB7XG5cdFx0aXNGZXRjaGluZy52YWx1ZSA9IGlzTG9hZGluZztcblx0XHRpc0ZpbmlzaGVkLnZhbHVlID0gIWlzTG9hZGluZztcblx0fTtcblx0aWYgKHRpbWVvdXQpIHRpbWVyID0gdXNlVGltZW91dEZuKGFib3J0LCB0aW1lb3V0LCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdGxldCBleGVjdXRlQ291bnRlciA9IDA7XG5cdGNvbnN0IGV4ZWN1dGUgPSBhc3luYyAodGhyb3dPbkZhaWxlZCA9IGZhbHNlKSA9PiB7XG5cdFx0dmFyIF9jb250ZXh0JG9wdGlvbnM7XG5cdFx0YWJvcnQoKTtcblx0XHRsb2FkaW5nKHRydWUpO1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0XHRzdGF0dXNDb2RlLnZhbHVlID0gbnVsbDtcblx0XHRhYm9ydGVkLnZhbHVlID0gZmFsc2U7XG5cdFx0ZXhlY3V0ZUNvdW50ZXIgKz0gMTtcblx0XHRjb25zdCBjdXJyZW50RXhlY3V0ZUNvdW50ZXIgPSBleGVjdXRlQ291bnRlcjtcblx0XHRjb25zdCBkZWZhdWx0RmV0Y2hPcHRpb25zID0ge1xuXHRcdFx0bWV0aG9kOiBjb25maWcubWV0aG9kLFxuXHRcdFx0aGVhZGVyczoge31cblx0XHR9O1xuXHRcdGNvbnN0IHBheWxvYWQgPSB0b1ZhbHVlKGNvbmZpZy5wYXlsb2FkKTtcblx0XHRpZiAocGF5bG9hZCkge1xuXHRcdFx0dmFyIF9wYXlsb2FkTWFwcGluZyRjb25maTtcblx0XHRcdGNvbnN0IGhlYWRlcnMgPSBoZWFkZXJzVG9PYmplY3QoZGVmYXVsdEZldGNoT3B0aW9ucy5oZWFkZXJzKTtcblx0XHRcdGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBheWxvYWQpO1xuXHRcdFx0aWYgKCFjb25maWcucGF5bG9hZFR5cGUgJiYgcGF5bG9hZCAmJiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgQXJyYXkuaXNBcnJheShwcm90bykpICYmICEocGF5bG9hZCBpbnN0YW5jZW9mIEZvcm1EYXRhKSkgY29uZmlnLnBheWxvYWRUeXBlID0gXCJqc29uXCI7XG5cdFx0XHRpZiAoY29uZmlnLnBheWxvYWRUeXBlKSBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gKF9wYXlsb2FkTWFwcGluZyRjb25maSA9IHBheWxvYWRNYXBwaW5nW2NvbmZpZy5wYXlsb2FkVHlwZV0pICE9PSBudWxsICYmIF9wYXlsb2FkTWFwcGluZyRjb25maSAhPT0gdm9pZCAwID8gX3BheWxvYWRNYXBwaW5nJGNvbmZpIDogY29uZmlnLnBheWxvYWRUeXBlO1xuXHRcdFx0ZGVmYXVsdEZldGNoT3B0aW9ucy5ib2R5ID0gY29uZmlnLnBheWxvYWRUeXBlID09PSBcImpzb25cIiA/IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpIDogcGF5bG9hZDtcblx0XHR9XG5cdFx0bGV0IGlzQ2FuY2VsZWQgPSBmYWxzZTtcblx0XHRjb25zdCBjb250ZXh0ID0ge1xuXHRcdFx0dXJsOiB0b1ZhbHVlKHVybCksXG5cdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdC4uLmRlZmF1bHRGZXRjaE9wdGlvbnMsXG5cdFx0XHRcdC4uLmZldGNoT3B0aW9uc1xuXHRcdFx0fSxcblx0XHRcdGNhbmNlbDogKCkgPT4ge1xuXHRcdFx0XHRpc0NhbmNlbGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGlmIChvcHRpb25zLmJlZm9yZUZldGNoKSBPYmplY3QuYXNzaWduKGNvbnRleHQsIGF3YWl0IG9wdGlvbnMuYmVmb3JlRmV0Y2goY29udGV4dCkpO1xuXHRcdGlmIChpc0NhbmNlbGVkIHx8ICFmZXRjaCkge1xuXHRcdFx0bG9hZGluZyhmYWxzZSk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblx0XHRsZXQgcmVzcG9uc2VEYXRhID0gbnVsbDtcblx0XHRpZiAodGltZXIpIHRpbWVyLnN0YXJ0KCk7XG5cdFx0cmV0dXJuIGZldGNoKGNvbnRleHQudXJsLCB7XG5cdFx0XHQuLi5kZWZhdWx0RmV0Y2hPcHRpb25zLFxuXHRcdFx0Li4uY29udGV4dC5vcHRpb25zLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHQuLi5oZWFkZXJzVG9PYmplY3QoZGVmYXVsdEZldGNoT3B0aW9ucy5oZWFkZXJzKSxcblx0XHRcdFx0Li4uaGVhZGVyc1RvT2JqZWN0KChfY29udGV4dCRvcHRpb25zID0gY29udGV4dC5vcHRpb25zKSA9PT0gbnVsbCB8fCBfY29udGV4dCRvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY29udGV4dCRvcHRpb25zLmhlYWRlcnMpXG5cdFx0XHR9XG5cdFx0fSkudGhlbihhc3luYyAoZmV0Y2hSZXNwb25zZSkgPT4ge1xuXHRcdFx0cmVzcG9uc2UudmFsdWUgPSBmZXRjaFJlc3BvbnNlO1xuXHRcdFx0c3RhdHVzQ29kZS52YWx1ZSA9IGZldGNoUmVzcG9uc2Uuc3RhdHVzO1xuXHRcdFx0cmVzcG9uc2VEYXRhID0gYXdhaXQgZmV0Y2hSZXNwb25zZS5jbG9uZSgpW2NvbmZpZy50eXBlXSgpO1xuXHRcdFx0aWYgKCFmZXRjaFJlc3BvbnNlLm9rKSB7XG5cdFx0XHRcdGRhdGEudmFsdWUgPSBpbml0aWFsRGF0YSB8fCBudWxsO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoZmV0Y2hSZXNwb25zZS5zdGF0dXNUZXh0KTtcblx0XHRcdH1cblx0XHRcdGlmIChvcHRpb25zLmFmdGVyRmV0Y2gpICh7ZGF0YTogcmVzcG9uc2VEYXRhfSA9IGF3YWl0IG9wdGlvbnMuYWZ0ZXJGZXRjaCh7XG5cdFx0XHRcdGRhdGE6IHJlc3BvbnNlRGF0YSxcblx0XHRcdFx0cmVzcG9uc2U6IGZldGNoUmVzcG9uc2UsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdGV4ZWN1dGVcblx0XHRcdH0pKTtcblx0XHRcdGRhdGEudmFsdWUgPSByZXNwb25zZURhdGE7XG5cdFx0XHRyZXNwb25zZUV2ZW50LnRyaWdnZXIoZmV0Y2hSZXNwb25zZSk7XG5cdFx0XHRyZXR1cm4gZmV0Y2hSZXNwb25zZTtcblx0XHR9KS5jYXRjaChhc3luYyAoZmV0Y2hFcnJvcikgPT4ge1xuXHRcdFx0bGV0IGVycm9yRGF0YSA9IGZldGNoRXJyb3IubWVzc2FnZSB8fCBmZXRjaEVycm9yLm5hbWU7XG5cdFx0XHRpZiAob3B0aW9ucy5vbkZldGNoRXJyb3IpICh7ZXJyb3I6IGVycm9yRGF0YSwgZGF0YTogcmVzcG9uc2VEYXRhfSA9IGF3YWl0IG9wdGlvbnMub25GZXRjaEVycm9yKHtcblx0XHRcdFx0ZGF0YTogcmVzcG9uc2VEYXRhLFxuXHRcdFx0XHRlcnJvcjogZmV0Y2hFcnJvcixcblx0XHRcdFx0cmVzcG9uc2U6IHJlc3BvbnNlLnZhbHVlLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRleGVjdXRlXG5cdFx0XHR9KSk7XG5cdFx0XHRlcnJvci52YWx1ZSA9IGVycm9yRGF0YTtcblx0XHRcdGlmIChvcHRpb25zLnVwZGF0ZURhdGFPbkVycm9yKSBkYXRhLnZhbHVlID0gcmVzcG9uc2VEYXRhO1xuXHRcdFx0ZXJyb3JFdmVudC50cmlnZ2VyKGZldGNoRXJyb3IpO1xuXHRcdFx0aWYgKHRocm93T25GYWlsZWQpIHRocm93IGZldGNoRXJyb3I7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9KS5maW5hbGx5KCgpID0+IHtcblx0XHRcdGlmIChjdXJyZW50RXhlY3V0ZUNvdW50ZXIgPT09IGV4ZWN1dGVDb3VudGVyKSBsb2FkaW5nKGZhbHNlKTtcblx0XHRcdGlmICh0aW1lcikgdGltZXIuc3RvcCgpO1xuXHRcdFx0ZmluYWxseUV2ZW50LnRyaWdnZXIobnVsbCk7XG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IHJlZmV0Y2ggPSB0b1JlZihvcHRpb25zLnJlZmV0Y2gpO1xuXHR3YXRjaChbcmVmZXRjaCwgdG9SZWYodXJsKV0sIChbcmVmZXRjaCQxXSkgPT4gcmVmZXRjaCQxICYmIGV4ZWN1dGUoKSwgeyBkZWVwOiB0cnVlIH0pO1xuXHRjb25zdCBzaGVsbCA9IHtcblx0XHRpc0ZpbmlzaGVkOiByZWFkb25seShpc0ZpbmlzaGVkKSxcblx0XHRpc0ZldGNoaW5nOiByZWFkb25seShpc0ZldGNoaW5nKSxcblx0XHRzdGF0dXNDb2RlLFxuXHRcdHJlc3BvbnNlLFxuXHRcdGVycm9yLFxuXHRcdGRhdGEsXG5cdFx0Y2FuQWJvcnQsXG5cdFx0YWJvcnRlZCxcblx0XHRhYm9ydCxcblx0XHRleGVjdXRlLFxuXHRcdG9uRmV0Y2hSZXNwb25zZTogcmVzcG9uc2VFdmVudC5vbixcblx0XHRvbkZldGNoRXJyb3I6IGVycm9yRXZlbnQub24sXG5cdFx0b25GZXRjaEZpbmFsbHk6IGZpbmFsbHlFdmVudC5vbixcblx0XHRnZXQ6IHNldE1ldGhvZChcIkdFVFwiKSxcblx0XHRwdXQ6IHNldE1ldGhvZChcIlBVVFwiKSxcblx0XHRwb3N0OiBzZXRNZXRob2QoXCJQT1NUXCIpLFxuXHRcdGRlbGV0ZTogc2V0TWV0aG9kKFwiREVMRVRFXCIpLFxuXHRcdHBhdGNoOiBzZXRNZXRob2QoXCJQQVRDSFwiKSxcblx0XHRoZWFkOiBzZXRNZXRob2QoXCJIRUFEXCIpLFxuXHRcdG9wdGlvbnM6IHNldE1ldGhvZChcIk9QVElPTlNcIiksXG5cdFx0anNvbjogc2V0VHlwZShcImpzb25cIiksXG5cdFx0dGV4dDogc2V0VHlwZShcInRleHRcIiksXG5cdFx0YmxvYjogc2V0VHlwZShcImJsb2JcIiksXG5cdFx0YXJyYXlCdWZmZXI6IHNldFR5cGUoXCJhcnJheUJ1ZmZlclwiKSxcblx0XHRmb3JtRGF0YTogc2V0VHlwZShcImZvcm1EYXRhXCIpXG5cdH07XG5cdGZ1bmN0aW9uIHNldE1ldGhvZChtZXRob2QpIHtcblx0XHRyZXR1cm4gKHBheWxvYWQsIHBheWxvYWRUeXBlKSA9PiB7XG5cdFx0XHRpZiAoIWlzRmV0Y2hpbmcudmFsdWUpIHtcblx0XHRcdFx0Y29uZmlnLm1ldGhvZCA9IG1ldGhvZDtcblx0XHRcdFx0Y29uZmlnLnBheWxvYWQgPSBwYXlsb2FkO1xuXHRcdFx0XHRjb25maWcucGF5bG9hZFR5cGUgPSBwYXlsb2FkVHlwZTtcblx0XHRcdFx0aWYgKGlzUmVmKGNvbmZpZy5wYXlsb2FkKSkgd2F0Y2goW3JlZmV0Y2gsIHRvUmVmKGNvbmZpZy5wYXlsb2FkKV0sIChbcmVmZXRjaCQxXSkgPT4gcmVmZXRjaCQxICYmIGV4ZWN1dGUoKSwgeyBkZWVwOiB0cnVlIH0pO1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdC4uLnNoZWxsLFxuXHRcdFx0XHRcdHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB3YWl0VW50aWxGaW5pc2hlZCgpLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cdGZ1bmN0aW9uIHdhaXRVbnRpbEZpbmlzaGVkKCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR1bnRpbChpc0ZpbmlzaGVkKS50b0JlKHRydWUpLnRoZW4oKCkgPT4gcmVzb2x2ZShzaGVsbCkpLmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cblx0ZnVuY3Rpb24gc2V0VHlwZSh0eXBlKSB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGlmICghaXNGZXRjaGluZy52YWx1ZSkge1xuXHRcdFx0XHRjb25maWcudHlwZSA9IHR5cGU7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0Li4uc2hlbGwsXG5cdFx0XHRcdFx0dGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHdhaXRVbnRpbEZpbmlzaGVkKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0aWYgKG9wdGlvbnMuaW1tZWRpYXRlKSBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGV4ZWN1dGUoKSk7XG5cdHJldHVybiB7XG5cdFx0Li4uc2hlbGwsXG5cdFx0dGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuXHRcdFx0cmV0dXJuIHdhaXRVbnRpbEZpbmlzaGVkKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdFx0fVxuXHR9O1xufVxuZnVuY3Rpb24gam9pblBhdGhzKHN0YXJ0LCBlbmQpIHtcblx0aWYgKCFzdGFydC5lbmRzV2l0aChcIi9cIikgJiYgIWVuZC5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuIGAke3N0YXJ0fS8ke2VuZH1gO1xuXHRpZiAoc3RhcnQuZW5kc1dpdGgoXCIvXCIpICYmIGVuZC5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuIGAke3N0YXJ0LnNsaWNlKDAsIC0xKX0ke2VuZH1gO1xuXHRyZXR1cm4gYCR7c3RhcnR9JHtlbmR9YDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRmlsZURpYWxvZy9pbmRleC50c1xuY29uc3QgREVGQVVMVF9PUFRJT05TID0ge1xuXHRtdWx0aXBsZTogdHJ1ZSxcblx0YWNjZXB0OiBcIipcIixcblx0cmVzZXQ6IGZhbHNlLFxuXHRkaXJlY3Rvcnk6IGZhbHNlXG59O1xuZnVuY3Rpb24gcHJlcGFyZUluaXRpYWxGaWxlcyhmaWxlcykge1xuXHRpZiAoIWZpbGVzKSByZXR1cm4gbnVsbDtcblx0aWYgKGZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QpIHJldHVybiBmaWxlcztcblx0Y29uc3QgZHQgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XG5cdGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgZHQuaXRlbXMuYWRkKGZpbGUpO1xuXHRyZXR1cm4gZHQuZmlsZXM7XG59XG4vKipcbiogT3BlbiBmaWxlIGRpYWxvZyB3aXRoIGVhc2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZpbGVEaWFsb2dcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VGaWxlRGlhbG9nKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBmaWxlcyA9IHJlZihwcmVwYXJlSW5pdGlhbEZpbGVzKG9wdGlvbnMuaW5pdGlhbEZpbGVzKSk7XG5cdGNvbnN0IHsgb246IG9uQ2hhbmdlLCB0cmlnZ2VyOiBjaGFuZ2VUcmlnZ2VyIH0gPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgeyBvbjogb25DYW5jZWwsIHRyaWdnZXI6IGNhbmNlbFRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBpbnB1dFJlZiA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX3VucmVmRWxlbWVudDtcblx0XHRjb25zdCBpbnB1dCA9IChfdW5yZWZFbGVtZW50ID0gdW5yZWZFbGVtZW50KG9wdGlvbnMuaW5wdXQpKSAhPT0gbnVsbCAmJiBfdW5yZWZFbGVtZW50ICE9PSB2b2lkIDAgPyBfdW5yZWZFbGVtZW50IDogZG9jdW1lbnQkMSA/IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChcImlucHV0XCIpIDogdm9pZCAwO1xuXHRcdGlmIChpbnB1dCkge1xuXHRcdFx0aW5wdXQudHlwZSA9IFwiZmlsZVwiO1xuXHRcdFx0aW5wdXQub25jaGFuZ2UgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0ZmlsZXMudmFsdWUgPSBldmVudC50YXJnZXQuZmlsZXM7XG5cdFx0XHRcdGNoYW5nZVRyaWdnZXIoZmlsZXMudmFsdWUpO1xuXHRcdFx0fTtcblx0XHRcdGlucHV0Lm9uY2FuY2VsID0gKCkgPT4ge1xuXHRcdFx0XHRjYW5jZWxUcmlnZ2VyKCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gaW5wdXQ7XG5cdH0pO1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHRmaWxlcy52YWx1ZSA9IG51bGw7XG5cdFx0aWYgKGlucHV0UmVmLnZhbHVlICYmIGlucHV0UmVmLnZhbHVlLnZhbHVlKSB7XG5cdFx0XHRpbnB1dFJlZi52YWx1ZS52YWx1ZSA9IFwiXCI7XG5cdFx0XHRjaGFuZ2VUcmlnZ2VyKG51bGwpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgYXBwbHlPcHRpb25zID0gKG9wdGlvbnMkMSkgPT4ge1xuXHRcdGNvbnN0IGVsID0gaW5wdXRSZWYudmFsdWU7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGVsLm11bHRpcGxlID0gdG9WYWx1ZShvcHRpb25zJDEubXVsdGlwbGUpO1xuXHRcdGVsLmFjY2VwdCA9IHRvVmFsdWUob3B0aW9ucyQxLmFjY2VwdCk7XG5cdFx0ZWwud2Via2l0ZGlyZWN0b3J5ID0gdG9WYWx1ZShvcHRpb25zJDEuZGlyZWN0b3J5KTtcblx0XHRpZiAoaGFzT3duKG9wdGlvbnMkMSwgXCJjYXB0dXJlXCIpKSBlbC5jYXB0dXJlID0gdG9WYWx1ZShvcHRpb25zJDEuY2FwdHVyZSk7XG5cdH07XG5cdGNvbnN0IG9wZW4gPSAobG9jYWxPcHRpb25zKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSBpbnB1dFJlZi52YWx1ZTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0Y29uc3QgbWVyZ2VkT3B0aW9ucyA9IHtcblx0XHRcdC4uLkRFRkFVTFRfT1BUSU9OUyxcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5sb2NhbE9wdGlvbnNcblx0XHR9O1xuXHRcdGFwcGx5T3B0aW9ucyhtZXJnZWRPcHRpb25zKTtcblx0XHRpZiAodG9WYWx1ZShtZXJnZWRPcHRpb25zLnJlc2V0KSkgcmVzZXQoKTtcblx0XHRlbC5jbGljaygpO1xuXHR9O1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0YXBwbHlPcHRpb25zKG9wdGlvbnMpO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRmaWxlczogcmVhZG9ubHkoZmlsZXMpLFxuXHRcdG9wZW4sXG5cdFx0cmVzZXQsXG5cdFx0b25DYW5jZWwsXG5cdFx0b25DaGFuZ2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRmlsZVN5c3RlbUFjY2Vzcy9pbmRleC50c1xuZnVuY3Rpb24gdXNlRmlsZVN5c3RlbUFjY2VzcyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IF93aW5kb3cgPSBkZWZhdWx0V2luZG93LCBkYXRhVHlwZSA9IFwiVGV4dFwiIH0gPSBvcHRpb25zO1xuXHRjb25zdCB3aW5kb3ckMSA9IF93aW5kb3c7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcInNob3dTYXZlRmlsZVBpY2tlclwiIGluIHdpbmRvdyQxICYmIFwic2hvd09wZW5GaWxlUGlja2VyXCIgaW4gd2luZG93JDEpO1xuXHRjb25zdCBmaWxlSGFuZGxlID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBkYXRhID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBmaWxlID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBmaWxlTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX2ZpbGUkdmFsdWUkbmFtZSwgX2ZpbGUkdmFsdWU7XG5cdFx0cmV0dXJuIChfZmlsZSR2YWx1ZSRuYW1lID0gKF9maWxlJHZhbHVlID0gZmlsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGUkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlLm5hbWUpICE9PSBudWxsICYmIF9maWxlJHZhbHVlJG5hbWUgIT09IHZvaWQgMCA/IF9maWxlJHZhbHVlJG5hbWUgOiBcIlwiO1xuXHR9KTtcblx0Y29uc3QgZmlsZU1JTUUgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF9maWxlJHZhbHVlJHR5cGUsIF9maWxlJHZhbHVlMjtcblx0XHRyZXR1cm4gKF9maWxlJHZhbHVlJHR5cGUgPSAoX2ZpbGUkdmFsdWUyID0gZmlsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGUkdmFsdWUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsZSR2YWx1ZTIudHlwZSkgIT09IG51bGwgJiYgX2ZpbGUkdmFsdWUkdHlwZSAhPT0gdm9pZCAwID8gX2ZpbGUkdmFsdWUkdHlwZSA6IFwiXCI7XG5cdH0pO1xuXHRjb25zdCBmaWxlU2l6ZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX2ZpbGUkdmFsdWUkc2l6ZSwgX2ZpbGUkdmFsdWUzO1xuXHRcdHJldHVybiAoX2ZpbGUkdmFsdWUkc2l6ZSA9IChfZmlsZSR2YWx1ZTMgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZTMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlMy5zaXplKSAhPT0gbnVsbCAmJiBfZmlsZSR2YWx1ZSRzaXplICE9PSB2b2lkIDAgPyBfZmlsZSR2YWx1ZSRzaXplIDogMDtcblx0fSk7XG5cdGNvbnN0IGZpbGVMYXN0TW9kaWZpZWQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF9maWxlJHZhbHVlJGxhc3RNb2RpZiwgX2ZpbGUkdmFsdWU0O1xuXHRcdHJldHVybiAoX2ZpbGUkdmFsdWUkbGFzdE1vZGlmID0gKF9maWxlJHZhbHVlNCA9IGZpbGUudmFsdWUpID09PSBudWxsIHx8IF9maWxlJHZhbHVlNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWU0Lmxhc3RNb2RpZmllZCkgIT09IG51bGwgJiYgX2ZpbGUkdmFsdWUkbGFzdE1vZGlmICE9PSB2b2lkIDAgPyBfZmlsZSR2YWx1ZSRsYXN0TW9kaWYgOiAwO1xuXHR9KTtcblx0YXN5bmMgZnVuY3Rpb24gb3Blbihfb3B0aW9ucyA9IHt9KSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IFtoYW5kbGVdID0gYXdhaXQgd2luZG93JDEuc2hvd09wZW5GaWxlUGlja2VyKHtcblx0XHRcdC4uLnRvVmFsdWUob3B0aW9ucyksXG5cdFx0XHQuLi5fb3B0aW9uc1xuXHRcdH0pO1xuXHRcdGZpbGVIYW5kbGUudmFsdWUgPSBoYW5kbGU7XG5cdFx0YXdhaXQgdXBkYXRlRGF0YSgpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZShfb3B0aW9ucyA9IHt9KSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGZpbGVIYW5kbGUudmFsdWUgPSBhd2FpdCB3aW5kb3ckMS5zaG93U2F2ZUZpbGVQaWNrZXIoe1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLl9vcHRpb25zXG5cdFx0fSk7XG5cdFx0ZGF0YS52YWx1ZSA9IHZvaWQgMDtcblx0XHRhd2FpdCB1cGRhdGVEYXRhKCk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gc2F2ZShfb3B0aW9ucyA9IHt9KSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmICghZmlsZUhhbmRsZS52YWx1ZSkgcmV0dXJuIHNhdmVBcyhfb3B0aW9ucyk7XG5cdFx0aWYgKGRhdGEudmFsdWUpIHtcblx0XHRcdGNvbnN0IHdyaXRhYmxlU3RyZWFtID0gYXdhaXQgZmlsZUhhbmRsZS52YWx1ZS5jcmVhdGVXcml0YWJsZSgpO1xuXHRcdFx0YXdhaXQgd3JpdGFibGVTdHJlYW0ud3JpdGUoZGF0YS52YWx1ZSk7XG5cdFx0XHRhd2FpdCB3cml0YWJsZVN0cmVhbS5jbG9zZSgpO1xuXHRcdH1cblx0XHRhd2FpdCB1cGRhdGVGaWxlKCk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gc2F2ZUFzKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0ZmlsZUhhbmRsZS52YWx1ZSA9IGF3YWl0IHdpbmRvdyQxLnNob3dTYXZlRmlsZVBpY2tlcih7XG5cdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0Li4uX29wdGlvbnNcblx0XHR9KTtcblx0XHRpZiAoZGF0YS52YWx1ZSkge1xuXHRcdFx0Y29uc3Qgd3JpdGFibGVTdHJlYW0gPSBhd2FpdCBmaWxlSGFuZGxlLnZhbHVlLmNyZWF0ZVdyaXRhYmxlKCk7XG5cdFx0XHRhd2FpdCB3cml0YWJsZVN0cmVhbS53cml0ZShkYXRhLnZhbHVlKTtcblx0XHRcdGF3YWl0IHdyaXRhYmxlU3RyZWFtLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHVwZGF0ZUZpbGUoKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiB1cGRhdGVGaWxlKCkge1xuXHRcdHZhciBfZmlsZUhhbmRsZSR2YWx1ZTtcblx0XHRmaWxlLnZhbHVlID0gYXdhaXQgKChfZmlsZUhhbmRsZSR2YWx1ZSA9IGZpbGVIYW5kbGUudmFsdWUpID09PSBudWxsIHx8IF9maWxlSGFuZGxlJHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsZUhhbmRsZSR2YWx1ZS5nZXRGaWxlKCkpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XG5cdFx0dmFyIF9maWxlJHZhbHVlNSwgX2ZpbGUkdmFsdWU2O1xuXHRcdGF3YWl0IHVwZGF0ZUZpbGUoKTtcblx0XHRjb25zdCB0eXBlID0gdG9WYWx1ZShkYXRhVHlwZSk7XG5cdFx0aWYgKHR5cGUgPT09IFwiVGV4dFwiKSBkYXRhLnZhbHVlID0gYXdhaXQgKChfZmlsZSR2YWx1ZTUgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZTUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlNS50ZXh0KCkpO1xuXHRcdGVsc2UgaWYgKHR5cGUgPT09IFwiQXJyYXlCdWZmZXJcIikgZGF0YS52YWx1ZSA9IGF3YWl0ICgoX2ZpbGUkdmFsdWU2ID0gZmlsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGUkdmFsdWU2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsZSR2YWx1ZTYuYXJyYXlCdWZmZXIoKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJCbG9iXCIpIGRhdGEudmFsdWUgPSBmaWxlLnZhbHVlO1xuXHR9XG5cdHdhdGNoKCgpID0+IHRvVmFsdWUoZGF0YVR5cGUpLCB1cGRhdGVEYXRhKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRkYXRhLFxuXHRcdGZpbGUsXG5cdFx0ZmlsZU5hbWUsXG5cdFx0ZmlsZU1JTUUsXG5cdFx0ZmlsZVNpemUsXG5cdFx0ZmlsZUxhc3RNb2RpZmllZCxcblx0XHRvcGVuLFxuXHRcdGNyZWF0ZSxcblx0XHRzYXZlLFxuXHRcdHNhdmVBcyxcblx0XHR1cGRhdGVEYXRhXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUZvY3VzL2luZGV4LnRzXG4vKipcbiogVHJhY2sgb3Igc2V0IHRoZSBmb2N1cyBzdGF0ZSBvZiBhIERPTSBlbGVtZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VGb2N1c1xuKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudCBmb3IgdGhlIGZvY3VzIGFuZCBibHVyIGV2ZW50cy5cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VGb2N1cyh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluaXRpYWxWYWx1ZSA9IGZhbHNlLCBmb2N1c1Zpc2libGUgPSBmYWxzZSwgcHJldmVudFNjcm9sbCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpbm5lckZvY3VzZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgdGFyZ2V0RWxlbWVudCA9IGNvbXB1dGVkKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpKTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgXCJmb2N1c1wiLCAoZXZlbnQpID0+IHtcblx0XHR2YXIgX21hdGNoZXMsIF9yZWY7XG5cdFx0aWYgKCFmb2N1c1Zpc2libGUgfHwgKChfbWF0Y2hlcyA9IChfcmVmID0gZXZlbnQudGFyZ2V0KS5tYXRjaGVzKSA9PT0gbnVsbCB8fCBfbWF0Y2hlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX21hdGNoZXMuY2FsbChfcmVmLCBcIjpmb2N1cy12aXNpYmxlXCIpKSkgaW5uZXJGb2N1c2VkLnZhbHVlID0gdHJ1ZTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBcImJsdXJcIiwgKCkgPT4gaW5uZXJGb2N1c2VkLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGNvbnN0IGZvY3VzZWQgPSBjb21wdXRlZCh7XG5cdFx0Z2V0OiAoKSA9PiBpbm5lckZvY3VzZWQudmFsdWUsXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHR2YXIgX3RhcmdldEVsZW1lbnQkdmFsdWUsIF90YXJnZXRFbGVtZW50JHZhbHVlMjtcblx0XHRcdGlmICghdmFsdWUgJiYgaW5uZXJGb2N1c2VkLnZhbHVlKSAoX3RhcmdldEVsZW1lbnQkdmFsdWUgPSB0YXJnZXRFbGVtZW50LnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0RWxlbWVudCR2YWx1ZSA9PT0gdm9pZCAwIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlLmJsdXIoKTtcblx0XHRcdGVsc2UgaWYgKHZhbHVlICYmICFpbm5lckZvY3VzZWQudmFsdWUpIChfdGFyZ2V0RWxlbWVudCR2YWx1ZTIgPSB0YXJnZXRFbGVtZW50LnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0RWxlbWVudCR2YWx1ZTIgPT09IHZvaWQgMCB8fCBfdGFyZ2V0RWxlbWVudCR2YWx1ZTIuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsIH0pO1xuXHRcdH1cblx0fSk7XG5cdHdhdGNoKHRhcmdldEVsZW1lbnQsICgpID0+IHtcblx0XHRmb2N1c2VkLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuXHR9LCB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdGZsdXNoOiBcInBvc3RcIlxuXHR9KTtcblx0cmV0dXJuIHsgZm9jdXNlZCB9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGb2N1c1dpdGhpbi9pbmRleC50c1xuY29uc3QgRVZFTlRfRk9DVVNfSU4gPSBcImZvY3VzaW5cIjtcbmNvbnN0IEVWRU5UX0ZPQ1VTX09VVCA9IFwiZm9jdXNvdXRcIjtcbmNvbnN0IFBTRVVET19DTEFTU19GT0NVU19XSVRISU4gPSBcIjpmb2N1cy13aXRoaW5cIjtcbi8qKlxuKiBUcmFjayBpZiBmb2N1cyBpcyBjb250YWluZWQgd2l0aGluIHRoZSB0YXJnZXQgZWxlbWVudFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VGb2N1c1dpdGhpblxuKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudCB0byB0cmFja1xuKiBAcGFyYW0gb3B0aW9ucyBGb2N1cyB3aXRoaW4gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUZvY3VzV2l0aGluKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHRhcmdldEVsZW1lbnQgPSBjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSk7XG5cdGNvbnN0IF9mb2N1c2VkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGZvY3VzZWQgPSBjb21wdXRlZCgoKSA9PiBfZm9jdXNlZC52YWx1ZSk7XG5cdGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB1c2VBY3RpdmVFbGVtZW50KG9wdGlvbnMpO1xuXHRpZiAoIXdpbmRvdyQxIHx8ICFhY3RpdmVFbGVtZW50LnZhbHVlKSByZXR1cm4geyBmb2N1c2VkIH07XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIEVWRU5UX0ZPQ1VTX0lOLCAoKSA9PiBfZm9jdXNlZC52YWx1ZSA9IHRydWUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgRVZFTlRfRk9DVVNfT1VULCAoKSA9PiB7XG5cdFx0dmFyIF90YXJnZXRFbGVtZW50JHZhbHVlJCwgX3RhcmdldEVsZW1lbnQkdmFsdWUsIF90YXJnZXRFbGVtZW50JHZhbHVlJDI7XG5cdFx0cmV0dXJuIF9mb2N1c2VkLnZhbHVlID0gKF90YXJnZXRFbGVtZW50JHZhbHVlJCA9IChfdGFyZ2V0RWxlbWVudCR2YWx1ZSA9IHRhcmdldEVsZW1lbnQudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlID09PSB2b2lkIDAgfHwgKF90YXJnZXRFbGVtZW50JHZhbHVlJDIgPSBfdGFyZ2V0RWxlbWVudCR2YWx1ZS5tYXRjaGVzKSA9PT0gbnVsbCB8fCBfdGFyZ2V0RWxlbWVudCR2YWx1ZSQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGFyZ2V0RWxlbWVudCR2YWx1ZSQyLmNhbGwoX3RhcmdldEVsZW1lbnQkdmFsdWUsIFBTRVVET19DTEFTU19GT0NVU19XSVRISU4pKSAhPT0gbnVsbCAmJiBfdGFyZ2V0RWxlbWVudCR2YWx1ZSQgIT09IHZvaWQgMCA/IF90YXJnZXRFbGVtZW50JHZhbHVlJCA6IGZhbHNlO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRyZXR1cm4geyBmb2N1c2VkIH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUZwcy9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZUZwcyhvcHRpb25zKSB7XG5cdHZhciBfb3B0aW9ucyRldmVyeTtcblx0Y29uc3QgZnBzID0gc2hhbGxvd1JlZigwKTtcblx0aWYgKHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZwcztcblx0Y29uc3QgZXZlcnkgPSAoX29wdGlvbnMkZXZlcnkgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZXZlcnkpICE9PSBudWxsICYmIF9vcHRpb25zJGV2ZXJ5ICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRldmVyeSA6IDEwO1xuXHRsZXQgbGFzdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXHRsZXQgdGlja3MgPSAwO1xuXHR1c2VSYWZGbigoKSA9PiB7XG5cdFx0dGlja3MgKz0gMTtcblx0XHRpZiAodGlja3MgPj0gZXZlcnkpIHtcblx0XHRcdGNvbnN0IG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXHRcdFx0Y29uc3QgZGlmZiA9IG5vdyAtIGxhc3Q7XG5cdFx0XHRmcHMudmFsdWUgPSBNYXRoLnJvdW5kKDFlMyAvIChkaWZmIC8gdGlja3MpKTtcblx0XHRcdGxhc3QgPSBub3c7XG5cdFx0XHR0aWNrcyA9IDA7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGZwcztcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRnVsbHNjcmVlbi9pbmRleC50c1xuY29uc3QgZXZlbnRIYW5kbGVycyA9IFtcblx0XCJmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFwid2Via2l0ZnVsbHNjcmVlbmNoYW5nZVwiLFxuXHRcIndlYmtpdGVuZGZ1bGxzY3JlZW5cIixcblx0XCJtb3pmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFwiTVNGdWxsc2NyZWVuQ2hhbmdlXCJcbl07XG4vKipcbiogUmVhY3RpdmUgRnVsbHNjcmVlbiBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZ1bGxzY3JlZW5cbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUZ1bGxzY3JlZW4odGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgYXV0b0V4aXQgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgdGFyZ2V0UmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfdW5yZWZFbGVtZW50O1xuXHRcdHJldHVybiAoX3VucmVmRWxlbWVudCA9IHVucmVmRWxlbWVudCh0YXJnZXQpKSAhPT0gbnVsbCAmJiBfdW5yZWZFbGVtZW50ICE9PSB2b2lkIDAgPyBfdW5yZWZFbGVtZW50IDogZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmRvY3VtZW50RWxlbWVudDtcblx0fSk7XG5cdGNvbnN0IGlzRnVsbHNjcmVlbiA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCByZXF1ZXN0TWV0aG9kID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiBbXG5cdFx0XHRcInJlcXVlc3RGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEVudGVyRnVsbHNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRcdFwid2Via2l0UmVxdWVzdEZ1bGxTY3JlZW5cIixcblx0XHRcdFwibW96UmVxdWVzdEZ1bGxTY3JlZW5cIixcblx0XHRcdFwibXNSZXF1ZXN0RnVsbHNjcmVlblwiXG5cdFx0XS5maW5kKChtKSA9PiBkb2N1bWVudCQxICYmIG0gaW4gZG9jdW1lbnQkMSB8fCB0YXJnZXRSZWYudmFsdWUgJiYgbSBpbiB0YXJnZXRSZWYudmFsdWUpO1xuXHR9KTtcblx0Y29uc3QgZXhpdE1ldGhvZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0XCJleGl0RnVsbHNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRFeGl0RnVsbHNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRFeGl0RnVsbFNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRDYW5jZWxGdWxsU2NyZWVuXCIsXG5cdFx0XHRcIm1vekNhbmNlbEZ1bGxTY3JlZW5cIixcblx0XHRcdFwibXNFeGl0RnVsbHNjcmVlblwiXG5cdFx0XS5maW5kKChtKSA9PiBkb2N1bWVudCQxICYmIG0gaW4gZG9jdW1lbnQkMSB8fCB0YXJnZXRSZWYudmFsdWUgJiYgbSBpbiB0YXJnZXRSZWYudmFsdWUpO1xuXHR9KTtcblx0Y29uc3QgZnVsbHNjcmVlbkVuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdFwiZnVsbFNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRJc0Z1bGxTY3JlZW5cIixcblx0XHRcdFwid2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW5cIixcblx0XHRcdFwibW96RnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtc0Z1bGxzY3JlZW5FbGVtZW50XCJcblx0XHRdLmZpbmQoKG0pID0+IGRvY3VtZW50JDEgJiYgbSBpbiBkb2N1bWVudCQxIHx8IHRhcmdldFJlZi52YWx1ZSAmJiBtIGluIHRhcmdldFJlZi52YWx1ZSk7XG5cdH0pO1xuXHRjb25zdCBmdWxsc2NyZWVuRWxlbWVudE1ldGhvZCA9IFtcblx0XHRcImZ1bGxzY3JlZW5FbGVtZW50XCIsXG5cdFx0XCJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudFwiLFxuXHRcdFwibW96RnVsbFNjcmVlbkVsZW1lbnRcIixcblx0XHRcIm1zRnVsbHNjcmVlbkVsZW1lbnRcIlxuXHRdLmZpbmQoKG0pID0+IGRvY3VtZW50JDEgJiYgbSBpbiBkb2N1bWVudCQxKTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHRhcmdldFJlZi52YWx1ZSAmJiBkb2N1bWVudCQxICYmIHJlcXVlc3RNZXRob2QudmFsdWUgIT09IHZvaWQgMCAmJiBleGl0TWV0aG9kLnZhbHVlICE9PSB2b2lkIDAgJiYgZnVsbHNjcmVlbkVuYWJsZWQudmFsdWUgIT09IHZvaWQgMCk7XG5cdGNvbnN0IGlzQ3VycmVudEVsZW1lbnRGdWxsU2NyZWVuID0gKCkgPT4ge1xuXHRcdGlmIChmdWxsc2NyZWVuRWxlbWVudE1ldGhvZCkgcmV0dXJuIChkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDFbZnVsbHNjcmVlbkVsZW1lbnRNZXRob2RdKSA9PT0gdGFyZ2V0UmVmLnZhbHVlO1xuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0Y29uc3QgaXNFbGVtZW50RnVsbFNjcmVlbiA9ICgpID0+IHtcblx0XHRpZiAoZnVsbHNjcmVlbkVuYWJsZWQudmFsdWUpIGlmIChkb2N1bWVudCQxICYmIGRvY3VtZW50JDFbZnVsbHNjcmVlbkVuYWJsZWQudmFsdWVdICE9IG51bGwpIHJldHVybiBkb2N1bWVudCQxW2Z1bGxzY3JlZW5FbmFibGVkLnZhbHVlXTtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHRhcmdldCQxID0gdGFyZ2V0UmVmLnZhbHVlO1xuXHRcdFx0aWYgKCh0YXJnZXQkMSA9PT0gbnVsbCB8fCB0YXJnZXQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0JDFbZnVsbHNjcmVlbkVuYWJsZWQudmFsdWVdKSAhPSBudWxsKSByZXR1cm4gQm9vbGVhbih0YXJnZXQkMVtmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZV0pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cdGFzeW5jIGZ1bmN0aW9uIGV4aXQoKSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCAhaXNGdWxsc2NyZWVuLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKGV4aXRNZXRob2QudmFsdWUpIGlmICgoZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxW2V4aXRNZXRob2QudmFsdWVdKSAhPSBudWxsKSBhd2FpdCBkb2N1bWVudCQxW2V4aXRNZXRob2QudmFsdWVdKCk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCB0YXJnZXQkMSA9IHRhcmdldFJlZi52YWx1ZTtcblx0XHRcdGlmICgodGFyZ2V0JDEgPT09IG51bGwgfHwgdGFyZ2V0JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldCQxW2V4aXRNZXRob2QudmFsdWVdKSAhPSBudWxsKSBhd2FpdCB0YXJnZXQkMVtleGl0TWV0aG9kLnZhbHVlXSgpO1xuXHRcdH1cblx0XHRpc0Z1bGxzY3JlZW4udmFsdWUgPSBmYWxzZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBlbnRlcigpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8IGlzRnVsbHNjcmVlbi52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmIChpc0VsZW1lbnRGdWxsU2NyZWVuKCkpIGF3YWl0IGV4aXQoKTtcblx0XHRjb25zdCB0YXJnZXQkMSA9IHRhcmdldFJlZi52YWx1ZTtcblx0XHRpZiAocmVxdWVzdE1ldGhvZC52YWx1ZSAmJiAodGFyZ2V0JDEgPT09IG51bGwgfHwgdGFyZ2V0JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldCQxW3JlcXVlc3RNZXRob2QudmFsdWVdKSAhPSBudWxsKSB7XG5cdFx0XHRhd2FpdCB0YXJnZXQkMVtyZXF1ZXN0TWV0aG9kLnZhbHVlXSgpO1xuXHRcdFx0aXNGdWxsc2NyZWVuLnZhbHVlID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHRcdGF3YWl0IChpc0Z1bGxzY3JlZW4udmFsdWUgPyBleGl0KCkgOiBlbnRlcigpKTtcblx0fVxuXHRjb25zdCBoYW5kbGVyQ2FsbGJhY2sgPSAoKSA9PiB7XG5cdFx0Y29uc3QgaXNFbGVtZW50RnVsbFNjcmVlblZhbHVlID0gaXNFbGVtZW50RnVsbFNjcmVlbigpO1xuXHRcdGlmICghaXNFbGVtZW50RnVsbFNjcmVlblZhbHVlIHx8IGlzRWxlbWVudEZ1bGxTY3JlZW5WYWx1ZSAmJiBpc0N1cnJlbnRFbGVtZW50RnVsbFNjcmVlbigpKSBpc0Z1bGxzY3JlZW4udmFsdWUgPSBpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWU7XG5cdH07XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRjYXB0dXJlOiBmYWxzZSxcblx0XHRwYXNzaXZlOiB0cnVlXG5cdH07XG5cdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgZXZlbnRIYW5kbGVycywgaGFuZGxlckNhbGxiYWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXRSZWYpLCBldmVudEhhbmRsZXJzLCBoYW5kbGVyQ2FsbGJhY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHRyeU9uTW91bnRlZChoYW5kbGVyQ2FsbGJhY2ssIGZhbHNlKTtcblx0aWYgKGF1dG9FeGl0KSB0cnlPblNjb3BlRGlzcG9zZShleGl0KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRpc0Z1bGxzY3JlZW4sXG5cdFx0ZW50ZXIsXG5cdFx0ZXhpdCxcblx0XHR0b2dnbGVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlR2FtZXBhZC9pbmRleC50c1xuLyoqXG4qIE1hcHMgYSBzdGFuZGFyZCBzdGFuZGFyZCBnYW1lcGFkIHRvIGFuIFhib3ggMzYwIENvbnRyb2xsZXIuXG4qL1xuZnVuY3Rpb24gbWFwR2FtZXBhZFRvWGJveDM2MENvbnRyb2xsZXIoZ2FtZXBhZCkge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmIChnYW1lcGFkLnZhbHVlKSByZXR1cm4ge1xuXHRcdFx0YnV0dG9uczoge1xuXHRcdFx0XHRhOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMF0sXG5cdFx0XHRcdGI6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1sxXSxcblx0XHRcdFx0eDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzJdLFxuXHRcdFx0XHR5OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbM11cblx0XHRcdH0sXG5cdFx0XHRidW1wZXI6IHtcblx0XHRcdFx0bGVmdDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzRdLFxuXHRcdFx0XHRyaWdodDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzVdXG5cdFx0XHR9LFxuXHRcdFx0dHJpZ2dlcnM6IHtcblx0XHRcdFx0bGVmdDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzZdLFxuXHRcdFx0XHRyaWdodDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzddXG5cdFx0XHR9LFxuXHRcdFx0c3RpY2s6IHtcblx0XHRcdFx0bGVmdDoge1xuXHRcdFx0XHRcdGhvcml6b250YWw6IGdhbWVwYWQudmFsdWUuYXhlc1swXSxcblx0XHRcdFx0XHR2ZXJ0aWNhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzFdLFxuXHRcdFx0XHRcdGJ1dHRvbjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzEwXVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRyaWdodDoge1xuXHRcdFx0XHRcdGhvcml6b250YWw6IGdhbWVwYWQudmFsdWUuYXhlc1syXSxcblx0XHRcdFx0XHR2ZXJ0aWNhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzNdLFxuXHRcdFx0XHRcdGJ1dHRvbjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzExXVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZHBhZDoge1xuXHRcdFx0XHR1cDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzEyXSxcblx0XHRcdFx0ZG93bjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzEzXSxcblx0XHRcdFx0bGVmdDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzE0XSxcblx0XHRcdFx0cmlnaHQ6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1sxNV1cblx0XHRcdH0sXG5cdFx0XHRiYWNrOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbOF0sXG5cdFx0XHRzdGFydDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzldXG5cdFx0fTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fSk7XG59XG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlR2FtZXBhZChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiZ2V0R2FtZXBhZHNcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IGdhbWVwYWRzID0gcmVmKFtdKTtcblx0Y29uc3Qgb25Db25uZWN0ZWRIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IG9uRGlzY29ubmVjdGVkSG9vayA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBzdGF0ZUZyb21HYW1lcGFkID0gKGdhbWVwYWQpID0+IHtcblx0XHRjb25zdCBoYXB0aWNBY3R1YXRvcnMgPSBbXTtcblx0XHRjb25zdCB2aWJyYXRpb25BY3R1YXRvciA9IFwidmlicmF0aW9uQWN0dWF0b3JcIiBpbiBnYW1lcGFkID8gZ2FtZXBhZC52aWJyYXRpb25BY3R1YXRvciA6IG51bGw7XG5cdFx0aWYgKHZpYnJhdGlvbkFjdHVhdG9yKSBoYXB0aWNBY3R1YXRvcnMucHVzaCh2aWJyYXRpb25BY3R1YXRvcik7XG5cdFx0aWYgKGdhbWVwYWQuaGFwdGljQWN0dWF0b3JzKSBoYXB0aWNBY3R1YXRvcnMucHVzaCguLi5nYW1lcGFkLmhhcHRpY0FjdHVhdG9ycyk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBnYW1lcGFkLmlkLFxuXHRcdFx0aW5kZXg6IGdhbWVwYWQuaW5kZXgsXG5cdFx0XHRjb25uZWN0ZWQ6IGdhbWVwYWQuY29ubmVjdGVkLFxuXHRcdFx0bWFwcGluZzogZ2FtZXBhZC5tYXBwaW5nLFxuXHRcdFx0dGltZXN0YW1wOiBnYW1lcGFkLnRpbWVzdGFtcCxcblx0XHRcdHZpYnJhdGlvbkFjdHVhdG9yOiBnYW1lcGFkLnZpYnJhdGlvbkFjdHVhdG9yLFxuXHRcdFx0aGFwdGljQWN0dWF0b3JzLFxuXHRcdFx0YXhlczogZ2FtZXBhZC5heGVzLm1hcCgoYXhlcykgPT4gYXhlcyksXG5cdFx0XHRidXR0b25zOiBnYW1lcGFkLmJ1dHRvbnMubWFwKChidXR0b24pID0+ICh7XG5cdFx0XHRcdHByZXNzZWQ6IGJ1dHRvbi5wcmVzc2VkLFxuXHRcdFx0XHR0b3VjaGVkOiBidXR0b24udG91Y2hlZCxcblx0XHRcdFx0dmFsdWU6IGJ1dHRvbi52YWx1ZVxuXHRcdFx0fSkpXG5cdFx0fTtcblx0fTtcblx0Y29uc3QgdXBkYXRlR2FtZXBhZFN0YXRlID0gKCkgPT4ge1xuXHRcdGNvbnN0IF9nYW1lcGFkcyA9IChuYXZpZ2F0b3IkMSA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yJDEuZ2V0R2FtZXBhZHMoKSkgfHwgW107XG5cdFx0Zm9yIChjb25zdCBnYW1lcGFkIG9mIF9nYW1lcGFkcykgaWYgKGdhbWVwYWQgJiYgZ2FtZXBhZHMudmFsdWVbZ2FtZXBhZC5pbmRleF0pIGdhbWVwYWRzLnZhbHVlW2dhbWVwYWQuaW5kZXhdID0gc3RhdGVGcm9tR2FtZXBhZChnYW1lcGFkKTtcblx0fTtcblx0Y29uc3QgeyBpc0FjdGl2ZSwgcGF1c2UsIHJlc3VtZSB9ID0gdXNlUmFmRm4odXBkYXRlR2FtZXBhZFN0YXRlKTtcblx0Y29uc3Qgb25HYW1lcGFkQ29ubmVjdGVkID0gKGdhbWVwYWQpID0+IHtcblx0XHRpZiAoIWdhbWVwYWRzLnZhbHVlLnNvbWUoKHsgaW5kZXggfSkgPT4gaW5kZXggPT09IGdhbWVwYWQuaW5kZXgpKSB7XG5cdFx0XHRnYW1lcGFkcy52YWx1ZS5wdXNoKHN0YXRlRnJvbUdhbWVwYWQoZ2FtZXBhZCkpO1xuXHRcdFx0b25Db25uZWN0ZWRIb29rLnRyaWdnZXIoZ2FtZXBhZC5pbmRleCk7XG5cdFx0fVxuXHRcdHJlc3VtZSgpO1xuXHR9O1xuXHRjb25zdCBvbkdhbWVwYWREaXNjb25uZWN0ZWQgPSAoZ2FtZXBhZCkgPT4ge1xuXHRcdGdhbWVwYWRzLnZhbHVlID0gZ2FtZXBhZHMudmFsdWUuZmlsdGVyKCh4KSA9PiB4LmluZGV4ICE9PSBnYW1lcGFkLmluZGV4KTtcblx0XHRvbkRpc2Nvbm5lY3RlZEhvb2sudHJpZ2dlcihnYW1lcGFkLmluZGV4KTtcblx0fTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIoXCJnYW1lcGFkY29ubmVjdGVkXCIsIChlKSA9PiBvbkdhbWVwYWRDb25uZWN0ZWQoZS5nYW1lcGFkKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcihcImdhbWVwYWRkaXNjb25uZWN0ZWRcIiwgKGUpID0+IG9uR2FtZXBhZERpc2Nvbm5lY3RlZChlLmdhbWVwYWQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IF9nYW1lcGFkcyA9IChuYXZpZ2F0b3IkMSA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yJDEuZ2V0R2FtZXBhZHMoKSkgfHwgW107XG5cdFx0Zm9yIChjb25zdCBnYW1lcGFkIG9mIF9nYW1lcGFkcykgaWYgKGdhbWVwYWQgJiYgZ2FtZXBhZHMudmFsdWVbZ2FtZXBhZC5pbmRleF0pIG9uR2FtZXBhZENvbm5lY3RlZChnYW1lcGFkKTtcblx0fSk7XG5cdHBhdXNlKCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0b25Db25uZWN0ZWQ6IG9uQ29ubmVjdGVkSG9vay5vbixcblx0XHRvbkRpc2Nvbm5lY3RlZDogb25EaXNjb25uZWN0ZWRIb29rLm9uLFxuXHRcdGdhbWVwYWRzLFxuXHRcdHBhdXNlLFxuXHRcdHJlc3VtZSxcblx0XHRpc0FjdGl2ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VHZW9sb2NhdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIEdlb2xvY2F0aW9uIEFQSS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlR2VvbG9jYXRpb25cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VHZW9sb2NhdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBlbmFibGVIaWdoQWNjdXJhY3kgPSB0cnVlLCBtYXhpbXVtQWdlID0gM2U0LCB0aW1lb3V0ID0gMjdlMywgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIGltbWVkaWF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImdlb2xvY2F0aW9uXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBsb2NhdGVkQXQgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGNvb3JkcyA9IHJlZih7XG5cdFx0YWNjdXJhY3k6IDAsXG5cdFx0bGF0aXR1ZGU6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcblx0XHRsb25naXR1ZGU6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcblx0XHRhbHRpdHVkZTogbnVsbCxcblx0XHRhbHRpdHVkZUFjY3VyYWN5OiBudWxsLFxuXHRcdGhlYWRpbmc6IG51bGwsXG5cdFx0c3BlZWQ6IG51bGxcblx0fSk7XG5cdGZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9uKHBvc2l0aW9uKSB7XG5cdFx0bG9jYXRlZEF0LnZhbHVlID0gcG9zaXRpb24udGltZXN0YW1wO1xuXHRcdGNvb3Jkcy52YWx1ZSA9IHBvc2l0aW9uLmNvb3Jkcztcblx0XHRlcnJvci52YWx1ZSA9IG51bGw7XG5cdH1cblx0bGV0IHdhdGNoZXI7XG5cdGZ1bmN0aW9uIHJlc3VtZSgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHdhdGNoZXIgPSBuYXZpZ2F0b3IkMS5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKHVwZGF0ZVBvc2l0aW9uLCAoZXJyKSA9PiBlcnJvci52YWx1ZSA9IGVyciwge1xuXHRcdFx0ZW5hYmxlSGlnaEFjY3VyYWN5LFxuXHRcdFx0bWF4aW11bUFnZSxcblx0XHRcdHRpbWVvdXRcblx0XHR9KTtcblx0fVxuXHRpZiAoaW1tZWRpYXRlKSByZXN1bWUoKTtcblx0ZnVuY3Rpb24gcGF1c2UoKSB7XG5cdFx0aWYgKHdhdGNoZXIgJiYgbmF2aWdhdG9yJDEpIG5hdmlnYXRvciQxLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2god2F0Y2hlcik7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHBhdXNlKCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGNvb3Jkcyxcblx0XHRsb2NhdGVkQXQsXG5cdFx0ZXJyb3IsXG5cdFx0cmVzdW1lLFxuXHRcdHBhdXNlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUlkbGUvaW5kZXgudHNcbmNvbnN0IGRlZmF1bHRFdmVudHMkMSA9IFtcblx0XCJtb3VzZW1vdmVcIixcblx0XCJtb3VzZWRvd25cIixcblx0XCJyZXNpemVcIixcblx0XCJrZXlkb3duXCIsXG5cdFwidG91Y2hzdGFydFwiLFxuXHRcIndoZWVsXCJcbl07XG5jb25zdCBvbmVNaW51dGUgPSA2ZTQ7XG4vKipcbiogVHJhY2tzIHdoZXRoZXIgdGhlIHVzZXIgaXMgYmVpbmcgaW5hY3RpdmUuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUlkbGVcbiogQHBhcmFtIHRpbWVvdXQgZGVmYXVsdCB0byAxIG1pbnV0ZVxuKiBAcGFyYW0gb3B0aW9ucyBJZGxlT3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUlkbGUodGltZW91dCA9IG9uZU1pbnV0ZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFN0YXRlID0gZmFsc2UsIGxpc3RlbkZvclZpc2liaWxpdHlDaGFuZ2UgPSB0cnVlLCBldmVudHM6IGV2ZW50cyQxID0gZGVmYXVsdEV2ZW50cyQxLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZXZlbnRGaWx0ZXIgPSB0aHJvdHRsZUZpbHRlcig1MCkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlkbGUgPSBzaGFsbG93UmVmKGluaXRpYWxTdGF0ZSk7XG5cdGNvbnN0IGxhc3RBY3RpdmUgPSBzaGFsbG93UmVmKHRpbWVzdGFtcCgpKTtcblx0Y29uc3QgaXNQZW5kaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGxldCB0aW1lcjtcblx0Y29uc3QgcmVzZXQgPSAoKSA9PiB7XG5cdFx0aWRsZS52YWx1ZSA9IGZhbHNlO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0dGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGlkbGUudmFsdWUgPSB0cnVlLCB0aW1lb3V0KTtcblx0fTtcblx0Y29uc3Qgb25FdmVudCA9IGNyZWF0ZUZpbHRlcldyYXBwZXIoZXZlbnRGaWx0ZXIsICgpID0+IHtcblx0XHRsYXN0QWN0aXZlLnZhbHVlID0gdGltZXN0YW1wKCk7XG5cdFx0cmVzZXQoKTtcblx0fSk7XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGNvbnN0IGRvY3VtZW50JDEgPSB3aW5kb3ckMS5kb2N1bWVudDtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHRmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cyQxKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBldmVudCwgKCkgPT4ge1xuXHRcdFx0aWYgKCFpc1BlbmRpbmcudmFsdWUpIHJldHVybjtcblx0XHRcdG9uRXZlbnQoKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGlmIChsaXN0ZW5Gb3JWaXNpYmlsaXR5Q2hhbmdlKSB1c2VFdmVudExpc3RlbmVyKGRvY3VtZW50JDEsIFwidmlzaWJpbGl0eWNoYW5nZVwiLCAoKSA9PiB7XG5cdFx0XHRpZiAoZG9jdW1lbnQkMS5oaWRkZW4gfHwgIWlzUGVuZGluZy52YWx1ZSkgcmV0dXJuO1xuXHRcdFx0b25FdmVudCgpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0c3RhcnQoKTtcblx0fVxuXHRmdW5jdGlvbiBzdGFydCgpIHtcblx0XHRpZiAoaXNQZW5kaW5nLnZhbHVlKSByZXR1cm47XG5cdFx0aXNQZW5kaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRpZiAoIWluaXRpYWxTdGF0ZSkgcmVzZXQoKTtcblx0fVxuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdGlkbGUudmFsdWUgPSBpbml0aWFsU3RhdGU7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSBmYWxzZTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlkbGUsXG5cdFx0bGFzdEFjdGl2ZSxcblx0XHRyZXNldCxcblx0XHRzdG9wLFxuXHRcdHN0YXJ0LFxuXHRcdGlzUGVuZGluZzogc2hhbGxvd1JlYWRvbmx5KGlzUGVuZGluZylcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlSW1hZ2UvaW5kZXgudHNcbmFzeW5jIGZ1bmN0aW9uIGxvYWRJbWFnZShvcHRpb25zKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Y29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG5cdFx0Y29uc3QgeyBzcmMsIHNyY3NldCwgc2l6ZXMsIGNsYXNzOiBjbGF6eiwgbG9hZGluZywgY3Jvc3NvcmlnaW4sIHJlZmVycmVyUG9saWN5LCB3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZywgZmV0Y2hQcmlvcml0eSwgaXNtYXAsIHVzZW1hcCB9ID0gb3B0aW9ucztcblx0XHRpbWcuc3JjID0gc3JjO1xuXHRcdGlmIChzcmNzZXQgIT0gbnVsbCkgaW1nLnNyY3NldCA9IHNyY3NldDtcblx0XHRpZiAoc2l6ZXMgIT0gbnVsbCkgaW1nLnNpemVzID0gc2l6ZXM7XG5cdFx0aWYgKGNsYXp6ICE9IG51bGwpIGltZy5jbGFzc05hbWUgPSBjbGF6ejtcblx0XHRpZiAobG9hZGluZyAhPSBudWxsKSBpbWcubG9hZGluZyA9IGxvYWRpbmc7XG5cdFx0aWYgKGNyb3Nzb3JpZ2luICE9IG51bGwpIGltZy5jcm9zc09yaWdpbiA9IGNyb3Nzb3JpZ2luO1xuXHRcdGlmIChyZWZlcnJlclBvbGljeSAhPSBudWxsKSBpbWcucmVmZXJyZXJQb2xpY3kgPSByZWZlcnJlclBvbGljeTtcblx0XHRpZiAod2lkdGggIT0gbnVsbCkgaW1nLndpZHRoID0gd2lkdGg7XG5cdFx0aWYgKGhlaWdodCAhPSBudWxsKSBpbWcuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdGlmIChkZWNvZGluZyAhPSBudWxsKSBpbWcuZGVjb2RpbmcgPSBkZWNvZGluZztcblx0XHRpZiAoZmV0Y2hQcmlvcml0eSAhPSBudWxsKSBpbWcuZmV0Y2hQcmlvcml0eSA9IGZldGNoUHJpb3JpdHk7XG5cdFx0aWYgKGlzbWFwICE9IG51bGwpIGltZy5pc01hcCA9IGlzbWFwO1xuXHRcdGlmICh1c2VtYXAgIT0gbnVsbCkgaW1nLnVzZU1hcCA9IHVzZW1hcDtcblx0XHRpbWcub25sb2FkID0gKCkgPT4gcmVzb2x2ZShpbWcpO1xuXHRcdGltZy5vbmVycm9yID0gcmVqZWN0O1xuXHR9KTtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBsb2FkIGFuIGltYWdlIGluIHRoZSBicm93c2VyLCB5b3UgY2FuIHdhaXQgdGhlIHJlc3VsdCB0byBkaXNwbGF5IGl0IG9yIHNob3cgYSBmYWxsYmFjay5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSW1hZ2VcbiogQHBhcmFtIG9wdGlvbnMgSW1hZ2UgYXR0cmlidXRlcywgYXMgdXNlZCBpbiB0aGUgPGltZz4gdGFnXG4qIEBwYXJhbSBhc3luY1N0YXRlT3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUltYWdlKG9wdGlvbnMsIGFzeW5jU3RhdGVPcHRpb25zID0ge30pIHtcblx0Y29uc3Qgc3RhdGUgPSB1c2VBc3luY1N0YXRlKCgpID0+IGxvYWRJbWFnZSh0b1ZhbHVlKG9wdGlvbnMpKSwgdm9pZCAwLCB7XG5cdFx0cmVzZXRPbkV4ZWN1dGU6IHRydWUsXG5cdFx0Li4uYXN5bmNTdGF0ZU9wdGlvbnNcblx0fSk7XG5cdHdhdGNoKCgpID0+IHRvVmFsdWUob3B0aW9ucyksICgpID0+IHN0YXRlLmV4ZWN1dGUoYXN5bmNTdGF0ZU9wdGlvbnMuZGVsYXkpLCB7IGRlZXA6IHRydWUgfSk7XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gX3Jlc29sdmUtZWxlbWVudC50c1xuLyoqXG4qIFJlc29sdmVzIGFuIGVsZW1lbnQgZnJvbSBhIGdpdmVuIGVsZW1lbnQsIHdpbmRvdywgb3IgZG9jdW1lbnQuXG4qXG4qIEBpbnRlcm5hbFxuKi9cbmZ1bmN0aW9uIHJlc29sdmVFbGVtZW50KGVsKSB7XG5cdGlmICh0eXBlb2YgV2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIGVsIGluc3RhbmNlb2YgV2luZG93KSByZXR1cm4gZWwuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRpZiAodHlwZW9mIERvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIGVsIGluc3RhbmNlb2YgRG9jdW1lbnQpIHJldHVybiBlbC5kb2N1bWVudEVsZW1lbnQ7XG5cdHJldHVybiBlbDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2Nyb2xsL2luZGV4LnRzXG4vKipcbiogV2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgc2Nyb2xsIGFtb3VudCBpcyBjbG9zZSBlbm91Z2ggdG8gc29tZSB0aHJlc2hvbGQgaW4gb3JkZXIgdG9cbiogbW9yZSBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhcnJpdmVkU3RhdGUuIFRoaXMgaXMgYmVjYXVzZSBzY3JvbGxUb3Avc2Nyb2xsTGVmdCBhcmUgbm9uLXJvdW5kZWRcbiogbnVtYmVycywgd2hpbGUgc2Nyb2xsSGVpZ2h0L3Njcm9sbFdpZHRoIGFuZCBjbGllbnRIZWlnaHQvY2xpZW50V2lkdGggYXJlIHJvdW5kZWQuXG4qIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3Njcm9sbEhlaWdodCNkZXRlcm1pbmVfaWZfYW5fZWxlbWVudF9oYXNfYmVlbl90b3RhbGx5X3Njcm9sbGVkXG4qL1xuY29uc3QgQVJSSVZFRF9TVEFURV9USFJFU0hPTERfUElYRUxTID0gMTtcbi8qKlxuKiBSZWFjdGl2ZSBzY3JvbGwuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcm9sbFxuKiBAcGFyYW0gZWxlbWVudFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVNjcm9sbChlbGVtZW50LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0aHJvdHRsZSA9IDAsIGlkbGUgPSAyMDAsIG9uU3RvcCA9IG5vb3AsIG9uU2Nyb2xsID0gbm9vcCwgb2Zmc2V0ID0ge1xuXHRcdGxlZnQ6IDAsXG5cdFx0cmlnaHQ6IDAsXG5cdFx0dG9wOiAwLFxuXHRcdGJvdHRvbTogMFxuXHR9LCBvYnNlcnZlOiBfb2JzZXJ2ZSA9IHsgbXV0YXRpb246IGZhbHNlIH0sIGV2ZW50TGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdGNhcHR1cmU6IGZhbHNlLFxuXHRcdHBhc3NpdmU6IHRydWVcblx0fSwgYmVoYXZpb3IgPSBcImF1dG9cIiwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIG9uRXJyb3IgPSAoZSkgPT4ge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH0gfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG9ic2VydmUgPSB0eXBlb2YgX29ic2VydmUgPT09IFwiYm9vbGVhblwiID8geyBtdXRhdGlvbjogX29ic2VydmUgfSA6IF9vYnNlcnZlO1xuXHRjb25zdCBpbnRlcm5hbFggPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBpbnRlcm5hbFkgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCB4ID0gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpbnRlcm5hbFgudmFsdWU7XG5cdFx0fSxcblx0XHRzZXQoeCQxKSB7XG5cdFx0XHRzY3JvbGxUbyh4JDEsIHZvaWQgMCk7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgeSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gaW50ZXJuYWxZLnZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KHkkMSkge1xuXHRcdFx0c2Nyb2xsVG8odm9pZCAwLCB5JDEpO1xuXHRcdH1cblx0fSk7XG5cdGZ1bmN0aW9uIHNjcm9sbFRvKF94LCBfeSkge1xuXHRcdHZhciBfcmVmLCBfdG9WYWx1ZSwgX3RvVmFsdWUyLCBfZG9jdW1lbnQ7XG5cdFx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuO1xuXHRcdGNvbnN0IF9lbGVtZW50ID0gdG9WYWx1ZShlbGVtZW50KTtcblx0XHRpZiAoIV9lbGVtZW50KSByZXR1cm47XG5cdFx0KF9yZWYgPSBfZWxlbWVudCBpbnN0YW5jZW9mIERvY3VtZW50ID8gd2luZG93JDEuZG9jdW1lbnQuYm9keSA6IF9lbGVtZW50KSA9PT0gbnVsbCB8fCBfcmVmID09PSB2b2lkIDAgfHwgX3JlZi5zY3JvbGxUbyh7XG5cdFx0XHR0b3A6IChfdG9WYWx1ZSA9IHRvVmFsdWUoX3kpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZSAhPT0gdm9pZCAwID8gX3RvVmFsdWUgOiB5LnZhbHVlLFxuXHRcdFx0bGVmdDogKF90b1ZhbHVlMiA9IHRvVmFsdWUoX3gpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZTIgIT09IHZvaWQgMCA/IF90b1ZhbHVlMiA6IHgudmFsdWUsXG5cdFx0XHRiZWhhdmlvcjogdG9WYWx1ZShiZWhhdmlvcilcblx0XHR9KTtcblx0XHRjb25zdCBzY3JvbGxDb250YWluZXIgPSAoX2VsZW1lbnQgPT09IG51bGwgfHwgX2VsZW1lbnQgPT09IHZvaWQgMCB8fCAoX2RvY3VtZW50ID0gX2VsZW1lbnQuZG9jdW1lbnQpID09PSBudWxsIHx8IF9kb2N1bWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgfHwgKF9lbGVtZW50ID09PSBudWxsIHx8IF9lbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZWxlbWVudC5kb2N1bWVudEVsZW1lbnQpIHx8IF9lbGVtZW50O1xuXHRcdGlmICh4ICE9IG51bGwpIGludGVybmFsWC52YWx1ZSA9IHNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0O1xuXHRcdGlmICh5ICE9IG51bGwpIGludGVybmFsWS52YWx1ZSA9IHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7XG5cdH1cblx0Y29uc3QgaXNTY3JvbGxpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgYXJyaXZlZFN0YXRlID0gcmVhY3RpdmUoe1xuXHRcdGxlZnQ6IHRydWUsXG5cdFx0cmlnaHQ6IGZhbHNlLFxuXHRcdHRvcDogdHJ1ZSxcblx0XHRib3R0b206IGZhbHNlXG5cdH0pO1xuXHRjb25zdCBkaXJlY3Rpb25zID0gcmVhY3RpdmUoe1xuXHRcdGxlZnQ6IGZhbHNlLFxuXHRcdHJpZ2h0OiBmYWxzZSxcblx0XHR0b3A6IGZhbHNlLFxuXHRcdGJvdHRvbTogZmFsc2Vcblx0fSk7XG5cdGNvbnN0IG9uU2Nyb2xsRW5kID0gKGUpID0+IHtcblx0XHRpZiAoIWlzU2Nyb2xsaW5nLnZhbHVlKSByZXR1cm47XG5cdFx0aXNTY3JvbGxpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRkaXJlY3Rpb25zLmxlZnQgPSBmYWxzZTtcblx0XHRkaXJlY3Rpb25zLnJpZ2h0ID0gZmFsc2U7XG5cdFx0ZGlyZWN0aW9ucy50b3AgPSBmYWxzZTtcblx0XHRkaXJlY3Rpb25zLmJvdHRvbSA9IGZhbHNlO1xuXHRcdG9uU3RvcChlKTtcblx0fTtcblx0Y29uc3Qgb25TY3JvbGxFbmREZWJvdW5jZWQgPSB1c2VEZWJvdW5jZUZuKG9uU2Nyb2xsRW5kLCB0aHJvdHRsZSArIGlkbGUpO1xuXHRjb25zdCBzZXRBcnJpdmVkU3RhdGUgPSAodGFyZ2V0KSA9PiB7XG5cdFx0dmFyIF9kb2N1bWVudDI7XG5cdFx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuO1xuXHRcdGNvbnN0IGVsID0gKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCB8fCAoX2RvY3VtZW50MiA9IHRhcmdldC5kb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50Mi5kb2N1bWVudEVsZW1lbnQpIHx8ICh0YXJnZXQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQuZG9jdW1lbnRFbGVtZW50KSB8fCB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRjb25zdCB7IGRpc3BsYXksIGZsZXhEaXJlY3Rpb24sIGRpcmVjdGlvbiB9ID0gd2luZG93JDEuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG5cdFx0Y29uc3QgZGlyZWN0aW9uTXVsdGlwbGVyID0gZGlyZWN0aW9uID09PSBcInJ0bFwiID8gLTEgOiAxO1xuXHRcdGNvbnN0IHNjcm9sbExlZnQgPSBlbC5zY3JvbGxMZWZ0O1xuXHRcdGRpcmVjdGlvbnMubGVmdCA9IHNjcm9sbExlZnQgPCBpbnRlcm5hbFgudmFsdWU7XG5cdFx0ZGlyZWN0aW9ucy5yaWdodCA9IHNjcm9sbExlZnQgPiBpbnRlcm5hbFgudmFsdWU7XG5cdFx0Y29uc3QgbGVmdCA9IE1hdGguYWJzKHNjcm9sbExlZnQgKiBkaXJlY3Rpb25NdWx0aXBsZXIpIDw9IChvZmZzZXQubGVmdCB8fCAwKTtcblx0XHRjb25zdCByaWdodCA9IE1hdGguYWJzKHNjcm9sbExlZnQgKiBkaXJlY3Rpb25NdWx0aXBsZXIpICsgZWwuY2xpZW50V2lkdGggPj0gZWwuc2Nyb2xsV2lkdGggLSAob2Zmc2V0LnJpZ2h0IHx8IDApIC0gQVJSSVZFRF9TVEFURV9USFJFU0hPTERfUElYRUxTO1xuXHRcdGlmIChkaXNwbGF5ID09PSBcImZsZXhcIiAmJiBmbGV4RGlyZWN0aW9uID09PSBcInJvdy1yZXZlcnNlXCIpIHtcblx0XHRcdGFycml2ZWRTdGF0ZS5sZWZ0ID0gcmlnaHQ7XG5cdFx0XHRhcnJpdmVkU3RhdGUucmlnaHQgPSBsZWZ0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhcnJpdmVkU3RhdGUubGVmdCA9IGxlZnQ7XG5cdFx0XHRhcnJpdmVkU3RhdGUucmlnaHQgPSByaWdodDtcblx0XHR9XG5cdFx0aW50ZXJuYWxYLnZhbHVlID0gc2Nyb2xsTGVmdDtcblx0XHRsZXQgc2Nyb2xsVG9wID0gZWwuc2Nyb2xsVG9wO1xuXHRcdGlmICh0YXJnZXQgPT09IHdpbmRvdyQxLmRvY3VtZW50ICYmICFzY3JvbGxUb3ApIHNjcm9sbFRvcCA9IHdpbmRvdyQxLmRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xuXHRcdGRpcmVjdGlvbnMudG9wID0gc2Nyb2xsVG9wIDwgaW50ZXJuYWxZLnZhbHVlO1xuXHRcdGRpcmVjdGlvbnMuYm90dG9tID0gc2Nyb2xsVG9wID4gaW50ZXJuYWxZLnZhbHVlO1xuXHRcdGNvbnN0IHRvcCA9IE1hdGguYWJzKHNjcm9sbFRvcCkgPD0gKG9mZnNldC50b3AgfHwgMCk7XG5cdFx0Y29uc3QgYm90dG9tID0gTWF0aC5hYnMoc2Nyb2xsVG9wKSArIGVsLmNsaWVudEhlaWdodCA+PSBlbC5zY3JvbGxIZWlnaHQgLSAob2Zmc2V0LmJvdHRvbSB8fCAwKSAtIEFSUklWRURfU1RBVEVfVEhSRVNIT0xEX1BJWEVMUztcblx0XHQvKipcblx0XHQqIHJldmVyc2UgY29sdW1ucyBhbmQgcm93cyBiZWhhdmUgZXhhY3RseSB0aGUgb3RoZXIgd2F5IGFyb3VuZCxcblx0XHQqIGJvdHRvbSBpcyB0cmVhdGVkIGFzIHRvcCBhbmQgdG9wIGlzIHRyZWF0ZWQgYXMgdGhlIG5lZ2F0aXZlIHZlcnNpb24gb2YgYm90dG9tXG5cdFx0Ki9cblx0XHRpZiAoZGlzcGxheSA9PT0gXCJmbGV4XCIgJiYgZmxleERpcmVjdGlvbiA9PT0gXCJjb2x1bW4tcmV2ZXJzZVwiKSB7XG5cdFx0XHRhcnJpdmVkU3RhdGUudG9wID0gYm90dG9tO1xuXHRcdFx0YXJyaXZlZFN0YXRlLmJvdHRvbSA9IHRvcDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YXJyaXZlZFN0YXRlLnRvcCA9IHRvcDtcblx0XHRcdGFycml2ZWRTdGF0ZS5ib3R0b20gPSBib3R0b207XG5cdFx0fVxuXHRcdGludGVybmFsWS52YWx1ZSA9IHNjcm9sbFRvcDtcblx0fTtcblx0Y29uc3Qgb25TY3JvbGxIYW5kbGVyID0gKGUpID0+IHtcblx0XHR2YXIgX2RvY3VtZW50RWxlbWVudDtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0c2V0QXJyaXZlZFN0YXRlKChfZG9jdW1lbnRFbGVtZW50ID0gZS50YXJnZXQuZG9jdW1lbnRFbGVtZW50KSAhPT0gbnVsbCAmJiBfZG9jdW1lbnRFbGVtZW50ICE9PSB2b2lkIDAgPyBfZG9jdW1lbnRFbGVtZW50IDogZS50YXJnZXQpO1xuXHRcdGlzU2Nyb2xsaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRvblNjcm9sbEVuZERlYm91bmNlZChlKTtcblx0XHRvblNjcm9sbChlKTtcblx0fTtcblx0dXNlRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBcInNjcm9sbFwiLCB0aHJvdHRsZSA/IHVzZVRocm90dGxlRm4ob25TY3JvbGxIYW5kbGVyLCB0aHJvdHRsZSwgdHJ1ZSwgZmFsc2UpIDogb25TY3JvbGxIYW5kbGVyLCBldmVudExpc3RlbmVyT3B0aW9ucyk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IF9lbGVtZW50ID0gdG9WYWx1ZShlbGVtZW50KTtcblx0XHRcdGlmICghX2VsZW1lbnQpIHJldHVybjtcblx0XHRcdHNldEFycml2ZWRTdGF0ZShfZWxlbWVudCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH0pO1xuXHRpZiAoKG9ic2VydmUgPT09IG51bGwgfHwgb2JzZXJ2ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JzZXJ2ZS5tdXRhdGlvbikgJiYgZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgIT09IHdpbmRvdyQxICYmIGVsZW1lbnQgIT09IGRvY3VtZW50KSB1c2VNdXRhdGlvbk9ic2VydmVyKGVsZW1lbnQsICgpID0+IHtcblx0XHRjb25zdCBfZWxlbWVudCA9IHRvVmFsdWUoZWxlbWVudCk7XG5cdFx0aWYgKCFfZWxlbWVudCkgcmV0dXJuO1xuXHRcdHNldEFycml2ZWRTdGF0ZShfZWxlbWVudCk7XG5cdH0sIHtcblx0XHRhdHRyaWJ1dGVzOiB0cnVlLFxuXHRcdGNoaWxkTGlzdDogdHJ1ZSxcblx0XHRzdWJ0cmVlOiB0cnVlXG5cdH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKGVsZW1lbnQsIFwic2Nyb2xsZW5kXCIsIG9uU2Nyb2xsRW5kLCBldmVudExpc3RlbmVyT3B0aW9ucyk7XG5cdHJldHVybiB7XG5cdFx0eCxcblx0XHR5LFxuXHRcdGlzU2Nyb2xsaW5nLFxuXHRcdGFycml2ZWRTdGF0ZSxcblx0XHRkaXJlY3Rpb25zLFxuXHRcdG1lYXN1cmUoKSB7XG5cdFx0XHRjb25zdCBfZWxlbWVudCA9IHRvVmFsdWUoZWxlbWVudCk7XG5cdFx0XHRpZiAod2luZG93JDEgJiYgX2VsZW1lbnQpIHNldEFycml2ZWRTdGF0ZShfZWxlbWVudCk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VJbmZpbml0ZVNjcm9sbC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGluZmluaXRlIHNjcm9sbC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSW5maW5pdGVTY3JvbGxcbiovXG5mdW5jdGlvbiB1c2VJbmZpbml0ZVNjcm9sbChlbGVtZW50LCBvbkxvYWRNb3JlLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGRpc3RhbmNlO1xuXHRjb25zdCB7IGRpcmVjdGlvbiA9IFwiYm90dG9tXCIsIGludGVydmFsID0gMTAwLCBjYW5Mb2FkTW9yZSA9ICgpID0+IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHN0YXRlID0gcmVhY3RpdmUodXNlU2Nyb2xsKGVsZW1lbnQsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdG9mZnNldDoge1xuXHRcdFx0W2RpcmVjdGlvbl06IChfb3B0aW9ucyRkaXN0YW5jZSA9IG9wdGlvbnMuZGlzdGFuY2UpICE9PSBudWxsICYmIF9vcHRpb25zJGRpc3RhbmNlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRkaXN0YW5jZSA6IDAsXG5cdFx0XHQuLi5vcHRpb25zLm9mZnNldFxuXHRcdH1cblx0fSkpO1xuXHRjb25zdCBwcm9taXNlID0gcmVmKCk7XG5cdGNvbnN0IGlzTG9hZGluZyA9IGNvbXB1dGVkKCgpID0+ICEhcHJvbWlzZS52YWx1ZSk7XG5cdGNvbnN0IG9ic2VydmVkRWxlbWVudCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gcmVzb2x2ZUVsZW1lbnQodG9WYWx1ZShlbGVtZW50KSk7XG5cdH0pO1xuXHRjb25zdCBpc0VsZW1lbnRWaXNpYmxlID0gdXNlRWxlbWVudFZpc2liaWxpdHkob2JzZXJ2ZWRFbGVtZW50KTtcblx0Y29uc3QgY2FuTG9hZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRpZiAoIW9ic2VydmVkRWxlbWVudC52YWx1ZSkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjYW5Mb2FkTW9yZShvYnNlcnZlZEVsZW1lbnQudmFsdWUpO1xuXHR9KTtcblx0ZnVuY3Rpb24gY2hlY2tBbmRMb2FkKCkge1xuXHRcdHN0YXRlLm1lYXN1cmUoKTtcblx0XHRpZiAoIW9ic2VydmVkRWxlbWVudC52YWx1ZSB8fCAhaXNFbGVtZW50VmlzaWJsZS52YWx1ZSB8fCAhY2FuTG9hZC52YWx1ZSB8fCBwcm9taXNlLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgeyBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCwgc2Nyb2xsV2lkdGgsIGNsaWVudFdpZHRoIH0gPSBvYnNlcnZlZEVsZW1lbnQudmFsdWU7XG5cdFx0Y29uc3QgaXNOYXJyb3dlciA9IGRpcmVjdGlvbiA9PT0gXCJib3R0b21cIiB8fCBkaXJlY3Rpb24gPT09IFwidG9wXCIgPyBzY3JvbGxIZWlnaHQgPD0gY2xpZW50SGVpZ2h0IDogc2Nyb2xsV2lkdGggPD0gY2xpZW50V2lkdGg7XG5cdFx0aWYgKHN0YXRlLmFycml2ZWRTdGF0ZVtkaXJlY3Rpb25dIHx8IGlzTmFycm93ZXIpIHByb21pc2UudmFsdWUgPSBQcm9taXNlLmFsbChbb25Mb2FkTW9yZShzdGF0ZSksIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGludGVydmFsKSldKS5maW5hbGx5KCgpID0+IHtcblx0XHRcdHByb21pc2UudmFsdWUgPSBudWxsO1xuXHRcdFx0bmV4dFRpY2soKCkgPT4gY2hlY2tBbmRMb2FkKCkpO1xuXHRcdH0pO1xuXHR9XG5cdHRyeU9uVW5tb3VudGVkKHdhdGNoKCgpID0+IFtcblx0XHRzdGF0ZS5hcnJpdmVkU3RhdGVbZGlyZWN0aW9uXSxcblx0XHRpc0VsZW1lbnRWaXNpYmxlLnZhbHVlLFxuXHRcdGNhbkxvYWQudmFsdWVcblx0XSwgY2hlY2tBbmRMb2FkLCB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdGZsdXNoOiBcInBvc3RcIlxuXHR9KSk7XG5cdHJldHVybiB7XG5cdFx0aXNMb2FkaW5nLFxuXHRcdHJlc2V0KCkge1xuXHRcdFx0bmV4dFRpY2soKCkgPT4gY2hlY2tBbmRMb2FkKCkpO1xuXHRcdH1cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlS2V5TW9kaWZpZXIvaW5kZXgudHNcbmNvbnN0IGRlZmF1bHRFdmVudHMgPSBbXG5cdFwibW91c2Vkb3duXCIsXG5cdFwibW91c2V1cFwiLFxuXHRcImtleWRvd25cIixcblx0XCJrZXl1cFwiXG5dO1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZUtleU1vZGlmaWVyKG1vZGlmaWVyLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBldmVudHM6IGV2ZW50cyQxID0gZGVmYXVsdEV2ZW50cywgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQsIGluaXRpYWwgPSBudWxsIH0gPSBvcHRpb25zO1xuXHRjb25zdCBzdGF0ZSA9IHNoYWxsb3dSZWYoaW5pdGlhbCk7XG5cdGlmIChkb2N1bWVudCQxKSBldmVudHMkMS5mb3JFYWNoKChsaXN0ZW5lckV2ZW50KSA9PiB7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBsaXN0ZW5lckV2ZW50LCAoZXZ0KSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIGV2dC5nZXRNb2RpZmllclN0YXRlID09PSBcImZ1bmN0aW9uXCIpIHN0YXRlLnZhbHVlID0gZXZ0LmdldE1vZGlmaWVyU3RhdGUobW9kaWZpZXIpO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fSk7XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTG9jYWxTdG9yYWdlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgTG9jYWxTdG9yYWdlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VMb2NhbFN0b3JhZ2VcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaW5pdGlhbFZhbHVlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTG9jYWxTdG9yYWdlKGtleSwgaW5pdGlhbFZhbHVlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0cmV0dXJuIHVzZVN0b3JhZ2Uoa2V5LCBpbml0aWFsVmFsdWUsIHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5sb2NhbFN0b3JhZ2UsIG9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNYWdpY0tleXMvYWxpYXNNYXAudHNcbmNvbnN0IERlZmF1bHRNYWdpY0tleXNBbGlhc01hcCA9IHtcblx0Y3RybDogXCJjb250cm9sXCIsXG5cdGNvbW1hbmQ6IFwibWV0YVwiLFxuXHRjbWQ6IFwibWV0YVwiLFxuXHRvcHRpb246IFwiYWx0XCIsXG5cdHVwOiBcImFycm93dXBcIixcblx0ZG93bjogXCJhcnJvd2Rvd25cIixcblx0bGVmdDogXCJhcnJvd2xlZnRcIixcblx0cmlnaHQ6IFwiYXJyb3dyaWdodFwiXG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNYWdpY0tleXMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBrZXlzIHByZXNzZWQgc3RhdGUsIHdpdGggbWFnaWNhbCBrZXlzIGNvbWJpbmF0aW9uIHN1cHBvcnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1hZ2ljS2V5c1xuKi9cbmZ1bmN0aW9uIHVzZU1hZ2ljS2V5cyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyByZWFjdGl2ZTogdXNlUmVhY3RpdmUgPSBmYWxzZSwgdGFyZ2V0ID0gZGVmYXVsdFdpbmRvdywgYWxpYXNNYXAgPSBEZWZhdWx0TWFnaWNLZXlzQWxpYXNNYXAsIHBhc3NpdmUgPSB0cnVlLCBvbkV2ZW50RmlyZWQgPSBub29wIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjdXJyZW50ID0gcmVhY3RpdmUoLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSk7XG5cdGNvbnN0IG9iaiA9IHtcblx0XHR0b0pTT04oKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fSxcblx0XHRjdXJyZW50XG5cdH07XG5cdGNvbnN0IHJlZnMgPSB1c2VSZWFjdGl2ZSA/IHJlYWN0aXZlKG9iaikgOiBvYmo7XG5cdGNvbnN0IG1ldGFEZXBzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0Y29uc3QgZGVwc01hcCA9IG5ldyBNYXAoW1xuXHRcdFtcIk1ldGFcIiwgbWV0YURlcHNdLFxuXHRcdFtcIlNoaWZ0XCIsIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCldLFxuXHRcdFtcIkFsdFwiLCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpXVxuXHRdKTtcblx0Y29uc3QgdXNlZEtleXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRmdW5jdGlvbiBzZXRSZWZzKGtleSwgdmFsdWUpIHtcblx0XHRpZiAoa2V5IGluIHJlZnMpIGlmICh1c2VSZWFjdGl2ZSkgcmVmc1trZXldID0gdmFsdWU7XG5cdFx0ZWxzZSByZWZzW2tleV0udmFsdWUgPSB2YWx1ZTtcblx0fVxuXHRmdW5jdGlvbiByZXNldCgpIHtcblx0XHRjdXJyZW50LmNsZWFyKCk7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgdXNlZEtleXMpIHNldFJlZnMoa2V5LCBmYWxzZSk7XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlRGVwcyh2YWx1ZSwgZSwga2V5cyQxKSB7XG5cdFx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgZS5nZXRNb2RpZmllclN0YXRlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IFttb2RpZmllciwgZGVwc1NldF0gb2YgZGVwc01hcCkgaWYgKGUuZ2V0TW9kaWZpZXJTdGF0ZShtb2RpZmllcikpIHtcblx0XHRcdGtleXMkMS5mb3JFYWNoKChrZXkpID0+IGRlcHNTZXQuYWRkKGtleSkpO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIGNsZWFyRGVwcyh2YWx1ZSwga2V5KSB7XG5cdFx0aWYgKHZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgZGVwc01hcEtleSA9IGAke2tleVswXS50b1VwcGVyQ2FzZSgpfSR7a2V5LnNsaWNlKDEpfWA7XG5cdFx0Y29uc3QgZGVwcyA9IGRlcHNNYXAuZ2V0KGRlcHNNYXBLZXkpO1xuXHRcdGlmICghW1wic2hpZnRcIiwgXCJhbHRcIl0uaW5jbHVkZXMoa2V5KSB8fCAhZGVwcykgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHNBcnJheSA9IEFycmF5LmZyb20oZGVwcyk7XG5cdFx0Y29uc3QgZGVwc0luZGV4ID0gZGVwc0FycmF5LmluZGV4T2Yoa2V5KTtcblx0XHRkZXBzQXJyYXkuZm9yRWFjaCgoa2V5JDEsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggPj0gZGVwc0luZGV4KSB7XG5cdFx0XHRcdGN1cnJlbnQuZGVsZXRlKGtleSQxKTtcblx0XHRcdFx0c2V0UmVmcyhrZXkkMSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGRlcHMuY2xlYXIoKTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGVSZWZzKGUsIHZhbHVlKSB7XG5cdFx0dmFyIF9lJGtleSwgX2UkY29kZTtcblx0XHRjb25zdCBrZXkgPSAoX2Uka2V5ID0gZS5rZXkpID09PSBudWxsIHx8IF9lJGtleSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Uka2V5LnRvTG93ZXJDYXNlKCk7XG5cdFx0Y29uc3QgdmFsdWVzID0gWyhfZSRjb2RlID0gZS5jb2RlKSA9PT0gbnVsbCB8fCBfZSRjb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZSRjb2RlLnRvTG93ZXJDYXNlKCksIGtleV0uZmlsdGVyKEJvb2xlYW4pO1xuXHRcdGlmICgha2V5KSByZXR1cm47XG5cdFx0aWYgKGtleSkgaWYgKHZhbHVlKSBjdXJyZW50LmFkZChrZXkpO1xuXHRcdGVsc2UgY3VycmVudC5kZWxldGUoa2V5KTtcblx0XHRmb3IgKGNvbnN0IGtleSQxIG9mIHZhbHVlcykge1xuXHRcdFx0dXNlZEtleXMuYWRkKGtleSQxKTtcblx0XHRcdHNldFJlZnMoa2V5JDEsIHZhbHVlKTtcblx0XHR9XG5cdFx0dXBkYXRlRGVwcyh2YWx1ZSwgZSwgWy4uLmN1cnJlbnQsIC4uLnZhbHVlc10pO1xuXHRcdGNsZWFyRGVwcyh2YWx1ZSwga2V5KTtcblx0XHRpZiAoa2V5ID09PSBcIm1ldGFcIiAmJiAhdmFsdWUpIHtcblx0XHRcdG1ldGFEZXBzLmZvckVhY2goKGtleSQxKSA9PiB7XG5cdFx0XHRcdGN1cnJlbnQuZGVsZXRlKGtleSQxKTtcblx0XHRcdFx0c2V0UmVmcyhrZXkkMSwgZmFsc2UpO1xuXHRcdFx0fSk7XG5cdFx0XHRtZXRhRGVwcy5jbGVhcigpO1xuXHRcdH1cblx0fVxuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJrZXlkb3duXCIsIChlKSA9PiB7XG5cdFx0dXBkYXRlUmVmcyhlLCB0cnVlKTtcblx0XHRyZXR1cm4gb25FdmVudEZpcmVkKGUpO1xuXHR9LCB7IHBhc3NpdmUgfSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImtleXVwXCIsIChlKSA9PiB7XG5cdFx0dXBkYXRlUmVmcyhlLCBmYWxzZSk7XG5cdFx0cmV0dXJuIG9uRXZlbnRGaXJlZChlKTtcblx0fSwgeyBwYXNzaXZlIH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKFwiYmx1clwiLCByZXNldCwgeyBwYXNzaXZlIH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgcmVzZXQsIHsgcGFzc2l2ZSB9KTtcblx0Y29uc3QgcHJveHkgPSBuZXcgUHJveHkocmVmcywgeyBnZXQodGFyZ2V0JDEsIHByb3AsIHJlYykge1xuXHRcdGlmICh0eXBlb2YgcHJvcCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCQxLCBwcm9wLCByZWMpO1xuXHRcdHByb3AgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKHByb3AgaW4gYWxpYXNNYXApIHByb3AgPSBhbGlhc01hcFtwcm9wXTtcblx0XHRpZiAoIShwcm9wIGluIHJlZnMpKSBpZiAoL1srXy1dLy50ZXN0KHByb3ApKSB7XG5cdFx0XHRjb25zdCBrZXlzJDEgPSBwcm9wLnNwbGl0KC9bK18tXS9nKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0XHRcdHJlZnNbcHJvcF0gPSBjb21wdXRlZCgoKSA9PiBrZXlzJDEubWFwKChrZXkpID0+IHRvVmFsdWUocHJveHlba2V5XSkpLmV2ZXJ5KEJvb2xlYW4pKTtcblx0XHR9IGVsc2UgcmVmc1twcm9wXSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRcdGNvbnN0IHIgPSBSZWZsZWN0LmdldCh0YXJnZXQkMSwgcHJvcCwgcmVjKTtcblx0XHRyZXR1cm4gdXNlUmVhY3RpdmUgPyB0b1ZhbHVlKHIpIDogcjtcblx0fSB9KTtcblx0cmV0dXJuIHByb3h5O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNZWRpYUNvbnRyb2xzL2luZGV4LnRzXG4vKipcbiogQXV0b21hdGljYWxseSBjaGVjayBpZiB0aGUgcmVmIGV4aXN0cyBhbmQgaWYgaXQgZG9lcyBydW4gdGhlIGNiIGZuXG4qL1xuZnVuY3Rpb24gdXNpbmdFbFJlZihzb3VyY2UsIGNiKSB7XG5cdGlmICh0b1ZhbHVlKHNvdXJjZSkpIGNiKHRvVmFsdWUoc291cmNlKSk7XG59XG4vKipcbiogQ29udmVydHMgYSBUaW1lUmFuZ2Ugb2JqZWN0IHRvIGFuIGFycmF5XG4qL1xuZnVuY3Rpb24gdGltZVJhbmdlVG9BcnJheSh0aW1lUmFuZ2VzKSB7XG5cdGxldCByYW5nZXMgPSBbXTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aW1lUmFuZ2VzLmxlbmd0aDsgKytpKSByYW5nZXMgPSBbLi4ucmFuZ2VzLCBbdGltZVJhbmdlcy5zdGFydChpKSwgdGltZVJhbmdlcy5lbmQoaSldXTtcblx0cmV0dXJuIHJhbmdlcztcbn1cbi8qKlxuKiBDb252ZXJ0cyBhIFRleHRUcmFja0xpc3Qgb2JqZWN0IHRvIGFuIGFycmF5IG9mIGBVc2VNZWRpYVRleHRUcmFja2BcbiovXG5mdW5jdGlvbiB0cmFja3NUb0FycmF5KHRyYWNrcykge1xuXHRyZXR1cm4gQXJyYXkuZnJvbSh0cmFja3MpLm1hcCgoeyBsYWJlbCwga2luZCwgbGFuZ3VhZ2UsIG1vZGUsIGFjdGl2ZUN1ZXMsIGN1ZXMsIGluQmFuZE1ldGFkYXRhVHJhY2tEaXNwYXRjaFR5cGUgfSwgaWQpID0+ICh7XG5cdFx0aWQsXG5cdFx0bGFiZWwsXG5cdFx0a2luZCxcblx0XHRsYW5ndWFnZSxcblx0XHRtb2RlLFxuXHRcdGFjdGl2ZUN1ZXMsXG5cdFx0Y3Vlcyxcblx0XHRpbkJhbmRNZXRhZGF0YVRyYWNrRGlzcGF0Y2hUeXBlXG5cdH0pKTtcbn1cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuXHRzcmM6IFwiXCIsXG5cdHRyYWNrczogW11cbn07XG5mdW5jdGlvbiB1c2VNZWRpYUNvbnRyb2xzKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdHRhcmdldCA9IHRvUmVmKHRhcmdldCk7XG5cdG9wdGlvbnMgPSB7XG5cdFx0Li4uZGVmYXVsdE9wdGlvbnMsXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0Y29uc3QgY3VycmVudFRpbWUgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBkdXJhdGlvbiA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHNlZWtpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgdm9sdW1lID0gc2hhbGxvd1JlZigxKTtcblx0Y29uc3Qgd2FpdGluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBlbmRlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBwbGF5aW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHJhdGUgPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCBzdGFsbGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGJ1ZmZlcmVkID0gcmVmKFtdKTtcblx0Y29uc3QgdHJhY2tzID0gcmVmKFtdKTtcblx0Y29uc3Qgc2VsZWN0ZWRUcmFjayA9IHNoYWxsb3dSZWYoLTEpO1xuXHRjb25zdCBpc1BpY3R1cmVJblBpY3R1cmUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgbXV0ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgc3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlID0gQm9vbGVhbihkb2N1bWVudCQxICYmIFwicGljdHVyZUluUGljdHVyZUVuYWJsZWRcIiBpbiBkb2N1bWVudCQxKTtcblx0Y29uc3Qgc291cmNlRXJyb3JFdmVudCA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBwbGF5YmFja0Vycm9yRXZlbnQgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0LyoqXG5cdCogRGlzYWJsZXMgdGhlIHNwZWNpZmllZCB0cmFjay4gSWYgbm8gdHJhY2sgaXMgc3BlY2lmaWVkIHRoZW5cblx0KiBhbGwgdHJhY2tzIHdpbGwgYmUgZGlzYWJsZWRcblx0KlxuXHQqIEBwYXJhbSB0cmFjayBUaGUgaWQgb2YgdGhlIHRyYWNrIHRvIGRpc2FibGVcblx0Ki9cblx0Y29uc3QgZGlzYWJsZVRyYWNrID0gKHRyYWNrKSA9PiB7XG5cdFx0dXNpbmdFbFJlZih0YXJnZXQsIChlbCkgPT4ge1xuXHRcdFx0aWYgKHRyYWNrKSB7XG5cdFx0XHRcdGNvbnN0IGlkID0gdHlwZW9mIHRyYWNrID09PSBcIm51bWJlclwiID8gdHJhY2sgOiB0cmFjay5pZDtcblx0XHRcdFx0ZWwudGV4dFRyYWNrc1tpZF0ubW9kZSA9IFwiZGlzYWJsZWRcIjtcblx0XHRcdH0gZWxzZSBmb3IgKGxldCBpID0gMDsgaSA8IGVsLnRleHRUcmFja3MubGVuZ3RoOyArK2kpIGVsLnRleHRUcmFja3NbaV0ubW9kZSA9IFwiZGlzYWJsZWRcIjtcblx0XHRcdHNlbGVjdGVkVHJhY2sudmFsdWUgPSAtMTtcblx0XHR9KTtcblx0fTtcblx0LyoqXG5cdCogRW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRyYWNrIGFuZCBkaXNhYmxlcyB0aGVcblx0KiBvdGhlciB0cmFja3MgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWRcblx0KlxuXHQqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgb2YgdGhlIGlkIG9mIHRoZSB0cmFjayB0byBlbmFibGVcblx0KiBAcGFyYW0gZGlzYWJsZVRyYWNrcyBEaXNhYmxlIGFsbCBvdGhlciB0cmFja3Ncblx0Ki9cblx0Y29uc3QgZW5hYmxlVHJhY2sgPSAodHJhY2ssIGRpc2FibGVUcmFja3MgPSB0cnVlKSA9PiB7XG5cdFx0dXNpbmdFbFJlZih0YXJnZXQsIChlbCkgPT4ge1xuXHRcdFx0Y29uc3QgaWQgPSB0eXBlb2YgdHJhY2sgPT09IFwibnVtYmVyXCIgPyB0cmFjayA6IHRyYWNrLmlkO1xuXHRcdFx0aWYgKGRpc2FibGVUcmFja3MpIGRpc2FibGVUcmFjaygpO1xuXHRcdFx0ZWwudGV4dFRyYWNrc1tpZF0ubW9kZSA9IFwic2hvd2luZ1wiO1xuXHRcdFx0c2VsZWN0ZWRUcmFjay52YWx1ZSA9IGlkO1xuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBUb2dnbGUgcGljdHVyZSBpbiBwaWN0dXJlIG1vZGUgZm9yIHRoZSBwbGF5ZXIuXG5cdCovXG5cdGNvbnN0IHRvZ2dsZVBpY3R1cmVJblBpY3R1cmUgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHVzaW5nRWxSZWYodGFyZ2V0LCBhc3luYyAoZWwpID0+IHtcblx0XHRcdFx0aWYgKHN1cHBvcnRzUGljdHVyZUluUGljdHVyZSkgaWYgKCFpc1BpY3R1cmVJblBpY3R1cmUudmFsdWUpIGVsLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCkudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xuXHRcdFx0XHRlbHNlIGRvY3VtZW50JDEuZXhpdFBpY3R1cmVJblBpY3R1cmUoKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fTtcblx0LyoqXG5cdCogVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgaW5qZWN0IHNvdXJjZXMgdG8gdGhlIG1lZGlhIGVsZW1lbnQuIFRoZSBzb3VyY2VzIHdpbGwgYmVcblx0KiBhcHBlbmRlZCBhcyBjaGlsZHJlbiB0byB0aGUgbWVkaWEgZWxlbWVudCBhcyBgPHNvdXJjZT5gIGVsZW1lbnRzLlxuXHQqL1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKCFkb2N1bWVudCQxKSByZXR1cm47XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGNvbnN0IHNyYyA9IHRvVmFsdWUob3B0aW9ucy5zcmMpO1xuXHRcdGxldCBzb3VyY2VzID0gW107XG5cdFx0aWYgKCFzcmMpIHJldHVybjtcblx0XHRpZiAodHlwZW9mIHNyYyA9PT0gXCJzdHJpbmdcIikgc291cmNlcyA9IFt7IHNyYyB9XTtcblx0XHRlbHNlIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHNvdXJjZXMgPSBzcmM7XG5cdFx0ZWxzZSBpZiAoaXNPYmplY3Qoc3JjKSkgc291cmNlcyA9IFtzcmNdO1xuXHRcdGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJzb3VyY2VcIikuZm9yRWFjaCgoZSkgPT4ge1xuXHRcdFx0ZS5yZW1vdmUoKTtcblx0XHR9KTtcblx0XHRzb3VyY2VzLmZvckVhY2goKHsgc3JjOiBzcmMkMSwgdHlwZSwgbWVkaWEgfSkgPT4ge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KFwic291cmNlXCIpO1xuXHRcdFx0c291cmNlLnNldEF0dHJpYnV0ZShcInNyY1wiLCBzcmMkMSk7XG5cdFx0XHRzb3VyY2Uuc2V0QXR0cmlidXRlKFwidHlwZVwiLCB0eXBlIHx8IFwiXCIpO1xuXHRcdFx0c291cmNlLnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhIHx8IFwiXCIpO1xuXHRcdFx0dXNlRXZlbnRMaXN0ZW5lcihzb3VyY2UsIFwiZXJyb3JcIiwgc291cmNlRXJyb3JFdmVudC50cmlnZ2VyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoc291cmNlKTtcblx0XHR9KTtcblx0XHRlbC5sb2FkKCk7XG5cdH0pO1xuXHQvKipcblx0KiBBcHBseSBjb21wb3NhYmxlIHN0YXRlIHRvIHRoZSBlbGVtZW50LCBhbHNvIHdoZW4gZWxlbWVudCBpcyBjaGFuZ2VkXG5cdCovXG5cdHdhdGNoKFt0YXJnZXQsIHZvbHVtZV0sICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwudm9sdW1lID0gdm9sdW1lLnZhbHVlO1xuXHR9KTtcblx0d2F0Y2goW3RhcmdldCwgbXV0ZWRdLCAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGVsLm11dGVkID0gbXV0ZWQudmFsdWU7XG5cdH0pO1xuXHR3YXRjaChbdGFyZ2V0LCByYXRlXSwgKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRlbC5wbGF5YmFja1JhdGUgPSByYXRlLnZhbHVlO1xuXHR9KTtcblx0LyoqXG5cdCogTG9hZCBUcmFja3Ncblx0Ki9cblx0d2F0Y2hFZmZlY3QoKCkgPT4ge1xuXHRcdGlmICghZG9jdW1lbnQkMSkgcmV0dXJuO1xuXHRcdGNvbnN0IHRleHRUcmFja3MgPSB0b1ZhbHVlKG9wdGlvbnMudHJhY2tzKTtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIXRleHRUcmFja3MgfHwgIXRleHRUcmFja3MubGVuZ3RoIHx8ICFlbCkgcmV0dXJuO1xuXHRcdC8qKlxuXHRcdCogVGhlIE1lZGlhQVBJIHByb3ZpZGVzIGFuIEFQSSBmb3IgYWRkaW5nIHRleHQgdHJhY2tzLCBidXQgdGhleSBkb24ndCBjdXJyZW50bHlcblx0XHQqIGhhdmUgYW4gQVBJIGZvciByZW1vdmluZyB0ZXh0IHRyYWNrcywgc28gaW5zdGVhZCB3ZSB3aWxsIGp1c3QgY3JlYXRlIGFuZCByZW1vdmVcblx0XHQqIHRoZSB0cmFja3MgbWFudWFsbHkgdXNpbmcgdGhlIEhUTUwgYXBpLlxuXHRcdCovXG5cdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcInRyYWNrXCIpLmZvckVhY2goKGUpID0+IGUucmVtb3ZlKCkpO1xuXHRcdHRleHRUcmFja3MuZm9yRWFjaCgoeyBkZWZhdWx0OiBpc0RlZmF1bHQsIGtpbmQsIGxhYmVsLCBzcmMsIHNyY0xhbmcgfSwgaSkgPT4ge1xuXHRcdFx0Y29uc3QgdHJhY2sgPSBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoXCJ0cmFja1wiKTtcblx0XHRcdHRyYWNrLmRlZmF1bHQgPSBpc0RlZmF1bHQgfHwgZmFsc2U7XG5cdFx0XHR0cmFjay5raW5kID0ga2luZDtcblx0XHRcdHRyYWNrLmxhYmVsID0gbGFiZWw7XG5cdFx0XHR0cmFjay5zcmMgPSBzcmM7XG5cdFx0XHR0cmFjay5zcmNsYW5nID0gc3JjTGFuZztcblx0XHRcdGlmICh0cmFjay5kZWZhdWx0KSBzZWxlY3RlZFRyYWNrLnZhbHVlID0gaTtcblx0XHRcdGVsLmFwcGVuZENoaWxkKHRyYWNrKTtcblx0XHR9KTtcblx0fSk7XG5cdC8qKlxuXHQqIFRoaXMgd2lsbCBhbGxvdyB1cyB0byB1cGRhdGUgdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoZSB0aW1ldXBkYXRlIGV2ZW50XG5cdCogd2l0aG91dCBzZXR0aW5nIHRoZSBtZWRpYXMgY3VycmVudCBwb3NpdGlvbiwgYnV0IGlmIHRoZSB1c2VyIGNoYW5nZXMgdGhlXG5cdCogY3VycmVudCB0aW1lIHZpYSB0aGUgcmVmLCB0aGVuIHRoZSBtZWRpYSB3aWxsIHNlZWsuXG5cdCpcblx0KiBJZiB3ZSBkaWQgbm90IHVzZSBhbiBpZ25vcmFibGUgd2F0Y2gsIHRoZW4gdGhlIGN1cnJlbnQgdGltZSB1cGRhdGUgZnJvbVxuXHQqIHRoZSB0aW1ldXBkYXRlIGV2ZW50IHdvdWxkIGNhdXNlIHRoZSBtZWRpYSB0byBzdHV0dGVyLlxuXHQqL1xuXHRjb25zdCB7IGlnbm9yZVVwZGF0ZXM6IGlnbm9yZUN1cnJlbnRUaW1lVXBkYXRlcyB9ID0gd2F0Y2hJZ25vcmFibGUoY3VycmVudFRpbWUsICh0aW1lKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGVsLmN1cnJlbnRUaW1lID0gdGltZTtcblx0fSk7XG5cdC8qKlxuXHQqIFVzaW5nIGFuIGlnbm9yYWJsZSB3YXRjaCBzbyB3ZSBjYW4gY29udHJvbCB0aGUgcGxheSBzdGF0ZSB1c2luZyBhIHJlZiBhbmQgbm90XG5cdCogYSBmdW5jdGlvblxuXHQqL1xuXHRjb25zdCB7IGlnbm9yZVVwZGF0ZXM6IGlnbm9yZVBsYXlpbmdVcGRhdGVzIH0gPSB3YXRjaElnbm9yYWJsZShwbGF5aW5nLCAoaXNQbGF5aW5nKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGlmIChpc1BsYXlpbmcpIGVsLnBsYXkoKS5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0cGxheWJhY2tFcnJvckV2ZW50LnRyaWdnZXIoZSk7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH0pO1xuXHRcdGVsc2UgZWwucGF1c2UoKTtcblx0fSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRpbWV1cGRhdGVcIiwgKCkgPT4gaWdub3JlQ3VycmVudFRpbWVVcGRhdGVzKCgpID0+IGN1cnJlbnRUaW1lLnZhbHVlID0gdG9WYWx1ZSh0YXJnZXQpLmN1cnJlbnRUaW1lKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHVyYXRpb25jaGFuZ2VcIiwgKCkgPT4gZHVyYXRpb24udmFsdWUgPSB0b1ZhbHVlKHRhcmdldCkuZHVyYXRpb24sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInByb2dyZXNzXCIsICgpID0+IGJ1ZmZlcmVkLnZhbHVlID0gdGltZVJhbmdlVG9BcnJheSh0b1ZhbHVlKHRhcmdldCkuYnVmZmVyZWQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJzZWVraW5nXCIsICgpID0+IHNlZWtpbmcudmFsdWUgPSB0cnVlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJzZWVrZWRcIiwgKCkgPT4gc2Vla2luZy52YWx1ZSA9IGZhbHNlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgW1wid2FpdGluZ1wiLCBcImxvYWRzdGFydFwiXSwgKCkgPT4ge1xuXHRcdHdhaXRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlnbm9yZVBsYXlpbmdVcGRhdGVzKCgpID0+IHBsYXlpbmcudmFsdWUgPSBmYWxzZSk7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImxvYWRlZGRhdGFcIiwgKCkgPT4gd2FpdGluZy52YWx1ZSA9IGZhbHNlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwbGF5aW5nXCIsICgpID0+IHtcblx0XHR3YWl0aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0ZW5kZWQudmFsdWUgPSBmYWxzZTtcblx0XHRpZ25vcmVQbGF5aW5nVXBkYXRlcygoKSA9PiBwbGF5aW5nLnZhbHVlID0gdHJ1ZSk7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInJhdGVjaGFuZ2VcIiwgKCkgPT4gcmF0ZS52YWx1ZSA9IHRvVmFsdWUodGFyZ2V0KS5wbGF5YmFja1JhdGUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInN0YWxsZWRcIiwgKCkgPT4gc3RhbGxlZC52YWx1ZSA9IHRydWUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImVuZGVkXCIsICgpID0+IGVuZGVkLnZhbHVlID0gdHJ1ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicGF1c2VcIiwgKCkgPT4gaWdub3JlUGxheWluZ1VwZGF0ZXMoKCkgPT4gcGxheWluZy52YWx1ZSA9IGZhbHNlKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicGxheVwiLCAoKSA9PiBpZ25vcmVQbGF5aW5nVXBkYXRlcygoKSA9PiBwbGF5aW5nLnZhbHVlID0gdHJ1ZSksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImVudGVycGljdHVyZWlucGljdHVyZVwiLCAoKSA9PiBpc1BpY3R1cmVJblBpY3R1cmUudmFsdWUgPSB0cnVlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJsZWF2ZXBpY3R1cmVpbnBpY3R1cmVcIiwgKCkgPT4gaXNQaWN0dXJlSW5QaWN0dXJlLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInZvbHVtZWNoYW5nZVwiLCAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdHZvbHVtZS52YWx1ZSA9IGVsLnZvbHVtZTtcblx0XHRtdXRlZC52YWx1ZSA9IGVsLm11dGVkO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHQvKipcblx0KiBUaGUgZm9sbG93aW5nIGxpc3RlbmVycyBuZWVkIHRvIGxpc3RlbiB0byBhIG5lc3RlZFxuXHQqIG9iamVjdCBvbiB0aGUgdGFyZ2V0LCBzbyB3ZSB3aWxsIGhhdmUgdG8gdXNlIGEgbmVzdGVkXG5cdCogd2F0Y2ggYW5kIG1hbnVhbGx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzXG5cdCovXG5cdGNvbnN0IGxpc3RlbmVycyA9IFtdO1xuXHRjb25zdCBzdG9wID0gd2F0Y2goW3RhcmdldF0sICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0c3RvcCgpO1xuXHRcdGxpc3RlbmVyc1swXSA9IHVzZUV2ZW50TGlzdGVuZXIoZWwudGV4dFRyYWNrcywgXCJhZGR0cmFja1wiLCAoKSA9PiB0cmFja3MudmFsdWUgPSB0cmFja3NUb0FycmF5KGVsLnRleHRUcmFja3MpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGxpc3RlbmVyc1sxXSA9IHVzZUV2ZW50TGlzdGVuZXIoZWwudGV4dFRyYWNrcywgXCJyZW1vdmV0cmFja1wiLCAoKSA9PiB0cmFja3MudmFsdWUgPSB0cmFja3NUb0FycmF5KGVsLnRleHRUcmFja3MpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGxpc3RlbmVyc1syXSA9IHVzZUV2ZW50TGlzdGVuZXIoZWwudGV4dFRyYWNrcywgXCJjaGFuZ2VcIiwgKCkgPT4gdHJhY2tzLnZhbHVlID0gdHJhY2tzVG9BcnJheShlbC50ZXh0VHJhY2tzKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0fSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoKSkpO1xuXHRyZXR1cm4ge1xuXHRcdGN1cnJlbnRUaW1lLFxuXHRcdGR1cmF0aW9uLFxuXHRcdHdhaXRpbmcsXG5cdFx0c2Vla2luZyxcblx0XHRlbmRlZCxcblx0XHRzdGFsbGVkLFxuXHRcdGJ1ZmZlcmVkLFxuXHRcdHBsYXlpbmcsXG5cdFx0cmF0ZSxcblx0XHR2b2x1bWUsXG5cdFx0bXV0ZWQsXG5cdFx0dHJhY2tzLFxuXHRcdHNlbGVjdGVkVHJhY2ssXG5cdFx0ZW5hYmxlVHJhY2ssXG5cdFx0ZGlzYWJsZVRyYWNrLFxuXHRcdHN1cHBvcnRzUGljdHVyZUluUGljdHVyZSxcblx0XHR0b2dnbGVQaWN0dXJlSW5QaWN0dXJlLFxuXHRcdGlzUGljdHVyZUluUGljdHVyZSxcblx0XHRvblNvdXJjZUVycm9yOiBzb3VyY2VFcnJvckV2ZW50Lm9uLFxuXHRcdG9uUGxheWJhY2tFcnJvcjogcGxheWJhY2tFcnJvckV2ZW50Lm9uXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1lbW9pemUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBmdW5jdGlvbiByZXN1bHQgY2FjaGUgYmFzZWQgb24gYXJndW1lbnRzXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTWVtb2l6ZShyZXNvbHZlciwgb3B0aW9ucykge1xuXHRjb25zdCBpbml0Q2FjaGUgPSAoKSA9PiB7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYWNoZSkgcmV0dXJuIHNoYWxsb3dSZWFjdGl2ZShvcHRpb25zLmNhY2hlKTtcblx0XHRyZXR1cm4gc2hhbGxvd1JlYWN0aXZlKC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpO1xuXHR9O1xuXHRjb25zdCBjYWNoZSA9IGluaXRDYWNoZSgpO1xuXHQvKipcblx0KiBHZW5lcmF0ZSBrZXkgZnJvbSBhcmdzXG5cdCovXG5cdGNvbnN0IGdlbmVyYXRlS2V5ID0gKC4uLmFyZ3MpID0+IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2V0S2V5KSA/IG9wdGlvbnMuZ2V0S2V5KC4uLmFyZ3MpIDogSlNPTi5zdHJpbmdpZnkoYXJncyk7XG5cdC8qKlxuXHQqIExvYWQgZGF0YSBhbmQgc2F2ZSBpbiBjYWNoZVxuXHQqL1xuXHRjb25zdCBfbG9hZERhdGEgPSAoa2V5LCAuLi5hcmdzKSA9PiB7XG5cdFx0Y2FjaGUuc2V0KGtleSwgcmVzb2x2ZXIoLi4uYXJncykpO1xuXHRcdHJldHVybiBjYWNoZS5nZXQoa2V5KTtcblx0fTtcblx0Y29uc3QgbG9hZERhdGEgPSAoLi4uYXJncykgPT4gX2xvYWREYXRhKGdlbmVyYXRlS2V5KC4uLmFyZ3MpLCAuLi5hcmdzKTtcblx0LyoqXG5cdCogRGVsZXRlIGtleSBmcm9tIGNhY2hlXG5cdCovXG5cdGNvbnN0IGRlbGV0ZURhdGEgPSAoLi4uYXJncykgPT4ge1xuXHRcdGNhY2hlLmRlbGV0ZShnZW5lcmF0ZUtleSguLi5hcmdzKSk7XG5cdH07XG5cdC8qKlxuXHQqIENsZWFyIGNhY2hlZCBkYXRhXG5cdCovXG5cdGNvbnN0IGNsZWFyRGF0YSA9ICgpID0+IHtcblx0XHRjYWNoZS5jbGVhcigpO1xuXHR9O1xuXHRjb25zdCBtZW1vaXplZCA9ICguLi5hcmdzKSA9PiB7XG5cdFx0Y29uc3Qga2V5ID0gZ2VuZXJhdGVLZXkoLi4uYXJncyk7XG5cdFx0aWYgKGNhY2hlLmhhcyhrZXkpKSByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG5cdFx0cmV0dXJuIF9sb2FkRGF0YShrZXksIC4uLmFyZ3MpO1xuXHR9O1xuXHRtZW1vaXplZC5sb2FkID0gbG9hZERhdGE7XG5cdG1lbW9pemVkLmRlbGV0ZSA9IGRlbGV0ZURhdGE7XG5cdG1lbW9pemVkLmNsZWFyID0gY2xlYXJEYXRhO1xuXHRtZW1vaXplZC5nZW5lcmF0ZUtleSA9IGdlbmVyYXRlS2V5O1xuXHRtZW1vaXplZC5jYWNoZSA9IGNhY2hlO1xuXHRyZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1lbW9yeS9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ2KG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucyB8fCBcImltbWVkaWF0ZUNhbGxiYWNrXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSAxZTMsIGltbWVkaWF0ZSwgaW1tZWRpYXRlQ2FsbGJhY2sgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwsIHtcblx0XHRcdGltbWVkaWF0ZSxcblx0XHRcdGltbWVkaWF0ZUNhbGxiYWNrXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHVzZUludGVydmFsRm47XG59XG4vKipcbiogUmVhY3RpdmUgTWVtb3J5IEluZm8uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1lbW9yeVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZU1lbW9yeShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgbWVtb3J5ID0gcmVmKCk7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB0eXBlb2YgcGVyZm9ybWFuY2UgIT09IFwidW5kZWZpbmVkXCIgJiYgXCJtZW1vcnlcIiBpbiBwZXJmb3JtYW5jZSk7XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdGNvbnN0IHsgc2NoZWR1bGVyID0gZ2V0RGVmYXVsdFNjaGVkdWxlciQ2IH0gPSBvcHRpb25zO1xuXHRcdHNjaGVkdWxlcigoKSA9PiB7XG5cdFx0XHRtZW1vcnkudmFsdWUgPSBwZXJmb3JtYW5jZS5tZW1vcnk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRtZW1vcnlcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTW91c2UvaW5kZXgudHNcbmNvbnN0IFVzZU1vdXNlQnVpbHRpbkV4dHJhY3RvcnMgPSB7XG5cdHBhZ2U6IChldmVudCkgPT4gW2V2ZW50LnBhZ2VYLCBldmVudC5wYWdlWV0sXG5cdGNsaWVudDogKGV2ZW50KSA9PiBbZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WV0sXG5cdHNjcmVlbjogKGV2ZW50KSA9PiBbZXZlbnQuc2NyZWVuWCwgZXZlbnQuc2NyZWVuWV0sXG5cdG1vdmVtZW50OiAoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCA/IFtldmVudC5tb3ZlbWVudFgsIGV2ZW50Lm1vdmVtZW50WV0gOiBudWxsXG59O1xuLyoqXG4qIFJlYWN0aXZlIG1vdXNlIHBvc2l0aW9uLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNb3VzZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZU1vdXNlKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHR5cGUgPSBcInBhZ2VcIiwgdG91Y2ggPSB0cnVlLCByZXNldE9uVG91Y2hFbmRzID0gZmFsc2UsIGluaXRpYWxWYWx1ZSA9IHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHRhcmdldCA9IHdpbmRvdyQxLCBzY3JvbGwgPSB0cnVlLCBldmVudEZpbHRlciB9ID0gb3B0aW9ucztcblx0bGV0IF9wcmV2TW91c2VFdmVudCA9IG51bGw7XG5cdGxldCBfcHJldlNjcm9sbFggPSAwO1xuXHRsZXQgX3ByZXZTY3JvbGxZID0gMDtcblx0Y29uc3QgeCA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlLngpO1xuXHRjb25zdCB5ID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUueSk7XG5cdGNvbnN0IHNvdXJjZVR5cGUgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBleHRyYWN0b3IgPSB0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiID8gdHlwZSA6IFVzZU1vdXNlQnVpbHRpbkV4dHJhY3RvcnNbdHlwZV07XG5cdGNvbnN0IG1vdXNlSGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGV4dHJhY3RvcihldmVudCk7XG5cdFx0X3ByZXZNb3VzZUV2ZW50ID0gZXZlbnQ7XG5cdFx0aWYgKHJlc3VsdCkge1xuXHRcdFx0W3gudmFsdWUsIHkudmFsdWVdID0gcmVzdWx0O1xuXHRcdFx0c291cmNlVHlwZS52YWx1ZSA9IFwibW91c2VcIjtcblx0XHR9XG5cdFx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0XHRfcHJldlNjcm9sbFggPSB3aW5kb3ckMS5zY3JvbGxYO1xuXHRcdFx0X3ByZXZTY3JvbGxZID0gd2luZG93JDEuc2Nyb2xsWTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHRvdWNoSGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGV4dHJhY3RvcihldmVudC50b3VjaGVzWzBdKTtcblx0XHRcdGlmIChyZXN1bHQpIHtcblx0XHRcdFx0W3gudmFsdWUsIHkudmFsdWVdID0gcmVzdWx0O1xuXHRcdFx0XHRzb3VyY2VUeXBlLnZhbHVlID0gXCJ0b3VjaFwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3Qgc2Nyb2xsSGFuZGxlciA9ICgpID0+IHtcblx0XHRpZiAoIV9wcmV2TW91c2VFdmVudCB8fCAhd2luZG93JDEpIHJldHVybjtcblx0XHRjb25zdCBwb3MgPSBleHRyYWN0b3IoX3ByZXZNb3VzZUV2ZW50KTtcblx0XHRpZiAoX3ByZXZNb3VzZUV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCAmJiBwb3MpIHtcblx0XHRcdHgudmFsdWUgPSBwb3NbMF0gKyB3aW5kb3ckMS5zY3JvbGxYIC0gX3ByZXZTY3JvbGxYO1xuXHRcdFx0eS52YWx1ZSA9IHBvc1sxXSArIHdpbmRvdyQxLnNjcm9sbFkgLSBfcHJldlNjcm9sbFk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHR4LnZhbHVlID0gaW5pdGlhbFZhbHVlLng7XG5cdFx0eS52YWx1ZSA9IGluaXRpYWxWYWx1ZS55O1xuXHR9O1xuXHRjb25zdCBtb3VzZUhhbmRsZXJXcmFwcGVyID0gZXZlbnRGaWx0ZXIgPyAoZXZlbnQpID0+IGV2ZW50RmlsdGVyKCgpID0+IG1vdXNlSGFuZGxlcihldmVudCksIHt9KSA6IChldmVudCkgPT4gbW91c2VIYW5kbGVyKGV2ZW50KTtcblx0Y29uc3QgdG91Y2hIYW5kbGVyV3JhcHBlciA9IGV2ZW50RmlsdGVyID8gKGV2ZW50KSA9PiBldmVudEZpbHRlcigoKSA9PiB0b3VjaEhhbmRsZXIoZXZlbnQpLCB7fSkgOiAoZXZlbnQpID0+IHRvdWNoSGFuZGxlcihldmVudCk7XG5cdGNvbnN0IHNjcm9sbEhhbmRsZXJXcmFwcGVyID0gZXZlbnRGaWx0ZXIgPyAoKSA9PiBldmVudEZpbHRlcigoKSA9PiBzY3JvbGxIYW5kbGVyKCksIHt9KSA6ICgpID0+IHNjcm9sbEhhbmRsZXIoKTtcblx0aWYgKHRhcmdldCkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXCJtb3VzZW1vdmVcIiwgXCJkcmFnb3ZlclwiXSwgbW91c2VIYW5kbGVyV3JhcHBlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHRpZiAodG91Y2ggJiYgdHlwZSAhPT0gXCJtb3ZlbWVudFwiKSB7XG5cdFx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgW1widG91Y2hzdGFydFwiLCBcInRvdWNobW92ZVwiXSwgdG91Y2hIYW5kbGVyV3JhcHBlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHRcdGlmIChyZXNldE9uVG91Y2hFbmRzKSB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJ0b3VjaGVuZFwiLCByZXNldCwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR9XG5cdFx0aWYgKHNjcm9sbCAmJiB0eXBlID09PSBcInBhZ2VcIikgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJzY3JvbGxcIiwgc2Nyb2xsSGFuZGxlcldyYXBwZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR4LFxuXHRcdHksXG5cdFx0c291cmNlVHlwZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNb3VzZUluRWxlbWVudC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIG1vdXNlIHBvc2l0aW9uIHJlbGF0ZWQgdG8gYW4gZWxlbWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTW91c2VJbkVsZW1lbnRcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZU1vdXNlSW5FbGVtZW50KHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93UmVzaXplID0gdHJ1ZSwgd2luZG93U2Nyb2xsID0gdHJ1ZSwgaGFuZGxlT3V0c2lkZSA9IHRydWUsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCB0eXBlID0gb3B0aW9ucy50eXBlIHx8IFwicGFnZVwiO1xuXHRjb25zdCB7IHgsIHksIHNvdXJjZVR5cGUgfSA9IHVzZU1vdXNlKG9wdGlvbnMpO1xuXHRjb25zdCB0YXJnZXRSZWYgPSBzaGFsbG93UmVmKHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5kb2N1bWVudC5ib2R5KTtcblx0Y29uc3QgZWxlbWVudFggPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBlbGVtZW50WSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGVsZW1lbnRQb3NpdGlvblggPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBlbGVtZW50UG9zaXRpb25ZID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZWxlbWVudEhlaWdodCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGVsZW1lbnRXaWR0aCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGlzT3V0c2lkZSA9IHNoYWxsb3dSZWYodHJ1ZSk7XG5cdGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0UmVmKTtcblx0XHRpZiAoIWVsIHx8ICEoZWwgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgcmVjdCBvZiBlbC5nZXRDbGllbnRSZWN0cygpKSB7XG5cdFx0XHRjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gcmVjdDtcblx0XHRcdGVsZW1lbnRQb3NpdGlvblgudmFsdWUgPSBsZWZ0ICsgKHR5cGUgPT09IFwicGFnZVwiID8gd2luZG93JDEucGFnZVhPZmZzZXQgOiAwKTtcblx0XHRcdGVsZW1lbnRQb3NpdGlvblkudmFsdWUgPSB0b3AgKyAodHlwZSA9PT0gXCJwYWdlXCIgPyB3aW5kb3ckMS5wYWdlWU9mZnNldCA6IDApO1xuXHRcdFx0ZWxlbWVudEhlaWdodC52YWx1ZSA9IGhlaWdodDtcblx0XHRcdGVsZW1lbnRXaWR0aC52YWx1ZSA9IHdpZHRoO1xuXHRcdFx0Y29uc3QgZWxYID0geC52YWx1ZSAtIGVsZW1lbnRQb3NpdGlvblgudmFsdWU7XG5cdFx0XHRjb25zdCBlbFkgPSB5LnZhbHVlIC0gZWxlbWVudFBvc2l0aW9uWS52YWx1ZTtcblx0XHRcdGlzT3V0c2lkZS52YWx1ZSA9IHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCB8fCBlbFggPCAwIHx8IGVsWSA8IDAgfHwgZWxYID4gd2lkdGggfHwgZWxZID4gaGVpZ2h0O1xuXHRcdFx0aWYgKGhhbmRsZU91dHNpZGUgfHwgIWlzT3V0c2lkZS52YWx1ZSkge1xuXHRcdFx0XHRlbGVtZW50WC52YWx1ZSA9IGVsWDtcblx0XHRcdFx0ZWxlbWVudFkudmFsdWUgPSBlbFk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWlzT3V0c2lkZS52YWx1ZSkgYnJlYWs7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHN0b3BGbkxpc3QgPSBbXTtcblx0ZnVuY3Rpb24gc3RvcCgpIHtcblx0XHRzdG9wRm5MaXN0LmZvckVhY2goKGZuKSA9PiBmbigpKTtcblx0XHRzdG9wRm5MaXN0Lmxlbmd0aCA9IDA7XG5cdH1cblx0dHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHR1cGRhdGUoKTtcblx0fSk7XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGNvbnN0IHsgc3RvcDogc3RvcFJlc2l6ZU9ic2VydmVyIH0gPSB1c2VSZXNpemVPYnNlcnZlcih0YXJnZXRSZWYsIHVwZGF0ZSk7XG5cdFx0Y29uc3QgeyBzdG9wOiBzdG9wTXV0YXRpb25PYnNlcnZlciB9ID0gdXNlTXV0YXRpb25PYnNlcnZlcih0YXJnZXRSZWYsIHVwZGF0ZSwgeyBhdHRyaWJ1dGVGaWx0ZXI6IFtcInN0eWxlXCIsIFwiY2xhc3NcIl0gfSk7XG5cdFx0Y29uc3Qgc3RvcFdhdGNoID0gd2F0Y2goW1xuXHRcdFx0dGFyZ2V0UmVmLFxuXHRcdFx0eCxcblx0XHRcdHlcblx0XHRdLCB1cGRhdGUpO1xuXHRcdHN0b3BGbkxpc3QucHVzaChzdG9wUmVzaXplT2JzZXJ2ZXIsIHN0b3BNdXRhdGlvbk9ic2VydmVyLCBzdG9wV2F0Y2gpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIFwibW91c2VsZWF2ZVwiLCAoKSA9PiBpc091dHNpZGUudmFsdWUgPSB0cnVlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0aWYgKHdpbmRvd1Njcm9sbCkgc3RvcEZuTGlzdC5wdXNoKHVzZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdXBkYXRlLCB7XG5cdFx0XHRjYXB0dXJlOiB0cnVlLFxuXHRcdFx0cGFzc2l2ZTogdHJ1ZVxuXHRcdH0pKTtcblx0XHRpZiAod2luZG93UmVzaXplKSBzdG9wRm5MaXN0LnB1c2godXNlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR4LFxuXHRcdHksXG5cdFx0c291cmNlVHlwZSxcblx0XHRlbGVtZW50WCxcblx0XHRlbGVtZW50WSxcblx0XHRlbGVtZW50UG9zaXRpb25YLFxuXHRcdGVsZW1lbnRQb3NpdGlvblksXG5cdFx0ZWxlbWVudEhlaWdodCxcblx0XHRlbGVtZW50V2lkdGgsXG5cdFx0aXNPdXRzaWRlLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTW91c2VQcmVzc2VkL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgbW91c2UgcHJlc3Npbmcgc3RhdGUuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1vdXNlUHJlc3NlZFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZU1vdXNlUHJlc3NlZChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0b3VjaCA9IHRydWUsIGRyYWcgPSB0cnVlLCBjYXB0dXJlID0gZmFsc2UsIGluaXRpYWxWYWx1ZSA9IGZhbHNlLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgcHJlc3NlZCA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3Qgc291cmNlVHlwZSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGlmICghd2luZG93JDEpIHJldHVybiB7XG5cdFx0cHJlc3NlZCxcblx0XHRzb3VyY2VUeXBlXG5cdH07XG5cdGNvbnN0IG9uUHJlc3NlZCA9IChzcmNUeXBlKSA9PiAoZXZlbnQpID0+IHtcblx0XHR2YXIgX29wdGlvbnMkb25QcmVzc2VkO1xuXHRcdHByZXNzZWQudmFsdWUgPSB0cnVlO1xuXHRcdHNvdXJjZVR5cGUudmFsdWUgPSBzcmNUeXBlO1xuXHRcdChfb3B0aW9ucyRvblByZXNzZWQgPSBvcHRpb25zLm9uUHJlc3NlZCkgPT09IG51bGwgfHwgX29wdGlvbnMkb25QcmVzc2VkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25QcmVzc2VkLmNhbGwob3B0aW9ucywgZXZlbnQpO1xuXHR9O1xuXHRjb25zdCBvblJlbGVhc2VkID0gKGV2ZW50KSA9PiB7XG5cdFx0dmFyIF9vcHRpb25zJG9uUmVsZWFzZWQ7XG5cdFx0cHJlc3NlZC52YWx1ZSA9IGZhbHNlO1xuXHRcdHNvdXJjZVR5cGUudmFsdWUgPSBudWxsO1xuXHRcdChfb3B0aW9ucyRvblJlbGVhc2VkID0gb3B0aW9ucy5vblJlbGVhc2VkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblJlbGVhc2VkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25SZWxlYXNlZC5jYWxsKG9wdGlvbnMsIGV2ZW50KTtcblx0fTtcblx0Y29uc3QgdGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4gdW5yZWZFbGVtZW50KG9wdGlvbnMudGFyZ2V0KSB8fCB3aW5kb3ckMSk7XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRwYXNzaXZlOiB0cnVlLFxuXHRcdGNhcHR1cmVcblx0fTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwibW91c2Vkb3duXCIsIG9uUHJlc3NlZChcIm1vdXNlXCIpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm1vdXNlbGVhdmVcIiwgb25SZWxlYXNlZCwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJtb3VzZXVwXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGlmIChkcmFnKSB7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJhZ3N0YXJ0XCIsIG9uUHJlc3NlZChcIm1vdXNlXCIpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiZHJvcFwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiZHJhZ2VuZFwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGlmICh0b3VjaCkge1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRvdWNoc3RhcnRcIiwgb25QcmVzc2VkKFwidG91Y2hcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJ0b3VjaGVuZFwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwidG91Y2hjYW5jZWxcIiwgb25SZWxlYXNlZCwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHByZXNzZWQsXG5cdFx0c291cmNlVHlwZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VOYXZpZ2F0b3JMYW5ndWFnZS9pbmRleC50c1xuLyoqXG4qXG4qIFJlYWN0aXZlIHVzZU5hdmlnYXRvckxhbmd1YWdlXG4qXG4qIERldGVjdHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB1c2VyIGxhbmd1YWdlIGFuZCByZXR1cm5zIGEgcmVhY3RpdmUgbGFuZ3VhZ2VcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTmF2aWdhdG9yTGFuZ3VhZ2VcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VOYXZpZ2F0b3JMYW5ndWFnZShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgbmF2aWdhdG9yJDEgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEubmF2aWdhdG9yO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJsYW5ndWFnZVwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgbGFuZ3VhZ2UgPSBzaGFsbG93UmVmKG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IkMS5sYW5ndWFnZSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwibGFuZ3VhZ2VjaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdGlmIChuYXZpZ2F0b3IkMSkgbGFuZ3VhZ2UudmFsdWUgPSBuYXZpZ2F0b3IkMS5sYW5ndWFnZTtcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGxhbmd1YWdlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU5ldHdvcmsvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBOZXR3b3JrIHN0YXR1cy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTmV0d29ya1xuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZU5ldHdvcmsob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG5hdmlnYXRvciQxID0gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLm5hdmlnYXRvcjtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiY29ubmVjdGlvblwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgaXNPbmxpbmUgPSBzaGFsbG93UmVmKHRydWUpO1xuXHRjb25zdCBzYXZlRGF0YSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBvZmZsaW5lQXQgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IG9ubGluZUF0ID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCBkb3dubGluayA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3QgZG93bmxpbmtNYXggPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IHJ0dCA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3QgZWZmZWN0aXZlVHlwZSA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3QgdHlwZSA9IHNoYWxsb3dSZWYoXCJ1bmtub3duXCIpO1xuXHRjb25zdCBjb25uZWN0aW9uID0gaXNTdXBwb3J0ZWQudmFsdWUgJiYgbmF2aWdhdG9yJDEuY29ubmVjdGlvbjtcblx0ZnVuY3Rpb24gdXBkYXRlTmV0d29ya0luZm9ybWF0aW9uKCkge1xuXHRcdGlmICghbmF2aWdhdG9yJDEpIHJldHVybjtcblx0XHRpc09ubGluZS52YWx1ZSA9IG5hdmlnYXRvciQxLm9uTGluZTtcblx0XHRvZmZsaW5lQXQudmFsdWUgPSBpc09ubGluZS52YWx1ZSA/IHZvaWQgMCA6IERhdGUubm93KCk7XG5cdFx0b25saW5lQXQudmFsdWUgPSBpc09ubGluZS52YWx1ZSA/IERhdGUubm93KCkgOiB2b2lkIDA7XG5cdFx0aWYgKGNvbm5lY3Rpb24pIHtcblx0XHRcdGRvd25saW5rLnZhbHVlID0gY29ubmVjdGlvbi5kb3dubGluaztcblx0XHRcdGRvd25saW5rTWF4LnZhbHVlID0gY29ubmVjdGlvbi5kb3dubGlua01heDtcblx0XHRcdGVmZmVjdGl2ZVR5cGUudmFsdWUgPSBjb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGU7XG5cdFx0XHRydHQudmFsdWUgPSBjb25uZWN0aW9uLnJ0dDtcblx0XHRcdHNhdmVEYXRhLnZhbHVlID0gY29ubmVjdGlvbi5zYXZlRGF0YTtcblx0XHRcdHR5cGUudmFsdWUgPSBjb25uZWN0aW9uLnR5cGU7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRpZiAod2luZG93JDEpIHtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm9mZmxpbmVcIiwgKCkgPT4ge1xuXHRcdFx0aXNPbmxpbmUudmFsdWUgPSBmYWxzZTtcblx0XHRcdG9mZmxpbmVBdC52YWx1ZSA9IERhdGUubm93KCk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm9ubGluZVwiLCAoKSA9PiB7XG5cdFx0XHRpc09ubGluZS52YWx1ZSA9IHRydWU7XG5cdFx0XHRvbmxpbmVBdC52YWx1ZSA9IERhdGUubm93KCk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRpZiAoY29ubmVjdGlvbikgdXNlRXZlbnRMaXN0ZW5lcihjb25uZWN0aW9uLCBcImNoYW5nZVwiLCB1cGRhdGVOZXR3b3JrSW5mb3JtYXRpb24sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVwZGF0ZU5ldHdvcmtJbmZvcm1hdGlvbigpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzT25saW5lOiByZWFkb25seShpc09ubGluZSksXG5cdFx0c2F2ZURhdGE6IHJlYWRvbmx5KHNhdmVEYXRhKSxcblx0XHRvZmZsaW5lQXQ6IHJlYWRvbmx5KG9mZmxpbmVBdCksXG5cdFx0b25saW5lQXQ6IHJlYWRvbmx5KG9ubGluZUF0KSxcblx0XHRkb3dubGluazogcmVhZG9ubHkoZG93bmxpbmspLFxuXHRcdGRvd25saW5rTWF4OiByZWFkb25seShkb3dubGlua01heCksXG5cdFx0ZWZmZWN0aXZlVHlwZTogcmVhZG9ubHkoZWZmZWN0aXZlVHlwZSksXG5cdFx0cnR0OiByZWFkb25seShydHQpLFxuXHRcdHR5cGU6IHJlYWRvbmx5KHR5cGUpXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU5vdy9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ1KG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiBpbnRlcnZhbCA9PT0gXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiA/IChmbikgPT4gdXNlUmFmRm4oZm4sIHsgaW1tZWRpYXRlIH0pIDogKGZuKSA9PiB1c2VJbnRlcnZhbEZuKGZuLCBpbnRlcnZhbCwgb3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIHVzZVJhZkZuO1xufVxuLyoqXG4qIFJlYWN0aXZlIGN1cnJlbnQgRGF0ZSBpbnN0YW5jZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTm93XG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTm93KG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNvbnRyb2xzOiBleHBvc2VDb250cm9scyA9IGZhbHNlLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDUob3B0aW9ucykgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG5vdyA9IHJlZigvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IG5vdy52YWx1ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuXHRjb25zdCBjb250cm9scyA9IHNjaGVkdWxlcih1cGRhdGUpO1xuXHRpZiAoZXhwb3NlQ29udHJvbHMpIHJldHVybiB7XG5cdFx0bm93LFxuXHRcdC4uLmNvbnRyb2xzXG5cdH07XG5cdGVsc2UgcmV0dXJuIG5vdztcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlT2JqZWN0VXJsL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgVVJMIHJlcHJlc2VudGluZyBhbiBvYmplY3QuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU9iamVjdFVybFxuKiBAcGFyYW0gb2JqZWN0XG4qL1xuZnVuY3Rpb24gdXNlT2JqZWN0VXJsKG9iamVjdCkge1xuXHRjb25zdCB1cmwgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG5cdFx0aWYgKHVybC52YWx1ZSkgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwudmFsdWUpO1xuXHRcdHVybC52YWx1ZSA9IHZvaWQgMDtcblx0fTtcblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShvYmplY3QpLCAobmV3T2JqZWN0KSA9PiB7XG5cdFx0cmVsZWFzZSgpO1xuXHRcdGlmIChuZXdPYmplY3QpIHVybC52YWx1ZSA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3T2JqZWN0KTtcblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHJlbGVhc2UpO1xuXHRyZXR1cm4gcmVhZG9ubHkodXJsKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vbWF0aC91c2VDbGFtcC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgY2xhbXAgYSB2YWx1ZSBiZXR3ZWVuIHR3byBvdGhlciB2YWx1ZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNsYW1wXG4qIEBwYXJhbSB2YWx1ZSBudW1iZXJcbiogQHBhcmFtIG1pblxuKiBAcGFyYW0gbWF4XG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQ2xhbXAodmFsdWUsIG1pbiwgbWF4KSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiB8fCBpc1JlYWRvbmx5KHZhbHVlKSkgcmV0dXJuIGNvbXB1dGVkKCgpID0+IGNsYW1wKHRvVmFsdWUodmFsdWUpLCB0b1ZhbHVlKG1pbiksIHRvVmFsdWUobWF4KSkpO1xuXHRjb25zdCBfdmFsdWUgPSByZWYodmFsdWUpO1xuXHRyZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBfdmFsdWUudmFsdWUgPSBjbGFtcChfdmFsdWUudmFsdWUsIHRvVmFsdWUobWluKSwgdG9WYWx1ZShtYXgpKTtcblx0XHR9LFxuXHRcdHNldCh2YWx1ZSQxKSB7XG5cdFx0XHRfdmFsdWUudmFsdWUgPSBjbGFtcCh2YWx1ZSQxLCB0b1ZhbHVlKG1pbiksIHRvVmFsdWUobWF4KSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlT2Zmc2V0UGFnaW5hdGlvbi9pbmRleC50c1xuZnVuY3Rpb24gdXNlT2Zmc2V0UGFnaW5hdGlvbihvcHRpb25zKSB7XG5cdGNvbnN0IHsgdG90YWwgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHBhZ2VTaXplID0gMTAsIHBhZ2UgPSAxLCBvblBhZ2VDaGFuZ2UgPSBub29wLCBvblBhZ2VTaXplQ2hhbmdlID0gbm9vcCwgb25QYWdlQ291bnRDaGFuZ2UgPSBub29wIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjdXJyZW50UGFnZVNpemUgPSB1c2VDbGFtcChwYWdlU2l6ZSwgMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblx0Y29uc3QgcGFnZUNvdW50ID0gY29tcHV0ZWQoKCkgPT4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvVmFsdWUodG90YWwpIC8gdG9WYWx1ZShjdXJyZW50UGFnZVNpemUpKSkpO1xuXHRjb25zdCBjdXJyZW50UGFnZSA9IHVzZUNsYW1wKHBhZ2UsIDEsIHBhZ2VDb3VudCk7XG5cdGNvbnN0IGlzRmlyc3RQYWdlID0gY29tcHV0ZWQoKCkgPT4gY3VycmVudFBhZ2UudmFsdWUgPT09IDEpO1xuXHRjb25zdCBpc0xhc3RQYWdlID0gY29tcHV0ZWQoKCkgPT4gY3VycmVudFBhZ2UudmFsdWUgPT09IHBhZ2VDb3VudC52YWx1ZSk7XG5cdGlmIChpc1JlZihwYWdlKSkgc3luY1JlZihwYWdlLCBjdXJyZW50UGFnZSwgeyBkaXJlY3Rpb246IGlzUmVhZG9ubHkocGFnZSkgPyBcImx0clwiIDogXCJib3RoXCIgfSk7XG5cdGlmIChpc1JlZihwYWdlU2l6ZSkpIHN5bmNSZWYocGFnZVNpemUsIGN1cnJlbnRQYWdlU2l6ZSwgeyBkaXJlY3Rpb246IGlzUmVhZG9ubHkocGFnZVNpemUpID8gXCJsdHJcIiA6IFwiYm90aFwiIH0pO1xuXHRmdW5jdGlvbiBwcmV2KCkge1xuXHRcdGN1cnJlbnRQYWdlLnZhbHVlLS07XG5cdH1cblx0ZnVuY3Rpb24gbmV4dCgpIHtcblx0XHRjdXJyZW50UGFnZS52YWx1ZSsrO1xuXHR9XG5cdGNvbnN0IHJldHVyblZhbHVlID0ge1xuXHRcdGN1cnJlbnRQYWdlLFxuXHRcdGN1cnJlbnRQYWdlU2l6ZSxcblx0XHRwYWdlQ291bnQsXG5cdFx0aXNGaXJzdFBhZ2UsXG5cdFx0aXNMYXN0UGFnZSxcblx0XHRwcmV2LFxuXHRcdG5leHRcblx0fTtcblx0d2F0Y2goY3VycmVudFBhZ2UsICgpID0+IHtcblx0XHRvblBhZ2VDaGFuZ2UocmVhY3RpdmUocmV0dXJuVmFsdWUpKTtcblx0fSk7XG5cdHdhdGNoKGN1cnJlbnRQYWdlU2l6ZSwgKCkgPT4ge1xuXHRcdG9uUGFnZVNpemVDaGFuZ2UocmVhY3RpdmUocmV0dXJuVmFsdWUpKTtcblx0fSk7XG5cdHdhdGNoKHBhZ2VDb3VudCwgKCkgPT4ge1xuXHRcdG9uUGFnZUNvdW50Q2hhbmdlKHJlYWN0aXZlKHJldHVyblZhbHVlKSk7XG5cdH0pO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU9ubGluZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIG9ubGluZSBzdGF0ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlT25saW5lXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlT25saW5lKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGlzT25saW5lIH0gPSB1c2VOZXR3b3JrKG9wdGlvbnMpO1xuXHRyZXR1cm4gaXNPbmxpbmU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBhZ2VMZWF2ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHN0YXRlIHRvIHNob3cgd2hldGhlciBtb3VzZSBsZWF2ZXMgdGhlIHBhZ2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVBhZ2VMZWF2ZVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVBhZ2VMZWF2ZShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNMZWZ0ID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQpID0+IHtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0ZXZlbnQgPSBldmVudCB8fCB3aW5kb3ckMS5ldmVudDtcblx0XHRpc0xlZnQudmFsdWUgPSAhKGV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQudG9FbGVtZW50KTtcblx0fTtcblx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJtb3VzZW91dFwiLCBoYW5kbGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEuZG9jdW1lbnQsIFwibW91c2VsZWF2ZVwiLCBoYW5kbGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEuZG9jdW1lbnQsIFwibW91c2VlbnRlclwiLCBoYW5kbGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdHJldHVybiBpc0xlZnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNjcmVlbk9yaWVudGF0aW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgc2NyZWVuIG9yaWVudGF0aW9uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcmVlbk9yaWVudGF0aW9uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlU2NyZWVuT3JpZW50YXRpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcInNjcmVlblwiIGluIHdpbmRvdyQxICYmIFwib3JpZW50YXRpb25cIiBpbiB3aW5kb3ckMS5zY3JlZW4pO1xuXHRjb25zdCBzY3JlZW5PcmllbnRhdGlvbiA9IGlzU3VwcG9ydGVkLnZhbHVlID8gd2luZG93JDEuc2NyZWVuLm9yaWVudGF0aW9uIDoge307XG5cdGNvbnN0IG9yaWVudGF0aW9uID0gcmVmKHNjcmVlbk9yaWVudGF0aW9uLnR5cGUpO1xuXHRjb25zdCBhbmdsZSA9IHNoYWxsb3dSZWYoc2NyZWVuT3JpZW50YXRpb24uYW5nbGUgfHwgMCk7XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJvcmllbnRhdGlvbmNoYW5nZVwiLCAoKSA9PiB7XG5cdFx0b3JpZW50YXRpb24udmFsdWUgPSBzY3JlZW5PcmllbnRhdGlvbi50eXBlO1xuXHRcdGFuZ2xlLnZhbHVlID0gc2NyZWVuT3JpZW50YXRpb24uYW5nbGU7XG5cdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0Y29uc3QgbG9ja09yaWVudGF0aW9uID0gKHR5cGUpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdHlwZW9mIHNjcmVlbk9yaWVudGF0aW9uLmxvY2sgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHNjcmVlbk9yaWVudGF0aW9uLmxvY2sodHlwZSk7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJOb3Qgc3VwcG9ydGVkXCIpKTtcblx0fTtcblx0Y29uc3QgdW5sb2NrT3JpZW50YXRpb24gPSAoKSA9PiB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHR5cGVvZiBzY3JlZW5PcmllbnRhdGlvbi51bmxvY2sgPT09IFwiZnVuY3Rpb25cIikgc2NyZWVuT3JpZW50YXRpb24udW5sb2NrKCk7XG5cdH07XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0b3JpZW50YXRpb24sXG5cdFx0YW5nbGUsXG5cdFx0bG9ja09yaWVudGF0aW9uLFxuXHRcdHVubG9ja09yaWVudGF0aW9uXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBhcmFsbGF4L2luZGV4LnRzXG4vKipcbiogQ3JlYXRlIHBhcmFsbGF4IGVmZmVjdCBlYXNpbHkuIEl0IHVzZXMgYHVzZURldmljZU9yaWVudGF0aW9uYCBhbmQgZmFsbGJhY2sgdG8gYHVzZU1vdXNlYFxuKiBpZiBvcmllbnRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLlxuKlxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlUGFyYWxsYXgodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkZXZpY2VPcmllbnRhdGlvblRpbHRBZGp1c3QgPSAoaSkgPT4gaSwgZGV2aWNlT3JpZW50YXRpb25Sb2xsQWRqdXN0ID0gKGkpID0+IGksIG1vdXNlVGlsdEFkanVzdCA9IChpKSA9PiBpLCBtb3VzZVJvbGxBZGp1c3QgPSAoaSkgPT4gaSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG9yaWVudGF0aW9uID0gcmVhY3RpdmUodXNlRGV2aWNlT3JpZW50YXRpb24oeyB3aW5kb3c6IHdpbmRvdyQxIH0pKTtcblx0Y29uc3Qgc2NyZWVuT3JpZW50YXRpb24gPSByZWFjdGl2ZSh1c2VTY3JlZW5PcmllbnRhdGlvbih7IHdpbmRvdzogd2luZG93JDEgfSkpO1xuXHRjb25zdCB7IGVsZW1lbnRYOiB4LCBlbGVtZW50WTogeSwgZWxlbWVudFdpZHRoOiB3aWR0aCwgZWxlbWVudEhlaWdodDogaGVpZ2h0IH0gPSB1c2VNb3VzZUluRWxlbWVudCh0YXJnZXQsIHtcblx0XHRoYW5kbGVPdXRzaWRlOiBmYWxzZSxcblx0XHR3aW5kb3c6IHdpbmRvdyQxXG5cdH0pO1xuXHRjb25zdCBzb3VyY2UgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKG9yaWVudGF0aW9uLmlzU3VwcG9ydGVkICYmIChvcmllbnRhdGlvbi5hbHBoYSAhPSBudWxsICYmIG9yaWVudGF0aW9uLmFscGhhICE9PSAwIHx8IG9yaWVudGF0aW9uLmdhbW1hICE9IG51bGwgJiYgb3JpZW50YXRpb24uZ2FtbWEgIT09IDApKSByZXR1cm4gXCJkZXZpY2VPcmllbnRhdGlvblwiO1xuXHRcdHJldHVybiBcIm1vdXNlXCI7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdHJvbGw6IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdGlmIChzb3VyY2UudmFsdWUgPT09IFwiZGV2aWNlT3JpZW50YXRpb25cIikge1xuXHRcdFx0XHRsZXQgdmFsdWU7XG5cdFx0XHRcdHN3aXRjaCAoc2NyZWVuT3JpZW50YXRpb24ub3JpZW50YXRpb24pIHtcblx0XHRcdFx0XHRjYXNlIFwibGFuZHNjYXBlLXByaW1hcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gb3JpZW50YXRpb24uZ2FtbWEgLyA5MDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJsYW5kc2NhcGUtc2Vjb25kYXJ5XCI6XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IC1vcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInBvcnRyYWl0LXByaW1hcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gLW9yaWVudGF0aW9uLmJldGEgLyA5MDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJwb3J0cmFpdC1zZWNvbmRhcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogdmFsdWUgPSAtb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBkZXZpY2VPcmllbnRhdGlvblJvbGxBZGp1c3QodmFsdWUpO1xuXHRcdFx0fSBlbHNlIHJldHVybiBtb3VzZVJvbGxBZGp1c3QoLSh5LnZhbHVlIC0gaGVpZ2h0LnZhbHVlIC8gMikgLyBoZWlnaHQudmFsdWUpO1xuXHRcdH0pLFxuXHRcdHRpbHQ6IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdGlmIChzb3VyY2UudmFsdWUgPT09IFwiZGV2aWNlT3JpZW50YXRpb25cIikge1xuXHRcdFx0XHRsZXQgdmFsdWU7XG5cdFx0XHRcdHN3aXRjaCAoc2NyZWVuT3JpZW50YXRpb24ub3JpZW50YXRpb24pIHtcblx0XHRcdFx0XHRjYXNlIFwibGFuZHNjYXBlLXByaW1hcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcImxhbmRzY2FwZS1zZWNvbmRhcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gLW9yaWVudGF0aW9uLmJldGEgLyA5MDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJwb3J0cmFpdC1wcmltYXJ5XCI6XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IG9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwicG9ydHJhaXQtc2Vjb25kYXJ5XCI6XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IC1vcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogdmFsdWUgPSBvcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBkZXZpY2VPcmllbnRhdGlvblRpbHRBZGp1c3QodmFsdWUpO1xuXHRcdFx0fSBlbHNlIHJldHVybiBtb3VzZVRpbHRBZGp1c3QoKHgudmFsdWUgLSB3aWR0aC52YWx1ZSAvIDIpIC8gd2lkdGgudmFsdWUpO1xuXHRcdH0pLFxuXHRcdHNvdXJjZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQYXJlbnRFbGVtZW50L2luZGV4LnRzXG5mdW5jdGlvbiB1c2VQYXJlbnRFbGVtZW50KGVsZW1lbnQgPSB1c2VDdXJyZW50RWxlbWVudCgpKSB7XG5cdGNvbnN0IHBhcmVudEVsZW1lbnQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudChlbGVtZW50KTtcblx0XHRpZiAoZWwpIHBhcmVudEVsZW1lbnQudmFsdWUgPSBlbC5wYXJlbnRFbGVtZW50O1xuXHR9O1xuXHR0cnlPbk1vdW50ZWQodXBkYXRlKTtcblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShlbGVtZW50KSwgdXBkYXRlKTtcblx0cmV0dXJuIHBhcmVudEVsZW1lbnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBlcmZvcm1hbmNlT2JzZXJ2ZXIvaW5kZXgudHNcbi8qKlxuKiBPYnNlcnZlIHBlcmZvcm1hbmNlIG1ldHJpY3MuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVBlcmZvcm1hbmNlT2JzZXJ2ZXJcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VQZXJmb3JtYW5jZU9ic2VydmVyKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGltbWVkaWF0ZSA9IHRydWUsLi4ucGVyZm9ybWFuY2VPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJQZXJmb3JtYW5jZU9ic2VydmVyXCIgaW4gd2luZG93JDEpO1xuXHRsZXQgb2JzZXJ2ZXI7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0b2JzZXJ2ZXIgPT09IG51bGwgfHwgb2JzZXJ2ZXIgPT09IHZvaWQgMCB8fCBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdH07XG5cdGNvbnN0IHN0YXJ0ID0gKCkgPT4ge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdFx0c3RvcCgpO1xuXHRcdFx0b2JzZXJ2ZXIgPSBuZXcgUGVyZm9ybWFuY2VPYnNlcnZlcihjYWxsYmFjayk7XG5cdFx0XHRvYnNlcnZlci5vYnNlcnZlKHBlcmZvcm1hbmNlT3B0aW9ucyk7XG5cdFx0fVxuXHR9O1xuXHR0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcblx0aWYgKGltbWVkaWF0ZSkgc3RhcnQoKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdGFydCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBvaW50ZXIvaW5kZXgudHNcbmNvbnN0IGRlZmF1bHRTdGF0ZSA9IHtcblx0eDogMCxcblx0eTogMCxcblx0cG9pbnRlcklkOiAwLFxuXHRwcmVzc3VyZTogMCxcblx0dGlsdFg6IDAsXG5cdHRpbHRZOiAwLFxuXHR3aWR0aDogMCxcblx0aGVpZ2h0OiAwLFxuXHR0d2lzdDogMCxcblx0cG9pbnRlclR5cGU6IG51bGxcbn07XG5jb25zdCBrZXlzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5rZXlzKGRlZmF1bHRTdGF0ZSk7XG4vKipcbiogUmVhY3RpdmUgcG9pbnRlciBzdGF0ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUG9pbnRlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVBvaW50ZXIob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdGFyZ2V0ID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNJbnNpZGUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgc3RhdGUgPSBzaGFsbG93UmVmKG9wdGlvbnMuaW5pdGlhbFZhbHVlIHx8IHt9KTtcblx0T2JqZWN0LmFzc2lnbihzdGF0ZS52YWx1ZSwgZGVmYXVsdFN0YXRlLCBzdGF0ZS52YWx1ZSk7XG5cdGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQpID0+IHtcblx0XHRpc0luc2lkZS52YWx1ZSA9IHRydWU7XG5cdFx0aWYgKG9wdGlvbnMucG9pbnRlclR5cGVzICYmICFvcHRpb25zLnBvaW50ZXJUeXBlcy5pbmNsdWRlcyhldmVudC5wb2ludGVyVHlwZSkpIHJldHVybjtcblx0XHRzdGF0ZS52YWx1ZSA9IG9iamVjdFBpY2soZXZlbnQsIGtleXMsIGZhbHNlKTtcblx0fTtcblx0aWYgKHRhcmdldCkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXG5cdFx0XHRcInBvaW50ZXJkb3duXCIsXG5cdFx0XHRcInBvaW50ZXJtb3ZlXCIsXG5cdFx0XHRcInBvaW50ZXJ1cFwiXG5cdFx0XSwgaGFuZGxlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwb2ludGVybGVhdmVcIiwgKCkgPT4gaXNJbnNpZGUudmFsdWUgPSBmYWxzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdC4uLnRvUmVmcyhzdGF0ZSksXG5cdFx0aXNJbnNpZGVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUG9pbnRlckxvY2svaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBwb2ludGVyIGxvY2suXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVBvaW50ZXJMb2NrXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQb2ludGVyTG9jayh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gZG9jdW1lbnQkMSAmJiBcInBvaW50ZXJMb2NrRWxlbWVudFwiIGluIGRvY3VtZW50JDEpO1xuXHRjb25zdCBlbGVtZW50ID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCB0cmlnZ2VyRWxlbWVudCA9IHNoYWxsb3dSZWYoKTtcblx0bGV0IHRhcmdldEVsZW1lbnQ7XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJwb2ludGVybG9ja2NoYW5nZVwiLCAoKSA9PiB7XG5cdFx0XHR2YXIgX3BvaW50ZXJMb2NrRWxlbWVudDtcblx0XHRcdGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gKF9wb2ludGVyTG9ja0VsZW1lbnQgPSBkb2N1bWVudCQxLnBvaW50ZXJMb2NrRWxlbWVudCkgIT09IG51bGwgJiYgX3BvaW50ZXJMb2NrRWxlbWVudCAhPT0gdm9pZCAwID8gX3BvaW50ZXJMb2NrRWxlbWVudCA6IGVsZW1lbnQudmFsdWU7XG5cdFx0XHRpZiAodGFyZ2V0RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCA9PT0gdGFyZ2V0RWxlbWVudCkge1xuXHRcdFx0XHRlbGVtZW50LnZhbHVlID0gZG9jdW1lbnQkMS5wb2ludGVyTG9ja0VsZW1lbnQ7XG5cdFx0XHRcdGlmICghZWxlbWVudC52YWx1ZSkgdGFyZ2V0RWxlbWVudCA9IHRyaWdnZXJFbGVtZW50LnZhbHVlID0gbnVsbDtcblx0XHRcdH1cblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJwb2ludGVybG9ja2Vycm9yXCIsICgpID0+IHtcblx0XHRcdHZhciBfcG9pbnRlckxvY2tFbGVtZW50Mjtcblx0XHRcdGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gKF9wb2ludGVyTG9ja0VsZW1lbnQyID0gZG9jdW1lbnQkMS5wb2ludGVyTG9ja0VsZW1lbnQpICE9PSBudWxsICYmIF9wb2ludGVyTG9ja0VsZW1lbnQyICE9PSB2b2lkIDAgPyBfcG9pbnRlckxvY2tFbGVtZW50MiA6IGVsZW1lbnQudmFsdWU7XG5cdFx0XHRpZiAodGFyZ2V0RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCA9PT0gdGFyZ2V0RWxlbWVudCkge1xuXHRcdFx0XHRjb25zdCBhY3Rpb24gPSBkb2N1bWVudCQxLnBvaW50ZXJMb2NrRWxlbWVudCA/IFwicmVsZWFzZVwiIDogXCJhY3F1aXJlXCI7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvICR7YWN0aW9ufSBwb2ludGVyIGxvY2suYCk7XG5cdFx0XHR9XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBsb2NrKGUpIHtcblx0XHR2YXIgX3VucmVmRWxlbWVudDtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSB0aHJvdyBuZXcgRXJyb3IoXCJQb2ludGVyIExvY2sgQVBJIGlzIG5vdCBzdXBwb3J0ZWQgYnkgeW91ciBicm93c2VyLlwiKTtcblx0XHR0cmlnZ2VyRWxlbWVudC52YWx1ZSA9IGUgaW5zdGFuY2VvZiBFdmVudCA/IGUuY3VycmVudFRhcmdldCA6IG51bGw7XG5cdFx0dGFyZ2V0RWxlbWVudCA9IGUgaW5zdGFuY2VvZiBFdmVudCA/IChfdW5yZWZFbGVtZW50ID0gdW5yZWZFbGVtZW50KHRhcmdldCkpICE9PSBudWxsICYmIF91bnJlZkVsZW1lbnQgIT09IHZvaWQgMCA/IF91bnJlZkVsZW1lbnQgOiB0cmlnZ2VyRWxlbWVudC52YWx1ZSA6IHVucmVmRWxlbWVudChlKTtcblx0XHRpZiAoIXRhcmdldEVsZW1lbnQpIHRocm93IG5ldyBFcnJvcihcIlRhcmdldCBlbGVtZW50IHVuZGVmaW5lZC5cIik7XG5cdFx0dGFyZ2V0RWxlbWVudC5yZXF1ZXN0UG9pbnRlckxvY2soKTtcblx0XHRyZXR1cm4gYXdhaXQgdW50aWwoZWxlbWVudCkudG9CZSh0YXJnZXRFbGVtZW50KTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiB1bmxvY2soKSB7XG5cdFx0aWYgKCFlbGVtZW50LnZhbHVlKSByZXR1cm4gZmFsc2U7XG5cdFx0ZG9jdW1lbnQkMS5leGl0UG9pbnRlckxvY2soKTtcblx0XHRhd2FpdCB1bnRpbChlbGVtZW50KS50b0JlTnVsbCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0ZWxlbWVudCxcblx0XHR0cmlnZ2VyRWxlbWVudCxcblx0XHRsb2NrLFxuXHRcdHVubG9ja1xuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQb2ludGVyU3dpcGUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBzd2lwZSBkZXRlY3Rpb24gYmFzZWQgb24gUG9pbnRlckV2ZW50cy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUG9pbnRlclN3aXBlXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VQb2ludGVyU3dpcGUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgdGFyZ2V0UmVmID0gdG9SZWYodGFyZ2V0KTtcblx0Y29uc3QgeyB0aHJlc2hvbGQgPSA1MCwgb25Td2lwZSwgb25Td2lwZUVuZCwgb25Td2lwZVN0YXJ0LCBkaXNhYmxlVGV4dFNlbGVjdCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBwb3NTdGFydCA9IHJlYWN0aXZlKHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IHVwZGF0ZVBvc1N0YXJ0ID0gKHgsIHkpID0+IHtcblx0XHRwb3NTdGFydC54ID0geDtcblx0XHRwb3NTdGFydC55ID0geTtcblx0fTtcblx0Y29uc3QgcG9zRW5kID0gcmVhY3RpdmUoe1xuXHRcdHg6IDAsXG5cdFx0eTogMFxuXHR9KTtcblx0Y29uc3QgdXBkYXRlUG9zRW5kID0gKHgsIHkpID0+IHtcblx0XHRwb3NFbmQueCA9IHg7XG5cdFx0cG9zRW5kLnkgPSB5O1xuXHR9O1xuXHRjb25zdCBkaXN0YW5jZVggPSBjb21wdXRlZCgoKSA9PiBwb3NTdGFydC54IC0gcG9zRW5kLngpO1xuXHRjb25zdCBkaXN0YW5jZVkgPSBjb21wdXRlZCgoKSA9PiBwb3NTdGFydC55IC0gcG9zRW5kLnkpO1xuXHRjb25zdCB7IG1heCwgYWJzIH0gPSBNYXRoO1xuXHRjb25zdCBpc1RocmVzaG9sZEV4Y2VlZGVkID0gY29tcHV0ZWQoKCkgPT4gbWF4KGFicyhkaXN0YW5jZVgudmFsdWUpLCBhYnMoZGlzdGFuY2VZLnZhbHVlKSkgPj0gdGhyZXNob2xkKTtcblx0Y29uc3QgaXNTd2lwaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGlzUG9pbnRlckRvd24gPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZGlyZWN0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmICghaXNUaHJlc2hvbGRFeGNlZWRlZC52YWx1ZSkgcmV0dXJuIFwibm9uZVwiO1xuXHRcdGlmIChhYnMoZGlzdGFuY2VYLnZhbHVlKSA+IGFicyhkaXN0YW5jZVkudmFsdWUpKSByZXR1cm4gZGlzdGFuY2VYLnZhbHVlID4gMCA/IFwibGVmdFwiIDogXCJyaWdodFwiO1xuXHRcdGVsc2UgcmV0dXJuIGRpc3RhbmNlWS52YWx1ZSA+IDAgPyBcInVwXCIgOiBcImRvd25cIjtcblx0fSk7XG5cdGNvbnN0IGV2ZW50SXNBbGxvd2VkID0gKGUpID0+IHtcblx0XHR2YXIgX3JlZiwgX29wdGlvbnMkcG9pbnRlclR5cGVzLCBfb3B0aW9ucyRwb2ludGVyVHlwZXMyO1xuXHRcdGNvbnN0IGlzUmVsZWFzaW5nQnV0dG9uID0gZS5idXR0b25zID09PSAwO1xuXHRcdGNvbnN0IGlzUHJpbWFyeUJ1dHRvbiA9IGUuYnV0dG9ucyA9PT0gMTtcblx0XHRyZXR1cm4gKF9yZWYgPSAoX29wdGlvbnMkcG9pbnRlclR5cGVzID0gKF9vcHRpb25zJHBvaW50ZXJUeXBlczIgPSBvcHRpb25zLnBvaW50ZXJUeXBlcykgPT09IG51bGwgfHwgX29wdGlvbnMkcG9pbnRlclR5cGVzMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkcG9pbnRlclR5cGVzMi5pbmNsdWRlcyhlLnBvaW50ZXJUeXBlKSkgIT09IG51bGwgJiYgX29wdGlvbnMkcG9pbnRlclR5cGVzICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRwb2ludGVyVHlwZXMgOiBpc1JlbGVhc2luZ0J1dHRvbiB8fCBpc1ByaW1hcnlCdXR0b24pICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiB0cnVlO1xuXHR9O1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0Y29uc3Qgc3RvcHMgPSBbXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicG9pbnRlcmRvd25cIiwgKGUpID0+IHtcblx0XHRcdGlmICghZXZlbnRJc0FsbG93ZWQoZSkpIHJldHVybjtcblx0XHRcdGlzUG9pbnRlckRvd24udmFsdWUgPSB0cnVlO1xuXHRcdFx0Y29uc3QgZXZlbnRUYXJnZXQgPSBlLnRhcmdldDtcblx0XHRcdGV2ZW50VGFyZ2V0ID09PSBudWxsIHx8IGV2ZW50VGFyZ2V0ID09PSB2b2lkIDAgfHwgZXZlbnRUYXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuXHRcdFx0Y29uc3QgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0gPSBlO1xuXHRcdFx0dXBkYXRlUG9zU3RhcnQoeCwgeSk7XG5cdFx0XHR1cGRhdGVQb3NFbmQoeCwgeSk7XG5cdFx0XHRvblN3aXBlU3RhcnQgPT09IG51bGwgfHwgb25Td2lwZVN0YXJ0ID09PSB2b2lkIDAgfHwgb25Td2lwZVN0YXJ0KGUpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyksXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicG9pbnRlcm1vdmVcIiwgKGUpID0+IHtcblx0XHRcdGlmICghZXZlbnRJc0FsbG93ZWQoZSkpIHJldHVybjtcblx0XHRcdGlmICghaXNQb2ludGVyRG93bi52YWx1ZSkgcmV0dXJuO1xuXHRcdFx0Y29uc3QgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0gPSBlO1xuXHRcdFx0dXBkYXRlUG9zRW5kKHgsIHkpO1xuXHRcdFx0aWYgKCFpc1N3aXBpbmcudmFsdWUgJiYgaXNUaHJlc2hvbGRFeGNlZWRlZC52YWx1ZSkgaXNTd2lwaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpc1N3aXBpbmcudmFsdWUpIG9uU3dpcGUgPT09IG51bGwgfHwgb25Td2lwZSA9PT0gdm9pZCAwIHx8IG9uU3dpcGUoZSk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwb2ludGVydXBcIiwgKGUpID0+IHtcblx0XHRcdGlmICghZXZlbnRJc0FsbG93ZWQoZSkpIHJldHVybjtcblx0XHRcdGlmIChpc1N3aXBpbmcudmFsdWUpIG9uU3dpcGVFbmQgPT09IG51bGwgfHwgb25Td2lwZUVuZCA9PT0gdm9pZCAwIHx8IG9uU3dpcGVFbmQoZSwgZGlyZWN0aW9uLnZhbHVlKTtcblx0XHRcdGlzUG9pbnRlckRvd24udmFsdWUgPSBmYWxzZTtcblx0XHRcdGlzU3dpcGluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucylcblx0XTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHR2YXIgX3RhcmdldFJlZiR2YWx1ZTtcblx0XHQoX3RhcmdldFJlZiR2YWx1ZSA9IHRhcmdldFJlZi52YWx1ZSkgPT09IG51bGwgfHwgX3RhcmdldFJlZiR2YWx1ZSA9PT0gdm9pZCAwIHx8IChfdGFyZ2V0UmVmJHZhbHVlID0gX3RhcmdldFJlZiR2YWx1ZS5zdHlsZSkgPT09IG51bGwgfHwgX3RhcmdldFJlZiR2YWx1ZSA9PT0gdm9pZCAwIHx8IF90YXJnZXRSZWYkdmFsdWUuc2V0UHJvcGVydHkoXCJ0b3VjaC1hY3Rpb25cIiwgXCJwYW4teVwiKTtcblx0XHRpZiAoZGlzYWJsZVRleHRTZWxlY3QpIHtcblx0XHRcdHZhciBfdGFyZ2V0UmVmJHZhbHVlMiwgX3RhcmdldFJlZiR2YWx1ZTMsIF90YXJnZXRSZWYkdmFsdWU0O1xuXHRcdFx0KF90YXJnZXRSZWYkdmFsdWUyID0gdGFyZ2V0UmVmLnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlMiA9PT0gdm9pZCAwIHx8IChfdGFyZ2V0UmVmJHZhbHVlMiA9IF90YXJnZXRSZWYkdmFsdWUyLnN0eWxlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlMiA9PT0gdm9pZCAwIHx8IF90YXJnZXRSZWYkdmFsdWUyLnNldFByb3BlcnR5KFwiLXdlYmtpdC11c2VyLXNlbGVjdFwiLCBcIm5vbmVcIik7XG5cdFx0XHQoX3RhcmdldFJlZiR2YWx1ZTMgPSB0YXJnZXRSZWYudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWUzID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWUzID0gX3RhcmdldFJlZiR2YWx1ZTMuc3R5bGUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWUzID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZTMuc2V0UHJvcGVydHkoXCItbXMtdXNlci1zZWxlY3RcIiwgXCJub25lXCIpO1xuXHRcdFx0KF90YXJnZXRSZWYkdmFsdWU0ID0gdGFyZ2V0UmVmLnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlNCA9PT0gdm9pZCAwIHx8IChfdGFyZ2V0UmVmJHZhbHVlNCA9IF90YXJnZXRSZWYkdmFsdWU0LnN0eWxlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlNCA9PT0gdm9pZCAwIHx8IF90YXJnZXRSZWYkdmFsdWU0LnNldFByb3BlcnR5KFwidXNlci1zZWxlY3RcIiwgXCJub25lXCIpO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiBzdG9wcy5mb3JFYWNoKChzKSA9PiBzKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3dpcGluZzogcmVhZG9ubHkoaXNTd2lwaW5nKSxcblx0XHRkaXJlY3Rpb246IHJlYWRvbmx5KGRpcmVjdGlvbiksXG5cdFx0cG9zU3RhcnQ6IHJlYWRvbmx5KHBvc1N0YXJ0KSxcblx0XHRwb3NFbmQ6IHJlYWRvbmx5KHBvc0VuZCksXG5cdFx0ZGlzdGFuY2VYLFxuXHRcdGRpc3RhbmNlWSxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZENvbG9yU2NoZW1lL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgcHJlZmVycy1jb2xvci1zY2hlbWUgbWVkaWEgcXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZENvbG9yU2NoZW1lXG4qIEBwYXJhbSBbb3B0aW9uc11cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWRDb2xvclNjaGVtZShvcHRpb25zKSB7XG5cdGNvbnN0IGlzTGlnaHQgPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodClcIiwgb3B0aW9ucyk7XG5cdGNvbnN0IGlzRGFyayA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspXCIsIG9wdGlvbnMpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmIChpc0RhcmsudmFsdWUpIHJldHVybiBcImRhcmtcIjtcblx0XHRpZiAoaXNMaWdodC52YWx1ZSkgcmV0dXJuIFwibGlnaHRcIjtcblx0XHRyZXR1cm4gXCJuby1wcmVmZXJlbmNlXCI7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQcmVmZXJyZWRDb250cmFzdC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHByZWZlcnMtY29udHJhc3QgbWVkaWEgcXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZENvbnRyYXN0XG4qIEBwYXJhbSBbb3B0aW9uc11cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWRDb250cmFzdChvcHRpb25zKSB7XG5cdGNvbnN0IGlzTW9yZSA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb250cmFzdDogbW9yZSlcIiwgb3B0aW9ucyk7XG5cdGNvbnN0IGlzTGVzcyA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb250cmFzdDogbGVzcylcIiwgb3B0aW9ucyk7XG5cdGNvbnN0IGlzQ3VzdG9tID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbnRyYXN0OiBjdXN0b20pXCIsIG9wdGlvbnMpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmIChpc01vcmUudmFsdWUpIHJldHVybiBcIm1vcmVcIjtcblx0XHRpZiAoaXNMZXNzLnZhbHVlKSByZXR1cm4gXCJsZXNzXCI7XG5cdFx0aWYgKGlzQ3VzdG9tLnZhbHVlKSByZXR1cm4gXCJjdXN0b21cIjtcblx0XHRyZXR1cm4gXCJuby1wcmVmZXJlbmNlXCI7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQcmVmZXJyZWRMYW5ndWFnZXMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBOYXZpZ2F0b3IgTGFuZ3VhZ2VzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQcmVmZXJyZWRMYW5ndWFnZXNcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWRMYW5ndWFnZXMob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGlmICghd2luZG93JDEpIHJldHVybiBzaGFsbG93UmVmKFtcImVuXCJdKTtcblx0Y29uc3QgbmF2aWdhdG9yJDEgPSB3aW5kb3ckMS5uYXZpZ2F0b3I7XG5cdGNvbnN0IHZhbHVlID0gc2hhbGxvd1JlZihuYXZpZ2F0b3IkMS5sYW5ndWFnZXMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImxhbmd1YWdlY2hhbmdlXCIsICgpID0+IHtcblx0XHR2YWx1ZS52YWx1ZSA9IG5hdmlnYXRvciQxLmxhbmd1YWdlcztcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4gdmFsdWU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZFJlZHVjZWRNb3Rpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBwcmVmZXJzLXJlZHVjZWQtbW90aW9uIG1lZGlhIHF1ZXJ5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQcmVmZXJyZWRSZWR1Y2VkTW90aW9uXG4qIEBwYXJhbSBbb3B0aW9uc11cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWRSZWR1Y2VkTW90aW9uKG9wdGlvbnMpIHtcblx0Y29uc3QgaXNSZWR1Y2VkID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpXCIsIG9wdGlvbnMpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmIChpc1JlZHVjZWQudmFsdWUpIHJldHVybiBcInJlZHVjZVwiO1xuXHRcdHJldHVybiBcIm5vLXByZWZlcmVuY2VcIjtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZFJlZHVjZWRUcmFuc3BhcmVuY3kvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBwcmVmZXJzLXJlZHVjZWQtdHJhbnNwYXJlbmN5IG1lZGlhIHF1ZXJ5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQcmVmZXJyZWRSZWR1Y2VkVHJhbnNwYXJlbmN5XG4qIEBwYXJhbSBbb3B0aW9uc11cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWRSZWR1Y2VkVHJhbnNwYXJlbmN5KG9wdGlvbnMpIHtcblx0Y29uc3QgaXNSZWR1Y2VkID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLXJlZHVjZWQtdHJhbnNwYXJlbmN5OiByZWR1Y2UpXCIsIG9wdGlvbnMpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmIChpc1JlZHVjZWQudmFsdWUpIHJldHVybiBcInJlZHVjZVwiO1xuXHRcdHJldHVybiBcIm5vLXByZWZlcmVuY2VcIjtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZXZpb3VzL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VQcmV2aW91cyh2YWx1ZSwgaW5pdGlhbFZhbHVlKSB7XG5cdGNvbnN0IHByZXZpb3VzID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUpO1xuXHR3YXRjaCh0b1JlZih2YWx1ZSksIChfLCBvbGRWYWx1ZSkgPT4ge1xuXHRcdHByZXZpb3VzLnZhbHVlID0gb2xkVmFsdWU7XG5cdH0sIHsgZmx1c2g6IFwic3luY1wiIH0pO1xuXHRyZXR1cm4gcmVhZG9ubHkocHJldmlvdXMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTY3JlZW5TYWZlQXJlYS9pbmRleC50c1xuY29uc3QgdG9wVmFyTmFtZSA9IFwiLS12dWV1c2Utc2FmZS1hcmVhLXRvcFwiO1xuY29uc3QgcmlnaHRWYXJOYW1lID0gXCItLXZ1ZXVzZS1zYWZlLWFyZWEtcmlnaHRcIjtcbmNvbnN0IGJvdHRvbVZhck5hbWUgPSBcIi0tdnVldXNlLXNhZmUtYXJlYS1ib3R0b21cIjtcbmNvbnN0IGxlZnRWYXJOYW1lID0gXCItLXZ1ZXVzZS1zYWZlLWFyZWEtbGVmdFwiO1xuLyoqXG4qIFJlYWN0aXZlIGBlbnYoc2FmZS1hcmVhLWluc2V0LSopYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTY3JlZW5TYWZlQXJlYVxuKi9cbmZ1bmN0aW9uIHVzZVNjcmVlblNhZmVBcmVhKCkge1xuXHRjb25zdCB0b3AgPSBzaGFsbG93UmVmKFwiXCIpO1xuXHRjb25zdCByaWdodCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IGJvdHRvbSA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IGxlZnQgPSBzaGFsbG93UmVmKFwiXCIpO1xuXHRpZiAoaXNDbGllbnQpIHtcblx0XHRjb25zdCB0b3BDc3NWYXIgPSB1c2VDc3NWYXIodG9wVmFyTmFtZSk7XG5cdFx0Y29uc3QgcmlnaHRDc3NWYXIgPSB1c2VDc3NWYXIocmlnaHRWYXJOYW1lKTtcblx0XHRjb25zdCBib3R0b21Dc3NWYXIgPSB1c2VDc3NWYXIoYm90dG9tVmFyTmFtZSk7XG5cdFx0Y29uc3QgbGVmdENzc1ZhciA9IHVzZUNzc1ZhcihsZWZ0VmFyTmFtZSk7XG5cdFx0dG9wQ3NzVmFyLnZhbHVlID0gXCJlbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwgMHB4KVwiO1xuXHRcdHJpZ2h0Q3NzVmFyLnZhbHVlID0gXCJlbnYoc2FmZS1hcmVhLWluc2V0LXJpZ2h0LCAwcHgpXCI7XG5cdFx0Ym90dG9tQ3NzVmFyLnZhbHVlID0gXCJlbnYoc2FmZS1hcmVhLWluc2V0LWJvdHRvbSwgMHB4KVwiO1xuXHRcdGxlZnRDc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtbGVmdCwgMHB4KVwiO1xuXHRcdHRyeU9uTW91bnRlZCh1cGRhdGUpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXNlRGVib3VuY2VGbih1cGRhdGUpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlKCkge1xuXHRcdHRvcC52YWx1ZSA9IGdldFZhbHVlKHRvcFZhck5hbWUpO1xuXHRcdHJpZ2h0LnZhbHVlID0gZ2V0VmFsdWUocmlnaHRWYXJOYW1lKTtcblx0XHRib3R0b20udmFsdWUgPSBnZXRWYWx1ZShib3R0b21WYXJOYW1lKTtcblx0XHRsZWZ0LnZhbHVlID0gZ2V0VmFsdWUobGVmdFZhck5hbWUpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0dG9wLFxuXHRcdHJpZ2h0LFxuXHRcdGJvdHRvbSxcblx0XHRsZWZ0LFxuXHRcdHVwZGF0ZVxuXHR9O1xufVxuZnVuY3Rpb24gZ2V0VmFsdWUocG9zaXRpb24pIHtcblx0cmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHBvc2l0aW9uKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2NyaXB0VGFnL2luZGV4LnRzXG4vKipcbiogQXN5bmMgc2NyaXB0IHRhZyBsb2FkaW5nLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTY3JpcHRUYWdcbiogQHBhcmFtIHNyY1xuKiBAcGFyYW0gb25Mb2FkZWRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTY3JpcHRUYWcoc3JjLCBvbkxvYWRlZCA9IG5vb3AsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIG1hbnVhbCA9IGZhbHNlLCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiwgYXN5bmMgPSB0cnVlLCBjcm9zc09yaWdpbiwgcmVmZXJyZXJQb2xpY3ksIG5vTW9kdWxlLCBkZWZlciwgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQsIGF0dHJzID0ge30sIG5vbmNlID0gdm9pZCAwIH0gPSBvcHRpb25zO1xuXHRjb25zdCBzY3JpcHRUYWcgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRsZXQgX3Byb21pc2UgPSBudWxsO1xuXHQvKipcblx0KiBMb2FkIHRoZSBzY3JpcHQgc3BlY2lmaWVkIHZpYSBgc3JjYC5cblx0KlxuXHQqIEBwYXJhbSB3YWl0Rm9yU2NyaXB0TG9hZCBXaGV0aGVyIGlmIHRoZSBQcm9taXNlIHNob3VsZCByZXNvbHZlIG9uY2UgdGhlIFwibG9hZFwiIGV2ZW50IGlzIGVtaXR0ZWQgYnkgdGhlIDxzY3JpcHQ+IGF0dHJpYnV0ZSwgb3IgcmlnaHQgYWZ0ZXIgYXBwZW5kaW5nIGl0IHRvIHRoZSBET00uXG5cdCogQHJldHVybnMgUHJvbWlzZTxIVE1MU2NyaXB0RWxlbWVudD5cblx0Ki9cblx0Y29uc3QgbG9hZFNjcmlwdCA9ICh3YWl0Rm9yU2NyaXB0TG9hZCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IHJlc29sdmVXaXRoRWxlbWVudCA9IChlbCQxKSA9PiB7XG5cdFx0XHRzY3JpcHRUYWcudmFsdWUgPSBlbCQxO1xuXHRcdFx0cmVzb2x2ZShlbCQxKTtcblx0XHRcdHJldHVybiBlbCQxO1xuXHRcdH07XG5cdFx0aWYgKCFkb2N1bWVudCQxKSB7XG5cdFx0XHRyZXNvbHZlKGZhbHNlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IHNob3VsZEFwcGVuZCA9IGZhbHNlO1xuXHRcdGxldCBlbCA9IGRvY3VtZW50JDEucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYz1cIiR7dG9WYWx1ZShzcmMpfVwiXWApO1xuXHRcdGlmICghZWwpIHtcblx0XHRcdGVsID0gZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuXHRcdFx0ZWwudHlwZSA9IHR5cGU7XG5cdFx0XHRlbC5hc3luYyA9IGFzeW5jO1xuXHRcdFx0ZWwuc3JjID0gdG9WYWx1ZShzcmMpO1xuXHRcdFx0aWYgKGRlZmVyKSBlbC5kZWZlciA9IGRlZmVyO1xuXHRcdFx0aWYgKGNyb3NzT3JpZ2luKSBlbC5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luO1xuXHRcdFx0aWYgKG5vTW9kdWxlKSBlbC5ub01vZHVsZSA9IG5vTW9kdWxlO1xuXHRcdFx0aWYgKHJlZmVycmVyUG9saWN5KSBlbC5yZWZlcnJlclBvbGljeSA9IHJlZmVycmVyUG9saWN5O1xuXHRcdFx0aWYgKG5vbmNlKSBlbC5ub25jZSA9IG5vbmNlO1xuXHRcdFx0T2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtuYW1lLCB2YWx1ZV0pID0+IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpKTtcblx0XHRcdHNob3VsZEFwcGVuZCA9IHRydWU7XG5cdFx0fSBlbHNlIGlmIChlbC5oYXNBdHRyaWJ1dGUoXCJkYXRhLWxvYWRlZFwiKSkgcmVzb2x2ZVdpdGhFbGVtZW50KGVsKTtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsLCBcImVycm9yXCIsIChldmVudCkgPT4gcmVqZWN0KGV2ZW50KSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsLCBcImFib3J0XCIsIChldmVudCkgPT4gcmVqZWN0KGV2ZW50KSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsLCBcImxvYWRcIiwgKCkgPT4ge1xuXHRcdFx0ZWwuc2V0QXR0cmlidXRlKFwiZGF0YS1sb2FkZWRcIiwgXCJ0cnVlXCIpO1xuXHRcdFx0b25Mb2FkZWQoZWwpO1xuXHRcdFx0cmVzb2x2ZVdpdGhFbGVtZW50KGVsKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGlmIChzaG91bGRBcHBlbmQpIGVsID0gZG9jdW1lbnQkMS5oZWFkLmFwcGVuZENoaWxkKGVsKTtcblx0XHRpZiAoIXdhaXRGb3JTY3JpcHRMb2FkKSByZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuXHR9KTtcblx0LyoqXG5cdCogRXhwb3NlZCBzaW5nbGV0b24gd3JhcHBlciBmb3IgYGxvYWRTY3JpcHRgLCBhdm9pZGluZyBjYWxsaW5nIGl0IHR3aWNlLlxuXHQqXG5cdCogQHBhcmFtIHdhaXRGb3JTY3JpcHRMb2FkIFdoZXRoZXIgaWYgdGhlIFByb21pc2Ugc2hvdWxkIHJlc29sdmUgb25jZSB0aGUgXCJsb2FkXCIgZXZlbnQgaXMgZW1pdHRlZCBieSB0aGUgPHNjcmlwdD4gYXR0cmlidXRlLCBvciByaWdodCBhZnRlciBhcHBlbmRpbmcgaXQgdG8gdGhlIERPTS5cblx0KiBAcmV0dXJucyBQcm9taXNlPEhUTUxTY3JpcHRFbGVtZW50PlxuXHQqL1xuXHRjb25zdCBsb2FkID0gKHdhaXRGb3JTY3JpcHRMb2FkID0gdHJ1ZSkgPT4ge1xuXHRcdGlmICghX3Byb21pc2UpIF9wcm9taXNlID0gbG9hZFNjcmlwdCh3YWl0Rm9yU2NyaXB0TG9hZCk7XG5cdFx0cmV0dXJuIF9wcm9taXNlO1xuXHR9O1xuXHQvKipcblx0KiBVbmxvYWQgdGhlIHNjcmlwdCBzcGVjaWZpZWQgYnkgYHNyY2AuXG5cdCovXG5cdGNvbnN0IHVubG9hZCA9ICgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHJldHVybjtcblx0XHRfcHJvbWlzZSA9IG51bGw7XG5cdFx0aWYgKHNjcmlwdFRhZy52YWx1ZSkgc2NyaXB0VGFnLnZhbHVlID0gbnVsbDtcblx0XHRjb25zdCBlbCA9IGRvY3VtZW50JDEucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYz1cIiR7dG9WYWx1ZShzcmMpfVwiXWApO1xuXHRcdGlmIChlbCkgZG9jdW1lbnQkMS5oZWFkLnJlbW92ZUNoaWxkKGVsKTtcblx0fTtcblx0aWYgKGltbWVkaWF0ZSAmJiAhbWFudWFsKSB0cnlPbk1vdW50ZWQobG9hZCk7XG5cdGlmICghbWFudWFsKSB0cnlPblVubW91bnRlZCh1bmxvYWQpO1xuXHRyZXR1cm4ge1xuXHRcdHNjcmlwdFRhZyxcblx0XHRsb2FkLFxuXHRcdHVubG9hZFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTY3JvbGxMb2NrL2luZGV4LnRzXG5mdW5jdGlvbiBjaGVja092ZXJmbG93U2Nyb2xsKGVsZSkge1xuXHRjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZSk7XG5cdGlmIChzdHlsZS5vdmVyZmxvd1ggPT09IFwic2Nyb2xsXCIgfHwgc3R5bGUub3ZlcmZsb3dZID09PSBcInNjcm9sbFwiIHx8IHN0eWxlLm92ZXJmbG93WCA9PT0gXCJhdXRvXCIgJiYgZWxlLmNsaWVudFdpZHRoIDwgZWxlLnNjcm9sbFdpZHRoIHx8IHN0eWxlLm92ZXJmbG93WSA9PT0gXCJhdXRvXCIgJiYgZWxlLmNsaWVudEhlaWdodCA8IGVsZS5zY3JvbGxIZWlnaHQpIHJldHVybiB0cnVlO1xuXHRlbHNlIHtcblx0XHRjb25zdCBwYXJlbnQgPSBlbGUucGFyZW50Tm9kZTtcblx0XHRpZiAoIXBhcmVudCB8fCBwYXJlbnQudGFnTmFtZSA9PT0gXCJCT0RZXCIpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gY2hlY2tPdmVyZmxvd1Njcm9sbChwYXJlbnQpO1xuXHR9XG59XG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChyYXdFdmVudCkge1xuXHRjb25zdCBlID0gcmF3RXZlbnQgfHwgd2luZG93LmV2ZW50O1xuXHRjb25zdCBfdGFyZ2V0ID0gZS50YXJnZXQ7XG5cdGlmIChjaGVja092ZXJmbG93U2Nyb2xsKF90YXJnZXQpKSByZXR1cm4gZmFsc2U7XG5cdGlmIChlLnRvdWNoZXMubGVuZ3RoID4gMSkgcmV0dXJuIHRydWU7XG5cdGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG5cdHJldHVybiBmYWxzZTtcbn1cbmNvbnN0IGVsSW5pdGlhbE92ZXJmbG93ID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4vKipcbiogTG9jayBzY3JvbGxpbmcgb2YgdGhlIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcm9sbExvY2tcbiogQHBhcmFtIGVsZW1lbnRcbiovXG5mdW5jdGlvbiB1c2VTY3JvbGxMb2NrKGVsZW1lbnQsIGluaXRpYWxTdGF0ZSA9IGZhbHNlKSB7XG5cdGNvbnN0IGlzTG9ja2VkID0gc2hhbGxvd1JlZihpbml0aWFsU3RhdGUpO1xuXHRsZXQgc3RvcFRvdWNoTW92ZUxpc3RlbmVyID0gbnVsbDtcblx0bGV0IGluaXRpYWxPdmVyZmxvdyA9IFwiXCI7XG5cdHdhdGNoKHRvUmVmKGVsZW1lbnQpLCAoZWwpID0+IHtcblx0XHRjb25zdCB0YXJnZXQgPSByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsKSk7XG5cdFx0aWYgKHRhcmdldCkge1xuXHRcdFx0Y29uc3QgZWxlID0gdGFyZ2V0O1xuXHRcdFx0aWYgKCFlbEluaXRpYWxPdmVyZmxvdy5nZXQoZWxlKSkgZWxJbml0aWFsT3ZlcmZsb3cuc2V0KGVsZSwgZWxlLnN0eWxlLm92ZXJmbG93KTtcblx0XHRcdGlmIChlbGUuc3R5bGUub3ZlcmZsb3cgIT09IFwiaGlkZGVuXCIpIGluaXRpYWxPdmVyZmxvdyA9IGVsZS5zdHlsZS5vdmVyZmxvdztcblx0XHRcdGlmIChlbGUuc3R5bGUub3ZlcmZsb3cgPT09IFwiaGlkZGVuXCIpIHJldHVybiBpc0xvY2tlZC52YWx1ZSA9IHRydWU7XG5cdFx0XHRpZiAoaXNMb2NrZWQudmFsdWUpIHJldHVybiBlbGUuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdH1cblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdGNvbnN0IGxvY2sgPSAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsZW1lbnQpKTtcblx0XHRpZiAoIWVsIHx8IGlzTG9ja2VkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKGlzSU9TKSBzdG9wVG91Y2hNb3ZlTGlzdGVuZXIgPSB1c2VFdmVudExpc3RlbmVyKGVsLCBcInRvdWNobW92ZVwiLCAoZSkgPT4ge1xuXHRcdFx0cHJldmVudERlZmF1bHQoZSk7XG5cdFx0fSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcblx0XHRlbC5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0aXNMb2NrZWQudmFsdWUgPSB0cnVlO1xuXHR9O1xuXHRjb25zdCB1bmxvY2sgPSAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsZW1lbnQpKTtcblx0XHRpZiAoIWVsIHx8ICFpc0xvY2tlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmIChpc0lPUykgc3RvcFRvdWNoTW92ZUxpc3RlbmVyID09PSBudWxsIHx8IHN0b3BUb3VjaE1vdmVMaXN0ZW5lciA9PT0gdm9pZCAwIHx8IHN0b3BUb3VjaE1vdmVMaXN0ZW5lcigpO1xuXHRcdGVsLnN0eWxlLm92ZXJmbG93ID0gaW5pdGlhbE92ZXJmbG93O1xuXHRcdGVsSW5pdGlhbE92ZXJmbG93LmRlbGV0ZShlbCk7XG5cdFx0aXNMb2NrZWQudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2UodW5sb2NrKTtcblx0cmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gaXNMb2NrZWQudmFsdWU7XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0aWYgKHYpIGxvY2soKTtcblx0XHRcdGVsc2UgdW5sb2NrKCk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2Vzc2lvblN0b3JhZ2UvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBTZXNzaW9uU3RvcmFnZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2Vzc2lvblN0b3JhZ2VcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaW5pdGlhbFZhbHVlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU2Vzc2lvblN0b3JhZ2Uoa2V5LCBpbml0aWFsVmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gdXNlU3RvcmFnZShrZXksIGluaXRpYWxWYWx1ZSwgd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLnNlc3Npb25TdG9yYWdlLCBvcHRpb25zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2hhcmUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBXZWIgU2hhcmUgQVBJLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTaGFyZVxuKiBAcGFyYW0gc2hhcmVPcHRpb25zXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlU2hhcmUoc2hhcmVPcHRpb25zID0ge30sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zO1xuXHRjb25zdCBfbmF2aWdhdG9yID0gbmF2aWdhdG9yJDE7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBfbmF2aWdhdG9yICYmIFwiY2FuU2hhcmVcIiBpbiBfbmF2aWdhdG9yKTtcblx0Y29uc3Qgc2hhcmUgPSBhc3luYyAob3ZlcnJpZGVPcHRpb25zID0ge30pID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcblx0XHRcdGNvbnN0IGRhdGEgPSB7XG5cdFx0XHRcdC4uLnRvVmFsdWUoc2hhcmVPcHRpb25zKSxcblx0XHRcdFx0Li4udG9WYWx1ZShvdmVycmlkZU9wdGlvbnMpXG5cdFx0XHR9O1xuXHRcdFx0bGV0IGdyYW50ZWQgPSBmYWxzZTtcblx0XHRcdGlmIChfbmF2aWdhdG9yLmNhblNoYXJlKSBncmFudGVkID0gX25hdmlnYXRvci5jYW5TaGFyZShkYXRhKTtcblx0XHRcdGlmIChncmFudGVkKSByZXR1cm4gX25hdmlnYXRvci5zaGFyZShkYXRhKTtcblx0XHR9XG5cdH07XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c2hhcmVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU29ydGVkL2luZGV4LnRzXG5jb25zdCBkZWZhdWx0U29ydEZuID0gKHNvdXJjZSwgY29tcGFyZUZuKSA9PiBzb3VyY2Uuc29ydChjb21wYXJlRm4pO1xuY29uc3QgZGVmYXVsdENvbXBhcmUgPSAoYSwgYikgPT4gYSAtIGI7XG5mdW5jdGlvbiB1c2VTb3J0ZWQoLi4uYXJncykge1xuXHRjb25zdCBbc291cmNlXSA9IGFyZ3M7XG5cdGxldCBjb21wYXJlRm4gPSBkZWZhdWx0Q29tcGFyZTtcblx0bGV0IG9wdGlvbnMgPSB7fTtcblx0aWYgKGFyZ3MubGVuZ3RoID09PSAyKSBpZiAodHlwZW9mIGFyZ3NbMV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHR2YXIgX29wdGlvbnMkY29tcGFyZUZuO1xuXHRcdG9wdGlvbnMgPSBhcmdzWzFdO1xuXHRcdGNvbXBhcmVGbiA9IChfb3B0aW9ucyRjb21wYXJlRm4gPSBvcHRpb25zLmNvbXBhcmVGbikgIT09IG51bGwgJiYgX29wdGlvbnMkY29tcGFyZUZuICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRjb21wYXJlRm4gOiBkZWZhdWx0Q29tcGFyZTtcblx0fSBlbHNlIHtcblx0XHR2YXIgX2FyZ3MkO1xuXHRcdGNvbXBhcmVGbiA9IChfYXJncyQgPSBhcmdzWzFdKSAhPT0gbnVsbCAmJiBfYXJncyQgIT09IHZvaWQgMCA/IF9hcmdzJCA6IGRlZmF1bHRDb21wYXJlO1xuXHR9XG5cdGVsc2UgaWYgKGFyZ3MubGVuZ3RoID4gMikge1xuXHRcdHZhciBfYXJncyQyLCBfYXJncyQzO1xuXHRcdGNvbXBhcmVGbiA9IChfYXJncyQyID0gYXJnc1sxXSkgIT09IG51bGwgJiYgX2FyZ3MkMiAhPT0gdm9pZCAwID8gX2FyZ3MkMiA6IGRlZmF1bHRDb21wYXJlO1xuXHRcdG9wdGlvbnMgPSAoX2FyZ3MkMyA9IGFyZ3NbMl0pICE9PSBudWxsICYmIF9hcmdzJDMgIT09IHZvaWQgMCA/IF9hcmdzJDMgOiB7fTtcblx0fVxuXHRjb25zdCB7IGRpcnR5ID0gZmFsc2UsIHNvcnRGbiA9IGRlZmF1bHRTb3J0Rm4gfSA9IG9wdGlvbnM7XG5cdGlmICghZGlydHkpIHJldHVybiBjb21wdXRlZCgoKSA9PiBzb3J0Rm4oWy4uLnRvVmFsdWUoc291cmNlKV0sIGNvbXBhcmVGbikpO1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gc29ydEZuKHRvVmFsdWUoc291cmNlKSwgY29tcGFyZUZuKTtcblx0XHRpZiAoaXNSZWYoc291cmNlKSkgc291cmNlLnZhbHVlID0gcmVzdWx0O1xuXHRcdGVsc2Ugc291cmNlLnNwbGljZSgwLCBzb3VyY2UubGVuZ3RoLCAuLi5yZXN1bHQpO1xuXHR9KTtcblx0cmV0dXJuIHNvdXJjZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3BlZWNoUmVjb2duaXRpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBTcGVlY2hSZWNvZ25pdGlvbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU3BlZWNoUmVjb2duaXRpb25cbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU3BlZWNoUmVjb2duaXRpb24gU3BlZWNoUmVjb2duaXRpb25cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTcGVlY2hSZWNvZ25pdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbnRlcmltUmVzdWx0cyA9IHRydWUsIGNvbnRpbnVvdXMgPSB0cnVlLCBtYXhBbHRlcm5hdGl2ZXMgPSAxLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgbGFuZyA9IHRvUmVmKG9wdGlvbnMubGFuZyB8fCBcImVuLVVTXCIpO1xuXHRjb25zdCBpc0xpc3RlbmluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBpc0ZpbmFsID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHJlc3VsdCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRsZXQgcmVjb2duaXRpb247XG5cdGNvbnN0IHN0YXJ0ID0gKCkgPT4ge1xuXHRcdGlzTGlzdGVuaW5nLnZhbHVlID0gdHJ1ZTtcblx0fTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRpc0xpc3RlbmluZy52YWx1ZSA9IGZhbHNlO1xuXHR9O1xuXHRjb25zdCB0b2dnbGUgPSAodmFsdWUgPSAhaXNMaXN0ZW5pbmcudmFsdWUpID0+IHtcblx0XHRpZiAodmFsdWUpIHN0YXJ0KCk7XG5cdFx0ZWxzZSBzdG9wKCk7XG5cdH07XG5cdGNvbnN0IFNwZWVjaFJlY29nbml0aW9uID0gd2luZG93JDEgJiYgKHdpbmRvdyQxLlNwZWVjaFJlY29nbml0aW9uIHx8IHdpbmRvdyQxLndlYmtpdFNwZWVjaFJlY29nbml0aW9uKTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IFNwZWVjaFJlY29nbml0aW9uKTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0cmVjb2duaXRpb24gPSBuZXcgU3BlZWNoUmVjb2duaXRpb24oKTtcblx0XHRyZWNvZ25pdGlvbi5jb250aW51b3VzID0gY29udGludW91cztcblx0XHRyZWNvZ25pdGlvbi5pbnRlcmltUmVzdWx0cyA9IGludGVyaW1SZXN1bHRzO1xuXHRcdHJlY29nbml0aW9uLmxhbmcgPSB0b1ZhbHVlKGxhbmcpO1xuXHRcdHJlY29nbml0aW9uLm1heEFsdGVybmF0aXZlcyA9IG1heEFsdGVybmF0aXZlcztcblx0XHRyZWNvZ25pdGlvbi5vbnN0YXJ0ID0gKCkgPT4ge1xuXHRcdFx0aXNMaXN0ZW5pbmcudmFsdWUgPSB0cnVlO1xuXHRcdFx0aXNGaW5hbC52YWx1ZSA9IGZhbHNlO1xuXHRcdH07XG5cdFx0d2F0Y2gobGFuZywgKGxhbmckMSkgPT4ge1xuXHRcdFx0aWYgKHJlY29nbml0aW9uICYmICFpc0xpc3RlbmluZy52YWx1ZSkgcmVjb2duaXRpb24ubGFuZyA9IGxhbmckMTtcblx0XHR9KTtcblx0XHRyZWNvZ25pdGlvbi5vbnJlc3VsdCA9IChldmVudCkgPT4ge1xuXHRcdFx0Y29uc3QgY3VycmVudFJlc3VsdCA9IGV2ZW50LnJlc3VsdHNbZXZlbnQucmVzdWx0SW5kZXhdO1xuXHRcdFx0Y29uc3QgeyB0cmFuc2NyaXB0IH0gPSBjdXJyZW50UmVzdWx0WzBdO1xuXHRcdFx0aXNGaW5hbC52YWx1ZSA9IGN1cnJlbnRSZXN1bHQuaXNGaW5hbDtcblx0XHRcdHJlc3VsdC52YWx1ZSA9IHRyYW5zY3JpcHQ7XG5cdFx0XHRlcnJvci52YWx1ZSA9IHZvaWQgMDtcblx0XHR9O1xuXHRcdHJlY29nbml0aW9uLm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcblx0XHRcdGVycm9yLnZhbHVlID0gZXZlbnQ7XG5cdFx0fTtcblx0XHRyZWNvZ25pdGlvbi5vbmVuZCA9ICgpID0+IHtcblx0XHRcdGlzTGlzdGVuaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRyZWNvZ25pdGlvbi5sYW5nID0gdG9WYWx1ZShsYW5nKTtcblx0XHR9O1xuXHRcdHdhdGNoKGlzTGlzdGVuaW5nLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiB7XG5cdFx0XHRpZiAobmV3VmFsdWUgPT09IG9sZFZhbHVlKSByZXR1cm47XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAobmV3VmFsdWUpIHJlY29nbml0aW9uLnN0YXJ0KCk7XG5cdFx0XHRcdGVsc2UgcmVjb2duaXRpb24uc3RvcCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdGVycm9yLnZhbHVlID0gZXJyO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRzdG9wKCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzTGlzdGVuaW5nLFxuXHRcdGlzRmluYWwsXG5cdFx0cmVjb2duaXRpb24sXG5cdFx0cmVzdWx0LFxuXHRcdGVycm9yLFxuXHRcdHRvZ2dsZSxcblx0XHRzdGFydCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNwZWVjaFN5bnRoZXNpcy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFNwZWVjaFN5bnRoZXNpcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU3BlZWNoU3ludGhlc2lzXG4qIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NwZWVjaFN5bnRoZXNpcyBTcGVlY2hTeW50aGVzaXNcbiovXG5mdW5jdGlvbiB1c2VTcGVlY2hTeW50aGVzaXModGV4dCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgcGl0Y2ggPSAxLCByYXRlID0gMSwgdm9sdW1lID0gMSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIG9uQm91bmRhcnkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHN5bnRoID0gd2luZG93JDEgJiYgd2luZG93JDEuc3BlZWNoU3ludGhlc2lzO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gc3ludGgpO1xuXHRjb25zdCBpc1BsYXlpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgc3RhdHVzID0gc2hhbGxvd1JlZihcImluaXRcIik7XG5cdGNvbnN0IHNwb2tlblRleHQgPSB0b1JlZih0ZXh0IHx8IFwiXCIpO1xuXHRjb25zdCBsYW5nID0gdG9SZWYob3B0aW9ucy5sYW5nIHx8IFwiZW4tVVNcIik7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCB0b2dnbGUgPSAodmFsdWUgPSAhaXNQbGF5aW5nLnZhbHVlKSA9PiB7XG5cdFx0aXNQbGF5aW5nLnZhbHVlID0gdmFsdWU7XG5cdH07XG5cdGNvbnN0IGJpbmRFdmVudHNGb3JVdHRlcmFuY2UgPSAodXR0ZXJhbmNlJDEpID0+IHtcblx0XHR1dHRlcmFuY2UkMS5sYW5nID0gdG9WYWx1ZShsYW5nKTtcblx0XHR1dHRlcmFuY2UkMS52b2ljZSA9IHRvVmFsdWUob3B0aW9ucy52b2ljZSkgfHwgbnVsbDtcblx0XHR1dHRlcmFuY2UkMS5waXRjaCA9IHRvVmFsdWUocGl0Y2gpO1xuXHRcdHV0dGVyYW5jZSQxLnJhdGUgPSB0b1ZhbHVlKHJhdGUpO1xuXHRcdHV0dGVyYW5jZSQxLnZvbHVtZSA9IHRvVmFsdWUodm9sdW1lKTtcblx0XHR1dHRlcmFuY2UkMS5vbnN0YXJ0ID0gKCkgPT4ge1xuXHRcdFx0aXNQbGF5aW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwicGxheVwiO1xuXHRcdH07XG5cdFx0dXR0ZXJhbmNlJDEub25wYXVzZSA9ICgpID0+IHtcblx0XHRcdGlzUGxheWluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJwYXVzZVwiO1xuXHRcdH07XG5cdFx0dXR0ZXJhbmNlJDEub25yZXN1bWUgPSAoKSA9PiB7XG5cdFx0XHRpc1BsYXlpbmcudmFsdWUgPSB0cnVlO1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJwbGF5XCI7XG5cdFx0fTtcblx0XHR1dHRlcmFuY2UkMS5vbmVuZCA9ICgpID0+IHtcblx0XHRcdGlzUGxheWluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJlbmRcIjtcblx0XHR9O1xuXHRcdHV0dGVyYW5jZSQxLm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcblx0XHRcdGVycm9yLnZhbHVlID0gZXZlbnQ7XG5cdFx0fTtcblx0XHR1dHRlcmFuY2UkMS5vbmJvdW5kYXJ5ID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRvbkJvdW5kYXJ5ID09PSBudWxsIHx8IG9uQm91bmRhcnkgPT09IHZvaWQgMCB8fCBvbkJvdW5kYXJ5KGV2ZW50KTtcblx0XHR9O1xuXHR9O1xuXHRjb25zdCB1dHRlcmFuY2UgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0c3RhdHVzLnZhbHVlID0gXCJpbml0XCI7XG5cdFx0Y29uc3QgbmV3VXR0ZXJhbmNlID0gbmV3IFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZShzcG9rZW5UZXh0LnZhbHVlKTtcblx0XHRiaW5kRXZlbnRzRm9yVXR0ZXJhbmNlKG5ld1V0dGVyYW5jZSk7XG5cdFx0cmV0dXJuIG5ld1V0dGVyYW5jZTtcblx0fSk7XG5cdGNvbnN0IHNwZWFrID0gKCkgPT4ge1xuXHRcdHN5bnRoLmNhbmNlbCgpO1xuXHRcdGlmICh1dHRlcmFuY2UpIHN5bnRoLnNwZWFrKHV0dGVyYW5jZS52YWx1ZSk7XG5cdH07XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0c3ludGguY2FuY2VsKCk7XG5cdFx0aXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG5cdH07XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdGJpbmRFdmVudHNGb3JVdHRlcmFuY2UodXR0ZXJhbmNlLnZhbHVlKTtcblx0XHR3YXRjaChsYW5nLCAobGFuZyQxKSA9PiB7XG5cdFx0XHRpZiAodXR0ZXJhbmNlLnZhbHVlICYmICFpc1BsYXlpbmcudmFsdWUpIHV0dGVyYW5jZS52YWx1ZS5sYW5nID0gbGFuZyQxO1xuXHRcdH0pO1xuXHRcdGlmIChvcHRpb25zLnZvaWNlKSB3YXRjaChvcHRpb25zLnZvaWNlLCAoKSA9PiB7XG5cdFx0XHRzeW50aC5jYW5jZWwoKTtcblx0XHR9KTtcblx0XHR3YXRjaChpc1BsYXlpbmcsICgpID0+IHtcblx0XHRcdGlmIChpc1BsYXlpbmcudmFsdWUpIHN5bnRoLnJlc3VtZSgpO1xuXHRcdFx0ZWxzZSBzeW50aC5wYXVzZSgpO1xuXHRcdH0pO1xuXHR9XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNQbGF5aW5nLFxuXHRcdHN0YXR1cyxcblx0XHR1dHRlcmFuY2UsXG5cdFx0ZXJyb3IsXG5cdFx0c3RvcCxcblx0XHR0b2dnbGUsXG5cdFx0c3BlYWtcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3RlcHBlci9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZVN0ZXBwZXIoc3RlcHMsIGluaXRpYWxTdGVwKSB7XG5cdGNvbnN0IHN0ZXBzUmVmID0gcmVmKHN0ZXBzKTtcblx0Y29uc3Qgc3RlcE5hbWVzID0gY29tcHV0ZWQoKCkgPT4gQXJyYXkuaXNBcnJheShzdGVwc1JlZi52YWx1ZSkgPyBzdGVwc1JlZi52YWx1ZSA6IE9iamVjdC5rZXlzKHN0ZXBzUmVmLnZhbHVlKSk7XG5cdGNvbnN0IGluZGV4ID0gcmVmKHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKGluaXRpYWxTdGVwICE9PSBudWxsICYmIGluaXRpYWxTdGVwICE9PSB2b2lkIDAgPyBpbml0aWFsU3RlcCA6IHN0ZXBOYW1lcy52YWx1ZVswXSkpO1xuXHRjb25zdCBjdXJyZW50ID0gY29tcHV0ZWQoKCkgPT4gYXQoaW5kZXgudmFsdWUpKTtcblx0Y29uc3QgaXNGaXJzdCA9IGNvbXB1dGVkKCgpID0+IGluZGV4LnZhbHVlID09PSAwKTtcblx0Y29uc3QgaXNMYXN0ID0gY29tcHV0ZWQoKCkgPT4gaW5kZXgudmFsdWUgPT09IHN0ZXBOYW1lcy52YWx1ZS5sZW5ndGggLSAxKTtcblx0Y29uc3QgbmV4dCA9IGNvbXB1dGVkKCgpID0+IHN0ZXBOYW1lcy52YWx1ZVtpbmRleC52YWx1ZSArIDFdKTtcblx0Y29uc3QgcHJldmlvdXMgPSBjb21wdXRlZCgoKSA9PiBzdGVwTmFtZXMudmFsdWVbaW5kZXgudmFsdWUgLSAxXSk7XG5cdGZ1bmN0aW9uIGF0KGluZGV4JDEpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShzdGVwc1JlZi52YWx1ZSkpIHJldHVybiBzdGVwc1JlZi52YWx1ZVtpbmRleCQxXTtcblx0XHRyZXR1cm4gc3RlcHNSZWYudmFsdWVbc3RlcE5hbWVzLnZhbHVlW2luZGV4JDFdXTtcblx0fVxuXHRmdW5jdGlvbiBnZXQoc3RlcCkge1xuXHRcdGlmICghc3RlcE5hbWVzLnZhbHVlLmluY2x1ZGVzKHN0ZXApKSByZXR1cm47XG5cdFx0cmV0dXJuIGF0KHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApKTtcblx0fVxuXHRmdW5jdGlvbiBnb1RvKHN0ZXApIHtcblx0XHRpZiAoc3RlcE5hbWVzLnZhbHVlLmluY2x1ZGVzKHN0ZXApKSBpbmRleC52YWx1ZSA9IHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApO1xuXHR9XG5cdGZ1bmN0aW9uIGdvVG9OZXh0KCkge1xuXHRcdGlmIChpc0xhc3QudmFsdWUpIHJldHVybjtcblx0XHRpbmRleC52YWx1ZSsrO1xuXHR9XG5cdGZ1bmN0aW9uIGdvVG9QcmV2aW91cygpIHtcblx0XHRpZiAoaXNGaXJzdC52YWx1ZSkgcmV0dXJuO1xuXHRcdGluZGV4LnZhbHVlLS07XG5cdH1cblx0ZnVuY3Rpb24gZ29CYWNrVG8oc3RlcCkge1xuXHRcdGlmIChpc0FmdGVyKHN0ZXApKSBnb1RvKHN0ZXApO1xuXHR9XG5cdGZ1bmN0aW9uIGlzTmV4dChzdGVwKSB7XG5cdFx0cmV0dXJuIHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApID09PSBpbmRleC52YWx1ZSArIDE7XG5cdH1cblx0ZnVuY3Rpb24gaXNQcmV2aW91cyhzdGVwKSB7XG5cdFx0cmV0dXJuIHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApID09PSBpbmRleC52YWx1ZSAtIDE7XG5cdH1cblx0ZnVuY3Rpb24gaXNDdXJyZW50KHN0ZXApIHtcblx0XHRyZXR1cm4gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkgPT09IGluZGV4LnZhbHVlO1xuXHR9XG5cdGZ1bmN0aW9uIGlzQmVmb3JlKHN0ZXApIHtcblx0XHRyZXR1cm4gaW5kZXgudmFsdWUgPCBzdGVwTmFtZXMudmFsdWUuaW5kZXhPZihzdGVwKTtcblx0fVxuXHRmdW5jdGlvbiBpc0FmdGVyKHN0ZXApIHtcblx0XHRyZXR1cm4gaW5kZXgudmFsdWUgPiBzdGVwTmFtZXMudmFsdWUuaW5kZXhPZihzdGVwKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHN0ZXBzOiBzdGVwc1JlZixcblx0XHRzdGVwTmFtZXMsXG5cdFx0aW5kZXgsXG5cdFx0Y3VycmVudCxcblx0XHRuZXh0LFxuXHRcdHByZXZpb3VzLFxuXHRcdGlzRmlyc3QsXG5cdFx0aXNMYXN0LFxuXHRcdGF0LFxuXHRcdGdldCxcblx0XHRnb1RvLFxuXHRcdGdvVG9OZXh0LFxuXHRcdGdvVG9QcmV2aW91cyxcblx0XHRnb0JhY2tUbyxcblx0XHRpc05leHQsXG5cdFx0aXNQcmV2aW91cyxcblx0XHRpc0N1cnJlbnQsXG5cdFx0aXNCZWZvcmUsXG5cdFx0aXNBZnRlclxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTdG9yYWdlQXN5bmMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBTdG9yYWdlIGluIHdpdGggYXN5bmMgc3VwcG9ydC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU3RvcmFnZUFzeW5jXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGluaXRpYWxWYWx1ZVxuKiBAcGFyYW0gc3RvcmFnZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVN0b3JhZ2VBc3luYyhrZXksIGluaXRpYWxWYWx1ZSwgc3RvcmFnZSwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRzZXJpYWxpemVyO1xuXHRjb25zdCB7IGZsdXNoID0gXCJwcmVcIiwgZGVlcCA9IHRydWUsIGxpc3RlblRvU3RvcmFnZUNoYW5nZXMgPSB0cnVlLCB3cml0ZURlZmF1bHRzID0gdHJ1ZSwgbWVyZ2VEZWZhdWx0cyA9IGZhbHNlLCBzaGFsbG93LCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZXZlbnRGaWx0ZXIsIG9uRXJyb3IgPSAoZSkgPT4ge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH0sIG9uUmVhZHkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJhd0luaXQgPSB0b1ZhbHVlKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IHR5cGUgPSBndWVzc1NlcmlhbGl6ZXJUeXBlKHJhd0luaXQpO1xuXHRjb25zdCBkYXRhID0gKHNoYWxsb3cgPyBzaGFsbG93UmVmIDogcmVmKSh0b1ZhbHVlKGluaXRpYWxWYWx1ZSkpO1xuXHRjb25zdCBzZXJpYWxpemVyID0gKF9vcHRpb25zJHNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXIpICE9PSBudWxsICYmIF9vcHRpb25zJHNlcmlhbGl6ZXIgIT09IHZvaWQgMCA/IF9vcHRpb25zJHNlcmlhbGl6ZXIgOiBTdG9yYWdlU2VyaWFsaXplcnNbdHlwZV07XG5cdGlmICghc3RvcmFnZSkgdHJ5IHtcblx0XHRzdG9yYWdlID0gZ2V0U1NSSGFuZGxlcihcImdldERlZmF1bHRTdG9yYWdlQXN5bmNcIiwgKCkgPT4gZGVmYXVsdFdpbmRvdyA9PT0gbnVsbCB8fCBkZWZhdWx0V2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWZhdWx0V2luZG93LmxvY2FsU3RvcmFnZSkoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdG9uRXJyb3IoZSk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gcmVhZChldmVudCkge1xuXHRcdGlmICghc3RvcmFnZSB8fCBldmVudCAmJiBldmVudC5rZXkgIT09IGtleSkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByYXdWYWx1ZSA9IGV2ZW50ID8gZXZlbnQubmV3VmFsdWUgOiBhd2FpdCBzdG9yYWdlLmdldEl0ZW0oa2V5KTtcblx0XHRcdGlmIChyYXdWYWx1ZSA9PSBudWxsKSB7XG5cdFx0XHRcdGRhdGEudmFsdWUgPSByYXdJbml0O1xuXHRcdFx0XHRpZiAod3JpdGVEZWZhdWx0cyAmJiByYXdJbml0ICE9PSBudWxsKSBhd2FpdCBzdG9yYWdlLnNldEl0ZW0oa2V5LCBhd2FpdCBzZXJpYWxpemVyLndyaXRlKHJhd0luaXQpKTtcblx0XHRcdH0gZWxzZSBpZiAobWVyZ2VEZWZhdWx0cykge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGF3YWl0IHNlcmlhbGl6ZXIucmVhZChyYXdWYWx1ZSk7XG5cdFx0XHRcdGlmICh0eXBlb2YgbWVyZ2VEZWZhdWx0cyA9PT0gXCJmdW5jdGlvblwiKSBkYXRhLnZhbHVlID0gbWVyZ2VEZWZhdWx0cyh2YWx1ZSwgcmF3SW5pdCk7XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSBkYXRhLnZhbHVlID0ge1xuXHRcdFx0XHRcdC4uLnJhd0luaXQsXG5cdFx0XHRcdFx0Li4udmFsdWVcblx0XHRcdFx0fTtcblx0XHRcdFx0ZWxzZSBkYXRhLnZhbHVlID0gdmFsdWU7XG5cdFx0XHR9IGVsc2UgZGF0YS52YWx1ZSA9IGF3YWl0IHNlcmlhbGl6ZXIucmVhZChyYXdWYWx1ZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH1cblx0Y29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0cmVhZCgpLnRoZW4oKCkgPT4ge1xuXHRcdFx0b25SZWFkeSA9PT0gbnVsbCB8fCBvblJlYWR5ID09PSB2b2lkIDAgfHwgb25SZWFkeShkYXRhLnZhbHVlKTtcblx0XHRcdHJlc29sdmUoZGF0YSk7XG5cdFx0fSk7XG5cdH0pO1xuXHRpZiAod2luZG93JDEgJiYgbGlzdGVuVG9TdG9yYWdlQ2hhbmdlcykgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJzdG9yYWdlXCIsIChlKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHJlYWQoZSkpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdGlmIChzdG9yYWdlKSB3YXRjaFdpdGhGaWx0ZXIoZGF0YSwgYXN5bmMgKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoZGF0YS52YWx1ZSA9PSBudWxsKSBhd2FpdCBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcblx0XHRcdGVsc2UgYXdhaXQgc3RvcmFnZS5zZXRJdGVtKGtleSwgYXdhaXQgc2VyaWFsaXplci53cml0ZShkYXRhLnZhbHVlKSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH0sIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGV2ZW50RmlsdGVyXG5cdH0pO1xuXHRPYmplY3QuYXNzaWduKGRhdGEsIHtcblx0XHR0aGVuOiBwcm9taXNlLnRoZW4uYmluZChwcm9taXNlKSxcblx0XHRjYXRjaDogcHJvbWlzZS5jYXRjaC5iaW5kKHByb21pc2UpXG5cdH0pO1xuXHRyZXR1cm4gZGF0YTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3R5bGVUYWcvaW5kZXgudHNcbmxldCBfaWQgPSAwO1xuLyoqXG4qIEluamVjdCA8c3R5bGU+IGVsZW1lbnQgaW4gaGVhZC5cbipcbiogT3ZlcmxvYWQ6IE9taXR0ZWQgaWRcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU3R5bGVUYWdcbiogQHBhcmFtIGNzc1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVN0eWxlVGFnKGNzcywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGlzTG9hZGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQsIGltbWVkaWF0ZSA9IHRydWUsIG1hbnVhbCA9IGZhbHNlLCBpZCA9IGB2dWV1c2Vfc3R5bGV0YWdfJHsrK19pZH1gIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjc3NSZWYgPSBzaGFsbG93UmVmKGNzcyk7XG5cdGxldCBzdG9wID0gKCkgPT4ge307XG5cdGNvbnN0IGxvYWQgPSAoKSA9PiB7XG5cdFx0aWYgKCFkb2N1bWVudCQxKSByZXR1cm47XG5cdFx0Y29uc3QgZWwgPSBkb2N1bWVudCQxLmdldEVsZW1lbnRCeUlkKGlkKSB8fCBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblx0XHRpZiAoIWVsLmlzQ29ubmVjdGVkKSB7XG5cdFx0XHRlbC5pZCA9IGlkO1xuXHRcdFx0aWYgKG9wdGlvbnMubm9uY2UpIGVsLm5vbmNlID0gb3B0aW9ucy5ub25jZTtcblx0XHRcdGlmIChvcHRpb25zLm1lZGlhKSBlbC5tZWRpYSA9IG9wdGlvbnMubWVkaWE7XG5cdFx0XHRkb2N1bWVudCQxLmhlYWQuYXBwZW5kQ2hpbGQoZWwpO1xuXHRcdH1cblx0XHRpZiAoaXNMb2FkZWQudmFsdWUpIHJldHVybjtcblx0XHRzdG9wID0gd2F0Y2goY3NzUmVmLCAodmFsdWUpID0+IHtcblx0XHRcdGVsLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdFx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdFx0aXNMb2FkZWQudmFsdWUgPSB0cnVlO1xuXHR9O1xuXHRjb25zdCB1bmxvYWQgPSAoKSA9PiB7XG5cdFx0aWYgKCFkb2N1bWVudCQxIHx8ICFpc0xvYWRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdHN0b3AoKTtcblx0XHRkb2N1bWVudCQxLmhlYWQucmVtb3ZlQ2hpbGQoZG9jdW1lbnQkMS5nZXRFbGVtZW50QnlJZChpZCkpO1xuXHRcdGlzTG9hZGVkLnZhbHVlID0gZmFsc2U7XG5cdH07XG5cdGlmIChpbW1lZGlhdGUgJiYgIW1hbnVhbCkgdHJ5T25Nb3VudGVkKGxvYWQpO1xuXHRpZiAoIW1hbnVhbCkgdHJ5T25TY29wZURpc3Bvc2UodW5sb2FkKTtcblx0cmV0dXJuIHtcblx0XHRpZCxcblx0XHRjc3M6IGNzc1JlZixcblx0XHR1bmxvYWQsXG5cdFx0bG9hZCxcblx0XHRpc0xvYWRlZDogcmVhZG9ubHkoaXNMb2FkZWQpXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN3aXBlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgc3dpcGUgZGV0ZWN0aW9uLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTd2lwZVxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU3dpcGUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0aHJlc2hvbGQgPSA1MCwgb25Td2lwZSwgb25Td2lwZUVuZCwgb25Td2lwZVN0YXJ0LCBwYXNzaXZlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgY29vcmRzU3RhcnQgPSByZWFjdGl2ZSh7XG5cdFx0eDogMCxcblx0XHR5OiAwXG5cdH0pO1xuXHRjb25zdCBjb29yZHNFbmQgPSByZWFjdGl2ZSh7XG5cdFx0eDogMCxcblx0XHR5OiAwXG5cdH0pO1xuXHRjb25zdCBkaWZmWCA9IGNvbXB1dGVkKCgpID0+IGNvb3Jkc1N0YXJ0LnggLSBjb29yZHNFbmQueCk7XG5cdGNvbnN0IGRpZmZZID0gY29tcHV0ZWQoKCkgPT4gY29vcmRzU3RhcnQueSAtIGNvb3Jkc0VuZC55KTtcblx0Y29uc3QgeyBtYXgsIGFicyB9ID0gTWF0aDtcblx0Y29uc3QgaXNUaHJlc2hvbGRFeGNlZWRlZCA9IGNvbXB1dGVkKCgpID0+IG1heChhYnMoZGlmZlgudmFsdWUpLCBhYnMoZGlmZlkudmFsdWUpKSA+PSB0aHJlc2hvbGQpO1xuXHRjb25zdCBpc1N3aXBpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZGlyZWN0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmICghaXNUaHJlc2hvbGRFeGNlZWRlZC52YWx1ZSkgcmV0dXJuIFwibm9uZVwiO1xuXHRcdGlmIChhYnMoZGlmZlgudmFsdWUpID4gYWJzKGRpZmZZLnZhbHVlKSkgcmV0dXJuIGRpZmZYLnZhbHVlID4gMCA/IFwibGVmdFwiIDogXCJyaWdodFwiO1xuXHRcdGVsc2UgcmV0dXJuIGRpZmZZLnZhbHVlID4gMCA/IFwidXBcIiA6IFwiZG93blwiO1xuXHR9KTtcblx0Y29uc3QgZ2V0VG91Y2hFdmVudENvb3JkcyA9IChlKSA9PiBbZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZXTtcblx0Y29uc3QgdXBkYXRlQ29vcmRzU3RhcnQgPSAoeCwgeSkgPT4ge1xuXHRcdGNvb3Jkc1N0YXJ0LnggPSB4O1xuXHRcdGNvb3Jkc1N0YXJ0LnkgPSB5O1xuXHR9O1xuXHRjb25zdCB1cGRhdGVDb29yZHNFbmQgPSAoeCwgeSkgPT4ge1xuXHRcdGNvb3Jkc0VuZC54ID0geDtcblx0XHRjb29yZHNFbmQueSA9IHk7XG5cdH07XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRwYXNzaXZlLFxuXHRcdGNhcHR1cmU6ICFwYXNzaXZlXG5cdH07XG5cdGNvbnN0IG9uVG91Y2hFbmQgPSAoZSkgPT4ge1xuXHRcdGlmIChpc1N3aXBpbmcudmFsdWUpIG9uU3dpcGVFbmQgPT09IG51bGwgfHwgb25Td2lwZUVuZCA9PT0gdm9pZCAwIHx8IG9uU3dpcGVFbmQoZSwgZGlyZWN0aW9uLnZhbHVlKTtcblx0XHRpc1N3aXBpbmcudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0Y29uc3Qgc3RvcHMgPSBbXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidG91Y2hzdGFydFwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKGUudG91Y2hlcy5sZW5ndGggIT09IDEpIHJldHVybjtcblx0XHRcdGNvbnN0IFt4LCB5XSA9IGdldFRvdWNoRXZlbnRDb29yZHMoZSk7XG5cdFx0XHR1cGRhdGVDb29yZHNTdGFydCh4LCB5KTtcblx0XHRcdHVwZGF0ZUNvb3Jkc0VuZCh4LCB5KTtcblx0XHRcdG9uU3dpcGVTdGFydCA9PT0gbnVsbCB8fCBvblN3aXBlU3RhcnQgPT09IHZvaWQgMCB8fCBvblN3aXBlU3RhcnQoZSk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJ0b3VjaG1vdmVcIiwgKGUpID0+IHtcblx0XHRcdGlmIChlLnRvdWNoZXMubGVuZ3RoICE9PSAxKSByZXR1cm47XG5cdFx0XHRjb25zdCBbeCwgeV0gPSBnZXRUb3VjaEV2ZW50Q29vcmRzKGUpO1xuXHRcdFx0dXBkYXRlQ29vcmRzRW5kKHgsIHkpO1xuXHRcdFx0aWYgKGxpc3RlbmVyT3B0aW9ucy5jYXB0dXJlICYmICFsaXN0ZW5lck9wdGlvbnMucGFzc2l2ZSAmJiBNYXRoLmFicyhkaWZmWC52YWx1ZSkgPiBNYXRoLmFicyhkaWZmWS52YWx1ZSkpIGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmICghaXNTd2lwaW5nLnZhbHVlICYmIGlzVGhyZXNob2xkRXhjZWVkZWQudmFsdWUpIGlzU3dpcGluZy52YWx1ZSA9IHRydWU7XG5cdFx0XHRpZiAoaXNTd2lwaW5nLnZhbHVlKSBvblN3aXBlID09PSBudWxsIHx8IG9uU3dpcGUgPT09IHZvaWQgMCB8fCBvblN3aXBlKGUpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyksXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcInRvdWNoZW5kXCIsIFwidG91Y2hjYW5jZWxcIl0sIG9uVG91Y2hFbmQsIGxpc3RlbmVyT3B0aW9ucylcblx0XTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHN0b3BzLmZvckVhY2goKHMpID0+IHMoKSk7XG5cdHJldHVybiB7XG5cdFx0aXNTd2lwaW5nLFxuXHRcdGRpcmVjdGlvbixcblx0XHRjb29yZHNTdGFydCxcblx0XHRjb29yZHNFbmQsXG5cdFx0bGVuZ3RoWDogZGlmZlgsXG5cdFx0bGVuZ3RoWTogZGlmZlksXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUZW1wbGF0ZVJlZnNMaXN0L2luZGV4LnRzXG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlVGVtcGxhdGVSZWZzTGlzdCgpIHtcblx0Y29uc3QgcmVmcyA9IHJlZihbXSk7XG5cdHJlZnMudmFsdWUuc2V0ID0gKGVsKSA9PiB7XG5cdFx0aWYgKGVsKSByZWZzLnZhbHVlLnB1c2goZWwpO1xuXHR9O1xuXHRvbkJlZm9yZVVwZGF0ZSgoKSA9PiB7XG5cdFx0cmVmcy52YWx1ZS5sZW5ndGggPSAwO1xuXHR9KTtcblx0cmV0dXJuIHJlZnM7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRleHREaXJlY3Rpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBkaXIgb2YgdGhlIGVsZW1lbnQncyB0ZXh0LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VUZXh0RGlyZWN0aW9uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVGV4dERpcmVjdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgc2VsZWN0b3IgPSBcImh0bWxcIiwgb2JzZXJ2ZSA9IGZhbHNlLCBpbml0aWFsVmFsdWUgPSBcImx0clwiIH0gPSBvcHRpb25zO1xuXHRmdW5jdGlvbiBnZXRWYWx1ZSQxKCkge1xuXHRcdHZhciBfcmVmLCBfZG9jdW1lbnQkcXVlcnlTZWxlY3Q7XG5cdFx0cmV0dXJuIChfcmVmID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCRxdWVyeVNlbGVjdCA9IGRvY3VtZW50JDEucXVlcnlTZWxlY3RvcihzZWxlY3RvcikpID09PSBudWxsIHx8IF9kb2N1bWVudCRxdWVyeVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50JHF1ZXJ5U2VsZWN0LmdldEF0dHJpYnV0ZShcImRpclwiKSkgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IGluaXRpYWxWYWx1ZTtcblx0fVxuXHRjb25zdCBkaXIgPSByZWYoZ2V0VmFsdWUkMSgpKTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IGRpci52YWx1ZSA9IGdldFZhbHVlJDEoKSk7XG5cdGlmIChvYnNlcnZlICYmIGRvY3VtZW50JDEpIHVzZU11dGF0aW9uT2JzZXJ2ZXIoZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSwgKCkgPT4gZGlyLnZhbHVlID0gZ2V0VmFsdWUkMSgpLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG5cdHJldHVybiBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGRpci52YWx1ZTtcblx0XHR9LFxuXHRcdHNldCh2KSB7XG5cdFx0XHR2YXIgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0MiwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0Mztcblx0XHRcdGRpci52YWx1ZSA9IHY7XG5cdFx0XHRpZiAoIWRvY3VtZW50JDEpIHJldHVybjtcblx0XHRcdGlmIChkaXIudmFsdWUpIChfZG9jdW1lbnQkcXVlcnlTZWxlY3QyID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkgPT09IG51bGwgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0MiA9PT0gdm9pZCAwIHx8IF9kb2N1bWVudCRxdWVyeVNlbGVjdDIuc2V0QXR0cmlidXRlKFwiZGlyXCIsIGRpci52YWx1ZSk7XG5cdFx0XHRlbHNlIChfZG9jdW1lbnQkcXVlcnlTZWxlY3QzID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkgPT09IG51bGwgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0MyA9PT0gdm9pZCAwIHx8IF9kb2N1bWVudCRxdWVyeVNlbGVjdDMucmVtb3ZlQXR0cmlidXRlKFwiZGlyXCIpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRleHRTZWxlY3Rpb24vaW5kZXgudHNcbmZ1bmN0aW9uIGdldFJhbmdlc0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uKSB7XG5cdHZhciBfc2VsZWN0aW9uJHJhbmdlQ291bnQ7XG5cdGNvbnN0IHJhbmdlQ291bnQgPSAoX3NlbGVjdGlvbiRyYW5nZUNvdW50ID0gc2VsZWN0aW9uLnJhbmdlQ291bnQpICE9PSBudWxsICYmIF9zZWxlY3Rpb24kcmFuZ2VDb3VudCAhPT0gdm9pZCAwID8gX3NlbGVjdGlvbiRyYW5nZUNvdW50IDogMDtcblx0cmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHJhbmdlQ291bnQgfSwgKF8sIGkpID0+IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpKTtcbn1cbi8qKlxuKiBSZWFjdGl2ZWx5IHRyYWNrIHVzZXIgdGV4dCBzZWxlY3Rpb24gYmFzZWQgb24gW2BXaW5kb3cuZ2V0U2VsZWN0aW9uYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9nZXRTZWxlY3Rpb24pLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VUZXh0U2VsZWN0aW9uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVGV4dFNlbGVjdGlvbihvcHRpb25zID0ge30pIHtcblx0dmFyIF93aW5kb3ckZ2V0U2VsZWN0aW9uO1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBzZWxlY3Rpb24gPSBzaGFsbG93UmVmKChfd2luZG93JGdldFNlbGVjdGlvbiA9IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5nZXRTZWxlY3Rpb24oKSkgIT09IG51bGwgJiYgX3dpbmRvdyRnZXRTZWxlY3Rpb24gIT09IHZvaWQgMCA/IF93aW5kb3ckZ2V0U2VsZWN0aW9uIDogbnVsbCk7XG5cdGNvbnN0IHRleHQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF9zZWxlY3Rpb24kdmFsdWUkdG9TdCwgX3NlbGVjdGlvbiR2YWx1ZTtcblx0XHRyZXR1cm4gKF9zZWxlY3Rpb24kdmFsdWUkdG9TdCA9IChfc2VsZWN0aW9uJHZhbHVlID0gc2VsZWN0aW9uLnZhbHVlKSA9PT0gbnVsbCB8fCBfc2VsZWN0aW9uJHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2VsZWN0aW9uJHZhbHVlLnRvU3RyaW5nKCkpICE9PSBudWxsICYmIF9zZWxlY3Rpb24kdmFsdWUkdG9TdCAhPT0gdm9pZCAwID8gX3NlbGVjdGlvbiR2YWx1ZSR0b1N0IDogXCJcIjtcblx0fSk7XG5cdGNvbnN0IHJhbmdlcyA9IGNvbXB1dGVkKCgpID0+IHNlbGVjdGlvbi52YWx1ZSA/IGdldFJhbmdlc0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uLnZhbHVlKSA6IFtdKTtcblx0Y29uc3QgcmVjdHMgPSBjb21wdXRlZCgoKSA9PiByYW5nZXMudmFsdWUubWFwKChyYW5nZSkgPT4gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKTtcblx0ZnVuY3Rpb24gb25TZWxlY3Rpb25DaGFuZ2UoKSB7XG5cdFx0c2VsZWN0aW9uLnZhbHVlID0gbnVsbDtcblx0XHRpZiAod2luZG93JDEpIHNlbGVjdGlvbi52YWx1ZSA9IHdpbmRvdyQxLmdldFNlbGVjdGlvbigpO1xuXHR9XG5cdGlmICh3aW5kb3ckMSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMS5kb2N1bWVudCwgXCJzZWxlY3Rpb25jaGFuZ2VcIiwgb25TZWxlY3Rpb25DaGFuZ2UsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHtcblx0XHR0ZXh0LFxuXHRcdHJlY3RzLFxuXHRcdHJhbmdlcyxcblx0XHRzZWxlY3Rpb25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGV4dGFyZWFBdXRvc2l6ZS9pbmRleC50c1xuLyoqXG4qIENhbGwgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgpLCBpZiBub3QgYXZhaWxhYmxlLCBqdXN0IGNhbGwgdGhlIGZ1bmN0aW9uXG4qXG4qIEBwYXJhbSB3aW5kb3dcbiogQHBhcmFtIGZuXG4qL1xuZnVuY3Rpb24gdHJ5UmVxdWVzdEFuaW1hdGlvbkZyYW1lKHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZm4pIHtcblx0aWYgKHdpbmRvdyQxICYmIHR5cGVvZiB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09IFwiZnVuY3Rpb25cIikgd2luZG93JDEucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcblx0ZWxzZSBmbigpO1xufVxuZnVuY3Rpb24gdXNlVGV4dGFyZWFBdXRvc2l6ZShvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGlucHV0LCBfb3B0aW9ucyRzdHlsZVByb3A7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHRleHRhcmVhID0gdG9SZWYob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmVsZW1lbnQpO1xuXHRjb25zdCBpbnB1dCA9IHRvUmVmKChfb3B0aW9ucyRpbnB1dCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbnB1dCkgIT09IG51bGwgJiYgX29wdGlvbnMkaW5wdXQgIT09IHZvaWQgMCA/IF9vcHRpb25zJGlucHV0IDogXCJcIik7XG5cdGNvbnN0IHN0eWxlUHJvcCA9IChfb3B0aW9ucyRzdHlsZVByb3AgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc3R5bGVQcm9wKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRzdHlsZVByb3AgIT09IHZvaWQgMCA/IF9vcHRpb25zJHN0eWxlUHJvcCA6IFwiaGVpZ2h0XCI7XG5cdGNvbnN0IHRleHRhcmVhU2Nyb2xsSGVpZ2h0ID0gc2hhbGxvd1JlZigxKTtcblx0Y29uc3QgdGV4dGFyZWFPbGRXaWR0aCA9IHNoYWxsb3dSZWYoMCk7XG5cdGZ1bmN0aW9uIHRyaWdnZXJSZXNpemUoKSB7XG5cdFx0dmFyIF90ZXh0YXJlYSR2YWx1ZTtcblx0XHRpZiAoIXRleHRhcmVhLnZhbHVlKSByZXR1cm47XG5cdFx0bGV0IGhlaWdodCA9IFwiXCI7XG5cdFx0dGV4dGFyZWEudmFsdWUuc3R5bGVbc3R5bGVQcm9wXSA9IFwiMXB4XCI7XG5cdFx0dGV4dGFyZWFTY3JvbGxIZWlnaHQudmFsdWUgPSAoX3RleHRhcmVhJHZhbHVlID0gdGV4dGFyZWEudmFsdWUpID09PSBudWxsIHx8IF90ZXh0YXJlYSR2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RleHRhcmVhJHZhbHVlLnNjcm9sbEhlaWdodDtcblx0XHRjb25zdCBfc3R5bGVUYXJnZXQgPSB0b1ZhbHVlKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zdHlsZVRhcmdldCk7XG5cdFx0aWYgKF9zdHlsZVRhcmdldCkgX3N0eWxlVGFyZ2V0LnN0eWxlW3N0eWxlUHJvcF0gPSBgJHt0ZXh0YXJlYVNjcm9sbEhlaWdodC52YWx1ZX1weGA7XG5cdFx0ZWxzZSBoZWlnaHQgPSBgJHt0ZXh0YXJlYVNjcm9sbEhlaWdodC52YWx1ZX1weGA7XG5cdFx0dGV4dGFyZWEudmFsdWUuc3R5bGVbc3R5bGVQcm9wXSA9IGhlaWdodDtcblx0fVxuXHR3YXRjaChbaW5wdXQsIHRleHRhcmVhXSwgKCkgPT4gbmV4dFRpY2sodHJpZ2dlclJlc2l6ZSksIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHR3YXRjaCh0ZXh0YXJlYVNjcm9sbEhlaWdodCwgKCkgPT4ge1xuXHRcdHZhciBfb3B0aW9ucyRvblJlc2l6ZTtcblx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG9uUmVzaXplID0gb3B0aW9ucy5vblJlc2l6ZSkgPT09IG51bGwgfHwgX29wdGlvbnMkb25SZXNpemUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG9uUmVzaXplLmNhbGwob3B0aW9ucyk7XG5cdH0pO1xuXHR1c2VSZXNpemVPYnNlcnZlcih0ZXh0YXJlYSwgKFt7IGNvbnRlbnRSZWN0IH1dKSA9PiB7XG5cdFx0aWYgKHRleHRhcmVhT2xkV2lkdGgudmFsdWUgPT09IGNvbnRlbnRSZWN0LndpZHRoKSByZXR1cm47XG5cdFx0dHJ5UmVxdWVzdEFuaW1hdGlvbkZyYW1lKHdpbmRvdyQxLCAoKSA9PiB7XG5cdFx0XHR0ZXh0YXJlYU9sZFdpZHRoLnZhbHVlID0gY29udGVudFJlY3Qud2lkdGg7XG5cdFx0XHR0cmlnZ2VyUmVzaXplKCk7XG5cdFx0fSk7XG5cdH0pO1xuXHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndhdGNoKSB3YXRjaChvcHRpb25zLndhdGNoLCB0cmlnZ2VyUmVzaXplLCB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdGRlZXA6IHRydWVcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0dGV4dGFyZWEsXG5cdFx0aW5wdXQsXG5cdFx0dHJpZ2dlclJlc2l6ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUaHJvdHRsZWRSZWZIaXN0b3J5L2luZGV4LnRzXG4vKipcbiogU2hvcnRoYW5kIGZvciBbdXNlUmVmSGlzdG9yeV0oaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVJlZkhpc3RvcnkpIHdpdGggdGhyb3R0bGVkIGZpbHRlci5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVGhyb3R0bGVkUmVmSGlzdG9yeVxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVGhyb3R0bGVkUmVmSGlzdG9yeShzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocm90dGxlID0gMjAwLCB0cmFpbGluZyA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGZpbHRlciA9IHRocm90dGxlRmlsdGVyKHRocm90dGxlLCB0cmFpbGluZyk7XG5cdHJldHVybiB7IC4uLnVzZVJlZkhpc3Rvcnkoc291cmNlLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogZmlsdGVyXG5cdH0pIH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRpbWVBZ28vaW5kZXgudHNcbmNvbnN0IERFRkFVTFRfVU5JVFMgPSBbXG5cdHtcblx0XHRtYXg6IDZlNCxcblx0XHR2YWx1ZTogMWUzLFxuXHRcdG5hbWU6IFwic2Vjb25kXCJcblx0fSxcblx0e1xuXHRcdG1heDogMjc2ZTQsXG5cdFx0dmFsdWU6IDZlNCxcblx0XHRuYW1lOiBcIm1pbnV0ZVwiXG5cdH0sXG5cdHtcblx0XHRtYXg6IDcyZTYsXG5cdFx0dmFsdWU6IDM2ZTUsXG5cdFx0bmFtZTogXCJob3VyXCJcblx0fSxcblx0e1xuXHRcdG1heDogNTE4NGU1LFxuXHRcdHZhbHVlOiA4NjRlNSxcblx0XHRuYW1lOiBcImRheVwiXG5cdH0sXG5cdHtcblx0XHRtYXg6IDI0MTkyZTUsXG5cdFx0dmFsdWU6IDYwNDhlNSxcblx0XHRuYW1lOiBcIndlZWtcIlxuXHR9LFxuXHR7XG5cdFx0bWF4OiAyODUxMmU2LFxuXHRcdHZhbHVlOiAyNTkyZTYsXG5cdFx0bmFtZTogXCJtb250aFwiXG5cdH0sXG5cdHtcblx0XHRtYXg6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcblx0XHR2YWx1ZTogMzE1MzZlNixcblx0XHRuYW1lOiBcInllYXJcIlxuXHR9XG5dO1xuY29uc3QgREVGQVVMVF9NRVNTQUdFUyA9IHtcblx0anVzdE5vdzogXCJqdXN0IG5vd1wiLFxuXHRwYXN0OiAobikgPT4gbi5tYXRjaCgvXFxkLykgPyBgJHtufSBhZ29gIDogbixcblx0ZnV0dXJlOiAobikgPT4gbi5tYXRjaCgvXFxkLykgPyBgaW4gJHtufWAgOiBuLFxuXHRtb250aDogKG4sIHBhc3QpID0+IG4gPT09IDEgPyBwYXN0ID8gXCJsYXN0IG1vbnRoXCIgOiBcIm5leHQgbW9udGhcIiA6IGAke259IG1vbnRoJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHR5ZWFyOiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcImxhc3QgeWVhclwiIDogXCJuZXh0IHllYXJcIiA6IGAke259IHllYXIke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdGRheTogKG4sIHBhc3QpID0+IG4gPT09IDEgPyBwYXN0ID8gXCJ5ZXN0ZXJkYXlcIiA6IFwidG9tb3Jyb3dcIiA6IGAke259IGRheSR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcblx0d2VlazogKG4sIHBhc3QpID0+IG4gPT09IDEgPyBwYXN0ID8gXCJsYXN0IHdlZWtcIiA6IFwibmV4dCB3ZWVrXCIgOiBgJHtufSB3ZWVrJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHRob3VyOiAobikgPT4gYCR7bn0gaG91ciR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcblx0bWludXRlOiAobikgPT4gYCR7bn0gbWludXRlJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHRzZWNvbmQ6IChuKSA9PiBgJHtufSBzZWNvbmQke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdGludmFsaWQ6IFwiXCJcbn07XG5mdW5jdGlvbiBERUZBVUxUX0ZPUk1BVFRFUihkYXRlKSB7XG5cdHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xufVxuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ0KG9wdGlvbnMpIHtcblx0aWYgKFwidXBkYXRlSW50ZXJ2YWxcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyB1cGRhdGVJbnRlcnZhbCA9IDNlNCB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCB1cGRhdGVJbnRlcnZhbCk7XG5cdH1cblx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgM2U0KTtcbn1cbi8qKlxuKiBSZWFjdGl2ZSB0aW1lIGFnbyBmb3JtYXR0ZXIuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRpbWVBZ29cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUaW1lQWdvKHRpbWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNvbnRyb2xzOiBleHBvc2VDb250cm9scyA9IGZhbHNlLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDQob3B0aW9ucykgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHsgbm93LC4uLmNvbnRyb2xzIH0gPSB1c2VOb3coe1xuXHRcdHNjaGVkdWxlcixcblx0XHRjb250cm9sczogdHJ1ZVxuXHR9KTtcblx0Y29uc3QgdGltZUFnbyA9IGNvbXB1dGVkKCgpID0+IGZvcm1hdFRpbWVBZ28obmV3IERhdGUodG9WYWx1ZSh0aW1lKSksIG9wdGlvbnMsIHRvVmFsdWUobm93KSkpO1xuXHRpZiAoZXhwb3NlQ29udHJvbHMpIHJldHVybiB7XG5cdFx0dGltZUFnbyxcblx0XHQuLi5jb250cm9sc1xuXHR9O1xuXHRlbHNlIHJldHVybiB0aW1lQWdvO1xufVxuZnVuY3Rpb24gZm9ybWF0VGltZUFnbyhmcm9tLCBvcHRpb25zID0ge30sIG5vdyA9IERhdGUubm93KCkpIHtcblx0Y29uc3QgeyBtYXgsIG1lc3NhZ2VzID0gREVGQVVMVF9NRVNTQUdFUywgZnVsbERhdGVGb3JtYXR0ZXIgPSBERUZBVUxUX0ZPUk1BVFRFUiwgdW5pdHMgPSBERUZBVUxUX1VOSVRTLCBzaG93U2Vjb25kID0gZmFsc2UsIHJvdW5kaW5nID0gXCJyb3VuZFwiIH0gPSBvcHRpb25zO1xuXHRjb25zdCByb3VuZEZuID0gdHlwZW9mIHJvdW5kaW5nID09PSBcIm51bWJlclwiID8gKG4pID0+ICtuLnRvRml4ZWQocm91bmRpbmcpIDogTWF0aFtyb3VuZGluZ107XG5cdGNvbnN0IGRpZmYgPSArbm93IC0gK2Zyb207XG5cdGNvbnN0IGFic0RpZmYgPSBNYXRoLmFicyhkaWZmKTtcblx0ZnVuY3Rpb24gZ2V0VmFsdWUkMShkaWZmJDEsIHVuaXQpIHtcblx0XHRyZXR1cm4gcm91bmRGbihNYXRoLmFicyhkaWZmJDEpIC8gdW5pdC52YWx1ZSk7XG5cdH1cblx0ZnVuY3Rpb24gZm9ybWF0KGRpZmYkMSwgdW5pdCkge1xuXHRcdGNvbnN0IHZhbCA9IGdldFZhbHVlJDEoZGlmZiQxLCB1bml0KTtcblx0XHRjb25zdCBwYXN0ID0gZGlmZiQxID4gMDtcblx0XHRjb25zdCBzdHIgPSBhcHBseUZvcm1hdCh1bml0Lm5hbWUsIHZhbCwgcGFzdCk7XG5cdFx0cmV0dXJuIGFwcGx5Rm9ybWF0KHBhc3QgPyBcInBhc3RcIiA6IFwiZnV0dXJlXCIsIHN0ciwgcGFzdCk7XG5cdH1cblx0ZnVuY3Rpb24gYXBwbHlGb3JtYXQobmFtZSwgdmFsLCBpc1Bhc3QpIHtcblx0XHRjb25zdCBmb3JtYXR0ZXIgPSBtZXNzYWdlc1tuYW1lXTtcblx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZm9ybWF0dGVyKHZhbCwgaXNQYXN0KTtcblx0XHRyZXR1cm4gZm9ybWF0dGVyLnJlcGxhY2UoXCJ7MH1cIiwgdmFsLnRvU3RyaW5nKCkpO1xuXHR9XG5cdGlmIChhYnNEaWZmIDwgNmU0ICYmICFzaG93U2Vjb25kKSByZXR1cm4gbWVzc2FnZXMuanVzdE5vdztcblx0aWYgKHR5cGVvZiBtYXggPT09IFwibnVtYmVyXCIgJiYgYWJzRGlmZiA+IG1heCkgcmV0dXJuIGZ1bGxEYXRlRm9ybWF0dGVyKG5ldyBEYXRlKGZyb20pKTtcblx0aWYgKHR5cGVvZiBtYXggPT09IFwic3RyaW5nXCIpIHtcblx0XHR2YXIgX3VuaXRzJGZpbmQ7XG5cdFx0Y29uc3QgdW5pdE1heCA9IChfdW5pdHMkZmluZCA9IHVuaXRzLmZpbmQoKGkpID0+IGkubmFtZSA9PT0gbWF4KSkgPT09IG51bGwgfHwgX3VuaXRzJGZpbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF91bml0cyRmaW5kLm1heDtcblx0XHRpZiAodW5pdE1heCAmJiBhYnNEaWZmID4gdW5pdE1heCkgcmV0dXJuIGZ1bGxEYXRlRm9ybWF0dGVyKG5ldyBEYXRlKGZyb20pKTtcblx0fVxuXHRmb3IgKGNvbnN0IFtpZHgsIHVuaXRdIG9mIHVuaXRzLmVudHJpZXMoKSkge1xuXHRcdGlmIChnZXRWYWx1ZSQxKGRpZmYsIHVuaXQpIDw9IDAgJiYgdW5pdHNbaWR4IC0gMV0pIHJldHVybiBmb3JtYXQoZGlmZiwgdW5pdHNbaWR4IC0gMV0pO1xuXHRcdGlmIChhYnNEaWZmIDwgdW5pdC5tYXgpIHJldHVybiBmb3JtYXQoZGlmZiwgdW5pdCk7XG5cdH1cblx0cmV0dXJuIG1lc3NhZ2VzLmludmFsaWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRpbWVBZ29JbnRsL2luZGV4LnRzXG5jb25zdCBVTklUUyA9IFtcblx0e1xuXHRcdG5hbWU6IFwieWVhclwiLFxuXHRcdG1zOiAzMTUzNmU2XG5cdH0sXG5cdHtcblx0XHRuYW1lOiBcIm1vbnRoXCIsXG5cdFx0bXM6IDI1OTJlNlxuXHR9LFxuXHR7XG5cdFx0bmFtZTogXCJ3ZWVrXCIsXG5cdFx0bXM6IDYwNDhlNVxuXHR9LFxuXHR7XG5cdFx0bmFtZTogXCJkYXlcIixcblx0XHRtczogODY0ZTVcblx0fSxcblx0e1xuXHRcdG5hbWU6IFwiaG91clwiLFxuXHRcdG1zOiAzNmU1XG5cdH0sXG5cdHtcblx0XHRuYW1lOiBcIm1pbnV0ZVwiLFxuXHRcdG1zOiA2ZTRcblx0fSxcblx0e1xuXHRcdG5hbWU6IFwic2Vjb25kXCIsXG5cdFx0bXM6IDFlM1xuXHR9XG5dO1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQzKG9wdGlvbnMpIHtcblx0aWYgKFwidXBkYXRlSW50ZXJ2YWxcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyB1cGRhdGVJbnRlcnZhbCA9IDNlNCB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCB1cGRhdGVJbnRlcnZhbCk7XG5cdH1cblx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgM2U0KTtcbn1cbmZ1bmN0aW9uIHVzZVRpbWVBZ29JbnRsKHRpbWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNvbnRyb2xzOiBleHBvc2VDb250cm9scyA9IGZhbHNlLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDMob3B0aW9ucykgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHsgbm93LC4uLmNvbnRyb2xzIH0gPSB1c2VOb3coe1xuXHRcdHNjaGVkdWxlcixcblx0XHRjb250cm9sczogdHJ1ZVxuXHR9KTtcblx0Y29uc3QgcmVzdWx0ID0gY29tcHV0ZWQoKCkgPT4gZ2V0VGltZUFnb0ludGxSZXN1bHQobmV3IERhdGUodG9WYWx1ZSh0aW1lKSksIG9wdGlvbnMsIHRvVmFsdWUobm93KSkpO1xuXHRjb25zdCBwYXJ0cyA9IGNvbXB1dGVkKCgpID0+IHJlc3VsdC52YWx1ZS5wYXJ0cyk7XG5cdGNvbnN0IHRpbWVBZ29JbnRsID0gY29tcHV0ZWQoKCkgPT4gZm9ybWF0VGltZUFnb0ludGxQYXJ0cyhwYXJ0cy52YWx1ZSwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0bG9jYWxlOiByZXN1bHQudmFsdWUucmVzb2x2ZWRMb2NhbGVcblx0fSkpO1xuXHRyZXR1cm4gZXhwb3NlQ29udHJvbHMgPyB7XG5cdFx0dGltZUFnb0ludGwsXG5cdFx0cGFydHMsXG5cdFx0Li4uY29udHJvbHNcblx0fSA6IHRpbWVBZ29JbnRsO1xufVxuLyoqXG4qIE5vbi1yZWFjdGl2ZSB2ZXJzaW9uIG9mIHVzZVRpbWVBZ29JbnRsXG4qL1xuZnVuY3Rpb24gZm9ybWF0VGltZUFnb0ludGwoZnJvbSwgb3B0aW9ucyA9IHt9LCBub3cgPSBEYXRlLm5vdygpKSB7XG5cdGNvbnN0IHsgcGFydHMsIHJlc29sdmVkTG9jYWxlIH0gPSBnZXRUaW1lQWdvSW50bFJlc3VsdChmcm9tLCBvcHRpb25zLCBub3cpO1xuXHRyZXR1cm4gZm9ybWF0VGltZUFnb0ludGxQYXJ0cyhwYXJ0cywge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0bG9jYWxlOiByZXNvbHZlZExvY2FsZVxuXHR9KTtcbn1cbi8qKlxuKiBHZXQgcGFydHMgZnJvbSBgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuZm9ybWF0VG9QYXJ0c2AuXG4qL1xuZnVuY3Rpb24gZ2V0VGltZUFnb0ludGxSZXN1bHQoZnJvbSwgb3B0aW9ucyA9IHt9LCBub3cgPSBEYXRlLm5vdygpKSB7XG5cdHZhciBfb3B0aW9ucyR1bml0cztcblx0Y29uc3QgeyBsb2NhbGUsIHJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMgPSB7IG51bWVyaWM6IFwiYXV0b1wiIH0gfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJ0ZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NhbGUsIHJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMpO1xuXHRjb25zdCB7IGxvY2FsZTogcmVzb2x2ZWRMb2NhbGUgfSA9IHJ0Zi5yZXNvbHZlZE9wdGlvbnMoKTtcblx0Y29uc3QgZGlmZiA9ICtmcm9tIC0gK25vdztcblx0Y29uc3QgYWJzRGlmZiA9IE1hdGguYWJzKGRpZmYpO1xuXHRjb25zdCB1bml0cyA9IChfb3B0aW9ucyR1bml0cyA9IG9wdGlvbnMudW5pdHMpICE9PSBudWxsICYmIF9vcHRpb25zJHVuaXRzICE9PSB2b2lkIDAgPyBfb3B0aW9ucyR1bml0cyA6IFVOSVRTO1xuXHRmb3IgKGNvbnN0IHsgbmFtZSwgbXMgfSBvZiB1bml0cykgaWYgKGFic0RpZmYgPj0gbXMpIHJldHVybiB7XG5cdFx0cmVzb2x2ZWRMb2NhbGUsXG5cdFx0cGFydHM6IHJ0Zi5mb3JtYXRUb1BhcnRzKE1hdGgucm91bmQoZGlmZiAvIG1zKSwgbmFtZSlcblx0fTtcblx0cmV0dXJuIHtcblx0XHRyZXNvbHZlZExvY2FsZSxcblx0XHRwYXJ0czogcnRmLmZvcm1hdFRvUGFydHMoMCwgdW5pdHNbdW5pdHMubGVuZ3RoIC0gMV0ubmFtZSlcblx0fTtcbn1cbi8qKlxuKiBGb3JtYXQgcGFydHMgaW50byBhIHN0cmluZ1xuKi9cbmZ1bmN0aW9uIGZvcm1hdFRpbWVBZ29JbnRsUGFydHMocGFydHMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluc2VydFNwYWNlID0gdHJ1ZSwgam9pblBhcnRzLCBsb2NhbGUgfSA9IG9wdGlvbnM7XG5cdGlmICh0eXBlb2Ygam9pblBhcnRzID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBqb2luUGFydHMocGFydHMsIGxvY2FsZSk7XG5cdGlmICghaW5zZXJ0U3BhY2UpIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQudmFsdWUpLmpvaW4oXCJcIik7XG5cdHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQudmFsdWUudHJpbSgpKS5qb2luKFwiIFwiKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZW91dFBvbGwvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVRpbWVvdXRQb2xsKGZuLCBpbnRlcnZhbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW1tZWRpYXRlID0gdHJ1ZSwgaW1tZWRpYXRlQ2FsbGJhY2sgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBzdGFydCB9ID0gdXNlVGltZW91dEZuKGxvb3AsIGludGVydmFsLCB7IGltbWVkaWF0ZSB9KTtcblx0Y29uc3QgaXNBY3RpdmUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0YXN5bmMgZnVuY3Rpb24gbG9vcCgpIHtcblx0XHRpZiAoIWlzQWN0aXZlLnZhbHVlKSByZXR1cm47XG5cdFx0YXdhaXQgZm4oKTtcblx0XHRzdGFydCgpO1xuXHR9XG5cdGZ1bmN0aW9uIHJlc3VtZSgpIHtcblx0XHRpZiAoIWlzQWN0aXZlLnZhbHVlKSB7XG5cdFx0XHRpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG5cdFx0XHRpZiAoaW1tZWRpYXRlQ2FsbGJhY2spIGZuKCk7XG5cdFx0XHRzdGFydCgpO1xuXHRcdH1cblx0fVxuXHRmdW5jdGlvbiBwYXVzZSgpIHtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGlmIChpbW1lZGlhdGUgJiYgaXNDbGllbnQpIHJlc3VtZSgpO1xuXHR0cnlPblNjb3BlRGlzcG9zZShwYXVzZSk7XG5cdHJldHVybiB7XG5cdFx0aXNBY3RpdmUsXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRpbWVzdGFtcC9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQyKG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiBpbnRlcnZhbCA9PT0gXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiA/IChjYikgPT4gdXNlUmFmRm4oY2IsIHsgaW1tZWRpYXRlIH0pIDogKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCBpbnRlcnZhbCwgeyBpbW1lZGlhdGUgfSk7XG5cdH1cblx0cmV0dXJuIHVzZVJhZkZuO1xufVxuZnVuY3Rpb24gdXNlVGltZXN0YW1wKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNvbnRyb2xzOiBleHBvc2VDb250cm9scyA9IGZhbHNlLCBvZmZzZXQgPSAwLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDIob3B0aW9ucyksIGNhbGxiYWNrIH0gPSBvcHRpb25zO1xuXHRjb25zdCB0cyA9IHNoYWxsb3dSZWYodGltZXN0YW1wKCkgKyBvZmZzZXQpO1xuXHRjb25zdCB1cGRhdGUgPSAoKSA9PiB0cy52YWx1ZSA9IHRpbWVzdGFtcCgpICsgb2Zmc2V0O1xuXHRjb25zdCBjb250cm9scyA9IHNjaGVkdWxlcihjYWxsYmFjayA/ICgpID0+IHtcblx0XHR1cGRhdGUoKTtcblx0XHRjYWxsYmFjayh0cy52YWx1ZSk7XG5cdH0gOiB1cGRhdGUpO1xuXHRpZiAoZXhwb3NlQ29udHJvbHMpIHJldHVybiB7XG5cdFx0dGltZXN0YW1wOiB0cyxcblx0XHQuLi5jb250cm9sc1xuXHR9O1xuXHRlbHNlIHJldHVybiB0cztcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGl0bGUvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVRpdGxlKG5ld1RpdGxlID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfZG9jdW1lbnQkdGl0bGUsIF9yZWY7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQsIHJlc3RvcmVPblVubW91bnQgPSAodCkgPT4gdCB9ID0gb3B0aW9ucztcblx0Y29uc3Qgb3JpZ2luYWxUaXRsZSA9IChfZG9jdW1lbnQkdGl0bGUgPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEudGl0bGUpICE9PSBudWxsICYmIF9kb2N1bWVudCR0aXRsZSAhPT0gdm9pZCAwID8gX2RvY3VtZW50JHRpdGxlIDogXCJcIjtcblx0Y29uc3QgdGl0bGUgPSB0b1JlZigoX3JlZiA9IG5ld1RpdGxlICE9PSBudWxsICYmIG5ld1RpdGxlICE9PSB2b2lkIDAgPyBuZXdUaXRsZSA6IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS50aXRsZSkgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IG51bGwpO1xuXHRjb25zdCBpc1JlYWRvbmx5JDEgPSAhIShuZXdUaXRsZSAmJiB0eXBlb2YgbmV3VGl0bGUgPT09IFwiZnVuY3Rpb25cIik7XG5cdGZ1bmN0aW9uIGZvcm1hdCh0KSB7XG5cdFx0aWYgKCEoXCJ0aXRsZVRlbXBsYXRlXCIgaW4gb3B0aW9ucykpIHJldHVybiB0O1xuXHRcdGNvbnN0IHRlbXBsYXRlID0gb3B0aW9ucy50aXRsZVRlbXBsYXRlIHx8IFwiJXNcIjtcblx0XHRyZXR1cm4gdHlwZW9mIHRlbXBsYXRlID09PSBcImZ1bmN0aW9uXCIgPyB0ZW1wbGF0ZSh0KSA6IHRvVmFsdWUodGVtcGxhdGUpLnJlcGxhY2UoLyVzL2csIHQpO1xuXHR9XG5cdHdhdGNoKHRpdGxlLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiB7XG5cdFx0aWYgKG5ld1ZhbHVlICE9PSBvbGRWYWx1ZSAmJiBkb2N1bWVudCQxKSBkb2N1bWVudCQxLnRpdGxlID0gZm9ybWF0KG5ld1ZhbHVlICE9PSBudWxsICYmIG5ld1ZhbHVlICE9PSB2b2lkIDAgPyBuZXdWYWx1ZSA6IFwiXCIpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0aWYgKG9wdGlvbnMub2JzZXJ2ZSAmJiAhb3B0aW9ucy50aXRsZVRlbXBsYXRlICYmIGRvY3VtZW50JDEgJiYgIWlzUmVhZG9ubHkkMSkge1xuXHRcdHZhciBfZG9jdW1lbnQkaGVhZDtcblx0XHR1c2VNdXRhdGlvbk9ic2VydmVyKChfZG9jdW1lbnQkaGVhZCA9IGRvY3VtZW50JDEuaGVhZCkgPT09IG51bGwgfHwgX2RvY3VtZW50JGhlYWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kb2N1bWVudCRoZWFkLnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKSwgKCkgPT4ge1xuXHRcdFx0aWYgKGRvY3VtZW50JDEgJiYgZG9jdW1lbnQkMS50aXRsZSAhPT0gdGl0bGUudmFsdWUpIHRpdGxlLnZhbHVlID0gZm9ybWF0KGRvY3VtZW50JDEudGl0bGUpO1xuXHRcdH0sIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuXHR9XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRpZiAocmVzdG9yZU9uVW5tb3VudCkge1xuXHRcdFx0Y29uc3QgcmVzdG9yZWRUaXRsZSA9IHJlc3RvcmVPblVubW91bnQob3JpZ2luYWxUaXRsZSwgdGl0bGUudmFsdWUgfHwgXCJcIik7XG5cdFx0XHRpZiAocmVzdG9yZWRUaXRsZSAhPSBudWxsICYmIGRvY3VtZW50JDEpIGRvY3VtZW50JDEudGl0bGUgPSByZXN0b3JlZFRpdGxlO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiB0aXRsZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVHJhbnNpdGlvbi9pbmRleC50c1xuY29uc3QgX1RyYW5zaXRpb25QcmVzZXRzID0ge1xuXHRlYXNlSW5TaW5lOiBbXG5cdFx0LjEyLFxuXHRcdDAsXG5cdFx0LjM5LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dFNpbmU6IFtcblx0XHQuNjEsXG5cdFx0MSxcblx0XHQuODgsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5PdXRTaW5lOiBbXG5cdFx0LjM3LFxuXHRcdDAsXG5cdFx0LjYzLFxuXHRcdDFcblx0XSxcblx0ZWFzZUluUXVhZDogW1xuXHRcdC4xMSxcblx0XHQwLFxuXHRcdC41LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dFF1YWQ6IFtcblx0XHQuNSxcblx0XHQxLFxuXHRcdC44OSxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dFF1YWQ6IFtcblx0XHQuNDUsXG5cdFx0MCxcblx0XHQuNTUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5DdWJpYzogW1xuXHRcdC4zMixcblx0XHQwLFxuXHRcdC42Nyxcblx0XHQwXG5cdF0sXG5cdGVhc2VPdXRDdWJpYzogW1xuXHRcdC4zMyxcblx0XHQxLFxuXHRcdC42OCxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dEN1YmljOiBbXG5cdFx0LjY1LFxuXHRcdDAsXG5cdFx0LjM1LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluUXVhcnQ6IFtcblx0XHQuNSxcblx0XHQwLFxuXHRcdC43NSxcblx0XHQwXG5cdF0sXG5cdGVhc2VPdXRRdWFydDogW1xuXHRcdC4yNSxcblx0XHQxLFxuXHRcdC41LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0UXVhcnQ6IFtcblx0XHQuNzYsXG5cdFx0MCxcblx0XHQuMjQsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5RdWludDogW1xuXHRcdC42NCxcblx0XHQwLFxuXHRcdC43OCxcblx0XHQwXG5cdF0sXG5cdGVhc2VPdXRRdWludDogW1xuXHRcdC4yMixcblx0XHQxLFxuXHRcdC4zNixcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dFF1aW50OiBbXG5cdFx0LjgzLFxuXHRcdDAsXG5cdFx0LjE3LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluRXhwbzogW1xuXHRcdC43LFxuXHRcdDAsXG5cdFx0Ljg0LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dEV4cG86IFtcblx0XHQuMTYsXG5cdFx0MSxcblx0XHQuMyxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dEV4cG86IFtcblx0XHQuODcsXG5cdFx0MCxcblx0XHQuMTMsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5DaXJjOiBbXG5cdFx0LjU1LFxuXHRcdDAsXG5cdFx0MSxcblx0XHQuNDVcblx0XSxcblx0ZWFzZU91dENpcmM6IFtcblx0XHQwLFxuXHRcdC41NSxcblx0XHQuNDUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5PdXRDaXJjOiBbXG5cdFx0Ljg1LFxuXHRcdDAsXG5cdFx0LjE1LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluQmFjazogW1xuXHRcdC4zNixcblx0XHQwLFxuXHRcdC42Nixcblx0XHQtLjU2XG5cdF0sXG5cdGVhc2VPdXRCYWNrOiBbXG5cdFx0LjM0LFxuXHRcdDEuNTYsXG5cdFx0LjY0LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0QmFjazogW1xuXHRcdC42OCxcblx0XHQtLjYsXG5cdFx0LjMyLFxuXHRcdDEuNlxuXHRdXG59O1xuLyoqXG4qIENvbW1vbiB0cmFuc2l0aW9uc1xuKlxuKiBAc2VlIGh0dHBzOi8vZWFzaW5ncy5uZXRcbiovXG5jb25zdCBUcmFuc2l0aW9uUHJlc2V0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuYXNzaWduKHt9LCB7IGxpbmVhcjogaWRlbnRpdHkgfSwgX1RyYW5zaXRpb25QcmVzZXRzKTtcbi8qKlxuKiBDcmVhdGUgYW4gZWFzaW5nIGZ1bmN0aW9uIGZyb20gY3ViaWMgYmV6aWVyIHBvaW50cy5cbiovXG5mdW5jdGlvbiBjcmVhdGVFYXNpbmdGdW5jdGlvbihbcDAsIHAxLCBwMiwgcDNdKSB7XG5cdGNvbnN0IGEgPSAoYTEsIGEyKSA9PiAxIC0gMyAqIGEyICsgMyAqIGExO1xuXHRjb25zdCBiID0gKGExLCBhMikgPT4gMyAqIGEyIC0gNiAqIGExO1xuXHRjb25zdCBjID0gKGExKSA9PiAzICogYTE7XG5cdGNvbnN0IGNhbGNCZXppZXIgPSAodCwgYTEsIGEyKSA9PiAoKGEoYTEsIGEyKSAqIHQgKyBiKGExLCBhMikpICogdCArIGMoYTEpKSAqIHQ7XG5cdGNvbnN0IGdldFNsb3BlID0gKHQsIGExLCBhMikgPT4gMyAqIGEoYTEsIGEyKSAqIHQgKiB0ICsgMiAqIGIoYTEsIGEyKSAqIHQgKyBjKGExKTtcblx0Y29uc3QgZ2V0VGZvclggPSAoeCkgPT4ge1xuXHRcdGxldCBhR3Vlc3NUID0geDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuXHRcdFx0Y29uc3QgY3VycmVudFNsb3BlID0gZ2V0U2xvcGUoYUd1ZXNzVCwgcDAsIHAyKTtcblx0XHRcdGlmIChjdXJyZW50U2xvcGUgPT09IDApIHJldHVybiBhR3Vlc3NUO1xuXHRcdFx0Y29uc3QgY3VycmVudFggPSBjYWxjQmV6aWVyKGFHdWVzc1QsIHAwLCBwMikgLSB4O1xuXHRcdFx0YUd1ZXNzVCAtPSBjdXJyZW50WCAvIGN1cnJlbnRTbG9wZTtcblx0XHR9XG5cdFx0cmV0dXJuIGFHdWVzc1Q7XG5cdH07XG5cdHJldHVybiAoeCkgPT4gcDAgPT09IHAxICYmIHAyID09PSBwMyA/IHggOiBjYWxjQmV6aWVyKGdldFRmb3JYKHgpLCBwMSwgcDMpO1xufVxuZnVuY3Rpb24gbGVycChhLCBiLCBhbHBoYSkge1xuXHRyZXR1cm4gYSArIGFscGhhICogKGIgLSBhKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRJbnRlcnBvbGF0aW9uKGEsIGIsIHQpIHtcblx0Y29uc3QgYVZhbCA9IHRvVmFsdWUoYSk7XG5cdGNvbnN0IGJWYWwgPSB0b1ZhbHVlKGIpO1xuXHRpZiAodHlwZW9mIGFWYWwgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwibnVtYmVyXCIpIHJldHVybiBsZXJwKGFWYWwsIGJWYWwsIHQpO1xuXHRpZiAoQXJyYXkuaXNBcnJheShhVmFsKSAmJiBBcnJheS5pc0FycmF5KGJWYWwpKSByZXR1cm4gYVZhbC5tYXAoKHYsIGkpID0+IGxlcnAodiwgdG9WYWx1ZShiVmFsW2ldKSwgdCkpO1xuXHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biB0cmFuc2l0aW9uIHR5cGUsIHNwZWNpZnkgYW4gaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi5cIik7XG59XG5mdW5jdGlvbiBub3JtYWxpemVFYXNpbmcoZWFzaW5nKSB7XG5cdHZhciBfdG9WYWx1ZTtcblx0cmV0dXJuIHR5cGVvZiBlYXNpbmcgPT09IFwiZnVuY3Rpb25cIiA/IGVhc2luZyA6IChfdG9WYWx1ZSA9IHRvVmFsdWUoZWFzaW5nKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogaWRlbnRpdHk7XG59XG4vKipcbiogVHJhbnNpdGlvbiBmcm9tIG9uZSB2YWx1ZSB0byBhbm90aGVyLlxuKlxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBmcm9tXG4qIEBwYXJhbSB0b1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHRyYW5zaXRpb24oc291cmNlLCBmcm9tLCB0bywgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfdG9WYWx1ZTI7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGZyb21WYWwgPSB0b1ZhbHVlKGZyb20pO1xuXHRjb25zdCB0b1ZhbCA9IHRvVmFsdWUodG8pO1xuXHRjb25zdCBkdXJhdGlvbiA9IChfdG9WYWx1ZTIgPSB0b1ZhbHVlKG9wdGlvbnMuZHVyYXRpb24pKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZTIgIT09IHZvaWQgMCA/IF90b1ZhbHVlMiA6IDFlMztcblx0Y29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblx0Y29uc3QgZW5kQXQgPSBEYXRlLm5vdygpICsgZHVyYXRpb247XG5cdGNvbnN0IGludGVycG9sYXRpb24gPSB0eXBlb2Ygb3B0aW9ucy5pbnRlcnBvbGF0aW9uID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLmludGVycG9sYXRpb24gOiBkZWZhdWx0SW50ZXJwb2xhdGlvbjtcblx0Y29uc3QgdHJhbnMgPSB0eXBlb2Ygb3B0aW9ucy5lYXNpbmcgIT09IFwidW5kZWZpbmVkXCIgPyBub3JtYWxpemVFYXNpbmcob3B0aW9ucy5lYXNpbmcpIDogbm9ybWFsaXplRWFzaW5nKG9wdGlvbnMudHJhbnNpdGlvbik7XG5cdGNvbnN0IGVhc2UgPSB0eXBlb2YgdHJhbnMgPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zIDogY3JlYXRlRWFzaW5nRnVuY3Rpb24odHJhbnMpO1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRzb3VyY2UudmFsdWUgPSBmcm9tVmFsO1xuXHRcdGNvbnN0IHRpY2sgPSAoKSA9PiB7XG5cdFx0XHR2YXIgX29wdGlvbnMkYWJvcnQ7XG5cdFx0XHRpZiAoKF9vcHRpb25zJGFib3J0ID0gb3B0aW9ucy5hYm9ydCkgPT09IG51bGwgfHwgX29wdGlvbnMkYWJvcnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJGFib3J0LmNhbGwob3B0aW9ucykpIHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXHRcdFx0c291cmNlLnZhbHVlID0gaW50ZXJwb2xhdGlvbihmcm9tVmFsLCB0b1ZhbCwgZWFzZSgobm93IC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uKSk7XG5cdFx0XHRpZiAobm93IDwgZW5kQXQpIHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgfHwgd2luZG93JDEucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHNvdXJjZS52YWx1ZSA9IHRvVmFsO1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR0aWNrKCk7XG5cdH0pO1xufVxuLyoqXG4qIFRyYW5zaXRpb24gZnJvbSBvbmUgdmFsdWUgdG8gYW5vdGhlci5cbiogQGRlcHJlY2F0ZWQgVGhlIGBleGVjdXRlVHJhbnNpdGlvbmAgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCwgdXNlIGB0cmFuc2l0aW9uYCBpbnN0ZWFkLlxuKlxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBmcm9tXG4qIEBwYXJhbSB0b1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIGV4ZWN1dGVUcmFuc2l0aW9uKHNvdXJjZSwgZnJvbSwgdG8sIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gdHJhbnNpdGlvbihzb3VyY2UsIGZyb20sIHRvLCBvcHRpb25zKTtcbn1cbi8qKlxuKiBGb2xsb3cgdmFsdWUgd2l0aCBhIHRyYW5zaXRpb24uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRyYW5zaXRpb25cbiogQHBhcmFtIHNvdXJjZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb24oc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0bGV0IGN1cnJlbnRJZCA9IDA7XG5cdGNvbnN0IHNvdXJjZVZhbCA9ICgpID0+IHtcblx0XHRjb25zdCB2ID0gdG9WYWx1ZShzb3VyY2UpO1xuXHRcdHJldHVybiB0eXBlb2Ygb3B0aW9ucy5pbnRlcnBvbGF0aW9uID09PSBcInVuZGVmaW5lZFwiICYmIEFycmF5LmlzQXJyYXkodikgPyB2Lm1hcCh0b1ZhbHVlKSA6IHY7XG5cdH07XG5cdGNvbnN0IG91dHB1dFJlZiA9IHNoYWxsb3dSZWYoc291cmNlVmFsKCkpO1xuXHR3YXRjaChzb3VyY2VWYWwsIGFzeW5jICh0bykgPT4ge1xuXHRcdHZhciBfb3B0aW9ucyRvblN0YXJ0ZWQsIF9vcHRpb25zJG9uRmluaXNoZWQ7XG5cdFx0aWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkpIHJldHVybjtcblx0XHRjb25zdCBpZCA9ICsrY3VycmVudElkO1xuXHRcdGlmIChvcHRpb25zLmRlbGF5KSBhd2FpdCBwcm9taXNlVGltZW91dCh0b1ZhbHVlKG9wdGlvbnMuZGVsYXkpKTtcblx0XHRpZiAoaWQgIT09IGN1cnJlbnRJZCkgcmV0dXJuO1xuXHRcdChfb3B0aW9ucyRvblN0YXJ0ZWQgPSBvcHRpb25zLm9uU3RhcnRlZCkgPT09IG51bGwgfHwgX29wdGlvbnMkb25TdGFydGVkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25TdGFydGVkLmNhbGwob3B0aW9ucyk7XG5cdFx0YXdhaXQgdHJhbnNpdGlvbihvdXRwdXRSZWYsIG91dHB1dFJlZi52YWx1ZSwgdG8sIHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHRhYm9ydDogKCkgPT4ge1xuXHRcdFx0XHR2YXIgX29wdGlvbnMkYWJvcnQyO1xuXHRcdFx0XHRyZXR1cm4gaWQgIT09IGN1cnJlbnRJZCB8fCAoKF9vcHRpb25zJGFib3J0MiA9IG9wdGlvbnMuYWJvcnQpID09PSBudWxsIHx8IF9vcHRpb25zJGFib3J0MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkYWJvcnQyLmNhbGwob3B0aW9ucykpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdChfb3B0aW9ucyRvbkZpbmlzaGVkID0gb3B0aW9ucy5vbkZpbmlzaGVkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkZpbmlzaGVkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25GaW5pc2hlZC5jYWxsKG9wdGlvbnMpO1xuXHR9LCB7IGRlZXA6IHRydWUgfSk7XG5cdHdhdGNoKCgpID0+IHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCksIChkaXNhYmxlZCkgPT4ge1xuXHRcdGlmIChkaXNhYmxlZCkge1xuXHRcdFx0Y3VycmVudElkKys7XG5cdFx0XHRvdXRwdXRSZWYudmFsdWUgPSBzb3VyY2VWYWwoKTtcblx0XHR9XG5cdH0pO1xuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0Y3VycmVudElkKys7XG5cdH0pO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSA/IHNvdXJjZVZhbCgpIDogb3V0cHV0UmVmLnZhbHVlKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVXJsU2VhcmNoUGFyYW1zL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgVVJMU2VhcmNoUGFyYW1zXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVVybFNlYXJjaFBhcmFtc1xuKiBAcGFyYW0gbW9kZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVVybFNlYXJjaFBhcmFtcyhtb2RlID0gXCJoaXN0b3J5XCIsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluaXRpYWxWYWx1ZSA9IHt9LCByZW1vdmVOdWxsaXNoVmFsdWVzID0gdHJ1ZSwgcmVtb3ZlRmFsc3lWYWx1ZXMgPSBmYWxzZSwgd3JpdGU6IGVuYWJsZVdyaXRlID0gdHJ1ZSwgd3JpdGVNb2RlID0gXCJyZXBsYWNlXCIsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBzdHJpbmdpZnkgPSAocGFyYW1zKSA9PiBwYXJhbXMudG9TdHJpbmcoKSB9ID0gb3B0aW9ucztcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHJlYWN0aXZlKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IHN0YXRlID0gcmVhY3RpdmUoe30pO1xuXHRmdW5jdGlvbiBnZXRSYXdQYXJhbXMoKSB7XG5cdFx0aWYgKG1vZGUgPT09IFwiaGlzdG9yeVwiKSByZXR1cm4gd2luZG93JDEubG9jYXRpb24uc2VhcmNoIHx8IFwiXCI7XG5cdFx0ZWxzZSBpZiAobW9kZSA9PT0gXCJoYXNoXCIpIHtcblx0XHRcdGNvbnN0IGhhc2ggPSB3aW5kb3ckMS5sb2NhdGlvbi5oYXNoIHx8IFwiXCI7XG5cdFx0XHRjb25zdCBpbmRleCA9IGhhc2guaW5kZXhPZihcIj9cIik7XG5cdFx0XHRyZXR1cm4gaW5kZXggPiAwID8gaGFzaC5zbGljZShpbmRleCkgOiBcIlwiO1xuXHRcdH0gZWxzZSByZXR1cm4gKHdpbmRvdyQxLmxvY2F0aW9uLmhhc2ggfHwgXCJcIikucmVwbGFjZSgvXiMvLCBcIlwiKTtcblx0fVxuXHRmdW5jdGlvbiBjb25zdHJ1Y3RRdWVyeShwYXJhbXMpIHtcblx0XHRjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeShwYXJhbXMpO1xuXHRcdGlmIChtb2RlID09PSBcImhpc3RvcnlcIikgcmV0dXJuIGAke3N0cmluZ2lmaWVkID8gYD8ke3N0cmluZ2lmaWVkfWAgOiBcIlwifSR7d2luZG93JDEubG9jYXRpb24uaGFzaCB8fCBcIlwifWA7XG5cdFx0aWYgKG1vZGUgPT09IFwiaGFzaC1wYXJhbXNcIikgcmV0dXJuIGAke3dpbmRvdyQxLmxvY2F0aW9uLnNlYXJjaCB8fCBcIlwifSR7c3RyaW5naWZpZWQgPyBgIyR7c3RyaW5naWZpZWR9YCA6IFwiXCJ9YDtcblx0XHRjb25zdCBoYXNoID0gd2luZG93JDEubG9jYXRpb24uaGFzaCB8fCBcIiNcIjtcblx0XHRjb25zdCBpbmRleCA9IGhhc2guaW5kZXhPZihcIj9cIik7XG5cdFx0aWYgKGluZGV4ID4gMCkgcmV0dXJuIGAke3dpbmRvdyQxLmxvY2F0aW9uLnNlYXJjaCB8fCBcIlwifSR7aGFzaC5zbGljZSgwLCBpbmRleCl9JHtzdHJpbmdpZmllZCA/IGA/JHtzdHJpbmdpZmllZH1gIDogXCJcIn1gO1xuXHRcdHJldHVybiBgJHt3aW5kb3ckMS5sb2NhdGlvbi5zZWFyY2ggfHwgXCJcIn0ke2hhc2h9JHtzdHJpbmdpZmllZCA/IGA/JHtzdHJpbmdpZmllZH1gIDogXCJcIn1gO1xuXHR9XG5cdGZ1bmN0aW9uIHJlYWQoKSB7XG5cdFx0cmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoZ2V0UmF3UGFyYW1zKCkpO1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZVN0YXRlKHBhcmFtcykge1xuXHRcdGNvbnN0IHVudXNlZEtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHN0YXRlKSk7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgcGFyYW1zLmtleXMoKSkge1xuXHRcdFx0Y29uc3QgcGFyYW1zRm9yS2V5ID0gcGFyYW1zLmdldEFsbChrZXkpO1xuXHRcdFx0c3RhdGVba2V5XSA9IHBhcmFtc0ZvcktleS5sZW5ndGggPiAxID8gcGFyYW1zRm9yS2V5IDogcGFyYW1zLmdldChrZXkpIHx8IFwiXCI7XG5cdFx0XHR1bnVzZWRLZXlzLmRlbGV0ZShrZXkpO1xuXHRcdH1cblx0XHRBcnJheS5mcm9tKHVudXNlZEtleXMpLmZvckVhY2goKGtleSkgPT4gZGVsZXRlIHN0YXRlW2tleV0pO1xuXHR9XG5cdGNvbnN0IHsgcGF1c2UsIHJlc3VtZSB9ID0gd2F0Y2hQYXVzYWJsZShzdGF0ZSwgKCkgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoXCJcIik7XG5cdFx0T2JqZWN0LmtleXMoc3RhdGUpLmZvckVhY2goKGtleSkgPT4ge1xuXHRcdFx0Y29uc3QgbWFwRW50cnkgPSBzdGF0ZVtrZXldO1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkobWFwRW50cnkpKSBtYXBFbnRyeS5mb3JFYWNoKCh2YWx1ZSkgPT4gcGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKSk7XG5cdFx0XHRlbHNlIGlmIChyZW1vdmVOdWxsaXNoVmFsdWVzICYmIG1hcEVudHJ5ID09IG51bGwpIHBhcmFtcy5kZWxldGUoa2V5KTtcblx0XHRcdGVsc2UgaWYgKHJlbW92ZUZhbHN5VmFsdWVzICYmICFtYXBFbnRyeSkgcGFyYW1zLmRlbGV0ZShrZXkpO1xuXHRcdFx0ZWxzZSBwYXJhbXMuc2V0KGtleSwgbWFwRW50cnkpO1xuXHRcdH0pO1xuXHRcdHdyaXRlKHBhcmFtcywgZmFsc2UpO1xuXHR9LCB7IGRlZXA6IHRydWUgfSk7XG5cdGZ1bmN0aW9uIHdyaXRlKHBhcmFtcywgc2hvdWxkVXBkYXRlLCBzaG91bGRXcml0ZUhpc3RvcnkgPSB0cnVlKSB7XG5cdFx0cGF1c2UoKTtcblx0XHRpZiAoc2hvdWxkVXBkYXRlKSB1cGRhdGVTdGF0ZShwYXJhbXMpO1xuXHRcdGlmICh3cml0ZU1vZGUgPT09IFwicmVwbGFjZVwiKSB3aW5kb3ckMS5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh3aW5kb3ckMS5oaXN0b3J5LnN0YXRlLCB3aW5kb3ckMS5kb2N1bWVudC50aXRsZSwgd2luZG93JDEubG9jYXRpb24ucGF0aG5hbWUgKyBjb25zdHJ1Y3RRdWVyeShwYXJhbXMpKTtcblx0XHRlbHNlIGlmIChzaG91bGRXcml0ZUhpc3RvcnkpIHdpbmRvdyQxLmhpc3RvcnkucHVzaFN0YXRlKHdpbmRvdyQxLmhpc3Rvcnkuc3RhdGUsIHdpbmRvdyQxLmRvY3VtZW50LnRpdGxlLCB3aW5kb3ckMS5sb2NhdGlvbi5wYXRobmFtZSArIGNvbnN0cnVjdFF1ZXJ5KHBhcmFtcykpO1xuXHRcdG5leHRUaWNrKCgpID0+IHJlc3VtZSgpKTtcblx0fVxuXHRmdW5jdGlvbiBvbkNoYW5nZWQoKSB7XG5cdFx0aWYgKCFlbmFibGVXcml0ZSkgcmV0dXJuO1xuXHRcdHdyaXRlKHJlYWQoKSwgdHJ1ZSwgZmFsc2UpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInBvcHN0YXRlXCIsIG9uQ2hhbmdlZCwgbGlzdGVuZXJPcHRpb25zKTtcblx0aWYgKG1vZGUgIT09IFwiaGlzdG9yeVwiKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImhhc2hjaGFuZ2VcIiwgb25DaGFuZ2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRjb25zdCBpbml0aWFsID0gcmVhZCgpO1xuXHRpZiAoaW5pdGlhbC5rZXlzKCkubmV4dCgpLnZhbHVlKSB1cGRhdGVTdGF0ZShpbml0aWFsKTtcblx0ZWxzZSBPYmplY3QuYXNzaWduKHN0YXRlLCBpbml0aWFsVmFsdWUpO1xuXHRyZXR1cm4gc3RhdGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVVzZXJNZWRpYS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBtZWRpYURldmljZXMuZ2V0VXNlck1lZGlhYCBzdHJlYW1pbmdcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVXNlck1lZGlhXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVXNlck1lZGlhKG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkZW5hYmxlZCwgX29wdGlvbnMkYXV0b1N3aXRjaDtcblx0Y29uc3QgZW5hYmxlZCA9IHNoYWxsb3dSZWYoKF9vcHRpb25zJGVuYWJsZWQgPSBvcHRpb25zLmVuYWJsZWQpICE9PSBudWxsICYmIF9vcHRpb25zJGVuYWJsZWQgIT09IHZvaWQgMCA/IF9vcHRpb25zJGVuYWJsZWQgOiBmYWxzZSk7XG5cdGNvbnN0IGF1dG9Td2l0Y2ggPSBzaGFsbG93UmVmKChfb3B0aW9ucyRhdXRvU3dpdGNoID0gb3B0aW9ucy5hdXRvU3dpdGNoKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRhdXRvU3dpdGNoICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRhdXRvU3dpdGNoIDogdHJ1ZSk7XG5cdGNvbnN0IGNvbnN0cmFpbnRzID0gcmVmKG9wdGlvbnMuY29uc3RyYWludHMpO1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4ge1xuXHRcdHZhciBfbmF2aWdhdG9yJG1lZGlhRGV2aWM7XG5cdFx0cmV0dXJuIG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgfHwgKF9uYXZpZ2F0b3IkbWVkaWFEZXZpYyA9IG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcykgPT09IG51bGwgfHwgX25hdmlnYXRvciRtZWRpYURldmljID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbmF2aWdhdG9yJG1lZGlhRGV2aWMuZ2V0VXNlck1lZGlhO1xuXHR9KTtcblx0Y29uc3Qgc3RyZWFtID0gc2hhbGxvd1JlZigpO1xuXHRmdW5jdGlvbiBnZXREZXZpY2VPcHRpb25zKHR5cGUpIHtcblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRcdGNhc2UgXCJ2aWRlb1wiOlxuXHRcdFx0XHRpZiAoY29uc3RyYWludHMudmFsdWUpIHJldHVybiBjb25zdHJhaW50cy52YWx1ZS52aWRlbyB8fCBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiYXVkaW9cIjpcblx0XHRcdFx0aWYgKGNvbnN0cmFpbnRzLnZhbHVlKSByZXR1cm4gY29uc3RyYWludHMudmFsdWUuYXVkaW8gfHwgZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXHRhc3luYyBmdW5jdGlvbiBfc3RhcnQoKSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCBzdHJlYW0udmFsdWUpIHJldHVybjtcblx0XHRzdHJlYW0udmFsdWUgPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcblx0XHRcdHZpZGVvOiBnZXREZXZpY2VPcHRpb25zKFwidmlkZW9cIiksXG5cdFx0XHRhdWRpbzogZ2V0RGV2aWNlT3B0aW9ucyhcImF1ZGlvXCIpXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHN0cmVhbS52YWx1ZTtcblx0fVxuXHRmdW5jdGlvbiBfc3RvcCgpIHtcblx0XHR2YXIgX3N0cmVhbSR2YWx1ZTtcblx0XHQoX3N0cmVhbSR2YWx1ZSA9IHN0cmVhbS52YWx1ZSkgPT09IG51bGwgfHwgX3N0cmVhbSR2YWx1ZSA9PT0gdm9pZCAwIHx8IF9zdHJlYW0kdmFsdWUuZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuXHRcdHN0cmVhbS52YWx1ZSA9IHZvaWQgMDtcblx0fVxuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdF9zdG9wKCk7XG5cdFx0ZW5hYmxlZC52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuXHRcdGF3YWl0IF9zdGFydCgpO1xuXHRcdGlmIChzdHJlYW0udmFsdWUpIGVuYWJsZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBzdHJlYW0udmFsdWU7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gcmVzdGFydCgpIHtcblx0XHRfc3RvcCgpO1xuXHRcdHJldHVybiBhd2FpdCBzdGFydCgpO1xuXHR9XG5cdHdhdGNoKGVuYWJsZWQsICh2KSA9PiB7XG5cdFx0aWYgKHYpIF9zdGFydCgpO1xuXHRcdGVsc2UgX3N0b3AoKTtcblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHdhdGNoKGNvbnN0cmFpbnRzLCAoKSA9PiB7XG5cdFx0aWYgKGF1dG9Td2l0Y2gudmFsdWUgJiYgc3RyZWFtLnZhbHVlKSByZXN0YXJ0KCk7XG5cdH0sIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0ZGVlcDogdHJ1ZVxuXHR9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHN0b3AoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c3RyZWFtLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3AsXG5cdFx0cmVzdGFydCxcblx0XHRjb25zdHJhaW50cyxcblx0XHRlbmFibGVkLFxuXHRcdGF1dG9Td2l0Y2hcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVk1vZGVsL2luZGV4LnRzXG4vKipcbiogU2hvcnRoYW5kIGZvciB2LW1vZGVsIGJpbmRpbmcsIHByb3BzICsgZW1pdCAtPiByZWZcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVk1vZGVsXG4qIEBwYXJhbSBwcm9wc1xuKiBAcGFyYW0ga2V5IChkZWZhdWx0ICdtb2RlbFZhbHVlJylcbiogQHBhcmFtIGVtaXRcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VWTW9kZWwocHJvcHMsIGtleSwgZW1pdCwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfdm0kJGVtaXQsIF92bSRwcm94eTtcblx0Y29uc3QgeyBjbG9uZSA9IGZhbHNlLCBwYXNzaXZlID0gZmFsc2UsIGV2ZW50TmFtZSwgZGVlcCA9IGZhbHNlLCBkZWZhdWx0VmFsdWUsIHNob3VsZEVtaXQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHZtID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGNvbnN0IF9lbWl0ID0gZW1pdCB8fCAodm0gPT09IG51bGwgfHwgdm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZtLmVtaXQpIHx8ICh2bSA9PT0gbnVsbCB8fCB2bSA9PT0gdm9pZCAwIHx8IChfdm0kJGVtaXQgPSB2bS4kZW1pdCkgPT09IG51bGwgfHwgX3ZtJCRlbWl0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdm0kJGVtaXQuYmluZCh2bSkpIHx8ICh2bSA9PT0gbnVsbCB8fCB2bSA9PT0gdm9pZCAwIHx8IChfdm0kcHJveHkgPSB2bS5wcm94eSkgPT09IG51bGwgfHwgX3ZtJHByb3h5ID09PSB2b2lkIDAgfHwgKF92bSRwcm94eSA9IF92bSRwcm94eS4kZW1pdCkgPT09IG51bGwgfHwgX3ZtJHByb3h5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdm0kcHJveHkuYmluZCh2bSA9PT0gbnVsbCB8fCB2bSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdm0ucHJveHkpKTtcblx0bGV0IGV2ZW50ID0gZXZlbnROYW1lO1xuXHRpZiAoIWtleSkga2V5ID0gXCJtb2RlbFZhbHVlXCI7XG5cdGV2ZW50ID0gZXZlbnQgfHwgYHVwZGF0ZToke2tleS50b1N0cmluZygpfWA7XG5cdGNvbnN0IGNsb25lRm4gPSAodmFsKSA9PiAhY2xvbmUgPyB2YWwgOiB0eXBlb2YgY2xvbmUgPT09IFwiZnVuY3Rpb25cIiA/IGNsb25lKHZhbCkgOiBjbG9uZUZuSlNPTih2YWwpO1xuXHRjb25zdCBnZXRWYWx1ZSQxID0gKCkgPT4gaXNEZWYocHJvcHNba2V5XSkgPyBjbG9uZUZuKHByb3BzW2tleV0pIDogZGVmYXVsdFZhbHVlO1xuXHRjb25zdCB0cmlnZ2VyRW1pdCA9ICh2YWx1ZSkgPT4ge1xuXHRcdGlmIChzaG91bGRFbWl0KSB7XG5cdFx0XHRpZiAoc2hvdWxkRW1pdCh2YWx1ZSkpIF9lbWl0KGV2ZW50LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIF9lbWl0KGV2ZW50LCB2YWx1ZSk7XG5cdH07XG5cdGlmIChwYXNzaXZlKSB7XG5cdFx0Y29uc3QgcHJveHkgPSByZWYoZ2V0VmFsdWUkMSgpKTtcblx0XHRsZXQgaXNVcGRhdGluZyA9IGZhbHNlO1xuXHRcdHdhdGNoKCgpID0+IHByb3BzW2tleV0sICh2KSA9PiB7XG5cdFx0XHRpZiAoIWlzVXBkYXRpbmcpIHtcblx0XHRcdFx0aXNVcGRhdGluZyA9IHRydWU7XG5cdFx0XHRcdHByb3h5LnZhbHVlID0gY2xvbmVGbih2KTtcblx0XHRcdFx0bmV4dFRpY2soKCkgPT4gaXNVcGRhdGluZyA9IGZhbHNlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHR3YXRjaChwcm94eSwgKHYpID0+IHtcblx0XHRcdGlmICghaXNVcGRhdGluZyAmJiAodiAhPT0gcHJvcHNba2V5XSB8fCBkZWVwKSkgdHJpZ2dlckVtaXQodik7XG5cdFx0fSwgeyBkZWVwIH0pO1xuXHRcdHJldHVybiBwcm94eTtcblx0fSBlbHNlIHJldHVybiBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGdldFZhbHVlJDEoKTtcblx0XHR9LFxuXHRcdHNldCh2YWx1ZSkge1xuXHRcdFx0dHJpZ2dlckVtaXQodmFsdWUpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVZNb2RlbHMvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHByb3BzIHYtbW9kZWwgYmluZGluZy4gVGhpbmsgbGlrZSBgdG9SZWZzKHByb3BzKWAgYnV0IGNoYW5nZXMgd2lsbCBhbHNvIGVtaXQgb3V0LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VWTW9kZWxzXG4qIEBwYXJhbSBwcm9wc1xuKiBAcGFyYW0gZW1pdFxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVZNb2RlbHMocHJvcHMsIGVtaXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCByZXQgPSB7fTtcblx0Zm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHJldFtrZXldID0gdXNlVk1vZGVsKHByb3BzLCBrZXksIGVtaXQsIG9wdGlvbnMpO1xuXHRyZXR1cm4gcmV0O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VWaWJyYXRlL2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDEob3B0aW9ucyA9IHsgaW50ZXJ2YWw6IDAgfSkge1xuXHRjb25zdCB7IGludGVydmFsIH0gPSBvcHRpb25zO1xuXHRpZiAoaW50ZXJ2YWwgPT09IDApIHJldHVybjtcblx0cmV0dXJuIChmbikgPT4gdXNlSW50ZXJ2YWxGbihmbiwgaW50ZXJ2YWwsIHtcblx0XHRpbW1lZGlhdGU6IGZhbHNlLFxuXHRcdGltbWVkaWF0ZUNhbGxiYWNrOiBmYWxzZVxuXHR9KTtcbn1cbi8qKlxuKiBSZWFjdGl2ZSB2aWJyYXRlXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVZpYnJhdGVcbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVmlicmF0aW9uX0FQSVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVZpYnJhdGUob3B0aW9ucykge1xuXHRjb25zdCB7IHBhdHRlcm4gPSBbXSwgc2NoZWR1bGVyID0gZ2V0RGVmYXVsdFNjaGVkdWxlciQxKG9wdGlvbnMpLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiBuYXZpZ2F0b3IkMSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBcInZpYnJhdGVcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IHBhdHRlcm5SZWYgPSB0b1JlZihwYXR0ZXJuKTtcblx0Y29uc3QgdmlicmF0ZSA9IChwYXR0ZXJuJDEgPSBwYXR0ZXJuUmVmLnZhbHVlKSA9PiB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBuYXZpZ2F0b3IkMS52aWJyYXRlKHBhdHRlcm4kMSk7XG5cdH07XG5cdGNvbnN0IGludGVydmFsQ29udHJvbHMgPSBzY2hlZHVsZXIgPT09IG51bGwgfHwgc2NoZWR1bGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlZHVsZXIodmlicmF0ZSk7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBuYXZpZ2F0b3IkMS52aWJyYXRlKDApO1xuXHRcdGludGVydmFsQ29udHJvbHMgPT09IG51bGwgfHwgaW50ZXJ2YWxDb250cm9scyA9PT0gdm9pZCAwIHx8IGludGVydmFsQ29udHJvbHMucGF1c2UoKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRwYXR0ZXJuLFxuXHRcdGludGVydmFsQ29udHJvbHMsXG5cdFx0dmlicmF0ZSxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVZpcnR1YWxMaXN0L2luZGV4LnRzXG4vKipcbiogUGxlYXNlIGNvbnNpZGVyIHVzaW5nIFtgdnVlLXZpcnR1YWwtc2Nyb2xsZXJgXShodHRwczovL2dpdGh1Yi5jb20vQWtyeXVtL3Z1ZS12aXJ0dWFsLXNjcm9sbGVyKSBpZiB5b3UgYXJlIGxvb2tpbmcgZm9yIG1vcmUgZmVhdHVyZXMuXG4qL1xuZnVuY3Rpb24gdXNlVmlydHVhbExpc3QobGlzdCwgb3B0aW9ucykge1xuXHRjb25zdCB7IGNvbnRhaW5lclN0eWxlLCB3cmFwcGVyUHJvcHMsIHNjcm9sbFRvLCBjYWxjdWxhdGVSYW5nZSwgY3VycmVudExpc3QsIGNvbnRhaW5lclJlZiB9ID0gXCJpdGVtSGVpZ2h0XCIgaW4gb3B0aW9ucyA/IHVzZVZlcnRpY2FsVmlydHVhbExpc3Qob3B0aW9ucywgbGlzdCkgOiB1c2VIb3Jpem9udGFsVmlydHVhbExpc3Qob3B0aW9ucywgbGlzdCk7XG5cdHJldHVybiB7XG5cdFx0bGlzdDogY3VycmVudExpc3QsXG5cdFx0c2Nyb2xsVG8sXG5cdFx0Y29udGFpbmVyUHJvcHM6IHtcblx0XHRcdHJlZjogY29udGFpbmVyUmVmLFxuXHRcdFx0b25TY3JvbGw6ICgpID0+IHtcblx0XHRcdFx0Y2FsY3VsYXRlUmFuZ2UoKTtcblx0XHRcdH0sXG5cdFx0XHRzdHlsZTogY29udGFpbmVyU3R5bGVcblx0XHR9LFxuXHRcdHdyYXBwZXJQcm9wc1xuXHR9O1xufVxuZnVuY3Rpb24gdXNlVmlydHVhbExpc3RSZXNvdXJjZXMobGlzdCkge1xuXHRjb25zdCBjb250YWluZXJSZWYgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBzaXplID0gdXNlRWxlbWVudFNpemUoY29udGFpbmVyUmVmKTtcblx0Y29uc3QgY3VycmVudExpc3QgPSByZWYoW10pO1xuXHRjb25zdCBzb3VyY2UgPSBzaGFsbG93UmVmKGxpc3QpO1xuXHRyZXR1cm4ge1xuXHRcdHN0YXRlOiByZWYoe1xuXHRcdFx0c3RhcnQ6IDAsXG5cdFx0XHRlbmQ6IDEwXG5cdFx0fSksXG5cdFx0c291cmNlLFxuXHRcdGN1cnJlbnRMaXN0LFxuXHRcdHNpemUsXG5cdFx0Y29udGFpbmVyUmVmXG5cdH07XG59XG5mdW5jdGlvbiBjcmVhdGVHZXRWaWV3Q2FwYWNpdHkoc3RhdGUsIHNvdXJjZSwgaXRlbVNpemUpIHtcblx0cmV0dXJuIChjb250YWluZXJTaXplKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE1hdGguY2VpbChjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuXHRcdGNvbnN0IHsgc3RhcnQgPSAwIH0gPSBzdGF0ZS52YWx1ZTtcblx0XHRsZXQgc3VtID0gMDtcblx0XHRsZXQgY2FwYWNpdHkgPSAwO1xuXHRcdGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHNvdXJjZS52YWx1ZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgc2l6ZSA9IGl0ZW1TaXplKGkpO1xuXHRcdFx0c3VtICs9IHNpemU7XG5cdFx0XHRjYXBhY2l0eSA9IGk7XG5cdFx0XHRpZiAoc3VtID4gY29udGFpbmVyU2l6ZSkgYnJlYWs7XG5cdFx0fVxuXHRcdHJldHVybiBjYXBhY2l0eSAtIHN0YXJ0O1xuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlR2V0T2Zmc2V0KHNvdXJjZSwgaXRlbVNpemUpIHtcblx0cmV0dXJuIChzY3JvbGxEaXJlY3Rpb24pID0+IHtcblx0XHRpZiAodHlwZW9mIGl0ZW1TaXplID09PSBcIm51bWJlclwiKSByZXR1cm4gTWF0aC5mbG9vcihzY3JvbGxEaXJlY3Rpb24gLyBpdGVtU2l6ZSkgKyAxO1xuXHRcdGxldCBzdW0gPSAwO1xuXHRcdGxldCBvZmZzZXQgPSAwO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzaXplID0gaXRlbVNpemUoaSk7XG5cdFx0XHRzdW0gKz0gc2l6ZTtcblx0XHRcdGlmIChzdW0gPj0gc2Nyb2xsRGlyZWN0aW9uKSB7XG5cdFx0XHRcdG9mZnNldCA9IGk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb2Zmc2V0ICsgMTtcblx0fTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhbGN1bGF0ZVJhbmdlKHR5cGUsIG92ZXJzY2FuLCBnZXRPZmZzZXQsIGdldFZpZXdDYXBhY2l0eSwgeyBjb250YWluZXJSZWYsIHN0YXRlLCBjdXJyZW50TGlzdCwgc291cmNlIH0pIHtcblx0cmV0dXJuICgpID0+IHtcblx0XHRjb25zdCBlbGVtZW50ID0gY29udGFpbmVyUmVmLnZhbHVlO1xuXHRcdGlmIChlbGVtZW50KSB7XG5cdFx0XHRjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXQodHlwZSA9PT0gXCJ2ZXJ0aWNhbFwiID8gZWxlbWVudC5zY3JvbGxUb3AgOiBlbGVtZW50LnNjcm9sbExlZnQpO1xuXHRcdFx0Y29uc3Qgdmlld0NhcGFjaXR5ID0gZ2V0Vmlld0NhcGFjaXR5KHR5cGUgPT09IFwidmVydGljYWxcIiA/IGVsZW1lbnQuY2xpZW50SGVpZ2h0IDogZWxlbWVudC5jbGllbnRXaWR0aCk7XG5cdFx0XHRjb25zdCBmcm9tID0gb2Zmc2V0IC0gb3ZlcnNjYW47XG5cdFx0XHRjb25zdCB0byA9IG9mZnNldCArIHZpZXdDYXBhY2l0eSArIG92ZXJzY2FuO1xuXHRcdFx0c3RhdGUudmFsdWUgPSB7XG5cdFx0XHRcdHN0YXJ0OiBmcm9tIDwgMCA/IDAgOiBmcm9tLFxuXHRcdFx0XHRlbmQ6IHRvID4gc291cmNlLnZhbHVlLmxlbmd0aCA/IHNvdXJjZS52YWx1ZS5sZW5ndGggOiB0b1xuXHRcdFx0fTtcblx0XHRcdGN1cnJlbnRMaXN0LnZhbHVlID0gc291cmNlLnZhbHVlLnNsaWNlKHN0YXRlLnZhbHVlLnN0YXJ0LCBzdGF0ZS52YWx1ZS5lbmQpLm1hcCgoZWxlLCBpbmRleCkgPT4gKHtcblx0XHRcdFx0ZGF0YTogZWxlLFxuXHRcdFx0XHRpbmRleDogaW5kZXggKyBzdGF0ZS52YWx1ZS5zdGFydFxuXHRcdFx0fSkpO1xuXHRcdH1cblx0fTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUdldERpc3RhbmNlKGl0ZW1TaXplLCBzb3VyY2UpIHtcblx0cmV0dXJuIChpbmRleCkgPT4ge1xuXHRcdGlmICh0eXBlb2YgaXRlbVNpemUgPT09IFwibnVtYmVyXCIpIHJldHVybiBpbmRleCAqIGl0ZW1TaXplO1xuXHRcdHJldHVybiBzb3VyY2UudmFsdWUuc2xpY2UoMCwgaW5kZXgpLnJlZHVjZSgoc3VtLCBfLCBpKSA9PiBzdW0gKyBpdGVtU2l6ZShpKSwgMCk7XG5cdH07XG59XG5mdW5jdGlvbiB1c2VXYXRjaEZvclNpemVzKHNpemUsIGxpc3QsIGNvbnRhaW5lclJlZiwgY2FsY3VsYXRlUmFuZ2UpIHtcblx0d2F0Y2goW1xuXHRcdHNpemUud2lkdGgsXG5cdFx0c2l6ZS5oZWlnaHQsXG5cdFx0KCkgPT4gdG9WYWx1ZShsaXN0KSxcblx0XHRjb250YWluZXJSZWZcblx0XSwgKCkgPT4ge1xuXHRcdGNhbGN1bGF0ZVJhbmdlKCk7XG5cdH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tcHV0ZWRUb3RhbFNpemUoaXRlbVNpemUsIHNvdXJjZSkge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmICh0eXBlb2YgaXRlbVNpemUgPT09IFwibnVtYmVyXCIpIHJldHVybiBzb3VyY2UudmFsdWUubGVuZ3RoICogaXRlbVNpemU7XG5cdFx0cmV0dXJuIHNvdXJjZS52YWx1ZS5yZWR1Y2UoKHN1bSwgXywgaW5kZXgpID0+IHN1bSArIGl0ZW1TaXplKGluZGV4KSwgMCk7XG5cdH0pO1xufVxuY29uc3Qgc2Nyb2xsVG9EaWN0aW9uYXJ5Rm9yRWxlbWVudFNjcm9sbEtleSA9IHtcblx0aG9yaXpvbnRhbDogXCJzY3JvbGxMZWZ0XCIsXG5cdHZlcnRpY2FsOiBcInNjcm9sbFRvcFwiXG59O1xuZnVuY3Rpb24gY3JlYXRlU2Nyb2xsVG8odHlwZSwgY2FsY3VsYXRlUmFuZ2UsIGdldERpc3RhbmNlLCBjb250YWluZXJSZWYpIHtcblx0cmV0dXJuIChpbmRleCkgPT4ge1xuXHRcdGlmIChjb250YWluZXJSZWYudmFsdWUpIHtcblx0XHRcdGNvbnRhaW5lclJlZi52YWx1ZVtzY3JvbGxUb0RpY3Rpb25hcnlGb3JFbGVtZW50U2Nyb2xsS2V5W3R5cGVdXSA9IGdldERpc3RhbmNlKGluZGV4KTtcblx0XHRcdGNhbGN1bGF0ZVJhbmdlKCk7XG5cdFx0fVxuXHR9O1xufVxuZnVuY3Rpb24gdXNlSG9yaXpvbnRhbFZpcnR1YWxMaXN0KG9wdGlvbnMsIGxpc3QpIHtcblx0Y29uc3QgcmVzb3VyY2VzID0gdXNlVmlydHVhbExpc3RSZXNvdXJjZXMobGlzdCk7XG5cdGNvbnN0IHsgc3RhdGUsIHNvdXJjZSwgY3VycmVudExpc3QsIHNpemUsIGNvbnRhaW5lclJlZiB9ID0gcmVzb3VyY2VzO1xuXHRjb25zdCBjb250YWluZXJTdHlsZSA9IHsgb3ZlcmZsb3dYOiBcImF1dG9cIiB9O1xuXHRjb25zdCB7IGl0ZW1XaWR0aCwgb3ZlcnNjYW4gPSA1IH0gPSBvcHRpb25zO1xuXHRjb25zdCBnZXRWaWV3Q2FwYWNpdHkgPSBjcmVhdGVHZXRWaWV3Q2FwYWNpdHkoc3RhdGUsIHNvdXJjZSwgaXRlbVdpZHRoKTtcblx0Y29uc3QgY2FsY3VsYXRlUmFuZ2UgPSBjcmVhdGVDYWxjdWxhdGVSYW5nZShcImhvcml6b250YWxcIiwgb3ZlcnNjYW4sIGNyZWF0ZUdldE9mZnNldChzb3VyY2UsIGl0ZW1XaWR0aCksIGdldFZpZXdDYXBhY2l0eSwgcmVzb3VyY2VzKTtcblx0Y29uc3QgZ2V0RGlzdGFuY2VMZWZ0ID0gY3JlYXRlR2V0RGlzdGFuY2UoaXRlbVdpZHRoLCBzb3VyY2UpO1xuXHRjb25zdCBvZmZzZXRMZWZ0ID0gY29tcHV0ZWQoKCkgPT4gZ2V0RGlzdGFuY2VMZWZ0KHN0YXRlLnZhbHVlLnN0YXJ0KSk7XG5cdGNvbnN0IHRvdGFsV2lkdGggPSBjcmVhdGVDb21wdXRlZFRvdGFsU2l6ZShpdGVtV2lkdGgsIHNvdXJjZSk7XG5cdHVzZVdhdGNoRm9yU2l6ZXMoc2l6ZSwgbGlzdCwgY29udGFpbmVyUmVmLCBjYWxjdWxhdGVSYW5nZSk7XG5cdHJldHVybiB7XG5cdFx0c2Nyb2xsVG86IGNyZWF0ZVNjcm9sbFRvKFwiaG9yaXpvbnRhbFwiLCBjYWxjdWxhdGVSYW5nZSwgZ2V0RGlzdGFuY2VMZWZ0LCBjb250YWluZXJSZWYpLFxuXHRcdGNhbGN1bGF0ZVJhbmdlLFxuXHRcdHdyYXBwZXJQcm9wczogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHsgc3R5bGU6IHtcblx0XHRcdFx0aGVpZ2h0OiBcIjEwMCVcIixcblx0XHRcdFx0d2lkdGg6IGAke3RvdGFsV2lkdGgudmFsdWUgLSBvZmZzZXRMZWZ0LnZhbHVlfXB4YCxcblx0XHRcdFx0bWFyZ2luTGVmdDogYCR7b2Zmc2V0TGVmdC52YWx1ZX1weGAsXG5cdFx0XHRcdGRpc3BsYXk6IFwiZmxleFwiXG5cdFx0XHR9IH07XG5cdFx0fSksXG5cdFx0Y29udGFpbmVyU3R5bGUsXG5cdFx0Y3VycmVudExpc3QsXG5cdFx0Y29udGFpbmVyUmVmXG5cdH07XG59XG5mdW5jdGlvbiB1c2VWZXJ0aWNhbFZpcnR1YWxMaXN0KG9wdGlvbnMsIGxpc3QpIHtcblx0Y29uc3QgcmVzb3VyY2VzID0gdXNlVmlydHVhbExpc3RSZXNvdXJjZXMobGlzdCk7XG5cdGNvbnN0IHsgc3RhdGUsIHNvdXJjZSwgY3VycmVudExpc3QsIHNpemUsIGNvbnRhaW5lclJlZiB9ID0gcmVzb3VyY2VzO1xuXHRjb25zdCBjb250YWluZXJTdHlsZSA9IHsgb3ZlcmZsb3dZOiBcImF1dG9cIiB9O1xuXHRjb25zdCB7IGl0ZW1IZWlnaHQsIG92ZXJzY2FuID0gNSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZ2V0Vmlld0NhcGFjaXR5ID0gY3JlYXRlR2V0Vmlld0NhcGFjaXR5KHN0YXRlLCBzb3VyY2UsIGl0ZW1IZWlnaHQpO1xuXHRjb25zdCBjYWxjdWxhdGVSYW5nZSA9IGNyZWF0ZUNhbGN1bGF0ZVJhbmdlKFwidmVydGljYWxcIiwgb3ZlcnNjYW4sIGNyZWF0ZUdldE9mZnNldChzb3VyY2UsIGl0ZW1IZWlnaHQpLCBnZXRWaWV3Q2FwYWNpdHksIHJlc291cmNlcyk7XG5cdGNvbnN0IGdldERpc3RhbmNlVG9wID0gY3JlYXRlR2V0RGlzdGFuY2UoaXRlbUhlaWdodCwgc291cmNlKTtcblx0Y29uc3Qgb2Zmc2V0VG9wID0gY29tcHV0ZWQoKCkgPT4gZ2V0RGlzdGFuY2VUb3Aoc3RhdGUudmFsdWUuc3RhcnQpKTtcblx0Y29uc3QgdG90YWxIZWlnaHQgPSBjcmVhdGVDb21wdXRlZFRvdGFsU2l6ZShpdGVtSGVpZ2h0LCBzb3VyY2UpO1xuXHR1c2VXYXRjaEZvclNpemVzKHNpemUsIGxpc3QsIGNvbnRhaW5lclJlZiwgY2FsY3VsYXRlUmFuZ2UpO1xuXHRyZXR1cm4ge1xuXHRcdGNhbGN1bGF0ZVJhbmdlLFxuXHRcdHNjcm9sbFRvOiBjcmVhdGVTY3JvbGxUbyhcInZlcnRpY2FsXCIsIGNhbGN1bGF0ZVJhbmdlLCBnZXREaXN0YW5jZVRvcCwgY29udGFpbmVyUmVmKSxcblx0XHRjb250YWluZXJTdHlsZSxcblx0XHR3cmFwcGVyUHJvcHM6IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdHJldHVybiB7IHN0eWxlOiB7XG5cdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0aGVpZ2h0OiBgJHt0b3RhbEhlaWdodC52YWx1ZSAtIG9mZnNldFRvcC52YWx1ZX1weGAsXG5cdFx0XHRcdG1hcmdpblRvcDogYCR7b2Zmc2V0VG9wLnZhbHVlfXB4YFxuXHRcdFx0fSB9O1xuXHRcdH0pLFxuXHRcdGN1cnJlbnRMaXN0LFxuXHRcdGNvbnRhaW5lclJlZlxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXYWtlTG9jay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFNjcmVlbiBXYWtlIExvY2sgQVBJLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXYWtlTG9ja1xuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVdha2VMb2NrKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yLCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCB9ID0gb3B0aW9ucztcblx0Y29uc3QgcmVxdWVzdGVkVHlwZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzZW50aW5lbCA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGRvY3VtZW50VmlzaWJpbGl0eSA9IHVzZURvY3VtZW50VmlzaWJpbGl0eSh7IGRvY3VtZW50OiBkb2N1bWVudCQxIH0pO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJ3YWtlTG9ja1wiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgaXNBY3RpdmUgPSBjb21wdXRlZCgoKSA9PiAhIXNlbnRpbmVsLnZhbHVlICYmIGRvY3VtZW50VmlzaWJpbGl0eS52YWx1ZSA9PT0gXCJ2aXNpYmxlXCIpO1xuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcblx0XHR1c2VFdmVudExpc3RlbmVyKHNlbnRpbmVsLCBcInJlbGVhc2VcIiwgKCkgPT4ge1xuXHRcdFx0dmFyIF9zZW50aW5lbCR2YWx1ZSR0eXBlLCBfc2VudGluZWwkdmFsdWU7XG5cdFx0XHRyZXF1ZXN0ZWRUeXBlLnZhbHVlID0gKF9zZW50aW5lbCR2YWx1ZSR0eXBlID0gKF9zZW50aW5lbCR2YWx1ZSA9IHNlbnRpbmVsLnZhbHVlKSA9PT0gbnVsbCB8fCBfc2VudGluZWwkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZW50aW5lbCR2YWx1ZS50eXBlKSAhPT0gbnVsbCAmJiBfc2VudGluZWwkdmFsdWUkdHlwZSAhPT0gdm9pZCAwID8gX3NlbnRpbmVsJHZhbHVlJHR5cGUgOiBmYWxzZTtcblx0XHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0d2hlbmV2ZXIoKCkgPT4gZG9jdW1lbnRWaXNpYmlsaXR5LnZhbHVlID09PSBcInZpc2libGVcIiAmJiAoZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLnZpc2liaWxpdHlTdGF0ZSkgPT09IFwidmlzaWJsZVwiICYmIHJlcXVlc3RlZFR5cGUudmFsdWUsICh0eXBlKSA9PiB7XG5cdFx0XHRyZXF1ZXN0ZWRUeXBlLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRmb3JjZVJlcXVlc3QodHlwZSk7XG5cdFx0fSk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gZm9yY2VSZXF1ZXN0KHR5cGUpIHtcblx0XHR2YXIgX3NlbnRpbmVsJHZhbHVlMjtcblx0XHRhd2FpdCAoKF9zZW50aW5lbCR2YWx1ZTIgPSBzZW50aW5lbC52YWx1ZSkgPT09IG51bGwgfHwgX3NlbnRpbmVsJHZhbHVlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbnRpbmVsJHZhbHVlMi5yZWxlYXNlKCkpO1xuXHRcdHNlbnRpbmVsLnZhbHVlID0gaXNTdXBwb3J0ZWQudmFsdWUgPyBhd2FpdCBuYXZpZ2F0b3IkMS53YWtlTG9jay5yZXF1ZXN0KHR5cGUpIDogbnVsbDtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZXF1ZXN0KHR5cGUpIHtcblx0XHRpZiAoZG9jdW1lbnRWaXNpYmlsaXR5LnZhbHVlID09PSBcInZpc2libGVcIikgYXdhaXQgZm9yY2VSZXF1ZXN0KHR5cGUpO1xuXHRcdGVsc2UgcmVxdWVzdGVkVHlwZS52YWx1ZSA9IHR5cGU7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gcmVsZWFzZSgpIHtcblx0XHRyZXF1ZXN0ZWRUeXBlLnZhbHVlID0gZmFsc2U7XG5cdFx0Y29uc3QgcyA9IHNlbnRpbmVsLnZhbHVlO1xuXHRcdHNlbnRpbmVsLnZhbHVlID0gbnVsbDtcblx0XHRhd2FpdCAocyA9PT0gbnVsbCB8fCBzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzLnJlbGVhc2UoKSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZW50aW5lbCxcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRpc0FjdGl2ZSxcblx0XHRyZXF1ZXN0LFxuXHRcdGZvcmNlUmVxdWVzdCxcblx0XHRyZWxlYXNlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdlYk5vdGlmaWNhdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHVzZVdlYk5vdGlmaWNhdGlvblxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXZWJOb3RpZmljYXRpb25cbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvbm90aWZpY2F0aW9uXG4qL1xuZnVuY3Rpb24gdXNlV2ViTm90aWZpY2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCByZXF1ZXN0UGVybWlzc2lvbnM6IF9yZXF1ZXN0Rm9yUGVybWlzc2lvbnMgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBkZWZhdWx0V2ViTm90aWZpY2F0aW9uT3B0aW9ucyA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB7XG5cdFx0aWYgKCF3aW5kb3ckMSB8fCAhKFwiTm90aWZpY2F0aW9uXCIgaW4gd2luZG93JDEpKSByZXR1cm4gZmFsc2U7XG5cdFx0aWYgKE5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uID09PSBcImdyYW50ZWRcIikgcmV0dXJuIHRydWU7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG5vdGlmaWNhdGlvbiQxID0gbmV3IE5vdGlmaWNhdGlvbihcIlwiKTtcblx0XHRcdG5vdGlmaWNhdGlvbiQxLm9uc2hvdyA9ICgpID0+IHtcblx0XHRcdFx0bm90aWZpY2F0aW9uJDEuY2xvc2UoKTtcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKGUubmFtZSA9PT0gXCJUeXBlRXJyb3JcIikgcmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSk7XG5cdGNvbnN0IHBlcm1pc3Npb25HcmFudGVkID0gc2hhbGxvd1JlZihpc1N1cHBvcnRlZC52YWx1ZSAmJiBcInBlcm1pc3Npb25cIiBpbiBOb3RpZmljYXRpb24gJiYgTm90aWZpY2F0aW9uLnBlcm1pc3Npb24gPT09IFwiZ3JhbnRlZFwiKTtcblx0Y29uc3Qgbm90aWZpY2F0aW9uID0gcmVmKG51bGwpO1xuXHRjb25zdCBlbnN1cmVQZXJtaXNzaW9ucyA9IGFzeW5jICgpID0+IHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKCFwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSAmJiBOb3RpZmljYXRpb24ucGVybWlzc2lvbiAhPT0gXCJkZW5pZWRcIikge1xuXHRcdFx0aWYgKGF3YWl0IE5vdGlmaWNhdGlvbi5yZXF1ZXN0UGVybWlzc2lvbigpID09PSBcImdyYW50ZWRcIikgcGVybWlzc2lvbkdyYW50ZWQudmFsdWUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gcGVybWlzc2lvbkdyYW50ZWQudmFsdWU7XG5cdH07XG5cdGNvbnN0IHsgb246IG9uQ2xpY2ssIHRyaWdnZXI6IGNsaWNrVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHsgb246IG9uU2hvdywgdHJpZ2dlcjogc2hvd1RyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCB7IG9uOiBvbkVycm9yLCB0cmlnZ2VyOiBlcnJvclRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCB7IG9uOiBvbkNsb3NlLCB0cmlnZ2VyOiBjbG9zZVRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBzaG93ID0gYXN5bmMgKG92ZXJyaWRlcykgPT4ge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUgfHwgIXBlcm1pc3Npb25HcmFudGVkLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3Qgb3B0aW9ucyQxID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFdlYk5vdGlmaWNhdGlvbk9wdGlvbnMsIG92ZXJyaWRlcyk7XG5cdFx0bm90aWZpY2F0aW9uLnZhbHVlID0gbmV3IE5vdGlmaWNhdGlvbihvcHRpb25zJDEudGl0bGUgfHwgXCJcIiwgb3B0aW9ucyQxKTtcblx0XHRub3RpZmljYXRpb24udmFsdWUub25jbGljayA9IGNsaWNrVHJpZ2dlcjtcblx0XHRub3RpZmljYXRpb24udmFsdWUub25zaG93ID0gc2hvd1RyaWdnZXI7XG5cdFx0bm90aWZpY2F0aW9uLnZhbHVlLm9uZXJyb3IgPSBlcnJvclRyaWdnZXI7XG5cdFx0bm90aWZpY2F0aW9uLnZhbHVlLm9uY2xvc2UgPSBjbG9zZVRyaWdnZXI7XG5cdFx0cmV0dXJuIG5vdGlmaWNhdGlvbi52YWx1ZTtcblx0fTtcblx0Y29uc3QgY2xvc2UgPSAoKSA9PiB7XG5cdFx0aWYgKG5vdGlmaWNhdGlvbi52YWx1ZSkgbm90aWZpY2F0aW9uLnZhbHVlLmNsb3NlKCk7XG5cdFx0bm90aWZpY2F0aW9uLnZhbHVlID0gbnVsbDtcblx0fTtcblx0aWYgKF9yZXF1ZXN0Rm9yUGVybWlzc2lvbnMpIHRyeU9uTW91bnRlZChlbnN1cmVQZXJtaXNzaW9ucyk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKGNsb3NlKTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHdpbmRvdyQxKSB7XG5cdFx0Y29uc3QgZG9jdW1lbnQkMSA9IHdpbmRvdyQxLmRvY3VtZW50O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIChlKSA9PiB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRpZiAoZG9jdW1lbnQkMS52aXNpYmlsaXR5U3RhdGUgPT09IFwidmlzaWJsZVwiKSBjbG9zZSgpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0bm90aWZpY2F0aW9uLFxuXHRcdGVuc3VyZVBlcm1pc3Npb25zLFxuXHRcdHBlcm1pc3Npb25HcmFudGVkLFxuXHRcdHNob3csXG5cdFx0Y2xvc2UsXG5cdFx0b25DbGljayxcblx0XHRvblNob3csXG5cdFx0b25FcnJvcixcblx0XHRvbkNsb3NlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdlYlNvY2tldC9pbmRleC50c1xuY29uc3QgREVGQVVMVF9QSU5HX01FU1NBR0UgPSBcInBpbmdcIjtcbmZ1bmN0aW9uIHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMpIHtcblx0aWYgKG9wdGlvbnMgPT09IHRydWUpIHJldHVybiB7fTtcblx0cmV0dXJuIG9wdGlvbnM7XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyKG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IDFlMyB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCBpbnRlcnZhbCwgeyBpbW1lZGlhdGU6IGZhbHNlIH0pO1xuXHR9XG5cdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIDFlMywgeyBpbW1lZGlhdGU6IGZhbHNlIH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIFdlYlNvY2tldCBjbGllbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdlYlNvY2tldFxuKiBAcGFyYW0gdXJsXG4qL1xuZnVuY3Rpb24gdXNlV2ViU29ja2V0KHVybCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgb25Db25uZWN0ZWQsIG9uRGlzY29ubmVjdGVkLCBvbkVycm9yLCBvbk1lc3NhZ2UsIGltbWVkaWF0ZSA9IHRydWUsIGF1dG9Db25uZWN0ID0gdHJ1ZSwgYXV0b0Nsb3NlID0gdHJ1ZSwgcHJvdG9jb2xzID0gW10gfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRhdGEgPSByZWYobnVsbCk7XG5cdGNvbnN0IHN0YXR1cyA9IHNoYWxsb3dSZWYoXCJDTE9TRURcIik7XG5cdGNvbnN0IHdzUmVmID0gcmVmKCk7XG5cdGNvbnN0IHVybFJlZiA9IHRvUmVmKHVybCk7XG5cdGxldCBoZWFydGJlYXRQYXVzZTtcblx0bGV0IGhlYXJ0YmVhdFJlc3VtZTtcblx0bGV0IGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcblx0bGV0IHJldHJpZWQgPSAwO1xuXHRsZXQgYnVmZmVyZWREYXRhID0gW107XG5cdGxldCByZXRyeVRpbWVvdXQ7XG5cdGxldCBwb25nVGltZW91dFdhaXQ7XG5cdGNvbnN0IF9zZW5kQnVmZmVyID0gKCkgPT4ge1xuXHRcdGlmIChidWZmZXJlZERhdGEubGVuZ3RoICYmIHdzUmVmLnZhbHVlICYmIHN0YXR1cy52YWx1ZSA9PT0gXCJPUEVOXCIpIHtcblx0XHRcdGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcmVkRGF0YSkgd3NSZWYudmFsdWUuc2VuZChidWZmZXIpO1xuXHRcdFx0YnVmZmVyZWREYXRhID0gW107XG5cdFx0fVxuXHR9O1xuXHRjb25zdCByZXNldFJldHJ5ID0gKCkgPT4ge1xuXHRcdGlmIChyZXRyeVRpbWVvdXQgIT0gbnVsbCkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHJldHJ5VGltZW91dCk7XG5cdFx0XHRyZXRyeVRpbWVvdXQgPSB2b2lkIDA7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCByZXNldEhlYXJ0YmVhdCA9ICgpID0+IHtcblx0XHRjbGVhclRpbWVvdXQocG9uZ1RpbWVvdXRXYWl0KTtcblx0XHRwb25nVGltZW91dFdhaXQgPSB2b2lkIDA7XG5cdH07XG5cdGNvbnN0IGNsb3NlID0gKGNvZGUgPSAxZTMsIHJlYXNvbikgPT4ge1xuXHRcdHJlc2V0UmV0cnkoKTtcblx0XHRpZiAoIWlzQ2xpZW50ICYmICFpc1dvcmtlciB8fCAhd3NSZWYudmFsdWUpIHJldHVybjtcblx0XHRleHBsaWNpdGx5Q2xvc2VkID0gdHJ1ZTtcblx0XHRyZXNldEhlYXJ0YmVhdCgpO1xuXHRcdGhlYXJ0YmVhdFBhdXNlID09PSBudWxsIHx8IGhlYXJ0YmVhdFBhdXNlID09PSB2b2lkIDAgfHwgaGVhcnRiZWF0UGF1c2UoKTtcblx0XHR3c1JlZi52YWx1ZS5jbG9zZShjb2RlLCByZWFzb24pO1xuXHRcdHdzUmVmLnZhbHVlID0gdm9pZCAwO1xuXHR9O1xuXHRjb25zdCBzZW5kID0gKGRhdGEkMSwgdXNlQnVmZmVyID0gdHJ1ZSkgPT4ge1xuXHRcdGlmICghd3NSZWYudmFsdWUgfHwgc3RhdHVzLnZhbHVlICE9PSBcIk9QRU5cIikge1xuXHRcdFx0aWYgKHVzZUJ1ZmZlcikgYnVmZmVyZWREYXRhLnB1c2goZGF0YSQxKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0X3NlbmRCdWZmZXIoKTtcblx0XHR3c1JlZi52YWx1ZS5zZW5kKGRhdGEkMSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cdGNvbnN0IF9pbml0ID0gKCkgPT4ge1xuXHRcdGlmIChleHBsaWNpdGx5Q2xvc2VkIHx8IHR5cGVvZiB1cmxSZWYudmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblx0XHRjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodXJsUmVmLnZhbHVlLCBwcm90b2NvbHMpO1xuXHRcdHdzUmVmLnZhbHVlID0gd3M7XG5cdFx0c3RhdHVzLnZhbHVlID0gXCJDT05ORUNUSU5HXCI7XG5cdFx0d3Mub25vcGVuID0gKCkgPT4ge1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJPUEVOXCI7XG5cdFx0XHRyZXRyaWVkID0gMDtcblx0XHRcdG9uQ29ubmVjdGVkID09PSBudWxsIHx8IG9uQ29ubmVjdGVkID09PSB2b2lkIDAgfHwgb25Db25uZWN0ZWQod3MpO1xuXHRcdFx0aGVhcnRiZWF0UmVzdW1lID09PSBudWxsIHx8IGhlYXJ0YmVhdFJlc3VtZSA9PT0gdm9pZCAwIHx8IGhlYXJ0YmVhdFJlc3VtZSgpO1xuXHRcdFx0X3NlbmRCdWZmZXIoKTtcblx0XHR9O1xuXHRcdHdzLm9uY2xvc2UgPSAoZXYpID0+IHtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwiQ0xPU0VEXCI7XG5cdFx0XHRyZXNldEhlYXJ0YmVhdCgpO1xuXHRcdFx0aGVhcnRiZWF0UGF1c2UgPT09IG51bGwgfHwgaGVhcnRiZWF0UGF1c2UgPT09IHZvaWQgMCB8fCBoZWFydGJlYXRQYXVzZSgpO1xuXHRcdFx0b25EaXNjb25uZWN0ZWQgPT09IG51bGwgfHwgb25EaXNjb25uZWN0ZWQgPT09IHZvaWQgMCB8fCBvbkRpc2Nvbm5lY3RlZCh3cywgZXYpO1xuXHRcdFx0aWYgKCFleHBsaWNpdGx5Q2xvc2VkICYmIG9wdGlvbnMuYXV0b1JlY29ubmVjdCAmJiAod3NSZWYudmFsdWUgPT0gbnVsbCB8fCB3cyA9PT0gd3NSZWYudmFsdWUpKSB7XG5cdFx0XHRcdGNvbnN0IHsgcmV0cmllcyA9IC0xLCBkZWxheSA9IDFlMywgb25GYWlsZWQgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMuYXV0b1JlY29ubmVjdCk7XG5cdFx0XHRcdGlmICgodHlwZW9mIHJldHJpZXMgPT09IFwiZnVuY3Rpb25cIiA/IHJldHJpZXMgOiAoKSA9PiB0eXBlb2YgcmV0cmllcyA9PT0gXCJudW1iZXJcIiAmJiAocmV0cmllcyA8IDAgfHwgcmV0cmllZCA8IHJldHJpZXMpKShyZXRyaWVkKSkge1xuXHRcdFx0XHRcdHJldHJpZWQgKz0gMTtcblx0XHRcdFx0XHRjb25zdCBkZWxheVRpbWUgPSB0eXBlb2YgZGVsYXkgPT09IFwiZnVuY3Rpb25cIiA/IGRlbGF5KHJldHJpZWQpIDogZGVsYXk7XG5cdFx0XHRcdFx0cmV0cnlUaW1lb3V0ID0gc2V0VGltZW91dChfaW5pdCwgZGVsYXlUaW1lKTtcblx0XHRcdFx0fSBlbHNlIG9uRmFpbGVkID09PSBudWxsIHx8IG9uRmFpbGVkID09PSB2b2lkIDAgfHwgb25GYWlsZWQoKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHdzLm9uZXJyb3IgPSAoZSkgPT4ge1xuXHRcdFx0b25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgfHwgb25FcnJvcih3cywgZSk7XG5cdFx0fTtcblx0XHR3cy5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuXHRcdFx0aWYgKG9wdGlvbnMuaGVhcnRiZWF0KSB7XG5cdFx0XHRcdHJlc2V0SGVhcnRiZWF0KCk7XG5cdFx0XHRcdGNvbnN0IHsgbWVzc2FnZSA9IERFRkFVTFRfUElOR19NRVNTQUdFLCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlIH0gPSByZXNvbHZlTmVzdGVkT3B0aW9ucyhvcHRpb25zLmhlYXJ0YmVhdCk7XG5cdFx0XHRcdGlmIChlLmRhdGEgPT09IHRvVmFsdWUocmVzcG9uc2VNZXNzYWdlKSkgcmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZGF0YS52YWx1ZSA9IGUuZGF0YTtcblx0XHRcdG9uTWVzc2FnZSA9PT0gbnVsbCB8fCBvbk1lc3NhZ2UgPT09IHZvaWQgMCB8fCBvbk1lc3NhZ2Uod3MsIGUpO1xuXHRcdH07XG5cdH07XG5cdGlmIChvcHRpb25zLmhlYXJ0YmVhdCkge1xuXHRcdGNvbnN0IHsgbWVzc2FnZSA9IERFRkFVTFRfUElOR19NRVNTQUdFLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyKHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMuaGVhcnRiZWF0KSksIHBvbmdUaW1lb3V0ID0gMWUzIH0gPSByZXNvbHZlTmVzdGVkT3B0aW9ucyhvcHRpb25zLmhlYXJ0YmVhdCk7XG5cdFx0Y29uc3QgeyBwYXVzZSwgcmVzdW1lIH0gPSBzY2hlZHVsZXIoKCkgPT4ge1xuXHRcdFx0c2VuZCh0b1ZhbHVlKG1lc3NhZ2UpLCBmYWxzZSk7XG5cdFx0XHRpZiAocG9uZ1RpbWVvdXRXYWl0ICE9IG51bGwpIHJldHVybjtcblx0XHRcdHBvbmdUaW1lb3V0V2FpdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRjbG9zZSgpO1xuXHRcdFx0XHRleHBsaWNpdGx5Q2xvc2VkID0gZmFsc2U7XG5cdFx0XHR9LCBwb25nVGltZW91dCk7XG5cdFx0fSk7XG5cdFx0aGVhcnRiZWF0UGF1c2UgPSBwYXVzZTtcblx0XHRoZWFydGJlYXRSZXN1bWUgPSByZXN1bWU7XG5cdH1cblx0aWYgKGF1dG9DbG9zZSkge1xuXHRcdGlmIChpc0NsaWVudCkgdXNlRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCAoKSA9PiBjbG9zZSgpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0dHJ5T25TY29wZURpc3Bvc2UoY2xvc2UpO1xuXHR9XG5cdGNvbnN0IG9wZW4gPSAoKSA9PiB7XG5cdFx0aWYgKCFpc0NsaWVudCAmJiAhaXNXb3JrZXIpIHJldHVybjtcblx0XHRjbG9zZSgpO1xuXHRcdGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcblx0XHRyZXRyaWVkID0gMDtcblx0XHRfaW5pdCgpO1xuXHR9O1xuXHRpZiAoaW1tZWRpYXRlKSBvcGVuKCk7XG5cdGlmIChhdXRvQ29ubmVjdCkgd2F0Y2godXJsUmVmLCBvcGVuKTtcblx0cmV0dXJuIHtcblx0XHRkYXRhLFxuXHRcdHN0YXR1cyxcblx0XHRjbG9zZSxcblx0XHRzZW5kLFxuXHRcdG9wZW4sXG5cdFx0d3M6IHdzUmVmXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdlYldvcmtlci9pbmRleC50c1xuZnVuY3Rpb24gdXNlV2ViV29ya2VyKGFyZzAsIHdvcmtlck9wdGlvbnMsIG9wdGlvbnMpIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG5cdGNvbnN0IGRhdGEgPSByZWYobnVsbCk7XG5cdGNvbnN0IHdvcmtlciA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgcG9zdCA9ICguLi5hcmdzKSA9PiB7XG5cdFx0aWYgKCF3b3JrZXIudmFsdWUpIHJldHVybjtcblx0XHR3b3JrZXIudmFsdWUucG9zdE1lc3NhZ2UoLi4uYXJncyk7XG5cdH07XG5cdGNvbnN0IHRlcm1pbmF0ZSA9IGZ1bmN0aW9uIHRlcm1pbmF0ZSQxKCkge1xuXHRcdGlmICghd29ya2VyLnZhbHVlKSByZXR1cm47XG5cdFx0d29ya2VyLnZhbHVlLnRlcm1pbmF0ZSgpO1xuXHR9O1xuXHRpZiAod2luZG93JDEpIHtcblx0XHRpZiAodHlwZW9mIGFyZzAgPT09IFwic3RyaW5nXCIpIHdvcmtlci52YWx1ZSA9IG5ldyBXb3JrZXIoYXJnMCwgd29ya2VyT3B0aW9ucyk7XG5cdFx0ZWxzZSBpZiAodHlwZW9mIGFyZzAgPT09IFwiZnVuY3Rpb25cIikgd29ya2VyLnZhbHVlID0gYXJnMCgpO1xuXHRcdGVsc2Ugd29ya2VyLnZhbHVlID0gYXJnMDtcblx0XHR3b3JrZXIudmFsdWUub25tZXNzYWdlID0gKGUpID0+IHtcblx0XHRcdGRhdGEudmFsdWUgPSBlLmRhdGE7XG5cdFx0fTtcblx0XHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0XHRpZiAod29ya2VyLnZhbHVlKSB3b3JrZXIudmFsdWUudGVybWluYXRlKCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRkYXRhLFxuXHRcdHBvc3QsXG5cdFx0dGVybWluYXRlLFxuXHRcdHdvcmtlclxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9saWIvZGVwc1BhcnNlci50c1xuLyoqXG4qXG4qIENvbmNhdGVuYXRlcyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nLlxuKiB0aGlzIHN0cmluZyB3aWxsIHRoZW4gYmUgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBcImltcG9ydFNjcmlwdHNcIiBmdW5jdGlvblxuKlxuKiBAcGFyYW0gZGVwcyBhcnJheSBvZiBzdHJpbmdcbiogQHBhcmFtIGxvY2FsRGVwcyBhcnJheSBvZiBmdW5jdGlvblxuKiBAcmV0dXJucyBhIHN0cmluZyBjb21wb3NlZCBieSB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgYXJyYXlcbiogZWxlbWVudHMgXCJkZXBzXCIgYW5kIFwiaW1wb3J0U2NyaXB0c1wiLlxuKlxuKiBAZXhhbXBsZVxuKiBkZXBzUGFyc2VyKFsnZGVtbzEnLCAnZGVtbzInXSkgLy8gcmV0dXJuIGltcG9ydFNjcmlwdHMoJ2RlbW8xJywgJ2RlbW8yJylcbiovXG5mdW5jdGlvbiBkZXBzUGFyc2VyKGRlcHMsIGxvY2FsRGVwcykge1xuXHRpZiAoZGVwcy5sZW5ndGggPT09IDAgJiYgbG9jYWxEZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cdGNvbnN0IGRlcHNTdHJpbmcgPSBkZXBzLm1hcCgoZGVwKSA9PiBgJyR7ZGVwfSdgKS50b1N0cmluZygpO1xuXHRjb25zdCBkZXBzRnVuY3Rpb25TdHJpbmcgPSBsb2NhbERlcHMuZmlsdGVyKChkZXApID0+IHR5cGVvZiBkZXAgPT09IFwiZnVuY3Rpb25cIikubWFwKChmbikgPT4ge1xuXHRcdGNvbnN0IHN0ciA9IGZuLnRvU3RyaW5nKCk7XG5cdFx0aWYgKHN0ci50cmltKCkuc3RhcnRzV2l0aChcImZ1bmN0aW9uXCIpKSByZXR1cm4gc3RyO1xuXHRcdGVsc2UgcmV0dXJuIGBjb25zdCAke2ZuLm5hbWV9ID0gJHtzdHJ9YDtcblx0fSkuam9pbihcIjtcIik7XG5cdGNvbnN0IGltcG9ydFN0cmluZyA9IGBpbXBvcnRTY3JpcHRzKCR7ZGVwc1N0cmluZ30pO2A7XG5cdHJldHVybiBgJHtkZXBzU3RyaW5nLnRyaW0oKSA9PT0gXCJcIiA/IFwiXCIgOiBpbXBvcnRTdHJpbmd9ICR7ZGVwc0Z1bmN0aW9uU3RyaW5nfWA7XG59XG52YXIgZGVwc1BhcnNlcl9kZWZhdWx0ID0gZGVwc1BhcnNlcjtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViV29ya2VyRm4vbGliL2pvYlJ1bm5lci50c1xuLyoqXG4qIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhcyBhIHBhcmFtZXRlciBhIGZ1bmN0aW9uIFwidXNlckZ1bmNcIlxuKiBBbmQgYXMgYSByZXN1bHQgcmV0dXJucyBhbiBhbm9ueW1vdXMgZnVuY3Rpb24uXG4qIFRoaXMgYW5vbnltb3VzIGZ1bmN0aW9uLCBhY2NlcHRzIGFzIGFyZ3VtZW50cyxcbiogdGhlIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gXCJ1c2VBcmdzXCIgYW5kIHJldHVybnMgYSBQcm9taXNlXG4qIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYXMgYSB3cmFwcGVyLCBvbmx5IGluc2lkZSBhIFdvcmtlclxuKiBiZWNhdXNlIGl0IGRlcGVuZHMgYnkgXCJwb3N0TWVzc2FnZVwiLlxuKlxuKiBAcGFyYW0gdXNlckZ1bmMge0Z1bmN0aW9ufSBmbiB0aGUgZnVuY3Rpb24gdG8gcnVuIHdpdGggd2ViIHdvcmtlclxuKlxuKiBAcmV0dXJucyByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSBwYXJhbWV0ZXJzXG4qIHRvIGJlIHBhc3NlZCB0byB0aGUgXCJ1c2VyRnVuY1wiIGZ1bmN0aW9uXG4qL1xuZnVuY3Rpb24gam9iUnVubmVyKHVzZXJGdW5jKSB7XG5cdHJldHVybiAoZSkgPT4ge1xuXHRcdGNvbnN0IHVzZXJGdW5jQXJncyA9IGUuZGF0YVswXTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXJGdW5jLmFwcGx5KHZvaWQgMCwgdXNlckZ1bmNBcmdzKSkudGhlbigocmVzdWx0KSA9PiB7XG5cdFx0XHRwb3N0TWVzc2FnZShbXCJTVUNDRVNTXCIsIHJlc3VsdF0pO1xuXHRcdH0pLmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0cG9zdE1lc3NhZ2UoW1wiRVJST1JcIiwgZXJyb3JdKTtcblx0XHR9KTtcblx0fTtcbn1cbnZhciBqb2JSdW5uZXJfZGVmYXVsdCA9IGpvYlJ1bm5lcjtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViV29ya2VyRm4vbGliL2NyZWF0ZVdvcmtlckJsb2JVcmwudHNcbi8qKlxuKiBDb252ZXJ0cyB0aGUgXCJmblwiIGZ1bmN0aW9uIGludG8gdGhlIHN5bnRheCBuZWVkZWQgdG8gYmUgZXhlY3V0ZWQgd2l0aGluIGEgd2ViIHdvcmtlclxuKlxuKiBAcGFyYW0gZm4gdGhlIGZ1bmN0aW9uIHRvIHJ1biB3aXRoIHdlYiB3b3JrZXJcbiogQHBhcmFtIGRlcHMgYXJyYXkgb2Ygc3RyaW5ncywgaW1wb3J0ZWQgaW50byB0aGUgd29ya2VyIHRocm91Z2ggXCJpbXBvcnRTY3JpcHRzXCJcbiogQHBhcmFtIGxvY2FsRGVwcyBhcnJheSBvZiBmdW5jdGlvbiwgbG9jYWwgZGVwZW5kZW5jaWVzXG4qXG4qIEByZXR1cm5zIGEgYmxvYiB1cmwsIGNvbnRhaW5pbmcgdGhlIGNvZGUgb2YgXCJmblwiIGFzIGEgc3RyaW5nXG4qXG4qIEBleGFtcGxlXG4qIGNyZWF0ZVdvcmtlckJsb2JVcmwoKGEsYikgPT4gYStiLCBbXSlcbiogLy8gcmV0dXJuIFwib25tZXNzYWdlPXJldHVybiBQcm9taXNlLnJlc29sdmUoKGEsYikgPT4gYSArIGIpXG4qIC50aGVuKHBvc3RNZXNzYWdlKFsnU1VDQ0VTUycsIHJlc3VsdF0pKVxuKiAuY2F0Y2gocG9zdE1lc3NhZ2UoWydFUlJPUicsIGVycm9yXSlcIlxuKi9cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtlckJsb2JVcmwoZm4sIGRlcHMsIGxvY2FsRGVwcykge1xuXHRjb25zdCBibG9iQ29kZSA9IGAke2RlcHNQYXJzZXJfZGVmYXVsdChkZXBzLCBsb2NhbERlcHMpfTsgb25tZXNzYWdlPSgke2pvYlJ1bm5lcl9kZWZhdWx0fSkoJHtmbn0pYDtcblx0Y29uc3QgYmxvYiA9IG5ldyBCbG9iKFtibG9iQ29kZV0sIHsgdHlwZTogXCJ0ZXh0L2phdmFzY3JpcHRcIiB9KTtcblx0cmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG59XG52YXIgY3JlYXRlV29ya2VyQmxvYlVybF9kZWZhdWx0ID0gY3JlYXRlV29ya2VyQmxvYlVybDtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViV29ya2VyRm4vaW5kZXgudHNcbi8qKlxuKiBSdW4gZXhwZW5zaXZlIGZ1bmN0aW9uIHdpdGhvdXQgYmxvY2tpbmcgdGhlIFVJLCB1c2luZyBhIHNpbXBsZSBzeW50YXggdGhhdCBtYWtlcyB1c2Ugb2YgUHJvbWlzZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlV2ViV29ya2VyRm5cbiogQHBhcmFtIGZuXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlV2ViV29ya2VyRm4oZm4sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRlcGVuZGVuY2llcyA9IFtdLCBsb2NhbERlcGVuZGVuY2llcyA9IFtdLCB0aW1lb3V0LCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3Qgd29ya2VyID0gcmVmKCk7XG5cdGNvbnN0IHdvcmtlclN0YXR1cyA9IHNoYWxsb3dSZWYoXCJQRU5ESU5HXCIpO1xuXHRjb25zdCBwcm9taXNlID0gcmVmKHt9KTtcblx0Y29uc3QgdGltZW91dElkID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCB3b3JrZXJUZXJtaW5hdGUgPSAoc3RhdHVzID0gXCJQRU5ESU5HXCIpID0+IHtcblx0XHRpZiAod29ya2VyLnZhbHVlICYmIHdvcmtlci52YWx1ZS5fdXJsICYmIHdpbmRvdyQxKSB7XG5cdFx0XHR3b3JrZXIudmFsdWUudGVybWluYXRlKCk7XG5cdFx0XHRVUkwucmV2b2tlT2JqZWN0VVJMKHdvcmtlci52YWx1ZS5fdXJsKTtcblx0XHRcdHByb21pc2UudmFsdWUgPSB7fTtcblx0XHRcdHdvcmtlci52YWx1ZSA9IHZvaWQgMDtcblx0XHRcdHdpbmRvdyQxLmNsZWFyVGltZW91dCh0aW1lb3V0SWQudmFsdWUpO1xuXHRcdFx0d29ya2VyU3RhdHVzLnZhbHVlID0gc3RhdHVzO1xuXHRcdH1cblx0fTtcblx0d29ya2VyVGVybWluYXRlKCk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHdvcmtlclRlcm1pbmF0ZSk7XG5cdGNvbnN0IGdlbmVyYXRlV29ya2VyID0gKCkgPT4ge1xuXHRcdGNvbnN0IGJsb2JVcmwgPSBjcmVhdGVXb3JrZXJCbG9iVXJsX2RlZmF1bHQoZm4sIGRlcGVuZGVuY2llcywgbG9jYWxEZXBlbmRlbmNpZXMpO1xuXHRcdGNvbnN0IG5ld1dvcmtlciA9IG5ldyBXb3JrZXIoYmxvYlVybCk7XG5cdFx0bmV3V29ya2VyLl91cmwgPSBibG9iVXJsO1xuXHRcdG5ld1dvcmtlci5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuXHRcdFx0Y29uc3QgeyByZXNvbHZlID0gKCkgPT4ge30sIHJlamVjdCA9ICgpID0+IHt9IH0gPSBwcm9taXNlLnZhbHVlO1xuXHRcdFx0Y29uc3QgW3N0YXR1cywgcmVzdWx0XSA9IGUuZGF0YTtcblx0XHRcdHN3aXRjaCAoc3RhdHVzKSB7XG5cdFx0XHRcdGNhc2UgXCJTVUNDRVNTXCI6XG5cdFx0XHRcdFx0cmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0XHRcdHdvcmtlclRlcm1pbmF0ZShzdGF0dXMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHJlamVjdChyZXN1bHQpO1xuXHRcdFx0XHRcdHdvcmtlclRlcm1pbmF0ZShcIkVSUk9SXCIpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0bmV3V29ya2VyLm9uZXJyb3IgPSAoZSkgPT4ge1xuXHRcdFx0Y29uc3QgeyByZWplY3QgPSAoKSA9PiB7fSB9ID0gcHJvbWlzZS52YWx1ZTtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdHJlamVjdChlKTtcblx0XHRcdHdvcmtlclRlcm1pbmF0ZShcIkVSUk9SXCIpO1xuXHRcdH07XG5cdFx0aWYgKHRpbWVvdXQpIHRpbWVvdXRJZC52YWx1ZSA9IHNldFRpbWVvdXQoKCkgPT4gd29ya2VyVGVybWluYXRlKFwiVElNRU9VVF9FWFBJUkVEXCIpLCB0aW1lb3V0KTtcblx0XHRyZXR1cm4gbmV3V29ya2VyO1xuXHR9O1xuXHRjb25zdCBjYWxsV29ya2VyID0gKC4uLmZuQXJncykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdHZhciBfd29ya2VyJHZhbHVlO1xuXHRcdHByb21pc2UudmFsdWUgPSB7XG5cdFx0XHRyZXNvbHZlLFxuXHRcdFx0cmVqZWN0XG5cdFx0fTtcblx0XHQoX3dvcmtlciR2YWx1ZSA9IHdvcmtlci52YWx1ZSkgPT09IG51bGwgfHwgX3dvcmtlciR2YWx1ZSA9PT0gdm9pZCAwIHx8IF93b3JrZXIkdmFsdWUucG9zdE1lc3NhZ2UoW1suLi5mbkFyZ3NdXSk7XG5cdFx0d29ya2VyU3RhdHVzLnZhbHVlID0gXCJSVU5OSU5HXCI7XG5cdH0pO1xuXHRjb25zdCB3b3JrZXJGbiA9ICguLi5mbkFyZ3MpID0+IHtcblx0XHRpZiAod29ya2VyU3RhdHVzLnZhbHVlID09PSBcIlJVTk5JTkdcIikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIlt1c2VXZWJXb3JrZXJGbl0gWW91IGNhbiBvbmx5IHJ1biBvbmUgaW5zdGFuY2Ugb2YgdGhlIHdvcmtlciBhdCBhIHRpbWUuXCIpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG5cdFx0fVxuXHRcdHdvcmtlci52YWx1ZSA9IGdlbmVyYXRlV29ya2VyKCk7XG5cdFx0cmV0dXJuIGNhbGxXb3JrZXIoLi4uZm5BcmdzKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHR3b3JrZXJGbixcblx0XHR3b3JrZXJTdGF0dXMsXG5cdFx0d29ya2VyVGVybWluYXRlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdpbmRvd0ZvY3VzL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSB0cmFjayB3aW5kb3cgZm9jdXMgd2l0aCBgd2luZG93Lm9uZm9jdXNgIGFuZCBgd2luZG93Lm9uYmx1cmAuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdpbmRvd0ZvY3VzXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlV2luZG93Rm9jdXMob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGlmICghd2luZG93JDEpIHJldHVybiBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZm9jdXNlZCA9IHNoYWxsb3dSZWYod2luZG93JDEuZG9jdW1lbnQuaGFzRm9jdXMoKSk7XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImJsdXJcIiwgKCkgPT4ge1xuXHRcdGZvY3VzZWQudmFsdWUgPSBmYWxzZTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJmb2N1c1wiLCAoKSA9PiB7XG5cdFx0Zm9jdXNlZC52YWx1ZSA9IHRydWU7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHJldHVybiBmb2N1c2VkO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXaW5kb3dTY3JvbGwvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSB3aW5kb3cgc2Nyb2xsLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXaW5kb3dTY3JvbGxcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VXaW5kb3dTY3JvbGwob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csLi4ucmVzdCB9ID0gb3B0aW9ucztcblx0cmV0dXJuIHVzZVNjcm9sbCh3aW5kb3ckMSwgcmVzdCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdpbmRvd1NpemUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSB3aW5kb3cgc2l6ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlV2luZG93U2l6ZVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVdpbmRvd1NpemUob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGluaXRpYWxXaWR0aCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgaW5pdGlhbEhlaWdodCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgbGlzdGVuT3JpZW50YXRpb24gPSB0cnVlLCBpbmNsdWRlU2Nyb2xsYmFyID0gdHJ1ZSwgdHlwZSA9IFwiaW5uZXJcIiB9ID0gb3B0aW9ucztcblx0Y29uc3Qgd2lkdGggPSBzaGFsbG93UmVmKGluaXRpYWxXaWR0aCk7XG5cdGNvbnN0IGhlaWdodCA9IHNoYWxsb3dSZWYoaW5pdGlhbEhlaWdodCk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcblx0XHRpZiAod2luZG93JDEpIGlmICh0eXBlID09PSBcIm91dGVyXCIpIHtcblx0XHRcdHdpZHRoLnZhbHVlID0gd2luZG93JDEub3V0ZXJXaWR0aDtcblx0XHRcdGhlaWdodC52YWx1ZSA9IHdpbmRvdyQxLm91dGVySGVpZ2h0O1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gXCJ2aXN1YWxcIiAmJiB3aW5kb3ckMS52aXN1YWxWaWV3cG9ydCkge1xuXHRcdFx0Y29uc3QgeyB3aWR0aDogdmlzdWFsVmlld3BvcnRXaWR0aCwgaGVpZ2h0OiB2aXN1YWxWaWV3cG9ydEhlaWdodCwgc2NhbGUgfSA9IHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0O1xuXHRcdFx0d2lkdGgudmFsdWUgPSBNYXRoLnJvdW5kKHZpc3VhbFZpZXdwb3J0V2lkdGggKiBzY2FsZSk7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSBNYXRoLnJvdW5kKHZpc3VhbFZpZXdwb3J0SGVpZ2h0ICogc2NhbGUpO1xuXHRcdH0gZWxzZSBpZiAoaW5jbHVkZVNjcm9sbGJhcikge1xuXHRcdFx0d2lkdGgudmFsdWUgPSB3aW5kb3ckMS5pbm5lcldpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gd2luZG93JDEuaW5uZXJIZWlnaHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpZHRoLnZhbHVlID0gd2luZG93JDEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gd2luZG93JDEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcblx0XHR9XG5cdH07XG5cdHVwZGF0ZSgpO1xuXHR0cnlPbk1vdW50ZWQodXBkYXRlKTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRpZiAod2luZG93JDEgJiYgdHlwZSA9PT0gXCJ2aXN1YWxcIiAmJiB3aW5kb3ckMS52aXN1YWxWaWV3cG9ydCkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMS52aXN1YWxWaWV3cG9ydCwgXCJyZXNpemVcIiwgdXBkYXRlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRpZiAobGlzdGVuT3JpZW50YXRpb24pIHdhdGNoKHVzZU1lZGlhUXVlcnkoXCIob3JpZW50YXRpb246IHBvcnRyYWl0KVwiKSwgKCkgPT4gdXBkYXRlKCkpO1xuXHRyZXR1cm4ge1xuXHRcdHdpZHRoLFxuXHRcdGhlaWdodFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IERlZmF1bHRNYWdpY0tleXNBbGlhc01hcCwgU3RvcmFnZVNlcmlhbGl6ZXJzLCBUcmFuc2l0aW9uUHJlc2V0cywgYXN5bmNDb21wdXRlZCwgYnJlYWtwb2ludHNBbnREZXNpZ24sIGJyZWFrcG9pbnRzQm9vdHN0cmFwVjUsIGJyZWFrcG9pbnRzRWxlbWVudCwgYnJlYWtwb2ludHNNYXN0ZXJDc3MsIGJyZWFrcG9pbnRzUHJpbWVGbGV4LCBicmVha3BvaW50c1F1YXNhciwgYnJlYWtwb2ludHNTZW1hdGljLCBicmVha3BvaW50c1RhaWx3aW5kLCBicmVha3BvaW50c1Z1ZXRpZnksIGJyZWFrcG9pbnRzVnVldGlmeVYyLCBicmVha3BvaW50c1Z1ZXRpZnlWMywgY2xvbmVGbkpTT04sIGNvbXB1dGVkQXN5bmMsIGNvbXB1dGVkSW5qZWN0LCBjcmVhdGVGZXRjaCwgY3JlYXRlUmV1c2FibGVUZW1wbGF0ZSwgY3JlYXRlVGVtcGxhdGVQcm9taXNlLCBjcmVhdGVVbnJlZkZuLCBjdXN0b21TdG9yYWdlRXZlbnROYW1lLCBkZWZhdWx0RG9jdW1lbnQsIGRlZmF1bHRMb2NhdGlvbiwgZGVmYXVsdE5hdmlnYXRvciwgZGVmYXVsdFdpbmRvdywgZXhlY3V0ZVRyYW5zaXRpb24sIGZvcm1hdFRpbWVBZ28sIGZvcm1hdFRpbWVBZ29JbnRsLCBmb3JtYXRUaW1lQWdvSW50bFBhcnRzLCBnZXRTU1JIYW5kbGVyLCBtYXBHYW1lcGFkVG9YYm94MzYwQ29udHJvbGxlciwgb25DbGlja091dHNpZGUsIG9uRWxlbWVudFJlbW92YWwsIG9uS2V5RG93biwgb25LZXlQcmVzc2VkLCBvbktleVN0cm9rZSwgb25LZXlVcCwgb25Mb25nUHJlc3MsIG9uU3RhcnRUeXBpbmcsIHByb3ZpZGVTU1JXaWR0aCwgc2V0U1NSSGFuZGxlciwgdGVtcGxhdGVSZWYsIHRyYW5zaXRpb24sIHVucmVmRWxlbWVudCwgdXNlQWN0aXZlRWxlbWVudCwgdXNlQW5pbWF0ZSwgdXNlQXN5bmNRdWV1ZSwgdXNlQXN5bmNTdGF0ZSwgdXNlQmFzZTY0LCB1c2VCYXR0ZXJ5LCB1c2VCbHVldG9vdGgsIHVzZUJyZWFrcG9pbnRzLCB1c2VCcm9hZGNhc3RDaGFubmVsLCB1c2VCcm93c2VyTG9jYXRpb24sIHVzZUNhY2hlZCwgdXNlQ2xpcGJvYXJkLCB1c2VDbGlwYm9hcmRJdGVtcywgdXNlQ2xvbmVkLCB1c2VDb2xvck1vZGUsIHVzZUNvbmZpcm1EaWFsb2csIHVzZUNvdW50ZG93biwgdXNlQ3NzU3VwcG9ydHMsIHVzZUNzc1ZhciwgdXNlQ3VycmVudEVsZW1lbnQsIHVzZUN5Y2xlTGlzdCwgdXNlRGFyaywgdXNlRGVib3VuY2VkUmVmSGlzdG9yeSwgdXNlRGV2aWNlTW90aW9uLCB1c2VEZXZpY2VPcmllbnRhdGlvbiwgdXNlRGV2aWNlUGl4ZWxSYXRpbywgdXNlRGV2aWNlc0xpc3QsIHVzZURpc3BsYXlNZWRpYSwgdXNlRG9jdW1lbnRWaXNpYmlsaXR5LCB1c2VEcmFnZ2FibGUsIHVzZURyb3Bab25lLCB1c2VFbGVtZW50Qm91bmRpbmcsIHVzZUVsZW1lbnRCeVBvaW50LCB1c2VFbGVtZW50SG92ZXIsIHVzZUVsZW1lbnRTaXplLCB1c2VFbGVtZW50VmlzaWJpbGl0eSwgdXNlRXZlbnRCdXMsIHVzZUV2ZW50TGlzdGVuZXIsIHVzZUV2ZW50U291cmNlLCB1c2VFeWVEcm9wcGVyLCB1c2VGYXZpY29uLCB1c2VGZXRjaCwgdXNlRmlsZURpYWxvZywgdXNlRmlsZVN5c3RlbUFjY2VzcywgdXNlRm9jdXMsIHVzZUZvY3VzV2l0aGluLCB1c2VGcHMsIHVzZUZ1bGxzY3JlZW4sIHVzZUdhbWVwYWQsIHVzZUdlb2xvY2F0aW9uLCB1c2VJZGxlLCB1c2VJbWFnZSwgdXNlSW5maW5pdGVTY3JvbGwsIHVzZUludGVyc2VjdGlvbk9ic2VydmVyLCB1c2VLZXlNb2RpZmllciwgdXNlTG9jYWxTdG9yYWdlLCB1c2VNYWdpY0tleXMsIHVzZU1hbnVhbFJlZkhpc3RvcnksIHVzZU1lZGlhQ29udHJvbHMsIHVzZU1lZGlhUXVlcnksIHVzZU1lbW9pemUsIHVzZU1lbW9yeSwgdXNlTW91bnRlZCwgdXNlTW91c2UsIHVzZU1vdXNlSW5FbGVtZW50LCB1c2VNb3VzZVByZXNzZWQsIHVzZU11dGF0aW9uT2JzZXJ2ZXIsIHVzZU5hdmlnYXRvckxhbmd1YWdlLCB1c2VOZXR3b3JrLCB1c2VOb3csIHVzZU9iamVjdFVybCwgdXNlT2Zmc2V0UGFnaW5hdGlvbiwgdXNlT25saW5lLCB1c2VQYWdlTGVhdmUsIHVzZVBhcmFsbGF4LCB1c2VQYXJlbnRFbGVtZW50LCB1c2VQZXJmb3JtYW5jZU9ic2VydmVyLCB1c2VQZXJtaXNzaW9uLCB1c2VQb2ludGVyLCB1c2VQb2ludGVyTG9jaywgdXNlUG9pbnRlclN3aXBlLCB1c2VQcmVmZXJyZWRDb2xvclNjaGVtZSwgdXNlUHJlZmVycmVkQ29udHJhc3QsIHVzZVByZWZlcnJlZERhcmssIHVzZVByZWZlcnJlZExhbmd1YWdlcywgdXNlUHJlZmVycmVkUmVkdWNlZE1vdGlvbiwgdXNlUHJlZmVycmVkUmVkdWNlZFRyYW5zcGFyZW5jeSwgdXNlUHJldmlvdXMsIHVzZVJhZkZuLCB1c2VSZWZIaXN0b3J5LCB1c2VSZXNpemVPYnNlcnZlciwgdXNlU1NSV2lkdGgsIHVzZVNjcmVlbk9yaWVudGF0aW9uLCB1c2VTY3JlZW5TYWZlQXJlYSwgdXNlU2NyaXB0VGFnLCB1c2VTY3JvbGwsIHVzZVNjcm9sbExvY2ssIHVzZVNlc3Npb25TdG9yYWdlLCB1c2VTaGFyZSwgdXNlU29ydGVkLCB1c2VTcGVlY2hSZWNvZ25pdGlvbiwgdXNlU3BlZWNoU3ludGhlc2lzLCB1c2VTdGVwcGVyLCB1c2VTdG9yYWdlLCB1c2VTdG9yYWdlQXN5bmMsIHVzZVN0eWxlVGFnLCB1c2VTdXBwb3J0ZWQsIHVzZVN3aXBlLCB1c2VUZW1wbGF0ZVJlZnNMaXN0LCB1c2VUZXh0RGlyZWN0aW9uLCB1c2VUZXh0U2VsZWN0aW9uLCB1c2VUZXh0YXJlYUF1dG9zaXplLCB1c2VUaHJvdHRsZWRSZWZIaXN0b3J5LCB1c2VUaW1lQWdvLCB1c2VUaW1lQWdvSW50bCwgdXNlVGltZW91dFBvbGwsIHVzZVRpbWVzdGFtcCwgdXNlVGl0bGUsIHVzZVRyYW5zaXRpb24sIHVzZVVybFNlYXJjaFBhcmFtcywgdXNlVXNlck1lZGlhLCB1c2VWTW9kZWwsIHVzZVZNb2RlbHMsIHVzZVZpYnJhdGUsIHVzZVZpcnR1YWxMaXN0LCB1c2VXYWtlTG9jaywgdXNlV2ViTm90aWZpY2F0aW9uLCB1c2VXZWJTb2NrZXQsIHVzZVdlYldvcmtlciwgdXNlV2ViV29ya2VyRm4sIHVzZVdpbmRvd0ZvY3VzLCB1c2VXaW5kb3dTY3JvbGwsIHVzZVdpbmRvd1NpemUgfTsiLCJpbXBvcnQgeyBicmVha3BvaW50c1RhaWx3aW5kLCB1c2VCcmVha3BvaW50cyBhcyBjb3JlVXNlQnJlYWtwb2ludHMgfSBmcm9tICdAdnVldXNlL2NvcmUnXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VCcmVha3BvaW50cygpIHtcbiAgICByZXR1cm4gY29yZVVzZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzVGFpbHdpbmQpXG59XG4iLCJpbXBvcnQgeyByZWYsIHRvVmFsdWUsIGlzUmVmLCBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIHsgTWF5YmVSZWYgfSBmcm9tICd2dWUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUkdCIHtcbiAgICByOiBudW1iZXJcbiAgICBnOiBudW1iZXJcbiAgICBiOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSR0JBIGV4dGVuZHMgUkdCIHtcbiAgICBhOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIU0wge1xuICAgIGg6IG51bWJlclxuICAgIHM6IG51bWJlclxuICAgIGw6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9LTENIIHtcbiAgICBsOiBudW1iZXJcbiAgICBjOiBudW1iZXJcbiAgICBoOiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY1JHQihjb2xvcjogc3RyaW5nKTogUkdCIHtcbiAgICBjb25zdCByZ2JNYXRjaCA9IC9yZ2JhP1xcKChcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkKykoPzosXFxzKltcXGQuXSspP1xcKS8uZXhlYyhjb2xvcilcblxuICAgIGlmICghcmdiTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFJHQiBjb2xvciBmb3JtYXQ6ICcgKyBjb2xvcilcbiAgICB9ICAgIFxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICAgIHI6IHBhcnNlSW50KHJnYk1hdGNoWzFdKSxcbiAgICAgICAgZzogcGFyc2VJbnQocmdiTWF0Y2hbMl0pLFxuICAgICAgICBiOiBwYXJzZUludChyZ2JNYXRjaFszXSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UkdCQShjb2xvcjogc3RyaW5nKTogUkdCQSB7XG4gICAgY29uc3QgcmdiYU1hdGNoID0gL3JnYmFcXCgoXFxkKyksXFxzKihcXGQrKSxcXHMqKFxcZCspLFxccyooW1xcZC5dKylcXCkvLmV4ZWMoY29sb3IpXG4gICAgaWYgKCFyZ2JhTWF0Y2gpIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gcmdiIHdpdGggYWxwaGEgMVxuICAgICAgICBjb25zdCByZ2IgPSBleHRyYWNSR0IoY29sb3IpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5yZ2IsXG4gICAgICAgICAgICBhOiAxIFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHI6IHBhcnNlSW50KHJnYmFNYXRjaFsxXSksXG4gICAgICAgIGc6IHBhcnNlSW50KHJnYmFNYXRjaFsyXSksXG4gICAgICAgIGI6IHBhcnNlSW50KHJnYmFNYXRjaFszXSksXG4gICAgICAgIGE6IHBhcnNlRmxvYXQocmdiYU1hdGNoWzRdKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhleFRvUkdCKGhleDogc3RyaW5nKTogUkdCIHtcbiAgICBjb25zdCBoZXhNYXRjaCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpXG5cbiAgICBpZiAoIWhleE1hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBIRVggY29sb3IgZm9ybWF0OiAnICsgaGV4KVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHI6IHBhcnNlSW50KGhleE1hdGNoWzFdLCAxNiksXG4gICAgICAgIGc6IHBhcnNlSW50KGhleE1hdGNoWzJdLCAxNiksXG4gICAgICAgIGI6IHBhcnNlSW50KGhleE1hdGNoWzNdLCAxNilcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xUb1JnYihoc2w6IHN0cmluZyk6IFJHQiB7XG4gICAgY29uc3QgaHNsTWF0Y2ggPSAvaHNsYT9cXCgoXFxkKyksXFxzKihcXGQrKSUsXFxzKihcXGQrKSUoPzosXFxzKltcXGQuXSspP1xcKS8uZXhlYyhoc2wpXG5cbiAgICBpZiAoIWhzbE1hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBIU0wgY29sb3IgZm9ybWF0OiAnICsgaHNsKVxuICAgIH1cblxuICAgIGNvbnN0IGggPSBwYXJzZUludChoc2xNYXRjaFsxXSkgLyAzNjBcbiAgICBjb25zdCBzID0gcGFyc2VJbnQoaHNsTWF0Y2hbMl0pIC8gMTAwXG4gICAgY29uc3QgbCA9IHBhcnNlSW50KGhzbE1hdGNoWzNdKSAvIDEwMFxuXG4gICAgbGV0IHI6IG51bWJlclxuICAgIGxldCBnOiBudW1iZXJcbiAgICBsZXQgYjogbnVtYmVyXG5cbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgICByID0gZyA9IGIgPSBsXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaHVlMnJnYiA9IChwOiBudW1iZXIsIHE6IG51bWJlciwgdDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZiAodCA8IDApIHQgKz0gMVxuICAgICAgICAgICAgaWYgKHQgPiAxKSB0IC09IDFcbiAgICAgICAgICAgIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0XG4gICAgICAgICAgICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcVxuICAgICAgICAgICAgaWYgKHQgPCAyIC8gMykgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2XG4gICAgICAgICAgICByZXR1cm4gcFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHNcbiAgICAgICAgY29uc3QgcCA9IDIgKiBsIC0gcVxuXG4gICAgICAgIHIgPSBodWUycmdiKHAsIHEsIGggKyAxIC8gMylcbiAgICAgICAgZyA9IGh1ZTJyZ2IocCwgcSwgaClcbiAgICAgICAgYiA9IGh1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHI6IE1hdGgucm91bmQociAqIDI1NSksXG4gICAgICAgIGc6IE1hdGgucm91bmQoZyAqIDI1NSksXG4gICAgICAgIGI6IE1hdGgucm91bmQoYiAqIDI1NSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JUb0hzbChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogSFNMIHtcbiAgICByIC89IDI1NVxuICAgIGcgLz0gMjU1XG4gICAgYiAvPSAyNTVcblxuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpXG4gICAgY29uc3QgbWluID0gTWF0aC5taW4ociwgZywgYilcbiAgICBjb25zdCBsID0gKG1heCArIG1pbikgLyAyXG5cbiAgICBpZiAobWF4ID09PSBtaW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGg6IDAsXG4gICAgICAgICAgICBzOiAwLFxuICAgICAgICAgICAgbDogTWF0aC5yb3VuZChsICogMTAwKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZCA9IG1heCAtIG1pblxuICAgIGNvbnN0IHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKVxuICAgIGxldCBoID0gMFxuXG4gICAgc3dpdGNoIChtYXgpIHtcbiAgICBjYXNlIHI6XG4gICAgICAgIGggPSAoKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCkpICogNjBcbiAgICAgICAgYnJlYWtcbiAgICBjYXNlIGc6XG4gICAgICAgIGggPSAoKGIgLSByKSAvIGQgKyAyKSAqIDYwXG4gICAgICAgIGJyZWFrXG4gICAgY2FzZSBiOlxuICAgICAgICBoID0gKChyIC0gZykgLyBkICsgNCkgKiA2MFxuICAgICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGg6IE1hdGgucm91bmQoaCksXG4gICAgICAgIHM6IE1hdGgucm91bmQocyAqIDEwMCksXG4gICAgICAgIGw6IE1hdGgucm91bmQobCAqIDEwMClcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JUb0hleChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b0hleCA9IChuOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgaGV4ID0gbi50b1N0cmluZygxNilcbiAgICAgICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyAnMCcgKyBoZXggOiBoZXhcbiAgICB9XG5cbiAgICByZXR1cm4gYCMke3RvSGV4KHIpfSR7dG9IZXgoZyl9JHt0b0hleChiKX1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JhVG9TdHJpbmcocmdiYTogUkdCQSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZ2JhKCR7cmdiYS5yfSwgJHtyZ2JhLmd9LCAke3JnYmEuYn0sICR7cmdiYS5hfSlgXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0T0tMQ0goY29sb3I6IHN0cmluZyk6IE9LTENIIHtcbiAgICBjb25zdCBva2xjaE1hdGNoID0gL29rbGNoXFwoKFtcXGQuXSspXFxzKyhbXFxkLl0rKVxccysoW1xcZC5dKylcXCkvLmV4ZWMoY29sb3IpXG5cbiAgICBpZiAoIW9rbGNoTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE9LTENIIGNvbG9yIGZvcm1hdDogJyArIGNvbG9yKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGw6IHBhcnNlRmxvYXQob2tsY2hNYXRjaFsxXSksXG4gICAgICAgIGM6IHBhcnNlRmxvYXQob2tsY2hNYXRjaFsyXSksXG4gICAgICAgIGg6IHBhcnNlRmxvYXQob2tsY2hNYXRjaFszXSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBva2xjaFRvUmdiKGNvbG9yOiBzdHJpbmcpOiBSR0Ige1xuICAgIGNvbnN0IG9rbGNoID0gZXh0cmFjdE9LTENIKGNvbG9yKVxuICAgIGNvbnN0IHsgbCwgYywgaCB9ID0gb2tsY2hcbiAgICBcbiAgICBjb25zdCBoUmFkID0gKGggKiBNYXRoLlBJKSAvIDE4MFxuICAgIGNvbnN0IGEgPSBjICogTWF0aC5jb3MoaFJhZClcbiAgICBjb25zdCBiID0gYyAqIE1hdGguc2luKGhSYWQpXG4gICAgXG4gICAgY29uc3QgbF8gPSBsICsgMC4zOTYzMzc3Nzc0ICogYSArIDAuMjE1ODAzNzU3MyAqIGJcbiAgICBjb25zdCBtXyA9IGwgLSAwLjEwNTU2MTM0NTggKiBhIC0gMC4wNjM4NTQxNzI4ICogYlxuICAgIGNvbnN0IHNfID0gbCAtIDAuMDg5NDg0MTc3NSAqIGEgLSAxLjI5MTQ4NTU0ODAgKiBiXG4gICAgXG4gICAgY29uc3QgbDMgPSBsXyAqIGxfICogbF9cbiAgICBjb25zdCBtMyA9IG1fICogbV8gKiBtX1xuICAgIGNvbnN0IHMzID0gc18gKiBzXyAqIHNfXG4gICAgXG4gICAgbGV0IHIgPSArNC4wNzY3NDE2NjIxICogbDMgLSAzLjMwNzcxMTU5MTMgKiBtMyArIDAuMjMwOTY5OTI5MiAqIHMzXG4gICAgbGV0IGcgPSAtMS4yNjg0MzgwMDQ2ICogbDMgKyAyLjYwOTc1NzQwMTEgKiBtMyAtIDAuMzQxMzE5Mzk2NSAqIHMzXG4gICAgbGV0IGJsdWUgPSAtMC4wMDQxOTYwODYzICogbDMgLSAwLjcwMzQxODYxNDcgKiBtMyArIDEuNzA3NjE0NzAxMCAqIHMzXG4gICAgXG4gICAgY29uc3QgZ2FtbWFDb3JyZWN0ID0gKHZhbDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgaWYgKHZhbCA+PSAwLjAwMzEzMDgpIHtcbiAgICAgICAgICAgIHJldHVybiAxLjA1NSAqIE1hdGgucG93KHZhbCwgMSAvIDIuNCkgLSAwLjA1NVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gMTIuOTIgKiB2YWxcbiAgICB9XG4gICAgXG4gICAgciA9IGdhbW1hQ29ycmVjdChyKVxuICAgIGcgPSBnYW1tYUNvcnJlY3QoZylcbiAgICBibHVlID0gZ2FtbWFDb3JyZWN0KGJsdWUpXG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogTWF0aC5yb3VuZChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCByKSkgKiAyNTUpLFxuICAgICAgICBnOiBNYXRoLnJvdW5kKE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGcpKSAqIDI1NSksXG4gICAgICAgIGI6IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYmx1ZSkpICogMjU1KVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvT2tsY2gocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IE9LTENIIHtcbiAgICByID0gciAvIDI1NVxuICAgIGcgPSBnIC8gMjU1XG4gICAgYiA9IGIgLyAyNTVcbiAgICBcbiAgICBjb25zdCBnYW1tYUV4cGFuZCA9ICh2YWw6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgIGlmICh2YWwgPj0gMC4wNDA0NSkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucG93KCh2YWwgKyAwLjA1NSkgLyAxLjA1NSwgMi40KVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdmFsIC8gMTIuOTJcbiAgICB9XG4gICAgXG4gICAgciA9IGdhbW1hRXhwYW5kKHIpXG4gICAgZyA9IGdhbW1hRXhwYW5kKGcpXG4gICAgYiA9IGdhbW1hRXhwYW5kKGIpXG4gICAgXG4gICAgY29uc3QgbCA9IDAuNDEyMjIxNDcwOCAqIHIgKyAwLjUzNjMzMjUzNjMgKiBnICsgMC4wNTE0NDU5OTI5ICogYlxuICAgIGNvbnN0IG0gPSAwLjIxMTkwMzQ5ODIgKiByICsgMC42ODA2OTk1NDUxICogZyArIDAuMTA3Mzk2OTU2NiAqIGJcbiAgICBjb25zdCBzID0gMC4wODgzMDI0NjE5ICogciArIDAuMjgxNzE4ODM3NiAqIGcgKyAwLjYyOTk3ODcwMDUgKiBiXG4gICAgXG4gICAgY29uc3QgbF8gPSBNYXRoLmNicnQobClcbiAgICBjb25zdCBtXyA9IE1hdGguY2JydChtKVxuICAgIGNvbnN0IHNfID0gTWF0aC5jYnJ0KHMpXG4gICAgXG4gICAgY29uc3QgTCA9IDAuMjEwNDU0MjU1MyAqIGxfICsgMC43OTM2MTc3ODUwICogbV8gLSAwLjAwNDA3MjA0NjggKiBzX1xuICAgIGNvbnN0IGEgPSAxLjk3Nzk5ODQ5NTEgKiBsXyAtIDIuNDI4NTkyMjA1MCAqIG1fICsgMC40NTA1OTM3MDk5ICogc19cbiAgICBjb25zdCBiXyA9IDAuMDI1OTA0MDM3MSAqIGxfICsgMC43ODI3NzE3NjYyICogbV8gLSAwLjgwODY3NTc2NjAgKiBzX1xuICAgIFxuICAgIGNvbnN0IEMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiXyAqIGJfKVxuICAgIGxldCBIID0gTWF0aC5hdGFuMihiXywgYSkgKiAoMTgwIC8gTWF0aC5QSSlcbiAgICBcbiAgICBpZiAoSCA8IDApIHtcbiAgICAgICAgSCArPSAzNjBcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbDogTWF0aC5yb3VuZChMICogMTAwMCkgLyAxMDAwLFxuICAgICAgICBjOiBNYXRoLnJvdW5kKEMgKiAxMDAwKSAvIDEwMDAsXG4gICAgICAgIGg6IE1hdGgucm91bmQoSCAqIDEwMDApIC8gMTAwMFxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbG9yVHlwZShwYXlsb2FkPzogTWF5YmVSZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjb2xvciA9IGlzUmVmKHBheWxvYWQpID8gcGF5bG9hZCA6IHJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPih0b1ZhbHVlKHBheWxvYWQpKVxuICAgIFxuICAgIHJldHVybiBjb21wdXRlZDxzdHJpbmcgfCBudWxsPih7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGlmICghY29sb3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sb3IudmFsdWUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdoZXgnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvXnJnYmEvLnRlc3QoY29sb3IudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyZ2JhJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoL15yZ2IvLnRlc3QoY29sb3IudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyZ2InXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvXm9rbGNoLy50ZXN0KGNvbG9yLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnb2tsY2gnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvXmhzbGEvLnRlc3QoY29sb3IudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdoc2xhJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoL15oc2wvLnRlc3QoY29sb3IudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdoc2wnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAndW5rbm93bidcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHR5cGUpIHtcbiAgICAgICAgICAgIGlmICghY29sb3IudmFsdWUgfHwgIXR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY3VycmVudFJnYiA9IHVzZVJHQihjb2xvcikudmFsdWVcblxuICAgICAgICAgICAgaWYgKCFjdXJyZW50UmdiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnaGV4Jykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gcmdiVG9IZXgoY3VycmVudFJnYi5yLCBjdXJyZW50UmdiLmcsIGN1cnJlbnRSZ2IuYilcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdyZ2InKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiKCR7Y3VycmVudFJnYi5yfSwgJHtjdXJyZW50UmdiLmd9LCAke2N1cnJlbnRSZ2IuYn0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3JnYmEnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiYSgke2N1cnJlbnRSZ2Iucn0sICR7Y3VycmVudFJnYi5nfSwgJHtjdXJyZW50UmdiLmJ9LCAxKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdoc2wnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaHNsID0gcmdiVG9Ic2woY3VycmVudFJnYi5yLCBjdXJyZW50UmdiLmcsIGN1cnJlbnRSZ2IuYilcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGBoc2woJHtoc2wuaH0sICR7aHNsLnN9JSwgJHtoc2wubH0lKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdoc2xhJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhzbCA9IHJnYlRvSHNsKGN1cnJlbnRSZ2IuciwgY3VycmVudFJnYi5nLCBjdXJyZW50UmdiLmIpXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgaHNsYSgke2hzbC5ofSwgJHtoc2wuc30lLCAke2hzbC5sfSUpYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ29rbGNoJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9rbGNoID0gcmdiVG9Pa2xjaChjdXJyZW50UmdiLnIsIGN1cnJlbnRSZ2IuZywgY3VycmVudFJnYi5iKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYG9rbGNoKCR7b2tsY2gubH0gJHtva2xjaC5jfSAke29rbGNoLmh9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSR0IocGF5bG9hZD86IE1heWJlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBpc1JlZihwYXlsb2FkKSA/IHBheWxvYWQgOiByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odG9WYWx1ZShwYXlsb2FkKSlcbiAgICBcbiAgICBjb25zdCB0eXBlID0gdXNlQ29sb3JUeXBlKGNvbG9yKVxuXG4gICAgcmV0dXJuIGNvbXB1dGVkPFJHQiB8IG51bGw+KHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgaWYgKCFjb2xvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiYScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2JhID0gZXh0cmFjdFJHQkEoY29sb3IudmFsdWUpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByOiByZ2JhLnIsXG4gICAgICAgICAgICAgICAgICAgIGc6IHJnYmEuZyxcbiAgICAgICAgICAgICAgICAgICAgYjogcmdiYS5iIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2InKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY1JHQihjb2xvci52YWx1ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoZXgnICYmIGNvbG9yLnZhbHVlLmxlbmd0aCA9PT0gNykge1xuICAgICAgICAgICAgICAgIHJldHVybiBoZXhUb1JHQihjb2xvci52YWx1ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoc2wnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhzbFRvUmdiKGNvbG9yLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ29rbGNoJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBva2xjaFRvUmdiKGNvbG9yLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQoKXtcbiAgICAgICAgICAgIGlmICghY29sb3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2InKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmdiID0gZXh0cmFjUkdCKGNvbG9yLnZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYigke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9KWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiYScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2JhID0gZXh0cmFjdFJHQkEoY29sb3IudmFsdWUpXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiYSgke3JnYmEucn0sICR7cmdiYS5nfSwgJHtyZ2JhLmJ9LCAke3JnYmEuYX0pYFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJHQkEocGF5bG9hZD86IE1heWJlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBpc1JlZihwYXlsb2FkKSA/IHBheWxvYWQgOiByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odG9WYWx1ZShwYXlsb2FkKSlcbiAgICBcbiAgICBjb25zdCB0eXBlID0gdXNlQ29sb3JUeXBlKGNvbG9yKVxuICAgIGNvbnN0IHJnYiA9IHVzZVJHQihjb2xvcilcblxuICAgIHJldHVybiBjb21wdXRlZDxSR0JBIHwgbnVsbD4oe1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBpZiAoIXJnYi52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiYScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdFJHQkEoY29sb3IudmFsdWUhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnJnYi52YWx1ZSxcbiAgICAgICAgICAgICAgICBhOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCAhY29sb3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2JhJykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYmEoJHt2YWx1ZS5yfSwgJHt2YWx1ZS5nfSwgJHt2YWx1ZS5ifSwgJHt2YWx1ZS5hfSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiJykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYigke3ZhbHVlLnJ9LCAke3ZhbHVlLmd9LCAke3ZhbHVlLmJ9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VIU0wocGF5bG9hZD86IE1heWJlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBpc1JlZihwYXlsb2FkKSA/IHBheWxvYWQgOiByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odG9WYWx1ZShwYXlsb2FkKSlcbiAgICBcbiAgICBjb25zdCB0eXBlID0gdXNlQ29sb3JUeXBlKGNvbG9yKVxuICAgIGNvbnN0IHJnYiA9IHVzZVJHQihjb2xvcilcblxuICAgIHJldHVybiBjb21wdXRlZDxIU0wgfCBudWxsPih7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGlmICghcmdiLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJnYlRvSHNsKHJnYi52YWx1ZS5yLCByZ2IudmFsdWUuZywgcmdiLnZhbHVlLmIpXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCAhY29sb3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoc2wnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgaHNsKCR7dmFsdWUuaH0sICR7dmFsdWUuc30lLCAke3ZhbHVlLmx9JSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAnaHNsYScpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGBoc2xhKCR7dmFsdWUuaH0sICR7dmFsdWUuc30lLCAke3ZhbHVlLmx9JSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAnaGV4Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJnYiA9IGhzbFRvUmdiKGBoc2woJHt2YWx1ZS5ofSwgJHt2YWx1ZS5zfSUsICR7dmFsdWUubH0lKWApXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSByZ2JUb0hleChyZ2IuciwgcmdiLmcsIHJnYi5iKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYmEnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmdiID0gaHNsVG9SZ2IoYGhzbCgke3ZhbHVlLmh9LCAke3ZhbHVlLnN9JSwgJHt2YWx1ZS5sfSUpYClcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGByZ2JhKCR7cmdiLnJ9LCAke3JnYi5nfSwgJHtyZ2IuYn0sIDEpYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2IgPSBoc2xUb1JnYihgaHNsKCR7dmFsdWUuaH0sICR7dmFsdWUuc30lLCAke3ZhbHVlLmx9JSlgKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYigke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdva2xjaCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2IgPSBoc2xUb1JnYihgaHNsKCR7dmFsdWUuaH0sICR7dmFsdWUuc30lLCAke3ZhbHVlLmx9JSlgKVxuICAgICAgICAgICAgICAgIGNvbnN0IG9rbGNoID0gcmdiVG9Pa2xjaChyZ2IuciwgcmdiLmcsIHJnYi5iKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYG9rbGNoKCR7b2tsY2gubH0gJHtva2xjaC5jfSAke29rbGNoLmh9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VIZXgocGF5bG9hZD86IE1heWJlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBpc1JlZihwYXlsb2FkKSA/IHBheWxvYWQgOiByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odG9WYWx1ZShwYXlsb2FkKSlcbiAgICBcbiAgICBjb25zdCB0eXBlID0gdXNlQ29sb3JUeXBlKGNvbG9yKVxuICAgIGNvbnN0IHJnYiA9IHVzZVJHQihjb2xvcilcblxuICAgIHJldHVybiBjb21wdXRlZDxzdHJpbmcgfCBudWxsPih7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGlmICghcmdiLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJnYlRvSGV4KHJnYi52YWx1ZS5yLCByZ2IudmFsdWUuZywgcmdiLnZhbHVlLmIpXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ2hleCcpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSA/IHZhbHVlIDogYCMke3ZhbHVlfWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbG9yKHBheWxvYWQ/OiBNYXliZVJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPikge1xuICAgIGNvbnN0IGNvbG9yID0gaXNSZWYocGF5bG9hZCkgPyBwYXlsb2FkIDogcmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KHRvVmFsdWUocGF5bG9hZCkpICAgIFxuICAgIGNvbnN0IHR5cGUgPSB1c2VDb2xvclR5cGUoY29sb3IpXG4gICAgY29uc3QgaGV4ID0gdXNlSGV4KGNvbG9yKVxuICAgIGNvbnN0IHJnYiA9IHVzZVJHQihjb2xvcilcbiAgICBjb25zdCByZ2JhID0gdXNlUkdCQShjb2xvcilcbiAgICBjb25zdCBoc2wgPSB1c2VIU0woY29sb3IpXG5cbiAgICBcbiAgICBjb25zdCBva2xjaCA9IGNvbXB1dGVkPE9LTENIIHwgbnVsbD4oe1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBpZiAoIXJnYi52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZ2JUb09rbGNoKHJnYi52YWx1ZS5yLCByZ2IudmFsdWUuZywgcmdiLnZhbHVlLmIpXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ29rbGNoJykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYG9rbGNoKCR7dmFsdWUubH0gJHt2YWx1ZS5jfSAke3ZhbHVlLmh9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmdiID0gb2tsY2hUb1JnYihgb2tsY2goJHt2YWx1ZS5sfSAke3ZhbHVlLmN9ICR7dmFsdWUuaH0pYClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoZXgnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSByZ2JUb0hleChyZ2IuciwgcmdiLmcsIHJnYi5iKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGByZ2IoJHtyZ2Iucn0sICR7cmdiLmd9LCAke3JnYi5ifSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgY29sb3IsXG4gICAgICAgIGhleCxcbiAgICAgICAgcmdiLFxuICAgICAgICBoc2wsXG4gICAgICAgIG9rbGNoLFxuICAgICAgICByZ2JhXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgaW5qZWN0LCBwcm92aWRlIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSBEYXNoYm9hcmRFbnRpdHkgZnJvbSAnI2NsaWVudC9lbnRpdGllcy9EYXNoYm9hcmQudHMnXG5cbmNvbnN0IERBU0hCT0FSRF9LRVkgPSBTeW1ib2woJ2Rhc2hib2FyZCcpXG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRGFzaGJvYXJkKGVudGl0eTogUmVmPERhc2hib2FyZEVudGl0eT4pIHtcbiAgICBwcm92aWRlKERBU0hCT0FSRF9LRVksIGVudGl0eSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZURhc2hib2FyZCgpIHtcbiAgICBjb25zdCBlbnRpdHkgPSBpbmplY3Q8UmVmPERhc2hib2FyZEVudGl0eSB8IHVuZGVmaW5lZD4+KERBU0hCT0FSRF9LRVkpXG5cbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZURhc2hib2FyZCBtdXN0IGJlIHVzZWQgaW5zaWRlIGEgY29tcG9uZW50IHRoYXQgY2FsbHMgcHJvdmlkZURhc2hib2FyZCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eSBhcyBSZWY8RGFzaGJvYXJkRW50aXR5PlxufVxuIiwiaW1wb3J0IHsgaW5qZWN0LCBwcm92aWRlIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSBEYXNoYm9hcmRXaWRnZXQgZnJvbSAnI2NsaWVudC9lbnRpdGllcy9EYXNoYm9hcmRXaWRnZXQudHMnXG5cbmNvbnN0IEtFWSA9IFN5bWJvbCgnZGFzaGJvYXJkLXdpZGdldCcpXG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRGFzaGJvYXJkV2lkZ2V0KGVudGl0eTogUmVmPERhc2hib2FyZFdpZGdldD4pIHtcbiAgICBwcm92aWRlKEtFWSwgZW50aXR5KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRGFzaGJvYXJkV2lkZ2V0KCkge1xuICAgIGNvbnN0IGVudGl0eSA9IGluamVjdChLRVkpXG5cbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZURhc2hib2FyZFdpZGdldCBtdXN0IGJlIHVzZWQgaW5zaWRlIGEgY29tcG9uZW50IHRoYXQgY2FsbHMgcHJvdmlkZURhc2hib2FyZFdpZGdldCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eSBhcyBSZWY8RGFzaGJvYXJkV2lkZ2V0PlxufVxuIiwiaW1wb3J0IHsgcmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnXG5pbXBvcnQgZGkgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcblxuZXhwb3J0IGludGVyZmFjZSBVc2VTdGF0ZU9wdGlvbnMge1xuICAgIGRlZmF1bHQ/OiAoKSA9PiBhbnlcbiAgICB0cmFuc2Zvcm0/OiAodmFsdWU6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdGF0ZTxUPihrZXk6IHN0cmluZywgb3B0aW9ucz86IFVzZVN0YXRlT3B0aW9ucyk6IFJlZjxUPiB7XG4gICAgY29uc3QgcmVmcyA9IGRpLmdldDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pignc3RhdGUnKVxuXG4gICAgbGV0IHZhbHVlID0gcmVmc1trZXldXG5cbiAgICBpZiAoIXZhbHVlICYmIG9wdGlvbnM/LmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IG9wdGlvbnMuZGVmYXVsdCgpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICYmIG9wdGlvbnM/LnRyYW5zZm9ybSkge1xuICAgICAgICB2YWx1ZSA9IG9wdGlvbnMudHJhbnNmb3JtKHZhbHVlKVxuICAgIH1cbiAgICBcbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgY29uc3Qgc3RhdGUgPSByZWY8VD4odmFsdWUpXG5cbiAgICBjb25zdCB1cGRhdGUgPSAobmV3VmFsdWU6IGFueSkgPT4ge1xuICAgICAgICByZWZzW2tleV0gPSBuZXdWYWx1ZVxuICAgICAgICBcbiAgICAgICAgZGkuc2V0KCdzdGF0ZScsIHJlZnMpXG4gICAgfVxuICAgIFxuICAgIHdhdGNoKHN0YXRlLCB1cGRhdGUsIHsgZGVlcDogdHJ1ZSB9KVxuXG4gICAgLy8gTG9naWMgdG8gaW5pdGlhbGl6ZSBhbmQgbWFuYWdlIHN0YXRlXG4gICAgcmV0dXJuIGNvbXB1dGVkPFQ+KHtcbiAgICAgICAgZ2V0OiAoKSA9PiBzdGF0ZS52YWx1ZSxcbiAgICAgICAgc2V0OiAobmV3VmFsdWU6IFQpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnZhbHVlID0gbmV3VmFsdWVcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdXBkYXRlKG5ld1ZhbHVlKVxuICAgICAgICB9XG4gICAgfSlcbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCByZWYsIHRvUmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIHsgTWF5YmVSZWYsIFJlZiB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB7IHdhdGNoRGVib3VuY2VkIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICcuL3VzZVN0YXRlLnRzJ1xuaW1wb3J0IHR5cGUgUGFnaW5hdGlvbiBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1BhZ2luYXRpb25FbnRpdHkudHMnXG5pbXBvcnQgJGZldGNoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUZldGNoUGFnaW5hdGlvbk9wdGlvbnMge1xuICAgIGtleT86IHN0cmluZ1xuICAgIHF1ZXJ5PzogTWF5YmVSZWY8UmVjb3JkPHN0cmluZywgYW55Pj5cbiAgICBwYWdlPzogTWF5YmVSZWY8bnVtYmVyPlxuICAgIHNlcmlhbGl6ZT86IChpdGVtOiBhbnkpID0+IGFueVxuICAgIHJlZmluZT86IChpdGVtczogYW55W10pID0+IGFueVtdXG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBvcmRlckJ5Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsXG4gICAgb3JkZXJEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJyB8ICgnYXNjJyB8ICdkZXNjJylbXSB8IG51bGxcbiAgICBkZWJvdW5jZT86IG51bWJlclxuICAgIGltbWVkaWF0ZT86IGJvb2xlYW5cbn1cblxuY29uc3QgaHlkcmF0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRmV0Y2hQYWdpbmF0aW9uPFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBVc2VGZXRjaFBhZ2luYXRpb25PcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleSB8fCB1cmxcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gdXNlU3RhdGU8UGFnaW5hdGlvbj4oa2V5LCB7XG4gICAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgICAgdG90YWw6IDAsXG4gICAgICAgICAgICB0b3RhbF9wYWdlczogMSxcbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgY29uc3QgbG9hZGluZyA9IHJlZihmYWxzZSlcblxuICAgIGNvbnN0IHBhZ2UgPSB0b1JlZihvcHRpb25zLnBhZ2UgfHwgMSkgYXMgUmVmPG51bWJlcj5cbiAgICBjb25zdCBxdWVyeSA9IHRvUmVmKG9wdGlvbnMucXVlcnkgfHwge30pIGFzIFJlZjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgIGNvbnN0IGxpbWl0ID0gdG9SZWYob3B0aW9ucy5saW1pdCB8fCAxMCkgYXMgUmVmPG51bWJlcj5cbiAgICBjb25zdCBvcmRlckJ5ID0gdG9SZWYob3B0aW9ucy5vcmRlckJ5IHx8IG51bGwpIGFzIFJlZjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+XG4gICAgY29uc3Qgb3JkZXJEaXJlY3Rpb24gPSB0b1JlZihvcHRpb25zLm9yZGVyRGlyZWN0aW9uIHx8IG51bGwpIGFzIFJlZjwnYXNjJyB8ICdkZXNjJyB8ICgnYXNjJyB8ICdkZXNjJylbXSB8IG51bGw+XG5cbiAgICBjb25zdCB0b3RhbCA9IGNvbXB1dGVkKCgpID0+IHJlc3BvbnNlLnZhbHVlLnRvdGFsKVxuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBjb21wdXRlZCgoKSA9PiByZXNwb25zZS52YWx1ZS50b3RhbF9wYWdlcylcbiAgICBjb25zdCBpdGVtcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgbGV0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS52YWx1ZS5pdGVtcykgPyByZXNwb25zZS52YWx1ZS5pdGVtcyA6IFtdXG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmVmaW5lKSB7XG4gICAgICAgICAgICBpdGVtcyA9IG9wdGlvbnMucmVmaW5lKGl0ZW1zKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWFsaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbXMubWFwKGkgPT4gb3B0aW9ucy5zZXJpYWxpemUhKGkpKSBhcyBUW11cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtcyBhcyBUW11cbiAgICB9KVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZCgpIHtcbiAgICAgICAgaWYgKGxvYWRpbmcudmFsdWUpIHJldHVyblxuXG4gICAgICAgIGxvYWRpbmcudmFsdWUgPSB0cnVlXG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAuLi5xdWVyeS52YWx1ZSxcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UudmFsdWUsXG4gICAgICAgICAgICBsaW1pdDogbGltaXQudmFsdWUsXG4gICAgICAgICAgICBvcmRlckJ5OiBvcmRlckJ5LnZhbHVlID8gb3JkZXJCeS52YWx1ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9yZGVyRGlyZWN0aW9uOiBvcmRlckRpcmVjdGlvbi52YWx1ZSA/IG9yZGVyRGlyZWN0aW9uLnZhbHVlIDogdW5kZWZpbmVkLFxuICAgICAgICB9KSlcblxuICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdF0gPSBhd2FpdCAkZmV0Y2gudHJ5PFBhZ2luYXRpb24+KHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHF1ZXJ5OiBwYXJhbXNcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2UudmFsdWUgPSByZXN1bHRcblxuICAgICAgICBpZiAoaW1wb3J0Lm1ldGEuZW52LlNTUikge1xuICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA4MDApKVxuXG4gICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgICBpZiAocGFnZS52YWx1ZSA9PT0gMSkge1xuICAgICAgICAgICAgYXdhaXQgbG9hZCgpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHBhZ2UudmFsdWUgPSAxXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25RdWVyeUNoYW5nZShuZXdEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBvbGREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnN0IGlzRXF1YWwgPSBKU09OLnN0cmluZ2lmeShuZXdEYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkob2xkRGF0YSlcblxuICAgICAgICBpZiAoIWlzRXF1YWwpIHtcbiAgICAgICAgICAgIHJlc2V0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdhdGNoKFtwYWdlLCBsaW1pdF0sIGxvYWQpXG4gICAgd2F0Y2goW29yZGVyQnksIG9yZGVyRGlyZWN0aW9uXSwgcmVzZXQsIHsgZGVlcDogdHJ1ZSB9KVxuXG4gICAgd2F0Y2hEZWJvdW5jZWQoXG4gICAgICAgICgpID0+IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocXVlcnkudmFsdWUpKSxcbiAgICAgICAgb25RdWVyeUNoYW5nZSxcbiAgICAgICAge1xuICAgICAgICAgICAgZGVib3VuY2U6IG9wdGlvbnMuZGVib3VuY2UgfHwgMTAwMFxuICAgICAgICB9XG4gICAgKVxuXG5cbiAgICBhc3luYyBmdW5jdGlvbiBoeWRyYXRlKCkge1xuICAgICAgICBpZiAoIWh5ZHJhdGVkLmhhcyhrZXkpICYmIGl0ZW1zLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgaHlkcmF0ZWQuYWRkKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaHlkcmF0ZWQuYWRkKGtleSlcblxuICAgICAgICBhd2FpdCBsb2FkKClcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBwYWdlLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgb3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIHRvdGFsLFxuICAgICAgICB0b3RhbFBhZ2VzLFxuICAgICAgICBpdGVtcyxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgICAgbG9hZCxcbiAgICAgICAgcmVzZXQsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBoeWRyYXRlXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBWYWxpYm90T2JqZWN0U2NoZW1hLCB0eXBlIFZhbGlib3RTY2hlbWEsIHR5cGUgVmFsaWRhdGVQYXlsb2FkLCB0eXBlIFZhbGlkYXRvclJlc3VsdCB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnO1xuaW1wb3J0IHsgdG9UeXBlZFNjaGVtYSBhcyAgdmVlVmFsaWRhdGVUb1R5cGVkU2NoZW1hIH0gZnJvbSAnQHZlZS12YWxpZGF0ZS92YWxpYm90JztcbmltcG9ydCB7IHVzZUZvcm0gYXMgdXNlVmVlVmFsaWRhdGVGb3JtLCB0eXBlIEZvcm1Db250ZXh0LCB0eXBlIEZvcm1PcHRpb25zLCB0eXBlIEdlbmVyaWNPYmplY3QgfSBmcm9tICd2ZWUtdmFsaWRhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlib3RGb3JtT3B0aW9uczxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA9IFZhbGlib3RTY2hlbWE+IFxuICAgIGV4dGVuZHMgT21pdDxGb3JtT3B0aW9uczxWYWxpZGF0ZVBheWxvYWQ8VD4sIFZhbGlkYXRvclJlc3VsdDxUPj4sICd2YWxpZGF0aW9uU2NoZW1hJz4ge31cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpYm90Rm9ybVJlc3VsdE9iamVjdDxUIGV4dGVuZHMgVmFsaWJvdE9iamVjdFNjaGVtYT5cbiAgICBleHRlbmRzIEdlbmVyaWNPYmplY3QsXG4gICAgRm9ybUNvbnRleHQ8VmFsaWRhdG9yUmVzdWx0PFQ+PlxuICAgIHt9XG5cbmV4cG9ydCBjb25zdCB1c2VGb3JtID0gdXNlVmFsaWJvdEZvcm07XG5cbmV4cG9ydCBjb25zdCB0b1R5cGVkU2NoZW1hID0gdmVlVmFsaWRhdGVUb1R5cGVkU2NoZW1hO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVmFsaWJvdEZvcm08VCBleHRlbmRzIFZhbGlib3RPYmplY3RTY2hlbWEgPSBWYWxpYm90T2JqZWN0U2NoZW1hPihzY2hlbWE6IFQsIG9wdGlvbnM6IFZhbGlib3RGb3JtT3B0aW9uczxUPiA9IHt9KTogRm9ybUNvbnRleHQ8VmFsaWRhdG9yUmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIHVzZVZlZVZhbGlkYXRlRm9ybSh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHZhbGlkYXRpb25TY2hlbWE6IHZlZVZhbGlkYXRlVG9UeXBlZFNjaGVtYShzY2hlbWEgYXMgYW55KSxcbiAgICB9KSBhcyBhbnlcbn1cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCAqIGFzIFVuaGVhZFZ1ZSBmcm9tICdAdW5oZWFkL3Z1ZSdcblxuZXhwb3J0IGNvbnN0IFVOSEVBRF9WVUVfQ09OVEFJTkVSX0tFWSA9ICd1bmhlYWQtdnVlJ1xuXG5jb25zdCB1bmhlYWRWdWUgPSBjb250YWluZXIucHJveHk8dHlwZW9mIFVuaGVhZFZ1ZT4oVU5IRUFEX1ZVRV9DT05UQUlORVJfS0VZKVxuXG5leHBvcnQgZGVmYXVsdCB1bmhlYWRWdWVcbiIsImltcG9ydCB1bmhlYWRWdWUgZnJvbSAnI2NsaWVudC9mYWNhZGVzL3VuaGVhZFZ1ZS50cydcblxuY29uc3QgemVuaXRoVXNlSGVhZCA9ICguLi5hcmdzOiBhbnkpID0+IHtcbiAgICByZXR1cm4gdW5oZWFkVnVlLnVzZUhlYWQoLi4uYXJncylcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUhlYWQgPSB6ZW5pdGhVc2VIZWFkIGFzIHR5cGVvZiB1bmhlYWRWdWUudXNlSGVhZFxuXG4iLCJpbXBvcnQgTGF5b3V0TWFuYWdlciBmcm9tIFwiI2NsaWVudC9zZXJ2aWNlcy9MYXlvdXRTZXJ2aWNlLnRzXCI7XG5cbmNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIGFueVxuXG5jb25zdCBsYXlvdXQgPSBnLmxheW91dCB8fCBuZXcgTGF5b3V0TWFuYWdlcigpXG5cbmcubGF5b3V0ID0gbGF5b3V0XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dFxuIiwiaW1wb3J0IGVtbWl0dGVyIGZyb20gXCIjY2xpZW50L2ZhY2FkZXMvZW1taXR0ZXIudHNcIlxuaW1wb3J0IGxheW91dCBmcm9tIFwiI2NsaWVudC9mYWNhZGVzL2xheW91dC50c1wiXG5pbXBvcnQgeyByZWYgfSBmcm9tIFwidnVlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUxheW91dE9wdGlvbnMoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHJlZihsYXlvdXQuZ2V0T3B0aW9ucygpKVxuXG4gICAgY29uc3QgcmVmcmVzaCA9ICgpID0+IHtcbiAgICAgICAgb3B0aW9ucy52YWx1ZSA9IGxheW91dC5nZXRPcHRpb25zKClcbiAgICB9XG5cbiAgICBlbW1pdHRlci5vbignbGF5b3V0OmNoYW5nZScsIHJlZnJlc2gpXG4gICAgZW1taXR0ZXIub24oJ2xheW91dDpzZXQtb3B0aW9ucycsIHJlZnJlc2gpXG5cbiAgICByZXR1cm4gb3B0aW9uc1xufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiAgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSdcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICAgIHRpbWVvdXQ/OiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIExvYWRpbmdSZWYgZXh0ZW5kcyBSZWY8Ym9vbGVhbj4ge1xuICAgIHNldDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VMb2FkaW5nKGRlZmF1bHRWYWx1ZSA9IGZhbHNlLCBvcHRpb25zPzogT3B0aW9ucykge1xuICAgIGNvbnN0IHN0YXRlID0gcmVmKGRlZmF1bHRWYWx1ZSlcbiAgICBjb25zdCB0aW1lb3V0ID0gcmVmKG9wdGlvbnM/LnRpbWVvdXQgPz8gNTAwKVxuXG4gICAgZnVuY3Rpb24gc2V0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkaW5nID0gY29tcHV0ZWQoe1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUudmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZSA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gXG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2V0KGZhbHNlKSwgdGltZW91dC52YWx1ZSlcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBsb2FkaW5nUmVmOiBMb2FkaW5nUmVmID0gT2JqZWN0LmFzc2lnbihsb2FkaW5nLCB7IHNldCB9KVxuXG4gICAgcmV0dXJuIGxvYWRpbmdSZWZcblxufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiB9IGZyb20gJ3Z1ZSdcblxuZXhwb3J0IGludGVyZmFjZSBNZW51QmFzZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgb3JkZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudVNpbmdsZSAgZXh0ZW5kcyBNZW51QmFzZSB7XG4gICAgaWNvbjogc3RyaW5nO1xuICAgIHRvOiBzdHJpbmc7XG4gICAgdGFyZ2V0PzogJ19ibGFuaycgfCAnX3NlbGYnIHwgJ19wYXJlbnQnIHwgJ190b3AnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVXaXRoQ2hpbGRyZW4gZXh0ZW5kcyBNZW51QmFzZSB7XG4gICAgaWNvbjogc3RyaW5nO1xuICAgIGNoaWxkcmVuOiBPbWl0PE1lbnVTaW5nbGUsICdpY29uJz5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW51R3JvdXAgZXh0ZW5kcyBNZW51QmFzZSB7XG4gICAgZ3JvdXA6IGJvb2xlYW47XG4gICAgaXRlbXM6IE1lbnVJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW0ge1xuICAgIGlkOiBzdHJpbmdcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHRvPzogc3RyaW5nO1xuICAgIHRhcmdldD86ICdfYmxhbmsnIHwgJ19zZWxmJyB8ICdfcGFyZW50JyB8ICdfdG9wJztcbiAgICBncm91cD86IHN0cmluZ1xuICAgIG9yZGVyPzogbnVtYmVyO1xuICAgIGljb24/OiBzdHJpbmdcbiAgICBwYXJlbnQ/OiBzdHJpbmdcbiAgICBsYXlvdXQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgVXNlTWVudSA9IFJldHVyblR5cGU8dHlwZW9mIHVzZU1lbnU+XG5cbmNvbnN0IGl0ZW1zID0gcmVmPE1hcDxzdHJpbmcsIE1lbnVJdGVtPj4obmV3IE1hcCgpKVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlTWVudSgpIHtcbiAgICBmdW5jdGlvbiBhZGQoLi4uaXRlbTogTWVudUl0ZW1bXSkge1xuICAgICAgICBpdGVtLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBpZiAoIWkubGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgaS5sYXlvdXQgPSAnYWRtaW4nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGl0ZW1zLnZhbHVlLnNldChpLmlkLCBpKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZShpdGVtOiBNZW51SXRlbSB8IE1lbnVJdGVtWydpZCddKSB7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaXRlbXMudmFsdWUuZGVsZXRlKGl0ZW0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVHcm91cChncm91cElkOiBzdHJpbmcpIHtcbiAgICAgICAgQXJyYXkuZnJvbShpdGVtcy52YWx1ZS52YWx1ZXMoKSlcbiAgICAgICAgICAgIC5maWx0ZXIoaSA9PiBpLmdyb3VwID09PSBncm91cElkIHx8IGkucGFyZW50ID09PSBncm91cElkKVxuICAgICAgICAgICAgLmZvckVhY2goaSA9PiBpdGVtcy52YWx1ZS5kZWxldGUoaS5pZCkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlTWFueShpdGVtSWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBpdGVtSWRzLmZvckVhY2goaWQgPT4gcmVtb3ZlKGlkKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVNYW55R3JvdXAoZ3JvdXBJZHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGdyb3VwSWRzLmZvckVhY2goaWQgPT4gcmVtb3ZlR3JvdXAoaWQpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBpdGVtcy52YWx1ZS5jbGVhcigpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgaXRlbXM6IGNvbXB1dGVkKCgpID0+IEFycmF5LmZyb20oaXRlbXMudmFsdWUudmFsdWVzKCkpKSxcbiAgICAgICAgYWRkLFxuICAgICAgICByZW1vdmUsXG4gICAgICAgIHJlbW92ZUdyb3VwLFxuICAgICAgICByZW1vdmVNYW55LFxuICAgICAgICByZW1vdmVNYW55R3JvdXAsXG4gICAgICAgIGNsZWFyXG4gICAgfVxufSIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCB0eXBlIHsgUm91dGVMb2NhdGlvbk5vcm1hbGl6ZWRHZW5lcmljIH0gZnJvbSAndnVlLXJvdXRlcidcblxuY29uc3Qgcm91dGUgPSBjb250YWluZXIucHJveHk8Um91dGVMb2NhdGlvbk5vcm1hbGl6ZWRHZW5lcmljPigncm91dGUnKVxuXG5leHBvcnQgZGVmYXVsdCByb3V0ZVxuXG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgdHlwZSB7IFJvdXRlciB9IGZyb20gJyNjbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcblxuY29uc3Qgcm91dGVyID0gY29udGFpbmVyLnByb3h5PFJvdXRlcj4oJ3JvdXRlcicpXG5cbmV4cG9ydCBkZWZhdWx0IHJvdXRlclxuIiwiaW1wb3J0IHJvdXRlIGZyb20gJyNjbGllbnQvZmFjYWRlcy9yb3V0ZS50cydcbmltcG9ydCByb3V0ZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL3JvdXRlci50cydcblxuaW1wb3J0IHsgdXNlUm91dGVRdWVyeSBhcyB2dWVVc2VyUm91dGVRdWVyeSB9IGZyb20gJ0B2dWV1c2Uvcm91dGVyJ1xuXG5jb25zdCB6ZW5pdGhVc2VSb3V0ZVF1ZXJ5PSAoa2V5OiBhbnksIGRlZmF1bHRWYWx1ZTogYW55LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICByZXR1cm4gdnVlVXNlclJvdXRlUXVlcnkoa2V5LCBkZWZhdWx0VmFsdWUsIHtcbiAgICAgICAgcm91dGUsXG4gICAgICAgIHJvdXRlcixcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCB1c2VSb3V0ZVF1ZXJ5ID0gemVuaXRoVXNlUm91dGVRdWVyeSBhcyB0eXBlb2YgdnVlVXNlclJvdXRlUXVlcnlcblxuIiwiaW1wb3J0IEF1dGhTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvQXV0aFNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBhdXRoID0gY29udGFpbmVyLnByb3h5PEF1dGhTZXJ2aWNlPihBdXRoU2VydmljZSlcblxuaWYgKGltcG9ydC5tZXRhLmVudi5ERVYgJiYgIWltcG9ydC5tZXRhLmVudi5TU1IpIHtcbiAgICAod2luZG93IGFzIGFueSkuYXV0aCA9IGF1dGhcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXV0aFxuIiwiaW1wb3J0IHR5cGUgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbiBmcm9tICcjY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldERlZmluaXRpb24udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZFdpZGdldFJlZ2lzdHJ5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdEYXNoYm9hcmRXaWRnZXRSZWdpc3RyeSdcbiAgICBwcml2YXRlIGRlZmluaXRpb25zOiBNYXA8c3RyaW5nLCBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uPiA9IG5ldyBNYXAoKVxuXG4gICAgcHVibGljIHJlZ2lzdGVyKC4uLmRlZmluaXRpb246IERhc2hib2FyZFdpZGdldERlZmluaXRpb25bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluaXRpb25zLnNldChkZWYuaWQsIGRlZilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZyk6IERhc2hib2FyZFdpZGdldERlZmluaXRpb24gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbnMuZ2V0KGlkKSB8fCBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKTogRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kZWZpbml0aW9ucy52YWx1ZXMoKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgRGFzaGJvYXJkV2lkZ2V0UmVnaXN0cnkgZnJvbSAnI2NsaWVudC9yZWdpc3RyeS9EYXNoYm9hcmRXaWRnZXRSZWdpc3RyeS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGRhc2hib2FyZFJlZ2lzdHJ5ID0gY29udGFpbmVyLnByb3h5PERhc2hib2FyZFdpZGdldFJlZ2lzdHJ5PihEYXNoYm9hcmRXaWRnZXRSZWdpc3RyeSlcblxuZXhwb3J0IGRlZmF1bHQgZGFzaGJvYXJkUmVnaXN0cnlcbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5pbXBvcnQgTGlmZWN5Y2xlU2VydmljZSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMnXG5cbmNvbnN0IGxpZmVjeWNsZSA9IGNvbnRhaW5lci5wcm94eTxMaWZlY3ljbGVTZXJ2aWNlPihMaWZlY3ljbGVTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBsaWZlY3ljbGVcbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGxvZ2dlciA9IGNvbnRhaW5lci5wcm94eTxMb2dnZXJTZXJ2aWNlPihMb2dnZXJTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBsb2dnZXJcbiIsImltcG9ydCBNZW51U2VydmljZSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL01lbnVTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgbWVudSA9IGNvbnRhaW5lci5wcm94eTxNZW51U2VydmljZT4oTWVudVNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IG1lbnVcbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCBUb2FzdFNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Ub2FzdFNlcnZpY2UudHMnXG5cbmNvbnN0IHRvYXN0ID0gY29udGFpbmVyLnByb3h5PFRvYXN0U2VydmljZT4oVG9hc3RTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCB0b2FzdFxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0ICogYXMgVmVlVmFsaWRhdGUgZnJvbSAndmVlLXZhbGlkYXRlJ1xuXG5leHBvcnQgY29uc3QgVkVFX1ZBTElEQVRFX0NPTlRBSU5FUl9LRVkgPSAndmVlLXZhbGlkYXRlJ1xuXG5jb25zdCB2ZWVWYWxpZGF0ZSA9IGNvbnRhaW5lci5wcm94eTx0eXBlb2YgVmVlVmFsaWRhdGU+KFZFRV9WQUxJREFURV9DT05UQUlORVJfS0VZKVxuXG5leHBvcnQgZGVmYXVsdCB2ZWVWYWxpZGF0ZVxuIiwiXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgKiBhcyBWdWUgZnJvbSAndnVlJ1xuXG5leHBvcnQgY29uc3QgVlVFX0NPTlRBSU5FUl9LRVkgPSAnVnVlJ1xuXG5jb25zdCB2dWUgPSBjb250YWluZXIucHJveHk8dHlwZW9mIFZ1ZT4oVlVFX0NPTlRBSU5FUl9LRVkpXG5cbmV4cG9ydCBkZWZhdWx0IHZ1ZVxuIiwiXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgKiBhcyBWdWVSb3V0ZXIgZnJvbSAndnVlLXJvdXRlcidcblxuZXhwb3J0IGNvbnN0IFZVRV9ST1VURVJfQ09OVEFJTkVSX0tFWSA9ICdWdWVSb3V0ZXInXG5cbmNvbnN0IHZ1ZVJvdXRlciA9IGNvbnRhaW5lci5wcm94eTx0eXBlb2YgVnVlUm91dGVyPihWVUVfUk9VVEVSX0NPTlRBSU5FUl9LRVkpXG5cbmV4cG9ydCBkZWZhdWx0IHZ1ZVJvdXRlclxuIiwiaW1wb3J0IHsgY3JlYXRlSWQgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2luZGV4LnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZEdyaWRVbml0IHtcbiAgICBiYXNlPzogbnVtYmVyXG4gICAgc20/OiBudW1iZXJcbiAgICBtZD86IG51bWJlclxuICAgIGxnPzogbnVtYmVyXG4gICAgeGw/OiBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkV2lkZ2V0RGF0YSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlZmluaXRpb25faWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBjb2x1bW5zOiBEYXNoYm9hcmRHcmlkVW5pdCBcbiAgICBwdWJsaWMgcm93czogRGFzaGJvYXJkR3JpZFVuaXRcbiAgICBwdWJsaWMgeDogRGFzaGJvYXJkR3JpZFVuaXRcbiAgICBwdWJsaWMgeTogRGFzaGJvYXJkR3JpZFVuaXRcbiAgICBwdWJsaWMgb3JkZXI6IG51bWJlclxuICAgIHB1YmxpYyBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPERhc2hib2FyZFdpZGdldERhdGE+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcblxuICAgICAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgICAgICAgIHRoaXMuaWQgPSBjcmVhdGVJZCgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge31cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkV2lkZ2V0QWN0aW9uIHtcbiAgICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICBjb21wb25lbnQ6IGFueVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICBwdWJsaWMgaWNvbj86IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaWQgPSAnJ1xuICAgICAgICB0aGlzLm5hbWUgPSAnJ1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gJydcbiAgICAgICAgdGhpcy5pY29uID0gJydcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50KCk6IGFueSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIGFjdGlvbnMoKTogRGFzaGJvYXJkV2lkZ2V0QWN0aW9uW10ge1xuICAgICAgICByZXR1cm4gW11cbiAgICB9XG59XG4iLCJpbXBvcnQgRW1taXR0ZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHR5cGUgRGFzaGJvYXJkV2lkZ2V0RGF0YSBmcm9tICcuL0Rhc2hib2FyZFdpZGdldERhdGEnXG5pbXBvcnQgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbiBmcm9tICcuL0Rhc2hib2FyZFdpZGdldERlZmluaXRpb24nXG5pbXBvcnQgZGFzaGJvYXJkUmVnaXN0cnkgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2Rhc2hib2FyZFJlZ2lzdHJ5LnRzJ1xuXG5leHBvcnQgY29uc3QgREFTSEJPQVJEX1JPV19IRUlHSFQgPSA4MFxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkV2lkZ2V0T3B0aW9ucyB7XG4gICAgZGF0YTogRGFzaGJvYXJkV2lkZ2V0RGF0YVxuICAgIGRlZmluaXRpb246IERhc2hib2FyZFdpZGdldERlZmluaXRpb25cbn1cblxuaW50ZXJmYWNlIFN0eWxlc09wdGlvbnMge1xuICAgIGNvbnRpYW5lcldpZHRoOiBudW1iZXJcbiAgICBicmVha3BvaW50PzogJ2Jhc2UnIHwgJ3NtJyB8ICdtZCcgfCAneGwnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZFdpZGdldCB7XG4gICAgcHVibGljIGRhdGE6IERhc2hib2FyZFdpZGdldERhdGFcbiAgICBwdWJsaWMgZGVmaW5pdGlvbjogRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvblxuICAgIHB1YmxpYyBlbW1pdHRlcjogRW1taXR0ZXJTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3Rvcih7IGRhdGEsIGRlZmluaXRpb24gfTogRGFzaGJvYXJkV2lkZ2V0T3B0aW9ucykge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhXG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb25cbiAgICAgICAgdGhpcy5lbW1pdHRlciA9IG5ldyBFbW1pdHRlclNlcnZpY2UoKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbURhdGEoZGF0YTogRGFzaGJvYXJkV2lkZ2V0RGF0YSkge1xuICAgICAgICBsZXQgZGVmID0gZGFzaGJvYXJkUmVnaXN0cnkuZ2V0KGRhdGEuZGVmaW5pdGlvbl9pZClcblxuICAgICAgICBpZiAoIWRlZikge1xuICAgICAgICAgICAgZGVmID0gbmV3IERhc2hib2FyZFdpZGdldERlZmluaXRpb24oKVxuICAgICAgICAgICAgZGVmLm5hbWUgPSBgVW5rbm93bjogJHtkYXRhLmRlZmluaXRpb25faWR9YFxuICAgICAgICAgICAgZGVmLmlkID0gZGF0YS5kZWZpbml0aW9uX2lkXG5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbiBub3QgZm91bmQgZm9yIGlkOiAke2RhdGEuZGVmaW5pdGlvbl9pZH0uIFVzaW5nIHVua25vd24gZGVmaW5pdGlvbi5gKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEYXNoYm9hcmRXaWRnZXQoe1xuICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgIGRlZmluaXRpb246IGRlZixcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RW1taXR0ZXIoZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZSkge1xuICAgICAgICB0aGlzLmVtbWl0dGVyID0gZW1taXR0ZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuaWRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5uYW1lXG4gICAgfVxuXG4gICAgcHVibGljIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy51cGRhdGUoeyBuYW1lOiB2YWx1ZSB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb3B0aW9ucygpOiBEYXNoYm9hcmRXaWRnZXREYXRhWydvcHRpb25zJ10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLm9wdGlvbnMgfHwge31cbiAgICB9XG5cblxuICAgIHB1YmxpYyBnZXQgZGVmaW5pdGlvbl9pZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmRlZmluaXRpb25faWRcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uLmNvbXBvbmVudCgpXG4gICAgfVxuXG4gICAgcHVibGljIGFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmluaXRpb24uYWN0aW9ucygpXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2x1bW5zKCk6IERhc2hib2FyZFdpZGdldERhdGFbJ2NvbHVtbnMnXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuY29sdW1ucyB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1ucyhwYXlsb2FkOiBEYXNoYm9hcmRXaWRnZXREYXRhWydjb2x1bW5zJ10pIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLmNvbHVtbnMgfHwge30pKSBhcyBEYXNoYm9hcmRXaWRnZXREYXRhWydjb2x1bW5zJ11cblxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbnMsIHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyBjb2x1bW5zIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCk6IERhc2hib2FyZFdpZGdldERhdGFbJ3Jvd3MnXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEucm93cyB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93cyhwYXlsb2FkOiBEYXNoYm9hcmRXaWRnZXREYXRhWydyb3dzJ10pIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLnJvd3MgfHwge30pKSBhcyBEYXNoYm9hcmRXaWRnZXREYXRhWydyb3dzJ11cblxuICAgICAgICBPYmplY3QuYXNzaWduKHJvd3MsIHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyByb3dzIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldCB4KCk6IERhc2hib2FyZFdpZGdldERhdGFbJ3gnXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEueCB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgeChwYXlsb2FkOiBEYXNoYm9hcmRXaWRnZXREYXRhWyd4J10pIHtcbiAgICAgICAgY29uc3QgeCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLnggfHwge30pKSBhcyBEYXNoYm9hcmRXaWRnZXREYXRhWyd4J11cblxuICAgICAgICBPYmplY3QuYXNzaWduKHgsIHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyB4IH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldCB5KCk6IERhc2hib2FyZFdpZGdldERhdGFbJ3knXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEueSB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgeShwYXlsb2FkOiBEYXNoYm9hcmRXaWRnZXREYXRhWyd5J10pIHtcbiAgICAgICAgY29uc3QgeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLnkgfHwge30pKSBhcyBEYXNoYm9hcmRXaWRnZXREYXRhWyd5J11cblxuICAgICAgICBPYmplY3QuYXNzaWduKHksIHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyB5IH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGNsYXNzZXMudmFsdWVzKCkpLmpvaW4oJyAnKVxuICAgIH1cblxuICAgIHB1YmxpYyBjb21wdXRlU3R5bGVzKG9wdGlvbnM6IFN0eWxlc09wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIGNvbnN0IGJyZWFrcG9pbnQgPSBvcHRpb25zLmJyZWFrcG9pbnQgPz8gJ2Jhc2UnXG5cbiAgICAgICAgY29uc3QgeCA9IHRoaXMueFticmVha3BvaW50XSA/PyAwXG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLnlbYnJlYWtwb2ludF0gPz8gMFxuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy5jb2x1bW5zW2JyZWFrcG9pbnRdID8/IDFcbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMucm93c1ticmVha3BvaW50XSA/PyAxXG5cbiAgICAgICAgY29uc3QgY29sU2l6ZSA9IG9wdGlvbnMuY29udGlhbmVyV2lkdGggLyAxMlxuICAgICAgICBjb25zdCByb3dTaXplID0gREFTSEJPQVJEX1JPV19IRUlHSFRcblxuICAgICAgICBzdHlsZXMuc2V0KCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgICAgIHN0eWxlcy5zZXQoJ2xlZnQnLCBgJHt4ICogY29sU2l6ZX1weGApXG4gICAgICAgIHN0eWxlcy5zZXQoJ3RvcCcsIGAke3kgKiByb3dTaXplfXB4YClcbiAgICAgICAgc3R5bGVzLnNldCgnd2lkdGgnLCBgJHtjb2xzICogY29sU2l6ZSAtIDEwfXB4YCkgLy8gcGFkZGluZyBhbmQgc2Nyb2xsYmFyIGNvbXBlbnNhdGlvblxuICAgICAgICBzdHlsZXMuc2V0KCdoZWlnaHQnLCBgJHtyb3dzICogcm93U2l6ZX1weGApXG5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oc3R5bGVzLmVudHJpZXMoKSlcbiAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fTogJHt2YWx1ZX07YClcbiAgICAgICAgICAgIC5qb2luKCcgJylcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKHBheWxvYWQ6IFBhcnRpYWw8RGFzaGJvYXJkV2lkZ2V0RGF0YT4pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmRhdGEsIHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy5lbW1pdHRlci5lbWl0KCd3aWRnZXQ6dXBkYXRlZCcsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHNldE9wdGlvbihrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEub3B0aW9ucyB8fCB7fSkpXG5cbiAgICAgICAgc2V0KG9wdGlvbnMsIGtleSwgdmFsdWUpXG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyBvcHRpb25zIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHNldFgoYnJlYWtwb2ludDogJ2Jhc2UnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJywgdmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB4ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLngpKSBhcyBEYXNoYm9hcmRXaWRnZXREYXRhWyd4J11cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVsZXRlIHhbYnJlYWtwb2ludF1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB4W2JyZWFrcG9pbnRdID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgeCB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRZKGJyZWFrcG9pbnQ6ICdiYXNlJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy55KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsneSddXG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB5W2JyZWFrcG9pbnRdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgeVticmVha3BvaW50XSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZSh7IHkgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29sdW1uKGJyZWFrcG9pbnQ6ICdiYXNlJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jb2x1bW5zKSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsnY29sdW1ucyddXG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW5zW2JyZWFrcG9pbnRdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29sdW1uc1ticmVha3BvaW50XSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZSh7IGNvbHVtbnMgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Um93KGJyZWFrcG9pbnQ6ICdiYXNlJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5yb3dzKSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsncm93cyddXG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSByb3dzW2JyZWFrcG9pbnRdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcm93c1ticmVha3BvaW50XSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZSh7IHJvd3MgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgRW1taXR0ZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IERhc2hib2FyZFdpZGdldERhdGEgZnJvbSAnLi9EYXNoYm9hcmRXaWRnZXREYXRhJ1xuaW1wb3J0IERhc2hib2FyZFdpZGdldCBmcm9tICcuL0Rhc2hib2FyZFdpZGdldCdcbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkU2NoZW1hIH0gZnJvbSAnI3NoYXJlZC9zY2hlbWFzL2Rhc2hib2FyZFNjaGVtYS50cydcblxuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRPcHRpb25zIHtcbiAgICBkYXNoYm9hcmQ6IERhc2hib2FyZFNjaGVtYVxuICAgIHdpZGdldHM/OiBEYXNoYm9hcmRXaWRnZXREYXRhW11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkIHtcbiAgICBwdWJsaWMgbmFtZTogRGFzaGJvYXJkU2NoZW1hWyduYW1lJ10gPSAnJ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogRGFzaGJvYXJkU2NoZW1hWydkZXNjcmlwdGlvbiddID0gJydcbiAgICBwdWJsaWMgd2lkZ2V0czogRGFzaGJvYXJkV2lkZ2V0W10gPSBbXVxuICAgIHB1YmxpYyBlbW1pdHRlcjogRW1taXR0ZXJTZXJ2aWNlXG4gICAgcHVibGljIGNvbnRhaW5lcldpZHRoOiBudW1iZXIgPSAwXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbW1pdHRlciA9IG5ldyBFbW1pdHRlclNlcnZpY2UoKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXROYW1lKG5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbnRhaW5lcldpZHRoKHdpZHRoOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aCA9IHdpZHRoXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldFdpZGdldHMod2lkZ2V0czogRGFzaGJvYXJkV2lkZ2V0RGF0YVtdKSB7XG5cbiAgICAgICAgdGhpcy53aWRnZXRzID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IHcgb2Ygd2lkZ2V0cykge1xuICAgICAgICAgICAgY29uc3Qgd2lkZ2V0ID0gRGFzaGJvYXJkV2lkZ2V0LmZyb21EYXRhKHcpXG5cbiAgICAgICAgICAgIHdpZGdldC5zZXRFbW1pdHRlcih0aGlzLmVtbWl0dGVyKVxuXG4gICAgICAgICAgICB0aGlzLndpZGdldHMucHVzaCh3aWRnZXQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kTGFzdFJvdygpOiBudW1iZXIge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMCBcblxuICAgICAgICBmb3IgKGNvbnN0IHdpZGdldCBvZiB0aGlzLndpZGdldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB3aWRnZXQucm93cz8uYmFzZSA/PyAwXG4gICAgICAgICAgICBjb25zdCB5ID0gd2lkZ2V0Lnk/LmJhc2UgPz8gMFxuXG4gICAgICAgICAgICBjb25zdCBib3R0b20gPSB5ICsgcm93c1xuXG4gICAgICAgICAgICBpZiAoYm90dG9tID4gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYm90dG9tXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiByZXN1bHRcblxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRXaWRnZXQocGF5bG9hZDogUGFydGlhbDxEYXNoYm9hcmRXaWRnZXREYXRhPiA9IHt9KSB7XG4gICAgICAgIGlmICghcGF5bG9hZC5jb2x1bW5zKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmNvbHVtbnMgPSB7IGJhc2U6IDQsIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF5bG9hZC5yb3dzKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJvd3MgPSB7IGJhc2U6IDQsIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF5bG9hZC54KSB7XG4gICAgICAgICAgICBwYXlsb2FkLnggPSB7IGJhc2U6IDAsIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF5bG9hZC55KSB7XG4gICAgICAgICAgICBwYXlsb2FkLnkgPSB7IGJhc2U6IHRoaXMuZmluZExhc3RSb3coKSwgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBEYXNoYm9hcmRXaWRnZXREYXRhKHBheWxvYWQpXG5cbiAgICAgICAgY29uc3Qgd2lkZ2V0ID0gRGFzaGJvYXJkV2lkZ2V0LmZyb21EYXRhKGRhdGEpXG5cbiAgICAgICAgd2lkZ2V0LnNldEVtbWl0dGVyKHRoaXMuZW1taXR0ZXIpXG5cbiAgICAgICAgdGhpcy53aWRnZXRzLnB1c2god2lkZ2V0KVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVXaWRnZXQoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlV2lkZ2V0QnlJZChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMud2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5maWx0ZXIoKHcpID0+IHcuaWQgIT09IGlkKVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVXaWRnZXQoaW5kZXg6IG51bWJlciwgd2lkZ2V0OiBEYXNoYm9hcmRXaWRnZXQpIHtcbiAgICAgICAgdGhpcy53aWRnZXRzID0gdGhpcy53aWRnZXRzLm1hcCgodywgaSkgPT4gaSA9PT0gaW5kZXggPyB3aWRnZXQgOiB3KVxuICAgIH1cblxuICAgIHB1YmxpYyBkdXBsaWNhdGVXaWRnZXQoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBjb3B5OiBEYXNoYm9hcmRXaWRnZXQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMud2lkZ2V0c1tpbmRleF0pKVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBbLi4udGhpcy53aWRnZXRzXVxuXG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKGluZGV4ICsgMSwgMCwgY29weSlcbiAgICB9XG59XG4iLCJpbXBvcnQgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbiBmcm9tICcuL0Rhc2hib2FyZFdpZGdldERlZmluaXRpb24nXG5pbXBvcnQgdHlwZSBEYXNoYm9hcmRXaWRnZXREYXRhIGZyb20gJy4vRGFzaGJvYXJkV2lkZ2V0RGF0YSdcblxuLyoqXG4gICAgKiBDb21wb25lbnQgdG8gYmUgdXNlZCBmb3IgY2hhcnQgd2lkZ2V0cyBpbiB0aGUgZGFzaGJvYXJkLlxuICAgICogUGx1Z2lucyBjYW4gZXh0ZW5kIHRoaXMgY2xhc3MgdG8gY3JlYXRlIHRoZWlyIG93biBjaGFydCB3aWRnZXRzLlxuICAgICogQGV4YW1wbGVcbiAgICAqIGNsYXNzIE15Q2hhcnRXaWRnZXQgZXh0ZW5kcyBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uQ2hhcnQge1xuICAgICogICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICogICAgICAgICBzdXBlcigpXG4gICAgKiAgICAgICAgIHRoaXMubmFtZSA9ICdNeSBDaGFydCBXaWRnZXQnXG4gICAgKiAgICAgICAgIHRoaXMuaWQgPSAnbXktY2hhcnQtd2lkZ2V0J1xuICAgICogICAgIH1cbiAgICAqIH1cbiAgICAqL1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZFdpZGdldERlZmluaXRpb25DaGFydCBleHRlbmRzIERhc2hib2FyZFdpZGdldERlZmluaXRpb24ge1xuICAgIHByaXZhdGUgc3RhdGljIHJlbmRlcmVyOiBhbnkgXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLm5hbWUgPSAnQ2hhcnQnXG4gICAgICAgIHRoaXMuaWQgPSAnY2hhcnQnXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXRSZW5kZXJlcihyZW5kZXJlcjogYW55KSB7XG4gICAgICAgIERhc2hib2FyZFdpZGdldERlZmluaXRpb25DaGFydC5yZW5kZXJlciA9IHJlbmRlcmVyXG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIERhc2hib2FyZFdpZGdldERlZmluaXRpb25DaGFydC5yZW5kZXJlclxuICAgIH1cblxuICAgIC8vIHJldHVybiBjaGFydCBvcHRpb25zIGZvciB0aGUgY2hhcnQgd2lkZ2V0LiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBsdWdpbnMgdG8gcHJvdmlkZSBjdXN0b20gY2hhcnQgb3B0aW9ucy5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvIGJlIGV4dGVuZGVkIGxhdGVyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBhc3luYyBjaGFydE9wdGlvbnMocGF5bG9hZDogRGFzaGJvYXJkV2lkZ2V0RGF0YVsnb3B0aW9ucyddKTogUHJvbWlzZTxhbnk+e1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ3JpZDoge1xuICAgICAgICAgICAgICAgIGxlZnQ6ICczJScsXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICc0JScsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAnMyUnLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5MYWJlbDogdHJ1ZSBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aXRsZTogeyB0ZXh0OiAnRUNoYXJ0cyBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZScgfSxcbiAgICAgICAgICAgIHRvb2x0aXA6IHt9LFxuICAgICAgICAgICAgeEF4aXM6IHsgZGF0YTogWydzaGlydCcsICdjYXJkaWdhbicsICdjaGlmZm9uJywgJ3BhbnRzJywgJ2hlZWxzJywgJ3NvY2tzJ10gfSxcbiAgICAgICAgICAgIHlBeGlzOiB7fSxcbiAgICAgICAgICAgIHNlcmllczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NhbGVzJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFs1LCAyMCwgMzYsIDEwLCAxMCwgMjBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZSkge1xuICAgXG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cydcbmltcG9ydCByb3V0ZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL3JvdXRlci50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHR5cGUgeyBBdXRvT3B0aW9ucyB9IGZyb20gJyNjbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZSkge1xuICAgIHB1YmxpYyBhZGRQYWdlc0ZvbGRlcihpbXBvcnRzOiBhbnksIG9wdGlvbnM/OiBBdXRvT3B0aW9ucykge1xuICAgICAgICByb3V0ZXIuYXV0byhpbXBvcnRzLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBsb2FkIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkaXJlY3RvcnkgaWYgbmVlZGVkXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgYXV0byB9IGZyb20gJyNjbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcbmltcG9ydCB0eXBlIHsgQXV0b09wdGlvbnMgfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IERlZmluZUNvbXBvbmVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIHsgUm91dGVSZWNvcmRSYXcgfSBmcm9tICd2dWUtcm91dGVyJ1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGF1dG8gZnJvbSBSb3V0ZXJTZXJ2aWNlIGluc3RlYWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvUm91dGVzKFxuICAgIGltcG9ydHM6IFJlY29yZDxzdHJpbmcsIERlZmluZUNvbXBvbmVudCB8ICgoKSA9PiBQcm9taXNlPERlZmluZUNvbXBvbmVudD4pPixcbiAgICBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9XG4pOiBSb3V0ZVJlY29yZFJhd1tdIHtcbiAgICByZXR1cm4gYXV0byhpbXBvcnRzLCBvcHRpb25zKVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVDb2x1bW48VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBsYWJlbD86IHN0cmluZ1xuICAgIGZpZWxkPzoga2V5b2YgVCB8ICgocm93OiBUKSA9PiBhbnkpIHwgKHN0cmluZyAmIHt9KVxuICAgIHNvcnRhYmxlPzogYm9vbGVhblxuICAgIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb2x1bW5zPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+Pihjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW48VD5bXSkge1xuICAgIHJldHVybiBjb2x1bW5zXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIERlZmluZUZvcm1GaWVsZCB7XG4gICAgY29tcG9uZW50OlxuICAgICd0ZXh0LWZpZWxkJ1xuICAgIHwgJ3RleHRhcmVhJ1xuICAgIHwgJ3NlbGVjdCdcbiAgICB8ICdhdXRvY29tcGxldGUnXG4gICAgfCAnc3dpdGNoJ1xuICAgIHwgJ2ZpbGUtdXBsb2FkJ1xuICAgIHwgJ2ltYWdlLXVwbG9hZCdcbiAgICB8ICdjb2xvci1waWNrZXInXG4gICAgfCAnc3RyaW5nLWxpc3QtaW5wdXQnXG4gICAgfCAnanNvbi1pbnB1dCdcbiAgICB8ICdkYXRlLXBpY2tlcidcbiAgICB8ICdoaWRkZW4nXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVGb3JtRmllbGRzKGZpZWxkOiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVGb3JtRmllbGQ+KSB7XG4gICAgcmV0dXJuIGZpZWxkXG59XG5cbiIsImltcG9ydCAkb3JpZ2luYWwgZnJvbSBcIiNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzXCI7XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hlciBmYWNhZGUgKi9cbmV4cG9ydCBjb25zdCAkZmV0Y2ggPSAkb3JpZ2luYWw7XG4iLCJpbXBvcnQgeyAkZmV0Y2ggfSBmcm9tICcuL2ZldGNoZXInXG5cbmludGVyZmFjZSBQaWNrT3B0aW9ucyB7XG4gICAgYWNjZXB0Pzogc3RyaW5nXG4gICAgbXVsdGlwbGU/OiBib29sZWFuXG59XG5cbnR5cGUgUGlja1Jlc3VsdDxUIGV4dGVuZHMgUGlja09wdGlvbnM+ID0gVFsnbXVsdGlwbGUnXSBleHRlbmRzIHRydWUgPyBGaWxlW10gOiBGaWxlIHwgbnVsbFxuXG5mdW5jdGlvbiBwaWNrPFQgZXh0ZW5kcyBQaWNrT3B0aW9ucz4ob3B0aW9uczogVCk6IFByb21pc2U8UGlja1Jlc3VsdDxUPj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcblxuICAgICAgICBpbnB1dC50eXBlID0gJ2ZpbGUnXG4gICAgICAgIGlucHV0LmFjY2VwdCA9IG9wdGlvbnMuYWNjZXB0IHx8ICcqLyonXG4gICAgICAgIGlucHV0Lm11bHRpcGxlID0gb3B0aW9ucy5tdWx0aXBsZSB8fCBmYWxzZVxuXG4gICAgICAgIGlucHV0Lm9uY2hhbmdlID0gKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbSh0YXJnZXQuZmlsZXMgYXMgRmlsZUxpc3QpIGFzIEZpbGVbXVxuXG4gICAgICAgICAgICByZXNvbHZlKChvcHRpb25zLm11bHRpcGxlID8gQXJyYXkuZnJvbShmaWxlcykgOiBmaWxlc1swXSkgYXMgUGlja1Jlc3VsdDxUPilcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0Lm9uY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShvcHRpb25zLm11bHRpcGxlID8gW10gOiAobnVsbCBhcyBhbnkpKVxuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQuY2xpY2soKVxuICAgIH0pXG59XG5cbmZ1bmN0aW9uIHRvVWludDhBcnJheShmaWxlOiBGaWxlKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUudGFyZ2V0Py5yZXN1bHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoZS50YXJnZXQucmVzdWx0KSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIHJlYWQgZmlsZSBhcyBBcnJheUJ1ZmZlcicpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpXG4gICAgfSlcbn1cblxuaW50ZXJmYWNlIFVwbG9hZE9wdGlvbnMge1xuICAgIGRyaXZlSWQ6IHN0cmluZ1xuICAgIGZpbGU6IEZpbGVcbiAgICBkaXJlY3Rvcnk/OiBzdHJpbmdcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkKG9wdGlvbnM6IFVwbG9hZE9wdGlvbnMpe1xuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgIFxuICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgb3B0aW9ucy5maWxlKVxuXG4gICAgaWYgKG9wdGlvbnMuZGlyZWN0b3J5KSB7XG4gICAgICAgIGZvcm0uYXBwZW5kKCdkaXJlY3RvcnknLCBvcHRpb25zLmRpcmVjdG9yeSlcbiAgICB9XG5cbiAgICByZXR1cm4gJGZldGNoKGAvYXBpL2RyaXZlcy8ke29wdGlvbnMuZHJpdmVJZH0vdXBsb2FkYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZm9ybSxcbiAgICAgICAgcXVlcnk6IHsgZGlyZWN0b3J5OiBvcHRpb25zLmRpcmVjdG9yeSwgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCAkZmlsZSA9IHtcbiAgICBwaWNrLFxuICAgIHVwbG9hZCxcbiAgICB0b1VpbnQ4QXJyYXksXG59IiwiaW1wb3J0IHJvdXRlIGZyb20gJyNjbGllbnQvZmFjYWRlcy9yb3V0ZS50cycgXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRvKHRvOiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gdG9cblxuICAgIC8vIHJlcGxhY2UgOnBhcmFtIHdpdGggcm91dGUgcGFyYW0gdmFsdWVcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3V0ZS5wYXJhbXMpKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtUGxhY2Vob2xkZXIgPSBgOiR7a2V5fWBcblxuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShwYXJhbVBsYWNlaG9sZGVyLCBTdHJpbmcodmFsdWUpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cblxuIiwiaW1wb3J0IHsgdG9hc3QgfSBmcm9tICd2dWUtc29ubmVyJ1xuXG5leHBvcnQgY29uc3QgJHRvYXN0ID0gdG9hc3RcbiIsIlxuaW1wb3J0IHsgY2xzeCBhcyBvcmlnaW5hbENsc3ggfSBmcm9tICdjbHN4J1xuaW1wb3J0IHR5cGUgeyBDbGFzc1ZhbHVlIH0gZnJvbSAnY2xzeCdcbmltcG9ydCB7IHR3TWVyZ2UgYXMgb3JpZ2luYWxUd01lcmdlLCB0eXBlIENsYXNzTmFtZVZhbHVlIH0gZnJvbSAndGFpbHdpbmQtbWVyZ2UnXG5cbmV4cG9ydCBmdW5jdGlvbiB0d01lcmdlKC4uLmlucHV0czogQ2xhc3NOYW1lVmFsdWVbXSkge1xuICAgIHJldHVybiBvcmlnaW5hbFR3TWVyZ2UoaW5wdXRzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xzeCguLi5pbnB1dHM6IENsYXNzVmFsdWVbXSkge1xuICAgIHJldHVybiBvcmlnaW5hbENsc3goaW5wdXRzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY24oLi4uaW5wdXRzOiBDbGFzc1ZhbHVlW10pIHtcbiAgICByZXR1cm4gb3JpZ2luYWxUd01lcmdlKG9yaWdpbmFsQ2xzeChpbnB1dHMpKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQsIFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkIH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCBhdXRoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9hdXRoLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHdWFyZE9wdGlvbnMge1xuICAgIHJlZGlyZWN0OiBzdHJpbmcgfCAoKHRvOiBSb3V0ZUxvY2F0aW9uTm9ybWFsaXplZCkgPT4gc3RyaW5nKVxuICAgIGV4Y2x1ZGU/OiBzdHJpbmdbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXV0aEd1YXJkKG9wdGlvbnM6IEF1dGhHdWFyZE9wdGlvbnMpOiBOYXZpZ2F0aW9uR3VhcmQge1xuICAgIGNvbnN0IGV4Y2x1ZGUgPSBvcHRpb25zLmV4Y2x1ZGUgfHwgWycvYXV0aC9sb2dpbicsICcvYXV0aC9yZWdpc3RlciddXG5cbiAgICByZXR1cm4gKHRvKSA9PiB7XG5cbiAgICAgICAgaWYgKCFhdXRoLnVzZXIgJiYgIWV4Y2x1ZGUuaW5jbHVkZXModG8ucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0UGF0aCA9IHR5cGVvZiBvcHRpb25zLnJlZGlyZWN0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5yZWRpcmVjdCh0bykgOiBvcHRpb25zLnJlZGlyZWN0XG5cbiAgICAgICAgICAgIHJldHVybiByZWRpcmVjdFBhdGhcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgYXV0aEd1YXJkID0gY3JlYXRlQXV0aEd1YXJkKHtcbiAgICByZWRpcmVjdDogdG8gPT4gJy9hdXRoL2xvZ2luP3JlZGlyZWN0PScgKyBlbmNvZGVVUklDb21wb25lbnQodG8uZnVsbFBhdGgpLFxufSlcblxuZXhwb3J0IGRlZmF1bHQgYXV0aEd1YXJkXG4iLCJpbXBvcnQgYXV0aCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYXV0aC50cydcblxuZXhwb3J0IGludGVyZmFjZSBHdWVzdEd1YXJkT3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q6IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR3Vlc3RHdWFyZChvcHRpb25zOiBHdWVzdEd1YXJkT3B0aW9ucykge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChhdXRoLnVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnJlZGlyZWN0XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IGd1ZXN0R3VhcmQgPSBjcmVhdGVHdWVzdEd1YXJkKHtcbiAgICByZWRpcmVjdDogJy8nXG59KVxuXG5leHBvcnQgZGVmYXVsdCBndWVzdEd1YXJkXG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzU1LDU2XSwibWFwcGluZ3MiOiJzM0JBWUEsZUFBc0IsRUFBK0IsRUFBMkMsQ0FDNUYsR0FBSSxDQUVBLE1BQU8sQ0FBQyxLQURPLE1BQU0sR0FBTyxDQUNQLE9BQ2hCLEVBQU8sQ0FDWixNQUFPLENBQUMsRUFBYyxLQUFLLEVBSW5DLEVBQVMsS0FBTyxTQUEyQixFQUE2QixDQUNwRSxHQUFJLENBRUEsTUFBTyxDQUFDLEtBRE8sR0FBTyxDQUNELE9BQ2hCLEVBQU8sQ0FDWixNQUFPLENBQUMsRUFBYyxLQUFLLEdDakJuQyxJQUFxQixFQUFyQixLQUFrQyxDQUM5QixPQUFjLHNCQUF3QixlQUV0QyxNQUFnQixZQUFZLEVBQW9CLENBQzVDLEdBQUksRUFBUyxRQUFRLElBQUksZUFBZSxFQUFFLFNBQVMsT0FBTyxDQUFFLENBQ3hELElBQU0sRUFBTyxNQUFNLEVBQVMsTUFBTSxDQUM3QixXQUFhLENBQUUsUUFBUyxHQUFHLHdCQUF3QixDQUFFLEVBQUUsQ0FNNUQsT0FKSSxFQUFLLFNBQ0wsRUFBTSxNQUFNLEVBQUssUUFBUSxDQUd0QixFQUtYLE9BRkEsRUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsQ0FFakMsQ0FDSCxRQUFTLEdBQUcsd0JBQXdCLENBQ3ZDLENBR0wsU0FBbUIsRUFBYSxFQUFxQyxDQUNqRSxHQUFJLENBQUMsRUFDRCxPQUFPLEVBR1gsSUFBTSxFQUFjLEVBQUcsVUFB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
|