openstack-uicore-foundation 4.0.97 → 4.0.98

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.
Files changed (95) hide show
  1. package/lib/components/ajaxloader.js +184 -1
  2. package/lib/components/attendance-tracker.js +1992 -1
  3. package/lib/components/bulk-actions-selector.js +194 -1
  4. package/lib/components/circle-button.js +223 -1
  5. package/lib/components/clock.js +678 -1
  6. package/lib/components/exclusive-wrapper.js +151 -1
  7. package/lib/components/extra-questions.js +1902 -1
  8. package/lib/components/form-validation.js +190 -1
  9. package/lib/components/forms/rsvp-form.js +940 -1
  10. package/lib/components/forms/simple-form.js +708 -1
  11. package/lib/components/free-text-search.js +2042 -1
  12. package/lib/components/google-map.js +576 -1
  13. package/lib/components/index.js +12840 -1
  14. package/lib/components/inputs/access-levels-input.js +2306 -1
  15. package/lib/components/inputs/action-dropdown.js +219 -1
  16. package/lib/components/inputs/checkbox-list.js +339 -1
  17. package/lib/components/inputs/company-input.js +2341 -1
  18. package/lib/components/inputs/country-dropdown.js +2399 -1
  19. package/lib/components/inputs/country-input.js +2302 -1
  20. package/lib/components/inputs/datetimepicker.js +314 -1
  21. package/lib/components/inputs/dropdown.js +259 -1
  22. package/lib/components/inputs/editor-input.js +270 -1
  23. package/lib/components/inputs/event-input.js +2280 -1
  24. package/lib/components/inputs/free-multi-text-input.js +252 -1
  25. package/lib/components/inputs/group-input.js +2275 -1
  26. package/lib/components/inputs/grouped-dropdown.js +244 -1
  27. package/lib/components/inputs/language-input.js +2307 -1
  28. package/lib/components/inputs/member-input.js +2302 -1
  29. package/lib/components/inputs/operator-input.js +328 -1
  30. package/lib/components/inputs/organization-input.js +2325 -1
  31. package/lib/components/inputs/promocode-input.js +2310 -1
  32. package/lib/components/inputs/radio-list.js +297 -1
  33. package/lib/components/inputs/registration-company-input.js +2470 -1
  34. package/lib/components/inputs/speaker-input.js +2336 -1
  35. package/lib/components/inputs/sponsor-input.js +2284 -1
  36. package/lib/components/inputs/stepped-select.js +197 -1
  37. package/lib/components/inputs/summit-days-select.js +162 -1
  38. package/lib/components/inputs/summit-input.js +2282 -1
  39. package/lib/components/inputs/summit-venues-select.js +172 -1
  40. package/lib/components/inputs/tag-input.js +2352 -1
  41. package/lib/components/inputs/text-input.js +202 -1
  42. package/lib/components/inputs/textarea-input.js +181 -1
  43. package/lib/components/inputs/ticket-types-input.js +2338 -1
  44. package/lib/components/inputs/upload-input-v2.js +834 -1
  45. package/lib/components/inputs/upload-input.js +391 -1
  46. package/lib/components/progressive-img.js +289 -1
  47. package/lib/components/raw-html.js +125 -1
  48. package/lib/components/schedule-builder-constants.js +81 -1
  49. package/lib/components/schedule-builder-view.js +1684 -1
  50. package/lib/components/sections/panel.js +156 -1
  51. package/lib/components/simple-link-list.js +790 -1
  52. package/lib/components/sponsored-project-input.js +2281 -1
  53. package/lib/components/summit-dropdown.js +214 -1
  54. package/lib/components/table-editable.js +895 -1
  55. package/lib/components/table-selectable.js +552 -1
  56. package/lib/components/table-sortable.js +657 -1
  57. package/lib/components/table.js +510 -1
  58. package/lib/components/video-stream.js +226 -1
  59. package/lib/css/components/bulk-actions-selector.css +16 -1
  60. package/lib/css/components/circle-button.css +24 -1
  61. package/lib/css/components/extra-questions.css +29 -1
  62. package/lib/css/components/form-validation.css +29 -1
  63. package/lib/css/components/free-text-search.css +29 -1
  64. package/lib/css/components/index.css +1354 -2
  65. package/lib/css/components/inputs/action-dropdown.css +46 -1
  66. package/lib/css/components/inputs/datetimepicker.css +208 -1
  67. package/lib/css/components/inputs/grouped-dropdown.css +25 -1
  68. package/lib/css/components/inputs/stepped-select.css +12 -1
  69. package/lib/css/components/inputs/upload-input-v2.css +106 -1
  70. package/lib/css/components/inputs/upload-input.css +43 -1
  71. package/lib/css/components/progressive-img.css +16 -1
  72. package/lib/css/components/schedule-builder-view.css +230 -1
  73. package/lib/css/components/simple-link-list.css +189 -1
  74. package/lib/css/components/summit-dropdown.css +35 -1
  75. package/lib/css/components/table-editable.css +145 -1
  76. package/lib/css/components/table-selectable.css +147 -1
  77. package/lib/css/components/table-sortable.css +150 -1
  78. package/lib/css/components/table.css +147 -1
  79. package/lib/i18n.js +449 -1
  80. package/lib/models/index.js +238 -1
  81. package/lib/models/summit-event.js +210 -1
  82. package/lib/security/abstract-auth-callback-route.js +2114 -1
  83. package/lib/security/actions.js +1818 -1
  84. package/lib/security/constants.js +71 -1
  85. package/lib/security/methods.js +1818 -1
  86. package/lib/security/reducers.js +1961 -1
  87. package/lib/security/session-checker.js +2179 -1
  88. package/lib/utils/actions.js +1818 -1
  89. package/lib/utils/fragment-parser.js +207 -1
  90. package/lib/utils/methods.js +369 -1
  91. package/lib/utils/query-actions.js +2154 -1
  92. package/lib/utils/questions-set.js +609 -1
  93. package/lib/utils/reducers.js +1874 -1
  94. package/lib/utils/use-fit-text.js +178 -1
  95. package/package.json +1 -1
@@ -1 +1,2470 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("openstack-uicore-foundation",[],t):"object"==typeof exports?exports["openstack-uicore-foundation"]=t():e["openstack-uicore-foundation"]=t()}(this,(()=>(()=>{"use strict";var e={4341:(e,t,a)=>{a(8779),a(4656),a(4054),a(6793),a(8576)},1593:(e,t,a)=>{a.d(t,{AUTH_ERROR_ACCESS_TOKEN_EXPIRED:()=>o,AUTH_ERROR_LOCK_ACQUIRE_ERROR:()=>s,AUTH_ERROR_MISSING_AUTH_INFO:()=>n,AUTH_ERROR_MISSING_REFRESH_TOKEN:()=>r,AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR:()=>l});const n="AUTH_ERROR_MISSING_AUTH_INFO",r="AUTH_ERROR_MISSING_REFRESH_TOKEN",o="AUTH_ERROR_ACCESS_TOKEN_EXPIRED",s="AUTH_ERROR_LOCK_ACQUIRE_ERROR",l="AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR"},8576:(e,t,a)=>{a.d(t,{getAccessToken:()=>f});var n=a(6793);a(2691);const r=require("browser-tabs-lock");var o=a.n(r);a(6530),a(3856),a(4341);require("crypto-js/sha256"),require("crypto-js/enc-base64url"),require("crypto-js/enc-hex"),"undefined"!=typeof window&&(window.crypto||window.msCrypto);var s=a(1593);const l=new(o()),c="openstackuicore.lock.getTokenSilently",i="code",d="authInfo",u="nonce",p="pkce",f=async()=>{if(await(0,n.retryPromise)((()=>l.acquireLock(c,5e3)),10))try{let e=R();if(!e)throw Error(s.AUTH_ERROR_MISSING_AUTH_INFO);let{accessToken:t,expiresIn:a,accessTokenUpdatedAt:n,refreshToken:r}=e,o=y(),l=Math.floor(Date.now()/1e3);if(a-=20,l-n>a||null==t){if(console.log("getAccessToken access token expired"),o===i&&g()){if(!r)throw _(),Error(s.AUTH_ERROR_MISSING_REFRESH_TOKEN);let e=await h(r),{access_token:t,expires_in:a,refresh_token:n}=e;return void 0===n&&(n=null),m(t,a,n),t}throw _(),Error(s.AUTH_ERROR_ACCESS_TOKEN_EXPIRED)}return t}finally{await l.releaseLock(c)}throw Error(s.AUTH_ERROR_LOCK_ACQUIRE_ERROR)},h=async e=>{let t=b(),a=E();const r={grant_type:"refresh_token",client_id:encodeURI(a),refresh_token:e};try{const e=await fetch(`${t}/oauth2/token`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(r)}).then((e=>{if(400===e.status){(0,n.getCurrentPathName)();throw(0,n.setSessionClearingState)(!0),Error(`${s.AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR}: ${e.status} - ${e.statusText}`)}return e})).catch((function(e){throw Error(`${s.AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR}: ${e.message}`)})),a=await e.json();let{access_token:o,refresh_token:l,expires_in:c}=a;return{access_token:o,refresh_token:l,expires_in:c}}catch(e){throw console.log(e),e}},m=(e,t,a=null,r=null)=>{let o=R(),s={accessToken:e,expiresIn:t,accessTokenUpdatedAt:Math.floor(Date.now()/1e3)};null===a&&o&&(a=o.refreshToken),null===r&&o&&(r=o.idToken),a&&(s.refreshToken=a),r&&(s.idToken=r),(0,n.putOnLocalStorage)(d,JSON.stringify(s))},R=()=>{try{let e=(0,n.getFromLocalStorage)(d,!1);return e?JSON.parse(e):null}catch(e){return null}},_=()=>{if("undefined"!=typeof window)return(0,n.removeFromLocalStorage)(d),(0,n.removeFromLocalStorage)(u),void(0,n.removeFromLocalStorage)(p)},E=()=>"undefined"!=typeof window?window.OAUTH2_CLIENT_ID:null,y=()=>"undefined"!=typeof window&&window.OAUTH2_FLOW||"token id_token",g=()=>"undefined"==typeof window||new Boolean(window.OAUTH2_USE_REFRESH_TOKEN||!0),b=()=>"undefined"!=typeof window?window.IDP_BASE_URL:null},4054:(e,t,a)=>{a.d(t,{escapeFilterValue:()=>d,fetchErrorHandler:()=>c,fetchResponseHandler:()=>i});a(3838),a(2691),a(6530);var n=a(271),r=a.n(n),o=a(4656),s=a.n(o);a(6793),a(4341),a(8576);const l=e=>t=>({type:e,payload:t}),c=(l("RESET_LOADING"),l("START_LOADING"),l("STOP_LOADING"),e=>{let t=e.status,a=e.statusText;switch(t){case 403:r().fire("ERROR",s().translate("errors.user_not_authz"),"warning");break;case 401:r().fire("ERROR",s().translate("errors.session_expired"),"error");break;case 412:r().fire("ERROR",a,"warning");case 500:r().fire("ERROR",s().translate("errors.server_error"),"error")}}),i=e=>{if(e.ok)return e.json();throw e},d=e=>e=(e=e.replace(/,/g,"\\,")).replace(/;/g,"\\;")},6793:(e,t,a)=>{a.d(t,{buildAPIBaseUrl:()=>r,getCurrentPathName:()=>n,getFromLocalStorage:()=>s,putOnLocalStorage:()=>o,removeFromLocalStorage:()=>l,retryPromise:()=>i,setSessionClearingState:()=>c});a(8362),a(6530);const n=()=>"undefined"!=typeof window?window.location.pathname:null,r=e=>"undefined"!=typeof window?`${window.API_BASE_URL}${e}`:null``,o=(e,t)=>{"undefined"!=typeof window&&window.localStorage.setItem(e,t)},s=(e,t)=>{if("undefined"!=typeof window){let a=window.localStorage.getItem(e);return t&&(console.log(`getFromLocalStorage removing key ${e}`),l(e)),a}return null},l=e=>{"undefined"!=typeof window&&window.localStorage.removeItem(e)},c=e=>{"undefined"!=typeof window&&(window.clearing_session_state=e)},i=async(e,t=3)=>{for(let a=0;a<t;a++)if(await e())return!0;return!1}},7525:(e,t,a)=>{a.d(t,{queryRegistrationCompanies:()=>u});var n=a(4054),r=a(8576),o=a(6793);const s=require("lodash");var l=a.n(s),c=a(6530),i=a.n(c);const d=500,u=(l().debounce((async(e,t)=>{const a=await(0,r.getAccessToken)();e=(0,n.escapeFilterValue)(e);let s=encodeURIComponent(`full_name=@${e},first_name=@${e},last_name=@${e},email=@${e}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/members?filter=${s}&expand=tickets,rsvp,schedule_summit_events,all_affiliations&access_token=${a}`)).then(n.fetchResponseHandler).then((e=>{let a=[...e.data];t(a)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t)=>{const a=await(0,r.getAccessToken)();e=(0,n.escapeFilterValue)(e);let s=encodeURIComponent(`name=@${e}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/all?filter=${s}&access_token=${a}`)).then(n.fetchResponseHandler).then((e=>{let a=[...e.data];t(a)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t,a)=>{const s=await(0,r.getAccessToken)();t=(0,n.escapeFilterValue)(t);let l="/api/v1";e&&(l+=`/summits/${e}`),l+=`/speakers?filter=${encodeURIComponent(`full_name=@${t},first_name=@${t},last_name=@${t},email=@${t}`)}&access_token=${s}&expand=member,registration_request`,fetch((0,o.buildAPIBaseUrl)(l)).then(n.fetchResponseHandler).then((e=>{let t=[...e.data];a(t)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t,a)=>{const s=await(0,r.getAccessToken)();t=(0,n.escapeFilterValue)(t);let l="/api/v1",c=encodeURIComponent(`tag=@${t}`);l+=e?`/summits/${e}/track-tag-groups/all/allowed-tags?filter=${c}&expand=tag,track_tag_group`:`/tags?filter=${c}`,l+=`&order=tag&page=1&per_page=50&access_token=${s}`,fetch((0,o.buildAPIBaseUrl)(l)).then(n.fetchResponseHandler).then((t=>{let n=[...t.data];e&&(n=n.map((e=>e.tag))),a(n)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t,a)=>{const s=await(0,r.getAccessToken)();t=(0,n.escapeFilterValue)(t);let l=encodeURIComponent(`name=@${t}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/${e}/tracks?filter=${l}&order=name&access_token=${s}`)).then(n.fetchResponseHandler).then((e=>{let t=[...e.data];a(t)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t,a)=>{const s=await(0,r.getAccessToken)();let l=(t=(0,n.escapeFilterValue)(t))?encodeURIComponent(`filter=name=@${t}`):"";fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/${e}/track-groups?order=name&access_token=${s}&${l}`)).then(n.fetchResponseHandler).then((e=>{let t=[...e.data];a(t)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t,a=!1,s)=>{const l=await(0,r.getAccessToken)();t=(0,n.escapeFilterValue)(t);let c=`/api/v1/summits/${e}/events`+(a?"/published":""),i=encodeURIComponent(`title=@${t}`);fetch((0,o.buildAPIBaseUrl)(`${c}?filter=${i}&order=title&access_token=${l}`)).then(n.fetchResponseHandler).then((e=>{let t=[...e.data];s(t)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t,a,s=null)=>{let l=`/api/v1/summits/${e}/event-types?order=name&access_token=${await(0,r.getAccessToken)()}`;if(t=(0,n.escapeFilterValue)(t)){l+=`&filter[]=${encodeURIComponent(`name=@${t}`)}`}if(s){l+=`&filter[]=${encodeURIComponent(`class_name==${s}`)}`}fetch((0,o.buildAPIBaseUrl)(l)).then(n.fetchResponseHandler).then((e=>{let t=[...e.data];a(t)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t)=>{const a=await(0,r.getAccessToken)();let s=encodeURIComponent(`title=@${e},code=@${e}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/groups?filter=${s}&access_token=${a}`)).then(n.fetchResponseHandler).then((e=>{let a=[...e.data];t(a)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t)=>{const a=await(0,r.getAccessToken)();e=(0,n.escapeFilterValue)(e);let s=encodeURIComponent(`name=@${e}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/companies?filter=${s}&access_token=${a}`)).then(n.fetchResponseHandler).then((e=>{let a=[...e.data];t(a)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t,a)=>{let s;try{s=await(0,r.getAccessToken)()}catch(e){return void a(e)}let l=i()(`/api/v1/summits/${e}/registration-companies`);l.addQuery("access_token",s),l.addQuery("order","name"),t&&(t=(0,n.escapeFilterValue)(t),l.addQuery("filter[]",`name@@${t}`)),fetch((0,o.buildAPIBaseUrl)(l.toString())).then(n.fetchResponseHandler).then((e=>{let t=[...e.data];a(t)})).catch(n.fetchErrorHandler)}),d));l().debounce((async(e,t,a)=>{const s=await(0,r.getAccessToken)();t=(0,n.escapeFilterValue)(t);let l=encodeURIComponent(`company_name=@${t}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/${e}/sponsors?filter=${l}&expand=company,sponsorship&access_token=${s}`)).then(n.fetchResponseHandler).then((e=>{let t=[...e.data];a(t)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t,a)=>{const s=await(0,r.getAccessToken)();t=(0,n.escapeFilterValue)(t);let l=encodeURIComponent(`name=@${t}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/${e}/access-level-types?filter=${l}&&access_token=${s}`)).then(n.fetchResponseHandler).then((e=>{let t=[...e.data];a(t)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t)=>{const a=await(0,r.getAccessToken)();e=(0,n.escapeFilterValue)(e);let s=encodeURIComponent(`name=@${e}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/organizations?filter=${s}&access_token=${a}`)).then(n.fetchResponseHandler).then((e=>{let a=[...e.data];t(a)})).catch(n.fetchErrorHandler)}),d);l().debounce((async(e,t={},a,s="v1")=>{const l=await(0,r.getAccessToken)();let c=i()(`/api/${s}/summits/${e}/ticket-types`);if(c.addQuery("access_token",l),c.addQuery("order","name"),t.hasOwnProperty("name")){const e=(0,n.escapeFilterValue)(t.name);c.addQuery("filter[]",`name@@${e}`)}if(t.hasOwnProperty("audience")){const e=(0,n.escapeFilterValue)(t.audience);c.addQuery("filter[]",`audience==${e}`)}fetch((0,o.buildAPIBaseUrl)(c.toString())).then(n.fetchResponseHandler).then((e=>{let t=[...e.data];a(t)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t)=>{const a=await(0,r.getAccessToken)(),s=i()("/api/v1/sponsored-projects");s.addQuery("access_token",a),e&&(e=(0,n.escapeFilterValue)(e),s.addQuery("filter[]",`name=@${e}`)),fetch((0,o.buildAPIBaseUrl)(s.toString())).then(n.fetchResponseHandler).then((e=>{let a=[...e.data];t(a)})).catch(n.fetchErrorHandler)}),d),l().debounce((async(e,t,a)=>{const s=await(0,r.getAccessToken)();t=(0,n.escapeFilterValue)(t);let l=encodeURIComponent(`code=@${t}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/${e}/promo-codes?filter=${l}&access_token=${s}`)).then(n.fetchResponseHandler).then((e=>{let t=[...e.data];a(t)})).catch(n.fetchErrorHandler)}),d)},8779:e=>{e.exports=require("@babel/runtime/helpers/defineProperty")},8213:e=>{e.exports=require("@babel/runtime/helpers/extends")},3838:e=>{e.exports=require("@babel/runtime/helpers/objectWithoutProperties")},4656:e=>{e.exports=require("i18n-react/dist/i18n-react")},3856:e=>{e.exports=require("idtoken-verifier")},8362:e=>{e.exports=require("moment-timezone")},580:e=>{e.exports=require("prop-types")},6689:e=>{e.exports=require("react")},9953:e=>{e.exports=require("react-select/lib/Async")},2691:e=>{e.exports=require("superagent/lib/client")},271:e=>{e.exports=require("sweetalert2")},6530:e=>{e.exports=require("urijs")}},t={};function a(n){var r=t[n];if(void 0!==r)return r.exports;var o=t[n]={exports:{}};return e[n](o,o.exports,a),o.exports}(()=>{a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t}})(),(()=>{a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}})(),(()=>{a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}})();var n={};return(()=>{a.r(n),a.d(n,{default:()=>m});var e=a(8213),t=a.n(e),r=a(3838),o=a.n(r),s=a(6689),l=a.n(s),c=a(580),i=a.n(c),d=a(9953),u=a.n(d),p=a(7525);const f=["error","value","onChange","id","multi","isMulti","disabled","className","summitId","onError","inputPlaceholder","DDLPlaceholder","tabSelectsValue","selectStyles"],h=e=>{let{error:a,value:n,onChange:r,id:c,multi:i,isMulti:d,disabled:h,className:m,summitId:R,onError:_,inputPlaceholder:E,DDLPlaceholder:y,tabSelectsValue:g,selectStyles:b}=e,w=o()(e,f);const[v,k]=(0,s.useState)({value:null,label:""}),[S,T]=(0,s.useState)(!1),[$,A]=(0,s.useState)(""),[I,O]=(0,s.useState)(i||d),[U,H]=(0,s.useState)(h),[P,C]=(0,s.useState)(a),[F,x]=(0,s.useState)(!1);(0,s.useEffect)((()=>{C(a)}),[a]),(0,s.useEffect)((()=>{!n.id&&n.name?(T(!0),A(n.name),k({value:null,label:n.name})):d&&n.length>0?k(n.map((e=>({value:e.id,label:e.name})))):!d&&n.id&&k({value:n.id,label:n.name})}),[n]);return l().createElement("div",{style:{position:"relative"}},S?l().createElement(l().Fragment,null,l().createElement("input",t()({value:$,placeholder:E,onChange:e=>{A(e.target.value);let t={target:{id:c,value:{id:null,name:e.target.value},type:"companyinput"}};r(t)},className:"form-control",style:{paddingRight:25},disabled:U},w)),U||!F&&l().createElement("i",{"aria-label":"Clear",style:{position:"absolute",top:10,right:10,cursor:"pointer",opacity:"65%"},onClick:()=>{T(!S),A(""),k({value:null,label:""}),r({target:{id:c,value:{id:null,name:""},type:"companyinput"}})},className:"fa fa-close"})):l().createElement(u(),t()({value:v.label&&v.value?v:null,inputId:c,tabSelectsValue:g,placeholder:y,onChange:e=>{if(null===e.value){T(!0);const t=I?e.map((e=>({value:e.value,label:""}))):{value:e.value,label:""};return k(t),void r({target:{id:c,value:t,type:"companyinput"}})}const t=I?e.map((e=>({id:e.value,name:e.label}))):{id:e.value,name:e.label},a=I?e.map((e=>({value:e.value,label:e.label}))):{value:e.value,label:e.label};k(a),r({target:{id:c,value:t,type:"companyinput"}})},defaultOptions:!0,loadOptions:(e,t)=>{(0,p.queryRegistrationCompanies)(R,e,(a=>{if(!e){if(0===a.length)x(!0),T(!0);else{t([{value:null,label:"Other"}])}return}a instanceof Error&&_(a),0===a.length&&t([]);let n=[...a.map((e=>({value:e.id.toString(),label:e.name}))),{value:null,label:"Other"}];t(n)}))},isMulti:I,className:m,styles:b},w)),P&&l().createElement("p",{className:"error-label"},a))},m=h;h.defaultProps={inputPlaceholder:"Enter your company",DDLPlaceholder:"Select a company",disabled:!1,tabSelectsValue:!1},h.propTypes={onError:i().func.isRequired}})(),n})()));
1
+ (function webpackUniversalModuleDefinition(root, factory) {
2
+ if(typeof exports === 'object' && typeof module === 'object')
3
+ module.exports = factory();
4
+ else if(typeof define === 'function' && define.amd)
5
+ define("openstack-uicore-foundation", [], factory);
6
+ else if(typeof exports === 'object')
7
+ exports["openstack-uicore-foundation"] = factory();
8
+ else
9
+ root["openstack-uicore-foundation"] = factory();
10
+ })(this, () => {
11
+ return /******/ (() => { // webpackBootstrap
12
+ /******/ "use strict";
13
+ /******/ var __webpack_modules__ = ({
14
+
15
+ /***/ "./src/components/security/actions.js":
16
+ /*!********************************************!*\
17
+ !*** ./src/components/security/actions.js ***!
18
+ \********************************************/
19
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
20
+
21
+ __webpack_require__.r(__webpack_exports__);
22
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23
+ /* harmony export */ "CLEAR_SESSION_STATE": () => (/* binding */ CLEAR_SESSION_STATE),
24
+ /* harmony export */ "LOGOUT_USER": () => (/* binding */ LOGOUT_USER),
25
+ /* harmony export */ "RECEIVE_USER_INFO": () => (/* binding */ RECEIVE_USER_INFO),
26
+ /* harmony export */ "REQUEST_USER_INFO": () => (/* binding */ REQUEST_USER_INFO),
27
+ /* harmony export */ "SESSION_STATE_STATUS_CHANGED": () => (/* binding */ SESSION_STATE_STATUS_CHANGED),
28
+ /* harmony export */ "SESSION_STATE_STATUS_ERROR": () => (/* binding */ SESSION_STATE_STATUS_ERROR),
29
+ /* harmony export */ "SESSION_STATE_STATUS_UNCHANGED": () => (/* binding */ SESSION_STATE_STATUS_UNCHANGED),
30
+ /* harmony export */ "SET_LOGGED_USER": () => (/* binding */ SET_LOGGED_USER),
31
+ /* harmony export */ "UPDATE_SESSION_STATE_STATUS": () => (/* binding */ UPDATE_SESSION_STATE_STATUS),
32
+ /* harmony export */ "UPDATE_USER_INFO": () => (/* binding */ UPDATE_USER_INFO),
33
+ /* harmony export */ "doLogout": () => (/* binding */ doLogout),
34
+ /* harmony export */ "getUserInfo": () => (/* binding */ getUserInfo),
35
+ /* harmony export */ "onUserAuth": () => (/* binding */ onUserAuth),
36
+ /* harmony export */ "updateSessionStateStatus": () => (/* binding */ updateSessionStateStatus),
37
+ /* harmony export */ "updateUserInfo": () => (/* binding */ updateUserInfo)
38
+ /* harmony export */ });
39
+ /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
40
+ /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
41
+ /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! i18n-react/dist/i18n-react */ "i18n-react/dist/i18n-react");
42
+ /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1__);
43
+ /* harmony import */ var _utils_actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/actions */ "./src/utils/actions.js");
44
+ /* harmony import */ var _utils_methods__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/methods */ "./src/utils/methods.js");
45
+ /* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./methods */ "./src/components/security/methods.js");
46
+
47
+
48
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
49
+
50
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
51
+
52
+ /**
53
+ * Copyright 2018 OpenStack Foundation
54
+ * Licensed under the Apache License, Version 2.0 (the "License");
55
+ * you may not use this file except in compliance with the License.
56
+ * You may obtain a copy of the License at
57
+ * http://www.apache.org/licenses/LICENSE-2.0
58
+ * Unless required by applicable law or agreed to in writing, software
59
+ * distributed under the License is distributed on an "AS IS" BASIS,
60
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
61
+ * See the License for the specific language governing permissions and
62
+ * limitations under the License.
63
+ **/
64
+
65
+
66
+
67
+
68
+ /**
69
+ * @ignore
70
+ */
71
+
72
+ const SET_LOGGED_USER = 'SET_LOGGED_USER';
73
+ const LOGOUT_USER = 'LOGOUT_USER';
74
+ const REQUEST_USER_INFO = 'REQUEST_USER_INFO';
75
+ const RECEIVE_USER_INFO = 'RECEIVE_USER_INFO';
76
+ const CLEAR_SESSION_STATE = 'CLEAR_SESSION_STATE';
77
+ const UPDATE_SESSION_STATE_STATUS = 'UPDATE_SESSION_STATE_STATUS';
78
+ const SESSION_STATE_STATUS_UNCHANGED = 'unchanged';
79
+ const SESSION_STATE_STATUS_CHANGED = 'changed';
80
+ const SESSION_STATE_STATUS_ERROR = 'error';
81
+ const UPDATE_USER_INFO = 'UPDATE_USER_INFO';
82
+ const onUserAuth = (accessToken, idToken, sessionState, expiresIn = 0, refreshToken = null) => dispatch => {
83
+ (0,_methods__WEBPACK_IMPORTED_MODULE_4__.storeAuthInfo)(accessToken, expiresIn, refreshToken, idToken);
84
+ dispatch({
85
+ type: SET_LOGGED_USER,
86
+ payload: {
87
+ sessionState
88
+ }
89
+ });
90
+ };
91
+ const doLogout = backUrl => (dispatch, getState) => {
92
+ dispatch({
93
+ type: LOGOUT_USER,
94
+ payload: {
95
+ backUrl: backUrl
96
+ }
97
+ });
98
+ };
99
+ const getUserInfo = (expand = 'groups', fields = '', backUrl = null, history = null, errorHandler = null) => async (dispatch, getState) => {
100
+ let AllowedUserGroups = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_3__.getAllowedUserGroups)();
101
+ AllowedUserGroups = AllowedUserGroups !== '' ? AllowedUserGroups.split(' ') : [];
102
+ let {
103
+ loggedUserState
104
+ } = getState();
105
+ let {
106
+ member
107
+ } = loggedUserState;
108
+ let accessToken = await (0,_methods__WEBPACK_IMPORTED_MODULE_4__.getAccessToken)();
109
+
110
+ if (member != null) {
111
+ if (history != null && backUrl != null) history.push(backUrl);
112
+ return Promise.resolve();
113
+ }
114
+
115
+ if (errorHandler == null) errorHandler = _utils_actions__WEBPACK_IMPORTED_MODULE_2__.authErrorHandler;
116
+ dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.startLoading)());
117
+ let params = {
118
+ access_token: accessToken,
119
+ expand: expand
120
+ };
121
+
122
+ if (fields) {
123
+ params['fields'] = fields;
124
+ }
125
+
126
+ return (0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.getRequest)((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.createAction)(REQUEST_USER_INFO), (0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.createAction)(RECEIVE_USER_INFO), (0,_utils_methods__WEBPACK_IMPORTED_MODULE_3__.buildAPIBaseUrl)(`/api/v1/members/me`), errorHandler)(params)(dispatch, getState).then(() => {
127
+ dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.stopLoading)());
128
+ let {
129
+ member
130
+ } = getState().loggedUserState;
131
+
132
+ if (member == null) {
133
+ let error_message = {
134
+ title: 'ERROR',
135
+ html: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1___default().translate("errors.user_not_set"),
136
+ type: 'error'
137
+ };
138
+ dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.showMessage)(error_message, _methods__WEBPACK_IMPORTED_MODULE_4__.initLogOut));
139
+ } // check user groups ( if defined )
140
+
141
+
142
+ if (AllowedUserGroups.length > 0) {
143
+ let allowedGroups = member.groups.filter((group, idx) => {
144
+ return AllowedUserGroups.includes(group.code);
145
+ });
146
+
147
+ if (allowedGroups.length === 0) {
148
+ let error_message = {
149
+ title: 'ERROR',
150
+ html: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1___default().translate("errors.user_not_authz"),
151
+ type: 'error'
152
+ };
153
+ dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.showMessage)(error_message, _methods__WEBPACK_IMPORTED_MODULE_4__.initLogOut));
154
+ return;
155
+ }
156
+ }
157
+
158
+ if (history != null && backUrl != null) history.push(backUrl);
159
+ });
160
+ };
161
+ const updateUserInfo = updatedMember => (dispatch, getState) => {
162
+ let {
163
+ loggedUserState
164
+ } = getState();
165
+ let {
166
+ member
167
+ } = loggedUserState;
168
+
169
+ if (member == null) {
170
+ throw Error("Member is not set.");
171
+ }
172
+
173
+ if (updatedMember.id != member.id) {
174
+ throw Error("Member is not the same.");
175
+ }
176
+
177
+ dispatch({
178
+ type: UPDATE_USER_INFO,
179
+ payload: _objectSpread({}, updatedMember)
180
+ });
181
+ };
182
+ const updateSessionStateStatus = newStatus => (dispatch, getState) => {
183
+ dispatch({
184
+ type: UPDATE_SESSION_STATE_STATUS,
185
+ payload: {
186
+ sessionStateStatus: newStatus
187
+ }
188
+ });
189
+ };
190
+
191
+ /***/ }),
192
+
193
+ /***/ "./src/components/security/constants.js":
194
+ /*!**********************************************!*\
195
+ !*** ./src/components/security/constants.js ***!
196
+ \**********************************************/
197
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
198
+
199
+ __webpack_require__.r(__webpack_exports__);
200
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
201
+ /* harmony export */ "AUTH_ERROR_ACCESS_TOKEN_EXPIRED": () => (/* binding */ AUTH_ERROR_ACCESS_TOKEN_EXPIRED),
202
+ /* harmony export */ "AUTH_ERROR_ID_TOKEN_INVALID": () => (/* binding */ AUTH_ERROR_ID_TOKEN_INVALID),
203
+ /* harmony export */ "AUTH_ERROR_LOCK_ACQUIRE_ERROR": () => (/* binding */ AUTH_ERROR_LOCK_ACQUIRE_ERROR),
204
+ /* harmony export */ "AUTH_ERROR_MISSING_AUTH_INFO": () => (/* binding */ AUTH_ERROR_MISSING_AUTH_INFO),
205
+ /* harmony export */ "AUTH_ERROR_MISSING_OTP_PARAM": () => (/* binding */ AUTH_ERROR_MISSING_OTP_PARAM),
206
+ /* harmony export */ "AUTH_ERROR_MISSING_REFRESH_TOKEN": () => (/* binding */ AUTH_ERROR_MISSING_REFRESH_TOKEN),
207
+ /* harmony export */ "AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR": () => (/* binding */ AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR)
208
+ /* harmony export */ });
209
+ const AUTH_ERROR_MISSING_AUTH_INFO = 'AUTH_ERROR_MISSING_AUTH_INFO';
210
+ const AUTH_ERROR_MISSING_REFRESH_TOKEN = 'AUTH_ERROR_MISSING_REFRESH_TOKEN';
211
+ const AUTH_ERROR_ACCESS_TOKEN_EXPIRED = 'AUTH_ERROR_ACCESS_TOKEN_EXPIRED';
212
+ const AUTH_ERROR_LOCK_ACQUIRE_ERROR = 'AUTH_ERROR_LOCK_ACQUIRE_ERROR';
213
+ const AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR = 'AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR';
214
+ const AUTH_ERROR_ID_TOKEN_INVALID = 'AUTH_ERROR_ID_TOKEN_INVALID';
215
+ const AUTH_ERROR_MISSING_OTP_PARAM = 'AUTH_ERROR_MISSING_OTP_PARAM';
216
+
217
+ /***/ }),
218
+
219
+ /***/ "./src/components/security/methods.js":
220
+ /*!********************************************!*\
221
+ !*** ./src/components/security/methods.js ***!
222
+ \********************************************/
223
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
224
+
225
+ __webpack_require__.r(__webpack_exports__);
226
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
227
+ /* harmony export */ "ACCESS_TOKEN_SKEW_TIME": () => (/* binding */ ACCESS_TOKEN_SKEW_TIME),
228
+ /* harmony export */ "RESPONSE_TYPE_CODE": () => (/* binding */ RESPONSE_TYPE_CODE),
229
+ /* harmony export */ "RESPONSE_TYPE_IMPLICIT": () => (/* binding */ RESPONSE_TYPE_IMPLICIT),
230
+ /* harmony export */ "clearAccessToken": () => (/* binding */ clearAccessToken),
231
+ /* harmony export */ "clearAuthInfo": () => (/* binding */ clearAuthInfo),
232
+ /* harmony export */ "doLogin": () => (/* binding */ doLogin),
233
+ /* harmony export */ "doLoginBasicLogin": () => (/* binding */ doLoginBasicLogin),
234
+ /* harmony export */ "emitAccessToken": () => (/* binding */ emitAccessToken),
235
+ /* harmony export */ "getAccessToken": () => (/* binding */ getAccessToken),
236
+ /* harmony export */ "getAuthInfo": () => (/* binding */ getAuthInfo),
237
+ /* harmony export */ "getAuthUrl": () => (/* binding */ getAuthUrl),
238
+ /* harmony export */ "getIdToken": () => (/* binding */ getIdToken),
239
+ /* harmony export */ "getLogoutUrl": () => (/* binding */ getLogoutUrl),
240
+ /* harmony export */ "getOAuth2ClientId": () => (/* binding */ getOAuth2ClientId),
241
+ /* harmony export */ "getOAuth2Flow": () => (/* binding */ getOAuth2Flow),
242
+ /* harmony export */ "getOAuth2IDPBaseUrl": () => (/* binding */ getOAuth2IDPBaseUrl),
243
+ /* harmony export */ "getOAuth2Scopes": () => (/* binding */ getOAuth2Scopes),
244
+ /* harmony export */ "initLogOut": () => (/* binding */ initLogOut),
245
+ /* harmony export */ "isIdTokenAlive": () => (/* binding */ isIdTokenAlive),
246
+ /* harmony export */ "passwordlessLogin": () => (/* binding */ passwordlessLogin),
247
+ /* harmony export */ "passwordlessStart": () => (/* binding */ passwordlessStart),
248
+ /* harmony export */ "refreshAccessToken": () => (/* binding */ refreshAccessToken),
249
+ /* harmony export */ "storeAuthInfo": () => (/* binding */ storeAuthInfo),
250
+ /* harmony export */ "useOAuth2RefreshToken": () => (/* binding */ useOAuth2RefreshToken),
251
+ /* harmony export */ "validateIdToken": () => (/* binding */ validateIdToken)
252
+ /* harmony export */ });
253
+ /* harmony import */ var _utils_methods__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/methods */ "./src/utils/methods.js");
254
+ /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! superagent/lib/client */ "superagent/lib/client");
255
+ /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__);
256
+ /* harmony import */ var browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! browser-tabs-lock */ "browser-tabs-lock");
257
+ /* harmony import */ var browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2__);
258
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! urijs */ "urijs");
259
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_3__);
260
+ /* harmony import */ var idtoken_verifier__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! idtoken-verifier */ "idtoken-verifier");
261
+ /* harmony import */ var idtoken_verifier__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(idtoken_verifier__WEBPACK_IMPORTED_MODULE_4__);
262
+ /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actions */ "./src/components/security/actions.js");
263
+ /* harmony import */ var _utils_crypto__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../utils/crypto */ "./src/utils/crypto.js");
264
+ /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants */ "./src/components/security/constants.js");
265
+
266
+
267
+
268
+ let http = (superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default());
269
+ /**
270
+ * @ignore
271
+ */
272
+
273
+ const lock = new (browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2___default())();
274
+ const GET_TOKEN_SILENTLY_LOCK_KEY = 'openstackuicore.lock.getTokenSilently';
275
+ const NONCE_LEN = 16;
276
+ const ACCESS_TOKEN_SKEW_TIME = 20;
277
+ const RESPONSE_TYPE_IMPLICIT = "token id_token";
278
+ const RESPONSE_TYPE_CODE = 'code';
279
+ const AUTH_INFO = 'authInfo';
280
+ const NONCE = 'nonce';
281
+ const PKCE = 'pkce';
282
+
283
+
284
+
285
+
286
+
287
+ /**
288
+ *
289
+ * @param backUrl
290
+ * @param prompt
291
+ * @param tokenIdHint
292
+ * @param provider
293
+ * @param loginHint
294
+ * @param otpLoginHint
295
+ * @returns {*}
296
+ */
297
+
298
+ const getAuthUrl = (backUrl = null, prompt = null, tokenIdHint = null, provider = null, loginHint = null, otpLoginHint = null) => {
299
+ let oauth2ClientId = getOAuth2ClientId();
300
+ let redirectUri = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getAuthCallback)();
301
+ let baseUrl = getOAuth2IDPBaseUrl();
302
+ let scopes = getOAuth2Scopes();
303
+ let flow = getOAuth2Flow();
304
+ if (backUrl != null) redirectUri += `?BackUrl=${encodeURI(backUrl)}`;
305
+ let nonce = createNonce(NONCE_LEN); // store nonce to check it later
306
+
307
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(NONCE, nonce);
308
+ let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/auth`);
309
+ let query = {
310
+ "response_type": encodeURI(flow),
311
+ "scope": encodeURI(scopes),
312
+ "nonce": nonce,
313
+ "response_mode": 'fragment',
314
+ "client_id": encodeURI(oauth2ClientId),
315
+ "redirect_uri": encodeURI(redirectUri)
316
+ };
317
+
318
+ if (flow === RESPONSE_TYPE_CODE) {
319
+ const pkce = createPKCECodes();
320
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(PKCE, JSON.stringify(pkce));
321
+ query['code_challenge'] = pkce.codeChallenge;
322
+ query['code_challenge_method'] = 'S256';
323
+ query['approval_prompt'] = 'force';
324
+ }
325
+
326
+ if (prompt) {
327
+ query['prompt'] = prompt;
328
+ }
329
+
330
+ if (scopes && scopes.includes('offline_access')) {
331
+ // then we need to force prompt=consent bc we are requesting an offline access
332
+ // and we need to let the user know
333
+ query['prompt'] = 'consent';
334
+ }
335
+
336
+ if (tokenIdHint) {
337
+ query['id_token_hint'] = tokenIdHint;
338
+ }
339
+
340
+ if (provider) {
341
+ query['provider'] = provider;
342
+ }
343
+
344
+ if (otpLoginHint) {
345
+ query['otp_login_hint'] = otpLoginHint;
346
+ }
347
+
348
+ if (loginHint) {
349
+ query['login_hint'] = encodeURI(loginHint);
350
+ }
351
+
352
+ url = url.query(query); //console.log(`getAuthUrl ${url.toString()}`);
353
+
354
+ return url;
355
+ };
356
+ const getLogoutUrl = idToken => {
357
+ let baseUrl = getOAuth2IDPBaseUrl();
358
+ let oauth2ClientId = getOAuth2ClientId();
359
+ let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/end-session`);
360
+ let state = createNonce(NONCE_LEN);
361
+ let postLogOutUri = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getOrigin)() + '/auth/logout'; // store nonce to check it later
362
+
363
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)('post_logout_state', state);
364
+ /**
365
+ * post_logout_redirect_uri should be listed on oauth2 client settings
366
+ * on IDP
367
+ * "Security Settings" Tab -> Logout Options -> Post Logout Uris
368
+ */
369
+
370
+ return url.query({
371
+ "id_token_hint": idToken,
372
+ "post_logout_redirect_uri": encodeURI(postLogOutUri),
373
+ "client_id": encodeURI(oauth2ClientId),
374
+ "state": state
375
+ });
376
+ };
377
+
378
+ const createNonce = len => {
379
+ let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
380
+ let nonce = '';
381
+
382
+ for (let i = 0; i < len; i++) {
383
+ nonce += possible.charAt(Math.floor(Math.random() * possible.length));
384
+ }
385
+
386
+ return nonce;
387
+ };
388
+ /**
389
+ *
390
+ * @param backUrl
391
+ * @param provider
392
+ * @param prompt
393
+ * @param loginHint
394
+ * @param otpLoginHint
395
+ */
396
+
397
+
398
+ const doLogin = (backUrl = null, provider = null, prompt = null, loginHint = null, otpLoginHint = null) => {
399
+ let url = getAuthUrl(backUrl, prompt, null, provider, loginHint, otpLoginHint);
400
+ let location = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getCurrentLocation)();
401
+ location.replace(url.toString());
402
+ };
403
+ /**
404
+ *
405
+ * @param backUrl
406
+ * @param loginHint
407
+ * @param otpLoginHint
408
+ */
409
+
410
+ const doLoginBasicLogin = (backUrl = null, loginHint = null, otpLoginHint = null) => {
411
+ doLogin(backUrl, null, null, loginHint, otpLoginHint);
412
+ };
413
+
414
+ const createPKCECodes = () => {
415
+ const codeVerifier = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.base64URLEncode)((0,_utils_crypto__WEBPACK_IMPORTED_MODULE_6__.getRandomBytes)(64));
416
+ const codeChallenge = (0,_utils_crypto__WEBPACK_IMPORTED_MODULE_6__.getSHA256)(codeVerifier, 'Base64url');
417
+ const createdAt = new Date();
418
+ const codePair = {
419
+ codeVerifier,
420
+ codeChallenge,
421
+ createdAt
422
+ };
423
+ return codePair;
424
+ };
425
+
426
+ const emitAccessToken = async (code, backUrl = null) => {
427
+ let baseUrl = getOAuth2IDPBaseUrl();
428
+ let oauth2ClientId = getOAuth2ClientId();
429
+ let redirectUri = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getAuthCallback)();
430
+ let pkce = JSON.parse((0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getFromLocalStorage)(PKCE, true));
431
+ if (backUrl != null) redirectUri += `?BackUrl=${encodeURI(backUrl)}`;
432
+ const payload = {
433
+ 'code': code,
434
+ 'grant_type': 'authorization_code',
435
+ 'code_verifier': pkce.codeVerifier,
436
+ "client_id": encodeURI(oauth2ClientId),
437
+ "redirect_uri": encodeURI(redirectUri)
438
+ };
439
+
440
+ try {
441
+ //const response = await http.post(`${baseUrl}/oauth2/token`, payload);
442
+ //const {body: {access_token, refresh_token, id_token, expires_in}} = response;
443
+ const response = await fetch(`${baseUrl}/oauth2/token`, {
444
+ method: 'POST',
445
+ headers: {
446
+ 'Accept': 'application/json',
447
+ 'Content-Type': 'application/json'
448
+ },
449
+ body: JSON.stringify(payload)
450
+ }).catch(function (error) {
451
+ console.log('Request failed:', error.message);
452
+ });
453
+ const json = await response.json();
454
+ let {
455
+ access_token,
456
+ refresh_token,
457
+ id_token,
458
+ expires_in,
459
+ error,
460
+ error_description
461
+ } = json;
462
+ return {
463
+ access_token,
464
+ refresh_token,
465
+ id_token,
466
+ expires_in,
467
+ error,
468
+ error_description
469
+ };
470
+ } catch (err) {
471
+ console.log(err);
472
+ }
473
+ };
474
+ const clearAccessToken = async () => {
475
+ if (await (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.retryPromise)(() => lock.acquireLock(GET_TOKEN_SILENTLY_LOCK_KEY, 5000), 10)) {
476
+ try {
477
+ let authInfo = getAuthInfo();
478
+
479
+ if (!authInfo) {
480
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_AUTH_INFO);
481
+ }
482
+
483
+ let {
484
+ accessToken,
485
+ expiresIn,
486
+ accessTokenUpdatedAt,
487
+ refreshToken
488
+ } = authInfo;
489
+ storeAuthInfo(null, 0, refreshToken);
490
+ } finally {
491
+ await lock.releaseLock(GET_TOKEN_SILENTLY_LOCK_KEY);
492
+ }
493
+ }
494
+ };
495
+ const getAccessToken = async () => {
496
+ if (await (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.retryPromise)(() => lock.acquireLock(GET_TOKEN_SILENTLY_LOCK_KEY, 5000), 10)) {
497
+ try {
498
+ let authInfo = getAuthInfo();
499
+
500
+ if (!authInfo) {
501
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_AUTH_INFO);
502
+ }
503
+
504
+ let {
505
+ accessToken,
506
+ expiresIn,
507
+ accessTokenUpdatedAt,
508
+ refreshToken
509
+ } = authInfo;
510
+ let flow = getOAuth2Flow(); // check life time
511
+
512
+ let now = Math.floor(Date.now() / 1000);
513
+ let timeElapsedSecs = now - accessTokenUpdatedAt;
514
+ expiresIn = expiresIn - ACCESS_TOKEN_SKEW_TIME; //console.log(`getAccessToken now ${now} accessTokenUpdatedAt ${accessTokenUpdatedAt} timeElapsedSecs ${timeElapsedSecs} expiresIn ${expiresIn}.`);
515
+
516
+ if (timeElapsedSecs > expiresIn || accessToken == null) {
517
+ console.log(`getAccessToken access token expired`);
518
+
519
+ if (flow === RESPONSE_TYPE_CODE && useOAuth2RefreshToken()) {
520
+ //console.log('getAccessToken getting new access token, access token got void');
521
+ if (!refreshToken) {
522
+ clearAuthInfo();
523
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_REFRESH_TOKEN);
524
+ }
525
+
526
+ let response = await refreshAccessToken(refreshToken);
527
+ let {
528
+ access_token,
529
+ expires_in,
530
+ refresh_token
531
+ } = response; //console.log(`getAccessToken access_token ${access_token} expires_in ${expires_in} refresh_token ${refresh_token}`);
532
+
533
+ if (typeof refresh_token === 'undefined') {
534
+ refresh_token = null; // not using rotate policy
535
+ }
536
+
537
+ storeAuthInfo(access_token, expires_in, refresh_token); //console.log(`getAccessToken access_token ${access_token} [NEW]`);
538
+
539
+ return access_token;
540
+ }
541
+
542
+ clearAuthInfo();
543
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_ACCESS_TOKEN_EXPIRED);
544
+ } //console.log(`getAccessToken access_token ${accessToken} [CACHED]`);
545
+
546
+
547
+ return accessToken;
548
+ } finally {
549
+ await lock.releaseLock(GET_TOKEN_SILENTLY_LOCK_KEY);
550
+ }
551
+ }
552
+
553
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_LOCK_ACQUIRE_ERROR);
554
+ };
555
+ const refreshAccessToken = async refresh_token => {
556
+ let baseUrl = getOAuth2IDPBaseUrl();
557
+ let oauth2ClientId = getOAuth2ClientId();
558
+ const payload = {
559
+ 'grant_type': 'refresh_token',
560
+ "client_id": encodeURI(oauth2ClientId),
561
+ "refresh_token": refresh_token
562
+ };
563
+
564
+ try {
565
+ const response = await fetch(`${baseUrl}/oauth2/token`, {
566
+ method: 'POST',
567
+ headers: {
568
+ 'Accept': 'application/json',
569
+ 'Content-Type': 'application/json'
570
+ },
571
+ body: JSON.stringify(payload)
572
+ }).then(response => {
573
+ if (response.status === 400) {
574
+ let currentLocation = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getCurrentPathName)();
575
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.setSessionClearingState)(true);
576
+ throw Error(`${_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR}: ${response.status} - ${response.statusText}`);
577
+ }
578
+
579
+ return response;
580
+ }).catch(function (error) {
581
+ throw Error(`${_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR}: ${error.message}`);
582
+ });
583
+ const json = await response.json();
584
+ let {
585
+ access_token,
586
+ refresh_token,
587
+ expires_in
588
+ } = json;
589
+ return {
590
+ access_token,
591
+ refresh_token,
592
+ expires_in
593
+ };
594
+ } catch (err) {
595
+ console.log(err);
596
+ throw err;
597
+ }
598
+ };
599
+ const storeAuthInfo = (accessToken, expiresIn, refreshToken = null, idToken = null) => {
600
+ let formerAuthInfo = getAuthInfo();
601
+ let authInfo = {
602
+ accessToken: accessToken,
603
+ expiresIn: expiresIn,
604
+ accessTokenUpdatedAt: Math.floor(Date.now() / 1000)
605
+ };
606
+
607
+ if (refreshToken === null && formerAuthInfo) {
608
+ refreshToken = formerAuthInfo.refreshToken;
609
+ }
610
+
611
+ if (idToken === null && formerAuthInfo) {
612
+ idToken = formerAuthInfo.idToken;
613
+ }
614
+
615
+ if (refreshToken) {
616
+ authInfo['refreshToken'] = refreshToken;
617
+ }
618
+
619
+ if (idToken) {
620
+ authInfo['idToken'] = idToken;
621
+ }
622
+
623
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(AUTH_INFO, JSON.stringify(authInfo));
624
+ };
625
+ const getAuthInfo = () => {
626
+ try {
627
+ let res = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getFromLocalStorage)(AUTH_INFO, false);
628
+ if (!res) return null;
629
+ return JSON.parse(res);
630
+ } catch (err) {
631
+ return null;
632
+ }
633
+ };
634
+ const clearAuthInfo = () => {
635
+ if (typeof window !== 'undefined') {
636
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.removeFromLocalStorage)(AUTH_INFO);
637
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.removeFromLocalStorage)(NONCE);
638
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.removeFromLocalStorage)(PKCE);
639
+ return;
640
+ }
641
+ };
642
+ const getIdToken = () => {
643
+ if (typeof window !== 'undefined') {
644
+ const authInfo = getAuthInfo();
645
+
646
+ if (authInfo) {
647
+ return authInfo.idToken;
648
+ }
649
+
650
+ return null;
651
+ }
652
+
653
+ return null;
654
+ };
655
+ const getOAuth2ClientId = () => {
656
+ if (typeof window !== 'undefined') {
657
+ return window.OAUTH2_CLIENT_ID;
658
+ }
659
+
660
+ return null;
661
+ };
662
+ const getOAuth2Flow = () => {
663
+ if (typeof window !== 'undefined') {
664
+ return window.OAUTH2_FLOW || "token id_token";
665
+ }
666
+
667
+ return "token id_token";
668
+ };
669
+ const useOAuth2RefreshToken = () => {
670
+ if (typeof window !== 'undefined') {
671
+ return new Boolean(window.OAUTH2_USE_REFRESH_TOKEN || true);
672
+ }
673
+
674
+ return true;
675
+ };
676
+ const getOAuth2IDPBaseUrl = () => {
677
+ if (typeof window !== 'undefined') {
678
+ return window.IDP_BASE_URL;
679
+ }
680
+
681
+ return null;
682
+ };
683
+ const getOAuth2Scopes = () => {
684
+ if (typeof window !== 'undefined') {
685
+ return window.SCOPES;
686
+ }
687
+
688
+ return null;
689
+ };
690
+ const initLogOut = () => {
691
+ let location = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getCurrentLocation)();
692
+ location.replace(getLogoutUrl(getIdToken()).toString());
693
+ };
694
+ const validateIdToken = (idToken, issuer, audience) => {
695
+ let verifier = new (idtoken_verifier__WEBPACK_IMPORTED_MODULE_4___default())({
696
+ issuer: issuer,
697
+ audience: audience
698
+ });
699
+ let storedNonce = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getFromLocalStorage)(NONCE, true);
700
+ let jwt = verifier.decode(idToken);
701
+ let alg = jwt.header.alg;
702
+ let kid = jwt.header.kid;
703
+ let aud = jwt.payload.aud;
704
+ let iss = jwt.payload.iss;
705
+ let exp = jwt.payload.exp;
706
+ let nbf = jwt.payload.nbf;
707
+ let tnonce = jwt.payload.nonce || null;
708
+ return tnonce == storedNonce && aud == audience && iss == issuer;
709
+ };
710
+ const passwordlessStart = params => {
711
+ let oauth2ClientId = getOAuth2ClientId();
712
+ let scopes = getOAuth2Scopes();
713
+ let nonce = createNonce(NONCE_LEN); // store nonce to check it later
714
+
715
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(NONCE, nonce);
716
+ let baseUrl = getOAuth2IDPBaseUrl();
717
+ let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/auth`);
718
+ let payload = {
719
+ "response_type": "otp",
720
+ "scope": encodeURI(scopes),
721
+ "nonce": nonce,
722
+ "client_id": encodeURI(oauth2ClientId),
723
+ "connection": params.connection || "email",
724
+ "send": params.send || "code"
725
+ };
726
+
727
+ if (params.hasOwnProperty('email')) {
728
+ payload["email"] = encodeURIComponent(params.email);
729
+ }
730
+
731
+ if (params.hasOwnProperty('phone_number')) {
732
+ payload["phone_number"] = encodeURIComponent(params.phone_number);
733
+ }
734
+
735
+ if (params.hasOwnProperty('redirect_uri')) {
736
+ payload["redirect_uri"] = encodeURIComponent(params.redirect_uri);
737
+ }
738
+
739
+ let req = http.post(url.toString());
740
+ return req.send(payload).then(res => {
741
+ let json = res.body;
742
+ return Promise.resolve({
743
+ response: json
744
+ });
745
+ }).catch(err => {
746
+ return Promise.reject(err);
747
+ });
748
+ };
749
+ const passwordlessLogin = params => dispatch => {
750
+ let oauth2ClientId = getOAuth2ClientId();
751
+ let scopes = getOAuth2Scopes();
752
+ let baseUrl = getOAuth2IDPBaseUrl();
753
+ let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/token`);
754
+
755
+ if (!params.hasOwnProperty("otp")) {
756
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_OTP_PARAM);
757
+ }
758
+
759
+ let payload = {
760
+ "grant_type": "passwordless",
761
+ "connection": params.connection || "email",
762
+ "scope": encodeURI(scopes),
763
+ "client_id": encodeURI(oauth2ClientId),
764
+ "otp": params.otp
765
+ };
766
+
767
+ if (params.hasOwnProperty('email')) {
768
+ payload["email"] = encodeURIComponent(params.email);
769
+ }
770
+
771
+ if (params.hasOwnProperty('phone_number')) {
772
+ payload["phone_number"] = encodeURIComponent(params.phone_number);
773
+ }
774
+
775
+ let req = http.post(url.toString());
776
+ return req.send(payload).then(res => {
777
+ try {
778
+ // now we got token
779
+ let json = res.body;
780
+ let {
781
+ access_token,
782
+ expires_in,
783
+ refresh_token,
784
+ id_token
785
+ } = json;
786
+
787
+ if (typeof refresh_token === 'undefined') {
788
+ refresh_token = null; // not using rotate policy
789
+ }
790
+
791
+ if (typeof id_token === 'undefined') {
792
+ id_token = null; // not using rotate policy
793
+ } // verify id token
794
+
795
+
796
+ if (id_token) {
797
+ if (!validateIdToken(id_token, baseUrl, oauth2ClientId)) {
798
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_ID_TOKEN_INVALID);
799
+ }
800
+ }
801
+
802
+ storeAuthInfo(access_token, expires_in, refresh_token, id_token);
803
+
804
+ if (dispatch) {
805
+ dispatch({
806
+ type: _actions__WEBPACK_IMPORTED_MODULE_5__.SET_LOGGED_USER,
807
+ payload: {
808
+ sessionState: null
809
+ }
810
+ });
811
+ }
812
+
813
+ return Promise.resolve({
814
+ response: json
815
+ });
816
+ } catch (e) {
817
+ console.log(e);
818
+ return Promise.reject(e);
819
+ }
820
+ }).catch(err => {
821
+ return Promise.reject(err);
822
+ });
823
+ };
824
+ const isIdTokenAlive = (nowEpoch = null) => () => {
825
+ if (!nowEpoch) {
826
+ nowEpoch = Math.floor(Date.now() / 1000);
827
+ }
828
+
829
+ const idToken = getIdToken();
830
+ if (!idToken) throw Error('Id Token not set.');
831
+ const issuer = getOAuth2IDPBaseUrl();
832
+ const audience = getOAuth2ClientId();
833
+ let verifier = new (idtoken_verifier__WEBPACK_IMPORTED_MODULE_4___default())({
834
+ issuer: issuer,
835
+ audience: audience
836
+ });
837
+ const jwt = verifier.decode(idToken);
838
+ const exp = jwt.payload.exp; // check life time
839
+
840
+ return exp - (nowEpoch + ACCESS_TOKEN_SKEW_TIME) > 0;
841
+ };
842
+
843
+ /***/ }),
844
+
845
+ /***/ "./src/utils/actions.js":
846
+ /*!******************************!*\
847
+ !*** ./src/utils/actions.js ***!
848
+ \******************************/
849
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
850
+
851
+ __webpack_require__.r(__webpack_exports__);
852
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
853
+ /* harmony export */ "CLEAR_MESSAGE": () => (/* binding */ CLEAR_MESSAGE),
854
+ /* harmony export */ "GENERIC_ERROR": () => (/* binding */ GENERIC_ERROR),
855
+ /* harmony export */ "RESET_LOADING": () => (/* binding */ RESET_LOADING),
856
+ /* harmony export */ "SHOW_MESSAGE": () => (/* binding */ SHOW_MESSAGE),
857
+ /* harmony export */ "START_LOADING": () => (/* binding */ START_LOADING),
858
+ /* harmony export */ "STOP_LOADING": () => (/* binding */ STOP_LOADING),
859
+ /* harmony export */ "VALIDATE": () => (/* binding */ VALIDATE),
860
+ /* harmony export */ "authErrorHandler": () => (/* binding */ authErrorHandler),
861
+ /* harmony export */ "createAction": () => (/* binding */ createAction),
862
+ /* harmony export */ "defaultErrorHandler": () => (/* binding */ defaultErrorHandler),
863
+ /* harmony export */ "deleteRequest": () => (/* binding */ deleteRequest),
864
+ /* harmony export */ "downloadFileByContent": () => (/* binding */ downloadFileByContent),
865
+ /* harmony export */ "escapeFilterValue": () => (/* binding */ escapeFilterValue),
866
+ /* harmony export */ "fetchErrorHandler": () => (/* binding */ fetchErrorHandler),
867
+ /* harmony export */ "fetchResponseHandler": () => (/* binding */ fetchResponseHandler),
868
+ /* harmony export */ "getCSV": () => (/* binding */ getCSV),
869
+ /* harmony export */ "getHeaderCaseInsensitive": () => (/* binding */ getHeaderCaseInsensitive),
870
+ /* harmony export */ "getRawCSV": () => (/* binding */ getRawCSV),
871
+ /* harmony export */ "getRequest": () => (/* binding */ getRequest),
872
+ /* harmony export */ "postFile": () => (/* binding */ postFile),
873
+ /* harmony export */ "postRequest": () => (/* binding */ postRequest),
874
+ /* harmony export */ "putFile": () => (/* binding */ putFile),
875
+ /* harmony export */ "putRequest": () => (/* binding */ putRequest),
876
+ /* harmony export */ "resetLoading": () => (/* binding */ resetLoading),
877
+ /* harmony export */ "responseHandler": () => (/* binding */ responseHandler),
878
+ /* harmony export */ "showMessage": () => (/* binding */ showMessage),
879
+ /* harmony export */ "showSuccessMessage": () => (/* binding */ showSuccessMessage),
880
+ /* harmony export */ "startLoading": () => (/* binding */ startLoading),
881
+ /* harmony export */ "stopLoading": () => (/* binding */ stopLoading)
882
+ /* harmony export */ });
883
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
884
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);
885
+ /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! superagent/lib/client */ "superagent/lib/client");
886
+ /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__);
887
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! urijs */ "urijs");
888
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_2__);
889
+ /* harmony import */ var sweetalert2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! sweetalert2 */ "sweetalert2");
890
+ /* harmony import */ var sweetalert2__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(sweetalert2__WEBPACK_IMPORTED_MODULE_3__);
891
+ /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! i18n-react/dist/i18n-react */ "i18n-react/dist/i18n-react");
892
+ /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4__);
893
+ /* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./methods */ "./src/utils/methods.js");
894
+ /* harmony import */ var _components_security_actions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/security/actions */ "./src/components/security/actions.js");
895
+ /* harmony import */ var _components_security_methods__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/security/methods */ "./src/components/security/methods.js");
896
+
897
+ const _excluded = ["access_token"];
898
+
899
+ /**
900
+ * Copyright 2017 OpenStack Foundation
901
+ * Licensed under the Apache License, Version 2.0 (the "License");
902
+ * you may not use this file except in compliance with the License.
903
+ * You may obtain a copy of the License at
904
+ * http://www.apache.org/licenses/LICENSE-2.0
905
+ * Unless required by applicable law or agreed to in writing, software
906
+ * distributed under the License is distributed on an "AS IS" BASIS,
907
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
908
+ * See the License for the specific flanguage governing permissions and
909
+ * limitations under the License.
910
+ **/
911
+
912
+
913
+ let http = (superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default());
914
+
915
+
916
+
917
+
918
+
919
+ const GENERIC_ERROR = "Yikes. Something seems to be broken. Our web team has been notified, and we apologize for the inconvenience.";
920
+ const RESET_LOADING = 'RESET_LOADING';
921
+ const START_LOADING = 'START_LOADING';
922
+ const STOP_LOADING = 'STOP_LOADING';
923
+ const VALIDATE = 'VALIDATE';
924
+ const CLEAR_MESSAGE = 'CLEAR_MESSAGE';
925
+ const SHOW_MESSAGE = 'SHOW_MESSAGE';
926
+ const createAction = type => payload => ({
927
+ type,
928
+ payload
929
+ });
930
+ const resetLoading = createAction(RESET_LOADING);
931
+ const startLoading = createAction(START_LOADING);
932
+ const stopLoading = createAction(STOP_LOADING);
933
+ const xhrs = {};
934
+ const etagCache = {};
935
+
936
+ const cancel = key => {
937
+ if (xhrs[key]) {
938
+ xhrs[key].abort();
939
+ console.log(`aborted request ${key}`);
940
+ delete xhrs[key];
941
+ }
942
+ };
943
+
944
+ const schedule = (key, req) => {
945
+ // console.log(`scheduling ${key}`);
946
+ xhrs[key] = req;
947
+ };
948
+
949
+ const isObjectEmpty = obj => {
950
+ return Object.keys(obj).length === 0 && obj.constructor === Object;
951
+ };
952
+
953
+ const authErrorHandler = (err, res) => (dispatch, state) => {
954
+ let code = err.status;
955
+ let msg = '';
956
+ dispatch(stopLoading());
957
+
958
+ switch (code) {
959
+ case 403:
960
+ let error_message = {
961
+ title: 'ERROR',
962
+ html: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.user_not_authz"),
963
+ type: 'error'
964
+ };
965
+ dispatch(showMessage(error_message, _components_security_methods__WEBPACK_IMPORTED_MODULE_7__.initLogOut));
966
+ break;
967
+
968
+ case 401:
969
+ let currentLocation = (0,_methods__WEBPACK_IMPORTED_MODULE_5__.getCurrentPathName)();
970
+ let clearing_session_state = (0,_methods__WEBPACK_IMPORTED_MODULE_5__.isClearingSessionState)();
971
+ dispatch({
972
+ type: _components_security_actions__WEBPACK_IMPORTED_MODULE_6__.CLEAR_SESSION_STATE,
973
+ payload: {}
974
+ });
975
+
976
+ if (!clearing_session_state) {
977
+ (0,_methods__WEBPACK_IMPORTED_MODULE_5__.setSessionClearingState)(true);
978
+ console.log('authErrorHandler 401 - re login');
979
+ (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_7__.doLogin)(currentLocation);
980
+ }
981
+
982
+ break;
983
+
984
+ case 404:
985
+ msg = "";
986
+ if (err.response.body && err.response.body.message) msg = err.response.body.message;else if (err.response.error && err.response.error.message) msg = err.response.error.message;else msg = err.message;
987
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("Not Found", msg, "warning");
988
+ break;
989
+
990
+ case 412:
991
+ for (var [key, value] of Object.entries(err.response.body.errors)) {
992
+ if (isNaN(key)) {
993
+ msg += key + ': ';
994
+ }
995
+
996
+ msg += value + '<br>';
997
+ }
998
+
999
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("Validation error", msg, "warning");
1000
+ dispatch({
1001
+ type: VALIDATE,
1002
+ payload: {
1003
+ errors: err.response.body.errors
1004
+ }
1005
+ });
1006
+ break;
1007
+
1008
+ default:
1009
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.server_error"), "error");
1010
+ }
1011
+ };
1012
+ const getRequest = (requestActionCreator, receiveActionCreator, endpoint, errorHandler = defaultErrorHandler, requestActionPayload = {}, useEtag = false) => (params = {}) => (dispatch, state) => {
1013
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1014
+ let key = url.toString();
1015
+
1016
+ if (!isObjectEmpty(params)) {
1017
+ // remove the access token
1018
+ const {
1019
+ access_token: _
1020
+ } = params,
1021
+ newParams = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(params, _excluded); // and generate new key
1022
+
1023
+
1024
+ key = url.query(newParams).toString();
1025
+ url = url.query(params);
1026
+ }
1027
+
1028
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1029
+ cancel(key);
1030
+ return new Promise((resolve, reject) => {
1031
+ let req = http.get(url.toString());
1032
+
1033
+ if (useEtag && etagCache.hasOwnProperty(key)) {
1034
+ const {
1035
+ etag
1036
+ } = etagCache[key];
1037
+
1038
+ if (etag) {
1039
+ req.set('If-None-Match', etag);
1040
+ }
1041
+ }
1042
+
1043
+ req.timeout({
1044
+ response: 60000,
1045
+ deadline: 60000
1046
+ }).end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject, key, useEtag));
1047
+ schedule(key, req);
1048
+ });
1049
+ };
1050
+ const putRequest = (requestActionCreator, receiveActionCreator, endpoint, payload, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1051
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1052
+ if (!isObjectEmpty(params)) url = url.query(params);
1053
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1054
+ return new Promise((resolve, reject) => {
1055
+ if (payload == null) payload = {};
1056
+ http.put(url.toString()).send(payload).end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1057
+ });
1058
+ };
1059
+ const deleteRequest = (requestActionCreator, receiveActionCreator, endpoint, payload, errorHandler = defaultErrorHandler, requestActionPayload = {}) => params => (dispatch, state) => {
1060
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1061
+ if (!isObjectEmpty(params)) url = url.query(params);
1062
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1063
+ return new Promise((resolve, reject) => {
1064
+ if (payload == null) payload = {};
1065
+ http.delete(url).send(payload).end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1066
+ });
1067
+ };
1068
+ const postRequest = (requestActionCreator, receiveActionCreator, endpoint, payload, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1069
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1070
+ if (!isObjectEmpty(params)) url = url.query(params);
1071
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1072
+ return new Promise((resolve, reject) => {
1073
+ let request = http.post(url);
1074
+ if (payload != null) request.send(payload);else // to be a simple CORS request
1075
+ request.set('Content-Type', 'text/plain');
1076
+ request.end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1077
+ });
1078
+ };
1079
+ const postFile = (requestActionCreator, receiveActionCreator, endpoint, file, fileMetadata = {}, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1080
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1081
+ if (!isObjectEmpty(params)) url = url.query(params);
1082
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1083
+ return new Promise((resolve, reject) => {
1084
+ const req = http.post(url).attach('file', file);
1085
+
1086
+ if (!isObjectEmpty(fileMetadata)) {
1087
+ Object.keys(fileMetadata).forEach(function (key) {
1088
+ let value = fileMetadata[key];
1089
+ req.field(key, value);
1090
+ });
1091
+ }
1092
+
1093
+ req.end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1094
+ });
1095
+ };
1096
+ const putFile = (requestActionCreator, receiveActionCreator, endpoint, file = null, fileMetadata = {}, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1097
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1098
+ if (!isObjectEmpty(params)) url = url.query(params);
1099
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1100
+ return new Promise((resolve, reject) => {
1101
+ const req = http.put(url);
1102
+
1103
+ if (file != null) {
1104
+ req.attach('file', file);
1105
+ }
1106
+
1107
+ if (!isObjectEmpty(fileMetadata)) {
1108
+ Object.keys(fileMetadata).forEach(function (key) {
1109
+ let value = fileMetadata[key];
1110
+ req.field(key, value);
1111
+ });
1112
+ }
1113
+
1114
+ req.end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1115
+ });
1116
+ };
1117
+ const defaultErrorHandler = (err, res) => dispatch => {
1118
+ let body = res.body;
1119
+ let text = '';
1120
+
1121
+ if (body instanceof Object) {
1122
+ if (body.hasOwnProperty('message')) text = body.message;
1123
+ }
1124
+
1125
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire(res.statusText, text, "error");
1126
+ };
1127
+
1128
+ const byLowerCase = toFind => value => toLowerCase(value) === toFind;
1129
+
1130
+ const toLowerCase = value => value.toLowerCase();
1131
+
1132
+ const getKeys = headers => Object.keys(headers);
1133
+
1134
+ const getHeaderCaseInsensitive = (headerName, headers = {}) => {
1135
+ const key = getKeys(headers).find(byLowerCase(headerName));
1136
+ return key ? headers[key] : undefined;
1137
+ };
1138
+ const responseHandler = (dispatch, state, receiveActionCreator, errorHandler, resolve, reject, key = null, useEtag = false) => (err, res) => {
1139
+ if (err || !res.ok) {
1140
+ let code = err.status;
1141
+
1142
+ if (code === 304 && etagCache.hasOwnProperty(key) && useEtag) {
1143
+ const {
1144
+ body
1145
+ } = etagCache[key];
1146
+
1147
+ if (typeof receiveActionCreator === 'function') {
1148
+ dispatch(receiveActionCreator({
1149
+ response: body
1150
+ }));
1151
+ return resolve({
1152
+ response: body
1153
+ });
1154
+ }
1155
+
1156
+ dispatch(receiveActionCreator);
1157
+ return resolve({
1158
+ response: body
1159
+ });
1160
+ }
1161
+
1162
+ if (errorHandler) {
1163
+ errorHandler(err, res)(dispatch, state);
1164
+ }
1165
+
1166
+ return reject({
1167
+ err,
1168
+ res,
1169
+ dispatch,
1170
+ state
1171
+ });
1172
+ }
1173
+
1174
+ let json = res.body;
1175
+
1176
+ if (useEtag) {
1177
+ const responseETAG = getHeaderCaseInsensitive('etag', res.headers);
1178
+
1179
+ if (responseETAG) {
1180
+ etagCache[key] = {
1181
+ etag: responseETAG,
1182
+ body: json
1183
+ };
1184
+ }
1185
+ }
1186
+
1187
+ if (typeof receiveActionCreator === 'function') {
1188
+ dispatch(receiveActionCreator({
1189
+ response: json
1190
+ }));
1191
+ return resolve({
1192
+ response: json
1193
+ });
1194
+ }
1195
+
1196
+ dispatch(receiveActionCreator);
1197
+ return resolve({
1198
+ response: json
1199
+ });
1200
+ };
1201
+ const fetchErrorHandler = response => {
1202
+ let code = response.status;
1203
+ let msg = response.statusText;
1204
+
1205
+ switch (code) {
1206
+ case 403:
1207
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.user_not_authz"), "warning");
1208
+ break;
1209
+
1210
+ case 401:
1211
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.session_expired"), "error");
1212
+ break;
1213
+
1214
+ case 412:
1215
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", msg, "warning");
1216
+
1217
+ case 500:
1218
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.server_error"), "error");
1219
+ }
1220
+ };
1221
+ const fetchResponseHandler = response => {
1222
+ if (!response.ok) {
1223
+ throw response;
1224
+ } else {
1225
+ return response.json();
1226
+ }
1227
+ };
1228
+ const showMessage = (settings, callback = {}) => dispatch => {
1229
+ dispatch(stopLoading());
1230
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire(settings).then(result => {
1231
+ if (result.value && typeof callback === 'function') {
1232
+ callback();
1233
+ }
1234
+ });
1235
+ };
1236
+ const showSuccessMessage = html => dispatch => {
1237
+ dispatch(stopLoading());
1238
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire({
1239
+ title: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("general.done"),
1240
+ html: html,
1241
+ type: 'success'
1242
+ });
1243
+ };
1244
+ const downloadFileByContent = (filename, content, mime) => {
1245
+ let link = document.createElement('a');
1246
+ link.textContent = 'download';
1247
+ link.download = filename;
1248
+ link.href = `data:${mime},${encodeURIComponent(content)}`;
1249
+ document.body.appendChild(link); // Required for FF
1250
+
1251
+ link.click();
1252
+ document.body.removeChild(link);
1253
+ };
1254
+ const getCSV = (endpoint, params, filename, header = null) => dispatch => {
1255
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1256
+ if (!isObjectEmpty(params)) url = url.query(params);
1257
+ dispatch(startLoading());
1258
+ return fetch(url.toString()).then(response => {
1259
+ if (!response.ok) {
1260
+ throw response;
1261
+ } else {
1262
+ return response.text();
1263
+ }
1264
+ }).then(csv => {
1265
+ dispatch(stopLoading());
1266
+
1267
+ if (header) {
1268
+ csv = header + '\r\r' + csv;
1269
+ }
1270
+
1271
+ downloadFileByContent(filename, csv, 'text/csv;charset=utf-8');
1272
+ }).catch(fetchErrorHandler);
1273
+ };
1274
+ const getRawCSV = (endpoint, params, header = null) => {
1275
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1276
+ if (!isObjectEmpty(params)) url = url.query(params);
1277
+ return fetch(url.toString()).then(response => {
1278
+ if (!response.ok) {
1279
+ throw response;
1280
+ } else {
1281
+ return response.text();
1282
+ }
1283
+ }).then(csv => {
1284
+ if (header) {
1285
+ csv = header + '\r\r' + csv;
1286
+ }
1287
+
1288
+ return csv;
1289
+ }).catch(fetchErrorHandler);
1290
+ };
1291
+ const escapeFilterValue = value => {
1292
+ value = value.replace(/,/g, "\\,");
1293
+ value = value.replace(/;/g, "\\;");
1294
+ return value;
1295
+ };
1296
+
1297
+ /***/ }),
1298
+
1299
+ /***/ "./src/utils/crypto.js":
1300
+ /*!*****************************!*\
1301
+ !*** ./src/utils/crypto.js ***!
1302
+ \*****************************/
1303
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1304
+
1305
+ __webpack_require__.r(__webpack_exports__);
1306
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1307
+ /* harmony export */ "getRandomBytes": () => (/* binding */ getRandomBytes),
1308
+ /* harmony export */ "getSHA256": () => (/* binding */ getSHA256)
1309
+ /* harmony export */ });
1310
+ /* harmony import */ var crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! crypto-js/sha256 */ "crypto-js/sha256");
1311
+ /* harmony import */ var crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0__);
1312
+ /* harmony import */ var crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! crypto-js/enc-base64url */ "crypto-js/enc-base64url");
1313
+ /* harmony import */ var crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1__);
1314
+ /* harmony import */ var crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto-js/enc-hex */ "crypto-js/enc-hex");
1315
+ /* harmony import */ var crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2__);
1316
+ // limit of Crypto.getRandomValues()
1317
+ // https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues
1318
+ const MAX_BYTES = 65536; // Node supports requesting up to this number of bytes
1319
+ // https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js#L48
1320
+
1321
+ const MAX_UINT32 = 4294967295;
1322
+ const crypto = typeof window !== 'undefined' ? window.crypto || window.msCrypto : null;
1323
+
1324
+
1325
+
1326
+ const getRandomBytes = size => {
1327
+ // phantomjs needs to throw
1328
+ if (size > MAX_UINT32) throw new RangeError('requested too many random bytes');
1329
+ const bytes = Buffer.allocUnsafe(size);
1330
+ if (!crypto) return a;
1331
+
1332
+ if (size > 0) {
1333
+ // getRandomValues fails on IE if size == 0
1334
+ if (size > MAX_BYTES) {
1335
+ // this is the max bytes crypto.getRandomValues
1336
+ // can do at once see https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues
1337
+ for (let generated = 0; generated < size; generated += MAX_BYTES) {
1338
+ // buffer.slice automatically checks if the end is past the end of
1339
+ // the buffer so we don't have to here
1340
+ crypto.getRandomValues(bytes.slice(generated, generated + MAX_BYTES));
1341
+ }
1342
+ } else {
1343
+ crypto.getRandomValues(bytes);
1344
+ }
1345
+ }
1346
+
1347
+ return bytes;
1348
+ };
1349
+ const getSHA256 = (message, format = 'hex') => {
1350
+ let f = (crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2___default());
1351
+ if (format === 'Base64url') f = (crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1___default());
1352
+ return crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0___default()(message).toString(f);
1353
+ };
1354
+
1355
+ /***/ }),
1356
+
1357
+ /***/ "./src/utils/methods.js":
1358
+ /*!******************************!*\
1359
+ !*** ./src/utils/methods.js ***!
1360
+ \******************************/
1361
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1362
+
1363
+ __webpack_require__.r(__webpack_exports__);
1364
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1365
+ /* harmony export */ "arraysEqual": () => (/* binding */ arraysEqual),
1366
+ /* harmony export */ "base64URLEncode": () => (/* binding */ base64URLEncode),
1367
+ /* harmony export */ "buildAPIBaseUrl": () => (/* binding */ buildAPIBaseUrl),
1368
+ /* harmony export */ "epochToMoment": () => (/* binding */ epochToMoment),
1369
+ /* harmony export */ "epochToMomentTimeZone": () => (/* binding */ epochToMomentTimeZone),
1370
+ /* harmony export */ "findElementPos": () => (/* binding */ findElementPos),
1371
+ /* harmony export */ "formatEpoch": () => (/* binding */ formatEpoch),
1372
+ /* harmony export */ "getAllowedUserGroups": () => (/* binding */ getAllowedUserGroups),
1373
+ /* harmony export */ "getAuthCallback": () => (/* binding */ getAuthCallback),
1374
+ /* harmony export */ "getBackURL": () => (/* binding */ getBackURL),
1375
+ /* harmony export */ "getCurrentHref": () => (/* binding */ getCurrentHref),
1376
+ /* harmony export */ "getCurrentLocation": () => (/* binding */ getCurrentLocation),
1377
+ /* harmony export */ "getCurrentPathName": () => (/* binding */ getCurrentPathName),
1378
+ /* harmony export */ "getCurrentUserLanguage": () => (/* binding */ getCurrentUserLanguage),
1379
+ /* harmony export */ "getFromLocalStorage": () => (/* binding */ getFromLocalStorage),
1380
+ /* harmony export */ "getOrigin": () => (/* binding */ getOrigin),
1381
+ /* harmony export */ "getTimeServiceUrl": () => (/* binding */ getTimeServiceUrl),
1382
+ /* harmony export */ "hasErrors": () => (/* binding */ hasErrors),
1383
+ /* harmony export */ "isClearingSessionState": () => (/* binding */ isClearingSessionState),
1384
+ /* harmony export */ "isEmpty": () => (/* binding */ isEmpty),
1385
+ /* harmony export */ "objectToQueryString": () => (/* binding */ objectToQueryString),
1386
+ /* harmony export */ "putOnLocalStorage": () => (/* binding */ putOnLocalStorage),
1387
+ /* harmony export */ "removeFromLocalStorage": () => (/* binding */ removeFromLocalStorage),
1388
+ /* harmony export */ "retryPromise": () => (/* binding */ retryPromise),
1389
+ /* harmony export */ "scrollToError": () => (/* binding */ scrollToError),
1390
+ /* harmony export */ "setSessionClearingState": () => (/* binding */ setSessionClearingState),
1391
+ /* harmony export */ "shallowEqual": () => (/* binding */ shallowEqual),
1392
+ /* harmony export */ "toSlug": () => (/* binding */ toSlug)
1393
+ /* harmony export */ });
1394
+ /* harmony import */ var moment_timezone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment-timezone */ "moment-timezone");
1395
+ /* harmony import */ var moment_timezone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment_timezone__WEBPACK_IMPORTED_MODULE_0__);
1396
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! urijs */ "urijs");
1397
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_1__);
1398
+ /**
1399
+ * Copyright 2018 OpenStack Foundation
1400
+ * Licensed under the Apache License, Version 2.0 (the "License");
1401
+ * you may not use this file except in compliance with the License.
1402
+ * You may obtain a copy of the License at
1403
+ * http://www.apache.org/licenses/LICENSE-2.0
1404
+ * Unless required by applicable law or agreed to in writing, software
1405
+ * distributed under the License is distributed on an "AS IS" BASIS,
1406
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1407
+ * See the License for the specific language governing permissions and
1408
+ * limitations under the License.
1409
+ **/
1410
+
1411
+
1412
+ const findElementPos = obj => {
1413
+ var curtop = -70;
1414
+
1415
+ if (obj.offsetParent) {
1416
+ do {
1417
+ curtop += obj.offsetTop;
1418
+ } while (obj = obj.offsetParent);
1419
+
1420
+ return [curtop];
1421
+ }
1422
+ };
1423
+ const epochToMoment = atime => {
1424
+ if (!atime) return atime;
1425
+ atime = atime * 1000;
1426
+ return moment_timezone__WEBPACK_IMPORTED_MODULE_0___default()(atime);
1427
+ };
1428
+ const epochToMomentTimeZone = (atime, time_zone) => {
1429
+ if (!atime) return atime;
1430
+ atime = atime * 1000;
1431
+ return moment_timezone__WEBPACK_IMPORTED_MODULE_0___default()(atime).tz(time_zone);
1432
+ };
1433
+ const formatEpoch = (atime, format = 'M/D/YYYY h:mm a') => {
1434
+ if (!atime) return atime;
1435
+ return epochToMoment(atime).format(format);
1436
+ };
1437
+ const objectToQueryString = obj => {
1438
+ var str = "";
1439
+
1440
+ for (var key in obj) {
1441
+ if (str != "") {
1442
+ str += "&";
1443
+ }
1444
+
1445
+ str += key + "=" + encodeURIComponent(obj[key]);
1446
+ }
1447
+
1448
+ return str;
1449
+ };
1450
+ const getBackURL = () => {
1451
+ let url = urijs__WEBPACK_IMPORTED_MODULE_1___default()(window.location.href);
1452
+ let query = url.search(true);
1453
+ let fragment = url.fragment();
1454
+ let backUrl = query.hasOwnProperty('BackUrl') ? query['BackUrl'] : null;
1455
+
1456
+ if (fragment != null && fragment != '') {
1457
+ backUrl += `#${fragment}`;
1458
+ }
1459
+
1460
+ return backUrl;
1461
+ };
1462
+ const toSlug = text => {
1463
+ text = text.toLowerCase();
1464
+ return text.replace(/[^a-zA-Z0-9]+/g, '_');
1465
+ };
1466
+ const getAuthCallback = () => {
1467
+ if (typeof window !== 'undefined') {
1468
+ return `${window.location.origin}/auth/callback`;
1469
+ }
1470
+
1471
+ return null;
1472
+ };
1473
+ const getCurrentLocation = () => {
1474
+ let location = '';
1475
+
1476
+ if (typeof window !== 'undefined') {
1477
+ location = window.location; // check if we are on iframe
1478
+
1479
+ if (window.top) location = window.top.location;
1480
+ }
1481
+
1482
+ return location;
1483
+ };
1484
+ const getOrigin = () => {
1485
+ if (typeof window !== 'undefined') {
1486
+ return window.location.origin;
1487
+ }
1488
+
1489
+ return null;
1490
+ };
1491
+ const getCurrentPathName = () => {
1492
+ if (typeof window !== 'undefined') {
1493
+ return window.location.pathname;
1494
+ }
1495
+
1496
+ return null;
1497
+ };
1498
+ const getCurrentHref = () => {
1499
+ if (typeof window !== 'undefined') {
1500
+ return window.location.href;
1501
+ }
1502
+
1503
+ return null;
1504
+ };
1505
+ const getAllowedUserGroups = () => {
1506
+ if (typeof window !== 'undefined') {
1507
+ return window.ALLOWED_USER_GROUPS || '';
1508
+ }
1509
+
1510
+ return null;
1511
+ };
1512
+ const buildAPIBaseUrl = relativeUrl => {
1513
+ if (typeof window !== 'undefined') {
1514
+ return `${window.API_BASE_URL}${relativeUrl}`;
1515
+ }
1516
+
1517
+ return null``;
1518
+ };
1519
+ const putOnLocalStorage = (key, value) => {
1520
+ if (typeof window !== 'undefined') {
1521
+ window.localStorage.setItem(key, value);
1522
+ }
1523
+ };
1524
+ const getFromLocalStorage = (key, removeIt) => {
1525
+ if (typeof window !== 'undefined') {
1526
+ let val = window.localStorage.getItem(key);
1527
+
1528
+ if (removeIt) {
1529
+ console.log(`getFromLocalStorage removing key ${key}`);
1530
+ removeFromLocalStorage(key);
1531
+ }
1532
+
1533
+ return val;
1534
+ }
1535
+
1536
+ return null;
1537
+ };
1538
+ const removeFromLocalStorage = key => {
1539
+ if (typeof window !== 'undefined') {
1540
+ window.localStorage.removeItem(key);
1541
+ }
1542
+ };
1543
+ const isClearingSessionState = () => {
1544
+ if (typeof window !== 'undefined') {
1545
+ return window.clearing_session_state;
1546
+ }
1547
+
1548
+ return false;
1549
+ };
1550
+ const setSessionClearingState = val => {
1551
+ if (typeof window !== 'undefined') {
1552
+ window.clearing_session_state = val;
1553
+ }
1554
+ };
1555
+ const getCurrentUserLanguage = () => {
1556
+ let language = 'en';
1557
+
1558
+ if (typeof navigator !== 'undefined') {
1559
+ language = navigator.languages && navigator.languages[0] || navigator.language || navigator.userLanguage;
1560
+ }
1561
+
1562
+ return language;
1563
+ };
1564
+ const scrollToError = errors => {
1565
+ if (Object.keys(errors).length > 0) {
1566
+ const firstError = Object.keys(errors)[0];
1567
+ const firstNode = document.getElementById(firstError);
1568
+ if (firstNode) window.scrollTo(0, findElementPos(firstNode));
1569
+ }
1570
+ };
1571
+ const hasErrors = (field, errors) => {
1572
+ if (field in errors) {
1573
+ return errors[field];
1574
+ }
1575
+
1576
+ return '';
1577
+ };
1578
+ const shallowEqual = (object1, object2) => {
1579
+ const keys1 = Object.keys(object1);
1580
+ const keys2 = Object.keys(object2);
1581
+
1582
+ if (keys1.length !== keys2.length) {
1583
+ return false;
1584
+ }
1585
+
1586
+ for (let key of keys1) {
1587
+ if (object1[key] !== object2[key]) {
1588
+ return false;
1589
+ }
1590
+ }
1591
+
1592
+ return true;
1593
+ };
1594
+ const arraysEqual = (a1, a2) => a1.length === a2.length && a1.every((o, idx) => shallowEqual(o, a2[idx]));
1595
+ const isEmpty = obj => {
1596
+ return Object.keys(obj).length === 0;
1597
+ };
1598
+ const base64URLEncode = str => {
1599
+ return str.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
1600
+ };
1601
+ const retryPromise = async (cb, maxNumberOfRetries = 3) => {
1602
+ for (let i = 0; i < maxNumberOfRetries; i++) {
1603
+ if (await cb()) {
1604
+ return true;
1605
+ }
1606
+ }
1607
+
1608
+ return false;
1609
+ };
1610
+ const getTimeServiceUrl = () => {
1611
+ if (typeof window !== 'undefined') {
1612
+ return window.TIMEINTERVALSINCE1970_API_URL || process.env.TIMEINTERVALSINCE1970_API_URL;
1613
+ }
1614
+
1615
+ return null;
1616
+ };
1617
+
1618
+ /***/ }),
1619
+
1620
+ /***/ "./src/utils/query-actions.js":
1621
+ /*!************************************!*\
1622
+ !*** ./src/utils/query-actions.js ***!
1623
+ \************************************/
1624
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1625
+
1626
+ __webpack_require__.r(__webpack_exports__);
1627
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1628
+ /* harmony export */ "RECEIVE_COUNTRIES": () => (/* binding */ RECEIVE_COUNTRIES),
1629
+ /* harmony export */ "geoCodeAddress": () => (/* binding */ geoCodeAddress),
1630
+ /* harmony export */ "geoCodeLatLng": () => (/* binding */ geoCodeLatLng),
1631
+ /* harmony export */ "getCountryList": () => (/* binding */ getCountryList),
1632
+ /* harmony export */ "getLanguageList": () => (/* binding */ getLanguageList),
1633
+ /* harmony export */ "queryAccessLevels": () => (/* binding */ queryAccessLevels),
1634
+ /* harmony export */ "queryCompanies": () => (/* binding */ queryCompanies),
1635
+ /* harmony export */ "queryEventTypes": () => (/* binding */ queryEventTypes),
1636
+ /* harmony export */ "queryEvents": () => (/* binding */ queryEvents),
1637
+ /* harmony export */ "queryGroups": () => (/* binding */ queryGroups),
1638
+ /* harmony export */ "queryMembers": () => (/* binding */ queryMembers),
1639
+ /* harmony export */ "queryOrganizations": () => (/* binding */ queryOrganizations),
1640
+ /* harmony export */ "queryPromocodes": () => (/* binding */ queryPromocodes),
1641
+ /* harmony export */ "queryRegistrationCompanies": () => (/* binding */ queryRegistrationCompanies),
1642
+ /* harmony export */ "querySpeakers": () => (/* binding */ querySpeakers),
1643
+ /* harmony export */ "querySponsoredProjects": () => (/* binding */ querySponsoredProjects),
1644
+ /* harmony export */ "querySponsors": () => (/* binding */ querySponsors),
1645
+ /* harmony export */ "querySummits": () => (/* binding */ querySummits),
1646
+ /* harmony export */ "queryTags": () => (/* binding */ queryTags),
1647
+ /* harmony export */ "queryTicketTypes": () => (/* binding */ queryTicketTypes),
1648
+ /* harmony export */ "queryTrackGroups": () => (/* binding */ queryTrackGroups),
1649
+ /* harmony export */ "queryTracks": () => (/* binding */ queryTracks)
1650
+ /* harmony export */ });
1651
+ /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ "./src/utils/actions.js");
1652
+ /* harmony import */ var _components_security_methods__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/security/methods */ "./src/components/security/methods.js");
1653
+ /* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./methods */ "./src/utils/methods.js");
1654
+ /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash */ "lodash");
1655
+ /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_3__);
1656
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! urijs */ "urijs");
1657
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_4__);
1658
+ /**
1659
+ * Copyright 2018 OpenStack Foundation
1660
+ * Licensed under the Apache License, Version 2.0 (the "License");
1661
+ * you may not use this file except in compliance with the License.
1662
+ * You may obtain a copy of the License at
1663
+ * http://www.apache.org/licenses/LICENSE-2.0
1664
+ * Unless required by applicable law or agreed to in writing, software
1665
+ * distributed under the License is distributed on an "AS IS" BASIS,
1666
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1667
+ * See the License for the specific language governing permissions and
1668
+ * limitations under the License.
1669
+ **/
1670
+
1671
+
1672
+
1673
+
1674
+ const RECEIVE_COUNTRIES = 'RECEIVE_COUNTRIES';
1675
+ const callDelay = 500; //miliseconds
1676
+
1677
+
1678
+ const queryMembers = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1679
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1680
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1681
+ let filters = encodeURIComponent(`full_name=@${input},first_name=@${input},last_name=@${input},email=@${input}`);
1682
+ let expand = `tickets,rsvp,schedule_summit_events,all_affiliations`;
1683
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/members?filter=${filters}&expand=${expand}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1684
+ let options = [...json.data];
1685
+ callback(options);
1686
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1687
+ }, callDelay);
1688
+ const querySummits = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1689
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1690
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1691
+ let filters = encodeURIComponent(`name=@${input}`);
1692
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/all?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1693
+ let options = [...json.data];
1694
+ callback(options);
1695
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1696
+ }, callDelay);
1697
+ const querySpeakers = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1698
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1699
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1700
+ let filters = encodeURIComponent(`full_name=@${input},first_name=@${input},last_name=@${input},email=@${input}`);
1701
+ let apiUrl = `/api/v1`;
1702
+
1703
+ if (summitId) {
1704
+ apiUrl += `/summits/${summitId}`;
1705
+ }
1706
+
1707
+ apiUrl += `/speakers?filter=${filters}&access_token=${accessToken}&expand=member,registration_request`;
1708
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1709
+ let options = [...json.data];
1710
+ callback(options);
1711
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1712
+ }, callDelay);
1713
+ const queryTags = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1714
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1715
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1716
+ let apiUrl = `/api/v1`;
1717
+ let filter = encodeURIComponent(`tag=@${input}`);
1718
+
1719
+ if (summitId) {
1720
+ apiUrl += `/summits/${summitId}/track-tag-groups/all/allowed-tags?filter=${filter}&expand=tag,track_tag_group`;
1721
+ } else {
1722
+ apiUrl += `/tags?filter=${filter}`;
1723
+ }
1724
+
1725
+ apiUrl += `&order=tag&page=1&per_page=50&access_token=${accessToken}`;
1726
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1727
+ let options = [...json.data];
1728
+
1729
+ if (summitId) {
1730
+ options = options.map(t => t.tag);
1731
+ }
1732
+
1733
+ callback(options);
1734
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1735
+ }, callDelay);
1736
+ const queryTracks = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1737
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1738
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1739
+ let filter = encodeURIComponent(`name=@${input}`);
1740
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/tracks?filter=${filter}&order=name&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1741
+ let options = [...json.data];
1742
+ callback(options);
1743
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1744
+ }, callDelay);
1745
+ const queryTrackGroups = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1746
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1747
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1748
+ let filter = input ? encodeURIComponent(`filter=name=@${input}`) : '';
1749
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/track-groups?order=name&access_token=${accessToken}&${filter}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1750
+ let options = [...json.data];
1751
+ callback(options);
1752
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1753
+ }, callDelay);
1754
+ const queryEvents = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, onlyPublished = false, callback) => {
1755
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1756
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1757
+ let baseUrl = `/api/v1/summits/${summitId}/events` + (onlyPublished ? '/published' : '');
1758
+ let filter = encodeURIComponent(`title=@${input}`);
1759
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`${baseUrl}?filter=${filter}&order=title&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1760
+ let options = [...json.data];
1761
+ callback(options);
1762
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1763
+ }, callDelay);
1764
+ const queryEventTypes = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback, eventTypeClassName = null) => {
1765
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1766
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1767
+ let url = `/api/v1/summits/${summitId}/event-types?order=name&access_token=${accessToken}`;
1768
+
1769
+ if (input) {
1770
+ const filter = encodeURIComponent(`name=@${input}`);
1771
+ url += `&filter[]=${filter}`;
1772
+ }
1773
+
1774
+ if (eventTypeClassName) {
1775
+ const filter = encodeURIComponent(`class_name==${eventTypeClassName}`);
1776
+ url += `&filter[]=${filter}`;
1777
+ }
1778
+
1779
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(url)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1780
+ let options = [...json.data];
1781
+ callback(options);
1782
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1783
+ }, callDelay);
1784
+ const queryGroups = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1785
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1786
+ let filters = encodeURIComponent(`title=@${input},code=@${input}`);
1787
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/groups?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1788
+ let options = [...json.data];
1789
+ callback(options);
1790
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1791
+ }, callDelay);
1792
+ const queryCompanies = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1793
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1794
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1795
+ let filters = encodeURIComponent(`name=@${input}`);
1796
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/companies?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1797
+ let options = [...json.data];
1798
+ callback(options);
1799
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1800
+ }, callDelay);
1801
+ const queryRegistrationCompanies = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1802
+ let accessToken;
1803
+
1804
+ try {
1805
+ accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1806
+ } catch (e) {
1807
+ callback(e);
1808
+ return;
1809
+ }
1810
+
1811
+ let apiUrl = urijs__WEBPACK_IMPORTED_MODULE_4___default()(`/api/v1/summits/${summitId}/registration-companies`);
1812
+ apiUrl.addQuery('access_token', accessToken);
1813
+ apiUrl.addQuery('order', 'name');
1814
+
1815
+ if (input) {
1816
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1817
+ apiUrl.addQuery('filter[]', `name@@${input}`);
1818
+ }
1819
+
1820
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl.toString())).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1821
+ let options = [...json.data];
1822
+ callback(options);
1823
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1824
+ }, callDelay);
1825
+ const querySponsors = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1826
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1827
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1828
+ let filters = encodeURIComponent(`company_name=@${input}`);
1829
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/sponsors?filter=${filters}&expand=company,sponsorship&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1830
+ let options = [...json.data];
1831
+ callback(options);
1832
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1833
+ }, callDelay);
1834
+ const queryAccessLevels = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1835
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1836
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1837
+ let filters = encodeURIComponent(`name=@${input}`);
1838
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/access-level-types?filter=${filters}&&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1839
+ let options = [...json.data];
1840
+ callback(options);
1841
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1842
+ }, callDelay);
1843
+ const queryOrganizations = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1844
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1845
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1846
+ let filters = encodeURIComponent(`name=@${input}`);
1847
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/organizations?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1848
+ let options = [...json.data];
1849
+ callback(options);
1850
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1851
+ }, callDelay);
1852
+ const getLanguageList = (callback, signal) => {
1853
+ return fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/public/v1/languages`), {
1854
+ signal
1855
+ }).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(response => {
1856
+ callback(response.data);
1857
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1858
+ };
1859
+ const getCountryList = (callback, signal) => {
1860
+ return fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/public/v1/countries`), {
1861
+ signal
1862
+ }).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(response => {
1863
+ callback(response.data);
1864
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1865
+ };
1866
+ var geocoder;
1867
+ const geoCodeAddress = address => {
1868
+ if (!geocoder) geocoder = new google.maps.Geocoder(); // return a Promise
1869
+
1870
+ return new Promise(function (resolve, reject) {
1871
+ geocoder.geocode({
1872
+ 'address': address
1873
+ }, function (results, status) {
1874
+ if (status == google.maps.GeocoderStatus.OK) {
1875
+ // resolve results upon a successful status
1876
+ resolve(results);
1877
+ } else {
1878
+ // reject status upon un-successful status
1879
+ reject(status);
1880
+ }
1881
+ });
1882
+ });
1883
+ };
1884
+ const geoCodeLatLng = (lat, lng) => {
1885
+ if (!geocoder) geocoder = new google.maps.Geocoder();
1886
+ var latlng = {
1887
+ lat: parseFloat(lat),
1888
+ lng: parseFloat(lng)
1889
+ }; // return a Promise
1890
+
1891
+ return new Promise(function (resolve, reject) {
1892
+ geocoder.geocode({
1893
+ 'location': latlng
1894
+ }, function (results, status) {
1895
+ if (status == google.maps.GeocoderStatus.OK) {
1896
+ // resolve results upon a successful status
1897
+ resolve(results);
1898
+ } else {
1899
+ // reject status upon un-successful status
1900
+ reject(status);
1901
+ }
1902
+ });
1903
+ });
1904
+ };
1905
+ const queryTicketTypes = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, filters = {}, callback, version = 'v1') => {
1906
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1907
+ let apiUrl = urijs__WEBPACK_IMPORTED_MODULE_4___default()(`/api/${version}/summits/${summitId}/ticket-types`);
1908
+ apiUrl.addQuery('access_token', accessToken);
1909
+ apiUrl.addQuery('order', 'name');
1910
+
1911
+ if (filters.hasOwnProperty('name')) {
1912
+ const name = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(filters.name);
1913
+ apiUrl.addQuery('filter[]', `name@@${name}`);
1914
+ }
1915
+
1916
+ if (filters.hasOwnProperty('audience')) {
1917
+ const audience = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(filters.audience);
1918
+ apiUrl.addQuery('filter[]', `audience==${audience}`);
1919
+ }
1920
+
1921
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl.toString())).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1922
+ let options = [...json.data];
1923
+ callback(options);
1924
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1925
+ }, callDelay);
1926
+ const querySponsoredProjects = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1927
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1928
+ const apiUrl = urijs__WEBPACK_IMPORTED_MODULE_4___default()(`/api/v1/sponsored-projects`);
1929
+ apiUrl.addQuery('access_token', accessToken);
1930
+
1931
+ if (input) {
1932
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1933
+ apiUrl.addQuery('filter[]', `name=@${input}`);
1934
+ }
1935
+
1936
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl.toString())).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1937
+ let options = [...json.data];
1938
+ callback(options);
1939
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1940
+ }, callDelay);
1941
+ const queryPromocodes = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1942
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1943
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1944
+ let filters = encodeURIComponent(`code=@${input}`);
1945
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/promo-codes?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1946
+ let options = [...json.data];
1947
+ callback(options);
1948
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1949
+ }, callDelay);
1950
+
1951
+ /***/ }),
1952
+
1953
+ /***/ "@babel/runtime/helpers/defineProperty":
1954
+ /*!********************************************************!*\
1955
+ !*** external "@babel/runtime/helpers/defineProperty" ***!
1956
+ \********************************************************/
1957
+ /***/ ((module) => {
1958
+
1959
+ module.exports = require("@babel/runtime/helpers/defineProperty");
1960
+
1961
+ /***/ }),
1962
+
1963
+ /***/ "@babel/runtime/helpers/extends":
1964
+ /*!*************************************************!*\
1965
+ !*** external "@babel/runtime/helpers/extends" ***!
1966
+ \*************************************************/
1967
+ /***/ ((module) => {
1968
+
1969
+ module.exports = require("@babel/runtime/helpers/extends");
1970
+
1971
+ /***/ }),
1972
+
1973
+ /***/ "@babel/runtime/helpers/objectWithoutProperties":
1974
+ /*!*****************************************************************!*\
1975
+ !*** external "@babel/runtime/helpers/objectWithoutProperties" ***!
1976
+ \*****************************************************************/
1977
+ /***/ ((module) => {
1978
+
1979
+ module.exports = require("@babel/runtime/helpers/objectWithoutProperties");
1980
+
1981
+ /***/ }),
1982
+
1983
+ /***/ "browser-tabs-lock":
1984
+ /*!************************************!*\
1985
+ !*** external "browser-tabs-lock" ***!
1986
+ \************************************/
1987
+ /***/ ((module) => {
1988
+
1989
+ module.exports = require("browser-tabs-lock");
1990
+
1991
+ /***/ }),
1992
+
1993
+ /***/ "crypto-js/enc-base64url":
1994
+ /*!******************************************!*\
1995
+ !*** external "crypto-js/enc-base64url" ***!
1996
+ \******************************************/
1997
+ /***/ ((module) => {
1998
+
1999
+ module.exports = require("crypto-js/enc-base64url");
2000
+
2001
+ /***/ }),
2002
+
2003
+ /***/ "crypto-js/enc-hex":
2004
+ /*!************************************!*\
2005
+ !*** external "crypto-js/enc-hex" ***!
2006
+ \************************************/
2007
+ /***/ ((module) => {
2008
+
2009
+ module.exports = require("crypto-js/enc-hex");
2010
+
2011
+ /***/ }),
2012
+
2013
+ /***/ "crypto-js/sha256":
2014
+ /*!***********************************!*\
2015
+ !*** external "crypto-js/sha256" ***!
2016
+ \***********************************/
2017
+ /***/ ((module) => {
2018
+
2019
+ module.exports = require("crypto-js/sha256");
2020
+
2021
+ /***/ }),
2022
+
2023
+ /***/ "i18n-react/dist/i18n-react":
2024
+ /*!*********************************************!*\
2025
+ !*** external "i18n-react/dist/i18n-react" ***!
2026
+ \*********************************************/
2027
+ /***/ ((module) => {
2028
+
2029
+ module.exports = require("i18n-react/dist/i18n-react");
2030
+
2031
+ /***/ }),
2032
+
2033
+ /***/ "idtoken-verifier":
2034
+ /*!***********************************!*\
2035
+ !*** external "idtoken-verifier" ***!
2036
+ \***********************************/
2037
+ /***/ ((module) => {
2038
+
2039
+ module.exports = require("idtoken-verifier");
2040
+
2041
+ /***/ }),
2042
+
2043
+ /***/ "lodash":
2044
+ /*!*************************!*\
2045
+ !*** external "lodash" ***!
2046
+ \*************************/
2047
+ /***/ ((module) => {
2048
+
2049
+ module.exports = require("lodash");
2050
+
2051
+ /***/ }),
2052
+
2053
+ /***/ "moment-timezone":
2054
+ /*!**********************************!*\
2055
+ !*** external "moment-timezone" ***!
2056
+ \**********************************/
2057
+ /***/ ((module) => {
2058
+
2059
+ module.exports = require("moment-timezone");
2060
+
2061
+ /***/ }),
2062
+
2063
+ /***/ "prop-types":
2064
+ /*!*****************************!*\
2065
+ !*** external "prop-types" ***!
2066
+ \*****************************/
2067
+ /***/ ((module) => {
2068
+
2069
+ module.exports = require("prop-types");
2070
+
2071
+ /***/ }),
2072
+
2073
+ /***/ "react":
2074
+ /*!************************!*\
2075
+ !*** external "react" ***!
2076
+ \************************/
2077
+ /***/ ((module) => {
2078
+
2079
+ module.exports = require("react");
2080
+
2081
+ /***/ }),
2082
+
2083
+ /***/ "react-select/lib/Async":
2084
+ /*!*****************************************!*\
2085
+ !*** external "react-select/lib/Async" ***!
2086
+ \*****************************************/
2087
+ /***/ ((module) => {
2088
+
2089
+ module.exports = require("react-select/lib/Async");
2090
+
2091
+ /***/ }),
2092
+
2093
+ /***/ "superagent/lib/client":
2094
+ /*!****************************************!*\
2095
+ !*** external "superagent/lib/client" ***!
2096
+ \****************************************/
2097
+ /***/ ((module) => {
2098
+
2099
+ module.exports = require("superagent/lib/client");
2100
+
2101
+ /***/ }),
2102
+
2103
+ /***/ "sweetalert2":
2104
+ /*!******************************!*\
2105
+ !*** external "sweetalert2" ***!
2106
+ \******************************/
2107
+ /***/ ((module) => {
2108
+
2109
+ module.exports = require("sweetalert2");
2110
+
2111
+ /***/ }),
2112
+
2113
+ /***/ "urijs":
2114
+ /*!************************!*\
2115
+ !*** external "urijs" ***!
2116
+ \************************/
2117
+ /***/ ((module) => {
2118
+
2119
+ module.exports = require("urijs");
2120
+
2121
+ /***/ })
2122
+
2123
+ /******/ });
2124
+ /************************************************************************/
2125
+ /******/ // The module cache
2126
+ /******/ var __webpack_module_cache__ = {};
2127
+ /******/
2128
+ /******/ // The require function
2129
+ /******/ function __webpack_require__(moduleId) {
2130
+ /******/ // Check if module is in cache
2131
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
2132
+ /******/ if (cachedModule !== undefined) {
2133
+ /******/ return cachedModule.exports;
2134
+ /******/ }
2135
+ /******/ // Create a new module (and put it into the cache)
2136
+ /******/ var module = __webpack_module_cache__[moduleId] = {
2137
+ /******/ // no module.id needed
2138
+ /******/ // no module.loaded needed
2139
+ /******/ exports: {}
2140
+ /******/ };
2141
+ /******/
2142
+ /******/ // Execute the module function
2143
+ /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
2144
+ /******/
2145
+ /******/ // Return the exports of the module
2146
+ /******/ return module.exports;
2147
+ /******/ }
2148
+ /******/
2149
+ /************************************************************************/
2150
+ /******/ /* webpack/runtime/compat get default export */
2151
+ /******/ (() => {
2152
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
2153
+ /******/ __webpack_require__.n = (module) => {
2154
+ /******/ var getter = module && module.__esModule ?
2155
+ /******/ () => (module['default']) :
2156
+ /******/ () => (module);
2157
+ /******/ __webpack_require__.d(getter, { a: getter });
2158
+ /******/ return getter;
2159
+ /******/ };
2160
+ /******/ })();
2161
+ /******/
2162
+ /******/ /* webpack/runtime/define property getters */
2163
+ /******/ (() => {
2164
+ /******/ // define getter functions for harmony exports
2165
+ /******/ __webpack_require__.d = (exports, definition) => {
2166
+ /******/ for(var key in definition) {
2167
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
2168
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
2169
+ /******/ }
2170
+ /******/ }
2171
+ /******/ };
2172
+ /******/ })();
2173
+ /******/
2174
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
2175
+ /******/ (() => {
2176
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
2177
+ /******/ })();
2178
+ /******/
2179
+ /******/ /* webpack/runtime/make namespace object */
2180
+ /******/ (() => {
2181
+ /******/ // define __esModule on exports
2182
+ /******/ __webpack_require__.r = (exports) => {
2183
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
2184
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2185
+ /******/ }
2186
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
2187
+ /******/ };
2188
+ /******/ })();
2189
+ /******/
2190
+ /************************************************************************/
2191
+ var __webpack_exports__ = {};
2192
+ // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
2193
+ (() => {
2194
+ /*!*************************************************************!*\
2195
+ !*** ./src/components/inputs/registration-company-input.js ***!
2196
+ \*************************************************************/
2197
+ __webpack_require__.r(__webpack_exports__);
2198
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2199
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2200
+ /* harmony export */ });
2201
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "@babel/runtime/helpers/extends");
2202
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__);
2203
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
2204
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__);
2205
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react");
2206
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
2207
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "prop-types");
2208
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);
2209
+ /* harmony import */ var react_select_lib_Async__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-select/lib/Async */ "react-select/lib/Async");
2210
+ /* harmony import */ var react_select_lib_Async__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_select_lib_Async__WEBPACK_IMPORTED_MODULE_4__);
2211
+ /* harmony import */ var _utils_query_actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../utils/query-actions */ "./src/utils/query-actions.js");
2212
+
2213
+
2214
+ const _excluded = ["error", "value", "onChange", "id", "multi", "isMulti", "disabled", "className", "summitId", "onError", "inputPlaceholder", "DDLPlaceholder", "tabSelectsValue", "selectStyles"];
2215
+
2216
+ /**
2217
+ * Copyright 2017 OpenStack Foundation
2218
+ * Licensed under the Apache License, Version 2.0 (the "License");
2219
+ * you may not use this file except in compliance with the License.
2220
+ * You may obtain a copy of the License at
2221
+ * http://www.apache.org/licenses/LICENSE-2.0
2222
+ * Unless required by applicable law or agreed to in writing, software
2223
+ * distributed under the License is distributed on an "AS IS" BASIS,
2224
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2225
+ * See the License for the specific language governing permissions and
2226
+ * limitations under the License.
2227
+ **/
2228
+
2229
+
2230
+
2231
+
2232
+
2233
+ const RegistrationCompanyInput = _ref => {
2234
+ let {
2235
+ error,
2236
+ value,
2237
+ onChange,
2238
+ id,
2239
+ multi,
2240
+ isMulti,
2241
+ disabled,
2242
+ className,
2243
+ summitId,
2244
+ onError,
2245
+ inputPlaceholder,
2246
+ DDLPlaceholder,
2247
+ tabSelectsValue,
2248
+ selectStyles
2249
+ } = _ref,
2250
+ rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1___default()(_ref, _excluded);
2251
+
2252
+ const [theValue, setTheValue] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)({
2253
+ value: null,
2254
+ label: ''
2255
+ });
2256
+ const [freeInput, setFreeInput] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(false);
2257
+ const [inputValue, setInputValue] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)('');
2258
+ const [isMultiOptional, setIsMultiOptional] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(multi || isMulti);
2259
+ const [inputDisabled, setInputDisabled] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(disabled);
2260
+ const [hasError, setHasError] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(error);
2261
+ const [noCompanies, setNoCompanies] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(false);
2262
+ (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(() => {
2263
+ setHasError(error);
2264
+ }, [error]);
2265
+ (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(() => {
2266
+ if (!value.id && value.name) {
2267
+ setFreeInput(true);
2268
+ setInputValue(value.name);
2269
+ setTheValue({
2270
+ value: null,
2271
+ label: value.name
2272
+ });
2273
+ } else {
2274
+ if (isMulti && value.length > 0) {
2275
+ setTheValue(value.map(v => ({
2276
+ value: v.id,
2277
+ label: v.name
2278
+ })));
2279
+ } else if (!isMulti && value.id) {
2280
+ setTheValue({
2281
+ value: value.id,
2282
+ label: value.name
2283
+ });
2284
+ }
2285
+ }
2286
+ }, [value]);
2287
+
2288
+ const handleChange = eventValue => {
2289
+ if (eventValue.value === null) {
2290
+ setFreeInput(true);
2291
+ const newValueState = isMultiOptional ? eventValue.map(v => ({
2292
+ value: v.value,
2293
+ label: ''
2294
+ })) : {
2295
+ value: eventValue.value,
2296
+ label: ''
2297
+ };
2298
+ setTheValue(newValueState);
2299
+ let ev = {
2300
+ target: {
2301
+ id: id,
2302
+ value: newValueState,
2303
+ type: 'companyinput'
2304
+ }
2305
+ };
2306
+ onChange(ev);
2307
+ return;
2308
+ }
2309
+
2310
+ const newValue = isMultiOptional ? eventValue.map(v => ({
2311
+ id: v.value,
2312
+ name: v.label
2313
+ })) : {
2314
+ id: eventValue.value,
2315
+ name: eventValue.label
2316
+ };
2317
+ const newValueState = isMultiOptional ? eventValue.map(v => ({
2318
+ value: v.value,
2319
+ label: v.label
2320
+ })) : {
2321
+ value: eventValue.value,
2322
+ label: eventValue.label
2323
+ };
2324
+ setTheValue(newValueState);
2325
+ let ev = {
2326
+ target: {
2327
+ id: id,
2328
+ value: newValue,
2329
+ type: 'companyinput'
2330
+ }
2331
+ };
2332
+ onChange(ev);
2333
+ };
2334
+
2335
+ const handleInputClear = () => {
2336
+ setFreeInput(!freeInput);
2337
+ setInputValue('');
2338
+ setTheValue({
2339
+ value: null,
2340
+ label: ''
2341
+ });
2342
+ let ev = {
2343
+ target: {
2344
+ id: id,
2345
+ value: {
2346
+ id: null,
2347
+ name: ''
2348
+ },
2349
+ type: 'companyinput'
2350
+ }
2351
+ };
2352
+ onChange(ev);
2353
+ };
2354
+
2355
+ const handleInputChange = evt => {
2356
+ setInputValue(evt.target.value);
2357
+ let ev = {
2358
+ target: {
2359
+ id: id,
2360
+ value: {
2361
+ id: null,
2362
+ name: evt.target.value
2363
+ },
2364
+ type: 'companyinput'
2365
+ }
2366
+ };
2367
+ onChange(ev);
2368
+ };
2369
+
2370
+ const getCompanies = (input, callback) => {
2371
+ const translateOptions = options => {
2372
+ // if the summit has no companies, set the input only as text
2373
+ if (!input) {
2374
+ if (options.length === 0) {
2375
+ setNoCompanies(true);
2376
+ setFreeInput(true);
2377
+ } else {
2378
+ // if the input is empty, set only this option as default value
2379
+ const defaultOption = {
2380
+ value: null,
2381
+ label: 'Other'
2382
+ };
2383
+ callback([defaultOption]);
2384
+ }
2385
+
2386
+ return;
2387
+ }
2388
+
2389
+ if (options instanceof Error) {
2390
+ onError(options);
2391
+ }
2392
+
2393
+ if (options.length === 0) {
2394
+ callback([]);
2395
+ } // we need to map into value/label because of a bug in react-select 2
2396
+ // https://github.com/JedWatson/react-select/issues/2998
2397
+
2398
+
2399
+ const otherOption = {
2400
+ value: null,
2401
+ label: 'Other'
2402
+ };
2403
+ let newOptions = [...options.map(c => ({
2404
+ value: c.id.toString(),
2405
+ label: c.name
2406
+ })), otherOption];
2407
+ callback(newOptions);
2408
+ };
2409
+
2410
+ (0,_utils_query_actions__WEBPACK_IMPORTED_MODULE_5__.queryRegistrationCompanies)(summitId, input, translateOptions);
2411
+ };
2412
+
2413
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("div", {
2414
+ style: {
2415
+ position: 'relative'
2416
+ }
2417
+ }, freeInput ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement((react__WEBPACK_IMPORTED_MODULE_2___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("input", _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({
2418
+ value: inputValue,
2419
+ placeholder: inputPlaceholder,
2420
+ onChange: handleInputChange,
2421
+ className: "form-control",
2422
+ style: {
2423
+ paddingRight: 25
2424
+ },
2425
+ disabled: inputDisabled
2426
+ }, rest)), inputDisabled || !noCompanies && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("i", {
2427
+ "aria-label": "Clear",
2428
+ style: {
2429
+ position: 'absolute',
2430
+ top: 10,
2431
+ right: 10,
2432
+ cursor: 'pointer',
2433
+ opacity: '65%'
2434
+ },
2435
+ onClick: handleInputClear,
2436
+ className: "fa fa-close"
2437
+ })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement((react_select_lib_Async__WEBPACK_IMPORTED_MODULE_4___default()) // Passing null if no label and value to show the placeholder
2438
+ , _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({
2439
+ value: theValue.label && theValue.value ? theValue : null,
2440
+ inputId: id,
2441
+ tabSelectsValue: tabSelectsValue,
2442
+ placeholder: DDLPlaceholder,
2443
+ onChange: handleChange,
2444
+ defaultOptions: true,
2445
+ loadOptions: getCompanies,
2446
+ isMulti: isMultiOptional,
2447
+ className: className,
2448
+ styles: selectStyles
2449
+ }, rest)), hasError && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement("p", {
2450
+ className: "error-label"
2451
+ }, error));
2452
+ };
2453
+
2454
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RegistrationCompanyInput);
2455
+ RegistrationCompanyInput.defaultProps = {
2456
+ inputPlaceholder: 'Enter your company',
2457
+ DDLPlaceholder: 'Select a company',
2458
+ disabled: false,
2459
+ tabSelectsValue: false
2460
+ };
2461
+ RegistrationCompanyInput.propTypes = {
2462
+ onError: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func.isRequired)
2463
+ };
2464
+ })();
2465
+
2466
+ /******/ return __webpack_exports__;
2467
+ /******/ })()
2468
+ ;
2469
+ });
2470
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy9pbnB1dHMvcmVnaXN0cmF0aW9uLWNvbXBhbnktaW5wdXQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBQ08sTUFBTVksZUFBZSxHQUFHLGlCQUF4QjtBQUNBLE1BQU1DLFdBQVcsR0FBRyxhQUFwQjtBQUNBLE1BQU1DLGlCQUFpQixHQUFHLG1CQUExQjtBQUNBLE1BQU1DLGlCQUFpQixHQUFHLG1CQUExQjtBQUNBLE1BQU1DLG1CQUFtQixHQUFHLHFCQUE1QjtBQUNBLE1BQU1DLDJCQUEyQixHQUFHLDZCQUFwQztBQUNBLE1BQU1DLDhCQUE4QixHQUFHLFdBQXZDO0FBQ0EsTUFBTUMsNEJBQTRCLEdBQUcsU0FBckM7QUFDQSxNQUFNQywwQkFBMEIsR0FBRyxPQUFuQztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLGtCQUF6QjtBQUVBLE1BQU1DLFVBQVUsR0FBRyxDQUFDQyxXQUFELEVBQWNDLE9BQWQsRUFBdUJDLFlBQXZCLEVBQXFDQyxTQUFTLEdBQUcsQ0FBakQsRUFBb0RDLFlBQVksR0FBRyxJQUFuRSxLQUE2RUMsUUFBRCxJQUFjO0VBRWhIbEIsdURBQWEsQ0FBQ2EsV0FBRCxFQUFjRyxTQUFkLEVBQXlCQyxZQUF6QixFQUF1Q0gsT0FBdkMsQ0FBYjtFQUVBSSxRQUFRLENBQUM7SUFDTEMsSUFBSSxFQUFFakIsZUFERDtJQUVMa0IsT0FBTyxFQUFFO01BQUVMO0lBQUY7RUFGSixDQUFELENBQVI7QUFJSCxDQVJNO0FBVUEsTUFBTU0sUUFBUSxHQUFJQyxPQUFELElBQWEsQ0FBQ0osUUFBRCxFQUFXSyxR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QixHQUFtQ2tOLFFBQW5DLEdBQThDLElBRnpEO0lBR0ksT0FBTyxFQUFFcFksRUFIYjtJQUlJLGVBQWUsRUFBRWlZLGVBSnJCO0lBS0ksV0FBVyxFQUFFRCxjQUxqQjtJQU1JLFFBQVEsRUFBRW9CLFlBTmQ7SUFPSSxjQUFjLEVBQUUsSUFQcEI7SUFRSSxXQUFXLEVBQUVTLFlBUmpCO0lBU0ksT0FBTyxFQUFFbEIsZUFUYjtJQVVJLFNBQVMsRUFBRWQsU0FWZjtJQVdJLE1BQU0sRUFBRUs7RUFYWixHQVlRQyxJQVpSLEVBbkJSLEVBa0NLWSxRQUFRLGlCQUNMO0lBQUcsU0FBUyxFQUFDO0VBQWIsR0FBNEJ0VCxLQUE1QixDQW5DUixDQURKO0FBeUNILENBL0pEOztBQWlLQSxpRUFBZStSLHdCQUFmO0FBRUFBLHdCQUF3QixDQUFDZ0QsWUFBekIsR0FBd0M7RUFDcEN6QyxnQkFBZ0IsRUFBRSxvQkFEa0I7RUFFcENDLGNBQWMsRUFBRSxrQkFGb0I7RUFHcENKLFFBQVEsRUFBRSxLQUgwQjtFQUlwQ0ssZUFBZSxFQUFFO0FBSm1CLENBQXhDO0FBT0FULHdCQUF3QixDQUFDaUQsU0FBekIsR0FBcUM7RUFDakMzQyxPQUFPLEVBQUVSLG1FQUF5QnFEO0FBREQsQ0FBckMsQyIsInNvdXJjZXMiOlsid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL2NvbXBvbmVudHMvc2VjdXJpdHkvYWN0aW9ucy5qcyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvY29tcG9uZW50cy9zZWN1cml0eS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL2NvbXBvbmVudHMvc2VjdXJpdHkvbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvdXRpbHMvYWN0aW9ucy5qcyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvdXRpbHMvY3J5cHRvLmpzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi8uL3NyYy91dGlscy9tZXRob2RzLmpzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi8uL3NyYy91dGlscy9xdWVyeS1hY3Rpb25zLmpzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiYnJvd3Nlci10YWJzLWxvY2tcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJjcnlwdG8tanMvZW5jLWJhc2U2NHVybFwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcImNyeXB0by1qcy9lbmMtaGV4XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiY3J5cHRvLWpzL3NoYTI1NlwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcImkxOG4tcmVhY3QvZGlzdC9pMThuLXJlYWN0XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiaWR0b2tlbi12ZXJpZmllclwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcImxvZGFzaFwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcIm1vbWVudC10aW1lem9uZVwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcInByb3AtdHlwZXNcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJyZWFjdFwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcInJlYWN0LXNlbGVjdC9saWIvQXN5bmNcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJzdXBlcmFnZW50L2xpYi9jbGllbnRcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJzd2VldGFsZXJ0MlwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcInVyaWpzXCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi8uL3NyYy9jb21wb25lbnRzL2lucHV0cy9yZWdpc3RyYXRpb24tY29tcGFueS1pbnB1dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIm9wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvblwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJvcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb25cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wib3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IFQgZnJvbSBcImkxOG4tcmVhY3QvZGlzdC9pMThuLXJlYWN0XCI7XG5pbXBvcnQge2F1dGhFcnJvckhhbmRsZXIsIGNyZWF0ZUFjdGlvbiwgZ2V0UmVxdWVzdCwgc2hvd01lc3NhZ2UsIHN0YXJ0TG9hZGluZywgc3RvcExvYWRpbmd9IGZyb20gXCIuLi8uLi91dGlscy9hY3Rpb25zXCI7XG5pbXBvcnQge2J1aWxkQVBJQmFzZVVybCwgZ2V0QWxsb3dlZFVzZXJHcm91cHN9IGZyb20gJy4uLy4uL3V0aWxzL21ldGhvZHMnO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4sIHN0b3JlQXV0aEluZm8sIGluaXRMb2dPdXR9IGZyb20gJy4vbWV0aG9kcyc7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgU0VUX0xPR0dFRF9VU0VSID0gJ1NFVF9MT0dHRURfVVNFUic7XG5leHBvcnQgY29uc3QgTE9HT1VUX1VTRVIgPSAnTE9HT1VUX1VTRVInO1xuZXhwb3J0IGNvbnN0IFJFUVVFU1RfVVNFUl9JTkZPID0gJ1JFUVVFU1RfVVNFUl9JTkZPJztcbmV4cG9ydCBjb25zdCBSRUNFSVZFX1VTRVJfSU5GTyA9ICdSRUNFSVZFX1VTRVJfSU5GTyc7XG5leHBvcnQgY29uc3QgQ0xFQVJfU0VTU0lPTl9TVEFURSA9ICdDTEVBUl9TRVNTSU9OX1NUQVRFJztcbmV4cG9ydCBjb25zdCBVUERBVEVfU0VTU0lPTl9TVEFURV9TVEFUVVMgPSAnVVBEQVRFX1NFU1NJT05fU1RBVEVfU1RBVFVTJztcbmV4cG9ydCBjb25zdCBTRVNTSU9OX1NUQVRFX1NUQVRVU19VTkNIQU5HRUQgPSAndW5jaGFuZ2VkJztcbmV4cG9ydCBjb25zdCBTRVNTSU9OX1NUQVRFX1NUQVRVU19DSEFOR0VEID0gJ2NoYW5nZWQnO1xuZXhwb3J0IGNvbnN0IFNFU1NJT05fU1RBVEVfU1RBVFVTX0VSUk9SID0gJ2Vycm9yJztcbmV4cG9ydCBjb25zdCBVUERBVEVfVVNFUl9JTkZPID0gJ1VQREFURV9VU0VSX0lORk8nO1xuXG5leHBvcnQgY29uc3Qgb25Vc2VyQXV0aCA9IChhY2Nlc3NUb2tlbiwgaWRUb2tlbiwgc2Vzc2lvblN0YXRlLCBleHBpcmVzSW4gPSAwLCByZWZyZXNoVG9rZW4gPSBudWxsKSA9PiAoZGlzcGF0Y2gpID0+IHtcblxuICAgIHN0b3JlQXV0aEluZm8oYWNjZXNzVG9rZW4sIGV4cGlyZXNJbiwgcmVmcmVzaFRva2VuLCBpZFRva2VuKTtcblxuICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogU0VUX0xPR0dFRF9VU0VSLFxuICAgICAgICBwYXlsb2FkOiB7IHNlc3Npb25TdGF0ZSB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBkb0xvZ291dCA9IChiYWNrVXJsKSA9PiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBMT0dPVVRfVVNFUixcbiAgICAgICAgcGF5bG9hZDoge2JhY2tVcmw6IGJhY2tVcmx9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VySW5mbyA9IChleHBhbmQgPSAnZ3JvdXBzJywgZmllbGRzPScnLCBiYWNrVXJsID0gbnVsbCwgaGlzdG9yeSA9IG51bGwsIGVycm9ySGFuZGxlciA9IG51bGwgKSA9PlxuICAgIGFzeW5jIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcblxuICAgIGxldCBBbGxvd2VkVXNlckdyb3VwcyA9IGdldEFsbG93ZWRVc2VyR3JvdXBzKCk7XG4gICAgQWxsb3dlZFVzZXJHcm91cHMgPSBBbGxvd2VkVXNlckdyb3VwcyAhPT0gJycgPyBBbGxvd2VkVXNlckdyb3Vwcy5zcGxpdCgnICcpIDogW107XG4gICAgbGV0IHtsb2dnZWRVc2VyU3RhdGV9ID0gZ2V0U3RhdGUoKTtcbiAgICBsZXQge21lbWJlcn0gPSBsb2dnZWRVc2VyU3RhdGU7XG5cbiAgICBsZXQgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuXG4gICAgaWYgKG1lbWJlciAhPSBudWxsKSB7XG4gICAgICAgIGlmKGhpc3RvcnkgIT0gbnVsbCAmJiBiYWNrVXJsICE9IG51bGwpXG4gICAgICAgICAgICBoaXN0b3J5LnB1c2goYmFja1VybCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBpZihlcnJvckhhbmRsZXIgPT0gbnVsbClcbiAgICAgICAgZXJyb3JIYW5kbGVyID0gYXV0aEVycm9ySGFuZGxlcjtcblxuICAgIGRpc3BhdGNoKHN0YXJ0TG9hZGluZygpKTtcblxuICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgIGFjY2Vzc190b2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgIGV4cGFuZCA6IGV4cGFuZCxcbiAgICB9XG5cbiAgICBpZihmaWVsZHMpe1xuICAgICAgICBwYXJhbXNbJ2ZpZWxkcyddID0gZmllbGRzO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRSZXF1ZXN0KFxuICAgICAgICBjcmVhdGVBY3Rpb24oUkVRVUVTVF9VU0VSX0lORk8pLFxuICAgICAgICBjcmVhdGVBY3Rpb24oUkVDRUlWRV9VU0VSX0lORk8pLFxuICAgICAgICBidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvbWVtYmVycy9tZWApLFxuICAgICAgICBlcnJvckhhbmRsZXJcbiAgICApKHBhcmFtcykoZGlzcGF0Y2gsIGdldFN0YXRlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0b3BMb2FkaW5nKCkpO1xuXG4gICAgICAgICAgICBsZXQge21lbWJlcn0gPSBnZXRTdGF0ZSgpLmxvZ2dlZFVzZXJTdGF0ZTtcbiAgICAgICAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBlcnJvcl9tZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0VSUk9SJyxcbiAgICAgICAgICAgICAgICAgICAgaHRtbDogVC50cmFuc2xhdGUoXCJlcnJvcnMudXNlcl9ub3Rfc2V0XCIpLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzaG93TWVzc2FnZShlcnJvcl9tZXNzYWdlLCBpbml0TG9nT3V0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIHVzZXIgZ3JvdXBzICggaWYgZGVmaW5lZCApXG4gICAgICAgICAgICBpZiAoQWxsb3dlZFVzZXJHcm91cHMubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWRHcm91cHMgPSBtZW1iZXIuZ3JvdXBzLmZpbHRlcigoZ3JvdXAsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxsb3dlZFVzZXJHcm91cHMuaW5jbHVkZXMoZ3JvdXAuY29kZSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZEdyb3Vwcy5sZW5ndGggPT09IDApIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JfbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRVJST1InLFxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbDogVC50cmFuc2xhdGUoXCJlcnJvcnMudXNlcl9ub3RfYXV0aHpcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2hvd01lc3NhZ2UoZXJyb3JfbWVzc2FnZSwgaW5pdExvZ091dCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihoaXN0b3J5ICE9IG51bGwgJiYgYmFja1VybCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGhpc3RvcnkucHVzaChiYWNrVXJsKTtcbiAgICAgICAgfVxuICAgICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVXNlckluZm8gPSAodXBkYXRlZE1lbWJlcikgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGxldCB7bG9nZ2VkVXNlclN0YXRlfSA9IGdldFN0YXRlKCk7XG4gICAgbGV0IHttZW1iZXJ9ID0gbG9nZ2VkVXNlclN0YXRlO1xuICAgIGlmKG1lbWJlciA9PSBudWxsKXtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNZW1iZXIgaXMgbm90IHNldC5cIik7XG4gICAgfVxuICAgIGlmKHVwZGF0ZWRNZW1iZXIuaWQgIT0gbWVtYmVyLmlkKXtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNZW1iZXIgaXMgbm90IHRoZSBzYW1lLlwiKTtcbiAgICB9XG4gICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBVUERBVEVfVVNFUl9JTkZPLFxuICAgICAgICBwYXlsb2FkOiB7Li4udXBkYXRlZE1lbWJlcn1cbiAgICB9KTtcblxufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlU2Vzc2lvblN0YXRlU3RhdHVzID0gKG5ld1N0YXR1cykgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVBEQVRFX1NFU1NJT05fU1RBVEVfU1RBVFVTLFxuICAgICAgICBwYXlsb2FkOiB7c2Vzc2lvblN0YXRlU3RhdHVzOiBuZXdTdGF0dXN9XG4gICAgfSk7XG59IiwiZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8gPSAnQVVUSF9FUlJPUl9NSVNTSU5HX0FVVEhfSU5GTyc7XG5leHBvcnQgY29uc3QgQVVUSF9FUlJPUl9NSVNTSU5HX1JFRlJFU0hfVE9LRU4gPSAnQVVUSF9FUlJPUl9NSVNTSU5HX1JFRlJFU0hfVE9LRU4nO1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfQUNDRVNTX1RPS0VOX0VYUElSRUQgPSAnQVVUSF9FUlJPUl9BQ0NFU1NfVE9LRU5fRVhQSVJFRCc7XG5leHBvcnQgY29uc3QgQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1IgPSAnQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1InXG5leHBvcnQgY29uc3QgQVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1IgPSAnQVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1InO1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfSURfVE9LRU5fSU5WQUxJRCA9ICdBVVRIX0VSUk9SX0lEX1RPS0VOX0lOVkFMSUQnO1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfTUlTU0lOR19PVFBfUEFSQU0gPSAnQVVUSF9FUlJPUl9NSVNTSU5HX09UUF9QQVJBTSc7XG4iLCJpbXBvcnQge1xuICAgIGJhc2U2NFVSTEVuY29kZSxcbiAgICBnZXRBdXRoQ2FsbGJhY2ssXG4gICAgZ2V0Q3VycmVudExvY2F0aW9uLFxuICAgIGdldEN1cnJlbnRQYXRoTmFtZSxcbiAgICBnZXRGcm9tTG9jYWxTdG9yYWdlLFxuICAgIHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgZ2V0T3JpZ2luLFxuICAgIHB1dE9uTG9jYWxTdG9yYWdlLFxuICAgIHJldHJ5UHJvbWlzZSxcbiAgICBzZXRTZXNzaW9uQ2xlYXJpbmdTdGF0ZSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL21ldGhvZHNcIjtcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3N1cGVyYWdlbnQvbGliL2NsaWVudCc7XG5pbXBvcnQgTG9jayBmcm9tICdicm93c2VyLXRhYnMtbG9jayc7XG5cbmxldCBodHRwID0gcmVxdWVzdDtcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IGxvY2sgPSBuZXcgTG9jaygpO1xuXG5jb25zdCBHRVRfVE9LRU5fU0lMRU5UTFlfTE9DS19LRVkgPSAnb3BlbnN0YWNrdWljb3JlLmxvY2suZ2V0VG9rZW5TaWxlbnRseSc7XG5jb25zdCBOT05DRV9MRU4gPSAxNjtcbmV4cG9ydCBjb25zdCBBQ0NFU1NfVE9LRU5fU0tFV19USU1FID0gMjA7XG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVFlQRV9JTVBMSUNJVCA9IFwidG9rZW4gaWRfdG9rZW5cIjtcbmV4cG9ydCBjb25zdCBSRVNQT05TRV9UWVBFX0NPREUgPSAnY29kZSc7XG5jb25zdCBBVVRIX0lORk8gPSAnYXV0aEluZm8nO1xuY29uc3QgTk9OQ0UgPSAnbm9uY2UnO1xuY29uc3QgUEtDRSA9ICdwa2NlJztcblxuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcbmltcG9ydCBJZFRva2VuVmVyaWZpZXIgZnJvbSBcImlkdG9rZW4tdmVyaWZpZXJcIjtcbmltcG9ydCB7U0VUX0xPR0dFRF9VU0VSfSBmcm9tIFwiLi9hY3Rpb25zXCI7XG5pbXBvcnQge2dldFJhbmRvbUJ5dGVzLCBnZXRTSEEyNTZ9IGZyb20gXCIuLi8uLi91dGlscy9jcnlwdG9cIjtcblxuaW1wb3J0IHtcbiAgICBBVVRIX0VSUk9SX0FDQ0VTU19UT0tFTl9FWFBJUkVELFxuICAgIEFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8sXG4gICAgQVVUSF9FUlJPUl9NSVNTSU5HX1JFRlJFU0hfVE9LRU4sXG4gICAgQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1IsXG4gICAgQVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1IsIEFVVEhfRVJST1JfSURfVE9LRU5fSU5WQUxJRCwgQVVUSF9FUlJPUl9NSVNTSU5HX09UUF9QQVJBTSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBiYWNrVXJsXG4gKiBAcGFyYW0gcHJvbXB0XG4gKiBAcGFyYW0gdG9rZW5JZEhpbnRcbiAqIEBwYXJhbSBwcm92aWRlclxuICogQHBhcmFtIGxvZ2luSGludFxuICogQHBhcmFtIG90cExvZ2luSGludFxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBdXRoVXJsID0gKFxuICAgIGJhY2tVcmwgPSBudWxsLFxuICAgIHByb21wdCA9IG51bGwsXG4gICAgdG9rZW5JZEhpbnQgPSBudWxsLFxuICAgIHByb3ZpZGVyID0gbnVsbCxcbiAgICBsb2dpbkhpbnQgPSBudWxsLFxuICAgIG90cExvZ2luSGludCA9IG51bGwpID0+IHtcblxuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG4gICAgbGV0IHJlZGlyZWN0VXJpID0gZ2V0QXV0aENhbGxiYWNrKCk7XG4gICAgbGV0IGJhc2VVcmwgPSBnZXRPQXV0aDJJRFBCYXNlVXJsKCk7XG4gICAgbGV0IHNjb3BlcyA9IGdldE9BdXRoMlNjb3BlcygpO1xuICAgIGxldCBmbG93ID0gZ2V0T0F1dGgyRmxvdygpO1xuXG4gICAgaWYgKGJhY2tVcmwgIT0gbnVsbClcbiAgICAgICAgcmVkaXJlY3RVcmkgKz0gYD9CYWNrVXJsPSR7ZW5jb2RlVVJJKGJhY2tVcmwpfWA7XG5cbiAgICBsZXQgbm9uY2UgPSBjcmVhdGVOb25jZShOT05DRV9MRU4pO1xuXG4gICAgLy8gc3RvcmUgbm9uY2UgdG8gY2hlY2sgaXQgbGF0ZXJcbiAgICBwdXRPbkxvY2FsU3RvcmFnZShOT05DRSwgbm9uY2UpO1xuICAgIGxldCB1cmwgPSBVUkkoYCR7YmFzZVVybH0vb2F1dGgyL2F1dGhgKTtcblxuICAgIGxldCBxdWVyeSA9IHtcbiAgICAgICAgXCJyZXNwb25zZV90eXBlXCI6IGVuY29kZVVSSShmbG93KSxcbiAgICAgICAgXCJzY29wZVwiOiBlbmNvZGVVUkkoc2NvcGVzKSxcbiAgICAgICAgXCJub25jZVwiOiBub25jZSxcbiAgICAgICAgXCJyZXNwb25zZV9tb2RlXCI6ICdmcmFnbWVudCcsXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwicmVkaXJlY3RfdXJpXCI6IGVuY29kZVVSSShyZWRpcmVjdFVyaSlcbiAgICB9O1xuXG4gICAgaWYgKGZsb3cgPT09IFJFU1BPTlNFX1RZUEVfQ09ERSkge1xuICAgICAgICBjb25zdCBwa2NlID0gY3JlYXRlUEtDRUNvZGVzKClcbiAgICAgICAgcHV0T25Mb2NhbFN0b3JhZ2UoUEtDRSwgSlNPTi5zdHJpbmdpZnkocGtjZSkpO1xuICAgICAgICBxdWVyeVsnY29kZV9jaGFsbGVuZ2UnXSA9IHBrY2UuY29kZUNoYWxsZW5nZTtcbiAgICAgICAgcXVlcnlbJ2NvZGVfY2hhbGxlbmdlX21ldGhvZCddID0gJ1MyNTYnO1xuICAgICAgICBxdWVyeVsnYXBwcm92YWxfcHJvbXB0J10gPSAnZm9yY2UnO1xuICAgIH1cblxuICAgIGlmIChwcm9tcHQpIHtcbiAgICAgICAgcXVlcnlbJ3Byb21wdCddID0gcHJvbXB0O1xuICAgIH1cblxuICAgIGlmIChzY29wZXMgJiYgc2NvcGVzLmluY2x1ZGVzKCdvZmZsaW5lX2FjY2VzcycpKSB7XG4gICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBmb3JjZSBwcm9tcHQ9Y29uc2VudCBiYyB3ZSBhcmUgcmVxdWVzdGluZyBhbiBvZmZsaW5lIGFjY2Vzc1xuICAgICAgICAvLyBhbmQgd2UgbmVlZCB0byBsZXQgdGhlIHVzZXIga25vd1xuICAgICAgICBxdWVyeVsncHJvbXB0J10gPSAnY29uc2VudCc7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuSWRIaW50KSB7XG4gICAgICAgIHF1ZXJ5WydpZF90b2tlbl9oaW50J10gPSB0b2tlbklkSGludDtcbiAgICB9XG5cbiAgICBpZiAocHJvdmlkZXIpIHtcbiAgICAgICAgcXVlcnlbJ3Byb3ZpZGVyJ10gPSBwcm92aWRlcjtcbiAgICB9XG5cbiAgICBpZiAob3RwTG9naW5IaW50KSB7XG4gICAgICAgIHF1ZXJ5WydvdHBfbG9naW5faGludCddID0gb3RwTG9naW5IaW50O1xuICAgIH1cblxuICAgIGlmIChsb2dpbkhpbnQpIHtcbiAgICAgICAgcXVlcnlbJ2xvZ2luX2hpbnQnXSA9IGVuY29kZVVSSShsb2dpbkhpbnQpO1xuICAgIH1cblxuICAgIHVybCA9IHVybC5xdWVyeShxdWVyeSk7XG4gICAgLy9jb25zb2xlLmxvZyhgZ2V0QXV0aFVybCAke3VybC50b1N0cmluZygpfWApO1xuICAgIHJldHVybiB1cmw7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2dvdXRVcmwgPSAoaWRUb2tlbikgPT4ge1xuICAgIGxldCBiYXNlVXJsID0gZ2V0T0F1dGgySURQQmFzZVVybCgpO1xuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG4gICAgbGV0IHVybCA9IFVSSShgJHtiYXNlVXJsfS9vYXV0aDIvZW5kLXNlc3Npb25gKTtcbiAgICBsZXQgc3RhdGUgPSBjcmVhdGVOb25jZShOT05DRV9MRU4pO1xuICAgIGxldCBwb3N0TG9nT3V0VXJpID0gZ2V0T3JpZ2luKCkgKyAnL2F1dGgvbG9nb3V0JztcbiAgICAvLyBzdG9yZSBub25jZSB0byBjaGVjayBpdCBsYXRlclxuICAgIHB1dE9uTG9jYWxTdG9yYWdlKCdwb3N0X2xvZ291dF9zdGF0ZScsIHN0YXRlKTtcbiAgICAvKipcbiAgICAgKiBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgc2hvdWxkIGJlIGxpc3RlZCBvbiBvYXV0aDIgY2xpZW50IHNldHRpbmdzXG4gICAgICogb24gSURQXG4gICAgICogXCJTZWN1cml0eSBTZXR0aW5nc1wiIFRhYiAtPiBMb2dvdXQgT3B0aW9ucyAtPiBQb3N0IExvZ291dCBVcmlzXG4gICAgICovXG4gICAgcmV0dXJuIHVybC5xdWVyeSh7XG4gICAgICAgIFwiaWRfdG9rZW5faGludFwiOiBpZFRva2VuLFxuICAgICAgICBcInBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaVwiOiBlbmNvZGVVUkkocG9zdExvZ091dFVyaSksXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwic3RhdGVcIjogc3RhdGUsXG4gICAgfSk7XG59XG5cbmNvbnN0IGNyZWF0ZU5vbmNlID0gKGxlbikgPT4ge1xuICAgIGxldCBwb3NzaWJsZSA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtcbiAgICBsZXQgbm9uY2UgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIG5vbmNlICs9IHBvc3NpYmxlLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb3NzaWJsZS5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vbmNlO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gYmFja1VybFxuICogQHBhcmFtIHByb3ZpZGVyXG4gKiBAcGFyYW0gcHJvbXB0XG4gKiBAcGFyYW0gbG9naW5IaW50XG4gKiBAcGFyYW0gb3RwTG9naW5IaW50XG4gKi9cbmV4cG9ydCBjb25zdCBkb0xvZ2luID0gKFxuICAgIGJhY2tVcmwgPSBudWxsLFxuICAgIHByb3ZpZGVyID0gbnVsbCxcbiAgICBwcm9tcHQgPSBudWxsLFxuICAgIGxvZ2luSGludCA9IG51bGwsXG4gICAgb3RwTG9naW5IaW50ID0gbnVsbFxuKSA9PiB7XG4gICAgbGV0IHVybCA9IGdldEF1dGhVcmwoYmFja1VybCwgcHJvbXB0LCBudWxsLCBwcm92aWRlciwgbG9naW5IaW50LCBvdHBMb2dpbkhpbnQpO1xuICAgIGxldCBsb2NhdGlvbiA9IGdldEN1cnJlbnRMb2NhdGlvbigpXG4gICAgbG9jYXRpb24ucmVwbGFjZSh1cmwudG9TdHJpbmcoKSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBiYWNrVXJsXG4gKiBAcGFyYW0gbG9naW5IaW50XG4gKiBAcGFyYW0gb3RwTG9naW5IaW50XG4gKi9cbmV4cG9ydCBjb25zdCBkb0xvZ2luQmFzaWNMb2dpbiA9IChiYWNrVXJsID0gbnVsbCwgbG9naW5IaW50ID0gbnVsbCwgb3RwTG9naW5IaW50ID0gbnVsbCkgPT4ge1xuICAgIGRvTG9naW4oYmFja1VybCwgbnVsbCwgbnVsbCwgbG9naW5IaW50LCBvdHBMb2dpbkhpbnQpO1xufVxuXG5jb25zdCBjcmVhdGVQS0NFQ29kZXMgPSAoKSA9PiB7XG4gICAgY29uc3QgY29kZVZlcmlmaWVyID0gYmFzZTY0VVJMRW5jb2RlKGdldFJhbmRvbUJ5dGVzKDY0KSlcbiAgICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gZ2V0U0hBMjU2KGNvZGVWZXJpZmllciwgJ0Jhc2U2NHVybCcpXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUoKVxuICAgIGNvbnN0IGNvZGVQYWlyID0ge1xuICAgICAgICBjb2RlVmVyaWZpZXIsXG4gICAgICAgIGNvZGVDaGFsbGVuZ2UsXG4gICAgICAgIGNyZWF0ZWRBdFxuICAgIH1cbiAgICByZXR1cm4gY29kZVBhaXJcbn1cblxuZXhwb3J0IGNvbnN0IGVtaXRBY2Nlc3NUb2tlbiA9IGFzeW5jIChjb2RlLCBiYWNrVXJsID0gbnVsbCkgPT4ge1xuXG4gICAgbGV0IGJhc2VVcmwgPSBnZXRPQXV0aDJJRFBCYXNlVXJsKCk7XG4gICAgbGV0IG9hdXRoMkNsaWVudElkID0gZ2V0T0F1dGgyQ2xpZW50SWQoKTtcbiAgICBsZXQgcmVkaXJlY3RVcmkgPSBnZXRBdXRoQ2FsbGJhY2soKTtcbiAgICBsZXQgcGtjZSA9IEpTT04ucGFyc2UoZ2V0RnJvbUxvY2FsU3RvcmFnZShQS0NFLCB0cnVlKSk7XG5cbiAgICBpZiAoYmFja1VybCAhPSBudWxsKVxuICAgICAgICByZWRpcmVjdFVyaSArPSBgP0JhY2tVcmw9JHtlbmNvZGVVUkkoYmFja1VybCl9YDtcblxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICdjb2RlJzogY29kZSxcbiAgICAgICAgJ2dyYW50X3R5cGUnOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgJ2NvZGVfdmVyaWZpZXInOiBwa2NlLmNvZGVWZXJpZmllcixcbiAgICAgICAgXCJjbGllbnRfaWRcIjogZW5jb2RlVVJJKG9hdXRoMkNsaWVudElkKSxcbiAgICAgICAgXCJyZWRpcmVjdF91cmlcIjogZW5jb2RlVVJJKHJlZGlyZWN0VXJpKVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgICAvL2NvbnN0IHJlc3BvbnNlID0gYXdhaXQgaHR0cC5wb3N0KGAke2Jhc2VVcmx9L29hdXRoMi90b2tlbmAsIHBheWxvYWQpO1xuICAgICAgICAvL2NvbnN0IHtib2R5OiB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCBpZF90b2tlbiwgZXhwaXJlc19pbn19ID0gcmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vb2F1dGgyL3Rva2VuYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUmVxdWVzdCBmYWlsZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBsZXQge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbiwgaWRfdG9rZW4sIGV4cGlyZXNfaW4sIGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbn0gPSBqc29uO1xuICAgICAgICByZXR1cm4ge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbiwgaWRfdG9rZW4sIGV4cGlyZXNfaW4sIGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbn1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYXJBY2Nlc3NUb2tlbiA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoXG4gICAgICAgIGF3YWl0IHJldHJ5UHJvbWlzZShcbiAgICAgICAgICAgICgpID0+IGxvY2suYWNxdWlyZUxvY2soR0VUX1RPS0VOX1NJTEVOVExZX0xPQ0tfS0VZLCA1MDAwKSxcbiAgICAgICAgICAgIDEwXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdHJ5IHtcblxuICAgICAgICAgICAgbGV0IGF1dGhJbmZvID0gZ2V0QXV0aEluZm8oKTtcblxuICAgICAgICAgICAgaWYgKCFhdXRoSW5mbykge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKEFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQge2FjY2Vzc1Rva2VuLCBleHBpcmVzSW4sIGFjY2Vzc1Rva2VuVXBkYXRlZEF0LCByZWZyZXNoVG9rZW59ID0gYXV0aEluZm87XG5cbiAgICAgICAgICAgIHN0b3JlQXV0aEluZm8obnVsbCwgMCwgcmVmcmVzaFRva2VuKVxuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBsb2NrLnJlbGVhc2VMb2NrKEdFVF9UT0tFTl9TSUxFTlRMWV9MT0NLX0tFWSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRBY2Nlc3NUb2tlbiA9IGFzeW5jICgpID0+IHtcblxuICAgIGlmIChcbiAgICAgICAgYXdhaXQgcmV0cnlQcm9taXNlKFxuICAgICAgICAgICAgKCkgPT4gbG9jay5hY3F1aXJlTG9jayhHRVRfVE9LRU5fU0lMRU5UTFlfTE9DS19LRVksIDUwMDApLFxuICAgICAgICAgICAgMTBcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICBsZXQgYXV0aEluZm8gPSBnZXRBdXRoSW5mbygpO1xuXG4gICAgICAgICAgICBpZiAoIWF1dGhJbmZvKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoQVVUSF9FUlJPUl9NSVNTSU5HX0FVVEhfSU5GTyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB7YWNjZXNzVG9rZW4sIGV4cGlyZXNJbiwgYWNjZXNzVG9rZW5VcGRhdGVkQXQsIHJlZnJlc2hUb2tlbn0gPSBhdXRoSW5mbztcbiAgICAgICAgICAgIGxldCBmbG93ID0gZ2V0T0F1dGgyRmxvdygpO1xuICAgICAgICAgICAgLy8gY2hlY2sgbGlmZSB0aW1lXG4gICAgICAgICAgICBsZXQgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgICAgICBsZXQgdGltZUVsYXBzZWRTZWNzID0gKG5vdyAtIGFjY2Vzc1Rva2VuVXBkYXRlZEF0KTtcbiAgICAgICAgICAgIGV4cGlyZXNJbiA9IChleHBpcmVzSW4gLSBBQ0NFU1NfVE9LRU5fU0tFV19USU1FKTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGdldEFjY2Vzc1Rva2VuIG5vdyAke25vd30gYWNjZXNzVG9rZW5VcGRhdGVkQXQgJHthY2Nlc3NUb2tlblVwZGF0ZWRBdH0gdGltZUVsYXBzZWRTZWNzICR7dGltZUVsYXBzZWRTZWNzfSBleHBpcmVzSW4gJHtleHBpcmVzSW59LmApO1xuXG4gICAgICAgICAgICBpZiAodGltZUVsYXBzZWRTZWNzID4gZXhwaXJlc0luIHx8IGFjY2Vzc1Rva2VuID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgZ2V0QWNjZXNzVG9rZW4gYWNjZXNzIHRva2VuIGV4cGlyZWRgKVxuICAgICAgICAgICAgICAgIGlmIChmbG93ID09PSBSRVNQT05TRV9UWVBFX0NPREUgJiYgdXNlT0F1dGgyUmVmcmVzaFRva2VuKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZ2V0QWNjZXNzVG9rZW4gZ2V0dGluZyBuZXcgYWNjZXNzIHRva2VuLCBhY2Nlc3MgdG9rZW4gZ290IHZvaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyQXV0aEluZm8oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKEFVVEhfRVJST1JfTUlTU0lOR19SRUZSRVNIX1RPS0VOKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByZWZyZXNoQWNjZXNzVG9rZW4ocmVmcmVzaFRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHthY2Nlc3NfdG9rZW4sIGV4cGlyZXNfaW4sIHJlZnJlc2hfdG9rZW59ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGdldEFjY2Vzc1Rva2VuIGFjY2Vzc190b2tlbiAke2FjY2Vzc190b2tlbn0gZXhwaXJlc19pbiAke2V4cGlyZXNfaW59IHJlZnJlc2hfdG9rZW4gJHtyZWZyZXNoX3Rva2VufWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlZnJlc2hfdG9rZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuID0gbnVsbDsgLy8gbm90IHVzaW5nIHJvdGF0ZSBwb2xpY3lcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdG9yZUF1dGhJbmZvKGFjY2Vzc190b2tlbiwgZXhwaXJlc19pbiwgcmVmcmVzaF90b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGdldEFjY2Vzc1Rva2VuIGFjY2Vzc190b2tlbiAke2FjY2Vzc190b2tlbn0gW05FV11gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc190b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xlYXJBdXRoSW5mbygpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKEFVVEhfRVJST1JfQUNDRVNTX1RPS0VOX0VYUElSRUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhgZ2V0QWNjZXNzVG9rZW4gYWNjZXNzX3Rva2VuICR7YWNjZXNzVG9rZW59IFtDQUNIRURdYCk7XG4gICAgICAgICAgICByZXR1cm4gYWNjZXNzVG9rZW47XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBsb2NrLnJlbGVhc2VMb2NrKEdFVF9UT0tFTl9TSUxFTlRMWV9MT0NLX0tFWSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1IpO1xufVxuXG5leHBvcnQgY29uc3QgcmVmcmVzaEFjY2Vzc1Rva2VuID0gYXN5bmMgKHJlZnJlc2hfdG9rZW4pID0+IHtcblxuICAgIGxldCBiYXNlVXJsID0gZ2V0T0F1dGgySURQQmFzZVVybCgpO1xuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAnZ3JhbnRfdHlwZSc6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgXCJjbGllbnRfaWRcIjogZW5jb2RlVVJJKG9hdXRoMkNsaWVudElkKSxcbiAgICAgICAgXCJyZWZyZXNoX3Rva2VuXCI6IHJlZnJlc2hfdG9rZW5cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9vYXV0aDIvdG9rZW5gLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IGdldEN1cnJlbnRQYXRoTmFtZSgpO1xuICAgICAgICAgICAgICAgIHNldFNlc3Npb25DbGVhcmluZ1N0YXRlKHRydWUpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGAke0FVVEhfRVJST1JfUkVGUkVTSF9UT0tFTl9SRVFVRVNUX0VSUk9SfTogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYCR7QVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1J9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGxldCB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCBleHBpcmVzX2lufSA9IGpzb247XG4gICAgICAgIHJldHVybiB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCBleHBpcmVzX2lufVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3RvcmVBdXRoSW5mbyA9IChhY2Nlc3NUb2tlbiwgZXhwaXJlc0luLCByZWZyZXNoVG9rZW4gPSBudWxsLCBpZFRva2VuID0gbnVsbCkgPT4ge1xuXG4gICAgbGV0IGZvcm1lckF1dGhJbmZvID0gZ2V0QXV0aEluZm8oKTtcblxuICAgIGxldCBhdXRoSW5mbyA9IHtcbiAgICAgICAgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuLFxuICAgICAgICBleHBpcmVzSW46IGV4cGlyZXNJbixcbiAgICAgICAgYWNjZXNzVG9rZW5VcGRhdGVkQXQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLFxuICAgIH07XG5cbiAgICBpZiAocmVmcmVzaFRva2VuID09PSBudWxsICYmIGZvcm1lckF1dGhJbmZvKSB7XG4gICAgICAgIHJlZnJlc2hUb2tlbiA9IGZvcm1lckF1dGhJbmZvLnJlZnJlc2hUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaWRUb2tlbiA9PT0gbnVsbCAmJiBmb3JtZXJBdXRoSW5mbykge1xuICAgICAgICBpZFRva2VuID0gZm9ybWVyQXV0aEluZm8uaWRUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICAgIGF1dGhJbmZvWydyZWZyZXNoVG9rZW4nXSA9IHJlZnJlc2hUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICBhdXRoSW5mb1snaWRUb2tlbiddID0gaWRUb2tlbjtcbiAgICB9XG5cbiAgICBwdXRPbkxvY2FsU3RvcmFnZShBVVRIX0lORk8sIEpTT04uc3RyaW5naWZ5KGF1dGhJbmZvKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRBdXRoSW5mbyA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcmVzID0gZ2V0RnJvbUxvY2FsU3RvcmFnZShBVVRIX0lORk8sIGZhbHNlKVxuICAgICAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNsZWFyQXV0aEluZm8gPSAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UoQVVUSF9JTkZPKTtcbiAgICAgICAgcmVtb3ZlRnJvbUxvY2FsU3RvcmFnZShOT05DRSk7XG4gICAgICAgIHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UoUEtDRSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SWRUb2tlbiA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgYXV0aEluZm8gPSBnZXRBdXRoSW5mbygpO1xuICAgICAgICBpZiAoYXV0aEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBhdXRoSW5mby5pZFRva2VuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPQXV0aDJDbGllbnRJZCA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5PQVVUSDJfQ0xJRU5UX0lEO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPQXV0aDJGbG93ID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93Lk9BVVRIMl9GTE9XIHx8IFwidG9rZW4gaWRfdG9rZW5cIjtcbiAgICB9XG4gICAgcmV0dXJuIFwidG9rZW4gaWRfdG9rZW5cIjtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZU9BdXRoMlJlZnJlc2hUb2tlbiA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKHdpbmRvdy5PQVVUSDJfVVNFX1JFRlJFU0hfVE9LRU4gfHwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0T0F1dGgySURQQmFzZVVybCA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5JRFBfQkFTRV9VUkw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE9BdXRoMlNjb3BlcyA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5TQ09QRVM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGluaXRMb2dPdXQgPSAoKSA9PiB7XG4gICAgbGV0IGxvY2F0aW9uID0gZ2V0Q3VycmVudExvY2F0aW9uKCk7XG4gICAgbG9jYXRpb24ucmVwbGFjZShnZXRMb2dvdXRVcmwoZ2V0SWRUb2tlbigpKS50b1N0cmluZygpKTtcbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlSWRUb2tlbiA9IChpZFRva2VuLCBpc3N1ZXIsIGF1ZGllbmNlKSA9PiB7XG5cbiAgICBsZXQgdmVyaWZpZXIgPSBuZXcgSWRUb2tlblZlcmlmaWVyKHtcbiAgICAgICAgaXNzdWVyOiBpc3N1ZXIsXG4gICAgICAgIGF1ZGllbmNlOiBhdWRpZW5jZVxuICAgIH0pO1xuXG4gICAgbGV0IHN0b3JlZE5vbmNlID0gZ2V0RnJvbUxvY2FsU3RvcmFnZShOT05DRSwgdHJ1ZSk7XG4gICAgbGV0IGp3dCA9IHZlcmlmaWVyLmRlY29kZShpZFRva2VuKTtcbiAgICBsZXQgYWxnID0gand0LmhlYWRlci5hbGc7XG4gICAgbGV0IGtpZCA9IGp3dC5oZWFkZXIua2lkO1xuICAgIGxldCBhdWQgPSBqd3QucGF5bG9hZC5hdWQ7XG4gICAgbGV0IGlzcyA9IGp3dC5wYXlsb2FkLmlzcztcbiAgICBsZXQgZXhwID0gand0LnBheWxvYWQuZXhwO1xuICAgIGxldCBuYmYgPSBqd3QucGF5bG9hZC5uYmY7XG4gICAgbGV0IHRub25jZSA9IGp3dC5wYXlsb2FkLm5vbmNlIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdG5vbmNlID09IHN0b3JlZE5vbmNlICYmIGF1ZCA9PSBhdWRpZW5jZSAmJiBpc3MgPT0gaXNzdWVyO1xufVxuXG5leHBvcnQgY29uc3QgcGFzc3dvcmRsZXNzU3RhcnQgPSAocGFyYW1zKSA9PiB7XG5cbiAgICBsZXQgb2F1dGgyQ2xpZW50SWQgPSBnZXRPQXV0aDJDbGllbnRJZCgpO1xuICAgIGxldCBzY29wZXMgPSBnZXRPQXV0aDJTY29wZXMoKTtcbiAgICBsZXQgbm9uY2UgPSBjcmVhdGVOb25jZShOT05DRV9MRU4pO1xuICAgIC8vIHN0b3JlIG5vbmNlIHRvIGNoZWNrIGl0IGxhdGVyXG4gICAgcHV0T25Mb2NhbFN0b3JhZ2UoTk9OQ0UsIG5vbmNlKTtcbiAgICBsZXQgYmFzZVVybCA9IGdldE9BdXRoMklEUEJhc2VVcmwoKTtcbiAgICBsZXQgdXJsID0gVVJJKGAke2Jhc2VVcmx9L29hdXRoMi9hdXRoYCk7XG5cbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgXCJyZXNwb25zZV90eXBlXCI6IFwib3RwXCIsXG4gICAgICAgIFwic2NvcGVcIjogZW5jb2RlVVJJKHNjb3BlcyksXG4gICAgICAgIFwibm9uY2VcIjogbm9uY2UsXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwiY29ubmVjdGlvblwiOiBwYXJhbXMuY29ubmVjdGlvbiB8fCBcImVtYWlsXCIsXG4gICAgICAgIFwic2VuZFwiOiBwYXJhbXMuc2VuZCB8fCBcImNvZGVcIixcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnZW1haWwnKSkge1xuICAgICAgICBwYXlsb2FkW1wiZW1haWxcIl0gPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmVtYWlsKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdwaG9uZV9udW1iZXInKSkge1xuICAgICAgICBwYXlsb2FkW1wicGhvbmVfbnVtYmVyXCJdID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5waG9uZV9udW1iZXIpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ3JlZGlyZWN0X3VyaScpKSB7XG4gICAgICAgIHBheWxvYWRbXCJyZWRpcmVjdF91cmlcIl0gPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnJlZGlyZWN0X3VyaSk7XG4gICAgfVxuXG4gICAgbGV0IHJlcSA9IGh0dHAucG9zdCh1cmwudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gcmVxLnNlbmQocGF5bG9hZCkudGhlbigocmVzKSA9PiB7XG4gICAgICAgIGxldCBqc29uID0gcmVzLmJvZHk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe3Jlc3BvbnNlOiBqc29ufSk7XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9KTtcblxufVxuXG5leHBvcnQgY29uc3QgcGFzc3dvcmRsZXNzTG9naW4gPSAocGFyYW1zKSA9PiAoZGlzcGF0Y2gpID0+IHtcblxuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG4gICAgbGV0IHNjb3BlcyA9IGdldE9BdXRoMlNjb3BlcygpO1xuICAgIGxldCBiYXNlVXJsID0gZ2V0T0F1dGgySURQQmFzZVVybCgpO1xuICAgIGxldCB1cmwgPSBVUkkoYCR7YmFzZVVybH0vb2F1dGgyL3Rva2VuYCk7XG5cbiAgICBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShcIm90cFwiKSkge1xuICAgICAgICB0aHJvdyBFcnJvcihBVVRIX0VSUk9SX01JU1NJTkdfT1RQX1BBUkFNKTtcbiAgICB9XG5cbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgXCJncmFudF90eXBlXCI6IFwicGFzc3dvcmRsZXNzXCIsXG4gICAgICAgIFwiY29ubmVjdGlvblwiOiBwYXJhbXMuY29ubmVjdGlvbiB8fCBcImVtYWlsXCIsXG4gICAgICAgIFwic2NvcGVcIjogZW5jb2RlVVJJKHNjb3BlcyksXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwib3RwXCI6IHBhcmFtcy5vdHBcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnZW1haWwnKSkge1xuICAgICAgICBwYXlsb2FkW1wiZW1haWxcIl0gPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmVtYWlsKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdwaG9uZV9udW1iZXInKSkge1xuICAgICAgICBwYXlsb2FkW1wicGhvbmVfbnVtYmVyXCJdID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5waG9uZV9udW1iZXIpO1xuICAgIH1cblxuICAgIGxldCByZXEgPSBodHRwLnBvc3QodXJsLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIHJlcS5zZW5kKHBheWxvYWQpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gbm93IHdlIGdvdCB0b2tlblxuICAgICAgICAgICAgbGV0IGpzb24gPSByZXMuYm9keTtcbiAgICAgICAgICAgIGxldCB7YWNjZXNzX3Rva2VuLCBleHBpcmVzX2luLCByZWZyZXNoX3Rva2VuLCBpZF90b2tlbn0gPSBqc29uO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlZnJlc2hfdG9rZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbiA9IG51bGw7IC8vIG5vdCB1c2luZyByb3RhdGUgcG9saWN5XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRfdG9rZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWRfdG9rZW4gPSBudWxsOyAvLyBub3QgdXNpbmcgcm90YXRlIHBvbGljeVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB2ZXJpZnkgaWQgdG9rZW5cblxuICAgICAgICAgICAgaWYgKGlkX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUlkVG9rZW4oaWRfdG9rZW4sIGJhc2VVcmwsIG9hdXRoMkNsaWVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihBVVRIX0VSUk9SX0lEX1RPS0VOX0lOVkFMSUQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RvcmVBdXRoSW5mbyhhY2Nlc3NfdG9rZW4sIGV4cGlyZXNfaW4sIHJlZnJlc2hfdG9rZW4sIGlkX3Rva2VuKTtcblxuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTRVRfTE9HR0VEX1VTRVIsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtzZXNzaW9uU3RhdGU6IG51bGx9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe3Jlc3BvbnNlOiBqc29ufSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzSWRUb2tlbkFsaXZlID0gKG5vd0Vwb2NoID0gbnVsbCkgPT4gKCkgPT4ge1xuXG4gICAgaWYgKCFub3dFcG9jaCkge1xuICAgICAgICBub3dFcG9jaCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGNvbnN0IGlkVG9rZW4gPSBnZXRJZFRva2VuKCk7XG4gICAgaWYgKCFpZFRva2VuKVxuICAgICAgICB0aHJvdyBFcnJvcignSWQgVG9rZW4gbm90IHNldC4nKTtcblxuICAgIGNvbnN0IGlzc3VlciA9IGdldE9BdXRoMklEUEJhc2VVcmwoKTtcbiAgICBjb25zdCBhdWRpZW5jZSA9IGdldE9BdXRoMkNsaWVudElkKCk7XG5cbiAgICBsZXQgdmVyaWZpZXIgPSBuZXcgSWRUb2tlblZlcmlmaWVyKHtcbiAgICAgICAgaXNzdWVyOiBpc3N1ZXIsXG4gICAgICAgIGF1ZGllbmNlOiBhdWRpZW5jZVxuICAgIH0pO1xuXG4gICAgY29uc3Qgand0ID0gdmVyaWZpZXIuZGVjb2RlKGlkVG9rZW4pO1xuICAgIGNvbnN0IGV4cCA9IGp3dC5wYXlsb2FkLmV4cDtcblxuICAgIC8vIGNoZWNrIGxpZmUgdGltZVxuICAgIHJldHVybiBleHAgLSAobm93RXBvY2ggKyBBQ0NFU1NfVE9LRU5fU0tFV19USU1FKSA+IDA7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDE3IE9wZW5TdGFjayBGb3VuZGF0aW9uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgZmxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqL1xuXG5pbXBvcnQgcmVxdWVzdCBmcm9tICdzdXBlcmFnZW50L2xpYi9jbGllbnQnO1xuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcbmxldCBodHRwID0gcmVxdWVzdDtcbmltcG9ydCBTd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcbmltcG9ydCBUIGZyb20gXCJpMThuLXJlYWN0L2Rpc3QvaTE4bi1yZWFjdFwiO1xuaW1wb3J0IHsgaXNDbGVhcmluZ1Nlc3Npb25TdGF0ZSwgc2V0U2Vzc2lvbkNsZWFyaW5nU3RhdGUsIGdldEN1cnJlbnRQYXRoTmFtZSB9IGZyb20gJy4vbWV0aG9kcyc7XG5pbXBvcnQgeyBDTEVBUl9TRVNTSU9OX1NUQVRFIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zZWN1cml0eS9hY3Rpb25zJztcbmltcG9ydCB7IGRvTG9naW4sIGluaXRMb2dPdXQgfSBmcm9tICcuLi9jb21wb25lbnRzL3NlY3VyaXR5L21ldGhvZHMnO1xuXG5leHBvcnQgY29uc3QgR0VORVJJQ19FUlJPUiAgPSBcIllpa2VzLiBTb21ldGhpbmcgc2VlbXMgdG8gYmUgYnJva2VuLiBPdXIgd2ViIHRlYW0gaGFzIGJlZW4gbm90aWZpZWQsIGFuZCB3ZSBhcG9sb2dpemUgZm9yIHRoZSBpbmNvbnZlbmllbmNlLlwiO1xuZXhwb3J0IGNvbnN0IFJFU0VUX0xPQURJTkcgID0gJ1JFU0VUX0xPQURJTkcnO1xuZXhwb3J0IGNvbnN0IFNUQVJUX0xPQURJTkcgID0gJ1NUQVJUX0xPQURJTkcnO1xuZXhwb3J0IGNvbnN0IFNUT1BfTE9BRElORyAgID0gJ1NUT1BfTE9BRElORyc7XG5leHBvcnQgY29uc3QgVkFMSURBVEUgICAgICAgPSAnVkFMSURBVEUnO1xuZXhwb3J0IGNvbnN0IENMRUFSX01FU1NBR0UgID0gJ0NMRUFSX01FU1NBR0UnO1xuZXhwb3J0IGNvbnN0IFNIT1dfTUVTU0FHRSAgID0gJ1NIT1dfTUVTU0FHRSc7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVBY3Rpb24gPSB0eXBlID0+IHBheWxvYWQgPT4gKHtcbiAgICB0eXBlLFxuICAgIHBheWxvYWRcbn0pO1xuXG5leHBvcnQgY29uc3QgcmVzZXRMb2FkaW5nID0gY3JlYXRlQWN0aW9uKFJFU0VUX0xPQURJTkcpO1xuZXhwb3J0IGNvbnN0IHN0YXJ0TG9hZGluZyA9IGNyZWF0ZUFjdGlvbihTVEFSVF9MT0FESU5HKTtcbmV4cG9ydCBjb25zdCBzdG9wTG9hZGluZyAgPSBjcmVhdGVBY3Rpb24oU1RPUF9MT0FESU5HKTtcblxuY29uc3QgeGhycyA9IHt9O1xuY29uc3QgZXRhZ0NhY2hlID0ge307XG5cbmNvbnN0IGNhbmNlbCA9IChrZXkpID0+IHtcbiAgICBpZih4aHJzW2tleV0pIHtcbiAgICAgICAgeGhyc1trZXldLmFib3J0KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBhYm9ydGVkIHJlcXVlc3QgJHtrZXl9YCk7XG4gICAgICAgIGRlbGV0ZSB4aHJzW2tleV07XG4gICAgfVxufVxuXG5jb25zdCBzY2hlZHVsZSA9IChrZXksIHJlcSkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKGBzY2hlZHVsaW5nICR7a2V5fWApO1xuICAgIHhocnNba2V5XSA9IHJlcTtcbn07XG5cbmNvbnN0IGlzT2JqZWN0RW1wdHkgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0IDtcbn1cblxuZXhwb3J0IGNvbnN0IGF1dGhFcnJvckhhbmRsZXIgPSAoZXJyLCByZXMpID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcbiAgICBsZXQgY29kZSA9IGVyci5zdGF0dXM7XG4gICAgbGV0IG1zZyA9ICcnO1xuXG4gICAgZGlzcGF0Y2goc3RvcExvYWRpbmcoKSk7XG5cbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgICBsZXQgZXJyb3JfbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0VSUk9SJyxcbiAgICAgICAgICAgICAgICBodG1sOiBULnRyYW5zbGF0ZShcImVycm9ycy51c2VyX25vdF9hdXRoelwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBkaXNwYXRjaChzaG93TWVzc2FnZSggZXJyb3JfbWVzc2FnZSwgaW5pdExvZ091dCApKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICAgIGxldCBjdXJyZW50TG9jYXRpb24gPSBnZXRDdXJyZW50UGF0aE5hbWUoKTtcbiAgICAgICAgICAgIGxldCBjbGVhcmluZ19zZXNzaW9uX3N0YXRlID0gaXNDbGVhcmluZ1Nlc3Npb25TdGF0ZSgpO1xuXG4gICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogQ0xFQVJfU0VTU0lPTl9TVEFURSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmKCFjbGVhcmluZ19zZXNzaW9uX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgc2V0U2Vzc2lvbkNsZWFyaW5nU3RhdGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2F1dGhFcnJvckhhbmRsZXIgNDAxIC0gcmUgbG9naW4nKTtcbiAgICAgICAgICAgICAgICBkb0xvZ2luKGN1cnJlbnRMb2NhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICBtc2cgPSBcIlwiO1xuXG4gICAgICAgICAgICBpZiAoZXJyLnJlc3BvbnNlLmJvZHkgJiYgZXJyLnJlc3BvbnNlLmJvZHkubWVzc2FnZSkgbXNnID0gZXJyLnJlc3BvbnNlLmJvZHkubWVzc2FnZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGVyci5yZXNwb25zZS5lcnJvciAmJiBlcnIucmVzcG9uc2UuZXJyb3IubWVzc2FnZSkgbXNnID0gZXJyLnJlc3BvbnNlLmVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICBlbHNlIG1zZyA9IGVyci5tZXNzYWdlO1xuXG4gICAgICAgICAgICBTd2FsLmZpcmUoXCJOb3QgRm91bmRcIiwgbXNnLCBcIndhcm5pbmdcIik7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQxMjpcbiAgICAgICAgICAgIGZvciAodmFyIFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlcnIucmVzcG9uc2UuYm9keS5lcnJvcnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGtleSArICc6ICc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbXNnICs9IHZhbHVlICsgJzxicj4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgU3dhbC5maXJlKFwiVmFsaWRhdGlvbiBlcnJvclwiLCBtc2csIFwid2FybmluZ1wiKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBWQUxJREFURSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7ZXJyb3JzOiBlcnIucmVzcG9uc2UuYm9keS5lcnJvcnN9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgU3dhbC5maXJlKFwiRVJST1JcIiwgVC50cmFuc2xhdGUoXCJlcnJvcnMuc2VydmVyX2Vycm9yXCIpLCBcImVycm9yXCIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFJlcXVlc3QgPShcbiAgICByZXF1ZXN0QWN0aW9uQ3JlYXRvcixcbiAgICByZWNlaXZlQWN0aW9uQ3JlYXRvcixcbiAgICBlbmRwb2ludCxcbiAgICBlcnJvckhhbmRsZXIgPSBkZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgIHJlcXVlc3RBY3Rpb25QYXlsb2FkID0ge30sXG4gICAgdXNlRXRhZyA9IGZhbHNlXG4pID0+IChwYXJhbXMgPSB7fSkgPT4gKGRpc3BhdGNoLCBzdGF0ZSkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG4gICAgbGV0IGtleSA9IHVybC50b1N0cmluZygpO1xuXG4gICAgaWYoIWlzT2JqZWN0RW1wdHkocGFyYW1zKSkge1xuICAgICAgICAvLyByZW1vdmUgdGhlIGFjY2VzcyB0b2tlblxuICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbjogXywgLi4ubmV3UGFyYW1zfSA9IHBhcmFtcztcbiAgICAgICAgLy8gYW5kIGdlbmVyYXRlIG5ldyBrZXlcbiAgICAgICAga2V5ID0gdXJsLnF1ZXJ5KG5ld1BhcmFtcykudG9TdHJpbmcoKTtcbiAgICAgICAgdXJsID0gdXJsLnF1ZXJ5KHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYocmVxdWVzdEFjdGlvbkNyZWF0b3IgJiYgdHlwZW9mIHJlcXVlc3RBY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBkaXNwYXRjaChyZXF1ZXN0QWN0aW9uQ3JlYXRvcihyZXF1ZXN0QWN0aW9uUGF5bG9hZCkpO1xuXG4gICAgY2FuY2VsKGtleSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgcmVxID0gaHR0cC5nZXQodXJsLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZih1c2VFdGFnICYmIGV0YWdDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgIGNvbnN0IHsgZXRhZyB9ID0gZXRhZ0NhY2hlW2tleV07XG4gICAgICAgICAgICBpZihldGFnKXtcbiAgICAgICAgICAgICAgICByZXEuc2V0KCdJZi1Ob25lLU1hdGNoJywgZXRhZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlcS50aW1lb3V0KHtcbiAgICAgICAgICAgIHJlc3BvbnNlOiA2MDAwMCxcbiAgICAgICAgICAgIGRlYWRsaW5lOiA2MDAwMCxcbiAgICAgICAgfSlcbiAgICAgICAgLmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QsIGtleSwgdXNlRXRhZykpXG5cbiAgICAgICAgc2NoZWR1bGUoa2V5LCByZXEpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHB1dFJlcXVlc3QgPSAoXG4gICAgcmVxdWVzdEFjdGlvbkNyZWF0b3IsXG4gICAgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsXG4gICAgZW5kcG9pbnQsXG4gICAgcGF5bG9hZCxcbiAgICBlcnJvckhhbmRsZXIgPSBkZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgIHJlcXVlc3RBY3Rpb25QYXlsb2FkID0ge31cbikgPT4gKHBhcmFtcyA9IHt9KSA9PiAoIGRpc3BhdGNoLCBzdGF0ZSkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIGlmKHJlcXVlc3RBY3Rpb25DcmVhdG9yICYmIHR5cGVvZiByZXF1ZXN0QWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZGlzcGF0Y2gocmVxdWVzdEFjdGlvbkNyZWF0b3IocmVxdWVzdEFjdGlvblBheWxvYWQpKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmKHBheWxvYWQgPT0gbnVsbClcbiAgICAgICAgICAgIHBheWxvYWQgPSB7fTtcbiAgICAgICAgaHR0cC5wdXQodXJsLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAuc2VuZChwYXlsb2FkKVxuICAgICAgICAgICAgLmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QpKVxuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVJlcXVlc3QgPSAoXG4gICAgcmVxdWVzdEFjdGlvbkNyZWF0b3IsXG4gICAgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsXG4gICAgZW5kcG9pbnQsXG4gICAgcGF5bG9hZCxcbiAgICBlcnJvckhhbmRsZXIgID0gZGVmYXVsdEVycm9ySGFuZGxlcixcbiAgICByZXF1ZXN0QWN0aW9uUGF5bG9hZCA9IHt9XG4pID0+IChwYXJhbXMpID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcbiAgICBsZXQgdXJsID0gVVJJKGVuZHBvaW50KTtcblxuICAgIGlmKCFpc09iamVjdEVtcHR5KHBhcmFtcykpXG4gICAgICAgIHVybCA9IHVybC5xdWVyeShwYXJhbXMpO1xuXG4gICAgaWYocmVxdWVzdEFjdGlvbkNyZWF0b3IgJiYgdHlwZW9mIHJlcXVlc3RBY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBkaXNwYXRjaChyZXF1ZXN0QWN0aW9uQ3JlYXRvcihyZXF1ZXN0QWN0aW9uUGF5bG9hZCkpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYocGF5bG9hZCA9PSBudWxsKVxuICAgICAgICAgICAgcGF5bG9hZCA9IHt9O1xuXG4gICAgICAgIGh0dHAuZGVsZXRlKHVybClcbiAgICAgICAgICAgIC5zZW5kKHBheWxvYWQpXG4gICAgICAgICAgICAuZW5kKHJlc3BvbnNlSGFuZGxlcihkaXNwYXRjaCwgc3RhdGUsIHJlY2VpdmVBY3Rpb25DcmVhdG9yLCBlcnJvckhhbmRsZXIsIHJlc29sdmUsIHJlamVjdCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvc3RSZXF1ZXN0ID0gKFxuICAgICAgICByZXF1ZXN0QWN0aW9uQ3JlYXRvcixcbiAgICAgICAgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBlcnJvckhhbmRsZXIgPSBkZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgICAgICByZXF1ZXN0QWN0aW9uUGF5bG9hZCA9IHt9XG4pID0+IChwYXJhbXMgPSB7fSkgPT4gKGRpc3BhdGNoLCBzdGF0ZSkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIGlmKHJlcXVlc3RBY3Rpb25DcmVhdG9yICYmIHR5cGVvZiByZXF1ZXN0QWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZGlzcGF0Y2gocmVxdWVzdEFjdGlvbkNyZWF0b3IocmVxdWVzdEFjdGlvblBheWxvYWQpKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgICAgbGV0IHJlcXVlc3QgPSBodHRwLnBvc3QodXJsKTtcblxuICAgICAgICBpZihwYXlsb2FkICE9IG51bGwpXG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQocGF5bG9hZCk7XG4gICAgICAgIGVsc2UgLy8gdG8gYmUgYSBzaW1wbGUgQ09SUyByZXF1ZXN0XG4gICAgICAgICAgICByZXF1ZXN0LnNldCgnQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nKTtcblxuICAgICAgICByZXF1ZXN0LmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwb3N0RmlsZSA9IChcbiAgICByZXF1ZXN0QWN0aW9uQ3JlYXRvcixcbiAgICByZWNlaXZlQWN0aW9uQ3JlYXRvcixcbiAgICBlbmRwb2ludCxcbiAgICBmaWxlLFxuICAgIGZpbGVNZXRhZGF0YSA9IHt9LFxuICAgIGVycm9ySGFuZGxlciA9IGRlZmF1bHRFcnJvckhhbmRsZXIsXG4gICAgcmVxdWVzdEFjdGlvblBheWxvYWQgPSB7fVxuKSA9PiAocGFyYW1zID0ge30pID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcblxuICAgIGxldCB1cmwgPSBVUkkoZW5kcG9pbnQpO1xuXG4gICAgaWYoIWlzT2JqZWN0RW1wdHkocGFyYW1zKSlcbiAgICAgICAgdXJsID0gdXJsLnF1ZXJ5KHBhcmFtcyk7XG5cbiAgICBpZihyZXF1ZXN0QWN0aW9uQ3JlYXRvciAmJiB0eXBlb2YgcmVxdWVzdEFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIGRpc3BhdGNoKHJlcXVlc3RBY3Rpb25DcmVhdG9yKHJlcXVlc3RBY3Rpb25QYXlsb2FkKSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHJlcSA9IGh0dHAucG9zdCh1cmwpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRhY2goJ2ZpbGUnLCBmaWxlKTtcblxuICAgICAgICBpZighaXNPYmplY3RFbXB0eShmaWxlTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmaWxlTWV0YWRhdGEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGZpbGVNZXRhZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIHJlcS5maWVsZChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxLmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwdXRGaWxlID0gKFxuICAgIHJlcXVlc3RBY3Rpb25DcmVhdG9yLFxuICAgIHJlY2VpdmVBY3Rpb25DcmVhdG9yLFxuICAgIGVuZHBvaW50LFxuICAgIGZpbGUgPSBudWxsLFxuICAgIGZpbGVNZXRhZGF0YSA9IHt9LFxuICAgIGVycm9ySGFuZGxlciA9IGRlZmF1bHRFcnJvckhhbmRsZXIsXG4gICAgcmVxdWVzdEFjdGlvblBheWxvYWQgPSB7fVxuKSA9PiAocGFyYW1zID0ge30pID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcblxuICAgIGxldCB1cmwgPSBVUkkoZW5kcG9pbnQpO1xuXG4gICAgaWYoIWlzT2JqZWN0RW1wdHkocGFyYW1zKSlcbiAgICAgICAgdXJsID0gdXJsLnF1ZXJ5KHBhcmFtcyk7XG5cbiAgICBpZihyZXF1ZXN0QWN0aW9uQ3JlYXRvciAmJiB0eXBlb2YgcmVxdWVzdEFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIGRpc3BhdGNoKHJlcXVlc3RBY3Rpb25DcmVhdG9yKHJlcXVlc3RBY3Rpb25QYXlsb2FkKSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHJlcSA9IGh0dHAucHV0KHVybCk7XG5cbiAgICAgICAgaWYoZmlsZSAhPSBudWxsKXtcbiAgICAgICAgICAgIHJlcS5hdHRhY2goJ2ZpbGUnLCBmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc09iamVjdEVtcHR5KGZpbGVNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZpbGVNZXRhZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmlsZU1ldGFkYXRhW2tleV07XG4gICAgICAgICAgICAgICAgcmVxLmZpZWxkKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXEuZW5kKHJlc3BvbnNlSGFuZGxlcihkaXNwYXRjaCwgc3RhdGUsIHJlY2VpdmVBY3Rpb25DcmVhdG9yLCBlcnJvckhhbmRsZXIsIHJlc29sdmUsIHJlamVjdCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFcnJvckhhbmRsZXIgPSAoZXJyLCByZXMpID0+IChkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBib2R5ID0gcmVzLmJvZHk7XG4gICAgbGV0IHRleHQgPSAnJztcbiAgICBpZihib2R5IGluc3RhbmNlb2YgT2JqZWN0KXtcbiAgICAgICAgaWYoYm9keS5oYXNPd25Qcm9wZXJ0eSgnbWVzc2FnZScpKVxuICAgICAgICAgICAgdGV4dCA9IGJvZHkubWVzc2FnZTtcbiAgICB9XG4gICAgU3dhbC5maXJlKHJlcy5zdGF0dXNUZXh0LCB0ZXh0LCBcImVycm9yXCIpO1xufVxuXG5jb25zdCBieUxvd2VyQ2FzZSA9IHRvRmluZCA9PiB2YWx1ZSA9PiB0b0xvd2VyQ2FzZSh2YWx1ZSkgPT09IHRvRmluZDtcbmNvbnN0IHRvTG93ZXJDYXNlID0gdmFsdWUgPT4gdmFsdWUudG9Mb3dlckNhc2UoKTtcbmNvbnN0IGdldEtleXMgPSBoZWFkZXJzID0+IE9iamVjdC5rZXlzKGhlYWRlcnMpO1xuXG5leHBvcnQgY29uc3QgZ2V0SGVhZGVyQ2FzZUluc2Vuc2l0aXZlID0gKGhlYWRlck5hbWUsIGhlYWRlcnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGdldEtleXMoaGVhZGVycykuZmluZChieUxvd2VyQ2FzZShoZWFkZXJOYW1lKSk7XG4gICAgcmV0dXJuIGtleSA/IGhlYWRlcnNba2V5XSA6IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNwb25zZUhhbmRsZXIgPSAoIGRpc3BhdGNoLCBzdGF0ZSwgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsIGVycm9ySGFuZGxlciwgcmVzb2x2ZSwgcmVqZWN0LCBrZXkgPSBudWxsLCB1c2VFdGFnPSBmYWxzZSApID0+XG5cbiAgICAoZXJyLCByZXMpID0+IHtcblxuICAgIGlmIChlcnIgfHwgIXJlcy5vaykge1xuICAgICAgICBsZXQgY29kZSA9IGVyci5zdGF0dXM7XG5cbiAgICAgICAgaWYoY29kZSA9PT0gMzA0ICYmIGV0YWdDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHVzZUV0YWcpe1xuICAgICAgICAgICAgY29uc3QgeyBib2R5IH0gPSBldGFnQ2FjaGVba2V5XTtcblxuICAgICAgICAgICAgaWYodHlwZW9mIHJlY2VpdmVBY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVjZWl2ZUFjdGlvbkNyZWF0b3Ioe3Jlc3BvbnNlOiBib2R5fSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHtyZXNwb25zZTogYm9keX0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaXNwYXRjaChyZWNlaXZlQWN0aW9uQ3JlYXRvcik7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7cmVzcG9uc2U6IGJvZHl9KTtcbiAgICAgICAgfVxuICAgICAgICBpZihlcnJvckhhbmRsZXIpIHtcbiAgICAgICAgICAgIGVycm9ySGFuZGxlcihlcnIsIHJlcykoZGlzcGF0Y2gsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVqZWN0KHsgZXJyLCByZXMsIGRpc3BhdGNoLCBzdGF0ZSB9KVxuICAgIH1cblxuICAgIGxldCBqc29uID0gcmVzLmJvZHk7XG5cbiAgICBpZih1c2VFdGFnKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRVRBRyA9IGdldEhlYWRlckNhc2VJbnNlbnNpdGl2ZSgnZXRhZycsIHJlcy5oZWFkZXJzKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlRVRBRykge1xuICAgICAgICAgICAgZXRhZ0NhY2hlW2tleV0gPSB7IGV0YWc6IHJlc3BvbnNlRVRBRywgYm9keToganNvbn07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZih0eXBlb2YgcmVjZWl2ZUFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlzcGF0Y2gocmVjZWl2ZUFjdGlvbkNyZWF0b3Ioe3Jlc3BvbnNlOiBqc29ufSkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7cmVzcG9uc2U6IGpzb259KTtcbiAgICB9XG4gICAgZGlzcGF0Y2gocmVjZWl2ZUFjdGlvbkNyZWF0b3IpO1xuICAgIHJldHVybiByZXNvbHZlKHtyZXNwb25zZToganNvbn0pO1xufVxuXG5cbmV4cG9ydCBjb25zdCBmZXRjaEVycm9ySGFuZGxlciA9IChyZXNwb25zZSkgPT4ge1xuICAgIGxldCBjb2RlID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgIGxldCBtc2cgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuXG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgU3dhbC5maXJlKFwiRVJST1JcIiwgVC50cmFuc2xhdGUoXCJlcnJvcnMudXNlcl9ub3RfYXV0aHpcIiksIFwid2FybmluZ1wiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICAgIFN3YWwuZmlyZShcIkVSUk9SXCIsIFQudHJhbnNsYXRlKFwiZXJyb3JzLnNlc3Npb25fZXhwaXJlZFwiKSwgXCJlcnJvclwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQxMjpcbiAgICAgICAgICAgIFN3YWwuZmlyZShcIkVSUk9SXCIsIG1zZywgXCJ3YXJuaW5nXCIpO1xuICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICAgIFN3YWwuZmlyZShcIkVSUk9SXCIsIFQudHJhbnNsYXRlKFwiZXJyb3JzLnNlcnZlcl9lcnJvclwiKSwgXCJlcnJvclwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBmZXRjaFJlc3BvbnNlSGFuZGxlciA9IChyZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG93TWVzc2FnZSA9IChzZXR0aW5ncywgY2FsbGJhY2sgPSB7fSkgPT4gKGRpc3BhdGNoKSA9PiB7XG4gICAgZGlzcGF0Y2goc3RvcExvYWRpbmcoKSk7XG5cbiAgICBTd2FsLmZpcmUoc2V0dGluZ3MpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlICYmIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3Qgc2hvd1N1Y2Nlc3NNZXNzYWdlID0gKGh0bWwpID0+IChkaXNwYXRjaCkgPT4ge1xuICAgIGRpc3BhdGNoKHN0b3BMb2FkaW5nKCkpO1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBULnRyYW5zbGF0ZShcImdlbmVyYWwuZG9uZVwiKSxcbiAgICAgICAgaHRtbDogaHRtbCxcbiAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZEZpbGVCeUNvbnRlbnQgPSAoZmlsZW5hbWUsIGNvbnRlbnQsIG1pbWUpID0+IHtcbiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsaW5rLnRleHRDb250ZW50ID0gJ2Rvd25sb2FkJztcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgbGluay5ocmVmID0gYGRhdGE6JHttaW1lfSwke2VuY29kZVVSSUNvbXBvbmVudChjb250ZW50KX1gXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTsgLy8gUmVxdWlyZWQgZm9yIEZGXG4gICAgbGluay5jbGljaygpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDU1YgPSAoZW5kcG9pbnQsIHBhcmFtcywgZmlsZW5hbWUsIGhlYWRlciA9IG51bGwpID0+IChkaXNwYXRjaCkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIGRpc3BhdGNoKHN0YXJ0TG9hZGluZygpKTtcblxuICAgIHJldHVybiBmZXRjaCh1cmwudG9TdHJpbmcoKSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChjc3YpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0b3BMb2FkaW5nKCkpO1xuXG4gICAgICAgICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgY3N2ID0gaGVhZGVyICsgJ1xcclxccicgKyBjc3Y7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb3dubG9hZEZpbGVCeUNvbnRlbnQoZmlsZW5hbWUsIGNzdiwgJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSYXdDU1YgPSAoZW5kcG9pbnQsIHBhcmFtcywgaGVhZGVyID0gbnVsbCkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIHJldHVybiBmZXRjaCh1cmwudG9TdHJpbmcoKSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChjc3YpID0+IHtcbiAgICAgICAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBjc3YgPSBoZWFkZXIgKyAnXFxyXFxyJyArIGNzdjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjc3Y7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59O1xuXG5leHBvcnQgY29uc3QgZXNjYXBlRmlsdGVyVmFsdWUgPSAodmFsdWUpID0+IHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLywvZywgXCJcXFxcLFwiKTtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLzsvZywgXCJcXFxcO1wiKTtcbiAgICByZXR1cm4gdmFsdWU7XG59O1xuIiwiLy8gbGltaXQgb2YgQ3J5cHRvLmdldFJhbmRvbVZhbHVlcygpXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3J5cHRvL2dldFJhbmRvbVZhbHVlc1xuY29uc3QgTUFYX0JZVEVTID0gNjU1MzZcbi8vIE5vZGUgc3VwcG9ydHMgcmVxdWVzdGluZyB1cCB0byB0aGlzIG51bWJlciBvZiBieXRlc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9jcnlwdG8vcmFuZG9tLmpzI0w0OFxuY29uc3QgTUFYX1VJTlQzMiA9IDQyOTQ5NjcyOTVcbmNvbnN0IGNyeXB0byA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gKHdpbmRvdy5jcnlwdG8gfHwgd2luZG93Lm1zQ3J5cHRvKSA6IG51bGw7XG5pbXBvcnQgc2hhMjU2IGZyb20gJ2NyeXB0by1qcy9zaGEyNTYnO1xuaW1wb3J0IEJhc2U2NHVybCBmcm9tICdjcnlwdG8tanMvZW5jLWJhc2U2NHVybCdcbmltcG9ydCBIZXggZnJvbSAnY3J5cHRvLWpzL2VuYy1oZXgnXG5leHBvcnQgY29uc3QgZ2V0UmFuZG9tQnl0ZXMgPSAoc2l6ZSkgPT4ge1xuICAgIC8vIHBoYW50b21qcyBuZWVkcyB0byB0aHJvd1xuICAgIGlmIChzaXplID4gTUFYX1VJTlQzMikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3JlcXVlc3RlZCB0b28gbWFueSByYW5kb20gYnl0ZXMnKVxuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmFsbG9jVW5zYWZlKHNpemUpXG4gICAgaWYoIWNyeXB0bykgcmV0dXJuIGE7XG4gICAgaWYgKHNpemUgPiAwKSB7ICAvLyBnZXRSYW5kb21WYWx1ZXMgZmFpbHMgb24gSUUgaWYgc2l6ZSA9PSAwXG4gICAgICAgIGlmIChzaXplID4gTUFYX0JZVEVTKSB7IC8vIHRoaXMgaXMgdGhlIG1heCBieXRlcyBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzXG4gICAgICAgICAgICAvLyBjYW4gZG8gYXQgb25jZSBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzXG4gICAgICAgICAgICBmb3IgKGxldCBnZW5lcmF0ZWQgPSAwOyBnZW5lcmF0ZWQgPCBzaXplOyBnZW5lcmF0ZWQgKz0gTUFYX0JZVEVTKSB7XG4gICAgICAgICAgICAgICAgLy8gYnVmZmVyLnNsaWNlIGF1dG9tYXRpY2FsbHkgY2hlY2tzIGlmIHRoZSBlbmQgaXMgcGFzdCB0aGUgZW5kIG9mXG4gICAgICAgICAgICAgICAgLy8gdGhlIGJ1ZmZlciBzbyB3ZSBkb24ndCBoYXZlIHRvIGhlcmVcbiAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzLnNsaWNlKGdlbmVyYXRlZCwgZ2VuZXJhdGVkICsgTUFYX0JZVEVTKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnl0ZXMpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzXG59XG5cbmV4cG9ydCBjb25zdCBnZXRTSEEyNTYgPSAobWVzc2FnZSwgZm9ybWF0ID0gJ2hleCcpID0+IHtcblxuICAgIGxldCBmID0gSGV4O1xuICAgIGlmKGZvcm1hdCA9PT0gJ0Jhc2U2NHVybCcpXG4gICAgICAgIGYgPSBCYXNlNjR1cmw7XG5cbiAgICByZXR1cm4gc2hhMjU2KG1lc3NhZ2UpLnRvU3RyaW5nKGYpO1xufSIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnO1xuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcblxuZXhwb3J0IGNvbnN0IGZpbmRFbGVtZW50UG9zID0gKG9iaikgPT4ge1xuICAgIHZhciBjdXJ0b3AgPSAtNzA7XG4gICAgaWYgKG9iai5vZmZzZXRQYXJlbnQpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY3VydG9wICs9IG9iai5vZmZzZXRUb3A7XG4gICAgICAgIH0gd2hpbGUgKG9iaiA9IG9iai5vZmZzZXRQYXJlbnQpO1xuICAgICAgICByZXR1cm4gW2N1cnRvcF07XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGVwb2NoVG9Nb21lbnQgPSAoYXRpbWUpID0+IHtcbiAgICBpZighYXRpbWUpIHJldHVybiBhdGltZTtcbiAgICBhdGltZSA9IGF0aW1lICogMTAwMDtcbiAgICByZXR1cm4gbW9tZW50KGF0aW1lKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlcG9jaFRvTW9tZW50VGltZVpvbmUgPSAoYXRpbWUsIHRpbWVfem9uZSkgPT4ge1xuICAgIGlmKCFhdGltZSkgcmV0dXJuIGF0aW1lO1xuICAgIGF0aW1lID0gYXRpbWUgKiAxMDAwO1xuICAgIHJldHVybiBtb21lbnQoYXRpbWUpLnR6KHRpbWVfem9uZSk7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0RXBvY2ggPSAoYXRpbWUsIGZvcm1hdCA9ICdNL0QvWVlZWSBoOm1tIGEnKSA9PiB7XG4gICAgaWYoIWF0aW1lKSByZXR1cm4gYXRpbWU7XG4gICAgcmV0dXJuIGVwb2NoVG9Nb21lbnQoYXRpbWUpLmZvcm1hdChmb3JtYXQpO1xufTtcblxuZXhwb3J0IGNvbnN0IG9iamVjdFRvUXVlcnlTdHJpbmcgPSAob2JqKSA9PiB7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9IFwiXCIpIHtcbiAgICAgICAgICAgIHN0ciArPSBcIiZcIjtcbiAgICAgICAgfVxuICAgICAgICBzdHIgKz0ga2V5ICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmFja1VSTCA9ICgpID0+IHtcbiAgICBsZXQgdXJsICAgICAgPSBVUkkod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGxldCBxdWVyeSAgICA9IHVybC5zZWFyY2godHJ1ZSk7XG4gICAgbGV0IGZyYWdtZW50ID0gdXJsLmZyYWdtZW50KCk7XG4gICAgbGV0IGJhY2tVcmwgID0gcXVlcnkuaGFzT3duUHJvcGVydHkoJ0JhY2tVcmwnKSA/IHF1ZXJ5WydCYWNrVXJsJ10gOiBudWxsO1xuICAgIGlmKGZyYWdtZW50ICE9IG51bGwgJiYgZnJhZ21lbnQgIT0gJycpe1xuICAgICAgICBiYWNrVXJsICs9IGAjJHtmcmFnbWVudH1gO1xuICAgIH1cbiAgICByZXR1cm4gYmFja1VybDtcbn07XG5cbmV4cG9ydCBjb25zdCB0b1NsdWcgPSAodGV4dCkgPT57XG4gICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bXmEtekEtWjAtOV0rL2csJ18nKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEF1dGhDYWxsYmFjayA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYXV0aC9jYWxsYmFja2A7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRMb2NhdGlvbiA9ICgpID0+IHtcbiAgICBsZXQgbG9jYXRpb24gPSAnJztcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlIG9uIGlmcmFtZVxuICAgICAgICBpZiAod2luZG93LnRvcClcbiAgICAgICAgICAgIGxvY2F0aW9uID0gd2luZG93LnRvcC5sb2NhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2F0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE9yaWdpbiA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBhdGhOYW1lID0gKCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudEhyZWYgPSAoKSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBbGxvd2VkVXNlckdyb3VwcyA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93LkFMTE9XRURfVVNFUl9HUk9VUFMgfHwgJyc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkQVBJQmFzZVVybCA9IChyZWxhdGl2ZVVybCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKXtcbiAgICAgICAgcmV0dXJuIGAke3dpbmRvdy5BUElfQkFTRV9VUkx9JHtyZWxhdGl2ZVVybH1gO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbGBgO1xufTtcblxuZXhwb3J0IGNvbnN0IHB1dE9uTG9jYWxTdG9yYWdlID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyb21Mb2NhbFN0b3JhZ2UgPSAoa2V5LCByZW1vdmVJdCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxldCB2YWwgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgaWYocmVtb3ZlSXQpe1xuICAgICAgICAgICAgY29uc29sZS5sb2coYGdldEZyb21Mb2NhbFN0b3JhZ2UgcmVtb3Zpbmcga2V5ICR7a2V5fWApO1xuICAgICAgICAgICAgcmVtb3ZlRnJvbUxvY2FsU3RvcmFnZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UgPSAoa2V5KSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaXNDbGVhcmluZ1Nlc3Npb25TdGF0ZSA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93LmNsZWFyaW5nX3Nlc3Npb25fc3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uQ2xlYXJpbmdTdGF0ZSA9ICh2YWwpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3cuY2xlYXJpbmdfc2Vzc2lvbl9zdGF0ZSA9IHZhbDtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFVzZXJMYW5ndWFnZSA9ICgpID0+IHtcbiAgICBsZXQgbGFuZ3VhZ2UgPSAnZW4nO1xuICAgIGlmKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxhbmd1YWdlID0gKG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSkgfHwgbmF2aWdhdG9yLmxhbmd1YWdlIHx8IG5hdmlnYXRvci51c2VyTGFuZ3VhZ2U7XG4gICAgfVxuICAgIHJldHVybiBsYW5ndWFnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzY3JvbGxUb0Vycm9yID0gKGVycm9ycykgPT4ge1xuICAgIGlmKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmaXJzdEVycm9yID0gT2JqZWN0LmtleXMoZXJyb3JzKVswXTtcbiAgICAgICAgY29uc3QgZmlyc3ROb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmlyc3RFcnJvcik7XG4gICAgICAgIGlmIChmaXJzdE5vZGUpIHdpbmRvdy5zY3JvbGxUbygwLCBmaW5kRWxlbWVudFBvcyhmaXJzdE5vZGUpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgaGFzRXJyb3JzID0gKGZpZWxkLCBlcnJvcnMpID0+IHtcbiAgICBpZihmaWVsZCBpbiBlcnJvcnMpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yc1tmaWVsZF07XG4gICAgfVxuICAgIHJldHVybiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCBzaGFsbG93RXF1YWwgPSAob2JqZWN0MSwgb2JqZWN0MikgPT4ge1xuICAgIGNvbnN0IGtleXMxID0gT2JqZWN0LmtleXMob2JqZWN0MSk7XG4gICAgY29uc3Qga2V5czIgPSBPYmplY3Qua2V5cyhvYmplY3QyKTtcblxuICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMxKSB7XG4gICAgICAgIGlmIChvYmplY3QxW2tleV0gIT09IG9iamVjdDJba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgYXJyYXlzRXF1YWwgPSAoYTEsIGEyKSA9PlxuICAgIGExLmxlbmd0aCA9PT0gYTIubGVuZ3RoICYmIGExLmV2ZXJ5KChvLCBpZHgpID0+IHNoYWxsb3dFcXVhbChvLCBhMltpZHhdKSk7XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn07XG5cblxuZXhwb3J0IGNvbnN0IGJhc2U2NFVSTEVuY29kZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxuICAgICAgICAucmVwbGFjZSgvPS9nLCAnJylcbn1cblxuZXhwb3J0IGNvbnN0IHJldHJ5UHJvbWlzZSA9IGFzeW5jIChcbiAgICBjYixcbiAgICBtYXhOdW1iZXJPZlJldHJpZXMgPSAzXG4pID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heE51bWJlck9mUmV0cmllczsgaSsrKSB7XG4gICAgICAgIGlmIChhd2FpdCBjYigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVTZXJ2aWNlVXJsID0gKCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuVElNRUlOVEVSVkFMU0lOQ0UxOTcwX0FQSV9VUkwgfHwgcHJvY2Vzcy5lbnYuVElNRUlOVEVSVkFMU0lOQ0UxOTcwX0FQSV9VUkw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IHsgZmV0Y2hFcnJvckhhbmRsZXIsIGZldGNoUmVzcG9uc2VIYW5kbGVyLCBlc2NhcGVGaWx0ZXJWYWx1ZSB9IGZyb20gXCIuL2FjdGlvbnNcIjtcbmltcG9ydCB7IGdldEFjY2Vzc1Rva2VuIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zZWN1cml0eS9tZXRob2RzJztcbmltcG9ydCB7IGJ1aWxkQVBJQmFzZVVybCB9IGZyb20gXCIuL21ldGhvZHNcIjtcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5leHBvcnQgY29uc3QgUkVDRUlWRV9DT1VOVFJJRVMgID0gJ1JFQ0VJVkVfQ09VTlRSSUVTJztcbmNvbnN0IGNhbGxEZWxheSA9IDUwMDsgLy9taWxpc2Vjb25kc1xuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcblxuZXhwb3J0IGNvbnN0IHF1ZXJ5TWVtYmVycyA9IF8uZGVib3VuY2UoYXN5bmMgKGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBmdWxsX25hbWU9QCR7aW5wdXR9LGZpcnN0X25hbWU9QCR7aW5wdXR9LGxhc3RfbmFtZT1AJHtpbnB1dH0sZW1haWw9QCR7aW5wdXR9YCk7XG4gICAgbGV0IGV4cGFuZCA9IGB0aWNrZXRzLHJzdnAsc2NoZWR1bGVfc3VtbWl0X2V2ZW50cyxhbGxfYWZmaWxpYXRpb25zYFxuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL21lbWJlcnM/ZmlsdGVyPSR7ZmlsdGVyc30mZXhwYW5kPSR7ZXhwYW5kfSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5U3VtbWl0cyA9IF8uZGVib3VuY2UoYXN5bmMgKGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBuYW1lPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL3N1bW1pdHMvYWxsP2ZpbHRlcj0ke2ZpbHRlcnN9JmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5leHBvcnQgY29uc3QgcXVlcnlTcGVha2VycyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgZmlsdGVycyA9IGVuY29kZVVSSUNvbXBvbmVudChgZnVsbF9uYW1lPUAke2lucHV0fSxmaXJzdF9uYW1lPUAke2lucHV0fSxsYXN0X25hbWU9QCR7aW5wdXR9LGVtYWlsPUAke2lucHV0fWApO1xuICAgIGxldCBhcGlVcmwgPSBgL2FwaS92MWA7XG5cbiAgICBpZiAoc3VtbWl0SWQpIHtcbiAgICAgICAgYXBpVXJsICs9IGAvc3VtbWl0cy8ke3N1bW1pdElkfWA7XG4gICAgfVxuXG4gICAgYXBpVXJsICs9IGAvc3BlYWtlcnM/ZmlsdGVyPSR7ZmlsdGVyc30mYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59JmV4cGFuZD1tZW1iZXIscmVnaXN0cmF0aW9uX3JlcXVlc3RgO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGFwaVVybCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5VGFncyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgYXBpVXJsID0gYC9hcGkvdjFgO1xuICAgIGxldCBmaWx0ZXIgPSBlbmNvZGVVUklDb21wb25lbnQoYHRhZz1AJHtpbnB1dH1gKTtcblxuICAgIGlmIChzdW1taXRJZCkge1xuICAgICAgICBhcGlVcmwgKz0gYC9zdW1taXRzLyR7c3VtbWl0SWR9L3RyYWNrLXRhZy1ncm91cHMvYWxsL2FsbG93ZWQtdGFncz9maWx0ZXI9JHtmaWx0ZXJ9JmV4cGFuZD10YWcsdHJhY2tfdGFnX2dyb3VwYDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcGlVcmwgKz0gYC90YWdzP2ZpbHRlcj0ke2ZpbHRlcn1gO1xuICAgIH1cblxuICAgIGFwaVVybCArPSBgJm9yZGVyPXRhZyZwYWdlPTEmcGVyX3BhZ2U9NTAmYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YDtcblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChhcGlVcmwpKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGlmIChzdW1taXRJZCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLm1hcCh0ID0+IHQudGFnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5VHJhY2tzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXIgPSBlbmNvZGVVUklDb21wb25lbnQoYG5hbWU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvc3VtbWl0cy8ke3N1bW1pdElkfS90cmFja3M/ZmlsdGVyPSR7ZmlsdGVyfSZvcmRlcj1uYW1lJmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVRyYWNrR3JvdXBzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXIgPSBpbnB1dCA/IGVuY29kZVVSSUNvbXBvbmVudChgZmlsdGVyPW5hbWU9QCR7aW5wdXR9YCkgOiAnJztcblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChgL2FwaS92MS9zdW1taXRzLyR7c3VtbWl0SWR9L3RyYWNrLWdyb3Vwcz9vcmRlcj1uYW1lJmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufSYke2ZpbHRlcn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cblxuXG5leHBvcnQgY29uc3QgcXVlcnlFdmVudHMgPSBfLmRlYm91bmNlKGFzeW5jIChzdW1taXRJZCwgaW5wdXQsIG9ubHlQdWJsaXNoZWQgPSBmYWxzZSwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgYmFzZVVybCA9IGAvYXBpL3YxL3N1bW1pdHMvJHtzdW1taXRJZH0vZXZlbnRzYCArIChvbmx5UHVibGlzaGVkID8gJy9wdWJsaXNoZWQnIDogJycpO1xuICAgIGxldCBmaWx0ZXIgPSBlbmNvZGVVUklDb21wb25lbnQoYHRpdGxlPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAke2Jhc2VVcmx9P2ZpbHRlcj0ke2ZpbHRlcn0mb3JkZXI9dGl0bGUmYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5leHBvcnQgY29uc3QgcXVlcnlFdmVudFR5cGVzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaywgZXZlbnRUeXBlQ2xhc3NOYW1lID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcblxuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuXG4gICAgbGV0IHVybCA9IGAvYXBpL3YxL3N1bW1pdHMvJHtzdW1taXRJZH0vZXZlbnQtdHlwZXM/b3JkZXI9bmFtZSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gO1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGVuY29kZVVSSUNvbXBvbmVudChgbmFtZT1AJHtpbnB1dH1gKTtcbiAgICAgICAgdXJsICs9IGAmZmlsdGVyW109JHtmaWx0ZXJ9YFxuICAgIH1cblxuICAgIGlmIChldmVudFR5cGVDbGFzc05hbWUpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gZW5jb2RlVVJJQ29tcG9uZW50KGBjbGFzc19uYW1lPT0ke2V2ZW50VHlwZUNsYXNzTmFtZX1gKTtcbiAgICAgICAgdXJsICs9IGAmZmlsdGVyW109JHtmaWx0ZXJ9YFxuICAgIH1cblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybCh1cmwpKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5leHBvcnQgY29uc3QgcXVlcnlHcm91cHMgPSBfLmRlYm91bmNlKGFzeW5jIChpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBsZXQgZmlsdGVycyA9IGVuY29kZVVSSUNvbXBvbmVudChgdGl0bGU9QCR7aW5wdXR9LGNvZGU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvZ3JvdXBzP2ZpbHRlcj0ke2ZpbHRlcnN9JmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5cbmV4cG9ydCBjb25zdCBxdWVyeUNvbXBhbmllcyA9IF8uZGVib3VuY2UoYXN5bmMgKGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBuYW1lPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL2NvbXBhbmllcz9maWx0ZXI9JHtmaWx0ZXJzfSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cbmV4cG9ydCBjb25zdCBxdWVyeVJlZ2lzdHJhdGlvbkNvbXBhbmllcyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGxldCBhY2Nlc3NUb2tlbjtcblxuICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFwaVVybCA9IFVSSShgL2FwaS92MS9zdW1taXRzLyR7c3VtbWl0SWR9L3JlZ2lzdHJhdGlvbi1jb21wYW5pZXNgKTtcbiAgICBhcGlVcmwuYWRkUXVlcnkoJ2FjY2Vzc190b2tlbicsIGFjY2Vzc1Rva2VuKTtcbiAgICBhcGlVcmwuYWRkUXVlcnkoJ29yZGVyJywnbmFtZScpXG5cbiAgICBpZihpbnB1dCkge1xuICAgICAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICAgICAgYXBpVXJsLmFkZFF1ZXJ5KCdmaWx0ZXJbXScsIGBuYW1lQEAke2lucHV0fWApO1xuICAgIH1cblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChhcGlVcmwudG9TdHJpbmcoKSkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVNwb25zb3JzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBjb21wYW55X25hbWU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvc3VtbWl0cy8ke3N1bW1pdElkfS9zcG9uc29ycz9maWx0ZXI9JHtmaWx0ZXJzfSZleHBhbmQ9Y29tcGFueSxzcG9uc29yc2hpcCZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cbmV4cG9ydCBjb25zdCBxdWVyeUFjY2Vzc0xldmVscyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgZmlsdGVycyA9IGVuY29kZVVSSUNvbXBvbmVudChgbmFtZT1AJHtpbnB1dH1gKTtcblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChgL2FwaS92MS9zdW1taXRzLyR7c3VtbWl0SWR9L2FjY2Vzcy1sZXZlbC10eXBlcz9maWx0ZXI9JHtmaWx0ZXJzfSYmYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5leHBvcnQgY29uc3QgcXVlcnlPcmdhbml6YXRpb25zID0gXy5kZWJvdW5jZShhc3luYyAoaW5wdXQsIGNhbGxiYWNrKSA9PiB7XG5cbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XG4gICAgaW5wdXQgPSBlc2NhcGVGaWx0ZXJWYWx1ZShpbnB1dCk7XG4gICAgbGV0IGZpbHRlcnMgPSBlbmNvZGVVUklDb21wb25lbnQoYG5hbWU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvb3JnYW5pemF0aW9ucz9maWx0ZXI9JHtmaWx0ZXJzfSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cblxuZXhwb3J0IGNvbnN0IGdldExhbmd1YWdlTGlzdCA9IChjYWxsYmFjaywgc2lnbmFsKSA9PiB7XG4gICAgcmV0dXJuIGZldGNoKGJ1aWxkQVBJQmFzZVVybChgL2FwaS9wdWJsaWMvdjEvbGFuZ3VhZ2VzYCksIHtzaWduYWx9KVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn07XG5cblxuZXhwb3J0IGNvbnN0IGdldENvdW50cnlMaXN0ID0gKGNhbGxiYWNrLCBzaWduYWwpID0+IHtcblxuICAgIHJldHVybiBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvcHVibGljL3YxL2NvdW50cmllc2ApLCB7c2lnbmFsfSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2socmVzcG9uc2UuZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59O1xuXG52YXIgZ2VvY29kZXI7XG5cbmV4cG9ydCBjb25zdCBnZW9Db2RlQWRkcmVzcyA9IChhZGRyZXNzKSA9PiB7XG5cbiAgICBpZiAoIWdlb2NvZGVyKSBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuXG4gICAgLy8gcmV0dXJuIGEgUHJvbWlzZVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCkge1xuICAgICAgICBnZW9jb2Rlci5nZW9jb2RlKCB7ICdhZGRyZXNzJzogYWRkcmVzc30sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykge1xuICAgICAgICAgICAgICAgIC8vIHJlc29sdmUgcmVzdWx0cyB1cG9uIGEgc3VjY2Vzc2Z1bCBzdGF0dXNcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyByZWplY3Qgc3RhdHVzIHVwb24gdW4tc3VjY2Vzc2Z1bCBzdGF0dXNcbiAgICAgICAgICAgICAgICByZWplY3Qoc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VvQ29kZUxhdExuZyA9IChsYXQsIGxuZykgPT4ge1xuXG4gICAgaWYgKCFnZW9jb2RlcikgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcblxuICAgIHZhciBsYXRsbmcgPSB7bGF0OiBwYXJzZUZsb2F0KGxhdCksIGxuZzogcGFyc2VGbG9hdChsbmcpfTtcbiAgICAvLyByZXR1cm4gYSBQcm9taXNlXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KSB7XG4gICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoIHsgJ2xvY2F0aW9uJzogbGF0bG5nfSwgZnVuY3Rpb24ocmVzdWx0cywgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzLk9LKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZSByZXN1bHRzIHVwb24gYSBzdWNjZXNzZnVsIHN0YXR1c1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHJlamVjdCBzdGF0dXMgdXBvbiB1bi1zdWNjZXNzZnVsIHN0YXR1c1xuICAgICAgICAgICAgICAgIHJlamVjdChzdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5VGlja2V0VHlwZXMgPSBfLmRlYm91bmNlKGFzeW5jIChzdW1taXRJZCwgZmlsdGVycyA9IHt9LCBjYWxsYmFjaywgdmVyc2lvbiA9ICd2MScpID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcblxuICAgIGxldCBhcGlVcmwgPSBVUkkoYC9hcGkvJHt2ZXJzaW9ufS9zdW1taXRzLyR7c3VtbWl0SWR9L3RpY2tldC10eXBlc2ApO1xuICAgIGFwaVVybC5hZGRRdWVyeSgnYWNjZXNzX3Rva2VuJywgYWNjZXNzVG9rZW4pO1xuICAgIGFwaVVybC5hZGRRdWVyeSgnb3JkZXInLCduYW1lJylcblxuICAgIGlmKGZpbHRlcnMuaGFzT3duUHJvcGVydHkoJ25hbWUnKSkge1xuICAgICAgICBjb25zdCBuYW1lID0gZXNjYXBlRmlsdGVyVmFsdWUoZmlsdGVycy5uYW1lKTtcbiAgICAgICAgYXBpVXJsLmFkZFF1ZXJ5KCdmaWx0ZXJbXScsIGBuYW1lQEAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYoZmlsdGVycy5oYXNPd25Qcm9wZXJ0eSgnYXVkaWVuY2UnKSl7XG4gICAgICAgIGNvbnN0IGF1ZGllbmNlID0gZXNjYXBlRmlsdGVyVmFsdWUoZmlsdGVycy5hdWRpZW5jZSk7XG4gICAgICAgIGFwaVVybC5hZGRRdWVyeSgnZmlsdGVyW10nLCBgYXVkaWVuY2U9PSR7YXVkaWVuY2V9YCk7XG4gICAgfVxuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGFwaVVybC50b1N0cmluZygpKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVNwb25zb3JlZFByb2plY3RzID0gXy5kZWJvdW5jZShhc3luYyAoaW5wdXQsIGNhbGxiYWNrKSA9PiB7XG5cbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XG4gICAgY29uc3QgYXBpVXJsID0gVVJJKGAvYXBpL3YxL3Nwb25zb3JlZC1wcm9qZWN0c2ApO1xuICAgIGFwaVVybC5hZGRRdWVyeSgnYWNjZXNzX3Rva2VuJywgYWNjZXNzVG9rZW4pO1xuICAgIGlmKGlucHV0KSB7XG4gICAgICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgICAgICBhcGlVcmwuYWRkUXVlcnkoJ2ZpbHRlcltdJywgYG5hbWU9QCR7aW5wdXR9YCk7XG4gICAgfVxuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGFwaVVybC50b1N0cmluZygpKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVByb21vY29kZXMgPSBfLmRlYm91bmNlKGFzeW5jIChzdW1taXRJZCwgaW5wdXQsIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBjb2RlPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL3N1bW1pdHMvJHtzdW1taXRJZH0vcHJvbW8tY29kZXM/ZmlsdGVyPSR7ZmlsdGVyc30mYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJicm93c2VyLXRhYnMtbG9ja1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG8tanMvZW5jLWJhc2U2NHVybFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG8tanMvZW5jLWhleFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG8tanMvc2hhMjU2XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImkxOG4tcmVhY3QvZGlzdC9pMThuLXJlYWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImlkdG9rZW4tdmVyaWZpZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vbWVudC10aW1lem9uZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LXNlbGVjdC9saWIvQXN5bmNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic3VwZXJhZ2VudC9saWIvY2xpZW50XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInN3ZWV0YWxlcnQyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInVyaWpzXCIpOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE3IE9wZW5TdGFjayBGb3VuZGF0aW9uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiovXG5cbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJ1xuaW1wb3J0IEFzeW5jU2VsZWN0IGZyb20gJ3JlYWN0LXNlbGVjdC9saWIvQXN5bmMnO1xuaW1wb3J0IHsgcXVlcnlSZWdpc3RyYXRpb25Db21wYW5pZXMgfSBmcm9tICcuLi8uLi91dGlscy9xdWVyeS1hY3Rpb25zJztcblxuY29uc3QgUmVnaXN0cmF0aW9uQ29tcGFueUlucHV0ID0gKHsgZXJyb3IsIHZhbHVlLCBvbkNoYW5nZSwgaWQsIG11bHRpLCBpc011bHRpLCBkaXNhYmxlZCwgY2xhc3NOYW1lLCBzdW1taXRJZCwgb25FcnJvciwgaW5wdXRQbGFjZWhvbGRlciwgRERMUGxhY2Vob2xkZXIsIHRhYlNlbGVjdHNWYWx1ZSwgc2VsZWN0U3R5bGVzLCAuLi5yZXN0IH0pID0+IHtcblxuICAgIGNvbnN0IFt0aGVWYWx1ZSwgc2V0VGhlVmFsdWVdID0gdXNlU3RhdGUoeyB2YWx1ZTogbnVsbCwgbGFiZWw6ICcnIH0pO1xuICAgIGNvbnN0IFtmcmVlSW5wdXQsIHNldEZyZWVJbnB1dF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFtpc011bHRpT3B0aW9uYWwsIHNldElzTXVsdGlPcHRpb25hbF0gPSB1c2VTdGF0ZShtdWx0aSB8fCBpc011bHRpKTtcbiAgICBjb25zdCBbaW5wdXREaXNhYmxlZCwgc2V0SW5wdXREaXNhYmxlZF0gPSB1c2VTdGF0ZShkaXNhYmxlZClcbiAgICBjb25zdCBbaGFzRXJyb3IsIHNldEhhc0Vycm9yXSA9IHVzZVN0YXRlKGVycm9yKTtcbiAgICBjb25zdCBbbm9Db21wYW5pZXMsIHNldE5vQ29tcGFuaWVzXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHNldEhhc0Vycm9yKGVycm9yKTtcbiAgICB9LCBbZXJyb3JdKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghdmFsdWUuaWQgJiYgdmFsdWUubmFtZSkge1xuICAgICAgICAgICAgc2V0RnJlZUlucHV0KHRydWUpO1xuICAgICAgICAgICAgc2V0SW5wdXRWYWx1ZSh2YWx1ZS5uYW1lKTtcbiAgICAgICAgICAgIHNldFRoZVZhbHVlKHsgdmFsdWU6IG51bGwsIGxhYmVsOiB2YWx1ZS5uYW1lIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNNdWx0aSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0VGhlVmFsdWUodmFsdWUubWFwKHYgPT4gKHsgdmFsdWU6IHYuaWQsIGxhYmVsOiB2Lm5hbWUgfSkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTXVsdGkgJiYgdmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICBzZXRUaGVWYWx1ZSh7IHZhbHVlOiB2YWx1ZS5pZCwgbGFiZWw6IHZhbHVlLm5hbWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBbdmFsdWVdKVxuXG4gICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGV2ZW50VmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50VmFsdWUudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHNldEZyZWVJbnB1dCh0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlU3RhdGUgPSBpc011bHRpT3B0aW9uYWwgPyBldmVudFZhbHVlLm1hcCh2ID0+ICh7IHZhbHVlOiB2LnZhbHVlLCBsYWJlbDogJycgfSkpIDogeyB2YWx1ZTogZXZlbnRWYWx1ZS52YWx1ZSwgbGFiZWw6ICcnIH07XG4gICAgICAgICAgICBzZXRUaGVWYWx1ZShuZXdWYWx1ZVN0YXRlKTtcbiAgICAgICAgICAgIGxldCBldiA9IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvbXBhbnlpbnB1dCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgb25DaGFuZ2UoZXYpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBpc011bHRpT3B0aW9uYWwgPyBldmVudFZhbHVlLm1hcCh2ID0+ICh7IGlkOiB2LnZhbHVlLCBuYW1lOiB2LmxhYmVsIH0pKSA6IHsgaWQ6IGV2ZW50VmFsdWUudmFsdWUsIG5hbWU6IGV2ZW50VmFsdWUubGFiZWwgfTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVTdGF0ZSA9IGlzTXVsdGlPcHRpb25hbCA/IGV2ZW50VmFsdWUubWFwKHYgPT4gKHsgdmFsdWU6IHYudmFsdWUsIGxhYmVsOiB2LmxhYmVsIH0pKSA6IHsgdmFsdWU6IGV2ZW50VmFsdWUudmFsdWUsIGxhYmVsOiBldmVudFZhbHVlLmxhYmVsIH07XG4gICAgICAgIHNldFRoZVZhbHVlKG5ld1ZhbHVlU3RhdGUpO1xuXG5cbiAgICAgICAgbGV0IGV2ID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29tcGFueWlucHV0J1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBvbkNoYW5nZShldik7XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlSW5wdXRDbGVhciA9ICgpID0+IHtcbiAgICAgICAgc2V0RnJlZUlucHV0KCFmcmVlSW5wdXQpO1xuICAgICAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICAgICAgc2V0VGhlVmFsdWUoeyB2YWx1ZTogbnVsbCwgbGFiZWw6ICcnIH0pO1xuICAgICAgICBsZXQgZXYgPSB7XG4gICAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHsgaWQ6IG51bGwsIG5hbWU6ICcnIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogJ2NvbXBhbnlpbnB1dCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgb25DaGFuZ2UoZXYpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gKGV2dCkgPT4ge1xuICAgICAgICBzZXRJbnB1dFZhbHVlKGV2dC50YXJnZXQudmFsdWUpO1xuICAgICAgICBsZXQgZXYgPSB7XG4gICAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHsgaWQ6IG51bGwsIG5hbWU6IGV2dC50YXJnZXQudmFsdWUgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29tcGFueWlucHV0J1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBvbkNoYW5nZShldik7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0Q29tcGFuaWVzID0gKGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZU9wdGlvbnMgPSAob3B0aW9ucykgPT4ge1xuXG4gICAgICAgICAgICAvLyBpZiB0aGUgc3VtbWl0IGhhcyBubyBjb21wYW5pZXMsIHNldCB0aGUgaW5wdXQgb25seSBhcyB0ZXh0XG4gICAgICAgICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldE5vQ29tcGFuaWVzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBzZXRGcmVlSW5wdXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGlucHV0IGlzIGVtcHR5LCBzZXQgb25seSB0aGlzIG9wdGlvbiBhcyBkZWZhdWx0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb24gPSB7IHZhbHVlOiBudWxsLCBsYWJlbDogJ090aGVyJyB9O1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhbZGVmYXVsdE9wdGlvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBvbkVycm9yKG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBtYXAgaW50byB2YWx1ZS9sYWJlbCBiZWNhdXNlIG9mIGEgYnVnIGluIHJlYWN0LXNlbGVjdCAyXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vSmVkV2F0c29uL3JlYWN0LXNlbGVjdC9pc3N1ZXMvMjk5OFxuICAgICAgICAgICAgY29uc3Qgb3RoZXJPcHRpb24gPSB7IHZhbHVlOiBudWxsLCBsYWJlbDogJ090aGVyJyB9O1xuICAgICAgICAgICAgbGV0IG5ld09wdGlvbnMgPSBbLi4ub3B0aW9ucy5tYXAoYyA9PiAoeyB2YWx1ZTogYy5pZC50b1N0cmluZygpLCBsYWJlbDogYy5uYW1lIH0pKSwgb3RoZXJPcHRpb25dO1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3T3B0aW9ucyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcXVlcnlSZWdpc3RyYXRpb25Db21wYW5pZXMoc3VtbWl0SWQsIGlucHV0LCB0cmFuc2xhdGVPcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IHN0eWxlPXt7IHBvc2l0aW9uOiAncmVsYXRpdmUnIH19PlxuICAgICAgICAgICAge2ZyZWVJbnB1dCA/XG4gICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17aW5wdXRWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtpbnB1dFBsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IHBhZGRpbmdSaWdodDogMjUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpbnB1dERpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIHtpbnB1dERpc2FibGVkIHx8ICFub0NvbXBhbmllcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYXJpYS1sYWJlbD0nQ2xlYXInIHN0eWxlPXt7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB0b3A6IDEwLCByaWdodDogMTAsIGN1cnNvcjogJ3BvaW50ZXInLCBvcGFjaXR5OiAnNjUlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUlucHV0Q2xlYXJ9IGNsYXNzTmFtZT0nZmEgZmEtY2xvc2UnPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgIDxBc3luY1NlbGVjdFxuICAgICAgICAgICAgICAgICAgICAvLyBQYXNzaW5nIG51bGwgaWYgbm8gbGFiZWwgYW5kIHZhbHVlIHRvIHNob3cgdGhlIHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGVWYWx1ZS5sYWJlbCAmJiB0aGVWYWx1ZS52YWx1ZSA/IHRoZVZhbHVlIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgaW5wdXRJZD17aWR9XG4gICAgICAgICAgICAgICAgICAgIHRhYlNlbGVjdHNWYWx1ZT17dGFiU2VsZWN0c1ZhbHVlfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17RERMUGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICBsb2FkT3B0aW9ucz17Z2V0Q29tcGFuaWVzfVxuICAgICAgICAgICAgICAgICAgICBpc011bHRpPXtpc011bHRpT3B0aW9uYWx9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZXM9e3NlbGVjdFN0eWxlc31cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHtoYXNFcnJvciAmJlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImVycm9yLWxhYmVsXCI+e2Vycm9yfTwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcblxufVxuXG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyYXRpb25Db21wYW55SW5wdXQ7XG5cblJlZ2lzdHJhdGlvbkNvbXBhbnlJbnB1dC5kZWZhdWx0UHJvcHMgPSB7XG4gICAgaW5wdXRQbGFjZWhvbGRlcjogJ0VudGVyIHlvdXIgY29tcGFueScsXG4gICAgRERMUGxhY2Vob2xkZXI6ICdTZWxlY3QgYSBjb21wYW55JyxcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgdGFiU2VsZWN0c1ZhbHVlOiBmYWxzZVxufVxuXG5SZWdpc3RyYXRpb25Db21wYW55SW5wdXQucHJvcFR5cGVzID0ge1xuICAgIG9uRXJyb3I6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn07Il0sIm5hbWVzIjpbIlQiLCJhdXRoRXJyb3JIYW5kbGVyIiwiY3JlYXRlQWN0aW9uIiwiZ2V0UmVxdWVzdCIsInNob3dNZXNzYWdlIiwic3RhcnRMb2FkaW5nIiwic3RvcExvYWRpbmciLCJidWlsZEFQSUJhc2VVcmwiLCJnZXRBbGxvd2VkVXNlckdyb3VwcyIsImdldEFjY2Vzc1Rva2VuIiwic3RvcmVBdXRoSW5mbyIsImluaXRMb2dPdXQiLCJTRVRfTE9HR0VEX1VTRVIiLCJMT0dPVVRfVVNFUiIsIlJFUVVFU1RfVVNFUl9JTkZPIiwiUkVDRUlWRV9VU0VSX0lORk8iLCJDTEVBUl9TRVNTSU9OX1NUQVRFIiwiVVBEQVRFX1NFU1NJT05fU1RBVEVfU1RBVFVTIiwiU0VTU0lPTl9TVEFURV9TVEFUVVNfVU5DSEFOR0VEIiwiU0VTU0lPTl9TVEFURV9TVEFUVVNfQ0hBTkdFRCIsIlNFU1NJT05fU1RBVEVfU1RBVFVTX0VSUk9SIiwiVVBEQVRFX1VTRVJfSU5GTyIsIm9uVXNlckF1dGgiLCJhY2Nlc3NUb2tlbiIsImlkVG9rZW4iLCJzZXNzaW9uU3RhdGUiLCJleHBpcmVzSW4iLCJyZWZyZXNoVG9rZW4iLCJkaXNwYXRjaCIsInR5cGUiLCJwYXlsb2FkIiwiZG9Mb2dvdXQiLCJiYWNrVXJsIiwiZ2V0U3RhdGUiLCJnZXRVc2VySW5mbyIsImV4cGFuZCIsImZpZWxkcyIsImhpc3RvcnkiLCJlcnJvckhhbmRsZXIiLCJBbGxvd2VkVXNlckdyb3VwcyIsInNwbGl0IiwibG9nZ2VkVXNlclN0YXRlIiwibWVtYmVyIiwicHVzaCIsIlByb21pc2UiLCJyZXNvbHZlIiwicGFyYW1zIiwiYWNjZXNzX3Rva2VuIiwidGhlbiIsImVycm9yX21lc3NhZ2UiLCJ0aXRsZSIsImh0bWwiLCJ0cmFuc2xhdGUiLCJsZW5ndGgiLCJhbGxvd2VkR3JvdXBzIiwiZ3JvdXBzIiwiZmlsdGVyIiwiZ3JvdXAiLCJpZHgiLCJpbmNsdWRlcyIsImNvZGUiLCJ1cGRhdGVVc2VySW5mbyIsInVwZGF0ZWRNZW1iZXIiLCJFcnJvciIsImlkIiwidXBkYXRlU2Vzc2lvblN0YXRlU3RhdHVzIiwibmV3U3RhdHVzIiwic2Vzc2lvblN0YXRlU3RhdHVzIiwiQVVUSF9FUlJPUl9NSVNTSU5HX0FVVEhfSU5GTyIsIkFVVEhfRVJST1JfTUlTU0lOR19SRUZSRVNIX1RPS0VOIiwiQVVUSF9FUlJPUl9BQ0NFU1NfVE9LRU5fRVhQSVJFRCIsIkFVVEhfRVJST1JfTE9DS19BQ1FVSVJFX0VSUk9SIiwiQVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1IiLCJBVVRIX0VSUk9SX0lEX1RPS0VOX0lOVkFMSUQiLCJBVVRIX0VSUk9SX01JU1NJTkdfT1RQX1BBUkFNIiwiYmFzZTY0VVJMRW5jb2RlIiwiZ2V0QXV0aENhbGxiYWNrIiwiZ2V0Q3VycmVudExvY2F0aW9uIiwiZ2V0Q3VycmVudFBhdGhOYW1lIiwiZ2V0RnJvbUxvY2FsU3RvcmFnZSIsInJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UiLCJnZXRPcmlnaW4iLCJwdXRPbkxvY2FsU3RvcmFnZSIsInJldHJ5UHJvbWlzZSIsInNldFNlc3Npb25DbGVhcmluZ1N0YXRlIiwicmVxdWVzdCIsIkxvY2siLCJodHRwIiwibG9jayIsIkdFVF9UT0tFTl9TSUxFTlRMWV9MT0NLX0tFWSIsIk5PTkNFX0xFTiIsIkFDQ0VTU19UT0tFTl9TS0VXX1RJTUUiLCJSRVNQT05TRV9UWVBFX0lNUExJQ0lUIiwiUkVTUE9OU0VfVFlQRV9DT0RFIiwiQVVUSF9JTkZPIiwiTk9OQ0UiLCJQS0NFIiwiVVJJIiwiSWRUb2tlblZlcmlmaWVyIiwiZ2V0UmFuZG9tQnl0ZXMiLCJnZXRTSEEyNTYiLCJnZXRBdXRoVXJsIiwicHJvbXB0IiwidG9rZW5JZEhpbnQiLCJwcm92aWRlciIsImxvZ2luSGludCIsIm90cExvZ2luSGludCIsIm9hdXRoMkNsaWVudElkIiwiZ2V0T0F1dGgyQ2xpZW50SWQiLCJyZWRpcmVjdFVyaSIsImJhc2VVcmwiLCJnZXRPQXV0aDJJRFBCYXNlVXJsIiwic2NvcGVzIiwiZ2V0T0F1dGgyU2NvcGVzIiwiZmxvdyIsImdldE9BdXRoMkZsb3ciLCJlbmNvZGVVUkkiLCJub25jZSIsImNyZWF0ZU5vbmNlIiwidXJsIiwicXVlcnkiLCJwa2NlIiwiY3JlYXRlUEtDRUNvZGVzIiwiSlNPTiIsInN0cmluZ2lmeSIsImNvZGVDaGFsbGVuZ2UiLCJnZXRMb2dvdXRVcmwiLCJzdGF0ZSIsInBvc3RMb2dPdXRVcmkiLCJsZW4iLCJwb3NzaWJsZSIsImkiLCJjaGFyQXQiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJkb0xvZ2luIiwibG9jYXRpb24iLCJyZXBsYWNlIiwidG9TdHJpbmciLCJkb0xvZ2luQmFzaWNMb2dpbiIsImNvZGVWZXJpZmllciIsImNyZWF0ZWRBdCIsIkRhdGUiLCJjb2RlUGFpciIsImVtaXRBY2Nlc3NUb2tlbiIsInBhcnNlIiwicmVzcG9uc2UiLCJmZXRjaCIsIm1ldGhvZCIsImhlYWRlcnMiLCJib2R5IiwiY2F0Y2giLCJlcnJvciIsImNvbnNvbGUiLCJsb2ciLCJtZXNzYWdlIiwianNvbiIsInJlZnJlc2hfdG9rZW4iLCJpZF90b2tlbiIsImV4cGlyZXNfaW4iLCJlcnJvcl9kZXNjcmlwdGlvbiIsImVyciIsImNsZWFyQWNjZXNzVG9rZW4iLCJhY3F1aXJlTG9jayIsImF1dGhJbmZvIiwiZ2V0QXV0aEluZm8iLCJhY2Nlc3NUb2tlblVwZGF0ZWRBdCIsInJlbGVhc2VMb2NrIiwibm93IiwidGltZUVsYXBzZWRTZWNzIiwidXNlT0F1dGgyUmVmcmVzaFRva2VuIiwiY2xlYXJBdXRoSW5mbyIsInJlZnJlc2hBY2Nlc3NUb2tlbiIsInN0YXR1cyIsImN1cnJlbnRMb2NhdGlvbiIsInN0YXR1c1RleHQiLCJmb3JtZXJBdXRoSW5mbyIsInJlcyIsIndpbmRvdyIsImdldElkVG9rZW4iLCJPQVVUSDJfQ0xJRU5UX0lEIiwiT0FVVEgyX0ZMT1ciLCJCb29sZWFuIiwiT0FVVEgyX1VTRV9SRUZSRVNIX1RPS0VOIiwiSURQX0JBU0VfVVJMIiwiU0NPUEVTIiwidmFsaWRhdGVJZFRva2VuIiwiaXNzdWVyIiwiYXVkaWVuY2UiLCJ2ZXJpZmllciIsInN0b3JlZE5vbmNlIiwiand0IiwiZGVjb2RlIiwiYWxnIiwiaGVhZGVyIiwia2lkIiwiYXVkIiwiaXNzIiwiZXhwIiwibmJmIiwidG5vbmNlIiwicGFzc3dvcmRsZXNzU3RhcnQiLCJjb25uZWN0aW9uIiwic2VuZCIsImhhc093blByb3BlcnR5IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZW1haWwiLCJwaG9uZV9udW1iZXIiLCJyZWRpcmVjdF91cmkiLCJyZXEiLCJwb3N0IiwicmVqZWN0IiwicGFzc3dvcmRsZXNzTG9naW4iLCJvdHAiLCJlIiwiaXNJZFRva2VuQWxpdmUiLCJub3dFcG9jaCIsIlN3YWwiLCJpc0NsZWFyaW5nU2Vzc2lvblN0YXRlIiwiR0VORVJJQ19FUlJPUiIsIlJFU0VUX0xPQURJTkciLCJTVEFSVF9MT0FESU5HIiwiU1RPUF9MT0FESU5HIiwiVkFMSURBVEUiLCJDTEVBUl9NRVNTQUdFIiwiU0hPV19NRVNTQUdFIiwicmVzZXRMb2FkaW5nIiwieGhycyIsImV0YWdDYWNoZSIsImNhbmNlbCIsImtleSIsImFib3J0Iiwic2NoZWR1bGUiLCJpc09iamVjdEVtcHR5Iiwib2JqIiwiT2JqZWN0Iiwia2V5cyIsImNvbnN0cnVjdG9yIiwibXNnIiwiY2xlYXJpbmdfc2Vzc2lvbl9zdGF0ZSIsImZpcmUiLCJ2YWx1ZSIsImVudHJpZXMiLCJlcnJvcnMiLCJpc05hTiIsInJlcXVlc3RBY3Rpb25DcmVhdG9yIiwicmVjZWl2ZUFjdGlvbkNyZWF0b3IiLCJlbmRwb2ludCIsImRlZmF1bHRFcnJvckhhbmRsZXIiLCJyZXF1ZXN0QWN0aW9uUGF5bG9hZCIsInVzZUV0YWciLCJfIiwibmV3UGFyYW1zIiwiZ2V0IiwiZXRhZyIsInNldCIsInRpbWVvdXQiLCJkZWFkbGluZSIsImVuZCIsInJlc3BvbnNlSGFuZGxlciIsInB1dFJlcXVlc3QiLCJwdXQiLCJkZWxldGVSZXF1ZXN0IiwiZGVsZXRlIiwicG9zdFJlcXVlc3QiLCJwb3N0RmlsZSIsImZpbGUiLCJmaWxlTWV0YWRhdGEiLCJhdHRhY2giLCJmb3JFYWNoIiwiZmllbGQiLCJwdXRGaWxlIiwidGV4dCIsImJ5TG93ZXJDYXNlIiwidG9GaW5kIiwidG9Mb3dlckNhc2UiLCJnZXRLZXlzIiwiZ2V0SGVhZGVyQ2FzZUluc2Vuc2l0aXZlIiwiaGVhZGVyTmFtZSIsImZpbmQiLCJ1bmRlZmluZWQiLCJvayIsInJlc3BvbnNlRVRBRyIsImZldGNoRXJyb3JIYW5kbGVyIiwiZmV0Y2hSZXNwb25zZUhhbmRsZXIiLCJzZXR0aW5ncyIsImNhbGxiYWNrIiwicmVzdWx0Iiwic2hvd1N1Y2Nlc3NNZXNzYWdlIiwiZG93bmxvYWRGaWxlQnlDb250ZW50IiwiZmlsZW5hbWUiLCJjb250ZW50IiwibWltZSIsImxpbmsiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ0ZXh0Q29udGVudCIsImRvd25sb2FkIiwiaHJlZiIsImFwcGVuZENoaWxkIiwiY2xpY2siLCJyZW1vdmVDaGlsZCIsImdldENTViIsImNzdiIsImdldFJhd0NTViIsImVzY2FwZUZpbHRlclZhbHVlIiwiTUFYX0JZVEVTIiwiTUFYX1VJTlQzMiIsImNyeXB0byIsIm1zQ3J5cHRvIiwic2hhMjU2IiwiQmFzZTY0dXJsIiwiSGV4Iiwic2l6ZSIsIlJhbmdlRXJyb3IiLCJieXRlcyIsIkJ1ZmZlciIsImFsbG9jVW5zYWZlIiwiYSIsImdlbmVyYXRlZCIsImdldFJhbmRvbVZhbHVlcyIsInNsaWNlIiwiZm9ybWF0IiwiZiIsIm1vbWVudCIsImZpbmRFbGVtZW50UG9zIiwiY3VydG9wIiwib2Zmc2V0UGFyZW50Iiwib2Zmc2V0VG9wIiwiZXBvY2hUb01vbWVudCIsImF0aW1lIiwiZXBvY2hUb01vbWVudFRpbWVab25lIiwidGltZV96b25lIiwidHoiLCJmb3JtYXRFcG9jaCIsIm9iamVjdFRvUXVlcnlTdHJpbmciLCJzdHIiLCJnZXRCYWNrVVJMIiwic2VhcmNoIiwiZnJhZ21lbnQiLCJ0b1NsdWciLCJvcmlnaW4iLCJ0b3AiLCJwYXRobmFtZSIsImdldEN1cnJlbnRIcmVmIiwiQUxMT1dFRF9VU0VSX0dST1VQUyIsInJlbGF0aXZlVXJsIiwiQVBJX0JBU0VfVVJMIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInJlbW92ZUl0IiwidmFsIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJnZXRDdXJyZW50VXNlckxhbmd1YWdlIiwibGFuZ3VhZ2UiLCJuYXZpZ2F0b3IiLCJsYW5ndWFnZXMiLCJ1c2VyTGFuZ3VhZ2UiLCJzY3JvbGxUb0Vycm9yIiwiZmlyc3RFcnJvciIsImZpcnN0Tm9kZSIsImdldEVsZW1lbnRCeUlkIiwic2Nyb2xsVG8iLCJoYXNFcnJvcnMiLCJzaGFsbG93RXF1YWwiLCJvYmplY3QxIiwib2JqZWN0MiIsImtleXMxIiwia2V5czIiLCJhcnJheXNFcXVhbCIsImExIiwiYTIiLCJldmVyeSIsIm8iLCJpc0VtcHR5IiwiY2IiLCJtYXhOdW1iZXJPZlJldHJpZXMiLCJnZXRUaW1lU2VydmljZVVybCIsIlRJTUVJTlRFUlZBTFNJTkNFMTk3MF9BUElfVVJMIiwicHJvY2VzcyIsImVudiIsIlJFQ0VJVkVfQ09VTlRSSUVTIiwiY2FsbERlbGF5IiwicXVlcnlNZW1iZXJzIiwiZGVib3VuY2UiLCJpbnB1dCIsImZpbHRlcnMiLCJvcHRpb25zIiwiZGF0YSIsInF1ZXJ5U3VtbWl0cyIsInF1ZXJ5U3BlYWtlcnMiLCJzdW1taXRJZCIsImFwaVVybCIsInF1ZXJ5VGFncyIsIm1hcCIsInQiLCJ0YWciLCJxdWVyeVRyYWNrcyIsInF1ZXJ5VHJhY2tHcm91cHMiLCJxdWVyeUV2ZW50cyIsIm9ubHlQdWJsaXNoZWQiLCJxdWVyeUV2ZW50VHlwZXMiLCJldmVudFR5cGVDbGFzc05hbWUiLCJxdWVyeUdyb3VwcyIsInF1ZXJ5Q29tcGFuaWVzIiwicXVlcnlSZWdpc3RyYXRpb25Db21wYW5pZXMiLCJhZGRRdWVyeSIsInF1ZXJ5U3BvbnNvcnMiLCJxdWVyeUFjY2Vzc0xldmVscyIsInF1ZXJ5T3JnYW5pemF0aW9ucyIsImdldExhbmd1YWdlTGlzdCIsInNpZ25hbCIsImdldENvdW50cnlMaXN0IiwiZ2VvY29kZXIiLCJnZW9Db2RlQWRkcmVzcyIsImFkZHJlc3MiLCJnb29nbGUiLCJtYXBzIiwiR2VvY29kZXIiLCJnZW9jb2RlIiwicmVzdWx0cyIsIkdlb2NvZGVyU3RhdHVzIiwiT0siLCJnZW9Db2RlTGF0TG5nIiwibGF0IiwibG5nIiwibGF0bG5nIiwicGFyc2VGbG9hdCIsInF1ZXJ5VGlja2V0VHlwZXMiLCJ2ZXJzaW9uIiwibmFtZSIsInF1ZXJ5U3BvbnNvcmVkUHJvamVjdHMiLCJxdWVyeVByb21vY29kZXMiLCJSZWFjdCIsInVzZVN0YXRlIiwidXNlRWZmZWN0IiwiUHJvcFR5cGVzIiwiQXN5bmNTZWxlY3QiLCJSZWdpc3RyYXRpb25Db21wYW55SW5wdXQiLCJvbkNoYW5nZSIsIm11bHRpIiwiaXNNdWx0aSIsImRpc2FibGVkIiwiY2xhc3NOYW1lIiwib25FcnJvciIsImlucHV0UGxhY2Vob2xkZXIiLCJERExQbGFjZWhvbGRlciIsInRhYlNlbGVjdHNWYWx1ZSIsInNlbGVjdFN0eWxlcyIsInJlc3QiLCJ0aGVWYWx1ZSIsInNldFRoZVZhbHVlIiwibGFiZWwiLCJmcmVlSW5wdXQiLCJzZXRGcmVlSW5wdXQiLCJpbnB1dFZhbHVlIiwic2V0SW5wdXRWYWx1ZSIsImlzTXVsdGlPcHRpb25hbCIsInNldElzTXVsdGlPcHRpb25hbCIsImlucHV0RGlzYWJsZWQiLCJzZXRJbnB1dERpc2FibGVkIiwiaGFzRXJyb3IiLCJzZXRIYXNFcnJvciIsIm5vQ29tcGFuaWVzIiwic2V0Tm9Db21wYW5pZXMiLCJ2IiwiaGFuZGxlQ2hhbmdlIiwiZXZlbnRWYWx1ZSIsIm5ld1ZhbHVlU3RhdGUiLCJldiIsInRhcmdldCIsIm5ld1ZhbHVlIiwiaGFuZGxlSW5wdXRDbGVhciIsImhhbmRsZUlucHV0Q2hhbmdlIiwiZXZ0IiwiZ2V0Q29tcGFuaWVzIiwidHJhbnNsYXRlT3B0aW9ucyIsImRlZmF1bHRPcHRpb24iLCJvdGhlck9wdGlvbiIsIm5ld09wdGlvbnMiLCJjIiwicG9zaXRpb24iLCJwYWRkaW5nUmlnaHQiLCJyaWdodCIsImN1cnNvciIsIm9wYWNpdHkiLCJkZWZhdWx0UHJvcHMiLCJwcm9wVHlwZXMiLCJmdW5jIiwiaXNSZXF1aXJlZCJdLCJzb3VyY2VSb290IjoiIn0=