@arena-im/react-sdk-auth 1.14.0 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/index.d.ts +1 -0
- package/config/index.d.ts.map +1 -1
- package/config/runtime-environment.d.ts +4 -0
- package/config/runtime-environment.d.ts.map +1 -0
- package/context/anonymous-token-provider.d.ts.map +1 -1
- package/context/config-provider.d.ts.map +1 -1
- package/index.d.ts +1 -1
- package/index.esm.js +2 -2
- package/index.umd.js +2 -2
- package/package.json +1 -1
- package/services/auth/use-auth-services.d.ts +1 -0
- package/services/auth/use-auth-services.d.ts.map +1 -1
- package/utils/authenticated-request.d.ts.map +1 -1
package/index.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{createContext as n,useContext as o,useState as r,useRef as i,useEffect as s,useCallback as a}from"react";import{useMutation as c,QueryClient as u,QueryClientProvider as l}from"@tanstack/react-query";import{create as d}from"zustand";import{subscribeWithSelector as p}from"zustand/middleware";import h from"js-cookie";import{jwtDecode as k}from"jwt-decode";const f=n(void 0),T=({children:t})=>{const[n,o]=r(!1),[i,s]=r(void 0),[a,c]=r(void 0),[u,l]=r(void 0),[d,p]=r(void 0),[h,k]=r(void 0);return e(f.Provider,{value:{isOpen:n,appName:i,language:h,appDescription:a,trackOptions:d,onAuthCompleted:u,openDialog:({trackOptions:e,appName:t,language:n,appDescription:r,onAuthCompleted:i})=>{o(!0),p(e),s(t),k(n),c(r),l(i)},closeDialog:()=>o(!1),onOpenChange:e=>o(e)},children:t})},m=()=>{const e=o(f);if(!e)throw new Error("useAuthDialog must be used within an AuthDialogProvider");return e},g=e=>{const t="development"===e;return{profileServiceUrl:t?"https://profile-service-dev.arena.im":"https://profile-service-prd.arena.im",identityServiceUrl:t?"https://token-service-dev.arena.im":"https://token-service-prd.arena.im",refreshTokenApiKey:t?"AIzaSyCJhWFCK3ics9kJ2eSgQD7kWHUsOsJyPdk":"AIzaSyD_a4tNVdFVqgGbTfOGCaZ5pvUHErcE79c",authIframeUrl:t?"https://auth2.dev.arena.im":"https://auth2.arena.im",environment:e,debug:"development"===e}},y=n(void 0),U=({children:t,environment:n="development"})=>{const o=g(n);return e(y.Provider,{value:{config:o,environment:n},children:t})},w=()=>{const e=o(y);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},S={"Content-Type":"application/json"};async function E(e,t,n={}){const o=await fetch(t,{...n,method:e,headers:{"Content-Type":"application/json",...n.headers}});if(!o.ok)throw new Error(`Error: ${o.statusText}`);return o.json()}var I,v;!function(e){e.ANONYMOUS="anonymous",e.GUEST="guest",e.PUBLIC="public",e.CUSTOM="custom"}(I||(I={})),function(e){e.PUBLIC_ID_TOKEN="arena-auth-public-id-token",e.PUBLIC_REFRESH_TOKEN="arena-auth-public-refresh-token",e.ANONYMOUS_ID_TOKEN="arena-auth-anonymous-id-token",e.GUEST_ID_TOKEN="arena-auth-guest-id-token",e.CUSTOM_ID_TOKEN="arena-auth-custom-id-token",e.CUSTOM_USER="arena-auth-custom-user"}(v||(v={}));const _="arena-auth-token-updated";function O(e,t){document.dispatchEvent(new CustomEvent(_,{detail:{...t,type:e}}))}const P={public:{idToken:h.get(v.PUBLIC_ID_TOKEN)||null,refreshToken:h.get(v.PUBLIC_REFRESH_TOKEN)||null},anonymous:{idToken:h.get(v.ANONYMOUS_ID_TOKEN)||null},guest:{idToken:h.get(v.GUEST_ID_TOKEN)||null},custom:{idToken:h.get(v.CUSTOM_ID_TOKEN)||null}},C=d()(p((e,t)=>{const n=(n,o,r=!0,i)=>{n===t().tokens.public.idToken&&o===t().tokens.public.refreshToken||(e(e=>({tokens:{...e.tokens,public:{idToken:n,refreshToken:o}}})),h.set(v.PUBLIC_ID_TOKEN,n,{expires:1/24}),h.set(v.PUBLIC_REFRESH_TOKEN,o,{expires:30}),r&&O(I.PUBLIC,{idToken:n,refreshToken:o,source:i}))},o=(n,o=!0,r)=>{n!==t().tokens.anonymous.idToken&&(e(e=>({tokens:{...e.tokens,anonymous:{idToken:n}}})),h.set(v.ANONYMOUS_ID_TOKEN,n,{expires:1/24}),o&&O(I.ANONYMOUS,{idToken:n,source:r}))},r=(n,o=!0,r)=>{n!==t().tokens.guest.idToken&&(e(e=>({tokens:{...e.tokens,guest:{idToken:n}}})),h.set(v.GUEST_ID_TOKEN,n,{expires:1/24}),o&&O(I.GUEST,{idToken:n,source:r}))},i=(n,o=!0,r)=>{n!==t().tokens.custom.idToken&&(e(e=>({tokens:{...e.tokens,custom:{idToken:n}}})),h.set(v.CUSTOM_ID_TOKEN,n),o&&O(I.CUSTOM,{idToken:n,source:r}))},s=(t=!0,n)=>{h.remove(v.PUBLIC_ID_TOKEN),h.remove(v.PUBLIC_REFRESH_TOKEN),e(e=>({tokens:{...e.tokens,public:{idToken:null,refreshToken:null}}})),t&&O(I.PUBLIC,{idToken:null,source:n})},a=(t=!0,n)=>{h.remove(v.ANONYMOUS_ID_TOKEN),e(e=>({tokens:{...e.tokens,anonymous:{idToken:null}}})),t&&O(I.ANONYMOUS,{idToken:null,source:n})},c=(t=!0,n)=>{h.remove(v.GUEST_ID_TOKEN),e(e=>({tokens:{...e.tokens,guest:{idToken:null}}})),t&&O(I.GUEST,{idToken:null,source:n})},u=(t=!0,n)=>{h.remove(v.CUSTOM_ID_TOKEN),localStorage.removeItem(v.CUSTOM_ID_TOKEN),localStorage.removeItem(v.CUSTOM_USER),e(e=>({tokens:{...e.tokens,custom:{idToken:null}}})),t&&O(I.CUSTOM,{idToken:null,source:n})};return{tokens:P,getToken:e=>t().tokens[e]?.idToken||null,getMostPrivilegedToken:(e=[I.PUBLIC,I.GUEST,I.ANONYMOUS])=>t().tokens.custom.idToken&&e.includes(I.CUSTOM)?{type:I.CUSTOM,idToken:t().tokens.custom.idToken}:t().tokens.public.idToken&&e.includes(I.PUBLIC)?{type:I.PUBLIC,idToken:t().tokens.public.idToken}:t().tokens.guest.idToken&&e.includes(I.GUEST)?{type:I.GUEST,idToken:t().tokens.guest.idToken}:t().tokens.anonymous.idToken&&e.includes(I.ANONYMOUS)?{type:I.ANONYMOUS,idToken:t().tokens.anonymous.idToken}:null,getRefreshToken:e=>t().tokens[e]?.refreshToken||null,updatePublicTokens:(e,t,o)=>{n(e,t,!0,o)},updateAnonymousToken:(e,t)=>{o(e,!0,t)},updateGuestTokens:(e,t)=>{r(e,!0,t)},updateCustomToken:(e,t)=>{i(e,!0,t)},clearTokens:e=>{s(!0,e),a(!0,e),c(!0,e),u(!0,e)},clearPublicTokens:e=>{s(!0,e)},clearAnonymousTokens:e=>{a(!0,e)},clearGuestTokens:e=>{c(!0,e)},clearCustomTokens:e=>{u(!0,e)},silentUpdatePublicTokens:(e,t)=>{n(e,t,!1)},silentUpdateAnonymousToken:e=>{o(e,!1)},silentUpdateGuestTokens:e=>{r(e,!1)},silentUpdateCustomToken:e=>{i(e,!1)},silentClearPublicTokens:()=>{s(!1)},silentClearAnonymousTokens:()=>{a(!1)},silentClearGuestTokens:()=>{c(!1)},silentClearCustomTokens:()=>{u(!1)}}}));function N(){const e=C(e=>e.silentUpdatePublicTokens),t=C(e=>e.silentUpdateAnonymousToken),n=C(e=>e.silentUpdateGuestTokens),o=C(e=>e.silentUpdateCustomToken),r=C(e=>e.clearTokens),a=C(e=>e.silentClearPublicTokens),c=C(e=>e.silentClearAnonymousTokens),u=C(e=>e.silentClearGuestTokens),l=C(e=>e.silentClearCustomTokens),d=i(`widget-${Math.random().toString(36).substr(2,9)}`);return s(()=>{const r=r=>{const{idToken:i,refreshToken:s,type:p,source:h}=r.detail;if(h!==d.current)switch(p){case I.PUBLIC:if(i){if(!s)throw new Error("Refresh token is required for public tokens");e(i,s)}else a();break;case I.ANONYMOUS:i?t(i):c();break;case I.GUEST:i?n(i):u();break;case I.CUSTOM:i?o(i):l()}};return document.addEventListener(_,r),()=>{document.removeEventListener(_,r)}},[e,t,n,o,r,a,c,u,l]),{eventSource:d.current}}function b(){const e=C(e=>e.getToken),t=C(e=>e.getMostPrivilegedToken),n=C(e=>e.getRefreshToken),o=C(e=>e.updatePublicTokens),r=C(e=>e.updateAnonymousToken),i=C(e=>e.updateGuestTokens),s=C(e=>e.updateCustomToken),a=C(e=>e.clearTokens),c=C(e=>e.clearPublicTokens),u=C(e=>e.clearCustomTokens),{eventSource:l}=N();return{getToken:e,getMostPrivilegedToken:t,getRefreshToken:n,updatePublicTokens:(e,t)=>o(e,t,l),updateAnonymousToken:e=>r(e,l),updateGuestTokens:e=>i(e,l),updateCustomToken:e=>s(e,l),clearTokens:()=>a(l),clearPublicTokens:()=>c(l),clearCustomTokens:()=>u(l)}}function A(e){return C(t=>t.tokens[e])}function x(e){return C(t=>t.tokens[e]?.idToken)}function L(e){return C(t=>t.tokens[e]?.refreshToken)}var D,R;function K(){const e=A(I.PUBLIC),{refreshPublicTokens:t}=F(),{config:n}=w(),o=n.profileServiceUrl;return{getPublicProfile:async function(e){const t=`${o}/public/users/${e}/profile?fields=bio,photoURL,displayName,location,handle`;return await E("GET",t)},updatePublicProfile:async function(r){const i=`${o}/me/profile/personal`;await async function(e){const{method:t,url:n,options:o={},token:r}=e;if(!r)throw new Error("No authentication token found");const i={...S,...o.headers,Authorization:`Bearer ${r}`},s={...o,method:t,headers:i},a=await fetch(n,s);if(!a.ok){const e=await a.text();if(!e)throw new Error(`Error to process request - ${a.status}`);const{errors:t}=JSON.parse(e)||{};throw new Error(t?.[0]||"Internal server error")}const c=a.headers.get("content-type");if(!c||!c.includes("application/json"))return a;const u=await a.text();if(!u)return null;try{return JSON.parse(u)}catch(e){throw console.error(e),new Error("Invalid JSON response from server")}}({method:"PUT",url:i,options:{body:JSON.stringify(r)},token:e.idToken}),t({refreshTokenApiKey:n.refreshTokenApiKey})}}}!function(e){e.AvatarProfile="avatar-profile",e.AvatarChat="avatar-chat",e.Comments="comments",e.GlobalProfile="global-profile",e.GroupChat="group-chat",e.Polls="polls",e.UniversalSnippet="universal-snippet"}(D||(D={})),function(e){e.AuthenticationCompleted="Authentication Completed",e.AuthenticationStarted="Authentication Started",e.AuthenticationViewed="Authentication Viewed"}(R||(R={}));const B=d()(p((e,t)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:t=>{e({user:t})},setPublicProfile:t=>{e({publicProfile:t})},setUserByTokenId:t=>{try{const n=k(t),o={uid:n.user_id,displayName:n.safeDisplayName,email:n.email,photoURL:n.safePhotoURL,handle:n.handle};e({user:o})}catch(e){console.error(e)}},logout:()=>{try{const t=C.getState();t.clearPublicTokens(),t.clearCustomTokens(),e({user:null}),document.dispatchEvent(new Event("arena-comments-logout"))}catch(e){console.error(e)}},refreshPublicTokens:async e=>{try{const n=h.get(v.PUBLIC_REFRESH_TOKEN);if(!n)throw new Error("No refresh token found");const o=`${"https://securetoken.googleapis.com/v1/token?key="}${e.refreshTokenApiKey}`,r=await fetch(o,{method:"POST",body:new URLSearchParams({refresh_token:n,grant_type:"refresh_token"})}),i=await r.json(),{setUserByTokenId:s}=t();s(i.id_token);C.getState().updatePublicTokens(i.id_token,i.refresh_token)}catch(e){console.error(e);const{logout:n}=t();n()}},loadStoredUser:async n=>{const o=h.get(v.PUBLIC_ID_TOKEN),r=h.get(v.PUBLIC_REFRESH_TOKEN),i=localStorage.getItem(v.CUSTOM_ID_TOKEN),s=localStorage.getItem(v.CUSTOM_USER);if(i&&s){const t=JSON.parse(s);e({user:t});C.getState().updateCustomToken(i)}else if(o){const{setUserByTokenId:e}=t();e(o)}else if(r&&n){const{refreshPublicTokens:e}=t();await e(n)}e({refreshedTokenLoaded:!0})},ssoV2Exchange:async(e,n,o)=>{try{const r=g(o??"production"),i=`${r.profileServiceUrl}/sso/sources/${e}/user`,s=await E("POST",i,{body:JSON.stringify({signedUserData:n})});if(s){const e=k(s.token),{setUser:n,setPublicProfile:o}=t();n({uid:e?.sub,email:e?.email,displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle}),o({displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle});C.getState().updateCustomToken(s.token)}return s}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function M(){return B(e=>e.user)}function $(){return B(e=>e.publicProfile)}function G(){return B(e=>e.refreshedTokenLoaded)}function F(){return{setUser:B(e=>e.setUser),setPublicProfile:B(e=>e.setPublicProfile),logout:B(e=>e.logout),refreshPublicTokens:B(e=>e.refreshPublicTokens),setUserByTokenId:B(e=>e.setUserByTokenId),loadStoredUser:B(e=>e.loadStoredUser),ssoV2Exchange:B(e=>e.ssoV2Exchange)}}function J(){const{updatePublicProfile:e}=K();return{updatePublicProfile:e}}function j(){return{user:B(e=>e.user),publicProfile:B(e=>e.publicProfile),refreshedTokenLoaded:B(e=>e.refreshedTokenLoaded)}}function z({children:e}){const{config:t}=w(),n=M(),{setPublicProfile:o,loadStoredUser:r}=F(),{getPublicProfile:i}=K(),{mutateAsync:u}=c({mutationFn:i}),l=a(async()=>{if(n?.uid){const e=await u(n.uid);o(e)}},[n?.uid,u,o]);return s(()=>{l()},[l]),s(()=>{r(t)},[t,r]),e}const H="arenaAnonymousId",Y="rs_anonymous_id",V="rs_initial_referrer",q="rs_initial_referring_domain";function W(){const e=localStorage.getItem(Y);if(e)return e;const t=crypto.randomUUID();return localStorage.setItem(Y,t),t}function Z(e){const t={};return["utm_source","utm_medium","utm_campaign","utm_term","utm_content"].forEach(n=>{const o=e.searchParams.get(n);o&&(t[n]=o)}),Object.keys(t).length?t:void 0}function Q(){const e=window,t=document,n=window.screen,o=new URL(e.location.href);!function(){if(!localStorage.getItem(V)){const e=document.referrer||"$direct",t="$direct"!==e?new URL(e).hostname:"";localStorage.setItem(V,e),localStorage.setItem(q,t)}}();const r=localStorage.getItem(V)||"$direct",i=localStorage.getItem(q)||"";return{channel:"web",anonymousId:W(),locale:navigator.language,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,os:{name:navigator.platform,version:void 0},page:{path:o.pathname,referrer:t.referrer||"$direct",referring_domain:t.referrer?new URL(t.referrer).hostname:"",search:o.search,title:t.title,url:o.toString(),initial_referrer:r,initial_referring_domain:i},screen:{density:e.devicePixelRatio||1,height:n.height,width:n.width,innerHeight:e.innerHeight,innerWidth:e.innerWidth},campaign:Z(o)}}function X(e={}){const t={};e.userId&&(t.userId=e.userId);let n=null;try{n=localStorage.getItem(H)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(H,e.anonymousId)}catch(e){console.warn("Failed to save anonymousId to localStorage:",e)}}else if(n)t.anonymousId=n;else{const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)});t.anonymousId=e;try{localStorage.setItem(H,e)}catch(e){console.warn("Failed to save new anonymousId to localStorage:",e)}}return t}function ee(){const e=document.querySelector('link[rel="canonical"]');return function(e){try{const t=new URL(e);return t.search="",t.href}catch(t){return console.error("Error clearing search params from URL:",t),e}}(e?.href||window.location.href)}function te(e,t,n){return{properties:{widget_type:e,url:window.location.href,domain:window.location.hostname,title:window.document.title,canonical_url:ee(),snippet_id:window.__ARENA__?.snippetId||null,...t},context:Q(),timestamp:(new Date).toISOString(),integrations:{All:!0},...X(n)}}function ne(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function oe(e){return a((t,n,o)=>{if(!e)return;const r=(i=e.rsWriteKey,s=e.rsDataPlaneUrl,{page:async(e,t,n)=>{const o=await fetch(`${s}/v1/page`,{method:"POST",headers:ne(i),body:JSON.stringify({type:"page",...te(e,t,n)})});if(o.ok)return await o.text();throw new Error("Failed to send page event to Rudderstack")},track:async(e,t,n,o)=>{const r=await fetch(`${s}/v1/track`,{method:"POST",headers:ne(i),body:JSON.stringify({event:t,type:"track",...te(e,n,o)})});if(r.ok)return await r.text();throw new Error("Failed to send track event to Rudderstack")}});var i,s;const a={site_id:e.siteId,widget_id:e.widgetId,trigger:e.trigger,...o};r.track(e.widgetType,t,a,n?{userId:n}:void 0)},[e])}function re(){const{appName:t,appDescription:n,language:o,trackOptions:r,isOpen:i,closeDialog:a,onAuthCompleted:c}=m(),u=t||"Arena AI Chat",l=n||"Arena AI Chat",{setUser:d}=F(),{updatePublicTokens:p}=b(),{config:h}=w(),k=oe(r),f=`${h.authIframeUrl}/?app-name=${u}&app-description=${l}&language=${o??"en"}`;return s(()=>{const e=e=>{if("arena-authentication"===e.data?.source)if("canceled"!==e.data?.type)if("authentication-viewed"!==e.data?.type){if("authentication-started"===e.data?.type){const{authType:t}=e.data?.payload||{};return void k(R.AuthenticationStarted,void 0,{authType:t})}if("authentication-completed"===e.data?.type){const{idToken:t,refreshToken:n,user:o,authType:r,isSignup:i}=e.data?.payload||{};return o?(k(R.AuthenticationCompleted,o.uid,{is_signup:i,auth_type:r}),c?.(o),p(t,n),d(o),void a()):void console.error("Authentication completed but user data is missing")}}else k(R.AuthenticationViewed);else a()};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[d,p,c,k,a]),i?e("iframe",{src:f,title:"Arena Authentication",style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",zIndex:9999999999}}):null}function ie({children:e}){const t=C(e=>e.tokens),n=C(e=>e.updateAnonymousToken),{getAnonymousIdentityToken:o}=function(){const{config:e}=w(),t=e.identityServiceUrl;return{getAnonymousIdentityToken:async function(){const e=`${t}/anonymous-token`;return await E("POST",e)}}}();return s(()=>{t.anonymous.idToken||o().then(e=>{n(e.access_token)})},[t.anonymous.idToken,n,o]),e}function se({children:n,queryClient:o,environment:r}){return o=o||new u,e(l,{client:o,children:e(U,{environment:r,children:e(z,{children:e(T,{children:t(ie,{children:[n,e(re,{})]})})})})})}function ae(){const e="undefined"!=typeof process&&"production"===process.env?.NODE_ENV?"production":"development";return g(e).refreshTokenApiKey}const ce={"Content-Type":"application/json"};let ue=null;async function le(){if(ue)return ue;const e=B.getState();return ue=e.refreshPublicTokens({refreshTokenApiKey:ae()}).finally(()=>{ue=null}),ue}async function de(e,t,n={}){async function o(){const o=await async function(e,t,n={}){const o=h.get(v.PUBLIC_ID_TOKEN);if(!o)throw new Error("No authentication token found");const r={...ce,...n.headers,Authorization:`Bearer ${o}`},i={...n,method:e,headers:r};return fetch(t,i)}(e,t,n);if(o.ok)return async function(e){const t=e.headers.get("content-type");if(!t||!t.includes("application/json"))return e;const n=await e.text();if(!n)return null;try{return JSON.parse(n)}catch(e){throw console.error({error:e}),new Error("Invalid JSON response from server")}}(o);const r=await o.text();if(!r)throw new Error(`Failed to process request - ${o.status}`);if(401===o.status){const e=new Error("Unauthorized");throw e.status=401,e}!function(e,t){let n;try{const e=JSON.parse(t);n=e?.errors?.[0]||t||"Internal server error"}catch{n=t||"Internal server error"}throw new Error(n)}(0,r)}if(!h.get(v.PUBLIC_ID_TOKEN)){if(h.get(v.PUBLIC_REFRESH_TOKEN))return await le(),await o();throw new Error("No authentication token found")}try{return await o()}catch(e){if(!(e instanceof Error&&"status"in e&&401===e.status))throw e;if(!h.get(v.PUBLIC_REFRESH_TOKEN))throw new Error("Unauthorized");await le();try{return await o()}catch(e){if(e instanceof Error&&"status"in e&&401===e.status)throw new Error("Unauthorized");throw e}}}export{R as AnalyticsEvent,D as AnalyticsWidgetType,v as AuthCookie,se as AuthProvider,I as TokenType,de as authenticatedRequest,m as useAuthDialog,$ as usePublicProfile,L as useRefreshToken,G as useRefreshedTokenLoaded,A as useToken,N as useTokenEventListener,C as useTokenStore,x as useTokenValue,b as useTokens,J as useUpdateProfile,M as useUser,F as useUserActions,B as useUserStore,j as useUserWithProfile};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vc3JjL3R5cGVzL3Rva2VuLnRzIiwiLi4vc3JjL3V0aWxzL2RvbS1ldmVudHMudHMiLCIuLi9zcmMvc3RvcmVzL3Rva2VuLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lci50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW5zLnRzIiwiLi4vc3JjL3R5cGVzL2FuYWx5dGljcy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzLnRzIiwiLi4vc3JjL3N0b3Jlcy91c2VyLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS11c2VyLnRzIiwiLi4vc3JjL2NvbnRleHQvdXNlci1wcm92aWRlci50c3giLCIuLi9zcmMvdXRpbHMvYW5hbHl0aWNzLnRzIiwiLi4vc3JjL3V0aWxzL3VybC50cyIsIi4uL3NyYy9ob29rcy91c2UtdHJhY2sudHMiLCIuLi9zcmMvZGlhbG9nL2luZGV4LnRzeCIsIi4uL3NyYy9jb250ZXh0L2Fub255bW91cy10b2tlbi1wcm92aWRlci50c3giLCIuLi9zcmMvc2VydmljZXMvYXV0aC91c2UtYXV0aC1zZXJ2aWNlcy50cyIsIi4uL3NyYy9jb250ZXh0L2luZGV4LnRzeCIsIi4uL3NyYy91dGlscy9hdXRoZW50aWNhdGVkLXJlcXVlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlU3RhdGUsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFVzZXJQcm9wcyB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgVHJhY2tPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuaW50ZXJmYWNlIEF1dGhEaWFsb2dDb250ZXh0VHlwZSB7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgYXBwTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBhcHBEZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cmFja09wdGlvbnM6IFRyYWNrT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgb25BdXRoQ29tcGxldGVkOiAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIG9wZW5EaWFsb2c6IChvcHRpb25zOiBPcGVuRGlhbG9nT3B0aW9ucykgPT4gdm9pZDtcbiAgY2xvc2VEaWFsb2c6ICgpID0+IHZvaWQ7XG4gIG9uT3BlbkNoYW5nZTogKG9wZW46IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IEF1dGhEaWFsb2dDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxBdXRoRGlhbG9nQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KFxuICB1bmRlZmluZWRcbik7XG5cbnR5cGUgT3BlbkRpYWxvZ09wdGlvbnMgPSB7XG4gIHRyYWNrT3B0aW9uczogVHJhY2tPcHRpb25zO1xuICBhcHBOYW1lPzogc3RyaW5nO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgYXBwRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG9uQXV0aENvbXBsZXRlZD86ICgpID0+ICh1c2VyOiBVc2VyUHJvcHMpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgY29uc3QgQXV0aERpYWxvZ1Byb3ZpZGVyID0gKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pID0+IHtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2FwcE5hbWUsIHNldEFwcE5hbWVdID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBjb25zdCBbYXBwRGVzY3JpcHRpb24sIHNldEFwcERlc2NyaXB0aW9uXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIGNvbnN0IFtvbkF1dGhDb21wbGV0ZWQsIHNldE9uQXV0aENvbXBsZXRlZF0gPSB1c2VTdGF0ZTxcbiAgICAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBjb25zdCBbdHJhY2tPcHRpb25zLCBzZXRUcmFja09wdGlvbnNdID0gdXNlU3RhdGU8VHJhY2tPcHRpb25zIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgW2xhbmd1YWdlLCBzZXRMYW5ndWFnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBjb25zdCBvcGVuRGlhbG9nID0gKHtcbiAgICB0cmFja09wdGlvbnMsXG4gICAgYXBwTmFtZSxcbiAgICBsYW5ndWFnZSxcbiAgICBhcHBEZXNjcmlwdGlvbixcbiAgICBvbkF1dGhDb21wbGV0ZWQsXG4gIH06IE9wZW5EaWFsb2dPcHRpb25zKSA9PiB7XG4gICAgc2V0SXNPcGVuKHRydWUpO1xuICAgIHNldFRyYWNrT3B0aW9ucyh0cmFja09wdGlvbnMpO1xuICAgIHNldEFwcE5hbWUoYXBwTmFtZSk7XG4gICAgc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpO1xuICAgIHNldEFwcERlc2NyaXB0aW9uKGFwcERlc2NyaXB0aW9uKTtcbiAgICBzZXRPbkF1dGhDb21wbGV0ZWQob25BdXRoQ29tcGxldGVkKTtcbiAgfTtcblxuICBjb25zdCBjbG9zZURpYWxvZyA9ICgpID0+IHNldElzT3BlbihmYWxzZSk7XG4gIGNvbnN0IG9uT3BlbkNoYW5nZSA9IChvcGVuOiBib29sZWFuKSA9PiBzZXRJc09wZW4ob3Blbik7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXJcbiAgICAgIHZhbHVlPXt7XG4gICAgICAgIGlzT3BlbixcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIGFwcERlc2NyaXB0aW9uLFxuICAgICAgICB0cmFja09wdGlvbnMsXG4gICAgICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgICAgICAgb3BlbkRpYWxvZyxcbiAgICAgICAgY2xvc2VEaWFsb2csXG4gICAgICAgIG9uT3BlbkNoYW5nZSxcbiAgICAgIH19XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQXV0aERpYWxvZyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQXV0aERpYWxvZ0NvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUF1dGhEaWFsb2cgbXVzdCBiZSB1c2VkIHdpdGhpbiBhbiBBdXRoRGlhbG9nUHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iLCJleHBvcnQgaW50ZXJmYWNlIENvbmZpZyB7XG4gIHByb2ZpbGVTZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIGlkZW50aXR5U2VydmljZVVybDogc3RyaW5nO1xuICByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZztcbiAgYXV0aElmcmFtZVVybDogc3RyaW5nO1xuICBlbnZpcm9ubWVudDogJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJztcbiAgZGVidWc6IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50ID0gJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJztcblxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9IChlbnZpcm9ubWVudDogRW52aXJvbm1lbnQpOiBDb25maWcgPT4ge1xuICBjb25zdCBpc0RldiA9IGVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnO1xuXG4gIHJldHVybiB7XG4gICAgcHJvZmlsZVNlcnZpY2VVcmw6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LlBST0ZJTEVfU0VSVklDRV9VUkxfREVWIHx8XG4gICAgICAgICdodHRwczovL3Byb2ZpbGUtc2VydmljZS1kZXYuYXJlbmEuaW0nXG4gICAgICA6IHByb2Nlc3MuZW52LlBST0ZJTEVfU0VSVklDRV9VUkxfUFJEIHx8XG4gICAgICAgICdodHRwczovL3Byb2ZpbGUtc2VydmljZS1wcmQuYXJlbmEuaW0nLFxuICAgIGlkZW50aXR5U2VydmljZVVybDogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuSURFTlRJVFlfU0VSVklDRV9VUkxfREVWIHx8XG4gICAgICAgICdodHRwczovL3Rva2VuLXNlcnZpY2UtZGV2LmFyZW5hLmltJ1xuICAgICAgOiBwcm9jZXNzLmVudi5JREVOVElUWV9TRVJWSUNFX1VSTF9QUkQgfHxcbiAgICAgICAgJ2h0dHBzOi8vdG9rZW4tc2VydmljZS1wcmQuYXJlbmEuaW0nLFxuICAgIHJlZnJlc2hUb2tlbkFwaUtleTogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuRklSRUJBU0VfUFVCTElDX0FQSV9LRVlfREVWIHx8XG4gICAgICAgICdBSXphU3lDSmhXRkNLM2ljczlrSjJlU2dRRDdrV0hVc09zSnlQZGsnXG4gICAgICA6IHByb2Nlc3MuZW52LkZJUkVCQVNFX1BVQkxJQ19BUElfS0VZX1BSRCB8fFxuICAgICAgICAnQUl6YVN5RC05dFNyUVduNzNTMHFtNkJxRUg1LTEySHE4TDBlVHNRJyxcbiAgICBhdXRoSWZyYW1lVXJsOiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5BVVRIX0lGUkFNRV9VUkxfREVWIHx8ICdodHRwczovL2F1dGgyLmRldi5hcmVuYS5pbSdcbiAgICAgIDogcHJvY2Vzcy5lbnYuQVVUSF9JRlJBTUVfVVJMX1BSRCB8fCAnaHR0cHM6Ly9hdXRoMi5hcmVuYS5pbScsXG4gICAgZW52aXJvbm1lbnQsXG4gICAgZGVidWc6IGVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnLFxuICB9O1xufTtcbiIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldENvbmZpZywgRW52aXJvbm1lbnQsIENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmludGVyZmFjZSBDb25maWdDb250ZXh0VHlwZSB7XG4gIGNvbmZpZzogQ29uZmlnO1xuICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG59XG5cbmNvbnN0IENvbmZpZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PENvbmZpZ0NvbnRleHRUeXBlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG5pbnRlcmZhY2UgQ29uZmlnUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGVudmlyb25tZW50PzogRW52aXJvbm1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBDb25maWdQcm92aWRlciA9ICh7XG4gIGNoaWxkcmVuLFxuICBlbnZpcm9ubWVudCA9ICdkZXZlbG9wbWVudCcsXG59OiBDb25maWdQcm92aWRlclByb3BzKSA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZyhlbnZpcm9ubWVudCk7XG5cbiAgcmV0dXJuIChcbiAgICA8Q29uZmlnQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17eyBjb25maWcsIGVudmlyb25tZW50IH19PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQ29uZmlnQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VDb25maWcgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUNvbmZpZyBtdXN0IGJlIHVzZWQgd2l0aGluIGEgQ29uZmlnUHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iLCJjb25zdCBkZWZhdWx0SGVhZGVycyA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXF1ZXN0KFxuICBtZXRob2Q6IHN0cmluZyxcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge31cbikge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWN1cmVkUmVxdWVzdChwYXJhbXM6IHtcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBvcHRpb25zOiBSZXF1ZXN0SW5pdDtcbiAgdG9rZW46IHN0cmluZztcbn0pIHtcbiAgY29uc3QgeyBtZXRob2QsIHVybCwgb3B0aW9ucyA9IHt9LCB0b2tlbiB9ID0gcGFyYW1zO1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xuICB9XG5cbiAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAuLi5kZWZhdWx0SGVhZGVycyxcbiAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gIH07XG5cbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICB9O1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBwYXlsb2FkKTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgdG8gcHJvY2VzcyByZXF1ZXN0IC0gJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBlcnJvcnMgfSA9IEpTT04ucGFyc2UodGV4dCkgfHwge307XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3JzPy5bMF0gfHwgJ0ludGVybmFsIHNlcnZlciBlcnJvcic7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gIH1cblxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgaWYgKCFjb250ZW50VHlwZSB8fCAhY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSlNPTiByZXNwb25zZSBmcm9tIHNlcnZlcicpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBUb2tlblR5cGUge1xuICBBTk9OWU1PVVMgPSAnYW5vbnltb3VzJyxcbiAgR1VFU1QgPSAnZ3Vlc3QnLFxuICBQVUJMSUMgPSAncHVibGljJyxcbiAgQ1VTVE9NID0gJ2N1c3RvbScsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5QYWlyIHtcbiAgaWRUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgVG9rZW5zTWFwID0gUmVjb3JkPFRva2VuVHlwZSwgVG9rZW5QYWlyPjtcblxuZXhwb3J0IGVudW0gQXV0aENvb2tpZSB7XG4gIFBVQkxJQ19JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLXB1YmxpYy1pZC10b2tlbicsXG4gIFBVQkxJQ19SRUZSRVNIX1RPS0VOID0gJ2FyZW5hLWF1dGgtcHVibGljLXJlZnJlc2gtdG9rZW4nLFxuICBBTk9OWU1PVVNfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1hbm9ueW1vdXMtaWQtdG9rZW4nLFxuICBHVUVTVF9JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLWd1ZXN0LWlkLXRva2VuJyxcbiAgQ1VTVE9NX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtY3VzdG9tLWlkLXRva2VuJyxcbiAgQ1VTVE9NX1VTRVIgPSAnYXJlbmEtYXV0aC1jdXN0b20tdXNlcicsXG59XG4iLCJpbXBvcnQgeyBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5cbmV4cG9ydCBjb25zdCBUT0tFTl9VUERBVEVEX0VWRU5UID0gJ2FyZW5hLWF1dGgtdG9rZW4tdXBkYXRlZCc7XG5cbmludGVyZmFjZSBUb2tlbkV2ZW50UGFyYW1zIHtcbiAgaWRUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgc291cmNlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChcbiAgdHlwZTogVG9rZW5UeXBlLFxuICBwYXJhbXM6IFRva2VuRXZlbnRQYXJhbXNcbikge1xuICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgIG5ldyBDdXN0b21FdmVudChUT0tFTl9VUERBVEVEX0VWRU5ULCB7XG4gICAgICBkZXRhaWw6IHsgLi4ucGFyYW1zLCB0eXBlIH0sXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3p1c3RhbmQnO1xuaW1wb3J0IHsgc3Vic2NyaWJlV2l0aFNlbGVjdG9yIH0gZnJvbSAnenVzdGFuZC9taWRkbGV3YXJlJztcbmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgeyBBdXRoQ29va2llLCBUb2tlbnNNYXAsIFRva2VuVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQgfSBmcm9tICcuLi91dGlscy9kb20tZXZlbnRzJztcblxuaW50ZXJmYWNlIFRva2VuU3RvcmUge1xuICB0b2tlbnM6IFRva2Vuc01hcDtcbiAgZ2V0VG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHN0cmluZyB8IG51bGw7XG4gIGdldE1vc3RQcml2aWxlZ2VkVG9rZW46IChcbiAgICBvcHRpb25zPzogQXJyYXk8VG9rZW5UeXBlPlxuICApID0+IHsgdHlwZTogVG9rZW5UeXBlOyBpZFRva2VuOiBzdHJpbmcgfSB8IG51bGw7XG4gIGdldFJlZnJlc2hUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgdXBkYXRlUHVibGljVG9rZW5zOiAoXG4gICAgaWRUb2tlbjogc3RyaW5nLFxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICApID0+IHZvaWQ7XG4gIHVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhclB1YmxpY1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJBbm9ueW1vdXNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyR3Vlc3RUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyQ3VzdG9tVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhclB1YmxpY1Rva2VuczogKCkgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnM6ICgpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyR3Vlc3RUb2tlbnM6ICgpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyQ3VzdG9tVG9rZW5zOiAoKSA9PiB2b2lkO1xufVxuXG5jb25zdCBkZWZhdWx0VG9rZW5zOiBUb2tlbnNNYXAgPSB7XG4gIHB1YmxpYzoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKSB8fCBudWxsLFxuICAgIHJlZnJlc2hUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbiAgYW5vbnltb3VzOiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5BTk9OWU1PVVNfSURfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGd1ZXN0OiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5HVUVTVF9JRF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbiAgY3VzdG9tOiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdXNlVG9rZW5TdG9yZSA9IGNyZWF0ZTxUb2tlblN0b3JlPigpKFxuICBzdWJzY3JpYmVXaXRoU2VsZWN0b3IoKHNldCwgZ2V0KSA9PiB7XG4gICAgY29uc3QgdXBkYXRlUHVibGljVG9rZW5zSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpZFRva2VuID09PSBnZXQoKS50b2tlbnMucHVibGljLmlkVG9rZW4gJiZcbiAgICAgICAgcmVmcmVzaFRva2VuID09PSBnZXQoKS50b2tlbnMucHVibGljLnJlZnJlc2hUb2tlblxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBwdWJsaWM6IHtcbiAgICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4sIGlkVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMSAvIDI0LFxuICAgICAgfSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4sIHJlZnJlc2hUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAzMCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5QVUJMSUMsIHtcbiAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbixcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLmFub255bW91cy5pZFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBhbm9ueW1vdXM6IHtcbiAgICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5BTk9OWU1PVVNfSURfVE9LRU4sIGlkVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMSAvIDI0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkFOT05ZTU9VUywgeyBpZFRva2VuLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpZFRva2VuID09PSBnZXQoKS50b2tlbnMuZ3Vlc3QuaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgZ3Vlc3Q6IHtcbiAgICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5HVUVTVF9JRF9UT0tFTiwgaWRUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAxIC8gMjQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuR1VFU1QsIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbkhlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLmN1c3RvbS5pZFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBjdXN0b206IHsgaWRUb2tlbiB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTiwgaWRUb2tlbik7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkNVU1RPTSwgeyBpZFRva2VuLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyUHVibGljVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKTtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIHB1YmxpYzogeyBpZFRva2VuOiBudWxsLCByZWZyZXNoVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuUFVCTElDLCB7IGlkVG9rZW46IG51bGwsIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5BTk9OWU1PVVNfSURfVE9LRU4pO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGFub255bW91czogeyBpZFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkFOT05ZTU9VUywge1xuICAgICAgICAgIGlkVG9rZW46IG51bGwsXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJHdWVzdFRva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLkdVRVNUX0lEX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBndWVzdDogeyBpZFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkdVRVNULCB7IGlkVG9rZW46IG51bGwsIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQXV0aENvb2tpZS5DVVNUT01fVVNFUik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgY3VzdG9tOiB7IGlkVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQ1VTVE9NLCB7IGlkVG9rZW46IG51bGwsIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuczogZGVmYXVsdFRva2VucyxcblxuICAgICAgZ2V0VG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldCgpLnRva2Vuc1t0eXBlXT8uaWRUb2tlbiB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbjogKFxuICAgICAgICBvcHRpb25zID0gW1Rva2VuVHlwZS5QVUJMSUMsIFRva2VuVHlwZS5HVUVTVCwgVG9rZW5UeXBlLkFOT05ZTU9VU11cbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoZ2V0KCkudG9rZW5zLmN1c3RvbS5pZFRva2VuICYmIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLkNVU1RPTSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLkNVU1RPTSxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0KCkudG9rZW5zLnB1YmxpYy5pZFRva2VuICYmIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLlBVQkxJQykpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLlBVQkxJQyxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5wdWJsaWMuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0KCkudG9rZW5zLmd1ZXN0LmlkVG9rZW4gJiYgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuR1VFU1QpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5HVUVTVCxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5ndWVzdC5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBnZXQoKS50b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4gJiZcbiAgICAgICAgICBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5BTk9OWU1PVVMpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuQU5PTllNT1VTLFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLmFub255bW91cy5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0UmVmcmVzaFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXQoKS50b2tlbnNbdHlwZV0/LnJlZnJlc2hUb2tlbiB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlUHVibGljVG9rZW5zOiAoXG4gICAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgICAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gICAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICAgKSA9PiB7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlcihpZFRva2VuLCByZWZyZXNoVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyKGlkVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyKGlkVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUN1c3RvbVRva2VuSGVscGVyKGlkVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgICBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgICBjbGVhckd1ZXN0VG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclB1YmxpY1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyR3Vlc3RUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJDdXN0b21Ub2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZVB1YmxpY1Rva2VuczogKGlkVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zSGVscGVyKGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIoaWRUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlR3Vlc3RUb2tlbnNIZWxwZXIoaWRUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIoaWRUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJQdWJsaWNUb2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJHdWVzdFRva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhckd1ZXN0VG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyQ3VzdG9tVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSlcbik7XG4iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgVE9LRU5fVVBEQVRFRF9FVkVOVCB9IGZyb20gJy4uL3V0aWxzL2RvbS1ldmVudHMnO1xuXG5pbnRlcmZhY2UgVG9rZW5VcGRhdGVFdmVudCB7XG4gIGRldGFpbDoge1xuICAgIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gICAgcmVmcmVzaFRva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgICB0eXBlOiBUb2tlblR5cGU7XG4gICAgc291cmNlPzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5FdmVudExpc3RlbmVyKCkge1xuICBjb25zdCB1cGRhdGVQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZVB1YmxpY1Rva2Vuc1xuICApO1xuICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW5cbiAgKTtcbiAgY29uc3QgdXBkYXRlR3Vlc3RUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUN1c3RvbVRva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVDdXN0b21Ub2tlblxuICApO1xuICBjb25zdCBjbGVhclRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJUb2tlbnMpO1xuICBjb25zdCBjbGVhclB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJQdWJsaWNUb2tlbnNcbiAgKTtcbiAgY29uc3QgY2xlYXJBbm9ueW1vdXNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zXG4gICk7XG4gIGNvbnN0IGNsZWFyR3Vlc3RUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyR3Vlc3RUb2tlbnMpO1xuICBjb25zdCBjbGVhckN1c3RvbVRva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJDdXN0b21Ub2tlbnNcbiAgKTtcblxuICBjb25zdCBldmVudFNvdXJjZVJlZiA9IHVzZVJlZjxzdHJpbmc+KFxuICAgIGB3aWRnZXQtJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlVG9rZW5VcGRhdGUgPSAoXG4gICAgICBldmVudDogQ3VzdG9tRXZlbnQ8VG9rZW5VcGRhdGVFdmVudFsnZGV0YWlsJ10+XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgdHlwZSwgc291cmNlIH0gPSBldmVudC5kZXRhaWw7XG5cbiAgICAgIGlmIChzb3VyY2UgPT09IGV2ZW50U291cmNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuUFVCTElDOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZnJlc2ggdG9rZW4gaXMgcmVxdWlyZWQgZm9yIHB1YmxpYyB0b2tlbnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhclB1YmxpY1Rva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRva2VuVHlwZS5BTk9OWU1PVVM6XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKGlkVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhckFub255bW91c1Rva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRva2VuVHlwZS5HVUVTVDpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgdXBkYXRlR3Vlc3RUb2tlbnMoaWRUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyR3Vlc3RUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuQ1VTVE9NOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICB1cGRhdGVDdXN0b21Ub2tlbihpZFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBUT0tFTl9VUERBVEVEX0VWRU5ULFxuICAgICAgaGFuZGxlVG9rZW5VcGRhdGUgYXMgRXZlbnRMaXN0ZW5lclxuICAgICk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgVE9LRU5fVVBEQVRFRF9FVkVOVCxcbiAgICAgICAgaGFuZGxlVG9rZW5VcGRhdGUgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgKTtcbiAgICB9O1xuICB9LCBbXG4gICAgdXBkYXRlUHVibGljVG9rZW5zLFxuICAgIHVwZGF0ZUFub255bW91c1Rva2VuLFxuICAgIHVwZGF0ZUd1ZXN0VG9rZW5zLFxuICAgIHVwZGF0ZUN1c3RvbVRva2VuLFxuICAgIGNsZWFyVG9rZW5zLFxuICAgIGNsZWFyUHVibGljVG9rZW5zLFxuICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zLFxuICAgIGNsZWFyR3Vlc3RUb2tlbnMsXG4gICAgY2xlYXJDdXN0b21Ub2tlbnMsXG4gIF0pO1xuXG4gIHJldHVybiB7XG4gICAgZXZlbnRTb3VyY2U6IGV2ZW50U291cmNlUmVmLmN1cnJlbnQsXG4gIH07XG59XG4iLCJpbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IHVzZVRva2VuRXZlbnRMaXN0ZW5lciB9IGZyb20gJy4vdXNlLXRva2VuLWV2ZW50LWxpc3RlbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VucygpIHtcbiAgY29uc3QgZ2V0VG9rZW4gPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmdldFRva2VuKTtcbiAgY29uc3QgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuZ2V0TW9zdFByaXZpbGVnZWRUb2tlblxuICApO1xuICBjb25zdCBnZXRSZWZyZXNoVG9rZW4gPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmdldFJlZnJlc2hUb2tlbik7XG4gIGNvbnN0IHVwZGF0ZVB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlUHVibGljVG9rZW5zKTtcbiAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnVwZGF0ZUFub255bW91c1Rva2VuXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS51cGRhdGVHdWVzdFRva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUN1c3RvbVRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS51cGRhdGVDdXN0b21Ub2tlbik7XG4gIGNvbnN0IGNsZWFyVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhclRva2Vucyk7XG4gIGNvbnN0IGNsZWFyUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhclB1YmxpY1Rva2Vucyk7XG4gIGNvbnN0IGNsZWFyQ3VzdG9tVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhckN1c3RvbVRva2Vucyk7XG5cbiAgY29uc3QgeyBldmVudFNvdXJjZSB9ID0gdXNlVG9rZW5FdmVudExpc3RlbmVyKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRUb2tlbixcbiAgICBnZXRNb3N0UHJpdmlsZWdlZFRva2VuLFxuICAgIGdldFJlZnJlc2hUb2tlbixcbiAgICB1cGRhdGVQdWJsaWNUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlUHVibGljVG9rZW5zKGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIHVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW4oaWRUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIHVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlR3Vlc3RUb2tlbnMoaWRUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIHVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlQ3VzdG9tVG9rZW4oaWRUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIGNsZWFyVG9rZW5zOiAoKSA9PiBjbGVhclRva2VucyhldmVudFNvdXJjZSksXG4gICAgY2xlYXJQdWJsaWNUb2tlbnM6ICgpID0+IGNsZWFyUHVibGljVG9rZW5zKGV2ZW50U291cmNlKSxcbiAgICBjbGVhckN1c3RvbVRva2VuczogKCkgPT4gY2xlYXJDdXN0b21Ub2tlbnMoZXZlbnRTb3VyY2UpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW4odHlwZTogJ2Fub255bW91cycgfCAnZ3Vlc3QnIHwgJ3B1YmxpYycgfCAnY3VzdG9tJykge1xuICByZXR1cm4gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnNbdHlwZV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5WYWx1ZShcbiAgdHlwZTogJ2Fub255bW91cycgfCAnZ3Vlc3QnIHwgJ3B1YmxpYycgfCAnY3VzdG9tJ1xuKSB7XG4gIHJldHVybiB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vuc1t0eXBlXT8uaWRUb2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWZyZXNoVG9rZW4odHlwZTogJ2Fub255bW91cycgfCAnZ3Vlc3QnIHwgJ3B1YmxpYycpIHtcbiAgcmV0dXJuIHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zW3R5cGVdPy5yZWZyZXNoVG9rZW4pO1xufVxuIiwidHlwZSBOdWxsYWJsZTxUPiA9IFQgfCBudWxsO1xuXG5leHBvcnQgZW51bSBBbmFseXRpY3NXaWRnZXRUeXBlIHtcbiAgQXZhdGFyUHJvZmlsZSA9ICdhdmF0YXItcHJvZmlsZScsXG4gIEF2YXRhckNoYXQgPSAnYXZhdGFyLWNoYXQnLFxuICBDb21tZW50cyA9ICdjb21tZW50cycsXG4gIEdsb2JhbFByb2ZpbGUgPSAnZ2xvYmFsLXByb2ZpbGUnLFxuICBHcm91cENoYXQgPSAnZ3JvdXAtY2hhdCcsXG4gIFBvbGxzID0gJ3BvbGxzJyxcbiAgVW5pdmVyc2FsU25pcHBldCA9ICd1bml2ZXJzYWwtc25pcHBldCcsXG59XG5cbmV4cG9ydCB0eXBlIFRyYWNrT3B0aW9ucyA9IHtcbiAgd2lkZ2V0SWQ6IHN0cmluZyB8IG51bGw7XG4gIHdpZGdldFR5cGU6IEFuYWx5dGljc1dpZGdldFR5cGU7XG4gIHNpdGVJZDogc3RyaW5nO1xuICByc1dyaXRlS2V5OiBzdHJpbmc7XG4gIHJzRGF0YVBsYW5lVXJsOiBzdHJpbmc7XG4gIHRyaWdnZXI6IHN0cmluZztcbn07XG5cbmV4cG9ydCBlbnVtIEFuYWx5dGljc0V2ZW50IHtcbiAgQXV0aGVudGljYXRpb25Db21wbGV0ZWQgPSAnQXV0aGVudGljYXRpb24gQ29tcGxldGVkJyxcbiAgQXV0aGVudGljYXRpb25TdGFydGVkID0gJ0F1dGhlbnRpY2F0aW9uIFN0YXJ0ZWQnLFxuICBBdXRoZW50aWNhdGlvblZpZXdlZCA9ICdBdXRoZW50aWNhdGlvbiBWaWV3ZWQnLFxufVxuXG5leHBvcnQgdHlwZSBUcmFja1Byb3BzID0gTnVsbGFibGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5UHJvcHMge1xuICBhbm9ueW1vdXNJZD86IHN0cmluZztcbiAgdXNlcklkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1ZGRlckNvbnRleHQge1xuICBjaGFubmVsOiAnd2ViJztcbiAgYW5vbnltb3VzSWQ/OiBzdHJpbmc7XG4gIGxvY2FsZT86IHN0cmluZztcbiAgdXNlckFnZW50Pzogc3RyaW5nO1xuICB0aW1lem9uZT86IHN0cmluZztcbiAgb3M/OiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9O1xuICBwYWdlPzoge1xuICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgcmVmZXJyZXI/OiBzdHJpbmc7XG4gICAgcmVmZXJyaW5nX2RvbWFpbj86IHN0cmluZztcbiAgICBzZWFyY2g/OiBzdHJpbmc7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIGluaXRpYWxfcmVmZXJyZXI/OiBzdHJpbmc7XG4gICAgaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluPzogc3RyaW5nO1xuICB9O1xuICBzY3JlZW4/OiB7XG4gICAgZGVuc2l0eT86IG51bWJlcjtcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaW5uZXJIZWlnaHQ/OiBudW1iZXI7XG4gICAgaW5uZXJXaWR0aD86IG51bWJlcjtcbiAgfTtcbiAgY2FtcGFpZ24/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuIiwiaW1wb3J0IHsgUHVibGljUHJvZmlsZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcmVxdWVzdCwgc2VjdXJlZFJlcXVlc3QgfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVRva2VuIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlLXRva2Vucyc7XG5pbXBvcnQgeyBUb2tlblR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyB1c2VVc2VyQWN0aW9ucyB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZS11c2VyJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVByb2ZpbGVTZXJ2aWNlcygpIHtcbiAgY29uc3QgdG9rZW4gPSB1c2VUb2tlbihUb2tlblR5cGUuUFVCTElDKTtcbiAgY29uc3QgeyByZWZyZXNoUHVibGljVG9rZW5zIH0gPSB1c2VVc2VyQWN0aW9ucygpO1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IHByb2ZpbGVVcmwgPSBjb25maWcucHJvZmlsZVNlcnZpY2VVcmw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljUHJvZmlsZSh1c2VySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFB1YmxpY1Byb2ZpbGU+IHtcbiAgICBjb25zdCBmaWVsZHMgPSAnYmlvLHBob3RvVVJMLGRpc3BsYXlOYW1lLGxvY2F0aW9uLGhhbmRsZSc7XG4gICAgY29uc3QgdXJsID0gYCR7cHJvZmlsZVVybH0vcHVibGljL3VzZXJzLyR7dXNlcklkfS9wcm9maWxlP2ZpZWxkcz0ke2ZpZWxkc31gO1xuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0KCdHRVQnLCB1cmwpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHVibGljUHJvZmlsZShcbiAgICBwYXJhbXM6IE9taXQ8UHVibGljUHJvZmlsZSwgJ21ldGFkYXRhJz5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYCR7cHJvZmlsZVVybH0vbWUvcHJvZmlsZS9wZXJzb25hbGA7XG4gICAgYXdhaXQgc2VjdXJlZFJlcXVlc3Qoe1xuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIHVybCxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGFyYW1zKSxcbiAgICAgIH0sXG4gICAgICB0b2tlbjogdG9rZW4uaWRUb2tlbiEsXG4gICAgfSk7XG4gICAgcmVmcmVzaFB1YmxpY1Rva2Vucyh7IHJlZnJlc2hUb2tlbkFwaUtleTogY29uZmlnLnJlZnJlc2hUb2tlbkFwaUtleSB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldFB1YmxpY1Byb2ZpbGUsXG4gICAgdXBkYXRlUHVibGljUHJvZmlsZSxcbiAgfTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3p1c3RhbmQnO1xuaW1wb3J0IHsgc3Vic2NyaWJlV2l0aFNlbGVjdG9yIH0gZnJvbSAnenVzdGFuZC9taWRkbGV3YXJlJztcbmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQge1xuICBVc2VyUHJvcHMsXG4gIEZpcmViYXNlVXNlcixcbiAgU3NvVXNlclByb3BzLFxuICBTc29WMkV4Y2hhbmdlUmVzcG9uc2UsXG59IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSAnand0LWRlY29kZSc7XG5pbXBvcnQgeyB0eXBlIFB1YmxpY1Byb2ZpbGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9maWxlL3R5cGVzJztcbmltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IEF1dGhDb29raWUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgZ2V0Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcblxuaW50ZXJmYWNlIFVzZXJTdG9yZSB7XG4gIHVzZXI6IFVzZXJQcm9wcyB8IG51bGw7XG4gIHB1YmxpY1Byb2ZpbGU6IFB1YmxpY1Byb2ZpbGUgfCBudWxsO1xuICByZWZyZXNoZWRUb2tlbkxvYWRlZDogYm9vbGVhbjtcbiAgc2V0VXNlcjogKHVzZXI6IFVzZXJQcm9wcyB8IG51bGwpID0+IHZvaWQ7XG4gIHNldFB1YmxpY1Byb2ZpbGU6IChwdWJsaWNQcm9maWxlOiBQdWJsaWNQcm9maWxlIHwgbnVsbCkgPT4gdm9pZDtcbiAgbG9nb3V0OiAoKSA9PiB2b2lkO1xuICByZWZyZXNoUHVibGljVG9rZW5zOiAoY29uZmlnOiB7XG4gICAgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmc7XG4gIH0pID0+IFByb21pc2U8dm9pZD47XG4gIHNldFVzZXJCeVRva2VuSWQ6IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGxvYWRTdG9yZWRVc2VyOiAoY29uZmlnPzogeyByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZyB9KSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzc29WMkV4Y2hhbmdlOiAoXG4gICAgc3NvU291cmNlSUQ6IHN0cmluZyxcbiAgICBqd3Q6IHN0cmluZyxcbiAgICBlbnY/OiBFbnZpcm9ubWVudFxuICApID0+IFByb21pc2U8U3NvVjJFeGNoYW5nZVJlc3BvbnNlPjtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVVzZXJTdG9yZSA9IGNyZWF0ZTxVc2VyU3RvcmU+KCkoXG4gIHN1YnNjcmliZVdpdGhTZWxlY3Rvcigoc2V0LCBnZXQpID0+ICh7XG4gICAgdXNlcjogbnVsbCxcbiAgICBwdWJsaWNQcm9maWxlOiBudWxsLFxuICAgIHJlZnJlc2hlZFRva2VuTG9hZGVkOiBmYWxzZSxcblxuICAgIHNldFVzZXI6ICh1c2VyOiBVc2VyUHJvcHMgfCBudWxsKSA9PiB7XG4gICAgICBzZXQoeyB1c2VyIH0pO1xuICAgIH0sXG5cbiAgICBzZXRQdWJsaWNQcm9maWxlOiAocHVibGljUHJvZmlsZTogUHVibGljUHJvZmlsZSB8IG51bGwpID0+IHtcbiAgICAgIHNldCh7IHB1YmxpY1Byb2ZpbGUgfSk7XG4gICAgfSxcblxuICAgIHNldFVzZXJCeVRva2VuSWQ6IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBqd3REZWNvZGU8RmlyZWJhc2VVc2VyPihpZFRva2VuKTtcbiAgICAgICAgY29uc3QgdXNlclByb3BzOiBVc2VyUHJvcHMgPSB7XG4gICAgICAgICAgdWlkOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgICAgZGlzcGxheU5hbWU6IHVzZXIuc2FmZURpc3BsYXlOYW1lLFxuICAgICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxuICAgICAgICAgIHBob3RvVVJMOiB1c2VyLnNhZmVQaG90b1VSTCxcbiAgICAgICAgICBoYW5kbGU6IHVzZXIuaGFuZGxlLFxuICAgICAgICB9O1xuICAgICAgICBzZXQoeyB1c2VyOiB1c2VyUHJvcHMgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbG9nb3V0OiAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICB0b2tlblN0b3JlLmNsZWFyUHVibGljVG9rZW5zKCk7XG4gICAgICAgIHRva2VuU3RvcmUuY2xlYXJDdXN0b21Ub2tlbnMoKTtcbiAgICAgICAgc2V0KHsgdXNlcjogbnVsbCB9KTtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2FyZW5hLWNvbW1lbnRzLWxvZ291dCcpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICByZWZyZXNoUHVibGljVG9rZW5zOiBhc3luYyAoY29uZmlnOiB7IHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuXG4gICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWZyZXNoIHRva2VuIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVmaXggPSAnaHR0cHM6Ly9zZWN1cmV0b2tlbi5nb29nbGVhcGlzLmNvbS92MS90b2tlbj9rZXk9JztcbiAgICAgICAgY29uc3QgYXBpS2V5ID0gY29uZmlnLnJlZnJlc2hUb2tlbkFwaUtleTtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7cHJlZml4fSR7YXBpS2V5fWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IHsgc2V0VXNlckJ5VG9rZW5JZCB9ID0gZ2V0KCk7XG4gICAgICAgIHNldFVzZXJCeVRva2VuSWQoZGF0YS5pZF90b2tlbik7XG5cbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVQdWJsaWNUb2tlbnMoZGF0YS5pZF90b2tlbiwgZGF0YS5yZWZyZXNoX3Rva2VuKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICBjb25zdCB7IGxvZ291dCB9ID0gZ2V0KCk7XG4gICAgICAgIGxvZ291dCgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2FkU3RvcmVkVXNlcjogYXN5bmMgKGNvbmZpZz86IHsgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgY29uc3QgcHVibGljSWRUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKTtcbiAgICAgIGNvbnN0IHB1YmxpY1JlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuICAgICAgY29uc3QgY3VzdG9tSWRUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGNvbnN0IGN1c3RvbVVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBdXRoQ29va2llLkNVU1RPTV9VU0VSKTtcblxuICAgICAgaWYgKCEhY3VzdG9tSWRUb2tlbiAmJiAhIWN1c3RvbVVzZXIpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXNlciA9IEpTT04ucGFyc2UoY3VzdG9tVXNlcik7XG5cbiAgICAgICAgc2V0KHsgdXNlcjogcGFyc2VkVXNlciB9KTtcblxuICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICB0b2tlblN0b3JlLnVwZGF0ZUN1c3RvbVRva2VuKGN1c3RvbUlkVG9rZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHB1YmxpY0lkVG9rZW4pIHtcbiAgICAgICAgICBjb25zdCB7IHNldFVzZXJCeVRva2VuSWQgfSA9IGdldCgpO1xuICAgICAgICAgIHNldFVzZXJCeVRva2VuSWQocHVibGljSWRUb2tlbik7XG4gICAgICAgIH0gZWxzZSBpZiAocHVibGljUmVmcmVzaFRva2VuICYmIGNvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHsgcmVmcmVzaFB1YmxpY1Rva2VucyB9ID0gZ2V0KCk7XG4gICAgICAgICAgYXdhaXQgcmVmcmVzaFB1YmxpY1Rva2Vucyhjb25maWcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldCh7IHJlZnJlc2hlZFRva2VuTG9hZGVkOiB0cnVlIH0pO1xuICAgIH0sXG5cbiAgICBzc29WMkV4Y2hhbmdlOiBhc3luYyAoXG4gICAgICBzc29Tb3VyY2VJRDogc3RyaW5nLFxuICAgICAgand0OiBzdHJpbmcsXG4gICAgICBlbnY/OiBFbnZpcm9ubWVudFxuICAgICkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKGVudiA/PyAncHJvZHVjdGlvbicpO1xuICAgICAgICBjb25zdCBwcm9maWxlVXJsID0gY29uZmlnLnByb2ZpbGVTZXJ2aWNlVXJsO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L3Nzby9zb3VyY2VzLyR7c3NvU291cmNlSUR9L3VzZXJgO1xuICAgICAgICBjb25zdCByZXNwb25zZTogU3NvVjJFeGNoYW5nZVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdCgnUE9TVCcsIHVybCwge1xuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2lnbmVkVXNlckRhdGE6IGp3dCB9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZFVzZXIgPSBqd3REZWNvZGU8U3NvVXNlclByb3BzPihyZXNwb25zZS50b2tlbik7XG5cbiAgICAgICAgICBjb25zdCB7IHNldFVzZXIsIHNldFB1YmxpY1Byb2ZpbGUgfSA9IGdldCgpO1xuXG4gICAgICAgICAgc2V0VXNlcih7XG4gICAgICAgICAgICB1aWQ6IGRlY29kZWRVc2VyPy5zdWIsXG4gICAgICAgICAgICBlbWFpbDogZGVjb2RlZFVzZXI/LmVtYWlsLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGRlY29kZWRVc2VyPy5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIHBob3RvVVJMOiBkZWNvZGVkVXNlcj8ucGhvdG9VUkwsXG4gICAgICAgICAgICBoYW5kbGU6IGRlY29kZWRVc2VyPy5oYW5kbGUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzZXRQdWJsaWNQcm9maWxlKHtcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBkZWNvZGVkVXNlcj8uZGlzcGxheU5hbWUsXG4gICAgICAgICAgICBwaG90b1VSTDogZGVjb2RlZFVzZXI/LnBob3RvVVJMLFxuICAgICAgICAgICAgaGFuZGxlOiBkZWNvZGVkVXNlcj8uaGFuZGxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICB0b2tlblN0b3JlLnVwZGF0ZUN1c3RvbVRva2VuKHJlc3BvbnNlLnRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NTTyBWMiBFeGNoYW5nZSBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICB9KSlcbik7XG4iLCJpbXBvcnQgeyB1c2VQcm9maWxlU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzJztcbmltcG9ydCB7IHVzZVVzZXJTdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy91c2VyLXN0b3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXIoKSB7XG4gIHJldHVybiB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUudXNlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQdWJsaWNQcm9maWxlKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnB1YmxpY1Byb2ZpbGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmcmVzaGVkVG9rZW5Mb2FkZWQoKSB7XG4gIHJldHVybiB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucmVmcmVzaGVkVG9rZW5Mb2FkZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXNlckFjdGlvbnMoKSB7XG4gIGNvbnN0IHNldFVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0VXNlcik7XG4gIGNvbnN0IHNldFB1YmxpY1Byb2ZpbGUgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0UHVibGljUHJvZmlsZSk7XG4gIGNvbnN0IGxvZ291dCA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5sb2dvdXQpO1xuICBjb25zdCByZWZyZXNoUHVibGljVG9rZW5zID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnJlZnJlc2hQdWJsaWNUb2tlbnMpO1xuICBjb25zdCBzZXRVc2VyQnlUb2tlbklkID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFVzZXJCeVRva2VuSWQpO1xuICBjb25zdCBsb2FkU3RvcmVkVXNlciA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5sb2FkU3RvcmVkVXNlcik7XG4gIGNvbnN0IHNzb1YyRXhjaGFuZ2UgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc3NvVjJFeGNoYW5nZSk7XG4gIFxuXG4gIHJldHVybiB7XG4gICAgc2V0VXNlcixcbiAgICBzZXRQdWJsaWNQcm9maWxlLFxuICAgIGxvZ291dCxcbiAgICByZWZyZXNoUHVibGljVG9rZW5zLFxuICAgIHNldFVzZXJCeVRva2VuSWQsXG4gICAgbG9hZFN0b3JlZFVzZXIsXG4gICAgc3NvVjJFeGNoYW5nZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVwZGF0ZVByb2ZpbGUoKSB7XG4gIGNvbnN0IHsgdXBkYXRlUHVibGljUHJvZmlsZSB9ID0gdXNlUHJvZmlsZVNlcnZpY2VzKCk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlUHVibGljUHJvZmlsZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJXaXRoUHJvZmlsZSgpIHtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS51c2VyKTtcbiAgY29uc3QgcHVibGljUHJvZmlsZSA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5wdWJsaWNQcm9maWxlKTtcbiAgY29uc3QgcmVmcmVzaGVkVG9rZW5Mb2FkZWQgPSB1c2VVc2VyU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUucmVmcmVzaGVkVG9rZW5Mb2FkZWRcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHVzZXIsXG4gICAgcHVibGljUHJvZmlsZSxcbiAgICByZWZyZXNoZWRUb2tlbkxvYWRlZCxcbiAgfTtcbn1cblxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VVc2VyLCB1c2VVc2VyQWN0aW9ucyB9IGZyb20gJy4uL2hvb2tzL3VzZS11c2VyJztcbmltcG9ydCB7IHVzZU11dGF0aW9uIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IHVzZVByb2ZpbGVTZXJ2aWNlcyB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2ZpbGUvdXNlLXByb2ZpbGUtc2VydmljZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlclByb3ZpZGVyKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pIHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpO1xuICBjb25zdCB7IHNldFB1YmxpY1Byb2ZpbGUsIGxvYWRTdG9yZWRVc2VyIH0gPSB1c2VVc2VyQWN0aW9ucygpO1xuICBjb25zdCB7IGdldFB1YmxpY1Byb2ZpbGU6IGdldFB1YmxpY1Byb2ZpbGVTZXJ2aWNlIH0gPSB1c2VQcm9maWxlU2VydmljZXMoKTtcbiAgY29uc3QgeyBtdXRhdGVBc3luYzogZ2V0UHVibGljUHJvZmlsZSB9ID0gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGdldFB1YmxpY1Byb2ZpbGVTZXJ2aWNlLFxuICB9KTtcblxuICBjb25zdCBsb2FkUHVibGljUHJvZmlsZSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAodXNlcj8udWlkKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgZ2V0UHVibGljUHJvZmlsZSh1c2VyLnVpZCk7XG4gICAgICBzZXRQdWJsaWNQcm9maWxlKHByb2ZpbGUpO1xuICAgIH1cbiAgfSwgW3VzZXI/LnVpZCwgZ2V0UHVibGljUHJvZmlsZSwgc2V0UHVibGljUHJvZmlsZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZFB1YmxpY1Byb2ZpbGUoKTtcbiAgfSwgW2xvYWRQdWJsaWNQcm9maWxlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsb2FkU3RvcmVkVXNlcihjb25maWcpO1xuICB9LCBbY29uZmlnLCBsb2FkU3RvcmVkVXNlcl0pO1xuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgQW5hbHl0aWNzV2lkZ2V0VHlwZSxcbiAgQW5hbHl0aWNzRXZlbnQsXG4gIElkZW50aXR5UHJvcHMsXG4gIFJ1ZGRlckNvbnRleHQsXG4gIFRyYWNrUHJvcHMsXG59IGZyb20gJy4uL3R5cGVzL2FuYWx5dGljcyc7XG5cbmltcG9ydCB7IHJlbW92ZVBhcmFtc0Zyb21VcmwgfSBmcm9tICcuLi91dGlscy91cmwnO1xuXG5jb25zdCBBTk9OWU1PVVNfSURfS0VZID0gJ2FyZW5hQW5vbnltb3VzSWQnO1xuXG5jb25zdCBMU19LRVlTID0ge1xuICBhbm9uOiAncnNfYW5vbnltb3VzX2lkJyxcbiAgaW5pdFJlZmVycmVyOiAncnNfaW5pdGlhbF9yZWZlcnJlcicsXG4gIGluaXREb21haW46ICdyc19pbml0aWFsX3JlZmVycmluZ19kb21haW4nLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICB9XG5cbiAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwO1xuICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE9yU2V0QW5vbnltb3VzSWQoKTogc3RyaW5nIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmFub24pO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVlTLmFub24sIGlkKTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiByZW1lbWJlckluaXRpYWxSZWZlcnJlcigpOiB2b2lkIHtcbiAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmluaXRSZWZlcnJlcikpIHtcbiAgICBjb25zdCByZWYgPSBkb2N1bWVudC5yZWZlcnJlciB8fCAnJGRpcmVjdCc7XG4gICAgY29uc3QgZG9tYWluID0gcmVmICYmIHJlZiAhPT0gJyRkaXJlY3QnID8gbmV3IFVSTChyZWYpLmhvc3RuYW1lIDogJyc7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZUy5pbml0UmVmZXJyZXIsIHJlZik7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZUy5pbml0RG9tYWluLCBkb21haW4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ2FtcGFpZ24odTogVVJMKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGtleXMgPSBbXG4gICAgJ3V0bV9zb3VyY2UnLFxuICAgICd1dG1fbWVkaXVtJyxcbiAgICAndXRtX2NhbXBhaWduJyxcbiAgICAndXRtX3Rlcm0nLFxuICAgICd1dG1fY29udGVudCcsXG4gIF07XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBrZXlzLmZvckVhY2goayA9PiB7XG4gICAgY29uc3QgdiA9IHUuc2VhcmNoUGFyYW1zLmdldChrKTtcbiAgICBpZiAodikgb3V0W2tdID0gdjtcbiAgfSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdXQpLmxlbmd0aCA/IG91dCA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUnVkZGVyQ29udGV4dCgpOiBSdWRkZXJDb250ZXh0IHtcbiAgY29uc3QgdyA9IHdpbmRvdztcbiAgY29uc3QgZCA9IGRvY3VtZW50O1xuICBjb25zdCBzID0gd2luZG93LnNjcmVlbjtcbiAgY29uc3QgdXJsID0gbmV3IFVSTCh3LmxvY2F0aW9uLmhyZWYpO1xuXG4gIHJlbWVtYmVySW5pdGlhbFJlZmVycmVyKCk7XG5cbiAgY29uc3QgaW5pdGlhbF9yZWZlcnJlciA9XG4gICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0UmVmZXJyZXIpIHx8ICckZGlyZWN0JztcbiAgY29uc3QgaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluID1cbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmluaXREb21haW4pIHx8ICcnO1xuXG4gIHJldHVybiB7XG4gICAgY2hhbm5lbDogJ3dlYicsXG4gICAgYW5vbnltb3VzSWQ6IGdldE9yU2V0QW5vbnltb3VzSWQoKSxcbiAgICBsb2NhbGU6IG5hdmlnYXRvci5sYW5ndWFnZSxcbiAgICB1c2VyQWdlbnQ6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgdGltZXpvbmU6IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSxcbiAgICBvczogeyBuYW1lOiBuYXZpZ2F0b3IucGxhdGZvcm0sIHZlcnNpb246IHVuZGVmaW5lZCB9LFxuICAgIHBhZ2U6IHtcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHJlZmVycmVyOiBkLnJlZmVycmVyIHx8ICckZGlyZWN0JyxcbiAgICAgIHJlZmVycmluZ19kb21haW46IGQucmVmZXJyZXIgPyBuZXcgVVJMKGQucmVmZXJyZXIpLmhvc3RuYW1lIDogJycsXG4gICAgICBzZWFyY2g6IHVybC5zZWFyY2gsXG4gICAgICB0aXRsZTogZC50aXRsZSxcbiAgICAgIHVybDogdXJsLnRvU3RyaW5nKCksXG4gICAgICBpbml0aWFsX3JlZmVycmVyLFxuICAgICAgaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluLFxuICAgIH0sXG4gICAgc2NyZWVuOiB7XG4gICAgICBkZW5zaXR5OiAody5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpID8/IDEsXG4gICAgICBoZWlnaHQ6IHMuaGVpZ2h0LFxuICAgICAgd2lkdGg6IHMud2lkdGgsXG4gICAgICBpbm5lckhlaWdodDogdy5pbm5lckhlaWdodCxcbiAgICAgIGlubmVyV2lkdGg6IHcuaW5uZXJXaWR0aCxcbiAgICB9LFxuICAgIGNhbXBhaWduOiBwYXJzZUNhbXBhaWduKHVybCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldElkZW50aWZpZXIob3B0aW9uczogSWRlbnRpdHlQcm9wcyA9IHt9KTogSWRlbnRpdHlQcm9wcyB7XG4gIGNvbnN0IGlkZW50aWZpZXI6IElkZW50aXR5UHJvcHMgPSB7fTtcblxuICBpZiAob3B0aW9ucy51c2VySWQpIHtcbiAgICBpZGVudGlmaWVyLnVzZXJJZCA9IG9wdGlvbnMudXNlcklkO1xuICB9XG5cbiAgbGV0IGN1cnJlbnRBbm9ueW1vdXNJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBjdXJyZW50QW5vbnltb3VzSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBTk9OWU1PVVNfSURfS0VZKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBhY2Nlc3MgbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFub255bW91c0lkKSB7XG4gICAgaWRlbnRpZmllci5hbm9ueW1vdXNJZCA9IG9wdGlvbnMuYW5vbnltb3VzSWQ7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFOT05ZTU9VU19JRF9LRVksIG9wdGlvbnMuYW5vbnltb3VzSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIGFub255bW91c0lkIHRvIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGN1cnJlbnRBbm9ueW1vdXNJZCkge1xuICAgIGlkZW50aWZpZXIuYW5vbnltb3VzSWQgPSBjdXJyZW50QW5vbnltb3VzSWQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbmV3QW5vbnltb3VzSWQgPSBnZW5lcmF0ZVVVSUQoKTtcbiAgICBpZGVudGlmaWVyLmFub255bW91c0lkID0gbmV3QW5vbnltb3VzSWQ7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFOT05ZTU9VU19JRF9LRVksIG5ld0Fub255bW91c0lkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2F2ZSBuZXcgYW5vbnltb3VzSWQgdG8gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaWRlbnRpZmllcjtcbn1cblxuZnVuY3Rpb24gZ2V0Q2Fub25pY2FsVXJsKCk6IHN0cmluZyB7XG4gIGNvbnN0IGNhbm9uaWNhbE1ldGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICdsaW5rW3JlbD1cImNhbm9uaWNhbFwiXSdcbiAgKSBhcyBIVE1MTGlua0VsZW1lbnQ7XG4gIGNvbnN0IHJhd1VybCA9IGNhbm9uaWNhbE1ldGE/LmhyZWYgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHJldHVybiByZW1vdmVQYXJhbXNGcm9tVXJsKHJhd1VybCk7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50UHJvcGVydGllcyhcbiAgd2lkZ2V0VHlwZTogc3RyaW5nLFxuICBwcm9wZXJ0aWVzOiBUcmFja1Byb3BzLFxuICBpZGVudGl0eT86IElkZW50aXR5UHJvcHNcbikge1xuICByZXR1cm4ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHdpZGdldF90eXBlOiB3aWRnZXRUeXBlLFxuICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgIGRvbWFpbjogd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLFxuICAgICAgdGl0bGU6IHdpbmRvdy5kb2N1bWVudC50aXRsZSxcbiAgICAgIGNhbm9uaWNhbF91cmw6IGdldENhbm9uaWNhbFVybCgpLFxuICAgICAgc25pcHBldF9pZDogd2luZG93Ll9fQVJFTkFfXz8uc25pcHBldElkIHx8IG51bGwsXG4gICAgICAuLi5wcm9wZXJ0aWVzLFxuICAgIH0sXG4gICAgY29udGV4dDogYnVpbGRSdWRkZXJDb250ZXh0KCksXG4gICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgaW50ZWdyYXRpb25zOiB7IEFsbDogdHJ1ZSB9LFxuICAgIC4uLmdldElkZW50aWZpZXIoaWRlbnRpdHkpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXk6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgQXV0aG9yaXphdGlvbjogJ0Jhc2ljICcgKyBidG9hKGAke3dyaXRlS2V5fTpgKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuYWx5dGljcyh3cml0ZUtleTogc3RyaW5nLCBkYXRhUGxhbmVVcmw6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIHBhZ2U6IGFzeW5jIChcbiAgICAgIHdpZGdldFR5cGU6IEFuYWx5dGljc1dpZGdldFR5cGUsXG4gICAgICBwcm9wZXJ0aWVzOiBUcmFja1Byb3BzLFxuICAgICAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2RhdGFQbGFuZVVybH0vdjEvcGFnZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGdldEV2ZW50SGVhZGVycyh3cml0ZUtleSksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICB0eXBlOiAncGFnZScsXG4gICAgICAgICAgLi4uZ2V0RXZlbnRQcm9wZXJ0aWVzKHdpZGdldFR5cGUsIHByb3BlcnRpZXMsIGlkZW50aXR5KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2VuZCBwYWdlIGV2ZW50IHRvIFJ1ZGRlcnN0YWNrJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICB0cmFjazogYXN5bmMgKFxuICAgICAgd2lkZ2V0VHlwZTogQW5hbHl0aWNzV2lkZ2V0VHlwZSxcbiAgICAgIGV2ZW50OiBBbmFseXRpY3NFdmVudCxcbiAgICAgIHByb3BlcnRpZXM6IFRyYWNrUHJvcHMsXG4gICAgICBpZGVudGl0eT86IElkZW50aXR5UHJvcHNcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7ZGF0YVBsYW5lVXJsfS92MS90cmFja2AsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGdldEV2ZW50SGVhZGVycyh3cml0ZUtleSksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICB0eXBlOiAndHJhY2snLFxuICAgICAgICAgIC4uLmdldEV2ZW50UHJvcGVydGllcyh3aWRnZXRUeXBlLCBwcm9wZXJ0aWVzLCBpZGVudGl0eSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNlbmQgdHJhY2sgZXZlbnQgdG8gUnVkZGVyc3RhY2snKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVBhcmFtc0Zyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblxuICAgIHVybE9iai5zZWFyY2ggPSAnJztcblxuICAgIHJldHVybiB1cmxPYmouaHJlZjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjbGVhcmluZyBzZWFyY2ggcGFyYW1zIGZyb20gVVJMOicsIGVycm9yKTtcbiAgICByZXR1cm4gdXJsO1xuICB9XG59XG4iLCJpbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEFuYWx5dGljcyB9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljcyc7XG5pbXBvcnQgeyBBbmFseXRpY3NFdmVudCwgVHJhY2tPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRyYWNrKHRyYWNrT3B0aW9ucz86IFRyYWNrT3B0aW9ucykge1xuICBjb25zdCB0cmFjayA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIGV2ZW50OiBBbmFseXRpY3NFdmVudCxcbiAgICAgIHVzZXJJZD86IHN0cmluZyxcbiAgICAgIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPlxuICAgICkgPT4ge1xuICAgICAgaWYgKCF0cmFja09wdGlvbnMpIHJldHVybjtcblxuICAgICAgY29uc3QgYW5hbHl0aWNzID0gZ2V0QW5hbHl0aWNzKFxuICAgICAgICB0cmFja09wdGlvbnMucnNXcml0ZUtleSxcbiAgICAgICAgdHJhY2tPcHRpb25zLnJzRGF0YVBsYW5lVXJsXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0cmFja1Byb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge1xuICAgICAgICBzaXRlX2lkOiB0cmFja09wdGlvbnMuc2l0ZUlkLFxuICAgICAgICB3aWRnZXRfaWQ6IHRyYWNrT3B0aW9ucy53aWRnZXRJZCxcbiAgICAgICAgdHJpZ2dlcjogdHJhY2tPcHRpb25zLnRyaWdnZXIsXG4gICAgICAgIC4uLnByb3BlcnRpZXMsXG4gICAgICB9O1xuXG4gICAgICBhbmFseXRpY3MudHJhY2soXG4gICAgICAgIHRyYWNrT3B0aW9ucy53aWRnZXRUeXBlLFxuICAgICAgICBldmVudCxcbiAgICAgICAgdHJhY2tQcm9wZXJ0aWVzLFxuICAgICAgICB1c2VySWQgPyB7IHVzZXJJZCB9IDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0sXG4gICAgW3RyYWNrT3B0aW9uc11cbiAgKTtcblxuICByZXR1cm4gdHJhY2s7XG59XG4iLCJpbXBvcnQgeyB1c2VBdXRoRGlhbG9nIH0gZnJvbSAnLi4vY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VVc2VyQWN0aW9ucyB9IGZyb20gJy4uL2hvb2tzL3VzZS11c2VyJztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVRva2VucyB9IGZyb20gJy4uL2hvb2tzL3VzZS10b2tlbnMnO1xuaW1wb3J0IHsgQW5hbHl0aWNzRXZlbnQgfSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuaW1wb3J0IHsgdXNlVHJhY2sgfSBmcm9tICcuLi9ob29rcy91c2UtdHJhY2snO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBdXRoRGlhbG9nKCkge1xuICBjb25zdCB7XG4gICAgYXBwTmFtZSxcbiAgICBhcHBEZXNjcmlwdGlvbixcbiAgICBsYW5ndWFnZSxcbiAgICB0cmFja09wdGlvbnMsXG4gICAgaXNPcGVuLFxuICAgIGNsb3NlRGlhbG9nLFxuICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgfSA9IHVzZUF1dGhEaWFsb2coKTtcbiAgY29uc3QgZnJhbWVBcHBOYW1lID0gYXBwTmFtZSB8fCAnQXJlbmEgQUkgQ2hhdCc7XG4gIGNvbnN0IGZyYW1lQXBwRGVzY3JpcHRpb24gPSBhcHBEZXNjcmlwdGlvbiB8fCAnQXJlbmEgQUkgQ2hhdCc7XG4gIGNvbnN0IHsgc2V0VXNlciB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyB1cGRhdGVQdWJsaWNUb2tlbnMgfSA9IHVzZVRva2VucygpO1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG5cbiAgY29uc3QgdHJhY2sgPSB1c2VUcmFjayh0cmFja09wdGlvbnMpO1xuXG4gIGNvbnN0IGlmcmFtZVVybCA9IGAke2NvbmZpZy5hdXRoSWZyYW1lVXJsfS8/YXBwLW5hbWU9JHtmcmFtZUFwcE5hbWV9JmFwcC1kZXNjcmlwdGlvbj0ke2ZyYW1lQXBwRGVzY3JpcHRpb259Jmxhbmd1YWdlPSR7bGFuZ3VhZ2UgPz8gJ2VuJ31gO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlciA9IChtZXNzYWdlOiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnNvdXJjZSAhPT0gJ2FyZW5hLWF1dGhlbnRpY2F0aW9uJykgcmV0dXJuO1xuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnY2FuY2VsZWQnKSB7XG4gICAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2F1dGhlbnRpY2F0aW9uLXZpZXdlZCcpIHtcbiAgICAgICAgdHJhY2soQW5hbHl0aWNzRXZlbnQuQXV0aGVudGljYXRpb25WaWV3ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdhdXRoZW50aWNhdGlvbi1zdGFydGVkJykge1xuICAgICAgICBjb25zdCB7IGF1dGhUeXBlIH0gPSBtZXNzYWdlLmRhdGE/LnBheWxvYWQgfHwge307XG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uU3RhcnRlZCwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgYXV0aFR5cGU6IGF1dGhUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tY29tcGxldGVkJykge1xuICAgICAgICBjb25zdCB7IGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgdXNlciwgYXV0aFR5cGUsIGlzU2lnbnVwIH0gPVxuICAgICAgICAgIG1lc3NhZ2UuZGF0YT8ucGF5bG9hZCB8fCB7fTtcblxuICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBdXRoZW50aWNhdGlvbiBjb21wbGV0ZWQgYnV0IHVzZXIgZGF0YSBpcyBtaXNzaW5nJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2soQW5hbHl0aWNzRXZlbnQuQXV0aGVudGljYXRpb25Db21wbGV0ZWQsIHVzZXIudWlkLCB7XG4gICAgICAgICAgaXNfc2lnbnVwOiBpc1NpZ251cCxcbiAgICAgICAgICBhdXRoX3R5cGU6IGF1dGhUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgb25BdXRoQ29tcGxldGVkPy4odXNlcik7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4pO1xuICAgICAgICBzZXRVc2VyKHVzZXIpO1xuICAgICAgICBjbG9zZURpYWxvZygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG5cbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgfSwgW3NldFVzZXIsIHVwZGF0ZVB1YmxpY1Rva2Vucywgb25BdXRoQ29tcGxldGVkLCB0cmFjaywgY2xvc2VEaWFsb2ddKTtcblxuICByZXR1cm4gaXNPcGVuID8gKFxuICAgIDxpZnJhbWVcbiAgICAgIHNyYz17aWZyYW1lVXJsfVxuICAgICAgdGl0bGU9XCJBcmVuYSBBdXRoZW50aWNhdGlvblwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB3aWR0aDogJzEwMHZ3JyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgICB6SW5kZXg6IDk5OTk5OTk5OTksXG4gICAgICB9fVxuICAgID48L2lmcmFtZT5cbiAgKSA6IG51bGw7XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyB1c2VBdXRoU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3VzZS1hdXRoLXNlcnZpY2VzJztcbmltcG9ydCB7IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIEFub255bW91c1Rva2VuUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pIHtcbiAgY29uc3QgdG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnMpO1xuICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUudXBkYXRlQW5vbnltb3VzVG9rZW5cbiAgKTtcbiAgY29uc3QgeyBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuIH0gPSB1c2VBdXRoU2VydmljZXMoKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdG9rZW5zLmFub255bW91cy5pZFRva2VuKSB7XG4gICAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuKCkudGhlbigodG9rZW46IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW4odG9rZW4uYWNjZXNzX3Rva2VuKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW1xuICAgIHRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbixcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbixcbiAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuLFxuICBdKTtcblxuICByZXR1cm4gY2hpbGRyZW47XG59XG4iLCJpbXBvcnQgeyBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBdXRoU2VydmljZXMoKSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgaWRlbnRpdHlVcmwgPSBjb25maWcuaWRlbnRpdHlTZXJ2aWNlVXJsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldEFub255bW91c0lkZW50aXR5VG9rZW4oKTogUHJvbWlzZTxFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgdXJsID0gYCR7aWRlbnRpdHlVcmx9L2Fub255bW91cy10b2tlbmA7XG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QoJ1BPU1QnLCB1cmwpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuLFxuICB9O1xufVxuIiwiaW1wb3J0IHsgQXV0aERpYWxvZ1Byb3ZpZGVyIH0gZnJvbSAnLi9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG5pbXBvcnQgeyBRdWVyeUNsaWVudCwgUXVlcnlDbGllbnRQcm92aWRlciB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBVc2VyUHJvdmlkZXIgfSBmcm9tICcuL3VzZXItcHJvdmlkZXInO1xuaW1wb3J0IHsgQ29uZmlnUHJvdmlkZXIgfSBmcm9tICcuL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgQXV0aERpYWxvZyBmcm9tICcuLi9kaWFsb2cnO1xuaW1wb3J0IHsgQW5vbnltb3VzVG9rZW5Qcm92aWRlciB9IGZyb20gJy4vYW5vbnltb3VzLXRva2VuLXByb3ZpZGVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIEF1dGhQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICBxdWVyeUNsaWVudCxcbiAgZW52aXJvbm1lbnQsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG4gIHF1ZXJ5Q2xpZW50PzogUXVlcnlDbGllbnQ7XG4gIGVudmlyb25tZW50PzogJ3Byb2R1Y3Rpb24nIHwgJ2RldmVsb3BtZW50Jztcbn0pIHtcbiAgcXVlcnlDbGllbnQgPSBxdWVyeUNsaWVudCB8fCBuZXcgUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gKFxuICAgIDxRdWVyeUNsaWVudFByb3ZpZGVyIGNsaWVudD17cXVlcnlDbGllbnR9PlxuICAgICAgPENvbmZpZ1Byb3ZpZGVyIGVudmlyb25tZW50PXtlbnZpcm9ubWVudH0+XG4gICAgICAgIDxVc2VyUHJvdmlkZXI+XG4gICAgICAgICAgPEF1dGhEaWFsb2dQcm92aWRlcj5cbiAgICAgICAgICAgIDxBbm9ueW1vdXNUb2tlblByb3ZpZGVyPlxuICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICAgIDxBdXRoRGlhbG9nIC8+XG4gICAgICAgICAgICA8L0Fub255bW91c1Rva2VuUHJvdmlkZXI+XG4gICAgICAgICAgPC9BdXRoRGlhbG9nUHJvdmlkZXI+XG4gICAgICAgIDwvVXNlclByb3ZpZGVyPlxuICAgICAgPC9Db25maWdQcm92aWRlcj5cbiAgICA8L1F1ZXJ5Q2xpZW50UHJvdmlkZXI+XG4gICk7XG59XG5cbmV4cG9ydCB7IHVzZUF1dGhEaWFsb2cgfSBmcm9tICcuL2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbiIsImltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgeyBBdXRoQ29va2llIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgdXNlVXNlclN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzJztcbmltcG9ydCB7IGdldENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmZ1bmN0aW9uIGdldFJlZnJlc2hUb2tlbkFwaUtleSgpOiBzdHJpbmcge1xuICBjb25zdCBlbnZpcm9ubWVudCA9XG4gICAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICA/ICdwcm9kdWN0aW9uJ1xuICAgICAgOiAnZGV2ZWxvcG1lbnQnO1xuICByZXR1cm4gZ2V0Q29uZmlnKGVudmlyb25tZW50KS5yZWZyZXNoVG9rZW5BcGlLZXk7XG59XG5cbmNvbnN0IGRlZmF1bHRIZWFkZXJzID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxufTtcblxubGV0IHJlZnJlc2hQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVJlZnJlc2hUb2tlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHJlZnJlc2hQcm9taXNlKSB7XG4gICAgcmV0dXJuIHJlZnJlc2hQcm9taXNlO1xuICB9XG5cbiAgY29uc3QgdXNlclN0b3JlID0gdXNlVXNlclN0b3JlLmdldFN0YXRlKCk7XG4gIHJlZnJlc2hQcm9taXNlID0gdXNlclN0b3JlXG4gICAgLnJlZnJlc2hQdWJsaWNUb2tlbnMoe1xuICAgICAgcmVmcmVzaFRva2VuQXBpS2V5OiBnZXRSZWZyZXNoVG9rZW5BcGlLZXkoKSxcbiAgICB9KVxuICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgIHJlZnJlc2hQcm9taXNlID0gbnVsbDtcbiAgICB9KTtcblxuICByZXR1cm4gcmVmcmVzaFByb21pc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGF1dGhlbnRpY2F0ZWRGZXRjaChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IHRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4pO1xuXG4gIGlmICghdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvdW5kJyk7XG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0ge1xuICAgIC4uLmRlZmF1bHRIZWFkZXJzLFxuICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgfTtcblxuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBtZXRob2QsXG4gICAgaGVhZGVycyxcbiAgfTtcblxuICByZXR1cm4gZmV0Y2godXJsLCBwYXJhbXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZVJlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgaWYgKCFjb250ZW50VHlwZSB8fCAhY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKHsgZXJyb3IgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04gcmVzcG9uc2UgZnJvbSBzZXJ2ZXInKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd09uRXJyb3JSZXNwb25zZShyZXNwb25zZTogUmVzcG9uc2UsIHRleHQ6IHN0cmluZyk6IG5ldmVyIHtcbiAgbGV0IGVycm9yTWVzc2FnZTogc3RyaW5nO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICBlcnJvck1lc3NhZ2UgPSBwYXJzZWQ/LmVycm9ycz8uWzBdIHx8IHRleHQgfHwgJ0ludGVybmFsIHNlcnZlciBlcnJvcic7XG4gIH0gY2F0Y2gge1xuICAgIGVycm9yTWVzc2FnZSA9IHRleHQgfHwgJ0ludGVybmFsIHNlcnZlciBlcnJvcic7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF1dGhlbnRpY2F0ZWRSZXF1ZXN0KFxuICBtZXRob2Q6IHN0cmluZyxcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge31cbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBhc3luYyBmdW5jdGlvbiBhdHRlbXB0KCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXV0aGVudGljYXRlZEZldGNoKG1ldGhvZCwgdXJsLCBvcHRpb25zKTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuIHBhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIHJlcXVlc3QgLSAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignVW5hdXRob3JpemVkJykgYXMgRXJyb3IgJiB7IHN0YXR1cz86IG51bWJlciB9O1xuICAgICAgZXJyLnN0YXR1cyA9IDQwMTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aHJvd09uRXJyb3JSZXNwb25zZShyZXNwb25zZSwgdGV4dCk7XG4gIH1cblxuICBjb25zdCBoYXNUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKTtcblxuICBpZiAoIWhhc1Rva2VuKSB7XG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG4gICAgaWYgKHJlZnJlc2hUb2tlbikge1xuICAgICAgYXdhaXQgZW5zdXJlUmVmcmVzaFRva2VuKCk7XG4gICAgICByZXR1cm4gYXdhaXQgYXR0ZW1wdCgpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvdW5kJyk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBhdHRlbXB0KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgaXM0MDEgPVxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgJ3N0YXR1cycgaW4gZXJyb3IgJiZcbiAgICAgIChlcnJvciBhcyBFcnJvciAmIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cyA9PT0gNDAxO1xuXG4gICAgaWYgKCFpczQwMSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG4gICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hdXRob3JpemVkJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5zdXJlUmVmcmVzaFRva2VuKCk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGF0dGVtcHQoKTtcbiAgICB9IGNhdGNoIChyZXRyeUVycm9yKSB7XG4gICAgICBjb25zdCByZXRyeUlzNDAxID1cbiAgICAgICAgcmV0cnlFcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICdzdGF0dXMnIGluIHJldHJ5RXJyb3IgJiZcbiAgICAgICAgKHJldHJ5RXJyb3IgYXMgRXJyb3IgJiB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwMTtcblxuICAgICAgaWYgKHJldHJ5SXM0MDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmF1dGhvcml6ZWQnKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgcmV0cnlFcnJvcjtcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJBdXRoRGlhbG9nQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJ1bmRlZmluZWQiLCJBdXRoRGlhbG9nUHJvdmlkZXIiLCJjaGlsZHJlbiIsImlzT3BlbiIsInNldElzT3BlbiIsInVzZVN0YXRlIiwiYXBwTmFtZSIsInNldEFwcE5hbWUiLCJhcHBEZXNjcmlwdGlvbiIsInNldEFwcERlc2NyaXB0aW9uIiwib25BdXRoQ29tcGxldGVkIiwic2V0T25BdXRoQ29tcGxldGVkIiwidHJhY2tPcHRpb25zIiwic2V0VHJhY2tPcHRpb25zIiwibGFuZ3VhZ2UiLCJzZXRMYW5ndWFnZSIsIl9qc3giLCJQcm92aWRlciIsInZhbHVlIiwib3BlbkRpYWxvZyIsImNsb3NlRGlhbG9nIiwib25PcGVuQ2hhbmdlIiwib3BlbiIsInVzZUF1dGhEaWFsb2ciLCJjb250ZXh0IiwidXNlQ29udGV4dCIsIkVycm9yIiwiZ2V0Q29uZmlnIiwiZW52aXJvbm1lbnQiLCJpc0RldiIsInByb2ZpbGVTZXJ2aWNlVXJsIiwiaWRlbnRpdHlTZXJ2aWNlVXJsIiwicmVmcmVzaFRva2VuQXBpS2V5IiwiYXV0aElmcmFtZVVybCIsImRlYnVnIiwiQ29uZmlnQ29udGV4dCIsIkNvbmZpZ1Byb3ZpZGVyIiwiY29uZmlnIiwidXNlQ29uZmlnIiwiZGVmYXVsdEhlYWRlcnMiLCJhc3luYyIsInJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJvcHRpb25zIiwicmVzcG9uc2UiLCJmZXRjaCIsImhlYWRlcnMiLCJvayIsInN0YXR1c1RleHQiLCJqc29uIiwiVG9rZW5UeXBlIiwiQXV0aENvb2tpZSIsIlRPS0VOX1VQREFURURfRVZFTlQiLCJkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50IiwidHlwZSIsInBhcmFtcyIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiZGVmYXVsdFRva2VucyIsInB1YmxpYyIsImlkVG9rZW4iLCJDb29raWVzIiwiZ2V0IiwiUFVCTElDX0lEX1RPS0VOIiwicmVmcmVzaFRva2VuIiwiUFVCTElDX1JFRlJFU0hfVE9LRU4iLCJhbm9ueW1vdXMiLCJBTk9OWU1PVVNfSURfVE9LRU4iLCJndWVzdCIsIkdVRVNUX0lEX1RPS0VOIiwiY3VzdG9tIiwiQ1VTVE9NX0lEX1RPS0VOIiwidXNlVG9rZW5TdG9yZSIsImNyZWF0ZSIsInN1YnNjcmliZVdpdGhTZWxlY3RvciIsInNldCIsInVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlciIsInNvdXJjZSIsInRva2VucyIsInN0YXRlIiwiZXhwaXJlcyIsIlBVQkxJQyIsInVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyIiwiQU5PTllNT1VTIiwidXBkYXRlR3Vlc3RUb2tlbnNIZWxwZXIiLCJHVUVTVCIsInVwZGF0ZUN1c3RvbVRva2VuSGVscGVyIiwiQ1VTVE9NIiwiY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIiLCJyZW1vdmUiLCJjbGVhckFub255bW91c1Rva2Vuc0hlbHBlciIsImNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIiLCJjbGVhckN1c3RvbVRva2Vuc0hlbHBlciIsImxvY2FsU3RvcmFnZSIsInJlbW92ZUl0ZW0iLCJDVVNUT01fVVNFUiIsImdldFRva2VuIiwiZ2V0TW9zdFByaXZpbGVnZWRUb2tlbiIsImluY2x1ZGVzIiwiZ2V0UmVmcmVzaFRva2VuIiwidXBkYXRlUHVibGljVG9rZW5zIiwidXBkYXRlQW5vbnltb3VzVG9rZW4iLCJ1cGRhdGVHdWVzdFRva2VucyIsInVwZGF0ZUN1c3RvbVRva2VuIiwiY2xlYXJUb2tlbnMiLCJjbGVhclB1YmxpY1Rva2VucyIsImNsZWFyQW5vbnltb3VzVG9rZW5zIiwiY2xlYXJHdWVzdFRva2VucyIsImNsZWFyQ3VzdG9tVG9rZW5zIiwic2lsZW50VXBkYXRlUHVibGljVG9rZW5zIiwic2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW4iLCJzaWxlbnRVcGRhdGVHdWVzdFRva2VucyIsInNpbGVudFVwZGF0ZUN1c3RvbVRva2VuIiwic2lsZW50Q2xlYXJQdWJsaWNUb2tlbnMiLCJzaWxlbnRDbGVhckFub255bW91c1Rva2VucyIsInNpbGVudENsZWFyR3Vlc3RUb2tlbnMiLCJzaWxlbnRDbGVhckN1c3RvbVRva2VucyIsInVzZVRva2VuRXZlbnRMaXN0ZW5lciIsImV2ZW50U291cmNlUmVmIiwidXNlUmVmIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyIiwidXNlRWZmZWN0IiwiaGFuZGxlVG9rZW5VcGRhdGUiLCJldmVudCIsImN1cnJlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImV2ZW50U291cmNlIiwidXNlVG9rZW5zIiwidXNlVG9rZW4iLCJ1c2VUb2tlblZhbHVlIiwidXNlUmVmcmVzaFRva2VuIiwiQW5hbHl0aWNzV2lkZ2V0VHlwZSIsIkFuYWx5dGljc0V2ZW50IiwidXNlUHJvZmlsZVNlcnZpY2VzIiwidG9rZW4iLCJyZWZyZXNoUHVibGljVG9rZW5zIiwidXNlVXNlckFjdGlvbnMiLCJwcm9maWxlVXJsIiwiZ2V0UHVibGljUHJvZmlsZSIsInVzZXJJZCIsInVwZGF0ZVB1YmxpY1Byb2ZpbGUiLCJBdXRob3JpemF0aW9uIiwicGF5bG9hZCIsInRleHQiLCJzdGF0dXMiLCJlcnJvcnMiLCJKU09OIiwicGFyc2UiLCJjb250ZW50VHlwZSIsImVycm9yIiwiY29uc29sZSIsInNlY3VyZWRSZXF1ZXN0IiwiYm9keSIsInN0cmluZ2lmeSIsInVzZVVzZXJTdG9yZSIsInVzZXIiLCJwdWJsaWNQcm9maWxlIiwicmVmcmVzaGVkVG9rZW5Mb2FkZWQiLCJzZXRVc2VyIiwic2V0UHVibGljUHJvZmlsZSIsInNldFVzZXJCeVRva2VuSWQiLCJqd3REZWNvZGUiLCJ1c2VyUHJvcHMiLCJ1aWQiLCJ1c2VyX2lkIiwiZGlzcGxheU5hbWUiLCJzYWZlRGlzcGxheU5hbWUiLCJlbWFpbCIsInBob3RvVVJMIiwic2FmZVBob3RvVVJMIiwiaGFuZGxlIiwibG9nb3V0IiwidG9rZW5TdG9yZSIsImdldFN0YXRlIiwiRXZlbnQiLCJVUkxTZWFyY2hQYXJhbXMiLCJyZWZyZXNoX3Rva2VuIiwiZ3JhbnRfdHlwZSIsImRhdGEiLCJpZF90b2tlbiIsImxvYWRTdG9yZWRVc2VyIiwicHVibGljSWRUb2tlbiIsInB1YmxpY1JlZnJlc2hUb2tlbiIsImN1c3RvbUlkVG9rZW4iLCJnZXRJdGVtIiwiY3VzdG9tVXNlciIsInBhcnNlZFVzZXIiLCJzc29WMkV4Y2hhbmdlIiwic3NvU291cmNlSUQiLCJqd3QiLCJlbnYiLCJzaWduZWRVc2VyRGF0YSIsImRlY29kZWRVc2VyIiwic3ViIiwidXNlVXNlciIsInVzZVB1YmxpY1Byb2ZpbGUiLCJ1c2VSZWZyZXNoZWRUb2tlbkxvYWRlZCIsInVzZVVwZGF0ZVByb2ZpbGUiLCJ1c2VVc2VyV2l0aFByb2ZpbGUiLCJVc2VyUHJvdmlkZXIiLCJnZXRQdWJsaWNQcm9maWxlU2VydmljZSIsIm11dGF0ZUFzeW5jIiwidXNlTXV0YXRpb24iLCJtdXRhdGlvbkZuIiwibG9hZFB1YmxpY1Byb2ZpbGUiLCJ1c2VDYWxsYmFjayIsInByb2ZpbGUiLCJBTk9OWU1PVVNfSURfS0VZIiwiTFNfS0VZUyIsImdldE9yU2V0QW5vbnltb3VzSWQiLCJleGlzdGluZyIsImlkIiwiY3J5cHRvIiwicmFuZG9tVVVJRCIsInNldEl0ZW0iLCJwYXJzZUNhbXBhaWduIiwidSIsIm91dCIsImZvckVhY2giLCJrIiwidiIsInNlYXJjaFBhcmFtcyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJidWlsZFJ1ZGRlckNvbnRleHQiLCJ3Iiwid2luZG93IiwiZCIsInMiLCJzY3JlZW4iLCJVUkwiLCJsb2NhdGlvbiIsImhyZWYiLCJyZWYiLCJyZWZlcnJlciIsImRvbWFpbiIsImhvc3RuYW1lIiwicmVtZW1iZXJJbml0aWFsUmVmZXJyZXIiLCJpbml0aWFsX3JlZmVycmVyIiwiaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluIiwiY2hhbm5lbCIsImFub255bW91c0lkIiwibG9jYWxlIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwidGltZXpvbmUiLCJJbnRsIiwiRGF0ZVRpbWVGb3JtYXQiLCJyZXNvbHZlZE9wdGlvbnMiLCJ0aW1lWm9uZSIsIm9zIiwibmFtZSIsInBsYXRmb3JtIiwidmVyc2lvbiIsInBhZ2UiLCJwYXRoIiwicGF0aG5hbWUiLCJyZWZlcnJpbmdfZG9tYWluIiwic2VhcmNoIiwidGl0bGUiLCJkZW5zaXR5IiwiZGV2aWNlUGl4ZWxSYXRpbyIsImhlaWdodCIsIndpZHRoIiwiaW5uZXJIZWlnaHQiLCJpbm5lcldpZHRoIiwiY2FtcGFpZ24iLCJnZXRJZGVudGlmaWVyIiwiaWRlbnRpZmllciIsImN1cnJlbnRBbm9ueW1vdXNJZCIsIndhcm4iLCJuZXdBbm9ueW1vdXNJZCIsInJlcGxhY2UiLCJjIiwiciIsImdldENhbm9uaWNhbFVybCIsImNhbm9uaWNhbE1ldGEiLCJxdWVyeVNlbGVjdG9yIiwidXJsT2JqIiwicmVtb3ZlUGFyYW1zRnJvbVVybCIsImdldEV2ZW50UHJvcGVydGllcyIsIndpZGdldFR5cGUiLCJwcm9wZXJ0aWVzIiwiaWRlbnRpdHkiLCJ3aWRnZXRfdHlwZSIsImNhbm9uaWNhbF91cmwiLCJzbmlwcGV0X2lkIiwiX19BUkVOQV9fIiwic25pcHBldElkIiwidGltZXN0YW1wIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiaW50ZWdyYXRpb25zIiwiQWxsIiwiZ2V0RXZlbnRIZWFkZXJzIiwid3JpdGVLZXkiLCJidG9hIiwidXNlVHJhY2siLCJhbmFseXRpY3MiLCJyc1dyaXRlS2V5IiwiZGF0YVBsYW5lVXJsIiwicnNEYXRhUGxhbmVVcmwiLCJ0cmFjayIsInRyYWNrUHJvcGVydGllcyIsInNpdGVfaWQiLCJzaXRlSWQiLCJ3aWRnZXRfaWQiLCJ3aWRnZXRJZCIsInRyaWdnZXIiLCJBdXRoRGlhbG9nIiwiZnJhbWVBcHBOYW1lIiwiZnJhbWVBcHBEZXNjcmlwdGlvbiIsImlmcmFtZVVybCIsImhhbmRsZXIiLCJtZXNzYWdlIiwiYXV0aFR5cGUiLCJBdXRoZW50aWNhdGlvblN0YXJ0ZWQiLCJpc1NpZ251cCIsIkF1dGhlbnRpY2F0aW9uQ29tcGxldGVkIiwiaXNfc2lnbnVwIiwiYXV0aF90eXBlIiwiQXV0aGVudGljYXRpb25WaWV3ZWQiLCJzcmMiLCJzdHlsZSIsInBvc2l0aW9uIiwidG9wIiwibGVmdCIsInpJbmRleCIsIkFub255bW91c1Rva2VuUHJvdmlkZXIiLCJnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuIiwiaWRlbnRpdHlVcmwiLCJ1c2VBdXRoU2VydmljZXMiLCJ0aGVuIiwiYWNjZXNzX3Rva2VuIiwiQXV0aFByb3ZpZGVyIiwicXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50UHJvdmlkZXIiLCJjbGllbnQiLCJfanN4cyIsImdldFJlZnJlc2hUb2tlbkFwaUtleSIsInByb2Nlc3MiLCJOT0RFX0VOViIsInJlZnJlc2hQcm9taXNlIiwiZW5zdXJlUmVmcmVzaFRva2VuIiwidXNlclN0b3JlIiwiZmluYWxseSIsImF1dGhlbnRpY2F0ZWRSZXF1ZXN0IiwiYXR0ZW1wdCIsImF1dGhlbnRpY2F0ZWRGZXRjaCIsInBhcnNlUmVzcG9uc2UiLCJlcnIiLCJlcnJvck1lc3NhZ2UiLCJwYXJzZWQiLCJ0aHJvd09uRXJyb3JSZXNwb25zZSIsInJldHJ5RXJyb3IiXSwibWFwcGluZ3MiOiI0WkFnQkEsTUFBTUEsRUFBb0JDLE9BQ3hCQyxHQVdXQyxFQUFxQixFQUFHQyxlQUNuQyxNQUFPQyxFQUFRQyxHQUFhQyxHQUFTLElBQzlCQyxFQUFTQyxHQUFjRixPQUE2QkwsSUFDcERRLEVBQWdCQyxHQUFxQkosT0FDMUNMLElBRUtVLEVBQWlCQyxHQUFzQk4sT0FFNUNMLElBQ0tZLEVBQWNDLEdBQW1CUixPQUN0Q0wsSUFF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
|
|
1
|
+
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{createContext as n,useContext as o,useState as r,useEffect as i,useRef as s,useCallback as a}from"react";import{useMutation as u,QueryClient as c,QueryClientProvider as l}from"@tanstack/react-query";import{create as d}from"zustand";import{subscribeWithSelector as h}from"zustand/middleware";import p from"js-cookie";import{jwtDecode as k}from"jwt-decode";const f=n(void 0),m=({children:t})=>{const[n,o]=r(!1),[i,s]=r(void 0),[a,u]=r(void 0),[c,l]=r(void 0),[d,h]=r(void 0),[p,k]=r(void 0);return e(f.Provider,{value:{isOpen:n,appName:i,language:p,appDescription:a,trackOptions:d,onAuthCompleted:c,openDialog:({trackOptions:e,appName:t,language:n,appDescription:r,onAuthCompleted:i})=>{o(!0),h(e),s(t),k(n),u(r),l(i)},closeDialog:()=>o(!1),onOpenChange:e=>o(e)},children:t})},T=()=>{const e=o(f);if(!e)throw new Error("useAuthDialog must be used within an AuthDialogProvider");return e};let g="development";const y=e=>{const t="development"===e;return{profileServiceUrl:t?"https://profile-service-dev.arena.im":"https://profile-service-prd.arena.im",identityServiceUrl:t?"https://token-service-dev.arena.im":"https://token-service-prd.arena.im",refreshTokenApiKey:t?"AIzaSyCJhWFCK3ics9kJ2eSgQD7kWHUsOsJyPdk":"AIzaSyD_a4tNVdFVqgGbTfOGCaZ5pvUHErcE79c",authIframeUrl:t?"https://auth2.dev.arena.im":"https://auth2.arena.im",environment:e,debug:"development"===e}},w=n(void 0),U=({children:t,environment:n="development"})=>{const o=y(n);return i(()=>{!function(e){g=e}(n)},[n]),e(w.Provider,{value:{config:o,environment:n},children:t})},S=()=>{const e=o(w);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},I={"Content-Type":"application/json"};async function E(e,t,n={}){const o=await fetch(t,{...n,method:e,headers:{"Content-Type":"application/json",...n.headers}});if(!o.ok)throw new Error(`Error: ${o.statusText}`);return o.json()}var v,_;!function(e){e.ANONYMOUS="anonymous",e.GUEST="guest",e.PUBLIC="public",e.CUSTOM="custom"}(v||(v={})),function(e){e.PUBLIC_ID_TOKEN="arena-auth-public-id-token",e.PUBLIC_REFRESH_TOKEN="arena-auth-public-refresh-token",e.ANONYMOUS_ID_TOKEN="arena-auth-anonymous-id-token",e.GUEST_ID_TOKEN="arena-auth-guest-id-token",e.CUSTOM_ID_TOKEN="arena-auth-custom-id-token",e.CUSTOM_USER="arena-auth-custom-user"}(_||(_={}));const O="arena-auth-token-updated";function P(e,t){document.dispatchEvent(new CustomEvent(O,{detail:{...t,type:e}}))}const C={public:{idToken:p.get(_.PUBLIC_ID_TOKEN)||null,refreshToken:p.get(_.PUBLIC_REFRESH_TOKEN)||null},anonymous:{idToken:p.get(_.ANONYMOUS_ID_TOKEN)||null},guest:{idToken:p.get(_.GUEST_ID_TOKEN)||null},custom:{idToken:p.get(_.CUSTOM_ID_TOKEN)||null}},N=d()(h((e,t)=>{const n=(n,o,r=!0,i)=>{n===t().tokens.public.idToken&&o===t().tokens.public.refreshToken||(e(e=>({tokens:{...e.tokens,public:{idToken:n,refreshToken:o}}})),p.set(_.PUBLIC_ID_TOKEN,n,{expires:1/24}),p.set(_.PUBLIC_REFRESH_TOKEN,o,{expires:30}),r&&P(v.PUBLIC,{idToken:n,refreshToken:o,source:i}))},o=(n,o=!0,r)=>{n!==t().tokens.anonymous.idToken&&(e(e=>({tokens:{...e.tokens,anonymous:{idToken:n}}})),p.set(_.ANONYMOUS_ID_TOKEN,n,{expires:1/24}),o&&P(v.ANONYMOUS,{idToken:n,source:r}))},r=(n,o=!0,r)=>{n!==t().tokens.guest.idToken&&(e(e=>({tokens:{...e.tokens,guest:{idToken:n}}})),p.set(_.GUEST_ID_TOKEN,n,{expires:1/24}),o&&P(v.GUEST,{idToken:n,source:r}))},i=(n,o=!0,r)=>{n!==t().tokens.custom.idToken&&(e(e=>({tokens:{...e.tokens,custom:{idToken:n}}})),p.set(_.CUSTOM_ID_TOKEN,n),o&&P(v.CUSTOM,{idToken:n,source:r}))},s=(t=!0,n)=>{p.remove(_.PUBLIC_ID_TOKEN),p.remove(_.PUBLIC_REFRESH_TOKEN),e(e=>({tokens:{...e.tokens,public:{idToken:null,refreshToken:null}}})),t&&P(v.PUBLIC,{idToken:null,source:n})},a=(t=!0,n)=>{p.remove(_.ANONYMOUS_ID_TOKEN),e(e=>({tokens:{...e.tokens,anonymous:{idToken:null}}})),t&&P(v.ANONYMOUS,{idToken:null,source:n})},u=(t=!0,n)=>{p.remove(_.GUEST_ID_TOKEN),e(e=>({tokens:{...e.tokens,guest:{idToken:null}}})),t&&P(v.GUEST,{idToken:null,source:n})},c=(t=!0,n)=>{p.remove(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_USER),e(e=>({tokens:{...e.tokens,custom:{idToken:null}}})),t&&P(v.CUSTOM,{idToken:null,source:n})};return{tokens:C,getToken:e=>t().tokens[e]?.idToken||null,getMostPrivilegedToken:(e=[v.PUBLIC,v.GUEST,v.ANONYMOUS])=>t().tokens.custom.idToken&&e.includes(v.CUSTOM)?{type:v.CUSTOM,idToken:t().tokens.custom.idToken}:t().tokens.public.idToken&&e.includes(v.PUBLIC)?{type:v.PUBLIC,idToken:t().tokens.public.idToken}:t().tokens.guest.idToken&&e.includes(v.GUEST)?{type:v.GUEST,idToken:t().tokens.guest.idToken}:t().tokens.anonymous.idToken&&e.includes(v.ANONYMOUS)?{type:v.ANONYMOUS,idToken:t().tokens.anonymous.idToken}:null,getRefreshToken:e=>t().tokens[e]?.refreshToken||null,updatePublicTokens:(e,t,o)=>{n(e,t,!0,o)},updateAnonymousToken:(e,t)=>{o(e,!0,t)},updateGuestTokens:(e,t)=>{r(e,!0,t)},updateCustomToken:(e,t)=>{i(e,!0,t)},clearTokens:e=>{s(!0,e),a(!0,e),u(!0,e),c(!0,e)},clearPublicTokens:e=>{s(!0,e)},clearAnonymousTokens:e=>{a(!0,e)},clearGuestTokens:e=>{u(!0,e)},clearCustomTokens:e=>{c(!0,e)},silentUpdatePublicTokens:(e,t)=>{n(e,t,!1)},silentUpdateAnonymousToken:e=>{o(e,!1)},silentUpdateGuestTokens:e=>{r(e,!1)},silentUpdateCustomToken:e=>{i(e,!1)},silentClearPublicTokens:()=>{s(!1)},silentClearAnonymousTokens:()=>{a(!1)},silentClearGuestTokens:()=>{u(!1)},silentClearCustomTokens:()=>{c(!1)}}}));function b(){const e=N(e=>e.silentUpdatePublicTokens),t=N(e=>e.silentUpdateAnonymousToken),n=N(e=>e.silentUpdateGuestTokens),o=N(e=>e.silentUpdateCustomToken),r=N(e=>e.clearTokens),a=N(e=>e.silentClearPublicTokens),u=N(e=>e.silentClearAnonymousTokens),c=N(e=>e.silentClearGuestTokens),l=N(e=>e.silentClearCustomTokens),d=s(`widget-${Math.random().toString(36).substr(2,9)}`);return i(()=>{const r=r=>{const{idToken:i,refreshToken:s,type:h,source:p}=r.detail;if(p!==d.current)switch(h){case v.PUBLIC:if(i){if(!s)throw new Error("Refresh token is required for public tokens");e(i,s)}else a();break;case v.ANONYMOUS:i?t(i):u();break;case v.GUEST:i?n(i):c();break;case v.CUSTOM:i?o(i):l()}};return document.addEventListener(O,r),()=>{document.removeEventListener(O,r)}},[e,t,n,o,r,a,u,c,l]),{eventSource:d.current}}function A(){const e=N(e=>e.getToken),t=N(e=>e.getMostPrivilegedToken),n=N(e=>e.getRefreshToken),o=N(e=>e.updatePublicTokens),r=N(e=>e.updateAnonymousToken),i=N(e=>e.updateGuestTokens),s=N(e=>e.updateCustomToken),a=N(e=>e.clearTokens),u=N(e=>e.clearPublicTokens),c=N(e=>e.clearCustomTokens),{eventSource:l}=b();return{getToken:e,getMostPrivilegedToken:t,getRefreshToken:n,updatePublicTokens:(e,t)=>o(e,t,l),updateAnonymousToken:e=>r(e,l),updateGuestTokens:e=>i(e,l),updateCustomToken:e=>s(e,l),clearTokens:()=>a(l),clearPublicTokens:()=>u(l),clearCustomTokens:()=>c(l)}}function x(e){return N(t=>t.tokens[e])}function L(e){return N(t=>t.tokens[e]?.idToken)}function R(e){return N(t=>t.tokens[e]?.refreshToken)}var D,K;function B(){const e=x(v.PUBLIC),{refreshPublicTokens:t}=J(),{config:n}=S(),o=n.profileServiceUrl;return{getPublicProfile:async function(e){const t=`${o}/public/users/${e}/profile?fields=bio,photoURL,displayName,location,handle`;return await E("GET",t)},updatePublicProfile:async function(r){const i=`${o}/me/profile/personal`;await async function(e){const{method:t,url:n,options:o={},token:r}=e;if(!r)throw new Error("No authentication token found");const i={...I,...o.headers,Authorization:`Bearer ${r}`},s={...o,method:t,headers:i},a=await fetch(n,s);if(!a.ok){const e=await a.text();if(!e)throw new Error(`Error to process request - ${a.status}`);const{errors:t}=JSON.parse(e)||{};throw new Error(t?.[0]||"Internal server error")}const u=a.headers.get("content-type");if(!u||!u.includes("application/json"))return a;const c=await a.text();if(!c)return null;try{return JSON.parse(c)}catch(e){throw console.error(e),new Error("Invalid JSON response from server")}}({method:"PUT",url:i,options:{body:JSON.stringify(r)},token:e.idToken}),t({refreshTokenApiKey:n.refreshTokenApiKey})}}}!function(e){e.AvatarProfile="avatar-profile",e.AvatarChat="avatar-chat",e.Comments="comments",e.GlobalProfile="global-profile",e.GroupChat="group-chat",e.Polls="polls",e.UniversalSnippet="universal-snippet"}(D||(D={})),function(e){e.AuthenticationCompleted="Authentication Completed",e.AuthenticationStarted="Authentication Started",e.AuthenticationViewed="Authentication Viewed"}(K||(K={}));const M=d()(h((e,t)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:t=>{e({user:t})},setPublicProfile:t=>{e({publicProfile:t})},setUserByTokenId:t=>{try{const n=k(t),o={uid:n.user_id,displayName:n.safeDisplayName,email:n.email,photoURL:n.safePhotoURL,handle:n.handle};e({user:o})}catch(e){console.error(e)}},logout:()=>{try{const t=N.getState();t.clearPublicTokens(),t.clearCustomTokens(),e({user:null}),document.dispatchEvent(new Event("arena-comments-logout"))}catch(e){console.error(e)}},refreshPublicTokens:async e=>{try{const n=p.get(_.PUBLIC_REFRESH_TOKEN);if(!n)throw new Error("No refresh token found");const o=`${"https://securetoken.googleapis.com/v1/token?key="}${e.refreshTokenApiKey}`,r=await fetch(o,{method:"POST",body:new URLSearchParams({refresh_token:n,grant_type:"refresh_token"})}),i=await r.json(),{setUserByTokenId:s}=t();s(i.id_token);N.getState().updatePublicTokens(i.id_token,i.refresh_token)}catch(e){console.error(e);const{logout:n}=t();n()}},loadStoredUser:async n=>{const o=p.get(_.PUBLIC_ID_TOKEN),r=p.get(_.PUBLIC_REFRESH_TOKEN),i=localStorage.getItem(_.CUSTOM_ID_TOKEN),s=localStorage.getItem(_.CUSTOM_USER);if(i&&s){const t=JSON.parse(s);e({user:t});N.getState().updateCustomToken(i)}else if(o){const{setUserByTokenId:e}=t();e(o)}else if(r&&n){const{refreshPublicTokens:e}=t();await e(n)}e({refreshedTokenLoaded:!0})},ssoV2Exchange:async(e,n,o)=>{try{const r=y(o??"production"),i=`${r.profileServiceUrl}/sso/sources/${e}/user`,s=await E("POST",i,{body:JSON.stringify({signedUserData:n})});if(s){const e=k(s.token),{setUser:n,setPublicProfile:o}=t();n({uid:e?.sub,email:e?.email,displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle}),o({displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle});N.getState().updateCustomToken(s.token)}return s}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function $(){return M(e=>e.user)}function G(){return M(e=>e.publicProfile)}function F(){return M(e=>e.refreshedTokenLoaded)}function J(){return{setUser:M(e=>e.setUser),setPublicProfile:M(e=>e.setPublicProfile),logout:M(e=>e.logout),refreshPublicTokens:M(e=>e.refreshPublicTokens),setUserByTokenId:M(e=>e.setUserByTokenId),loadStoredUser:M(e=>e.loadStoredUser),ssoV2Exchange:M(e=>e.ssoV2Exchange)}}function j(){const{updatePublicProfile:e}=B();return{updatePublicProfile:e}}function z(){return{user:M(e=>e.user),publicProfile:M(e=>e.publicProfile),refreshedTokenLoaded:M(e=>e.refreshedTokenLoaded)}}function H({children:e}){const{config:t}=S(),n=$(),{setPublicProfile:o,loadStoredUser:r}=J(),{getPublicProfile:s}=B(),{mutateAsync:c}=u({mutationFn:s}),l=a(async()=>{if(n?.uid){const e=await c(n.uid);o(e)}},[n?.uid,c,o]);return i(()=>{l()},[l]),i(()=>{r(t)},[t,r]),e}const Y="arenaAnonymousId",V="rs_anonymous_id",q="rs_initial_referrer",W="rs_initial_referring_domain";function Z(){const e=localStorage.getItem(V);if(e)return e;const t=crypto.randomUUID();return localStorage.setItem(V,t),t}function Q(e){const t={};return["utm_source","utm_medium","utm_campaign","utm_term","utm_content"].forEach(n=>{const o=e.searchParams.get(n);o&&(t[n]=o)}),Object.keys(t).length?t:void 0}function X(){const e=window,t=document,n=window.screen,o=new URL(e.location.href);!function(){if(!localStorage.getItem(q)){const e=document.referrer||"$direct",t="$direct"!==e?new URL(e).hostname:"";localStorage.setItem(q,e),localStorage.setItem(W,t)}}();const r=localStorage.getItem(q)||"$direct",i=localStorage.getItem(W)||"";return{channel:"web",anonymousId:Z(),locale:navigator.language,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,os:{name:navigator.platform,version:void 0},page:{path:o.pathname,referrer:t.referrer||"$direct",referring_domain:t.referrer?new URL(t.referrer).hostname:"",search:o.search,title:t.title,url:o.toString(),initial_referrer:r,initial_referring_domain:i},screen:{density:e.devicePixelRatio||1,height:n.height,width:n.width,innerHeight:e.innerHeight,innerWidth:e.innerWidth},campaign:Q(o)}}function ee(e={}){const t={};e.userId&&(t.userId=e.userId);let n=null;try{n=localStorage.getItem(Y)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(Y,e.anonymousId)}catch(e){console.warn("Failed to save anonymousId to localStorage:",e)}}else if(n)t.anonymousId=n;else{const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)});t.anonymousId=e;try{localStorage.setItem(Y,e)}catch(e){console.warn("Failed to save new anonymousId to localStorage:",e)}}return t}function te(){const e=document.querySelector('link[rel="canonical"]');return function(e){try{const t=new URL(e);return t.search="",t.href}catch(t){return console.error("Error clearing search params from URL:",t),e}}(e?.href||window.location.href)}function ne(e,t,n){return{properties:{widget_type:e,url:window.location.href,domain:window.location.hostname,title:window.document.title,canonical_url:te(),snippet_id:window.__ARENA__?.snippetId||null,...t},context:X(),timestamp:(new Date).toISOString(),integrations:{All:!0},...ee(n)}}function oe(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function re(e){return a((t,n,o)=>{if(!e)return;const r=(i=e.rsWriteKey,s=e.rsDataPlaneUrl,{page:async(e,t,n)=>{const o=await fetch(`${s}/v1/page`,{method:"POST",headers:oe(i),body:JSON.stringify({type:"page",...ne(e,t,n)})});if(o.ok)return await o.text();throw new Error("Failed to send page event to Rudderstack")},track:async(e,t,n,o)=>{const r=await fetch(`${s}/v1/track`,{method:"POST",headers:oe(i),body:JSON.stringify({event:t,type:"track",...ne(e,n,o)})});if(r.ok)return await r.text();throw new Error("Failed to send track event to Rudderstack")}});var i,s;const a={site_id:e.siteId,widget_id:e.widgetId,trigger:e.trigger,...o};r.track(e.widgetType,t,a,n?{userId:n}:void 0)},[e])}function ie(){const{appName:t,appDescription:n,language:o,trackOptions:r,isOpen:s,closeDialog:a,onAuthCompleted:u}=T(),c=t||"Arena AI Chat",l=n||"Arena AI Chat",{setUser:d}=J(),{updatePublicTokens:h}=A(),{config:p}=S(),k=re(r),f=`${p.authIframeUrl}/?app-name=${c}&app-description=${l}&language=${o??"en"}`;return i(()=>{const e=e=>{if("arena-authentication"===e.data?.source)if("canceled"!==e.data?.type)if("authentication-viewed"!==e.data?.type){if("authentication-started"===e.data?.type){const{authType:t}=e.data?.payload||{};return void k(K.AuthenticationStarted,void 0,{authType:t})}if("authentication-completed"===e.data?.type){const{idToken:t,refreshToken:n,user:o,authType:r,isSignup:i}=e.data?.payload||{};return o?(k(K.AuthenticationCompleted,o.uid,{is_signup:i,auth_type:r}),u?.(o),h(t,n),d(o),void a()):void console.error("Authentication completed but user data is missing")}}else k(K.AuthenticationViewed);else a()};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[d,h,u,k,a]),s?e("iframe",{src:f,title:"Arena Authentication",style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",zIndex:9999999999}}):null}function se(e){const t=e?.trim();return t&&"null"!==t&&"undefined"!==t?t:null}function ae(){if("undefined"==typeof window)return null;const e=window,t=se(e.rudderanalytics?.getAnonymousId?.()??e.rudderAnalytics?.getAnonymousId?.());if(t)return t;try{return se(window.localStorage.getItem("arena-analytics:rs-anonymous-id"))}catch{return null}}function ue({children:e}){const{config:t}=S(),n=N(e=>e.tokens),o=N(e=>e.updateAnonymousToken),{getAnonymousIdentityToken:r}=function(){const{config:e}=S(),t=e.identityServiceUrl;return{getAnonymousIdentityToken:async function(){const e=`${t}/anonymous-token`,n=ae();return n?await E("POST",e,{body:JSON.stringify({anonymousId:n})}):await E("POST",e)}}}(),a=s(!1);return i(()=>{const e=ae();(!n.anonymous.idToken||t.debug&&Boolean(e)&&!a.current)&&(n.anonymous.idToken&&(a.current=!0),r().then(e=>{o(e.access_token,n.anonymous.idToken?"force-refresh-debug":void 0)}).catch(e=>{n.anonymous.idToken&&(a.current=!1),console.error("[react-sdk-auth] getAnonymousIdentityToken failed",{error:e})}))},[t.debug,n.anonymous.idToken,o,r]),e}function ce({children:n,queryClient:o,environment:r}){return o=o||new c,e(l,{client:o,children:e(U,{environment:r,children:e(H,{children:e(m,{children:t(ue,{children:[n,e(ie,{})]})})})})})}function le(){return y(g).refreshTokenApiKey}const de={"Content-Type":"application/json"};let he=null;async function pe(){if(he)return he;const e=M.getState();return he=e.refreshPublicTokens({refreshTokenApiKey:le()}).finally(()=>{he=null}),he}async function ke(e,t,n={}){async function o(){const o=await async function(e,t,n={}){const o=p.get(_.PUBLIC_ID_TOKEN);if(!o)throw new Error("No authentication token found");const r={...de,...n.headers,Authorization:`Bearer ${o}`},i={...n,method:e,headers:r};return fetch(t,i)}(e,t,n);if(o.ok)return async function(e){const t=e.headers.get("content-type");if(!t||!t.includes("application/json"))return e;const n=await e.text();if(!n)return null;try{return JSON.parse(n)}catch(e){throw console.error({error:e}),new Error("Invalid JSON response from server")}}(o);const r=await o.text();if(!r)throw new Error(`Failed to process request - ${o.status}`);if(401===o.status){const e=new Error("Unauthorized");throw e.status=401,e}!function(e,t){let n;try{const e=JSON.parse(t);n=e?.errors?.[0]||t||"Internal server error"}catch{n=t||"Internal server error"}throw new Error(n)}(0,r)}if(!p.get(_.PUBLIC_ID_TOKEN)){if(p.get(_.PUBLIC_REFRESH_TOKEN))return await pe(),await o();throw new Error("No authentication token found")}try{return await o()}catch(e){if(!(e instanceof Error&&"status"in e&&401===e.status))throw e;if(!p.get(_.PUBLIC_REFRESH_TOKEN))throw new Error("Unauthorized");await pe();try{return await o()}catch(e){if(e instanceof Error&&"status"in e&&401===e.status)throw new Error("Unauthorized");throw e}}}export{K as AnalyticsEvent,D as AnalyticsWidgetType,_ as AuthCookie,ce as AuthProvider,v as TokenType,ke as authenticatedRequest,T as useAuthDialog,G as usePublicProfile,R as useRefreshToken,F as useRefreshedTokenLoaded,x as useToken,b as useTokenEventListener,N as useTokenStore,L as useTokenValue,A as useTokens,j as useUpdateProfile,$ as useUser,J as useUserActions,M as useUserStore,z as useUserWithProfile};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL3J1bnRpbWUtZW52aXJvbm1lbnQudHMiLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vc3JjL3R5cGVzL3Rva2VuLnRzIiwiLi4vc3JjL3V0aWxzL2RvbS1ldmVudHMudHMiLCIuLi9zcmMvc3RvcmVzL3Rva2VuLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lci50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW5zLnRzIiwiLi4vc3JjL3R5cGVzL2FuYWx5dGljcy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzLnRzIiwiLi4vc3JjL3N0b3Jlcy91c2VyLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS11c2VyLnRzIiwiLi4vc3JjL2NvbnRleHQvdXNlci1wcm92aWRlci50c3giLCIuLi9zcmMvdXRpbHMvYW5hbHl0aWNzLnRzIiwiLi4vc3JjL3V0aWxzL3VybC50cyIsIi4uL3NyYy9ob29rcy91c2UtdHJhY2sudHMiLCIuLi9zcmMvZGlhbG9nL2luZGV4LnRzeCIsIi4uL3NyYy9zZXJ2aWNlcy9hdXRoL3VzZS1hdXRoLXNlcnZpY2VzLnRzIiwiLi4vc3JjL2NvbnRleHQvYW5vbnltb3VzLXRva2VuLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy9jb250ZXh0L2luZGV4LnRzeCIsIi4uL3NyYy91dGlscy9hdXRoZW50aWNhdGVkLXJlcXVlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlU3RhdGUsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFVzZXJQcm9wcyB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgVHJhY2tPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuaW50ZXJmYWNlIEF1dGhEaWFsb2dDb250ZXh0VHlwZSB7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgYXBwTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBhcHBEZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cmFja09wdGlvbnM6IFRyYWNrT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgb25BdXRoQ29tcGxldGVkOiAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIG9wZW5EaWFsb2c6IChvcHRpb25zOiBPcGVuRGlhbG9nT3B0aW9ucykgPT4gdm9pZDtcbiAgY2xvc2VEaWFsb2c6ICgpID0+IHZvaWQ7XG4gIG9uT3BlbkNoYW5nZTogKG9wZW46IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IEF1dGhEaWFsb2dDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxBdXRoRGlhbG9nQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KFxuICB1bmRlZmluZWRcbik7XG5cbnR5cGUgT3BlbkRpYWxvZ09wdGlvbnMgPSB7XG4gIHRyYWNrT3B0aW9uczogVHJhY2tPcHRpb25zO1xuICBhcHBOYW1lPzogc3RyaW5nO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgYXBwRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG9uQXV0aENvbXBsZXRlZD86ICgpID0+ICh1c2VyOiBVc2VyUHJvcHMpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgY29uc3QgQXV0aERpYWxvZ1Byb3ZpZGVyID0gKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pID0+IHtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2FwcE5hbWUsIHNldEFwcE5hbWVdID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBjb25zdCBbYXBwRGVzY3JpcHRpb24sIHNldEFwcERlc2NyaXB0aW9uXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIGNvbnN0IFtvbkF1dGhDb21wbGV0ZWQsIHNldE9uQXV0aENvbXBsZXRlZF0gPSB1c2VTdGF0ZTxcbiAgICAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBjb25zdCBbdHJhY2tPcHRpb25zLCBzZXRUcmFja09wdGlvbnNdID0gdXNlU3RhdGU8VHJhY2tPcHRpb25zIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgW2xhbmd1YWdlLCBzZXRMYW5ndWFnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBjb25zdCBvcGVuRGlhbG9nID0gKHtcbiAgICB0cmFja09wdGlvbnMsXG4gICAgYXBwTmFtZSxcbiAgICBsYW5ndWFnZSxcbiAgICBhcHBEZXNjcmlwdGlvbixcbiAgICBvbkF1dGhDb21wbGV0ZWQsXG4gIH06IE9wZW5EaWFsb2dPcHRpb25zKSA9PiB7XG4gICAgc2V0SXNPcGVuKHRydWUpO1xuICAgIHNldFRyYWNrT3B0aW9ucyh0cmFja09wdGlvbnMpO1xuICAgIHNldEFwcE5hbWUoYXBwTmFtZSk7XG4gICAgc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpO1xuICAgIHNldEFwcERlc2NyaXB0aW9uKGFwcERlc2NyaXB0aW9uKTtcbiAgICBzZXRPbkF1dGhDb21wbGV0ZWQob25BdXRoQ29tcGxldGVkKTtcbiAgfTtcblxuICBjb25zdCBjbG9zZURpYWxvZyA9ICgpID0+IHNldElzT3BlbihmYWxzZSk7XG4gIGNvbnN0IG9uT3BlbkNoYW5nZSA9IChvcGVuOiBib29sZWFuKSA9PiBzZXRJc09wZW4ob3Blbik7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXJcbiAgICAgIHZhbHVlPXt7XG4gICAgICAgIGlzT3BlbixcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIGFwcERlc2NyaXB0aW9uLFxuICAgICAgICB0cmFja09wdGlvbnMsXG4gICAgICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgICAgICAgb3BlbkRpYWxvZyxcbiAgICAgICAgY2xvc2VEaWFsb2csXG4gICAgICAgIG9uT3BlbkNoYW5nZSxcbiAgICAgIH19XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQXV0aERpYWxvZyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQXV0aERpYWxvZ0NvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUF1dGhEaWFsb2cgbXVzdCBiZSB1c2VkIHdpdGhpbiBhbiBBdXRoRGlhbG9nUHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iLCJpbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4vaW5kZXgnO1xuXG5sZXQgcnVudGltZUVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9ICdkZXZlbG9wbWVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRSdW50aW1lRW52aXJvbm1lbnQoZW52aXJvbm1lbnQ6IEVudmlyb25tZW50KTogdm9pZCB7XG4gIHJ1bnRpbWVFbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVudGltZUVudmlyb25tZW50KCk6IEVudmlyb25tZW50IHtcbiAgcmV0dXJuIHJ1bnRpbWVFbnZpcm9ubWVudDtcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgcHJvZmlsZVNlcnZpY2VVcmw6IHN0cmluZztcbiAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nO1xuICBhdXRoSWZyYW1lVXJsOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuICBkZWJ1ZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnQgPSAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gKGVudmlyb25tZW50OiBFbnZpcm9ubWVudCk6IENvbmZpZyA9PiB7XG4gIGNvbnN0IGlzRGV2ID0gZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCc7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9maWxlU2VydmljZVVybDogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLWRldi5hcmVuYS5pbSdcbiAgICAgIDogcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9QUkQgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5JREVOVElUWV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vdG9rZW4tc2VydmljZS1kZXYuYXJlbmEuaW0nXG4gICAgICA6IHByb2Nlc3MuZW52LklERU5USVRZX1NFUlZJQ0VfVVJMX1BSRCB8fFxuICAgICAgICAnaHR0cHM6Ly90b2tlbi1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgcmVmcmVzaFRva2VuQXBpS2V5OiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5GSVJFQkFTRV9QVUJMSUNfQVBJX0tFWV9ERVYgfHxcbiAgICAgICAgJ0FJemFTeUNKaFdGQ0szaWNzOWtKMmVTZ1FEN2tXSFVzT3NKeVBkaydcbiAgICAgIDogcHJvY2Vzcy5lbnYuRklSRUJBU0VfUFVCTElDX0FQSV9LRVlfUFJEIHx8XG4gICAgICAgICdBSXphU3lELTl0U3JRV243M1MwcW02QnFFSDUtMTJIcThMMGVUc1EnLFxuICAgIGF1dGhJZnJhbWVVcmw6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LkFVVEhfSUZSQU1FX1VSTF9ERVYgfHwgJ2h0dHBzOi8vYXV0aDIuZGV2LmFyZW5hLmltJ1xuICAgICAgOiBwcm9jZXNzLmVudi5BVVRIX0lGUkFNRV9VUkxfUFJEIHx8ICdodHRwczovL2F1dGgyLmFyZW5hLmltJyxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBkZWJ1ZzogZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCcsXG4gIH07XG59O1xuXG5leHBvcnQge1xuICBzZXRSdW50aW1lRW52aXJvbm1lbnQsXG4gIGdldFJ1bnRpbWVFbnZpcm9ubWVudCxcbn0gZnJvbSAnLi9ydW50aW1lLWVudmlyb25tZW50JztcbiIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIFJlYWN0Tm9kZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnLCBFbnZpcm9ubWVudCwgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IHNldFJ1bnRpbWVFbnZpcm9ubWVudCB9IGZyb20gJy4uL2NvbmZpZy9ydW50aW1lLWVudmlyb25tZW50JztcblxuaW50ZXJmYWNlIENvbmZpZ0NvbnRleHRUeXBlIHtcbiAgY29uZmlnOiBDb25maWc7XG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudDtcbn1cblxuY29uc3QgQ29uZmlnQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8Q29uZmlnQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbmludGVyZmFjZSBDb25maWdQcm92aWRlclByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IENvbmZpZ1Byb3ZpZGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGVudmlyb25tZW50ID0gJ2RldmVsb3BtZW50Jyxcbn06IENvbmZpZ1Byb3ZpZGVyUHJvcHMpID0+IHtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKGVudmlyb25tZW50KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFJ1bnRpbWVFbnZpcm9ubWVudChlbnZpcm9ubWVudCk7XG4gIH0sIFtlbnZpcm9ubWVudF0pO1xuXG4gIHJldHVybiAoXG4gICAgPENvbmZpZ0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgY29uZmlnLCBlbnZpcm9ubWVudCB9fT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0NvbmZpZ0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQ29uZmlnID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VDb25maWcgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIENvbmZpZ1Byb3ZpZGVyJyk7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIiwiY29uc3QgZGVmYXVsdEhlYWRlcnMgPSB7XG4gICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XG4pIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VjdXJlZFJlcXVlc3QocGFyYW1zOiB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgb3B0aW9uczogUmVxdWVzdEluaXQ7XG4gIHRva2VuOiBzdHJpbmc7XG59KSB7XG4gIGNvbnN0IHsgbWV0aG9kLCB1cmwsIG9wdGlvbnMgPSB7fSwgdG9rZW4gfSA9IHBhcmFtcztcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gYXV0aGVudGljYXRpb24gdG9rZW4gZm91bmQnKTtcbiAgfVxuXG4gIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLi4uZGVmYXVsdEhlYWRlcnMsXG4gICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICB9O1xuXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBtZXRob2QsXG4gICAgaGVhZGVycyxcbiAgfTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgcGF5bG9hZCk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRvIHByb2Nlc3MgcmVxdWVzdCAtICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBKU09OLnBhcnNlKHRleHQpIHx8IHt9O1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9ycz8uWzBdIHx8ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICB9XG5cbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04gcmVzcG9uc2UgZnJvbSBzZXJ2ZXInKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gVG9rZW5UeXBlIHtcbiAgQU5PTllNT1VTID0gJ2Fub255bW91cycsXG4gIEdVRVNUID0gJ2d1ZXN0JyxcbiAgUFVCTElDID0gJ3B1YmxpYycsXG4gIENVU1RPTSA9ICdjdXN0b20nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUGFpciB7XG4gIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCB0eXBlIFRva2Vuc01hcCA9IFJlY29yZDxUb2tlblR5cGUsIFRva2VuUGFpcj47XG5cbmV4cG9ydCBlbnVtIEF1dGhDb29raWUge1xuICBQVUJMSUNfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1wdWJsaWMtaWQtdG9rZW4nLFxuICBQVUJMSUNfUkVGUkVTSF9UT0tFTiA9ICdhcmVuYS1hdXRoLXB1YmxpYy1yZWZyZXNoLXRva2VuJyxcbiAgQU5PTllNT1VTX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtYW5vbnltb3VzLWlkLXRva2VuJyxcbiAgR1VFU1RfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1ndWVzdC1pZC10b2tlbicsXG4gIENVU1RPTV9JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLWN1c3RvbS1pZC10b2tlbicsXG4gIENVU1RPTV9VU0VSID0gJ2FyZW5hLWF1dGgtY3VzdG9tLXVzZXInLFxufVxuIiwiaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuXG5leHBvcnQgY29uc3QgVE9LRU5fVVBEQVRFRF9FVkVOVCA9ICdhcmVuYS1hdXRoLXRva2VuLXVwZGF0ZWQnO1xuXG5pbnRlcmZhY2UgVG9rZW5FdmVudFBhcmFtcyB7XG4gIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG4gIHNvdXJjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoXG4gIHR5cGU6IFRva2VuVHlwZSxcbiAgcGFyYW1zOiBUb2tlbkV2ZW50UGFyYW1zXG4pIHtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICBuZXcgQ3VzdG9tRXZlbnQoVE9LRU5fVVBEQVRFRF9FVkVOVCwge1xuICAgICAgZGV0YWlsOiB7IC4uLnBhcmFtcywgdHlwZSB9LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJztcbmltcG9ydCB7IHN1YnNjcmliZVdpdGhTZWxlY3RvciB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXV0aENvb2tpZSwgVG9rZW5zTWFwLCBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZG9tLWV2ZW50cyc7XG5cbmludGVyZmFjZSBUb2tlblN0b3JlIHtcbiAgdG9rZW5zOiBUb2tlbnNNYXA7XG4gIGdldFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiBzdHJpbmcgfCBudWxsO1xuICBnZXRNb3N0UHJpdmlsZWdlZFRva2VuOiAoXG4gICAgb3B0aW9ucz86IEFycmF5PFRva2VuVHlwZT5cbiAgKSA9PiB7IHR5cGU6IFRva2VuVHlwZTsgaWRUb2tlbjogc3RyaW5nIH0gfCBudWxsO1xuICBnZXRSZWZyZXNoVG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHN0cmluZyB8IG51bGw7XG4gIHVwZGF0ZVB1YmxpY1Rva2VuczogKFxuICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgICBzb3VyY2U/OiBzdHJpbmdcbiAgKSA9PiB2b2lkO1xuICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhclRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJQdWJsaWNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyQW5vbnltb3VzVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckd1ZXN0VG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckN1c3RvbVRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJQdWJsaWNUb2tlbnM6ICgpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckd1ZXN0VG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckN1c3RvbVRva2VuczogKCkgPT4gdm9pZDtcbn1cblxuY29uc3QgZGVmYXVsdFRva2VuczogVG9rZW5zTWFwID0ge1xuICBwdWJsaWM6IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTikgfHwgbnVsbCxcbiAgICByZWZyZXNoVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGFub255bW91czoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxuICBndWVzdDoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGN1c3RvbToge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHVzZVRva2VuU3RvcmUgPSBjcmVhdGU8VG9rZW5TdG9yZT4oKShcbiAgc3Vic2NyaWJlV2l0aFNlbGVjdG9yKChzZXQsIGdldCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLnB1YmxpYy5pZFRva2VuICYmXG4gICAgICAgIHJlZnJlc2hUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLnB1YmxpYy5yZWZyZXNoVG9rZW5cbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgcHVibGljOiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOLCByZWZyZXNoVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMzAsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuUFVCTElDLCB7XG4gICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICByZWZyZXNoVG9rZW4sXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgYW5vbnltb3VzOiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5BTk9OWU1PVVMsIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLmd1ZXN0LmlkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGd1ZXN0OiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4sIGlkVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMSAvIDI0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkdVRVNULCB7IGlkVG9rZW4sIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgY3VzdG9tOiB7IGlkVG9rZW4gfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4sIGlkVG9rZW4pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5DVVNUT00sIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBwdWJsaWM6IHsgaWRUb2tlbjogbnVsbCwgcmVmcmVzaFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLlBVQkxJQywgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBhbm9ueW1vdXM6IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5BTk9OWU1PVVMsIHtcbiAgICAgICAgICBpZFRva2VuOiBudWxsLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5HVUVTVF9JRF9UT0tFTik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgZ3Vlc3Q6IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5HVUVTVCwgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKEF1dGhDb29raWUuQ1VTVE9NX1VTRVIpO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGN1c3RvbTogeyBpZFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkNVU1RPTSwgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b2tlbnM6IGRlZmF1bHRUb2tlbnMsXG5cbiAgICAgIGdldFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXQoKS50b2tlbnNbdHlwZV0/LmlkVG9rZW4gfHwgbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIGdldE1vc3RQcml2aWxlZ2VkVG9rZW46IChcbiAgICAgICAgb3B0aW9ucyA9IFtUb2tlblR5cGUuUFVCTElDLCBUb2tlblR5cGUuR1VFU1QsIFRva2VuVHlwZS5BTk9OWU1PVVNdXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5DVVNUT00pKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5DVVNUT00sXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuY3VzdG9tLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5wdWJsaWMuaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5QVUJMSUMpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5QVUJMSUMsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMucHVibGljLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5ndWVzdC5pZFRva2VuICYmIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLkdVRVNUKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuR1VFU1QsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuZ3Vlc3QuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZ2V0KCkudG9rZW5zLmFub255bW91cy5pZFRva2VuICYmXG4gICAgICAgICAgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuQU5PTllNT1VTKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLkFOT05ZTU9VUyxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIGdldFJlZnJlc2hUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KCkudG9rZW5zW3R5cGVdPy5yZWZyZXNoVG9rZW4gfHwgbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZVB1YmxpY1Rva2VuczogKFxuICAgICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICAgICkgPT4ge1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIoaWRUb2tlbiwgcmVmcmVzaFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVDdXN0b21Ub2tlbkhlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJQdWJsaWNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhckd1ZXN0VG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlcihpZFRva2VuLCByZWZyZXNoVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUN1c3RvbVRva2VuSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyUHVibGljVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyUHVibGljVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyR3Vlc3RUb2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhckN1c3RvbVRva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH0pXG4pO1xuIiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IFRPS0VOX1VQREFURURfRVZFTlQgfSBmcm9tICcuLi91dGlscy9kb20tZXZlbnRzJztcblxuaW50ZXJmYWNlIFRva2VuVXBkYXRlRXZlbnQge1xuICBkZXRhaWw6IHtcbiAgICBpZFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG4gICAgdHlwZTogVG9rZW5UeXBlO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuRXZlbnRMaXN0ZW5lcigpIHtcbiAgY29uc3QgdXBkYXRlUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnNcbiAgKTtcbiAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVHdWVzdFRva2Vuc1xuICApO1xuICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlQ3VzdG9tVG9rZW5cbiAgKTtcbiAgY29uc3QgY2xlYXJUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyVG9rZW5zKTtcbiAgY29uc3QgY2xlYXJQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyUHVibGljVG9rZW5zXG4gICk7XG4gIGNvbnN0IGNsZWFyQW5vbnltb3VzVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckFub255bW91c1Rva2Vuc1xuICApO1xuICBjb25zdCBjbGVhckd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckd1ZXN0VG9rZW5zKTtcbiAgY29uc3QgY2xlYXJDdXN0b21Ub2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyQ3VzdG9tVG9rZW5zXG4gICk7XG5cbiAgY29uc3QgZXZlbnRTb3VyY2VSZWYgPSB1c2VSZWY8c3RyaW5nPihcbiAgICBgd2lkZ2V0LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWBcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVRva2VuVXBkYXRlID0gKFxuICAgICAgZXZlbnQ6IEN1c3RvbUV2ZW50PFRva2VuVXBkYXRlRXZlbnRbJ2RldGFpbCddPlxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBpZFRva2VuLCByZWZyZXNoVG9rZW4sIHR5cGUsIHNvdXJjZSB9ID0gZXZlbnQuZGV0YWlsO1xuXG4gICAgICBpZiAoc291cmNlID09PSBldmVudFNvdXJjZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLlBVQkxJQzpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWZyZXNoIHRva2VuIGlzIHJlcXVpcmVkIGZvciBwdWJsaWMgdG9rZW5zJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuQU5PTllNT1VTOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbihpZFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuR1VFU1Q6XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zKGlkVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhckd1ZXN0VG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkNVU1RPTTpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgdXBkYXRlQ3VzdG9tVG9rZW4oaWRUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgVE9LRU5fVVBEQVRFRF9FVkVOVCxcbiAgICAgIGhhbmRsZVRva2VuVXBkYXRlIGFzIEV2ZW50TGlzdGVuZXJcbiAgICApO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFRPS0VOX1VQREFURURfRVZFTlQsXG4gICAgICAgIGhhbmRsZVRva2VuVXBkYXRlIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgICk7XG4gICAgfTtcbiAgfSwgW1xuICAgIHVwZGF0ZVB1YmxpY1Rva2VucyxcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbixcbiAgICB1cGRhdGVHdWVzdFRva2VucyxcbiAgICB1cGRhdGVDdXN0b21Ub2tlbixcbiAgICBjbGVhclRva2VucyxcbiAgICBjbGVhclB1YmxpY1Rva2VucyxcbiAgICBjbGVhckFub255bW91c1Rva2VucyxcbiAgICBjbGVhckd1ZXN0VG9rZW5zLFxuICAgIGNsZWFyQ3VzdG9tVG9rZW5zLFxuICBdKTtcblxuICByZXR1cm4ge1xuICAgIGV2ZW50U291cmNlOiBldmVudFNvdXJjZVJlZi5jdXJyZW50LFxuICB9O1xufVxuIiwiaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyB1c2VUb2tlbkV2ZW50TGlzdGVuZXIgfSBmcm9tICcuL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlbnMoKSB7XG4gIGNvbnN0IGdldFRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5nZXRUb2tlbik7XG4gIGNvbnN0IGdldE1vc3RQcml2aWxlZ2VkVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLmdldE1vc3RQcml2aWxlZ2VkVG9rZW5cbiAgKTtcbiAgY29uc3QgZ2V0UmVmcmVzaFRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5nZXRSZWZyZXNoVG9rZW4pO1xuICBjb25zdCB1cGRhdGVQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnVwZGF0ZVB1YmxpY1Rva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS51cGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB1cGRhdGVHdWVzdFRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlR3Vlc3RUb2tlbnMpO1xuICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbiA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlQ3VzdG9tVG9rZW4pO1xuICBjb25zdCBjbGVhclRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJUb2tlbnMpO1xuICBjb25zdCBjbGVhclB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJQdWJsaWNUb2tlbnMpO1xuICBjb25zdCBjbGVhckN1c3RvbVRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJDdXN0b21Ub2tlbnMpO1xuXG4gIGNvbnN0IHsgZXZlbnRTb3VyY2UgfSA9IHVzZVRva2VuRXZlbnRMaXN0ZW5lcigpO1xuXG4gIHJldHVybiB7XG4gICAgZ2V0VG9rZW4sXG4gICAgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbixcbiAgICBnZXRSZWZyZXNoVG9rZW4sXG4gICAgdXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUN1c3RvbVRva2VuKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICBjbGVhclRva2VuczogKCkgPT4gY2xlYXJUb2tlbnMoZXZlbnRTb3VyY2UpLFxuICAgIGNsZWFyUHVibGljVG9rZW5zOiAoKSA9PiBjbGVhclB1YmxpY1Rva2VucyhldmVudFNvdXJjZSksXG4gICAgY2xlYXJDdXN0b21Ub2tlbnM6ICgpID0+IGNsZWFyQ3VzdG9tVG9rZW5zKGV2ZW50U291cmNlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuKHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnIHwgJ2N1c3RvbScpIHtcbiAgcmV0dXJuIHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zW3R5cGVdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuVmFsdWUoXG4gIHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnIHwgJ2N1c3RvbSdcbikge1xuICByZXR1cm4gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnNbdHlwZV0/LmlkVG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmcmVzaFRva2VuKHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnKSB7XG4gIHJldHVybiB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vuc1t0eXBlXT8ucmVmcmVzaFRva2VuKTtcbn1cbiIsInR5cGUgTnVsbGFibGU8VD4gPSBUIHwgbnVsbDtcblxuZXhwb3J0IGVudW0gQW5hbHl0aWNzV2lkZ2V0VHlwZSB7XG4gIEF2YXRhclByb2ZpbGUgPSAnYXZhdGFyLXByb2ZpbGUnLFxuICBBdmF0YXJDaGF0ID0gJ2F2YXRhci1jaGF0JyxcbiAgQ29tbWVudHMgPSAnY29tbWVudHMnLFxuICBHbG9iYWxQcm9maWxlID0gJ2dsb2JhbC1wcm9maWxlJyxcbiAgR3JvdXBDaGF0ID0gJ2dyb3VwLWNoYXQnLFxuICBQb2xscyA9ICdwb2xscycsXG4gIFVuaXZlcnNhbFNuaXBwZXQgPSAndW5pdmVyc2FsLXNuaXBwZXQnLFxufVxuXG5leHBvcnQgdHlwZSBUcmFja09wdGlvbnMgPSB7XG4gIHdpZGdldElkOiBzdHJpbmcgfCBudWxsO1xuICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlO1xuICBzaXRlSWQ6IHN0cmluZztcbiAgcnNXcml0ZUtleTogc3RyaW5nO1xuICByc0RhdGFQbGFuZVVybDogc3RyaW5nO1xuICB0cmlnZ2VyOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZW51bSBBbmFseXRpY3NFdmVudCB7XG4gIEF1dGhlbnRpY2F0aW9uQ29tcGxldGVkID0gJ0F1dGhlbnRpY2F0aW9uIENvbXBsZXRlZCcsXG4gIEF1dGhlbnRpY2F0aW9uU3RhcnRlZCA9ICdBdXRoZW50aWNhdGlvbiBTdGFydGVkJyxcbiAgQXV0aGVudGljYXRpb25WaWV3ZWQgPSAnQXV0aGVudGljYXRpb24gVmlld2VkJyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tQcm9wcyA9IE51bGxhYmxlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVByb3BzIHtcbiAgYW5vbnltb3VzSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWRkZXJDb250ZXh0IHtcbiAgY2hhbm5lbDogJ3dlYic7XG4gIGFub255bW91c0lkPzogc3RyaW5nO1xuICBsb2NhbGU/OiBzdHJpbmc7XG4gIHVzZXJBZ2VudD86IHN0cmluZztcbiAgdGltZXpvbmU/OiBzdHJpbmc7XG4gIG9zPzogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfTtcbiAgcGFnZT86IHtcbiAgICBwYXRoPzogc3RyaW5nO1xuICAgIHJlZmVycmVyPzogc3RyaW5nO1xuICAgIHJlZmVycmluZ19kb21haW4/OiBzdHJpbmc7XG4gICAgc2VhcmNoPzogc3RyaW5nO1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBpbml0aWFsX3JlZmVycmVyPzogc3RyaW5nO1xuICAgIGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbj86IHN0cmluZztcbiAgfTtcbiAgc2NyZWVuPzoge1xuICAgIGRlbnNpdHk/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIGlubmVySGVpZ2h0PzogbnVtYmVyO1xuICAgIGlubmVyV2lkdGg/OiBudW1iZXI7XG4gIH07XG4gIGNhbXBhaWduPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cbiIsImltcG9ydCB7IFB1YmxpY1Byb2ZpbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHJlcXVlc3QsIHNlY3VyZWRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VUb2tlbiB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZS10b2tlbnMnO1xuaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi8uLi9ob29rcy91c2UtdXNlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9maWxlU2VydmljZXMoKSB7XG4gIGNvbnN0IHRva2VuID0gdXNlVG9rZW4oVG9rZW5UeXBlLlBVQkxJQyk7XG4gIGNvbnN0IHsgcmVmcmVzaFB1YmxpY1Rva2VucyB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCBwcm9maWxlVXJsID0gY29uZmlnLnByb2ZpbGVTZXJ2aWNlVXJsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFB1YmxpY1Byb2ZpbGUodXNlcklkPzogc3RyaW5nKTogUHJvbWlzZTxQdWJsaWNQcm9maWxlPiB7XG4gICAgY29uc3QgZmllbGRzID0gJ2JpbyxwaG90b1VSTCxkaXNwbGF5TmFtZSxsb2NhdGlvbixoYW5kbGUnO1xuICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L3B1YmxpYy91c2Vycy8ke3VzZXJJZH0vcHJvZmlsZT9maWVsZHM9JHtmaWVsZHN9YDtcbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdCgnR0VUJywgdXJsKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVB1YmxpY1Byb2ZpbGUoXG4gICAgcGFyYW1zOiBPbWl0PFB1YmxpY1Byb2ZpbGUsICdtZXRhZGF0YSc+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L21lL3Byb2ZpbGUvcGVyc29uYWxgO1xuICAgIGF3YWl0IHNlY3VyZWRSZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICB1cmwsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBhcmFtcyksXG4gICAgICB9LFxuICAgICAgdG9rZW46IHRva2VuLmlkVG9rZW4hLFxuICAgIH0pO1xuICAgIHJlZnJlc2hQdWJsaWNUb2tlbnMoeyByZWZyZXNoVG9rZW5BcGlLZXk6IGNvbmZpZy5yZWZyZXNoVG9rZW5BcGlLZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXRQdWJsaWNQcm9maWxlLFxuICAgIHVwZGF0ZVB1YmxpY1Byb2ZpbGUsXG4gIH07XG59XG4iLCJpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJztcbmltcG9ydCB7IHN1YnNjcmliZVdpdGhTZWxlY3RvciB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHtcbiAgVXNlclByb3BzLFxuICBGaXJlYmFzZVVzZXIsXG4gIFNzb1VzZXJQcm9wcyxcbiAgU3NvVjJFeGNoYW5nZVJlc3BvbnNlLFxufSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gJ2p3dC1kZWNvZGUnO1xuaW1wb3J0IHsgdHlwZSBQdWJsaWNQcm9maWxlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS90eXBlcyc7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyBBdXRoQ29va2llIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIGdldENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmludGVyZmFjZSBVc2VyU3RvcmUge1xuICB1c2VyOiBVc2VyUHJvcHMgfCBudWxsO1xuICBwdWJsaWNQcm9maWxlOiBQdWJsaWNQcm9maWxlIHwgbnVsbDtcbiAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQ6IGJvb2xlYW47XG4gIHNldFVzZXI6ICh1c2VyOiBVc2VyUHJvcHMgfCBudWxsKSA9PiB2b2lkO1xuICBzZXRQdWJsaWNQcm9maWxlOiAocHVibGljUHJvZmlsZTogUHVibGljUHJvZmlsZSB8IG51bGwpID0+IHZvaWQ7XG4gIGxvZ291dDogKCkgPT4gdm9pZDtcbiAgcmVmcmVzaFB1YmxpY1Rva2VuczogKGNvbmZpZzoge1xuICAgIHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nO1xuICB9KSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzZXRVc2VyQnlUb2tlbklkOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBsb2FkU3RvcmVkVXNlcjogKGNvbmZpZz86IHsgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmcgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc3NvVjJFeGNoYW5nZTogKFxuICAgIHNzb1NvdXJjZUlEOiBzdHJpbmcsXG4gICAgand0OiBzdHJpbmcsXG4gICAgZW52PzogRW52aXJvbm1lbnRcbiAgKSA9PiBQcm9taXNlPFNzb1YyRXhjaGFuZ2VSZXNwb25zZT47XG59XG5cbmV4cG9ydCBjb25zdCB1c2VVc2VyU3RvcmUgPSBjcmVhdGU8VXNlclN0b3JlPigpKFxuICBzdWJzY3JpYmVXaXRoU2VsZWN0b3IoKHNldCwgZ2V0KSA9PiAoe1xuICAgIHVzZXI6IG51bGwsXG4gICAgcHVibGljUHJvZmlsZTogbnVsbCxcbiAgICByZWZyZXNoZWRUb2tlbkxvYWRlZDogZmFsc2UsXG5cbiAgICBzZXRVc2VyOiAodXNlcjogVXNlclByb3BzIHwgbnVsbCkgPT4ge1xuICAgICAgc2V0KHsgdXNlciB9KTtcbiAgICB9LFxuXG4gICAgc2V0UHVibGljUHJvZmlsZTogKHB1YmxpY1Byb2ZpbGU6IFB1YmxpY1Byb2ZpbGUgfCBudWxsKSA9PiB7XG4gICAgICBzZXQoeyBwdWJsaWNQcm9maWxlIH0pO1xuICAgIH0sXG5cbiAgICBzZXRVc2VyQnlUb2tlbklkOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1c2VyID0gand0RGVjb2RlPEZpcmViYXNlVXNlcj4oaWRUb2tlbik7XG4gICAgICAgIGNvbnN0IHVzZXJQcm9wczogVXNlclByb3BzID0ge1xuICAgICAgICAgIHVpZDogdXNlci51c2VyX2lkLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiB1c2VyLnNhZmVEaXNwbGF5TmFtZSxcbiAgICAgICAgICBlbWFpbDogdXNlci5lbWFpbCxcbiAgICAgICAgICBwaG90b1VSTDogdXNlci5zYWZlUGhvdG9VUkwsXG4gICAgICAgICAgaGFuZGxlOiB1c2VyLmhhbmRsZSxcbiAgICAgICAgfTtcbiAgICAgICAgc2V0KHsgdXNlcjogdXNlclByb3BzIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGxvZ291dDogKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS5jbGVhclB1YmxpY1Rva2VucygpO1xuICAgICAgICB0b2tlblN0b3JlLmNsZWFyQ3VzdG9tVG9rZW5zKCk7XG4gICAgICAgIHNldCh7IHVzZXI6IG51bGwgfSk7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdhcmVuYS1jb21tZW50cy1sb2dvdXQnKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVmcmVzaFB1YmxpY1Rva2VuczogYXN5bmMgKGNvbmZpZzogeyByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZyB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcblxuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVmcmVzaCB0b2tlbiBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlZml4ID0gJ2h0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlYXBpcy5jb20vdjEvdG9rZW4/a2V5PSc7XG4gICAgICAgIGNvbnN0IGFwaUtleSA9IGNvbmZpZy5yZWZyZXNoVG9rZW5BcGlLZXk7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3ByZWZpeH0ke2FwaUtleX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICBjb25zdCB7IHNldFVzZXJCeVRva2VuSWQgfSA9IGdldCgpO1xuICAgICAgICBzZXRVc2VyQnlUb2tlbklkKGRhdGEuaWRfdG9rZW4pO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHRva2VuU3RvcmUudXBkYXRlUHVibGljVG9rZW5zKGRhdGEuaWRfdG9rZW4sIGRhdGEucmVmcmVzaF90b2tlbik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgY29uc3QgeyBsb2dvdXQgfSA9IGdldCgpO1xuICAgICAgICBsb2dvdXQoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbG9hZFN0b3JlZFVzZXI6IGFzeW5jIChjb25maWc/OiB7IHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IHB1YmxpY0lkVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG4gICAgICBjb25zdCBwdWJsaWNSZWZyZXNoVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcbiAgICAgIGNvbnN0IGN1c3RvbUlkVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTik7XG4gICAgICBjb25zdCBjdXN0b21Vc2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQXV0aENvb2tpZS5DVVNUT01fVVNFUik7XG5cbiAgICAgIGlmICghIWN1c3RvbUlkVG9rZW4gJiYgISFjdXN0b21Vc2VyKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVzZXIgPSBKU09OLnBhcnNlKGN1c3RvbVVzZXIpO1xuXG4gICAgICAgIHNldCh7IHVzZXI6IHBhcnNlZFVzZXIgfSk7XG5cbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVDdXN0b21Ub2tlbihjdXN0b21JZFRva2VuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwdWJsaWNJZFRva2VuKSB7XG4gICAgICAgICAgY29uc3QgeyBzZXRVc2VyQnlUb2tlbklkIH0gPSBnZXQoKTtcbiAgICAgICAgICBzZXRVc2VyQnlUb2tlbklkKHB1YmxpY0lkVG9rZW4pO1xuICAgICAgICB9IGVsc2UgaWYgKHB1YmxpY1JlZnJlc2hUb2tlbiAmJiBjb25maWcpIHtcbiAgICAgICAgICBjb25zdCB7IHJlZnJlc2hQdWJsaWNUb2tlbnMgfSA9IGdldCgpO1xuICAgICAgICAgIGF3YWl0IHJlZnJlc2hQdWJsaWNUb2tlbnMoY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXQoeyByZWZyZXNoZWRUb2tlbkxvYWRlZDogdHJ1ZSB9KTtcbiAgICB9LFxuXG4gICAgc3NvVjJFeGNoYW5nZTogYXN5bmMgKFxuICAgICAgc3NvU291cmNlSUQ6IHN0cmluZyxcbiAgICAgIGp3dDogc3RyaW5nLFxuICAgICAgZW52PzogRW52aXJvbm1lbnRcbiAgICApID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZyhlbnYgPz8gJ3Byb2R1Y3Rpb24nKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZVVybCA9IGNvbmZpZy5wcm9maWxlU2VydmljZVVybDtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcm9maWxlVXJsfS9zc28vc291cmNlcy8ke3Nzb1NvdXJjZUlEfS91c2VyYDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFNzb1YyRXhjaGFuZ2VSZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoJ1BPU1QnLCB1cmwsIHtcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNpZ25lZFVzZXJEYXRhOiBqd3QgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWRVc2VyID0gand0RGVjb2RlPFNzb1VzZXJQcm9wcz4ocmVzcG9uc2UudG9rZW4pO1xuXG4gICAgICAgICAgY29uc3QgeyBzZXRVc2VyLCBzZXRQdWJsaWNQcm9maWxlIH0gPSBnZXQoKTtcblxuICAgICAgICAgIHNldFVzZXIoe1xuICAgICAgICAgICAgdWlkOiBkZWNvZGVkVXNlcj8uc3ViLFxuICAgICAgICAgICAgZW1haWw6IGRlY29kZWRVc2VyPy5lbWFpbCxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBkZWNvZGVkVXNlcj8uZGlzcGxheU5hbWUsXG4gICAgICAgICAgICBwaG90b1VSTDogZGVjb2RlZFVzZXI/LnBob3RvVVJMLFxuICAgICAgICAgICAgaGFuZGxlOiBkZWNvZGVkVXNlcj8uaGFuZGxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc2V0UHVibGljUHJvZmlsZSh7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogZGVjb2RlZFVzZXI/LmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgcGhvdG9VUkw6IGRlY29kZWRVc2VyPy5waG90b1VSTCxcbiAgICAgICAgICAgIGhhbmRsZTogZGVjb2RlZFVzZXI/LmhhbmRsZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVDdXN0b21Ub2tlbihyZXNwb25zZS50b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTU08gVjIgRXhjaGFuZ2UgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSxcbiAgfSkpXG4pO1xuIiwiaW1wb3J0IHsgdXNlUHJvZmlsZVNlcnZpY2VzIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS91c2UtcHJvZmlsZS1zZXJ2aWNlcyc7XG5pbXBvcnQgeyB1c2VVc2VyU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdXNlci1zdG9yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnVzZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHVibGljUHJvZmlsZSgpIHtcbiAgcmV0dXJuIHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5wdWJsaWNQcm9maWxlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZnJlc2hlZFRva2VuTG9hZGVkKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnJlZnJlc2hlZFRva2VuTG9hZGVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJBY3Rpb25zKCkge1xuICBjb25zdCBzZXRVc2VyID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFVzZXIpO1xuICBjb25zdCBzZXRQdWJsaWNQcm9maWxlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFB1YmxpY1Byb2ZpbGUpO1xuICBjb25zdCBsb2dvdXQgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUubG9nb3V0KTtcbiAgY29uc3QgcmVmcmVzaFB1YmxpY1Rva2VucyA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5yZWZyZXNoUHVibGljVG9rZW5zKTtcbiAgY29uc3Qgc2V0VXNlckJ5VG9rZW5JZCA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRVc2VyQnlUb2tlbklkKTtcbiAgY29uc3QgbG9hZFN0b3JlZFVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUubG9hZFN0b3JlZFVzZXIpO1xuICBjb25zdCBzc29WMkV4Y2hhbmdlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNzb1YyRXhjaGFuZ2UpO1xuICBcblxuICByZXR1cm4ge1xuICAgIHNldFVzZXIsXG4gICAgc2V0UHVibGljUHJvZmlsZSxcbiAgICBsb2dvdXQsXG4gICAgcmVmcmVzaFB1YmxpY1Rva2VucyxcbiAgICBzZXRVc2VyQnlUb2tlbklkLFxuICAgIGxvYWRTdG9yZWRVc2VyLFxuICAgIHNzb1YyRXhjaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVcGRhdGVQcm9maWxlKCkge1xuICBjb25zdCB7IHVwZGF0ZVB1YmxpY1Byb2ZpbGUgfSA9IHVzZVByb2ZpbGVTZXJ2aWNlcygpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZVB1YmxpY1Byb2ZpbGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyV2l0aFByb2ZpbGUoKSB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUudXNlcik7XG4gIGNvbnN0IHB1YmxpY1Byb2ZpbGUgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucHVibGljUHJvZmlsZSk7XG4gIGNvbnN0IHJlZnJlc2hlZFRva2VuTG9hZGVkID0gdXNlVXNlclN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnJlZnJlc2hlZFRva2VuTG9hZGVkXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB1c2VyLFxuICAgIHB1YmxpY1Byb2ZpbGUsXG4gICAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQsXG4gIH07XG59XG5cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVXNlciwgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdXNlcic7XG5pbXBvcnQgeyB1c2VNdXRhdGlvbiB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyB1c2VQcm9maWxlU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZXJQcm92aWRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKTtcbiAgY29uc3QgeyBzZXRQdWJsaWNQcm9maWxlLCBsb2FkU3RvcmVkVXNlciB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyBnZXRQdWJsaWNQcm9maWxlOiBnZXRQdWJsaWNQcm9maWxlU2VydmljZSB9ID0gdXNlUHJvZmlsZVNlcnZpY2VzKCk7XG4gIGNvbnN0IHsgbXV0YXRlQXN5bmM6IGdldFB1YmxpY1Byb2ZpbGUgfSA9IHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBnZXRQdWJsaWNQcm9maWxlU2VydmljZSxcbiAgfSk7XG5cbiAgY29uc3QgbG9hZFB1YmxpY1Byb2ZpbGUgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKHVzZXI/LnVpZCkge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFB1YmxpY1Byb2ZpbGUodXNlci51aWQpO1xuICAgICAgc2V0UHVibGljUHJvZmlsZShwcm9maWxlKTtcbiAgICB9XG4gIH0sIFt1c2VyPy51aWQsIGdldFB1YmxpY1Byb2ZpbGUsIHNldFB1YmxpY1Byb2ZpbGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvYWRQdWJsaWNQcm9maWxlKCk7XG4gIH0sIFtsb2FkUHVibGljUHJvZmlsZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZFN0b3JlZFVzZXIoY29uZmlnKTtcbiAgfSwgW2NvbmZpZywgbG9hZFN0b3JlZFVzZXJdKTtcblxuICByZXR1cm4gY2hpbGRyZW47XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFuYWx5dGljc1dpZGdldFR5cGUsXG4gIEFuYWx5dGljc0V2ZW50LFxuICBJZGVudGl0eVByb3BzLFxuICBSdWRkZXJDb250ZXh0LFxuICBUcmFja1Byb3BzLFxufSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5pbXBvcnQgeyByZW1vdmVQYXJhbXNGcm9tVXJsIH0gZnJvbSAnLi4vdXRpbHMvdXJsJztcblxuY29uc3QgQU5PTllNT1VTX0lEX0tFWSA9ICdhcmVuYUFub255bW91c0lkJztcblxuY29uc3QgTFNfS0VZUyA9IHtcbiAgYW5vbjogJ3JzX2Fub255bW91c19pZCcsXG4gIGluaXRSZWZlcnJlcjogJ3JzX2luaXRpYWxfcmVmZXJyZXInLFxuICBpbml0RG9tYWluOiAncnNfaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluJyxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRPclNldEFub255bW91c0lkKCk6IHN0cmluZyB7XG4gIGNvbnN0IGV4aXN0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5hbm9uKTtcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gIGNvbnN0IGlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZUy5hbm9uLCBpZCk7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXJJbml0aWFsUmVmZXJyZXIoKTogdm9pZCB7XG4gIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0UmVmZXJyZXIpKSB7XG4gICAgY29uc3QgcmVmID0gZG9jdW1lbnQucmVmZXJyZXIgfHwgJyRkaXJlY3QnO1xuICAgIGNvbnN0IGRvbWFpbiA9IHJlZiAmJiByZWYgIT09ICckZGlyZWN0JyA/IG5ldyBVUkwocmVmKS5ob3N0bmFtZSA6ICcnO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyLCByZWYpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuaW5pdERvbWFpbiwgZG9tYWluKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUNhbXBhaWduKHU6IFVSTCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXlzID0gW1xuICAgICd1dG1fc291cmNlJyxcbiAgICAndXRtX21lZGl1bScsXG4gICAgJ3V0bV9jYW1wYWlnbicsXG4gICAgJ3V0bV90ZXJtJyxcbiAgICAndXRtX2NvbnRlbnQnLFxuICBdO1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAga2V5cy5mb3JFYWNoKGsgPT4ge1xuICAgIGNvbnN0IHYgPSB1LnNlYXJjaFBhcmFtcy5nZXQoayk7XG4gICAgaWYgKHYpIG91dFtrXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmtleXMob3V0KS5sZW5ndGggPyBvdXQgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJ1ZGRlckNvbnRleHQoKTogUnVkZGVyQ29udGV4dCB7XG4gIGNvbnN0IHcgPSB3aW5kb3c7XG4gIGNvbnN0IGQgPSBkb2N1bWVudDtcbiAgY29uc3QgcyA9IHdpbmRvdy5zY3JlZW47XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwody5sb2NhdGlvbi5ocmVmKTtcblxuICByZW1lbWJlckluaXRpYWxSZWZlcnJlcigpO1xuXG4gIGNvbnN0IGluaXRpYWxfcmVmZXJyZXIgPVxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyKSB8fCAnJGRpcmVjdCc7XG4gIGNvbnN0IGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbiA9XG4gICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0RG9tYWluKSB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGNoYW5uZWw6ICd3ZWInLFxuICAgIGFub255bW91c0lkOiBnZXRPclNldEFub255bW91c0lkKCksXG4gICAgbG9jYWxlOiBuYXZpZ2F0b3IubGFuZ3VhZ2UsXG4gICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgIHRpbWV6b25lOiBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUsXG4gICAgb3M6IHsgbmFtZTogbmF2aWdhdG9yLnBsYXRmb3JtLCB2ZXJzaW9uOiB1bmRlZmluZWQgfSxcbiAgICBwYWdlOiB7XG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICByZWZlcnJlcjogZC5yZWZlcnJlciB8fCAnJGRpcmVjdCcsXG4gICAgICByZWZlcnJpbmdfZG9tYWluOiBkLnJlZmVycmVyID8gbmV3IFVSTChkLnJlZmVycmVyKS5ob3N0bmFtZSA6ICcnLFxuICAgICAgc2VhcmNoOiB1cmwuc2VhcmNoLFxuICAgICAgdGl0bGU6IGQudGl0bGUsXG4gICAgICB1cmw6IHVybC50b1N0cmluZygpLFxuICAgICAgaW5pdGlhbF9yZWZlcnJlcixcbiAgICAgIGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbixcbiAgICB9LFxuICAgIHNjcmVlbjoge1xuICAgICAgZGVuc2l0eTogKHcuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA/PyAxLFxuICAgICAgaGVpZ2h0OiBzLmhlaWdodCxcbiAgICAgIHdpZHRoOiBzLndpZHRoLFxuICAgICAgaW5uZXJIZWlnaHQ6IHcuaW5uZXJIZWlnaHQsXG4gICAgICBpbm5lcldpZHRoOiB3LmlubmVyV2lkdGgsXG4gICAgfSxcbiAgICBjYW1wYWlnbjogcGFyc2VDYW1wYWlnbih1cmwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRJZGVudGlmaWVyKG9wdGlvbnM6IElkZW50aXR5UHJvcHMgPSB7fSk6IElkZW50aXR5UHJvcHMge1xuICBjb25zdCBpZGVudGlmaWVyOiBJZGVudGl0eVByb3BzID0ge307XG5cbiAgaWYgKG9wdGlvbnMudXNlcklkKSB7XG4gICAgaWRlbnRpZmllci51c2VySWQgPSBvcHRpb25zLnVzZXJJZDtcbiAgfVxuXG4gIGxldCBjdXJyZW50QW5vbnltb3VzSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgY3VycmVudEFub255bW91c0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQU5PTllNT1VTX0lEX0tFWSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYWNjZXNzIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gIH1cblxuICBpZiAob3B0aW9ucy5hbm9ueW1vdXNJZCkge1xuICAgIGlkZW50aWZpZXIuYW5vbnltb3VzSWQgPSBvcHRpb25zLmFub255bW91c0lkO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShBTk9OWU1PVVNfSURfS0VZLCBvcHRpb25zLmFub255bW91c0lkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2F2ZSBhbm9ueW1vdXNJZCB0byBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjdXJyZW50QW5vbnltb3VzSWQpIHtcbiAgICBpZGVudGlmaWVyLmFub255bW91c0lkID0gY3VycmVudEFub255bW91c0lkO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5ld0Fub255bW91c0lkID0gZ2VuZXJhdGVVVUlEKCk7XG4gICAgaWRlbnRpZmllci5hbm9ueW1vdXNJZCA9IG5ld0Fub255bW91c0lkO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShBTk9OWU1PVVNfSURfS0VZLCBuZXdBbm9ueW1vdXNJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgbmV3IGFub255bW91c0lkIHRvIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXI7XG59XG5cbmZ1bmN0aW9uIGdldENhbm9uaWNhbFVybCgpOiBzdHJpbmcge1xuICBjb25zdCBjYW5vbmljYWxNZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAnbGlua1tyZWw9XCJjYW5vbmljYWxcIl0nXG4gICkgYXMgSFRNTExpbmtFbGVtZW50O1xuICBjb25zdCByYXdVcmwgPSBjYW5vbmljYWxNZXRhPy5ocmVmIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICByZXR1cm4gcmVtb3ZlUGFyYW1zRnJvbVVybChyYXdVcmwpO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudFByb3BlcnRpZXMoXG4gIHdpZGdldFR5cGU6IHN0cmluZyxcbiAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICB3aWRnZXRfdHlwZTogd2lkZ2V0VHlwZSxcbiAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgICBkb21haW46IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxcbiAgICAgIHRpdGxlOiB3aW5kb3cuZG9jdW1lbnQudGl0bGUsXG4gICAgICBjYW5vbmljYWxfdXJsOiBnZXRDYW5vbmljYWxVcmwoKSxcbiAgICAgIHNuaXBwZXRfaWQ6IHdpbmRvdy5fX0FSRU5BX18/LnNuaXBwZXRJZCB8fCBudWxsLFxuICAgICAgLi4ucHJvcGVydGllcyxcbiAgICB9LFxuICAgIGNvbnRleHQ6IGJ1aWxkUnVkZGVyQ29udGV4dCgpLFxuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGludGVncmF0aW9uczogeyBBbGw6IHRydWUgfSxcbiAgICAuLi5nZXRJZGVudGlmaWVyKGlkZW50aXR5KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRIZWFkZXJzKHdyaXRlS2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIEF1dGhvcml6YXRpb246ICdCYXNpYyAnICsgYnRvYShgJHt3cml0ZUtleX06YCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmFseXRpY3Mod3JpdGVLZXk6IHN0cmluZywgZGF0YVBsYW5lVXJsOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBwYWdlOiBhc3luYyAoXG4gICAgICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlLFxuICAgICAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgICAgIGlkZW50aXR5PzogSWRlbnRpdHlQcm9wc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtkYXRhUGxhbmVVcmx9L3YxL3BhZ2VgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXkpLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdHlwZTogJ3BhZ2UnLFxuICAgICAgICAgIC4uLmdldEV2ZW50UHJvcGVydGllcyh3aWRnZXRUeXBlLCBwcm9wZXJ0aWVzLCBpZGVudGl0eSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNlbmQgcGFnZSBldmVudCB0byBSdWRkZXJzdGFjaycpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdHJhY2s6IGFzeW5jIChcbiAgICAgIHdpZGdldFR5cGU6IEFuYWx5dGljc1dpZGdldFR5cGUsXG4gICAgICBldmVudDogQW5hbHl0aWNzRXZlbnQsXG4gICAgICBwcm9wZXJ0aWVzOiBUcmFja1Byb3BzLFxuICAgICAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2RhdGFQbGFuZVVybH0vdjEvdHJhY2tgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXkpLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgdHlwZTogJ3RyYWNrJyxcbiAgICAgICAgICAuLi5nZXRFdmVudFByb3BlcnRpZXMod2lkZ2V0VHlwZSwgcHJvcGVydGllcywgaWRlbnRpdHkpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzZW5kIHRyYWNrIGV2ZW50IHRvIFJ1ZGRlcnN0YWNrJyk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiByZW1vdmVQYXJhbXNGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICB1cmxPYmouc2VhcmNoID0gJyc7XG5cbiAgICByZXR1cm4gdXJsT2JqLmhyZWY7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgY2xlYXJpbmcgc2VhcmNoIHBhcmFtcyBmcm9tIFVSTDonLCBlcnJvcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRBbmFseXRpY3MgfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3MnO1xuaW1wb3J0IHsgQW5hbHl0aWNzRXZlbnQsIFRyYWNrT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2FuYWx5dGljcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUcmFjayh0cmFja09wdGlvbnM/OiBUcmFja09wdGlvbnMpIHtcbiAgY29uc3QgdHJhY2sgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBldmVudDogQW5hbHl0aWNzRXZlbnQsXG4gICAgICB1c2VySWQ/OiBzdHJpbmcsXG4gICAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD5cbiAgICApID0+IHtcbiAgICAgIGlmICghdHJhY2tPcHRpb25zKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGFuYWx5dGljcyA9IGdldEFuYWx5dGljcyhcbiAgICAgICAgdHJhY2tPcHRpb25zLnJzV3JpdGVLZXksXG4gICAgICAgIHRyYWNrT3B0aW9ucy5yc0RhdGFQbGFuZVVybFxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHJhY2tQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiA9IHtcbiAgICAgICAgc2l0ZV9pZDogdHJhY2tPcHRpb25zLnNpdGVJZCxcbiAgICAgICAgd2lkZ2V0X2lkOiB0cmFja09wdGlvbnMud2lkZ2V0SWQsXG4gICAgICAgIHRyaWdnZXI6IHRyYWNrT3B0aW9ucy50cmlnZ2VyLFxuICAgICAgICAuLi5wcm9wZXJ0aWVzLFxuICAgICAgfTtcblxuICAgICAgYW5hbHl0aWNzLnRyYWNrKFxuICAgICAgICB0cmFja09wdGlvbnMud2lkZ2V0VHlwZSxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRyYWNrUHJvcGVydGllcyxcbiAgICAgICAgdXNlcklkID8geyB1c2VySWQgfSA6IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9LFxuICAgIFt0cmFja09wdGlvbnNdXG4gICk7XG5cbiAgcmV0dXJuIHRyYWNrO1xufVxuIiwiaW1wb3J0IHsgdXNlQXV0aERpYWxvZyB9IGZyb20gJy4uL2NvbnRleHQvYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdXNlcic7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VUb2tlbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdG9rZW5zJztcbmltcG9ydCB7IEFuYWx5dGljc0V2ZW50IH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcbmltcG9ydCB7IHVzZVRyYWNrIH0gZnJvbSAnLi4vaG9va3MvdXNlLXRyYWNrJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXV0aERpYWxvZygpIHtcbiAgY29uc3Qge1xuICAgIGFwcE5hbWUsXG4gICAgYXBwRGVzY3JpcHRpb24sXG4gICAgbGFuZ3VhZ2UsXG4gICAgdHJhY2tPcHRpb25zLFxuICAgIGlzT3BlbixcbiAgICBjbG9zZURpYWxvZyxcbiAgICBvbkF1dGhDb21wbGV0ZWQsXG4gIH0gPSB1c2VBdXRoRGlhbG9nKCk7XG4gIGNvbnN0IGZyYW1lQXBwTmFtZSA9IGFwcE5hbWUgfHwgJ0FyZW5hIEFJIENoYXQnO1xuICBjb25zdCBmcmFtZUFwcERlc2NyaXB0aW9uID0gYXBwRGVzY3JpcHRpb24gfHwgJ0FyZW5hIEFJIENoYXQnO1xuICBjb25zdCB7IHNldFVzZXIgfSA9IHVzZVVzZXJBY3Rpb25zKCk7XG4gIGNvbnN0IHsgdXBkYXRlUHVibGljVG9rZW5zIH0gPSB1c2VUb2tlbnMoKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuXG4gIGNvbnN0IHRyYWNrID0gdXNlVHJhY2sodHJhY2tPcHRpb25zKTtcblxuICBjb25zdCBpZnJhbWVVcmwgPSBgJHtjb25maWcuYXV0aElmcmFtZVVybH0vP2FwcC1uYW1lPSR7ZnJhbWVBcHBOYW1lfSZhcHAtZGVzY3JpcHRpb249JHtmcmFtZUFwcERlc2NyaXB0aW9ufSZsYW5ndWFnZT0ke2xhbmd1YWdlID8/ICdlbid9YDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSAobWVzc2FnZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy5zb3VyY2UgIT09ICdhcmVuYS1hdXRoZW50aWNhdGlvbicpIHJldHVybjtcblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2NhbmNlbGVkJykge1xuICAgICAgICBjbG9zZURpYWxvZygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdhdXRoZW50aWNhdGlvbi12aWV3ZWQnKSB7XG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uVmlld2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tc3RhcnRlZCcpIHtcbiAgICAgICAgY29uc3QgeyBhdXRoVHlwZSB9ID0gbWVzc2FnZS5kYXRhPy5wYXlsb2FkIHx8IHt9O1xuICAgICAgICB0cmFjayhBbmFseXRpY3NFdmVudC5BdXRoZW50aWNhdGlvblN0YXJ0ZWQsIHVuZGVmaW5lZCwge1xuICAgICAgICAgIGF1dGhUeXBlOiBhdXRoVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2F1dGhlbnRpY2F0aW9uLWNvbXBsZXRlZCcpIHtcbiAgICAgICAgY29uc3QgeyBpZFRva2VuLCByZWZyZXNoVG9rZW4sIHVzZXIsIGF1dGhUeXBlLCBpc1NpZ251cCB9ID1cbiAgICAgICAgICBtZXNzYWdlLmRhdGE/LnBheWxvYWQgfHwge307XG5cbiAgICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQXV0aGVudGljYXRpb24gY29tcGxldGVkIGJ1dCB1c2VyIGRhdGEgaXMgbWlzc2luZycpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uQ29tcGxldGVkLCB1c2VyLnVpZCwge1xuICAgICAgICAgIGlzX3NpZ251cDogaXNTaWdudXAsXG4gICAgICAgICAgYXV0aF90eXBlOiBhdXRoVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG9uQXV0aENvbXBsZXRlZD8uKHVzZXIpO1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICAgICAgc2V0VXNlcih1c2VyKTtcbiAgICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gIH0sIFtzZXRVc2VyLCB1cGRhdGVQdWJsaWNUb2tlbnMsIG9uQXV0aENvbXBsZXRlZCwgdHJhY2ssIGNsb3NlRGlhbG9nXSk7XG5cbiAgcmV0dXJuIGlzT3BlbiA/IChcbiAgICA8aWZyYW1lXG4gICAgICBzcmM9e2lmcmFtZVVybH1cbiAgICAgIHRpdGxlPVwiQXJlbmEgQXV0aGVudGljYXRpb25cIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgd2lkdGg6ICcxMDB2dycsXG4gICAgICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICAgICAgekluZGV4OiA5OTk5OTk5OTk5LFxuICAgICAgfX1cbiAgICA+PC9pZnJhbWU+XG4gICkgOiBudWxsO1xufVxuIiwiaW1wb3J0IHsgRXhjaGFuZ2VUb2tlbnNSZXNwb25zZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb25maWctcHJvdmlkZXInO1xuXG5jb25zdCBSVURERVJfQU5PTllNT1VTX0lEX1NUT1JBR0VfS0VZID0gJ2FyZW5hLWFuYWx5dGljczpycy1hbm9ueW1vdXMtaWQnO1xuXG50eXBlIFJ1ZGRlcldpbmRvdyA9IFdpbmRvdyAmIHtcbiAgcnVkZGVyYW5hbHl0aWNzPzogeyBnZXRBbm9ueW1vdXNJZD86ICgpID0+IHN0cmluZyB8IG51bGwgfTtcbiAgcnVkZGVyQW5hbHl0aWNzPzogeyBnZXRBbm9ueW1vdXNJZD86ICgpID0+IHN0cmluZyB8IG51bGwgfTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlQW5vbnltb3VzSWQodmFsdWU/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnNlZCA9IHZhbHVlPy50cmltKCk7XG4gIGlmICghcGFyc2VkIHx8IHBhcnNlZCA9PT0gJ251bGwnIHx8IHBhcnNlZCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVkZGVyQW5vbnltb3VzSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcnVkZGVyV2luZG93ID0gd2luZG93IGFzIFJ1ZGRlcldpbmRvdztcbiAgY29uc3QgZnJvbVJ1ZGRlckNsaWVudCA9IHBhcnNlQW5vbnltb3VzSWQoXG4gICAgcnVkZGVyV2luZG93LnJ1ZGRlcmFuYWx5dGljcz8uZ2V0QW5vbnltb3VzSWQ/LigpID8/XG4gICAgICBydWRkZXJXaW5kb3cucnVkZGVyQW5hbHl0aWNzPy5nZXRBbm9ueW1vdXNJZD8uKCksXG4gICk7XG4gIGlmIChmcm9tUnVkZGVyQ2xpZW50KSByZXR1cm4gZnJvbVJ1ZGRlckNsaWVudDtcblxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZUFub255bW91c0lkKFxuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFJVRERFUl9BTk9OWU1PVVNfSURfU1RPUkFHRV9LRVkpLFxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBdXRoU2VydmljZXMoKSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgaWRlbnRpdHlVcmwgPSBjb25maWcuaWRlbnRpdHlTZXJ2aWNlVXJsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldEFub255bW91c0lkZW50aXR5VG9rZW4oKTogUHJvbWlzZTxFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgdXJsID0gYCR7aWRlbnRpdHlVcmx9L2Fub255bW91cy10b2tlbmA7XG4gICAgY29uc3QgYW5vbnltb3VzSWQgPSBnZXRSdWRkZXJBbm9ueW1vdXNJZCgpO1xuXG4gICAgaWYgKCFhbm9ueW1vdXNJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QoJ1BPU1QnLCB1cmwpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0KCdQT1NUJywgdXJsLCB7XG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFub255bW91c0lkIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuLFxuICB9O1xufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQge1xuICBnZXRSdWRkZXJBbm9ueW1vdXNJZCxcbiAgdXNlQXV0aFNlcnZpY2VzLFxufSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3VzZS1hdXRoLXNlcnZpY2VzJztcbmltcG9ydCB7IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIEFub255bW91c1Rva2VuUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pIHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCB0b2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS51cGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB7IGdldEFub255bW91c0lkZW50aXR5VG9rZW4gfSA9IHVzZUF1dGhTZXJ2aWNlcygpO1xuICBjb25zdCBoYXNGb3JjZWRSZWZyZXNoSW5EZWJ1Z1JlZiA9IHVzZVJlZihmYWxzZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBydWRkZXJBbm9ueW1vdXNJZCA9IGdldFJ1ZGRlckFub255bW91c0lkKCk7XG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaEFub255bW91c1Rva2VuID1cbiAgICAgICF0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4gfHxcbiAgICAgIChjb25maWcuZGVidWcgJiZcbiAgICAgICAgQm9vbGVhbihydWRkZXJBbm9ueW1vdXNJZCkgJiZcbiAgICAgICAgIWhhc0ZvcmNlZFJlZnJlc2hJbkRlYnVnUmVmLmN1cnJlbnQpO1xuXG4gICAgaWYgKCFzaG91bGRSZWZyZXNoQW5vbnltb3VzVG9rZW4pIHJldHVybjtcblxuICAgIGlmICh0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4pIHtcbiAgICAgIGhhc0ZvcmNlZFJlZnJlc2hJbkRlYnVnUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4oKVxuICAgICAgLnRoZW4oKHRva2VuOiBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKFxuICAgICAgICAgIHRva2VuLmFjY2Vzc190b2tlbixcbiAgICAgICAgICB0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4gPyAnZm9yY2UtcmVmcmVzaC1kZWJ1ZycgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAodG9rZW5zLmFub255bW91cy5pZFRva2VuKSB7XG4gICAgICAgICAgaGFzRm9yY2VkUmVmcmVzaEluRGVidWdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFjdC1zZGstYXV0aF0gZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbiBmYWlsZWQnLCB7XG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH0sIFtcbiAgICBjb25maWcuZGVidWcsXG4gICAgdG9rZW5zLmFub255bW91cy5pZFRva2VuLFxuICAgIHVwZGF0ZUFub255bW91c1Rva2VuLFxuICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4sXG4gIF0pO1xuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbiIsImltcG9ydCB7IEF1dGhEaWFsb2dQcm92aWRlciB9IGZyb20gJy4vYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuaW1wb3J0IHsgUXVlcnlDbGllbnQsIFF1ZXJ5Q2xpZW50UHJvdmlkZXIgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgVXNlclByb3ZpZGVyIH0gZnJvbSAnLi91c2VyLXByb3ZpZGVyJztcbmltcG9ydCB7IENvbmZpZ1Byb3ZpZGVyIH0gZnJvbSAnLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IEF1dGhEaWFsb2cgZnJvbSAnLi4vZGlhbG9nJztcbmltcG9ydCB7IEFub255bW91c1Rva2VuUHJvdmlkZXIgfSBmcm9tICcuL2Fub255bW91cy10b2tlbi1wcm92aWRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBBdXRoUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbiAgcXVlcnlDbGllbnQsXG4gIGVudmlyb25tZW50LFxufToge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBxdWVyeUNsaWVudD86IFF1ZXJ5Q2xpZW50O1xuICBlbnZpcm9ubWVudD86ICdwcm9kdWN0aW9uJyB8ICdkZXZlbG9wbWVudCc7XG59KSB7XG4gIHF1ZXJ5Q2xpZW50ID0gcXVlcnlDbGllbnQgfHwgbmV3IFF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIChcbiAgICA8UXVlcnlDbGllbnRQcm92aWRlciBjbGllbnQ9e3F1ZXJ5Q2xpZW50fT5cbiAgICAgIDxDb25maWdQcm92aWRlciBlbnZpcm9ubWVudD17ZW52aXJvbm1lbnR9PlxuICAgICAgICA8VXNlclByb3ZpZGVyPlxuICAgICAgICAgIDxBdXRoRGlhbG9nUHJvdmlkZXI+XG4gICAgICAgICAgICA8QW5vbnltb3VzVG9rZW5Qcm92aWRlcj5cbiAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgICA8QXV0aERpYWxvZyAvPlxuICAgICAgICAgICAgPC9Bbm9ueW1vdXNUb2tlblByb3ZpZGVyPlxuICAgICAgICAgIDwvQXV0aERpYWxvZ1Byb3ZpZGVyPlxuICAgICAgICA8L1VzZXJQcm92aWRlcj5cbiAgICAgIDwvQ29uZmlnUHJvdmlkZXI+XG4gICAgPC9RdWVyeUNsaWVudFByb3ZpZGVyPlxuICApO1xufVxuXG5leHBvcnQgeyB1c2VBdXRoRGlhbG9nIH0gZnJvbSAnLi9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG4iLCJpbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXV0aENvb2tpZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IHVzZVVzZXJTdG9yZSB9IGZyb20gJy4uL3N0b3Jlcyc7XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgZ2V0UnVudGltZUVudmlyb25tZW50IH0gZnJvbSAnLi4vY29uZmlnL3J1bnRpbWUtZW52aXJvbm1lbnQnO1xuXG5mdW5jdGlvbiBnZXRSZWZyZXNoVG9rZW5BcGlLZXkoKTogc3RyaW5nIHtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRSdW50aW1lRW52aXJvbm1lbnQoKTtcbiAgcmV0dXJuIGdldENvbmZpZyhlbnZpcm9ubWVudCkucmVmcmVzaFRva2VuQXBpS2V5O1xufVxuXG5jb25zdCBkZWZhdWx0SGVhZGVycyA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbn07XG5cbmxldCByZWZyZXNoUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVSZWZyZXNoVG9rZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChyZWZyZXNoUHJvbWlzZSkge1xuICAgIHJldHVybiByZWZyZXNoUHJvbWlzZTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJTdG9yZSA9IHVzZVVzZXJTdG9yZS5nZXRTdGF0ZSgpO1xuICByZWZyZXNoUHJvbWlzZSA9IHVzZXJTdG9yZVxuICAgIC5yZWZyZXNoUHVibGljVG9rZW5zKHtcbiAgICAgIHJlZnJlc2hUb2tlbkFwaUtleTogZ2V0UmVmcmVzaFRva2VuQXBpS2V5KCksXG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICByZWZyZXNoUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG5cbiAgcmV0dXJuIHJlZnJlc2hQcm9taXNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhdXRoZW50aWNhdGVkRmV0Y2goXG4gIG1ldGhvZDogc3RyaW5nLFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fVxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCB0b2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKTtcblxuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xuICB9XG5cbiAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAuLi5kZWZhdWx0SGVhZGVycyxcbiAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gIH07XG5cbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgcmV0dXJuIGZldGNoKHVybCwgcGFyYW1zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VSZXNwb25zZShyZXNwb25zZTogUmVzcG9uc2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcih7IGVycm9yIH0pO1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKU09OIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dPbkVycm9yUmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlLCB0ZXh0OiBzdHJpbmcpOiBuZXZlciB7XG4gIGxldCBlcnJvck1lc3NhZ2U6IHN0cmluZztcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgZXJyb3JNZXNzYWdlID0gcGFyc2VkPy5lcnJvcnM/LlswXSB8fCB0ZXh0IHx8ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICB9IGNhdGNoIHtcbiAgICBlcnJvck1lc3NhZ2UgPSB0ZXh0IHx8ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRoZW50aWNhdGVkUmVxdWVzdChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgYXN5bmMgZnVuY3Rpb24gYXR0ZW1wdCgpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF1dGhlbnRpY2F0ZWRGZXRjaChtZXRob2QsIHVybCwgb3B0aW9ucyk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiBwYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXF1ZXN0IC0gJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ1VuYXV0aG9yaXplZCcpIGFzIEVycm9yICYgeyBzdGF0dXM/OiBudW1iZXIgfTtcbiAgICAgIGVyci5zdGF0dXMgPSA0MDE7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhyb3dPbkVycm9yUmVzcG9uc2UocmVzcG9uc2UsIHRleHQpO1xuICB9XG5cbiAgY29uc3QgaGFzVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG5cbiAgaWYgKCFoYXNUb2tlbikge1xuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIGF3YWl0IGVuc3VyZVJlZnJlc2hUb2tlbigpO1xuICAgICAgcmV0dXJuIGF3YWl0IGF0dGVtcHQoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgYXR0ZW1wdCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGlzNDAxID1cbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICdzdGF0dXMnIGluIGVycm9yICYmXG4gICAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwMTtcblxuICAgIGlmICghaXM0MDEpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYXV0aG9yaXplZCcpO1xuICAgIH1cblxuICAgIGF3YWl0IGVuc3VyZVJlZnJlc2hUb2tlbigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhdHRlbXB0KCk7XG4gICAgfSBjYXRjaCAocmV0cnlFcnJvcikge1xuICAgICAgY29uc3QgcmV0cnlJczQwMSA9XG4gICAgICAgIHJldHJ5RXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICAnc3RhdHVzJyBpbiByZXRyeUVycm9yICYmXG4gICAgICAgIChyZXRyeUVycm9yIGFzIEVycm9yICYgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzID09PSA0MDE7XG5cbiAgICAgIGlmIChyZXRyeUlzNDAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hdXRob3JpemVkJyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IHJldHJ5RXJyb3I7XG4gICAgfVxuICB9XG59XG4iXSwibmFtZXMiOlsiQXV0aERpYWxvZ0NvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwidW5kZWZpbmVkIiwiQXV0aERpYWxvZ1Byb3ZpZGVyIiwiY2hpbGRyZW4iLCJpc09wZW4iLCJzZXRJc09wZW4iLCJ1c2VTdGF0ZSIsImFwcE5hbWUiLCJzZXRBcHBOYW1lIiwiYXBwRGVzY3JpcHRpb24iLCJzZXRBcHBEZXNjcmlwdGlvbiIsIm9uQXV0aENvbXBsZXRlZCIsInNldE9uQXV0aENvbXBsZXRlZCIsInRyYWNrT3B0aW9ucyIsInNldFRyYWNrT3B0aW9ucyIsImxhbmd1YWdlIiwic2V0TGFuZ3VhZ2UiLCJfanN4IiwiUHJvdmlkZXIiLCJ2YWx1ZSIsIm9wZW5EaWFsb2ciLCJjbG9zZURpYWxvZyIsIm9uT3BlbkNoYW5nZSIsIm9wZW4iLCJ1c2VBdXRoRGlhbG9nIiwiY29udGV4dCIsInVzZUNvbnRleHQiLCJFcnJvciIsInJ1bnRpbWVFbnZpcm9ubWVudCIsImdldENvbmZpZyIsImVudmlyb25tZW50IiwiaXNEZXYiLCJwcm9maWxlU2VydmljZVVybCIsImlkZW50aXR5U2VydmljZVVybCIsInJlZnJlc2hUb2tlbkFwaUtleSIsImF1dGhJZnJhbWVVcmwiLCJkZWJ1ZyIsIkNvbmZpZ0NvbnRleHQiLCJDb25maWdQcm92aWRlciIsImNvbmZpZyIsInVzZUVmZmVjdCIsInNldFJ1bnRpbWVFbnZpcm9ubWVudCIsInVzZUNvbmZpZyIsImRlZmF1bHRIZWFkZXJzIiwiYXN5bmMiLCJyZXF1ZXN0IiwibWV0aG9kIiwidXJsIiwib3B0aW9ucyIsInJlc3BvbnNlIiwiZmV0Y2giLCJoZWFkZXJzIiwib2siLCJzdGF0dXNUZXh0IiwianNvbiIsIlRva2VuVHlwZSIsIkF1dGhDb29raWUiLCJUT0tFTl9VUERBVEVEX0VWRU5UIiwiZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudCIsInR5cGUiLCJwYXJhbXMiLCJkb2N1bWVudCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsImRldGFpbCIsImRlZmF1bHRUb2tlbnMiLCJwdWJsaWMiLCJpZFRva2VuIiwiQ29va2llcyIsImdldCIsIlBVQkxJQ19JRF9UT0tFTiIsInJlZnJlc2hUb2tlbiIsIlBVQkxJQ19SRUZSRVNIX1RPS0VOIiwiYW5vbnltb3VzIiwiQU5PTllNT1VTX0lEX1RPS0VOIiwiZ3Vlc3QiLCJHVUVTVF9JRF9UT0tFTiIsImN1c3RvbSIsIkNVU1RPTV9JRF9UT0tFTiIsInVzZVRva2VuU3RvcmUiLCJjcmVhdGUiLCJzdWJzY3JpYmVXaXRoU2VsZWN0b3IiLCJzZXQiLCJ1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIiLCJzb3VyY2UiLCJ0b2tlbnMiLCJzdGF0ZSIsImV4cGlyZXMiLCJQVUJMSUMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlciIsIkFOT05ZTU9VUyIsInVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyIiwiR1VFU1QiLCJ1cGRhdGVDdXN0b21Ub2tlbkhlbHBlciIsIkNVU1RPTSIsImNsZWFyUHVibGljVG9rZW5zSGVscGVyIiwicmVtb3ZlIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIiLCJjbGVhckd1ZXN0VG9rZW5zSGVscGVyIiwiY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIiLCJsb2NhbFN0b3JhZ2UiLCJyZW1vdmVJdGVtIiwiQ1VTVE9NX1VTRVIiLCJnZXRUb2tlbiIsImdldE1vc3RQcml2aWxlZ2VkVG9rZW4iLCJpbmNsdWRlcyIsImdldFJlZnJlc2hUb2tlbiIsInVwZGF0ZVB1YmxpY1Rva2VucyIsInVwZGF0ZUFub255bW91c1Rva2VuIiwidXBkYXRlR3Vlc3RUb2tlbnMiLCJ1cGRhdGVDdXN0b21Ub2tlbiIsImNsZWFyVG9rZW5zIiwiY2xlYXJQdWJsaWNUb2tlbnMiLCJjbGVhckFub255bW91c1Rva2VucyIsImNsZWFyR3Vlc3RUb2tlbnMiLCJjbGVhckN1c3RvbVRva2VucyIsInNpbGVudFVwZGF0ZVB1YmxpY1Rva2VucyIsInNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuIiwic2lsZW50VXBkYXRlR3Vlc3RUb2tlbnMiLCJzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbiIsInNpbGVudENsZWFyUHVibGljVG9rZW5zIiwic2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJzaWxlbnRDbGVhckd1ZXN0VG9rZW5zIiwic2lsZW50Q2xlYXJDdXN0b21Ub2tlbnMiLCJ1c2VUb2tlbkV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZVJlZiIsInVzZVJlZiIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0ciIsImhhbmRsZVRva2VuVXBkYXRlIiwiZXZlbnQiLCJjdXJyZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZSIsInVzZVRva2VucyIsInVzZVRva2VuIiwidXNlVG9rZW5WYWx1ZSIsInVzZVJlZnJlc2hUb2tlbiIsIkFuYWx5dGljc1dpZGdldFR5cGUiLCJBbmFseXRpY3NFdmVudCIsInVzZVByb2ZpbGVTZXJ2aWNlcyIsInRva2VuIiwicmVmcmVzaFB1YmxpY1Rva2VucyIsInVzZVVzZXJBY3Rpb25zIiwicHJvZmlsZVVybCIsImdldFB1YmxpY1Byb2ZpbGUiLCJ1c2VySWQiLCJ1cGRhdGVQdWJsaWNQcm9maWxlIiwiQXV0aG9yaXphdGlvbiIsInBheWxvYWQiLCJ0ZXh0Iiwic3RhdHVzIiwiZXJyb3JzIiwiSlNPTiIsInBhcnNlIiwiY29udGVudFR5cGUiLCJlcnJvciIsImNvbnNvbGUiLCJzZWN1cmVkUmVxdWVzdCIsImJvZHkiLCJzdHJpbmdpZnkiLCJ1c2VVc2VyU3RvcmUiLCJ1c2VyIiwicHVibGljUHJvZmlsZSIsInJlZnJlc2hlZFRva2VuTG9hZGVkIiwic2V0VXNlciIsInNldFB1YmxpY1Byb2ZpbGUiLCJzZXRVc2VyQnlUb2tlbklkIiwiand0RGVjb2RlIiwidXNlclByb3BzIiwidWlkIiwidXNlcl9pZCIsImRpc3BsYXlOYW1lIiwic2FmZURpc3BsYXlOYW1lIiwiZW1haWwiLCJwaG90b1VSTCIsInNhZmVQaG90b1VSTCIsImhhbmRsZSIsImxvZ291dCIsInRva2VuU3RvcmUiLCJnZXRTdGF0ZSIsIkV2ZW50IiwiVVJMU2VhcmNoUGFyYW1zIiwicmVmcmVzaF90b2tlbiIsImdyYW50X3R5cGUiLCJkYXRhIiwiaWRfdG9rZW4iLCJsb2FkU3RvcmVkVXNlciIsInB1YmxpY0lkVG9rZW4iLCJwdWJsaWNSZWZyZXNoVG9rZW4iLCJjdXN0b21JZFRva2VuIiwiZ2V0SXRlbSIsImN1c3RvbVVzZXIiLCJwYXJzZWRVc2VyIiwic3NvVjJFeGNoYW5nZSIsInNzb1NvdXJjZUlEIiwiand0IiwiZW52Iiwic2lnbmVkVXNlckRhdGEiLCJkZWNvZGVkVXNlciIsInN1YiIsInVzZVVzZXIiLCJ1c2VQdWJsaWNQcm9maWxlIiwidXNlUmVmcmVzaGVkVG9rZW5Mb2FkZWQiLCJ1c2VVcGRhdGVQcm9maWxlIiwidXNlVXNlcldpdGhQcm9maWxlIiwiVXNlclByb3ZpZGVyIiwiZ2V0UHVibGljUHJvZmlsZVNlcnZpY2UiLCJtdXRhdGVBc3luYyIsInVzZU11dGF0aW9uIiwibXV0YXRpb25GbiIsImxvYWRQdWJsaWNQcm9maWxlIiwidXNlQ2FsbGJhY2siLCJwcm9maWxlIiwiQU5PTllNT1VTX0lEX0tFWSIsIkxTX0tFWVMiLCJnZXRPclNldEFub255bW91c0lkIiwiZXhpc3RpbmciLCJpZCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJzZXRJdGVtIiwicGFyc2VDYW1wYWlnbiIsInUiLCJvdXQiLCJmb3JFYWNoIiwiayIsInYiLCJzZWFyY2hQYXJhbXMiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiYnVpbGRSdWRkZXJDb250ZXh0IiwidyIsIndpbmRvdyIsImQiLCJzIiwic2NyZWVuIiwiVVJMIiwibG9jYXRpb24iLCJocmVmIiwicmVmIiwicmVmZXJyZXIiLCJkb21haW4iLCJob3N0bmFtZSIsInJlbWVtYmVySW5pdGlhbFJlZmVycmVyIiwiaW5pdGlhbF9yZWZlcnJlciIsImluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbiIsImNoYW5uZWwiLCJhbm9ueW1vdXNJZCIsImxvY2FsZSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInRpbWV6b25lIiwiSW50bCIsIkRhdGVUaW1lRm9ybWF0IiwicmVzb2x2ZWRPcHRpb25zIiwidGltZVpvbmUiLCJvcyIsIm5hbWUiLCJwbGF0Zm9ybSIsInZlcnNpb24iLCJwYWdlIiwicGF0aCIsInBhdGhuYW1lIiwicmVmZXJyaW5nX2RvbWFpbiIsInNlYXJjaCIsInRpdGxlIiwiZGVuc2l0eSIsImRldmljZVBpeGVsUmF0aW8iLCJoZWlnaHQiLCJ3aWR0aCIsImlubmVySGVpZ2h0IiwiaW5uZXJXaWR0aCIsImNhbXBhaWduIiwiZ2V0SWRlbnRpZmllciIsImlkZW50aWZpZXIiLCJjdXJyZW50QW5vbnltb3VzSWQiLCJ3YXJuIiwibmV3QW5vbnltb3VzSWQiLCJyZXBsYWNlIiwiYyIsInIiLCJnZXRDYW5vbmljYWxVcmwiLCJjYW5vbmljYWxNZXRhIiwicXVlcnlTZWxlY3RvciIsInVybE9iaiIsInJlbW92ZVBhcmFtc0Zyb21VcmwiLCJnZXRFdmVudFByb3BlcnRpZXMiLCJ3aWRnZXRUeXBlIiwicHJvcGVydGllcyIsImlkZW50aXR5Iiwid2lkZ2V0X3R5cGUiLCJjYW5vbmljYWxfdXJsIiwic25pcHBldF9pZCIsIl9fQVJFTkFfXyIsInNuaXBwZXRJZCIsInRpbWVzdGFtcCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImludGVncmF0aW9ucyIsIkFsbCIsImdldEV2ZW50SGVhZGVycyIsIndyaXRlS2V5IiwiYnRvYSIsInVzZVRyYWNrIiwiYW5hbHl0aWNzIiwicnNXcml0ZUtleSIsImRhdGFQbGFuZVVybCIsInJzRGF0YVBsYW5lVXJsIiwidHJhY2siLCJ0cmFja1Byb3BlcnRpZXMiLCJzaXRlX2lkIiwic2l0ZUlkIiwid2lkZ2V0X2lkIiwid2lkZ2V0SWQiLCJ0cmlnZ2VyIiwiQXV0aERpYWxvZyIsImZyYW1lQXBwTmFtZSIsImZyYW1lQXBwRGVzY3JpcHRpb24iLCJpZnJhbWVVcmwiLCJoYW5kbGVyIiwibWVzc2FnZSIsImF1dGhUeXBlIiwiQXV0aGVudGljYXRpb25TdGFydGVkIiwiaXNTaWdudXAiLCJBdXRoZW50aWNhdGlvbkNvbXBsZXRlZCIsImlzX3NpZ251cCIsImF1dGhfdHlwZSIsIkF1dGhlbnRpY2F0aW9uVmlld2VkIiwic3JjIiwic3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsImxlZnQiLCJ6SW5kZXgiLCJwYXJzZUFub255bW91c0lkIiwicGFyc2VkIiwidHJpbSIsImdldFJ1ZGRlckFub255bW91c0lkIiwicnVkZGVyV2luZG93IiwiZnJvbVJ1ZGRlckNsaWVudCIsInJ1ZGRlcmFuYWx5dGljcyIsImdldEFub255bW91c0lkIiwicnVkZGVyQW5hbHl0aWNzIiwiQW5vbnltb3VzVG9rZW5Qcm92aWRlciIsImdldEFub255bW91c0lkZW50aXR5VG9rZW4iLCJpZGVudGl0eVVybCIsInVzZUF1dGhTZXJ2aWNlcyIsImhhc0ZvcmNlZFJlZnJlc2hJbkRlYnVnUmVmIiwicnVkZGVyQW5vbnltb3VzSWQiLCJCb29sZWFuIiwidGhlbiIsImFjY2Vzc190b2tlbiIsImNhdGNoIiwiQXV0aFByb3ZpZGVyIiwicXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50UHJvdmlkZXIiLCJjbGllbnQiLCJfanN4cyIsImdldFJlZnJlc2hUb2tlbkFwaUtleSIsInJlZnJlc2hQcm9taXNlIiwiZW5zdXJlUmVmcmVzaFRva2VuIiwidXNlclN0b3JlIiwiZmluYWxseSIsImF1dGhlbnRpY2F0ZWRSZXF1ZXN0IiwiYXR0ZW1wdCIsImF1dGhlbnRpY2F0ZWRGZXRjaCIsInBhcnNlUmVzcG9uc2UiLCJlcnIiLCJlcnJvck1lc3NhZ2UiLCJ0aHJvd09uRXJyb3JSZXNwb25zZSIsInJldHJ5RXJyb3IiXSwibWFwcGluZ3MiOiI0WkFnQkEsTUFBTUEsRUFB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
|