@campxdev/campx-web-utils 2.1.7 → 2.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +1 -1
- package/dist/esm/index.js +2 -2
- package/package.json +1 -1
- package/src/utils/constants.ts +1 -0
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"axios";import t from"js-cookie";import{Store as n}from"pullstate";import r from"crypto-js";import{jsxs as o,jsx as i,Fragment as a}from"react/jsx-runtime";import{ConfirmDialog as s,Icons as c,TextField as l,PasswordField as u,Button as d,ResourceNotFound as p,InternalServerError as f,NoInterneConnection as h,UnAuthorized as m,Dialog as v,Snackbar as b,MultiSelect as y,SingleSelect as g,Typography as w,RadioGroup as _,Textarea as N}from"@campxdev/react-blueprint";import*as E from"react";import{createContext as x,useState as k,useEffect as S,useRef as O,useCallback as C,useContext as D}from"react";import{useMutation as P,QueryErrorResetBoundary as I,QueryClient as A,QueryClientProvider as j,useQueryClient as T}from"react-query";import{useNavigate as L,useLocation as V,BrowserRouter as M}from"react-router-dom";export{BrowserRouter}from"react-router-dom";import{validateFieldsNatively as R,toNestError as K}from"@hookform/resolvers";import{appendErrors as F,useForm as z,Controller as U}from"react-hook-form";import q from"device-detector-js";import*as $ from"yup";import{Provider as B}from"react-redux";import W from"@exotel-npm-dev/exotel-ip-calling-crm-websdk";import{X as H,PhoneOutgoing as Y,PhoneIncoming as X,Phone as J,MicOff as G,Mic as Q,Play as Z,Pause as ee,VolumeX as te,Volume2 as ne,PhoneOff as re,AlertCircle as oe}from"lucide-react";import{createPortal as ie}from"react-dom";import{syncScrypt as ae}from"scrypt-js";var se=function(){return se=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},se.apply(this,arguments)};function ce(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(a,s)}c((r=r.apply(e,t||[])).next())})}function le(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=s(0),a.throw=s(1),a.return=s(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(c){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],r=0}finally{n=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,c])}}}"function"==typeof SuppressedError&&SuppressedError;var ue={isLoginDialogOpen:!1,snackbar:{open:!1,message:"",severity:"success"},confirmDialog:{isOpen:!1,title:"",message:"",onConfirm:function(){},onCancel:function(){},type:"confirm"},user:void 0,institutionInfo:void 0,asset:void 0},de=new n(ue);function pe(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function fe(e,t){var n={clientId:e,iat:Math.floor(Date.now()/1e3)},o=pe(btoa(JSON.stringify(n))),i=r.HmacSHA256(o,t),a=pe(r.enc.Base64.stringify(i));return"".concat(o,".").concat(a)}var he=window.location.hostname.includes("localhost"),me=window.location.hostname.split(".")[0].split("--")[0],ve=window.location.pathname.split("/")[1],be=window.location.pathname.split("/")[2],ye={"student-workspace":"/student-api","faculty-workspace":"/faculty-api","department-workspace":"/department-api","academic-coordinator-workspace":"/academic-coordinator-api","feedback-coordinator-workspace":"/feedback-coordinator-api","course-coordinator-workspace":"/course-coordinator-api","classroom-coordinator-workspace":"/classroom-coordinator-api","coe-workspace":"/coe-api","academic-admin-workspace":"/academic-admin-api","hostel-admin-workspace":"/hostel-admin-api","transport-coordinator-workspace":"/transport-coordinator-api","employee-workspace":"/employee-api","librarian-workspace":"/librarian-api","fee-terminal":"/fee-terminal-api","accounts-officer-workspace":"accounts-officer-api","finance-officer-workspace":"/finance-officer-api","outreach-agent-workspace":"outreach-agent-api","prospect-workspace":"prospect-api","external-expert-workspace":"external-expert-api","research-coordinator-workspace":"research-coordinator-api","tele-counsellor-workspace":"tele-counsellor-api","team-owner-workspace":"/team-owner-api","admissions-counsellor-workspace":"/admissions-counsellor-api","admissions-officer-workspace":"/admissions-officer-api","admissions-director-workspace":"/admissions-director-api"},ge=e.create({baseURL:process.env.REACT_APP_API_HOST||"/api",withCredentials:!0,headers:{"x-tenant-id":me,"x-institution-code":ve}});function we(e,t,n){return n.reduce(function(n,r){var o=e[r];return o&&(n[r]=se({singleton:!0,requiredVersion:o,version:o.replace(/^[\^~]/,"")},t.includes(r)?{eager:!0}:{})),n},{})}ge.interceptors.request.use(function(e){var n=function(e){return Object.fromEntries(Object.entries(null!=e?e:{}).map(function(e){var t=e[0],n=e[1];return[t,"__empty__"===n?"":n]}))}(null==e?void 0:e.params);if(!1!==e.workspace&&be&&ye[be]&&"common-workspace"!==be){var r=ye[be];e.url="".concat(r).concat(e.url)}var o=t.get("campx_session_key"),i=t.get("campx_open_payments_key"),a=t.get("campx_student_key");he&&o&&e.headers.set("campx_session_key",o),he&&a&&e.headers.set("campx_student_key",a),i&&e.headers.set("campx_open_payments_key",i);var s=process.env.REACT_APP_CLIENT_ID,c=process.env.REACT_APP_CAMPX_CLIENT_SECRET;return s&&c&&e.headers.set("x-campx-client",fe(s,c)),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),se(se({},e),{params:n})},function(e){return Promise.reject(e)}),ge.interceptors.response.use(function(e){var t;return!(!0===(null===(t=e.data)||void 0===t?void 0:t.hideSnackbar))&&e.config.method&&["put","post","delete","patch"].includes(e.config.method)&&[200,201,202].includes(e.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.data.message||"Operation successful",t.snackbar.severity="success"}),e},function(e){var t,n,r,o,i=!0===(null===(n=null===(t=e.response)||void 0===t?void 0:t.data)||void 0===n?void 0:n.hideSnackbar);return!i&&[400,422,413].includes(null===(r=e.response)||void 0===r?void 0:r.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Bad Request",t.snackbar.severity="error"}),!i&&(null===(o=e.response)||void 0===o?void 0:o.config.method)&&["put","post","delete","patch"].includes(e.response.config.method)&&[404].includes(e.response.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var _e=e.create({baseURL:process.env.REACT_APP_API_HOST||"/api",withCredentials:!0,workspace:!1,headers:{"x-tenant-id":me,"x-institution-code":ve}});_e.interceptors.request.use(function(e){var n=function(e){return Object.fromEntries(Object.entries(null!=e?e:{}).map(function(e){var t=e[0],n=e[1];return[t,"__empty__"===n?"":n]}))}(null==e?void 0:e.params),r=t.get("campx_session_key"),o=t.get("campx_open_payments_key"),i=t.get("campx_student_key");he&&r&&e.headers.set("campx_session_key",r),he&&i&&e.headers.set("campx_student_key",i),o&&e.headers.set("campx_open_payments_key",o);var a=process.env.REACT_APP_CLIENT_ID,s=process.env.REACT_APP_CAMPX_CLIENT_SECRET;return a&&s&&e.headers.set("x-campx-client",fe(a,s)),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),se(se({},e),{params:n})},function(e){return Promise.reject(e)}),_e.interceptors.response.use(function(e){var t;return!(!0===(null===(t=e.data)||void 0===t?void 0:t.hideSnackbar))&&e.config.method&&["put","post","delete","patch"].includes(e.config.method)&&[200,201,202].includes(e.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.data.message||"Operation successful",t.snackbar.severity="success"}),e},function(e){var t,n,r,o,i=!0===(null===(n=null===(t=e.response)||void 0===t?void 0:t.data)||void 0===n?void 0:n.hideSnackbar);return!i&&[400,422].includes(null===(r=e.response)||void 0===r?void 0:r.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Bad Request",t.snackbar.severity="error"}),!i&&(null===(o=e.response)||void 0===o?void 0:o.config.method)&&["put","post","delete","patch"].includes(e.response.config.method)&&[404].includes(e.response.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var Ne=["admissions-director-workspace","admissions-counsellor-workspace","admissions-officer-workspace","tele-counsellor-workspace"];function Ee(e){return Ne.includes(e)}var xe=x({showConfirmDialog:function(){}}),ke=function(e){var t=e.children,n=de.useState(function(e){return e.confirmDialog}),r=function(){de.update(function(e){e.confirmDialog.isOpen=!1})};return o(xe.Provider,{value:{showConfirmDialog:function(e,t,n,r,o,i,a){void 0===o&&(o="confirm"),de.update(function(s){s.confirmDialog={isOpen:!0,title:e,message:t,onConfirm:n,onCancel:r,type:o,confirmButtonText:i,cancelButtonText:a}})}},children:[t,i(s,{open:n.isOpen,title:n.title,message:n.message,variant:n.type,confirmText:n.confirmButtonText,cancelText:n.cancelButtonText,onConfirm:function(){n.onConfirm(),r()},onClose:function(){n.onCancel(),r()}})]})};function Se(e,t){return Se=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Se(e,t)}var Oe={error:null},Ce=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).state=Oe,t.resetErrorBoundary=function(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];null==t.props.onReset||(e=t.props).onReset.apply(e,r),t.reset()},t}!function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,Se(e,t)}(t,e),t.getDerivedStateFromError=function(e){return{error:e}};var n=t.prototype;return n.reset=function(){this.setState(Oe)},n.componentDidCatch=function(e,t){var n,r;null==(n=(r=this.props).onError)||n.call(r,e,t)},n.componentDidUpdate=function(e,t){var n,r,o,i,a=this.state.error,s=this.props.resetKeys;null!==a&&null!==t.error&&(void 0===(o=e.resetKeys)&&(o=[]),void 0===(i=s)&&(i=[]),o.length!==i.length||o.some(function(e,t){return!Object.is(e,i[t])}))&&(null==(n=(r=this.props).onResetKeysChange)||n.call(r,e.resetKeys,s),this.reset())},n.render=function(){var e=this.state.error,t=this.props,n=t.fallbackRender,r=t.FallbackComponent,o=t.fallback;if(null!==e){var i={error:e,resetErrorBoundary:this.resetErrorBoundary};if(E.isValidElement(o))return o;if("function"==typeof n)return n(i);if(r)return E.createElement(r,i);throw new Error("react-error-boundary requires either a fallback, fallbackRender, or FallbackComponent prop")}return this.props.children},t}(E.Component),De=function(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),function(r,o,i){try{return Promise.resolve(function(a,s){try{var c=(t.context&&process.env.NODE_ENV,Promise.resolve(e["sync"===n.mode?"validateSync":"validate"](r,Object.assign({abortEarly:!1},t,{context:o}))).then(function(e){return i.shouldUseNativeValidation&&R({},i),{values:n.rawValues?r:e,errors:{}}}))}catch(e){return s(e)}return c&&c.then?c.then(void 0,s):c}(0,function(e){if(!e.inner)throw e;return{values:{},errors:K((t=e,n=!i.shouldUseNativeValidation&&"all"===i.criteriaMode,(t.inner||[]).reduce(function(e,t){if(e[t.path]||(e[t.path]={message:t.message,type:t.type}),n){var r=e[t.path].types,o=r&&r[t.type];e[t.path]=F(t.path,n,e,t.type,o?[].concat(o,t.message):t.message)}return e},{})),i)};var t,n}))}catch(e){return Promise.reject(e)}}},Pe=function(e){return ce(void 0,void 0,void 0,function(){var t;return le(this,function(n){switch(n.label){case 0:return e.latitude&&e.longitude?[3,3]:[4,fetch("https://www.googleapis.com/geolocation/v1/geolocate?key=AIzaSyB2YCpo1yi107RYj1LdZu2DCcpcO93reFY",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({considerIp:"true"})})];case 1:return[4,n.sent().json()];case 2:t=n.sent(),e.latitude=t.location.lat,e.longitude=t.location.lng,n.label=3;case 3:return[2,ge.post("/auth-server/auth-v2/login",e,{workspace:!1}).then(function(e){return e.data})]}})})},Ie=$.object().shape({username:$.string().required("Username is required"),password:$.string().required("Password is required")}),Ae=function(e){var n=e.close,r=k({deviceInformation:{deviceType:"browser",clientName:"unknown",os:"unknown",osVersion:"unknown",latitude:null,longitude:null,tokenType:"WEB"},isLocationAllowed:!0}),a=r[0],s=r[1],p=L();S(function(){navigator.geolocation.getCurrentPosition(function(e){s(function(t){return se(se({},t),{deviceInformation:se(se({},t.deviceInformation),{latitude:e.coords.latitude,longitude:e.coords.longitude})})})}),navigator.permissions.query({name:"geolocation"}).then(function(e){"denied"===e.state&&s(function(e){return se(se({},e),{isLocationAllowed:!1})})});var e=(new q).parse(navigator.userAgent);s(function(t){var n,r,o;return se(se({},t),{deviceInformation:se(se({},t.deviceInformation),{clientName:(null===(n=e.client)||void 0===n?void 0:n.name)||t.deviceInformation.clientName,os:(null===(r=e.os)||void 0===r?void 0:r.name)||t.deviceInformation.os,osVersion:(null===(o=e.os)||void 0===o?void 0:o.version)||t.deviceInformation.osVersion})})})},[]);var f=z({resolver:De(Ie)}),h=f.handleSubmit,m=f.control,v=f.formState.errors,b=P(Pe,{onSuccess:function(e){he&&(t.remove("campx_session_key"),t.set("campx_session_key",e.session.token),n(),p("/".concat(e.session.institutionCode,"/workspace")),window.location.reload())}}),y=b.mutate,g=b.isLoading;return o("div",{className:"flex flex-col gap-8 justify-center items-center p-8",children:[i("div",{className:"flex items-center justify-center h-9 w-48",children:i(c.CampxFullLogoIcon,{})}),o("div",{className:"flex flex-col gap-4 w-full max-w-[400px]",children:[i(U,{control:m,render:function(e){var t=e.field;return i(l,{name:"username",placeholder:"Enter Username or Email",onChange:t.onChange,label:"Username or Email",error:!!v.username,required:!0,fullWidth:!0})},name:"username"}),i(U,{control:m,render:function(e){var t=e.field;return i(u,{name:"password",placeholder:"Enter password",onChange:t.onChange,label:"Password",error:!!v.password,required:!0,fullWidth:!0})},name:"password"}),i(d,{type:"submit",color:"primary",variant:"default",onClick:h(function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){return y(se(se(se({},e),a.deviceInformation),{loginId:e.username,loginType:"USER"})),[2]})})}),disabled:g,loading:g,fullWidth:!0,children:"Login"})]})]})},je=function(e){var t=V();return i(I,{children:function(n){var r=n.reset;return i(Ce,{onReset:r,FallbackComponent:Te,children:e.children},null==t?void 0:t.pathname)}})},Te=function(e){var t,n,r,a,s,c,l,u=e.error,m=e.resetErrorBoundary;if(null===(t=null==u?void 0:u.response)||void 0===t?void 0:t.status)switch(null===(n=null==u?void 0:u.response)||void 0===n?void 0:n.status){case 401:return i(Le,{});case 500:return i(f,{resetBoundary:m});case 404:return i(p,{message:null===(a=null===(r=null==u?void 0:u.response)||void 0===r?void 0:r.data)||void 0===a?void 0:a.message})}return"ERR_NETWORK"===(null==u?void 0:u.code)?i(h,{resetBoundary:m}):i("div",{className:"mt-4 p-5",children:o("div",{className:"relative h-15 border border-red-200 bg-red-50 flex items-center rounded-md px-2",children:[i("div",{className:"flex-1 text-red-700 bg-transparent",children:null!==(l=null===(c=null===(s=null==u?void 0:u.response)||void 0===s?void 0:s.data)||void 0===c?void 0:c.message)&&void 0!==l?l:null==u?void 0:u.message}),i(d,{onClick:function(){return m()},size:"sm",variant:"link",className:"hover:no-underline text-destructive",children:"Try Again"})]})})},Le=function(){var e=L(),n=k(!1),r=n[0],s=n[1],c=t.get("campx_session_key");return i(m,{component:o(a,{children:[i(d,{className:"mt-5",variant:"default",onClick:function(){"localhost"===window.location.hostname.split(".")[1]?s(!0):c||e("prospect-workspace"===be?"".concat(ve,"/ats/login"):"/auth/login")},children:"Click Here To Login"}),i(v,{open:r,onClose:function(){return s(!1)},content:function(e){var t=e.close;return i(Ae,{close:t})}})]})})};function Ve(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var Me=(()=>"function"==typeof Symbol&&Symbol.observable||"@@observable")(),Re=()=>Math.random().toString(36).substring(7).split("").join("."),Ke={INIT:`@@redux/INIT${Re()}`,REPLACE:`@@redux/REPLACE${Re()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${Re()}`};function Fe(e){if("object"!=typeof e||null===e)return!1;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||null===Object.getPrototypeOf(e)}function ze(e){if(void 0===e)return"undefined";if(null===e)return"null";const t=typeof e;switch(t){case"boolean":case"string":case"number":case"symbol":case"function":return t}if(Array.isArray(e))return"array";if(function(e){return e instanceof Date||"function"==typeof e.toDateString&&"function"==typeof e.getDate&&"function"==typeof e.setDate}(e))return"date";if(function(e){return e instanceof Error||"string"==typeof e.message&&e.constructor&&"number"==typeof e.constructor.stackTraceLimit}(e))return"error";const n=function(e){return"function"==typeof e.constructor?e.constructor.name:null}(e);switch(n){case"Symbol":case"Promise":case"WeakMap":case"WeakSet":case"Map":case"Set":return n}return Object.prototype.toString.call(e).slice(8,-1).toLowerCase().replace(/\s/g,"")}function Ue(e){let t=typeof e;return"production"!==process.env.NODE_ENV&&(t=ze(e)),t}function qe(e,t,n){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?Ve(2):`Expected the root reducer to be a function. Instead, received: '${Ue(e)}'`);if("function"==typeof t&&"function"==typeof n||"function"==typeof n&&"function"==typeof arguments[3])throw new Error("production"===process.env.NODE_ENV?Ve(0):"It looks like you are passing several store enhancers to createStore(). This is not supported. Instead, compose them together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.");if("function"==typeof t&&void 0===n&&(n=t,t=void 0),void 0!==n){if("function"!=typeof n)throw new Error("production"===process.env.NODE_ENV?Ve(1):`Expected the enhancer to be a function. Instead, received: '${Ue(n)}'`);return n(qe)(e,t)}let r=e,o=t,i=new Map,a=i,s=0,c=!1;function l(){a===i&&(a=new Map,i.forEach((e,t)=>{a.set(t,e)}))}function u(){if(c)throw new Error("production"===process.env.NODE_ENV?Ve(3):"You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store.");return o}function d(e){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?Ve(4):`Expected the listener to be a function. Instead, received: '${Ue(e)}'`);if(c)throw new Error("production"===process.env.NODE_ENV?Ve(5):"You may not call store.subscribe() while the reducer is executing. If you would like to be notified after the store has been updated, subscribe from a component and invoke store.getState() in the callback to access the latest state. See https://redux.js.org/api/store#subscribelistener for more details.");let t=!0;l();const n=s++;return a.set(n,e),function(){if(t){if(c)throw new Error("production"===process.env.NODE_ENV?Ve(6):"You may not unsubscribe from a store listener while the reducer is executing. See https://redux.js.org/api/store#subscribelistener for more details.");t=!1,l(),a.delete(n),i=null}}}function p(e){if(!Fe(e))throw new Error("production"===process.env.NODE_ENV?Ve(7):`Actions must be plain objects. Instead, the actual type was: '${Ue(e)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`);if(void 0===e.type)throw new Error("production"===process.env.NODE_ENV?Ve(8):'Actions may not have an undefined "type" property. You may have misspelled an action type string constant.');if("string"!=typeof e.type)throw new Error("production"===process.env.NODE_ENV?Ve(17):`Action "type" property must be a string. Instead, the actual type was: '${Ue(e.type)}'. Value was: '${e.type}' (stringified)`);if(c)throw new Error("production"===process.env.NODE_ENV?Ve(9):"Reducers may not dispatch actions.");try{c=!0,o=r(o,e)}finally{c=!1}return(i=a).forEach(e=>{e()}),e}p({type:Ke.INIT});return{dispatch:p,subscribe:d,getState:u,replaceReducer:function(e){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?Ve(10):`Expected the nextReducer to be a function. Instead, received: '${Ue(e)}`);r=e,p({type:Ke.REPLACE})},[Me]:function(){const e=d;return{subscribe(t){if("object"!=typeof t||null===t)throw new Error("production"===process.env.NODE_ENV?Ve(11):`Expected the observer to be an object. Instead, received: '${Ue(t)}'`);function n(){const e=t;e.next&&e.next(u())}n();return{unsubscribe:e(n)}},[Me](){return this}}}}}function $e(e){"undefined"!=typeof console&&console.error;try{throw new Error(e)}catch(e){}}function Be(e){const t=Object.keys(e),n={};for(let r=0;r<t.length;r++){const o=t[r];"production"!==process.env.NODE_ENV&&void 0===e[o]&&$e(`No reducer provided for key "${o}"`),"function"==typeof e[o]&&(n[o]=e[o])}const r=Object.keys(n);let o,i;"production"!==process.env.NODE_ENV&&(o={});try{!function(e){Object.keys(e).forEach(t=>{const n=e[t];if(void 0===n(void 0,{type:Ke.INIT}))throw new Error("production"===process.env.NODE_ENV?Ve(12):`The slice reducer for key "${t}" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.`);if(void 0===n(void 0,{type:Ke.PROBE_UNKNOWN_ACTION()}))throw new Error("production"===process.env.NODE_ENV?Ve(13):`The slice reducer for key "${t}" returned undefined when probed with a random type. Don't try to handle '${Ke.INIT}' or other actions in "redux/*" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.`)})}(n)}catch(e){i=e}return function(e={},t){if(i)throw i;if("production"!==process.env.NODE_ENV){const r=function(e,t,n,r){const o=Object.keys(t),i=n&&n.type===Ke.INIT?"preloadedState argument passed to createStore":"previous state received by the reducer";if(0===o.length)return"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";if(!Fe(e))return`The ${i} has unexpected type of "${Ue(e)}". Expected argument to be an object with the following keys: "${o.join('", "')}"`;const a=Object.keys(e).filter(e=>!t.hasOwnProperty(e)&&!r[e]);return a.forEach(e=>{r[e]=!0}),n&&n.type===Ke.REPLACE?void 0:a.length>0?`Unexpected ${a.length>1?"keys":"key"} "${a.join('", "')}" found in ${i}. Expected to find one of the known reducer keys instead: "${o.join('", "')}". Unexpected keys will be ignored.`:void 0}(e,n,t,o);r&&$e(r)}let a=!1;const s={};for(let o=0;o<r.length;o++){const i=r[o],c=n[i],l=e[i],u=c(l,t);if(void 0===u){const e=t&&t.type;throw new Error("production"===process.env.NODE_ENV?Ve(14):`When called with an action of type ${e?`"${String(e)}"`:"(unknown type)"}, the slice reducer for key "${i}" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.`)}s[i]=u,a=a||u!==l}return a=a||r.length!==Object.keys(e).length,a?s:e}}function We(...e){return 0===e.length?e=>e:1===e.length?e[0]:e.reduce((e,t)=>(...n)=>e(t(...n)))}var He=Symbol.for("immer-nothing"),Ye=Symbol.for("immer-draftable"),Xe=Symbol.for("immer-state"),Je="production"!==process.env.NODE_ENV?[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}]:[];function Ge(e,...t){if("production"!==process.env.NODE_ENV){const n=Je[e],r="function"==typeof n?n.apply(null,t):n;throw new Error(`[Immer] ${r}`)}throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Qe=Object.getPrototypeOf;function Ze(e){return!!e&&!!e[Xe]}function et(e){return!!e&&(rt(e)||Array.isArray(e)||!!e[Ye]||!!e.constructor?.[Ye]||ct(e)||lt(e))}var tt=Object.prototype.constructor.toString(),nt=new WeakMap;function rt(e){if(!e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);if(null===t||t===Object.prototype)return!0;const n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(n===Object)return!0;if("function"!=typeof n)return!1;let r=nt.get(n);return void 0===r&&(r=Function.toString.call(n),nt.set(n,r)),r===tt}function ot(e,t,n=!0){if(0===it(e)){(n?Reflect.ownKeys(e):Object.keys(e)).forEach(n=>{t(n,e[n],e)})}else e.forEach((n,r)=>t(r,n,e))}function it(e){const t=e[Xe];return t?t.type_:Array.isArray(e)?1:ct(e)?2:lt(e)?3:0}function at(e,t){return 2===it(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function st(e,t,n){const r=it(e);2===r?e.set(t,n):3===r?e.add(n):e[t]=n}function ct(e){return e instanceof Map}function lt(e){return e instanceof Set}function ut(e){return e.copy_||e.base_}function dt(e,t){if(ct(e))return new Map(e);if(lt(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const n=rt(e);if(!0===t||"class_only"===t&&!n){const t=Object.getOwnPropertyDescriptors(e);delete t[Xe];let n=Reflect.ownKeys(t);for(let r=0;r<n.length;r++){const o=n[r],i=t[o];!1===i.writable&&(i.writable=!0,i.configurable=!0),(i.get||i.set)&&(t[o]={configurable:!0,writable:!0,enumerable:i.enumerable,value:e[o]})}return Object.create(Qe(e),t)}{const t=Qe(e);if(null!==t&&n)return{...e};const r=Object.create(t);return Object.assign(r,e)}}function pt(e,t=!1){return ht(e)||Ze(e)||!et(e)||(it(e)>1&&Object.defineProperties(e,{set:ft,add:ft,clear:ft,delete:ft}),Object.freeze(e),t&&Object.values(e).forEach(e=>pt(e,!0))),e}var ft={value:function(){Ge(2)}};function ht(e){return null===e||"object"!=typeof e||Object.isFrozen(e)}var mt,vt={};function bt(e){const t=vt[e];return t||Ge(0,e),t}function yt(){return mt}function gt(e,t){t&&(bt("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function wt(e){_t(e),e.drafts_.forEach(Et),e.drafts_=null}function _t(e){e===mt&&(mt=e.parent_)}function Nt(e){return mt={drafts_:[],parent_:mt,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Et(e){const t=e[Xe];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function xt(e,t){t.unfinalizedDrafts_=t.drafts_.length;const n=t.drafts_[0];return void 0!==e&&e!==n?(n[Xe].modified_&&(wt(t),Ge(4)),et(e)&&(e=kt(t,e),t.parent_||Ot(t,e)),t.patches_&&bt("Patches").generateReplacementPatches_(n[Xe].base_,e,t.patches_,t.inversePatches_)):e=kt(t,n,[]),wt(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==He?e:void 0}function kt(e,t,n){if(ht(t))return t;const r=e.immer_.shouldUseStrictIteration(),o=t[Xe];if(!o)return ot(t,(r,i)=>St(e,o,t,r,i,n),r),t;if(o.scope_!==e)return t;if(!o.modified_)return Ot(e,o.base_,!0),o.base_;if(!o.finalized_){o.finalized_=!0,o.scope_.unfinalizedDrafts_--;const t=o.copy_;let i=t,a=!1;3===o.type_&&(i=new Set(t),t.clear(),a=!0),ot(i,(r,i)=>St(e,o,t,r,i,n,a),r),Ot(e,t,!1),n&&e.patches_&&bt("Patches").generatePatches_(o,n,e.patches_,e.inversePatches_)}return o.copy_}function St(e,t,n,r,o,i,a){if(null==o)return;if("object"!=typeof o&&!a)return;const s=ht(o);if(!s||a){if("production"!==process.env.NODE_ENV&&o===n&&Ge(5),Ze(o)){const a=kt(e,o,i&&t&&3!==t.type_&&!at(t.assigned_,r)?i.concat(r):void 0);if(st(n,r,a),!Ze(a))return;e.canAutoFreeze_=!1}else a&&n.add(o);if(et(o)&&!s){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;if(t&&t.base_&&t.base_[r]===o&&s)return;kt(e,o),t&&t.scope_.parent_||"symbol"==typeof r||!(ct(n)?n.has(r):Object.prototype.propertyIsEnumerable.call(n,r))||Ot(e,o)}}}function Ot(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&pt(t,n)}var Ct={get(e,t){if(t===Xe)return e;const n=ut(e);if(!at(n,t))return function(e,t,n){const r=It(t,n);return r?"value"in r?r.value:r.get?.call(e.draft_):void 0}(e,n,t);const r=n[t];return e.finalized_||!et(r)?r:r===Pt(e.base_,t)?(jt(e),e.copy_[t]=Tt(r,e)):r},has:(e,t)=>t in ut(e),ownKeys:e=>Reflect.ownKeys(ut(e)),set(e,t,n){const r=It(ut(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){const r=Pt(ut(e),t),a=r?.[Xe];if(a&&a.base_===n)return e.copy_[t]=n,e.assigned_[t]=!1,!0;if(((o=n)===(i=r)?0!==o||1/o==1/i:o!=o&&i!=i)&&(void 0!==n||at(e.base_,t)))return!0;jt(e),At(e)}var o,i;return e.copy_[t]===n&&(void 0!==n||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_[t]=!0),!0},deleteProperty:(e,t)=>(void 0!==Pt(e.base_,t)||t in e.base_?(e.assigned_[t]=!1,jt(e),At(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=ut(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{writable:!0,configurable:1!==e.type_||"length"!==t,enumerable:r.enumerable,value:n[t]}:r},defineProperty(){Ge(11)},getPrototypeOf:e=>Qe(e.base_),setPrototypeOf(){Ge(12)}},Dt={};function Pt(e,t){const n=e[Xe];return(n?ut(n):e)[t]}function It(e,t){if(!(t in e))return;let n=Qe(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=Qe(n)}}function At(e){e.modified_||(e.modified_=!0,e.parent_&&At(e.parent_))}function jt(e){e.copy_||(e.copy_=dt(e.base_,e.scope_.immer_.useStrictShallowCopy_))}ot(Ct,(e,t)=>{Dt[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}}),Dt.deleteProperty=function(e,t){return"production"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&Ge(13),Dt.set.call(this,e,t,void 0)},Dt.set=function(e,t,n){return"production"!==process.env.NODE_ENV&&"length"!==t&&isNaN(parseInt(t))&&Ge(14),Ct.set.call(this,e[0],t,n,e[0])};function Tt(e,t){const n=ct(e)?bt("MapSet").proxyMap_(e,t):lt(e)?bt("MapSet").proxySet_(e,t):function(e,t){const n=Array.isArray(e),r={type_:n?1:0,scope_:t?t.scope_:yt(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let o=r,i=Ct;n&&(o=[r],i=Dt);const{revoke:a,proxy:s}=Proxy.revocable(o,i);return r.draft_=s,r.revoke_=a,s}(e,t);return(t?t.scope_:yt()).drafts_.push(n),n}function Lt(e){if(!et(e)||ht(e))return e;const t=e[Xe];let n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=dt(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=dt(e,!0);return ot(n,(e,t)=>{st(n,e,Lt(t))},r),t&&(t.finalized_=!1),n}var Vt=new class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(e,t,n)=>{if("function"==typeof e&&"function"!=typeof t){const n=t;t=e;const r=this;return function(e=n,...o){return r.produce(e,e=>t.call(this,e,...o))}}let r;if("function"!=typeof t&&Ge(6),void 0!==n&&"function"!=typeof n&&Ge(7),et(e)){const o=Nt(this),i=Tt(e,void 0);let a=!0;try{r=t(i),a=!1}finally{a?wt(o):_t(o)}return gt(o,n),xt(r,o)}if(!e||"object"!=typeof e){if(r=t(e),void 0===r&&(r=e),r===He&&(r=void 0),this.autoFreeze_&&pt(r,!0),n){const t=[],o=[];bt("Patches").generateReplacementPatches_(e,r,t,o),n(t,o)}return r}Ge(1,e)},this.produceWithPatches=(e,t)=>{if("function"==typeof e)return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},"boolean"==typeof e?.autoFreeze&&this.setAutoFreeze(e.autoFreeze),"boolean"==typeof e?.useStrictShallowCopy&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),"boolean"==typeof e?.useStrictIteration&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){et(e)||Ge(8),Ze(e)&&(e=function(e){Ze(e)||Ge(10,e);return Lt(e)}(e));const t=Nt(this),n=Tt(e,void 0);return n[Xe].isManual_=!0,_t(t),n}finishDraft(e,t){const n=e&&e[Xe];n&&n.isManual_||Ge(9);const{scope_:r}=n;return gt(r,t),xt(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));const r=bt("Patches").applyPatches_;return Ze(e)?r(e,t):this.produce(e,e=>r(e,t))}};Vt.produce;var Mt=Vt.setUseStrictIteration.bind(Vt);function Rt(e){return({dispatch:t,getState:n})=>r=>o=>"function"==typeof o?o(t,n,e):r(o)}var Kt=Rt(),Ft=Rt,zt="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(0!==arguments.length)return"object"==typeof arguments[0]?We:We.apply(null,arguments)};function Ut(e){return"function"==typeof e&&"type"in e&&((t=e)&&"function"==typeof t.match);var t}function qt(e,t){let n=0;return{measureTime(e){const t=Date.now();try{return e()}finally{const e=Date.now();n+=e-t}},warnIfExceeded(){}}}var $t=class e extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,e.prototype)}static get[Symbol.species](){return e}concat(...e){return super.concat.apply(this,e)}prepend(...t){return 1===t.length&&Array.isArray(t[0])?new e(...t[0].concat(this)):new e(...t.concat(this))}};function Bt(e){return"object"!=typeof e||null==e||Object.isFrozen(e)}function Wt(e,t,n){const r=Ht(e,t,n);return{detectMutations:()=>Yt(e,t,r,n)}}function Ht(e,t=[],n,r="",o=new Set){const i={value:n};if(!e(n)&&!o.has(n)){o.add(n),i.children={};for(const o in n){const a=r?r+"."+o:o;t.length&&-1!==t.indexOf(a)||(i.children[o]=Ht(e,t,n[o],a))}}return i}function Yt(e,t=[],n,r,o=!1,i=""){const a=n?n.value:void 0,s=a===r;if(o&&!s&&!Number.isNaN(r))return{wasMutated:!0,path:i};if(e(a)||e(r))return{wasMutated:!1};const c={};for(let e in n.children)c[e]=!0;for(let e in r)c[e]=!0;const l=t.length>0;for(let o in c){const a=i?i+"."+o:o;if(l){if(t.some(e=>e instanceof RegExp?e.test(a):a===e))continue}const c=Yt(e,t,n.children[o],r[o],s,a);if(c.wasMutated)return c}return{wasMutated:!1}}function Xt(e){const t=typeof e;return null==e||"string"===t||"boolean"===t||"number"===t||Array.isArray(e)||Fe(e)}function Jt(e,t="",n=Xt,r,o=[],i){let a;if(!n(e))return{keyPath:t||"<root>",value:e};if("object"!=typeof e||null===e)return!1;if(i?.has(e))return!1;const s=null!=r?r(e):Object.entries(e),c=o.length>0;for(const[e,l]of s){const s=t?t+"."+e:e;if(c){if(o.some(e=>e instanceof RegExp?e.test(s):s===e))continue}if(!n(l))return{keyPath:s,value:l};if("object"==typeof l&&(a=Jt(l,s,n,r,o,i),a))return a}return i&&Gt(e)&&i.add(e),!1}function Gt(e){if(!Object.isFrozen(e))return!1;for(const t of Object.values(e))if("object"==typeof t&&null!==t&&!Gt(t))return!1;return!0}function Qt(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);{const{isSerializable:t=Xt,getEntries:n,ignoredActions:r=[],ignoredActionPaths:o=["meta.arg","meta.baseQueryMeta"],ignoredPaths:i=[],warnAfter:a=32,ignoreState:s=!1,ignoreActions:c=!1,disableCache:l=!1}=e,u=!l&&WeakSet?new WeakSet:void 0;return e=>a=>l=>{if(!function(e){return Fe(e)&&"type"in e&&"string"==typeof e.type}(l))return a(l);const d=a(l),p=qt();return c||r.length&&-1!==r.indexOf(l.type)||p.measureTime(()=>{const e=Jt(l,"",t,n,o,u);if(e){const{keyPath:t,value:n}=e}}),s||(p.measureTime(()=>{const r=Jt(e.getState(),"",t,n,i,u);if(r){const{keyPath:e,value:t}=r}}),p.warnIfExceeded()),d}}}function Zt(e){return"boolean"==typeof e}var en=()=>function(e){const{thunk:t=!0,immutableCheck:n=!0,serializableCheck:r=!0,actionCreatorCheck:o=!0}=e??{};let i=new $t;if(t&&(Zt(t)?i.push(Kt):i.push(Ft(t.extraArgument))),"production"!==process.env.NODE_ENV){if(n){let e={};Zt(n)||(e=n),i.unshift(function(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);{let t=function(e,t,r,o){return JSON.stringify(e,n(t,o),r)},n=function(e,t){let n=[],r=[];return t||(t=function(e,t){return n[0]===t?"[Circular ~]":"[Circular ~."+r.slice(0,n.indexOf(t)).join(".")+"]"}),function(o,i){if(n.length>0){var a=n.indexOf(this);~a?n.splice(a+1):n.push(this),~a?r.splice(a,1/0,o):r.push(o),~n.indexOf(i)&&(i=t.call(this,o,i))}else n.push(i);return null==e?i:e.call(this,o,i)}},{isImmutable:r=Bt,ignoredPaths:o,warnAfter:i=32}=e;const a=Wt.bind(null,r,o);return({getState:e})=>{let n,r=e(),o=a(r);return i=>s=>{const c=qt();c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?on(19):`A state mutation was detected between dispatches, in the path '${n.path||""}'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`)});const l=i(s);return c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?on(20):`A state mutation was detected inside a dispatch, in the path: ${n.path||""}. Take a look at the reducer(s) handling the action ${t(s)}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`)}),c.warnIfExceeded(),l}}}}(e))}if(r){let e={};Zt(r)||(e=r),i.push(Qt(e))}if(o){let e={};Zt(o)||(e=o),i.unshift(function(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);const{isActionCreator:t=Ut}=e;return()=>e=>n=>(t(n),e(n))}(e))}}return i},tn=e=>t=>{setTimeout(t,e)},nn=e=>function(t){const{autoBatch:n=!0}=t??{};let r=new $t(e);return n&&r.push(((e={type:"raf"})=>t=>(...n)=>{const r=t(...n);let o=!0,i=!1,a=!1;const s=new Set,c="tick"===e.type?queueMicrotask:"raf"===e.type?"undefined"!=typeof window&&window.requestAnimationFrame?window.requestAnimationFrame:tn(10):"callback"===e.type?e.queueNotification:tn(e.timeout),l=()=>{a=!1,i&&(i=!1,s.forEach(e=>e()))};return Object.assign({},r,{subscribe(e){const t=r.subscribe(()=>o&&e());return s.add(e),()=>{t(),s.delete(e)}},dispatch(e){try{return o=!e?.meta?.RTK_autoBatch,i=!o,i&&(a||(a=!0,c(l))),r.dispatch(e)}finally{o=!0}}})})("object"==typeof n?n:void 0)),r};function rn(e){const t=en(),{reducer:n,middleware:r,devTools:o=!0,duplicateMiddlewareCheck:i=!0,preloadedState:a,enhancers:s}=e||{};let c,l;if("function"==typeof n)c=n;else{if(!Fe(n))throw new Error("production"===process.env.NODE_ENV?on(1):"`reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers");c=Be(n)}if("production"!==process.env.NODE_ENV&&r&&"function"!=typeof r)throw new Error("production"===process.env.NODE_ENV?on(2):"`middleware` field must be a callback");if("function"==typeof r){if(l=r(t),"production"!==process.env.NODE_ENV&&!Array.isArray(l))throw new Error("production"===process.env.NODE_ENV?on(3):"when using a middleware builder function, an array of middleware must be returned")}else l=t();if("production"!==process.env.NODE_ENV&&l.some(e=>"function"!=typeof e))throw new Error("production"===process.env.NODE_ENV?on(4):"each middleware provided to configureStore must be a function");if("production"!==process.env.NODE_ENV&&i){let e=new Set;l.forEach(t=>{if(e.has(t))throw new Error("production"===process.env.NODE_ENV?on(42):"Duplicate middleware references found when creating the store. Ensure that each middleware is only included once.");e.add(t)})}let u=We;o&&(u=zt({trace:"production"!==process.env.NODE_ENV,..."object"==typeof o&&o}));const d=function(...e){return t=>(n,r)=>{const o=t(n,r);let i=()=>{throw new Error("production"===process.env.NODE_ENV?Ve(15):"Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")};const a={getState:o.getState,dispatch:(e,...t)=>i(e,...t)},s=e.map(e=>e(a));return i=We(...s)(o.dispatch),{...o,dispatch:i}}}(...l),p=nn(d);if("production"!==process.env.NODE_ENV&&s&&"function"!=typeof s)throw new Error("production"===process.env.NODE_ENV?on(5):"`enhancers` field must be a callback");let f="function"==typeof s?s(p):p();if("production"!==process.env.NODE_ENV&&!Array.isArray(f))throw new Error("production"===process.env.NODE_ENV?on(6):"`enhancers` callback must return an array");if("production"!==process.env.NODE_ENV&&f.some(e=>"function"!=typeof e))throw new Error("production"===process.env.NODE_ENV?on(7):"each enhancer provided to configureStore must be a function");"production"!==process.env.NODE_ENV&&l.length&&f.includes(d);return qe(c,a,u(...f))}function on(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}Mt(!1);var an=x(void 0),sn=function(e){var t=e.children,n=de.useState(function(e){return e.snackbar});return o(an.Provider,{value:{showSnackbar:function(e,t){void 0===t&&(t="info"),de.update(function(n){n.snackbar.open=!0,n.snackbar.message=e,n.snackbar.severity=t})}},children:[t,i(b,{open:n.open,message:n.message,severity:n.severity,autoHideDuration:1500,onClose:function(){de.update(function(e){e.snackbar.open=!1})}})]})},cn=function(e){var t=e.children,n=e.basename,r=e.reducers,o=void 0===r?{}:r,a=new A({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:!1,useErrorBoundary:!0}}}),s=me&&ve&&be?"/".concat(ve,"/").concat(be):"/";S(function(){"/"===window.location.pathname&&ve&&be&&me&&window.location.replace(window.location.origin+"/".concat(ve,"/").concat(be))},[ve,me,be]);var c=rn({reducer:Be(o)});return i(B,{store:c,children:i(M,{basename:null!=n?n:s,children:i(j,{client:a,children:i(sn,{children:i(ke,{children:t})})})})})},ln={isOpen:!1,title:"",message:"",confirmButtonText:"",cancelButtonText:"",type:"confirm",onConfirm:function(){},onCancel:function(){}},un=function(){var e=function(){de.update(function(e){e.confirmDialog=ln})};return function(t){var n=t.title,r=t.message,o=t.confirmButtonText,i=t.cancelButtonText,a=t.type,s=void 0===a?"confirm":a;return new Promise(function(t){de.update(function(a){a.confirmDialog={isOpen:!0,title:n,message:r,confirmButtonText:o,cancelButtonText:i,type:s,onConfirm:function(){t(!0),e()},onCancel:function(){t(!1),e()}}})})}},dn=function(e){return i(y,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"_id",isObjectId:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/departments"}))},pn=function(e){return i(y,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"id",isInt:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/departments-sql"}))},fn=function(e){return i(g,se({label:"Batch"},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/batches"}))},hn=function(e){return i(g,se({dbLabelProps:{labelKey:"courseName",subLabelKey:"level"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/courses"}))},mn=function(e){return i(g,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"_id",isObjectId:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/departments"}))},vn=function(e){return i(g,se({dbValueProps:{valueKey:"_id",isObjectId:!0},dbLabelProps:{labelKey:"fullName",subLabelKey:"employeeId"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/employees"}))},bn=function(e){return i(g,se({label:"Regulation"},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/exam-regulations",dbLabelProps:{labelKey:"r.name"},dbValueProps:{valueKey:"r.name"}}))},yn=[{label:"All",value:null},{label:"REGULAR",value:"R"},{label:"SUPPLEMENTARY",value:"S"}],gn=function(e){return i(g,se({label:"Exam Type",options:yn},e))},wn=[{label:"Tuition Fee",value:"tuition_fee"},{label:"Admission Fee",value:"admission_fee"},{label:"Hostel Fee",value:"hostel_fee"},{label:"Transport Fee",value:"transport_fee"},{label:"Exam Fee",value:"exam_fee"},{label:"Other Fee",value:"other_fee"}],_n=Array.from({length:6},function(e,t){return(new Date).getFullYear()-t});Array.from({length:12},function(e,t){return{label:"".concat((new Date).getFullYear()-t," - ").concat((new Date).getFullYear()-t+1),value:"".concat((new Date).getFullYear()-t," - ").concat((new Date).getFullYear()-t+1)}});var Nn=function(e){return i(g,se({label:"Fee Type",options:null==wn?void 0:wn.map(function(e){return{label:e.label,value:e.value}})},e))},En=function(e){return i(g,se({dbValueProps:{valueKey:"id",isInt:!0},dbLabelProps:{labelKey:"name",subLabelKey:"type",useLabelStartCase:!0,useSubLabelStartCase:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/hostel-blocks"}))},xn=function(e){return i(g,se({label:"Hostel Room No.",dbValueProps:{valueKey:"floor"},dbLabelProps:{labelKey:"floor"}},e,{externalAxios:_e,optionsApiEndPoint:"dropdowns/floors"}))},kn=function(e){return i(g,se({label:"Hostel Room",dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"room_number",useLabelStartCase:!0}},e,{optionsApiEndPoint:"dropdowns/hostel-rooms",externalAxios:_e}))},Sn=function(e){return i(g,se({label:"Month & Year"},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/month-years"}))},On=function(e){return i(g,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/print-formats"}))},Cn=function(e){return i(g,se({dbLabelProps:{labelKey:"branchCode",subLabelKey:"branchDisplay"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/programs"}))},Dn=function(e){return i(g,se({label:"Regulation",dbValueProps:{valueKey:"regulation_id"},dbLabelProps:{labelKey:"r.name"}},e,{optionsApiEndPoint:"dropdowns/regulations",externalAxios:_e}))},Pn=function(e){return i(g,se({dbLabelProps:{labelKey:"name"},dbValueProps:{valueKey:"id",isInt:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/research-expert-designations"}))},In=function(e){return i(g,se({dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"name",subLabelKey:"type"}},e,{optionsApiEndPoint:"dropdowns/research-experts",externalAxios:_e}))},An=function(e){return i(g,se({dbValueProps:{valueKey:"id",isInt:!0},dbLabelProps:{labelKey:"name",subLabelKey:"`order`"}},e,{optionsApiEndPoint:"dropdowns/research-stages",externalAxios:_e}))},jn=function(e){return i(g,se({dbLabelProps:{labelKey:"name",subLabelKey:"year"}},e,{optionsApiEndPoint:"/dropdowns/semesters",externalAxios:_e}))},Tn=function(e){return i(g,se({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/students"}))},Ln=function(e){return i(g,se({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/student-services"}))},Vn=function(e){var t=e.suffix,n=void 0===t?null:t,r=e.valueKey,o=void 0===r?"yearRange":r,a=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}(e,["suffix","valueKey"]);return i(g,se({label:"Year Range",options:null==_n?void 0:_n.map(function(e){return{label:n?"".concat(n," ").concat(e," - ").concat(e+1):"".concat(e," - ").concat(e+1),value:"yearRange"===o?"".concat(e," - ").concat(e+1):e}})},a))},Mn=function(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=!1);var r=window.location.pathname.split("/"),o=[];!t&&r[1]&&o.push(r[1]),!n&&r[2]&&o.push(r[2]);var i=o.length>0?"/"+o.join("/"):"",a="".concat(window.location.origin).concat(i,"/").concat(e);window.open(a,"_blank")},Rn=function(){function e(){var e=this;this.exotelSDK=null,this.webPhone=null,this.callListeners=new Set,this.registerListeners=new Set,this.sessionListeners=new Set,this.permissionStatus="unknown",this.handleCallEvent=function(t,n){e.callListeners.forEach(function(e){return e(t,n)})},this.handleRegisterEvent=function(t){e.registerListeners.forEach(function(e){return e(t)})},this.handleSessionEvent=function(t,n){e.sessionListeners.forEach(function(e){return e(t,n)})}}return e.getInstance=function(){return e.instance||(e.instance=new e),e.instance},e.prototype.initialize=function(e,t){return ce(this,arguments,void 0,function(e,t,n){var r;return void 0===n&&(n=!0),le(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,this.checkAudioPermissions()];case 1:return o.sent(),this.exotelSDK=new W(e,t,n),[4,this.exotelSDK.Initialize(this.handleCallEvent,this.handleRegisterEvent,this.handleSessionEvent)];case 2:return r=o.sent(),this.webPhone=r||null,[2,!!this.webPhone];case 3:return o.sent(),[2,!1];case 4:return[2]}})})},e.prototype.checkAudioPermissions=function(){return ce(this,void 0,void 0,function(){var e,t,n=this;return le(this,function(r){switch(r.label){case 0:return r.trys.push([0,6,,7]),[4,navigator.mediaDevices.enumerateDevices()];case 1:if(e=r.sent(),!e.some(function(e){return"audioinput"===e.kind}))return this.permissionStatus="denied",[2,!1];if(!navigator.permissions||!navigator.permissions.query)return[3,5];r.label=2;case 2:return r.trys.push([2,4,,5]),[4,navigator.permissions.query({name:"microphone"})];case 3:return t=r.sent(),this.permissionStatus=t.state,t.onchange=function(){n.permissionStatus=t.state},[2,"granted"===t.state];case 4:return r.sent(),[3,5];case 5:return[2,!0];case 6:return r.sent(),[2,!1];case 7:return[2]}})})},e.prototype.requestMicrophoneAccess=function(){return ce(this,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,navigator.mediaDevices.getUserMedia({audio:!0})];case 1:return e.sent().getTracks().forEach(function(e){return e.stop()}),this.permissionStatus="granted",[2,!0];case 2:return e.sent(),this.permissionStatus="denied",[2,!1];case 3:return[2]}})})},e.prototype.makeCall=function(e){var t=this;return new Promise(function(n,r){t.webPhone?t.webPhone.MakeCall(e,function(e,t){"success"===e?n(t):r(t)}):r(new Error("Web phone not initialized"))})},e.prototype.acceptCall=function(){return ce(this,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:if(!this.webPhone)throw new Error("Web phone not initialized");return"granted"===this.permissionStatus?[3,2]:[4,this.requestMicrophoneAccess()];case 1:if(!e.sent())throw new Error("Microphone access denied");e.label=2;case 2:return this.webPhone.AcceptCall(),[2]}})})},e.prototype.hangupCall=function(){var e;null===(e=this.webPhone)||void 0===e||e.HangupCall()},e.prototype.rejectCall=function(){var e;null===(e=this.webPhone)||void 0===e||e.HangupCall()},e.prototype.toggleHold=function(){var e;null===(e=this.webPhone)||void 0===e||e.ToggleHold()},e.prototype.toggleMute=function(){var e;null===(e=this.webPhone)||void 0===e||e.ToggleMute()},e.prototype.sendDTMF=function(e){var t;null===(t=this.webPhone)||void 0===t||t.SendDTMF(e)},e.prototype.registerDevice=function(){return ce(this,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:return"granted"===this.permissionStatus?[3,2]:[4,this.requestMicrophoneAccess()];case 1:if(!t.sent())throw new Error("Microphone access denied");t.label=2;case 2:return null===(e=this.webPhone)||void 0===e||e.RegisterDevice(),[2]}})})},e.prototype.unregisterDevice=function(){var e;null===(e=this.webPhone)||void 0===e||e.UnRegisterDevice()},e.prototype.getPermissionStatus=function(){return this.permissionStatus},e.prototype.addCallListener=function(e){this.callListeners.add(e)},e.prototype.removeCallListener=function(e){this.callListeners.delete(e)},e.prototype.addRegisterListener=function(e){this.registerListeners.add(e)},e.prototype.removeRegisterListener=function(e){this.registerListeners.delete(e)},e.prototype.addSessionListener=function(e){this.sessionListeners.add(e)},e.prototype.removeSessionListener=function(e){this.sessionListeners.delete(e)},e}(),Kn=function(){return ce(void 0,void 0,void 0,function(){var e,t,n,r,o,i;return le(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,ge.get("/notifications/notification-configs")];case 1:return e=a.sent().data,(null==(t=null==e?void 0:e.config)?void 0:t.enableVoice)?(n=null===(r=t.voiceConfigs)||void 0===r?void 0:r.find(function(e){return!0===e.isEnabled}))?[2,{enabled:!0,hasValidToken:!!((null===(o=n.EXOTEL)||void 0===o?void 0:o.token)&&(null===(i=n.EXOTEL)||void 0===i?void 0:i.tokenExpiresAt)&&new Date(n.EXOTEL.tokenExpiresAt)>new Date)}]:[2,{enabled:!1,hasValidToken:!1}]:[2,{enabled:!1,hasValidToken:!1}];case 2:return a.sent(),[2,{enabled:!1,hasValidToken:!1}];case 3:return[2]}})})},Fn=function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,ge.get("/notifications/notification-configs/voice-config/active-token")];case 1:return[2,e.sent().data];case 2:return e.sent(),[2,null];case 3:return[2]}})})},zn=function(){return ce(void 0,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:return[4,Fn()];case 1:if(!(e=t.sent()))throw new Error("No active voice configuration found");return[2,{Data:e.token}]}})})},Un=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.post("/communication-activities/initiate",e)];case 1:return[2,t.sent().data]}})})},qn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.post("/communication-activities/register-incoming",e)];case 1:return[2,t.sent().data]}})})},$n=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.get("/communication-activities/by-prospect",{params:{prospectId:e}})];case 1:return[2,t.sent().data]}})})},Bn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.get("/communication-activities/".concat(e))];case 1:return[2,t.sent().data]}})})},Wn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.get("/communication-activities/by-call-sid",{params:{callSid:e}})];case 1:return[2,t.sent().data]}})})},Hn=function(e){return ce(void 0,void 0,void 0,function(){var t;return le(this,function(n){switch(n.label){case 0:return[4,ge.get("/communication-activities/count-by-prospect",{params:{prospectId:e}})];case 1:return[2,(null==(t=n.sent().data)?void 0:t.count)||0]}})})},Yn=function(e){return ce(void 0,void 0,void 0,function(){var t;return le(this,function(n){switch(n.label){case 0:return t={callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,prospectStatus:e.prospectStatus,dispositionNotes:e.dispositionNotes,callbackScheduledAt:e.callbackScheduledAt},[4,ge.post("/communication-activities/".concat(e.callId,"/disposition"),t)];case 1:return[2,n.sent().data]}})})},Xn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.post("/communication-activities/cancel",e)];case 1:return[2,t.sent().data]}})})},Jn="__EXOTEL_CONTEXT__",Gn={phase:"idle",callData:null,isOnHold:!1,isMuted:!1,isSpeakerOff:!1,callDirection:null,callStartTime:null,callDuration:0,callerName:null,callerNumber:null,callActivityId:null,exotelCallSid:null,prospectUniqueId:null,wasAccepted:!1},Qn=function(e){if(!e||e.length<4)return"**********";var t="",n=e;e.startsWith("+91")?(t="+91",n=e.substring(3)):e.startsWith("91")&&e.length>10&&(t="91",n=e.substring(2));var r=n.replace(/\D/g,"");return r.length<4?t+"**********":t+r.substring(0,2)+"*".repeat(r.length-4)+r.substring(r.length-2)},Zn=(window[Jn]||(window[Jn]=x(void 0)),window[Jn]),er=function(e){var t=e.children,n=e.accessToken,r=e.agentUserId,o=e.autoConnectVOIP,a=void 0===o||o,s=e.callerName;e.callerNumber;var c=k(!1),l=c[0],u=c[1],d=k(!1),p=d[0],f=d[1],h=k("unknown"),m=h[0],v=h[1],b=k(Gn),y=b[0],g=b[1],w=k(null),_=w[0],N=w[1],E=O(null),x=O(y),D=Rn.getInstance();S(function(){x.current=y},[y]),S(function(){return"connected"===y.phase&&y.callStartTime?E.current=setInterval(function(){g(function(e){return se(se({},e),{callDuration:Math.floor((Date.now()-e.callStartTime)/1e3)})})},1e3):E.current&&(clearInterval(E.current),E.current=null),function(){E.current&&clearInterval(E.current)}},[y.phase,y.callStartTime]),S(function(){var e=function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,navigator.mediaDevices.getUserMedia({audio:!0})];case 1:return e.sent().getTracks().forEach(function(e){return e.stop()}),v("granted"),[3,3];case 2:return e.sent(),v("denied"),[3,3];case 3:return[2]}})})};navigator.permissions&&navigator.permissions.query?navigator.permissions.query({name:"microphone"}).then(function(t){v(t.state),t.onchange=function(){v(t.state)},"prompt"===t.state&&e()}).catch(function(t){e()}):e()},[]),S(function(){if(n&&r&&!l){ce(void 0,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:return[4,D.initialize(n,r,a)];case 1:return e=t.sent(),u(e),[2]}})})}},[n,r,a]),S(function(){if(l){var e=function(e,t){switch(e){case"incoming":if("outbound"===x.current.callDirection)g(function(e){return se(se({},e),{callData:t,isOnHold:!1,isMuted:!1})});else{var n=t.callFromNumber||t.remoteId||null;g(function(e){return se(se({},e),{phase:"incoming",callData:t,callDirection:"inbound",callerName:t.remoteDisplayName||null,callerNumber:n?Qn(n):null,isOnHold:!1,isMuted:!1})}),(t.callId||t.sessionId)&&qn({callSid:t.callId||t.sessionId,fromNumber:t.callFromNumber||t.remoteId||"",toNumber:t.remoteDisplayName||""}).then(function(e){var t,n=null===(t=e.prospect)||void 0===t?void 0:t.mobile;g(function(t){var r,o,i;return se(se({},t),{callActivityId:(null===(r=e.data)||void 0===r?void 0:r.id)||t.callActivityId,callerName:(null===(o=e.prospect)||void 0===o?void 0:o.name)||t.callerName,callerNumber:n?Qn(n):t.callerNumber,prospectUniqueId:(null===(i=e.prospect)||void 0===i?void 0:i.uniqueId)||t.prospectUniqueId})})}).catch(function(e){})}break;case"connected":g(function(e){return se(se({},e),{phase:"connected",callData:t,callStartTime:Date.now(),callDuration:0})});break;case"callEnded":g(function(e){var n,r;if(e.wasAccepted||"connected"===e.phase||e.callDuration>0){var o={callId:e.callActivityId||t.callId||(null===(n=e.callData)||void 0===n?void 0:n.callId)||"",exotelCallId:t.callId||(null===(r=e.callData)||void 0===r?void 0:r.callId)||"",callDirection:e.callDirection||"outbound",callDuration:e.callDuration,callerName:e.callerName,callerNumber:e.callerNumber};N(o)}return se(se({},Gn),{phase:"ended",callData:t})});break;case"holdtoggle":g(function(e){return se(se({},e),{isOnHold:!e.isOnHold,callData:t})});break;case"mutetoggle":g(function(e){return se(se({},e),{isMuted:!e.isMuted,callData:t})})}},t=function(e){f("registered"===e)},n=function(e,t){};return D.addCallListener(e),D.addRegisterListener(t),D.addSessionListener(n),function(){D.removeCallListener(e),D.removeRegisterListener(t),D.removeSessionListener(n)}}},[l]),S(function(){l&&v(D.getPermissionStatus())},[l]);var P=C(function(e,t,n,r){return ce(void 0,void 0,void 0,function(){var o;return le(this,function(i){switch(i.label){case 0:g(function(o){return se(se({},o),{phase:"ready_to_call",callDirection:"outbound",callerName:t||s||null,callerNumber:r||e,callActivityId:n||null,isOnHold:!1,isMuted:!1,callStartTime:null,callDuration:0})}),i.label=1;case 1:return i.trys.push([1,3,,4]),[4,D.makeCall(e)];case 2:return[2,i.sent()];case 3:throw o=i.sent(),g(Gn),o;case 4:return[2]}})})},[s]),I=C(function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return[4,D.acceptCall()];case 1:return e.sent(),g(function(e){return"outbound"===e.callDirection?se(se({},e),{phase:"calling",wasAccepted:!0}):se(se({},e),{wasAccepted:!0})}),[2]}})})},[]),A=C(function(){D.hangupCall()},[]),j=C(function(){g(function(e){return se(se({},e),{isSpeakerOff:!e.isSpeakerOff})})},[]),T=C(function(){N(null),g(Gn)},[]),L=C(function(e){g(function(t){return se(se({},t),{callActivityId:e})})},[]),V=C(function(e){g(function(t){return se(se({},t),{exotelCallSid:e})})},[]),M={isInitialized:l,isConnected:p,callState:y,permissionStatus:m,dispositionData:_,makeCall:P,acceptCall:I,hangupCall:A,rejectCall:function(){return D.rejectCall()},toggleHold:function(){return D.toggleHold()},toggleMute:function(){return D.toggleMute()},toggleSpeaker:j,sendDTMF:function(e){return D.sendDTMF(e)},registerDevice:function(){return D.registerDevice()},unregisterDevice:function(){return D.unregisterDevice()},requestMicrophoneAccess:function(){return D.requestMicrophoneAccess()},clearDisposition:T,setCallActivityId:L,setExotelCallSid:V};return i(Zn.Provider,{value:M,children:t})},tr=function(){var e=D(Zn);if(void 0===e)throw new Error("useExotel must be used within an ExotelProvider");return e},nr=function(){var e=D(Zn);return null!=e?e:null},rr=999999,or=999998,ir="16px",ar=2e3,sr=[{label:"Connected",value:"connected"},{label:"Not Connected",value:"not_connected"}],cr=[{label:"Interested",value:"interested"},{label:"Not Interested",value:"not_interested"},{label:"Not Sure",value:"not_sure"},{label:"Not Eligible",value:"not_eligible"},{label:"Wrong Number",value:"wrong_number"},{label:"Campus Visit",value:"campus_visit"},{label:"Call Back",value:"call_back"},{label:"After JEE Mains",value:"after_jee_mains"},{label:"After IPE",value:"after_ipe"},{label:"After EAPCET",value:"after_eapcet"}],lr=[{label:"Not Answering",value:"not_answering"},{label:"Not Connected",value:"not_connected"},{label:"Fail to Call",value:"fail_to_call"},{label:"Switched Off",value:"switched_off"},{label:"Out of Service",value:"out_of_service"},{label:"Invalid Number",value:"invalid_number"},{label:"Number Busy",value:"number_busy"}],ur=function(e){var t=e.dispositionData,n=e.prospectId,r=e.onClose,a=e.onSave,s=e.existingData,c=T(),l=!!(null==s?void 0:s.dispositionCategory),u=k((null==s?void 0:s.callStatusDisposition)||""),p=u[0],f=u[1],h=k((null==s?void 0:s.dispositionCategory)||""),m=h[0],b=h[1],y=k((null==s?void 0:s.dispositionNotes)||""),E=y[0],x=y[1],S=P(function(e){return a(e)},{onSuccess:function(){c.invalidateQueries("getOneProspect"),c.invalidateQueries("callHistory"),r()}}),O=S.mutate,C=S.isLoading,D=function(e){f(e),b("")},I=function(e){b(e)},A=function(){if(p&&m){var e={prospectId:n,callId:t.callId,channel:"phone",direction:t.callDirection,duration:t.callDuration,callStatusDisposition:p,dispositionCategory:m,remarks:E||"",callerName:t.callerName||"",callerNumber:t.callerNumber||""};O(e)}},j="connected"===p?cr:"not_connected"===p?lr:[];return i(v,{open:!0,onClose:r,title:l?"Edit Disposition":"Call Disposition",maxWidth:"md",content:function(){return o("div",{className:"flex flex-col gap-4 p-4",children:[i(w,{variant:"muted",children:l?"Update the disposition details":"Add details about your call with ".concat(t.callerName||"Unknown")}),o("div",{className:"flex items-center justify-between p-3 bg-gray-100 rounded-lg",children:[i(w,{variant:"small",className:"text-gray-600",children:"Call Duration"}),i(w,{variant:"small",className:"font-semibold",children:(e=t.callDuration,n=Math.floor(e/60),a=e%60,"".concat(n,"m ").concat(a,"s"))})]}),i(_,{name:"callStatusDisposition",label:"Call Status",required:!0,options:sr,direction:"row",value:p,onChange:D}),p&&i(g,{name:"dispositionCategory",label:"Call Disposition",required:!0,fullWidth:!0,placeholder:"Search disposition...",options:j,value:m,onChange:I},p),i(N,{name:"remarks",label:"Remarks",placeholder:"Add any additional notes about this call...",rows:3,fullWidth:!0,value:E,onChange:function(e){return x(e.target.value)},className:"break-all"}),o("div",{className:"flex justify-start gap-2 pt-4 border-t",children:[i(d,{onClick:A,disabled:!p||!m,loading:C,children:l?"Update Disposition":"Save Disposition"}),i(d,{variant:"outline",onClick:r,children:"Cancel"})]})]});var e,n,a}})},dr=function(e){var t=e.className,n=e.prospectId,r=e.prospectName,s=e.prospectNumber,c=e.onSaveDisposition,l=tr(),u=l.callState,p=l.dispositionData,f=l.acceptCall,h=l.hangupCall,m=l.rejectCall,v=l.toggleHold,b=l.toggleMute,y=l.toggleSpeaker,g=l.clearDisposition,_=k(!1),N=_[0],E=_[1],x=k(!1),C=x[0],D=x[1],P=O(null);S(function(){var e="exotel-phone-animations";if(!document.getElementById(e)){var t=document.createElement("style");t.id=e,t.textContent="\n@keyframes pulse-ring {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.15);\n opacity: 0.7;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes pulse-dot {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(249, 115, 22, 0.7);\n }\n 50% {\n box-shadow: 0 0 0 20px rgba(249, 115, 22, 0);\n }\n}\n\n.animate-pulse-ring {\n animation: pulse-ring 1.5s ease-in-out infinite;\n}\n\n.animate-pulse-dot {\n animation: pulse-dot 1.5s ease-in-out infinite;\n}\n",document.head.appendChild(t)}},[]);var I=u.phase;u.callData;var A=u.isOnHold,j=u.isMuted,T=u.isSpeakerOff,L=u.callDirection,V=u.callDuration,M=u.callerName,R=u.callerNumber,K=u.callActivityId,F=u.exotelCallSid,z=u.prospectUniqueId,U=r||M||"Unknown",q=s||R||"No number",$=function(){return ce(void 0,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:if(D(!0),"incoming"===I||"ready_to_call"===I?m():h(),!(e=F||K))return[3,4];t.label=1;case 1:return t.trys.push([1,3,,4]),[4,Xn({callSid:e,reason:"connected"===I?"ended":"declined"})];case 2:return t.sent(),[3,4];case 3:return t.sent(),[3,4];case 4:return P.current=setTimeout(function(){D(!1)},ar),[2]}})})};S(function(){"idle"!==I&&"ended"!==I||(P.current&&(clearTimeout(P.current),P.current=null),D(!1))},[I]);if(S(function(){return function(){P.current&&clearTimeout(P.current)}},[]),p){var B=r||p.callerName||M||"Unknown",W=se(se({},p),{callerName:B,callerNumber:q});return i(ur,{dispositionData:W,prospectId:n,onClose:g,onSave:function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){return c?[2,c(e)]:[2,Yn({callId:e.callId,prospectId:e.prospectId||n||"",callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,dispositionNotes:e.remarks||void 0})]})})},existingData:void 0})}if("idle"===I||"ended"===I)return null;var oe,ae,ue,de="outbound"===L,pe="inbound"===L,fe="connected"===I?"bg-green-500":de?"bg-blue-500":"bg-orange-500",he=function(){return"calling"===I?"Connecting to ".concat(U,"..."):null},me=o(a,{children:[i("div",{className:"fixed inset-0 bg-black/50",style:{zIndex:or},onClick:$}),i("div",{className:"fixed inset-0 flex items-center justify-center p-4 ".concat(t),style:{zIndex:rr},children:o("div",{className:"relative w-full max-w-md p-6 bg-white shadow-2xl",style:{borderRadius:ir,border:"1px solid #e5e7eb"},onClick:function(e){return e.stopPropagation()},children:[i("button",{onClick:$,className:"absolute p-1 transition-colors rounded-full top-4 right-4 hover:bg-gray-100",children:i(H,{className:"w-5 h-5 text-gray-500"})}),i("div",{className:"flex justify-center mb-6",children:o("span",{className:"inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-sm font-medium border ".concat(de?"text-blue-600 border-blue-200 bg-blue-50":"text-green-600 border-green-200 bg-green-50"),children:[i(de?Y:X,{className:"w-4 h-4"}),de?"Outgoing Call":"Incoming Call"]})}),i("div",{className:"flex justify-center mb-4",children:i("div",{className:"w-24 h-24 rounded-full ".concat(fe," flex items-center justify-center ").concat("incoming"===I||"ready_to_call"===I?"animate-pulse-ring animate-pulse-dot":""),children:i(pe&&"incoming"===I?X:J,{className:"w-10 h-10 text-white"})})}),o("div",{className:"mb-4 text-center",children:[i(w,{variant:"h3",className:"text-xl font-semibold text-gray-900",children:U}),z&&o(w,{variant:"small",className:"font-medium text-blue-600",children:["ID: ",z]}),i(w,{variant:"muted",children:q})]}),i("div",{className:"mb-6 text-center",children:i(w,"connected"===I?{variant:"p",className:"text-lg font-medium text-green-500",children:(oe=V,ae=Math.floor(oe/60),ue=oe%60,"".concat(ae.toString().padStart(2,"0"),":").concat(ue.toString().padStart(2,"0")))}:{variant:"muted",children:function(){switch(I){case"ready_to_call":return"Ready to call...";case"calling":return"Calling...";case"incoming":return"Incoming call...";default:return null}}()})}),"connected"===I&&o("div",{className:"flex justify-center gap-6 mb-6",children:[o("div",{className:"text-center",children:[i("button",{onClick:b,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(j?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:i(j?G:Q,{className:"w-5 h-5 text-gray-600"})}),i("p",{className:"mt-1 text-xs text-gray-500",children:j?"Unmute":"Mute"})]}),o("div",{className:"text-center",children:[i("button",{onClick:v,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(A?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:i(A?Z:ee,{className:"w-5 h-5 text-gray-600"})}),i("p",{className:"mt-1 text-xs text-gray-500",children:A?"Resume":"Hold"})]}),o("div",{className:"text-center",children:[i("button",{onClick:y,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(T?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:i(T?te:ne,{className:"w-5 h-5 text-gray-600"})}),i("p",{className:"mt-1 text-xs text-gray-500",children:T?"Speaker On":"Speaker Off"})]})]}),o("div",{className:"flex justify-center gap-4",children:[("ready_to_call"===I||"incoming"===I)&&o(a,{children:[o(d,{variant:"destructive",onClick:$,disabled:C,className:"gap-2 px-6",children:[i(re,{className:"w-4 h-4"}),C?"Declining...":"Decline"]}),o(d,{variant:"default",onClick:function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:E(!0),e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,f()];case 2:return e.sent(),[3,5];case 3:return e.sent(),[3,5];case 4:return E(!1),[7];case 5:return[2]}})})},disabled:N||C,style:{backgroundColor:"#22c55e"},className:"gap-2 px-6 hover:bg-green-600",children:[i(J,{className:"w-4 h-4"}),"Accept"]})]}),"calling"===I&&o(d,{variant:"destructive",onClick:$,disabled:C,className:"gap-2 px-6",children:[i(re,{className:"w-4 h-4"}),C?"Ending...":"End Call"]}),"connected"===I&&o(d,{variant:"destructive",onClick:$,disabled:C,className:"gap-2 px-8",children:[i(re,{className:"w-4 h-4"}),C?"Ending...":"End Call"]})]}),he()&&i(w,{variant:"small",className:"mt-4 text-center text-gray-500",children:he()})]})})]});return ie(me,document.body)},pr=function(){function e(){this.algorithm="aes-256-cbc",this.secretKey=null,this.initialized=!1}return e.prototype.ensureInitialized=function(){if(!this.initialized)try{var e="431fef99-47dc-4d2a-9175-2e8f19b20225";if(e){var t=(new TextEncoder).encode(e),n=(new TextEncoder).encode("salt");this.secretKey=ae(t,n,16384,8,1,32)}this.initialized=!0}catch(e){this.initialized=!0}},e.getInstance=function(){return e.instance||(e.instance=new e),e.instance},e.prototype.decryptData=function(e){if(this.ensureInitialized(),!e||!this.secretKey)return"";try{var t=e.split(":"),n=t[0],r=t[1];if(!n||!r)return"";var o=require("crypto"),i=Buffer.from(n,"hex"),a=o.createDecipheriv(this.algorithm,Buffer.from(this.secretKey),i),s=a.update(r,"hex","utf8");return s+=a.final("utf8")}catch(e){return""}},e.prototype.maskMobile=function(e){if(!e||e.length<4)return"**********";var t="",n=e;e.startsWith("+91")?(t="+91",n=e.substring(3)):e.startsWith("91")&&e.length>10&&(t="91",n=e.substring(2));var r=n.replace(/\D/g,"");return r.length<4?t+"**********":t+r.substring(0,2)+"*".repeat(r.length-4)+r.substring(r.length-2)},e}(),fr=pr.getInstance(),hr=function(e){var t=e.phoneNumber,n=e.encryptedPhoneNumber,r=e.callerName,a=e.prospectId,s=e.className,c=e.disabled,l=nr(),u=k(!1),p=u[0],f=u[1],h=k(null),m=h[0],v=h[1];if(!l)return null;var b=l.makeCall,y=l.isConnected,g=l.callState,w=l.permissionStatus,_=l.requestMicrophoneAccess,N=l.setCallActivityId,E=l.setExotelCallSid,x="idle"!==g.phase&&"ended"!==g.phase,S=t||n;return o("div",{className:s,children:[o(d,{variant:"outline",size:"sm",onClick:function(){return ce(void 0,void 0,void 0,function(){var e,o,i,s,c,l,u,d,p,h,m,w,x,k,S;return le(this,function(O){switch(O.label){case 0:if(!y||"idle"!==g.phase&&"ended"!==g.phase)return[2];if(v(null),e=t,n&&!e)try{if(!(e=fr.decryptData(n)))return v("Failed to decrypt phone number"),[2]}catch(e){return v("Failed to decrypt phone number"),[2]}return e?(o=fr.maskMobile(e),[4,Rn.getInstance().checkAudioPermissions()]):(v("No phone number available"),[2]);case 1:return O.sent()?[3,3]:[4,_()];case 2:if(!O.sent())return v("Microphone access is required to make calls"),[2];O.label=3;case 3:return O.trys.push([3,9,10,11]),f(!0),[4,b(e,r,void 0,o)];case 4:if(i=O.sent(),(s=null===(w=null==i?void 0:i.Data)||void 0===w?void 0:w.CallSid)&&E(s),!a||!s)return[3,8];O.label=5;case 5:return O.trys.push([5,7,,8]),[4,Un({prospectId:a,toNumber:e,callSid:s})];case 6:return c=O.sent(),(l=null===(x=c.data)||void 0===x?void 0:x.id)&&N(l),[3,8];case 7:return O.sent(),[3,8];case 8:return[3,11];case 9:if(u=O.sent(),d="Failed to make call",(null==u?void 0:u.Code)||"Failed"===(null==u?void 0:u.Status)){if(p=u.Code,h=null,u.Error&&"string"==typeof u.Error)try{h=JSON.parse(u.Error)}catch(e){}m=null===(S=null===(k=null==h?void 0:h.response)||void 0===k?void 0:k.error_data)||void 0===S?void 0:S.description,d=404===p?m||"User device is currently busy or unavailable":p>=400&&p<500?m||"Unable to complete call. Please try again.":p>=500?m||"Service temporarily unavailable. Please try again later.":m||"Failed to make call"}else(null==u?void 0:u.message)&&(d=u.message);return v(d),[3,11];case 10:return f(!1),[7];case 11:return[2]}})})},disabled:c||!S||!y||x||p,title:y?x?"Call in progress":S?"denied"===w?"Microphone access denied":"Call ".concat(r||"prospect"):"No phone number":"VoIP not connected",className:"gap-1.5",children:[i("denied"===w?G:J,{className:"w-4 h-4"}),p?"Calling...":"Call"]}),m&&i("p",{className:"text-red-500 text-xs mt-1",children:m})]})},mr=function(e){var t=e.onPermissionGranted,n=e.onPermissionDenied,r=tr(),a=r.permissionStatus,s=r.requestMicrophoneAccess,c=k(!1),l=c[0],u=c[1],p=k(null),f=p[0],h=p[1];return o("div","granted"===a?{className:"flex items-center gap-2 text-green-600",children:[i(Q,{className:"w-4 h-4"}),i("span",{className:"text-sm",children:"Microphone access granted"})]}:"denied"===a?{className:"p-4 bg-red-50 rounded-lg border border-red-200",children:[o("div",{className:"flex items-center gap-2 text-red-600 mb-2",children:[i(G,{className:"w-5 h-5"}),i("span",{className:"font-medium",children:"Microphone Access Denied"})]}),i("p",{className:"text-sm text-red-600 mb-3",children:"To use the calling feature, you need to enable microphone access in your browser settings."}),o("div",{className:"text-xs text-gray-600",children:[i("p",{className:"font-medium mb-1",children:"How to enable:"}),o("ol",{className:"list-decimal list-inside space-y-1",children:[i("li",{children:"Click the lock/info icon in your browser's address bar"}),i("li",{children:'Find "Microphone" in the permissions list'}),i("li",{children:'Change the setting to "Allow"'}),i("li",{children:"Refresh the page"})]})]})]}:{className:"p-4 bg-blue-50 rounded-lg border border-blue-200",children:[o("div",{className:"flex items-center gap-2 text-blue-600 mb-2",children:[i(oe,{className:"w-5 h-5"}),i("span",{className:"font-medium",children:"Microphone Permission Required"})]}),i("p",{className:"text-sm text-gray-600 mb-3",children:"To make and receive calls, we need access to your microphone. Click the button below to grant permission."}),o(d,{variant:"default",size:"sm",onClick:function(){return ce(void 0,void 0,void 0,function(){var e;return le(this,function(r){switch(r.label){case 0:u(!0),h(null),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,s()];case 2:return r.sent()?null==t||t():(h("Microphone access was denied"),null==n||n()),[3,5];case 3:return e=r.sent(),h(e.message||"Failed to request microphone access"),null==n||n(),[3,5];case 4:return u(!1),[7];case 5:return[2]}})})},loading:l,className:"gap-1.5",children:[i(Q,{className:"w-4 h-4"}),"Allow Microphone Access"]}),f&&i("p",{className:"text-red-500 text-xs mt-2",children:f})]})},vr=function(e){var t=e.children,n=e.enabled,r=void 0===n||n,s=e.prospectId,c=e.prospectName,l=e.prospectNumber,u=k(null),d=u[0],p=u[1],f=k(!0);f[0];var h=f[1],m=k(null),v=m[0],b=m[1];return S(function(){if(r){ce(void 0,void 0,void 0,function(){var e,t;return le(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,3,4]),h(!0),[4,Fn()];case 1:return(null==(e=n.sent())?void 0:e.token)?p(e.token):b("Voice calling not configured"),[3,4];case 2:return t=n.sent(),b(t.message||"Failed to initialize calling"),[3,4];case 3:return h(!1),[7];case 4:return[2]}})})}else h(!1)},[r]),r&&!v&&d?o(er,{accessToken:d,agentUserId:"0047",autoConnectVOIP:!0,children:[t,i(dr,{prospectId:s,prospectName:c,prospectNumber:l})]}):i(a,{children:t})},br=function(e){var t=e.children,n=e.workspace,r=e.agentUserId,s=e.prospectId,c=e.prospectName,l=e.prospectNumber,u=e.onSaveDisposition,d=k(null),p=d[0],f=d[1],h=k(!0),m=h[0],v=h[1],b=k(null),y=b[0],g=b[1],w=Ee(n),_=!!r,N=C(function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){return u?[2,u(e)]:[2,Yn({callId:e.callId,prospectId:e.prospectId,callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,dispositionReason:e.dispositionReason||void 0,dispositionNotes:e.remarks||void 0})]})})},[u]);return S(function(){if(w&&_){ce(void 0,void 0,void 0,function(){var e,t;return le(this,function(n){switch(n.label){case 0:return n.trys.push([0,3,4,5]),v(!0),g(null),[4,Kn()];case 1:return n.sent().enabled?[4,Fn()]:(g("Voice calling not enabled for this tenant"),v(!1),[2]);case 2:return(null==(e=n.sent())?void 0:e.token)?f(e.token):g("Voice calling token not available"),[3,5];case 3:return t=n.sent(),g(t.message||"Failed to initialize calling"),[3,5];case 4:return v(!1),[7];case 5:return[2]}})})}else v(!1)},[w,_]),w&&_?m||y||!p?i(a,{children:t}):o(er,{accessToken:p,agentUserId:r,autoConnectVOIP:!0,children:[t,i(dr,{prospectId:s,prospectName:c,prospectNumber:l,onSaveDisposition:N})]}):i(a,{children:t})};export{de as ApplicationStore,fn as BatchSelector,hr as CallButton,ur as CallDispositionForm,ke as ConfirmDialogProvider,hn as CourseSelector,dn as DepartmentMongoMultiSelector,mn as DepartmentSelector,pn as DepartmentSqlMultiSelector,vn as EmployeesSelector,je as ErrorBoundary,gn as ExamTypeSelector,bn as ExamsRegulationSelector,dr as ExotelPhone,er as ExotelProvider,vr as ExotelWrapper,Nn as FeeTypeSelector,En as HostelBlockSelector,xn as HostelFloorSelector,kn as HostelRoomSelector,mr as MicrophonePermission,Sn as MonthYearSelector,On as PrintFormatSelector,Cn as ProgramSelector,cn as Providers,Dn as RegulationSelector,Pn as ResearchExpertDesignationSelector,In as ResearchExpertSelector,An as ResearchStageSelector,jn as SemesterSelector,sn as SnackbarProvider,Tn as StudentSelector,Ln as StudentServicesSelector,Ne as VOIP_ENABLED_WORKSPACES,br as VoIPProvider,Vn as YearRangeSelector,ge as axios,Xn as cancelCall,Kn as checkVoIPEnabled,zn as createExotelAppToken,we as createRsbuildSharedConfig,$n as fetchCallHistory,Fn as getActiveVoiceToken,Wn as getCallActivityByCallSid,Bn as getCallActivityById,Hn as getCallCountByProspect,ue as initialApplicationState,Un as initiateCallActivity,ve as institutionCode,he as isDevelopment,Ee as isVoIPEnabledForWorkspace,_e as nonWorkspaceAxios,Mn as openInNewTab,qn as registerIncomingCall,Yn as saveCallDisposition,me as tenantCode,un as useConfirm,tr as useExotel,nr as useExotelSafe,be as workspace,ye as workspaceApiMapping};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi8uLi9zcmMvY29udGV4dC9hcHBsaWNhdGlvbi1zdG9yZS50cyIsIi4uLy4uL3NyYy91dGlscy9jbGllbnQtYXV0aC10b2tlbi50cyIsIi4uLy4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi8uLi9zcmMvY29uZmlnL2F4aW9zLnRzIiwiLi4vLi4vc3JjL2NvbmZpZy9jcmVhdGVSc2J1aWxkU2hhcmVkQ29uZmlnLnRzIiwiLi4vLi4vc3JjL2NvbmZpZy9ub25Xb3Jrc3BhY2VBeGlvcy50cyIsIi4uLy4uL3NyYy9jb25maWcvdm9pcC5jb25maWcudHMiLCIuLi8uLi9zcmMvY29udGV4dC9Db25maXJtRGlhbG9nUHJvdmlkZXIudHN4IiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWVycm9yLWJvdW5kYXJ5L2Rpc3QvcmVhY3QtZXJyb3ItYm91bmRhcnkuZXNtLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGhvb2tmb3JtL3Jlc29sdmVycy95dXAvZGlzdC95dXAubWpzIiwiLi4vLi4vc3JjL2NvbnRleHQvRXJyb3JCb3VuZGFyeS9Mb2dpbi50c3giLCIuLi8uLi9zcmMvY29udGV4dC9FcnJvckJvdW5kYXJ5L0Vycm9yQm91bmRhcnkudHN4IiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlZHV4L2Rpc3QvcmVkdXgubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQvbm9kZV9tb2R1bGVzL2ltbWVyL2Rpc3QvaW1tZXIubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2Rpc3QvcmVkdXgtdGh1bmsubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQvZGlzdC9yZWR1eC10b29sa2l0Lm1vZGVybi5tanMiLCIuLi8uLi9zcmMvY29udGV4dC9TbmFja2JhclByb3ZpZGVyLnRzeCIsIi4uLy4uL3NyYy9jb250ZXh0L1Byb3ZpZGVycy50c3giLCIuLi8uLi9zcmMvaG9va3MvdXNlQ29uZmlybS50cyIsIi4uLy4uL3NyYy9tdWx0aS1zZWxlY3RvcnMvRGVwYXJ0bWVudE1vbmdvTXVsdGlTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvbXVsdGktc2VsZWN0b3JzL0RlcGFydG1lbnRTcWxNdWx0aVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvQmF0Y2hTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0NvdXJzZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRGVwYXJ0bWVudFNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRW1wbG95ZWVzU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9FeGFtUmVndWxhdGlvblNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRXhhbVR5cGVTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL3V0aWxzLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRmVlVHlwZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvSG9zdGVsQmxvY2tTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0hvc3RlbEZsb29yU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Ib3N0ZWxSb29tU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Nb250aFllYXJTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1ByaW50Rm9ybWF0U2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Qcm9ncmFtU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZWd1bGF0aW9uU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZXNlYXJjaEV4cGVydERlc2lnbmF0aW9uU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZXNlYXJjaEV4cGVydFNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvUmVzZWFyY2hTdGFnZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvU2VtZXN0ZXJTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1N0dWRlbnRTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1N0dWRlbnRTZXJ2aWNlc1NlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvWWVhclJhbmdlU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3V0aWxzL29wZW5Jbk5ld1RhYi50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9leG90ZWwvRXhvdGVsU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9leG90ZWwvYXBpLnRzIiwiLi4vLi4vc3JjL3Byb3ZpZGVycy9FeG90ZWxQcm92aWRlci50c3giLCIuLi8uLi9zcmMvY29uc3RhbnRzL2V4b3RlbC5jb25zdGFudHMudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9FeG90ZWwvQ2FsbERpc3Bvc2l0aW9uRm9ybS50c3giLCIuLi8uLi9zcmMvdXRpbHMvZXhvdGVsL2Zvcm1hdHRlcnMudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9FeG90ZWwvRXhvdGVsUGhvbmUudHN4IiwiLi4vLi4vc3JjL3NlcnZpY2VzL2NyeXB0by9DcnlwdG9TZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvRXhvdGVsL0NhbGxCdXR0b24udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvRXhvdGVsL01pY3JvcGhvbmVQZXJtaXNzaW9uLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0V4b3RlbC9FeG90ZWxXcmFwcGVyLnRzeCIsIi4uLy4uL3NyYy9wcm92aWRlcnMvVm9JUFByb3ZpZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XHJcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XHJcbiAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICB2YXIgYXIgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb3duS2V5cyhvKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xyXG4gICAgICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhc3luYykge1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcblxyXG59XHJcblxyXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcclxuICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xyXG4gICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcclxuICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdmFyIHIsIHMgPSAwO1xyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoci5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHMgfD0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgZmFpbChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dCgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcclxuICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIF9fZXh0ZW5kczogX19leHRlbmRzLFxyXG4gICAgX19hc3NpZ246IF9fYXNzaWduLFxyXG4gICAgX19yZXN0OiBfX3Jlc3QsXHJcbiAgICBfX2RlY29yYXRlOiBfX2RlY29yYXRlLFxyXG4gICAgX19wYXJhbTogX19wYXJhbSxcclxuICAgIF9fZXNEZWNvcmF0ZTogX19lc0RlY29yYXRlLFxyXG4gICAgX19ydW5Jbml0aWFsaXplcnM6IF9fcnVuSW5pdGlhbGl6ZXJzLFxyXG4gICAgX19wcm9wS2V5OiBfX3Byb3BLZXksXHJcbiAgICBfX3NldEZ1bmN0aW9uTmFtZTogX19zZXRGdW5jdGlvbk5hbWUsXHJcbiAgICBfX21ldGFkYXRhOiBfX21ldGFkYXRhLFxyXG4gICAgX19hd2FpdGVyOiBfX2F3YWl0ZXIsXHJcbiAgICBfX2dlbmVyYXRvcjogX19nZW5lcmF0b3IsXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmc6IF9fY3JlYXRlQmluZGluZyxcclxuICAgIF9fZXhwb3J0U3RhcjogX19leHBvcnRTdGFyLFxyXG4gICAgX192YWx1ZXM6IF9fdmFsdWVzLFxyXG4gICAgX19yZWFkOiBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZDogX19zcHJlYWQsXHJcbiAgICBfX3NwcmVhZEFycmF5czogX19zcHJlYWRBcnJheXMsXHJcbiAgICBfX3NwcmVhZEFycmF5OiBfX3NwcmVhZEFycmF5LFxyXG4gICAgX19hd2FpdDogX19hd2FpdCxcclxuICAgIF9fYXN5bmNHZW5lcmF0b3I6IF9fYXN5bmNHZW5lcmF0b3IsXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yOiBfX2FzeW5jRGVsZWdhdG9yLFxyXG4gICAgX19hc3luY1ZhbHVlczogX19hc3luY1ZhbHVlcyxcclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0OiBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcjogX19pbXBvcnRTdGFyLFxyXG4gICAgX19pbXBvcnREZWZhdWx0OiBfX2ltcG9ydERlZmF1bHQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldDogX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbjogX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG4gICAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2U6IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxyXG4gICAgX19kaXNwb3NlUmVzb3VyY2VzOiBfX2Rpc3Bvc2VSZXNvdXJjZXMsXHJcbiAgICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbjogX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXHJcbn07XHJcbiIsImltcG9ydCB7IFN0b3JlIH0gZnJvbSAncHVsbHN0YXRlJztcbmV4cG9ydCB2YXIgaW5pdGlhbEFwcGxpY2F0aW9uU3RhdGUgPSB7XG4gICAgaXNMb2dpbkRpYWxvZ09wZW46IGZhbHNlLFxuICAgIHNuYWNrYmFyOiB7XG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdzdWNjZXNzJyxcbiAgICB9LFxuICAgIGNvbmZpcm1EaWFsb2c6IHtcbiAgICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uQ2FuY2VsOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIHR5cGU6ICdjb25maXJtJyxcbiAgICB9LFxuICAgIHVzZXI6IHVuZGVmaW5lZCxcbiAgICBpbnN0aXR1dGlvbkluZm86IHVuZGVmaW5lZCxcbiAgICBhc3NldDogdW5kZWZpbmVkLFxufTtcbmV4cG9ydCB2YXIgQXBwbGljYXRpb25TdG9yZSA9IG5ldyBTdG9yZShpbml0aWFsQXBwbGljYXRpb25TdGF0ZSk7XG4iLCJpbXBvcnQgQ3J5cHRvSlMgZnJvbSAnY3J5cHRvLWpzJztcbmZ1bmN0aW9uIHRvQmFzZTY0VXJsKGJhc2U2NCkge1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPS9nLCAnJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDbGllbnRUb2tlbihjbGllbnRJZCwgc2VjcmV0KSB7XG4gICAgdmFyIHBheWxvYWQgPSB7IGNsaWVudElkOiBjbGllbnRJZCwgaWF0OiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSB9O1xuICAgIHZhciBwYXlsb2FkQmFzZTY0dXJsID0gdG9CYXNlNjRVcmwoYnRvYShKU09OLnN0cmluZ2lmeShwYXlsb2FkKSkpO1xuICAgIHZhciBzaWduYXR1cmVXb3JkQXJyYXkgPSBDcnlwdG9KUy5IbWFjU0hBMjU2KHBheWxvYWRCYXNlNjR1cmwsIHNlY3JldCk7XG4gICAgdmFyIHNpZ25hdHVyZUJhc2U2NHVybCA9IHRvQmFzZTY0VXJsKENyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KHNpZ25hdHVyZVdvcmRBcnJheSkpO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChwYXlsb2FkQmFzZTY0dXJsLCBcIi5cIikuY29uY2F0KHNpZ25hdHVyZUJhc2U2NHVybCk7XG59XG4iLCJleHBvcnQgdmFyIGlzRGV2ZWxvcG1lbnQgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5jbHVkZXMoJ2xvY2FsaG9zdCcpO1xuZXhwb3J0IHZhciB0ZW5hbnRDb2RlID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNwbGl0KCcuJylbMF0uc3BsaXQoJy0tJylbMF07XG4vLyBpZiB1cmwgc2VhcmNoZWQgaXMgYXVwdWxzZS5jYW1weC5pbiB0aGVuIHJlZGlyZWN0IHRvIGF1cHVsc2UuY2FtcHguaW4vYXVwdWxzZVxuZXhwb3J0IHZhciBpbnN0aXR1dGlvbkNvZGUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoJy8nKVsxXTtcbmV4cG9ydCB2YXIgd29ya3NwYWNlID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCcvJylbMl07XG4vLyBXb3Jrc3BhY2UgdG8gQVBJIGVuZHBvaW50IHByZWZpeCBtYXBwaW5nXG5leHBvcnQgdmFyIHdvcmtzcGFjZUFwaU1hcHBpbmcgPSB7XG4gICAgJ3N0dWRlbnQtd29ya3NwYWNlJzogJy9zdHVkZW50LWFwaScsXG4gICAgJ2ZhY3VsdHktd29ya3NwYWNlJzogJy9mYWN1bHR5LWFwaScsXG4gICAgJ2RlcGFydG1lbnQtd29ya3NwYWNlJzogJy9kZXBhcnRtZW50LWFwaScsXG4gICAgJ2FjYWRlbWljLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvYWNhZGVtaWMtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnZmVlZGJhY2stY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy9mZWVkYmFjay1jb29yZGluYXRvci1hcGknLFxuICAgICdjb3Vyc2UtY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy9jb3Vyc2UtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnY2xhc3Nyb29tLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvY2xhc3Nyb29tLWNvb3JkaW5hdG9yLWFwaScsXG4gICAgJ2NvZS13b3Jrc3BhY2UnOiAnL2NvZS1hcGknLFxuICAgICdhY2FkZW1pYy1hZG1pbi13b3Jrc3BhY2UnOiAnL2FjYWRlbWljLWFkbWluLWFwaScsXG4gICAgJ2hvc3RlbC1hZG1pbi13b3Jrc3BhY2UnOiAnL2hvc3RlbC1hZG1pbi1hcGknLFxuICAgICd0cmFuc3BvcnQtY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy90cmFuc3BvcnQtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnZW1wbG95ZWUtd29ya3NwYWNlJzogJy9lbXBsb3llZS1hcGknLFxuICAgICdsaWJyYXJpYW4td29ya3NwYWNlJzogJy9saWJyYXJpYW4tYXBpJyxcbiAgICAnZmVlLXRlcm1pbmFsJzogJy9mZWUtdGVybWluYWwtYXBpJyxcbiAgICAnYWNjb3VudHMtb2ZmaWNlci13b3Jrc3BhY2UnOiAnYWNjb3VudHMtb2ZmaWNlci1hcGknLFxuICAgICdmaW5hbmNlLW9mZmljZXItd29ya3NwYWNlJzogJy9maW5hbmNlLW9mZmljZXItYXBpJyxcbiAgICAnb3V0cmVhY2gtYWdlbnQtd29ya3NwYWNlJzogJ291dHJlYWNoLWFnZW50LWFwaScsXG4gICAgJ3Byb3NwZWN0LXdvcmtzcGFjZSc6ICdwcm9zcGVjdC1hcGknLFxuICAgICdleHRlcm5hbC1leHBlcnQtd29ya3NwYWNlJzogJ2V4dGVybmFsLWV4cGVydC1hcGknLFxuICAgICdyZXNlYXJjaC1jb29yZGluYXRvci13b3Jrc3BhY2UnOiAncmVzZWFyY2gtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAndGVsZS1jb3Vuc2VsbG9yLXdvcmtzcGFjZSc6ICd0ZWxlLWNvdW5zZWxsb3ItYXBpJyxcbiAgICAndGVhbS1vd25lci13b3Jrc3BhY2UnOiAnL3RlYW0tb3duZXItYXBpJyxcbiAgICAnYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLXdvcmtzcGFjZSc6ICcvYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLWFwaScsXG4gICAgJ2FkbWlzc2lvbnMtb2ZmaWNlci13b3Jrc3BhY2UnOiAnL2FkbWlzc2lvbnMtb2ZmaWNlci1hcGknLFxuICAgICdhZG1pc3Npb25zLWRpcmVjdG9yLXdvcmtzcGFjZSc6ICcvYWRtaXNzaW9ucy1kaXJlY3Rvci1hcGknLFxufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L2FwcGxpY2F0aW9uLXN0b3JlJztcbmltcG9ydCB7IGdlbmVyYXRlQ2xpZW50VG9rZW4gfSBmcm9tICcuLi91dGlscy9jbGllbnQtYXV0aC10b2tlbic7XG5pbXBvcnQgeyBpbnN0aXR1dGlvbkNvZGUsIGlzRGV2ZWxvcG1lbnQsIHRlbmFudENvZGUsIHdvcmtzcGFjZSwgd29ya3NwYWNlQXBpTWFwcGluZywgfSBmcm9tICcuLi91dGlscy9jb25zdGFudHMnO1xuLy8gR2V0IGJhc2UgVVJMIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG52YXIgZ2V0QmFzZVVybCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBGb3IgQ3JlYXRlIFJlYWN0IEFwcFxuICAgIHJldHVybiBwcm9jZXNzLmVudi5SRUFDVF9BUFBfQVBJX0hPU1QgfHwgJy9hcGknO1xufTtcbi8vIEZvcm1hdCBxdWVyeSBwYXJhbWV0ZXJzXG52YXIgZm9ybWF0UGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocGFyYW1zICE9PSBudWxsICYmIHBhcmFtcyAhPT0gdm9pZCAwID8gcGFyYW1zIDoge30pLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUgPT09ICdfX2VtcHR5X18nID8gJycgOiB2YWx1ZSxcbiAgICAgICAgXTtcbiAgICB9KSk7XG59O1xuLy8gQ3JlYXRlIGF4aW9zIGluc3RhbmNlXG5leHBvcnQgdmFyIGF4aW9zID0gQXhpb3MuY3JlYXRlKHtcbiAgICBiYXNlVVJMOiBnZXRCYXNlVXJsKCksXG4gICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ3gtdGVuYW50LWlkJzogdGVuYW50Q29kZSxcbiAgICAgICAgJ3gtaW5zdGl0dXRpb24tY29kZSc6IGluc3RpdHV0aW9uQ29kZSxcbiAgICB9LFxufSk7XG4vLyBSZXF1ZXN0IGludGVyY2VwdG9yXG5heGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIC8vIEZvcm1hdCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgdmFyIHBhcmFtcyA9IGZvcm1hdFBhcmFtcyhjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcucGFyYW1zKTtcbiAgICAvLyBIYW5kbGUgd29ya3NwYWNlIHJvdXRpbmcgKGRlZmF1bHQ6IHRydWUpXG4gICAgaWYgKGNvbmZpZy53b3Jrc3BhY2UgIT09IGZhbHNlICYmXG4gICAgICAgIHdvcmtzcGFjZSAmJlxuICAgICAgICB3b3Jrc3BhY2VBcGlNYXBwaW5nW3dvcmtzcGFjZV0gJiZcbiAgICAgICAgd29ya3NwYWNlICE9PSAnY29tbW9uLXdvcmtzcGFjZScpIHtcbiAgICAgICAgdmFyIHdvcmtzcGFjZVByZWZpeCA9IHdvcmtzcGFjZUFwaU1hcHBpbmdbd29ya3NwYWNlXTtcbiAgICAgICAgY29uZmlnLnVybCA9IFwiXCIuY29uY2F0KHdvcmtzcGFjZVByZWZpeCkuY29uY2F0KGNvbmZpZy51cmwpO1xuICAgIH1cbiAgICAvLyBBZGQgc2Vzc2lvbiB0b2tlbnMgZnJvbSBjb29raWVzIGlmIGluIGRldmVsb3BtZW50XG4gICAgdmFyIHNlc3Npb25LZXkgPSBDb29raWVzLmdldCgnY2FtcHhfc2Vzc2lvbl9rZXknKTtcbiAgICB2YXIgb3BlblBheW1lbnRzS2V5ID0gQ29va2llcy5nZXQoJ2NhbXB4X29wZW5fcGF5bWVudHNfa2V5Jyk7XG4gICAgdmFyIHN0dWRlbnRTZXNzaW9uS2V5ID0gQ29va2llcy5nZXQoJ2NhbXB4X3N0dWRlbnRfa2V5Jyk7XG4gICAgaWYgKGlzRGV2ZWxvcG1lbnQgJiYgc2Vzc2lvbktleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X3Nlc3Npb25fa2V5Jywgc2Vzc2lvbktleSk7XG4gICAgfVxuICAgIGlmIChpc0RldmVsb3BtZW50ICYmIHN0dWRlbnRTZXNzaW9uS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfc3R1ZGVudF9rZXknLCBzdHVkZW50U2Vzc2lvbktleSk7XG4gICAgfVxuICAgIGlmIChvcGVuUGF5bWVudHNLZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9vcGVuX3BheW1lbnRzX2tleScsIG9wZW5QYXltZW50c0tleSk7XG4gICAgfVxuICAgIC8vIEluamVjdCBjbGllbnQgYXV0aGVudGljYXRpb24gdG9rZW5cbiAgICB2YXIgY2FtcHhDbGllbnRJZCA9IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9DTElFTlRfSUQ7XG4gICAgdmFyIGNhbXB4Q2xpZW50U2VjcmV0ID0gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0NBTVBYX0NMSUVOVF9TRUNSRVQ7XG4gICAgaWYgKGNhbXB4Q2xpZW50SWQgJiYgY2FtcHhDbGllbnRTZWNyZXQpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCd4LWNhbXB4LWNsaWVudCcsIGdlbmVyYXRlQ2xpZW50VG9rZW4oY2FtcHhDbGllbnRJZCwgY2FtcHhDbGllbnRTZWNyZXQpKTtcbiAgICB9XG4gICAgLy8gU2tpcCBzZW5kaW5nIFgtaW5zdGl0dXRpb24tY29kZSBpZiB0aGUgZmxhZyBpcyBzZXRcbiAgICBpZiAoY29uZmlnLnNraXBJbnN0aXR1dGlvbkNvZGUpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuZGVsZXRlKCd4LWluc3RpdHV0aW9uLWNvZGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb25maWcpLCB7IHBhcmFtczogcGFyYW1zIH0pO1xufSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbn0pO1xuLy8gUmVzcG9uc2UgaW50ZXJjZXB0b3JcbmF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vIENoZWNrIGlmIHRoZSByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2EgPSByZXNwb25zZS5kYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgc3VjY2Vzc2Z1bCByZXNwb25zZXNcbiAgICBpZiAoIXNob3VsZEhpZGVTbmFja2JhciAmJlxuICAgICAgICByZXNwb25zZS5jb25maWcubWV0aG9kICYmXG4gICAgICAgIFsncHV0JywgJ3Bvc3QnLCAnZGVsZXRlJywgJ3BhdGNoJ10uaW5jbHVkZXMocmVzcG9uc2UuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWzIwMCwgMjAxLCAyMDJdLmluY2x1ZGVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gcmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdPcGVyYXRpb24gc3VjY2Vzc2Z1bCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ3N1Y2Nlc3MnO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufSwgZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAvLyBDaGVjayBpZiB0aGUgZXJyb3IgcmVzcG9uc2UgaGFzIGhpZGVTbmFja2JhciBwcm9wZXJ0eVxuICAgIHZhciBzaG91bGRIaWRlU25hY2tiYXIgPSAoKF9iID0gKF9hID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGF0YSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhpZGVTbmFja2JhcikgPT09IHRydWU7XG4gICAgLy8gSGFuZGxlIGVycm9yIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmIFs0MDAsIDQyMiwgNDEzXS5pbmNsdWRlcygoX2MgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBlcnJvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IGVyci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ0JhZCBSZXF1ZXN0JztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnZXJyb3InO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiZcbiAgICAgICAgKChfZCA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFsncHV0JywgJ3Bvc3QnLCAnZGVsZXRlJywgJ3BhdGNoJ10uaW5jbHVkZXMoZXJyLnJlc3BvbnNlLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFs0MDRdLmluY2x1ZGVzKGVyci5yZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBub3QgZm91bmQgZXJyb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSBlcnIucmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdOb3QgRm91bmQnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdlcnJvcic7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYXhpb3M7XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJzYnVpbGRTaGFyZWRDb25maWcoZGVwZW5kZW5jaWVzLCBhbHdheXNFYWdlciwgc2hhcmVkRGVwZW5kZW5jaWVzTGlzdCkge1xuICAgIHJldHVybiBzaGFyZWREZXBlbmRlbmNpZXNMaXN0LnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwa2cpIHtcbiAgICAgICAgdmFyIHZlcnNpb24gPSBkZXBlbmRlbmNpZXNbcGtnXTtcbiAgICAgICAgaWYgKHZlcnNpb24pIHtcbiAgICAgICAgICAgIGFjY1twa2ddID0gX19hc3NpZ24oeyBzaW5nbGV0b246IHRydWUsIHJlcXVpcmVkVmVyc2lvbjogdmVyc2lvbiwgdmVyc2lvbjogdmVyc2lvbi5yZXBsYWNlKC9eW1xcXn5dLywgJycpIH0sIChhbHdheXNFYWdlci5pbmNsdWRlcyhwa2cpID8geyBlYWdlcjogdHJ1ZSB9IDoge30pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L2FwcGxpY2F0aW9uLXN0b3JlJztcbmltcG9ydCB7IGdlbmVyYXRlQ2xpZW50VG9rZW4gfSBmcm9tICcuLi91dGlscy9jbGllbnQtYXV0aC10b2tlbic7XG5pbXBvcnQgeyBpbnN0aXR1dGlvbkNvZGUsIGlzRGV2ZWxvcG1lbnQsIHRlbmFudENvZGUgfSBmcm9tICcuLi91dGlscy9jb25zdGFudHMnO1xuLy8gR2V0IGJhc2UgVVJMIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG52YXIgZ2V0QmFzZVVybCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBGb3IgQ3JlYXRlIFJlYWN0IEFwcFxuICAgIHJldHVybiBwcm9jZXNzLmVudi5SRUFDVF9BUFBfQVBJX0hPU1QgfHwgJy9hcGknO1xufTtcbi8vIEZvcm1hdCBxdWVyeSBwYXJhbWV0ZXJzXG52YXIgZm9ybWF0UGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocGFyYW1zICE9PSBudWxsICYmIHBhcmFtcyAhPT0gdm9pZCAwID8gcGFyYW1zIDoge30pLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUgPT09ICdfX2VtcHR5X18nID8gJycgOiB2YWx1ZSxcbiAgICAgICAgXTtcbiAgICB9KSk7XG59O1xuLy8gQ3JlYXRlIGF4aW9zIGluc3RhbmNlIGZvciBzZWxlY3RvcnMgd2l0aCB3b3Jrc3BhY2U6IGZhbHNlXG5leHBvcnQgdmFyIG5vbldvcmtzcGFjZUF4aW9zID0gQXhpb3MuY3JlYXRlKHtcbiAgICBiYXNlVVJMOiBnZXRCYXNlVXJsKCksXG4gICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIHdvcmtzcGFjZTogZmFsc2UsXG4gICAgaGVhZGVyczoge1xuICAgICAgICAneC10ZW5hbnQtaWQnOiB0ZW5hbnRDb2RlLFxuICAgICAgICAneC1pbnN0aXR1dGlvbi1jb2RlJzogaW5zdGl0dXRpb25Db2RlLFxuICAgIH0sXG59KTtcbi8vIFJlcXVlc3QgaW50ZXJjZXB0b3Jcbm5vbldvcmtzcGFjZUF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgLy8gRm9ybWF0IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICB2YXIgcGFyYW1zID0gZm9ybWF0UGFyYW1zKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5wYXJhbXMpO1xuICAgIC8vIFNraXAgd29ya3NwYWNlIHJvdXRpbmcgc2luY2Ugd29ya3NwYWNlIGlzIHNldCB0byBmYWxzZVxuICAgIC8vIE5vIHdvcmtzcGFjZSByb3V0aW5nIGxvZ2ljIG5lZWRlZCBoZXJlXG4gICAgLy8gQWRkIHNlc3Npb24gdG9rZW5zIGZyb20gY29va2llcyBpZiBpbiBkZXZlbG9wbWVudFxuICAgIHZhciBzZXNzaW9uS2V5ID0gQ29va2llcy5nZXQoJ2NhbXB4X3Nlc3Npb25fa2V5Jyk7XG4gICAgdmFyIG9wZW5QYXltZW50c0tleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9vcGVuX3BheW1lbnRzX2tleScpO1xuICAgIHZhciBzdHVkZW50U2Vzc2lvbktleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zdHVkZW50X2tleScpO1xuICAgIGlmIChpc0RldmVsb3BtZW50ICYmIHNlc3Npb25LZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9zZXNzaW9uX2tleScsIHNlc3Npb25LZXkpO1xuICAgIH1cbiAgICBpZiAoaXNEZXZlbG9wbWVudCAmJiBzdHVkZW50U2Vzc2lvbktleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X3N0dWRlbnRfa2V5Jywgc3R1ZGVudFNlc3Npb25LZXkpO1xuICAgIH1cbiAgICBpZiAob3BlblBheW1lbnRzS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfb3Blbl9wYXltZW50c19rZXknLCBvcGVuUGF5bWVudHNLZXkpO1xuICAgIH1cbiAgICAvLyBJbmplY3QgY2xpZW50IGF1dGhlbnRpY2F0aW9uIHRva2VuXG4gICAgdmFyIGNhbXB4Q2xpZW50SWQgPSBwcm9jZXNzLmVudi5SRUFDVF9BUFBfQ0xJRU5UX0lEO1xuICAgIHZhciBjYW1weENsaWVudFNlY3JldCA9IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9DQU1QWF9DTElFTlRfU0VDUkVUO1xuICAgIGlmIChjYW1weENsaWVudElkICYmIGNhbXB4Q2xpZW50U2VjcmV0KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgneC1jYW1weC1jbGllbnQnLCBnZW5lcmF0ZUNsaWVudFRva2VuKGNhbXB4Q2xpZW50SWQsIGNhbXB4Q2xpZW50U2VjcmV0KSk7XG4gICAgfVxuICAgIC8vIFNraXAgc2VuZGluZyBYLWluc3RpdHV0aW9uLWNvZGUgaWYgdGhlIGZsYWcgaXMgc2V0XG4gICAgaWYgKGNvbmZpZy5za2lwSW5zdGl0dXRpb25Db2RlKSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLmRlbGV0ZSgneC1pbnN0aXR1dGlvbi1jb2RlJyk7XG4gICAgfVxuICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29uZmlnKSwgeyBwYXJhbXM6IHBhcmFtcyB9KTtcbn0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG59KTtcbi8vIFJlc3BvbnNlIGludGVyY2VwdG9yXG5ub25Xb3Jrc3BhY2VBeGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgIHZhciBfYTtcbiAgICAvLyBDaGVjayBpZiB0aGUgcmVzcG9uc2UgaGFzIGhpZGVTbmFja2JhciBwcm9wZXJ0eVxuICAgIHZhciBzaG91bGRIaWRlU25hY2tiYXIgPSAoKF9hID0gcmVzcG9uc2UuZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhpZGVTbmFja2JhcikgPT09IHRydWU7XG4gICAgLy8gSGFuZGxlIHN1Y2Nlc3NmdWwgcmVzcG9uc2VzXG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiZcbiAgICAgICAgcmVzcG9uc2UuY29uZmlnLm1ldGhvZCAmJlxuICAgICAgICBbJ3B1dCcsICdwb3N0JywgJ2RlbGV0ZScsICdwYXRjaCddLmluY2x1ZGVzKHJlc3BvbnNlLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFsyMDAsIDIwMSwgMjAyXS5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IHJlc3BvbnNlLmRhdGEubWVzc2FnZSB8fCAnT3BlcmF0aW9uIHN1Y2Nlc3NmdWwnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdzdWNjZXNzJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbn0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVycm9yIHJlc3BvbnNlIGhhcyBoaWRlU25hY2tiYXIgcHJvcGVydHlcbiAgICB2YXIgc2hvdWxkSGlkZVNuYWNrYmFyID0gKChfYiA9IChfYSA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRhdGEpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5oaWRlU25hY2tiYXIpID09PSB0cnVlO1xuICAgIC8vIEhhbmRsZSBlcnJvciByZXNwb25zZXNcbiAgICBpZiAoIXNob3VsZEhpZGVTbmFja2JhciAmJiBbNDAwLCA0MjJdLmluY2x1ZGVzKChfYyA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIGVycm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gZXJyLnJlc3BvbnNlLmRhdGEubWVzc2FnZSB8fCAnQmFkIFJlcXVlc3QnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdlcnJvcic7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXNob3VsZEhpZGVTbmFja2JhciAmJlxuICAgICAgICAoKF9kID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhlcnIucmVzcG9uc2UuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWzQwNF0uaW5jbHVkZXMoZXJyLnJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIG5vdCBmb3VuZCBlcnJvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IGVyci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ05vdCBGb3VuZCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ2Vycm9yJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBub25Xb3Jrc3BhY2VBeGlvcztcbiIsIi8qKlxuICogVm9JUCBDb25maWd1cmF0aW9uIE1vZHVsZVxuICpcbiAqIFRoaXMgbW9kdWxlIG1hbmFnZXMgVm9JUC9FeG90ZWwgY29uZmlndXJhdGlvbiBmb3Igd29ya3NwYWNlcy5cbiAqIE9ubHkgd29ya3NwYWNlcyBsaXN0ZWQgaW4gVk9JUF9FTkFCTEVEX1dPUktTUEFDRVMgd2lsbCBoYXZlIFZvSVAgZnVuY3Rpb25hbGl0eS5cbiAqL1xuLyoqXG4gKiBMaXN0IG9mIHdvcmtzcGFjZXMgdGhhdCBoYXZlIFZvSVAvRXhvdGVsIGNhbGxpbmcgZW5hYmxlZC5cbiAqIEFkZCB3b3Jrc3BhY2UgbmFtZXMgaGVyZSB0byBlbmFibGUgVm9JUCBmb3IgdGhhdCB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCB2YXIgVk9JUF9FTkFCTEVEX1dPUktTUEFDRVMgPSBbXG4gICAgJ2FkbWlzc2lvbnMtZGlyZWN0b3Itd29ya3NwYWNlJyxcbiAgICAnYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLXdvcmtzcGFjZScsXG4gICAgJ2FkbWlzc2lvbnMtb2ZmaWNlci13b3Jrc3BhY2UnLFxuICAgICd0ZWxlLWNvdW5zZWxsb3Itd29ya3NwYWNlJyxcbl07XG4vKipcbiAqIENoZWNrIGlmIFZvSVAgaXMgZW5hYmxlZCBmb3IgYSBnaXZlbiB3b3Jrc3BhY2VcbiAqXG4gKiBAcGFyYW0gd29ya3NwYWNlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3b3Jrc3BhY2UgdG8gY2hlY2tcbiAqIEByZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBWb0lQIGlzIGVuYWJsZWQgZm9yIHRoZSB3b3Jrc3BhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVm9JUEVuYWJsZWRGb3JXb3Jrc3BhY2Uod29ya3NwYWNlTmFtZSkge1xuICAgIHJldHVybiBWT0lQX0VOQUJMRURfV09SS1NQQUNFUy5pbmNsdWRlcyh3b3Jrc3BhY2VOYW1lKTtcbn1cbiIsImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBDb25maXJtRGlhbG9nIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TdG9yZSB9IGZyb20gJy4vYXBwbGljYXRpb24tc3RvcmUnO1xudmFyIENvbmZpcm1Db250ZXh0ID0gY3JlYXRlQ29udGV4dCh7XG4gICAgc2hvd0NvbmZpcm1EaWFsb2c6IGZ1bmN0aW9uICgpIHsgfSxcbn0pO1xuZXhwb3J0IHZhciBDb25maXJtRGlhbG9nUHJvdmlkZXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgY29uZmlybURpYWxvZyA9IEFwcGxpY2F0aW9uU3RvcmUudXNlU3RhdGUoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMuY29uZmlybURpYWxvZzsgfSk7XG4gICAgdmFyIHNob3dDb25maXJtRGlhbG9nID0gZnVuY3Rpb24gKHRpdGxlLCBtZXNzYWdlLCBvbkNvbmZpcm0sIG9uQ2FuY2VsLCB0eXBlLCBjb25maXJtVGV4dCwgY2FuY2VsVGV4dCkge1xuICAgICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSAnY29uZmlybSc7IH1cbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuY29uZmlybURpYWxvZyA9IHtcbiAgICAgICAgICAgICAgICBpc09wZW46IHRydWUsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgb25Db25maXJtOiBvbkNvbmZpcm0sXG4gICAgICAgICAgICAgICAgb25DYW5jZWw6IG9uQ2FuY2VsLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IGNvbmZpcm1UZXh0LFxuICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6IGNhbmNlbFRleHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVDbG9zZURpYWxvZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuY29uZmlybURpYWxvZy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gKF9qc3hzKENvbmZpcm1Db250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiB7IHNob3dDb25maXJtRGlhbG9nOiBzaG93Q29uZmlybURpYWxvZyB9LCBjaGlsZHJlbjogW2NoaWxkcmVuLCBfanN4KENvbmZpcm1EaWFsb2csIHsgb3BlbjogY29uZmlybURpYWxvZy5pc09wZW4sIHRpdGxlOiBjb25maXJtRGlhbG9nLnRpdGxlLCBtZXNzYWdlOiBjb25maXJtRGlhbG9nLm1lc3NhZ2UsIHZhcmlhbnQ6IGNvbmZpcm1EaWFsb2cudHlwZSwgY29uZmlybVRleHQ6IGNvbmZpcm1EaWFsb2cuY29uZmlybUJ1dHRvblRleHQsIGNhbmNlbFRleHQ6IGNvbmZpcm1EaWFsb2cuY2FuY2VsQnV0dG9uVGV4dCwgb25Db25maXJtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1EaWFsb2cub25Db25maXJtKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgfSwgb25DbG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25maXJtRGlhbG9nLm9uQ2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgfSB9KV0gfSkpO1xufTtcbiIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5leHBvcnQgeyBfc2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxudmFyIGNoYW5nZWRBcnJheSA9IGZ1bmN0aW9uIGNoYW5nZWRBcnJheShhLCBiKSB7XG4gIGlmIChhID09PSB2b2lkIDApIHtcbiAgICBhID0gW107XG4gIH1cblxuICBpZiAoYiA9PT0gdm9pZCAwKSB7XG4gICAgYiA9IFtdO1xuICB9XG5cbiAgcmV0dXJuIGEubGVuZ3RoICE9PSBiLmxlbmd0aCB8fCBhLnNvbWUoZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgcmV0dXJuICFPYmplY3QuaXMoaXRlbSwgYltpbmRleF0pO1xuICB9KTtcbn07XG5cbnZhciBpbml0aWFsU3RhdGUgPSB7XG4gIGVycm9yOiBudWxsXG59O1xuXG52YXIgRXJyb3JCb3VuZGFyeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShFcnJvckJvdW5kYXJ5LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBFcnJvckJvdW5kYXJ5KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBfYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIF9hcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoX2FyZ3MpKSB8fCB0aGlzO1xuICAgIF90aGlzLnN0YXRlID0gaW5pdGlhbFN0YXRlO1xuXG4gICAgX3RoaXMucmVzZXRFcnJvckJvdW5kYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzO1xuXG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5wcm9wcy5vblJlc2V0ID09IG51bGwgPyB2b2lkIDAgOiAoX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcykub25SZXNldC5hcHBseShfdGhpcyRwcm9wcywgYXJncyk7XG5cbiAgICAgIF90aGlzLnJlc2V0KCk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIEVycm9yQm91bmRhcnkuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiBlcnJvclxuICAgIH07XG4gIH07XG5cbiAgdmFyIF9wcm90byA9IEVycm9yQm91bmRhcnkucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIHRoaXMuc2V0U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkQ2F0Y2ggPSBmdW5jdGlvbiBjb21wb25lbnREaWRDYXRjaChlcnJvciwgaW5mbykge1xuICAgIHZhciBfdGhpcyRwcm9wcyRvbkVycm9yLCBfdGhpcyRwcm9wczI7XG5cbiAgICAoX3RoaXMkcHJvcHMkb25FcnJvciA9IChfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzKS5vbkVycm9yKSA9PSBudWxsID8gdm9pZCAwIDogX3RoaXMkcHJvcHMkb25FcnJvci5jYWxsKF90aGlzJHByb3BzMiwgZXJyb3IsIGluZm8pO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICB2YXIgZXJyb3IgPSB0aGlzLnN0YXRlLmVycm9yO1xuICAgIHZhciByZXNldEtleXMgPSB0aGlzLnByb3BzLnJlc2V0S2V5czsgLy8gVGhlcmUncyBhbiBlZGdlIGNhc2Ugd2hlcmUgaWYgdGhlIHRoaW5nIHRoYXQgdHJpZ2dlcmVkIHRoZSBlcnJvclxuICAgIC8vIGhhcHBlbnMgdG8gKmFsc28qIGJlIGluIHRoZSByZXNldEtleXMgYXJyYXksIHdlJ2QgZW5kIHVwIHJlc2V0dGluZ1xuICAgIC8vIHRoZSBlcnJvciBib3VuZGFyeSBpbW1lZGlhdGVseS4gVGhpcyB3b3VsZCBsaWtlbHkgdHJpZ2dlciBhIHNlY29uZFxuICAgIC8vIGVycm9yIHRvIGJlIHRocm93bi5cbiAgICAvLyBTbyB3ZSBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBjaGVjayB0aGUgcmVzZXRLZXlzIG9uIHRoZSBmaXJzdCBjYWxsXG4gICAgLy8gb2YgY0RVIGFmdGVyIHRoZSBlcnJvciBpcyBzZXRcblxuICAgIGlmIChlcnJvciAhPT0gbnVsbCAmJiBwcmV2U3RhdGUuZXJyb3IgIT09IG51bGwgJiYgY2hhbmdlZEFycmF5KHByZXZQcm9wcy5yZXNldEtleXMsIHJlc2V0S2V5cykpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyRvblJlc2V0S2UsIF90aGlzJHByb3BzMztcblxuICAgICAgKF90aGlzJHByb3BzJG9uUmVzZXRLZSA9IChfdGhpcyRwcm9wczMgPSB0aGlzLnByb3BzKS5vblJlc2V0S2V5c0NoYW5nZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF90aGlzJHByb3BzJG9uUmVzZXRLZS5jYWxsKF90aGlzJHByb3BzMywgcHJldlByb3BzLnJlc2V0S2V5cywgcmVzZXRLZXlzKTtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgZXJyb3IgPSB0aGlzLnN0YXRlLmVycm9yO1xuICAgIHZhciBfdGhpcyRwcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICBmYWxsYmFja1JlbmRlciA9IF90aGlzJHByb3BzNC5mYWxsYmFja1JlbmRlcixcbiAgICAgICAgRmFsbGJhY2tDb21wb25lbnQgPSBfdGhpcyRwcm9wczQuRmFsbGJhY2tDb21wb25lbnQsXG4gICAgICAgIGZhbGxiYWNrID0gX3RoaXMkcHJvcHM0LmZhbGxiYWNrO1xuXG4gICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICB2YXIgX3Byb3BzID0ge1xuICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgIHJlc2V0RXJyb3JCb3VuZGFyeTogdGhpcy5yZXNldEVycm9yQm91bmRhcnlcbiAgICAgIH07XG5cbiAgICAgIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGZhbGxiYWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmYWxsYmFja1JlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZmFsbGJhY2tSZW5kZXIoX3Byb3BzKTtcbiAgICAgIH0gZWxzZSBpZiAoRmFsbGJhY2tDb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZhbGxiYWNrQ29tcG9uZW50LCBfcHJvcHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWFjdC1lcnJvci1ib3VuZGFyeSByZXF1aXJlcyBlaXRoZXIgYSBmYWxsYmFjaywgZmFsbGJhY2tSZW5kZXIsIG9yIEZhbGxiYWNrQ29tcG9uZW50IHByb3AnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgfTtcblxuICByZXR1cm4gRXJyb3JCb3VuZGFyeTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZnVuY3Rpb24gd2l0aEVycm9yQm91bmRhcnkoQ29tcG9uZW50LCBlcnJvckJvdW5kYXJ5UHJvcHMpIHtcbiAgdmFyIFdyYXBwZWQgPSBmdW5jdGlvbiBXcmFwcGVkKHByb3BzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVycm9yQm91bmRhcnksIGVycm9yQm91bmRhcnlQcm9wcywgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBwcm9wcykpO1xuICB9OyAvLyBGb3JtYXQgZm9yIGRpc3BsYXkgaW4gRGV2VG9vbHNcblxuXG4gIHZhciBuYW1lID0gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdVbmtub3duJztcbiAgV3JhcHBlZC5kaXNwbGF5TmFtZSA9IFwid2l0aEVycm9yQm91bmRhcnkoXCIgKyBuYW1lICsgXCIpXCI7XG4gIHJldHVybiBXcmFwcGVkO1xufVxuXG5mdW5jdGlvbiB1c2VFcnJvckhhbmRsZXIoZ2l2ZW5FcnJvcikge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgICBlcnJvciA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldEVycm9yID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIGlmIChnaXZlbkVycm9yICE9IG51bGwpIHRocm93IGdpdmVuRXJyb3I7XG4gIGlmIChlcnJvciAhPSBudWxsKSB0aHJvdyBlcnJvcjtcbiAgcmV0dXJuIHNldEVycm9yO1xufVxuLypcbmVzbGludFxuICBAdHlwZXNjcmlwdC1lc2xpbnQvc29ydC10eXBlLXVuaW9uLWludGVyc2VjdGlvbi1tZW1iZXJzOiBcIm9mZlwiLFxuICBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhyb3ctbGl0ZXJhbDogXCJvZmZcIixcbiAgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2Npbmc6IFwib2ZmXCJcbiovXG5cbmV4cG9ydCB7IEVycm9yQm91bmRhcnksIHVzZUVycm9ySGFuZGxlciwgd2l0aEVycm9yQm91bmRhcnkgfTtcbiIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UodCwgbykge1xuICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLCB0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHQsIHNldFByb3RvdHlwZU9mKHQsIG8pO1xufVxuZXhwb3J0IHsgX2luaGVyaXRzTG9vc2UgYXMgZGVmYXVsdCB9OyIsImltcG9ydHt2YWxpZGF0ZUZpZWxkc05hdGl2ZWx5IGFzIGUsdG9OZXN0RXJyb3IgYXMgdH1mcm9tXCJAaG9va2Zvcm0vcmVzb2x2ZXJzXCI7aW1wb3J0e2FwcGVuZEVycm9ycyBhcyByfWZyb21cInJlYWN0LWhvb2stZm9ybVwiO3ZhciBvPWZ1bmN0aW9uKG8sbixhKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLHZvaWQgMD09PWEmJihhPXt9KSxmdW5jdGlvbihzLGksYyl7dHJ5e3JldHVybiBQcm9taXNlLnJlc29sdmUoZnVuY3Rpb24odCxyKXt0cnl7dmFyIHU9KG4uY29udGV4dCYmXCJkZXZlbG9wbWVudFwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJmNvbnNvbGUud2FybihcIllvdSBzaG91bGQgbm90IHVzZWQgdGhlIHl1cCBvcHRpb25zIGNvbnRleHQuIFBsZWFzZSwgdXNlIHRoZSAndXNlRm9ybScgY29udGV4dCBvYmplY3QgaW5zdGVhZFwiKSxQcm9taXNlLnJlc29sdmUob1tcInN5bmNcIj09PWEubW9kZT9cInZhbGlkYXRlU3luY1wiOlwidmFsaWRhdGVcIl0ocyxPYmplY3QuYXNzaWduKHthYm9ydEVhcmx5OiExfSxuLHtjb250ZXh0Oml9KSkpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGMuc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbiYmZSh7fSxjKSx7dmFsdWVzOmEucmF3VmFsdWVzP3M6dCxlcnJvcnM6e319fSkpfWNhdGNoKGUpe3JldHVybiByKGUpfXJldHVybiB1JiZ1LnRoZW4/dS50aGVuKHZvaWQgMCxyKTp1fSgwLGZ1bmN0aW9uKGUpe2lmKCFlLmlubmVyKXRocm93IGU7cmV0dXJue3ZhbHVlczp7fSxlcnJvcnM6dCgobz1lLG49IWMuc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbiYmXCJhbGxcIj09PWMuY3JpdGVyaWFNb2RlLChvLmlubmVyfHxbXSkucmVkdWNlKGZ1bmN0aW9uKGUsdCl7aWYoZVt0LnBhdGhdfHwoZVt0LnBhdGhdPXttZXNzYWdlOnQubWVzc2FnZSx0eXBlOnQudHlwZX0pLG4pe3ZhciBvPWVbdC5wYXRoXS50eXBlcyxhPW8mJm9bdC50eXBlXTtlW3QucGF0aF09cih0LnBhdGgsbixlLHQudHlwZSxhP1tdLmNvbmNhdChhLHQubWVzc2FnZSk6dC5tZXNzYWdlKX1yZXR1cm4gZX0se30pKSxjKX07dmFyIG8sbn0pKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fX07ZXhwb3J0e28gYXMgeXVwUmVzb2x2ZXJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9eXVwLm1vZHVsZS5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgQnV0dG9uLCBJY29ucywgUGFzc3dvcmRGaWVsZCwgVGV4dEZpZWxkLCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgeXVwUmVzb2x2ZXIgfSBmcm9tICdAaG9va2Zvcm0vcmVzb2x2ZXJzL3l1cCc7XG5pbXBvcnQgRGV2aWNlRGV0ZWN0b3IgZnJvbSAnZGV2aWNlLWRldGVjdG9yLWpzJztcbmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgdXNlRm9ybSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VNdXRhdGlvbiB9IGZyb20gJ3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IHVzZU5hdmlnYXRlIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgKiBhcyBZdXAgZnJvbSAneXVwJztcbmltcG9ydCB7IGF4aW9zIH0gZnJvbSAnLi4vLi4vY29uZmlnL2F4aW9zJztcbmltcG9ydCB7IGlzRGV2ZWxvcG1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9jb25zdGFudHMnO1xudmFyIHBlcmZvcm1Mb2dpbiA9IGZ1bmN0aW9uIChib2R5KSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXNwb25zZSwgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBpZiAoISghYm9keS5sYXRpdHVkZSB8fCAhYm9keS5sb25naXR1ZGUpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBmZXRjaCgnaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZ2VvbG9jYXRpb24vdjEvZ2VvbG9jYXRlP2tleT1BSXphU3lCMllDcG8xeWkxMDdSWWoxTGRadTJEQ2NwY085M3JlRlknLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zaWRlcklwOiAndHJ1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHJlc3BvbnNlLmpzb24oKV07XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICBib2R5LmxhdGl0dWRlID0gZGF0YS5sb2NhdGlvbi5sYXQ7XG4gICAgICAgICAgICAgICAgYm9keS5sb25naXR1ZGUgPSBkYXRhLmxvY2F0aW9uLmxuZztcbiAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovLCBheGlvc1xuICAgICAgICAgICAgICAgICAgICAucG9zdChcIi9hdXRoLXNlcnZlci9hdXRoLXYyL2xvZ2luXCIsIGJvZHksIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7IHJldHVybiByZXMuZGF0YTsgfSldO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbnZhciB2YWxpZGF0aW9uU2NoZW1hID0gWXVwLm9iamVjdCgpLnNoYXBlKHtcbiAgICB1c2VybmFtZTogWXVwLnN0cmluZygpLnJlcXVpcmVkKCdVc2VybmFtZSBpcyByZXF1aXJlZCcpLFxuICAgIHBhc3N3b3JkOiBZdXAuc3RyaW5nKCkucmVxdWlyZWQoJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyksXG59KTtcbmV4cG9ydCB2YXIgTG9naW4gPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgY2xvc2UgPSBfYS5jbG9zZTtcbiAgICB2YXIgX2IgPSB1c2VTdGF0ZSh7XG4gICAgICAgIGRldmljZUluZm9ybWF0aW9uOiB7XG4gICAgICAgICAgICBkZXZpY2VUeXBlOiAnYnJvd3NlcicsXG4gICAgICAgICAgICBjbGllbnROYW1lOiAndW5rbm93bicsXG4gICAgICAgICAgICBvczogJ3Vua25vd24nLFxuICAgICAgICAgICAgb3NWZXJzaW9uOiAndW5rbm93bicsXG4gICAgICAgICAgICBsYXRpdHVkZTogbnVsbCxcbiAgICAgICAgICAgIGxvbmdpdHVkZTogbnVsbCxcbiAgICAgICAgICAgIHRva2VuVHlwZTogJ1dFQicsXG4gICAgICAgIH0sXG4gICAgICAgIGlzTG9jYXRpb25BbGxvd2VkOiB0cnVlLFxuICAgIH0pLCBkZXZpY2VTdGF0ZSA9IF9iWzBdLCBzZXREZXZpY2VTdGF0ZSA9IF9iWzFdO1xuICAgIHZhciBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIHNldERldmljZVN0YXRlKGZ1bmN0aW9uIChzKSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHMpLCB7IGRldmljZUluZm9ybWF0aW9uOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcy5kZXZpY2VJbmZvcm1hdGlvbiksIHsgbGF0aXR1ZGU6IHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSwgbG9uZ2l0dWRlOiBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlIH0pIH0pKTsgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBuYXZpZ2F0b3IucGVybWlzc2lvbnNcbiAgICAgICAgICAgIC5xdWVyeSh7IG5hbWU6ICdnZW9sb2NhdGlvbicgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChwZXJtaXNzaW9uU3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvblN0YXR1cy5zdGF0ZSA9PT0gJ2RlbmllZCcpIHtcbiAgICAgICAgICAgICAgICBzZXREZXZpY2VTdGF0ZShmdW5jdGlvbiAocykgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzKSwgeyBpc0xvY2F0aW9uQWxsb3dlZDogZmFsc2UgfSkpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBkZXRlY3RvciA9IG5ldyBEZXZpY2VEZXRlY3RvcigpO1xuICAgICAgICB2YXIgZGV2aWNlSW5mbyA9IGRldGVjdG9yLnBhcnNlKG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgICBzZXREZXZpY2VTdGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzKSwgeyBkZXZpY2VJbmZvcm1hdGlvbjogX19hc3NpZ24oX19hc3NpZ24oe30sIHMuZGV2aWNlSW5mb3JtYXRpb24pLCB7IGNsaWVudE5hbWU6ICgoX2EgPSBkZXZpY2VJbmZvLmNsaWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5hbWUpIHx8IHMuZGV2aWNlSW5mb3JtYXRpb24uY2xpZW50TmFtZSwgb3M6ICgoX2IgPSBkZXZpY2VJbmZvLm9zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubmFtZSkgfHwgcy5kZXZpY2VJbmZvcm1hdGlvbi5vcywgb3NWZXJzaW9uOiAoKF9jID0gZGV2aWNlSW5mby5vcykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnZlcnNpb24pIHx8IHMuZGV2aWNlSW5mb3JtYXRpb24ub3NWZXJzaW9uIH0pIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfSwgW10pO1xuICAgIHZhciBfYyA9IHVzZUZvcm0oe1xuICAgICAgICByZXNvbHZlcjogeXVwUmVzb2x2ZXIodmFsaWRhdGlvblNjaGVtYSksXG4gICAgfSksIGhhbmRsZVN1Ym1pdCA9IF9jLmhhbmRsZVN1Ym1pdCwgY29udHJvbCA9IF9jLmNvbnRyb2wsIGVycm9ycyA9IF9jLmZvcm1TdGF0ZS5lcnJvcnM7XG4gICAgdmFyIF9kID0gdXNlTXV0YXRpb24ocGVyZm9ybUxvZ2luLCB7XG4gICAgICAgIG9uU3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChpc0RldmVsb3BtZW50KSB7XG4gICAgICAgICAgICAgICAgQ29va2llcy5yZW1vdmUoJ2NhbXB4X3Nlc3Npb25fa2V5Jyk7XG4gICAgICAgICAgICAgICAgQ29va2llcy5zZXQoJ2NhbXB4X3Nlc3Npb25fa2V5JywgZGF0YS5zZXNzaW9uLnRva2VuKTtcbiAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRlKFwiL1wiLmNvbmNhdChkYXRhLnNlc3Npb24uaW5zdGl0dXRpb25Db2RlLCBcIi93b3Jrc3BhY2VcIikpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KSwgbXV0YXRlID0gX2QubXV0YXRlLCBpc0xvYWRpbmcgPSBfZC5pc0xvYWRpbmc7XG4gICAgdmFyIG9uU3VibWl0ID0gZnVuY3Rpb24gKGJvZHkpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIG11dGF0ZShfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYm9keSksIGRldmljZVN0YXRlLmRldmljZUluZm9ybWF0aW9uKSwgeyBsb2dpbklkOiBib2R5LnVzZXJuYW1lLCBsb2dpblR5cGU6ICdVU0VSJyB9KSk7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgIH0pO1xuICAgIH0pOyB9O1xuICAgIHJldHVybiAoX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBmbGV4LWNvbCBnYXAtOCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgcC04XCIsIGNoaWxkcmVuOiBbX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBoLTkgdy00OFwiLCBjaGlsZHJlbjogX2pzeChJY29ucy5DYW1weEZ1bGxMb2dvSWNvbiwge30pIH0pLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGZsZXgtY29sIGdhcC00IHctZnVsbCBtYXgtdy1bNDAwcHhdXCIsIGNoaWxkcmVuOiBbX2pzeChDb250cm9sbGVyLCB7IGNvbnRyb2w6IGNvbnRyb2wsIHJlbmRlcjogZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gX2EuZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfanN4KFRleHRGaWVsZCwgeyBuYW1lOiBcInVzZXJuYW1lXCIsIHBsYWNlaG9sZGVyOiBcIkVudGVyIFVzZXJuYW1lIG9yIEVtYWlsXCIsIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSwgbGFiZWw6IFwiVXNlcm5hbWUgb3IgRW1haWxcIiwgZXJyb3I6ICEhZXJyb3JzLnVzZXJuYW1lLCByZXF1aXJlZDogdHJ1ZSwgZnVsbFdpZHRoOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG5hbWU6IFwidXNlcm5hbWVcIiB9KSwgX2pzeChDb250cm9sbGVyLCB7IGNvbnRyb2w6IGNvbnRyb2wsIHJlbmRlcjogZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gX2EuZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfanN4KFBhc3N3b3JkRmllbGQsIHsgbmFtZTogXCJwYXNzd29yZFwiLCBwbGFjZWhvbGRlcjogXCJFbnRlciBwYXNzd29yZFwiLCBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsIGxhYmVsOiBcIlBhc3N3b3JkXCIsIGVycm9yOiAhIWVycm9ycy5wYXNzd29yZCwgcmVxdWlyZWQ6IHRydWUsIGZ1bGxXaWR0aDogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBuYW1lOiBcInBhc3N3b3JkXCIgfSksIF9qc3goQnV0dG9uLCB7IHR5cGU6IFwic3VibWl0XCIsIGNvbG9yOiBcInByaW1hcnlcIiwgdmFyaWFudDogXCJkZWZhdWx0XCIsIG9uQ2xpY2s6IGhhbmRsZVN1Ym1pdChvblN1Ym1pdCksIGRpc2FibGVkOiBpc0xvYWRpbmcsIGxvYWRpbmc6IGlzTG9hZGluZywgZnVsbFdpZHRoOiB0cnVlLCBjaGlsZHJlbjogXCJMb2dpblwiIH0pXSB9KV0gfSkpO1xufTtcbiIsImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzLCBGcmFnbWVudCBhcyBfRnJhZ21lbnQgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEJ1dHRvbiwgRGlhbG9nLCBJbnRlcm5hbFNlcnZlckVycm9yLCBOb0ludGVybmVDb25uZWN0aW9uLCBSZXNvdXJjZU5vdEZvdW5kLCBVbkF1dGhvcml6ZWQsIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBFcnJvckJvdW5kYXJ5IGFzIFJlYWN0RXJyb3JCb3VuZGFyeSB9IGZyb20gJ3JlYWN0LWVycm9yLWJvdW5kYXJ5JztcbmltcG9ydCB7IFF1ZXJ5RXJyb3JSZXNldEJvdW5kYXJ5IH0gZnJvbSAncmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgdXNlTG9jYXRpb24sIHVzZU5hdmlnYXRlIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgeyBpbnN0aXR1dGlvbkNvZGUsIHdvcmtzcGFjZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBMb2dpbiB9IGZyb20gJy4vTG9naW4nO1xuZXhwb3J0IHZhciBFcnJvckJvdW5kYXJ5ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgdmFyIGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgICByZXR1cm4gKF9qc3goUXVlcnlFcnJvclJlc2V0Qm91bmRhcnksIHsgY2hpbGRyZW46IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIHJlc2V0ID0gX2EucmVzZXQ7XG4gICAgICAgICAgICByZXR1cm4gKF9qc3goUmVhY3RFcnJvckJvdW5kYXJ5LCB7IG9uUmVzZXQ6IHJlc2V0LCBGYWxsYmFja0NvbXBvbmVudDogRXJyb3JGYWxsYmFjaywgY2hpbGRyZW46IHByb3BzLmNoaWxkcmVuIH0sIGxvY2F0aW9uID09PSBudWxsIHx8IGxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhdGlvbi5wYXRobmFtZSkpO1xuICAgICAgICB9IH0pKTtcbn07XG52YXIgRXJyb3JGYWxsYmFjayA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaDtcbiAgICB2YXIgZXJyb3IgPSBfYS5lcnJvciwgcmVzZXRFcnJvckJvdW5kYXJ5ID0gX2EucmVzZXRFcnJvckJvdW5kYXJ5O1xuICAgIGlmICgoX2IgPSBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zdGF0dXMpIHtcbiAgICAgICAgc3dpdGNoICgoX2MgPSBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zdGF0dXMpIHtcbiAgICAgICAgICAgIGNhc2UgNDAxOlxuICAgICAgICAgICAgICAgIHJldHVybiBfanN4KFVuQXV0aCwge30pO1xuICAgICAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9qc3goSW50ZXJuYWxTZXJ2ZXJFcnJvciwgeyByZXNldEJvdW5kYXJ5OiByZXNldEVycm9yQm91bmRhcnkgfSk7XG4gICAgICAgICAgICBjYXNlIDQwNDpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2pzeChSZXNvdXJjZU5vdEZvdW5kLCB7IG1lc3NhZ2U6IChfZSA9IChfZCA9IGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmRhdGEpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5tZXNzYWdlIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICgoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLmNvZGUpID09PSAnRVJSX05FVFdPUksnKSB7XG4gICAgICAgIHJldHVybiBfanN4KE5vSW50ZXJuZUNvbm5lY3Rpb24sIHsgcmVzZXRCb3VuZGFyeTogcmVzZXRFcnJvckJvdW5kYXJ5IH0pO1xuICAgIH1cbiAgICByZXR1cm4gKF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwibXQtNCBwLTVcIiwgY2hpbGRyZW46IF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInJlbGF0aXZlIGgtMTUgYm9yZGVyIGJvcmRlci1yZWQtMjAwIGJnLXJlZC01MCBmbGV4IGl0ZW1zLWNlbnRlciByb3VuZGVkLW1kICBweC0yXCIsIGNoaWxkcmVuOiBbX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4LTEgdGV4dC1yZWQtNzAwIGJnLXRyYW5zcGFyZW50XCIsIGNoaWxkcmVuOiAoX2ggPSAoX2cgPSAoX2YgPSBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5kYXRhKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cubWVzc2FnZSkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLm1lc3NhZ2UgfSksIF9qc3goQnV0dG9uLCB7IG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc2V0RXJyb3JCb3VuZGFyeSgpOyB9LCBzaXplOiBcInNtXCIsIHZhcmlhbnQ6IFwibGlua1wiLCBjbGFzc05hbWU6IFwiaG92ZXI6bm8tdW5kZXJsaW5lIHRleHQtZGVzdHJ1Y3RpdmVcIiwgY2hpbGRyZW46IFwiVHJ5IEFnYWluXCIgfSldIH0pIH0pKTtcbn07XG52YXIgVW5BdXRoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG4gICAgdmFyIF9hID0gdXNlU3RhdGUoZmFsc2UpLCBpc01vZGFsT3BlbiA9IF9hWzBdLCBzZXRNb2RhbE9wZW4gPSBfYVsxXTtcbiAgICB2YXIgc2Vzc2lvbkNvb2tpZSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zZXNzaW9uX2tleScpO1xuICAgIHZhciBoYW5kbGVMb2dpbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNwbGl0KCcuJylbMV0gPT09ICdsb2NhbGhvc3QnKSB7XG4gICAgICAgICAgICBzZXRNb2RhbE9wZW4odHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXNlc3Npb25Db29raWUpIHtcbiAgICAgICAgICAgICAgICBpZiAod29ya3NwYWNlID09PSAncHJvc3BlY3Qtd29ya3NwYWNlJykge1xuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0ZShcIlwiLmNvbmNhdChpbnN0aXR1dGlvbkNvZGUsIFwiL2F0cy9sb2dpblwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGUoJy9hdXRoL2xvZ2luJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiAoX2pzeChVbkF1dGhvcml6ZWQsIHsgY29tcG9uZW50OiBfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEJ1dHRvbiwgeyBjbGFzc05hbWU6IFwibXQtNVwiLCB2YXJpYW50OiBcImRlZmF1bHRcIiwgb25DbGljazogaGFuZGxlTG9naW5DbGljaywgY2hpbGRyZW46IFwiQ2xpY2sgSGVyZSBUbyBMb2dpblwiIH0pLCBfanN4KERpYWxvZywgeyBvcGVuOiBpc01vZGFsT3Blbiwgb25DbG9zZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2V0TW9kYWxPcGVuKGZhbHNlKTsgfSwgY29udGVudDogZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xvc2UgPSBfYS5jbG9zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfanN4KExvZ2luLCB7IGNsb3NlOiBjbG9zZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSB9KV0gfSkgfSkpO1xufTtcbiIsIi8vIHNyYy91dGlscy9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlLnRzXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIGBNaW5pZmllZCBSZWR1eCBlcnJvciAjJHtjb2RlfTsgdmlzaXQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvRXJyb3JzP2NvZGU9JHtjb2RlfSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiBgO1xufVxuXG4vLyBzcmMvdXRpbHMvc3ltYm9sLW9ic2VydmFibGUudHNcbnZhciAkJG9ic2VydmFibGUgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCBcIkBAb2JzZXJ2YWJsZVwiKSgpO1xudmFyIHN5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHQgPSAkJG9ic2VydmFibGU7XG5cbi8vIHNyYy91dGlscy9hY3Rpb25UeXBlcy50c1xudmFyIHJhbmRvbVN0cmluZyA9ICgpID0+IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KS5zcGxpdChcIlwiKS5qb2luKFwiLlwiKTtcbnZhciBBY3Rpb25UeXBlcyA9IHtcbiAgSU5JVDogYEBAcmVkdXgvSU5JVCR7LyogQF9fUFVSRV9fICovIHJhbmRvbVN0cmluZygpfWAsXG4gIFJFUExBQ0U6IGBAQHJlZHV4L1JFUExBQ0Ukey8qIEBfX1BVUkVfXyAqLyByYW5kb21TdHJpbmcoKX1gLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogKCkgPT4gYEBAcmVkdXgvUFJPQkVfVU5LTk9XTl9BQ1RJT04ke3JhbmRvbVN0cmluZygpfWBcbn07XG52YXIgYWN0aW9uVHlwZXNfZGVmYXVsdCA9IEFjdGlvblR5cGVzO1xuXG4vLyBzcmMvdXRpbHMvaXNQbGFpbk9iamVjdC50c1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgb2JqID09PSBudWxsKVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IHByb3RvID0gb2JqO1xuICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSAhPT0gbnVsbCkge1xuICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBudWxsO1xufVxuXG4vLyBzcmMvdXRpbHMva2luZE9mLnRzXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApXG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gIGlmICh2YWwgPT09IG51bGwpXG4gICAgcmV0dXJuIFwibnVsbFwiO1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjoge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgaWYgKGlzRGF0ZSh2YWwpKVxuICAgIHJldHVybiBcImRhdGVcIjtcbiAgaWYgKGlzRXJyb3IodmFsKSlcbiAgICByZXR1cm4gXCJlcnJvclwiO1xuICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSBjdG9yTmFtZSh2YWwpO1xuICBzd2l0Y2ggKGNvbnN0cnVjdG9yTmFtZSkge1xuICAgIGNhc2UgXCJTeW1ib2xcIjpcbiAgICBjYXNlIFwiUHJvbWlzZVwiOlxuICAgIGNhc2UgXCJXZWFrTWFwXCI6XG4gICAgY2FzZSBcIldlYWtTZXRcIjpcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgY2FzZSBcIlNldFwiOlxuICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xufVxuZnVuY3Rpb24gY3Rvck5hbWUodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIgPyB2YWwuY29uc3RydWN0b3IubmFtZSA6IG51bGw7XG59XG5mdW5jdGlvbiBpc0Vycm9yKHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIHZhbC5tZXNzYWdlID09PSBcInN0cmluZ1wiICYmIHZhbC5jb25zdHJ1Y3RvciAmJiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yLnN0YWNrVHJhY2VMaW1pdCA9PT0gXCJudW1iZXJcIjtcbn1cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiB2YWwuZ2V0RGF0ZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiB2YWwuc2V0RGF0ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24ga2luZE9mKHZhbCkge1xuICBsZXQgdHlwZU9mVmFsID0gdHlwZW9mIHZhbDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHR5cGVPZlZhbCA9IG1pbmlLaW5kT2YodmFsKTtcbiAgfVxuICByZXR1cm4gdHlwZU9mVmFsO1xufVxuXG4vLyBzcmMvY3JlYXRlU3RvcmUudHNcbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIpIDogYEV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihyZWR1Y2VyKX0nYCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBlbmhhbmNlciA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBhcmd1bWVudHNbM10gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogXCJJdCBsb29rcyBsaWtlIHlvdSBhcmUgcGFzc2luZyBzZXZlcmFsIHN0b3JlIGVuaGFuY2VycyB0byBjcmVhdGVTdG9yZSgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIGNvbXBvc2UgdGhlbSB0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuXCIpO1xuICB9XG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZW5oYW5jZXIgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdm9pZCAwO1xuICB9XG4gIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpIDogYEV4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKGVuaGFuY2VyKX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG4gIGxldCBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIGxldCBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgbGV0IGN1cnJlbnRMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIGxldCBsaXN0ZW5lcklkQ291bnRlciA9IDA7XG4gIGxldCBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKG5leHRMaXN0ZW5lcnMgPT09IGN1cnJlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIG5leHRMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgY3VycmVudExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lciwga2V5KSA9PiB7XG4gICAgICAgIG5leHRMaXN0ZW5lcnMuc2V0KGtleSwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzKSA6IFwiWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gVGhlIHJlZHVjZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHN0YXRlIGFzIGFuIGFyZ3VtZW50LiBQYXNzIGl0IGRvd24gZnJvbSB0aGUgdG9wIHJlZHVjZXIgaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20gdGhlIHN0b3JlLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQpIDogYEV4cGVjdGVkIHRoZSBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKGxpc3RlbmVyKX0nYCk7XG4gICAgfVxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6IFwiWW91IG1heSBub3QgY2FsbCBzdG9yZS5zdWJzY3JpYmUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuIElmIHlvdSB3b3VsZCBsaWtlIHRvIGJlIG5vdGlmaWVkIGFmdGVyIHRoZSBzdG9yZSBoYXMgYmVlbiB1cGRhdGVkLCBzdWJzY3JpYmUgZnJvbSBhIGNvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuXCIpO1xuICAgIH1cbiAgICBsZXQgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgY29uc3QgbGlzdGVuZXJJZCA9IGxpc3RlbmVySWRDb3VudGVyKys7XG4gICAgbmV4dExpc3RlbmVycy5zZXQobGlzdGVuZXJJZCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogXCJZb3UgbWF5IG5vdCB1bnN1YnNjcmliZSBmcm9tIGEgc3RvcmUgbGlzdGVuZXIgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuXCIpO1xuICAgICAgfVxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgICBuZXh0TGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcklkKTtcbiAgICAgIGN1cnJlbnRMaXN0ZW5lcnMgPSBudWxsO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogYEFjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiBJbnN0ZWFkLCB0aGUgYWN0dWFsIHR5cGUgd2FzOiAnJHtraW5kT2YoYWN0aW9uKX0nLiBZb3UgbWF5IG5lZWQgdG8gYWRkIG1pZGRsZXdhcmUgdG8geW91ciBzdG9yZSBzZXR1cCB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgb3RoZXIgdmFsdWVzLCBzdWNoIGFzICdyZWR1eC10aHVuaycgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIGZ1bmN0aW9ucy4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI21pZGRsZXdhcmUgYW5kIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC02LWFzeW5jLWxvZ2ljI3VzaW5nLXRoZS1yZWR1eC10aHVuay1taWRkbGV3YXJlIGZvciBleGFtcGxlcy5gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE3KSA6IGBBY3Rpb24gXCJ0eXBlXCIgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJyR7a2luZE9mKGFjdGlvbi50eXBlKX0nLiBWYWx1ZSB3YXM6ICcke2FjdGlvbi50eXBlfScgKHN0cmluZ2lmaWVkKWApO1xuICAgIH1cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOSkgOiBcIlJlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy5cIik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzID0gbmV4dExpc3RlbmVycztcbiAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuICBmdW5jdGlvbiByZXBsYWNlUmVkdWNlcihuZXh0UmVkdWNlcikge1xuICAgIGlmICh0eXBlb2YgbmV4dFJlZHVjZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTApIDogYEV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKG5leHRSZWR1Y2VyKX1gKTtcbiAgICB9XG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBvYnNlcnZhYmxlKCkge1xuICAgIGNvbnN0IG91dGVyU3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBtaW5pbWFsIG9ic2VydmFibGUgc3Vic2NyaXB0aW9uIG1ldGhvZC5cbiAgICAgICAqIEBwYXJhbSBvYnNlcnZlciBBbnkgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gb2JzZXJ2ZXIuXG4gICAgICAgKiBUaGUgb2JzZXJ2ZXIgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5leHRgIG1ldGhvZC5cbiAgICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGFuIGB1bnN1YnNjcmliZWAgbWV0aG9kIHRoYXQgY2FuXG4gICAgICAgKiBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIGZyb20gdGhlIHN0b3JlLCBhbmQgcHJldmVudCBmdXJ0aGVyXG4gICAgICAgKiBlbWlzc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgb2JzZXJ2YWJsZS5cbiAgICAgICAqL1xuICAgICAgc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09IFwib2JqZWN0XCIgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMSkgOiBgRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihvYnNlcnZlcil9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9ic2VydmVTdGF0ZSgpIHtcbiAgICAgICAgICBjb25zdCBvYnNlcnZlckFzT2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXJBc09ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyQXNPYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvYnNlcnZlU3RhdGUoKTtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgW3N5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHRdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LklOSVRcbiAgfSk7XG4gIGNvbnN0IHN0b3JlID0ge1xuICAgIGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZSxcbiAgICBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcixcbiAgICBbc3ltYm9sX29ic2VydmFibGVfZGVmYXVsdF06IG9ic2VydmFibGVcbiAgfTtcbiAgcmV0dXJuIHN0b3JlO1xufVxuZnVuY3Rpb24gbGVnYWN5X2NyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICByZXR1cm4gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKTtcbn1cblxuLy8gc3JjL3V0aWxzL3dhcm5pbmcudHNcbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgdHJ5IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuXG4vLyBzcmMvY29tYmluZVJlZHVjZXJzLnRzXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICBjb25zdCByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgY29uc3QgYXJndW1lbnROYW1lID0gYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBhY3Rpb25UeXBlc19kZWZhdWx0LklOSVQgPyBcInByZWxvYWRlZFN0YXRlIGFyZ3VtZW50IHBhc3NlZCB0byBjcmVhdGVTdG9yZVwiIDogXCJwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlclwiO1xuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIGNvbWJpbmVSZWR1Y2VycyBpcyBhbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSByZWR1Y2Vycy5cIjtcbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gYFRoZSAke2FyZ3VtZW50TmFtZX0gaGFzIHVuZXhwZWN0ZWQgdHlwZSBvZiBcIiR7a2luZE9mKGlucHV0U3RhdGUpfVwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6IFwiJHtyZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKX1cImA7XG4gIH1cbiAgY29uc3QgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoKGtleSkgPT4gIXJlZHVjZXJzLmhhc093blByb3BlcnR5KGtleSkgJiYgIXVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldKTtcbiAgdW5leHBlY3RlZEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlW2tleV0gPSB0cnVlO1xuICB9KTtcbiAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gYWN0aW9uVHlwZXNfZGVmYXVsdC5SRVBMQUNFKVxuICAgIHJldHVybjtcbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYFVuZXhwZWN0ZWQgJHt1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAxID8gXCJrZXlzXCIgOiBcImtleVwifSBcIiR7dW5leHBlY3RlZEtleXMuam9pbignXCIsIFwiJyl9XCIgZm91bmQgaW4gJHthcmd1bWVudE5hbWV9LiBFeHBlY3RlZCB0byBmaW5kIG9uZSBvZiB0aGUga25vd24gcmVkdWNlciBrZXlzIGluc3RlYWQ6IFwiJHtyZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKX1cIi4gVW5leHBlY3RlZCBrZXlzIHdpbGwgYmUgaWdub3JlZC5gO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IHJlZHVjZXIgPSByZWR1Y2Vyc1trZXldO1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodm9pZCAwLCB7XG4gICAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LklOSVRcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogYFRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke2tleX1cIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCB5b3UgY2FuIHVzZSBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLmApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZHVjZXIodm9pZCAwLCB7XG4gICAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LlBST0JFX1VOS05PV05fQUNUSU9OKClcbiAgICB9KSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogYFRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke2tleX1cIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBEb24ndCB0cnkgdG8gaGFuZGxlICcke2FjdGlvblR5cGVzX2RlZmF1bHQuSU5JVH0nIG9yIG90aGVyIGFjdGlvbnMgaW4gXCJyZWR1eC8qXCIgbmFtZXNwYWNlLiBUaGV5IGFyZSBjb25zaWRlcmVkIHByaXZhdGUuIEluc3RlYWQsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55IHVua25vd24gYWN0aW9ucywgdW5sZXNzIGl0IGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdGlvbiB0eXBlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZCwgYnV0IGNhbiBiZSBudWxsLmApO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpIHtcbiAgY29uc3QgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIGNvbnN0IGZpbmFsUmVkdWNlcnMgPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHJlZHVjZXJLZXlzW2ldO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB3YXJuaW5nKGBObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXCIke2tleX1cImApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpO1xuICBsZXQgdW5leHBlY3RlZEtleUNhY2hlO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cbiAgbGV0IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UmVkdWNlclNoYXBlKGZpbmFsUmVkdWNlcnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hhcGVBc3NlcnRpb25FcnJvciA9IGU7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlID0ge30sIGFjdGlvbikge1xuICAgIGlmIChzaGFwZUFzc2VydGlvbkVycm9yKSB7XG4gICAgICB0aHJvdyBzaGFwZUFzc2VydGlvbkVycm9yO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2Uoc3RhdGUsIGZpbmFsUmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKTtcbiAgICAgIGlmICh3YXJuaW5nTWVzc2FnZSkge1xuICAgICAgICB3YXJuaW5nKHdhcm5pbmdNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGZpbmFsUmVkdWNlcktleXNbaV07XG4gICAgICBjb25zdCByZWR1Y2VyID0gZmluYWxSZWR1Y2Vyc1trZXldO1xuICAgICAgY29uc3QgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW2tleV07XG4gICAgICBjb25zdCBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG4gICAgICBpZiAodHlwZW9mIG5leHRTdGF0ZUZvcktleSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb25zdCBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBgV2hlbiBjYWxsZWQgd2l0aCBhbiBhY3Rpb24gb2YgdHlwZSAke2FjdGlvblR5cGUgPyBgXCIke1N0cmluZyhhY3Rpb25UeXBlKX1cImAgOiBcIih1bmtub3duIHR5cGUpXCJ9LCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBUbyBpZ25vcmUgYW4gYWN0aW9uLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgcHJldmlvdXMgc3RhdGUuIElmIHlvdSB3YW50IHRoaXMgcmVkdWNlciB0byBob2xkIG5vIHZhbHVlLCB5b3UgY2FuIHJldHVybiBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLmApO1xuICAgICAgfVxuICAgICAgbmV4dFN0YXRlW2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzdGF0ZSkubGVuZ3RoO1xuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7XG4gIH07XG59XG5cbi8vIHNyYy9iaW5kQWN0aW9uQ3JlYXRvcnMudHNcbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IuYXBwbHkodGhpcywgYXJncykpO1xuICB9O1xufVxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzICE9PSBcIm9iamVjdFwiIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogYGJpbmRBY3Rpb25DcmVhdG9ycyBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgYnV0IGluc3RlYWQgcmVjZWl2ZWQ6ICcke2tpbmRPZihhY3Rpb25DcmVhdG9ycyl9Jy4gRGlkIHlvdSB3cml0ZSBcImltcG9ydCBBY3Rpb25DcmVhdG9ycyBmcm9tXCIgaW5zdGVhZCBvZiBcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cIj9gKTtcbiAgfVxuICBjb25zdCBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgY29uc3QgYWN0aW9uQ3JlYXRvciA9IGFjdGlvbkNyZWF0b3JzW2tleV07XG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9IGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8vIHNyYy9jb21wb3NlLnRzXG5mdW5jdGlvbiBjb21wb3NlKC4uLmZ1bmNzKSB7XG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFyZykgPT4gYXJnO1xuICB9XG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZnVuY3NbMF07XG4gIH1cbiAgcmV0dXJuIGZ1bmNzLnJlZHVjZSgoYSwgYikgPT4gKC4uLmFyZ3MpID0+IGEoYiguLi5hcmdzKSkpO1xufVxuXG4vLyBzcmMvYXBwbHlNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoLi4ubWlkZGxld2FyZXMpIHtcbiAgcmV0dXJuIChjcmVhdGVTdG9yZTIpID0+IChyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHN0b3JlID0gY3JlYXRlU3RvcmUyKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgICBsZXQgZGlzcGF0Y2ggPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNSkgOiBcIkRpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuIE90aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC5cIik7XG4gICAgfTtcbiAgICBjb25zdCBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgZGlzcGF0Y2g6IChhY3Rpb24sIC4uLmFyZ3MpID0+IGRpc3BhdGNoKGFjdGlvbiwgLi4uYXJncylcbiAgICB9O1xuICAgIGNvbnN0IGNoYWluID0gbWlkZGxld2FyZXMubWFwKChtaWRkbGV3YXJlKSA9PiBtaWRkbGV3YXJlKG1pZGRsZXdhcmVBUEkpKTtcbiAgICBkaXNwYXRjaCA9IGNvbXBvc2UoLi4uY2hhaW4pKHN0b3JlLmRpc3BhdGNoKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RvcmUsXG4gICAgICBkaXNwYXRjaFxuICAgIH07XG4gIH07XG59XG5cbi8vIHNyYy91dGlscy9pc0FjdGlvbi50c1xuZnVuY3Rpb24gaXNBY3Rpb24oYWN0aW9uKSB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KGFjdGlvbikgJiYgXCJ0eXBlXCIgaW4gYWN0aW9uICYmIHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gXCJzdHJpbmdcIjtcbn1cbmV4cG9ydCB7XG4gIGFjdGlvblR5cGVzX2RlZmF1bHQgYXMgX19ET19OT1RfVVNFX19BY3Rpb25UeXBlcyxcbiAgYXBwbHlNaWRkbGV3YXJlLFxuICBiaW5kQWN0aW9uQ3JlYXRvcnMsXG4gIGNvbWJpbmVSZWR1Y2VycyxcbiAgY29tcG9zZSxcbiAgY3JlYXRlU3RvcmUsXG4gIGlzQWN0aW9uLFxuICBpc1BsYWluT2JqZWN0LFxuICBsZWdhY3lfY3JlYXRlU3RvcmVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1eC5tanMubWFwIiwiLy8gc3JjL3V0aWxzL2Vudi50c1xudmFyIE5PVEhJTkcgPSBTeW1ib2wuZm9yKFwiaW1tZXItbm90aGluZ1wiKTtcbnZhciBEUkFGVEFCTEUgPSBTeW1ib2wuZm9yKFwiaW1tZXItZHJhZnRhYmxlXCIpO1xudmFyIERSQUZUX1NUQVRFID0gU3ltYm9sLmZvcihcImltbWVyLXN0YXRlXCIpO1xuXG4vLyBzcmMvdXRpbHMvZXJyb3JzLnRzXG52YXIgZXJyb3JzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gW1xuICAvLyBBbGwgZXJyb3IgY29kZXMsIHN0YXJ0aW5nIGJ5IDA6XG4gIGZ1bmN0aW9uKHBsdWdpbikge1xuICAgIHJldHVybiBgVGhlIHBsdWdpbiBmb3IgJyR7cGx1Z2lufScgaGFzIG5vdCBiZWVuIGxvYWRlZCBpbnRvIEltbWVyLiBUbyBlbmFibGUgdGhlIHBsdWdpbiwgaW1wb3J0IGFuZCBjYWxsIFxcYGVuYWJsZSR7cGx1Z2lufSgpXFxgIHdoZW4gaW5pdGlhbGl6aW5nIHlvdXIgYXBwbGljYXRpb24uYDtcbiAgfSxcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYHByb2R1Y2UgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHRoaW5ncyB0aGF0IGFyZSBkcmFmdGFibGU6IHBsYWluIG9iamVjdHMsIGFycmF5cywgTWFwLCBTZXQgb3IgY2xhc3NlcyB0aGF0IGFyZSBtYXJrZWQgd2l0aCAnW2ltbWVyYWJsZV06IHRydWUnLiBHb3QgJyR7dGhpbmd9J2A7XG4gIH0sXG4gIFwiVGhpcyBvYmplY3QgaGFzIGJlZW4gZnJvemVuIGFuZCBzaG91bGQgbm90IGJlIG11dGF0ZWRcIixcbiAgZnVuY3Rpb24oZGF0YSkge1xuICAgIHJldHVybiBcIkNhbm5vdCB1c2UgYSBwcm94eSB0aGF0IGhhcyBiZWVuIHJldm9rZWQuIERpZCB5b3UgcGFzcyBhbiBvYmplY3QgZnJvbSBpbnNpZGUgYW4gaW1tZXIgZnVuY3Rpb24gdG8gYW4gYXN5bmMgcHJvY2Vzcz8gXCIgKyBkYXRhO1xuICB9LFxuICBcIkFuIGltbWVyIHByb2R1Y2VyIHJldHVybmVkIGEgbmV3IHZhbHVlICphbmQqIG1vZGlmaWVkIGl0cyBkcmFmdC4gRWl0aGVyIHJldHVybiBhIG5ldyB2YWx1ZSAqb3IqIG1vZGlmeSB0aGUgZHJhZnQuXCIsXG4gIFwiSW1tZXIgZm9yYmlkcyBjaXJjdWxhciByZWZlcmVuY2VzXCIsXG4gIFwiVGhlIGZpcnN0IG9yIHNlY29uZCBhcmd1bWVudCB0byBgcHJvZHVjZWAgbXVzdCBiZSBhIGZ1bmN0aW9uXCIsXG4gIFwiVGhlIHRoaXJkIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdW5kZWZpbmVkXCIsXG4gIFwiRmlyc3QgYXJndW1lbnQgdG8gYGNyZWF0ZURyYWZ0YCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LCBhbiBhcnJheSwgb3IgYW4gaW1tZXJhYmxlIG9iamVjdFwiLFxuICBcIkZpcnN0IGFyZ3VtZW50IHRvIGBmaW5pc2hEcmFmdGAgbXVzdCBiZSBhIGRyYWZ0IHJldHVybmVkIGJ5IGBjcmVhdGVEcmFmdGBcIixcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYCdjdXJyZW50JyBleHBlY3RzIGEgZHJhZnQsIGdvdDogJHt0aGluZ31gO1xuICB9LFxuICBcIk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpIGNhbm5vdCBiZSB1c2VkIG9uIGFuIEltbWVyIGRyYWZ0XCIsXG4gIFwiT2JqZWN0LnNldFByb3RvdHlwZU9mKCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIixcbiAgXCJJbW1lciBvbmx5IHN1cHBvcnRzIGRlbGV0aW5nIGFycmF5IGluZGljZXNcIixcbiAgXCJJbW1lciBvbmx5IHN1cHBvcnRzIHNldHRpbmcgYXJyYXkgaW5kaWNlcyBhbmQgdGhlICdsZW5ndGgnIHByb3BlcnR5XCIsXG4gIGZ1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIGAnb3JpZ2luYWwnIGV4cGVjdHMgYSBkcmFmdCwgZ290OiAke3RoaW5nfWA7XG4gIH1cbiAgLy8gTm90ZTogaWYgbW9yZSBlcnJvcnMgYXJlIGFkZGVkLCB0aGUgZXJyb3JPZmZzZXQgaW4gUGF0Y2hlcy50cyBzaG91bGQgYmUgaW5jcmVhc2VkXG4gIC8vIFNlZSBQYXRjaGVzLnRzIGZvciBhZGRpdGlvbmFsIGVycm9yc1xuXSA6IFtdO1xuZnVuY3Rpb24gZGllKGVycm9yLCAuLi5hcmdzKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zdCBlID0gZXJyb3JzW2Vycm9yXTtcbiAgICBjb25zdCBtc2cgPSB0eXBlb2YgZSA9PT0gXCJmdW5jdGlvblwiID8gZS5hcHBseShudWxsLCBhcmdzKSA6IGU7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbSW1tZXJdICR7bXNnfWApO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgW0ltbWVyXSBtaW5pZmllZCBlcnJvciBucjogJHtlcnJvcn0uIEZ1bGwgZXJyb3IgYXQ6IGh0dHBzOi8vYml0Lmx5LzNjWEVLV2ZgXG4gICk7XG59XG5cbi8vIHNyYy91dGlscy9jb21tb24udHNcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbmZ1bmN0aW9uIGlzRHJhZnQodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgISF2YWx1ZVtEUkFGVF9TVEFURV07XG59XG5mdW5jdGlvbiBpc0RyYWZ0YWJsZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKVxuICAgIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpIHx8ICEhdmFsdWVbRFJBRlRBQkxFXSB8fCAhIXZhbHVlLmNvbnN0cnVjdG9yPy5bRFJBRlRBQkxFXSB8fCBpc01hcCh2YWx1ZSkgfHwgaXNTZXQodmFsdWUpO1xufVxudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCk7XG52YXIgY2FjaGVkQ3RvclN0cmluZ3MgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCB8fCBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgQ3RvciA9IE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCBcImNvbnN0cnVjdG9yXCIpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICBpZiAoQ3RvciA9PT0gT2JqZWN0KVxuICAgIHJldHVybiB0cnVlO1xuICBpZiAodHlwZW9mIEN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGxldCBjdG9yU3RyaW5nID0gY2FjaGVkQ3RvclN0cmluZ3MuZ2V0KEN0b3IpO1xuICBpZiAoY3RvclN0cmluZyA9PT0gdm9pZCAwKSB7XG4gICAgY3RvclN0cmluZyA9IEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoQ3Rvcik7XG4gICAgY2FjaGVkQ3RvclN0cmluZ3Muc2V0KEN0b3IsIGN0b3JTdHJpbmcpO1xuICB9XG4gIHJldHVybiBjdG9yU3RyaW5nID09PSBvYmplY3RDdG9yU3RyaW5nO1xufVxuZnVuY3Rpb24gb3JpZ2luYWwodmFsdWUpIHtcbiAgaWYgKCFpc0RyYWZ0KHZhbHVlKSlcbiAgICBkaWUoMTUsIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlW0RSQUZUX1NUQVRFXS5iYXNlXztcbn1cbmZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyLCBzdHJpY3QgPSB0cnVlKSB7XG4gIGlmIChnZXRBcmNodHlwZShvYmopID09PSAwIC8qIE9iamVjdCAqLykge1xuICAgIGNvbnN0IGtleXMgPSBzdHJpY3QgPyBSZWZsZWN0Lm93bktleXMob2JqKSA6IE9iamVjdC5rZXlzKG9iaik7XG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGl0ZXIoa2V5LCBvYmpba2V5XSwgb2JqKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmouZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiBpdGVyKGluZGV4LCBlbnRyeSwgb2JqKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEFyY2h0eXBlKHRoaW5nKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpbmdbRFJBRlRfU1RBVEVdO1xuICByZXR1cm4gc3RhdGUgPyBzdGF0ZS50eXBlXyA6IEFycmF5LmlzQXJyYXkodGhpbmcpID8gMSAvKiBBcnJheSAqLyA6IGlzTWFwKHRoaW5nKSA/IDIgLyogTWFwICovIDogaXNTZXQodGhpbmcpID8gMyAvKiBTZXQgKi8gOiAwIC8qIE9iamVjdCAqLztcbn1cbmZ1bmN0aW9uIGhhcyh0aGluZywgcHJvcCkge1xuICByZXR1cm4gZ2V0QXJjaHR5cGUodGhpbmcpID09PSAyIC8qIE1hcCAqLyA/IHRoaW5nLmhhcyhwcm9wKSA6IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGluZywgcHJvcCk7XG59XG5mdW5jdGlvbiBnZXQodGhpbmcsIHByb3ApIHtcbiAgcmV0dXJuIGdldEFyY2h0eXBlKHRoaW5nKSA9PT0gMiAvKiBNYXAgKi8gPyB0aGluZy5nZXQocHJvcCkgOiB0aGluZ1twcm9wXTtcbn1cbmZ1bmN0aW9uIHNldCh0aGluZywgcHJvcE9yT2xkVmFsdWUsIHZhbHVlKSB7XG4gIGNvbnN0IHQgPSBnZXRBcmNodHlwZSh0aGluZyk7XG4gIGlmICh0ID09PSAyIC8qIE1hcCAqLylcbiAgICB0aGluZy5zZXQocHJvcE9yT2xkVmFsdWUsIHZhbHVlKTtcbiAgZWxzZSBpZiAodCA9PT0gMyAvKiBTZXQgKi8pIHtcbiAgICB0aGluZy5hZGQodmFsdWUpO1xuICB9IGVsc2VcbiAgICB0aGluZ1twcm9wT3JPbGRWYWx1ZV0gPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuZnVuY3Rpb24gaXNNYXAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBNYXA7XG59XG5mdW5jdGlvbiBpc1NldCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFNldDtcbn1cbmZ1bmN0aW9uIGxhdGVzdChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuY29weV8gfHwgc3RhdGUuYmFzZV87XG59XG5mdW5jdGlvbiBzaGFsbG93Q29weShiYXNlLCBzdHJpY3QpIHtcbiAgaWYgKGlzTWFwKGJhc2UpKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoYmFzZSk7XG4gIH1cbiAgaWYgKGlzU2V0KGJhc2UpKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoYmFzZSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYmFzZSkpXG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJhc2UpO1xuICBjb25zdCBpc1BsYWluID0gaXNQbGFpbk9iamVjdChiYXNlKTtcbiAgaWYgKHN0cmljdCA9PT0gdHJ1ZSB8fCBzdHJpY3QgPT09IFwiY2xhc3Nfb25seVwiICYmICFpc1BsYWluKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhiYXNlKTtcbiAgICBkZWxldGUgZGVzY3JpcHRvcnNbRFJBRlRfU1RBVEVdO1xuICAgIGxldCBrZXlzID0gUmVmbGVjdC5vd25LZXlzKGRlc2NyaXB0b3JzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBjb25zdCBkZXNjID0gZGVzY3JpcHRvcnNba2V5XTtcbiAgICAgIGlmIChkZXNjLndyaXRhYmxlID09PSBmYWxzZSkge1xuICAgICAgICBkZXNjLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KVxuICAgICAgICBkZXNjcmlwdG9yc1trZXldID0ge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAvLyBjb3VsZCBsaXZlIHdpdGggISFkZXNjLnNldCBhcyB3ZWxsIGhlcmUuLi5cbiAgICAgICAgICBlbnVtZXJhYmxlOiBkZXNjLmVudW1lcmFibGUsXG4gICAgICAgICAgdmFsdWU6IGJhc2Vba2V5XVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnZXRQcm90b3R5cGVPZihiYXNlKSwgZGVzY3JpcHRvcnMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YoYmFzZSk7XG4gICAgaWYgKHByb3RvICE9PSBudWxsICYmIGlzUGxhaW4pIHtcbiAgICAgIHJldHVybiB7IC4uLmJhc2UgfTtcbiAgICB9XG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShwcm90byk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2JqLCBiYXNlKTtcbiAgfVxufVxuZnVuY3Rpb24gZnJlZXplKG9iaiwgZGVlcCA9IGZhbHNlKSB7XG4gIGlmIChpc0Zyb3plbihvYmopIHx8IGlzRHJhZnQob2JqKSB8fCAhaXNEcmFmdGFibGUob2JqKSlcbiAgICByZXR1cm4gb2JqO1xuICBpZiAoZ2V0QXJjaHR5cGUob2JqKSA+IDEpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHtcbiAgICAgIHNldDogZG9udE11dGF0ZU1ldGhvZE92ZXJyaWRlLFxuICAgICAgYWRkOiBkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGUsXG4gICAgICBjbGVhcjogZG9udE11dGF0ZU1ldGhvZE92ZXJyaWRlLFxuICAgICAgZGVsZXRlOiBkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGVcbiAgICB9KTtcbiAgfVxuICBPYmplY3QuZnJlZXplKG9iaik7XG4gIGlmIChkZWVwKVxuICAgIE9iamVjdC52YWx1ZXMob2JqKS5mb3JFYWNoKCh2YWx1ZSkgPT4gZnJlZXplKHZhbHVlLCB0cnVlKSk7XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBkb250TXV0YXRlRnJvemVuQ29sbGVjdGlvbnMoKSB7XG4gIGRpZSgyKTtcbn1cbnZhciBkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGUgPSB7XG4gIHZhbHVlOiBkb250TXV0YXRlRnJvemVuQ29sbGVjdGlvbnNcbn07XG5mdW5jdGlvbiBpc0Zyb3plbihvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gT2JqZWN0LmlzRnJvemVuKG9iaik7XG59XG5cbi8vIHNyYy91dGlscy9wbHVnaW5zLnRzXG52YXIgcGx1Z2lucyA9IHt9O1xuZnVuY3Rpb24gZ2V0UGx1Z2luKHBsdWdpbktleSkge1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zW3BsdWdpbktleV07XG4gIGlmICghcGx1Z2luKSB7XG4gICAgZGllKDAsIHBsdWdpbktleSk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbjtcbn1cbmZ1bmN0aW9uIGxvYWRQbHVnaW4ocGx1Z2luS2V5LCBpbXBsZW1lbnRhdGlvbikge1xuICBpZiAoIXBsdWdpbnNbcGx1Z2luS2V5XSlcbiAgICBwbHVnaW5zW3BsdWdpbktleV0gPSBpbXBsZW1lbnRhdGlvbjtcbn1cblxuLy8gc3JjL2NvcmUvc2NvcGUudHNcbnZhciBjdXJyZW50U2NvcGU7XG5mdW5jdGlvbiBnZXRDdXJyZW50U2NvcGUoKSB7XG4gIHJldHVybiBjdXJyZW50U2NvcGU7XG59XG5mdW5jdGlvbiBjcmVhdGVTY29wZShwYXJlbnRfLCBpbW1lcl8pIHtcbiAgcmV0dXJuIHtcbiAgICBkcmFmdHNfOiBbXSxcbiAgICBwYXJlbnRfLFxuICAgIGltbWVyXyxcbiAgICAvLyBXaGVuZXZlciB0aGUgbW9kaWZpZWQgZHJhZnQgY29udGFpbnMgYSBkcmFmdCBmcm9tIGFub3RoZXIgc2NvcGUsIHdlXG4gICAgLy8gbmVlZCB0byBwcmV2ZW50IGF1dG8tZnJlZXppbmcgc28gdGhlIHVub3duZWQgZHJhZnQgY2FuIGJlIGZpbmFsaXplZC5cbiAgICBjYW5BdXRvRnJlZXplXzogdHJ1ZSxcbiAgICB1bmZpbmFsaXplZERyYWZ0c186IDBcbiAgfTtcbn1cbmZ1bmN0aW9uIHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKSB7XG4gIGlmIChwYXRjaExpc3RlbmVyKSB7XG4gICAgZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKTtcbiAgICBzY29wZS5wYXRjaGVzXyA9IFtdO1xuICAgIHNjb3BlLmludmVyc2VQYXRjaGVzXyA9IFtdO1xuICAgIHNjb3BlLnBhdGNoTGlzdGVuZXJfID0gcGF0Y2hMaXN0ZW5lcjtcbiAgfVxufVxuZnVuY3Rpb24gcmV2b2tlU2NvcGUoc2NvcGUpIHtcbiAgbGVhdmVTY29wZShzY29wZSk7XG4gIHNjb3BlLmRyYWZ0c18uZm9yRWFjaChyZXZva2VEcmFmdCk7XG4gIHNjb3BlLmRyYWZ0c18gPSBudWxsO1xufVxuZnVuY3Rpb24gbGVhdmVTY29wZShzY29wZSkge1xuICBpZiAoc2NvcGUgPT09IGN1cnJlbnRTY29wZSkge1xuICAgIGN1cnJlbnRTY29wZSA9IHNjb3BlLnBhcmVudF87XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGVyU2NvcGUoaW1tZXIyKSB7XG4gIHJldHVybiBjdXJyZW50U2NvcGUgPSBjcmVhdGVTY29wZShjdXJyZW50U2NvcGUsIGltbWVyMik7XG59XG5mdW5jdGlvbiByZXZva2VEcmFmdChkcmFmdCkge1xuICBjb25zdCBzdGF0ZSA9IGRyYWZ0W0RSQUZUX1NUQVRFXTtcbiAgaWYgKHN0YXRlLnR5cGVfID09PSAwIC8qIE9iamVjdCAqLyB8fCBzdGF0ZS50eXBlXyA9PT0gMSAvKiBBcnJheSAqLylcbiAgICBzdGF0ZS5yZXZva2VfKCk7XG4gIGVsc2VcbiAgICBzdGF0ZS5yZXZva2VkXyA9IHRydWU7XG59XG5cbi8vIHNyYy9jb3JlL2ZpbmFsaXplLnRzXG5mdW5jdGlvbiBwcm9jZXNzUmVzdWx0KHJlc3VsdCwgc2NvcGUpIHtcbiAgc2NvcGUudW5maW5hbGl6ZWREcmFmdHNfID0gc2NvcGUuZHJhZnRzXy5sZW5ndGg7XG4gIGNvbnN0IGJhc2VEcmFmdCA9IHNjb3BlLmRyYWZ0c19bMF07XG4gIGNvbnN0IGlzUmVwbGFjZWQgPSByZXN1bHQgIT09IHZvaWQgMCAmJiByZXN1bHQgIT09IGJhc2VEcmFmdDtcbiAgaWYgKGlzUmVwbGFjZWQpIHtcbiAgICBpZiAoYmFzZURyYWZ0W0RSQUZUX1NUQVRFXS5tb2RpZmllZF8pIHtcbiAgICAgIHJldm9rZVNjb3BlKHNjb3BlKTtcbiAgICAgIGRpZSg0KTtcbiAgICB9XG4gICAgaWYgKGlzRHJhZnRhYmxlKHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdCA9IGZpbmFsaXplKHNjb3BlLCByZXN1bHQpO1xuICAgICAgaWYgKCFzY29wZS5wYXJlbnRfKVxuICAgICAgICBtYXliZUZyZWV6ZShzY29wZSwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKHNjb3BlLnBhdGNoZXNfKSB7XG4gICAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhcbiAgICAgICAgYmFzZURyYWZ0W0RSQUZUX1NUQVRFXS5iYXNlXyxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBzY29wZS5wYXRjaGVzXyxcbiAgICAgICAgc2NvcGUuaW52ZXJzZVBhdGNoZXNfXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBmaW5hbGl6ZShzY29wZSwgYmFzZURyYWZ0LCBbXSk7XG4gIH1cbiAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICBpZiAoc2NvcGUucGF0Y2hlc18pIHtcbiAgICBzY29wZS5wYXRjaExpc3RlbmVyXyhzY29wZS5wYXRjaGVzXywgc2NvcGUuaW52ZXJzZVBhdGNoZXNfKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0ICE9PSBOT1RISU5HID8gcmVzdWx0IDogdm9pZCAwO1xufVxuZnVuY3Rpb24gZmluYWxpemUocm9vdFNjb3BlLCB2YWx1ZSwgcGF0aCkge1xuICBpZiAoaXNGcm96ZW4odmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgdXNlU3RyaWN0SXRlcmF0aW9uID0gcm9vdFNjb3BlLmltbWVyXy5zaG91bGRVc2VTdHJpY3RJdGVyYXRpb24oKTtcbiAgY29uc3Qgc3RhdGUgPSB2YWx1ZVtEUkFGVF9TVEFURV07XG4gIGlmICghc3RhdGUpIHtcbiAgICBlYWNoKFxuICAgICAgdmFsdWUsXG4gICAgICAoa2V5LCBjaGlsZFZhbHVlKSA9PiBmaW5hbGl6ZVByb3BlcnR5KHJvb3RTY29wZSwgc3RhdGUsIHZhbHVlLCBrZXksIGNoaWxkVmFsdWUsIHBhdGgpLFxuICAgICAgdXNlU3RyaWN0SXRlcmF0aW9uXG4gICAgKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKHN0YXRlLnNjb3BlXyAhPT0gcm9vdFNjb3BlKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pIHtcbiAgICBtYXliZUZyZWV6ZShyb290U2NvcGUsIHN0YXRlLmJhc2VfLCB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGUuYmFzZV87XG4gIH1cbiAgaWYgKCFzdGF0ZS5maW5hbGl6ZWRfKSB7XG4gICAgc3RhdGUuZmluYWxpemVkXyA9IHRydWU7XG4gICAgc3RhdGUuc2NvcGVfLnVuZmluYWxpemVkRHJhZnRzXy0tO1xuICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLmNvcHlfO1xuICAgIGxldCByZXN1bHRFYWNoID0gcmVzdWx0O1xuICAgIGxldCBpc1NldDIgPSBmYWxzZTtcbiAgICBpZiAoc3RhdGUudHlwZV8gPT09IDMgLyogU2V0ICovKSB7XG4gICAgICByZXN1bHRFYWNoID0gbmV3IFNldChyZXN1bHQpO1xuICAgICAgcmVzdWx0LmNsZWFyKCk7XG4gICAgICBpc1NldDIgPSB0cnVlO1xuICAgIH1cbiAgICBlYWNoKFxuICAgICAgcmVzdWx0RWFjaCxcbiAgICAgIChrZXksIGNoaWxkVmFsdWUpID0+IGZpbmFsaXplUHJvcGVydHkoXG4gICAgICAgIHJvb3RTY29wZSxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAga2V5LFxuICAgICAgICBjaGlsZFZhbHVlLFxuICAgICAgICBwYXRoLFxuICAgICAgICBpc1NldDJcbiAgICAgICksXG4gICAgICB1c2VTdHJpY3RJdGVyYXRpb25cbiAgICApO1xuICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgcmVzdWx0LCBmYWxzZSk7XG4gICAgaWYgKHBhdGggJiYgcm9vdFNjb3BlLnBhdGNoZXNfKSB7XG4gICAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUGF0Y2hlc18oXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwYXRoLFxuICAgICAgICByb290U2NvcGUucGF0Y2hlc18sXG4gICAgICAgIHJvb3RTY29wZS5pbnZlcnNlUGF0Y2hlc19cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGF0ZS5jb3B5Xztcbn1cbmZ1bmN0aW9uIGZpbmFsaXplUHJvcGVydHkocm9vdFNjb3BlLCBwYXJlbnRTdGF0ZSwgdGFyZ2V0T2JqZWN0LCBwcm9wLCBjaGlsZFZhbHVlLCByb290UGF0aCwgdGFyZ2V0SXNTZXQpIHtcbiAgaWYgKGNoaWxkVmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHlwZW9mIGNoaWxkVmFsdWUgIT09IFwib2JqZWN0XCIgJiYgIXRhcmdldElzU2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGNoaWxkSXNGcm96ZW4gPSBpc0Zyb3plbihjaGlsZFZhbHVlKTtcbiAgaWYgKGNoaWxkSXNGcm96ZW4gJiYgIXRhcmdldElzU2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgY2hpbGRWYWx1ZSA9PT0gdGFyZ2V0T2JqZWN0KVxuICAgIGRpZSg1KTtcbiAgaWYgKGlzRHJhZnQoY2hpbGRWYWx1ZSkpIHtcbiAgICBjb25zdCBwYXRoID0gcm9vdFBhdGggJiYgcGFyZW50U3RhdGUgJiYgcGFyZW50U3RhdGUudHlwZV8gIT09IDMgLyogU2V0ICovICYmIC8vIFNldCBvYmplY3RzIGFyZSBhdG9taWMgc2luY2UgdGhleSBoYXZlIG5vIGtleXMuXG4gICAgIWhhcyhwYXJlbnRTdGF0ZS5hc3NpZ25lZF8sIHByb3ApID8gcm9vdFBhdGguY29uY2F0KHByb3ApIDogdm9pZCAwO1xuICAgIGNvbnN0IHJlcyA9IGZpbmFsaXplKHJvb3RTY29wZSwgY2hpbGRWYWx1ZSwgcGF0aCk7XG4gICAgc2V0KHRhcmdldE9iamVjdCwgcHJvcCwgcmVzKTtcbiAgICBpZiAoaXNEcmFmdChyZXMpKSB7XG4gICAgICByb290U2NvcGUuY2FuQXV0b0ZyZWV6ZV8gPSBmYWxzZTtcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0YXJnZXRJc1NldCkge1xuICAgIHRhcmdldE9iamVjdC5hZGQoY2hpbGRWYWx1ZSk7XG4gIH1cbiAgaWYgKGlzRHJhZnRhYmxlKGNoaWxkVmFsdWUpICYmICFjaGlsZElzRnJvemVuKSB7XG4gICAgaWYgKCFyb290U2NvcGUuaW1tZXJfLmF1dG9GcmVlemVfICYmIHJvb3RTY29wZS51bmZpbmFsaXplZERyYWZ0c18gPCAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwYXJlbnRTdGF0ZSAmJiBwYXJlbnRTdGF0ZS5iYXNlXyAmJiBwYXJlbnRTdGF0ZS5iYXNlX1twcm9wXSA9PT0gY2hpbGRWYWx1ZSAmJiBjaGlsZElzRnJvemVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpbmFsaXplKHJvb3RTY29wZSwgY2hpbGRWYWx1ZSk7XG4gICAgaWYgKCghcGFyZW50U3RhdGUgfHwgIXBhcmVudFN0YXRlLnNjb3BlXy5wYXJlbnRfKSAmJiB0eXBlb2YgcHJvcCAhPT0gXCJzeW1ib2xcIiAmJiAoaXNNYXAodGFyZ2V0T2JqZWN0KSA/IHRhcmdldE9iamVjdC5oYXMocHJvcCkgOiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodGFyZ2V0T2JqZWN0LCBwcm9wKSkpXG4gICAgICBtYXliZUZyZWV6ZShyb290U2NvcGUsIGNoaWxkVmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiBtYXliZUZyZWV6ZShzY29wZSwgdmFsdWUsIGRlZXAgPSBmYWxzZSkge1xuICBpZiAoIXNjb3BlLnBhcmVudF8gJiYgc2NvcGUuaW1tZXJfLmF1dG9GcmVlemVfICYmIHNjb3BlLmNhbkF1dG9GcmVlemVfKSB7XG4gICAgZnJlZXplKHZhbHVlLCBkZWVwKTtcbiAgfVxufVxuXG4vLyBzcmMvY29yZS9wcm94eS50c1xuZnVuY3Rpb24gY3JlYXRlUHJveHlQcm94eShiYXNlLCBwYXJlbnQpIHtcbiAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYmFzZSk7XG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIHR5cGVfOiBpc0FycmF5ID8gMSAvKiBBcnJheSAqLyA6IDAgLyogT2JqZWN0ICovLFxuICAgIC8vIFRyYWNrIHdoaWNoIHByb2R1Y2UgY2FsbCB0aGlzIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAvLyBUcnVlIGZvciBib3RoIHNoYWxsb3cgYW5kIGRlZXAgY2hhbmdlcy5cbiAgICBtb2RpZmllZF86IGZhbHNlLFxuICAgIC8vIFVzZWQgZHVyaW5nIGZpbmFsaXphdGlvbi5cbiAgICBmaW5hbGl6ZWRfOiBmYWxzZSxcbiAgICAvLyBUcmFjayB3aGljaCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBhc3NpZ25lZCAodHJ1ZSkgb3IgZGVsZXRlZCAoZmFsc2UpLlxuICAgIGFzc2lnbmVkXzoge30sXG4gICAgLy8gVGhlIHBhcmVudCBkcmFmdCBzdGF0ZS5cbiAgICBwYXJlbnRfOiBwYXJlbnQsXG4gICAgLy8gVGhlIGJhc2Ugc3RhdGUuXG4gICAgYmFzZV86IGJhc2UsXG4gICAgLy8gVGhlIGJhc2UgcHJveHkuXG4gICAgZHJhZnRfOiBudWxsLFxuICAgIC8vIHNldCBiZWxvd1xuICAgIC8vIFRoZSBiYXNlIGNvcHkgd2l0aCBhbnkgdXBkYXRlZCB2YWx1ZXMuXG4gICAgY29weV86IG51bGwsXG4gICAgLy8gQ2FsbGVkIGJ5IHRoZSBgcHJvZHVjZWAgZnVuY3Rpb24uXG4gICAgcmV2b2tlXzogbnVsbCxcbiAgICBpc01hbnVhbF86IGZhbHNlXG4gIH07XG4gIGxldCB0YXJnZXQgPSBzdGF0ZTtcbiAgbGV0IHRyYXBzID0gb2JqZWN0VHJhcHM7XG4gIGlmIChpc0FycmF5KSB7XG4gICAgdGFyZ2V0ID0gW3N0YXRlXTtcbiAgICB0cmFwcyA9IGFycmF5VHJhcHM7XG4gIH1cbiAgY29uc3QgeyByZXZva2UsIHByb3h5IH0gPSBQcm94eS5yZXZvY2FibGUodGFyZ2V0LCB0cmFwcyk7XG4gIHN0YXRlLmRyYWZ0XyA9IHByb3h5O1xuICBzdGF0ZS5yZXZva2VfID0gcmV2b2tlO1xuICByZXR1cm4gcHJveHk7XG59XG52YXIgb2JqZWN0VHJhcHMgPSB7XG4gIGdldChzdGF0ZSwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBEUkFGVF9TVEFURSlcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICBjb25zdCBzb3VyY2UgPSBsYXRlc3Qoc3RhdGUpO1xuICAgIGlmICghaGFzKHNvdXJjZSwgcHJvcCkpIHtcbiAgICAgIHJldHVybiByZWFkUHJvcEZyb21Qcm90byhzdGF0ZSwgc291cmNlLCBwcm9wKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbcHJvcF07XG4gICAgaWYgKHN0YXRlLmZpbmFsaXplZF8gfHwgIWlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHBlZWsoc3RhdGUuYmFzZV8sIHByb3ApKSB7XG4gICAgICBwcmVwYXJlQ29weShzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV9bcHJvcF0gPSBjcmVhdGVQcm94eSh2YWx1ZSwgc3RhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG4gIGhhcyhzdGF0ZSwgcHJvcCkge1xuICAgIHJldHVybiBwcm9wIGluIGxhdGVzdChzdGF0ZSk7XG4gIH0sXG4gIG93bktleXMoc3RhdGUpIHtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKGxhdGVzdChzdGF0ZSkpO1xuICB9LFxuICBzZXQoc3RhdGUsIHByb3AsIHZhbHVlKSB7XG4gICAgY29uc3QgZGVzYyA9IGdldERlc2NyaXB0b3JGcm9tUHJvdG8obGF0ZXN0KHN0YXRlKSwgcHJvcCk7XG4gICAgaWYgKGRlc2M/LnNldCkge1xuICAgICAgZGVzYy5zZXQuY2FsbChzdGF0ZS5kcmFmdF8sIHZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuICAgICAgY29uc3QgY3VycmVudDIgPSBwZWVrKGxhdGVzdChzdGF0ZSksIHByb3ApO1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gY3VycmVudDI/LltEUkFGVF9TVEFURV07XG4gICAgICBpZiAoY3VycmVudFN0YXRlICYmIGN1cnJlbnRTdGF0ZS5iYXNlXyA9PT0gdmFsdWUpIHtcbiAgICAgICAgc3RhdGUuY29weV9bcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfW3Byb3BdID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzKHZhbHVlLCBjdXJyZW50MikgJiYgKHZhbHVlICE9PSB2b2lkIDAgfHwgaGFzKHN0YXRlLmJhc2VfLCBwcm9wKSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY29weV9bcHJvcF0gPT09IHZhbHVlICYmIC8vIHNwZWNpYWwgY2FzZTogaGFuZGxlIG5ldyBwcm9wcyB3aXRoIHZhbHVlICd1bmRlZmluZWQnXG4gICAgKHZhbHVlICE9PSB2b2lkIDAgfHwgcHJvcCBpbiBzdGF0ZS5jb3B5XykgfHwgLy8gc3BlY2lhbCBjYXNlOiBOYU5cbiAgICBOdW1iZXIuaXNOYU4odmFsdWUpICYmIE51bWJlci5pc05hTihzdGF0ZS5jb3B5X1twcm9wXSkpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBzdGF0ZS5jb3B5X1twcm9wXSA9IHZhbHVlO1xuICAgIHN0YXRlLmFzc2lnbmVkX1twcm9wXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KHN0YXRlLCBwcm9wKSB7XG4gICAgaWYgKHBlZWsoc3RhdGUuYmFzZV8sIHByb3ApICE9PSB2b2lkIDAgfHwgcHJvcCBpbiBzdGF0ZS5iYXNlXykge1xuICAgICAgc3RhdGUuYXNzaWduZWRfW3Byb3BdID0gZmFsc2U7XG4gICAgICBwcmVwYXJlQ29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBzdGF0ZS5hc3NpZ25lZF9bcHJvcF07XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3B5Xykge1xuICAgICAgZGVsZXRlIHN0YXRlLmNvcHlfW3Byb3BdO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gTm90ZTogV2UgbmV2ZXIgY29lcmNlIGBkZXNjLnZhbHVlYCBpbnRvIGFuIEltbWVyIGRyYWZ0LCBiZWNhdXNlIHdlIGNhbid0IG1ha2VcbiAgLy8gdGhlIHNhbWUgZ3VhcmFudGVlIGluIEVTNSBtb2RlLlxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3RhdGUsIHByb3ApIHtcbiAgICBjb25zdCBvd25lciA9IGxhdGVzdChzdGF0ZSk7XG4gICAgY29uc3QgZGVzYyA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG93bmVyLCBwcm9wKTtcbiAgICBpZiAoIWRlc2MpXG4gICAgICByZXR1cm4gZGVzYztcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHN0YXRlLnR5cGVfICE9PSAxIC8qIEFycmF5ICovIHx8IHByb3AgIT09IFwibGVuZ3RoXCIsXG4gICAgICBlbnVtZXJhYmxlOiBkZXNjLmVudW1lcmFibGUsXG4gICAgICB2YWx1ZTogb3duZXJbcHJvcF1cbiAgICB9O1xuICB9LFxuICBkZWZpbmVQcm9wZXJ0eSgpIHtcbiAgICBkaWUoMTEpO1xuICB9LFxuICBnZXRQcm90b3R5cGVPZihzdGF0ZSkge1xuICAgIHJldHVybiBnZXRQcm90b3R5cGVPZihzdGF0ZS5iYXNlXyk7XG4gIH0sXG4gIHNldFByb3RvdHlwZU9mKCkge1xuICAgIGRpZSgxMik7XG4gIH1cbn07XG52YXIgYXJyYXlUcmFwcyA9IHt9O1xuZWFjaChvYmplY3RUcmFwcywgKGtleSwgZm4pID0+IHtcbiAgYXJyYXlUcmFwc1trZXldID0gZnVuY3Rpb24oKSB7XG4gICAgYXJndW1lbnRzWzBdID0gYXJndW1lbnRzWzBdWzBdO1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSk7XG5hcnJheVRyYXBzLmRlbGV0ZVByb3BlcnR5ID0gZnVuY3Rpb24oc3RhdGUsIHByb3ApIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBpc05hTihwYXJzZUludChwcm9wKSkpXG4gICAgZGllKDEzKTtcbiAgcmV0dXJuIGFycmF5VHJhcHMuc2V0LmNhbGwodGhpcywgc3RhdGUsIHByb3AsIHZvaWQgMCk7XG59O1xuYXJyYXlUcmFwcy5zZXQgPSBmdW5jdGlvbihzdGF0ZSwgcHJvcCwgdmFsdWUpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBwcm9wICE9PSBcImxlbmd0aFwiICYmIGlzTmFOKHBhcnNlSW50KHByb3ApKSlcbiAgICBkaWUoMTQpO1xuICByZXR1cm4gb2JqZWN0VHJhcHMuc2V0LmNhbGwodGhpcywgc3RhdGVbMF0sIHByb3AsIHZhbHVlLCBzdGF0ZVswXSk7XG59O1xuZnVuY3Rpb24gcGVlayhkcmFmdCwgcHJvcCkge1xuICBjb25zdCBzdGF0ZSA9IGRyYWZ0W0RSQUZUX1NUQVRFXTtcbiAgY29uc3Qgc291cmNlID0gc3RhdGUgPyBsYXRlc3Qoc3RhdGUpIDogZHJhZnQ7XG4gIHJldHVybiBzb3VyY2VbcHJvcF07XG59XG5mdW5jdGlvbiByZWFkUHJvcEZyb21Qcm90byhzdGF0ZSwgc291cmNlLCBwcm9wKSB7XG4gIGNvbnN0IGRlc2MgPSBnZXREZXNjcmlwdG9yRnJvbVByb3RvKHNvdXJjZSwgcHJvcCk7XG4gIHJldHVybiBkZXNjID8gYHZhbHVlYCBpbiBkZXNjID8gZGVzYy52YWx1ZSA6IChcbiAgICAvLyBUaGlzIGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UsIGlmIHRoZSBwcm9wIGlzIGEgZ2V0dGVyIGRlZmluZWQgYnkgdGhlXG4gICAgLy8gcHJvdG90eXBlLCB3ZSBzaG91bGQgaW52b2tlIGl0IHdpdGggdGhlIGRyYWZ0IGFzIGNvbnRleHQhXG4gICAgZGVzYy5nZXQ/LmNhbGwoc3RhdGUuZHJhZnRfKVxuICApIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhzb3VyY2UsIHByb3ApIHtcbiAgaWYgKCEocHJvcCBpbiBzb3VyY2UpKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGxldCBwcm90byA9IGdldFByb3RvdHlwZU9mKHNvdXJjZSk7XG4gIHdoaWxlIChwcm90bykge1xuICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBwcm9wKTtcbiAgICBpZiAoZGVzYylcbiAgICAgIHJldHVybiBkZXNjO1xuICAgIHByb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiB2b2lkIDA7XG59XG5mdW5jdGlvbiBtYXJrQ2hhbmdlZChzdGF0ZSkge1xuICBpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuICAgIHN0YXRlLm1vZGlmaWVkXyA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnBhcmVudF8pIHtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlLnBhcmVudF8pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZUNvcHkoc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgIHN0YXRlLmNvcHlfID0gc2hhbGxvd0NvcHkoXG4gICAgICBzdGF0ZS5iYXNlXyxcbiAgICAgIHN0YXRlLnNjb3BlXy5pbW1lcl8udXNlU3RyaWN0U2hhbGxvd0NvcHlfXG4gICAgKTtcbiAgfVxufVxuXG4vLyBzcmMvY29yZS9pbW1lckNsYXNzLnRzXG52YXIgSW1tZXIyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmF1dG9GcmVlemVfID0gdHJ1ZTtcbiAgICB0aGlzLnVzZVN0cmljdFNoYWxsb3dDb3B5XyA9IGZhbHNlO1xuICAgIHRoaXMudXNlU3RyaWN0SXRlcmF0aW9uXyA9IHRydWU7XG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9kdWNlYCBmdW5jdGlvbiB0YWtlcyBhIHZhbHVlIGFuZCBhIFwicmVjaXBlIGZ1bmN0aW9uXCIgKHdob3NlXG4gICAgICogcmV0dXJuIHZhbHVlIG9mdGVuIGRlcGVuZHMgb24gdGhlIGJhc2Ugc3RhdGUpLiBUaGUgcmVjaXBlIGZ1bmN0aW9uIGlzXG4gICAgICogZnJlZSB0byBtdXRhdGUgaXRzIGZpcnN0IGFyZ3VtZW50IGhvd2V2ZXIgaXQgd2FudHMuIEFsbCBtdXRhdGlvbnMgYXJlXG4gICAgICogb25seSBldmVyIGFwcGxpZWQgdG8gYSBfX2NvcHlfXyBvZiB0aGUgYmFzZSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIFBhc3Mgb25seSBhIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFwiY3VycmllZCBwcm9kdWNlclwiIHdoaWNoIHJlbGlldmVzIHlvdVxuICAgICAqIGZyb20gcGFzc2luZyB0aGUgcmVjaXBlIGZ1bmN0aW9uIGV2ZXJ5IHRpbWUuXG4gICAgICpcbiAgICAgKiBPbmx5IHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyBhcmUgbWFkZSBtdXRhYmxlLiBBbGwgb3RoZXIgb2JqZWN0cyBhcmVcbiAgICAgKiBjb25zaWRlcmVkIHVuY29weWFibGUuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIF9fYm91bmRfXyB0byBpdHMgYEltbWVyYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YW55fSBiYXNlIC0gdGhlIGluaXRpYWwgc3RhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWNpcGUgLSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgcHJveHkgb2YgdGhlIGJhc2Ugc3RhdGUgYXMgZmlyc3QgYXJndW1lbnQgYW5kIHdoaWNoIGNhbiBiZSBmcmVlbHkgbW9kaWZpZWRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXRjaExpc3RlbmVyIC0gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFsbCB0aGUgcGF0Y2hlcyBwcm9kdWNlZCBoZXJlXG4gICAgICogQHJldHVybnMge2FueX0gYSBuZXcgc3RhdGUsIG9yIHRoZSBpbml0aWFsIHN0YXRlIGlmIG5vdGhpbmcgd2FzIG1vZGlmaWVkXG4gICAgICovXG4gICAgdGhpcy5wcm9kdWNlID0gKGJhc2UsIHJlY2lwZSwgcGF0Y2hMaXN0ZW5lcikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBiYXNlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHJlY2lwZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRCYXNlID0gcmVjaXBlO1xuICAgICAgICByZWNpcGUgPSBiYXNlO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGN1cnJpZWRQcm9kdWNlKGJhc2UyID0gZGVmYXVsdEJhc2UsIC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5wcm9kdWNlKGJhc2UyLCAoZHJhZnQpID0+IHJlY2lwZS5jYWxsKHRoaXMsIGRyYWZ0LCAuLi5hcmdzKSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlY2lwZSAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBkaWUoNik7XG4gICAgICBpZiAocGF0Y2hMaXN0ZW5lciAhPT0gdm9pZCAwICYmIHR5cGVvZiBwYXRjaExpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGRpZSg3KTtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICBpZiAoaXNEcmFmdGFibGUoYmFzZSkpIHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBlbnRlclNjb3BlKHRoaXMpO1xuICAgICAgICBjb25zdCBwcm94eSA9IGNyZWF0ZVByb3h5KGJhc2UsIHZvaWQgMCk7XG4gICAgICAgIGxldCBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVjaXBlKHByb3h5KTtcbiAgICAgICAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChoYXNFcnJvcilcbiAgICAgICAgICAgIHJldm9rZVNjb3BlKHNjb3BlKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZWF2ZVNjb3BlKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICB1c2VQYXRjaGVzSW5TY29wZShzY29wZSwgcGF0Y2hMaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBwcm9jZXNzUmVzdWx0KHJlc3VsdCwgc2NvcGUpO1xuICAgICAgfSBlbHNlIGlmICghYmFzZSB8fCB0eXBlb2YgYmFzZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXN1bHQgPSByZWNpcGUoYmFzZSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMClcbiAgICAgICAgICByZXN1bHQgPSBiYXNlO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBOT1RISU5HKVxuICAgICAgICAgIHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0ZyZWV6ZV8pXG4gICAgICAgICAgZnJlZXplKHJlc3VsdCwgdHJ1ZSk7XG4gICAgICAgIGlmIChwYXRjaExpc3RlbmVyKSB7XG4gICAgICAgICAgY29uc3QgcCA9IFtdO1xuICAgICAgICAgIGNvbnN0IGlwID0gW107XG4gICAgICAgICAgZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5nZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18oYmFzZSwgcmVzdWx0LCBwLCBpcCk7XG4gICAgICAgICAgcGF0Y2hMaXN0ZW5lcihwLCBpcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gZWxzZVxuICAgICAgICBkaWUoMSwgYmFzZSk7XG4gICAgfTtcbiAgICB0aGlzLnByb2R1Y2VXaXRoUGF0Y2hlcyA9IChiYXNlLCByZWNpcGUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiAoc3RhdGUsIC4uLmFyZ3MpID0+IHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzKHN0YXRlLCAoZHJhZnQpID0+IGJhc2UoZHJhZnQsIC4uLmFyZ3MpKTtcbiAgICAgIH1cbiAgICAgIGxldCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucHJvZHVjZShiYXNlLCByZWNpcGUsIChwLCBpcCkgPT4ge1xuICAgICAgICBwYXRjaGVzID0gcDtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMgPSBpcDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtyZXN1bHQsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzXTtcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgY29uZmlnPy5hdXRvRnJlZXplID09PSBcImJvb2xlYW5cIilcbiAgICAgIHRoaXMuc2V0QXV0b0ZyZWV6ZShjb25maWcuYXV0b0ZyZWV6ZSk7XG4gICAgaWYgKHR5cGVvZiBjb25maWc/LnVzZVN0cmljdFNoYWxsb3dDb3B5ID09PSBcImJvb2xlYW5cIilcbiAgICAgIHRoaXMuc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkoY29uZmlnLnVzZVN0cmljdFNoYWxsb3dDb3B5KTtcbiAgICBpZiAodHlwZW9mIGNvbmZpZz8udXNlU3RyaWN0SXRlcmF0aW9uID09PSBcImJvb2xlYW5cIilcbiAgICAgIHRoaXMuc2V0VXNlU3RyaWN0SXRlcmF0aW9uKGNvbmZpZy51c2VTdHJpY3RJdGVyYXRpb24pO1xuICB9XG4gIGNyZWF0ZURyYWZ0KGJhc2UpIHtcbiAgICBpZiAoIWlzRHJhZnRhYmxlKGJhc2UpKVxuICAgICAgZGllKDgpO1xuICAgIGlmIChpc0RyYWZ0KGJhc2UpKVxuICAgICAgYmFzZSA9IGN1cnJlbnQoYmFzZSk7XG4gICAgY29uc3Qgc2NvcGUgPSBlbnRlclNjb3BlKHRoaXMpO1xuICAgIGNvbnN0IHByb3h5ID0gY3JlYXRlUHJveHkoYmFzZSwgdm9pZCAwKTtcbiAgICBwcm94eVtEUkFGVF9TVEFURV0uaXNNYW51YWxfID0gdHJ1ZTtcbiAgICBsZWF2ZVNjb3BlKHNjb3BlKTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cbiAgZmluaXNoRHJhZnQoZHJhZnQsIHBhdGNoTGlzdGVuZXIpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGRyYWZ0ICYmIGRyYWZ0W0RSQUZUX1NUQVRFXTtcbiAgICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5pc01hbnVhbF8pXG4gICAgICBkaWUoOSk7XG4gICAgY29uc3QgeyBzY29wZV86IHNjb3BlIH0gPSBzdGF0ZTtcbiAgICB1c2VQYXRjaGVzSW5TY29wZShzY29wZSwgcGF0Y2hMaXN0ZW5lcik7XG4gICAgcmV0dXJuIHByb2Nlc3NSZXN1bHQodm9pZCAwLCBzY29wZSk7XG4gIH1cbiAgLyoqXG4gICAqIFBhc3MgdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IGZyZWV6ZSBhbGwgY29waWVzIGNyZWF0ZWQgYnkgSW1tZXIuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGF1dG8tZnJlZXppbmcgaXMgZW5hYmxlZC5cbiAgICovXG4gIHNldEF1dG9GcmVlemUodmFsdWUpIHtcbiAgICB0aGlzLmF1dG9GcmVlemVfID0gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFBhc3MgdHJ1ZSB0byBlbmFibGUgc3RyaWN0IHNoYWxsb3cgY29weS5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgaW1tZXIgZG9lcyBub3QgY29weSB0aGUgb2JqZWN0IGRlc2NyaXB0b3JzIHN1Y2ggYXMgZ2V0dGVyLCBzZXR0ZXIgYW5kIG5vbi1lbnVtcmFibGUgcHJvcGVydGllcy5cbiAgICovXG4gIHNldFVzZVN0cmljdFNoYWxsb3dDb3B5KHZhbHVlKSB7XG4gICAgdGhpcy51c2VTdHJpY3RTaGFsbG93Q29weV8gPSB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogUGFzcyBmYWxzZSB0byB1c2UgZmFzdGVyIGl0ZXJhdGlvbiB0aGF0IHNraXBzIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICogYnV0IHN0aWxsIGhhbmRsZXMgc3ltYm9scyBmb3IgY29tcGF0aWJpbGl0eS5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgc3RyaWN0IGl0ZXJhdGlvbiBpcyBlbmFibGVkIChpbmNsdWRlcyBhbGwgb3duIHByb3BlcnRpZXMpLlxuICAgKi9cbiAgc2V0VXNlU3RyaWN0SXRlcmF0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy51c2VTdHJpY3RJdGVyYXRpb25fID0gdmFsdWU7XG4gIH1cbiAgc2hvdWxkVXNlU3RyaWN0SXRlcmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnVzZVN0cmljdEl0ZXJhdGlvbl87XG4gIH1cbiAgYXBwbHlQYXRjaGVzKGJhc2UsIHBhdGNoZXMpIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSBwYXRjaGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBwYXRjaCA9IHBhdGNoZXNbaV07XG4gICAgICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDAgJiYgcGF0Y2gub3AgPT09IFwicmVwbGFjZVwiKSB7XG4gICAgICAgIGJhc2UgPSBwYXRjaC52YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpID4gLTEpIHtcbiAgICAgIHBhdGNoZXMgPSBwYXRjaGVzLnNsaWNlKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3QgYXBwbHlQYXRjaGVzSW1wbCA9IGdldFBsdWdpbihcIlBhdGNoZXNcIikuYXBwbHlQYXRjaGVzXztcbiAgICBpZiAoaXNEcmFmdChiYXNlKSkge1xuICAgICAgcmV0dXJuIGFwcGx5UGF0Y2hlc0ltcGwoYmFzZSwgcGF0Y2hlcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByb2R1Y2UoXG4gICAgICBiYXNlLFxuICAgICAgKGRyYWZ0KSA9PiBhcHBseVBhdGNoZXNJbXBsKGRyYWZ0LCBwYXRjaGVzKVxuICAgICk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVQcm94eSh2YWx1ZSwgcGFyZW50KSB7XG4gIGNvbnN0IGRyYWZ0ID0gaXNNYXAodmFsdWUpID8gZ2V0UGx1Z2luKFwiTWFwU2V0XCIpLnByb3h5TWFwXyh2YWx1ZSwgcGFyZW50KSA6IGlzU2V0KHZhbHVlKSA/IGdldFBsdWdpbihcIk1hcFNldFwiKS5wcm94eVNldF8odmFsdWUsIHBhcmVudCkgOiBjcmVhdGVQcm94eVByb3h5KHZhbHVlLCBwYXJlbnQpO1xuICBjb25zdCBzY29wZSA9IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKTtcbiAgc2NvcGUuZHJhZnRzXy5wdXNoKGRyYWZ0KTtcbiAgcmV0dXJuIGRyYWZ0O1xufVxuXG4vLyBzcmMvY29yZS9jdXJyZW50LnRzXG5mdW5jdGlvbiBjdXJyZW50KHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdCh2YWx1ZSkpXG4gICAgZGllKDEwLCB2YWx1ZSk7XG4gIHJldHVybiBjdXJyZW50SW1wbCh2YWx1ZSk7XG59XG5mdW5jdGlvbiBjdXJyZW50SW1wbCh2YWx1ZSkge1xuICBpZiAoIWlzRHJhZnRhYmxlKHZhbHVlKSB8fCBpc0Zyb3plbih2YWx1ZSkpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBzdGF0ZSA9IHZhbHVlW0RSQUZUX1NUQVRFXTtcbiAgbGV0IGNvcHk7XG4gIGxldCBzdHJpY3QgPSB0cnVlO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlLm1vZGlmaWVkXylcbiAgICAgIHJldHVybiBzdGF0ZS5iYXNlXztcbiAgICBzdGF0ZS5maW5hbGl6ZWRfID0gdHJ1ZTtcbiAgICBjb3B5ID0gc2hhbGxvd0NvcHkodmFsdWUsIHN0YXRlLnNjb3BlXy5pbW1lcl8udXNlU3RyaWN0U2hhbGxvd0NvcHlfKTtcbiAgICBzdHJpY3QgPSBzdGF0ZS5zY29wZV8uaW1tZXJfLnNob3VsZFVzZVN0cmljdEl0ZXJhdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGNvcHkgPSBzaGFsbG93Q29weSh2YWx1ZSwgdHJ1ZSk7XG4gIH1cbiAgZWFjaChcbiAgICBjb3B5LFxuICAgIChrZXksIGNoaWxkVmFsdWUpID0+IHtcbiAgICAgIHNldChjb3B5LCBrZXksIGN1cnJlbnRJbXBsKGNoaWxkVmFsdWUpKTtcbiAgICB9LFxuICAgIHN0cmljdFxuICApO1xuICBpZiAoc3RhdGUpIHtcbiAgICBzdGF0ZS5maW5hbGl6ZWRfID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5cbi8vIHNyYy9wbHVnaW5zL3BhdGNoZXMudHNcbmZ1bmN0aW9uIGVuYWJsZVBhdGNoZXMoKSB7XG4gIGNvbnN0IGVycm9yT2Zmc2V0ID0gMTY7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBlcnJvcnMucHVzaChcbiAgICAgICdTZXRzIGNhbm5vdCBoYXZlIFwicmVwbGFjZVwiIHBhdGNoZXMuJyxcbiAgICAgIGZ1bmN0aW9uKG9wKSB7XG4gICAgICAgIHJldHVybiBcIlVuc3VwcG9ydGVkIHBhdGNoIG9wZXJhdGlvbjogXCIgKyBvcDtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBcIkNhbm5vdCBhcHBseSBwYXRjaCwgcGF0aCBkb2Vzbid0IHJlc29sdmU6IFwiICsgcGF0aDtcbiAgICAgIH0sXG4gICAgICBcIlBhdGNoaW5nIHJlc2VydmVkIGF0dHJpYnV0ZXMgbGlrZSBfX3Byb3RvX18sIHByb3RvdHlwZSBhbmQgY29uc3RydWN0b3IgaXMgbm90IGFsbG93ZWRcIlxuICAgICk7XG4gIH1cbiAgY29uc3QgUkVQTEFDRSA9IFwicmVwbGFjZVwiO1xuICBjb25zdCBBREQgPSBcImFkZFwiO1xuICBjb25zdCBSRU1PVkUgPSBcInJlbW92ZVwiO1xuICBmdW5jdGlvbiBnZW5lcmF0ZVBhdGNoZXNfKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBzd2l0Y2ggKHN0YXRlLnR5cGVfKSB7XG4gICAgICBjYXNlIDAgLyogT2JqZWN0ICovOlxuICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlUGF0Y2hlc0Zyb21Bc3NpZ25lZChcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICBwYXRjaGVzLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzXG4gICAgICAgICk7XG4gICAgICBjYXNlIDEgLyogQXJyYXkgKi86XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZUFycmF5UGF0Y2hlcyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKTtcbiAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZVNldFBhdGNoZXMoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgYmFzZVBhdGgsXG4gICAgICAgICAgcGF0Y2hlcyxcbiAgICAgICAgICBpbnZlcnNlUGF0Y2hlc1xuICAgICAgICApO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZUFycmF5UGF0Y2hlcyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgbGV0IHsgYmFzZV8sIGFzc2lnbmVkXyB9ID0gc3RhdGU7XG4gICAgbGV0IGNvcHlfID0gc3RhdGUuY29weV87XG4gICAgaWYgKGNvcHlfLmxlbmd0aCA8IGJhc2VfLmxlbmd0aCkge1xuICAgICAgO1xuICAgICAgW2Jhc2VfLCBjb3B5X10gPSBbY29weV8sIGJhc2VfXTtcbiAgICAgIFtwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlc10gPSBbaW52ZXJzZVBhdGNoZXMsIHBhdGNoZXNdO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhc2VfLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXNzaWduZWRfW2ldICYmIGNvcHlfW2ldICE9PSBiYXNlX1tpXSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICAvLyBOZWVkIHRvIG1heWJlIGNsb25lIGl0LCBhcyBpdCBjYW4gaW4gZmFjdCBiZSB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgICAgICAvLyBkdWUgdG8gdGhlIGJhc2UvY29weSBpbnZlcnNpb24gYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgICB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoY29weV9baV0pXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogUkVQTEFDRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChiYXNlX1tpXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXNlXy5sZW5ndGg7IGkgPCBjb3B5Xy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgb3A6IEFERCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgLy8gTmVlZCB0byBtYXliZSBjbG9uZSBpdCwgYXMgaXQgY2FuIGluIGZhY3QgYmUgdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgICAgIC8vIGR1ZSB0byB0aGUgYmFzZS9jb3B5IGludmVyc2lvbiBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvblxuICAgICAgICB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoY29weV9baV0pXG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IGNvcHlfLmxlbmd0aCAtIDE7IGJhc2VfLmxlbmd0aCA8PSBpOyAtLWkpIHtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goe1xuICAgICAgICBvcDogUkVNT1ZFLFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVQYXRjaGVzRnJvbUFzc2lnbmVkKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBjb25zdCB7IGJhc2VfLCBjb3B5XyB9ID0gc3RhdGU7XG4gICAgZWFjaChzdGF0ZS5hc3NpZ25lZF8sIChrZXksIGFzc2lnbmVkVmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdWYWx1ZSA9IGdldChiYXNlXywga2V5KTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0KGNvcHlfLCBrZXkpO1xuICAgICAgY29uc3Qgb3AgPSAhYXNzaWduZWRWYWx1ZSA/IFJFTU9WRSA6IGhhcyhiYXNlXywga2V5KSA/IFJFUExBQ0UgOiBBREQ7XG4gICAgICBpZiAob3JpZ1ZhbHVlID09PSB2YWx1ZSAmJiBvcCA9PT0gUkVQTEFDRSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChrZXkpO1xuICAgICAgcGF0Y2hlcy5wdXNoKG9wID09PSBSRU1PVkUgPyB7IG9wLCBwYXRoIH0gOiB7IG9wLCBwYXRoLCB2YWx1ZSB9KTtcbiAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goXG4gICAgICAgIG9wID09PSBBREQgPyB7IG9wOiBSRU1PVkUsIHBhdGggfSA6IG9wID09PSBSRU1PVkUgPyB7IG9wOiBBREQsIHBhdGgsIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChvcmlnVmFsdWUpIH0gOiB7IG9wOiBSRVBMQUNFLCBwYXRoLCB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob3JpZ1ZhbHVlKSB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlU2V0UGF0Y2hlcyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgbGV0IHsgYmFzZV8sIGNvcHlfIH0gPSBzdGF0ZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgYmFzZV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIGlmICghY29weV8uaGFzKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy51bnNoaWZ0KHtcbiAgICAgICAgICBvcDogQURELFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSk7XG4gICAgaSA9IDA7XG4gICAgY29weV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIGlmICghYmFzZV8uaGFzKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IEFERCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy51bnNoaWZ0KHtcbiAgICAgICAgICBvcDogUkVNT1ZFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKGJhc2VWYWx1ZSwgcmVwbGFjZW1lbnQsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgcGF0aDogW10sXG4gICAgICB2YWx1ZTogcmVwbGFjZW1lbnQgPT09IE5PVEhJTkcgPyB2b2lkIDAgOiByZXBsYWNlbWVudFxuICAgIH0pO1xuICAgIGludmVyc2VQYXRjaGVzLnB1c2goe1xuICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICBwYXRoOiBbXSxcbiAgICAgIHZhbHVlOiBiYXNlVmFsdWVcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBhcHBseVBhdGNoZXNfKGRyYWZ0LCBwYXRjaGVzKSB7XG4gICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBvcCB9ID0gcGF0Y2g7XG4gICAgICBsZXQgYmFzZSA9IGRyYWZ0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJlbnRUeXBlID0gZ2V0QXJjaHR5cGUoYmFzZSk7XG4gICAgICAgIGxldCBwID0gcGF0aFtpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBwICE9PSBcInN0cmluZ1wiICYmIHR5cGVvZiBwICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcCA9IFwiXCIgKyBwO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocGFyZW50VHlwZSA9PT0gMCAvKiBPYmplY3QgKi8gfHwgcGFyZW50VHlwZSA9PT0gMSAvKiBBcnJheSAqLykgJiYgKHAgPT09IFwiX19wcm90b19fXCIgfHwgcCA9PT0gXCJjb25zdHJ1Y3RvclwiKSlcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlID09PSBcImZ1bmN0aW9uXCIgJiYgcCA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAzKTtcbiAgICAgICAgYmFzZSA9IGdldChiYXNlLCBwKTtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlICE9PSBcIm9iamVjdFwiKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDIsIHBhdGguam9pbihcIi9cIikpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHlwZSA9IGdldEFyY2h0eXBlKGJhc2UpO1xuICAgICAgY29uc3QgdmFsdWUgPSBkZWVwQ2xvbmVQYXRjaFZhbHVlKHBhdGNoLnZhbHVlKTtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgY2FzZSBSRVBMQUNFOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgICAgICAgZGllKGVycm9yT2Zmc2V0KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQUREOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAxIC8qIEFycmF5ICovOlxuICAgICAgICAgICAgICByZXR1cm4ga2V5ID09PSBcIi1cIiA/IGJhc2UucHVzaCh2YWx1ZSkgOiBiYXNlLnNwbGljZShrZXksIDAsIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIFJFTU9WRTpcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc3BsaWNlKGtleSwgMSk7XG4gICAgICAgICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmRlbGV0ZShwYXRjaC52YWx1ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gZGVsZXRlIGJhc2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMSwgb3ApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkcmFmdDtcbiAgfVxuICBmdW5jdGlvbiBkZWVwQ2xvbmVQYXRjaFZhbHVlKG9iaikge1xuICAgIGlmICghaXNEcmFmdGFibGUob2JqKSlcbiAgICAgIHJldHVybiBvYmo7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSlcbiAgICAgIHJldHVybiBvYmoubWFwKGRlZXBDbG9uZVBhdGNoVmFsdWUpO1xuICAgIGlmIChpc01hcChvYmopKVxuICAgICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICAgIEFycmF5LmZyb20ob2JqLmVudHJpZXMoKSkubWFwKChbaywgdl0pID0+IFtrLCBkZWVwQ2xvbmVQYXRjaFZhbHVlKHYpXSlcbiAgICAgICk7XG4gICAgaWYgKGlzU2V0KG9iaikpXG4gICAgICByZXR1cm4gbmV3IFNldChBcnJheS5mcm9tKG9iaikubWFwKGRlZXBDbG9uZVBhdGNoVmFsdWUpKTtcbiAgICBjb25zdCBjbG9uZWQgPSBPYmplY3QuY3JlYXRlKGdldFByb3RvdHlwZU9mKG9iaikpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iailcbiAgICAgIGNsb25lZFtrZXldID0gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmpba2V5XSk7XG4gICAgaWYgKGhhcyhvYmosIERSQUZUQUJMRSkpXG4gICAgICBjbG9uZWRbRFJBRlRBQkxFXSA9IG9ialtEUkFGVEFCTEVdO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbiAgZnVuY3Rpb24gY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob2JqKSB7XG4gICAgaWYgKGlzRHJhZnQob2JqKSkge1xuICAgICAgcmV0dXJuIGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqKTtcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybiBvYmo7XG4gIH1cbiAgbG9hZFBsdWdpbihcIlBhdGNoZXNcIiwge1xuICAgIGFwcGx5UGF0Y2hlc18sXG4gICAgZ2VuZXJhdGVQYXRjaGVzXyxcbiAgICBnZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc19cbiAgfSk7XG59XG5cbi8vIHNyYy9wbHVnaW5zL21hcHNldC50c1xuZnVuY3Rpb24gZW5hYmxlTWFwU2V0KCkge1xuICBjbGFzcyBEcmFmdE1hcCBleHRlbmRzIE1hcCB7XG4gICAgY29uc3RydWN0b3IodGFyZ2V0LCBwYXJlbnQpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzW0RSQUZUX1NUQVRFXSA9IHtcbiAgICAgICAgdHlwZV86IDIgLyogTWFwICovLFxuICAgICAgICBwYXJlbnRfOiBwYXJlbnQsXG4gICAgICAgIHNjb3BlXzogcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpLFxuICAgICAgICBtb2RpZmllZF86IGZhbHNlLFxuICAgICAgICBmaW5hbGl6ZWRfOiBmYWxzZSxcbiAgICAgICAgY29weV86IHZvaWQgMCxcbiAgICAgICAgYXNzaWduZWRfOiB2b2lkIDAsXG4gICAgICAgIGJhc2VfOiB0YXJnZXQsXG4gICAgICAgIGRyYWZ0XzogdGhpcyxcbiAgICAgICAgaXNNYW51YWxfOiBmYWxzZSxcbiAgICAgICAgcmV2b2tlZF86IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLnNpemU7XG4gICAgfVxuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLmhhcyhrZXkpO1xuICAgIH1cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAoIWxhdGVzdChzdGF0ZSkuaGFzKGtleSkgfHwgbGF0ZXN0KHN0YXRlKS5nZXQoa2V5KSAhPT0gdmFsdWUpIHtcbiAgICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgc3RhdGUuY29weV8uc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgaWYgKCF0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgaWYgKHN0YXRlLmJhc2VfLmhhcyhrZXkpKSB7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5jb3B5Xy5kZWxldGUoa2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKGxhdGVzdChzdGF0ZSkuc2l6ZSkge1xuICAgICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgICAgZWFjaChzdGF0ZS5iYXNlXywgKGtleSkgPT4ge1xuICAgICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3JFYWNoKGNiLCB0aGlzQXJnKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgbGF0ZXN0KHN0YXRlKS5mb3JFYWNoKChfdmFsdWUsIGtleSwgX21hcCkgPT4ge1xuICAgICAgICBjYi5jYWxsKHRoaXNBcmcsIHRoaXMuZ2V0KGtleSksIGtleSwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGxhdGVzdChzdGF0ZSkuZ2V0KGtleSk7XG4gICAgICBpZiAoc3RhdGUuZmluYWxpemVkXyB8fCAhaXNEcmFmdGFibGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSAhPT0gc3RhdGUuYmFzZV8uZ2V0KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZHJhZnQgPSBjcmVhdGVQcm94eSh2YWx1ZSwgc3RhdGUpO1xuICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgc3RhdGUuY29weV8uc2V0KGtleSwgZHJhZnQpO1xuICAgICAgcmV0dXJuIGRyYWZ0O1xuICAgIH1cbiAgICBrZXlzKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkua2V5cygpO1xuICAgIH1cbiAgICB2YWx1ZXMoKSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMua2V5cygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHRoaXMudmFsdWVzKCksXG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCByID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChyLmRvbmUpXG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KHIudmFsdWUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgZW50cmllcygpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5rZXlzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gdGhpcy5lbnRyaWVzKCksXG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCByID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChyLmRvbmUpXG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KHIudmFsdWUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBbci52YWx1ZSwgdmFsdWVdXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgWyhEUkFGVF9TVEFURSwgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHByb3h5TWFwXyh0YXJnZXQsIHBhcmVudCkge1xuICAgIHJldHVybiBuZXcgRHJhZnRNYXAodGFyZ2V0LCBwYXJlbnQpO1xuICB9XG4gIGZ1bmN0aW9uIHByZXBhcmVNYXBDb3B5KHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgICAgc3RhdGUuYXNzaWduZWRfID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIHN0YXRlLmNvcHlfID0gbmV3IE1hcChzdGF0ZS5iYXNlXyk7XG4gICAgfVxuICB9XG4gIGNsYXNzIERyYWZ0U2V0IGV4dGVuZHMgU2V0IHtcbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIHBhcmVudCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXNbRFJBRlRfU1RBVEVdID0ge1xuICAgICAgICB0eXBlXzogMyAvKiBTZXQgKi8sXG4gICAgICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAgICAgc2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCksXG4gICAgICAgIG1vZGlmaWVkXzogZmFsc2UsXG4gICAgICAgIGZpbmFsaXplZF86IGZhbHNlLFxuICAgICAgICBjb3B5Xzogdm9pZCAwLFxuICAgICAgICBiYXNlXzogdGFyZ2V0LFxuICAgICAgICBkcmFmdF86IHRoaXMsXG4gICAgICAgIGRyYWZ0c186IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgICAgIHJldm9rZWRfOiBmYWxzZSxcbiAgICAgICAgaXNNYW51YWxfOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5zaXplO1xuICAgIH1cbiAgICBoYXModmFsdWUpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgICAgICByZXR1cm4gc3RhdGUuYmFzZV8uaGFzKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5jb3B5Xy5oYXModmFsdWUpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChzdGF0ZS5kcmFmdHNfLmhhcyh2YWx1ZSkgJiYgc3RhdGUuY29weV8uaGFzKHN0YXRlLmRyYWZ0c18uZ2V0KHZhbHVlKSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKCF0aGlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLmFkZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5Xy5kZWxldGUodmFsdWUpIHx8IChzdGF0ZS5kcmFmdHNfLmhhcyh2YWx1ZSkgPyBzdGF0ZS5jb3B5Xy5kZWxldGUoc3RhdGUuZHJhZnRzXy5nZXQodmFsdWUpKSA6IChcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZmFsc2VcbiAgICAgICkpO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKGxhdGVzdChzdGF0ZSkuc2l6ZSkge1xuICAgICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuY29weV8uY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV8udmFsdWVzKCk7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5Xy5lbnRyaWVzKCk7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXMoKTtcbiAgICB9XG4gICAgWyhEUkFGVF9TVEFURSwgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXMoKTtcbiAgICB9XG4gICAgZm9yRWFjaChjYiwgdGhpc0FyZykge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLnZhbHVlcygpO1xuICAgICAgbGV0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgY2IuY2FsbCh0aGlzQXJnLCByZXN1bHQudmFsdWUsIHJlc3VsdC52YWx1ZSwgdGhpcyk7XG4gICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJveHlTZXRfKHRhcmdldCwgcGFyZW50KSB7XG4gICAgcmV0dXJuIG5ldyBEcmFmdFNldCh0YXJnZXQsIHBhcmVudCk7XG4gIH1cbiAgZnVuY3Rpb24gcHJlcGFyZVNldENvcHkoc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgICBzdGF0ZS5jb3B5XyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgICBzdGF0ZS5iYXNlXy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXNEcmFmdGFibGUodmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgZHJhZnQgPSBjcmVhdGVQcm94eSh2YWx1ZSwgc3RhdGUpO1xuICAgICAgICAgIHN0YXRlLmRyYWZ0c18uc2V0KHZhbHVlLCBkcmFmdCk7XG4gICAgICAgICAgc3RhdGUuY29weV8uYWRkKGRyYWZ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYXNzZXJ0VW5yZXZva2VkKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLnJldm9rZWRfKVxuICAgICAgZGllKDMsIEpTT04uc3RyaW5naWZ5KGxhdGVzdChzdGF0ZSkpKTtcbiAgfVxuICBsb2FkUGx1Z2luKFwiTWFwU2V0XCIsIHsgcHJveHlNYXBfLCBwcm94eVNldF8gfSk7XG59XG5cbi8vIHNyYy9pbW1lci50c1xudmFyIGltbWVyID0gbmV3IEltbWVyMigpO1xudmFyIHByb2R1Y2UgPSBpbW1lci5wcm9kdWNlO1xudmFyIHByb2R1Y2VXaXRoUGF0Y2hlcyA9IC8qIEBfX1BVUkVfXyAqLyBpbW1lci5wcm9kdWNlV2l0aFBhdGNoZXMuYmluZChcbiAgaW1tZXJcbik7XG52YXIgc2V0QXV0b0ZyZWV6ZSA9IC8qIEBfX1BVUkVfXyAqLyBpbW1lci5zZXRBdXRvRnJlZXplLmJpbmQoaW1tZXIpO1xudmFyIHNldFVzZVN0cmljdFNoYWxsb3dDb3B5ID0gLyogQF9fUFVSRV9fICovIGltbWVyLnNldFVzZVN0cmljdFNoYWxsb3dDb3B5LmJpbmQoXG4gIGltbWVyXG4pO1xudmFyIHNldFVzZVN0cmljdEl0ZXJhdGlvbiA9IC8qIEBfX1BVUkVfXyAqLyBpbW1lci5zZXRVc2VTdHJpY3RJdGVyYXRpb24uYmluZChcbiAgaW1tZXJcbik7XG52YXIgYXBwbHlQYXRjaGVzID0gLyogQF9fUFVSRV9fICovIGltbWVyLmFwcGx5UGF0Y2hlcy5iaW5kKGltbWVyKTtcbnZhciBjcmVhdGVEcmFmdCA9IC8qIEBfX1BVUkVfXyAqLyBpbW1lci5jcmVhdGVEcmFmdC5iaW5kKGltbWVyKTtcbnZhciBmaW5pc2hEcmFmdCA9IC8qIEBfX1BVUkVfXyAqLyBpbW1lci5maW5pc2hEcmFmdC5iaW5kKGltbWVyKTtcbmZ1bmN0aW9uIGNhc3REcmFmdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBjYXN0SW1tdXRhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmV4cG9ydCB7XG4gIEltbWVyMiBhcyBJbW1lcixcbiAgYXBwbHlQYXRjaGVzLFxuICBjYXN0RHJhZnQsXG4gIGNhc3RJbW11dGFibGUsXG4gIGNyZWF0ZURyYWZ0LFxuICBjdXJyZW50LFxuICBlbmFibGVNYXBTZXQsXG4gIGVuYWJsZVBhdGNoZXMsXG4gIGZpbmlzaERyYWZ0LFxuICBmcmVlemUsXG4gIERSQUZUQUJMRSBhcyBpbW1lcmFibGUsXG4gIGlzRHJhZnQsXG4gIGlzRHJhZnRhYmxlLFxuICBOT1RISU5HIGFzIG5vdGhpbmcsXG4gIG9yaWdpbmFsLFxuICBwcm9kdWNlLFxuICBwcm9kdWNlV2l0aFBhdGNoZXMsXG4gIHNldEF1dG9GcmVlemUsXG4gIHNldFVzZVN0cmljdEl0ZXJhdGlvbixcbiAgc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbW1lci5tanMubWFwIiwiLy8gc3JjL2luZGV4LnRzXG5mdW5jdGlvbiBjcmVhdGVUaHVua01pZGRsZXdhcmUoZXh0cmFBcmd1bWVudCkge1xuICBjb25zdCBtaWRkbGV3YXJlID0gKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGFjdGlvbihkaXNwYXRjaCwgZ2V0U3RhdGUsIGV4dHJhQXJndW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICB9O1xuICByZXR1cm4gbWlkZGxld2FyZTtcbn1cbnZhciB0aHVuayA9IGNyZWF0ZVRodW5rTWlkZGxld2FyZSgpO1xudmFyIHdpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuZXhwb3J0IHtcbiAgdGh1bmssXG4gIHdpdGhFeHRyYUFyZ3VtZW50XG59O1xuIiwiLy8gc3JjL2luZGV4LnRzXG5leHBvcnQgKiBmcm9tIFwicmVkdXhcIjtcbmltcG9ydCB7IGZyZWV6ZSwgb3JpZ2luYWwgYXMgb3JpZ2luYWwyIH0gZnJvbSBcImltbWVyXCI7XG5cbi8vIHNyYy9pbW1lckltcG9ydHMudHNcbmltcG9ydCB7IGN1cnJlbnQsIGlzRHJhZnQsIHByb2R1Y2UsIGlzRHJhZnRhYmxlLCBzZXRVc2VTdHJpY3RJdGVyYXRpb24gfSBmcm9tIFwiaW1tZXJcIjtcblxuLy8gc3JjL2luZGV4LnRzXG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RvciwgbHJ1TWVtb2l6ZSB9IGZyb20gXCJyZXNlbGVjdFwiO1xuXG4vLyBzcmMvcmVzZWxlY3RJbXBvcnRzLnRzXG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RvckNyZWF0b3IsIHdlYWtNYXBNZW1vaXplIH0gZnJvbSBcInJlc2VsZWN0XCI7XG5cbi8vIHNyYy9jcmVhdGVEcmFmdFNhZmVTZWxlY3Rvci50c1xudmFyIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yQ3JlYXRvciA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IGNyZWF0ZVNlbGVjdG9yMiA9IGNyZWF0ZVNlbGVjdG9yQ3JlYXRvciguLi5hcmdzKTtcbiAgY29uc3QgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IyID0gT2JqZWN0LmFzc2lnbigoLi4uYXJnczIpID0+IHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yMiguLi5hcmdzMik7XG4gICAgY29uc3Qgd3JhcHBlZFNlbGVjdG9yID0gKHZhbHVlLCAuLi5yZXN0KSA9PiBzZWxlY3Rvcihpc0RyYWZ0KHZhbHVlKSA/IGN1cnJlbnQodmFsdWUpIDogdmFsdWUsIC4uLnJlc3QpO1xuICAgIE9iamVjdC5hc3NpZ24od3JhcHBlZFNlbGVjdG9yLCBzZWxlY3Rvcik7XG4gICAgcmV0dXJuIHdyYXBwZWRTZWxlY3RvcjtcbiAgfSwge1xuICAgIHdpdGhUeXBlczogKCkgPT4gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IyXG4gIH0pO1xuICByZXR1cm4gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IyO1xufTtcbnZhciBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvciA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvckNyZWF0b3Iod2Vha01hcE1lbW9pemUpO1xuXG4vLyBzcmMvcmVkdXhJbXBvcnRzLnRzXG5pbXBvcnQgeyBjcmVhdGVTdG9yZSwgY29tYmluZVJlZHVjZXJzLCBhcHBseU1pZGRsZXdhcmUsIGNvbXBvc2UsIGlzUGxhaW5PYmplY3QsIGlzQWN0aW9uIH0gZnJvbSBcInJlZHV4XCI7XG5cbi8vIHNyYy9kZXZ0b29sc0V4dGVuc2lvbi50c1xudmFyIGNvbXBvc2VXaXRoRGV2VG9vbHMgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18gPyB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fIDogZnVuY3Rpb24oKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdm9pZCAwO1xuICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gXCJvYmplY3RcIikgcmV0dXJuIGNvbXBvc2U7XG4gIHJldHVybiBjb21wb3NlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59O1xudmFyIGRldlRvb2xzRW5oYW5jZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fID8gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gOiBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vb3AzKSB7XG4gICAgcmV0dXJuIG5vb3AzO1xuICB9O1xufTtcblxuLy8gc3JjL2dldERlZmF1bHRNaWRkbGV3YXJlLnRzXG5pbXBvcnQgeyB0aHVuayBhcyB0aHVua01pZGRsZXdhcmUsIHdpdGhFeHRyYUFyZ3VtZW50IH0gZnJvbSBcInJlZHV4LXRodW5rXCI7XG5cbi8vIHNyYy90c0hlbHBlcnMudHNcbnZhciBoYXNNYXRjaEZ1bmN0aW9uID0gKHYpID0+IHtcbiAgcmV0dXJuIHYgJiYgdHlwZW9mIHYubWF0Y2ggPT09IFwiZnVuY3Rpb25cIjtcbn07XG5cbi8vIHNyYy9jcmVhdGVBY3Rpb24udHNcbmZ1bmN0aW9uIGNyZWF0ZUFjdGlvbih0eXBlLCBwcmVwYXJlQWN0aW9uKSB7XG4gIGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoLi4uYXJncykge1xuICAgIGlmIChwcmVwYXJlQWN0aW9uKSB7XG4gICAgICBsZXQgcHJlcGFyZWQgPSBwcmVwYXJlQWN0aW9uKC4uLmFyZ3MpO1xuICAgICAgaWYgKCFwcmVwYXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgwKSA6IFwicHJlcGFyZUFjdGlvbiBkaWQgbm90IHJldHVybiBhbiBvYmplY3RcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBwYXlsb2FkOiBwcmVwYXJlZC5wYXlsb2FkLFxuICAgICAgICAuLi5cIm1ldGFcIiBpbiBwcmVwYXJlZCAmJiB7XG4gICAgICAgICAgbWV0YTogcHJlcGFyZWQubWV0YVxuICAgICAgICB9LFxuICAgICAgICAuLi5cImVycm9yXCIgaW4gcHJlcGFyZWQgJiYge1xuICAgICAgICAgIGVycm9yOiBwcmVwYXJlZC5lcnJvclxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZSxcbiAgICAgIHBheWxvYWQ6IGFyZ3NbMF1cbiAgICB9O1xuICB9XG4gIGFjdGlvbkNyZWF0b3IudG9TdHJpbmcgPSAoKSA9PiBgJHt0eXBlfWA7XG4gIGFjdGlvbkNyZWF0b3IudHlwZSA9IHR5cGU7XG4gIGFjdGlvbkNyZWF0b3IubWF0Y2ggPSAoYWN0aW9uKSA9PiBpc0FjdGlvbihhY3Rpb24pICYmIGFjdGlvbi50eXBlID09PSB0eXBlO1xuICByZXR1cm4gYWN0aW9uQ3JlYXRvcjtcbn1cbmZ1bmN0aW9uIGlzQWN0aW9uQ3JlYXRvcihhY3Rpb24pIHtcbiAgcmV0dXJuIHR5cGVvZiBhY3Rpb24gPT09IFwiZnVuY3Rpb25cIiAmJiBcInR5cGVcIiBpbiBhY3Rpb24gJiYgLy8gaGFzTWF0Y2hGdW5jdGlvbiBvbmx5IHdhbnRzIE1hdGNoZXJzIGJ1dCBJIGRvbid0IHNlZSB0aGUgcG9pbnQgaW4gcmV3cml0aW5nIGl0XG4gIGhhc01hdGNoRnVuY3Rpb24oYWN0aW9uKTtcbn1cbmZ1bmN0aW9uIGlzRlNBKGFjdGlvbikge1xuICByZXR1cm4gaXNBY3Rpb24oYWN0aW9uKSAmJiBPYmplY3Qua2V5cyhhY3Rpb24pLmV2ZXJ5KGlzVmFsaWRLZXkpO1xufVxuZnVuY3Rpb24gaXNWYWxpZEtleShrZXkpIHtcbiAgcmV0dXJuIFtcInR5cGVcIiwgXCJwYXlsb2FkXCIsIFwiZXJyb3JcIiwgXCJtZXRhXCJdLmluZGV4T2Yoa2V5KSA+IC0xO1xufVxuXG4vLyBzcmMvYWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGdldE1lc3NhZ2UodHlwZSkge1xuICBjb25zdCBzcGxpdFR5cGUgPSB0eXBlID8gYCR7dHlwZX1gLnNwbGl0KFwiL1wiKSA6IFtdO1xuICBjb25zdCBhY3Rpb25OYW1lID0gc3BsaXRUeXBlW3NwbGl0VHlwZS5sZW5ndGggLSAxXSB8fCBcImFjdGlvbkNyZWF0b3JcIjtcbiAgcmV0dXJuIGBEZXRlY3RlZCBhbiBhY3Rpb24gY3JlYXRvciB3aXRoIHR5cGUgXCIke3R5cGUgfHwgXCJ1bmtub3duXCJ9XCIgYmVpbmcgZGlzcGF0Y2hlZC4gXG5NYWtlIHN1cmUgeW91J3JlIGNhbGxpbmcgdGhlIGFjdGlvbiBjcmVhdG9yIGJlZm9yZSBkaXNwYXRjaGluZywgaS5lLiBcXGBkaXNwYXRjaCgke2FjdGlvbk5hbWV9KCkpXFxgIGluc3RlYWQgb2YgXFxgZGlzcGF0Y2goJHthY3Rpb25OYW1lfSlcXGAuIFRoaXMgaXMgbmVjZXNzYXJ5IGV2ZW4gaWYgdGhlIGFjdGlvbiBoYXMgbm8gcGF5bG9hZC5gO1xufVxuZnVuY3Rpb24gY3JlYXRlQWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUob3B0aW9ucyA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IG5leHQoYWN0aW9uKTtcbiAgfVxuICBjb25zdCB7XG4gICAgaXNBY3Rpb25DcmVhdG9yOiBpc0FjdGlvbkNyZWF0b3IyID0gaXNBY3Rpb25DcmVhdG9yXG4gIH0gPSBvcHRpb25zO1xuICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAoaXNBY3Rpb25DcmVhdG9yMihhY3Rpb24pKSB7XG4gICAgICBjb25zb2xlLndhcm4oZ2V0TWVzc2FnZShhY3Rpb24udHlwZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICB9O1xufVxuXG4vLyBzcmMvdXRpbHMudHNcbmZ1bmN0aW9uIGdldFRpbWVNZWFzdXJlVXRpbHMobWF4RGVsYXksIGZuTmFtZSkge1xuICBsZXQgZWxhcHNlZCA9IDA7XG4gIHJldHVybiB7XG4gICAgbWVhc3VyZVRpbWUoZm4pIHtcbiAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBEYXRlLm5vdygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjb25zdCBmaW5pc2hlZCA9IERhdGUubm93KCk7XG4gICAgICAgIGVsYXBzZWQgKz0gZmluaXNoZWQgLSBzdGFydGVkO1xuICAgICAgfVxuICAgIH0sXG4gICAgd2FybklmRXhjZWVkZWQoKSB7XG4gICAgICBpZiAoZWxhcHNlZCA+IG1heERlbGF5KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHtmbk5hbWV9IHRvb2sgJHtlbGFwc2VkfW1zLCB3aGljaCBpcyBtb3JlIHRoYW4gdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICR7bWF4RGVsYXl9bXMuIFxuSWYgeW91ciBzdGF0ZSBvciBhY3Rpb25zIGFyZSB2ZXJ5IGxhcmdlLCB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSB0aGUgbWlkZGxld2FyZSBhcyBpdCBtaWdodCBjYXVzZSB0b28gbXVjaCBvZiBhIHNsb3dkb3duIGluIGRldmVsb3BtZW50IG1vZGUuIFNlZSBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL2FwaS9nZXREZWZhdWx0TWlkZGxld2FyZSBmb3IgaW5zdHJ1Y3Rpb25zLlxuSXQgaXMgZGlzYWJsZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMsIHNvIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoYXQuYCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxudmFyIFR1cGxlID0gY2xhc3MgX1R1cGxlIGV4dGVuZHMgQXJyYXkge1xuICBjb25zdHJ1Y3RvciguLi5pdGVtcykge1xuICAgIHN1cGVyKC4uLml0ZW1zKTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgX1R1cGxlLnByb3RvdHlwZSk7XG4gIH1cbiAgc3RhdGljIGdldCBbU3ltYm9sLnNwZWNpZXNdKCkge1xuICAgIHJldHVybiBfVHVwbGU7XG4gIH1cbiAgY29uY2F0KC4uLmFycikge1xuICAgIHJldHVybiBzdXBlci5jb25jYXQuYXBwbHkodGhpcywgYXJyKTtcbiAgfVxuICBwcmVwZW5kKC4uLmFycikge1xuICAgIGlmIChhcnIubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJyWzBdKSkge1xuICAgICAgcmV0dXJuIG5ldyBfVHVwbGUoLi4uYXJyWzBdLmNvbmNhdCh0aGlzKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgX1R1cGxlKC4uLmFyci5jb25jYXQodGhpcykpO1xuICB9XG59O1xuZnVuY3Rpb24gZnJlZXplRHJhZnRhYmxlKHZhbCkge1xuICByZXR1cm4gaXNEcmFmdGFibGUodmFsKSA/IHByb2R1Y2UodmFsLCAoKSA9PiB7XG4gIH0pIDogdmFsO1xufVxuZnVuY3Rpb24gZ2V0T3JJbnNlcnRDb21wdXRlZChtYXAsIGtleSwgY29tcHV0ZSkge1xuICBpZiAobWFwLmhhcyhrZXkpKSByZXR1cm4gbWFwLmdldChrZXkpO1xuICByZXR1cm4gbWFwLnNldChrZXksIGNvbXB1dGUoa2V5KSkuZ2V0KGtleSk7XG59XG5cbi8vIHNyYy9pbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGlzSW1tdXRhYmxlRGVmYXVsdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09IG51bGwgfHwgT2JqZWN0LmlzRnJvemVuKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHRyYWNrRm9yTXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqKSB7XG4gIGNvbnN0IHRyYWNrZWRQcm9wZXJ0aWVzID0gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqKTtcbiAgcmV0dXJuIHtcbiAgICBkZXRlY3RNdXRhdGlvbnMoKSB7XG4gICAgICByZXR1cm4gZGV0ZWN0TXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgdHJhY2tlZFByb3BlcnRpZXMsIG9iaik7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocyA9IFtdLCBvYmosIHBhdGggPSBcIlwiLCBjaGVja2VkT2JqZWN0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpIHtcbiAgY29uc3QgdHJhY2tlZCA9IHtcbiAgICB2YWx1ZTogb2JqXG4gIH07XG4gIGlmICghaXNJbW11dGFibGUob2JqKSAmJiAhY2hlY2tlZE9iamVjdHMuaGFzKG9iaikpIHtcbiAgICBjaGVja2VkT2JqZWN0cy5hZGQob2JqKTtcbiAgICB0cmFja2VkLmNoaWxkcmVuID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xuICAgICAgaWYgKGlnbm9yZVBhdGhzLmxlbmd0aCAmJiBpZ25vcmVQYXRocy5pbmRleE9mKGNoaWxkUGF0aCkgIT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHJhY2tlZC5jaGlsZHJlbltrZXldID0gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqW2tleV0sIGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cmFja2VkO1xufVxuZnVuY3Rpb24gZGV0ZWN0TXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVkUGF0aHMgPSBbXSwgdHJhY2tlZFByb3BlcnR5LCBvYmosIHNhbWVQYXJlbnRSZWYgPSBmYWxzZSwgcGF0aCA9IFwiXCIpIHtcbiAgY29uc3QgcHJldk9iaiA9IHRyYWNrZWRQcm9wZXJ0eSA/IHRyYWNrZWRQcm9wZXJ0eS52YWx1ZSA6IHZvaWQgMDtcbiAgY29uc3Qgc2FtZVJlZiA9IHByZXZPYmogPT09IG9iajtcbiAgaWYgKHNhbWVQYXJlbnRSZWYgJiYgIXNhbWVSZWYgJiYgIU51bWJlci5pc05hTihvYmopKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhc011dGF0ZWQ6IHRydWUsXG4gICAgICBwYXRoXG4gICAgfTtcbiAgfVxuICBpZiAoaXNJbW11dGFibGUocHJldk9iaikgfHwgaXNJbW11dGFibGUob2JqKSkge1xuICAgIHJldHVybiB7XG4gICAgICB3YXNNdXRhdGVkOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgY29uc3Qga2V5c1RvRGV0ZWN0ID0ge307XG4gIGZvciAobGV0IGtleSBpbiB0cmFja2VkUHJvcGVydHkuY2hpbGRyZW4pIHtcbiAgICBrZXlzVG9EZXRlY3Rba2V5XSA9IHRydWU7XG4gIH1cbiAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgIGtleXNUb0RldGVjdFtrZXldID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBoYXNJZ25vcmVkUGF0aHMgPSBpZ25vcmVkUGF0aHMubGVuZ3RoID4gMDtcbiAgZm9yIChsZXQga2V5IGluIGtleXNUb0RldGVjdCkge1xuICAgIGNvbnN0IG5lc3RlZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xuICAgIGlmIChoYXNJZ25vcmVkUGF0aHMpIHtcbiAgICAgIGNvbnN0IGhhc01hdGNoZXMgPSBpZ25vcmVkUGF0aHMuc29tZSgoaWdub3JlZCkgPT4ge1xuICAgICAgICBpZiAoaWdub3JlZCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgIHJldHVybiBpZ25vcmVkLnRlc3QobmVzdGVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5lc3RlZFBhdGggPT09IGlnbm9yZWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChoYXNNYXRjaGVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZWRQYXRocywgdHJhY2tlZFByb3BlcnR5LmNoaWxkcmVuW2tleV0sIG9ialtrZXldLCBzYW1lUmVmLCBuZXN0ZWRQYXRoKTtcbiAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgd2FzTXV0YXRlZDogZmFsc2VcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4gbmV4dChhY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIGxldCBzdHJpbmdpZnkyID0gZnVuY3Rpb24ob2JqLCBzZXJpYWxpemVyLCBpbmRlbnQsIGRlY3ljbGVyKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBnZXRTZXJpYWxpemUyKHNlcmlhbGl6ZXIsIGRlY3ljbGVyKSwgaW5kZW50KTtcbiAgICB9LCBnZXRTZXJpYWxpemUyID0gZnVuY3Rpb24oc2VyaWFsaXplciwgZGVjeWNsZXIpIHtcbiAgICAgIGxldCBzdGFjayA9IFtdLCBrZXlzID0gW107XG4gICAgICBpZiAoIWRlY3ljbGVyKSBkZWN5Y2xlciA9IGZ1bmN0aW9uKF8sIHZhbHVlKSB7XG4gICAgICAgIGlmIChzdGFja1swXSA9PT0gdmFsdWUpIHJldHVybiBcIltDaXJjdWxhciB+XVwiO1xuICAgICAgICByZXR1cm4gXCJbQ2lyY3VsYXIgfi5cIiArIGtleXMuc2xpY2UoMCwgc3RhY2suaW5kZXhPZih2YWx1ZSkpLmpvaW4oXCIuXCIpICsgXCJdXCI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgdGhpc1BvcyA9IHN0YWNrLmluZGV4T2YodGhpcyk7XG4gICAgICAgICAgfnRoaXNQb3MgPyBzdGFjay5zcGxpY2UodGhpc1BvcyArIDEpIDogc3RhY2sucHVzaCh0aGlzKTtcbiAgICAgICAgICB+dGhpc1BvcyA/IGtleXMuc3BsaWNlKHRoaXNQb3MsIEluZmluaXR5LCBrZXkpIDoga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgaWYgKH5zdGFjay5pbmRleE9mKHZhbHVlKSkgdmFsdWUgPSBkZWN5Y2xlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Ugc3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyID09IG51bGwgPyB2YWx1ZSA6IHNlcmlhbGl6ZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgc3RyaW5naWZ5ID0gc3RyaW5naWZ5MiwgZ2V0U2VyaWFsaXplID0gZ2V0U2VyaWFsaXplMjtcbiAgICBsZXQge1xuICAgICAgaXNJbW11dGFibGUgPSBpc0ltbXV0YWJsZURlZmF1bHQsXG4gICAgICBpZ25vcmVkUGF0aHMsXG4gICAgICB3YXJuQWZ0ZXIgPSAzMlxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHRyYWNrID0gdHJhY2tGb3JNdXRhdGlvbnMuYmluZChudWxsLCBpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzKTtcbiAgICByZXR1cm4gKHtcbiAgICAgIGdldFN0YXRlXG4gICAgfSkgPT4ge1xuICAgICAgbGV0IHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgIGxldCB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHJldHVybiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBtZWFzdXJlVXRpbHMgPSBnZXRUaW1lTWVhc3VyZVV0aWxzKHdhcm5BZnRlciwgXCJJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmVcIik7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgIHJlc3VsdCA9IHRyYWNrZXIuZGV0ZWN0TXV0YXRpb25zKCk7XG4gICAgICAgICAgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcbiAgICAgICAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE5KSA6IGBBIHN0YXRlIG11dGF0aW9uIHdhcyBkZXRlY3RlZCBiZXR3ZWVuIGRpc3BhdGNoZXMsIGluIHRoZSBwYXRoICcke3Jlc3VsdC5wYXRoIHx8IFwiXCJ9Jy4gIFRoaXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvci4gKGh0dHBzOi8vcmVkdXguanMub3JnL3N0eWxlLWd1aWRlL3N0eWxlLWd1aWRlI2RvLW5vdC1tdXRhdGUtc3RhdGUpYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlZEFjdGlvbiA9IG5leHQoYWN0aW9uKTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgcmVzdWx0ID0gdHJhY2tlci5kZXRlY3RNdXRhdGlvbnMoKTtcbiAgICAgICAgICB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xuICAgICAgICAgIGlmIChyZXN1bHQud2FzTXV0YXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjApIDogYEEgc3RhdGUgbXV0YXRpb24gd2FzIGRldGVjdGVkIGluc2lkZSBhIGRpc3BhdGNoLCBpbiB0aGUgcGF0aDogJHtyZXN1bHQucGF0aCB8fCBcIlwifS4gVGFrZSBhIGxvb2sgYXQgdGhlIHJlZHVjZXIocykgaGFuZGxpbmcgdGhlIGFjdGlvbiAke3N0cmluZ2lmeTIoYWN0aW9uKX0uIChodHRwczovL3JlZHV4LmpzLm9yZy9zdHlsZS1ndWlkZS9zdHlsZS1ndWlkZSNkby1ub3QtbXV0YXRlLXN0YXRlKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lYXN1cmVVdGlscy53YXJuSWZFeGNlZWRlZCgpO1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hlZEFjdGlvbjtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxufVxuXG4vLyBzcmMvc2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBpc1BsYWluKHZhbCkge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgcmV0dXJuIHZhbCA9PSBudWxsIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiB8fCBBcnJheS5pc0FycmF5KHZhbCkgfHwgaXNQbGFpbk9iamVjdCh2YWwpO1xufVxuZnVuY3Rpb24gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKHZhbHVlLCBwYXRoID0gXCJcIiwgaXNTZXJpYWxpemFibGUgPSBpc1BsYWluLCBnZXRFbnRyaWVzLCBpZ25vcmVkUGF0aHMgPSBbXSwgY2FjaGUpIHtcbiAgbGV0IGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xuICBpZiAoIWlzU2VyaWFsaXphYmxlKHZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXlQYXRoOiBwYXRoIHx8IFwiPHJvb3Q+XCIsXG4gICAgICB2YWx1ZVxuICAgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoY2FjaGU/Lmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZW50cmllcyA9IGdldEVudHJpZXMgIT0gbnVsbCA/IGdldEVudHJpZXModmFsdWUpIDogT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICBjb25zdCBoYXNJZ25vcmVkUGF0aHMgPSBpZ25vcmVkUGF0aHMubGVuZ3RoID4gMDtcbiAgZm9yIChjb25zdCBba2V5LCBuZXN0ZWRWYWx1ZV0gb2YgZW50cmllcykge1xuICAgIGNvbnN0IG5lc3RlZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xuICAgIGlmIChoYXNJZ25vcmVkUGF0aHMpIHtcbiAgICAgIGNvbnN0IGhhc01hdGNoZXMgPSBpZ25vcmVkUGF0aHMuc29tZSgoaWdub3JlZCkgPT4ge1xuICAgICAgICBpZiAoaWdub3JlZCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgIHJldHVybiBpZ25vcmVkLnRlc3QobmVzdGVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5lc3RlZFBhdGggPT09IGlnbm9yZWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChoYXNNYXRjaGVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzU2VyaWFsaXphYmxlKG5lc3RlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5UGF0aDogbmVzdGVkUGF0aCxcbiAgICAgICAgdmFsdWU6IG5lc3RlZFZhbHVlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5lc3RlZFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShuZXN0ZWRWYWx1ZSwgbmVzdGVkUGF0aCwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocywgY2FjaGUpO1xuICAgICAgaWYgKGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGNhY2hlICYmIGlzTmVzdGVkRnJvemVuKHZhbHVlKSkgY2FjaGUuYWRkKHZhbHVlKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNOZXN0ZWRGcm96ZW4odmFsdWUpIHtcbiAgaWYgKCFPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgbmVzdGVkVmFsdWUgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICBpZiAodHlwZW9mIG5lc3RlZFZhbHVlICE9PSBcIm9iamVjdFwiIHx8IG5lc3RlZFZhbHVlID09PSBudWxsKSBjb250aW51ZTtcbiAgICBpZiAoIWlzTmVzdGVkRnJvemVuKG5lc3RlZFZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKG9wdGlvbnMgPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiBuZXh0KGFjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNTZXJpYWxpemFibGUgPSBpc1BsYWluLFxuICAgICAgZ2V0RW50cmllcyxcbiAgICAgIGlnbm9yZWRBY3Rpb25zID0gW10sXG4gICAgICBpZ25vcmVkQWN0aW9uUGF0aHMgPSBbXCJtZXRhLmFyZ1wiLCBcIm1ldGEuYmFzZVF1ZXJ5TWV0YVwiXSxcbiAgICAgIGlnbm9yZWRQYXRocyA9IFtdLFxuICAgICAgd2FybkFmdGVyID0gMzIsXG4gICAgICBpZ25vcmVTdGF0ZSA9IGZhbHNlLFxuICAgICAgaWdub3JlQWN0aW9ucyA9IGZhbHNlLFxuICAgICAgZGlzYWJsZUNhY2hlID0gZmFsc2VcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjYWNoZSA9ICFkaXNhYmxlQ2FjaGUgJiYgV2Vha1NldCA/IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpIDogdm9pZCAwO1xuICAgIHJldHVybiAoc3RvcmVBUEkpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIWlzQWN0aW9uKGFjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5leHQoYWN0aW9uKTtcbiAgICAgIGNvbnN0IG1lYXN1cmVVdGlscyA9IGdldFRpbWVNZWFzdXJlVXRpbHMod2FybkFmdGVyLCBcIlNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZVwiKTtcbiAgICAgIGlmICghaWdub3JlQWN0aW9ucyAmJiAhKGlnbm9yZWRBY3Rpb25zLmxlbmd0aCAmJiBpZ25vcmVkQWN0aW9ucy5pbmRleE9mKGFjdGlvbi50eXBlKSAhPT0gLTEpKSB7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShhY3Rpb24sIFwiXCIsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkQWN0aW9uUGF0aHMsIGNhY2hlKTtcbiAgICAgICAgICBpZiAoZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBrZXlQYXRoLFxuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSA9IGZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBIG5vbi1zZXJpYWxpemFibGUgdmFsdWUgd2FzIGRldGVjdGVkIGluIGFuIGFjdGlvbiwgaW4gdGhlIHBhdGg6IFxcYCR7a2V5UGF0aH1cXGAuIFZhbHVlOmAsIHZhbHVlLCBcIlxcblRha2UgYSBsb29rIGF0IHRoZSBsb2dpYyB0aGF0IGRpc3BhdGNoZWQgdGhpcyBhY3Rpb246IFwiLCBhY3Rpb24sIFwiXFxuKFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9mYXEvYWN0aW9ucyN3aHktc2hvdWxkLXR5cGUtYmUtYS1zdHJpbmctb3ItYXQtbGVhc3Qtc2VyaWFsaXphYmxlLXdoeS1zaG91bGQtbXktYWN0aW9uLXR5cGVzLWJlLWNvbnN0YW50cylcIiwgXCJcXG4oVG8gYWxsb3cgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgc2VlOiBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL3VzYWdlL3VzYWdlLWd1aWRlI3dvcmtpbmctd2l0aC1ub24tc2VyaWFsaXphYmxlLWRhdGEpXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWlnbm9yZVN0YXRlKSB7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZUFQSS5nZXRTdGF0ZSgpO1xuICAgICAgICAgIGNvbnN0IGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShzdGF0ZSwgXCJcIiwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocywgY2FjaGUpO1xuICAgICAgICAgIGlmIChmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAga2V5UGF0aCxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0gPSBmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBIG5vbi1zZXJpYWxpemFibGUgdmFsdWUgd2FzIGRldGVjdGVkIGluIHRoZSBzdGF0ZSwgaW4gdGhlIHBhdGg6IFxcYCR7a2V5UGF0aH1cXGAuIFZhbHVlOmAsIHZhbHVlLCBgXG5UYWtlIGEgbG9vayBhdCB0aGUgcmVkdWNlcihzKSBoYW5kbGluZyB0aGlzIGFjdGlvbiB0eXBlOiAke2FjdGlvbi50eXBlfS5cbihTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvZmFxL29yZ2FuaXppbmctc3RhdGUjY2FuLWktcHV0LWZ1bmN0aW9ucy1wcm9taXNlcy1vci1vdGhlci1ub24tc2VyaWFsaXphYmxlLWl0ZW1zLWluLW15LXN0b3JlLXN0YXRlKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lYXN1cmVVdGlscy53YXJuSWZFeGNlZWRlZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9XG59XG5cbi8vIHNyYy9nZXREZWZhdWx0TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gaXNCb29sZWFuKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcImJvb2xlYW5cIjtcbn1cbnZhciBidWlsZEdldERlZmF1bHRNaWRkbGV3YXJlID0gKCkgPT4gZnVuY3Rpb24gZ2V0RGVmYXVsdE1pZGRsZXdhcmUob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgdGh1bmsgPSB0cnVlLFxuICAgIGltbXV0YWJsZUNoZWNrID0gdHJ1ZSxcbiAgICBzZXJpYWxpemFibGVDaGVjayA9IHRydWUsXG4gICAgYWN0aW9uQ3JlYXRvckNoZWNrID0gdHJ1ZVxuICB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgbGV0IG1pZGRsZXdhcmVBcnJheSA9IG5ldyBUdXBsZSgpO1xuICBpZiAodGh1bmspIHtcbiAgICBpZiAoaXNCb29sZWFuKHRodW5rKSkge1xuICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2godGh1bmtNaWRkbGV3YXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2god2l0aEV4dHJhQXJndW1lbnQodGh1bmsuZXh0cmFBcmd1bWVudCkpO1xuICAgIH1cbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKGltbXV0YWJsZUNoZWNrKSB7XG4gICAgICBsZXQgaW1tdXRhYmxlT3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKCFpc0Jvb2xlYW4oaW1tdXRhYmxlQ2hlY2spKSB7XG4gICAgICAgIGltbXV0YWJsZU9wdGlvbnMgPSBpbW11dGFibGVDaGVjaztcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVBcnJheS51bnNoaWZ0KGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShpbW11dGFibGVPcHRpb25zKSk7XG4gICAgfVxuICAgIGlmIChzZXJpYWxpemFibGVDaGVjaykge1xuICAgICAgbGV0IHNlcmlhbGl6YWJsZU9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghaXNCb29sZWFuKHNlcmlhbGl6YWJsZUNoZWNrKSkge1xuICAgICAgICBzZXJpYWxpemFibGVPcHRpb25zID0gc2VyaWFsaXphYmxlQ2hlY2s7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlQXJyYXkucHVzaChjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUoc2VyaWFsaXphYmxlT3B0aW9ucykpO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uQ3JlYXRvckNoZWNrKSB7XG4gICAgICBsZXQgYWN0aW9uQ3JlYXRvck9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghaXNCb29sZWFuKGFjdGlvbkNyZWF0b3JDaGVjaykpIHtcbiAgICAgICAgYWN0aW9uQ3JlYXRvck9wdGlvbnMgPSBhY3Rpb25DcmVhdG9yQ2hlY2s7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlQXJyYXkudW5zaGlmdChjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZShhY3Rpb25DcmVhdG9yT3B0aW9ucykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWlkZGxld2FyZUFycmF5O1xufTtcblxuLy8gc3JjL2F1dG9CYXRjaEVuaGFuY2VyLnRzXG52YXIgU0hPVUxEX0FVVE9CQVRDSCA9IFwiUlRLX2F1dG9CYXRjaFwiO1xudmFyIHByZXBhcmVBdXRvQmF0Y2hlZCA9ICgpID0+IChwYXlsb2FkKSA9PiAoe1xuICBwYXlsb2FkLFxuICBtZXRhOiB7XG4gICAgW1NIT1VMRF9BVVRPQkFUQ0hdOiB0cnVlXG4gIH1cbn0pO1xudmFyIGNyZWF0ZVF1ZXVlV2l0aFRpbWVyID0gKHRpbWVvdXQpID0+IHtcbiAgcmV0dXJuIChub3RpZnkpID0+IHtcbiAgICBzZXRUaW1lb3V0KG5vdGlmeSwgdGltZW91dCk7XG4gIH07XG59O1xudmFyIGF1dG9CYXRjaEVuaGFuY2VyID0gKG9wdGlvbnMgPSB7XG4gIHR5cGU6IFwicmFmXCJcbn0pID0+IChuZXh0KSA9PiAoLi4uYXJncykgPT4ge1xuICBjb25zdCBzdG9yZSA9IG5leHQoLi4uYXJncyk7XG4gIGxldCBub3RpZnlpbmcgPSB0cnVlO1xuICBsZXQgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSBmYWxzZTtcbiAgbGV0IG5vdGlmaWNhdGlvblF1ZXVlZCA9IGZhbHNlO1xuICBjb25zdCBsaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBxdWV1ZUNhbGxiYWNrID0gb3B0aW9ucy50eXBlID09PSBcInRpY2tcIiA/IHF1ZXVlTWljcm90YXNrIDogb3B0aW9ucy50eXBlID09PSBcInJhZlwiID8gKFxuICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZSB3b24ndCBleGlzdCBpbiBTU1IgZW52aXJvbm1lbnRzLiBGYWxsIGJhY2sgdG8gYSB2YWd1ZSBhcHByb3hpbWF0aW9uIGp1c3QgdG8ga2VlcCBmcm9tIGVycm9yaW5nLlxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgOiBjcmVhdGVRdWV1ZVdpdGhUaW1lcigxMClcbiAgKSA6IG9wdGlvbnMudHlwZSA9PT0gXCJjYWxsYmFja1wiID8gb3B0aW9ucy5xdWV1ZU5vdGlmaWNhdGlvbiA6IGNyZWF0ZVF1ZXVlV2l0aFRpbWVyKG9wdGlvbnMudGltZW91dCk7XG4gIGNvbnN0IG5vdGlmeUxpc3RlbmVycyA9ICgpID0+IHtcbiAgICBub3RpZmljYXRpb25RdWV1ZWQgPSBmYWxzZTtcbiAgICBpZiAoc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2spIHtcbiAgICAgIHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrID0gZmFsc2U7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobCkgPT4gbCgpKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdG9yZSwge1xuICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGBzdG9yZS5zdWJzY3JpYmVgIG1ldGhvZCB0byBrZWVwIG9yaWdpbmFsIGxpc3RlbmVyc1xuICAgIC8vIGZyb20gcnVubmluZyBpZiB3ZSdyZSBkZWxheWluZyBub3RpZmljYXRpb25zXG4gICAgc3Vic2NyaWJlKGxpc3RlbmVyMikge1xuICAgICAgY29uc3Qgd3JhcHBlZExpc3RlbmVyID0gKCkgPT4gbm90aWZ5aW5nICYmIGxpc3RlbmVyMigpO1xuICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUod3JhcHBlZExpc3RlbmVyKTtcbiAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIyKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIyKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICAvLyBPdmVycmlkZSB0aGUgYmFzZSBgc3RvcmUuZGlzcGF0Y2hgIG1ldGhvZCBzbyB0aGF0IHdlIGNhbiBjaGVjayBhY3Rpb25zXG4gICAgLy8gZm9yIHRoZSBgc2hvdWxkQXV0b0JhdGNoYCBmbGFnIGFuZCBkZXRlcm1pbmUgaWYgYmF0Y2hpbmcgaXMgYWN0aXZlXG4gICAgZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBub3RpZnlpbmcgPSAhYWN0aW9uPy5tZXRhPy5bU0hPVUxEX0FVVE9CQVRDSF07XG4gICAgICAgIHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrID0gIW5vdGlmeWluZztcbiAgICAgICAgaWYgKHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrKSB7XG4gICAgICAgICAgaWYgKCFub3RpZmljYXRpb25RdWV1ZWQpIHtcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvblF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICBxdWV1ZUNhbGxiYWNrKG5vdGlmeUxpc3RlbmVycyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdG9yZS5kaXNwYXRjaChhY3Rpb24pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgbm90aWZ5aW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLy8gc3JjL2dldERlZmF1bHRFbmhhbmNlcnMudHNcbnZhciBidWlsZEdldERlZmF1bHRFbmhhbmNlcnMgPSAobWlkZGxld2FyZUVuaGFuY2VyKSA9PiBmdW5jdGlvbiBnZXREZWZhdWx0RW5oYW5jZXJzKG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIGF1dG9CYXRjaCA9IHRydWVcbiAgfSA9IG9wdGlvbnMgPz8ge307XG4gIGxldCBlbmhhbmNlckFycmF5ID0gbmV3IFR1cGxlKG1pZGRsZXdhcmVFbmhhbmNlcik7XG4gIGlmIChhdXRvQmF0Y2gpIHtcbiAgICBlbmhhbmNlckFycmF5LnB1c2goYXV0b0JhdGNoRW5oYW5jZXIodHlwZW9mIGF1dG9CYXRjaCA9PT0gXCJvYmplY3RcIiA/IGF1dG9CYXRjaCA6IHZvaWQgMCkpO1xuICB9XG4gIHJldHVybiBlbmhhbmNlckFycmF5O1xufTtcblxuLy8gc3JjL2NvbmZpZ3VyZVN0b3JlLnRzXG5mdW5jdGlvbiBjb25maWd1cmVTdG9yZShvcHRpb25zKSB7XG4gIGNvbnN0IGdldERlZmF1bHRNaWRkbGV3YXJlID0gYnVpbGRHZXREZWZhdWx0TWlkZGxld2FyZSgpO1xuICBjb25zdCB7XG4gICAgcmVkdWNlciA9IHZvaWQgMCxcbiAgICBtaWRkbGV3YXJlLFxuICAgIGRldlRvb2xzID0gdHJ1ZSxcbiAgICBkdXBsaWNhdGVNaWRkbGV3YXJlQ2hlY2sgPSB0cnVlLFxuICAgIHByZWxvYWRlZFN0YXRlID0gdm9pZCAwLFxuICAgIGVuaGFuY2VycyA9IHZvaWQgMFxuICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgbGV0IHJvb3RSZWR1Y2VyO1xuICBpZiAodHlwZW9mIHJlZHVjZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJvb3RSZWR1Y2VyID0gcmVkdWNlcjtcbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHJlZHVjZXIpKSB7XG4gICAgcm9vdFJlZHVjZXIgPSBjb21iaW5lUmVkdWNlcnMocmVkdWNlcik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMSkgOiBcImByZWR1Y2VyYCBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LCBhbmQgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdCBvZiBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGNvbWJpbmVSZWR1Y2Vyc1wiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIG1pZGRsZXdhcmUgJiYgdHlwZW9mIG1pZGRsZXdhcmUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIpIDogXCJgbWlkZGxld2FyZWAgZmllbGQgbXVzdCBiZSBhIGNhbGxiYWNrXCIpO1xuICB9XG4gIGxldCBmaW5hbE1pZGRsZXdhcmU7XG4gIGlmICh0eXBlb2YgbWlkZGxld2FyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZmluYWxNaWRkbGV3YXJlID0gbWlkZGxld2FyZShnZXREZWZhdWx0TWlkZGxld2FyZSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhQXJyYXkuaXNBcnJheShmaW5hbE1pZGRsZXdhcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzKSA6IFwid2hlbiB1c2luZyBhIG1pZGRsZXdhcmUgYnVpbGRlciBmdW5jdGlvbiwgYW4gYXJyYXkgb2YgbWlkZGxld2FyZSBtdXN0IGJlIHJldHVybmVkXCIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaW5hbE1pZGRsZXdhcmUgPSBnZXREZWZhdWx0TWlkZGxld2FyZSgpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZmluYWxNaWRkbGV3YXJlLnNvbWUoKGl0ZW0pID0+IHR5cGVvZiBpdGVtICE9PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNCkgOiBcImVhY2ggbWlkZGxld2FyZSBwcm92aWRlZCB0byBjb25maWd1cmVTdG9yZSBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBkdXBsaWNhdGVNaWRkbGV3YXJlQ2hlY2spIHtcbiAgICBsZXQgbWlkZGxld2FyZVJlZmVyZW5jZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGZpbmFsTWlkZGxld2FyZS5mb3JFYWNoKChtaWRkbGV3YXJlMikgPT4ge1xuICAgICAgaWYgKG1pZGRsZXdhcmVSZWZlcmVuY2VzLmhhcyhtaWRkbGV3YXJlMikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNDIpIDogXCJEdXBsaWNhdGUgbWlkZGxld2FyZSByZWZlcmVuY2VzIGZvdW5kIHdoZW4gY3JlYXRpbmcgdGhlIHN0b3JlLiBFbnN1cmUgdGhhdCBlYWNoIG1pZGRsZXdhcmUgaXMgb25seSBpbmNsdWRlZCBvbmNlLlwiKTtcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVSZWZlcmVuY2VzLmFkZChtaWRkbGV3YXJlMik7XG4gICAgfSk7XG4gIH1cbiAgbGV0IGZpbmFsQ29tcG9zZSA9IGNvbXBvc2U7XG4gIGlmIChkZXZUb29scykge1xuICAgIGZpbmFsQ29tcG9zZSA9IGNvbXBvc2VXaXRoRGV2VG9vbHMoe1xuICAgICAgLy8gRW5hYmxlIGNhcHR1cmUgb2Ygc3RhY2sgdHJhY2VzIGZvciBkaXNwYXRjaGVkIFJlZHV4IGFjdGlvbnNcbiAgICAgIHRyYWNlOiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIsXG4gICAgICAuLi50eXBlb2YgZGV2VG9vbHMgPT09IFwib2JqZWN0XCIgJiYgZGV2VG9vbHNcbiAgICB9KTtcbiAgfVxuICBjb25zdCBtaWRkbGV3YXJlRW5oYW5jZXIgPSBhcHBseU1pZGRsZXdhcmUoLi4uZmluYWxNaWRkbGV3YXJlKTtcbiAgY29uc3QgZ2V0RGVmYXVsdEVuaGFuY2VycyA9IGJ1aWxkR2V0RGVmYXVsdEVuaGFuY2VycyhtaWRkbGV3YXJlRW5oYW5jZXIpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGVuaGFuY2VycyAmJiB0eXBlb2YgZW5oYW5jZXJzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6IFwiYGVuaGFuY2Vyc2AgZmllbGQgbXVzdCBiZSBhIGNhbGxiYWNrXCIpO1xuICB9XG4gIGxldCBzdG9yZUVuaGFuY2VycyA9IHR5cGVvZiBlbmhhbmNlcnMgPT09IFwiZnVuY3Rpb25cIiA/IGVuaGFuY2VycyhnZXREZWZhdWx0RW5oYW5jZXJzKSA6IGdldERlZmF1bHRFbmhhbmNlcnMoKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhQXJyYXkuaXNBcnJheShzdG9yZUVuaGFuY2VycykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg2KSA6IFwiYGVuaGFuY2Vyc2AgY2FsbGJhY2sgbXVzdCByZXR1cm4gYW4gYXJyYXlcIik7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBzdG9yZUVuaGFuY2Vycy5zb21lKChpdGVtKSA9PiB0eXBlb2YgaXRlbSAhPT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJlYWNoIGVuaGFuY2VyIHByb3ZpZGVkIHRvIGNvbmZpZ3VyZVN0b3JlIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGZpbmFsTWlkZGxld2FyZS5sZW5ndGggJiYgIXN0b3JlRW5oYW5jZXJzLmluY2x1ZGVzKG1pZGRsZXdhcmVFbmhhbmNlcikpIHtcbiAgICBjb25zb2xlLmVycm9yKFwibWlkZGxld2FyZXMgd2VyZSBwcm92aWRlZCwgYnV0IG1pZGRsZXdhcmUgZW5oYW5jZXIgd2FzIG5vdCBpbmNsdWRlZCBpbiBmaW5hbCBlbmhhbmNlcnMgLSBtYWtlIHN1cmUgdG8gY2FsbCBgZ2V0RGVmYXVsdEVuaGFuY2Vyc2BcIik7XG4gIH1cbiAgY29uc3QgY29tcG9zZWRFbmhhbmNlciA9IGZpbmFsQ29tcG9zZSguLi5zdG9yZUVuaGFuY2Vycyk7XG4gIHJldHVybiBjcmVhdGVTdG9yZShyb290UmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGNvbXBvc2VkRW5oYW5jZXIpO1xufVxuXG4vLyBzcmMvbWFwQnVpbGRlcnMudHNcbmZ1bmN0aW9uIGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKGJ1aWxkZXJDYWxsYmFjaykge1xuICBjb25zdCBhY3Rpb25zTWFwID0ge307XG4gIGNvbnN0IGFjdGlvbk1hdGNoZXJzID0gW107XG4gIGxldCBkZWZhdWx0Q2FzZVJlZHVjZXI7XG4gIGNvbnN0IGJ1aWxkZXIgPSB7XG4gICAgYWRkQ2FzZSh0eXBlT3JBY3Rpb25DcmVhdG9yLCByZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChhY3Rpb25NYXRjaGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjYpIDogXCJgYnVpbGRlci5hZGRDYXNlYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYGJ1aWxkZXIuYWRkTWF0Y2hlcmBcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI3KSA6IFwiYGJ1aWxkZXIuYWRkQ2FzZWAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSBcInN0cmluZ1wiID8gdHlwZU9yQWN0aW9uQ3JlYXRvciA6IHR5cGVPckFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyOCkgOiBcImBidWlsZGVyLmFkZENhc2VgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBhbiBlbXB0eSBhY3Rpb24gdHlwZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlIGluIGFjdGlvbnNNYXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjkpIDogYFxcYGJ1aWxkZXIuYWRkQ2FzZVxcYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggdHdvIHJlZHVjZXJzIGZvciB0aGUgc2FtZSBhY3Rpb24gdHlwZSAnJHt0eXBlfSdgKTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbnNNYXBbdHlwZV0gPSByZWR1Y2VyO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGRBc3luY1RodW5rKGFzeW5jVGh1bmssIHJlZHVjZXJzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0MykgOiBcImBidWlsZGVyLmFkZEFzeW5jVGh1bmtgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWBcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZWR1Y2Vycy5wZW5kaW5nKSBhY3Rpb25zTWFwW2FzeW5jVGh1bmsucGVuZGluZy50eXBlXSA9IHJlZHVjZXJzLnBlbmRpbmc7XG4gICAgICBpZiAocmVkdWNlcnMucmVqZWN0ZWQpIGFjdGlvbnNNYXBbYXN5bmNUaHVuay5yZWplY3RlZC50eXBlXSA9IHJlZHVjZXJzLnJlamVjdGVkO1xuICAgICAgaWYgKHJlZHVjZXJzLmZ1bGZpbGxlZCkgYWN0aW9uc01hcFthc3luY1RodW5rLmZ1bGZpbGxlZC50eXBlXSA9IHJlZHVjZXJzLmZ1bGZpbGxlZDtcbiAgICAgIGlmIChyZWR1Y2Vycy5zZXR0bGVkKSBhY3Rpb25NYXRjaGVycy5wdXNoKHtcbiAgICAgICAgbWF0Y2hlcjogYXN5bmNUaHVuay5zZXR0bGVkLFxuICAgICAgICByZWR1Y2VyOiByZWR1Y2Vycy5zZXR0bGVkXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH0sXG4gICAgYWRkTWF0Y2hlcihtYXRjaGVyLCByZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMCkgOiBcImBidWlsZGVyLmFkZE1hdGNoZXJgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWBcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFjdGlvbk1hdGNoZXJzLnB1c2goe1xuICAgICAgICBtYXRjaGVyLFxuICAgICAgICByZWR1Y2VyXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH0sXG4gICAgYWRkRGVmYXVsdENhc2UocmVkdWNlcikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzEpIDogXCJgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWAgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2VcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlZmF1bHRDYXNlUmVkdWNlciA9IHJlZHVjZXI7XG4gICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9XG4gIH07XG4gIGJ1aWxkZXJDYWxsYmFjayhidWlsZGVyKTtcbiAgcmV0dXJuIFthY3Rpb25zTWFwLCBhY3Rpb25NYXRjaGVycywgZGVmYXVsdENhc2VSZWR1Y2VyXTtcbn1cblxuLy8gc3JjL2NyZWF0ZVJlZHVjZXIudHNcbnNldFVzZVN0cmljdEl0ZXJhdGlvbihmYWxzZSk7XG5mdW5jdGlvbiBpc1N0YXRlRnVuY3Rpb24oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlZHVjZXIoaW5pdGlhbFN0YXRlLCBtYXBPckJ1aWxkZXJDYWxsYmFjaykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKHR5cGVvZiBtYXBPckJ1aWxkZXJDYWxsYmFjayA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiBcIlRoZSBvYmplY3Qgbm90YXRpb24gZm9yIGBjcmVhdGVSZWR1Y2VyYCBoYXMgYmVlbiByZW1vdmVkLiBQbGVhc2UgdXNlIHRoZSAnYnVpbGRlciBjYWxsYmFjaycgbm90YXRpb24gaW5zdGVhZDogaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy9hcGkvY3JlYXRlUmVkdWNlclwiKTtcbiAgICB9XG4gIH1cbiAgbGV0IFthY3Rpb25zTWFwLCBmaW5hbEFjdGlvbk1hdGNoZXJzLCBmaW5hbERlZmF1bHRDYXNlUmVkdWNlcl0gPSBleGVjdXRlUmVkdWNlckJ1aWxkZXJDYWxsYmFjayhtYXBPckJ1aWxkZXJDYWxsYmFjayk7XG4gIGxldCBnZXRJbml0aWFsU3RhdGU7XG4gIGlmIChpc1N0YXRlRnVuY3Rpb24oaW5pdGlhbFN0YXRlKSkge1xuICAgIGdldEluaXRpYWxTdGF0ZSA9ICgpID0+IGZyZWV6ZURyYWZ0YWJsZShpbml0aWFsU3RhdGUoKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZnJvemVuSW5pdGlhbFN0YXRlID0gZnJlZXplRHJhZnRhYmxlKGluaXRpYWxTdGF0ZSk7XG4gICAgZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4gZnJvemVuSW5pdGlhbFN0YXRlO1xuICB9XG4gIGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUgPSBnZXRJbml0aWFsU3RhdGUoKSwgYWN0aW9uKSB7XG4gICAgbGV0IGNhc2VSZWR1Y2VycyA9IFthY3Rpb25zTWFwW2FjdGlvbi50eXBlXSwgLi4uZmluYWxBY3Rpb25NYXRjaGVycy5maWx0ZXIoKHtcbiAgICAgIG1hdGNoZXJcbiAgICB9KSA9PiBtYXRjaGVyKGFjdGlvbikpLm1hcCgoe1xuICAgICAgcmVkdWNlcjogcmVkdWNlcjJcbiAgICB9KSA9PiByZWR1Y2VyMildO1xuICAgIGlmIChjYXNlUmVkdWNlcnMuZmlsdGVyKChjcikgPT4gISFjcikubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYXNlUmVkdWNlcnMgPSBbZmluYWxEZWZhdWx0Q2FzZVJlZHVjZXJdO1xuICAgIH1cbiAgICByZXR1cm4gY2FzZVJlZHVjZXJzLnJlZHVjZSgocHJldmlvdXNTdGF0ZSwgY2FzZVJlZHVjZXIpID0+IHtcbiAgICAgIGlmIChjYXNlUmVkdWNlcikge1xuICAgICAgICBpZiAoaXNEcmFmdChwcmV2aW91c1N0YXRlKSkge1xuICAgICAgICAgIGNvbnN0IGRyYWZ0ID0gcHJldmlvdXNTdGF0ZTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYXNlUmVkdWNlcihkcmFmdCwgYWN0aW9uKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1N0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0RyYWZ0YWJsZShwcmV2aW91c1N0YXRlKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc2VSZWR1Y2VyKHByZXZpb3VzU3RhdGUsIGFjdGlvbik7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IEVycm9yKFwiQSBjYXNlIHJlZHVjZXIgb24gYSBub24tZHJhZnRhYmxlIHZhbHVlIG11c3Qgbm90IHJldHVybiB1bmRlZmluZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHByb2R1Y2UocHJldmlvdXNTdGF0ZSwgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2FzZVJlZHVjZXIoZHJhZnQsIGFjdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcmV2aW91c1N0YXRlO1xuICAgIH0sIHN0YXRlKTtcbiAgfVxuICByZWR1Y2VyLmdldEluaXRpYWxTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZTtcbiAgcmV0dXJuIHJlZHVjZXI7XG59XG5cbi8vIHNyYy9tYXRjaGVycy50c1xudmFyIG1hdGNoZXMgPSAobWF0Y2hlciwgYWN0aW9uKSA9PiB7XG4gIGlmIChoYXNNYXRjaEZ1bmN0aW9uKG1hdGNoZXIpKSB7XG4gICAgcmV0dXJuIG1hdGNoZXIubWF0Y2goYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbWF0Y2hlcihhY3Rpb24pO1xuICB9XG59O1xuZnVuY3Rpb24gaXNBbnlPZiguLi5tYXRjaGVycykge1xuICByZXR1cm4gKGFjdGlvbikgPT4ge1xuICAgIHJldHVybiBtYXRjaGVycy5zb21lKChtYXRjaGVyKSA9PiBtYXRjaGVzKG1hdGNoZXIsIGFjdGlvbikpO1xuICB9O1xufVxuZnVuY3Rpb24gaXNBbGxPZiguLi5tYXRjaGVycykge1xuICByZXR1cm4gKGFjdGlvbikgPT4ge1xuICAgIHJldHVybiBtYXRjaGVycy5ldmVyeSgobWF0Y2hlcikgPT4gbWF0Y2hlcyhtYXRjaGVyLCBhY3Rpb24pKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgdmFsaWRTdGF0dXMpIHtcbiAgaWYgKCFhY3Rpb24gfHwgIWFjdGlvbi5tZXRhKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGhhc1ZhbGlkUmVxdWVzdElkID0gdHlwZW9mIGFjdGlvbi5tZXRhLnJlcXVlc3RJZCA9PT0gXCJzdHJpbmdcIjtcbiAgY29uc3QgaGFzVmFsaWRSZXF1ZXN0U3RhdHVzID0gdmFsaWRTdGF0dXMuaW5kZXhPZihhY3Rpb24ubWV0YS5yZXF1ZXN0U3RhdHVzKSA+IC0xO1xuICByZXR1cm4gaGFzVmFsaWRSZXF1ZXN0SWQgJiYgaGFzVmFsaWRSZXF1ZXN0U3RhdHVzO1xufVxuZnVuY3Rpb24gaXNBc3luY1RodW5rQXJyYXkoYSkge1xuICByZXR1cm4gdHlwZW9mIGFbMF0gPT09IFwiZnVuY3Rpb25cIiAmJiBcInBlbmRpbmdcIiBpbiBhWzBdICYmIFwiZnVsZmlsbGVkXCIgaW4gYVswXSAmJiBcInJlamVjdGVkXCIgaW4gYVswXTtcbn1cbmZ1bmN0aW9uIGlzUGVuZGluZyguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wicGVuZGluZ1wiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNQZW5kaW5nKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLm1hcCgoYXN5bmNUaHVuaykgPT4gYXN5bmNUaHVuay5wZW5kaW5nKSk7XG59XG5mdW5jdGlvbiBpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJyZWplY3RlZFwiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNSZWplY3RlZCgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5tYXAoKGFzeW5jVGh1bmspID0+IGFzeW5jVGh1bmsucmVqZWN0ZWQpKTtcbn1cbmZ1bmN0aW9uIGlzUmVqZWN0ZWRXaXRoVmFsdWUoLi4uYXN5bmNUaHVua3MpIHtcbiAgY29uc3QgaGFzRmxhZyA9IChhY3Rpb24pID0+IHtcbiAgICByZXR1cm4gYWN0aW9uICYmIGFjdGlvbi5tZXRhICYmIGFjdGlvbi5tZXRhLnJlamVjdGVkV2l0aFZhbHVlO1xuICB9O1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGlzQWxsT2YoaXNSZWplY3RlZCguLi5hc3luY1RodW5rcyksIGhhc0ZsYWcpO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzUmVqZWN0ZWRXaXRoVmFsdWUoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQWxsT2YoaXNSZWplY3RlZCguLi5hc3luY1RodW5rcyksIGhhc0ZsYWcpO1xufVxuZnVuY3Rpb24gaXNGdWxmaWxsZWQoLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcImZ1bGZpbGxlZFwiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNGdWxmaWxsZWQoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MubWFwKChhc3luY1RodW5rKSA9PiBhc3luY1RodW5rLmZ1bGZpbGxlZCkpO1xufVxuZnVuY3Rpb24gaXNBc3luY1RodW5rQWN0aW9uKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJwZW5kaW5nXCIsIFwiZnVsZmlsbGVkXCIsIFwicmVqZWN0ZWRcIl0pO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzQXN5bmNUaHVua0FjdGlvbigpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5mbGF0TWFwKChhc3luY1RodW5rKSA9PiBbYXN5bmNUaHVuay5wZW5kaW5nLCBhc3luY1RodW5rLnJlamVjdGVkLCBhc3luY1RodW5rLmZ1bGZpbGxlZF0pKTtcbn1cblxuLy8gc3JjL25hbm9pZC50c1xudmFyIHVybEFscGhhYmV0ID0gXCJNb2R1bGVTeW1iaGFzT3duUHItMDEyMzQ1Njc4OUFCQ0RFRkdITlJWZmdjdGlVdnpfS3FZVEprTHhwWlhJalFXXCI7XG52YXIgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuICBsZXQgaWQgPSBcIlwiO1xuICBsZXQgaSA9IHNpemU7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBpZCArPSB1cmxBbHBoYWJldFtNYXRoLnJhbmRvbSgpICogNjQgfCAwXTtcbiAgfVxuICByZXR1cm4gaWQ7XG59O1xuXG4vLyBzcmMvY3JlYXRlQXN5bmNUaHVuay50c1xudmFyIGNvbW1vblByb3BlcnRpZXMgPSBbXCJuYW1lXCIsIFwibWVzc2FnZVwiLCBcInN0YWNrXCIsIFwiY29kZVwiXTtcbnZhciBSZWplY3RXaXRoVmFsdWUgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHBheWxvYWQsIG1ldGEpIHtcbiAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gIH1cbiAgLypcbiAgdHlwZS1vbmx5IHByb3BlcnR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gUmVqZWN0V2l0aFZhbHVlIGFuZCBGdWxmaWxsV2l0aE1ldGFcbiAgZG9lcyBub3QgZXhpc3QgYXQgcnVudGltZVxuICAqL1xuICBfdHlwZTtcbn07XG52YXIgRnVsZmlsbFdpdGhNZXRhID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihwYXlsb2FkLCBtZXRhKSB7XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICB9XG4gIC8qXG4gIHR5cGUtb25seSBwcm9wZXJ0eSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIFJlamVjdFdpdGhWYWx1ZSBhbmQgRnVsZmlsbFdpdGhNZXRhXG4gIGRvZXMgbm90IGV4aXN0IGF0IHJ1bnRpbWVcbiAgKi9cbiAgX3R5cGU7XG59O1xudmFyIG1pbmlTZXJpYWxpemVFcnJvciA9ICh2YWx1ZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc2ltcGxlRXJyb3IgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGNvbW1vblByb3BlcnRpZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWVbcHJvcGVydHldID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHNpbXBsZUVycm9yW3Byb3BlcnR5XSA9IHZhbHVlW3Byb3BlcnR5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNpbXBsZUVycm9yO1xuICB9XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogU3RyaW5nKHZhbHVlKVxuICB9O1xufTtcbnZhciBleHRlcm5hbEFib3J0TWVzc2FnZSA9IFwiRXh0ZXJuYWwgc2lnbmFsIHdhcyBhYm9ydGVkXCI7XG52YXIgY3JlYXRlQXN5bmNUaHVuayA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4ge1xuICBmdW5jdGlvbiBjcmVhdGVBc3luY1RodW5rMih0eXBlUHJlZml4LCBwYXlsb2FkQ3JlYXRvciwgb3B0aW9ucykge1xuICAgIGNvbnN0IGZ1bGZpbGxlZCA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvZnVsZmlsbGVkXCIsIChwYXlsb2FkLCByZXF1ZXN0SWQsIGFyZywgbWV0YSkgPT4gKHtcbiAgICAgIHBheWxvYWQsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLm1ldGEgfHwge30sXG4gICAgICAgIGFyZyxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZXF1ZXN0U3RhdHVzOiBcImZ1bGZpbGxlZFwiXG4gICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IHBlbmRpbmcgPSBjcmVhdGVBY3Rpb24odHlwZVByZWZpeCArIFwiL3BlbmRpbmdcIiwgKHJlcXVlc3RJZCwgYXJnLCBtZXRhKSA9PiAoe1xuICAgICAgcGF5bG9hZDogdm9pZCAwLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi5tZXRhIHx8IHt9LFxuICAgICAgICBhcmcsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcmVxdWVzdFN0YXR1czogXCJwZW5kaW5nXCJcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgY29uc3QgcmVqZWN0ZWQgPSBjcmVhdGVBY3Rpb24odHlwZVByZWZpeCArIFwiL3JlamVjdGVkXCIsIChlcnJvciwgcmVxdWVzdElkLCBhcmcsIHBheWxvYWQsIG1ldGEpID0+ICh7XG4gICAgICBwYXlsb2FkLFxuICAgICAgZXJyb3I6IChvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplRXJyb3IgfHwgbWluaVNlcmlhbGl6ZUVycm9yKShlcnJvciB8fCBcIlJlamVjdGVkXCIpLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi5tZXRhIHx8IHt9LFxuICAgICAgICBhcmcsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcmVqZWN0ZWRXaXRoVmFsdWU6ICEhcGF5bG9hZCxcbiAgICAgICAgcmVxdWVzdFN0YXR1czogXCJyZWplY3RlZFwiLFxuICAgICAgICBhYm9ydGVkOiBlcnJvcj8ubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIsXG4gICAgICAgIGNvbmRpdGlvbjogZXJyb3I/Lm5hbWUgPT09IFwiQ29uZGl0aW9uRXJyb3JcIlxuICAgICAgfVxuICAgIH0pKTtcbiAgICBmdW5jdGlvbiBhY3Rpb25DcmVhdG9yKGFyZywge1xuICAgICAgc2lnbmFsXG4gICAgfSA9IHt9KSB7XG4gICAgICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmEpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gb3B0aW9ucz8uaWRHZW5lcmF0b3IgPyBvcHRpb25zLmlkR2VuZXJhdG9yKGFyZykgOiBuYW5vaWQoKTtcbiAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBsZXQgYWJvcnRIYW5kbGVyO1xuICAgICAgICBsZXQgYWJvcnRSZWFzb247XG4gICAgICAgIGZ1bmN0aW9uIGFib3J0KHJlYXNvbikge1xuICAgICAgICAgIGFib3J0UmVhc29uID0gcmVhc29uO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIGFib3J0KGV4dGVybmFsQWJvcnRNZXNzYWdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiBhYm9ydChleHRlcm5hbEFib3J0TWVzc2FnZSksIHtcbiAgICAgICAgICAgICAgb25jZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgICAgICBsZXQgZmluYWxBY3Rpb247XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjb25kaXRpb25SZXN1bHQgPSBvcHRpb25zPy5jb25kaXRpb24/LihhcmcsIHtcbiAgICAgICAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgICAgICAgIGV4dHJhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKGNvbmRpdGlvblJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ID0gYXdhaXQgY29uZGl0aW9uUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvblJlc3VsdCA9PT0gZmFsc2UgfHwgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgIHRocm93IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbmRpdGlvbkVycm9yXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJBYm9ydGVkIGR1ZSB0byBjb25kaXRpb24gY2FsbGJhY2sgcmV0dXJuaW5nIGZhbHNlLlwiXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhYm9ydGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgYWJvcnRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcIkFib3J0RXJyb3JcIixcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGFib3J0UmVhc29uIHx8IFwiQWJvcnRlZFwiXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHBlbmRpbmcocmVxdWVzdElkLCBhcmcsIG9wdGlvbnM/LmdldFBlbmRpbmdNZXRhPy4oe1xuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBnZXRTdGF0ZSxcbiAgICAgICAgICAgICAgZXh0cmFcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICBmaW5hbEFjdGlvbiA9IGF3YWl0IFByb21pc2UucmFjZShbYWJvcnRlZFByb21pc2UsIFByb21pc2UucmVzb2x2ZShwYXlsb2FkQ3JlYXRvcihhcmcsIHtcbiAgICAgICAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgICAgICAgIGdldFN0YXRlLFxuICAgICAgICAgICAgICBleHRyYSxcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgIGFib3J0LFxuICAgICAgICAgICAgICByZWplY3RXaXRoVmFsdWU6ICh2YWx1ZSwgbWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVqZWN0V2l0aFZhbHVlKHZhbHVlLCBtZXRhKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVsZmlsbFdpdGhWYWx1ZTogKHZhbHVlLCBtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdWxmaWxsV2l0aE1ldGEodmFsdWUsIG1ldGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZWplY3RXaXRoVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEZ1bGZpbGxXaXRoTWV0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmdWxmaWxsZWQocmVzdWx0LnBheWxvYWQsIHJlcXVlc3RJZCwgYXJnLCByZXN1bHQubWV0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bGZpbGxlZChyZXN1bHQsIHJlcXVlc3RJZCwgYXJnKTtcbiAgICAgICAgICAgIH0pXSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBmaW5hbEFjdGlvbiA9IGVyciBpbnN0YW5jZW9mIFJlamVjdFdpdGhWYWx1ZSA/IHJlamVjdGVkKG51bGwsIHJlcXVlc3RJZCwgYXJnLCBlcnIucGF5bG9hZCwgZXJyLm1ldGEpIDogcmVqZWN0ZWQoZXJyLCByZXF1ZXN0SWQsIGFyZyk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChhYm9ydEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRIYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc2tpcERpc3BhdGNoID0gb3B0aW9ucyAmJiAhb3B0aW9ucy5kaXNwYXRjaENvbmRpdGlvblJlamVjdGlvbiAmJiByZWplY3RlZC5tYXRjaChmaW5hbEFjdGlvbikgJiYgZmluYWxBY3Rpb24ubWV0YS5jb25kaXRpb247XG4gICAgICAgICAgaWYgKCFza2lwRGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGZpbmFsQWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpbmFsQWN0aW9uO1xuICAgICAgICB9KCk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHByb21pc2UsIHtcbiAgICAgICAgICBhYm9ydCxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgYXJnLFxuICAgICAgICAgIHVud3JhcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4odW53cmFwUmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWN0aW9uQ3JlYXRvciwge1xuICAgICAgcGVuZGluZyxcbiAgICAgIHJlamVjdGVkLFxuICAgICAgZnVsZmlsbGVkLFxuICAgICAgc2V0dGxlZDogaXNBbnlPZihyZWplY3RlZCwgZnVsZmlsbGVkKSxcbiAgICAgIHR5cGVQcmVmaXhcbiAgICB9KTtcbiAgfVxuICBjcmVhdGVBc3luY1RodW5rMi53aXRoVHlwZXMgPSAoKSA9PiBjcmVhdGVBc3luY1RodW5rMjtcbiAgcmV0dXJuIGNyZWF0ZUFzeW5jVGh1bmsyO1xufSkoKTtcbmZ1bmN0aW9uIHVud3JhcFJlc3VsdChhY3Rpb24pIHtcbiAgaWYgKGFjdGlvbi5tZXRhICYmIGFjdGlvbi5tZXRhLnJlamVjdGVkV2l0aFZhbHVlKSB7XG4gICAgdGhyb3cgYWN0aW9uLnBheWxvYWQ7XG4gIH1cbiAgaWYgKGFjdGlvbi5lcnJvcikge1xuICAgIHRocm93IGFjdGlvbi5lcnJvcjtcbiAgfVxuICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG59XG5mdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuLy8gc3JjL2NyZWF0ZVNsaWNlLnRzXG52YXIgYXN5bmNUaHVua1N5bWJvbCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwicnRrLXNsaWNlLWNyZWF0ZWFzeW5jdGh1bmtcIik7XG52YXIgYXN5bmNUaHVua0NyZWF0b3IgPSB7XG4gIFthc3luY1RodW5rU3ltYm9sXTogY3JlYXRlQXN5bmNUaHVua1xufTtcbnZhciBSZWR1Y2VyVHlwZSA9IC8qIEBfX1BVUkVfXyAqLyAoKFJlZHVjZXJUeXBlMikgPT4ge1xuICBSZWR1Y2VyVHlwZTJbXCJyZWR1Y2VyXCJdID0gXCJyZWR1Y2VyXCI7XG4gIFJlZHVjZXJUeXBlMltcInJlZHVjZXJXaXRoUHJlcGFyZVwiXSA9IFwicmVkdWNlcldpdGhQcmVwYXJlXCI7XG4gIFJlZHVjZXJUeXBlMltcImFzeW5jVGh1bmtcIl0gPSBcImFzeW5jVGh1bmtcIjtcbiAgcmV0dXJuIFJlZHVjZXJUeXBlMjtcbn0pKFJlZHVjZXJUeXBlIHx8IHt9KTtcbmZ1bmN0aW9uIGdldFR5cGUoc2xpY2UsIGFjdGlvbktleSkge1xuICByZXR1cm4gYCR7c2xpY2V9LyR7YWN0aW9uS2V5fWA7XG59XG5mdW5jdGlvbiBidWlsZENyZWF0ZVNsaWNlKHtcbiAgY3JlYXRvcnNcbn0gPSB7fSkge1xuICBjb25zdCBjQVQgPSBjcmVhdG9ycz8uYXN5bmNUaHVuaz8uW2FzeW5jVGh1bmtTeW1ib2xdO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlU2xpY2UyKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgcmVkdWNlclBhdGggPSBuYW1lXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMSkgOiBcImBuYW1lYCBpcyBhIHJlcXVpcmVkIG9wdGlvbiBmb3IgY3JlYXRlU2xpY2VcIik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbml0aWFsU3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiWW91IG11c3QgcHJvdmlkZSBhbiBgaW5pdGlhbFN0YXRlYCB2YWx1ZSB0aGF0IGlzIG5vdCBgdW5kZWZpbmVkYC4gWW91IG1heSBoYXZlIG1pc3NwZWxsZWQgYGluaXRpYWxTdGF0ZWBcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlZHVjZXJzID0gKHR5cGVvZiBvcHRpb25zLnJlZHVjZXJzID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLnJlZHVjZXJzKGJ1aWxkUmVkdWNlckNyZWF0b3JzKCkpIDogb3B0aW9ucy5yZWR1Y2VycykgfHwge307XG4gICAgY29uc3QgcmVkdWNlck5hbWVzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBzbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZToge30sXG4gICAgICBzbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZToge30sXG4gICAgICBhY3Rpb25DcmVhdG9yczoge30sXG4gICAgICBzbGljZU1hdGNoZXJzOiBbXVxuICAgIH07XG4gICAgY29uc3QgY29udGV4dE1ldGhvZHMgPSB7XG4gICAgICBhZGRDYXNlKHR5cGVPckFjdGlvbkNyZWF0b3IsIHJlZHVjZXIyKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdHlwZU9yQWN0aW9uQ3JlYXRvciA9PT0gXCJzdHJpbmdcIiA/IHR5cGVPckFjdGlvbkNyZWF0b3IgOiB0eXBlT3JBY3Rpb25DcmVhdG9yLnR5cGU7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IFwiYGNvbnRleHQuYWRkQ2FzZWAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGFjdGlvbiB0eXBlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlIGluIGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMykgOiBcImBjb250ZXh0LmFkZENhc2VgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCB0d28gcmVkdWNlcnMgZm9yIHRoZSBzYW1lIGFjdGlvbiB0eXBlOiBcIiArIHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGVbdHlwZV0gPSByZWR1Y2VyMjtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfSxcbiAgICAgIGFkZE1hdGNoZXIobWF0Y2hlciwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29udGV4dC5zbGljZU1hdGNoZXJzLnB1c2goe1xuICAgICAgICAgIG1hdGNoZXIsXG4gICAgICAgICAgcmVkdWNlcjogcmVkdWNlcjJcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH0sXG4gICAgICBleHBvc2VBY3Rpb24obmFtZTIsIGFjdGlvbkNyZWF0b3IpIHtcbiAgICAgICAgY29udGV4dC5hY3Rpb25DcmVhdG9yc1tuYW1lMl0gPSBhY3Rpb25DcmVhdG9yO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9LFxuICAgICAgZXhwb3NlQ2FzZVJlZHVjZXIobmFtZTIsIHJlZHVjZXIyKSB7XG4gICAgICAgIGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeU5hbWVbbmFtZTJdID0gcmVkdWNlcjI7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlZHVjZXJOYW1lcy5mb3JFYWNoKChyZWR1Y2VyTmFtZSkgPT4ge1xuICAgICAgY29uc3QgcmVkdWNlckRlZmluaXRpb24gPSByZWR1Y2Vyc1tyZWR1Y2VyTmFtZV07XG4gICAgICBjb25zdCByZWR1Y2VyRGV0YWlscyA9IHtcbiAgICAgICAgcmVkdWNlck5hbWUsXG4gICAgICAgIHR5cGU6IGdldFR5cGUobmFtZSwgcmVkdWNlck5hbWUpLFxuICAgICAgICBjcmVhdGVOb3RhdGlvbjogdHlwZW9mIG9wdGlvbnMucmVkdWNlcnMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgfTtcbiAgICAgIGlmIChpc0FzeW5jVGh1bmtTbGljZVJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZWZpbml0aW9uKSkge1xuICAgICAgICBoYW5kbGVUaHVua0Nhc2VSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGV0YWlscywgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHRNZXRob2RzLCBjQVQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFuZGxlTm9ybWFsUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRldGFpbHMsIHJlZHVjZXJEZWZpbml0aW9uLCBjb250ZXh0TWV0aG9kcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gYnVpbGRSZWR1Y2VyKCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZXh0cmFSZWR1Y2VycyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE0KSA6IFwiVGhlIG9iamVjdCBub3RhdGlvbiBmb3IgYGNyZWF0ZVNsaWNlLmV4dHJhUmVkdWNlcnNgIGhhcyBiZWVuIHJlbW92ZWQuIFBsZWFzZSB1c2UgdGhlICdidWlsZGVyIGNhbGxiYWNrJyBub3RhdGlvbiBpbnN0ZWFkOiBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL2FwaS9jcmVhdGVTbGljZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgW2V4dHJhUmVkdWNlcnMgPSB7fSwgYWN0aW9uTWF0Y2hlcnMgPSBbXSwgZGVmYXVsdENhc2VSZWR1Y2VyID0gdm9pZCAwXSA9IHR5cGVvZiBvcHRpb25zLmV4dHJhUmVkdWNlcnMgPT09IFwiZnVuY3Rpb25cIiA/IGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKG9wdGlvbnMuZXh0cmFSZWR1Y2VycykgOiBbb3B0aW9ucy5leHRyYVJlZHVjZXJzXTtcbiAgICAgIGNvbnN0IGZpbmFsQ2FzZVJlZHVjZXJzID0ge1xuICAgICAgICAuLi5leHRyYVJlZHVjZXJzLFxuICAgICAgICAuLi5jb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlZHVjZXIob3B0aW9ucy5pbml0aWFsU3RhdGUsIChidWlsZGVyKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBmaW5hbENhc2VSZWR1Y2Vycykge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkQ2FzZShrZXksIGZpbmFsQ2FzZVJlZHVjZXJzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHNNIG9mIGNvbnRleHQuc2xpY2VNYXRjaGVycykge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkTWF0Y2hlcihzTS5tYXRjaGVyLCBzTS5yZWR1Y2VyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBtIG9mIGFjdGlvbk1hdGNoZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRNYXRjaGVyKG0ubWF0Y2hlciwgbS5yZWR1Y2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGREZWZhdWx0Q2FzZShkZWZhdWx0Q2FzZVJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0U2VsZiA9IChzdGF0ZSkgPT4gc3RhdGU7XG4gICAgY29uc3QgaW5qZWN0ZWRTZWxlY3RvckNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBjb25zdCBpbmplY3RlZFN0YXRlQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgICBsZXQgX3JlZHVjZXI7XG4gICAgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICBpZiAoIV9yZWR1Y2VyKSBfcmVkdWNlciA9IGJ1aWxkUmVkdWNlcigpO1xuICAgICAgcmV0dXJuIF9yZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgICBpZiAoIV9yZWR1Y2VyKSBfcmVkdWNlciA9IGJ1aWxkUmVkdWNlcigpO1xuICAgICAgcmV0dXJuIF9yZWR1Y2VyLmdldEluaXRpYWxTdGF0ZSgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlU2VsZWN0b3JQcm9wcyhyZWR1Y2VyUGF0aDIsIGluamVjdGVkID0gZmFsc2UpIHtcbiAgICAgIGZ1bmN0aW9uIHNlbGVjdFNsaWNlKHN0YXRlKSB7XG4gICAgICAgIGxldCBzbGljZVN0YXRlID0gc3RhdGVbcmVkdWNlclBhdGgyXTtcbiAgICAgICAgaWYgKHR5cGVvZiBzbGljZVN0YXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaWYgKGluamVjdGVkKSB7XG4gICAgICAgICAgICBzbGljZVN0YXRlID0gZ2V0T3JJbnNlcnRDb21wdXRlZChpbmplY3RlZFN0YXRlQ2FjaGUsIHNlbGVjdFNsaWNlLCBnZXRJbml0aWFsU3RhdGUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNSkgOiBcInNlbGVjdFNsaWNlIHJldHVybmVkIHVuZGVmaW5lZCBmb3IgYW4gdW5pbmplY3RlZCBzbGljZSByZWR1Y2VyXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2xpY2VTdGF0ZTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGdldFNlbGVjdG9ycyhzZWxlY3RTdGF0ZSA9IHNlbGVjdFNlbGYpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3JDYWNoZSA9IGdldE9ySW5zZXJ0Q29tcHV0ZWQoaW5qZWN0ZWRTZWxlY3RvckNhY2hlLCBpbmplY3RlZCwgKCkgPT4gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCkpO1xuICAgICAgICByZXR1cm4gZ2V0T3JJbnNlcnRDb21wdXRlZChzZWxlY3RvckNhY2hlLCBzZWxlY3RTdGF0ZSwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hcCA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgW25hbWUyLCBzZWxlY3Rvcl0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5zZWxlY3RvcnMgPz8ge30pKSB7XG4gICAgICAgICAgICBtYXBbbmFtZTJdID0gd3JhcFNlbGVjdG9yKHNlbGVjdG9yLCBzZWxlY3RTdGF0ZSwgKCkgPT4gZ2V0T3JJbnNlcnRDb21wdXRlZChpbmplY3RlZFN0YXRlQ2FjaGUsIHNlbGVjdFN0YXRlLCBnZXRJbml0aWFsU3RhdGUpLCBpbmplY3RlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVkdWNlclBhdGg6IHJlZHVjZXJQYXRoMixcbiAgICAgICAgZ2V0U2VsZWN0b3JzLFxuICAgICAgICBnZXQgc2VsZWN0b3JzKCkge1xuICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RvcnMoc2VsZWN0U2xpY2UpO1xuICAgICAgICB9LFxuICAgICAgICBzZWxlY3RTbGljZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2xpY2UgPSB7XG4gICAgICBuYW1lLFxuICAgICAgcmVkdWNlcixcbiAgICAgIGFjdGlvbnM6IGNvbnRleHQuYWN0aW9uQ3JlYXRvcnMsXG4gICAgICBjYXNlUmVkdWNlcnM6IGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeU5hbWUsXG4gICAgICBnZXRJbml0aWFsU3RhdGUsXG4gICAgICAuLi5tYWtlU2VsZWN0b3JQcm9wcyhyZWR1Y2VyUGF0aCksXG4gICAgICBpbmplY3RJbnRvKGluamVjdGFibGUsIHtcbiAgICAgICAgcmVkdWNlclBhdGg6IHBhdGhPcHQsXG4gICAgICAgIC4uLmNvbmZpZ1xuICAgICAgfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG5ld1JlZHVjZXJQYXRoID0gcGF0aE9wdCA/PyByZWR1Y2VyUGF0aDtcbiAgICAgICAgaW5qZWN0YWJsZS5pbmplY3Qoe1xuICAgICAgICAgIHJlZHVjZXJQYXRoOiBuZXdSZWR1Y2VyUGF0aCxcbiAgICAgICAgICByZWR1Y2VyXG4gICAgICAgIH0sIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc2xpY2UsXG4gICAgICAgICAgLi4ubWFrZVNlbGVjdG9yUHJvcHMobmV3UmVkdWNlclBhdGgsIHRydWUpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gc2xpY2U7XG4gIH07XG59XG5mdW5jdGlvbiB3cmFwU2VsZWN0b3Ioc2VsZWN0b3IsIHNlbGVjdFN0YXRlLCBnZXRJbml0aWFsU3RhdGUsIGluamVjdGVkKSB7XG4gIGZ1bmN0aW9uIHdyYXBwZXIocm9vdFN0YXRlLCAuLi5hcmdzKSB7XG4gICAgbGV0IHNsaWNlU3RhdGUgPSBzZWxlY3RTdGF0ZShyb290U3RhdGUpO1xuICAgIGlmICh0eXBlb2Ygc2xpY2VTdGF0ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKGluamVjdGVkKSB7XG4gICAgICAgIHNsaWNlU3RhdGUgPSBnZXRJbml0aWFsU3RhdGUoKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IFwic2VsZWN0U3RhdGUgcmV0dXJuZWQgdW5kZWZpbmVkIGZvciBhbiB1bmluamVjdGVkIHNsaWNlIHJlZHVjZXJcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RvcihzbGljZVN0YXRlLCAuLi5hcmdzKTtcbiAgfVxuICB3cmFwcGVyLnVud3JhcHBlZCA9IHNlbGVjdG9yO1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbnZhciBjcmVhdGVTbGljZSA9IC8qIEBfX1BVUkVfXyAqLyBidWlsZENyZWF0ZVNsaWNlKCk7XG5mdW5jdGlvbiBidWlsZFJlZHVjZXJDcmVhdG9ycygpIHtcbiAgZnVuY3Rpb24gYXN5bmNUaHVuayhwYXlsb2FkQ3JlYXRvciwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwiYXN5bmNUaHVua1wiIC8qIGFzeW5jVGh1bmsgKi8sXG4gICAgICBwYXlsb2FkQ3JlYXRvcixcbiAgICAgIC4uLmNvbmZpZ1xuICAgIH07XG4gIH1cbiAgYXN5bmNUaHVuay53aXRoVHlwZXMgPSAoKSA9PiBhc3luY1RodW5rO1xuICByZXR1cm4ge1xuICAgIHJlZHVjZXIoY2FzZVJlZHVjZXIpIHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgLy8gaGFjayBzbyB0aGUgd3JhcHBpbmcgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9yaWdpbmFsXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzbyB0aGUgYHJlZHVjZXJEZWZpbml0aW9uVHlwZWAgaXMgbm90IGFzc2lnbmVkIHRvIHRoZSBvcmlnaW5hbFxuICAgICAgICBbY2FzZVJlZHVjZXIubmFtZV0oLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiBjYXNlUmVkdWNlciguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfVtjYXNlUmVkdWNlci5uYW1lXSwge1xuICAgICAgICBfcmVkdWNlckRlZmluaXRpb25UeXBlOiBcInJlZHVjZXJcIiAvKiByZWR1Y2VyICovXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByZXBhcmVkUmVkdWNlcihwcmVwYXJlLCByZWR1Y2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfcmVkdWNlckRlZmluaXRpb25UeXBlOiBcInJlZHVjZXJXaXRoUHJlcGFyZVwiIC8qIHJlZHVjZXJXaXRoUHJlcGFyZSAqLyxcbiAgICAgICAgcHJlcGFyZSxcbiAgICAgICAgcmVkdWNlclxuICAgICAgfTtcbiAgICB9LFxuICAgIGFzeW5jVGh1bmtcbiAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZU5vcm1hbFJlZHVjZXJEZWZpbml0aW9uKHtcbiAgdHlwZSxcbiAgcmVkdWNlck5hbWUsXG4gIGNyZWF0ZU5vdGF0aW9uXG59LCBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZSwgY29udGV4dCkge1xuICBsZXQgY2FzZVJlZHVjZXI7XG4gIGxldCBwcmVwYXJlQ2FsbGJhY2s7XG4gIGlmIChcInJlZHVjZXJcIiBpbiBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZSkge1xuICAgIGlmIChjcmVhdGVOb3RhdGlvbiAmJiAhaXNDYXNlUmVkdWNlcldpdGhQcmVwYXJlRGVmaW5pdGlvbihtYXliZVJlZHVjZXJXaXRoUHJlcGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE3KSA6IFwiUGxlYXNlIHVzZSB0aGUgYGNyZWF0ZS5wcmVwYXJlZFJlZHVjZXJgIG5vdGF0aW9uIGZvciBwcmVwYXJlZCBhY3Rpb24gY3JlYXRvcnMgd2l0aCB0aGUgYGNyZWF0ZWAgbm90YXRpb24uXCIpO1xuICAgIH1cbiAgICBjYXNlUmVkdWNlciA9IG1heWJlUmVkdWNlcldpdGhQcmVwYXJlLnJlZHVjZXI7XG4gICAgcHJlcGFyZUNhbGxiYWNrID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucHJlcGFyZTtcbiAgfSBlbHNlIHtcbiAgICBjYXNlUmVkdWNlciA9IG1heWJlUmVkdWNlcldpdGhQcmVwYXJlO1xuICB9XG4gIGNvbnRleHQuYWRkQ2FzZSh0eXBlLCBjYXNlUmVkdWNlcikuZXhwb3NlQ2FzZVJlZHVjZXIocmVkdWNlck5hbWUsIGNhc2VSZWR1Y2VyKS5leHBvc2VBY3Rpb24ocmVkdWNlck5hbWUsIHByZXBhcmVDYWxsYmFjayA/IGNyZWF0ZUFjdGlvbih0eXBlLCBwcmVwYXJlQ2FsbGJhY2spIDogY3JlYXRlQWN0aW9uKHR5cGUpKTtcbn1cbmZ1bmN0aW9uIGlzQXN5bmNUaHVua1NsaWNlUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pIHtcbiAgcmV0dXJuIHJlZHVjZXJEZWZpbml0aW9uLl9yZWR1Y2VyRGVmaW5pdGlvblR5cGUgPT09IFwiYXN5bmNUaHVua1wiIC8qIGFzeW5jVGh1bmsgKi87XG59XG5mdW5jdGlvbiBpc0Nhc2VSZWR1Y2VyV2l0aFByZXBhcmVEZWZpbml0aW9uKHJlZHVjZXJEZWZpbml0aW9uKSB7XG4gIHJldHVybiByZWR1Y2VyRGVmaW5pdGlvbi5fcmVkdWNlckRlZmluaXRpb25UeXBlID09PSBcInJlZHVjZXJXaXRoUHJlcGFyZVwiIC8qIHJlZHVjZXJXaXRoUHJlcGFyZSAqLztcbn1cbmZ1bmN0aW9uIGhhbmRsZVRodW5rQ2FzZVJlZHVjZXJEZWZpbml0aW9uKHtcbiAgdHlwZSxcbiAgcmVkdWNlck5hbWVcbn0sIHJlZHVjZXJEZWZpbml0aW9uLCBjb250ZXh0LCBjQVQpIHtcbiAgaWYgKCFjQVQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxOCkgOiBcIkNhbm5vdCB1c2UgYGNyZWF0ZS5hc3luY1RodW5rYCBpbiB0aGUgYnVpbHQtaW4gYGNyZWF0ZVNsaWNlYC4gVXNlIGBidWlsZENyZWF0ZVNsaWNlKHsgY3JlYXRvcnM6IHsgYXN5bmNUaHVuazogYXN5bmNUaHVua0NyZWF0b3IgfSB9KWAgdG8gY3JlYXRlIGEgY3VzdG9taXNlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTbGljZWAuXCIpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBwYXlsb2FkQ3JlYXRvcixcbiAgICBmdWxmaWxsZWQsXG4gICAgcGVuZGluZyxcbiAgICByZWplY3RlZCxcbiAgICBzZXR0bGVkLFxuICAgIG9wdGlvbnNcbiAgfSA9IHJlZHVjZXJEZWZpbml0aW9uO1xuICBjb25zdCB0aHVuayA9IGNBVCh0eXBlLCBwYXlsb2FkQ3JlYXRvciwgb3B0aW9ucyk7XG4gIGNvbnRleHQuZXhwb3NlQWN0aW9uKHJlZHVjZXJOYW1lLCB0aHVuayk7XG4gIGlmIChmdWxmaWxsZWQpIHtcbiAgICBjb250ZXh0LmFkZENhc2UodGh1bmsuZnVsZmlsbGVkLCBmdWxmaWxsZWQpO1xuICB9XG4gIGlmIChwZW5kaW5nKSB7XG4gICAgY29udGV4dC5hZGRDYXNlKHRodW5rLnBlbmRpbmcsIHBlbmRpbmcpO1xuICB9XG4gIGlmIChyZWplY3RlZCkge1xuICAgIGNvbnRleHQuYWRkQ2FzZSh0aHVuay5yZWplY3RlZCwgcmVqZWN0ZWQpO1xuICB9XG4gIGlmIChzZXR0bGVkKSB7XG4gICAgY29udGV4dC5hZGRNYXRjaGVyKHRodW5rLnNldHRsZWQsIHNldHRsZWQpO1xuICB9XG4gIGNvbnRleHQuZXhwb3NlQ2FzZVJlZHVjZXIocmVkdWNlck5hbWUsIHtcbiAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCB8fCBub29wLFxuICAgIHBlbmRpbmc6IHBlbmRpbmcgfHwgbm9vcCxcbiAgICByZWplY3RlZDogcmVqZWN0ZWQgfHwgbm9vcCxcbiAgICBzZXR0bGVkOiBzZXR0bGVkIHx8IG5vb3BcbiAgfSk7XG59XG5mdW5jdGlvbiBub29wKCkge1xufVxuXG4vLyBzcmMvZW50aXRpZXMvZW50aXR5X3N0YXRlLnRzXG5mdW5jdGlvbiBnZXRJbml0aWFsRW50aXR5U3RhdGUoKSB7XG4gIHJldHVybiB7XG4gICAgaWRzOiBbXSxcbiAgICBlbnRpdGllczoge31cbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxTdGF0ZUZhY3Rvcnkoc3RhdGVBZGFwdGVyKSB7XG4gIGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZShhZGRpdGlvbmFsU3RhdGUgPSB7fSwgZW50aXRpZXMpIHtcbiAgICBjb25zdCBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oZ2V0SW5pdGlhbEVudGl0eVN0YXRlKCksIGFkZGl0aW9uYWxTdGF0ZSk7XG4gICAgcmV0dXJuIGVudGl0aWVzID8gc3RhdGVBZGFwdGVyLnNldEFsbChzdGF0ZSwgZW50aXRpZXMpIDogc3RhdGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXRJbml0aWFsU3RhdGVcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3N0YXRlX3NlbGVjdG9ycy50c1xuZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JzRmFjdG9yeSgpIHtcbiAgZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKHNlbGVjdFN0YXRlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBjcmVhdGVTZWxlY3RvcjogY3JlYXRlU2VsZWN0b3IyID0gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBzZWxlY3RJZHMgPSAoc3RhdGUpID0+IHN0YXRlLmlkcztcbiAgICBjb25zdCBzZWxlY3RFbnRpdGllcyA9IChzdGF0ZSkgPT4gc3RhdGUuZW50aXRpZXM7XG4gICAgY29uc3Qgc2VsZWN0QWxsID0gY3JlYXRlU2VsZWN0b3IyKHNlbGVjdElkcywgc2VsZWN0RW50aXRpZXMsIChpZHMsIGVudGl0aWVzKSA9PiBpZHMubWFwKChpZCkgPT4gZW50aXRpZXNbaWRdKSk7XG4gICAgY29uc3Qgc2VsZWN0SWQgPSAoXywgaWQpID0+IGlkO1xuICAgIGNvbnN0IHNlbGVjdEJ5SWQgPSAoZW50aXRpZXMsIGlkKSA9PiBlbnRpdGllc1tpZF07XG4gICAgY29uc3Qgc2VsZWN0VG90YWwgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0SWRzLCAoaWRzKSA9PiBpZHMubGVuZ3RoKTtcbiAgICBpZiAoIXNlbGVjdFN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWxlY3RJZHMsXG4gICAgICAgIHNlbGVjdEVudGl0aWVzLFxuICAgICAgICBzZWxlY3RBbGwsXG4gICAgICAgIHNlbGVjdFRvdGFsLFxuICAgICAgICBzZWxlY3RCeUlkOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0RW50aXRpZXMsIHNlbGVjdElkLCBzZWxlY3RCeUlkKVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzID0gY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RFbnRpdGllcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdElkczogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RJZHMpLFxuICAgICAgc2VsZWN0RW50aXRpZXM6IHNlbGVjdEdsb2JhbGl6ZWRFbnRpdGllcyxcbiAgICAgIHNlbGVjdEFsbDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RBbGwpLFxuICAgICAgc2VsZWN0VG90YWw6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTdGF0ZSwgc2VsZWN0VG90YWwpLFxuICAgICAgc2VsZWN0QnlJZDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdEdsb2JhbGl6ZWRFbnRpdGllcywgc2VsZWN0SWQsIHNlbGVjdEJ5SWQpXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldFNlbGVjdG9yc1xuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvc3RhdGVfYWRhcHRlci50c1xudmFyIGlzRHJhZnRUeXBlZCA9IGlzRHJhZnQ7XG5mdW5jdGlvbiBjcmVhdGVTaW5nbGVBcmd1bWVudFN0YXRlT3BlcmF0b3IobXV0YXRvcikge1xuICBjb25zdCBvcGVyYXRvciA9IGNyZWF0ZVN0YXRlT3BlcmF0b3IoKF8sIHN0YXRlKSA9PiBtdXRhdG9yKHN0YXRlKSk7XG4gIHJldHVybiBmdW5jdGlvbiBvcGVyYXRpb24oc3RhdGUpIHtcbiAgICByZXR1cm4gb3BlcmF0b3Ioc3RhdGUsIHZvaWQgMCk7XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVTdGF0ZU9wZXJhdG9yKG11dGF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9wZXJhdGlvbihzdGF0ZSwgYXJnKSB7XG4gICAgZnVuY3Rpb24gaXNQYXlsb2FkQWN0aW9uQXJndW1lbnQoYXJnMikge1xuICAgICAgcmV0dXJuIGlzRlNBKGFyZzIpO1xuICAgIH1cbiAgICBjb25zdCBydW5NdXRhdG9yID0gKGRyYWZ0KSA9PiB7XG4gICAgICBpZiAoaXNQYXlsb2FkQWN0aW9uQXJndW1lbnQoYXJnKSkge1xuICAgICAgICBtdXRhdG9yKGFyZy5wYXlsb2FkLCBkcmFmdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhdG9yKGFyZywgZHJhZnQpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGlzRHJhZnRUeXBlZChzdGF0ZSkpIHtcbiAgICAgIHJ1bk11dGF0b3Ioc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgICByZXR1cm4gcHJvZHVjZShzdGF0ZSwgcnVuTXV0YXRvcik7XG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy91dGlscy50c1xuZnVuY3Rpb24gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKSB7XG4gIGNvbnN0IGtleSA9IHNlbGVjdElkKGVudGl0eSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYga2V5ID09PSB2b2lkIDApIHtcbiAgICBjb25zb2xlLndhcm4oXCJUaGUgZW50aXR5IHBhc3NlZCB0byB0aGUgYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCB1bmRlZmluZWQuXCIsIFwiWW91IHNob3VsZCBwcm9iYWJseSBwcm92aWRlIHlvdXIgb3duIGBzZWxlY3RJZGAgaW1wbGVtZW50YXRpb24uXCIsIFwiVGhlIGVudGl0eSB0aGF0IHdhcyBwYXNzZWQ6XCIsIGVudGl0eSwgXCJUaGUgYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbjpcIiwgc2VsZWN0SWQudG9TdHJpbmcoKSk7XG4gIH1cbiAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUVudGl0aWVzQXJyYXkoZW50aXRpZXMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGVudGl0aWVzKSkge1xuICAgIGVudGl0aWVzID0gT2JqZWN0LnZhbHVlcyhlbnRpdGllcyk7XG4gIH1cbiAgcmV0dXJuIGVudGl0aWVzO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudCh2YWx1ZSkge1xuICByZXR1cm4gaXNEcmFmdCh2YWx1ZSkgPyBjdXJyZW50KHZhbHVlKSA6IHZhbHVlO1xufVxuZnVuY3Rpb24gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKSB7XG4gIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gIGNvbnN0IGV4aXN0aW5nSWRzQXJyYXkgPSBnZXRDdXJyZW50KHN0YXRlLmlkcyk7XG4gIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChleGlzdGluZ0lkc0FycmF5KTtcbiAgY29uc3QgYWRkZWQgPSBbXTtcbiAgY29uc3QgYWRkZWRJZHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXSk7XG4gIGNvbnN0IHVwZGF0ZWQgPSBbXTtcbiAgZm9yIChjb25zdCBlbnRpdHkgb2YgbmV3RW50aXRpZXMpIHtcbiAgICBjb25zdCBpZCA9IHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCk7XG4gICAgaWYgKGV4aXN0aW5nSWRzLmhhcyhpZCkgfHwgYWRkZWRJZHMuaGFzKGlkKSkge1xuICAgICAgdXBkYXRlZC5wdXNoKHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNoYW5nZXM6IGVudGl0eVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZGVkSWRzLmFkZChpZCk7XG4gICAgICBhZGRlZC5wdXNoKGVudGl0eSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbYWRkZWQsIHVwZGF0ZWQsIGV4aXN0aW5nSWRzQXJyYXldO1xufVxuXG4vLyBzcmMvZW50aXRpZXMvdW5zb3J0ZWRfc3RhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpIHtcbiAgZnVuY3Rpb24gYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgY29uc3Qga2V5ID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcbiAgICBpZiAoa2V5IGluIHN0YXRlLmVudGl0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlLmlkcy5wdXNoKGtleSk7XG4gICAgc3RhdGUuZW50aXRpZXNba2V5XSA9IGVudGl0eTtcbiAgfVxuICBmdW5jdGlvbiBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIG5ld0VudGl0aWVzKSB7XG4gICAgICBhZGRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICBjb25zdCBrZXkgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xuICAgIGlmICghKGtleSBpbiBzdGF0ZS5lbnRpdGllcykpIHtcbiAgICAgIHN0YXRlLmlkcy5wdXNoKGtleSk7XG4gICAgfVxuICAgIDtcbiAgICBzdGF0ZS5lbnRpdGllc1trZXldID0gZW50aXR5O1xuICB9XG4gIGZ1bmN0aW9uIHNldE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgbmV3RW50aXRpZXMpIHtcbiAgICAgIHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldEFsbE11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBzdGF0ZS5pZHMgPSBbXTtcbiAgICBzdGF0ZS5lbnRpdGllcyA9IHt9O1xuICAgIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlT25lTXV0YWJseShrZXksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHJlbW92ZU1hbnlNdXRhYmx5KFtrZXldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlTWFueU11dGFibHkoa2V5cywgc3RhdGUpIHtcbiAgICBsZXQgZGlkTXV0YXRlID0gZmFsc2U7XG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgaW4gc3RhdGUuZW50aXRpZXMpIHtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW2tleV07XG4gICAgICAgIGRpZE11dGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGRpZE11dGF0ZSkge1xuICAgICAgc3RhdGUuaWRzID0gc3RhdGUuaWRzLmZpbHRlcigoaWQpID0+IGlkIGluIHN0YXRlLmVudGl0aWVzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlQWxsTXV0YWJseShzdGF0ZSkge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHtcbiAgICAgIGlkczogW10sXG4gICAgICBlbnRpdGllczoge31cbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiB0YWtlTmV3S2V5KGtleXMsIHVwZGF0ZSwgc3RhdGUpIHtcbiAgICBjb25zdCBvcmlnaW5hbDMgPSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgIGlmIChvcmlnaW5hbDMgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkID0gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWwzLCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgY29uc3QgbmV3S2V5ID0gc2VsZWN0SWRWYWx1ZSh1cGRhdGVkLCBzZWxlY3RJZCk7XG4gICAgY29uc3QgaGFzTmV3S2V5ID0gbmV3S2V5ICE9PSB1cGRhdGUuaWQ7XG4gICAgaWYgKGhhc05ld0tleSkge1xuICAgICAga2V5c1t1cGRhdGUuaWRdID0gbmV3S2V5O1xuICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgfVxuICAgIDtcbiAgICBzdGF0ZS5lbnRpdGllc1tuZXdLZXldID0gdXBkYXRlZDtcbiAgICByZXR1cm4gaGFzTmV3S2V5O1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZU9uZU11dGFibHkodXBkYXRlLCBzdGF0ZSkge1xuICAgIHJldHVybiB1cGRhdGVNYW55TXV0YWJseShbdXBkYXRlXSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgbmV3S2V5cyA9IHt9O1xuICAgIGNvbnN0IHVwZGF0ZXNQZXJFbnRpdHkgPSB7fTtcbiAgICB1cGRhdGVzLmZvckVhY2goKHVwZGF0ZSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZS5pZCBpbiBzdGF0ZS5lbnRpdGllcykge1xuICAgICAgICB1cGRhdGVzUGVyRW50aXR5W3VwZGF0ZS5pZF0gPSB7XG4gICAgICAgICAgaWQ6IHVwZGF0ZS5pZCxcbiAgICAgICAgICAvLyBTcHJlYWRzIGlnbm9yZSBmYWxzeSB2YWx1ZXMsIHNvIHRoaXMgd29ya3MgZXZlbiBpZiB0aGVyZSBpc24ndFxuICAgICAgICAgIC8vIGFuIGV4aXN0aW5nIHVwZGF0ZSBhbHJlYWR5IGF0IHRoaXMga2V5XG4gICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgLi4udXBkYXRlc1BlckVudGl0eVt1cGRhdGUuaWRdPy5jaGFuZ2VzLFxuICAgICAgICAgICAgLi4udXBkYXRlLmNoYW5nZXNcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgdXBkYXRlcyA9IE9iamVjdC52YWx1ZXModXBkYXRlc1BlckVudGl0eSk7XG4gICAgY29uc3QgZGlkTXV0YXRlRW50aXRpZXMgPSB1cGRhdGVzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGRpZE11dGF0ZUVudGl0aWVzKSB7XG4gICAgICBjb25zdCBkaWRNdXRhdGVJZHMgPSB1cGRhdGVzLmZpbHRlcigodXBkYXRlKSA9PiB0YWtlTmV3S2V5KG5ld0tleXMsIHVwZGF0ZSwgc3RhdGUpKS5sZW5ndGggPiAwO1xuICAgICAgaWYgKGRpZE11dGF0ZUlkcykge1xuICAgICAgICBzdGF0ZS5pZHMgPSBPYmplY3QudmFsdWVzKHN0YXRlLmVudGl0aWVzKS5tYXAoKGUpID0+IHNlbGVjdElkVmFsdWUoZSwgc2VsZWN0SWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwc2VydE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgW2FkZGVkLCB1cGRhdGVkXSA9IHNwbGl0QWRkZWRVcGRhdGVkRW50aXRpZXMobmV3RW50aXRpZXMsIHNlbGVjdElkLCBzdGF0ZSk7XG4gICAgYWRkTWFueU11dGFibHkoYWRkZWQsIHN0YXRlKTtcbiAgICB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVkLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW1vdmVBbGw6IGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihyZW1vdmVBbGxNdXRhYmx5KSxcbiAgICBhZGRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkT25lTXV0YWJseSksXG4gICAgYWRkTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRNYW55TXV0YWJseSksXG4gICAgc2V0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxuICAgIHNldE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0TWFueU11dGFibHkpLFxuICAgIHNldEFsbDogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRBbGxNdXRhYmx5KSxcbiAgICB1cGRhdGVPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlT25lTXV0YWJseSksXG4gICAgdXBkYXRlTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVNYW55TXV0YWJseSksXG4gICAgdXBzZXJ0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE9uZU11dGFibHkpLFxuICAgIHVwc2VydE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0TWFueU11dGFibHkpLFxuICAgIHJlbW92ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihyZW1vdmVPbmVNdXRhYmx5KSxcbiAgICByZW1vdmVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHJlbW92ZU1hbnlNdXRhYmx5KVxuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvc29ydGVkX3N0YXRlX2FkYXB0ZXIudHNcbmZ1bmN0aW9uIGZpbmRJbnNlcnRJbmRleChzb3J0ZWRJdGVtcywgaXRlbSwgY29tcGFyaXNvbkZ1bmN0aW9uKSB7XG4gIGxldCBsb3dJbmRleCA9IDA7XG4gIGxldCBoaWdoSW5kZXggPSBzb3J0ZWRJdGVtcy5sZW5ndGg7XG4gIHdoaWxlIChsb3dJbmRleCA8IGhpZ2hJbmRleCkge1xuICAgIGxldCBtaWRkbGVJbmRleCA9IGxvd0luZGV4ICsgaGlnaEluZGV4ID4+PiAxO1xuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gc29ydGVkSXRlbXNbbWlkZGxlSW5kZXhdO1xuICAgIGNvbnN0IHJlcyA9IGNvbXBhcmlzb25GdW5jdGlvbihpdGVtLCBjdXJyZW50SXRlbSk7XG4gICAgaWYgKHJlcyA+PSAwKSB7XG4gICAgICBsb3dJbmRleCA9IG1pZGRsZUluZGV4ICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGlnaEluZGV4ID0gbWlkZGxlSW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiBsb3dJbmRleDtcbn1cbmZ1bmN0aW9uIGluc2VydChzb3J0ZWRJdGVtcywgaXRlbSwgY29tcGFyaXNvbkZ1bmN0aW9uKSB7XG4gIGNvbnN0IGluc2VydEF0SW5kZXggPSBmaW5kSW5zZXJ0SW5kZXgoc29ydGVkSXRlbXMsIGl0ZW0sIGNvbXBhcmlzb25GdW5jdGlvbik7XG4gIHNvcnRlZEl0ZW1zLnNwbGljZShpbnNlcnRBdEluZGV4LCAwLCBpdGVtKTtcbiAgcmV0dXJuIHNvcnRlZEl0ZW1zO1xufVxuZnVuY3Rpb24gY3JlYXRlU29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkLCBjb21wYXJlcikge1xuICBjb25zdCB7XG4gICAgcmVtb3ZlT25lLFxuICAgIHJlbW92ZU1hbnksXG4gICAgcmVtb3ZlQWxsXG4gIH0gPSBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCk7XG4gIGZ1bmN0aW9uIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiBhZGRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSwgZXhpc3RpbmdJZHMpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQoZXhpc3RpbmdJZHMgPz8gZ2V0Q3VycmVudChzdGF0ZS5pZHMpKTtcbiAgICBjb25zdCBhZGRlZEtleXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGNvbnN0IG1vZGVscyA9IG5ld0VudGl0aWVzLmZpbHRlcigobW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsSWQgPSBzZWxlY3RJZFZhbHVlKG1vZGVsLCBzZWxlY3RJZCk7XG4gICAgICBjb25zdCBub3RBZGRlZCA9ICFhZGRlZEtleXMuaGFzKG1vZGVsSWQpO1xuICAgICAgaWYgKG5vdEFkZGVkKSBhZGRlZEtleXMuYWRkKG1vZGVsSWQpO1xuICAgICAgcmV0dXJuICFleGlzdGluZ0tleXMuaGFzKG1vZGVsSWQpICYmIG5vdEFkZGVkO1xuICAgIH0pO1xuICAgIGlmIChtb2RlbHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBtZXJnZUZ1bmN0aW9uKHN0YXRlLCBtb2RlbHMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gc2V0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiBzZXRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBsZXQgZGVkdXBsaWNhdGVkRW50aXRpZXMgPSB7fTtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGlmIChuZXdFbnRpdGllcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdFbnRpdGllcykge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IHNlbGVjdElkKGl0ZW0pO1xuICAgICAgICBkZWR1cGxpY2F0ZWRFbnRpdGllc1tlbnRpdHlJZF0gPSBpdGVtO1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbZW50aXR5SWRdO1xuICAgICAgfVxuICAgICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KGRlZHVwbGljYXRlZEVudGl0aWVzKTtcbiAgICAgIG1lcmdlRnVuY3Rpb24oc3RhdGUsIG5ld0VudGl0aWVzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0QWxsTXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIHN0YXRlLmVudGl0aWVzID0ge307XG4gICAgc3RhdGUuaWRzID0gW107XG4gICAgYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlLCBbXSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlT25lTXV0YWJseSh1cGRhdGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU1hbnlNdXRhYmx5KFt1cGRhdGVdLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlTWFueU11dGFibHkodXBkYXRlcywgc3RhdGUpIHtcbiAgICBsZXQgYXBwbGllZFVwZGF0ZXMgPSBmYWxzZTtcbiAgICBsZXQgcmVwbGFjZWRJZHMgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB1cGRhdGUgb2YgdXBkYXRlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICAgIGlmICghZW50aXR5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXBwbGllZFVwZGF0ZXMgPSB0cnVlO1xuICAgICAgT2JqZWN0LmFzc2lnbihlbnRpdHksIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgIGNvbnN0IG5ld0lkID0gc2VsZWN0SWQoZW50aXR5KTtcbiAgICAgIGlmICh1cGRhdGUuaWQgIT09IG5ld0lkKSB7XG4gICAgICAgIHJlcGxhY2VkSWRzID0gdHJ1ZTtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gc3RhdGUuaWRzLmluZGV4T2YodXBkYXRlLmlkKTtcbiAgICAgICAgc3RhdGUuaWRzW29sZEluZGV4XSA9IG5ld0lkO1xuICAgICAgICBzdGF0ZS5lbnRpdGllc1tuZXdJZF0gPSBlbnRpdHk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcHBsaWVkVXBkYXRlcykge1xuICAgICAgbWVyZ2VGdW5jdGlvbihzdGF0ZSwgW10sIGFwcGxpZWRVcGRhdGVzLCByZXBsYWNlZElkcyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHVwc2VydE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiB1cHNlcnRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHVwc2VydE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIGNvbnN0IFthZGRlZCwgdXBkYXRlZCwgZXhpc3RpbmdJZHNBcnJheV0gPSBzcGxpdEFkZGVkVXBkYXRlZEVudGl0aWVzKG5ld0VudGl0aWVzLCBzZWxlY3RJZCwgc3RhdGUpO1xuICAgIGlmIChhZGRlZC5sZW5ndGgpIHtcbiAgICAgIGFkZE1hbnlNdXRhYmx5KGFkZGVkLCBzdGF0ZSwgZXhpc3RpbmdJZHNBcnJheSk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVkLmxlbmd0aCkge1xuICAgICAgdXBkYXRlTWFueU11dGFibHkodXBkYXRlZCwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhcmVBcnJheXNFcXVhbChhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldID09PSBiW2ldKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBtZXJnZUZ1bmN0aW9uID0gKHN0YXRlLCBhZGRlZEl0ZW1zLCBhcHBsaWVkVXBkYXRlcywgcmVwbGFjZWRJZHMpID0+IHtcbiAgICBjb25zdCBjdXJyZW50RW50aXRpZXMgPSBnZXRDdXJyZW50KHN0YXRlLmVudGl0aWVzKTtcbiAgICBjb25zdCBjdXJyZW50SWRzID0gZ2V0Q3VycmVudChzdGF0ZS5pZHMpO1xuICAgIGNvbnN0IHN0YXRlRW50aXRpZXMgPSBzdGF0ZS5lbnRpdGllcztcbiAgICBsZXQgaWRzID0gY3VycmVudElkcztcbiAgICBpZiAocmVwbGFjZWRJZHMpIHtcbiAgICAgIGlkcyA9IG5ldyBTZXQoY3VycmVudElkcyk7XG4gICAgfVxuICAgIGxldCBzb3J0ZWRFbnRpdGllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBjdXJyZW50RW50aXRpZXNbaWRdO1xuICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICBzb3J0ZWRFbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHdhc1ByZXZpb3VzbHlFbXB0eSA9IHNvcnRlZEVudGl0aWVzLmxlbmd0aCA9PT0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYWRkZWRJdGVtcykge1xuICAgICAgc3RhdGVFbnRpdGllc1tzZWxlY3RJZChpdGVtKV0gPSBpdGVtO1xuICAgICAgaWYgKCF3YXNQcmV2aW91c2x5RW1wdHkpIHtcbiAgICAgICAgaW5zZXJ0KHNvcnRlZEVudGl0aWVzLCBpdGVtLCBjb21wYXJlcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3YXNQcmV2aW91c2x5RW1wdHkpIHtcbiAgICAgIHNvcnRlZEVudGl0aWVzID0gYWRkZWRJdGVtcy5zbGljZSgpLnNvcnQoY29tcGFyZXIpO1xuICAgIH0gZWxzZSBpZiAoYXBwbGllZFVwZGF0ZXMpIHtcbiAgICAgIHNvcnRlZEVudGl0aWVzLnNvcnQoY29tcGFyZXIpO1xuICAgIH1cbiAgICBjb25zdCBuZXdTb3J0ZWRJZHMgPSBzb3J0ZWRFbnRpdGllcy5tYXAoc2VsZWN0SWQpO1xuICAgIGlmICghYXJlQXJyYXlzRXF1YWwoY3VycmVudElkcywgbmV3U29ydGVkSWRzKSkge1xuICAgICAgc3RhdGUuaWRzID0gbmV3U29ydGVkSWRzO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICByZW1vdmVPbmUsXG4gICAgcmVtb3ZlTWFueSxcbiAgICByZW1vdmVBbGwsXG4gICAgYWRkT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE9uZU11dGFibHkpLFxuICAgIHVwZGF0ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVPbmVNdXRhYmx5KSxcbiAgICB1cHNlcnRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0T25lTXV0YWJseSksXG4gICAgc2V0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxuICAgIHNldE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0TWFueU11dGFibHkpLFxuICAgIHNldEFsbDogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRBbGxNdXRhYmx5KSxcbiAgICBhZGRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE1hbnlNdXRhYmx5KSxcbiAgICB1cGRhdGVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU1hbnlNdXRhYmx5KSxcbiAgICB1cHNlcnRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE1hbnlNdXRhYmx5KVxuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvY3JlYXRlX2FkYXB0ZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZUVudGl0eUFkYXB0ZXIob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBzZWxlY3RJZCxcbiAgICBzb3J0Q29tcGFyZXJcbiAgfSA9IHtcbiAgICBzb3J0Q29tcGFyZXI6IGZhbHNlLFxuICAgIHNlbGVjdElkOiAoaW5zdGFuY2UpID0+IGluc3RhbmNlLmlkLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgY29uc3Qgc3RhdGVBZGFwdGVyID0gc29ydENvbXBhcmVyID8gY3JlYXRlU29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkLCBzb3J0Q29tcGFyZXIpIDogY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpO1xuICBjb25zdCBzdGF0ZUZhY3RvcnkgPSBjcmVhdGVJbml0aWFsU3RhdGVGYWN0b3J5KHN0YXRlQWRhcHRlcik7XG4gIGNvbnN0IHNlbGVjdG9yc0ZhY3RvcnkgPSBjcmVhdGVTZWxlY3RvcnNGYWN0b3J5KCk7XG4gIHJldHVybiB7XG4gICAgc2VsZWN0SWQsXG4gICAgc29ydENvbXBhcmVyLFxuICAgIC4uLnN0YXRlRmFjdG9yeSxcbiAgICAuLi5zZWxlY3RvcnNGYWN0b3J5LFxuICAgIC4uLnN0YXRlQWRhcHRlclxuICB9O1xufVxuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL2V4Y2VwdGlvbnMudHNcbnZhciB0YXNrID0gXCJ0YXNrXCI7XG52YXIgbGlzdGVuZXIgPSBcImxpc3RlbmVyXCI7XG52YXIgY29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcbnZhciBjYW5jZWxsZWQgPSBcImNhbmNlbGxlZFwiO1xudmFyIHRhc2tDYW5jZWxsZWQgPSBgdGFzay0ke2NhbmNlbGxlZH1gO1xudmFyIHRhc2tDb21wbGV0ZWQgPSBgdGFzay0ke2NvbXBsZXRlZH1gO1xudmFyIGxpc3RlbmVyQ2FuY2VsbGVkID0gYCR7bGlzdGVuZXJ9LSR7Y2FuY2VsbGVkfWA7XG52YXIgbGlzdGVuZXJDb21wbGV0ZWQgPSBgJHtsaXN0ZW5lcn0tJHtjb21wbGV0ZWR9YDtcbnZhciBUYXNrQWJvcnRFcnJvciA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY29kZSkge1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5tZXNzYWdlID0gYCR7dGFza30gJHtjYW5jZWxsZWR9IChyZWFzb246ICR7Y29kZX0pYDtcbiAgfVxuICBuYW1lID0gXCJUYXNrQWJvcnRFcnJvclwiO1xuICBtZXNzYWdlO1xufTtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS91dGlscy50c1xudmFyIGFzc2VydEZ1bmN0aW9uID0gKGZ1bmMsIGV4cGVjdGVkKSA9PiB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMyKSA6IGAke2V4cGVjdGVkfSBpcyBub3QgYSBmdW5jdGlvbmApO1xuICB9XG59O1xudmFyIG5vb3AyID0gKCkgPT4ge1xufTtcbnZhciBjYXRjaFJlamVjdGlvbiA9IChwcm9taXNlLCBvbkVycm9yID0gbm9vcDIpID0+IHtcbiAgcHJvbWlzZS5jYXRjaChvbkVycm9yKTtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xudmFyIGFkZEFib3J0U2lnbmFsTGlzdGVuZXIgPSAoYWJvcnRTaWduYWwsIGNhbGxiYWNrKSA9PiB7XG4gIGFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBjYWxsYmFjaywge1xuICAgIG9uY2U6IHRydWVcbiAgfSk7XG4gIHJldHVybiAoKSA9PiBhYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgY2FsbGJhY2spO1xufTtcbnZhciBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uID0gKGFib3J0Q29udHJvbGxlciwgcmVhc29uKSA9PiB7XG4gIGNvbnN0IHNpZ25hbCA9IGFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIShcInJlYXNvblwiIGluIHNpZ25hbCkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2lnbmFsLCBcInJlYXNvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHJlYXNvbixcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgO1xuICBhYm9ydENvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvdGFzay50c1xudmFyIHZhbGlkYXRlQWN0aXZlID0gKHNpZ25hbCkgPT4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICBjb25zdCB7XG4gICAgICByZWFzb25cbiAgICB9ID0gc2lnbmFsO1xuICAgIHRocm93IG5ldyBUYXNrQWJvcnRFcnJvcihyZWFzb24pO1xuICB9XG59O1xuZnVuY3Rpb24gcmFjZVdpdGhTaWduYWwoc2lnbmFsLCBwcm9taXNlKSB7XG4gIGxldCBjbGVhbnVwID0gbm9vcDI7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgbm90aWZ5UmVqZWN0aW9uID0gKCkgPT4gcmVqZWN0KG5ldyBUYXNrQWJvcnRFcnJvcihzaWduYWwucmVhc29uKSk7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBub3RpZnlSZWplY3Rpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2xlYW51cCA9IGFkZEFib3J0U2lnbmFsTGlzdGVuZXIoc2lnbmFsLCBub3RpZnlSZWplY3Rpb24pO1xuICAgIHByb21pc2UuZmluYWxseSgoKSA9PiBjbGVhbnVwKCkpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgY2xlYW51cCA9IG5vb3AyO1xuICB9KTtcbn1cbnZhciBydW5UYXNrID0gYXN5bmMgKHRhc2syLCBjbGVhblVwKSA9PiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0YXNrMigpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBlcnJvciBpbnN0YW5jZW9mIFRhc2tBYm9ydEVycm9yID8gXCJjYW5jZWxsZWRcIiA6IFwicmVqZWN0ZWRcIixcbiAgICAgIGVycm9yXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhblVwPy4oKTtcbiAgfVxufTtcbnZhciBjcmVhdGVQYXVzZSA9IChzaWduYWwpID0+IHtcbiAgcmV0dXJuIChwcm9taXNlKSA9PiB7XG4gICAgcmV0dXJuIGNhdGNoUmVqZWN0aW9uKHJhY2VXaXRoU2lnbmFsKHNpZ25hbCwgcHJvbWlzZSkudGhlbigob3V0cHV0KSA9PiB7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KSk7XG4gIH07XG59O1xudmFyIGNyZWF0ZURlbGF5ID0gKHNpZ25hbCkgPT4ge1xuICBjb25zdCBwYXVzZSA9IGNyZWF0ZVBhdXNlKHNpZ25hbCk7XG4gIHJldHVybiAodGltZW91dE1zKSA9PiB7XG4gICAgcmV0dXJuIHBhdXNlKG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcykpKTtcbiAgfTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvaW5kZXgudHNcbnZhciB7XG4gIGFzc2lnblxufSA9IE9iamVjdDtcbnZhciBJTlRFUk5BTF9OSUxfVE9LRU4gPSB7fTtcbnZhciBhbG0gPSBcImxpc3RlbmVyTWlkZGxld2FyZVwiO1xudmFyIGNyZWF0ZUZvcmsgPSAocGFyZW50QWJvcnRTaWduYWwsIHBhcmVudEJsb2NraW5nUHJvbWlzZXMpID0+IHtcbiAgY29uc3QgbGlua0NvbnRyb2xsZXJzID0gKGNvbnRyb2xsZXIpID0+IGFkZEFib3J0U2lnbmFsTGlzdGVuZXIocGFyZW50QWJvcnRTaWduYWwsICgpID0+IGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgcGFyZW50QWJvcnRTaWduYWwucmVhc29uKSk7XG4gIHJldHVybiAodGFza0V4ZWN1dG9yLCBvcHRzKSA9PiB7XG4gICAgYXNzZXJ0RnVuY3Rpb24odGFza0V4ZWN1dG9yLCBcInRhc2tFeGVjdXRvclwiKTtcbiAgICBjb25zdCBjaGlsZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBsaW5rQ29udHJvbGxlcnMoY2hpbGRBYm9ydENvbnRyb2xsZXIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJ1blRhc2soYXN5bmMgKCkgPT4ge1xuICAgICAgdmFsaWRhdGVBY3RpdmUocGFyZW50QWJvcnRTaWduYWwpO1xuICAgICAgdmFsaWRhdGVBY3RpdmUoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGNvbnN0IHJlc3VsdDIgPSBhd2FpdCB0YXNrRXhlY3V0b3Ioe1xuICAgICAgICBwYXVzZTogY3JlYXRlUGF1c2UoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgZGVsYXk6IGNyZWF0ZURlbGF5KGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgIHNpZ25hbDogY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICByZXR1cm4gcmVzdWx0MjtcbiAgICB9LCAoKSA9PiBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNoaWxkQWJvcnRDb250cm9sbGVyLCB0YXNrQ29tcGxldGVkKSk7XG4gICAgaWYgKG9wdHM/LmF1dG9Kb2luKSB7XG4gICAgICBwYXJlbnRCbG9ja2luZ1Byb21pc2VzLnB1c2gocmVzdWx0LmNhdGNoKG5vb3AyKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZXN1bHQ6IGNyZWF0ZVBhdXNlKHBhcmVudEFib3J0U2lnbmFsKShyZXN1bHQpLFxuICAgICAgY2FuY2VsKCkge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNoaWxkQWJvcnRDb250cm9sbGVyLCB0YXNrQ2FuY2VsbGVkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xufTtcbnZhciBjcmVhdGVUYWtlUGF0dGVybiA9IChzdGFydExpc3RlbmluZywgc2lnbmFsKSA9PiB7XG4gIGNvbnN0IHRha2UgPSBhc3luYyAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiB7XG4gICAgdmFsaWRhdGVBY3RpdmUoc2lnbmFsKTtcbiAgICBsZXQgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgfTtcbiAgICBjb25zdCB0dXBsZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc3RvcExpc3RlbmluZyA9IHN0YXJ0TGlzdGVuaW5nKHtcbiAgICAgICAgcHJlZGljYXRlLFxuICAgICAgICBlZmZlY3Q6IChhY3Rpb24sIGxpc3RlbmVyQXBpKSA9PiB7XG4gICAgICAgICAgbGlzdGVuZXJBcGkudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICByZXNvbHZlKFthY3Rpb24sIGxpc3RlbmVyQXBpLmdldFN0YXRlKCksIGxpc3RlbmVyQXBpLmdldE9yaWdpbmFsU3RhdGUoKV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBzdG9wTGlzdGVuaW5nKCk7XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFt0dXBsZVByb21pc2VdO1xuICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dCwgbnVsbCkpKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJhY2VXaXRoU2lnbmFsKHNpZ25hbCwgUHJvbWlzZS5yYWNlKHByb21pc2VzKSk7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiBjYXRjaFJlamVjdGlvbih0YWtlKHByZWRpY2F0ZSwgdGltZW91dCkpO1xufTtcbnZhciBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tID0gKG9wdGlvbnMpID0+IHtcbiAgbGV0IHtcbiAgICB0eXBlLFxuICAgIGFjdGlvbkNyZWF0b3IsXG4gICAgbWF0Y2hlcixcbiAgICBwcmVkaWNhdGUsXG4gICAgZWZmZWN0XG4gIH0gPSBvcHRpb25zO1xuICBpZiAodHlwZSkge1xuICAgIHByZWRpY2F0ZSA9IGNyZWF0ZUFjdGlvbih0eXBlKS5tYXRjaDtcbiAgfSBlbHNlIGlmIChhY3Rpb25DcmVhdG9yKSB7XG4gICAgdHlwZSA9IGFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICBwcmVkaWNhdGUgPSBhY3Rpb25DcmVhdG9yLm1hdGNoO1xuICB9IGVsc2UgaWYgKG1hdGNoZXIpIHtcbiAgICBwcmVkaWNhdGUgPSBtYXRjaGVyO1xuICB9IGVsc2UgaWYgKHByZWRpY2F0ZSkge1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIxKSA6IFwiQ3JlYXRpbmcgb3IgcmVtb3ZpbmcgYSBsaXN0ZW5lciByZXF1aXJlcyBvbmUgb2YgdGhlIGtub3duIGZpZWxkcyBmb3IgbWF0Y2hpbmcgYW4gYWN0aW9uXCIpO1xuICB9XG4gIGFzc2VydEZ1bmN0aW9uKGVmZmVjdCwgXCJvcHRpb25zLmxpc3RlbmVyXCIpO1xuICByZXR1cm4ge1xuICAgIHByZWRpY2F0ZSxcbiAgICB0eXBlLFxuICAgIGVmZmVjdFxuICB9O1xufTtcbnZhciBjcmVhdGVMaXN0ZW5lckVudHJ5ID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigob3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICBwcmVkaWNhdGUsXG4gICAgZWZmZWN0XG4gIH0gPSBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tKG9wdGlvbnMpO1xuICBjb25zdCBlbnRyeSA9IHtcbiAgICBpZDogbmFub2lkKCksXG4gICAgZWZmZWN0LFxuICAgIHR5cGUsXG4gICAgcHJlZGljYXRlLFxuICAgIHBlbmRpbmc6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gICAgdW5zdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIyKSA6IFwiVW5zdWJzY3JpYmUgbm90IGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGVudHJ5O1xufSwge1xuICB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZUxpc3RlbmVyRW50cnlcbn0pO1xudmFyIGZpbmRMaXN0ZW5lckVudHJ5ID0gKGxpc3RlbmVyTWFwLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIGVmZmVjdCxcbiAgICBwcmVkaWNhdGVcbiAgfSA9IGdldExpc3RlbmVyRW50cnlQcm9wc0Zyb20ob3B0aW9ucyk7XG4gIHJldHVybiBBcnJheS5mcm9tKGxpc3RlbmVyTWFwLnZhbHVlcygpKS5maW5kKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoUHJlZGljYXRlT3JUeXBlID0gdHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIgPyBlbnRyeS50eXBlID09PSB0eXBlIDogZW50cnkucHJlZGljYXRlID09PSBwcmVkaWNhdGU7XG4gICAgcmV0dXJuIG1hdGNoUHJlZGljYXRlT3JUeXBlICYmIGVudHJ5LmVmZmVjdCA9PT0gZWZmZWN0O1xuICB9KTtcbn07XG52YXIgY2FuY2VsQWN0aXZlTGlzdGVuZXJzID0gKGVudHJ5KSA9PiB7XG4gIGVudHJ5LnBlbmRpbmcuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgbGlzdGVuZXJDYW5jZWxsZWQpO1xuICB9KTtcbn07XG52YXIgY3JlYXRlQ2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUgPSAobGlzdGVuZXJNYXAsIGV4ZWN1dGluZ0xpc3RlbmVycykgPT4ge1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIyIG9mIGV4ZWN1dGluZ0xpc3RlbmVycy5rZXlzKCkpIHtcbiAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVycyhsaXN0ZW5lcjIpO1xuICAgIH1cbiAgICBsaXN0ZW5lck1hcC5jbGVhcigpO1xuICB9O1xufTtcbnZhciBzYWZlbHlOb3RpZnlFcnJvciA9IChlcnJvckhhbmRsZXIsIGVycm9yVG9Ob3RpZnksIGVycm9ySW5mbykgPT4ge1xuICB0cnkge1xuICAgIGVycm9ySGFuZGxlcihlcnJvclRvTm90aWZ5LCBlcnJvckluZm8pO1xuICB9IGNhdGNoIChlcnJvckhhbmRsZXJFcnJvcikge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3cgZXJyb3JIYW5kbGVyRXJyb3I7XG4gICAgfSwgMCk7XG4gIH1cbn07XG52YXIgYWRkTGlzdGVuZXIgPSAvKiBAX19QVVJFX18gKi8gYXNzaWduKC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBY3Rpb24oYCR7YWxtfS9hZGRgKSwge1xuICB3aXRoVHlwZXM6ICgpID0+IGFkZExpc3RlbmVyXG59KTtcbnZhciBjbGVhckFsbExpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBY3Rpb24oYCR7YWxtfS9yZW1vdmVBbGxgKTtcbnZhciByZW1vdmVMaXN0ZW5lciA9IC8qIEBfX1BVUkVfXyAqLyBhc3NpZ24oLyogQF9fUFVSRV9fICovIGNyZWF0ZUFjdGlvbihgJHthbG19L3JlbW92ZWApLCB7XG4gIHdpdGhUeXBlczogKCkgPT4gcmVtb3ZlTGlzdGVuZXJcbn0pO1xudmFyIGRlZmF1bHRFcnJvckhhbmRsZXIgPSAoLi4uYXJncykgPT4ge1xuICBjb25zb2xlLmVycm9yKGAke2FsbX0vZXJyb3JgLCAuLi5hcmdzKTtcbn07XG52YXIgY3JlYXRlTGlzdGVuZXJNaWRkbGV3YXJlID0gKG1pZGRsZXdhcmVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgbGlzdGVuZXJNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBjb25zdCBleGVjdXRpbmdMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBjb25zdCB0cmFja0V4ZWN1dGluZ0xpc3RlbmVyID0gKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgY291bnQgPSBleGVjdXRpbmdMaXN0ZW5lcnMuZ2V0KGVudHJ5KSA/PyAwO1xuICAgIGV4ZWN1dGluZ0xpc3RlbmVycy5zZXQoZW50cnksIGNvdW50ICsgMSk7XG4gIH07XG4gIGNvbnN0IHVudHJhY2tFeGVjdXRpbmdMaXN0ZW5lciA9IChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IGNvdW50ID0gZXhlY3V0aW5nTGlzdGVuZXJzLmdldChlbnRyeSkgPz8gMTtcbiAgICBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgIGV4ZWN1dGluZ0xpc3RlbmVycy5kZWxldGUoZW50cnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGVjdXRpbmdMaXN0ZW5lcnMuc2V0KGVudHJ5LCBjb3VudCAtIDEpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qge1xuICAgIGV4dHJhLFxuICAgIG9uRXJyb3IgPSBkZWZhdWx0RXJyb3JIYW5kbGVyXG4gIH0gPSBtaWRkbGV3YXJlT3B0aW9ucztcbiAgYXNzZXJ0RnVuY3Rpb24ob25FcnJvciwgXCJvbkVycm9yXCIpO1xuICBjb25zdCBpbnNlcnRFbnRyeSA9IChlbnRyeSkgPT4ge1xuICAgIGVudHJ5LnVuc3Vic2NyaWJlID0gKCkgPT4gbGlzdGVuZXJNYXAuZGVsZXRlKGVudHJ5LmlkKTtcbiAgICBsaXN0ZW5lck1hcC5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICByZXR1cm4gKGNhbmNlbE9wdGlvbnMpID0+IHtcbiAgICAgIGVudHJ5LnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAoY2FuY2VsT3B0aW9ucz8uY2FuY2VsQWN0aXZlKSB7XG4gICAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVycyhlbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgY29uc3Qgc3RhcnRMaXN0ZW5pbmcgPSAob3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gZmluZExpc3RlbmVyRW50cnkobGlzdGVuZXJNYXAsIG9wdGlvbnMpID8/IGNyZWF0ZUxpc3RlbmVyRW50cnkob3B0aW9ucyk7XG4gICAgcmV0dXJuIGluc2VydEVudHJ5KGVudHJ5KTtcbiAgfTtcbiAgYXNzaWduKHN0YXJ0TGlzdGVuaW5nLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBzdGFydExpc3RlbmluZ1xuICB9KTtcbiAgY29uc3Qgc3RvcExpc3RlbmluZyA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBmaW5kTGlzdGVuZXJFbnRyeShsaXN0ZW5lck1hcCwgb3B0aW9ucyk7XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICBlbnRyeS51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKG9wdGlvbnMuY2FuY2VsQWN0aXZlKSB7XG4gICAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVycyhlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIWVudHJ5O1xuICB9O1xuICBhc3NpZ24oc3RvcExpc3RlbmluZywge1xuICAgIHdpdGhUeXBlczogKCkgPT4gc3RvcExpc3RlbmluZ1xuICB9KTtcbiAgY29uc3Qgbm90aWZ5TGlzdGVuZXIgPSBhc3luYyAoZW50cnksIGFjdGlvbiwgYXBpLCBnZXRPcmlnaW5hbFN0YXRlKSA9PiB7XG4gICAgY29uc3QgaW50ZXJuYWxUYXNrQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB0YWtlID0gY3JlYXRlVGFrZVBhdHRlcm4oc3RhcnRMaXN0ZW5pbmcsIGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICBjb25zdCBhdXRvSm9pblByb21pc2VzID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGVudHJ5LnBlbmRpbmcuYWRkKGludGVybmFsVGFza0NvbnRyb2xsZXIpO1xuICAgICAgdHJhY2tFeGVjdXRpbmdMaXN0ZW5lcihlbnRyeSk7XG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoZW50cnkuZWZmZWN0KFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIC8vIFVzZSBhc3NpZ24oKSByYXRoZXIgdGhhbiAuLi4gdG8gYXZvaWQgZXh0cmEgaGVscGVyIGZ1bmN0aW9ucyBhZGRlZCB0byBidW5kbGVcbiAgICAgICAgYXNzaWduKHt9LCBhcGksIHtcbiAgICAgICAgICBnZXRPcmlnaW5hbFN0YXRlLFxuICAgICAgICAgIGNvbmRpdGlvbjogKHByZWRpY2F0ZSwgdGltZW91dCkgPT4gdGFrZShwcmVkaWNhdGUsIHRpbWVvdXQpLnRoZW4oQm9vbGVhbiksXG4gICAgICAgICAgdGFrZSxcbiAgICAgICAgICBkZWxheTogY3JlYXRlRGVsYXkoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICAgIHBhdXNlOiBjcmVhdGVQYXVzZShpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgICAgZXh0cmEsXG4gICAgICAgICAgc2lnbmFsOiBpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICBmb3JrOiBjcmVhdGVGb3JrKGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsLCBhdXRvSm9pblByb21pc2VzKSxcbiAgICAgICAgICB1bnN1YnNjcmliZTogZW50cnkudW5zdWJzY3JpYmUsXG4gICAgICAgICAgc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lck1hcC5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVyczogKCkgPT4ge1xuICAgICAgICAgICAgZW50cnkucGVuZGluZy5mb3JFYWNoKChjb250cm9sbGVyLCBfLCBzZXQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT09IGludGVybmFsVGFza0NvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNvbnRyb2xsZXIsIGxpc3RlbmVyQ2FuY2VsbGVkKTtcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNhbmNlbDogKCkgPT4ge1xuICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihpbnRlcm5hbFRhc2tDb250cm9sbGVyLCBsaXN0ZW5lckNhbmNlbGxlZCk7XG4gICAgICAgICAgICBlbnRyeS5wZW5kaW5nLmRlbGV0ZShpbnRlcm5hbFRhc2tDb250cm9sbGVyKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRocm93SWZDYW5jZWxsZWQ6ICgpID0+IHtcbiAgICAgICAgICAgIHZhbGlkYXRlQWN0aXZlKGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9IGNhdGNoIChsaXN0ZW5lckVycm9yKSB7XG4gICAgICBpZiAoIShsaXN0ZW5lckVycm9yIGluc3RhbmNlb2YgVGFza0Fib3J0RXJyb3IpKSB7XG4gICAgICAgIHNhZmVseU5vdGlmeUVycm9yKG9uRXJyb3IsIGxpc3RlbmVyRXJyb3IsIHtcbiAgICAgICAgICByYWlzZWRCeTogXCJlZmZlY3RcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYXV0b0pvaW5Qcm9taXNlcyk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGludGVybmFsVGFza0NvbnRyb2xsZXIsIGxpc3RlbmVyQ29tcGxldGVkKTtcbiAgICAgIHVudHJhY2tFeGVjdXRpbmdMaXN0ZW5lcihlbnRyeSk7XG4gICAgICBlbnRyeS5wZW5kaW5nLmRlbGV0ZShpbnRlcm5hbFRhc2tDb250cm9sbGVyKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlID0gY3JlYXRlQ2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUobGlzdGVuZXJNYXAsIGV4ZWN1dGluZ0xpc3RlbmVycyk7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoYXBpKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmICghaXNBY3Rpb24oYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgICB9XG4gICAgaWYgKGFkZExpc3RlbmVyLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIHJldHVybiBzdGFydExpc3RlbmluZyhhY3Rpb24ucGF5bG9hZCk7XG4gICAgfVxuICAgIGlmIChjbGVhckFsbExpc3RlbmVycy5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBjbGVhckxpc3RlbmVyTWlkZGxld2FyZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVtb3ZlTGlzdGVuZXIubWF0Y2goYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIHN0b3BMaXN0ZW5pbmcoYWN0aW9uLnBheWxvYWQpO1xuICAgIH1cbiAgICBsZXQgb3JpZ2luYWxTdGF0ZSA9IGFwaS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGdldE9yaWdpbmFsU3RhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAob3JpZ2luYWxTdGF0ZSA9PT0gSU5URVJOQUxfTklMX1RPS0VOKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIzKSA6IGAke2FsbX06IGdldE9yaWdpbmFsU3RhdGUgY2FuIG9ubHkgYmUgY2FsbGVkIHN5bmNocm9ub3VzbHlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcmlnaW5hbFN0YXRlO1xuICAgIH07XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgaWYgKGxpc3RlbmVyTWFwLnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGFwaS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBsaXN0ZW5lckVudHJpZXMgPSBBcnJheS5mcm9tKGxpc3RlbmVyTWFwLnZhbHVlcygpKTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBsaXN0ZW5lckVudHJpZXMpIHtcbiAgICAgICAgICBsZXQgcnVuTGlzdGVuZXIgPSBmYWxzZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcnVuTGlzdGVuZXIgPSBlbnRyeS5wcmVkaWNhdGUoYWN0aW9uLCBjdXJyZW50U3RhdGUsIG9yaWdpbmFsU3RhdGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKHByZWRpY2F0ZUVycm9yKSB7XG4gICAgICAgICAgICBydW5MaXN0ZW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgc2FmZWx5Tm90aWZ5RXJyb3Iob25FcnJvciwgcHJlZGljYXRlRXJyb3IsIHtcbiAgICAgICAgICAgICAgcmFpc2VkQnk6IFwicHJlZGljYXRlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXJ1bkxpc3RlbmVyKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm90aWZ5TGlzdGVuZXIoZW50cnksIGFjdGlvbiwgYXBpLCBnZXRPcmlnaW5hbFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBvcmlnaW5hbFN0YXRlID0gSU5URVJOQUxfTklMX1RPS0VOO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4ge1xuICAgIG1pZGRsZXdhcmUsXG4gICAgc3RhcnRMaXN0ZW5pbmcsXG4gICAgc3RvcExpc3RlbmluZyxcbiAgICBjbGVhckxpc3RlbmVyczogY2xlYXJMaXN0ZW5lck1pZGRsZXdhcmVcbiAgfTtcbn07XG5cbi8vIHNyYy9keW5hbWljTWlkZGxld2FyZS9pbmRleC50c1xudmFyIGNyZWF0ZU1pZGRsZXdhcmVFbnRyeSA9IChtaWRkbGV3YXJlKSA9PiAoe1xuICBtaWRkbGV3YXJlLFxuICBhcHBsaWVkOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpXG59KTtcbnZhciBtYXRjaEluc3RhbmNlID0gKGluc3RhbmNlSWQpID0+IChhY3Rpb24pID0+IGFjdGlvbj8ubWV0YT8uaW5zdGFuY2VJZCA9PT0gaW5zdGFuY2VJZDtcbnZhciBjcmVhdGVEeW5hbWljTWlkZGxld2FyZSA9ICgpID0+IHtcbiAgY29uc3QgaW5zdGFuY2VJZCA9IG5hbm9pZCgpO1xuICBjb25zdCBtaWRkbGV3YXJlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3Qgd2l0aE1pZGRsZXdhcmUgPSBPYmplY3QuYXNzaWduKGNyZWF0ZUFjdGlvbihcImR5bmFtaWNNaWRkbGV3YXJlL2FkZFwiLCAoLi4ubWlkZGxld2FyZXMpID0+ICh7XG4gICAgcGF5bG9hZDogbWlkZGxld2FyZXMsXG4gICAgbWV0YToge1xuICAgICAgaW5zdGFuY2VJZFxuICAgIH1cbiAgfSkpLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiB3aXRoTWlkZGxld2FyZVxuICB9KTtcbiAgY29uc3QgYWRkTWlkZGxld2FyZSA9IE9iamVjdC5hc3NpZ24oZnVuY3Rpb24gYWRkTWlkZGxld2FyZTIoLi4ubWlkZGxld2FyZXMpIHtcbiAgICBtaWRkbGV3YXJlcy5mb3JFYWNoKChtaWRkbGV3YXJlMikgPT4ge1xuICAgICAgZ2V0T3JJbnNlcnRDb21wdXRlZChtaWRkbGV3YXJlTWFwLCBtaWRkbGV3YXJlMiwgY3JlYXRlTWlkZGxld2FyZUVudHJ5KTtcbiAgICB9KTtcbiAgfSwge1xuICAgIHdpdGhUeXBlczogKCkgPT4gYWRkTWlkZGxld2FyZVxuICB9KTtcbiAgY29uc3QgZ2V0RmluYWxNaWRkbGV3YXJlID0gKGFwaSkgPT4ge1xuICAgIGNvbnN0IGFwcGxpZWRNaWRkbGV3YXJlID0gQXJyYXkuZnJvbShtaWRkbGV3YXJlTWFwLnZhbHVlcygpKS5tYXAoKGVudHJ5KSA9PiBnZXRPckluc2VydENvbXB1dGVkKGVudHJ5LmFwcGxpZWQsIGFwaSwgZW50cnkubWlkZGxld2FyZSkpO1xuICAgIHJldHVybiBjb21wb3NlKC4uLmFwcGxpZWRNaWRkbGV3YXJlKTtcbiAgfTtcbiAgY29uc3QgaXNXaXRoTWlkZGxld2FyZSA9IGlzQWxsT2Yod2l0aE1pZGRsZXdhcmUsIG1hdGNoSW5zdGFuY2UoaW5zdGFuY2VJZCkpO1xuICBjb25zdCBtaWRkbGV3YXJlID0gKGFwaSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAoaXNXaXRoTWlkZGxld2FyZShhY3Rpb24pKSB7XG4gICAgICBhZGRNaWRkbGV3YXJlKC4uLmFjdGlvbi5wYXlsb2FkKTtcbiAgICAgIHJldHVybiBhcGkuZGlzcGF0Y2g7XG4gICAgfVxuICAgIHJldHVybiBnZXRGaW5hbE1pZGRsZXdhcmUoYXBpKShuZXh0KShhY3Rpb24pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIG1pZGRsZXdhcmUsXG4gICAgYWRkTWlkZGxld2FyZSxcbiAgICB3aXRoTWlkZGxld2FyZSxcbiAgICBpbnN0YW5jZUlkXG4gIH07XG59O1xuXG4vLyBzcmMvY29tYmluZVNsaWNlcy50c1xuaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzIGFzIGNvbWJpbmVSZWR1Y2VyczIgfSBmcm9tIFwicmVkdXhcIjtcbnZhciBpc1NsaWNlTGlrZSA9IChtYXliZVNsaWNlTGlrZSkgPT4gXCJyZWR1Y2VyUGF0aFwiIGluIG1heWJlU2xpY2VMaWtlICYmIHR5cGVvZiBtYXliZVNsaWNlTGlrZS5yZWR1Y2VyUGF0aCA9PT0gXCJzdHJpbmdcIjtcbnZhciBnZXRSZWR1Y2VycyA9IChzbGljZXMpID0+IHNsaWNlcy5mbGF0TWFwKChzbGljZU9yTWFwKSA9PiBpc1NsaWNlTGlrZShzbGljZU9yTWFwKSA/IFtbc2xpY2VPck1hcC5yZWR1Y2VyUGF0aCwgc2xpY2VPck1hcC5yZWR1Y2VyXV0gOiBPYmplY3QuZW50cmllcyhzbGljZU9yTWFwKSk7XG52YXIgT1JJR0lOQUxfU1RBVEUgPSBTeW1ib2wuZm9yKFwicnRrLXN0YXRlLXByb3h5LW9yaWdpbmFsXCIpO1xudmFyIGlzU3RhdGVQcm94eSA9ICh2YWx1ZSkgPT4gISF2YWx1ZSAmJiAhIXZhbHVlW09SSUdJTkFMX1NUQVRFXTtcbnZhciBzdGF0ZVByb3h5TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG52YXIgY3JlYXRlU3RhdGVQcm94eSA9IChzdGF0ZSwgcmVkdWNlck1hcCwgaW5pdGlhbFN0YXRlQ2FjaGUpID0+IGdldE9ySW5zZXJ0Q29tcHV0ZWQoc3RhdGVQcm94eU1hcCwgc3RhdGUsICgpID0+IG5ldyBQcm94eShzdGF0ZSwge1xuICBnZXQ6ICh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSA9PiB7XG4gICAgaWYgKHByb3AgPT09IE9SSUdJTkFMX1NUQVRFKSByZXR1cm4gdGFyZ2V0O1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSBpbml0aWFsU3RhdGVDYWNoZVtwcm9wXTtcbiAgICAgIGlmICh0eXBlb2YgY2FjaGVkICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gY2FjaGVkO1xuICAgICAgY29uc3QgcmVkdWNlciA9IHJlZHVjZXJNYXBbcHJvcF07XG4gICAgICBpZiAocmVkdWNlcikge1xuICAgICAgICBjb25zdCByZWR1Y2VyUmVzdWx0ID0gcmVkdWNlcih2b2lkIDAsIHtcbiAgICAgICAgICB0eXBlOiBuYW5vaWQoKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiByZWR1Y2VyUmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjQpIDogYFRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke3Byb3AudG9TdHJpbmcoKX1cIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBjYWxsZWQgZm9yIHNlbGVjdG9yKCkuIElmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQuIElmIHlvdSBkb24ndCB3YW50IHRvIHNldCBhIHZhbHVlIGZvciB0aGlzIHJlZHVjZXIsIHlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5pdGlhbFN0YXRlQ2FjaGVbcHJvcF0gPSByZWR1Y2VyUmVzdWx0O1xuICAgICAgICByZXR1cm4gcmVkdWNlclJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSkpO1xudmFyIG9yaWdpbmFsID0gKHN0YXRlKSA9PiB7XG4gIGlmICghaXNTdGF0ZVByb3h5KHN0YXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI1KSA6IFwib3JpZ2luYWwgbXVzdCBiZSB1c2VkIG9uIHN0YXRlIFByb3h5XCIpO1xuICB9XG4gIHJldHVybiBzdGF0ZVtPUklHSU5BTF9TVEFURV07XG59O1xudmFyIGVtcHR5T2JqZWN0ID0ge307XG52YXIgbm9vcFJlZHVjZXIgPSAoc3RhdGUgPSBlbXB0eU9iamVjdCkgPT4gc3RhdGU7XG5mdW5jdGlvbiBjb21iaW5lU2xpY2VzKC4uLnNsaWNlcykge1xuICBjb25zdCByZWR1Y2VyTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKGdldFJlZHVjZXJzKHNsaWNlcykpO1xuICBjb25zdCBnZXRSZWR1Y2VyID0gKCkgPT4gT2JqZWN0LmtleXMocmVkdWNlck1hcCkubGVuZ3RoID8gY29tYmluZVJlZHVjZXJzMihyZWR1Y2VyTWFwKSA6IG5vb3BSZWR1Y2VyO1xuICBsZXQgcmVkdWNlciA9IGdldFJlZHVjZXIoKTtcbiAgZnVuY3Rpb24gY29tYmluZWRSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgICByZXR1cm4gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgfVxuICBjb21iaW5lZFJlZHVjZXIud2l0aExhenlMb2FkZWRTbGljZXMgPSAoKSA9PiBjb21iaW5lZFJlZHVjZXI7XG4gIGNvbnN0IGluaXRpYWxTdGF0ZUNhY2hlID0ge307XG4gIGNvbnN0IGluamVjdCA9IChzbGljZSwgY29uZmlnID0ge30pID0+IHtcbiAgICBjb25zdCB7XG4gICAgICByZWR1Y2VyUGF0aCxcbiAgICAgIHJlZHVjZXI6IHJlZHVjZXJUb0luamVjdFxuICAgIH0gPSBzbGljZTtcbiAgICBjb25zdCBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXJNYXBbcmVkdWNlclBhdGhdO1xuICAgIGlmICghY29uZmlnLm92ZXJyaWRlRXhpc3RpbmcgJiYgY3VycmVudFJlZHVjZXIgJiYgY3VycmVudFJlZHVjZXIgIT09IHJlZHVjZXJUb0luamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgY2FsbGVkIFxcYGluamVjdFxcYCB0byBvdmVycmlkZSBhbHJlYWR5LWV4aXN0aW5nIHJlZHVjZXIgJHtyZWR1Y2VyUGF0aH0gd2l0aG91dCBzcGVjaWZ5aW5nIFxcYG92ZXJyaWRlRXhpc3Rpbmc6IHRydWVcXGBgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21iaW5lZFJlZHVjZXI7XG4gICAgfVxuICAgIGlmIChjb25maWcub3ZlcnJpZGVFeGlzdGluZyAmJiBjdXJyZW50UmVkdWNlciAhPT0gcmVkdWNlclRvSW5qZWN0KSB7XG4gICAgICBkZWxldGUgaW5pdGlhbFN0YXRlQ2FjaGVbcmVkdWNlclBhdGhdO1xuICAgIH1cbiAgICByZWR1Y2VyTWFwW3JlZHVjZXJQYXRoXSA9IHJlZHVjZXJUb0luamVjdDtcbiAgICByZWR1Y2VyID0gZ2V0UmVkdWNlcigpO1xuICAgIHJldHVybiBjb21iaW5lZFJlZHVjZXI7XG4gIH07XG4gIGNvbnN0IHNlbGVjdG9yID0gT2JqZWN0LmFzc2lnbihmdW5jdGlvbiBtYWtlU2VsZWN0b3Ioc2VsZWN0b3JGbiwgc2VsZWN0U3RhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gc2VsZWN0b3IyKHN0YXRlLCAuLi5hcmdzKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JGbihjcmVhdGVTdGF0ZVByb3h5KHNlbGVjdFN0YXRlID8gc2VsZWN0U3RhdGUoc3RhdGUsIC4uLmFyZ3MpIDogc3RhdGUsIHJlZHVjZXJNYXAsIGluaXRpYWxTdGF0ZUNhY2hlKSwgLi4uYXJncyk7XG4gICAgfTtcbiAgfSwge1xuICAgIG9yaWdpbmFsXG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihjb21iaW5lZFJlZHVjZXIsIHtcbiAgICBpbmplY3QsXG4gICAgc2VsZWN0b3JcbiAgfSk7XG59XG5cbi8vIHNyYy9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlLnRzXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIGBNaW5pZmllZCBSZWR1eCBUb29sa2l0IGVycm9yICMke2NvZGV9OyB2aXNpdCBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL0Vycm9ycz9jb2RlPSR7Y29kZX0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycy4gYDtcbn1cbmV4cG9ydCB7XG4gIFJlZHVjZXJUeXBlLFxuICBTSE9VTERfQVVUT0JBVENILFxuICBUYXNrQWJvcnRFcnJvcixcbiAgVHVwbGUsXG4gIGFkZExpc3RlbmVyLFxuICBhc3luY1RodW5rQ3JlYXRvcixcbiAgYXV0b0JhdGNoRW5oYW5jZXIsXG4gIGJ1aWxkQ3JlYXRlU2xpY2UsXG4gIGNsZWFyQWxsTGlzdGVuZXJzLFxuICBjb21iaW5lU2xpY2VzLFxuICBjb25maWd1cmVTdG9yZSxcbiAgY3JlYXRlQWN0aW9uLFxuICBjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZSxcbiAgY3JlYXRlQXN5bmNUaHVuayxcbiAgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IsXG4gIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yQ3JlYXRvcixcbiAgY3JlYXRlRHluYW1pY01pZGRsZXdhcmUsXG4gIGNyZWF0ZUVudGl0eUFkYXB0ZXIsXG4gIGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSxcbiAgY3JlYXRlTGlzdGVuZXJNaWRkbGV3YXJlLFxuICBwcm9kdWNlIGFzIGNyZWF0ZU5leHRTdGF0ZSxcbiAgY3JlYXRlUmVkdWNlcixcbiAgY3JlYXRlU2VsZWN0b3IsXG4gIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcixcbiAgY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLFxuICBjcmVhdGVTbGljZSxcbiAgY3VycmVudCxcbiAgZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlLFxuICBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlLFxuICBmcmVlemUsXG4gIGlzQWN0aW9uQ3JlYXRvcixcbiAgaXNBbGxPZixcbiAgaXNBbnlPZixcbiAgaXNBc3luY1RodW5rQWN0aW9uLFxuICBpc0RyYWZ0LFxuICBpc0ZTQSBhcyBpc0ZsdXhTdGFuZGFyZEFjdGlvbixcbiAgaXNGdWxmaWxsZWQsXG4gIGlzSW1tdXRhYmxlRGVmYXVsdCxcbiAgaXNQZW5kaW5nLFxuICBpc1BsYWluLFxuICBpc1JlamVjdGVkLFxuICBpc1JlamVjdGVkV2l0aFZhbHVlLFxuICBscnVNZW1vaXplLFxuICBtaW5pU2VyaWFsaXplRXJyb3IsXG4gIG5hbm9pZCxcbiAgb3JpZ2luYWwyIGFzIG9yaWdpbmFsLFxuICBwcmVwYXJlQXV0b0JhdGNoZWQsXG4gIHJlbW92ZUxpc3RlbmVyLFxuICB1bndyYXBSZXN1bHQsXG4gIHdlYWtNYXBNZW1vaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdXgtdG9vbGtpdC5tb2Rlcm4ubWpzLm1hcCIsImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuL2FwcGxpY2F0aW9uLXN0b3JlJztcbnZhciBTbmFja2JhckNvbnRleHQgPSBjcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG5leHBvcnQgdmFyIFNuYWNrYmFyUHJvdmlkZXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgc25hY2tiYXIgPSBBcHBsaWNhdGlvblN0b3JlLnVzZVN0YXRlKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLnNuYWNrYmFyOyB9KTtcbiAgICB2YXIgc2hvd1NuYWNrYmFyID0gZnVuY3Rpb24gKG1lc3NhZ2UsIHNldmVyaXR5KSB7XG4gICAgICAgIGlmIChzZXZlcml0eSA9PT0gdm9pZCAwKSB7IHNldmVyaXR5ID0gJ2luZm8nOyB9XG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSBzZXZlcml0eTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gKF9qc3hzKFNuYWNrYmFyQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogeyBzaG93U25hY2tiYXI6IHNob3dTbmFja2JhciB9LCBjaGlsZHJlbjogW2NoaWxkcmVuLCBfanN4KFNuYWNrYmFyLCB7IG9wZW46IHNuYWNrYmFyLm9wZW4sIG1lc3NhZ2U6IHNuYWNrYmFyLm1lc3NhZ2UsIHNldmVyaXR5OiBzbmFja2Jhci5zZXZlcml0eSwgYXV0b0hpZGVEdXJhdGlvbjogMTUwMCwgb25DbG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gfSldIH0pKTtcbn07XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzLCBjb25maWd1cmVTdG9yZSwgfSBmcm9tICdAcmVkdXhqcy90b29sa2l0JztcbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFF1ZXJ5Q2xpZW50LCBRdWVyeUNsaWVudFByb3ZpZGVyIH0gZnJvbSAncmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBCcm93c2VyUm91dGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgeyBpbnN0aXR1dGlvbkNvZGUsIHRlbmFudENvZGUsIHdvcmtzcGFjZSB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDb25maXJtRGlhbG9nUHJvdmlkZXIgfSBmcm9tICcuL0NvbmZpcm1EaWFsb2dQcm92aWRlcic7XG5pbXBvcnQgeyBTbmFja2JhclByb3ZpZGVyIH0gZnJvbSAnLi9TbmFja2JhclByb3ZpZGVyJztcbi8vIFdlJ2xsIGFkZCB0aGlzIGV4cG9ydCB0byBlbnN1cmUgUm91dGVyIGlzIHByb3Blcmx5IGV4cG9ydGVkXG5leHBvcnQgeyBCcm93c2VyUm91dGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5leHBvcnQgdmFyIFByb3ZpZGVycyA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBiYXNlbmFtZSA9IF9hLmJhc2VuYW1lLCBfYiA9IF9hLnJlZHVjZXJzLCByZWR1Y2VycyA9IF9iID09PSB2b2lkIDAgPyB7fSA6IF9iO1xuICAgIHZhciBxdWVyeUNsaWVudCA9IG5ldyBRdWVyeUNsaWVudCh7XG4gICAgICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICAgICAgICBxdWVyaWVzOiB7XG4gICAgICAgICAgICAgICAgcmVmZXRjaE9uV2luZG93Rm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJldHJ5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB1c2VFcnJvckJvdW5kYXJ5OiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICB2YXIgYmFzZU5hbWUgPSB0ZW5hbnRDb2RlICYmIGluc3RpdHV0aW9uQ29kZSAmJiB3b3Jrc3BhY2VcbiAgICAgICAgPyBcIi9cIi5jb25jYXQoaW5zdGl0dXRpb25Db2RlLCBcIi9cIikuY29uY2F0KHdvcmtzcGFjZSlcbiAgICAgICAgOiAnLyc7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9PT0gJy8nICYmXG4gICAgICAgICAgICBpbnN0aXR1dGlvbkNvZGUgJiZcbiAgICAgICAgICAgIHdvcmtzcGFjZSAmJlxuICAgICAgICAgICAgdGVuYW50Q29kZSkge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2Uod2luZG93LmxvY2F0aW9uLm9yaWdpbiArIFwiL1wiLmNvbmNhdChpbnN0aXR1dGlvbkNvZGUsIFwiL1wiKS5jb25jYXQod29ya3NwYWNlKSk7XG4gICAgICAgIH1cbiAgICB9LCBbaW5zdGl0dXRpb25Db2RlLCB0ZW5hbnRDb2RlLCB3b3Jrc3BhY2VdKTtcbiAgICB2YXIgc3RvcmUgPSBjb25maWd1cmVTdG9yZSh7XG4gICAgICAgIHJlZHVjZXI6IGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VycyksXG4gICAgfSk7XG4gICAgcmV0dXJuIChfanN4KFByb3ZpZGVyLCB7IHN0b3JlOiBzdG9yZSwgY2hpbGRyZW46IF9qc3goQnJvd3NlclJvdXRlciwgeyBiYXNlbmFtZTogYmFzZW5hbWUgIT09IG51bGwgJiYgYmFzZW5hbWUgIT09IHZvaWQgMCA/IGJhc2VuYW1lIDogYmFzZU5hbWUsIGNoaWxkcmVuOiBfanN4KFF1ZXJ5Q2xpZW50UHJvdmlkZXIsIHsgY2xpZW50OiBxdWVyeUNsaWVudCwgY2hpbGRyZW46IF9qc3goU25hY2tiYXJQcm92aWRlciwgeyBjaGlsZHJlbjogX2pzeChDb25maXJtRGlhbG9nUHJvdmlkZXIsIHsgY2hpbGRyZW46IGNoaWxkcmVuIH0pIH0pIH0pIH0pIH0pKTtcbn07XG4iLCJpbXBvcnQgeyBBcHBsaWNhdGlvblN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9hcHBsaWNhdGlvbi1zdG9yZSc7XG52YXIgZGVmYXVsdENvbmZpcm1EaWFsb2dTdGF0ZSA9IHtcbiAgICBpc09wZW46IGZhbHNlLFxuICAgIHRpdGxlOiAnJyxcbiAgICBtZXNzYWdlOiAnJyxcbiAgICBjb25maXJtQnV0dG9uVGV4dDogJycsXG4gICAgY2FuY2VsQnV0dG9uVGV4dDogJycsXG4gICAgdHlwZTogJ2NvbmZpcm0nLFxuICAgIG9uQ29uZmlybTogZnVuY3Rpb24gKCkgeyB9LFxuICAgIG9uQ2FuY2VsOiBmdW5jdGlvbiAoKSB7IH0sXG59O1xuZXhwb3J0IHZhciB1c2VDb25maXJtID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBpc0NvbmZpcm1lZCA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgdGl0bGUgPSBfYS50aXRsZSwgbWVzc2FnZSA9IF9hLm1lc3NhZ2UsIGNvbmZpcm1CdXR0b25UZXh0ID0gX2EuY29uZmlybUJ1dHRvblRleHQsIGNhbmNlbEJ1dHRvblRleHQgPSBfYS5jYW5jZWxCdXR0b25UZXh0LCBfYiA9IF9hLnR5cGUsIHR5cGUgPSBfYiA9PT0gdm9pZCAwID8gJ2NvbmZpcm0nIDogX2I7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICBzLmNvbmZpcm1EaWFsb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogY29uZmlybUJ1dHRvblRleHQsXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6IGNhbmNlbEJ1dHRvblRleHQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0RGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0RGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHZhciByZXNldERpYWxvZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuY29uZmlybURpYWxvZyA9IGRlZmF1bHRDb25maXJtRGlhbG9nU3RhdGU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIGlzQ29uZmlybWVkO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgRGVwYXJ0bWVudE1vbmdvTXVsdGlTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChNdWx0aVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3R5cGUnLFxuICAgICAgICAgICAgdXNlU3ViTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdfaWQnLFxuICAgICAgICAgICAgaXNPYmplY3RJZDogdHJ1ZSxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBub25Xb3Jrc3BhY2VBeGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvZGVwYXJ0bWVudHNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgRGVwYXJ0bWVudFNxbE11bHRpU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goTXVsdGlTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICd0eXBlJyxcbiAgICAgICAgICAgIHVzZVN1YkxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICAgICAgaXNJbnQ6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogbm9uV29ya3NwYWNlQXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2RlcGFydG1lbnRzLXNxbFwiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgQmF0Y2hTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiQmF0Y2hcIiB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvYmF0Y2hlc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgQ291cnNlU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdjb3Vyc2VOYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAnbGV2ZWwnLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9jb3Vyc2VzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBEZXBhcnRtZW50U2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAndHlwZScsXG4gICAgICAgICAgICB1c2VTdWJMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ19pZCcsXG4gICAgICAgICAgICBpc09iamVjdElkOiB0cnVlLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IG5vbldvcmtzcGFjZUF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9kZXBhcnRtZW50c1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgRW1wbG95ZWVzU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdfaWQnLFxuICAgICAgICAgICAgaXNPYmplY3RJZDogdHJ1ZSxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ2Z1bGxOYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAnZW1wbG95ZWVJZCcsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2VtcGxveWVlc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgRXhhbXNSZWd1bGF0aW9uU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHsgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJSZWd1bGF0aW9uXCIgfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2V4YW0tcmVndWxhdGlvbnNcIiwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgIGxhYmVsS2V5OiAnci5uYW1lJyxcbiAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgdmFsdWVLZXk6ICdyLm5hbWUnLFxuICAgIH0gfSkpKTsgfTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG52YXIgZXhhbVR5cGVPcHRpb25zID0gW1xuICAgIHsgbGFiZWw6ICdBbGwnLCB2YWx1ZTogbnVsbCB9LFxuICAgIHsgbGFiZWw6ICdSRUdVTEFSJywgdmFsdWU6ICdSJyB9LFxuICAgIHsgbGFiZWw6ICdTVVBQTEVNRU5UQVJZJywgdmFsdWU6ICdTJyB9LFxuXTtcbmV4cG9ydCB2YXIgRXhhbVR5cGVTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIkV4YW0gVHlwZVwiLCBvcHRpb25zOiBleGFtVHlwZU9wdGlvbnMgfSwgcHJvcHMpKSk7IH07XG4iLCJleHBvcnQgdmFyIEZlZVR5cGVzID0gW1xuICAgIHtcbiAgICAgICAgbGFiZWw6ICdUdWl0aW9uIEZlZScsXG4gICAgICAgIHZhbHVlOiAndHVpdGlvbl9mZWUnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBsYWJlbDogJ0FkbWlzc2lvbiBGZWUnLFxuICAgICAgICB2YWx1ZTogJ2FkbWlzc2lvbl9mZWUnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBsYWJlbDogJ0hvc3RlbCBGZWUnLFxuICAgICAgICB2YWx1ZTogJ2hvc3RlbF9mZWUnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBsYWJlbDogJ1RyYW5zcG9ydCBGZWUnLFxuICAgICAgICB2YWx1ZTogJ3RyYW5zcG9ydF9mZWUnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBsYWJlbDogJ0V4YW0gRmVlJyxcbiAgICAgICAgdmFsdWU6ICdleGFtX2ZlZScsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnT3RoZXIgRmVlJyxcbiAgICAgICAgdmFsdWU6ICdvdGhlcl9mZWUnLFxuICAgIH0sXG5dO1xuZXhwb3J0IHZhciB5ZWFycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDYgfSwgZnVuY3Rpb24gKF8sIGkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gaTtcbn0pO1xuZXhwb3J0IHZhciBiYXRjaE9wdGlvbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMiB9LCBmdW5jdGlvbiAoXywgaSkgeyByZXR1cm4gKHtcbiAgICBsYWJlbDogXCJcIi5jb25jYXQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gaSwgXCIgLSBcIikuY29uY2F0KG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIGkgKyAxKSxcbiAgICB2YWx1ZTogXCJcIi5jb25jYXQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gaSwgXCIgLSBcIikuY29uY2F0KG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIGkgKyAxKSxcbn0pOyB9KTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBGZWVUeXBlcyB9IGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IHZhciBGZWVUeXBlU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIkZlZSBUeXBlXCIsIG9wdGlvbnM6IEZlZVR5cGVzID09PSBudWxsIHx8IEZlZVR5cGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBGZWVUeXBlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuICh7XG4gICAgICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLnZhbHVlLFxuICAgICAgICB9KTsgfSkgfSwgcHJvcHMpKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgSG9zdGVsQmxvY2tTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgICAgIGlzSW50OiB0cnVlLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3R5cGUnLFxuICAgICAgICAgICAgdXNlTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgICAgICB1c2VTdWJMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvaG9zdGVsLWJsb2Nrc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgSG9zdGVsRmxvb3JTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiSG9zdGVsIFJvb20gTm8uXCIsIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdmbG9vcicsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdmbG9vcicsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCJkcm9wZG93bnMvZmxvb3JzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBIb3N0ZWxSb29tU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIkhvc3RlbCBSb29tXCIsIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdyb29tX251bWJlcicsXG4gICAgICAgICAgICB1c2VMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgICAgIC8vIHN1YkxhYmVsS2V5OiAnZmxvb3InLFxuICAgICAgICB9IH0sIHByb3BzLCB7IG9wdGlvbnNBcGlFbmRQb2ludDogXCJkcm9wZG93bnMvaG9zdGVsLXJvb21zXCIsIGV4dGVybmFsQXhpb3M6IGF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgTW9udGhZZWFyU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHsgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJNb250aCAmIFllYXJcIiB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvbW9udGgteWVhcnNcIiB9KSkpOyB9O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUHJpbnRGb3JtYXRTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICd0eXBlJyxcbiAgICAgICAgICAgIHVzZVN1YkxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9wcmludC1mb3JtYXRzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBQcm9ncmFtU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdicmFuY2hDb2RlJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAnYnJhbmNoRGlzcGxheScsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3Byb2dyYW1zXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBSZWd1bGF0aW9uU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIlJlZ3VsYXRpb25cIiwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ3JlZ3VsYXRpb25faWQnLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnci5uYW1lJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiZHJvcGRvd25zL3JlZ3VsYXRpb25zXCIsIGV4dGVybmFsQXhpb3M6IGF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUmVzZWFyY2hFeHBlcnREZXNpZ25hdGlvblNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgICAgICBpc0ludDogdHJ1ZSxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBub25Xb3Jrc3BhY2VBeGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvcmVzZWFyY2gtZXhwZXJ0LWRlc2lnbmF0aW9uc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUmVzZWFyY2hFeHBlcnRTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIC8vIGRiTFZhbHVlUHJvcHMgYXJlIG5vdCBiZWluZyB1c2VkIGluIGJhY2tlbmQuXG4gICAgLy8gZGJMYWJlbFByb3BzLnNlYXJjaCwgbGltaXQsIG9mZnNldCBhcmUgYmVpbmcgdXNlZCBpbiBiYWNrZW5kLlxuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICd0eXBlJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiZHJvcGRvd25zL3Jlc2VhcmNoLWV4cGVydHNcIiwgZXh0ZXJuYWxBeGlvczogbm9uV29ya3NwYWNlQXhpb3MgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBSZXNlYXJjaFN0YWdlU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAvLyBFc2NhcGUgJ29yZGVyJyBjb2x1bW4gbmFtZSBhcyBpdCdzIGEgcmVzZXJ2ZWQga2V5d29yZCBpbiBNeVNRTFxuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgICAgIGlzSW50OiB0cnVlLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ2BvcmRlcmAnLFxuICAgICAgICB9IH0sIHByb3BzLCB7IG9wdGlvbnNBcGlFbmRQb2ludDogXCJkcm9wZG93bnMvcmVzZWFyY2gtc3RhZ2VzXCIsIGV4dGVybmFsQXhpb3M6IG5vbldvcmtzcGFjZUF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgU2VtZXN0ZXJTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICd5ZWFyJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9zZW1lc3RlcnNcIiwgZXh0ZXJuYWxBeGlvczogYXhpb3MgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBTdHVkZW50U2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdzbHVnJyxcbiAgICAgICAgICAgIHVzZUxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9zdHVkZW50c1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgU3R1ZGVudFNlcnZpY2VzU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdzbHVnJyxcbiAgICAgICAgICAgIHVzZUxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9zdHVkZW50LXNlcnZpY2VzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyB5ZWFycyB9IGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IHZhciBZZWFyUmFuZ2VTZWxlY3RvciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBfYiA9IF9hLnN1ZmZpeCwgc3VmZml4ID0gX2IgPT09IHZvaWQgMCA/IG51bGwgOiBfYiwgX2MgPSBfYS52YWx1ZUtleSwgdmFsdWVLZXkgPSBfYyA9PT0gdm9pZCAwID8gJ3llYXJSYW5nZScgOiBfYywgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcInN1ZmZpeFwiLCBcInZhbHVlS2V5XCJdKTtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIlllYXIgUmFuZ2VcIiwgb3B0aW9uczogeWVhcnMgPT09IG51bGwgfHwgeWVhcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHllYXJzLm1hcChmdW5jdGlvbiAoeWVhcikgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBzdWZmaXhcbiAgICAgICAgICAgICAgICA/IFwiXCIuY29uY2F0KHN1ZmZpeCwgXCIgXCIpLmNvbmNhdCh5ZWFyLCBcIiAtIFwiKS5jb25jYXQoeWVhciArIDEpXG4gICAgICAgICAgICAgICAgOiBcIlwiLmNvbmNhdCh5ZWFyLCBcIiAtIFwiKS5jb25jYXQoeWVhciArIDEpLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlS2V5ID09PSAneWVhclJhbmdlJyA/IFwiXCIuY29uY2F0KHllYXIsIFwiIC0gXCIpLmNvbmNhdCh5ZWFyICsgMSkgOiB5ZWFyLFxuICAgICAgICB9KTsgfSkgfSwgcHJvcHMpKSk7XG59O1xuIiwiZXhwb3J0IHZhciBvcGVuSW5OZXdUYWIgPSBmdW5jdGlvbiAocGF0aEFmdGVyQmFzZSwgZXhjbHVkZUluc3RpdHV0aW9uLCBleGNsdWRlV29ya3NwYWNlKSB7XG4gICAgaWYgKGV4Y2x1ZGVJbnN0aXR1dGlvbiA9PT0gdm9pZCAwKSB7IGV4Y2x1ZGVJbnN0aXR1dGlvbiA9IGZhbHNlOyB9XG4gICAgaWYgKGV4Y2x1ZGVXb3Jrc3BhY2UgPT09IHZvaWQgMCkgeyBleGNsdWRlV29ya3NwYWNlID0gZmFsc2U7IH1cbiAgICB2YXIgY3VycmVudFBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgdmFyIHNlZ21lbnRzID0gY3VycmVudFBhdGguc3BsaXQoJy8nKTtcbiAgICAvLyBCdWlsZCBiYXNlIHBhdGggYmFzZWQgb24gZXhjbHVzaW9uIGZsYWdzXG4gICAgdmFyIGJhc2VQYXJ0cyA9IFtdO1xuICAgIC8vIEFkZCBzZWdtZW50IDEgKGluc3RpdHV0aW9uKSB1bmxlc3MgZXhjbHVkZWRcbiAgICBpZiAoIWV4Y2x1ZGVJbnN0aXR1dGlvbiAmJiBzZWdtZW50c1sxXSkge1xuICAgICAgICBiYXNlUGFydHMucHVzaChzZWdtZW50c1sxXSk7XG4gICAgfVxuICAgIC8vIEFkZCBzZWdtZW50IDIgKHdvcmtzcGFjZSkgdW5sZXNzIGV4Y2x1ZGVkXG4gICAgaWYgKCFleGNsdWRlV29ya3NwYWNlICYmIHNlZ21lbnRzWzJdKSB7XG4gICAgICAgIGJhc2VQYXJ0cy5wdXNoKHNlZ21lbnRzWzJdKTtcbiAgICB9XG4gICAgdmFyIGJhc2UgPSBiYXNlUGFydHMubGVuZ3RoID4gMCA/ICcvJyArIGJhc2VQYXJ0cy5qb2luKCcvJykgOiAnJztcbiAgICAvLyBDb25zdHJ1Y3QgZnVsbCBVUkwgYW5kIG9wZW4gaW4gbmV3IHRhYlxuICAgIHZhciBmdWxsUGF0aCA9IFwiXCIuY29uY2F0KHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pLmNvbmNhdChiYXNlLCBcIi9cIikuY29uY2F0KHBhdGhBZnRlckJhc2UpO1xuICAgIHdpbmRvdy5vcGVuKGZ1bGxQYXRoLCAnX2JsYW5rJyk7XG59O1xuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IEV4b3RlbENSTVdlYlNESyBmcm9tICdAZXhvdGVsLW5wbS1kZXYvZXhvdGVsLWlwLWNhbGxpbmctY3JtLXdlYnNkayc7XG52YXIgRXhvdGVsU2VydmljZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFeG90ZWxTZXJ2aWNlKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmV4b3RlbFNESyA9IG51bGw7XG4gICAgICAgIHRoaXMud2ViUGhvbmUgPSBudWxsO1xuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbkxpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uU3RhdHVzID0gJ3Vua25vd24nO1xuICAgICAgICB0aGlzLmhhbmRsZUNhbGxFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgY2FsbERhdGEpIHtcbiAgICAgICAgICAgIF90aGlzLmNhbGxMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyKGV2ZW50LCBjYWxsRGF0YSk7IH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVJlZ2lzdGVyRXZlbnQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICAgIF90aGlzLnJlZ2lzdGVyTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBsaXN0ZW5lcihzdGF0ZSk7IH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVNlc3Npb25FdmVudCA9IGZ1bmN0aW9uIChzdGF0ZSwgZGF0YSkge1xuICAgICAgICAgICAgX3RoaXMuc2Vzc2lvbkxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gbGlzdGVuZXIoc3RhdGUsIGRhdGEpOyB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRXhvdGVsU2VydmljZS5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFFeG90ZWxTZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBFeG90ZWxTZXJ2aWNlLmluc3RhbmNlID0gbmV3IEV4b3RlbFNlcnZpY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXhvdGVsU2VydmljZS5pbnN0YW5jZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIEV4b3RlbCBTREtcbiAgICAgKiBAcGFyYW0gYWNjZXNzVG9rZW4gLSBUaGUgYWNjZXNzIHRva2VuIGZvciBhdXRoZW50aWNhdGlvblxuICAgICAqIEBwYXJhbSBhZ2VudFVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSBhZ2VudFxuICAgICAqIEBwYXJhbSBhdXRvQ29ubmVjdFZPSVAgLSBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgY29ubmVjdCBWT0lQIChkZWZhdWx0OiB0cnVlKVxuICAgICAqIEByZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzXG4gICAgICovXG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uIChhY2Nlc3NUb2tlbl8xLCBhZ2VudFVzZXJJZF8xKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgYXJndW1lbnRzLCB2b2lkIDAsIGZ1bmN0aW9uIChhY2Nlc3NUb2tlbiwgYWdlbnRVc2VySWQsIGF1dG9Db25uZWN0Vk9JUCkge1xuICAgICAgICAgICAgdmFyIHBob25lLCBlcnJvcl8xO1xuICAgICAgICAgICAgaWYgKGF1dG9Db25uZWN0Vk9JUCA9PT0gdm9pZCAwKSB7IGF1dG9Db25uZWN0Vk9JUCA9IHRydWU7IH1cbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNoZWNrQXVkaW9QZXJtaXNzaW9ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leG90ZWxTREsgPSBuZXcgRXhvdGVsQ1JNV2ViU0RLKGFjY2Vzc1Rva2VuLCBhZ2VudFVzZXJJZCwgYXV0b0Nvbm5lY3RWT0lQKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhvdGVsU0RLLkluaXRpYWxpemUodGhpcy5oYW5kbGVDYWxsRXZlbnQsIHRoaXMuaGFuZGxlUmVnaXN0ZXJFdmVudCwgdGhpcy5oYW5kbGVTZXNzaW9uRXZlbnQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmUgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYlBob25lID0gcGhvbmUgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCAhIXRoaXMud2ViUGhvbmVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgRXhvdGVsIFNESzonLCBlcnJvcl8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmYWxzZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmNoZWNrQXVkaW9QZXJtaXNzaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRldmljZXMsIGhhc0F1ZGlvRGV2aWNlLCBwZXJtaXNzaW9uU3RhdHVzXzEsIGVycm9yXzIsIGVycm9yXzM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCA2LCAsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F1ZGlvRGV2aWNlID0gZGV2aWNlcy5zb21lKGZ1bmN0aW9uIChkZXZpY2UpIHsgcmV0dXJuIGRldmljZS5raW5kID09PSAnYXVkaW9pbnB1dCc7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNBdWRpb0RldmljZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGF1ZGlvIGlucHV0IGRldmljZXMgZm91bmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25TdGF0dXMgPSAnZGVuaWVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZmFsc2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobmF2aWdhdG9yLnBlcm1pc3Npb25zICYmIG5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzIsIDQsICwgNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ21pY3JvcGhvbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvblN0YXR1c18xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uU3RhdHVzID0gcGVybWlzc2lvblN0YXR1c18xLnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvblN0YXR1c18xLm9uY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnBlcm1pc3Npb25TdGF0dXMgPSBwZXJtaXNzaW9uU3RhdHVzXzEuc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBlcm1pc3Npb25TdGF0dXNfMS5zdGF0ZSA9PT0gJ2dyYW50ZWQnXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHF1ZXJ5IHBlcm1pc3Npb24gc3RhdHVzOicsIGVycm9yXzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRydWVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY2hlY2tpbmcgYXVkaW8gcGVybWlzc2lvbnM6JywgZXJyb3JfMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZmFsc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5yZXF1ZXN0TWljcm9waG9uZUFjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHN0cmVhbSwgZXJyb3JfNDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgMiwgLCAzXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrKSB7IHJldHVybiB0cmFjay5zdG9wKCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uU3RhdHVzID0gJ2dyYW50ZWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRydWVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl80ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGdldCBtaWNyb3Bob25lIGFjY2VzczonLCBlcnJvcl80KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblN0YXR1cyA9ICdkZW5pZWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGZhbHNlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUubWFrZUNhbGwgPSBmdW5jdGlvbiAocGhvbmVOdW1iZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGlmICghX3RoaXMud2ViUGhvbmUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdXZWIgcGhvbmUgbm90IGluaXRpYWxpemVkJykpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLndlYlBob25lLk1ha2VDYWxsKHBob25lTnVtYmVyLCBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUuYWNjZXB0Q2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGdyYW50ZWQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMud2ViUGhvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYiBwaG9uZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMucGVybWlzc2lvblN0YXR1cyAhPT0gJ2dyYW50ZWQnKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlcXVlc3RNaWNyb3Bob25lQWNjZXNzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBncmFudGVkID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmFudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaWNyb3Bob25lIGFjY2VzcyBkZW5pZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJQaG9uZS5BY2NlcHRDYWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUuaGFuZ3VwQ2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLndlYlBob25lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuSGFuZ3VwQ2FsbCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVqZWN0IGFuIGluY29taW5nIGNhbGwgYmVmb3JlIGFjY2VwdGluZyBpdC5cbiAgICAgKiBOb3RlOiBFeG90ZWwgU0RLIG9ubHkgaGFzIEhhbmd1cENhbGwgLSBubyBzZXBhcmF0ZSBSZWplY3RDYWxsIG1ldGhvZC5cbiAgICAgKiBIYW5ndXBDYWxsIGludGVybmFsbHkgY2FsbHMgd2VicnRjU0lQUGhvbmUucmVqZWN0Q2FsbCgpIC0+IHBob25lLnNpcEhhbmdVcCgpXG4gICAgICovXG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUucmVqZWN0Q2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLndlYlBob25lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuSGFuZ3VwQ2FsbCgpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUudG9nZ2xlSG9sZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLndlYlBob25lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuVG9nZ2xlSG9sZCgpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUudG9nZ2xlTXV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLndlYlBob25lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuVG9nZ2xlTXV0ZSgpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUuc2VuZERUTUYgPSBmdW5jdGlvbiAoZGlnaXQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLndlYlBob25lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuU2VuZERUTUYoZGlnaXQpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUucmVnaXN0ZXJEZXZpY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBncmFudGVkO1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5wZXJtaXNzaW9uU3RhdHVzICE9PSAnZ3JhbnRlZCcpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYW50ZWQgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdyYW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pY3JvcGhvbmUgYWNjZXNzIGRlbmllZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLndlYlBob25lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuUmVnaXN0ZXJEZXZpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS51bnJlZ2lzdGVyRGV2aWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMud2ViUGhvbmUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5VblJlZ2lzdGVyRGV2aWNlKCk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5nZXRQZXJtaXNzaW9uU3RhdHVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uU3RhdHVzO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUuYWRkQ2FsbExpc3RlbmVyID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuY2FsbExpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUucmVtb3ZlQ2FsbExpc3RlbmVyID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuY2FsbExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUuYWRkUmVnaXN0ZXJMaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5yZW1vdmVSZWdpc3Rlckxpc3RlbmVyID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmFkZFNlc3Npb25MaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNlc3Npb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnJlbW92ZVNlc3Npb25MaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNlc3Npb25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIHJldHVybiBFeG90ZWxTZXJ2aWNlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEV4b3RlbFNlcnZpY2U7XG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBheGlvcyB9IGZyb20gJy4uLy4uL2NvbmZpZy9heGlvcyc7XG4vKipcbiAqIENoZWNrIGlmIFZvSVAgaXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgdGVuYW50IGJ5IGZldGNoaW5nIG5vdGlmaWNhdGlvbiBjb25maWcuXG4gKiBSZXR1cm5zIHRydWUgb25seSBpZjpcbiAqIC0gZW5hYmxlVm9pY2UgaXMgdHJ1ZVxuICogLSB2b2ljZUNvbmZpZ3MgaGFzIGF0IGxlYXN0IG9uZSBlbmFibGVkIGNvbmZpZ1xuICovXG5leHBvcnQgdmFyIGNoZWNrVm9JUEVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhLCBjb25maWcsIGVuYWJsZWRWb2ljZUNvbmZpZywgaGFzVmFsaWRUb2tlbiwgZXJyb3JfMTtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzAsIDIsICwgM10pO1xuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLmdldCgnL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9uLWNvbmZpZ3MnKV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfZC5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgY29uZmlnID0gZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhLmNvbmZpZztcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB2b2ljZSBpcyBlbmFibGVkIGF0IHRlbmFudCBsZXZlbFxuICAgICAgICAgICAgICAgIGlmICghKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5lbmFibGVWb2ljZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgZW5hYmxlZDogZmFsc2UsIGhhc1ZhbGlkVG9rZW46IGZhbHNlIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbmFibGVkVm9pY2VDb25maWcgPSAoX2EgPSBjb25maWcudm9pY2VDb25maWdzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmluZChmdW5jdGlvbiAodmMpIHsgcmV0dXJuIHZjLmlzRW5hYmxlZCA9PT0gdHJ1ZTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbmFibGVkVm9pY2VDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgZW5hYmxlZDogZmFsc2UsIGhhc1ZhbGlkVG9rZW46IGZhbHNlIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXNWYWxpZFRva2VuID0gISEoKChfYiA9IGVuYWJsZWRWb2ljZUNvbmZpZy5FWE9URUwpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi50b2tlbikgJiZcbiAgICAgICAgICAgICAgICAgICAgKChfYyA9IGVuYWJsZWRWb2ljZUNvbmZpZy5FWE9URUwpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50b2tlbkV4cGlyZXNBdCkgJiZcbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoZW5hYmxlZFZvaWNlQ29uZmlnLkVYT1RFTC50b2tlbkV4cGlyZXNBdCkgPiBuZXcgRGF0ZSgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBlbmFibGVkOiB0cnVlLCBoYXNWYWxpZFRva2VuOiBoYXNWYWxpZFRva2VuIH1dO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNoZWNrIFZvSVAgY29uZmlnOicsIGVycm9yXzEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IGVuYWJsZWQ6IGZhbHNlLCBoYXNWYWxpZFRva2VuOiBmYWxzZSB9XTtcbiAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogR2V0IHRoZSBhY3RpdmUgRXhvdGVsIHZvaWNlIHRva2VuIGZyb20gdGhlIGJhY2tlbmQuXG4gKiBUaGUgYmFja2VuZCBtYW5hZ2VzIGNyZWRlbnRpYWxzIHNlY3VyZWx5IGFuZCBhdXRvLXJlZnJlc2hlcyB0b2tlbnMuXG4gKi9cbmV4cG9ydCB2YXIgZ2V0QWN0aXZlVm9pY2VUb2tlbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGEsIGVycm9yXzI7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAyLCAsIDNdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5nZXQoJy9ub3RpZmljYXRpb25zL25vdGlmaWNhdGlvbi1jb25maWdzL3ZvaWNlLWNvbmZpZy9hY3RpdmUtdG9rZW4nKV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGVycm9yXzIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIEV4b3RlbCB0b2tlbjonLCBlcnJvcl8yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbnVsbF07XG4gICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBnZXRBY3RpdmVWb2ljZVRva2VuIGluc3RlYWQuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGJ1dCB3aWxsIGJlIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCB2YXIgY3JlYXRlRXhvdGVsQXBwVG9rZW4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB0b2tlbkRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGdldEFjdGl2ZVZvaWNlVG9rZW4oKV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgdG9rZW5EYXRhID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgIGlmICghdG9rZW5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYWN0aXZlIHZvaWNlIGNvbmZpZ3VyYXRpb24gZm91bmQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgRGF0YTogdG9rZW5EYXRhLnRva2VuIH1dO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogSW5pdGlhdGUgYW4gb3V0Ym91bmQgY2FsbCAtIGNyZWF0ZXMgY2FsbCBhY3Rpdml0eSByZWNvcmRcbiAqL1xuZXhwb3J0IHZhciBpbml0aWF0ZUNhbGxBY3Rpdml0eSA9IGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MucG9zdChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvaW5pdGlhdGVcIiwgaW5wdXQpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBSZWdpc3RlciBhbiBpbmNvbWluZyBjYWxsIC0gY3JlYXRlcyBjYWxsIGFjdGl2aXR5IHJlY29yZFxuICovXG5leHBvcnQgdmFyIHJlZ2lzdGVySW5jb21pbmdDYWxsID0gZnVuY3Rpb24gKGlucHV0KSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5wb3N0KFwiL2NvbW11bmljYXRpb24tYWN0aXZpdGllcy9yZWdpc3Rlci1pbmNvbWluZ1wiLCBpbnB1dCldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEZldGNoIGNhbGwgaGlzdG9yeSBmb3IgYSBwcm9zcGVjdFxuICovXG5leHBvcnQgdmFyIGZldGNoQ2FsbEhpc3RvcnkgPSBmdW5jdGlvbiAocHJvc3BlY3RJZCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MuZ2V0KFwiL2NvbW11bmljYXRpb24tYWN0aXZpdGllcy9ieS1wcm9zcGVjdFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBwcm9zcGVjdElkOiBwcm9zcGVjdElkIH0sXG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEdldCBjYWxsIGFjdGl2aXR5IGJ5IElEXG4gKi9cbmV4cG9ydCB2YXIgZ2V0Q2FsbEFjdGl2aXR5QnlJZCA9IGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MuZ2V0KFwiL2NvbW11bmljYXRpb24tYWN0aXZpdGllcy9cIi5jb25jYXQoaWQpKV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogR2V0IGNhbGwgYWN0aXZpdHkgYnkgQ2FsbFNpZFxuICovXG5leHBvcnQgdmFyIGdldENhbGxBY3Rpdml0eUJ5Q2FsbFNpZCA9IGZ1bmN0aW9uIChjYWxsU2lkKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5nZXQoXCIvY29tbXVuaWNhdGlvbi1hY3Rpdml0aWVzL2J5LWNhbGwtc2lkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IGNhbGxTaWQ6IGNhbGxTaWQgfSxcbiAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogR2V0IGNhbGwgY291bnQgZm9yIGEgcHJvc3BlY3RcbiAqL1xuZXhwb3J0IHZhciBnZXRDYWxsQ291bnRCeVByb3NwZWN0ID0gZnVuY3Rpb24gKHByb3NwZWN0SWQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLmdldChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvY291bnQtYnktcHJvc3BlY3RcIiwge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgcHJvc3BlY3RJZDogcHJvc3BlY3RJZCB9LFxuICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS5jb3VudCkgfHwgMF07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBTYXZlIGNhbGwgZGlzcG9zaXRpb25cbiAqL1xuZXhwb3J0IHZhciBzYXZlQ2FsbERpc3Bvc2l0aW9uID0gZnVuY3Rpb24gKGlucHV0KSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXF1ZXN0Qm9keSwgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uOiBpbnB1dC5jYWxsU3RhdHVzRGlzcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uQ2F0ZWdvcnk6IGlucHV0LmRpc3Bvc2l0aW9uQ2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgIHByb3NwZWN0U3RhdHVzOiBpbnB1dC5wcm9zcGVjdFN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb25Ob3RlczogaW5wdXQuZGlzcG9zaXRpb25Ob3RlcyxcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tTY2hlZHVsZWRBdDogaW5wdXQuY2FsbGJhY2tTY2hlZHVsZWRBdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLnBvc3QoXCIvY29tbXVuaWNhdGlvbi1hY3Rpdml0aWVzL1wiLmNvbmNhdChpbnB1dC5jYWxsSWQsIFwiL2Rpc3Bvc2l0aW9uXCIpLCByZXF1ZXN0Qm9keSldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIENhbmNlbC9kZWNsaW5lIGEgY2FsbCBiZWZvcmUgaXQgd2FzIGNvbm5lY3RlZFxuICogVXBkYXRlcyB0aGUgY2FsbCBhY3Rpdml0eSBzdGF0dXMgdG8gQ0FOQ0VMRURcbiAqL1xuZXhwb3J0IHZhciBjYW5jZWxDYWxsID0gZnVuY3Rpb24gKGlucHV0KSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5wb3N0KFwiL2NvbW11bmljYXRpb24tYWN0aXZpdGllcy9jYW5jZWxcIiwgaW5wdXQpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlLCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBFeG90ZWxTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2V4b3RlbC9FeG90ZWxTZXJ2aWNlJztcbmltcG9ydCB7IHJlZ2lzdGVySW5jb21pbmdDYWxsIH0gZnJvbSAnLi4vc2VydmljZXMvZXhvdGVsL2FwaSc7XG4vLyBHbG9iYWwgY29udGV4dCBrZXkgZm9yIGNyb3NzLW1vZHVsZS1mZWRlcmF0aW9uIHNoYXJpbmdcbnZhciBFWE9URUxfQ09OVEVYVF9LRVkgPSAnX19FWE9URUxfQ09OVEVYVF9fJztcbi8vIEdldCBvciBjcmVhdGUgYSBzaGFyZWQgY29udGV4dCBhY3Jvc3MgbW9kdWxlIGZlZGVyYXRpb24gYm91bmRhcmllc1xudmFyIGdldFNoYXJlZENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF3aW5kb3dbRVhPVEVMX0NPTlRFWFRfS0VZXSkge1xuICAgICAgICA7XG4gICAgICAgIHdpbmRvd1tFWE9URUxfQ09OVEVYVF9LRVldID0gY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gd2luZG93W0VYT1RFTF9DT05URVhUX0tFWV07XG59O1xudmFyIGluaXRpYWxDYWxsU3RhdGUgPSB7XG4gICAgcGhhc2U6ICdpZGxlJyxcbiAgICBjYWxsRGF0YTogbnVsbCxcbiAgICBpc09uSG9sZDogZmFsc2UsXG4gICAgaXNNdXRlZDogZmFsc2UsXG4gICAgaXNTcGVha2VyT2ZmOiBmYWxzZSxcbiAgICBjYWxsRGlyZWN0aW9uOiBudWxsLFxuICAgIGNhbGxTdGFydFRpbWU6IG51bGwsXG4gICAgY2FsbER1cmF0aW9uOiAwLFxuICAgIGNhbGxlck5hbWU6IG51bGwsXG4gICAgY2FsbGVyTnVtYmVyOiBudWxsLFxuICAgIGNhbGxBY3Rpdml0eUlkOiBudWxsLFxuICAgIGV4b3RlbENhbGxTaWQ6IG51bGwsXG4gICAgcHJvc3BlY3RVbmlxdWVJZDogbnVsbCxcbiAgICB3YXNBY2NlcHRlZDogZmFsc2UsXG59O1xuLyoqXG4gKiBNYXNrIG1vYmlsZSBudW1iZXIgZm9yIGRpc3BsYXkgKGZpcnN0IDIgYW5kIGxhc3QgMiBvZiBhY3R1YWwgbnVtYmVyIHZpc2libGUpXG4gKiBIYW5kbGVzIGNvdW50cnkgY29kZSBwcmVmaXggKCs5MSlcbiAqIGUuZy4sIFwiKzkxOTg3NjU0MzIxMFwiIC0+IFwiKzkxOTgqKioqKioxMFwiXG4gKiBlLmcuLCBcIjk4NzY1NDMyMTBcIiAtPiBcIjk4KioqKioqMTBcIlxuICovXG52YXIgbWFza01vYmlsZSA9IGZ1bmN0aW9uIChtb2JpbGUpIHtcbiAgICBpZiAoIW1vYmlsZSB8fCBtb2JpbGUubGVuZ3RoIDwgNClcbiAgICAgICAgcmV0dXJuICcqKioqKioqKioqJztcbiAgICAvLyBDaGVjayBmb3IgY291bnRyeSBjb2RlIHByZWZpeFxuICAgIHZhciBwcmVmaXggPSAnJztcbiAgICB2YXIgbnVtYmVyID0gbW9iaWxlO1xuICAgIGlmIChtb2JpbGUuc3RhcnRzV2l0aCgnKzkxJykpIHtcbiAgICAgICAgcHJlZml4ID0gJys5MSc7XG4gICAgICAgIG51bWJlciA9IG1vYmlsZS5zdWJzdHJpbmcoMyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG1vYmlsZS5zdGFydHNXaXRoKCc5MScpICYmIG1vYmlsZS5sZW5ndGggPiAxMCkge1xuICAgICAgICBwcmVmaXggPSAnOTEnO1xuICAgICAgICBudW1iZXIgPSBtb2JpbGUuc3Vic3RyaW5nKDIpO1xuICAgIH1cbiAgICB2YXIgY2xlYW5lZCA9IG51bWJlci5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgIGlmIChjbGVhbmVkLmxlbmd0aCA8IDQpXG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnKioqKioqKioqKic7XG4gICAgcmV0dXJuIHByZWZpeCArIGNsZWFuZWQuc3Vic3RyaW5nKDAsIDIpICsgJyonLnJlcGVhdChjbGVhbmVkLmxlbmd0aCAtIDQpICsgY2xlYW5lZC5zdWJzdHJpbmcoY2xlYW5lZC5sZW5ndGggLSAyKTtcbn07XG4vLyBVc2Ugc2hhcmVkIGNvbnRleHQgZm9yIGNyb3NzLW1vZHVsZS1mZWRlcmF0aW9uIGNvbXBhdGliaWxpdHlcbnZhciBFeG90ZWxDb250ZXh0ID0gZ2V0U2hhcmVkQ29udGV4dCgpO1xuZXhwb3J0IHZhciBFeG90ZWxQcm92aWRlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBhY2Nlc3NUb2tlbiA9IF9hLmFjY2Vzc1Rva2VuLCBhZ2VudFVzZXJJZCA9IF9hLmFnZW50VXNlcklkLCBfYiA9IF9hLmF1dG9Db25uZWN0Vk9JUCwgYXV0b0Nvbm5lY3RWT0lQID0gX2IgPT09IHZvaWQgMCA/IHRydWUgOiBfYiwgZGVmYXVsdENhbGxlck5hbWUgPSBfYS5jYWxsZXJOYW1lLCBkZWZhdWx0Q2FsbGVyTnVtYmVyID0gX2EuY2FsbGVyTnVtYmVyO1xuICAgIHZhciBfYyA9IHVzZVN0YXRlKGZhbHNlKSwgaXNJbml0aWFsaXplZCA9IF9jWzBdLCBzZXRJc0luaXRpYWxpemVkID0gX2NbMV07XG4gICAgdmFyIF9kID0gdXNlU3RhdGUoZmFsc2UpLCBpc0Nvbm5lY3RlZCA9IF9kWzBdLCBzZXRJc0Nvbm5lY3RlZCA9IF9kWzFdO1xuICAgIHZhciBfZSA9IHVzZVN0YXRlKCd1bmtub3duJyksIHBlcm1pc3Npb25TdGF0dXMgPSBfZVswXSwgc2V0UGVybWlzc2lvblN0YXR1cyA9IF9lWzFdO1xuICAgIHZhciBfZiA9IHVzZVN0YXRlKGluaXRpYWxDYWxsU3RhdGUpLCBjYWxsU3RhdGUgPSBfZlswXSwgc2V0Q2FsbFN0YXRlID0gX2ZbMV07XG4gICAgdmFyIF9nID0gdXNlU3RhdGUobnVsbCksIGRpc3Bvc2l0aW9uRGF0YSA9IF9nWzBdLCBzZXREaXNwb3NpdGlvbkRhdGEgPSBfZ1sxXTtcbiAgICB2YXIgdGltZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgdmFyIGNhbGxTdGF0ZVJlZiA9IHVzZVJlZihjYWxsU3RhdGUpO1xuICAgIHZhciBleG90ZWxTZXJ2aWNlID0gRXhvdGVsU2VydmljZS5nZXRJbnN0YW5jZSgpO1xuICAgIC8vIEtlZXAgcmVmIGluIHN5bmMgd2l0aCBzdGF0ZSBmb3IgdXNlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbFN0YXRlUmVmLmN1cnJlbnQgPSBjYWxsU3RhdGU7XG4gICAgfSwgW2NhbGxTdGF0ZV0pO1xuICAgIC8vIFRpbWVyIGZvciBjYWxsIGR1cmF0aW9uXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNhbGxTdGF0ZS5waGFzZSA9PT0gJ2Nvbm5lY3RlZCcgJiYgY2FsbFN0YXRlLmNhbGxTdGFydFRpbWUpIHtcbiAgICAgICAgICAgIHRpbWVyUmVmLmN1cnJlbnQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IGNhbGxEdXJhdGlvbjogTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIHByZXYuY2FsbFN0YXJ0VGltZSkgLyAxMDAwKSB9KSk7IH0pO1xuICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGltZXJSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgdGltZXJSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aW1lclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lclJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LCBbY2FsbFN0YXRlLnBoYXNlLCBjYWxsU3RhdGUuY2FsbFN0YXJ0VGltZV0pO1xuICAgIC8vIFJlcXVlc3QgbWljcm9waG9uZSBwZXJtaXNzaW9uIGJlZm9yZSBpbml0aWFsaXppbmdcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVxdWVzdFBlcm1pc3Npb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHN0cmVhbSwgZXJyb3JfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgMiwgLCAzXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrKSB7IHJldHVybiB0cmFjay5zdG9wKCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGVybWlzc2lvblN0YXR1cygnZ3JhbnRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ01pY3JvcGhvbmUgcGVybWlzc2lvbiBkZW5pZWQ6JywgZXJyb3JfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRQZXJtaXNzaW9uU3RhdHVzKCdkZW5pZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7IH07XG4gICAgICAgIGlmIChuYXZpZ2F0b3IucGVybWlzc2lvbnMgJiYgbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KSB7XG4gICAgICAgICAgICBuYXZpZ2F0b3IucGVybWlzc2lvbnNcbiAgICAgICAgICAgICAgICAucXVlcnkoeyBuYW1lOiAnbWljcm9waG9uZScgfSlcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgc2V0UGVybWlzc2lvblN0YXR1cyhzdGF0dXMuc3RhdGUpO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5vbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UGVybWlzc2lvblN0YXR1cyhzdGF0dXMuc3RhdGUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5zdGF0ZSA9PT0gJ3Byb21wdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBlcm1pc3Npb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBxdWVyeSBwZXJtaXNzaW9uIHN0YXR1czonLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBlcm1pc3Npb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVxdWVzdFBlcm1pc3Npb24oKTtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBTREtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWFjY2Vzc1Rva2VuIHx8ICFhZ2VudFVzZXJJZCB8fCBpc0luaXRpYWxpemVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgaW5pdGlhbGl6ZUV4b3RlbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3VjY2VzcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgZXhvdGVsU2VydmljZS5pbml0aWFsaXplKGFjY2Vzc1Rva2VuLCBhZ2VudFVzZXJJZCwgYXV0b0Nvbm5lY3RWT0lQKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luaXRpYWxpemVkKHN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTsgfTtcbiAgICAgICAgaW5pdGlhbGl6ZUV4b3RlbCgpO1xuICAgIH0sIFthY2Nlc3NUb2tlbiwgYWdlbnRVc2VySWQsIGF1dG9Db25uZWN0Vk9JUF0pO1xuICAgIC8vIFNldHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghaXNJbml0aWFsaXplZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGhhbmRsZUNhbGxFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgZGF0YSkge1xuICAgICAgICAgICAgc3dpdGNoIChldmVudCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2luY29taW5nJzoge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBjdXJyZW50IHN0YXRlIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGEgZ2VudWluZSBpbmNvbWluZyBjYWxsXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIGp1c3QgdGhlIGFnZW50IGNhbGxiYWNrIGZvciBhbiBvdXRib3VuZCBjbGljay10by1jYWxsXG4gICAgICAgICAgICAgICAgICAgIHZhciBpc091dGJvdW5kQ2FsbCA9IGNhbGxTdGF0ZVJlZi5jdXJyZW50LmNhbGxEaXJlY3Rpb24gPT09ICdvdXRib3VuZCc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc091dGJvdW5kQ2FsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG91dGJvdW5kIGNhbGxzIChjbGljay10by1jYWxsKSwgRXhvdGVsIGZpcnN0IGNhbGxzIHRoZSBhZ2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB0cmlnZ2VycyAnaW5jb21pbmcnIGV2ZW50IGJ1dCB3ZSBzaG91bGQgTk9UIG92ZXJ3cml0ZSB0aGUgb3V0Ym91bmQgY2FsbCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IGNhbGxEYXRhOiBkYXRhLCBpc09uSG9sZDogZmFsc2UsIGlzTXV0ZWQ6IGZhbHNlIH0pKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZ2VudWluZSBpbmNvbWluZyBjYWxsIC0gdXBkYXRlIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5jb21pbmdOdW1iZXJfMSA9IGRhdGEuY2FsbEZyb21OdW1iZXIgfHwgZGF0YS5yZW1vdGVJZCB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IHBoYXNlOiAnaW5jb21pbmcnLCBjYWxsRGF0YTogZGF0YSwgY2FsbERpcmVjdGlvbjogJ2luYm91bmQnLCBjYWxsZXJOYW1lOiBkYXRhLnJlbW90ZURpc3BsYXlOYW1lIHx8IG51bGwsIGNhbGxlck51bWJlcjogaW5jb21pbmdOdW1iZXJfMSA/IG1hc2tNb2JpbGUoaW5jb21pbmdOdW1iZXJfMSkgOiBudWxsLCBpc09uSG9sZDogZmFsc2UsIGlzTXV0ZWQ6IGZhbHNlIH0pKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciBpbmNvbWluZyBjYWxsIGluIHRoZSBiYWNrZW5kIGFuZCBnZXQgcHJvc3BlY3QgZGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbElkIHx8IGRhdGEuc2Vzc2lvbklkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJJbmNvbWluZ0NhbGwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU2lkOiBkYXRhLmNhbGxJZCB8fCBkYXRhLnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU51bWJlcjogZGF0YS5jYWxsRnJvbU51bWJlciB8fCBkYXRhLnJlbW90ZUlkIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b051bWJlcjogZGF0YS5yZW1vdGVEaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY2FsbCBzdGF0ZSB3aXRoIHByb3NwZWN0IGRldGFpbHMgYW5kIGNhbGwgYWN0aXZpdHkgSURcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3NwZWN0TW9iaWxlID0gKF9hID0gcmVzcG9uc2UucHJvc3BlY3QpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tb2JpbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBjYWxsQWN0aXZpdHlJZDogKChfYSA9IHJlc3BvbnNlLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZCkgfHwgcHJldi5jYWxsQWN0aXZpdHlJZCwgY2FsbGVyTmFtZTogKChfYiA9IHJlc3BvbnNlLnByb3NwZWN0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubmFtZSkgfHwgcHJldi5jYWxsZXJOYW1lLCBjYWxsZXJOdW1iZXI6IHByb3NwZWN0TW9iaWxlID8gbWFza01vYmlsZShwcm9zcGVjdE1vYmlsZSkgOiBwcmV2LmNhbGxlck51bWJlciwgcHJvc3BlY3RVbmlxdWVJZDogKChfYyA9IHJlc3BvbnNlLnByb3NwZWN0KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudW5pcXVlSWQpIHx8IHByZXYucHJvc3BlY3RVbmlxdWVJZCB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZWdpc3RlciBpbmNvbWluZyBjYWxsOicsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Nvbm5lY3RlZCc6XG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBwaGFzZTogJ2Nvbm5lY3RlZCcsIGNhbGxEYXRhOiBkYXRhLCBjYWxsU3RhcnRUaW1lOiBEYXRlLm5vdygpLCBjYWxsRHVyYXRpb246IDAgfSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2FsbEVuZGVkJzpcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBkaXNwb3NpdGlvbiBmb3JtIGlmOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gVXNlciBhY2NlcHRlZCB0aGUgY2FsbCAod2FzQWNjZXB0ZWQgPSB0cnVlKSwgT1JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIENhbGwgd2FzIGNvbm5lY3RlZCwgT1JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIENhbGwgaGFkIHNvbWUgZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIE5PVCBzaG93IGlmIHVzZXIgZGVjbGluZWQgYmVmb3JlIGFjY2VwdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNob3VsZFNob3dEaXNwb3NpdGlvbiA9IHByZXYud2FzQWNjZXB0ZWQgfHwgcHJldi5waGFzZSA9PT0gJ2Nvbm5lY3RlZCcgfHwgcHJldi5jYWxsRHVyYXRpb24gPiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dEaXNwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXNwb3NpdGlvbkRhdGFPYmogPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBkYXRhYmFzZSBjYWxsQWN0aXZpdHlJZCBmb3IgQVBJIGNhbGxzLCBmYWxsIGJhY2sgdG8gRXhvdGVsIGNhbGxJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSWQ6IHByZXYuY2FsbEFjdGl2aXR5SWQgfHwgZGF0YS5jYWxsSWQgfHwgKChfYSA9IHByZXYuY2FsbERhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsSWQpIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleG90ZWxDYWxsSWQ6IGRhdGEuY2FsbElkIHx8ICgoX2IgPSBwcmV2LmNhbGxEYXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbElkKSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbERpcmVjdGlvbjogcHJldi5jYWxsRGlyZWN0aW9uIHx8ICdvdXRib3VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxEdXJhdGlvbjogcHJldi5jYWxsRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlck5hbWU6IHByZXYuY2FsbGVyTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyTnVtYmVyOiBwcmV2LmNhbGxlck51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3Bvc2l0aW9uRGF0YShkaXNwb3NpdGlvbkRhdGFPYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBpbml0aWFsQ2FsbFN0YXRlKSwgeyBwaGFzZTogJ2VuZGVkJywgY2FsbERhdGE6IGRhdGEgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdob2xkdG9nZ2xlJzpcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IGlzT25Ib2xkOiAhcHJldi5pc09uSG9sZCwgY2FsbERhdGE6IGRhdGEgfSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbXV0ZXRvZ2dsZSc6XG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBpc011dGVkOiAhcHJldi5pc011dGVkLCBjYWxsRGF0YTogZGF0YSB9KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGhhbmRsZVJlZ2lzdGVyRXZlbnQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICAgIHNldElzQ29ubmVjdGVkKHN0YXRlID09PSAncmVnaXN0ZXJlZCcpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaGFuZGxlU2Vzc2lvbkV2ZW50ID0gZnVuY3Rpb24gKHN0YXRlLCBkYXRhKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgc2Vzc2lvbiBldmVudHMgaWYgbmVlZGVkXG4gICAgICAgIH07XG4gICAgICAgIGV4b3RlbFNlcnZpY2UuYWRkQ2FsbExpc3RlbmVyKGhhbmRsZUNhbGxFdmVudCk7XG4gICAgICAgIGV4b3RlbFNlcnZpY2UuYWRkUmVnaXN0ZXJMaXN0ZW5lcihoYW5kbGVSZWdpc3RlckV2ZW50KTtcbiAgICAgICAgZXhvdGVsU2VydmljZS5hZGRTZXNzaW9uTGlzdGVuZXIoaGFuZGxlU2Vzc2lvbkV2ZW50KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4b3RlbFNlcnZpY2UucmVtb3ZlQ2FsbExpc3RlbmVyKGhhbmRsZUNhbGxFdmVudCk7XG4gICAgICAgICAgICBleG90ZWxTZXJ2aWNlLnJlbW92ZVJlZ2lzdGVyTGlzdGVuZXIoaGFuZGxlUmVnaXN0ZXJFdmVudCk7XG4gICAgICAgICAgICBleG90ZWxTZXJ2aWNlLnJlbW92ZVNlc3Npb25MaXN0ZW5lcihoYW5kbGVTZXNzaW9uRXZlbnQpO1xuICAgICAgICB9O1xuICAgIH0sIFtpc0luaXRpYWxpemVkXSk7XG4gICAgLy8gVXBkYXRlIHBlcm1pc3Npb24gc3RhdHVzIHdoZW4gaXQgY2hhbmdlcyBpbiB0aGUgc2VydmljZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBzZXRQZXJtaXNzaW9uU3RhdHVzKGV4b3RlbFNlcnZpY2UuZ2V0UGVybWlzc2lvblN0YXR1cygpKTtcbiAgICAgICAgfVxuICAgIH0sIFtpc0luaXRpYWxpemVkXSk7XG4gICAgdmFyIG1ha2VDYWxsID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKHBob25lTnVtYmVyLCBjYWxsZXJOYW1lLCBjYWxsQWN0aXZpdHlJZCwgbWFza2VkTnVtYmVyKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzcG9uc2UsIGVycm9yXzI7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHN0YXRlIC0gcmVhZHkgdG8gY2FsbCAoYWdlbnQgbmVlZHMgdG8gYWNjZXB0IGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgbWFza2VkIG51bWJlciBmb3IgZGlzcGxheSwgYWN0dWFsIG51bWJlciBmb3IgdGhlIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IHBoYXNlOiAncmVhZHlfdG9fY2FsbCcsIGNhbGxEaXJlY3Rpb246ICdvdXRib3VuZCcsIGNhbGxlck5hbWU6IGNhbGxlck5hbWUgfHwgZGVmYXVsdENhbGxlck5hbWUgfHwgbnVsbCwgY2FsbGVyTnVtYmVyOiBtYXNrZWROdW1iZXIgfHwgcGhvbmVOdW1iZXIsIGNhbGxBY3Rpdml0eUlkOiBjYWxsQWN0aXZpdHlJZCB8fCBudWxsLCBpc09uSG9sZDogZmFsc2UsIGlzTXV0ZWQ6IGZhbHNlLCBjYWxsU3RhcnRUaW1lOiBudWxsLCBjYWxsRHVyYXRpb246IDAgfSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZXhvdGVsU2VydmljZS5tYWtlQ2FsbChwaG9uZU51bWJlcildOyAvLyBVc2UgYWN0dWFsIG51bWJlciBmb3IgY2FsbGluZ1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCkgLy8gVXNlIGFjdHVhbCBudW1iZXIgZm9yIGNhbGxpbmdcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzcG9uc2VdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JfMiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgU0RLIGNhbGwgZmFpbHMgKDR4eC81eHggZXJyb3JzIGZyb20gRXhvdGVsIEFQSSksIHJlc2V0IHN0YXRlIHRvIGlkbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gcmV0cnkgdGhlIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGluaXRpYWxDYWxsU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBSZS10aHJvdyB0aGUgZXJyb3Igc28gQ2FsbEJ1dHRvbiBjYW4gaGFuZGxlIGl0XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yXzI7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pOyB9LCBbZGVmYXVsdENhbGxlck5hbWVdKTtcbiAgICB2YXIgYWNjZXB0Q2FsbCA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGV4b3RlbFNlcnZpY2UuYWNjZXB0Q2FsbCgpXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBvdXRib3VuZCBjYWxscywgYWNjZXB0aW5nIG1lYW5zIHdlJ3JlIG5vdyBjYWxsaW5nIHRoZSBsZWFkXG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgd2FzQWNjZXB0ZWQgPSB0cnVlIHNvIHdlIGtub3cgdG8gc2hvdyBkaXNwb3NpdGlvbiBmb3JtIG9uIGVuZFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBvdXRib3VuZCBjYWxscywgYWNjZXB0aW5nIG1lYW5zIHdlJ3JlIG5vdyBjYWxsaW5nIHRoZSBsZWFkXG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgd2FzQWNjZXB0ZWQgPSB0cnVlIHNvIHdlIGtub3cgdG8gc2hvdyBkaXNwb3NpdGlvbiBmb3JtIG9uIGVuZFxuICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2LmNhbGxEaXJlY3Rpb24gPT09ICdvdXRib3VuZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IHBoYXNlOiAnY2FsbGluZycsIHdhc0FjY2VwdGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGluYm91bmQgY2FsbHMsIGFsc28gbWFyayBhcyBhY2NlcHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyB3YXNBY2NlcHRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7IH0sIFtdKTtcbiAgICB2YXIgaGFuZ3VwQ2FsbCA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhvdGVsU2VydmljZS5oYW5ndXBDYWxsKCk7XG4gICAgfSwgW10pO1xuICAgIHZhciB0b2dnbGVTcGVha2VyID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgaXNTcGVha2VyT2ZmOiAhcHJldi5pc1NwZWFrZXJPZmYgfSkpOyB9KTtcbiAgICAgICAgLy8gTm90ZTogQWN0dWFsIHNwZWFrZXIgdG9nZ2xlIHdvdWxkIG5lZWQgV2ViUlRDIGF1ZGlvIG91dHB1dCBkZXZpY2Ugc3dpdGNoaW5nXG4gICAgfSwgW10pO1xuICAgIHZhciBjbGVhckRpc3Bvc2l0aW9uID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXREaXNwb3NpdGlvbkRhdGEobnVsbCk7XG4gICAgICAgIHNldENhbGxTdGF0ZShpbml0aWFsQ2FsbFN0YXRlKTtcbiAgICB9LCBbXSk7XG4gICAgLy8gVXBkYXRlIGNhbGxBY3Rpdml0eUlkIGFmdGVyIGNyZWF0aW5nIHRoZSByZWNvcmQgKGZvciBvdXRib3VuZCBjYWxscylcbiAgICB2YXIgc2V0Q2FsbEFjdGl2aXR5SWRGbiA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjYWxsQWN0aXZpdHlJZCkge1xuICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgY2FsbEFjdGl2aXR5SWQ6IGNhbGxBY3Rpdml0eUlkIH0pKTsgfSk7XG4gICAgfSwgW10pO1xuICAgIC8vIFVwZGF0ZSBleG90ZWxDYWxsU2lkIGZyb20gU0RLIHJlc3BvbnNlIChmb3Igb3V0Ym91bmQgY2FsbHMpXG4gICAgdmFyIHNldEV4b3RlbENhbGxTaWRGbiA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjYWxsU2lkKSB7XG4gICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBleG90ZWxDYWxsU2lkOiBjYWxsU2lkIH0pKTsgfSk7XG4gICAgfSwgW10pO1xuICAgIHZhciB2YWx1ZSA9IHtcbiAgICAgICAgaXNJbml0aWFsaXplZDogaXNJbml0aWFsaXplZCxcbiAgICAgICAgaXNDb25uZWN0ZWQ6IGlzQ29ubmVjdGVkLFxuICAgICAgICBjYWxsU3RhdGU6IGNhbGxTdGF0ZSxcbiAgICAgICAgcGVybWlzc2lvblN0YXR1czogcGVybWlzc2lvblN0YXR1cyxcbiAgICAgICAgZGlzcG9zaXRpb25EYXRhOiBkaXNwb3NpdGlvbkRhdGEsXG4gICAgICAgIG1ha2VDYWxsOiBtYWtlQ2FsbCxcbiAgICAgICAgYWNjZXB0Q2FsbDogYWNjZXB0Q2FsbCxcbiAgICAgICAgaGFuZ3VwQ2FsbDogaGFuZ3VwQ2FsbCxcbiAgICAgICAgcmVqZWN0Q2FsbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZXhvdGVsU2VydmljZS5yZWplY3RDYWxsKCk7IH0sXG4gICAgICAgIHRvZ2dsZUhvbGQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV4b3RlbFNlcnZpY2UudG9nZ2xlSG9sZCgpOyB9LFxuICAgICAgICB0b2dnbGVNdXRlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBleG90ZWxTZXJ2aWNlLnRvZ2dsZU11dGUoKTsgfSxcbiAgICAgICAgdG9nZ2xlU3BlYWtlcjogdG9nZ2xlU3BlYWtlcixcbiAgICAgICAgc2VuZERUTUY6IGZ1bmN0aW9uIChkaWdpdCkgeyByZXR1cm4gZXhvdGVsU2VydmljZS5zZW5kRFRNRihkaWdpdCk7IH0sXG4gICAgICAgIHJlZ2lzdGVyRGV2aWNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBleG90ZWxTZXJ2aWNlLnJlZ2lzdGVyRGV2aWNlKCk7IH0sXG4gICAgICAgIHVucmVnaXN0ZXJEZXZpY2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV4b3RlbFNlcnZpY2UudW5yZWdpc3RlckRldmljZSgpOyB9LFxuICAgICAgICByZXF1ZXN0TWljcm9waG9uZUFjY2VzczogZnVuY3Rpb24gKCkgeyByZXR1cm4gZXhvdGVsU2VydmljZS5yZXF1ZXN0TWljcm9waG9uZUFjY2VzcygpOyB9LFxuICAgICAgICBjbGVhckRpc3Bvc2l0aW9uOiBjbGVhckRpc3Bvc2l0aW9uLFxuICAgICAgICBzZXRDYWxsQWN0aXZpdHlJZDogc2V0Q2FsbEFjdGl2aXR5SWRGbixcbiAgICAgICAgc2V0RXhvdGVsQ2FsbFNpZDogc2V0RXhvdGVsQ2FsbFNpZEZuLFxuICAgIH07XG4gICAgcmV0dXJuIChfanN4KEV4b3RlbENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHZhbHVlLCBjaGlsZHJlbjogY2hpbGRyZW4gfSkpO1xufTtcbmV4cG9ydCB2YXIgdXNlRXhvdGVsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb250ZXh0ID0gdXNlQ29udGV4dChFeG90ZWxDb250ZXh0KTtcbiAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlRXhvdGVsIG11c3QgYmUgdXNlZCB3aXRoaW4gYW4gRXhvdGVsUHJvdmlkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59O1xuLyoqXG4gKiBTYWZlIHZlcnNpb24gb2YgdXNlRXhvdGVsIHRoYXQgcmV0dXJucyBudWxsIHdoZW4gb3V0c2lkZSB0aGUgcHJvdmlkZXJcbiAqIFVzZSB0aGlzIGluIGNvbXBvbmVudHMgdGhhdCBtYXkgcmVuZGVyIG91dHNpZGUgb2YgRXhvdGVsUHJvdmlkZXJcbiAqL1xuZXhwb3J0IHZhciB1c2VFeG90ZWxTYWZlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb250ZXh0ID0gdXNlQ29udGV4dChFeG90ZWxDb250ZXh0KTtcbiAgICByZXR1cm4gY29udGV4dCAhPT0gbnVsbCAmJiBjb250ZXh0ICE9PSB2b2lkIDAgPyBjb250ZXh0IDogbnVsbDtcbn07XG4iLCJleHBvcnQgdmFyIEVYT1RFTF9DT05TVEFOVFMgPSB7XG4gICAgTU9EQUxfWl9JTkRFWDogOTk5OTk5LFxuICAgIE1PREFMX0JBQ0tEUk9QX1pfSU5ERVg6IDk5OTk5OCxcbiAgICBNT0RBTF9CT1JERVJfUkFESVVTOiAnMTZweCcsXG4gICAgREVDTElORV9USU1FT1VUX01TOiAyMDAwLFxuICAgIFRJTUVSX0lOVEVSVkFMX01TOiAxMDAwLFxufTtcbiIsImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBCdXR0b24sIERpYWxvZywgUmFkaW9Hcm91cCwgU2luZ2xlU2VsZWN0LCBUZXh0YXJlYSwgVHlwb2dyYXBoeSwgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTXV0YXRpb24sIHVzZVF1ZXJ5Q2xpZW50IH0gZnJvbSAncmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZm9ybWF0RHVyYXRpb25WZXJib3NlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXhvdGVsL2Zvcm1hdHRlcnMnO1xudmFyIENBTExfU1RBVFVTX09QVElPTlMgPSBbXG4gICAgeyBsYWJlbDogJ0Nvbm5lY3RlZCcsIHZhbHVlOiAnY29ubmVjdGVkJyB9LFxuICAgIHsgbGFiZWw6ICdOb3QgQ29ubmVjdGVkJywgdmFsdWU6ICdub3RfY29ubmVjdGVkJyB9LFxuXTtcbnZhciBDT05ORUNURURfRElTUE9TSVRJT05TID0gW1xuICAgIHsgbGFiZWw6ICdJbnRlcmVzdGVkJywgdmFsdWU6ICdpbnRlcmVzdGVkJyB9LFxuICAgIHsgbGFiZWw6ICdOb3QgSW50ZXJlc3RlZCcsIHZhbHVlOiAnbm90X2ludGVyZXN0ZWQnIH0sXG4gICAgeyBsYWJlbDogJ05vdCBTdXJlJywgdmFsdWU6ICdub3Rfc3VyZScgfSxcbiAgICB7IGxhYmVsOiAnTm90IEVsaWdpYmxlJywgdmFsdWU6ICdub3RfZWxpZ2libGUnIH0sXG4gICAgeyBsYWJlbDogJ1dyb25nIE51bWJlcicsIHZhbHVlOiAnd3JvbmdfbnVtYmVyJyB9LFxuICAgIHsgbGFiZWw6ICdDYW1wdXMgVmlzaXQnLCB2YWx1ZTogJ2NhbXB1c192aXNpdCcgfSxcbiAgICB7IGxhYmVsOiAnQ2FsbCBCYWNrJywgdmFsdWU6ICdjYWxsX2JhY2snIH0sXG4gICAgeyBsYWJlbDogJ0FmdGVyIEpFRSBNYWlucycsIHZhbHVlOiAnYWZ0ZXJfamVlX21haW5zJyB9LFxuICAgIHsgbGFiZWw6ICdBZnRlciBJUEUnLCB2YWx1ZTogJ2FmdGVyX2lwZScgfSxcbiAgICB7IGxhYmVsOiAnQWZ0ZXIgRUFQQ0VUJywgdmFsdWU6ICdhZnRlcl9lYXBjZXQnIH0sXG5dO1xudmFyIE5PVF9DT05ORUNURURfRElTUE9TSVRJT05TID0gW1xuICAgIHsgbGFiZWw6ICdOb3QgQW5zd2VyaW5nJywgdmFsdWU6ICdub3RfYW5zd2VyaW5nJyB9LFxuICAgIHsgbGFiZWw6ICdOb3QgQ29ubmVjdGVkJywgdmFsdWU6ICdub3RfY29ubmVjdGVkJyB9LFxuICAgIHsgbGFiZWw6ICdGYWlsIHRvIENhbGwnLCB2YWx1ZTogJ2ZhaWxfdG9fY2FsbCcgfSxcbiAgICB7IGxhYmVsOiAnU3dpdGNoZWQgT2ZmJywgdmFsdWU6ICdzd2l0Y2hlZF9vZmYnIH0sXG4gICAgeyBsYWJlbDogJ091dCBvZiBTZXJ2aWNlJywgdmFsdWU6ICdvdXRfb2Zfc2VydmljZScgfSxcbiAgICB7IGxhYmVsOiAnSW52YWxpZCBOdW1iZXInLCB2YWx1ZTogJ2ludmFsaWRfbnVtYmVyJyB9LFxuICAgIHsgbGFiZWw6ICdOdW1iZXIgQnVzeScsIHZhbHVlOiAnbnVtYmVyX2J1c3knIH0sXG5dO1xudmFyIENhbGxEaXNwb3NpdGlvbkZvcm0gPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgZGlzcG9zaXRpb25EYXRhID0gX2EuZGlzcG9zaXRpb25EYXRhLCBwcm9zcGVjdElkID0gX2EucHJvc3BlY3RJZCwgb25DbG9zZSA9IF9hLm9uQ2xvc2UsIG9uU2F2ZSA9IF9hLm9uU2F2ZSwgZXhpc3RpbmdEYXRhID0gX2EuZXhpc3RpbmdEYXRhO1xuICAgIHZhciBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG4gICAgdmFyIGlzRWRpdE1vZGUgPSAhIShleGlzdGluZ0RhdGEgPT09IG51bGwgfHwgZXhpc3RpbmdEYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleGlzdGluZ0RhdGEuZGlzcG9zaXRpb25DYXRlZ29yeSk7XG4gICAgLy8gU2ltcGxlIHN0YXRlIG1hbmFnZW1lbnRcbiAgICB2YXIgX2IgPSB1c2VTdGF0ZSgoZXhpc3RpbmdEYXRhID09PSBudWxsIHx8IGV4aXN0aW5nRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhpc3RpbmdEYXRhLmNhbGxTdGF0dXNEaXNwb3NpdGlvbikgfHwgJycpLCBjYWxsU3RhdHVzID0gX2JbMF0sIHNldENhbGxTdGF0dXMgPSBfYlsxXTtcbiAgICB2YXIgX2MgPSB1c2VTdGF0ZSgoZXhpc3RpbmdEYXRhID09PSBudWxsIHx8IGV4aXN0aW5nRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhpc3RpbmdEYXRhLmRpc3Bvc2l0aW9uQ2F0ZWdvcnkpIHx8ICcnKSwgZGlzcG9zaXRpb25DYXRlZ29yeSA9IF9jWzBdLCBzZXREaXNwb3NpdGlvbkNhdGVnb3J5ID0gX2NbMV07XG4gICAgdmFyIF9kID0gdXNlU3RhdGUoKGV4aXN0aW5nRGF0YSA9PT0gbnVsbCB8fCBleGlzdGluZ0RhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4aXN0aW5nRGF0YS5kaXNwb3NpdGlvbk5vdGVzKSB8fCAnJyksIHJlbWFya3MgPSBfZFswXSwgc2V0UmVtYXJrcyA9IF9kWzFdO1xuICAgIHZhciBfZSA9IHVzZU11dGF0aW9uKGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBvblNhdmUoZGF0YSk7IH0sIHtcbiAgICAgICAgb25TdWNjZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcygnZ2V0T25lUHJvc3BlY3QnKTtcbiAgICAgICAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKCdjYWxsSGlzdG9yeScpO1xuICAgICAgICAgICAgb25DbG9zZSgpO1xuICAgICAgICB9LFxuICAgIH0pLCBtdXRhdGUgPSBfZS5tdXRhdGUsIGlzTG9hZGluZyA9IF9lLmlzTG9hZGluZztcbiAgICB2YXIgaGFuZGxlQ2FsbFN0YXR1c0NoYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBzZXRDYWxsU3RhdHVzKHZhbHVlKTtcbiAgICAgICAgLy8gUmVzZXQgZGlzcG9zaXRpb24gd2hlbiBjYWxsIHN0YXR1cyBjaGFuZ2VzXG4gICAgICAgIHNldERpc3Bvc2l0aW9uQ2F0ZWdvcnkoJycpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZURpc3Bvc2l0aW9uQ2hhbmdlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHNldERpc3Bvc2l0aW9uQ2F0ZWdvcnkodmFsdWUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZVN1Ym1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFjYWxsU3RhdHVzIHx8ICFkaXNwb3NpdGlvbkNhdGVnb3J5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN1Ym1pdERhdGEgPSB7XG4gICAgICAgICAgICBwcm9zcGVjdElkOiBwcm9zcGVjdElkLFxuICAgICAgICAgICAgY2FsbElkOiBkaXNwb3NpdGlvbkRhdGEuY2FsbElkLFxuICAgICAgICAgICAgY2hhbm5lbDogJ3Bob25lJyxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogZGlzcG9zaXRpb25EYXRhLmNhbGxEaXJlY3Rpb24sXG4gICAgICAgICAgICBkdXJhdGlvbjogZGlzcG9zaXRpb25EYXRhLmNhbGxEdXJhdGlvbixcbiAgICAgICAgICAgIGNhbGxTdGF0dXNEaXNwb3NpdGlvbjogY2FsbFN0YXR1cyxcbiAgICAgICAgICAgIGRpc3Bvc2l0aW9uQ2F0ZWdvcnk6IGRpc3Bvc2l0aW9uQ2F0ZWdvcnksXG4gICAgICAgICAgICByZW1hcmtzOiByZW1hcmtzIHx8ICcnLFxuICAgICAgICAgICAgY2FsbGVyTmFtZTogZGlzcG9zaXRpb25EYXRhLmNhbGxlck5hbWUgfHwgJycsXG4gICAgICAgICAgICBjYWxsZXJOdW1iZXI6IGRpc3Bvc2l0aW9uRGF0YS5jYWxsZXJOdW1iZXIgfHwgJycsXG4gICAgICAgIH07XG4gICAgICAgIG11dGF0ZShzdWJtaXREYXRhKTtcbiAgICB9O1xuICAgIHZhciBkaXNwb3NpdGlvbk9wdGlvbnMgPSBjYWxsU3RhdHVzID09PSAnY29ubmVjdGVkJ1xuICAgICAgICA/IENPTk5FQ1RFRF9ESVNQT1NJVElPTlNcbiAgICAgICAgOiBjYWxsU3RhdHVzID09PSAnbm90X2Nvbm5lY3RlZCdcbiAgICAgICAgICAgID8gTk9UX0NPTk5FQ1RFRF9ESVNQT1NJVElPTlNcbiAgICAgICAgICAgIDogW107XG4gICAgcmV0dXJuIChfanN4KERpYWxvZywgeyBvcGVuOiB0cnVlLCBvbkNsb3NlOiBvbkNsb3NlLCB0aXRsZTogaXNFZGl0TW9kZSA/ICdFZGl0IERpc3Bvc2l0aW9uJyA6ICdDYWxsIERpc3Bvc2l0aW9uJywgbWF4V2lkdGg6IFwibWRcIiwgY29udGVudDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggZmxleC1jb2wgZ2FwLTQgcC00XCIsIGNoaWxkcmVuOiBbX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwibXV0ZWRcIiwgY2hpbGRyZW46IGlzRWRpdE1vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ1VwZGF0ZSB0aGUgZGlzcG9zaXRpb24gZGV0YWlscydcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJBZGQgZGV0YWlscyBhYm91dCB5b3VyIGNhbGwgd2l0aCBcIi5jb25jYXQoZGlzcG9zaXRpb25EYXRhLmNhbGxlck5hbWUgfHwgJ1Vua25vd24nKSB9KSwgX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHAtMyBiZy1ncmF5LTEwMCByb3VuZGVkLWxnXCIsIGNoaWxkcmVuOiBbX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwic21hbGxcIiwgY2xhc3NOYW1lOiBcInRleHQtZ3JheS02MDBcIiwgY2hpbGRyZW46IFwiQ2FsbCBEdXJhdGlvblwiIH0pLCBfanN4KFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJzbWFsbFwiLCBjbGFzc05hbWU6IFwiZm9udC1zZW1pYm9sZFwiLCBjaGlsZHJlbjogZm9ybWF0RHVyYXRpb25WZXJib3NlKGRpc3Bvc2l0aW9uRGF0YS5jYWxsRHVyYXRpb24pIH0pXSB9KSwgX2pzeChSYWRpb0dyb3VwLCB7IG5hbWU6IFwiY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uXCIsIGxhYmVsOiBcIkNhbGwgU3RhdHVzXCIsIHJlcXVpcmVkOiB0cnVlLCBvcHRpb25zOiBDQUxMX1NUQVRVU19PUFRJT05TLCBkaXJlY3Rpb246IFwicm93XCIsIHZhbHVlOiBjYWxsU3RhdHVzLCBvbkNoYW5nZTogaGFuZGxlQ2FsbFN0YXR1c0NoYW5nZSB9KSwgY2FsbFN0YXR1cyAmJiAoX2pzeChTaW5nbGVTZWxlY3QsIHsgbmFtZTogXCJkaXNwb3NpdGlvbkNhdGVnb3J5XCIsIGxhYmVsOiBcIkNhbGwgRGlzcG9zaXRpb25cIiwgcmVxdWlyZWQ6IHRydWUsIGZ1bGxXaWR0aDogdHJ1ZSwgcGxhY2Vob2xkZXI6IFwiU2VhcmNoIGRpc3Bvc2l0aW9uLi4uXCIsIG9wdGlvbnM6IGRpc3Bvc2l0aW9uT3B0aW9ucywgdmFsdWU6IGRpc3Bvc2l0aW9uQ2F0ZWdvcnksIG9uQ2hhbmdlOiBoYW5kbGVEaXNwb3NpdGlvbkNoYW5nZSB9LCBjYWxsU3RhdHVzKSksIF9qc3goVGV4dGFyZWEsIHsgbmFtZTogXCJyZW1hcmtzXCIsIGxhYmVsOiBcIlJlbWFya3NcIiwgcGxhY2Vob2xkZXI6IFwiQWRkIGFueSBhZGRpdGlvbmFsIG5vdGVzIGFib3V0IHRoaXMgY2FsbC4uLlwiLCByb3dzOiAzLCBmdWxsV2lkdGg6IHRydWUsIHZhbHVlOiByZW1hcmtzLCBvbkNoYW5nZTogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHNldFJlbWFya3MoZS50YXJnZXQudmFsdWUpOyB9LCBjbGFzc05hbWU6IFwiYnJlYWstYWxsXCIgfSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXgganVzdGlmeS1zdGFydCBnYXAtMiBwdC00IGJvcmRlci10XCIsIGNoaWxkcmVuOiBbX2pzeChCdXR0b24sIHsgb25DbGljazogaGFuZGxlU3VibWl0LCBkaXNhYmxlZDogIWNhbGxTdGF0dXMgfHwgIWRpc3Bvc2l0aW9uQ2F0ZWdvcnksIGxvYWRpbmc6IGlzTG9hZGluZywgY2hpbGRyZW46IGlzRWRpdE1vZGUgPyAnVXBkYXRlIERpc3Bvc2l0aW9uJyA6ICdTYXZlIERpc3Bvc2l0aW9uJyB9KSwgX2pzeChCdXR0b24sIHsgdmFyaWFudDogXCJvdXRsaW5lXCIsIG9uQ2xpY2s6IG9uQ2xvc2UsIGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pXSB9KV0gfSkpOyB9IH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBDYWxsRGlzcG9zaXRpb25Gb3JtO1xuIiwiLyoqXG4gKiBGb3JtYXQgZHVyYXRpb24gaW4gTU06U1MgZm9ybWF0IChlLmcuLCBcIjAyOjMwXCIpXG4gKi9cbmV4cG9ydCB2YXIgZm9ybWF0RHVyYXRpb25UaW1lciA9IGZ1bmN0aW9uIChzZWNvbmRzKSB7XG4gICAgdmFyIG1pbnMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgdmFyIHNlY3MgPSBzZWNvbmRzICUgNjA7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KG1pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLCBcIjpcIikuY29uY2F0KHNlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpKTtcbn07XG4vKipcbiAqIEZvcm1hdCBkdXJhdGlvbiBpbiB2ZXJib3NlIGZvcm1hdCAoZS5nLiwgXCIybSAzMHNcIilcbiAqL1xuZXhwb3J0IHZhciBmb3JtYXREdXJhdGlvblZlcmJvc2UgPSBmdW5jdGlvbiAoc2Vjb25kcykge1xuICAgIHZhciBtaW5zID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIHZhciBzZWNzID0gc2Vjb25kcyAlIDYwO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChtaW5zLCBcIm0gXCIpLmNvbmNhdChzZWNzLCBcInNcIik7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzLCBGcmFnbWVudCBhcyBfRnJhZ21lbnQgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEJ1dHRvbiwgVHlwb2dyYXBoeSB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgTWljLCBNaWNPZmYsIFBhdXNlLCBQaG9uZSwgUGhvbmVJbmNvbWluZywgUGhvbmVPZmYsIFBob25lT3V0Z29pbmcsIFBsYXksIFZvbHVtZTIsIFZvbHVtZVgsIFggfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IEVYT1RFTF9DT05TVEFOVFMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZXhvdGVsLmNvbnN0YW50cyc7XG5pbXBvcnQgeyB1c2VFeG90ZWwgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvRXhvdGVsUHJvdmlkZXInO1xuaW1wb3J0IHsgY2FuY2VsQ2FsbCwgc2F2ZUNhbGxEaXNwb3NpdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4b3RlbC9hcGknO1xuaW1wb3J0IHsgZm9ybWF0RHVyYXRpb25UaW1lciB9IGZyb20gJy4uLy4uL3V0aWxzL2V4b3RlbC9mb3JtYXR0ZXJzJztcbmltcG9ydCBDYWxsRGlzcG9zaXRpb25Gb3JtIGZyb20gJy4vQ2FsbERpc3Bvc2l0aW9uRm9ybSc7XG4vLyBDU1MgZm9yIHB1bHNpbmcgYW5pbWF0aW9uXG52YXIgcHVsc2VBbmltYXRpb25TdHlsZSA9IFwiXFxuQGtleWZyYW1lcyBwdWxzZS1yaW5nIHtcXG4gIDAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgb3BhY2l0eTogMTtcXG4gIH1cXG4gIDUwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xNSk7XFxuICAgIG9wYWNpdHk6IDAuNztcXG4gIH1cXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICBvcGFjaXR5OiAxO1xcbiAgfVxcbn1cXG5cXG5Aa2V5ZnJhbWVzIHB1bHNlLWRvdCB7XFxuICAwJSwgMTAwJSB7XFxuICAgIGJveC1zaGFkb3c6IDAgMCAwIDAgcmdiYSgyNDksIDExNSwgMjIsIDAuNyk7XFxuICB9XFxuICA1MCUge1xcbiAgICBib3gtc2hhZG93OiAwIDAgMCAyMHB4IHJnYmEoMjQ5LCAxMTUsIDIyLCAwKTtcXG4gIH1cXG59XFxuXFxuLmFuaW1hdGUtcHVsc2UtcmluZyB7XFxuICBhbmltYXRpb246IHB1bHNlLXJpbmcgMS41cyBlYXNlLWluLW91dCBpbmZpbml0ZTtcXG59XFxuXFxuLmFuaW1hdGUtcHVsc2UtZG90IHtcXG4gIGFuaW1hdGlvbjogcHVsc2UtZG90IDEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XFxufVxcblwiO1xudmFyIEV4b3RlbFBob25lID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcHJvc3BlY3RJZCA9IF9hLnByb3NwZWN0SWQsIHByb3NwZWN0TmFtZSA9IF9hLnByb3NwZWN0TmFtZSwgcHJvc3BlY3ROdW1iZXIgPSBfYS5wcm9zcGVjdE51bWJlciwgb25TYXZlRGlzcG9zaXRpb24gPSBfYS5vblNhdmVEaXNwb3NpdGlvbjtcbiAgICB2YXIgX2IgPSB1c2VFeG90ZWwoKSwgY2FsbFN0YXRlID0gX2IuY2FsbFN0YXRlLCBkaXNwb3NpdGlvbkRhdGEgPSBfYi5kaXNwb3NpdGlvbkRhdGEsIGFjY2VwdENhbGwgPSBfYi5hY2NlcHRDYWxsLCBoYW5ndXBDYWxsID0gX2IuaGFuZ3VwQ2FsbCwgcmVqZWN0Q2FsbCA9IF9iLnJlamVjdENhbGwsIHRvZ2dsZUhvbGQgPSBfYi50b2dnbGVIb2xkLCB0b2dnbGVNdXRlID0gX2IudG9nZ2xlTXV0ZSwgdG9nZ2xlU3BlYWtlciA9IF9iLnRvZ2dsZVNwZWFrZXIsIGNsZWFyRGlzcG9zaXRpb24gPSBfYi5jbGVhckRpc3Bvc2l0aW9uO1xuICAgIHZhciBfYyA9IHVzZVN0YXRlKGZhbHNlKSwgaXNBY2NlcHRpbmcgPSBfY1swXSwgc2V0SXNBY2NlcHRpbmcgPSBfY1sxXTtcbiAgICB2YXIgX2QgPSB1c2VTdGF0ZShmYWxzZSksIGlzRGVjbGluaW5nID0gX2RbMF0sIHNldElzRGVjbGluaW5nID0gX2RbMV07XG4gICAgdmFyIGRlY2xpbmVUaW1lb3V0UmVmID0gdXNlUmVmKG51bGwpO1xuICAgIC8vIEluamVjdCBhbmltYXRpb24gc3R5bGVzXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0eWxlSWQgPSAnZXhvdGVsLXBob25lLWFuaW1hdGlvbnMnO1xuICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0eWxlSWQpKSB7XG4gICAgICAgICAgICB2YXIgc3R5bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICBzdHlsZUVsLmlkID0gc3R5bGVJZDtcbiAgICAgICAgICAgIHN0eWxlRWwudGV4dENvbnRlbnQgPSBwdWxzZUFuaW1hdGlvblN0eWxlO1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsKTtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICB2YXIgcGhhc2UgPSBjYWxsU3RhdGUucGhhc2UsIGNhbGxEYXRhID0gY2FsbFN0YXRlLmNhbGxEYXRhLCBpc09uSG9sZCA9IGNhbGxTdGF0ZS5pc09uSG9sZCwgaXNNdXRlZCA9IGNhbGxTdGF0ZS5pc011dGVkLCBpc1NwZWFrZXJPZmYgPSBjYWxsU3RhdGUuaXNTcGVha2VyT2ZmLCBjYWxsRGlyZWN0aW9uID0gY2FsbFN0YXRlLmNhbGxEaXJlY3Rpb24sIGNhbGxEdXJhdGlvbiA9IGNhbGxTdGF0ZS5jYWxsRHVyYXRpb24sIHNka0NhbGxlck5hbWUgPSBjYWxsU3RhdGUuY2FsbGVyTmFtZSwgc2RrQ2FsbGVyTnVtYmVyID0gY2FsbFN0YXRlLmNhbGxlck51bWJlciwgY2FsbEFjdGl2aXR5SWQgPSBjYWxsU3RhdGUuY2FsbEFjdGl2aXR5SWQsIGV4b3RlbENhbGxTaWQgPSBjYWxsU3RhdGUuZXhvdGVsQ2FsbFNpZCwgcHJvc3BlY3RVbmlxdWVJZCA9IGNhbGxTdGF0ZS5wcm9zcGVjdFVuaXF1ZUlkO1xuICAgIC8vIFVzZSBwcm9wcyAoZnJvbSBQcm9zcGVjdCB2aWV3KSBhcyBwcmltYXJ5LCBmYWxsIGJhY2sgdG8gU0RLIHZhbHVlcyAoZm9yIGluY29taW5nIGNhbGxzKVxuICAgIHZhciBkaXNwbGF5TmFtZSA9IHByb3NwZWN0TmFtZSB8fCBzZGtDYWxsZXJOYW1lIHx8ICdVbmtub3duJztcbiAgICB2YXIgZGlzcGxheU51bWJlciA9IHByb3NwZWN0TnVtYmVyIHx8IHNka0NhbGxlck51bWJlciB8fCAnTm8gbnVtYmVyJztcbiAgICB2YXIgaGFuZGxlQWNjZXB0Q2FsbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlcnJvcl8xO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBzZXRJc0FjY2VwdGluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCA0LCA1XSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGFjY2VwdENhbGwoKV07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQWNjZXB0IGNhbGwgZXJyb3I6JywgZXJyb3JfMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNBY2NlcHRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTsgfTtcbiAgICB2YXIgaGFuZGxlRGVjbGluZUNhbGwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2FsbFNpZEZvckFwaSwgcmVhc29uLCBlcnJvcl8yO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBzZXRJc0RlY2xpbmluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHJlamVjdENhbGwgZm9yIGluY29taW5nL3JlYWR5X3RvX2NhbGwgKGJlZm9yZSBhY2NlcHRpbmcpXG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBoYW5ndXBDYWxsIGZvciBjb25uZWN0ZWQvY2FsbGluZyAoYWZ0ZXIgYWNjZXB0aW5nKVxuICAgICAgICAgICAgICAgICAgICBpZiAocGhhc2UgPT09ICdpbmNvbWluZycgfHwgcGhhc2UgPT09ICdyZWFkeV90b19jYWxsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0Q2FsbCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ3VwQ2FsbCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhbGxTaWRGb3JBcGkgPSBleG90ZWxDYWxsU2lkIHx8IGNhbGxBY3Rpdml0eUlkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbGxTaWRGb3JBcGkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICByZWFzb24gPSBwaGFzZSA9PT0gJ2Nvbm5lY3RlZCcgPyAnZW5kZWQnIDogJ2RlY2xpbmVkJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgY2FuY2VsQ2FsbCh7IGNhbGxTaWQ6IGNhbGxTaWRGb3JBcGksIHJlYXNvbjogcmVhc29uIH0pXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBlcnJvcl8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY2FuY2VsIGNhbGwgaW4gYmFja2VuZDonLCBlcnJvcl8yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2FsbCB3YXNuJ3QgY29ubmVjdGVkIHlldCwgU0RLIG1pZ2h0IG5vdCBmaXJlICdjYWxsRW5kZWQnIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBhIHRpbWVvdXQgdG8gZm9yY2UgcmVzZXQgdGhlIGRlY2xpbmluZyBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBEb24ndCBjbGVhciBkaXNwb3NpdGlvbiBoZXJlIC0gbGV0IHRoZSBTREsncyBjYWxsRW5kZWQgZXZlbnQgaGFuZGxlIGl0XG4gICAgICAgICAgICAgICAgICAgIGRlY2xpbmVUaW1lb3V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVjbGluaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgRVhPVEVMX0NPTlNUQU5UUy5ERUNMSU5FX1RJTUVPVVRfTVMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pOyB9O1xuICAgIC8vIENsZWFyIGRlY2xpbmUgdGltZW91dCB3aGVuIHBoYXNlIGNoYW5nZXMgKG1lYW5pbmcgU0RLIGhhbmRsZWQgaXQpXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHBoYXNlID09PSAnaWRsZScgfHwgcGhhc2UgPT09ICdlbmRlZCcpIHtcbiAgICAgICAgICAgIGlmIChkZWNsaW5lVGltZW91dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlY2xpbmVUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGRlY2xpbmVUaW1lb3V0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0SXNEZWNsaW5pbmcoZmFsc2UpO1xuICAgICAgICAgICAgLy8gTm90ZTogRG9uJ3QgYXV0by1jbGVhciBkaXNwb3NpdGlvbiBoZXJlIC0gbGV0IHVzZXIgc3VibWl0IG9yIGNsb3NlIHRoZSBmb3JtIG1hbnVhbGx5XG4gICAgICAgIH1cbiAgICB9LCBbcGhhc2VdKTtcbiAgICAvLyBIYW5kbGUgc2F2aW5nIGRpc3Bvc2l0aW9uIHRvIGJhY2tlbmRcbiAgICB2YXIgaGFuZGxlU2F2ZURpc3Bvc2l0aW9uID0gZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIC8vIElmIGN1c3RvbSBoYW5kbGVyIGlzIHByb3ZpZGVkLCB1c2UgaXRcbiAgICAgICAgICAgIGlmIChvblNhdmVEaXNwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBvblNhdmVEaXNwb3NpdGlvbihkYXRhKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBVc2UgdGhlIGNhbGxTdGF0dXNEaXNwb3NpdGlvbiBmcm9tIHRoZSBmb3JtICh1c2VyIHNlbGVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHNhdmVDYWxsRGlzcG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBjYWxsSWQ6IGRhdGEuY2FsbElkLFxuICAgICAgICAgICAgICAgICAgICBwcm9zcGVjdElkOiBkYXRhLnByb3NwZWN0SWQgfHwgcHJvc3BlY3RJZCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uOiBkYXRhLmNhbGxTdGF0dXNEaXNwb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb25DYXRlZ29yeTogZGF0YS5kaXNwb3NpdGlvbkNhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvbk5vdGVzOiBkYXRhLnJlbWFya3MgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgfSk7XG4gICAgfSk7IH07XG4gICAgLy8gQ2xlYW51cCB0aW1lb3V0IG9uIHVubW91bnRcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGRlY2xpbmVUaW1lb3V0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVjbGluZVRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuICAgIC8vIFNob3cgZGlzcG9zaXRpb24gZm9ybSBhZnRlciBjYWxsIGVuZHNcbiAgICBpZiAoZGlzcG9zaXRpb25EYXRhKSB7XG4gICAgICAgIC8vIFVzZSBwcm9zcGVjdCBuYW1lIGZyb20gcHJvcHMsIG9yIGZyb20gZGlzcG9zaXRpb25EYXRhIChwcmVzZXJ2ZWQgZnJvbSBjYWxsKSwgb3IgZmFsbGJhY2tcbiAgICAgICAgdmFyIGZpbmFsQ2FsbGVyTmFtZSA9IHByb3NwZWN0TmFtZSB8fCBkaXNwb3NpdGlvbkRhdGEuY2FsbGVyTmFtZSB8fCBzZGtDYWxsZXJOYW1lIHx8ICdVbmtub3duJztcbiAgICAgICAgLy8gT3ZlcnJpZGUgZGlzcG9zaXRpb24gZGF0YSB3aXRoIHByb3NwZWN0IGRldGFpbHNcbiAgICAgICAgdmFyIGVucmljaGVkRGlzcG9zaXRpb25EYXRhID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGRpc3Bvc2l0aW9uRGF0YSksIHsgY2FsbGVyTmFtZTogZmluYWxDYWxsZXJOYW1lLCBjYWxsZXJOdW1iZXI6IGRpc3BsYXlOdW1iZXIgfSk7XG4gICAgICAgIHJldHVybiAoX2pzeChDYWxsRGlzcG9zaXRpb25Gb3JtLCB7IGRpc3Bvc2l0aW9uRGF0YTogZW5yaWNoZWREaXNwb3NpdGlvbkRhdGEsIHByb3NwZWN0SWQ6IHByb3NwZWN0SWQsIG9uQ2xvc2U6IGNsZWFyRGlzcG9zaXRpb24sIG9uU2F2ZTogaGFuZGxlU2F2ZURpc3Bvc2l0aW9uLCBleGlzdGluZ0RhdGE6IHVuZGVmaW5lZCB9KSk7XG4gICAgfVxuICAgIC8vIERvbid0IHNob3cgYW55dGhpbmcgaWYgaWRsZSBvciBlbmRlZFxuICAgIGlmIChwaGFzZSA9PT0gJ2lkbGUnIHx8IHBoYXNlID09PSAnZW5kZWQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgaXNPdXRib3VuZCA9IGNhbGxEaXJlY3Rpb24gPT09ICdvdXRib3VuZCc7XG4gICAgdmFyIGlzSW5ib3VuZCA9IGNhbGxEaXJlY3Rpb24gPT09ICdpbmJvdW5kJztcbiAgICAvLyBHZXQgYXZhdGFyIGNvbG9yIGJhc2VkIG9uIGNhbGwgZGlyZWN0aW9uXG4gICAgdmFyIGF2YXRhckJnQ29sb3IgPSBwaGFzZSA9PT0gJ2Nvbm5lY3RlZCdcbiAgICAgICAgPyAnYmctZ3JlZW4tNTAwJ1xuICAgICAgICA6IGlzT3V0Ym91bmRcbiAgICAgICAgICAgID8gJ2JnLWJsdWUtNTAwJ1xuICAgICAgICAgICAgOiAnYmctb3JhbmdlLTUwMCc7XG4gICAgLy8gR2V0IHN0YXR1cyB0ZXh0XG4gICAgdmFyIGdldFN0YXR1c1RleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN3aXRjaCAocGhhc2UpIHtcbiAgICAgICAgICAgIGNhc2UgJ3JlYWR5X3RvX2NhbGwnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnUmVhZHkgdG8gY2FsbC4uLic7XG4gICAgICAgICAgICBjYXNlICdjYWxsaW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0NhbGxpbmcuLi4nO1xuICAgICAgICAgICAgY2FzZSAnaW5jb21pbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnSW5jb21pbmcgY2FsbC4uLic7XG4gICAgICAgICAgICBjYXNlICdjb25uZWN0ZWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBXaWxsIHNob3cgdGltZXIgaW5zdGVhZFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gR2V0IGNvbm5lY3RpbmcgdGV4dCBmb3IgY2FsbGluZyBzdGF0ZVxuICAgIHZhciBnZXRDb25uZWN0aW5nVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHBoYXNlID09PSAnY2FsbGluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBcIkNvbm5lY3RpbmcgdG8gXCIuY29uY2F0KGRpc3BsYXlOYW1lLCBcIi4uLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHZhciBtb2RhbENvbnRlbnQgPSAoX2pzeHMoX0ZyYWdtZW50LCB7IGNoaWxkcmVuOiBbX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmaXhlZCBpbnNldC0wIGJnLWJsYWNrLzUwXCIsIHN0eWxlOiB7IHpJbmRleDogRVhPVEVMX0NPTlNUQU5UUy5NT0RBTF9CQUNLRFJPUF9aX0lOREVYIH0sIG9uQ2xpY2s6IGhhbmRsZURlY2xpbmVDYWxsIH0pLCBfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZpeGVkIGluc2V0LTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcC00IFwiLmNvbmNhdChjbGFzc05hbWUpLCBzdHlsZTogeyB6SW5kZXg6IEVYT1RFTF9DT05TVEFOVFMuTU9EQUxfWl9JTkRFWCB9LCBjaGlsZHJlbjogX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwicmVsYXRpdmUgdy1mdWxsIG1heC13LW1kIHAtNiBiZy13aGl0ZSBzaGFkb3ctMnhsXCIsIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IEVYT1RFTF9DT05TVEFOVFMuTU9EQUxfQk9SREVSX1JBRElVUyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjZTVlN2ViJyxcbiAgICAgICAgICAgICAgICAgICAgfSwgb25DbGljazogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7IH0sIGNoaWxkcmVuOiBbX2pzeChcImJ1dHRvblwiLCB7IG9uQ2xpY2s6IGhhbmRsZURlY2xpbmVDYWxsLCBjbGFzc05hbWU6IFwiYWJzb2x1dGUgcC0xIHRyYW5zaXRpb24tY29sb3JzIHJvdW5kZWQtZnVsbCB0b3AtNCByaWdodC00IGhvdmVyOmJnLWdyYXktMTAwXCIsIGNoaWxkcmVuOiBfanN4KFgsIHsgY2xhc3NOYW1lOiBcInctNSBoLTUgdGV4dC1ncmF5LTUwMFwiIH0pIH0pLCBfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXgganVzdGlmeS1jZW50ZXIgbWItNlwiLCBjaGlsZHJlbjogX2pzeHMoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBcImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHB4LTMgcHktMSByb3VuZGVkLWZ1bGwgdGV4dC1zbSBmb250LW1lZGl1bSBib3JkZXIgXCIuY29uY2F0KGlzT3V0Ym91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RleHQtYmx1ZS02MDAgYm9yZGVyLWJsdWUtMjAwIGJnLWJsdWUtNTAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0ZXh0LWdyZWVuLTYwMCBib3JkZXItZ3JlZW4tMjAwIGJnLWdyZWVuLTUwJyksIGNoaWxkcmVuOiBbaXNPdXRib3VuZCA/IChfanN4KFBob25lT3V0Z29pbmcsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSkgOiAoX2pzeChQaG9uZUluY29taW5nLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSkpLCBpc091dGJvdW5kID8gJ091dGdvaW5nIENhbGwnIDogJ0luY29taW5nIENhbGwnXSB9KSB9KSwgX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGp1c3RpZnktY2VudGVyIG1iLTRcIiwgY2hpbGRyZW46IF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwidy0yNCBoLTI0IHJvdW5kZWQtZnVsbCBcIi5jb25jYXQoYXZhdGFyQmdDb2xvciwgXCIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgXCIpLmNvbmNhdChwaGFzZSA9PT0gJ2luY29taW5nJyB8fCBwaGFzZSA9PT0gJ3JlYWR5X3RvX2NhbGwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdhbmltYXRlLXB1bHNlLXJpbmcgYW5pbWF0ZS1wdWxzZS1kb3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnKSwgY2hpbGRyZW46IGlzSW5ib3VuZCAmJiBwaGFzZSA9PT0gJ2luY29taW5nJyA/IChfanN4KFBob25lSW5jb21pbmcsIHsgY2xhc3NOYW1lOiBcInctMTAgaC0xMCB0ZXh0LXdoaXRlXCIgfSkpIDogKF9qc3goUGhvbmUsIHsgY2xhc3NOYW1lOiBcInctMTAgaC0xMCB0ZXh0LXdoaXRlXCIgfSkpIH0pIH0pLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJtYi00IHRleHQtY2VudGVyXCIsIGNoaWxkcmVuOiBbX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwiaDNcIiwgY2xhc3NOYW1lOiBcInRleHQteGwgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwXCIsIGNoaWxkcmVuOiBkaXNwbGF5TmFtZSB9KSwgcHJvc3BlY3RVbmlxdWVJZCAmJiAoX2pzeHMoVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcInNtYWxsXCIsIGNsYXNzTmFtZTogXCJmb250LW1lZGl1bSB0ZXh0LWJsdWUtNjAwXCIsIGNoaWxkcmVuOiBbXCJJRDogXCIsIHByb3NwZWN0VW5pcXVlSWRdIH0pKSwgX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwibXV0ZWRcIiwgY2hpbGRyZW46IGRpc3BsYXlOdW1iZXIgfSldIH0pLCBfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcIm1iLTYgdGV4dC1jZW50ZXJcIiwgY2hpbGRyZW46IHBoYXNlID09PSAnY29ubmVjdGVkJyA/IChfanN4KFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJwXCIsIGNsYXNzTmFtZTogXCJ0ZXh0LWxnIGZvbnQtbWVkaXVtIHRleHQtZ3JlZW4tNTAwXCIsIGNoaWxkcmVuOiBmb3JtYXREdXJhdGlvblRpbWVyKGNhbGxEdXJhdGlvbikgfSkpIDogKF9qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcIm11dGVkXCIsIGNoaWxkcmVuOiBnZXRTdGF0dXNUZXh0KCkgfSkpIH0pLCBwaGFzZSA9PT0gJ2Nvbm5lY3RlZCcgJiYgKF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXgganVzdGlmeS1jZW50ZXIgZ2FwLTYgbWItNlwiLCBjaGlsZHJlbjogW19qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInRleHQtY2VudGVyXCIsIGNoaWxkcmVuOiBbX2pzeChcImJ1dHRvblwiLCB7IG9uQ2xpY2s6IHRvZ2dsZU11dGUsIGNsYXNzTmFtZTogXCJ3LTEyIGgtMTIgcm91bmRlZC1mdWxsIGJvcmRlci0yIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRyYW5zaXRpb24tY29sb3JzIFwiLmNvbmNhdChpc011dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdiZy1ncmF5LTIwMCBib3JkZXItZ3JheS0zMDAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdiZy13aGl0ZSBib3JkZXItZ3JheS0yMDAgaG92ZXI6YmctZ3JheS01MCcpLCBjaGlsZHJlbjogaXNNdXRlZCA/IChfanN4KE1pY09mZiwgeyBjbGFzc05hbWU6IFwidy01IGgtNSB0ZXh0LWdyYXktNjAwXCIgfSkpIDogKF9qc3goTWljLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS02MDBcIiB9KSkgfSksIF9qc3goXCJwXCIsIHsgY2xhc3NOYW1lOiBcIm10LTEgdGV4dC14cyB0ZXh0LWdyYXktNTAwXCIsIGNoaWxkcmVuOiBpc011dGVkID8gJ1VubXV0ZScgOiAnTXV0ZScgfSldIH0pLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LWNlbnRlclwiLCBjaGlsZHJlbjogW19qc3goXCJidXR0b25cIiwgeyBvbkNsaWNrOiB0b2dnbGVIb2xkLCBjbGFzc05hbWU6IFwidy0xMiBoLTEyIHJvdW5kZWQtZnVsbCBib3JkZXItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0cmFuc2l0aW9uLWNvbG9ycyBcIi5jb25jYXQoaXNPbkhvbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JnLWdyYXktMjAwIGJvcmRlci1ncmF5LTMwMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JnLXdoaXRlIGJvcmRlci1ncmF5LTIwMCBob3ZlcjpiZy1ncmF5LTUwJyksIGNoaWxkcmVuOiBpc09uSG9sZCA/IChfanN4KFBsYXksIHsgY2xhc3NOYW1lOiBcInctNSBoLTUgdGV4dC1ncmF5LTYwMFwiIH0pKSA6IChfanN4KFBhdXNlLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS02MDBcIiB9KSkgfSksIF9qc3goXCJwXCIsIHsgY2xhc3NOYW1lOiBcIm10LTEgdGV4dC14cyB0ZXh0LWdyYXktNTAwXCIsIGNoaWxkcmVuOiBpc09uSG9sZCA/ICdSZXN1bWUnIDogJ0hvbGQnIH0pXSB9KSwgX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwidGV4dC1jZW50ZXJcIiwgY2hpbGRyZW46IFtfanN4KFwiYnV0dG9uXCIsIHsgb25DbGljazogdG9nZ2xlU3BlYWtlciwgY2xhc3NOYW1lOiBcInctMTIgaC0xMiByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMgXCIuY29uY2F0KGlzU3BlYWtlck9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYmctZ3JheS0yMDAgYm9yZGVyLWdyYXktMzAwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnYmctd2hpdGUgYm9yZGVyLWdyYXktMjAwIGhvdmVyOmJnLWdyYXktNTAnKSwgY2hpbGRyZW46IGlzU3BlYWtlck9mZiA/IChfanN4KFZvbHVtZVgsIHsgY2xhc3NOYW1lOiBcInctNSBoLTUgdGV4dC1ncmF5LTYwMFwiIH0pKSA6IChfanN4KFZvbHVtZTIsIHsgY2xhc3NOYW1lOiBcInctNSBoLTUgdGV4dC1ncmF5LTYwMFwiIH0pKSB9KSwgX2pzeChcInBcIiwgeyBjbGFzc05hbWU6IFwibXQtMSB0ZXh0LXhzIHRleHQtZ3JheS01MDBcIiwgY2hpbGRyZW46IGlzU3BlYWtlck9mZiA/ICdTcGVha2VyIE9uJyA6ICdTcGVha2VyIE9mZicgfSldIH0pXSB9KSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXgganVzdGlmeS1jZW50ZXIgZ2FwLTRcIiwgY2hpbGRyZW46IFsocGhhc2UgPT09ICdyZWFkeV90b19jYWxsJyB8fCBwaGFzZSA9PT0gJ2luY29taW5nJykgJiYgKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3hzKEJ1dHRvbiwgeyB2YXJpYW50OiBcImRlc3RydWN0aXZlXCIsIG9uQ2xpY2s6IGhhbmRsZURlY2xpbmVDYWxsLCBkaXNhYmxlZDogaXNEZWNsaW5pbmcsIGNsYXNzTmFtZTogXCJnYXAtMiBweC02XCIsIGNoaWxkcmVuOiBbX2pzeChQaG9uZU9mZiwgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pLCBpc0RlY2xpbmluZyA/ICdEZWNsaW5pbmcuLi4nIDogJ0RlY2xpbmUnXSB9KSwgX2pzeHMoQnV0dG9uLCB7IHZhcmlhbnQ6IFwiZGVmYXVsdFwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRDYWxsLCBkaXNhYmxlZDogaXNBY2NlcHRpbmcgfHwgaXNEZWNsaW5pbmcsIHN0eWxlOiB7IGJhY2tncm91bmRDb2xvcjogJyMyMmM1NWUnIH0sIGNsYXNzTmFtZTogXCJnYXAtMiBweC02IGhvdmVyOmJnLWdyZWVuLTYwMFwiLCBjaGlsZHJlbjogW19qc3goUGhvbmUsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSwgXCJBY2NlcHRcIl0gfSldIH0pKSwgcGhhc2UgPT09ICdjYWxsaW5nJyAmJiAoX2pzeHMoQnV0dG9uLCB7IHZhcmlhbnQ6IFwiZGVzdHJ1Y3RpdmVcIiwgb25DbGljazogaGFuZGxlRGVjbGluZUNhbGwsIGRpc2FibGVkOiBpc0RlY2xpbmluZywgY2xhc3NOYW1lOiBcImdhcC0yIHB4LTZcIiwgY2hpbGRyZW46IFtfanN4KFBob25lT2ZmLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSksIGlzRGVjbGluaW5nID8gJ0VuZGluZy4uLicgOiAnRW5kIENhbGwnXSB9KSksIHBoYXNlID09PSAnY29ubmVjdGVkJyAmJiAoX2pzeHMoQnV0dG9uLCB7IHZhcmlhbnQ6IFwiZGVzdHJ1Y3RpdmVcIiwgb25DbGljazogaGFuZGxlRGVjbGluZUNhbGwsIGRpc2FibGVkOiBpc0RlY2xpbmluZywgY2xhc3NOYW1lOiBcImdhcC0yIHB4LThcIiwgY2hpbGRyZW46IFtfanN4KFBob25lT2ZmLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSksIGlzRGVjbGluaW5nID8gJ0VuZGluZy4uLicgOiAnRW5kIENhbGwnXSB9KSldIH0pLCBnZXRDb25uZWN0aW5nVGV4dCgpICYmIChfanN4KFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJzbWFsbFwiLCBjbGFzc05hbWU6IFwibXQtNCB0ZXh0LWNlbnRlciB0ZXh0LWdyYXktNTAwXCIsIGNoaWxkcmVuOiBnZXRDb25uZWN0aW5nVGV4dCgpIH0pKV0gfSkgfSldIH0pKTtcbiAgICAvLyBVc2UgcG9ydGFsIHRvIHJlbmRlciBhdCBkb2N1bWVudCBib2R5IGxldmVsIHRvIGVzY2FwZSBhbnkgcGFyZW50IHN0YWNraW5nIGNvbnRleHRzXG4gICAgcmV0dXJuIGNyZWF0ZVBvcnRhbChtb2RhbENvbnRlbnQsIGRvY3VtZW50LmJvZHkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IEV4b3RlbFBob25lO1xuIiwiaW1wb3J0IHsgc3luY1NjcnlwdCB9IGZyb20gJ3NjcnlwdC1qcyc7XG52YXIgQ3J5cHRvU2VydmljZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDcnlwdG9TZXJ2aWNlKCkge1xuICAgICAgICB0aGlzLmFsZ29yaXRobSA9ICdhZXMtMjU2LWNiYyc7XG4gICAgICAgIHRoaXMuc2VjcmV0S2V5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICAvLyBMYXp5IGluaXRpYWxpemF0aW9uIC0gZG9uJ3QgcnVuIGhlYXZ5IGNyeXB0byBvcGVyYXRpb25zIGF0IG1vZHVsZSBsb2FkIHRpbWVcbiAgICB9XG4gICAgQ3J5cHRvU2VydmljZS5wcm90b3R5cGUuZW5zdXJlSW5pdGlhbGl6ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGtleSA9ICc0MzFmZWY5OS00N2RjLTRkMmEtOTE3NS0yZThmMTliMjAyMjUnO1xuICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgIC8vIFNhbWUgYXMgYmFja2VuZDogY3J5cHRvLnNjcnlwdFN5bmMoa2V5LCAnc2FsdCcsIDMyKVxuICAgICAgICAgICAgICAgIC8vIHNjcnlwdC1qcyB3aXRoIE49MTYzODQsIHI9OCwgcD0xIG1hdGNoZXMgTm9kZS5qcyBkZWZhdWx0c1xuICAgICAgICAgICAgICAgIHZhciBrZXlCdWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5KTtcbiAgICAgICAgICAgICAgICB2YXIgc2FsdEJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgnc2FsdCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VjcmV0S2V5ID0gc3luY1NjcnlwdChrZXlCdWZmZXIsIHNhbHRCdWZmZXIsIDE2Mzg0LCA4LCAxLCAzMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyeXB0b1NlcnZpY2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOyAvLyBQcmV2ZW50IHJlcGVhdGVkIGF0dGVtcHRzXG4gICAgICAgIH1cbiAgICB9O1xuICAgIENyeXB0b1NlcnZpY2UuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghQ3J5cHRvU2VydmljZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgQ3J5cHRvU2VydmljZS5pbnN0YW5jZSA9IG5ldyBDcnlwdG9TZXJ2aWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENyeXB0b1NlcnZpY2UuaW5zdGFuY2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZWNyeXB0IGRhdGEgdXNpbmcgQUVTLTI1Ni1DQkMgKHNhbWUgYXMgYmFja2VuZClcbiAgICAgKiBGb3JtYXQ6IFwiaXZfaGV4OmVuY3J5cHRlZF9oZXhcIlxuICAgICAqL1xuICAgIENyeXB0b1NlcnZpY2UucHJvdG90eXBlLmRlY3J5cHREYXRhID0gZnVuY3Rpb24gKGVuY3J5cHRlZERhdGEpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgICAgICBpZiAoIWVuY3J5cHRlZERhdGEgfHwgIXRoaXMuc2VjcmV0S2V5KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdNaXNzaW5nIGVuY3J5cHRlZCBkYXRhIG9yIHNlY3JldCBrZXknKTtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIF9hID0gZW5jcnlwdGVkRGF0YS5zcGxpdCgnOicpLCBpdkhleCA9IF9hWzBdLCBlbmNyeXB0ZWQgPSBfYVsxXTtcbiAgICAgICAgICAgIGlmICghaXZIZXggfHwgIWVuY3J5cHRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZW5jcnlwdGVkIGRhdGEgZm9ybWF0Jyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVXNlIHJlcXVpcmUgZm9yIGNyeXB0byB0byBhdm9pZCBidW5kbGVyIGlzc3VlcyB3aXRoIHRvcC1sZXZlbCBpbXBvcnRzXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgICAgICAgICAgdmFyIGNyeXB0b18xID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gICAgICAgICAgICB2YXIgaXYgPSBCdWZmZXIuZnJvbShpdkhleCwgJ2hleCcpO1xuICAgICAgICAgICAgdmFyIGRlY2lwaGVyID0gY3J5cHRvXzEuY3JlYXRlRGVjaXBoZXJpdih0aGlzLmFsZ29yaXRobSwgQnVmZmVyLmZyb20odGhpcy5zZWNyZXRLZXkpLCBpdik7XG4gICAgICAgICAgICB2YXIgZGVjcnlwdGVkID0gZGVjaXBoZXIudXBkYXRlKGVuY3J5cHRlZCwgJ2hleCcsICd1dGY4Jyk7XG4gICAgICAgICAgICBkZWNyeXB0ZWQgKz0gZGVjaXBoZXIuZmluYWwoJ3V0ZjgnKTtcbiAgICAgICAgICAgIHJldHVybiBkZWNyeXB0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdEZWNyeXB0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1hc2sgbW9iaWxlIG51bWJlciBmb3IgZGlzcGxheSAoZmlyc3QgMiBhbmQgbGFzdCAyIG9mIGFjdHVhbCBudW1iZXIgdmlzaWJsZSlcbiAgICAgKiBIYW5kbGVzIGNvdW50cnkgY29kZSBwcmVmaXggKCs5MSlcbiAgICAgKiBlLmcuLCBcIis5MTk4NzY1NDMyMTBcIiAtPiBcIis5MTk4KioqKioqMTBcIlxuICAgICAqIGUuZy4sIFwiOTg3NjU0MzIxMFwiIC0+IFwiOTgqKioqKioxMFwiXG4gICAgICovXG4gICAgQ3J5cHRvU2VydmljZS5wcm90b3R5cGUubWFza01vYmlsZSA9IGZ1bmN0aW9uIChtb2JpbGUpIHtcbiAgICAgICAgaWYgKCFtb2JpbGUgfHwgbW9iaWxlLmxlbmd0aCA8IDQpXG4gICAgICAgICAgICByZXR1cm4gJyoqKioqKioqKionO1xuICAgICAgICAvLyBDaGVjayBmb3IgY291bnRyeSBjb2RlIHByZWZpeFxuICAgICAgICB2YXIgcHJlZml4ID0gJyc7XG4gICAgICAgIHZhciBudW1iZXIgPSBtb2JpbGU7XG4gICAgICAgIGlmIChtb2JpbGUuc3RhcnRzV2l0aCgnKzkxJykpIHtcbiAgICAgICAgICAgIHByZWZpeCA9ICcrOTEnO1xuICAgICAgICAgICAgbnVtYmVyID0gbW9iaWxlLnN1YnN0cmluZygzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2JpbGUuc3RhcnRzV2l0aCgnOTEnKSAmJiBtb2JpbGUubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgIHByZWZpeCA9ICc5MSc7XG4gICAgICAgICAgICBudW1iZXIgPSBtb2JpbGUuc3Vic3RyaW5nKDIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbGVhbmVkID0gbnVtYmVyLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgIGlmIChjbGVhbmVkLmxlbmd0aCA8IDQpXG4gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgJyoqKioqKioqKionO1xuICAgICAgICByZXR1cm4gKHByZWZpeCArXG4gICAgICAgICAgICBjbGVhbmVkLnN1YnN0cmluZygwLCAyKSArXG4gICAgICAgICAgICAnKicucmVwZWF0KGNsZWFuZWQubGVuZ3RoIC0gNCkgK1xuICAgICAgICAgICAgY2xlYW5lZC5zdWJzdHJpbmcoY2xlYW5lZC5sZW5ndGggLSAyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ3J5cHRvU2VydmljZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBDcnlwdG9TZXJ2aWNlLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IFBob25lLCBNaWNPZmYgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHsgdXNlRXhvdGVsU2FmZSB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9FeG90ZWxQcm92aWRlcic7XG5pbXBvcnQgRXhvdGVsU2VydmljZSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leG90ZWwvRXhvdGVsU2VydmljZSc7XG5pbXBvcnQgeyBpbml0aWF0ZUNhbGxBY3Rpdml0eSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4b3RlbC9hcGknO1xuaW1wb3J0IENyeXB0b1NlcnZpY2UgZnJvbSAnLi4vLi4vc2VydmljZXMvY3J5cHRvL0NyeXB0b1NlcnZpY2UnO1xudmFyIENhbGxCdXR0b24gPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgcGhvbmVOdW1iZXIgPSBfYS5waG9uZU51bWJlciwgZW5jcnlwdGVkUGhvbmVOdW1iZXIgPSBfYS5lbmNyeXB0ZWRQaG9uZU51bWJlciwgY2FsbGVyTmFtZSA9IF9hLmNhbGxlck5hbWUsIHByb3NwZWN0SWQgPSBfYS5wcm9zcGVjdElkLCBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsIGRpc2FibGVkID0gX2EuZGlzYWJsZWQ7XG4gICAgdmFyIGV4b3RlbCA9IHVzZUV4b3RlbFNhZmUoKTtcbiAgICB2YXIgX2IgPSB1c2VTdGF0ZShmYWxzZSksIGlzRGlhbGluZyA9IF9iWzBdLCBzZXRJc0RpYWxpbmcgPSBfYlsxXTtcbiAgICB2YXIgX2MgPSB1c2VTdGF0ZShudWxsKSwgZXJyb3IgPSBfY1swXSwgc2V0RXJyb3IgPSBfY1sxXTtcbiAgICAvLyBJZiBFeG90ZWwgaXMgbm90IGF2YWlsYWJsZSAobm90IHdpdGhpbiBwcm92aWRlciksIGRvbid0IHJlbmRlciB0aGUgYnV0dG9uXG4gICAgaWYgKCFleG90ZWwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBtYWtlQ2FsbCA9IGV4b3RlbC5tYWtlQ2FsbCwgaXNDb25uZWN0ZWQgPSBleG90ZWwuaXNDb25uZWN0ZWQsIGNhbGxTdGF0ZSA9IGV4b3RlbC5jYWxsU3RhdGUsIHBlcm1pc3Npb25TdGF0dXMgPSBleG90ZWwucGVybWlzc2lvblN0YXR1cywgcmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MgPSBleG90ZWwucmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MsIHNldENhbGxBY3Rpdml0eUlkID0gZXhvdGVsLnNldENhbGxBY3Rpdml0eUlkLCBzZXRFeG90ZWxDYWxsU2lkID0gZXhvdGVsLnNldEV4b3RlbENhbGxTaWQ7XG4gICAgdmFyIGhhbmRsZUNhbGwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYWN0dWFsUGhvbmVOdW1iZXIsIG1hc2tlZE51bWJlciwgaGFzUGVybWlzc2lvbiwgZ3JhbnRlZCwgc2RrUmVzcG9uc2UsIGV4b3RlbENhbGxTaWQsIHJlc3BvbnNlLCBjYWxsQWN0aXZpdHlJZCwgYXBpRXJyb3JfMSwgZXJyXzEsIGVycm9yTWVzc2FnZSwgY29kZSwgZXJyb3JEZXRhaWxzLCBkZXNjcmlwdGlvbjtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBjYWxsaW5nIGZyb20gJ2lkbGUnIG9yICdlbmRlZCcgc3RhdGVzXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNDb25uZWN0ZWQgfHwgKGNhbGxTdGF0ZS5waGFzZSAhPT0gJ2lkbGUnICYmIGNhbGxTdGF0ZS5waGFzZSAhPT0gJ2VuZGVkJykpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgIHNldEVycm9yKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBhY3R1YWxQaG9uZU51bWJlciA9IHBob25lTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW5jcnlwdGVkUGhvbmVOdW1iZXIgJiYgIWFjdHVhbFBob25lTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFBob25lTnVtYmVyID0gQ3J5cHRvU2VydmljZS5kZWNyeXB0RGF0YShlbmNyeXB0ZWRQaG9uZU51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3R1YWxQaG9uZU51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignRmFpbGVkIHRvIGRlY3J5cHQgcGhvbmUgbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRGVjcnlwdGlvbiBlcnJvcjonLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCdGYWlsZWQgdG8gZGVjcnlwdCBwaG9uZSBudW1iZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3R1YWxQaG9uZU51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ05vIHBob25lIG51bWJlciBhdmFpbGFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXNrZWROdW1iZXIgPSBDcnlwdG9TZXJ2aWNlLm1hc2tNb2JpbGUoYWN0dWFsUGhvbmVOdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBFeG90ZWxTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2hlY2tBdWRpb1Blcm1pc3Npb25zKCldO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhaGFzUGVybWlzc2lvbikgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHJlcXVlc3RNaWNyb3Bob25lQWNjZXNzKCldO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZCA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFncmFudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignTWljcm9waG9uZSBhY2Nlc3MgaXMgcmVxdWlyZWQgdG8gbWFrZSBjYWxscycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbMywgOSwgMTAsIDExXSk7XG4gICAgICAgICAgICAgICAgICAgIHNldElzRGlhbGluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbWFrZUNhbGwoYWN0dWFsUGhvbmVOdW1iZXIsIGNhbGxlck5hbWUsIHVuZGVmaW5lZCwgbWFza2VkTnVtYmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCAyOiBFeHRyYWN0IENhbGxTaWQgZnJvbSBTREsgcmVzcG9uc2UgYW5kIHN0b3JlIGl0IGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FuY2VsIEFQSSBpZiB1c2VyIGRlY2xpbmVzIGJlZm9yZSBpbml0aWF0ZUNhbGxBY3Rpdml0eSBjb21wbGV0ZXNcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHNka1Jlc3BvbnNlID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBleG90ZWxDYWxsU2lkID0gKF9hID0gc2RrUmVzcG9uc2UgPT09IG51bGwgfHwgc2RrUmVzcG9uc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNka1Jlc3BvbnNlLkRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5DYWxsU2lkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhvdGVsQ2FsbFNpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXhvdGVsQ2FsbFNpZChleG90ZWxDYWxsU2lkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIShwcm9zcGVjdElkICYmIGV4b3RlbENhbGxTaWQpKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFs1LCA3LCAsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgaW5pdGlhdGVDYWxsQWN0aXZpdHkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3NwZWN0SWQ6IHByb3NwZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9OdW1iZXI6IGFjdHVhbFBob25lTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTaWQ6IGV4b3RlbENhbGxTaWQsIC8vIFBhc3MgQ2FsbFNpZCB3aGVuIGNyZWF0aW5nIHRoZSByZWNvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY2FsbCBzdGF0ZSB3aXRoIHRoZSBkYXRhYmFzZSBJRCBmb3IgZGlzcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsQWN0aXZpdHlJZCA9IChfYiA9IHJlc3BvbnNlLmRhdGEpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxBY3Rpdml0eUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWxsQWN0aXZpdHlJZChjYWxsQWN0aXZpdHlJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBhcGlFcnJvcl8xID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbQ2FsbEJ1dHRvbl0gRmFpbGVkIHRvIGNyZWF0ZSBjYWxsIGFjdGl2aXR5IHJlY29yZDonLCBhcGlFcnJvcl8xKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIG1ha2UgY2FsbDonLCBlcnJfMSk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdGYWlsZWQgdG8gbWFrZSBjYWxsJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKChlcnJfMSA9PT0gbnVsbCB8fCBlcnJfMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyXzEuQ29kZSkgfHwgKGVycl8xID09PSBudWxsIHx8IGVycl8xID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJfMS5TdGF0dXMpID09PSAnRmFpbGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGVycl8xLkNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckRldGFpbHMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycl8xLkVycm9yICYmIHR5cGVvZiBlcnJfMS5FcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckRldGFpbHMgPSBKU09OLnBhcnNlKGVycl8xLkVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKHBhcnNlRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBKU09OLCBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IChfZCA9IChfYyA9IGVycm9yRGV0YWlscyA9PT0gbnVsbCB8fCBlcnJvckRldGFpbHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yRGV0YWlscy5yZXNwb25zZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmVycm9yX2RhdGEpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkZXNjcmlwdGlvbiB8fCAnVXNlciBkZXZpY2UgaXMgY3VycmVudGx5IGJ1c3kgb3IgdW5hdmFpbGFibGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA+PSA0MDAgJiYgY29kZSA8IDUwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRlc2NyaXB0aW9uIHx8ICdVbmFibGUgdG8gY29tcGxldGUgY2FsbC4gUGxlYXNlIHRyeSBhZ2Fpbi4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA+PSA1MDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkZXNjcmlwdGlvbiB8fCAnU2VydmljZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGVzY3JpcHRpb24gfHwgJ0ZhaWxlZCB0byBtYWtlIGNhbGwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycl8xID09PSBudWxsIHx8IGVycl8xID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJfMS5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJfMS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBzZXRJc0RpYWxpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7IH07XG4gICAgLy8gJ2lkbGUnIGFuZCAnZW5kZWQnIGJvdGggbWVhbiBubyBhY3RpdmUgY2FsbCAtIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZFxuICAgIHZhciBpc0NhbGxJblByb2dyZXNzID0gY2FsbFN0YXRlLnBoYXNlICE9PSAnaWRsZScgJiYgY2FsbFN0YXRlLnBoYXNlICE9PSAnZW5kZWQnO1xuICAgIHZhciBoYXNQaG9uZU51bWJlciA9IHBob25lTnVtYmVyIHx8IGVuY3J5cHRlZFBob25lTnVtYmVyO1xuICAgIHZhciBpc0Rpc2FibGVkID0gZGlzYWJsZWQgfHwgIWhhc1Bob25lTnVtYmVyIHx8ICFpc0Nvbm5lY3RlZCB8fCBpc0NhbGxJblByb2dyZXNzIHx8IGlzRGlhbGluZztcbiAgICB2YXIgZ2V0QnV0dG9uVGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gJ1ZvSVAgbm90IGNvbm5lY3RlZCc7XG4gICAgICAgIGlmIChpc0NhbGxJblByb2dyZXNzKVxuICAgICAgICAgICAgcmV0dXJuICdDYWxsIGluIHByb2dyZXNzJztcbiAgICAgICAgaWYgKCFoYXNQaG9uZU51bWJlcilcbiAgICAgICAgICAgIHJldHVybiAnTm8gcGhvbmUgbnVtYmVyJztcbiAgICAgICAgaWYgKHBlcm1pc3Npb25TdGF0dXMgPT09ICdkZW5pZWQnKVxuICAgICAgICAgICAgcmV0dXJuICdNaWNyb3Bob25lIGFjY2VzcyBkZW5pZWQnO1xuICAgICAgICByZXR1cm4gXCJDYWxsIFwiLmNvbmNhdChjYWxsZXJOYW1lIHx8ICdwcm9zcGVjdCcpO1xuICAgIH07XG4gICAgcmV0dXJuIChfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lLCBjaGlsZHJlbjogW19qc3hzKEJ1dHRvbiwgeyB2YXJpYW50OiBcIm91dGxpbmVcIiwgc2l6ZTogXCJzbVwiLCBvbkNsaWNrOiBoYW5kbGVDYWxsLCBkaXNhYmxlZDogaXNEaXNhYmxlZCwgdGl0bGU6IGdldEJ1dHRvblRpdGxlKCksIGNsYXNzTmFtZTogXCJnYXAtMS41XCIsIGNoaWxkcmVuOiBbcGVybWlzc2lvblN0YXR1cyA9PT0gJ2RlbmllZCcgPyAoX2pzeChNaWNPZmYsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSkgOiAoX2pzeChQaG9uZSwgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pKSwgaXNEaWFsaW5nID8gJ0NhbGxpbmcuLi4nIDogJ0NhbGwnXSB9KSwgZXJyb3IgJiYgX2pzeChcInBcIiwgeyBjbGFzc05hbWU6IFwidGV4dC1yZWQtNTAwIHRleHQteHMgbXQtMVwiLCBjaGlsZHJlbjogZXJyb3IgfSldIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBDYWxsQnV0dG9uO1xuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBNaWMsIE1pY09mZiwgQWxlcnRDaXJjbGUgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHsgdXNlRXhvdGVsIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL0V4b3RlbFByb3ZpZGVyJztcbnZhciBNaWNyb3Bob25lUGVybWlzc2lvbiA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBvblBlcm1pc3Npb25HcmFudGVkID0gX2Eub25QZXJtaXNzaW9uR3JhbnRlZCwgb25QZXJtaXNzaW9uRGVuaWVkID0gX2Eub25QZXJtaXNzaW9uRGVuaWVkO1xuICAgIHZhciBfYiA9IHVzZUV4b3RlbCgpLCBwZXJtaXNzaW9uU3RhdHVzID0gX2IucGVybWlzc2lvblN0YXR1cywgcmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MgPSBfYi5yZXF1ZXN0TWljcm9waG9uZUFjY2VzcztcbiAgICB2YXIgX2MgPSB1c2VTdGF0ZShmYWxzZSksIGlzUmVxdWVzdGluZyA9IF9jWzBdLCBzZXRJc1JlcXVlc3RpbmcgPSBfY1sxXTtcbiAgICB2YXIgX2QgPSB1c2VTdGF0ZShudWxsKSwgZXJyb3IgPSBfZFswXSwgc2V0RXJyb3IgPSBfZFsxXTtcbiAgICB2YXIgaGFuZGxlUmVxdWVzdFBlcm1pc3Npb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ3JhbnRlZCwgZXJyXzE7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHNldElzUmVxdWVzdGluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgNCwgNV0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZXF1ZXN0TWljcm9waG9uZUFjY2VzcygpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGdyYW50ZWQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChncmFudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblBlcm1pc3Npb25HcmFudGVkID09PSBudWxsIHx8IG9uUGVybWlzc2lvbkdyYW50ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUGVybWlzc2lvbkdyYW50ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCdNaWNyb3Bob25lIGFjY2VzcyB3YXMgZGVuaWVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblBlcm1pc3Npb25EZW5pZWQgPT09IG51bGwgfHwgb25QZXJtaXNzaW9uRGVuaWVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblBlcm1pc3Npb25EZW5pZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGVycl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihlcnJfMS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gcmVxdWVzdCBtaWNyb3Bob25lIGFjY2VzcycpO1xuICAgICAgICAgICAgICAgICAgICBvblBlcm1pc3Npb25EZW5pZWQgPT09IG51bGwgfHwgb25QZXJtaXNzaW9uRGVuaWVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblBlcm1pc3Npb25EZW5pZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBzZXRJc1JlcXVlc3RpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTsgfTtcbiAgICBpZiAocGVybWlzc2lvblN0YXR1cyA9PT0gJ2dyYW50ZWQnKSB7XG4gICAgICAgIHJldHVybiAoX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1ncmVlbi02MDBcIiwgY2hpbGRyZW46IFtfanN4KE1pYywgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pLCBfanN4KFwic3BhblwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LXNtXCIsIGNoaWxkcmVuOiBcIk1pY3JvcGhvbmUgYWNjZXNzIGdyYW50ZWRcIiB9KV0gfSkpO1xuICAgIH1cbiAgICBpZiAocGVybWlzc2lvblN0YXR1cyA9PT0gJ2RlbmllZCcpIHtcbiAgICAgICAgcmV0dXJuIChfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJwLTQgYmctcmVkLTUwIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1yZWQtMjAwXCIsIGNoaWxkcmVuOiBbX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1yZWQtNjAwIG1iLTJcIiwgY2hpbGRyZW46IFtfanN4KE1pY09mZiwgeyBjbGFzc05hbWU6IFwidy01IGgtNVwiIH0pLCBfanN4KFwic3BhblwiLCB7IGNsYXNzTmFtZTogXCJmb250LW1lZGl1bVwiLCBjaGlsZHJlbjogXCJNaWNyb3Bob25lIEFjY2VzcyBEZW5pZWRcIiB9KV0gfSksIF9qc3goXCJwXCIsIHsgY2xhc3NOYW1lOiBcInRleHQtc20gdGV4dC1yZWQtNjAwIG1iLTNcIiwgY2hpbGRyZW46IFwiVG8gdXNlIHRoZSBjYWxsaW5nIGZlYXR1cmUsIHlvdSBuZWVkIHRvIGVuYWJsZSBtaWNyb3Bob25lIGFjY2VzcyBpbiB5b3VyIGJyb3dzZXIgc2V0dGluZ3MuXCIgfSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInRleHQteHMgdGV4dC1ncmF5LTYwMFwiLCBjaGlsZHJlbjogW19qc3goXCJwXCIsIHsgY2xhc3NOYW1lOiBcImZvbnQtbWVkaXVtIG1iLTFcIiwgY2hpbGRyZW46IFwiSG93IHRvIGVuYWJsZTpcIiB9KSwgX2pzeHMoXCJvbFwiLCB7IGNsYXNzTmFtZTogXCJsaXN0LWRlY2ltYWwgbGlzdC1pbnNpZGUgc3BhY2UteS0xXCIsIGNoaWxkcmVuOiBbX2pzeChcImxpXCIsIHsgY2hpbGRyZW46IFwiQ2xpY2sgdGhlIGxvY2svaW5mbyBpY29uIGluIHlvdXIgYnJvd3NlcidzIGFkZHJlc3MgYmFyXCIgfSksIF9qc3goXCJsaVwiLCB7IGNoaWxkcmVuOiBcIkZpbmQgXFxcIk1pY3JvcGhvbmVcXFwiIGluIHRoZSBwZXJtaXNzaW9ucyBsaXN0XCIgfSksIF9qc3goXCJsaVwiLCB7IGNoaWxkcmVuOiBcIkNoYW5nZSB0aGUgc2V0dGluZyB0byBcXFwiQWxsb3dcXFwiXCIgfSksIF9qc3goXCJsaVwiLCB7IGNoaWxkcmVuOiBcIlJlZnJlc2ggdGhlIHBhZ2VcIiB9KV0gfSldIH0pXSB9KSk7XG4gICAgfVxuICAgIHJldHVybiAoX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwicC00IGJnLWJsdWUtNTAgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLWJsdWUtMjAwXCIsIGNoaWxkcmVuOiBbX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1ibHVlLTYwMCBtYi0yXCIsIGNoaWxkcmVuOiBbX2pzeChBbGVydENpcmNsZSwgeyBjbGFzc05hbWU6IFwidy01IGgtNVwiIH0pLCBfanN4KFwic3BhblwiLCB7IGNsYXNzTmFtZTogXCJmb250LW1lZGl1bVwiLCBjaGlsZHJlbjogXCJNaWNyb3Bob25lIFBlcm1pc3Npb24gUmVxdWlyZWRcIiB9KV0gfSksIF9qc3goXCJwXCIsIHsgY2xhc3NOYW1lOiBcInRleHQtc20gdGV4dC1ncmF5LTYwMCBtYi0zXCIsIGNoaWxkcmVuOiBcIlRvIG1ha2UgYW5kIHJlY2VpdmUgY2FsbHMsIHdlIG5lZWQgYWNjZXNzIHRvIHlvdXIgbWljcm9waG9uZS4gQ2xpY2sgdGhlIGJ1dHRvbiBiZWxvdyB0byBncmFudCBwZXJtaXNzaW9uLlwiIH0pLCBfanN4cyhCdXR0b24sIHsgdmFyaWFudDogXCJkZWZhdWx0XCIsIHNpemU6IFwic21cIiwgb25DbGljazogaGFuZGxlUmVxdWVzdFBlcm1pc3Npb24sIGxvYWRpbmc6IGlzUmVxdWVzdGluZywgY2xhc3NOYW1lOiBcImdhcC0xLjVcIiwgY2hpbGRyZW46IFtfanN4KE1pYywgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pLCBcIkFsbG93IE1pY3JvcGhvbmUgQWNjZXNzXCJdIH0pLCBlcnJvciAmJiBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LXJlZC01MDAgdGV4dC14cyBtdC0yXCIsIGNoaWxkcmVuOiBlcnJvciB9KV0gfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IE1pY3JvcGhvbmVQZXJtaXNzaW9uO1xuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgX0ZyYWdtZW50LCBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEV4b3RlbFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL0V4b3RlbFByb3ZpZGVyJztcbmltcG9ydCB7IGdldEFjdGl2ZVZvaWNlVG9rZW4gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leG90ZWwvYXBpJztcbmltcG9ydCBFeG90ZWxQaG9uZSBmcm9tICcuL0V4b3RlbFBob25lJztcbi8qKlxuICogV3JhcHBlciBjb21wb25lbnQgdGhhdCBpbml0aWFsaXplcyBFeG90ZWwgVm9JUCBmdW5jdGlvbmFsaXR5XG4gKiBGZXRjaGVzIHRoZSBhY2Nlc3MgdG9rZW4gZnJvbSBiYWNrZW5kIGFuZCBwcm92aWRlcyB0aGUgRXhvdGVsIGNvbnRleHQgdG8gY2hpbGRyZW5cbiAqL1xudmFyIEV4b3RlbFdyYXBwZXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgX2IgPSBfYS5lbmFibGVkLCBlbmFibGVkID0gX2IgPT09IHZvaWQgMCA/IHRydWUgOiBfYiwgcHJvc3BlY3RJZCA9IF9hLnByb3NwZWN0SWQsIHByb3NwZWN0TmFtZSA9IF9hLnByb3NwZWN0TmFtZSwgcHJvc3BlY3ROdW1iZXIgPSBfYS5wcm9zcGVjdE51bWJlcjtcbiAgICB2YXIgX2MgPSB1c2VTdGF0ZShudWxsKSwgYWNjZXNzVG9rZW4gPSBfY1swXSwgc2V0QWNjZXNzVG9rZW4gPSBfY1sxXTtcbiAgICB2YXIgX2QgPSB1c2VTdGF0ZSh0cnVlKSwgaXNMb2FkaW5nID0gX2RbMF0sIHNldElzTG9hZGluZyA9IF9kWzFdO1xuICAgIHZhciBfZSA9IHVzZVN0YXRlKG51bGwpLCBlcnJvciA9IF9lWzBdLCBzZXRFcnJvciA9IF9lWzFdO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmV0Y2hUb2tlbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdG9rZW5EYXRhLCBlcnJfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgMiwgMywgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZ2V0QWN0aXZlVm9pY2VUb2tlbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5EYXRhID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuRGF0YSA9PT0gbnVsbCB8fCB0b2tlbkRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRva2VuRGF0YS50b2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFjY2Vzc1Rva2VuKHRva2VuRGF0YS50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBhY3RpdmUgdm9pY2UgY29uZmlnIC0gRXhvdGVsIG5vdCBjb25maWd1cmVkIGZvciB0aGlzIHRlbmFudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCdWb2ljZSBjYWxsaW5nIG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggRXhvdGVsIHRva2VuOicsIGVycl8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKGVycl8xLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBpbml0aWFsaXplIGNhbGxpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyB9O1xuICAgICAgICBmZXRjaFRva2VuKCk7XG4gICAgfSwgW2VuYWJsZWRdKTtcbiAgICAvLyBJZiBFeG90ZWwgaXMgbm90IGVuYWJsZWQgb3IgZmFpbGVkIHRvIGxvYWQsIGp1c3QgcmVuZGVyIGNoaWxkcmVuXG4gICAgaWYgKCFlbmFibGVkIHx8IGVycm9yIHx8ICFhY2Nlc3NUb2tlbikge1xuICAgICAgICByZXR1cm4gX2pzeChfRnJhZ21lbnQsIHsgY2hpbGRyZW46IGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgICAvLyBSZW5kZXIgd2l0aCBFeG90ZWwgcHJvdmlkZXIgYW5kIGZsb2F0aW5nIHBob25lIFVJXG4gICAgcmV0dXJuIChfanN4cyhFeG90ZWxQcm92aWRlciwgeyBhY2Nlc3NUb2tlbjogYWNjZXNzVG9rZW4sIGFnZW50VXNlcklkOiBcIjAwNDdcIiwgYXV0b0Nvbm5lY3RWT0lQOiB0cnVlLCBjaGlsZHJlbjogW2NoaWxkcmVuLCBfanN4KEV4b3RlbFBob25lLCB7IHByb3NwZWN0SWQ6IHByb3NwZWN0SWQsIHByb3NwZWN0TmFtZTogcHJvc3BlY3ROYW1lLCBwcm9zcGVjdE51bWJlcjogcHJvc3BlY3ROdW1iZXIgfSldIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBFeG90ZWxXcmFwcGVyO1xuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgX0ZyYWdtZW50LCBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBFeG90ZWxQcm92aWRlciB9IGZyb20gJy4vRXhvdGVsUHJvdmlkZXInO1xuaW1wb3J0IHsgRXhvdGVsUGhvbmUgfSBmcm9tICcuLi9jb21wb25lbnRzL0V4b3RlbCc7XG5pbXBvcnQgeyBjaGVja1ZvSVBFbmFibGVkLCBnZXRBY3RpdmVWb2ljZVRva2VuLCBzYXZlQ2FsbERpc3Bvc2l0aW9uIH0gZnJvbSAnLi4vc2VydmljZXMvZXhvdGVsJztcbmltcG9ydCB7IGlzVm9JUEVuYWJsZWRGb3JXb3Jrc3BhY2UgfSBmcm9tICcuLi9jb25maWcvdm9pcC5jb25maWcnO1xuLyoqXG4gKiBWb0lQUHJvdmlkZXIgLSBXb3Jrc3BhY2UtbGV2ZWwgVm9JUC9FeG90ZWwgaW50ZWdyYXRpb25cbiAqXG4gKiBUaGlzIHByb3ZpZGVyIGNoZWNrcyBpZiBWb0lQIGlzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IHdvcmtzcGFjZSBBTkQgdGVuYW50XG4gKiBhbmQgaW5pdGlhbGl6ZXMgdGhlIEV4b3RlbCBTREsgaWYgZW5hYmxlZC5cbiAqXG4gKiBWb0lQIGlzIGVuYWJsZWQgb25seSB3aGVuIEFMTCBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKiAxLiBXb3Jrc3BhY2UgaXMgaW4gVk9JUF9FTkFCTEVEX1dPUktTUEFDRVMgKGNvbW1vbi13b3Jrc3BhY2UsIHRlbGUtY2FsbGVyLXdvcmtzcGFjZSlcbiAqIDIuIFRlbmFudCBoYXMgZW5hYmxlVm9pY2U6IHRydWUgaW4gbm90aWZpY2F0aW9uIGNvbmZpZ1xuICogMy4gVGVuYW50IGhhcyBhdCBsZWFzdCBvbmUgZW5hYmxlZCB2b2ljZSBjb25maWcgKHZvaWNlQ29uZmlnc1tdLmlzRW5hYmxlZDogdHJ1ZSlcbiAqIDQuIEFjdGl2ZSB0b2tlbiBpcyBhdmFpbGFibGVcbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gV29ya3NwYWNlLWxldmVsIFZvSVAgZW5hYmxlbWVudFxuICogLSBUZW5hbnQtbGV2ZWwgVm9JUCBjb25maWd1cmF0aW9uIGNoZWNrXG4gKiAtIEF1dG9tYXRpYyB0b2tlbiBmZXRjaGluZyBmcm9tIGJhY2tlbmRcbiAqIC0gTWljcm9waG9uZSBwZXJtaXNzaW9uIGhhbmRsaW5nXG4gKiAtIEZsb2F0aW5nIHBob25lIFVJIGZvciBhY3RpdmUgY2FsbHNcbiAqL1xuZXhwb3J0IHZhciBWb0lQUHJvdmlkZXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgd29ya3NwYWNlID0gX2Eud29ya3NwYWNlLCBhZ2VudFVzZXJJZCA9IF9hLmFnZW50VXNlcklkLCBwcm9zcGVjdElkID0gX2EucHJvc3BlY3RJZCwgcHJvc3BlY3ROYW1lID0gX2EucHJvc3BlY3ROYW1lLCBwcm9zcGVjdE51bWJlciA9IF9hLnByb3NwZWN0TnVtYmVyLCBvblNhdmVEaXNwb3NpdGlvbiA9IF9hLm9uU2F2ZURpc3Bvc2l0aW9uO1xuICAgIHZhciBfYiA9IHVzZVN0YXRlKG51bGwpLCBhY2Nlc3NUb2tlbiA9IF9iWzBdLCBzZXRBY2Nlc3NUb2tlbiA9IF9iWzFdO1xuICAgIHZhciBfYyA9IHVzZVN0YXRlKHRydWUpLCBpc0xvYWRpbmcgPSBfY1swXSwgc2V0SXNMb2FkaW5nID0gX2NbMV07XG4gICAgdmFyIF9kID0gdXNlU3RhdGUobnVsbCksIGVycm9yID0gX2RbMF0sIHNldEVycm9yID0gX2RbMV07XG4gICAgdmFyIGlzV29ya3NwYWNlVm9JUEVuYWJsZWQgPSBpc1ZvSVBFbmFibGVkRm9yV29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gICAgdmFyIGhhc0FnZW50VXNlcklkID0gISFhZ2VudFVzZXJJZDtcbiAgICAvLyBEZWZhdWx0IGRpc3Bvc2l0aW9uIGhhbmRsZXIgdGhhdCBjYWxscyB0aGUgQVBJXG4gICAgdmFyIGhhbmRsZVNhdmVEaXNwb3NpdGlvbiA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAvLyBJZiBjdXN0b20gaGFuZGxlciBpcyBwcm92aWRlZCwgdXNlIGl0XG4gICAgICAgICAgICBpZiAob25TYXZlRGlzcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgb25TYXZlRGlzcG9zaXRpb24oZGF0YSldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRGVmYXVsdDogY2FsbCB0aGUgc2F2ZUNhbGxEaXNwb3NpdGlvbiBBUElcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBzYXZlQ2FsbERpc3Bvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbElkOiBkYXRhLmNhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvc3BlY3RJZDogZGF0YS5wcm9zcGVjdElkLFxuICAgICAgICAgICAgICAgICAgICBjYWxsU3RhdHVzRGlzcG9zaXRpb246IGRhdGEuY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvbkNhdGVnb3J5OiBkYXRhLmRpc3Bvc2l0aW9uQ2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uUmVhc29uOiBkYXRhLmRpc3Bvc2l0aW9uUmVhc29uIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb25Ob3RlczogZGF0YS5yZW1hcmtzIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgIH0pO1xuICAgIH0pOyB9LCBbb25TYXZlRGlzcG9zaXRpb25dKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBTa2lwIGlmIHdvcmtzcGFjZSBkb2Vzbid0IHN1cHBvcnQgVm9JUCBvciB1c2VyIGRvZXNuJ3QgaGF2ZSBFeG90ZWwgQXBwIFVzZXIgSURcbiAgICAgICAgaWYgKCFpc1dvcmtzcGFjZVZvSVBFbmFibGVkIHx8ICFoYXNBZ2VudFVzZXJJZCkge1xuICAgICAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5pdGlhbGl6ZVZvSVAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHZvaXBTdGF0dXMsIHRva2VuRGF0YSwgZXJyXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDMsIDQsIDVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgY2hlY2tWb0lQRW5hYmxlZCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgdm9pcFN0YXR1cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdm9pcFN0YXR1cy5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVm9JUCBub3QgZW5hYmxlZCBmb3IgdGhpcyB0ZW5hbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignVm9pY2UgY2FsbGluZyBub3QgZW5hYmxlZCBmb3IgdGhpcyB0ZW5hbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGdldEFjdGl2ZVZvaWNlVG9rZW4oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuRGF0YSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbkRhdGEgPT09IG51bGwgfHwgdG9rZW5EYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b2tlbkRhdGEudG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBY2Nlc3NUb2tlbih0b2tlbkRhdGEudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gYWN0aXZlIHRva2VuIGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCdWb2ljZSBjYWxsaW5nIHRva2VuIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIFZvSVA6JywgZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoZXJyXzEubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGluaXRpYWxpemUgY2FsbGluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7IH07XG4gICAgICAgIGluaXRpYWxpemVWb0lQKCk7XG4gICAgfSwgW2lzV29ya3NwYWNlVm9JUEVuYWJsZWQsIGhhc0FnZW50VXNlcklkXSk7XG4gICAgLy8gSWYgd29ya3NwYWNlIGRvZXNuJ3Qgc3VwcG9ydCBWb0lQIG9yIHVzZXIgZG9lc24ndCBoYXZlIEV4b3RlbCBJRCwganVzdCByZW5kZXIgY2hpbGRyZW5cbiAgICBpZiAoIWlzV29ya3NwYWNlVm9JUEVuYWJsZWQgfHwgIWhhc0FnZW50VXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfanN4KF9GcmFnbWVudCwgeyBjaGlsZHJlbjogY2hpbGRyZW4gfSk7XG4gICAgfVxuICAgIC8vIElmIGxvYWRpbmcgb3IgZXJyb3Igb3Igbm8gdG9rZW4sIHJlbmRlciBjaGlsZHJlbiB3aXRob3V0IFZvSVBcbiAgICBpZiAoaXNMb2FkaW5nIHx8IGVycm9yIHx8ICFhY2Nlc3NUb2tlbikge1xuICAgICAgICByZXR1cm4gX2pzeChfRnJhZ21lbnQsIHsgY2hpbGRyZW46IGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgICAvLyBSZW5kZXIgd2l0aCBFeG90ZWwgcHJvdmlkZXIgYW5kIGZsb2F0aW5nIHBob25lIFVJXG4gICAgcmV0dXJuIChfanN4cyhFeG90ZWxQcm92aWRlciwgeyBhY2Nlc3NUb2tlbjogYWNjZXNzVG9rZW4sIGFnZW50VXNlcklkOiBhZ2VudFVzZXJJZCwgYXV0b0Nvbm5lY3RWT0lQOiB0cnVlLCBjaGlsZHJlbjogW2NoaWxkcmVuLCBfanN4KEV4b3RlbFBob25lLCB7IHByb3NwZWN0SWQ6IHByb3NwZWN0SWQsIHByb3NwZWN0TmFtZTogcHJvc3BlY3ROYW1lLCBwcm9zcGVjdE51bWJlcjogcHJvc3BlY3ROdW1iZXIsIG9uU2F2ZURpc3Bvc2l0aW9uOiBoYW5kbGVTYXZlRGlzcG9zaXRpb24gfSldIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBWb0lQUHJvdmlkZXI7XG4iXSwibmFtZXMiOlsiX19hc3NpZ24iLCJPYmplY3QiLCJhc3NpZ24iLCJ0IiwicyIsImkiLCJuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwicCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImFwcGx5IiwidGhpcyIsIl9fYXdhaXRlciIsInRoaXNBcmciLCJfYXJndW1lbnRzIiwiUCIsImdlbmVyYXRvciIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwidmFsdWUiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiX19nZW5lcmF0b3IiLCJib2R5IiwiZiIsInkiLCJfIiwibGFiZWwiLCJzZW50IiwidHJ5cyIsIm9wcyIsImciLCJjcmVhdGUiLCJJdGVyYXRvciIsInZlcmIiLCJTeW1ib2wiLCJpdGVyYXRvciIsInYiLCJvcCIsIlR5cGVFcnJvciIsInBvcCIsInB1c2giLCJTdXBwcmVzc2VkRXJyb3IiLCJpbml0aWFsQXBwbGljYXRpb25TdGF0ZSIsImlzTG9naW5EaWFsb2dPcGVuIiwic25hY2tiYXIiLCJvcGVuIiwibWVzc2FnZSIsInNldmVyaXR5IiwiY29uZmlybURpYWxvZyIsImlzT3BlbiIsInRpdGxlIiwib25Db25maXJtIiwib25DYW5jZWwiLCJ0eXBlIiwidXNlciIsInVuZGVmaW5lZCIsImluc3RpdHV0aW9uSW5mbyIsImFzc2V0IiwiQXBwbGljYXRpb25TdG9yZSIsIlN0b3JlIiwidG9CYXNlNjRVcmwiLCJiYXNlNjQiLCJyZXBsYWNlIiwiZ2VuZXJhdGVDbGllbnRUb2tlbiIsImNsaWVudElkIiwic2VjcmV0IiwicGF5bG9hZCIsImlhdCIsIk1hdGgiLCJmbG9vciIsIkRhdGUiLCJub3ciLCJwYXlsb2FkQmFzZTY0dXJsIiwiYnRvYSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzaWduYXR1cmVXb3JkQXJyYXkiLCJDcnlwdG9KUyIsIkhtYWNTSEEyNTYiLCJzaWduYXR1cmVCYXNlNjR1cmwiLCJlbmMiLCJCYXNlNjQiLCJjb25jYXQiLCJpc0RldmVsb3BtZW50Iiwid2luZG93IiwibG9jYXRpb24iLCJob3N0bmFtZSIsImluY2x1ZGVzIiwidGVuYW50Q29kZSIsInNwbGl0IiwiaW5zdGl0dXRpb25Db2RlIiwicGF0aG5hbWUiLCJ3b3Jrc3BhY2UiLCJ3b3Jrc3BhY2VBcGlNYXBwaW5nIiwiYXhpb3MiLCJBeGlvcyIsImJhc2VVUkwiLCJwcm9jZXNzIiwiZW52IiwiUkVBQ1RfQVBQX0FQSV9IT1NUIiwid2l0aENyZWRlbnRpYWxzIiwiaGVhZGVycyIsImNyZWF0ZVJzYnVpbGRTaGFyZWRDb25maWciLCJkZXBlbmRlbmNpZXMiLCJhbHdheXNFYWdlciIsInNoYXJlZERlcGVuZGVuY2llc0xpc3QiLCJyZWR1Y2UiLCJhY2MiLCJwa2ciLCJ2ZXJzaW9uIiwic2luZ2xldG9uIiwicmVxdWlyZWRWZXJzaW9uIiwiZWFnZXIiLCJpbnRlcmNlcHRvcnMiLCJyZXF1ZXN0IiwidXNlIiwiY29uZmlnIiwicGFyYW1zIiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwibWFwIiwiX2EiLCJrZXkiLCJmb3JtYXRQYXJhbXMiLCJ3b3Jrc3BhY2VQcmVmaXgiLCJ1cmwiLCJzZXNzaW9uS2V5IiwiQ29va2llcyIsImdldCIsIm9wZW5QYXltZW50c0tleSIsInN0dWRlbnRTZXNzaW9uS2V5Iiwic2V0IiwiY2FtcHhDbGllbnRJZCIsIlJFQUNUX0FQUF9DTElFTlRfSUQiLCJjYW1weENsaWVudFNlY3JldCIsIlJFQUNUX0FQUF9DQU1QWF9DTElFTlRfU0VDUkVUIiwic2tpcEluc3RpdHV0aW9uQ29kZSIsImRlbGV0ZSIsImVycm9yIiwicmVzcG9uc2UiLCJkYXRhIiwiaGlkZVNuYWNrYmFyIiwibWV0aG9kIiwic3RhdHVzIiwidXBkYXRlIiwiZXJyIiwiX2IiLCJfYyIsIl9kIiwic2hvdWxkSGlkZVNuYWNrYmFyIiwibm9uV29ya3NwYWNlQXhpb3MiLCJWT0lQX0VOQUJMRURfV09SS1NQQUNFUyIsImlzVm9JUEVuYWJsZWRGb3JXb3Jrc3BhY2UiLCJ3b3Jrc3BhY2VOYW1lIiwiQ29uZmlybUNvbnRleHQiLCJjcmVhdGVDb250ZXh0Iiwic2hvd0NvbmZpcm1EaWFsb2ciLCJDb25maXJtRGlhbG9nUHJvdmlkZXIiLCJjaGlsZHJlbiIsInVzZVN0YXRlIiwiaGFuZGxlQ2xvc2VEaWFsb2ciLCJfanN4cyIsIlByb3ZpZGVyIiwiY29uZmlybVRleHQiLCJjYW5jZWxUZXh0IiwiY29uZmlybUJ1dHRvblRleHQiLCJjYW5jZWxCdXR0b25UZXh0IiwiX2pzeCIsIkNvbmZpcm1EaWFsb2ciLCJ2YXJpYW50Iiwib25DbG9zZSIsIl9zZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiYmluZCIsIl9fcHJvdG9fXyIsImluaXRpYWxTdGF0ZSIsIkVycm9yQm91bmRhcnkiLCJfUmVhY3QkQ29tcG9uZW50IiwiX3RoaXMiLCJfbGVuIiwiX2FyZ3MiLCJBcnJheSIsIl9rZXkiLCJzdGF0ZSIsInJlc2V0RXJyb3JCb3VuZGFyeSIsIl90aGlzJHByb3BzIiwiX2xlbjIiLCJhcmdzIiwiX2tleTIiLCJwcm9wcyIsIm9uUmVzZXQiLCJyZXNldCIsIm8iLCJjb25zdHJ1Y3RvciIsIl9pbmhlcml0c0xvb3NlIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIiwiX3Byb3RvIiwic2V0U3RhdGUiLCJjb21wb25lbnREaWRDYXRjaCIsImluZm8iLCJfdGhpcyRwcm9wcyRvbkVycm9yIiwiX3RoaXMkcHJvcHMyIiwib25FcnJvciIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsIl90aGlzJHByb3BzJG9uUmVzZXRLZSIsIl90aGlzJHByb3BzMyIsImEiLCJiIiwicmVzZXRLZXlzIiwic29tZSIsIml0ZW0iLCJpbmRleCIsImlzIiwib25SZXNldEtleXNDaGFuZ2UiLCJyZW5kZXIiLCJfdGhpcyRwcm9wczQiLCJmYWxsYmFja1JlbmRlciIsIkZhbGxiYWNrQ29tcG9uZW50IiwiZmFsbGJhY2siLCJfcHJvcHMiLCJSZWFjdCIsImlzVmFsaWRFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsIkVycm9yIiwiQ29tcG9uZW50IiwiYyIsInIiLCJ1IiwiY29udGV4dCIsIk5PREVfRU5WIiwibW9kZSIsImFib3J0RWFybHkiLCJzaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uIiwidmFsdWVzIiwicmF3VmFsdWVzIiwiZXJyb3JzIiwiaW5uZXIiLCJjcml0ZXJpYU1vZGUiLCJwYXRoIiwidHlwZXMiLCJwZXJmb3JtTG9naW4iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImZldGNoIiwiY29uc2lkZXJJcCIsImpzb24iLCJsYXQiLCJsbmciLCJwb3N0IiwicmVzIiwidmFsaWRhdGlvblNjaGVtYSIsIll1cCIsIm9iamVjdCIsInNoYXBlIiwidXNlcm5hbWUiLCJzdHJpbmciLCJyZXF1aXJlZCIsInBhc3N3b3JkIiwiTG9naW4iLCJjbG9zZSIsImRldmljZUluZm9ybWF0aW9uIiwiZGV2aWNlVHlwZSIsImNsaWVudE5hbWUiLCJvcyIsIm9zVmVyc2lvbiIsInRva2VuVHlwZSIsImlzTG9jYXRpb25BbGxvd2VkIiwiZGV2aWNlU3RhdGUiLCJzZXREZXZpY2VTdGF0ZSIsIm5hdmlnYXRlIiwidXNlTmF2aWdhdGUiLCJ1c2VFZmZlY3QiLCJuYXZpZ2F0b3IiLCJnZW9sb2NhdGlvbiIsImdldEN1cnJlbnRQb3NpdGlvbiIsInBvc2l0aW9uIiwiY29vcmRzIiwicGVybWlzc2lvbnMiLCJxdWVyeSIsIm5hbWUiLCJwZXJtaXNzaW9uU3RhdHVzIiwiZGV2aWNlSW5mbyIsIkRldmljZURldGVjdG9yIiwicGFyc2UiLCJ1c2VyQWdlbnQiLCJjbGllbnQiLCJ1c2VGb3JtIiwicmVzb2x2ZXIiLCJ5dXBSZXNvbHZlciIsImhhbmRsZVN1Ym1pdCIsImNvbnRyb2wiLCJmb3JtU3RhdGUiLCJ1c2VNdXRhdGlvbiIsIm9uU3VjY2VzcyIsInJlbW92ZSIsInNlc3Npb24iLCJ0b2tlbiIsInJlbG9hZCIsIm11dGF0ZSIsImlzTG9hZGluZyIsImNsYXNzTmFtZSIsIkljb25zIiwiQ2FtcHhGdWxsTG9nb0ljb24iLCJDb250cm9sbGVyIiwiZmllbGQiLCJUZXh0RmllbGQiLCJwbGFjZWhvbGRlciIsIm9uQ2hhbmdlIiwiZnVsbFdpZHRoIiwiUGFzc3dvcmRGaWVsZCIsIkJ1dHRvbiIsImNvbG9yIiwib25DbGljayIsImxvZ2luSWQiLCJsb2dpblR5cGUiLCJkaXNhYmxlZCIsImxvYWRpbmciLCJ1c2VMb2NhdGlvbiIsIlF1ZXJ5RXJyb3JSZXNldEJvdW5kYXJ5IiwiUmVhY3RFcnJvckJvdW5kYXJ5IiwiRXJyb3JGYWxsYmFjayIsIl9lIiwiX2YiLCJfZyIsIl9oIiwiVW5BdXRoIiwiSW50ZXJuYWxTZXJ2ZXJFcnJvciIsInJlc2V0Qm91bmRhcnkiLCJSZXNvdXJjZU5vdEZvdW5kIiwiY29kZSIsIk5vSW50ZXJuZUNvbm5lY3Rpb24iLCJzaXplIiwiaXNNb2RhbE9wZW4iLCJzZXRNb2RhbE9wZW4iLCJzZXNzaW9uQ29va2llIiwiVW5BdXRob3JpemVkIiwiY29tcG9uZW50IiwiX0ZyYWdtZW50IiwiRGlhbG9nIiwiY29udGVudCIsImZvcm1hdFByb2RFcnJvck1lc3NhZ2UiLCJzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0Iiwib2JzZXJ2YWJsZSIsInJhbmRvbVN0cmluZyIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyaW5nIiwiam9pbiIsImFjdGlvblR5cGVzX2RlZmF1bHQiLCJJTklUIiwiUkVQTEFDRSIsIlBST0JFX1VOS05PV05fQUNUSU9OIiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsInByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJtaW5pS2luZE9mIiwidmFsIiwiaXNBcnJheSIsInRvRGF0ZVN0cmluZyIsImdldERhdGUiLCJzZXREYXRlIiwiaXNEYXRlIiwic3RhY2tUcmFjZUxpbWl0IiwiaXNFcnJvciIsImNvbnN0cnVjdG9yTmFtZSIsImN0b3JOYW1lIiwic2xpY2UiLCJ0b0xvd2VyQ2FzZSIsImtpbmRPZiIsInR5cGVPZlZhbCIsImNyZWF0ZVN0b3JlIiwicmVkdWNlciIsInByZWxvYWRlZFN0YXRlIiwiZW5oYW5jZXIiLCJjdXJyZW50UmVkdWNlciIsImN1cnJlbnRTdGF0ZSIsImN1cnJlbnRMaXN0ZW5lcnMiLCJNYXAiLCJuZXh0TGlzdGVuZXJzIiwibGlzdGVuZXJJZENvdW50ZXIiLCJpc0Rpc3BhdGNoaW5nIiwiZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycyIsImZvckVhY2giLCJsaXN0ZW5lciIsImdldFN0YXRlIiwic3Vic2NyaWJlIiwiaXNTdWJzY3JpYmVkIiwibGlzdGVuZXJJZCIsImRpc3BhdGNoIiwiYWN0aW9uIiwicmVwbGFjZVJlZHVjZXIiLCJuZXh0UmVkdWNlciIsIm91dGVyU3Vic2NyaWJlIiwib2JzZXJ2ZXIiLCJvYnNlcnZlU3RhdGUiLCJvYnNlcnZlckFzT2JzZXJ2ZXIiLCJ1bnN1YnNjcmliZSIsIndhcm5pbmciLCJjb25zb2xlIiwiY29tYmluZVJlZHVjZXJzIiwicmVkdWNlcnMiLCJyZWR1Y2VyS2V5cyIsImtleXMiLCJmaW5hbFJlZHVjZXJzIiwiZmluYWxSZWR1Y2VyS2V5cyIsInVuZXhwZWN0ZWRLZXlDYWNoZSIsInNoYXBlQXNzZXJ0aW9uRXJyb3IiLCJhc3NlcnRSZWR1Y2VyU2hhcGUiLCJ3YXJuaW5nTWVzc2FnZSIsImlucHV0U3RhdGUiLCJhcmd1bWVudE5hbWUiLCJ1bmV4cGVjdGVkS2V5cyIsImZpbHRlciIsImdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UiLCJoYXNDaGFuZ2VkIiwibmV4dFN0YXRlIiwicHJldmlvdXNTdGF0ZUZvcktleSIsIm5leHRTdGF0ZUZvcktleSIsImFjdGlvblR5cGUiLCJTdHJpbmciLCJjb21wb3NlIiwiZnVuY3MiLCJhcmciLCJOT1RISU5HIiwiZm9yIiwiRFJBRlRBQkxFIiwiRFJBRlRfU1RBVEUiLCJwbHVnaW4iLCJ0aGluZyIsImRpZSIsIm1zZyIsImlzRHJhZnQiLCJpc0RyYWZ0YWJsZSIsImlzTWFwIiwiaXNTZXQiLCJvYmplY3RDdG9yU3RyaW5nIiwiY2FjaGVkQ3RvclN0cmluZ3MiLCJXZWFrTWFwIiwiQ3RvciIsImN0b3JTdHJpbmciLCJGdW5jdGlvbiIsImVhY2giLCJpdGVyIiwic3RyaWN0IiwiZ2V0QXJjaHR5cGUiLCJSZWZsZWN0Iiwib3duS2V5cyIsImVudHJ5IiwidHlwZV8iLCJoYXMiLCJwcm9wIiwicHJvcE9yT2xkVmFsdWUiLCJhZGQiLCJ0YXJnZXQiLCJTZXQiLCJsYXRlc3QiLCJjb3B5XyIsImJhc2VfIiwic2hhbGxvd0NvcHkiLCJiYXNlIiwiaXNQbGFpbiIsImRlc2NyaXB0b3JzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlc2MiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJmcmVlemUiLCJkZWVwIiwiaXNGcm96ZW4iLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZG9udE11dGF0ZU1ldGhvZE92ZXJyaWRlIiwiY2xlYXIiLCJjdXJyZW50U2NvcGUiLCJwbHVnaW5zIiwiZ2V0UGx1Z2luIiwicGx1Z2luS2V5IiwiZ2V0Q3VycmVudFNjb3BlIiwidXNlUGF0Y2hlc0luU2NvcGUiLCJzY29wZSIsInBhdGNoTGlzdGVuZXIiLCJwYXRjaGVzXyIsImludmVyc2VQYXRjaGVzXyIsInBhdGNoTGlzdGVuZXJfIiwicmV2b2tlU2NvcGUiLCJsZWF2ZVNjb3BlIiwiZHJhZnRzXyIsInJldm9rZURyYWZ0IiwicGFyZW50XyIsImVudGVyU2NvcGUiLCJpbW1lcjIiLCJpbW1lcl8iLCJjYW5BdXRvRnJlZXplXyIsInVuZmluYWxpemVkRHJhZnRzXyIsImRyYWZ0IiwicmV2b2tlXyIsInJldm9rZWRfIiwicHJvY2Vzc1Jlc3VsdCIsImJhc2VEcmFmdCIsIm1vZGlmaWVkXyIsImZpbmFsaXplIiwibWF5YmVGcmVlemUiLCJnZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18iLCJyb290U2NvcGUiLCJ1c2VTdHJpY3RJdGVyYXRpb24iLCJzaG91bGRVc2VTdHJpY3RJdGVyYXRpb24iLCJjaGlsZFZhbHVlIiwiZmluYWxpemVQcm9wZXJ0eSIsInNjb3BlXyIsImZpbmFsaXplZF8iLCJyZXN1bHRFYWNoIiwiaXNTZXQyIiwiZ2VuZXJhdGVQYXRjaGVzXyIsInBhcmVudFN0YXRlIiwidGFyZ2V0T2JqZWN0Iiwicm9vdFBhdGgiLCJ0YXJnZXRJc1NldCIsImNoaWxkSXNGcm96ZW4iLCJhc3NpZ25lZF8iLCJhdXRvRnJlZXplXyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwib2JqZWN0VHJhcHMiLCJzb3VyY2UiLCJnZXREZXNjcmlwdG9yRnJvbVByb3RvIiwiZHJhZnRfIiwicmVhZFByb3BGcm9tUHJvdG8iLCJwZWVrIiwicHJlcGFyZUNvcHkiLCJjcmVhdGVQcm94eSIsImN1cnJlbnQyIiwieCIsIm1hcmtDaGFuZ2VkIiwiTnVtYmVyIiwiaXNOYU4iLCJkZWxldGVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bmVyIiwiZGVmaW5lUHJvcGVydHkiLCJhcnJheVRyYXBzIiwidXNlU3RyaWN0U2hhbGxvd0NvcHlfIiwiZm4iLCJwYXJzZUludCIsInBhcmVudCIsInByb3h5TWFwXyIsInByb3h5U2V0XyIsImlzTWFudWFsXyIsInRyYXBzIiwicmV2b2tlIiwicHJveHkiLCJQcm94eSIsInJldm9jYWJsZSIsImNyZWF0ZVByb3h5UHJveHkiLCJjdXJyZW50SW1wbCIsImNvcHkiLCJpbW1lciIsInVzZVN0cmljdEl0ZXJhdGlvbl8iLCJwcm9kdWNlIiwicmVjaXBlIiwiZGVmYXVsdEJhc2UiLCJzZWxmIiwiYmFzZTIiLCJoYXNFcnJvciIsImlwIiwicHJvZHVjZVdpdGhQYXRjaGVzIiwicGF0Y2hlcyIsImludmVyc2VQYXRjaGVzIiwiYXV0b0ZyZWV6ZSIsInNldEF1dG9GcmVlemUiLCJ1c2VTdHJpY3RTaGFsbG93Q29weSIsInNldFVzZVN0cmljdFNoYWxsb3dDb3B5Iiwic2V0VXNlU3RyaWN0SXRlcmF0aW9uIiwiY3JlYXRlRHJhZnQiLCJjdXJyZW50IiwiZmluaXNoRHJhZnQiLCJhcHBseVBhdGNoZXMiLCJwYXRjaCIsImFwcGx5UGF0Y2hlc0ltcGwiLCJhcHBseVBhdGNoZXNfIiwiY3JlYXRlVGh1bmtNaWRkbGV3YXJlIiwiZXh0cmFBcmd1bWVudCIsInRodW5rIiwid2l0aEV4dHJhQXJndW1lbnQiLCJjb21wb3NlV2l0aERldlRvb2xzIiwiX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fIiwiaXNBY3Rpb25DcmVhdG9yIiwibWF0Y2giLCJnZXRUaW1lTWVhc3VyZVV0aWxzIiwibWF4RGVsYXkiLCJmbk5hbWUiLCJlbGFwc2VkIiwibWVhc3VyZVRpbWUiLCJzdGFydGVkIiwiZmluaXNoZWQiLCJ3YXJuSWZFeGNlZWRlZCIsIlR1cGxlIiwiX1R1cGxlIiwiaXRlbXMiLCJzdXBlciIsInNwZWNpZXMiLCJhcnIiLCJwcmVwZW5kIiwiaXNJbW11dGFibGVEZWZhdWx0IiwidHJhY2tGb3JNdXRhdGlvbnMiLCJpc0ltbXV0YWJsZSIsImlnbm9yZVBhdGhzIiwidHJhY2tlZFByb3BlcnRpZXMiLCJ0cmFja1Byb3BlcnRpZXMiLCJkZXRlY3RNdXRhdGlvbnMiLCJjaGVja2VkT2JqZWN0cyIsInRyYWNrZWQiLCJjaGlsZFBhdGgiLCJpbmRleE9mIiwiaWdub3JlZFBhdGhzIiwidHJhY2tlZFByb3BlcnR5Iiwic2FtZVBhcmVudFJlZiIsInByZXZPYmoiLCJzYW1lUmVmIiwid2FzTXV0YXRlZCIsImtleXNUb0RldGVjdCIsImhhc0lnbm9yZWRQYXRocyIsIm5lc3RlZFBhdGgiLCJpZ25vcmVkIiwiUmVnRXhwIiwidGVzdCIsImZpbmROb25TZXJpYWxpemFibGVWYWx1ZSIsImlzU2VyaWFsaXphYmxlIiwiZ2V0RW50cmllcyIsImNhY2hlIiwiZm91bmROZXN0ZWRTZXJpYWxpemFibGUiLCJrZXlQYXRoIiwibmVzdGVkVmFsdWUiLCJpc05lc3RlZEZyb3plbiIsImNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSIsIm9wdGlvbnMiLCJpZ25vcmVkQWN0aW9ucyIsImlnbm9yZWRBY3Rpb25QYXRocyIsIndhcm5BZnRlciIsImlnbm9yZVN0YXRlIiwiaWdub3JlQWN0aW9ucyIsImRpc2FibGVDYWNoZSIsIldlYWtTZXQiLCJzdG9yZUFQSSIsImlzQWN0aW9uIiwibWVhc3VyZVV0aWxzIiwiZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSIsImZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSIsImlzQm9vbGVhbiIsImJ1aWxkR2V0RGVmYXVsdE1pZGRsZXdhcmUiLCJpbW11dGFibGVDaGVjayIsInNlcmlhbGl6YWJsZUNoZWNrIiwiYWN0aW9uQ3JlYXRvckNoZWNrIiwibWlkZGxld2FyZUFycmF5IiwidGh1bmtNaWRkbGV3YXJlIiwiaW1tdXRhYmxlT3B0aW9ucyIsInVuc2hpZnQiLCJzdHJpbmdpZnkyIiwic2VyaWFsaXplciIsImluZGVudCIsImRlY3ljbGVyIiwiZ2V0U2VyaWFsaXplMiIsInN0YWNrIiwidGhpc1BvcyIsInNwbGljZSIsIkluZmluaXR5IiwidHJhY2siLCJ0cmFja2VyIiwiZGlzcGF0Y2hlZEFjdGlvbiIsImNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSIsInNlcmlhbGl6YWJsZU9wdGlvbnMiLCJhY3Rpb25DcmVhdG9yT3B0aW9ucyIsImlzQWN0aW9uQ3JlYXRvcjIiLCJjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZSIsImNyZWF0ZVF1ZXVlV2l0aFRpbWVyIiwidGltZW91dCIsIm5vdGlmeSIsInNldFRpbWVvdXQiLCJidWlsZEdldERlZmF1bHRFbmhhbmNlcnMiLCJtaWRkbGV3YXJlRW5oYW5jZXIiLCJhdXRvQmF0Y2giLCJlbmhhbmNlckFycmF5Iiwic3RvcmUiLCJub3RpZnlpbmciLCJzaG91bGROb3RpZnlBdEVuZE9mVGljayIsIm5vdGlmaWNhdGlvblF1ZXVlZCIsImxpc3RlbmVycyIsInF1ZXVlQ2FsbGJhY2siLCJxdWV1ZU1pY3JvdGFzayIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInF1ZXVlTm90aWZpY2F0aW9uIiwibm90aWZ5TGlzdGVuZXJzIiwibCIsImxpc3RlbmVyMiIsIm1ldGEiLCJhdXRvQmF0Y2hFbmhhbmNlciIsImNvbmZpZ3VyZVN0b3JlIiwiZ2V0RGVmYXVsdE1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlIiwiZGV2VG9vbHMiLCJkdXBsaWNhdGVNaWRkbGV3YXJlQ2hlY2siLCJlbmhhbmNlcnMiLCJyb290UmVkdWNlciIsImZpbmFsTWlkZGxld2FyZSIsIm1pZGRsZXdhcmVSZWZlcmVuY2VzIiwibWlkZGxld2FyZTIiLCJmaW5hbENvbXBvc2UiLCJ0cmFjZSIsIm1pZGRsZXdhcmVzIiwiY3JlYXRlU3RvcmUyIiwibWlkZGxld2FyZUFQSSIsImNoYWluIiwiYXBwbHlNaWRkbGV3YXJlIiwiZ2V0RGVmYXVsdEVuaGFuY2VycyIsInN0b3JlRW5oYW5jZXJzIiwiU25hY2tiYXJDb250ZXh0IiwiU25hY2tiYXJQcm92aWRlciIsInNob3dTbmFja2JhciIsIlNuYWNrYmFyIiwiYXV0b0hpZGVEdXJhdGlvbiIsIlByb3ZpZGVycyIsImJhc2VuYW1lIiwicXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudCIsImRlZmF1bHRPcHRpb25zIiwicXVlcmllcyIsInJlZmV0Y2hPbldpbmRvd0ZvY3VzIiwicmV0cnkiLCJ1c2VFcnJvckJvdW5kYXJ5IiwiYmFzZU5hbWUiLCJvcmlnaW4iLCJCcm93c2VyUm91dGVyIiwiUXVlcnlDbGllbnRQcm92aWRlciIsImRlZmF1bHRDb25maXJtRGlhbG9nU3RhdGUiLCJ1c2VDb25maXJtIiwicmVzZXREaWFsb2ciLCJEZXBhcnRtZW50TW9uZ29NdWx0aVNlbGVjdG9yIiwiTXVsdGlTZWxlY3QiLCJkYkxhYmVsUHJvcHMiLCJsYWJlbEtleSIsInN1YkxhYmVsS2V5IiwidXNlU3ViTGFiZWxTdGFydENhc2UiLCJkYlZhbHVlUHJvcHMiLCJ2YWx1ZUtleSIsImlzT2JqZWN0SWQiLCJleHRlcm5hbEF4aW9zIiwib3B0aW9uc0FwaUVuZFBvaW50IiwiRGVwYXJ0bWVudFNxbE11bHRpU2VsZWN0b3IiLCJpc0ludCIsIkJhdGNoU2VsZWN0b3IiLCJTaW5nbGVTZWxlY3QiLCJDb3Vyc2VTZWxlY3RvciIsIkRlcGFydG1lbnRTZWxlY3RvciIsIkVtcGxveWVlc1NlbGVjdG9yIiwiRXhhbXNSZWd1bGF0aW9uU2VsZWN0b3IiLCJleGFtVHlwZU9wdGlvbnMiLCJFeGFtVHlwZVNlbGVjdG9yIiwiRmVlVHlwZXMiLCJ5ZWFycyIsImZyb20iLCJnZXRGdWxsWWVhciIsIkZlZVR5cGVTZWxlY3RvciIsIkhvc3RlbEJsb2NrU2VsZWN0b3IiLCJ1c2VMYWJlbFN0YXJ0Q2FzZSIsIkhvc3RlbEZsb29yU2VsZWN0b3IiLCJIb3N0ZWxSb29tU2VsZWN0b3IiLCJNb250aFllYXJTZWxlY3RvciIsIlByaW50Rm9ybWF0U2VsZWN0b3IiLCJQcm9ncmFtU2VsZWN0b3IiLCJSZWd1bGF0aW9uU2VsZWN0b3IiLCJSZXNlYXJjaEV4cGVydERlc2lnbmF0aW9uU2VsZWN0b3IiLCJSZXNlYXJjaEV4cGVydFNlbGVjdG9yIiwiUmVzZWFyY2hTdGFnZVNlbGVjdG9yIiwiU2VtZXN0ZXJTZWxlY3RvciIsIlN0dWRlbnRTZWxlY3RvciIsIlN0dWRlbnRTZXJ2aWNlc1NlbGVjdG9yIiwiWWVhclJhbmdlU2VsZWN0b3IiLCJzdWZmaXgiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJfX3Jlc3QiLCJ5ZWFyIiwib3BlbkluTmV3VGFiIiwicGF0aEFmdGVyQmFzZSIsImV4Y2x1ZGVJbnN0aXR1dGlvbiIsImV4Y2x1ZGVXb3Jrc3BhY2UiLCJzZWdtZW50cyIsImJhc2VQYXJ0cyIsImZ1bGxQYXRoIiwiRXhvdGVsU2VydmljZSIsImV4b3RlbFNESyIsIndlYlBob25lIiwiY2FsbExpc3RlbmVycyIsInJlZ2lzdGVyTGlzdGVuZXJzIiwic2Vzc2lvbkxpc3RlbmVycyIsImhhbmRsZUNhbGxFdmVudCIsImV2ZW50IiwiY2FsbERhdGEiLCJoYW5kbGVSZWdpc3RlckV2ZW50IiwiaGFuZGxlU2Vzc2lvbkV2ZW50IiwiZ2V0SW5zdGFuY2UiLCJpbnN0YW5jZSIsImluaXRpYWxpemUiLCJhY2Nlc3NUb2tlbl8xIiwiYWdlbnRVc2VySWRfMSIsImFjY2Vzc1Rva2VuIiwiYWdlbnRVc2VySWQiLCJhdXRvQ29ubmVjdFZPSVAiLCJwaG9uZSIsImNoZWNrQXVkaW9QZXJtaXNzaW9ucyIsIkV4b3RlbENSTVdlYlNESyIsIkluaXRpYWxpemUiLCJkZXZpY2VzIiwicGVybWlzc2lvblN0YXR1c18xIiwibWVkaWFEZXZpY2VzIiwiZW51bWVyYXRlRGV2aWNlcyIsImRldmljZSIsImtpbmQiLCJvbmNoYW5nZSIsInJlcXVlc3RNaWNyb3Bob25lQWNjZXNzIiwiZ2V0VXNlck1lZGlhIiwiYXVkaW8iLCJnZXRUcmFja3MiLCJzdG9wIiwibWFrZUNhbGwiLCJwaG9uZU51bWJlciIsIk1ha2VDYWxsIiwiYWNjZXB0Q2FsbCIsIkFjY2VwdENhbGwiLCJoYW5ndXBDYWxsIiwiSGFuZ3VwQ2FsbCIsInJlamVjdENhbGwiLCJ0b2dnbGVIb2xkIiwiVG9nZ2xlSG9sZCIsInRvZ2dsZU11dGUiLCJUb2dnbGVNdXRlIiwic2VuZERUTUYiLCJkaWdpdCIsIlNlbmREVE1GIiwicmVnaXN0ZXJEZXZpY2UiLCJSZWdpc3RlckRldmljZSIsInVucmVnaXN0ZXJEZXZpY2UiLCJVblJlZ2lzdGVyRGV2aWNlIiwiZ2V0UGVybWlzc2lvblN0YXR1cyIsImFkZENhbGxMaXN0ZW5lciIsInJlbW92ZUNhbGxMaXN0ZW5lciIsImFkZFJlZ2lzdGVyTGlzdGVuZXIiLCJyZW1vdmVSZWdpc3Rlckxpc3RlbmVyIiwiYWRkU2Vzc2lvbkxpc3RlbmVyIiwicmVtb3ZlU2Vzc2lvbkxpc3RlbmVyIiwiY2hlY2tWb0lQRW5hYmxlZCIsImVuYWJsZWRWb2ljZUNvbmZpZyIsImVuYWJsZVZvaWNlIiwidm9pY2VDb25maWdzIiwiZmluZCIsInZjIiwiaXNFbmFibGVkIiwiZW5hYmxlZCIsImhhc1ZhbGlkVG9rZW4iLCJFWE9URUwiLCJ0b2tlbkV4cGlyZXNBdCIsImdldEFjdGl2ZVZvaWNlVG9rZW4iLCJjcmVhdGVFeG90ZWxBcHBUb2tlbiIsInRva2VuRGF0YSIsIkRhdGEiLCJpbml0aWF0ZUNhbGxBY3Rpdml0eSIsImlucHV0IiwicmVnaXN0ZXJJbmNvbWluZ0NhbGwiLCJmZXRjaENhbGxIaXN0b3J5IiwicHJvc3BlY3RJZCIsImdldENhbGxBY3Rpdml0eUJ5SWQiLCJpZCIsImdldENhbGxBY3Rpdml0eUJ5Q2FsbFNpZCIsImNhbGxTaWQiLCJnZXRDYWxsQ291bnRCeVByb3NwZWN0IiwiY291bnQiLCJzYXZlQ2FsbERpc3Bvc2l0aW9uIiwicmVxdWVzdEJvZHkiLCJjYWxsU3RhdHVzRGlzcG9zaXRpb24iLCJkaXNwb3NpdGlvbkNhdGVnb3J5IiwicHJvc3BlY3RTdGF0dXMiLCJkaXNwb3NpdGlvbk5vdGVzIiwiY2FsbGJhY2tTY2hlZHVsZWRBdCIsImNhbGxJZCIsImNhbmNlbENhbGwiLCJFWE9URUxfQ09OVEVYVF9LRVkiLCJpbml0aWFsQ2FsbFN0YXRlIiwicGhhc2UiLCJpc09uSG9sZCIsImlzTXV0ZWQiLCJpc1NwZWFrZXJPZmYiLCJjYWxsRGlyZWN0aW9uIiwiY2FsbFN0YXJ0VGltZSIsImNhbGxEdXJhdGlvbiIsImNhbGxlck5hbWUiLCJjYWxsZXJOdW1iZXIiLCJjYWxsQWN0aXZpdHlJZCIsImV4b3RlbENhbGxTaWQiLCJwcm9zcGVjdFVuaXF1ZUlkIiwid2FzQWNjZXB0ZWQiLCJtYXNrTW9iaWxlIiwibW9iaWxlIiwicHJlZml4IiwibnVtYmVyIiwic3RhcnRzV2l0aCIsImNsZWFuZWQiLCJyZXBlYXQiLCJFeG90ZWxDb250ZXh0IiwiRXhvdGVsUHJvdmlkZXIiLCJkZWZhdWx0Q2FsbGVyTmFtZSIsImlzSW5pdGlhbGl6ZWQiLCJzZXRJc0luaXRpYWxpemVkIiwiaXNDb25uZWN0ZWQiLCJzZXRJc0Nvbm5lY3RlZCIsInNldFBlcm1pc3Npb25TdGF0dXMiLCJjYWxsU3RhdGUiLCJzZXRDYWxsU3RhdGUiLCJkaXNwb3NpdGlvbkRhdGEiLCJzZXREaXNwb3NpdGlvbkRhdGEiLCJ0aW1lclJlZiIsInVzZVJlZiIsImNhbGxTdGF0ZVJlZiIsImV4b3RlbFNlcnZpY2UiLCJzZXRJbnRlcnZhbCIsInByZXYiLCJjbGVhckludGVydmFsIiwicmVxdWVzdFBlcm1pc3Npb24iLCJjYXRjaCIsInN1Y2Nlc3MiLCJpbmNvbWluZ051bWJlcl8xIiwiY2FsbEZyb21OdW1iZXIiLCJyZW1vdGVJZCIsInJlbW90ZURpc3BsYXlOYW1lIiwic2Vzc2lvbklkIiwiZnJvbU51bWJlciIsInRvTnVtYmVyIiwicHJvc3BlY3RNb2JpbGUiLCJwcm9zcGVjdCIsInVuaXF1ZUlkIiwiZGlzcG9zaXRpb25EYXRhT2JqIiwiZXhvdGVsQ2FsbElkIiwidXNlQ2FsbGJhY2siLCJtYXNrZWROdW1iZXIiLCJlcnJvcl8yIiwidG9nZ2xlU3BlYWtlciIsImNsZWFyRGlzcG9zaXRpb24iLCJzZXRDYWxsQWN0aXZpdHlJZEZuIiwic2V0RXhvdGVsQ2FsbFNpZEZuIiwic2V0Q2FsbEFjdGl2aXR5SWQiLCJzZXRFeG90ZWxDYWxsU2lkIiwidXNlRXhvdGVsIiwidXNlQ29udGV4dCIsInVzZUV4b3RlbFNhZmUiLCJFWE9URUxfQ09OU1RBTlRTIiwiQ0FMTF9TVEFUVVNfT1BUSU9OUyIsIkNPTk5FQ1RFRF9ESVNQT1NJVElPTlMiLCJOT1RfQ09OTkVDVEVEX0RJU1BPU0lUSU9OUyIsIkNhbGxEaXNwb3NpdGlvbkZvcm0iLCJvblNhdmUiLCJleGlzdGluZ0RhdGEiLCJ1c2VRdWVyeUNsaWVudCIsImlzRWRpdE1vZGUiLCJjYWxsU3RhdHVzIiwic2V0Q2FsbFN0YXR1cyIsInNldERpc3Bvc2l0aW9uQ2F0ZWdvcnkiLCJyZW1hcmtzIiwic2V0UmVtYXJrcyIsImludmFsaWRhdGVRdWVyaWVzIiwiaGFuZGxlQ2FsbFN0YXR1c0NoYW5nZSIsImhhbmRsZURpc3Bvc2l0aW9uQ2hhbmdlIiwic3VibWl0RGF0YSIsImNoYW5uZWwiLCJkaXJlY3Rpb24iLCJkdXJhdGlvbiIsImRpc3Bvc2l0aW9uT3B0aW9ucyIsIm1heFdpZHRoIiwiVHlwb2dyYXBoeSIsInNlY29uZHMiLCJtaW5zIiwic2VjcyIsIlJhZGlvR3JvdXAiLCJUZXh0YXJlYSIsInJvd3MiLCJFeG90ZWxQaG9uZSIsInByb3NwZWN0TmFtZSIsInByb3NwZWN0TnVtYmVyIiwib25TYXZlRGlzcG9zaXRpb24iLCJpc0FjY2VwdGluZyIsInNldElzQWNjZXB0aW5nIiwiaXNEZWNsaW5pbmciLCJzZXRJc0RlY2xpbmluZyIsImRlY2xpbmVUaW1lb3V0UmVmIiwic3R5bGVJZCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJzdHlsZUVsIiwidGV4dENvbnRlbnQiLCJoZWFkIiwiYXBwZW5kQ2hpbGQiLCJzZGtDYWxsZXJOYW1lIiwic2RrQ2FsbGVyTnVtYmVyIiwiZGlzcGxheU5hbWUiLCJkaXNwbGF5TnVtYmVyIiwiaGFuZGxlRGVjbGluZUNhbGwiLCJjYWxsU2lkRm9yQXBpIiwicmVhc29uIiwiY2xlYXJUaW1lb3V0IiwiZmluYWxDYWxsZXJOYW1lIiwiZW5yaWNoZWREaXNwb3NpdGlvbkRhdGEiLCJpc091dGJvdW5kIiwiaXNJbmJvdW5kIiwiYXZhdGFyQmdDb2xvciIsImdldENvbm5lY3RpbmdUZXh0IiwibW9kYWxDb250ZW50Iiwic3R5bGUiLCJ6SW5kZXgiLCJib3JkZXJSYWRpdXMiLCJib3JkZXIiLCJzdG9wUHJvcGFnYXRpb24iLCJYIiwiUGhvbmVPdXRnb2luZyIsIlBob25lSW5jb21pbmciLCJQaG9uZSIsInBhZFN0YXJ0IiwiZ2V0U3RhdHVzVGV4dCIsIk1pY09mZiIsIk1pYyIsIlBsYXkiLCJQYXVzZSIsIlZvbHVtZVgiLCJWb2x1bWUyIiwiUGhvbmVPZmYiLCJiYWNrZ3JvdW5kQ29sb3IiLCJjcmVhdGVQb3J0YWwiLCJDcnlwdG9TZXJ2aWNlIiwiYWxnb3JpdGhtIiwic2VjcmV0S2V5IiwiaW5pdGlhbGl6ZWQiLCJlbnN1cmVJbml0aWFsaXplZCIsImtleUJ1ZmZlciIsIlRleHRFbmNvZGVyIiwiZW5jb2RlIiwic2FsdEJ1ZmZlciIsInN5bmNTY3J5cHQiLCJkZWNyeXB0RGF0YSIsImVuY3J5cHRlZERhdGEiLCJpdkhleCIsImVuY3J5cHRlZCIsImNyeXB0b18xIiwicmVxdWlyZSIsIml2IiwiQnVmZmVyIiwiZGVjaXBoZXIiLCJjcmVhdGVEZWNpcGhlcml2IiwiZGVjcnlwdGVkIiwiZmluYWwiLCJDYWxsQnV0dG9uIiwiZW5jcnlwdGVkUGhvbmVOdW1iZXIiLCJleG90ZWwiLCJpc0RpYWxpbmciLCJzZXRJc0RpYWxpbmciLCJzZXRFcnJvciIsImlzQ2FsbEluUHJvZ3Jlc3MiLCJoYXNQaG9uZU51bWJlciIsImFjdHVhbFBob25lTnVtYmVyIiwic2RrUmVzcG9uc2UiLCJlcnJfMSIsImVycm9yTWVzc2FnZSIsImVycm9yRGV0YWlscyIsImRlc2NyaXB0aW9uIiwiQ2FsbFNpZCIsIkNvZGUiLCJTdGF0dXMiLCJwYXJzZUVyciIsImVycm9yX2RhdGEiLCJNaWNyb3Bob25lUGVybWlzc2lvbiIsIm9uUGVybWlzc2lvbkdyYW50ZWQiLCJvblBlcm1pc3Npb25EZW5pZWQiLCJpc1JlcXVlc3RpbmciLCJzZXRJc1JlcXVlc3RpbmciLCJBbGVydENpcmNsZSIsIkV4b3RlbFdyYXBwZXIiLCJzZXRBY2Nlc3NUb2tlbiIsInNldElzTG9hZGluZyIsIlZvSVBQcm92aWRlciIsImlzV29ya3NwYWNlVm9JUEVuYWJsZWQiLCJoYXNBZ2VudFVzZXJJZCIsImhhbmRsZVNhdmVEaXNwb3NpdGlvbiIsImRpc3Bvc2l0aW9uUmVhc29uIl0sIm1hcHBpbmdzIjoiODZDQStCTyxJQUFJQSxHQUFXLFdBUWxCLE9BUEFBLEdBQVdDLE9BQU9DLFFBQVUsU0FBa0JDLEdBQzFDLElBQUssSUFBSUMsRUFBR0MsRUFBSSxFQUFHQyxFQUFJQyxVQUFVQyxPQUFRSCxFQUFJQyxFQUFHRCxJQUU1QyxJQUFLLElBQUlJLEtBRFRMLEVBQUlHLFVBQVVGLEdBQ09KLE9BQU9TLFVBQVVDLGVBQWVDLEtBQUtSLEVBQUdLLEtBQUlOLEVBQUVNLEdBQUtMLEVBQUVLLElBRTlFLE9BQU9OLENBQ1gsRUFDT0gsR0FBU2EsTUFBTUMsS0FBTVAsVUFDaEMsRUEwRU8sU0FBU1EsR0FBVUMsRUFBU0MsRUFBWUMsRUFBR0MsR0FFOUMsT0FBTyxJQUFLRCxJQUFNQSxFQUFJRSxVQUFVLFNBQVVDLEVBQVNDLEdBQy9DLFNBQVNDLEVBQVVDLEdBQVMsSUFBTUMsRUFBS04sRUFBVU8sS0FBS0YsR0FBUyxDQUFFLE1BQU9HLEdBQUtMLEVBQU9LLEVBQUksQ0FBRSxDQUMxRixTQUFTQyxFQUFTSixHQUFTLElBQU1DLEVBQUtOLEVBQWlCLE1BQUVLLEdBQVMsQ0FBRSxNQUFPRyxHQUFLTCxFQUFPSyxFQUFJLENBQUUsQ0FDN0YsU0FBU0YsRUFBS0ksR0FKbEIsSUFBZUwsRUFJYUssRUFBT0MsS0FBT1QsRUFBUVEsRUFBT0wsUUFKMUNBLEVBSXlESyxFQUFPTCxNQUpoREEsYUFBaUJOLEVBQUlNLEVBQVEsSUFBSU4sRUFBRSxTQUFVRyxHQUFXQSxFQUFRRyxFQUFRLElBSWpCTyxLQUFLUixFQUFXSyxFQUFXLENBQzdHSCxHQUFNTixFQUFZQSxFQUFVTixNQUFNRyxFQUFTQyxHQUFjLEtBQUtTLE9BQ2xFLEVB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LEVBQVl0dUIsRUFBRzlGLGFBQ2tDLEVBQVNvMEIsRUFBVXJqQixPQUNsRWd4QixFQUFlM04sRUFBVXJqQixPQUd6QjJ2QixFQUFTLHFDQUVKLENBQUMsRUFBYSxHQUN2QixLQUFLLEVBSUgsT0FIQUssRUFBUWo3QixFQUFHOUYsT0FFWDBnQyxFQUFTSyxFQUFNNS9CLFNBQVcsZ0NBQ25CLENBQUMsRUFBYSxHQUN2QixLQUFLLEVBRUgsT0FEQTZnQyxHQUFhLEdBQ04sQ0FBQyxHQUNWLEtBQUssRUFDSCxNQUFPLENBQUMsR0FFZCxFQUNGLEVBekNGLE1BRkVBLEdBQWEsRUE4Q2pCLEVBQUcsQ0FBQ0UsRUFBd0JDLElBRXZCRCxHQUEyQkMsRUFNNUJqeEIsR0FBYW5LLElBQVUycEIsRUFDbEI5bkIsRUFBSzRLLEVBQVcsQ0FDckJyTCxTQUFVQSxJQUlQRyxFQUFNMnVCLEdBQWdCLENBQzNCdkcsWUFBYUEsRUFDYkMsWUFBYUEsRUFDYkMsaUJBQWlCLEVBQ2pCem9CLFNBQVUsQ0FBQ0EsRUFBVVMsRUFBS2d6QixHQUFhLENBQ3JDbEgsV0FBWUEsRUFDWm1ILGFBQWNBLEVBQ2RDLGVBQWdCQSxFQUNoQkMsa0JBQW1CcUcsT0FuQmR4NUIsRUFBSzRLLEVBQVcsQ0FDckJyTCxTQUFVQSxHQXFCaEIiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCw5LDEwLDExLDEyLDE1LDE2LDE3LDE4XX0=
|
|
1
|
+
import e from"axios";import t from"js-cookie";import{Store as n}from"pullstate";import r from"crypto-js";import{jsxs as o,jsx as i,Fragment as a}from"react/jsx-runtime";import{ConfirmDialog as s,Icons as c,TextField as l,PasswordField as u,Button as d,ResourceNotFound as p,InternalServerError as f,NoInterneConnection as h,UnAuthorized as m,Dialog as v,Snackbar as b,MultiSelect as y,SingleSelect as g,Typography as w,RadioGroup as _,Textarea as N}from"@campxdev/react-blueprint";import*as E from"react";import{createContext as x,useState as k,useEffect as S,useRef as O,useCallback as C,useContext as D}from"react";import{useMutation as P,QueryErrorResetBoundary as I,QueryClient as A,QueryClientProvider as j,useQueryClient as T}from"react-query";import{useNavigate as L,useLocation as V,BrowserRouter as M}from"react-router-dom";export{BrowserRouter}from"react-router-dom";import{validateFieldsNatively as R,toNestError as K}from"@hookform/resolvers";import{appendErrors as F,useForm as z,Controller as U}from"react-hook-form";import q from"device-detector-js";import*as $ from"yup";import{Provider as B}from"react-redux";import W from"@exotel-npm-dev/exotel-ip-calling-crm-websdk";import{X as H,PhoneOutgoing as Y,PhoneIncoming as X,Phone as J,MicOff as G,Mic as Q,Play as Z,Pause as ee,VolumeX as te,Volume2 as ne,PhoneOff as re,AlertCircle as oe}from"lucide-react";import{createPortal as ie}from"react-dom";import{syncScrypt as ae}from"scrypt-js";var se=function(){return se=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},se.apply(this,arguments)};function ce(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(a,s)}c((r=r.apply(e,t||[])).next())})}function le(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=s(0),a.throw=s(1),a.return=s(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(c){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],r=0}finally{n=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,c])}}}"function"==typeof SuppressedError&&SuppressedError;var ue={isLoginDialogOpen:!1,snackbar:{open:!1,message:"",severity:"success"},confirmDialog:{isOpen:!1,title:"",message:"",onConfirm:function(){},onCancel:function(){},type:"confirm"},user:void 0,institutionInfo:void 0,asset:void 0},de=new n(ue);function pe(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function fe(e,t){var n={clientId:e,iat:Math.floor(Date.now()/1e3)},o=pe(btoa(JSON.stringify(n))),i=r.HmacSHA256(o,t),a=pe(r.enc.Base64.stringify(i));return"".concat(o,".").concat(a)}var he=window.location.hostname.includes("localhost"),me=window.location.hostname.split(".")[0].split("--")[0],ve=window.location.pathname.split("/")[1],be=window.location.pathname.split("/")[2],ye={"student-workspace":"/student-api","faculty-workspace":"/faculty-api","department-workspace":"/department-api","academic-coordinator-workspace":"/academic-coordinator-api","feedback-coordinator-workspace":"/feedback-coordinator-api","course-coordinator-workspace":"/course-coordinator-api","classroom-coordinator-workspace":"/classroom-coordinator-api","coe-workspace":"/coe-api","academic-admin-workspace":"/academic-admin-api","hostel-admin-workspace":"/hostel-admin-api","transport-coordinator-workspace":"/transport-coordinator-api","employee-workspace":"/employee-api","librarian-workspace":"/librarian-api","fee-terminal":"/fee-terminal-api","accounts-officer-workspace":"accounts-officer-api","finance-officer-workspace":"/finance-officer-api","outreach-agent-workspace":"outreach-agent-api","prospect-workspace":"prospect-api","external-expert-workspace":"external-expert-api","research-coordinator-workspace":"research-coordinator-api","tele-counsellor-workspace":"tele-counsellor-api","team-owner-workspace":"/team-owner-api","admissions-counsellor-workspace":"/admissions-counsellor-api","admissions-officer-workspace":"/admissions-officer-api","admissions-director-workspace":"/admissions-director-api","helpdesk-workspace":"/helpdesk-api"},ge=e.create({baseURL:process.env.REACT_APP_API_HOST||"/api",withCredentials:!0,headers:{"x-tenant-id":me,"x-institution-code":ve}});function we(e,t,n){return n.reduce(function(n,r){var o=e[r];return o&&(n[r]=se({singleton:!0,requiredVersion:o,version:o.replace(/^[\^~]/,"")},t.includes(r)?{eager:!0}:{})),n},{})}ge.interceptors.request.use(function(e){var n=function(e){return Object.fromEntries(Object.entries(null!=e?e:{}).map(function(e){var t=e[0],n=e[1];return[t,"__empty__"===n?"":n]}))}(null==e?void 0:e.params);if(!1!==e.workspace&&be&&ye[be]&&"common-workspace"!==be){var r=ye[be];e.url="".concat(r).concat(e.url)}var o=t.get("campx_session_key"),i=t.get("campx_open_payments_key"),a=t.get("campx_student_key");he&&o&&e.headers.set("campx_session_key",o),he&&a&&e.headers.set("campx_student_key",a),i&&e.headers.set("campx_open_payments_key",i);var s=process.env.REACT_APP_CLIENT_ID,c=process.env.REACT_APP_CAMPX_CLIENT_SECRET;return s&&c&&e.headers.set("x-campx-client",fe(s,c)),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),se(se({},e),{params:n})},function(e){return Promise.reject(e)}),ge.interceptors.response.use(function(e){var t;return!(!0===(null===(t=e.data)||void 0===t?void 0:t.hideSnackbar))&&e.config.method&&["put","post","delete","patch"].includes(e.config.method)&&[200,201,202].includes(e.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.data.message||"Operation successful",t.snackbar.severity="success"}),e},function(e){var t,n,r,o,i=!0===(null===(n=null===(t=e.response)||void 0===t?void 0:t.data)||void 0===n?void 0:n.hideSnackbar);return!i&&[400,422,413].includes(null===(r=e.response)||void 0===r?void 0:r.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Bad Request",t.snackbar.severity="error"}),!i&&(null===(o=e.response)||void 0===o?void 0:o.config.method)&&["put","post","delete","patch"].includes(e.response.config.method)&&[404].includes(e.response.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var _e=e.create({baseURL:process.env.REACT_APP_API_HOST||"/api",withCredentials:!0,workspace:!1,headers:{"x-tenant-id":me,"x-institution-code":ve}});_e.interceptors.request.use(function(e){var n=function(e){return Object.fromEntries(Object.entries(null!=e?e:{}).map(function(e){var t=e[0],n=e[1];return[t,"__empty__"===n?"":n]}))}(null==e?void 0:e.params),r=t.get("campx_session_key"),o=t.get("campx_open_payments_key"),i=t.get("campx_student_key");he&&r&&e.headers.set("campx_session_key",r),he&&i&&e.headers.set("campx_student_key",i),o&&e.headers.set("campx_open_payments_key",o);var a=process.env.REACT_APP_CLIENT_ID,s=process.env.REACT_APP_CAMPX_CLIENT_SECRET;return a&&s&&e.headers.set("x-campx-client",fe(a,s)),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),se(se({},e),{params:n})},function(e){return Promise.reject(e)}),_e.interceptors.response.use(function(e){var t;return!(!0===(null===(t=e.data)||void 0===t?void 0:t.hideSnackbar))&&e.config.method&&["put","post","delete","patch"].includes(e.config.method)&&[200,201,202].includes(e.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.data.message||"Operation successful",t.snackbar.severity="success"}),e},function(e){var t,n,r,o,i=!0===(null===(n=null===(t=e.response)||void 0===t?void 0:t.data)||void 0===n?void 0:n.hideSnackbar);return!i&&[400,422].includes(null===(r=e.response)||void 0===r?void 0:r.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Bad Request",t.snackbar.severity="error"}),!i&&(null===(o=e.response)||void 0===o?void 0:o.config.method)&&["put","post","delete","patch"].includes(e.response.config.method)&&[404].includes(e.response.status)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var Ne=["admissions-director-workspace","admissions-counsellor-workspace","admissions-officer-workspace","tele-counsellor-workspace"];function Ee(e){return Ne.includes(e)}var xe=x({showConfirmDialog:function(){}}),ke=function(e){var t=e.children,n=de.useState(function(e){return e.confirmDialog}),r=function(){de.update(function(e){e.confirmDialog.isOpen=!1})};return o(xe.Provider,{value:{showConfirmDialog:function(e,t,n,r,o,i,a){void 0===o&&(o="confirm"),de.update(function(s){s.confirmDialog={isOpen:!0,title:e,message:t,onConfirm:n,onCancel:r,type:o,confirmButtonText:i,cancelButtonText:a}})}},children:[t,i(s,{open:n.isOpen,title:n.title,message:n.message,variant:n.type,confirmText:n.confirmButtonText,cancelText:n.cancelButtonText,onConfirm:function(){n.onConfirm(),r()},onClose:function(){n.onCancel(),r()}})]})};function Se(e,t){return Se=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Se(e,t)}var Oe={error:null},Ce=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).state=Oe,t.resetErrorBoundary=function(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];null==t.props.onReset||(e=t.props).onReset.apply(e,r),t.reset()},t}!function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,Se(e,t)}(t,e),t.getDerivedStateFromError=function(e){return{error:e}};var n=t.prototype;return n.reset=function(){this.setState(Oe)},n.componentDidCatch=function(e,t){var n,r;null==(n=(r=this.props).onError)||n.call(r,e,t)},n.componentDidUpdate=function(e,t){var n,r,o,i,a=this.state.error,s=this.props.resetKeys;null!==a&&null!==t.error&&(void 0===(o=e.resetKeys)&&(o=[]),void 0===(i=s)&&(i=[]),o.length!==i.length||o.some(function(e,t){return!Object.is(e,i[t])}))&&(null==(n=(r=this.props).onResetKeysChange)||n.call(r,e.resetKeys,s),this.reset())},n.render=function(){var e=this.state.error,t=this.props,n=t.fallbackRender,r=t.FallbackComponent,o=t.fallback;if(null!==e){var i={error:e,resetErrorBoundary:this.resetErrorBoundary};if(E.isValidElement(o))return o;if("function"==typeof n)return n(i);if(r)return E.createElement(r,i);throw new Error("react-error-boundary requires either a fallback, fallbackRender, or FallbackComponent prop")}return this.props.children},t}(E.Component),De=function(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),function(r,o,i){try{return Promise.resolve(function(a,s){try{var c=(t.context&&process.env.NODE_ENV,Promise.resolve(e["sync"===n.mode?"validateSync":"validate"](r,Object.assign({abortEarly:!1},t,{context:o}))).then(function(e){return i.shouldUseNativeValidation&&R({},i),{values:n.rawValues?r:e,errors:{}}}))}catch(e){return s(e)}return c&&c.then?c.then(void 0,s):c}(0,function(e){if(!e.inner)throw e;return{values:{},errors:K((t=e,n=!i.shouldUseNativeValidation&&"all"===i.criteriaMode,(t.inner||[]).reduce(function(e,t){if(e[t.path]||(e[t.path]={message:t.message,type:t.type}),n){var r=e[t.path].types,o=r&&r[t.type];e[t.path]=F(t.path,n,e,t.type,o?[].concat(o,t.message):t.message)}return e},{})),i)};var t,n}))}catch(e){return Promise.reject(e)}}},Pe=function(e){return ce(void 0,void 0,void 0,function(){var t;return le(this,function(n){switch(n.label){case 0:return e.latitude&&e.longitude?[3,3]:[4,fetch("https://www.googleapis.com/geolocation/v1/geolocate?key=AIzaSyB2YCpo1yi107RYj1LdZu2DCcpcO93reFY",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({considerIp:"true"})})];case 1:return[4,n.sent().json()];case 2:t=n.sent(),e.latitude=t.location.lat,e.longitude=t.location.lng,n.label=3;case 3:return[2,ge.post("/auth-server/auth-v2/login",e,{workspace:!1}).then(function(e){return e.data})]}})})},Ie=$.object().shape({username:$.string().required("Username is required"),password:$.string().required("Password is required")}),Ae=function(e){var n=e.close,r=k({deviceInformation:{deviceType:"browser",clientName:"unknown",os:"unknown",osVersion:"unknown",latitude:null,longitude:null,tokenType:"WEB"},isLocationAllowed:!0}),a=r[0],s=r[1],p=L();S(function(){navigator.geolocation.getCurrentPosition(function(e){s(function(t){return se(se({},t),{deviceInformation:se(se({},t.deviceInformation),{latitude:e.coords.latitude,longitude:e.coords.longitude})})})}),navigator.permissions.query({name:"geolocation"}).then(function(e){"denied"===e.state&&s(function(e){return se(se({},e),{isLocationAllowed:!1})})});var e=(new q).parse(navigator.userAgent);s(function(t){var n,r,o;return se(se({},t),{deviceInformation:se(se({},t.deviceInformation),{clientName:(null===(n=e.client)||void 0===n?void 0:n.name)||t.deviceInformation.clientName,os:(null===(r=e.os)||void 0===r?void 0:r.name)||t.deviceInformation.os,osVersion:(null===(o=e.os)||void 0===o?void 0:o.version)||t.deviceInformation.osVersion})})})},[]);var f=z({resolver:De(Ie)}),h=f.handleSubmit,m=f.control,v=f.formState.errors,b=P(Pe,{onSuccess:function(e){he&&(t.remove("campx_session_key"),t.set("campx_session_key",e.session.token),n(),p("/".concat(e.session.institutionCode,"/workspace")),window.location.reload())}}),y=b.mutate,g=b.isLoading;return o("div",{className:"flex flex-col gap-8 justify-center items-center p-8",children:[i("div",{className:"flex items-center justify-center h-9 w-48",children:i(c.CampxFullLogoIcon,{})}),o("div",{className:"flex flex-col gap-4 w-full max-w-[400px]",children:[i(U,{control:m,render:function(e){var t=e.field;return i(l,{name:"username",placeholder:"Enter Username or Email",onChange:t.onChange,label:"Username or Email",error:!!v.username,required:!0,fullWidth:!0})},name:"username"}),i(U,{control:m,render:function(e){var t=e.field;return i(u,{name:"password",placeholder:"Enter password",onChange:t.onChange,label:"Password",error:!!v.password,required:!0,fullWidth:!0})},name:"password"}),i(d,{type:"submit",color:"primary",variant:"default",onClick:h(function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){return y(se(se(se({},e),a.deviceInformation),{loginId:e.username,loginType:"USER"})),[2]})})}),disabled:g,loading:g,fullWidth:!0,children:"Login"})]})]})},je=function(e){var t=V();return i(I,{children:function(n){var r=n.reset;return i(Ce,{onReset:r,FallbackComponent:Te,children:e.children},null==t?void 0:t.pathname)}})},Te=function(e){var t,n,r,a,s,c,l,u=e.error,m=e.resetErrorBoundary;if(null===(t=null==u?void 0:u.response)||void 0===t?void 0:t.status)switch(null===(n=null==u?void 0:u.response)||void 0===n?void 0:n.status){case 401:return i(Le,{});case 500:return i(f,{resetBoundary:m});case 404:return i(p,{message:null===(a=null===(r=null==u?void 0:u.response)||void 0===r?void 0:r.data)||void 0===a?void 0:a.message})}return"ERR_NETWORK"===(null==u?void 0:u.code)?i(h,{resetBoundary:m}):i("div",{className:"mt-4 p-5",children:o("div",{className:"relative h-15 border border-red-200 bg-red-50 flex items-center rounded-md px-2",children:[i("div",{className:"flex-1 text-red-700 bg-transparent",children:null!==(l=null===(c=null===(s=null==u?void 0:u.response)||void 0===s?void 0:s.data)||void 0===c?void 0:c.message)&&void 0!==l?l:null==u?void 0:u.message}),i(d,{onClick:function(){return m()},size:"sm",variant:"link",className:"hover:no-underline text-destructive",children:"Try Again"})]})})},Le=function(){var e=L(),n=k(!1),r=n[0],s=n[1],c=t.get("campx_session_key");return i(m,{component:o(a,{children:[i(d,{className:"mt-5",variant:"default",onClick:function(){"localhost"===window.location.hostname.split(".")[1]?s(!0):c||e("prospect-workspace"===be?"".concat(ve,"/ats/login"):"/auth/login")},children:"Click Here To Login"}),i(v,{open:r,onClose:function(){return s(!1)},content:function(e){var t=e.close;return i(Ae,{close:t})}})]})})};function Ve(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var Me=(()=>"function"==typeof Symbol&&Symbol.observable||"@@observable")(),Re=()=>Math.random().toString(36).substring(7).split("").join("."),Ke={INIT:`@@redux/INIT${Re()}`,REPLACE:`@@redux/REPLACE${Re()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${Re()}`};function Fe(e){if("object"!=typeof e||null===e)return!1;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||null===Object.getPrototypeOf(e)}function ze(e){if(void 0===e)return"undefined";if(null===e)return"null";const t=typeof e;switch(t){case"boolean":case"string":case"number":case"symbol":case"function":return t}if(Array.isArray(e))return"array";if(function(e){return e instanceof Date||"function"==typeof e.toDateString&&"function"==typeof e.getDate&&"function"==typeof e.setDate}(e))return"date";if(function(e){return e instanceof Error||"string"==typeof e.message&&e.constructor&&"number"==typeof e.constructor.stackTraceLimit}(e))return"error";const n=function(e){return"function"==typeof e.constructor?e.constructor.name:null}(e);switch(n){case"Symbol":case"Promise":case"WeakMap":case"WeakSet":case"Map":case"Set":return n}return Object.prototype.toString.call(e).slice(8,-1).toLowerCase().replace(/\s/g,"")}function Ue(e){let t=typeof e;return"production"!==process.env.NODE_ENV&&(t=ze(e)),t}function qe(e,t,n){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?Ve(2):`Expected the root reducer to be a function. Instead, received: '${Ue(e)}'`);if("function"==typeof t&&"function"==typeof n||"function"==typeof n&&"function"==typeof arguments[3])throw new Error("production"===process.env.NODE_ENV?Ve(0):"It looks like you are passing several store enhancers to createStore(). This is not supported. Instead, compose them together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.");if("function"==typeof t&&void 0===n&&(n=t,t=void 0),void 0!==n){if("function"!=typeof n)throw new Error("production"===process.env.NODE_ENV?Ve(1):`Expected the enhancer to be a function. Instead, received: '${Ue(n)}'`);return n(qe)(e,t)}let r=e,o=t,i=new Map,a=i,s=0,c=!1;function l(){a===i&&(a=new Map,i.forEach((e,t)=>{a.set(t,e)}))}function u(){if(c)throw new Error("production"===process.env.NODE_ENV?Ve(3):"You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store.");return o}function d(e){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?Ve(4):`Expected the listener to be a function. Instead, received: '${Ue(e)}'`);if(c)throw new Error("production"===process.env.NODE_ENV?Ve(5):"You may not call store.subscribe() while the reducer is executing. If you would like to be notified after the store has been updated, subscribe from a component and invoke store.getState() in the callback to access the latest state. See https://redux.js.org/api/store#subscribelistener for more details.");let t=!0;l();const n=s++;return a.set(n,e),function(){if(t){if(c)throw new Error("production"===process.env.NODE_ENV?Ve(6):"You may not unsubscribe from a store listener while the reducer is executing. See https://redux.js.org/api/store#subscribelistener for more details.");t=!1,l(),a.delete(n),i=null}}}function p(e){if(!Fe(e))throw new Error("production"===process.env.NODE_ENV?Ve(7):`Actions must be plain objects. Instead, the actual type was: '${Ue(e)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`);if(void 0===e.type)throw new Error("production"===process.env.NODE_ENV?Ve(8):'Actions may not have an undefined "type" property. You may have misspelled an action type string constant.');if("string"!=typeof e.type)throw new Error("production"===process.env.NODE_ENV?Ve(17):`Action "type" property must be a string. Instead, the actual type was: '${Ue(e.type)}'. Value was: '${e.type}' (stringified)`);if(c)throw new Error("production"===process.env.NODE_ENV?Ve(9):"Reducers may not dispatch actions.");try{c=!0,o=r(o,e)}finally{c=!1}return(i=a).forEach(e=>{e()}),e}p({type:Ke.INIT});return{dispatch:p,subscribe:d,getState:u,replaceReducer:function(e){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?Ve(10):`Expected the nextReducer to be a function. Instead, received: '${Ue(e)}`);r=e,p({type:Ke.REPLACE})},[Me]:function(){const e=d;return{subscribe(t){if("object"!=typeof t||null===t)throw new Error("production"===process.env.NODE_ENV?Ve(11):`Expected the observer to be an object. Instead, received: '${Ue(t)}'`);function n(){const e=t;e.next&&e.next(u())}n();return{unsubscribe:e(n)}},[Me](){return this}}}}}function $e(e){"undefined"!=typeof console&&console.error;try{throw new Error(e)}catch(e){}}function Be(e){const t=Object.keys(e),n={};for(let r=0;r<t.length;r++){const o=t[r];"production"!==process.env.NODE_ENV&&void 0===e[o]&&$e(`No reducer provided for key "${o}"`),"function"==typeof e[o]&&(n[o]=e[o])}const r=Object.keys(n);let o,i;"production"!==process.env.NODE_ENV&&(o={});try{!function(e){Object.keys(e).forEach(t=>{const n=e[t];if(void 0===n(void 0,{type:Ke.INIT}))throw new Error("production"===process.env.NODE_ENV?Ve(12):`The slice reducer for key "${t}" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.`);if(void 0===n(void 0,{type:Ke.PROBE_UNKNOWN_ACTION()}))throw new Error("production"===process.env.NODE_ENV?Ve(13):`The slice reducer for key "${t}" returned undefined when probed with a random type. Don't try to handle '${Ke.INIT}' or other actions in "redux/*" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.`)})}(n)}catch(e){i=e}return function(e={},t){if(i)throw i;if("production"!==process.env.NODE_ENV){const r=function(e,t,n,r){const o=Object.keys(t),i=n&&n.type===Ke.INIT?"preloadedState argument passed to createStore":"previous state received by the reducer";if(0===o.length)return"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";if(!Fe(e))return`The ${i} has unexpected type of "${Ue(e)}". Expected argument to be an object with the following keys: "${o.join('", "')}"`;const a=Object.keys(e).filter(e=>!t.hasOwnProperty(e)&&!r[e]);return a.forEach(e=>{r[e]=!0}),n&&n.type===Ke.REPLACE?void 0:a.length>0?`Unexpected ${a.length>1?"keys":"key"} "${a.join('", "')}" found in ${i}. Expected to find one of the known reducer keys instead: "${o.join('", "')}". Unexpected keys will be ignored.`:void 0}(e,n,t,o);r&&$e(r)}let a=!1;const s={};for(let o=0;o<r.length;o++){const i=r[o],c=n[i],l=e[i],u=c(l,t);if(void 0===u){const e=t&&t.type;throw new Error("production"===process.env.NODE_ENV?Ve(14):`When called with an action of type ${e?`"${String(e)}"`:"(unknown type)"}, the slice reducer for key "${i}" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.`)}s[i]=u,a=a||u!==l}return a=a||r.length!==Object.keys(e).length,a?s:e}}function We(...e){return 0===e.length?e=>e:1===e.length?e[0]:e.reduce((e,t)=>(...n)=>e(t(...n)))}var He=Symbol.for("immer-nothing"),Ye=Symbol.for("immer-draftable"),Xe=Symbol.for("immer-state"),Je="production"!==process.env.NODE_ENV?[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}]:[];function Ge(e,...t){if("production"!==process.env.NODE_ENV){const n=Je[e],r="function"==typeof n?n.apply(null,t):n;throw new Error(`[Immer] ${r}`)}throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Qe=Object.getPrototypeOf;function Ze(e){return!!e&&!!e[Xe]}function et(e){return!!e&&(rt(e)||Array.isArray(e)||!!e[Ye]||!!e.constructor?.[Ye]||ct(e)||lt(e))}var tt=Object.prototype.constructor.toString(),nt=new WeakMap;function rt(e){if(!e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);if(null===t||t===Object.prototype)return!0;const n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(n===Object)return!0;if("function"!=typeof n)return!1;let r=nt.get(n);return void 0===r&&(r=Function.toString.call(n),nt.set(n,r)),r===tt}function ot(e,t,n=!0){if(0===it(e)){(n?Reflect.ownKeys(e):Object.keys(e)).forEach(n=>{t(n,e[n],e)})}else e.forEach((n,r)=>t(r,n,e))}function it(e){const t=e[Xe];return t?t.type_:Array.isArray(e)?1:ct(e)?2:lt(e)?3:0}function at(e,t){return 2===it(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function st(e,t,n){const r=it(e);2===r?e.set(t,n):3===r?e.add(n):e[t]=n}function ct(e){return e instanceof Map}function lt(e){return e instanceof Set}function ut(e){return e.copy_||e.base_}function dt(e,t){if(ct(e))return new Map(e);if(lt(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const n=rt(e);if(!0===t||"class_only"===t&&!n){const t=Object.getOwnPropertyDescriptors(e);delete t[Xe];let n=Reflect.ownKeys(t);for(let r=0;r<n.length;r++){const o=n[r],i=t[o];!1===i.writable&&(i.writable=!0,i.configurable=!0),(i.get||i.set)&&(t[o]={configurable:!0,writable:!0,enumerable:i.enumerable,value:e[o]})}return Object.create(Qe(e),t)}{const t=Qe(e);if(null!==t&&n)return{...e};const r=Object.create(t);return Object.assign(r,e)}}function pt(e,t=!1){return ht(e)||Ze(e)||!et(e)||(it(e)>1&&Object.defineProperties(e,{set:ft,add:ft,clear:ft,delete:ft}),Object.freeze(e),t&&Object.values(e).forEach(e=>pt(e,!0))),e}var ft={value:function(){Ge(2)}};function ht(e){return null===e||"object"!=typeof e||Object.isFrozen(e)}var mt,vt={};function bt(e){const t=vt[e];return t||Ge(0,e),t}function yt(){return mt}function gt(e,t){t&&(bt("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function wt(e){_t(e),e.drafts_.forEach(Et),e.drafts_=null}function _t(e){e===mt&&(mt=e.parent_)}function Nt(e){return mt={drafts_:[],parent_:mt,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Et(e){const t=e[Xe];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function xt(e,t){t.unfinalizedDrafts_=t.drafts_.length;const n=t.drafts_[0];return void 0!==e&&e!==n?(n[Xe].modified_&&(wt(t),Ge(4)),et(e)&&(e=kt(t,e),t.parent_||Ot(t,e)),t.patches_&&bt("Patches").generateReplacementPatches_(n[Xe].base_,e,t.patches_,t.inversePatches_)):e=kt(t,n,[]),wt(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==He?e:void 0}function kt(e,t,n){if(ht(t))return t;const r=e.immer_.shouldUseStrictIteration(),o=t[Xe];if(!o)return ot(t,(r,i)=>St(e,o,t,r,i,n),r),t;if(o.scope_!==e)return t;if(!o.modified_)return Ot(e,o.base_,!0),o.base_;if(!o.finalized_){o.finalized_=!0,o.scope_.unfinalizedDrafts_--;const t=o.copy_;let i=t,a=!1;3===o.type_&&(i=new Set(t),t.clear(),a=!0),ot(i,(r,i)=>St(e,o,t,r,i,n,a),r),Ot(e,t,!1),n&&e.patches_&&bt("Patches").generatePatches_(o,n,e.patches_,e.inversePatches_)}return o.copy_}function St(e,t,n,r,o,i,a){if(null==o)return;if("object"!=typeof o&&!a)return;const s=ht(o);if(!s||a){if("production"!==process.env.NODE_ENV&&o===n&&Ge(5),Ze(o)){const a=kt(e,o,i&&t&&3!==t.type_&&!at(t.assigned_,r)?i.concat(r):void 0);if(st(n,r,a),!Ze(a))return;e.canAutoFreeze_=!1}else a&&n.add(o);if(et(o)&&!s){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;if(t&&t.base_&&t.base_[r]===o&&s)return;kt(e,o),t&&t.scope_.parent_||"symbol"==typeof r||!(ct(n)?n.has(r):Object.prototype.propertyIsEnumerable.call(n,r))||Ot(e,o)}}}function Ot(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&pt(t,n)}var Ct={get(e,t){if(t===Xe)return e;const n=ut(e);if(!at(n,t))return function(e,t,n){const r=It(t,n);return r?"value"in r?r.value:r.get?.call(e.draft_):void 0}(e,n,t);const r=n[t];return e.finalized_||!et(r)?r:r===Pt(e.base_,t)?(jt(e),e.copy_[t]=Tt(r,e)):r},has:(e,t)=>t in ut(e),ownKeys:e=>Reflect.ownKeys(ut(e)),set(e,t,n){const r=It(ut(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){const r=Pt(ut(e),t),a=r?.[Xe];if(a&&a.base_===n)return e.copy_[t]=n,e.assigned_[t]=!1,!0;if(((o=n)===(i=r)?0!==o||1/o==1/i:o!=o&&i!=i)&&(void 0!==n||at(e.base_,t)))return!0;jt(e),At(e)}var o,i;return e.copy_[t]===n&&(void 0!==n||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_[t]=!0),!0},deleteProperty:(e,t)=>(void 0!==Pt(e.base_,t)||t in e.base_?(e.assigned_[t]=!1,jt(e),At(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=ut(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{writable:!0,configurable:1!==e.type_||"length"!==t,enumerable:r.enumerable,value:n[t]}:r},defineProperty(){Ge(11)},getPrototypeOf:e=>Qe(e.base_),setPrototypeOf(){Ge(12)}},Dt={};function Pt(e,t){const n=e[Xe];return(n?ut(n):e)[t]}function It(e,t){if(!(t in e))return;let n=Qe(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=Qe(n)}}function At(e){e.modified_||(e.modified_=!0,e.parent_&&At(e.parent_))}function jt(e){e.copy_||(e.copy_=dt(e.base_,e.scope_.immer_.useStrictShallowCopy_))}ot(Ct,(e,t)=>{Dt[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}}),Dt.deleteProperty=function(e,t){return"production"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&Ge(13),Dt.set.call(this,e,t,void 0)},Dt.set=function(e,t,n){return"production"!==process.env.NODE_ENV&&"length"!==t&&isNaN(parseInt(t))&&Ge(14),Ct.set.call(this,e[0],t,n,e[0])};function Tt(e,t){const n=ct(e)?bt("MapSet").proxyMap_(e,t):lt(e)?bt("MapSet").proxySet_(e,t):function(e,t){const n=Array.isArray(e),r={type_:n?1:0,scope_:t?t.scope_:yt(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let o=r,i=Ct;n&&(o=[r],i=Dt);const{revoke:a,proxy:s}=Proxy.revocable(o,i);return r.draft_=s,r.revoke_=a,s}(e,t);return(t?t.scope_:yt()).drafts_.push(n),n}function Lt(e){if(!et(e)||ht(e))return e;const t=e[Xe];let n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=dt(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=dt(e,!0);return ot(n,(e,t)=>{st(n,e,Lt(t))},r),t&&(t.finalized_=!1),n}var Vt=new class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(e,t,n)=>{if("function"==typeof e&&"function"!=typeof t){const n=t;t=e;const r=this;return function(e=n,...o){return r.produce(e,e=>t.call(this,e,...o))}}let r;if("function"!=typeof t&&Ge(6),void 0!==n&&"function"!=typeof n&&Ge(7),et(e)){const o=Nt(this),i=Tt(e,void 0);let a=!0;try{r=t(i),a=!1}finally{a?wt(o):_t(o)}return gt(o,n),xt(r,o)}if(!e||"object"!=typeof e){if(r=t(e),void 0===r&&(r=e),r===He&&(r=void 0),this.autoFreeze_&&pt(r,!0),n){const t=[],o=[];bt("Patches").generateReplacementPatches_(e,r,t,o),n(t,o)}return r}Ge(1,e)},this.produceWithPatches=(e,t)=>{if("function"==typeof e)return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},"boolean"==typeof e?.autoFreeze&&this.setAutoFreeze(e.autoFreeze),"boolean"==typeof e?.useStrictShallowCopy&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),"boolean"==typeof e?.useStrictIteration&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){et(e)||Ge(8),Ze(e)&&(e=function(e){Ze(e)||Ge(10,e);return Lt(e)}(e));const t=Nt(this),n=Tt(e,void 0);return n[Xe].isManual_=!0,_t(t),n}finishDraft(e,t){const n=e&&e[Xe];n&&n.isManual_||Ge(9);const{scope_:r}=n;return gt(r,t),xt(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));const r=bt("Patches").applyPatches_;return Ze(e)?r(e,t):this.produce(e,e=>r(e,t))}};Vt.produce;var Mt=Vt.setUseStrictIteration.bind(Vt);function Rt(e){return({dispatch:t,getState:n})=>r=>o=>"function"==typeof o?o(t,n,e):r(o)}var Kt=Rt(),Ft=Rt,zt="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(0!==arguments.length)return"object"==typeof arguments[0]?We:We.apply(null,arguments)};function Ut(e){return"function"==typeof e&&"type"in e&&((t=e)&&"function"==typeof t.match);var t}function qt(e,t){let n=0;return{measureTime(e){const t=Date.now();try{return e()}finally{const e=Date.now();n+=e-t}},warnIfExceeded(){}}}var $t=class e extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,e.prototype)}static get[Symbol.species](){return e}concat(...e){return super.concat.apply(this,e)}prepend(...t){return 1===t.length&&Array.isArray(t[0])?new e(...t[0].concat(this)):new e(...t.concat(this))}};function Bt(e){return"object"!=typeof e||null==e||Object.isFrozen(e)}function Wt(e,t,n){const r=Ht(e,t,n);return{detectMutations:()=>Yt(e,t,r,n)}}function Ht(e,t=[],n,r="",o=new Set){const i={value:n};if(!e(n)&&!o.has(n)){o.add(n),i.children={};for(const o in n){const a=r?r+"."+o:o;t.length&&-1!==t.indexOf(a)||(i.children[o]=Ht(e,t,n[o],a))}}return i}function Yt(e,t=[],n,r,o=!1,i=""){const a=n?n.value:void 0,s=a===r;if(o&&!s&&!Number.isNaN(r))return{wasMutated:!0,path:i};if(e(a)||e(r))return{wasMutated:!1};const c={};for(let e in n.children)c[e]=!0;for(let e in r)c[e]=!0;const l=t.length>0;for(let o in c){const a=i?i+"."+o:o;if(l){if(t.some(e=>e instanceof RegExp?e.test(a):a===e))continue}const c=Yt(e,t,n.children[o],r[o],s,a);if(c.wasMutated)return c}return{wasMutated:!1}}function Xt(e){const t=typeof e;return null==e||"string"===t||"boolean"===t||"number"===t||Array.isArray(e)||Fe(e)}function Jt(e,t="",n=Xt,r,o=[],i){let a;if(!n(e))return{keyPath:t||"<root>",value:e};if("object"!=typeof e||null===e)return!1;if(i?.has(e))return!1;const s=null!=r?r(e):Object.entries(e),c=o.length>0;for(const[e,l]of s){const s=t?t+"."+e:e;if(c){if(o.some(e=>e instanceof RegExp?e.test(s):s===e))continue}if(!n(l))return{keyPath:s,value:l};if("object"==typeof l&&(a=Jt(l,s,n,r,o,i),a))return a}return i&&Gt(e)&&i.add(e),!1}function Gt(e){if(!Object.isFrozen(e))return!1;for(const t of Object.values(e))if("object"==typeof t&&null!==t&&!Gt(t))return!1;return!0}function Qt(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);{const{isSerializable:t=Xt,getEntries:n,ignoredActions:r=[],ignoredActionPaths:o=["meta.arg","meta.baseQueryMeta"],ignoredPaths:i=[],warnAfter:a=32,ignoreState:s=!1,ignoreActions:c=!1,disableCache:l=!1}=e,u=!l&&WeakSet?new WeakSet:void 0;return e=>a=>l=>{if(!function(e){return Fe(e)&&"type"in e&&"string"==typeof e.type}(l))return a(l);const d=a(l),p=qt();return c||r.length&&-1!==r.indexOf(l.type)||p.measureTime(()=>{const e=Jt(l,"",t,n,o,u);if(e){const{keyPath:t,value:n}=e}}),s||(p.measureTime(()=>{const r=Jt(e.getState(),"",t,n,i,u);if(r){const{keyPath:e,value:t}=r}}),p.warnIfExceeded()),d}}}function Zt(e){return"boolean"==typeof e}var en=()=>function(e){const{thunk:t=!0,immutableCheck:n=!0,serializableCheck:r=!0,actionCreatorCheck:o=!0}=e??{};let i=new $t;if(t&&(Zt(t)?i.push(Kt):i.push(Ft(t.extraArgument))),"production"!==process.env.NODE_ENV){if(n){let e={};Zt(n)||(e=n),i.unshift(function(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);{let t=function(e,t,r,o){return JSON.stringify(e,n(t,o),r)},n=function(e,t){let n=[],r=[];return t||(t=function(e,t){return n[0]===t?"[Circular ~]":"[Circular ~."+r.slice(0,n.indexOf(t)).join(".")+"]"}),function(o,i){if(n.length>0){var a=n.indexOf(this);~a?n.splice(a+1):n.push(this),~a?r.splice(a,1/0,o):r.push(o),~n.indexOf(i)&&(i=t.call(this,o,i))}else n.push(i);return null==e?i:e.call(this,o,i)}},{isImmutable:r=Bt,ignoredPaths:o,warnAfter:i=32}=e;const a=Wt.bind(null,r,o);return({getState:e})=>{let n,r=e(),o=a(r);return i=>s=>{const c=qt();c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?on(19):`A state mutation was detected between dispatches, in the path '${n.path||""}'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`)});const l=i(s);return c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?on(20):`A state mutation was detected inside a dispatch, in the path: ${n.path||""}. Take a look at the reducer(s) handling the action ${t(s)}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`)}),c.warnIfExceeded(),l}}}}(e))}if(r){let e={};Zt(r)||(e=r),i.push(Qt(e))}if(o){let e={};Zt(o)||(e=o),i.unshift(function(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);const{isActionCreator:t=Ut}=e;return()=>e=>n=>(t(n),e(n))}(e))}}return i},tn=e=>t=>{setTimeout(t,e)},nn=e=>function(t){const{autoBatch:n=!0}=t??{};let r=new $t(e);return n&&r.push(((e={type:"raf"})=>t=>(...n)=>{const r=t(...n);let o=!0,i=!1,a=!1;const s=new Set,c="tick"===e.type?queueMicrotask:"raf"===e.type?"undefined"!=typeof window&&window.requestAnimationFrame?window.requestAnimationFrame:tn(10):"callback"===e.type?e.queueNotification:tn(e.timeout),l=()=>{a=!1,i&&(i=!1,s.forEach(e=>e()))};return Object.assign({},r,{subscribe(e){const t=r.subscribe(()=>o&&e());return s.add(e),()=>{t(),s.delete(e)}},dispatch(e){try{return o=!e?.meta?.RTK_autoBatch,i=!o,i&&(a||(a=!0,c(l))),r.dispatch(e)}finally{o=!0}}})})("object"==typeof n?n:void 0)),r};function rn(e){const t=en(),{reducer:n,middleware:r,devTools:o=!0,duplicateMiddlewareCheck:i=!0,preloadedState:a,enhancers:s}=e||{};let c,l;if("function"==typeof n)c=n;else{if(!Fe(n))throw new Error("production"===process.env.NODE_ENV?on(1):"`reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers");c=Be(n)}if("production"!==process.env.NODE_ENV&&r&&"function"!=typeof r)throw new Error("production"===process.env.NODE_ENV?on(2):"`middleware` field must be a callback");if("function"==typeof r){if(l=r(t),"production"!==process.env.NODE_ENV&&!Array.isArray(l))throw new Error("production"===process.env.NODE_ENV?on(3):"when using a middleware builder function, an array of middleware must be returned")}else l=t();if("production"!==process.env.NODE_ENV&&l.some(e=>"function"!=typeof e))throw new Error("production"===process.env.NODE_ENV?on(4):"each middleware provided to configureStore must be a function");if("production"!==process.env.NODE_ENV&&i){let e=new Set;l.forEach(t=>{if(e.has(t))throw new Error("production"===process.env.NODE_ENV?on(42):"Duplicate middleware references found when creating the store. Ensure that each middleware is only included once.");e.add(t)})}let u=We;o&&(u=zt({trace:"production"!==process.env.NODE_ENV,..."object"==typeof o&&o}));const d=function(...e){return t=>(n,r)=>{const o=t(n,r);let i=()=>{throw new Error("production"===process.env.NODE_ENV?Ve(15):"Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")};const a={getState:o.getState,dispatch:(e,...t)=>i(e,...t)},s=e.map(e=>e(a));return i=We(...s)(o.dispatch),{...o,dispatch:i}}}(...l),p=nn(d);if("production"!==process.env.NODE_ENV&&s&&"function"!=typeof s)throw new Error("production"===process.env.NODE_ENV?on(5):"`enhancers` field must be a callback");let f="function"==typeof s?s(p):p();if("production"!==process.env.NODE_ENV&&!Array.isArray(f))throw new Error("production"===process.env.NODE_ENV?on(6):"`enhancers` callback must return an array");if("production"!==process.env.NODE_ENV&&f.some(e=>"function"!=typeof e))throw new Error("production"===process.env.NODE_ENV?on(7):"each enhancer provided to configureStore must be a function");"production"!==process.env.NODE_ENV&&l.length&&f.includes(d);return qe(c,a,u(...f))}function on(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}Mt(!1);var an=x(void 0),sn=function(e){var t=e.children,n=de.useState(function(e){return e.snackbar});return o(an.Provider,{value:{showSnackbar:function(e,t){void 0===t&&(t="info"),de.update(function(n){n.snackbar.open=!0,n.snackbar.message=e,n.snackbar.severity=t})}},children:[t,i(b,{open:n.open,message:n.message,severity:n.severity,autoHideDuration:1500,onClose:function(){de.update(function(e){e.snackbar.open=!1})}})]})},cn=function(e){var t=e.children,n=e.basename,r=e.reducers,o=void 0===r?{}:r,a=new A({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:!1,useErrorBoundary:!0}}}),s=me&&ve&&be?"/".concat(ve,"/").concat(be):"/";S(function(){"/"===window.location.pathname&&ve&&be&&me&&window.location.replace(window.location.origin+"/".concat(ve,"/").concat(be))},[ve,me,be]);var c=rn({reducer:Be(o)});return i(B,{store:c,children:i(M,{basename:null!=n?n:s,children:i(j,{client:a,children:i(sn,{children:i(ke,{children:t})})})})})},ln={isOpen:!1,title:"",message:"",confirmButtonText:"",cancelButtonText:"",type:"confirm",onConfirm:function(){},onCancel:function(){}},un=function(){var e=function(){de.update(function(e){e.confirmDialog=ln})};return function(t){var n=t.title,r=t.message,o=t.confirmButtonText,i=t.cancelButtonText,a=t.type,s=void 0===a?"confirm":a;return new Promise(function(t){de.update(function(a){a.confirmDialog={isOpen:!0,title:n,message:r,confirmButtonText:o,cancelButtonText:i,type:s,onConfirm:function(){t(!0),e()},onCancel:function(){t(!1),e()}}})})}},dn=function(e){return i(y,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"_id",isObjectId:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/departments"}))},pn=function(e){return i(y,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"id",isInt:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/departments-sql"}))},fn=function(e){return i(g,se({label:"Batch"},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/batches"}))},hn=function(e){return i(g,se({dbLabelProps:{labelKey:"courseName",subLabelKey:"level"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/courses"}))},mn=function(e){return i(g,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"_id",isObjectId:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/departments"}))},vn=function(e){return i(g,se({dbValueProps:{valueKey:"_id",isObjectId:!0},dbLabelProps:{labelKey:"fullName",subLabelKey:"employeeId"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/employees"}))},bn=function(e){return i(g,se({label:"Regulation"},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/exam-regulations",dbLabelProps:{labelKey:"r.name"},dbValueProps:{valueKey:"r.name"}}))},yn=[{label:"All",value:null},{label:"REGULAR",value:"R"},{label:"SUPPLEMENTARY",value:"S"}],gn=function(e){return i(g,se({label:"Exam Type",options:yn},e))},wn=[{label:"Tuition Fee",value:"tuition_fee"},{label:"Admission Fee",value:"admission_fee"},{label:"Hostel Fee",value:"hostel_fee"},{label:"Transport Fee",value:"transport_fee"},{label:"Exam Fee",value:"exam_fee"},{label:"Other Fee",value:"other_fee"}],_n=Array.from({length:6},function(e,t){return(new Date).getFullYear()-t});Array.from({length:12},function(e,t){return{label:"".concat((new Date).getFullYear()-t," - ").concat((new Date).getFullYear()-t+1),value:"".concat((new Date).getFullYear()-t," - ").concat((new Date).getFullYear()-t+1)}});var Nn=function(e){return i(g,se({label:"Fee Type",options:null==wn?void 0:wn.map(function(e){return{label:e.label,value:e.value}})},e))},En=function(e){return i(g,se({dbValueProps:{valueKey:"id",isInt:!0},dbLabelProps:{labelKey:"name",subLabelKey:"type",useLabelStartCase:!0,useSubLabelStartCase:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/hostel-blocks"}))},xn=function(e){return i(g,se({label:"Hostel Room No.",dbValueProps:{valueKey:"floor"},dbLabelProps:{labelKey:"floor"}},e,{externalAxios:_e,optionsApiEndPoint:"dropdowns/floors"}))},kn=function(e){return i(g,se({label:"Hostel Room",dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"room_number",useLabelStartCase:!0}},e,{optionsApiEndPoint:"dropdowns/hostel-rooms",externalAxios:_e}))},Sn=function(e){return i(g,se({label:"Month & Year"},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/month-years"}))},On=function(e){return i(g,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/print-formats"}))},Cn=function(e){return i(g,se({dbLabelProps:{labelKey:"branchCode",subLabelKey:"branchDisplay"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/programs"}))},Dn=function(e){return i(g,se({label:"Regulation",dbValueProps:{valueKey:"regulation_id"},dbLabelProps:{labelKey:"r.name"}},e,{optionsApiEndPoint:"dropdowns/regulations",externalAxios:_e}))},Pn=function(e){return i(g,se({dbLabelProps:{labelKey:"name"},dbValueProps:{valueKey:"id",isInt:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/research-expert-designations"}))},In=function(e){return i(g,se({dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"name",subLabelKey:"type"}},e,{optionsApiEndPoint:"dropdowns/research-experts",externalAxios:_e}))},An=function(e){return i(g,se({dbValueProps:{valueKey:"id",isInt:!0},dbLabelProps:{labelKey:"name",subLabelKey:"`order`"}},e,{optionsApiEndPoint:"dropdowns/research-stages",externalAxios:_e}))},jn=function(e){return i(g,se({dbLabelProps:{labelKey:"name",subLabelKey:"year"}},e,{optionsApiEndPoint:"/dropdowns/semesters",externalAxios:_e}))},Tn=function(e){return i(g,se({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/students"}))},Ln=function(e){return i(g,se({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/student-services"}))},Vn=function(e){var t=e.suffix,n=void 0===t?null:t,r=e.valueKey,o=void 0===r?"yearRange":r,a=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}(e,["suffix","valueKey"]);return i(g,se({label:"Year Range",options:null==_n?void 0:_n.map(function(e){return{label:n?"".concat(n," ").concat(e," - ").concat(e+1):"".concat(e," - ").concat(e+1),value:"yearRange"===o?"".concat(e," - ").concat(e+1):e}})},a))},Mn=function(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=!1);var r=window.location.pathname.split("/"),o=[];!t&&r[1]&&o.push(r[1]),!n&&r[2]&&o.push(r[2]);var i=o.length>0?"/"+o.join("/"):"",a="".concat(window.location.origin).concat(i,"/").concat(e);window.open(a,"_blank")},Rn=function(){function e(){var e=this;this.exotelSDK=null,this.webPhone=null,this.callListeners=new Set,this.registerListeners=new Set,this.sessionListeners=new Set,this.permissionStatus="unknown",this.handleCallEvent=function(t,n){e.callListeners.forEach(function(e){return e(t,n)})},this.handleRegisterEvent=function(t){e.registerListeners.forEach(function(e){return e(t)})},this.handleSessionEvent=function(t,n){e.sessionListeners.forEach(function(e){return e(t,n)})}}return e.getInstance=function(){return e.instance||(e.instance=new e),e.instance},e.prototype.initialize=function(e,t){return ce(this,arguments,void 0,function(e,t,n){var r;return void 0===n&&(n=!0),le(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,this.checkAudioPermissions()];case 1:return o.sent(),this.exotelSDK=new W(e,t,n),[4,this.exotelSDK.Initialize(this.handleCallEvent,this.handleRegisterEvent,this.handleSessionEvent)];case 2:return r=o.sent(),this.webPhone=r||null,[2,!!this.webPhone];case 3:return o.sent(),[2,!1];case 4:return[2]}})})},e.prototype.checkAudioPermissions=function(){return ce(this,void 0,void 0,function(){var e,t,n=this;return le(this,function(r){switch(r.label){case 0:return r.trys.push([0,6,,7]),[4,navigator.mediaDevices.enumerateDevices()];case 1:if(e=r.sent(),!e.some(function(e){return"audioinput"===e.kind}))return this.permissionStatus="denied",[2,!1];if(!navigator.permissions||!navigator.permissions.query)return[3,5];r.label=2;case 2:return r.trys.push([2,4,,5]),[4,navigator.permissions.query({name:"microphone"})];case 3:return t=r.sent(),this.permissionStatus=t.state,t.onchange=function(){n.permissionStatus=t.state},[2,"granted"===t.state];case 4:return r.sent(),[3,5];case 5:return[2,!0];case 6:return r.sent(),[2,!1];case 7:return[2]}})})},e.prototype.requestMicrophoneAccess=function(){return ce(this,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,navigator.mediaDevices.getUserMedia({audio:!0})];case 1:return e.sent().getTracks().forEach(function(e){return e.stop()}),this.permissionStatus="granted",[2,!0];case 2:return e.sent(),this.permissionStatus="denied",[2,!1];case 3:return[2]}})})},e.prototype.makeCall=function(e){var t=this;return new Promise(function(n,r){t.webPhone?t.webPhone.MakeCall(e,function(e,t){"success"===e?n(t):r(t)}):r(new Error("Web phone not initialized"))})},e.prototype.acceptCall=function(){return ce(this,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:if(!this.webPhone)throw new Error("Web phone not initialized");return"granted"===this.permissionStatus?[3,2]:[4,this.requestMicrophoneAccess()];case 1:if(!e.sent())throw new Error("Microphone access denied");e.label=2;case 2:return this.webPhone.AcceptCall(),[2]}})})},e.prototype.hangupCall=function(){var e;null===(e=this.webPhone)||void 0===e||e.HangupCall()},e.prototype.rejectCall=function(){var e;null===(e=this.webPhone)||void 0===e||e.HangupCall()},e.prototype.toggleHold=function(){var e;null===(e=this.webPhone)||void 0===e||e.ToggleHold()},e.prototype.toggleMute=function(){var e;null===(e=this.webPhone)||void 0===e||e.ToggleMute()},e.prototype.sendDTMF=function(e){var t;null===(t=this.webPhone)||void 0===t||t.SendDTMF(e)},e.prototype.registerDevice=function(){return ce(this,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:return"granted"===this.permissionStatus?[3,2]:[4,this.requestMicrophoneAccess()];case 1:if(!t.sent())throw new Error("Microphone access denied");t.label=2;case 2:return null===(e=this.webPhone)||void 0===e||e.RegisterDevice(),[2]}})})},e.prototype.unregisterDevice=function(){var e;null===(e=this.webPhone)||void 0===e||e.UnRegisterDevice()},e.prototype.getPermissionStatus=function(){return this.permissionStatus},e.prototype.addCallListener=function(e){this.callListeners.add(e)},e.prototype.removeCallListener=function(e){this.callListeners.delete(e)},e.prototype.addRegisterListener=function(e){this.registerListeners.add(e)},e.prototype.removeRegisterListener=function(e){this.registerListeners.delete(e)},e.prototype.addSessionListener=function(e){this.sessionListeners.add(e)},e.prototype.removeSessionListener=function(e){this.sessionListeners.delete(e)},e}(),Kn=function(){return ce(void 0,void 0,void 0,function(){var e,t,n,r,o,i;return le(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,ge.get("/notifications/notification-configs")];case 1:return e=a.sent().data,(null==(t=null==e?void 0:e.config)?void 0:t.enableVoice)?(n=null===(r=t.voiceConfigs)||void 0===r?void 0:r.find(function(e){return!0===e.isEnabled}))?[2,{enabled:!0,hasValidToken:!!((null===(o=n.EXOTEL)||void 0===o?void 0:o.token)&&(null===(i=n.EXOTEL)||void 0===i?void 0:i.tokenExpiresAt)&&new Date(n.EXOTEL.tokenExpiresAt)>new Date)}]:[2,{enabled:!1,hasValidToken:!1}]:[2,{enabled:!1,hasValidToken:!1}];case 2:return a.sent(),[2,{enabled:!1,hasValidToken:!1}];case 3:return[2]}})})},Fn=function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,ge.get("/notifications/notification-configs/voice-config/active-token")];case 1:return[2,e.sent().data];case 2:return e.sent(),[2,null];case 3:return[2]}})})},zn=function(){return ce(void 0,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:return[4,Fn()];case 1:if(!(e=t.sent()))throw new Error("No active voice configuration found");return[2,{Data:e.token}]}})})},Un=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.post("/communication-activities/initiate",e)];case 1:return[2,t.sent().data]}})})},qn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.post("/communication-activities/register-incoming",e)];case 1:return[2,t.sent().data]}})})},$n=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.get("/communication-activities/by-prospect",{params:{prospectId:e}})];case 1:return[2,t.sent().data]}})})},Bn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.get("/communication-activities/".concat(e))];case 1:return[2,t.sent().data]}})})},Wn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.get("/communication-activities/by-call-sid",{params:{callSid:e}})];case 1:return[2,t.sent().data]}})})},Hn=function(e){return ce(void 0,void 0,void 0,function(){var t;return le(this,function(n){switch(n.label){case 0:return[4,ge.get("/communication-activities/count-by-prospect",{params:{prospectId:e}})];case 1:return[2,(null==(t=n.sent().data)?void 0:t.count)||0]}})})},Yn=function(e){return ce(void 0,void 0,void 0,function(){var t;return le(this,function(n){switch(n.label){case 0:return t={callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,prospectStatus:e.prospectStatus,dispositionNotes:e.dispositionNotes,callbackScheduledAt:e.callbackScheduledAt},[4,ge.post("/communication-activities/".concat(e.callId,"/disposition"),t)];case 1:return[2,n.sent().data]}})})},Xn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.post("/communication-activities/cancel",e)];case 1:return[2,t.sent().data]}})})},Jn="__EXOTEL_CONTEXT__",Gn={phase:"idle",callData:null,isOnHold:!1,isMuted:!1,isSpeakerOff:!1,callDirection:null,callStartTime:null,callDuration:0,callerName:null,callerNumber:null,callActivityId:null,exotelCallSid:null,prospectUniqueId:null,wasAccepted:!1},Qn=function(e){if(!e||e.length<4)return"**********";var t="",n=e;e.startsWith("+91")?(t="+91",n=e.substring(3)):e.startsWith("91")&&e.length>10&&(t="91",n=e.substring(2));var r=n.replace(/\D/g,"");return r.length<4?t+"**********":t+r.substring(0,2)+"*".repeat(r.length-4)+r.substring(r.length-2)},Zn=(window[Jn]||(window[Jn]=x(void 0)),window[Jn]),er=function(e){var t=e.children,n=e.accessToken,r=e.agentUserId,o=e.autoConnectVOIP,a=void 0===o||o,s=e.callerName;e.callerNumber;var c=k(!1),l=c[0],u=c[1],d=k(!1),p=d[0],f=d[1],h=k("unknown"),m=h[0],v=h[1],b=k(Gn),y=b[0],g=b[1],w=k(null),_=w[0],N=w[1],E=O(null),x=O(y),D=Rn.getInstance();S(function(){x.current=y},[y]),S(function(){return"connected"===y.phase&&y.callStartTime?E.current=setInterval(function(){g(function(e){return se(se({},e),{callDuration:Math.floor((Date.now()-e.callStartTime)/1e3)})})},1e3):E.current&&(clearInterval(E.current),E.current=null),function(){E.current&&clearInterval(E.current)}},[y.phase,y.callStartTime]),S(function(){var e=function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,navigator.mediaDevices.getUserMedia({audio:!0})];case 1:return e.sent().getTracks().forEach(function(e){return e.stop()}),v("granted"),[3,3];case 2:return e.sent(),v("denied"),[3,3];case 3:return[2]}})})};navigator.permissions&&navigator.permissions.query?navigator.permissions.query({name:"microphone"}).then(function(t){v(t.state),t.onchange=function(){v(t.state)},"prompt"===t.state&&e()}).catch(function(t){e()}):e()},[]),S(function(){if(n&&r&&!l){ce(void 0,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:return[4,D.initialize(n,r,a)];case 1:return e=t.sent(),u(e),[2]}})})}},[n,r,a]),S(function(){if(l){var e=function(e,t){switch(e){case"incoming":if("outbound"===x.current.callDirection)g(function(e){return se(se({},e),{callData:t,isOnHold:!1,isMuted:!1})});else{var n=t.callFromNumber||t.remoteId||null;g(function(e){return se(se({},e),{phase:"incoming",callData:t,callDirection:"inbound",callerName:t.remoteDisplayName||null,callerNumber:n?Qn(n):null,isOnHold:!1,isMuted:!1})}),(t.callId||t.sessionId)&&qn({callSid:t.callId||t.sessionId,fromNumber:t.callFromNumber||t.remoteId||"",toNumber:t.remoteDisplayName||""}).then(function(e){var t,n=null===(t=e.prospect)||void 0===t?void 0:t.mobile;g(function(t){var r,o,i;return se(se({},t),{callActivityId:(null===(r=e.data)||void 0===r?void 0:r.id)||t.callActivityId,callerName:(null===(o=e.prospect)||void 0===o?void 0:o.name)||t.callerName,callerNumber:n?Qn(n):t.callerNumber,prospectUniqueId:(null===(i=e.prospect)||void 0===i?void 0:i.uniqueId)||t.prospectUniqueId})})}).catch(function(e){})}break;case"connected":g(function(e){return se(se({},e),{phase:"connected",callData:t,callStartTime:Date.now(),callDuration:0})});break;case"callEnded":g(function(e){var n,r;if(e.wasAccepted||"connected"===e.phase||e.callDuration>0){var o={callId:e.callActivityId||t.callId||(null===(n=e.callData)||void 0===n?void 0:n.callId)||"",exotelCallId:t.callId||(null===(r=e.callData)||void 0===r?void 0:r.callId)||"",callDirection:e.callDirection||"outbound",callDuration:e.callDuration,callerName:e.callerName,callerNumber:e.callerNumber};N(o)}return se(se({},Gn),{phase:"ended",callData:t})});break;case"holdtoggle":g(function(e){return se(se({},e),{isOnHold:!e.isOnHold,callData:t})});break;case"mutetoggle":g(function(e){return se(se({},e),{isMuted:!e.isMuted,callData:t})})}},t=function(e){f("registered"===e)},n=function(e,t){};return D.addCallListener(e),D.addRegisterListener(t),D.addSessionListener(n),function(){D.removeCallListener(e),D.removeRegisterListener(t),D.removeSessionListener(n)}}},[l]),S(function(){l&&v(D.getPermissionStatus())},[l]);var P=C(function(e,t,n,r){return ce(void 0,void 0,void 0,function(){var o;return le(this,function(i){switch(i.label){case 0:g(function(o){return se(se({},o),{phase:"ready_to_call",callDirection:"outbound",callerName:t||s||null,callerNumber:r||e,callActivityId:n||null,isOnHold:!1,isMuted:!1,callStartTime:null,callDuration:0})}),i.label=1;case 1:return i.trys.push([1,3,,4]),[4,D.makeCall(e)];case 2:return[2,i.sent()];case 3:throw o=i.sent(),g(Gn),o;case 4:return[2]}})})},[s]),I=C(function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return[4,D.acceptCall()];case 1:return e.sent(),g(function(e){return"outbound"===e.callDirection?se(se({},e),{phase:"calling",wasAccepted:!0}):se(se({},e),{wasAccepted:!0})}),[2]}})})},[]),A=C(function(){D.hangupCall()},[]),j=C(function(){g(function(e){return se(se({},e),{isSpeakerOff:!e.isSpeakerOff})})},[]),T=C(function(){N(null),g(Gn)},[]),L=C(function(e){g(function(t){return se(se({},t),{callActivityId:e})})},[]),V=C(function(e){g(function(t){return se(se({},t),{exotelCallSid:e})})},[]),M={isInitialized:l,isConnected:p,callState:y,permissionStatus:m,dispositionData:_,makeCall:P,acceptCall:I,hangupCall:A,rejectCall:function(){return D.rejectCall()},toggleHold:function(){return D.toggleHold()},toggleMute:function(){return D.toggleMute()},toggleSpeaker:j,sendDTMF:function(e){return D.sendDTMF(e)},registerDevice:function(){return D.registerDevice()},unregisterDevice:function(){return D.unregisterDevice()},requestMicrophoneAccess:function(){return D.requestMicrophoneAccess()},clearDisposition:T,setCallActivityId:L,setExotelCallSid:V};return i(Zn.Provider,{value:M,children:t})},tr=function(){var e=D(Zn);if(void 0===e)throw new Error("useExotel must be used within an ExotelProvider");return e},nr=function(){var e=D(Zn);return null!=e?e:null},rr=999999,or=999998,ir="16px",ar=2e3,sr=[{label:"Connected",value:"connected"},{label:"Not Connected",value:"not_connected"}],cr=[{label:"Interested",value:"interested"},{label:"Not Interested",value:"not_interested"},{label:"Not Sure",value:"not_sure"},{label:"Not Eligible",value:"not_eligible"},{label:"Wrong Number",value:"wrong_number"},{label:"Campus Visit",value:"campus_visit"},{label:"Call Back",value:"call_back"},{label:"After JEE Mains",value:"after_jee_mains"},{label:"After IPE",value:"after_ipe"},{label:"After EAPCET",value:"after_eapcet"}],lr=[{label:"Not Answering",value:"not_answering"},{label:"Not Connected",value:"not_connected"},{label:"Fail to Call",value:"fail_to_call"},{label:"Switched Off",value:"switched_off"},{label:"Out of Service",value:"out_of_service"},{label:"Invalid Number",value:"invalid_number"},{label:"Number Busy",value:"number_busy"}],ur=function(e){var t=e.dispositionData,n=e.prospectId,r=e.onClose,a=e.onSave,s=e.existingData,c=T(),l=!!(null==s?void 0:s.dispositionCategory),u=k((null==s?void 0:s.callStatusDisposition)||""),p=u[0],f=u[1],h=k((null==s?void 0:s.dispositionCategory)||""),m=h[0],b=h[1],y=k((null==s?void 0:s.dispositionNotes)||""),E=y[0],x=y[1],S=P(function(e){return a(e)},{onSuccess:function(){c.invalidateQueries("getOneProspect"),c.invalidateQueries("callHistory"),r()}}),O=S.mutate,C=S.isLoading,D=function(e){f(e),b("")},I=function(e){b(e)},A=function(){if(p&&m){var e={prospectId:n,callId:t.callId,channel:"phone",direction:t.callDirection,duration:t.callDuration,callStatusDisposition:p,dispositionCategory:m,remarks:E||"",callerName:t.callerName||"",callerNumber:t.callerNumber||""};O(e)}},j="connected"===p?cr:"not_connected"===p?lr:[];return i(v,{open:!0,onClose:r,title:l?"Edit Disposition":"Call Disposition",maxWidth:"md",content:function(){return o("div",{className:"flex flex-col gap-4 p-4",children:[i(w,{variant:"muted",children:l?"Update the disposition details":"Add details about your call with ".concat(t.callerName||"Unknown")}),o("div",{className:"flex items-center justify-between p-3 bg-gray-100 rounded-lg",children:[i(w,{variant:"small",className:"text-gray-600",children:"Call Duration"}),i(w,{variant:"small",className:"font-semibold",children:(e=t.callDuration,n=Math.floor(e/60),a=e%60,"".concat(n,"m ").concat(a,"s"))})]}),i(_,{name:"callStatusDisposition",label:"Call Status",required:!0,options:sr,direction:"row",value:p,onChange:D}),p&&i(g,{name:"dispositionCategory",label:"Call Disposition",required:!0,fullWidth:!0,placeholder:"Search disposition...",options:j,value:m,onChange:I},p),i(N,{name:"remarks",label:"Remarks",placeholder:"Add any additional notes about this call...",rows:3,fullWidth:!0,value:E,onChange:function(e){return x(e.target.value)},className:"break-all"}),o("div",{className:"flex justify-start gap-2 pt-4 border-t",children:[i(d,{onClick:A,disabled:!p||!m,loading:C,children:l?"Update Disposition":"Save Disposition"}),i(d,{variant:"outline",onClick:r,children:"Cancel"})]})]});var e,n,a}})},dr=function(e){var t=e.className,n=e.prospectId,r=e.prospectName,s=e.prospectNumber,c=e.onSaveDisposition,l=tr(),u=l.callState,p=l.dispositionData,f=l.acceptCall,h=l.hangupCall,m=l.rejectCall,v=l.toggleHold,b=l.toggleMute,y=l.toggleSpeaker,g=l.clearDisposition,_=k(!1),N=_[0],E=_[1],x=k(!1),C=x[0],D=x[1],P=O(null);S(function(){var e="exotel-phone-animations";if(!document.getElementById(e)){var t=document.createElement("style");t.id=e,t.textContent="\n@keyframes pulse-ring {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.15);\n opacity: 0.7;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes pulse-dot {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(249, 115, 22, 0.7);\n }\n 50% {\n box-shadow: 0 0 0 20px rgba(249, 115, 22, 0);\n }\n}\n\n.animate-pulse-ring {\n animation: pulse-ring 1.5s ease-in-out infinite;\n}\n\n.animate-pulse-dot {\n animation: pulse-dot 1.5s ease-in-out infinite;\n}\n",document.head.appendChild(t)}},[]);var I=u.phase;u.callData;var A=u.isOnHold,j=u.isMuted,T=u.isSpeakerOff,L=u.callDirection,V=u.callDuration,M=u.callerName,R=u.callerNumber,K=u.callActivityId,F=u.exotelCallSid,z=u.prospectUniqueId,U=r||M||"Unknown",q=s||R||"No number",$=function(){return ce(void 0,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:if(D(!0),"incoming"===I||"ready_to_call"===I?m():h(),!(e=F||K))return[3,4];t.label=1;case 1:return t.trys.push([1,3,,4]),[4,Xn({callSid:e,reason:"connected"===I?"ended":"declined"})];case 2:return t.sent(),[3,4];case 3:return t.sent(),[3,4];case 4:return P.current=setTimeout(function(){D(!1)},ar),[2]}})})};S(function(){"idle"!==I&&"ended"!==I||(P.current&&(clearTimeout(P.current),P.current=null),D(!1))},[I]);if(S(function(){return function(){P.current&&clearTimeout(P.current)}},[]),p){var B=r||p.callerName||M||"Unknown",W=se(se({},p),{callerName:B,callerNumber:q});return i(ur,{dispositionData:W,prospectId:n,onClose:g,onSave:function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){return c?[2,c(e)]:[2,Yn({callId:e.callId,prospectId:e.prospectId||n||"",callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,dispositionNotes:e.remarks||void 0})]})})},existingData:void 0})}if("idle"===I||"ended"===I)return null;var oe,ae,ue,de="outbound"===L,pe="inbound"===L,fe="connected"===I?"bg-green-500":de?"bg-blue-500":"bg-orange-500",he=function(){return"calling"===I?"Connecting to ".concat(U,"..."):null},me=o(a,{children:[i("div",{className:"fixed inset-0 bg-black/50",style:{zIndex:or},onClick:$}),i("div",{className:"fixed inset-0 flex items-center justify-center p-4 ".concat(t),style:{zIndex:rr},children:o("div",{className:"relative w-full max-w-md p-6 bg-white shadow-2xl",style:{borderRadius:ir,border:"1px solid #e5e7eb"},onClick:function(e){return e.stopPropagation()},children:[i("button",{onClick:$,className:"absolute p-1 transition-colors rounded-full top-4 right-4 hover:bg-gray-100",children:i(H,{className:"w-5 h-5 text-gray-500"})}),i("div",{className:"flex justify-center mb-6",children:o("span",{className:"inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-sm font-medium border ".concat(de?"text-blue-600 border-blue-200 bg-blue-50":"text-green-600 border-green-200 bg-green-50"),children:[i(de?Y:X,{className:"w-4 h-4"}),de?"Outgoing Call":"Incoming Call"]})}),i("div",{className:"flex justify-center mb-4",children:i("div",{className:"w-24 h-24 rounded-full ".concat(fe," flex items-center justify-center ").concat("incoming"===I||"ready_to_call"===I?"animate-pulse-ring animate-pulse-dot":""),children:i(pe&&"incoming"===I?X:J,{className:"w-10 h-10 text-white"})})}),o("div",{className:"mb-4 text-center",children:[i(w,{variant:"h3",className:"text-xl font-semibold text-gray-900",children:U}),z&&o(w,{variant:"small",className:"font-medium text-blue-600",children:["ID: ",z]}),i(w,{variant:"muted",children:q})]}),i("div",{className:"mb-6 text-center",children:i(w,"connected"===I?{variant:"p",className:"text-lg font-medium text-green-500",children:(oe=V,ae=Math.floor(oe/60),ue=oe%60,"".concat(ae.toString().padStart(2,"0"),":").concat(ue.toString().padStart(2,"0")))}:{variant:"muted",children:function(){switch(I){case"ready_to_call":return"Ready to call...";case"calling":return"Calling...";case"incoming":return"Incoming call...";default:return null}}()})}),"connected"===I&&o("div",{className:"flex justify-center gap-6 mb-6",children:[o("div",{className:"text-center",children:[i("button",{onClick:b,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(j?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:i(j?G:Q,{className:"w-5 h-5 text-gray-600"})}),i("p",{className:"mt-1 text-xs text-gray-500",children:j?"Unmute":"Mute"})]}),o("div",{className:"text-center",children:[i("button",{onClick:v,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(A?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:i(A?Z:ee,{className:"w-5 h-5 text-gray-600"})}),i("p",{className:"mt-1 text-xs text-gray-500",children:A?"Resume":"Hold"})]}),o("div",{className:"text-center",children:[i("button",{onClick:y,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(T?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:i(T?te:ne,{className:"w-5 h-5 text-gray-600"})}),i("p",{className:"mt-1 text-xs text-gray-500",children:T?"Speaker On":"Speaker Off"})]})]}),o("div",{className:"flex justify-center gap-4",children:[("ready_to_call"===I||"incoming"===I)&&o(a,{children:[o(d,{variant:"destructive",onClick:$,disabled:C,className:"gap-2 px-6",children:[i(re,{className:"w-4 h-4"}),C?"Declining...":"Decline"]}),o(d,{variant:"default",onClick:function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:E(!0),e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,f()];case 2:return e.sent(),[3,5];case 3:return e.sent(),[3,5];case 4:return E(!1),[7];case 5:return[2]}})})},disabled:N||C,style:{backgroundColor:"#22c55e"},className:"gap-2 px-6 hover:bg-green-600",children:[i(J,{className:"w-4 h-4"}),"Accept"]})]}),"calling"===I&&o(d,{variant:"destructive",onClick:$,disabled:C,className:"gap-2 px-6",children:[i(re,{className:"w-4 h-4"}),C?"Ending...":"End Call"]}),"connected"===I&&o(d,{variant:"destructive",onClick:$,disabled:C,className:"gap-2 px-8",children:[i(re,{className:"w-4 h-4"}),C?"Ending...":"End Call"]})]}),he()&&i(w,{variant:"small",className:"mt-4 text-center text-gray-500",children:he()})]})})]});return ie(me,document.body)},pr=function(){function e(){this.algorithm="aes-256-cbc",this.secretKey=null,this.initialized=!1}return e.prototype.ensureInitialized=function(){if(!this.initialized)try{var e="431fef99-47dc-4d2a-9175-2e8f19b20225";if(e){var t=(new TextEncoder).encode(e),n=(new TextEncoder).encode("salt");this.secretKey=ae(t,n,16384,8,1,32)}this.initialized=!0}catch(e){this.initialized=!0}},e.getInstance=function(){return e.instance||(e.instance=new e),e.instance},e.prototype.decryptData=function(e){if(this.ensureInitialized(),!e||!this.secretKey)return"";try{var t=e.split(":"),n=t[0],r=t[1];if(!n||!r)return"";var o=require("crypto"),i=Buffer.from(n,"hex"),a=o.createDecipheriv(this.algorithm,Buffer.from(this.secretKey),i),s=a.update(r,"hex","utf8");return s+=a.final("utf8")}catch(e){return""}},e.prototype.maskMobile=function(e){if(!e||e.length<4)return"**********";var t="",n=e;e.startsWith("+91")?(t="+91",n=e.substring(3)):e.startsWith("91")&&e.length>10&&(t="91",n=e.substring(2));var r=n.replace(/\D/g,"");return r.length<4?t+"**********":t+r.substring(0,2)+"*".repeat(r.length-4)+r.substring(r.length-2)},e}(),fr=pr.getInstance(),hr=function(e){var t=e.phoneNumber,n=e.encryptedPhoneNumber,r=e.callerName,a=e.prospectId,s=e.className,c=e.disabled,l=nr(),u=k(!1),p=u[0],f=u[1],h=k(null),m=h[0],v=h[1];if(!l)return null;var b=l.makeCall,y=l.isConnected,g=l.callState,w=l.permissionStatus,_=l.requestMicrophoneAccess,N=l.setCallActivityId,E=l.setExotelCallSid,x="idle"!==g.phase&&"ended"!==g.phase,S=t||n;return o("div",{className:s,children:[o(d,{variant:"outline",size:"sm",onClick:function(){return ce(void 0,void 0,void 0,function(){var e,o,i,s,c,l,u,d,p,h,m,w,x,k,S;return le(this,function(O){switch(O.label){case 0:if(!y||"idle"!==g.phase&&"ended"!==g.phase)return[2];if(v(null),e=t,n&&!e)try{if(!(e=fr.decryptData(n)))return v("Failed to decrypt phone number"),[2]}catch(e){return v("Failed to decrypt phone number"),[2]}return e?(o=fr.maskMobile(e),[4,Rn.getInstance().checkAudioPermissions()]):(v("No phone number available"),[2]);case 1:return O.sent()?[3,3]:[4,_()];case 2:if(!O.sent())return v("Microphone access is required to make calls"),[2];O.label=3;case 3:return O.trys.push([3,9,10,11]),f(!0),[4,b(e,r,void 0,o)];case 4:if(i=O.sent(),(s=null===(w=null==i?void 0:i.Data)||void 0===w?void 0:w.CallSid)&&E(s),!a||!s)return[3,8];O.label=5;case 5:return O.trys.push([5,7,,8]),[4,Un({prospectId:a,toNumber:e,callSid:s})];case 6:return c=O.sent(),(l=null===(x=c.data)||void 0===x?void 0:x.id)&&N(l),[3,8];case 7:return O.sent(),[3,8];case 8:return[3,11];case 9:if(u=O.sent(),d="Failed to make call",(null==u?void 0:u.Code)||"Failed"===(null==u?void 0:u.Status)){if(p=u.Code,h=null,u.Error&&"string"==typeof u.Error)try{h=JSON.parse(u.Error)}catch(e){}m=null===(S=null===(k=null==h?void 0:h.response)||void 0===k?void 0:k.error_data)||void 0===S?void 0:S.description,d=404===p?m||"User device is currently busy or unavailable":p>=400&&p<500?m||"Unable to complete call. Please try again.":p>=500?m||"Service temporarily unavailable. Please try again later.":m||"Failed to make call"}else(null==u?void 0:u.message)&&(d=u.message);return v(d),[3,11];case 10:return f(!1),[7];case 11:return[2]}})})},disabled:c||!S||!y||x||p,title:y?x?"Call in progress":S?"denied"===w?"Microphone access denied":"Call ".concat(r||"prospect"):"No phone number":"VoIP not connected",className:"gap-1.5",children:[i("denied"===w?G:J,{className:"w-4 h-4"}),p?"Calling...":"Call"]}),m&&i("p",{className:"text-red-500 text-xs mt-1",children:m})]})},mr=function(e){var t=e.onPermissionGranted,n=e.onPermissionDenied,r=tr(),a=r.permissionStatus,s=r.requestMicrophoneAccess,c=k(!1),l=c[0],u=c[1],p=k(null),f=p[0],h=p[1];return o("div","granted"===a?{className:"flex items-center gap-2 text-green-600",children:[i(Q,{className:"w-4 h-4"}),i("span",{className:"text-sm",children:"Microphone access granted"})]}:"denied"===a?{className:"p-4 bg-red-50 rounded-lg border border-red-200",children:[o("div",{className:"flex items-center gap-2 text-red-600 mb-2",children:[i(G,{className:"w-5 h-5"}),i("span",{className:"font-medium",children:"Microphone Access Denied"})]}),i("p",{className:"text-sm text-red-600 mb-3",children:"To use the calling feature, you need to enable microphone access in your browser settings."}),o("div",{className:"text-xs text-gray-600",children:[i("p",{className:"font-medium mb-1",children:"How to enable:"}),o("ol",{className:"list-decimal list-inside space-y-1",children:[i("li",{children:"Click the lock/info icon in your browser's address bar"}),i("li",{children:'Find "Microphone" in the permissions list'}),i("li",{children:'Change the setting to "Allow"'}),i("li",{children:"Refresh the page"})]})]})]}:{className:"p-4 bg-blue-50 rounded-lg border border-blue-200",children:[o("div",{className:"flex items-center gap-2 text-blue-600 mb-2",children:[i(oe,{className:"w-5 h-5"}),i("span",{className:"font-medium",children:"Microphone Permission Required"})]}),i("p",{className:"text-sm text-gray-600 mb-3",children:"To make and receive calls, we need access to your microphone. Click the button below to grant permission."}),o(d,{variant:"default",size:"sm",onClick:function(){return ce(void 0,void 0,void 0,function(){var e;return le(this,function(r){switch(r.label){case 0:u(!0),h(null),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,s()];case 2:return r.sent()?null==t||t():(h("Microphone access was denied"),null==n||n()),[3,5];case 3:return e=r.sent(),h(e.message||"Failed to request microphone access"),null==n||n(),[3,5];case 4:return u(!1),[7];case 5:return[2]}})})},loading:l,className:"gap-1.5",children:[i(Q,{className:"w-4 h-4"}),"Allow Microphone Access"]}),f&&i("p",{className:"text-red-500 text-xs mt-2",children:f})]})},vr=function(e){var t=e.children,n=e.enabled,r=void 0===n||n,s=e.prospectId,c=e.prospectName,l=e.prospectNumber,u=k(null),d=u[0],p=u[1],f=k(!0);f[0];var h=f[1],m=k(null),v=m[0],b=m[1];return S(function(){if(r){ce(void 0,void 0,void 0,function(){var e,t;return le(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,3,4]),h(!0),[4,Fn()];case 1:return(null==(e=n.sent())?void 0:e.token)?p(e.token):b("Voice calling not configured"),[3,4];case 2:return t=n.sent(),b(t.message||"Failed to initialize calling"),[3,4];case 3:return h(!1),[7];case 4:return[2]}})})}else h(!1)},[r]),r&&!v&&d?o(er,{accessToken:d,agentUserId:"0047",autoConnectVOIP:!0,children:[t,i(dr,{prospectId:s,prospectName:c,prospectNumber:l})]}):i(a,{children:t})},br=function(e){var t=e.children,n=e.workspace,r=e.agentUserId,s=e.prospectId,c=e.prospectName,l=e.prospectNumber,u=e.onSaveDisposition,d=k(null),p=d[0],f=d[1],h=k(!0),m=h[0],v=h[1],b=k(null),y=b[0],g=b[1],w=Ee(n),_=!!r,N=C(function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){return u?[2,u(e)]:[2,Yn({callId:e.callId,prospectId:e.prospectId,callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,dispositionReason:e.dispositionReason||void 0,dispositionNotes:e.remarks||void 0})]})})},[u]);return S(function(){if(w&&_){ce(void 0,void 0,void 0,function(){var e,t;return le(this,function(n){switch(n.label){case 0:return n.trys.push([0,3,4,5]),v(!0),g(null),[4,Kn()];case 1:return n.sent().enabled?[4,Fn()]:(g("Voice calling not enabled for this tenant"),v(!1),[2]);case 2:return(null==(e=n.sent())?void 0:e.token)?f(e.token):g("Voice calling token not available"),[3,5];case 3:return t=n.sent(),g(t.message||"Failed to initialize calling"),[3,5];case 4:return v(!1),[7];case 5:return[2]}})})}else v(!1)},[w,_]),w&&_?m||y||!p?i(a,{children:t}):o(er,{accessToken:p,agentUserId:r,autoConnectVOIP:!0,children:[t,i(dr,{prospectId:s,prospectName:c,prospectNumber:l,onSaveDisposition:N})]}):i(a,{children:t})};export{de as ApplicationStore,fn as BatchSelector,hr as CallButton,ur as CallDispositionForm,ke as ConfirmDialogProvider,hn as CourseSelector,dn as DepartmentMongoMultiSelector,mn as DepartmentSelector,pn as DepartmentSqlMultiSelector,vn as EmployeesSelector,je as ErrorBoundary,gn as ExamTypeSelector,bn as ExamsRegulationSelector,dr as ExotelPhone,er as ExotelProvider,vr as ExotelWrapper,Nn as FeeTypeSelector,En as HostelBlockSelector,xn as HostelFloorSelector,kn as HostelRoomSelector,mr as MicrophonePermission,Sn as MonthYearSelector,On as PrintFormatSelector,Cn as ProgramSelector,cn as Providers,Dn as RegulationSelector,Pn as ResearchExpertDesignationSelector,In as ResearchExpertSelector,An as ResearchStageSelector,jn as SemesterSelector,sn as SnackbarProvider,Tn as StudentSelector,Ln as StudentServicesSelector,Ne as VOIP_ENABLED_WORKSPACES,br as VoIPProvider,Vn as YearRangeSelector,ge as axios,Xn as cancelCall,Kn as checkVoIPEnabled,zn as createExotelAppToken,we as createRsbuildSharedConfig,$n as fetchCallHistory,Fn as getActiveVoiceToken,Wn as getCallActivityByCallSid,Bn as getCallActivityById,Hn as getCallCountByProspect,ue as initialApplicationState,Un as initiateCallActivity,ve as institutionCode,he as isDevelopment,Ee as isVoIPEnabledForWorkspace,_e as nonWorkspaceAxios,Mn as openInNewTab,qn as registerIncomingCall,Yn as saveCallDisposition,me as tenantCode,un as useConfirm,tr as useExotel,nr as useExotelSafe,be as workspace,ye as workspaceApiMapping};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi8uLi9zcmMvY29udGV4dC9hcHBsaWNhdGlvbi1zdG9yZS50cyIsIi4uLy4uL3NyYy91dGlscy9jbGllbnQtYXV0aC10b2tlbi50cyIsIi4uLy4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi8uLi9zcmMvY29uZmlnL2F4aW9zLnRzIiwiLi4vLi4vc3JjL2NvbmZpZy9jcmVhdGVSc2J1aWxkU2hhcmVkQ29uZmlnLnRzIiwiLi4vLi4vc3JjL2NvbmZpZy9ub25Xb3Jrc3BhY2VBeGlvcy50cyIsIi4uLy4uL3NyYy9jb25maWcvdm9pcC5jb25maWcudHMiLCIuLi8uLi9zcmMvY29udGV4dC9Db25maXJtRGlhbG9nUHJvdmlkZXIudHN4IiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWVycm9yLWJvdW5kYXJ5L2Rpc3QvcmVhY3QtZXJyb3ItYm91bmRhcnkuZXNtLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGhvb2tmb3JtL3Jlc29sdmVycy95dXAvZGlzdC95dXAubWpzIiwiLi4vLi4vc3JjL2NvbnRleHQvRXJyb3JCb3VuZGFyeS9Mb2dpbi50c3giLCIuLi8uLi9zcmMvY29udGV4dC9FcnJvckJvdW5kYXJ5L0Vycm9yQm91bmRhcnkudHN4IiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlZHV4L2Rpc3QvcmVkdXgubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQvbm9kZV9tb2R1bGVzL2ltbWVyL2Rpc3QvaW1tZXIubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2Rpc3QvcmVkdXgtdGh1bmsubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQvZGlzdC9yZWR1eC10b29sa2l0Lm1vZGVybi5tanMiLCIuLi8uLi9zcmMvY29udGV4dC9TbmFja2JhclByb3ZpZGVyLnRzeCIsIi4uLy4uL3NyYy9jb250ZXh0L1Byb3ZpZGVycy50c3giLCIuLi8uLi9zcmMvaG9va3MvdXNlQ29uZmlybS50cyIsIi4uLy4uL3NyYy9tdWx0aS1zZWxlY3RvcnMvRGVwYXJ0bWVudE1vbmdvTXVsdGlTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvbXVsdGktc2VsZWN0b3JzL0RlcGFydG1lbnRTcWxNdWx0aVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvQmF0Y2hTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0NvdXJzZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRGVwYXJ0bWVudFNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRW1wbG95ZWVzU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9FeGFtUmVndWxhdGlvblNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRXhhbVR5cGVTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL3V0aWxzLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRmVlVHlwZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvSG9zdGVsQmxvY2tTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0hvc3RlbEZsb29yU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Ib3N0ZWxSb29tU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Nb250aFllYXJTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1ByaW50Rm9ybWF0U2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Qcm9ncmFtU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZWd1bGF0aW9uU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZXNlYXJjaEV4cGVydERlc2lnbmF0aW9uU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZXNlYXJjaEV4cGVydFNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvUmVzZWFyY2hTdGFnZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvU2VtZXN0ZXJTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1N0dWRlbnRTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1N0dWRlbnRTZXJ2aWNlc1NlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvWWVhclJhbmdlU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3V0aWxzL29wZW5Jbk5ld1RhYi50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9leG90ZWwvRXhvdGVsU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9leG90ZWwvYXBpLnRzIiwiLi4vLi4vc3JjL3Byb3ZpZGVycy9FeG90ZWxQcm92aWRlci50c3giLCIuLi8uLi9zcmMvY29uc3RhbnRzL2V4b3RlbC5jb25zdGFudHMudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9FeG90ZWwvQ2FsbERpc3Bvc2l0aW9uRm9ybS50c3giLCIuLi8uLi9zcmMvdXRpbHMvZXhvdGVsL2Zvcm1hdHRlcnMudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9FeG90ZWwvRXhvdGVsUGhvbmUudHN4IiwiLi4vLi4vc3JjL3NlcnZpY2VzL2NyeXB0by9DcnlwdG9TZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvRXhvdGVsL0NhbGxCdXR0b24udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvRXhvdGVsL01pY3JvcGhvbmVQZXJtaXNzaW9uLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0V4b3RlbC9FeG90ZWxXcmFwcGVyLnRzeCIsIi4uLy4uL3NyYy9wcm92aWRlcnMvVm9JUFByb3ZpZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XHJcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XHJcbiAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICB2YXIgYXIgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb3duS2V5cyhvKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xyXG4gICAgICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhc3luYykge1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcblxyXG59XHJcblxyXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcclxuICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xyXG4gICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcclxuICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdmFyIHIsIHMgPSAwO1xyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoci5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHMgfD0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgZmFpbChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dCgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcclxuICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIF9fZXh0ZW5kczogX19leHRlbmRzLFxyXG4gICAgX19hc3NpZ246IF9fYXNzaWduLFxyXG4gICAgX19yZXN0OiBfX3Jlc3QsXHJcbiAgICBfX2RlY29yYXRlOiBfX2RlY29yYXRlLFxyXG4gICAgX19wYXJhbTogX19wYXJhbSxcclxuICAgIF9fZXNEZWNvcmF0ZTogX19lc0RlY29yYXRlLFxyXG4gICAgX19ydW5Jbml0aWFsaXplcnM6IF9fcnVuSW5pdGlhbGl6ZXJzLFxyXG4gICAgX19wcm9wS2V5OiBfX3Byb3BLZXksXHJcbiAgICBfX3NldEZ1bmN0aW9uTmFtZTogX19zZXRGdW5jdGlvbk5hbWUsXHJcbiAgICBfX21ldGFkYXRhOiBfX21ldGFkYXRhLFxyXG4gICAgX19hd2FpdGVyOiBfX2F3YWl0ZXIsXHJcbiAgICBfX2dlbmVyYXRvcjogX19nZW5lcmF0b3IsXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmc6IF9fY3JlYXRlQmluZGluZyxcclxuICAgIF9fZXhwb3J0U3RhcjogX19leHBvcnRTdGFyLFxyXG4gICAgX192YWx1ZXM6IF9fdmFsdWVzLFxyXG4gICAgX19yZWFkOiBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZDogX19zcHJlYWQsXHJcbiAgICBfX3NwcmVhZEFycmF5czogX19zcHJlYWRBcnJheXMsXHJcbiAgICBfX3NwcmVhZEFycmF5OiBfX3NwcmVhZEFycmF5LFxyXG4gICAgX19hd2FpdDogX19hd2FpdCxcclxuICAgIF9fYXN5bmNHZW5lcmF0b3I6IF9fYXN5bmNHZW5lcmF0b3IsXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yOiBfX2FzeW5jRGVsZWdhdG9yLFxyXG4gICAgX19hc3luY1ZhbHVlczogX19hc3luY1ZhbHVlcyxcclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0OiBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcjogX19pbXBvcnRTdGFyLFxyXG4gICAgX19pbXBvcnREZWZhdWx0OiBfX2ltcG9ydERlZmF1bHQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldDogX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbjogX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG4gICAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2U6IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxyXG4gICAgX19kaXNwb3NlUmVzb3VyY2VzOiBfX2Rpc3Bvc2VSZXNvdXJjZXMsXHJcbiAgICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbjogX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXHJcbn07XHJcbiIsImltcG9ydCB7IFN0b3JlIH0gZnJvbSAncHVsbHN0YXRlJztcbmV4cG9ydCB2YXIgaW5pdGlhbEFwcGxpY2F0aW9uU3RhdGUgPSB7XG4gICAgaXNMb2dpbkRpYWxvZ09wZW46IGZhbHNlLFxuICAgIHNuYWNrYmFyOiB7XG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdzdWNjZXNzJyxcbiAgICB9LFxuICAgIGNvbmZpcm1EaWFsb2c6IHtcbiAgICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uQ2FuY2VsOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIHR5cGU6ICdjb25maXJtJyxcbiAgICB9LFxuICAgIHVzZXI6IHVuZGVmaW5lZCxcbiAgICBpbnN0aXR1dGlvbkluZm86IHVuZGVmaW5lZCxcbiAgICBhc3NldDogdW5kZWZpbmVkLFxufTtcbmV4cG9ydCB2YXIgQXBwbGljYXRpb25TdG9yZSA9IG5ldyBTdG9yZShpbml0aWFsQXBwbGljYXRpb25TdGF0ZSk7XG4iLCJpbXBvcnQgQ3J5cHRvSlMgZnJvbSAnY3J5cHRvLWpzJztcbmZ1bmN0aW9uIHRvQmFzZTY0VXJsKGJhc2U2NCkge1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPS9nLCAnJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDbGllbnRUb2tlbihjbGllbnRJZCwgc2VjcmV0KSB7XG4gICAgdmFyIHBheWxvYWQgPSB7IGNsaWVudElkOiBjbGllbnRJZCwgaWF0OiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSB9O1xuICAgIHZhciBwYXlsb2FkQmFzZTY0dXJsID0gdG9CYXNlNjRVcmwoYnRvYShKU09OLnN0cmluZ2lmeShwYXlsb2FkKSkpO1xuICAgIHZhciBzaWduYXR1cmVXb3JkQXJyYXkgPSBDcnlwdG9KUy5IbWFjU0hBMjU2KHBheWxvYWRCYXNlNjR1cmwsIHNlY3JldCk7XG4gICAgdmFyIHNpZ25hdHVyZUJhc2U2NHVybCA9IHRvQmFzZTY0VXJsKENyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KHNpZ25hdHVyZVdvcmRBcnJheSkpO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChwYXlsb2FkQmFzZTY0dXJsLCBcIi5cIikuY29uY2F0KHNpZ25hdHVyZUJhc2U2NHVybCk7XG59XG4iLCJleHBvcnQgdmFyIGlzRGV2ZWxvcG1lbnQgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5jbHVkZXMoJ2xvY2FsaG9zdCcpO1xuZXhwb3J0IHZhciB0ZW5hbnRDb2RlID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNwbGl0KCcuJylbMF0uc3BsaXQoJy0tJylbMF07XG4vLyBpZiB1cmwgc2VhcmNoZWQgaXMgYXVwdWxzZS5jYW1weC5pbiB0aGVuIHJlZGlyZWN0IHRvIGF1cHVsc2UuY2FtcHguaW4vYXVwdWxzZVxuZXhwb3J0IHZhciBpbnN0aXR1dGlvbkNvZGUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoJy8nKVsxXTtcbmV4cG9ydCB2YXIgd29ya3NwYWNlID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCcvJylbMl07XG4vLyBXb3Jrc3BhY2UgdG8gQVBJIGVuZHBvaW50IHByZWZpeCBtYXBwaW5nXG5leHBvcnQgdmFyIHdvcmtzcGFjZUFwaU1hcHBpbmcgPSB7XG4gICAgJ3N0dWRlbnQtd29ya3NwYWNlJzogJy9zdHVkZW50LWFwaScsXG4gICAgJ2ZhY3VsdHktd29ya3NwYWNlJzogJy9mYWN1bHR5LWFwaScsXG4gICAgJ2RlcGFydG1lbnQtd29ya3NwYWNlJzogJy9kZXBhcnRtZW50LWFwaScsXG4gICAgJ2FjYWRlbWljLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvYWNhZGVtaWMtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnZmVlZGJhY2stY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy9mZWVkYmFjay1jb29yZGluYXRvci1hcGknLFxuICAgICdjb3Vyc2UtY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy9jb3Vyc2UtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnY2xhc3Nyb29tLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvY2xhc3Nyb29tLWNvb3JkaW5hdG9yLWFwaScsXG4gICAgJ2NvZS13b3Jrc3BhY2UnOiAnL2NvZS1hcGknLFxuICAgICdhY2FkZW1pYy1hZG1pbi13b3Jrc3BhY2UnOiAnL2FjYWRlbWljLWFkbWluLWFwaScsXG4gICAgJ2hvc3RlbC1hZG1pbi13b3Jrc3BhY2UnOiAnL2hvc3RlbC1hZG1pbi1hcGknLFxuICAgICd0cmFuc3BvcnQtY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy90cmFuc3BvcnQtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnZW1wbG95ZWUtd29ya3NwYWNlJzogJy9lbXBsb3llZS1hcGknLFxuICAgICdsaWJyYXJpYW4td29ya3NwYWNlJzogJy9saWJyYXJpYW4tYXBpJyxcbiAgICAnZmVlLXRlcm1pbmFsJzogJy9mZWUtdGVybWluYWwtYXBpJyxcbiAgICAnYWNjb3VudHMtb2ZmaWNlci13b3Jrc3BhY2UnOiAnYWNjb3VudHMtb2ZmaWNlci1hcGknLFxuICAgICdmaW5hbmNlLW9mZmljZXItd29ya3NwYWNlJzogJy9maW5hbmNlLW9mZmljZXItYXBpJyxcbiAgICAnb3V0cmVhY2gtYWdlbnQtd29ya3NwYWNlJzogJ291dHJlYWNoLWFnZW50LWFwaScsXG4gICAgJ3Byb3NwZWN0LXdvcmtzcGFjZSc6ICdwcm9zcGVjdC1hcGknLFxuICAgICdleHRlcm5hbC1leHBlcnQtd29ya3NwYWNlJzogJ2V4dGVybmFsLWV4cGVydC1hcGknLFxuICAgICdyZXNlYXJjaC1jb29yZGluYXRvci13b3Jrc3BhY2UnOiAncmVzZWFyY2gtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAndGVsZS1jb3Vuc2VsbG9yLXdvcmtzcGFjZSc6ICd0ZWxlLWNvdW5zZWxsb3ItYXBpJyxcbiAgICAndGVhbS1vd25lci13b3Jrc3BhY2UnOiAnL3RlYW0tb3duZXItYXBpJyxcbiAgICAnYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLXdvcmtzcGFjZSc6ICcvYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLWFwaScsXG4gICAgJ2FkbWlzc2lvbnMtb2ZmaWNlci13b3Jrc3BhY2UnOiAnL2FkbWlzc2lvbnMtb2ZmaWNlci1hcGknLFxuICAgICdhZG1pc3Npb25zLWRpcmVjdG9yLXdvcmtzcGFjZSc6ICcvYWRtaXNzaW9ucy1kaXJlY3Rvci1hcGknLFxuICAgICdoZWxwZGVzay13b3Jrc3BhY2UnOiAnL2hlbHBkZXNrLWFwaScsXG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBBeGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvYXBwbGljYXRpb24tc3RvcmUnO1xuaW1wb3J0IHsgZ2VuZXJhdGVDbGllbnRUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2NsaWVudC1hdXRoLXRva2VuJztcbmltcG9ydCB7IGluc3RpdHV0aW9uQ29kZSwgaXNEZXZlbG9wbWVudCwgdGVuYW50Q29kZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VBcGlNYXBwaW5nLCB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG4vLyBHZXQgYmFzZSBVUkwgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbnZhciBnZXRCYXNlVXJsID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIEZvciBDcmVhdGUgUmVhY3QgQXBwXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUElfSE9TVCB8fCAnL2FwaSc7XG59O1xuLy8gRm9ybWF0IHF1ZXJ5IHBhcmFtZXRlcnNcbnZhciBmb3JtYXRQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXJhbXMgIT09IG51bGwgJiYgcGFyYW1zICE9PSB2b2lkIDAgPyBwYXJhbXMgOiB7fSkubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSA9PT0gJ19fZW1wdHlfXycgPyAnJyA6IHZhbHVlLFxuICAgICAgICBdO1xuICAgIH0pKTtcbn07XG4vLyBDcmVhdGUgYXhpb3MgaW5zdGFuY2VcbmV4cG9ydCB2YXIgYXhpb3MgPSBBeGlvcy5jcmVhdGUoe1xuICAgIGJhc2VVUkw6IGdldEJhc2VVcmwoKSxcbiAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgaGVhZGVyczoge1xuICAgICAgICAneC10ZW5hbnQtaWQnOiB0ZW5hbnRDb2RlLFxuICAgICAgICAneC1pbnN0aXR1dGlvbi1jb2RlJzogaW5zdGl0dXRpb25Db2RlLFxuICAgIH0sXG59KTtcbi8vIFJlcXVlc3QgaW50ZXJjZXB0b3JcbmF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgLy8gRm9ybWF0IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICB2YXIgcGFyYW1zID0gZm9ybWF0UGFyYW1zKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5wYXJhbXMpO1xuICAgIC8vIEhhbmRsZSB3b3Jrc3BhY2Ugcm91dGluZyAoZGVmYXVsdDogdHJ1ZSlcbiAgICBpZiAoY29uZmlnLndvcmtzcGFjZSAhPT0gZmFsc2UgJiZcbiAgICAgICAgd29ya3NwYWNlICYmXG4gICAgICAgIHdvcmtzcGFjZUFwaU1hcHBpbmdbd29ya3NwYWNlXSAmJlxuICAgICAgICB3b3Jrc3BhY2UgIT09ICdjb21tb24td29ya3NwYWNlJykge1xuICAgICAgICB2YXIgd29ya3NwYWNlUHJlZml4ID0gd29ya3NwYWNlQXBpTWFwcGluZ1t3b3Jrc3BhY2VdO1xuICAgICAgICBjb25maWcudXJsID0gXCJcIi5jb25jYXQod29ya3NwYWNlUHJlZml4KS5jb25jYXQoY29uZmlnLnVybCk7XG4gICAgfVxuICAgIC8vIEFkZCBzZXNzaW9uIHRva2VucyBmcm9tIGNvb2tpZXMgaWYgaW4gZGV2ZWxvcG1lbnRcbiAgICB2YXIgc2Vzc2lvbktleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zZXNzaW9uX2tleScpO1xuICAgIHZhciBvcGVuUGF5bWVudHNLZXkgPSBDb29raWVzLmdldCgnY2FtcHhfb3Blbl9wYXltZW50c19rZXknKTtcbiAgICB2YXIgc3R1ZGVudFNlc3Npb25LZXkgPSBDb29raWVzLmdldCgnY2FtcHhfc3R1ZGVudF9rZXknKTtcbiAgICBpZiAoaXNEZXZlbG9wbWVudCAmJiBzZXNzaW9uS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfc2Vzc2lvbl9rZXknLCBzZXNzaW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKGlzRGV2ZWxvcG1lbnQgJiYgc3R1ZGVudFNlc3Npb25LZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9zdHVkZW50X2tleScsIHN0dWRlbnRTZXNzaW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKG9wZW5QYXltZW50c0tleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X29wZW5fcGF5bWVudHNfa2V5Jywgb3BlblBheW1lbnRzS2V5KTtcbiAgICB9XG4gICAgLy8gSW5qZWN0IGNsaWVudCBhdXRoZW50aWNhdGlvbiB0b2tlblxuICAgIHZhciBjYW1weENsaWVudElkID0gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0NMSUVOVF9JRDtcbiAgICB2YXIgY2FtcHhDbGllbnRTZWNyZXQgPSBwcm9jZXNzLmVudi5SRUFDVF9BUFBfQ0FNUFhfQ0xJRU5UX1NFQ1JFVDtcbiAgICBpZiAoY2FtcHhDbGllbnRJZCAmJiBjYW1weENsaWVudFNlY3JldCkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ3gtY2FtcHgtY2xpZW50JywgZ2VuZXJhdGVDbGllbnRUb2tlbihjYW1weENsaWVudElkLCBjYW1weENsaWVudFNlY3JldCkpO1xuICAgIH1cbiAgICAvLyBTa2lwIHNlbmRpbmcgWC1pbnN0aXR1dGlvbi1jb2RlIGlmIHRoZSBmbGFnIGlzIHNldFxuICAgIGlmIChjb25maWcuc2tpcEluc3RpdHV0aW9uQ29kZSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5kZWxldGUoJ3gtaW5zdGl0dXRpb24tY29kZScpO1xuICAgIH1cbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbmZpZyksIHsgcGFyYW1zOiBwYXJhbXMgfSk7XG59LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xufSk7XG4vLyBSZXNwb25zZSBpbnRlcmNlcHRvclxuYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBoaWRlU25hY2tiYXIgcHJvcGVydHlcbiAgICB2YXIgc2hvdWxkSGlkZVNuYWNrYmFyID0gKChfYSA9IHJlc3BvbnNlLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oaWRlU25hY2tiYXIpID09PSB0cnVlO1xuICAgIC8vIEhhbmRsZSBzdWNjZXNzZnVsIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmXG4gICAgICAgIHJlc3BvbnNlLmNvbmZpZy5tZXRob2QgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhyZXNwb25zZS5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbMjAwLCAyMDEsIDIwMl0uaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSByZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ09wZXJhdGlvbiBzdWNjZXNzZnVsJztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnc3VjY2Vzcyc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIC8vIENoZWNrIGlmIHRoZSBlcnJvciByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2IgPSAoX2EgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kYXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgZXJyb3IgcmVzcG9uc2VzXG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiYgWzQwMCwgNDIyLCA0MTNdLmluY2x1ZGVzKChfYyA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIGVycm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gZXJyLnJlc3BvbnNlLmRhdGEubWVzc2FnZSB8fCAnQmFkIFJlcXVlc3QnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdlcnJvcic7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXNob3VsZEhpZGVTbmFja2JhciAmJlxuICAgICAgICAoKF9kID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhlcnIucmVzcG9uc2UuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWzQwNF0uaW5jbHVkZXMoZXJyLnJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIG5vdCBmb3VuZCBlcnJvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IGVyci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ05vdCBGb3VuZCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ2Vycm9yJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBheGlvcztcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnNidWlsZFNoYXJlZENvbmZpZyhkZXBlbmRlbmNpZXMsIGFsd2F5c0VhZ2VyLCBzaGFyZWREZXBlbmRlbmNpZXNMaXN0KSB7XG4gICAgcmV0dXJuIHNoYXJlZERlcGVuZGVuY2llc0xpc3QucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBrZykge1xuICAgICAgICB2YXIgdmVyc2lvbiA9IGRlcGVuZGVuY2llc1twa2ddO1xuICAgICAgICBpZiAodmVyc2lvbikge1xuICAgICAgICAgICAgYWNjW3BrZ10gPSBfX2Fzc2lnbih7IHNpbmdsZXRvbjogdHJ1ZSwgcmVxdWlyZWRWZXJzaW9uOiB2ZXJzaW9uLCB2ZXJzaW9uOiB2ZXJzaW9uLnJlcGxhY2UoL15bXFxefl0vLCAnJykgfSwgKGFsd2F5c0VhZ2VyLmluY2x1ZGVzKHBrZykgPyB7IGVhZ2VyOiB0cnVlIH0gOiB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xufVxuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBBeGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvYXBwbGljYXRpb24tc3RvcmUnO1xuaW1wb3J0IHsgZ2VuZXJhdGVDbGllbnRUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2NsaWVudC1hdXRoLXRva2VuJztcbmltcG9ydCB7IGluc3RpdHV0aW9uQ29kZSwgaXNEZXZlbG9wbWVudCwgdGVuYW50Q29kZSB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG4vLyBHZXQgYmFzZSBVUkwgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbnZhciBnZXRCYXNlVXJsID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIEZvciBDcmVhdGUgUmVhY3QgQXBwXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUElfSE9TVCB8fCAnL2FwaSc7XG59O1xuLy8gRm9ybWF0IHF1ZXJ5IHBhcmFtZXRlcnNcbnZhciBmb3JtYXRQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXJhbXMgIT09IG51bGwgJiYgcGFyYW1zICE9PSB2b2lkIDAgPyBwYXJhbXMgOiB7fSkubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSA9PT0gJ19fZW1wdHlfXycgPyAnJyA6IHZhbHVlLFxuICAgICAgICBdO1xuICAgIH0pKTtcbn07XG4vLyBDcmVhdGUgYXhpb3MgaW5zdGFuY2UgZm9yIHNlbGVjdG9ycyB3aXRoIHdvcmtzcGFjZTogZmFsc2VcbmV4cG9ydCB2YXIgbm9uV29ya3NwYWNlQXhpb3MgPSBBeGlvcy5jcmVhdGUoe1xuICAgIGJhc2VVUkw6IGdldEJhc2VVcmwoKSxcbiAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgd29ya3NwYWNlOiBmYWxzZSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgICd4LXRlbmFudC1pZCc6IHRlbmFudENvZGUsXG4gICAgICAgICd4LWluc3RpdHV0aW9uLWNvZGUnOiBpbnN0aXR1dGlvbkNvZGUsXG4gICAgfSxcbn0pO1xuLy8gUmVxdWVzdCBpbnRlcmNlcHRvclxubm9uV29ya3NwYWNlQXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAvLyBGb3JtYXQgcXVlcnkgcGFyYW1ldGVyc1xuICAgIHZhciBwYXJhbXMgPSBmb3JtYXRQYXJhbXMoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLnBhcmFtcyk7XG4gICAgLy8gU2tpcCB3b3Jrc3BhY2Ugcm91dGluZyBzaW5jZSB3b3Jrc3BhY2UgaXMgc2V0IHRvIGZhbHNlXG4gICAgLy8gTm8gd29ya3NwYWNlIHJvdXRpbmcgbG9naWMgbmVlZGVkIGhlcmVcbiAgICAvLyBBZGQgc2Vzc2lvbiB0b2tlbnMgZnJvbSBjb29raWVzIGlmIGluIGRldmVsb3BtZW50XG4gICAgdmFyIHNlc3Npb25LZXkgPSBDb29raWVzLmdldCgnY2FtcHhfc2Vzc2lvbl9rZXknKTtcbiAgICB2YXIgb3BlblBheW1lbnRzS2V5ID0gQ29va2llcy5nZXQoJ2NhbXB4X29wZW5fcGF5bWVudHNfa2V5Jyk7XG4gICAgdmFyIHN0dWRlbnRTZXNzaW9uS2V5ID0gQ29va2llcy5nZXQoJ2NhbXB4X3N0dWRlbnRfa2V5Jyk7XG4gICAgaWYgKGlzRGV2ZWxvcG1lbnQgJiYgc2Vzc2lvbktleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X3Nlc3Npb25fa2V5Jywgc2Vzc2lvbktleSk7XG4gICAgfVxuICAgIGlmIChpc0RldmVsb3BtZW50ICYmIHN0dWRlbnRTZXNzaW9uS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfc3R1ZGVudF9rZXknLCBzdHVkZW50U2Vzc2lvbktleSk7XG4gICAgfVxuICAgIGlmIChvcGVuUGF5bWVudHNLZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9vcGVuX3BheW1lbnRzX2tleScsIG9wZW5QYXltZW50c0tleSk7XG4gICAgfVxuICAgIC8vIEluamVjdCBjbGllbnQgYXV0aGVudGljYXRpb24gdG9rZW5cbiAgICB2YXIgY2FtcHhDbGllbnRJZCA9IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9DTElFTlRfSUQ7XG4gICAgdmFyIGNhbXB4Q2xpZW50U2VjcmV0ID0gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0NBTVBYX0NMSUVOVF9TRUNSRVQ7XG4gICAgaWYgKGNhbXB4Q2xpZW50SWQgJiYgY2FtcHhDbGllbnRTZWNyZXQpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCd4LWNhbXB4LWNsaWVudCcsIGdlbmVyYXRlQ2xpZW50VG9rZW4oY2FtcHhDbGllbnRJZCwgY2FtcHhDbGllbnRTZWNyZXQpKTtcbiAgICB9XG4gICAgLy8gU2tpcCBzZW5kaW5nIFgtaW5zdGl0dXRpb24tY29kZSBpZiB0aGUgZmxhZyBpcyBzZXRcbiAgICBpZiAoY29uZmlnLnNraXBJbnN0aXR1dGlvbkNvZGUpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuZGVsZXRlKCd4LWluc3RpdHV0aW9uLWNvZGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb25maWcpLCB7IHBhcmFtczogcGFyYW1zIH0pO1xufSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbn0pO1xuLy8gUmVzcG9uc2UgaW50ZXJjZXB0b3Jcbm5vbldvcmtzcGFjZUF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vIENoZWNrIGlmIHRoZSByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2EgPSByZXNwb25zZS5kYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgc3VjY2Vzc2Z1bCByZXNwb25zZXNcbiAgICBpZiAoIXNob3VsZEhpZGVTbmFja2JhciAmJlxuICAgICAgICByZXNwb25zZS5jb25maWcubWV0aG9kICYmXG4gICAgICAgIFsncHV0JywgJ3Bvc3QnLCAnZGVsZXRlJywgJ3BhdGNoJ10uaW5jbHVkZXMocmVzcG9uc2UuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWzIwMCwgMjAxLCAyMDJdLmluY2x1ZGVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gcmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdPcGVyYXRpb24gc3VjY2Vzc2Z1bCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ3N1Y2Nlc3MnO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufSwgZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAvLyBDaGVjayBpZiB0aGUgZXJyb3IgcmVzcG9uc2UgaGFzIGhpZGVTbmFja2JhciBwcm9wZXJ0eVxuICAgIHZhciBzaG91bGRIaWRlU25hY2tiYXIgPSAoKF9iID0gKF9hID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGF0YSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhpZGVTbmFja2JhcikgPT09IHRydWU7XG4gICAgLy8gSGFuZGxlIGVycm9yIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmIFs0MDAsIDQyMl0uaW5jbHVkZXMoKF9jID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Muc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3IgZXJyb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSBlcnIucmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdCYWQgUmVxdWVzdCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ2Vycm9yJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmXG4gICAgICAgICgoX2QgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbJ3B1dCcsICdwb3N0JywgJ2RlbGV0ZScsICdwYXRjaCddLmluY2x1ZGVzKGVyci5yZXNwb25zZS5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbNDA0XS5pbmNsdWRlcyhlcnIucmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3Igbm90IGZvdW5kIGVycm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gZXJyLnJlc3BvbnNlLmRhdGEubWVzc2FnZSB8fCAnTm90IEZvdW5kJztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnZXJyb3InO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG5vbldvcmtzcGFjZUF4aW9zO1xuIiwiLyoqXG4gKiBWb0lQIENvbmZpZ3VyYXRpb24gTW9kdWxlXG4gKlxuICogVGhpcyBtb2R1bGUgbWFuYWdlcyBWb0lQL0V4b3RlbCBjb25maWd1cmF0aW9uIGZvciB3b3Jrc3BhY2VzLlxuICogT25seSB3b3Jrc3BhY2VzIGxpc3RlZCBpbiBWT0lQX0VOQUJMRURfV09SS1NQQUNFUyB3aWxsIGhhdmUgVm9JUCBmdW5jdGlvbmFsaXR5LlxuICovXG4vKipcbiAqIExpc3Qgb2Ygd29ya3NwYWNlcyB0aGF0IGhhdmUgVm9JUC9FeG90ZWwgY2FsbGluZyBlbmFibGVkLlxuICogQWRkIHdvcmtzcGFjZSBuYW1lcyBoZXJlIHRvIGVuYWJsZSBWb0lQIGZvciB0aGF0IHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IHZhciBWT0lQX0VOQUJMRURfV09SS1NQQUNFUyA9IFtcbiAgICAnYWRtaXNzaW9ucy1kaXJlY3Rvci13b3Jrc3BhY2UnLFxuICAgICdhZG1pc3Npb25zLWNvdW5zZWxsb3Itd29ya3NwYWNlJyxcbiAgICAnYWRtaXNzaW9ucy1vZmZpY2VyLXdvcmtzcGFjZScsXG4gICAgJ3RlbGUtY291bnNlbGxvci13b3Jrc3BhY2UnLFxuXTtcbi8qKlxuICogQ2hlY2sgaWYgVm9JUCBpcyBlbmFibGVkIGZvciBhIGdpdmVuIHdvcmtzcGFjZVxuICpcbiAqIEBwYXJhbSB3b3Jrc3BhY2VOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdvcmtzcGFjZSB0byBjaGVja1xuICogQHJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIFZvSVAgaXMgZW5hYmxlZCBmb3IgdGhlIHdvcmtzcGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWb0lQRW5hYmxlZEZvcldvcmtzcGFjZSh3b3Jrc3BhY2VOYW1lKSB7XG4gICAgcmV0dXJuIFZPSVBfRU5BQkxFRF9XT1JLU1BBQ0VTLmluY2x1ZGVzKHdvcmtzcGFjZU5hbWUpO1xufVxuIiwiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IENvbmZpcm1EaWFsb2cgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblN0b3JlIH0gZnJvbSAnLi9hcHBsaWNhdGlvbi1zdG9yZSc7XG52YXIgQ29uZmlybUNvbnRleHQgPSBjcmVhdGVDb250ZXh0KHtcbiAgICBzaG93Q29uZmlybURpYWxvZzogZnVuY3Rpb24gKCkgeyB9LFxufSk7XG5leHBvcnQgdmFyIENvbmZpcm1EaWFsb2dQcm92aWRlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuO1xuICAgIHZhciBjb25maXJtRGlhbG9nID0gQXBwbGljYXRpb25TdG9yZS51c2VTdGF0ZShmdW5jdGlvbiAocykgeyByZXR1cm4gcy5jb25maXJtRGlhbG9nOyB9KTtcbiAgICB2YXIgc2hvd0NvbmZpcm1EaWFsb2cgPSBmdW5jdGlvbiAodGl0bGUsIG1lc3NhZ2UsIG9uQ29uZmlybSwgb25DYW5jZWwsIHR5cGUsIGNvbmZpcm1UZXh0LCBjYW5jZWxUZXh0KSB7XG4gICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9ICdjb25maXJtJzsgfVxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5jb25maXJtRGlhbG9nID0ge1xuICAgICAgICAgICAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBvbkNvbmZpcm06IG9uQ29uZmlybSxcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogb25DYW5jZWwsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogY29uZmlybVRleHQsXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogY2FuY2VsVGV4dCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZUNsb3NlRGlhbG9nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5jb25maXJtRGlhbG9nLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiAoX2pzeHMoQ29uZmlybUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHsgc2hvd0NvbmZpcm1EaWFsb2c6IHNob3dDb25maXJtRGlhbG9nIH0sIGNoaWxkcmVuOiBbY2hpbGRyZW4sIF9qc3goQ29uZmlybURpYWxvZywgeyBvcGVuOiBjb25maXJtRGlhbG9nLmlzT3BlbiwgdGl0bGU6IGNvbmZpcm1EaWFsb2cudGl0bGUsIG1lc3NhZ2U6IGNvbmZpcm1EaWFsb2cubWVzc2FnZSwgdmFyaWFudDogY29uZmlybURpYWxvZy50eXBlLCBjb25maXJtVGV4dDogY29uZmlybURpYWxvZy5jb25maXJtQnV0dG9uVGV4dCwgY2FuY2VsVGV4dDogY29uZmlybURpYWxvZy5jYW5jZWxCdXR0b25UZXh0LCBvbkNvbmZpcm06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybURpYWxvZy5vbkNvbmZpcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2VEaWFsb2coKTtcbiAgICAgICAgICAgICAgICB9LCBvbkNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1EaWFsb2cub25DYW5jZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2VEaWFsb2coKTtcbiAgICAgICAgICAgICAgICB9IH0pXSB9KSk7XG59O1xuIiwiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQsIGUpIHtcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyA9IGUsIHQ7XG4gIH0sIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9zZXRQcm90b3R5cGVPZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG52YXIgY2hhbmdlZEFycmF5ID0gZnVuY3Rpb24gY2hhbmdlZEFycmF5KGEsIGIpIHtcbiAgaWYgKGEgPT09IHZvaWQgMCkge1xuICAgIGEgPSBbXTtcbiAgfVxuXG4gIGlmIChiID09PSB2b2lkIDApIHtcbiAgICBiID0gW107XG4gIH1cblxuICByZXR1cm4gYS5sZW5ndGggIT09IGIubGVuZ3RoIHx8IGEuc29tZShmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICByZXR1cm4gIU9iamVjdC5pcyhpdGVtLCBiW2luZGV4XSk7XG4gIH0pO1xufTtcblxudmFyIGluaXRpYWxTdGF0ZSA9IHtcbiAgZXJyb3I6IG51bGxcbn07XG5cbnZhciBFcnJvckJvdW5kYXJ5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKEVycm9yQm91bmRhcnksIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEVycm9yQm91bmRhcnkoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF9hcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgX2FyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChfYXJncykpIHx8IHRoaXM7XG4gICAgX3RoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7XG5cbiAgICBfdGhpcy5yZXNldEVycm9yQm91bmRhcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM7XG5cbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnByb3BzLm9uUmVzZXQgPT0gbnVsbCA/IHZvaWQgMCA6IChfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzKS5vblJlc2V0LmFwcGx5KF90aGlzJHByb3BzLCBhcmdzKTtcblxuICAgICAgX3RoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgRXJyb3JCb3VuZGFyeS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPSBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGVycm9yXG4gICAgfTtcbiAgfTtcblxuICB2YXIgX3Byb3RvID0gRXJyb3JCb3VuZGFyeS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRDYXRjaCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBpbmZvKSB7XG4gICAgdmFyIF90aGlzJHByb3BzJG9uRXJyb3IsIF90aGlzJHByb3BzMjtcblxuICAgIChfdGhpcyRwcm9wcyRvbkVycm9yID0gKF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMpLm9uRXJyb3IpID09IG51bGwgPyB2b2lkIDAgOiBfdGhpcyRwcm9wcyRvbkVycm9yLmNhbGwoX3RoaXMkcHJvcHMyLCBlcnJvciwgaW5mbyk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIHZhciBlcnJvciA9IHRoaXMuc3RhdGUuZXJyb3I7XG4gICAgdmFyIHJlc2V0S2V5cyA9IHRoaXMucHJvcHMucmVzZXRLZXlzOyAvLyBUaGVyZSdzIGFuIGVkZ2UgY2FzZSB3aGVyZSBpZiB0aGUgdGhpbmcgdGhhdCB0cmlnZ2VyZWQgdGhlIGVycm9yXG4gICAgLy8gaGFwcGVucyB0byAqYWxzbyogYmUgaW4gdGhlIHJlc2V0S2V5cyBhcnJheSwgd2UnZCBlbmQgdXAgcmVzZXR0aW5nXG4gICAgLy8gdGhlIGVycm9yIGJvdW5kYXJ5IGltbWVkaWF0ZWx5LiBUaGlzIHdvdWxkIGxpa2VseSB0cmlnZ2VyIGEgc2Vjb25kXG4gICAgLy8gZXJyb3IgdG8gYmUgdGhyb3duLlxuICAgIC8vIFNvIHdlIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoZSByZXNldEtleXMgb24gdGhlIGZpcnN0IGNhbGxcbiAgICAvLyBvZiBjRFUgYWZ0ZXIgdGhlIGVycm9yIGlzIHNldFxuXG4gICAgaWYgKGVycm9yICE9PSBudWxsICYmIHByZXZTdGF0ZS5lcnJvciAhPT0gbnVsbCAmJiBjaGFuZ2VkQXJyYXkocHJldlByb3BzLnJlc2V0S2V5cywgcmVzZXRLZXlzKSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzJG9uUmVzZXRLZSwgX3RoaXMkcHJvcHMzO1xuXG4gICAgICAoX3RoaXMkcHJvcHMkb25SZXNldEtlID0gKF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMpLm9uUmVzZXRLZXlzQ2hhbmdlKSA9PSBudWxsID8gdm9pZCAwIDogX3RoaXMkcHJvcHMkb25SZXNldEtlLmNhbGwoX3RoaXMkcHJvcHMzLCBwcmV2UHJvcHMucmVzZXRLZXlzLCByZXNldEtleXMpO1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBlcnJvciA9IHRoaXMuc3RhdGUuZXJyb3I7XG4gICAgdmFyIF90aGlzJHByb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgIGZhbGxiYWNrUmVuZGVyID0gX3RoaXMkcHJvcHM0LmZhbGxiYWNrUmVuZGVyLFxuICAgICAgICBGYWxsYmFja0NvbXBvbmVudCA9IF90aGlzJHByb3BzNC5GYWxsYmFja0NvbXBvbmVudCxcbiAgICAgICAgZmFsbGJhY2sgPSBfdGhpcyRwcm9wczQuZmFsbGJhY2s7XG5cbiAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgIHZhciBfcHJvcHMgPSB7XG4gICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgcmVzZXRFcnJvckJvdW5kYXJ5OiB0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeVxuICAgICAgfTtcblxuICAgICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoZmFsbGJhY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZhbGxiYWNrUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFja1JlbmRlcihfcHJvcHMpO1xuICAgICAgfSBlbHNlIGlmIChGYWxsYmFja0NvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmFsbGJhY2tDb21wb25lbnQsIF9wcm9wcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlYWN0LWVycm9yLWJvdW5kYXJ5IHJlcXVpcmVzIGVpdGhlciBhIGZhbGxiYWNrLCBmYWxsYmFja1JlbmRlciwgb3IgRmFsbGJhY2tDb21wb25lbnQgcHJvcCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICB9O1xuXG4gIHJldHVybiBFcnJvckJvdW5kYXJ5O1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5mdW5jdGlvbiB3aXRoRXJyb3JCb3VuZGFyeShDb21wb25lbnQsIGVycm9yQm91bmRhcnlQcm9wcykge1xuICB2YXIgV3JhcHBlZCA9IGZ1bmN0aW9uIFdyYXBwZWQocHJvcHMpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXJyb3JCb3VuZGFyeSwgZXJyb3JCb3VuZGFyeVByb3BzLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHByb3BzKSk7XG4gIH07IC8vIEZvcm1hdCBmb3IgZGlzcGxheSBpbiBEZXZUb29sc1xuXG5cbiAgdmFyIG5hbWUgPSBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ1Vua25vd24nO1xuICBXcmFwcGVkLmRpc3BsYXlOYW1lID0gXCJ3aXRoRXJyb3JCb3VuZGFyeShcIiArIG5hbWUgKyBcIilcIjtcbiAgcmV0dXJuIFdyYXBwZWQ7XG59XG5cbmZ1bmN0aW9uIHVzZUVycm9ySGFuZGxlcihnaXZlbkVycm9yKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICAgIGVycm9yID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgICAgc2V0RXJyb3IgPSBfUmVhY3QkdXNlU3RhdGVbMV07XG5cbiAgaWYgKGdpdmVuRXJyb3IgIT0gbnVsbCkgdGhyb3cgZ2l2ZW5FcnJvcjtcbiAgaWYgKGVycm9yICE9IG51bGwpIHRocm93IGVycm9yO1xuICByZXR1cm4gc2V0RXJyb3I7XG59XG4vKlxuZXNsaW50XG4gIEB0eXBlc2NyaXB0LWVzbGludC9zb3J0LXR5cGUtdW5pb24taW50ZXJzZWN0aW9uLW1lbWJlcnM6IFwib2ZmXCIsXG4gIEB0eXBlc2NyaXB0LWVzbGludC9uby10aHJvdy1saXRlcmFsOiBcIm9mZlwiLFxuICBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZzogXCJvZmZcIlxuKi9cblxuZXhwb3J0IHsgRXJyb3JCb3VuZGFyeSwgdXNlRXJyb3JIYW5kbGVyLCB3aXRoRXJyb3JCb3VuZGFyeSB9O1xuIiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSh0LCBvKSB7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gdCwgc2V0UHJvdG90eXBlT2YodCwgbyk7XG59XG5leHBvcnQgeyBfaW5oZXJpdHNMb29zZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0e3ZhbGlkYXRlRmllbGRzTmF0aXZlbHkgYXMgZSx0b05lc3RFcnJvciBhcyB0fWZyb21cIkBob29rZm9ybS9yZXNvbHZlcnNcIjtpbXBvcnR7YXBwZW5kRXJyb3JzIGFzIHJ9ZnJvbVwicmVhY3QtaG9vay1mb3JtXCI7dmFyIG89ZnVuY3Rpb24obyxuLGEpe3JldHVybiB2b2lkIDA9PT1uJiYobj17fSksdm9pZCAwPT09YSYmKGE9e30pLGZ1bmN0aW9uKHMsaSxjKXt0cnl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShmdW5jdGlvbih0LHIpe3RyeXt2YXIgdT0obi5jb250ZXh0JiZcImRldmVsb3BtZW50XCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOViYmY29uc29sZS53YXJuKFwiWW91IHNob3VsZCBub3QgdXNlZCB0aGUgeXVwIG9wdGlvbnMgY29udGV4dC4gUGxlYXNlLCB1c2UgdGhlICd1c2VGb3JtJyBjb250ZXh0IG9iamVjdCBpbnN0ZWFkXCIpLFByb21pc2UucmVzb2x2ZShvW1wic3luY1wiPT09YS5tb2RlP1widmFsaWRhdGVTeW5jXCI6XCJ2YWxpZGF0ZVwiXShzLE9iamVjdC5hc3NpZ24oe2Fib3J0RWFybHk6ITF9LG4se2NvbnRleHQ6aX0pKSkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gYy5zaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uJiZlKHt9LGMpLHt2YWx1ZXM6YS5yYXdWYWx1ZXM/czp0LGVycm9yczp7fX19KSl9Y2F0Y2goZSl7cmV0dXJuIHIoZSl9cmV0dXJuIHUmJnUudGhlbj91LnRoZW4odm9pZCAwLHIpOnV9KDAsZnVuY3Rpb24oZSl7aWYoIWUuaW5uZXIpdGhyb3cgZTtyZXR1cm57dmFsdWVzOnt9LGVycm9yczp0KChvPWUsbj0hYy5zaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uJiZcImFsbFwiPT09Yy5jcml0ZXJpYU1vZGUsKG8uaW5uZXJ8fFtdKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtpZihlW3QucGF0aF18fChlW3QucGF0aF09e21lc3NhZ2U6dC5tZXNzYWdlLHR5cGU6dC50eXBlfSksbil7dmFyIG89ZVt0LnBhdGhdLnR5cGVzLGE9byYmb1t0LnR5cGVdO2VbdC5wYXRoXT1yKHQucGF0aCxuLGUsdC50eXBlLGE/W10uY29uY2F0KGEsdC5tZXNzYWdlKTp0Lm1lc3NhZ2UpfXJldHVybiBlfSx7fSkpLGMpfTt2YXIgbyxufSkpfWNhdGNoKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX19fTtleHBvcnR7byBhcyB5dXBSZXNvbHZlcn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD15dXAubW9kdWxlLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBCdXR0b24sIEljb25zLCBQYXNzd29yZEZpZWxkLCBUZXh0RmllbGQsIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyB5dXBSZXNvbHZlciB9IGZyb20gJ0Bob29rZm9ybS9yZXNvbHZlcnMveXVwJztcbmltcG9ydCBEZXZpY2VEZXRlY3RvciBmcm9tICdkZXZpY2UtZGV0ZWN0b3ItanMnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb250cm9sbGVyLCB1c2VGb3JtIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZU11dGF0aW9uIH0gZnJvbSAncmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCAqIGFzIFl1cCBmcm9tICd5dXAnO1xuaW1wb3J0IHsgYXhpb3MgfSBmcm9tICcuLi8uLi9jb25maWcvYXhpb3MnO1xuaW1wb3J0IHsgaXNEZXZlbG9wbWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbnN0YW50cyc7XG52YXIgcGVyZm9ybUxvZ2luID0gZnVuY3Rpb24gKGJvZHkpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3BvbnNlLCBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGlmICghKCFib2R5LmxhdGl0dWRlIHx8ICFib2R5LmxvbmdpdHVkZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGZldGNoKCdodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9nZW9sb2NhdGlvbi92MS9nZW9sb2NhdGU/a2V5PUFJemFTeUIyWUNwbzF5aTEwN1JZajFMZFp1MkRDY3BjTzkzcmVGWScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNpZGVySXA6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmVzcG9uc2UuanNvbigpXTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBkYXRhID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgIGJvZHkubGF0aXR1ZGUgPSBkYXRhLmxvY2F0aW9uLmxhdDtcbiAgICAgICAgICAgICAgICBib2R5LmxvbmdpdHVkZSA9IGRhdGEubG9jYXRpb24ubG5nO1xuICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGF4aW9zXG4gICAgICAgICAgICAgICAgICAgIC5wb3N0KFwiL2F1dGgtc2VydmVyL2F1dGgtdjIvbG9naW5cIiwgYm9keSwge1xuICAgICAgICAgICAgICAgICAgICB3b3Jrc3BhY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHJlcy5kYXRhOyB9KV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xudmFyIHZhbGlkYXRpb25TY2hlbWEgPSBZdXAub2JqZWN0KCkuc2hhcGUoe1xuICAgIHVzZXJuYW1lOiBZdXAuc3RyaW5nKCkucmVxdWlyZWQoJ1VzZXJuYW1lIGlzIHJlcXVpcmVkJyksXG4gICAgcGFzc3dvcmQ6IFl1cC5zdHJpbmcoKS5yZXF1aXJlZCgnUGFzc3dvcmQgaXMgcmVxdWlyZWQnKSxcbn0pO1xuZXhwb3J0IHZhciBMb2dpbiA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjbG9zZSA9IF9hLmNsb3NlO1xuICAgIHZhciBfYiA9IHVzZVN0YXRlKHtcbiAgICAgICAgZGV2aWNlSW5mb3JtYXRpb246IHtcbiAgICAgICAgICAgIGRldmljZVR5cGU6ICdicm93c2VyJyxcbiAgICAgICAgICAgIGNsaWVudE5hbWU6ICd1bmtub3duJyxcbiAgICAgICAgICAgIG9zOiAndW5rbm93bicsXG4gICAgICAgICAgICBvc1ZlcnNpb246ICd1bmtub3duJyxcbiAgICAgICAgICAgIGxhdGl0dWRlOiBudWxsLFxuICAgICAgICAgICAgbG9uZ2l0dWRlOiBudWxsLFxuICAgICAgICAgICAgdG9rZW5UeXBlOiAnV0VCJyxcbiAgICAgICAgfSxcbiAgICAgICAgaXNMb2NhdGlvbkFsbG93ZWQ6IHRydWUsXG4gICAgfSksIGRldmljZVN0YXRlID0gX2JbMF0sIHNldERldmljZVN0YXRlID0gX2JbMV07XG4gICAgdmFyIG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGZ1bmN0aW9uIChwb3NpdGlvbikge1xuICAgICAgICAgICAgc2V0RGV2aWNlU3RhdGUoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcyksIHsgZGV2aWNlSW5mb3JtYXRpb246IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzLmRldmljZUluZm9ybWF0aW9uKSwgeyBsYXRpdHVkZTogcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlLCBsb25naXR1ZGU6IHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUgfSkgfSkpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG5hdmlnYXRvci5wZXJtaXNzaW9uc1xuICAgICAgICAgICAgLnF1ZXJ5KHsgbmFtZTogJ2dlb2xvY2F0aW9uJyB9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHBlcm1pc3Npb25TdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uU3RhdHVzLnN0YXRlID09PSAnZGVuaWVkJykge1xuICAgICAgICAgICAgICAgIHNldERldmljZVN0YXRlKGZ1bmN0aW9uIChzKSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHMpLCB7IGlzTG9jYXRpb25BbGxvd2VkOiBmYWxzZSB9KSk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGRldGVjdG9yID0gbmV3IERldmljZURldGVjdG9yKCk7XG4gICAgICAgIHZhciBkZXZpY2VJbmZvID0gZGV0ZWN0b3IucGFyc2UobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICAgIHNldERldmljZVN0YXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgIHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHMpLCB7IGRldmljZUluZm9ybWF0aW9uOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcy5kZXZpY2VJbmZvcm1hdGlvbiksIHsgY2xpZW50TmFtZTogKChfYSA9IGRldmljZUluZm8uY2xpZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmFtZSkgfHwgcy5kZXZpY2VJbmZvcm1hdGlvbi5jbGllbnROYW1lLCBvczogKChfYiA9IGRldmljZUluZm8ub3MpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5uYW1lKSB8fCBzLmRldmljZUluZm9ybWF0aW9uLm9zLCBvc1ZlcnNpb246ICgoX2MgPSBkZXZpY2VJbmZvLm9zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudmVyc2lvbikgfHwgcy5kZXZpY2VJbmZvcm1hdGlvbi5vc1ZlcnNpb24gfSkgfSkpO1xuICAgICAgICB9KTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIF9jID0gdXNlRm9ybSh7XG4gICAgICAgIHJlc29sdmVyOiB5dXBSZXNvbHZlcih2YWxpZGF0aW9uU2NoZW1hKSxcbiAgICB9KSwgaGFuZGxlU3VibWl0ID0gX2MuaGFuZGxlU3VibWl0LCBjb250cm9sID0gX2MuY29udHJvbCwgZXJyb3JzID0gX2MuZm9ybVN0YXRlLmVycm9ycztcbiAgICB2YXIgX2QgPSB1c2VNdXRhdGlvbihwZXJmb3JtTG9naW4sIHtcbiAgICAgICAgb25TdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKGlzRGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBDb29raWVzLnJlbW92ZSgnY2FtcHhfc2Vzc2lvbl9rZXknKTtcbiAgICAgICAgICAgICAgICBDb29raWVzLnNldCgnY2FtcHhfc2Vzc2lvbl9rZXknLCBkYXRhLnNlc3Npb24udG9rZW4pO1xuICAgICAgICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgICAgICAgICAgbmF2aWdhdGUoXCIvXCIuY29uY2F0KGRhdGEuc2Vzc2lvbi5pbnN0aXR1dGlvbkNvZGUsIFwiL3dvcmtzcGFjZVwiKSk7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pLCBtdXRhdGUgPSBfZC5tdXRhdGUsIGlzTG9hZGluZyA9IF9kLmlzTG9hZGluZztcbiAgICB2YXIgb25TdWJtaXQgPSBmdW5jdGlvbiAoYm9keSkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgbXV0YXRlKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBib2R5KSwgZGV2aWNlU3RhdGUuZGV2aWNlSW5mb3JtYXRpb24pLCB7IGxvZ2luSWQ6IGJvZHkudXNlcm5hbWUsIGxvZ2luVHlwZTogJ1VTRVInIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgfSk7XG4gICAgfSk7IH07XG4gICAgcmV0dXJuIChfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGZsZXgtY29sIGdhcC04IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBwLThcIiwgY2hpbGRyZW46IFtfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtOSB3LTQ4XCIsIGNoaWxkcmVuOiBfanN4KEljb25zLkNhbXB4RnVsbExvZ29JY29uLCB7fSkgfSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggZmxleC1jb2wgZ2FwLTQgdy1mdWxsIG1heC13LVs0MDBweF1cIiwgY2hpbGRyZW46IFtfanN4KENvbnRyb2xsZXIsIHsgY29udHJvbDogY29udHJvbCwgcmVuZGVyOiBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBfYS5maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9qc3goVGV4dEZpZWxkLCB7IG5hbWU6IFwidXNlcm5hbWVcIiwgcGxhY2Vob2xkZXI6IFwiRW50ZXIgVXNlcm5hbWUgb3IgRW1haWxcIiwgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLCBsYWJlbDogXCJVc2VybmFtZSBvciBFbWFpbFwiLCBlcnJvcjogISFlcnJvcnMudXNlcm5hbWUsIHJlcXVpcmVkOiB0cnVlLCBmdWxsV2lkdGg6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgbmFtZTogXCJ1c2VybmFtZVwiIH0pLCBfanN4KENvbnRyb2xsZXIsIHsgY29udHJvbDogY29udHJvbCwgcmVuZGVyOiBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBfYS5maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9qc3goUGFzc3dvcmRGaWVsZCwgeyBuYW1lOiBcInBhc3N3b3JkXCIsIHBsYWNlaG9sZGVyOiBcIkVudGVyIHBhc3N3b3JkXCIsIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSwgbGFiZWw6IFwiUGFzc3dvcmRcIiwgZXJyb3I6ICEhZXJyb3JzLnBhc3N3b3JkLCByZXF1aXJlZDogdHJ1ZSwgZnVsbFdpZHRoOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG5hbWU6IFwicGFzc3dvcmRcIiB9KSwgX2pzeChCdXR0b24sIHsgdHlwZTogXCJzdWJtaXRcIiwgY29sb3I6IFwicHJpbWFyeVwiLCB2YXJpYW50OiBcImRlZmF1bHRcIiwgb25DbGljazogaGFuZGxlU3VibWl0KG9uU3VibWl0KSwgZGlzYWJsZWQ6IGlzTG9hZGluZywgbG9hZGluZzogaXNMb2FkaW5nLCBmdWxsV2lkdGg6IHRydWUsIGNoaWxkcmVuOiBcIkxvZ2luXCIgfSldIH0pXSB9KSk7XG59O1xuIiwiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgQnV0dG9uLCBEaWFsb2csIEludGVybmFsU2VydmVyRXJyb3IsIE5vSW50ZXJuZUNvbm5lY3Rpb24sIFJlc291cmNlTm90Rm91bmQsIFVuQXV0aG9yaXplZCwgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEVycm9yQm91bmRhcnkgYXMgUmVhY3RFcnJvckJvdW5kYXJ5IH0gZnJvbSAncmVhY3QtZXJyb3ItYm91bmRhcnknO1xuaW1wb3J0IHsgUXVlcnlFcnJvclJlc2V0Qm91bmRhcnkgfSBmcm9tICdyZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyB1c2VMb2NhdGlvbiwgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCB7IGluc3RpdHV0aW9uQ29kZSwgd29ya3NwYWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uc3RhbnRzJztcbmltcG9ydCB7IExvZ2luIH0gZnJvbSAnLi9Mb2dpbic7XG5leHBvcnQgdmFyIEVycm9yQm91bmRhcnkgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICB2YXIgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICAgIHJldHVybiAoX2pzeChRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSwgeyBjaGlsZHJlbjogZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICB2YXIgcmVzZXQgPSBfYS5yZXNldDtcbiAgICAgICAgICAgIHJldHVybiAoX2pzeChSZWFjdEVycm9yQm91bmRhcnksIHsgb25SZXNldDogcmVzZXQsIEZhbGxiYWNrQ29tcG9uZW50OiBFcnJvckZhbGxiYWNrLCBjaGlsZHJlbjogcHJvcHMuY2hpbGRyZW4gfSwgbG9jYXRpb24gPT09IG51bGwgfHwgbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2F0aW9uLnBhdGhuYW1lKSk7XG4gICAgICAgIH0gfSkpO1xufTtcbnZhciBFcnJvckZhbGxiYWNrID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oO1xuICAgIHZhciBlcnJvciA9IF9hLmVycm9yLCByZXNldEVycm9yQm91bmRhcnkgPSBfYS5yZXNldEVycm9yQm91bmRhcnk7XG4gICAgaWYgKChfYiA9IGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnN0YXR1cykge1xuICAgICAgICBzd2l0Y2ggKChfYyA9IGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnN0YXR1cykge1xuICAgICAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9qc3goVW5BdXRoLCB7fSk7XG4gICAgICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2pzeChJbnRlcm5hbFNlcnZlckVycm9yLCB7IHJlc2V0Qm91bmRhcnk6IHJlc2V0RXJyb3JCb3VuZGFyeSB9KTtcbiAgICAgICAgICAgIGNhc2UgNDA0OlxuICAgICAgICAgICAgICAgIHJldHVybiBfanN4KFJlc291cmNlTm90Rm91bmQsIHsgbWVzc2FnZTogKF9lID0gKF9kID0gZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuZGF0YSkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLm1lc3NhZ2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IuY29kZSkgPT09ICdFUlJfTkVUV09SSycpIHtcbiAgICAgICAgcmV0dXJuIF9qc3goTm9JbnRlcm5lQ29ubmVjdGlvbiwgeyByZXNldEJvdW5kYXJ5OiByZXNldEVycm9yQm91bmRhcnkgfSk7XG4gICAgfVxuICAgIHJldHVybiAoX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJtdC00IHAtNVwiLCBjaGlsZHJlbjogX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwicmVsYXRpdmUgaC0xNSBib3JkZXIgYm9yZGVyLXJlZC0yMDAgYmctcmVkLTUwIGZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtbWQgIHB4LTJcIiwgY2hpbGRyZW46IFtfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXgtMSB0ZXh0LXJlZC03MDAgYmctdHJhbnNwYXJlbnRcIiwgY2hpbGRyZW46IChfaCA9IChfZyA9IChfZiA9IGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLmRhdGEpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IubWVzc2FnZSB9KSwgX2pzeChCdXR0b24sIHsgb25DbGljazogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzZXRFcnJvckJvdW5kYXJ5KCk7IH0sIHNpemU6IFwic21cIiwgdmFyaWFudDogXCJsaW5rXCIsIGNsYXNzTmFtZTogXCJob3Zlcjpuby11bmRlcmxpbmUgdGV4dC1kZXN0cnVjdGl2ZVwiLCBjaGlsZHJlbjogXCJUcnkgQWdhaW5cIiB9KV0gfSkgfSkpO1xufTtcbnZhciBVbkF1dGggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcbiAgICB2YXIgX2EgPSB1c2VTdGF0ZShmYWxzZSksIGlzTW9kYWxPcGVuID0gX2FbMF0sIHNldE1vZGFsT3BlbiA9IF9hWzFdO1xuICAgIHZhciBzZXNzaW9uQ29va2llID0gQ29va2llcy5nZXQoJ2NhbXB4X3Nlc3Npb25fa2V5Jyk7XG4gICAgdmFyIGhhbmRsZUxvZ2luQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc3BsaXQoJy4nKVsxXSA9PT0gJ2xvY2FsaG9zdCcpIHtcbiAgICAgICAgICAgIHNldE1vZGFsT3Blbih0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghc2Vzc2lvbkNvb2tpZSkge1xuICAgICAgICAgICAgICAgIGlmICh3b3Jrc3BhY2UgPT09ICdwcm9zcGVjdC13b3Jrc3BhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRlKFwiXCIuY29uY2F0KGluc3RpdHV0aW9uQ29kZSwgXCIvYXRzL2xvZ2luXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0ZSgnL2F1dGgvbG9naW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIChfanN4KFVuQXV0aG9yaXplZCwgeyBjb21wb25lbnQ6IF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goQnV0dG9uLCB7IGNsYXNzTmFtZTogXCJtdC01XCIsIHZhcmlhbnQ6IFwiZGVmYXVsdFwiLCBvbkNsaWNrOiBoYW5kbGVMb2dpbkNsaWNrLCBjaGlsZHJlbjogXCJDbGljayBIZXJlIFRvIExvZ2luXCIgfSksIF9qc3goRGlhbG9nLCB7IG9wZW46IGlzTW9kYWxPcGVuLCBvbkNsb3NlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBzZXRNb2RhbE9wZW4oZmFsc2UpOyB9LCBjb250ZW50OiBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9zZSA9IF9hLmNsb3NlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9qc3goTG9naW4sIHsgY2xvc2U6IGNsb3NlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IH0pXSB9KSB9KSk7XG59O1xuIiwiLy8gc3JjL3V0aWxzL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UudHNcbmZ1bmN0aW9uIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoY29kZSkge1xuICByZXR1cm4gYE1pbmlmaWVkIFJlZHV4IGVycm9yICMke2NvZGV9OyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT0ke2NvZGV9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMuIGA7XG59XG5cbi8vIHNyYy91dGlscy9zeW1ib2wtb2JzZXJ2YWJsZS50c1xudmFyICQkb2JzZXJ2YWJsZSA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5vYnNlcnZhYmxlIHx8IFwiQEBvYnNlcnZhYmxlXCIpKCk7XG52YXIgc3ltYm9sX29ic2VydmFibGVfZGVmYXVsdCA9ICQkb2JzZXJ2YWJsZTtcblxuLy8gc3JjL3V0aWxzL2FjdGlvblR5cGVzLnRzXG52YXIgcmFuZG9tU3RyaW5nID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KFwiXCIpLmpvaW4oXCIuXCIpO1xudmFyIEFjdGlvblR5cGVzID0ge1xuICBJTklUOiBgQEByZWR1eC9JTklUJHsvKiBAX19QVVJFX18gKi8gcmFuZG9tU3RyaW5nKCl9YCxcbiAgUkVQTEFDRTogYEBAcmVkdXgvUkVQTEFDRSR7LyogQF9fUFVSRV9fICovIHJhbmRvbVN0cmluZygpfWAsXG4gIFBST0JFX1VOS05PV05fQUNUSU9OOiAoKSA9PiBgQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTiR7cmFuZG9tU3RyaW5nKCl9YFxufTtcbnZhciBhY3Rpb25UeXBlc19kZWZhdWx0ID0gQWN0aW9uVHlwZXM7XG5cbi8vIHNyYy91dGlscy9pc1BsYWluT2JqZWN0LnRzXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fCBvYmogPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBsZXQgcHJvdG8gPSBvYmo7XG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gcHJvdG8gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IG51bGw7XG59XG5cbi8vIHNyYy91dGlscy9raW5kT2YudHNcbmZ1bmN0aW9uIG1pbmlLaW5kT2YodmFsKSB7XG4gIGlmICh2YWwgPT09IHZvaWQgMClcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKHZhbCA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcInN5bWJvbFwiOlxuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSlcbiAgICByZXR1cm4gXCJhcnJheVwiO1xuICBpZiAoaXNEYXRlKHZhbCkpXG4gICAgcmV0dXJuIFwiZGF0ZVwiO1xuICBpZiAoaXNFcnJvcih2YWwpKVxuICAgIHJldHVybiBcImVycm9yXCI7XG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG4gIHN3aXRjaCAoY29uc3RydWN0b3JOYW1lKSB7XG4gICAgY2FzZSBcIlN5bWJvbFwiOlxuICAgIGNhc2UgXCJQcm9taXNlXCI6XG4gICAgY2FzZSBcIldlYWtNYXBcIjpcbiAgICBjYXNlIFwiV2Vha1NldFwiOlxuICAgIGNhc2UgXCJNYXBcIjpcbiAgICBjYXNlIFwiU2V0XCI6XG4gICAgICByZXR1cm4gY29uc3RydWN0b3JOYW1lO1xuICB9XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgXCJcIik7XG59XG5mdW5jdGlvbiBjdG9yTmFtZSh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRXJyb3IodmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgdmFsLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSBcIm51bWJlclwiO1xufVxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHR5cGVvZiB2YWwudG9EYXRlU3RyaW5nID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHZhbC5nZXREYXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIGxldCB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG4gIHJldHVybiB0eXBlT2ZWYWw7XG59XG5cbi8vIHNyYy9jcmVhdGVTdG9yZS50c1xuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIGlmICh0eXBlb2YgcmVkdWNlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBgRXhwZWN0ZWQgdGhlIHJvb3QgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKHJlZHVjZXIpfSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGVuaGFuY2VyID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIGVuaGFuY2VyID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMCkgOiBcIkl0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvIGNyZWF0ZVN0b3JlKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgY29tcG9zZSB0aGVtIHRvZ2V0aGVyIHRvIGEgc2luZ2xlIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjY3JlYXRpbmctYS1zdG9yZS13aXRoLWVuaGFuY2VycyBmb3IgYW4gZXhhbXBsZS5cIik7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgcHJlbG9hZGVkU3RhdGUgPSB2b2lkIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMSkgOiBgRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YoZW5oYW5jZXIpfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuaGFuY2VyKGNyZWF0ZVN0b3JlKShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gIH1cbiAgbGV0IGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgbGV0IGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICBsZXQgY3VycmVudExpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGxldCBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycztcbiAgbGV0IGxpc3RlbmVySWRDb3VudGVyID0gMDtcbiAgbGV0IGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpIHtcbiAgICBpZiAobmV4dExpc3RlbmVycyA9PT0gY3VycmVudExpc3RlbmVycykge1xuICAgICAgbmV4dExpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyLCBrZXkpID0+IHtcbiAgICAgICAgbmV4dExpc3RlbmVycy5zZXQoa2V5LCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMpIDogXCJZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLmdldFN0YXRlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiBUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuIFBhc3MgaXQgZG93biBmcm9tIHRoZSB0b3AgcmVkdWNlciBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSB0aGUgc3RvcmUuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNCkgOiBgRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YobGlzdGVuZXIpfSdgKTtcbiAgICB9XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogXCJZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gSWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgbm90aWZpZWQgYWZ0ZXIgdGhlIHN0b3JlIGhhcyBiZWVuIHVwZGF0ZWQsIHN1YnNjcmliZSBmcm9tIGEgY29tcG9uZW50IGFuZCBpbnZva2Ugc3RvcmUuZ2V0U3RhdGUoKSBpbiB0aGUgY2FsbGJhY2sgdG8gYWNjZXNzIHRoZSBsYXRlc3Qgc3RhdGUuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy5cIik7XG4gICAgfVxuICAgIGxldCBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICBjb25zdCBsaXN0ZW5lcklkID0gbGlzdGVuZXJJZENvdW50ZXIrKztcbiAgICBuZXh0TGlzdGVuZXJzLnNldChsaXN0ZW5lcklkLCBsaXN0ZW5lcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNikgOiBcIllvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy5cIik7XG4gICAgICB9XG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIG5leHRMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVySWQpO1xuICAgICAgY3VycmVudExpc3RlbmVycyA9IG51bGw7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBgQWN0aW9ucyBtdXN0IGJlIHBsYWluIG9iamVjdHMuIEluc3RlYWQsIHRoZSBhY3R1YWwgdHlwZSB3YXM6ICcke2tpbmRPZihhY3Rpb24pfScuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLmApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg4KSA6ICdBY3Rpb25zIG1heSBub3QgaGF2ZSBhbiB1bmRlZmluZWQgXCJ0eXBlXCIgcHJvcGVydHkuIFlvdSBtYXkgaGF2ZSBtaXNzcGVsbGVkIGFuIGFjdGlvbiB0eXBlIHN0cmluZyBjb25zdGFudC4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTcpIDogYEFjdGlvbiBcInR5cGVcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nLiBJbnN0ZWFkLCB0aGUgYWN0dWFsIHR5cGUgd2FzOiAnJHtraW5kT2YoYWN0aW9uLnR5cGUpfScuIFZhbHVlIHdhczogJyR7YWN0aW9uLnR5cGV9JyAoc3RyaW5naWZpZWQpYCk7XG4gICAgfVxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg5KSA6IFwiUmVkdWNlcnMgbWF5IG5vdCBkaXNwYXRjaCBhY3Rpb25zLlwiKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMgPSBuZXh0TGlzdGVuZXJzO1xuICAgIGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIHJlcGxhY2VSZWR1Y2VyKG5leHRSZWR1Y2VyKSB7XG4gICAgaWYgKHR5cGVvZiBuZXh0UmVkdWNlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBgRXhwZWN0ZWQgdGhlIG5leHRSZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YobmV4dFJlZHVjZXIpfWApO1xuICAgIH1cbiAgICBjdXJyZW50UmVkdWNlciA9IG5leHRSZWR1Y2VyO1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuUkVQTEFDRVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIG9ic2VydmFibGUoKSB7XG4gICAgY29uc3Qgb3V0ZXJTdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciAhPT0gXCJvYmplY3RcIiB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IGBFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKG9ic2VydmVyKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGNvbnN0IG9ic2VydmVyQXNPYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgICAgIGlmIChvYnNlcnZlckFzT2JzZXJ2ZXIubmV4dCkge1xuICAgICAgICAgICAgb2JzZXJ2ZXJBc09ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmVcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBbc3ltYm9sX29ic2VydmFibGVfZGVmYXVsdF0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZGlzcGF0Y2goe1xuICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuSU5JVFxuICB9KTtcbiAgY29uc3Qgc3RvcmUgPSB7XG4gICAgZGlzcGF0Y2gsXG4gICAgc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlLFxuICAgIHJlcGxhY2VSZWR1Y2VyLFxuICAgIFtzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0XTogb2JzZXJ2YWJsZVxuICB9O1xuICByZXR1cm4gc3RvcmU7XG59XG5mdW5jdGlvbiBsZWdhY3lfY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHJldHVybiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpO1xufVxuXG4vLyBzcmMvdXRpbHMvd2FybmluZy50c1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICB0cnkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG59XG5cbi8vIHNyYy9jb21iaW5lUmVkdWNlcnMudHNcbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIGNvbnN0IHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICBjb25zdCBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IGFjdGlvblR5cGVzX2RlZmF1bHQuSU5JVCA/IFwicHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlXCIgOiBcInByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyXCI7XG4gIGlmIChyZWR1Y2VyS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gXCJTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLlwiO1xuICB9XG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBgVGhlICR7YXJndW1lbnROYW1lfSBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFwiJHtraW5kT2YoaW5wdXRTdGF0ZSl9XCIuIEV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czogXCIke3JlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpfVwiYDtcbiAgfVxuICBjb25zdCB1bmV4cGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKGlucHV0U3RhdGUpLmZpbHRlcigoa2V5KSA9PiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBhY3Rpb25UeXBlc19kZWZhdWx0LlJFUExBQ0UpXG4gICAgcmV0dXJuO1xuICBpZiAodW5leHBlY3RlZEtleXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBgVW5leHBlY3RlZCAke3VuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyBcImtleXNcIiA6IFwia2V5XCJ9IFwiJHt1bmV4cGVjdGVkS2V5cy5qb2luKCdcIiwgXCInKX1cIiBmb3VuZCBpbiAke2FyZ3VtZW50TmFtZX0uIEV4cGVjdGVkIHRvIGZpbmQgb25lIG9mIHRoZSBrbm93biByZWR1Y2VyIGtleXMgaW5zdGVhZDogXCIke3JlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpfVwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLmA7XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydFJlZHVjZXJTaGFwZShyZWR1Y2Vycykge1xuICBPYmplY3Qua2V5cyhyZWR1Y2VycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih2b2lkIDAsIHtcbiAgICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuSU5JVFxuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMikgOiBgVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7a2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIElmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQuIElmIHlvdSBkb24ndCB3YW50IHRvIHNldCBhIHZhbHVlIGZvciB0aGlzIHJlZHVjZXIsIHlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVkdWNlcih2b2lkIDAsIHtcbiAgICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMykgOiBgVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7a2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIHByb2JlZCB3aXRoIGEgcmFuZG9tIHR5cGUuIERvbid0IHRyeSB0byBoYW5kbGUgJyR7YWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUfScgb3Igb3RoZXIgYWN0aW9ucyBpbiBcInJlZHV4LypcIiBuYW1lc3BhY2UuIFRoZXkgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4gSW5zdGVhZCwgeW91IG11c3QgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBpbiB3aGljaCBjYXNlIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgYWN0aW9uIHR5cGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLCBidXQgY2FuIGJlIG51bGwuYCk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICBjb25zdCByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgY29uc3QgZmluYWxSZWR1Y2VycyA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcmVkdWNlcktleXNbaV07XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHdhcm5pbmcoYE5vIHJlZHVjZXIgcHJvdmlkZWQgZm9yIGtleSBcIiR7a2V5fVwiYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaW5hbFJlZHVjZXJzW2tleV0gPSByZWR1Y2Vyc1trZXldO1xuICAgIH1cbiAgfVxuICBjb25zdCBmaW5hbFJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMoZmluYWxSZWR1Y2Vycyk7XG4gIGxldCB1bmV4cGVjdGVkS2V5Q2FjaGU7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGUgPSB7fTtcbiAgfVxuICBsZXQgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgdHJ5IHtcbiAgICBhc3NlcnRSZWR1Y2VyU2hhcGUoZmluYWxSZWR1Y2Vycyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaGFwZUFzc2VydGlvbkVycm9yID0gZTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gY29tYmluYXRpb24oc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgaWYgKHNoYXBlQXNzZXJ0aW9uRXJyb3IpIHtcbiAgICAgIHRocm93IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuICAgICAgaWYgKHdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIHdhcm5pbmcod2FybmluZ01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tpXTtcbiAgICAgIGNvbnN0IHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW2tleV07XG4gICAgICBjb25zdCBwcmV2aW91c1N0YXRlRm9yS2V5ID0gc3RhdGVba2V5XTtcbiAgICAgIGNvbnN0IG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFN0YXRlRm9yS2V5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvblR5cGUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE0KSA6IGBXaGVuIGNhbGxlZCB3aXRoIGFuIGFjdGlvbiBvZiB0eXBlICR7YWN0aW9uVHlwZSA/IGBcIiR7U3RyaW5nKGFjdGlvblR5cGUpfVwiYCA6IFwiKHVua25vd24gdHlwZSlcIn0sIHRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke2tleX1cIiByZXR1cm5lZCB1bmRlZmluZWQuIFRvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuYCk7XG4gICAgICB9XG4gICAgICBuZXh0U3RhdGVba2V5XSA9IG5leHRTdGF0ZUZvcktleTtcbiAgICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IG5leHRTdGF0ZUZvcktleSAhPT0gcHJldmlvdXNTdGF0ZUZvcktleTtcbiAgICB9XG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuLy8gc3JjL2JpbmRBY3Rpb25DcmVhdG9ycy50c1xuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmdzKSk7XG4gIH07XG59XG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpO1xuICB9XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09IFwib2JqZWN0XCIgfHwgYWN0aW9uQ3JlYXRvcnMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNikgOiBgYmluZEFjdGlvbkNyZWF0b3JzIGV4cGVjdGVkIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLCBidXQgaW5zdGVhZCByZWNlaXZlZDogJyR7a2luZE9mKGFjdGlvbkNyZWF0b3JzKX0nLiBEaWQgeW91IHdyaXRlIFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cIiBpbnN0ZWFkIG9mIFwiaW1wb3J0ICogYXMgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiP2ApO1xuICB9XG4gIGNvbnN0IGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYWN0aW9uQ3JlYXRvcnMpIHtcbiAgICBjb25zdCBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm91bmRBY3Rpb25DcmVhdG9ycztcbn1cblxuLy8gc3JjL2NvbXBvc2UudHNcbmZ1bmN0aW9uIGNvbXBvc2UoLi4uZnVuY3MpIHtcbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYXJnKSA9PiBhcmc7XG4gIH1cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuICByZXR1cm4gZnVuY3MucmVkdWNlKChhLCBiKSA9PiAoLi4uYXJncykgPT4gYShiKC4uLmFyZ3MpKSk7XG59XG5cbi8vIHNyYy9hcHBseU1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGFwcGx5TWlkZGxld2FyZSguLi5taWRkbGV3YXJlcykge1xuICByZXR1cm4gKGNyZWF0ZVN0b3JlMikgPT4gKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZTIocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICAgIGxldCBkaXNwYXRjaCA9ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6IFwiRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gT3RoZXIgbWlkZGxld2FyZSB3b3VsZCBub3QgYmUgYXBwbGllZCB0byB0aGlzIGRpc3BhdGNoLlwiKTtcbiAgICB9O1xuICAgIGNvbnN0IG1pZGRsZXdhcmVBUEkgPSB7XG4gICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICBkaXNwYXRjaDogKGFjdGlvbiwgLi4uYXJncykgPT4gZGlzcGF0Y2goYWN0aW9uLCAuLi5hcmdzKVxuICAgIH07XG4gICAgY29uc3QgY2hhaW4gPSBtaWRkbGV3YXJlcy5tYXAoKG1pZGRsZXdhcmUpID0+IG1pZGRsZXdhcmUobWlkZGxld2FyZUFQSSkpO1xuICAgIGRpc3BhdGNoID0gY29tcG9zZSguLi5jaGFpbikoc3RvcmUuZGlzcGF0Y2gpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdG9yZSxcbiAgICAgIGRpc3BhdGNoXG4gICAgfTtcbiAgfTtcbn1cblxuLy8gc3JjL3V0aWxzL2lzQWN0aW9uLnRzXG5mdW5jdGlvbiBpc0FjdGlvbihhY3Rpb24pIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QoYWN0aW9uKSAmJiBcInR5cGVcIiBpbiBhY3Rpb24gJiYgdHlwZW9mIGFjdGlvbi50eXBlID09PSBcInN0cmluZ1wiO1xufVxuZXhwb3J0IHtcbiAgYWN0aW9uVHlwZXNfZGVmYXVsdCBhcyBfX0RPX05PVF9VU0VfX0FjdGlvblR5cGVzLFxuICBhcHBseU1pZGRsZXdhcmUsXG4gIGJpbmRBY3Rpb25DcmVhdG9ycyxcbiAgY29tYmluZVJlZHVjZXJzLFxuICBjb21wb3NlLFxuICBjcmVhdGVTdG9yZSxcbiAgaXNBY3Rpb24sXG4gIGlzUGxhaW5PYmplY3QsXG4gIGxlZ2FjeV9jcmVhdGVTdG9yZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZHV4Lm1qcy5tYXAiLCIvLyBzcmMvdXRpbHMvZW52LnRzXG52YXIgTk9USElORyA9IFN5bWJvbC5mb3IoXCJpbW1lci1ub3RoaW5nXCIpO1xudmFyIERSQUZUQUJMRSA9IFN5bWJvbC5mb3IoXCJpbW1lci1kcmFmdGFibGVcIik7XG52YXIgRFJBRlRfU1RBVEUgPSBTeW1ib2wuZm9yKFwiaW1tZXItc3RhdGVcIik7XG5cbi8vIHNyYy91dGlscy9lcnJvcnMudHNcbnZhciBlcnJvcnMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBbXG4gIC8vIEFsbCBlcnJvciBjb2Rlcywgc3RhcnRpbmcgYnkgMDpcbiAgZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgcmV0dXJuIGBUaGUgcGx1Z2luIGZvciAnJHtwbHVnaW59JyBoYXMgbm90IGJlZW4gbG9hZGVkIGludG8gSW1tZXIuIFRvIGVuYWJsZSB0aGUgcGx1Z2luLCBpbXBvcnQgYW5kIGNhbGwgXFxgZW5hYmxlJHtwbHVnaW59KClcXGAgd2hlbiBpbml0aWFsaXppbmcgeW91ciBhcHBsaWNhdGlvbi5gO1xuICB9LFxuICBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiBgcHJvZHVjZSBjYW4gb25seSBiZSBjYWxsZWQgb24gdGhpbmdzIHRoYXQgYXJlIGRyYWZ0YWJsZTogcGxhaW4gb2JqZWN0cywgYXJyYXlzLCBNYXAsIFNldCBvciBjbGFzc2VzIHRoYXQgYXJlIG1hcmtlZCB3aXRoICdbaW1tZXJhYmxlXTogdHJ1ZScuIEdvdCAnJHt0aGluZ30nYDtcbiAgfSxcbiAgXCJUaGlzIG9iamVjdCBoYXMgYmVlbiBmcm96ZW4gYW5kIHNob3VsZCBub3QgYmUgbXV0YXRlZFwiLFxuICBmdW5jdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIFwiQ2Fubm90IHVzZSBhIHByb3h5IHRoYXQgaGFzIGJlZW4gcmV2b2tlZC4gRGlkIHlvdSBwYXNzIGFuIG9iamVjdCBmcm9tIGluc2lkZSBhbiBpbW1lciBmdW5jdGlvbiB0byBhbiBhc3luYyBwcm9jZXNzPyBcIiArIGRhdGE7XG4gIH0sXG4gIFwiQW4gaW1tZXIgcHJvZHVjZXIgcmV0dXJuZWQgYSBuZXcgdmFsdWUgKmFuZCogbW9kaWZpZWQgaXRzIGRyYWZ0LiBFaXRoZXIgcmV0dXJuIGEgbmV3IHZhbHVlICpvciogbW9kaWZ5IHRoZSBkcmFmdC5cIixcbiAgXCJJbW1lciBmb3JiaWRzIGNpcmN1bGFyIHJlZmVyZW5jZXNcIixcbiAgXCJUaGUgZmlyc3Qgb3Igc2Vjb25kIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb25cIixcbiAgXCJUaGUgdGhpcmQgYXJndW1lbnQgdG8gYHByb2R1Y2VgIG11c3QgYmUgYSBmdW5jdGlvbiBvciB1bmRlZmluZWRcIixcbiAgXCJGaXJzdCBhcmd1bWVudCB0byBgY3JlYXRlRHJhZnRgIG11c3QgYmUgYSBwbGFpbiBvYmplY3QsIGFuIGFycmF5LCBvciBhbiBpbW1lcmFibGUgb2JqZWN0XCIsXG4gIFwiRmlyc3QgYXJndW1lbnQgdG8gYGZpbmlzaERyYWZ0YCBtdXN0IGJlIGEgZHJhZnQgcmV0dXJuZWQgYnkgYGNyZWF0ZURyYWZ0YFwiLFxuICBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiBgJ2N1cnJlbnQnIGV4cGVjdHMgYSBkcmFmdCwgZ290OiAke3RoaW5nfWA7XG4gIH0sXG4gIFwiT2JqZWN0LmRlZmluZVByb3BlcnR5KCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIixcbiAgXCJPYmplY3Quc2V0UHJvdG90eXBlT2YoKSBjYW5ub3QgYmUgdXNlZCBvbiBhbiBJbW1lciBkcmFmdFwiLFxuICBcIkltbWVyIG9ubHkgc3VwcG9ydHMgZGVsZXRpbmcgYXJyYXkgaW5kaWNlc1wiLFxuICBcIkltbWVyIG9ubHkgc3VwcG9ydHMgc2V0dGluZyBhcnJheSBpbmRpY2VzIGFuZCB0aGUgJ2xlbmd0aCcgcHJvcGVydHlcIixcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYCdvcmlnaW5hbCcgZXhwZWN0cyBhIGRyYWZ0LCBnb3Q6ICR7dGhpbmd9YDtcbiAgfVxuICAvLyBOb3RlOiBpZiBtb3JlIGVycm9ycyBhcmUgYWRkZWQsIHRoZSBlcnJvck9mZnNldCBpbiBQYXRjaGVzLnRzIHNob3VsZCBiZSBpbmNyZWFzZWRcbiAgLy8gU2VlIFBhdGNoZXMudHMgZm9yIGFkZGl0aW9uYWwgZXJyb3JzXG5dIDogW107XG5mdW5jdGlvbiBkaWUoZXJyb3IsIC4uLmFyZ3MpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnN0IGUgPSBlcnJvcnNbZXJyb3JdO1xuICAgIGNvbnN0IG1zZyA9IHR5cGVvZiBlID09PSBcImZ1bmN0aW9uXCIgPyBlLmFwcGx5KG51bGwsIGFyZ3MpIDogZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFtJbW1lcl0gJHttc2d9YCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBbSW1tZXJdIG1pbmlmaWVkIGVycm9yIG5yOiAke2Vycm9yfS4gRnVsbCBlcnJvciBhdDogaHR0cHM6Ly9iaXQubHkvM2NYRUtXZmBcbiAgKTtcbn1cblxuLy8gc3JjL3V0aWxzL2NvbW1vbi50c1xudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuZnVuY3Rpb24gaXNEcmFmdCh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiAhIXZhbHVlW0RSQUZUX1NUQVRFXTtcbn1cbmZ1bmN0aW9uIGlzRHJhZnRhYmxlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgISF2YWx1ZVtEUkFGVEFCTEVdIHx8ICEhdmFsdWUuY29uc3RydWN0b3I/LltEUkFGVEFCTEVdIHx8IGlzTWFwKHZhbHVlKSB8fCBpc1NldCh2YWx1ZSk7XG59XG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IudG9TdHJpbmcoKTtcbnZhciBjYWNoZWRDdG9yU3RyaW5ncyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsIHx8IHByb3RvID09PSBPYmplY3QucHJvdG90eXBlKVxuICAgIHJldHVybiB0cnVlO1xuICBjb25zdCBDdG9yID0gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIFwiY29uc3RydWN0b3JcIikgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIGlmIChDdG9yID09PSBPYmplY3QpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmICh0eXBlb2YgQ3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IGN0b3JTdHJpbmcgPSBjYWNoZWRDdG9yU3RyaW5ncy5nZXQoQ3Rvcik7XG4gIGlmIChjdG9yU3RyaW5nID09PSB2b2lkIDApIHtcbiAgICBjdG9yU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmcuY2FsbChDdG9yKTtcbiAgICBjYWNoZWRDdG9yU3RyaW5ncy5zZXQoQ3RvciwgY3RvclN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIGN0b3JTdHJpbmcgPT09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5mdW5jdGlvbiBvcmlnaW5hbCh2YWx1ZSkge1xuICBpZiAoIWlzRHJhZnQodmFsdWUpKVxuICAgIGRpZSgxNSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWVbRFJBRlRfU1RBVEVdLmJhc2VfO1xufVxuZnVuY3Rpb24gZWFjaChvYmosIGl0ZXIsIHN0cmljdCA9IHRydWUpIHtcbiAgaWYgKGdldEFyY2h0eXBlKG9iaikgPT09IDAgLyogT2JqZWN0ICovKSB7XG4gICAgY29uc3Qga2V5cyA9IHN0cmljdCA/IFJlZmxlY3Qub3duS2V5cyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaXRlcihrZXksIG9ialtrZXldLCBvYmopO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iai5mb3JFYWNoKChlbnRyeSwgaW5kZXgpID0+IGl0ZXIoaW5kZXgsIGVudHJ5LCBvYmopKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0QXJjaHR5cGUodGhpbmcpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGluZ1tEUkFGVF9TVEFURV07XG4gIHJldHVybiBzdGF0ZSA/IHN0YXRlLnR5cGVfIDogQXJyYXkuaXNBcnJheSh0aGluZykgPyAxIC8qIEFycmF5ICovIDogaXNNYXAodGhpbmcpID8gMiAvKiBNYXAgKi8gOiBpc1NldCh0aGluZykgPyAzIC8qIFNldCAqLyA6IDAgLyogT2JqZWN0ICovO1xufVxuZnVuY3Rpb24gaGFzKHRoaW5nLCBwcm9wKSB7XG4gIHJldHVybiBnZXRBcmNodHlwZSh0aGluZykgPT09IDIgLyogTWFwICovID8gdGhpbmcuaGFzKHByb3ApIDogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaW5nLCBwcm9wKTtcbn1cbmZ1bmN0aW9uIGdldCh0aGluZywgcHJvcCkge1xuICByZXR1cm4gZ2V0QXJjaHR5cGUodGhpbmcpID09PSAyIC8qIE1hcCAqLyA/IHRoaW5nLmdldChwcm9wKSA6IHRoaW5nW3Byb3BdO1xufVxuZnVuY3Rpb24gc2V0KHRoaW5nLCBwcm9wT3JPbGRWYWx1ZSwgdmFsdWUpIHtcbiAgY29uc3QgdCA9IGdldEFyY2h0eXBlKHRoaW5nKTtcbiAgaWYgKHQgPT09IDIgLyogTWFwICovKVxuICAgIHRoaW5nLnNldChwcm9wT3JPbGRWYWx1ZSwgdmFsdWUpO1xuICBlbHNlIGlmICh0ID09PSAzIC8qIFNldCAqLykge1xuICAgIHRoaW5nLmFkZCh2YWx1ZSk7XG4gIH0gZWxzZVxuICAgIHRoaW5nW3Byb3BPck9sZFZhbHVlXSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5mdW5jdGlvbiBpc01hcCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIE1hcDtcbn1cbmZ1bmN0aW9uIGlzU2V0KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgU2V0O1xufVxuZnVuY3Rpb24gbGF0ZXN0KHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5jb3B5XyB8fCBzdGF0ZS5iYXNlXztcbn1cbmZ1bmN0aW9uIHNoYWxsb3dDb3B5KGJhc2UsIHN0cmljdCkge1xuICBpZiAoaXNNYXAoYmFzZSkpIHtcbiAgICByZXR1cm4gbmV3IE1hcChiYXNlKTtcbiAgfVxuICBpZiAoaXNTZXQoYmFzZSkpIHtcbiAgICByZXR1cm4gbmV3IFNldChiYXNlKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShiYXNlKSlcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYmFzZSk7XG4gIGNvbnN0IGlzUGxhaW4gPSBpc1BsYWluT2JqZWN0KGJhc2UpO1xuICBpZiAoc3RyaWN0ID09PSB0cnVlIHx8IHN0cmljdCA9PT0gXCJjbGFzc19vbmx5XCIgJiYgIWlzUGxhaW4pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGJhc2UpO1xuICAgIGRlbGV0ZSBkZXNjcmlwdG9yc1tEUkFGVF9TVEFURV07XG4gICAgbGV0IGtleXMgPSBSZWZsZWN0Lm93bktleXMoZGVzY3JpcHRvcnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IGRlc2MgPSBkZXNjcmlwdG9yc1trZXldO1xuICAgICAgaWYgKGRlc2Mud3JpdGFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGRlc2Mud3JpdGFibGUgPSB0cnVlO1xuICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpXG4gICAgICAgIGRlc2NyaXB0b3JzW2tleV0gPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIC8vIGNvdWxkIGxpdmUgd2l0aCAhIWRlc2Muc2V0IGFzIHdlbGwgaGVyZS4uLlxuICAgICAgICAgIGVudW1lcmFibGU6IGRlc2MuZW51bWVyYWJsZSxcbiAgICAgICAgICB2YWx1ZTogYmFzZVtrZXldXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKGdldFByb3RvdHlwZU9mKGJhc2UpLCBkZXNjcmlwdG9ycyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihiYXNlKTtcbiAgICBpZiAocHJvdG8gIT09IG51bGwgJiYgaXNQbGFpbikge1xuICAgICAgcmV0dXJuIHsgLi4uYmFzZSB9O1xuICAgIH1cbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvYmosIGJhc2UpO1xuICB9XG59XG5mdW5jdGlvbiBmcmVlemUob2JqLCBkZWVwID0gZmFsc2UpIHtcbiAgaWYgKGlzRnJvemVuKG9iaikgfHwgaXNEcmFmdChvYmopIHx8ICFpc0RyYWZ0YWJsZShvYmopKVxuICAgIHJldHVybiBvYmo7XG4gIGlmIChnZXRBcmNodHlwZShvYmopID4gMSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwge1xuICAgICAgc2V0OiBkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGUsXG4gICAgICBhZGQ6IGRvbnRNdXRhdGVNZXRob2RPdmVycmlkZSxcbiAgICAgIGNsZWFyOiBkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGUsXG4gICAgICBkZWxldGU6IGRvbnRNdXRhdGVNZXRob2RPdmVycmlkZVxuICAgIH0pO1xuICB9XG4gIE9iamVjdC5mcmVlemUob2JqKTtcbiAgaWYgKGRlZXApXG4gICAgT2JqZWN0LnZhbHVlcyhvYmopLmZvckVhY2goKHZhbHVlKSA9PiBmcmVlemUodmFsdWUsIHRydWUpKTtcbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIGRvbnRNdXRhdGVGcm96ZW5Db2xsZWN0aW9ucygpIHtcbiAgZGllKDIpO1xufVxudmFyIGRvbnRNdXRhdGVNZXRob2RPdmVycmlkZSA9IHtcbiAgdmFsdWU6IGRvbnRNdXRhdGVGcm96ZW5Db2xsZWN0aW9uc1xufTtcbmZ1bmN0aW9uIGlzRnJvemVuKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBPYmplY3QuaXNGcm96ZW4ob2JqKTtcbn1cblxuLy8gc3JjL3V0aWxzL3BsdWdpbnMudHNcbnZhciBwbHVnaW5zID0ge307XG5mdW5jdGlvbiBnZXRQbHVnaW4ocGx1Z2luS2V5KSB7XG4gIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnNbcGx1Z2luS2V5XTtcbiAgaWYgKCFwbHVnaW4pIHtcbiAgICBkaWUoMCwgcGx1Z2luS2V5KTtcbiAgfVxuICByZXR1cm4gcGx1Z2luO1xufVxuZnVuY3Rpb24gbG9hZFBsdWdpbihwbHVnaW5LZXksIGltcGxlbWVudGF0aW9uKSB7XG4gIGlmICghcGx1Z2luc1twbHVnaW5LZXldKVxuICAgIHBsdWdpbnNbcGx1Z2luS2V5XSA9IGltcGxlbWVudGF0aW9uO1xufVxuXG4vLyBzcmMvY29yZS9zY29wZS50c1xudmFyIGN1cnJlbnRTY29wZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRTY29wZSgpIHtcbiAgcmV0dXJuIGN1cnJlbnRTY29wZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNjb3BlKHBhcmVudF8sIGltbWVyXykge1xuICByZXR1cm4ge1xuICAgIGRyYWZ0c186IFtdLFxuICAgIHBhcmVudF8sXG4gICAgaW1tZXJfLFxuICAgIC8vIFdoZW5ldmVyIHRoZSBtb2RpZmllZCBkcmFmdCBjb250YWlucyBhIGRyYWZ0IGZyb20gYW5vdGhlciBzY29wZSwgd2VcbiAgICAvLyBuZWVkIHRvIHByZXZlbnQgYXV0by1mcmVlemluZyBzbyB0aGUgdW5vd25lZCBkcmFmdCBjYW4gYmUgZmluYWxpemVkLlxuICAgIGNhbkF1dG9GcmVlemVfOiB0cnVlLFxuICAgIHVuZmluYWxpemVkRHJhZnRzXzogMFxuICB9O1xufVxuZnVuY3Rpb24gdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpIHtcbiAgaWYgKHBhdGNoTGlzdGVuZXIpIHtcbiAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpO1xuICAgIHNjb3BlLnBhdGNoZXNfID0gW107XG4gICAgc2NvcGUuaW52ZXJzZVBhdGNoZXNfID0gW107XG4gICAgc2NvcGUucGF0Y2hMaXN0ZW5lcl8gPSBwYXRjaExpc3RlbmVyO1xuICB9XG59XG5mdW5jdGlvbiByZXZva2VTY29wZShzY29wZSkge1xuICBsZWF2ZVNjb3BlKHNjb3BlKTtcbiAgc2NvcGUuZHJhZnRzXy5mb3JFYWNoKHJldm9rZURyYWZ0KTtcbiAgc2NvcGUuZHJhZnRzXyA9IG51bGw7XG59XG5mdW5jdGlvbiBsZWF2ZVNjb3BlKHNjb3BlKSB7XG4gIGlmIChzY29wZSA9PT0gY3VycmVudFNjb3BlKSB7XG4gICAgY3VycmVudFNjb3BlID0gc2NvcGUucGFyZW50XztcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJTY29wZShpbW1lcjIpIHtcbiAgcmV0dXJuIGN1cnJlbnRTY29wZSA9IGNyZWF0ZVNjb3BlKGN1cnJlbnRTY29wZSwgaW1tZXIyKTtcbn1cbmZ1bmN0aW9uIHJldm9rZURyYWZ0KGRyYWZ0KSB7XG4gIGNvbnN0IHN0YXRlID0gZHJhZnRbRFJBRlRfU1RBVEVdO1xuICBpZiAoc3RhdGUudHlwZV8gPT09IDAgLyogT2JqZWN0ICovIHx8IHN0YXRlLnR5cGVfID09PSAxIC8qIEFycmF5ICovKVxuICAgIHN0YXRlLnJldm9rZV8oKTtcbiAgZWxzZVxuICAgIHN0YXRlLnJldm9rZWRfID0gdHJ1ZTtcbn1cblxuLy8gc3JjL2NvcmUvZmluYWxpemUudHNcbmZ1bmN0aW9uIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSkge1xuICBzY29wZS51bmZpbmFsaXplZERyYWZ0c18gPSBzY29wZS5kcmFmdHNfLmxlbmd0aDtcbiAgY29uc3QgYmFzZURyYWZ0ID0gc2NvcGUuZHJhZnRzX1swXTtcbiAgY29uc3QgaXNSZXBsYWNlZCA9IHJlc3VsdCAhPT0gdm9pZCAwICYmIHJlc3VsdCAhPT0gYmFzZURyYWZ0O1xuICBpZiAoaXNSZXBsYWNlZCkge1xuICAgIGlmIChiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLm1vZGlmaWVkXykge1xuICAgICAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICAgICAgZGllKDQpO1xuICAgIH1cbiAgICBpZiAoaXNEcmFmdGFibGUocmVzdWx0KSkge1xuICAgICAgcmVzdWx0ID0gZmluYWxpemUoc2NvcGUsIHJlc3VsdCk7XG4gICAgICBpZiAoIXNjb3BlLnBhcmVudF8pXG4gICAgICAgIG1heWJlRnJlZXplKHNjb3BlLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAoc2NvcGUucGF0Y2hlc18pIHtcbiAgICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKFxuICAgICAgICBiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLmJhc2VfLFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHNjb3BlLnBhdGNoZXNfLFxuICAgICAgICBzY29wZS5pbnZlcnNlUGF0Y2hlc19cbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGZpbmFsaXplKHNjb3BlLCBiYXNlRHJhZnQsIFtdKTtcbiAgfVxuICByZXZva2VTY29wZShzY29wZSk7XG4gIGlmIChzY29wZS5wYXRjaGVzXykge1xuICAgIHNjb3BlLnBhdGNoTGlzdGVuZXJfKHNjb3BlLnBhdGNoZXNfLCBzY29wZS5pbnZlcnNlUGF0Y2hlc18pO1xuICB9XG4gIHJldHVybiByZXN1bHQgIT09IE5PVEhJTkcgPyByZXN1bHQgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBmaW5hbGl6ZShyb290U2NvcGUsIHZhbHVlLCBwYXRoKSB7XG4gIGlmIChpc0Zyb3plbih2YWx1ZSkpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBjb25zdCB1c2VTdHJpY3RJdGVyYXRpb24gPSByb290U2NvcGUuaW1tZXJfLnNob3VsZFVzZVN0cmljdEl0ZXJhdGlvbigpO1xuICBjb25zdCBzdGF0ZSA9IHZhbHVlW0RSQUZUX1NUQVRFXTtcbiAgaWYgKCFzdGF0ZSkge1xuICAgIGVhY2goXG4gICAgICB2YWx1ZSxcbiAgICAgIChrZXksIGNoaWxkVmFsdWUpID0+IGZpbmFsaXplUHJvcGVydHkocm9vdFNjb3BlLCBzdGF0ZSwgdmFsdWUsIGtleSwgY2hpbGRWYWx1ZSwgcGF0aCksXG4gICAgICB1c2VTdHJpY3RJdGVyYXRpb25cbiAgICApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoc3RhdGUuc2NvcGVfICE9PSByb290U2NvcGUpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgc3RhdGUuYmFzZV8sIHRydWUpO1xuICAgIHJldHVybiBzdGF0ZS5iYXNlXztcbiAgfVxuICBpZiAoIXN0YXRlLmZpbmFsaXplZF8pIHtcbiAgICBzdGF0ZS5maW5hbGl6ZWRfID0gdHJ1ZTtcbiAgICBzdGF0ZS5zY29wZV8udW5maW5hbGl6ZWREcmFmdHNfLS07XG4gICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuY29weV87XG4gICAgbGV0IHJlc3VsdEVhY2ggPSByZXN1bHQ7XG4gICAgbGV0IGlzU2V0MiA9IGZhbHNlO1xuICAgIGlmIChzdGF0ZS50eXBlXyA9PT0gMyAvKiBTZXQgKi8pIHtcbiAgICAgIHJlc3VsdEVhY2ggPSBuZXcgU2V0KHJlc3VsdCk7XG4gICAgICByZXN1bHQuY2xlYXIoKTtcbiAgICAgIGlzU2V0MiA9IHRydWU7XG4gICAgfVxuICAgIGVhY2goXG4gICAgICByZXN1bHRFYWNoLFxuICAgICAgKGtleSwgY2hpbGRWYWx1ZSkgPT4gZmluYWxpemVQcm9wZXJ0eShcbiAgICAgICAgcm9vdFNjb3BlLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBrZXksXG4gICAgICAgIGNoaWxkVmFsdWUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGlzU2V0MlxuICAgICAgKSxcbiAgICAgIHVzZVN0cmljdEl0ZXJhdGlvblxuICAgICk7XG4gICAgbWF5YmVGcmVlemUocm9vdFNjb3BlLCByZXN1bHQsIGZhbHNlKTtcbiAgICBpZiAocGF0aCAmJiByb290U2NvcGUucGF0Y2hlc18pIHtcbiAgICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVQYXRjaGVzXyhcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHJvb3RTY29wZS5wYXRjaGVzXyxcbiAgICAgICAgcm9vdFNjb3BlLmludmVyc2VQYXRjaGVzX1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmNvcHlfO1xufVxuZnVuY3Rpb24gZmluYWxpemVQcm9wZXJ0eShyb290U2NvcGUsIHBhcmVudFN0YXRlLCB0YXJnZXRPYmplY3QsIHByb3AsIGNoaWxkVmFsdWUsIHJvb3RQYXRoLCB0YXJnZXRJc1NldCkge1xuICBpZiAoY2hpbGRWYWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0eXBlb2YgY2hpbGRWYWx1ZSAhPT0gXCJvYmplY3RcIiAmJiAhdGFyZ2V0SXNTZXQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY2hpbGRJc0Zyb3plbiA9IGlzRnJvemVuKGNoaWxkVmFsdWUpO1xuICBpZiAoY2hpbGRJc0Zyb3plbiAmJiAhdGFyZ2V0SXNTZXQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBjaGlsZFZhbHVlID09PSB0YXJnZXRPYmplY3QpXG4gICAgZGllKDUpO1xuICBpZiAoaXNEcmFmdChjaGlsZFZhbHVlKSkge1xuICAgIGNvbnN0IHBhdGggPSByb290UGF0aCAmJiBwYXJlbnRTdGF0ZSAmJiBwYXJlbnRTdGF0ZS50eXBlXyAhPT0gMyAvKiBTZXQgKi8gJiYgLy8gU2V0IG9iamVjdHMgYXJlIGF0b21pYyBzaW5jZSB0aGV5IGhhdmUgbm8ga2V5cy5cbiAgICAhaGFzKHBhcmVudFN0YXRlLmFzc2lnbmVkXywgcHJvcCkgPyByb290UGF0aC5jb25jYXQocHJvcCkgOiB2b2lkIDA7XG4gICAgY29uc3QgcmVzID0gZmluYWxpemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlLCBwYXRoKTtcbiAgICBzZXQodGFyZ2V0T2JqZWN0LCBwcm9wLCByZXMpO1xuICAgIGlmIChpc0RyYWZ0KHJlcykpIHtcbiAgICAgIHJvb3RTY29wZS5jYW5BdXRvRnJlZXplXyA9IGZhbHNlO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKHRhcmdldElzU2V0KSB7XG4gICAgdGFyZ2V0T2JqZWN0LmFkZChjaGlsZFZhbHVlKTtcbiAgfVxuICBpZiAoaXNEcmFmdGFibGUoY2hpbGRWYWx1ZSkgJiYgIWNoaWxkSXNGcm96ZW4pIHtcbiAgICBpZiAoIXJvb3RTY29wZS5pbW1lcl8uYXV0b0ZyZWV6ZV8gJiYgcm9vdFNjb3BlLnVuZmluYWxpemVkRHJhZnRzXyA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHBhcmVudFN0YXRlICYmIHBhcmVudFN0YXRlLmJhc2VfICYmIHBhcmVudFN0YXRlLmJhc2VfW3Byb3BdID09PSBjaGlsZFZhbHVlICYmIGNoaWxkSXNGcm96ZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmluYWxpemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlKTtcbiAgICBpZiAoKCFwYXJlbnRTdGF0ZSB8fCAhcGFyZW50U3RhdGUuc2NvcGVfLnBhcmVudF8pICYmIHR5cGVvZiBwcm9wICE9PSBcInN5bWJvbFwiICYmIChpc01hcCh0YXJnZXRPYmplY3QpID8gdGFyZ2V0T2JqZWN0Lmhhcyhwcm9wKSA6IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0YXJnZXRPYmplY3QsIHByb3ApKSlcbiAgICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgY2hpbGRWYWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG1heWJlRnJlZXplKHNjb3BlLCB2YWx1ZSwgZGVlcCA9IGZhbHNlKSB7XG4gIGlmICghc2NvcGUucGFyZW50XyAmJiBzY29wZS5pbW1lcl8uYXV0b0ZyZWV6ZV8gJiYgc2NvcGUuY2FuQXV0b0ZyZWV6ZV8pIHtcbiAgICBmcmVlemUodmFsdWUsIGRlZXApO1xuICB9XG59XG5cbi8vIHNyYy9jb3JlL3Byb3h5LnRzXG5mdW5jdGlvbiBjcmVhdGVQcm94eVByb3h5KGJhc2UsIHBhcmVudCkge1xuICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShiYXNlKTtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgdHlwZV86IGlzQXJyYXkgPyAxIC8qIEFycmF5ICovIDogMCAvKiBPYmplY3QgKi8sXG4gICAgLy8gVHJhY2sgd2hpY2ggcHJvZHVjZSBjYWxsIHRoaXMgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgIHNjb3BlXzogcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpLFxuICAgIC8vIFRydWUgZm9yIGJvdGggc2hhbGxvdyBhbmQgZGVlcCBjaGFuZ2VzLlxuICAgIG1vZGlmaWVkXzogZmFsc2UsXG4gICAgLy8gVXNlZCBkdXJpbmcgZmluYWxpemF0aW9uLlxuICAgIGZpbmFsaXplZF86IGZhbHNlLFxuICAgIC8vIFRyYWNrIHdoaWNoIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGFzc2lnbmVkICh0cnVlKSBvciBkZWxldGVkIChmYWxzZSkuXG4gICAgYXNzaWduZWRfOiB7fSxcbiAgICAvLyBUaGUgcGFyZW50IGRyYWZ0IHN0YXRlLlxuICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAvLyBUaGUgYmFzZSBzdGF0ZS5cbiAgICBiYXNlXzogYmFzZSxcbiAgICAvLyBUaGUgYmFzZSBwcm94eS5cbiAgICBkcmFmdF86IG51bGwsXG4gICAgLy8gc2V0IGJlbG93XG4gICAgLy8gVGhlIGJhc2UgY29weSB3aXRoIGFueSB1cGRhdGVkIHZhbHVlcy5cbiAgICBjb3B5XzogbnVsbCxcbiAgICAvLyBDYWxsZWQgYnkgdGhlIGBwcm9kdWNlYCBmdW5jdGlvbi5cbiAgICByZXZva2VfOiBudWxsLFxuICAgIGlzTWFudWFsXzogZmFsc2VcbiAgfTtcbiAgbGV0IHRhcmdldCA9IHN0YXRlO1xuICBsZXQgdHJhcHMgPSBvYmplY3RUcmFwcztcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICB0YXJnZXQgPSBbc3RhdGVdO1xuICAgIHRyYXBzID0gYXJyYXlUcmFwcztcbiAgfVxuICBjb25zdCB7IHJldm9rZSwgcHJveHkgfSA9IFByb3h5LnJldm9jYWJsZSh0YXJnZXQsIHRyYXBzKTtcbiAgc3RhdGUuZHJhZnRfID0gcHJveHk7XG4gIHN0YXRlLnJldm9rZV8gPSByZXZva2U7XG4gIHJldHVybiBwcm94eTtcbn1cbnZhciBvYmplY3RUcmFwcyA9IHtcbiAgZ2V0KHN0YXRlLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IERSQUZUX1NUQVRFKVxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIGNvbnN0IHNvdXJjZSA9IGxhdGVzdChzdGF0ZSk7XG4gICAgaWYgKCFoYXMoc291cmNlLCBwcm9wKSkge1xuICAgICAgcmV0dXJuIHJlYWRQcm9wRnJvbVByb3RvKHN0YXRlLCBzb3VyY2UsIHByb3ApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtwcm9wXTtcbiAgICBpZiAoc3RhdGUuZmluYWxpemVkXyB8fCAhaXNEcmFmdGFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gcGVlayhzdGF0ZS5iYXNlXywgcHJvcCkpIHtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5X1twcm9wXSA9IGNyZWF0ZVByb3h5KHZhbHVlLCBzdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgaGFzKHN0YXRlLCBwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AgaW4gbGF0ZXN0KHN0YXRlKTtcbiAgfSxcbiAgb3duS2V5cyhzdGF0ZSkge1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMobGF0ZXN0KHN0YXRlKSk7XG4gIH0sXG4gIHNldChzdGF0ZSwgcHJvcCwgdmFsdWUpIHtcbiAgICBjb25zdCBkZXNjID0gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhsYXRlc3Qoc3RhdGUpLCBwcm9wKTtcbiAgICBpZiAoZGVzYz8uc2V0KSB7XG4gICAgICBkZXNjLnNldC5jYWxsKHN0YXRlLmRyYWZ0XywgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgICBjb25zdCBjdXJyZW50MiA9IHBlZWsobGF0ZXN0KHN0YXRlKSwgcHJvcCk7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBjdXJyZW50Mj8uW0RSQUZUX1NUQVRFXTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUgJiYgY3VycmVudFN0YXRlLmJhc2VfID09PSB2YWx1ZSkge1xuICAgICAgICBzdGF0ZS5jb3B5X1twcm9wXSA9IHZhbHVlO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXModmFsdWUsIGN1cnJlbnQyKSAmJiAodmFsdWUgIT09IHZvaWQgMCB8fCBoYXMoc3RhdGUuYmFzZV8sIHByb3ApKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBwcmVwYXJlQ29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3B5X1twcm9wXSA9PT0gdmFsdWUgJiYgLy8gc3BlY2lhbCBjYXNlOiBoYW5kbGUgbmV3IHByb3BzIHdpdGggdmFsdWUgJ3VuZGVmaW5lZCdcbiAgICAodmFsdWUgIT09IHZvaWQgMCB8fCBwcm9wIGluIHN0YXRlLmNvcHlfKSB8fCAvLyBzcGVjaWFsIGNhc2U6IE5hTlxuICAgIE51bWJlci5pc05hTih2YWx1ZSkgJiYgTnVtYmVyLmlzTmFOKHN0YXRlLmNvcHlfW3Byb3BdKSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHN0YXRlLmNvcHlfW3Byb3BdID0gdmFsdWU7XG4gICAgc3RhdGUuYXNzaWduZWRfW3Byb3BdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkoc3RhdGUsIHByb3ApIHtcbiAgICBpZiAocGVlayhzdGF0ZS5iYXNlXywgcHJvcCkgIT09IHZvaWQgMCB8fCBwcm9wIGluIHN0YXRlLmJhc2VfKSB7XG4gICAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSBmYWxzZTtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHN0YXRlLmFzc2lnbmVkX1twcm9wXTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcHlfKSB7XG4gICAgICBkZWxldGUgc3RhdGUuY29weV9bcHJvcF07XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBOb3RlOiBXZSBuZXZlciBjb2VyY2UgYGRlc2MudmFsdWVgIGludG8gYW4gSW1tZXIgZHJhZnQsIGJlY2F1c2Ugd2UgY2FuJ3QgbWFrZVxuICAvLyB0aGUgc2FtZSBndWFyYW50ZWUgaW4gRVM1IG1vZGUuXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdGF0ZSwgcHJvcCkge1xuICAgIGNvbnN0IG93bmVyID0gbGF0ZXN0KHN0YXRlKTtcbiAgICBjb25zdCBkZXNjID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob3duZXIsIHByb3ApO1xuICAgIGlmICghZGVzYylcbiAgICAgIHJldHVybiBkZXNjO1xuICAgIHJldHVybiB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogc3RhdGUudHlwZV8gIT09IDEgLyogQXJyYXkgKi8gfHwgcHJvcCAhPT0gXCJsZW5ndGhcIixcbiAgICAgIGVudW1lcmFibGU6IGRlc2MuZW51bWVyYWJsZSxcbiAgICAgIHZhbHVlOiBvd25lcltwcm9wXVxuICAgIH07XG4gIH0sXG4gIGRlZmluZVByb3BlcnR5KCkge1xuICAgIGRpZSgxMSk7XG4gIH0sXG4gIGdldFByb3RvdHlwZU9mKHN0YXRlKSB7XG4gICAgcmV0dXJuIGdldFByb3RvdHlwZU9mKHN0YXRlLmJhc2VfKTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoKSB7XG4gICAgZGllKDEyKTtcbiAgfVxufTtcbnZhciBhcnJheVRyYXBzID0ge307XG5lYWNoKG9iamVjdFRyYXBzLCAoa2V5LCBmbikgPT4ge1xuICBhcnJheVRyYXBzW2tleV0gPSBmdW5jdGlvbigpIHtcbiAgICBhcmd1bWVudHNbMF0gPSBhcmd1bWVudHNbMF1bMF07XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KTtcbmFycmF5VHJhcHMuZGVsZXRlUHJvcGVydHkgPSBmdW5jdGlvbihzdGF0ZSwgcHJvcCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGlzTmFOKHBhcnNlSW50KHByb3ApKSlcbiAgICBkaWUoMTMpO1xuICByZXR1cm4gYXJyYXlUcmFwcy5zZXQuY2FsbCh0aGlzLCBzdGF0ZSwgcHJvcCwgdm9pZCAwKTtcbn07XG5hcnJheVRyYXBzLnNldCA9IGZ1bmN0aW9uKHN0YXRlLCBwcm9wLCB2YWx1ZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIHByb3AgIT09IFwibGVuZ3RoXCIgJiYgaXNOYU4ocGFyc2VJbnQocHJvcCkpKVxuICAgIGRpZSgxNCk7XG4gIHJldHVybiBvYmplY3RUcmFwcy5zZXQuY2FsbCh0aGlzLCBzdGF0ZVswXSwgcHJvcCwgdmFsdWUsIHN0YXRlWzBdKTtcbn07XG5mdW5jdGlvbiBwZWVrKGRyYWZ0LCBwcm9wKSB7XG4gIGNvbnN0IHN0YXRlID0gZHJhZnRbRFJBRlRfU1RBVEVdO1xuICBjb25zdCBzb3VyY2UgPSBzdGF0ZSA/IGxhdGVzdChzdGF0ZSkgOiBkcmFmdDtcbiAgcmV0dXJuIHNvdXJjZVtwcm9wXTtcbn1cbmZ1bmN0aW9uIHJlYWRQcm9wRnJvbVByb3RvKHN0YXRlLCBzb3VyY2UsIHByb3ApIHtcbiAgY29uc3QgZGVzYyA9IGdldERlc2NyaXB0b3JGcm9tUHJvdG8oc291cmNlLCBwcm9wKTtcbiAgcmV0dXJuIGRlc2MgPyBgdmFsdWVgIGluIGRlc2MgPyBkZXNjLnZhbHVlIDogKFxuICAgIC8vIFRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZSwgaWYgdGhlIHByb3AgaXMgYSBnZXR0ZXIgZGVmaW5lZCBieSB0aGVcbiAgICAvLyBwcm90b3R5cGUsIHdlIHNob3VsZCBpbnZva2UgaXQgd2l0aCB0aGUgZHJhZnQgYXMgY29udGV4dCFcbiAgICBkZXNjLmdldD8uY2FsbChzdGF0ZS5kcmFmdF8pXG4gICkgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBnZXREZXNjcmlwdG9yRnJvbVByb3RvKHNvdXJjZSwgcHJvcCkge1xuICBpZiAoIShwcm9wIGluIHNvdXJjZSkpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlKTtcbiAgd2hpbGUgKHByb3RvKSB7XG4gICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHByb3ApO1xuICAgIGlmIChkZXNjKVxuICAgICAgcmV0dXJuIGRlc2M7XG4gICAgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIG1hcmtDaGFuZ2VkKHN0YXRlKSB7XG4gIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgc3RhdGUubW9kaWZpZWRfID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUucGFyZW50Xykge1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUucGFyZW50Xyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlQ29weShzdGF0ZSkge1xuICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgc3RhdGUuY29weV8gPSBzaGFsbG93Q29weShcbiAgICAgIHN0YXRlLmJhc2VfLFxuICAgICAgc3RhdGUuc2NvcGVfLmltbWVyXy51c2VTdHJpY3RTaGFsbG93Q29weV9cbiAgICApO1xuICB9XG59XG5cbi8vIHNyYy9jb3JlL2ltbWVyQ2xhc3MudHNcbnZhciBJbW1lcjIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuYXV0b0ZyZWV6ZV8gPSB0cnVlO1xuICAgIHRoaXMudXNlU3RyaWN0U2hhbGxvd0NvcHlfID0gZmFsc2U7XG4gICAgdGhpcy51c2VTdHJpY3RJdGVyYXRpb25fID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYHByb2R1Y2VgIGZ1bmN0aW9uIHRha2VzIGEgdmFsdWUgYW5kIGEgXCJyZWNpcGUgZnVuY3Rpb25cIiAod2hvc2VcbiAgICAgKiByZXR1cm4gdmFsdWUgb2Z0ZW4gZGVwZW5kcyBvbiB0aGUgYmFzZSBzdGF0ZSkuIFRoZSByZWNpcGUgZnVuY3Rpb24gaXNcbiAgICAgKiBmcmVlIHRvIG11dGF0ZSBpdHMgZmlyc3QgYXJndW1lbnQgaG93ZXZlciBpdCB3YW50cy4gQWxsIG11dGF0aW9ucyBhcmVcbiAgICAgKiBvbmx5IGV2ZXIgYXBwbGllZCB0byBhIF9fY29weV9fIG9mIHRoZSBiYXNlIHN0YXRlLlxuICAgICAqXG4gICAgICogUGFzcyBvbmx5IGEgZnVuY3Rpb24gdG8gY3JlYXRlIGEgXCJjdXJyaWVkIHByb2R1Y2VyXCIgd2hpY2ggcmVsaWV2ZXMgeW91XG4gICAgICogZnJvbSBwYXNzaW5nIHRoZSByZWNpcGUgZnVuY3Rpb24gZXZlcnkgdGltZS5cbiAgICAgKlxuICAgICAqIE9ubHkgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzIGFyZSBtYWRlIG11dGFibGUuIEFsbCBvdGhlciBvYmplY3RzIGFyZVxuICAgICAqIGNvbnNpZGVyZWQgdW5jb3B5YWJsZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgX19ib3VuZF9fIHRvIGl0cyBgSW1tZXJgIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHthbnl9IGJhc2UgLSB0aGUgaW5pdGlhbCBzdGF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlY2lwZSAtIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBwcm94eSBvZiB0aGUgYmFzZSBzdGF0ZSBhcyBmaXJzdCBhcmd1bWVudCBhbmQgd2hpY2ggY2FuIGJlIGZyZWVseSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhdGNoTGlzdGVuZXIgLSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHRoZSBwYXRjaGVzIHByb2R1Y2VkIGhlcmVcbiAgICAgKiBAcmV0dXJucyB7YW55fSBhIG5ldyBzdGF0ZSwgb3IgdGhlIGluaXRpYWwgc3RhdGUgaWYgbm90aGluZyB3YXMgbW9kaWZpZWRcbiAgICAgKi9cbiAgICB0aGlzLnByb2R1Y2UgPSAoYmFzZSwgcmVjaXBlLCBwYXRjaExpc3RlbmVyKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGJhc2UgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgcmVjaXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdEJhc2UgPSByZWNpcGU7XG4gICAgICAgIHJlY2lwZSA9IGJhc2U7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gY3VycmllZFByb2R1Y2UoYmFzZTIgPSBkZWZhdWx0QmFzZSwgLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiBzZWxmLnByb2R1Y2UoYmFzZTIsIChkcmFmdCkgPT4gcmVjaXBlLmNhbGwodGhpcywgZHJhZnQsIC4uLmFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcmVjaXBlICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGRpZSg2KTtcbiAgICAgIGlmIChwYXRjaExpc3RlbmVyICE9PSB2b2lkIDAgJiYgdHlwZW9mIHBhdGNoTGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZGllKDcpO1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIGlmIChpc0RyYWZ0YWJsZShiYXNlKSkge1xuICAgICAgICBjb25zdCBzY29wZSA9IGVudGVyU2NvcGUodGhpcyk7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gY3JlYXRlUHJveHkoYmFzZSwgdm9pZCAwKTtcbiAgICAgICAgbGV0IGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSByZWNpcGUocHJveHkpO1xuICAgICAgICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKGhhc0Vycm9yKVxuICAgICAgICAgICAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxlYXZlU2NvcGUoc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSk7XG4gICAgICB9IGVsc2UgaWYgKCFiYXNlIHx8IHR5cGVvZiBiYXNlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlY2lwZShiYXNlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKVxuICAgICAgICAgIHJlc3VsdCA9IGJhc2U7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IE5PVEhJTkcpXG4gICAgICAgICAgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICBpZiAodGhpcy5hdXRvRnJlZXplXylcbiAgICAgICAgICBmcmVlemUocmVzdWx0LCB0cnVlKTtcbiAgICAgICAgaWYgKHBhdGNoTGlzdGVuZXIpIHtcbiAgICAgICAgICBjb25zdCBwID0gW107XG4gICAgICAgICAgY29uc3QgaXAgPSBbXTtcbiAgICAgICAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhiYXNlLCByZXN1bHQsIHAsIGlwKTtcbiAgICAgICAgICBwYXRjaExpc3RlbmVyKHAsIGlwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlXG4gICAgICAgIGRpZSgxLCBiYXNlKTtcbiAgICB9O1xuICAgIHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzID0gKGJhc2UsIHJlY2lwZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBiYXNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIChzdGF0ZSwgLi4uYXJncykgPT4gdGhpcy5wcm9kdWNlV2l0aFBhdGNoZXMoc3RhdGUsIChkcmFmdCkgPT4gYmFzZShkcmFmdCwgLi4uYXJncykpO1xuICAgICAgfVxuICAgICAgbGV0IHBhdGNoZXMsIGludmVyc2VQYXRjaGVzO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9kdWNlKGJhc2UsIHJlY2lwZSwgKHAsIGlwKSA9PiB7XG4gICAgICAgIHBhdGNoZXMgPSBwO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcyA9IGlwO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gW3Jlc3VsdCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXNdO1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBjb25maWc/LmF1dG9GcmVlemUgPT09IFwiYm9vbGVhblwiKVxuICAgICAgdGhpcy5zZXRBdXRvRnJlZXplKGNvbmZpZy5hdXRvRnJlZXplKTtcbiAgICBpZiAodHlwZW9mIGNvbmZpZz8udXNlU3RyaWN0U2hhbGxvd0NvcHkgPT09IFwiYm9vbGVhblwiKVxuICAgICAgdGhpcy5zZXRVc2VTdHJpY3RTaGFsbG93Q29weShjb25maWcudXNlU3RyaWN0U2hhbGxvd0NvcHkpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnPy51c2VTdHJpY3RJdGVyYXRpb24gPT09IFwiYm9vbGVhblwiKVxuICAgICAgdGhpcy5zZXRVc2VTdHJpY3RJdGVyYXRpb24oY29uZmlnLnVzZVN0cmljdEl0ZXJhdGlvbik7XG4gIH1cbiAgY3JlYXRlRHJhZnQoYmFzZSkge1xuICAgIGlmICghaXNEcmFmdGFibGUoYmFzZSkpXG4gICAgICBkaWUoOCk7XG4gICAgaWYgKGlzRHJhZnQoYmFzZSkpXG4gICAgICBiYXNlID0gY3VycmVudChiYXNlKTtcbiAgICBjb25zdCBzY29wZSA9IGVudGVyU2NvcGUodGhpcyk7XG4gICAgY29uc3QgcHJveHkgPSBjcmVhdGVQcm94eShiYXNlLCB2b2lkIDApO1xuICAgIHByb3h5W0RSQUZUX1NUQVRFXS5pc01hbnVhbF8gPSB0cnVlO1xuICAgIGxlYXZlU2NvcGUoc2NvcGUpO1xuICAgIHJldHVybiBwcm94eTtcbiAgfVxuICBmaW5pc2hEcmFmdChkcmFmdCwgcGF0Y2hMaXN0ZW5lcikge1xuICAgIGNvbnN0IHN0YXRlID0gZHJhZnQgJiYgZHJhZnRbRFJBRlRfU1RBVEVdO1xuICAgIGlmICghc3RhdGUgfHwgIXN0YXRlLmlzTWFudWFsXylcbiAgICAgIGRpZSg5KTtcbiAgICBjb25zdCB7IHNjb3BlXzogc2NvcGUgfSA9IHN0YXRlO1xuICAgIHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKTtcbiAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdCh2b2lkIDAsIHNjb3BlKTtcbiAgfVxuICAvKipcbiAgICogUGFzcyB0cnVlIHRvIGF1dG9tYXRpY2FsbHkgZnJlZXplIGFsbCBjb3BpZXMgY3JlYXRlZCBieSBJbW1lci5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgYXV0by1mcmVlemluZyBpcyBlbmFibGVkLlxuICAgKi9cbiAgc2V0QXV0b0ZyZWV6ZSh2YWx1ZSkge1xuICAgIHRoaXMuYXV0b0ZyZWV6ZV8gPSB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogUGFzcyB0cnVlIHRvIGVuYWJsZSBzdHJpY3Qgc2hhbGxvdyBjb3B5LlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBpbW1lciBkb2VzIG5vdCBjb3B5IHRoZSBvYmplY3QgZGVzY3JpcHRvcnMgc3VjaCBhcyBnZXR0ZXIsIHNldHRlciBhbmQgbm9uLWVudW1yYWJsZSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkodmFsdWUpIHtcbiAgICB0aGlzLnVzZVN0cmljdFNoYWxsb3dDb3B5XyA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBQYXNzIGZhbHNlIHRvIHVzZSBmYXN0ZXIgaXRlcmF0aW9uIHRoYXQgc2tpcHMgbm9uLWVudW1lcmFibGUgcHJvcGVydGllc1xuICAgKiBidXQgc3RpbGwgaGFuZGxlcyBzeW1ib2xzIGZvciBjb21wYXRpYmlsaXR5LlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzdHJpY3QgaXRlcmF0aW9uIGlzIGVuYWJsZWQgKGluY2x1ZGVzIGFsbCBvd24gcHJvcGVydGllcykuXG4gICAqL1xuICBzZXRVc2VTdHJpY3RJdGVyYXRpb24odmFsdWUpIHtcbiAgICB0aGlzLnVzZVN0cmljdEl0ZXJhdGlvbl8gPSB2YWx1ZTtcbiAgfVxuICBzaG91bGRVc2VTdHJpY3RJdGVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudXNlU3RyaWN0SXRlcmF0aW9uXztcbiAgfVxuICBhcHBseVBhdGNoZXMoYmFzZSwgcGF0Y2hlcykge1xuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IHBhdGNoZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHBhdGNoID0gcGF0Y2hlc1tpXTtcbiAgICAgIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA9PT0gMCAmJiBwYXRjaC5vcCA9PT0gXCJyZXBsYWNlXCIpIHtcbiAgICAgICAgYmFzZSA9IHBhdGNoLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPiAtMSkge1xuICAgICAgcGF0Y2hlcyA9IHBhdGNoZXMuc2xpY2UoaSArIDEpO1xuICAgIH1cbiAgICBjb25zdCBhcHBseVBhdGNoZXNJbXBsID0gZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5hcHBseVBhdGNoZXNfO1xuICAgIGlmIChpc0RyYWZ0KGJhc2UpKSB7XG4gICAgICByZXR1cm4gYXBwbHlQYXRjaGVzSW1wbChiYXNlLCBwYXRjaGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJvZHVjZShcbiAgICAgIGJhc2UsXG4gICAgICAoZHJhZnQpID0+IGFwcGx5UGF0Y2hlc0ltcGwoZHJhZnQsIHBhdGNoZXMpXG4gICAgKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZVByb3h5KHZhbHVlLCBwYXJlbnQpIHtcbiAgY29uc3QgZHJhZnQgPSBpc01hcCh2YWx1ZSkgPyBnZXRQbHVnaW4oXCJNYXBTZXRcIikucHJveHlNYXBfKHZhbHVlLCBwYXJlbnQpIDogaXNTZXQodmFsdWUpID8gZ2V0UGx1Z2luKFwiTWFwU2V0XCIpLnByb3h5U2V0Xyh2YWx1ZSwgcGFyZW50KSA6IGNyZWF0ZVByb3h5UHJveHkodmFsdWUsIHBhcmVudCk7XG4gIGNvbnN0IHNjb3BlID0gcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpO1xuICBzY29wZS5kcmFmdHNfLnB1c2goZHJhZnQpO1xuICByZXR1cm4gZHJhZnQ7XG59XG5cbi8vIHNyYy9jb3JlL2N1cnJlbnQudHNcbmZ1bmN0aW9uIGN1cnJlbnQodmFsdWUpIHtcbiAgaWYgKCFpc0RyYWZ0KHZhbHVlKSlcbiAgICBkaWUoMTAsIHZhbHVlKTtcbiAgcmV0dXJuIGN1cnJlbnRJbXBsKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGN1cnJlbnRJbXBsKHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdGFibGUodmFsdWUpIHx8IGlzRnJvemVuKHZhbHVlKSlcbiAgICByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHN0YXRlID0gdmFsdWVbRFJBRlRfU1RBVEVdO1xuICBsZXQgY29weTtcbiAgbGV0IHN0cmljdCA9IHRydWU7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICghc3RhdGUubW9kaWZpZWRfKVxuICAgICAgcmV0dXJuIHN0YXRlLmJhc2VfO1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSB0cnVlO1xuICAgIGNvcHkgPSBzaGFsbG93Q29weSh2YWx1ZSwgc3RhdGUuc2NvcGVfLmltbWVyXy51c2VTdHJpY3RTaGFsbG93Q29weV8pO1xuICAgIHN0cmljdCA9IHN0YXRlLnNjb3BlXy5pbW1lcl8uc2hvdWxkVXNlU3RyaWN0SXRlcmF0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgY29weSA9IHNoYWxsb3dDb3B5KHZhbHVlLCB0cnVlKTtcbiAgfVxuICBlYWNoKFxuICAgIGNvcHksXG4gICAgKGtleSwgY2hpbGRWYWx1ZSkgPT4ge1xuICAgICAgc2V0KGNvcHksIGtleSwgY3VycmVudEltcGwoY2hpbGRWYWx1ZSkpO1xuICAgIH0sXG4gICAgc3RyaWN0XG4gICk7XG4gIGlmIChzdGF0ZSkge1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLy8gc3JjL3BsdWdpbnMvcGF0Y2hlcy50c1xuZnVuY3Rpb24gZW5hYmxlUGF0Y2hlcygpIHtcbiAgY29uc3QgZXJyb3JPZmZzZXQgPSAxNjtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgJ1NldHMgY2Fubm90IGhhdmUgXCJyZXBsYWNlXCIgcGF0Y2hlcy4nLFxuICAgICAgZnVuY3Rpb24ob3ApIHtcbiAgICAgICAgcmV0dXJuIFwiVW5zdXBwb3J0ZWQgcGF0Y2ggb3BlcmF0aW9uOiBcIiArIG9wO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIFwiQ2Fubm90IGFwcGx5IHBhdGNoLCBwYXRoIGRvZXNuJ3QgcmVzb2x2ZTogXCIgKyBwYXRoO1xuICAgICAgfSxcbiAgICAgIFwiUGF0Y2hpbmcgcmVzZXJ2ZWQgYXR0cmlidXRlcyBsaWtlIF9fcHJvdG9fXywgcHJvdG90eXBlIGFuZCBjb25zdHJ1Y3RvciBpcyBub3QgYWxsb3dlZFwiXG4gICAgKTtcbiAgfVxuICBjb25zdCBSRVBMQUNFID0gXCJyZXBsYWNlXCI7XG4gIGNvbnN0IEFERCA9IFwiYWRkXCI7XG4gIGNvbnN0IFJFTU9WRSA9IFwicmVtb3ZlXCI7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlUGF0Y2hlc18oc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIHN3aXRjaCAoc3RhdGUudHlwZV8pIHtcbiAgICAgIGNhc2UgMCAvKiBPYmplY3QgKi86XG4gICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVQYXRjaGVzRnJvbUFzc2lnbmVkKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGJhc2VQYXRoLFxuICAgICAgICAgIHBhdGNoZXMsXG4gICAgICAgICAgaW52ZXJzZVBhdGNoZXNcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlQXJyYXlQYXRjaGVzKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpO1xuICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlU2V0UGF0Y2hlcyhcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICBwYXRjaGVzLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlQXJyYXlQYXRjaGVzKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBsZXQgeyBiYXNlXywgYXNzaWduZWRfIH0gPSBzdGF0ZTtcbiAgICBsZXQgY29weV8gPSBzdGF0ZS5jb3B5XztcbiAgICBpZiAoY29weV8ubGVuZ3RoIDwgYmFzZV8ubGVuZ3RoKSB7XG4gICAgICA7XG4gICAgICBbYmFzZV8sIGNvcHlfXSA9IFtjb3B5XywgYmFzZV9dO1xuICAgICAgW3BhdGNoZXMsIGludmVyc2VQYXRjaGVzXSA9IFtpbnZlcnNlUGF0Y2hlcywgcGF0Y2hlc107XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZV8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhc3NpZ25lZF9baV0gJiYgY29weV9baV0gIT09IGJhc2VfW2ldKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogUkVQTEFDRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIC8vIE5lZWQgdG8gbWF5YmUgY2xvbmUgaXQsIGFzIGl0IGNhbiBpbiBmYWN0IGJlIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICAgIC8vIGR1ZSB0byB0aGUgYmFzZS9jb3B5IGludmVyc2lvbiBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvblxuICAgICAgICAgIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChjb3B5X1tpXSlcbiAgICAgICAgfSk7XG4gICAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGJhc2VfW2ldKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IGJhc2VfLmxlbmd0aDsgaSA8IGNvcHlfLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICBvcDogQURELFxuICAgICAgICBwYXRoLFxuICAgICAgICAvLyBOZWVkIHRvIG1heWJlIGNsb25lIGl0LCBhcyBpdCBjYW4gaW4gZmFjdCBiZSB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgICAgLy8gZHVlIHRvIHRoZSBiYXNlL2NvcHkgaW52ZXJzaW9uIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChjb3B5X1tpXSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gY29weV8ubGVuZ3RoIC0gMTsgYmFzZV8ubGVuZ3RoIDw9IGk7IC0taSkge1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaCh7XG4gICAgICAgIG9wOiBSRU1PVkUsXG4gICAgICAgIHBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZVBhdGNoZXNGcm9tQXNzaWduZWQoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIGNvbnN0IHsgYmFzZV8sIGNvcHlfIH0gPSBzdGF0ZTtcbiAgICBlYWNoKHN0YXRlLmFzc2lnbmVkXywgKGtleSwgYXNzaWduZWRWYWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ1ZhbHVlID0gZ2V0KGJhc2VfLCBrZXkpO1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXQoY29weV8sIGtleSk7XG4gICAgICBjb25zdCBvcCA9ICFhc3NpZ25lZFZhbHVlID8gUkVNT1ZFIDogaGFzKGJhc2VfLCBrZXkpID8gUkVQTEFDRSA6IEFERDtcbiAgICAgIGlmIChvcmlnVmFsdWUgPT09IHZhbHVlICYmIG9wID09PSBSRVBMQUNFKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KGtleSk7XG4gICAgICBwYXRjaGVzLnB1c2gob3AgPT09IFJFTU9WRSA/IHsgb3AsIHBhdGggfSA6IHsgb3AsIHBhdGgsIHZhbHVlIH0pO1xuICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaChcbiAgICAgICAgb3AgPT09IEFERCA/IHsgb3A6IFJFTU9WRSwgcGF0aCB9IDogb3AgPT09IFJFTU9WRSA/IHsgb3A6IEFERCwgcGF0aCwgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKG9yaWdWYWx1ZSkgfSA6IHsgb3A6IFJFUExBQ0UsIHBhdGgsIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChvcmlnVmFsdWUpIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVTZXRQYXRjaGVzKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBsZXQgeyBiYXNlXywgY29weV8gfSA9IHN0YXRlO1xuICAgIGxldCBpID0gMDtcbiAgICBiYXNlXy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFjb3B5Xy5oYXModmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogUkVNT1ZFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGludmVyc2VQYXRjaGVzLnVuc2hpZnQoe1xuICAgICAgICAgIG9wOiBBREQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9KTtcbiAgICBpID0gMDtcbiAgICBjb3B5Xy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFiYXNlXy5oYXModmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogQURELFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGludmVyc2VQYXRjaGVzLnVuc2hpZnQoe1xuICAgICAgICAgIG9wOiBSRU1PVkUsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18oYmFzZVZhbHVlLCByZXBsYWNlbWVudCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICBwYXRoOiBbXSxcbiAgICAgIHZhbHVlOiByZXBsYWNlbWVudCA9PT0gTk9USElORyA/IHZvaWQgMCA6IHJlcGxhY2VtZW50XG4gICAgfSk7XG4gICAgaW52ZXJzZVBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogUkVQTEFDRSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgdmFsdWU6IGJhc2VWYWx1ZVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGFwcGx5UGF0Y2hlc18oZHJhZnQsIHBhdGNoZXMpIHtcbiAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICBjb25zdCB7IHBhdGgsIG9wIH0gPSBwYXRjaDtcbiAgICAgIGxldCBiYXNlID0gZHJhZnQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFR5cGUgPSBnZXRBcmNodHlwZShiYXNlKTtcbiAgICAgICAgbGV0IHAgPSBwYXRoW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHAgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHAgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBwID0gXCJcIiArIHA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwYXJlbnRUeXBlID09PSAwIC8qIE9iamVjdCAqLyB8fCBwYXJlbnRUeXBlID09PSAxIC8qIEFycmF5ICovKSAmJiAocCA9PT0gXCJfX3Byb3RvX19cIiB8fCBwID09PSBcImNvbnN0cnVjdG9yXCIpKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDMpO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2UgPT09IFwiZnVuY3Rpb25cIiAmJiBwID09PSBcInByb3RvdHlwZVwiKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDMpO1xuICAgICAgICBiYXNlID0gZ2V0KGJhc2UsIHApO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2UgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMiwgcGF0aC5qb2luKFwiL1wiKSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlID0gZ2V0QXJjaHR5cGUoYmFzZSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRlZXBDbG9uZVBhdGNoVmFsdWUocGF0Y2gudmFsdWUpO1xuICAgICAgY29uc3Qga2V5ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgICAgc3dpdGNoIChvcCkge1xuICAgICAgICBjYXNlIFJFUExBQ0U6XG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBBREQ6XG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDEgLyogQXJyYXkgKi86XG4gICAgICAgICAgICAgIHJldHVybiBrZXkgPT09IFwiLVwiID8gYmFzZS5wdXNoKHZhbHVlKSA6IGJhc2Uuc3BsaWNlKGtleSwgMCwgdmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuYWRkKHZhbHVlKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgUkVNT1ZFOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAxIC8qIEFycmF5ICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5zcGxpY2Uoa2V5LCAxKTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZGVsZXRlKHBhdGNoLnZhbHVlKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBkZWxldGUgYmFzZVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAxLCBvcCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRyYWZ0O1xuICB9XG4gIGZ1bmN0aW9uIGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqKSB7XG4gICAgaWYgKCFpc0RyYWZ0YWJsZShvYmopKVxuICAgICAgcmV0dXJuIG9iajtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKVxuICAgICAgcmV0dXJuIG9iai5tYXAoZGVlcENsb25lUGF0Y2hWYWx1ZSk7XG4gICAgaWYgKGlzTWFwKG9iaikpXG4gICAgICByZXR1cm4gbmV3IE1hcChcbiAgICAgICAgQXJyYXkuZnJvbShvYmouZW50cmllcygpKS5tYXAoKFtrLCB2XSkgPT4gW2ssIGRlZXBDbG9uZVBhdGNoVmFsdWUodildKVxuICAgICAgKTtcbiAgICBpZiAoaXNTZXQob2JqKSlcbiAgICAgIHJldHVybiBuZXcgU2V0KEFycmF5LmZyb20ob2JqKS5tYXAoZGVlcENsb25lUGF0Y2hWYWx1ZSkpO1xuICAgIGNvbnN0IGNsb25lZCA9IE9iamVjdC5jcmVhdGUoZ2V0UHJvdG90eXBlT2Yob2JqKSk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKVxuICAgICAgY2xvbmVkW2tleV0gPSBkZWVwQ2xvbmVQYXRjaFZhbHVlKG9ialtrZXldKTtcbiAgICBpZiAoaGFzKG9iaiwgRFJBRlRBQkxFKSlcbiAgICAgIGNsb25lZFtEUkFGVEFCTEVdID0gb2JqW0RSQUZUQUJMRV07XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxuICBmdW5jdGlvbiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChvYmopIHtcbiAgICBpZiAoaXNEcmFmdChvYmopKSB7XG4gICAgICByZXR1cm4gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmopO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuIG9iajtcbiAgfVxuICBsb2FkUGx1Z2luKFwiUGF0Y2hlc1wiLCB7XG4gICAgYXBwbHlQYXRjaGVzXyxcbiAgICBnZW5lcmF0ZVBhdGNoZXNfLFxuICAgIGdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzX1xuICB9KTtcbn1cblxuLy8gc3JjL3BsdWdpbnMvbWFwc2V0LnRzXG5mdW5jdGlvbiBlbmFibGVNYXBTZXQoKSB7XG4gIGNsYXNzIERyYWZ0TWFwIGV4dGVuZHMgTWFwIHtcbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIHBhcmVudCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXNbRFJBRlRfU1RBVEVdID0ge1xuICAgICAgICB0eXBlXzogMiAvKiBNYXAgKi8sXG4gICAgICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAgICAgc2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCksXG4gICAgICAgIG1vZGlmaWVkXzogZmFsc2UsXG4gICAgICAgIGZpbmFsaXplZF86IGZhbHNlLFxuICAgICAgICBjb3B5Xzogdm9pZCAwLFxuICAgICAgICBhc3NpZ25lZF86IHZvaWQgMCxcbiAgICAgICAgYmFzZV86IHRhcmdldCxcbiAgICAgICAgZHJhZnRfOiB0aGlzLFxuICAgICAgICBpc01hbnVhbF86IGZhbHNlLFxuICAgICAgICByZXZva2VkXzogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuc2l6ZTtcbiAgICB9XG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuaGFzKGtleSk7XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghbGF0ZXN0KHN0YXRlKS5oYXMoa2V5KSB8fCBsYXRlc3Qoc3RhdGUpLmdldChrZXkpICE9PSB2YWx1ZSkge1xuICAgICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIHRydWUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICBpZiAoIXRoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICBpZiAoc3RhdGUuYmFzZV8uaGFzKGtleSkpIHtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmNvcHlfLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAobGF0ZXN0KHN0YXRlKS5zaXplKSB7XG4gICAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgICBlYWNoKHN0YXRlLmJhc2VfLCAoa2V5KSA9PiB7XG4gICAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvckVhY2goY2IsIHRoaXNBcmcpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBsYXRlc3Qoc3RhdGUpLmZvckVhY2goKF92YWx1ZSwga2V5LCBfbWFwKSA9PiB7XG4gICAgICAgIGNiLmNhbGwodGhpc0FyZywgdGhpcy5nZXQoa2V5KSwga2V5LCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQoa2V5KSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gbGF0ZXN0KHN0YXRlKS5nZXQoa2V5KTtcbiAgICAgIGlmIChzdGF0ZS5maW5hbGl6ZWRfIHx8ICFpc0RyYWZ0YWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlICE9PSBzdGF0ZS5iYXNlXy5nZXQoa2V5KSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkcmFmdCA9IGNyZWF0ZVByb3h5KHZhbHVlLCBzdGF0ZSk7XG4gICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICBzdGF0ZS5jb3B5Xy5zZXQoa2V5LCBkcmFmdCk7XG4gICAgICByZXR1cm4gZHJhZnQ7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5rZXlzKCk7XG4gICAgfVxuICAgIHZhbHVlcygpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5rZXlzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gdGhpcy52YWx1ZXMoKSxcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHIgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHIuZG9uZSlcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoci52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBlbnRyaWVzKCkge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLmtleXMoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB0aGlzLmVudHJpZXMoKSxcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHIgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHIuZG9uZSlcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoci52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IFtyLnZhbHVlLCB2YWx1ZV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBbKERSQUZUX1NUQVRFLCBTeW1ib2wuaXRlcmF0b3IpXSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJveHlNYXBfKHRhcmdldCwgcGFyZW50KSB7XG4gICAgcmV0dXJuIG5ldyBEcmFmdE1hcCh0YXJnZXQsIHBhcmVudCk7XG4gIH1cbiAgZnVuY3Rpb24gcHJlcGFyZU1hcENvcHkoc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgICBzdGF0ZS5hc3NpZ25lZF8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgc3RhdGUuY29weV8gPSBuZXcgTWFwKHN0YXRlLmJhc2VfKTtcbiAgICB9XG4gIH1cbiAgY2xhc3MgRHJhZnRTZXQgZXh0ZW5kcyBTZXQge1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgcGFyZW50KSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpc1tEUkFGVF9TVEFURV0gPSB7XG4gICAgICAgIHR5cGVfOiAzIC8qIFNldCAqLyxcbiAgICAgICAgcGFyZW50XzogcGFyZW50LFxuICAgICAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAgICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAgICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgICAgIGNvcHlfOiB2b2lkIDAsXG4gICAgICAgIGJhc2VfOiB0YXJnZXQsXG4gICAgICAgIGRyYWZ0XzogdGhpcyxcbiAgICAgICAgZHJhZnRzXzogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSxcbiAgICAgICAgcmV2b2tlZF86IGZhbHNlLFxuICAgICAgICBpc01hbnVhbF86IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLnNpemU7XG4gICAgfVxuICAgIGhhcyh2YWx1ZSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5iYXNlXy5oYXModmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmNvcHlfLmhhcyh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHN0YXRlLmRyYWZ0c18uaGFzKHZhbHVlKSAmJiBzdGF0ZS5jb3B5Xy5oYXMoc3RhdGUuZHJhZnRzXy5nZXQodmFsdWUpKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGFkZCh2YWx1ZSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAoIXRoaXMuaGFzKHZhbHVlKSkge1xuICAgICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuY29weV8uYWRkKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZWxldGUodmFsdWUpIHtcbiAgICAgIGlmICghdGhpcy5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLmRlbGV0ZSh2YWx1ZSkgfHwgKHN0YXRlLmRyYWZ0c18uaGFzKHZhbHVlKSA/IHN0YXRlLmNvcHlfLmRlbGV0ZShzdGF0ZS5kcmFmdHNfLmdldCh2YWx1ZSkpIDogKFxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBmYWxzZVxuICAgICAgKSk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAobGF0ZXN0KHN0YXRlKS5zaXplKSB7XG4gICAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YWx1ZXMoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5Xy52YWx1ZXMoKTtcbiAgICB9XG4gICAgZW50cmllcygpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLmVudHJpZXMoKTtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpO1xuICAgIH1cbiAgICBbKERSQUZUX1NUQVRFLCBTeW1ib2wuaXRlcmF0b3IpXSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpO1xuICAgIH1cbiAgICBmb3JFYWNoKGNiLCB0aGlzQXJnKSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMudmFsdWVzKCk7XG4gICAgICBsZXQgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICBjYi5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgcmVzdWx0LnZhbHVlLCB0aGlzKTtcbiAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwcm94eVNldF8odGFyZ2V0LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gbmV3IERyYWZ0U2V0KHRhcmdldCwgcGFyZW50KTtcbiAgfVxuICBmdW5jdGlvbiBwcmVwYXJlU2V0Q29weShzdGF0ZSkge1xuICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgIHN0YXRlLmNvcHlfID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICAgIHN0YXRlLmJhc2VfLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpc0RyYWZ0YWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBkcmFmdCA9IGNyZWF0ZVByb3h5KHZhbHVlLCBzdGF0ZSk7XG4gICAgICAgICAgc3RhdGUuZHJhZnRzXy5zZXQodmFsdWUsIGRyYWZ0KTtcbiAgICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQoZHJhZnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLmNvcHlfLmFkZCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhc3NlcnRVbnJldm9rZWQoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUucmV2b2tlZF8pXG4gICAgICBkaWUoMywgSlNPTi5zdHJpbmdpZnkobGF0ZXN0KHN0YXRlKSkpO1xuICB9XG4gIGxvYWRQbHVnaW4oXCJNYXBTZXRcIiwgeyBwcm94eU1hcF8sIHByb3h5U2V0XyB9KTtcbn1cblxuLy8gc3JjL2ltbWVyLnRzXG52YXIgaW1tZXIgPSBuZXcgSW1tZXIyKCk7XG52YXIgcHJvZHVjZSA9IGltbWVyLnByb2R1Y2U7XG52YXIgcHJvZHVjZVdpdGhQYXRjaGVzID0gLyogQF9fUFVSRV9fICovIGltbWVyLnByb2R1Y2VXaXRoUGF0Y2hlcy5iaW5kKFxuICBpbW1lclxuKTtcbnZhciBzZXRBdXRvRnJlZXplID0gLyogQF9fUFVSRV9fICovIGltbWVyLnNldEF1dG9GcmVlemUuYmluZChpbW1lcik7XG52YXIgc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkuYmluZChcbiAgaW1tZXJcbik7XG52YXIgc2V0VXNlU3RyaWN0SXRlcmF0aW9uID0gLyogQF9fUFVSRV9fICovIGltbWVyLnNldFVzZVN0cmljdEl0ZXJhdGlvbi5iaW5kKFxuICBpbW1lclxuKTtcbnZhciBhcHBseVBhdGNoZXMgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuYXBwbHlQYXRjaGVzLmJpbmQoaW1tZXIpO1xudmFyIGNyZWF0ZURyYWZ0ID0gLyogQF9fUFVSRV9fICovIGltbWVyLmNyZWF0ZURyYWZ0LmJpbmQoaW1tZXIpO1xudmFyIGZpbmlzaERyYWZ0ID0gLyogQF9fUFVSRV9fICovIGltbWVyLmZpbmlzaERyYWZ0LmJpbmQoaW1tZXIpO1xuZnVuY3Rpb24gY2FzdERyYWZ0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNhc3RJbW11dGFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IHtcbiAgSW1tZXIyIGFzIEltbWVyLFxuICBhcHBseVBhdGNoZXMsXG4gIGNhc3REcmFmdCxcbiAgY2FzdEltbXV0YWJsZSxcbiAgY3JlYXRlRHJhZnQsXG4gIGN1cnJlbnQsXG4gIGVuYWJsZU1hcFNldCxcbiAgZW5hYmxlUGF0Y2hlcyxcbiAgZmluaXNoRHJhZnQsXG4gIGZyZWV6ZSxcbiAgRFJBRlRBQkxFIGFzIGltbWVyYWJsZSxcbiAgaXNEcmFmdCxcbiAgaXNEcmFmdGFibGUsXG4gIE5PVEhJTkcgYXMgbm90aGluZyxcbiAgb3JpZ2luYWwsXG4gIHByb2R1Y2UsXG4gIHByb2R1Y2VXaXRoUGF0Y2hlcyxcbiAgc2V0QXV0b0ZyZWV6ZSxcbiAgc2V0VXNlU3RyaWN0SXRlcmF0aW9uLFxuICBzZXRVc2VTdHJpY3RTaGFsbG93Q29weVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWltbWVyLm1qcy5tYXAiLCIvLyBzcmMvaW5kZXgudHNcbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYWN0aW9uKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmFBcmd1bWVudCk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gIH07XG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxudmFyIHRodW5rID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlKCk7XG52YXIgd2l0aEV4dHJhQXJndW1lbnQgPSBjcmVhdGVUaHVua01pZGRsZXdhcmU7XG5leHBvcnQge1xuICB0aHVuayxcbiAgd2l0aEV4dHJhQXJndW1lbnRcbn07XG4iLCIvLyBzcmMvaW5kZXgudHNcbmV4cG9ydCAqIGZyb20gXCJyZWR1eFwiO1xuaW1wb3J0IHsgZnJlZXplLCBvcmlnaW5hbCBhcyBvcmlnaW5hbDIgfSBmcm9tIFwiaW1tZXJcIjtcblxuLy8gc3JjL2ltbWVySW1wb3J0cy50c1xuaW1wb3J0IHsgY3VycmVudCwgaXNEcmFmdCwgcHJvZHVjZSwgaXNEcmFmdGFibGUsIHNldFVzZVN0cmljdEl0ZXJhdGlvbiB9IGZyb20gXCJpbW1lclwiO1xuXG4vLyBzcmMvaW5kZXgudHNcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yLCBscnVNZW1vaXplIH0gZnJvbSBcInJlc2VsZWN0XCI7XG5cbi8vIHNyYy9yZXNlbGVjdEltcG9ydHMudHNcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yQ3JlYXRvciwgd2Vha01hcE1lbW9pemUgfSBmcm9tIFwicmVzZWxlY3RcIjtcblxuLy8gc3JjL2NyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yLnRzXG52YXIgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JDcmVhdG9yID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgY3JlYXRlU2VsZWN0b3IyID0gY3JlYXRlU2VsZWN0b3JDcmVhdG9yKC4uLmFyZ3MpO1xuICBjb25zdCBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjIgPSBPYmplY3QuYXNzaWduKCguLi5hcmdzMikgPT4ge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IyKC4uLmFyZ3MyKTtcbiAgICBjb25zdCB3cmFwcGVkU2VsZWN0b3IgPSAodmFsdWUsIC4uLnJlc3QpID0+IHNlbGVjdG9yKGlzRHJhZnQodmFsdWUpID8gY3VycmVudCh2YWx1ZSkgOiB2YWx1ZSwgLi4ucmVzdCk7XG4gICAgT2JqZWN0LmFzc2lnbih3cmFwcGVkU2VsZWN0b3IsIHNlbGVjdG9yKTtcbiAgICByZXR1cm4gd3JhcHBlZFNlbGVjdG9yO1xuICB9LCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjJcbiAgfSk7XG4gIHJldHVybiBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjI7XG59O1xudmFyIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yQ3JlYXRvcih3ZWFrTWFwTWVtb2l6ZSk7XG5cbi8vIHNyYy9yZWR1eEltcG9ydHMudHNcbmltcG9ydCB7IGNyZWF0ZVN0b3JlLCBjb21iaW5lUmVkdWNlcnMsIGFwcGx5TWlkZGxld2FyZSwgY29tcG9zZSwgaXNQbGFpbk9iamVjdCwgaXNBY3Rpb24gfSBmcm9tIFwicmVkdXhcIjtcblxuLy8gc3JjL2RldnRvb2xzRXh0ZW5zaW9uLnRzXG52YXIgY29tcG9zZVdpdGhEZXZUb29scyA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXyA/IHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18gOiBmdW5jdGlvbigpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB2b2lkIDA7XG4gIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKSByZXR1cm4gY29tcG9zZTtcbiAgcmV0dXJuIGNvbXBvc2UuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn07XG52YXIgZGV2VG9vbHNFbmhhbmNlciA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gPyB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyA6IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZnVuY3Rpb24obm9vcDMpIHtcbiAgICByZXR1cm4gbm9vcDM7XG4gIH07XG59O1xuXG4vLyBzcmMvZ2V0RGVmYXVsdE1pZGRsZXdhcmUudHNcbmltcG9ydCB7IHRodW5rIGFzIHRodW5rTWlkZGxld2FyZSwgd2l0aEV4dHJhQXJndW1lbnQgfSBmcm9tIFwicmVkdXgtdGh1bmtcIjtcblxuLy8gc3JjL3RzSGVscGVycy50c1xudmFyIGhhc01hdGNoRnVuY3Rpb24gPSAodikgPT4ge1xuICByZXR1cm4gdiAmJiB0eXBlb2Ygdi5tYXRjaCA9PT0gXCJmdW5jdGlvblwiO1xufTtcblxuLy8gc3JjL2NyZWF0ZUFjdGlvbi50c1xuZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIHByZXBhcmVBY3Rpb24pIHtcbiAgZnVuY3Rpb24gYWN0aW9uQ3JlYXRvciguLi5hcmdzKSB7XG4gICAgaWYgKHByZXBhcmVBY3Rpb24pIHtcbiAgICAgIGxldCBwcmVwYXJlZCA9IHByZXBhcmVBY3Rpb24oLi4uYXJncyk7XG4gICAgICBpZiAoIXByZXBhcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogXCJwcmVwYXJlQWN0aW9uIGRpZCBub3QgcmV0dXJuIGFuIG9iamVjdFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHBheWxvYWQ6IHByZXBhcmVkLnBheWxvYWQsXG4gICAgICAgIC4uLlwibWV0YVwiIGluIHByZXBhcmVkICYmIHtcbiAgICAgICAgICBtZXRhOiBwcmVwYXJlZC5tZXRhXG4gICAgICAgIH0sXG4gICAgICAgIC4uLlwiZXJyb3JcIiBpbiBwcmVwYXJlZCAmJiB7XG4gICAgICAgICAgZXJyb3I6IHByZXBhcmVkLmVycm9yXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlLFxuICAgICAgcGF5bG9hZDogYXJnc1swXVxuICAgIH07XG4gIH1cbiAgYWN0aW9uQ3JlYXRvci50b1N0cmluZyA9ICgpID0+IGAke3R5cGV9YDtcbiAgYWN0aW9uQ3JlYXRvci50eXBlID0gdHlwZTtcbiAgYWN0aW9uQ3JlYXRvci5tYXRjaCA9IChhY3Rpb24pID0+IGlzQWN0aW9uKGFjdGlvbikgJiYgYWN0aW9uLnR5cGUgPT09IHR5cGU7XG4gIHJldHVybiBhY3Rpb25DcmVhdG9yO1xufVxuZnVuY3Rpb24gaXNBY3Rpb25DcmVhdG9yKGFjdGlvbikge1xuICByZXR1cm4gdHlwZW9mIGFjdGlvbiA9PT0gXCJmdW5jdGlvblwiICYmIFwidHlwZVwiIGluIGFjdGlvbiAmJiAvLyBoYXNNYXRjaEZ1bmN0aW9uIG9ubHkgd2FudHMgTWF0Y2hlcnMgYnV0IEkgZG9uJ3Qgc2VlIHRoZSBwb2ludCBpbiByZXdyaXRpbmcgaXRcbiAgaGFzTWF0Y2hGdW5jdGlvbihhY3Rpb24pO1xufVxuZnVuY3Rpb24gaXNGU0EoYWN0aW9uKSB7XG4gIHJldHVybiBpc0FjdGlvbihhY3Rpb24pICYmIE9iamVjdC5rZXlzKGFjdGlvbikuZXZlcnkoaXNWYWxpZEtleSk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleSkge1xuICByZXR1cm4gW1widHlwZVwiLCBcInBheWxvYWRcIiwgXCJlcnJvclwiLCBcIm1ldGFcIl0uaW5kZXhPZihrZXkpID4gLTE7XG59XG5cbi8vIHNyYy9hY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gZ2V0TWVzc2FnZSh0eXBlKSB7XG4gIGNvbnN0IHNwbGl0VHlwZSA9IHR5cGUgPyBgJHt0eXBlfWAuc3BsaXQoXCIvXCIpIDogW107XG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBzcGxpdFR5cGVbc3BsaXRUeXBlLmxlbmd0aCAtIDFdIHx8IFwiYWN0aW9uQ3JlYXRvclwiO1xuICByZXR1cm4gYERldGVjdGVkIGFuIGFjdGlvbiBjcmVhdG9yIHdpdGggdHlwZSBcIiR7dHlwZSB8fCBcInVua25vd25cIn1cIiBiZWluZyBkaXNwYXRjaGVkLiBcbk1ha2Ugc3VyZSB5b3UncmUgY2FsbGluZyB0aGUgYWN0aW9uIGNyZWF0b3IgYmVmb3JlIGRpc3BhdGNoaW5nLCBpLmUuIFxcYGRpc3BhdGNoKCR7YWN0aW9uTmFtZX0oKSlcXGAgaW5zdGVhZCBvZiBcXGBkaXNwYXRjaCgke2FjdGlvbk5hbWV9KVxcYC4gVGhpcyBpcyBuZWNlc3NhcnkgZXZlbiBpZiB0aGUgYWN0aW9uIGhhcyBubyBwYXlsb2FkLmA7XG59XG5mdW5jdGlvbiBjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4gbmV4dChhY3Rpb24pO1xuICB9XG4gIGNvbnN0IHtcbiAgICBpc0FjdGlvbkNyZWF0b3I6IGlzQWN0aW9uQ3JlYXRvcjIgPSBpc0FjdGlvbkNyZWF0b3JcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmIChpc0FjdGlvbkNyZWF0b3IyKGFjdGlvbikpIHtcbiAgICAgIGNvbnNvbGUud2FybihnZXRNZXNzYWdlKGFjdGlvbi50eXBlKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gIH07XG59XG5cbi8vIHNyYy91dGlscy50c1xuZnVuY3Rpb24gZ2V0VGltZU1lYXN1cmVVdGlscyhtYXhEZWxheSwgZm5OYW1lKSB7XG4gIGxldCBlbGFwc2VkID0gMDtcbiAgcmV0dXJuIHtcbiAgICBtZWFzdXJlVGltZShmbikge1xuICAgICAgY29uc3Qgc3RhcnRlZCA9IERhdGUubm93KCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkID0gRGF0ZS5ub3coKTtcbiAgICAgICAgZWxhcHNlZCArPSBmaW5pc2hlZCAtIHN0YXJ0ZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgICB3YXJuSWZFeGNlZWRlZCgpIHtcbiAgICAgIGlmIChlbGFwc2VkID4gbWF4RGVsYXkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAke2ZuTmFtZX0gdG9vayAke2VsYXBzZWR9bXMsIHdoaWNoIGlzIG1vcmUgdGhhbiB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJHttYXhEZWxheX1tcy4gXG5JZiB5b3VyIHN0YXRlIG9yIGFjdGlvbnMgYXJlIHZlcnkgbGFyZ2UsIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIHRoZSBtaWRkbGV3YXJlIGFzIGl0IG1pZ2h0IGNhdXNlIHRvbyBtdWNoIG9mIGEgc2xvd2Rvd24gaW4gZGV2ZWxvcG1lbnQgbW9kZS4gU2VlIGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2dldERlZmF1bHRNaWRkbGV3YXJlIGZvciBpbnN0cnVjdGlvbnMuXG5JdCBpcyBkaXNhYmxlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcywgc28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdC5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG52YXIgVHVwbGUgPSBjbGFzcyBfVHVwbGUgZXh0ZW5kcyBBcnJheSB7XG4gIGNvbnN0cnVjdG9yKC4uLml0ZW1zKSB7XG4gICAgc3VwZXIoLi4uaXRlbXMpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBfVHVwbGUucHJvdG90eXBlKTtcbiAgfVxuICBzdGF0aWMgZ2V0IFtTeW1ib2wuc3BlY2llc10oKSB7XG4gICAgcmV0dXJuIF9UdXBsZTtcbiAgfVxuICBjb25jYXQoLi4uYXJyKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNvbmNhdC5hcHBseSh0aGlzLCBhcnIpO1xuICB9XG4gIHByZXBlbmQoLi4uYXJyKSB7XG4gICAgaWYgKGFyci5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcnJbMF0pKSB7XG4gICAgICByZXR1cm4gbmV3IF9UdXBsZSguLi5hcnJbMF0uY29uY2F0KHRoaXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBfVHVwbGUoLi4uYXJyLmNvbmNhdCh0aGlzKSk7XG4gIH1cbn07XG5mdW5jdGlvbiBmcmVlemVEcmFmdGFibGUodmFsKSB7XG4gIHJldHVybiBpc0RyYWZ0YWJsZSh2YWwpID8gcHJvZHVjZSh2YWwsICgpID0+IHtcbiAgfSkgOiB2YWw7XG59XG5mdW5jdGlvbiBnZXRPckluc2VydENvbXB1dGVkKG1hcCwga2V5LCBjb21wdXRlKSB7XG4gIGlmIChtYXAuaGFzKGtleSkpIHJldHVybiBtYXAuZ2V0KGtleSk7XG4gIHJldHVybiBtYXAuc2V0KGtleSwgY29tcHV0ZShrZXkpKS5nZXQoa2V5KTtcbn1cblxuLy8gc3JjL2ltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gaXNJbW11dGFibGVEZWZhdWx0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT0gbnVsbCB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpO1xufVxuZnVuY3Rpb24gdHJhY2tGb3JNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCBvYmopIHtcbiAgY29uc3QgdHJhY2tlZFByb3BlcnRpZXMgPSB0cmFja1Byb3BlcnRpZXMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCBvYmopO1xuICByZXR1cm4ge1xuICAgIGRldGVjdE11dGF0aW9ucygpIHtcbiAgICAgIHJldHVybiBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCB0cmFja2VkUHJvcGVydGllcywgb2JqKTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiB0cmFja1Byb3BlcnRpZXMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzID0gW10sIG9iaiwgcGF0aCA9IFwiXCIsIGNoZWNrZWRPYmplY3RzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkge1xuICBjb25zdCB0cmFja2VkID0ge1xuICAgIHZhbHVlOiBvYmpcbiAgfTtcbiAgaWYgKCFpc0ltbXV0YWJsZShvYmopICYmICFjaGVja2VkT2JqZWN0cy5oYXMob2JqKSkge1xuICAgIGNoZWNrZWRPYmplY3RzLmFkZChvYmopO1xuICAgIHRyYWNrZWQuY2hpbGRyZW4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGggPyBwYXRoICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgICBpZiAoaWdub3JlUGF0aHMubGVuZ3RoICYmIGlnbm9yZVBhdGhzLmluZGV4T2YoY2hpbGRQYXRoKSAhPT0gLTEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0cmFja2VkLmNoaWxkcmVuW2tleV0gPSB0cmFja1Byb3BlcnRpZXMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCBvYmpba2V5XSwgY2hpbGRQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRyYWNrZWQ7XG59XG5mdW5jdGlvbiBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZWRQYXRocyA9IFtdLCB0cmFja2VkUHJvcGVydHksIG9iaiwgc2FtZVBhcmVudFJlZiA9IGZhbHNlLCBwYXRoID0gXCJcIikge1xuICBjb25zdCBwcmV2T2JqID0gdHJhY2tlZFByb3BlcnR5ID8gdHJhY2tlZFByb3BlcnR5LnZhbHVlIDogdm9pZCAwO1xuICBjb25zdCBzYW1lUmVmID0gcHJldk9iaiA9PT0gb2JqO1xuICBpZiAoc2FtZVBhcmVudFJlZiAmJiAhc2FtZVJlZiAmJiAhTnVtYmVyLmlzTmFOKG9iaikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2FzTXV0YXRlZDogdHJ1ZSxcbiAgICAgIHBhdGhcbiAgICB9O1xuICB9XG4gIGlmIChpc0ltbXV0YWJsZShwcmV2T2JqKSB8fCBpc0ltbXV0YWJsZShvYmopKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhc011dGF0ZWQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjb25zdCBrZXlzVG9EZXRlY3QgPSB7fTtcbiAgZm9yIChsZXQga2V5IGluIHRyYWNrZWRQcm9wZXJ0eS5jaGlsZHJlbikge1xuICAgIGtleXNUb0RldGVjdFtrZXldID0gdHJ1ZTtcbiAgfVxuICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAga2V5c1RvRGV0ZWN0W2tleV0gPSB0cnVlO1xuICB9XG4gIGNvbnN0IGhhc0lnbm9yZWRQYXRocyA9IGlnbm9yZWRQYXRocy5sZW5ndGggPiAwO1xuICBmb3IgKGxldCBrZXkgaW4ga2V5c1RvRGV0ZWN0KSB7XG4gICAgY29uc3QgbmVzdGVkUGF0aCA9IHBhdGggPyBwYXRoICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgaWYgKGhhc0lnbm9yZWRQYXRocykge1xuICAgICAgY29uc3QgaGFzTWF0Y2hlcyA9IGlnbm9yZWRQYXRocy5zb21lKChpZ25vcmVkKSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVkIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgcmV0dXJuIGlnbm9yZWQudGVzdChuZXN0ZWRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVzdGVkUGF0aCA9PT0gaWdub3JlZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGhhc01hdGNoZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzLCB0cmFja2VkUHJvcGVydHkuY2hpbGRyZW5ba2V5XSwgb2JqW2tleV0sIHNhbWVSZWYsIG5lc3RlZFBhdGgpO1xuICAgIGlmIChyZXN1bHQud2FzTXV0YXRlZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3YXNNdXRhdGVkOiBmYWxzZVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKG9wdGlvbnMgPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiBuZXh0KGFjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHN0cmluZ2lmeTIgPSBmdW5jdGlvbihvYmosIHNlcmlhbGl6ZXIsIGluZGVudCwgZGVjeWNsZXIpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIGdldFNlcmlhbGl6ZTIoc2VyaWFsaXplciwgZGVjeWNsZXIpLCBpbmRlbnQpO1xuICAgIH0sIGdldFNlcmlhbGl6ZTIgPSBmdW5jdGlvbihzZXJpYWxpemVyLCBkZWN5Y2xlcikge1xuICAgICAgbGV0IHN0YWNrID0gW10sIGtleXMgPSBbXTtcbiAgICAgIGlmICghZGVjeWNsZXIpIGRlY3ljbGVyID0gZnVuY3Rpb24oXywgdmFsdWUpIHtcbiAgICAgICAgaWYgKHN0YWNrWzBdID09PSB2YWx1ZSkgcmV0dXJuIFwiW0NpcmN1bGFyIH5dXCI7XG4gICAgICAgIHJldHVybiBcIltDaXJjdWxhciB+LlwiICsga2V5cy5zbGljZSgwLCBzdGFjay5pbmRleE9mKHZhbHVlKSkuam9pbihcIi5cIikgKyBcIl1cIjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciB0aGlzUG9zID0gc3RhY2suaW5kZXhPZih0aGlzKTtcbiAgICAgICAgICB+dGhpc1BvcyA/IHN0YWNrLnNwbGljZSh0aGlzUG9zICsgMSkgOiBzdGFjay5wdXNoKHRoaXMpO1xuICAgICAgICAgIH50aGlzUG9zID8ga2V5cy5zcGxpY2UodGhpc1BvcywgSW5maW5pdHksIGtleSkgOiBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICBpZiAofnN0YWNrLmluZGV4T2YodmFsdWUpKSB2YWx1ZSA9IGRlY3ljbGVyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBzdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIgPT0gbnVsbCA/IHZhbHVlIDogc2VyaWFsaXplci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBzdHJpbmdpZnkgPSBzdHJpbmdpZnkyLCBnZXRTZXJpYWxpemUgPSBnZXRTZXJpYWxpemUyO1xuICAgIGxldCB7XG4gICAgICBpc0ltbXV0YWJsZSA9IGlzSW1tdXRhYmxlRGVmYXVsdCxcbiAgICAgIGlnbm9yZWRQYXRocyxcbiAgICAgIHdhcm5BZnRlciA9IDMyXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgdHJhY2sgPSB0cmFja0Zvck11dGF0aW9ucy5iaW5kKG51bGwsIGlzSW1tdXRhYmxlLCBpZ25vcmVkUGF0aHMpO1xuICAgIHJldHVybiAoe1xuICAgICAgZ2V0U3RhdGVcbiAgICB9KSA9PiB7XG4gICAgICBsZXQgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgbGV0IHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgcmV0dXJuIChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lYXN1cmVVdGlscyA9IGdldFRpbWVNZWFzdXJlVXRpbHMod2FybkFmdGVyLCBcIkltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZVwiKTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgcmVzdWx0ID0gdHJhY2tlci5kZXRlY3RNdXRhdGlvbnMoKTtcbiAgICAgICAgICB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xuICAgICAgICAgIGlmIChyZXN1bHQud2FzTXV0YXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTkpIDogYEEgc3RhdGUgbXV0YXRpb24gd2FzIGRldGVjdGVkIGJldHdlZW4gZGlzcGF0Y2hlcywgaW4gdGhlIHBhdGggJyR7cmVzdWx0LnBhdGggfHwgXCJcIn0nLiAgVGhpcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yLiAoaHR0cHM6Ly9yZWR1eC5qcy5vcmcvc3R5bGUtZ3VpZGUvc3R5bGUtZ3VpZGUjZG8tbm90LW11dGF0ZS1zdGF0ZSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkaXNwYXRjaGVkQWN0aW9uID0gbmV4dChhY3Rpb24pO1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICByZXN1bHQgPSB0cmFja2VyLmRldGVjdE11dGF0aW9ucygpO1xuICAgICAgICAgIHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC53YXNNdXRhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMCkgOiBgQSBzdGF0ZSBtdXRhdGlvbiB3YXMgZGV0ZWN0ZWQgaW5zaWRlIGEgZGlzcGF0Y2gsIGluIHRoZSBwYXRoOiAke3Jlc3VsdC5wYXRoIHx8IFwiXCJ9LiBUYWtlIGEgbG9vayBhdCB0aGUgcmVkdWNlcihzKSBoYW5kbGluZyB0aGUgYWN0aW9uICR7c3RyaW5naWZ5MihhY3Rpb24pfS4gKGh0dHBzOi8vcmVkdXguanMub3JnL3N0eWxlLWd1aWRlL3N0eWxlLWd1aWRlI2RvLW5vdC1tdXRhdGUtc3RhdGUpYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLndhcm5JZkV4Y2VlZGVkKCk7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaGVkQWN0aW9uO1xuICAgICAgfTtcbiAgICB9O1xuICB9XG59XG5cbi8vIHNyYy9zZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGlzUGxhaW4odmFsKSB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICByZXR1cm4gdmFsID09IG51bGwgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlID09PSBcIm51bWJlclwiIHx8IEFycmF5LmlzQXJyYXkodmFsKSB8fCBpc1BsYWluT2JqZWN0KHZhbCk7XG59XG5mdW5jdGlvbiBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUodmFsdWUsIHBhdGggPSBcIlwiLCBpc1NlcmlhbGl6YWJsZSA9IGlzUGxhaW4sIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocyA9IFtdLCBjYWNoZSkge1xuICBsZXQgZm91bmROZXN0ZWRTZXJpYWxpemFibGU7XG4gIGlmICghaXNTZXJpYWxpemFibGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleVBhdGg6IHBhdGggfHwgXCI8cm9vdD5cIixcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChjYWNoZT8uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBlbnRyaWVzID0gZ2V0RW50cmllcyAhPSBudWxsID8gZ2V0RW50cmllcyh2YWx1ZSkgOiBPYmplY3QuZW50cmllcyh2YWx1ZSk7XG4gIGNvbnN0IGhhc0lnbm9yZWRQYXRocyA9IGlnbm9yZWRQYXRocy5sZW5ndGggPiAwO1xuICBmb3IgKGNvbnN0IFtrZXksIG5lc3RlZFZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbmVzdGVkUGF0aCA9IHBhdGggPyBwYXRoICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgaWYgKGhhc0lnbm9yZWRQYXRocykge1xuICAgICAgY29uc3QgaGFzTWF0Y2hlcyA9IGlnbm9yZWRQYXRocy5zb21lKChpZ25vcmVkKSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVkIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgcmV0dXJuIGlnbm9yZWQudGVzdChuZXN0ZWRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVzdGVkUGF0aCA9PT0gaWdub3JlZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGhhc01hdGNoZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNTZXJpYWxpemFibGUobmVzdGVkVmFsdWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXlQYXRoOiBuZXN0ZWRQYXRoLFxuICAgICAgICB2YWx1ZTogbmVzdGVkVmFsdWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmVzdGVkVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlID0gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKG5lc3RlZFZhbHVlLCBuZXN0ZWRQYXRoLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzLCBjYWNoZSk7XG4gICAgICBpZiAoZm91bmROZXN0ZWRTZXJpYWxpemFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY2FjaGUgJiYgaXNOZXN0ZWRGcm96ZW4odmFsdWUpKSBjYWNoZS5hZGQodmFsdWUpO1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc05lc3RlZEZyb3plbih2YWx1ZSkge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBuZXN0ZWRWYWx1ZSBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgIGlmICh0eXBlb2YgbmVzdGVkVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgbmVzdGVkVmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgIGlmICghaXNOZXN0ZWRGcm96ZW4obmVzdGVkVmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUob3B0aW9ucyA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IG5leHQoYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7XG4gICAgICBpc1NlcmlhbGl6YWJsZSA9IGlzUGxhaW4sXG4gICAgICBnZXRFbnRyaWVzLFxuICAgICAgaWdub3JlZEFjdGlvbnMgPSBbXSxcbiAgICAgIGlnbm9yZWRBY3Rpb25QYXRocyA9IFtcIm1ldGEuYXJnXCIsIFwibWV0YS5iYXNlUXVlcnlNZXRhXCJdLFxuICAgICAgaWdub3JlZFBhdGhzID0gW10sXG4gICAgICB3YXJuQWZ0ZXIgPSAzMixcbiAgICAgIGlnbm9yZVN0YXRlID0gZmFsc2UsXG4gICAgICBpZ25vcmVBY3Rpb25zID0gZmFsc2UsXG4gICAgICBkaXNhYmxlQ2FjaGUgPSBmYWxzZVxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhY2hlID0gIWRpc2FibGVDYWNoZSAmJiBXZWFrU2V0ID8gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIChzdG9yZUFQSSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICAgIGlmICghaXNBY3Rpb24oYWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgY29uc3QgbWVhc3VyZVV0aWxzID0gZ2V0VGltZU1lYXN1cmVVdGlscyh3YXJuQWZ0ZXIsIFwiU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlXCIpO1xuICAgICAgaWYgKCFpZ25vcmVBY3Rpb25zICYmICEoaWdub3JlZEFjdGlvbnMubGVuZ3RoICYmIGlnbm9yZWRBY3Rpb25zLmluZGV4T2YoYWN0aW9uLnR5cGUpICE9PSAtMSkpIHtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlID0gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKGFjdGlvbiwgXCJcIiwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRBY3Rpb25QYXRocywgY2FjaGUpO1xuICAgICAgICAgIGlmIChmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGtleVBhdGgsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9ID0gZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEEgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZSB3YXMgZGV0ZWN0ZWQgaW4gYW4gYWN0aW9uLCBpbiB0aGUgcGF0aDogXFxgJHtrZXlQYXRofVxcYC4gVmFsdWU6YCwgdmFsdWUsIFwiXFxuVGFrZSBhIGxvb2sgYXQgdGhlIGxvZ2ljIHRoYXQgZGlzcGF0Y2hlZCB0aGlzIGFjdGlvbjogXCIsIGFjdGlvbiwgXCJcXG4oU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2ZhcS9hY3Rpb25zI3doeS1zaG91bGQtdHlwZS1iZS1hLXN0cmluZy1vci1hdC1sZWFzdC1zZXJpYWxpemFibGUtd2h5LXNob3VsZC1teS1hY3Rpb24tdHlwZXMtYmUtY29uc3RhbnRzKVwiLCBcIlxcbihUbyBhbGxvdyBub24tc2VyaWFsaXphYmxlIHZhbHVlcyBzZWU6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvdXNhZ2UvdXNhZ2UtZ3VpZGUjd29ya2luZy13aXRoLW5vbi1zZXJpYWxpemFibGUtZGF0YSlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghaWdub3JlU3RhdGUpIHtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlQVBJLmdldFN0YXRlKCk7XG4gICAgICAgICAgY29uc3QgZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlID0gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKHN0YXRlLCBcIlwiLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzLCBjYWNoZSk7XG4gICAgICAgICAgaWYgKGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBrZXlQYXRoLFxuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSA9IGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEEgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIHN0YXRlLCBpbiB0aGUgcGF0aDogXFxgJHtrZXlQYXRofVxcYC4gVmFsdWU6YCwgdmFsdWUsIGBcblRha2UgYSBsb29rIGF0IHRoZSByZWR1Y2VyKHMpIGhhbmRsaW5nIHRoaXMgYWN0aW9uIHR5cGU6ICR7YWN0aW9uLnR5cGV9LlxuKFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9mYXEvb3JnYW5pemluZy1zdGF0ZSNjYW4taS1wdXQtZnVuY3Rpb25zLXByb21pc2VzLW9yLW90aGVyLW5vbi1zZXJpYWxpemFibGUtaXRlbXMtaW4tbXktc3RvcmUtc3RhdGUpYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLndhcm5JZkV4Y2VlZGVkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cbn1cblxuLy8gc3JjL2dldERlZmF1bHRNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBpc0Jvb2xlYW4oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwiYm9vbGVhblwiO1xufVxudmFyIGJ1aWxkR2V0RGVmYXVsdE1pZGRsZXdhcmUgPSAoKSA9PiBmdW5jdGlvbiBnZXREZWZhdWx0TWlkZGxld2FyZShvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICB0aHVuayA9IHRydWUsXG4gICAgaW1tdXRhYmxlQ2hlY2sgPSB0cnVlLFxuICAgIHNlcmlhbGl6YWJsZUNoZWNrID0gdHJ1ZSxcbiAgICBhY3Rpb25DcmVhdG9yQ2hlY2sgPSB0cnVlXG4gIH0gPSBvcHRpb25zID8/IHt9O1xuICBsZXQgbWlkZGxld2FyZUFycmF5ID0gbmV3IFR1cGxlKCk7XG4gIGlmICh0aHVuaykge1xuICAgIGlmIChpc0Jvb2xlYW4odGh1bmspKSB7XG4gICAgICBtaWRkbGV3YXJlQXJyYXkucHVzaCh0aHVua01pZGRsZXdhcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaWRkbGV3YXJlQXJyYXkucHVzaCh3aXRoRXh0cmFBcmd1bWVudCh0aHVuay5leHRyYUFyZ3VtZW50KSk7XG4gICAgfVxuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoaW1tdXRhYmxlQ2hlY2spIHtcbiAgICAgIGxldCBpbW11dGFibGVPcHRpb25zID0ge307XG4gICAgICBpZiAoIWlzQm9vbGVhbihpbW11dGFibGVDaGVjaykpIHtcbiAgICAgICAgaW1tdXRhYmxlT3B0aW9ucyA9IGltbXV0YWJsZUNoZWNrO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZUFycmF5LnVuc2hpZnQoY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKGltbXV0YWJsZU9wdGlvbnMpKTtcbiAgICB9XG4gICAgaWYgKHNlcmlhbGl6YWJsZUNoZWNrKSB7XG4gICAgICBsZXQgc2VyaWFsaXphYmxlT3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKCFpc0Jvb2xlYW4oc2VyaWFsaXphYmxlQ2hlY2spKSB7XG4gICAgICAgIHNlcmlhbGl6YWJsZU9wdGlvbnMgPSBzZXJpYWxpemFibGVDaGVjaztcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKGNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShzZXJpYWxpemFibGVPcHRpb25zKSk7XG4gICAgfVxuICAgIGlmIChhY3Rpb25DcmVhdG9yQ2hlY2spIHtcbiAgICAgIGxldCBhY3Rpb25DcmVhdG9yT3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKCFpc0Jvb2xlYW4oYWN0aW9uQ3JlYXRvckNoZWNrKSkge1xuICAgICAgICBhY3Rpb25DcmVhdG9yT3B0aW9ucyA9IGFjdGlvbkNyZWF0b3JDaGVjaztcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVBcnJheS51bnNoaWZ0KGNyZWF0ZUFjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlKGFjdGlvbkNyZWF0b3JPcHRpb25zKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaWRkbGV3YXJlQXJyYXk7XG59O1xuXG4vLyBzcmMvYXV0b0JhdGNoRW5oYW5jZXIudHNcbnZhciBTSE9VTERfQVVUT0JBVENIID0gXCJSVEtfYXV0b0JhdGNoXCI7XG52YXIgcHJlcGFyZUF1dG9CYXRjaGVkID0gKCkgPT4gKHBheWxvYWQpID0+ICh7XG4gIHBheWxvYWQsXG4gIG1ldGE6IHtcbiAgICBbU0hPVUxEX0FVVE9CQVRDSF06IHRydWVcbiAgfVxufSk7XG52YXIgY3JlYXRlUXVldWVXaXRoVGltZXIgPSAodGltZW91dCkgPT4ge1xuICByZXR1cm4gKG5vdGlmeSkgPT4ge1xuICAgIHNldFRpbWVvdXQobm90aWZ5LCB0aW1lb3V0KTtcbiAgfTtcbn07XG52YXIgYXV0b0JhdGNoRW5oYW5jZXIgPSAob3B0aW9ucyA9IHtcbiAgdHlwZTogXCJyYWZcIlxufSkgPT4gKG5leHQpID0+ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHN0b3JlID0gbmV4dCguLi5hcmdzKTtcbiAgbGV0IG5vdGlmeWluZyA9IHRydWU7XG4gIGxldCBzaG91bGROb3RpZnlBdEVuZE9mVGljayA9IGZhbHNlO1xuICBsZXQgbm90aWZpY2F0aW9uUXVldWVkID0gZmFsc2U7XG4gIGNvbnN0IGxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0IHF1ZXVlQ2FsbGJhY2sgPSBvcHRpb25zLnR5cGUgPT09IFwidGlja1wiID8gcXVldWVNaWNyb3Rhc2sgOiBvcHRpb25zLnR5cGUgPT09IFwicmFmXCIgPyAoXG4gICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHdvbid0IGV4aXN0IGluIFNTUiBlbnZpcm9ubWVudHMuIEZhbGwgYmFjayB0byBhIHZhZ3VlIGFwcHJveGltYXRpb24ganVzdCB0byBrZWVwIGZyb20gZXJyb3JpbmcuXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA6IGNyZWF0ZVF1ZXVlV2l0aFRpbWVyKDEwKVxuICApIDogb3B0aW9ucy50eXBlID09PSBcImNhbGxiYWNrXCIgPyBvcHRpb25zLnF1ZXVlTm90aWZpY2F0aW9uIDogY3JlYXRlUXVldWVXaXRoVGltZXIob3B0aW9ucy50aW1lb3V0KTtcbiAgY29uc3Qgbm90aWZ5TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgIG5vdGlmaWNhdGlvblF1ZXVlZCA9IGZhbHNlO1xuICAgIGlmIChzaG91bGROb3RpZnlBdEVuZE9mVGljaykge1xuICAgICAgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSBmYWxzZTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChsKSA9PiBsKCkpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0b3JlLCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgYHN0b3JlLnN1YnNjcmliZWAgbWV0aG9kIHRvIGtlZXAgb3JpZ2luYWwgbGlzdGVuZXJzXG4gICAgLy8gZnJvbSBydW5uaW5nIGlmIHdlJ3JlIGRlbGF5aW5nIG5vdGlmaWNhdGlvbnNcbiAgICBzdWJzY3JpYmUobGlzdGVuZXIyKSB7XG4gICAgICBjb25zdCB3cmFwcGVkTGlzdGVuZXIgPSAoKSA9PiBub3RpZnlpbmcgJiYgbGlzdGVuZXIyKCk7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN0b3JlLnN1YnNjcmliZSh3cmFwcGVkTGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcjIpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcjIpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGBzdG9yZS5kaXNwYXRjaGAgbWV0aG9kIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGFjdGlvbnNcbiAgICAvLyBmb3IgdGhlIGBzaG91bGRBdXRvQmF0Y2hgIGZsYWcgYW5kIGRldGVybWluZSBpZiBiYXRjaGluZyBpcyBhY3RpdmVcbiAgICBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5vdGlmeWluZyA9ICFhY3Rpb24/Lm1ldGE/LltTSE9VTERfQVVUT0JBVENIXTtcbiAgICAgICAgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSAhbm90aWZ5aW5nO1xuICAgICAgICBpZiAoc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2spIHtcbiAgICAgICAgICBpZiAoIW5vdGlmaWNhdGlvblF1ZXVlZCkge1xuICAgICAgICAgICAgbm90aWZpY2F0aW9uUXVldWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHF1ZXVlQ2FsbGJhY2sobm90aWZ5TGlzdGVuZXJzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoKGFjdGlvbik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBub3RpZnlpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vLyBzcmMvZ2V0RGVmYXVsdEVuaGFuY2Vycy50c1xudmFyIGJ1aWxkR2V0RGVmYXVsdEVuaGFuY2VycyA9IChtaWRkbGV3YXJlRW5oYW5jZXIpID0+IGZ1bmN0aW9uIGdldERlZmF1bHRFbmhhbmNlcnMob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgYXV0b0JhdGNoID0gdHJ1ZVxuICB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgbGV0IGVuaGFuY2VyQXJyYXkgPSBuZXcgVHVwbGUobWlkZGxld2FyZUVuaGFuY2VyKTtcbiAgaWYgKGF1dG9CYXRjaCkge1xuICAgIGVuaGFuY2VyQXJyYXkucHVzaChhdXRvQmF0Y2hFbmhhbmNlcih0eXBlb2YgYXV0b0JhdGNoID09PSBcIm9iamVjdFwiID8gYXV0b0JhdGNoIDogdm9pZCAwKSk7XG4gIH1cbiAgcmV0dXJuIGVuaGFuY2VyQXJyYXk7XG59O1xuXG4vLyBzcmMvY29uZmlndXJlU3RvcmUudHNcbmZ1bmN0aW9uIGNvbmZpZ3VyZVN0b3JlKG9wdGlvbnMpIHtcbiAgY29uc3QgZ2V0RGVmYXVsdE1pZGRsZXdhcmUgPSBidWlsZEdldERlZmF1bHRNaWRkbGV3YXJlKCk7XG4gIGNvbnN0IHtcbiAgICByZWR1Y2VyID0gdm9pZCAwLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgZGV2VG9vbHMgPSB0cnVlLFxuICAgIGR1cGxpY2F0ZU1pZGRsZXdhcmVDaGVjayA9IHRydWUsXG4gICAgcHJlbG9hZGVkU3RhdGUgPSB2b2lkIDAsXG4gICAgZW5oYW5jZXJzID0gdm9pZCAwXG4gIH0gPSBvcHRpb25zIHx8IHt9O1xuICBsZXQgcm9vdFJlZHVjZXI7XG4gIGlmICh0eXBlb2YgcmVkdWNlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcm9vdFJlZHVjZXIgPSByZWR1Y2VyO1xuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QocmVkdWNlcikpIHtcbiAgICByb290UmVkdWNlciA9IGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VyKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiYHJlZHVjZXJgIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQsIGFuZCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0IG9mIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gY29tYmluZVJlZHVjZXJzXCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgbWlkZGxld2FyZSAmJiB0eXBlb2YgbWlkZGxld2FyZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcImBtaWRkbGV3YXJlYCBmaWVsZCBtdXN0IGJlIGEgY2FsbGJhY2tcIik7XG4gIH1cbiAgbGV0IGZpbmFsTWlkZGxld2FyZTtcbiAgaWYgKHR5cGVvZiBtaWRkbGV3YXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBmaW5hbE1pZGRsZXdhcmUgPSBtaWRkbGV3YXJlKGdldERlZmF1bHRNaWRkbGV3YXJlKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFBcnJheS5pc0FycmF5KGZpbmFsTWlkZGxld2FyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMpIDogXCJ3aGVuIHVzaW5nIGEgbWlkZGxld2FyZSBidWlsZGVyIGZ1bmN0aW9uLCBhbiBhcnJheSBvZiBtaWRkbGV3YXJlIG11c3QgYmUgcmV0dXJuZWRcIik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZpbmFsTWlkZGxld2FyZSA9IGdldERlZmF1bHRNaWRkbGV3YXJlKCk7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBmaW5hbE1pZGRsZXdhcmUuc29tZSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gIT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiZWFjaCBtaWRkbGV3YXJlIHByb3ZpZGVkIHRvIGNvbmZpZ3VyZVN0b3JlIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGR1cGxpY2F0ZU1pZGRsZXdhcmVDaGVjaykge1xuICAgIGxldCBtaWRkbGV3YXJlUmVmZXJlbmNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgZmluYWxNaWRkbGV3YXJlLmZvckVhY2goKG1pZGRsZXdhcmUyKSA9PiB7XG4gICAgICBpZiAobWlkZGxld2FyZVJlZmVyZW5jZXMuaGFzKG1pZGRsZXdhcmUyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0MikgOiBcIkR1cGxpY2F0ZSBtaWRkbGV3YXJlIHJlZmVyZW5jZXMgZm91bmQgd2hlbiBjcmVhdGluZyB0aGUgc3RvcmUuIEVuc3VyZSB0aGF0IGVhY2ggbWlkZGxld2FyZSBpcyBvbmx5IGluY2x1ZGVkIG9uY2UuXCIpO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZVJlZmVyZW5jZXMuYWRkKG1pZGRsZXdhcmUyKTtcbiAgICB9KTtcbiAgfVxuICBsZXQgZmluYWxDb21wb3NlID0gY29tcG9zZTtcbiAgaWYgKGRldlRvb2xzKSB7XG4gICAgZmluYWxDb21wb3NlID0gY29tcG9zZVdpdGhEZXZUb29scyh7XG4gICAgICAvLyBFbmFibGUgY2FwdHVyZSBvZiBzdGFjayB0cmFjZXMgZm9yIGRpc3BhdGNoZWQgUmVkdXggYWN0aW9uc1xuICAgICAgdHJhY2U6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIixcbiAgICAgIC4uLnR5cGVvZiBkZXZUb29scyA9PT0gXCJvYmplY3RcIiAmJiBkZXZUb29sc1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IG1pZGRsZXdhcmVFbmhhbmNlciA9IGFwcGx5TWlkZGxld2FyZSguLi5maW5hbE1pZGRsZXdhcmUpO1xuICBjb25zdCBnZXREZWZhdWx0RW5oYW5jZXJzID0gYnVpbGRHZXREZWZhdWx0RW5oYW5jZXJzKG1pZGRsZXdhcmVFbmhhbmNlcik7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZW5oYW5jZXJzICYmIHR5cGVvZiBlbmhhbmNlcnMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogXCJgZW5oYW5jZXJzYCBmaWVsZCBtdXN0IGJlIGEgY2FsbGJhY2tcIik7XG4gIH1cbiAgbGV0IHN0b3JlRW5oYW5jZXJzID0gdHlwZW9mIGVuaGFuY2VycyA9PT0gXCJmdW5jdGlvblwiID8gZW5oYW5jZXJzKGdldERlZmF1bHRFbmhhbmNlcnMpIDogZ2V0RGVmYXVsdEVuaGFuY2VycygpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFBcnJheS5pc0FycmF5KHN0b3JlRW5oYW5jZXJzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogXCJgZW5oYW5jZXJzYCBjYWxsYmFjayBtdXN0IHJldHVybiBhbiBhcnJheVwiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIHN0b3JlRW5oYW5jZXJzLnNvbWUoKGl0ZW0pID0+IHR5cGVvZiBpdGVtICE9PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBcImVhY2ggZW5oYW5jZXIgcHJvdmlkZWQgdG8gY29uZmlndXJlU3RvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZmluYWxNaWRkbGV3YXJlLmxlbmd0aCAmJiAhc3RvcmVFbmhhbmNlcnMuaW5jbHVkZXMobWlkZGxld2FyZUVuaGFuY2VyKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJtaWRkbGV3YXJlcyB3ZXJlIHByb3ZpZGVkLCBidXQgbWlkZGxld2FyZSBlbmhhbmNlciB3YXMgbm90IGluY2x1ZGVkIGluIGZpbmFsIGVuaGFuY2VycyAtIG1ha2Ugc3VyZSB0byBjYWxsIGBnZXREZWZhdWx0RW5oYW5jZXJzYFwiKTtcbiAgfVxuICBjb25zdCBjb21wb3NlZEVuaGFuY2VyID0gZmluYWxDb21wb3NlKC4uLnN0b3JlRW5oYW5jZXJzKTtcbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKHJvb3RSZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgY29tcG9zZWRFbmhhbmNlcik7XG59XG5cbi8vIHNyYy9tYXBCdWlsZGVycy50c1xuZnVuY3Rpb24gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2soYnVpbGRlckNhbGxiYWNrKSB7XG4gIGNvbnN0IGFjdGlvbnNNYXAgPSB7fTtcbiAgY29uc3QgYWN0aW9uTWF0Y2hlcnMgPSBbXTtcbiAgbGV0IGRlZmF1bHRDYXNlUmVkdWNlcjtcbiAgY29uc3QgYnVpbGRlciA9IHtcbiAgICBhZGRDYXNlKHR5cGVPckFjdGlvbkNyZWF0b3IsIHJlZHVjZXIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGFjdGlvbk1hdGNoZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNikgOiBcImBidWlsZGVyLmFkZENhc2VgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGRNYXRjaGVyYFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjcpIDogXCJgYnVpbGRlci5hZGRDYXNlYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYGJ1aWxkZXIuYWRkRGVmYXVsdENhc2VgXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHR5cGVPckFjdGlvbkNyZWF0b3IgPT09IFwic3RyaW5nXCIgPyB0eXBlT3JBY3Rpb25DcmVhdG9yIDogdHlwZU9yQWN0aW9uQ3JlYXRvci50eXBlO1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI4KSA6IFwiYGJ1aWxkZXIuYWRkQ2FzZWAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGFjdGlvbiB0eXBlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgaW4gYWN0aW9uc01hcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyOSkgOiBgXFxgYnVpbGRlci5hZGRDYXNlXFxgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCB0d28gcmVkdWNlcnMgZm9yIHRoZSBzYW1lIGFjdGlvbiB0eXBlICcke3R5cGV9J2ApO1xuICAgICAgfVxuICAgICAgYWN0aW9uc01hcFt0eXBlXSA9IHJlZHVjZXI7XG4gICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9LFxuICAgIGFkZEFzeW5jVGh1bmsoYXN5bmNUaHVuaywgcmVkdWNlcnMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQzKSA6IFwiYGJ1aWxkZXIuYWRkQXN5bmNUaHVua2Agc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlZHVjZXJzLnBlbmRpbmcpIGFjdGlvbnNNYXBbYXN5bmNUaHVuay5wZW5kaW5nLnR5cGVdID0gcmVkdWNlcnMucGVuZGluZztcbiAgICAgIGlmIChyZWR1Y2Vycy5yZWplY3RlZCkgYWN0aW9uc01hcFthc3luY1RodW5rLnJlamVjdGVkLnR5cGVdID0gcmVkdWNlcnMucmVqZWN0ZWQ7XG4gICAgICBpZiAocmVkdWNlcnMuZnVsZmlsbGVkKSBhY3Rpb25zTWFwW2FzeW5jVGh1bmsuZnVsZmlsbGVkLnR5cGVdID0gcmVkdWNlcnMuZnVsZmlsbGVkO1xuICAgICAgaWYgKHJlZHVjZXJzLnNldHRsZWQpIGFjdGlvbk1hdGNoZXJzLnB1c2goe1xuICAgICAgICBtYXRjaGVyOiBhc3luY1RodW5rLnNldHRsZWQsXG4gICAgICAgIHJlZHVjZXI6IHJlZHVjZXJzLnNldHRsZWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGRNYXRjaGVyKG1hdGNoZXIsIHJlZHVjZXIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMwKSA6IFwiYGJ1aWxkZXIuYWRkTWF0Y2hlcmAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWN0aW9uTWF0Y2hlcnMucHVzaCh7XG4gICAgICAgIG1hdGNoZXIsXG4gICAgICAgIHJlZHVjZXJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGREZWZhdWx0Q2FzZShyZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMSkgOiBcImBidWlsZGVyLmFkZERlZmF1bHRDYXNlYCBjYW4gb25seSBiZSBjYWxsZWQgb25jZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVmYXVsdENhc2VSZWR1Y2VyID0gcmVkdWNlcjtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH1cbiAgfTtcbiAgYnVpbGRlckNhbGxiYWNrKGJ1aWxkZXIpO1xuICByZXR1cm4gW2FjdGlvbnNNYXAsIGFjdGlvbk1hdGNoZXJzLCBkZWZhdWx0Q2FzZVJlZHVjZXJdO1xufVxuXG4vLyBzcmMvY3JlYXRlUmVkdWNlci50c1xuc2V0VXNlU3RyaWN0SXRlcmF0aW9uKGZhbHNlKTtcbmZ1bmN0aW9uIGlzU3RhdGVGdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVkdWNlcihpbml0aWFsU3RhdGUsIG1hcE9yQnVpbGRlckNhbGxiYWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAodHlwZW9mIG1hcE9yQnVpbGRlckNhbGxiYWNrID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg4KSA6IFwiVGhlIG9iamVjdCBub3RhdGlvbiBmb3IgYGNyZWF0ZVJlZHVjZXJgIGhhcyBiZWVuIHJlbW92ZWQuIFBsZWFzZSB1c2UgdGhlICdidWlsZGVyIGNhbGxiYWNrJyBub3RhdGlvbiBpbnN0ZWFkOiBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL2FwaS9jcmVhdGVSZWR1Y2VyXCIpO1xuICAgIH1cbiAgfVxuICBsZXQgW2FjdGlvbnNNYXAsIGZpbmFsQWN0aW9uTWF0Y2hlcnMsIGZpbmFsRGVmYXVsdENhc2VSZWR1Y2VyXSA9IGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKG1hcE9yQnVpbGRlckNhbGxiYWNrKTtcbiAgbGV0IGdldEluaXRpYWxTdGF0ZTtcbiAgaWYgKGlzU3RhdGVGdW5jdGlvbihpbml0aWFsU3RhdGUpKSB7XG4gICAgZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4gZnJlZXplRHJhZnRhYmxlKGluaXRpYWxTdGF0ZSgpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmcm96ZW5Jbml0aWFsU3RhdGUgPSBmcmVlemVEcmFmdGFibGUoaW5pdGlhbFN0YXRlKTtcbiAgICBnZXRJbml0aWFsU3RhdGUgPSAoKSA9PiBmcm96ZW5Jbml0aWFsU3RhdGU7XG4gIH1cbiAgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZSA9IGdldEluaXRpYWxTdGF0ZSgpLCBhY3Rpb24pIHtcbiAgICBsZXQgY2FzZVJlZHVjZXJzID0gW2FjdGlvbnNNYXBbYWN0aW9uLnR5cGVdLCAuLi5maW5hbEFjdGlvbk1hdGNoZXJzLmZpbHRlcigoe1xuICAgICAgbWF0Y2hlclxuICAgIH0pID0+IG1hdGNoZXIoYWN0aW9uKSkubWFwKCh7XG4gICAgICByZWR1Y2VyOiByZWR1Y2VyMlxuICAgIH0pID0+IHJlZHVjZXIyKV07XG4gICAgaWYgKGNhc2VSZWR1Y2Vycy5maWx0ZXIoKGNyKSA9PiAhIWNyKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhc2VSZWR1Y2VycyA9IFtmaW5hbERlZmF1bHRDYXNlUmVkdWNlcl07XG4gICAgfVxuICAgIHJldHVybiBjYXNlUmVkdWNlcnMucmVkdWNlKChwcmV2aW91c1N0YXRlLCBjYXNlUmVkdWNlcikgPT4ge1xuICAgICAgaWYgKGNhc2VSZWR1Y2VyKSB7XG4gICAgICAgIGlmIChpc0RyYWZ0KHByZXZpb3VzU3RhdGUpKSB7XG4gICAgICAgICAgY29uc3QgZHJhZnQgPSBwcmV2aW91c1N0YXRlO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc2VSZWR1Y2VyKGRyYWZ0LCBhY3Rpb24pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzRHJhZnRhYmxlKHByZXZpb3VzU3RhdGUpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FzZVJlZHVjZXIocHJldmlvdXNTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1N0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJBIGNhc2UgcmVkdWNlciBvbiBhIG5vbi1kcmFmdGFibGUgdmFsdWUgbXVzdCBub3QgcmV0dXJuIHVuZGVmaW5lZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcHJvZHVjZShwcmV2aW91c1N0YXRlLCAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYXNlUmVkdWNlcihkcmFmdCwgYWN0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgfSwgc3RhdGUpO1xuICB9XG4gIHJlZHVjZXIuZ2V0SW5pdGlhbFN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlO1xuICByZXR1cm4gcmVkdWNlcjtcbn1cblxuLy8gc3JjL21hdGNoZXJzLnRzXG52YXIgbWF0Y2hlcyA9IChtYXRjaGVyLCBhY3Rpb24pID0+IHtcbiAgaWYgKGhhc01hdGNoRnVuY3Rpb24obWF0Y2hlcikpIHtcbiAgICByZXR1cm4gbWF0Y2hlci5tYXRjaChhY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBtYXRjaGVyKGFjdGlvbik7XG4gIH1cbn07XG5mdW5jdGlvbiBpc0FueU9mKC4uLm1hdGNoZXJzKSB7XG4gIHJldHVybiAoYWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuIG1hdGNoZXJzLnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoZXMobWF0Y2hlciwgYWN0aW9uKSk7XG4gIH07XG59XG5mdW5jdGlvbiBpc0FsbE9mKC4uLm1hdGNoZXJzKSB7XG4gIHJldHVybiAoYWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuIG1hdGNoZXJzLmV2ZXJ5KChtYXRjaGVyKSA9PiBtYXRjaGVzKG1hdGNoZXIsIGFjdGlvbikpO1xuICB9O1xufVxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCB2YWxpZFN0YXR1cykge1xuICBpZiAoIWFjdGlvbiB8fCAhYWN0aW9uLm1ldGEpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaGFzVmFsaWRSZXF1ZXN0SWQgPSB0eXBlb2YgYWN0aW9uLm1ldGEucmVxdWVzdElkID09PSBcInN0cmluZ1wiO1xuICBjb25zdCBoYXNWYWxpZFJlcXVlc3RTdGF0dXMgPSB2YWxpZFN0YXR1cy5pbmRleE9mKGFjdGlvbi5tZXRhLnJlcXVlc3RTdGF0dXMpID4gLTE7XG4gIHJldHVybiBoYXNWYWxpZFJlcXVlc3RJZCAmJiBoYXNWYWxpZFJlcXVlc3RTdGF0dXM7XG59XG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtBcnJheShhKSB7XG4gIHJldHVybiB0eXBlb2YgYVswXSA9PT0gXCJmdW5jdGlvblwiICYmIFwicGVuZGluZ1wiIGluIGFbMF0gJiYgXCJmdWxmaWxsZWRcIiBpbiBhWzBdICYmIFwicmVqZWN0ZWRcIiBpbiBhWzBdO1xufVxuZnVuY3Rpb24gaXNQZW5kaW5nKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJwZW5kaW5nXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc1BlbmRpbmcoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MubWFwKChhc3luY1RodW5rKSA9PiBhc3luY1RodW5rLnBlbmRpbmcpKTtcbn1cbmZ1bmN0aW9uIGlzUmVqZWN0ZWQoLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcInJlamVjdGVkXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc1JlamVjdGVkKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLm1hcCgoYXN5bmNUaHVuaykgPT4gYXN5bmNUaHVuay5yZWplY3RlZCkpO1xufVxuZnVuY3Rpb24gaXNSZWplY3RlZFdpdGhWYWx1ZSguLi5hc3luY1RodW5rcykge1xuICBjb25zdCBoYXNGbGFnID0gKGFjdGlvbikgPT4ge1xuICAgIHJldHVybiBhY3Rpb24gJiYgYWN0aW9uLm1ldGEgJiYgYWN0aW9uLm1ldGEucmVqZWN0ZWRXaXRoVmFsdWU7XG4gIH07XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaXNBbGxPZihpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNSZWplY3RlZFdpdGhWYWx1ZSgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbGxPZihpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XG59XG5mdW5jdGlvbiBpc0Z1bGZpbGxlZCguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wiZnVsZmlsbGVkXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc0Z1bGZpbGxlZCgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5tYXAoKGFzeW5jVGh1bmspID0+IGFzeW5jVGh1bmsuZnVsZmlsbGVkKSk7XG59XG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtBY3Rpb24oLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcInBlbmRpbmdcIiwgXCJmdWxmaWxsZWRcIiwgXCJyZWplY3RlZFwiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNBc3luY1RodW5rQWN0aW9uKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLmZsYXRNYXAoKGFzeW5jVGh1bmspID0+IFthc3luY1RodW5rLnBlbmRpbmcsIGFzeW5jVGh1bmsucmVqZWN0ZWQsIGFzeW5jVGh1bmsuZnVsZmlsbGVkXSkpO1xufVxuXG4vLyBzcmMvbmFub2lkLnRzXG52YXIgdXJsQWxwaGFiZXQgPSBcIk1vZHVsZVN5bWJoYXNPd25Qci0wMTIzNDU2Nzg5QUJDREVGR0hOUlZmZ2N0aVV2el9LcVlUSmtMeHBaWElqUVdcIjtcbnZhciBuYW5vaWQgPSAoc2l6ZSA9IDIxKSA9PiB7XG4gIGxldCBpZCA9IFwiXCI7XG4gIGxldCBpID0gc2l6ZTtcbiAgd2hpbGUgKGktLSkge1xuICAgIGlkICs9IHVybEFscGhhYmV0W01hdGgucmFuZG9tKCkgKiA2NCB8IDBdO1xuICB9XG4gIHJldHVybiBpZDtcbn07XG5cbi8vIHNyYy9jcmVhdGVBc3luY1RodW5rLnRzXG52YXIgY29tbW9uUHJvcGVydGllcyA9IFtcIm5hbWVcIiwgXCJtZXNzYWdlXCIsIFwic3RhY2tcIiwgXCJjb2RlXCJdO1xudmFyIFJlamVjdFdpdGhWYWx1ZSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IocGF5bG9hZCwgbWV0YSkge1xuICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgfVxuICAvKlxuICB0eXBlLW9ubHkgcHJvcGVydHkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBSZWplY3RXaXRoVmFsdWUgYW5kIEZ1bGZpbGxXaXRoTWV0YVxuICBkb2VzIG5vdCBleGlzdCBhdCBydW50aW1lXG4gICovXG4gIF90eXBlO1xufTtcbnZhciBGdWxmaWxsV2l0aE1ldGEgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHBheWxvYWQsIG1ldGEpIHtcbiAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gIH1cbiAgLypcbiAgdHlwZS1vbmx5IHByb3BlcnR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gUmVqZWN0V2l0aFZhbHVlIGFuZCBGdWxmaWxsV2l0aE1ldGFcbiAgZG9lcyBub3QgZXhpc3QgYXQgcnVudGltZVxuICAqL1xuICBfdHlwZTtcbn07XG52YXIgbWluaVNlcmlhbGl6ZUVycm9yID0gKHZhbHVlKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzaW1wbGVFcnJvciA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgY29tbW9uUHJvcGVydGllcykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZVtwcm9wZXJ0eV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgc2ltcGxlRXJyb3JbcHJvcGVydHldID0gdmFsdWVbcHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2ltcGxlRXJyb3I7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBTdHJpbmcodmFsdWUpXG4gIH07XG59O1xudmFyIGV4dGVybmFsQWJvcnRNZXNzYWdlID0gXCJFeHRlcm5hbCBzaWduYWwgd2FzIGFib3J0ZWRcIjtcbnZhciBjcmVhdGVBc3luY1RodW5rID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB7XG4gIGZ1bmN0aW9uIGNyZWF0ZUFzeW5jVGh1bmsyKHR5cGVQcmVmaXgsIHBheWxvYWRDcmVhdG9yLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZnVsZmlsbGVkID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9mdWxmaWxsZWRcIiwgKHBheWxvYWQsIHJlcXVlc3RJZCwgYXJnLCBtZXRhKSA9PiAoe1xuICAgICAgcGF5bG9hZCxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4ubWV0YSB8fCB7fSxcbiAgICAgICAgYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHJlcXVlc3RTdGF0dXM6IFwiZnVsZmlsbGVkXCJcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgY29uc3QgcGVuZGluZyA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvcGVuZGluZ1wiLCAocmVxdWVzdElkLCBhcmcsIG1ldGEpID0+ICh7XG4gICAgICBwYXlsb2FkOiB2b2lkIDAsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLm1ldGEgfHwge30sXG4gICAgICAgIGFyZyxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZXF1ZXN0U3RhdHVzOiBcInBlbmRpbmdcIlxuICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCByZWplY3RlZCA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvcmVqZWN0ZWRcIiwgKGVycm9yLCByZXF1ZXN0SWQsIGFyZywgcGF5bG9hZCwgbWV0YSkgPT4gKHtcbiAgICAgIHBheWxvYWQsXG4gICAgICBlcnJvcjogKG9wdGlvbnMgJiYgb3B0aW9ucy5zZXJpYWxpemVFcnJvciB8fCBtaW5pU2VyaWFsaXplRXJyb3IpKGVycm9yIHx8IFwiUmVqZWN0ZWRcIiksXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLm1ldGEgfHwge30sXG4gICAgICAgIGFyZyxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZWplY3RlZFdpdGhWYWx1ZTogISFwYXlsb2FkLFxuICAgICAgICByZXF1ZXN0U3RhdHVzOiBcInJlamVjdGVkXCIsXG4gICAgICAgIGFib3J0ZWQ6IGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIixcbiAgICAgICAgY29uZGl0aW9uOiBlcnJvcj8ubmFtZSA9PT0gXCJDb25kaXRpb25FcnJvclwiXG4gICAgICB9XG4gICAgfSkpO1xuICAgIGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoYXJnLCB7XG4gICAgICBzaWduYWxcbiAgICB9ID0ge30pIHtcbiAgICAgIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYSkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBvcHRpb25zPy5pZEdlbmVyYXRvciA/IG9wdGlvbnMuaWRHZW5lcmF0b3IoYXJnKSA6IG5hbm9pZCgpO1xuICAgICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGxldCBhYm9ydEhhbmRsZXI7XG4gICAgICAgIGxldCBhYm9ydFJlYXNvbjtcbiAgICAgICAgZnVuY3Rpb24gYWJvcnQocmVhc29uKSB7XG4gICAgICAgICAgYWJvcnRSZWFzb24gPSByZWFzb247XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgYWJvcnQoZXh0ZXJuYWxBYm9ydE1lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IGFib3J0KGV4dGVybmFsQWJvcnRNZXNzYWdlKSwge1xuICAgICAgICAgICAgICBvbmNlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxldCBmaW5hbEFjdGlvbjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGNvbmRpdGlvblJlc3VsdCA9IG9wdGlvbnM/LmNvbmRpdGlvbj8uKGFyZywge1xuICAgICAgICAgICAgICBnZXRTdGF0ZSxcbiAgICAgICAgICAgICAgZXh0cmFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGlzVGhlbmFibGUoY29uZGl0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgPSBhd2FpdCBjb25kaXRpb25SZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uUmVzdWx0ID09PSBmYWxzZSB8fCBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29uZGl0aW9uRXJyb3JcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkFib3J0ZWQgZHVlIHRvIGNvbmRpdGlvbiBjYWxsYmFjayByZXR1cm5pbmcgZmFsc2UuXCJcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFib3J0ZWRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBhYm9ydEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQWJvcnRFcnJvclwiLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYWJvcnRSZWFzb24gfHwgXCJBYm9ydGVkXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRIYW5kbGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGlzcGF0Y2gocGVuZGluZyhyZXF1ZXN0SWQsIGFyZywgb3B0aW9ucz8uZ2V0UGVuZGluZ01ldGE/Lih7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGdldFN0YXRlLFxuICAgICAgICAgICAgICBleHRyYVxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gYXdhaXQgUHJvbWlzZS5yYWNlKFthYm9ydGVkUHJvbWlzZSwgUHJvbWlzZS5yZXNvbHZlKHBheWxvYWRDcmVhdG9yKGFyZywge1xuICAgICAgICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgICAgICAgIGV4dHJhLFxuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgYWJvcnQsXG4gICAgICAgICAgICAgIHJlamVjdFdpdGhWYWx1ZTogKHZhbHVlLCBtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWplY3RXaXRoVmFsdWUodmFsdWUsIG1ldGEpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdWxmaWxsV2l0aFZhbHVlOiAodmFsdWUsIG1ldGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bGZpbGxXaXRoTWV0YSh2YWx1ZSwgbWV0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlamVjdFdpdGhWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRnVsZmlsbFdpdGhNZXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bGZpbGxlZChyZXN1bHQucGF5bG9hZCwgcmVxdWVzdElkLCBhcmcsIHJlc3VsdC5tZXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZnVsZmlsbGVkKHJlc3VsdCwgcmVxdWVzdElkLCBhcmcpO1xuICAgICAgICAgICAgfSldKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gZXJyIGluc3RhbmNlb2YgUmVqZWN0V2l0aFZhbHVlID8gcmVqZWN0ZWQobnVsbCwgcmVxdWVzdElkLCBhcmcsIGVyci5wYXlsb2FkLCBlcnIubWV0YSkgOiByZWplY3RlZChlcnIsIHJlcXVlc3RJZCwgYXJnKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKGFib3J0SGFuZGxlcikge1xuICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBza2lwRGlzcGF0Y2ggPSBvcHRpb25zICYmICFvcHRpb25zLmRpc3BhdGNoQ29uZGl0aW9uUmVqZWN0aW9uICYmIHJlamVjdGVkLm1hdGNoKGZpbmFsQWN0aW9uKSAmJiBmaW5hbEFjdGlvbi5tZXRhLmNvbmRpdGlvbjtcbiAgICAgICAgICBpZiAoIXNraXBEaXNwYXRjaCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goZmluYWxBY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmluYWxBY3Rpb247XG4gICAgICAgIH0oKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocHJvbWlzZSwge1xuICAgICAgICAgIGFib3J0LFxuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICBhcmcsXG4gICAgICAgICAgdW53cmFwKCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbih1bndyYXBSZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY3Rpb25DcmVhdG9yLCB7XG4gICAgICBwZW5kaW5nLFxuICAgICAgcmVqZWN0ZWQsXG4gICAgICBmdWxmaWxsZWQsXG4gICAgICBzZXR0bGVkOiBpc0FueU9mKHJlamVjdGVkLCBmdWxmaWxsZWQpLFxuICAgICAgdHlwZVByZWZpeFxuICAgIH0pO1xuICB9XG4gIGNyZWF0ZUFzeW5jVGh1bmsyLndpdGhUeXBlcyA9ICgpID0+IGNyZWF0ZUFzeW5jVGh1bmsyO1xuICByZXR1cm4gY3JlYXRlQXN5bmNUaHVuazI7XG59KSgpO1xuZnVuY3Rpb24gdW53cmFwUmVzdWx0KGFjdGlvbikge1xuICBpZiAoYWN0aW9uLm1ldGEgJiYgYWN0aW9uLm1ldGEucmVqZWN0ZWRXaXRoVmFsdWUpIHtcbiAgICB0aHJvdyBhY3Rpb24ucGF5bG9hZDtcbiAgfVxuICBpZiAoYWN0aW9uLmVycm9yKSB7XG4gICAgdGhyb3cgYWN0aW9uLmVycm9yO1xuICB9XG4gIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGlzVGhlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vLyBzcmMvY3JlYXRlU2xpY2UudHNcbnZhciBhc3luY1RodW5rU3ltYm9sID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoXCJydGstc2xpY2UtY3JlYXRlYXN5bmN0aHVua1wiKTtcbnZhciBhc3luY1RodW5rQ3JlYXRvciA9IHtcbiAgW2FzeW5jVGh1bmtTeW1ib2xdOiBjcmVhdGVBc3luY1RodW5rXG59O1xudmFyIFJlZHVjZXJUeXBlID0gLyogQF9fUFVSRV9fICovICgoUmVkdWNlclR5cGUyKSA9PiB7XG4gIFJlZHVjZXJUeXBlMltcInJlZHVjZXJcIl0gPSBcInJlZHVjZXJcIjtcbiAgUmVkdWNlclR5cGUyW1wicmVkdWNlcldpdGhQcmVwYXJlXCJdID0gXCJyZWR1Y2VyV2l0aFByZXBhcmVcIjtcbiAgUmVkdWNlclR5cGUyW1wiYXN5bmNUaHVua1wiXSA9IFwiYXN5bmNUaHVua1wiO1xuICByZXR1cm4gUmVkdWNlclR5cGUyO1xufSkoUmVkdWNlclR5cGUgfHwge30pO1xuZnVuY3Rpb24gZ2V0VHlwZShzbGljZSwgYWN0aW9uS2V5KSB7XG4gIHJldHVybiBgJHtzbGljZX0vJHthY3Rpb25LZXl9YDtcbn1cbmZ1bmN0aW9uIGJ1aWxkQ3JlYXRlU2xpY2Uoe1xuICBjcmVhdG9yc1xufSA9IHt9KSB7XG4gIGNvbnN0IGNBVCA9IGNyZWF0b3JzPy5hc3luY1RodW5rPy5bYXN5bmNUaHVua1N5bWJvbF07XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVTbGljZTIob3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICByZWR1Y2VyUGF0aCA9IG5hbWVcbiAgICB9ID0gb3B0aW9ucztcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiYG5hbWVgIGlzIGEgcmVxdWlyZWQgb3B0aW9uIGZvciBjcmVhdGVTbGljZVwiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIGlmIChvcHRpb25zLmluaXRpYWxTdGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgbXVzdCBwcm92aWRlIGFuIGBpbml0aWFsU3RhdGVgIHZhbHVlIHRoYXQgaXMgbm90IGB1bmRlZmluZWRgLiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBgaW5pdGlhbFN0YXRlYFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVkdWNlcnMgPSAodHlwZW9mIG9wdGlvbnMucmVkdWNlcnMgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMucmVkdWNlcnMoYnVpbGRSZWR1Y2VyQ3JlYXRvcnMoKSkgOiBvcHRpb25zLnJlZHVjZXJzKSB8fCB7fTtcbiAgICBjb25zdCByZWR1Y2VyTmFtZXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lOiB7fSxcbiAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlOiB7fSxcbiAgICAgIGFjdGlvbkNyZWF0b3JzOiB7fSxcbiAgICAgIHNsaWNlTWF0Y2hlcnM6IFtdXG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0TWV0aG9kcyA9IHtcbiAgICAgIGFkZENhc2UodHlwZU9yQWN0aW9uQ3JlYXRvciwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSBcInN0cmluZ1wiID8gdHlwZU9yQWN0aW9uQ3JlYXRvciA6IHR5cGVPckFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJgY29udGV4dC5hZGRDYXNlYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYW4gZW1wdHkgYWN0aW9uIHR5cGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgaW4gY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IFwiYGNvbnRleHQuYWRkQ2FzZWAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIHR3byByZWR1Y2VycyBmb3IgdGhlIHNhbWUgYWN0aW9uIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZVt0eXBlXSA9IHJlZHVjZXIyO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9LFxuICAgICAgYWRkTWF0Y2hlcihtYXRjaGVyLCByZWR1Y2VyMikge1xuICAgICAgICBjb250ZXh0LnNsaWNlTWF0Y2hlcnMucHVzaCh7XG4gICAgICAgICAgbWF0Y2hlcixcbiAgICAgICAgICByZWR1Y2VyOiByZWR1Y2VyMlxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfSxcbiAgICAgIGV4cG9zZUFjdGlvbihuYW1lMiwgYWN0aW9uQ3JlYXRvcikge1xuICAgICAgICBjb250ZXh0LmFjdGlvbkNyZWF0b3JzW25hbWUyXSA9IGFjdGlvbkNyZWF0b3I7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH0sXG4gICAgICBleHBvc2VDYXNlUmVkdWNlcihuYW1lMiwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZVtuYW1lMl0gPSByZWR1Y2VyMjtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVkdWNlck5hbWVzLmZvckVhY2goKHJlZHVjZXJOYW1lKSA9PiB7XG4gICAgICBjb25zdCByZWR1Y2VyRGVmaW5pdGlvbiA9IHJlZHVjZXJzW3JlZHVjZXJOYW1lXTtcbiAgICAgIGNvbnN0IHJlZHVjZXJEZXRhaWxzID0ge1xuICAgICAgICByZWR1Y2VyTmFtZSxcbiAgICAgICAgdHlwZTogZ2V0VHlwZShuYW1lLCByZWR1Y2VyTmFtZSksXG4gICAgICAgIGNyZWF0ZU5vdGF0aW9uOiB0eXBlb2Ygb3B0aW9ucy5yZWR1Y2VycyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICB9O1xuICAgICAgaWYgKGlzQXN5bmNUaHVua1NsaWNlUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pKSB7XG4gICAgICAgIGhhbmRsZVRodW5rQ2FzZVJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZXRhaWxzLCByZWR1Y2VyRGVmaW5pdGlvbiwgY29udGV4dE1ldGhvZHMsIGNBVCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYW5kbGVOb3JtYWxSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGV0YWlscywgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHRNZXRob2RzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmdW5jdGlvbiBidWlsZFJlZHVjZXIoKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5leHRyYVJlZHVjZXJzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogXCJUaGUgb2JqZWN0IG5vdGF0aW9uIGZvciBgY3JlYXRlU2xpY2UuZXh0cmFSZWR1Y2Vyc2AgaGFzIGJlZW4gcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGUgJ2J1aWxkZXIgY2FsbGJhY2snIG5vdGF0aW9uIGluc3RlYWQ6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2NyZWF0ZVNsaWNlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBbZXh0cmFSZWR1Y2VycyA9IHt9LCBhY3Rpb25NYXRjaGVycyA9IFtdLCBkZWZhdWx0Q2FzZVJlZHVjZXIgPSB2b2lkIDBdID0gdHlwZW9mIG9wdGlvbnMuZXh0cmFSZWR1Y2VycyA9PT0gXCJmdW5jdGlvblwiID8gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2sob3B0aW9ucy5leHRyYVJlZHVjZXJzKSA6IFtvcHRpb25zLmV4dHJhUmVkdWNlcnNdO1xuICAgICAgY29uc3QgZmluYWxDYXNlUmVkdWNlcnMgPSB7XG4gICAgICAgIC4uLmV4dHJhUmVkdWNlcnMsXG4gICAgICAgIC4uLmNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGVcbiAgICAgIH07XG4gICAgICByZXR1cm4gY3JlYXRlUmVkdWNlcihvcHRpb25zLmluaXRpYWxTdGF0ZSwgKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGZpbmFsQ2FzZVJlZHVjZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRDYXNlKGtleSwgZmluYWxDYXNlUmVkdWNlcnNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgc00gb2YgY29udGV4dC5zbGljZU1hdGNoZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRNYXRjaGVyKHNNLm1hdGNoZXIsIHNNLnJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG0gb2YgYWN0aW9uTWF0Y2hlcnMpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZE1hdGNoZXIobS5tYXRjaGVyLCBtLnJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZERlZmF1bHRDYXNlKGRlZmF1bHRDYXNlUmVkdWNlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RTZWxmID0gKHN0YXRlKSA9PiBzdGF0ZTtcbiAgICBjb25zdCBpbmplY3RlZFNlbGVjdG9yQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGluamVjdGVkU3RhdGVDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICAgIGxldCBfcmVkdWNlcjtcbiAgICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgIGlmICghX3JlZHVjZXIpIF9yZWR1Y2VyID0gYnVpbGRSZWR1Y2VyKCk7XG4gICAgICByZXR1cm4gX3JlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgIGlmICghX3JlZHVjZXIpIF9yZWR1Y2VyID0gYnVpbGRSZWR1Y2VyKCk7XG4gICAgICByZXR1cm4gX3JlZHVjZXIuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VTZWxlY3RvclByb3BzKHJlZHVjZXJQYXRoMiwgaW5qZWN0ZWQgPSBmYWxzZSkge1xuICAgICAgZnVuY3Rpb24gc2VsZWN0U2xpY2Uoc3RhdGUpIHtcbiAgICAgICAgbGV0IHNsaWNlU3RhdGUgPSBzdGF0ZVtyZWR1Y2VyUGF0aDJdO1xuICAgICAgICBpZiAodHlwZW9mIHNsaWNlU3RhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgICAgIHNsaWNlU3RhdGUgPSBnZXRPckluc2VydENvbXB1dGVkKGluamVjdGVkU3RhdGVDYWNoZSwgc2VsZWN0U2xpY2UsIGdldEluaXRpYWxTdGF0ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6IFwic2VsZWN0U2xpY2UgcmV0dXJuZWQgdW5kZWZpbmVkIGZvciBhbiB1bmluamVjdGVkIHNsaWNlIHJlZHVjZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzbGljZVN0YXRlO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKHNlbGVjdFN0YXRlID0gc2VsZWN0U2VsZikge1xuICAgICAgICBjb25zdCBzZWxlY3RvckNhY2hlID0gZ2V0T3JJbnNlcnRDb21wdXRlZChpbmplY3RlZFNlbGVjdG9yQ2FjaGUsIGluamVjdGVkLCAoKSA9PiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSk7XG4gICAgICAgIHJldHVybiBnZXRPckluc2VydENvbXB1dGVkKHNlbGVjdG9yQ2FjaGUsIHNlbGVjdFN0YXRlLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWFwID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBbbmFtZTIsIHNlbGVjdG9yXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zLnNlbGVjdG9ycyA/PyB7fSkpIHtcbiAgICAgICAgICAgIG1hcFtuYW1lMl0gPSB3cmFwU2VsZWN0b3Ioc2VsZWN0b3IsIHNlbGVjdFN0YXRlLCAoKSA9PiBnZXRPckluc2VydENvbXB1dGVkKGluamVjdGVkU3RhdGVDYWNoZSwgc2VsZWN0U3RhdGUsIGdldEluaXRpYWxTdGF0ZSksIGluamVjdGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWR1Y2VyUGF0aDogcmVkdWNlclBhdGgyLFxuICAgICAgICBnZXRTZWxlY3RvcnMsXG4gICAgICAgIGdldCBzZWxlY3RvcnMoKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9ycyhzZWxlY3RTbGljZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdFNsaWNlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzbGljZSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICByZWR1Y2VyLFxuICAgICAgYWN0aW9uczogY29udGV4dC5hY3Rpb25DcmVhdG9ycyxcbiAgICAgIGNhc2VSZWR1Y2VyczogY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZSxcbiAgICAgIGdldEluaXRpYWxTdGF0ZSxcbiAgICAgIC4uLm1ha2VTZWxlY3RvclByb3BzKHJlZHVjZXJQYXRoKSxcbiAgICAgIGluamVjdEludG8oaW5qZWN0YWJsZSwge1xuICAgICAgICByZWR1Y2VyUGF0aDogcGF0aE9wdCxcbiAgICAgICAgLi4uY29uZmlnXG4gICAgICB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgbmV3UmVkdWNlclBhdGggPSBwYXRoT3B0ID8/IHJlZHVjZXJQYXRoO1xuICAgICAgICBpbmplY3RhYmxlLmluamVjdCh7XG4gICAgICAgICAgcmVkdWNlclBhdGg6IG5ld1JlZHVjZXJQYXRoLFxuICAgICAgICAgIHJlZHVjZXJcbiAgICAgICAgfSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zbGljZSxcbiAgICAgICAgICAuLi5tYWtlU2VsZWN0b3JQcm9wcyhuZXdSZWR1Y2VyUGF0aCwgdHJ1ZSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBzbGljZTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHdyYXBTZWxlY3RvcihzZWxlY3Rvciwgc2VsZWN0U3RhdGUsIGdldEluaXRpYWxTdGF0ZSwgaW5qZWN0ZWQpIHtcbiAgZnVuY3Rpb24gd3JhcHBlcihyb290U3RhdGUsIC4uLmFyZ3MpIHtcbiAgICBsZXQgc2xpY2VTdGF0ZSA9IHNlbGVjdFN0YXRlKHJvb3RTdGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBzbGljZVN0YXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgc2xpY2VTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJzZWxlY3RTdGF0ZSByZXR1cm5lZCB1bmRlZmluZWQgZm9yIGFuIHVuaW5qZWN0ZWQgc2xpY2UgcmVkdWNlclwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yKHNsaWNlU3RhdGUsIC4uLmFyZ3MpO1xuICB9XG4gIHdyYXBwZXIudW53cmFwcGVkID0gc2VsZWN0b3I7XG4gIHJldHVybiB3cmFwcGVyO1xufVxudmFyIGNyZWF0ZVNsaWNlID0gLyogQF9fUFVSRV9fICovIGJ1aWxkQ3JlYXRlU2xpY2UoKTtcbmZ1bmN0aW9uIGJ1aWxkUmVkdWNlckNyZWF0b3JzKCkge1xuICBmdW5jdGlvbiBhc3luY1RodW5rKHBheWxvYWRDcmVhdG9yLCBjb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX3JlZHVjZXJEZWZpbml0aW9uVHlwZTogXCJhc3luY1RodW5rXCIgLyogYXN5bmNUaHVuayAqLyxcbiAgICAgIHBheWxvYWRDcmVhdG9yLFxuICAgICAgLi4uY29uZmlnXG4gICAgfTtcbiAgfVxuICBhc3luY1RodW5rLndpdGhUeXBlcyA9ICgpID0+IGFzeW5jVGh1bms7XG4gIHJldHVybiB7XG4gICAgcmVkdWNlcihjYXNlUmVkdWNlcikge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAvLyBoYWNrIHNvIHRoZSB3cmFwcGluZyBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNvIHRoZSBgcmVkdWNlckRlZmluaXRpb25UeXBlYCBpcyBub3QgYXNzaWduZWQgdG8gdGhlIG9yaWdpbmFsXG4gICAgICAgIFtjYXNlUmVkdWNlci5uYW1lXSguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc2VSZWR1Y2VyKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9W2Nhc2VSZWR1Y2VyLm5hbWVdLCB7XG4gICAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwicmVkdWNlclwiIC8qIHJlZHVjZXIgKi9cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlcGFyZWRSZWR1Y2VyKHByZXBhcmUsIHJlZHVjZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwicmVkdWNlcldpdGhQcmVwYXJlXCIgLyogcmVkdWNlcldpdGhQcmVwYXJlICovLFxuICAgICAgICBwcmVwYXJlLFxuICAgICAgICByZWR1Y2VyXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXN5bmNUaHVua1xuICB9O1xufVxuZnVuY3Rpb24gaGFuZGxlTm9ybWFsUmVkdWNlckRlZmluaXRpb24oe1xuICB0eXBlLFxuICByZWR1Y2VyTmFtZSxcbiAgY3JlYXRlTm90YXRpb25cbn0sIG1heWJlUmVkdWNlcldpdGhQcmVwYXJlLCBjb250ZXh0KSB7XG4gIGxldCBjYXNlUmVkdWNlcjtcbiAgbGV0IHByZXBhcmVDYWxsYmFjaztcbiAgaWYgKFwicmVkdWNlclwiIGluIG1heWJlUmVkdWNlcldpdGhQcmVwYXJlKSB7XG4gICAgaWYgKGNyZWF0ZU5vdGF0aW9uICYmICFpc0Nhc2VSZWR1Y2VyV2l0aFByZXBhcmVEZWZpbml0aW9uKG1heWJlUmVkdWNlcldpdGhQcmVwYXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTcpIDogXCJQbGVhc2UgdXNlIHRoZSBgY3JlYXRlLnByZXBhcmVkUmVkdWNlcmAgbm90YXRpb24gZm9yIHByZXBhcmVkIGFjdGlvbiBjcmVhdG9ycyB3aXRoIHRoZSBgY3JlYXRlYCBub3RhdGlvbi5cIik7XG4gICAgfVxuICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucmVkdWNlcjtcbiAgICBwcmVwYXJlQ2FsbGJhY2sgPSBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZS5wcmVwYXJlO1xuICB9IGVsc2Uge1xuICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmU7XG4gIH1cbiAgY29udGV4dC5hZGRDYXNlKHR5cGUsIGNhc2VSZWR1Y2VyKS5leHBvc2VDYXNlUmVkdWNlcihyZWR1Y2VyTmFtZSwgY2FzZVJlZHVjZXIpLmV4cG9zZUFjdGlvbihyZWR1Y2VyTmFtZSwgcHJlcGFyZUNhbGxiYWNrID8gY3JlYXRlQWN0aW9uKHR5cGUsIHByZXBhcmVDYWxsYmFjaykgOiBjcmVhdGVBY3Rpb24odHlwZSkpO1xufVxuZnVuY3Rpb24gaXNBc3luY1RodW5rU2xpY2VSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGVmaW5pdGlvbikge1xuICByZXR1cm4gcmVkdWNlckRlZmluaXRpb24uX3JlZHVjZXJEZWZpbml0aW9uVHlwZSA9PT0gXCJhc3luY1RodW5rXCIgLyogYXN5bmNUaHVuayAqLztcbn1cbmZ1bmN0aW9uIGlzQ2FzZVJlZHVjZXJXaXRoUHJlcGFyZURlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pIHtcbiAgcmV0dXJuIHJlZHVjZXJEZWZpbml0aW9uLl9yZWR1Y2VyRGVmaW5pdGlvblR5cGUgPT09IFwicmVkdWNlcldpdGhQcmVwYXJlXCIgLyogcmVkdWNlcldpdGhQcmVwYXJlICovO1xufVxuZnVuY3Rpb24gaGFuZGxlVGh1bmtDYXNlUmVkdWNlckRlZmluaXRpb24oe1xuICB0eXBlLFxuICByZWR1Y2VyTmFtZVxufSwgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHQsIGNBVCkge1xuICBpZiAoIWNBVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE4KSA6IFwiQ2Fubm90IHVzZSBgY3JlYXRlLmFzeW5jVGh1bmtgIGluIHRoZSBidWlsdC1pbiBgY3JlYXRlU2xpY2VgLiBVc2UgYGJ1aWxkQ3JlYXRlU2xpY2UoeyBjcmVhdG9yczogeyBhc3luY1RodW5rOiBhc3luY1RodW5rQ3JlYXRvciB9IH0pYCB0byBjcmVhdGUgYSBjdXN0b21pc2VkIHZlcnNpb24gb2YgYGNyZWF0ZVNsaWNlYC5cIik7XG4gIH1cbiAgY29uc3Qge1xuICAgIHBheWxvYWRDcmVhdG9yLFxuICAgIGZ1bGZpbGxlZCxcbiAgICBwZW5kaW5nLFxuICAgIHJlamVjdGVkLFxuICAgIHNldHRsZWQsXG4gICAgb3B0aW9uc1xuICB9ID0gcmVkdWNlckRlZmluaXRpb247XG4gIGNvbnN0IHRodW5rID0gY0FUKHR5cGUsIHBheWxvYWRDcmVhdG9yLCBvcHRpb25zKTtcbiAgY29udGV4dC5leHBvc2VBY3Rpb24ocmVkdWNlck5hbWUsIHRodW5rKTtcbiAgaWYgKGZ1bGZpbGxlZCkge1xuICAgIGNvbnRleHQuYWRkQ2FzZSh0aHVuay5mdWxmaWxsZWQsIGZ1bGZpbGxlZCk7XG4gIH1cbiAgaWYgKHBlbmRpbmcpIHtcbiAgICBjb250ZXh0LmFkZENhc2UodGh1bmsucGVuZGluZywgcGVuZGluZyk7XG4gIH1cbiAgaWYgKHJlamVjdGVkKSB7XG4gICAgY29udGV4dC5hZGRDYXNlKHRodW5rLnJlamVjdGVkLCByZWplY3RlZCk7XG4gIH1cbiAgaWYgKHNldHRsZWQpIHtcbiAgICBjb250ZXh0LmFkZE1hdGNoZXIodGh1bmsuc2V0dGxlZCwgc2V0dGxlZCk7XG4gIH1cbiAgY29udGV4dC5leHBvc2VDYXNlUmVkdWNlcihyZWR1Y2VyTmFtZSwge1xuICAgIGZ1bGZpbGxlZDogZnVsZmlsbGVkIHx8IG5vb3AsXG4gICAgcGVuZGluZzogcGVuZGluZyB8fCBub29wLFxuICAgIHJlamVjdGVkOiByZWplY3RlZCB8fCBub29wLFxuICAgIHNldHRsZWQ6IHNldHRsZWQgfHwgbm9vcFxuICB9KTtcbn1cbmZ1bmN0aW9uIG5vb3AoKSB7XG59XG5cbi8vIHNyYy9lbnRpdGllcy9lbnRpdHlfc3RhdGUudHNcbmZ1bmN0aW9uIGdldEluaXRpYWxFbnRpdHlTdGF0ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBpZHM6IFtdLFxuICAgIGVudGl0aWVzOiB7fVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5pdGlhbFN0YXRlRmFjdG9yeShzdGF0ZUFkYXB0ZXIpIHtcbiAgZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKGFkZGl0aW9uYWxTdGF0ZSA9IHt9LCBlbnRpdGllcykge1xuICAgIGNvbnN0IHN0YXRlID0gT2JqZWN0LmFzc2lnbihnZXRJbml0aWFsRW50aXR5U3RhdGUoKSwgYWRkaXRpb25hbFN0YXRlKTtcbiAgICByZXR1cm4gZW50aXRpZXMgPyBzdGF0ZUFkYXB0ZXIuc2V0QWxsKHN0YXRlLCBlbnRpdGllcykgOiBzdGF0ZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldEluaXRpYWxTdGF0ZVxuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvc3RhdGVfc2VsZWN0b3JzLnRzXG5mdW5jdGlvbiBjcmVhdGVTZWxlY3RvcnNGYWN0b3J5KCkge1xuICBmdW5jdGlvbiBnZXRTZWxlY3RvcnMoc2VsZWN0U3RhdGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNyZWF0ZVNlbGVjdG9yOiBjcmVhdGVTZWxlY3RvcjIgPSBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvclxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHNlbGVjdElkcyA9IChzdGF0ZSkgPT4gc3RhdGUuaWRzO1xuICAgIGNvbnN0IHNlbGVjdEVudGl0aWVzID0gKHN0YXRlKSA9PiBzdGF0ZS5lbnRpdGllcztcbiAgICBjb25zdCBzZWxlY3RBbGwgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0SWRzLCBzZWxlY3RFbnRpdGllcywgKGlkcywgZW50aXRpZXMpID0+IGlkcy5tYXAoKGlkKSA9PiBlbnRpdGllc1tpZF0pKTtcbiAgICBjb25zdCBzZWxlY3RJZCA9IChfLCBpZCkgPT4gaWQ7XG4gICAgY29uc3Qgc2VsZWN0QnlJZCA9IChlbnRpdGllcywgaWQpID0+IGVudGl0aWVzW2lkXTtcbiAgICBjb25zdCBzZWxlY3RUb3RhbCA9IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RJZHMsIChpZHMpID0+IGlkcy5sZW5ndGgpO1xuICAgIGlmICghc2VsZWN0U3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdElkcyxcbiAgICAgICAgc2VsZWN0RW50aXRpZXMsXG4gICAgICAgIHNlbGVjdEFsbCxcbiAgICAgICAgc2VsZWN0VG90YWwsXG4gICAgICAgIHNlbGVjdEJ5SWQ6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RFbnRpdGllcywgc2VsZWN0SWQsIHNlbGVjdEJ5SWQpXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RHbG9iYWxpemVkRW50aXRpZXMgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdEVudGl0aWVzKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0SWRzOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdElkcyksXG4gICAgICBzZWxlY3RFbnRpdGllczogc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLFxuICAgICAgc2VsZWN0QWxsOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdEFsbCksXG4gICAgICBzZWxlY3RUb3RhbDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RUb3RhbCksXG4gICAgICBzZWxlY3RCeUlkOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLCBzZWxlY3RJZCwgc2VsZWN0QnlJZClcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0U2VsZWN0b3JzXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9zdGF0ZV9hZGFwdGVyLnRzXG52YXIgaXNEcmFmdFR5cGVkID0gaXNEcmFmdDtcbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihtdXRhdG9yKSB7XG4gIGNvbnN0IG9wZXJhdG9yID0gY3JlYXRlU3RhdGVPcGVyYXRvcigoXywgc3RhdGUpID0+IG11dGF0b3Ioc3RhdGUpKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9wZXJhdGlvbihzdGF0ZSkge1xuICAgIHJldHVybiBvcGVyYXRvcihzdGF0ZSwgdm9pZCAwKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRlT3BlcmF0b3IobXV0YXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gb3BlcmF0aW9uKHN0YXRlLCBhcmcpIHtcbiAgICBmdW5jdGlvbiBpc1BheWxvYWRBY3Rpb25Bcmd1bWVudChhcmcyKSB7XG4gICAgICByZXR1cm4gaXNGU0EoYXJnMik7XG4gICAgfVxuICAgIGNvbnN0IHJ1bk11dGF0b3IgPSAoZHJhZnQpID0+IHtcbiAgICAgIGlmIChpc1BheWxvYWRBY3Rpb25Bcmd1bWVudChhcmcpKSB7XG4gICAgICAgIG11dGF0b3IoYXJnLnBheWxvYWQsIGRyYWZ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11dGF0b3IoYXJnLCBkcmFmdCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoaXNEcmFmdFR5cGVkKHN0YXRlKSkge1xuICAgICAgcnVuTXV0YXRvcihzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBwcm9kdWNlKHN0YXRlLCBydW5NdXRhdG9yKTtcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3V0aWxzLnRzXG5mdW5jdGlvbiBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpIHtcbiAgY29uc3Qga2V5ID0gc2VsZWN0SWQoZW50aXR5KTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBrZXkgPT09IHZvaWQgMCkge1xuICAgIGNvbnNvbGUud2FybihcIlRoZSBlbnRpdHkgcGFzc2VkIHRvIHRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uIHJldHVybmVkIHVuZGVmaW5lZC5cIiwgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHByb3ZpZGUgeW91ciBvd24gYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbi5cIiwgXCJUaGUgZW50aXR5IHRoYXQgd2FzIHBhc3NlZDpcIiwgZW50aXR5LCBcIlRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uOlwiLCBzZWxlY3RJZC50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4ga2V5O1xufVxuZnVuY3Rpb24gZW5zdXJlRW50aXRpZXNBcnJheShlbnRpdGllcykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZW50aXRpZXMpKSB7XG4gICAgZW50aXRpZXMgPSBPYmplY3QudmFsdWVzKGVudGl0aWVzKTtcbiAgfVxuICByZXR1cm4gZW50aXRpZXM7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50KHZhbHVlKSB7XG4gIHJldHVybiBpc0RyYWZ0KHZhbHVlKSA/IGN1cnJlbnQodmFsdWUpIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzcGxpdEFkZGVkVXBkYXRlZEVudGl0aWVzKG5ld0VudGl0aWVzLCBzZWxlY3RJZCwgc3RhdGUpIHtcbiAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgY29uc3QgZXhpc3RpbmdJZHNBcnJheSA9IGdldEN1cnJlbnQoc3RhdGUuaWRzKTtcbiAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KGV4aXN0aW5nSWRzQXJyYXkpO1xuICBjb25zdCBhZGRlZCA9IFtdO1xuICBjb25zdCBhZGRlZElkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtdKTtcbiAgY29uc3QgdXBkYXRlZCA9IFtdO1xuICBmb3IgKGNvbnN0IGVudGl0eSBvZiBuZXdFbnRpdGllcykge1xuICAgIGNvbnN0IGlkID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcbiAgICBpZiAoZXhpc3RpbmdJZHMuaGFzKGlkKSB8fCBhZGRlZElkcy5oYXMoaWQpKSB7XG4gICAgICB1cGRhdGVkLnB1c2goe1xuICAgICAgICBpZCxcbiAgICAgICAgY2hhbmdlczogZW50aXR5XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkZWRJZHMuYWRkKGlkKTtcbiAgICAgIGFkZGVkLnB1c2goZW50aXR5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFthZGRlZCwgdXBkYXRlZCwgZXhpc3RpbmdJZHNBcnJheV07XG59XG5cbi8vIHNyYy9lbnRpdGllcy91bnNvcnRlZF9zdGF0ZV9hZGFwdGVyLnRzXG5mdW5jdGlvbiBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCkge1xuICBmdW5jdGlvbiBhZGRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICBjb25zdCBrZXkgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xuICAgIGlmIChrZXkgaW4gc3RhdGUuZW50aXRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUuaWRzLnB1c2goa2V5KTtcbiAgICBzdGF0ZS5lbnRpdGllc1trZXldID0gZW50aXR5O1xuICB9XG4gIGZ1bmN0aW9uIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgbmV3RW50aXRpZXMpIHtcbiAgICAgIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIGNvbnN0IGtleSA9IHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCk7XG4gICAgaWYgKCEoa2V5IGluIHN0YXRlLmVudGl0aWVzKSkge1xuICAgICAgc3RhdGUuaWRzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgO1xuICAgIHN0YXRlLmVudGl0aWVzW2tleV0gPSBlbnRpdHk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBuZXdFbnRpdGllcykge1xuICAgICAgc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0QWxsTXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIHN0YXRlLmlkcyA9IFtdO1xuICAgIHN0YXRlLmVudGl0aWVzID0ge307XG4gICAgYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVPbmVNdXRhYmx5KGtleSwgc3RhdGUpIHtcbiAgICByZXR1cm4gcmVtb3ZlTWFueU11dGFibHkoW2tleV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVNYW55TXV0YWJseShrZXlzLCBzdGF0ZSkge1xuICAgIGxldCBkaWRNdXRhdGUgPSBmYWxzZTtcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleSBpbiBzdGF0ZS5lbnRpdGllcykge1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNba2V5XTtcbiAgICAgICAgZGlkTXV0YXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZGlkTXV0YXRlKSB7XG4gICAgICBzdGF0ZS5pZHMgPSBzdGF0ZS5pZHMuZmlsdGVyKChpZCkgPT4gaWQgaW4gc3RhdGUuZW50aXRpZXMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiByZW1vdmVBbGxNdXRhYmx5KHN0YXRlKSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwge1xuICAgICAgaWRzOiBbXSxcbiAgICAgIGVudGl0aWVzOiB7fVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHRha2VOZXdLZXkoa2V5cywgdXBkYXRlLCBzdGF0ZSkge1xuICAgIGNvbnN0IG9yaWdpbmFsMyA9IHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgaWYgKG9yaWdpbmFsMyA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZWQgPSBPYmplY3QuYXNzaWduKHt9LCBvcmlnaW5hbDMsIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICBjb25zdCBuZXdLZXkgPSBzZWxlY3RJZFZhbHVlKHVwZGF0ZWQsIHNlbGVjdElkKTtcbiAgICBjb25zdCBoYXNOZXdLZXkgPSBuZXdLZXkgIT09IHVwZGF0ZS5pZDtcbiAgICBpZiAoaGFzTmV3S2V5KSB7XG4gICAgICBrZXlzW3VwZGF0ZS5pZF0gPSBuZXdLZXk7XG4gICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICB9XG4gICAgO1xuICAgIHN0YXRlLmVudGl0aWVzW25ld0tleV0gPSB1cGRhdGVkO1xuICAgIHJldHVybiBoYXNOZXdLZXk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlT25lTXV0YWJseSh1cGRhdGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU1hbnlNdXRhYmx5KFt1cGRhdGVdLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlTWFueU11dGFibHkodXBkYXRlcywgc3RhdGUpIHtcbiAgICBjb25zdCBuZXdLZXlzID0ge307XG4gICAgY29uc3QgdXBkYXRlc1BlckVudGl0eSA9IHt9O1xuICAgIHVwZGF0ZXMuZm9yRWFjaCgodXBkYXRlKSA9PiB7XG4gICAgICBpZiAodXBkYXRlLmlkIGluIHN0YXRlLmVudGl0aWVzKSB7XG4gICAgICAgIHVwZGF0ZXNQZXJFbnRpdHlbdXBkYXRlLmlkXSA9IHtcbiAgICAgICAgICBpZDogdXBkYXRlLmlkLFxuICAgICAgICAgIC8vIFNwcmVhZHMgaWdub3JlIGZhbHN5IHZhbHVlcywgc28gdGhpcyB3b3JrcyBldmVuIGlmIHRoZXJlIGlzbid0XG4gICAgICAgICAgLy8gYW4gZXhpc3RpbmcgdXBkYXRlIGFscmVhZHkgYXQgdGhpcyBrZXlcbiAgICAgICAgICBjaGFuZ2VzOiB7XG4gICAgICAgICAgICAuLi51cGRhdGVzUGVyRW50aXR5W3VwZGF0ZS5pZF0/LmNoYW5nZXMsXG4gICAgICAgICAgICAuLi51cGRhdGUuY2hhbmdlc1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1cGRhdGVzID0gT2JqZWN0LnZhbHVlcyh1cGRhdGVzUGVyRW50aXR5KTtcbiAgICBjb25zdCBkaWRNdXRhdGVFbnRpdGllcyA9IHVwZGF0ZXMubGVuZ3RoID4gMDtcbiAgICBpZiAoZGlkTXV0YXRlRW50aXRpZXMpIHtcbiAgICAgIGNvbnN0IGRpZE11dGF0ZUlkcyA9IHVwZGF0ZXMuZmlsdGVyKCh1cGRhdGUpID0+IHRha2VOZXdLZXkobmV3S2V5cywgdXBkYXRlLCBzdGF0ZSkpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoZGlkTXV0YXRlSWRzKSB7XG4gICAgICAgIHN0YXRlLmlkcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUuZW50aXRpZXMpLm1hcCgoZSkgPT4gc2VsZWN0SWRWYWx1ZShlLCBzZWxlY3RJZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBzZXJ0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBjb25zdCBbYWRkZWQsIHVwZGF0ZWRdID0gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKTtcbiAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUpO1xuICAgIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbW92ZUFsbDogY3JlYXRlU2luZ2xlQXJndW1lbnRTdGF0ZU9wZXJhdG9yKHJlbW92ZUFsbE11dGFibHkpLFxuICAgIGFkZE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRPbmVNdXRhYmx5KSxcbiAgICBhZGRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE1hbnlNdXRhYmx5KSxcbiAgICBzZXRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0T25lTXV0YWJseSksXG4gICAgc2V0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRNYW55TXV0YWJseSksXG4gICAgc2V0QWxsOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldEFsbE11dGFibHkpLFxuICAgIHVwZGF0ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVPbmVNdXRhYmx5KSxcbiAgICB1cGRhdGVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU1hbnlNdXRhYmx5KSxcbiAgICB1cHNlcnRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0T25lTXV0YWJseSksXG4gICAgdXBzZXJ0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRNYW55TXV0YWJseSksXG4gICAgcmVtb3ZlT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHJlbW92ZU9uZU11dGFibHkpLFxuICAgIHJlbW92ZU1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IocmVtb3ZlTWFueU11dGFibHkpXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9zb3J0ZWRfc3RhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gZmluZEluc2VydEluZGV4KHNvcnRlZEl0ZW1zLCBpdGVtLCBjb21wYXJpc29uRnVuY3Rpb24pIHtcbiAgbGV0IGxvd0luZGV4ID0gMDtcbiAgbGV0IGhpZ2hJbmRleCA9IHNvcnRlZEl0ZW1zLmxlbmd0aDtcbiAgd2hpbGUgKGxvd0luZGV4IDwgaGlnaEluZGV4KSB7XG4gICAgbGV0IG1pZGRsZUluZGV4ID0gbG93SW5kZXggKyBoaWdoSW5kZXggPj4+IDE7XG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSBzb3J0ZWRJdGVtc1ttaWRkbGVJbmRleF07XG4gICAgY29uc3QgcmVzID0gY29tcGFyaXNvbkZ1bmN0aW9uKGl0ZW0sIGN1cnJlbnRJdGVtKTtcbiAgICBpZiAocmVzID49IDApIHtcbiAgICAgIGxvd0luZGV4ID0gbWlkZGxlSW5kZXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWdoSW5kZXggPSBtaWRkbGVJbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxvd0luZGV4O1xufVxuZnVuY3Rpb24gaW5zZXJ0KHNvcnRlZEl0ZW1zLCBpdGVtLCBjb21wYXJpc29uRnVuY3Rpb24pIHtcbiAgY29uc3QgaW5zZXJ0QXRJbmRleCA9IGZpbmRJbnNlcnRJbmRleChzb3J0ZWRJdGVtcywgaXRlbSwgY29tcGFyaXNvbkZ1bmN0aW9uKTtcbiAgc29ydGVkSXRlbXMuc3BsaWNlKGluc2VydEF0SW5kZXgsIDAsIGl0ZW0pO1xuICByZXR1cm4gc29ydGVkSXRlbXM7XG59XG5mdW5jdGlvbiBjcmVhdGVTb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQsIGNvbXBhcmVyKSB7XG4gIGNvbnN0IHtcbiAgICByZW1vdmVPbmUsXG4gICAgcmVtb3ZlTWFueSxcbiAgICByZW1vdmVBbGxcbiAgfSA9IGNyZWF0ZVVuc29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkKTtcbiAgZnVuY3Rpb24gYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIGFkZE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlLCBleGlzdGluZ0lkcykge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChleGlzdGluZ0lkcyA/PyBnZXRDdXJyZW50KHN0YXRlLmlkcykpO1xuICAgIGNvbnN0IGFkZGVkS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgY29uc3QgbW9kZWxzID0gbmV3RW50aXRpZXMuZmlsdGVyKChtb2RlbCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxJZCA9IHNlbGVjdElkVmFsdWUobW9kZWwsIHNlbGVjdElkKTtcbiAgICAgIGNvbnN0IG5vdEFkZGVkID0gIWFkZGVkS2V5cy5oYXMobW9kZWxJZCk7XG4gICAgICBpZiAobm90QWRkZWQpIGFkZGVkS2V5cy5hZGQobW9kZWxJZCk7XG4gICAgICByZXR1cm4gIWV4aXN0aW5nS2V5cy5oYXMobW9kZWxJZCkgJiYgbm90QWRkZWQ7XG4gICAgfSk7XG4gICAgaWYgKG1vZGVscy5sZW5ndGggIT09IDApIHtcbiAgICAgIG1lcmdlRnVuY3Rpb24oc3RhdGUsIG1vZGVscyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiBzZXRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHNldE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIGxldCBkZWR1cGxpY2F0ZWRFbnRpdGllcyA9IHt9O1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgaWYgKG5ld0VudGl0aWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5ld0VudGl0aWVzKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkID0gc2VsZWN0SWQoaXRlbSk7XG4gICAgICAgIGRlZHVwbGljYXRlZEVudGl0aWVzW2VudGl0eUlkXSA9IGl0ZW07XG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1tlbnRpdHlJZF07XG4gICAgICB9XG4gICAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkoZGVkdXBsaWNhdGVkRW50aXRpZXMpO1xuICAgICAgbWVyZ2VGdW5jdGlvbihzdGF0ZSwgbmV3RW50aXRpZXMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRBbGxNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgc3RhdGUuZW50aXRpZXMgPSB7fTtcbiAgICBzdGF0ZS5pZHMgPSBbXTtcbiAgICBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUsIFtdKTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVPbmVNdXRhYmx5KHVwZGF0ZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBkYXRlTWFueU11dGFibHkoW3VwZGF0ZV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVzLCBzdGF0ZSkge1xuICAgIGxldCBhcHBsaWVkVXBkYXRlcyA9IGZhbHNlO1xuICAgIGxldCByZXBsYWNlZElkcyA9IGZhbHNlO1xuICAgIGZvciAobGV0IHVwZGF0ZSBvZiB1cGRhdGVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhcHBsaWVkVXBkYXRlcyA9IHRydWU7XG4gICAgICBPYmplY3QuYXNzaWduKGVudGl0eSwgdXBkYXRlLmNoYW5nZXMpO1xuICAgICAgY29uc3QgbmV3SWQgPSBzZWxlY3RJZChlbnRpdHkpO1xuICAgICAgaWYgKHVwZGF0ZS5pZCAhPT0gbmV3SWQpIHtcbiAgICAgICAgcmVwbGFjZWRJZHMgPSB0cnVlO1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSBzdGF0ZS5pZHMuaW5kZXhPZih1cGRhdGUuaWQpO1xuICAgICAgICBzdGF0ZS5pZHNbb2xkSW5kZXhdID0gbmV3SWQ7XG4gICAgICAgIHN0YXRlLmVudGl0aWVzW25ld0lkXSA9IGVudGl0eTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFwcGxpZWRVcGRhdGVzKSB7XG4gICAgICBtZXJnZUZ1bmN0aW9uKHN0YXRlLCBbXSwgYXBwbGllZFVwZGF0ZXMsIHJlcGxhY2VkSWRzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwc2VydE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgW2FkZGVkLCB1cGRhdGVkLCBleGlzdGluZ0lkc0FycmF5XSA9IHNwbGl0QWRkZWRVcGRhdGVkRW50aXRpZXMobmV3RW50aXRpZXMsIHNlbGVjdElkLCBzdGF0ZSk7XG4gICAgaWYgKGFkZGVkLmxlbmd0aCkge1xuICAgICAgYWRkTWFueU11dGFibHkoYWRkZWQsIHN0YXRlLCBleGlzdGluZ0lkc0FycmF5KTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZWQubGVuZ3RoKSB7XG4gICAgICB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVkLCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFyZUFycmF5c0VxdWFsKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gPT09IGJbaV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IG1lcmdlRnVuY3Rpb24gPSAoc3RhdGUsIGFkZGVkSXRlbXMsIGFwcGxpZWRVcGRhdGVzLCByZXBsYWNlZElkcykgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRFbnRpdGllcyA9IGdldEN1cnJlbnQoc3RhdGUuZW50aXRpZXMpO1xuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBnZXRDdXJyZW50KHN0YXRlLmlkcyk7XG4gICAgY29uc3Qgc3RhdGVFbnRpdGllcyA9IHN0YXRlLmVudGl0aWVzO1xuICAgIGxldCBpZHMgPSBjdXJyZW50SWRzO1xuICAgIGlmIChyZXBsYWNlZElkcykge1xuICAgICAgaWRzID0gbmV3IFNldChjdXJyZW50SWRzKTtcbiAgICB9XG4gICAgbGV0IHNvcnRlZEVudGl0aWVzID0gW107XG4gICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IGN1cnJlbnRFbnRpdGllc1tpZF07XG4gICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgIHNvcnRlZEVudGl0aWVzLnB1c2goZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgd2FzUHJldmlvdXNseUVtcHR5ID0gc29ydGVkRW50aXRpZXMubGVuZ3RoID09PSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBhZGRlZEl0ZW1zKSB7XG4gICAgICBzdGF0ZUVudGl0aWVzW3NlbGVjdElkKGl0ZW0pXSA9IGl0ZW07XG4gICAgICBpZiAoIXdhc1ByZXZpb3VzbHlFbXB0eSkge1xuICAgICAgICBpbnNlcnQoc29ydGVkRW50aXRpZXMsIGl0ZW0sIGNvbXBhcmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHdhc1ByZXZpb3VzbHlFbXB0eSkge1xuICAgICAgc29ydGVkRW50aXRpZXMgPSBhZGRlZEl0ZW1zLnNsaWNlKCkuc29ydChjb21wYXJlcik7XG4gICAgfSBlbHNlIGlmIChhcHBsaWVkVXBkYXRlcykge1xuICAgICAgc29ydGVkRW50aXRpZXMuc29ydChjb21wYXJlcik7XG4gICAgfVxuICAgIGNvbnN0IG5ld1NvcnRlZElkcyA9IHNvcnRlZEVudGl0aWVzLm1hcChzZWxlY3RJZCk7XG4gICAgaWYgKCFhcmVBcnJheXNFcXVhbChjdXJyZW50SWRzLCBuZXdTb3J0ZWRJZHMpKSB7XG4gICAgICBzdGF0ZS5pZHMgPSBuZXdTb3J0ZWRJZHM7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge1xuICAgIHJlbW92ZU9uZSxcbiAgICByZW1vdmVNYW55LFxuICAgIHJlbW92ZUFsbCxcbiAgICBhZGRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkT25lTXV0YWJseSksXG4gICAgdXBkYXRlT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU9uZU11dGFibHkpLFxuICAgIHVwc2VydE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRPbmVNdXRhYmx5KSxcbiAgICBzZXRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0T25lTXV0YWJseSksXG4gICAgc2V0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRNYW55TXV0YWJseSksXG4gICAgc2V0QWxsOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldEFsbE11dGFibHkpLFxuICAgIGFkZE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkTWFueU11dGFibHkpLFxuICAgIHVwZGF0ZU1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlTWFueU11dGFibHkpLFxuICAgIHVwc2VydE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0TWFueU11dGFibHkpXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9jcmVhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gY3JlYXRlRW50aXR5QWRhcHRlcihvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHNlbGVjdElkLFxuICAgIHNvcnRDb21wYXJlclxuICB9ID0ge1xuICAgIHNvcnRDb21wYXJlcjogZmFsc2UsXG4gICAgc2VsZWN0SWQ6IChpbnN0YW5jZSkgPT4gaW5zdGFuY2UuaWQsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICBjb25zdCBzdGF0ZUFkYXB0ZXIgPSBzb3J0Q29tcGFyZXIgPyBjcmVhdGVTb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQsIHNvcnRDb21wYXJlcikgOiBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCk7XG4gIGNvbnN0IHN0YXRlRmFjdG9yeSA9IGNyZWF0ZUluaXRpYWxTdGF0ZUZhY3Rvcnkoc3RhdGVBZGFwdGVyKTtcbiAgY29uc3Qgc2VsZWN0b3JzRmFjdG9yeSA9IGNyZWF0ZVNlbGVjdG9yc0ZhY3RvcnkoKTtcbiAgcmV0dXJuIHtcbiAgICBzZWxlY3RJZCxcbiAgICBzb3J0Q29tcGFyZXIsXG4gICAgLi4uc3RhdGVGYWN0b3J5LFxuICAgIC4uLnNlbGVjdG9yc0ZhY3RvcnksXG4gICAgLi4uc3RhdGVBZGFwdGVyXG4gIH07XG59XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvZXhjZXB0aW9ucy50c1xudmFyIHRhc2sgPSBcInRhc2tcIjtcbnZhciBsaXN0ZW5lciA9IFwibGlzdGVuZXJcIjtcbnZhciBjb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xudmFyIGNhbmNlbGxlZCA9IFwiY2FuY2VsbGVkXCI7XG52YXIgdGFza0NhbmNlbGxlZCA9IGB0YXNrLSR7Y2FuY2VsbGVkfWA7XG52YXIgdGFza0NvbXBsZXRlZCA9IGB0YXNrLSR7Y29tcGxldGVkfWA7XG52YXIgbGlzdGVuZXJDYW5jZWxsZWQgPSBgJHtsaXN0ZW5lcn0tJHtjYW5jZWxsZWR9YDtcbnZhciBsaXN0ZW5lckNvbXBsZXRlZCA9IGAke2xpc3RlbmVyfS0ke2NvbXBsZXRlZH1gO1xudmFyIFRhc2tBYm9ydEVycm9yID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihjb2RlKSB7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBgJHt0YXNrfSAke2NhbmNlbGxlZH0gKHJlYXNvbjogJHtjb2RlfSlgO1xuICB9XG4gIG5hbWUgPSBcIlRhc2tBYm9ydEVycm9yXCI7XG4gIG1lc3NhZ2U7XG59O1xuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL3V0aWxzLnRzXG52YXIgYXNzZXJ0RnVuY3Rpb24gPSAoZnVuYywgZXhwZWN0ZWQpID0+IHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzIpIDogYCR7ZXhwZWN0ZWR9IGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gIH1cbn07XG52YXIgbm9vcDIgPSAoKSA9PiB7XG59O1xudmFyIGNhdGNoUmVqZWN0aW9uID0gKHByb21pc2UsIG9uRXJyb3IgPSBub29wMikgPT4ge1xuICBwcm9taXNlLmNhdGNoKG9uRXJyb3IpO1xuICByZXR1cm4gcHJvbWlzZTtcbn07XG52YXIgYWRkQWJvcnRTaWduYWxMaXN0ZW5lciA9IChhYm9ydFNpZ25hbCwgY2FsbGJhY2spID0+IHtcbiAgYWJvcnRTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGNhbGxiYWNrLCB7XG4gICAgb25jZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuICgpID0+IGFib3J0U2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBjYWxsYmFjayk7XG59O1xudmFyIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24gPSAoYWJvcnRDb250cm9sbGVyLCByZWFzb24pID0+IHtcbiAgY29uc3Qgc2lnbmFsID0gYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghKFwicmVhc29uXCIgaW4gc2lnbmFsKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzaWduYWwsIFwicmVhc29uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogcmVhc29uLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxuICA7XG4gIGFib3J0Q29udHJvbGxlci5hYm9ydChyZWFzb24pO1xufTtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS90YXNrLnRzXG52YXIgdmFsaWRhdGVBY3RpdmUgPSAoc2lnbmFsKSA9PiB7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlYXNvblxuICAgIH0gPSBzaWduYWw7XG4gICAgdGhyb3cgbmV3IFRhc2tBYm9ydEVycm9yKHJlYXNvbik7XG4gIH1cbn07XG5mdW5jdGlvbiByYWNlV2l0aFNpZ25hbChzaWduYWwsIHByb21pc2UpIHtcbiAgbGV0IGNsZWFudXAgPSBub29wMjtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBub3RpZnlSZWplY3Rpb24gPSAoKSA9PiByZWplY3QobmV3IFRhc2tBYm9ydEVycm9yKHNpZ25hbC5yZWFzb24pKTtcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIG5vdGlmeVJlamVjdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGVhbnVwID0gYWRkQWJvcnRTaWduYWxMaXN0ZW5lcihzaWduYWwsIG5vdGlmeVJlamVjdGlvbik7XG4gICAgcHJvbWlzZS5maW5hbGx5KCgpID0+IGNsZWFudXAoKSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBjbGVhbnVwID0gbm9vcDI7XG4gIH0pO1xufVxudmFyIHJ1blRhc2sgPSBhc3luYyAodGFzazIsIGNsZWFuVXApID0+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRhc2syKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogXCJva1wiLFxuICAgICAgdmFsdWVcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IGVycm9yIGluc3RhbmNlb2YgVGFza0Fib3J0RXJyb3IgPyBcImNhbmNlbGxlZFwiIDogXCJyZWplY3RlZFwiLFxuICAgICAgZXJyb3JcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFuVXA/LigpO1xuICB9XG59O1xudmFyIGNyZWF0ZVBhdXNlID0gKHNpZ25hbCkgPT4ge1xuICByZXR1cm4gKHByb21pc2UpID0+IHtcbiAgICByZXR1cm4gY2F0Y2hSZWplY3Rpb24ocmFjZVdpdGhTaWduYWwoc2lnbmFsLCBwcm9taXNlKS50aGVuKChvdXRwdXQpID0+IHtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKHNpZ25hbCk7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pKTtcbiAgfTtcbn07XG52YXIgY3JlYXRlRGVsYXkgPSAoc2lnbmFsKSA9PiB7XG4gIGNvbnN0IHBhdXNlID0gY3JlYXRlUGF1c2Uoc2lnbmFsKTtcbiAgcmV0dXJuICh0aW1lb3V0TXMpID0+IHtcbiAgICByZXR1cm4gcGF1c2UobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dE1zKSkpO1xuICB9O1xufTtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS9pbmRleC50c1xudmFyIHtcbiAgYXNzaWduXG59ID0gT2JqZWN0O1xudmFyIElOVEVSTkFMX05JTF9UT0tFTiA9IHt9O1xudmFyIGFsbSA9IFwibGlzdGVuZXJNaWRkbGV3YXJlXCI7XG52YXIgY3JlYXRlRm9yayA9IChwYXJlbnRBYm9ydFNpZ25hbCwgcGFyZW50QmxvY2tpbmdQcm9taXNlcykgPT4ge1xuICBjb25zdCBsaW5rQ29udHJvbGxlcnMgPSAoY29udHJvbGxlcikgPT4gYWRkQWJvcnRTaWduYWxMaXN0ZW5lcihwYXJlbnRBYm9ydFNpZ25hbCwgKCkgPT4gYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjb250cm9sbGVyLCBwYXJlbnRBYm9ydFNpZ25hbC5yZWFzb24pKTtcbiAgcmV0dXJuICh0YXNrRXhlY3V0b3IsIG9wdHMpID0+IHtcbiAgICBhc3NlcnRGdW5jdGlvbih0YXNrRXhlY3V0b3IsIFwidGFza0V4ZWN1dG9yXCIpO1xuICAgIGNvbnN0IGNoaWxkQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGxpbmtDb250cm9sbGVycyhjaGlsZEFib3J0Q29udHJvbGxlcik7XG4gICAgY29uc3QgcmVzdWx0ID0gcnVuVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShwYXJlbnRBYm9ydFNpZ25hbCk7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgY29uc3QgcmVzdWx0MiA9IGF3YWl0IHRhc2tFeGVjdXRvcih7XG4gICAgICAgIHBhdXNlOiBjcmVhdGVQYXVzZShjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICBkZWxheTogY3JlYXRlRGVsYXkoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgc2lnbmFsOiBjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWxcbiAgICAgIH0pO1xuICAgICAgdmFsaWRhdGVBY3RpdmUoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIHJldHVybiByZXN1bHQyO1xuICAgIH0sICgpID0+IGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY2hpbGRBYm9ydENvbnRyb2xsZXIsIHRhc2tDb21wbGV0ZWQpKTtcbiAgICBpZiAob3B0cz8uYXV0b0pvaW4pIHtcbiAgICAgIHBhcmVudEJsb2NraW5nUHJvbWlzZXMucHVzaChyZXN1bHQuY2F0Y2gobm9vcDIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdDogY3JlYXRlUGF1c2UocGFyZW50QWJvcnRTaWduYWwpKHJlc3VsdCksXG4gICAgICBjYW5jZWwoKSB7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY2hpbGRBYm9ydENvbnRyb2xsZXIsIHRhc2tDYW5jZWxsZWQpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59O1xudmFyIGNyZWF0ZVRha2VQYXR0ZXJuID0gKHN0YXJ0TGlzdGVuaW5nLCBzaWduYWwpID0+IHtcbiAgY29uc3QgdGFrZSA9IGFzeW5jIChwcmVkaWNhdGUsIHRpbWVvdXQpID0+IHtcbiAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgIGxldCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICB9O1xuICAgIGNvbnN0IHR1cGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzdG9wTGlzdGVuaW5nID0gc3RhcnRMaXN0ZW5pbmcoe1xuICAgICAgICBwcmVkaWNhdGUsXG4gICAgICAgIGVmZmVjdDogKGFjdGlvbiwgbGlzdGVuZXJBcGkpID0+IHtcbiAgICAgICAgICBsaXN0ZW5lckFwaS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlc29sdmUoW2FjdGlvbiwgbGlzdGVuZXJBcGkuZ2V0U3RhdGUoKSwgbGlzdGVuZXJBcGkuZ2V0T3JpZ2luYWxTdGF0ZSgpXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICAgIHN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHByb21pc2VzID0gW3R1cGxlUHJvbWlzZV07XG4gICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgcHJvbWlzZXMucHVzaChuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lb3V0LCBudWxsKSkpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmFjZVdpdGhTaWduYWwoc2lnbmFsLCBQcm9taXNlLnJhY2UocHJvbWlzZXMpKTtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKHNpZ25hbCk7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIChwcmVkaWNhdGUsIHRpbWVvdXQpID0+IGNhdGNoUmVqZWN0aW9uKHRha2UocHJlZGljYXRlLCB0aW1lb3V0KSk7XG59O1xudmFyIGdldExpc3RlbmVyRW50cnlQcm9wc0Zyb20gPSAob3B0aW9ucykgPT4ge1xuICBsZXQge1xuICAgIHR5cGUsXG4gICAgYWN0aW9uQ3JlYXRvcixcbiAgICBtYXRjaGVyLFxuICAgIHByZWRpY2F0ZSxcbiAgICBlZmZlY3RcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICh0eXBlKSB7XG4gICAgcHJlZGljYXRlID0gY3JlYXRlQWN0aW9uKHR5cGUpLm1hdGNoO1xuICB9IGVsc2UgaWYgKGFjdGlvbkNyZWF0b3IpIHtcbiAgICB0eXBlID0gYWN0aW9uQ3JlYXRvci50eXBlO1xuICAgIHByZWRpY2F0ZSA9IGFjdGlvbkNyZWF0b3IubWF0Y2g7XG4gIH0gZWxzZSBpZiAobWF0Y2hlcikge1xuICAgIHByZWRpY2F0ZSA9IG1hdGNoZXI7XG4gIH0gZWxzZSBpZiAocHJlZGljYXRlKSB7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjEpIDogXCJDcmVhdGluZyBvciByZW1vdmluZyBhIGxpc3RlbmVyIHJlcXVpcmVzIG9uZSBvZiB0aGUga25vd24gZmllbGRzIGZvciBtYXRjaGluZyBhbiBhY3Rpb25cIik7XG4gIH1cbiAgYXNzZXJ0RnVuY3Rpb24oZWZmZWN0LCBcIm9wdGlvbnMubGlzdGVuZXJcIik7XG4gIHJldHVybiB7XG4gICAgcHJlZGljYXRlLFxuICAgIHR5cGUsXG4gICAgZWZmZWN0XG4gIH07XG59O1xudmFyIGNyZWF0ZUxpc3RlbmVyRW50cnkgPSAvKiBAX19QVVJFX18gKi8gYXNzaWduKChvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHByZWRpY2F0ZSxcbiAgICBlZmZlY3RcbiAgfSA9IGdldExpc3RlbmVyRW50cnlQcm9wc0Zyb20ob3B0aW9ucyk7XG4gIGNvbnN0IGVudHJ5ID0ge1xuICAgIGlkOiBuYW5vaWQoKSxcbiAgICBlZmZlY3QsXG4gICAgdHlwZSxcbiAgICBwcmVkaWNhdGUsXG4gICAgcGVuZGluZzogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjIpIDogXCJVbnN1YnNjcmliZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICB9O1xuICByZXR1cm4gZW50cnk7XG59LCB7XG4gIHdpdGhUeXBlczogKCkgPT4gY3JlYXRlTGlzdGVuZXJFbnRyeVxufSk7XG52YXIgZmluZExpc3RlbmVyRW50cnkgPSAobGlzdGVuZXJNYXAsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgZWZmZWN0LFxuICAgIHByZWRpY2F0ZVxuICB9ID0gZ2V0TGlzdGVuZXJFbnRyeVByb3BzRnJvbShvcHRpb25zKTtcbiAgcmV0dXJuIEFycmF5LmZyb20obGlzdGVuZXJNYXAudmFsdWVzKCkpLmZpbmQoKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgbWF0Y2hQcmVkaWNhdGVPclR5cGUgPSB0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIiA/IGVudHJ5LnR5cGUgPT09IHR5cGUgOiBlbnRyeS5wcmVkaWNhdGUgPT09IHByZWRpY2F0ZTtcbiAgICByZXR1cm4gbWF0Y2hQcmVkaWNhdGVPclR5cGUgJiYgZW50cnkuZWZmZWN0ID09PSBlZmZlY3Q7XG4gIH0pO1xufTtcbnZhciBjYW5jZWxBY3RpdmVMaXN0ZW5lcnMgPSAoZW50cnkpID0+IHtcbiAgZW50cnkucGVuZGluZy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjb250cm9sbGVyLCBsaXN0ZW5lckNhbmNlbGxlZCk7XG4gIH0pO1xufTtcbnZhciBjcmVhdGVDbGVhckxpc3RlbmVyTWlkZGxld2FyZSA9IChsaXN0ZW5lck1hcCwgZXhlY3V0aW5nTGlzdGVuZXJzKSA9PiB7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lcjIgb2YgZXhlY3V0aW5nTGlzdGVuZXJzLmtleXMoKSkge1xuICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzKGxpc3RlbmVyMik7XG4gICAgfVxuICAgIGxpc3RlbmVyTWFwLmNsZWFyKCk7XG4gIH07XG59O1xudmFyIHNhZmVseU5vdGlmeUVycm9yID0gKGVycm9ySGFuZGxlciwgZXJyb3JUb05vdGlmeSwgZXJyb3JJbmZvKSA9PiB7XG4gIHRyeSB7XG4gICAgZXJyb3JIYW5kbGVyKGVycm9yVG9Ob3RpZnksIGVycm9ySW5mbyk7XG4gIH0gY2F0Y2ggKGVycm9ySGFuZGxlckVycm9yKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvckhhbmRsZXJFcnJvcjtcbiAgICB9LCAwKTtcbiAgfVxufTtcbnZhciBhZGRMaXN0ZW5lciA9IC8qIEBfX1BVUkVfXyAqLyBhc3NpZ24oLyogQF9fUFVSRV9fICovIGNyZWF0ZUFjdGlvbihgJHthbG19L2FkZGApLCB7XG4gIHdpdGhUeXBlczogKCkgPT4gYWRkTGlzdGVuZXJcbn0pO1xudmFyIGNsZWFyQWxsTGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUFjdGlvbihgJHthbG19L3JlbW92ZUFsbGApO1xudmFyIHJlbW92ZUxpc3RlbmVyID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vcmVtb3ZlYCksIHtcbiAgd2l0aFR5cGVzOiAoKSA9PiByZW1vdmVMaXN0ZW5lclxufSk7XG52YXIgZGVmYXVsdEVycm9ySGFuZGxlciA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoYCR7YWxtfS9lcnJvcmAsIC4uLmFyZ3MpO1xufTtcbnZhciBjcmVhdGVMaXN0ZW5lck1pZGRsZXdhcmUgPSAobWlkZGxld2FyZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCBsaXN0ZW5lck1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IGV4ZWN1dGluZ0xpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IHRyYWNrRXhlY3V0aW5nTGlzdGVuZXIgPSAoZW50cnkpID0+IHtcbiAgICBjb25zdCBjb3VudCA9IGV4ZWN1dGluZ0xpc3RlbmVycy5nZXQoZW50cnkpID8/IDA7XG4gICAgZXhlY3V0aW5nTGlzdGVuZXJzLnNldChlbnRyeSwgY291bnQgKyAxKTtcbiAgfTtcbiAgY29uc3QgdW50cmFja0V4ZWN1dGluZ0xpc3RlbmVyID0gKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgY291bnQgPSBleGVjdXRpbmdMaXN0ZW5lcnMuZ2V0KGVudHJ5KSA/PyAxO1xuICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgZXhlY3V0aW5nTGlzdGVuZXJzLmRlbGV0ZShlbnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4ZWN1dGluZ0xpc3RlbmVycy5zZXQoZW50cnksIGNvdW50IC0gMSk7XG4gICAgfVxuICB9O1xuICBjb25zdCB7XG4gICAgZXh0cmEsXG4gICAgb25FcnJvciA9IGRlZmF1bHRFcnJvckhhbmRsZXJcbiAgfSA9IG1pZGRsZXdhcmVPcHRpb25zO1xuICBhc3NlcnRGdW5jdGlvbihvbkVycm9yLCBcIm9uRXJyb3JcIik7XG4gIGNvbnN0IGluc2VydEVudHJ5ID0gKGVudHJ5KSA9PiB7XG4gICAgZW50cnkudW5zdWJzY3JpYmUgPSAoKSA9PiBsaXN0ZW5lck1hcC5kZWxldGUoZW50cnkuaWQpO1xuICAgIGxpc3RlbmVyTWFwLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgIHJldHVybiAoY2FuY2VsT3B0aW9ucykgPT4ge1xuICAgICAgZW50cnkudW5zdWJzY3JpYmUoKTtcbiAgICAgIGlmIChjYW5jZWxPcHRpb25zPy5jYW5jZWxBY3RpdmUpIHtcbiAgICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICBjb25zdCBzdGFydExpc3RlbmluZyA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBmaW5kTGlzdGVuZXJFbnRyeShsaXN0ZW5lck1hcCwgb3B0aW9ucykgPz8gY3JlYXRlTGlzdGVuZXJFbnRyeShvcHRpb25zKTtcbiAgICByZXR1cm4gaW5zZXJ0RW50cnkoZW50cnkpO1xuICB9O1xuICBhc3NpZ24oc3RhcnRMaXN0ZW5pbmcsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHN0YXJ0TGlzdGVuaW5nXG4gIH0pO1xuICBjb25zdCBzdG9wTGlzdGVuaW5nID0gKG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGZpbmRMaXN0ZW5lckVudHJ5KGxpc3RlbmVyTWFwLCBvcHRpb25zKTtcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAob3B0aW9ucy5jYW5jZWxBY3RpdmUpIHtcbiAgICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICEhZW50cnk7XG4gIH07XG4gIGFzc2lnbihzdG9wTGlzdGVuaW5nLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBzdG9wTGlzdGVuaW5nXG4gIH0pO1xuICBjb25zdCBub3RpZnlMaXN0ZW5lciA9IGFzeW5jIChlbnRyeSwgYWN0aW9uLCBhcGksIGdldE9yaWdpbmFsU3RhdGUpID0+IHtcbiAgICBjb25zdCBpbnRlcm5hbFRhc2tDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRha2UgPSBjcmVhdGVUYWtlUGF0dGVybihzdGFydExpc3RlbmluZywgaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpO1xuICAgIGNvbnN0IGF1dG9Kb2luUHJvbWlzZXMgPSBbXTtcbiAgICB0cnkge1xuICAgICAgZW50cnkucGVuZGluZy5hZGQoaW50ZXJuYWxUYXNrQ29udHJvbGxlcik7XG4gICAgICB0cmFja0V4ZWN1dGluZ0xpc3RlbmVyKGVudHJ5KTtcbiAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShlbnRyeS5lZmZlY3QoXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgLy8gVXNlIGFzc2lnbigpIHJhdGhlciB0aGFuIC4uLiB0byBhdm9pZCBleHRyYSBoZWxwZXIgZnVuY3Rpb25zIGFkZGVkIHRvIGJ1bmRsZVxuICAgICAgICBhc3NpZ24oe30sIGFwaSwge1xuICAgICAgICAgIGdldE9yaWdpbmFsU3RhdGUsXG4gICAgICAgICAgY29uZGl0aW9uOiAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiB0YWtlKHByZWRpY2F0ZSwgdGltZW91dCkudGhlbihCb29sZWFuKSxcbiAgICAgICAgICB0YWtlLFxuICAgICAgICAgIGRlbGF5OiBjcmVhdGVEZWxheShpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgICAgcGF1c2U6IGNyZWF0ZVBhdXNlKGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgICBleHRyYSxcbiAgICAgICAgICBzaWduYWw6IGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIGZvcms6IGNyZWF0ZUZvcmsoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwsIGF1dG9Kb2luUHJvbWlzZXMpLFxuICAgICAgICAgIHVuc3Vic2NyaWJlOiBlbnRyeS51bnN1YnNjcmliZSxcbiAgICAgICAgICBzdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgICAgICAgIGxpc3RlbmVyTWFwLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzOiAoKSA9PiB7XG4gICAgICAgICAgICBlbnRyeS5wZW5kaW5nLmZvckVhY2goKGNvbnRyb2xsZXIsIF8sIHNldCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPT0gaW50ZXJuYWxUYXNrQ29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgbGlzdGVuZXJDYW5jZWxsZWQpO1xuICAgICAgICAgICAgICAgIHNldC5kZWxldGUoY29udHJvbGxlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGludGVybmFsVGFza0NvbnRyb2xsZXIsIGxpc3RlbmVyQ2FuY2VsbGVkKTtcbiAgICAgICAgICAgIGVudHJ5LnBlbmRpbmcuZGVsZXRlKGludGVybmFsVGFza0NvbnRyb2xsZXIpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhyb3dJZkNhbmNlbGxlZDogKCkgPT4ge1xuICAgICAgICAgICAgdmFsaWRhdGVBY3RpdmUoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgIH0gY2F0Y2ggKGxpc3RlbmVyRXJyb3IpIHtcbiAgICAgIGlmICghKGxpc3RlbmVyRXJyb3IgaW5zdGFuY2VvZiBUYXNrQWJvcnRFcnJvcikpIHtcbiAgICAgICAgc2FmZWx5Tm90aWZ5RXJyb3Iob25FcnJvciwgbGlzdGVuZXJFcnJvciwge1xuICAgICAgICAgIHJhaXNlZEJ5OiBcImVmZmVjdFwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChhdXRvSm9pblByb21pc2VzKTtcbiAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oaW50ZXJuYWxUYXNrQ29udHJvbGxlciwgbGlzdGVuZXJDb21wbGV0ZWQpO1xuICAgICAgdW50cmFja0V4ZWN1dGluZ0xpc3RlbmVyKGVudHJ5KTtcbiAgICAgIGVudHJ5LnBlbmRpbmcuZGVsZXRlKGludGVybmFsVGFza0NvbnRyb2xsZXIpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgY2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUgPSBjcmVhdGVDbGVhckxpc3RlbmVyTWlkZGxld2FyZShsaXN0ZW5lck1hcCwgZXhlY3V0aW5nTGlzdGVuZXJzKTtcbiAgY29uc3QgbWlkZGxld2FyZSA9IChhcGkpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgaWYgKCFpc0FjdGlvbihhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgIH1cbiAgICBpZiAoYWRkTGlzdGVuZXIubWF0Y2goYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXJ0TGlzdGVuaW5nKGFjdGlvbi5wYXlsb2FkKTtcbiAgICB9XG4gICAgaWYgKGNsZWFyQWxsTGlzdGVuZXJzLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZW1vdmVMaXN0ZW5lci5tYXRjaChhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gc3RvcExpc3RlbmluZyhhY3Rpb24ucGF5bG9hZCk7XG4gICAgfVxuICAgIGxldCBvcmlnaW5hbFN0YXRlID0gYXBpLmdldFN0YXRlKCk7XG4gICAgY29uc3QgZ2V0T3JpZ2luYWxTdGF0ZSA9ICgpID0+IHtcbiAgICAgIGlmIChvcmlnaW5hbFN0YXRlID09PSBJTlRFUk5BTF9OSUxfVE9LRU4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjMpIDogYCR7YWxtfTogZ2V0T3JpZ2luYWxTdGF0ZSBjYW4gb25seSBiZSBjYWxsZWQgc3luY2hyb25vdXNseWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9yaWdpbmFsU3RhdGU7XG4gICAgfTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBuZXh0KGFjdGlvbik7XG4gICAgICBpZiAobGlzdGVuZXJNYXAuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gYXBpLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyRW50cmllcyA9IEFycmF5LmZyb20obGlzdGVuZXJNYXAudmFsdWVzKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RlbmVyRW50cmllcykge1xuICAgICAgICAgIGxldCBydW5MaXN0ZW5lciA9IGZhbHNlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBydW5MaXN0ZW5lciA9IGVudHJ5LnByZWRpY2F0ZShhY3Rpb24sIGN1cnJlbnRTdGF0ZSwgb3JpZ2luYWxTdGF0ZSk7XG4gICAgICAgICAgfSBjYXRjaCAocHJlZGljYXRlRXJyb3IpIHtcbiAgICAgICAgICAgIHJ1bkxpc3RlbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBzYWZlbHlOb3RpZnlFcnJvcihvbkVycm9yLCBwcmVkaWNhdGVFcnJvciwge1xuICAgICAgICAgICAgICByYWlzZWRCeTogXCJwcmVkaWNhdGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcnVuTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub3RpZnlMaXN0ZW5lcihlbnRyeSwgYWN0aW9uLCBhcGksIGdldE9yaWdpbmFsU3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9yaWdpbmFsU3RhdGUgPSBJTlRFUk5BTF9OSUxfVE9LRU47XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWlkZGxld2FyZSxcbiAgICBzdGFydExpc3RlbmluZyxcbiAgICBzdG9wTGlzdGVuaW5nLFxuICAgIGNsZWFyTGlzdGVuZXJzOiBjbGVhckxpc3RlbmVyTWlkZGxld2FyZVxuICB9O1xufTtcblxuLy8gc3JjL2R5bmFtaWNNaWRkbGV3YXJlL2luZGV4LnRzXG52YXIgY3JlYXRlTWlkZGxld2FyZUVudHJ5ID0gKG1pZGRsZXdhcmUpID0+ICh7XG4gIG1pZGRsZXdhcmUsXG4gIGFwcGxpZWQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbn0pO1xudmFyIG1hdGNoSW5zdGFuY2UgPSAoaW5zdGFuY2VJZCkgPT4gKGFjdGlvbikgPT4gYWN0aW9uPy5tZXRhPy5pbnN0YW5jZUlkID09PSBpbnN0YW5jZUlkO1xudmFyIGNyZWF0ZUR5bmFtaWNNaWRkbGV3YXJlID0gKCkgPT4ge1xuICBjb25zdCBpbnN0YW5jZUlkID0gbmFub2lkKCk7XG4gIGNvbnN0IG1pZGRsZXdhcmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBjb25zdCB3aXRoTWlkZGxld2FyZSA9IE9iamVjdC5hc3NpZ24oY3JlYXRlQWN0aW9uKFwiZHluYW1pY01pZGRsZXdhcmUvYWRkXCIsICguLi5taWRkbGV3YXJlcykgPT4gKHtcbiAgICBwYXlsb2FkOiBtaWRkbGV3YXJlcyxcbiAgICBtZXRhOiB7XG4gICAgICBpbnN0YW5jZUlkXG4gICAgfVxuICB9KSksIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHdpdGhNaWRkbGV3YXJlXG4gIH0pO1xuICBjb25zdCBhZGRNaWRkbGV3YXJlID0gT2JqZWN0LmFzc2lnbihmdW5jdGlvbiBhZGRNaWRkbGV3YXJlMiguLi5taWRkbGV3YXJlcykge1xuICAgIG1pZGRsZXdhcmVzLmZvckVhY2goKG1pZGRsZXdhcmUyKSA9PiB7XG4gICAgICBnZXRPckluc2VydENvbXB1dGVkKG1pZGRsZXdhcmVNYXAsIG1pZGRsZXdhcmUyLCBjcmVhdGVNaWRkbGV3YXJlRW50cnkpO1xuICAgIH0pO1xuICB9LCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBhZGRNaWRkbGV3YXJlXG4gIH0pO1xuICBjb25zdCBnZXRGaW5hbE1pZGRsZXdhcmUgPSAoYXBpKSA9PiB7XG4gICAgY29uc3QgYXBwbGllZE1pZGRsZXdhcmUgPSBBcnJheS5mcm9tKG1pZGRsZXdhcmVNYXAudmFsdWVzKCkpLm1hcCgoZW50cnkpID0+IGdldE9ySW5zZXJ0Q29tcHV0ZWQoZW50cnkuYXBwbGllZCwgYXBpLCBlbnRyeS5taWRkbGV3YXJlKSk7XG4gICAgcmV0dXJuIGNvbXBvc2UoLi4uYXBwbGllZE1pZGRsZXdhcmUpO1xuICB9O1xuICBjb25zdCBpc1dpdGhNaWRkbGV3YXJlID0gaXNBbGxPZih3aXRoTWlkZGxld2FyZSwgbWF0Y2hJbnN0YW5jZShpbnN0YW5jZUlkKSk7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoYXBpKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmIChpc1dpdGhNaWRkbGV3YXJlKGFjdGlvbikpIHtcbiAgICAgIGFkZE1pZGRsZXdhcmUoLi4uYWN0aW9uLnBheWxvYWQpO1xuICAgICAgcmV0dXJuIGFwaS5kaXNwYXRjaDtcbiAgICB9XG4gICAgcmV0dXJuIGdldEZpbmFsTWlkZGxld2FyZShhcGkpKG5leHQpKGFjdGlvbik7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWlkZGxld2FyZSxcbiAgICBhZGRNaWRkbGV3YXJlLFxuICAgIHdpdGhNaWRkbGV3YXJlLFxuICAgIGluc3RhbmNlSWRcbiAgfTtcbn07XG5cbi8vIHNyYy9jb21iaW5lU2xpY2VzLnRzXG5pbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgYXMgY29tYmluZVJlZHVjZXJzMiB9IGZyb20gXCJyZWR1eFwiO1xudmFyIGlzU2xpY2VMaWtlID0gKG1heWJlU2xpY2VMaWtlKSA9PiBcInJlZHVjZXJQYXRoXCIgaW4gbWF5YmVTbGljZUxpa2UgJiYgdHlwZW9mIG1heWJlU2xpY2VMaWtlLnJlZHVjZXJQYXRoID09PSBcInN0cmluZ1wiO1xudmFyIGdldFJlZHVjZXJzID0gKHNsaWNlcykgPT4gc2xpY2VzLmZsYXRNYXAoKHNsaWNlT3JNYXApID0+IGlzU2xpY2VMaWtlKHNsaWNlT3JNYXApID8gW1tzbGljZU9yTWFwLnJlZHVjZXJQYXRoLCBzbGljZU9yTWFwLnJlZHVjZXJdXSA6IE9iamVjdC5lbnRyaWVzKHNsaWNlT3JNYXApKTtcbnZhciBPUklHSU5BTF9TVEFURSA9IFN5bWJvbC5mb3IoXCJydGstc3RhdGUtcHJveHktb3JpZ2luYWxcIik7XG52YXIgaXNTdGF0ZVByb3h5ID0gKHZhbHVlKSA9PiAhIXZhbHVlICYmICEhdmFsdWVbT1JJR0lOQUxfU1RBVEVdO1xudmFyIHN0YXRlUHJveHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBjcmVhdGVTdGF0ZVByb3h5ID0gKHN0YXRlLCByZWR1Y2VyTWFwLCBpbml0aWFsU3RhdGVDYWNoZSkgPT4gZ2V0T3JJbnNlcnRDb21wdXRlZChzdGF0ZVByb3h5TWFwLCBzdGF0ZSwgKCkgPT4gbmV3IFByb3h5KHN0YXRlLCB7XG4gIGdldDogKHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAocHJvcCA9PT0gT1JJR0lOQUxfU1RBVEUpIHJldHVybiB0YXJnZXQ7XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGluaXRpYWxTdGF0ZUNhY2hlW3Byb3BdO1xuICAgICAgaWYgKHR5cGVvZiBjYWNoZWQgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBjYWNoZWQ7XG4gICAgICBjb25zdCByZWR1Y2VyID0gcmVkdWNlck1hcFtwcm9wXTtcbiAgICAgIGlmIChyZWR1Y2VyKSB7XG4gICAgICAgIGNvbnN0IHJlZHVjZXJSZXN1bHQgPSByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgICAgIHR5cGU6IG5hbm9pZCgpXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHJlZHVjZXJSZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNCkgOiBgVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7cHJvcC50b1N0cmluZygpfVwiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIGNhbGxlZCBmb3Igc2VsZWN0b3IoKS4gSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgeW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpbml0aWFsU3RhdGVDYWNoZVtwcm9wXSA9IHJlZHVjZXJSZXN1bHQ7XG4gICAgICAgIHJldHVybiByZWR1Y2VyUmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KSk7XG52YXIgb3JpZ2luYWwgPSAoc3RhdGUpID0+IHtcbiAgaWYgKCFpc1N0YXRlUHJveHkoc3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjUpIDogXCJvcmlnaW5hbCBtdXN0IGJlIHVzZWQgb24gc3RhdGUgUHJveHlcIik7XG4gIH1cbiAgcmV0dXJuIHN0YXRlW09SSUdJTkFMX1NUQVRFXTtcbn07XG52YXIgZW1wdHlPYmplY3QgPSB7fTtcbnZhciBub29wUmVkdWNlciA9IChzdGF0ZSA9IGVtcHR5T2JqZWN0KSA9PiBzdGF0ZTtcbmZ1bmN0aW9uIGNvbWJpbmVTbGljZXMoLi4uc2xpY2VzKSB7XG4gIGNvbnN0IHJlZHVjZXJNYXAgPSBPYmplY3QuZnJvbUVudHJpZXMoZ2V0UmVkdWNlcnMoc2xpY2VzKSk7XG4gIGNvbnN0IGdldFJlZHVjZXIgPSAoKSA9PiBPYmplY3Qua2V5cyhyZWR1Y2VyTWFwKS5sZW5ndGggPyBjb21iaW5lUmVkdWNlcnMyKHJlZHVjZXJNYXApIDogbm9vcFJlZHVjZXI7XG4gIGxldCByZWR1Y2VyID0gZ2V0UmVkdWNlcigpO1xuICBmdW5jdGlvbiBjb21iaW5lZFJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgIHJldHVybiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICB9XG4gIGNvbWJpbmVkUmVkdWNlci53aXRoTGF6eUxvYWRlZFNsaWNlcyA9ICgpID0+IGNvbWJpbmVkUmVkdWNlcjtcbiAgY29uc3QgaW5pdGlhbFN0YXRlQ2FjaGUgPSB7fTtcbiAgY29uc3QgaW5qZWN0ID0gKHNsaWNlLCBjb25maWcgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlZHVjZXJQYXRoLFxuICAgICAgcmVkdWNlcjogcmVkdWNlclRvSW5qZWN0XG4gICAgfSA9IHNsaWNlO1xuICAgIGNvbnN0IGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlck1hcFtyZWR1Y2VyUGF0aF07XG4gICAgaWYgKCFjb25maWcub3ZlcnJpZGVFeGlzdGluZyAmJiBjdXJyZW50UmVkdWNlciAmJiBjdXJyZW50UmVkdWNlciAhPT0gcmVkdWNlclRvSW5qZWN0KSB7XG4gICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBjYWxsZWQgXFxgaW5qZWN0XFxgIHRvIG92ZXJyaWRlIGFscmVhZHktZXhpc3RpbmcgcmVkdWNlciAke3JlZHVjZXJQYXRofSB3aXRob3V0IHNwZWNpZnlpbmcgXFxgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZVxcYGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWJpbmVkUmVkdWNlcjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5vdmVycmlkZUV4aXN0aW5nICYmIGN1cnJlbnRSZWR1Y2VyICE9PSByZWR1Y2VyVG9JbmplY3QpIHtcbiAgICAgIGRlbGV0ZSBpbml0aWFsU3RhdGVDYWNoZVtyZWR1Y2VyUGF0aF07XG4gICAgfVxuICAgIHJlZHVjZXJNYXBbcmVkdWNlclBhdGhdID0gcmVkdWNlclRvSW5qZWN0O1xuICAgIHJlZHVjZXIgPSBnZXRSZWR1Y2VyKCk7XG4gICAgcmV0dXJuIGNvbWJpbmVkUmVkdWNlcjtcbiAgfTtcbiAgY29uc3Qgc2VsZWN0b3IgPSBPYmplY3QuYXNzaWduKGZ1bmN0aW9uIG1ha2VTZWxlY3RvcihzZWxlY3RvckZuLCBzZWxlY3RTdGF0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBzZWxlY3RvcjIoc3RhdGUsIC4uLmFyZ3MpIHtcbiAgICAgIHJldHVybiBzZWxlY3RvckZuKGNyZWF0ZVN0YXRlUHJveHkoc2VsZWN0U3RhdGUgPyBzZWxlY3RTdGF0ZShzdGF0ZSwgLi4uYXJncykgOiBzdGF0ZSwgcmVkdWNlck1hcCwgaW5pdGlhbFN0YXRlQ2FjaGUpLCAuLi5hcmdzKTtcbiAgICB9O1xuICB9LCB7XG4gICAgb3JpZ2luYWxcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKGNvbWJpbmVkUmVkdWNlciwge1xuICAgIGluamVjdCxcbiAgICBzZWxlY3RvclxuICB9KTtcbn1cblxuLy8gc3JjL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UudHNcbmZ1bmN0aW9uIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoY29kZSkge1xuICByZXR1cm4gYE1pbmlmaWVkIFJlZHV4IFRvb2xraXQgZXJyb3IgIyR7Y29kZX07IHZpc2l0IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvRXJyb3JzP2NvZGU9JHtjb2RlfSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiBgO1xufVxuZXhwb3J0IHtcbiAgUmVkdWNlclR5cGUsXG4gIFNIT1VMRF9BVVRPQkFUQ0gsXG4gIFRhc2tBYm9ydEVycm9yLFxuICBUdXBsZSxcbiAgYWRkTGlzdGVuZXIsXG4gIGFzeW5jVGh1bmtDcmVhdG9yLFxuICBhdXRvQmF0Y2hFbmhhbmNlcixcbiAgYnVpbGRDcmVhdGVTbGljZSxcbiAgY2xlYXJBbGxMaXN0ZW5lcnMsXG4gIGNvbWJpbmVTbGljZXMsXG4gIGNvbmZpZ3VyZVN0b3JlLFxuICBjcmVhdGVBY3Rpb24sXG4gIGNyZWF0ZUFjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlLFxuICBjcmVhdGVBc3luY1RodW5rLFxuICBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcixcbiAgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JDcmVhdG9yLFxuICBjcmVhdGVEeW5hbWljTWlkZGxld2FyZSxcbiAgY3JlYXRlRW50aXR5QWRhcHRlcixcbiAgY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLFxuICBjcmVhdGVMaXN0ZW5lck1pZGRsZXdhcmUsXG4gIHByb2R1Y2UgYXMgY3JlYXRlTmV4dFN0YXRlLFxuICBjcmVhdGVSZWR1Y2VyLFxuICBjcmVhdGVTZWxlY3RvcixcbiAgY3JlYXRlU2VsZWN0b3JDcmVhdG9yLFxuICBjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUsXG4gIGNyZWF0ZVNsaWNlLFxuICBjdXJyZW50LFxuICBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUsXG4gIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UsXG4gIGZyZWV6ZSxcbiAgaXNBY3Rpb25DcmVhdG9yLFxuICBpc0FsbE9mLFxuICBpc0FueU9mLFxuICBpc0FzeW5jVGh1bmtBY3Rpb24sXG4gIGlzRHJhZnQsXG4gIGlzRlNBIGFzIGlzRmx1eFN0YW5kYXJkQWN0aW9uLFxuICBpc0Z1bGZpbGxlZCxcbiAgaXNJbW11dGFibGVEZWZhdWx0LFxuICBpc1BlbmRpbmcsXG4gIGlzUGxhaW4sXG4gIGlzUmVqZWN0ZWQsXG4gIGlzUmVqZWN0ZWRXaXRoVmFsdWUsXG4gIGxydU1lbW9pemUsXG4gIG1pbmlTZXJpYWxpemVFcnJvcixcbiAgbmFub2lkLFxuICBvcmlnaW5hbDIgYXMgb3JpZ2luYWwsXG4gIHByZXBhcmVBdXRvQmF0Y2hlZCxcbiAgcmVtb3ZlTGlzdGVuZXIsXG4gIHVud3JhcFJlc3VsdCxcbiAgd2Vha01hcE1lbW9pemVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1eC10b29sa2l0Lm1vZGVybi5tanMubWFwIiwiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNuYWNrYmFyIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TdG9yZSB9IGZyb20gJy4vYXBwbGljYXRpb24tc3RvcmUnO1xudmFyIFNuYWNrYmFyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmV4cG9ydCB2YXIgU25hY2tiYXJQcm92aWRlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuO1xuICAgIHZhciBzbmFja2JhciA9IEFwcGxpY2F0aW9uU3RvcmUudXNlU3RhdGUoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMuc25hY2tiYXI7IH0pO1xuICAgIHZhciBzaG93U25hY2tiYXIgPSBmdW5jdGlvbiAobWVzc2FnZSwgc2V2ZXJpdHkpIHtcbiAgICAgICAgaWYgKHNldmVyaXR5ID09PSB2b2lkIDApIHsgc2V2ZXJpdHkgPSAnaW5mbyc7IH1cbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiAoX2pzeHMoU25hY2tiYXJDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiB7IHNob3dTbmFja2Jhcjogc2hvd1NuYWNrYmFyIH0sIGNoaWxkcmVuOiBbY2hpbGRyZW4sIF9qc3goU25hY2tiYXIsIHsgb3Blbjogc25hY2tiYXIub3BlbiwgbWVzc2FnZTogc25hY2tiYXIubWVzc2FnZSwgc2V2ZXJpdHk6IHNuYWNrYmFyLnNldmVyaXR5LCBhdXRvSGlkZUR1cmF0aW9uOiAxNTAwLCBvbkNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSB9KV0gfSkpO1xufTtcbiIsImltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMsIGNvbmZpZ3VyZVN0b3JlLCB9IGZyb20gJ0ByZWR1eGpzL3Rvb2xraXQnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUXVlcnlDbGllbnQsIFF1ZXJ5Q2xpZW50UHJvdmlkZXIgfSBmcm9tICdyZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IEJyb3dzZXJSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCB7IGluc3RpdHV0aW9uQ29kZSwgdGVuYW50Q29kZSwgd29ya3NwYWNlIH0gZnJvbSAnLi4vdXRpbHMvY29uc3RhbnRzJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dQcm92aWRlciB9IGZyb20gJy4vQ29uZmlybURpYWxvZ1Byb3ZpZGVyJztcbmltcG9ydCB7IFNuYWNrYmFyUHJvdmlkZXIgfSBmcm9tICcuL1NuYWNrYmFyUHJvdmlkZXInO1xuLy8gV2UnbGwgYWRkIHRoaXMgZXhwb3J0IHRvIGVuc3VyZSBSb3V0ZXIgaXMgcHJvcGVybHkgZXhwb3J0ZWRcbmV4cG9ydCB7IEJyb3dzZXJSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmV4cG9ydCB2YXIgUHJvdmlkZXJzID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIGJhc2VuYW1lID0gX2EuYmFzZW5hbWUsIF9iID0gX2EucmVkdWNlcnMsIHJlZHVjZXJzID0gX2IgPT09IHZvaWQgMCA/IHt9IDogX2I7XG4gICAgdmFyIHF1ZXJ5Q2xpZW50ID0gbmV3IFF1ZXJ5Q2xpZW50KHtcbiAgICAgICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgICAgICAgIHF1ZXJpZXM6IHtcbiAgICAgICAgICAgICAgICByZWZldGNoT25XaW5kb3dGb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmV0cnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHVzZUVycm9yQm91bmRhcnk6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHZhciBiYXNlTmFtZSA9IHRlbmFudENvZGUgJiYgaW5zdGl0dXRpb25Db2RlICYmIHdvcmtzcGFjZVxuICAgICAgICA/IFwiL1wiLmNvbmNhdChpbnN0aXR1dGlvbkNvZGUsIFwiL1wiKS5jb25jYXQod29ya3NwYWNlKVxuICAgICAgICA6ICcvJztcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lID09PSAnLycgJiZcbiAgICAgICAgICAgIGluc3RpdHV0aW9uQ29kZSAmJlxuICAgICAgICAgICAgd29ya3NwYWNlICYmXG4gICAgICAgICAgICB0ZW5hbnRDb2RlKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvXCIuY29uY2F0KGluc3RpdHV0aW9uQ29kZSwgXCIvXCIpLmNvbmNhdCh3b3Jrc3BhY2UpKTtcbiAgICAgICAgfVxuICAgIH0sIFtpbnN0aXR1dGlvbkNvZGUsIHRlbmFudENvZGUsIHdvcmtzcGFjZV0pO1xuICAgIHZhciBzdG9yZSA9IGNvbmZpZ3VyZVN0b3JlKHtcbiAgICAgICAgcmVkdWNlcjogY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSxcbiAgICB9KTtcbiAgICByZXR1cm4gKF9qc3goUHJvdmlkZXIsIHsgc3RvcmU6IHN0b3JlLCBjaGlsZHJlbjogX2pzeChCcm93c2VyUm91dGVyLCB7IGJhc2VuYW1lOiBiYXNlbmFtZSAhPT0gbnVsbCAmJiBiYXNlbmFtZSAhPT0gdm9pZCAwID8gYmFzZW5hbWUgOiBiYXNlTmFtZSwgY2hpbGRyZW46IF9qc3goUXVlcnlDbGllbnRQcm92aWRlciwgeyBjbGllbnQ6IHF1ZXJ5Q2xpZW50LCBjaGlsZHJlbjogX2pzeChTbmFja2JhclByb3ZpZGVyLCB7IGNoaWxkcmVuOiBfanN4KENvbmZpcm1EaWFsb2dQcm92aWRlciwgeyBjaGlsZHJlbjogY2hpbGRyZW4gfSkgfSkgfSkgfSkgfSkpO1xufTtcbiIsImltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L2FwcGxpY2F0aW9uLXN0b3JlJztcbnZhciBkZWZhdWx0Q29uZmlybURpYWxvZ1N0YXRlID0ge1xuICAgIGlzT3BlbjogZmFsc2UsXG4gICAgdGl0bGU6ICcnLFxuICAgIG1lc3NhZ2U6ICcnLFxuICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnJyxcbiAgICBjYW5jZWxCdXR0b25UZXh0OiAnJyxcbiAgICB0eXBlOiAnY29uZmlybScsXG4gICAgb25Db25maXJtOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgb25DYW5jZWw6IGZ1bmN0aW9uICgpIHsgfSxcbn07XG5leHBvcnQgdmFyIHVzZUNvbmZpcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlzQ29uZmlybWVkID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciB0aXRsZSA9IF9hLnRpdGxlLCBtZXNzYWdlID0gX2EubWVzc2FnZSwgY29uZmlybUJ1dHRvblRleHQgPSBfYS5jb25maXJtQnV0dG9uVGV4dCwgY2FuY2VsQnV0dG9uVGV4dCA9IF9hLmNhbmNlbEJ1dHRvblRleHQsIF9iID0gX2EudHlwZSwgdHlwZSA9IF9iID09PSB2b2lkIDAgPyAnY29uZmlybScgOiBfYjtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgIHMuY29uZmlybURpYWxvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBjb25maXJtQnV0dG9uVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogY2FuY2VsQnV0dG9uVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXREaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXREaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIHJlc2V0RGlhbG9nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5jb25maXJtRGlhbG9nID0gZGVmYXVsdENvbmZpcm1EaWFsb2dTdGF0ZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gaXNDb25maXJtZWQ7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBNdWx0aVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBEZXBhcnRtZW50TW9uZ29NdWx0aVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KE11bHRpU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAndHlwZScsXG4gICAgICAgICAgICB1c2VTdWJMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ19pZCcsXG4gICAgICAgICAgICBpc09iamVjdElkOiB0cnVlLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IG5vbldvcmtzcGFjZUF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9kZXBhcnRtZW50c1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBNdWx0aVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBEZXBhcnRtZW50U3FsTXVsdGlTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChNdWx0aVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3R5cGUnLFxuICAgICAgICAgICAgdXNlU3ViTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgICAgICBpc0ludDogdHJ1ZSxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBub25Xb3Jrc3BhY2VBeGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvZGVwYXJ0bWVudHMtc3FsXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBCYXRjaFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJCYXRjaFwiIH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9iYXRjaGVzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBDb3Vyc2VTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ2NvdXJzZU5hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICdsZXZlbCcsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2NvdXJzZXNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIERlcGFydG1lbnRTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICd0eXBlJyxcbiAgICAgICAgICAgIHVzZVN1YkxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnX2lkJyxcbiAgICAgICAgICAgIGlzT2JqZWN0SWQ6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogbm9uV29ya3NwYWNlQXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2RlcGFydG1lbnRzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBFbXBsb3llZXNTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ19pZCcsXG4gICAgICAgICAgICBpc09iamVjdElkOiB0cnVlLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnZnVsbE5hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICdlbXBsb3llZUlkJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvZW1wbG95ZWVzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBFeGFtc1JlZ3VsYXRpb25TZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIlJlZ3VsYXRpb25cIiB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvZXhhbS1yZWd1bGF0aW9uc1wiLCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgbGFiZWxLZXk6ICdyLm5hbWUnLFxuICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICB2YWx1ZUtleTogJ3IubmFtZScsXG4gICAgfSB9KSkpOyB9O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbnZhciBleGFtVHlwZU9wdGlvbnMgPSBbXG4gICAgeyBsYWJlbDogJ0FsbCcsIHZhbHVlOiBudWxsIH0sXG4gICAgeyBsYWJlbDogJ1JFR1VMQVInLCB2YWx1ZTogJ1InIH0sXG4gICAgeyBsYWJlbDogJ1NVUFBMRU1FTlRBUlknLCB2YWx1ZTogJ1MnIH0sXG5dO1xuZXhwb3J0IHZhciBFeGFtVHlwZVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7IHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiRXhhbSBUeXBlXCIsIG9wdGlvbnM6IGV4YW1UeXBlT3B0aW9ucyB9LCBwcm9wcykpKTsgfTtcbiIsImV4cG9ydCB2YXIgRmVlVHlwZXMgPSBbXG4gICAge1xuICAgICAgICBsYWJlbDogJ1R1aXRpb24gRmVlJyxcbiAgICAgICAgdmFsdWU6ICd0dWl0aW9uX2ZlZScsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnQWRtaXNzaW9uIEZlZScsXG4gICAgICAgIHZhbHVlOiAnYWRtaXNzaW9uX2ZlZScsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnSG9zdGVsIEZlZScsXG4gICAgICAgIHZhbHVlOiAnaG9zdGVsX2ZlZScsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnVHJhbnNwb3J0IEZlZScsXG4gICAgICAgIHZhbHVlOiAndHJhbnNwb3J0X2ZlZScsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnRXhhbSBGZWUnLFxuICAgICAgICB2YWx1ZTogJ2V4YW1fZmVlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbGFiZWw6ICdPdGhlciBGZWUnLFxuICAgICAgICB2YWx1ZTogJ290aGVyX2ZlZScsXG4gICAgfSxcbl07XG5leHBvcnQgdmFyIHllYXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogNiB9LCBmdW5jdGlvbiAoXywgaSkge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBpO1xufSk7XG5leHBvcnQgdmFyIGJhdGNoT3B0aW9ucyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDEyIH0sIGZ1bmN0aW9uIChfLCBpKSB7IHJldHVybiAoe1xuICAgIGxhYmVsOiBcIlwiLmNvbmNhdChuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBpLCBcIiAtIFwiKS5jb25jYXQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gaSArIDEpLFxuICAgIHZhbHVlOiBcIlwiLmNvbmNhdChuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBpLCBcIiAtIFwiKS5jb25jYXQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gaSArIDEpLFxufSk7IH0pO1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IEZlZVR5cGVzIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgdmFyIEZlZVR5cGVTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiRmVlIFR5cGVcIiwgb3B0aW9uczogRmVlVHlwZXMgPT09IG51bGwgfHwgRmVlVHlwZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEZlZVR5cGVzLm1hcChmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IGl0ZW0udmFsdWUsXG4gICAgICAgIH0pOyB9KSB9LCBwcm9wcykpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBIb3N0ZWxCbG9ja1NlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICAgICAgaXNJbnQ6IHRydWUsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAndHlwZScsXG4gICAgICAgICAgICB1c2VMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZVN1YkxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9ob3N0ZWwtYmxvY2tzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBIb3N0ZWxGbG9vclNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJIb3N0ZWwgUm9vbSBOby5cIiwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2Zsb29yJyxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ2Zsb29yJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9mbG9vcnNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEhvc3RlbFJvb21TZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiSG9zdGVsIFJvb21cIiwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ3Jvb21fbnVtYmVyJyxcbiAgICAgICAgICAgIHVzZUxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICAgICAgLy8gc3ViTGFiZWxLZXk6ICdmbG9vcicsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9ob3N0ZWwtcm9vbXNcIiwgZXh0ZXJuYWxBeGlvczogYXhpb3MgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBNb250aFllYXJTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIk1vbnRoICYgWWVhclwiIH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9tb250aC15ZWFyc1wiIH0pKSk7IH07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBQcmludEZvcm1hdFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3R5cGUnLFxuICAgICAgICAgICAgdXNlU3ViTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3ByaW50LWZvcm1hdHNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFByb2dyYW1TZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ2JyYW5jaENvZGUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICdicmFuY2hEaXNwbGF5JyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvcHJvZ3JhbXNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFJlZ3VsYXRpb25TZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiUmVndWxhdGlvblwiLCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAncmVndWxhdGlvbl9pZCcsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdyLm5hbWUnLFxuICAgICAgICB9IH0sIHByb3BzLCB7IG9wdGlvbnNBcGlFbmRQb2ludDogXCJkcm9wZG93bnMvcmVndWxhdGlvbnNcIiwgZXh0ZXJuYWxBeGlvczogYXhpb3MgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBSZXNlYXJjaEV4cGVydERlc2lnbmF0aW9uU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgICAgIGlzSW50OiB0cnVlLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IG5vbldvcmtzcGFjZUF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9yZXNlYXJjaC1leHBlcnQtZGVzaWduYXRpb25zXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBSZXNlYXJjaEV4cGVydFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgLy8gZGJMVmFsdWVQcm9wcyBhcmUgbm90IGJlaW5nIHVzZWQgaW4gYmFja2VuZC5cbiAgICAvLyBkYkxhYmVsUHJvcHMuc2VhcmNoLCBsaW1pdCwgb2Zmc2V0IGFyZSBiZWluZyB1c2VkIGluIGJhY2tlbmQuXG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3R5cGUnLFxuICAgICAgICB9IH0sIHByb3BzLCB7IG9wdGlvbnNBcGlFbmRQb2ludDogXCJkcm9wZG93bnMvcmVzZWFyY2gtZXhwZXJ0c1wiLCBleHRlcm5hbEF4aW9zOiBub25Xb3Jrc3BhY2VBeGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFJlc2VhcmNoU3RhZ2VTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIC8vIEVzY2FwZSAnb3JkZXInIGNvbHVtbiBuYW1lIGFzIGl0J3MgYSByZXNlcnZlZCBrZXl3b3JkIGluIE15U1FMXG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICAgICAgaXNJbnQ6IHRydWUsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAnYG9yZGVyYCcsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9yZXNlYXJjaC1zdGFnZXNcIiwgZXh0ZXJuYWxBeGlvczogbm9uV29ya3NwYWNlQXhpb3MgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBTZW1lc3RlclNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3llYXInLFxuICAgICAgICB9IH0sIHByb3BzLCB7IG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3NlbWVzdGVyc1wiLCBleHRlcm5hbEF4aW9zOiBheGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFN0dWRlbnRTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ3NsdWcnLFxuICAgICAgICAgICAgdXNlTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3N0dWRlbnRzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBTdHVkZW50U2VydmljZXNTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ3NsdWcnLFxuICAgICAgICAgICAgdXNlTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3N0dWRlbnQtc2VydmljZXNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IHllYXJzIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgdmFyIFllYXJSYW5nZVNlbGVjdG9yID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iID0gX2Euc3VmZml4LCBzdWZmaXggPSBfYiA9PT0gdm9pZCAwID8gbnVsbCA6IF9iLCBfYyA9IF9hLnZhbHVlS2V5LCB2YWx1ZUtleSA9IF9jID09PSB2b2lkIDAgPyAneWVhclJhbmdlJyA6IF9jLCBwcm9wcyA9IF9fcmVzdChfYSwgW1wic3VmZml4XCIsIFwidmFsdWVLZXlcIl0pO1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiWWVhciBSYW5nZVwiLCBvcHRpb25zOiB5ZWFycyA9PT0gbnVsbCB8fCB5ZWFycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogeWVhcnMubWFwKGZ1bmN0aW9uICh5ZWFyKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgbGFiZWw6IHN1ZmZpeFxuICAgICAgICAgICAgICAgID8gXCJcIi5jb25jYXQoc3VmZml4LCBcIiBcIikuY29uY2F0KHllYXIsIFwiIC0gXCIpLmNvbmNhdCh5ZWFyICsgMSlcbiAgICAgICAgICAgICAgICA6IFwiXCIuY29uY2F0KHllYXIsIFwiIC0gXCIpLmNvbmNhdCh5ZWFyICsgMSksXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVLZXkgPT09ICd5ZWFyUmFuZ2UnID8gXCJcIi5jb25jYXQoeWVhciwgXCIgLSBcIikuY29uY2F0KHllYXIgKyAxKSA6IHllYXIsXG4gICAgICAgIH0pOyB9KSB9LCBwcm9wcykpKTtcbn07XG4iLCJleHBvcnQgdmFyIG9wZW5Jbk5ld1RhYiA9IGZ1bmN0aW9uIChwYXRoQWZ0ZXJCYXNlLCBleGNsdWRlSW5zdGl0dXRpb24sIGV4Y2x1ZGVXb3Jrc3BhY2UpIHtcbiAgICBpZiAoZXhjbHVkZUluc3RpdHV0aW9uID09PSB2b2lkIDApIHsgZXhjbHVkZUluc3RpdHV0aW9uID0gZmFsc2U7IH1cbiAgICBpZiAoZXhjbHVkZVdvcmtzcGFjZSA9PT0gdm9pZCAwKSB7IGV4Y2x1ZGVXb3Jrc3BhY2UgPSBmYWxzZTsgfVxuICAgIHZhciBjdXJyZW50UGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICB2YXIgc2VnbWVudHMgPSBjdXJyZW50UGF0aC5zcGxpdCgnLycpO1xuICAgIC8vIEJ1aWxkIGJhc2UgcGF0aCBiYXNlZCBvbiBleGNsdXNpb24gZmxhZ3NcbiAgICB2YXIgYmFzZVBhcnRzID0gW107XG4gICAgLy8gQWRkIHNlZ21lbnQgMSAoaW5zdGl0dXRpb24pIHVubGVzcyBleGNsdWRlZFxuICAgIGlmICghZXhjbHVkZUluc3RpdHV0aW9uICYmIHNlZ21lbnRzWzFdKSB7XG4gICAgICAgIGJhc2VQYXJ0cy5wdXNoKHNlZ21lbnRzWzFdKTtcbiAgICB9XG4gICAgLy8gQWRkIHNlZ21lbnQgMiAod29ya3NwYWNlKSB1bmxlc3MgZXhjbHVkZWRcbiAgICBpZiAoIWV4Y2x1ZGVXb3Jrc3BhY2UgJiYgc2VnbWVudHNbMl0pIHtcbiAgICAgICAgYmFzZVBhcnRzLnB1c2goc2VnbWVudHNbMl0pO1xuICAgIH1cbiAgICB2YXIgYmFzZSA9IGJhc2VQYXJ0cy5sZW5ndGggPiAwID8gJy8nICsgYmFzZVBhcnRzLmpvaW4oJy8nKSA6ICcnO1xuICAgIC8vIENvbnN0cnVjdCBmdWxsIFVSTCBhbmQgb3BlbiBpbiBuZXcgdGFiXG4gICAgdmFyIGZ1bGxQYXRoID0gXCJcIi5jb25jYXQod2luZG93LmxvY2F0aW9uLm9yaWdpbikuY29uY2F0KGJhc2UsIFwiL1wiKS5jb25jYXQocGF0aEFmdGVyQmFzZSk7XG4gICAgd2luZG93Lm9wZW4oZnVsbFBhdGgsICdfYmxhbmsnKTtcbn07XG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgRXhvdGVsQ1JNV2ViU0RLIGZyb20gJ0BleG90ZWwtbnBtLWRldi9leG90ZWwtaXAtY2FsbGluZy1jcm0td2Vic2RrJztcbnZhciBFeG90ZWxTZXJ2aWNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV4b3RlbFNlcnZpY2UoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZXhvdGVsU0RLID0gbnVsbDtcbiAgICAgICAgdGhpcy53ZWJQaG9uZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FsbExpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5yZWdpc3Rlckxpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uTGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25TdGF0dXMgPSAndW5rbm93bic7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2FsbEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBjYWxsRGF0YSkge1xuICAgICAgICAgICAgX3RoaXMuY2FsbExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gbGlzdGVuZXIoZXZlbnQsIGNhbGxEYXRhKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlUmVnaXN0ZXJFdmVudCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICAgICAgX3RoaXMucmVnaXN0ZXJMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyKHN0YXRlKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlU2Vzc2lvbkV2ZW50ID0gZnVuY3Rpb24gKHN0YXRlLCBkYXRhKSB7XG4gICAgICAgICAgICBfdGhpcy5zZXNzaW9uTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBsaXN0ZW5lcihzdGF0ZSwgZGF0YSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBFeG90ZWxTZXJ2aWNlLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIUV4b3RlbFNlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEV4b3RlbFNlcnZpY2UuaW5zdGFuY2UgPSBuZXcgRXhvdGVsU2VydmljZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFeG90ZWxTZXJ2aWNlLmluc3RhbmNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgRXhvdGVsIFNES1xuICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIFRoZSBhY2Nlc3MgdG9rZW4gZm9yIGF1dGhlbnRpY2F0aW9uXG4gICAgICogQHBhcmFtIGFnZW50VXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIGFnZW50XG4gICAgICogQHBhcmFtIGF1dG9Db25uZWN0Vk9JUCAtIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBjb25uZWN0IFZPSVAgKGRlZmF1bHQ6IHRydWUpXG4gICAgICogQHJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3NcbiAgICAgKi9cbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKGFjY2Vzc1Rva2VuXzEsIGFnZW50VXNlcklkXzEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24gKGFjY2Vzc1Rva2VuLCBhZ2VudFVzZXJJZCwgYXV0b0Nvbm5lY3RWT0lQKSB7XG4gICAgICAgICAgICB2YXIgcGhvbmUsIGVycm9yXzE7XG4gICAgICAgICAgICBpZiAoYXV0b0Nvbm5lY3RWT0lQID09PSB2b2lkIDApIHsgYXV0b0Nvbm5lY3RWT0lQID0gdHJ1ZTsgfVxuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2hlY2tBdWRpb1Blcm1pc3Npb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4b3RlbFNESyA9IG5ldyBFeG90ZWxDUk1XZWJTREsoYWNjZXNzVG9rZW4sIGFnZW50VXNlcklkLCBhdXRvQ29ubmVjdFZPSVApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leG90ZWxTREsuSW5pdGlhbGl6ZSh0aGlzLmhhbmRsZUNhbGxFdmVudCwgdGhpcy5oYW5kbGVSZWdpc3RlckV2ZW50LCB0aGlzLmhhbmRsZVNlc3Npb25FdmVudCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUGhvbmUgPSBwaG9uZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sICEhdGhpcy53ZWJQaG9uZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBFeG90ZWwgU0RLOicsIGVycm9yXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGZhbHNlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUuY2hlY2tBdWRpb1Blcm1pc3Npb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGV2aWNlcywgaGFzQXVkaW9EZXZpY2UsIHBlcm1pc3Npb25TdGF0dXNfMSwgZXJyb3JfMiwgZXJyb3JfMztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDYsICwgN10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXVkaW9EZXZpY2UgPSBkZXZpY2VzLnNvbWUoZnVuY3Rpb24gKGRldmljZSkgeyByZXR1cm4gZGV2aWNlLmtpbmQgPT09ICdhdWRpb2lucHV0JzsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0F1ZGlvRGV2aWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gYXVkaW8gaW5wdXQgZGV2aWNlcyBmb3VuZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblN0YXR1cyA9ICdkZW5pZWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmYWxzZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShuYXZpZ2F0b3IucGVybWlzc2lvbnMgJiYgbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMiwgNCwgLCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbWljcm9waG9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uU3RhdHVzXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25TdGF0dXMgPSBwZXJtaXNzaW9uU3RhdHVzXzEuc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uU3RhdHVzXzEub25jaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucGVybWlzc2lvblN0YXR1cyA9IHBlcm1pc3Npb25TdGF0dXNfMS5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcGVybWlzc2lvblN0YXR1c18xLnN0YXRlID09PSAnZ3JhbnRlZCddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgcXVlcnkgcGVybWlzc2lvbiBzdGF0dXM6JywgZXJyb3JfMik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzIgLypyZXR1cm4qLywgdHJ1ZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjaGVja2luZyBhdWRpbyBwZXJtaXNzaW9uczonLCBlcnJvcl8zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmYWxzZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnJlcXVlc3RNaWNyb3Bob25lQWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3RyZWFtLCBlcnJvcl80O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAyLCAsIDNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHsgcmV0dXJuIHRyYWNrLnN0b3AoKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25TdGF0dXMgPSAnZ3JhbnRlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdHJ1ZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZ2V0IG1pY3JvcGhvbmUgYWNjZXNzOicsIGVycm9yXzQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uU3RhdHVzID0gJ2RlbmllZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZmFsc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5tYWtlQ2FsbCA9IGZ1bmN0aW9uIChwaG9uZU51bWJlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy53ZWJQaG9uZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1dlYiBwaG9uZSBub3QgaW5pdGlhbGl6ZWQnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMud2ViUGhvbmUuTWFrZUNhbGwocGhvbmVOdW1iZXIsIGZ1bmN0aW9uIChzdGF0dXMsIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5hY2NlcHRDYWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZ3JhbnRlZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy53ZWJQaG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViIHBob25lIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5wZXJtaXNzaW9uU3RhdHVzICE9PSAnZ3JhbnRlZCcpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYW50ZWQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdyYW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pY3JvcGhvbmUgYWNjZXNzIGRlbmllZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYlBob25lLkFjY2VwdENhbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5oYW5ndXBDYWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMud2ViUGhvbmUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5IYW5ndXBDYWxsKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWplY3QgYW4gaW5jb21pbmcgY2FsbCBiZWZvcmUgYWNjZXB0aW5nIGl0LlxuICAgICAqIE5vdGU6IEV4b3RlbCBTREsgb25seSBoYXMgSGFuZ3VwQ2FsbCAtIG5vIHNlcGFyYXRlIFJlamVjdENhbGwgbWV0aG9kLlxuICAgICAqIEhhbmd1cENhbGwgaW50ZXJuYWxseSBjYWxscyB3ZWJydGNTSVBQaG9uZS5yZWplY3RDYWxsKCkgLT4gcGhvbmUuc2lwSGFuZ1VwKClcbiAgICAgKi9cbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5yZWplY3RDYWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMud2ViUGhvbmUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5IYW5ndXBDYWxsKCk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS50b2dnbGVIb2xkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMud2ViUGhvbmUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5Ub2dnbGVIb2xkKCk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS50b2dnbGVNdXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMud2ViUGhvbmUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5Ub2dnbGVNdXRlKCk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5zZW5kRFRNRiA9IGZ1bmN0aW9uIChkaWdpdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMud2ViUGhvbmUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5TZW5kRFRNRihkaWdpdCk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5yZWdpc3RlckRldmljZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGdyYW50ZWQ7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnBlcm1pc3Npb25TdGF0dXMgIT09ICdncmFudGVkJykpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZXF1ZXN0TWljcm9waG9uZUFjY2VzcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZCA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JhbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWljcm9waG9uZSBhY2Nlc3MgZGVuaWVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIChfYSA9IHRoaXMud2ViUGhvbmUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5SZWdpc3RlckRldmljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnVucmVnaXN0ZXJEZXZpY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLlVuUmVnaXN0ZXJEZXZpY2UoKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmdldFBlcm1pc3Npb25TdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25TdGF0dXM7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5hZGRDYWxsTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5yZW1vdmVDYWxsTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5hZGRSZWdpc3Rlckxpc3RlbmVyID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnJlbW92ZVJlZ2lzdGVyTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5yZWdpc3Rlckxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUuYWRkU2Vzc2lvbkxpc3RlbmVyID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUucmVtb3ZlU2Vzc2lvbkxpc3RlbmVyID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIEV4b3RlbFNlcnZpY2U7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgRXhvdGVsU2VydmljZTtcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGF4aW9zIH0gZnJvbSAnLi4vLi4vY29uZmlnL2F4aW9zJztcbi8qKlxuICogQ2hlY2sgaWYgVm9JUCBpcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCB0ZW5hbnQgYnkgZmV0Y2hpbmcgbm90aWZpY2F0aW9uIGNvbmZpZy5cbiAqIFJldHVybnMgdHJ1ZSBvbmx5IGlmOlxuICogLSBlbmFibGVWb2ljZSBpcyB0cnVlXG4gKiAtIHZvaWNlQ29uZmlncyBoYXMgYXQgbGVhc3Qgb25lIGVuYWJsZWQgY29uZmlnXG4gKi9cbmV4cG9ydCB2YXIgY2hlY2tWb0lQRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGEsIGNvbmZpZywgZW5hYmxlZFZvaWNlQ29uZmlnLCBoYXNWYWxpZFRva2VuLCBlcnJvcl8xO1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIF9kLnRyeXMucHVzaChbMCwgMiwgLCAzXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MuZ2V0KCcvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb24tY29uZmlncycpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9kLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEuY29uZmlnO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZvaWNlIGlzIGVuYWJsZWQgYXQgdGVuYW50IGxldmVsXG4gICAgICAgICAgICAgICAgaWYgKCEoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLmVuYWJsZVZvaWNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBlbmFibGVkOiBmYWxzZSwgaGFzVmFsaWRUb2tlbjogZmFsc2UgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVuYWJsZWRWb2ljZUNvbmZpZyA9IChfYSA9IGNvbmZpZy52b2ljZUNvbmZpZ3MpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maW5kKGZ1bmN0aW9uICh2YykgeyByZXR1cm4gdmMuaXNFbmFibGVkID09PSB0cnVlOyB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWVuYWJsZWRWb2ljZUNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBlbmFibGVkOiBmYWxzZSwgaGFzVmFsaWRUb2tlbjogZmFsc2UgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhc1ZhbGlkVG9rZW4gPSAhISgoKF9iID0gZW5hYmxlZFZvaWNlQ29uZmlnLkVYT1RFTCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnRva2VuKSAmJlxuICAgICAgICAgICAgICAgICAgICAoKF9jID0gZW5hYmxlZFZvaWNlQ29uZmlnLkVYT1RFTCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnRva2VuRXhwaXJlc0F0KSAmJlxuICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShlbmFibGVkVm9pY2VDb25maWcuRVhPVEVMLnRva2VuRXhwaXJlc0F0KSA+IG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IGVuYWJsZWQ6IHRydWUsIGhhc1ZhbGlkVG9rZW46IGhhc1ZhbGlkVG9rZW4gfV07XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY2hlY2sgVm9JUCBjb25maWc6JywgZXJyb3JfMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgZW5hYmxlZDogZmFsc2UsIGhhc1ZhbGlkVG9rZW46IGZhbHNlIH1dO1xuICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBHZXQgdGhlIGFjdGl2ZSBFeG90ZWwgdm9pY2UgdG9rZW4gZnJvbSB0aGUgYmFja2VuZC5cbiAqIFRoZSBiYWNrZW5kIG1hbmFnZXMgY3JlZGVudGlhbHMgc2VjdXJlbHkgYW5kIGF1dG8tcmVmcmVzaGVzIHRva2Vucy5cbiAqL1xuZXhwb3J0IHZhciBnZXRBY3RpdmVWb2ljZVRva2VuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YSwgZXJyb3JfMjtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDIsICwgM10pO1xuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLmdldCgnL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9uLWNvbmZpZ3Mvdm9pY2UtY29uZmlnL2FjdGl2ZS10b2tlbicpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgZXJyb3JfMiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggRXhvdGVsIHRva2VuOicsIGVycm9yXzIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBudWxsXTtcbiAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGdldEFjdGl2ZVZvaWNlVG9rZW4gaW5zdGVhZC5cbiAqIFRoaXMgZnVuY3Rpb24gaXMga2VwdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnV0IHdpbGwgYmUgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IHZhciBjcmVhdGVFeG90ZWxBcHBUb2tlbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRva2VuRGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgZ2V0QWN0aXZlVm9pY2VUb2tlbigpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICB0b2tlbkRhdGEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0b2tlbkRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBhY3RpdmUgdm9pY2UgY29uZmlndXJhdGlvbiBmb3VuZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBEYXRhOiB0b2tlbkRhdGEudG9rZW4gfV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBJbml0aWF0ZSBhbiBvdXRib3VuZCBjYWxsIC0gY3JlYXRlcyBjYWxsIGFjdGl2aXR5IHJlY29yZFxuICovXG5leHBvcnQgdmFyIGluaXRpYXRlQ2FsbEFjdGl2aXR5ID0gZnVuY3Rpb24gKGlucHV0KSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5wb3N0KFwiL2NvbW11bmljYXRpb24tYWN0aXZpdGllcy9pbml0aWF0ZVwiLCBpbnB1dCldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIFJlZ2lzdGVyIGFuIGluY29taW5nIGNhbGwgLSBjcmVhdGVzIGNhbGwgYWN0aXZpdHkgcmVjb3JkXG4gKi9cbmV4cG9ydCB2YXIgcmVnaXN0ZXJJbmNvbWluZ0NhbGwgPSBmdW5jdGlvbiAoaW5wdXQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLnBvc3QoXCIvY29tbXVuaWNhdGlvbi1hY3Rpdml0aWVzL3JlZ2lzdGVyLWluY29taW5nXCIsIGlucHV0KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogRmV0Y2ggY2FsbCBoaXN0b3J5IGZvciBhIHByb3NwZWN0XG4gKi9cbmV4cG9ydCB2YXIgZmV0Y2hDYWxsSGlzdG9yeSA9IGZ1bmN0aW9uIChwcm9zcGVjdElkKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5nZXQoXCIvY29tbXVuaWNhdGlvbi1hY3Rpdml0aWVzL2J5LXByb3NwZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IHByb3NwZWN0SWQ6IHByb3NwZWN0SWQgfSxcbiAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogR2V0IGNhbGwgYWN0aXZpdHkgYnkgSURcbiAqL1xuZXhwb3J0IHZhciBnZXRDYWxsQWN0aXZpdHlCeUlkID0gZnVuY3Rpb24gKGlkKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5nZXQoXCIvY29tbXVuaWNhdGlvbi1hY3Rpdml0aWVzL1wiLmNvbmNhdChpZCkpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBHZXQgY2FsbCBhY3Rpdml0eSBieSBDYWxsU2lkXG4gKi9cbmV4cG9ydCB2YXIgZ2V0Q2FsbEFjdGl2aXR5QnlDYWxsU2lkID0gZnVuY3Rpb24gKGNhbGxTaWQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLmdldChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvYnktY2FsbC1zaWRcIiwge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgY2FsbFNpZDogY2FsbFNpZCB9LFxuICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBHZXQgY2FsbCBjb3VudCBmb3IgYSBwcm9zcGVjdFxuICovXG5leHBvcnQgdmFyIGdldENhbGxDb3VudEJ5UHJvc3BlY3QgPSBmdW5jdGlvbiAocHJvc3BlY3RJZCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MuZ2V0KFwiL2NvbW11bmljYXRpb24tYWN0aXZpdGllcy9jb3VudC1ieS1wcm9zcGVjdFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBwcm9zcGVjdElkOiBwcm9zcGVjdElkIH0sXG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhLmNvdW50KSB8fCAwXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIFNhdmUgY2FsbCBkaXNwb3NpdGlvblxuICovXG5leHBvcnQgdmFyIHNhdmVDYWxsRGlzcG9zaXRpb24gPSBmdW5jdGlvbiAoaW5wdXQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlcXVlc3RCb2R5LCBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgICAgICAgICAgICBjYWxsU3RhdHVzRGlzcG9zaXRpb246IGlucHV0LmNhbGxTdGF0dXNEaXNwb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb25DYXRlZ29yeTogaW5wdXQuZGlzcG9zaXRpb25DYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgcHJvc3BlY3RTdGF0dXM6IGlucHV0LnByb3NwZWN0U3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvbk5vdGVzOiBpbnB1dC5kaXNwb3NpdGlvbk5vdGVzLFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1NjaGVkdWxlZEF0OiBpbnB1dC5jYWxsYmFja1NjaGVkdWxlZEF0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MucG9zdChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvXCIuY29uY2F0KGlucHV0LmNhbGxJZCwgXCIvZGlzcG9zaXRpb25cIiksIHJlcXVlc3RCb2R5KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogQ2FuY2VsL2RlY2xpbmUgYSBjYWxsIGJlZm9yZSBpdCB3YXMgY29ubmVjdGVkXG4gKiBVcGRhdGVzIHRoZSBjYWxsIGFjdGl2aXR5IHN0YXR1cyB0byBDQU5DRUxFRFxuICovXG5leHBvcnQgdmFyIGNhbmNlbENhbGwgPSBmdW5jdGlvbiAoaW5wdXQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLnBvc3QoXCIvY29tbXVuaWNhdGlvbi1hY3Rpdml0aWVzL2NhbmNlbFwiLCBpbnB1dCldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEV4b3RlbFNlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZXhvdGVsL0V4b3RlbFNlcnZpY2UnO1xuaW1wb3J0IHsgcmVnaXN0ZXJJbmNvbWluZ0NhbGwgfSBmcm9tICcuLi9zZXJ2aWNlcy9leG90ZWwvYXBpJztcbi8vIEdsb2JhbCBjb250ZXh0IGtleSBmb3IgY3Jvc3MtbW9kdWxlLWZlZGVyYXRpb24gc2hhcmluZ1xudmFyIEVYT1RFTF9DT05URVhUX0tFWSA9ICdfX0VYT1RFTF9DT05URVhUX18nO1xuLy8gR2V0IG9yIGNyZWF0ZSBhIHNoYXJlZCBjb250ZXh0IGFjcm9zcyBtb2R1bGUgZmVkZXJhdGlvbiBib3VuZGFyaWVzXG52YXIgZ2V0U2hhcmVkQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXdpbmRvd1tFWE9URUxfQ09OVEVYVF9LRVldKSB7XG4gICAgICAgIDtcbiAgICAgICAgd2luZG93W0VYT1RFTF9DT05URVhUX0tFWV0gPSBjcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB3aW5kb3dbRVhPVEVMX0NPTlRFWFRfS0VZXTtcbn07XG52YXIgaW5pdGlhbENhbGxTdGF0ZSA9IHtcbiAgICBwaGFzZTogJ2lkbGUnLFxuICAgIGNhbGxEYXRhOiBudWxsLFxuICAgIGlzT25Ib2xkOiBmYWxzZSxcbiAgICBpc011dGVkOiBmYWxzZSxcbiAgICBpc1NwZWFrZXJPZmY6IGZhbHNlLFxuICAgIGNhbGxEaXJlY3Rpb246IG51bGwsXG4gICAgY2FsbFN0YXJ0VGltZTogbnVsbCxcbiAgICBjYWxsRHVyYXRpb246IDAsXG4gICAgY2FsbGVyTmFtZTogbnVsbCxcbiAgICBjYWxsZXJOdW1iZXI6IG51bGwsXG4gICAgY2FsbEFjdGl2aXR5SWQ6IG51bGwsXG4gICAgZXhvdGVsQ2FsbFNpZDogbnVsbCxcbiAgICBwcm9zcGVjdFVuaXF1ZUlkOiBudWxsLFxuICAgIHdhc0FjY2VwdGVkOiBmYWxzZSxcbn07XG4vKipcbiAqIE1hc2sgbW9iaWxlIG51bWJlciBmb3IgZGlzcGxheSAoZmlyc3QgMiBhbmQgbGFzdCAyIG9mIGFjdHVhbCBudW1iZXIgdmlzaWJsZSlcbiAqIEhhbmRsZXMgY291bnRyeSBjb2RlIHByZWZpeCAoKzkxKVxuICogZS5nLiwgXCIrOTE5ODc2NTQzMjEwXCIgLT4gXCIrOTE5OCoqKioqKjEwXCJcbiAqIGUuZy4sIFwiOTg3NjU0MzIxMFwiIC0+IFwiOTgqKioqKioxMFwiXG4gKi9cbnZhciBtYXNrTW9iaWxlID0gZnVuY3Rpb24gKG1vYmlsZSkge1xuICAgIGlmICghbW9iaWxlIHx8IG1vYmlsZS5sZW5ndGggPCA0KVxuICAgICAgICByZXR1cm4gJyoqKioqKioqKionO1xuICAgIC8vIENoZWNrIGZvciBjb3VudHJ5IGNvZGUgcHJlZml4XG4gICAgdmFyIHByZWZpeCA9ICcnO1xuICAgIHZhciBudW1iZXIgPSBtb2JpbGU7XG4gICAgaWYgKG1vYmlsZS5zdGFydHNXaXRoKCcrOTEnKSkge1xuICAgICAgICBwcmVmaXggPSAnKzkxJztcbiAgICAgICAgbnVtYmVyID0gbW9iaWxlLnN1YnN0cmluZygzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9iaWxlLnN0YXJ0c1dpdGgoJzkxJykgJiYgbW9iaWxlLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgIHByZWZpeCA9ICc5MSc7XG4gICAgICAgIG51bWJlciA9IG1vYmlsZS5zdWJzdHJpbmcoMik7XG4gICAgfVxuICAgIHZhciBjbGVhbmVkID0gbnVtYmVyLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgaWYgKGNsZWFuZWQubGVuZ3RoIDwgNClcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICcqKioqKioqKioqJztcbiAgICByZXR1cm4gcHJlZml4ICsgY2xlYW5lZC5zdWJzdHJpbmcoMCwgMikgKyAnKicucmVwZWF0KGNsZWFuZWQubGVuZ3RoIC0gNCkgKyBjbGVhbmVkLnN1YnN0cmluZyhjbGVhbmVkLmxlbmd0aCAtIDIpO1xufTtcbi8vIFVzZSBzaGFyZWQgY29udGV4dCBmb3IgY3Jvc3MtbW9kdWxlLWZlZGVyYXRpb24gY29tcGF0aWJpbGl0eVxudmFyIEV4b3RlbENvbnRleHQgPSBnZXRTaGFyZWRDb250ZXh0KCk7XG5leHBvcnQgdmFyIEV4b3RlbFByb3ZpZGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIGFjY2Vzc1Rva2VuID0gX2EuYWNjZXNzVG9rZW4sIGFnZW50VXNlcklkID0gX2EuYWdlbnRVc2VySWQsIF9iID0gX2EuYXV0b0Nvbm5lY3RWT0lQLCBhdXRvQ29ubmVjdFZPSVAgPSBfYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9iLCBkZWZhdWx0Q2FsbGVyTmFtZSA9IF9hLmNhbGxlck5hbWUsIGRlZmF1bHRDYWxsZXJOdW1iZXIgPSBfYS5jYWxsZXJOdW1iZXI7XG4gICAgdmFyIF9jID0gdXNlU3RhdGUoZmFsc2UpLCBpc0luaXRpYWxpemVkID0gX2NbMF0sIHNldElzSW5pdGlhbGl6ZWQgPSBfY1sxXTtcbiAgICB2YXIgX2QgPSB1c2VTdGF0ZShmYWxzZSksIGlzQ29ubmVjdGVkID0gX2RbMF0sIHNldElzQ29ubmVjdGVkID0gX2RbMV07XG4gICAgdmFyIF9lID0gdXNlU3RhdGUoJ3Vua25vd24nKSwgcGVybWlzc2lvblN0YXR1cyA9IF9lWzBdLCBzZXRQZXJtaXNzaW9uU3RhdHVzID0gX2VbMV07XG4gICAgdmFyIF9mID0gdXNlU3RhdGUoaW5pdGlhbENhbGxTdGF0ZSksIGNhbGxTdGF0ZSA9IF9mWzBdLCBzZXRDYWxsU3RhdGUgPSBfZlsxXTtcbiAgICB2YXIgX2cgPSB1c2VTdGF0ZShudWxsKSwgZGlzcG9zaXRpb25EYXRhID0gX2dbMF0sIHNldERpc3Bvc2l0aW9uRGF0YSA9IF9nWzFdO1xuICAgIHZhciB0aW1lclJlZiA9IHVzZVJlZihudWxsKTtcbiAgICB2YXIgY2FsbFN0YXRlUmVmID0gdXNlUmVmKGNhbGxTdGF0ZSk7XG4gICAgdmFyIGV4b3RlbFNlcnZpY2UgPSBFeG90ZWxTZXJ2aWNlLmdldEluc3RhbmNlKCk7XG4gICAgLy8gS2VlcCByZWYgaW4gc3luYyB3aXRoIHN0YXRlIGZvciB1c2UgaW4gZXZlbnQgaGFuZGxlcnNcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsU3RhdGVSZWYuY3VycmVudCA9IGNhbGxTdGF0ZTtcbiAgICB9LCBbY2FsbFN0YXRlXSk7XG4gICAgLy8gVGltZXIgZm9yIGNhbGwgZHVyYXRpb25cbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY2FsbFN0YXRlLnBoYXNlID09PSAnY29ubmVjdGVkJyAmJiBjYWxsU3RhdGUuY2FsbFN0YXJ0VGltZSkge1xuICAgICAgICAgICAgdGltZXJSZWYuY3VycmVudCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgY2FsbER1cmF0aW9uOiBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gcHJldi5jYWxsU3RhcnRUaW1lKSAvIDEwMDApIH0pKTsgfSk7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aW1lclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lclJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICB0aW1lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRpbWVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sIFtjYWxsU3RhdGUucGhhc2UsIGNhbGxTdGF0ZS5jYWxsU3RhcnRUaW1lXSk7XG4gICAgLy8gUmVxdWVzdCBtaWNyb3Bob25lIHBlcm1pc3Npb24gYmVmb3JlIGluaXRpYWxpemluZ1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXF1ZXN0UGVybWlzc2lvbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3RyZWFtLCBlcnJvcl8xO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAyLCAsIDNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW86IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHsgcmV0dXJuIHRyYWNrLnN0b3AoKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRQZXJtaXNzaW9uU3RhdHVzKCdncmFudGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTWljcm9waG9uZSBwZXJtaXNzaW9uIGRlbmllZDonLCBlcnJvcl8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFBlcm1pc3Npb25TdGF0dXMoJ2RlbmllZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTsgfTtcbiAgICAgICAgaWYgKG5hdmlnYXRvci5wZXJtaXNzaW9ucyAmJiBuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkpIHtcbiAgICAgICAgICAgIG5hdmlnYXRvci5wZXJtaXNzaW9uc1xuICAgICAgICAgICAgICAgIC5xdWVyeSh7IG5hbWU6ICdtaWNyb3Bob25lJyB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzZXRQZXJtaXNzaW9uU3RhdHVzKHN0YXR1cy5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLm9uY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRQZXJtaXNzaW9uU3RhdHVzKHN0YXR1cy5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnN0YXRlID09PSAncHJvbXB0Jykge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHF1ZXJ5IHBlcm1pc3Npb24gc3RhdHVzOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgICAgICB9XG4gICAgfSwgW10pO1xuICAgIC8vIEluaXRpYWxpemUgdGhlIFNES1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghYWNjZXNzVG9rZW4gfHwgIWFnZW50VXNlcklkIHx8IGlzSW5pdGlhbGl6ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBpbml0aWFsaXplRXhvdGVsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdWNjZXNzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBleG90ZWxTZXJ2aWNlLmluaXRpYWxpemUoYWNjZXNzVG9rZW4sIGFnZW50VXNlcklkLCBhdXRvQ29ubmVjdFZPSVApXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbGl6ZWQoc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyB9O1xuICAgICAgICBpbml0aWFsaXplRXhvdGVsKCk7XG4gICAgfSwgW2FjY2Vzc1Rva2VuLCBhZ2VudFVzZXJJZCwgYXV0b0Nvbm5lY3RWT0lQXSk7XG4gICAgLy8gU2V0dXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFpc0luaXRpYWxpemVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgaGFuZGxlQ2FsbEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnaW5jb21pbmcnOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGN1cnJlbnQgc3RhdGUgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBnZW51aW5lIGluY29taW5nIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IganVzdCB0aGUgYWdlbnQgY2FsbGJhY2sgZm9yIGFuIG91dGJvdW5kIGNsaWNrLXRvLWNhbGxcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzT3V0Ym91bmRDYWxsID0gY2FsbFN0YXRlUmVmLmN1cnJlbnQuY2FsbERpcmVjdGlvbiA9PT0gJ291dGJvdW5kJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzT3V0Ym91bmRDYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb3V0Ym91bmQgY2FsbHMgKGNsaWNrLXRvLWNhbGwpLCBFeG90ZWwgZmlyc3QgY2FsbHMgdGhlIGFnZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRyaWdnZXJzICdpbmNvbWluZycgZXZlbnQgYnV0IHdlIHNob3VsZCBOT1Qgb3ZlcndyaXRlIHRoZSBvdXRib3VuZCBjYWxsIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgY2FsbERhdGE6IGRhdGEsIGlzT25Ib2xkOiBmYWxzZSwgaXNNdXRlZDogZmFsc2UgfSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBnZW51aW5lIGluY29taW5nIGNhbGwgLSB1cGRhdGUgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmNvbWluZ051bWJlcl8xID0gZGF0YS5jYWxsRnJvbU51bWJlciB8fCBkYXRhLnJlbW90ZUlkIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgcGhhc2U6ICdpbmNvbWluZycsIGNhbGxEYXRhOiBkYXRhLCBjYWxsRGlyZWN0aW9uOiAnaW5ib3VuZCcsIGNhbGxlck5hbWU6IGRhdGEucmVtb3RlRGlzcGxheU5hbWUgfHwgbnVsbCwgY2FsbGVyTnVtYmVyOiBpbmNvbWluZ051bWJlcl8xID8gbWFza01vYmlsZShpbmNvbWluZ051bWJlcl8xKSA6IG51bGwsIGlzT25Ib2xkOiBmYWxzZSwgaXNNdXRlZDogZmFsc2UgfSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGluY29taW5nIGNhbGwgaW4gdGhlIGJhY2tlbmQgYW5kIGdldCBwcm9zcGVjdCBkZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5jYWxsSWQgfHwgZGF0YS5zZXNzaW9uSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckluY29taW5nQ2FsbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTaWQ6IGRhdGEuY2FsbElkIHx8IGRhdGEuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tTnVtYmVyOiBkYXRhLmNhbGxGcm9tTnVtYmVyIHx8IGRhdGEucmVtb3RlSWQgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvTnVtYmVyOiBkYXRhLnJlbW90ZURpc3BsYXlOYW1lIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBjYWxsIHN0YXRlIHdpdGggcHJvc3BlY3QgZGV0YWlscyBhbmQgY2FsbCBhY3Rpdml0eSBJRFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvc3BlY3RNb2JpbGUgPSAoX2EgPSByZXNwb25zZS5wcm9zcGVjdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IGNhbGxBY3Rpdml0eUlkOiAoKF9hID0gcmVzcG9uc2UuZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlkKSB8fCBwcmV2LmNhbGxBY3Rpdml0eUlkLCBjYWxsZXJOYW1lOiAoKF9iID0gcmVzcG9uc2UucHJvc3BlY3QpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5uYW1lKSB8fCBwcmV2LmNhbGxlck5hbWUsIGNhbGxlck51bWJlcjogcHJvc3BlY3RNb2JpbGUgPyBtYXNrTW9iaWxlKHByb3NwZWN0TW9iaWxlKSA6IHByZXYuY2FsbGVyTnVtYmVyLCBwcm9zcGVjdFVuaXF1ZUlkOiAoKF9jID0gcmVzcG9uc2UucHJvc3BlY3QpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy51bmlxdWVJZCkgfHwgcHJldi5wcm9zcGVjdFVuaXF1ZUlkIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlZ2lzdGVyIGluY29taW5nIGNhbGw6JywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnY29ubmVjdGVkJzpcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IHBoYXNlOiAnY29ubmVjdGVkJywgY2FsbERhdGE6IGRhdGEsIGNhbGxTdGFydFRpbWU6IERhdGUubm93KCksIGNhbGxEdXJhdGlvbjogMCB9KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjYWxsRW5kZWQnOlxuICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG93IGRpc3Bvc2l0aW9uIGZvcm0gaWY6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBVc2VyIGFjY2VwdGVkIHRoZSBjYWxsICh3YXNBY2NlcHRlZCA9IHRydWUpLCBPUlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gQ2FsbCB3YXMgY29ubmVjdGVkLCBPUlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gQ2FsbCBoYWQgc29tZSBkdXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gTk9UIHNob3cgaWYgdXNlciBkZWNsaW5lZCBiZWZvcmUgYWNjZXB0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hvdWxkU2hvd0Rpc3Bvc2l0aW9uID0gcHJldi53YXNBY2NlcHRlZCB8fCBwcmV2LnBoYXNlID09PSAnY29ubmVjdGVkJyB8fCBwcmV2LmNhbGxEdXJhdGlvbiA+IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd0Rpc3Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3Bvc2l0aW9uRGF0YU9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGRhdGFiYXNlIGNhbGxBY3Rpdml0eUlkIGZvciBBUEkgY2FsbHMsIGZhbGwgYmFjayB0byBFeG90ZWwgY2FsbElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxJZDogcHJldi5jYWxsQWN0aXZpdHlJZCB8fCBkYXRhLmNhbGxJZCB8fCAoKF9hID0gcHJldi5jYWxsRGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGxJZCkgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4b3RlbENhbGxJZDogZGF0YS5jYWxsSWQgfHwgKChfYiA9IHByZXYuY2FsbERhdGEpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsSWQpIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsRGlyZWN0aW9uOiBwcmV2LmNhbGxEaXJlY3Rpb24gfHwgJ291dGJvdW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbER1cmF0aW9uOiBwcmV2LmNhbGxEdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyTmFtZTogcHJldi5jYWxsZXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJOdW1iZXI6IHByZXYuY2FsbGVyTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcG9zaXRpb25EYXRhKGRpc3Bvc2l0aW9uRGF0YU9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGluaXRpYWxDYWxsU3RhdGUpLCB7IHBoYXNlOiAnZW5kZWQnLCBjYWxsRGF0YTogZGF0YSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hvbGR0b2dnbGUnOlxuICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgaXNPbkhvbGQ6ICFwcmV2LmlzT25Ib2xkLCBjYWxsRGF0YTogZGF0YSB9KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtdXRldG9nZ2xlJzpcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IGlzTXV0ZWQ6ICFwcmV2LmlzTXV0ZWQsIGNhbGxEYXRhOiBkYXRhIH0pKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgaGFuZGxlUmVnaXN0ZXJFdmVudCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICAgICAgc2V0SXNDb25uZWN0ZWQoc3RhdGUgPT09ICdyZWdpc3RlcmVkJyk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBoYW5kbGVTZXNzaW9uRXZlbnQgPSBmdW5jdGlvbiAoc3RhdGUsIGRhdGEpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBzZXNzaW9uIGV2ZW50cyBpZiBuZWVkZWRcbiAgICAgICAgfTtcbiAgICAgICAgZXhvdGVsU2VydmljZS5hZGRDYWxsTGlzdGVuZXIoaGFuZGxlQ2FsbEV2ZW50KTtcbiAgICAgICAgZXhvdGVsU2VydmljZS5hZGRSZWdpc3Rlckxpc3RlbmVyKGhhbmRsZVJlZ2lzdGVyRXZlbnQpO1xuICAgICAgICBleG90ZWxTZXJ2aWNlLmFkZFNlc3Npb25MaXN0ZW5lcihoYW5kbGVTZXNzaW9uRXZlbnQpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhvdGVsU2VydmljZS5yZW1vdmVDYWxsTGlzdGVuZXIoaGFuZGxlQ2FsbEV2ZW50KTtcbiAgICAgICAgICAgIGV4b3RlbFNlcnZpY2UucmVtb3ZlUmVnaXN0ZXJMaXN0ZW5lcihoYW5kbGVSZWdpc3RlckV2ZW50KTtcbiAgICAgICAgICAgIGV4b3RlbFNlcnZpY2UucmVtb3ZlU2Vzc2lvbkxpc3RlbmVyKGhhbmRsZVNlc3Npb25FdmVudCk7XG4gICAgICAgIH07XG4gICAgfSwgW2lzSW5pdGlhbGl6ZWRdKTtcbiAgICAvLyBVcGRhdGUgcGVybWlzc2lvbiBzdGF0dXMgd2hlbiBpdCBjaGFuZ2VzIGluIHRoZSBzZXJ2aWNlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHNldFBlcm1pc3Npb25TdGF0dXMoZXhvdGVsU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdHVzKCkpO1xuICAgICAgICB9XG4gICAgfSwgW2lzSW5pdGlhbGl6ZWRdKTtcbiAgICB2YXIgbWFrZUNhbGwgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAocGhvbmVOdW1iZXIsIGNhbGxlck5hbWUsIGNhbGxBY3Rpdml0eUlkLCBtYXNrZWROdW1iZXIpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXNwb25zZSwgZXJyb3JfMjtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgc3RhdGUgLSByZWFkeSB0byBjYWxsIChhZ2VudCBuZWVkcyB0byBhY2NlcHQgZmlyc3QpXG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBtYXNrZWQgbnVtYmVyIGZvciBkaXNwbGF5LCBhY3R1YWwgbnVtYmVyIGZvciB0aGUgY2FsbFxuICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgcGhhc2U6ICdyZWFkeV90b19jYWxsJywgY2FsbERpcmVjdGlvbjogJ291dGJvdW5kJywgY2FsbGVyTmFtZTogY2FsbGVyTmFtZSB8fCBkZWZhdWx0Q2FsbGVyTmFtZSB8fCBudWxsLCBjYWxsZXJOdW1iZXI6IG1hc2tlZE51bWJlciB8fCBwaG9uZU51bWJlciwgY2FsbEFjdGl2aXR5SWQ6IGNhbGxBY3Rpdml0eUlkIHx8IG51bGwsIGlzT25Ib2xkOiBmYWxzZSwgaXNNdXRlZDogZmFsc2UsIGNhbGxTdGFydFRpbWU6IG51bGwsIGNhbGxEdXJhdGlvbjogMCB9KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBleG90ZWxTZXJ2aWNlLm1ha2VDYWxsKHBob25lTnVtYmVyKV07IC8vIFVzZSBhY3R1YWwgbnVtYmVyIGZvciBjYWxsaW5nXG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKSAvLyBVc2UgYWN0dWFsIG51bWJlciBmb3IgY2FsbGluZ1xuICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXNwb25zZV07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBlcnJvcl8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBTREsgY2FsbCBmYWlscyAoNHh4LzV4eCBlcnJvcnMgZnJvbSBFeG90ZWwgQVBJKSwgcmVzZXQgc3RhdGUgdG8gaWRsZVxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyB0aGUgdXNlciB0byByZXRyeSB0aGUgY2FsbFxuICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoaW5pdGlhbENhbGxTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlLXRocm93IHRoZSBlcnJvciBzbyBDYWxsQnV0dG9uIGNhbiBoYW5kbGUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JfMjtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7IH0sIFtkZWZhdWx0Q2FsbGVyTmFtZV0pO1xuICAgIHZhciBhY2NlcHRDYWxsID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgZXhvdGVsU2VydmljZS5hY2NlcHRDYWxsKClcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG91dGJvdW5kIGNhbGxzLCBhY2NlcHRpbmcgbWVhbnMgd2UncmUgbm93IGNhbGxpbmcgdGhlIGxlYWRcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayB3YXNBY2NlcHRlZCA9IHRydWUgc28gd2Uga25vdyB0byBzaG93IGRpc3Bvc2l0aW9uIGZvcm0gb24gZW5kXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG91dGJvdW5kIGNhbGxzLCBhY2NlcHRpbmcgbWVhbnMgd2UncmUgbm93IGNhbGxpbmcgdGhlIGxlYWRcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayB3YXNBY2NlcHRlZCA9IHRydWUgc28gd2Uga25vdyB0byBzaG93IGRpc3Bvc2l0aW9uIGZvcm0gb24gZW5kXG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYuY2FsbERpcmVjdGlvbiA9PT0gJ291dGJvdW5kJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgcGhhc2U6ICdjYWxsaW5nJywgd2FzQWNjZXB0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgaW5ib3VuZCBjYWxscywgYWxzbyBtYXJrIGFzIGFjY2VwdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IHdhc0FjY2VwdGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTsgfSwgW10pO1xuICAgIHZhciBoYW5ndXBDYWxsID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBleG90ZWxTZXJ2aWNlLmhhbmd1cENhbGwoKTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIHRvZ2dsZVNwZWFrZXIgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBpc1NwZWFrZXJPZmY6ICFwcmV2LmlzU3BlYWtlck9mZiB9KSk7IH0pO1xuICAgICAgICAvLyBOb3RlOiBBY3R1YWwgc3BlYWtlciB0b2dnbGUgd291bGQgbmVlZCBXZWJSVEMgYXVkaW8gb3V0cHV0IGRldmljZSBzd2l0Y2hpbmdcbiAgICB9LCBbXSk7XG4gICAgdmFyIGNsZWFyRGlzcG9zaXRpb24gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldERpc3Bvc2l0aW9uRGF0YShudWxsKTtcbiAgICAgICAgc2V0Q2FsbFN0YXRlKGluaXRpYWxDYWxsU3RhdGUpO1xuICAgIH0sIFtdKTtcbiAgICAvLyBVcGRhdGUgY2FsbEFjdGl2aXR5SWQgYWZ0ZXIgY3JlYXRpbmcgdGhlIHJlY29yZCAoZm9yIG91dGJvdW5kIGNhbGxzKVxuICAgIHZhciBzZXRDYWxsQWN0aXZpdHlJZEZuID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNhbGxBY3Rpdml0eUlkKSB7XG4gICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBjYWxsQWN0aXZpdHlJZDogY2FsbEFjdGl2aXR5SWQgfSkpOyB9KTtcbiAgICB9LCBbXSk7XG4gICAgLy8gVXBkYXRlIGV4b3RlbENhbGxTaWQgZnJvbSBTREsgcmVzcG9uc2UgKGZvciBvdXRib3VuZCBjYWxscylcbiAgICB2YXIgc2V0RXhvdGVsQ2FsbFNpZEZuID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNhbGxTaWQpIHtcbiAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IGV4b3RlbENhbGxTaWQ6IGNhbGxTaWQgfSkpOyB9KTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIHZhbHVlID0ge1xuICAgICAgICBpc0luaXRpYWxpemVkOiBpc0luaXRpYWxpemVkLFxuICAgICAgICBpc0Nvbm5lY3RlZDogaXNDb25uZWN0ZWQsXG4gICAgICAgIGNhbGxTdGF0ZTogY2FsbFN0YXRlLFxuICAgICAgICBwZXJtaXNzaW9uU3RhdHVzOiBwZXJtaXNzaW9uU3RhdHVzLFxuICAgICAgICBkaXNwb3NpdGlvbkRhdGE6IGRpc3Bvc2l0aW9uRGF0YSxcbiAgICAgICAgbWFrZUNhbGw6IG1ha2VDYWxsLFxuICAgICAgICBhY2NlcHRDYWxsOiBhY2NlcHRDYWxsLFxuICAgICAgICBoYW5ndXBDYWxsOiBoYW5ndXBDYWxsLFxuICAgICAgICByZWplY3RDYWxsOiBmdW5jdGlvbiAoKSB7IHJldHVybiBleG90ZWxTZXJ2aWNlLnJlamVjdENhbGwoKTsgfSxcbiAgICAgICAgdG9nZ2xlSG9sZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZXhvdGVsU2VydmljZS50b2dnbGVIb2xkKCk7IH0sXG4gICAgICAgIHRvZ2dsZU11dGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV4b3RlbFNlcnZpY2UudG9nZ2xlTXV0ZSgpOyB9LFxuICAgICAgICB0b2dnbGVTcGVha2VyOiB0b2dnbGVTcGVha2VyLFxuICAgICAgICBzZW5kRFRNRjogZnVuY3Rpb24gKGRpZ2l0KSB7IHJldHVybiBleG90ZWxTZXJ2aWNlLnNlbmREVE1GKGRpZ2l0KTsgfSxcbiAgICAgICAgcmVnaXN0ZXJEZXZpY2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV4b3RlbFNlcnZpY2UucmVnaXN0ZXJEZXZpY2UoKTsgfSxcbiAgICAgICAgdW5yZWdpc3RlckRldmljZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gZXhvdGVsU2VydmljZS51bnJlZ2lzdGVyRGV2aWNlKCk7IH0sXG4gICAgICAgIHJlcXVlc3RNaWNyb3Bob25lQWNjZXNzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBleG90ZWxTZXJ2aWNlLnJlcXVlc3RNaWNyb3Bob25lQWNjZXNzKCk7IH0sXG4gICAgICAgIGNsZWFyRGlzcG9zaXRpb246IGNsZWFyRGlzcG9zaXRpb24sXG4gICAgICAgIHNldENhbGxBY3Rpdml0eUlkOiBzZXRDYWxsQWN0aXZpdHlJZEZuLFxuICAgICAgICBzZXRFeG90ZWxDYWxsU2lkOiBzZXRFeG90ZWxDYWxsU2lkRm4sXG4gICAgfTtcbiAgICByZXR1cm4gKF9qc3goRXhvdGVsQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogdmFsdWUsIGNoaWxkcmVuOiBjaGlsZHJlbiB9KSk7XG59O1xuZXhwb3J0IHZhciB1c2VFeG90ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KEV4b3RlbENvbnRleHQpO1xuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VFeG90ZWwgbXVzdCBiZSB1c2VkIHdpdGhpbiBhbiBFeG90ZWxQcm92aWRlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbn07XG4vKipcbiAqIFNhZmUgdmVyc2lvbiBvZiB1c2VFeG90ZWwgdGhhdCByZXR1cm5zIG51bGwgd2hlbiBvdXRzaWRlIHRoZSBwcm92aWRlclxuICogVXNlIHRoaXMgaW4gY29tcG9uZW50cyB0aGF0IG1heSByZW5kZXIgb3V0c2lkZSBvZiBFeG90ZWxQcm92aWRlclxuICovXG5leHBvcnQgdmFyIHVzZUV4b3RlbFNhZmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KEV4b3RlbENvbnRleHQpO1xuICAgIHJldHVybiBjb250ZXh0ICE9PSBudWxsICYmIGNvbnRleHQgIT09IHZvaWQgMCA/IGNvbnRleHQgOiBudWxsO1xufTtcbiIsImV4cG9ydCB2YXIgRVhPVEVMX0NPTlNUQU5UUyA9IHtcbiAgICBNT0RBTF9aX0lOREVYOiA5OTk5OTksXG4gICAgTU9EQUxfQkFDS0RST1BfWl9JTkRFWDogOTk5OTk4LFxuICAgIE1PREFMX0JPUkRFUl9SQURJVVM6ICcxNnB4JyxcbiAgICBERUNMSU5FX1RJTUVPVVRfTVM6IDIwMDAsXG4gICAgVElNRVJfSU5URVJWQUxfTVM6IDEwMDAsXG59O1xuIiwiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEJ1dHRvbiwgRGlhbG9nLCBSYWRpb0dyb3VwLCBTaW5nbGVTZWxlY3QsIFRleHRhcmVhLCBUeXBvZ3JhcGh5LCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNdXRhdGlvbiwgdXNlUXVlcnlDbGllbnQgfSBmcm9tICdyZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvblZlcmJvc2UgfSBmcm9tICcuLi8uLi91dGlscy9leG90ZWwvZm9ybWF0dGVycyc7XG52YXIgQ0FMTF9TVEFUVVNfT1BUSU9OUyA9IFtcbiAgICB7IGxhYmVsOiAnQ29ubmVjdGVkJywgdmFsdWU6ICdjb25uZWN0ZWQnIH0sXG4gICAgeyBsYWJlbDogJ05vdCBDb25uZWN0ZWQnLCB2YWx1ZTogJ25vdF9jb25uZWN0ZWQnIH0sXG5dO1xudmFyIENPTk5FQ1RFRF9ESVNQT1NJVElPTlMgPSBbXG4gICAgeyBsYWJlbDogJ0ludGVyZXN0ZWQnLCB2YWx1ZTogJ2ludGVyZXN0ZWQnIH0sXG4gICAgeyBsYWJlbDogJ05vdCBJbnRlcmVzdGVkJywgdmFsdWU6ICdub3RfaW50ZXJlc3RlZCcgfSxcbiAgICB7IGxhYmVsOiAnTm90IFN1cmUnLCB2YWx1ZTogJ25vdF9zdXJlJyB9LFxuICAgIHsgbGFiZWw6ICdOb3QgRWxpZ2libGUnLCB2YWx1ZTogJ25vdF9lbGlnaWJsZScgfSxcbiAgICB7IGxhYmVsOiAnV3JvbmcgTnVtYmVyJywgdmFsdWU6ICd3cm9uZ19udW1iZXInIH0sXG4gICAgeyBsYWJlbDogJ0NhbXB1cyBWaXNpdCcsIHZhbHVlOiAnY2FtcHVzX3Zpc2l0JyB9LFxuICAgIHsgbGFiZWw6ICdDYWxsIEJhY2snLCB2YWx1ZTogJ2NhbGxfYmFjaycgfSxcbiAgICB7IGxhYmVsOiAnQWZ0ZXIgSkVFIE1haW5zJywgdmFsdWU6ICdhZnRlcl9qZWVfbWFpbnMnIH0sXG4gICAgeyBsYWJlbDogJ0FmdGVyIElQRScsIHZhbHVlOiAnYWZ0ZXJfaXBlJyB9LFxuICAgIHsgbGFiZWw6ICdBZnRlciBFQVBDRVQnLCB2YWx1ZTogJ2FmdGVyX2VhcGNldCcgfSxcbl07XG52YXIgTk9UX0NPTk5FQ1RFRF9ESVNQT1NJVElPTlMgPSBbXG4gICAgeyBsYWJlbDogJ05vdCBBbnN3ZXJpbmcnLCB2YWx1ZTogJ25vdF9hbnN3ZXJpbmcnIH0sXG4gICAgeyBsYWJlbDogJ05vdCBDb25uZWN0ZWQnLCB2YWx1ZTogJ25vdF9jb25uZWN0ZWQnIH0sXG4gICAgeyBsYWJlbDogJ0ZhaWwgdG8gQ2FsbCcsIHZhbHVlOiAnZmFpbF90b19jYWxsJyB9LFxuICAgIHsgbGFiZWw6ICdTd2l0Y2hlZCBPZmYnLCB2YWx1ZTogJ3N3aXRjaGVkX29mZicgfSxcbiAgICB7IGxhYmVsOiAnT3V0IG9mIFNlcnZpY2UnLCB2YWx1ZTogJ291dF9vZl9zZXJ2aWNlJyB9LFxuICAgIHsgbGFiZWw6ICdJbnZhbGlkIE51bWJlcicsIHZhbHVlOiAnaW52YWxpZF9udW1iZXInIH0sXG4gICAgeyBsYWJlbDogJ051bWJlciBCdXN5JywgdmFsdWU6ICdudW1iZXJfYnVzeScgfSxcbl07XG52YXIgQ2FsbERpc3Bvc2l0aW9uRm9ybSA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBkaXNwb3NpdGlvbkRhdGEgPSBfYS5kaXNwb3NpdGlvbkRhdGEsIHByb3NwZWN0SWQgPSBfYS5wcm9zcGVjdElkLCBvbkNsb3NlID0gX2Eub25DbG9zZSwgb25TYXZlID0gX2Eub25TYXZlLCBleGlzdGluZ0RhdGEgPSBfYS5leGlzdGluZ0RhdGE7XG4gICAgdmFyIHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcbiAgICB2YXIgaXNFZGl0TW9kZSA9ICEhKGV4aXN0aW5nRGF0YSA9PT0gbnVsbCB8fCBleGlzdGluZ0RhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4aXN0aW5nRGF0YS5kaXNwb3NpdGlvbkNhdGVnb3J5KTtcbiAgICAvLyBTaW1wbGUgc3RhdGUgbWFuYWdlbWVudFxuICAgIHZhciBfYiA9IHVzZVN0YXRlKChleGlzdGluZ0RhdGEgPT09IG51bGwgfHwgZXhpc3RpbmdEYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleGlzdGluZ0RhdGEuY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uKSB8fCAnJyksIGNhbGxTdGF0dXMgPSBfYlswXSwgc2V0Q2FsbFN0YXR1cyA9IF9iWzFdO1xuICAgIHZhciBfYyA9IHVzZVN0YXRlKChleGlzdGluZ0RhdGEgPT09IG51bGwgfHwgZXhpc3RpbmdEYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleGlzdGluZ0RhdGEuZGlzcG9zaXRpb25DYXRlZ29yeSkgfHwgJycpLCBkaXNwb3NpdGlvbkNhdGVnb3J5ID0gX2NbMF0sIHNldERpc3Bvc2l0aW9uQ2F0ZWdvcnkgPSBfY1sxXTtcbiAgICB2YXIgX2QgPSB1c2VTdGF0ZSgoZXhpc3RpbmdEYXRhID09PSBudWxsIHx8IGV4aXN0aW5nRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhpc3RpbmdEYXRhLmRpc3Bvc2l0aW9uTm90ZXMpIHx8ICcnKSwgcmVtYXJrcyA9IF9kWzBdLCBzZXRSZW1hcmtzID0gX2RbMV07XG4gICAgdmFyIF9lID0gdXNlTXV0YXRpb24oZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIG9uU2F2ZShkYXRhKTsgfSwge1xuICAgICAgICBvblN1Y2Nlc3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKCdnZXRPbmVQcm9zcGVjdCcpO1xuICAgICAgICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoJ2NhbGxIaXN0b3J5Jyk7XG4gICAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgfSksIG11dGF0ZSA9IF9lLm11dGF0ZSwgaXNMb2FkaW5nID0gX2UuaXNMb2FkaW5nO1xuICAgIHZhciBoYW5kbGVDYWxsU3RhdHVzQ2hhbmdlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHNldENhbGxTdGF0dXModmFsdWUpO1xuICAgICAgICAvLyBSZXNldCBkaXNwb3NpdGlvbiB3aGVuIGNhbGwgc3RhdHVzIGNoYW5nZXNcbiAgICAgICAgc2V0RGlzcG9zaXRpb25DYXRlZ29yeSgnJyk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlRGlzcG9zaXRpb25DaGFuZ2UgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgc2V0RGlzcG9zaXRpb25DYXRlZ29yeSh2YWx1ZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlU3VibWl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWNhbGxTdGF0dXMgfHwgIWRpc3Bvc2l0aW9uQ2F0ZWdvcnkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3VibWl0RGF0YSA9IHtcbiAgICAgICAgICAgIHByb3NwZWN0SWQ6IHByb3NwZWN0SWQsXG4gICAgICAgICAgICBjYWxsSWQ6IGRpc3Bvc2l0aW9uRGF0YS5jYWxsSWQsXG4gICAgICAgICAgICBjaGFubmVsOiAncGhvbmUnLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiBkaXNwb3NpdGlvbkRhdGEuY2FsbERpcmVjdGlvbixcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkaXNwb3NpdGlvbkRhdGEuY2FsbER1cmF0aW9uLFxuICAgICAgICAgICAgY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uOiBjYWxsU3RhdHVzLFxuICAgICAgICAgICAgZGlzcG9zaXRpb25DYXRlZ29yeTogZGlzcG9zaXRpb25DYXRlZ29yeSxcbiAgICAgICAgICAgIHJlbWFya3M6IHJlbWFya3MgfHwgJycsXG4gICAgICAgICAgICBjYWxsZXJOYW1lOiBkaXNwb3NpdGlvbkRhdGEuY2FsbGVyTmFtZSB8fCAnJyxcbiAgICAgICAgICAgIGNhbGxlck51bWJlcjogZGlzcG9zaXRpb25EYXRhLmNhbGxlck51bWJlciB8fCAnJyxcbiAgICAgICAgfTtcbiAgICAgICAgbXV0YXRlKHN1Ym1pdERhdGEpO1xuICAgIH07XG4gICAgdmFyIGRpc3Bvc2l0aW9uT3B0aW9ucyA9IGNhbGxTdGF0dXMgPT09ICdjb25uZWN0ZWQnXG4gICAgICAgID8gQ09OTkVDVEVEX0RJU1BPU0lUSU9OU1xuICAgICAgICA6IGNhbGxTdGF0dXMgPT09ICdub3RfY29ubmVjdGVkJ1xuICAgICAgICAgICAgPyBOT1RfQ09OTkVDVEVEX0RJU1BPU0lUSU9OU1xuICAgICAgICAgICAgOiBbXTtcbiAgICByZXR1cm4gKF9qc3goRGlhbG9nLCB7IG9wZW46IHRydWUsIG9uQ2xvc2U6IG9uQ2xvc2UsIHRpdGxlOiBpc0VkaXRNb2RlID8gJ0VkaXQgRGlzcG9zaXRpb24nIDogJ0NhbGwgRGlzcG9zaXRpb24nLCBtYXhXaWR0aDogXCJtZFwiLCBjb250ZW50OiBmdW5jdGlvbiAoKSB7IHJldHVybiAoX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBmbGV4LWNvbCBnYXAtNCBwLTRcIiwgY2hpbGRyZW46IFtfanN4KFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJtdXRlZFwiLCBjaGlsZHJlbjogaXNFZGl0TW9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnVXBkYXRlIHRoZSBkaXNwb3NpdGlvbiBkZXRhaWxzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIkFkZCBkZXRhaWxzIGFib3V0IHlvdXIgY2FsbCB3aXRoIFwiLmNvbmNhdChkaXNwb3NpdGlvbkRhdGEuY2FsbGVyTmFtZSB8fCAnVW5rbm93bicpIH0pLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcC0zIGJnLWdyYXktMTAwIHJvdW5kZWQtbGdcIiwgY2hpbGRyZW46IFtfanN4KFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJzbWFsbFwiLCBjbGFzc05hbWU6IFwidGV4dC1ncmF5LTYwMFwiLCBjaGlsZHJlbjogXCJDYWxsIER1cmF0aW9uXCIgfSksIF9qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcInNtYWxsXCIsIGNsYXNzTmFtZTogXCJmb250LXNlbWlib2xkXCIsIGNoaWxkcmVuOiBmb3JtYXREdXJhdGlvblZlcmJvc2UoZGlzcG9zaXRpb25EYXRhLmNhbGxEdXJhdGlvbikgfSldIH0pLCBfanN4KFJhZGlvR3JvdXAsIHsgbmFtZTogXCJjYWxsU3RhdHVzRGlzcG9zaXRpb25cIiwgbGFiZWw6IFwiQ2FsbCBTdGF0dXNcIiwgcmVxdWlyZWQ6IHRydWUsIG9wdGlvbnM6IENBTExfU1RBVFVTX09QVElPTlMsIGRpcmVjdGlvbjogXCJyb3dcIiwgdmFsdWU6IGNhbGxTdGF0dXMsIG9uQ2hhbmdlOiBoYW5kbGVDYWxsU3RhdHVzQ2hhbmdlIH0pLCBjYWxsU3RhdHVzICYmIChfanN4KFNpbmdsZVNlbGVjdCwgeyBuYW1lOiBcImRpc3Bvc2l0aW9uQ2F0ZWdvcnlcIiwgbGFiZWw6IFwiQ2FsbCBEaXNwb3NpdGlvblwiLCByZXF1aXJlZDogdHJ1ZSwgZnVsbFdpZHRoOiB0cnVlLCBwbGFjZWhvbGRlcjogXCJTZWFyY2ggZGlzcG9zaXRpb24uLi5cIiwgb3B0aW9uczogZGlzcG9zaXRpb25PcHRpb25zLCB2YWx1ZTogZGlzcG9zaXRpb25DYXRlZ29yeSwgb25DaGFuZ2U6IGhhbmRsZURpc3Bvc2l0aW9uQ2hhbmdlIH0sIGNhbGxTdGF0dXMpKSwgX2pzeChUZXh0YXJlYSwgeyBuYW1lOiBcInJlbWFya3NcIiwgbGFiZWw6IFwiUmVtYXJrc1wiLCBwbGFjZWhvbGRlcjogXCJBZGQgYW55IGFkZGl0aW9uYWwgbm90ZXMgYWJvdXQgdGhpcyBjYWxsLi4uXCIsIHJvd3M6IDMsIGZ1bGxXaWR0aDogdHJ1ZSwgdmFsdWU6IHJlbWFya3MsIG9uQ2hhbmdlOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gc2V0UmVtYXJrcyhlLnRhcmdldC52YWx1ZSk7IH0sIGNsYXNzTmFtZTogXCJicmVhay1hbGxcIiB9KSwgX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBqdXN0aWZ5LXN0YXJ0IGdhcC0yIHB0LTQgYm9yZGVyLXRcIiwgY2hpbGRyZW46IFtfanN4KEJ1dHRvbiwgeyBvbkNsaWNrOiBoYW5kbGVTdWJtaXQsIGRpc2FibGVkOiAhY2FsbFN0YXR1cyB8fCAhZGlzcG9zaXRpb25DYXRlZ29yeSwgbG9hZGluZzogaXNMb2FkaW5nLCBjaGlsZHJlbjogaXNFZGl0TW9kZSA/ICdVcGRhdGUgRGlzcG9zaXRpb24nIDogJ1NhdmUgRGlzcG9zaXRpb24nIH0pLCBfanN4KEJ1dHRvbiwgeyB2YXJpYW50OiBcIm91dGxpbmVcIiwgb25DbGljazogb25DbG9zZSwgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSldIH0pXSB9KSk7IH0gfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IENhbGxEaXNwb3NpdGlvbkZvcm07XG4iLCIvKipcbiAqIEZvcm1hdCBkdXJhdGlvbiBpbiBNTTpTUyBmb3JtYXQgKGUuZy4sIFwiMDI6MzBcIilcbiAqL1xuZXhwb3J0IHZhciBmb3JtYXREdXJhdGlvblRpbWVyID0gZnVuY3Rpb24gKHNlY29uZHMpIHtcbiAgICB2YXIgbWlucyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICB2YXIgc2VjcyA9IHNlY29uZHMgJSA2MDtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQobWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyksIFwiOlwiKS5jb25jYXQoc2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpO1xufTtcbi8qKlxuICogRm9ybWF0IGR1cmF0aW9uIGluIHZlcmJvc2UgZm9ybWF0IChlLmcuLCBcIjJtIDMwc1wiKVxuICovXG5leHBvcnQgdmFyIGZvcm1hdER1cmF0aW9uVmVyYm9zZSA9IGZ1bmN0aW9uIChzZWNvbmRzKSB7XG4gICAgdmFyIG1pbnMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgdmFyIHNlY3MgPSBzZWNvbmRzICUgNjA7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KG1pbnMsIFwibSBcIikuY29uY2F0KHNlY3MsIFwic1wiKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgQnV0dG9uLCBUeXBvZ3JhcGh5IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBNaWMsIE1pY09mZiwgUGF1c2UsIFBob25lLCBQaG9uZUluY29taW5nLCBQaG9uZU9mZiwgUGhvbmVPdXRnb2luZywgUGxheSwgVm9sdW1lMiwgVm9sdW1lWCwgWCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgRVhPVEVMX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9leG90ZWwuY29uc3RhbnRzJztcbmltcG9ydCB7IHVzZUV4b3RlbCB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9FeG90ZWxQcm92aWRlcic7XG5pbXBvcnQgeyBjYW5jZWxDYWxsLCBzYXZlQ2FsbERpc3Bvc2l0aW9uIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhvdGVsL2FwaSc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvblRpbWVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXhvdGVsL2Zvcm1hdHRlcnMnO1xuaW1wb3J0IENhbGxEaXNwb3NpdGlvbkZvcm0gZnJvbSAnLi9DYWxsRGlzcG9zaXRpb25Gb3JtJztcbi8vIENTUyBmb3IgcHVsc2luZyBhbmltYXRpb25cbnZhciBwdWxzZUFuaW1hdGlvblN0eWxlID0gXCJcXG5Aa2V5ZnJhbWVzIHB1bHNlLXJpbmcge1xcbiAgMCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICBvcGFjaXR5OiAxO1xcbiAgfVxcbiAgNTAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjE1KTtcXG4gICAgb3BhY2l0eTogMC43O1xcbiAgfVxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgIG9wYWNpdHk6IDE7XFxuICB9XFxufVxcblxcbkBrZXlmcmFtZXMgcHVsc2UtZG90IHtcXG4gIDAlLCAxMDAlIHtcXG4gICAgYm94LXNoYWRvdzogMCAwIDAgMCByZ2JhKDI0OSwgMTE1LCAyMiwgMC43KTtcXG4gIH1cXG4gIDUwJSB7XFxuICAgIGJveC1zaGFkb3c6IDAgMCAwIDIwcHggcmdiYSgyNDksIDExNSwgMjIsIDApO1xcbiAgfVxcbn1cXG5cXG4uYW5pbWF0ZS1wdWxzZS1yaW5nIHtcXG4gIGFuaW1hdGlvbjogcHVsc2UtcmluZyAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xcbn1cXG5cXG4uYW5pbWF0ZS1wdWxzZS1kb3Qge1xcbiAgYW5pbWF0aW9uOiBwdWxzZS1kb3QgMS41cyBlYXNlLWluLW91dCBpbmZpbml0ZTtcXG59XFxuXCI7XG52YXIgRXhvdGVsUGhvbmUgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBwcm9zcGVjdElkID0gX2EucHJvc3BlY3RJZCwgcHJvc3BlY3ROYW1lID0gX2EucHJvc3BlY3ROYW1lLCBwcm9zcGVjdE51bWJlciA9IF9hLnByb3NwZWN0TnVtYmVyLCBvblNhdmVEaXNwb3NpdGlvbiA9IF9hLm9uU2F2ZURpc3Bvc2l0aW9uO1xuICAgIHZhciBfYiA9IHVzZUV4b3RlbCgpLCBjYWxsU3RhdGUgPSBfYi5jYWxsU3RhdGUsIGRpc3Bvc2l0aW9uRGF0YSA9IF9iLmRpc3Bvc2l0aW9uRGF0YSwgYWNjZXB0Q2FsbCA9IF9iLmFjY2VwdENhbGwsIGhhbmd1cENhbGwgPSBfYi5oYW5ndXBDYWxsLCByZWplY3RDYWxsID0gX2IucmVqZWN0Q2FsbCwgdG9nZ2xlSG9sZCA9IF9iLnRvZ2dsZUhvbGQsIHRvZ2dsZU11dGUgPSBfYi50b2dnbGVNdXRlLCB0b2dnbGVTcGVha2VyID0gX2IudG9nZ2xlU3BlYWtlciwgY2xlYXJEaXNwb3NpdGlvbiA9IF9iLmNsZWFyRGlzcG9zaXRpb247XG4gICAgdmFyIF9jID0gdXNlU3RhdGUoZmFsc2UpLCBpc0FjY2VwdGluZyA9IF9jWzBdLCBzZXRJc0FjY2VwdGluZyA9IF9jWzFdO1xuICAgIHZhciBfZCA9IHVzZVN0YXRlKGZhbHNlKSwgaXNEZWNsaW5pbmcgPSBfZFswXSwgc2V0SXNEZWNsaW5pbmcgPSBfZFsxXTtcbiAgICB2YXIgZGVjbGluZVRpbWVvdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgLy8gSW5qZWN0IGFuaW1hdGlvbiBzdHlsZXNcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3R5bGVJZCA9ICdleG90ZWwtcGhvbmUtYW5pbWF0aW9ucyc7XG4gICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHtcbiAgICAgICAgICAgIHZhciBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgIHN0eWxlRWwuaWQgPSBzdHlsZUlkO1xuICAgICAgICAgICAgc3R5bGVFbC50ZXh0Q29udGVudCA9IHB1bHNlQW5pbWF0aW9uU3R5bGU7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlRWwpO1xuICAgICAgICB9XG4gICAgfSwgW10pO1xuICAgIHZhciBwaGFzZSA9IGNhbGxTdGF0ZS5waGFzZSwgY2FsbERhdGEgPSBjYWxsU3RhdGUuY2FsbERhdGEsIGlzT25Ib2xkID0gY2FsbFN0YXRlLmlzT25Ib2xkLCBpc011dGVkID0gY2FsbFN0YXRlLmlzTXV0ZWQsIGlzU3BlYWtlck9mZiA9IGNhbGxTdGF0ZS5pc1NwZWFrZXJPZmYsIGNhbGxEaXJlY3Rpb24gPSBjYWxsU3RhdGUuY2FsbERpcmVjdGlvbiwgY2FsbER1cmF0aW9uID0gY2FsbFN0YXRlLmNhbGxEdXJhdGlvbiwgc2RrQ2FsbGVyTmFtZSA9IGNhbGxTdGF0ZS5jYWxsZXJOYW1lLCBzZGtDYWxsZXJOdW1iZXIgPSBjYWxsU3RhdGUuY2FsbGVyTnVtYmVyLCBjYWxsQWN0aXZpdHlJZCA9IGNhbGxTdGF0ZS5jYWxsQWN0aXZpdHlJZCwgZXhvdGVsQ2FsbFNpZCA9IGNhbGxTdGF0ZS5leG90ZWxDYWxsU2lkLCBwcm9zcGVjdFVuaXF1ZUlkID0gY2FsbFN0YXRlLnByb3NwZWN0VW5pcXVlSWQ7XG4gICAgLy8gVXNlIHByb3BzIChmcm9tIFByb3NwZWN0IHZpZXcpIGFzIHByaW1hcnksIGZhbGwgYmFjayB0byBTREsgdmFsdWVzIChmb3IgaW5jb21pbmcgY2FsbHMpXG4gICAgdmFyIGRpc3BsYXlOYW1lID0gcHJvc3BlY3ROYW1lIHx8IHNka0NhbGxlck5hbWUgfHwgJ1Vua25vd24nO1xuICAgIHZhciBkaXNwbGF5TnVtYmVyID0gcHJvc3BlY3ROdW1iZXIgfHwgc2RrQ2FsbGVyTnVtYmVyIHx8ICdObyBudW1iZXInO1xuICAgIHZhciBoYW5kbGVBY2NlcHRDYWxsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVycm9yXzE7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHNldElzQWNjZXB0aW5nKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsIDQsIDVdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYWNjZXB0Q2FsbCgpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBY2NlcHQgY2FsbCBlcnJvcjonLCBlcnJvcl8xKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBzZXRJc0FjY2VwdGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pOyB9O1xuICAgIHZhciBoYW5kbGVEZWNsaW5lQ2FsbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjYWxsU2lkRm9yQXBpLCByZWFzb24sIGVycm9yXzI7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHNldElzRGVjbGluaW5nKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgcmVqZWN0Q2FsbCBmb3IgaW5jb21pbmcvcmVhZHlfdG9fY2FsbCAoYmVmb3JlIGFjY2VwdGluZylcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGhhbmd1cENhbGwgZm9yIGNvbm5lY3RlZC9jYWxsaW5nIChhZnRlciBhY2NlcHRpbmcpXG4gICAgICAgICAgICAgICAgICAgIGlmIChwaGFzZSA9PT0gJ2luY29taW5nJyB8fCBwaGFzZSA9PT0gJ3JlYWR5X3RvX2NhbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3RDYWxsKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5ndXBDYWxsKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FsbFNpZEZvckFwaSA9IGV4b3RlbENhbGxTaWQgfHwgY2FsbEFjdGl2aXR5SWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FsbFNpZEZvckFwaSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9IHBoYXNlID09PSAnY29ubmVjdGVkJyA/ICdlbmRlZCcgOiAnZGVjbGluZWQnO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBjYW5jZWxDYWxsKHsgY2FsbFNpZDogY2FsbFNpZEZvckFwaSwgcmVhc29uOiByZWFzb24gfSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGVycm9yXzIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjYW5jZWwgY2FsbCBpbiBiYWNrZW5kOicsIGVycm9yXzIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjYWxsIHdhc24ndCBjb25uZWN0ZWQgeWV0LCBTREsgbWlnaHQgbm90IGZpcmUgJ2NhbGxFbmRlZCcgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGEgdGltZW91dCB0byBmb3JjZSByZXNldCB0aGUgZGVjbGluaW5nIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IERvbid0IGNsZWFyIGRpc3Bvc2l0aW9uIGhlcmUgLSBsZXQgdGhlIFNESydzIGNhbGxFbmRlZCBldmVudCBoYW5kbGUgaXRcbiAgICAgICAgICAgICAgICAgICAgZGVjbGluZVRpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWNsaW5pbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9LCBFWE9URUxfQ09OU1RBTlRTLkRFQ0xJTkVfVElNRU9VVF9NUyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7IH07XG4gICAgLy8gQ2xlYXIgZGVjbGluZSB0aW1lb3V0IHdoZW4gcGhhc2UgY2hhbmdlcyAobWVhbmluZyBTREsgaGFuZGxlZCBpdClcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocGhhc2UgPT09ICdpZGxlJyB8fCBwaGFzZSA9PT0gJ2VuZGVkJykge1xuICAgICAgICAgICAgaWYgKGRlY2xpbmVUaW1lb3V0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVjbGluZVRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgZGVjbGluZVRpbWVvdXRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRJc0RlY2xpbmluZyhmYWxzZSk7XG4gICAgICAgICAgICAvLyBOb3RlOiBEb24ndCBhdXRvLWNsZWFyIGRpc3Bvc2l0aW9uIGhlcmUgLSBsZXQgdXNlciBzdWJtaXQgb3IgY2xvc2UgdGhlIGZvcm0gbWFudWFsbHlcbiAgICAgICAgfVxuICAgIH0sIFtwaGFzZV0pO1xuICAgIC8vIEhhbmRsZSBzYXZpbmcgZGlzcG9zaXRpb24gdG8gYmFja2VuZFxuICAgIHZhciBoYW5kbGVTYXZlRGlzcG9zaXRpb24gPSBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgLy8gSWYgY3VzdG9tIGhhbmRsZXIgaXMgcHJvdmlkZWQsIHVzZSBpdFxuICAgICAgICAgICAgaWYgKG9uU2F2ZURpc3Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG9uU2F2ZURpc3Bvc2l0aW9uKGRhdGEpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVzZSB0aGUgY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uIGZyb20gdGhlIGZvcm0gKHVzZXIgc2VsZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgc2F2ZUNhbGxEaXNwb3NpdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxJZDogZGF0YS5jYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgIHByb3NwZWN0SWQ6IGRhdGEucHJvc3BlY3RJZCB8fCBwcm9zcGVjdElkIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICBjYWxsU3RhdHVzRGlzcG9zaXRpb246IGRhdGEuY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvbkNhdGVnb3J5OiBkYXRhLmRpc3Bvc2l0aW9uQ2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uTm90ZXM6IGRhdGEucmVtYXJrcyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICB9KTtcbiAgICB9KTsgfTtcbiAgICAvLyBDbGVhbnVwIHRpbWVvdXQgb24gdW5tb3VudFxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoZGVjbGluZVRpbWVvdXRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWNsaW5lVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LCBbXSk7XG4gICAgLy8gU2hvdyBkaXNwb3NpdGlvbiBmb3JtIGFmdGVyIGNhbGwgZW5kc1xuICAgIGlmIChkaXNwb3NpdGlvbkRhdGEpIHtcbiAgICAgICAgLy8gVXNlIHByb3NwZWN0IG5hbWUgZnJvbSBwcm9wcywgb3IgZnJvbSBkaXNwb3NpdGlvbkRhdGEgKHByZXNlcnZlZCBmcm9tIGNhbGwpLCBvciBmYWxsYmFja1xuICAgICAgICB2YXIgZmluYWxDYWxsZXJOYW1lID0gcHJvc3BlY3ROYW1lIHx8IGRpc3Bvc2l0aW9uRGF0YS5jYWxsZXJOYW1lIHx8IHNka0NhbGxlck5hbWUgfHwgJ1Vua25vd24nO1xuICAgICAgICAvLyBPdmVycmlkZSBkaXNwb3NpdGlvbiBkYXRhIHdpdGggcHJvc3BlY3QgZGV0YWlsc1xuICAgICAgICB2YXIgZW5yaWNoZWREaXNwb3NpdGlvbkRhdGEgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGlzcG9zaXRpb25EYXRhKSwgeyBjYWxsZXJOYW1lOiBmaW5hbENhbGxlck5hbWUsIGNhbGxlck51bWJlcjogZGlzcGxheU51bWJlciB9KTtcbiAgICAgICAgcmV0dXJuIChfanN4KENhbGxEaXNwb3NpdGlvbkZvcm0sIHsgZGlzcG9zaXRpb25EYXRhOiBlbnJpY2hlZERpc3Bvc2l0aW9uRGF0YSwgcHJvc3BlY3RJZDogcHJvc3BlY3RJZCwgb25DbG9zZTogY2xlYXJEaXNwb3NpdGlvbiwgb25TYXZlOiBoYW5kbGVTYXZlRGlzcG9zaXRpb24sIGV4aXN0aW5nRGF0YTogdW5kZWZpbmVkIH0pKTtcbiAgICB9XG4gICAgLy8gRG9uJ3Qgc2hvdyBhbnl0aGluZyBpZiBpZGxlIG9yIGVuZGVkXG4gICAgaWYgKHBoYXNlID09PSAnaWRsZScgfHwgcGhhc2UgPT09ICdlbmRlZCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBpc091dGJvdW5kID0gY2FsbERpcmVjdGlvbiA9PT0gJ291dGJvdW5kJztcbiAgICB2YXIgaXNJbmJvdW5kID0gY2FsbERpcmVjdGlvbiA9PT0gJ2luYm91bmQnO1xuICAgIC8vIEdldCBhdmF0YXIgY29sb3IgYmFzZWQgb24gY2FsbCBkaXJlY3Rpb25cbiAgICB2YXIgYXZhdGFyQmdDb2xvciA9IHBoYXNlID09PSAnY29ubmVjdGVkJ1xuICAgICAgICA/ICdiZy1ncmVlbi01MDAnXG4gICAgICAgIDogaXNPdXRib3VuZFxuICAgICAgICAgICAgPyAnYmctYmx1ZS01MDAnXG4gICAgICAgICAgICA6ICdiZy1vcmFuZ2UtNTAwJztcbiAgICAvLyBHZXQgc3RhdHVzIHRleHRcbiAgICB2YXIgZ2V0U3RhdHVzVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3dpdGNoIChwaGFzZSkge1xuICAgICAgICAgICAgY2FzZSAncmVhZHlfdG9fY2FsbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdSZWFkeSB0byBjYWxsLi4uJztcbiAgICAgICAgICAgIGNhc2UgJ2NhbGxpbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnQ2FsbGluZy4uLic7XG4gICAgICAgICAgICBjYXNlICdpbmNvbWluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdJbmNvbWluZyBjYWxsLi4uJztcbiAgICAgICAgICAgIGNhc2UgJ2Nvbm5lY3RlZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIFdpbGwgc2hvdyB0aW1lciBpbnN0ZWFkXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBHZXQgY29ubmVjdGluZyB0ZXh0IGZvciBjYWxsaW5nIHN0YXRlXG4gICAgdmFyIGdldENvbm5lY3RpbmdUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocGhhc2UgPT09ICdjYWxsaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFwiQ29ubmVjdGluZyB0byBcIi5jb25jYXQoZGlzcGxheU5hbWUsIFwiLi4uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgdmFyIG1vZGFsQ29udGVudCA9IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZpeGVkIGluc2V0LTAgYmctYmxhY2svNTBcIiwgc3R5bGU6IHsgekluZGV4OiBFWE9URUxfQ09OU1RBTlRTLk1PREFMX0JBQ0tEUk9QX1pfSU5ERVggfSwgb25DbGljazogaGFuZGxlRGVjbGluZUNhbGwgfSksIF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZml4ZWQgaW5zZXQtMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBwLTQgXCIuY29uY2F0KGNsYXNzTmFtZSksIHN0eWxlOiB7IHpJbmRleDogRVhPVEVMX0NPTlNUQU5UUy5NT0RBTF9aX0lOREVYIH0sIGNoaWxkcmVuOiBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJyZWxhdGl2ZSB3LWZ1bGwgbWF4LXctbWQgcC02IGJnLXdoaXRlIHNoYWRvdy0yeGxcIiwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogRVhPVEVMX0NPTlNUQU5UUy5NT0RBTF9CT1JERVJfUkFESVVTLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICNlNWU3ZWInLFxuICAgICAgICAgICAgICAgICAgICB9LCBvbkNsaWNrOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKTsgfSwgY2hpbGRyZW46IFtfanN4KFwiYnV0dG9uXCIsIHsgb25DbGljazogaGFuZGxlRGVjbGluZUNhbGwsIGNsYXNzTmFtZTogXCJhYnNvbHV0ZSBwLTEgdHJhbnNpdGlvbi1jb2xvcnMgcm91bmRlZC1mdWxsIHRvcC00IHJpZ2h0LTQgaG92ZXI6YmctZ3JheS0xMDBcIiwgY2hpbGRyZW46IF9qc3goWCwgeyBjbGFzc05hbWU6IFwidy01IGgtNSB0ZXh0LWdyYXktNTAwXCIgfSkgfSksIF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBqdXN0aWZ5LWNlbnRlciBtYi02XCIsIGNoaWxkcmVuOiBfanN4cyhcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcHgtMyBweS0xIHJvdW5kZWQtZnVsbCB0ZXh0LXNtIGZvbnQtbWVkaXVtIGJvcmRlciBcIi5jb25jYXQoaXNPdXRib3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndGV4dC1ibHVlLTYwMCBib3JkZXItYmx1ZS0yMDAgYmctYmx1ZS01MCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RleHQtZ3JlZW4tNjAwIGJvcmRlci1ncmVlbi0yMDAgYmctZ3JlZW4tNTAnKSwgY2hpbGRyZW46IFtpc091dGJvdW5kID8gKF9qc3goUGhvbmVPdXRnb2luZywgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pKSA6IChfanN4KFBob25lSW5jb21pbmcsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSksIGlzT3V0Ym91bmQgPyAnT3V0Z29pbmcgQ2FsbCcgOiAnSW5jb21pbmcgQ2FsbCddIH0pIH0pLCBfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXgganVzdGlmeS1jZW50ZXIgbWItNFwiLCBjaGlsZHJlbjogX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJ3LTI0IGgtMjQgcm91bmRlZC1mdWxsIFwiLmNvbmNhdChhdmF0YXJCZ0NvbG9yLCBcIiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBcIikuY29uY2F0KHBoYXNlID09PSAnaW5jb21pbmcnIHx8IHBoYXNlID09PSAncmVhZHlfdG9fY2FsbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2FuaW1hdGUtcHVsc2UtcmluZyBhbmltYXRlLXB1bHNlLWRvdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJycpLCBjaGlsZHJlbjogaXNJbmJvdW5kICYmIHBoYXNlID09PSAnaW5jb21pbmcnID8gKF9qc3goUGhvbmVJbmNvbWluZywgeyBjbGFzc05hbWU6IFwidy0xMCBoLTEwIHRleHQtd2hpdGVcIiB9KSkgOiAoX2pzeChQaG9uZSwgeyBjbGFzc05hbWU6IFwidy0xMCBoLTEwIHRleHQtd2hpdGVcIiB9KSkgfSkgfSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcIm1iLTQgdGV4dC1jZW50ZXJcIiwgY2hpbGRyZW46IFtfanN4KFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJoM1wiLCBjbGFzc05hbWU6IFwidGV4dC14bCBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDBcIiwgY2hpbGRyZW46IGRpc3BsYXlOYW1lIH0pLCBwcm9zcGVjdFVuaXF1ZUlkICYmIChfanN4cyhUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwic21hbGxcIiwgY2xhc3NOYW1lOiBcImZvbnQtbWVkaXVtIHRleHQtYmx1ZS02MDBcIiwgY2hpbGRyZW46IFtcIklEOiBcIiwgcHJvc3BlY3RVbmlxdWVJZF0gfSkpLCBfanN4KFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJtdXRlZFwiLCBjaGlsZHJlbjogZGlzcGxheU51bWJlciB9KV0gfSksIF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwibWItNiB0ZXh0LWNlbnRlclwiLCBjaGlsZHJlbjogcGhhc2UgPT09ICdjb25uZWN0ZWQnID8gKF9qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcInBcIiwgY2xhc3NOYW1lOiBcInRleHQtbGcgZm9udC1tZWRpdW0gdGV4dC1ncmVlbi01MDBcIiwgY2hpbGRyZW46IGZvcm1hdER1cmF0aW9uVGltZXIoY2FsbER1cmF0aW9uKSB9KSkgOiAoX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwibXV0ZWRcIiwgY2hpbGRyZW46IGdldFN0YXR1c1RleHQoKSB9KSkgfSksIHBoYXNlID09PSAnY29ubmVjdGVkJyAmJiAoX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBqdXN0aWZ5LWNlbnRlciBnYXAtNiBtYi02XCIsIGNoaWxkcmVuOiBbX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwidGV4dC1jZW50ZXJcIiwgY2hpbGRyZW46IFtfanN4KFwiYnV0dG9uXCIsIHsgb25DbGljazogdG9nZ2xlTXV0ZSwgY2xhc3NOYW1lOiBcInctMTIgaC0xMiByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMgXCIuY29uY2F0KGlzTXV0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JnLWdyYXktMjAwIGJvcmRlci1ncmF5LTMwMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JnLXdoaXRlIGJvcmRlci1ncmF5LTIwMCBob3ZlcjpiZy1ncmF5LTUwJyksIGNoaWxkcmVuOiBpc011dGVkID8gKF9qc3goTWljT2ZmLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS02MDBcIiB9KSkgOiAoX2pzeChNaWMsIHsgY2xhc3NOYW1lOiBcInctNSBoLTUgdGV4dC1ncmF5LTYwMFwiIH0pKSB9KSwgX2pzeChcInBcIiwgeyBjbGFzc05hbWU6IFwibXQtMSB0ZXh0LXhzIHRleHQtZ3JheS01MDBcIiwgY2hpbGRyZW46IGlzTXV0ZWQgPyAnVW5tdXRlJyA6ICdNdXRlJyB9KV0gfSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInRleHQtY2VudGVyXCIsIGNoaWxkcmVuOiBbX2pzeChcImJ1dHRvblwiLCB7IG9uQ2xpY2s6IHRvZ2dsZUhvbGQsIGNsYXNzTmFtZTogXCJ3LTEyIGgtMTIgcm91bmRlZC1mdWxsIGJvcmRlci0yIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRyYW5zaXRpb24tY29sb3JzIFwiLmNvbmNhdChpc09uSG9sZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYmctZ3JheS0yMDAgYm9yZGVyLWdyYXktMzAwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnYmctd2hpdGUgYm9yZGVyLWdyYXktMjAwIGhvdmVyOmJnLWdyYXktNTAnKSwgY2hpbGRyZW46IGlzT25Ib2xkID8gKF9qc3goUGxheSwgeyBjbGFzc05hbWU6IFwidy01IGgtNSB0ZXh0LWdyYXktNjAwXCIgfSkpIDogKF9qc3goUGF1c2UsIHsgY2xhc3NOYW1lOiBcInctNSBoLTUgdGV4dC1ncmF5LTYwMFwiIH0pKSB9KSwgX2pzeChcInBcIiwgeyBjbGFzc05hbWU6IFwibXQtMSB0ZXh0LXhzIHRleHQtZ3JheS01MDBcIiwgY2hpbGRyZW46IGlzT25Ib2xkID8gJ1Jlc3VtZScgOiAnSG9sZCcgfSldIH0pLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LWNlbnRlclwiLCBjaGlsZHJlbjogW19qc3goXCJidXR0b25cIiwgeyBvbkNsaWNrOiB0b2dnbGVTcGVha2VyLCBjbGFzc05hbWU6IFwidy0xMiBoLTEyIHJvdW5kZWQtZnVsbCBib3JkZXItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0cmFuc2l0aW9uLWNvbG9ycyBcIi5jb25jYXQoaXNTcGVha2VyT2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdiZy1ncmF5LTIwMCBib3JkZXItZ3JheS0zMDAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdiZy13aGl0ZSBib3JkZXItZ3JheS0yMDAgaG92ZXI6YmctZ3JheS01MCcpLCBjaGlsZHJlbjogaXNTcGVha2VyT2ZmID8gKF9qc3goVm9sdW1lWCwgeyBjbGFzc05hbWU6IFwidy01IGgtNSB0ZXh0LWdyYXktNjAwXCIgfSkpIDogKF9qc3goVm9sdW1lMiwgeyBjbGFzc05hbWU6IFwidy01IGgtNSB0ZXh0LWdyYXktNjAwXCIgfSkpIH0pLCBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJtdC0xIHRleHQteHMgdGV4dC1ncmF5LTUwMFwiLCBjaGlsZHJlbjogaXNTcGVha2VyT2ZmID8gJ1NwZWFrZXIgT24nIDogJ1NwZWFrZXIgT2ZmJyB9KV0gfSldIH0pKSwgX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBqdXN0aWZ5LWNlbnRlciBnYXAtNFwiLCBjaGlsZHJlbjogWyhwaGFzZSA9PT0gJ3JlYWR5X3RvX2NhbGwnIHx8IHBoYXNlID09PSAnaW5jb21pbmcnKSAmJiAoX2pzeHMoX0ZyYWdtZW50LCB7IGNoaWxkcmVuOiBbX2pzeHMoQnV0dG9uLCB7IHZhcmlhbnQ6IFwiZGVzdHJ1Y3RpdmVcIiwgb25DbGljazogaGFuZGxlRGVjbGluZUNhbGwsIGRpc2FibGVkOiBpc0RlY2xpbmluZywgY2xhc3NOYW1lOiBcImdhcC0yIHB4LTZcIiwgY2hpbGRyZW46IFtfanN4KFBob25lT2ZmLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSksIGlzRGVjbGluaW5nID8gJ0RlY2xpbmluZy4uLicgOiAnRGVjbGluZSddIH0pLCBfanN4cyhCdXR0b24sIHsgdmFyaWFudDogXCJkZWZhdWx0XCIsIG9uQ2xpY2s6IGhhbmRsZUFjY2VwdENhbGwsIGRpc2FibGVkOiBpc0FjY2VwdGluZyB8fCBpc0RlY2xpbmluZywgc3R5bGU6IHsgYmFja2dyb3VuZENvbG9yOiAnIzIyYzU1ZScgfSwgY2xhc3NOYW1lOiBcImdhcC0yIHB4LTYgaG92ZXI6YmctZ3JlZW4tNjAwXCIsIGNoaWxkcmVuOiBbX2pzeChQaG9uZSwgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pLCBcIkFjY2VwdFwiXSB9KV0gfSkpLCBwaGFzZSA9PT0gJ2NhbGxpbmcnICYmIChfanN4cyhCdXR0b24sIHsgdmFyaWFudDogXCJkZXN0cnVjdGl2ZVwiLCBvbkNsaWNrOiBoYW5kbGVEZWNsaW5lQ2FsbCwgZGlzYWJsZWQ6IGlzRGVjbGluaW5nLCBjbGFzc05hbWU6IFwiZ2FwLTIgcHgtNlwiLCBjaGlsZHJlbjogW19qc3goUGhvbmVPZmYsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSwgaXNEZWNsaW5pbmcgPyAnRW5kaW5nLi4uJyA6ICdFbmQgQ2FsbCddIH0pKSwgcGhhc2UgPT09ICdjb25uZWN0ZWQnICYmIChfanN4cyhCdXR0b24sIHsgdmFyaWFudDogXCJkZXN0cnVjdGl2ZVwiLCBvbkNsaWNrOiBoYW5kbGVEZWNsaW5lQ2FsbCwgZGlzYWJsZWQ6IGlzRGVjbGluaW5nLCBjbGFzc05hbWU6IFwiZ2FwLTIgcHgtOFwiLCBjaGlsZHJlbjogW19qc3goUGhvbmVPZmYsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSwgaXNEZWNsaW5pbmcgPyAnRW5kaW5nLi4uJyA6ICdFbmQgQ2FsbCddIH0pKV0gfSksIGdldENvbm5lY3RpbmdUZXh0KCkgJiYgKF9qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcInNtYWxsXCIsIGNsYXNzTmFtZTogXCJtdC00IHRleHQtY2VudGVyIHRleHQtZ3JheS01MDBcIiwgY2hpbGRyZW46IGdldENvbm5lY3RpbmdUZXh0KCkgfSkpXSB9KSB9KV0gfSkpO1xuICAgIC8vIFVzZSBwb3J0YWwgdG8gcmVuZGVyIGF0IGRvY3VtZW50IGJvZHkgbGV2ZWwgdG8gZXNjYXBlIGFueSBwYXJlbnQgc3RhY2tpbmcgY29udGV4dHNcbiAgICByZXR1cm4gY3JlYXRlUG9ydGFsKG1vZGFsQ29udGVudCwgZG9jdW1lbnQuYm9keSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRXhvdGVsUGhvbmU7XG4iLCJpbXBvcnQgeyBzeW5jU2NyeXB0IH0gZnJvbSAnc2NyeXB0LWpzJztcbnZhciBDcnlwdG9TZXJ2aWNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENyeXB0b1NlcnZpY2UoKSB7XG4gICAgICAgIHRoaXMuYWxnb3JpdGhtID0gJ2Flcy0yNTYtY2JjJztcbiAgICAgICAgdGhpcy5zZWNyZXRLZXkgPSBudWxsO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIC8vIExhenkgaW5pdGlhbGl6YXRpb24gLSBkb24ndCBydW4gaGVhdnkgY3J5cHRvIG9wZXJhdGlvbnMgYXQgbW9kdWxlIGxvYWQgdGltZVxuICAgIH1cbiAgICBDcnlwdG9TZXJ2aWNlLnByb3RvdHlwZS5lbnN1cmVJbml0aWFsaXplZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gJzQzMWZlZjk5LTQ3ZGMtNGQyYS05MTc1LTJlOGYxOWIyMDIyNSc7XG4gICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gU2FtZSBhcyBiYWNrZW5kOiBjcnlwdG8uc2NyeXB0U3luYyhrZXksICdzYWx0JywgMzIpXG4gICAgICAgICAgICAgICAgLy8gc2NyeXB0LWpzIHdpdGggTj0xNjM4NCwgcj04LCBwPTEgbWF0Y2hlcyBOb2RlLmpzIGRlZmF1bHRzXG4gICAgICAgICAgICAgICAgdmFyIGtleUJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXkpO1xuICAgICAgICAgICAgICAgIHZhciBzYWx0QnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCdzYWx0Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWNyZXRLZXkgPSBzeW5jU2NyeXB0KGtleUJ1ZmZlciwgc2FsdEJ1ZmZlciwgMTYzODQsIDgsIDEsIDMyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3J5cHRvU2VydmljZSBpbml0aWFsaXphdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7IC8vIFByZXZlbnQgcmVwZWF0ZWQgYXR0ZW1wdHNcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ3J5cHRvU2VydmljZS5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFDcnlwdG9TZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBDcnlwdG9TZXJ2aWNlLmluc3RhbmNlID0gbmV3IENyeXB0b1NlcnZpY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ3J5cHRvU2VydmljZS5pbnN0YW5jZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlY3J5cHQgZGF0YSB1c2luZyBBRVMtMjU2LUNCQyAoc2FtZSBhcyBiYWNrZW5kKVxuICAgICAqIEZvcm1hdDogXCJpdl9oZXg6ZW5jcnlwdGVkX2hleFwiXG4gICAgICovXG4gICAgQ3J5cHRvU2VydmljZS5wcm90b3R5cGUuZGVjcnlwdERhdGEgPSBmdW5jdGlvbiAoZW5jcnlwdGVkRGF0YSkge1xuICAgICAgICB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgICAgIGlmICghZW5jcnlwdGVkRGF0YSB8fCAhdGhpcy5zZWNyZXRLZXkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ01pc3NpbmcgZW5jcnlwdGVkIGRhdGEgb3Igc2VjcmV0IGtleScpO1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbmNyeXB0ZWREYXRhLnNwbGl0KCc6JyksIGl2SGV4ID0gX2FbMF0sIGVuY3J5cHRlZCA9IF9hWzFdO1xuICAgICAgICAgICAgaWYgKCFpdkhleCB8fCAhZW5jcnlwdGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBlbmNyeXB0ZWQgZGF0YSBmb3JtYXQnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBVc2UgcmVxdWlyZSBmb3IgY3J5cHRvIHRvIGF2b2lkIGJ1bmRsZXIgaXNzdWVzIHdpdGggdG9wLWxldmVsIGltcG9ydHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgICAgICAgICB2YXIgY3J5cHRvXzEgPSByZXF1aXJlKCdjcnlwdG8nKTtcbiAgICAgICAgICAgIHZhciBpdiA9IEJ1ZmZlci5mcm9tKGl2SGV4LCAnaGV4Jyk7XG4gICAgICAgICAgICB2YXIgZGVjaXBoZXIgPSBjcnlwdG9fMS5jcmVhdGVEZWNpcGhlcml2KHRoaXMuYWxnb3JpdGhtLCBCdWZmZXIuZnJvbSh0aGlzLnNlY3JldEtleSksIGl2KTtcbiAgICAgICAgICAgIHZhciBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoZW5jcnlwdGVkLCAnaGV4JywgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGRlY3J5cHRlZCArPSBkZWNpcGhlci5maW5hbCgndXRmOCcpO1xuICAgICAgICAgICAgcmV0dXJuIGRlY3J5cHRlZDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlY3J5cHRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogTWFzayBtb2JpbGUgbnVtYmVyIGZvciBkaXNwbGF5IChmaXJzdCAyIGFuZCBsYXN0IDIgb2YgYWN0dWFsIG51bWJlciB2aXNpYmxlKVxuICAgICAqIEhhbmRsZXMgY291bnRyeSBjb2RlIHByZWZpeCAoKzkxKVxuICAgICAqIGUuZy4sIFwiKzkxOTg3NjU0MzIxMFwiIC0+IFwiKzkxOTgqKioqKioxMFwiXG4gICAgICogZS5nLiwgXCI5ODc2NTQzMjEwXCIgLT4gXCI5OCoqKioqKjEwXCJcbiAgICAgKi9cbiAgICBDcnlwdG9TZXJ2aWNlLnByb3RvdHlwZS5tYXNrTW9iaWxlID0gZnVuY3Rpb24gKG1vYmlsZSkge1xuICAgICAgICBpZiAoIW1vYmlsZSB8fCBtb2JpbGUubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiAnKioqKioqKioqKic7XG4gICAgICAgIC8vIENoZWNrIGZvciBjb3VudHJ5IGNvZGUgcHJlZml4XG4gICAgICAgIHZhciBwcmVmaXggPSAnJztcbiAgICAgICAgdmFyIG51bWJlciA9IG1vYmlsZTtcbiAgICAgICAgaWYgKG1vYmlsZS5zdGFydHNXaXRoKCcrOTEnKSkge1xuICAgICAgICAgICAgcHJlZml4ID0gJys5MSc7XG4gICAgICAgICAgICBudW1iZXIgPSBtb2JpbGUuc3Vic3RyaW5nKDMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vYmlsZS5zdGFydHNXaXRoKCc5MScpICYmIG1vYmlsZS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgcHJlZml4ID0gJzkxJztcbiAgICAgICAgICAgIG51bWJlciA9IG1vYmlsZS5zdWJzdHJpbmcoMik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsZWFuZWQgPSBudW1iZXIucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgaWYgKGNsZWFuZWQubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAnKioqKioqKioqKic7XG4gICAgICAgIHJldHVybiAocHJlZml4ICtcbiAgICAgICAgICAgIGNsZWFuZWQuc3Vic3RyaW5nKDAsIDIpICtcbiAgICAgICAgICAgICcqJy5yZXBlYXQoY2xlYW5lZC5sZW5ndGggLSA0KSArXG4gICAgICAgICAgICBjbGVhbmVkLnN1YnN0cmluZyhjbGVhbmVkLmxlbmd0aCAtIDIpKTtcbiAgICB9O1xuICAgIHJldHVybiBDcnlwdG9TZXJ2aWNlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IENyeXB0b1NlcnZpY2UuZ2V0SW5zdGFuY2UoKTtcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgUGhvbmUsIE1pY09mZiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyB1c2VFeG90ZWxTYWZlIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL0V4b3RlbFByb3ZpZGVyJztcbmltcG9ydCBFeG90ZWxTZXJ2aWNlIGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4b3RlbC9FeG90ZWxTZXJ2aWNlJztcbmltcG9ydCB7IGluaXRpYXRlQ2FsbEFjdGl2aXR5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhvdGVsL2FwaSc7XG5pbXBvcnQgQ3J5cHRvU2VydmljZSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jcnlwdG8vQ3J5cHRvU2VydmljZSc7XG52YXIgQ2FsbEJ1dHRvbiA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBwaG9uZU51bWJlciA9IF9hLnBob25lTnVtYmVyLCBlbmNyeXB0ZWRQaG9uZU51bWJlciA9IF9hLmVuY3J5cHRlZFBob25lTnVtYmVyLCBjYWxsZXJOYW1lID0gX2EuY2FsbGVyTmFtZSwgcHJvc3BlY3RJZCA9IF9hLnByb3NwZWN0SWQsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgZGlzYWJsZWQgPSBfYS5kaXNhYmxlZDtcbiAgICB2YXIgZXhvdGVsID0gdXNlRXhvdGVsU2FmZSgpO1xuICAgIHZhciBfYiA9IHVzZVN0YXRlKGZhbHNlKSwgaXNEaWFsaW5nID0gX2JbMF0sIHNldElzRGlhbGluZyA9IF9iWzFdO1xuICAgIHZhciBfYyA9IHVzZVN0YXRlKG51bGwpLCBlcnJvciA9IF9jWzBdLCBzZXRFcnJvciA9IF9jWzFdO1xuICAgIC8vIElmIEV4b3RlbCBpcyBub3QgYXZhaWxhYmxlIChub3Qgd2l0aGluIHByb3ZpZGVyKSwgZG9uJ3QgcmVuZGVyIHRoZSBidXR0b25cbiAgICBpZiAoIWV4b3RlbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIG1ha2VDYWxsID0gZXhvdGVsLm1ha2VDYWxsLCBpc0Nvbm5lY3RlZCA9IGV4b3RlbC5pc0Nvbm5lY3RlZCwgY2FsbFN0YXRlID0gZXhvdGVsLmNhbGxTdGF0ZSwgcGVybWlzc2lvblN0YXR1cyA9IGV4b3RlbC5wZXJtaXNzaW9uU3RhdHVzLCByZXF1ZXN0TWljcm9waG9uZUFjY2VzcyA9IGV4b3RlbC5yZXF1ZXN0TWljcm9waG9uZUFjY2Vzcywgc2V0Q2FsbEFjdGl2aXR5SWQgPSBleG90ZWwuc2V0Q2FsbEFjdGl2aXR5SWQsIHNldEV4b3RlbENhbGxTaWQgPSBleG90ZWwuc2V0RXhvdGVsQ2FsbFNpZDtcbiAgICB2YXIgaGFuZGxlQ2FsbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhY3R1YWxQaG9uZU51bWJlciwgbWFza2VkTnVtYmVyLCBoYXNQZXJtaXNzaW9uLCBncmFudGVkLCBzZGtSZXNwb25zZSwgZXhvdGVsQ2FsbFNpZCwgcmVzcG9uc2UsIGNhbGxBY3Rpdml0eUlkLCBhcGlFcnJvcl8xLCBlcnJfMSwgZXJyb3JNZXNzYWdlLCBjb2RlLCBlcnJvckRldGFpbHMsIGRlc2NyaXB0aW9uO1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IGNhbGxpbmcgZnJvbSAnaWRsZScgb3IgJ2VuZGVkJyBzdGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Nvbm5lY3RlZCB8fCAoY2FsbFN0YXRlLnBoYXNlICE9PSAnaWRsZScgJiYgY2FsbFN0YXRlLnBoYXNlICE9PSAnZW5kZWQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFBob25lTnVtYmVyID0gcGhvbmVOdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWRQaG9uZU51bWJlciAmJiAhYWN0dWFsUGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUGhvbmVOdW1iZXIgPSBDcnlwdG9TZXJ2aWNlLmRlY3J5cHREYXRhKGVuY3J5cHRlZFBob25lTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdHVhbFBob25lTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCdGYWlsZWQgdG8gZGVjcnlwdCBwaG9uZSBudW1iZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdEZWNyeXB0aW9uIGVycm9yOicsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ0ZhaWxlZCB0byBkZWNyeXB0IHBob25lIG51bWJlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdHVhbFBob25lTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignTm8gcGhvbmUgbnVtYmVyIGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1hc2tlZE51bWJlciA9IENyeXB0b1NlcnZpY2UubWFza01vYmlsZShhY3R1YWxQaG9uZU51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIEV4b3RlbFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jaGVja0F1ZGlvUGVybWlzc2lvbnMoKV07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoISFoYXNQZXJtaXNzaW9uKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MoKV07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBncmFudGVkID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWdyYW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCdNaWNyb3Bob25lIGFjY2VzcyBpcyByZXF1aXJlZCB0byBtYWtlIGNhbGxzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFszLCA5LCAxMCwgMTFdKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNEaWFsaW5nKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtYWtlQ2FsbChhY3R1YWxQaG9uZU51bWJlciwgY2FsbGVyTmFtZSwgdW5kZWZpbmVkLCBtYXNrZWROdW1iZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIDI6IEV4dHJhY3QgQ2FsbFNpZCBmcm9tIFNESyByZXNwb25zZSBhbmQgc3RvcmUgaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYW5jZWwgQVBJIGlmIHVzZXIgZGVjbGluZXMgYmVmb3JlIGluaXRpYXRlQ2FsbEFjdGl2aXR5IGNvbXBsZXRlc1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgc2RrUmVzcG9uc2UgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGV4b3RlbENhbGxTaWQgPSAoX2EgPSBzZGtSZXNwb25zZSA9PT0gbnVsbCB8fCBzZGtSZXNwb25zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2RrUmVzcG9uc2UuRGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLkNhbGxTaWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleG90ZWxDYWxsU2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFeG90ZWxDYWxsU2lkKGV4b3RlbENhbGxTaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHByb3NwZWN0SWQgJiYgZXhvdGVsQ2FsbFNpZCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBfZS50cnlzLnB1c2goWzUsIDcsICwgOF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBpbml0aWF0ZUNhbGxBY3Rpdml0eSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvc3BlY3RJZDogcHJvc3BlY3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b051bWJlcjogYWN0dWFsUGhvbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFNpZDogZXhvdGVsQ2FsbFNpZCwgLy8gUGFzcyBDYWxsU2lkIHdoZW4gY3JlYXRpbmcgdGhlIHJlY29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBjYWxsIHN0YXRlIHdpdGggdGhlIGRhdGFiYXNlIElEIGZvciBkaXNwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxBY3Rpdml0eUlkID0gKF9iID0gcmVzcG9uc2UuZGF0YSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmlkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbEFjdGl2aXR5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbGxBY3Rpdml0eUlkKGNhbGxBY3Rpdml0eUlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIGFwaUVycm9yXzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDYWxsQnV0dG9uXSBGYWlsZWQgdG8gY3JlYXRlIGNhbGwgYWN0aXZpdHkgcmVjb3JkOicsIGFwaUVycm9yXzEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIGVycl8xID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbWFrZSBjYWxsOicsIGVycl8xKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0ZhaWxlZCB0byBtYWtlIGNhbGwnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGVycl8xID09PSBudWxsIHx8IGVycl8xID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJfMS5Db2RlKSB8fCAoZXJyXzEgPT09IG51bGwgfHwgZXJyXzEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycl8xLlN0YXR1cykgPT09ICdGYWlsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gZXJyXzEuQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yRGV0YWlscyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyXzEuRXJyb3IgJiYgdHlwZW9mIGVycl8xLkVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yRGV0YWlscyA9IEpTT04ucGFyc2UoZXJyXzEuRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAocGFyc2VFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IEpTT04sIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gKF9kID0gKF9jID0gZXJyb3JEZXRhaWxzID09PSBudWxsIHx8IGVycm9yRGV0YWlscyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3JEZXRhaWxzLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZXJyb3JfZGF0YSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRlc2NyaXB0aW9uIHx8ICdVc2VyIGRldmljZSBpcyBjdXJyZW50bHkgYnVzeSBvciB1bmF2YWlsYWJsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2RlID49IDQwMCAmJiBjb2RlIDwgNTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGVzY3JpcHRpb24gfHwgJ1VuYWJsZSB0byBjb21wbGV0ZSBjYWxsLiBQbGVhc2UgdHJ5IGFnYWluLic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2RlID49IDUwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRlc2NyaXB0aW9uIHx8ICdTZXJ2aWNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkZXNjcmlwdGlvbiB8fCAnRmFpbGVkIHRvIG1ha2UgY2FsbCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyXzEgPT09IG51bGwgfHwgZXJyXzEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycl8xLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycl8xLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIHNldElzRGlhbGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgY2FzZSAxMTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTsgfTtcbiAgICAvLyAnaWRsZScgYW5kICdlbmRlZCcgYm90aCBtZWFuIG5vIGFjdGl2ZSBjYWxsIC0gYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkXG4gICAgdmFyIGlzQ2FsbEluUHJvZ3Jlc3MgPSBjYWxsU3RhdGUucGhhc2UgIT09ICdpZGxlJyAmJiBjYWxsU3RhdGUucGhhc2UgIT09ICdlbmRlZCc7XG4gICAgdmFyIGhhc1Bob25lTnVtYmVyID0gcGhvbmVOdW1iZXIgfHwgZW5jcnlwdGVkUGhvbmVOdW1iZXI7XG4gICAgdmFyIGlzRGlzYWJsZWQgPSBkaXNhYmxlZCB8fCAhaGFzUGhvbmVOdW1iZXIgfHwgIWlzQ29ubmVjdGVkIHx8IGlzQ2FsbEluUHJvZ3Jlc3MgfHwgaXNEaWFsaW5nO1xuICAgIHZhciBnZXRCdXR0b25UaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFpc0Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybiAnVm9JUCBub3QgY29ubmVjdGVkJztcbiAgICAgICAgaWYgKGlzQ2FsbEluUHJvZ3Jlc3MpXG4gICAgICAgICAgICByZXR1cm4gJ0NhbGwgaW4gcHJvZ3Jlc3MnO1xuICAgICAgICBpZiAoIWhhc1Bob25lTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuICdObyBwaG9uZSBudW1iZXInO1xuICAgICAgICBpZiAocGVybWlzc2lvblN0YXR1cyA9PT0gJ2RlbmllZCcpXG4gICAgICAgICAgICByZXR1cm4gJ01pY3JvcGhvbmUgYWNjZXNzIGRlbmllZCc7XG4gICAgICAgIHJldHVybiBcIkNhbGwgXCIuY29uY2F0KGNhbGxlck5hbWUgfHwgJ3Byb3NwZWN0Jyk7XG4gICAgfTtcbiAgICByZXR1cm4gKF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWUsIGNoaWxkcmVuOiBbX2pzeHMoQnV0dG9uLCB7IHZhcmlhbnQ6IFwib3V0bGluZVwiLCBzaXplOiBcInNtXCIsIG9uQ2xpY2s6IGhhbmRsZUNhbGwsIGRpc2FibGVkOiBpc0Rpc2FibGVkLCB0aXRsZTogZ2V0QnV0dG9uVGl0bGUoKSwgY2xhc3NOYW1lOiBcImdhcC0xLjVcIiwgY2hpbGRyZW46IFtwZXJtaXNzaW9uU3RhdHVzID09PSAnZGVuaWVkJyA/IChfanN4KE1pY09mZiwgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pKSA6IChfanN4KFBob25lLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSkpLCBpc0RpYWxpbmcgPyAnQ2FsbGluZy4uLicgOiAnQ2FsbCddIH0pLCBlcnJvciAmJiBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LXJlZC01MDAgdGV4dC14cyBtdC0xXCIsIGNoaWxkcmVuOiBlcnJvciB9KV0gfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IENhbGxCdXR0b247XG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IE1pYywgTWljT2ZmLCBBbGVydENpcmNsZSB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyB1c2VFeG90ZWwgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvRXhvdGVsUHJvdmlkZXInO1xudmFyIE1pY3JvcGhvbmVQZXJtaXNzaW9uID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIG9uUGVybWlzc2lvbkdyYW50ZWQgPSBfYS5vblBlcm1pc3Npb25HcmFudGVkLCBvblBlcm1pc3Npb25EZW5pZWQgPSBfYS5vblBlcm1pc3Npb25EZW5pZWQ7XG4gICAgdmFyIF9iID0gdXNlRXhvdGVsKCksIHBlcm1pc3Npb25TdGF0dXMgPSBfYi5wZXJtaXNzaW9uU3RhdHVzLCByZXF1ZXN0TWljcm9waG9uZUFjY2VzcyA9IF9iLnJlcXVlc3RNaWNyb3Bob25lQWNjZXNzO1xuICAgIHZhciBfYyA9IHVzZVN0YXRlKGZhbHNlKSwgaXNSZXF1ZXN0aW5nID0gX2NbMF0sIHNldElzUmVxdWVzdGluZyA9IF9jWzFdO1xuICAgIHZhciBfZCA9IHVzZVN0YXRlKG51bGwpLCBlcnJvciA9IF9kWzBdLCBzZXRFcnJvciA9IF9kWzFdO1xuICAgIHZhciBoYW5kbGVSZXF1ZXN0UGVybWlzc2lvbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBncmFudGVkLCBlcnJfMTtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNSZXF1ZXN0aW5nKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCA0LCA1XSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHJlcXVlc3RNaWNyb3Bob25lQWNjZXNzKCldO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyYW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uUGVybWlzc2lvbkdyYW50ZWQgPT09IG51bGwgfHwgb25QZXJtaXNzaW9uR3JhbnRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25QZXJtaXNzaW9uR3JhbnRlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ01pY3JvcGhvbmUgYWNjZXNzIHdhcyBkZW5pZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uUGVybWlzc2lvbkRlbmllZCA9PT0gbnVsbCB8fCBvblBlcm1pc3Npb25EZW5pZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUGVybWlzc2lvbkRlbmllZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZXJyXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHNldEVycm9yKGVycl8xLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byByZXF1ZXN0IG1pY3JvcGhvbmUgYWNjZXNzJyk7XG4gICAgICAgICAgICAgICAgICAgIG9uUGVybWlzc2lvbkRlbmllZCA9PT0gbnVsbCB8fCBvblBlcm1pc3Npb25EZW5pZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUGVybWlzc2lvbkRlbmllZCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHNldElzUmVxdWVzdGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pOyB9O1xuICAgIGlmIChwZXJtaXNzaW9uU3RhdHVzID09PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgcmV0dXJuIChfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LWdyZWVuLTYwMFwiLCBjaGlsZHJlbjogW19qc3goTWljLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSksIF9qc3goXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBcInRleHQtc21cIiwgY2hpbGRyZW46IFwiTWljcm9waG9uZSBhY2Nlc3MgZ3JhbnRlZFwiIH0pXSB9KSk7XG4gICAgfVxuICAgIGlmIChwZXJtaXNzaW9uU3RhdHVzID09PSAnZGVuaWVkJykge1xuICAgICAgICByZXR1cm4gKF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInAtNCBiZy1yZWQtNTAgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXJlZC0yMDBcIiwgY2hpbGRyZW46IFtfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXJlZC02MDAgbWItMlwiLCBjaGlsZHJlbjogW19qc3goTWljT2ZmLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01XCIgfSksIF9qc3goXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBcImZvbnQtbWVkaXVtXCIsIGNoaWxkcmVuOiBcIk1pY3JvcGhvbmUgQWNjZXNzIERlbmllZFwiIH0pXSB9KSwgX2pzeChcInBcIiwgeyBjbGFzc05hbWU6IFwidGV4dC1zbSB0ZXh0LXJlZC02MDAgbWItM1wiLCBjaGlsZHJlbjogXCJUbyB1c2UgdGhlIGNhbGxpbmcgZmVhdHVyZSwgeW91IG5lZWQgdG8gZW5hYmxlIG1pY3JvcGhvbmUgYWNjZXNzIGluIHlvdXIgYnJvd3NlciBzZXR0aW5ncy5cIiB9KSwgX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwidGV4dC14cyB0ZXh0LWdyYXktNjAwXCIsIGNoaWxkcmVuOiBbX2pzeChcInBcIiwgeyBjbGFzc05hbWU6IFwiZm9udC1tZWRpdW0gbWItMVwiLCBjaGlsZHJlbjogXCJIb3cgdG8gZW5hYmxlOlwiIH0pLCBfanN4cyhcIm9sXCIsIHsgY2xhc3NOYW1lOiBcImxpc3QtZGVjaW1hbCBsaXN0LWluc2lkZSBzcGFjZS15LTFcIiwgY2hpbGRyZW46IFtfanN4KFwibGlcIiwgeyBjaGlsZHJlbjogXCJDbGljayB0aGUgbG9jay9pbmZvIGljb24gaW4geW91ciBicm93c2VyJ3MgYWRkcmVzcyBiYXJcIiB9KSwgX2pzeChcImxpXCIsIHsgY2hpbGRyZW46IFwiRmluZCBcXFwiTWljcm9waG9uZVxcXCIgaW4gdGhlIHBlcm1pc3Npb25zIGxpc3RcIiB9KSwgX2pzeChcImxpXCIsIHsgY2hpbGRyZW46IFwiQ2hhbmdlIHRoZSBzZXR0aW5nIHRvIFxcXCJBbGxvd1xcXCJcIiB9KSwgX2pzeChcImxpXCIsIHsgY2hpbGRyZW46IFwiUmVmcmVzaCB0aGUgcGFnZVwiIH0pXSB9KV0gfSldIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIChfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJwLTQgYmctYmx1ZS01MCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItYmx1ZS0yMDBcIiwgY2hpbGRyZW46IFtfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LWJsdWUtNjAwIG1iLTJcIiwgY2hpbGRyZW46IFtfanN4KEFsZXJ0Q2lyY2xlLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01XCIgfSksIF9qc3goXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBcImZvbnQtbWVkaXVtXCIsIGNoaWxkcmVuOiBcIk1pY3JvcGhvbmUgUGVybWlzc2lvbiBSZXF1aXJlZFwiIH0pXSB9KSwgX2pzeChcInBcIiwgeyBjbGFzc05hbWU6IFwidGV4dC1zbSB0ZXh0LWdyYXktNjAwIG1iLTNcIiwgY2hpbGRyZW46IFwiVG8gbWFrZSBhbmQgcmVjZWl2ZSBjYWxscywgd2UgbmVlZCBhY2Nlc3MgdG8geW91ciBtaWNyb3Bob25lLiBDbGljayB0aGUgYnV0dG9uIGJlbG93IHRvIGdyYW50IHBlcm1pc3Npb24uXCIgfSksIF9qc3hzKEJ1dHRvbiwgeyB2YXJpYW50OiBcImRlZmF1bHRcIiwgc2l6ZTogXCJzbVwiLCBvbkNsaWNrOiBoYW5kbGVSZXF1ZXN0UGVybWlzc2lvbiwgbG9hZGluZzogaXNSZXF1ZXN0aW5nLCBjbGFzc05hbWU6IFwiZ2FwLTEuNVwiLCBjaGlsZHJlbjogW19qc3goTWljLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSksIFwiQWxsb3cgTWljcm9waG9uZSBBY2Nlc3NcIl0gfSksIGVycm9yICYmIF9qc3goXCJwXCIsIHsgY2xhc3NOYW1lOiBcInRleHQtcmVkLTUwMCB0ZXh0LXhzIG10LTJcIiwgY2hpbGRyZW46IGVycm9yIH0pXSB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgTWljcm9waG9uZVBlcm1pc3Npb247XG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBGcmFnbWVudCBhcyBfRnJhZ21lbnQsIGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRXhvdGVsUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvRXhvdGVsUHJvdmlkZXInO1xuaW1wb3J0IHsgZ2V0QWN0aXZlVm9pY2VUb2tlbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4b3RlbC9hcGknO1xuaW1wb3J0IEV4b3RlbFBob25lIGZyb20gJy4vRXhvdGVsUGhvbmUnO1xuLyoqXG4gKiBXcmFwcGVyIGNvbXBvbmVudCB0aGF0IGluaXRpYWxpemVzIEV4b3RlbCBWb0lQIGZ1bmN0aW9uYWxpdHlcbiAqIEZldGNoZXMgdGhlIGFjY2VzcyB0b2tlbiBmcm9tIGJhY2tlbmQgYW5kIHByb3ZpZGVzIHRoZSBFeG90ZWwgY29udGV4dCB0byBjaGlsZHJlblxuICovXG52YXIgRXhvdGVsV3JhcHBlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBfYiA9IF9hLmVuYWJsZWQsIGVuYWJsZWQgPSBfYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9iLCBwcm9zcGVjdElkID0gX2EucHJvc3BlY3RJZCwgcHJvc3BlY3ROYW1lID0gX2EucHJvc3BlY3ROYW1lLCBwcm9zcGVjdE51bWJlciA9IF9hLnByb3NwZWN0TnVtYmVyO1xuICAgIHZhciBfYyA9IHVzZVN0YXRlKG51bGwpLCBhY2Nlc3NUb2tlbiA9IF9jWzBdLCBzZXRBY2Nlc3NUb2tlbiA9IF9jWzFdO1xuICAgIHZhciBfZCA9IHVzZVN0YXRlKHRydWUpLCBpc0xvYWRpbmcgPSBfZFswXSwgc2V0SXNMb2FkaW5nID0gX2RbMV07XG4gICAgdmFyIF9lID0gdXNlU3RhdGUobnVsbCksIGVycm9yID0gX2VbMF0sIHNldEVycm9yID0gX2VbMV07XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmZXRjaFRva2VuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0b2tlbkRhdGEsIGVycl8xO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAyLCAzLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRBY3RpdmVWb2ljZVRva2VuKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkRhdGEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5EYXRhID09PSBudWxsIHx8IHRva2VuRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9rZW5EYXRhLnRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWNjZXNzVG9rZW4odG9rZW5EYXRhLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGFjdGl2ZSB2b2ljZSBjb25maWcgLSBFeG90ZWwgbm90IGNvbmZpZ3VyZWQgZm9yIHRoaXMgdGVuYW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ1ZvaWNlIGNhbGxpbmcgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBFeG90ZWwgdG9rZW46JywgZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoZXJyXzEubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGluaXRpYWxpemUgY2FsbGluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7IH07XG4gICAgICAgIGZldGNoVG9rZW4oKTtcbiAgICB9LCBbZW5hYmxlZF0pO1xuICAgIC8vIElmIEV4b3RlbCBpcyBub3QgZW5hYmxlZCBvciBmYWlsZWQgdG8gbG9hZCwganVzdCByZW5kZXIgY2hpbGRyZW5cbiAgICBpZiAoIWVuYWJsZWQgfHwgZXJyb3IgfHwgIWFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJldHVybiBfanN4KF9GcmFnbWVudCwgeyBjaGlsZHJlbjogY2hpbGRyZW4gfSk7XG4gICAgfVxuICAgIC8vIFJlbmRlciB3aXRoIEV4b3RlbCBwcm92aWRlciBhbmQgZmxvYXRpbmcgcGhvbmUgVUlcbiAgICByZXR1cm4gKF9qc3hzKEV4b3RlbFByb3ZpZGVyLCB7IGFjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbiwgYWdlbnRVc2VySWQ6IFwiMDA0N1wiLCBhdXRvQ29ubmVjdFZPSVA6IHRydWUsIGNoaWxkcmVuOiBbY2hpbGRyZW4sIF9qc3goRXhvdGVsUGhvbmUsIHsgcHJvc3BlY3RJZDogcHJvc3BlY3RJZCwgcHJvc3BlY3ROYW1lOiBwcm9zcGVjdE5hbWUsIHByb3NwZWN0TnVtYmVyOiBwcm9zcGVjdE51bWJlciB9KV0gfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IEV4b3RlbFdyYXBwZXI7XG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBGcmFnbWVudCBhcyBfRnJhZ21lbnQsIGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEV4b3RlbFByb3ZpZGVyIH0gZnJvbSAnLi9FeG90ZWxQcm92aWRlcic7XG5pbXBvcnQgeyBFeG90ZWxQaG9uZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvRXhvdGVsJztcbmltcG9ydCB7IGNoZWNrVm9JUEVuYWJsZWQsIGdldEFjdGl2ZVZvaWNlVG9rZW4sIHNhdmVDYWxsRGlzcG9zaXRpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9leG90ZWwnO1xuaW1wb3J0IHsgaXNWb0lQRW5hYmxlZEZvcldvcmtzcGFjZSB9IGZyb20gJy4uL2NvbmZpZy92b2lwLmNvbmZpZyc7XG4vKipcbiAqIFZvSVBQcm92aWRlciAtIFdvcmtzcGFjZS1sZXZlbCBWb0lQL0V4b3RlbCBpbnRlZ3JhdGlvblxuICpcbiAqIFRoaXMgcHJvdmlkZXIgY2hlY2tzIGlmIFZvSVAgaXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgd29ya3NwYWNlIEFORCB0ZW5hbnRcbiAqIGFuZCBpbml0aWFsaXplcyB0aGUgRXhvdGVsIFNESyBpZiBlbmFibGVkLlxuICpcbiAqIFZvSVAgaXMgZW5hYmxlZCBvbmx5IHdoZW4gQUxMIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqIDEuIFdvcmtzcGFjZSBpcyBpbiBWT0lQX0VOQUJMRURfV09SS1NQQUNFUyAoY29tbW9uLXdvcmtzcGFjZSwgdGVsZS1jYWxsZXItd29ya3NwYWNlKVxuICogMi4gVGVuYW50IGhhcyBlbmFibGVWb2ljZTogdHJ1ZSBpbiBub3RpZmljYXRpb24gY29uZmlnXG4gKiAzLiBUZW5hbnQgaGFzIGF0IGxlYXN0IG9uZSBlbmFibGVkIHZvaWNlIGNvbmZpZyAodm9pY2VDb25maWdzW10uaXNFbmFibGVkOiB0cnVlKVxuICogNC4gQWN0aXZlIHRva2VuIGlzIGF2YWlsYWJsZVxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBXb3Jrc3BhY2UtbGV2ZWwgVm9JUCBlbmFibGVtZW50XG4gKiAtIFRlbmFudC1sZXZlbCBWb0lQIGNvbmZpZ3VyYXRpb24gY2hlY2tcbiAqIC0gQXV0b21hdGljIHRva2VuIGZldGNoaW5nIGZyb20gYmFja2VuZFxuICogLSBNaWNyb3Bob25lIHBlcm1pc3Npb24gaGFuZGxpbmdcbiAqIC0gRmxvYXRpbmcgcGhvbmUgVUkgZm9yIGFjdGl2ZSBjYWxsc1xuICovXG5leHBvcnQgdmFyIFZvSVBQcm92aWRlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCB3b3Jrc3BhY2UgPSBfYS53b3Jrc3BhY2UsIGFnZW50VXNlcklkID0gX2EuYWdlbnRVc2VySWQsIHByb3NwZWN0SWQgPSBfYS5wcm9zcGVjdElkLCBwcm9zcGVjdE5hbWUgPSBfYS5wcm9zcGVjdE5hbWUsIHByb3NwZWN0TnVtYmVyID0gX2EucHJvc3BlY3ROdW1iZXIsIG9uU2F2ZURpc3Bvc2l0aW9uID0gX2Eub25TYXZlRGlzcG9zaXRpb247XG4gICAgdmFyIF9iID0gdXNlU3RhdGUobnVsbCksIGFjY2Vzc1Rva2VuID0gX2JbMF0sIHNldEFjY2Vzc1Rva2VuID0gX2JbMV07XG4gICAgdmFyIF9jID0gdXNlU3RhdGUodHJ1ZSksIGlzTG9hZGluZyA9IF9jWzBdLCBzZXRJc0xvYWRpbmcgPSBfY1sxXTtcbiAgICB2YXIgX2QgPSB1c2VTdGF0ZShudWxsKSwgZXJyb3IgPSBfZFswXSwgc2V0RXJyb3IgPSBfZFsxXTtcbiAgICB2YXIgaXNXb3Jrc3BhY2VWb0lQRW5hYmxlZCA9IGlzVm9JUEVuYWJsZWRGb3JXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgICB2YXIgaGFzQWdlbnRVc2VySWQgPSAhIWFnZW50VXNlcklkO1xuICAgIC8vIERlZmF1bHQgZGlzcG9zaXRpb24gaGFuZGxlciB0aGF0IGNhbGxzIHRoZSBBUElcbiAgICB2YXIgaGFuZGxlU2F2ZURpc3Bvc2l0aW9uID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIC8vIElmIGN1c3RvbSBoYW5kbGVyIGlzIHByb3ZpZGVkLCB1c2UgaXRcbiAgICAgICAgICAgIGlmIChvblNhdmVEaXNwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBvblNhdmVEaXNwb3NpdGlvbihkYXRhKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEZWZhdWx0OiBjYWxsIHRoZSBzYXZlQ2FsbERpc3Bvc2l0aW9uIEFQSVxuICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHNhdmVDYWxsRGlzcG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBjYWxsSWQ6IGRhdGEuY2FsbElkLFxuICAgICAgICAgICAgICAgICAgICBwcm9zcGVjdElkOiBkYXRhLnByb3NwZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxTdGF0dXNEaXNwb3NpdGlvbjogZGF0YS5jYWxsU3RhdHVzRGlzcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uQ2F0ZWdvcnk6IGRhdGEuZGlzcG9zaXRpb25DYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb25SZWFzb246IGRhdGEuZGlzcG9zaXRpb25SZWFzb24gfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvbk5vdGVzOiBkYXRhLnJlbWFya3MgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgfSk7XG4gICAgfSk7IH0sIFtvblNhdmVEaXNwb3NpdGlvbl0pO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFNraXAgaWYgd29ya3NwYWNlIGRvZXNuJ3Qgc3VwcG9ydCBWb0lQIG9yIHVzZXIgZG9lc24ndCBoYXZlIEV4b3RlbCBBcHAgVXNlciBJRFxuICAgICAgICBpZiAoIWlzV29ya3NwYWNlVm9JUEVuYWJsZWQgfHwgIWhhc0FnZW50VXNlcklkKSB7XG4gICAgICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbml0aWFsaXplVm9JUCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdm9pcFN0YXR1cywgdG9rZW5EYXRhLCBlcnJfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgMywgNCwgNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBjaGVja1ZvSVBFbmFibGVkKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICB2b2lwU3RhdHVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2b2lwU3RhdHVzLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWb0lQIG5vdCBlbmFibGVkIGZvciB0aGlzIHRlbmFudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCdWb2ljZSBjYWxsaW5nIG5vdCBlbmFibGVkIGZvciB0aGlzIHRlbmFudCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZ2V0QWN0aXZlVm9pY2VUb2tlbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5EYXRhID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuRGF0YSA9PT0gbnVsbCB8fCB0b2tlbkRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRva2VuRGF0YS50b2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFjY2Vzc1Rva2VuKHRva2VuRGF0YS50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBhY3RpdmUgdG9rZW4gYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ1ZvaWNlIGNhbGxpbmcgdG9rZW4gbm90IGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgVm9JUDonLCBlcnJfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihlcnJfMS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjYWxsaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTsgfTtcbiAgICAgICAgaW5pdGlhbGl6ZVZvSVAoKTtcbiAgICB9LCBbaXNXb3Jrc3BhY2VWb0lQRW5hYmxlZCwgaGFzQWdlbnRVc2VySWRdKTtcbiAgICAvLyBJZiB3b3Jrc3BhY2UgZG9lc24ndCBzdXBwb3J0IFZvSVAgb3IgdXNlciBkb2Vzbid0IGhhdmUgRXhvdGVsIElELCBqdXN0IHJlbmRlciBjaGlsZHJlblxuICAgIGlmICghaXNXb3Jrc3BhY2VWb0lQRW5hYmxlZCB8fCAhaGFzQWdlbnRVc2VySWQpIHtcbiAgICAgICAgcmV0dXJuIF9qc3goX0ZyYWdtZW50LCB7IGNoaWxkcmVuOiBjaGlsZHJlbiB9KTtcbiAgICB9XG4gICAgLy8gSWYgbG9hZGluZyBvciBlcnJvciBvciBubyB0b2tlbiwgcmVuZGVyIGNoaWxkcmVuIHdpdGhvdXQgVm9JUFxuICAgIGlmIChpc0xvYWRpbmcgfHwgZXJyb3IgfHwgIWFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJldHVybiBfanN4KF9GcmFnbWVudCwgeyBjaGlsZHJlbjogY2hpbGRyZW4gfSk7XG4gICAgfVxuICAgIC8vIFJlbmRlciB3aXRoIEV4b3RlbCBwcm92aWRlciBhbmQgZmxvYXRpbmcgcGhvbmUgVUlcbiAgICByZXR1cm4gKF9qc3hzKEV4b3RlbFByb3ZpZGVyLCB7IGFjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbiwgYWdlbnRVc2VySWQ6IGFnZW50VXNlcklkLCBhdXRvQ29ubmVjdFZPSVA6IHRydWUsIGNoaWxkcmVuOiBbY2hpbGRyZW4sIF9qc3goRXhvdGVsUGhvbmUsIHsgcHJvc3BlY3RJZDogcHJvc3BlY3RJZCwgcHJvc3BlY3ROYW1lOiBwcm9zcGVjdE5hbWUsIHByb3NwZWN0TnVtYmVyOiBwcm9zcGVjdE51bWJlciwgb25TYXZlRGlzcG9zaXRpb246IGhhbmRsZVNhdmVEaXNwb3NpdGlvbiB9KV0gfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFZvSVBQcm92aWRlcjtcbiJdLCJuYW1lcyI6WyJfX2Fzc2lnbiIsIk9iamVjdCIsImFzc2lnbiIsInQiLCJzIiwiaSIsIm4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJwIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiYXBwbHkiLCJ0aGlzIiwiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJ2YWx1ZSIsInN0ZXAiLCJuZXh0IiwiZSIsInJlamVjdGVkIiwicmVzdWx0IiwiZG9uZSIsInRoZW4iLCJfX2dlbmVyYXRvciIsImJvZHkiLCJmIiwieSIsIl8iLCJsYWJlbCIsInNlbnQiLCJ0cnlzIiwib3BzIiwiZyIsImNyZWF0ZSIsIkl0ZXJhdG9yIiwidmVyYiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwidiIsIm9wIiwiVHlwZUVycm9yIiwicG9wIiwicHVzaCIsIlN1cHByZXNzZWRFcnJvciIsImluaXRpYWxBcHBsaWNhdGlvblN0YXRlIiwiaXNMb2dpbkRpYWxvZ09wZW4iLCJzbmFja2JhciIsIm9wZW4iLCJtZXNzYWdlIiwic2V2ZXJpdHkiLCJjb25maXJtRGlhbG9nIiwiaXNPcGVuIiwidGl0bGUiLCJvbkNvbmZpcm0iLCJvbkNhbmNlbCIsInR5cGUiLCJ1c2VyIiwidW5kZWZpbmVkIiwiaW5zdGl0dXRpb25JbmZvIiwiYXNzZXQiLCJBcHBsaWNhdGlvblN0b3JlIiwiU3RvcmUiLCJ0b0Jhc2U2NFVybCIsImJhc2U2NCIsInJlcGxhY2UiLCJnZW5lcmF0ZUNsaWVudFRva2VuIiwiY2xpZW50SWQiLCJzZWNyZXQiLCJwYXlsb2FkIiwiaWF0IiwiTWF0aCIsImZsb29yIiwiRGF0ZSIsIm5vdyIsInBheWxvYWRCYXNlNjR1cmwiLCJidG9hIiwiSlNPTiIsInN0cmluZ2lmeSIsInNpZ25hdHVyZVdvcmRBcnJheSIsIkNyeXB0b0pTIiwiSG1hY1NIQTI1NiIsInNpZ25hdHVyZUJhc2U2NHVybCIsImVuYyIsIkJhc2U2NCIsImNvbmNhdCIsImlzRGV2ZWxvcG1lbnQiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhvc3RuYW1lIiwiaW5jbHVkZXMiLCJ0ZW5hbnRDb2RlIiwic3BsaXQiLCJpbnN0aXR1dGlvbkNvZGUiLCJwYXRobmFtZSIsIndvcmtzcGFjZSIsIndvcmtzcGFjZUFwaU1hcHBpbmciLCJheGlvcyIsIkF4aW9zIiwiYmFzZVVSTCIsInByb2Nlc3MiLCJlbnYiLCJSRUFDVF9BUFBfQVBJX0hPU1QiLCJ3aXRoQ3JlZGVudGlhbHMiLCJoZWFkZXJzIiwiY3JlYXRlUnNidWlsZFNoYXJlZENvbmZpZyIsImRlcGVuZGVuY2llcyIsImFsd2F5c0VhZ2VyIiwic2hhcmVkRGVwZW5kZW5jaWVzTGlzdCIsInJlZHVjZSIsImFjYyIsInBrZyIsInZlcnNpb24iLCJzaW5nbGV0b24iLCJyZXF1aXJlZFZlcnNpb24iLCJlYWdlciIsImludGVyY2VwdG9ycyIsInJlcXVlc3QiLCJ1c2UiLCJjb25maWciLCJwYXJhbXMiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJtYXAiLCJfYSIsImtleSIsImZvcm1hdFBhcmFtcyIsIndvcmtzcGFjZVByZWZpeCIsInVybCIsInNlc3Npb25LZXkiLCJDb29raWVzIiwiZ2V0Iiwib3BlblBheW1lbnRzS2V5Iiwic3R1ZGVudFNlc3Npb25LZXkiLCJzZXQiLCJjYW1weENsaWVudElkIiwiUkVBQ1RfQVBQX0NMSUVOVF9JRCIsImNhbXB4Q2xpZW50U2VjcmV0IiwiUkVBQ1RfQVBQX0NBTVBYX0NMSUVOVF9TRUNSRVQiLCJza2lwSW5zdGl0dXRpb25Db2RlIiwiZGVsZXRlIiwiZXJyb3IiLCJyZXNwb25zZSIsImRhdGEiLCJoaWRlU25hY2tiYXIiLCJtZXRob2QiLCJzdGF0dXMiLCJ1cGRhdGUiLCJlcnIiLCJfYiIsIl9jIiwiX2QiLCJzaG91bGRIaWRlU25hY2tiYXIiLCJub25Xb3Jrc3BhY2VBeGlvcyIsIlZPSVBfRU5BQkxFRF9XT1JLU1BBQ0VTIiwiaXNWb0lQRW5hYmxlZEZvcldvcmtzcGFjZSIsIndvcmtzcGFjZU5hbWUiLCJDb25maXJtQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJzaG93Q29uZmlybURpYWxvZyIsIkNvbmZpcm1EaWFsb2dQcm92aWRlciIsImNoaWxkcmVuIiwidXNlU3RhdGUiLCJoYW5kbGVDbG9zZURpYWxvZyIsIl9qc3hzIiwiUHJvdmlkZXIiLCJjb25maXJtVGV4dCIsImNhbmNlbFRleHQiLCJjb25maXJtQnV0dG9uVGV4dCIsImNhbmNlbEJ1dHRvblRleHQiLCJfanN4IiwiQ29uZmlybURpYWxvZyIsInZhcmlhbnQiLCJvbkNsb3NlIiwiX3NldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJiaW5kIiwiX19wcm90b19fIiwiaW5pdGlhbFN0YXRlIiwiRXJyb3JCb3VuZGFyeSIsIl9SZWFjdCRDb21wb25lbnQiLCJfdGhpcyIsIl9sZW4iLCJfYXJncyIsIkFycmF5IiwiX2tleSIsInN0YXRlIiwicmVzZXRFcnJvckJvdW5kYXJ5IiwiX3RoaXMkcHJvcHMiLCJfbGVuMiIsImFyZ3MiLCJfa2V5MiIsInByb3BzIiwib25SZXNldCIsInJlc2V0IiwibyIsImNvbnN0cnVjdG9yIiwiX2luaGVyaXRzTG9vc2UiLCJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCJfcHJvdG8iLCJzZXRTdGF0ZSIsImNvbXBvbmVudERpZENhdGNoIiwiaW5mbyIsIl90aGlzJHByb3BzJG9uRXJyb3IiLCJfdGhpcyRwcm9wczIiLCJvbkVycm9yIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwiX3RoaXMkcHJvcHMkb25SZXNldEtlIiwiX3RoaXMkcHJvcHMzIiwiYSIsImIiLCJyZXNldEtleXMiLCJzb21lIiwiaXRlbSIsImluZGV4IiwiaXMiLCJvblJlc2V0S2V5c0NoYW5nZSIsInJlbmRlciIsIl90aGlzJHByb3BzNCIsImZhbGxiYWNrUmVuZGVyIiwiRmFsbGJhY2tDb21wb25lbnQiLCJmYWxsYmFjayIsIl9wcm9wcyIsIlJlYWN0IiwiaXNWYWxpZEVsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiRXJyb3IiLCJDb21wb25lbnQiLCJjIiwiciIsInUiLCJjb250ZXh0IiwiTk9ERV9FTlYiLCJtb2RlIiwiYWJvcnRFYXJseSIsInNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24iLCJ2YWx1ZXMiLCJyYXdWYWx1ZXMiLCJlcnJvcnMiLCJpbm5lciIsImNyaXRlcmlhTW9kZSIsInBhdGgiLCJ0eXBlcyIsInBlcmZvcm1Mb2dpbiIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiZmV0Y2giLCJjb25zaWRlcklwIiwianNvbiIsImxhdCIsImxuZyIsInBvc3QiLCJyZXMiLCJ2YWxpZGF0aW9uU2NoZW1hIiwiWXVwIiwib2JqZWN0Iiwic2hhcGUiLCJ1c2VybmFtZSIsInN0cmluZyIsInJlcXVpcmVkIiwicGFzc3dvcmQiLCJMb2dpbiIsImNsb3NlIiwiZGV2aWNlSW5mb3JtYXRpb24iLCJkZXZpY2VUeXBlIiwiY2xpZW50TmFtZSIsIm9zIiwib3NWZXJzaW9uIiwidG9rZW5UeXBlIiwiaXNMb2NhdGlvbkFsbG93ZWQiLCJkZXZpY2VTdGF0ZSIsInNldERldmljZVN0YXRlIiwibmF2aWdhdGUiLCJ1c2VOYXZpZ2F0ZSIsInVzZUVmZmVjdCIsIm5hdmlnYXRvciIsImdlb2xvY2F0aW9uIiwiZ2V0Q3VycmVudFBvc2l0aW9uIiwicG9zaXRpb24iLCJjb29yZHMiLCJwZXJtaXNzaW9ucyIsInF1ZXJ5IiwibmFtZSIsInBlcm1pc3Npb25TdGF0dXMiLCJkZXZpY2VJbmZvIiwiRGV2aWNlRGV0ZWN0b3IiLCJwYXJzZSIsInVzZXJBZ2VudCIsImNsaWVudCIsInVzZUZvcm0iLCJyZXNvbHZlciIsInl1cFJlc29sdmVyIiwiaGFuZGxlU3VibWl0IiwiY29udHJvbCIsImZvcm1TdGF0ZSIsInVzZU11dGF0aW9uIiwib25TdWNjZXNzIiwicmVtb3ZlIiwic2Vzc2lvbiIsInRva2VuIiwicmVsb2FkIiwibXV0YXRlIiwiaXNMb2FkaW5nIiwiY2xhc3NOYW1lIiwiSWNvbnMiLCJDYW1weEZ1bGxMb2dvSWNvbiIsIkNvbnRyb2xsZXIiLCJmaWVsZCIsIlRleHRGaWVsZCIsInBsYWNlaG9sZGVyIiwib25DaGFuZ2UiLCJmdWxsV2lkdGgiLCJQYXNzd29yZEZpZWxkIiwiQnV0dG9uIiwiY29sb3IiLCJvbkNsaWNrIiwibG9naW5JZCIsImxvZ2luVHlwZSIsImRpc2FibGVkIiwibG9hZGluZyIsInVzZUxvY2F0aW9uIiwiUXVlcnlFcnJvclJlc2V0Qm91bmRhcnkiLCJSZWFjdEVycm9yQm91bmRhcnkiLCJFcnJvckZhbGxiYWNrIiwiX2UiLCJfZiIsIl9nIiwiX2giLCJVbkF1dGgiLCJJbnRlcm5hbFNlcnZlckVycm9yIiwicmVzZXRCb3VuZGFyeSIsIlJlc291cmNlTm90Rm91bmQiLCJjb2RlIiwiTm9JbnRlcm5lQ29ubmVjdGlvbiIsInNpemUiLCJpc01vZGFsT3BlbiIsInNldE1vZGFsT3BlbiIsInNlc3Npb25Db29raWUiLCJVbkF1dGhvcml6ZWQiLCJjb21wb25lbnQiLCJfRnJhZ21lbnQiLCJEaWFsb2ciLCJjb250ZW50IiwiZm9ybWF0UHJvZEVycm9yTWVzc2FnZSIsInN5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHQiLCJvYnNlcnZhYmxlIiwicmFuZG9tU3RyaW5nIiwicmFuZG9tIiwidG9TdHJpbmciLCJzdWJzdHJpbmciLCJqb2luIiwiYWN0aW9uVHlwZXNfZGVmYXVsdCIsIklOSVQiLCJSRVBMQUNFIiwiUFJPQkVfVU5LTk9XTl9BQ1RJT04iLCJpc1BsYWluT2JqZWN0Iiwib2JqIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIm1pbmlLaW5kT2YiLCJ2YWwiLCJpc0FycmF5IiwidG9EYXRlU3RyaW5nIiwiZ2V0RGF0ZSIsInNldERhdGUiLCJpc0RhdGUiLCJzdGFja1RyYWNlTGltaXQiLCJpc0Vycm9yIiwiY29uc3RydWN0b3JOYW1lIiwiY3Rvck5hbWUiLCJzbGljZSIsInRvTG93ZXJDYXNlIiwia2luZE9mIiwidHlwZU9mVmFsIiwiY3JlYXRlU3RvcmUiLCJyZWR1Y2VyIiwicHJlbG9hZGVkU3RhdGUiLCJlbmhhbmNlciIsImN1cnJlbnRSZWR1Y2VyIiwiY3VycmVudFN0YXRlIiwiY3VycmVudExpc3RlbmVycyIsIk1hcCIsIm5leHRMaXN0ZW5lcnMiLCJsaXN0ZW5lcklkQ291bnRlciIsImlzRGlzcGF0Y2hpbmciLCJlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzIiwiZm9yRWFjaCIsImxpc3RlbmVyIiwiZ2V0U3RhdGUiLCJzdWJzY3JpYmUiLCJpc1N1YnNjcmliZWQiLCJsaXN0ZW5lcklkIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJyZXBsYWNlUmVkdWNlciIsIm5leHRSZWR1Y2VyIiwib3V0ZXJTdWJzY3JpYmUiLCJvYnNlcnZlciIsIm9ic2VydmVTdGF0ZSIsIm9ic2VydmVyQXNPYnNlcnZlciIsInVuc3Vic2NyaWJlIiwid2FybmluZyIsImNvbnNvbGUiLCJjb21iaW5lUmVkdWNlcnMiLCJyZWR1Y2VycyIsInJlZHVjZXJLZXlzIiwia2V5cyIsImZpbmFsUmVkdWNlcnMiLCJmaW5hbFJlZHVjZXJLZXlzIiwidW5leHBlY3RlZEtleUNhY2hlIiwic2hhcGVBc3NlcnRpb25FcnJvciIsImFzc2VydFJlZHVjZXJTaGFwZSIsIndhcm5pbmdNZXNzYWdlIiwiaW5wdXRTdGF0ZSIsImFyZ3VtZW50TmFtZSIsInVuZXhwZWN0ZWRLZXlzIiwiZmlsdGVyIiwiZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZSIsImhhc0NoYW5nZWQiLCJuZXh0U3RhdGUiLCJwcmV2aW91c1N0YXRlRm9yS2V5IiwibmV4dFN0YXRlRm9yS2V5IiwiYWN0aW9uVHlwZSIsIlN0cmluZyIsImNvbXBvc2UiLCJmdW5jcyIsImFyZyIsIk5PVEhJTkciLCJmb3IiLCJEUkFGVEFCTEUiLCJEUkFGVF9TVEFURSIsInBsdWdpbiIsInRoaW5nIiwiZGllIiwibXNnIiwiaXNEcmFmdCIsImlzRHJhZnRhYmxlIiwiaXNNYXAiLCJpc1NldCIsIm9iamVjdEN0b3JTdHJpbmciLCJjYWNoZWRDdG9yU3RyaW5ncyIsIldlYWtNYXAiLCJDdG9yIiwiY3RvclN0cmluZyIsIkZ1bmN0aW9uIiwiZWFjaCIsIml0ZXIiLCJzdHJpY3QiLCJnZXRBcmNodHlwZSIsIlJlZmxlY3QiLCJvd25LZXlzIiwiZW50cnkiLCJ0eXBlXyIsImhhcyIsInByb3AiLCJwcm9wT3JPbGRWYWx1ZSIsImFkZCIsInRhcmdldCIsIlNldCIsImxhdGVzdCIsImNvcHlfIiwiYmFzZV8iLCJzaGFsbG93Q29weSIsImJhc2UiLCJpc1BsYWluIiwiZGVzY3JpcHRvcnMiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVzYyIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImZyZWV6ZSIsImRlZXAiLCJpc0Zyb3plbiIsImRlZmluZVByb3BlcnRpZXMiLCJkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGUiLCJjbGVhciIsImN1cnJlbnRTY29wZSIsInBsdWdpbnMiLCJnZXRQbHVnaW4iLCJwbHVnaW5LZXkiLCJnZXRDdXJyZW50U2NvcGUiLCJ1c2VQYXRjaGVzSW5TY29wZSIsInNjb3BlIiwicGF0Y2hMaXN0ZW5lciIsInBhdGNoZXNfIiwiaW52ZXJzZVBhdGNoZXNfIiwicGF0Y2hMaXN0ZW5lcl8iLCJyZXZva2VTY29wZSIsImxlYXZlU2NvcGUiLCJkcmFmdHNfIiwicmV2b2tlRHJhZnQiLCJwYXJlbnRfIiwiZW50ZXJTY29wZSIsImltbWVyMiIsImltbWVyXyIsImNhbkF1dG9GcmVlemVfIiwidW5maW5hbGl6ZWREcmFmdHNfIiwiZHJhZnQiLCJyZXZva2VfIiwicmV2b2tlZF8iLCJwcm9jZXNzUmVzdWx0IiwiYmFzZURyYWZ0IiwibW9kaWZpZWRfIiwiZmluYWxpemUiLCJtYXliZUZyZWV6ZSIsImdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyIsInJvb3RTY29wZSIsInVzZVN0cmljdEl0ZXJhdGlvbiIsInNob3VsZFVzZVN0cmljdEl0ZXJhdGlvbiIsImNoaWxkVmFsdWUiLCJmaW5hbGl6ZVByb3BlcnR5Iiwic2NvcGVfIiwiZmluYWxpemVkXyIsInJlc3VsdEVhY2giLCJpc1NldDIiLCJnZW5lcmF0ZVBhdGNoZXNfIiwicGFyZW50U3RhdGUiLCJ0YXJnZXRPYmplY3QiLCJyb290UGF0aCIsInRhcmdldElzU2V0IiwiY2hpbGRJc0Zyb3plbiIsImFzc2lnbmVkXyIsImF1dG9GcmVlemVfIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJvYmplY3RUcmFwcyIsInNvdXJjZSIsImdldERlc2NyaXB0b3JGcm9tUHJvdG8iLCJkcmFmdF8iLCJyZWFkUHJvcEZyb21Qcm90byIsInBlZWsiLCJwcmVwYXJlQ29weSIsImNyZWF0ZVByb3h5IiwiY3VycmVudDIiLCJ4IiwibWFya0NoYW5nZWQiLCJOdW1iZXIiLCJpc05hTiIsImRlbGV0ZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duZXIiLCJkZWZpbmVQcm9wZXJ0eSIsImFycmF5VHJhcHMiLCJ1c2VTdHJpY3RTaGFsbG93Q29weV8iLCJmbiIsInBhcnNlSW50IiwicGFyZW50IiwicHJveHlNYXBfIiwicHJveHlTZXRfIiwiaXNNYW51YWxfIiwidHJhcHMiLCJyZXZva2UiLCJwcm94eSIsIlByb3h5IiwicmV2b2NhYmxlIiwiY3JlYXRlUHJveHlQcm94eSIsImN1cnJlbnRJbXBsIiwiY29weSIsImltbWVyIiwidXNlU3RyaWN0SXRlcmF0aW9uXyIsInByb2R1Y2UiLCJyZWNpcGUiLCJkZWZhdWx0QmFzZSIsInNlbGYiLCJiYXNlMiIsImhhc0Vycm9yIiwiaXAiLCJwcm9kdWNlV2l0aFBhdGNoZXMiLCJwYXRjaGVzIiwiaW52ZXJzZVBhdGNoZXMiLCJhdXRvRnJlZXplIiwic2V0QXV0b0ZyZWV6ZSIsInVzZVN0cmljdFNoYWxsb3dDb3B5Iiwic2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkiLCJzZXRVc2VTdHJpY3RJdGVyYXRpb24iLCJjcmVhdGVEcmFmdCIsImN1cnJlbnQiLCJmaW5pc2hEcmFmdCIsImFwcGx5UGF0Y2hlcyIsInBhdGNoIiwiYXBwbHlQYXRjaGVzSW1wbCIsImFwcGx5UGF0Y2hlc18iLCJjcmVhdGVUaHVua01pZGRsZXdhcmUiLCJleHRyYUFyZ3VtZW50IiwidGh1bmsiLCJ3aXRoRXh0cmFBcmd1bWVudCIsImNvbXBvc2VXaXRoRGV2VG9vbHMiLCJfX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18iLCJpc0FjdGlvbkNyZWF0b3IiLCJtYXRjaCIsImdldFRpbWVNZWFzdXJlVXRpbHMiLCJtYXhEZWxheSIsImZuTmFtZSIsImVsYXBzZWQiLCJtZWFzdXJlVGltZSIsInN0YXJ0ZWQiLCJmaW5pc2hlZCIsIndhcm5JZkV4Y2VlZGVkIiwiVHVwbGUiLCJfVHVwbGUiLCJpdGVtcyIsInN1cGVyIiwic3BlY2llcyIsImFyciIsInByZXBlbmQiLCJpc0ltbXV0YWJsZURlZmF1bHQiLCJ0cmFja0Zvck11dGF0aW9ucyIsImlzSW1tdXRhYmxlIiwiaWdub3JlUGF0aHMiLCJ0cmFja2VkUHJvcGVydGllcyIsInRyYWNrUHJvcGVydGllcyIsImRldGVjdE11dGF0aW9ucyIsImNoZWNrZWRPYmplY3RzIiwidHJhY2tlZCIsImNoaWxkUGF0aCIsImluZGV4T2YiLCJpZ25vcmVkUGF0aHMiLCJ0cmFja2VkUHJvcGVydHkiLCJzYW1lUGFyZW50UmVmIiwicHJldk9iaiIsInNhbWVSZWYiLCJ3YXNNdXRhdGVkIiwia2V5c1RvRGV0ZWN0IiwiaGFzSWdub3JlZFBhdGhzIiwibmVzdGVkUGF0aCIsImlnbm9yZWQiLCJSZWdFeHAiLCJ0ZXN0IiwiZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlIiwiaXNTZXJpYWxpemFibGUiLCJnZXRFbnRyaWVzIiwiY2FjaGUiLCJmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZSIsImtleVBhdGgiLCJuZXN0ZWRWYWx1ZSIsImlzTmVzdGVkRnJvemVuIiwiY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlIiwib3B0aW9ucyIsImlnbm9yZWRBY3Rpb25zIiwiaWdub3JlZEFjdGlvblBhdGhzIiwid2FybkFmdGVyIiwiaWdub3JlU3RhdGUiLCJpZ25vcmVBY3Rpb25zIiwiZGlzYWJsZUNhY2hlIiwiV2Vha1NldCIsInN0b3JlQVBJIiwiaXNBY3Rpb24iLCJtZWFzdXJlVXRpbHMiLCJmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlIiwiZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlIiwiaXNCb29sZWFuIiwiYnVpbGRHZXREZWZhdWx0TWlkZGxld2FyZSIsImltbXV0YWJsZUNoZWNrIiwic2VyaWFsaXphYmxlQ2hlY2siLCJhY3Rpb25DcmVhdG9yQ2hlY2siLCJtaWRkbGV3YXJlQXJyYXkiLCJ0aHVua01pZGRsZXdhcmUiLCJpbW11dGFibGVPcHRpb25zIiwidW5zaGlmdCIsInN0cmluZ2lmeTIiLCJzZXJpYWxpemVyIiwiaW5kZW50IiwiZGVjeWNsZXIiLCJnZXRTZXJpYWxpemUyIiwic3RhY2siLCJ0aGlzUG9zIiwic3BsaWNlIiwiSW5maW5pdHkiLCJ0cmFjayIsInRyYWNrZXIiLCJkaXNwYXRjaGVkQWN0aW9uIiwiY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlIiwic2VyaWFsaXphYmxlT3B0aW9ucyIsImFjdGlvbkNyZWF0b3JPcHRpb25zIiwiaXNBY3Rpb25DcmVhdG9yMiIsImNyZWF0ZUFjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlIiwiY3JlYXRlUXVldWVXaXRoVGltZXIiLCJ0aW1lb3V0Iiwibm90aWZ5Iiwic2V0VGltZW91dCIsImJ1aWxkR2V0RGVmYXVsdEVuaGFuY2VycyIsIm1pZGRsZXdhcmVFbmhhbmNlciIsImF1dG9CYXRjaCIsImVuaGFuY2VyQXJyYXkiLCJzdG9yZSIsIm5vdGlmeWluZyIsInNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrIiwibm90aWZpY2F0aW9uUXVldWVkIiwibGlzdGVuZXJzIiwicXVldWVDYWxsYmFjayIsInF1ZXVlTWljcm90YXNrIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwicXVldWVOb3RpZmljYXRpb24iLCJub3RpZnlMaXN0ZW5lcnMiLCJsIiwibGlzdGVuZXIyIiwibWV0YSIsImF1dG9CYXRjaEVuaGFuY2VyIiwiY29uZmlndXJlU3RvcmUiLCJnZXREZWZhdWx0TWlkZGxld2FyZSIsIm1pZGRsZXdhcmUiLCJkZXZUb29scyIsImR1cGxpY2F0ZU1pZGRsZXdhcmVDaGVjayIsImVuaGFuY2VycyIsInJvb3RSZWR1Y2VyIiwiZmluYWxNaWRkbGV3YXJlIiwibWlkZGxld2FyZVJlZmVyZW5jZXMiLCJtaWRkbGV3YXJlMiIsImZpbmFsQ29tcG9zZSIsInRyYWNlIiwibWlkZGxld2FyZXMiLCJjcmVhdGVTdG9yZTIiLCJtaWRkbGV3YXJlQVBJIiwiY2hhaW4iLCJhcHBseU1pZGRsZXdhcmUiLCJnZXREZWZhdWx0RW5oYW5jZXJzIiwic3RvcmVFbmhhbmNlcnMiLCJTbmFja2JhckNvbnRleHQiLCJTbmFja2JhclByb3ZpZGVyIiwic2hvd1NuYWNrYmFyIiwiU25hY2tiYXIiLCJhdXRvSGlkZUR1cmF0aW9uIiwiUHJvdmlkZXJzIiwiYmFzZW5hbWUiLCJxdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50IiwiZGVmYXVsdE9wdGlvbnMiLCJxdWVyaWVzIiwicmVmZXRjaE9uV2luZG93Rm9jdXMiLCJyZXRyeSIsInVzZUVycm9yQm91bmRhcnkiLCJiYXNlTmFtZSIsIm9yaWdpbiIsIkJyb3dzZXJSb3V0ZXIiLCJRdWVyeUNsaWVudFByb3ZpZGVyIiwiZGVmYXVsdENvbmZpcm1EaWFsb2dTdGF0ZSIsInVzZUNvbmZpcm0iLCJyZXNldERpYWxvZyIsIkRlcGFydG1lbnRNb25nb011bHRpU2VsZWN0b3IiLCJNdWx0aVNlbGVjdCIsImRiTGFiZWxQcm9wcyIsImxhYmVsS2V5Iiwic3ViTGFiZWxLZXkiLCJ1c2VTdWJMYWJlbFN0YXJ0Q2FzZSIsImRiVmFsdWVQcm9wcyIsInZhbHVlS2V5IiwiaXNPYmplY3RJZCIsImV4dGVybmFsQXhpb3MiLCJvcHRpb25zQXBpRW5kUG9pbnQiLCJEZXBhcnRtZW50U3FsTXVsdGlTZWxlY3RvciIsImlzSW50IiwiQmF0Y2hTZWxlY3RvciIsIlNpbmdsZVNlbGVjdCIsIkNvdXJzZVNlbGVjdG9yIiwiRGVwYXJ0bWVudFNlbGVjdG9yIiwiRW1wbG95ZWVzU2VsZWN0b3IiLCJFeGFtc1JlZ3VsYXRpb25TZWxlY3RvciIsImV4YW1UeXBlT3B0aW9ucyIsIkV4YW1UeXBlU2VsZWN0b3IiLCJGZWVUeXBlcyIsInllYXJzIiwiZnJvbSIsImdldEZ1bGxZZWFyIiwiRmVlVHlwZVNlbGVjdG9yIiwiSG9zdGVsQmxvY2tTZWxlY3RvciIsInVzZUxhYmVsU3RhcnRDYXNlIiwiSG9zdGVsRmxvb3JTZWxlY3RvciIsIkhvc3RlbFJvb21TZWxlY3RvciIsIk1vbnRoWWVhclNlbGVjdG9yIiwiUHJpbnRGb3JtYXRTZWxlY3RvciIsIlByb2dyYW1TZWxlY3RvciIsIlJlZ3VsYXRpb25TZWxlY3RvciIsIlJlc2VhcmNoRXhwZXJ0RGVzaWduYXRpb25TZWxlY3RvciIsIlJlc2VhcmNoRXhwZXJ0U2VsZWN0b3IiLCJSZXNlYXJjaFN0YWdlU2VsZWN0b3IiLCJTZW1lc3RlclNlbGVjdG9yIiwiU3R1ZGVudFNlbGVjdG9yIiwiU3R1ZGVudFNlcnZpY2VzU2VsZWN0b3IiLCJZZWFyUmFuZ2VTZWxlY3RvciIsInN1ZmZpeCIsImdldE93blByb3BlcnR5U3ltYm9scyIsIl9fcmVzdCIsInllYXIiLCJvcGVuSW5OZXdUYWIiLCJwYXRoQWZ0ZXJCYXNlIiwiZXhjbHVkZUluc3RpdHV0aW9uIiwiZXhjbHVkZVdvcmtzcGFjZSIsInNlZ21lbnRzIiwiYmFzZVBhcnRzIiwiZnVsbFBhdGgiLCJFeG90ZWxTZXJ2aWNlIiwiZXhvdGVsU0RLIiwid2ViUGhvbmUiLCJjYWxsTGlzdGVuZXJzIiwicmVnaXN0ZXJMaXN0ZW5lcnMiLCJzZXNzaW9uTGlzdGVuZXJzIiwiaGFuZGxlQ2FsbEV2ZW50IiwiZXZlbnQiLCJjYWxsRGF0YSIsImhhbmRsZVJlZ2lzdGVyRXZlbnQiLCJoYW5kbGVTZXNzaW9uRXZlbnQiLCJnZXRJbnN0YW5jZSIsImluc3RhbmNlIiwiaW5pdGlhbGl6ZSIsImFjY2Vzc1Rva2VuXzEiLCJhZ2VudFVzZXJJZF8xIiwiYWNjZXNzVG9rZW4iLCJhZ2VudFVzZXJJZCIsImF1dG9Db25uZWN0Vk9JUCIsInBob25lIiwiY2hlY2tBdWRpb1Blcm1pc3Npb25zIiwiRXhvdGVsQ1JNV2ViU0RLIiwiSW5pdGlhbGl6ZSIsImRldmljZXMiLCJwZXJtaXNzaW9uU3RhdHVzXzEiLCJtZWRpYURldmljZXMiLCJlbnVtZXJhdGVEZXZpY2VzIiwiZGV2aWNlIiwia2luZCIsIm9uY2hhbmdlIiwicmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MiLCJnZXRVc2VyTWVkaWEiLCJhdWRpbyIsImdldFRyYWNrcyIsInN0b3AiLCJtYWtlQ2FsbCIsInBob25lTnVtYmVyIiwiTWFrZUNhbGwiLCJhY2NlcHRDYWxsIiwiQWNjZXB0Q2FsbCIsImhhbmd1cENhbGwiLCJIYW5ndXBDYWxsIiwicmVqZWN0Q2FsbCIsInRvZ2dsZUhvbGQiLCJUb2dnbGVIb2xkIiwidG9nZ2xlTXV0ZSIsIlRvZ2dsZU11dGUiLCJzZW5kRFRNRiIsImRpZ2l0IiwiU2VuZERUTUYiLCJyZWdpc3RlckRldmljZSIsIlJlZ2lzdGVyRGV2aWNlIiwidW5yZWdpc3RlckRldmljZSIsIlVuUmVnaXN0ZXJEZXZpY2UiLCJnZXRQZXJtaXNzaW9uU3RhdHVzIiwiYWRkQ2FsbExpc3RlbmVyIiwicmVtb3ZlQ2FsbExpc3RlbmVyIiwiYWRkUmVnaXN0ZXJMaXN0ZW5lciIsInJlbW92ZVJlZ2lzdGVyTGlzdGVuZXIiLCJhZGRTZXNzaW9uTGlzdGVuZXIiLCJyZW1vdmVTZXNzaW9uTGlzdGVuZXIiLCJjaGVja1ZvSVBFbmFibGVkIiwiZW5hYmxlZFZvaWNlQ29uZmlnIiwiZW5hYmxlVm9pY2UiLCJ2b2ljZUNvbmZpZ3MiLCJmaW5kIiwidmMiLCJpc0VuYWJsZWQiLCJlbmFibGVkIiwiaGFzVmFsaWRUb2tlbiIsIkVYT1RFTCIsInRva2VuRXhwaXJlc0F0IiwiZ2V0QWN0aXZlVm9pY2VUb2tlbiIsImNyZWF0ZUV4b3RlbEFwcFRva2VuIiwidG9rZW5EYXRhIiwiRGF0YSIsImluaXRpYXRlQ2FsbEFjdGl2aXR5IiwiaW5wdXQiLCJyZWdpc3RlckluY29taW5nQ2FsbCIsImZldGNoQ2FsbEhpc3RvcnkiLCJwcm9zcGVjdElkIiwiZ2V0Q2FsbEFjdGl2aXR5QnlJZCIsImlkIiwiZ2V0Q2FsbEFjdGl2aXR5QnlDYWxsU2lkIiwiY2FsbFNpZCIsImdldENhbGxDb3VudEJ5UHJvc3BlY3QiLCJjb3VudCIsInNhdmVDYWxsRGlzcG9zaXRpb24iLCJyZXF1ZXN0Qm9keSIsImNhbGxTdGF0dXNEaXNwb3NpdGlvbiIsImRpc3Bvc2l0aW9uQ2F0ZWdvcnkiLCJwcm9zcGVjdFN0YXR1cyIsImRpc3Bvc2l0aW9uTm90ZXMiLCJjYWxsYmFja1NjaGVkdWxlZEF0IiwiY2FsbElkIiwiY2FuY2VsQ2FsbCIsIkVYT1RFTF9DT05URVhUX0tFWSIsImluaXRpYWxDYWxsU3RhdGUiLCJwaGFzZSIsImlzT25Ib2xkIiwiaXNNdXRlZCIsImlzU3BlYWtlck9mZiIsImNhbGxEaXJlY3Rpb24iLCJjYWxsU3RhcnRUaW1lIiwiY2FsbER1cmF0aW9uIiwiY2FsbGVyTmFtZSIsImNhbGxlck51bWJlciIsImNhbGxBY3Rpdml0eUlkIiwiZXhvdGVsQ2FsbFNpZCIsInByb3NwZWN0VW5pcXVlSWQiLCJ3YXNBY2NlcHRlZCIsIm1hc2tNb2JpbGUiLCJtb2JpbGUiLCJwcmVmaXgiLCJudW1iZXIiLCJzdGFydHNXaXRoIiwiY2xlYW5lZCIsInJlcGVhdCIsIkV4b3RlbENvbnRleHQiLCJFeG90ZWxQcm92aWRlciIsImRlZmF1bHRDYWxsZXJOYW1lIiwiaXNJbml0aWFsaXplZCIsInNldElzSW5pdGlhbGl6ZWQiLCJpc0Nvbm5lY3RlZCIsInNldElzQ29ubmVjdGVkIiwic2V0UGVybWlzc2lvblN0YXR1cyIsImNhbGxTdGF0ZSIsInNldENhbGxTdGF0ZSIsImRpc3Bvc2l0aW9uRGF0YSIsInNldERpc3Bvc2l0aW9uRGF0YSIsInRpbWVyUmVmIiwidXNlUmVmIiwiY2FsbFN0YXRlUmVmIiwiZXhvdGVsU2VydmljZSIsInNldEludGVydmFsIiwicHJldiIsImNsZWFySW50ZXJ2YWwiLCJyZXF1ZXN0UGVybWlzc2lvbiIsImNhdGNoIiwic3VjY2VzcyIsImluY29taW5nTnVtYmVyXzEiLCJjYWxsRnJvbU51bWJlciIsInJlbW90ZUlkIiwicmVtb3RlRGlzcGxheU5hbWUiLCJzZXNzaW9uSWQiLCJmcm9tTnVtYmVyIiwidG9OdW1iZXIiLCJwcm9zcGVjdE1vYmlsZSIsInByb3NwZWN0IiwidW5pcXVlSWQiLCJkaXNwb3NpdGlvbkRhdGFPYmoiLCJleG90ZWxDYWxsSWQiLCJ1c2VDYWxsYmFjayIsIm1hc2tlZE51bWJlciIsImVycm9yXzIiLCJ0b2dnbGVTcGVha2VyIiwiY2xlYXJEaXNwb3NpdGlvbiIsInNldENhbGxBY3Rpdml0eUlkRm4iLCJzZXRFeG90ZWxDYWxsU2lkRm4iLCJzZXRDYWxsQWN0aXZpdHlJZCIsInNldEV4b3RlbENhbGxTaWQiLCJ1c2VFeG90ZWwiLCJ1c2VDb250ZXh0IiwidXNlRXhvdGVsU2FmZSIsIkVYT1RFTF9DT05TVEFOVFMiLCJDQUxMX1NUQVRVU19PUFRJT05TIiwiQ09OTkVDVEVEX0RJU1BPU0lUSU9OUyIsIk5PVF9DT05ORUNURURfRElTUE9TSVRJT05TIiwiQ2FsbERpc3Bvc2l0aW9uRm9ybSIsIm9uU2F2ZSIsImV4aXN0aW5nRGF0YSIsInVzZVF1ZXJ5Q2xpZW50IiwiaXNFZGl0TW9kZSIsImNhbGxTdGF0dXMiLCJzZXRDYWxsU3RhdHVzIiwic2V0RGlzcG9zaXRpb25DYXRlZ29yeSIsInJlbWFya3MiLCJzZXRSZW1hcmtzIiwiaW52YWxpZGF0ZVF1ZXJpZXMiLCJoYW5kbGVDYWxsU3RhdHVzQ2hhbmdlIiwiaGFuZGxlRGlzcG9zaXRpb25DaGFuZ2UiLCJzdWJtaXREYXRhIiwiY2hhbm5lbCIsImRpcmVjdGlvbiIsImR1cmF0aW9uIiwiZGlzcG9zaXRpb25PcHRpb25zIiwibWF4V2lkdGgiLCJUeXBvZ3JhcGh5Iiwic2Vjb25kcyIsIm1pbnMiLCJzZWNzIiwiUmFkaW9Hcm91cCIsIlRleHRhcmVhIiwicm93cyIsIkV4b3RlbFBob25lIiwicHJvc3BlY3ROYW1lIiwicHJvc3BlY3ROdW1iZXIiLCJvblNhdmVEaXNwb3NpdGlvbiIsImlzQWNjZXB0aW5nIiwic2V0SXNBY2NlcHRpbmciLCJpc0RlY2xpbmluZyIsInNldElzRGVjbGluaW5nIiwiZGVjbGluZVRpbWVvdXRSZWYiLCJzdHlsZUlkIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInN0eWxlRWwiLCJ0ZXh0Q29udGVudCIsImhlYWQiLCJhcHBlbmRDaGlsZCIsInNka0NhbGxlck5hbWUiLCJzZGtDYWxsZXJOdW1iZXIiLCJkaXNwbGF5TmFtZSIsImRpc3BsYXlOdW1iZXIiLCJoYW5kbGVEZWNsaW5lQ2FsbCIsImNhbGxTaWRGb3JBcGkiLCJyZWFzb24iLCJjbGVhclRpbWVvdXQiLCJmaW5hbENhbGxlck5hbWUiLCJlbnJpY2hlZERpc3Bvc2l0aW9uRGF0YSIsImlzT3V0Ym91bmQiLCJpc0luYm91bmQiLCJhdmF0YXJCZ0NvbG9yIiwiZ2V0Q29ubmVjdGluZ1RleHQiLCJtb2RhbENvbnRlbnQiLCJzdHlsZSIsInpJbmRleCIsImJvcmRlclJhZGl1cyIsImJvcmRlciIsInN0b3BQcm9wYWdhdGlvbiIsIlgiLCJQaG9uZU91dGdvaW5nIiwiUGhvbmVJbmNvbWluZyIsIlBob25lIiwicGFkU3RhcnQiLCJnZXRTdGF0dXNUZXh0IiwiTWljT2ZmIiwiTWljIiwiUGxheSIsIlBhdXNlIiwiVm9sdW1lWCIsIlZvbHVtZTIiLCJQaG9uZU9mZiIsImJhY2tncm91bmRDb2xvciIsImNyZWF0ZVBvcnRhbCIsIkNyeXB0b1NlcnZpY2UiLCJhbGdvcml0aG0iLCJzZWNyZXRLZXkiLCJpbml0aWFsaXplZCIsImVuc3VyZUluaXRpYWxpemVkIiwia2V5QnVmZmVyIiwiVGV4dEVuY29kZXIiLCJlbmNvZGUiLCJzYWx0QnVmZmVyIiwic3luY1NjcnlwdCIsImRlY3J5cHREYXRhIiwiZW5jcnlwdGVkRGF0YSIsIml2SGV4IiwiZW5jcnlwdGVkIiwiY3J5cHRvXzEiLCJyZXF1aXJlIiwiaXYiLCJCdWZmZXIiLCJkZWNpcGhlciIsImNyZWF0ZURlY2lwaGVyaXYiLCJkZWNyeXB0ZWQiLCJmaW5hbCIsIkNhbGxCdXR0b24iLCJlbmNyeXB0ZWRQaG9uZU51bWJlciIsImV4b3RlbCIsImlzRGlhbGluZyIsInNldElzRGlhbGluZyIsInNldEVycm9yIiwiaXNDYWxsSW5Qcm9ncmVzcyIsImhhc1Bob25lTnVtYmVyIiwiYWN0dWFsUGhvbmVOdW1iZXIiLCJzZGtSZXNwb25zZSIsImVycl8xIiwiZXJyb3JNZXNzYWdlIiwiZXJyb3JEZXRhaWxzIiwiZGVzY3JpcHRpb24iLCJDYWxsU2lkIiwiQ29kZSIsIlN0YXR1cyIsInBhcnNlRXJyIiwiZXJyb3JfZGF0YSIsIk1pY3JvcGhvbmVQZXJtaXNzaW9uIiwib25QZXJtaXNzaW9uR3JhbnRlZCIsIm9uUGVybWlzc2lvbkRlbmllZCIsImlzUmVxdWVzdGluZyIsInNldElzUmVxdWVzdGluZyIsIkFsZXJ0Q2lyY2xlIiwiRXhvdGVsV3JhcHBlciIsInNldEFjY2Vzc1Rva2VuIiwic2V0SXNMb2FkaW5nIiwiVm9JUFByb3ZpZGVyIiwiaXNXb3Jrc3BhY2VWb0lQRW5hYmxlZCIsImhhc0FnZW50VXNlcklkIiwiaGFuZGxlU2F2ZURpc3Bvc2l0aW9uIiwiZGlzcG9zaXRpb25SZWFzb24iXSwibWFwcGluZ3MiOiI4NkNBK0JPLElBQUlBLEdBQVcsV0FRbEIsT0FQQUEsR0FBV0MsT0FBT0MsUUFBVSxTQUFrQkMsR0FDMUMsSUFBSyxJQUFJQyxFQUFHQyxFQUFJLEVBQUdDLEVBQUlDLFVBQVVDLE9BQVFILEVBQUlDLEVBQUdELElBRTVDLElBQUssSUFBSUksS0FEVEwsRUFBSUcsVUFBVUYsR0FDT0osT0FBT1MsVUFBVUMsZUFBZUMsS0FBS1IsRUFBR0ssS0FBSU4sRUFBRU0sR0FBS0wsRUFBRUssSUFFOUUsT0FBT04sQ0FDWCxFQUNPSCxHQUFTYSxNQUFNQyxLQUFNUCxVQUNoQyxFQTBFTyxTQUFTUSxHQUFVQyxFQUFTQyxFQUFZQyxFQUFHQyxHQUU5QyxPQUFPLElBQUtELElBQU1BLEVBQUlFLFVBQVUsU0FBVUMsRUFBU0MsR0FDL0MsU0FBU0MsRUFBVUMsR0FBUyxJQUFNQyxFQUFLTixFQUFVTyxLQUFLRixHQUFTLENBQUUsTUFBT0csR0FBS0wsRUFBT0ssRUFBSSxDQUFFLENBQzFGLFNBQVNDLEVBQVNKLEdBQVMsSUFBTUMsRUFBS04sRUFBaUIsTUFBRUssR0FBUyxDQUFFLE1BQU9HLEdBQUtMLEVBQU9LLEVBQUksQ0FBRSxDQUM3RixTQUFTRixFQUFLSSxHQUpsQixJQUFlTCxFQUlhSyxFQUFPQyxLQUFPVCxFQUFRUSxFQUFPTCxRQUoxQ0EsRUFJeURLLEVBQU9MLE1BSmhEQSxhQUFpQk4sRUFBSU0sRUFBUSxJQUFJTixFQUFFLFNBQVVHLEdBQVdBLEVBQVFHLEVBQVEsSUFJakJPLEtBQUtSLEVBQVdLLEVBQVcsQ0FDN0dILEdBQU1O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
|