@radio-garden/ditojs-admin 2.85.2-0.5067ad799

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 (153) hide show
  1. package/README.md +180 -0
  2. package/dist/dito-admin.css +1 -0
  3. package/dist/dito-admin.es.js +12106 -0
  4. package/dist/dito-admin.umd.js +7 -0
  5. package/package.json +96 -0
  6. package/src/DitoAdmin.js +293 -0
  7. package/src/DitoComponent.js +34 -0
  8. package/src/DitoContext.js +318 -0
  9. package/src/DitoTypeComponent.js +42 -0
  10. package/src/DitoUser.js +12 -0
  11. package/src/appState.js +12 -0
  12. package/src/components/DitoAccount.vue +60 -0
  13. package/src/components/DitoAffix.vue +68 -0
  14. package/src/components/DitoAffixes.vue +200 -0
  15. package/src/components/DitoButtons.vue +80 -0
  16. package/src/components/DitoClipboard.vue +186 -0
  17. package/src/components/DitoContainer.vue +374 -0
  18. package/src/components/DitoCreateButton.vue +146 -0
  19. package/src/components/DitoDialog.vue +242 -0
  20. package/src/components/DitoDraggable.vue +117 -0
  21. package/src/components/DitoEditButtons.vue +135 -0
  22. package/src/components/DitoErrors.vue +83 -0
  23. package/src/components/DitoForm.vue +521 -0
  24. package/src/components/DitoFormInner.vue +26 -0
  25. package/src/components/DitoFormNested.vue +17 -0
  26. package/src/components/DitoHeader.vue +84 -0
  27. package/src/components/DitoLabel.vue +200 -0
  28. package/src/components/DitoMenu.vue +186 -0
  29. package/src/components/DitoNavigation.vue +40 -0
  30. package/src/components/DitoNotifications.vue +170 -0
  31. package/src/components/DitoPagination.vue +42 -0
  32. package/src/components/DitoPane.vue +334 -0
  33. package/src/components/DitoPanel.vue +256 -0
  34. package/src/components/DitoPanels.vue +61 -0
  35. package/src/components/DitoRoot.vue +524 -0
  36. package/src/components/DitoSchema.vue +846 -0
  37. package/src/components/DitoSchemaInlined.vue +97 -0
  38. package/src/components/DitoScopes.vue +76 -0
  39. package/src/components/DitoSidebar.vue +50 -0
  40. package/src/components/DitoSpinner.vue +95 -0
  41. package/src/components/DitoTableCell.vue +64 -0
  42. package/src/components/DitoTableHead.vue +121 -0
  43. package/src/components/DitoTabs.vue +103 -0
  44. package/src/components/DitoTrail.vue +124 -0
  45. package/src/components/DitoTreeItem.vue +420 -0
  46. package/src/components/DitoUploadFile.vue +199 -0
  47. package/src/components/DitoVNode.vue +14 -0
  48. package/src/components/DitoView.vue +143 -0
  49. package/src/components/index.js +42 -0
  50. package/src/directives/resize.js +83 -0
  51. package/src/index.js +1 -0
  52. package/src/mixins/ContextMixin.js +68 -0
  53. package/src/mixins/DataMixin.js +131 -0
  54. package/src/mixins/DitoMixin.js +591 -0
  55. package/src/mixins/DomMixin.js +29 -0
  56. package/src/mixins/EmitterMixin.js +158 -0
  57. package/src/mixins/ItemMixin.js +144 -0
  58. package/src/mixins/LoadingMixin.js +23 -0
  59. package/src/mixins/NumberMixin.js +118 -0
  60. package/src/mixins/OptionsMixin.js +304 -0
  61. package/src/mixins/PulldownMixin.js +63 -0
  62. package/src/mixins/ResourceMixin.js +398 -0
  63. package/src/mixins/RouteMixin.js +190 -0
  64. package/src/mixins/SchemaParentMixin.js +33 -0
  65. package/src/mixins/SortableMixin.js +49 -0
  66. package/src/mixins/SourceMixin.js +734 -0
  67. package/src/mixins/TextMixin.js +26 -0
  68. package/src/mixins/TypeMixin.js +280 -0
  69. package/src/mixins/ValidationMixin.js +119 -0
  70. package/src/mixins/ValidatorMixin.js +57 -0
  71. package/src/mixins/ValueMixin.js +31 -0
  72. package/src/styles/_base.scss +17 -0
  73. package/src/styles/_button.scss +191 -0
  74. package/src/styles/_imports.scss +3 -0
  75. package/src/styles/_info.scss +19 -0
  76. package/src/styles/_layout.scss +19 -0
  77. package/src/styles/_pulldown.scss +38 -0
  78. package/src/styles/_scroll.scss +13 -0
  79. package/src/styles/_settings.scss +88 -0
  80. package/src/styles/_table.scss +223 -0
  81. package/src/styles/_tippy.scss +45 -0
  82. package/src/styles/style.scss +9 -0
  83. package/src/types/DitoTypeButton.vue +143 -0
  84. package/src/types/DitoTypeCheckbox.vue +27 -0
  85. package/src/types/DitoTypeCheckboxes.vue +65 -0
  86. package/src/types/DitoTypeCode.vue +199 -0
  87. package/src/types/DitoTypeColor.vue +272 -0
  88. package/src/types/DitoTypeComponent.vue +31 -0
  89. package/src/types/DitoTypeComputed.vue +50 -0
  90. package/src/types/DitoTypeDate.vue +99 -0
  91. package/src/types/DitoTypeLabel.vue +23 -0
  92. package/src/types/DitoTypeList.vue +364 -0
  93. package/src/types/DitoTypeMarkup.vue +700 -0
  94. package/src/types/DitoTypeMultiselect.vue +522 -0
  95. package/src/types/DitoTypeNumber.vue +66 -0
  96. package/src/types/DitoTypeObject.vue +136 -0
  97. package/src/types/DitoTypePanel.vue +18 -0
  98. package/src/types/DitoTypeProgress.vue +40 -0
  99. package/src/types/DitoTypeRadio.vue +45 -0
  100. package/src/types/DitoTypeSection.vue +80 -0
  101. package/src/types/DitoTypeSelect.vue +133 -0
  102. package/src/types/DitoTypeSlider.vue +66 -0
  103. package/src/types/DitoTypeSpacer.vue +11 -0
  104. package/src/types/DitoTypeSwitch.vue +40 -0
  105. package/src/types/DitoTypeText.vue +101 -0
  106. package/src/types/DitoTypeTextarea.vue +48 -0
  107. package/src/types/DitoTypeTreeList.vue +193 -0
  108. package/src/types/DitoTypeUpload.vue +503 -0
  109. package/src/types/index.js +30 -0
  110. package/src/utils/SchemaGraph.js +147 -0
  111. package/src/utils/accessor.js +75 -0
  112. package/src/utils/agent.js +47 -0
  113. package/src/utils/data.js +92 -0
  114. package/src/utils/filter.js +266 -0
  115. package/src/utils/math.js +14 -0
  116. package/src/utils/options.js +48 -0
  117. package/src/utils/path.js +5 -0
  118. package/src/utils/resource.js +44 -0
  119. package/src/utils/route.js +53 -0
  120. package/src/utils/schema.js +1121 -0
  121. package/src/utils/type.js +81 -0
  122. package/src/utils/uid.js +15 -0
  123. package/src/utils/units.js +5 -0
  124. package/src/validators/_creditcard.js +6 -0
  125. package/src/validators/_decimals.js +11 -0
  126. package/src/validators/_domain.js +6 -0
  127. package/src/validators/_email.js +6 -0
  128. package/src/validators/_hostname.js +6 -0
  129. package/src/validators/_integer.js +6 -0
  130. package/src/validators/_max.js +6 -0
  131. package/src/validators/_min.js +6 -0
  132. package/src/validators/_password.js +5 -0
  133. package/src/validators/_range.js +6 -0
  134. package/src/validators/_required.js +9 -0
  135. package/src/validators/_url.js +6 -0
  136. package/src/validators/index.js +12 -0
  137. package/src/verbs.js +17 -0
  138. package/types/index.d.ts +3298 -0
  139. package/types/tests/admin.test-d.ts +27 -0
  140. package/types/tests/component-buttons.test-d.ts +44 -0
  141. package/types/tests/component-list.test-d.ts +159 -0
  142. package/types/tests/component-misc.test-d.ts +137 -0
  143. package/types/tests/component-object.test-d.ts +69 -0
  144. package/types/tests/component-section.test-d.ts +174 -0
  145. package/types/tests/component-select.test-d.ts +107 -0
  146. package/types/tests/components.test-d.ts +81 -0
  147. package/types/tests/context.test-d.ts +31 -0
  148. package/types/tests/fixtures.ts +24 -0
  149. package/types/tests/form.test-d.ts +109 -0
  150. package/types/tests/instance.test-d.ts +20 -0
  151. package/types/tests/schema-features.test-d.ts +402 -0
  152. package/types/tests/variance.test-d.ts +125 -0
  153. package/types/tests/view.test-d.ts +146 -0
@@ -0,0 +1,7 @@
1
+ (function(n,W){typeof exports=="object"&&typeof module<"u"?module.exports=W(require("vue"),require("vue-router"),require("@kyvg/vue3-notification"),require("@ditojs/utils"),require("tippy.js"),require("nanoid"),require("focus-trap"),require("sortablejs"),require("codeflask"),require("tinycolor2"),require("@lk77/vue3-color"),require("@ditojs/ui"),require("@tiptap/vue-3"),require("@tiptap/extension-document"),require("@tiptap/extension-text"),require("@tiptap/extension-bold"),require("@tiptap/extension-code"),require("@tiptap/extension-italic"),require("@tiptap/extension-link"),require("@tiptap/extension-strike"),require("@tiptap/extension-subscript"),require("@tiptap/extension-superscript"),require("@tiptap/extension-underline"),require("@tiptap/extension-blockquote"),require("@tiptap/extension-code-block"),require("@tiptap/extension-hard-break"),require("@tiptap/extension-heading"),require("@tiptap/extension-paragraph"),require("@tiptap/extension-horizontal-rule"),require("@tiptap/extension-ordered-list"),require("@tiptap/extension-bullet-list"),require("@tiptap/extension-list-item"),require("tiptap-footnotes"),require("@tiptap/extension-history"),require("vue-multiselect"),require("filesize-parser"),require("filesize"),require("vue-upload-component")):typeof define=="function"&&define.amd?define(["vue","vue-router","@kyvg/vue3-notification","@ditojs/utils","tippy.js","nanoid","focus-trap","sortablejs","codeflask","tinycolor2","@lk77/vue3-color","@ditojs/ui","@tiptap/vue-3","@tiptap/extension-document","@tiptap/extension-text","@tiptap/extension-bold","@tiptap/extension-code","@tiptap/extension-italic","@tiptap/extension-link","@tiptap/extension-strike","@tiptap/extension-subscript","@tiptap/extension-superscript","@tiptap/extension-underline","@tiptap/extension-blockquote","@tiptap/extension-code-block","@tiptap/extension-hard-break","@tiptap/extension-heading","@tiptap/extension-paragraph","@tiptap/extension-horizontal-rule","@tiptap/extension-ordered-list","@tiptap/extension-bullet-list","@tiptap/extension-list-item","tiptap-footnotes","@tiptap/extension-history","vue-multiselect","filesize-parser","filesize","vue-upload-component"],W):(n=typeof globalThis<"u"?globalThis:n||self,n["dito-admin"]=W(n.vue,n["vue-router"],n["@kyvg/vue3-notification"],n["@ditojs/utils"],n.tippy.js,n.nanoid,n["focus-trap"],n.sortablejs,n.codeflask,n.tinycolor2,n["@lk77/vue3-color"],n["@ditojs/ui"],n["@tiptap/vue-3"],n["@tiptap/extension-document"],n["@tiptap/extension-text"],n["@tiptap/extension-bold"],n["@tiptap/extension-code"],n["@tiptap/extension-italic"],n["@tiptap/extension-link"],n["@tiptap/extension-strike"],n["@tiptap/extension-subscript"],n["@tiptap/extension-superscript"],n["@tiptap/extension-underline"],n["@tiptap/extension-blockquote"],n["@tiptap/extension-code-block"],n["@tiptap/extension-hard-break"],n["@tiptap/extension-heading"],n["@tiptap/extension-paragraph"],n["@tiptap/extension-horizontal-rule"],n["@tiptap/extension-ordered-list"],n["@tiptap/extension-bullet-list"],n["@tiptap/extension-list-item"],n["tiptap-footnotes"],n["@tiptap/extension-history"],n["vue-multiselect"],n["filesize-parser"],n.filesize,n["vue-upload-component"]))})(this,(function(n,W,et,h,tt,Vn,Pn,En,Nn,Be,we,On,se,nt,Tn,Ln,Fn,In,Mn,Rn,jn,zn,An,qn,Un,Hn,Wn,Kn,Yn,Jn,Gn,Qn,Se,Xn,Zn,_n,xn,vn){"use strict";function eo(e=""){const t={},o=e.toLowerCase(),[s]=/(iphone|ipad|linux; android|darwin|win|mac|linux|freebsd|sunos)/.exec(o)||[],i={darwin:"mac",iphone:"ios",ipad:"ios","linux; android":"android"}[s]||s;return i&&(t.platform=i,t[i]=!0),o.replace(/(opera|chrome|safari|webkit|firefox|msie|trident)\/?\s*([.\d]+)(?:.*version\/([.\d]+))?(?:.*rv:v?([.\d]+))?/g,(a,r,l,d,c)=>{if(!t.chrome){const p=c||d||l;(!t.version||r!=="safari")&&(t.version=p,t.versionNumber=parseFloat(p)),t.browser=r,t[r]=!0}}),t.chrome&&delete t.webkit,t}const ot=n.reactive({title:"",routeComponents:[],user:null,agent:eo(navigator.userAgent||""),loadCache:{},activeLabel:null,clipboardData:null});function O(e,t){return e?`${e}/${t}`:t}function to(e){const t=h.parseDataPath(e);return t?.pop(),t}function Ve(e,t=!1){return t?to(e):h.parseDataPath(e)}function no(e,t=!1){return h.normalizeDataPath(Ve(e,t))}function st(e,t=!1){const o=Ve(e,t);if(o){let s;do s=o.pop();while(s!=null&&h.isInteger(+s));if(s!=null)return o}return null}function oo(e,t=!1){return h.normalizeDataPath(st(e,t))}function at(e,t,o=!1){const s=Ve(t,o);return s?h.getValueAtDataPath(e,s):null}function it(e,t,o=!1){const s=st(t,o);return s?h.getValueAtDataPath(e,s):null}function rt(e){const t=h.parseDataPath(e);return t[t.length-1]}function so(e){const t=rt(e);return t==null||h.isInteger(+t)?null:t}function Pe(e){const t=rt(e),o=t==null?null:+t;return h.isInteger(o)?o:null}let ao=0;function io(e,t="id"){e[t]=`@${++ao}`}function lt(e){return/^@/.test(e)}function ro(e,t="id"){return e?.[t]!=null&&Object.keys(e).length===1}const{hasOwnProperty:lo}=Object.prototype,Ee=new WeakMap;function dt(e){const t=n.toRaw(e);let o=t,s=null;do{if(s=Ee.get(o),s)break;o=Object.getPrototypeOf(o)}while(o);return s&&o!==t&&Ee.set(o,s),s}function D(e,t,o){const s=dt(e),i=t in s?s[t]:void 0;return i!==void 0||lo.call(s,t)?i:h.isFunction(o)?o():o}function ct(e,t,o){dt(e)[t]=o}class S{constructor(t,o){o=o?h.isFunction(o)?o():{...o}:{},o.nested??=!0,o.component=t;const s=Object.setPrototypeOf(o,t);Ee.set(this,s)}static get(t,o){return o instanceof S?o:new S(t,o)}extend(t){return Object.setPrototypeOf(t,this)}get nested(){return D(this,"nested",!0)}get schema(){return D(this,"schema",null)}get value(){return D(this,"value",()=>this.nested?h.getValueAtDataPath(this.rootItem,this.dataPath):void 0)}get dataPath(){return D(this,"dataPath","")}get name(){return D(this,"name",()=>so(this.dataPath))}get index(){return D(this,"index",()=>Pe(this.dataPath))}get itemDataPath(){return no(this.dataPath,this.nested)}get parentItemDataPath(){return oo(this.dataPath,this.nested)}get itemIndex(){return Pe(this.itemDataPath)}get parentItemIndex(){return Pe(this.parentItemDataPath)}get item(){return D(this,"data",()=>at(this.rootItem,this.dataPath,this.nested)||null)}get parentItem(){const t=it(this.rootItem,this.dataPath,this.nested)||null;return t!==this.item?t:null}get rootItem(){return D(this,"rootData",null)}get processedItem(){return D(this,"processedData",null)}get processedRootItem(){return D(this,"processedRootData",null)}get clipboardItem(){return D(this,"clipboardData",null)}get user(){return D(this,"user",null)}get api(){return D(this,"api",null)}get views(){return D(this,"views",null)}get flattenedViews(){return D(this,"flattenedViews",null)}get itemLabel(){return D(this,"itemLabel",null)}get formLabel(){return D(this,"formLabel",null)}get component(){return D(this,"component",null)}get schemaComponent(){return D(this,"schemaComponent",null)}get formComponent(){return D(this,"formComponent",null)}get viewComponent(){return D(this,"viewComponent",null)}get dialogComponent(){return D(this,"dialogComponent",null)}get panelComponent(){return D(this,"panelComponent",null)}get resourceComponent(){return D(this,"resourceComponent",null)}get sourceComponent(){return D(this,"sourceComponent",null)}get option(){return D(this,"option",void 0)}get options(){return D(this,"options",void 0)}get open(){return D(this,"open",void 0)}get searchTerm(){return D(this,"searchTerm",void 0)}get error(){return D(this,"error",void 0)}get wasNotified(){return D(this,"wasNotified",!1)}get isRunning(){return D(this,"isRunning",!1)}set isRunning(t){ct(this,"isRunning",t)}get query(){return this.component.$route.query}get request(){return t=>this.component.request(t)}get format(){return(t,o)=>this.component.format(t,o)}get navigate(){return t=>this.component.navigate(t)}get download(){return t=>this.component.download(t)}get getResourceUrl(){return t=>this.component.getResourceUrl(t)}get notify(){return t=>{this.component.notify(t),ct(this,"wasNotified",!0)}}}const co={data(){return{listeners:null}},methods:{on(e,t){if(h.isArray(e))for(const o of e)this.on(o,t);else if(h.isPlainObject(e))for(const o in e)this.on(o,e[o]);else{const o=this.listeners||=Object.create(null),{callbacks:s}=o[e]||={callbacks:[],queue:[]};s.push(t)}return this},once(e,t){const o=(...s)=>(this.off(e,o),t.apply(this,s));return o.callback=t,this.on(e,o)},off(e,t){if(!arguments.length)delete this.listeners;else if(h.isArray(e))for(const o of e)this.off(o,t);else if(h.isPlainObject(e))for(const o in e)this.off(o,e[o]);else{const o=this.listeners?.[e];if(o)if(!t)delete this.listeners[e];else{const{callbacks:s}=o,i=s.findIndex(a=>a===t||a.callback===t);i!==-1&&s.splice(i,1)}}return this},emit(e,...t){const o=this.listeners?.[e];if(o){const{queue:s,callbacks:i}=o;return new Promise(a=>{const r=async()=>{const l=s.shift();if(l){let d;const c=[];for(const p of i)try{const u=await p.apply(this,l.args);u!==void 0&&(d=u)}catch(u){c.push(u)}if(c.length>0){const p=new AggregateError(c,`Errors during event handler for '${e}'`);l.resolve(Promise.reject(p))}else l.resolve(d);r()}};s.push({args:t,resolve:a}),s.length===1&&r()})}return Promise.resolve()},hasListeners(e){if(h.isArray(e)){for(const t of e)if(!this.hasListeners(t))return!1;return e.length>0}else return!!this.listeners?.[e]},delegate(e,t){if(t)if(h.isArray(e))for(const o of e)this.delegate(o,t);else this.on(e,(...o)=>t.emit(e,...o));return this}}},ae={computed:{value:{get(){const e=Ft(this.schema,this.data,this.name,this.dataPath,{component:this}),{format:t}=this.schema;return t?t(new S(this,{value:e})):e},set(e){const{parse:t}=this.schema;t&&(e=t(new S(this,{value:e}))),this.parsedValue=e,this.data[this.name]=e}}}},L={computed:{context(){return new S(this,{nested:this.nested})},parentData(){const e=it(this.rootData,this.dataPath,this.nested);return e!==this.data?e:null},processedData(){return ht(this,this.dataPath,this.nested)},processedRootData(){return ht(this,"",!1)},item(){return this.data},parentItem(){return this.parentData},rootItem(){return this.rootData},processedItem(){return this.processedData},processedRootItem(){return this.processedRootData}}};function ht(e,t,o=!1){let{schemaComponent:s}=e;for(;s.dataPath.length>t.length;)s=s.parentSchemaComponent;return at(s.processedData,t.slice(s.dataPath.length),o)}const ho=Object.freeze(Object.defineProperty({__proto__:null,creditcard:{validate:e=>h.isCreditCard(e),message:"is invalid"},decimals:{validate:(e,t)=>{const o=t==="*"?"+":`{1,${t}}`;return new RegExp(`^[-+]?\\d*(\\.\\d${o})?$`).test(e)},message:(e,t)=>`must be numeric and may contain ${!t||t==="*"?"":t} decimal points`},domain:{validate:e=>h.isDomain(e),message:"is not a domain"},email:{validate:e=>h.isEmail(e),message:"must be a valid email"},hostname:{validate:e=>h.isHostname(e),message:"is not a host name"},integer:{validate:e=>h.isInteger(e),message:"must be whole number"},max:{validate:(e,t)=>e<=t,message(e,t){return`must be ${t} or less`}},min:{validate:(e,t)=>e>=t,message(e,t){return`must be ${t} or more`}},password:{validate:()=>!0},range:{validate:(e,[t,o])=>e>=t&&e<=o,message(e,[t,o]){return`must be between ${t} and ${o}`}},required:{validate:(e,t,{password:o})=>e!=null&&e!==""||o&&e===void 0,message:"is required"},url:{validate:e=>h.isUrl(e),message:"is not a valid URL"}},Symbol.toStringTag,{value:"Module"})),po={emits:["errors"],data(){return{isTouched:!1,isDirty:!1,isValidated:!1,isValid:!1,errors:null}},computed:{hasErrors(){return!!this.errors}},methods:{resetValidation(){this.isTouched=!1,this.isDirty=!1,this.isValidated=!1,this.isValid=!1,this.clearErrors()},validate(e=!0){let t=!0;e&&this.clearErrors();const{value:o}=this;for(const[s,i]of Object.entries(this.validations)){const a=ho[s];if(a&&(s==="required"||o!=null&&o!=="")){const{validate:r,message:l}=a;if(!r(o,i,this.validations)&&(t=!1,e)){const d=h.isFunction(l)?l(o,i,this):l;this.addError(d,!0)}}}return e&&(this.isValidated=!0,this.isValid=t),t},verify(){return this.validate(!1)},markTouched(){this.isTouched=!0,this.clearErrors()},markDirty(){this.isDirty=!0,this.isValidated=!1,this.isValid=!1,this.clearErrors()},addError(e,t=!1){this.errors||=[],t&&(e=`The ${this.label||this.placeholder||this.name} field ${e}.`),this.errors.push(e),this.$emit("errors",this.errors)},showValidationErrors(e,t){if(this.errors=[],e.length===0)return!1;for(const{message:o}of e)this.addError(o,!0);return t&&this.scrollIntoView(),!0},getErrors(){return this.errors?[...this.errors]:null},clearErrors(){this.errors=null,this.$emit("errors",this.errors)}}};function b(e,{type:t,default:o,get:s,set:i,callback:a=!0}={}){h.isString(e)&&e.includes(".")&&(e=h.parseDataPath(e));const r=h.normalizeDataPath(e);return{get(){const l=!s||s.length>0?this.overrides&&r in this.overrides?this.overrides[r]:this.getSchemaValue(e,{type:t,default:o,callback:a}):void 0;return s?s.call(this,l):l},set(l){i?i.call(this,l):(this.overrides||={},this.overrides[r]=l)}}}function Ne(e,{default:t,get:o,set:s}={}){return{get(){let i=this.getStore(e);return i===void 0&&t!==void 0&&(i=h.isFunction(t)?t.call(this):t,this[e]=i,this.getStore(e)),o?o.call(this,i):i},set(i){(!s||(i=s.call(this,i))!==void 0)&&this.setStore(e,i)}}}const Oe={mixins:[ae,L,po],emits:["update:component"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},width:{type:[Number,String],default:null},label:{type:String,default:null},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},accumulatedBasis:{type:Number,default:null}},data(){return{parsedValue:void 0,focused:!1}},computed:{name(){return this.schema.name},type(){return this.schema.type},labelNode(){const e=this.isMounted?this.$el.previousElementSibling:null;return e?.matches(".dito-label")?e:null},visible:b("visible",{type:Boolean,default(){return this.$options.defaultVisible}}),exclude:b("exclude",{type:Boolean,default:!1}),required:b("required",{type:Boolean,default:!1}),readonly:b("readonly",{type:Boolean,default:!1}),autofocus:b("autofocus",{type:Boolean,default:!1}),clearable:b("clearable",{type:Boolean,default:!1,get(e){return e&&!this.readonly}}),disabled:b("disabled",{type:Boolean,default:!1}),maxLength:b("maxLength",{type:Number}),placeholder:b("placeholder",{type:String}),autocomplete:b("autocomplete",{type:String}),info:b("info",{type:String,default:null}),inlineInfo(){return this.label?null:this.info},events(){const e=this.getEvents();for(const t of Object.keys(this.schema.events||{}))e[`on${h.camelize(t,!0)}`]??=()=>{this.emitEvent(t)};return e},attributes(){const{nativeField:e,textField:t}=this.$options,o={...this.events,disabled:this.disabled};return e&&(o.name=this.dataPath,this.label&&(o.title=this.label),o.readonly=this.readonly,o.autofocus=this.autofocus,t&&(o.maxlength=this.maxLength,o.placeholder=this.placeholder,o.autocomplete=this.autocomplete)),o},validations(){const e={...this.getValidations()};this.required&&(e.required=!0);for(const[t,o]of Object.entries(this.schema.rules||{}))o===void 0?delete e[t]:e[t]=o;return e},showClearButton(){return this.clearable&&this.value!=null}},created(){this._register(!0),this.setupSchemaFields()},unmounted(){this._register(!1)},methods:{_register(e){this.$emit("update:component",e?this:null),this.nested&&this.schemaComponent._registerComponent(this,e)},getEvents(){const{onFocus:e,onBlur:t,onInput:o,onChange:s}=this;return{onFocus:e,onBlur:t,onInput:o,onChange:s}},getValidations(){return null},async scrollIntoView(){await this.focusSchema(),this.getFocusElement()?.scrollIntoView?.({behavior:"smooth",block:"center"})},focusElement(){this.getFocusElement()?.focus?.()},blurElement(){this.getFocusElement()?.blur?.()},getFocusElement(){const e=h.asArray(this.$refs.element)[0]??this;return e.$el??e},async focusSchema(){await this.schemaComponent.focus(),await this.tabComponent?.focus()},async focus(){await this.focusSchema(),this.scrollIntoView(),this.focusElement()},blur(){this.blurElement()},clear(){this.value=null,this.blur(),this.onChange()},onFocus(){this.focused=!0,this.markTouched(),this.emitEvent("focus")},onBlur(){this.focused=!1,this.validate(),this.emitEvent("blur")},onInput(){this.markDirty(),this.emitEvent("input")},onChange(){this.markDirty(),this.emitEvent("change",{context:{value:this.parsedValue!==void 0?this.parsedValue:this.value},parent:this.schemaComponent})}}},pt=new WeakMap;let uo=0;function mo(e,t=null){const o=n.toRaw(e);let s=pt.get(o);return!s&&e&&(s=t?.(e)||`@${++uo}`,pt.set(o,s)),s}class fo{graph={};references={};set(t,o,s){t=h.parseDataPath(t);let i=this.graph;for(const a of t){const r=h.isInteger(+a)?"*":a;i=i[r]??={}}i.$settings={...s,...i.$settings,...o}}addSource(t,o){this.set(t,{type:"source",schema:o},{related:!1})}setSourceRelated(t){this.set(t,{related:!0,reference:this.getReferencePrefix(t)})}addRelation(t,o,s){this.set(t,{type:"relation",schema:s,internal:!!o,reference:this.getReferencePrefix(o)})}getReferencePrefix(t){return t?this.references[t]??=Vn.nanoid(6):null}flatten(){const t=o=>{const s=[];for(const[i,{$settings:a,...r}]of Object.entries(o)){a&&s.push([i,a]);for(const[l,d]of t(r))s.push([`${i}/${l}`,d])}return s};return t(this.graph)}process(t,o,{target:s}){const i=s==="clipboard";i&&delete o[t.idKey||"id"];for(const[a,r]of this.flatten()){const{type:l,schema:d,internal:c,related:p,reference:u}=r,m=l==="source",f=l==="relation";if(m||f&&c){const g=h.getValueAtDataPath(o,a,()=>null),k=i&&m&&!p,V=i&&(f&&c||m&&p);for(const w of h.asArray(g).flat()){const $=m&&d.idKey||f&&d.relateBy||"id";let P=w?.[$];if(P!=null&&(k&&delete w[$],V||lt(P))){lt(P)&&(P=P.slice(1));const N=i?$:m?"#id":"#ref",z=i?`@${P}`:u?`${u}-${P}`:P;w[N]=z,N!==$&&delete w[$]}}}}return o}}const go={Boolean:h.isBoolean,Number:h.isNumber,String:h.isString,Date:h.isDate,Array:h.isArray,Object:h.isObject,RegExp:h.isRegExp,Function:h.isFunction},bo={Boolean:e=>!!e,Number:e=>+e,String:e=>String(e),Date:e=>h.isDate(e)?e:new Date(e),Array:e=>h.isArray(e)?e:h.isString(e)?e.split(","):h.asArray(e),Object:e=>h.isObject(e)?e:e===!0?{}:null,RegExp:e=>h.isRegExp(e)?e:new RegExp(e)};function Te(e,t){if(e&&t!=null){for(const o of e)if(go[o.name]?.(t))return!0}return!1}function yo(e,t){const o=e&&bo[e.name||e];return o?o(t):t}const ut={},mt={},ft={};function ko(e,t){ut[e]=t}function ie(e,t=!1){const o=ut[e]||null;if(!o&&!t&&!mt[e])throw mt[e]=!0,new Error(`Unknown Dito.js component type: '${e}'`);return o}function gt(e,t){for(const o of e)if(Me(o)){const s=t(o.component,o.name,0);if(s!==void 0)return s}else if(R(o))for(const[s,i]of Object.entries(o.components||{})){const a=t(i,s,1);if(a!==void 0)return a}}function re(e,t){return e?gt([e,...At(e)],t):void 0}function Co(e,t){return re(e,o=>t(o)?o:void 0)??null}function Le(e,t){return re(e,o=>t(o)?!0:void 0)??!1}function $o(e){return Le(e,()=>!0)??!1}function R(e){return h.isObject(e)&&h.isString(e.type)}function Do(e){return R(e)&&e.type==="form"}function bt(e){return R(e)&&e.type==="view"}function Bo(e){return R(e)&&e.type==="tab"}function wo(e){return R(e)&&e.type==="panel"}function Fe(e){return R(e)&&e.type==="menu"}function le(e){return JSON.stringify(e)}const Ie=new WeakMap;async function A(e,t=!1){if(Ie.has(e))return Ie.get(e);let o=e;if(h.isFunction(o)&&(o=o()),h.isPromise(o)&&(o=await o),h.isModule(o)&&(o={...o},!o.name&&(t||o.default))){const s=Object.keys(o).filter(i=>i!=="_rerender_only");if(s.length===1){const i=s[0];o=o[i],i!=="default"&&(o={...o,name:i})}}return Ie.set(e,o),o}async function _(e,t=A){let o=h.isFunction(e)?e():e;return o=await A(o,!1),h.isArray(o)?o=Object.fromEntries(await h.mapConcurrently(o,async s=>{const i=await t(s,!0);return[i.name,i]})):h.isObject(o)&&(o=Object.fromEntries(await h.mapConcurrently(Object.entries(o),async([s,i])=>{const a=await t(i,!0);return[s,a]}))),o}async function So(e){return _(e,async(t,o)=>(t=await A(t,o),!t.name&&Fe(t)&&(t={...t,name:h.camelize(t.label),items:await _(t.items)}),t))}function Vo(e){return Object.fromEntries(Object.entries(e).reduce((t,[o,s])=>(Fe(s)?t.push(...Object.entries(s.items)):t.push([o,s]),t),[]))}async function de(e){let{component:t}=e;t&&(t=await A(t,!0),t&&(e.component=n.markRaw({...t,mixins:[Ht,Oe,...t.mixins||[]]})))}async function yt(e){await h.mapConcurrently(Object.values(e||{}),de)}const kt=new WeakMap;function x(e,t,o=null,s=0,i=1){if(t){const a=kt.get(t)??0;if(a<i){kt.set(t,a+1);const r=[],l=(d,c,p)=>{r.push(Po(e,d,c,o,s+p))};return re(t,l),gt(He(t),l),Promise.all(r)}}}function Po(e,t,o,s=null,i=0){return K(e,t),Promise.all([h.mapConcurrently(He(t),a=>x(e,a,s,i)),T(t)?.processSchema?.(e,t,o,s,i)])}async function Ct(e,t,o,s,i=""){K(t,o),Dt(t,o,s,i);let a=[];if(bt(o))await Bt(t,o),await x(t,o,a);else if(Fe(o))a=await Promise.all(Object.entries(o.items).map(async([r,l])=>Ct(e,t,l,r,o.fullPath)));else throw new Error(`Invalid view schema: '${le(o)}'`);return{path:o.fullPath,children:a,component:e,meta:{api:t,schema:o}}}function K(e,t){let o=e.defaults[t.type]||e.defaults[h.camelize(t.type)];if(o&&(h.isFunction(o)&&(o=o(t)),h.isObject(o)))for(const[s,i]of Object.entries(o))t[s]===void 0?t[s]=i:t[s]=h.assignDeeply(t[s],i)}function $t(e,t){re(t,o=>{K(e,o);const s=Y(o);for(const i of Object.values(s))$t(e,i)})}function Dt(e,t,o,s=null){t.name??=o,t.path??=e.normalizePath(o),s!==null&&(t.fullPath=`${s}/${t.path}`)}async function Eo(e,t,o){const s=[],{form:i,forms:a,components:r,maxDepth:l=1}=t;return a?t.forms=await _(a,d=>ce(e,d,s,o,l)):i?t.form=await ce(e,i,s,o,l):h.isObject(r)&&await ce(e,{type:"form",components:r},s,o,l),s}async function ce(e,t,o=null,s=0,i=1){if(t=await A(t,!0),!Do(t))throw new Error(`Invalid form schema: '${le(t)}'`);return K(e,t),await Bt(e,t),await x(e,t,o,s,i),t}async function No(e,t){if(t=await A(t,!0),!Bo(t))throw new Error(`Invalid tab schema: '${le(t)}'`);return K(e,t),t}async function Oo(e,t){if(t=await A(t,!0),!wo(t))throw new Error(`Invalid panel schema: '${le(t)}'`);return K(e,t),t}async function Bt(e,t){const{tabs:o,panels:s}=t;o&&(t.tabs=await _(o,i=>No(e,i))),s&&(t.panels=await _(s,i=>Oo(e,i)))}function q(e){return R(e)&&h.isObject(e.form||e.forms||e.components)}function To(e){return R(e)&&Object.keys(e?.forms||{}).length>1}function Me(e){return bt(e)&&h.isObject(e.component)}function wt(e,t){const{view:o}=e,s=o&&t.flattenedViews[o];return s&&Co(s,q)||null}function Re(e,t){return wt(e,t)?t.flattenedViews[e.view]:null}function Lo(e,t){return!!Re(e,t)}function St(e,t){const o=Re(e,t);return o?Me(o)?o.fullPath:`${o.fullPath}/${o.path}`:null}function Vt(e,t,o){const s=St(e,o);return s?`${s}/${t}`:null}function Y(e,t,o){const s=t&&wt(e,t);if(s)e=s;else if(e.view)throw new Error(`Unknown view: '${e.view}'`);let{form:i,forms:a}=e;if(!i&&!a){const{name:r,compact:l,clipboard:d,tabs:c,components:p}=e;if(p||c)i={type:"form",name:r,compact:l,clipboard:d,tabs:c,components:p};else return{}}return a||={default:i},Object.fromEntries(Object.entries(a).map(([r,l])=>(t&&h.isFunction(l.components)&&(l=n.reactive({...l,components:l.components(t)}),ce(t.api,l).catch(console.error)),[r,o?.(l)??l])))}function Pt(e,t){return e[t?.type]||e.default||null}function je(e,t,o){return Pt(Y(e,o),t)||ft}function Fo(e){return e===ft}function Et(e){return!!e.compact}function ze(e){return!!(e.inlined||e.components)}function Ae(e){return!!(e.nested||T(e)?.defaultNested===!0)}function Io(e,t){const{label:o}=e;return o!==!1&&(!!o||t&&T(e)?.generateLabel)}function Mo(e){return!!T(e)?.omitSpacing}function Nt(e,{type:t,schema:o,callback:s=!0,default:i,context:a}={}){const r=t&&h.asArray(t);let l=o?h.isArray(e)?h.getValueAtDataPath(o,e,()=>{}):o[e]:void 0;if(l===void 0&&i!==void 0)return s&&h.isFunction(i)&&!Te(r,i)&&(i=i(a)),i;if(Te(r,l))return l;if(s&&h.isFunction(l)&&(l=l(a)),r&&l!=null&&!Te(r,l))for(const d of r){const c=yo(d,l);if(c!==l)return c}return l}function qe(e,t){return Nt("if",{type:Boolean,schema:e,context:t,default:!0})&&(!$o(e)||Le(e,o=>qe(o,t)))}function J(e){return h.isFunction(e)?e():e}function Ue(e,t){const o=e.default!==void 0?e.default:T(e)?.defaultValue;return h.isFunction(o)?o(J(t)):h.clone(o)}function Ro(e,t){const o=e.exclude!==void 0?e.exclude:T(e)?.excludeValue;return h.isFunction(o)?o(J(t)):!!o}function Ot(e,t){return!!T(e)?.ignoreMissingValue?.(J(t))}function Tt(e){return e.multiple??!!T(e)?.defaultMultiple}function Lt(e,t={},o){const s={component:o,rootData:t};return he(e,t,null,null,(a,r,l,d)=>{const c=()=>new S(o,{schema:a,name:l,data:r,dataPath:d,rootData:s.rootData});!(l in r)&&!Ot(a,c)&&(r[l]=Ue(a,c))},null,s)}function Ft(e,t,o,s,{component:i=null,rootData:a=i?.rootData}={}){const r=()=>new S(i,{schema:e,value:t[o],name:o,data:t,dataPath:s,rootData:a}),{compute:l}=e;if(l){const d=l(J(r));d!==void 0&&(t[o]=d)}return!(o in t)&&!Ot(e,r)&&(t[o]=Ue(e,r)),t[o]}function It(e,t,o){if(o.schemaOnly){const s={},{idKey:i="id",orderKey:a}=e,r=t[i];return r!==void 0&&(s[i]=r),To(e)&&(s.type=t.type),a&&(s[a]=t[a]),s}else return{...t}}function jo(e,t,o,s,{component:i,rootData:a,schemaOnly:r,target:l}={}){const d={component:i,rootData:a,schemaOnly:r,target:l},c=It(t,o,d),p=new fo;return he(e,o,s,c,(f,g,k,V,w)=>{let $=Ft(f,g,k,V,d);if(h.isArray($)){const{wrapPrimitives:P}=f;P?$=$.map(N=>({[P]:N})):$=[...$]}w[k]=$},(f,g,k,V,w)=>{const{wrapPrimitives:$,process:P}=f;let N=w[k];const z=()=>new S(i,{schema:f,value:N,name:k,data:g,dataPath:V,rootData:d.rootData,processedData:w});$&&h.isArray(N)&&(N=N.map(Dh=>Dh[$]));const De=T(f)?.processValue;De&&(N=De(J(z),p)),P&&(N=P(J(z))),Ro(f,z)?delete w[k]:w[k]=N},d),p.process(t,c,d)}function he(e,t,o,s,i,a,r){const l=d=>{const c=(p,u)=>p!=null?O(p,u):null;if(d)for(const[p,u]of Object.entries(d))if(!Ae(u))he(u,t,o,s,i,a,r);else{const m=c(o,p),f=(k,V=null)=>{const w=V!==null?c(m,V):m,$=new S(r.component,{schema:u,data:t,dataPath:m,name:p,rootData:r.rootData}),N=(T(u)?.getFormSchemasForProcessing||Y)(u,$),z=Pt(N,k);if(z){const De=s?It(u,k,r):null;return he(z,k,w,De,i,a,r)}else return{...k}};i?.(u,t,p,m,s);let g=s?s[p]:t[p];g!=null&&q(u)&&(h.isArray(g)?g=s?g.map(f):g.forEach(f):g=f(g),s&&(s[p]=g)),a?.(u,t,p,m,s)}};l(e.components);for(const d of At(e))l(d.components);for(const d of He(e))l(d.components);return s||t}function G(e,t){const o=(s,i)=>s.length>0?s.reduce((a,r)=>{const l=i(r);return l&&(a[l.name]=l&&t?{...t,...l}:l),a},{}):null;return h.isArray(e)?o(e,s=>h.isObject(s)?s:{name:h.camelize(s,!1)}):h.isObject(e)?o(Object.entries(e),([s,i])=>h.isObject(i)?{name:s,...i}:h.isString(i)?{name:s,label:i}:null):null}function v(e){return G(e,{type:"button"})}function Mt(e){return h.isObject(e)?e.type:e}function T(e){return ie(Mt(e),!0)??null}function Rt(e){return T(e)?.getSourceType?.(Mt(e))??null}function jt(e,t=null,o=null){return e?{schema:e,dataPath:t!=null&&e.name?O(t,e.name):t,tabComponent:o}:null}function zt(e,t,o=null,s=[]){if(e)for(const[i,a]of Object.entries(e)){const r=jt(a,O(t,i),o);r&&s.push(r)}return s}function At(e){return e?.tabs?Object.values(e.tabs):[]}function He(e){return e?.panels?Object.values(e.panels):[]}function zo(e,t,o,s=null,i=null){const a=T(t)?.getPanelSchema?.(e,t,o,s),r=a?[jt(a,o,i)]:[];return zt(t?.panels,o,i,r),r}function ee(e){return Rt(e)==="object"}function te(e){return Rt(e)==="list"}function qt(e,t){const o=t[e.idKey||"id"];return o!=null?String(o):void 0}function Ao(e,t){return mo(t,o=>qt(e,o))}function Ut(e){return!!F(e.resource)}function F(e,t={}){const{parent:o,...s}=t;return h.isFunction(e)&&(e=e(t)),e=h.isObject(e)?{...s,...e}:h.isString(e)?{...s,path:e}:null,e&&o!==void 0&&e.parent===void 0&&!e.path?.startsWith("/")&&(e.parent=o,e.path||(e.path=".")),e}function We(e,t){return e!=null&&t?.type==="collection"?{type:"member",...h.pickBy(t,(o,s)=>["method","path","parent"].includes(s)),id:`${e}`}:null}const Ht={mixins:[co],inject:["api","$verbs","$views","$isPopulated","$parentComponent","$schemaComponent","$routeComponent","$dataComponent","$sourceComponent","$resourceComponent","$dialogComponent","$panelComponent","$tabComponent"],provide(){const e=()=>this;return this.providesData?{$parentComponent:e,$dataComponent:e}:{$parentComponent:e}},data(){return{appState:ot,isMounted:!1,overrides:null}},computed:{providesData(){return!1},sourceSchema(){return this.meta?.schema},user(){return ot.user},verbs(){return this.$verbs()},views(){return this.$views()},flattenedViews(){return Vo(this.views)},isPopulated(){return this.$isPopulated()},locale(){return this.api.locale},context(){return new S(this,{nested:!1})},rootComponent(){return this.$root.$refs.root},parentComponent(){return this.$parentComponent()},schemaComponent(){return this.$schemaComponent()},routeComponent(){return this.$routeComponent()},formComponent(){const e=this.routeComponent;return e?.isForm?e:null},viewComponent(){const e=this.routeComponent;return e?.isView?e:null},dataComponent(){return this.providesData?this:this.$dataComponent()},sourceComponent(){return this.$sourceComponent()},resourceComponent(){return this.$resourceComponent()},dialogComponent(){return this.$dialogComponent()},panelComponent(){return this.$panelComponent()},tabComponent(){return this.$tabComponent()},parentSchemaComponent(){return pe(this,"schemaComponent")},parentRouteComponent(){return pe(this,"routeComponent")},parentFormComponent(){return pe(this,"formComponent")},parentResourceComponent(){return pe(this,"resourceComponent")},rootData(){return this.dataComponent?.data}},mounted(){this.isMounted=!0},beforeCreate(){const e=qo++;Object.defineProperty(this,"$uid",{get:()=>e})},methods:{labelize:h.labelize,getStore(e){return this.store[e]},setStore(e,t){return this.store[e]=t,t},removeStore(e){delete this.store[e]},getStoreKeyByIndex(e){return this.store.$keysByIndex?.[e]},setStoreKeyByIndex(e,t){this.store.$keysByIndex??={},this.store.$keysByIndex[e]=t},getChildStore(e,t){let o=this.getStore(e);if(!o&&t!=null){const s=this.getStoreKeyByIndex(t);o=this.getStore(s),o&&(this.setStore(e,o),this.removeStore(s))}return o||(o=this.setStore(e,n.reactive({}))),t!=null&&this.setStoreKeyByIndex(t,e),o},removeChildStore(e,t){this.getChildStore(e,t),this.removeStore(e)},getSchemaValue(e,{type:t,default:o,schema:s=this.schema,context:i=this.context,callback:a=!0}={}){return Nt(e,{type:t,schema:s,context:i,callback:a,default:h.isFunction(o)?()=>o.call(this):o})},getLabel(e,t){return e?this.getSchemaValue("label",{schema:e,type:[String,Object]})||h.labelize(t||e.name):h.labelize(t)||""},getButtonAttributes(e){return{class:`dito-button--${e}`,title:h.labelize(e)}},getQueryLink(e){return{query:e,hash:this.$route.hash}},shouldRenderSchema(e=null){return qe(e,this.context)},shouldShowSchema(e=null){return this.getSchemaValue("visible",{type:Boolean,default:!0,schema:e})},shouldDisableSchema(e=null){return this.getSchemaValue("disabled",{type:Boolean,default:!1,schema:e})},getResourcePath(e){return e=F(e,{parent:this.dataComponent?.getResource({method:e?.method,child:e})??null}),this.api.resources.any(e)},getResourceUrl(e){const t=this.getResourcePath(e);return t?this.api.getApiUrl({url:t,query:e.query}):null},async sendRequest({method:e,url:t,resource:o,query:s,data:i,signal:a,internal:r}){t||=this.getResourceUrl(o),e||=o?.method;const l=!r&&this.api.isApiUrl(t);l&&await this.rootComponent.ensureUser();const d=await this.api.request({method:e,url:t,query:s,data:i,signal:a});return l&&e==="patch"&&h.equals(o,We(this.user.id,this.api.users))&&await this.rootComponent.fetchUser(),d},showDialog({components:e,buttons:t,data:o,settings:s}){return this.rootComponent.showDialog({components:e,buttons:t,data:o,settings:s})},request({cache:e,...t}){const s=(e&&{global:this.appState,local:this.dataComponent}[e])?.loadCache,i=s&&`${t.method||"get"} ${t.url} ${JSON.stringify(t.query||"")} ${JSON.stringify(t.data||"")}`;if(s&&i in s)return s[i];const a=this.sendRequest(t).then(r=>r.data).catch(r=>{const l=r.response?.data;throw l?Object.assign(new Error(l.message),l):r});return s&&(s[i]=a),a},format(e,{locale:t=this.api.locale,defaults:o=this.api.formats,...s}={}){return h.format(e,{locale:t,defaults:o,...s})},async navigate(e){return this.$router.push(e)},download(e={}){h.isString(e)&&(e={url:e});const t=document.createElement("a");t.href=e.url?.startsWith("blob:")?e.url:this.api.getApiUrl(e),t.download=e.filename??null;const{body:o}=document;o.appendChild(t),t.click(),o.removeChild(t)},notify(e){this.rootComponent.notify(e)},closeNotifications(){this.rootComponent.closeNotifications()},setupSchemaFields(){this.setupMethods(),this.setupComputed(),this.setupEvents()},setupMethods(){for(const[e,t]of Object.entries(this.schema.methods||{}))h.isFunction(t)?this[e]=t:console.error(`Invalid method definition: ${e}: ${t}`)},setupComputed(){const e=({get:t,set:o})=>{const s=n.computed(()=>t.call(this));return{get:()=>s.value,set:o?i=>o.call(this,i):void 0}};for(const[t,o]of Object.entries(this.schema.computed||{})){const s=h.isFunction(o)?e({get:o}):h.isObject(o)&&h.isFunction(o.get)?e(o):null;s?Object.defineProperty(this,t,s):console.error(`Invalid computed property definition: ${t}: ${o}`)}},setupEvents(){const{watch:e,events:t}=this.schema;if(e){const s=h.isFunction(e)?e.call(this):e;h.isObject(s)&&this.$nextTick(()=>{for(const[i,a]of Object.entries(s)){const r=this.schemaComponent.getComponentByName(i)?`data.${i}`:i;this.$watch(r,a)}})}const o=(s,i,a)=>{h.isFunction(a)?this.on(h.hyphenate(i),a):console.error(`Invalid event definition: ${s}: ${a}`)};if(t)for(const[s,i]of Object.entries(t))o(s,s,i);for(const[s,i]of Object.entries(this.schema))/^on[A-Z]/.test(s)&&o(s,s.slice(2),i)},emitEvent(e,{context:t=null,parent:o=null}={}){const s=this.hasListeners(e),i=o?.hasListeners(e);if(s||i){const a=d=>d.emit(e,t=S.get(this,t)),r=d=>i&&d!==!1?a(o).then(()=>d):d,l=()=>s?a(this).then(r):r(void 0);return["load","change"].includes(e)?this.$nextTick(l):l()}},emitSchemaEvent(e,t){return this.schemaComponent.emitEvent(e,t)}}};let qo=0;function pe(e,t){const o=e[t];let s=e.parentComponent;for(;s&&s[t]===o;)s=s.parentComponent;return s?.[t]??null}function Uo(e){const{mixins:t}=e;return t||e.extends?Ke({...e},e):e}function Ke(e,t){if(t.extends&&Ke(e,t.extends),t.mixins)for(const o of t.mixins)Ke(e,o);for(const o of Ho)o in t&&(e[o]=t[o]);return e}const Ho=["defaultValue","defaultNested","defaultVisible","generateLabel","excludeValue","ignoreMissingValue","omitSpacing","processValue","processSchema","getPanelSchema","getFormSchemasForProcessing","beforeRouteUpdate","beforeRouteLeave"],ue={},C={mixins:[Ht],components:ue,component(e,t){if(t&&(h.isPlainObject(t)&&(t=Uo({extends:this,name:e,...t})),ue[e]=t),!(e in ue))throw new Error(`Component "${e}" not registered`);return ue[e]},methods:{getTypeComponent:ie}};function Wt(e){return e&&h.asArray(e).some(t=>t.type!==n.Comment)}function ne(e,t={}){return e=h.isString(e)?n.useSlots()[e]:e,Wt(e?.(t))}const Wo=["type","title","disabled"],Ko={key:0,class:"dito-button__prefix"},Yo={key:1,class:"dito-button__text"},Jo={key:2,class:"dito-button__suffix"};function Go(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("button",n.mergeProps({class:["dito-button",[a.classes,{"dito-button--affixed":a.hasAffixes}]],type:o.type,title:o.title,disabled:o.disabled},a.attributes),[a.hasAffixes?(n.openBlock(),n.createElementBlock("div",Ko,[n.renderSlot(e.$slots,"prefix")])):n.createCommentVNode("",!0),o.text||a.hasAffixes?(n.openBlock(),n.createElementBlock("div",Yo,[n.createTextVNode(n.toDisplayString(o.text||""),1),n.renderSlot(e.$slots,"default")])):n.createCommentVNode("",!0),a.hasAffixes?(n.openBlock(),n.createElementBlock("div",Jo,[n.renderSlot(e.$slots,"suffix")])):n.createCommentVNode("",!0)],16,Wo)}const y=(e,t)=>{const o=e.__vccOpts||e;for(const[s,i]of t)o[s]=i;return o},Qo=y({inheritAttrs:!1,props:{type:{type:String,default:"button"},text:{type:String,default:null},title:{type:String,default:null},disabled:{type:Boolean,default:!1}},computed:{hasAffixes(){return ne(this.$slots.prefix)||ne(this.$slots.suffix)},classes(){return this.$attrs.class},attributes(){const{class:e,...t}=this.$attrs;return t}}},[["render",Go]]);function Kt(e){return{year:e?.getFullYear()??0,month:e?.getMonth()??0,day:e?.getDate()??0,hour:e?.getHours()??0,minute:e?.getMinutes()??0,second:e?.getSeconds()??0,millisecond:e?.getMilliseconds()??0}}function me(e,t={}){return new Date(...Object.values({...Kt(e),...t}))}function Ye(e,{locale:t="en-US",date:o=!0,time:s=!0}={}){const i=s?null:0;let[a,r,l,d,c,,p=i,,u=i,,m=i,,f=i]=Jt(e,{date:o,time:s});if(c&&c.length>=4){t==="en-US"&&r==="/"&&d==="/"&&([a,l]=[l,a]),l=Xo(l,{locale:t});const g=k=>k===null||k.length===2;if(l!==null&&(!s||g(p)&&g(u)&&g(m)))return new Date(+c,+l,+a,+p,+u,+m,+f)}return null}function Yt(e,t,{locale:o="en-US",date:s=!0,time:i=!0}={}){const a=Jt(e,{date:s,time:i}),r=(u,m=a.length)=>{let f=0,g=0;for(;(u===null||f<=u)&&g<m;)f+=a[g++]?.length??0;return{position:f,index:g}},l=s?0:r(null,6).position;t+=l;let{index:d}=r(t);const c=o==="en-US",p=[c?"month":"day",null,c?"day":"month",null,"year",null,"hour",null,"minute",null,"second",null,"millisecond"];for(;d--;)if(p[d]){const u=r(null,d).position-l,m=u+a[d].length;return{name:p[d],start:u,end:m}}return null}function Jt(e,{date:t=!0,time:o=!0}={}){const s=e?.split(/([\s.,:/]+)/)||[];return t||s.unshift("1",".","1",".","2000"," "),!o&&s.length>5&&(s.length=5),s}function Xo(e,{locale:t="en-US"}={}){const o=+e;if(!isNaN(o))return o-1;const s=e.trim().toLowerCase();if(s.length<3)return null;const i=new Intl.DateTimeFormat(t,{month:"short"}),a=new Intl.DateTimeFormat(t,{month:"long"});for(let r=0;r<12;r++){const l=new Date(2e3,r,1);if(i.format(l).toLowerCase().startsWith(s)||a.format(l).toLowerCase().startsWith(s))return r}return null}const Zo={class:"dito-calendar"},_o={class:"dito-calendar-popup"},xo={class:"dito-calendar-inner"},vo={class:"dito-calendar-header"},es={class:"dito-calendar-body"},ts={class:"dito-calendar-weekdays"},ns={class:"dito-calendar-dates"},os=["onClick"],ss={class:"dito-calendar-footer"},as=["title"],is={class:"dito-calendar-header"},rs={class:"dito-calendar-body"},ls={class:"dito-calendar-months"},ds=["onClick"],cs={class:"dito-calendar-header"},hs={class:"dito-calendar-body"},ps={class:"dito-calendar-years"},us=["onClick"];function ms(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",Zo,[n.createElementVNode("div",_o,[n.createElementVNode("div",xo,[i.currentMode==="day"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",vo,[n.createElementVNode("a",{class:"dito-calendar-step-prev dito-calendar-step-year",onClick:t[0]||(t[0]=r=>a.stepYear(-1))}),n.createElementVNode("a",{class:"dito-calendar-step-prev dito-calendar-step-month",onClick:t[1]||(t[1]=r=>a.stepMonth(-1))}),n.createElementVNode("span",null,[n.createElementVNode("a",{class:"dito-calendar-select-year",onClick:t[2]||(t[2]=r=>a.setMode("year"))},n.toDisplayString(a.dateToString(i.currentValue,{year:!0})),1),n.createElementVNode("a",{class:"dito-calendar-select-month",onClick:t[3]||(t[3]=r=>a.setMode("month"))},n.toDisplayString(a.dateToString(i.currentValue,{month:!0})),1)]),n.createElementVNode("a",{class:"dito-calendar-step-next dito-calendar-step-month",onClick:t[4]||(t[4]=r=>a.stepMonth(1))}),n.createElementVNode("a",{class:"dito-calendar-step-next dito-calendar-step-year",onClick:t[5]||(t[5]=r=>a.stepYear(1))})]),n.createElementVNode("div",es,[n.createElementVNode("div",ts,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(i.weekdayNames,r=>(n.openBlock(),n.createElementBlock("span",null,n.toDisplayString(r.short),1))),256))]),n.createElementVNode("div",ns,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(i.dateRange,r=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(r.state&&`dito-calendar-item-${r.state}`),onClick:l=>r.state!=="disabled"&&a.selectDate(r.date)},n.toDisplayString(r.text),11,os))),256))])]),n.createElementVNode("div",ss,[n.createElementVNode("a",{class:"dito-calendar-select-now",role:"button",title:a.dateToString(new Date),onClick:t[6]||(t[6]=r=>a.selectDate(new Date))},null,8,as)])],64)):i.currentMode==="month"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",is,[n.createElementVNode("a",{class:"dito-calendar-step-prev",onClick:t[7]||(t[7]=r=>a.stepYear(-1))}),n.createElementVNode("span",null,[n.createElementVNode("a",{class:"dito-calendar-select-year",onClick:t[8]||(t[8]=r=>a.setMode("year"))},n.toDisplayString(a.dateToString(i.currentValue,{year:!0})),1)]),n.createElementVNode("a",{class:"dito-calendar-step-next",onClick:t[9]||(t[9]=r=>a.stepYear(1))})]),n.createElementVNode("div",rs,[n.createElementVNode("div",ls,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(i.monthNames,(r,l)=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(a.getMonthClass(l)),onClick:d=>a.selectMonth(l)},n.toDisplayString(r.short),11,ds))),256))])])],64)):i.currentMode==="year"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createElementVNode("div",cs,[n.createElementVNode("a",{class:"dito-calendar-step-prev",onClick:t[10]||(t[10]=r=>a.stepDecade(-1))}),n.createElementVNode("span",null,n.toDisplayString(a.decadeToString(i.currentValue)),1),n.createElementVNode("a",{class:"dito-calendar-step-next",onClick:t[11]||(t[11]=r=>a.stepDecade(1))})]),n.createElementVNode("div",hs,[n.createElementVNode("div",ps,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(i.yearRange,r=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(a.getYearClass(r)),onClick:l=>a.selectYear(r)},n.toDisplayString(r),11,us))),256))])])],64)):n.createCommentVNode("",!0)])])])}const fs={emits:["update:modelValue","select"],props:{modelValue:{type:Date,default:null},locale:{type:String,default:"en-US"},disabledDate:{type:Function,default:()=>!1},mode:{type:String,default:"day"}},data(){const{weekdayNames:e,monthNames:t}=gs(this.locale);return{weekdayNames:e,monthNames:t,dateRange:[],yearRange:[],currentValue:this.modelValue||me(new Date,{hour:0,minute:0,second:0,millisecond:0}),currentMode:this.mode}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e||new Date,this.updateDateRange())},currentValue(e,t){+e!=+t&&this.updateDateRange()},disabledDate:"updateDateRange",mode(e){this.currentMode=e}},mounted(){this.updateDateRange()},methods:{getMonthClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getMonth()&&this.currentValue.getFullYear()===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getMonth()}},getYearClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getFullYear()}},setDate(e,t=!1){this.currentValue=me(this.currentValue,e),t&&this.$emit("update:modelValue",this.currentValue)},stepDecade(e){this.setDate({year:this.currentValue.getFullYear()+e*10})},setMode(e){this.currentMode=e},stepMonth(e){const{currentValue:t}=this,{year:o,month:s}=this.getYearMonth(t.getFullYear(),t.getMonth()+e);this.setDate({month:s,day:Math.min(this.getDaysInMonth(o,s),this.currentValue.getDate())})},stepYear(e){this.setDate({year:this.currentValue.getFullYear()+e})},selectDate(e){this.setDate(Kt(e),!0),this.$emit("select")},selectMonth(e){this.setMode("day"),this.setDate({month:e,day:1},!0)},selectYear(e){this.setMode("month"),this.setDate({year:e},!0)},getYearMonth(e,t){return t>11?(e++,t=0):t<0&&(e--,t=11),{year:e,month:t}},dateToString(e,{year:t,month:o,day:s}={year:!0,month:!0,day:!0}){return e.toLocaleString(this.locale,{year:t&&"numeric",month:o&&"long",day:s&&"numeric"})},decadeToString(e){const t=this.getFirstYearOfDecade(e.getFullYear());return`${t} – ${t+9}`},getDaysInMonth(e,t){return new Date(e,t+1,0).getDate()},getFirstYearOfDecade(e){return+`${e.toString().slice(0,-1)}0`},navigate({step:e,enter:t,mode:o=this.currentMode,update:s=!1}){const{currentValue:i}=this;if(e){switch(o){case"day":this.setDate({day:i.getDate()+e},s);break;case"month":this.setDate({month:i.getMonth()+e},s);break;case"year":this.setDate({year:i.getFullYear()+e},s);break}return!0}else if(t){switch(this.currentMode){case"day":this.selectDate(i);break;case"month":this.setMode("day");break;case"year":this.setMode("month");break}return!0}},updateDateRange(){this.dateRange=[],this.yearRange=[];const{currentValue:e}=this,t=e.getFullYear(),o=e.getMonth(),s=this.getFirstYearOfDecade(t);for(let c=0;c<10;c++)this.yearRange.push(s+c);let a=new Date(t,o,1).getDay()+1;a===0&&(a=7);const r=this.getDaysInMonth(t,o);if(a>1){const c=this.getYearMonth(t,o-1),p=this.getDaysInMonth(c.year,c.month);for(let u=1;u<a;u++){const m=p-a+u+1,f=new Date(c.year,c.month,m);this.dateRange.push({text:m,date:f,state:this.disabledDate(f)?"disabled":"gray"})}}const l=new Date;for(let c=1;c<=r;c++){const p=new Date(t,o,c),u=f=>f&&f.getDate()===c&&f.getFullYear()===t&&f.getMonth()===o,m=u(this.modelValue)?"active":u(l)?"today":this.disabledDate(p)?"disabled":u(e)?"current":null;this.dateRange.push({text:c,date:p,state:m})}const d=42-this.dateRange.length;if(d>0){const c=this.getYearMonth(t,o+1);for(let p=1;p<=d;p++){const u=new Date(c.year,c.month,p),m=this.disabledDate(u)?"disabled":"gray";this.dateRange.push({text:p,date:u,state:m})}}}}},Gt={};function gs(e){let t=Gt[e];if(!t){const o=[];for(let i=0;i<7;i++){const a=new Date(0,0,i);o.push({long:a.toLocaleString(e,{weekday:"long"}),short:a.toLocaleString(e,{weekday:"short"})})}const s=[];for(let i=1;i<=12;i++){const a=new Date(0,i,0);s.push({long:a.toLocaleString(e,{month:"long"}),short:a.toLocaleString(e,{month:"short"})})}t=Gt[e]={weekdayNames:o,monthNames:s}}return t}const bs=y(fs,[["render",ms]]);function fe(e,t){e=e instanceof NodeList?Array.from(e):h.asArray(e);for(const[o,s]of Object.entries(t))for(const i of e)i.addEventListener(o,s,!1);return{remove(){for(const[o,s]of Object.entries(t))for(const i of e)i.removeEventListener(o,s,!1)}}}function ys(...e){return{remove(){for(const t of e)t.remove()}}}function ks(e){return{37:"left",38:"up",39:"right",40:"down",13:"enter"}[e?.keyCode]}function Je(e){const t=ks(e);return{hor:{left:-1,right:1}[t]||0,ver:{up:-1,down:1}[t]||0,enter:t==="enter"}}function Ge(e){const t=h.isString(e.target)?e.$refs[e.target]:e.target;return t?.$el??t}const Cs={class:"dito-trigger-container"};function $s(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",Cs,[o.alwaysShow?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-trigger",a.triggerClass]),ref:"trigger"},[n.renderSlot(e.$slots,"trigger")],2)):o.trigger==="click"?(n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["dito-trigger",a.triggerClass]),ref:"trigger",onClick:t[0]||(t[0]=(...r)=>a.onClick&&a.onClick(...r))},[n.renderSlot(e.$slots,"trigger")],2)):o.trigger==="hover"?(n.openBlock(),n.createElementBlock("div",{key:2,class:n.normalizeClass(["dito-trigger",a.triggerClass]),ref:"trigger",onMouseenter:t[1]||(t[1]=r=>a.onHover(!0)),onMouseleave:t[2]||(t[2]=r=>a.onHover(!1))},[n.renderSlot(e.$slots,"trigger")],34)):o.trigger==="focus"||o.trigger==="always"?(n.openBlock(),n.createElementBlock("div",{key:3,class:n.normalizeClass(["dito-trigger",a.triggerClass]),ref:"trigger"},[n.renderSlot(e.$slots,"trigger")],2)):n.createCommentVNode("",!0),n.createVNode(n.Transition,{name:`dito-${o.transition}`},{default:n.withCtx(()=>[o.trigger==="hover"?n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-popup",a.popupClass]),ref:"popup",style:n.normalizeStyle(a.popupStyle),onMouseenter:t[3]||(t[3]=r=>a.onHover(!0)),onMouseleave:t[4]||(t[4]=r=>a.onHover(!1))},[i.showPopup?n.renderSlot(e.$slots,"popup",{key:0}):n.createCommentVNode("",!0)],38)),[[n.vShow,i.showPopup]]):n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["dito-popup",a.popupClass]),ref:"popup",style:n.normalizeStyle(a.popupStyle)},[i.showPopup?n.renderSlot(e.$slots,"popup",{key:0}):n.createCommentVNode("",!0)],6)),[[n.vShow,i.showPopup]])]),_:3},8,["name"])])}const Qe=y({emits:["update:show"],props:{trigger:{type:String,default:"click"},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom"},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:null},customClass:{type:String,default:null},zIndex:{type:Number,default:0},keepInView:{type:Boolean,default:!0},hideWhenClickOutside:{type:Boolean,default:!0},alwaysShow:{type:Boolean,default:!1},cover:{type:Boolean,default:!1},hideDelay:{type:Number,default:0}},data(){return{showPopup:this.show,popupPlacement:this.placement,focusEvents:null,closeEvents:null,popupEvents:null,blurTimer:null,mouseLeaveTimer:null}},computed:{triggerClass(){return{"dito-trigger-disabled":this.disabled}},popupClass(){const e={[`dito-popup-${h.hyphenate(this.placement)}`]:!0};return this.customClass&&(e[this.customClass]=!0),e},popupStyle(){return this.zIndex?`z-index: ${this.zIndex}`:""},triggerTarget(){return Ge(this)}},watch:{show(e){this.showPopup=e||this.alwaysShow},showPopup(e,t){e^t&&(this.$emit("update:show",e),this.$nextTick(()=>this.onShowPopup(e)))}},mounted(){const{trigger:e,popup:t}=this.$refs;this.trigger==="focus"&&(this.focusEvents=this.addFocusEvents(this.triggerTarget??e)),this.hideWhenClickOutside&&!this.alwaysShow&&(this.closeEvents=fe(window,{mouseup:o=>{this.showPopup&&!t.contains(o.target)&&!e.contains(o.target)&&!this.triggerTarget?.contains(o.target)&&(this.showPopup=!1)},blur:()=>{this.showPopup=!1}})),this.alwaysShow&&(this.showPopup=!0)},created(){this.showPopup=this.show},unmounted(){this.focusEvents?.remove(),this.closeEvents?.remove(),this.popupEvents?.remove()},methods:{updatePosition(){const{trigger:e,popup:t}=this.$refs;if(this.show&&t.offsetWidth===0){setTimeout(()=>this.updatePosition(),0);return}const o=this.triggerTarget??e,s=this.target==="popup"?e:t.firstElementChild;s&&(s.style.width=getComputedStyle(o).width);const i=o.getBoundingClientRect(),a=i.left+window.scrollX,r=i.top+window.scrollY,l=i.width,d=i.height,c=t.offsetWidth,p=t.offsetHeight;let[u,m]=this.popupPlacement.split("-")||[];if(this.keepInView){const k=window.innerWidth,V=window.innerHeight;u==="top"?r<p&&(u="bottom"):u==="bottom"?V-r-d<p&&(u="top"):u==="left"?a<c&&(u="right"):u==="right"&&k-a-l<c&&(u="left"),m==="top"?V-r<p&&(m="bottom"):m==="bottom"?r+d<p&&(m="top"):m==="left"?k-a<c&&(m="right"):m==="right"&&a+l<c&&(m="left")}let f=0,g=0;switch(u){case"top":g-=p;break;case"left":f-=c;break;case"right":f+=l;break;case"bottom":g+=d;break}switch(m){case"right":f-=c-l;break;case"bottom":g-=p-d;break}if(this.cover&&(u==="top"?g+=d:u==="bottom"&&(g-=d)),o!==e){const k=e.getBoundingClientRect();f+=a-k.left,g+=r-k.top}t.style.left=`${f}px`,t.style.top=`${g}px`},addFocusEvents(e){const t=e.querySelectorAll("input, textarea");let o;return ys(fe(t,{focus:()=>{this.showPopup=!0,clearTimeout(this.blurTimer)},blur:()=>{this.blurTimer=setTimeout(()=>{this.$refs.popup.matches(":focus-within")||(this.showPopup=!1)},0)}}),fe(e,{mousedown:s=>{s.target.matches("input, textarea, button")||(s.preventDefault(),s.stopPropagation()),s.target.matches(".dito-button-clear")||(o=(this.triggerTarget??this.$refs.trigger).querySelector("input, textarea"),o&&!o.hasAttribute("readonly")?o.setAttribute("readonly","true"):o=null)},mouseup:s=>{o&&setTimeout(()=>{o.removeAttribute("readonly"),s.target.matches("input, textarea, button")||o.focus(),o=null},0)}}))},onShowPopup(e){e?(this.trigger==="focus"&&(this.popupEvents=this.addFocusEvents(this.$refs.popup)),this.updatePosition()):(this.popupEvents?.remove(),this.popupEvents=null)},onClick(){this.disabled||(this.showPopup=!0)},onHover(e){this.disabled||(clearTimeout(this.mouseLeaveTimer),e?this.showPopup=!0:this.hideDelay?this.mouseLeaveTimer=setTimeout(()=>{this.showPopup=!1},this.hideDelay):this.showPopup=!1)}}},[["render",$s]]),Ds=["id","type","name","title","disabled","readonly","autofocus","placeholder","autocomplete","aria-label"];function Bs(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-input",a.classes]),onMousedown:t[2]||(t[2]=(...r)=>a.onMouseDown&&a.onMouseDown(...r))},[n.renderSlot(e.$slots,"prefix"),n.withDirectives(n.createElementVNode("input",n.mergeProps({id:o.id,ref:"input","onUpdate:modelValue":t[0]||(t[0]=r=>i.currentValue=r),type:o.type,name:o.name,title:o.title,disabled:o.disabled,readonly:o.readonly,autofocus:o.autofocus,placeholder:o.placeholder,autocomplete:o.autocomplete,"aria-label":o.title},a.attributes,{onMousedown:t[1]||(t[1]=(...r)=>a.onMouseDown&&a.onMouseDown(...r))}),null,16,Ds),[[n.vModelDynamic,i.currentValue]]),n.renderSlot(e.$slots,"suffix")],34)}const U=y({emits:["update:modelValue"],inheritAttrs:!1,props:{modelValue:{type:[String,Number],default:null},type:{type:String,default:"text"},id:{type:String,default:null},name:{type:String,default:null},title:{type:String,default:null},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},focused:{type:Boolean,default:!1},placeholder:{type:String,default:null},autocomplete:{type:String,default:"off"}},data(){return{currentValue:this.modelValue}},computed:{classes(){return[this.$attrs.class,{"dito-input--focus":this.focused}]},attributes(){const{class:e,...t}=this.$attrs;return t},input(){return this.$refs.input},size(){const{size:e,min:t,max:o}=this.$attrs,s=i=>i!=null?`${i}`.length:0;return e||s(t)||s(o)||void 0}},watch:{modelValue(e,t){e!==t&&(this.currentValue=e)},currentValue(e){e!==this.modelValue&&this.$emit("update:modelValue",e)}},methods:{focus(){this.input.focus()},blur(){this.input.blur()},onMouseDown(e){e.target===this.input?e.stopPropagation():!this.disabled&&!this.readonly&&(this.focus(),e.preventDefault())}}},[["render",Bs]]);function ws(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("i",{class:n.normalizeClass(["dito-icon",a.classes])},null,2)}const Q=y({props:{name:{type:String,required:!0},disabled:{type:Boolean,default:!1}},computed:{classes(){const e="dito-icon";return{[`${e}--${this.name}`]:!0,[`${e}--disabled`]:this.disabled}}}},[["render",ws]]);function j(e,{start:t,end:o}){e?.setSelectionRange&&(e.focus(),e.setSelectionRange(t,o))}function oe(e){return e&&"selectionStart"in e?{start:e.selectionStart,end:e.selectionEnd}:null}function Ss(e,t,o,s,i,a){const r=n.resolveComponent("DitoIcon"),l=n.resolveComponent("DitoInput"),d=n.resolveComponent("DitoCalendar"),c=n.resolveComponent("DitoTrigger");return n.openBlock(),n.createBlock(c,n.mergeProps({class:"dito-date-picker",ref:"trigger",show:i.showPopup,"onUpdate:show":t[7]||(t[7]=p=>i.showPopup=p),trigger:"focus"},{transition:o.transition,placement:o.placement,disabled:o.disabled,target:o.target}),{trigger:n.withCtx(()=>[e.$slots.trigger?n.renderSlot(e.$slots,"trigger",{key:0}):(n.openBlock(),n.createBlock(l,n.mergeProps({key:1,class:"dito-date-picker-input",ref:"input",modelValue:a.currentText,"onUpdate:modelValue":t[1]||(t[1]=p=>a.currentText=p),type:"text"},{placeholder:o.placeholder,disabled:o.disabled,focused:a.focused,...e.$attrs},{onFocus:t[2]||(t[2]=p=>a.onFocus(!0)),onBlur:t[3]||(t[3]=p=>a.onFocus(!1)),onKeydown:a.onKeyDown,onMousedown:t[4]||(t[4]=n.withModifiers(p=>a.onMouseDown(!1),["stop"]))}),{prefix:n.withCtx(()=>[n.renderSlot(e.$slots,"prefix")]),suffix:n.withCtx(()=>[n.createVNode(r,{name:"calendar",disabled:o.disabled,onMousedown:t[0]||(t[0]=n.withModifiers(p=>a.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),n.renderSlot(e.$slots,"suffix")]),_:3},16,["modelValue","onKeydown"]))]),popup:n.withCtx(()=>[n.createVNode(d,n.mergeProps({class:"dito-date-picker-popup",ref:"calendar",modelValue:i.currentValue,"onUpdate:modelValue":t[5]||(t[5]=p=>i.currentValue=p)},{locale:o.locale,disabledDate:o.disabledDate},{onSelect:t[6]||(t[6]=p=>i.showPopup=!1)}),null,16,["modelValue"])]),_:3},16,["show"])}const Qt=y({components:{DitoTrigger:Qe,DitoCalendar:bs,DitoInput:U,DitoIcon:Q},emits:["update:modelValue","update:show","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},locale:{type:String,default:"en-US"},format:{type:Object,default:()=>({date:h.defaultFormats.date,time:!1})},disabledDate:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1}},computed:{focused(){return this.inputFocused||this.showPopup},input(){return Ge(this)?.querySelector("input")},formatOptions(){return{locale:this.locale,...this.format}},currentText:{get(){return h.format(this.currentValue,this.formatOptions)||""},set(e){const t=Ye(e,this.formatOptions);t&&(this.currentValue=t)}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))},show(e){this.showPopup=e},showPopup(e,t){e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{onFocus(e){this.inputFocused=e,this.showPopup=e},onKeyDown(e){const{ver:t,enter:o}=Je(e);if(t||o){e.preventDefault();const s=oe(this.input)?.start,i=a=>Yt(this.currentText,a,this.formatOptions);if(t&&!this.showPopup)this.showPopup=!0;else{const{calendar:a}=this.$refs;if(a){const{name:r,start:l}=i(s)||{};r&&a.navigate({step:t,enter:o,mode:r,update:!0})&&this.$nextTick(()=>j(this.input,i(l)))}}}},onMouseDown(e){this.showPopup=!this.disabled&&(!e||!this.showPopup),this.showPopup&&this.focus()},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Ss]]),Vs={class:"dito-time-picker-popup"},Ps={class:"dito-time-picker-panel"},Es={class:"dito-time-picker-hour",ref:"hour"},Ns=["onClick"],Os={class:"dito-time-picker-panel"},Ts={class:"dito-time-picker-minute",ref:"minute"},Ls=["onClick"],Fs={class:"dito-time-picker-panel"},Is={class:"dito-time-picker-second",ref:"second"},Ms=["onClick"];function Rs(e,t,o,s,i,a){const r=n.resolveComponent("DitoIcon"),l=n.resolveComponent("DitoInput"),d=n.resolveComponent("DitoTrigger");return n.openBlock(),n.createBlock(d,n.mergeProps({class:"dito-time-picker",ref:"trigger",show:i.showPopup,"onUpdate:show":t[5]||(t[5]=c=>i.showPopup=c),trigger:"focus"},{transition:o.transition,placement:o.placement,disabled:o.disabled,target:o.target}),{trigger:n.withCtx(()=>[e.$slots.trigger?n.renderSlot(e.$slots,"trigger",{key:0}):(n.openBlock(),n.createBlock(l,n.mergeProps({key:1,class:"dito-time-picker-input",ref:"input",modelValue:a.currentText,"onUpdate:modelValue":t[1]||(t[1]=c=>a.currentText=c),type:"text"},{placeholder:o.placeholder,disabled:o.disabled,focused:a.focused,...e.$attrs},{onFocus:t[2]||(t[2]=c=>a.onFocus(!0)),onBlur:t[3]||(t[3]=c=>a.onFocus(!1)),onKeydown:a.onKeyDown,onMousedown:t[4]||(t[4]=n.withModifiers(c=>a.onMouseDown(!1),["stop"]))}),{prefix:n.withCtx(()=>[n.renderSlot(e.$slots,"prefix")]),suffix:n.withCtx(()=>[n.createVNode(r,{name:"clock",disabled:o.disabled,onMousedown:t[0]||(t[0]=n.withModifiers(c=>a.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),n.renderSlot(e.$slots,"suffix")]),_:3},16,["modelValue","onKeydown"]))]),popup:n.withCtx(()=>[n.createElementVNode("div",Vs,[n.createElementVNode("div",Ps,[n.createElementVNode("ul",Es,[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(24,c=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledHour(c-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:a.hour===c-1}),onClick:p=>a.hour=c-1},n.toDisplayString(a.leftPad(c-1)),11,Ns))],64))),64))],512)]),n.createElementVNode("div",Os,[n.createElementVNode("ul",Ts,[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(60,c=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledMinute(c-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:a.minute===c-1}),onClick:p=>a.minute=c-1},n.toDisplayString(a.leftPad(c-1)),11,Ls))],64))),64))],512)]),n.createElementVNode("div",Fs,[n.createElementVNode("ul",Is,[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(60,c=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledSecond(c-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:a.second===c-1}),onClick:p=>a.second=c-1},n.toDisplayString(a.leftPad(c-1)),11,Ms))],64))),64))],512)])])]),_:3},16,["show"])}const Xt=y({components:{DitoTrigger:Qe,DitoInput:U,DitoIcon:Q},emits:["update:modelValue","update:show","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},locale:{type:String,default:"en-US"},format:{type:Object,default:()=>({time:h.defaultFormats.time,date:!1})},disabledHour:{type:Function,default:()=>!1},disabledMinute:{type:Function,default:()=>!1},disabledSecond:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,ignoreNextChange:!1}},computed:{focused(){return this.inputFocused||this.showPopup},input(){return Ge(this)?.querySelector("input")},formatOptions(){return{locale:this.locale,...this.format}},currentText:{get(){return h.format(this.currentValue,this.formatOptions)||""},set(e){const t=Ye(e,this.formatOptions);t&&(this.currentValue=t)}},currentDate(){return this.currentValue||me(new Date,{hour:0,minute:0,second:0,millisecond:0})},hour:{get(){return this.currentDate.getHours()},set(e){this.setTime({hour:e})}},minute:{get(){return this.currentDate.getMinutes()},set(e){this.setTime({minute:e})}},second:{get(){return this.currentDate.getSeconds()},set(e){this.setTime({second:e})}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e,this.scrollAll(!0))},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e),this.scrollAll(!0))},currentText(){const{input:e}=this,t=oe(e);this.focused&&!this.ignoreNextChange&&t.start===t.end&&this.$nextTick(()=>j(e,t)),this.ignoreNextChange=!1},show(e){this.showPopup=e},showPopup(e,t){e&&this.scrollAll(!1),e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{leftPad(e){return("0"+e).slice(-2)},setTime(e){this.currentValue=me(this.currentDate,{...e,millisecond:0})},scrollAll(e){const t=(o,s)=>{const i=this.$refs[o];if(i){const a=i.scrollHeight/(i.childElementCount+6),r=Math.round(s*a),l=Math.abs(i.scrollTop-r);i.scrollTo({top:r,behavior:e&&l<100?"smooth":"auto"})}};this.$nextTick(()=>{t("hour",this.hour),t("minute",this.minute),t("second",this.second)})},onFocus(e){this.inputFocused=e,this.showPopup=e},onKeyDown(e){const{input:t}=this,o=oe(t),{ver:s,enter:i}=Je(e);if(s||i){e.preventDefault();const a=r=>Yt(this.currentText,r,this.formatOptions);if(s)if(!this.showPopup)this.showPopup=!0;else{const{name:r,start:l}=a(o.start)||{};if(r){const d=this[r]+s,c=this.$refs[r].childElementCount;this[r]=d<0?d+c:d>=c?d-c:d,this.ignoreNextChange=!0,this.$nextTick(()=>j(t,a(l)))}}else i&&(this.showPopup=!1)}else if(o.start===o.end){const{value:a}=t;let r=o.start;const l=d=>!isNaN(Number(d));if(e.key.length===1)if(l(e.key)&&r<a.length)a[r]===":"&&l(a[r-1])&&l(a[r-2])&&r++,l(a[r])&&(l(a[r+1])||l(a[r-1]))&&(t.value=a.slice(0,r)+a.slice(r+1),j(t,{start:r,end:r}));else{const d=h.format(this.currentValue,this.formatOptions).length;a.length===d?e.preventDefault():a.length>d&&(t.value=a.slice(0,d),j(t,o),e.preventDefault())}else e.key==="Backspace"&&(r===1||[" ",":"].includes(a[r-2]))&&(r===a.length||a[r]===":"?(r--,t.value=a.slice(0,r)+((a[r-1]??"")+"00")+a.slice(r+1),j(t,{start:r,end:r})):l(a[r])&&!l(+a[r+1])&&(t.value=a.slice(0,r)+"0"+a.slice(r),j(t,{start:r,end:r})))}},onMouseDown(e){this.showPopup=!this.disabled&&(!e||!this.showPopup),this.showPopup&&this.focus()},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Rs]]),js={class:"dito-date-time-picker",ref:"picker"};function zs(e,t,o,s,i,a){const r=n.resolveComponent("DitoIcon"),l=n.resolveComponent("DitoInput"),d=n.resolveComponent("DitoDatePicker"),c=n.resolveComponent("DitoTimePicker");return n.openBlock(),n.createElementBlock("div",js,[n.createElementVNode("div",{class:n.normalizeClass(["dito-date-time-picker__inner",{"dito-date-time-picker__inner--focus":a.focused}])},[n.createVNode(l,n.mergeProps({class:"dito-date-time-picker__input",ref:"input",modelValue:a.currentText,"onUpdate:modelValue":t[1]||(t[1]=p=>a.currentText=p),type:"text"},{placeholder:o.placeholder,disabled:o.disabled,focused:a.focused,...e.$attrs},{onFocus:t[2]||(t[2]=p=>a.onFocus(!0)),onBlur:t[3]||(t[3]=p=>a.onFocus(!1)),onKeydown:a.onKeyDown,onMousedown:t[4]||(t[4]=n.withModifiers(p=>a.onMouseDown(!1),["stop"]))}),{prefix:n.withCtx(()=>[n.renderSlot(e.$slots,"prefix")]),suffix:n.withCtx(()=>[n.createVNode(r,{name:"calendar",disabled:o.disabled,onMousedown:t[0]||(t[0]=n.withModifiers(p=>a.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),n.renderSlot(e.$slots,"suffix")]),_:3},16,["modelValue","onKeydown"]),n.createVNode(d,n.mergeProps({ref:"date",modelValue:i.currentValue,"onUpdate:modelValue":t[5]||(t[5]=p=>i.currentValue=p),show:i.showDate,"onUpdate:show":t[6]||(t[6]=p=>i.showDate=p),placement:"bottom-left",target:e.$refs.picker},a.attributes),{trigger:n.withCtx(()=>[...t[9]||(t[9]=[])]),_:1},16,["modelValue","show","target"]),n.createVNode(c,n.mergeProps({ref:"time",modelValue:i.currentValue,"onUpdate:modelValue":t[7]||(t[7]=p=>i.currentValue=p),show:i.showTime,"onUpdate:show":t[8]||(t[8]=p=>i.showTime=p),placement:"bottom-right",target:e.$refs.picker},a.attributes),{trigger:n.withCtx(()=>[...t[10]||(t[10]=[])]),_:1},16,["modelValue","show","target"])],2)],512)}const As=y({components:{DitoInput:U,DitoDatePicker:Qt,DitoTimePicker:Xt,DitoIcon:Q},emits:["update:modelValue","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placeholder:{type:String,default:null},disabled:{type:Boolean,default:!1},locale:{type:String,default:"en-US"},format:{type:Object,default:null}},data(){return{currentValue:this.modelValue,showDate:!1,showTime:!1,inputFocused:!1,dateFocused:!1,timeFocused:!1,closedMode:null}},computed:{attributes(){const{transition:e,disabled:t,locale:o,formatOptions:s}=this;return{transition:e,disabled:t,locale:o,format:s}},focused(){return this.inputFocused||this.showDate||this.showTime},input(){return this.$refs.input.input},formatOptions(){return h.assignDeeply({locale:this.locale,time:h.defaultFormats.time,date:h.defaultFormats.date},{date:{month:"short",format:(e,t,o)=>t==="literal"&&/\bat\b/.test(e)?", ":this.format?.date?.format?.(e,t,o)??e}},this.format)},timeIndex(){const e=this.currentText;if(e){const t=e.match(/([\S]+\s*)$/)?.[1];if(t)return e.length-t.length}return null},currentText:{get(){return h.format(this.currentValue,this.formatOptions)||""},set(e){const t=Ye(e,this.formatOptions);if(t){const o=oe(this.input);this.currentValue=t,this.$nextTick(()=>j(this.input,o))}}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{onFocus(e){this.inputFocused=e,e?this.updatePopups():(this.showDate=!1,this.showTime=!1)},onMouseDown(e){e&&(this.showDate||this.showTime)?(this.showDate=!1,this.showTime=!1):this.disabled||(this.focus(),requestAnimationFrame(()=>this.updatePopups()))},onKeyDown(e){const t=this.getMode(e);this.$refs[t].onKeyDown(e),e.defaultPrevented?this.closedMode=t:t!==this.closedMode&&this.updatePopups(t)},getMode(e=null){const{start:t}=oe(this.input),{hor:o}=Je(e);return this.timeIndex===null||t+o<this.timeIndex?"date":"time"},updatePopups(e=this.getMode()){e&&(this.closedMode=null),this.showDate=e==="date",this.showTime=e==="time"},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",zs]]),qs={class:"dito-pagination"},Us={key:0,class:"dito-pagination-total"},Hs={key:1,class:"dito-buttons dito-buttons--round"},Ws=["disabled","onClick"],Ks={key:0};function Ys(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",qs,[o.showTotal?(n.openBlock(),n.createElementBlock("div",Us,[o.total>0?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode(n.toDisplayString(a.first)+" – "+n.toDisplayString(a.last)+" / "+n.toDisplayString(o.total),1)],64)):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),a.numPages>1?(n.openBlock(),n.createElementBlock("div",Hs,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.buttons,r=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",a.getButtonClasses(r)]),disabled:r.disabled,onClick:l=>a.onClickButton(r)},[r.text?(n.openBlock(),n.createElementBlock("span",Ks,n.toDisplayString(r.text),1)):n.createCommentVNode("",!0)],10,Ws))),256))])):n.createCommentVNode("",!0)])}const Js=y({emits:["update:page"],props:{total:{type:Number,default:0},page:{type:Number,default:1},pageSize:{type:Number,default:10},showTotal:{type:Boolean,default:!0}},data(){return{showPrev:!0,showNext:!0,currentPage:this.page}},computed:{first(){return(this.currentPage-1)*this.pageSize+1},last(){return Math.min(this.first+this.pageSize-1,this.total)},numPages(){return Math.ceil(this.total/this.pageSize)},buttons(){const{showPrev:e,showNext:t,currentPage:o,numPages:s}=this,i=e+t+1;let a=1,r=1;s<=i?r=s:o<=e+1?r=i:o>=s-t?(r=s,a=s-i+1):(a=o-e,r=o+t);const l=[];l.push({index:o-1,type:"prev",disabled:o<=1}),a>=2&&l.push({index:1,text:1}),a>2&&l.push({index:Math.max(1,o-10),type:"ellipsis-prev"});for(let d=a;d<=r;d++)l.push({index:d,text:d,active:d===o});return r<s-1&&l.push({index:Math.min(s,o+10),type:"ellipsis-next"}),r<=s-1&&l.push({index:s,text:s}),l.push({index:o+1,type:"next",disabled:o>=s}),l}},watch:{page(e){this.currentPage=e},pageSize(){this.currentPage>this.numPages&&(this.currentPage=this.numPages)},currentPage(e,t){e!==t&&this.$emit("update:page",e)}},created(){this.currentPage=this.page},methods:{getButtonClasses(e){const t="dito-button";return{[`${t}--${e.type}`]:e.type,[`${t}--active`]:e.active}},onClickButton(e){e.index&&!e.disabled&&e.index!==this.currentPage&&(this.currentPage=e.index)}}},[["render",Ys]]),Gs={class:"dito-switch__pane"},Qs=["id","name","disabled"],Xs={key:0,class:"dito-switch__label"};function Zs(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-switch",a.classes]),style:n.normalizeStyle(a.styles)},[n.createElementVNode("div",Gs,[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:o.id,ref:"input"},a.attributes,{"onUpdate:modelValue":t[0]||(t[0]=r=>i.checked=r),type:"checkbox",name:o.name,disabled:o.disabled}),null,16,Qs),[[n.vModelCheckbox,i.checked]]),t[1]||(t[1]=n.createElementVNode("div",{class:"dito-switch__button"},null,-1)),o.labels?(n.openBlock(),n.createElementBlock("span",Xs,[i.checked?n.renderSlot(e.$slots,"checked",{key:0},()=>[n.createTextVNode(n.toDisplayString(o.labels.checked||"on"),1)]):n.renderSlot(e.$slots,"unchecked",{key:1},()=>[n.createTextVNode(n.toDisplayString(o.labels.unchecked||"off"),1)])])):n.createCommentVNode("",!0)])],6)}const _s=y({emits:["update:modelValue","change"],inheritAttrs:!1,props:{modelValue:{type:Boolean,default:!1},id:{type:String,default:null},name:{type:String,default:null},disabled:{type:Boolean,default:!1},labels:{type:[Object,Boolean],default:!1}},data(){return{checked:this.modelValue}},computed:{classes(){const e="dito-switch";return[this.$attrs.class,{[`${e}--checked`]:this.checked,[`${e}--disabled`]:this.disabled}]},styles(){const{labels:{checked:e,unchecked:t}={}}=this,o=Math.max(0,e?.length,t?.length);return{"--switch-width":o?`${o*1.5}rem`:null}},attributes(){const{class:e,...t}=this.$attrs;return t}},watch:{modelValue(e){this.checked=e},checked(e){e!==this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))}},methods:{focus(){this.$refs.input.focus()}}},[["render",Zs]]);function Zt({enabled:e},{slots:t}){return e?n.h(n.Transition,vs,t):t.default()}Zt.props={enabled:{type:Boolean,default:!0}};const xs=Zt,X=(e,t)=>Object.assign(e.style,t),ge=e=>setTimeout(e,0),_t=e=>getComputedStyle(e).height,vs={name:"dito-height",onAfterEnter(e){ge(()=>X(e,{height:null}))},onEnter(e){const{width:t}=getComputedStyle(e);X(e,{width:t,position:"absolute",visibility:"hidden",height:"auto"}),ge(()=>{const{height:o}=getComputedStyle(e);X(e,{width:null,position:null,visibility:null,height:0}),_t(e),ge(()=>X(e,{height:o}))})},onLeave(e){const{height:t}=getComputedStyle(e);X(e,{height:t}),_t(e),ge(()=>X(e,{height:0}))}},H={data(){return{domHandlers:[]}},unmounted(){for(const{remove:e}of this.domHandlers)e();this.domHandlers=[]},methods:{domOn(e,t,o){const s=fe(e,h.isObject(t)?t:{[t]:o});return this.domHandlers.push(s),s}}};class ea{hasRole(...t){if(this.roles){for(const o of t)if(this.roles.includes(o))return!0}return!1}}const xt={provide(){return{$schemaParentComponent:()=>this}},data(){return{schemaComponents:[]}},computed:{mainSchemaComponent(){return this.schemaComponents[0]}},methods:{_registerSchemaComponent(e,t){const{schemaComponents:o}=this;t?o.push(e):o.splice(o.indexOf(e),1)}}},vt={mixins:[xt],computed:{errors(){return this.schemaComponents.flatMap(({errors:e})=>e||[])},isTouched(){return this.schemaComponents.some(e=>e.isTouched)},isDirty(){return this.schemaComponents.some(e=>e.isDirty)},isValid(){return this.schemaComponents.every(e=>e.isValid)},isValidated(){return this.schemaComponents.every(e=>e.isValid)}},methods:{validateAll(e,t=!0){return this.schemaComponents.every(o=>o.validateAll(e,t))},verifyAll(e){return this.schemaComponents.every(t=>t.verifyAll(e))},resetValidation(){this.schemaComponents.forEach(e=>e.resetValidation())},clearErrors(){this.schemaComponents.forEach(e=>e.clearErrors())},showValidationErrors(e,t,o=!0){return this.schemaComponents.forEach(s=>{s.showValidationErrors(e,t,o)&&(o=!1)}),!o}}},en={mixins:[vt],provide(){return{$routeComponent:()=>this}},data(){return{reload:!1,store:{},loadCache:{}}},computed:{routeComponent(){return this},routeLevel(){let e=0,t=this;for(;t=t.parentRouteComponent;)e++;return e},routeRecord(){return this.$route.matched[this.routeLevel]},isLastRoute(){const{matched:e}=this.$route;return this.routeRecord===e[e.length-1]},isLastUnnestedRoute(){const{matched:e}=this.$route;for(let t=e.length-1;t>=0;t--){const o=e[t];if(!o.meta.nested)return this.routeRecord===o}return!1},isNestedRoute(){return this.meta.nested},isView(){return!1},meta(){return this.routeRecord?.meta},path(){return this.getRoutePath(this.routeRecord?.path)},label(){return this.getLabel(this.schema)},breadcrumb(){const{breadcrumb:e}=this.schema||{};return e||`${this.breadcrumbPrefix} ${this.label}`},breadcrumbPrefix(){return""},param(){return this.$route.params[this.meta?.param]||null},isMutating(){return!1}},beforeRouteUpdate(e,t){return this?.beforeRouteChange(e,t)},beforeRouteLeave(e,t){return this?.beforeRouteChange(e,t)},created(){this.appState.routeComponents.push(this)},unmounted(){const{routeComponents:e}=this.appState;e.splice(e.indexOf(this),1)},methods:{beforeRouteChange(e,t){let o=!0;return t.path.startsWith(this.path)&&!e.path.startsWith(this.path)&&t.path!==e.path&&(this.isFullRouteChange(e,t)||e.path.length<=t.path.length)&&(this.isMutating?o=this.isValidated||this.validateAll():this.isDirty&&(o=window.confirm(`You have unsaved changes. Do you really want to ${this.verbs.cancel}?`))),o},getRoutePath(e){const{path:t}=this.$route;return e?t.split("/").slice(0,e.split("/").length).join("/"):t},getChildPath(e){return`${this.path}/${e}`},isFullRouteChange(e,t){const o=this.path.match(/^(\/[^/]*)/)[1];return!h.getCommonPrefix(e.path,t.path).startsWith(o)}}},ta=["data-resource"];function na(e,t,o,s,i,a){const r=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoSchema");return e.user&&e.shouldRenderSchema(e.viewSchema)?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[e.isLastRoute?(n.openBlock(),n.createElementBlock("div",{key:1,class:"dito-view dito-scroll-parent","data-resource":e.sourceSchema.path},[(n.openBlock(),n.createBlock(l,{key:e.name,schema:e.viewSchema,data:e.data,meta:e.meta,store:e.getChildStore(e.name),padding:"root",disabled:e.isLoading,scrollable:"",single:""},null,8,["schema","data","meta","store","disabled"]))],8,ta)):(n.openBlock(),n.createBlock(r,{key:e.name}))],64)):n.createCommentVNode("",!0)}const oa=C.component("DitoView",{mixins:[en],provide(){return{$sourceComponent:()=>this.mainComponent?.sourceComponent||null,$resourceComponent:()=>this.mainComponent?.resourceComponent||null}},data(){return{isLoading:!1,data:{}}},computed:{schema(){return this.meta.schema??{}},name(){return this.schema.name},isView(){return!0},isSingleComponentView(){return Me(this.schema)},mainComponent(){return this.mainSchemaComponent?.getComponentByDataPath(this.name)},viewSchema(){const{component:e,...t}=this.schema;return this.isSingleComponentView?{...t,components:{[t.name]:{name:t.name,label:!1,...e}}}:t},providesData(){return Le(this.viewSchema,Ut)}},watch:{$route:{flush:"post",handler(e,t){this.isFullRouteChange(e,t)&&(this.isLoading=!1,this.data={})}}},mounted(){this.shouldRenderSchema(this.viewSchema)||this.$router.replace({path:"/"})},methods:{setData(e){this.data=e},getChildPath(e){return this.isSingleComponentView?this.path:`${this.path}/${e}`},setLoading(e){this.isLoading=!!e}}}),tn=y(oa,[["render",na]]);function nn(e,t){return n.getCurrentScope()?(n.onScopeDispose(e,t),!0):!1}const sa=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const aa=e=>typeof e<"u",ia=e=>e!=null;function ra(e){return Array.isArray(e)?e:[e]}function la(e){return n.getCurrentInstance()}function da(e,t=!0,o){la()?n.onMounted(e,o):t?e():n.nextTick(e)}const ca=sa?window.document:void 0;function on(e){var t;const o=n.toValue(e);return(t=o?.$el)!==null&&t!==void 0?t:o}function ha(e){return JSON.parse(JSON.stringify(e))}function pa(e,t,o,s={}){var i,a;const{clone:r=!1,passive:l=!1,eventName:d,deep:c=!1,defaultValue:p,shouldEmit:u}=s,m=n.getCurrentInstance(),f=m?.emit||(m==null||(i=m.$emit)===null||i===void 0?void 0:i.bind(m))||(m==null||(a=m.proxy)===null||a===void 0||(a=a.$emit)===null||a===void 0?void 0:a.bind(m?.proxy));let g=d;g=g||`update:${t.toString()}`;const k=$=>r?typeof r=="function"?r($):ha($):$,V=()=>aa(e[t])?k(e[t]):p,w=$=>{u?u($)&&f(g,$):f(g,$)};if(l){const $=n.ref(V());let P=!1;return n.watch(()=>e[t],N=>{P||(P=!0,$.value=k(N),n.nextTick(()=>P=!1))}),n.watch($,N=>{!P&&(N!==e[t]||c)&&w(N)},{deep:c}),$}else return n.computed({get(){return V()},set($){w($)}})}function ua(e,t={}){let o;const{immediate:s,...i}=t,a=n.shallowRef(!1),r=n.shallowRef(!1),l=u=>o&&o.activate(u),d=u=>o&&o.deactivate(u),c=()=>{o&&(o.pause(),r.value=!0)},p=()=>{o&&(o.unpause(),r.value=!1)};return n.watch(n.computed(()=>ra(n.toValue(e)).map(u=>{const m=n.toValue(u);return typeof m=="string"?m:on(m)}).filter(ia)),u=>{if(u.length)if(!o)o=Pn.createFocusTrap(u,{...i,onActivate(){a.value=!0,t.onActivate&&t.onActivate()},onDeactivate(){a.value=!1,t.onDeactivate&&t.onDeactivate()}}),s&&l();else{const m=o?.active;o?.updateContainerElements(u),!m&&s&&l()}},{flush:"post"}),nn(()=>d()),{hasFocus:a,isPaused:r,activate:l,deactivate:d,pause:c,unpause:p}}const ma=n.defineComponent((e,{slots:t})=>{const o=n.shallowRef(),s=n.reactive(ua(o,e.options));return()=>{if(t.default)return n.h(e.as||"div",{ref:o},t.default(s))}},{name:"UseFocusTrap",props:["as","options"]});function fa(e,t,o,s,i,a){const r=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema"),d=n.resolveComponent("UseFocusTrap");return n.openBlock(),n.createElementBlock("div",{class:"dito-dialog",ref:"dialog",role:"dialog","aria-expanded":"true","aria-modal":"true",style:n.normalizeStyle({"--width":e.settings.width?`${e.settings.width}px`:null}),onMouseup:t[2]||(t[2]=(...c)=>e.onMouseUp&&e.onMouseUp(...c))},[n.createVNode(d,{class:"dito-dialog__focus-trap",options:e.focusTrapOptions},{default:n.withCtx(()=>[n.createElementVNode("form",{class:"dito-scroll-parent",onSubmit:t[0]||(t[0]=n.withModifiers((...c)=>e.submit&&e.submit(...c),["prevent"])),onKeydown:t[1]||(t[1]=n.withKeys((...c)=>e.onEnter&&e.onEnter(...c),["enter"]))},[n.withDirectives(n.createElementVNode("button",null,null,512),[[n.vShow,!1]]),n.createVNode(l,{schema:e.schema,data:e.dialogData,padding:"root",scrollable:"",generateLabels:""},{buttons:n.withCtx(()=>[n.createVNode(r,{class:"dito-buttons--large",buttons:e.buttonSchemas,data:e.dialogData},null,8,["buttons","data"])]),_:1},8,["schema","data"])],32)]),_:1},8,["options"])],36)}const ga=C.component("DitoDialog",{mixins:[H],components:{UseFocusTrap:ma},emits:["remove"],provide(){return{$dialogComponent:()=>this}},props:{components:{type:Object,required:!0},buttons:{type:Object,required:!0},promise:{type:Object,required:!0},data:{type:Object,default:()=>({})},settings:{type:Object,default:()=>({width:480,clickToClose:!1})}},data(){const e=h.clone(this.data);for(const t in this.components)t in e||(e[t]=null);return{dialogData:e}},computed:{dialogComponent(){return this},schema(){return{type:"dialog",components:this.components}},buttonSchemas(){return Object.fromEntries(Object.entries(v(this.buttons)).map(([e,t])=>(e==="cancel"&&!t.events&&(t={...t,events:{click:()=>this.cancel()}}),[e,t])))},focusTrapOptions(){return{immediate:!0,fallbackFocus:()=>this.$refs.dialog,onDeactivate:this.cancel}},hasButtons(){return Object.keys(this.buttonSchemas).length>0},hasCancel(){return!!this.buttonSchemas.cancel}},mounted(){this.domOn(window,{keyup:e=>{(this.hasCancel||!this.hasButtons)&&e.keyCode===27&&this.cancel()}})},methods:{remove(){this.$emit("remove")},resolve(e){this.promise.resolve(e),this.remove()},reject(e){this.promise.reject(e),this.remove()},onEnter(e){e.target instanceof HTMLInputElement&&this.submit()},submit(){this.resolve(this.dialogData)},cancel(){this.resolve(void 0)},close(){this.cancel()},onMouseUp(){this.settings.clickToClose&&this.close()}}}),sn=y(ga,[["render",fa]]),ba=["data-agent-browser","data-agent-platform","data-agent-version"],ya={key:0,class:"dito-drag-overlay"};function ka(e,t,o,s,i,a){const r=n.resolveComponent("DitoDialog"),l=n.resolveComponent("DitoNavigation"),d=n.resolveComponent("DitoHeader"),c=n.resolveComponent("RouterView"),p=n.resolveComponent("DitoAccount"),u=n.resolveComponent("DitoSidebar"),m=n.resolveComponent("DitoNotifications"),f=n.resolveDirective("resize");return n.openBlock(),n.createElementBlock("div",{class:"dito-root","data-agent-browser":e.appState.agent.browser,"data-agent-platform":e.appState.agent.platform,"data-agent-version":e.appState.agent.versionNumber},[n.createVNode(n.Transition,{name:"dito-drag"},{default:n.withCtx(()=>[e.isDraggingFiles?(n.openBlock(),n.createElementBlock("div",ya)):n.createCommentVNode("",!0)]),_:1}),n.createVNode(n.TransitionGroup,{name:"dito-dialog"},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.dialogs,(g,k)=>(n.openBlock(),n.createBlock(r,{key:k,components:g.components,buttons:g.buttons,promise:g.promise,data:g.data,settings:g.settings,onRemove:V=>e.removeDialog(k)},null,8,["components","buttons","promise","data","settings","onRemove"]))),128))]),_:1}),n.createVNode(l),n.withDirectives((n.openBlock(),n.createElementBlock("main",{class:n.normalizeClass(["dito-page dito-scroll-parent",e.pageClasses])},[n.createVNode(d,{spinner:e.options.spinner,isLoading:e.isLoading},null,8,["spinner","isLoading"]),n.createVNode(c)],2)),[[f,e.onResizePage]]),n.createVNode(u,null,{default:n.withCtx(()=>[e.user?(n.openBlock(),n.createBlock(p,{key:0})):e.allowLogin?(n.openBlock(),n.createElementBlock("a",{key:1,class:"dito-login",onClick:t[0]||(t[0]=g=>e.rootComponent.login())},[...t[1]||(t[1]=[n.createElementVNode("span",null,"Login",-1)])])):n.createCommentVNode("",!0)]),_:1}),n.createVNode(m,{ref:"notifications"},null,512)],8,ba)}const Ca=C.component("DitoRoot",{mixins:[H],components:{DitoDialog:sn},provide(){return{$views:()=>this.resolvedViews}},props:{unresolvedViews:{type:[Object,Function,Promise],required:!0},options:{type:Object,default:()=>({})}},data(){return{resolvedViews:{},removeRoutes:null,dialogs:{},pageWidth:0,loadingCount:0,allowLogin:!1,isDraggingFiles:!1}},computed:{notifications(){return this.isMounted&&this.$refs.notifications},isLoading(){return this.loadingCount>0},pageClasses(){const e="dito-page";return[this.appState.pageClass,{[`${e}--width-80`]:this.pageWidth<=900*.8,[`${e}--width-60`]:this.pageWidth<=900*.6}]}},created(){this.appState.title=document.title||"Dito.js Admin",this.appState.routeComponents=[]},async mounted(){this.setupDragAndDrop(),tt.delegate(this.$el,{target:".dito-info",theme:"info",animation:"shift-away-subtle",interactive:!0,delay:250,zIndex:1,appendTo:e=>e.closest(".dito-pane"),onShow:e=>e.setContent(e.reference.dataset.info)}),this.domOn(document,{click:e=>{e.target.closest(".dito-label")||(this.appState.activeLabel=null)},keyup:e=>{e.code==="Tab"&&(this.appState.activeLabel=null)}});try{this.allowLogin=!1,await this.fetchUser()?await this.resolveViews():await this.login()}catch(e){console.error(e)}this.allowLogin=!0},methods:{setupDragAndDrop(){let e=0,t=[];const o=i=>{for(const a of t)a.closest(".dito-container").classList.toggle("dito-drop-target",i);i||(t=[])},s=i=>{this.isDraggingFiles=i,i?o(!0):setTimeout(()=>o(!1),150)};this.domOn(document,{dragenter:i=>{if(!e&&i.dataTransfer){t=document.querySelectorAll(".dito-upload");const a=t.length>0;if(i.dataTransfer.effectAllowed=a?"copy":"none",a)s(!0);else{i.preventDefault(),i.stopPropagation();return}}e++},dragleave:i=>{e--,!e&&i.dataTransfer&&s(!1)},dragover:i=>{if(i.dataTransfer){const a=i.target.closest(".dito-container:has(.dito-upload)");i.dataTransfer.dropEffect=a?"copy":"none",a||(i.preventDefault(),i.stopPropagation())}},drop:i=>{e=0,i.dataTransfer&&s(!1)}})},notify({type:e="info",title:t,text:o,error:s,duration:i}={}){this.notifications.notify({type:e,title:t,text:o,error:s,duration:i})},closeNotifications(){this.notifications.destroyAll()},registerLoading(e){this.loadingCount+=e?1:-1},showDialog({components:e,buttons:t,data:o,settings:s}){return new Promise(async(i,a)=>{const r=[];if(await x(this.api,{type:"dialog",components:e},r,0),r.length>0)throw new Error("Dialogs do not support components that produce routes");const l=`dialog-${++$a}`;this.dialogs[l]={components:e,buttons:t,data:o,settings:s,promise:{resolve:i,reject:a}}})},removeDialog(e){delete this.dialogs[e]},async login(){this.allowLogin=!0;const{additionalComponents:e,redirectAfterLogin:t}=this.options.login||{},o=await this.showDialog({components:{username:{type:"text",autofocus:!0},password:{type:"password"},...e},buttons:{login:{type:"submit",text:"Login"},cancel:{type:"button",text:"Cancel"}}});if(o)try{const s=await this.sendRequest({resource:this.api.users.login,data:o,internal:!0});t?location.replace(t):(this.setUser(s.data.user),await this.resolveViews())}catch(s){const i=s.response?.data?.error||s;this.notify({type:"error",error:i,title:"Authentication Error",text:i}),this.login()}},navigateHome(){return this.navigate("/")},async logout(){try{(await this.sendRequest({resource:this.api.users.logout,internal:!0})).data.success&&(this.setUser(null),this.navigateHome())}catch(e){console.error(e)}},async fetchUser(){let e=null;try{e=(await this.sendRequest({resource:this.api.users.session,internal:!0})).data.user||null}catch(t){const o=t.response?.data?.error||t;this.notify({type:"error",error:o,title:"Authentication Error",text:o})}return this.setUser(e),e},setUser(e){this.appState.user=e&&Object.setPrototypeOf(e,ea.prototype),e||(this.resolvedViews={},this.navigateHome())},async ensureUser(){await this.fetchUser()||await this.login()},async resolveViews(){try{this.resolvedViews=await So(this.unresolvedViews)}catch(o){return o.request||console.error(o),this.login()}const e=await h.mapConcurrently(Object.entries(this.resolvedViews),([o,s])=>Ct(tn,this.api,s,o)),{fullPath:t}=this.$route;this.removeRoutes?.(),this.removeRoutes=Da(this.$router,[{name:"root",path:"/",components:{}},...e.flat()]),this.$router.replace(t)},onResizePage({contentRect:{width:e}}){this.pageWidth=e}}});let $a=0;function Da(e,t){const o=[];for(const s of t)o.push(e.addRoute(s));return()=>{for(const s of o)s()}}const Xe=y(Ca,[["render",ka]]),Ba={class:"dito-menu__item"},wa=["href","onClick"];function Sa(e,t,o,s,i,a){const r=n.resolveComponent("DitoMenu",!0),l=n.resolveDirective("resize");return n.withDirectives((n.openBlock(),n.createElementBlock("ul",{class:"dito-menu",style:n.normalizeStyle({"--width":e.width?`${e.width}px`:null})},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.items,d=>(n.openBlock(),n.createElementBlock("li",Ba,[e.shouldShowItem(d)?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("a",{class:n.normalizeClass(["dito-menu__link",{"dito-menu__link--active":e.isActiveItem(d)}]),href:e.getItemHref(d),onClick:n.withModifiers(c=>e.onClickItem(d),["prevent","stop"])},n.toDisplayString(e.getLabel(d)),11,wa),d.items?(n.openBlock(),n.createBlock(r,{key:0,class:"dito-menu__sub",items:d.items,path:e.getItemPath(d,!1)},null,8,["items","path"])):n.createCommentVNode("",!0)],64)):n.createCommentVNode("",!0)]))),256))],4)),[[l,e.onResize]])}const Va=C.component("DitoMenu",{props:{items:{type:[Object,Array],default:()=>[]},path:{type:String,default:""}},data(){return{width:0}},methods:{shouldShowItem(e){return this.shouldRenderSchema(e)&&(!e.items||Object.values(e.items).some(this.shouldRenderSchema))},onResize({contentRect:{width:e}}){e&&(this.width=e)},getItemPath(e,t){const o=e.path?`${this.path}/${e.path}`:null;return t&&o&&e.items?`${o}${this.getItemPath(Object.values(e.items)[0],!1)}`:o},getItemHref(e){const t=this.getItemPath(e,!0);return t?this.$router.resolve(t).href:null},isActiveItem(e){return this.$route.path.startsWith(this.getItemPath(e,!1))||e.items&&Object.values(e.items).some(this.isActiveItem)},onClickItem(e){const t=this.getItemPath(e,!0);t&&this.$router.push({path:t,force:!0})}}}),Pa=y(Va,[["render",Sa]]),Ea={class:"dito-trail"},Na=["href","onClick"];function Oa(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",Ea,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.trail,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("a",{class:n.normalizeClass(["dito-trail__link",{"dito-trail__link--active":r.path===e.$route.path}]),href:e.getComponentHref(r),onClick:n.withModifiers(l=>e.onClickComponent(r),["prevent","stop"])},[n.createElementVNode("span",{class:n.normalizeClass(["dito-trail__text",{"dito-trail__text--dirty":r.isDirty}])},n.toDisplayString(r.breadcrumb),3)],10,Na)]))),256))]),n.renderSlot(e.$slots,"default")])}const Ta=C.component("DitoTrail",{computed:{trail(){return this.appState.routeComponents.filter(e=>!!e.routeRecord)}},methods:{getComponentPath(e){const{schema:t}=e;return t.type==="menu"?Object.values(t.items)[0].fullPath:e.path},getComponentHref(e){return this.$router.resolve(this.getComponentPath(e)).href},onClickComponent(e){this.$router.push({path:this.getComponentPath(e),force:!0})}}}),La=y(Ta,[["render",Oa]]),Fa={class:"dito-header"};function Ia(e,t,o,s,i,a){const r=n.resolveComponent("DitoSpinner"),l=n.resolveComponent("DitoTrail");return n.openBlock(),n.createElementBlock("nav",Fa,[n.createVNode(l,null,{default:n.withCtx(()=>[e.isLoading?(n.openBlock(),n.createBlock(r,{key:0,size:e.spinner?.size,color:e.spinner?.color},null,8,["size","color"])):n.createCommentVNode("",!0)]),_:1}),t[0]||(t[0]=n.createElementVNode("div",{class:"dito-header__teleport"},null,-1)),n.renderSlot(e.$slots,"default")])}const Ma=C.component("DitoHeader",{props:{spinner:{type:Object,default:null},isLoading:{type:Boolean,default:!1}}}),Ra=y(Ma,[["render",Ia]]),ja={class:"dito-navigation dito-scroll-parent"};function za(e,t,o,s,i,a){const r=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoMenu");return n.openBlock(),n.createElementBlock("nav",ja,[n.createElementVNode("h1",null,[n.createVNode(r,{class:"dito-link",to:"/"},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.appState.title),1)]),_:1})]),n.createVNode(l,{class:"dito-scroll",items:e.views},null,8,["items"])])}const Aa=C.component("DitoNavigation",{}),qa=y(Aa,[["render",za]]),Ua={class:"dito-notifications"},Ha={class:"dito-notifications__inner"};function Wa(e,t,o,s,i,a){const r=n.resolveComponent("VueNotifications");return n.openBlock(),n.createElementBlock("div",Ua,[t[0]||(t[0]=n.createElementVNode("div",{class:"dito-header"},[n.createElementVNode("span")],-1)),n.createElementVNode("div",Ha,[n.createVNode(r,{ref:"notifications",classes:"dito-notification",dangerouslySetInnerHtml:!0,position:"",width:""},null,512)])])}const Ka=C.component("DitoNotifications",{notifications(){return this.isMounted&&this.$refs.notifications},methods:{notify({type:e="info",title:t,text:o,error:s,duration:i}={}){t||={warning:"Warning",error:"Error",info:"Information",success:"Success"}[e]||"Notification",o=`<p>${h.asArray(o).join("</p> <p>")}</p>`.replace(/\n|\r\n|\r/g,"<br>");const a={warning:"warn",error:"error",info:"log",success:"log"}[e]||"error";console[a](h.stripHtml(o),...e==="error"&&s?[s]:[]);const{notifications:r=!0}=this.api;if(r){const{durationFactor:l=20}=r;i??=(40+o.length+t.length)*l,this.$notify({type:e,title:t,text:o,duration:i===0?-1:i})}},destroyAll(){this.notifications.destroyAll()}}}),Ya=y(Ka,[["render",Wa]]),Ja={class:"dito-header"};function Ga(e,t,o,s,i,a){const r=n.resolveDirective("resize");return n.withDirectives((n.openBlock(),n.createElementBlock("aside",{class:n.normalizeClass(["dito-sidebar dito-scroll-parent",e.classes])},[n.createElementVNode("nav",Ja,[n.renderSlot(e.$slots,"default")]),t[0]||(t[0]=n.createElementVNode("div",{class:"dito-sidebar__teleport dito-scroll"},null,-1))],2)),[[r,e.onResizeSidebar]])}const Qa=C.component("DitoSidebar",{data(){return{sidebarWidth:0}},computed:{classes(){const e="dito-sidebar";return{[`${e}--width-99`]:this.sidebarWidth<360,[`${e}--width-60`]:this.sidebarWidth<=360*.6}}},methods:{onResizeSidebar({contentRect:{width:e}}){this.sidebarWidth=e}}}),Xa=y(Qa,[["render",Ga]]),an={mixins:[H],data(){return{pulldown:{open:!1,startTime:0,checkTime:!0,events:{mousedown:()=>{this.setPulldownOpen(!1),this.pulldown.handlers.remove()},mouseup:()=>{this.onPulldownMouseUp()&&this.pulldown.handlers.remove()}},handlers:null}}},methods:{onPulldownMouseDown(e=null){e===null?(this.setPulldownOpen(!0),this.checkTime=!0):this.checkTime=!1},onPulldownMouseUp(e=null){const{startTime:t}=this.pulldown;if(!this.checkTime||t&&Date.now()-t>250)return this.setPulldownOpen(!1),e!==null&&this.onPulldownSelect(e),!0},onPulldownSelect(){},setPulldownOpen(e){this.pulldown.open=e,this.pulldown.startTime=e?Date.now():0,e&&(this.pulldown.handlers=this.domOn(document,this.pulldown.events))}}},Za={class:"dito-account"},_a=["onMousedown","onMouseup"];function xa(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",Za,[n.createElementVNode("a",{onMousedown:t[0]||(t[0]=n.withModifiers(r=>e.onPulldownMouseDown(),["stop"]))},[n.createElementVNode("span",null,n.toDisplayString(e.user.username),1)],32),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-pulldown--open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.items,(r,l)=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("a",{class:"dito-pulldown__item",onMousedown:n.withModifiers(d=>e.onPulldownMouseDown(l),["stop"]),onMouseup:d=>e.onPulldownMouseUp(l)},n.toDisplayString(r),41,_a)]))),256))],2)])}const va=C.component("DitoAccount",{mixins:[an],data(){return{items:{settings:"Settings",logout:"Logout"}}},methods:{onPulldownSelect(e){switch(e){case"logout":this.rootComponent.logout();break;case"settings":console.info("TODO: Implement Settings");break}}}}),ei=y(va,[["render",xa]]);function ti(e,t,o,s,i,a){return n.withDirectives((n.openBlock(),n.createElementBlock("div",{class:"dito-spinner",style:n.normalizeStyle({"--color":e.color,"--size":e.size,"--margin":e.margin})},[...t[0]||(t[0]=[n.createElementVNode("div",{class:"dito-spinner__pulse dito-spinner__pulse1"},null,-1),n.createElementVNode("div",{class:"dito-spinner__pulse dito-spinner__pulse2"},null,-1),n.createElementVNode("div",{class:"dito-spinner__pulse dito-spinner__pulse3"},null,-1)])],4)),[[n.vShow,e.loading]])}const ni=C.component("DitoSpinner",{props:{loading:{type:Boolean,default:!0},color:{type:String,default:null},size:{type:String,default:null},margin:{type:String,default:null}}}),rn=y(ni,[["render",ti]]);function oi(e,t,o,s,i,a){const r=n.resolveComponent("DitoSpinner"),l=n.resolveComponent("DitoIcon");return e.item.type==="text"?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.item.as||"div"),{key:0},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.item.text),1)]),_:1})):e.item.type==="html"?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.item.as||"div"),{key:1,innerHTML:e.item.html},null,8,["innerHTML"])):e.item.type==="spinner"?(n.openBlock(),n.createBlock(r,{key:2,size:e.item.size,color:e.item.color},null,8,["size","color"])):e.item.type==="icon"?(n.openBlock(),n.createBlock(l,{key:3,name:e.item.name,disabled:e.item.disabled},null,8,["name","disabled"])):e.item.type==="component"?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.item.component),n.normalizeProps(n.mergeProps({key:4},e.item.props)),null,16)):n.createCommentVNode("",!0)}const si=C.component("DitoAffix",{components:{DitoSpinner:rn,DitoIcon:Q},props:{item:{type:Object,required:!0},parentContext:{type:Object,required:!0}},computed:{context(){return this.parentContext}}}),ln=y(si,[["render",oi]]),ai=["disabled"],ii=["data-info"];function ri(e,t,o,s,i,a){const r=n.resolveComponent("DitoAffix");return e.hasContent?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-affixes",e.classes])},[n.renderSlot(e.$slots,"prepend"),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.visibleItems,(l,d)=>(n.openBlock(),n.createBlock(r,{class:n.normalizeClass(["dito-affix",e.getItemClasses(l)]),key:d,style:n.normalizeStyle(l.style),item:l,parentContext:e.parentContext},null,8,["class","style","item","parentContext"]))),128)),e.clearable?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-affixes__clear",type:"button",title:"Clear",disabled:e.disabled,onClick:t[0]||(t[0]=n.withModifiers(l=>e.$emit("clear"),["stop"])),onMousedown:t[1]||(t[1]=n.withModifiers(()=>{},["stop"]))},null,40,ai)):n.createCommentVNode("",!0),n.renderSlot(e.$slots,"append"),e.inlineInfo?(n.openBlock(),n.createElementBlock("div",{key:1,class:"dito-info","data-info":e.inlineInfo},null,8,ii)):n.createCommentVNode("",!0)],2)):n.createCommentVNode("",!0)}const li=C.component("DitoAffixes",{components:{DitoAffix:ln},emits:["clear"],props:{items:{type:[String,Object,Array],default:null},mode:{type:String,default:null},position:{type:String,default:null},absolute:{type:Boolean,default:!1},clearable:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},inlineInfo:{type:String,default:null},parentContext:{type:Object,required:!0}},computed:{context(){return this.parentContext},processedItems(){return h.asArray(this.items).filter(Boolean).map(e=>h.isString(e)?{type:"text",text:e}:e.type?e:e.text!=null?{type:"text",...e}:e.html!=null?{type:"html",...e}:e)},visibleItems(){return this.processedItems.filter(e=>qe(e,this.context))},classes(){const e="dito-affixes";return{[`${e}--${this.position}`]:this.position,[`${e}--${this.mode}`]:this.mode,[`${e}--absolute`]:this.absolute}},hasContent(){return this.visibleItems.length>0||this.clearable||this.inlineInfo||ne(this.$slots.prepend)||ne(this.$slots.append)}},methods:{getItemClasses(e){const t="dito-affix";return[{[`${t}--${e.type}`]:e.type,[`${t}--ellipsis`]:this.mode==="ellipsis"&&["text","html"].includes(e.type)},e.class]}}}),I=y(li,[["render",ri]]),di={key:1,class:"dito-label__inner"},ci=["for","innerHTML"],hi=["data-info"];function pi(e,t,o,s,i,a){const r=n.resolveComponent("DitoAffixes");return e.text||e.collapsible?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.collapsible?"button":"div"),n.mergeProps({key:0,class:"dito-label",type:e.collapsible?"button":null},e.attributes,{class:{"dito-label--active":e.isActive}}),{default:n.withCtx(()=>[e.collapsible?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-chevron--open":!e.collapsed}])},null,2)):n.createCommentVNode("",!0),e.text||e.prefixes.length>0||e.suffixes.length>0?(n.openBlock(),n.createElementBlock("div",di,[n.createVNode(r,{items:e.prefixes,position:"prefix",parentContext:e.context},null,8,["items","parentContext"]),e.text?(n.openBlock(),n.createElementBlock("label",{key:0,for:e.dataPath,innerHTML:e.text},null,8,ci)):n.createCommentVNode("",!0),n.createVNode(r,{items:e.suffixes,mode:"ellipsis",position:"suffix",parentContext:e.context},null,8,["items","parentContext"]),e.info?(n.openBlock(),n.createElementBlock("div",{key:1,class:"dito-info","data-info":e.info},null,8,hi)):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0)]),_:1},16,["type","class"])):n.createCommentVNode("",!0)}const ui=C.component("DitoLabel",{components:{DitoAffixes:I},emits:["open"],props:{label:{type:[String,Object],default:null},dataPath:{type:String,default:null},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},info:{type:String,default:null}},computed:{text(){const{label:e}=this;return h.isObject(e)?e?.text:e},prefixes(){return h.asArray(this.label?.prefix)},suffixes(){return h.asArray(this.label?.suffix)},attributes(){return this.collapsible?{onClick:this.onClick}:{}},isActive(){return this.appState.activeLabel===this}},methods:{onClick(){this.appState.activeLabel=this,this.$emit("open",this.collapsed)}}}),mi=y(ui,[["render",pi]]),be={methods:{getItemFormSchema:je,getItemUid:Ao,getItemId(e,t,o=null){return this.isTransient&&o!==null?String(o):qt(e,t)},getItemDataPath(e,t){let{dataPath:o}=this;return e!==this.schema&&(o=O(o,e.name)),t!=null&&(o=O(o,t)),o},getItemStore(e,t,o){return this.getChildStore(this.getItemUid(e,t),o)},removeItemStore(e,t,o){this.removeChildStore(this.getItemUid(e,t),o)},findItemIdIndex(e,t,o){const s=this.isTransient?o:t?.findIndex((i,a)=>this.getItemId(e,i,a)===o);return s!==-1?s:null},getItemLabel(e,t,{index:o=null,extended:s=!1,asObject:i=!1}={}){const{itemLabel:a}=e;if(!t||!s&&a===!1)return null;let r;const l=()=>r??=this.getItemDataPath(e,o);let d;const c=()=>d??=this.getLabel(je(e,t,this.context));let p,u,m;if(h.isFunction(a)){const g=a.call(this,new S(this,{nested:!1,data:t,value:t,index:o,get dataPath(){return l()},get formLabel(){return c()}}));h.isObject(g)?{text:p,prefix:u,suffix:m}=g:p=g,s=!1}else if(h.isString(a)&&!(a in t))p=a;else{const{columns:g}=e,k=h.isString(a)&&a||te(e)&&g&&Object.keys(g)[0]||"name";p=t[k]}const f=!!p;if(p==null&&(s=!0,p=te(e)&&o!==null?p=`${o+1}`:""),s){const g=c();g&&(p=`${g} ${f?`'${p}'`:p}`)}return i?p||u||m?{text:p,prefix:u,suffix:m}:null:p}}},fi={key:0,class:"dito-schema-header"};function gi(e,t,o,s,i,a){const r=n.resolveComponent("DitoPanels"),l=n.resolveComponent("DitoLabel"),d=n.resolveComponent("DitoTabs"),c=n.resolveComponent("DitoClipboard"),p=n.resolveComponent("DitoPane"),u=n.resolveComponent("TransitionHeight");return n.openBlock(),n.createElementBlock(n.Fragment,null,[n.renderSlot(e.$slots,"prepend"),n.createElementVNode("div",n.mergeProps({class:["dito-schema",{"dito-scroll-parent":e.scrollable,"dito-schema--open":e.opened}]},e.$attrs),[e.isPopulated&&e.panelEntries.length>0?(n.openBlock(),n.createBlock(n.Teleport,{key:0,to:".dito-sidebar__teleport"},[e.active?(n.openBlock(),n.createBlock(r,{key:0,panels:e.panelEntries,data:e.data,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["panels","data","meta","store","disabled"])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),e.hasHeader?(n.openBlock(),n.createBlock(n.Teleport,{key:1,to:e.headerTeleport,disabled:!e.headerTeleport},[e.active?(n.openBlock(),n.createElementBlock("div",fi,[e.hasLabel?(n.openBlock(),n.createBlock(l,{key:0,label:e.label,info:e.info,dataPath:e.dataPath,collapsible:e.collapsible,collapsed:!e.opened,onOpen:e.onOpen},null,8,["label","info","dataPath","collapsible","collapsed","onOpen"])):n.createCommentVNode("",!0),e.tabs?(n.openBlock(),n.createBlock(n.Transition,{key:1,name:"dito-fade"},{default:n.withCtx(()=>[e.opened?(n.openBlock(),n.createBlock(d,{key:0,modelValue:e.selectedTab,"onUpdate:modelValue":t[0]||(t[0]=m=>e.selectedTab=m),tabs:e.tabs},null,8,["modelValue","tabs"])):n.createCommentVNode("",!0)]),_:1})):n.createCommentVNode("",!0),e.clipboard?(n.openBlock(),n.createBlock(c,{key:2,clipboard:e.clipboard,schema:e.schema},null,8,["clipboard","schema"])):n.createCommentVNode("",!0),n.renderSlot(e.$slots,"edit-buttons")])):n.createCommentVNode("",!0)],8,["to","disabled"])):n.createCommentVNode("",!0),n.createVNode(u,{enabled:e.inlined},{default:n.withCtx(()=>[e.opened?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-schema-content",{"dito-scroll":e.scrollable}]),ref:"content"},[e.hasTabs?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.tabs,(m,f)=>n.withDirectives((n.openBlock(),n.createBlock(p,{key:f,class:"dito-pane__tab",ref_for:!0,ref:"tabs",tab:f,schema:m,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,padding:e.padding,single:e.single&&!e.inlined&&!e.hasMainPane,disabled:e.disabled,compact:e.compact,generateLabels:e.generateLabels,accumulatedBasis:e.accumulatedBasis},null,8,["tab","schema","dataPath","data","meta","store","padding","single","disabled","compact","generateLabels","accumulatedBasis"])),[[n.vShow,e.selectedTab===f]])),128)):n.createCommentVNode("",!0),e.hasMainPane?(n.openBlock(),n.createBlock(p,{key:1,class:"dito-pane__main",ref:"components",schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,padding:e.padding,single:e.single&&!e.inlined&&!e.hasTabs,disabled:e.disabled,compact:e.compact,generateLabels:e.generateLabels,accumulatedBasis:e.accumulatedBasis},null,8,["schema","dataPath","data","meta","store","padding","single","disabled","compact","generateLabels","accumulatedBasis"])):n.createCommentVNode("",!0),!e.inlined&&e.isPopulated?n.renderSlot(e.$slots,"buttons",{key:2}):n.createCommentVNode("",!0)],2)):n.createCommentVNode("",!0)]),_:3},8,["enabled"]),e.inlined&&!e.hasHeader?n.renderSlot(e.$slots,"edit-buttons",{key:2}):n.createCommentVNode("",!0)],16),n.renderSlot(e.$slots,"append")],64)}const bi=C.component("DitoSchema",{mixins:[L,be],components:{TransitionHeight:xs},inheritAttrs:!1,provide(){return{$schemaComponent:()=>this}},inject:["$schemaParentComponent"],props:{schema:{type:Object,required:!0},dataSchema:{type:Object,default:e=>e.schema},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},label:{type:[String,Object],default:null},info:{type:String,default:null},single:{type:Boolean,default:!1},padding:{type:String,default:null},active:{type:Boolean,default:!0},inlined:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},compact:{type:Boolean,default:!1},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},scrollable:{type:Boolean,default:!1},hasOwnData:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!1},labelNode:{type:HTMLElement,default:null},accumulatedBasis:{type:Number,default:1}},data(){const{data:e}=this.schema;return{...e&&h.isFunction(e)?e(this.context):e,selectedTab:null,componentsRegistry:{},panesRegistry:{},panelsRegistry:{},scrollPositions:{}}},computed:{nested(){return!1},schemaComponent(){return this},parentSchemaComponent(){return this.hasOwnData?null:this.parentComponent.schemaComponent},panelEntries(){return zt(this.schema.panels,this.dataPath)},tabs(){return G(this.schema.tabs)},defaultTab(){let e=null;if(this.tabs){const t=Object.values(this.tabs).filter(this.shouldRenderSchema);for(const{name:o,defaultTab:s}of t){if(h.isFunction(s)?s(this.context):s)return o;e??=o}}return e},routeTab(){return this.$route.hash?.slice(1)||null},clipboard(){return this.schema?.clipboard??null},hasHeader(){return this.hasLabel||this.hasTabs||!!this.clipboard},headerTeleport(){return this.isTopLevelSchema?".dito-header__teleport":this.labelNode},processedData(){return this.processData({target:"server",schemaOnly:!0})},clipboardData:{get(){return this.processData({target:"clipboard",schemaOnly:!0})},set(e){this.setData(e)}},clipboardItem(){return this.clipboardData},formLabel(){return this.getLabel(this.getItemFormSchema(this.sourceSchema,this.data,this.context))},isNested(){return Ae(this.schema)},isDirty(){return this.someComponent(e=>e.isDirty)},isTouched(){return this.someComponent(e=>e.isTouched)},isValid(){return this.everyComponent(e=>e.isValid)},isValidated(){return this.everyComponent(e=>e.isValidated)},hasErrors(){return this.someComponent(e=>e.hasErrors)},hasData(){return!!this.data},hasLabel(){return!!this.label||this.collapsible},hasTabs(){return!!this.tabs},isTopLevelSchema(){return!this.isNested&&!this.inlined},hasTopLevelTabs(){return this.hasTabs&&this.isTopLevelSchema},hasMainPane(){const{components:e}=this.schema;return!!e&&Object.keys(e).length>0},opened:Ne("opened",{default(){return!this.collapsed}}),components(){return Object.values(this.componentsRegistry)},panes(){return Object.values(this.panesRegistry)},panels(){return Object.values(this.panelsRegistry)},componentsByDataPath(){return this._listEntriesByDataPath(this.componentsRegistry)},panesByDataPath(){return this._listEntriesByDataPath(this.panesRegistry)},panelsByDataPath(){return this._listEntriesByDataPath(this.panelsRegistry)},wide:b("wide",{type:Boolean,default:!1})},watch:{schema:{immediate:!0,handler(e){Fo(e)||this.setupSchema()}},routeTab:{immediate:!0,flush:"post",handler(e){this.hasTopLevelTabs&&(this.selectedTab=e)}},selectedTab(e,t){if(this.scrollable){const{content:o}=this.$refs;this.scrollPositions[t]=o.scrollTop,this.$nextTick(()=>{o.scrollTop=this.scrollPositions[e]??0})}if(this.hasTopLevelTabs){const o=this.shouldRenderSchema(this.tabs[e])?e:this.defaultTab;this.$router.replace({query:this.$route.query,hash:o?`#${o}`:null})}this.hasErrors&&this.repositionErrors()}},created(){this._register(!0),this.scrollable&&this.wide&&(this.appState.pageClass="dito-page--wide")},mounted(){this.selectedTab=this.routeTab||this.defaultTab},unmounted(){this.emitEvent("destroy"),this._register(!1),this.scrollable&&this.wide&&(this.appState.pageClass=null)},methods:{setupSchema(){this.setupSchemaFields(),this.delegate("change",this.parentSchemaComponent),this.emitEvent("initialize")},getComponentsByDataPath(e){return this._getEntriesByDataPath(this.componentsByDataPath,e)},getComponentByDataPath(e){return this.getComponentsByDataPath(e)[0]||null},getComponentsByName(e){return this._getEntriesByName(this.componentsByDataPath,e)},getComponentByName(e){return this.getComponentsByName(e)[0]||null},getComponents(e){return this._getEntries(this.componentsByDataPath,e)},getComponent(e){return this.getComponents(e)[0]||null},getPanelsByDataPath(e){return this._getEntriesByDataPath(this.panelsByDataPath,e)},getPanelByDataPath(e){return this.getPanelsByDataPath(e)[0]||null},getPanels(e){return this._getEntries(this.panelsByDataPath,e)},getPanel(e){return this.getPanels(e)[0]||null},someComponent(e){return this.isPopulated&&this.components.some(e)},everyComponent(e){return this.isPopulated&&this.components.every(e)},onOpen(e){this.emitEvent("open",{context:{open:e}}),(!this.opened||e||this.validateAll())&&(this.opened=e)},onChange(){this.emitEvent("change")},resetValidation(){for(const e of this.components)e.resetValidation()},clearErrors(){for(const e of this.components)e.clearErrors()},repositionErrors(){const e=this.$refs.content.closest(".dito-scroll"),t=()=>e.dispatchEvent(new Event("scroll"));t(),setTimeout(t,0)},focus(){return this.opened=!0,this.parentSchemaComponent?.focus()},validateAll(e,t=!0){const{componentsByDataPath:o}=this;let s;if(e){const r=h.isFunction(e)?e:h.isRegExp(e)?l=>e.test(l):null;s=r?Object.keys(o).filter(r):h.isArray(e)?e:[e]}t&&this.clearErrors();let i=!0,a=!0;s||=Object.keys(o);for(const r of s){const l=this.getComponentsByDataPath(r);for(const d of l)d.validate(t)||(t&&a&&d.scrollIntoView(),a=!1,i=!1)}return t&&!i&&this.notifyErrors(),i},verifyAll(e){return this.validateAll(e,!1)},async showValidationErrors(e,t,o=!0){this.clearErrors();const s=[],i=o;for(const[a,r]of Object.entries(e)){const l=this.hasOwnData?O(this.dataPath,a):a,d=h.parseDataPath(l);let c=!1;const p=this.getComponentsByDataPath(d);for(const u of p)if(u.showValidationErrors(r,o&&t)){c=!0,o=!1;break}if(!c){const u=d.pop();for(;d.length>0;){const f=this.getComponentsByDataPath(d);for(const g of f)if(await g.navigateToComponent?.(l,V=>{let w=!1;for(const $ of V){const P=Object.fromEntries(Object.entries(e).filter(([N])=>h.normalizeDataPath(N).startsWith($.dataPath)));if(Object.keys(P).length>0&&$.showValidationErrors(P,o&&t)){w=!0,o=!1;break}}return w}))return;d.pop()}const m=h.labelize(u);for(const f of r){const g=m?`The field ${m}`:`The ${this.formLabel}`;s.push(`${g} ${f.message}`)}}o=!1}return i&&!o&&this.notifyErrors(s.join(`
2
+ `)),!o},notifyErrors(e){this.notify({type:"error",title:"Validation Errors",text:e||"Please correct the highlighted errors."})},resetData(){Object.assign(this.data,Lt(this.dataSchema,{},this)),this.clearErrors()},setData(e){for(const t in e)if(t in this.data&&!h.equals(this.data[t],e[t])){this.data[t]=e[t];for(const o of this.getComponentsByName(t))o.markDirty()}},filterData(e){const t={},o={};for(const[s,i]of Object.entries(e)){if((h.isArray(i)||h.isObject(i))&&this.getComponentsByName(s).some(r=>r.providesData)){o[s]=i;continue}t[s]=i}return{localData:t,foreignData:o}},processData({target:e="clipboard",schemaOnly:t=!0}={}){return jo(this.dataSchema,this.sourceSchema,this.data,this.dataPath,{rootData:this.rootData,component:this,schemaOnly:t,target:e})},_register(e){this.$schemaParentComponent()?._registerSchemaComponent(this,e)},_registerComponent(e,t){this._registerEntry(this.componentsRegistry,e,t),this.parentSchemaComponent?._registerComponent(e,t)},_registerPane(e,t){this._registerEntry(this.panesRegistry,e,t)},_registerPanel(e,t){this._registerEntry(this.panelsRegistry,e,t)},_registerEntry(e,t,o){const s=t.$uid;o?e[s]=t:delete e[s]},_listEntriesByDataPath(e){return Object.values(e).reduce((t,o)=>{const{dataPath:s}=o;return(t[s]||=[]).push(o),t},{})},_getEntries(e,t){return h.normalizeDataPath(t).startsWith(this.dataPath)?this._getEntriesByDataPath(e,t):this._getEntriesByName(e,t)},_getEntriesByDataPath(e,t){return e[h.normalizeDataPath(t)]||[]},_getEntriesByName(e,t){return e[O(this.dataPath,t)]||[]}}}),yi=y(bi,[["render",gi]]);function ki(e,t,o,s,i,a){const r=n.resolveComponent("DitoEditButtons"),l=n.resolveComponent("DitoSchema");return n.openBlock(),n.createBlock(l,{class:"dito-schema-inlined",schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,label:e.isCompact?null:e.label,info:e.info,padding:e.padding??"inlined",inlined:!0,disabled:e.disabled,compact:e.isCompact,collapsed:e.collapsed,collapsible:e.collapsible,generateLabels:!e.isCompact,labelNode:e.labelNode,accumulatedBasis:e.accumulatedBasis},{"edit-buttons":n.withCtx(()=>[e.deletable||e.draggable||e.editable?(n.openBlock(),n.createBlock(r,{key:0,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.disabled,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.editPath,onDelete:t[0]||(t[0]=d=>e.$emit("delete"))},null,8,["schema","dataPath","data","meta","store","disabled","deletable","draggable","editable","editPath"])):n.createCommentVNode("",!0)]),_:1},8,["schema","dataPath","data","meta","store","label","info","padding","disabled","compact","collapsed","collapsible","generateLabels","labelNode","accumulatedBasis"])}const Ci=C.component("DitoSchemaInlined",{emits:["delete"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},label:{type:[String,Object],default:null},info:{type:String,default:null},padding:{type:String,default:null},disabled:{type:Boolean,required:!0},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null},labelNode:{type:HTMLElement,default:null},accumulatedBasis:{type:Number,default:null}},computed:{isCompact(){return Et(this.schema)},hasLabel(){return!this.isCompact&&!!this.label}}}),$i=y(Ci,[["render",ki]]),Di={key:0,class:"dito-pane__break"},Bi={key:2,class:"dito-pane__break"};function wi(e,t,o,s,i,a){const r=n.resolveComponent("DitoContainer"),l=n.resolveDirective("resize");return e.isPopulated&&e.componentSchemas.length>0?n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-pane",e.classes])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.componentSchemas,({schema:d,dataPath:c,nestedDataPath:p,nested:u,store:m},f)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[["before","both"].includes(d.break)?(n.openBlock(),n.createElementBlock("span",Di)):n.createCommentVNode("",!0),e.shouldRenderSchema(d)?(n.openBlock(),n.createBlock(r,{ref_for:!0,ref:"containers",key:p,"data-index":f,schema:d,dataPath:c,data:e.data,meta:e.meta,store:m,single:e.isSingleComponent,nested:u,disabled:e.disabled,compact:e.compact,generateLabels:e.generateLabels,verticalLabels:e.isInLabeledRow(f),accumulatedBasis:e.accumulatedBasis},null,8,["data-index","schema","dataPath","data","meta","store","single","nested","disabled","compact","generateLabels","verticalLabels","accumulatedBasis"])):n.createCommentVNode("",!0),["after","both"].includes(d.break)?(n.openBlock(),n.createElementBlock("span",Bi)):n.createCommentVNode("",!0)],64))),256))],2)),[[l,e.onResizePane]]):n.createCommentVNode("",!0)}const Si=C.component("DitoPane",{mixins:[L],provide(){return{$tabComponent:()=>this.tabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0},tab:{type:String,default:null},single:{type:Boolean,default:!1},padding:{type:String,default:null},disabled:{type:Boolean,default:!1},compact:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!1},accumulatedBasis:{type:Number,default:null}},data(){return{positions:[]}},computed:{nested(){return!1},classes(){const e="dito-pane";return{[`${e}--single`]:this.isSingleComponent,[`${e}--padding-${this.padding}`]:!!this.padding}},tabComponent(){return this.tab?this:this.$tabComponent()},componentSchemas(){const e=this.sourceSchema?.wrapPrimitives;return Object.entries(this.schema?.components||{}).map(([t,o])=>{o={...o,name:t};const s=Ae(o),i=O(this.dataPath,t);return{schema:o,dataPath:s&&!e?i:this.dataPath,nestedDataPath:i,nested:s,store:this.getChildStore(t)}})},isSingleComponent(){return this.single&&this.componentSchemas.length===1},verticalLabelsByIndices(){const{positions:e}=this,t=r=>e[r]&&(r===e.length-1||o(r).top>e[r].top),o=r=>{for(let l=r+1;l<e.length;l++)if(e[l])return e[l];return 0},s=[];let i=[];for(let r=0;r<e.length;r++)i.push(r),t(r)&&(s.push(i),i=[]);i.length>0&&s.push(i);const a=[];for(const r of s){let l=!1;for(const d of r){const c=this.positions[d];if(c?.height>2&&(c.node.matches(":has(> .dito-label)")||c.node.closest(".dito-container").matches(".dito-container--label-vertical"))){l=!0;break}}for(const d of r)a[d]=l}return a}},watch:{"componentSchemas.length"(e){this.positions.length=e}},created(){this._register(!0)},unmounted(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPane(this,e)},focus(){if(this.tab)return this.$router.push({hash:`#${this.tab}`})},onResizePane(){this.$nextTick(()=>{for(const e of this.$refs.containers){const t=e.$el,o=+t.dataset.index,s=t.getBoundingClientRect(),i=getComputedStyle(t),a=parseFloat(i.padding),r=parseFloat(i.fontSize),l=s.height-2*a;this.positions[o]=l<=0?null:{top:s.y,height:l/r,node:t}}})},isInLabeledRow(e){return!!this.verticalLabelsByIndices[e]}}}),Vi=y(Si,[["render",wi]]);function Pi(e){const t=h.isString(e)&&e.match(/^\s*([+-]?\d+)\s*\/\s*([+-]?\d+)\s*$/);if(t){const[,o,s]=t;return parseFloat(o)/parseFloat(s)}else return parseFloat(e)}function Ei(e,t,o,s,i,a){const r=n.resolveComponent("DitoPanels"),l=n.resolveComponent("DitoLabel"),d=n.resolveComponent("DitoErrors");return n.withDirectives((n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-container",e.containerClasses]),style:n.normalizeStyle(e.containerStyles)},[e.isMounted&&e.panelEntries.length>0?(n.openBlock(),n.createBlock(n.Teleport,{key:0,to:".dito-sidebar__teleport"},[n.createVNode(r,{panels:e.panelEntries,data:e.data,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["panels","data","meta","store","disabled"])])):n.createCommentVNode("",!0),e.hasLabel?(n.openBlock(),n.createBlock(l,{key:1,class:n.normalizeClass(e.labelClasses),dataPath:e.labelDataPath,label:e.label,info:e.info},null,8,["class","dataPath","label","info"])):n.createCommentVNode("",!0),e.hasLabel&&e.isLabel?n.createCommentVNode("",!0):(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.typeComponent),{key:2,class:n.normalizeClass(["dito-component",e.componentClasses]),ref:"component",schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,width:e.width,label:e.label,single:e.single,nested:e.nested,accumulatedBasis:e.combinedBasis,onErrors:e.onErrors,"onUpdate:component":t[0]||(t[0]=c=>e.component=c)},null,40,["class","schema","dataPath","data","meta","store","width","label","single","nested","accumulatedBasis","onErrors"])),n.createVNode(d,{errors:e.errors},null,8,["errors"])],6)),[[n.vShow,e.componentVisible]])}const Ni=C.component("DitoContainer",{mixins:[ae,L],props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},disabled:{type:Boolean,required:!0},compact:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!1},verticalLabels:{type:Boolean,default:!1},accumulatedBasis:{type:Number,default:null}},data(){return{errors:null,component:null}},computed:{context(){return new S(this.component??this,{nested:this.nested})},name(){return this.schema.name},type(){return this.schema.type},typeComponent(){return ie(this.type)},isLabel(){return this.type==="label"},hasLabel(){return Io(this.schema,this.generateLabels)},label(){return this.hasLabel?this.getLabel(this.schema):null},labelDataPath(){return this.nested?this.dataPath:null},info:b("info",{type:String,default:null}),width:b("width",{type:[String,Number],default(){return this.typeComponent?.defaultWidth},get(e){return e===void 0?1:h.isString(e)?e.match(/^\s*[<>]?\s*(.*)$/)[1]:e}}),widthOperator:b("width",{type:String,get(e){return h.isString(e)&&e.match(/^\s*([<>]?)/)[1]||null}}),componentVisible:b("visible",{type:Boolean,default(){return this.typeComponent?.defaultVisible}}),componentDisabled:b("disabled",{type:Boolean,default:!1,get(e){return e||this.disabled}}),flexGrow(){return this.widthOperator===">"||this.width==="fill"},flexShrink(){return this.widthOperator==="<"},flexBasis(){const e=this.width;return[null,"auto","fill"].includes(e)?"auto":/%$/.test(e)?parseFloat(e)/100:/[a-z]/.test(e)?e:Pi(e)},combinedBasis(){const{accumulatedBasis:e,flexBasis:t}=this;return h.isNumber(e)&&h.isNumber(t)?e*t:null},containerClasses(){const{class:e}=this.schema,t="dito-container";return{[`${t}--disabled`]:this.componentDisabled,[`${t}--has-errors`]:!!this.errors,[`${t}--single`]:this.single,[`${t}--compact`]:this.compact,[`${t}--label-vertical`]:this.verticalLabels,[`${t}--omit-spacing`]:Mo(this.schema),...h.isString(e)?{[e]:!0}:e}},containerStyles(){const{flexBasis:e,combinedBasis:t}=this;return{"--grow":this.flexGrow?1:0,"--shrink":this.flexShrink?1:0,"--basis":h.isNumber(e)?`${e*100}%`:e,"--basis-mobile":h.isNumber(t)&&t<=.25?`${e*200}%`:null}},componentClasses(){return{"dito-component--single":this.single,...this.getLayoutClasses("dito-component")}},labelClasses(){return{"dito-label--visible":this.isLabel,...this.getLayoutClasses("dito-label")}},panelEntries(){return zo(this.api,this.schema,this.dataPath,this.$refs.component,this.tabComponent)}},methods:{getLayoutClasses(e){return{[`${e}--fill`]:this.width==="fill"||this.flexBasis!=="auto",[`${e}--grow`]:this.flexGrow,[`${e}--shrink`]:this.flexShrink}},onErrors(e){this.errors=e}}}),Oi=y(Ni,[["render",Ei]]),Ti={class:"dito-tabs"},Li=["onClick"];function Fi(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",Ti,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.tabs,(r,l)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRenderSchema(r)?(n.openBlock(),n.createElementBlock("a",{class:n.normalizeClass(["dito-tabs__link",{"dito-tabs__link--active":e.modelValue===l}]),key:l,onClick:d=>e.$emit("update:modelValue",l)},n.toDisplayString(e.getLabel(r,l)),11,Li)):n.createCommentVNode("",!0)],64))),256))])}const Ii=C.component("DitoTabs",{emits:["update:modelValue"],props:{tabs:{type:Object,default:null},modelValue:{type:String,default:null}}}),Mi=y(Ii,[["render",Fi]]);function Ri(e,t,o,s,i,a){const r=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema");return e.shouldRenderSchema(e.panelSchema)?n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.panelTag),{key:0,class:"dito-panel",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createVNode(l,{class:"dito-panel__schema",schema:e.panelSchema,dataSchema:e.panelDataSchema,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,padding:"nested",disabled:e.disabled,hasOwnData:e.hasOwnData,generateLabels:""},{prepend:n.withCtx(()=>[n.createElementVNode("h2",{class:n.normalizeClass(["dito-panel__header",{"dito-panel__header--sticky":e.sticky}])},[n.createElementVNode("span",null,n.toDisplayString(e.getLabel(e.schema)),1),n.createVNode(r,{class:"dito-buttons--small",buttons:e.panelButtonSchemas,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["buttons","dataPath","data","meta","store","disabled"])],2)]),buttons:n.withCtx(()=>[n.createVNode(r,{buttons:e.buttonSchemas,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataSchema","dataPath","data","meta","store","disabled","hasOwnData"])]),_:1},544)),[[n.vShow,e.visible&&(!e.panelTabComponent||e.panelTabComponent.visible)]]):n.createCommentVNode("",!0)}const ji=C.component("DitoPanel",{mixins:[L,vt],provide(){return{$panelComponent:()=>this,$tabComponent:()=>this.panelTabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0},panelTabComponent:{type:Object,default:null}},data(){return{ownData:null}},computed:{nested(){return!0},panelComponent(){return this},tabComponent(){return this.panelTabComponent},buttonSchemas(){return v(this.schema.buttons)},panelButtonSchemas(){return v(this.schema.panelButtons)},hasOwnData(){return!!this.ownData},panelData(){return this.ownData||this.data},panelSchema(){if(this.hasOwnData)return this.schema;{const{data:e,...t}=this.schema;return t}},panelTag(){return this.hasOwnData?"form":"div"},panelDataSchema(){return this.hasOwnData?this.schema:this.schemaComponent.schema},panelDataPath(){return this.hasOwnData?this.dataPath:this.schemaComponent.dataPath},visible:b("visible",{type:Boolean,default:!0}),sticky:b("sticky",{type:Boolean,default:!1})},created(){this._register(!0);const{data:e}=this.schema;e&&(this.ownData=h.isFunction(e)?e(this.context):e)},unmounted(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPanel(this,e)}}}),zi=y(ji,[["render",Ri]]),Ai={key:0,class:"dito-panels"};function qi(e,t,o,s,i,a){const r=n.resolveComponent("DitoPanel");return e.panels.length>0?(n.openBlock(),n.createElementBlock("div",Ai,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.panels,({schema:l,dataPath:d,tabComponent:c})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRenderSchema(l)?(n.openBlock(),n.createBlock(r,{key:e.getPanelKey(d,c),schema:l,dataPath:d,data:e.data,meta:e.meta,store:e.getChildStore(l.name),disabled:l.disabled??e.disabled,panelTabComponent:c},null,8,["schema","dataPath","data","meta","store","disabled","panelTabComponent"])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const Ui=C.component("DitoPanels",{mixins:[L],props:{panels:{type:Array,default:null},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0}},computed:{nested(){return!1}},methods:{getPanelKey(e,t){return t?`${t.tab}_${e}`:e}}}),Hi=y(Ui,[["render",qi]]),Wi={key:0,class:"dito-buttons"},Ki={key:0,class:"dito-container"};function Yi(e,t,o,s,i,a){const r=n.resolveComponent("DitoContainer"),l=n.resolveComponent("DitoVnode");return e.buttonSchemas||e.hasSlotContent(e.$slots.default)?(n.openBlock(),n.createElementBlock("div",Wi,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.buttonSchemas,(d,c)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRenderSchema(d)?(n.openBlock(),n.createBlock(r,{key:c,schema:d,dataPath:c,data:e.data,meta:e.meta,nested:e.nested,store:e.getChildStore(d.name),disabled:e.disabled},null,8,["schema","dataPath","data","meta","nested","store","disabled"])):n.createCommentVNode("",!0)],64))),256)),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.$slots.default?.(),d=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.hasVNodeContent(d)?(n.openBlock(),n.createElementBlock("div",Ki,[n.createVNode(l,{vnode:d},null,8,["vnode"])])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const Ji=C.component("DitoButtons",{mixins:[L],provide:{$tabComponent:()=>null},props:{buttons:{type:Object,default:null},dataPath:{type:String,default:""},data:{type:[Object,Array],default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},computed:{buttonSchemas(){const{dataPath:e,buttons:t}=this;return t?Object.values(t).reduce((o,s)=>(o[O(e,s.name)]=s,o),{}):null}},methods:{hasSlotContent:ne,hasVNodeContent:Wt}}),Gi=y(Ji,[["render",Yi]]),Qi=["disabled"];function Xi(e,t,o,s,i,a){const r=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoCreateButton"),d=n.resolveComponent("DitoButtons");return n.openBlock(),n.createBlock(d,{class:"dito-edit-buttons dito-buttons--round",buttons:e.buttons,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,nested:e.nested,onClick:t[1]||(t[1]=n.withModifiers(()=>{},["stop"]))},{default:n.withCtx(()=>[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:["dito-button",{"dito-button--disabled":e.isDraggableDisabled}]},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.editable?(n.openBlock(),n.createBlock(r,n.mergeProps({key:1,class:["dito-button",{"dito-button--disabled":e.isEditableDisabled}],to:e.editPath?{path:e.editPath}:{}},e.getButtonAttributes(e.verbs.edit)),null,16,["class","to"])):n.createCommentVNode("",!0),e.creatable?(n.openBlock(),n.createBlock(l,{key:2,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,nested:e.nested,path:e.createPath,verb:e.verbs.create,text:e.createButtonText,disabled:e.isCreatableDisabled},null,8,["schema","dataPath","data","meta","store","nested","path","verb","text","disabled"])):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:3,class:"dito-button",type:"button",disabled:e.isDeletableDisabled},e.getButtonAttributes(e.verbs.delete),{onClick:t[0]||(t[0]=c=>e.$emit("delete"))}),null,16,Qi)):n.createCommentVNode("",!0)]),_:1},8,["buttons","dataPath","data","meta","store","nested"])}const Zi=C.component("DitoEditButtons",{mixins:[L],emits:["delete"],props:{buttons:{type:Object,default:null},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0},nested:{type:Boolean,default:!1},disabled:{type:Boolean,required:!0},draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},creatable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null},createPath:{type:String,default:null}},computed:{formLabel(){return this.getLabel(this.schema.form)},isDraggableDisabled(){return this.disabled||!this.hasSchemaOption("draggable")},isDeletableDisabled(){return this.disabled||!this.hasSchemaOption("deletable")},isEditableDisabled(){return this.disabled||!this.editPath||!this.hasSchemaOption("editable")},isCreatableDisabled(){return this.disabled||!this.createPath||!this.hasSchemaOption("creatable")},createButtonText(){return this.schema.creatable?.label||this.formLabel&&`${h.capitalize(this.verbs.create)} ${this.formLabel}`||null}},methods:{hasSchemaOption(e){return this.getSchemaValue(e,{type:Boolean,default:!0})}}}),_i=y(Zi,[["render",Xi]]),xi={class:"dito-create-button"},vi=["type","disabled"],er=["disabled"],tr=["onMousedown","onMouseup"];function nr(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",xi,[e.creatableForm?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:0,class:"dito-button",type:e.isInlined?"button":"submit",disabled:e.disabled},e.getButtonAttributes(e.verb),{onClick:t[0]||(t[0]=r=>e.createItem(e.creatableForm))}),n.toDisplayString(e.text),17,vi)):e.creatableForms?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("button",n.mergeProps({class:"dito-button",type:"button",disabled:e.disabled},e.getButtonAttributes(e.verb),{onMousedown:t[1]||(t[1]=n.withModifiers(r=>e.onPulldownMouseDown(),["stop"]))}),n.toDisplayString(e.text),17,er),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-pulldown--open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.creatableForms,(r,l)=>n.withDirectives((n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("a",{class:n.normalizeClass(["dito-pulldown__item",{"dito-pulldown__item--disabled":e.shouldDisableSchema(r)}]),onMousedown:n.withModifiers(d=>e.onPulldownMouseDown(l),["stop"]),onMouseup:d=>e.onPulldownMouseUp(l)},n.toDisplayString(e.getLabel(r)),43,tr)],512)),[[n.vShow,e.shouldShowSchema(r)]])),256))],2)],64)):n.createCommentVNode("",!0)])}const or=C.component("DitoCreateButton",{mixins:[L,an],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0},nested:{type:Boolean,default:!1},path:{type:String,required:!0},verb:{type:String,required:!0},text:{type:String,default:null},disabled:{type:Boolean,required:!0}},computed:{forms(){return Y(this.schema,this.context)},creatableForms(){const e=Object.entries(this.forms).filter(([,t])=>this.isFormCreatable(t));return e.length>0?Object.fromEntries(e):null},creatableForm(){const e=this.creatableForms;return e&&Object.keys(e).length===1&&e.default||null},isInlined(){return ze(this.schema)}},methods:{isFormCreatable(e){return this.shouldRenderSchema(e)&&this.getSchemaValue("creatable",{type:Boolean,default:!0,schema:e})},createItem(e,t=null){if(this.shouldDisableSchema(e))throw new Error("Not allowed to create item for given form");if(this.isInlined)this.sourceComponent.createItem(e,t);else{const{creatable:o}=this.schema,s={...t&&{type:t},...o?.query?.(this.context)};this.$router.push({path:`${this.path}/create`,query:s})}},onPulldownSelect(e){this.createItem(this.forms[e],e),this.setPulldownOpen(!1)}}}),sr=y(or,[["render",nr]]),ar={key:0,class:"dito-clipboard dito-buttons dito-buttons--round"},ir=["disabled"],rr=["disabled"];function lr(e,t,o,s,i,a){return e.clipboard?(n.openBlock(),n.createElementBlock("div",ar,[n.createElementVNode("button",{class:"dito-button dito-button--copy",ref:"copyData",type:"button",title:"Copy Data",disabled:!e.copyEnabled,onClick:t[0]||(t[0]=(...r)=>e.onCopy&&e.onCopy(...r))},null,8,ir),n.createElementVNode("button",{class:"dito-button dito-button--paste",type:"button",title:"Paste Data",disabled:!e.pasteEnabled,onClick:t[1]||(t[1]=(...r)=>e.onPaste&&e.onPaste(...r))},null,8,rr)])):n.createCommentVNode("",!0)}const dr=C.component("DitoClipboard",{mixins:[H],props:{clipboard:{type:[Boolean,Object],required:!0},schema:{type:Object,required:!0}},data(){return{copyEnabled:!1,pasteEnabled:!1}},computed:{clipboardOptions(){return h.isObject(this.clipboard)?this.clipboard:{}},copyData(){const{copy:e}=this.clipboardOptions;return e?t=>e.call(this,new S(this,{clipboardData:t})):t=>h.clone(t)},pasteData(){const{paste:e}=this.clipboardOptions;return e?t=>e.call(this,new S(this,{clipboardData:t})):t=>t}},watch:{"parentComponent.hasData":{immediate:!0,handler:"updateCopy"},"appState.clipboardData":{immediate:!0,handler:"updatePaste"}},mounted(){this.domOn(document,{copy:this.updatePaste}),this.domOn(window,{focus:this.updatePaste})},methods:{checkClipboardData(e){const{$schema:t,...o}=e||{};return t===this.schema.name?o:null},async getClipboardData(e){let{clipboardData:t}=this.appState;try{const o=await navigator.clipboard?.readText?.();o&&(t=JSON.parse(o))}catch(o){e&&(console.error(o,o.name,o.message),o.name==="SyntaxError"&&alert(h.deindent`
3
+ The data in the clipboard appears to be malformed:
4
+ ${o.message}
5
+ `))}return this.checkClipboardData(t)},updateCopy(){this.copyEnabled=this.parentComponent.hasData},async updatePaste(){if(this.pasteEnabled=!!this.checkClipboardData(this.appState.clipboardData),!this.pasteEnabled&&this.appState.agent.chrome){const e=await this.getClipboardData(!1);this.pasteEnabled=!!e}},async onCopy(){let e=this.parentComponent.clipboardData;try{e&&(e={$schema:this.schema.name,...this.copyData(e)}),this.appState.clipboardData=e,this.pasteEnabled=!0;try{const t=JSON.stringify(e,null,2);await navigator.clipboard?.writeText?.(t)}catch(t){console.error(t,t.name,t.message)}}catch(t){console.error(t),alert(t.message)}},async onPaste(){let e=await this.getClipboardData(!0);try{e=e&&this.pasteData(e),e&&(this.parentComponent.clipboardData=e)}catch(t){console.error(t),alert(t.message)}}}}),cr=y(dr,[["render",lr]]),dn={data(){return{isLoading:!1}},methods:{setLoading(e,{updateRoot:t=!1,updateView:o=!1}={}){!this.isLoading^!e&&(this.isLoading=!!e,t&&this.rootComponent.registerLoading(e),o&&this.viewComponent.setLoading(this.isLoading))}}},Ze={mixins:[be,dn],provide(){return{$resourceComponent:()=>this,$verbs:()=>this.verbs,$isPopulated:()=>this.hasData}},data(){return{loadedData:null,abortController:null}},computed:{resourceComponent(){return this},resource(){return this.getResource()},providesData(){return!!this.resource},linksToView(){return!1},isTransient(){const e=this.formComponent;return!this.providesData&&!this.linksToView||e&&(e.isTransient||e.isCreating)},transientNote(){return this.isTransient&&"<b>Note</b>: the parent still needs to be saved in order to persist this change."},shouldLoad(){return!this.isTransient&&!this.isLoading},hasData(){return!!this.loadedData},verbs(){return this.getVerbs()},paginationRange(){const{paginate:e}=this.sourceSchema;if(this.isListSource&&e){const{page:t=0}=this.query||{},o=t*e;return[o,o+e-1]}return null},queryParams(){const e=this.paginationRange,{page:t,...o}=this.query||{};return{...o,...e&&{range:e.join(",")}}}},created(){(this.providesData||this.isCreating)&&this.setupData()},methods:{getResource({method:e="get",child:t}={}){const o=this.sourceSchema?.resource;return F(o,{type:"collection",method:e,parent:this.parentResourceComponent?.getResource({method:e,child:o})??null,child:t})},getVerbs(){const e=this.$verbs();return this.isTransient?{...e,create:"add",created:"added",save:"apply",saved:"applied",delete:"remove",deleted:"removed"}:e},clearData(){this.loadedData=null},setData(e){this.loadedData=e},setupData(){this.ensureData()},ensureData(){this.shouldLoad&&(this.hasData?this.reloadData():this.loadData(!0))},reloadData(){this.loadData(!1)},loadData(e){this.isTransient||(e&&this.clearData(),this.requestData())},createData(e,t){return Lt(e,t?{type:t}:{},this)},requestData(){const e=this.queryParams;this.handleRequest({method:"get",query:e},(t,o)=>{if(t){if(o){const{data:s}=o;if(s?.type==="FilterValidation"&&this.onFilterErrors?.(s.errors))return!0;if(this.isUnauthorizedError(o))return!0}}else this.setData(o.data),this.emitSchemaEvent("load")})},isValidationError(e){return e?.status===400},isUnauthorizedError(e){return e?.status===401},async handleRequest({method:e,resource:t=this.getResource({method:e}),query:o,data:s},i){const a={updateRoot:!0,updateView:this.isInView};this.abortController?.abort();const r=new AbortController;this.abortController=r;const{signal:l}=r;e=t.method||e;const d={method:e,resource:t,query:o,data:s,signal:l};this.setLoading(!0,a);try{const c=await this.sendRequest(d);i(null,c)}catch(c){if(c.name!=="AbortError"){const{response:p}=c;if(!i(c,p)){const u=p?.data,m=h.isString(u?.type)?h.labelize(u.type):"Error",f=u?.message??c;this.notify({type:"error",error:c,title:m,text:f})}}}this.abortController===r&&(this.abortController=null,this.setLoading(!1,a))},getPayloadData(e,t){return["post","put","patch"].includes(t)&&(e.getSchemaValue(["resource","data"])||e.processedItem)},async submit(e){let{resource:t}=e.schema;if(t=F(t,{parent:this.getResource({method:t?.method,child:t})}),t){const{method:o}=t,s=this.getPayloadData(e,o);return this.submitResource(e,t,o,s)}return!1},async submitResource(e,t,o,s,{setData:i=!1,onSuccess:a,onError:r,notifySuccess:l=()=>this.notify({type:"success",title:"Request Successful",text:"Request was successfully sent."}),notifyError:d=c=>this.notify({type:"error",error:c,title:"Request Error",text:[`Unable to send request${c?":":""}`,c?.message||c]})}={}){return new Promise(c=>{this.handleRequest({method:o,resource:t,data:s},async(p,u)=>{const m=u?.data;if(p){const f=this.isValidationError(u)&&m.errors;if(f)await this.showValidationErrors(f,!0);else{const g=h.isObject(m)?m:p;r?.(g),await this.emitButtonEvent(e,"error",{notify:d,error:g})}c(!1)}else{if(i&&m){const{foreignData:f}=this.mainSchemaComponent.filterData(this.data),g=this.parentRouteComponent?.routeRecord?.meta;g&&(g.reload=!0),this.setData(h.assignDeeply({},f,m))}a?.(),await this.emitButtonEvent(e,"success",{notify:l}),c(!0)}})})},async emitButtonEvent(e,t,{notify:o,error:s}){const i=new S(e,{nested:!1,data:this.data,itemLabel:this.itemLabel,error:s}),a=await e.emitEvent(t,{context:i});return o&&a===void 0&&!i.wasNotified&&o(s),a}}};function hr(e){return new URL(`file:${e}`).pathname}const pr=["data-resource"],ur={type:"submit",disabled:""};function mr(e,t,o,s,i,a){const r=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoButtons"),d=n.resolveComponent("DitoSchema"),c=n.resolveComponent("DitoFormInner");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-form dito-scroll-parent",{"dito-form-nested":e.isNestedRoute}]),"data-resource":e.sourceSchema.path},[!e.isLastUnnestedRoute&&!e.isNestedRoute?n.withDirectives((n.openBlock(),n.createBlock(r,{key:0},null,512)),[[n.vShow,!e.isActiveRoute]]):n.createCommentVNode("",!0),n.withDirectives(n.createVNode(c,{nested:e.isNestedRoute},{default:n.withCtx(()=>[n.withDirectives(n.createElementVNode("button",ur,null,512),[[n.vShow,!1]]),n.createVNode(d,{schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,padding:e.isNestedRoute?"nested":"root",active:e.isActiveRoute,disabled:e.isLoading,scrollable:!e.isNestedRoute,generateLabels:""},{buttons:n.withCtx(()=>[n.createVNode(l,{class:n.normalizeClass(["dito-buttons--round dito-buttons--large dito-buttons--main",{"dito-buttons--sticky":!e.isNestedRoute}]),buttons:e.buttonSchemas,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading},null,8,["class","buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","padding","active","disabled","scrollable"])]),_:1},8,["nested"]),[[n.vShow,e.isActiveRoute]])],10,pr)}const fr=C.component("DitoForm",{mixins:[en,Ze],data(){return{createdData:null,clonedData:void 0,sourceKey:null,isForm:!0}},computed:{verbs(){const e=this.getVerbs(),{isCreating:t,providesData:o}=this;return{...e,submit:t?e.create:e.save,submitted:t?e.created:e.saved,cancel:o?e.cancel:e.close,cancelled:o?e.cancelled:e.closed}},schema(){return this.getItemFormSchema(this.sourceSchema,this.data||(this.creationType?{type:this.creationType}:null),this.context)},buttonSchemas(){return v(h.assignDeeply({cancel:{type:"button",events:{click:()=>this.cancel()}},submit:!this.isMutating&&{type:"submit",closeForm:!0,events:{click:({component:e})=>e.submit()}}},this.schema.buttons))},isActiveRoute(){return this.isLastRoute||this.isLastUnnestedRoute},isTransient(){return!this.providesData},isCreating(){return this.param==="create"},isDirty(){return!this.isMutating&&!!this.mainSchemaComponent?.isDirty},isMutating(){return!!this.sourceSchema.mutate},selectedTab(){return this.mainSchemaComponent?.selectedTab||null},creationType(){return this.$route.query.type},itemId(){return this.isCreating?null:this.param??null},method(){return this.isCreating?"post":"patch"},breadcrumbPrefix(){return h.capitalize(this.isCreating?this.verbs.create:this.verbs.edit)},data(){return this.createdData||this.loadedData||this.inheritedData||null},dataPath(){return this.getDataPathFrom(this.dataComponent)},sourceData(){let e=this.routeRecord?this.parentRouteComponent.data:null;if(e){const t=h.parseDataPath(this.getDataPathFrom(this.parentRouteComponent)),o=this.routeRecord.path.split("/"),s=o.slice(o.length-t.length);this.sourceKey=null;const i=t[t.length-1];ee(this.sourceSchema)&&i==="create"&&t.length--;for(let a=0,r=t.length;a<r&&e;a++){const l=t[a],d=/^:id/.test(s[a])?l==="create"?null:this.findItemIdIndex(this.sourceSchema,e,l):l;a===r-1?this.sourceKey=d:e=e[d]}}return e},inheritedData(){if(this.isTransient&&this.clonedData===void 0&&this.sourceData&&this.sourceKey!==null){let e=this.sourceData[this.sourceKey];return this.isMutating||(this.clonedData=e=h.clone(e)),e===null&&!this.isCreating&&ee(this.sourceSchema)&&this.$router.push({path:`${this.path}/create`}),e}return this.clonedData},hasData(){return!!this.data},itemLabel(){return this.getItemLabel(this.sourceSchema,this.data,{extended:!0})}},watch:{$route:{flush:"post",handler(e,t){const o=this.meta?.param;o&&this.providesData&&t.matched[0].path===e.matched[0].path&&t.params[o]!=="create"&&e.params[o]!==t.params[o]&&this.loadData(!0)}},sourceData:"clearClonedData",create:"setupData"},methods:{emitSchemaEvent(e,t){return this.mainSchemaComponent?.emitEvent(e,t)},getDataPathFrom(e){return this.api.denormalizePath(this.path.slice((e.isView?0:e.path.length)+1))},getResource(e){const t=Ze.methods.getResource.call(this,e);return We(this.itemId,t)||t},setupData(){this.isCreating?this.createdData||=this.createData(this.schema,this.creationType):this.ensureData()},setSourceData(e){if(this.sourceData&&this.sourceKey!==null){const{mainSchemaComponent:t}=this;return this.sourceData[this.sourceKey]=t.filterData(e).localData,t.onChange(),!0}return!1},addSourceData(e){return ee(this.sourceSchema)?this.setSourceData(e):!!this.sourceData?.push(e)},clearData(){this.setData(null)},setData(e){this.isTransient?this.setSourceData(e):(this.createdData=null,this.loadedData=e)},clearClonedData(e,t){e!==t&&(this.clonedData=void 0)},async cancel(){return this.close()},async close(){return this.navigate(this.parentRouteComponent.path)},getSubmitVerb(e=!0){return this.isCreating?e?"create":"created":e?"submit":"submitted"},async submit(e,{validate:t=!0,closeForm:o=!1}={}){if(t&&!this.validateAll())return!1;const s=c=>this.verbs[this.getSubmitVerb(c)];let{method:i}=this,a=this.getResource({method:i});const r=F(e.schema.resource,{parent:a});a=r||a,i=a?.method||i;const l=this.getPayloadData(e,i);let d;if(!r&&this.isTransient?d=await this.submitTransient(e,a,i,l,{onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:c=>this.emitSchemaEvent("error",{context:{error:c}}),notifySuccess:()=>{const c=s(!1);this.notify({type:"info",title:this.isCreating?`Item ${h.capitalize(c)}`:`Change ${h.capitalize(c)}`,text:[this.isCreating?`${this.itemLabel} was ${c}.`:`Changes to ${this.itemLabel} were ${c}.`,this.transientNote]})},notifyError:c=>{const p=s(!0);this.notify({type:"error",error:c,title:"Request Error",text:`Unable to ${p} ${this.itemLabel}.`})}}):d=await this.submitResource(e,a,i,l,{setData:!0,onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:c=>this.emitSchemaEvent("error",{context:{error:c}}),notifySuccess:()=>{const c=s(!1);this.notify({type:"success",title:`Successfully ${h.capitalize(c)}`,text:`${this.itemLabel} was ${c}.`})},notifyError:c=>{const p=s(!0);this.notify({type:"error",error:c,title:"Request Error",text:[`Unable to ${p} ${this.itemLabel}${c?":":""}`,c?.message||c]})}}),d){if(this.resetValidation(),o||e.closeForm)this.close();else if(this.isCreating){const c=this.getItemId(this.schema,this.data);this.$router.replace({path:hr(`${this.path}/../${c}`),hash:this.$route.hash})}}return d},async submitTransient(e,t,o,s,{onSuccess:i,onError:a,notifySuccess:r,notifyError:l}){const d=this.isCreating?this.addSourceData(s):this.setSourceData(s);if(d)i?.(),await this.emitButtonEvent(e,"success",{notify:r});else{const c="Could not submit transient item";a?.(c),await this.emitButtonEvent(e,"error",{notify:l,error:c})}return d}}}),cn=y(fr,[["render",mr]]),gr={key:0};function br(e,t,o,s,i,a){return e.nested?(n.openBlock(),n.createElementBlock("div",gr,[n.renderSlot(e.$slots,"default")])):(n.openBlock(),n.createElementBlock("form",{key:1,class:"dito-scroll-parent",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},[n.renderSlot(e.$slots,"default")],32))}const yr=C.component("DitoFormInner",{props:{nested:{type:Boolean,default:!1}}}),kr=y(yr,[["render",br]]),Cr=C.component("DitoFormNested",{extends:cn}),$r={key:0,class:"dito-errors"};function Dr(e,t,o,s,i,a){return e.errors?(n.openBlock(),n.createElementBlock("div",$r,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.errors,r=>(n.openBlock(),n.createElementBlock("li",null,n.toDisplayString(r),1))),256))])])):n.createCommentVNode("",!0)}const Br=C.component("DitoErrors",{props:{errors:{type:Array,default:null}},data(){return{tip:null}},watch:{errors(){this.$nextTick(this.updateErrors)}},unmounted(){this.tip?.destroy()},methods:{updateErrors(){let{tip:e}=this;e?.hide(),this.errors&&(e=this.tip??=n.markRaw(tt(this.$el.closest(".dito-container"))),e.setProps({content:this.errors.join(`
6
+ `),theme:"error",trigger:"manual",appendTo:"parent",placement:"bottom-start",animation:"shift-away-subtle",popperOptions:{modifiers:[{name:"flip",enabled:!1}]},interactive:!0,hideOnClick:!1,offset:[3,3],zIndex:1}),e.popper.addEventListener("mousedown",()=>e.hide()),e.show())}}}),wr=y(Br,[["render",Dr]]),Sr={class:"dito-scopes"},Vr=["title","onClick"];function Pr(e,t,o,s,i,a){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",Sr,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.scopes,(l,d)=>(n.openBlock(),n.createBlock(r,{key:d,to:e.getScopeLink(l),custom:""},{default:n.withCtx(({navigate:c})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",{"dito-button--selected":l.name===e.query.scope}]),type:"button",title:l.hint||e.getLabel(l),onClick:c},n.toDisplayString(e.getLabel(l)),11,Vr)]),_:2},1032,["to"]))),128))])}const Er=C.component("DitoScopes",{props:{query:{type:Object,required:!0},scopes:{type:Object,required:!0}},methods:{getScopeLink(e){const t={...this.query,scope:e.name};return t.page&&(t.page=0),this.getQueryLink(t)}}}),Nr=y(Er,[["render",Pr]]);function Or(e,t,o,s,i,a){const r=n.resolveComponent("Pagination");return n.openBlock(),n.createBlock(r,{page:e.page,"onUpdate:page":t[0]||(t[0]=l=>e.page=l),pageSize:e.limit,total:e.total},null,8,["page","pageSize","total"])}const Tr=C.component("DitoPagination",{components:{Pagination:Js},props:{query:{type:Object,required:!0},limit:{type:Number,required:!0},total:{type:Number,required:!0}},computed:{page:{get(){return(+this.query.page||0)+1},set(e){this.page!==e&&this.$router.push(this.getQueryLink({...this.query,page:e-1}))}}}}),Lr=y(Tr,[["render",Or]]),ye={data(){return{isDragging:!1}},methods:{getDraggableOptions(e=!1){const t="dito-draggable";return{animation:150,handle:".dito-button--drag",dragClass:`${t}__drag`,chosenClass:`${t}__chosen`,ghostClass:`${t}__ghost`,fallbackClass:`${t}__fallback`,forceFallback:e,onStart:this.onStartDrag,onEnd:this.onEndDrag}},onStartDrag(){this.isDragging=!0},onEndDrag({oldIndex:e,newIndex:t}){this.isDragging=!1,e!==t&&this.onChange()},updateOrder(e,t,o){const{orderKey:s}=e;if(s){const i=o?.[0]||0;for(let a=0;a<t.length;a++)t[a][s]=a+i}return t}}},Fr=["id","data-path"],Ir={key:0,class:"dito-tree-header"},Mr=["innerHTML"],Rr={key:1,class:"dito-tree-info"},jr={key:1,class:"dito-tree-leaf"},zr=["innerHTML"],Ar={key:2,class:"dito-buttons dito-buttons--small"},qr={key:1,class:"dito-properties"};function Ur(e,t,o,s,i,a){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTableCell"),d=n.resolveComponent("DitoTreeItem",!0),c=n.resolveComponent("DitoDraggable");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-tree-item",{"dito-tree-item--dragging":e.isDragging,"dito-tree-item--active":e.active}]),id:e.dataPath,style:n.normalizeStyle(e.level>0&&{"--level":e.level}),"data-path":e.path},[e.label?(n.openBlock(),n.createElementBlock("div",Ir,[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-tree-branch",onClick:t[0]||(t[0]=n.withModifiers(p=>e.opened=!e.opened,["stop"]))},[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-chevron--open":e.opened}])},null,2)):n.createCommentVNode("",!0),n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,Mr),e.details?(n.openBlock(),n.createElementBlock("div",Rr,n.toDisplayString(e.details),1)):n.createCommentVNode("",!0)])):(n.openBlock(),n.createElementBlock("div",jr,[n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,zr)])),e.hasEditButtons?(n.openBlock(),n.createElementBlock("div",Ar,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.editable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.edit),{onClick:t[1]||(t[1]=(...p)=>e.onEdit&&e.onEdit(...p))}),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:2,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[2]||(t[2]=(...p)=>e.onDelete&&e.onDelete(...p))}),null,16)):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),e.properties?n.withDirectives((n.openBlock(),n.createElementBlock("table",qr,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.properties,p=>(n.openBlock(),n.createElementBlock("tr",null,[n.createElementVNode("td",null,[p.label!==!1?(n.openBlock(),n.createBlock(r,{key:0,dataPath:e.getPropertyDataPath(p),label:e.getLabel(p)},null,8,["dataPath","label"])):n.createCommentVNode("",!0)]),n.createVNode(l,{cell:p,schema:p,dataPath:e.getPropertyDataPath(p),data:e.data,meta:e.nestedMeta,store:e.store,disabled:e.disabled},null,8,["cell","schema","dataPath","data","meta","store","disabled"])]))),256))],512)),[[n.vShow,e.opened]]):n.createCommentVNode("",!0),e.childrenSchema?n.withDirectives((n.openBlock(),n.createBlock(c,{key:2,options:e.getDraggableOptions(!0),draggable:e.childrenDraggable,modelValue:e.updateOrder(e.childrenSchema,e.childrenList),"onUpdate:modelValue":t[3]||(t[3]=p=>e.childrenList=p)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.childrenItems,(p,u)=>(n.openBlock(),n.createBlock(d,{key:e.getItemUid(e.childrenSchema,p.data),schema:e.childrenSchema,dataPath:e.getItemDataPath(e.childrenSchema,u),data:p.data,path:p.path,open:p.open,active:p.active,draggable:e.childrenDraggable,label:e.getItemLabel(e.childrenSchema,p.data,{index:u}),level:e.level+1},null,8,["schema","dataPath","data","path","open","active","draggable","label","level"]))),128))]),_:1},8,["options","draggable","modelValue"])),[[n.vShow,e.opened]]):n.createCommentVNode("",!0)],14,Fr)}const Hr=C.component("DitoTreeItem",{mixins:[be,ye],emits:["update:data"],inject:["container"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Array,Object],default:null},path:{type:String,default:""},open:{type:Boolean,default:!1},active:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},label:{type:String,default:null},level:{type:Number,default:0}},data(){return{opened:this.open||this.schema.open}},computed:{meta(){return this.container.meta},store(){return this.container.store},disabled(){return this.container.disabled},nestedMeta(){return{...this.meta,schema:this.schema}},properties(){return G(this.schema.properties)},childrenSchema(){return this.schema.children},childrenList:{get(){const e=this.childrenSchema?.name;return e&&this.data[e]},set(e){const t=this.childrenSchema?.name;t&&(this.updateOrder(this.childrenSchema,e),this.data[t]=e,this.$emit("update:data",e))}},childrenDraggable(){return this.childrenList?.length>1&&this.getSchemaValue("draggable",{type:Boolean,default:!1,schema:this.childrenSchema})},numChildren(){return this.childrenList?.length||0},numProperties(){return this.properties?.length||0},numEntries(){return this.numProperties+this.numChildren},childrenItems(){const{childrenSchema:e,childrenList:t}=this;if(e&&t){const{editPath:o}=this.container,s=!this.path&&e.open;return t.map((i,a)=>{const r=e.path&&`${this.path}/${e.path}/${a}`,l=s||o.startsWith(r)&&r.length<o.length;return{data:i,path:r,open:l,active:o===r}})}return[]},details(){const{numChildren:e}=this;return e&&`${e} ${e===1?"item":"items"}`},hasEditButtons(){return this.draggable||this.editable||this.deletable},creatable:b("creatable",{type:Boolean,default:!1,get(e){return e&&q(this.schema)}}),editable:b("editable",{type:Boolean,default:!1,get(e){return e&&q(this.schema)}}),deletable:b("deletable",{type:Boolean,default:!1})},methods:{getPropertyDataPath(e){return O(this.dataPath,e.name)},editPath(e){this.$router.push({path:`${this.container.path}${e}`,query:this.$route.query})},onEdit(){this.editPath(this.path)},onDelete(){},onChange(){this.container.onChange()},onEndDrag(e){ye.methods.onEndDrag.call(this,e);const{item:t}=e;t.classList.contains("dito-tree-item--active")&&this.$nextTick(()=>{this.editPath(e.item.dataset.path)})}}}),Wr=y(Hr,[["render",Ur]]),Kr={class:"dito-table-head"},Yr=["onClick"],Jr={key:1},Gr={key:0};function Qr(e,t,o,s,i,a){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("thead",Kr,[n.createElementVNode("tr",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.columns,l=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRenderSchema(l)?(n.openBlock(),n.createElementBlock("th",{key:0,class:n.normalizeClass(e.getColumnClass(l))},[l.sortable?(n.openBlock(),n.createBlock(r,{key:0,to:e.getSortLink(l),custom:""},{default:n.withCtx(({navigate:d})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",e.getSortClass(l)]),type:"button",onClick:d},[t[0]||(t[0]=n.createElementVNode("div",{class:"dito-button__order-arrows"},null,-1)),n.createElementVNode("span",null,n.toDisplayString(e.getLabel(l)),1)],10,Yr)]),_:2},1032,["to"])):(n.openBlock(),n.createElementBlock("span",Jr,n.toDisplayString(e.getLabel(l)),1))],2)):n.createCommentVNode("",!0)],64))),256)),e.hasEditButtons?(n.openBlock(),n.createElementBlock("th",Gr,[...t[1]||(t[1]=[n.createElementVNode("span",null,null,-1)])])):n.createCommentVNode("",!0)])])}const Xr=C.component("DitoTableHead",{props:{query:{type:Object,required:!0},columns:{type:Object,required:!0},hasEditButtons:{type:Boolean,required:!0}},computed:{sort(){const e=(this.query.order||"").split(/\s+/);return{name:e[0],order:e[1]}}},methods:{getColumnClass(e){return`dito-column--${h.hyphenate(e.name)}`},getSortClass(e){return this.sort.name===e.name?`dito-button--selected dito-button--order-${this.sort.order}`:null},getSortLink(e){const t=this.sort.name===e.name&&this.sort.order==="asc"?"desc":"asc";return this.getQueryLink({...this.query,order:`${e.name} ${t}`})}}}),Zr=y(Xr,[["render",Qr]]),_r=["innerHTML"];function xr(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("td",{class:n.normalizeClass(e.cell.class),style:n.normalizeStyle(e.cell.style)},[e.cell.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.cell.component),{key:0,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,nested:e.nested,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","nested","disabled"])):(n.openBlock(),n.createElementBlock("span",{key:1,innerHTML:e.renderCell(e.data)},null,8,_r))],6)}const vr=C.component("DitoTableCell",{mixins:[L],props:{cell:{type:Object,required:!0},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},methods:{renderCell(e){const{name:t,render:o}=this.cell,s=e[t];return o?o.call(this,new S(this,{name:t,value:s,data:e,dataPath:O(this.dataPath,t)})):h.escapeHtml(s)}}}),el=y(vr,[["render",xr]]),tl={class:"dito-upload-file"},nl={class:"dito-thumbnail__inner"},ol=["src"],sl={key:1,class:"dito-thumbnail__type"};function al(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",tl,[e.thumbnail?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-thumbnail",`dito-thumbnail--${e.thumbnail}`])},[n.createElementVNode("div",nl,[e.source?(n.openBlock(),n.createElementBlock("img",{key:0,src:e.source,crossorigin:"anonymous"},null,8,ol)):(n.openBlock(),n.createElementBlock("div",sl,[n.createElementVNode("span",null,n.toDisplayString(e.type),1)]))])],2)):n.createCommentVNode("",!0),n.createElementVNode("span",null,n.toDisplayString(e.file.name),1)])}const il=C.component("DitoUploadFile",{props:{file:{type:Object,required:!0},thumbnail:{type:String,default:null},thumbnailUrl:{type:String,default:null}},data(){return{uploadUrl:null}},computed:{type(){return rl[this.file.type]||this.file.name.split(".").pop().toUpperCase()},source(){return this.uploadUrl||this.thumbnailUrl}},watch:{"file.upload.file":{immediate:!0,handler(e){if(this.thumbnail&&e?.type.startsWith("image/")){const t=new FileReader;t.onload=()=>{this.uploadUrl=t.result},t.readAsDataURL(e)}else this.uploadUrl=null}}}}),rl={"text/plain":"TXT","text/html":"HTML","text/css":"CSS","text/javascript":"JS","image/jpeg":"JPG","image/png":"PNG","image/gif":"GIF","image/svg+xml":"SVG","movie/mp4":"MP4","audio/mpeg":"MP3","application/json":"JSON","application/xml":"XML","application/pdf":"PDF","application/zip":"ZIP"},ll=y(il,[["render",al]]);function dl(e,t,o={}){let s;const{document:i=ca,watchElement:a=!1,...r}=o,l={onUpdate:k=>{pl(t,k.oldIndex,k.newIndex,k)}},d=n.computed(()=>typeof e=="string"?i?.querySelector(e):on(e)),c=()=>{s?.destroy(),s=void 0},p=k=>{!k||s!==void 0||(s=new En(k,{...l,...r}))},u=()=>{const k=d.value;k&&p(k)},m=(k,V)=>{if(V!==void 0)s?.option(k,V);else return s?.option(k)};let f;a&&typeof e!="string"?f=n.watch(d,k=>{c(),k&&p(k)},{immediate:!0,flush:"post"}):da(u);const g=()=>{c()};return nn(()=>{f?.(),c()}),{stop:g,start:u,option:m}}function cl(e,t,o){const s=e.children[o];e.insertBefore(t,s)}function hl(e){e.parentNode&&e.parentNode.removeChild(e)}function pl(e,t,o,s=null){s!=null&&(hl(s.item),cl(s.from,s.item,t));const i=n.isRef(e),a=i?[...n.toValue(e)]:n.toValue(e);if(o>=0&&o<a.length){const r=a.splice(t,1)[0];n.nextTick(()=>{a.splice(o,0,r),i&&(e.value=a)})}}const ul=n.defineComponent((e,{slots:t})=>{const o=pa(e,"modelValue"),s=n.shallowRef(),i=n.reactive(dl(s,o,e.options));return()=>{if(t.default)return n.h(e.as||"div",{ref:s},t.default(i))}},{name:"UseSortable",props:["as","modelValue","options"]});function ml(e,t,o,s,i,a){const r=n.resolveComponent("UseSortable");return e.draggable?(n.openBlock(),n.createBlock(r,{key:0,class:n.normalizeClass(["dito-draggable",{"dito-draggable--dragging":e.isDragging}]),as:e.as,modelValue:e.modelValue,options:{...e.options,onStart:e.onStart,onEnd:e.onEnd},"onUpdate:modelValue":t[0]||(t[0]=l=>e.$emit("update:modelValue",l))},{default:n.withCtx(()=>[n.renderSlot(e.$slots,"default")]),_:3},8,["class","as","modelValue","options"])):(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.as),{key:1},{default:n.withCtx(()=>[n.renderSlot(e.$slots,"default")]),_:3}))}const fl=C.component("DitoDraggable",{mixins:[H],components:{UseSortable:ul},emits:["update:modelValue"],props:{modelValue:{type:Array,required:!0},as:{type:String,default:"div"},options:{type:Object,required:!0},draggable:{type:Boolean,default:!0}},data(){return{mouseEvents:null,isDragging:!1}},methods:{onStart(e){this.options.onStart?.(e),this.isDragging=!0,this.mouseEvents?.remove()},onEnd(e){this.options.onEnd?.(e),this.mouseEvents=this.domOn(document,{mousedown:this.onMouse,mousemove:this.onMouse,mouseleave:this.onMouse})},onMouse(){this.isDragging=!1,this.mouseEvents?.remove(),this.mouseEvents=null}}}),gl=y(fl,[["render",ml]]);function hn({vnode:e}){return e}hn.props={vnode:{type:Object,required:!0}};const bl=C.component("DitoVnode",hn),yl=Object.freeze(Object.defineProperty({__proto__:null,DitoAccount:ei,DitoAffix:ln,DitoAffixes:I,DitoButtons:Gi,DitoClipboard:cr,DitoContainer:Oi,DitoCreateButton:sr,DitoDialog:sn,DitoDraggable:gl,DitoEditButtons:_i,DitoErrors:wr,DitoForm:cn,DitoFormInner:kr,DitoFormNested:Cr,DitoHeader:Ra,DitoLabel:mi,DitoMenu:Pa,DitoNavigation:qa,DitoNotifications:Ya,DitoPagination:Lr,DitoPane:Vi,DitoPanel:zi,DitoPanels:Hi,DitoRoot:Xe,DitoSchema:yi,DitoSchemaInlined:$i,DitoScopes:Nr,DitoSidebar:Xa,DitoSpinner:rn,DitoTableCell:el,DitoTableHead:Zr,DitoTabs:Mi,DitoTrail:La,DitoTreeItem:Wr,DitoUploadFile:ll,DitoVNode:bl,DitoView:tn},Symbol.toStringTag,{value:"Module"})),B={extends:C,mixins:[Oe],nativeField:!1,textField:!1,defaultValue:null,defaultNested:!0,defaultVisible:!0,defaultMultiple:!1,generateLabel:!0,excludeValue:!1,ignoreMissingValue:null,omitSpacing:!1,component:C.component,get:ie,register(e,t={}){e=h.asArray(e);const o=this.component(`DitoType${h.camelize(e[0],!0)}`,t);for(const s of e)ko(s,o);return o}},kl=["data-info"];function Cl(e,t,o,s,i,a){const r=n.resolveComponent("DitoAffixes"),l=n.resolveComponent("DitoButton");return n.openBlock(),n.createBlock(l,n.mergeProps({class:["dito-button",e.buttonClass],id:e.dataPath,ref:"element",type:e.type,text:e.text,title:e.title,disabled:e.disabled},e.attributes),{prefix:n.withCtx(()=>[e.prefixes.length>0?(n.openBlock(),n.createBlock(r,{key:0,items:e.prefixes,position:"prefix",disabled:e.disabled,parentContext:e.context},null,8,["items","disabled","parentContext"])):n.createCommentVNode("",!0)]),suffix:n.withCtx(()=>[e.suffixes.length>0?(n.openBlock(),n.createBlock(r,{key:0,items:e.suffixes,position:"suffix",disabled:e.disabled,parentContext:e.context},null,8,["items","disabled","parentContext"])):n.createCommentVNode("",!0),!e.label&&e.info?(n.openBlock(),n.createElementBlock("div",{key:1,class:"dito-info","data-info":e.info},null,8,kl)):n.createCommentVNode("",!0)]),_:1},16,["id","type","text","title","disabled","class"])}const $l=B.register(["button","submit"],{components:{DitoAffixes:I,DitoButton:Qo},defaultValue:()=>{},excludeValue:!0,defaultWidth:"auto",generateLabel:!1,data(){return{isRunning:!1}},computed:{verb(){return this.verbs[this.name]},buttonClass(){return this.verb?`dito-button--${this.verb}`:null},text:b("text",{type:String}),title(){return this.text||h.labelize(this.verb)},prefixes(){return h.asArray(this.schema.prefix)},suffixes(){return h.asArray(this.schema.suffix)},closeForm:b("closeForm",{type:Boolean,default:!1})},methods:{getEvents(){const{onFocus:e,onBlur:t,onClick:o}=this;return{onFocus:e,onBlur:t,onClick:o}},async submit(e){return this.resourceComponent?.submit(this,e)},async onClick(){this.isRunning=!0;try{await this.emitEvent("click",{parent:this.schemaComponent})===void 0&&Ut(this.schema)&&await this.submit()}catch(e){if(await this.emitEvent("error",{error:e})===void 0)if(e instanceof AggregateError)for(const o of e.errors)this.notify({type:"error",text:o});else this.notify({type:"error",text:e})}finally{this.isRunning=!1}}}}),Dl=y($l,[["render",Cl]]),Bl={class:"dito-checkbox"},wl=["id"];function Sl(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",Bl,[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r),type:"checkbox"},e.attributes),null,16,wl),[[n.vModelCheckbox,e.value]])])}const Vl=B.register("checkbox",{nativeField:!0}),Pl=y(Vl,[["render",Sl]]),pn={mixins:[dn],data(){return{isLoading:!1,asyncDataEntries:n.markRaw({})}},methods:{handleDataSchema(e,t,o){h.isObject(e)||(e={data:e});let{data:s=void 0,dataPath:i=null}=e;const a=this.asyncDataEntries[t]??={reactiveVersion:n.ref(1),dependencyFunction:null,resolvedData:void 0,resolving:!1,resolved:!1};if(a.reactiveVersion.value&&a.dependencyFunction?.(this.context),a.resolved){const{resolvedData:r}=a;return a.resolvedData=void 0,a.resolved=!1,r}if(a.resolving)s=null;else if(s){if(h.isFunction(s)){const r=s(this.context);h.isFunction(r)?(a.dependencyFunction=s,s=r(this.context)):s=r}h.isPromise(s)&&(a.resolving=!0,this.resolveData(s,o).then(r=>{a.resolvedData=r,a.resolving=!1,a.resolved=!0,a.reactiveVersion.value++}).catch(r=>{console.error(r),a.resolving=!1}),s=null)}else i&&(s=h.getValueAtDataPath(this.rootData,h.normalizeDataPath(`${this.dataPath}/${i}`)));return s},async resolveData(e,t={}){let o=!1;const s=setTimeout(()=>{this.setLoading(!0,t),o=!0},0);let i=null;try{i=await(h.isFunction(e)?e():e)}catch(a){this.addError(a.message||a)}return o?this.setLoading(!1,t):clearTimeout(s),i}}},ke={mixins:[pn],computed:{multiple(){return Tt(this.schema)},selectedValue:{get(){const e=o=>{const s=this.relate?this.getValueForOption(o):o;return this.hasOptions?this.getOptionForValue(s)?s:null:o},t=this.multiple&&h.isArray(this.value)?this.value.map(e).filter(o=>o!==null):e(this.value);return this.hasOptions&&(t===null&&this.value!==null||ro(this.value))&&(this.selectedValue=t),t},set(e){const t=o=>this.relate?this.getOptionForValue(o):o;this.value=this.multiple&&h.isArray(e)?e.map(t):t(e)}},selectedOption(){return this.getOptionForValue(this.selectedValue)},options(){const e=this.handleDataSchema(this.schema.options,"options")??[];if(!h.isArray(e))throw new Error(`Invalid options data, should be array: ${e}`);return this.processOptions(e)},activeOptions(){return this.options},hasOptions(){return this.activeOptions.length>0},relate:b("relate",{type:Boolean,default:!1,callback:!1}),groupBy:b("groupBy",{type:String,default:null}),optionLabel:b("options.label",{type:[String,Function],default:null,get(e){return e||this.getOptionKey("label")||null}}),optionValue:b("options.value",{type:[String,Function],default:null,get(e){return e||this.relate&&"id"||this.getOptionKey("value")||null}}),optionEquals:b("options.equals",{type:Function,default:null}),searchFilter:b("search",{type:[Object,Function],default:null,get(e){if(e){const{filter:t,debounce:o}=h.isFunction(e)?{filter:e}:e;return o?h.debounceAsync(t,o):t}}}),editable:b("editable",{type:Boolean,default:!1,get(e){return e&&Lo(this.schema,this.context)}}),editPath(){return this.editable&&this.selectedValue?Vt(this.schema,this.selectedValue,this.context):null},groupByLabel(){return this.groupBy?"label":null},groupByOptions(){return this.groupBy?"options":null}},methods:{getOptionKey(e){const[t]=this.activeOptions;return h.isObject(t)&&e in t?e:null},processOptions(e){if(e.length){if(this.relate)for(const t of e)"id"in t||io(t,"id");if(this.groupBy){const t={};e=e.reduce((o,s)=>{const i=s[this.groupBy];let a=t[i];return a||(a=t[i]={[this.groupByLabel]:i,[this.groupByOptions]:[]},o.push(a)),a[this.groupByOptions].push(s),o},[])}}return e},getOptionForValue(e){const t=(o,s,i)=>{for(const a of o)if(i){const r=t(a.options,s,null);if(r)return r}else if(this.optionEquals?this.optionEquals(new S(this,{value:s,option:a})):s===this.getValueForOption(a))return a};return this.optionValue?t(this.activeOptions,e,this.groupBy):e},getValueForOption(e){const{optionValue:t}=this;return h.isString(t)?e?.[t]??null:h.isFunction(t)?t(new S(this,{option:e})):e},getLabelForOption(e){const{optionLabel:t}=this;return h.isString(t)?e?.[t]:h.isFunction(t)?t(new S(this,{option:e})):h.labelize(`${e}`)}},processValue({schema:e,value:t,dataPath:o},s){if(e.relate){const i=e.options?.dataPath,a=i?h.normalizeDataPath(`${o}/${i}`):null;s.addRelation(o,a,e),a&&s.setSourceRelated(a);const r=l=>l&&{id:l.id};t=Tt(e)&&h.isArray(t)?t.map(r):r(t)}return t}},El=["id"],Nl={class:"dito-checkbox"},Ol=["value"];function Tl(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-checkboxes",`dito-layout--${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.createElementVNode("div",Nl,[n.withDirectives(n.createElementVNode("input",n.mergeProps({ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),type:"checkbox",value:e.getValueForOption(r)},{ref_for:!0},e.attributes),null,16,Ol),[[n.vModelCheckbox,e.selectedOptions]]),n.createElementVNode("span",null,n.toDisplayString(e.getLabelForOption(r)),1)])])]))),256))],10,El)}const Ll=B.register("checkboxes",{mixins:[ke],nativeField:!0,defaultValue:[],defaultWidth:"auto",defaultMultiple:!0,computed:{multiple(){return!0},selectedOptions:{get(){return(this.selectedValue||[]).filter(e=>e)},set(e){this.selectedValue=e||[]}}}}),Fl=y(Ll,[["render",Tl]]),Il=["id"],Ml={class:"dito-code__editor",ref:"editor"};function Rl(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("div",{class:"dito-code",id:e.dataPath,style:n.normalizeStyle(e.style)},[n.createElementVNode("div",Ml,null,512),e.resizable?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-resize",onMousedown:t[0]||(t[0]=n.withModifiers((...r)=>e.onDragResize&&e.onDragResize(...r),["stop","prevent"]))},null,32)):n.createCommentVNode("",!0)],12,Il)}const jl=B.register("code",{mixins:[H],data(){return{height:null}},computed:{lines:b("lines",{type:Number,default:3}),language:b("language",{type:String,default:"javascript"}),indentSize:b("indentSize",{type:Number,default:2}),resizable:b("resizable",{type:Boolean,default:!1}),style(){return{height:this.height||`calc(${this.lines}em * var(--line-height))`}}},mounted(){const e=new Nn(this.$refs.editor,{language:this.language,indentSize:this.indentSize,lineNumbers:!1});let t=!1,o=!1,s=!1;const i=()=>{!this.focused&&t&&(t=!1,this.onChange())},a=()=>this.onFocus(),r=()=>{this.onBlur(),i()};this.domOn(this.$refs.editor.querySelector("textarea"),{focus:a,blur:r});const l=c=>{c!==e.code&&(s=!0,e.updateCode(c))},d=c=>{c!==this.value&&(o=!0,this.value=c,t=!0,i())};e.onUpdate(c=>{s?s=!1:d(c)}),this.$watch("value",c=>{o?o=!1:l(c||"")}),this.$watch("language",c=>{e.updateLanguage(c)}),l(this.value||"")},methods:{focusElement(){this.$el.querySelector("textarea")?.focus()},blurElement(){this.$el.querySelector("textarea")?.blur()},onDragResize(e){const t=({clientX:r,clientY:l})=>({x:r,y:l});let o=t(e).y,s=parseFloat(getComputedStyle(this.$el).height);const i=r=>{const{y:l}=t(r);s+=l-o,o=l,this.height=`${Math.max(s,0)}px`},a=this.domOn(document,{mousemove:i,mouseup(r){i(r),a.remove()}})}}}),zl=y(jl,[["render",Rl]]),Al={key:0,class:"dito-color__preview"};function ql(e,t,o,s,i,a){const r=n.resolveComponent("DitoAffixes"),l=n.resolveComponent("DitoInput"),d=n.resolveComponent("SketchPicker"),c=n.resolveComponent("DitoTrigger");return n.openBlock(),n.createBlock(c,{class:"dito-color",show:e.showPopup,"onUpdate:show":t[2]||(t[2]=p=>e.showPopup=p),trigger:"focus"},{trigger:n.withCtx(()=>[n.createVNode(l,n.mergeProps({id:e.dataPath,ref:"element",modelValue:e.hexValue,"onUpdate:modelValue":t[0]||(t[0]=p=>e.hexValue=p),type:"input",size:"8",focused:e.showPopup},e.attributes),{prefix:n.withCtx(()=>[n.createVNode(r,{items:e.schema.prefix,position:"prefix",mode:"input",disabled:e.disabled,parentContext:e.context},null,8,["items","disabled","parentContext"])]),suffix:n.withCtx(()=>[n.createVNode(r,{items:e.schema.suffix,position:"suffix",mode:"input",clearable:e.showClearButton,disabled:e.disabled,inlineInfo:e.inlineInfo,parentContext:e.context,onClear:e.clear},{append:n.withCtx(()=>[e.value?(n.openBlock(),n.createElementBlock("div",Al,[n.createElementVNode("div",{style:n.normalizeStyle({background:`#${e.hexValue||"00000000"}`})},null,4)])):n.createCommentVNode("",!0)]),_:1},8,["items","clearable","disabled","inlineInfo","parentContext","onClear"])]),_:1},16,["id","modelValue","focused"])]),popup:n.withCtx(()=>[n.createVNode(d,{class:"dito-color__picker",modelValue:e.colorValue,"onUpdate:modelValue":t[1]||(t[1]=p=>e.colorValue=p),disableAlpha:!e.alpha,disableFields:!e.inputs,presetColors:e.presets},null,8,["modelValue","disableAlpha","disableFields","presetColors"])]),_:1},8,["show"])}const{hex:Ul}=we.Sketch.computed;we.Sketch.computed.hex=function(){return Ul.call(this).toLowerCase()};const Hl=B.register("color",{components:{DitoTrigger:Qe,DitoInput:U,DitoAffixes:I,SketchPicker:we.Sketch},data(){return{showPopup:!1,convertedValue:null}},computed:{canUpdateValue(){return!this.focused||this.readonly},colorValue:{get(){return this.convertedValue||this.value||(this.colorFormat==="hex"?"":{})},set(e){this.value=un(e,this.colorFormat)}},hexValue:{get(){const e=Be(this.value);return e.isValid()?e.toString(e.getAlpha()<1?"hex8":"hex6").slice(1).toLowerCase():null},set(e){if(Be(e).isValid()){const o=un(e,this.colorFormat);this.canUpdateValue?this.value=o:this.convertedValue=o}}},colorFormat:b("format",{type:String,default:"hex"}),alpha:b("alpha",{type:Boolean,default:!1}),inputs:b("inputs",{type:Boolean,default:!0}),presets:b("presets",{type:Array,default:["#ffffff","#c3c3c3","#7f7f7f","#000000","#880015","#ed1c24","#ff7f27","#fff200","#22b14c","#00a2e8","#3f48cc","#a349a4","#b97a57","#ffaec9","#ffc90e","#00000000"]})},watch:{value:"onChange",canUpdateValue(e){e&&this.convertedValue!==null&&(this.value=this.convertedValue,this.convertedValue=null)}}});function un(e,t){return h.isObject(e)?Wl(e,t):Kl(Be(e),t)}function Wl(e,t){const o=e[{hex:e?.a<1?"hex8":"hex",rgb:"rgba"}[t]||t];return h.isString(o)&&o[0]==="#"?o.toLowerCase():o}function Kl(e,t){switch(t){case"rgb":return e.toRgb();case"prgb":return e.toPercentageRgb();case"name":return e.toName();case"hsl":return e.toHsl();case"hsv":return e.toHsv();case"hex3":return`#${e.toHex(!0)}`;case"hex4":return`#${e.toHex8(!0)}`;case"hex8":return`#${e.toHex8()}`;default:return e.getAlpha()<1?`#${e.toHex8()}`:`#${e.toHex()}`}}const Yl=y(Hl,[["render",ql]]);function Jl(e,t,o,s,i,a){return n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),n.normalizeProps(n.guardReactiveProps(e.$props)),null,16)}const Gl=B.register("component",{defaultValue:()=>{},ignoreMissingValue:({schema:e})=>!("default"in e),async processSchema(e,t){await de(t)}}),Ql=y(Gl,[["render",Jl]]),Xl=["id","name","value","disabled"];function Zl(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("input",{class:"dito-text dito-input",id:e.dataPath,ref:"element",name:e.name,type:"text",value:e.value,disabled:e.disabled,readonly:!0},null,8,Xl)}const _l=B.register(["computed","data","hidden"],{mixins:[pn],defaultValue:()=>{},defaultVisible:!1,computed:{value:{get(){const{schema:e}=this;if(e.data||e.dataPath){const t=this.handleDataSchema(e,"value");this.data[this.name]=t}return ae.computed.value.get.call(this)},set(e){ae.computed.value.set.call(this,e)}}}}),xl=y(_l,[["render",Zl]]),vl={class:"dito-date"};function ed(e,t,o,s,i,a){const r=n.resolveComponent("DitoAffixes");return n.openBlock(),n.createElementBlock("div",vl,[(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.getComponent(e.type)),n.mergeProps({id:e.dataPath,ref:"element",modelValue:e.dateValue,"onUpdate:modelValue":t[0]||(t[0]=l=>e.dateValue=l),locale:e.locale,format:e.formats},e.attributes),{prefix:n.withCtx(()=>[n.createVNode(r,{items:e.schema.prefix,position:"prefix",mode:"input",absolute:"",disabled:e.disabled,parentContext:e.context},null,8,["items","disabled","parentContext"])]),suffix:n.withCtx(()=>[n.createVNode(r,{items:e.schema.suffix,position:"suffix",mode:"input",absolute:"",clearable:e.showClearButton,disabled:e.disabled,inlineInfo:e.inlineInfo,parentContext:e.context,onClear:e.clear},null,8,["items","clearable","disabled","inlineInfo","parentContext","onClear"])]),_:1},16,["id","modelValue","locale","format"]))])}const td=B.register(["date","datetime","time"],{components:{DitoAffixes:I},nativeField:!0,textField:!0,computed:{dateValue:{get(){const{value:e}=this;return e&&new Date(e)},set(e){this.value=e}},formats:b("formats",{type:Object,default:null,get(e){const{date:t,time:o}=h.assignDeeply({},this.api.formats,e);return{date:["date","datetime"].includes(this.type)?t:null,time:["time","datetime"].includes(this.type)?o:null}}})},methods:{getComponent(e){return{date:Qt,time:Xt,datetime:As}[e]}},processValue({value:e}){return h.isDate(e)?e.toISOString():e}}),nd=y(td,[["render",ed]]);function mn(e){const t=e?h.isArray(e)?e:Object.entries(e):[];return new URLSearchParams(t.reduce((o,[s,i])=>{if(h.isArray(i))for(const a of i)o.push([s,a??""]);else i!=null&&o.push([s,i]);return o},[])).toString().replaceAll(/%(?:21|24|28|29|2C|2F|3A|3B|3D|3F|40)/g,decodeURIComponent)}function od({path:e,query:t,hash:o}){const{location:s}=window;history.replaceState(history.state,null,`${s.origin}${e??s.pathname}?${t?mn(t):s.search.slice(1)}${o??s.hash}`)}const Z={mixins:[be,Ze,xt],defaultValue:e=>te(e.schema)?[]:null,excludeValue:e=>!!e.schema.resource,provide(){return{$sourceComponent:()=>this}},data(){return{wrappedPrimitives:null,unwrappingPrimitives:On.raw(!1)}},computed:{sourceComponent(){return this},isObjectSource(){return ee(this.type)},isListSource(){return te(this.type)},hasData(){return!!this.value},shouldRender(){return this.sourceDepth<this.maxDepth},isReady(){return this.shouldRender&&(this.hasData||!this.providesData)},isInView(){return!!this.viewComponent},wrapPrimitives(){return this.schema.wrapPrimitives},listData:{get(){let e=this.value;this.isObjectSource?e=e!=null?[e]:[]:e=this.unwrapListData(e)||e,e||=[];const{wrapPrimitives:t}=this;return t?(this.unwrappingPrimitives.value?this.unwrappingPrimitives.value=!1:this.wrappedPrimitives=e.map(o=>({[t]:o})),this.wrappedPrimitives):e},set(e){this.wrapPrimitives?this.wrappedPrimitives=e:this.value=this.isObjectSource?e?.length>0?e[0]:null:e}},objectData:{get(){return this.listData[0]||null},set(e){this.listData=e?[e]:[]}},sourceSchema(){return this.schema},sourceDepth(){return this.$route.matched.reduce((e,t)=>e+(t.meta.schema===this.sourceSchema?1:0),0)},path(){return this.routeComponent.getChildPath(this.schema.path)},defaultQuery(){const{defaultOrder:e}=this;return e?{order:e}:{}},query:Ne("query",{get(e){return{...this.defaultQuery,...e}},set(e){const{scope:t=this.defaultScope?.name,page:o=this.schema.page,type:s}=this.query;return e={...this.query,...t!=null&&{scope:t},...o!=null&&{page:o},...s!=null&&{type:s},...e},h.equals(e,this.$route.query)||od({query:e}),e}}),total:Ne("total"),columns(){return G(this.schema.columns)},scopes(){return G(this.schema.scopes)},defaultScope(){let e=null;if(this.scopes)for(const t of Object.values(this.scopes)){if(t.defaultScope)return t;e||(e=t)}return e},defaultOrder(){if(this.columns)for(const e of Object.values(this.columns)){const{defaultSort:t}=e;if(t){const o=h.isString(t)?t:"asc";return`${e.name} ${o}`}}return null},nestedMeta(){return{...this.meta,schema:this.schema}},forms(){return Object.values(Y(this.schema,this.context))},view(){return Re(this.schema,this.context)},linksToView(){return!!this.view},buttonSchemas(){return v(this.schema.buttons)},isCompact(){return this.forms.every(Et)},isInlined(){return ze(this.schema)},paginate:b("paginate",{type:Number}),render:b("render",{type:Function,default:null}),creatable:b("creatable",{type:Boolean,default:!1,get(e){return e&&q(this.schema)?this.isObjectSource?!this.value:!0:!1}}),editable:b("editable",{type:Boolean,default:!1,get(e){return e&&!this.isInlined}}),deletable:b("deletable",{type:Boolean,default:!1}),draggable:b("draggable",{type:Boolean,default:!1,get(e){return this.isListSource&&this.listData.length>1&&e}}),collapsible:b("collapsible",{type:Boolean,default:!1,get(e){return e&&this.isInlined}}),collapsed:b("collapsed",{type:Boolean,default:!1,get(e){return e&&this.collapsible}}),maxDepth:b("maxDepth",{type:Number,default:1}),createPath(){return this.creatable?St(this.schema,this.context)||this.path:null}},watch:{$route:{flush:"post",handler(e,t){this.providesData&&(t.path===e.path&&t.hash===e.hash?(this.query=e.query,this.loadData(!1)):this.meta.reload&&t.path!==e.path&&t.path.startsWith(e.path)&&(this.meta.reload=!1,this.loadData(!1)))}},wrappedPrimitives:{deep:!0,handler(e,t){const{wrapPrimitives:o}=this;o&&t!==null&&(this.unwrappingPrimitives.value=!0,this.value=e.map(s=>s[o]))}}},methods:{setupData(){this.query=this.$route.query,this.ensureData()},clearData(){this.total=0,this.value=null},setData(e){!e||this.isListSource&&h.isArray(e)||this.isObjectSource&&h.isObject(e)?this.value=e:this.unwrapListData(e)||h.isObject(e)&&this.isInView&&this.viewComponent.setData(e)},unwrapListData(e){if(this.isListSource&&h.isObject(e)&&h.isNumber(e.total)&&h.isArray(e.results))return this.total=e.total,this.value=e.results,this.value},createItem(e,t){const o=this.createData(e,t);return this.isObjectSource?this.objectData=o:this.listData.push(o),this.collapsible&&this.$nextTick(()=>this.openSchemaComponent(-1)),this.onChange(),o},removeItem(e,t){let o=!1;if(this.isObjectSource)this.objectData=null,o=!0;else{const{listData:s}=this;t>=0&&(s.splice(t,1),o=!0)}o&&(this.removeItemStore(this.schema,e,t),this.onChange())},deleteItem(e,t){const o=e&&this.getItemLabel(this.schema,e,{index:t,extended:!0}),s=()=>this.notify({type:this.isTransient?"info":"success",title:"Successfully Removed",text:[`${o} was ${this.verbs.deleted}.`,this.transientNote]});if(e&&window.confirm(`Do you really want to ${this.verbs.delete} ${o}?`))if(this.isTransient)this.removeItem(e,t),s();else{const i=this.getItemId(this.schema,e,t),a="delete",r=We(i,this.getResource({method:a}));r&&this.handleRequest({method:a,resource:r},l=>{l||(this.removeItem(e,t),s()),this.reloadData()})}},getSchemaComponent(e){const{schemaComponents:t}=this,{length:o}=t;return t[(e%o+o)%o]},openSchemaComponent(e){const t=this.getSchemaComponent(e);t&&(t.opened=!0)},async navigateToComponent(e,t){if(this.collapsible){const o=e.startsWith(this.dataPath)?this.isListSource?h.parseDataPath(e.slice(this.dataPath.length+1))[0]??null:0:null;if(o!==null&&h.isNumber(+o)){const s=this.getSchemaComponent(+o);if(s){const{opened:i}=s;i||(s.opened=!0,await this.$nextTick());const a=s.getComponentsByDataPath(e);if(a.length>0&&(t?.(a)??!0))return!0;s.opened=i}}}return this.navigateToRouteComponent(e,t)},navigateToRouteComponent(e,t){return new Promise((o,s)=>{const i=()=>{const{routeComponents:r}=this.appState,l=r[r.length-1];o(t?.([l])??!0)},a=h.parseDataPath(e);for(;a.length>0;){const r=this.routeComponent.getChildPath(this.api.normalizePath(h.normalizeDataPath(a))),{matched:l}=this.$router.resolve(r);if(l.length&&l[0].name!=="catch-all"){this.$route.path===r?i():this.$router.push({path:r}).catch(s).then(()=>{this.$nextTick(i)});return}a.pop()}o(!1)})}},async processSchema(e,t,o,s,i,a=!1,r=!1,l=null){Dt(e,t,o);const d=ze(t);if(d&&t.resource)throw new Error(`Nested ${this.isListSource?"lists":this.isObjectSource?"objects":"schema"} cannot load data from their own resources`);const c=`id${i+1}`,p={api:e,schema:t},u={...p,flatten:r,nested:a,param:c},m=await Eo(e,t,i);if(l&&await l(m,i+1),q(t)&&!d){const f=i===0?"":t.path,g={path:fn(f,te(t)?c:null),component:C.component(a?"DitoFormNested":"DitoForm"),meta:u};ee(t)&&s.push({...g,path:fn(f,c)}),f&&s.push({path:f,redirect:".",meta:p});const[k,V]=m.reduce((w,$)=>(w[$.meta.flatten?0:1].push($),w),[[],[]]);if(V.length&&(g.children=V),s.push(g),k.length)for(const w of k)s.push({...w.redirect?w:g,path:`${g.path}/${w.path}`,meta:{...w.meta,flatten:r}})}},processValue({schema:e,value:t,dataPath:o},s){return s.addSource(o,e),t}};function fn(e,t){return t?e?`${e}/:${t}`:`:${t}`:e}const sd={text(e){const t=[{label:"contains",value:"contains"},{label:"equals",value:"equals"},{label:"starts with",value:"starts-with"},{label:"ends with",value:"ends-with"}];return{operator:e.operators?{type:"select",width:"2/5",options:h.isArray(e.operators)?t.filter(o=>e.operators.includes(o.value)):t,clearable:!0}:null,text:{type:"text",width:e.operators?"3/5":"fill",clearable:!0}}},"date-range"(){const e={type:"datetime",width:"1/2",formats:{date:{day:"2-digit",month:"2-digit",year:"numeric"}},clearable:!0};return{from:e,to:e}}};function ad(e,t,o,s){const{sticky:i,...a}=t,r={type:"panel",label:"Filters",name:"$filters",disabled:!1,sticky:i,data(){return dd(r,s.value)},components:rd(a),buttons:gn(!1),panelButtons:gn(!0),events:{change(){this.applyFilters()}},computed:{filters(){return ld(this.schema,this.data)},hasFilters(){return this.filters.length>0}},methods:{applyFilters(){s.value={...s.value,filter:this.filters,page:void 0}},clearFilters(){this.resetData(),this.applyFilters()}}};return $t(e,r),r}function gn(e){return{clear:{type:"button",text:e?null:"Clear",disabled:({schemaComponent:t})=>!t.hasFilters,events:{click({schemaComponent:t}){t.clearFilters()}}},submit:{type:"submit",text:e?null:"Filter",visible:!e,events:{click({schemaComponent:t}){t.applyFilters()}}}}}function id(e){return`$${e}`}function bn(e){return e.startsWith("$")?e.slice(1):null}function rd(e){const t={};for(const o of Object.values(G(e)||{})){const{filter:s,width:i,...a}=o,r=s?sd[s]?.(o):o.components;if(r){a.type="form",a.components={};for(const[l,d]of Object.entries(r))if(d){const c=d.label||h.labelize(d.name||l);a.components[l]={...d,label:!1,placeholder:c}}t[id(o.name)]={label:a.label??h.labelize(o.name),type:"object",width:i,default:()=>({}),form:a,inlined:!0}}else throw new Error(`Invalid filter '${o.name}': Unknown filter type '${s}'.`)}return t}function yn(e,t){return e.components[t]?.form?.components}function ld(e,t){const o=[];for(const s in t){const i=t[s];if(i){const a=Object.keys(yn(e,s)).map(r=>i[r]??null);a.some(r=>r!==null)&&o.push(`${bn(s)}:${a.map(JSON.stringify).join(",")}`)}}return o}function dd(e,t){const o={};if(t)for(const i of h.asArray(t.filter)){const[,a,r]=i.match(/^(\w+):(.*)$/);try{o[a]=h.asArray(JSON.parse(`[${r}]`))}catch{}}const s={};for(const i in e.components){const a={},r=o[bn(i)];if(r){const l=yn(e,i);if(l){let d=0;for(const c in l)a[c]=r[d++]}}s[i]=a}return s}const cd=["id"],hd={key:0,class:"dito-list__header"},pd={key:1,class:"dito-spacer"},ud=["id"],md={key:1},fd=["innerHTML"],gd=["innerHTML"],bd={key:2,class:"dito-table__buttons"},yd={key:1},kd=["colspan"];function Cd(e,t,o,s,i,a){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoPagination"),d=n.resolveComponent("DitoTableHead"),c=n.resolveComponent("DitoTableCell"),p=n.resolveComponent("DitoSchemaInlined"),u=n.resolveComponent("DitoEditButtons"),m=n.resolveComponent("DitoDraggable");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-list",id:e.dataPath},[e.scopes||e.hasPagination?(n.openBlock(),n.createElementBlock("div",hd,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):e.hasPagination?(n.openBlock(),n.createElementBlock("div",pd)):n.createCommentVNode("",!0),e.hasPagination?(n.openBlock(),n.createBlock(l,{key:2,query:e.query,limit:e.paginate,total:e.total||0},null,8,["query","limit","total"])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),n.createElementVNode("table",{class:n.normalizeClass(["dito-table",{"dito-table--separators":e.isInlined,"dito-table--larger-padding":e.hasEditButtons&&!e.isInlined,"dito-table--alternate-colors":!e.isInlined,"dito-table--even-count":e.hasEvenCount}])},[e.columns?(n.openBlock(),n.createBlock(d,{key:0,query:e.query,columns:e.columns,hasEditButtons:e.hasEditButtons},null,8,["query","columns","hasEditButtons"])):n.createCommentVNode("",!0),n.createVNode(m,{as:"tbody",options:e.getDraggableOptions(),draggable:e.draggable,modelValue:e.updateOrder(e.sourceSchema,e.listData,e.paginationRange),"onUpdate:modelValue":t[0]||(t[0]=f=>e.listData=f)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.listData,(f,g)=>(n.openBlock(),n.createElementBlock("tr",{id:e.getDataPath(g),key:e.getItemUid(e.schema,f)},[e.columns?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.columns,k=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRenderSchema(k)?(n.openBlock(),n.createBlock(c,{key:k.name,class:n.normalizeClass(e.getCellClass(k)),cell:k,schema:e.schema,dataPath:e.getDataPath(g),data:f,meta:e.nestedMeta,store:e.store,nested:!1,disabled:e.disabled||e.isLoading},null,8,["class","cell","schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)):(n.openBlock(),n.createElementBlock("td",md,[e.isInlined?(n.openBlock(),n.createBlock(p,{key:0,label:e.getItemLabel(e.schema,f,{index:g,asObject:!0}),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(g),data:f,meta:e.nestedMeta,store:e.getItemStore(e.schema,f,g),disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,g),onDelete:k=>e.deleteItem(f,g)},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible","deletable","draggable","editable","editPath","onDelete"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.getDataPath(g),data:f,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext(f,g))},null,8,fd)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,f,{index:g})},null,8,gd))])),e.hasCellEditButtons?(n.openBlock(),n.createElementBlock("td",bd,[n.createVNode(u,{nested:"",schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(g),data:f,meta:e.nestedMeta,store:e.getItemStore(e.schema,f,g),disabled:e.disabled||e.isLoading,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,g),onDelete:k=>e.deleteItem(f,g)},null,8,["schema","dataPath","data","meta","store","disabled","deletable","draggable","editable","editPath","onDelete"])])):n.createCommentVNode("",!0)],8,ud))),128))]),_:1},8,["options","draggable","modelValue"]),e.hasListButtons&&!e.single?(n.openBlock(),n.createElementBlock("tfoot",yd,[n.createElementVNode("tr",null,[n.createElementVNode("td",{class:"dito-table__buttons",colspan:e.numColumns},[n.createVNode(u,{buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,nested:e.nested,disabled:e.disabled||e.isLoading,creatable:e.creatable,createPath:e.createPath},null,8,["buttons","schema","dataPath","data","meta","store","nested","disabled","creatable","createPath"])],8,kd)])])):n.createCommentVNode("",!0)],2),e.hasListButtons&&e.single?(n.openBlock(),n.createBlock(u,{key:1,class:"dito-buttons--large dito-buttons--main dito-buttons--sticky",buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store,disabled:e.disabled||e.isLoading,creatable:e.creatable,createPath:e.createPath},null,8,["buttons","schema","dataPath","data","meta","store","disabled","creatable","createPath"])):n.createCommentVNode("",!0)],8,cd)):n.createCommentVNode("",!0)}const $d=B.register("list",{mixins:[Z,ye],getSourceType(e){return e},getPanelSchema(e,t,o,s){const{filters:i}=t;if(i)return ad(e,i,o,n.computed({get(){return s.query},set(a){const r=l=>h.pickBy(l,d=>d!==void 0);h.equals(r(a),r(s.query))||(s.query=a,s.loadData(!1))}}))},computed:{hasPagination(){return!!this.paginate},hasListButtons(){return!!(this.buttonSchemas||this.creatable)},hasEditButtons(){const{listData:e}=this;return e.length>0&&(this.editable||this.deletable||this.draggable)},hasCellEditButtons(){return!this.isInlined&&this.hasEditButtons},hasEvenCount(){return!(this.listData.length%2)},numColumns(){return(this.columns?Object.keys(this.columns).length:1)+(this.hasCellEditButtons?1:0)}},methods:{getDataPath(e){return O(this.dataPath,e)},getEditPath(e,t){if(this.editable){const o=this.getItemId(this.schema,e,t);return Vt(this.schema,o,this.context)||`${this.path}/${o}`}return null},getCellClass(e){return`dito-cell--${h.hyphenate(e.name)}`},getContext(e,t){return new S(this,{data:e,value:e,index:t,dataPath:this.getDataPath(t)})},onFilterErrors(e){const t=O(this.dataPath,"$filters"),o=this.schemaComponent.getPanelByDataPath(t);if(o)return o.showValidationErrors(e,!0),!0}},async processSchema(e,t,o,s,i,a=!1,r=!1,l=null){await Promise.all([de(t),yt(t.columns),Z.processSchema(e,t,o,s,i,a,r,l)])}}),Dd=y($d,[["render",Cd]]);function Bd(e,t,o,s,i,a){const r=n.resolveComponent("DitoLabel");return n.openBlock(),n.createBlock(r,{class:"dito-label-component",label:e.value,dataPath:e.dataPath},null,8,["label","dataPath"])}const wd=B.register("label",{excludeValue:!0,generateLabel:!1}),Sd=y(wd,[["render",Bd]]);function kn(e,t,o){for(let s=0;;s++){if(s==e.childCount||s==t.childCount)return e.childCount==t.childCount?null:o;let i=e.child(s),a=t.child(s);if(i==a){o+=i.nodeSize;continue}if(!i.sameMarkup(a))return o;if(i.isText&&i.text!=a.text){for(let r=0;i.text[r]==a.text[r];r++)o++;return o}if(i.content.size||a.content.size){let r=kn(i.content,a.content,o+1);if(r!=null)return r}o+=i.nodeSize}}function Cn(e,t,o,s){for(let i=e.childCount,a=t.childCount;;){if(i==0||a==0)return i==a?null:{a:o,b:s};let r=e.child(--i),l=t.child(--a),d=r.nodeSize;if(r==l){o-=d,s-=d;continue}if(!r.sameMarkup(l))return{a:o,b:s};if(r.isText&&r.text!=l.text){let c=0,p=Math.min(r.text.length,l.text.length);for(;c<p&&r.text[r.text.length-c-1]==l.text[l.text.length-c-1];)c++,o--,s--;return{a:o,b:s}}if(r.content.size||l.content.size){let c=Cn(r.content,l.content,o-1,s-1);if(c)return c}o-=d,s-=d}}class E{constructor(t,o){if(this.content=t,this.size=o||0,o==null)for(let s=0;s<t.length;s++)this.size+=t[s].nodeSize}nodesBetween(t,o,s,i=0,a){for(let r=0,l=0;l<o;r++){let d=this.content[r],c=l+d.nodeSize;if(c>t&&s(d,i+l,a||null,r)!==!1&&d.content.size){let p=l+1;d.nodesBetween(Math.max(0,t-p),Math.min(d.content.size,o-p),s,i+p)}l=c}}descendants(t){this.nodesBetween(0,this.size,t)}textBetween(t,o,s,i){let a="",r=!0;return this.nodesBetween(t,o,(l,d)=>{let c=l.isText?l.text.slice(Math.max(t,d)-d,o-d):l.isLeaf?i?typeof i=="function"?i(l):i:l.type.spec.leafText?l.type.spec.leafText(l):"":"";l.isBlock&&(l.isLeaf&&c||l.isTextblock)&&s&&(r?r=!1:a+=s),a+=c},0),a}append(t){if(!t.size)return this;if(!this.size)return t;let o=this.lastChild,s=t.firstChild,i=this.content.slice(),a=0;for(o.isText&&o.sameMarkup(s)&&(i[i.length-1]=o.withText(o.text+s.text),a=1);a<t.content.length;a++)i.push(t.content[a]);return new E(i,this.size+t.size)}cut(t,o=this.size){if(t==0&&o==this.size)return this;let s=[],i=0;if(o>t)for(let a=0,r=0;r<o;a++){let l=this.content[a],d=r+l.nodeSize;d>t&&((r<t||d>o)&&(l.isText?l=l.cut(Math.max(0,t-r),Math.min(l.text.length,o-r)):l=l.cut(Math.max(0,t-r-1),Math.min(l.content.size,o-r-1))),s.push(l),i+=l.nodeSize),r=d}return new E(s,i)}cutByIndex(t,o){return t==o?E.empty:t==0&&o==this.content.length?this:new E(this.content.slice(t,o))}replaceChild(t,o){let s=this.content[t];if(s==o)return this;let i=this.content.slice(),a=this.size+o.nodeSize-s.nodeSize;return i[t]=o,new E(i,a)}addToStart(t){return new E([t].concat(this.content),this.size+t.nodeSize)}addToEnd(t){return new E(this.content.concat(t),this.size+t.nodeSize)}eq(t){if(this.content.length!=t.content.length)return!1;for(let o=0;o<this.content.length;o++)if(!this.content[o].eq(t.content[o]))return!1;return!0}get firstChild(){return this.content.length?this.content[0]:null}get lastChild(){return this.content.length?this.content[this.content.length-1]:null}get childCount(){return this.content.length}child(t){let o=this.content[t];if(!o)throw new RangeError("Index "+t+" out of range for "+this);return o}maybeChild(t){return this.content[t]||null}forEach(t){for(let o=0,s=0;o<this.content.length;o++){let i=this.content[o];t(i,s,o),s+=i.nodeSize}}findDiffStart(t,o=0){return kn(this,t,o)}findDiffEnd(t,o=this.size,s=t.size){return Cn(this,t,o,s)}findIndex(t){if(t==0)return Ce(0,t);if(t==this.size)return Ce(this.content.length,t);if(t>this.size||t<0)throw new RangeError(`Position ${t} outside of fragment (${this})`);for(let o=0,s=0;;o++){let i=this.child(o),a=s+i.nodeSize;if(a>=t)return a==t?Ce(o+1,a):Ce(o,s);s=a}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map(t=>t.toJSON()):null}static fromJSON(t,o){if(!o)return E.empty;if(!Array.isArray(o))throw new RangeError("Invalid input for Fragment.fromJSON");return new E(o.map(t.nodeFromJSON))}static fromArray(t){if(!t.length)return E.empty;let o,s=0;for(let i=0;i<t.length;i++){let a=t[i];s+=a.nodeSize,i&&a.isText&&t[i-1].sameMarkup(a)?(o||(o=t.slice(0,i)),o[o.length-1]=a.withText(o[o.length-1].text+a.text)):o&&o.push(a)}return new E(o||t,s)}static from(t){if(!t)return E.empty;if(t instanceof E)return t;if(Array.isArray(t))return this.fromArray(t);if(t.attrs)return new E([t],t.nodeSize);throw new RangeError("Can not convert "+t+" to a Fragment"+(t.nodesBetween?" (looks like multiple versions of prosemirror-model were loaded)":""))}}E.empty=new E([],0);const _e={index:0,offset:0};function Ce(e,t){return _e.index=e,_e.offset=t,_e}class M{constructor(t,o,s){this.content=t,this.openStart=o,this.openEnd=s}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(t,o){let s=Dn(this.content,t+this.openStart,o);return s&&new M(s,this.openStart,this.openEnd)}removeBetween(t,o){return new M($n(this.content,t+this.openStart,o+this.openStart),this.openStart,this.openEnd)}eq(t){return this.content.eq(t.content)&&this.openStart==t.openStart&&this.openEnd==t.openEnd}toString(){return this.content+"("+this.openStart+","+this.openEnd+")"}toJSON(){if(!this.content.size)return null;let t={content:this.content.toJSON()};return this.openStart>0&&(t.openStart=this.openStart),this.openEnd>0&&(t.openEnd=this.openEnd),t}static fromJSON(t,o){if(!o)return M.empty;let s=o.openStart||0,i=o.openEnd||0;if(typeof s!="number"||typeof i!="number")throw new RangeError("Invalid input for Slice.fromJSON");return new M(E.fromJSON(t,o.content),s,i)}static maxOpen(t,o=!0){let s=0,i=0;for(let a=t.firstChild;a&&!a.isLeaf&&(o||!a.type.spec.isolating);a=a.firstChild)s++;for(let a=t.lastChild;a&&!a.isLeaf&&(o||!a.type.spec.isolating);a=a.lastChild)i++;return new M(t,s,i)}}M.empty=new M(E.empty,0,0);function $n(e,t,o){let{index:s,offset:i}=e.findIndex(t),a=e.maybeChild(s),{index:r,offset:l}=e.findIndex(o);if(i==t||a.isText){if(l!=o&&!e.child(r).isText)throw new RangeError("Removing non-flat range");return e.cut(0,t).append(e.cut(o))}if(s!=r)throw new RangeError("Removing non-flat range");return e.replaceChild(s,a.copy($n(a.content,t-i-1,o-i-1)))}function Dn(e,t,o,s){let{index:i,offset:a}=e.findIndex(t),r=e.maybeChild(i);if(a==t||r.isText)return s&&!s.canReplace(i,i,o)?null:e.cut(0,t).append(o).append(e.cut(t));let l=Dn(r.content,t-a-1,o,r);return l&&e.replaceChild(i,r.copy(l))}const Vd=["id"],Pd={key:0,class:"dito-buttons dito-buttons--toolbar"},Ed={class:"dito-buttons__group"},Nd=["onClick"];function Od(e,t,o,s,i,a){const r=n.resolveComponent("DitoIcon"),l=n.resolveComponent("EditorContent");return n.openBlock(),n.createElementBlock("div",{class:"dito-markup",id:e.dataPath},[e.groupedButtons.length>0?(n.openBlock(),n.createElementBlock("div",Pd,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.groupedButtons,d=>(n.openBlock(),n.createElementBlock("div",Ed,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(d,({name:c,icon:p,isActive:u,onClick:m})=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",{"dito-button--active":u}]),key:c,onClick:m},[n.createVNode(r,{name:p},null,8,["name"])],10,Nd))),128))]))),256))])):n.createCommentVNode("",!0),n.createVNode(l,{class:"dito-markup-editor",ref:"editor",editor:e.editor,style:n.normalizeStyle(e.styles)},null,8,["editor","style"]),e.resizable?(n.openBlock(),n.createElementBlock("div",{key:1,class:"dito-resize",onMousedown:t[0]||(t[0]=n.withModifiers((...d)=>e.onDragResize&&e.onDragResize(...d),["stop","prevent"]))},null,32)):n.createCommentVNode("",!0)],8,Vd)}const Td=B.register("markup",{mixins:[H],components:{EditorContent:se.EditorContent,DitoIcon:Q},data(){return{editor:null,height:null}},computed:{lines(){return this.schema.lines||10},hardBreak(){return!!this.schema.hardBreak},styles(){return{height:this.height||`calc(${this.lines}em * var(--line-height))`}},markButtons(){return this.getButtons("marks",{bold:!0,italic:!0,underline:!0,strike:!0,small:!0,code:!0,subscript:!0,superscript:!0,link:{onClick:e=>this.onClickLink(e)}})},basicNodeButtons(){return this.getButtons("nodes",{paragraph:{command:"setParagraph"},heading:{attribute:"level",values:[1,2,3,4,5,6]}})},advancedNodeButtons(){return this.getButtons("nodes",{bulletList:!0,orderedList:!0,blockquote:!0,codeBlock:!0})},toolButtons(){return this.getButtons("tools",{undo:!0,redo:!0,footnotes:{command:"addFootnote"}})},groupedButtons(){return[this.markButtons,this.basicNodeButtons,this.advancedNodeButtons,this.toolButtons].filter(e=>e.length>0)},parseOptions(){return{preserveWhitespace:{collapse:!1,preserve:!0,"preserve-all":"full"}[this.whitespace]}},editorOptions(){return{editable:!this.readyonly,autoFocus:this.autofocus,disableInputRules:!this.enableRules.input,disablePasteRules:!this.enableRules.paste,parseOptions:this.parseOptions,editorProps:this.hardBreak?{handlePaste:(e,t,o)=>{const s=[];o.content.forEach((a,r,l)=>{l>0&&a.type.name==="paragraph"&&s.push(e.state.schema.nodes.hardBreak.create()),a.type.name==="paragraph"?a.content.forEach(d=>s.push(d)):s.push(a)});const i=e.state.schema.nodes.paragraph.create(null,E.from(s));return e.dispatch(e.state.tr.replaceSelection(new M(E.from(i),0,0))),!0}}:{}}},resizable:b("resizable",{type:Boolean,default:!1}),whitespace:b("whitespace",{type:String,default:"collapse"}),enableRules:b("enableRules",{type:[Object,Boolean],default:!1,get(e){return h.isObject(e)?e:{input:!!e,paste:!!e}}})},watch:{readyonly:"updateEditorOptions",autofocus:"updateEditorOptions",enableRules:"updateEditorOptions"},created(){let e=!1,t=!1;const o=()=>this.onFocus(),s=()=>{this.onBlur(),r()},i=()=>{a(),this.onInput()},a=h.debounce(()=>{t=!0,r()},100),r=()=>{const l=this.editor.getHTML(),d=this.hardBreak?l.replace(/^<p>(.*?)<\/p>$/s,"$1"):l;d!==this.value&&(e=!0,this.value=d),!this.focused&&e&&(this.onChange(),e=!1)};this.$watch("value",l=>{if(t)t=!1;else{const d=this.hardBreak?`<p>${l}</p>`:l;this.editor.commands.setContent(d,{emitUpdate:!1,parseOptions:this.parseOptions})}}),this.editor=new se.Editor({...this.editorOptions,onFocus:o,onBlur:s,onUpdate:i,extensions:this.getExtensions(),content:this.value||""})},unmounted(){this.editor.destroy()},methods:{onDragResize(e){const t=({clientX:r,clientY:l})=>({x:r,y:l});let o=t(e).y,s=parseFloat(getComputedStyle(this.$refs.editor.$el).height);const i=r=>{const{y:l}=t(r);s+=l-o,o=l,this.height=`${Math.max(s,0)}px`},a=this.domOn(document,{mousemove:i,mouseup(r){i(r),a.remove()}})},updateEditorOptions(){this.editor.setOptions(this.editorOptions)},async onClickLink(e){const t=await this.rootComponent.showDialog({components:{DitoIcon:Q,href:{type:"url",label:"Link",autofocus:!0},title:{type:"text",label:"Title"}},buttons:{cancel:{},apply:{type:"submit"},remove:{events:{click({dialogComponent:o}){o.resolve(null)}}}},data:se.getMarkAttributes(this.editor.state,"link")});if(t){let{href:o,title:s}=t;if(o)try{new URL(o)}catch{o=`https://${o}`}e.commands.setLink({href:o,title:s})}else t===null&&e.commands.unsetLink()},getExtensions(){const{marks:e={},nodes:t={},tools:o={}}=this.schema;return[o.footnotes?nt.Document.extend({content:"block+ footnotes?"}):nt.Document,Tn.Text,Kn.Paragraph,e.bold&&Ln.Bold,e.italic&&In.Italic,e.underline&&An.Underline,e.strike&&Rn.Strike,e.small&&Ld,e.code&&Fn.Code,e.subscript&&zn.Superscript,e.superscript&&jn.Subscript,e.link&&Fd,t.blockquote&&qn.Blockquote,t.codeBlock&&Un.CodeBlock,t.heading&&Wn.Heading.configure({levels:t.heading}),t.horizontalRule&&Yn.HorizontalRule,(t.orderedList||t.bulletList)&&Qn.ListItem,t.bulletList&&Gn.BulletList,t.orderedList&&Jn.OrderedList,...o.footnotes?[Se.Footnotes,Se.Footnote,Se.FootnoteReference]:[],o.history&&Xn.History,Hn.HardBreak.extend({addKeyboardShortcuts:()=>{const s=()=>this.editor.commands.setHardBreak();return{"Mod-Enter":s,"Shift-Enter":s,...this.hardBreak?{Enter:s}:null}}})].filter(s=>!!s)},getButtons(e,t){const o=[],{commands:s}=this.editor,i=({name:r,icon:l,command:d,attributes:c,onClick:p})=>{o.push({name:r,icon:l,isActive:this.editor.isActive(r,c),onClick:()=>{d??=r in s?r:`toggle${h.camelize(r,!0)}`,d in s&&(p?p(this.editor,c):(m=>this.editor.chain()[d](m).focus().run())(c))}})},a=this.schema[e];if(a)for(const[r,l]of Object.entries(t)){const d=["undo","redo"].includes(r)?"history":r,c=a[d],p=h.hyphenate(r);if(c){if(l===!0)i({name:r,icon:p});else if(h.isObject(l)){const{command:u,attribute:m,values:f,onClick:g}=l;if(m){if(h.isArray(f)&&h.isArray(c))for(const k of f)c.includes(k)&&i({name:r,icon:`${p}-${k}`,command:u,attributes:{[m]:k},onClick:g})}else i({name:r,icon:p,command:u,onClick:g})}}}return o},focusElement(){this.editor.commands.focus()},blurElement(){this.editor.commands.blur()}}}),Ld=se.Mark.create({name:"small",parseHTML(){return[{tag:"small"}]},renderHTML(){return["small",0]},addCommands(){return{setSmall:e=>({commands:t})=>t.setMark(this.name,e),toggleSmall:e=>({commands:t})=>t.toggleMark(this.name,e),unsetSmall:()=>({commands:e})=>e.unsetMark(this.name)}}}),Fd=Mn.Link.extend({inclusive:!1,addAttributes(){return{href:{default:null},title:{default:null}}},parseHTML(){return[{tag:"a",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}]},renderHTML({HTMLAttributes:e}){return["a",e,0]}}),Id=y(Td,[["render",Od]]),Md={class:"dito-multiselect"},Rd={class:"dito-multiselect__inner"};function jd(e,t,o,s,i,a){const r=n.resolveComponent("DitoAffixes"),l=n.resolveComponent("VueMultiselect"),d=n.resolveComponent("DitoEditButtons");return n.openBlock(),n.createElementBlock("div",Md,[n.createElementVNode("div",Rd,[n.createVNode(r,{items:e.schema.prefix,position:"prefix",mode:"input",absolute:"",disabled:e.disabled,parentContext:e.context},null,8,["items","disabled","parentContext"]),n.createVNode(l,n.mergeProps({ref:"element",modelValue:e.selectedOptions,"onUpdate:modelValue":t[0]||(t[0]=c=>e.selectedOptions=c),class:e.multiselectClasses,showLabels:!1,placeholder:e.placeholder,tagPlaceholder:"Press enter to add new tag",options:e.populate&&e.activeOptions||[],customLabel:e.getLabelForOption,trackBy:e.optionValue,groupLabel:e.groupByLabel,groupValues:e.groupByOptions,multiple:e.multiple,taggable:e.taggable,searchable:e.searchable,internalSearch:!e.searchFilter,preserveSearch:!!e.searchFilter,clearOnSelect:!e.searchFilter,closeOnSelect:!e.stayOpen,loading:e.isLoading},e.attributes,{onOpen:e.onOpen,onClose:e.onClose,onTag:e.onAddTag,onSearchChange:e.onSearchChange}),null,16,["modelValue","class","placeholder","options","customLabel","trackBy","groupLabel","groupValues","multiple","taggable","searchable","internalSearch","preserveSearch","clearOnSelect","closeOnSelect","loading","onOpen","onClose","onTag","onSearchChange"]),n.createVNode(r,{items:e.schema.suffix,position:"suffix",mode:"input",absolute:"",clearable:e.showClearButton,disabled:e.disabled,inlineInfo:e.inlineInfo,parentContext:e.context,onClear:e.clear},null,8,["items","clearable","disabled","inlineInfo","parentContext","onClear"])]),e.editable?(n.openBlock(),n.createBlock(d,{key:0,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:!1,editable:e.editable,editPath:e.editPath},null,8,["schema","dataPath","data","meta","store","editable","editPath"])):n.createCommentVNode("",!0)])}const zd=B.register("multiselect",{mixins:[ke],components:{DitoAffixes:I,VueMultiselect:Zn},data(){return{searchedOptions:null,populate:!1}},computed:{selectedOptions:{get(){return this.multiple?(this.selectedValue||[]).map(e=>this.getOptionForValue(e)||this.addTagOption(e)).filter(Boolean):this.selectedOption},set(e){this.selectedValue=this.multiple?(e||[]).map(t=>this.getValueForOption(t)):this.getValueForOption(e),this.onChange()}},activeOptions(){return this.searchedOptions||this.options},multiple:b("multiple",{type:Boolean,default:!1}),searchable:b("searchable",{type:Boolean,default:!1}),taggable:b("taggable",{type:Boolean,default:!1}),stayOpen:b("stayOpen",{type:Boolean,default:!1}),multiselectClasses(){const e="multiselect";return{[`${e}--multiple`]:this.multiple,[`${e}--loading`]:this.isLoading,[`${e}--highlight`]:this.showHighlight}},placeholder(){let{placeholder:e,searchable:t,taggable:o}=this.schema;return h.isBoolean(e)&&(e=e?void 0:null),e===void 0?t&&o?`Search or add a ${this.label}`:t?`Select or search ${this.label}`:void 0:e},showHighlight(){return this.isMounted&&this.$refs.element.pointerDirty}},mounted(){this.autofocus&&this.focus()},methods:{addTagOption(e){if(this.taggable){const{optionLabel:t,optionValue:o}=this,s=t&&o?{[t]:e,[o]:e}:e;return this.options.push(s),s}},focusElement(){this.$refs.element.activate()},blurElement(){this.$refs.element.deactivate()},onOpen(){this.populate=!0},onClose(){this.focused&&this.onBlur()},onBlur(){this.$refs.element.isOpen||Oe.methods.onBlur.call(this)},onAddTag(e){const t=this.addTagOption(e);t&&(this.value??=[],this.value.push(this.getValueForOption(t)))},async onSearchChange(e){this.searchFilter&&(e?(this.searchedOptions=[],this.searchedOptions=await this.resolveData(()=>this.searchFilter(new S(this,{searchTerm:e})))):this.searchedOptions=null)}}}),Ad=y(zd,[["render",jd]]),xe={computed:{inputValue:{get(){return this.value!==null?this.value:""},set(e){this.value=e!==""?this.isInteger?Number(e):parseFloat(e):null}},isInteger(){return!1},stepValue(){return this.step==null&&!this.isInteger?"any":this.step},decimals:b("decimals",{type:Number}),step:b("step",{type:Number,get(e){return this.isInteger&&e!=null?Math.ceil(e):e}}),min:b("min",{type:Number,get(e){return e=e===void 0?this.getSchemaValue("range",{type:Array})?.[0]:e,this.isInteger&&e!=null?Math.floor(e):e}}),max:b("max",{type:Number,get(e){return e=e===void 0?this.getSchemaValue("range",{type:Array})?.[1]:e,this.isInteger&&e!=null?Math.ceil(e):e}}),range:b("range",{type:Array,get(){const{min:e,max:t}=this;return e!=null&&t!=null?[e,t]:void 0},set(e){h.isArray(e)&&([this.min,this.max]=e)}})},methods:{getValidations(){const e={},{range:t,min:o,max:s,decimals:i,step:a}=this;if(t?e.range=t:(o!=null&&(e.min=o),s!=null&&(e.max=s)),i!=null)e.decimals=i;else if(a){const r=(`${a}`.split(".")[1]||"").length;r>0?e.decimals=r:e.integer=!0}return this.isInteger&&(e.integer=!0),e}}};function qd(e,t,o,s,i,a){const r=n.resolveComponent("DitoAffixes"),l=n.resolveComponent("DitoInput");return n.openBlock(),n.createBlock(l,n.mergeProps({class:"dito-number",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[0]||(t[0]=d=>e.inputValue=d),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),{prefix:n.withCtx(()=>[n.createVNode(r,{items:e.schema.prefix,position:"prefix",mode:"input",disabled:e.disabled,parentContext:e.context},null,8,["items","disabled","parentContext"])]),suffix:n.withCtx(()=>[n.createVNode(r,{items:e.schema.suffix,position:"suffix",mode:"input",clearable:e.showClearButton,disabled:e.disabled,inlineInfo:e.inlineInfo,parentContext:e.context,onClear:e.clear},null,8,["items","clearable","disabled","inlineInfo","parentContext","onClear"])]),_:1},16,["id","modelValue","min","max","step"])}const Ud=B.register(["number","integer"],{mixins:[xe],components:{DitoInput:U,DitoAffixes:I},nativeField:!0,textField:!0,computed:{isInteger(){return this.type==="integer"}}}),Hd=y(Ud,[["render",qd]]),Wd=["id"],Kd={key:0,class:"dito-object-content"},Yd=["innerHTML"],Jd=["innerHTML"];function Gd(e,t,o,s,i,a){const r=n.resolveComponent("DitoSchemaInlined"),l=n.resolveComponent("DitoEditButtons");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-object",id:e.dataPath},[e.objectData?(n.openBlock(),n.createElementBlock("div",Kd,[e.isInlined?(n.openBlock(),n.createBlock(r,{key:0,label:e.objectLabel,schema:e.getItemFormSchema(e.schema,e.objectData,e.context),dataPath:e.dataPath,data:e.objectData,meta:e.nestedMeta,store:e.store,disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible,deletable:e.objectData&&e.deletable,editable:e.objectData&&e.editable,editPath:e.path,accumulatedBasis:e.accumulatedBasis,onDelete:t[0]||(t[0]=d=>e.deleteItem(e.objectData))},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible","deletable","editable","editPath","accumulatedBasis"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.dataPath,data:e.objectData,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext())},null,8,Yd)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,e.objectData)},null,8,Jd))])):n.createCommentVNode("",!0),n.createVNode(l,{buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.objectData,path:e.path,meta:e.meta,store:e.store,disabled:e.disabled||e.isLoading,creatable:e.creatable,createPath:e.createPath},null,8,["buttons","schema","dataPath","data","path","meta","store","disabled","creatable","createPath"])],8,Wd)):n.createCommentVNode("",!0)}const Qd=B.register("object",{mixins:[Z],getSourceType(e){return e},computed:{objectLabel(){return this.collapsible?this.getItemLabel(this.schema,this.objectData,{asObject:!0}):null}},methods:{getContext(){return new S(this,{data:this.objectData})}},async processSchema(e,t,o,s,i,a=!1,r=!1,l=null){await Promise.all([de(t),Z.processSchema(e,t,o,s,i,a,r,l)])}}),Xd=y(Qd,[["render",Gd]]),Zd=B.register("panel",{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,omitSpacing:!0,getPanelSchema(e,t){const{name:o,...s}=t;return s}}),_d=["id","value","max"];function xd(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("progress",n.mergeProps({class:"dito-progress",id:e.dataPath,ref:"element",value:e.progressValue,max:e.progressMax},e.attributes),null,16,_d)}const vd=B.register("progress",{mixins:[xe],computed:{progressValue(){let{value:e,range:t,step:o}=this;return e!==null?(t&&(e-=t[0]),o&&(e=Math.round(e/o)*o)):e="",e},progressMax(){const{range:e}=this;return e?e[1]-e[0]:null}}}),ec=y(vd,[["render",xd]]),tc=["id"],nc=["value"];function oc(e,t,o,s,i,a){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-radio-buttons",`dito-layout--${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-radio-button",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedValue=l),type:"radio",value:e.getValueForOption(r)},{ref_for:!0},e.attributes),null,16,nc),[[n.vModelRadio,e.selectedValue]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,tc)}const sc=B.register("radio",{mixins:[ke],nativeField:!0,defaultWidth:"auto"}),ac=y(sc,[["render",oc]]);function ic(e,t,o,s,i,a){const r=n.resolveComponent("DitoSchemaInlined");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-section",{"dito-section--labelled":e.hasLabel}])},[n.createVNode(r,{class:"dito-section__schema",schema:e.getItemFormSchema(e.schema,e.item,e.context),dataPath:e.dataPath,data:e.item,meta:e.meta,store:e.store,label:e.label,info:e.info,padding:e.hasLabel?"nested":"inlined",disabled:e.disabled,collapsed:e.collapsed,collapsible:e.collapsible,labelNode:e.labelNode},null,8,["schema","dataPath","data","meta","store","label","info","padding","disabled","collapsed","collapsible","labelNode"])],2)}const rc=B.register("section",{defaultValue:()=>{},ignoreMissingValue:({schema:e})=>!e.nested&&!("default"in e),defaultNested:!1,generateLabel:!1,computed:{item(){return this.nested?this.value:this.data},hasLabel(){return!!this.schema.label},collapsible:b("collapsible",{type:Boolean,default:!1}),collapsed:b("collapsed",{type:Boolean,default:!1,get(e){return e&&this.collapsible}})},methods:{getItemFormSchema:je},async processSchema(e,t,o,s,i){await x(e,t,s,i)}}),lc=y(rc,[["render",ic]]),dc={class:"dito-select"},cc={class:"dito-select__inner"},hc=["id"],pc=["label"],uc=["value"],mc=["value"],fc=["value"];function gc(e,t,o,s,i,a){const r=n.resolveComponent("DitoAffixes"),l=n.resolveComponent("DitoEditButtons");return n.openBlock(),n.createElementBlock("div",dc,[n.createElementVNode("div",cc,[n.createVNode(r,{items:e.schema.prefix,position:"prefix",mode:"input",absolute:"",disabled:e.disabled,parentContext:e.context},null,8,["items","disabled","parentContext"]),n.withDirectives(n.createElementVNode("select",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=d=>e.selectedValue=d)},e.attributes,{onMousedown:t[1]||(t[1]=d=>e.populate=!0),onFocus:t[2]||(t[2]=d=>e.populate=!0)}),[e.populate?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.options,d=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.groupBy?(n.openBlock(),n.createElementBlock("optgroup",{key:0,label:d[e.groupByLabel]},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(d[e.groupByOptions],c=>(n.openBlock(),n.createElementBlock("option",{value:e.getValueForOption(c)},n.toDisplayString(e.getLabelForOption(c)),9,uc))),256))],8,pc)):(n.openBlock(),n.createElementBlock("option",{key:1,value:e.getValueForOption(d)},n.toDisplayString(e.getLabelForOption(d)),9,mc))],64))),256)):e.selectedOption?(n.openBlock(),n.createElementBlock("option",{key:1,value:e.selectedValue},n.toDisplayString(e.getLabelForOption(e.selectedOption)),9,fc)):n.createCommentVNode("",!0)],16,hc),[[n.vModelSelect,e.selectedValue]]),n.createVNode(r,{items:e.schema.suffix,position:"suffix",mode:"input",absolute:"",clearable:e.showClearButton,disabled:e.disabled,inlineInfo:e.inlineInfo,parentContext:e.context,onClear:e.clear},null,8,["items","clearable","disabled","inlineInfo","parentContext","onClear"])]),e.editable?(n.openBlock(),n.createBlock(l,{key:0,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:!1,editable:e.editable,editPath:e.editPath},null,8,["schema","dataPath","data","meta","store","editable","editPath"])):n.createCommentVNode("",!0)])}const bc=B.register("select",{mixins:[ke],components:{DitoAffixes:I},nativeField:!0,data(){return{populate:!0}}}),yc=y(bc,[["render",gc]]),kc={class:"dito-slider"},Cc=["id","min","max","step"];function $c(e,t,o,s,i,a){const r=n.resolveComponent("DitoInput");return n.openBlock(),n.createElementBlock("div",kc,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-range",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"range"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,Cc),[[n.vModelText,e.inputValue]]),e.input?(n.openBlock(),n.createBlock(r,n.mergeProps({key:0,class:"dito-number",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["modelValue","min","max","step"])):n.createCommentVNode("",!0)])}const Dc=B.register("slider",{mixins:[xe],components:{DitoInput:U},nativeField:!0,computed:{input:b("input",{type:Boolean,default:!0})}}),Bc=y(Dc,[["render",$c]]);function wc(e,t,o,s,i,a){return null}const Sc=B.register("spacer",{defaultValue:()=>{},excludeValue:!0,generateLabel:!1}),Vc=y(Sc,[["render",wc]]);function Pc(e,t,o,s,i,a){const r=n.resolveComponent("DitoSwitch");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-switch",id:e.dataPath,ref:"element",modelValue:e.value,"onUpdate:modelValue":t[0]||(t[0]=l=>e.value=l),labels:e.labels},e.attributes),null,16,["id","modelValue","labels"])}const Ec=B.register("switch",{defaultValue:!1,defaultWidth:"auto",components:{DitoSwitch:_s},computed:{labels(){return this.schema.labels}}}),Nc=y(Ec,[["render",Pc]]),Bn={computed:{trim:b("trim",{type:Boolean,default:!1})},processValue(e){let{schema:t,value:o}=e;return t.trim&&o!=null&&h.isString(o)&&(o=o.trim()),o===""&&(o=Ue(t,e)),o}};function Oc(e,t,o,s,i,a){const r=n.resolveComponent("DitoAffixes"),l=n.resolveComponent("DitoInput");return n.openBlock(),n.createBlock(l,n.mergeProps({class:"dito-text",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[0]||(t[0]=d=>e.inputValue=d),type:e.inputType},e.attributes),{prefix:n.withCtx(()=>[n.createVNode(r,{items:e.schema.prefix,position:"prefix",mode:"input",disabled:e.disabled,parentContext:e.context},null,8,["items","disabled","parentContext"])]),suffix:n.withCtx(()=>[n.createVNode(r,{items:e.schema.suffix,position:"suffix",mode:"input",clearable:e.showClearButton,disabled:e.disabled,inlineInfo:e.inlineInfo,parentContext:e.context,onClear:e.clear},null,8,["items","clearable","disabled","inlineInfo","parentContext","onClear"])]),_:1},16,["id","modelValue","type"])}const Tc="****************",Lc=B.register(["text","email","url","hostname","domain","tel","password","creditcard"],{mixins:[Bn],components:{DitoInput:U,DitoAffixes:I},nativeField:!0,textField:!0,ignoreMissingValue:({schema:e})=>e.type==="password",computed:{inputType(){return{creditcard:"text",hostname:"text",domain:"text"}[this.type]||this.type},inputValue:{get(){return this.type==="password"&&this.value===void 0&&!this.focused?Tc:this.value},set(e){this.value=e}}},methods:{getValidations(){const e={email:"email",url:"url",hostname:"hostname",domain:"domain",password:"password",creditcard:"creditcard"}[this.type];return e?{[e]:!0}:{}}}}),Fc=y(Lc,[["render",Oc]]),Ic=["id","rows"];function Mc(e,t,o,s,i,a){return n.withDirectives((n.openBlock(),n.createElementBlock("textarea",n.mergeProps({class:"dito-textarea dito-input",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r)},e.attributes,{rows:e.lines,class:{"dito-textarea--resizable":e.resizable}}),null,16,Ic)),[[n.vModelText,e.value]])}const Rc=B.register("textarea",{mixins:[Bn],nativeField:!0,textField:!0,computed:{lines(){return this.schema.lines||4},resizable:b("resizable",{type:Boolean,default:!1})}}),jc=y(Rc,[["render",Mc]]),zc={class:"dito-tree-list"},Ac={class:"dito-tree-panel"},qc={key:0,class:"dito-tree-form-container"};function Uc(e,t,o,s,i,a){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoTreeItem"),d=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",zc,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):n.createCommentVNode("",!0),n.createElementVNode("div",Ac,[n.createVNode(l,{schema:e.treeSchema,dataPath:e.treeDataPath,data:e.treeData,draggable:e.draggable,open:!0,"onUpdate:data":t[0]||(t[0]=c=>e.value=c)},null,8,["schema","dataPath","data","draggable"]),e.editPath&&e.hasEditableForms?(n.openBlock(),n.createElementBlock("div",qc,[n.createVNode(d)])):n.createCommentVNode("",!0)])])}const Hc=B.register(["tree-list","tree-object"],{mixins:[Z],provide(){return{container:this}},getSourceType(e){return e==="tree-object"?"object":"list"},computed:{path(){return this.formComponent?.path},editPath(){const e=this.$route.path.slice(this.path?.length);return e.startsWith(`/${this.schema.path}`)?e:""},treeData(){return this.isListSource?{[this.name]:this.value}:this.value},treeDataPath(){return this.isListSource?this.dataPath.slice(0,this.dataPath.length-this.name.length):this.dataPath},treeSchema(){return this.isListSource?{children:{name:this.name,...this.schema}}:this.schema},hasEditableForms(){const e=t=>q(t)&&(this.getSchemaValue("editable",{type:Boolean,default:!1,schema:t})||t.children&&e(t.children));return e(this.schema)}},async processSchema(e,t,o,s,i,a=!0,r=!1,l=null){await Promise.all([yt(t.properties),Z.processSchema(e,t,o,s,i,a,r,(d,c)=>{const{children:p}=t;if(p)return p.type="tree-list",this.processSchema(e,p,p.name,d,c,a,!0,l)})])},getFormSchemasForProcessing(e,t){const{children:o}=e;return Y(e,t,o?s=>({...s,components:{...s.components,[o.name]:o}}):null)}}),Wc=y(Hc,[["render",Uc]]);function wn(e){return xn.filesize(e,{base:10})}const Kc={class:"dito-upload"},Yc={class:"dito-table dito-table--separators dito-table--background"},Jc=["innerHTML"],Gc={key:1},Qc=["download","href","onClick"],Xc={key:2},Zc={class:"dito-upload__size"},_c={class:"dito-upload__status"},xc={class:"dito-table__buttons"},vc={class:"dito-buttons dito-buttons--round"},eh=["title"],th=["onClick"],nh={key:0},oh={colspan:4},sh={class:"dito-upload-footer"},ah=["value"],ih={class:"dito-buttons dito-buttons--round"},rh=["title"];function lh(e,t,o,s,i,a){const r=n.resolveComponent("VueUpload"),l=n.resolveComponent("DitoUploadFile"),d=n.resolveComponent("DitoDraggable");return n.openBlock(),n.createElementBlock("div",Kc,[n.createVNode(r,{class:"dito-upload__input",ref:"upload",modelValue:e.uploads,"onUpdate:modelValue":t[0]||(t[0]=c=>e.uploads=c),inputId:e.dataPath,name:e.dataPath,disabled:e.disabled,postAction:e.uploadPath,extensions:e.extensions,accept:e.accept,multiple:e.multiple,size:e.maxSize,drop:e.$el?.closest(".dito-container"),dropDirectory:!0,onInputFilter:e.onInputFilter,onInputFile:e.onInputFile},null,8,["modelValue","inputId","name","disabled","postAction","extensions","accept","multiple","size","drop","onInputFilter","onInputFile"]),n.createElementVNode("table",Yc,[t[5]||(t[5]=n.createElementVNode("thead",{class:"dito-table-head"},[n.createElementVNode("tr",null,[n.createElementVNode("th",null,[n.createElementVNode("span",null,"File")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Size")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Status")]),n.createElementVNode("th",null,[n.createElementVNode("span")])])],-1)),n.createVNode(d,{modelValue:e.files,"onUpdate:modelValue":t[2]||(t[2]=c=>e.files=c),as:"tbody",options:e.getDraggableOptions(),draggable:e.draggable},{default:n.withCtx(()=>[e.multiple||!e.isUploadActive?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.files,(c,p)=>(n.openBlock(),n.createElementBlock("tr",{key:c.name},[e.render?(n.openBlock(),n.createElementBlock("td",{key:0,innerHTML:e.renderFile(c,p)},null,8,Jc)):e.downloadUrls[p]?(n.openBlock(),n.createElementBlock("td",Gc,[n.createElementVNode("a",{download:c.name,href:e.downloadUrls[p],target:"_blank",onClick:n.withModifiers(u=>e.onClickDownload(c,p),["prevent"])},[n.createVNode(l,{file:c,thumbnail:e.thumbnails,thumbnailUrl:e.thumbnailUrls[p]},null,8,["file","thumbnail","thumbnailUrl"])],8,Qc)])):(n.openBlock(),n.createElementBlock("td",Xc,[n.createVNode(l,{file:c,thumbnail:e.thumbnails,thumbnailUrl:e.thumbnailUrls[p]},null,8,["file","thumbnail","thumbnailUrl"])])),n.createElementVNode("td",Zc,n.toDisplayString(e.formatFileSize(c.size)),1),n.createElementVNode("td",_c,[c.upload?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[c.upload.error?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode("Error: "+n.toDisplayString(c.upload.error),1)],64)):c.upload.active?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Uploading...")],64)):c.upload.success?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createTextVNode("Uploaded")],64)):n.createCommentVNode("",!0)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Stored")],64))]),n.createElementVNode("td",xc,[n.createElementVNode("div",vc,[e.multiple?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button dito-button--upload",title:e.uploadTitle,onClick:t[1]||(t[1]=(...u)=>e.onClickUpload&&e.onClickUpload(...u))},null,8,eh)),e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:1,class:"dito-button"},{ref_for:!0},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:2,class:"dito-button",type:"button"},{ref_for:!0},e.getButtonAttributes(e.verbs.delete),{onClick:u=>e.deleteFile(c,p)}),null,16,th)):n.createCommentVNode("",!0)])])]))),128)):n.createCommentVNode("",!0)]),_:1},8,["modelValue","options","draggable"]),e.multiple||e.isUploadActive||!e.hasFiles?(n.openBlock(),n.createElementBlock("tfoot",nh,[n.createElementVNode("tr",null,[n.createElementVNode("td",oh,[n.createElementVNode("div",sh,[e.isUploadActive?(n.openBlock(),n.createElementBlock("progress",{key:0,class:"dito-progress",value:e.uploadProgress,max:"100"},null,8,ah)):n.createCommentVNode("",!0),n.createElementVNode("div",ih,[e.isUploadActive?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button",type:"button",onClick:t[3]||(t[3]=n.withModifiers(c=>e.upload.active=!1,["prevent"]))},"Cancel")):n.createCommentVNode("",!0),e.multiple||!e.hasFiles?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button dito-button--upload",title:e.uploadTitle,onClick:t[4]||(t[4]=(...c)=>e.onClickUpload&&e.onClickUpload(...c))},null,8,rh)):n.createCommentVNode("",!0)])])])])])):n.createCommentVNode("",!0)])])}const dh=B.register("upload",{mixins:[ye],components:{VueUpload:vn},data(){return{uploads:[]}},computed:{upload(){return this.$refs.upload},uploadTitle(){return this.multiple?"Upload Files":"Upload File"},files(){return Sn(this.value)},downloadUrls(){return this.files.map((e,t)=>this.getDownloadUrl(e,t))},thumbnailUrls(){return this.files.map((e,t)=>this.getThumbnailUrl(e,t))},multiple:b("multiple",{type:Boolean,default:!1,callback:!1}),extensions:b("extensions",{type:[Array,String,RegExp]}),accept:b("accept",{type:Array,get(e){return h.isArray(e)?e.join(","):e}}),maxSize:b("maxSize",{type:[String,Number],get(e){return e?_n(e):void 0}}),draggable:b("draggable",{type:Boolean,default:!1,get(e){return e&&this.files.length>1}}),deletable:b("deletable",{type:Boolean,default:!1}),render:b("render",{type:Function,default:null}),thumbnails:b("thumbnails",{type:[Boolean,String],default(e){return e??!!this.schema.thumbnailUrl},get(e){return e===!0?"medium":e||null}}),hasFiles(){return this.files.length>0},hasUploads(){return this.uploads.length>0},isUploadReady(){return this.hasUploads&&!(this.upload.active||this.upload.uploaded)},isUploadActive(){return this.hasUploads&&this.upload.active},uploadProgress(){return this.uploads.reduce((e,t)=>e+ +t.progress,0)/this.uploads.length},uploadPath(){return this.getResourceUrl({type:"upload",method:"post",path:this.api.normalizePath(this.dataPath)})}},watch:{isUploadReady(e){e&&this.$nextTick(()=>{this.upload.active=!0})}},methods:{formatFileSize:wn,getFileContext(e,t){return this.multiple?new S(this,{value:e,data:this.files,index:t,dataPath:O(this.dataPath,t)}):this.context},renderFile(e,t){return this.render(this.getFileContext(e,t))},getDownloadUrl(e,t){return e.url?e.url:!e.upload||e.upload.success?this.getSchemaValue("downloadUrl",{type:"String",default:null,context:this.getFileContext(e,t)}):null},getThumbnailUrl(e,t){return!e.upload||e.upload.success?this.getSchemaValue("thumbnailUrl",{type:"String",default:null,context:this.getFileContext(e,t)})||(e.type.startsWith("image/")?e.url:null):null},deleteFile(e,t){const{name:o}=e;e&&window.confirm(`Do you really want to ${this.verbs.remove} ${o}?`)&&(this.multiple?this.value.splice(t,1):this.value=null,e.upload&&this.upload.remove(e.upload),this.onChange(),this.notify({type:"info",title:"Successfully Removed",text:`${o} was ${this.verbs.deleted}.`}))},getFileIndex(e){return this.multiple&&this.value?this.value.findIndex(t=>t.id===e.id):-1},addFile(e){this.multiple?this.value?this.value.push(e):this.value=[e]:this.value=e},replaceFile(e,t){if(this.multiple){const o=this.getFileIndex(e);o>=0&&(t?this.value[o]=t:this.value.splice(o,1))}else this.value=t},removeFile(e){this.replaceFile(e,null)},onInputFile(e,t){if(e&&!t){const{id:o,name:s,size:i}=e;this.addFile({id:o,name:s,size:i,upload:e})}if(e&&t){const{success:o,error:s}=e;if(o){this.onChange();const i=e.response[0];i?(i.upload=e,this.replaceFile(e,i)):this.removeFile(e)}else if(s){this.removeFile(e);const i={abort:"Upload aborted",denied:"Upload denied",extension:`Unsupported file-type: ${e.name}`,network:"Network error encountered during upload",server:"Server error occurred during upload",size:`File is too large: ${wn(e.size)}`,timeout:"Timeout occurred during upload"}[s]||`Unknown File Upload Error: '${s}'`;this.notify({type:"error",error:s,title:"File Upload Error",text:i})}}},onInputFilter(e){const t=e?.xhr;this.api.cors?.credentials&&t&&!t.withCredentials&&(t.withCredentials=!0)},async onClickDownload(e,t){try{const s=await(await fetch(this.downloadUrls[t])).blob();this.download({filename:e.name,url:URL.createObjectURL(s)})}catch(o){console.error(o)}},onClickUpload(e){this.upload.$el.querySelector("input").dispatchEvent(new e.constructor(e.type,e))}},processValue({schema:e,value:t}){const o=Sn(t).map(({upload:s,...i})=>!s||s.success?i:null).filter(s=>s);return e.multiple?o:o[0]||null}});function Sn(e){return e?h.asArray(e):[]}const ch=Object.freeze(Object.defineProperty({__proto__:null,DitoDitoTypeComponent:Ql,DitoTypeButton:Dl,DitoTypeCheckbox:Pl,DitoTypeCheckboxes:Fl,DitoTypeCode:zl,DitoTypeColor:Yl,DitoTypeComputed:xl,DitoTypeDate:nd,DitoTypeLabel:Sd,DitoTypeList:Dd,DitoTypeMarkup:Id,DitoTypeMultiselect:Ad,DitoTypeNumber:Hd,DitoTypeObject:Xd,DitoTypePanel:Zd,DitoTypeProgress:ec,DitoTypeRadio:ac,DitoTypeSection:lc,DitoTypeSelect:yc,DitoTypeSlider:Bc,DitoTypeSpacer:Vc,DitoTypeSwitch:Nc,DitoTypeText:Fc,DitoTypeTextarea:jc,DitoTypeTreeList:Wc,DitoTypeUpload:y(dh,[["render",lh]])},Symbol.toStringTag,{value:"Module"})),hh={mounted(e,t){ph(e,t.value,t.arg)},unmounted(e,t){uh(e,t.value,t.arg)}};function ph(e,t,o){$e.getObserver(o).observe(e,t)}function uh(e,t,o){$e.getObserver(o).unobserve(e,t)}const mh=typeof ResizeObserver<"u",ve={};class $e{constructor(t,o){this.key=t,this.options=o,this.observer=mh?new ResizeObserver(s=>this.handle(s)):null,this.handlersByNode=new WeakMap,this.nodeCount=0}observe(t,o){let s=this.handlersByNode.get(t);s||(s=new Set,this.handlersByNode.set(t,s),this.observer?.observe(t,this.options),this.nodeCount++),s.add(o)}unobserve(t,o){const s=this.handlersByNode.get(t);s?.delete(o)&&s.size===0&&(this.handlersByNode.delete(t),this.observer?.unobserve(t),--this.nodeCount===0&&delete ve[this.key])}handle(t){for(const o of t){const s=this.handlersByNode.get(o.target);if(s){const i={target:o.target,contentRect:o.contentRect,borderBoxSize:h.asArray(o.borderBoxSize),contentBoxSize:h.asArray(o.contentBoxSize),devicePixelContentBoxSize:h.asArray(o.devicePixelContentBoxSize)};for(const a of s)a(i)}}}static getObserver({box:t="content-box"}={}){const o={box:t},s=JSON.stringify(o);return ve[s]||=new $e(s,o),ve[s]}}const fh=["create","created","save","saved","apply","applied","submit","submitted","delete","deleted","remove","removed","clear","cleared","edit","edited","close","closed","cancel","cancelled","drag","dragged","login","logged in"].reduce((e,t)=>(e[t]=t,e),{});class gh{constructor(t,{dito:o={},api:s,views:i={},...a}={}){this.el=t,this.api=s=h.assignDeeply({base:"/"},o.api,s),this.options=a,s.locale||="en-US",s.formats=h.assignDeeply({},h.defaultFormats,s.formats),s.request||=d=>yh(s,d),s.getApiUrl||=d=>Ch(s,d),s.isApiUrl||=d=>kh(s,d),s.normalizePath||=s.normalizePaths?h.hyphenate:d=>d,s.denormalizePath||=s.normalizePaths?h.camelize:d=>d,s.defaults||={};const r=F(s.users,{type:"collection"})||{};r.login=F(r.login||"login",{method:"post",parent:r}),r.logout=F(r.logout||"logout",{method:"post",parent:r}),r.session=F(r.session||"session",{method:"get",parent:r}),s.users=r,s.resources={any(d){const c=this[d?.type]||this.default;return d&&c.call(this,d)},default(d){const c=this.any(d.parent);return c?`${c}/${d.path}`:d.path},collection(d){return this.default(d)},member(d){return`${this.default(d)}/${d.id}`},upload(d){return`${this.collection(d.parent)}/upload/${d.path}`},...s.resources},s.headers={"Content-Type":"application/json",...s.headers},h.isString(t)&&(t=document.querySelector(t));const l=this.app=n.createApp({components:{DitoRoot:Xe,VueNotifications:et,...yl,...ch},provide:{api:s,$verbs:()=>fh,$views:()=>{},$isPopulated:()=>!0,$parentComponent:()=>null,$schemaComponent:()=>null,$schemaParentComponent:()=>null,$routeComponent:()=>null,$dataComponent:()=>null,$sourceComponent:()=>null,$resourceComponent:()=>null,$dialogComponent:()=>null,$panelComponent:()=>null,$tabComponent:()=>null},render:()=>n.h(Xe,{ref:"root",class:o.settings.rootClass,unresolvedViews:i,options:a})});l.config.errorHandler=console.error,l.use(et,{componentName:"VueNotifications",name:"notify"}),l.directive("resize",hh),l.use(W.createRouter({routes:[{name:"catch-all",path:"/:_(.*)",components:{}}],history:W.createWebHistory(o.base),linkActiveClass:"",linkExactActiveClass:""})),t.classList.add("dito-app"),l.mount(t)}register(t,o){return B.register(t,o)}}class bh extends Error{constructor(t){super(`Request failed with status code: ${t.status} (${t.statusText})`),this.response=t}}async function yh(e,{url:t,method:o="get",query:s=null,headers:i=null,data:a=null,signal:r=null}){const l=e.isApiUrl(t),d=await fetch(e.getApiUrl({url:t,query:s}),{method:o.toUpperCase(),...a&&{body:JSON.stringify(a)},headers:{...l&&e.headers,...i},credentials:l&&e.cors?.credentials?"include":"same-origin",signal:r});if(d.headers.get("Content-Type")?.includes("application/json")&&(d.data=await d.json()),!d.ok)throw new bh(d);return d}function kh(e,t){return!h.isAbsoluteUrl(t)||t.startsWith(e.url)}function Ch(e,{url:t,query:o}){!t.startsWith(e.url)&&!h.isAbsoluteUrl(t)&&(t=$h(e.url,t));const s=mn(o);return s?`${t}${t.includes("?")?"&":"?"}${s}`:t}function $h(e,t){return`${e.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`}return gh}));
7
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by1hZG1pbi51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9hZ2VudC5qcyIsIi4uL3NyYy9hcHBTdGF0ZS5qcyIsIi4uL3NyYy91dGlscy9kYXRhLmpzIiwiLi4vc3JjL0RpdG9Db250ZXh0LmpzIiwiLi4vc3JjL21peGlucy9FbWl0dGVyTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1ZhbHVlTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL0NvbnRleHRNaXhpbi5qcyIsIi4uL3NyYy92YWxpZGF0b3JzL19jcmVkaXRjYXJkLmpzIiwiLi4vc3JjL3ZhbGlkYXRvcnMvX2RlY2ltYWxzLmpzIiwiLi4vc3JjL3ZhbGlkYXRvcnMvX2RvbWFpbi5qcyIsIi4uL3NyYy92YWxpZGF0b3JzL19lbWFpbC5qcyIsIi4uL3NyYy92YWxpZGF0b3JzL19ob3N0bmFtZS5qcyIsIi4uL3NyYy92YWxpZGF0b3JzL19pbnRlZ2VyLmpzIiwiLi4vc3JjL3ZhbGlkYXRvcnMvX21heC5qcyIsIi4uL3NyYy92YWxpZGF0b3JzL19taW4uanMiLCIuLi9zcmMvdmFsaWRhdG9ycy9fcGFzc3dvcmQuanMiLCIuLi9zcmMvdmFsaWRhdG9ycy9fcmFuZ2UuanMiLCIuLi9zcmMvdmFsaWRhdG9ycy9fcmVxdWlyZWQuanMiLCIuLi9zcmMvdmFsaWRhdG9ycy9fdXJsLmpzIiwiLi4vc3JjL21peGlucy9WYWxpZGF0aW9uTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvYWNjZXNzb3IuanMiLCIuLi9zcmMvbWl4aW5zL1R5cGVNaXhpbi5qcyIsIi4uL3NyYy91dGlscy91aWQuanMiLCIuLi9zcmMvdXRpbHMvU2NoZW1hR3JhcGguanMiLCIuLi9zcmMvdXRpbHMvdHlwZS5qcyIsIi4uL3NyYy91dGlscy9zY2hlbWEuanMiLCIuLi9zcmMvdXRpbHMvcmVzb3VyY2UuanMiLCIuLi9zcmMvbWl4aW5zL0RpdG9NaXhpbi5qcyIsIi4uL3NyYy91dGlscy9vcHRpb25zLmpzIiwiLi4vc3JjL0RpdG9Db21wb25lbnQuanMiLCIuLi8uLi91aS9zcmMvdXRpbHMvdnVlLmpzIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvRGl0b0J1dHRvbi52dWUiLCIuLi8uLi91aS9zcmMvdXRpbHMvZGF0ZS5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0RpdG9DYWxlbmRhci52dWUiLCIuLi8uLi91aS9zcmMvdXRpbHMvZXZlbnQuanMiLCIuLi8uLi91aS9zcmMvdXRpbHMvdHJpZ2dlci5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0RpdG9UcmlnZ2VyLnZ1ZSIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0RpdG9JbnB1dC52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EaXRvSWNvbi52dWUiLCIuLi8uLi91aS9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvRGl0b0RhdGVQaWNrZXIudnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvRGl0b1RpbWVQaWNrZXIudnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvRGl0b0RhdGVUaW1lUGlja2VyLnZ1ZSIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0RpdG9QYWdpbmF0aW9uLnZ1ZSIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0RpdG9Td2l0Y2gudnVlIiwiLi4vLi4vdWkvc3JjL3RyYW5zaXRpb25zL1RyYW5zaXRpb25IZWlnaHQudnVlIiwiLi4vc3JjL21peGlucy9Eb21NaXhpbi5qcyIsIi4uL3NyYy9EaXRvVXNlci5qcyIsIi4uL3NyYy9taXhpbnMvU2NoZW1hUGFyZW50TWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1ZhbGlkYXRvck1peGluLmpzIiwiLi4vc3JjL21peGlucy9Sb3V0ZU1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1ZpZXcudnVlIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWV1c2Uvc2hhcmVkL2Rpc3QvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZXVzZS9jb3JlL2Rpc3QvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZXVzZS9pbnRlZ3JhdGlvbnMvZGlzdC91c2VGb2N1c1RyYXAtbFhaX1lHLTguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZXVzZS9pbnRlZ3JhdGlvbnMvZGlzdC91c2VGb2N1c1RyYXAvY29tcG9uZW50LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0RpYWxvZy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUm9vdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvTWVudS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVHJhaWwudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0hlYWRlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvTmF2aWdhdGlvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvTm90aWZpY2F0aW9ucy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvU2lkZWJhci52dWUiLCIuLi9zcmMvbWl4aW5zL1B1bGxkb3duTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvQWNjb3VudC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvU3Bpbm5lci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvQWZmaXgudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0FmZml4ZXMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0xhYmVsLnZ1ZSIsIi4uL3NyYy9taXhpbnMvSXRlbU1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1NjaGVtYS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvU2NoZW1hSW5saW5lZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFuZS52dWUiLCIuLi9zcmMvdXRpbHMvbWF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Db250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1BhbmVsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9QYW5lbHMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0J1dHRvbnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0VkaXRCdXR0b25zLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9DcmVhdGVCdXR0b24udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0NsaXBib2FyZC52dWUiLCIuLi9zcmMvbWl4aW5zL0xvYWRpbmdNaXhpbi5qcyIsIi4uL3NyYy9taXhpbnMvUmVzb3VyY2VNaXhpbi5qcyIsIi4uL3NyYy91dGlscy9wYXRoLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0Zvcm0udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0Zvcm1Jbm5lci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvRm9ybU5lc3RlZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvRXJyb3JzLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9TY29wZXMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1BhZ2luYXRpb24udnVlIiwiLi4vc3JjL21peGlucy9Tb3J0YWJsZU1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RyZWVJdGVtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9UYWJsZUhlYWQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYmxlQ2VsbC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVXBsb2FkRmlsZS52dWUiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZXVzZS9pbnRlZ3JhdGlvbnMvZGlzdC91c2VTb3J0YWJsZS1DYzVMS2JERC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy9kaXN0L3VzZVNvcnRhYmxlL2NvbXBvbmVudC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9EcmFnZ2FibGUudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1ZOb2RlLnZ1ZSIsIi4uL3NyYy9EaXRvVHlwZUNvbXBvbmVudC5qcyIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUJ1dHRvbi52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDaGVja2JveC52dWUiLCIuLi9zcmMvbWl4aW5zL0RhdGFNaXhpbi5qcyIsIi4uL3NyYy9taXhpbnMvT3B0aW9uc01peGluLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ2hlY2tib3hlcy52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDb2RlLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvbG9yLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvbXBvbmVudC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDb21wdXRlZC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVEYXRlLnZ1ZSIsIi4uL3NyYy91dGlscy9yb3V0ZS5qcyIsIi4uL3NyYy9taXhpbnMvU291cmNlTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvZmlsdGVyLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlTGlzdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVMYWJlbC52dWUiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItbW9kZWwvZGlzdC9pbmRleC5qcyIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU1hcmt1cC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVNdWx0aXNlbGVjdC52dWUiLCIuLi9zcmMvbWl4aW5zL051bWJlck1peGluLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlTnVtYmVyLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU9iamVjdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVQYW5lbC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVQcm9ncmVzcy52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVSYWRpby52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTZWN0aW9uLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVNlbGVjdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTbGlkZXIudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlU3BhY2VyLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVN3aXRjaC52dWUiLCIuLi9zcmMvbWl4aW5zL1RleHRNaXhpbi5qcyIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVRleHQudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVGV4dGFyZWEudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVHJlZUxpc3QudnVlIiwiLi4vc3JjL3V0aWxzL3VuaXRzLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVXBsb2FkLnZ1ZSIsIi4uL3NyYy9kaXJlY3RpdmVzL3Jlc2l6ZS5qcyIsIi4uL3NyYy92ZXJicy5qcyIsIi4uL3NyYy9EaXRvQWRtaW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyB1c2VyLWFnZW50IHBhcnNlciB3YXMgbGlmdGVkIGZyb20gUGFwZXIuanM6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vcGFwZXJqcy9wYXBlci5qcy9ibG9iL2NjMTU2OTY3NTAwMzVhYjAwZTAwYzY0YzdjOTVkYWEyYzg1ZWZlMDEvc3JjL2NvcmUvUGFwZXJTY29wZS5qcyNMNzUtTDEwN1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVc2VyQWdlbnQodXNlckFnZW50ID0gJycpIHtcbiAgY29uc3QgYWdlbnQgPSB7fVxuICAvLyBVc2UgcmVwbGFjZSgpIHRvIGdldCBhbGwgbWF0Y2hlcywgYW5kIGRlYWwgd2l0aCBDaHJvbWUvV2Via2l0IG92ZXJsYXA6XG4gIGNvbnN0IHVhID0gdXNlckFnZW50LnRvTG93ZXJDYXNlKClcbiAgY29uc3QgW29zXSA9XG4gICAgLyhpcGhvbmV8aXBhZHxsaW51eDsgYW5kcm9pZHxkYXJ3aW58d2lufG1hY3xsaW51eHxmcmVlYnNkfHN1bm9zKS8uZXhlYyhcbiAgICAgIHVhXG4gICAgKSB8fCBbXVxuICBjb25zdCBwbGF0Zm9ybSA9IChcbiAgICB7XG4gICAgICAnZGFyd2luJzogJ21hYycsXG4gICAgICAnaXBob25lJzogJ2lvcycsXG4gICAgICAnaXBhZCc6ICdpb3MnLFxuICAgICAgJ2xpbnV4OyBhbmRyb2lkJzogJ2FuZHJvaWQnXG4gICAgfVtvc10gfHxcbiAgICBvc1xuICApXG4gIGlmIChwbGF0Zm9ybSkge1xuICAgIGFnZW50LnBsYXRmb3JtID0gcGxhdGZvcm1cbiAgICBhZ2VudFtwbGF0Zm9ybV0gPSB0cnVlXG4gIH1cbiAgdWEucmVwbGFjZShcbiAgICAvKG9wZXJhfGNocm9tZXxzYWZhcml8d2Via2l0fGZpcmVmb3h8bXNpZXx0cmlkZW50KVxcLz9cXHMqKFsuXFxkXSspKD86Lip2ZXJzaW9uXFwvKFsuXFxkXSspKT8oPzouKnJ2OnY/KFsuXFxkXSspKT8vZyxcbiAgICAobWF0Y2gsIGJyb3dzZXIsIHYxLCB2MiwgcnYpID0+IHtcbiAgICAgIC8vIERvIG5vdCBzZXQgYWRkaXRpb25hbCBicm93c2VycyBvbmNlIGNocm9tZSBpcyBkZXRlY3RlZC5cbiAgICAgIGlmICghYWdlbnQuY2hyb21lKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBydiB8fCB2MiB8fCB2MVxuICAgICAgICBpZiAoIWFnZW50LnZlcnNpb24gfHwgYnJvd3NlciAhPT0gJ3NhZmFyaScpIHtcbiAgICAgICAgICAvLyBVc2UgdGhlIHZlcnNpb24gd2UgZ2V0IGZvciB3ZWJraXQgZm9yIFNhZmFyaSwgd2hpY2ggaXMgYWN0dWFsbHlcbiAgICAgICAgICAvLyBUaGUgU2FmYXJpIHZlcnNpb24sIGUuZy4gMTYuMFxuICAgICAgICAgIGFnZW50LnZlcnNpb24gPSB2ZXJzaW9uXG4gICAgICAgICAgYWdlbnQudmVyc2lvbk51bWJlciA9IHBhcnNlRmxvYXQodmVyc2lvbilcbiAgICAgICAgfVxuICAgICAgICBhZ2VudC5icm93c2VyID0gYnJvd3NlclxuICAgICAgICBhZ2VudFticm93c2VyXSA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIClcbiAgaWYgKGFnZW50LmNocm9tZSkge1xuICAgIC8vIENhbid0IGhhdmUgaXQgYm90aCB3YXlzLCBDaHJvbWUuXG4gICAgZGVsZXRlIGFnZW50LndlYmtpdFxuICB9XG4gIHJldHVybiBhZ2VudFxufVxuIiwiaW1wb3J0IHsgcmVhY3RpdmUgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBwYXJzZVVzZXJBZ2VudCB9IGZyb20gJy4vdXRpbHMvYWdlbnQnXG5cbmV4cG9ydCBkZWZhdWx0IHJlYWN0aXZlKHtcbiAgdGl0bGU6ICcnLFxuICByb3V0ZUNvbXBvbmVudHM6IFtdLFxuICB1c2VyOiBudWxsLFxuICBhZ2VudDogcGFyc2VVc2VyQWdlbnQobmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJyksXG4gIGxvYWRDYWNoZToge30sIC8vIFNlZSBUeXBlTWl4aW4ubG9hZCgpXG4gIGFjdGl2ZUxhYmVsOiBudWxsLFxuICBjbGlwYm9hcmREYXRhOiBudWxsXG59KVxuIiwiaW1wb3J0IHtcbiAgaXNJbnRlZ2VyLFxuICBwYXJzZURhdGFQYXRoLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgdG9rZW4pIHtcbiAgcmV0dXJuIGRhdGFQYXRoXG4gICAgPyBgJHtkYXRhUGF0aH0vJHt0b2tlbn1gXG4gICAgOiB0b2tlblxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXJlbnREYXRhUGF0aChkYXRhUGF0aCkge1xuICBjb25zdCBwYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgcGF0aD8ucG9wKClcbiAgcmV0dXJuIHBhdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSB7XG4gIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICByZXR1cm4gbmVzdGVkID8gcGFyc2VQYXJlbnREYXRhUGF0aChkYXRhUGF0aCkgOiBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICByZXR1cm4gbm9ybWFsaXplRGF0YVBhdGgocGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgY29uc3QgcGF0aCA9IHBhcnNlSXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpXG4gIGlmIChwYXRoKSB7XG4gICAgLy8gUmVtb3ZlIHRoZSBwYXJlbnQgdG9rZW4uIElmIGl0J3MgYSBudW1iZXIsIHRoZW4gd2UncmUgZGVhbGluZyB3aXRoIGFuXG4gICAgLy8gYXJyYXkgYW5kIG5lZWQgdG8gcmVtb3ZlIG1vcmUgdG9rZW5zIHVudGlsIHdlIG1lZXQgdGhlIGFjdHVhbCBwYXJlbnQ6XG4gICAgbGV0IHRva2VuXG4gICAgZG8ge1xuICAgICAgdG9rZW4gPSBwYXRoLnBvcCgpXG4gICAgfSB3aGlsZSAodG9rZW4gIT0gbnVsbCAmJiBpc0ludGVnZXIoK3Rva2VuKSlcbiAgICAvLyBJZiB0aGUgcmVtb3ZlZCB0b2tlbiBpcyB2YWxpZCwgd2UgY2FuIGdldCB0aGUgcGFyZW50IGRhdGE6XG4gICAgaWYgKHRva2VuICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW0ocm9vdEl0ZW0sIGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICBjb25zdCBwYXRoID0gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZClcbiAgcmV0dXJuIHBhdGggPyBnZXRWYWx1ZUF0RGF0YVBhdGgocm9vdEl0ZW0sIHBhdGgpIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50SXRlbShyb290SXRlbSwgZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKVxuICByZXR1cm4gcGF0aCA/IGdldFZhbHVlQXREYXRhUGF0aChyb290SXRlbSwgcGF0aCkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhUb2tlbihkYXRhUGF0aCkge1xuICBjb25zdCBwYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgcmV0dXJuIHBhdGhbcGF0aC5sZW5ndGggLSAxXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdERhdGFQYXRoTmFtZShkYXRhUGF0aCkge1xuICBjb25zdCB0b2tlbiA9IGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKVxuICByZXR1cm4gdG9rZW4gPT0gbnVsbCB8fCBpc0ludGVnZXIoK3Rva2VuKSA/IG51bGwgOiB0b2tlblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdERhdGFQYXRoSW5kZXgoZGF0YVBhdGgpIHtcbiAgY29uc3QgdG9rZW4gPSBnZXRMYXN0RGF0YVBhdGhUb2tlbihkYXRhUGF0aClcbiAgY29uc3QgaW5kZXggPSB0b2tlbiA9PSBudWxsID8gbnVsbCA6ICt0b2tlblxuICByZXR1cm4gaXNJbnRlZ2VyKGluZGV4KSA/IGluZGV4IDogbnVsbFxufVxuXG5sZXQgdGVtcG9yYXJ5SWQgPSAwXG5leHBvcnQgZnVuY3Rpb24gc2V0VGVtcG9yYXJ5SWQoZGF0YSwgaWRLZXkgPSAnaWQnKSB7XG4gIC8vIFRlbXBvcmFyeSBpZHMgYXJlIG1hcmtlZCB3aXRoIGEgJ0AnIGF0IHRoZSBiZWdpbm5pbmcuXG4gIGRhdGFbaWRLZXldID0gYEAkeysrdGVtcG9yYXJ5SWR9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUZW1wb3JhcnlJZChpZCkge1xuICByZXR1cm4gL15ALy50ZXN0KGlkKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZlcmVuY2UoZGF0YSwgaWRLZXkgPSAnaWQnKSB7XG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhbiBvYmplY3QgdGhhdCBob2xkcyBub3RoaW5nIG1vcmUgdGhhbiBhbiBpZC5cbiAgcmV0dXJuIGRhdGE/LltpZEtleV0gIT0gbnVsbCAmJiBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDFcbn1cbiIsImltcG9ydCB7IHRvUmF3IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgZ2V0VmFsdWVBdERhdGFQYXRoLCBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7XG4gIGdldEl0ZW1EYXRhUGF0aCxcbiAgZ2V0UGFyZW50SXRlbURhdGFQYXRoLFxuICBnZXRQYXJlbnRJdGVtLFxuICBnZXRJdGVtLFxuICBnZXRMYXN0RGF0YVBhdGhOYW1lLFxuICBnZXRMYXN0RGF0YVBhdGhJbmRleFxufSBmcm9tICcuL3V0aWxzL2RhdGEuanMnXG5cbmNvbnN0IHsgaGFzT3duUHJvcGVydHkgfSA9IE9iamVjdC5wcm90b3R5cGVcblxuLy8gU2VlIGFsc28gYENvbnRleHRNaXhpbmA6IGBEaXRvQ29udGV4dGAgaW5zdGFuY2VzIGFyZSBhIHRoaW4gd3JhcHBlciBhcm91bmRcbi8vIHJhdyBgY29udGV4dGAgb2JqZWN0cywgd2hpY2ggdGhlbXNlbHZlcyBhY3R1YWxseSBpbmhlcml0IGZyb20gdGhlIGxpbmtlZFxuLy8gYGNvbXBvbmVudGAgaW5zdGFuY2UsIHNvIHRoYXQgdGhleSBvbmx5IG5lZWQgdG8gcHJvdmlkZSB0aGUgdmFsdWVzIHRoYXRcbi8vIHNob3VsZCBiZSBkaWZmZXJlbnQgdGhhbiBpbiB0aGUgdW5kZXJseWluZyBjb21wb25lbnQuIEluIG9yZGVyIHRvIG5vdCBleHBvc2Vcbi8vIGFsbCBmaWVsZHMgZnJvbSB0aGUgY29tcG9uZW50LCB0aGUgd3JhcHBlciBpcyBpbnRyb2R1Y2VkLlxuXG4vLyBVc2UgV2Vha01hcCBmb3IgdGhlIHJhdyBgY29udGV4dGAgb2JqZWN0cywgc28gd2UgZG9uJ3QgaGF2ZSB0byBwb2xsdXRlIHRoZVxuLy8gYWN0dWFsIGBEaXRvQ29udGV4dGAgaW5zdGFuY2Ugd2l0aCBpdC5cbmNvbnN0IGNvbnRleHRzID0gbmV3IFdlYWtNYXAoKVxuXG5mdW5jdGlvbiB0b09iamVjdChjb250ZXh0KSB7XG4gIGNvbnN0IHJhd1N0YXJ0ID0gdG9SYXcoY29udGV4dClcbiAgbGV0IHJhdyA9IHJhd1N0YXJ0XG4gIGxldCBvYmplY3QgPSBudWxsXG4gIC8vIEluIGNhc2UgYERpdG9Db250ZXh0LmV4dGVuZCgpYCB3YXMgdXNlZCwgd2UgbmVlZCB0byBmaW5kIHRoZSBhY3R1YWwgY29udGV4dFxuICAvLyBvYmplY3QgZnJvbSB0aGUgb2JqZWN0J3MgdGhlIGluaGVyaXRhbmNlIGNoYWluOlxuICBkbyB7XG4gICAgb2JqZWN0ID0gY29udGV4dHMuZ2V0KHJhdylcbiAgICBpZiAob2JqZWN0KSBicmVha1xuICAgIHJhdyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihyYXcpXG4gIH0gd2hpbGUgKHJhdylcbiAgaWYgKG9iamVjdCAmJiByYXcgIT09IHJhd1N0YXJ0KSB7XG4gICAgLy8gQXNzaWduIHRoZSBwYXNzZWQgY29udGV4dCB3aXRoIHRoZSBvcmlnaW5hbCBvYmplY3QgYXMgd2VsbCwgc28gd2UgZG9uJ3RcbiAgICAvLyBoYXZlIHRvIHNlYXJjaCBmb3IgaXQgYWdhaW46XG4gICAgY29udGV4dHMuc2V0KHJhdywgb2JqZWN0KVxuICB9XG4gIHJldHVybiBvYmplY3Rcbn1cblxuZnVuY3Rpb24gZ2V0KGNvbnRleHQsIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGNvbnN0IG9iamVjdCA9IHRvT2JqZWN0KGNvbnRleHQpXG4gIGNvbnN0IHZhbHVlID0ga2V5IGluIG9iamVjdCA/IG9iamVjdFtrZXldIDogdW5kZWZpbmVkXG4gIC8vIElmIGBvYmplY3RgIGV4cGxpY2l0bHkgc2V0cyB0aGUga2V5IHRvIGB1bmRlZmluZWRgLCByZXR1cm4gaXQuXG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG4gICAgPyB2YWx1ZVxuICAgIDogaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpXG4gICAgICA/IGRlZmF1bHRWYWx1ZSgpXG4gICAgICA6IGRlZmF1bHRWYWx1ZVxufVxuXG5mdW5jdGlvbiBzZXQoY29udGV4dCwga2V5LCB2YWx1ZSkge1xuICB0b09iamVjdChjb250ZXh0KVtrZXldID0gdmFsdWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGl0b0NvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihjb21wb25lbnQsIGNvbnRleHQpIHtcbiAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIHBhcmFtcyBvYmplY3QgLyBmdW5jdGlvbiwgb3IgY3JlYXRlIGEgbmV3IG9uZTpcbiAgICBjb250ZXh0ID0gY29udGV4dFxuICAgICAgPyBpc0Z1bmN0aW9uKGNvbnRleHQpXG4gICAgICAgID8gY29udGV4dCgpXG4gICAgICAgIDogeyAuLi5jb250ZXh0IH1cbiAgICAgIDoge31cbiAgICAvLyBJZiBub3QgZXhwbGljaXRseSBzZXQgKHRvIGZhbHNlKSwgZGVmYXVsdCB0byB0cnVlIHNvIHdlIGRvbid0IGZhbGwgYmFja1xuICAgIC8vIHRvIGBjb21wb25lbnRgIGZvciBpdHMgdmFsdWUuXG4gICAgY29udGV4dC5uZXN0ZWQgPz89IHRydWVcbiAgICBjb250ZXh0LmNvbXBvbmVudCA9IGNvbXBvbmVudFxuICAgIC8vIEhhdmUgYG9iamVjdGAgaW5oZXJpdCBmcm9tIHRoZSBgY29tcG9uZW50YCBpbnN0YW5jZSwgc28gaXQgY2FuIG92ZXJyaWRlXG4gICAgLy8gaXRzIHZhbHVlcyBhbmQgc3RpbGwgcmV0cmlldmUgZnJvbSBpdCwgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGB0aGlzYFxuICAgIC8vIHRocm91Z2ggYGNvbnRleHRzYCBtYXA6XG4gICAgY29uc3Qgb2JqZWN0ID0gT2JqZWN0LnNldFByb3RvdHlwZU9mKGNvbnRleHQsIGNvbXBvbmVudClcbiAgICAvLyBObyBuZWVkIGZvciBgdG9SYXcodGhpcylgIGhlcmUgYXMgaXQncyBhbHdheXMgcmF3IGluc2lkZSB0aGUgY29uc3RydWN0b3IuXG4gICAgY29udGV4dHMuc2V0KHRoaXMsIG9iamVjdClcbiAgfVxuXG4gIHN0YXRpYyBnZXQoY29tcG9uZW50LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQgaW5zdGFuY2VvZiBEaXRvQ29udGV4dFxuICAgICAgPyBjb250ZXh0XG4gICAgICA6IG5ldyBEaXRvQ29udGV4dChjb21wb25lbnQsIGNvbnRleHQpXG4gIH1cblxuICBleHRlbmQob2JqZWN0KSB7XG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGlzIGNvbnRleHQgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSByZWFsIG9uZSwgYnV0XG4gICAgLy8gb3ZlcnJpZGVzIHNvbWUgcHJvcGVydGllcyB3aXRoIHRoZSBvbmVzIGZyb20gdGhlIHBhc3NlZCBgb2JqZWN0YC5cbiAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKG9iamVjdCwgdGhpcylcbiAgfVxuXG4gIC8vIGBuZXN0ZWRgIGlzIGB0cnVlYCB3aGVuIHRoZSBkYXRhLXBhdGggcG9pbnRzIGEgdmFsdWUgaW5zaWRlIGFuIGl0ZW0sIGFuZFxuICAvLyBgZmFsc2VgIHdoZW4gaXQgcG9pbnRzIHRvIHRoZSBpdGVtIGl0c2VsZi5cbiAgZ2V0IG5lc3RlZCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICduZXN0ZWQnLCB0cnVlKVxuICB9XG5cbiAgZ2V0IHNjaGVtYSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdzY2hlbWEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiBnZXQoXG4gICAgICB0aGlzLFxuICAgICAgJ3ZhbHVlJyxcbiAgICAgICgpID0+XG4gICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBub3QgZGVmaW5lZCBvbiB0aGUgdW5kZXJseWluZyBvYmplY3QsIGl0J3Mgbm90IGEgdHlwZVxuICAgICAgICAvLyBjb21wb25lbnQuIElmIGl0IGlzIG5lc3RlZCwgd2UgY2FuIHN0aWxsIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgcm9vdC5cbiAgICAgICAgdGhpcy5uZXN0ZWRcbiAgICAgICAgICA/IGdldFZhbHVlQXREYXRhUGF0aCh0aGlzLnJvb3RJdGVtLCB0aGlzLmRhdGFQYXRoKVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgKVxuICB9XG5cbiAgZ2V0IGRhdGFQYXRoKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2RhdGFQYXRoJywgJycpXG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICduYW1lJywgKCkgPT4gZ2V0TGFzdERhdGFQYXRoTmFtZSh0aGlzLmRhdGFQYXRoKSlcbiAgfVxuXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdpbmRleCcsICgpID0+IGdldExhc3REYXRhUGF0aEluZGV4KHRoaXMuZGF0YVBhdGgpKVxuICB9XG5cbiAgZ2V0IGl0ZW1EYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0SXRlbURhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICB9XG5cbiAgZ2V0IHBhcmVudEl0ZW1EYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0UGFyZW50SXRlbURhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICB9XG5cbiAgZ2V0IGl0ZW1JbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0TGFzdERhdGFQYXRoSW5kZXgodGhpcy5pdGVtRGF0YVBhdGgpXG4gIH1cblxuICBnZXQgcGFyZW50SXRlbUluZGV4KCkge1xuICAgIHJldHVybiBnZXRMYXN0RGF0YVBhdGhJbmRleCh0aGlzLnBhcmVudEl0ZW1EYXRhUGF0aClcbiAgfVxuXG4gIC8vIE5PVEU6IFdoaWxlIGludGVybmFsbHksIHdlIHNwZWFrIG9mIGBkYXRhYCwgaW4gdGhlIEFQSSBzdXJmYWNlIHRoZVxuICAvLyB0ZXJtIGBpdGVtYCBpcyB1c2VkIGZvciB0aGUgZGF0YSB0aGF0IHJlbGF0ZXMgdG8gZWRpdGluZyBvYmplY3RzOlxuICBnZXQgaXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KFxuICAgICAgdGhpcyxcbiAgICAgICdkYXRhJyxcbiAgICAgIC8vIElmIGBkYXRhYCBpc24ndCBwcm92aWRlZCwgd2UgY2FuIGRldGVybWluZSBpdCBmcm9tIHJvb3REYXRhICYgZGF0YVBhdGg6XG4gICAgICAoKSA9PiBnZXRJdGVtKHRoaXMucm9vdEl0ZW0sIHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKSB8fCBudWxsXG4gICAgKVxuICB9XG5cbiAgLy8gTk9URTogYHBhcmVudEl0ZW1gIGlzbid0IHRoZSBjbG9zZXN0IGRhdGEgcGFyZW50IHRvIGBpdGVtYCwgaXQncyB0aGVcbiAgLy8gY2xvc2VzdCBwYXJlbnQgdGhhdCBpc24ndCBhbiBhcnJheSwgZS5nLiBmb3IgcmVsYXRpb25zIG9yIG5lc3RlZCBKU09OIGRhdGEuXG4gIC8vIFRoaXMgaXMgd2h5IHRoZSB0ZXJtIGBpdGVtYCB3YXMgY2hvc2VuIG92ZXIgYGRhdGFgLCBlLmcuIFZTIHRoZSB1c2Ugb2ZcbiAgLy8gYHBhcmVudERhdGFgIGluIHNlcnZlci1zaWRlZCB2YWxpZGF0aW9uLCB3aGljaCBpcyB0aGUgY2xvc2VzdCBwYXJlbnQuIElmXG4gIC8vIG5lZWRlZCwgd2UgY291bGQgZXhwb3NlIHRoaXMgZGF0YSBoZXJlIHRvbywgYXMgd2UgY2FuIGRvIGFsbCBzb3J0cyBvZiBkYXRhXG4gIC8vIHByb2Nlc3Npbmcgd2l0aCBgcm9vdERhdGFgIGFuZCBgZGF0YVBhdGhgLlxuICBnZXQgcGFyZW50SXRlbSgpIHtcbiAgICBjb25zdCBpdGVtID0gKFxuICAgICAgZ2V0UGFyZW50SXRlbSh0aGlzLnJvb3RJdGVtLCB0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZCkgfHwgbnVsbFxuICAgIClcbiAgICByZXR1cm4gaXRlbSAhPT0gdGhpcy5pdGVtID8gaXRlbSA6IG51bGxcbiAgfVxuXG4gIGdldCByb290SXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdyb290RGF0YScsIG51bGwpXG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkSXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdwcm9jZXNzZWREYXRhJywgbnVsbClcbiAgfVxuXG4gIGdldCBwcm9jZXNzZWRSb290SXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdwcm9jZXNzZWRSb290RGF0YScsIG51bGwpXG4gIH1cblxuICBnZXQgY2xpcGJvYXJkSXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdjbGlwYm9hcmREYXRhJywgbnVsbClcbiAgfVxuXG4gIGdldCB1c2VyKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3VzZXInLCBudWxsKVxuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdhcGknLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZpZXdzKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZpZXdzJywgbnVsbClcbiAgfVxuXG4gIGdldCBmbGF0dGVuZWRWaWV3cygpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdmbGF0dGVuZWRWaWV3cycsIG51bGwpXG4gIH1cblxuICBnZXQgaXRlbUxhYmVsKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2l0ZW1MYWJlbCcsIG51bGwpXG4gIH1cblxuICBnZXQgZm9ybUxhYmVsKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2Zvcm1MYWJlbCcsIG51bGwpXG4gIH1cblxuICAvLyBOT1RFOiBMaWtlICdvcHRpb25zJywgdGhlIGFzc29jaWF0ZWQgY29tcG9uZW50IGRvZXNuJ3QgYWx3YXlzIGV4aXN0LCBlLmcuXG4gIC8vIGluIG5lc3RlZCBmb3JtcyBkdXJpbmcgYHByb2Nlc3NEYXRhKClgLiBCdXQgYHNjaGVtYWAgaXMgZ3VhcmFudGVlZCB0b1xuICAvLyBhbHdheXMgYmUgYXZhaWxhYmxlLlxuICBnZXQgY29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2NvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICAvLyBUT0RPOiBBZGQgYGNvbXBvbmVudFNjaGVtYWAgZ2V0dGVyIGZvciB0aGUgc2NoZW1hIG9mIHRoZSBjdXJyZW50IGNvbXBvbmVudCxcbiAgLy8gZXZlbiB3aGVuIHRoZSBjb21wb25lbnQgaXNuJ3QgYWN0dWFsbHkgaW5zdGFudGlhdGVkLiBDb25zaWRlciBhZGRpbmdcbiAgLy8gYHNvdXJjZVNjaGVtYWAgYXMgd2VsbD9cblxuICAvLyBUT0RPOiBGaXggdW5jbGVhciBuYW1pbmc6IFdoaWNoIHNjaGVtYSBpcyB0aGlzLCB0aGF0IG9mIHRoZSBjb21wb25lbnQgb3Igb2ZcbiAgLy8gaXRzIHBhcmVudD8gSXNuJ3QgZXhwb3NpbmcgYGZvcm1Db21wb25lbnRgIGFuZCBgdmlld0NvbXBvbmVudGAgZW5vdWdoLCBvbmNlXG4gIC8vIHdlIG9mZmVyIGFjY2VzcyB0byB0aGVpciBjb21wb25lbnRzIHRoZXJlIHRocm91Z2ggYGdldENvbXBvbmVudCgpYCAmIGNvLiBvblxuICAvLyBgRGl0b01peGluYCBwZXJoYXBzPyAgQWxzbywgdGhlcmUgY291bGQgYmUgYSBgdGFiQ29tcG9uZW50YCBnZXR0ZXIgZm9yXG4gIC8vIHNjaGVtYXMgaW4gdGFicz9cbiAgZ2V0IHNjaGVtYUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdzY2hlbWFDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IGZvcm1Db21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZm9ybUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgdmlld0NvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICd2aWV3Q29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCBkaWFsb2dDb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZGlhbG9nQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCBwYW5lbENvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdwYW5lbENvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgcmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncmVzb3VyY2VDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdzb3VyY2VDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgLy8gV2hlbiB1c2VkIGluIE9wdGlvbnNNaXhpbiBmb3IgYHNjaGVtYS5vcHRpb25zLnZhbHVlKClgLFxuICAvLyBgc2NoZW1hLm9wdGlvbnMubGFiZWwoKWAgYW5kICBgc2NoZW1hLnNlYXJjaC5maWx0ZXIoKWAgY2FsbGJhY2tzOlxuICBnZXQgb3B0aW9uKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ29wdGlvbicsIHVuZGVmaW5lZClcbiAgfVxuXG4gIGdldCBvcHRpb25zKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ29wdGlvbnMnLCB1bmRlZmluZWQpXG4gIH1cblxuICBnZXQgb3BlbigpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdvcGVuJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgLy8gRm9yIHNlYXJjaCB0ZXJtIGluIHNlbGVjdHM6XG4gIGdldCBzZWFyY2hUZXJtKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NlYXJjaFRlcm0nLCB1bmRlZmluZWQpXG4gIH1cblxuICAvLyBUaGUgZXJyb3IgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gdGhlIGNvbnRleHQgb2YgYnV0dG9ucyB0aGF0IHNlbmRcbiAgLy8gcmVxdWVzdHMsIHNlZSBgUmVzb3VyY2VNaXhpbi5lbWl0QnV0dG9uRXZlbnQoKWA6XG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdlcnJvcicsIHVuZGVmaW5lZClcbiAgfVxuXG4gIGdldCB3YXNOb3RpZmllZCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICd3YXNOb3RpZmllZCcsIGZhbHNlKVxuICB9XG5cbiAgZ2V0IGlzUnVubmluZygpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdpc1J1bm5pbmcnLCBmYWxzZSlcbiAgfVxuXG4gIHNldCBpc1J1bm5pbmcodmFsdWUpIHtcbiAgICBzZXQodGhpcywgJ2lzUnVubmluZycsIHZhbHVlKVxuICB9XG5cbiAgZ2V0IHF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC4kcm91dGUucXVlcnlcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgZ2V0IHJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPT4gdGhpcy5jb21wb25lbnQucmVxdWVzdChvcHRpb25zKVxuICB9XG5cbiAgZ2V0IGZvcm1hdCgpIHtcbiAgICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB0aGlzLmNvbXBvbmVudC5mb3JtYXQodmFsdWUsIG9wdGlvbnMpXG4gIH1cblxuICBnZXQgbmF2aWdhdGUoKSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uID0+IHRoaXMuY29tcG9uZW50Lm5hdmlnYXRlKGxvY2F0aW9uKVxuICB9XG5cbiAgZ2V0IGRvd25sb2FkKCkge1xuICAgIHJldHVybiBvcHRpb25zID0+IHRoaXMuY29tcG9uZW50LmRvd25sb2FkKG9wdGlvbnMpXG4gIH1cblxuICBnZXQgZ2V0UmVzb3VyY2VVcmwoKSB7XG4gICAgcmV0dXJuIHJlc291cmNlID0+IHRoaXMuY29tcG9uZW50LmdldFJlc291cmNlVXJsKHJlc291cmNlKVxuICB9XG5cbiAgZ2V0IG5vdGlmeSgpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA9PiB7XG4gICAgICB0aGlzLmNvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICAgIHNldCh0aGlzLCAnd2FzTm90aWZpZWQnLCB0cnVlKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNQbGFpbk9iamVjdCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3RlbmVyczogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgLy8gQXN5bmMgb24oKSBhbmQgJG9mZigpIG1ldGhvZHMgdGhhdCBrZWVwIHRyYWNrIG9mIHRoZSBldmVudHMgYWRkZWQgL1xuICAgIC8vIHJlbW92ZWQsIGFuZCBwcm92aWRlIGEgaGFzTGlzdGVuZXJzKCkgbWV0aG9kIHRoYXQgY2hlY2tzIGlmIHRoZSBjb21wb25lbnRcbiAgICAvLyBoYXMgbGlzdGVuZXJzIGZvciBhIGdpdmVuIGV2ZW50LlxuXG4gICAgLy8gQWxzbyBhZGRzIHByb3BlciBoYW5kbGluZyBvZiBhc3luYyBldmVudHMsIGluY2x1ZGluZyBhIGFzeW5jIGVtaXQoKSB0aGF0XG4gICAgLy8gZGVhbHMgd2l0aCBwcm9wZXIgZXZlbnQgcXVldWVpbmcuXG4gICAgb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudCkge1xuICAgICAgICAgIHRoaXMub24oZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vbihrZXksIGV2ZW50W2tleV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9ICh0aGlzLmxpc3RlbmVycyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKSlcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IChsaXN0ZW5lcnNbZXZlbnRdIHx8PSB7XG4gICAgICAgICAgY2FsbGJhY2tzOiBbXSxcbiAgICAgICAgICBxdWV1ZTogW11cbiAgICAgICAgfSlcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBvbmNlKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgY29uc3Qgb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICB0aGlzLm9mZihldmVudCwgb24pXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgICAgb24uY2FsbGJhY2sgPSBjYWxsYmFjayAvLyBOZWVkZWQgZm9yIGBvZmYoKWAsIHNlZSBiZWxvdy5cbiAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCBvbilcbiAgICB9LFxuXG4gICAgb2ZmKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgZXZlbnRzXG4gICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoa2V5LCBldmVudFtrZXldKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmUgc3BlY2lmaWMgZXZlbnRcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmxpc3RlbmVycz8uW2V2ZW50XVxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNbZXZlbnRdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhIHNwZWNpZmljIGhhbmRsZXI6IGZpbmQgdGhlIGluZGV4IGluIGNhbGxiYWNrc1xuICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgIC8vIE1hdGNoIGBjYi5jYWxsYmFja2AgYWxzbywgYXMgdXNlZCBieSBgb25jZSgpYCwgc2VlICBhYm92ZTpcbiAgICAgICAgICAgICAgY2IgPT4gY2IgPT09IGNhbGxiYWNrIHx8IGNiLmNhbGxiYWNrID09PSBjYWxsYmFja1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgZW1pdChldmVudCwgLi4uYXJncykge1xuICAgICAgLy8gT25seSBxdWV1ZSBldmVudCBpZiB0aGVyZSBhY3R1YWxseSBhcmUgbGlzdGVuZXJzIGZvciBpdC5cbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlLCBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gRW1pdCB0aGUgbmV4dCBldmVudCBpbiB0aGUgcXVldWUgd2l0aCBpdHMgcGFyYW1zLlxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0IG9ubHkgZ2V0cyByZW1vdmVkIG9uY2UgYG5leHQoKWAgaXMgY2FsbGVkLlxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdFxuICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjYWxsYmFjay5hcHBseSh0aGlzLCBlbnRyeS5hcmdzKVxuICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnJvcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBlcnJvcnMsXG4gICAgICAgICAgICAgICAgICBgRXJyb3JzIGR1cmluZyBldmVudCBoYW5kbGVyIGZvciAnJHtldmVudH0nYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBlbnRyeS5yZXNvbHZlKFByb21pc2UucmVqZWN0KGVycm9yKSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBxdWV1ZSBmb3IgdGhlIGV2ZW50XG4gICAgICAgICAgICAgICAgLy8gdGhhdCB3YXMganVzdCBjb21wbGV0ZWQgYnkgdGhlIHdyYXBwZXIgdGhhdCBjYWxsZWQgYG5leHQoKWBcbiAgICAgICAgICAgICAgICBlbnRyeS5yZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcXVldWUucHVzaCh7IGFyZ3MsIHJlc29sdmUgfSlcbiAgICAgICAgICAvLyBGb3IgbmV3IHF1ZXVlcyAoPSBvbmx5IG9uZSBlbnRyeSkgZW1pdCB0aGUgZmlyc3QgZXZlbnQgaW1tZWRpYXRlbHksXG4gICAgICAgICAgLy8gdG8gZ2V0IHRoZSBxdWV1ZSBydW5uaW5nLlxuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIG5leHQoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIHRoZW5hYmxlIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycy5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH0sXG5cbiAgICAvLyBDaGVja3MgaWYgdGhlIGNvbXBvbmVudCBoYXMgbGlzdGVuZXJzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGU6XG4gICAgaGFzTGlzdGVuZXJzKGV2ZW50KSB7XG4gICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudCkge1xuICAgICAgICAgIGlmICghdGhpcy5oYXNMaXN0ZW5lcnMoZXYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV2ZW50Lmxlbmd0aCA+IDBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMubGlzdGVuZXJzPy5bZXZlbnRdXG4gICAgICB9XG4gICAgfSxcblxuICAgIGRlbGVnYXRlKGV2ZW50LCB0YXJnZXQpIHtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkoZXZlbnQpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudCkge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZShldiwgdGFyZ2V0KVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uKGV2ZW50LCAoLi4uYXJncykgPT4gdGFyZ2V0LmVtaXQoZXZlbnQsIC4uLmFyZ3MpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IHsgY29tcHV0ZVZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXB1dGVkOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb21wdXRlVmFsdWUoXG4gICAgICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgICB0aGlzLmRhdGFQYXRoLFxuICAgICAgICAgIHsgY29tcG9uZW50OiB0aGlzIH1cbiAgICAgICAgKVxuICAgICAgICBjb25zdCB7IGZvcm1hdCB9ID0gdGhpcy5zY2hlbWFcbiAgICAgICAgcmV0dXJuIGZvcm1hdFxuICAgICAgICAgID8gZm9ybWF0KG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IHZhbHVlIH0pKVxuICAgICAgICAgIDogdmFsdWVcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IHBhcnNlIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgICBpZiAocGFyc2UpIHtcbiAgICAgICAgICB2YWx1ZSA9IHBhcnNlKG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IHZhbHVlIH0pKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFyc2VkVmFsdWUgPSB2YWx1ZVxuICAgICAgICB0aGlzLmRhdGFbdGhpcy5uYW1lXSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgeyBnZXRJdGVtLCBnZXRQYXJlbnRJdGVtIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcHV0ZWQ6IHtcbiAgICBjb250ZXh0KCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG5lc3RlZDogdGhpcy5uZXN0ZWQgfSlcbiAgICB9LFxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBzaW1pbGFyIHRvIGBEaXRvQ29udGV4dGBcbiAgICAvLyBwcm9wZXJ0aWVzLCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgdGhlc2Ugb24gYHRoaXNgIGFzIHdlbGw6XG4gICAgLy8gTk9URTogV2hpbGUgaW50ZXJuYWxseSwgd2Ugc3BlYWsgb2YgYGRhdGFgLCBpbiB0aGUgQVBJIHN1cmZhY2UgdGhlXG4gICAgLy8gdGVybSBgaXRlbWAgaXMgdXNlZCBmb3IgdGhlIGRhdGEgdGhhdCByZWxhdGVzIHRvIGVkaXRpbmcgb2JqZWN0cy5cbiAgICAvLyBOT1RFOiBUaGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFzOlxuICAgIC8vIHJldHVybiBnZXRJdGVtKHRoaXMucm9vdERhdGEsIHRoaXMuZGF0YVBhdGgsIGZhbHNlKVxuICAgIHBhcmVudERhdGEoKSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0UGFyZW50SXRlbSh0aGlzLnJvb3REYXRhLCB0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZClcbiAgICAgIHJldHVybiBkYXRhICE9PSB0aGlzLmRhdGEgPyBkYXRhIDogbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBwcm9jZXNzZWREYXRhKCkge1xuICAgICAgcmV0dXJuIGdldFByb2Nlc3NlZFBhcmVudERhdGEodGhpcywgdGhpcy5kYXRhUGF0aCwgdGhpcy5uZXN0ZWQpXG4gICAgfSxcblxuICAgIHByb2Nlc3NlZFJvb3REYXRhKCkge1xuICAgICAgcmV0dXJuIGdldFByb2Nlc3NlZFBhcmVudERhdGEodGhpcywgJycsIGZhbHNlKVxuICAgIH0sXG5cbiAgICBpdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVxuICAgIH0sXG5cbiAgICBwYXJlbnRJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50RGF0YVxuICAgIH0sXG5cbiAgICByb290SXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3REYXRhXG4gICAgfSxcblxuICAgIHByb2Nlc3NlZEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzZWREYXRhXG4gICAgfSxcblxuICAgIHByb2Nlc3NlZFJvb3RJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc2VkUm9vdERhdGFcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHJvY2Vzc2VkUGFyZW50RGF0YShjb21wb25lbnQsIGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICAvLyBXZSBjYW4gb25seSBnZXQgdGhlIHByb2Nlc3NlZCBkYXRhIHRocm91Z2ggdGhlIHNjaGVtYUNvbXBvbmVudCwgYnV0XG4gIC8vIHRoYXQncyBub3QgbmVjZXNzYXJpbHkgdGhlIGl0ZW0gcmVwcmVzZW50ZWQgYnkgdGhpcyBjb21wb25lbnQuXG4gIC8vIFNvbHV0aW9uOiBGaW5kIHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgcHJvY2Vzc2VkIHN1Yi1pdGVtIGZyb20gdGhlcmU6XG4gIGxldCB7IHNjaGVtYUNvbXBvbmVudCB9ID0gY29tcG9uZW50XG4gIC8vIEZpbmQgdGhlIHNjaGVtYSBjb21wb25lbnQgdGhhdCBjb250YWlucyB0aGUgZGVzaXJlZCBkYXRhLXBhdGg6XG4gIHdoaWxlIChzY2hlbWFDb21wb25lbnQuZGF0YVBhdGgubGVuZ3RoID4gZGF0YVBhdGgubGVuZ3RoKSB7XG4gICAgc2NoZW1hQ29tcG9uZW50ID0gc2NoZW1hQ29tcG9uZW50LnBhcmVudFNjaGVtYUNvbXBvbmVudFxuICB9XG4gIHJldHVybiBnZXRJdGVtKFxuICAgIHNjaGVtYUNvbXBvbmVudC5wcm9jZXNzZWREYXRhLFxuICAgIC8vIEdldCB0aGUgZGF0YVBhdGggcmVsYXRpdmUgdG8gdGhlIHNjaGVtYUNvbXBvbmVudCdzIGRhdGE6XG4gICAgZGF0YVBhdGguc2xpY2Uoc2NoZW1hQ29tcG9uZW50LmRhdGFQYXRoLmxlbmd0aCksXG4gICAgbmVzdGVkXG4gIClcbn1cbiIsImltcG9ydCB7IGlzQ3JlZGl0Q2FyZCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBjcmVkaXRjYXJkID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNDcmVkaXRDYXJkKHZhbHVlKSxcbiAgbWVzc2FnZTogJ2lzIGludmFsaWQnXG59XG4iLCJleHBvcnQgY29uc3QgZGVjaW1hbHMgPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIGRlY2ltYWxzKSA9PiB7XG4gICAgY29uc3QgbWF0Y2ggPSBkZWNpbWFscyA9PT0gJyonID8gJysnIDogYHsxLCR7ZGVjaW1hbHN9fWBcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlstK10/XFxcXGQqKFxcXFwuXFxcXGQke21hdGNofSk/JGApLnRlc3QodmFsdWUpXG4gIH0sXG5cbiAgbWVzc2FnZTogKHZhbHVlLCBkZWNpbWFscykgPT5cbiAgICBgbXVzdCBiZSBudW1lcmljIGFuZCBtYXkgY29udGFpbiAke1xuICAgICAgIWRlY2ltYWxzIHx8IGRlY2ltYWxzID09PSAnKicgPyAnJyA6IGRlY2ltYWxzXG4gICAgfSBkZWNpbWFsIHBvaW50c2Bcbn1cbiIsImltcG9ydCB7IGlzRG9tYWluIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGRvbWFpbiA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzRG9tYWluKHZhbHVlKSxcbiAgbWVzc2FnZTogJ2lzIG5vdCBhIGRvbWFpbidcbn1cbiIsImltcG9ydCB7IGlzRW1haWwgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgZW1haWwgPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc0VtYWlsKHZhbHVlKSxcbiAgbWVzc2FnZTogJ211c3QgYmUgYSB2YWxpZCBlbWFpbCdcbn1cbiIsImltcG9ydCB7IGlzSG9zdG5hbWUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgaG9zdG5hbWUgPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc0hvc3RuYW1lKHZhbHVlKSxcbiAgbWVzc2FnZTogJ2lzIG5vdCBhIGhvc3QgbmFtZSdcbn1cbiIsImltcG9ydCB7IGlzSW50ZWdlciB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBpbnRlZ2VyID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNJbnRlZ2VyKHZhbHVlKSxcbiAgbWVzc2FnZTogJ211c3QgYmUgd2hvbGUgbnVtYmVyJ1xufVxuIiwiZXhwb3J0IGNvbnN0IG1heCA9IHtcbiAgdmFsaWRhdGU6ICh2YWx1ZSwgbWF4KSA9PiB2YWx1ZSA8PSBtYXgsXG4gIG1lc3NhZ2UodmFsdWUsIG1heCkge1xuICAgIHJldHVybiBgbXVzdCBiZSAke21heH0gb3IgbGVzc2BcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IG1pbiA9IHtcbiAgdmFsaWRhdGU6ICh2YWx1ZSwgbWluKSA9PiB2YWx1ZSA+PSBtaW4sXG4gIG1lc3NhZ2UodmFsdWUsIG1pbikge1xuICAgIHJldHVybiBgbXVzdCBiZSAke21pbn0gb3IgbW9yZWBcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IHBhc3N3b3JkID0ge1xuICAvLyBBbGxvdyBhbnkgdmFsdWUuIEZvciBub3cgdGhpcyBpcyBvbmx5IHVzZWQgYXMgYSBtYXJrZXIsIHRvIGFsbG93IHRoZVxuICAvLyByZXF1aXJlZCB2YWxpZGF0aW9uIHRvIGhhbmRsZSB1bmNoYW5nZWQgcGFzc3dvcmRzIHNlcGFyYXRlbHkuXG4gIHZhbGlkYXRlOiAoKSA9PiB0cnVlXG59XG4iLCJleHBvcnQgY29uc3QgcmFuZ2UgPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIFttaW4sIG1heF0pID0+IHZhbHVlID49IG1pbiAmJiB2YWx1ZSA8PSBtYXgsXG4gIG1lc3NhZ2UodmFsdWUsIFttaW4sIG1heF0pIHtcbiAgICByZXR1cm4gYG11c3QgYmUgYmV0d2VlbiAke21pbn0gYW5kICR7bWF4fWBcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IHJlcXVpcmVkID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBzZXR0aW5ncywgeyBwYXNzd29yZCB9KSA9PiAoXG4gICAgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09ICcnKSB8fFxuICAgIC8vIFBhc3N3b3JkIGZpZWxkcyB1c2UgYHVuZGVmaW5lZGAgYXMgb3Bwb3NlZCB0byBgbnVsbGAgd2hlbiB0aGV5J3JlIHNldFxuICAgIC8vIGJ1dCB1bmNoYW5nZWQsIGFsbG93IHRoaXMgdG8gcGFzcyB0aHJvdWdoOlxuICAgIChwYXNzd29yZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICApLFxuICBtZXNzYWdlOiAnaXMgcmVxdWlyZWQnXG59XG4iLCJpbXBvcnQgeyBpc1VybCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCB1cmwgPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc1VybCh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBVUkwnXG59XG4iLCJpbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCAqIGFzIHZhbGlkYXRvcnMgZnJvbSAnLi4vdmFsaWRhdG9ycy9pbmRleC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsnZXJyb3JzJ10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNUb3VjaGVkOiBmYWxzZSxcbiAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgaXNWYWxpZGF0ZWQ6IGZhbHNlLFxuICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBoYXNFcnJvcnMoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmVycm9yc1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgcmVzZXRWYWxpZGF0aW9uKCkge1xuICAgICAgdGhpcy5pc1RvdWNoZWQgPSBmYWxzZVxuICAgICAgdGhpcy5pc0RpcnR5ID0gZmFsc2VcbiAgICAgIHRoaXMuaXNWYWxpZGF0ZWQgPSBmYWxzZVxuICAgICAgdGhpcy5pc1ZhbGlkID0gZmFsc2VcbiAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgIH0sXG5cbiAgICB2YWxpZGF0ZShub3RpZnkgPSB0cnVlKSB7XG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWVcbiAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgICB9XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzXG4gICAgICBmb3IgKGNvbnN0IFtydWxlLCBzZXR0aW5nXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnZhbGlkYXRpb25zKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0b3JzW3J1bGVdXG4gICAgICAgIGlmIChcbiAgICAgICAgICB2YWxpZGF0b3IgJiZcbiAgICAgICAgICAvLyBPbmx5IGFwcGx5ICdyZXF1aXJlZCcgdmFsaWRhdG9yIHRvIGVtcHR5IHZhbHVlcy5cbiAgICAgICAgICAvLyBBcHBseSBhbGwgb3RoZXIgdmFsaWRhdG9ycyBvbmx5IHRvIG5vbi1lbXB0eSB2YWx1ZXMuXG4gICAgICAgICAgKHJ1bGUgPT09ICdyZXF1aXJlZCcgfHwgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHsgdmFsaWRhdGUsIG1lc3NhZ2UgfSA9IHZhbGlkYXRvclxuICAgICAgICAgIGlmICghdmFsaWRhdGUodmFsdWUsIHNldHRpbmcsIHRoaXMudmFsaWRhdGlvbnMpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2VcbiAgICAgICAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc0Z1bmN0aW9uKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgPyBtZXNzYWdlKHZhbHVlLCBzZXR0aW5nLCB0aGlzKVxuICAgICAgICAgICAgICAgIDogbWVzc2FnZVxuICAgICAgICAgICAgICB0aGlzLmFkZEVycm9yKGVycm9yLCB0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLmlzVmFsaWQgPSBpc1ZhbGlkXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNWYWxpZFxuICAgIH0sXG5cbiAgICB2ZXJpZnkoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZShmYWxzZSlcbiAgICB9LFxuXG4gICAgbWFya1RvdWNoZWQoKSB7XG4gICAgICB0aGlzLmlzVG91Y2hlZCA9IHRydWVcbiAgICAgIC8vIENsZWFyIGN1cnJlbnRseSBkaXNwbGF5ZWQgZXJyb3JzIHdoZW4gZm9jdXNpbmcgaW5wdXQuXG4gICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICB9LFxuXG4gICAgbWFya0RpcnR5KCkge1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZVxuICAgICAgdGhpcy5pc1ZhbGlkYXRlZCA9IGZhbHNlXG4gICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZVxuICAgICAgLy8gQ2xlYXIgY3VycmVudGx5IGRpc3BsYXllZCBlcnJvcnMgb24gbmV3IGlucHV0LlxuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgfSxcblxuICAgIGFkZEVycm9yKGVycm9yLCBhZGRMYWJlbCA9IGZhbHNlKSB7XG4gICAgICB0aGlzLmVycm9ycyB8fD0gW11cbiAgICAgIGlmIChhZGRMYWJlbCkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMubGFiZWwgfHwgdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLm5hbWVcbiAgICAgICAgZXJyb3IgPSBgVGhlICR7bGFiZWx9IGZpZWxkICR7ZXJyb3J9LmBcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICB0aGlzLiRlbWl0KCdlcnJvcnMnLCB0aGlzLmVycm9ycylcbiAgICB9LFxuXG4gICAgc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cykge1xuICAgICAgLy8gQ29udmVydCBmcm9tIEFKViBlcnJvcnMgb2JqZWN0cyB0byBhbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlc1xuICAgICAgdGhpcy5lcnJvcnMgPSBbXVxuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHsgbWVzc2FnZSB9IG9mIGVycm9ycykge1xuICAgICAgICB0aGlzLmFkZEVycm9yKG1lc3NhZ2UsIHRydWUpXG4gICAgICB9XG4gICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxJbnRvVmlldygpXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBnZXRFcnJvcnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lcnJvcnMgPyBbLi4udGhpcy5lcnJvcnNdIDogbnVsbFxuICAgIH0sXG5cbiAgICBjbGVhckVycm9ycygpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gbnVsbFxuICAgICAgdGhpcy4kZW1pdCgnZXJyb3JzJywgdGhpcy5lcnJvcnMpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBpc0Z1bmN0aW9uLFxuICBpc1N0cmluZyxcbiAgcGFyc2VEYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVtYUFjY2Vzc29yKFxuICBrZXlPckRhdGFQYXRoLFxuICB7IHR5cGUsIGRlZmF1bHQ6IGRlZiwgZ2V0LCBzZXQsIGNhbGxiYWNrID0gdHJ1ZSB9ID0ge31cbikge1xuICAvLyBga2V5T3JEYXRhUGF0aGAgY2FuIGJlIGEgc2ltcGxlIHByb3BlcnR5IGtleSxcbiAgLy8gb3IgYSBkYXRhLXBhdGggaW50byBzdWItcHJvcGVydGllcywgYm90aCBpbiBhcnJheSBvciBzdHJpbmcgZm9ybWF0LlxuICBpZiAoaXNTdHJpbmcoa2V5T3JEYXRhUGF0aCkgJiYga2V5T3JEYXRhUGF0aC5pbmNsdWRlcygnLicpKSB7XG4gICAga2V5T3JEYXRhUGF0aCA9IHBhcnNlRGF0YVBhdGgoa2V5T3JEYXRhUGF0aClcbiAgfVxuICAvLyBVc2UgdGhlIG5vcm1hbGl6ZWQgZGF0YSBwYXRoIGZvciB0aGUgaGFuZGxpbmcgb3ZlcnJpZGVzXG4gIGNvbnN0IG5hbWUgPSBub3JtYWxpemVEYXRhUGF0aChrZXlPckRhdGFQYXRoKVxuICByZXR1cm4ge1xuICAgIGdldCgpIHtcbiAgICAgIC8vIE9ubHkgZGV0ZXJtaW5lIHNjaGVtYSB2YWx1ZSBpZiB3ZSBoYXZlIG5vIGdldHRlciwgb3IgdGhlIGdldHRlclxuICAgICAgLy8gd2FudHMgdG8gcmVjZWl2ZSB0aGUgdmFsdWUgYW5kIHByb2Nlc3MgaXQgZnVydGhlcjpcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgIWdldCB8fCBnZXQubGVuZ3RoID4gMFxuICAgICAgICAgID8gLy8gTk9URTogQmVjYXVzZSBgc2NoZW1hYCBvYmplY3RzIGFyZSByZXRyaWV2ZWQgZnJvbSBgbWV0YWAsIHRoZXlcbiAgICAgICAgICAgIC8vIGRvbid0IHNlZW0gdG8gYmUgcmVhY3RpdmUuIFRvIGFsbG93IGNoYW5nZWQgaW4gYHNjaGVtYWAgdmFsdWVzLFxuICAgICAgICAgICAgLy8gYHNldCgpYCBzdG9yZXMgY2hhbmdlZCB2YWx1ZXMgaW4gdGhlIHNlcGFyYXRlIGBvdmVycmlkZXNgIG9iamVjdC5cbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVzICYmIG5hbWUgaW4gdGhpcy5vdmVycmlkZXNcbiAgICAgICAgICAgID8gdGhpcy5vdmVycmlkZXNbbmFtZV1cbiAgICAgICAgICAgIDogdGhpcy5nZXRTY2hlbWFWYWx1ZShrZXlPckRhdGFQYXRoLCB7XG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBkZWYsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIGdldCA/IGdldC5jYWxsKHRoaXMsIHZhbHVlKSA6IHZhbHVlXG4gICAgfSxcblxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgaWYgKHNldCkge1xuICAgICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3ZlcnJpZGVzIHx8PSB7fVxuICAgICAgICB0aGlzLm92ZXJyaWRlc1tuYW1lXSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yZUFjY2Vzc29yKG5hbWUsIHsgZGVmYXVsdDogZGVmLCBnZXQsIHNldCB9ID0ge30pIHtcbiAgcmV0dXJuIHtcbiAgICBnZXQoKSB7XG4gICAgICBsZXQgdmFsdWUgPSB0aGlzLmdldFN0b3JlKG5hbWUpXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBkZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBTdXBwb3J0IGBkZWZhdWx0KClgIGZ1bmN0aW9uczpcbiAgICAgICAgdmFsdWUgPSBpc0Z1bmN0aW9uKGRlZikgPyBkZWYuY2FsbCh0aGlzKSA6IGRlZlxuICAgICAgICAvLyBUcmlnZ2VyIHNldHRlciBieSBzZXR0aW5nIHZhbHVlIGFuZCBhY2Nlc3NvciB0byBkZWZhdWx0OlxuICAgICAgICB0aGlzW25hbWVdID0gdmFsdWVcbiAgICAgICAgLy8gTm93IGFjY2VzcyBzdG9yZSBhZ2FpbiwgZm9yIHJlYWN0aXZpdHkgdHJhY2tpbmdcbiAgICAgICAgdGhpcy5nZXRTdG9yZShuYW1lKVxuICAgICAgfVxuICAgICAgLy8gQWxsb3cgdGhlIHByb3ZpZGVkIGdldHRlciB0byBmdXJ0aGVyIGNoYW5nZSBvciBwcm9jZXNzIHRoZSB2YWx1ZVxuICAgICAgLy8gcmV0cmlldmVkIGZyb20gdGhlIHN0b3JlOlxuICAgICAgcmV0dXJuIGdldCA/IGdldC5jYWxsKHRoaXMsIHZhbHVlKSA6IHZhbHVlXG4gICAgfSxcblxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgLy8gQWxsb3cgdGhlIHByb3ZpZGVkIHNldHRlciB0byByZXR1cm4gYSBuZXcgdmFsdWUgdG8gc2V0LCBvciBkbyB0aGVcbiAgICAgIC8vIHNldHRpbmcgaXRzZWxmLCBhbmQgdGhlbiByZXR1cm4gYHVuZGVmaW5lZGA6XG4gICAgICBpZiAoIXNldCB8fCAodmFsdWUgPSBzZXQuY2FsbCh0aGlzLCB2YWx1ZSkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdG9yZShuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBWYWx1ZU1peGluIGZyb20gJy4vVmFsdWVNaXhpbi5qcydcbmltcG9ydCBDb250ZXh0TWl4aW4gZnJvbSAnLi9Db250ZXh0TWl4aW4uanMnXG5pbXBvcnQgVmFsaWRhdGlvbk1peGluIGZyb20gJy4vVmFsaWRhdGlvbk1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGFzQXJyYXksIGNhbWVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbVmFsdWVNaXhpbiwgQ29udGV4dE1peGluLCBWYWxpZGF0aW9uTWl4aW5dLFxuICBlbWl0czogWyd1cGRhdGU6Y29tcG9uZW50J10sXG5cbiAgcHJvcHM6IHtcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIC8vIE5PVEU6IFdoaWxlIGBkYXRhUGF0aGAgcG9pbnRzIHRvIHRoZSBhY3R1YWwgYHZhbHVlYCwgYGRhdGFgIHJlcHJlc2VudHNcbiAgICAvLyB0aGUgYGl0ZW1gIGluIHdoaWNoIHRoZSBgdmFsdWVgIGlzIGNvbnRhaW5lZCwgdW5kZXIgdGhlIGtleSBgbmFtZWAuXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB3aWR0aDogeyB0eXBlOiBbTnVtYmVyLCBTdHJpbmddLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbGFiZWw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2luZ2xlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbmVzdGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBhY2N1bXVsYXRlZEJhc2lzOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyc2VkVmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbmFtZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5uYW1lXG4gICAgfSxcblxuICAgIHR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEudHlwZVxuICAgIH0sXG5cbiAgICBsYWJlbE5vZGUoKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5pc01vdW50ZWQgPyB0aGlzLiRlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIDogbnVsbFxuICAgICAgcmV0dXJuIG5vZGU/Lm1hdGNoZXMoJy5kaXRvLWxhYmVsJykgPyBub2RlIDogbnVsbFxuICAgIH0sXG5cbiAgICB2aXNpYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigndmlzaWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kb3B0aW9ucy5kZWZhdWx0VmlzaWJsZVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBleGNsdWRlZGAgZm9yIGNvbnNpc3RlbnQgbmFtaW5nP1xuICAgIGV4Y2x1ZGU6IGdldFNjaGVtYUFjY2Vzc29yKCdleGNsdWRlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICByZXF1aXJlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ3JlcXVpcmVkJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBNb3ZlIHRoZXNlIHRvIGEgc3ViLWNsYXNzIGNvbXBvbmVudCB1c2VkIGZvciBhbGwgaW5wdXQgY29tcG9uZW50cz9cbiAgICByZWFkb25seTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3JlYWRvbmx5Jywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBhdXRvZm9jdXM6IGdldFNjaGVtYUFjY2Vzc29yKCdhdXRvZm9jdXMnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIC8vIFRvIGJlIHVzZWQgZm9yIHNlbGVjdHMgYW5kIGlucHV0cyBvbmx5P1xuICAgIGNsZWFyYWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NsZWFyYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcblxuICAgICAgZ2V0KGNsZWFyYWJsZSkge1xuICAgICAgICByZXR1cm4gY2xlYXJhYmxlICYmICF0aGlzLnJlYWRvbmx5XG4gICAgICB9XG4gICAgfSksXG5cbiAgICBkaXNhYmxlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2Rpc2FibGVkJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBtYXhMZW5ndGg6IGdldFNjaGVtYUFjY2Vzc29yKCdtYXhMZW5ndGgnLCB7XG4gICAgICB0eXBlOiBOdW1iZXJcbiAgICB9KSxcblxuICAgIHBsYWNlaG9sZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncGxhY2Vob2xkZXInLCB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9KSxcblxuICAgIGF1dG9jb21wbGV0ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2F1dG9jb21wbGV0ZScsIHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0pLFxuXG4gICAgaW5mbzogZ2V0U2NoZW1hQWNjZXNzb3IoJ2luZm8nLCB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICBpbmxpbmVJbmZvKCkge1xuICAgICAgLy8gV2hlbiBhIGxhYmVsIGlzIHByZXNlbnQsIGluZm8gaXMgc2hvd24gaW4gdGhlIGxhYmVsIGNvbXBvbmVudC5cbiAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBzaG93IGl0IGlubGluZS5cbiAgICAgIHJldHVybiAhdGhpcy5sYWJlbCA/IHRoaXMuaW5mbyA6IG51bGxcbiAgICB9LFxuXG4gICAgZXZlbnRzKCkge1xuICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5nZXRFdmVudHMoKVxuICAgICAgLy8gUmVnaXN0ZXIgY2FsbGJhY2tzIGZvciBhbGwgcHJvdmlkZXMgbm9uLXJlY29nbml6ZWQgZXZlbnRzLFxuICAgICAgLy8gYXNzdW1pbmcgdGhleSBhcmUgbmF0aXZlIGV2ZW50cy5cbiAgICAgIC8vIFRPRE86IE1vdmUgdG8gdnVlMy1zdHlsZSBgb25bQS1aXWAgZXZlbnQgaGFuZGxlcnMgbmFtaW5nIHRoYXQgYXJlbid0XG4gICAgICAvLyBuYW1lc3BhY2VkIGluIGBzY2hlbWEuZXZlbnRzYCBvbmNlIHRoZSB0cmFuc2l0aW9uIGlzIGNvbXBsZXRlLlxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiBPYmplY3Qua2V5cyh0aGlzLnNjaGVtYS5ldmVudHMgfHwge30pKSB7XG4gICAgICAgIGV2ZW50c1tgb24ke2NhbWVsaXplKGV2ZW50LCB0cnVlKX1gXSA/Pz0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW1pdEV2ZW50KGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZXZlbnRzXG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IG5hdGl2ZUZpZWxkLCB0ZXh0RmllbGQgfSA9IHRoaXMuJG9wdGlvbnNcblxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHtcbiAgICAgICAgLi4udGhpcy5ldmVudHMsXG4gICAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkXG4gICAgICB9XG5cbiAgICAgIGlmIChuYXRpdmVGaWVsZCkge1xuICAgICAgICBhdHRyaWJ1dGVzLm5hbWUgPSB0aGlzLmRhdGFQYXRoXG4gICAgICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy50aXRsZSA9IHRoaXMubGFiZWxcbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seVxuICAgICAgICBhdHRyaWJ1dGVzLmF1dG9mb2N1cyA9IHRoaXMuYXV0b2ZvY3VzXG4gICAgICAgIGlmICh0ZXh0RmllbGQpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzLm1heGxlbmd0aCA9IHRoaXMubWF4TGVuZ3RoXG4gICAgICAgICAgYXR0cmlidXRlcy5wbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXJcbiAgICAgICAgICBhdHRyaWJ1dGVzLmF1dG9jb21wbGV0ZSA9IHRoaXMuYXV0b2NvbXBsZXRlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9LFxuXG4gICAgdmFsaWRhdGlvbnMoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9ucyA9IHsgLi4udGhpcy5nZXRWYWxpZGF0aW9ucygpIH1cbiAgICAgIGlmICh0aGlzLnJlcXVpcmVkKSB7XG4gICAgICAgIHZhbGlkYXRpb25zLnJlcXVpcmVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgLy8gQWxsb3cgc2NoZW1hIHRvIG92ZXJyaWRlIGRlZmF1bHQgcnVsZXMgYW5kIGFkZCBhbnkgbmV3IG9uZXM6XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5ydWxlcyB8fCB7fSkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWxldGUgdmFsaWRhdGlvbnNba2V5XVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkYXRpb25zW2tleV0gPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWRhdGlvbnNcbiAgICB9LFxuXG4gICAgc2hvd0NsZWFyQnV0dG9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xlYXJhYmxlICYmIHRoaXMudmFsdWUgIT0gbnVsbFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRydWUpXG4gICAgdGhpcy5zZXR1cFNjaGVtYUZpZWxkcygpXG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfcmVnaXN0ZXIoYWRkKSB7XG4gICAgICAvLyBQcm92aWRlIGNvbXBvbmVudCB0byBjb250YWluZXIgZm9yIHNjaGVtYSBhY2Nlc3NvciBldmFsdWF0aW9uLlxuICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOmNvbXBvbmVudCcsIGFkZCA/IHRoaXMgOiBudWxsKVxuICAgICAgLy8gUHJldmVudCB1bm5lc3RlZCB0eXBlIGNvbXBvbmVudHMgZnJvbSBvdmVycmlkaW5nIHBhcmVudCBkYXRhIHBhdGhzXG4gICAgICBpZiAodGhpcy5uZXN0ZWQpIHtcbiAgICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuX3JlZ2lzdGVyQ29tcG9uZW50KHRoaXMsIGFkZClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgZ2V0RXZlbnRzKCkge1xuICAgICAgY29uc3QgeyBvbkZvY3VzLCBvbkJsdXIsIG9uSW5wdXQsIG9uQ2hhbmdlIH0gPSB0aGlzXG4gICAgICByZXR1cm4geyBvbkZvY3VzLCBvbkJsdXIsIG9uSW5wdXQsIG9uQ2hhbmdlIH1cbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgZ2V0VmFsaWRhdGlvbnMoKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBhc3luYyBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgIGF3YWl0IHRoaXMuZm9jdXNTY2hlbWEoKVxuICAgICAgdGhpcy5nZXRGb2N1c0VsZW1lbnQoKT8uc2Nyb2xsSW50b1ZpZXc/Lih7XG4gICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgYmxvY2s6ICdjZW50ZXInXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICB0aGlzLmdldEZvY3VzRWxlbWVudCgpPy5mb2N1cz8uKClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgYmx1ckVsZW1lbnQoKSB7XG4gICAgICB0aGlzLmdldEZvY3VzRWxlbWVudCgpPy5ibHVyPy4oKVxuICAgIH0sXG5cbiAgICBnZXRGb2N1c0VsZW1lbnQoKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gYXNBcnJheSh0aGlzLiRyZWZzLmVsZW1lbnQpWzBdID8/IHRoaXNcbiAgICAgIHJldHVybiBlbGVtZW50LiRlbCA/PyBlbGVtZW50XG4gICAgfSxcblxuICAgIGFzeW5jIGZvY3VzU2NoZW1hKCkge1xuICAgICAgLy8gQWxzbyBmb2N1cyB0aGlzIGNvbXBvbmVudCdzIHNjaGVtYSBhbmQgcGFuZWwgaW4gY2FzZSBpdCdzIGEgdGFiLlxuICAgICAgYXdhaXQgdGhpcy5zY2hlbWFDb21wb25lbnQuZm9jdXMoKVxuICAgICAgYXdhaXQgdGhpcy50YWJDb21wb25lbnQ/LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9jdXMoKSB7XG4gICAgICBhd2FpdCB0aGlzLmZvY3VzU2NoZW1hKClcbiAgICAgIHRoaXMuc2Nyb2xsSW50b1ZpZXcoKVxuICAgICAgdGhpcy5mb2N1c0VsZW1lbnQoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5ibHVyRWxlbWVudCgpXG4gICAgfSxcblxuICAgIGNsZWFyKCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGxcbiAgICAgIHRoaXMuYmx1cigpXG4gICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICB9LFxuXG4gICAgb25Gb2N1cygpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWVcbiAgICAgIHRoaXMubWFya1RvdWNoZWQoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2ZvY3VzJylcbiAgICB9LFxuXG4gICAgb25CbHVyKCkge1xuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2VcbiAgICAgIHRoaXMudmFsaWRhdGUoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2JsdXInKVxuICAgIH0sXG5cbiAgICBvbklucHV0KCkge1xuICAgICAgdGhpcy5tYXJrRGlydHkoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2lucHV0JylcbiAgICB9LFxuXG4gICAgb25DaGFuZ2UoKSB7XG4gICAgICB0aGlzLm1hcmtEaXJ0eSgpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnY2hhbmdlJywge1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgLy8gUHJldmVudCBlbmRsZXNzIHBhcnNlIHJlY3Vyc2lvbjpcbiAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZWRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5wYXJzZWRWYWx1ZSA6IHRoaXMudmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgLy8gUGFzcyBgc2NoZW1hQ29tcG9uZW50YCBhcyBwYXJlbnQsIHNvIGNoYW5nZSBldmVudHMgY2FuIHByb3BhZ2F0ZSB1cC5cbiAgICAgICAgcGFyZW50OiB0aGlzLnNjaGVtYUNvbXBvbmVudFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHRvUmF3IH0gZnJvbSAndnVlJ1xuXG5jb25zdCB1aWRNYXAgPSBuZXcgV2Vha01hcCgpXG5cbi8vIEdlbmVyYXRlZCBhbmQgcmVtZW1iZXJzIHVuaXF1ZSBpZHMgcGVyIHBhc3NlZCBvYmplY3QgdXNpbmcgYSB3ZWFrIG1hcC5cbmxldCB1aWQgPSAwXG5leHBvcnQgZnVuY3Rpb24gZ2V0VWlkKGl0ZW0sIGdldEl0ZW1JZCA9IG51bGwpIHtcbiAgY29uc3QgcmF3ID0gdG9SYXcoaXRlbSlcbiAgbGV0IGlkID0gdWlkTWFwLmdldChyYXcpXG4gIGlmICghaWQgJiYgaXRlbSkge1xuICAgIGlkID0gZ2V0SXRlbUlkPy4oaXRlbSkgfHwgYEAkeysrdWlkfWBcbiAgICB1aWRNYXAuc2V0KHJhdywgaWQpXG4gIH1cbiAgcmV0dXJuIGlkXG59XG4iLCJpbXBvcnQgeyBpc1RlbXBvcmFyeUlkIH0gZnJvbSAnLi9kYXRhLmpzJ1xuaW1wb3J0IHtcbiAgaXNJbnRlZ2VyLFxuICBhc0FycmF5LFxuICBwYXJzZURhdGFQYXRoLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZCdcblxuLy8gU2NoZW1hR3JhcGggaXMgYSBjbGFzcyB0byBjb2xsZWN0IHNjaGVtYSBncmFwaCBtZXRhIGluZm9ybWF0aW9uIGluIG9yZGVyIHRvXG4vLyBwcm9jZXNzIHNvdXJjZXMgYW5kIHJlbGF0aW9ucyBmb3IgdGhlIGdpdmVuIHRhcmdldHMgJ3NlcnZlcicgYW5kICdjbGlwYm9hcmQnLFxuLy8gYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdGFibGU6XG4vL1xuLy8gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tIHwgLS0tLS0tLS0tIHxcbi8vIHwgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlcnZlciAgICB8IGNsaXBib2FyZCB8XG4vLyB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0gfCAtLS0tLS0tLS0gfFxuLy8gfCB0eXBlOiAncmVsYXRpb24nLCBpbnRlcm5hbDogZmFsc2UgICAgICAgICAgIHwga2VlcCBpZCAgIHwga2VlcCBpZCAgIHxcbi8vIHwgdHlwZTogJ3JlbGF0aW9uJywgaW50ZXJuYWw6IHRydWUgICAgICAgICAgICB8IGtlZXAgaWQgICB8IHJlZiwgI3JlZiB8XG4vLyB8IHR5cGU6ICdyZWxhdGlvbicsIGludGVybmFsOiB0cnVlLCB0ZW1wb3JhcnkgfCByZWYsICNyZWYgfCByZWYsICNyZWYgfFxuLy8gfCB0eXBlOiAnc291cmNlJywgcmVsYXRlZDogZmFsc2UgICAgICAgICAgICAgIHwga2VlcCBpZCAgIHwgcmVtb3ZlIGlkIHxcbi8vIHwgdHlwZTogJ3NvdXJjZScsIHJlbGF0ZWQ6IGZhbHNlLCB0ZW1wb3JhcnkgICB8IHJlZiwgI2lkICB8IHJlbW92ZSBpZCB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiB0cnVlICAgICAgICAgICAgICAgfCBrZWVwIGlkICAgfCByZWYsICNpZCAgfFxuLy8gfCB0eXBlOiAnc291cmNlJywgcmVsYXRlZDogdHJ1ZSwgdGVtcG9yYXJ5ICAgIHwgcmVmLCAjaWQgIHwgcmVmLCAjaWQgIHxcbi8vIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IC0tLS0tLS0tLSB8IC0tLS0tLS0tLSB8XG5cbmV4cG9ydCBjbGFzcyBTY2hlbWFHcmFwaCB7XG4gIGdyYXBoID0ge31cbiAgcmVmZXJlbmNlcyA9IHt9XG5cbiAgc2V0KGRhdGFQYXRoLCBzZXR0aW5ncywgZGVmYXVsdHMpIHtcbiAgICBkYXRhUGF0aCA9IHBhcnNlRGF0YVBhdGgoZGF0YVBhdGgpXG4gICAgbGV0IHN1YkdyYXBoID0gdGhpcy5ncmFwaFxuICAgIGZvciAoY29uc3QgcGFydCBvZiBkYXRhUGF0aCkge1xuICAgICAgY29uc3Qga2V5ID0gaXNJbnRlZ2VyKCtwYXJ0KSA/ICcqJyA6IHBhcnRcbiAgICAgIHN1YkdyYXBoID0gc3ViR3JhcGhba2V5XSA/Pz0ge31cbiAgICB9XG4gICAgc3ViR3JhcGguJHNldHRpbmdzID0ge1xuICAgICAgLi4uZGVmYXVsdHMsIC8vIFNlZSBgYWRkU291cmNlKGRhdGFQYXRoKWBcbiAgICAgIC4uLnN1YkdyYXBoLiRzZXR0aW5ncyxcbiAgICAgIC4uLnNldHRpbmdzXG4gICAgfVxuICB9XG5cbiAgYWRkU291cmNlKGRhdGFQYXRoLCBzY2hlbWEpIHtcbiAgICAvLyBPbmx5IHNldCBgcmVsYXRlZDogZmFsc2VgIHRocm91Z2ggdGhlIGRlZmF1bHRzLCBhcyBgc2V0U291cmNlUmVsYXRlZCgpYFxuICAgIC8vIG1heSBiZSBjYWxsZWQgYmVmb3JlIGBhZGRTb3VyY2UoKWAsIGRlcGVuZGluZyBvbiB0aGUgZ3JhcGggc3RydWN0dXJlLlxuICAgIHRoaXMuc2V0KGRhdGFQYXRoLCB7IHR5cGU6ICdzb3VyY2UnLCBzY2hlbWEgfSwgeyByZWxhdGVkOiBmYWxzZSB9KVxuICB9XG5cbiAgc2V0U291cmNlUmVsYXRlZChkYXRhUGF0aCkge1xuICAgIHRoaXMuc2V0KGRhdGFQYXRoLCB7XG4gICAgICByZWxhdGVkOiB0cnVlLFxuICAgICAgcmVmZXJlbmNlOiB0aGlzLmdldFJlZmVyZW5jZVByZWZpeChkYXRhUGF0aClcbiAgICB9KVxuICB9XG5cbiAgYWRkUmVsYXRpb24oZGF0YVBhdGgsIHJlbGF0ZWREYXRhUGF0aCwgc2NoZW1hKSB7XG4gICAgdGhpcy5zZXQoZGF0YVBhdGgsIHtcbiAgICAgIHR5cGU6ICdyZWxhdGlvbicsXG4gICAgICBzY2hlbWEsXG4gICAgICBpbnRlcm5hbDogISFyZWxhdGVkRGF0YVBhdGgsXG4gICAgICByZWZlcmVuY2U6IHRoaXMuZ2V0UmVmZXJlbmNlUHJlZml4KHJlbGF0ZWREYXRhUGF0aClcbiAgICB9KVxuICB9XG5cbiAgZ2V0UmVmZXJlbmNlUHJlZml4KGRhdGFQYXRoKSB7XG4gICAgcmV0dXJuIGRhdGFQYXRoXG4gICAgICA/ICh0aGlzLnJlZmVyZW5jZXNbZGF0YVBhdGhdID8/PSBuYW5vaWQoNikpXG4gICAgICA6IG51bGxcbiAgfVxuXG4gIGZsYXR0ZW4oKSB7XG4gICAgY29uc3QgZmxhdHRlbiA9IGdyYXBoID0+IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuICAgICAgZm9yIChjb25zdCBba2V5LCB7ICRzZXR0aW5ncywgLi4uc3ViR3JhcGggfV0gb2YgT2JqZWN0LmVudHJpZXMoZ3JhcGgpKSB7XG4gICAgICAgIGlmICgkc2V0dGluZ3MpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2goW2tleSwgJHNldHRpbmdzXSlcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtzdWJLZXksIHNldHRpbmdzXSBvZiBmbGF0dGVuKHN1YkdyYXBoKSkge1xuICAgICAgICAgIGVudHJpZXMucHVzaChbYCR7a2V5fS8ke3N1YktleX1gLCBzZXR0aW5nc10pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXR0ZW4odGhpcy5ncmFwaClcbiAgfVxuXG4gIHByb2Nlc3Moc291cmNlU2NoZW1hLCBkYXRhLCB7IHRhcmdldCB9KSB7XG4gICAgY29uc3QgY2xpcGJvYXJkID0gdGFyZ2V0ID09PSAnY2xpcGJvYXJkJ1xuICAgIGlmIChjbGlwYm9hcmQpIHtcbiAgICAgIGRlbGV0ZSBkYXRhW3NvdXJjZVNjaGVtYS5pZEtleSB8fCAnaWQnXVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtkYXRhUGF0aCwgc2V0dGluZ3NdIG9mIHRoaXMuZmxhdHRlbigpKSB7XG4gICAgICBjb25zdCB7IHR5cGUsIHNjaGVtYSwgaW50ZXJuYWwsIHJlbGF0ZWQsIHJlZmVyZW5jZSB9ID0gc2V0dGluZ3NcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHR5cGUgPT09ICdzb3VyY2UnXG4gICAgICBjb25zdCByZWxhdGlvbiA9IHR5cGUgPT09ICdyZWxhdGlvbidcbiAgICAgIGlmIChzb3VyY2UgfHwgcmVsYXRpb24gJiYgaW50ZXJuYWwpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gZ2V0VmFsdWVBdERhdGFQYXRoKGRhdGEsIGRhdGFQYXRoLCAoKSA9PiBudWxsKVxuICAgICAgICBjb25zdCByZW1vdmVJZCA9IGNsaXBib2FyZCAmJiBzb3VyY2UgJiYgIXJlbGF0ZWRcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSAoXG4gICAgICAgICAgY2xpcGJvYXJkICYmIChcbiAgICAgICAgICAgIHJlbGF0aW9uICYmIGludGVybmFsIHx8XG4gICAgICAgICAgICBzb3VyY2UgJiYgcmVsYXRlZFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGFzQXJyYXkodmFsdWVzKS5mbGF0KCkpIHtcbiAgICAgICAgICBjb25zdCBpZEtleSA9IChcbiAgICAgICAgICAgIHNvdXJjZSAmJiBzY2hlbWEuaWRLZXkgfHxcbiAgICAgICAgICAgIHJlbGF0aW9uICYmIHNjaGVtYS5yZWxhdGVCeSB8fFxuICAgICAgICAgICAgJ2lkJ1xuICAgICAgICAgIClcbiAgICAgICAgICBsZXQgaWQgPSB2YWx1ZT8uW2lkS2V5XVxuICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVtb3ZlSWQpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlW2lkS2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlZmVyZW5jZUlkIHx8IGlzVGVtcG9yYXJ5SWQoaWQpKSB7XG4gICAgICAgICAgICAgIGlmIChpc1RlbXBvcmFyeUlkKGlkKSkge1xuICAgICAgICAgICAgICAgIGlkID0gaWQuc2xpY2UoMSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCByZWZLZXkgPSBjbGlwYm9hcmRcbiAgICAgICAgICAgICAgICA/IC8vIENsaXBib2FyZCBqdXN0IG5lZWRzIHRlbXBvcmFyeSBpZHMgdW5kZXIgdGhlIGFjdHVhbCBgaWRLZXlgXG4gICAgICAgICAgICAgICAgICBpZEtleVxuICAgICAgICAgICAgICAgIDogLy8gU2VydmVyIHdhbnRzIE9iamVjdGlvbi1zdHlsZSAnI2lkJyAvICcjcmVmJyBwYWlycy5cbiAgICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgPyAnI2lkJ1xuICAgICAgICAgICAgICAgICAgOiAnI3JlZidcbiAgICAgICAgICAgICAgY29uc3QgcmV2VmFsdWUgPSBjbGlwYm9hcmRcbiAgICAgICAgICAgICAgICA/IGBAJHtpZH1gXG4gICAgICAgICAgICAgICAgOiAvLyBLZWVwIHRoZSBpZHMgdW5pcXVlIGluIHJlZmVyZW5jZSBncm91cHMsIHNpbmNlIHRoZXlcbiAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBhY3Jvc3MgdGhlIGZ1bGwgZ3JhcGguXG4gICAgICAgICAgICAgICAgICByZWZlcmVuY2VcbiAgICAgICAgICAgICAgICAgID8gYCR7cmVmZXJlbmNlfS0ke2lkfWBcbiAgICAgICAgICAgICAgICAgIDogaWQgLy8gQSB0ZW1wb3JhcnkgaWQgd2l0aG91dCBhIHJlbGF0ZWQsIGp1c3QgcHJlc2VydmUgaXQuXG4gICAgICAgICAgICAgIHZhbHVlW3JlZktleV0gPSByZXZWYWx1ZVxuICAgICAgICAgICAgICBpZiAocmVmS2V5ICE9PSBpZEtleSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtpZEtleV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBpc0FycmF5LFxuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzRnVuY3Rpb24sXG4gIGlzRGF0ZSxcbiAgaXNSZWdFeHAsXG4gIGFzQXJyYXlcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuY29uc3QgdHlwZUNoZWNrZXJzID0ge1xuICBCb29sZWFuOiBpc0Jvb2xlYW4sXG4gIE51bWJlcjogaXNOdW1iZXIsXG4gIFN0cmluZzogaXNTdHJpbmcsXG4gIERhdGU6IGlzRGF0ZSxcbiAgQXJyYXk6IGlzQXJyYXksXG4gIE9iamVjdDogaXNPYmplY3QsXG4gIFJlZ0V4cDogaXNSZWdFeHAsXG4gIEZ1bmN0aW9uOiBpc0Z1bmN0aW9uXG59XG5cbi8vIERlY2xhcmUgdGhlc2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBgdHlwZUNvbnZlcnRlcnNgIG9iamVjdCwgdG8gcHJldmVudFxuLy8gQmFiZWwgaXNzdWVzIHdpdGggYE9iamVjdGAgb3ZlcnJpZGluZyB0aGUgZ2xvYmFsIGBPYmplY3RgOlxuY29uc3QgdG9Cb29sZWFuID0gdmFsdWUgPT4gISF2YWx1ZVxuY29uc3QgdG9OdW1iZXIgPSB2YWx1ZSA9PiArdmFsdWVcbmNvbnN0IHRvU3RyaW5nID0gdmFsdWUgPT4gU3RyaW5nKHZhbHVlKVxuXG5jb25zdCB0b0RhdGUgPSB2YWx1ZSA9PlxuICBpc0RhdGUodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogbmV3IERhdGUodmFsdWUpXG5cbmNvbnN0IHRvQXJyYXkgPSB2YWx1ZSA9PlxuICBpc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWVcbiAgICA6IGlzU3RyaW5nKHZhbHVlKVxuICAgICAgPyB2YWx1ZS5zcGxpdCgnLCcpXG4gICAgICA6IGFzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHRvT2JqZWN0ID0gdmFsdWUgPT5cbiAgaXNPYmplY3QodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogLy8gSWYgYSBPYmplY3QgaXMgZXhwZWN0ZWQgYnV0IGEgQm9vbGVhbiBwcm92aWRlLCBjb252ZXJ0IHRvIGFuIGVtcHR5XG4gICAgICAvLyBvYmplY3QuIFVzZWQgYnkgYGNyZWF0YWJsZWAgJiBjbywgdGhhdCBjYW4gYmUgYm90aC5cbiAgICAgIHZhbHVlID09PSB0cnVlXG4gICAgICA/IHt9XG4gICAgICA6IG51bGxcblxuY29uc3QgdG9SZWdFeHAgPSB2YWx1ZSA9PlxuICBpc1JlZ0V4cCh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiBuZXcgUmVnRXhwKHZhbHVlKVxuXG5jb25zdCB0eXBlQ29udmVydGVycyA9IHtcbiAgQm9vbGVhbjogdG9Cb29sZWFuLFxuICBOdW1iZXI6IHRvTnVtYmVyLFxuICBTdHJpbmc6IHRvU3RyaW5nLFxuICBEYXRlOiB0b0RhdGUsXG4gIEFycmF5OiB0b0FycmF5LFxuICBPYmplY3Q6IHRvT2JqZWN0LFxuICBSZWdFeHA6IHRvUmVnRXhwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpIHtcbiAgLy8gU2VlIGlmIGFueSBvZiB0aGUgZXhwZWN0IHR5cGVzIG1hdGNoLCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhleSBkbzpcbiAgaWYgKHR5cGVzICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIGlmICh0eXBlQ2hlY2tlcnNbdHlwZS5uYW1lXT8uKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlKHR5cGUsIHZhbHVlKSB7XG4gIGNvbnN0IGNvbnZlcnRlciA9IHR5cGUgJiYgdHlwZUNvbnZlcnRlcnNbdHlwZS5uYW1lIHx8IHR5cGVdXG4gIHJldHVybiBjb252ZXJ0ZXIgPyBjb252ZXJ0ZXIodmFsdWUpIDogdmFsdWVcbn1cbiIsImltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBEaXRvTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RpdG9NaXhpbi5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCB7IGdldFVpZCB9IGZyb20gJy4vdWlkLmpzJ1xuaW1wb3J0IHsgU2NoZW1hR3JhcGggfSBmcm9tICcuL1NjaGVtYUdyYXBoLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuL2RhdGEuanMnXG5pbXBvcnQgeyBpc01hdGNoaW5nVHlwZSwgY29udmVydFR5cGUgfSBmcm9tICcuL3R5cGUuanMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQXJyYXksXG4gIGlzRnVuY3Rpb24sXG4gIGlzUHJvbWlzZSxcbiAgaXNNb2R1bGUsXG4gIGFzQXJyYXksXG4gIGNsb25lLFxuICBjYW1lbGl6ZSxcbiAgYXNzaWduRGVlcGx5LFxuICBtYXBDb25jdXJyZW50bHksXG4gIGdldFZhbHVlQXREYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgbWFya1JhdywgcmVhY3RpdmUgfSBmcm9tICd2dWUnXG5cbmNvbnN0IHR5cGVDb21wb25lbnRzID0ge31cbmNvbnN0IHVua25vd25UeXBlUmVwb3J0ZWQgPSB7fVxuY29uc3QgZW1wdHlTY2hlbWEgPSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUeXBlQ29tcG9uZW50KHR5cGUsIGNvbXBvbmVudCkge1xuICB0eXBlQ29tcG9uZW50c1t0eXBlXSA9IGNvbXBvbmVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUNvbXBvbmVudCh0eXBlLCBhbGxvd051bGwgPSBmYWxzZSkge1xuICBjb25zdCBjb21wb25lbnQgPSB0eXBlQ29tcG9uZW50c1t0eXBlXSB8fCBudWxsXG4gIGlmICghY29tcG9uZW50ICYmICFhbGxvd051bGwgJiYgIXVua25vd25UeXBlUmVwb3J0ZWRbdHlwZV0pIHtcbiAgICAvLyBSZXBvcnQgZWFjaCBtaXNzaW5nIHR5cGUgb25seSBvbmNlLCB0byBhdm9pZCBmbG9vZGluZyB0aGUgY29uc29sZTpcbiAgICB1bmtub3duVHlwZVJlcG9ydGVkW3R5cGVdID0gdHJ1ZVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBEaXRvLmpzIGNvbXBvbmVudCB0eXBlOiAnJHt0eXBlfSdgKVxuICB9XG4gIHJldHVybiBjb21wb25lbnRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVTY2hlbWFDb21wb25lbnRzKHNjaGVtYXMsIGNhbGxiYWNrKSB7XG4gIGZvciAoY29uc3Qgc2NoZW1hIG9mIHNjaGVtYXMpIHtcbiAgICBpZiAoaXNTaW5nbGVDb21wb25lbnRWaWV3KHNjaGVtYSkpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGNhbGxiYWNrKHNjaGVtYS5jb21wb25lbnQsIHNjaGVtYS5uYW1lLCAwKVxuICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXNcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU2NoZW1hKHNjaGVtYSkpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hLmNvbXBvbmVudHMgfHwge30pKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGNhbGxiYWNrKGNvbXBvbmVudCwgbmFtZSwgMSlcbiAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlTmVzdGVkU2NoZW1hQ29tcG9uZW50cyhzY2hlbWEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBzY2hlbWFcbiAgICA/IGl0ZXJhdGVTY2hlbWFDb21wb25lbnRzKFtzY2hlbWEsIC4uLmdldFRhYlNjaGVtYXMoc2NoZW1hKV0sIGNhbGxiYWNrKVxuICAgIDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTmVzdGVkU2NoZW1hQ29tcG9uZW50KHNjaGVtYSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIChcbiAgICBpdGVyYXRlTmVzdGVkU2NoZW1hQ29tcG9uZW50cyhcbiAgICAgIHNjaGVtYSxcbiAgICAgIGNvbXBvbmVudCA9PiAoY2FsbGJhY2soY29tcG9uZW50KSA/IGNvbXBvbmVudCA6IHVuZGVmaW5lZClcbiAgICApID8/IG51bGxcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc29tZU5lc3RlZFNjaGVtYUNvbXBvbmVudChzY2hlbWEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiAoXG4gICAgaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoXG4gICAgICBzY2hlbWEsXG4gICAgICBjb21wb25lbnQgPT4gKGNhbGxiYWNrKGNvbXBvbmVudCkgPyB0cnVlIDogdW5kZWZpbmVkKVxuICAgICkgPz8gZmFsc2VcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlcnlOZXN0ZWRTY2hlbWFDb21wb25lbnQoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gKFxuICAgIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKFxuICAgICAgc2NoZW1hLFxuICAgICAgY29tcG9uZW50ID0+IChjYWxsYmFjayhjb21wb25lbnQpID8gdW5kZWZpbmVkIDogZmFsc2UpXG4gICAgKSA/PyB0cnVlXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc05lc3RlZFNjaGVtYUNvbXBvbmVudHMoc2NoZW1hKSB7XG4gIHJldHVybiBzb21lTmVzdGVkU2NoZW1hQ29tcG9uZW50KHNjaGVtYSwgKCkgPT4gdHJ1ZSkgPz8gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NoZW1hKHNjaGVtYSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hKSAmJiBpc1N0cmluZyhzY2hlbWEudHlwZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRm9ybShzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICdmb3JtJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWaWV3KHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3ZpZXcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhYihzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICd0YWInXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BhbmVsKHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3BhbmVsJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNZW51KHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ21lbnUnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFJZGVudGlmaWVyKHNjaGVtYSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2NoZW1hKVxufVxuXG5jb25zdCByZXNvbHZlZFNjaGVtYXMgPSBuZXcgV2Vha01hcCgpXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNjaGVtYSh2YWx1ZSwgdW53cmFwTW9kdWxlID0gZmFsc2UpIHtcbiAgaWYgKHJlc29sdmVkU2NoZW1hcy5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVkU2NoZW1hcy5nZXQodmFsdWUpXG4gIH1cbiAgbGV0IHNjaGVtYSA9IHZhbHVlXG4gIGlmIChpc0Z1bmN0aW9uKHNjaGVtYSkpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKVxuICB9XG4gIGlmIChpc1Byb21pc2Uoc2NoZW1hKSkge1xuICAgIHNjaGVtYSA9IGF3YWl0IHNjaGVtYVxuICB9XG4gIGlmIChpc01vZHVsZShzY2hlbWEpKSB7XG4gICAgLy8gQ29weSB0byBjb252ZXJ0IGZyb20gbW9kdWxlIHRvIG9iamVjdDpcbiAgICBzY2hlbWEgPSB7IC4uLnNjaGVtYSB9XG4gICAgLy8gVW53cmFwIGRlZmF1bHQgb3IgbmFtZWQgc2NoZW1hXG4gICAgaWYgKCFzY2hlbWEubmFtZSAmJiAodW53cmFwTW9kdWxlIHx8IHNjaGVtYS5kZWZhdWx0KSkge1xuICAgICAgLy8gRmlsdGVyIG91dCBpbnRlcm5hbCBrZXkgYWRkZWQgYnkgdml0ZSAvIHZ1ZSAzIHBsdWdpbiB3aGVuIGNoYW5naW5nXG4gICAgICAvLyBjb2RlIGluIGEgZHluYW1pY2FsbHkgaW1wb3J0ZWQgdnVlIGNvbXBvbmVudCwgc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlLXBsdWdpbi12dWUvYmxvYi9hYmRmNWY0ZjMyZDAyYWY2NDFlNWY2MDg3MWJkZTE0NTM1NTY5YjFlL3BhY2thZ2VzL3BsdWdpbi12dWUvc3JjL21haW4udHMjTDEzM1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYSkuZmlsdGVyKGtleSA9PiBrZXkgIT09ICdfcmVyZW5kZXJfb25seScpXG4gICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGtleXNbMF1cbiAgICAgICAgc2NoZW1hID0gc2NoZW1hW25hbWVdXG4gICAgICAgIGlmIChuYW1lICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICBzY2hlbWEgPSB7IC4uLnNjaGVtYSwgbmFtZSB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVzb2x2ZWRTY2hlbWFzLnNldCh2YWx1ZSwgc2NoZW1hKVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hcyhcbiAgdW5yZXNvbHZlZFNjaGVtYXMsXG4gIHJlc29sdmVJdGVtID0gcmVzb2x2ZVNjaGVtYVxuKSB7XG4gIGxldCBzY2hlbWFzID0gaXNGdW5jdGlvbih1bnJlc29sdmVkU2NoZW1hcylcbiAgICA/IHVucmVzb2x2ZWRTY2hlbWFzKClcbiAgICA6IHVucmVzb2x2ZWRTY2hlbWFzXG4gIHNjaGVtYXMgPSBhd2FpdCByZXNvbHZlU2NoZW1hKHNjaGVtYXMsIGZhbHNlKVxuICBpZiAoaXNBcnJheShzY2hlbWFzKSkge1xuICAgIC8vIFRyYW5zbGF0ZSBhbiBhcnJheSBvZiBkeW5hbWljIGltcG9ydCwgZWFjaCBpbXBvcnRpbmcgb25lIG5hbWVkIHNjaGVtYVxuICAgIC8vIG1vZHVsZSB0byBhbiBvYmplY3Qgd2l0aCBuYW1lZCBlbnRyaWVzLlxuICAgIHNjaGVtYXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBhd2FpdCBtYXBDb25jdXJyZW50bHkoXG4gICAgICAgIHNjaGVtYXMsXG4gICAgICAgIGFzeW5jIGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHJlc29sdmVJdGVtKGl0ZW0sIHRydWUpXG4gICAgICAgICAgcmV0dXJuIFtzY2hlbWEubmFtZSwgc2NoZW1hXVxuICAgICAgICB9XG4gICAgICApXG4gICAgKVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNjaGVtYXMpKSB7XG4gICAgc2NoZW1hcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGF3YWl0IG1hcENvbmN1cnJlbnRseShcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc2NoZW1hcyksXG4gICAgICAgIGFzeW5jIChba2V5LCBpdGVtXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHJlc29sdmVJdGVtKGl0ZW0sIHRydWUpXG4gICAgICAgICAgcmV0dXJuIFtrZXksIHNjaGVtYV1cbiAgICAgICAgfVxuICAgICAgKVxuICAgIClcbiAgfVxuICByZXR1cm4gc2NoZW1hc1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZpZXdzKHVucmVzb2x2ZWRWaWV3cykge1xuICByZXR1cm4gcmVzb2x2ZVNjaGVtYXModW5yZXNvbHZlZFZpZXdzLCBhc3luYyAoc2NoZW1hLCB1bndyYXBNb2R1bGUpID0+IHtcbiAgICBzY2hlbWEgPSBhd2FpdCByZXNvbHZlU2NoZW1hKHNjaGVtYSwgdW53cmFwTW9kdWxlKVxuICAgIGlmICghc2NoZW1hLm5hbWUgJiYgaXNNZW51KHNjaGVtYSkpIHtcbiAgICAgIC8vIEdlbmVyYXRlIGEgbmFtZSBmb3Igc3ViLW1lbnVzIGZyb20gdGhlaXIgbGFiZWwgaWYgaXQncyBtaXNzaW5nLlxuICAgICAgLy8gTk9URTogVGhpcyBpcyBuZXZlciBhY3R1YWxseSByZWZlcmVuY2VkIGZyb20gYW55d2hlcmUsIGJ1dCB0aGV5IG5lZWRcbiAgICAgIC8vIGEgbmFtZSBieSB3aGljaCB0aGV5J3JlIHN0b3JlZCBpbiB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgIHNjaGVtYSA9IHtcbiAgICAgICAgLi4uc2NoZW1hLFxuICAgICAgICBuYW1lOiBjYW1lbGl6ZShzY2hlbWEubGFiZWwpLFxuICAgICAgICBpdGVtczogYXdhaXQgcmVzb2x2ZVNjaGVtYXMoc2NoZW1hLml0ZW1zKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2NoZW1hXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuVmlld3Modmlld3MpIHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyh2aWV3cykucmVkdWNlKFxuICAgICAgKGVudHJpZXMsIFtrZXksIHNjaGVtYV0pID0+IHtcbiAgICAgICAgaWYgKGlzTWVudShzY2hlbWEpKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKC4uLk9iamVjdC5lbnRyaWVzKHNjaGVtYS5pdGVtcykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtrZXksIHNjaGVtYV0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICAgIH0sXG4gICAgICBbXVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNjaGVtYUNvbXBvbmVudChzY2hlbWEpIHtcbiAgLy8gUmVzb2x2ZXMgYXN5bmMgc2NoZW1hIGNvbXBvbmVudHMgYW5kIGFkZHMgRGl0b01peGluIGFuZCBUeXBlTWl4aW4gdG8gdGhlbS5cbiAgbGV0IHsgY29tcG9uZW50IH0gPSBzY2hlbWFcbiAgaWYgKGNvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudCA9IGF3YWl0IHJlc29sdmVTY2hlbWEoY29tcG9uZW50LCB0cnVlKVxuICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgIC8vIFByZXZlbnQgd2FybmluZzogXCJWdWUgcmVjZWl2ZWQgYSBDb21wb25lbnQgd2hpY2ggd2FzIG1hZGUgYSByZWFjdGl2ZVxuICAgICAgLy8gb2JqZWN0LiBUaGlzIGNhbiBsZWFkIHRvIHVubmVjZXNzYXJ5IHBlcmZvcm1hbmNlIG92ZXJoZWFkLCBhbmQgc2hvdWxkXG4gICAgICAvLyBiZSBhdm9pZGVkIGJ5IG1hcmtpbmcgdGhlIGNvbXBvbmVudCB3aXRoIGBtYXJrUmF3YFwiOlxuICAgICAgc2NoZW1hLmNvbXBvbmVudCA9IG1hcmtSYXcoe1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIG1peGluczogW0RpdG9NaXhpbiwgVHlwZU1peGluLCAuLi4oY29tcG9uZW50Lm1peGlucyB8fCBbXSldXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hcykge1xuICAvLyBgc2NoZW1hc2AgYXJlIG9mIHRoZSBzYW1lIHBvc3NpYmxlIGZvcm1zIGFzIHBhc3NlZCB0byBgZ2V0TmFtZWRTY2hlbWFzKClgXG4gIGF3YWl0IG1hcENvbmN1cnJlbnRseShPYmplY3QudmFsdWVzKHNjaGVtYXMgfHwge30pLCByZXNvbHZlU2NoZW1hQ29tcG9uZW50KVxufVxuXG5jb25zdCBwcm9jZXNzZWRTY2hlbWFEZXB0aHMgPSBuZXcgV2Vha01hcCgpXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoXG4gIGFwaSxcbiAgc2NoZW1hLFxuICByb3V0ZXMgPSBudWxsLFxuICBsZXZlbCA9IDAsXG4gIG1heERlcHRoID0gMVxuKSB7XG4gIGlmIChzY2hlbWEpIHtcbiAgICBjb25zdCBkZXB0aCA9IHByb2Nlc3NlZFNjaGVtYURlcHRocy5nZXQoc2NoZW1hKSA/PyAwXG4gICAgaWYgKGRlcHRoIDwgbWF4RGVwdGgpIHtcbiAgICAgIHByb2Nlc3NlZFNjaGVtYURlcHRocy5zZXQoc2NoZW1hLCBkZXB0aCArIDEpXG4gICAgICBjb25zdCBwcm9taXNlcyA9IFtdXG4gICAgICBjb25zdCBwcm9jZXNzID0gKGNvbXBvbmVudCwgbmFtZSwgcmVsYXRpdmVMZXZlbCkgPT4ge1xuICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgIHByb2Nlc3NTY2hlbWFDb21wb25lbnQoXG4gICAgICAgICAgICBhcGksXG4gICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcm91dGVzLFxuICAgICAgICAgICAgbGV2ZWwgKyByZWxhdGl2ZUxldmVsXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKHNjaGVtYSwgcHJvY2VzcylcbiAgICAgIGl0ZXJhdGVTY2hlbWFDb21wb25lbnRzKGdldFBhbmVsU2NoZW1hcyhzY2hlbWEpLCBwcm9jZXNzKVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzU2NoZW1hQ29tcG9uZW50KFxuICBhcGksXG4gIHNjaGVtYSxcbiAgbmFtZSxcbiAgcm91dGVzID0gbnVsbCxcbiAgbGV2ZWwgPSAwXG4pIHtcbiAgcHJvY2Vzc1NjaGVtYURlZmF1bHRzKGFwaSwgc2NoZW1hKVxuXG4gIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgLy8gQWxzbyBwcm9jZXNzIG5lc3RlZCBwYW5lbCBzY2hlbWFzLlxuICAgIG1hcENvbmN1cnJlbnRseShcbiAgICAgIGdldFBhbmVsU2NoZW1hcyhzY2hlbWEpLFxuICAgICAgcGFuZWwgPT4gcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBwYW5lbCwgcm91dGVzLCBsZXZlbClcbiAgICApLFxuICAgIC8vIERlbGVnYXRlIHNjaGVtYSBwcm9jZXNzaW5nIHRvIHRoZSBhY3R1YWwgdHlwZSBjb21wb25lbnRzLlxuICAgIGdldFR5cGVPcHRpb25zKHNjaGVtYSk/LnByb2Nlc3NTY2hlbWE/LihcbiAgICAgIGFwaSxcbiAgICAgIHNjaGVtYSxcbiAgICAgIG5hbWUsXG4gICAgICByb3V0ZXMsXG4gICAgICBsZXZlbFxuICAgIClcbiAgXSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NWaWV3KGNvbXBvbmVudCwgYXBpLCBzY2hlbWEsIG5hbWUsIGZ1bGxQYXRoID0gJycpIHtcbiAgcHJvY2Vzc1NjaGVtYURlZmF1bHRzKGFwaSwgc2NoZW1hKVxuICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUsIGZ1bGxQYXRoKVxuICBsZXQgY2hpbGRyZW4gPSBbXVxuICBpZiAoaXNWaWV3KHNjaGVtYSkpIHtcbiAgICBhd2FpdCBwcm9jZXNzTmVzdGVkU2NoZW1hcyhhcGksIHNjaGVtYSlcbiAgICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhhcGksIHNjaGVtYSwgY2hpbGRyZW4pXG4gIH0gZWxzZSBpZiAoaXNNZW51KHNjaGVtYSkpIHtcbiAgICBjaGlsZHJlbiA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgT2JqZWN0LmVudHJpZXMoc2NoZW1hLml0ZW1zKS5tYXAoYXN5bmMgKFtuYW1lLCBpdGVtXSkgPT5cbiAgICAgICAgcHJvY2Vzc1ZpZXcoY29tcG9uZW50LCBhcGksIGl0ZW0sIG5hbWUsIHNjaGVtYS5mdWxsUGF0aClcbiAgICAgIClcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZpZXcgc2NoZW1hOiAnJHtnZXRTY2hlbWFJZGVudGlmaWVyKHNjaGVtYSl9J2ApXG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBzY2hlbWEuZnVsbFBhdGgsXG4gICAgY2hpbGRyZW4sXG4gICAgY29tcG9uZW50LFxuICAgIG1ldGE6IHtcbiAgICAgIGFwaSxcbiAgICAgIHNjaGVtYVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1NjaGVtYURlZmF1bHRzKGFwaSwgc2NoZW1hKSB7XG4gIGxldCBkZWZhdWx0cyA9IChcbiAgICBhcGkuZGVmYXVsdHNbc2NoZW1hLnR5cGVdIHx8XG4gICAgYXBpLmRlZmF1bHRzW2NhbWVsaXplKHNjaGVtYS50eXBlKV1cbiAgKVxuICBpZiAoZGVmYXVsdHMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihkZWZhdWx0cykpIHtcbiAgICAgIGRlZmF1bHRzID0gZGVmYXVsdHMoc2NoZW1hKVxuICAgIH1cbiAgICBpZiAoaXNPYmplY3QoZGVmYXVsdHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZWZhdWx0cykpIHtcbiAgICAgICAgaWYgKHNjaGVtYVtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzY2hlbWFba2V5XSA9IHZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NoZW1hW2tleV0gPSBhc3NpZ25EZWVwbHkoc2NoZW1hW2tleV0sIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzTmVzdGVkU2NoZW1hRGVmYXVsdHMoYXBpLCBzY2hlbWEpIHtcbiAgLy8gUHJvY2VzcyBkZWZhdWx0cyBmb3IgbmVzdGVkIHNjaGVtYXMuIE5vdGUgdGhhdCB0aGlzIGlzIGFsc28gZG9uZSB3aGVuXG4gIC8vIGNhbGxpbmcgYHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKClgLCBidXQgdGhhdCBmdW5jdGlvbiBpcyBhc3luYywgYW5kIHdlXG4gIC8vIG5lZWQgYSBzeW5jIHZlcnNpb24gdGhhdCBvbmx5IGhhbmRsZXMgdGhlIGRlZmF1bHRzIGZvciBmaWx0ZXJzLCBzZWVcbiAgLy8gYGdldEZpbHRlcnNQYW5lbCgpYC5cbiAgaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLCBjb21wb25lbnQgPT4ge1xuICAgIHByb2Nlc3NTY2hlbWFEZWZhdWx0cyhhcGksIGNvbXBvbmVudClcbiAgICBjb25zdCBmb3JtcyA9IGdldEZvcm1TY2hlbWFzKGNvbXBvbmVudClcbiAgICBmb3IgKGNvbnN0IGZvcm0gb2YgT2JqZWN0LnZhbHVlcyhmb3JtcykpIHtcbiAgICAgIHByb2Nlc3NOZXN0ZWRTY2hlbWFEZWZhdWx0cyhhcGksIGZvcm0pXG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1JvdXRlU2NoZW1hKGFwaSwgc2NoZW1hLCBuYW1lLCBmdWxsUGF0aCA9IG51bGwpIHtcbiAgLy8gVXNlZCBmb3IgdmlldyBhbmQgc291cmNlIHNjaGVtYXMsIHNlZSBTb3VyY2VNaXhpbi5cbiAgc2NoZW1hLm5hbWUgPz89IG5hbWVcbiAgc2NoZW1hLnBhdGggPz89IGFwaS5ub3JtYWxpemVQYXRoKG5hbWUpXG4gIGlmIChmdWxsUGF0aCAhPT0gbnVsbCkge1xuICAgIHNjaGVtYS5mdWxsUGF0aCA9IGAke2Z1bGxQYXRofS8ke3NjaGVtYS5wYXRofWBcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0Zvcm1zKGFwaSwgc2NoZW1hLCBsZXZlbCkge1xuICBjb25zdCByb3V0ZXMgPSBbXVxuICAvLyBGaXJzdCByZXNvbHZlIHRoZSBmb3JtcyBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgYmFjayBvbiB0aGUgc2NoZW1hLlxuICBjb25zdCB7IGZvcm0sIGZvcm1zLCBjb21wb25lbnRzLCBtYXhEZXB0aCA9IDEgfSA9IHNjaGVtYVxuICBpZiAoZm9ybXMpIHtcbiAgICBzY2hlbWEuZm9ybXMgPSBhd2FpdCByZXNvbHZlU2NoZW1hcyhmb3JtcywgZm9ybSA9PlxuICAgICAgcHJvY2Vzc0Zvcm0oYXBpLCBmb3JtLCByb3V0ZXMsIGxldmVsLCBtYXhEZXB0aClcbiAgICApXG4gIH0gZWxzZSBpZiAoZm9ybSkge1xuICAgIHNjaGVtYS5mb3JtID0gYXdhaXQgcHJvY2Vzc0Zvcm0oYXBpLCBmb3JtLCByb3V0ZXMsIGxldmVsLCBtYXhEZXB0aClcbiAgfSBlbHNlIGlmIChpc09iamVjdChjb21wb25lbnRzKSkge1xuICAgIC8vIE5PVEU6IFByb2Nlc3NpbmcgZm9ybXMgaW4gY29tcHV0ZWQgY29tcG9uZW50cyBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSBpdFxuICAgIC8vIG9ubHkgY2FuIGJlIGNvbXB1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggYWN0dWFsIGRhdGEuXG4gICAgY29uc3QgZm9ybSA9IHtcbiAgICAgIHR5cGU6ICdmb3JtJyxcbiAgICAgIGNvbXBvbmVudHNcbiAgICB9XG4gICAgYXdhaXQgcHJvY2Vzc0Zvcm0oYXBpLCBmb3JtLCByb3V0ZXMsIGxldmVsLCBtYXhEZXB0aClcbiAgfVxuICByZXR1cm4gcm91dGVzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRm9ybShcbiAgYXBpLFxuICBzY2hlbWEsXG4gIHJvdXRlcyA9IG51bGwsXG4gIGxldmVsID0gMCxcbiAgbWF4RGVwdGggPSAxXG4pIHtcbiAgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHRydWUpXG4gIGlmICghaXNGb3JtKHNjaGVtYSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZm9ybSBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICBwcm9jZXNzU2NoZW1hRGVmYXVsdHMoYXBpLCBzY2hlbWEpXG4gIGF3YWl0IHByb2Nlc3NOZXN0ZWRTY2hlbWFzKGFwaSwgc2NoZW1hKVxuICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhhcGksIHNjaGVtYSwgcm91dGVzLCBsZXZlbCwgbWF4RGVwdGgpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NUYWIoYXBpLCBzY2hlbWEpIHtcbiAgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHRydWUpXG4gIGlmICghaXNUYWIoc2NoZW1hKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YWIgc2NoZW1hOiAnJHtnZXRTY2hlbWFJZGVudGlmaWVyKHNjaGVtYSl9J2ApXG4gIH1cbiAgcHJvY2Vzc1NjaGVtYURlZmF1bHRzKGFwaSwgc2NoZW1hKVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzUGFuZWwoYXBpLCBzY2hlbWEpIHtcbiAgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHRydWUpXG4gIGlmICghaXNQYW5lbChzY2hlbWEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhbmVsIHNjaGVtYTogJyR7Z2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpfSdgKVxuICB9XG4gIHByb2Nlc3NTY2hlbWFEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgcmV0dXJuIHNjaGVtYVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc05lc3RlZFNjaGVtYXMoYXBpLCBzY2hlbWEpIHtcbiAgY29uc3QgeyB0YWJzLCBwYW5lbHMgfSA9IHNjaGVtYVxuICBpZiAodGFicykge1xuICAgIHNjaGVtYS50YWJzID0gYXdhaXQgcmVzb2x2ZVNjaGVtYXMoXG4gICAgICB0YWJzLFxuICAgICAgdGFiID0+IHByb2Nlc3NUYWIoYXBpLCB0YWIpXG4gICAgKVxuICB9XG4gIGlmIChwYW5lbHMpIHtcbiAgICBzY2hlbWEucGFuZWxzID0gYXdhaXQgcmVzb2x2ZVNjaGVtYXMoXG4gICAgICBwYW5lbHMsXG4gICAgICBwYW5lbCA9PiBwcm9jZXNzUGFuZWwoYXBpLCBwYW5lbClcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zvcm1TY2hlbWEoc2NoZW1hKSB7XG4gIC8vIFN1cHBvcnQgYm90aCBzaW5nbGUgZm9ybSBhbmQgbXVsdGlwbGUgZm9ybXMgbm90YXRpb24sIGFzIHdlbGwgYXMgaW5saW5lZFxuICAvLyBjb21wb25lbnRzLlxuICByZXR1cm4gKFxuICAgIGlzU2NoZW1hKHNjaGVtYSkgJiZcbiAgICBpc09iamVjdChzY2hlbWEuZm9ybSB8fCBzY2hlbWEuZm9ybXMgfHwgc2NoZW1hLmNvbXBvbmVudHMpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc011bHRpcGxlRm9ybVNjaGVtYXMoc2NoZW1hKSB7XG4gIHJldHVybiAoXG4gICAgaXNTY2hlbWEoc2NoZW1hKSAmJlxuICAgIE9iamVjdC5rZXlzKHNjaGVtYT8uZm9ybXMgfHwge30pLmxlbmd0aCA+IDFcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTaW5nbGVDb21wb25lbnRWaWV3KHNjaGVtYSkge1xuICByZXR1cm4gKFxuICAgIGlzVmlldyhzY2hlbWEpICYmXG4gICAgaXNPYmplY3Qoc2NoZW1hLmNvbXBvbmVudClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld0Zvcm1TY2hlbWEoc2NoZW1hLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgdmlldyB9ID0gc2NoZW1hXG4gIGNvbnN0IHZpZXdTY2hlbWEgPSB2aWV3ICYmIGNvbnRleHQuZmxhdHRlbmVkVmlld3Nbdmlld11cbiAgcmV0dXJuIHZpZXdTY2hlbWFcbiAgICA/IC8vIE5PVEU6IFZpZXdzIGNhbiBoYXZlIHRhYnMsIGluIHdoaWNoIGNhc2UgdGhlIHZpZXcgY29tcG9uZW50IGlzIG5lc3RlZFxuICAgICAgLy8gaW4gb25lIG9mIHRoZSB0YWJzLCBnbyBmaW5kIGl0LlxuICAgICAgZmluZE5lc3RlZFNjaGVtYUNvbXBvbmVudCh2aWV3U2NoZW1hLCBoYXNGb3JtU2NoZW1hKSB8fCBudWxsXG4gICAgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3U2NoZW1hKHNjaGVtYSwgY29udGV4dCkge1xuICByZXR1cm4gZ2V0Vmlld0Zvcm1TY2hlbWEoc2NoZW1hLCBjb250ZXh0KVxuICAgID8gY29udGV4dC5mbGF0dGVuZWRWaWV3c1tzY2hlbWEudmlld11cbiAgICA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZpZXdTY2hlbWEoc2NoZW1hLCBjb250ZXh0KSB7XG4gIHJldHVybiAhIWdldFZpZXdTY2hlbWEoc2NoZW1hLCBjb250ZXh0KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld1BhdGgoc2NoZW1hLCBjb250ZXh0KSB7XG4gIGNvbnN0IHZpZXcgPSBnZXRWaWV3U2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgaWYgKHZpZXcpIHtcbiAgICByZXR1cm4gaXNTaW5nbGVDb21wb25lbnRWaWV3KHZpZXcpXG4gICAgICA/IHZpZXcuZnVsbFBhdGhcbiAgICAgIDogYCR7dmlldy5mdWxsUGF0aH0vJHt2aWV3LnBhdGh9YFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3RWRpdFBhdGgoc2NoZW1hLCBpZCwgY29udGV4dCkge1xuICBjb25zdCBwYXRoID0gZ2V0Vmlld1BhdGgoc2NoZW1hLCBjb250ZXh0KVxuICByZXR1cm4gcGF0aCA/IGAke3BhdGh9LyR7aWR9YCA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1TY2hlbWFzKHNjaGVtYSwgY29udGV4dCwgbW9kaWZ5Rm9ybSkge1xuICBjb25zdCB2aWV3U2NoZW1hID0gY29udGV4dCAmJiBnZXRWaWV3Rm9ybVNjaGVtYShzY2hlbWEsIGNvbnRleHQpXG4gIGlmICh2aWV3U2NoZW1hKSB7XG4gICAgc2NoZW1hID0gdmlld1NjaGVtYVxuICB9IGVsc2UgaWYgKHNjaGVtYS52aWV3KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHZpZXc6ICcke3NjaGVtYS52aWV3fSdgKVxuICB9XG5cbiAgbGV0IHsgZm9ybSwgZm9ybXMgfSA9IHNjaGVtYVxuICBpZiAoIWZvcm0gJiYgIWZvcm1zKSB7XG4gICAgY29uc3QgeyBuYW1lLCBjb21wYWN0LCBjbGlwYm9hcmQsIHRhYnMsIGNvbXBvbmVudHMgfSA9IHNjaGVtYVxuICAgIGlmIChjb21wb25lbnRzIHx8IHRhYnMpIHtcbiAgICAgIC8vIENvbnZlcnQgaW5saW5lZCBmb3JtcyB0byBzdGFuZC1hbG9uZSBmb3Jtcywgc3VwcG9ydGluZyBgbmFtZWAsXG4gICAgICAvLyBgY29tcGFjdGAsIGBjbGlwYm9hcmRgLCBgdGFic2AgYW5kIGBjb21wb25lbnRzYCBzZXR0aW5ncy5cbiAgICAgIGZvcm0gPSB7IHR5cGU6ICdmb3JtJywgbmFtZSwgY29tcGFjdCwgY2xpcGJvYXJkLCB0YWJzLCBjb21wb25lbnRzIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYGZvcm1zYCwgYGZvcm1gIG9yIGBjb21wb25lbnRzYCwgcmV0dXJuIGFuZCBlbXB0eSBgZm9ybXNgIG9iamVjdC5cbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuICBmb3JtcyB8fD0geyBkZWZhdWx0OiBmb3JtIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhmb3JtcykubWFwKChbdHlwZSwgZm9ybV0pID0+IHtcbiAgICAgIC8vIFN1cHBvcnQgYHNjaGVtYS5jb21wb25lbnRzYCBjYWxsYmFja3MgdG8gY3JlYXRlIGNvbXBvbmVudHMgb24gdGhlIGZseS5cbiAgICAgIGlmIChjb250ZXh0ICYmIGlzRnVuY3Rpb24oZm9ybS5jb21wb25lbnRzKSkge1xuICAgICAgICAvLyBNYWtlIHRoZSBmb3JtIHNjaGVtYSByZWFjdGl2ZSBzaW5jZSBgcHJvY2Vzc0Zvcm0oKWAgaXMgYXN5bmMsIHNvIHRoYXRcbiAgICAgICAgLy8gdGhlIHNldHRpbmcgb2YgZGVmYXVsdHMgd2lsbCBiZSBwaWNrZWQgdXAgYnkgZG93bnN0cmVhbSBjb2RlLlxuICAgICAgICBmb3JtID0gcmVhY3RpdmUoe1xuICAgICAgICAgIC4uLmZvcm0sXG4gICAgICAgICAgY29tcG9uZW50czogZm9ybS5jb21wb25lbnRzKGNvbnRleHQpXG4gICAgICAgIH0pXG4gICAgICAgIC8vIFByb2Nlc3MgdGhlIGZvcm0gYWdhaW4sIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGNvbXBvbmVudHMuXG4gICAgICAgIHByb2Nlc3NGb3JtKGNvbnRleHQuYXBpLCBmb3JtKS5jYXRjaChjb25zb2xlLmVycm9yKVxuICAgICAgfVxuICAgICAgcmV0dXJuIFt0eXBlLCBtb2RpZnlGb3JtPy4oZm9ybSkgPz8gZm9ybV1cbiAgICB9KVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtRm9ybVNjaGVtYUZyb21Gb3Jtcyhmb3JtcywgaXRlbSkge1xuICByZXR1cm4gZm9ybXNbaXRlbT8udHlwZV0gfHwgZm9ybXMuZGVmYXVsdCB8fCBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIGl0ZW0sIGNvbnRleHQpIHtcbiAgcmV0dXJuIChcbiAgICBnZXRJdGVtRm9ybVNjaGVtYUZyb21Gb3JtcyhnZXRGb3JtU2NoZW1hcyhzY2hlbWEsIGNvbnRleHQpLCBpdGVtKSB8fFxuICAgIC8vIEFsd2F5cyByZXR1cm4gYSBzY2hlbWEgb2JqZWN0IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGl0LlxuICAgIGVtcHR5U2NoZW1hXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlTY2hlbWEoc2NoZW1hKSB7XG4gIHJldHVybiBzY2hlbWEgPT09IGVtcHR5U2NoZW1hXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBhY3Qoc2NoZW1hKSB7XG4gIHJldHVybiAhIXNjaGVtYS5jb21wYWN0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lubGluZWQoc2NoZW1hKSB7XG4gIHJldHVybiAhIShzY2hlbWEuaW5saW5lZCB8fCBzY2hlbWEuY29tcG9uZW50cylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmVzdGVkKHNjaGVtYSkge1xuICByZXR1cm4gISEoc2NoZW1hLm5lc3RlZCB8fCBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5kZWZhdWx0TmVzdGVkID09PSB0cnVlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzTGFiZWwoc2NoZW1hLCBnZW5lcmF0ZUxhYmVscykge1xuICBjb25zdCB7IGxhYmVsIH0gPSBzY2hlbWFcbiAgcmV0dXJuIChcbiAgICBsYWJlbCAhPT0gZmFsc2UgJiYgKFxuICAgICAgISFsYWJlbCB8fFxuICAgICAgZ2VuZXJhdGVMYWJlbHMgJiYgZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8uZ2VuZXJhdGVMYWJlbFxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb21pdFNwYWNpbmcoc2NoZW1hKSB7XG4gIHJldHVybiAhIWdldFR5cGVPcHRpb25zKHNjaGVtYSk/Lm9taXRTcGFjaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFWYWx1ZShcbiAga2V5T3JEYXRhUGF0aCxcbiAgeyB0eXBlLCBzY2hlbWEsIGNhbGxiYWNrID0gdHJ1ZSwgZGVmYXVsdDogZGVmLCBjb250ZXh0IH0gPSB7fVxuKSB7XG4gIGNvbnN0IHR5cGVzID0gdHlwZSAmJiBhc0FycmF5KHR5cGUpXG4gIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBkYXRhLXBhdGhzIGluIGBrZXlPckRhdGFQYXRoYCBjYW4gb25seSBiZVxuICAvLyBwcm92aWRlZCBpbiBpbiBhcnJheSBmb3JtYXQgaGVyZTpcbiAgbGV0IHZhbHVlID0gc2NoZW1hXG4gICAgPyBpc0FycmF5KGtleU9yRGF0YVBhdGgpXG4gICAgICA/IGdldFZhbHVlQXREYXRhUGF0aChzY2hlbWEsIGtleU9yRGF0YVBhdGgsICgpID0+IHVuZGVmaW5lZClcbiAgICAgIDogc2NoZW1hW2tleU9yRGF0YVBhdGhdXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBkZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChjYWxsYmFjayAmJiBpc0Z1bmN0aW9uKGRlZikgJiYgIWlzTWF0Y2hpbmdUeXBlKHR5cGVzLCBkZWYpKSB7XG4gICAgICAvLyBTdXBwb3J0IGBkZWZhdWx0KClgIGZ1bmN0aW9ucyBmb3IgYW55IHR5cGUgZXhjZXB0IGBGdW5jdGlvbmA6XG4gICAgICBkZWYgPSBkZWYoY29udGV4dClcbiAgICB9XG4gICAgcmV0dXJuIGRlZlxuICB9XG5cbiAgaWYgKGlzTWF0Y2hpbmdUeXBlKHR5cGVzLCB2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICAvLyBBbnkgc2NoZW1hIHZhbHVlIGhhbmRsZWQgdGhyb3VnaCBgZ2V0U2NoZW1hVmFsdWUoKWAgY2FuIHByb3ZpZGVcbiAgLy8gYSBmdW5jdGlvbiB0aGF0J3MgcmVzb2x2ZWQgd2hlbiB0aGUgdmFsdWUgaXMgZXZhbHVhdGVkOlxuICBpZiAoY2FsbGJhY2sgJiYgaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IHZhbHVlKGNvbnRleHQpXG4gIH1cbiAgLy8gTm93IGZpbmFsbHkgc2VlIGlmIHdlIGNhbiBjb252ZXJ0IHRvIHRoZSBleHBlY3QgdHlwZXMuXG4gIGlmICh0eXBlcyAmJiB2YWx1ZSAhPSBudWxsICYmICFpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCB0eXBlIG9mIHR5cGVzKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZWQgPSBjb252ZXJ0VHlwZSh0eXBlLCB2YWx1ZSlcbiAgICAgIGlmIChjb252ZXJ0ZWQgIT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjb252ZXJ0ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZW5kZXJTY2hlbWEoc2NoZW1hLCBjb250ZXh0KSB7XG4gIHJldHVybiAoXG4gICAgZ2V0U2NoZW1hVmFsdWUoJ2lmJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHNjaGVtYSxcbiAgICAgIGNvbnRleHQsXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSkgJiYgKFxuICAgICAgIWhhc05lc3RlZFNjaGVtYUNvbXBvbmVudHMoc2NoZW1hKSB8fFxuICAgICAgc29tZU5lc3RlZFNjaGVtYUNvbXBvbmVudChzY2hlbWEsIGNvbXBvbmVudCA9PlxuICAgICAgICBzaG91bGRSZW5kZXJTY2hlbWEoY29tcG9uZW50LCBjb250ZXh0KVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0KGNvbnRleHQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oY29udGV4dCkgPyBjb250ZXh0KCkgOiBjb250ZXh0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc2NoZW1hLCBjb250ZXh0KSB7XG4gIC8vIFN1cHBvcnQgZGVmYXVsdCB2YWx1ZXMgYm90aCBvbiBzY2hlbWEgYW5kIG9uIGNvbXBvbmVudCBsZXZlbC5cbiAgLy8gTk9URTogQXQgdGhlIHRpbWUgb2YgY3JlYXRpb24sIGNvbXBvbmVudHMgbWF5IG5vdCBiZSBpbnN0YW50aWF0ZWQsIChlLmcuIGlmXG4gIC8vIGVudHJpZXMgYXJlIGNyZWF0ZWQgdGhyb3VnaCBuZXN0ZWQgZm9ybXMsIHRoZSBwYXJlbnQgZm9ybSBpc24ndCBtb3VudGVkKSBzb1xuICAvLyB3ZSBjYW4ndCB1c2UgYGRhdGFQYXRoYCB0byBnZXQgdG8gY29tcG9uZW50cywgYW5kIHRoZSBgZGVmYXVsdFZhbHVlYCBmcm9tXG4gIC8vIHRoZXJlLiBUaGF0J3Mgd2h5IGBkZWZhdWx0VmFsdWVgIGlzIGRlZmluZWQgc3RhdGljYWxseSBpbiB0aGUgY29tcG9uZW50czpcbiAgY29uc3QgZGVmYXVsdFZhbHVlID1cbiAgICBzY2hlbWEuZGVmYXVsdCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHNjaGVtYS5kZWZhdWx0XG4gICAgICA6IGdldFR5cGVPcHRpb25zKHNjaGVtYSk/LmRlZmF1bHRWYWx1ZVxuICByZXR1cm4gaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpXG4gICAgPyBkZWZhdWx0VmFsdWUoZ2V0Q29udGV4dChjb250ZXh0KSlcbiAgICA6IGNsb25lKGRlZmF1bHRWYWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEV4Y2x1ZGVWYWx1ZShzY2hlbWEsIGNvbnRleHQpIHtcbiAgY29uc3QgZXhjbHVkZVZhbHVlID1cbiAgICBzY2hlbWEuZXhjbHVkZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHNjaGVtYS5leGNsdWRlXG4gICAgICA6IGdldFR5cGVPcHRpb25zKHNjaGVtYSk/LmV4Y2x1ZGVWYWx1ZVxuICByZXR1cm4gaXNGdW5jdGlvbihleGNsdWRlVmFsdWUpXG4gICAgPyBleGNsdWRlVmFsdWUoZ2V0Q29udGV4dChjb250ZXh0KSlcbiAgICA6ICEhZXhjbHVkZVZhbHVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRJZ25vcmVNaXNzaW5nVmFsdWUoc2NoZW1hLCBjb250ZXh0KSB7XG4gIHJldHVybiAhIWdldFR5cGVPcHRpb25zKHNjaGVtYSk/Lmlnbm9yZU1pc3NpbmdWYWx1ZT8uKGdldENvbnRleHQoY29udGV4dCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNdWx0aXBsZVZhbHVlKHNjaGVtYSkge1xuICByZXR1cm4gc2NoZW1hLm11bHRpcGxlID8/ICEhZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8uZGVmYXVsdE11bHRpcGxlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0VmFsdWVzKHNjaGVtYSwgZGF0YSA9IHt9LCBjb21wb25lbnQpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHsgY29tcG9uZW50LCByb290RGF0YTogZGF0YSB9XG5cbiAgY29uc3QgcHJvY2Vzc0JlZm9yZSA9IChzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9ICgpID0+XG4gICAgICBuZXcgRGl0b0NvbnRleHQoY29tcG9uZW50LCB7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIHJvb3REYXRhOiBvcHRpb25zLnJvb3REYXRhXG4gICAgICB9KVxuICAgIGlmICghKG5hbWUgaW4gZGF0YSkgJiYgIXNob3VsZElnbm9yZU1pc3NpbmdWYWx1ZShzY2hlbWEsIGNvbnRleHQpKSB7XG4gICAgICBkYXRhW25hbWVdID0gZ2V0RGVmYXVsdFZhbHVlKHNjaGVtYSwgY29udGV4dClcbiAgICB9XG4gIH1cblxuICAvLyBTZXRzIHVwIGEgZGF0YSBvYmplY3QgdGhhdCBoYXMga2V5cyB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBhbGxcbiAgLy8gZm9ybSBmaWVsZHMsIHNvIHRoZXkgY2FuIGJlIGNvcnJlY3RseSB3YXRjaGVkIGZvciBjaGFuZ2VzLlxuICByZXR1cm4gcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgc2NoZW1hLFxuICAgIGRhdGEsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgbnVsbCxcbiAgICBvcHRpb25zXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVWYWx1ZShzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCB7XG4gIGNvbXBvbmVudCA9IG51bGwsXG4gIHJvb3REYXRhID0gY29tcG9uZW50Py5yb290RGF0YVxufSA9IHt9KSB7XG4gIGNvbnN0IGNvbnRleHQgPSAoKSA9PlxuICAgIG5ldyBEaXRvQ29udGV4dChjb21wb25lbnQsIHtcbiAgICAgIHNjaGVtYSxcbiAgICAgIC8vIE92ZXJyaWRlIHZhbHVlIHRvIHByZXZlbnQgZW5kbGVzcyByZWN1cnNpb24gdGhyb3VnaCBjYWxsaW5nIHRoZVxuICAgICAgLy8gZ2V0dGVyIGZvciBgdGhpcy52YWx1ZWAgaW4gYERpdG9Db250ZXh0YDpcbiAgICAgIHZhbHVlOiBkYXRhW25hbWVdLFxuICAgICAgbmFtZSxcbiAgICAgIGRhdGEsXG4gICAgICBkYXRhUGF0aCxcbiAgICAgIHJvb3REYXRhXG4gICAgfSlcbiAgY29uc3QgeyBjb21wdXRlIH0gPSBzY2hlbWFcbiAgaWYgKGNvbXB1dGUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXB1dGUoZ2V0Q29udGV4dChjb250ZXh0KSlcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQWNjZXNzIGBkYXRhW25hbWVdYCBkaXJlY3RseSB0byB1cGRhdGUgdGhlIHZhbHVlIHdpdGhvdXQgY2FsbGluZ1xuICAgICAgLy8gcGFyc2UoKTpcbiAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgIGRhdGFbbmFtZV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICAvLyBJZiB0aGUgdmFsdWUgaXMgc3RpbGwgbWlzc2luZyBhZnRlciBjb21wdXRlLCBzZXQgdGhlIGRlZmF1bHQgZm9yIGl0OlxuICBpZiAoIShuYW1lIGluIGRhdGEpICYmICFzaG91bGRJZ25vcmVNaXNzaW5nVmFsdWUoc2NoZW1hLCBjb250ZXh0KSkge1xuICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICBkYXRhW25hbWVdID0gZ2V0RGVmYXVsdFZhbHVlKHNjaGVtYSwgY29udGV4dClcbiAgfVxuICAvLyBOb3cgYWNjZXNzIHRoZSB2YWx1ZS4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHJlYWN0aXZpdHkgYW5kIG5lZWRzIHRvXG4gIC8vIGhhcHBlbiBhZnRlciBhbGwgcHJpb3IgbWFuaXB1bGF0aW9uIG9mIGBkYXRhW25hbWVdYCwgc2VlIGFib3ZlOlxuICByZXR1cm4gZGF0YVtuYW1lXVxufVxuXG5mdW5jdGlvbiBjbG9uZUl0ZW0oc291cmNlU2NoZW1hLCBpdGVtLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnNjaGVtYU9ubHkpIHtcbiAgICBjb25zdCBjb3B5ID0ge31cbiAgICBjb25zdCB7IGlkS2V5ID0gJ2lkJywgb3JkZXJLZXkgfSA9IHNvdXJjZVNjaGVtYVxuICAgIGNvbnN0IGlkID0gaXRlbVtpZEtleV1cbiAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29weVtpZEtleV0gPSBpZFxuICAgIH1cbiAgICAvLyBDb3B5IG92ZXIgdHlwZSBpbiBjYXNlIHRoZXJlIGFyZSBtdWx0aXBsZSBmb3JtcyB0byBjaG9vc2UgZnJvbS5cbiAgICBpZiAoaGFzTXVsdGlwbGVGb3JtU2NoZW1hcyhzb3VyY2VTY2hlbWEpKSB7XG4gICAgICBjb3B5LnR5cGUgPSBpdGVtLnR5cGVcbiAgICB9XG4gICAgaWYgKG9yZGVyS2V5KSB7XG4gICAgICBjb3B5W29yZGVyS2V5XSA9IGl0ZW1bb3JkZXJLZXldXG4gICAgfVxuICAgIHJldHVybiBjb3B5XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgLi4uaXRlbSB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NEYXRhKHNjaGVtYSwgc291cmNlU2NoZW1hLCBkYXRhLCBkYXRhUGF0aCwge1xuICBjb21wb25lbnQsXG4gIHJvb3REYXRhLFxuICBzY2hlbWFPbmx5LCAvLyB3aGV0aGVyIHRvIG9ubHkgaW5jbHVkZSBkYXRhIGNvdmVyZWQgYnkgdGhlIHNjaGVtYSwgb3IgYWxsIGRhdGFcbiAgdGFyZ2V0XG59ID0ge30pIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHsgY29tcG9uZW50LCByb290RGF0YSwgc2NoZW1hT25seSwgdGFyZ2V0IH1cbiAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IGNsb25lSXRlbShzb3VyY2VTY2hlbWEsIGRhdGEsIG9wdGlvbnMpXG4gIGNvbnN0IGdyYXBoID0gbmV3IFNjaGVtYUdyYXBoKClcblxuICBjb25zdCBwcm9jZXNzQmVmb3JlID0gKHNjaGVtYSwgZGF0YSwgbmFtZSwgZGF0YVBhdGgsIHByb2Nlc3NlZERhdGEpID0+IHtcbiAgICBsZXQgdmFsdWUgPSBjb21wdXRlVmFsdWUoc2NoZW1hLCBkYXRhLCBuYW1lLCBkYXRhUGF0aCwgb3B0aW9ucylcbiAgICAvLyBUaGUgc2NoZW1hIGV4cGVjdHMgdGhlIGB3cmFwUHJpbWl0aXZlc2AgdHJhbnNmb3JtYXRpb25zIHRvIGJlIHByZXNlbnQgb25cbiAgICAvLyB0aGUgZGF0YSB0aGF0IGl0IGlzIGFwcGxpZWQgb24sIHNvIHdhcnAgYmVmb3JlIGFuZCB1bndyYXAgYWZ0ZXIuXG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCB7IHdyYXBQcmltaXRpdmVzIH0gPSBzY2hlbWFcbiAgICAgIGlmICh3cmFwUHJpbWl0aXZlcykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChlbnRyeSA9PiAoe1xuICAgICAgICAgIFt3cmFwUHJpbWl0aXZlc106IGVudHJ5XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWx3YXlzIHNoYWxsb3ctY2xvbmUgYXJyYXkgdmFsdWVzOlxuICAgICAgICB2YWx1ZSA9IFsuLi52YWx1ZV1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gIH1cblxuICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSAoc2NoZW1hLCBkYXRhLCBuYW1lLCBkYXRhUGF0aCwgcHJvY2Vzc2VkRGF0YSkgPT4ge1xuICAgIGNvbnN0IHsgd3JhcFByaW1pdGl2ZXMsIHByb2Nlc3MgfSA9IHNjaGVtYVxuICAgIGxldCB2YWx1ZSA9IHByb2Nlc3NlZERhdGFbbmFtZV1cblxuICAgIC8vIE5PVEU6IFdlIGRvbid0IGNhY2hlIHRoaXMgY29udGV4dCwgc2luY2UgYHZhbHVlYCBpcyBjaGFuZ2luZy5cbiAgICBjb25zdCBjb250ZXh0ID0gKCkgPT5cbiAgICAgIG5ldyBEaXRvQ29udGV4dChjb21wb25lbnQsIHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIHJvb3REYXRhOiBvcHRpb25zLnJvb3REYXRhLFxuICAgICAgICAvLyBQYXNzIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBkYXRhIHRvIGBwcm9jZXNzKClgLCBzbyBpdCBjYW4gYmUgbW9kaWZpZWRcbiAgICAgICAgLy8gdGhyb3VnaCBgcHJvY2Vzc2VkSXRlbWAgZnJvbSB0aGVyZS5cbiAgICAgICAgcHJvY2Vzc2VkRGF0YVxuICAgICAgfSlcblxuICAgIC8vIEZpcnN0IHVud3JhcCB0aGUgd3JhcHBlZCBwcmltaXRpdmVzIGFnYWluLCB0byBicmluZyB0aGUgZGF0YSBiYWNrIGludG9cbiAgICAvLyBpdHMgbmF0aXZlIGZvcm0uIFNlIGBwcm9jZXNzQmVmb3JlKClgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgaWYgKHdyYXBQcmltaXRpdmVzICYmIGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLm1hcChvYmplY3QgPT4gb2JqZWN0W3dyYXBQcmltaXRpdmVzXSlcbiAgICB9XG5cbiAgICAvLyBFYWNoIGNvbXBvbmVudCB0eXBlIGNhbiBwcm92aWRlIGl0cyBvd24gc3RhdGljIGBwcm9jZXNzVmFsdWUoKWAgbWV0aG9kXG4gICAgLy8gdG8gY29udmVydCB0aGUgZGF0YSBmb3Igc3RvcmFnZS5cbiAgICBjb25zdCBwcm9jZXNzVmFsdWUgPSBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5wcm9jZXNzVmFsdWVcbiAgICBpZiAocHJvY2Vzc1ZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IHByb2Nlc3NWYWx1ZShnZXRDb250ZXh0KGNvbnRleHQpLCBncmFwaClcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIHVzZXIncyBgcHJvY2VzcygpYCBjYWxsYmFjayBuZXh0LCBpZiBvbmUgaXMgcHJvdmlkZWQsIHNvIHRoYXRcbiAgICAvLyBpdCBjYW4gbW9kaWZ5IGRhdGEgaW4gYHByb2Nlc3NlZERhdGFgIGV2ZW4gaWYgaXQgcHJvdmlkZXMgYGV4Y2x1ZGU6IHRydWVgXG4gICAgaWYgKHByb2Nlc3MpIHtcbiAgICAgIHZhbHVlID0gcHJvY2VzcyhnZXRDb250ZXh0KGNvbnRleHQpKVxuICAgIH1cblxuICAgIGlmIChzaG91bGRFeGNsdWRlVmFsdWUoc2NoZW1hLCBjb250ZXh0KSkge1xuICAgICAgZGVsZXRlIHByb2Nlc3NlZERhdGFbbmFtZV1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgc2NoZW1hLFxuICAgIGRhdGEsXG4gICAgZGF0YVBhdGgsXG4gICAgcHJvY2Vzc2VkRGF0YSxcbiAgICBwcm9jZXNzQmVmb3JlLFxuICAgIHByb2Nlc3NBZnRlcixcbiAgICBvcHRpb25zXG4gIClcblxuICByZXR1cm4gZ3JhcGgucHJvY2Vzcyhzb3VyY2VTY2hlbWEsIHByb2Nlc3NlZERhdGEsIG9wdGlvbnMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzU2NoZW1hRGF0YShcbiAgc2NoZW1hLFxuICBkYXRhLFxuICBkYXRhUGF0aCxcbiAgcHJvY2Vzc2VkRGF0YSxcbiAgcHJvY2Vzc0JlZm9yZSxcbiAgcHJvY2Vzc0FmdGVyLFxuICBvcHRpb25zXG4pIHtcbiAgY29uc3QgcHJvY2Vzc0NvbXBvbmVudHMgPSBjb21wb25lbnRzID0+IHtcbiAgICBjb25zdCBnZXREYXRhUGF0aCA9IChkYXRhUGF0aCwgdG9rZW4pID0+XG4gICAgICBkYXRhUGF0aCAhPSBudWxsXG4gICAgICAgID8gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIHRva2VuKVxuICAgICAgICA6IG51bGxcblxuICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBvbmVudHMpKSB7XG4gICAgICAgIGlmICghaXNOZXN0ZWQoY29tcG9uZW50U2NoZW1hKSkge1xuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgZGF0YSBvbiB1bm5lc3RlZCBjb21wb25lbnRzLlxuICAgICAgICAgIHByb2Nlc3NTY2hlbWFEYXRhKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGRhdGFQYXRoLFxuICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgICAgICAgICBwcm9jZXNzQWZ0ZXIsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudERhdGFQYXRoID0gZ2V0RGF0YVBhdGgoZGF0YVBhdGgsIG5hbWUpXG5cbiAgICAgICAgICBjb25zdCBwcm9jZXNzSXRlbSA9IChpdGVtLCBpbmRleCA9IG51bGwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1EYXRhUGF0aCA9XG4gICAgICAgICAgICAgIGluZGV4ICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBnZXREYXRhUGF0aChjb21wb25lbnREYXRhUGF0aCwgaW5kZXgpXG4gICAgICAgICAgICAgICAgOiBjb21wb25lbnREYXRhUGF0aFxuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBEaXRvQ29udGV4dChvcHRpb25zLmNvbXBvbmVudCwge1xuICAgICAgICAgICAgICBzY2hlbWE6IGNvbXBvbmVudFNjaGVtYSxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgZGF0YVBhdGg6IGNvbXBvbmVudERhdGFQYXRoLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICByb290RGF0YTogb3B0aW9ucy5yb290RGF0YVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnN0IGdldEZvcm1zID0gKFxuICAgICAgICAgICAgICBnZXRUeXBlT3B0aW9ucyhjb21wb25lbnRTY2hlbWEpPy5nZXRGb3JtU2NoZW1hc0ZvclByb2Nlc3NpbmcgfHxcbiAgICAgICAgICAgICAgZ2V0Rm9ybVNjaGVtYXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGZvcm1zID0gZ2V0Rm9ybXMoY29tcG9uZW50U2NoZW1hLCBjb250ZXh0KVxuICAgICAgICAgICAgY29uc3QgZm9ybSA9IGdldEl0ZW1Gb3JtU2NoZW1hRnJvbUZvcm1zKGZvcm1zLCBpdGVtKVxuICAgICAgICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkSXRlbSA9IHByb2Nlc3NlZERhdGFcbiAgICAgICAgICAgICAgICA/IGNsb25lSXRlbShjb21wb25lbnRTY2hlbWEsIGl0ZW0sIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzU2NoZW1hRGF0YShcbiAgICAgICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgaXRlbURhdGFQYXRoLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NlZEl0ZW0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0JlZm9yZSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXIsXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBJdGVtcyB3aXRob3V0IGZvcm1zIHN0aWxsIGdldCBmdWxseSAoYnV0IHNoYWxsb3dseSkgY2xvbmVkLlxuICAgICAgICAgICAgICAvLyBUT0RPOiBGaW5kIG91dCBvZiB0aGlzIGlzIGFjdHVhbGx5IG5lZWRlZCAvIHVzZWQgYXQgYWxsP1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcm9jZXNzQmVmb3JlPy4oXG4gICAgICAgICAgICBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGNvbXBvbmVudERhdGFQYXRoLFxuICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVxuICAgICAgICAgIClcblxuICAgICAgICAgIGxldCB2YWx1ZSA9IHByb2Nlc3NlZERhdGEgPyBwcm9jZXNzZWREYXRhW25hbWVdIDogZGF0YVtuYW1lXVxuICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIGhhc0Zvcm1TY2hlbWEoY29tcG9uZW50U2NoZW1hKSkge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBkYXRhIG9uIG5lc3RlZCBmb3JtIGl0ZW1zLlxuICAgICAgICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbjogTm8gbmVlZCB0byBjb2xsZWN0IHZhbHVlcyBpZiB3ZSdyZSBub3QgY2xvbmluZyFcbiAgICAgICAgICAgICAgdmFsdWUgPSBwcm9jZXNzZWREYXRhXG4gICAgICAgICAgICAgICAgPyB2YWx1ZS5tYXAocHJvY2Vzc0l0ZW0pXG4gICAgICAgICAgICAgICAgOiB2YWx1ZS5mb3JFYWNoKHByb2Nlc3NJdGVtKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBwcm9jZXNzSXRlbSh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9jZXNzZWREYXRhKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3NlZERhdGFbbmFtZV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHByb2Nlc3NBZnRlcj8uKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjb21wb25lbnREYXRhUGF0aCxcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm9jZXNzQ29tcG9uZW50cyhzY2hlbWEuY29tcG9uZW50cylcbiAgZm9yIChjb25zdCB0YWIgb2YgZ2V0VGFiU2NoZW1hcyhzY2hlbWEpKSB7XG4gICAgcHJvY2Vzc0NvbXBvbmVudHModGFiLmNvbXBvbmVudHMpXG4gIH1cbiAgZm9yIChjb25zdCBwYW5lbCBvZiBnZXRQYW5lbFNjaGVtYXMoc2NoZW1hKSkge1xuICAgIHByb2Nlc3NDb21wb25lbnRzKHBhbmVsLmNvbXBvbmVudHMpXG4gIH1cblxuICByZXR1cm4gcHJvY2Vzc2VkRGF0YSB8fCBkYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZFNjaGVtYXMoc2NoZW1hcywgZGVmYXVsdHMpIHtcbiAgY29uc3QgdG9PYmplY3QgPSAoYXJyYXksIHRvU2NoZW1hKSA9PiB7XG4gICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgID8gYXJyYXkucmVkdWNlKChvYmplY3QsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gdG9TY2hlbWEodmFsdWUpXG4gICAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgICAgb2JqZWN0W3NjaGVtYS5uYW1lXSA9XG4gICAgICAgICAgICAgIHNjaGVtYSAmJiBkZWZhdWx0c1xuICAgICAgICAgICAgICAgID8geyAuLi5kZWZhdWx0cywgLi4uc2NoZW1hIH1cbiAgICAgICAgICAgICAgICA6IHNjaGVtYVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqZWN0XG4gICAgICAgIH0sIHt9KVxuICAgICAgOiBudWxsXG4gIH1cblxuICByZXR1cm4gaXNBcnJheShzY2hlbWFzKVxuICAgID8gdG9PYmplY3Qoc2NoZW1hcywgdmFsdWUgPT5cbiAgICAgICAgaXNPYmplY3QodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBuYW1lOiBjYW1lbGl6ZSh2YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICApXG4gICAgOiBpc09iamVjdChzY2hlbWFzKVxuICAgICAgPyB0b09iamVjdChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgICAoW25hbWUsIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGlzT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBpc1N0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIClcbiAgICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnV0dG9uU2NoZW1hcyhidXR0b25zKSB7XG4gIHJldHVybiBnZXROYW1lZFNjaGVtYXMoXG4gICAgYnV0dG9ucyxcbiAgICB7IHR5cGU6ICdidXR0b24nIH0gLy8gRGVmYXVsdHNcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hT3JUeXBlKSA/IHNjaGVtYU9yVHlwZS50eXBlIDogc2NoZW1hT3JUeXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlT3B0aW9ucyhzY2hlbWFPclR5cGUpIHtcbiAgcmV0dXJuIGdldFR5cGVDb21wb25lbnQoZ2V0VHlwZShzY2hlbWFPclR5cGUpLCB0cnVlKSA/PyBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gKFxuICAgIGdldFR5cGVPcHRpb25zKHNjaGVtYU9yVHlwZSk/LmdldFNvdXJjZVR5cGU/LihnZXRUeXBlKHNjaGVtYU9yVHlwZSkpID8/XG4gICAgbnVsbFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYW5lbEVudHJ5KHNjaGVtYSwgZGF0YVBhdGggPSBudWxsLCB0YWJDb21wb25lbnQgPSBudWxsKSB7XG4gIHJldHVybiBzY2hlbWFcbiAgICA/IHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICAvLyBJZiB0aGUgcGFuZWwgcHJvdmlkZXMgaXRzIG93biBuYW1lLCBhcHBlbmQgaXQgdG8gdGhlIGRhdGFQYXRoLlxuICAgICAgICAvLyBUaGlzIGlzIHVzZWQgZS5nLiBmb3IgJGZpbHRlcnMgcGFuZWxzLlxuICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICBkYXRhUGF0aCAhPSBudWxsICYmIHNjaGVtYS5uYW1lXG4gICAgICAgICAgICA/IGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBzY2hlbWEubmFtZSlcbiAgICAgICAgICAgIDogZGF0YVBhdGgsXG4gICAgICAgIHRhYkNvbXBvbmVudFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFuZWxFbnRyaWVzKFxuICBwYW5lbFNjaGVtYXMsXG4gIGRhdGFQYXRoLFxuICB0YWJDb21wb25lbnQgPSBudWxsLFxuICBwYW5lbEVudHJpZXMgPSBbXVxuKSB7XG4gIGlmIChwYW5lbFNjaGVtYXMpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMocGFuZWxTY2hlbWFzKSkge1xuICAgICAgY29uc3QgZW50cnkgPSBnZXRQYW5lbEVudHJ5KFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBrZXkpLFxuICAgICAgICB0YWJDb21wb25lbnRcbiAgICAgIClcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBwYW5lbEVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhbmVsRW50cmllc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFiU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYT8udGFicyA/IE9iamVjdC52YWx1ZXMoc2NoZW1hLnRhYnMpIDogW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhbmVsU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYT8ucGFuZWxzID8gT2JqZWN0LnZhbHVlcyhzY2hlbWEucGFuZWxzKSA6IFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQYW5lbEVudHJpZXMoXG4gIGFwaSxcbiAgc2NoZW1hLFxuICBkYXRhUGF0aCxcbiAgY29tcG9uZW50ID0gbnVsbCxcbiAgdGFiQ29tcG9uZW50ID0gbnVsbFxuKSB7XG4gIGNvbnN0IHBhbmVsU2NoZW1hID0gZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8uZ2V0UGFuZWxTY2hlbWE/LihcbiAgICBhcGksXG4gICAgc2NoZW1hLFxuICAgIGRhdGFQYXRoLFxuICAgIGNvbXBvbmVudFxuICApXG4gIGNvbnN0IHBhbmVsRW50cmllcyA9IHBhbmVsU2NoZW1hXG4gICAgPyBbZ2V0UGFuZWxFbnRyeShwYW5lbFNjaGVtYSwgZGF0YVBhdGgsIHRhYkNvbXBvbmVudCldXG4gICAgOiBbXVxuICAvLyBBbGxvdyBlYWNoIGNvbXBvbmVudCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHBhbmVscywgaW5cbiAgLy8gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgb25lIChlLmcuIGdldEZpbHRlcnNQYW5lbCgpLCAkZmlsdGVycyk6XG4gIGdldFBhbmVsRW50cmllcyhzY2hlbWE/LnBhbmVscywgZGF0YVBhdGgsIHRhYkNvbXBvbmVudCwgcGFuZWxFbnRyaWVzKVxuICByZXR1cm4gcGFuZWxFbnRyaWVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdFNvdXJjZShzY2hlbWFPclR5cGUpIHtcbiAgcmV0dXJuIGdldFNvdXJjZVR5cGUoc2NoZW1hT3JUeXBlKSA9PT0gJ29iamVjdCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTGlzdFNvdXJjZShzY2hlbWFPclR5cGUpIHtcbiAgcmV0dXJuIGdldFNvdXJjZVR5cGUoc2NoZW1hT3JUeXBlKSA9PT0gJ2xpc3QnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtKSB7XG4gIGNvbnN0IGlkID0gaXRlbVtzb3VyY2VTY2hlbWEuaWRLZXkgfHwgJ2lkJ11cbiAgcmV0dXJuIGlkICE9IG51bGwgPyBTdHJpbmcoaWQpIDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtVWlkKHNvdXJjZVNjaGVtYSwgaXRlbSkge1xuICAvLyBUcnkgdG8gdXNlIHRoZSBpdGVtIGlkIGFzIHRoZSB1aWQsIGZhbGxpbmcgYmFjayBvbiBhdXRvLWdlbmVyYXRlZCBpZHMsIGJ1dFxuICAvLyBlaXRoZXIgd2F5LCBwYXNzIHRocm91Z2ggYGdldFVpZCgpYCBzbyB0aGF0IHRoZSBpZHMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgLy8gaXRlbSB0aHJvdWdoIGEgd2VhayBtYXAsIGFzIHRoZSBpZHMgY2FuIGJlIGZpbHRlcmVkIG91dCBpbiBgcHJvY2Vzc0RhdGEoKWBcbiAgLy8gd2hpbGUgdGhlIGNvbXBvbmVudHMgdGhhdCB1c2UgdGhlIHVpZHMgYXMga2V5IGFyZSBzdGlsbCB2aXNpYmxlLlxuICByZXR1cm4gZ2V0VWlkKGl0ZW0sIGl0ZW0gPT4gZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSkpXG59XG4iLCJpbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNTdHJpbmcsIHBpY2tCeSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNSZXNvdXJjZShzY2hlbWEpIHtcbiAgcmV0dXJuICEhZ2V0UmVzb3VyY2Uoc2NoZW1hLnJlc291cmNlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzb3VyY2UocmVzb3VyY2UsIGRlZmF1bHRzID0ge30pIHtcbiAgY29uc3QgeyBwYXJlbnQsIC4uLmRlZnMgfSA9IGRlZmF1bHRzXG4gIGlmIChpc0Z1bmN0aW9uKHJlc291cmNlKSkge1xuICAgIHJlc291cmNlID0gcmVzb3VyY2UoZGVmYXVsdHMpXG4gIH1cbiAgcmVzb3VyY2UgPSBpc09iamVjdChyZXNvdXJjZSlcbiAgICA/IHsgLi4uZGVmcywgLi4ucmVzb3VyY2UgfVxuICAgIDogaXNTdHJpbmcocmVzb3VyY2UpXG4gICAgICA/IHsgLi4uZGVmcywgcGF0aDogcmVzb3VyY2UgfVxuICAgICAgOiBudWxsXG4gIC8vIE9ubHkgc2V0IHBhcmVudCBpZiBwYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCAnLycsIHNvIHJlbGF0aXZlIFVSTHMgYXJlXG4gIC8vIGRlYWx0IHdpdGggY29ycmVjdGx5LlxuICBpZiAoXG4gICAgcmVzb3VyY2UgJiZcbiAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgIHJlc291cmNlLnBhcmVudCA9PT0gdW5kZWZpbmVkICYmXG4gICAgIXJlc291cmNlLnBhdGg/LnN0YXJ0c1dpdGgoJy8nKVxuICApIHtcbiAgICByZXNvdXJjZS5wYXJlbnQgPSBwYXJlbnRcbiAgICBpZiAoIXJlc291cmNlLnBhdGgpIHtcbiAgICAgIHJlc291cmNlLnBhdGggPSAnLidcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc291cmNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW1iZXJSZXNvdXJjZShpZCwgcmVzb3VyY2UpIHtcbiAgcmV0dXJuIGlkICE9IG51bGwgJiYgcmVzb3VyY2U/LnR5cGUgPT09ICdjb2xsZWN0aW9uJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnbWVtYmVyJyxcbiAgICAgICAgLi4ucGlja0J5KFxuICAgICAgICAgIHJlc291cmNlLFxuICAgICAgICAgICh2YWx1ZSwga2V5KSA9PiBbJ21ldGhvZCcsICdwYXRoJywgJ3BhcmVudCddLmluY2x1ZGVzKGtleSlcbiAgICAgICAgKSxcbiAgICAgICAgaWQ6IGAke2lkfWBcbiAgICAgIH1cbiAgICA6IG51bGxcbn1cbiIsImltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgaXNGdW5jdGlvbixcbiAgZXF1YWxzLFxuICBsYWJlbGl6ZSxcbiAgaHlwaGVuYXRlLFxuICBmb3JtYXRcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBhcHBTdGF0ZSBmcm9tICcuLi9hcHBTdGF0ZS5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBFbWl0dGVyTWl4aW4gZnJvbSAnLi9FbWl0dGVyTWl4aW4uanMnXG5pbXBvcnQge1xuICBmbGF0dGVuVmlld3MsXG4gIGdldFNjaGVtYVZhbHVlLFxuICBzaG91bGRSZW5kZXJTY2hlbWFcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2UsIGdldE1lbWJlclJlc291cmNlIH0gZnJvbSAnLi4vdXRpbHMvcmVzb3VyY2UuanMnXG5pbXBvcnQgeyBjb21wdXRlZCwgcmVhY3RpdmUgfSBmcm9tICd2dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0VtaXR0ZXJNaXhpbl0sXG5cbiAgaW5qZWN0OiBbXG4gICAgJ2FwaScsXG4gICAgJyR2ZXJicycsXG4gICAgJyR2aWV3cycsXG4gICAgJyRpc1BvcHVsYXRlZCcsXG4gICAgJyRwYXJlbnRDb21wb25lbnQnLFxuICAgICckc2NoZW1hQ29tcG9uZW50JyxcbiAgICAnJHJvdXRlQ29tcG9uZW50JyxcbiAgICAnJGRhdGFDb21wb25lbnQnLFxuICAgICckc291cmNlQ29tcG9uZW50JyxcbiAgICAnJHJlc291cmNlQ29tcG9uZW50JyxcbiAgICAnJGRpYWxvZ0NvbXBvbmVudCcsXG4gICAgJyRwYW5lbENvbXBvbmVudCcsXG4gICAgJyR0YWJDb21wb25lbnQnXG4gIF0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICBjb25zdCBzZWxmID0gKCkgPT4gdGhpc1xuICAgIHJldHVybiB0aGlzLnByb3ZpZGVzRGF0YVxuICAgICAgPyB7XG4gICAgICAgICAgJHBhcmVudENvbXBvbmVudDogc2VsZixcbiAgICAgICAgICAkZGF0YUNvbXBvbmVudDogc2VsZlxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICAkcGFyZW50Q29tcG9uZW50OiBzZWxmXG4gICAgICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhcHBTdGF0ZSxcbiAgICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgICBvdmVycmlkZXM6IG51bGwgLy8gU2VlIGFjY2Vzc29yLmpzXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcHJvdmlkZXNEYXRhKCkge1xuICAgICAgLy8gTk9URTogVGhpcyBpcyBvdmVycmlkZGVuIGluIFJlc291cmNlTWl4aW4sIHVzZWQgYnkgbGlzdHMuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgc291cmNlU2NoZW1hKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0YT8uc2NoZW1hXG4gICAgfSxcblxuICAgIHVzZXIoKSB7XG4gICAgICByZXR1cm4gYXBwU3RhdGUudXNlclxuICAgIH0sXG5cbiAgICAvLyAkdmVyYnMsICR2ZXJicyBhbmQgJGlzUG9wdWxhdGVkIGFyZSBkZWZpbmVkIGFzIGZ1bmN0aW9ucywgdG8gcHJlc2VydmVcbiAgICAvLyByZWFjdGl2ZW5lc3MgYWNyb3NzIHByb3ZpZGUvaW5qZWN0LlxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS9pc3N1ZXMvNzAxNyNpc3N1ZWNvbW1lbnQtNDgwOTA2NjkxXG4gICAgdmVyYnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdmVyYnMoKVxuICAgIH0sXG5cbiAgICB2aWV3cygpIHtcbiAgICAgIHJldHVybiB0aGlzLiR2aWV3cygpXG4gICAgfSxcblxuICAgIGZsYXR0ZW5lZFZpZXdzKCkge1xuICAgICAgcmV0dXJuIGZsYXR0ZW5WaWV3cyh0aGlzLnZpZXdzKVxuICAgIH0sXG5cbiAgICBpc1BvcHVsYXRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRpc1BvcHVsYXRlZCgpXG4gICAgfSxcblxuICAgIGxvY2FsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwaS5sb2NhbGVcbiAgICB9LFxuXG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IGZhbHNlIH0pXG4gICAgfSxcblxuICAgIHJvb3RDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm9vdC4kcmVmcy5yb290XG4gICAgfSxcblxuICAgIC8vIFVzZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFzIGxpbmtzIHRvIGluamVjdHMsIHNvIERpdG9TY2hlbWEgY2FuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGFuZCByZXR1cm4gYHRoaXNgIGluc3RlYWQgb2YgdGhlIHBhcmVudC5cbiAgICBwYXJlbnRDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50Q29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHNjaGVtYUNvbXBvbmVudCgpXG4gICAgfSxcblxuICAgIHJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgZm9ybUNvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzRm9ybSA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgdmlld0NvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzVmlldyA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzLCBpbmNsdWRpbmdcbiAgICAvLyB0aGlzIGN1cnJlbnQgY29tcG9uZW50LCB0aGF0IGlzIGxpbmtlZCB0byBhIHJlc291cmNlIChhbmQgdGh1cyBsb2FkcyBpdHNcbiAgICAvLyBvd24gZGF0YSBhbmQgZG9lc24ndCBob2xkIG5lc3RlZCBkYXRhKS5cbiAgICBkYXRhQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhID8gdGhpcyA6IHRoaXMuJGRhdGFDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc291cmNlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVzb3VyY2VDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBkaWFsb2dDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kZGlhbG9nQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFuZWxDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFuZWxDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFyZW50U2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIGdldFBhcmVudENvbXBvbmVudCh0aGlzLCAnc2NoZW1hQ29tcG9uZW50JylcbiAgICB9LFxuXG4gICAgcGFyZW50Um91dGVDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gZ2V0UGFyZW50Q29tcG9uZW50KHRoaXMsICdyb3V0ZUNvbXBvbmVudCcpXG4gICAgfSxcblxuICAgIHBhcmVudEZvcm1Db21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gZ2V0UGFyZW50Q29tcG9uZW50KHRoaXMsICdmb3JtQ29tcG9uZW50JylcbiAgICB9LFxuXG4gICAgcGFyZW50UmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gZ2V0UGFyZW50Q29tcG9uZW50KHRoaXMsICdyZXNvdXJjZUNvbXBvbmVudCcpXG4gICAgfSxcblxuICAgIC8vIFJldHVybnMgdGhlIGRhdGEgb2YgdGhlIGZpcnN0IHJvdXRlIGNvbXBvbmVudCBpbiB0aGUgY2hhaW4gb2YgcGFyZW50c1xuICAgIC8vIHRoYXQgbG9hZHMgaXRzIG93biBkYXRhIGZyb20gYW4gYXNzb2NpYXRlZCBBUEkgcmVzb3VyY2UuXG4gICAgcm9vdERhdGEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhQ29tcG9uZW50Py5kYXRhXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5pc01vdW50ZWQgPSB0cnVlXG4gIH0sXG5cbiAgYmVmb3JlQ3JlYXRlKCkge1xuICAgIGNvbnN0IHVpZCA9IG5leHRVaWQrK1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnJHVpZCcsIHsgZ2V0OiAoKSA9PiB1aWQgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbGFiZWxpemUsXG5cbiAgICAvLyBUaGUgc3RhdGUgb2YgY29tcG9uZW50cyBpcyBvbmx5IGF2YWlsYWJsZSBkdXJpbmcgdGhlIGxpZmUtY3ljbGUgb2YgYVxuICAgIC8vIGNvbXBvbmVudC4gU29tZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIGF2YWlsYWJsZSBsb25nZXIgdGhhbiB0aGF0LCBlLmcuXG4gICAgLy8gYHF1ZXJ5YCAmIGB0b3RhbGAgb24gVHlwZUxpc3QsIHNvIHRoYXQgd2hlbiB0aGUgdXNlciBuYXZpZ2F0ZXMgYmFjayBmcm9tXG4gICAgLy8gZWRpdGluZyBhbiBpdGVtIGluIHRoZSBsaXN0LCB0aGUgc3RhdGUgb2YgdGhlIGxpc3QgaXMgc3RpbGwgdGhlIHNhbWUuXG4gICAgLy8gV2UgY2FuJ3Qgc3RvcmUgdGhpcyBpbiBgZGF0YWAsIGFzIHRoaXMgaXMgYWxyZWFkeSB0aGUgcHVyZSBkYXRhIGZyb20gdGhlXG4gICAgLy8gQVBJIHNlcnZlci4gVGhhdCdzIHdoYXQgdGhlIGBzdG9yZWAgaXMgZm9yOiBNZW1vcnkgdGhhdCdzIGF2YWlsYWJsZSBhc1xuICAgIC8vIGxvbmcgYXMgdGhlIGN1cnJlbnQgZWRpdGluZyBwYXRoIGlzIHN0aWxsIHZhbGlkLiBGb3IgdHlwZSBjb21wb25lbnRzLFxuICAgIC8vIHRoaXMgbWVtb3J5IGlzIHByb3ZpZGVkIGJ5IHRoZSBwYXJlbnQsIHNlZSBSb3V0ZU1peGluIGFuZCBEaXRvUGFuZS5cbiAgICBnZXRTdG9yZShrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0b3JlW2tleV1cbiAgICB9LFxuXG4gICAgc2V0U3RvcmUoa2V5LCB2YWx1ZSkge1xuICAgICAgdGhpcy5zdG9yZVtrZXldID0gdmFsdWVcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG5cbiAgICByZW1vdmVTdG9yZShrZXkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnN0b3JlW2tleV1cbiAgICB9LFxuXG4gICAgZ2V0U3RvcmVLZXlCeUluZGV4KGluZGV4KSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yZS4ka2V5c0J5SW5kZXg/LltpbmRleF1cbiAgICB9LFxuXG4gICAgc2V0U3RvcmVLZXlCeUluZGV4KGluZGV4LCBrZXkpIHtcbiAgICAgIHRoaXMuc3RvcmUuJGtleXNCeUluZGV4ID8/PSB7fVxuICAgICAgdGhpcy5zdG9yZS4ka2V5c0J5SW5kZXhbaW5kZXhdID0ga2V5XG4gICAgfSxcblxuICAgIGdldENoaWxkU3RvcmUoa2V5LCBpbmRleCkge1xuICAgICAgbGV0IHN0b3JlID0gdGhpcy5nZXRTdG9yZShrZXkpXG4gICAgICBpZiAoIXN0b3JlICYmIGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgLy8gV2hlbiBzdG9yaW5nLCB0ZW1wb3JhcnkgaWRzIGNoYW5nZSB0byBwZXJtYW5lbnQgb25lcyBhbmQgdGh1cyB0aGUga2V5XG4gICAgICAgIC8vIGNhbiBjaGFuZ2UuIFRvIHN0aWxsIGZpbmQgdGhlIHN0b3JlLCB3ZSByZWZlcmVuY2UgYnkgaW5kZXggYXMgd2VsbCxcbiAgICAgICAgLy8gdG8gYmUgYWJsZSB0byBmaW5kIHRoZSBzdG9yZSBhZ2FpbiBhZnRlciB0aGUgaXRlbSB3YXMgc2F2ZWQuXG4gICAgICAgIGNvbnN0IG9sZEtleSA9IHRoaXMuZ2V0U3RvcmVLZXlCeUluZGV4KGluZGV4KVxuICAgICAgICBzdG9yZSA9IHRoaXMuZ2V0U3RvcmUob2xkS2V5KVxuICAgICAgICBpZiAoc3RvcmUpIHtcbiAgICAgICAgICB0aGlzLnNldFN0b3JlKGtleSwgc3RvcmUpXG4gICAgICAgICAgdGhpcy5yZW1vdmVTdG9yZShvbGRLZXkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgc3RvcmUgPSB0aGlzLnNldFN0b3JlKGtleSwgcmVhY3RpdmUoe30pKVxuICAgICAgfVxuICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgLy8gdGVtcG9yYXJ5IHVpZCBrZXlzIHdpbGwgY2hhbmdlIGJldHdlZW4gcGVyc2lzdGVuY2UsIHNvIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gYXNzaWduIHRoZSBrZXkgdG8gdGhlIGluZGV4IGV2ZW4gd2hlbiB0aGUgc3RvcmUgYWxyZWFkeSBleGlzdGVkLlxuICAgICAgICB0aGlzLnNldFN0b3JlS2V5QnlJbmRleChpbmRleCwga2V5KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0b3JlXG4gICAgfSxcblxuICAgIHJlbW92ZUNoaWxkU3RvcmUoa2V5LCBpbmRleCkge1xuICAgICAgLy8gR0V0IHRoZSBjaGlsZC1zdG9yZSBmaXJzdCwgc28gdGhhdCBpbmRpY2VzIGNhbiBiZSB0cmFuc2ZlcnJlZCBvdmVyXG4gICAgICAvLyB0ZW1wb3JhcnkgaWQgY2hhbmdlcyBkdXJpbmcgcGVyc2lzdGVuY2UuXG4gICAgICB0aGlzLmdldENoaWxkU3RvcmUoa2V5LCBpbmRleClcbiAgICAgIHRoaXMucmVtb3ZlU3RvcmUoa2V5KVxuICAgIH0sXG5cbiAgICBnZXRTY2hlbWFWYWx1ZShcbiAgICAgIGtleU9yRGF0YVBhdGgsXG4gICAgICB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGRlZmF1bHQ6IGRlZixcbiAgICAgICAgc2NoZW1hID0gdGhpcy5zY2hlbWEsXG4gICAgICAgIGNvbnRleHQgPSB0aGlzLmNvbnRleHQsXG4gICAgICAgIGNhbGxiYWNrID0gdHJ1ZVxuICAgICAgfSA9IHt9XG4gICAgKSB7XG4gICAgICByZXR1cm4gZ2V0U2NoZW1hVmFsdWUoa2V5T3JEYXRhUGF0aCwge1xuICAgICAgICB0eXBlLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNhbGxiYWNrLFxuICAgICAgICBkZWZhdWx0OiBpc0Z1bmN0aW9uKGRlZikgPyAoKSA9PiBkZWYuY2FsbCh0aGlzKSA6IGRlZlxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgZ2V0TGFiZWwoc2NoZW1hLCBuYW1lKSB7XG4gICAgICByZXR1cm4gc2NoZW1hXG4gICAgICAgID8gdGhpcy5nZXRTY2hlbWFWYWx1ZSgnbGFiZWwnLCB7IHNjaGVtYSwgdHlwZTogW1N0cmluZywgT2JqZWN0XSB9KSB8fFxuICAgICAgICAgIGxhYmVsaXplKG5hbWUgfHwgc2NoZW1hLm5hbWUpXG4gICAgICAgIDogbGFiZWxpemUobmFtZSkgfHwgJydcbiAgICB9LFxuXG4gICAgZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzczogYGRpdG8tYnV0dG9uLS0ke3ZlcmJ9YCxcbiAgICAgICAgdGl0bGU6IGxhYmVsaXplKHZlcmIpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSAqTGluaygpIHRvICpSb3V0ZSgpLlxuICAgIGdldFF1ZXJ5TGluayhxdWVyeSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIC8vIFByZXNlcnZlIGhhc2ggZm9yIHRhYnM6XG4gICAgICAgIGhhc2g6IHRoaXMuJHJvdXRlLmhhc2hcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdWxkUmVuZGVyU2NoZW1hKHNjaGVtYSA9IG51bGwpIHtcbiAgICAgIHJldHVybiBzaG91bGRSZW5kZXJTY2hlbWEoc2NoZW1hLCB0aGlzLmNvbnRleHQpXG4gICAgfSxcblxuICAgIHNob3VsZFNob3dTY2hlbWEoc2NoZW1hID0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ3Zpc2libGUnLCB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHNjaGVtYVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2hvdWxkRGlzYWJsZVNjaGVtYShzY2hlbWEgPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTY2hlbWFWYWx1ZSgnZGlzYWJsZWQnLCB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBzY2hlbWFcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGdldFJlc291cmNlUGF0aChyZXNvdXJjZSkge1xuICAgICAgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShyZXNvdXJjZSwge1xuICAgICAgICAvLyBSZXNvdXJjZXMgd2l0aG91dCBhIHBhcmVudCBpbmhlcml0IHRoZSBvbmUgZnJvbSBgZGF0YUNvbXBvbmVudGBcbiAgICAgICAgLy8gYXV0b21hdGljYWxseS5cbiAgICAgICAgcGFyZW50OiB0aGlzLmRhdGFDb21wb25lbnQ/LmdldFJlc291cmNlKHtcbiAgICAgICAgICBtZXRob2Q6IHJlc291cmNlPy5tZXRob2QsXG4gICAgICAgICAgY2hpbGQ6IHJlc291cmNlXG4gICAgICAgIH0pID8/IG51bGxcbiAgICAgIH0pXG4gICAgICByZXR1cm4gdGhpcy5hcGkucmVzb3VyY2VzLmFueShyZXNvdXJjZSlcbiAgICB9LFxuXG4gICAgZ2V0UmVzb3VyY2VVcmwocmVzb3VyY2UpIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0UmVzb3VyY2VQYXRoKHJlc291cmNlKVxuICAgICAgcmV0dXJuIHVybCA/IHRoaXMuYXBpLmdldEFwaVVybCh7IHVybCwgcXVlcnk6IHJlc291cmNlLnF1ZXJ5IH0pIDogbnVsbFxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kUmVxdWVzdCh7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgZGF0YSxcbiAgICAgIHNpZ25hbCxcbiAgICAgIGludGVybmFsXG4gICAgfSkge1xuICAgICAgdXJsIHx8PSB0aGlzLmdldFJlc291cmNlVXJsKHJlc291cmNlKVxuICAgICAgbWV0aG9kIHx8PSByZXNvdXJjZT8ubWV0aG9kXG4gICAgICBjb25zdCBjaGVja1VzZXIgPSAhaW50ZXJuYWwgJiYgdGhpcy5hcGkuaXNBcGlVcmwodXJsKVxuICAgICAgaWYgKGNoZWNrVXNlcikge1xuICAgICAgICBhd2FpdCB0aGlzLnJvb3RDb21wb25lbnQuZW5zdXJlVXNlcigpXG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpLnJlcXVlc3Qoe1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybCxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHNpZ25hbFxuICAgICAgfSlcbiAgICAgIC8vIERldGVjdCBjaGFuZ2Ugb2YgdGhlIG93biB1c2VyLCBhbmQgZmV0Y2ggaXQgYWdhaW4gaWYgaXQgd2FzIGNoYW5nZWQuXG4gICAgICBpZiAoXG4gICAgICAgIGNoZWNrVXNlciAmJlxuICAgICAgICBtZXRob2QgPT09ICdwYXRjaCcgJiZcbiAgICAgICAgZXF1YWxzKHJlc291cmNlLCBnZXRNZW1iZXJSZXNvdXJjZSh0aGlzLnVzZXIuaWQsIHRoaXMuYXBpLnVzZXJzKSlcbiAgICAgICkge1xuICAgICAgICBhd2FpdCB0aGlzLnJvb3RDb21wb25lbnQuZmV0Y2hVc2VyKClcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH0sXG5cbiAgICBzaG93RGlhbG9nKHsgY29tcG9uZW50cywgYnV0dG9ucywgZGF0YSwgc2V0dGluZ3MgfSkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdENvbXBvbmVudC5zaG93RGlhbG9nKHtcbiAgICAgICAgY29tcG9uZW50cyxcbiAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgc2V0dGluZ3NcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHJlcXVlc3QoeyBjYWNoZSwgLi4ub3B0aW9ucyB9KSB7XG4gICAgICAvLyBBbGxvdyBjYWNoaW5nIG9mIGxvYWRlZCBkYXRhIG9uIHR3byBsZXZlbHM6XG4gICAgICAvLyAtICdnbG9iYWwnOiBjYWNoZSBnbG9iYWxseSwgZm9yIHRoZSBlbnRpcmUgYWRtaW4gc2Vzc2lvblxuICAgICAgLy8gLSAnbG9jYWwnOiBjYWNoZSBsb2NhbGx5IHdpdGhpbiB0aGUgY2xvc2VzdCByb3V0ZSBjb21wb25lbnQgdGhhdCBpc1xuICAgICAgLy8gICAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgYW5kIGxvYWRzIGl0cyBvd24gZGF0YS5cbiAgICAgIGNvbnN0IGNhY2hlUGFyZW50ID0gKFxuICAgICAgICBjYWNoZSAmJlxuICAgICAgICB7XG4gICAgICAgICAgZ2xvYmFsOiB0aGlzLmFwcFN0YXRlLFxuICAgICAgICAgIGxvY2FsOiB0aGlzLmRhdGFDb21wb25lbnRcbiAgICAgICAgfVtjYWNoZV1cbiAgICAgIClcbiAgICAgIGNvbnN0IGxvYWRDYWNoZSA9IGNhY2hlUGFyZW50Py5sb2FkQ2FjaGVcbiAgICAgIC8vIEJ1aWxkIGEgY2FjaGUga2V5IGZyb20gdGhlIGNvbmZpZzpcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gKFxuICAgICAgICBsb2FkQ2FjaGUgJiZcbiAgICAgICAgYCR7XG4gICAgICAgICAgb3B0aW9ucy5tZXRob2QgfHwgJ2dldCdcbiAgICAgICAgfSAke1xuICAgICAgICAgIG9wdGlvbnMudXJsXG4gICAgICAgIH0gJHtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShvcHRpb25zLnF1ZXJ5IHx8ICcnKVxuICAgICAgICB9ICR7XG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhIHx8ICcnKVxuICAgICAgICB9YFxuICAgICAgKVxuICAgICAgaWYgKGxvYWRDYWNoZSAmJiAoY2FjaGVLZXkgaW4gbG9hZENhY2hlKSkge1xuICAgICAgICByZXR1cm4gbG9hZENhY2hlW2NhY2hlS2V5XVxuICAgICAgfVxuICAgICAgLy8gTk9URTogTm8gYXdhaXQgaGVyZSwgcmVzIGlzIGEgcHJvbWlzZSB0aGF0IHdlIGNhbiBlYXNpbHkgY2FjaGUuXG4gICAgICAvLyBUaGF0J3MgZmluZSBiZWNhdXNlIHByb21pc2VzIGNhbiBiZSByZXNvbHZlZCBvdmVyIGFuZCBvdmVyIGFnYWluLlxuICAgICAgY29uc3QgcmVzID0gdGhpcy5zZW5kUmVxdWVzdChvcHRpb25zKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5kYXRhKVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIC8vIENvbnZlcnQgYXhpb3MgZXJyb3JzIHRvIG5vcm1hbCBlcnJvcnNcbiAgICAgICAgICBjb25zdCBkYXRhID0gZXJyb3IucmVzcG9uc2U/LmRhdGFcbiAgICAgICAgICB0aHJvdyBkYXRhXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGRhdGEubWVzc2FnZSksIGRhdGEpXG4gICAgICAgICAgICA6IGVycm9yXG4gICAgICAgIH0pXG4gICAgICBpZiAobG9hZENhY2hlKSB7XG4gICAgICAgIGxvYWRDYWNoZVtjYWNoZUtleV0gPSByZXNcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNcbiAgICB9LFxuXG4gICAgZm9ybWF0KHZhbHVlLCB7XG4gICAgICBsb2NhbGUgPSB0aGlzLmFwaS5sb2NhbGUsXG4gICAgICBkZWZhdWx0cyA9IHRoaXMuYXBpLmZvcm1hdHMsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSA9IHt9KSB7XG4gICAgICByZXR1cm4gZm9ybWF0KHZhbHVlLCB7XG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgZGVmYXVsdHMsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIG5hdmlnYXRlKGxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm91dGVyLnB1c2gobG9jYXRpb24pXG4gICAgfSxcblxuICAgIGRvd25sb2FkKG9wdGlvbnMgPSB7fSkge1xuICAgICAgaWYgKGlzU3RyaW5nKG9wdGlvbnMpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7IHVybDogb3B0aW9ucyB9XG4gICAgICB9XG4gICAgICAvLyBTZWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80OTkxNzA2Ni8xMTYzNzA4XG4gICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICBhLmhyZWYgPSBvcHRpb25zLnVybD8uc3RhcnRzV2l0aCgnYmxvYjonKVxuICAgICAgICA/IG9wdGlvbnMudXJsXG4gICAgICAgIDogdGhpcy5hcGkuZ2V0QXBpVXJsKG9wdGlvbnMpXG4gICAgICBhLmRvd25sb2FkID0gb3B0aW9ucy5maWxlbmFtZSA/PyBudWxsXG4gICAgICBjb25zdCB7IGJvZHkgfSA9IGRvY3VtZW50XG4gICAgICBib2R5LmFwcGVuZENoaWxkKGEpXG4gICAgICBhLmNsaWNrKClcbiAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoYSlcbiAgICB9LFxuXG4gICAgbm90aWZ5KG9wdGlvbnMpIHtcbiAgICAgIHRoaXMucm9vdENvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICB9LFxuXG4gICAgY2xvc2VOb3RpZmljYXRpb25zKCkge1xuICAgICAgdGhpcy5yb290Q29tcG9uZW50LmNsb3NlTm90aWZpY2F0aW9ucygpXG4gICAgfSxcblxuICAgIHNldHVwU2NoZW1hRmllbGRzKCkge1xuICAgICAgdGhpcy5zZXR1cE1ldGhvZHMoKVxuICAgICAgdGhpcy5zZXR1cENvbXB1dGVkKClcbiAgICAgIHRoaXMuc2V0dXBFdmVudHMoKVxuICAgIH0sXG5cbiAgICBzZXR1cE1ldGhvZHMoKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5tZXRob2RzIHx8IHt9KSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgbWV0aG9kIGRlZmluaXRpb246ICR7a2V5fTogJHt2YWx1ZX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldHVwQ29tcHV0ZWQoKSB7XG4gICAgICBjb25zdCBnZXRDb21wdXRlZEFjY2Vzc29yID0gKHsgZ2V0LCBzZXQgfSkgPT4ge1xuICAgICAgICBjb25zdCBnZXR0ZXIgPSBjb21wdXRlZCgoKSA9PiBnZXQuY2FsbCh0aGlzKSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBnZXQ6ICgpID0+IGdldHRlci52YWx1ZSxcbiAgICAgICAgICBzZXQ6IHNldCA/IHZhbHVlID0+IHNldC5jYWxsKHRoaXMsIHZhbHVlKSA6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zY2hlbWEuY29tcHV0ZWQgfHwge30pKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc29yID0gaXNGdW5jdGlvbihpdGVtKVxuICAgICAgICAgID8gZ2V0Q29tcHV0ZWRBY2Nlc3Nvcih7IGdldDogaXRlbSB9KVxuICAgICAgICAgIDogaXNPYmplY3QoaXRlbSkgJiYgaXNGdW5jdGlvbihpdGVtLmdldClcbiAgICAgICAgICAgID8gZ2V0Q29tcHV0ZWRBY2Nlc3NvcihpdGVtKVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIGlmIChhY2Nlc3Nvcikge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIGFjY2Vzc29yKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBjb21wdXRlZCBwcm9wZXJ0eSBkZWZpbml0aW9uOiAke2tleX06ICR7aXRlbX1gXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldHVwRXZlbnRzKCkge1xuICAgICAgY29uc3QgeyB3YXRjaCwgZXZlbnRzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgaWYgKHdhdGNoKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gaXNGdW5jdGlvbih3YXRjaCkgPyB3YXRjaC5jYWxsKHRoaXMpIDogd2F0Y2hcbiAgICAgICAgaWYgKGlzT2JqZWN0KGhhbmRsZXJzKSkge1xuICAgICAgICAgIC8vIEluc3RhbGwgdGhlIHdhdGNoIGhhbmRsZXJzIGluIHRoZSBuZXh0IHRpY2ssIHNvIGFsbCBjb21wb25lbnRzIGFyZVxuICAgICAgICAgIC8vIGluaXRpYWxpemVkIGFuZCB3ZSBjYW4gY2hlY2sgYWdhaW5zdCB0aGVpciBuYW1lcy5cbiAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGNhbGxiYWNrXSBvZiBPYmplY3QuZW50cmllcyhoYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgLy8gRXhwYW5kIHByb3BlcnR5IG5hbWVzIHRvICdkYXRhLnByb3BlcnR5JzpcbiAgICAgICAgICAgICAgY29uc3QgZXhwciA9IHRoaXMuc2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudEJ5TmFtZShrZXkpXG4gICAgICAgICAgICAgICAgPyBgZGF0YS4ke2tleX1gXG4gICAgICAgICAgICAgICAgOiBrZXlcbiAgICAgICAgICAgICAgdGhpcy4kd2F0Y2goZXhwciwgY2FsbGJhY2spXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGRFdmVudCA9IChrZXksIGV2ZW50LCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgICAgICB0aGlzLm9uKGh5cGhlbmF0ZShldmVudCksIGNhbGxiYWNrKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgZXZlbnQgZGVmaW5pdGlvbjogJHtrZXl9OiAke2NhbGxiYWNrfWApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50cykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhldmVudHMpKSB7XG4gICAgICAgICAgYWRkRXZlbnQoa2V5LCBrZXksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHNjYW4gc2NoZW1hIGZvciBgb25bQS1aXWAtc3R5bGUgY2FsbGJhY2tzIGFuZCBhZGQgdGhlbVxuICAgICAgLy8gVE9ETzogRGVwcmVjYXRlIG9uZSBmb3JtYXQgb3IgdGhlIG90aGVyLCBpbiBmYXZvdXIgb2Ygb25seSBvbmUgd2F5IG9mXG4gICAgICAvLyBkb2luZyB0aGluZ3MuIERlY2lkZSB3aGljaCBvbmUgdG8gcmVtb3ZlLlxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zY2hlbWEpKSB7XG4gICAgICAgIGlmICgvXm9uW0EtWl0vLnRlc3Qoa2V5KSkge1xuICAgICAgICAgIGFkZEV2ZW50KGtleSwga2V5LnNsaWNlKDIpLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBlbWl0RXZlbnQoZXZlbnQsIHtcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgcGFyZW50ID0gbnVsbFxuICAgIH0gPSB7fSkge1xuICAgICAgY29uc3QgaGFzTGlzdGVuZXJzID0gdGhpcy5oYXNMaXN0ZW5lcnMoZXZlbnQpXG4gICAgICBjb25zdCBwYXJlbnRIYXNMaXN0ZW5lcnMgPSBwYXJlbnQ/Lmhhc0xpc3RlbmVycyhldmVudClcbiAgICAgIGlmIChoYXNMaXN0ZW5lcnMgfHwgcGFyZW50SGFzTGlzdGVuZXJzKSB7XG4gICAgICAgIGNvbnN0IGVtaXRFdmVudCA9IHRhcmdldCA9PlxuICAgICAgICAgIHRhcmdldC5lbWl0KGV2ZW50LCAoY29udGV4dCA9IERpdG9Db250ZXh0LmdldCh0aGlzLCBjb250ZXh0KSkpXG5cbiAgICAgICAgY29uc3QgaGFuZGxlUGFyZW50TGlzdGVuZXJzID0gcmVzdWx0ID0+XG4gICAgICAgICAgLy8gRG9uJ3QgYnViYmxlIHRvIHBhcmVudCBpZiBoYW5kbGVkIGV2ZW50IHJldHVybmVkIGBmYWxzZWBcbiAgICAgICAgICBwYXJlbnRIYXNMaXN0ZW5lcnMgJiYgcmVzdWx0ICE9PSBmYWxzZVxuICAgICAgICAgICAgPyBlbWl0RXZlbnQocGFyZW50KS50aGVuKCgpID0+IHJlc3VsdClcbiAgICAgICAgICAgIDogcmVzdWx0XG5cbiAgICAgICAgY29uc3QgaGFuZGxlTGlzdGVuZXJzID0gKCkgPT5cbiAgICAgICAgICBoYXNMaXN0ZW5lcnNcbiAgICAgICAgICAgID8gZW1pdEV2ZW50KHRoaXMpLnRoZW4oaGFuZGxlUGFyZW50TGlzdGVuZXJzKVxuICAgICAgICAgICAgOiBoYW5kbGVQYXJlbnRMaXN0ZW5lcnModW5kZWZpbmVkKVxuXG4gICAgICAgIHJldHVybiBbJ2xvYWQnLCAnY2hhbmdlJ10uaW5jbHVkZXMoZXZlbnQpXG4gICAgICAgICAgPyAvLyBUaGUgZWZmZWN0cyBvZiBzb21lIGV2ZW50cyBuZWVkIHRpbWUgdG8gcHJvcGFnYXRlIHRocm91Z2ggVnVlLlxuICAgICAgICAgICAgLy8gVXNlICRuZXh0VGljaygpIHRvIG1ha2Ugc3VyZSBvdXIgaGFuZGxlcnMgc2VlIHRoZXNlIGNoYW5nZXMuXG4gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYHByb2Nlc3NlZEl0ZW1gIGlzIG9ubHkgY29ycmVjdCBhZnRlciBjb21wb25lbnRzXG4gICAgICAgICAgICAvLyB0aGF0IGFyZSBuZXdseSByZW5kZXJlZCBkdWUgdG8gZGF0YSBjaGFuZ2VzIGhhdmUgcmVnaXN0ZXJlZC5cbiAgICAgICAgICAgIC8vIE5PVEU6IFRoZSByZXN1bHQgb2YgYGhhbmRsZUxpc3RlbmVycygpYCBtYWtlcyBpdCB0aHJvdWdoIHRoZVxuICAgICAgICAgICAgLy8gYCRuZXh0VGljaygpYCBjYWxsIGFuZCB3aWxsIGJlIHJldHVybmVkIGFzIGV4cGVjdGVkLlxuICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soaGFuZGxlTGlzdGVuZXJzKVxuICAgICAgICAgIDogaGFuZGxlTGlzdGVuZXJzKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZW1pdFNjaGVtYUV2ZW50KGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudC5lbWl0RXZlbnQoZXZlbnQsIHBhcmFtcylcbiAgICB9XG4gIH1cbn1cblxubGV0IG5leHRVaWQgPSAwXG5cbmZ1bmN0aW9uIGdldFBhcmVudENvbXBvbmVudChjb21wb25lbnQsIGtleSkge1xuICBjb25zdCBjdXJyZW50ID0gY29tcG9uZW50W2tleV1cbiAgbGV0IHBhcmVudCA9IGNvbXBvbmVudC5wYXJlbnRDb21wb25lbnRcbiAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnRba2V5XSA9PT0gY3VycmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRDb21wb25lbnRcbiAgfVxuICByZXR1cm4gcGFyZW50Py5ba2V5XSA/PyBudWxsXG59XG4iLCIvLyBBIG1pbmktcmVwbGljYXRpb24gb2YgdnVlJ3MgaW50ZXJuYWwgYHJlc29sdmVNZXJnZWRPcHRpb25zKClgIGJ1dCBvbmx5XG4vLyBoYW5kbGluZyBvdXIgb3duIGFkZGVkIG9wdGlvbnMgcHJvcGVydGllcyBhbmQgbWVyZ2luZyB0aGVtIGVhcmx5IGluc3RlYWRcbi8vIG9mIGxhemlseS5cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNZXJnZWRPcHRpb25zKG9wdGlvbnMpIHtcbiAgY29uc3QgeyBtaXhpbnMgfSA9IG9wdGlvbnNcbiAgcmV0dXJuIG1peGlucyB8fCBvcHRpb25zLmV4dGVuZHNcbiAgICA/IG1lcmdlT3B0aW9ucyhcbiAgICAgICAgeyAuLi5vcHRpb25zIH0sXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICA6IG9wdGlvbnNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlT3B0aW9ucyh0bywgZnJvbSkge1xuICBpZiAoZnJvbS5leHRlbmRzKSB7XG4gICAgbWVyZ2VPcHRpb25zKHRvLCBmcm9tLmV4dGVuZHMpXG4gIH1cbiAgaWYgKGZyb20ubWl4aW5zKSB7XG4gICAgZm9yIChjb25zdCBtaXhpbiBvZiBmcm9tLm1peGlucykge1xuICAgICAgbWVyZ2VPcHRpb25zKHRvLCBtaXhpbilcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgZGl0b09wdGlvbktleXMpIHtcbiAgICBpZiAoa2V5IGluIGZyb20pIHtcbiAgICAgIHRvW2tleV0gPSBmcm9tW2tleV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvXG59XG5cbmNvbnN0IGRpdG9PcHRpb25LZXlzID0gW1xuICAnZGVmYXVsdFZhbHVlJyxcbiAgJ2RlZmF1bHROZXN0ZWQnLFxuICAnZGVmYXVsdFZpc2libGUnLFxuICAnZ2VuZXJhdGVMYWJlbCcsXG4gICdleGNsdWRlVmFsdWUnLFxuICAnaWdub3JlTWlzc2luZ1ZhbHVlJyxcbiAgJ29taXRTcGFjaW5nJyxcbiAgJ3Byb2Nlc3NWYWx1ZScsXG4gICdwcm9jZXNzU2NoZW1hJyxcbiAgJ2dldFBhbmVsU2NoZW1hJyxcbiAgJ2dldEZvcm1TY2hlbWFzRm9yUHJvY2Vzc2luZycsXG4gIC8vIFZ1ZSAzIC8gVnVlLXJvdXRlciA0IGZvcmdldHMgdGhlc2UuXG4gIC8vIFRPRE86IENyZWF0ZSBidWctcmVwb3J0P1xuICAnYmVmb3JlUm91dGVVcGRhdGUnLFxuICAnYmVmb3JlUm91dGVMZWF2ZSdcbl1cbiIsImltcG9ydCBEaXRvTWl4aW4gZnJvbSAnLi9taXhpbnMvRGl0b01peGluLmpzJ1xuaW1wb3J0IHsgZ2V0VHlwZUNvbXBvbmVudCB9IGZyb20gJy4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZU1lcmdlZE9wdGlvbnMgfSBmcm9tICcuL3V0aWxzL29wdGlvbnMuanMnXG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuY29uc3QgY29tcG9uZW50cyA9IHt9XG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0RpdG9NaXhpbl0sXG4gIC8vIE1ha2Ugc3VyZSB0aGF0IHJlZ2lzdGVyZWQgY29tcG9uZW50cyBhcmUgcHJlc2VudCBpbiBhbGwgRGl0b0NvbXBvbmVudC5cbiAgY29tcG9uZW50cyxcblxuICBjb21wb25lbnQobmFtZSwgZGVmaW5pdGlvbikge1xuICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChkZWZpbml0aW9uKSkge1xuICAgICAgICBkZWZpbml0aW9uID0gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoe1xuICAgICAgICAgIGV4dGVuZHM6IHRoaXMsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICAuLi5kZWZpbml0aW9uXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb21wb25lbnRzW25hbWVdID0gZGVmaW5pdGlvblxuICAgIH1cbiAgICBpZiAoIShuYW1lIGluIGNvbXBvbmVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7bmFtZX1cIiBub3QgcmVnaXN0ZXJlZGApXG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRzW25hbWVdXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFR5cGVDb21wb25lbnRcbiAgfVxufVxuIiwiaW1wb3J0IHsgbWFya1JhdywgdXNlU2xvdHMsIENvbW1lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBpc1N0cmluZywgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNWTm9kZUNvbnRlbnQodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlICYmIGFzQXJyYXkodm5vZGUpLnNvbWUodm5vZGUgPT4gdm5vZGUudHlwZSAhPT0gQ29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Nsb3RDb250ZW50KHNsb3QsIHByb3BzID0ge30pIHtcbiAgc2xvdCA9IGlzU3RyaW5nKHNsb3QpID8gdXNlU2xvdHMoKVtzbG90XSA6IHNsb3RcbiAgcmV0dXJuIGhhc1ZOb2RlQ29udGVudChzbG90Py4ocHJvcHMpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmF3KHZhbHVlKSB7XG4gIHJldHVybiBtYXJrUmF3KHsgdmFsdWUgfSlcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5idXR0b24uZGl0by1idXR0b24oXG4gIDp0eXBlPVwidHlwZVwiXG4gIDp0aXRsZT1cInRpdGxlXCJcbiAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICA6Y2xhc3M9XCJbY2xhc3NlcywgeyAnZGl0by1idXR0b24tLWFmZml4ZWQnOiBoYXNBZmZpeGVzIH1dXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG4gIC5kaXRvLWJ1dHRvbl9fcHJlZml4KFxuICAgIHYtaWY9XCJoYXNBZmZpeGVzXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInByZWZpeFwiKVxuICAuZGl0by1idXR0b25fX3RleHQoXG4gICAgdi1pZj1cInRleHQgfHwgaGFzQWZmaXhlc1wiXG4gICkge3sgdGV4dCB8fCAnJyB9fVxuICAgIHNsb3RcbiAgLmRpdG8tYnV0dG9uX19zdWZmaXgoXG4gICAgdi1pZj1cImhhc0FmZml4ZXNcIlxuICApXG4gICAgc2xvdChuYW1lPVwic3VmZml4XCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaGFzU2xvdENvbnRlbnQgfSBmcm9tICcuLi91dGlscy92dWUuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYnV0dG9uJyB9LFxuICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaGFzQWZmaXhlcygpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGhhc1Nsb3RDb250ZW50KHRoaXMuJHNsb3RzLnByZWZpeCkgfHxcbiAgICAgICAgaGFzU2xvdENvbnRlbnQodGhpcy4kc2xvdHMuc3VmZml4KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBjbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJGF0dHJzLmNsYXNzXG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBfLCAuLi5hdHRyaWJ1dGVzIH0gPSB0aGlzLiRhdHRyc1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRGF0ZShkYXRlKSB7XG4gIHJldHVybiB7XG4gICAgeWVhcjogZGF0ZT8uZ2V0RnVsbFllYXIoKSA/PyAwLFxuICAgIG1vbnRoOiBkYXRlPy5nZXRNb250aCgpID8/IDAsXG4gICAgZGF5OiBkYXRlPy5nZXREYXRlKCkgPz8gMCxcbiAgICBob3VyOiBkYXRlPy5nZXRIb3VycygpID8/IDAsXG4gICAgbWludXRlOiBkYXRlPy5nZXRNaW51dGVzKCkgPz8gMCxcbiAgICBzZWNvbmQ6IGRhdGU/LmdldFNlY29uZHMoKSA/PyAwLFxuICAgIG1pbGxpc2Vjb25kOiBkYXRlPy5nZXRNaWxsaXNlY29uZHMoKSA/PyAwXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsdGVyRGF0ZShkYXRlLCBvdmVycmlkZXMgPSB7fSkge1xuICByZXR1cm4gbmV3IERhdGUoLi4uT2JqZWN0LnZhbHVlcyh7IC4uLmRlc2NyaWJlRGF0ZShkYXRlKSwgLi4ub3ZlcnJpZGVzIH0pKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKHN0cmluZywge1xuICBsb2NhbGUgPSAnZW4tVVMnLFxuICBkYXRlID0gdHJ1ZSxcbiAgdGltZSA9IHRydWVcbn0gPSB7fSkge1xuICBjb25zdCB0aW1lRGVmYXVsdCA9IHRpbWUgPyBudWxsIDogMFxuICBsZXQgW1xuICAgIGRheSxcbiAgICBzZXAxLFxuICAgIG1vbnRoLFxuICAgIHNlcDIsXG4gICAgeWVhcixcbiAgICAsXG4gICAgaG91ciA9IHRpbWVEZWZhdWx0LFxuICAgICxcbiAgICBtaW51dGUgPSB0aW1lRGVmYXVsdCxcbiAgICAsXG4gICAgc2Vjb25kID0gdGltZURlZmF1bHQsXG4gICAgLFxuICAgIG1pbGxpc2Vjb25kID0gdGltZURlZmF1bHRcbiAgXSA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuICBpZiAoeWVhciAmJiB5ZWFyLmxlbmd0aCA+PSA0KSB7XG4gICAgaWYgKGxvY2FsZSA9PT0gJ2VuLVVTJyAmJiBzZXAxID09PSAnLycgJiYgc2VwMiA9PT0gJy8nKSB7XG4gICAgICAvLyBBbWVyaWNhbiBmb3JtYXQ6IE1NL0REL1lZWVlcbiAgICAgIDtbZGF5LCBtb250aF0gPSBbbW9udGgsIGRheV1cbiAgICB9XG4gICAgbW9udGggPSBnZXRNb250aEluZGV4KG1vbnRoLCB7IGxvY2FsZSB9KVxuICAgIGNvbnN0IGlzVmFsaWRUaW1lUGFydCA9IHBhcnQgPT4gcGFydCA9PT0gbnVsbCB8fCBwYXJ0Lmxlbmd0aCA9PT0gMlxuICAgIGlmIChcbiAgICAgIG1vbnRoICE9PSBudWxsICYmIChcbiAgICAgICAgIXRpbWUgfHwgKFxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChob3VyKSAmJlxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChtaW51dGUpICYmXG4gICAgICAgICAgaXNWYWxpZFRpbWVQYXJ0KHNlY29uZClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKFxuICAgICAgICAreWVhcixcbiAgICAgICAgK21vbnRoLFxuICAgICAgICArZGF5LFxuICAgICAgICAraG91cixcbiAgICAgICAgK21pbnV0ZSxcbiAgICAgICAgK3NlY29uZCxcbiAgICAgICAgK21pbGxpc2Vjb25kXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUGFydEF0UG9zaXRpb24oc3RyaW5nLCBwb3NpdGlvbiwge1xuICBsb2NhbGUgPSAnZW4tVVMnLFxuICBkYXRlID0gdHJ1ZSxcbiAgdGltZSA9IHRydWVcbn0gPSB7fSkge1xuICBjb25zdCBwYXJ0cyA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuXG4gIGNvbnN0IGdldFBvc2l0aW9uID0gKHBvc2l0aW9uLCBsZW5ndGggPSBwYXJ0cy5sZW5ndGgpID0+IHtcbiAgICBsZXQgcG9zID0gMFxuICAgIGxldCBpbmRleCA9IDBcbiAgICB3aGlsZSAoKHBvc2l0aW9uID09PSBudWxsIHx8IHBvcyA8PSBwb3NpdGlvbikgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHBvcyArPSBwYXJ0c1tpbmRleCsrXT8ubGVuZ3RoID8/IDBcbiAgICB9XG4gICAgcmV0dXJuIHsgcG9zaXRpb246IHBvcywgaW5kZXggfVxuICB9XG5cbiAgLy8gVGltZSBzdGFydHMgYXQgaW5kZXggNiwgZHVlIHRvIHRoZSBzZXBhcmF0b3IgYWZ0ZXIgdGhlIGRhdGUuXG4gIGNvbnN0IG9mZnNldCA9ICFkYXRlID8gZ2V0UG9zaXRpb24obnVsbCwgNikucG9zaXRpb24gOiAwXG4gIHBvc2l0aW9uICs9IG9mZnNldFxuXG4gIGxldCB7IGluZGV4IH0gPSBnZXRQb3NpdGlvbihwb3NpdGlvbilcblxuICBjb25zdCBpc1VTID0gbG9jYWxlID09PSAnZW4tVVMnXG4gIGNvbnN0IHZhbHVlcyA9IFtcbiAgICBpc1VTID8gJ21vbnRoJyA6ICdkYXknLFxuICAgIG51bGwsXG4gICAgaXNVUyA/ICdkYXknIDogJ21vbnRoJyxcbiAgICBudWxsLFxuICAgICd5ZWFyJyxcbiAgICBudWxsLFxuICAgICdob3VyJyxcbiAgICBudWxsLFxuICAgICdtaW51dGUnLFxuICAgIG51bGwsXG4gICAgJ3NlY29uZCcsXG4gICAgbnVsbCxcbiAgICAnbWlsbGlzZWNvbmQnXG4gIF1cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICBpZiAodmFsdWVzW2luZGV4XSkge1xuICAgICAgY29uc3Qgc3RhcnQgPSBnZXRQb3NpdGlvbihudWxsLCBpbmRleCkucG9zaXRpb24gLSBvZmZzZXRcbiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgcGFydHNbaW5kZXhdLmxlbmd0aFxuICAgICAgcmV0dXJuIHsgbmFtZTogdmFsdWVzW2luZGV4XSwgc3RhcnQsIGVuZCB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSA9IHRydWUsIHRpbWUgPSB0cnVlIH0gPSB7fSkge1xuICBjb25zdCBwYXJ0cyA9IHN0cmluZz8uc3BsaXQoLyhbXFxzLiw6L10rKS8pIHx8IFtdXG4gIGlmICghZGF0ZSkge1xuICAgIC8vIEFkZCBkdW1teSBkYXRlIHBhcnRzIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYSB0aW1lLW9ubHkgZGF0ZS5cbiAgICBwYXJ0cy51bnNoaWZ0KCcxJywgJy4nLCAnMScsICcuJywgJzIwMDAnLCAnICcpXG4gIH1cbiAgaWYgKCF0aW1lICYmIHBhcnRzLmxlbmd0aCA+IDUpIHtcbiAgICBwYXJ0cy5sZW5ndGggPSA1XG4gIH1cbiAgcmV0dXJuIHBhcnRzXG59XG5cbmZ1bmN0aW9uIGdldE1vbnRoSW5kZXgobW9udGgsIHsgbG9jYWxlID0gJ2VuLVVTJyB9ID0ge30pIHtcbiAgY29uc3QgdmFsdWUgPSArbW9udGhcbiAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUgLSAxXG4gIH1cbiAgY29uc3QgbWF0Y2ggPSBtb250aC50cmltKCkudG9Mb3dlckNhc2UoKVxuICBpZiAobWF0Y2gubGVuZ3RoIDwgMykgcmV0dXJuIG51bGxcbiAgY29uc3Qgc2hvcnRGb3JtYXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIHsgbW9udGg6ICdzaG9ydCcgfSlcbiAgY29uc3QgbG9uZ0Zvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgeyBtb250aDogJ2xvbmcnIH0pXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgyMDAwLCBpLCAxKVxuICAgIGlmIChcbiAgICAgIHNob3J0Rm9ybWF0LmZvcm1hdChkYXRlKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2gpIHx8XG4gICAgICBsb25nRm9ybWF0LmZvcm1hdChkYXRlKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2gpXG4gICAgKSB7XG4gICAgICByZXR1cm4gaVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jYWxlbmRhclxuICAuZGl0by1jYWxlbmRhci1wb3B1cFxuICAgIC5kaXRvLWNhbGVuZGFyLWlubmVyXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1pZj1cImN1cnJlbnRNb2RlID09PSAnZGF5J1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYuZGl0by1jYWxlbmRhci1zdGVwLXllYXIoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LmRpdG8tY2FsZW5kYXItc3RlcC1tb250aChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBNb250aCgtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuXG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXllYXIoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogdHJ1ZSB9KSB9fVxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC1tb250aChcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgnbW9udGgnKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgbW9udGg6IHRydWUgfSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0LmRpdG8tY2FsZW5kYXItc3RlcC1tb250aChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBNb250aCgxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQuZGl0by1jYWxlbmRhci1zdGVwLXllYXIoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItd2Vla2RheXNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwid2Vla2RheSBpbiB3ZWVrZGF5TmFtZXNcIlxuICAgICAgICAgICAgKSB7eyB3ZWVrZGF5LnNob3J0IH19XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItZGF0ZXNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwiZGF0ZSBpbiBkYXRlUmFuZ2VcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJkYXRlLnN0YXRlICYmIGBkaXRvLWNhbGVuZGFyLWl0ZW0tJHtkYXRlLnN0YXRlfWBcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJkYXRlLnN0YXRlICE9PSAnZGlzYWJsZWQnICYmIHNlbGVjdERhdGUoZGF0ZS5kYXRlKVwiXG4gICAgICAgICAgICApIHt7IGRhdGUudGV4dCB9fVxuICAgICAgICAuZGl0by1jYWxlbmRhci1mb290ZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LW5vdyhcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgOnRpdGxlPVwiZGF0ZVRvU3RyaW5nKG5ldyBEYXRlKCkpXCJcbiAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdERhdGUobmV3IERhdGUoKSlcIlxuICAgICAgICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ21vbnRoJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuXG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXllYXIoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogdHJ1ZSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItbW9udGhzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIihtb250aCwgaW5kZXgpIGluIG1vbnRoTmFtZXNcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRNb250aENsYXNzKGluZGV4KVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdE1vbnRoKGluZGV4KVwiXG4gICAgICAgICAgICApIHt7IG1vbnRoLnNob3J0IH19XG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICd5ZWFyJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW4ge3sgZGVjYWRlVG9TdHJpbmcoY3VycmVudFZhbHVlKSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci15ZWFyc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ5ZWFyIGluIHllYXJSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldFllYXJDbGFzcyh5ZWFyKVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgKSB7eyB5ZWFyIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZGVzY3JpYmVEYXRlLCBhbHRlckRhdGUgfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ3NlbGVjdCddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGRpc2FibGVkRGF0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBtb2RlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2RheScgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgY29uc3QgeyB3ZWVrZGF5TmFtZXMsIG1vbnRoTmFtZXMgfSA9IGdldExvY2FsZU5hbWVzKHRoaXMubG9jYWxlKVxuICAgIHJldHVybiB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzLFxuICAgICAgZGF0ZVJhbmdlOiBbXSxcbiAgICAgIHllYXJSYW5nZTogW10sXG4gICAgICBjdXJyZW50VmFsdWU6IChcbiAgICAgICAgdGhpcy5tb2RlbFZhbHVlIHx8XG4gICAgICAgIC8vIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCB1c2UgY3VycmVudCBkYXRlIGJ1dCBjbGVhciB0aW1lIGZpZWxkczpcbiAgICAgICAgYWx0ZXJEYXRlKG5ldyBEYXRlKCksIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG1pbGxpc2Vjb25kOiAwIH0pXG4gICAgICApLFxuICAgICAgY3VycmVudE1vZGU6IHRoaXMubW9kZVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG8gfHwgbmV3IERhdGUoKVxuICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBkaXNhYmxlZERhdGU6ICd1cGRhdGVEYXRlUmFuZ2UnLFxuXG4gICAgbW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TW9udGhDbGFzcyhtb250aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnOiAoXG4gICAgICAgICAgdGhpcy5tb2RlbFZhbHVlICYmXG4gICAgICAgICAgbW9udGggPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRNb250aCgpICYmXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogbW9udGggPT09IHRoaXMuY3VycmVudFZhbHVlLmdldE1vbnRoKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0WWVhckNsYXNzKHllYXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJiB5ZWFyID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgICApLFxuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQnOiB5ZWFyID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldERhdGUob3ZlcnJpZGVzLCB1cGRhdGUgPSBmYWxzZSkge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBhbHRlckRhdGUodGhpcy5jdXJyZW50VmFsdWUsIG92ZXJyaWRlcylcbiAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RlcERlY2FkZShzdGVwKSB7XG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcCAqIDEwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzZXRNb2RlKG1vZGUpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vZGUgPSBtb2RlXG4gICAgfSxcblxuICAgIHN0ZXBNb250aChzdGVwKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeyB5ZWFyLCBtb250aCB9ID0gdGhpcy5nZXRZZWFyTW9udGgoXG4gICAgICAgIGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIHN0ZXBcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIG1vbnRoLFxuICAgICAgICBkYXk6IE1hdGgubWluKFxuICAgICAgICAgIHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpLFxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldERhdGUoKVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzdGVwWWVhcihzdGVwKSB7XG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2VsZWN0RGF0ZShkYXRlKSB7XG4gICAgICB0aGlzLnNldERhdGUoZGVzY3JpYmVEYXRlKGRhdGUpLCB0cnVlKVxuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0JylcbiAgICB9LFxuXG4gICAgc2VsZWN0TW9udGgobW9udGgpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgIC8vIFNldCBkYXkgdG8gMSB0byBhdm9pZCBzZWxlY3RpbmcgYSBkYXRlIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGVcbiAgICAgIC8vIG5ldyBtb250aCwgZS5nLiBGZWIgMzEgLT4gTWFyIDMuXG4gICAgICB0aGlzLnNldERhdGUoeyBtb250aCwgZGF5OiAxIH0sIHRydWUpXG4gICAgfSxcblxuICAgIHNlbGVjdFllYXIoeWVhcikge1xuICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICB0aGlzLnNldERhdGUoeyB5ZWFyIH0sIHRydWUpXG4gICAgfSxcblxuICAgIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgaWYgKG1vbnRoID4gMTEpIHtcbiAgICAgICAgeWVhcisrXG4gICAgICAgIG1vbnRoID0gMFxuICAgICAgfSBlbHNlIGlmIChtb250aCA8IDApIHtcbiAgICAgICAgeWVhci0tXG4gICAgICAgIG1vbnRoID0gMTFcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHllYXIsIG1vbnRoIH1cbiAgICB9LFxuXG4gICAgZGF0ZVRvU3RyaW5nKFxuICAgICAgZGF0ZSxcbiAgICAgIHsgeWVhciwgbW9udGgsIGRheSB9ID0geyB5ZWFyOiB0cnVlLCBtb250aDogdHJ1ZSwgZGF5OiB0cnVlIH1cbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlLCB7XG4gICAgICAgIHllYXI6IHllYXIgJiYgJ251bWVyaWMnLFxuICAgICAgICBtb250aDogbW9udGggJiYgJ2xvbmcnLFxuICAgICAgICBkYXk6IGRheSAmJiAnbnVtZXJpYydcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGRlY2FkZVRvU3RyaW5nKGRhdGUpIHtcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKGRhdGUuZ2V0RnVsbFllYXIoKSlcbiAgICAgIHJldHVybiBgJHt5ZWFyfSDigJMgJHt5ZWFyICsgOX1gXG4gICAgfSxcblxuICAgIGdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKClcbiAgICB9LFxuXG4gICAgZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoeWVhcikge1xuICAgICAgY29uc3QgeWVhclN0ciA9IHllYXIudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuICtgJHt5ZWFyU3RyLnNsaWNlKDAsIC0xKX0wYFxuICAgIH0sXG5cbiAgICBuYXZpZ2F0ZSh7IHN0ZXAsIGVudGVyLCBtb2RlID0gdGhpcy5jdXJyZW50TW9kZSwgdXBkYXRlID0gZmFsc2UgfSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoeyBkYXk6IGN1cnJlbnRWYWx1ZS5nZXREYXRlKCkgKyBzdGVwIH0sIHVwZGF0ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgbW9udGg6IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgc3RlcCB9LCB1cGRhdGUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgeWVhcjogY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwIH0sIHVwZGF0ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSBpZiAoZW50ZXIpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlRGF0ZVJhbmdlKCkge1xuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxuICAgICAgdGhpcy55ZWFyUmFuZ2UgPSBbXVxuXG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeWVhciA9IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICBjb25zdCBtb250aCA9IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgdGhpcy55ZWFyUmFuZ2UucHVzaChzdGFydFllYXIgKyBpKVxuICAgICAgfVxuICAgICAgY29uc3QgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPT09IDApIHtcbiAgICAgICAgZmlyc3REYXlXZWVrID0gN1xuICAgICAgfVxuICAgICAgY29uc3QgbnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuICAgICAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCAtIDEpXG4gICAgICAgIGNvbnN0IHByZXZNb250aE51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKFxuICAgICAgICAgIHByZXZNb250aC55ZWFyLFxuICAgICAgICAgIHByZXZNb250aC5tb250aFxuICAgICAgICApXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkYXkgPSBwcmV2TW9udGhOdW1EYXlzIC0gZmlyc3REYXlXZWVrICsgaSArIDFcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUocHJldk1vbnRoLnllYXIsIHByZXZNb250aC5tb250aCwgZGF5KVxuICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogZGF5LFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG51bURheXM7IGkrKykge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGkpXG4gICAgICAgIGNvbnN0IGlzRGF5ID0gZGF0ZSA9PiAoXG4gICAgICAgICAgZGF0ZSAmJlxuICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpID09PSBpICYmXG4gICAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmXG4gICAgICAgICAgZGF0ZS5nZXRNb250aCgpID09PSBtb250aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHN0YXRlID0gaXNEYXkodGhpcy5tb2RlbFZhbHVlKVxuICAgICAgICAgID8gJ2FjdGl2ZSdcbiAgICAgICAgICA6IGlzRGF5KG5vdylcbiAgICAgICAgICAgID8gJ3RvZGF5J1xuICAgICAgICAgICAgOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKVxuICAgICAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICAgICAgOiBpc0RheShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgPyAnY3VycmVudCdcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIHN0YXRlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRNb250aE5lZWQgPSA0MiAtIHRoaXMuZGF0ZVJhbmdlLmxlbmd0aFxuICAgICAgaWYgKG5leHRNb250aE5lZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoICsgMSlcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbmV4dE1vbnRoTmVlZDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGxvY2FsZU5hbWVzID0ge31cblxuLy8gQ2FsbGluZyBgdG9Mb2NhbGVTdHJpbmcoKWAgdGhpcyBtdWNoIGFwcGVhcnMgdG8gYmUgZXhwZW5zaXZlLCBzbyBjYWNoZSBpdDpcbmZ1bmN0aW9uIGdldExvY2FsZU5hbWVzKGxvY2FsZSkge1xuICBsZXQgbmFtZXMgPSBsb2NhbGVOYW1lc1tsb2NhbGVdXG4gIGlmICghbmFtZXMpIHtcbiAgICBjb25zdCB3ZWVrZGF5TmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCwgMCwgaSlcbiAgICAgIHdlZWtkYXlOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ3Nob3J0JyB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgbW9udGhOYW1lcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIGksIDApXG4gICAgICBtb250aE5hbWVzLnB1c2goe1xuICAgICAgICBsb25nOiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtb250aDogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXSA9IHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXNcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jYWxlbmRhciB7XG4gIG1pbi13aWR0aDogMjQwcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXBvcHVwIHtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgei1pbmRleDogJHotaW5kZXgtcG9wdXA7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWJvZHkge1xuICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNyk7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICAgIGxpbmUtaGVpZ2h0OiBjYWxjKCRpbnB1dC1oZWlnaHQgLSAyICogJGJvcmRlci13aWR0aCk7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS10b2RheSB7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkICRjb2xvci1hY3RpdmU7XG4gICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSB7XG4gICAgJixcbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCxcbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1ncmF5IHtcbiAgICBjb2xvcjogIzk5OTk5OTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1tb250aHMsXG4uZGl0by1jYWxlbmRhci15ZWFycyB7XG4gIHNwYW4ge1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyA0KTtcbiAgICBtYXJnaW46IDAuNWVtIDA7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3BhbiB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLyA1KTtcbn1cblxuLmRpdG8tY2FsZW5kYXIgYSxcbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW4sXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciBzcGFuIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gIGEge1xuICAgIHBhZGRpbmc6IDAgMC4yZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItZGF0ZXMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLW1vbnRocyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyOm5vdCg6aG92ZXIpIC5kaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCB7XG4gIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXdlZWtkYXlzIHNwYW4ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlcixcbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xufVxuXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBib3JkZXItdG9wOiAkYm9yZGVyLXN0eWxlO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgYm9yZGVyLWJvdHRvbTogJGJvcmRlci1zdHlsZTtcbiAgZGlzcGxheTogZmxleDtcblxuICA+IHNwYW4ge1xuICAgIG1hcmdpbjogYXV0bztcbiAgICBwYWRkaW5nOiAwIDAuNWVtO1xuICB9XG5cbiAgYSB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLXByZXYsXG4uZGl0by1jYWxlbmRhci1zdGVwLW5leHQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiA1JTtcbiAgbWluLXdpZHRoOiAyZW07XG4gIG1heC13aWR0aDogM2VtO1xuXG4gICY6OmFmdGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBmb250LXNpemU6IDEuMjVlbTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLXByZXYge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ+KAuSc7XG4gIH1cblxuICAmLmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyOjphZnRlciB7XG4gICAgY29udGVudDogJ8KrJztcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLW5leHQge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ+KAuic7XG4gIH1cblxuICAmLmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyOjphZnRlciB7XG4gICAgY29udGVudDogJ8K7JztcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zZWxlY3Qtbm93IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICdOb3cnO1xuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudHModGFyZ2V0cywgZXZlbnRzKSB7XG4gIHRhcmdldHMgPVxuICAgIHRhcmdldHMgaW5zdGFuY2VvZiBOb2RlTGlzdFxuICAgICAgPyBBcnJheS5mcm9tKHRhcmdldHMpXG4gICAgICA6IGFzQXJyYXkodGFyZ2V0cylcblxuICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhldmVudHMpKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhldmVudHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUV2ZW50cyguLi5ldmVudHMpIHtcbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICBldmVudC5yZW1vdmUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5KGV2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgMzc6ICdsZWZ0JyxcbiAgICAzODogJ3VwJyxcbiAgICAzOTogJ3JpZ2h0JyxcbiAgICA0MDogJ2Rvd24nLFxuICAgIDEzOiAnZW50ZXInXG4gIH1bZXZlbnQ/LmtleUNvZGVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KSB7XG4gIGNvbnN0IGtleSA9IGdldEtleShldmVudClcbiAgcmV0dXJuIHtcbiAgICBob3I6IHsgbGVmdDogLTEsIHJpZ2h0OiAxIH1ba2V5XSB8fCAwLFxuICAgIHZlcjogeyB1cDogLTEsIGRvd246IDEgfVtrZXldIHx8IDAsXG4gICAgZW50ZXI6IGtleSA9PT0gJ2VudGVyJ1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXQoY29tcG9uZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IGlzU3RyaW5nKGNvbXBvbmVudC50YXJnZXQpXG4gICAgPyBjb21wb25lbnQuJHJlZnNbY29tcG9uZW50LnRhcmdldF1cbiAgICA6IGNvbXBvbmVudC50YXJnZXRcbiAgcmV0dXJuIHRhcmdldD8uJGVsID8/IHRhcmdldFxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lclxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtaWY9XCJhbHdheXNTaG93XCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdjbGljaydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gICAgQGNsaWNrPVwib25DbGlja1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdmb2N1cycgfHwgdHJpZ2dlciA9PT0gJ2Fsd2F5cydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIFRyYW5zaXRpb24oOm5hbWU9XCJgZGl0by0ke3RyYW5zaXRpb259YFwiKVxuICAgIC5kaXRvLXBvcHVwKFxuICAgICAgdi1pZj1cInRyaWdnZXIgPT09ICdob3ZlcidcIlxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgICAgQG1vdXNlbGVhdmU9XCJvbkhvdmVyKGZhbHNlKVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWVsc2VcbiAgICAgIHYtc2hvdz1cInNob3dQb3B1cFwiXG4gICAgICByZWY9XCJwb3B1cFwiXG4gICAgICA6Y2xhc3M9XCJwb3B1cENsYXNzXCJcbiAgICAgIDpzdHlsZT1cInBvcHVwU3R5bGVcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJzaG93UG9wdXBcIlxuICAgICAgICBuYW1lPVwicG9wdXBcIlxuICAgICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBhZGRFdmVudHMsIGNvbWJpbmVFdmVudHMgfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcbmltcG9ydCB7IGdldFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL3RyaWdnZXInXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOnNob3cnXSxcblxuICBwcm9wczoge1xuICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tJyB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBjdXN0b21DbGFzczogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB6SW5kZXg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG4gICAga2VlcEluVmlldzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgaGlkZVdoZW5DbGlja091dHNpZGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGFsd2F5c1Nob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb3ZlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGhpZGVEZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgcG9wdXBQbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50LFxuICAgICAgZm9jdXNFdmVudHM6IG51bGwsXG4gICAgICBjbG9zZUV2ZW50czogbnVsbCxcbiAgICAgIHBvcHVwRXZlbnRzOiBudWxsLFxuICAgICAgYmx1clRpbWVyOiBudWxsLFxuICAgICAgbW91c2VMZWF2ZVRpbWVyOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdHJpZ2dlckNsYXNzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tdHJpZ2dlci1kaXNhYmxlZCc6IHRoaXMuZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcG9wdXBDbGFzcygpIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICAgIFtgZGl0by1wb3B1cC0ke2h5cGhlbmF0ZSh0aGlzLnBsYWNlbWVudCl9YF06IHRydWVcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUNsYXNzKSB7XG4gICAgICAgIGNsYXNzZXNbdGhpcy5jdXN0b21DbGFzc10gPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3Nlc1xuICAgIH0sXG5cbiAgICBwb3B1cFN0eWxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuekluZGV4ID8gYHotaW5kZXg6ICR7dGhpcy56SW5kZXh9YCA6ICcnXG4gICAgfSxcblxuICAgIHRyaWdnZXJUYXJnZXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3cgfHwgdGhpcy5hbHdheXNTaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB0aGlzLm9uU2hvd1BvcHVwKHRvKSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2ZvY3VzJykge1xuICAgICAgdGhpcy5mb2N1c0V2ZW50cyA9IHRoaXMuYWRkRm9jdXNFdmVudHModGhpcy50cmlnZ2VyVGFyZ2V0ID8/IHRyaWdnZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGlkZVdoZW5DbGlja091dHNpZGUgJiYgIXRoaXMuYWx3YXlzU2hvdykge1xuICAgICAgLy8gVXNlICdtb3VzZXVwJyBpbnN0ZWFkIG9mICdjbGljaycsIHNpbmNlIGNsaWNrIGFwcGVhcnMgdG8gaGFwcGVuIGFmdGVyXG4gICAgICAvLyB0aGUgRE9NIGluc2lkZSBvZiBwb3B1cHMgY291bGQgY2hhbmdlIGluIGEgd2F5IHNvIHRoYXQgdGhlIGNoZWNrXG4gICAgICAvLyBgcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWAgd291bGQgZmFpbDpcbiAgICAgIHRoaXMuY2xvc2VFdmVudHMgPSBhZGRFdmVudHMod2luZG93LCB7XG4gICAgICAgIG1vdXNldXA6IGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCAmJlxuICAgICAgICAgICAgIXBvcHVwLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0cmlnZ2VyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0aGlzLnRyaWdnZXJUYXJnZXQ/LmNvbnRhaW5zKGV2ZW50LnRhcmdldClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbHdheXNTaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLnNob3dQb3B1cCA9IHRoaXMuc2hvd1xuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICB0aGlzLmZvY3VzRXZlbnRzPy5yZW1vdmUoKVxuICAgIHRoaXMuY2xvc2VFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5wb3B1cEV2ZW50cz8ucmVtb3ZlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgICBpZiAodGhpcy5zaG93ICYmIHBvcHVwLm9mZnNldFdpZHRoID09PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpLCAwKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy50cmlnZ2VyVGFyZ2V0ID8/IHRyaWdnZXJcbiAgICAgIC8vIEFjdHVhbGx5IHJlc2l6ZSB0aGUgcG9wdXAncyBmaXJzdCBjaGlsZCwgc28gdGhleSBjYW4gc2V0IHNpemUgbGltaXRzLlxuICAgICAgY29uc3QgZWwgPSB0aGlzLnRhcmdldCA9PT0gJ3BvcHVwJyA/IHRyaWdnZXIgOiBwb3B1cC5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnN0eWxlLndpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLndpZHRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJvdW5kcyA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgdHJpZ2dlckxlZnQgPSBib3VuZHMubGVmdCArIHdpbmRvdy5zY3JvbGxYXG4gICAgICBjb25zdCB0cmlnZ2VyVG9wID0gYm91bmRzLnRvcCArIHdpbmRvdy5zY3JvbGxZXG4gICAgICBjb25zdCB0cmlnZ2VyV2lkdGggPSBib3VuZHMud2lkdGhcbiAgICAgIGNvbnN0IHRyaWdnZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0XG4gICAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXAub2Zmc2V0V2lkdGhcbiAgICAgIGNvbnN0IHBvcHVwSGVpZ2h0ID0gcG9wdXAub2Zmc2V0SGVpZ2h0XG5cbiAgICAgIGxldCBbcGFydDEsIHBhcnQyXSA9IHRoaXMucG9wdXBQbGFjZW1lbnQuc3BsaXQoJy0nKSB8fCBbXVxuICAgICAgaWYgKHRoaXMua2VlcEluVmlldykge1xuICAgICAgICBjb25zdCB3aW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgICAgIGNvbnN0IHdpbkhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCAtIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0MiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wICsgdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCArIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBsZWZ0ID0gMFxuICAgICAgbGV0IHRvcCA9IDBcbiAgICAgIHN3aXRjaCAocGFydDEpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCArPSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAocGFydDIpIHtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aCAtIHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0IC0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb3Zlcikge1xuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICB0b3AgLT0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0ICE9PSB0cmlnZ2VyKSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJCb3VuZHMgPSB0cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGxlZnQgKz0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyQm91bmRzLmxlZnRcbiAgICAgICAgdG9wICs9IHRyaWdnZXJUb3AgLSB0cmlnZ2VyQm91bmRzLnRvcFxuICAgICAgfVxuICAgICAgcG9wdXAuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgXG4gICAgICBwb3B1cC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgXG4gICAgfSxcblxuICAgIGFkZEZvY3VzRXZlbnRzKHBhcmVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgdGV4dGFyZWEnKVxuICAgICAgbGV0IGlucHV0XG5cbiAgICAgIHJldHVybiBjb21iaW5lRXZlbnRzKFxuICAgICAgICBhZGRFdmVudHModGFyZ2V0cywge1xuICAgICAgICAgIGZvY3VzOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmJsdXJUaW1lcilcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgICAgLy8gVXNlIHRpbWVvdXQgdG8gYWxsb3cgY2xpY2tlZCBpbnB1dHMgdG8gZ3JhYiBmb2N1c1xuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLiRyZWZzLnBvcHVwLm1hdGNoZXMoJzpmb2N1cy13aXRoaW4nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuXG4gICAgICAgIGFkZEV2ZW50cyhwYXJlbnQsIHtcbiAgICAgICAgICBtb3VzZWRvd246IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgYnV0dG9uJykpIHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcygnLmRpdG8tYnV0dG9uLWNsZWFyJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlciA9IHRoaXMudHJpZ2dlclRhcmdldCA/PyB0aGlzLiRyZWZzLnRyaWdnZXJcbiAgICAgICAgICAgICAgLy8gTWFyayB0cmlnZ2VyIGlucHV0IGFzIHJlYWRvbmx5IHNvIGl0IGNhbid0IGxvb3NlIGZvY3VzIHdoaWxlXG4gICAgICAgICAgICAgIC8vIHVzZXIgZG9lcyBvdGhlciBtb3VzZS1hY3Rpdml0aWVzIGluIHBvcHVwLlxuICAgICAgICAgICAgICBpbnB1dCA9IHRyaWdnZXIucXVlcnlTZWxlY3RvcignaW5wdXQsIHRleHRhcmVhJylcbiAgICAgICAgICAgICAgaWYgKGlucHV0ICYmICFpbnB1dC5oYXNBdHRyaWJ1dGUoJ3JlYWRvbmx5JykpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJ3RydWUnKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIG1vdXNldXA6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgICAvLyBHaXZlIHNvbWUgdGltZSBmb3Igb3RoZXIgZXZlbnRzIHRvIHVwZGF0ZSBpbnB1dCBiZWZvcmUgaXRcbiAgICAgICAgICAgICAgLy8gYmVjb21lcyBlZGl0YWJsZSBhbmQgc3RpbGwgZm9jdXNlZCBhZ2Fpbi5cbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKCdyZWFkb25seScpXG4gICAgICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcygnaW5wdXQsIHRleHRhcmVhLCBidXR0b24nKSkge1xuICAgICAgICAgICAgICAgICAgaW5wdXQuZm9jdXMoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnB1dCA9IG51bGxcbiAgICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSxcblxuICAgIG9uU2hvd1BvcHVwKHNob3cpIHtcbiAgICAgIGlmIChzaG93KSB7XG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycpIHtcbiAgICAgICAgICB0aGlzLnBvcHVwRXZlbnRzID0gdGhpcy5hZGRGb2N1c0V2ZW50cyh0aGlzLiRyZWZzLnBvcHVwKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3B1cEV2ZW50cz8ucmVtb3ZlKClcbiAgICAgICAgdGhpcy5wb3B1cEV2ZW50cyA9IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25DbGljaygpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Ib3ZlcihlbnRlcikge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlTGVhdmVUaW1lcilcbiAgICAgICAgaWYgKGVudGVyKSB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGlkZURlbGF5KSB7XG4gICAgICAgICAgICB0aGlzLm1vdXNlTGVhdmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgICB9LCB0aGlzLmhpZGVEZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcbkBpbXBvcnQgJy4uL3N0eWxlcy90cmFuc2l0aW9ucyc7XG5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZGl0by10cmlnZ2VyLWRpc2FibGVkIHtcbiAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgKiB7XG4gICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmZvY3VzIHtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXBvcHVwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6ICR6LWluZGV4LXBvcHVwO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1pbnB1dChcbiAgOmNsYXNzPVwiY2xhc3Nlc1wiXG4gIEBtb3VzZWRvd249XCJvbk1vdXNlRG93blwiXG4pXG4gIHNsb3QobmFtZT1cInByZWZpeFwiKVxuICBpbnB1dChcbiAgICA6aWQ9XCJpZFwiXG4gICAgcmVmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgIDp0eXBlPVwidHlwZVwiXG4gICAgOm5hbWU9XCJuYW1lXCJcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIDpyZWFkb25seT1cInJlYWRvbmx5XCJcbiAgICA6YXV0b2ZvY3VzPVwiYXV0b2ZvY3VzXCJcbiAgICA6cGxhY2Vob2xkZXI9XCJwbGFjZWhvbGRlclwiXG4gICAgOmF1dG9jb21wbGV0ZT1cImF1dG9jb21wbGV0ZVwiXG4gICAgOmFyaWEtbGFiZWw9XCJ0aXRsZVwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgQG1vdXNlZG93bj1cIm9uTW91c2VEb3duXCJcbiAgKVxuICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnIH0sXG4gICAgaWQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0aXRsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgYXV0b2ZvY3VzOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZm9jdXNlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGF1dG9jb21wbGV0ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdvZmYnIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLiRhdHRycy5jbGFzcyxcbiAgICAgICAge1xuICAgICAgICAgICdkaXRvLWlucHV0LS1mb2N1cyc6IHRoaXMuZm9jdXNlZFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBfLCAuLi5hdHRyaWJ1dGVzIH0gPSB0aGlzLiRhdHRyc1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dFxuICAgIH0sXG5cbiAgICBzaXplKCkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHNpemUgYmFzZWQgb24gbWluICYgbWF4IHNldHRpbmdzLCBpZiB0aGV5J3JlIHByb3ZpZGVkLlxuICAgICAgY29uc3QgeyBzaXplLCBtaW4sIG1heCB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIGNvbnN0IGdldExlbmd0aCA9IHZhbHVlID0+ICh2YWx1ZSAhPSBudWxsID8gYCR7dmFsdWV9YC5sZW5ndGggOiAwKVxuICAgICAgcmV0dXJuIHNpemUgfHwgZ2V0TGVuZ3RoKG1pbikgfHwgZ2V0TGVuZ3RoKG1heCkgfHwgdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY3VycmVudFZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfSxcblxuICAgIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLmlucHV0KSB7XG4gICAgICAgIC8vIFdoZW4gZGlyZWN0bHkgY2xpY2tpbmcgdGhlIGlucHV0LCBkbyBub3QgcHJvcGFnYXRlIHRoZSBldmVudCBhbmRcbiAgICAgICAgLy8gYXZvaWQgYHByZXZlbnREZWZhdWx0KClgIGJlbG93LCB0byBrZWVwIHN1cHBvcnRpbmcgc2VsZWN0aW9uLlxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2hlbiBjbGlja2luZyBvdXRzaWRlIHRoZSBpbnB1dCwgZS5nLiBvbiBhZmZpeGVzLCBicmluZyB0aGUgZm9jdXNcbiAgICAgICAgLy8gYmFjayB0byB0aGUgaW5wdXQuXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSkge1xuICAgICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8taW5wdXQge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICBAZXh0ZW5kICVpbnB1dDtcblxuICBpbnB1dCB7XG4gICAgLy8gSW5oZXJpdCBhbGwgc3R5bGluZyBmcm9tIC5kaXRvLWlucHV0XG4gICAgYWxsOiBpbmhlcml0O1xuICAgIGZsZXg6IDE7XG4gICAgbWluLXdpZHRoOiAwO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuaS5kaXRvLWljb24oOmNsYXNzPVwiY2xhc3Nlc1wiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvcHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgZGlzYWJsZWQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSAnZGl0by1pY29uJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLSR7dGhpcy5uYW1lfWBdOiB0cnVlLFxuICAgICAgICBbYCR7cHJlZml4fS0tZGlzYWJsZWRgXTogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLy8gYHlhcm4gYnVpbGQ6aWNvbnNgIGNvbnZlcnRzIHRoZSBpY29uIFNWRyBmaWxlcyB0byBzaWxlbnQgY2xhc3NlcyBpbnNpZGVcbi8vIGBzcmMvc3R5bGVzL21peGlucy9faWNvbnMuc2Nzc2AsIG1ha2luZyB0aGVtIGF2YWlsYWJsZSB0byBhbGwgb3RoZXIgc2Fzc1xuLy8gY29kZSB0aHJvdWdoIGBfaW1wb3J0c2AuXG4vLyBJbiBvcmRlciB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIGFzIG5vcm1hbCBDU1MgY2xhc3NlcywgY29udmVydCB0aGVtIGhlcmU6XG5AZWFjaCAkbmFtZSBpbiAkaWNvbnMge1xuICAuZGl0by1pY29uLS0jeyRuYW1lfSB7XG4gICAgJjo6YWZ0ZXIge1xuICAgICAgQGV4dGVuZCAlaWNvbi0jeyRuYW1lfTtcblxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcblxuICBAYXQtcm9vdCAuZGl0by1pbnB1dCAmIHtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgY29sb3I6ICRjb2xvci1ncmV5O1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcblxuICAgICYuZGl0by1pY29uLS1kaXNhYmxlZCB7XG4gICAgICBjb2xvcjogJGNvbG9yLWxpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIEBhdC1yb290IC5kaXRvLWlucHV0OmZvY3VzLXdpdGhpbiAmIHtcbiAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQsIGVuZCB9KSB7XG4gIGlmIChpbnB1dD8uc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICBpbnB1dC5mb2N1cygpXG4gICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKGlucHV0KSB7XG4gIHJldHVybiBpbnB1dCAmJiAnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0XG4gICAgPyB7IHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCwgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmQgfVxuICAgIDogbnVsbFxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvVHJpZ2dlci5kaXRvLWRhdGUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImZvY3VzXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiJHNsb3RzLnRyaWdnZXJcIlxuICAgICAgbmFtZT1cInRyaWdnZXJcIlxuICAgIClcbiAgICBEaXRvSW5wdXQuZGl0by1kYXRlLXBpY2tlci1pbnB1dChcbiAgICAgIHYtZWxzZVxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBmb2N1c2VkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgICAgICBzbG90KG5hbWU9XCJwcmVmaXhcIilcbiAgICAgIHRlbXBsYXRlKCNzdWZmaXgpXG4gICAgICAgIERpdG9JY29uKFxuICAgICAgICAgIG5hbWU9XCJjYWxlbmRhclwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIERpdG9DYWxlbmRhci5kaXRvLWRhdGUtcGlja2VyLXBvcHVwKFxuICAgICAgcmVmPVwiY2FsZW5kYXJcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LWJpbmQ9XCJ7IGxvY2FsZSwgZGlzYWJsZWREYXRlIH1cIlxuICAgICAgQHNlbGVjdD1cInNob3dQb3B1cCA9IGZhbHNlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b1RyaWdnZXIgZnJvbSAnLi9EaXRvVHJpZ2dlci52dWUnXG5pbXBvcnQgRGl0b0NhbGVuZGFyIGZyb20gJy4vRGl0b0NhbGVuZGFyLnZ1ZSdcbmltcG9ydCBEaXRvSW5wdXQgZnJvbSAnLi9EaXRvSW5wdXQudnVlJ1xuaW1wb3J0IERpdG9JY29uIGZyb20gJy4vRGl0b0ljb24udnVlJ1xuaW1wb3J0IHsgcGFyc2VEYXRlLCBnZXREYXRlUGFydEF0UG9zaXRpb24gfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgRGl0b1RyaWdnZXIsIERpdG9DYWxlbmRhciwgRGl0b0lucHV0LCBEaXRvSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tLWxlZnQnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogJ3RyaWdnZXInIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgZGF0ZTogZGVmYXVsdEZvcm1hdHMuZGF0ZSxcbiAgICAgICAgdGltZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpPy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpXG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAuLi50aGlzLmZvcm1hdFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBmb2N1c1xuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHsgdmVyOiBzdGVwLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgIGlmIChzdGVwIHx8IGVudGVyKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KT8uc3RhcnRcbiAgICAgICAgY29uc3QgZ2V0RGF0ZVBhcnQgPSBwb3NpdGlvbiA9PlxuICAgICAgICAgIGdldERhdGVQYXJ0QXRQb3NpdGlvbih0aGlzLmN1cnJlbnRUZXh0LCBwb3NpdGlvbiwgdGhpcy5mb3JtYXRPcHRpb25zKVxuXG4gICAgICAgIGlmIChzdGVwICYmICF0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHsgY2FsZW5kYXIgfSA9IHRoaXMuJHJlZnNcbiAgICAgICAgICBpZiAoY2FsZW5kYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZTogbW9kZSwgc3RhcnQgfSA9IGdldERhdGVQYXJ0KHBvc2l0aW9uKSB8fCB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBtb2RlICYmXG4gICAgICAgICAgICAgIGNhbGVuZGFyLm5hdmlnYXRlKHsgc3RlcCwgZW50ZXIsIG1vZGUsIHVwZGF0ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbih0aGlzLmlucHV0LCBnZXREYXRlUGFydChzdGFydCkpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuZGlzYWJsZWQgJiYgKCF0b2dnbGUgfHwgIXRoaXMuc2hvd1BvcHVwKVxuICAgICAgaWYgKHRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRhdGUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWluLXdpZHRoOiA4ZW07XG4gIH1cbn1cblxuLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAge1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG48L3N0eWxlPlxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvVHJpZ2dlci5kaXRvLXRpbWUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImZvY3VzXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiJHNsb3RzLnRyaWdnZXJcIlxuICAgICAgbmFtZT1cInRyaWdnZXJcIlxuICAgIClcbiAgICBEaXRvSW5wdXQuZGl0by10aW1lLXBpY2tlci1pbnB1dChcbiAgICAgIHYtZWxzZVxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBmb2N1c2VkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgICAgICBzbG90KG5hbWU9XCJwcmVmaXhcIilcbiAgICAgIHRlbXBsYXRlKCNzdWZmaXgpXG4gICAgICAgIERpdG9JY29uKFxuICAgICAgICAgIG5hbWU9XCJjbG9ja1wiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIC5kaXRvLXRpbWUtcGlja2VyLXBvcHVwXG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLWhvdXIocmVmPVwiaG91clwiKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiAyNFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRIb3VyKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBob3VyID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImhvdXIgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItbWludXRlKHJlZj1cIm1pbnV0ZVwiKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRNaW51dGUoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IG1pbnV0ZSA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJtaW51dGUgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItc2Vjb25kKHJlZj1cInNlY29uZFwiKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRTZWNvbmQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IHNlY29uZCA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWNvbmQgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBmb3JtYXQsIGRlZmF1bHRGb3JtYXRzIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvVHJpZ2dlciBmcm9tICcuL0RpdG9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBEaXRvSW5wdXQgZnJvbSAnLi9EaXRvSW5wdXQudnVlJ1xuaW1wb3J0IERpdG9JY29uIGZyb20gJy4vRGl0b0ljb24udnVlJ1xuaW1wb3J0IHsgYWx0ZXJEYXRlLCBwYXJzZURhdGUsIGdldERhdGVQYXJ0QXRQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBnZXRTZWxlY3Rpb24sIHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcbmltcG9ydCB7IGdldFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL3RyaWdnZXIuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBEaXRvVHJpZ2dlciwgRGl0b0lucHV0LCBEaXRvSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tLWxlZnQnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogJ3RyaWdnZXInIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgdGltZTogZGVmYXVsdEZvcm1hdHMudGltZSxcbiAgICAgICAgZGF0ZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfSxcbiAgICBkaXNhYmxlZEhvdXI6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgZGlzYWJsZWRNaW51dGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgZGlzYWJsZWRTZWNvbmQ6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGlnbm9yZU5leHRDaGFuZ2U6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dQb3B1cFxuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiBnZXRUYXJnZXQodGhpcyk/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JylcbiAgICB9LFxuXG4gICAgZm9ybWF0T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgIC4uLnRoaXMuZm9ybWF0XG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykgfHwgJydcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gcGFyc2VEYXRlKHZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXRlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudERhdGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSB8fFxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRGF0ZSgpIG9iamVjdCB3aXRoIHRoZSB0aW1lIHNldCB0byAwLCB0byBiZSB1c2VkIHdoZW5cbiAgICAgICAgLy8gZmlyc3Qgc2V0dGluZyBhbnkgb2YgdGhlIHRpbWVzLCBmb3IgbWVhbmluZ2Z1bCBkYXRlcyBpbiBjYXNlIHRoZVxuICAgICAgICAvLyBvYmplY3QgaXMgc2hhcmVkIHdpdGggYSBEYXRlUGlja2VyLCBlLmcuIHRocm91Z2ggRGF0ZVRpbWVQaWNrZXIuXG4gICAgICAgIGFsdGVyRGF0ZShuZXcgRGF0ZSgpLCB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBtaWxsaXNlY29uZDogMCB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBob3VyOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldEhvdXJzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChob3VyKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh7IGhvdXIgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWludXRlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldE1pbnV0ZXMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KG1pbnV0ZSkge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBtaW51dGUgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2Vjb25kOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldFNlY29uZHMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KHNlY29uZCkge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBzZWNvbmQgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKHRydWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgaWYgKCt2YWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy5zY3JvbGxBbGwodHJ1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQoKSB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSB0aGlzXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oaW5wdXQpXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZm9jdXNlZCAmJlxuICAgICAgICAhdGhpcy5pZ25vcmVOZXh0Q2hhbmdlICYmXG4gICAgICAgIHNlbGVjdGlvbi5zdGFydCA9PT0gc2VsZWN0aW9uLmVuZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbihpbnB1dCwgc2VsZWN0aW9uKSlcbiAgICAgIH1cbiAgICAgIHRoaXMuaWdub3JlTmV4dENoYW5nZSA9IGZhbHNlXG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKGZhbHNlKVxuICAgICAgfVxuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbGVmdFBhZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuICgnMCcgKyB2YWx1ZSkuc2xpY2UoLTIpXG4gICAgfSxcblxuICAgIHNldFRpbWUob3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGFsdGVyRGF0ZSh0aGlzLmN1cnJlbnREYXRlLCB7XG4gICAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IDBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNjcm9sbEFsbChzbW9vdGgpIHtcbiAgICAgIGNvbnN0IHNjcm9sbCA9IChyZWYsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuJHJlZnNbcmVmXVxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IChcbiAgICAgICAgICAgIHRhcmdldC5zY3JvbGxIZWlnaHQgL1xuICAgICAgICAgICAgLy8gRmlyc3QgYW5kIGxhc3Qgb25lIGFkZCAzIHRpbWVzIHRoZSBtYXJnaW4uXG4gICAgICAgICAgICAodGFyZ2V0LmNoaWxkRWxlbWVudENvdW50ICsgNilcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3QgdG9wID0gTWF0aC5yb3VuZCh2YWx1ZSAqIGxpbmVIZWlnaHQpXG4gICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyh0YXJnZXQuc2Nyb2xsVG9wIC0gdG9wKVxuICAgICAgICAgIHRhcmdldC5zY3JvbGxUbyh7XG4gICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICBiZWhhdmlvcjogc21vb3RoICYmIGRpc3RhbmNlIDwgMTAwID8gJ3Ntb290aCcgOiAnYXV0bydcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHNjcm9sbCgnaG91cicsIHRoaXMuaG91cilcbiAgICAgICAgc2Nyb2xsKCdtaW51dGUnLCB0aGlzLm1pbnV0ZSlcbiAgICAgICAgc2Nyb2xsKCdzZWNvbmQnLCB0aGlzLnNlY29uZClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uRm9jdXMoZm9jdXMpIHtcbiAgICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZm9jdXNcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gZm9jdXNcbiAgICB9LFxuXG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSB0aGlzXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oaW5wdXQpXG4gICAgICBjb25zdCB7IHZlcjogc3RlcCwgZW50ZXIgfSA9IGdldEtleU5hdmlnYXRpb24oZXZlbnQpXG4gICAgICBpZiAoc3RlcCB8fCBlbnRlcikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgY29uc3QgZ2V0RGF0ZVBhcnQgPSBwb3NpdGlvbiA9PlxuICAgICAgICAgIGdldERhdGVQYXJ0QXRQb3NpdGlvbih0aGlzLmN1cnJlbnRUZXh0LCBwb3NpdGlvbiwgdGhpcy5mb3JtYXRPcHRpb25zKVxuXG4gICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgc3RhcnQgfSA9IGdldERhdGVQYXJ0KHNlbGVjdGlvbi5zdGFydCkgfHwge31cbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXSArIHN0ZXBcbiAgICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLiRyZWZzW25hbWVdLmNoaWxkRWxlbWVudENvdW50XG4gICAgICAgICAgICAgIHRoaXNbbmFtZV0gPVxuICAgICAgICAgICAgICAgIHZhbHVlIDwgMFxuICAgICAgICAgICAgICAgICAgPyB2YWx1ZSArIGNvdW50XG4gICAgICAgICAgICAgICAgICA6IHZhbHVlID49IGNvdW50XG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWUgLSBjb3VudFxuICAgICAgICAgICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgICAgICAgIHRoaXMuaWdub3JlTmV4dENoYW5nZSA9IHRydWVcbiAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gc2V0U2VsZWN0aW9uKGlucHV0LCBnZXREYXRlUGFydChzdGFydCkpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uc3RhcnQgPT09IHNlbGVjdGlvbi5lbmQpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gaW5wdXRcbiAgICAgICAgbGV0IHBvcyA9IHNlbGVjdGlvbi5zdGFydFxuXG4gICAgICAgIGNvbnN0IGlzRGlnaXQgPSBjaGFyID0+ICFpc05hTihOdW1iZXIoY2hhcikpXG5cbiAgICAgICAgaWYgKGV2ZW50LmtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBpZiAoaXNEaWdpdChldmVudC5rZXkpICYmIHBvcyA8IHZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB2YWx1ZVtwb3NdID09PSAnOicgJiZcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgLSAxXSkgJiZcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgLSAyXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBwb3MrK1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb3ZlIG5leHQgZGlnaXQgc28gdGhlIGV2ZW50IG92ZXJyaWRlcyBpdCBpbnN0ZWFkIG9mIGluc2VydGluZ1xuICAgICAgICAgICAgLy8gbmV3IGNoYXJzLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3Bvc10pICYmIChcbiAgICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyArIDFdKSB8fFxuICAgICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMV0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IChcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZSgwLCBwb3MpICtcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZShwb3MgKyAxKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydDogcG9zLCBlbmQ6IHBvcyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykubGVuZ3RoXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBsZW5ndGgpXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgc2VsZWN0aW9uKVxuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwb3MgPT09IDEgfHxcbiAgICAgICAgICAgIFsnICcsICc6J10uaW5jbHVkZXModmFsdWVbcG9zIC0gMl0pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHBvcyA9PT0gdmFsdWUubGVuZ3RoIHx8XG4gICAgICAgICAgICAgIHZhbHVlW3Bvc10gPT09ICc6J1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHBvcy0tXG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gKFxuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKDAsIHBvcykgK1xuICAgICAgICAgICAgICAgICgodmFsdWVbcG9zIC0gMV0gPz8gJycpICsgJzAwJykgK1xuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKHBvcyArIDEpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKGlucHV0LCB7IHN0YXJ0OiBwb3MsIGVuZDogcG9zIH0pXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3Bvc10pICYmXG4gICAgICAgICAgICAgICFpc0RpZ2l0KCt2YWx1ZVtwb3MgKyAxXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBXaGVuIHJlbW92aW5nIHRoZSBmaXJzdCBvZiB0d28gZGlnaXRzLCByZXBsYWNlIHdpdGggMFxuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHBvcykgKyAnMCcgKyB2YWx1ZS5zbGljZShwb3MpXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydDogcG9zLCBlbmQ6IHBvcyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuZGlzYWJsZWQgJiYgKCF0b2dnbGUgfHwgIXRoaXMuc2hvd1BvcHVwKVxuICAgICAgaWYgKHRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRpbWUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1pbi13aWR0aDogNmVtO1xuICB9XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIHtcbiAgbWF4LXdpZHRoOiAxNjBweDtcbiAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xufVxuXG4kdGltZS1waWNrZXItbGluZS1oZWlnaHQ6IDI0cHg7XG5cbi5kaXRvLXRpbWUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIGJveC1zaGFkb3c6ICRzaGFkb3ctd2luZG93O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCAuZGl0by10aW1lLXBpY2tlci1wYW5lbCB7XG4gIGZsb2F0OiBsZWZ0O1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci13aWR0aDogMCAxcHggMDtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLyAzICsgMXB4KTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICAmOmxhc3QtY2hpbGQge1xuICAgIGJvcmRlci1yaWdodDogMDtcbiAgfVxuXG4gIHVsIHtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbjogMDtcbiAgICAvLyBIaWRlIHNjcm9sbGJhcjpcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICBwYWRkaW5nOiAwIDE3cHggMCAwO1xuICAgIGhlaWdodDogNyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcblxuICAgICYgPiBsaSB7XG4gICAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICBsaW5lLWhlaWdodDogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAzICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAzICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWhpZ2hsaWdodDtcbiAgICAgIH1cblxuICAgICAgJi5zZWxlY3RlZCxcbiAgICAgICYuc2VsZWN0ZWQ6aG92ZXIge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICB9XG5cbiAgICAgICYuZGlzYWJsZWQge1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgICYuZGlzYWJsZWQ6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tZGF0ZS10aW1lLXBpY2tlcihyZWY9XCJwaWNrZXJcIilcbiAgLmRpdG8tZGF0ZS10aW1lLXBpY2tlcl9faW5uZXIoXG4gICAgOmNsYXNzPVwieyAnZGl0by1kYXRlLXRpbWUtcGlja2VyX19pbm5lci0tZm9jdXMnOiBmb2N1c2VkIH1cIlxuICApXG4gICAgRGl0b0lucHV0LmRpdG8tZGF0ZS10aW1lLXBpY2tlcl9faW5wdXQoXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIGZvY3VzZWQsIC4uLiRhdHRycyB9XCJcbiAgICAgIEBmb2N1cz1cIm9uRm9jdXModHJ1ZSlcIlxuICAgICAgQGJsdXI9XCJvbkZvY3VzKGZhbHNlKVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgICBAbW91c2Vkb3duLnN0b3A9XCJvbk1vdXNlRG93bihmYWxzZSlcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCNwcmVmaXgpXG4gICAgICAgIHNsb3QobmFtZT1cInByZWZpeFwiKVxuICAgICAgdGVtcGxhdGUoI3N1ZmZpeClcbiAgICAgICAgRGl0b0ljb24oXG4gICAgICAgICAgbmFtZT1cImNhbGVuZGFyXCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgQG1vdXNlZG93bi5wcmV2ZW50PVwib25Nb3VzZURvd24odHJ1ZSlcIlxuICAgICAgICApXG4gICAgICAgIHNsb3QobmFtZT1cInN1ZmZpeFwiKVxuICAgIERpdG9EYXRlUGlja2VyKFxuICAgICAgcmVmPVwiZGF0ZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dEYXRlXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgICAgIC8vLSBJbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgRGl0b1RpbWVQaWNrZXIoXG4gICAgICByZWY9XCJ0aW1lXCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgICAgdi1tb2RlbDpzaG93PVwic2hvd1RpbWVcIlxuICAgICAgcGxhY2VtZW50PVwiYm90dG9tLXJpZ2h0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgICAgIC8vLSBJbnRlbnRpb25hbGx5IGVtcHR5XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cywgYXNzaWduRGVlcGx5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvSW5wdXQgZnJvbSAnLi9EaXRvSW5wdXQudnVlJ1xuaW1wb3J0IERpdG9EYXRlUGlja2VyIGZyb20gJy4vRGl0b0RhdGVQaWNrZXIudnVlJ1xuaW1wb3J0IERpdG9UaW1lUGlja2VyIGZyb20gJy4vRGl0b1RpbWVQaWNrZXIudnVlJ1xuaW1wb3J0IERpdG9JY29uIGZyb20gJy4vRGl0b0ljb24udnVlJ1xuaW1wb3J0IHsgcGFyc2VEYXRlIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcbmltcG9ydCB7IGdldFNlbGVjdGlvbiwgc2V0U2VsZWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvc2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgZ2V0S2V5TmF2aWdhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgRGl0b0lucHV0LCBEaXRvRGF0ZVBpY2tlciwgRGl0b1RpbWVQaWNrZXIsIERpdG9JY29uIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd0RhdGU6IGZhbHNlLFxuICAgICAgc2hvd1RpbWU6IGZhbHNlLFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGRhdGVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIHRpbWVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNsb3NlZE1vZGU6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyB0cmFuc2l0aW9uLCBkaXNhYmxlZCwgbG9jYWxlLCBmb3JtYXRPcHRpb25zOiBmb3JtYXQgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7IHRyYW5zaXRpb24sIGRpc2FibGVkLCBsb2NhbGUsIGZvcm1hdCB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93RGF0ZSB8fCB0aGlzLnNob3dUaW1lXG4gICAgfSxcblxuICAgIGlucHV0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQuaW5wdXRcbiAgICB9LFxuXG4gICAgZm9ybWF0T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiBhc3NpZ25EZWVwbHkoXG4gICAgICAgIHtcbiAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgIHRpbWU6IGRlZmF1bHRGb3JtYXRzLnRpbWUsXG4gICAgICAgICAgZGF0ZTogZGVmYXVsdEZvcm1hdHMuZGF0ZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgICAgICBmb3JtYXQ6ICh2YWx1ZSwgdHlwZSwgb3B0aW9ucykgPT5cbiAgICAgICAgICAgICAgdHlwZSA9PT0gJ2xpdGVyYWwnICYmIC9cXGJhdFxcYi8udGVzdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/ICcsICdcbiAgICAgICAgICAgICAgICA6IHRoaXMuZm9ybWF0Py5kYXRlPy5mb3JtYXQ/Lih2YWx1ZSwgdHlwZSwgb3B0aW9ucykgPz8gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuZm9ybWF0XG4gICAgICApXG4gICAgfSxcblxuICAgIHRpbWVJbmRleCgpIHtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmN1cnJlbnRUZXh0XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBjb25zdCB0aW1lID0gdGV4dC5tYXRjaCgvKFtcXFNdK1xccyopJC8pPy5bMV1cbiAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggLSB0aW1lLmxlbmd0aFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KVxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbih0aGlzLmlucHV0LCBzZWxlY3Rpb24pKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkZvY3VzKGZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0Rm9jdXNlZCA9IGZvY3VzXG4gICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQb3B1cHMoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93RGF0ZSA9IGZhbHNlXG4gICAgICAgIHRoaXMuc2hvd1RpbWUgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIGlmICh0b2dnbGUgJiYgKHRoaXMuc2hvd0RhdGUgfHwgdGhpcy5zaG93VGltZSkpIHtcbiAgICAgICAgdGhpcy5zaG93RGF0ZSA9IGZhbHNlXG4gICAgICAgIHRoaXMuc2hvd1RpbWUgPSBmYWxzZVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMudXBkYXRlUG9wdXBzKCkpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZ2V0TW9kZShldmVudClcbiAgICAgIHRoaXMuJHJlZnNbbW9kZV0ub25LZXlEb3duKGV2ZW50KVxuICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgdGhpcy5jbG9zZWRNb2RlID0gbW9kZVxuICAgICAgfSBlbHNlIGlmIChtb2RlICE9PSB0aGlzLmNsb3NlZE1vZGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQb3B1cHMobW9kZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0TW9kZShldmVudCA9IG51bGwpIHtcbiAgICAgIGNvbnN0IHsgc3RhcnQgfSA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KVxuICAgICAgY29uc3QgeyBob3I6IHN0ZXAgfSA9IGdldEtleU5hdmlnYXRpb24oZXZlbnQpXG4gICAgICByZXR1cm4gdGhpcy50aW1lSW5kZXggPT09IG51bGwgfHwgc3RhcnQgKyBzdGVwIDwgdGhpcy50aW1lSW5kZXhcbiAgICAgICAgPyAnZGF0ZSdcbiAgICAgICAgOiAndGltZSdcbiAgICB9LFxuXG4gICAgdXBkYXRlUG9wdXBzKG1vZGUgPSB0aGlzLmdldE1vZGUoKSkge1xuICAgICAgaWYgKG1vZGUpIHtcbiAgICAgICAgdGhpcy5jbG9zZWRNb2RlID0gbnVsbFxuICAgICAgfVxuICAgICAgdGhpcy5zaG93RGF0ZSA9IG1vZGUgPT09ICdkYXRlJ1xuICAgICAgdGhpcy5zaG93VGltZSA9IG1vZGUgPT09ICd0aW1lJ1xuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRhdGUtdGltZS1waWNrZXIge1xuICAmX19pbm5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuXG4gICZfX2lucHV0IHtcbiAgICBmbGV4OiAxO1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgbWluLXdpZHRoOiAxMmVtO1xuICB9XG5cbiAgLmRpdG8tZGF0ZS1waWNrZXIsXG4gIC5kaXRvLXRpbWUtcGlja2VyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZS9uby10ZW1wbGF0ZS1zaGFkb3cgLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcGFnaW5hdGlvblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsKFxuICAgIHYtaWY9XCJzaG93VG90YWxcIlxuICApXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWlmPVwidG90YWwgPiAwXCJcbiAgICApIHt7IGZpcnN0IH19IOKAkyB7eyBsYXN0IH19IC8ge3sgdG90YWwgfX1cbiAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtLXJvdW5kKFxuICAgIHYtaWY9XCJudW1QYWdlcyA+IDFcIlxuICApXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdi1mb3I9XCJidXR0b24gaW4gYnV0dG9uc1wiXG4gICAgICA6Y2xhc3M9XCJnZXRCdXR0b25DbGFzc2VzKGJ1dHRvbilcIlxuICAgICAgOmRpc2FibGVkPVwiYnV0dG9uLmRpc2FibGVkXCJcbiAgICAgIEBjbGljaz1cIm9uQ2xpY2tCdXR0b24oYnV0dG9uKVwiXG4gICAgKVxuICAgICAgc3BhbihcbiAgICAgICAgdi1pZj1cImJ1dHRvbi50ZXh0XCJcbiAgICAgICkge3sgYnV0dG9uLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpwYWdlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBwYWdlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMSB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAgfSxcbiAgICBzaG93VG90YWw6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1ByZXY6IHRydWUsXG4gICAgICBzaG93TmV4dDogdHJ1ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmaXJzdCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSArIDFcbiAgICB9LFxuXG4gICAgbGFzdCgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLmZpcnN0ICsgdGhpcy5wYWdlU2l6ZSAtIDEsIHRoaXMudG90YWwpXG4gICAgfSxcblxuICAgIG51bVBhZ2VzKCkge1xuICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gdGhpcy5wYWdlU2l6ZSlcbiAgICB9LFxuXG4gICAgYnV0dG9ucygpIHtcbiAgICAgIGNvbnN0IHsgc2hvd1ByZXYsIHNob3dOZXh0LCBjdXJyZW50UGFnZSwgbnVtUGFnZXMgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHNob3dMZW5ndGggPSBzaG93UHJldiArIHNob3dOZXh0ICsgMVxuXG4gICAgICBsZXQgc3RhcnQgPSAxXG4gICAgICBsZXQgZW5kID0gMVxuICAgICAgaWYgKG51bVBhZ2VzIDw9IHNob3dMZW5ndGgpIHtcbiAgICAgICAgZW5kID0gbnVtUGFnZXNcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBhZ2UgPD0gc2hvd1ByZXYgKyAxKSB7XG4gICAgICAgIGVuZCA9IHNob3dMZW5ndGhcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBhZ2UgPj0gbnVtUGFnZXMgLSBzaG93TmV4dCkge1xuICAgICAgICBlbmQgPSBudW1QYWdlc1xuICAgICAgICBzdGFydCA9IG51bVBhZ2VzIC0gc2hvd0xlbmd0aCArIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gY3VycmVudFBhZ2UgLSBzaG93UHJldlxuICAgICAgICBlbmQgPSBjdXJyZW50UGFnZSArIHNob3dOZXh0XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSBbXVxuICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlIC0gMSxcbiAgICAgICAgdHlwZTogJ3ByZXYnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPD0gMVxuICAgICAgfSlcbiAgICAgIGlmIChzdGFydCA+PSAyKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7IGluZGV4OiAxLCB0ZXh0OiAxIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgPiAyKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWF4KDEsIGN1cnJlbnRQYWdlIC0gMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1wcmV2J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICBhY3RpdmU6IGkgPT09IGN1cnJlbnRQYWdlXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZW5kIDwgbnVtUGFnZXMgLSAxKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWluKG51bVBhZ2VzLCBjdXJyZW50UGFnZSArIDEwKSxcbiAgICAgICAgICB0eXBlOiAnZWxsaXBzaXMtbmV4dCdcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPD0gbnVtUGFnZXMgLSAxKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7IGluZGV4OiBudW1QYWdlcywgdGV4dDogbnVtUGFnZXMgfSlcbiAgICAgIH1cbiAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgIGluZGV4OiBjdXJyZW50UGFnZSArIDEsXG4gICAgICAgIHR5cGU6ICduZXh0JyxcbiAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnRQYWdlID49IG51bVBhZ2VzXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gYnV0dG9uc1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHBhZ2UocGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VcbiAgICB9LFxuXG4gICAgcGFnZVNpemUoKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA+IHRoaXMubnVtUGFnZXMpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMubnVtUGFnZXNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFBhZ2UodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6cGFnZScsIHRvKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0QnV0dG9uQ2xhc3NlcyhidXR0b24pIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9ICdkaXRvLWJ1dHRvbidcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtgJHtwcmVmaXh9LS0ke2J1dHRvbi50eXBlfWBdOiBidXR0b24udHlwZSxcbiAgICAgICAgW2Ake3ByZWZpeH0tLWFjdGl2ZWBdOiBidXR0b24uYWN0aXZlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uQ2xpY2tCdXR0b24oYnV0dG9uKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGJ1dHRvbi5pbmRleCAmJlxuICAgICAgICAhYnV0dG9uLmRpc2FibGVkICYmXG4gICAgICAgIGJ1dHRvbi5pbmRleCAhPT0gdGhpcy5jdXJyZW50UGFnZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBidXR0b24uaW5kZXhcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhZ2luYXRpb24ge1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLXBhZ2luYXRpb24tdG90YWwge1xuICAgIEBpbmNsdWRlIGVsbGlwc2lzO1xuXG4gICAgbWFyZ2luOiAwIDAuNWVtO1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICB9XG5cbiAgLmRpdG8tYnV0dG9uIHtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgYWxsIDAuM3MgZWFzZSxcbiAgICAgIGNvbG9yIDBzLFxuICAgICAgYmFja2dyb3VuZCAwcyxcbiAgICAgIGJvcmRlciAwcztcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgICAmLS1wcmV2LFxuICAgICYtLW5leHQge1xuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1hcnJvdztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLS1wcmV2OjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xuICAgIH1cblxuICAgICYtLWVsbGlwc2lzLXByZXYsXG4gICAgJi0tZWxsaXBzaXMtbmV4dCB7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcblxuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1lbGxpcHNpcztcbiAgICAgIH1cblxuICAgICAgJjpob3Zlcjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1jaGV2cm9ucztcbiAgICAgIH1cblxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgICAgfVxuXG4gICAgICAmOmFjdGl2ZSB7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi0tZWxsaXBzaXMtcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc3dpdGNoKFxuICA6Y2xhc3M9XCJjbGFzc2VzXCJcbiAgOnN0eWxlPVwic3R5bGVzXCJcbilcbiAgLmRpdG8tc3dpdGNoX19wYW5lXG4gICAgaW5wdXQoXG4gICAgICA6aWQ9XCJpZFwiXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIHYtbW9kZWw9XCJjaGVja2VkXCJcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICA6bmFtZT1cIm5hbWVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIClcbiAgICAuZGl0by1zd2l0Y2hfX2J1dHRvblxuICAgIHNwYW4uZGl0by1zd2l0Y2hfX2xhYmVsKFxuICAgICAgdi1pZj1cImxhYmVsc1wiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cImNoZWNrZWRcIlxuICAgICAgICBuYW1lPVwiY2hlY2tlZFwiXG4gICAgICApIHt7IGxhYmVscy5jaGVja2VkIHx8ICdvbicgfX1cbiAgICAgIHNsb3QoXG4gICAgICAgIHYtZWxzZVxuICAgICAgICBuYW1lPVwidW5jaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLnVuY2hlY2tlZCB8fCAnb2ZmJyB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnY2hhbmdlJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaWQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGxhYmVsczogeyB0eXBlOiBbT2JqZWN0LCBCb29sZWFuXSwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrZWQ6IHRoaXMubW9kZWxWYWx1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSAnZGl0by1zd2l0Y2gnXG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLiRhdHRycy5jbGFzcyxcbiAgICAgICAge1xuICAgICAgICAgIFtgJHtwcmVmaXh9LS1jaGVja2VkYF06IHRoaXMuY2hlY2tlZCxcbiAgICAgICAgICBbYCR7cHJlZml4fS0tZGlzYWJsZWRgXTogdGhpcy5kaXNhYmxlZFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IGNoZWNrZWQsIHVuY2hlY2tlZCB9ID0ge30gfSA9IHRoaXNcbiAgICAgIC8vIENhbGN1bGF0ZSBgLS1zd2l0Y2gtd2lkdGhgIGluIGByZW1gLCBiYXNlZCBvbiBsYWJlbCBsZW5ndGguXG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCgwLCBjaGVja2VkPy5sZW5ndGgsIHVuY2hlY2tlZD8ubGVuZ3RoKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJy0tc3dpdGNoLXdpZHRoJzogbGVuZ3RoID8gYCR7bGVuZ3RoICogMS41fXJlbWAgOiBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBfLCAuLi5hdHRyaWJ1dGVzIH0gPSB0aGlzLiRhdHRyc1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKG1vZGVsVmFsdWUpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IG1vZGVsVmFsdWVcbiAgICB9LFxuXG4gICAgY2hlY2tlZChjaGVja2VkKSB7XG4gICAgICBpZiAoY2hlY2tlZCAhPT0gdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY2hlY2tlZClcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgY2hlY2tlZClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zd2l0Y2gge1xuICAkc2VsZjogJjtcblxuICAvLyBVc2Ugd2hvbGUgbXVsdGlwbGVzIG9mIGByZW1gIGZvciBzaXplcyBhbmQgYHB4YCBtYXJnaW5zL3BhZGRpbmcgYWxvbmdcbiAgLy8gd2l0aCBgY2FsYygpYCB0byBlbmQgdXAgd2l0aCBldmVuIHBpeGVsIHNpemVzLlxuICAtLXN3aXRjaC13aWR0aDogNGVtO1xuICAtLXN3aXRjaC1oZWlnaHQ6IDJlbTtcbiAgLS1zd2l0Y2gtbWFyZ2luOiAycHg7XG4gIC0tc3dpdGNoLXBhZGRpbmc6IDNweDtcbiAgLS1zd2l0Y2gtc3BlZWQ6IDMwMG1zO1xuICAtLWxhYmVsLW1hcmdpbjogMC41ZW07XG4gIC0td2lkdGg6IGNhbGModmFyKC0tc3dpdGNoLXdpZHRoKSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0taGVpZ2h0OiBjYWxjKHZhcigtLXN3aXRjaC1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1vZmZzZXQ6IGNhbGModmFyKC0td2lkdGgpIC0gdmFyKC0taGVpZ2h0KSk7XG5cbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogdmFyKC0tc3dpdGNoLWhlaWdodCk7XG4gIC8vIFRvIG1ha2UgaW5saW5lIGxhYmVscyBhcHBlYXIgb24gY29uc2lzdGVudCBiYXNlbGluZTpcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgJl9fcGFuZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiB2YXIoLS13aWR0aCk7XG4gICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQpO1xuICB9XG5cbiAgJl9fcGFuZSxcbiAgJl9fbGFiZWwge1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgfVxuXG4gIGlucHV0IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodDtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgYm9yZGVyLWNvbG9yIDAuM3MsXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuM3M7XG4gIH1cblxuICAmX19idXR0b24ge1xuICAgIC0tc2l6ZTogY2FsYyh2YXIoLS1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1wYWRkaW5nKSk7XG5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgbGVmdDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIHdpZHRoOiB2YXIoLS1zaXplKTtcbiAgICBoZWlnaHQ6IHZhcigtLXNpemUpO1xuICAgIGJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tc2l6ZSkgLyAyKTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tc3dpdGNoLXNwZWVkKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gIH1cblxuICAmX19idXR0b24sXG4gICZfX2xhYmVsIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gICZfX2xhYmVsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IHZhcigtLWxhYmVsLW1hcmdpbik7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgJi0tY2hlY2tlZCB7XG4gICAgaW5wdXQge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG5cbiAgICAjeyRzZWxmfV9fYnV0dG9uIHtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1vZmZzZXQpKTtcbiAgICB9XG5cbiAgICAjeyRzZWxmfV9fbGFiZWwge1xuICAgICAgbGVmdDogdmFyKC0tbGFiZWwtbWFyZ2luKTtcbiAgICAgIHJpZ2h0OiB1bnNldDtcbiAgICB9XG4gIH1cblxuICAmLS1kaXNhYmxlZCB7XG4gICAgQGV4dGVuZCAlYnV0dG9uLWRpc2FibGVkO1xuICB9XG5cbiAgJjpmb2N1cy13aXRoaW46bm90KDpob3Zlcikge1xuICAgICN7JHNlbGZ9X19idXR0b24ge1xuICAgICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IHsgaCBhcyBjcmVhdGVFbGVtZW50LCBUcmFuc2l0aW9uIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZnVuY3Rpb24gVHJhbnNpdGlvbkhlaWdodCh7IGVuYWJsZWQgfSwgeyBzbG90cyB9KSB7XG4gIHJldHVybiBlbmFibGVkXG4gICAgPyBjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHByb3BzLCBzbG90cylcbiAgICA6IHNsb3RzLmRlZmF1bHQoKVxufVxuXG5UcmFuc2l0aW9uSGVpZ2h0LnByb3BzID0ge1xuICBlbmFibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uSGVpZ2h0XG5cbmNvbnN0IHNldFN0eWxlID0gKGVsZW1lbnQsIHN0eWxlKSA9PiBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXG5jb25zdCBuZXh0VGltZW91dCA9IGNhbGxiYWNrID0+IHNldFRpbWVvdXQoY2FsbGJhY2ssIDApXG5cbi8vIEZvcmNlIHJlcGFpbnQgdG8gbWFrZSBzdXJlIHRoZSBhbmltYXRpb24gaXMgdHJpZ2dlcmVkIGNvcnJlY3RseS5cbmNvbnN0IGZvcmNlUmVwYWludCA9IGVsZW1lbnQgPT4gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHRcblxuY29uc3QgcHJvcHMgPSB7XG4gIG5hbWU6ICdkaXRvLWhlaWdodCcsXG5cbiAgb25BZnRlckVudGVyKGVsZW1lbnQpIHtcbiAgICAvLyBBIHRpbWVvdXQgYmVmb3JlIHNldHRpbmcgc3R5bGUgaXMgb25seSByZWFsbHkgbmVlZGVkIGFmdGVyIGNhbGxzIHRvXG4gICAgLy8gYGZvcmNlUmVwYWludCgpYCwgYnV0IHVzaW5nIG9uZSBoZXJlIHRvbyBwcmVzZXJ2ZXMgZXhlY3V0aW9uIHNlcXVlbmNlIHNvXG4gICAgLy8gdGhhdCB0aGUgY2FsbCBmcm9tIGBlbnRlcigpYCBjYW4gbmV2ZXIgb3V0cnVuIHRoZSBvbmUgZnJvbSBgYWZ0ZXJFbnRlcigpYFxuICAgIG5leHRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0OiBudWxsIH0pKVxuICB9LFxuXG4gIG9uRW50ZXIoZWxlbWVudCkge1xuICAgIC8vIEZvciBzb21lIHJlYXNvbiB3ZSdyZSBnZXR0aW5nIHR3byBgb25FbnRlcigpYCBjYWxscyBwZXIgdHJhbnNpdGlvbixcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUgc2Vjb25kIG9uZS4gVGhpcyBtaWdodCBiZSBsaW5rZWQgdG8gdGhlIHVzZVxuICAgIC8vIG9mIGBuZXh0VGltZW91dCgpYCwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gZ2V0IHRoZSBjb3JyZWN0IHZhbHVlIGZvclxuICAgIC8vIGBoZWlnaHRgLCBiYXNlZCBvbiBgJi0tbGFiZWwtdmVydGljYWxgIGNhbGN1bGF0aW9ucy5cbiAgICBjb25zdCB7IHdpZHRoIH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgc2V0U3R5bGUoZWxlbWVudCwge1xuICAgICAgd2lkdGgsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgaGVpZ2h0OiAnYXV0bydcbiAgICB9KVxuICAgIG5leHRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICAgIHdpZHRoOiBudWxsLFxuICAgICAgICBwb3NpdGlvbjogbnVsbCxcbiAgICAgICAgdmlzaWJpbGl0eTogbnVsbCxcbiAgICAgICAgaGVpZ2h0OiAwXG4gICAgICB9KVxuICAgICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgICBuZXh0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KSlcbiAgICB9KVxuICB9LFxuXG4gIG9uTGVhdmUoZWxlbWVudCkge1xuICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQgfSlcbiAgICBmb3JjZVJlcGFpbnQoZWxlbWVudClcbiAgICBuZXh0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogMCB9KSlcbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJGR1cmF0aW9uOiAwLjE1cztcblxuLmRpdG8taGVpZ2h0LWVudGVyLWFjdGl2ZSxcbi5kaXRvLWhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2l0aW9uOiBoZWlnaHQgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRpdG8taGVpZ2h0LWVudGVyLWFjdGl2ZSB7XG4gIGFuaW1hdGlvbjogZGl0by1zbGlkZS1lbnRlciAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xufVxuXG4uZGl0by1oZWlnaHQtbGVhdmUtYWN0aXZlIHtcbiAgYW5pbWF0aW9uOiBkaXRvLXNsaWRlLWxlYXZlICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5kaXRvLWhlaWdodC1lbnRlci1mcm9tLFxuLmRpdG8taGVpZ2h0LWxlYXZlLXRvIHtcbiAgaGVpZ2h0OiAwO1xufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cyB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkb21IYW5kbGVyczogW11cbiAgICB9XG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIGZvciAoY29uc3QgeyByZW1vdmUgfSBvZiB0aGlzLmRvbUhhbmRsZXJzKSB7XG4gICAgICByZW1vdmUoKVxuICAgIH1cbiAgICB0aGlzLmRvbUhhbmRsZXJzID0gW11cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZG9tT24oZWxlbWVudCwgdHlwZSwgaGFuZGxlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYWRkRXZlbnRzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBpc09iamVjdCh0eXBlKSA/IHR5cGUgOiB7IFt0eXBlXTogaGFuZGxlciB9XG4gICAgICApXG4gICAgICB0aGlzLmRvbUhhbmRsZXJzLnB1c2gocmVzdWx0KVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGl0b1VzZXIge1xuICBoYXNSb2xlKC4uLnJvbGVzKSB7XG4gICAgaWYgKHRoaXMucm9sZXMpIHtcbiAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcykge1xuICAgICAgICBpZiAodGhpcy5yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiIsIi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRzY2hlbWFQYXJlbnRDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1hQ29tcG9uZW50czogW11cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBtYWluU2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50c1swXVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGBEaXRvU2NoZW1hLmNyZWF0ZWQoKS91bm1vdW50ZWQoKWAgb24gaXRzXG4gICAgLy8gYCRzY2hlbWFQYXJlbnRDb21wb25lbnRgLCBpZiB0aGUgcGFyZW50IHVzZXMgdGhlIGBTY2hlbWFQYXJlbnRNaXhpbmA6XG4gICAgX3JlZ2lzdGVyU2NoZW1hQ29tcG9uZW50KHNjaGVtYUNvbXBvbmVudCwgYWRkKSB7XG4gICAgICBjb25zdCB7IHNjaGVtYUNvbXBvbmVudHMgfSA9IHRoaXNcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50cy5wdXNoKHNjaGVtYUNvbXBvbmVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVtYUNvbXBvbmVudHMuc3BsaWNlKHNjaGVtYUNvbXBvbmVudHMuaW5kZXhPZihzY2hlbWFDb21wb25lbnQpLCAxKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFNjaGVtYVBhcmVudE1peGluIGZyb20gJy4vU2NoZW1hUGFyZW50TWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW1NjaGVtYVBhcmVudE1peGluXSxcblxuICBjb21wdXRlZDoge1xuICAgIGVycm9ycygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZmxhdE1hcCgoeyBlcnJvcnMgfSkgPT4gZXJyb3JzIHx8IFtdKVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLnNvbWUoaXQgPT4gaXQuaXNUb3VjaGVkKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5zb21lKGl0ID0+IGl0LmlzRGlydHkpXG4gICAgfSxcblxuICAgIGlzVmFsaWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLmV2ZXJ5KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC5pc1ZhbGlkKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSA9IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZXZlcnkoaXQgPT4gaXQudmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSkpXG4gICAgfSxcblxuICAgIHZlcmlmeUFsbChtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC52ZXJpZnlBbGwobWF0Y2gpKVxuICAgIH0sXG5cbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5yZXNldFZhbGlkYXRpb24oKSlcbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5jbGVhckVycm9ycygpKVxuICAgIH0sXG5cbiAgICBzaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIGZvY3VzLCBmaXJzdCA9IHRydWUpIHtcbiAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5mb3JFYWNoKFxuICAgICAgICBzY2hlbWFDb21wb25lbnQgPT4ge1xuICAgICAgICAgIGlmIChzY2hlbWFDb21wb25lbnQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cywgZmlyc3QpKSB7XG4gICAgICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgICByZXR1cm4gIWZpcnN0XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVmFsaWRhdG9yTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1ZhbGlkYXRvck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0Q29tbW9uUHJlZml4IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbVmFsaWRhdG9yTWl4aW5dLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRyb3V0ZUNvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWxvYWQ6IGZhbHNlLFxuICAgICAgLy8gRWFjaCByb3V0ZS1jb21wb25lbnQgZGVmaW5lcyBhIHN0b3JlIHRoYXQgZ2V0cyBwYXNzZWQgb24gdG8gaXRzXG4gICAgICAvLyBjaGlsZCBjb21wb25lbnRzLCBzbyB0aGV5IGNhbiBzdG9yZSB2YWx1ZXMgaW4gdGhlbSB0aGF0IGxpdmUgYmV5b25kXG4gICAgICAvLyB0aGVpciBsaWZlLWN5Y2xlLiBTZWU6IERpdG9QYW5lLCBTb3VyY2VNaXhpblxuICAgICAgc3RvcmU6IHt9LFxuICAgICAgbG9hZENhY2hlOiB7fSAvLyBTZWUgVHlwZU1peGluLmxvYWQoKVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgLy8gT3ZlcnJpZGUgRGl0b01peGluJ3Mgcm91dGVDb21wb25lbnQoKSB3aGljaCB1c2VzIHRoZSBpbmplY3RlZCB2YWx1ZS5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHJvdXRlTGV2ZWwoKSB7XG4gICAgICBsZXQgbGV2ZWwgPSAwXG4gICAgICBsZXQgcm91dGVDb21wb25lbnQgPSB0aGlzXG4gICAgICB3aGlsZSAoKHJvdXRlQ29tcG9uZW50ID0gcm91dGVDb21wb25lbnQucGFyZW50Um91dGVDb21wb25lbnQpKSB7XG4gICAgICAgIGxldmVsKytcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZXZlbFxuICAgIH0sXG5cbiAgICByb3V0ZVJlY29yZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5tYXRjaGVkW3RoaXMucm91dGVMZXZlbF1cbiAgICB9LFxuXG4gICAgaXNMYXN0Um91dGUoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIHJvdXRlciBjb21wb25lbnQgaXMgdGhlIGxhc3Qgb25lIGluIHRoZSByb3V0ZS5cbiAgICAgIGNvbnN0IHsgbWF0Y2hlZCB9ID0gdGhpcy4kcm91dGVcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlUmVjb3JkID09PSBtYXRjaGVkW21hdGNoZWQubGVuZ3RoIC0gMV1cbiAgICB9LFxuXG4gICAgaXNMYXN0VW5uZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGNvbXBvbmVudCBpcyB0aGUgbGFzdCBvbmUgaW4gdGhlIHJvdXRlIHRoYXRcbiAgICAgIC8vIG5lZWRzIGl0cyBvd24gcm91dGVyLXZpZXcgKD0gaXMgbm90IG5lc3RlZCkuXG4gICAgICBjb25zdCB7IG1hdGNoZWQgfSA9IHRoaXMuJHJvdXRlXG4gICAgICBmb3IgKGxldCBpID0gbWF0Y2hlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBtYXRjaGVkW2ldXG4gICAgICAgIGlmICghcmVjb3JkLm1ldGEubmVzdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQgPT09IHJlY29yZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNOZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGEubmVzdGVkXG4gICAgfSxcblxuICAgIGlzVmlldygpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBtZXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQ/Lm1ldGFcbiAgICB9LFxuXG4gICAgcGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJvdXRlUGF0aCh0aGlzLnJvdXRlUmVjb3JkPy5wYXRoKVxuICAgIH0sXG5cbiAgICBsYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldExhYmVsKHRoaXMuc2NoZW1hKVxuICAgIH0sXG5cbiAgICBicmVhZGNydW1iKCkge1xuICAgICAgY29uc3QgeyBicmVhZGNydW1iIH0gPSB0aGlzLnNjaGVtYSB8fCB7fVxuICAgICAgcmV0dXJuIGJyZWFkY3J1bWIgfHwgYCR7dGhpcy5icmVhZGNydW1iUHJlZml4fSAke3RoaXMubGFiZWx9YFxuICAgIH0sXG5cbiAgICBicmVhZGNydW1iUHJlZml4KCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfSxcblxuICAgIHBhcmFtKCkge1xuICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgdnVlLXJvdXRlciBub3QgYmVpbmcgYWJsZSB0byBtYXAgbXVsdGlwbGUgdXJsIHBhcmFtZXRlcnNcbiAgICAgIC8vIHdpdGggdGhlIHNhbWUgbmFtZSB0byBtdWx0aXBsZSBjb21wb25lbnRzLCBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMTM0NVxuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnBhcmFtc1t0aGlzLm1ldGE/LnBhcmFtXSB8fCBudWxsXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZSwgc2VlIERpdG9Gb3JtXG4gICAgaXNNdXRhdGluZygpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBiZWZvcmVSb3V0ZVVwZGF0ZSh0bywgZnJvbSkge1xuICAgIHJldHVybiB0aGlzPy5iZWZvcmVSb3V0ZUNoYW5nZSh0bywgZnJvbSlcbiAgfSxcblxuICBiZWZvcmVSb3V0ZUxlYXZlKHRvLCBmcm9tKSB7XG4gICAgcmV0dXJuIHRoaXM/LmJlZm9yZVJvdXRlQ2hhbmdlKHRvLCBmcm9tKVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgLy8gS2VlcCBhIHNoYXJlZCBzdGFjayBvZiByb290IGNvbXBvbmVudHMgZm9yIERpdG9UcmFpbCB0byB1c2UgdG8gcmVuZGVyXG4gICAgLy8gbGFiZWxzLiBDYW4ndCByZWx5IG9uICRyb3V0ZS5tYXRjaGVkW2ldLmluc3RhbmNlcy5kZWZhdWx0IHVuZm9ydHVuYXRlbHksXG4gICAgLy8gYXMgaW5zdGFuY2VzIGFyZW4ndCBpbW1lZGlhdGVseSByZWFkeSwgYW5kIGluc3RhbmNlcyBpcyBub3QgcmVhY3RpdmUuXG4gICAgdGhpcy5hcHBTdGF0ZS5yb3V0ZUNvbXBvbmVudHMucHVzaCh0aGlzKVxuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICBjb25zdCB7IHJvdXRlQ29tcG9uZW50cyB9ID0gdGhpcy5hcHBTdGF0ZVxuICAgIHJvdXRlQ29tcG9uZW50cy5zcGxpY2Uocm91dGVDb21wb25lbnRzLmluZGV4T2YodGhpcyksIDEpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGJlZm9yZVJvdXRlQ2hhbmdlKHRvLCBmcm9tKSB7XG4gICAgICBsZXQgb2sgPSB0cnVlXG4gICAgICBjb25zdCBpc0Nsb3NpbmcgPSAoXG4gICAgICAgIC8vIE9ubHkgaGFuZGxlIHRoaXMgcm91dGUgY2hhbmdlIGlmIHRoZSBmb3JtIGlzIGFjdHVhbGx5IG1hcHBlZCB0byB0aGVcbiAgICAgICAgLy8gYGZyb21gIHJvdXRlLCBidXQgaW5jbHVkZSBwYXJlbnQgZm9ybXMgb2YgY2xvc2luZyBuZXN0ZWQgZm9ybXMgYXMgYXNcbiAgICAgICAgLy8gd2VsbCwgYnkgbWF0Y2hpbmcgdGhlIHRoZSBzdGFydCBvZiBmcm9tL3RvIHBhdGggYWdhaW5zdCBgdGhpcy5wYXRoYDpcbiAgICAgICAgZnJvbS5wYXRoLnN0YXJ0c1dpdGgodGhpcy5wYXRoKSAmJlxuICAgICAgICAhdG8ucGF0aC5zdGFydHNXaXRoKHRoaXMucGF0aCkgJiZcbiAgICAgICAgLy8gRXhjbHVkZSBoYXNoIGNoYW5nZXMgb25seSAoPSB0YWIgY2hhbmdlcyk6XG4gICAgICAgIGZyb20ucGF0aCAhPT0gdG8ucGF0aCAmJiAoXG4gICAgICAgICAgdGhpcy5pc0Z1bGxSb3V0ZUNoYW5nZSh0bywgZnJvbSkgfHxcbiAgICAgICAgICAvLyBEZWNpZGUgaWYgd2UncmUgbW92aW5nIHRvd2FyZHMgYSBuZXcgbmVzdGVkIGZvcm0sIG9yIGNsb3NpbmcgL1xuICAgICAgICAgIC8vIHJlcGxhY2luZyBhbiBhbHJlYWR5IG9wZW4gb25lIGJ5IGNvbXBhcmluZyBwYXRoIGxlbmd0aHMuXG4gICAgICAgICAgLy8gVGhlIGNhc2Ugb2YgYD1gIG1hdGNoZXMgdGhlIHJlcGxhY2luZyBvZiBhbiBhbHJlYWR5IG9wZW4gb25lLlxuICAgICAgICAgIHRvLnBhdGgubGVuZ3RoIDw9IGZyb20ucGF0aC5sZW5ndGhcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgaWYgKGlzQ2xvc2luZykge1xuICAgICAgICBpZiAodGhpcy5pc011dGF0aW5nKSB7XG4gICAgICAgICAgLy8gRm9yIGFjdGl2ZSBkaXJlY3RseSBtdXRhdGluZyAobmVzdGVkKSBmb3JtcyB0aGF0IHdlcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAgIC8vIHlldCwgdmFsaWRhdGUgdGhlbSBvbmNlLiBJZiB0aGUgdXNlciB0aGVuIHN0aWxsIHdhbnRzIHRvIGxlYXZlXG4gICAgICAgICAgLy8gdGhlbSwgdGhleSBjYW4gY2xpY2sgY2xvc2UgLyBuYXZpZ2F0ZSBhd2F5IGFnYWluLlxuICAgICAgICAgIG9rID0gKFxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkYXRlZCB8fFxuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUFsbCgpXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBmb3JtIGRvZXNuJ3QgZGlyZWN0bHkgbXV0YXRlIGRhdGEuIElmIGl0IGlzIGRpcnR5LCBhc2sgaWYgdXNlclxuICAgICAgICAgIC8vIHdhbnRzIHRvIHBlcnNpc3QgZGF0YSBmaXJzdC5cbiAgICAgICAgICBpZiAodGhpcy5pc0RpcnR5KSB7XG4gICAgICAgICAgICBvayA9IHdpbmRvdy5jb25maXJtKFxuICAgICAgICAgICAgICBgWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBEbyB5b3UgcmVhbGx5IHdhbnQgdG8gJHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcmJzLmNhbmNlbFxuICAgICAgICAgICAgICB9P2BcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBva1xuICAgIH0sXG5cbiAgICBnZXRSb3V0ZVBhdGgocmVjb3JkUGF0aCkge1xuICAgICAgLy8gTWFwcyB0aGUgcm91dGUncyBhY3R1YWwgcGF0aCB0byB0aGUgbWF0Y2hlZCByb3V0ZXMgYnkgY291bnRpbmcgaXRzXG4gICAgICAvLyBwYXJ0cyBzZXBhcmF0ZWQgYnkgJy8nLCBzcGxpdHRpbmcgdGhlIHBhdGggaW50byB0aGUgbWFwcGVkIHBhcnRzXG4gICAgICAvLyBjb250YWluaW5nIGFjdHVhbCBwYXJhbWV0ZXJzLlxuICAgICAgY29uc3QgeyBwYXRoIH0gPSB0aGlzLiRyb3V0ZVxuICAgICAgcmV0dXJuIHJlY29yZFBhdGhcbiAgICAgICAgPyBwYXRoXG4gICAgICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAgICAgLnNsaWNlKDAsIHJlY29yZFBhdGguc3BsaXQoJy8nKS5sZW5ndGgpXG4gICAgICAgICAgICAuam9pbignLycpXG4gICAgICAgIDogcGF0aFxuICAgIH0sXG5cbiAgICBnZXRDaGlsZFBhdGgocGF0aCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMucGF0aH0vJHtwYXRofWBcbiAgICB9LFxuXG4gICAgaXNGdWxsUm91dGVDaGFuZ2UodG8sIGZyb20pIHtcbiAgICAgIC8vIFRoZSByb3V0ZSBwYXRoIGlzIHRoZSBwYXRoIHVwIHRvIHRoZSBmaXJzdCAvIChleGNsdWRpbmcgdGhlIGluaXRpYWwgLyk6XG4gICAgICBjb25zdCByb290UGF0aCA9IHRoaXMucGF0aC5tYXRjaCgvXihcXC9bXi9dKikvKVsxXVxuICAgICAgcmV0dXJuICFnZXRDb21tb25QcmVmaXgodG8ucGF0aCwgZnJvbS5wYXRoKS5zdGFydHNXaXRoKHJvb3RQYXRoKVxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnRlbXBsYXRlKFxuICB2LWlmPVwidXNlciAmJiBzaG91bGRSZW5kZXJTY2hlbWEodmlld1NjaGVtYSlcIlxuKVxuICAvLy0gT25seSByZW5kZXIgRGl0b1ZpZXcgd2hlbiBpdCBpcyBhY3RpdmUsIG90aGVyd2lzZSBhIG5vcm1hbCByb3V0ZXItdmlld1xuICAvLy0gaW5zdGVhZCwgdG8gbmVzdCBmdXJ0aGVyIHJvdXRlIGNvbXBvbmVudHMuXG4gIC8vLSBOT1RFOiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBoYW5kbGluZyBpbiBEaXRvRm9ybSwgd2hlcmUgYHYtc2hvd2AgaXNcbiAgLy8tIHVzZWQgdG8gYWx3YXlzIHJlbmRlciBmb3JtcyBldmVuIHdoZW4gb3RoZXIgbmVzdGVkIGZvcm1zIGFyZSBwcmVzZW50LlxuICBSb3V0ZXJWaWV3KFxuICAgIHYtaWY9XCIhaXNMYXN0Um91dGVcIlxuICAgIDprZXk9XCJuYW1lXCJcbiAgKVxuICAuZGl0by12aWV3LmRpdG8tc2Nyb2xsLXBhcmVudChcbiAgICB2LWVsc2VcbiAgICA6ZGF0YS1yZXNvdXJjZT1cInNvdXJjZVNjaGVtYS5wYXRoXCJcbiAgKVxuICAgIERpdG9TY2hlbWEoXG4gICAgICA6a2V5PVwibmFtZVwiXG4gICAgICA6c2NoZW1hPVwidmlld1NjaGVtYVwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUobmFtZSlcIlxuICAgICAgcGFkZGluZz1cInJvb3RcIlxuICAgICAgOmRpc2FibGVkPVwiaXNMb2FkaW5nXCJcbiAgICAgIHNjcm9sbGFibGVcbiAgICAgIHNpbmdsZVxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFJvdXRlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1JvdXRlTWl4aW4uanMnXG5pbXBvcnQge1xuICBpc1NpbmdsZUNvbXBvbmVudFZpZXcsXG4gIHNvbWVOZXN0ZWRTY2hlbWFDb21wb25lbnRcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgaGFzUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVmlldycsIHtcbiAgbWl4aW5zOiBbUm91dGVNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICAvLyBSZWRpcmVjdCAkc291cmNlQ29tcG9uZW50IGFuZCAkcmVzb3VyY2VDb21wb25lbnQgdG8gdGhlIG1haW4gY29tcG9uZW50OlxuICAgIHJldHVybiB7XG4gICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLm1haW5Db21wb25lbnQ/LnNvdXJjZUNvbXBvbmVudCB8fCBudWxsLFxuICAgICAgJHJlc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLm1haW5Db21wb25lbnQ/LnJlc291cmNlQ29tcG9uZW50IHx8IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gVXBkYXRlZCBmcm9tIExvYWRpbmdNaXhpbiB0aHJvdWdoIGBzZXRMb2FkaW5nKGlzTG9hZGluZylgOlxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIC8vIE5PVEU6IERhdGEgaXMgc2hhcmVkIGFjcm9zcyBhbGwgdmlld3MgYmVjYXVzZSB0aGUgcm91dGVyIHJlY3ljbGVzIHRoZVxuICAgICAgLy8gRGl0b1ZpZXcgY29tcG9uZW50LlxuICAgICAgZGF0YToge31cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzY2hlbWEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhLnNjaGVtYSA/PyB7fVxuICAgIH0sXG5cbiAgICBuYW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLm5hbWVcbiAgICB9LFxuXG4gICAgaXNWaWV3KCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgaXNTaW5nbGVDb21wb25lbnRWaWV3KCkge1xuICAgICAgcmV0dXJuIGlzU2luZ2xlQ29tcG9uZW50Vmlldyh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgbWFpbkNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1haW5TY2hlbWFDb21wb25lbnQ/LmdldENvbXBvbmVudEJ5RGF0YVBhdGgodGhpcy5uYW1lKVxuICAgIH0sXG5cbiAgICB2aWV3U2NoZW1hKCkge1xuICAgICAgY29uc3QgeyBjb21wb25lbnQsIC4uLnNjaGVtYSB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIC8vIFRyYW5zbGF0ZSBzaW5nbGUtY29tcG9uZW50IHNjaGVtYXMgaW50byBtdWx0aS1jb21wb25lbnQgc2NoZW1hcyxcbiAgICAgIC8vIHNvIHRoZXkgY2FuIGJlIHJlbmRlcmVkIGRpcmVjdGx5IHRocm91Z2ggRGl0b1NjaGVtYSBhbHNvOlxuICAgICAgcmV0dXJuIHRoaXMuaXNTaW5nbGVDb21wb25lbnRWaWV3XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uc2NoZW1hLFxuICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICBbc2NoZW1hLm5hbWVdOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogc2NoZW1hLm5hbWUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC4uLmNvbXBvbmVudFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA6IHNjaGVtYVxuICAgIH0sXG5cbiAgICBwcm92aWRlc0RhdGEoKSB7XG4gICAgICByZXR1cm4gc29tZU5lc3RlZFNjaGVtYUNvbXBvbmVudCh0aGlzLnZpZXdTY2hlbWEsIGhhc1Jlc291cmNlKVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgICRyb3V0ZToge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1yb3V0ZXIvaXNzdWVzLzMzOTMjaXNzdWVjb21tZW50LTExNTg0NzAxNDlcbiAgICAgIGZsdXNoOiAncG9zdCcsXG4gICAgICBoYW5kbGVyKHRvLCBmcm9tKSB7XG4gICAgICAgIC8vIFNlZSBpZiB0aGUgcm91dGUgY2hhbmdlcyBjb21wbGV0ZWx5LCBhbmQgY2xlYXIgdGhlIGRhdGEgaWYgaXQgZG9lcy5cbiAgICAgICAgaWYgKHRoaXMuaXNGdWxsUm91dGVDaGFuZ2UodG8sIGZyb20pKSB7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuZGF0YSA9IHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICAvLyBQcmV2ZW50IGJ5cGFzc2luZyBvZiBpZi1jb25kaXRpb24gYnkgZGlyZWN0IFVSTCBhY2Nlc3MuXG4gICAgaWYgKCF0aGlzLnNob3VsZFJlbmRlclNjaGVtYSh0aGlzLnZpZXdTY2hlbWEpKSB7XG4gICAgICB0aGlzLiRyb3V0ZXIucmVwbGFjZSh7IHBhdGg6ICcvJyB9KVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICB0aGlzLmRhdGEgPSBkYXRhXG4gICAgfSxcblxuICAgIGdldENoaWxkUGF0aChwYXRoKSB7XG4gICAgICAvLyBMaXN0cyBpbnNpZGUgc2luZ2xlLWNvbXBvbmVudCB2aWV3cyB1c2UgdGhlIHZpZXcncyBwYXRoIGZvciBzdWItcGF0aHM6XG4gICAgICByZXR1cm4gdGhpcy5pc1NpbmdsZUNvbXBvbmVudFZpZXdcbiAgICAgICAgPyB0aGlzLnBhdGhcbiAgICAgICAgOiBgJHt0aGlzLnBhdGh9LyR7cGF0aH1gXG4gICAgfSxcblxuICAgIHNldExvYWRpbmcoaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9ICEhaXNMb2FkaW5nXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgeyBjb21wdXRlZCwgY3VzdG9tUmVmLCBlZmZlY3RTY29wZSwgZ2V0Q3VycmVudEluc3RhbmNlLCBnZXRDdXJyZW50U2NvcGUsIGhhc0luamVjdGlvbkNvbnRleHQsIGluamVjdCwgaXNSZWFjdGl2ZSwgaXNSZWYsIG5leHRUaWNrLCBvbkJlZm9yZU1vdW50LCBvbkJlZm9yZVVubW91bnQsIG9uTW91bnRlZCwgb25TY29wZURpc3Bvc2UsIG9uVW5tb3VudGVkLCBwcm92aWRlLCByZWFjdGl2ZSwgcmVhZG9ubHksIHJlZiwgc2hhbGxvd1JlYWRvbmx5LCBzaGFsbG93UmVmLCB0b1JlZiBhcyB0b1JlZiQxLCB0b1JlZnMgYXMgdG9SZWZzJDEsIHRvVmFsdWUsIHVucmVmLCB3YXRjaCwgd2F0Y2hFZmZlY3QgfSBmcm9tIFwidnVlXCI7XG5cbi8vI3JlZ2lvbiBjb21wdXRlZEVhZ2VyL2luZGV4LnRzXG4vKipcbipcbiogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb24uXG4qXG4qIE5vdGU6IElmIHlvdSBhcmUgdXNpbmcgVnVlIDMuNCssIHlvdSBjYW4gc3RyYWlnaHQgdXNlIGNvbXB1dGVkIGluc3RlYWQuXG4qIEJlY2F1c2UgaW4gVnVlIDMuNCssIGlmIGNvbXB1dGVkIG5ldyB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UsXG4qIGNvbXB1dGVkLCBlZmZlY3QsIHdhdGNoLCB3YXRjaEVmZmVjdCwgcmVuZGVyIGRlcGVuZGVuY2llcyB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQuXG4qIHJlZmVyOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvY29yZS9wdWxsLzU5MTJcbipcbiogQHBhcmFtIGZuIGVmZmVjdCBmdW5jdGlvblxuKiBAcGFyYW0gb3B0aW9ucyBXYXRjaE9wdGlvbnNCYXNlXG4qIEByZXR1cm5zIHJlYWRvbmx5IHNoYWxsb3dSZWZcbiovXG5mdW5jdGlvbiBjb21wdXRlZEVhZ2VyKGZuLCBvcHRpb25zKSB7XG5cdHZhciBfb3B0aW9ucyRmbHVzaDtcblx0Y29uc3QgcmVzdWx0ID0gc2hhbGxvd1JlZigpO1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0cmVzdWx0LnZhbHVlID0gZm4oKTtcblx0fSwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0Zmx1c2g6IChfb3B0aW9ucyRmbHVzaCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5mbHVzaCkgIT09IG51bGwgJiYgX29wdGlvbnMkZmx1c2ggIT09IHZvaWQgMCA/IF9vcHRpb25zJGZsdXNoIDogXCJzeW5jXCJcblx0fSk7XG5cdHJldHVybiByZWFkb25seShyZXN1bHQpO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgY29tcHV0ZWRFYWdlcmAgaW5zdGVhZCAqL1xuY29uc3QgZWFnZXJDb21wdXRlZCA9IGNvbXB1dGVkRWFnZXI7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGNvbXB1dGVkV2l0aENvbnRyb2wvaW5kZXgudHNcbi8qKlxuKiBFeHBsaWNpdGx5IGRlZmluZSB0aGUgZGVwcyBvZiBjb21wdXRlZC5cbipcbiogQHBhcmFtIHNvdXJjZVxuKiBAcGFyYW0gZm5cbiovXG5mdW5jdGlvbiBjb21wdXRlZFdpdGhDb250cm9sKHNvdXJjZSwgZm4sIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgdiA9IHZvaWQgMDtcblx0bGV0IHRyYWNrO1xuXHRsZXQgdHJpZ2dlcjtcblx0bGV0IGRpcnR5ID0gdHJ1ZTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4ge1xuXHRcdGRpcnR5ID0gdHJ1ZTtcblx0XHR0cmlnZ2VyKCk7XG5cdH07XG5cdHdhdGNoKHNvdXJjZSwgdXBkYXRlLCB7XG5cdFx0Zmx1c2g6IFwic3luY1wiLFxuXHRcdC4uLm9wdGlvbnNcblx0fSk7XG5cdGNvbnN0IGdldCQxID0gdHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIgPyBmbiA6IGZuLmdldDtcblx0Y29uc3Qgc2V0JDEgPSB0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIiA/IHZvaWQgMCA6IGZuLnNldDtcblx0Y29uc3QgcmVzdWx0ID0gY3VzdG9tUmVmKChfdHJhY2ssIF90cmlnZ2VyKSA9PiB7XG5cdFx0dHJhY2sgPSBfdHJhY2s7XG5cdFx0dHJpZ2dlciA9IF90cmlnZ2VyO1xuXHRcdHJldHVybiB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdGlmIChkaXJ0eSkge1xuXHRcdFx0XHRcdHYgPSBnZXQkMSh2KTtcblx0XHRcdFx0XHRkaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRyYWNrKCk7XG5cdFx0XHRcdHJldHVybiB2O1xuXHRcdFx0fSxcblx0XHRcdHNldCh2JDEpIHtcblx0XHRcdFx0c2V0JDEgPT09IG51bGwgfHwgc2V0JDEgPT09IHZvaWQgMCB8fCBzZXQkMSh2JDEpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xuXHRyZXN1bHQudHJpZ2dlciA9IHVwZGF0ZTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYGNvbXB1dGVkV2l0aENvbnRyb2xgIGluc3RlYWQgKi9cbmNvbnN0IGNvbnRyb2xsZWRDb21wdXRlZCA9IGNvbXB1dGVkV2l0aENvbnRyb2w7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHRyeU9uU2NvcGVEaXNwb3NlL2luZGV4LnRzXG4vKipcbiogQ2FsbCBvblNjb3BlRGlzcG9zZSgpIGlmIGl0J3MgaW5zaWRlIGFuIGVmZmVjdCBzY29wZSBsaWZlY3ljbGUsIGlmIG5vdCwgZG8gbm90aGluZ1xuKlxuKiBAcGFyYW0gZm5cbiovXG5mdW5jdGlvbiB0cnlPblNjb3BlRGlzcG9zZShmbiwgZmFpbFNpbGVudGx5KSB7XG5cdGlmIChnZXRDdXJyZW50U2NvcGUoKSkge1xuXHRcdG9uU2NvcGVEaXNwb3NlKGZuLCBmYWlsU2lsZW50bHkpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlRXZlbnRIb29rL2luZGV4LnRzXG4vKipcbiogVXRpbGl0eSBmb3IgY3JlYXRpbmcgZXZlbnQgaG9va3NcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlRXZlbnRIb29rXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gY3JlYXRlRXZlbnRIb29rKCkge1xuXHRjb25zdCBmbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRjb25zdCBvZmYgPSAoZm4pID0+IHtcblx0XHRmbnMuZGVsZXRlKGZuKTtcblx0fTtcblx0Y29uc3QgY2xlYXIgPSAoKSA9PiB7XG5cdFx0Zm5zLmNsZWFyKCk7XG5cdH07XG5cdGNvbnN0IG9uID0gKGZuKSA9PiB7XG5cdFx0Zm5zLmFkZChmbik7XG5cdFx0Y29uc3Qgb2ZmRm4gPSAoKSA9PiBvZmYoZm4pO1xuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKG9mZkZuKTtcblx0XHRyZXR1cm4geyBvZmY6IG9mZkZuIH07XG5cdH07XG5cdGNvbnN0IHRyaWdnZXIgPSAoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChBcnJheS5mcm9tKGZucykubWFwKChmbikgPT4gZm4oLi4uYXJncykpKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRvbixcblx0XHRvZmYsXG5cdFx0dHJpZ2dlcixcblx0XHRjbGVhclxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVHbG9iYWxTdGF0ZS9pbmRleC50c1xuLyoqXG4qIEtlZXAgc3RhdGVzIGluIHRoZSBnbG9iYWwgc2NvcGUgdG8gYmUgcmV1c2FibGUgYWNyb3NzIFZ1ZSBpbnN0YW5jZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZUdsb2JhbFN0YXRlXG4qIEBwYXJhbSBzdGF0ZUZhY3RvcnkgQSBmYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgc3RhdGVcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxTdGF0ZShzdGF0ZUZhY3RvcnkpIHtcblx0bGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5cdGxldCBzdGF0ZTtcblx0Y29uc3Qgc2NvcGUgPSBlZmZlY3RTY29wZSh0cnVlKTtcblx0cmV0dXJuICgoLi4uYXJncykgPT4ge1xuXHRcdGlmICghaW5pdGlhbGl6ZWQpIHtcblx0XHRcdHN0YXRlID0gc2NvcGUucnVuKCgpID0+IHN0YXRlRmFjdG9yeSguLi5hcmdzKSk7XG5cdFx0XHRpbml0aWFsaXplZCA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBzdGF0ZTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHByb3ZpZGVMb2NhbC9tYXAudHNcbmNvbnN0IGxvY2FsUHJvdmlkZWRTdGF0ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBpbmplY3RMb2NhbC9pbmRleC50c1xuLyoqXG4qIE9uIHRoZSBiYXNpcyBvZiBgaW5qZWN0YCwgaXQgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBjYWxsIGluamVjdCB0byBvYnRhaW4gdGhlIHZhbHVlIGFmdGVyIGNhbGwgcHJvdmlkZSBpbiB0aGUgc2FtZSBjb21wb25lbnQuXG4qXG4qIEBleGFtcGxlXG4qIGBgYHRzXG4qIGluamVjdExvY2FsKCdNeUluamVjdGlvbktleScsIDEpXG4qIGNvbnN0IGluamVjdGVkVmFsdWUgPSBpbmplY3RMb2NhbCgnTXlJbmplY3Rpb25LZXknKSAvLyBpbmplY3RlZFZhbHVlID09PSAxXG4qIGBgYFxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmNvbnN0IGluamVjdExvY2FsID0gKC4uLmFyZ3MpID0+IHtcblx0dmFyIF9nZXRDdXJyZW50SW5zdGFuY2U7XG5cdGNvbnN0IGtleSA9IGFyZ3NbMF07XG5cdGNvbnN0IGluc3RhbmNlID0gKF9nZXRDdXJyZW50SW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKSkgPT09IG51bGwgfHwgX2dldEN1cnJlbnRJbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dldEN1cnJlbnRJbnN0YW5jZS5wcm94eTtcblx0Y29uc3Qgb3duZXIgPSBpbnN0YW5jZSAhPT0gbnVsbCAmJiBpbnN0YW5jZSAhPT0gdm9pZCAwID8gaW5zdGFuY2UgOiBnZXRDdXJyZW50U2NvcGUoKTtcblx0aWYgKG93bmVyID09IG51bGwgJiYgIWhhc0luamVjdGlvbkNvbnRleHQoKSkgdGhyb3cgbmV3IEVycm9yKFwiaW5qZWN0TG9jYWwgbXVzdCBiZSBjYWxsZWQgaW4gc2V0dXBcIik7XG5cdGlmIChvd25lciAmJiBsb2NhbFByb3ZpZGVkU3RhdGVNYXAuaGFzKG93bmVyKSAmJiBrZXkgaW4gbG9jYWxQcm92aWRlZFN0YXRlTWFwLmdldChvd25lcikpIHJldHVybiBsb2NhbFByb3ZpZGVkU3RhdGVNYXAuZ2V0KG93bmVyKVtrZXldO1xuXHRyZXR1cm4gaW5qZWN0KC4uLmFyZ3MpO1xufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcHJvdmlkZUxvY2FsL2luZGV4LnRzXG4vKipcbiogT24gdGhlIGJhc2lzIG9mIGBwcm92aWRlYCwgaXQgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBjYWxsIGluamVjdCB0byBvYnRhaW4gdGhlIHZhbHVlIGFmdGVyIGNhbGwgcHJvdmlkZSBpbiB0aGUgc2FtZSBjb21wb25lbnQuXG4qXG4qIEBleGFtcGxlXG4qIGBgYHRzXG4qIHByb3ZpZGVMb2NhbCgnTXlJbmplY3Rpb25LZXknLCAxKVxuKiBjb25zdCBpbmplY3RlZFZhbHVlID0gaW5qZWN0TG9jYWwoJ015SW5qZWN0aW9uS2V5JykgLy8gaW5qZWN0ZWRWYWx1ZSA9PT0gMVxuKiBgYGBcbiovXG5mdW5jdGlvbiBwcm92aWRlTG9jYWwoa2V5LCB2YWx1ZSkge1xuXHR2YXIgX2dldEN1cnJlbnRJbnN0YW5jZTtcblx0Y29uc3QgaW5zdGFuY2UgPSAoX2dldEN1cnJlbnRJbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpKSA9PT0gbnVsbCB8fCBfZ2V0Q3VycmVudEluc3RhbmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZ2V0Q3VycmVudEluc3RhbmNlLnByb3h5O1xuXHRjb25zdCBvd25lciA9IGluc3RhbmNlICE9PSBudWxsICYmIGluc3RhbmNlICE9PSB2b2lkIDAgPyBpbnN0YW5jZSA6IGdldEN1cnJlbnRTY29wZSgpO1xuXHRpZiAob3duZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwicHJvdmlkZUxvY2FsIG11c3QgYmUgY2FsbGVkIGluIHNldHVwXCIpO1xuXHRpZiAoIWxvY2FsUHJvdmlkZWRTdGF0ZU1hcC5oYXMob3duZXIpKSBsb2NhbFByb3ZpZGVkU3RhdGVNYXAuc2V0KG93bmVyLCBPYmplY3QuY3JlYXRlKG51bGwpKTtcblx0Y29uc3QgbG9jYWxQcm92aWRlZFN0YXRlID0gbG9jYWxQcm92aWRlZFN0YXRlTWFwLmdldChvd25lcik7XG5cdGxvY2FsUHJvdmlkZWRTdGF0ZVtrZXldID0gdmFsdWU7XG5cdHJldHVybiBwcm92aWRlKGtleSwgdmFsdWUpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVJbmplY3Rpb25TdGF0ZS9pbmRleC50c1xuLyoqXG4qIENyZWF0ZSBnbG9iYWwgc3RhdGUgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgaW50byBjb21wb25lbnRzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9jcmVhdGVJbmplY3Rpb25TdGF0ZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZUluamVjdGlvblN0YXRlKGNvbXBvc2FibGUsIG9wdGlvbnMpIHtcblx0Y29uc3Qga2V5ID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbmplY3Rpb25LZXkpIHx8IFN5bWJvbChjb21wb3NhYmxlLm5hbWUgfHwgXCJJbmplY3Rpb25TdGF0ZVwiKTtcblx0Y29uc3QgZGVmYXVsdFZhbHVlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcblx0Y29uc3QgdXNlUHJvdmlkaW5nU3RhdGUgPSAoLi4uYXJncykgPT4ge1xuXHRcdGNvbnN0IHN0YXRlID0gY29tcG9zYWJsZSguLi5hcmdzKTtcblx0XHRwcm92aWRlTG9jYWwoa2V5LCBzdGF0ZSk7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9O1xuXHRjb25zdCB1c2VJbmplY3RlZFN0YXRlID0gKCkgPT4gaW5qZWN0TG9jYWwoa2V5LCBkZWZhdWx0VmFsdWUpO1xuXHRyZXR1cm4gW3VzZVByb3ZpZGluZ1N0YXRlLCB1c2VJbmplY3RlZFN0YXRlXTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlUmVmL2luZGV4LnRzXG4vKipcbiogUmV0dXJucyBhIGBkZWVwUmVmYCBvciBgc2hhbGxvd1JlZmAgZGVwZW5kaW5nIG9uIHRoZSBgZGVlcGAgcGFyYW0uXG4qXG4qIEBleGFtcGxlIGNyZWF0ZVJlZigxKSAvLyBTaGFsbG93UmVmPG51bWJlcj5cbiogQGV4YW1wbGUgY3JlYXRlUmVmKDEsIGZhbHNlKSAvLyBTaGFsbG93UmVmPG51bWJlcj5cbiogQGV4YW1wbGUgY3JlYXRlUmVmKDEsIHRydWUpIC8vIFJlZjxudW1iZXI+XG4qIEBleGFtcGxlIGNyZWF0ZVJlZihcInN0cmluZ1wiKSAvLyBTaGFsbG93UmVmPHN0cmluZz5cbiogQGV4YW1wbGUgY3JlYXRlUmVmPFwiQVwifFwiQlwiPihcIkFcIiwgdHJ1ZSkgLy8gUmVmPFwiQVwifFwiQlwiPlxuKlxuKiBAcGFyYW0gdmFsdWVcbiogQHBhcmFtIGRlZXBcbiogQHJldHVybnMgdGhlIGBkZWVwUmVmYCBvciBgc2hhbGxvd1JlZmBcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVSZWYodmFsdWUsIGRlZXApIHtcblx0aWYgKGRlZXAgPT09IHRydWUpIHJldHVybiByZWYodmFsdWUpO1xuXHRlbHNlIHJldHVybiBzaGFsbG93UmVmKHZhbHVlKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXRpbHMvaXMudHNcbmNvbnN0IGlzQ2xpZW50ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCI7XG5jb25zdCBpc1dvcmtlciA9IHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWxUaGlzIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7XG5jb25zdCBpc0RlZiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgIT09IFwidW5kZWZpbmVkXCI7XG5jb25zdCBub3ROdWxsaXNoID0gKHZhbCkgPT4gdmFsICE9IG51bGw7XG5jb25zdCBhc3NlcnQgPSAoY29uZGl0aW9uLCAuLi5pbmZvcykgPT4ge1xuXHRpZiAoIWNvbmRpdGlvbikgY29uc29sZS53YXJuKC4uLmluZm9zKTtcbn07XG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCBpc09iamVjdCA9ICh2YWwpID0+IHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbmNvbnN0IG5vdyA9ICgpID0+IERhdGUubm93KCk7XG5jb25zdCB0aW1lc3RhbXAgPSAoKSA9PiArRGF0ZS5ub3coKTtcbmNvbnN0IGNsYW1wID0gKG4sIG1pbiwgbWF4KSA9PiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuY29uc3QgcmFuZCA9IChtaW4sIG1heCkgPT4ge1xuXHRtaW4gPSBNYXRoLmNlaWwobWluKTtcblx0bWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuXHRyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcbn07XG5jb25zdCBoYXNPd24gPSAodmFsLCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGtleSk7XG5jb25zdCBpc0lPUyA9IC8qIEBfX1BVUkVfXyAqLyBnZXRJc0lPUygpO1xuZnVuY3Rpb24gZ2V0SXNJT1MoKSB7XG5cdHZhciBfd2luZG93LCBfd2luZG93MiwgX3dpbmRvdzM7XG5cdHJldHVybiBpc0NsaWVudCAmJiAhISgoX3dpbmRvdyA9IHdpbmRvdykgPT09IG51bGwgfHwgX3dpbmRvdyA9PT0gdm9pZCAwIHx8IChfd2luZG93ID0gX3dpbmRvdy5uYXZpZ2F0b3IpID09PSBudWxsIHx8IF93aW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3cudXNlckFnZW50KSAmJiAoL2lQKD86YWR8aG9uZXxvZCkvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpIHx8ICgoX3dpbmRvdzIgPSB3aW5kb3cpID09PSBudWxsIHx8IF93aW5kb3cyID09PSB2b2lkIDAgfHwgKF93aW5kb3cyID0gX3dpbmRvdzIubmF2aWdhdG9yKSA9PT0gbnVsbCB8fCBfd2luZG93MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdzIubWF4VG91Y2hQb2ludHMpID4gMiAmJiAvaVBhZHxNYWNpbnRvc2gvLnRlc3QoKF93aW5kb3czID0gd2luZG93KSA9PT0gbnVsbCB8fCBfd2luZG93MyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdzMubmF2aWdhdG9yLnVzZXJBZ2VudCkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0b1JlZi9pbmRleC50c1xuZnVuY3Rpb24gdG9SZWYoLi4uYXJncykge1xuXHRpZiAoYXJncy5sZW5ndGggIT09IDEpIHJldHVybiB0b1JlZiQxKC4uLmFyZ3MpO1xuXHRjb25zdCByID0gYXJnc1swXTtcblx0cmV0dXJuIHR5cGVvZiByID09PSBcImZ1bmN0aW9uXCIgPyByZWFkb25seShjdXN0b21SZWYoKCkgPT4gKHtcblx0XHRnZXQ6IHIsXG5cdFx0c2V0OiBub29wXG5cdH0pKSkgOiByZWYocik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL2ZpbHRlcnMudHNcbi8qKlxuKiBAaW50ZXJuYWxcbiovXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJXcmFwcGVyKGZpbHRlciwgZm4pIHtcblx0ZnVuY3Rpb24gd3JhcHBlciguLi5hcmdzKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFByb21pc2UucmVzb2x2ZShmaWx0ZXIoKCkgPT4gZm4uYXBwbHkodGhpcywgYXJncyksIHtcblx0XHRcdFx0Zm4sXG5cdFx0XHRcdHRoaXNBcmc6IHRoaXMsXG5cdFx0XHRcdGFyZ3Ncblx0XHRcdH0pKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHdyYXBwZXI7XG59XG5jb25zdCBieXBhc3NGaWx0ZXIgPSAoaW52b2tlJDEpID0+IHtcblx0cmV0dXJuIGludm9rZSQxKCk7XG59O1xuLyoqXG4qIENyZWF0ZSBhbiBFdmVudEZpbHRlciB0aGF0IGRlYm91bmNlIHRoZSBldmVudHNcbiovXG5mdW5jdGlvbiBkZWJvdW5jZUZpbHRlcihtcywgb3B0aW9ucyA9IHt9KSB7XG5cdGxldCB0aW1lcjtcblx0bGV0IG1heFRpbWVyO1xuXHRsZXQgbGFzdFJlamVjdG9yID0gbm9vcDtcblx0Y29uc3QgX2NsZWFyVGltZW91dCA9ICh0aW1lciQxKSA9PiB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVyJDEpO1xuXHRcdGxhc3RSZWplY3RvcigpO1xuXHRcdGxhc3RSZWplY3RvciA9IG5vb3A7XG5cdH07XG5cdGxldCBsYXN0SW52b2tlcjtcblx0Y29uc3QgZmlsdGVyID0gKGludm9rZSQxKSA9PiB7XG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0b1ZhbHVlKG1zKTtcblx0XHRjb25zdCBtYXhEdXJhdGlvbiA9IHRvVmFsdWUob3B0aW9ucy5tYXhXYWl0KTtcblx0XHRpZiAodGltZXIpIF9jbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdGlmIChkdXJhdGlvbiA8PSAwIHx8IG1heER1cmF0aW9uICE9PSB2b2lkIDAgJiYgbWF4RHVyYXRpb24gPD0gMCkge1xuXHRcdFx0aWYgKG1heFRpbWVyKSB7XG5cdFx0XHRcdF9jbGVhclRpbWVvdXQobWF4VGltZXIpO1xuXHRcdFx0XHRtYXhUaW1lciA9IHZvaWQgMDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoaW52b2tlJDEoKSk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRsYXN0UmVqZWN0b3IgPSBvcHRpb25zLnJlamVjdE9uQ2FuY2VsID8gcmVqZWN0IDogcmVzb2x2ZTtcblx0XHRcdGxhc3RJbnZva2VyID0gaW52b2tlJDE7XG5cdFx0XHRpZiAobWF4RHVyYXRpb24gJiYgIW1heFRpbWVyKSBtYXhUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAodGltZXIpIF9jbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0XHRtYXhUaW1lciA9IHZvaWQgMDtcblx0XHRcdFx0cmVzb2x2ZShsYXN0SW52b2tlcigpKTtcblx0XHRcdH0sIG1heER1cmF0aW9uKTtcblx0XHRcdHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmIChtYXhUaW1lcikgX2NsZWFyVGltZW91dChtYXhUaW1lcik7XG5cdFx0XHRcdG1heFRpbWVyID0gdm9pZCAwO1xuXHRcdFx0XHRyZXNvbHZlKGludm9rZSQxKCkpO1xuXHRcdFx0fSwgZHVyYXRpb24pO1xuXHRcdH0pO1xuXHR9O1xuXHRyZXR1cm4gZmlsdGVyO1xufVxuZnVuY3Rpb24gdGhyb3R0bGVGaWx0ZXIoLi4uYXJncykge1xuXHRsZXQgbGFzdEV4ZWMgPSAwO1xuXHRsZXQgdGltZXI7XG5cdGxldCBpc0xlYWRpbmcgPSB0cnVlO1xuXHRsZXQgbGFzdFJlamVjdG9yID0gbm9vcDtcblx0bGV0IGxhc3RWYWx1ZTtcblx0bGV0IG1zO1xuXHRsZXQgdHJhaWxpbmc7XG5cdGxldCBsZWFkaW5nO1xuXHRsZXQgcmVqZWN0T25DYW5jZWw7XG5cdGlmICghaXNSZWYoYXJnc1swXSkgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwib2JqZWN0XCIpICh7ZGVsYXk6IG1zLCB0cmFpbGluZyA9IHRydWUsIGxlYWRpbmcgPSB0cnVlLCByZWplY3RPbkNhbmNlbCA9IGZhbHNlfSA9IGFyZ3NbMF0pO1xuXHRlbHNlIFttcywgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSwgcmVqZWN0T25DYW5jZWwgPSBmYWxzZV0gPSBhcmdzO1xuXHRjb25zdCBjbGVhciA9ICgpID0+IHtcblx0XHRpZiAodGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHR0aW1lciA9IHZvaWQgMDtcblx0XHRcdGxhc3RSZWplY3RvcigpO1xuXHRcdFx0bGFzdFJlamVjdG9yID0gbm9vcDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGZpbHRlciA9IChfaW52b2tlKSA9PiB7XG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0b1ZhbHVlKG1zKTtcblx0XHRjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIGxhc3RFeGVjO1xuXHRcdGNvbnN0IGludm9rZSQxID0gKCkgPT4ge1xuXHRcdFx0cmV0dXJuIGxhc3RWYWx1ZSA9IF9pbnZva2UoKTtcblx0XHR9O1xuXHRcdGNsZWFyKCk7XG5cdFx0aWYgKGR1cmF0aW9uIDw9IDApIHtcblx0XHRcdGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcblx0XHRcdHJldHVybiBpbnZva2UkMSgpO1xuXHRcdH1cblx0XHRpZiAoZWxhcHNlZCA+IGR1cmF0aW9uKSB7XG5cdFx0XHRsYXN0RXhlYyA9IERhdGUubm93KCk7XG5cdFx0XHRpZiAobGVhZGluZyB8fCAhaXNMZWFkaW5nKSBpbnZva2UkMSgpO1xuXHRcdH0gZWxzZSBpZiAodHJhaWxpbmcpIGxhc3RWYWx1ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGxhc3RSZWplY3RvciA9IHJlamVjdE9uQ2FuY2VsID8gcmVqZWN0IDogcmVzb2x2ZTtcblx0XHRcdHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcblx0XHRcdFx0aXNMZWFkaW5nID0gdHJ1ZTtcblx0XHRcdFx0cmVzb2x2ZShpbnZva2UkMSgpKTtcblx0XHRcdFx0Y2xlYXIoKTtcblx0XHRcdH0sIE1hdGgubWF4KDAsIGR1cmF0aW9uIC0gZWxhcHNlZCkpO1xuXHRcdH0pO1xuXHRcdGlmICghbGVhZGluZyAmJiAhdGltZXIpIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBpc0xlYWRpbmcgPSB0cnVlLCBkdXJhdGlvbik7XG5cdFx0aXNMZWFkaW5nID0gZmFsc2U7XG5cdFx0cmV0dXJuIGxhc3RWYWx1ZTtcblx0fTtcblx0cmV0dXJuIGZpbHRlcjtcbn1cbi8qKlxuKiBFdmVudEZpbHRlciB0aGF0IGdpdmVzIGV4dHJhIGNvbnRyb2xzIHRvIHBhdXNlIGFuZCByZXN1bWUgdGhlIGZpbHRlclxuKlxuKiBAcGFyYW0gZXh0ZW5kRmlsdGVyICBFeHRyYSBmaWx0ZXIgdG8gYXBwbHkgd2hlbiB0aGUgUGF1c2FibGVGaWx0ZXIgaXMgYWN0aXZlLCBkZWZhdWx0IHRvIG5vbmVcbiogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGZpbHRlclxuKi9cbmZ1bmN0aW9uIHBhdXNhYmxlRmlsdGVyKGV4dGVuZEZpbHRlciA9IGJ5cGFzc0ZpbHRlciwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFN0YXRlID0gXCJhY3RpdmVcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNBY3RpdmUgPSB0b1JlZihpbml0aWFsU3RhdGUgPT09IFwiYWN0aXZlXCIpO1xuXHRmdW5jdGlvbiBwYXVzZSgpIHtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGZ1bmN0aW9uIHJlc3VtZSgpIHtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG5cdH1cblx0Y29uc3QgZXZlbnRGaWx0ZXIgPSAoLi4uYXJncykgPT4ge1xuXHRcdGlmIChpc0FjdGl2ZS52YWx1ZSkgZXh0ZW5kRmlsdGVyKC4uLmFyZ3MpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdGlzQWN0aXZlOiByZWFkb25seShpc0FjdGl2ZSksXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGV2ZW50RmlsdGVyXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL2dlbmVyYWwudHNcbmZ1bmN0aW9uIHByb21pc2VUaW1lb3V0KG1zLCB0aHJvd09uVGltZW91dCA9IGZhbHNlLCByZWFzb24gPSBcIlRpbWVvdXRcIikge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGlmICh0aHJvd09uVGltZW91dCkgc2V0VGltZW91dCgoKSA9PiByZWplY3QocmVhc29uKSwgbXMpO1xuXHRcdGVsc2Ugc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG5cdH0pO1xufVxuZnVuY3Rpb24gaWRlbnRpdHkoYXJnKSB7XG5cdHJldHVybiBhcmc7XG59XG4vKipcbiogQ3JlYXRlIHNpbmdsZXRvbiBwcm9taXNlIGZ1bmN0aW9uXG4qXG4qIEBleGFtcGxlXG4qIGBgYFxuKiBjb25zdCBwcm9taXNlID0gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShhc3luYyAoKSA9PiB7IC4uLiB9KVxuKlxuKiBhd2FpdCBwcm9taXNlKClcbiogYXdhaXQgcHJvbWlzZSgpIC8vIGFsbCBvZiB0aGVtIHdpbGwgYmUgYmluZCB0byBhIHNpbmdsZSBwcm9taXNlIGluc3RhbmNlXG4qIGF3YWl0IHByb21pc2UoKSAvLyBhbmQgYmUgcmVzb2x2ZWQgdG9nZXRoZXJcbiogYGBgXG4qL1xuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShmbikge1xuXHRsZXQgX3Byb21pc2U7XG5cdGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG5cdFx0aWYgKCFfcHJvbWlzZSkgX3Byb21pc2UgPSBmbigpO1xuXHRcdHJldHVybiBfcHJvbWlzZTtcblx0fVxuXHR3cmFwcGVyLnJlc2V0ID0gYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IF9wcmV2ID0gX3Byb21pc2U7XG5cdFx0X3Byb21pc2UgPSB2b2lkIDA7XG5cdFx0aWYgKF9wcmV2KSBhd2FpdCBfcHJldjtcblx0fTtcblx0cmV0dXJuIHdyYXBwZXI7XG59XG5mdW5jdGlvbiBpbnZva2UoZm4pIHtcblx0cmV0dXJuIGZuKCk7XG59XG5mdW5jdGlvbiBjb250YWluc1Byb3Aob2JqLCAuLi5wcm9wcykge1xuXHRyZXR1cm4gcHJvcHMuc29tZSgoaykgPT4gayBpbiBvYmopO1xufVxuZnVuY3Rpb24gaW5jcmVhc2VXaXRoVW5pdCh0YXJnZXQsIGRlbHRhKSB7XG5cdHZhciBfdGFyZ2V0JG1hdGNoO1xuXHRpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHRhcmdldCArIGRlbHRhO1xuXHRjb25zdCB2YWx1ZSA9ICgoX3RhcmdldCRtYXRjaCA9IHRhcmdldC5tYXRjaCgvXi0/XFxkK1xcLj9cXGQqLykpID09PSBudWxsIHx8IF90YXJnZXQkbWF0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YXJnZXQkbWF0Y2hbMF0pIHx8IFwiXCI7XG5cdGNvbnN0IHVuaXQgPSB0YXJnZXQuc2xpY2UodmFsdWUubGVuZ3RoKTtcblx0Y29uc3QgcmVzdWx0ID0gTnVtYmVyLnBhcnNlRmxvYXQodmFsdWUpICsgZGVsdGE7XG5cdGlmIChOdW1iZXIuaXNOYU4ocmVzdWx0KSkgcmV0dXJuIHRhcmdldDtcblx0cmV0dXJuIHJlc3VsdCArIHVuaXQ7XG59XG4vKipcbiogR2V0IGEgcHggdmFsdWUgZm9yIFNTUiB1c2UsIGRvIG5vdCByZWx5IG9uIHRoaXMgbWV0aG9kIG91dHNpZGUgb2YgU1NSIGFzIFJFTSB1bml0IGlzIGFzc3VtZWQgYXQgMTZweCwgd2hpY2ggbWlnaHQgbm90IGJlIHRoZSBjYXNlIG9uIHRoZSBjbGllbnRcbiovXG5mdW5jdGlvbiBweFZhbHVlKHB4KSB7XG5cdHJldHVybiBweC5lbmRzV2l0aChcInJlbVwiKSA/IE51bWJlci5wYXJzZUZsb2F0KHB4KSAqIDE2IDogTnVtYmVyLnBhcnNlRmxvYXQocHgpO1xufVxuLyoqXG4qIENyZWF0ZSBhIG5ldyBzdWJzZXQgb2JqZWN0IGJ5IGdpdmluZyBrZXlzXG4qL1xuZnVuY3Rpb24gb2JqZWN0UGljayhvYmosIGtleXMsIG9taXRVbmRlZmluZWQgPSBmYWxzZSkge1xuXHRyZXR1cm4ga2V5cy5yZWR1Y2UoKG4sIGspID0+IHtcblx0XHRpZiAoayBpbiBvYmopIHtcblx0XHRcdGlmICghb21pdFVuZGVmaW5lZCB8fCBvYmpba10gIT09IHZvaWQgMCkgbltrXSA9IG9ialtrXTtcblx0XHR9XG5cdFx0cmV0dXJuIG47XG5cdH0sIHt9KTtcbn1cbi8qKlxuKiBDcmVhdGUgYSBuZXcgc3Vic2V0IG9iamVjdCBieSBvbWl0IGdpdmluZyBrZXlzXG4qL1xuZnVuY3Rpb24gb2JqZWN0T21pdChvYmosIGtleXMsIG9taXRVbmRlZmluZWQgPSBmYWxzZSkge1xuXHRyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHtcblx0XHRyZXR1cm4gKCFvbWl0VW5kZWZpbmVkIHx8IHZhbHVlICE9PSB2b2lkIDApICYmICFrZXlzLmluY2x1ZGVzKGtleSk7XG5cdH0pKTtcbn1cbmZ1bmN0aW9uIG9iamVjdEVudHJpZXMob2JqKSB7XG5cdHJldHVybiBPYmplY3QuZW50cmllcyhvYmopO1xufVxuZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL3BvcnQudHNcbmZ1bmN0aW9uIGNhY2hlU3RyaW5nRnVuY3Rpb24oZm4pIHtcblx0Y29uc3QgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHRyZXR1cm4gKChzdHIpID0+IHtcblx0XHRyZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpO1xuXHR9KTtcbn1cbmNvbnN0IGh5cGhlbmF0ZVJFID0gL1xcQihbQS1aXSkvZztcbmNvbnN0IGh5cGhlbmF0ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsIFwiLSQxXCIpLnRvTG93ZXJDYXNlKCkpO1xuY29uc3QgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbmNvbnN0IGNhbWVsaXplID0gY2FjaGVTdHJpbmdGdW5jdGlvbigoc3RyKSA9PiB7XG5cdHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCAoXywgYykgPT4gYyA/IGMudG9VcHBlckNhc2UoKSA6IFwiXCIpO1xufSk7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL3Z1ZS50c1xuZnVuY3Rpb24gZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCkge1xuXHRyZXR1cm4gdGFyZ2V0IHx8IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVTaGFyZWRDb21wb3NhYmxlL2luZGV4LnRzXG4vKipcbiogTWFrZSBhIGNvbXBvc2FibGUgZnVuY3Rpb24gdXNhYmxlIHdpdGggbXVsdGlwbGUgVnVlIGluc3RhbmNlcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlU2hhcmVkQ29tcG9zYWJsZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVNoYXJlZENvbXBvc2FibGUoY29tcG9zYWJsZSkge1xuXHRpZiAoIWlzQ2xpZW50KSByZXR1cm4gY29tcG9zYWJsZTtcblx0bGV0IHN1YnNjcmliZXJzID0gMDtcblx0bGV0IHN0YXRlO1xuXHRsZXQgc2NvcGU7XG5cdGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XG5cdFx0c3Vic2NyaWJlcnMgLT0gMTtcblx0XHRpZiAoc2NvcGUgJiYgc3Vic2NyaWJlcnMgPD0gMCkge1xuXHRcdFx0c2NvcGUuc3RvcCgpO1xuXHRcdFx0c3RhdGUgPSB2b2lkIDA7XG5cdFx0XHRzY29wZSA9IHZvaWQgMDtcblx0XHR9XG5cdH07XG5cdHJldHVybiAoKC4uLmFyZ3MpID0+IHtcblx0XHRzdWJzY3JpYmVycyArPSAxO1xuXHRcdGlmICghc2NvcGUpIHtcblx0XHRcdHNjb3BlID0gZWZmZWN0U2NvcGUodHJ1ZSk7XG5cdFx0XHRzdGF0ZSA9IHNjb3BlLnJ1bigoKSA9PiBjb21wb3NhYmxlKC4uLmFyZ3MpKTtcblx0XHR9XG5cdFx0dHJ5T25TY29wZURpc3Bvc2UoZGlzcG9zZSk7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gZXh0ZW5kUmVmL2luZGV4LnRzXG5mdW5jdGlvbiBleHRlbmRSZWYocmVmJDEsIGV4dGVuZCwgeyBlbnVtZXJhYmxlID0gZmFsc2UsIHVud3JhcCA9IHRydWUgfSA9IHt9KSB7XG5cdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4dGVuZCkpIHtcblx0XHRpZiAoa2V5ID09PSBcInZhbHVlXCIpIGNvbnRpbnVlO1xuXHRcdGlmIChpc1JlZih2YWx1ZSkgJiYgdW53cmFwKSBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVmJDEsIGtleSwge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUudmFsdWU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0KHYpIHtcblx0XHRcdFx0dmFsdWUudmFsdWUgPSB2O1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGVcblx0XHR9KTtcblx0XHRlbHNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWYkMSwga2V5LCB7XG5cdFx0XHR2YWx1ZSxcblx0XHRcdGVudW1lcmFibGVcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gcmVmJDE7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGdldC9pbmRleC50c1xuZnVuY3Rpb24gZ2V0KG9iaiwga2V5KSB7XG5cdGlmIChrZXkgPT0gbnVsbCkgcmV0dXJuIHVucmVmKG9iaik7XG5cdHJldHVybiB1bnJlZihvYmopW2tleV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGlzRGVmaW5lZC9pbmRleC50c1xuZnVuY3Rpb24gaXNEZWZpbmVkKHYpIHtcblx0cmV0dXJuIHVucmVmKHYpICE9IG51bGw7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIG1ha2VEZXN0cnVjdHVyYWJsZS9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIG1ha2VEZXN0cnVjdHVyYWJsZShvYmosIGFycikge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdGNvbnN0IGNsb25lID0geyAuLi5vYmogfTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xvbmUsIFN5bWJvbC5pdGVyYXRvciwge1xuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHR2YWx1ZSgpIHtcblx0XHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdFx0cmV0dXJuIHsgbmV4dDogKCkgPT4gKHtcblx0XHRcdFx0XHR2YWx1ZTogYXJyW2luZGV4KytdLFxuXHRcdFx0XHRcdGRvbmU6IGluZGV4ID4gYXJyLmxlbmd0aFxuXHRcdFx0XHR9KSB9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBjbG9uZTtcblx0fSBlbHNlIHJldHVybiBPYmplY3QuYXNzaWduKFsuLi5hcnJdLCBvYmopO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGlmeS9pbmRleC50c1xuLyoqXG4qIENvbnZlcnRzIHBsYWluIGZ1bmN0aW9uIGludG8gYSByZWFjdGl2ZSBmdW5jdGlvbi5cbiogVGhlIGNvbnZlcnRlZCBmdW5jdGlvbiBhY2NlcHRzIHJlZnMgYXMgaXQncyBhcmd1bWVudHNcbiogYW5kIHJldHVybnMgYSBDb21wdXRlZFJlZiwgd2l0aCBwcm9wZXIgdHlwaW5nLlxuKlxuKiBAcGFyYW0gZm4gLSBTb3VyY2UgZnVuY3Rpb25cbiogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVhY3RpZnkoZm4sIG9wdGlvbnMpIHtcblx0Y29uc3QgdW5yZWZGbiA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY29tcHV0ZWRHZXR0ZXIpID09PSBmYWxzZSA/IHVucmVmIDogdG9WYWx1ZTtcblx0cmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0XHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gZm4uYXBwbHkodGhpcywgYXJncy5tYXAoKGkpID0+IHVucmVmRm4oaSkpKSk7XG5cdH07XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWFjdGlmeWAgaW5zdGVhZCAqL1xuY29uc3QgY3JlYXRlUmVhY3RpdmVGbiA9IHJlYWN0aWZ5O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGlmeU9iamVjdC9pbmRleC50c1xuLyoqXG4qIEFwcGx5IGByZWFjdGlmeWAgdG8gYW4gb2JqZWN0XG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVhY3RpZnlPYmplY3Qob2JqLCBvcHRpb25zT3JLZXlzID0ge30pIHtcblx0bGV0IGtleXMgPSBbXTtcblx0bGV0IG9wdGlvbnM7XG5cdGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnNPcktleXMpKSBrZXlzID0gb3B0aW9uc09yS2V5cztcblx0ZWxzZSB7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnNPcktleXM7XG5cdFx0Y29uc3QgeyBpbmNsdWRlT3duUHJvcGVydGllcyA9IHRydWUgfSA9IG9wdGlvbnNPcktleXM7XG5cdFx0a2V5cy5wdXNoKC4uLk9iamVjdC5rZXlzKG9iaikpO1xuXHRcdGlmIChpbmNsdWRlT3duUHJvcGVydGllcykga2V5cy5wdXNoKC4uLk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikpO1xuXHR9XG5cdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoa2V5cy5tYXAoKGtleSkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG5cdFx0cmV0dXJuIFtrZXksIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVhY3RpZnkodmFsdWUuYmluZChvYmopLCBvcHRpb25zKSA6IHZhbHVlXTtcblx0fSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0b1JlYWN0aXZlL2luZGV4LnRzXG4vKipcbiogQ29udmVydHMgcmVmIHRvIHJlYWN0aXZlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy90b1JlYWN0aXZlXG4qIEBwYXJhbSBvYmplY3RSZWYgQSByZWYgb2Ygb2JqZWN0XG4qL1xuZnVuY3Rpb24gdG9SZWFjdGl2ZShvYmplY3RSZWYpIHtcblx0aWYgKCFpc1JlZihvYmplY3RSZWYpKSByZXR1cm4gcmVhY3RpdmUob2JqZWN0UmVmKTtcblx0cmV0dXJuIHJlYWN0aXZlKG5ldyBQcm94eSh7fSwge1xuXHRcdGdldChfLCBwLCByZWNlaXZlcikge1xuXHRcdFx0cmV0dXJuIHVucmVmKFJlZmxlY3QuZ2V0KG9iamVjdFJlZi52YWx1ZSwgcCwgcmVjZWl2ZXIpKTtcblx0XHR9LFxuXHRcdHNldChfLCBwLCB2YWx1ZSkge1xuXHRcdFx0aWYgKGlzUmVmKG9iamVjdFJlZi52YWx1ZVtwXSkgJiYgIWlzUmVmKHZhbHVlKSkgb2JqZWN0UmVmLnZhbHVlW3BdLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRlbHNlIG9iamVjdFJlZi52YWx1ZVtwXSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblx0XHRkZWxldGVQcm9wZXJ0eShfLCBwKSB7XG5cdFx0XHRyZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShvYmplY3RSZWYudmFsdWUsIHApO1xuXHRcdH0sXG5cdFx0aGFzKF8sIHApIHtcblx0XHRcdHJldHVybiBSZWZsZWN0LmhhcyhvYmplY3RSZWYudmFsdWUsIHApO1xuXHRcdH0sXG5cdFx0b3duS2V5cygpIHtcblx0XHRcdHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RSZWYudmFsdWUpO1xuXHRcdH0sXG5cdFx0Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH1cblx0fSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGl2ZUNvbXB1dGVkL2luZGV4LnRzXG4vKipcbiogQ29tcHV0ZWQgcmVhY3RpdmUgb2JqZWN0LlxuKi9cbmZ1bmN0aW9uIHJlYWN0aXZlQ29tcHV0ZWQoZm4pIHtcblx0cmV0dXJuIHRvUmVhY3RpdmUoY29tcHV0ZWQoZm4pKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpdmVPbWl0L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBvbWl0IGZpZWxkcyBmcm9tIGEgcmVhY3RpdmUgb2JqZWN0XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3JlYWN0aXZlT21pdFxuKi9cbmZ1bmN0aW9uIHJlYWN0aXZlT21pdChvYmosIC4uLmtleXMpIHtcblx0Y29uc3QgZmxhdEtleXMgPSBrZXlzLmZsYXQoKTtcblx0Y29uc3QgcHJlZGljYXRlID0gZmxhdEtleXNbMF07XG5cdHJldHVybiByZWFjdGl2ZUNvbXB1dGVkKCgpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09IFwiZnVuY3Rpb25cIiA/IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0b1JlZnMkMShvYmopKS5maWx0ZXIoKFtrLCB2XSkgPT4gIXByZWRpY2F0ZSh0b1ZhbHVlKHYpLCBrKSkpIDogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRvUmVmcyQxKG9iaikpLmZpbHRlcigoZSkgPT4gIWZsYXRLZXlzLmluY2x1ZGVzKGVbMF0pKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGl2ZVBpY2svaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IHBpY2sgZmllbGRzIGZyb20gYSByZWFjdGl2ZSBvYmplY3RcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvcmVhY3RpdmVQaWNrXG4qL1xuZnVuY3Rpb24gcmVhY3RpdmVQaWNrKG9iaiwgLi4ua2V5cykge1xuXHRjb25zdCBmbGF0S2V5cyA9IGtleXMuZmxhdCgpO1xuXHRjb25zdCBwcmVkaWNhdGUgPSBmbGF0S2V5c1swXTtcblx0cmV0dXJuIHJlYWN0aXZlQ29tcHV0ZWQoKCkgPT4gdHlwZW9mIHByZWRpY2F0ZSA9PT0gXCJmdW5jdGlvblwiID8gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRvUmVmcyQxKG9iaikpLmZpbHRlcigoW2ssIHZdKSA9PiBwcmVkaWNhdGUodG9WYWx1ZSh2KSwgaykpKSA6IE9iamVjdC5mcm9tRW50cmllcyhmbGF0S2V5cy5tYXAoKGspID0+IFtrLCB0b1JlZihvYmosIGspXSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVmQXV0b1Jlc2V0L2luZGV4LnRzXG4vKipcbiogQ3JlYXRlIGEgcmVmIHdoaWNoIHdpbGwgYmUgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgYWZ0ZXIgc29tZSB0aW1lLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9yZWZBdXRvUmVzZXRcbiogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgd2hpY2ggd2lsbCBiZSBzZXQuXG4qIEBwYXJhbSBhZnRlck1zICAgICAgQSB6ZXJvLW9yLWdyZWF0ZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuKi9cbmZ1bmN0aW9uIHJlZkF1dG9SZXNldChkZWZhdWx0VmFsdWUsIGFmdGVyTXMgPSAxZTQpIHtcblx0cmV0dXJuIGN1c3RvbVJlZigodHJhY2ssIHRyaWdnZXIpID0+IHtcblx0XHRsZXQgdmFsdWUgPSB0b1ZhbHVlKGRlZmF1bHRWYWx1ZSk7XG5cdFx0bGV0IHRpbWVyO1xuXHRcdGNvbnN0IHJlc2V0QWZ0ZXIgPSAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHZhbHVlID0gdG9WYWx1ZShkZWZhdWx0VmFsdWUpO1xuXHRcdFx0dHJpZ2dlcigpO1xuXHRcdH0sIHRvVmFsdWUoYWZ0ZXJNcykpO1xuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0dHJhY2soKTtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldChuZXdWYWx1ZSkge1xuXHRcdFx0XHR2YWx1ZSA9IG5ld1ZhbHVlO1xuXHRcdFx0XHR0cmlnZ2VyKCk7XG5cdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHRcdHRpbWVyID0gcmVzZXRBZnRlcigpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmQXV0b1Jlc2V0YCBpbnN0ZWFkICovXG5jb25zdCBhdXRvUmVzZXRSZWYgPSByZWZBdXRvUmVzZXQ7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURlYm91bmNlRm4vaW5kZXgudHNcbi8qKlxuKiBEZWJvdW5jZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGVib3VuY2VGblxuKiBAcGFyYW0gIGZuICAgICAgICAgIEEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZGVsYXkgbWlsbGlzZWNvbmRzIGRlYm91bmNlZC5cbiogQHBhcmFtICBtcyAgICAgICAgICBBIHplcm8tb3ItZ3JlYXRlciBkZWxheSBpbiBtaWxsaXNlY29uZHMuIEZvciBldmVudCBjYWxsYmFja3MsIHZhbHVlcyBhcm91bmQgMTAwIG9yIDI1MCAob3IgZXZlbiBoaWdoZXIpIGFyZSBtb3N0IHVzZWZ1bC5cbiogQHBhcmFtICBvcHRpb25zICAgICBPcHRpb25zXG4qXG4qIEByZXR1cm4gQSBuZXcsIGRlYm91bmNlLCBmdW5jdGlvbi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEZWJvdW5jZUZuKGZuLCBtcyA9IDIwMCwgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBjcmVhdGVGaWx0ZXJXcmFwcGVyKGRlYm91bmNlRmlsdGVyKG1zLCBvcHRpb25zKSwgZm4pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZEZWJvdW5jZWQvaW5kZXgudHNcbi8qKlxuKiBEZWJvdW5jZSB1cGRhdGVzIG9mIGEgcmVmLlxuKlxuKiBAcmV0dXJuIEEgbmV3IGRlYm91bmNlZCByZWYuXG4qL1xuZnVuY3Rpb24gcmVmRGVib3VuY2VkKHZhbHVlLCBtcyA9IDIwMCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGRlYm91bmNlZCA9IHJlZih0b1ZhbHVlKHZhbHVlKSk7XG5cdGNvbnN0IHVwZGF0ZXIgPSB1c2VEZWJvdW5jZUZuKCgpID0+IHtcblx0XHRkZWJvdW5jZWQudmFsdWUgPSB2YWx1ZS52YWx1ZTtcblx0fSwgbXMsIG9wdGlvbnMpO1xuXHR3YXRjaCh2YWx1ZSwgKCkgPT4gdXBkYXRlcigpKTtcblx0cmV0dXJuIHNoYWxsb3dSZWFkb25seShkZWJvdW5jZWQpO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmRGVib3VuY2VkYCBpbnN0ZWFkICovXG5jb25zdCBkZWJvdW5jZWRSZWYgPSByZWZEZWJvdW5jZWQ7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWZEZWJvdW5jZWRgIGluc3RlYWQgKi9cbmNvbnN0IHVzZURlYm91bmNlID0gcmVmRGVib3VuY2VkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZEZWZhdWx0L2luZGV4LnRzXG4vKipcbiogQXBwbHkgZGVmYXVsdCB2YWx1ZSB0byBhIHJlZi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiByZWZEZWZhdWx0KHNvdXJjZSwgZGVmYXVsdFZhbHVlKSB7XG5cdHJldHVybiBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0dmFyIF9zb3VyY2UkdmFsdWU7XG5cdFx0XHRyZXR1cm4gKF9zb3VyY2UkdmFsdWUgPSBzb3VyY2UudmFsdWUpICE9PSBudWxsICYmIF9zb3VyY2UkdmFsdWUgIT09IHZvaWQgMCA/IF9zb3VyY2UkdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHNvdXJjZS52YWx1ZSA9IHZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHJlZk1hbnVhbFJlc2V0L2luZGV4LnRzXG4vKipcbiogQ3JlYXRlIGEgcmVmIHdpdGggbWFudWFsIHJlc2V0IGZ1bmN0aW9uYWxpdHkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3JlZk1hbnVhbFJlc2V0XG4qIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHdoaWNoIHdpbGwgYmUgc2V0LlxuKi9cbmZ1bmN0aW9uIHJlZk1hbnVhbFJlc2V0KGRlZmF1bHRWYWx1ZSkge1xuXHRsZXQgdmFsdWUgPSB0b1ZhbHVlKGRlZmF1bHRWYWx1ZSk7XG5cdGxldCB0cmlnZ2VyO1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHR2YWx1ZSA9IHRvVmFsdWUoZGVmYXVsdFZhbHVlKTtcblx0XHR0cmlnZ2VyKCk7XG5cdH07XG5cdGNvbnN0IHJlZlZhbHVlID0gY3VzdG9tUmVmKCh0cmFjaywgX3RyaWdnZXIpID0+IHtcblx0XHR0cmlnZ2VyID0gX3RyaWdnZXI7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0dHJhY2soKTtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldChuZXdWYWx1ZSkge1xuXHRcdFx0XHR2YWx1ZSA9IG5ld1ZhbHVlO1xuXHRcdFx0XHR0cmlnZ2VyKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSk7XG5cdHJlZlZhbHVlLnJlc2V0ID0gcmVzZXQ7XG5cdHJldHVybiByZWZWYWx1ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGhyb3R0bGVGbi9pbmRleC50c1xuLyoqXG4qIFRocm90dGxlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgcmF0ZSBsaW1pdGluZ1xuKiBleGVjdXRpb24gb2YgaGFuZGxlcnMgb24gZXZlbnRzIGxpa2UgcmVzaXplIGFuZCBzY3JvbGwuXG4qXG4qIEBwYXJhbSAgIGZuICAgICAgICAgICAgIEEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZGVsYXkgbWlsbGlzZWNvbmRzLiBUaGUgYHRoaXNgIGNvbnRleHQgYW5kIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoLCBhcy1pcyxcbiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBgY2FsbGJhY2tgIHdoZW4gdGhlIHRocm90dGxlZC1mdW5jdGlvbiBpcyBleGVjdXRlZC5cbiogQHBhcmFtICAgbXMgICAgICAgICAgICAgQSB6ZXJvLW9yLWdyZWF0ZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBGb3IgZXZlbnQgY2FsbGJhY2tzLCB2YWx1ZXMgYXJvdW5kIDEwMCBvciAyNTAgKG9yIGV2ZW4gaGlnaGVyKSBhcmUgbW9zdCB1c2VmdWwuXG4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgdmFsdWU6IDIwMClcbipcbiogQHBhcmFtIFt0cmFpbGluZ10gaWYgdHJ1ZSwgY2FsbCBmbiBhZ2FpbiBhZnRlciB0aGUgdGltZSBpcyB1cCAoZGVmYXVsdCB2YWx1ZTogZmFsc2UpXG4qXG4qIEBwYXJhbSBbbGVhZGluZ10gaWYgdHJ1ZSwgY2FsbCBmbiBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBtcyB0aW1lb3V0IChkZWZhdWx0IHZhbHVlOiB0cnVlKVxuKlxuKiBAcGFyYW0gW3JlamVjdE9uQ2FuY2VsXSBpZiB0cnVlLCByZWplY3QgdGhlIGxhc3QgY2FsbCBpZiBpdCdzIGJlZW4gY2FuY2VsIChkZWZhdWx0IHZhbHVlOiBmYWxzZSlcbipcbiogQHJldHVybiAgQSBuZXcsIHRocm90dGxlZCwgZnVuY3Rpb24uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVGhyb3R0bGVGbihmbiwgbXMgPSAyMDAsIHRyYWlsaW5nID0gZmFsc2UsIGxlYWRpbmcgPSB0cnVlLCByZWplY3RPbkNhbmNlbCA9IGZhbHNlKSB7XG5cdHJldHVybiBjcmVhdGVGaWx0ZXJXcmFwcGVyKHRocm90dGxlRmlsdGVyKG1zLCB0cmFpbGluZywgbGVhZGluZywgcmVqZWN0T25DYW5jZWwpLCBmbik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHJlZlRocm90dGxlZC9pbmRleC50c1xuLyoqXG4qIFRocm90dGxlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgcmF0ZSBsaW1pdGluZ1xuKiBleGVjdXRpb24gb2YgaGFuZGxlcnMgb24gZXZlbnRzIGxpa2UgcmVzaXplIGFuZCBzY3JvbGwuXG4qXG4qIEBwYXJhbSB2YWx1ZSBSZWYgdmFsdWUgdG8gYmUgd2F0Y2hlZCB3aXRoIHRocm90dGxlIGVmZmVjdFxuKiBAcGFyYW0gIGRlbGF5ICBBIHplcm8tb3ItZ3JlYXRlciBkZWxheSBpbiBtaWxsaXNlY29uZHMuIEZvciBldmVudCBjYWxsYmFja3MsIHZhbHVlcyBhcm91bmQgMTAwIG9yIDI1MCAob3IgZXZlbiBoaWdoZXIpIGFyZSBtb3N0IHVzZWZ1bC5cbiogQHBhcmFtIHRyYWlsaW5nIGlmIHRydWUsIHVwZGF0ZSB0aGUgdmFsdWUgYWdhaW4gYWZ0ZXIgdGhlIGRlbGF5IHRpbWUgaXMgdXBcbiogQHBhcmFtIGxlYWRpbmcgaWYgdHJ1ZSwgdXBkYXRlIHRoZSB2YWx1ZSBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBtcyB0aW1lb3V0XG4qL1xuZnVuY3Rpb24gcmVmVGhyb3R0bGVkKHZhbHVlLCBkZWxheSA9IDIwMCwgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSkge1xuXHRpZiAoZGVsYXkgPD0gMCkgcmV0dXJuIHZhbHVlO1xuXHRjb25zdCB0aHJvdHRsZWQgPSByZWYodG9WYWx1ZSh2YWx1ZSkpO1xuXHRjb25zdCB1cGRhdGVyID0gdXNlVGhyb3R0bGVGbigoKSA9PiB7XG5cdFx0dGhyb3R0bGVkLnZhbHVlID0gdmFsdWUudmFsdWU7XG5cdH0sIGRlbGF5LCB0cmFpbGluZywgbGVhZGluZyk7XG5cdHdhdGNoKHZhbHVlLCAoKSA9PiB1cGRhdGVyKCkpO1xuXHRyZXR1cm4gdGhyb3R0bGVkO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmVGhyb3R0bGVkYCBpbnN0ZWFkICovXG5jb25zdCB0aHJvdHRsZWRSZWYgPSByZWZUaHJvdHRsZWQ7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWZUaHJvdHRsZWRgIGluc3RlYWQgKi9cbmNvbnN0IHVzZVRocm90dGxlID0gcmVmVGhyb3R0bGVkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZXaXRoQ29udHJvbC9pbmRleC50c1xuLyoqXG4qIEZpbmUtZ3JhaW5lZCBjb250cm9scyBvdmVyIHJlZiBhbmQgaXRzIHJlYWN0aXZpdHkuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVmV2l0aENvbnRyb2woaW5pdGlhbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGxldCBzb3VyY2UgPSBpbml0aWFsO1xuXHRsZXQgdHJhY2s7XG5cdGxldCB0cmlnZ2VyO1xuXHRjb25zdCByZWYkMSA9IGN1c3RvbVJlZigoX3RyYWNrLCBfdHJpZ2dlcikgPT4ge1xuXHRcdHRyYWNrID0gX3RyYWNrO1xuXHRcdHRyaWdnZXIgPSBfdHJpZ2dlcjtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRyZXR1cm4gZ2V0JDEoKTtcblx0XHRcdH0sXG5cdFx0XHRzZXQodikge1xuXHRcdFx0XHRzZXQkMSh2KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9KTtcblx0ZnVuY3Rpb24gZ2V0JDEodHJhY2tpbmcgPSB0cnVlKSB7XG5cdFx0aWYgKHRyYWNraW5nKSB0cmFjaygpO1xuXHRcdHJldHVybiBzb3VyY2U7XG5cdH1cblx0ZnVuY3Rpb24gc2V0JDEodmFsdWUsIHRyaWdnZXJpbmcgPSB0cnVlKSB7XG5cdFx0dmFyIF9vcHRpb25zJG9uQmVmb3JlQ2hhbiwgX29wdGlvbnMkb25DaGFuZ2VkO1xuXHRcdGlmICh2YWx1ZSA9PT0gc291cmNlKSByZXR1cm47XG5cdFx0Y29uc3Qgb2xkID0gc291cmNlO1xuXHRcdGlmICgoKF9vcHRpb25zJG9uQmVmb3JlQ2hhbiA9IG9wdGlvbnMub25CZWZvcmVDaGFuZ2UpID09PSBudWxsIHx8IF9vcHRpb25zJG9uQmVmb3JlQ2hhbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkb25CZWZvcmVDaGFuLmNhbGwob3B0aW9ucywgdmFsdWUsIG9sZCkpID09PSBmYWxzZSkgcmV0dXJuO1xuXHRcdHNvdXJjZSA9IHZhbHVlO1xuXHRcdChfb3B0aW9ucyRvbkNoYW5nZWQgPSBvcHRpb25zLm9uQ2hhbmdlZCkgPT09IG51bGwgfHwgX29wdGlvbnMkb25DaGFuZ2VkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25DaGFuZ2VkLmNhbGwob3B0aW9ucywgdmFsdWUsIG9sZCk7XG5cdFx0aWYgKHRyaWdnZXJpbmcpIHRyaWdnZXIoKTtcblx0fVxuXHQvKipcblx0KiBHZXQgdGhlIHZhbHVlIHdpdGhvdXQgdHJhY2tlZCBpbiB0aGUgcmVhY3Rpdml0eSBzeXN0ZW1cblx0Ki9cblx0Y29uc3QgdW50cmFja2VkR2V0ID0gKCkgPT4gZ2V0JDEoZmFsc2UpO1xuXHQvKipcblx0KiBTZXQgdGhlIHZhbHVlIHdpdGhvdXQgdHJpZ2dlcmluZyB0aGUgcmVhY3Rpdml0eSBzeXN0ZW1cblx0Ki9cblx0Y29uc3Qgc2lsZW50U2V0ID0gKHYpID0+IHNldCQxKHYsIGZhbHNlKTtcblx0LyoqXG5cdCogR2V0IHRoZSB2YWx1ZSB3aXRob3V0IHRyYWNrZWQgaW4gdGhlIHJlYWN0aXZpdHkgc3lzdGVtLlxuXHQqXG5cdCogQWxpYXMgZm9yIGB1bnRyYWNrZWRHZXQoKWBcblx0Ki9cblx0Y29uc3QgcGVlayA9ICgpID0+IGdldCQxKGZhbHNlKTtcblx0LyoqXG5cdCogU2V0IHRoZSB2YWx1ZSB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIHJlYWN0aXZpdHkgc3lzdGVtXG5cdCpcblx0KiBBbGlhcyBmb3IgYHNpbGVudFNldCh2KWBcblx0Ki9cblx0Y29uc3QgbGF5ID0gKHYpID0+IHNldCQxKHYsIGZhbHNlKTtcblx0cmV0dXJuIGV4dGVuZFJlZihyZWYkMSwge1xuXHRcdGdldDogZ2V0JDEsXG5cdFx0c2V0OiBzZXQkMSxcblx0XHR1bnRyYWNrZWRHZXQsXG5cdFx0c2lsZW50U2V0LFxuXHRcdHBlZWssXG5cdFx0bGF5XG5cdH0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHJlZldpdGhDb250cm9sYCBpbnN0ZWFkICovXG5jb25zdCBjb250cm9sbGVkUmVmID0gcmVmV2l0aENvbnRyb2w7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNldC9pbmRleC50c1xuLyoqXG4qICBTaG9ydGhhbmQgZm9yIGByZWYudmFsdWUgPSB4YFxuKi9cbmZ1bmN0aW9uIHNldCguLi5hcmdzKSB7XG5cdGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuXHRcdGNvbnN0IFtyZWYkMSwgdmFsdWVdID0gYXJncztcblx0XHRyZWYkMS52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cdGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbnN0IFt0YXJnZXQsIGtleSwgdmFsdWVdID0gYXJncztcblx0XHR0YXJnZXRba2V5XSA9IHZhbHVlO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoV2l0aEZpbHRlci9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyID0gYnlwYXNzRmlsdGVyLC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0cmV0dXJuIHdhdGNoKHNvdXJjZSwgY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgY2IpLCB3YXRjaE9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaFBhdXNhYmxlL2luZGV4LnRzXG4vKiogQGRlcHJlY2F0ZWQgVXNlIFZ1ZSdzIGJ1aWx0LWluIGB3YXRjaGAgaW5zdGVhZC4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb24uICovXG5mdW5jdGlvbiB3YXRjaFBhdXNhYmxlKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyOiBmaWx0ZXIsIGluaXRpYWxTdGF0ZSA9IFwiYWN0aXZlXCIsLi4ud2F0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyLCBwYXVzZSwgcmVzdW1lLCBpc0FjdGl2ZSB9ID0gcGF1c2FibGVGaWx0ZXIoZmlsdGVyLCB7IGluaXRpYWxTdGF0ZSB9KTtcblx0cmV0dXJuIHtcblx0XHRzdG9wOiB3YXRjaFdpdGhGaWx0ZXIoc291cmNlLCBjYiwge1xuXHRcdFx0Li4ud2F0Y2hPcHRpb25zLFxuXHRcdFx0ZXZlbnRGaWx0ZXJcblx0XHR9KSxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWUsXG5cdFx0aXNBY3RpdmVcblx0fTtcbn1cbi8qKiBAZGVwcmVjYXRlZCBVc2UgVnVlJ3MgYnVpbHQtaW4gYHdhdGNoYCBpbnN0ZWFkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbi4gKi9cbmNvbnN0IHBhdXNhYmxlV2F0Y2ggPSB3YXRjaFBhdXNhYmxlO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzeW5jUmVmL2luZGV4LnRzXG4vKipcbiogVHdvLXdheSByZWZzIHN5bmNocm9uaXphdGlvbi5cbiogRnJvbSB0aGUgc2V0IHRoZW9yeSBwZXJzcGVjdGl2ZSB0byByZXN0cmljdCB0aGUgb3B0aW9uJ3MgdHlwZVxuKiBDaGVjayBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuKiAxLiBMID0gUlxuKiAyLiBMIOKIqSBSIOKJoCDiiIVcbiogMy4gTCDiioYgUlxuKiA0LiBMIOKIqSBSID0g4oiFXG4qL1xuZnVuY3Rpb24gc3luY1JlZihsZWZ0LCByaWdodCwgLi4uW29wdGlvbnNdKSB7XG5cdGNvbnN0IHsgZmx1c2ggPSBcInN5bmNcIiwgZGVlcCA9IGZhbHNlLCBpbW1lZGlhdGUgPSB0cnVlLCBkaXJlY3Rpb24gPSBcImJvdGhcIiwgdHJhbnNmb3JtID0ge30gfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IHdhdGNoZXJzID0gW107XG5cdGNvbnN0IHRyYW5zZm9ybUxUUiA9IFwibHRyXCIgaW4gdHJhbnNmb3JtICYmIHRyYW5zZm9ybS5sdHIgfHwgKCh2KSA9PiB2KTtcblx0Y29uc3QgdHJhbnNmb3JtUlRMID0gXCJydGxcIiBpbiB0cmFuc2Zvcm0gJiYgdHJhbnNmb3JtLnJ0bCB8fCAoKHYpID0+IHYpO1xuXHRpZiAoZGlyZWN0aW9uID09PSBcImJvdGhcIiB8fCBkaXJlY3Rpb24gPT09IFwibHRyXCIpIHdhdGNoZXJzLnB1c2god2F0Y2hQYXVzYWJsZShsZWZ0LCAobmV3VmFsdWUpID0+IHtcblx0XHR3YXRjaGVycy5mb3JFYWNoKCh3KSA9PiB3LnBhdXNlKCkpO1xuXHRcdHJpZ2h0LnZhbHVlID0gdHJhbnNmb3JtTFRSKG5ld1ZhbHVlKTtcblx0XHR3YXRjaGVycy5mb3JFYWNoKCh3KSA9PiB3LnJlc3VtZSgpKTtcblx0fSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0aW1tZWRpYXRlXG5cdH0pKTtcblx0aWYgKGRpcmVjdGlvbiA9PT0gXCJib3RoXCIgfHwgZGlyZWN0aW9uID09PSBcInJ0bFwiKSB3YXRjaGVycy5wdXNoKHdhdGNoUGF1c2FibGUocmlnaHQsIChuZXdWYWx1ZSkgPT4ge1xuXHRcdHdhdGNoZXJzLmZvckVhY2goKHcpID0+IHcucGF1c2UoKSk7XG5cdFx0bGVmdC52YWx1ZSA9IHRyYW5zZm9ybVJUTChuZXdWYWx1ZSk7XG5cdFx0d2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5yZXN1bWUoKSk7XG5cdH0sIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGltbWVkaWF0ZVxuXHR9KSk7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0d2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5zdG9wKCkpO1xuXHR9O1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3luY1JlZnMvaW5kZXgudHNcbi8qKlxuKiBLZWVwIHRhcmdldCByZWYocykgaW4gc3luYyB3aXRoIHRoZSBzb3VyY2UgcmVmXG4qXG4qIEBwYXJhbSBzb3VyY2Ugc291cmNlIHJlZlxuKiBAcGFyYW0gdGFyZ2V0c1xuKi9cbmZ1bmN0aW9uIHN5bmNSZWZzKHNvdXJjZSwgdGFyZ2V0cywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZmx1c2ggPSBcInN5bmNcIiwgZGVlcCA9IGZhbHNlLCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB0YXJnZXRzQXJyYXkgPSB0b0FycmF5KHRhcmdldHMpO1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCAobmV3VmFsdWUpID0+IHRhcmdldHNBcnJheS5mb3JFYWNoKCh0YXJnZXQpID0+IHRhcmdldC52YWx1ZSA9IG5ld1ZhbHVlKSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0aW1tZWRpYXRlXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0b1JlZnMvaW5kZXgudHNcbi8qKlxuKiBFeHRlbmRlZCBgdG9SZWZzYCB0aGF0IGFsc28gYWNjZXB0cyByZWZzIG9mIGFuIG9iamVjdC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdG9SZWZzXG4qIEBwYXJhbSBvYmplY3RSZWYgQSByZWYgb3Igbm9ybWFsIG9iamVjdCBvciBhcnJheS5cbiogQHBhcmFtIG9wdGlvbnMgT3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3RSZWYsIG9wdGlvbnMgPSB7fSkge1xuXHRpZiAoIWlzUmVmKG9iamVjdFJlZikpIHJldHVybiB0b1JlZnMkMShvYmplY3RSZWYpO1xuXHRjb25zdCByZXN1bHQgPSBBcnJheS5pc0FycmF5KG9iamVjdFJlZi52YWx1ZSkgPyBBcnJheS5mcm9tKHsgbGVuZ3RoOiBvYmplY3RSZWYudmFsdWUubGVuZ3RoIH0pIDoge307XG5cdGZvciAoY29uc3Qga2V5IGluIG9iamVjdFJlZi52YWx1ZSkgcmVzdWx0W2tleV0gPSBjdXN0b21SZWYoKCkgPT4gKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gb2JqZWN0UmVmLnZhbHVlW2tleV07XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0dmFyIF90b1ZhbHVlO1xuXHRcdFx0aWYgKChfdG9WYWx1ZSA9IHRvVmFsdWUob3B0aW9ucy5yZXBsYWNlUmVmKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogdHJ1ZSkgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0UmVmLnZhbHVlKSkge1xuXHRcdFx0XHRjb25zdCBjb3B5ID0gWy4uLm9iamVjdFJlZi52YWx1ZV07XG5cdFx0XHRcdGNvcHlba2V5XSA9IHY7XG5cdFx0XHRcdG9iamVjdFJlZi52YWx1ZSA9IGNvcHk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBuZXdPYmplY3QgPSB7XG5cdFx0XHRcdFx0Li4ub2JqZWN0UmVmLnZhbHVlLFxuXHRcdFx0XHRcdFtrZXldOiB2XG5cdFx0XHRcdH07XG5cdFx0XHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdPYmplY3QsIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3RSZWYudmFsdWUpKTtcblx0XHRcdFx0b2JqZWN0UmVmLnZhbHVlID0gbmV3T2JqZWN0O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBvYmplY3RSZWYudmFsdWVba2V5XSA9IHY7XG5cdFx0fVxuXHR9KSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHRyeU9uQmVmb3JlTW91bnQvaW5kZXgudHNcbi8qKlxuKiBDYWxsIG9uQmVmb3JlTW91bnQoKSBpZiBpdCdzIGluc2lkZSBhIGNvbXBvbmVudCBsaWZlY3ljbGUsIGlmIG5vdCwganVzdCBjYWxsIHRoZSBmdW5jdGlvblxuKlxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIHN5bmMgaWYgc2V0IHRvIGZhbHNlLCBpdCB3aWxsIHJ1biBpbiB0aGUgbmV4dFRpY2soKSBvZiBWdWVcbiogQHBhcmFtIHRhcmdldFxuKi9cbmZ1bmN0aW9uIHRyeU9uQmVmb3JlTW91bnQoZm4sIHN5bmMgPSB0cnVlLCB0YXJnZXQpIHtcblx0aWYgKGdldExpZmVDeWNsZVRhcmdldCh0YXJnZXQpKSBvbkJlZm9yZU1vdW50KGZuLCB0YXJnZXQpO1xuXHRlbHNlIGlmIChzeW5jKSBmbigpO1xuXHRlbHNlIG5leHRUaWNrKGZuKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdHJ5T25CZWZvcmVVbm1vdW50L2luZGV4LnRzXG4vKipcbiogQ2FsbCBvbkJlZm9yZVVubW91bnQoKSBpZiBpdCdzIGluc2lkZSBhIGNvbXBvbmVudCBsaWZlY3ljbGUsIGlmIG5vdCwgZG8gbm90aGluZ1xuKlxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIHRhcmdldFxuKi9cbmZ1bmN0aW9uIHRyeU9uQmVmb3JlVW5tb3VudChmbiwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25CZWZvcmVVbm1vdW50KGZuLCB0YXJnZXQpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0cnlPbk1vdW50ZWQvaW5kZXgudHNcbi8qKlxuKiBDYWxsIG9uTW91bnRlZCgpIGlmIGl0J3MgaW5zaWRlIGEgY29tcG9uZW50IGxpZmVjeWNsZSwgaWYgbm90LCBqdXN0IGNhbGwgdGhlIGZ1bmN0aW9uXG4qXG4qIEBwYXJhbSBmblxuKiBAcGFyYW0gc3luYyBpZiBzZXQgdG8gZmFsc2UsIGl0IHdpbGwgcnVuIGluIHRoZSBuZXh0VGljaygpIG9mIFZ1ZVxuKiBAcGFyYW0gdGFyZ2V0XG4qL1xuZnVuY3Rpb24gdHJ5T25Nb3VudGVkKGZuLCBzeW5jID0gdHJ1ZSwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25Nb3VudGVkKGZuLCB0YXJnZXQpO1xuXHRlbHNlIGlmIChzeW5jKSBmbigpO1xuXHRlbHNlIG5leHRUaWNrKGZuKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdHJ5T25Vbm1vdW50ZWQvaW5kZXgudHNcbi8qKlxuKiBDYWxsIG9uVW5tb3VudGVkKCkgaWYgaXQncyBpbnNpZGUgYSBjb21wb25lbnQgbGlmZWN5Y2xlLCBpZiBub3QsIGRvIG5vdGhpbmdcbipcbiogQHBhcmFtIGZuXG4qIEBwYXJhbSB0YXJnZXRcbiovXG5mdW5jdGlvbiB0cnlPblVubW91bnRlZChmbiwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25Vbm1vdW50ZWQoZm4sIHRhcmdldCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVudGlsL2luZGV4LnRzXG5mdW5jdGlvbiBjcmVhdGVVbnRpbChyLCBpc05vdCA9IGZhbHNlKSB7XG5cdGZ1bmN0aW9uIHRvTWF0Y2goY29uZGl0aW9uLCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgdGltZW91dCwgdGhyb3dPblRpbWVvdXQgfSA9IHt9KSB7XG5cdFx0bGV0IHN0b3AgPSBudWxsO1xuXHRcdGNvbnN0IHByb21pc2VzID0gW25ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHRzdG9wID0gd2F0Y2gociwgKHYpID0+IHtcblx0XHRcdFx0aWYgKGNvbmRpdGlvbih2KSAhPT0gaXNOb3QpIHtcblx0XHRcdFx0XHRpZiAoc3RvcCkgc3RvcCgpO1xuXHRcdFx0XHRcdGVsc2UgbmV4dFRpY2soKCkgPT4gc3RvcCA9PT0gbnVsbCB8fCBzdG9wID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdG9wKCkpO1xuXHRcdFx0XHRcdHJlc29sdmUodik7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHtcblx0XHRcdFx0Zmx1c2gsXG5cdFx0XHRcdGRlZXAsXG5cdFx0XHRcdGltbWVkaWF0ZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fSldO1xuXHRcdGlmICh0aW1lb3V0ICE9IG51bGwpIHByb21pc2VzLnB1c2gocHJvbWlzZVRpbWVvdXQodGltZW91dCwgdGhyb3dPblRpbWVvdXQpLnRoZW4oKCkgPT4gdG9WYWx1ZShyKSkuZmluYWxseSgoKSA9PiBzdG9wID09PSBudWxsIHx8IHN0b3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0b3AoKSkpO1xuXHRcdHJldHVybiBQcm9taXNlLnJhY2UocHJvbWlzZXMpO1xuXHR9XG5cdGZ1bmN0aW9uIHRvQmUodmFsdWUsIG9wdGlvbnMpIHtcblx0XHRpZiAoIWlzUmVmKHZhbHVlKSkgcmV0dXJuIHRvTWF0Y2goKHYpID0+IHYgPT09IHZhbHVlLCBvcHRpb25zKTtcblx0XHRjb25zdCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgdGltZW91dCwgdGhyb3dPblRpbWVvdXQgfSA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuXHRcdGxldCBzdG9wID0gbnVsbDtcblx0XHRjb25zdCBwcm9taXNlcyA9IFtuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0c3RvcCA9IHdhdGNoKFtyLCB2YWx1ZV0sIChbdjEsIHYyXSkgPT4ge1xuXHRcdFx0XHRpZiAoaXNOb3QgIT09ICh2MSA9PT0gdjIpKSB7XG5cdFx0XHRcdFx0aWYgKHN0b3ApIHN0b3AoKTtcblx0XHRcdFx0XHRlbHNlIG5leHRUaWNrKCgpID0+IHN0b3AgPT09IG51bGwgfHwgc3RvcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RvcCgpKTtcblx0XHRcdFx0XHRyZXNvbHZlKHYxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwge1xuXHRcdFx0XHRmbHVzaCxcblx0XHRcdFx0ZGVlcCxcblx0XHRcdFx0aW1tZWRpYXRlOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9KV07XG5cdFx0aWYgKHRpbWVvdXQgIT0gbnVsbCkgcHJvbWlzZXMucHVzaChwcm9taXNlVGltZW91dCh0aW1lb3V0LCB0aHJvd09uVGltZW91dCkudGhlbigoKSA9PiB0b1ZhbHVlKHIpKS5maW5hbGx5KCgpID0+IHtcblx0XHRcdHN0b3AgPT09IG51bGwgfHwgc3RvcCA9PT0gdm9pZCAwIHx8IHN0b3AoKTtcblx0XHRcdHJldHVybiB0b1ZhbHVlKHIpO1xuXHRcdH0pKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yYWNlKHByb21pc2VzKTtcblx0fVxuXHRmdW5jdGlvbiB0b0JlVHJ1dGh5KG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gdG9NYXRjaCgodikgPT4gQm9vbGVhbih2KSwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gdG9CZU51bGwob3B0aW9ucykge1xuXHRcdHJldHVybiB0b0JlKG51bGwsIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIHRvQmVVbmRlZmluZWQob3B0aW9ucykge1xuXHRcdHJldHVybiB0b0JlKHZvaWQgMCwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gdG9CZU5hTihvcHRpb25zKSB7XG5cdFx0cmV0dXJuIHRvTWF0Y2goTnVtYmVyLmlzTmFOLCBvcHRpb25zKTtcblx0fVxuXHRmdW5jdGlvbiB0b0NvbnRhaW5zKHZhbHVlLCBvcHRpb25zKSB7XG5cdFx0cmV0dXJuIHRvTWF0Y2goKHYpID0+IHtcblx0XHRcdGNvbnN0IGFycmF5ID0gQXJyYXkuZnJvbSh2KTtcblx0XHRcdHJldHVybiBhcnJheS5pbmNsdWRlcyh2YWx1ZSkgfHwgYXJyYXkuaW5jbHVkZXModG9WYWx1ZSh2YWx1ZSkpO1xuXHRcdH0sIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIGNoYW5nZWQob3B0aW9ucykge1xuXHRcdHJldHVybiBjaGFuZ2VkVGltZXMoMSwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gY2hhbmdlZFRpbWVzKG4gPSAxLCBvcHRpb25zKSB7XG5cdFx0bGV0IGNvdW50ID0gLTE7XG5cdFx0cmV0dXJuIHRvTWF0Y2goKCkgPT4ge1xuXHRcdFx0Y291bnQgKz0gMTtcblx0XHRcdHJldHVybiBjb3VudCA+PSBuO1xuXHRcdH0sIG9wdGlvbnMpO1xuXHR9XG5cdGlmIChBcnJheS5pc0FycmF5KHRvVmFsdWUocikpKSByZXR1cm4ge1xuXHRcdHRvTWF0Y2gsXG5cdFx0dG9Db250YWlucyxcblx0XHRjaGFuZ2VkLFxuXHRcdGNoYW5nZWRUaW1lcyxcblx0XHRnZXQgbm90KCkge1xuXHRcdFx0cmV0dXJuIGNyZWF0ZVVudGlsKHIsICFpc05vdCk7XG5cdFx0fVxuXHR9O1xuXHRlbHNlIHJldHVybiB7XG5cdFx0dG9NYXRjaCxcblx0XHR0b0JlLFxuXHRcdHRvQmVUcnV0aHksXG5cdFx0dG9CZU51bGwsXG5cdFx0dG9CZU5hTixcblx0XHR0b0JlVW5kZWZpbmVkLFxuXHRcdGNoYW5nZWQsXG5cdFx0Y2hhbmdlZFRpbWVzLFxuXHRcdGdldCBub3QoKSB7XG5cdFx0XHRyZXR1cm4gY3JlYXRlVW50aWwociwgIWlzTm90KTtcblx0XHR9XG5cdH07XG59XG5mdW5jdGlvbiB1bnRpbChyKSB7XG5cdHJldHVybiBjcmVhdGVVbnRpbChyKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlEaWZmZXJlbmNlL2luZGV4LnRzXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcih2YWx1ZSwgb3RoVmFsKSB7XG5cdHJldHVybiB2YWx1ZSA9PT0gb3RoVmFsO1xufVxuLyoqXG4qIFJlYWN0aXZlIGdldCBhcnJheSBkaWZmZXJlbmNlIG9mIHR3byBhcnJheVxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheURpZmZlcmVuY2VcbiogQHJldHVybnMgLSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gYXJyYXlcbiogQHBhcmFtIGFyZ3NcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheURpZmZlcmVuY2UoLi4uYXJncykge1xuXHR2YXIgX2FyZ3MkLCBfYXJncyQyO1xuXHRjb25zdCBsaXN0ID0gYXJnc1swXTtcblx0Y29uc3QgdmFsdWVzID0gYXJnc1sxXTtcblx0bGV0IGNvbXBhcmVGbiA9IChfYXJncyQgPSBhcmdzWzJdKSAhPT0gbnVsbCAmJiBfYXJncyQgIT09IHZvaWQgMCA/IF9hcmdzJCA6IGRlZmF1bHRDb21wYXJhdG9yO1xuXHRjb25zdCB7IHN5bW1ldHJpYyA9IGZhbHNlIH0gPSAoX2FyZ3MkMiA9IGFyZ3NbM10pICE9PSBudWxsICYmIF9hcmdzJDIgIT09IHZvaWQgMCA/IF9hcmdzJDIgOiB7fTtcblx0aWYgKHR5cGVvZiBjb21wYXJlRm4gPT09IFwic3RyaW5nXCIpIHtcblx0XHRjb25zdCBrZXkgPSBjb21wYXJlRm47XG5cdFx0Y29tcGFyZUZuID0gKHZhbHVlLCBvdGhWYWwpID0+IHZhbHVlW2tleV0gPT09IG90aFZhbFtrZXldO1xuXHR9XG5cdGNvbnN0IGRpZmYxID0gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5maWx0ZXIoKHgpID0+IHRvVmFsdWUodmFsdWVzKS5maW5kSW5kZXgoKHkpID0+IGNvbXBhcmVGbih4LCB5KSkgPT09IC0xKSk7XG5cdGlmIChzeW1tZXRyaWMpIHtcblx0XHRjb25zdCBkaWZmMiA9IGNvbXB1dGVkKCgpID0+IHRvVmFsdWUodmFsdWVzKS5maWx0ZXIoKHgpID0+IHRvVmFsdWUobGlzdCkuZmluZEluZGV4KCh5KSA9PiBjb21wYXJlRm4oeCwgeSkpID09PSAtMSkpO1xuXHRcdHJldHVybiBjb21wdXRlZCgoKSA9PiBzeW1tZXRyaWMgPyBbLi4udG9WYWx1ZShkaWZmMSksIC4uLnRvVmFsdWUoZGlmZjIpXSA6IHRvVmFsdWUoZGlmZjEpKTtcblx0fSBlbHNlIHJldHVybiBkaWZmMTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlFdmVyeS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5ldmVyeWBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlFdmVyeVxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zICoqdHJ1ZSoqIGlmIHRoZSBgZm5gIGZ1bmN0aW9uIHJldHVybnMgYSAqKnRydXRoeSoqIHZhbHVlIGZvciBldmVyeSBlbGVtZW50IGZyb20gdGhlIGFycmF5LiBPdGhlcndpc2UsICoqZmFsc2UqKi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheUV2ZXJ5KGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLmV2ZXJ5KChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaWx0ZXIvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkuZmlsdGVyYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUZpbHRlclxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGBsaXN0YC4gRWFjaCB0aW1lIGBmbmAgZXhlY3V0ZXMsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgbmV3IGFycmF5LlxuKlxuKiBAcmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiBhIHBvcnRpb24gb2YgdGhlIGdpdmVuIGFycmF5LCBmaWx0ZXJlZCBkb3duIHRvIGp1c3QgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGdpdmVuIGFycmF5IHRoYXQgcGFzcyB0aGUgdGVzdCBpbXBsZW1lbnRlZCBieSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uIElmIG5vIGVsZW1lbnRzIHBhc3MgdGhlIHRlc3QsIGFuIGVtcHR5IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlGaWx0ZXIobGlzdCwgZm4pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkubWFwKChpKSA9PiB0b1ZhbHVlKGkpKS5maWx0ZXIoZm4pKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaW5kL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmZpbmRgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5RmluZFxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSB0aGF0IHNhdGlzZmllcyB0aGUgcHJvdmlkZWQgdGVzdGluZyBmdW5jdGlvbi4gT3RoZXJ3aXNlLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlGaW5kKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKHRvVmFsdWUobGlzdCkuZmluZCgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheUZpbmRJbmRleC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5maW5kSW5kZXhgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5RmluZEluZGV4XG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGZuIC0gYSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbipcbiogQHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSB0aGF0IHBhc3NlcyB0aGUgdGVzdC4gT3RoZXJ3aXNlLCBcIi0xXCIuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlGaW5kSW5kZXgobGlzdCwgZm4pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkuZmluZEluZGV4KChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaW5kTGFzdC9pbmRleC50c1xuZnVuY3Rpb24gZmluZExhc3QoYXJyLCBjYikge1xuXHRsZXQgaW5kZXggPSBhcnIubGVuZ3RoO1xuXHR3aGlsZSAoaW5kZXgtLSA+IDApIGlmIChjYihhcnJbaW5kZXhdLCBpbmRleCwgYXJyKSkgcmV0dXJuIGFycltpbmRleF07XG59XG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmZpbmRMYXN0YFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUZpbmRMYXN0XG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGZuIC0gYSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbipcbiogQHJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIHRlc3RpbmcgZnVuY3Rpb24uIE90aGVyd2lzZSwgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5RmluZExhc3QobGlzdCwgZm4pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUoIUFycmF5LnByb3RvdHlwZS5maW5kTGFzdCA/IGZpbmRMYXN0KHRvVmFsdWUobGlzdCksIChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpIDogdG9WYWx1ZShsaXN0KS5maW5kTGFzdCgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheUluY2x1ZGVzL2luZGV4LnRzXG5mdW5jdGlvbiBpc0FycmF5SW5jbHVkZXNPcHRpb25zKG9iaikge1xuXHRyZXR1cm4gaXNPYmplY3Qob2JqKSAmJiBjb250YWluc1Byb3Aob2JqLCBcImZvcm1JbmRleFwiLCBcImNvbXBhcmF0b3JcIik7XG59XG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmluY2x1ZGVzYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUluY2x1ZGVzXG4qXG4qIEByZXR1cm5zIHRydWUgaWYgdGhlIGB2YWx1ZWAgaXMgZm91bmQgaW4gdGhlIGFycmF5LiBPdGhlcndpc2UsIGZhbHNlLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5SW5jbHVkZXMoLi4uYXJncykge1xuXHR2YXIgX2NvbXBhcmF0b3I7XG5cdGNvbnN0IGxpc3QgPSBhcmdzWzBdO1xuXHRjb25zdCB2YWx1ZSA9IGFyZ3NbMV07XG5cdGxldCBjb21wYXJhdG9yID0gYXJnc1syXTtcblx0bGV0IGZvcm1JbmRleCA9IDA7XG5cdGlmIChpc0FycmF5SW5jbHVkZXNPcHRpb25zKGNvbXBhcmF0b3IpKSB7XG5cdFx0dmFyIF9jb21wYXJhdG9yJGZyb21JbmRleDtcblx0XHRmb3JtSW5kZXggPSAoX2NvbXBhcmF0b3IkZnJvbUluZGV4ID0gY29tcGFyYXRvci5mcm9tSW5kZXgpICE9PSBudWxsICYmIF9jb21wYXJhdG9yJGZyb21JbmRleCAhPT0gdm9pZCAwID8gX2NvbXBhcmF0b3IkZnJvbUluZGV4IDogMDtcblx0XHRjb21wYXJhdG9yID0gY29tcGFyYXRvci5jb21wYXJhdG9yO1xuXHR9XG5cdGlmICh0eXBlb2YgY29tcGFyYXRvciA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGNvbnN0IGtleSA9IGNvbXBhcmF0b3I7XG5cdFx0Y29tcGFyYXRvciA9IChlbGVtZW50LCB2YWx1ZSQxKSA9PiBlbGVtZW50W2tleV0gPT09IHRvVmFsdWUodmFsdWUkMSk7XG5cdH1cblx0Y29tcGFyYXRvciA9IChfY29tcGFyYXRvciA9IGNvbXBhcmF0b3IpICE9PSBudWxsICYmIF9jb21wYXJhdG9yICE9PSB2b2lkIDAgPyBfY29tcGFyYXRvciA6ICgoZWxlbWVudCwgdmFsdWUkMSkgPT4gZWxlbWVudCA9PT0gdG9WYWx1ZSh2YWx1ZSQxKSk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLnNsaWNlKGZvcm1JbmRleCkuc29tZSgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBjb21wYXJhdG9yKHRvVmFsdWUoZWxlbWVudCksIHRvVmFsdWUodmFsdWUpLCBpbmRleCwgdG9WYWx1ZShhcnJheSkpKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5Sm9pbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5qb2luYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUpvaW5cbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gc2VwYXJhdG9yIC0gYSBzdHJpbmcgdG8gc2VwYXJhdGUgZWFjaCBwYWlyIG9mIGFkamFjZW50IGVsZW1lbnRzIG9mIHRoZSBhcnJheS4gSWYgb21pdHRlZCwgdGhlIGFycmF5IGVsZW1lbnRzIGFyZSBzZXBhcmF0ZWQgd2l0aCBhIGNvbW1hIChcIixcIikuXG4qXG4qIEByZXR1cm5zIGEgc3RyaW5nIHdpdGggYWxsIGFycmF5IGVsZW1lbnRzIGpvaW5lZC4gSWYgYXJyLmxlbmd0aCBpcyAwLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5Sm9pbihsaXN0LCBzZXBhcmF0b3IpIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkubWFwKChpKSA9PiB0b1ZhbHVlKGkpKS5qb2luKHRvVmFsdWUoc2VwYXJhdG9yKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheU1hcC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5tYXBgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5TWFwXG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGZuIC0gYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBmb3IgZXZlcnkgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gYGxpc3RgLiBFYWNoIHRpbWUgYGZuYCBleGVjdXRlcywgdGhlIHJldHVybmVkIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBuZXcgYXJyYXkuXG4qXG4qIEByZXR1cm5zIGEgbmV3IGFycmF5IHdpdGggZWFjaCBlbGVtZW50IGJlaW5nIHRoZSByZXN1bHQgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5TWFwKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLm1hcCgoaSkgPT4gdG9WYWx1ZShpKSkubWFwKGZuKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5UmVkdWNlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LnJlZHVjZWBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlSZWR1Y2VcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gcmVkdWNlciAtIGEgXCJyZWR1Y2VyXCIgZnVuY3Rpb24uXG4qIEBwYXJhbSBhcmdzXG4qXG4qIEByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHJlc3VsdHMgZnJvbSBydW5uaW5nIHRoZSBcInJlZHVjZXJcIiBjYWxsYmFjayBmdW5jdGlvbiB0byBjb21wbGV0aW9uIG92ZXIgdGhlIGVudGlyZSBhcnJheS5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheVJlZHVjZShsaXN0LCByZWR1Y2VyLCAuLi5hcmdzKSB7XG5cdGNvbnN0IHJlZHVjZUNhbGxiYWNrID0gKHN1bSwgdmFsdWUsIGluZGV4KSA9PiByZWR1Y2VyKHRvVmFsdWUoc3VtKSwgdG9WYWx1ZSh2YWx1ZSksIGluZGV4KTtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCByZXNvbHZlZCA9IHRvVmFsdWUobGlzdCk7XG5cdFx0cmV0dXJuIGFyZ3MubGVuZ3RoID8gcmVzb2x2ZWQucmVkdWNlKHJlZHVjZUNhbGxiYWNrLCB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiID8gdG9WYWx1ZShhcmdzWzBdKCkpIDogdG9WYWx1ZShhcmdzWzBdKSkgOiByZXNvbHZlZC5yZWR1Y2UocmVkdWNlQ2FsbGJhY2spO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlTb21lL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LnNvbWVgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5U29tZVxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zICoqdHJ1ZSoqIGlmIHRoZSBgZm5gIGZ1bmN0aW9uIHJldHVybnMgYSAqKnRydXRoeSoqIHZhbHVlIGZvciBhbnkgZWxlbWVudCBmcm9tIHRoZSBhcnJheS4gT3RoZXJ3aXNlLCAqKmZhbHNlKiouXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlTb21lKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLnNvbWUoKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gZm4odG9WYWx1ZShlbGVtZW50KSwgaW5kZXgsIGFycmF5KSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheVVuaXF1ZS9pbmRleC50c1xuZnVuY3Rpb24gdW5pcShhcnJheSkge1xuXHRyZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFycmF5KSk7XG59XG5mdW5jdGlvbiB1bmlxdWVFbGVtZW50c0J5KGFycmF5LCBmbikge1xuXHRyZXR1cm4gYXJyYXkucmVkdWNlKChhY2MsIHYpID0+IHtcblx0XHRpZiAoIWFjYy5zb21lKCh4KSA9PiBmbih2LCB4LCBhcnJheSkpKSBhY2MucHVzaCh2KTtcblx0XHRyZXR1cm4gYWNjO1xuXHR9LCBbXSk7XG59XG4vKipcbiogcmVhY3RpdmUgdW5pcXVlIGFycmF5XG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5VW5pcXVlXG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGNvbXBhcmVGblxuKiBAcmV0dXJucyBBIGNvbXB1dGVkIHJlZiB0aGF0IHJldHVybnMgYSB1bmlxdWUgYXJyYXkgb2YgaXRlbXMuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlVbmlxdWUobGlzdCwgY29tcGFyZUZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcmVzb2x2ZWRMaXN0ID0gdG9WYWx1ZShsaXN0KS5tYXAoKGVsZW1lbnQpID0+IHRvVmFsdWUoZWxlbWVudCkpO1xuXHRcdHJldHVybiBjb21wYXJlRm4gPyB1bmlxdWVFbGVtZW50c0J5KHJlc29sdmVkTGlzdCwgY29tcGFyZUZuKSA6IHVuaXEocmVzb2x2ZWRMaXN0KTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvdW50ZXIvaW5kZXgudHNcbi8qKlxuKiBCYXNpYyBjb3VudGVyIHdpdGggdXRpbGl0eSBmdW5jdGlvbnMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNvdW50ZXJcbiogQHBhcmFtIFtpbml0aWFsVmFsdWVdXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlQ291bnRlcihpbml0aWFsVmFsdWUgPSAwLCBvcHRpb25zID0ge30pIHtcblx0bGV0IF9pbml0aWFsVmFsdWUgPSB1bnJlZihpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBjb3VudCA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgeyBtYXggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG1pbiA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaW5jID0gKGRlbHRhID0gMSkgPT4gY291bnQudmFsdWUgPSBNYXRoLm1heChNYXRoLm1pbihtYXgsIGNvdW50LnZhbHVlICsgZGVsdGEpLCBtaW4pO1xuXHRjb25zdCBkZWMgPSAoZGVsdGEgPSAxKSA9PiBjb3VudC52YWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KG1pbiwgY291bnQudmFsdWUgLSBkZWx0YSksIG1heCk7XG5cdGNvbnN0IGdldCQxID0gKCkgPT4gY291bnQudmFsdWU7XG5cdGNvbnN0IHNldCQxID0gKHZhbCkgPT4gY291bnQudmFsdWUgPSBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsKSk7XG5cdGNvbnN0IHJlc2V0ID0gKHZhbCA9IF9pbml0aWFsVmFsdWUpID0+IHtcblx0XHRfaW5pdGlhbFZhbHVlID0gdmFsO1xuXHRcdHJldHVybiBzZXQkMSh2YWwpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdGNvdW50OiBzaGFsbG93UmVhZG9ubHkoY291bnQpLFxuXHRcdGluYyxcblx0XHRkZWMsXG5cdFx0Z2V0OiBnZXQkMSxcblx0XHRzZXQ6IHNldCQxLFxuXHRcdHJlc2V0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURhdGVGb3JtYXQvaW5kZXgudHNcbmNvbnN0IFJFR0VYX1BBUlNFID0gL14oXFxkezR9KVstL10/KFxcZHsxLDJ9KT9bLS9dPyhcXGR7MCwyfSlbVFxcc10qKFxcZHsxLDJ9KT86PyhcXGR7MSwyfSk/Oj8oXFxkezEsMn0pP1suOl0/KFxcZCspPyQvaTtcbmNvbnN0IFJFR0VYX0ZPUk1BVCA9IC9bWU1ESGhtc11vfFxcWyhbXlxcXV0rKVxcXXxZezEsNH18TXsxLDR9fER7MSwyfXxkezEsNH18SHsxLDJ9fGh7MSwyfXxhezEsMn18QXsxLDJ9fG17MSwyfXxzezEsMn18WnsxLDJ9fHp7MSw0fXxTU1MvZztcbmZ1bmN0aW9uIGRlZmF1bHRNZXJpZGllbShob3VycywgbWludXRlcywgaXNMb3dlcmNhc2UsIGhhc1BlcmlvZCkge1xuXHRsZXQgbSA9IGhvdXJzIDwgMTIgPyBcIkFNXCIgOiBcIlBNXCI7XG5cdGlmIChoYXNQZXJpb2QpIG0gPSBtLnNwbGl0KFwiXCIpLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MgKz0gYCR7Y3Vycn0uYCwgXCJcIik7XG5cdHJldHVybiBpc0xvd2VyY2FzZSA/IG0udG9Mb3dlckNhc2UoKSA6IG07XG59XG5mdW5jdGlvbiBmb3JtYXRPcmRpbmFsKG51bSkge1xuXHRjb25zdCBzdWZmaXhlcyA9IFtcblx0XHRcInRoXCIsXG5cdFx0XCJzdFwiLFxuXHRcdFwibmRcIixcblx0XHRcInJkXCJcblx0XTtcblx0Y29uc3QgdiA9IG51bSAlIDEwMDtcblx0cmV0dXJuIG51bSArIChzdWZmaXhlc1sodiAtIDIwKSAlIDEwXSB8fCBzdWZmaXhlc1t2XSB8fCBzdWZmaXhlc1swXSk7XG59XG5mdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUsIGZvcm1hdFN0ciwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRjdXN0b21NZXJpZGk7XG5cdGNvbnN0IHllYXJzID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHRjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcblx0Y29uc3QgZGF5cyA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHRjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcblx0Y29uc3QgbWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpO1xuXHRjb25zdCBzZWNvbmRzID0gZGF0ZS5nZXRTZWNvbmRzKCk7XG5cdGNvbnN0IG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG5cdGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF5KCk7XG5cdGNvbnN0IG1lcmlkaWVtID0gKF9vcHRpb25zJGN1c3RvbU1lcmlkaSA9IG9wdGlvbnMuY3VzdG9tTWVyaWRpZW0pICE9PSBudWxsICYmIF9vcHRpb25zJGN1c3RvbU1lcmlkaSAhPT0gdm9pZCAwID8gX29wdGlvbnMkY3VzdG9tTWVyaWRpIDogZGVmYXVsdE1lcmlkaWVtO1xuXHRjb25zdCBzdHJpcFRpbWVab25lID0gKGRhdGVTdHJpbmcpID0+IHtcblx0XHR2YXIgX2RhdGVTdHJpbmckc3BsaXQkO1xuXHRcdHJldHVybiAoX2RhdGVTdHJpbmckc3BsaXQkID0gZGF0ZVN0cmluZy5zcGxpdChcIiBcIilbMV0pICE9PSBudWxsICYmIF9kYXRlU3RyaW5nJHNwbGl0JCAhPT0gdm9pZCAwID8gX2RhdGVTdHJpbmckc3BsaXQkIDogXCJcIjtcblx0fTtcblx0Y29uc3QgbWF0Y2hlcyA9IHtcblx0XHRZbzogKCkgPT4gZm9ybWF0T3JkaW5hbCh5ZWFycyksXG5cdFx0WVk6ICgpID0+IFN0cmluZyh5ZWFycykuc2xpY2UoLTIpLFxuXHRcdFlZWVk6ICgpID0+IHllYXJzLFxuXHRcdE06ICgpID0+IG1vbnRoICsgMSxcblx0XHRNbzogKCkgPT4gZm9ybWF0T3JkaW5hbChtb250aCArIDEpLFxuXHRcdE1NOiAoKSA9PiBgJHttb250aCArIDF9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0TU1NOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgbW9udGg6IFwic2hvcnRcIiB9KSxcblx0XHRNTU1NOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgbW9udGg6IFwibG9uZ1wiIH0pLFxuXHRcdEQ6ICgpID0+IFN0cmluZyhkYXlzKSxcblx0XHREbzogKCkgPT4gZm9ybWF0T3JkaW5hbChkYXlzKSxcblx0XHRERDogKCkgPT4gYCR7ZGF5c31gLnBhZFN0YXJ0KDIsIFwiMFwiKSxcblx0XHRIOiAoKSA9PiBTdHJpbmcoaG91cnMpLFxuXHRcdEhvOiAoKSA9PiBmb3JtYXRPcmRpbmFsKGhvdXJzKSxcblx0XHRISDogKCkgPT4gYCR7aG91cnN9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0aDogKCkgPT4gYCR7aG91cnMgJSAxMiB8fCAxMn1gLnBhZFN0YXJ0KDEsIFwiMFwiKSxcblx0XHRobzogKCkgPT4gZm9ybWF0T3JkaW5hbChob3VycyAlIDEyIHx8IDEyKSxcblx0XHRoaDogKCkgPT4gYCR7aG91cnMgJSAxMiB8fCAxMn1gLnBhZFN0YXJ0KDIsIFwiMFwiKSxcblx0XHRtOiAoKSA9PiBTdHJpbmcobWludXRlcyksXG5cdFx0bW86ICgpID0+IGZvcm1hdE9yZGluYWwobWludXRlcyksXG5cdFx0bW06ICgpID0+IGAke21pbnV0ZXN9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0czogKCkgPT4gU3RyaW5nKHNlY29uZHMpLFxuXHRcdHNvOiAoKSA9PiBmb3JtYXRPcmRpbmFsKHNlY29uZHMpLFxuXHRcdHNzOiAoKSA9PiBgJHtzZWNvbmRzfWAucGFkU3RhcnQoMiwgXCIwXCIpLFxuXHRcdFNTUzogKCkgPT4gYCR7bWlsbGlzZWNvbmRzfWAucGFkU3RhcnQoMywgXCIwXCIpLFxuXHRcdGQ6ICgpID0+IGRheSxcblx0XHRkZDogKCkgPT4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IHdlZWtkYXk6IFwibmFycm93XCIgfSksXG5cdFx0ZGRkOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgd2Vla2RheTogXCJzaG9ydFwiIH0pLFxuXHRcdGRkZGQ6ICgpID0+IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB3ZWVrZGF5OiBcImxvbmdcIiB9KSxcblx0XHRBOiAoKSA9PiBtZXJpZGllbShob3VycywgbWludXRlcyksXG5cdFx0QUE6ICgpID0+IG1lcmlkaWVtKGhvdXJzLCBtaW51dGVzLCBmYWxzZSwgdHJ1ZSksXG5cdFx0YTogKCkgPT4gbWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIHRydWUpLFxuXHRcdGFhOiAoKSA9PiBtZXJpZGllbShob3VycywgbWludXRlcywgdHJ1ZSwgdHJ1ZSksXG5cdFx0ejogKCkgPT4gc3RyaXBUaW1lWm9uZShkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgdGltZVpvbmVOYW1lOiBcInNob3J0T2Zmc2V0XCIgfSkpLFxuXHRcdHp6OiAoKSA9PiBzdHJpcFRpbWVab25lKGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB0aW1lWm9uZU5hbWU6IFwic2hvcnRPZmZzZXRcIiB9KSksXG5cdFx0enp6OiAoKSA9PiBzdHJpcFRpbWVab25lKGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB0aW1lWm9uZU5hbWU6IFwic2hvcnRPZmZzZXRcIiB9KSksXG5cdFx0enp6ejogKCkgPT4gc3RyaXBUaW1lWm9uZShkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgdGltZVpvbmVOYW1lOiBcImxvbmdPZmZzZXRcIiB9KSlcblx0fTtcblx0cmV0dXJuIGZvcm1hdFN0ci5yZXBsYWNlKFJFR0VYX0ZPUk1BVCwgKG1hdGNoLCAkMSkgPT4ge1xuXHRcdHZhciBfcmVmLCBfbWF0Y2hlcyRtYXRjaDtcblx0XHRyZXR1cm4gKF9yZWYgPSAkMSAhPT0gbnVsbCAmJiAkMSAhPT0gdm9pZCAwID8gJDEgOiAoX21hdGNoZXMkbWF0Y2ggPSBtYXRjaGVzW21hdGNoXSkgPT09IG51bGwgfHwgX21hdGNoZXMkbWF0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9tYXRjaGVzJG1hdGNoLmNhbGwobWF0Y2hlcykpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBtYXRjaDtcblx0fSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVEYXRlKGRhdGUpIHtcblx0aWYgKGRhdGUgPT09IG51bGwpIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoTmFOKTtcblx0aWYgKGRhdGUgPT09IHZvaWQgMCkgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcblx0aWYgKHR5cGVvZiBkYXRlID09PSBcInN0cmluZ1wiICYmICEvWiQvaS50ZXN0KGRhdGUpKSB7XG5cdFx0Y29uc3QgZCA9IGRhdGUubWF0Y2goUkVHRVhfUEFSU0UpO1xuXHRcdGlmIChkKSB7XG5cdFx0XHRjb25zdCBtID0gZFsyXSAtIDEgfHwgMDtcblx0XHRcdGNvbnN0IG1zID0gKGRbN10gfHwgXCIwXCIpLnN1YnN0cmluZygwLCAzKTtcblx0XHRcdHJldHVybiBuZXcgRGF0ZShkWzFdLCBtLCBkWzNdIHx8IDEsIGRbNF0gfHwgMCwgZFs1XSB8fCAwLCBkWzZdIHx8IDAsIG1zKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xufVxuLyoqXG4qIEdldCB0aGUgZm9ybWF0dGVkIGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBzdHJpbmcgb2YgdG9rZW5zIHBhc3NlZCBpbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGF0ZUZvcm1hdFxuKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGZvcm1hdCwgY2FuIGVpdGhlciBiZSBhIGBEYXRlYCBvYmplY3QsIGEgdGltZXN0YW1wLCBvciBhIHN0cmluZ1xuKiBAcGFyYW0gZm9ybWF0U3RyIC0gVGhlIGNvbWJpbmF0aW9uIG9mIHRva2VucyB0byBmb3JtYXQgdGhlIGRhdGVcbiogQHBhcmFtIG9wdGlvbnMgLSBVc2VEYXRlRm9ybWF0T3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURhdGVGb3JtYXQoZGF0ZSwgZm9ybWF0U3RyID0gXCJISDptbTpzc1wiLCBvcHRpb25zID0ge30pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IGZvcm1hdERhdGUobm9ybWFsaXplRGF0ZSh0b1ZhbHVlKGRhdGUpKSwgdG9WYWx1ZShmb3JtYXRTdHIpLCBvcHRpb25zKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUludGVydmFsRm4vaW5kZXgudHNcbi8qKlxuKiBXcmFwcGVyIGZvciBgc2V0SW50ZXJ2YWxgIHdpdGggY29udHJvbHNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSW50ZXJ2YWxGblxuKiBAcGFyYW0gY2JcbiogQHBhcmFtIGludGVydmFsXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwgPSAxZTMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIGltbWVkaWF0ZUNhbGxiYWNrID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGxldCB0aW1lciA9IG51bGw7XG5cdGNvbnN0IGlzQWN0aXZlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGZ1bmN0aW9uIGNsZWFuKCkge1xuXHRcdGlmICh0aW1lcikge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbCh0aW1lcik7XG5cdFx0XHR0aW1lciA9IG51bGw7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHBhdXNlKCkge1xuXHRcdGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xlYW4oKTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoKSB7XG5cdFx0Y29uc3QgaW50ZXJ2YWxWYWx1ZSA9IHRvVmFsdWUoaW50ZXJ2YWwpO1xuXHRcdGlmIChpbnRlcnZhbFZhbHVlIDw9IDApIHJldHVybjtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG5cdFx0aWYgKGltbWVkaWF0ZUNhbGxiYWNrKSBjYigpO1xuXHRcdGNsZWFuKCk7XG5cdFx0aWYgKGlzQWN0aXZlLnZhbHVlKSB0aW1lciA9IHNldEludGVydmFsKGNiLCBpbnRlcnZhbFZhbHVlKTtcblx0fVxuXHRpZiAoaW1tZWRpYXRlICYmIGlzQ2xpZW50KSByZXN1bWUoKTtcblx0aWYgKGlzUmVmKGludGVydmFsKSB8fCB0eXBlb2YgaW50ZXJ2YWwgPT09IFwiZnVuY3Rpb25cIikgdHJ5T25TY29wZURpc3Bvc2Uod2F0Y2goaW50ZXJ2YWwsICgpID0+IHtcblx0XHRpZiAoaXNBY3RpdmUudmFsdWUgJiYgaXNDbGllbnQpIHJlc3VtZSgpO1xuXHR9KSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHBhdXNlKTtcblx0cmV0dXJuIHtcblx0XHRpc0FjdGl2ZTogc2hhbGxvd1JlYWRvbmx5KGlzQWN0aXZlKSxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlSW50ZXJ2YWwvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUludGVydmFsKGludGVydmFsID0gMWUzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBjb250cm9sczogZXhwb3NlQ29udHJvbHMgPSBmYWxzZSwgaW1tZWRpYXRlID0gdHJ1ZSwgY2FsbGJhY2sgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNvdW50ZXIgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCB1cGRhdGUgPSAoKSA9PiBjb3VudGVyLnZhbHVlICs9IDE7XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdGNvdW50ZXIudmFsdWUgPSAwO1xuXHR9O1xuXHRjb25zdCBjb250cm9scyA9IHVzZUludGVydmFsRm4oY2FsbGJhY2sgPyAoKSA9PiB7XG5cdFx0dXBkYXRlKCk7XG5cdFx0Y2FsbGJhY2soY291bnRlci52YWx1ZSk7XG5cdH0gOiB1cGRhdGUsIGludGVydmFsLCB7IGltbWVkaWF0ZSB9KTtcblx0aWYgKGV4cG9zZUNvbnRyb2xzKSByZXR1cm4ge1xuXHRcdGNvdW50ZXI6IHNoYWxsb3dSZWFkb25seShjb3VudGVyKSxcblx0XHRyZXNldCxcblx0XHQuLi5jb250cm9sc1xuXHR9O1xuXHRlbHNlIHJldHVybiBzaGFsbG93UmVhZG9ubHkoY291bnRlcik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUxhc3RDaGFuZ2VkL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VMYXN0Q2hhbmdlZChzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkaW5pdGlhbFZhbHVlO1xuXHRjb25zdCBtcyA9IHNoYWxsb3dSZWYoKF9vcHRpb25zJGluaXRpYWxWYWx1ZSA9IG9wdGlvbnMuaW5pdGlhbFZhbHVlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRpbml0aWFsVmFsdWUgIT09IHZvaWQgMCA/IF9vcHRpb25zJGluaXRpYWxWYWx1ZSA6IG51bGwpO1xuXHR3YXRjaChzb3VyY2UsICgpID0+IG1zLnZhbHVlID0gdGltZXN0YW1wKCksIG9wdGlvbnMpO1xuXHRyZXR1cm4gc2hhbGxvd1JlYWRvbmx5KG1zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZW91dEZuL2luZGV4LnRzXG4vKipcbiogV3JhcHBlciBmb3IgYHNldFRpbWVvdXRgIHdpdGggY29udHJvbHMuXG4qXG4qIEBwYXJhbSBjYlxuKiBAcGFyYW0gaW50ZXJ2YWxcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VUaW1lb3V0Rm4oY2IsIGludGVydmFsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBpbW1lZGlhdGVDYWxsYmFjayA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1BlbmRpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHRpbWVyO1xuXHRmdW5jdGlvbiBjbGVhcigpIHtcblx0XHRpZiAodGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHR0aW1lciA9IHZvaWQgMDtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gc3RvcCgpIHtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRjbGVhcigpO1xuXHR9XG5cdGZ1bmN0aW9uIHN0YXJ0KC4uLmFyZ3MpIHtcblx0XHRpZiAoaW1tZWRpYXRlQ2FsbGJhY2spIGNiKCk7XG5cdFx0Y2xlYXIoKTtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRpc1BlbmRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdHRpbWVyID0gdm9pZCAwO1xuXHRcdFx0Y2IoLi4uYXJncyk7XG5cdFx0fSwgdG9WYWx1ZShpbnRlcnZhbCkpO1xuXHR9XG5cdGlmIChpbW1lZGlhdGUpIHtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlmIChpc0NsaWVudCkgc3RhcnQoKTtcblx0fVxuXHR0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcblx0cmV0dXJuIHtcblx0XHRpc1BlbmRpbmc6IHNoYWxsb3dSZWFkb25seShpc1BlbmRpbmcpLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZW91dC9pbmRleC50c1xuZnVuY3Rpb24gdXNlVGltZW91dChpbnRlcnZhbCA9IDFlMywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIGNhbGxiYWNrIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjb250cm9scyA9IHVzZVRpbWVvdXRGbihjYWxsYmFjayAhPT0gbnVsbCAmJiBjYWxsYmFjayAhPT0gdm9pZCAwID8gY2FsbGJhY2sgOiBub29wLCBpbnRlcnZhbCwgb3B0aW9ucyk7XG5cdGNvbnN0IHJlYWR5ID0gY29tcHV0ZWQoKCkgPT4gIWNvbnRyb2xzLmlzUGVuZGluZy52YWx1ZSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHRyZWFkeSxcblx0XHQuLi5jb250cm9sc1xuXHR9O1xuXHRlbHNlIHJldHVybiByZWFkeTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVG9OdW1iZXIvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IGNvbnZlcnQgYSBzdHJpbmcgcmVmIHRvIG51bWJlci5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUb051bWJlcih2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbWV0aG9kID0gXCJwYXJzZUZsb2F0XCIsIHJhZGl4LCBuYW5Ub1plcm8gfSA9IG9wdGlvbnM7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0bGV0IHJlc29sdmVkID0gdG9WYWx1ZSh2YWx1ZSk7XG5cdFx0aWYgKHR5cGVvZiBtZXRob2QgPT09IFwiZnVuY3Rpb25cIikgcmVzb2x2ZWQgPSBtZXRob2QocmVzb2x2ZWQpO1xuXHRcdGVsc2UgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJzdHJpbmdcIikgcmVzb2x2ZWQgPSBOdW1iZXJbbWV0aG9kXShyZXNvbHZlZCwgcmFkaXgpO1xuXHRcdGlmIChuYW5Ub1plcm8gJiYgTnVtYmVyLmlzTmFOKHJlc29sdmVkKSkgcmVzb2x2ZWQgPSAwO1xuXHRcdHJldHVybiByZXNvbHZlZDtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRvU3RyaW5nL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBjb252ZXJ0IGEgcmVmIHRvIHN0cmluZy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVG9TdHJpbmdcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUb1N0cmluZyh2YWx1ZSkge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gYCR7dG9WYWx1ZSh2YWx1ZSl9YCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRvZ2dsZS9pbmRleC50c1xuLyoqXG4qIEEgYm9vbGVhbiByZWYgd2l0aCBhIHRvZ2dsZXJcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVG9nZ2xlXG4qIEBwYXJhbSBbaW5pdGlhbFZhbHVlXVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVRvZ2dsZShpbml0aWFsVmFsdWUgPSBmYWxzZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdHJ1dGh5VmFsdWUgPSB0cnVlLCBmYWxzeVZhbHVlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHZhbHVlSXNSZWYgPSBpc1JlZihpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBfdmFsdWUgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGZ1bmN0aW9uIHRvZ2dsZSh2YWx1ZSkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRfdmFsdWUudmFsdWUgPSB2YWx1ZTtcblx0XHRcdHJldHVybiBfdmFsdWUudmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHRydXRoeSA9IHRvVmFsdWUodHJ1dGh5VmFsdWUpO1xuXHRcdFx0X3ZhbHVlLnZhbHVlID0gX3ZhbHVlLnZhbHVlID09PSB0cnV0aHkgPyB0b1ZhbHVlKGZhbHN5VmFsdWUpIDogdHJ1dGh5O1xuXHRcdFx0cmV0dXJuIF92YWx1ZS52YWx1ZTtcblx0XHR9XG5cdH1cblx0aWYgKHZhbHVlSXNSZWYpIHJldHVybiB0b2dnbGU7XG5cdGVsc2UgcmV0dXJuIFtfdmFsdWUsIHRvZ2dsZV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoQXJyYXkvaW5kZXgudHNcbi8qKlxuKiBXYXRjaCBmb3IgYW4gYXJyYXkgd2l0aCBhZGRpdGlvbnMgYW5kIHJlbW92YWxzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy93YXRjaEFycmF5XG4qL1xuZnVuY3Rpb24gd2F0Y2hBcnJheShzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG5cdGxldCBvbGRMaXN0ID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbW1lZGlhdGUpID8gW10gOiBbLi4udHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiID8gc291cmNlKCkgOiBBcnJheS5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UgOiB0b1ZhbHVlKHNvdXJjZSldO1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCAobmV3TGlzdCwgXywgb25DbGVhbnVwKSA9PiB7XG5cdFx0Y29uc3Qgb2xkTGlzdFJlbWFpbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBvbGRMaXN0Lmxlbmd0aCB9KTtcblx0XHRjb25zdCBhZGRlZCA9IFtdO1xuXHRcdGZvciAoY29uc3Qgb2JqIG9mIG5ld0xpc3QpIHtcblx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvbGRMaXN0Lmxlbmd0aDsgaSsrKSBpZiAoIW9sZExpc3RSZW1haW5zW2ldICYmIG9iaiA9PT0gb2xkTGlzdFtpXSkge1xuXHRcdFx0XHRvbGRMaXN0UmVtYWluc1tpXSA9IHRydWU7XG5cdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWZvdW5kKSBhZGRlZC5wdXNoKG9iaik7XG5cdFx0fVxuXHRcdGNvbnN0IHJlbW92ZWQgPSBvbGRMaXN0LmZpbHRlcigoXyQxLCBpKSA9PiAhb2xkTGlzdFJlbWFpbnNbaV0pO1xuXHRcdGNiKG5ld0xpc3QsIG9sZExpc3QsIGFkZGVkLCByZW1vdmVkLCBvbkNsZWFudXApO1xuXHRcdG9sZExpc3QgPSBbLi4ubmV3TGlzdF07XG5cdH0sIG9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaEF0TW9zdC9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hBdE1vc3Qoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRjb25zdCB7IGNvdW50LC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0Y29uc3QgY3VycmVudCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHsgc3RvcCwgcmVzdW1lLCBwYXVzZSB9ID0gd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgKC4uLmFyZ3MpID0+IHtcblx0XHRjdXJyZW50LnZhbHVlICs9IDE7XG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPj0gdG9WYWx1ZShjb3VudCkpIG5leHRUaWNrKCgpID0+IHN0b3AoKSk7XG5cdFx0Y2IoLi4uYXJncyk7XG5cdH0sIHdhdGNoT3B0aW9ucyk7XG5cdHJldHVybiB7XG5cdFx0Y291bnQ6IGN1cnJlbnQsXG5cdFx0c3RvcCxcblx0XHRyZXN1bWUsXG5cdFx0cGF1c2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hEZWJvdW5jZWQvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoRGVib3VuY2VkKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRlYm91bmNlID0gMCwgbWF4V2FpdCA9IHZvaWQgMCwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB3YXRjaFdpdGhGaWx0ZXIoc291cmNlLCBjYiwge1xuXHRcdC4uLndhdGNoT3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogZGVib3VuY2VGaWx0ZXIoZGVib3VuY2UsIHsgbWF4V2FpdCB9KVxuXHR9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHdhdGNoRGVib3VuY2VkYCBpbnN0ZWFkICovXG5jb25zdCBkZWJvdW5jZWRXYXRjaCA9IHdhdGNoRGVib3VuY2VkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaERlZXAvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHdhdGNoaW5nIHZhbHVlIHdpdGgge2RlZXA6IHRydWV9XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3dhdGNoRGVlcFxuKi9cbmZ1bmN0aW9uIHdhdGNoRGVlcChzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG5cdHJldHVybiB3YXRjaChzb3VyY2UsIGNiLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRkZWVwOiB0cnVlXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaElnbm9yYWJsZS9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hJZ25vcmFibGUoc291cmNlLCBjYiwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZXZlbnRGaWx0ZXIgPSBieXBhc3NGaWx0ZXIsLi4ud2F0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRjb25zdCBmaWx0ZXJlZENiID0gY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgY2IpO1xuXHRsZXQgaWdub3JlVXBkYXRlcztcblx0bGV0IGlnbm9yZVByZXZBc3luY1VwZGF0ZXM7XG5cdGxldCBzdG9wO1xuXHRpZiAod2F0Y2hPcHRpb25zLmZsdXNoID09PSBcInN5bmNcIikge1xuXHRcdGxldCBpZ25vcmUgPSBmYWxzZTtcblx0XHRpZ25vcmVQcmV2QXN5bmNVcGRhdGVzID0gKCkgPT4ge307XG5cdFx0aWdub3JlVXBkYXRlcyA9ICh1cGRhdGVyKSA9PiB7XG5cdFx0XHRpZ25vcmUgPSB0cnVlO1xuXHRcdFx0dXBkYXRlcigpO1xuXHRcdFx0aWdub3JlID0gZmFsc2U7XG5cdFx0fTtcblx0XHRzdG9wID0gd2F0Y2goc291cmNlLCAoLi4uYXJncykgPT4ge1xuXHRcdFx0aWYgKCFpZ25vcmUpIGZpbHRlcmVkQ2IoLi4uYXJncyk7XG5cdFx0fSwgd2F0Y2hPcHRpb25zKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBkaXNwb3NhYmxlcyA9IFtdO1xuXHRcdGxldCBpZ25vcmVDb3VudGVyID0gMDtcblx0XHRsZXQgc3luY0NvdW50ZXIgPSAwO1xuXHRcdGlnbm9yZVByZXZBc3luY1VwZGF0ZXMgPSAoKSA9PiB7XG5cdFx0XHRpZ25vcmVDb3VudGVyID0gc3luY0NvdW50ZXI7XG5cdFx0fTtcblx0XHRkaXNwb3NhYmxlcy5wdXNoKHdhdGNoKHNvdXJjZSwgKCkgPT4ge1xuXHRcdFx0c3luY0NvdW50ZXIrKztcblx0XHR9LCB7XG5cdFx0XHQuLi53YXRjaE9wdGlvbnMsXG5cdFx0XHRmbHVzaDogXCJzeW5jXCJcblx0XHR9KSk7XG5cdFx0aWdub3JlVXBkYXRlcyA9ICh1cGRhdGVyKSA9PiB7XG5cdFx0XHRjb25zdCBzeW5jQ291bnRlclByZXYgPSBzeW5jQ291bnRlcjtcblx0XHRcdHVwZGF0ZXIoKTtcblx0XHRcdGlnbm9yZUNvdW50ZXIgKz0gc3luY0NvdW50ZXIgLSBzeW5jQ291bnRlclByZXY7XG5cdFx0fTtcblx0XHRkaXNwb3NhYmxlcy5wdXNoKHdhdGNoKHNvdXJjZSwgKC4uLmFyZ3MpID0+IHtcblx0XHRcdGNvbnN0IGlnbm9yZSA9IGlnbm9yZUNvdW50ZXIgPiAwICYmIGlnbm9yZUNvdW50ZXIgPT09IHN5bmNDb3VudGVyO1xuXHRcdFx0aWdub3JlQ291bnRlciA9IDA7XG5cdFx0XHRzeW5jQ291bnRlciA9IDA7XG5cdFx0XHRpZiAoaWdub3JlKSByZXR1cm47XG5cdFx0XHRmaWx0ZXJlZENiKC4uLmFyZ3MpO1xuXHRcdH0sIHdhdGNoT3B0aW9ucykpO1xuXHRcdHN0b3AgPSAoKSA9PiB7XG5cdFx0XHRkaXNwb3NhYmxlcy5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG5cdFx0fTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHN0b3AsXG5cdFx0aWdub3JlVXBkYXRlcyxcblx0XHRpZ25vcmVQcmV2QXN5bmNVcGRhdGVzXG5cdH07XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGB3YXRjaElnbm9yYWJsZWAgaW5zdGVhZCAqL1xuY29uc3QgaWdub3JhYmxlV2F0Y2ggPSB3YXRjaElnbm9yYWJsZTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hJbW1lZGlhdGUvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHdhdGNoaW5nIHZhbHVlIHdpdGgge2ltbWVkaWF0ZTogdHJ1ZX1cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvd2F0Y2hJbW1lZGlhdGVcbiovXG5mdW5jdGlvbiB3YXRjaEltbWVkaWF0ZShzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG5cdHJldHVybiB3YXRjaChzb3VyY2UsIGNiLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRpbW1lZGlhdGU6IHRydWVcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoT25jZS9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3Igd2F0Y2hpbmcgdmFsdWUgd2l0aCB7IG9uY2U6IHRydWUgfVxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy93YXRjaE9uY2VcbiovXG5mdW5jdGlvbiB3YXRjaE9uY2Uoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCBjYiwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0b25jZTogdHJ1ZVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hUaHJvdHRsZWQvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoVGhyb3R0bGVkKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocm90dGxlID0gMCwgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB3YXRjaFdpdGhGaWx0ZXIoc291cmNlLCBjYiwge1xuXHRcdC4uLndhdGNoT3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogdGhyb3R0bGVGaWx0ZXIodGhyb3R0bGUsIHRyYWlsaW5nLCBsZWFkaW5nKVxuXHR9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHdhdGNoVGhyb3R0bGVkYCBpbnN0ZWFkICovXG5jb25zdCB0aHJvdHRsZWRXYXRjaCA9IHdhdGNoVGhyb3R0bGVkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaFRyaWdnZXJhYmxlL2luZGV4LnRzXG5mdW5jdGlvbiB3YXRjaFRyaWdnZXJhYmxlKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgY2xlYW51cEZuO1xuXHRmdW5jdGlvbiBvbkVmZmVjdCgpIHtcblx0XHRpZiAoIWNsZWFudXBGbikgcmV0dXJuO1xuXHRcdGNvbnN0IGZuID0gY2xlYW51cEZuO1xuXHRcdGNsZWFudXBGbiA9IHZvaWQgMDtcblx0XHRmbigpO1xuXHR9XG5cdC8qKiBSZWdpc3RlciB0aGUgZnVuY3Rpb24gYGNsZWFudXBGbmAgKi9cblx0ZnVuY3Rpb24gb25DbGVhbnVwKGNhbGxiYWNrKSB7XG5cdFx0Y2xlYW51cEZuID0gY2FsbGJhY2s7XG5cdH1cblx0Y29uc3QgX2NiID0gKHZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xuXHRcdG9uRWZmZWN0KCk7XG5cdFx0cmV0dXJuIGNiKHZhbHVlLCBvbGRWYWx1ZSwgb25DbGVhbnVwKTtcblx0fTtcblx0Y29uc3QgcmVzID0gd2F0Y2hJZ25vcmFibGUoc291cmNlLCBfY2IsIG9wdGlvbnMpO1xuXHRjb25zdCB7IGlnbm9yZVVwZGF0ZXMgfSA9IHJlcztcblx0Y29uc3QgdHJpZ2dlciA9ICgpID0+IHtcblx0XHRsZXQgcmVzJDE7XG5cdFx0aWdub3JlVXBkYXRlcygoKSA9PiB7XG5cdFx0XHRyZXMkMSA9IF9jYihnZXRXYXRjaFNvdXJjZXMoc291cmNlKSwgZ2V0T2xkVmFsdWUoc291cmNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHJlcyQxO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdC4uLnJlcyxcblx0XHR0cmlnZ2VyXG5cdH07XG59XG5mdW5jdGlvbiBnZXRXYXRjaFNvdXJjZXMoc291cmNlcykge1xuXHRpZiAoaXNSZWFjdGl2ZShzb3VyY2VzKSkgcmV0dXJuIHNvdXJjZXM7XG5cdGlmIChBcnJheS5pc0FycmF5KHNvdXJjZXMpKSByZXR1cm4gc291cmNlcy5tYXAoKGl0ZW0pID0+IHRvVmFsdWUoaXRlbSkpO1xuXHRyZXR1cm4gdG9WYWx1ZShzb3VyY2VzKTtcbn1cbmZ1bmN0aW9uIGdldE9sZFZhbHVlKHNvdXJjZSkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheShzb3VyY2UpID8gc291cmNlLm1hcCgoKSA9PiB2b2lkIDApIDogdm9pZCAwO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3aGVuZXZlci9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3Igd2F0Y2hpbmcgdmFsdWUgdG8gYmUgdHJ1dGh5XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3doZW5ldmVyXG4qL1xuZnVuY3Rpb24gd2hlbmV2ZXIoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRjb25zdCBzdG9wID0gd2F0Y2goc291cmNlLCAodiwgb3YsIG9uSW52YWxpZGF0ZSkgPT4ge1xuXHRcdGlmICh2KSB7XG5cdFx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9uY2UpIG5leHRUaWNrKCgpID0+IHN0b3AoKSk7XG5cdFx0XHRjYih2LCBvdiwgb25JbnZhbGlkYXRlKTtcblx0XHR9XG5cdH0sIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdG9uY2U6IGZhbHNlXG5cdH0pO1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBhc3NlcnQsIGF1dG9SZXNldFJlZiwgYnlwYXNzRmlsdGVyLCBjYW1lbGl6ZSwgY2xhbXAsIGNvbXB1dGVkRWFnZXIsIGNvbXB1dGVkV2l0aENvbnRyb2wsIGNvbnRhaW5zUHJvcCwgY29udHJvbGxlZENvbXB1dGVkLCBjb250cm9sbGVkUmVmLCBjcmVhdGVFdmVudEhvb2ssIGNyZWF0ZUZpbHRlcldyYXBwZXIsIGNyZWF0ZUdsb2JhbFN0YXRlLCBjcmVhdGVJbmplY3Rpb25TdGF0ZSwgY3JlYXRlUmVhY3RpdmVGbiwgY3JlYXRlUmVmLCBjcmVhdGVTaGFyZWRDb21wb3NhYmxlLCBjcmVhdGVTaW5nbGV0b25Qcm9taXNlLCBkZWJvdW5jZUZpbHRlciwgZGVib3VuY2VkUmVmLCBkZWJvdW5jZWRXYXRjaCwgZWFnZXJDb21wdXRlZCwgZXh0ZW5kUmVmLCBmb3JtYXREYXRlLCBnZXQsIGdldExpZmVDeWNsZVRhcmdldCwgaGFzT3duLCBoeXBoZW5hdGUsIGlkZW50aXR5LCBpZ25vcmFibGVXYXRjaCwgaW5jcmVhc2VXaXRoVW5pdCwgaW5qZWN0TG9jYWwsIGludm9rZSwgaXNDbGllbnQsIGlzRGVmLCBpc0RlZmluZWQsIGlzSU9TLCBpc09iamVjdCwgaXNXb3JrZXIsIG1ha2VEZXN0cnVjdHVyYWJsZSwgbm9vcCwgbm9ybWFsaXplRGF0ZSwgbm90TnVsbGlzaCwgbm93LCBvYmplY3RFbnRyaWVzLCBvYmplY3RPbWl0LCBvYmplY3RQaWNrLCBwYXVzYWJsZUZpbHRlciwgcGF1c2FibGVXYXRjaCwgcHJvbWlzZVRpbWVvdXQsIHByb3ZpZGVMb2NhbCwgcHhWYWx1ZSwgcmFuZCwgcmVhY3RpZnksIHJlYWN0aWZ5T2JqZWN0LCByZWFjdGl2ZUNvbXB1dGVkLCByZWFjdGl2ZU9taXQsIHJlYWN0aXZlUGljaywgcmVmQXV0b1Jlc2V0LCByZWZEZWJvdW5jZWQsIHJlZkRlZmF1bHQsIHJlZk1hbnVhbFJlc2V0LCByZWZUaHJvdHRsZWQsIHJlZldpdGhDb250cm9sLCBzZXQsIHN5bmNSZWYsIHN5bmNSZWZzLCB0aHJvdHRsZUZpbHRlciwgdGhyb3R0bGVkUmVmLCB0aHJvdHRsZWRXYXRjaCwgdGltZXN0YW1wLCB0b0FycmF5LCB0b1JlYWN0aXZlLCB0b1JlZiwgdG9SZWZzLCB0cnlPbkJlZm9yZU1vdW50LCB0cnlPbkJlZm9yZVVubW91bnQsIHRyeU9uTW91bnRlZCwgdHJ5T25TY29wZURpc3Bvc2UsIHRyeU9uVW5tb3VudGVkLCB1bnRpbCwgdXNlQXJyYXlEaWZmZXJlbmNlLCB1c2VBcnJheUV2ZXJ5LCB1c2VBcnJheUZpbHRlciwgdXNlQXJyYXlGaW5kLCB1c2VBcnJheUZpbmRJbmRleCwgdXNlQXJyYXlGaW5kTGFzdCwgdXNlQXJyYXlJbmNsdWRlcywgdXNlQXJyYXlKb2luLCB1c2VBcnJheU1hcCwgdXNlQXJyYXlSZWR1Y2UsIHVzZUFycmF5U29tZSwgdXNlQXJyYXlVbmlxdWUsIHVzZUNvdW50ZXIsIHVzZURhdGVGb3JtYXQsIHVzZURlYm91bmNlLCB1c2VEZWJvdW5jZUZuLCB1c2VJbnRlcnZhbCwgdXNlSW50ZXJ2YWxGbiwgdXNlTGFzdENoYW5nZWQsIHVzZVRocm90dGxlLCB1c2VUaHJvdHRsZUZuLCB1c2VUaW1lb3V0LCB1c2VUaW1lb3V0Rm4sIHVzZVRvTnVtYmVyLCB1c2VUb1N0cmluZywgdXNlVG9nZ2xlLCB3YXRjaEFycmF5LCB3YXRjaEF0TW9zdCwgd2F0Y2hEZWJvdW5jZWQsIHdhdGNoRGVlcCwgd2F0Y2hJZ25vcmFibGUsIHdhdGNoSW1tZWRpYXRlLCB3YXRjaE9uY2UsIHdhdGNoUGF1c2FibGUsIHdhdGNoVGhyb3R0bGVkLCB3YXRjaFRyaWdnZXJhYmxlLCB3YXRjaFdpdGhGaWx0ZXIsIHdoZW5ldmVyIH07IiwiaW1wb3J0IHsgYnlwYXNzRmlsdGVyLCBjYW1lbGl6ZSwgY2xhbXAsIGNvbXB1dGVkV2l0aENvbnRyb2wsIGNvbnRhaW5zUHJvcCwgY3JlYXRlRXZlbnRIb29rLCBjcmVhdGVGaWx0ZXJXcmFwcGVyLCBjcmVhdGVSZWYsIGNyZWF0ZVNpbmdsZXRvblByb21pc2UsIGRlYm91bmNlRmlsdGVyLCBoYXNPd24sIGlkZW50aXR5LCBpbmNyZWFzZVdpdGhVbml0LCBpbmplY3RMb2NhbCwgaXNDbGllbnQsIGlzRGVmLCBpc0lPUywgaXNPYmplY3QsIGlzV29ya2VyLCBtYWtlRGVzdHJ1Y3R1cmFibGUsIG5vb3AsIG5vdE51bGxpc2gsIG9iamVjdEVudHJpZXMsIG9iamVjdE9taXQsIG9iamVjdFBpY2ssIHBhdXNhYmxlRmlsdGVyLCBwcm9taXNlVGltZW91dCwgcHJvdmlkZUxvY2FsLCBweFZhbHVlLCBzeW5jUmVmLCB0aHJvdHRsZUZpbHRlciwgdGltZXN0YW1wLCB0b0FycmF5LCB0b1JlZiwgdG9SZWZzLCB0cnlPbk1vdW50ZWQsIHRyeU9uU2NvcGVEaXNwb3NlLCB0cnlPblVubW91bnRlZCwgdW50aWwsIHVzZURlYm91bmNlRm4sIHVzZUludGVydmFsRm4sIHVzZVRocm90dGxlRm4sIHVzZVRpbWVvdXRGbiwgd2F0Y2hJZ25vcmFibGUsIHdhdGNoSW1tZWRpYXRlLCB3YXRjaE9uY2UsIHdhdGNoUGF1c2FibGUsIHdhdGNoV2l0aEZpbHRlciwgd2hlbmV2ZXIgfSBmcm9tIFwiQHZ1ZXVzZS9zaGFyZWRcIjtcbmltcG9ydCB7IEZyYWdtZW50LCBUcmFuc2l0aW9uR3JvdXAsIGNvbXB1dGVkLCBjdXN0b21SZWYsIGRlZmluZUNvbXBvbmVudCwgZ2V0Q3VycmVudEluc3RhbmNlLCBnZXRDdXJyZW50U2NvcGUsIGgsIGhhc0luamVjdGlvbkNvbnRleHQsIGluamVjdCwgaXNSZWFkb25seSwgaXNSZWYsIG1hcmtSYXcsIG5leHRUaWNrLCBvbkJlZm9yZVVwZGF0ZSwgb25Nb3VudGVkLCBvblVwZGF0ZWQsIHJlYWN0aXZlLCByZWFkb25seSwgcmVmLCBzaGFsbG93UmVhY3RpdmUsIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgdG9SYXcsIHRvVmFsdWUsIHVucmVmLCB3YXRjaCwgd2F0Y2hFZmZlY3QgfSBmcm9tIFwidnVlXCI7XG5cbmV4cG9ydCAqIGZyb20gXCJAdnVldXNlL3NoYXJlZFwiXG5cbi8vI3JlZ2lvbiBjb21wdXRlZEFzeW5jL2luZGV4LnRzXG5mdW5jdGlvbiBjb21wdXRlZEFzeW5jKGV2YWx1YXRpb25DYWxsYmFjaywgaW5pdGlhbFN0YXRlLCBvcHRpb25zT3JSZWYpIHtcblx0dmFyIF9nbG9iYWxUaGlzJHJlcG9ydEVycjtcblx0bGV0IG9wdGlvbnM7XG5cdGlmIChpc1JlZihvcHRpb25zT3JSZWYpKSBvcHRpb25zID0geyBldmFsdWF0aW5nOiBvcHRpb25zT3JSZWYgfTtcblx0ZWxzZSBvcHRpb25zID0gb3B0aW9uc09yUmVmIHx8IHt9O1xuXHRjb25zdCB7IGxhenkgPSBmYWxzZSwgZmx1c2ggPSBcInN5bmNcIiwgZXZhbHVhdGluZyA9IHZvaWQgMCwgc2hhbGxvdyA9IHRydWUsIG9uRXJyb3IgPSAoX2dsb2JhbFRoaXMkcmVwb3J0RXJyID0gZ2xvYmFsVGhpcy5yZXBvcnRFcnJvcikgIT09IG51bGwgJiYgX2dsb2JhbFRoaXMkcmVwb3J0RXJyICE9PSB2b2lkIDAgPyBfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgOiBub29wIH0gPSBvcHRpb25zO1xuXHRjb25zdCBzdGFydGVkID0gc2hhbGxvd1JlZighbGF6eSk7XG5cdGNvbnN0IGN1cnJlbnQgPSBzaGFsbG93ID8gc2hhbGxvd1JlZihpbml0aWFsU3RhdGUpIDogcmVmKGluaXRpYWxTdGF0ZSk7XG5cdGxldCBjb3VudGVyID0gMDtcblx0d2F0Y2hFZmZlY3QoYXN5bmMgKG9uSW52YWxpZGF0ZSkgPT4ge1xuXHRcdGlmICghc3RhcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGNvdW50ZXIrKztcblx0XHRjb25zdCBjb3VudGVyQXRCZWdpbm5pbmcgPSBjb3VudGVyO1xuXHRcdGxldCBoYXNGaW5pc2hlZCA9IGZhbHNlO1xuXHRcdGlmIChldmFsdWF0aW5nKSBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcblx0XHRcdGV2YWx1YXRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBldmFsdWF0aW9uQ2FsbGJhY2soKGNhbmNlbENhbGxiYWNrKSA9PiB7XG5cdFx0XHRcdG9uSW52YWxpZGF0ZSgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGV2YWx1YXRpbmcpIGV2YWx1YXRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAoIWhhc0ZpbmlzaGVkKSBjYW5jZWxDYWxsYmFjaygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGNvdW50ZXJBdEJlZ2lubmluZyA9PT0gY291bnRlcikgY3VycmVudC52YWx1ZSA9IHJlc3VsdDtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoZXZhbHVhdGluZyAmJiBjb3VudGVyQXRCZWdpbm5pbmcgPT09IGNvdW50ZXIpIGV2YWx1YXRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdGhhc0ZpbmlzaGVkID0gdHJ1ZTtcblx0XHR9XG5cdH0sIHsgZmx1c2ggfSk7XG5cdGlmIChsYXp5KSByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHN0YXJ0ZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBjdXJyZW50LnZhbHVlO1xuXHR9KTtcblx0ZWxzZSByZXR1cm4gY3VycmVudDtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYGNvbXB1dGVkQXN5bmNgIGluc3RlYWQgKi9cbmNvbnN0IGFzeW5jQ29tcHV0ZWQgPSBjb21wdXRlZEFzeW5jO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjb21wdXRlZEluamVjdC9pbmRleC50c1xuZnVuY3Rpb24gY29tcHV0ZWRJbmplY3Qoa2V5LCBvcHRpb25zLCBkZWZhdWx0U291cmNlLCB0cmVhdERlZmF1bHRBc0ZhY3RvcnkpIHtcblx0bGV0IHNvdXJjZSA9IGluamVjdChrZXkpO1xuXHRpZiAoZGVmYXVsdFNvdXJjZSkgc291cmNlID0gaW5qZWN0KGtleSwgZGVmYXVsdFNvdXJjZSk7XG5cdGlmICh0cmVhdERlZmF1bHRBc0ZhY3RvcnkpIHNvdXJjZSA9IGluamVjdChrZXksIGRlZmF1bHRTb3VyY2UsIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSk7XG5cdGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gY29tcHV0ZWQoKG9sZFZhbHVlKSA9PiBvcHRpb25zKHNvdXJjZSwgb2xkVmFsdWUpKTtcblx0ZWxzZSByZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldDogKG9sZFZhbHVlKSA9PiBvcHRpb25zLmdldChzb3VyY2UsIG9sZFZhbHVlKSxcblx0XHRzZXQ6IG9wdGlvbnMuc2V0XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVSZXVzYWJsZVRlbXBsYXRlL2luZGV4LnRzXG4vKipcbiogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGBkZWZpbmVgIGFuZCBgcmV1c2VgIGNvbXBvbmVudHMgaW4gcGFpcixcbiogSXQgYWxzbyBhbGxvdyB0byBwYXNzIGEgZ2VuZXJpYyB0byBiaW5kIHdpdGggdHlwZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlUmV1c2FibGVUZW1wbGF0ZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldXNhYmxlVGVtcGxhdGUob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5oZXJpdEF0dHJzID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcmVuZGVyID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBkZWZpbmUgPSBkZWZpbmVDb21wb25lbnQoeyBzZXR1cChfLCB7IHNsb3RzIH0pIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0cmVuZGVyLnZhbHVlID0gc2xvdHMuZGVmYXVsdDtcblx0XHR9O1xuXHR9IH0pO1xuXHRjb25zdCByZXVzZSA9IGRlZmluZUNvbXBvbmVudCh7XG5cdFx0aW5oZXJpdEF0dHJzLFxuXHRcdHByb3BzOiBvcHRpb25zLnByb3BzLFxuXHRcdHNldHVwKHByb3BzLCB7IGF0dHJzLCBzbG90cyB9KSB7XG5cdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHR2YXIgX3JlbmRlciR2YWx1ZTtcblx0XHRcdFx0aWYgKCFyZW5kZXIudmFsdWUgJiYgdHJ1ZSkgdGhyb3cgbmV3IEVycm9yKFwiW1Z1ZVVzZV0gRmFpbGVkIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gb2YgcmV1c2FibGUgdGVtcGxhdGVcIik7XG5cdFx0XHRcdGNvbnN0IHZub2RlID0gKF9yZW5kZXIkdmFsdWUgPSByZW5kZXIudmFsdWUpID09PSBudWxsIHx8IF9yZW5kZXIkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yZW5kZXIkdmFsdWUuY2FsbChyZW5kZXIsIHtcblx0XHRcdFx0XHQuLi5vcHRpb25zLnByb3BzID09IG51bGwgPyBrZXlzVG9DYW1lbEtlYmFiQ2FzZShhdHRycykgOiBwcm9wcyxcblx0XHRcdFx0XHQkc2xvdHM6IHNsb3RzXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gaW5oZXJpdEF0dHJzICYmICh2bm9kZSA9PT0gbnVsbCB8fCB2bm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdm5vZGUubGVuZ3RoKSA9PT0gMSA/IHZub2RlWzBdIDogdm5vZGU7XG5cdFx0XHR9O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBtYWtlRGVzdHJ1Y3R1cmFibGUoe1xuXHRcdGRlZmluZSxcblx0XHRyZXVzZVxuXHR9LCBbZGVmaW5lLCByZXVzZV0pO1xufVxuZnVuY3Rpb24ga2V5c1RvQ2FtZWxLZWJhYkNhc2Uob2JqKSB7XG5cdGNvbnN0IG5ld09iaiA9IHt9O1xuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmopIG5ld09ialtjYW1lbGl6ZShrZXkpXSA9IG9ialtrZXldO1xuXHRyZXR1cm4gbmV3T2JqO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVUZW1wbGF0ZVByb21pc2UvaW5kZXgudHNcbi8qKlxuKiBDcmVhdGVzIGEgdGVtcGxhdGUgcHJvbWlzZSBjb21wb25lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZVRlbXBsYXRlUHJvbWlzZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVRlbXBsYXRlUHJvbWlzZShvcHRpb25zID0ge30pIHtcblx0bGV0IGluZGV4ID0gMDtcblx0Y29uc3QgaW5zdGFuY2VzID0gcmVmKFtdKTtcblx0ZnVuY3Rpb24gY3JlYXRlKC4uLmFyZ3MpIHtcblx0XHRjb25zdCBwcm9wcyA9IHNoYWxsb3dSZWFjdGl2ZSh7XG5cdFx0XHRrZXk6IGluZGV4KyssXG5cdFx0XHRhcmdzLFxuXHRcdFx0cHJvbWlzZTogdm9pZCAwLFxuXHRcdFx0cmVzb2x2ZTogKCkgPT4ge30sXG5cdFx0XHRyZWplY3Q6ICgpID0+IHt9LFxuXHRcdFx0aXNSZXNvbHZpbmc6IGZhbHNlLFxuXHRcdFx0b3B0aW9uc1xuXHRcdH0pO1xuXHRcdGluc3RhbmNlcy52YWx1ZS5wdXNoKHByb3BzKTtcblx0XHRwcm9wcy5wcm9taXNlID0gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG5cdFx0XHRwcm9wcy5yZXNvbHZlID0gKHYpID0+IHtcblx0XHRcdFx0cHJvcHMuaXNSZXNvbHZpbmcgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gX3Jlc29sdmUodik7XG5cdFx0XHR9O1xuXHRcdFx0cHJvcHMucmVqZWN0ID0gX3JlamVjdDtcblx0XHR9KS5maW5hbGx5KCgpID0+IHtcblx0XHRcdHByb3BzLnByb21pc2UgPSB2b2lkIDA7XG5cdFx0XHRjb25zdCBpbmRleCQxID0gaW5zdGFuY2VzLnZhbHVlLmluZGV4T2YocHJvcHMpO1xuXHRcdFx0aWYgKGluZGV4JDEgIT09IC0xKSBpbnN0YW5jZXMudmFsdWUuc3BsaWNlKGluZGV4JDEsIDEpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcm9wcy5wcm9taXNlO1xuXHR9XG5cdGZ1bmN0aW9uIHN0YXJ0KC4uLmFyZ3MpIHtcblx0XHRpZiAob3B0aW9ucy5zaW5nbGV0b24gJiYgaW5zdGFuY2VzLnZhbHVlLmxlbmd0aCA+IDApIHJldHVybiBpbnN0YW5jZXMudmFsdWVbMF0ucHJvbWlzZTtcblx0XHRyZXR1cm4gY3JlYXRlKC4uLmFyZ3MpO1xuXHR9XG5cdGNvbnN0IGNvbXBvbmVudCA9IGRlZmluZUNvbXBvbmVudCgoXywgeyBzbG90cyB9KSA9PiB7XG5cdFx0Y29uc3QgcmVuZGVyTGlzdCA9ICgpID0+IGluc3RhbmNlcy52YWx1ZS5tYXAoKHByb3BzKSA9PiB7XG5cdFx0XHR2YXIgX3Nsb3RzJGRlZmF1bHQ7XG5cdFx0XHRyZXR1cm4gaChGcmFnbWVudCwgeyBrZXk6IHByb3BzLmtleSB9LCAoX3Nsb3RzJGRlZmF1bHQgPSBzbG90cy5kZWZhdWx0KSA9PT0gbnVsbCB8fCBfc2xvdHMkZGVmYXVsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Nsb3RzJGRlZmF1bHQuY2FsbChzbG90cywgcHJvcHMpKTtcblx0XHR9KTtcblx0XHRpZiAob3B0aW9ucy50cmFuc2l0aW9uKSByZXR1cm4gKCkgPT4gaChUcmFuc2l0aW9uR3JvdXAsIG9wdGlvbnMudHJhbnNpdGlvbiwgcmVuZGVyTGlzdCk7XG5cdFx0cmV0dXJuIHJlbmRlckxpc3Q7XG5cdH0pO1xuXHRjb21wb25lbnQuc3RhcnQgPSBzdGFydDtcblx0cmV0dXJuIGNvbXBvbmVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlVW5yZWZGbi9pbmRleC50c1xuLyoqXG4qIE1ha2UgYSBwbGFpbiBmdW5jdGlvbiBhY2NlcHRpbmcgcmVmIGFuZCByYXcgdmFsdWVzIGFzIGFyZ3VtZW50cy5cbiogUmV0dXJucyB0aGUgc2FtZSB2YWx1ZSB0aGUgdW5jb252ZXJ0ZWQgZnVuY3Rpb24gcmV0dXJucywgd2l0aCBwcm9wZXIgdHlwaW5nLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVVucmVmRm4oZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0XHRyZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncy5tYXAoKGkpID0+IHRvVmFsdWUoaSkpKTtcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gX2NvbmZpZ3VyYWJsZS50c1xuY29uc3QgZGVmYXVsdFdpbmRvdyA9IGlzQ2xpZW50ID8gd2luZG93IDogdm9pZCAwO1xuY29uc3QgZGVmYXVsdERvY3VtZW50ID0gaXNDbGllbnQgPyB3aW5kb3cuZG9jdW1lbnQgOiB2b2lkIDA7XG5jb25zdCBkZWZhdWx0TmF2aWdhdG9yID0gaXNDbGllbnQgPyB3aW5kb3cubmF2aWdhdG9yIDogdm9pZCAwO1xuY29uc3QgZGVmYXVsdExvY2F0aW9uID0gaXNDbGllbnQgPyB3aW5kb3cubG9jYXRpb24gOiB2b2lkIDA7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVucmVmRWxlbWVudC9pbmRleC50c1xuLyoqXG4qIEdldCB0aGUgZG9tIGVsZW1lbnQgb2YgYSByZWYgb2YgZWxlbWVudCBvciBWdWUgY29tcG9uZW50IGluc3RhbmNlXG4qXG4qIEBwYXJhbSBlbFJlZlxuKi9cbmZ1bmN0aW9uIHVucmVmRWxlbWVudChlbFJlZikge1xuXHR2YXIgXyRlbDtcblx0Y29uc3QgcGxhaW4gPSB0b1ZhbHVlKGVsUmVmKTtcblx0cmV0dXJuIChfJGVsID0gcGxhaW4gPT09IG51bGwgfHwgcGxhaW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBsYWluLiRlbCkgIT09IG51bGwgJiYgXyRlbCAhPT0gdm9pZCAwID8gXyRlbCA6IHBsYWluO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFdmVudExpc3RlbmVyL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VFdmVudExpc3RlbmVyKC4uLmFyZ3MpIHtcblx0Y29uc3QgcmVnaXN0ZXIgPSAoZWwsIGV2ZW50LCBsaXN0ZW5lciwgb3B0aW9ucykgPT4ge1xuXHRcdGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zKTtcblx0XHRyZXR1cm4gKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuXHR9O1xuXHRjb25zdCBmaXJzdFBhcmFtVGFyZ2V0cyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB0ZXN0ID0gdG9BcnJheSh0b1ZhbHVlKGFyZ3NbMF0pKS5maWx0ZXIoKGUpID0+IGUgIT0gbnVsbCk7XG5cdFx0cmV0dXJuIHRlc3QuZXZlcnkoKGUpID0+IHR5cGVvZiBlICE9PSBcInN0cmluZ1wiKSA/IHRlc3QgOiB2b2lkIDA7XG5cdH0pO1xuXHRyZXR1cm4gd2F0Y2hJbW1lZGlhdGUoKCkgPT4ge1xuXHRcdHZhciBfZmlyc3RQYXJhbVRhcmdldHMkdmEsIF9maXJzdFBhcmFtVGFyZ2V0cyR2YTI7XG5cdFx0cmV0dXJuIFtcblx0XHRcdChfZmlyc3RQYXJhbVRhcmdldHMkdmEgPSAoX2ZpcnN0UGFyYW1UYXJnZXRzJHZhMiA9IGZpcnN0UGFyYW1UYXJnZXRzLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlyc3RQYXJhbVRhcmdldHMkdmEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlyc3RQYXJhbVRhcmdldHMkdmEyLm1hcCgoZSkgPT4gdW5yZWZFbGVtZW50KGUpKSkgIT09IG51bGwgJiYgX2ZpcnN0UGFyYW1UYXJnZXRzJHZhICE9PSB2b2lkIDAgPyBfZmlyc3RQYXJhbVRhcmdldHMkdmEgOiBbZGVmYXVsdFdpbmRvd10uZmlsdGVyKChlKSA9PiBlICE9IG51bGwpLFxuXHRcdFx0dG9BcnJheSh0b1ZhbHVlKGZpcnN0UGFyYW1UYXJnZXRzLnZhbHVlID8gYXJnc1sxXSA6IGFyZ3NbMF0pKSxcblx0XHRcdHRvQXJyYXkodW5yZWYoZmlyc3RQYXJhbVRhcmdldHMudmFsdWUgPyBhcmdzWzJdIDogYXJnc1sxXSkpLFxuXHRcdFx0dG9WYWx1ZShmaXJzdFBhcmFtVGFyZ2V0cy52YWx1ZSA/IGFyZ3NbM10gOiBhcmdzWzJdKVxuXHRcdF07XG5cdH0sIChbcmF3X3RhcmdldHMsIHJhd19ldmVudHMsIHJhd19saXN0ZW5lcnMsIHJhd19vcHRpb25zXSwgXywgb25DbGVhbnVwKSA9PiB7XG5cdFx0aWYgKCEocmF3X3RhcmdldHMgPT09IG51bGwgfHwgcmF3X3RhcmdldHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd190YXJnZXRzLmxlbmd0aCkgfHwgIShyYXdfZXZlbnRzID09PSBudWxsIHx8IHJhd19ldmVudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd19ldmVudHMubGVuZ3RoKSB8fCAhKHJhd19saXN0ZW5lcnMgPT09IG51bGwgfHwgcmF3X2xpc3RlbmVycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmF3X2xpc3RlbmVycy5sZW5ndGgpKSByZXR1cm47XG5cdFx0Y29uc3Qgb3B0aW9uc0Nsb25lID0gaXNPYmplY3QocmF3X29wdGlvbnMpID8geyAuLi5yYXdfb3B0aW9ucyB9IDogcmF3X29wdGlvbnM7XG5cdFx0Y29uc3QgY2xlYW51cHMgPSByYXdfdGFyZ2V0cy5mbGF0TWFwKChlbCkgPT4gcmF3X2V2ZW50cy5mbGF0TWFwKChldmVudCkgPT4gcmF3X2xpc3RlbmVycy5tYXAoKGxpc3RlbmVyKSA9PiByZWdpc3RlcihlbCwgZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zQ2xvbmUpKSkpO1xuXHRcdG9uQ2xlYW51cCgoKSA9PiB7XG5cdFx0XHRjbGVhbnVwcy5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG5cdFx0fSk7XG5cdH0sIHsgZmx1c2g6IFwicG9zdFwiIH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBvbkNsaWNrT3V0c2lkZS9pbmRleC50c1xubGV0IF9pT1NXb3JrYXJvdW5kID0gZmFsc2U7XG5mdW5jdGlvbiBvbkNsaWNrT3V0c2lkZSh0YXJnZXQsIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpZ25vcmUgPSBbXSwgY2FwdHVyZSA9IHRydWUsIGRldGVjdElmcmFtZSA9IGZhbHNlLCBjb250cm9scyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRpZiAoIXdpbmRvdyQxKSByZXR1cm4gY29udHJvbHMgPyB7XG5cdFx0c3RvcDogbm9vcCxcblx0XHRjYW5jZWw6IG5vb3AsXG5cdFx0dHJpZ2dlcjogbm9vcFxuXHR9IDogbm9vcDtcblx0aWYgKGlzSU9TICYmICFfaU9TV29ya2Fyb3VuZCkge1xuXHRcdF9pT1NXb3JrYXJvdW5kID0gdHJ1ZTtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHRBcnJheS5mcm9tKHdpbmRvdyQxLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goKGVsKSA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgbm9vcCwgbGlzdGVuZXJPcHRpb25zKSk7XG5cdFx0d2luZG93JDEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBub29wLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGxldCBzaG91bGRMaXN0ZW4gPSB0cnVlO1xuXHRjb25zdCBzaG91bGRJZ25vcmUgPSAoZXZlbnQpID0+IHtcblx0XHRyZXR1cm4gdG9WYWx1ZShpZ25vcmUpLnNvbWUoKHRhcmdldCQxKSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIHRhcmdldCQxID09PSBcInN0cmluZ1wiKSByZXR1cm4gQXJyYXkuZnJvbSh3aW5kb3ckMS5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRhcmdldCQxKSkuc29tZSgoZWwpID0+IGVsID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoZWwpKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXQkMSk7XG5cdFx0XHRcdHJldHVybiBlbCAmJiAoZXZlbnQudGFyZ2V0ID09PSBlbCB8fCBldmVudC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhlbCkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0YXJnZXQgaGFzIG11bHRpcGxlIHJvb3QgZWxlbWVudHMuXG5cdCogUmVmZXJlbmNlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdGVzdC11dGlscy9ibG9iL2NjYjQ2MGJlNTVmOWY2YmUwNWFiNzA4NTAwYTQxZWM4YWRmNmY0YmMvc3JjL3Z1ZS13cmFwcGVyLnRzI0wyMVxuXHQqL1xuXHRmdW5jdGlvbiBoYXNNdWx0aXBsZVJvb3RzKHRhcmdldCQxKSB7XG5cdFx0Y29uc3Qgdm0gPSB0b1ZhbHVlKHRhcmdldCQxKTtcblx0XHRyZXR1cm4gdm0gJiYgdm0uJC5zdWJUcmVlLnNoYXBlRmxhZyA9PT0gMTY7XG5cdH1cblx0ZnVuY3Rpb24gY2hlY2tNdWx0aXBsZVJvb3RzKHRhcmdldCQxLCBldmVudCkge1xuXHRcdGNvbnN0IHZtID0gdG9WYWx1ZSh0YXJnZXQkMSk7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB2bS4kLnN1YlRyZWUgJiYgdm0uJC5zdWJUcmVlLmNoaWxkcmVuO1xuXHRcdGlmIChjaGlsZHJlbiA9PSBudWxsIHx8ICFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gY2hpbGQuZWwgPT09IGV2ZW50LnRhcmdldCB8fCBldmVudC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhjaGlsZC5lbCkpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRpZiAoZXZlbnQudGFyZ2V0ID09IG51bGwpIHJldHVybjtcblx0XHRpZiAoIShlbCBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIGhhc011bHRpcGxlUm9vdHModGFyZ2V0KSAmJiBjaGVja011bHRpcGxlUm9vdHModGFyZ2V0LCBldmVudCkpIHJldHVybjtcblx0XHRpZiAoIWVsIHx8IGVsID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoZWwpKSByZXR1cm47XG5cdFx0aWYgKFwiZGV0YWlsXCIgaW4gZXZlbnQgJiYgZXZlbnQuZGV0YWlsID09PSAwKSBzaG91bGRMaXN0ZW4gPSAhc2hvdWxkSWdub3JlKGV2ZW50KTtcblx0XHRpZiAoIXNob3VsZExpc3Rlbikge1xuXHRcdFx0c2hvdWxkTGlzdGVuID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGFuZGxlcihldmVudCk7XG5cdH07XG5cdGxldCBpc1Byb2Nlc3NpbmdDbGljayA9IGZhbHNlO1xuXHRjb25zdCBjbGVhbnVwID0gW1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiY2xpY2tcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRpZiAoIWlzUHJvY2Vzc2luZ0NsaWNrKSB7XG5cdFx0XHRcdGlzUHJvY2Vzc2luZ0NsaWNrID0gdHJ1ZTtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0aXNQcm9jZXNzaW5nQ2xpY2sgPSBmYWxzZTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdGxpc3RlbmVyKGV2ZW50KTtcblx0XHRcdH1cblx0XHR9LCB7XG5cdFx0XHRwYXNzaXZlOiB0cnVlLFxuXHRcdFx0Y2FwdHVyZVxuXHRcdH0pLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwicG9pbnRlcmRvd25cIiwgKGUpID0+IHtcblx0XHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0XHRzaG91bGRMaXN0ZW4gPSAhc2hvdWxkSWdub3JlKGUpICYmICEhKGVsICYmICFlLmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKGVsKSk7XG5cdFx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pLFxuXHRcdGRldGVjdElmcmFtZSAmJiB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImJsdXJcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dmFyIF93aW5kb3ckZG9jdW1lbnQkYWN0aTtcblx0XHRcdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRcdFx0aWYgKCgoX3dpbmRvdyRkb2N1bWVudCRhY3RpID0gd2luZG93JDEuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IG51bGwgfHwgX3dpbmRvdyRkb2N1bWVudCRhY3RpID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfd2luZG93JGRvY3VtZW50JGFjdGkudGFnTmFtZSkgPT09IFwiSUZSQU1FXCIgJiYgIShlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuY29udGFpbnMod2luZG93JDEuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpKSBoYW5kbGVyKGV2ZW50KTtcblx0XHRcdH0sIDApO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuXHRdLmZpbHRlcihCb29sZWFuKTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IGNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRpZiAoY29udHJvbHMpIHJldHVybiB7XG5cdFx0c3RvcCxcblx0XHRjYW5jZWw6ICgpID0+IHtcblx0XHRcdHNob3VsZExpc3RlbiA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0dHJpZ2dlcjogKGV2ZW50KSA9PiB7XG5cdFx0XHRzaG91bGRMaXN0ZW4gPSB0cnVlO1xuXHRcdFx0bGlzdGVuZXIoZXZlbnQpO1xuXHRcdFx0c2hvdWxkTGlzdGVuID0gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTW91bnRlZC9pbmRleC50c1xuLyoqXG4qIE1vdW50ZWQgc3RhdGUgaW4gcmVmLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNb3VudGVkXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTW91bnRlZCgpIHtcblx0Y29uc3QgaXNNb3VudGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGlmIChpbnN0YW5jZSkgb25Nb3VudGVkKCgpID0+IHtcblx0XHRpc01vdW50ZWQudmFsdWUgPSB0cnVlO1xuXHR9LCBpbnN0YW5jZSk7XG5cdHJldHVybiBpc01vdW50ZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN1cHBvcnRlZC9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZVN1cHBvcnRlZChjYWxsYmFjaykge1xuXHRjb25zdCBpc01vdW50ZWQgPSB1c2VNb3VudGVkKCk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aXNNb3VudGVkLnZhbHVlO1xuXHRcdHJldHVybiBCb29sZWFuKGNhbGxiYWNrKCkpO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTXV0YXRpb25PYnNlcnZlci9pbmRleC50c1xuLyoqXG4qIFdhdGNoIGZvciBjaGFuZ2VzIGJlaW5nIG1hZGUgdG8gdGhlIERPTSB0cmVlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNdXRhdGlvbk9ic2VydmVyXG4qIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL011dGF0aW9uT2JzZXJ2ZXIgTXV0YXRpb25PYnNlcnZlciBNRE5cbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gY2FsbGJhY2tcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VNdXRhdGlvbk9ic2VydmVyKHRhcmdldCwgY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LC4uLm11dGF0aW9uT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0bGV0IG9ic2VydmVyO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJNdXRhdGlvbk9ic2VydmVyXCIgaW4gd2luZG93JDEpO1xuXHRjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuXHRcdGlmIChvYnNlcnZlcikge1xuXHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0b2JzZXJ2ZXIgPSB2b2lkIDA7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaChjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgaXRlbXMgPSB0b0FycmF5KHRvVmFsdWUodGFyZ2V0KSkubWFwKHVucmVmRWxlbWVudCkuZmlsdGVyKG5vdE51bGxpc2gpO1xuXHRcdHJldHVybiBuZXcgU2V0KGl0ZW1zKTtcblx0fSksIChuZXdUYXJnZXRzKSA9PiB7XG5cdFx0Y2xlYW51cCgpO1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiBuZXdUYXJnZXRzLnNpemUpIHtcblx0XHRcdG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuXHRcdFx0bmV3VGFyZ2V0cy5mb3JFYWNoKChlbCkgPT4gb2JzZXJ2ZXIub2JzZXJ2ZShlbCwgbXV0YXRpb25PcHRpb25zKSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdGZsdXNoOiBcInBvc3RcIlxuXHR9KTtcblx0Y29uc3QgdGFrZVJlY29yZHMgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIG9ic2VydmVyID09PSBudWxsIHx8IG9ic2VydmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvYnNlcnZlci50YWtlUmVjb3JkcygpO1xuXHR9O1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdHN0b3BXYXRjaCgpO1xuXHRcdGNsZWFudXAoKTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c3RvcCxcblx0XHR0YWtlUmVjb3Jkc1xuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBvbkVsZW1lbnRSZW1vdmFsL2luZGV4LnRzXG4vKipcbiogRmlyZXMgd2hlbiB0aGUgZWxlbWVudCBvciBhbnkgZWxlbWVudCBjb250YWluaW5nIGl0IGlzIHJlbW92ZWQuXG4qXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIGNhbGxiYWNrXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gb25FbGVtZW50UmVtb3ZhbCh0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuZG9jdW1lbnQsIGZsdXNoID0gXCJzeW5jXCIgfSA9IG9wdGlvbnM7XG5cdGlmICghd2luZG93JDEgfHwgIWRvY3VtZW50JDEpIHJldHVybiBub29wO1xuXHRsZXQgc3RvcEZuO1xuXHRjb25zdCBjbGVhbnVwQW5kVXBkYXRlID0gKGZuKSA9PiB7XG5cdFx0c3RvcEZuID09PSBudWxsIHx8IHN0b3BGbiA9PT0gdm9pZCAwIHx8IHN0b3BGbigpO1xuXHRcdHN0b3BGbiA9IGZuO1xuXHR9O1xuXHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRpZiAoZWwpIHtcblx0XHRcdGNvbnN0IHsgc3RvcCB9ID0gdXNlTXV0YXRpb25PYnNlcnZlcihkb2N1bWVudCQxLCAobXV0YXRpb25zTGlzdCkgPT4ge1xuXHRcdFx0XHRpZiAobXV0YXRpb25zTGlzdC5tYXAoKG11dGF0aW9uKSA9PiBbLi4ubXV0YXRpb24ucmVtb3ZlZE5vZGVzXSkuZmxhdCgpLnNvbWUoKG5vZGUpID0+IG5vZGUgPT09IGVsIHx8IG5vZGUuY29udGFpbnMoZWwpKSkgY2FsbGJhY2sobXV0YXRpb25zTGlzdCk7XG5cdFx0XHR9LCB7XG5cdFx0XHRcdHdpbmRvdzogd2luZG93JDEsXG5cdFx0XHRcdGNoaWxkTGlzdDogdHJ1ZSxcblx0XHRcdFx0c3VidHJlZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0XHRjbGVhbnVwQW5kVXBkYXRlKHN0b3ApO1xuXHRcdH1cblx0fSwgeyBmbHVzaCB9KTtcblx0Y29uc3Qgc3RvcEhhbmRsZSA9ICgpID0+IHtcblx0XHRzdG9wV2F0Y2goKTtcblx0XHRjbGVhbnVwQW5kVXBkYXRlKCk7XG5cdH07XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHN0b3BIYW5kbGUpO1xuXHRyZXR1cm4gc3RvcEhhbmRsZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25LZXlTdHJva2UvaW5kZXgudHNcbmZ1bmN0aW9uIGNyZWF0ZUtleVByZWRpY2F0ZShrZXlGaWx0ZXIpIHtcblx0aWYgKHR5cGVvZiBrZXlGaWx0ZXIgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGtleUZpbHRlcjtcblx0ZWxzZSBpZiAodHlwZW9mIGtleUZpbHRlciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIChldmVudCkgPT4gZXZlbnQua2V5ID09PSBrZXlGaWx0ZXI7XG5cdGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoa2V5RmlsdGVyKSkgcmV0dXJuIChldmVudCkgPT4ga2V5RmlsdGVyLmluY2x1ZGVzKGV2ZW50LmtleSk7XG5cdHJldHVybiAoKSA9PiB0cnVlO1xufVxuZnVuY3Rpb24gb25LZXlTdHJva2UoLi4uYXJncykge1xuXHRsZXQga2V5O1xuXHRsZXQgaGFuZGxlcjtcblx0bGV0IG9wdGlvbnMgPSB7fTtcblx0aWYgKGFyZ3MubGVuZ3RoID09PSAzKSB7XG5cdFx0a2V5ID0gYXJnc1swXTtcblx0XHRoYW5kbGVyID0gYXJnc1sxXTtcblx0XHRvcHRpb25zID0gYXJnc1syXTtcblx0fSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikgaWYgKHR5cGVvZiBhcmdzWzFdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0a2V5ID0gdHJ1ZTtcblx0XHRoYW5kbGVyID0gYXJnc1swXTtcblx0XHRvcHRpb25zID0gYXJnc1sxXTtcblx0fSBlbHNlIHtcblx0XHRrZXkgPSBhcmdzWzBdO1xuXHRcdGhhbmRsZXIgPSBhcmdzWzFdO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGtleSA9IHRydWU7XG5cdFx0aGFuZGxlciA9IGFyZ3NbMF07XG5cdH1cblx0Y29uc3QgeyB0YXJnZXQgPSBkZWZhdWx0V2luZG93LCBldmVudE5hbWUgPSBcImtleWRvd25cIiwgcGFzc2l2ZSA9IGZhbHNlLCBkZWR1cGUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcHJlZGljYXRlID0gY3JlYXRlS2V5UHJlZGljYXRlKGtleSk7XG5cdGNvbnN0IGxpc3RlbmVyID0gKGUpID0+IHtcblx0XHRpZiAoZS5yZXBlYXQgJiYgdG9WYWx1ZShkZWR1cGUpKSByZXR1cm47XG5cdFx0aWYgKHByZWRpY2F0ZShlKSkgaGFuZGxlcihlKTtcblx0fTtcblx0cmV0dXJuIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBldmVudE5hbWUsIGxpc3RlbmVyLCBwYXNzaXZlKTtcbn1cbi8qKlxuKiBMaXN0ZW4gdG8gdGhlIGtleWRvd24gZXZlbnQgb2YgdGhlIGdpdmVuIGtleS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvb25LZXlTdHJva2VcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaGFuZGxlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uS2V5RG93bihrZXksIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb25LZXlTdHJva2Uoa2V5LCBoYW5kbGVyLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudE5hbWU6IFwia2V5ZG93blwiXG5cdH0pO1xufVxuLyoqXG4qIExpc3RlbiB0byB0aGUga2V5cHJlc3MgZXZlbnQgb2YgdGhlIGdpdmVuIGtleS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvb25LZXlTdHJva2VcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaGFuZGxlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uS2V5UHJlc3NlZChrZXksIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb25LZXlTdHJva2Uoa2V5LCBoYW5kbGVyLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudE5hbWU6IFwia2V5cHJlc3NcIlxuXHR9KTtcbn1cbi8qKlxuKiBMaXN0ZW4gdG8gdGhlIGtleXVwIGV2ZW50IG9mIHRoZSBnaXZlbiBrZXkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL29uS2V5U3Ryb2tlXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGhhbmRsZXJcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiBvbktleVVwKGtleSwgaGFuZGxlciwgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBvbktleVN0cm9rZShrZXksIGhhbmRsZXIsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGV2ZW50TmFtZTogXCJrZXl1cFwiXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBvbkxvbmdQcmVzcy9pbmRleC50c1xuY29uc3QgREVGQVVMVF9ERUxBWSA9IDUwMDtcbmNvbnN0IERFRkFVTFRfVEhSRVNIT0xEID0gMTA7XG5mdW5jdGlvbiBvbkxvbmdQcmVzcyh0YXJnZXQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcblx0dmFyIF9vcHRpb25zJG1vZGlmaWVyczEwLCBfb3B0aW9ucyRtb2RpZmllcnMxMTtcblx0Y29uc3QgZWxlbWVudFJlZiA9IGNvbXB1dGVkKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpKTtcblx0bGV0IHRpbWVvdXQ7XG5cdGxldCBwb3NTdGFydDtcblx0bGV0IHN0YXJ0VGltZXN0YW1wO1xuXHRsZXQgaGFzTG9uZ1ByZXNzZWQgPSBmYWxzZTtcblx0ZnVuY3Rpb24gY2xlYXIoKSB7XG5cdFx0aWYgKHRpbWVvdXQpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHRcdHRpbWVvdXQgPSB2b2lkIDA7XG5cdFx0fVxuXHRcdHBvc1N0YXJ0ID0gdm9pZCAwO1xuXHRcdHN0YXJ0VGltZXN0YW1wID0gdm9pZCAwO1xuXHRcdGhhc0xvbmdQcmVzc2VkID0gZmFsc2U7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0RGVsYXkoZXYpIHtcblx0XHRjb25zdCBkZWxheSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZWxheTtcblx0XHRpZiAodHlwZW9mIGRlbGF5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBkZWxheShldik7XG5cdFx0cmV0dXJuIGRlbGF5ICE9PSBudWxsICYmIGRlbGF5ICE9PSB2b2lkIDAgPyBkZWxheSA6IERFRkFVTFRfREVMQVk7XG5cdH1cblx0ZnVuY3Rpb24gb25SZWxlYXNlKGV2KSB7XG5cdFx0dmFyIF9vcHRpb25zJG1vZGlmaWVycywgX29wdGlvbnMkbW9kaWZpZXJzMiwgX29wdGlvbnMkbW9kaWZpZXJzMztcblx0XHRjb25zdCBbX3N0YXJ0VGltZXN0YW1wLCBfcG9zU3RhcnQsIF9oYXNMb25nUHJlc3NlZF0gPSBbXG5cdFx0XHRzdGFydFRpbWVzdGFtcCxcblx0XHRcdHBvc1N0YXJ0LFxuXHRcdFx0aGFzTG9uZ1ByZXNzZWRcblx0XHRdO1xuXHRcdGNsZWFyKCk7XG5cdFx0aWYgKCEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9uTW91c2VVcCkgfHwgIV9wb3NTdGFydCB8fCAhX3N0YXJ0VGltZXN0YW1wKSByZXR1cm47XG5cdFx0aWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzLnNlbGYpICYmIGV2LnRhcmdldCAhPT0gZWxlbWVudFJlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzMiA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnMyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnMyLnByZXZlbnQpIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnMzID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczMuc3RvcCkgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0Y29uc3QgZHggPSBldi54IC0gX3Bvc1N0YXJ0Lng7XG5cdFx0Y29uc3QgZHkgPSBldi55IC0gX3Bvc1N0YXJ0Lnk7XG5cdFx0Y29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuXHRcdG9wdGlvbnMub25Nb3VzZVVwKGV2LnRpbWVTdGFtcCAtIF9zdGFydFRpbWVzdGFtcCwgZGlzdGFuY2UsIF9oYXNMb25nUHJlc3NlZCk7XG5cdH1cblx0ZnVuY3Rpb24gb25Eb3duKGV2KSB7XG5cdFx0dmFyIF9vcHRpb25zJG1vZGlmaWVyczQsIF9vcHRpb25zJG1vZGlmaWVyczUsIF9vcHRpb25zJG1vZGlmaWVyczY7XG5cdFx0aWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzNCA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnM0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnM0LnNlbGYpICYmIGV2LnRhcmdldCAhPT0gZWxlbWVudFJlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGNsZWFyKCk7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnM1ID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczUucHJldmVudCkgZXYucHJldmVudERlZmF1bHQoKTtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczYgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzNiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzNi5zdG9wKSBldi5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRwb3NTdGFydCA9IHtcblx0XHRcdHg6IGV2LngsXG5cdFx0XHR5OiBldi55XG5cdFx0fTtcblx0XHRzdGFydFRpbWVzdGFtcCA9IGV2LnRpbWVTdGFtcDtcblx0XHR0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRoYXNMb25nUHJlc3NlZCA9IHRydWU7XG5cdFx0XHRoYW5kbGVyKGV2KTtcblx0XHR9LCBnZXREZWxheShldikpO1xuXHR9XG5cdGZ1bmN0aW9uIG9uTW92ZShldikge1xuXHRcdHZhciBfb3B0aW9ucyRtb2RpZmllcnM3LCBfb3B0aW9ucyRtb2RpZmllcnM4LCBfb3B0aW9ucyRtb2RpZmllcnM5LCBfb3B0aW9ucyRkaXN0YW5jZVRocmU7XG5cdFx0aWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzNyA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnM3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnM3LnNlbGYpICYmIGV2LnRhcmdldCAhPT0gZWxlbWVudFJlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmICghcG9zU3RhcnQgfHwgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kaXN0YW5jZVRocmVzaG9sZCkgPT09IGZhbHNlKSByZXR1cm47XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnM4ID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczgucHJldmVudCkgZXYucHJldmVudERlZmF1bHQoKTtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczkgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzOSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzOS5zdG9wKSBldi5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRjb25zdCBkeCA9IGV2LnggLSBwb3NTdGFydC54O1xuXHRcdGNvbnN0IGR5ID0gZXYueSAtIHBvc1N0YXJ0Lnk7XG5cdFx0aWYgKE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkgPj0gKChfb3B0aW9ucyRkaXN0YW5jZVRocmUgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGlzdGFuY2VUaHJlc2hvbGQpICE9PSBudWxsICYmIF9vcHRpb25zJGRpc3RhbmNlVGhyZSAhPT0gdm9pZCAwID8gX29wdGlvbnMkZGlzdGFuY2VUaHJlIDogREVGQVVMVF9USFJFU0hPTEQpKSBjbGVhcigpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRjYXB0dXJlOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzMTAgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzMTAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczEwLmNhcHR1cmUsXG5cdFx0b25jZTogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczExID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczExID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnMxMS5vbmNlXG5cdH07XG5cdGNvbnN0IGNsZWFudXAgPSBbXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihlbGVtZW50UmVmLCBcInBvaW50ZXJkb3duXCIsIG9uRG93biwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsZW1lbnRSZWYsIFwicG9pbnRlcm1vdmVcIiwgb25Nb3ZlLCBsaXN0ZW5lck9wdGlvbnMpLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWxlbWVudFJlZiwgW1wicG9pbnRlcnVwXCIsIFwicG9pbnRlcmxlYXZlXCJdLCBvblJlbGVhc2UsIGxpc3RlbmVyT3B0aW9ucylcblx0XTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IGNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25TdGFydFR5cGluZy9pbmRleC50c1xuZnVuY3Rpb24gaXNGb2N1c2VkRWxlbWVudEVkaXRhYmxlKCkge1xuXHRjb25zdCB7IGFjdGl2ZUVsZW1lbnQsIGJvZHkgfSA9IGRvY3VtZW50O1xuXHRpZiAoIWFjdGl2ZUVsZW1lbnQpIHJldHVybiBmYWxzZTtcblx0aWYgKGFjdGl2ZUVsZW1lbnQgPT09IGJvZHkpIHJldHVybiBmYWxzZTtcblx0c3dpdGNoIChhY3RpdmVFbGVtZW50LnRhZ05hbWUpIHtcblx0XHRjYXNlIFwiSU5QVVRcIjpcblx0XHRjYXNlIFwiVEVYVEFSRUFcIjogcmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGFjdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xufVxuZnVuY3Rpb24gaXNUeXBlZENoYXJWYWxpZCh7IGtleUNvZGUsIG1ldGFLZXksIGN0cmxLZXksIGFsdEtleSB9KSB7XG5cdGlmIChtZXRhS2V5IHx8IGN0cmxLZXkgfHwgYWx0S2V5KSByZXR1cm4gZmFsc2U7XG5cdGlmIChrZXlDb2RlID49IDQ4ICYmIGtleUNvZGUgPD0gNTcgfHwga2V5Q29kZSA+PSA5NiAmJiBrZXlDb2RlIDw9IDEwNSkgcmV0dXJuIHRydWU7XG5cdGlmIChrZXlDb2RlID49IDY1ICYmIGtleUNvZGUgPD0gOTApIHJldHVybiB0cnVlO1xuXHRyZXR1cm4gZmFsc2U7XG59XG4vKipcbiogRmlyZXMgd2hlbiB1c2VycyBzdGFydCB0eXBpbmcgb24gbm9uLWVkaXRhYmxlIGVsZW1lbnRzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9vblN0YXJ0VHlwaW5nXG4qIEBwYXJhbSBjYWxsYmFja1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uU3RhcnRUeXBpbmcoY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBrZXlkb3duID0gKGV2ZW50KSA9PiB7XG5cdFx0aWYgKCFpc0ZvY3VzZWRFbGVtZW50RWRpdGFibGUoKSAmJiBpc1R5cGVkQ2hhclZhbGlkKGV2ZW50KSkgY2FsbGJhY2soZXZlbnQpO1xuXHR9O1xuXHRpZiAoZG9jdW1lbnQkMSkgdXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcImtleWRvd25cIiwga2V5ZG93biwgeyBwYXNzaXZlOiB0cnVlIH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0ZW1wbGF0ZVJlZi9pbmRleC50c1xuLyoqXG4qIEBkZXByZWNhdGVkIFVzZSBWdWUncyBidWlsdC1pbiBgdXNlVGVtcGxhdGVSZWZgIGluc3RlYWQuXG4qXG4qIFNob3J0aGFuZCBmb3IgYmluZGluZyByZWYgdG8gdGVtcGxhdGUgZWxlbWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdGVtcGxhdGVSZWZcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaW5pdGlhbFZhbHVlXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdGVtcGxhdGVSZWYoa2V5LCBpbml0aWFsVmFsdWUgPSBudWxsKSB7XG5cdGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGxldCBfdHJpZ2dlciA9ICgpID0+IHt9O1xuXHRjb25zdCBlbGVtZW50ID0gY3VzdG9tUmVmKCh0cmFjaywgdHJpZ2dlcikgPT4ge1xuXHRcdF90cmlnZ2VyID0gdHJpZ2dlcjtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHR2YXIgX2luc3RhbmNlJHByb3h5JCRyZWZzLCBfaW5zdGFuY2UkcHJveHk7XG5cdFx0XHRcdHRyYWNrKCk7XG5cdFx0XHRcdHJldHVybiAoX2luc3RhbmNlJHByb3h5JCRyZWZzID0gaW5zdGFuY2UgPT09IG51bGwgfHwgaW5zdGFuY2UgPT09IHZvaWQgMCB8fCAoX2luc3RhbmNlJHByb3h5ID0gaW5zdGFuY2UucHJveHkpID09PSBudWxsIHx8IF9pbnN0YW5jZSRwcm94eSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2luc3RhbmNlJHByb3h5LiRyZWZzW2tleV0pICE9PSBudWxsICYmIF9pbnN0YW5jZSRwcm94eSQkcmVmcyAhPT0gdm9pZCAwID8gX2luc3RhbmNlJHByb3h5JCRyZWZzIDogaW5pdGlhbFZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldCgpIHt9XG5cdFx0fTtcblx0fSk7XG5cdHRyeU9uTW91bnRlZChfdHJpZ2dlcik7XG5cdG9uVXBkYXRlZChfdHJpZ2dlcik7XG5cdHJldHVybiBlbGVtZW50O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBY3RpdmVFbGVtZW50L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFjdGl2ZUVsZW1lbnRcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBY3RpdmVFbGVtZW50KG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkZG9jdW1lbnQ7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGRlZXAgPSB0cnVlLCB0cmlnZ2VyT25SZW1vdmFsID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRvY3VtZW50JDEgPSAoX29wdGlvbnMkZG9jdW1lbnQgPSBvcHRpb25zLmRvY3VtZW50KSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRkb2N1bWVudCAhPT0gdm9pZCAwID8gX29wdGlvbnMkZG9jdW1lbnQgOiB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuZG9jdW1lbnQ7XG5cdGNvbnN0IGdldERlZXBBY3RpdmVFbGVtZW50ID0gKCkgPT4ge1xuXHRcdGxldCBlbGVtZW50ID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmFjdGl2ZUVsZW1lbnQ7XG5cdFx0aWYgKGRlZXApIHtcblx0XHRcdHZhciBfZWxlbWVudCRzaGFkb3dSb290O1xuXHRcdFx0d2hpbGUgKGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWxlbWVudC5zaGFkb3dSb290KSBlbGVtZW50ID0gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgfHwgKF9lbGVtZW50JHNoYWRvd1Jvb3QgPSBlbGVtZW50LnNoYWRvd1Jvb3QpID09PSBudWxsIHx8IF9lbGVtZW50JHNoYWRvd1Jvb3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lbGVtZW50JHNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudDtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW1lbnQ7XG5cdH07XG5cdGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHRyaWdnZXIgPSAoKSA9PiB7XG5cdFx0YWN0aXZlRWxlbWVudC52YWx1ZSA9IGdldERlZXBBY3RpdmVFbGVtZW50KCk7XG5cdH07XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRcdGNhcHR1cmU6IHRydWUsXG5cdFx0XHRwYXNzaXZlOiB0cnVlXG5cdFx0fTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImJsdXJcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0dHJpZ2dlcigpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJmb2N1c1wiLCB0cmlnZ2VyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGlmICh0cmlnZ2VyT25SZW1vdmFsKSBvbkVsZW1lbnRSZW1vdmFsKGFjdGl2ZUVsZW1lbnQsIHRyaWdnZXIsIHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgfSk7XG5cdHRyaWdnZXIoKTtcblx0cmV0dXJuIGFjdGl2ZUVsZW1lbnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVJhZkZuL2luZGV4LnRzXG4vKipcbiogQ2FsbCBmdW5jdGlvbiBvbiBldmVyeSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4gV2l0aCBjb250cm9scyBvZiBwYXVzaW5nIGFuZCByZXN1bWluZy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmFmRm5cbiogQHBhcmFtIGZuXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlUmFmRm4oZm4sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIGZwc0xpbWl0ID0gbnVsbCwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIG9uY2UgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNBY3RpdmUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaW50ZXJ2YWxMaW1pdCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBsaW1pdCA9IHRvVmFsdWUoZnBzTGltaXQpO1xuXHRcdHJldHVybiBsaW1pdCA/IDFlMyAvIGxpbWl0IDogbnVsbDtcblx0fSk7XG5cdGxldCBwcmV2aW91c0ZyYW1lVGltZXN0YW1wID0gMDtcblx0bGV0IHJhZklkID0gbnVsbDtcblx0ZnVuY3Rpb24gbG9vcCh0aW1lc3RhbXAkMSkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUgfHwgIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0aWYgKCFwcmV2aW91c0ZyYW1lVGltZXN0YW1wKSBwcmV2aW91c0ZyYW1lVGltZXN0YW1wID0gdGltZXN0YW1wJDE7XG5cdFx0Y29uc3QgZGVsdGEgPSB0aW1lc3RhbXAkMSAtIHByZXZpb3VzRnJhbWVUaW1lc3RhbXA7XG5cdFx0aWYgKGludGVydmFsTGltaXQudmFsdWUgJiYgZGVsdGEgPCBpbnRlcnZhbExpbWl0LnZhbHVlKSB7XG5cdFx0XHRyYWZJZCA9IHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IHRpbWVzdGFtcCQxO1xuXHRcdGZuKHtcblx0XHRcdGRlbHRhLFxuXHRcdFx0dGltZXN0YW1wOiB0aW1lc3RhbXAkMVxuXHRcdH0pO1xuXHRcdGlmIChvbmNlKSB7XG5cdFx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0cmFmSWQgPSBudWxsO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRyYWZJZCA9IHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoKSB7XG5cdFx0aWYgKCFpc0FjdGl2ZS52YWx1ZSAmJiB3aW5kb3ckMSkge1xuXHRcdFx0aXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuXHRcdFx0cHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IDA7XG5cdFx0XHRyYWZJZCA9IHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gcGF1c2UoKSB7XG5cdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0XHRpZiAocmFmSWQgIT0gbnVsbCAmJiB3aW5kb3ckMSkge1xuXHRcdFx0d2luZG93JDEuY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuXHRcdFx0cmFmSWQgPSBudWxsO1xuXHRcdH1cblx0fVxuXHRpZiAoaW1tZWRpYXRlKSByZXN1bWUoKTtcblx0dHJ5T25TY29wZURpc3Bvc2UocGF1c2UpO1xuXHRyZXR1cm4ge1xuXHRcdGlzQWN0aXZlOiByZWFkb25seShpc0FjdGl2ZSksXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFuaW1hdGUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBXZWIgQW5pbWF0aW9ucyBBUElcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQW5pbWF0ZVxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBrZXlmcmFtZXNcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VBbmltYXRlKHRhcmdldCwga2V5ZnJhbWVzLCBvcHRpb25zKSB7XG5cdGxldCBjb25maWc7XG5cdGxldCBhbmltYXRlT3B0aW9ucztcblx0aWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG5cdFx0Y29uZmlnID0gb3B0aW9ucztcblx0XHRhbmltYXRlT3B0aW9ucyA9IG9iamVjdE9taXQob3B0aW9ucywgW1xuXHRcdFx0XCJ3aW5kb3dcIixcblx0XHRcdFwiaW1tZWRpYXRlXCIsXG5cdFx0XHRcImNvbW1pdFN0eWxlc1wiLFxuXHRcdFx0XCJwZXJzaXN0XCIsXG5cdFx0XHRcIm9uUmVhZHlcIixcblx0XHRcdFwib25FcnJvclwiXG5cdFx0XSk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uZmlnID0geyBkdXJhdGlvbjogb3B0aW9ucyB9O1xuXHRcdGFuaW1hdGVPcHRpb25zID0gb3B0aW9ucztcblx0fVxuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpbW1lZGlhdGUgPSB0cnVlLCBjb21taXRTdHlsZXMsIHBlcnNpc3QsIHBsYXliYWNrUmF0ZTogX3BsYXliYWNrUmF0ZSA9IDEsIG9uUmVhZHksIG9uRXJyb3IgPSAoZSkgPT4ge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH0gfSA9IGNvbmZpZztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIEhUTUxFbGVtZW50ICYmIFwiYW5pbWF0ZVwiIGluIEhUTUxFbGVtZW50LnByb3RvdHlwZSk7XG5cdGNvbnN0IGFuaW1hdGUgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IHN0b3JlID0gc2hhbGxvd1JlYWN0aXZlKHtcblx0XHRzdGFydFRpbWU6IG51bGwsXG5cdFx0Y3VycmVudFRpbWU6IG51bGwsXG5cdFx0dGltZWxpbmU6IG51bGwsXG5cdFx0cGxheWJhY2tSYXRlOiBfcGxheWJhY2tSYXRlLFxuXHRcdHBlbmRpbmc6IGZhbHNlLFxuXHRcdHBsYXlTdGF0ZTogaW1tZWRpYXRlID8gXCJpZGxlXCIgOiBcInBhdXNlZFwiLFxuXHRcdHJlcGxhY2VTdGF0ZTogXCJhY3RpdmVcIlxuXHR9KTtcblx0Y29uc3QgcGVuZGluZyA9IGNvbXB1dGVkKCgpID0+IHN0b3JlLnBlbmRpbmcpO1xuXHRjb25zdCBwbGF5U3RhdGUgPSBjb21wdXRlZCgoKSA9PiBzdG9yZS5wbGF5U3RhdGUpO1xuXHRjb25zdCByZXBsYWNlU3RhdGUgPSBjb21wdXRlZCgoKSA9PiBzdG9yZS5yZXBsYWNlU3RhdGUpO1xuXHRjb25zdCBzdGFydFRpbWUgPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHN0b3JlLnN0YXJ0VGltZTtcblx0XHR9LFxuXHRcdHNldCh2YWx1ZSkge1xuXHRcdFx0c3RvcmUuc3RhcnRUaW1lID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZS5zdGFydFRpbWUgPSB2YWx1ZTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBjdXJyZW50VGltZSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RvcmUuY3VycmVudFRpbWU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHN0b3JlLmN1cnJlbnRUaW1lID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkge1xuXHRcdFx0XHRhbmltYXRlLnZhbHVlLmN1cnJlbnRUaW1lID0gdmFsdWU7XG5cdFx0XHRcdHN5bmNSZXN1bWUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRjb25zdCB0aW1lbGluZSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RvcmUudGltZWxpbmU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHN0b3JlLnRpbWVsaW5lID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZS50aW1lbGluZSA9IHZhbHVlO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHBsYXliYWNrUmF0ZSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RvcmUucGxheWJhY2tSYXRlO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHRzdG9yZS5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblx0XHRcdGlmIChhbmltYXRlLnZhbHVlKSBhbmltYXRlLnZhbHVlLnBsYXliYWNrUmF0ZSA9IHZhbHVlO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHBsYXkgPSAoKSA9PiB7XG5cdFx0aWYgKGFuaW1hdGUudmFsdWUpIHRyeSB7XG5cdFx0XHRhbmltYXRlLnZhbHVlLnBsYXkoKTtcblx0XHRcdHN5bmNSZXN1bWUoKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRzeW5jUGF1c2UoKTtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0fVxuXHRcdGVsc2UgdXBkYXRlKCk7XG5cdH07XG5cdGNvbnN0IHBhdXNlID0gKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWU7XG5cdFx0XHQoX2FuaW1hdGUkdmFsdWUgPSBhbmltYXRlLnZhbHVlKSA9PT0gbnVsbCB8fCBfYW5pbWF0ZSR2YWx1ZSA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlLnBhdXNlKCk7XG5cdFx0XHRzeW5jUGF1c2UoKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcmV2ZXJzZSA9ICgpID0+IHtcblx0XHRpZiAoIWFuaW1hdGUudmFsdWUpIHVwZGF0ZSgpO1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWUyO1xuXHRcdFx0KF9hbmltYXRlJHZhbHVlMiA9IGFuaW1hdGUudmFsdWUpID09PSBudWxsIHx8IF9hbmltYXRlJHZhbHVlMiA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlMi5yZXZlcnNlKCk7XG5cdFx0XHRzeW5jUmVzdW1lKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0c3luY1BhdXNlKCk7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZmluaXNoID0gKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWUzO1xuXHRcdFx0KF9hbmltYXRlJHZhbHVlMyA9IGFuaW1hdGUudmFsdWUpID09PSBudWxsIHx8IF9hbmltYXRlJHZhbHVlMyA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlMy5maW5pc2goKTtcblx0XHRcdHN5bmNQYXVzZSgpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdHZhciBfYW5pbWF0ZSR2YWx1ZTQ7XG5cdFx0XHQoX2FuaW1hdGUkdmFsdWU0ID0gYW5pbWF0ZS52YWx1ZSkgPT09IG51bGwgfHwgX2FuaW1hdGUkdmFsdWU0ID09PSB2b2lkIDAgfHwgX2FuaW1hdGUkdmFsdWU0LmNhbmNlbCgpO1xuXHRcdFx0c3luY1BhdXNlKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH07XG5cdHdhdGNoKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpLCAoZWwpID0+IHtcblx0XHRpZiAoZWwpIHVwZGF0ZSh0cnVlKTtcblx0XHRlbHNlIGFuaW1hdGUudmFsdWUgPSB2b2lkIDA7XG5cdH0pO1xuXHR3YXRjaCgoKSA9PiBrZXlmcmFtZXMsICh2YWx1ZSkgPT4ge1xuXHRcdGlmIChhbmltYXRlLnZhbHVlKSB7XG5cdFx0XHR1cGRhdGUoKTtcblx0XHRcdGNvbnN0IHRhcmdldEVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0XHRpZiAodGFyZ2V0RWwpIGFuaW1hdGUudmFsdWUuZWZmZWN0ID0gbmV3IEtleWZyYW1lRWZmZWN0KHRhcmdldEVsLCB0b1ZhbHVlKHZhbHVlKSwgYW5pbWF0ZU9wdGlvbnMpO1xuXHRcdH1cblx0fSwgeyBkZWVwOiB0cnVlIH0pO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4gdXBkYXRlKHRydWUpLCBmYWxzZSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKGNhbmNlbCk7XG5cdGZ1bmN0aW9uIHVwZGF0ZShpbml0KSB7XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8ICFlbCkgcmV0dXJuO1xuXHRcdGlmICghYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZSA9IGVsLmFuaW1hdGUodG9WYWx1ZShrZXlmcmFtZXMpLCBhbmltYXRlT3B0aW9ucyk7XG5cdFx0aWYgKHBlcnNpc3QpIGFuaW1hdGUudmFsdWUucGVyc2lzdCgpO1xuXHRcdGlmIChfcGxheWJhY2tSYXRlICE9PSAxKSBhbmltYXRlLnZhbHVlLnBsYXliYWNrUmF0ZSA9IF9wbGF5YmFja1JhdGU7XG5cdFx0aWYgKGluaXQgJiYgIWltbWVkaWF0ZSkgYW5pbWF0ZS52YWx1ZS5wYXVzZSgpO1xuXHRcdGVsc2Ugc3luY1Jlc3VtZSgpO1xuXHRcdG9uUmVhZHkgPT09IG51bGwgfHwgb25SZWFkeSA9PT0gdm9pZCAwIHx8IG9uUmVhZHkoYW5pbWF0ZS52YWx1ZSk7XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIoYW5pbWF0ZSwgW1xuXHRcdFwiY2FuY2VsXCIsXG5cdFx0XCJmaW5pc2hcIixcblx0XHRcInJlbW92ZVwiXG5cdF0sIHN5bmNQYXVzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcihhbmltYXRlLCBcImZpbmlzaFwiLCAoKSA9PiB7XG5cdFx0dmFyIF9hbmltYXRlJHZhbHVlNTtcblx0XHRpZiAoY29tbWl0U3R5bGVzKSAoX2FuaW1hdGUkdmFsdWU1ID0gYW5pbWF0ZS52YWx1ZSkgPT09IG51bGwgfHwgX2FuaW1hdGUkdmFsdWU1ID09PSB2b2lkIDAgfHwgX2FuaW1hdGUkdmFsdWU1LmNvbW1pdFN0eWxlcygpO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRjb25zdCB7IHJlc3VtZTogcmVzdW1lUmVmLCBwYXVzZTogcGF1c2VSZWYgfSA9IHVzZVJhZkZuKCgpID0+IHtcblx0XHRpZiAoIWFuaW1hdGUudmFsdWUpIHJldHVybjtcblx0XHRzdG9yZS5wZW5kaW5nID0gYW5pbWF0ZS52YWx1ZS5wZW5kaW5nO1xuXHRcdHN0b3JlLnBsYXlTdGF0ZSA9IGFuaW1hdGUudmFsdWUucGxheVN0YXRlO1xuXHRcdHN0b3JlLnJlcGxhY2VTdGF0ZSA9IGFuaW1hdGUudmFsdWUucmVwbGFjZVN0YXRlO1xuXHRcdHN0b3JlLnN0YXJ0VGltZSA9IGFuaW1hdGUudmFsdWUuc3RhcnRUaW1lO1xuXHRcdHN0b3JlLmN1cnJlbnRUaW1lID0gYW5pbWF0ZS52YWx1ZS5jdXJyZW50VGltZTtcblx0XHRzdG9yZS50aW1lbGluZSA9IGFuaW1hdGUudmFsdWUudGltZWxpbmU7XG5cdFx0c3RvcmUucGxheWJhY2tSYXRlID0gYW5pbWF0ZS52YWx1ZS5wbGF5YmFja1JhdGU7XG5cdH0sIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcblx0ZnVuY3Rpb24gc3luY1Jlc3VtZSgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHJlc3VtZVJlZigpO1xuXHR9XG5cdGZ1bmN0aW9uIHN5bmNQYXVzZSgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgd2luZG93JDEpIHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShwYXVzZVJlZik7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRhbmltYXRlLFxuXHRcdHBsYXksXG5cdFx0cGF1c2UsXG5cdFx0cmV2ZXJzZSxcblx0XHRmaW5pc2gsXG5cdFx0Y2FuY2VsLFxuXHRcdHBlbmRpbmcsXG5cdFx0cGxheVN0YXRlLFxuXHRcdHJlcGxhY2VTdGF0ZSxcblx0XHRzdGFydFRpbWUsXG5cdFx0Y3VycmVudFRpbWUsXG5cdFx0dGltZWxpbmUsXG5cdFx0cGxheWJhY2tSYXRlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFzeW5jUXVldWUvaW5kZXgudHNcbi8qKlxuKiBBc3luY2hyb25vdXMgcXVldWUgdGFzayBjb250cm9sbGVyLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBc3luY1F1ZXVlXG4qIEBwYXJhbSB0YXNrc1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUFzeW5jUXVldWUodGFza3MsIG9wdGlvbnMpIHtcblx0Y29uc3QgeyBpbnRlcnJ1cHQgPSB0cnVlLCBvbkVycm9yID0gbm9vcCwgb25GaW5pc2hlZCA9IG5vb3AsIHNpZ25hbCB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgcHJvbWlzZVN0YXRlID0ge1xuXHRcdGFib3J0ZWQ6IFwiYWJvcnRlZFwiLFxuXHRcdGZ1bGZpbGxlZDogXCJmdWxmaWxsZWRcIixcblx0XHRwZW5kaW5nOiBcInBlbmRpbmdcIixcblx0XHRyZWplY3RlZDogXCJyZWplY3RlZFwiXG5cdH07XG5cdGNvbnN0IHJlc3VsdCA9IHJlYWN0aXZlKEFycmF5LmZyb20oQXJyYXkuZnJvbSh7IGxlbmd0aDogdGFza3MubGVuZ3RoIH0pLCAoKSA9PiAoe1xuXHRcdHN0YXRlOiBwcm9taXNlU3RhdGUucGVuZGluZyxcblx0XHRkYXRhOiBudWxsXG5cdH0pKSk7XG5cdGNvbnN0IGFjdGl2ZUluZGV4ID0gc2hhbGxvd1JlZigtMSk7XG5cdGlmICghdGFza3MgfHwgdGFza3MubGVuZ3RoID09PSAwKSB7XG5cdFx0b25GaW5pc2hlZCgpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRhY3RpdmVJbmRleCxcblx0XHRcdHJlc3VsdFxuXHRcdH07XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlUmVzdWx0KHN0YXRlLCByZXMpIHtcblx0XHRhY3RpdmVJbmRleC52YWx1ZSsrO1xuXHRcdHJlc3VsdFthY3RpdmVJbmRleC52YWx1ZV0uZGF0YSA9IHJlcztcblx0XHRyZXN1bHRbYWN0aXZlSW5kZXgudmFsdWVdLnN0YXRlID0gc3RhdGU7XG5cdH1cblx0dGFza3MucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG5cdFx0cmV0dXJuIHByZXYudGhlbigocHJldlJlcykgPT4ge1xuXHRcdFx0dmFyIF9yZXN1bHQkYWN0aXZlSW5kZXgkdjtcblx0XHRcdGlmIChzaWduYWwgPT09IG51bGwgfHwgc2lnbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaWduYWwuYWJvcnRlZCkge1xuXHRcdFx0XHR1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLmFib3J0ZWQsIC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCgoX3Jlc3VsdCRhY3RpdmVJbmRleCR2ID0gcmVzdWx0W2FjdGl2ZUluZGV4LnZhbHVlXSkgPT09IG51bGwgfHwgX3Jlc3VsdCRhY3RpdmVJbmRleCR2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcmVzdWx0JGFjdGl2ZUluZGV4JHYuc3RhdGUpID09PSBwcm9taXNlU3RhdGUucmVqZWN0ZWQgJiYgaW50ZXJydXB0KSB7XG5cdFx0XHRcdG9uRmluaXNoZWQoKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZG9uZSA9IGN1cnIocHJldlJlcykudGhlbigoY3VycmVudFJlcykgPT4ge1xuXHRcdFx0XHR1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLmZ1bGZpbGxlZCwgY3VycmVudFJlcyk7XG5cdFx0XHRcdGlmIChhY3RpdmVJbmRleC52YWx1ZSA9PT0gdGFza3MubGVuZ3RoIC0gMSkgb25GaW5pc2hlZCgpO1xuXHRcdFx0XHRyZXR1cm4gY3VycmVudFJlcztcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCFzaWduYWwpIHJldHVybiBkb25lO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmFjZShbZG9uZSwgd2hlbkFib3J0ZWQoc2lnbmFsKV0pO1xuXHRcdH0pLmNhdGNoKChlKSA9PiB7XG5cdFx0XHRpZiAoc2lnbmFsID09PSBudWxsIHx8IHNpZ25hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2lnbmFsLmFib3J0ZWQpIHtcblx0XHRcdFx0dXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5hYm9ydGVkLCBlKTtcblx0XHRcdFx0cmV0dXJuIGU7XG5cdFx0XHR9XG5cdFx0XHR1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLnJlamVjdGVkLCBlKTtcblx0XHRcdG9uRXJyb3IoKTtcblx0XHRcdGlmIChhY3RpdmVJbmRleC52YWx1ZSA9PT0gdGFza3MubGVuZ3RoIC0gMSkgb25GaW5pc2hlZCgpO1xuXHRcdFx0cmV0dXJuIGU7XG5cdFx0fSk7XG5cdH0sIFByb21pc2UucmVzb2x2ZSgpKTtcblx0cmV0dXJuIHtcblx0XHRhY3RpdmVJbmRleCxcblx0XHRyZXN1bHRcblx0fTtcbn1cbmZ1bmN0aW9uIHdoZW5BYm9ydGVkKHNpZ25hbCkge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IGVycm9yID0gLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcImFib3J0ZWRcIik7XG5cdFx0aWYgKHNpZ25hbC5hYm9ydGVkKSByZWplY3QoZXJyb3IpO1xuXHRcdGVsc2Ugc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiByZWplY3QoZXJyb3IpLCB7IG9uY2U6IHRydWUgfSk7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBc3luY1N0YXRlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYXN5bmMgc3RhdGUuIFdpbGwgbm90IGJsb2NrIHlvdXIgc2V0dXAgZnVuY3Rpb24gYW5kIHdpbGwgdHJpZ2dlciBjaGFuZ2VzIG9uY2VcbiogdGhlIHByb21pc2UgaXMgcmVhZHkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFzeW5jU3RhdGVcbiogQHBhcmFtIHByb21pc2UgICAgICAgICBUaGUgcHJvbWlzZSAvIGFzeW5jIGZ1bmN0aW9uIHRvIGJlIHJlc29sdmVkXG4qIEBwYXJhbSBpbml0aWFsU3RhdGUgICAgVGhlIGluaXRpYWwgc3RhdGUsIHVzZWQgdW50aWwgdGhlIGZpcnN0IGV2YWx1YXRpb24gZmluaXNoZXNcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VBc3luY1N0YXRlKHByb21pc2UsIGluaXRpYWxTdGF0ZSwgb3B0aW9ucykge1xuXHR2YXIgX2dsb2JhbFRoaXMkcmVwb3J0RXJyO1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIGRlbGF5ID0gMCwgb25FcnJvciA9IChfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgPSBnbG9iYWxUaGlzLnJlcG9ydEVycm9yKSAhPT0gbnVsbCAmJiBfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgIT09IHZvaWQgMCA/IF9nbG9iYWxUaGlzJHJlcG9ydEVyciA6IG5vb3AsIG9uU3VjY2VzcyA9IG5vb3AsIHJlc2V0T25FeGVjdXRlID0gdHJ1ZSwgc2hhbGxvdyA9IHRydWUsIHRocm93RXJyb3IgfSA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuXHRjb25zdCBzdGF0ZSA9IHNoYWxsb3cgPyBzaGFsbG93UmVmKGluaXRpYWxTdGF0ZSkgOiByZWYoaW5pdGlhbFN0YXRlKTtcblx0Y29uc3QgaXNSZWFkeSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBpc0xvYWRpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGxldCBleGVjdXRpb25zQ291bnQgPSAwO1xuXHRhc3luYyBmdW5jdGlvbiBleGVjdXRlKGRlbGF5JDEgPSAwLCAuLi5hcmdzKSB7XG5cdFx0Y29uc3QgZXhlY3V0aW9uSWQgPSBleGVjdXRpb25zQ291bnQgKz0gMTtcblx0XHRpZiAocmVzZXRPbkV4ZWN1dGUpIHN0YXRlLnZhbHVlID0gdG9WYWx1ZShpbml0aWFsU3RhdGUpO1xuXHRcdGVycm9yLnZhbHVlID0gdm9pZCAwO1xuXHRcdGlzUmVhZHkudmFsdWUgPSBmYWxzZTtcblx0XHRpc0xvYWRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlmIChkZWxheSQxID4gMCkgYXdhaXQgcHJvbWlzZVRpbWVvdXQoZGVsYXkkMSk7XG5cdFx0Y29uc3QgX3Byb21pc2UgPSB0eXBlb2YgcHJvbWlzZSA9PT0gXCJmdW5jdGlvblwiID8gcHJvbWlzZSguLi5hcmdzKSA6IHByb21pc2U7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGRhdGEgPSBhd2FpdCBfcHJvbWlzZTtcblx0XHRcdGlmIChleGVjdXRpb25JZCA9PT0gZXhlY3V0aW9uc0NvdW50KSB7XG5cdFx0XHRcdHN0YXRlLnZhbHVlID0gZGF0YTtcblx0XHRcdFx0aXNSZWFkeS52YWx1ZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRvblN1Y2Nlc3MoZGF0YSk7XG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoZXhlY3V0aW9uSWQgPT09IGV4ZWN1dGlvbnNDb3VudCkgZXJyb3IudmFsdWUgPSBlO1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHRcdGlmICh0aHJvd0Vycm9yKSB0aHJvdyBlO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoZXhlY3V0aW9uSWQgPT09IGV4ZWN1dGlvbnNDb3VudCkgaXNMb2FkaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdGlmIChpbW1lZGlhdGUpIGV4ZWN1dGUoZGVsYXkpO1xuXHRjb25zdCBzaGVsbCA9IHtcblx0XHRzdGF0ZSxcblx0XHRpc1JlYWR5LFxuXHRcdGlzTG9hZGluZyxcblx0XHRlcnJvcixcblx0XHRleGVjdXRlLFxuXHRcdGV4ZWN1dGVJbW1lZGlhdGU6ICguLi5hcmdzKSA9PiBleGVjdXRlKDAsIC4uLmFyZ3MpXG5cdH07XG5cdGZ1bmN0aW9uIHdhaXRVbnRpbElzTG9hZGVkKCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR1bnRpbChpc0xvYWRpbmcpLnRvQmUoZmFsc2UpLnRoZW4oKCkgPT4gcmVzb2x2ZShzaGVsbCkpLmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHQuLi5zaGVsbCxcblx0XHR0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdFx0XHRyZXR1cm4gd2FpdFVudGlsSXNMb2FkZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0XHR9XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJhc2U2NC9zZXJpYWxpemF0aW9uLnRzXG5jb25zdCBkZWZhdWx0cyA9IHtcblx0YXJyYXk6ICh2KSA9PiBKU09OLnN0cmluZ2lmeSh2KSxcblx0b2JqZWN0OiAodikgPT4gSlNPTi5zdHJpbmdpZnkodiksXG5cdHNldDogKHYpID0+IEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odikpLFxuXHRtYXA6ICh2KSA9PiBKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXModikpLFxuXHRudWxsOiAoKSA9PiBcIlwiXG59O1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNlcmlhbGl6YXRpb24odGFyZ2V0KSB7XG5cdGlmICghdGFyZ2V0KSByZXR1cm4gZGVmYXVsdHMubnVsbDtcblx0aWYgKHRhcmdldCBpbnN0YW5jZW9mIE1hcCkgcmV0dXJuIGRlZmF1bHRzLm1hcDtcblx0ZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgU2V0KSByZXR1cm4gZGVmYXVsdHMuc2V0O1xuXHRlbHNlIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHJldHVybiBkZWZhdWx0cy5hcnJheTtcblx0ZWxzZSByZXR1cm4gZGVmYXVsdHMub2JqZWN0O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCYXNlNjQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUJhc2U2NCh0YXJnZXQsIG9wdGlvbnMpIHtcblx0Y29uc3QgYmFzZTY0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgcHJvbWlzZSA9IHNoYWxsb3dSZWYoKTtcblx0ZnVuY3Rpb24gZXhlY3V0ZSgpIHtcblx0XHRpZiAoIWlzQ2xpZW50KSByZXR1cm47XG5cdFx0cHJvbWlzZS52YWx1ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IF90YXJnZXQgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0XHRcdGlmIChfdGFyZ2V0ID09IG51bGwpIHJlc29sdmUoXCJcIik7XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBfdGFyZ2V0ID09PSBcInN0cmluZ1wiKSByZXNvbHZlKGJsb2JUb0Jhc2U2NChuZXcgQmxvYihbX3RhcmdldF0sIHsgdHlwZTogXCJ0ZXh0L3BsYWluXCIgfSkpKTtcblx0XHRcdFx0ZWxzZSBpZiAoX3RhcmdldCBpbnN0YW5jZW9mIEJsb2IpIHJlc29sdmUoYmxvYlRvQmFzZTY0KF90YXJnZXQpKTtcblx0XHRcdFx0ZWxzZSBpZiAoX3RhcmdldCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXNvbHZlKHdpbmRvdy5idG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4ubmV3IFVpbnQ4QXJyYXkoX3RhcmdldCkpKSk7XG5cdFx0XHRcdGVsc2UgaWYgKF90YXJnZXQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgcmVzb2x2ZShfdGFyZ2V0LnRvRGF0YVVSTChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHlwZSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnF1YWxpdHkpKTtcblx0XHRcdFx0ZWxzZSBpZiAoX3RhcmdldCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHtcblx0XHRcdFx0XHRjb25zdCBpbWcgPSBfdGFyZ2V0LmNsb25lTm9kZShmYWxzZSk7XG5cdFx0XHRcdFx0aW1nLmNyb3NzT3JpZ2luID0gXCJBbm9ueW1vdXNcIjtcblx0XHRcdFx0XHRpbWdMb2FkZWQoaW1nKS50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG5cdFx0XHRcdFx0XHRjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXHRcdFx0XHRcdFx0Y2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xuXHRcdFx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG5cdFx0XHRcdFx0XHRjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUoY2FudmFzLnRvRGF0YVVSTChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHlwZSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnF1YWxpdHkpKTtcblx0XHRcdFx0XHR9KS5jYXRjaChyZWplY3QpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBfdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2VyaWFsaXplZCA9ICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNlcmlhbGl6ZXIpIHx8IGdldERlZmF1bHRTZXJpYWxpemF0aW9uKF90YXJnZXQpKShfdGFyZ2V0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZShibG9iVG9CYXNlNjQobmV3IEJsb2IoW3NlcmlhbGl6ZWRdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pKSk7XG5cdFx0XHRcdH0gZWxzZSByZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcInRhcmdldCBpcyB1bnN1cHBvcnRlZCB0eXBlc1wiKSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHByb21pc2UudmFsdWUudGhlbigocmVzKSA9PiB7XG5cdFx0XHRiYXNlNjQudmFsdWUgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRhdGFVcmwpID09PSBmYWxzZSA/IHJlcy5yZXBsYWNlKC9eZGF0YTouKj87YmFzZTY0LC8sIFwiXCIpIDogcmVzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcm9taXNlLnZhbHVlO1xuXHR9XG5cdGlmIChpc1JlZih0YXJnZXQpIHx8IHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIikgd2F0Y2godGFyZ2V0LCBleGVjdXRlLCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0ZWxzZSBleGVjdXRlKCk7XG5cdHJldHVybiB7XG5cdFx0YmFzZTY0LFxuXHRcdHByb21pc2UsXG5cdFx0ZXhlY3V0ZVxuXHR9O1xufVxuZnVuY3Rpb24gaW1nTG9hZGVkKGltZykge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGlmICghaW1nLmNvbXBsZXRlKSB7XG5cdFx0XHRpbWcub25sb2FkID0gKCkgPT4ge1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9O1xuXHRcdFx0aW1nLm9uZXJyb3IgPSByZWplY3Q7XG5cdFx0fSBlbHNlIHJlc29sdmUoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBibG9iVG9CYXNlNjQoYmxvYikge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IGZyID0gbmV3IEZpbGVSZWFkZXIoKTtcblx0XHRmci5vbmxvYWQgPSAoZSkgPT4ge1xuXHRcdFx0cmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuXHRcdH07XG5cdFx0ZnIub25lcnJvciA9IHJlamVjdDtcblx0XHRmci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQmF0dGVyeS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIEJhdHRlcnkgU3RhdHVzIEFQSS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQmF0dGVyeVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUJhdHRlcnkob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGV2ZW50cyQxID0gW1xuXHRcdFwiY2hhcmdpbmdjaGFuZ2VcIixcblx0XHRcImNoYXJnaW5ndGltZWNoYW5nZVwiLFxuXHRcdFwiZGlzY2hhcmdpbmd0aW1lY2hhbmdlXCIsXG5cdFx0XCJsZXZlbGNoYW5nZVwiXG5cdF07XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImdldEJhdHRlcnlcIiBpbiBuYXZpZ2F0b3IkMSAmJiB0eXBlb2YgbmF2aWdhdG9yJDEuZ2V0QmF0dGVyeSA9PT0gXCJmdW5jdGlvblwiKTtcblx0Y29uc3QgY2hhcmdpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgY2hhcmdpbmdUaW1lID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZGlzY2hhcmdpbmdUaW1lID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgbGV2ZWwgPSBzaGFsbG93UmVmKDEpO1xuXHRsZXQgYmF0dGVyeTtcblx0ZnVuY3Rpb24gdXBkYXRlQmF0dGVyeUluZm8oKSB7XG5cdFx0Y2hhcmdpbmcudmFsdWUgPSB0aGlzLmNoYXJnaW5nO1xuXHRcdGNoYXJnaW5nVGltZS52YWx1ZSA9IHRoaXMuY2hhcmdpbmdUaW1lIHx8IDA7XG5cdFx0ZGlzY2hhcmdpbmdUaW1lLnZhbHVlID0gdGhpcy5kaXNjaGFyZ2luZ1RpbWUgfHwgMDtcblx0XHRsZXZlbC52YWx1ZSA9IHRoaXMubGV2ZWw7XG5cdH1cblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBuYXZpZ2F0b3IkMS5nZXRCYXR0ZXJ5KCkudGhlbigoX2JhdHRlcnkpID0+IHtcblx0XHRiYXR0ZXJ5ID0gX2JhdHRlcnk7XG5cdFx0dXBkYXRlQmF0dGVyeUluZm8uY2FsbChiYXR0ZXJ5KTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGJhdHRlcnksIGV2ZW50cyQxLCB1cGRhdGVCYXR0ZXJ5SW5mbywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRjaGFyZ2luZyxcblx0XHRjaGFyZ2luZ1RpbWUsXG5cdFx0ZGlzY2hhcmdpbmdUaW1lLFxuXHRcdGxldmVsXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJsdWV0b290aC9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZUJsdWV0b290aChvcHRpb25zKSB7XG5cdGxldCB7IGFjY2VwdEFsbERldmljZXMgPSBmYWxzZSB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgeyBmaWx0ZXJzID0gdm9pZCAwLCBvcHRpb25hbFNlcnZpY2VzID0gdm9pZCAwLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiYmx1ZXRvb3RoXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBkZXZpY2UgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0d2F0Y2goZGV2aWNlLCAoKSA9PiB7XG5cdFx0Y29ubmVjdFRvQmx1ZXRvb3RoR0FUVFNlcnZlcigpO1xuXHR9KTtcblx0YXN5bmMgZnVuY3Rpb24gcmVxdWVzdERldmljZSgpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdGlmIChmaWx0ZXJzICYmIGZpbHRlcnMubGVuZ3RoID4gMCkgYWNjZXB0QWxsRGV2aWNlcyA9IGZhbHNlO1xuXHRcdHRyeSB7XG5cdFx0XHRkZXZpY2UudmFsdWUgPSBhd2FpdCAobmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvciQxLmJsdWV0b290aC5yZXF1ZXN0RGV2aWNlKHtcblx0XHRcdFx0YWNjZXB0QWxsRGV2aWNlcyxcblx0XHRcdFx0ZmlsdGVycyxcblx0XHRcdFx0b3B0aW9uYWxTZXJ2aWNlc1xuXHRcdFx0fSkpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBlcnI7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHNlcnZlciA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgaXNDb25uZWN0ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cdFx0aXNDb25uZWN0ZWQudmFsdWUgPSBmYWxzZTtcblx0XHRkZXZpY2UudmFsdWUgPSB2b2lkIDA7XG5cdFx0c2VydmVyLnZhbHVlID0gdm9pZCAwO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RUb0JsdWV0b290aEdBVFRTZXJ2ZXIoKSB7XG5cdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdGlmIChkZXZpY2UudmFsdWUgJiYgZGV2aWNlLnZhbHVlLmdhdHQpIHtcblx0XHRcdHVzZUV2ZW50TGlzdGVuZXIoZGV2aWNlLCBcImdhdHRzZXJ2ZXJkaXNjb25uZWN0ZWRcIiwgcmVzZXQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHNlcnZlci52YWx1ZSA9IGF3YWl0IGRldmljZS52YWx1ZS5nYXR0LmNvbm5lY3QoKTtcblx0XHRcdFx0aXNDb25uZWN0ZWQudmFsdWUgPSBzZXJ2ZXIudmFsdWUuY29ubmVjdGVkO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdGVycm9yLnZhbHVlID0gZXJyO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdHZhciBfZGV2aWNlJHZhbHVlJGdhdHQ7XG5cdFx0aWYgKGRldmljZS52YWx1ZSkgKF9kZXZpY2UkdmFsdWUkZ2F0dCA9IGRldmljZS52YWx1ZS5nYXR0KSA9PT0gbnVsbCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQgPT09IHZvaWQgMCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQuY29ubmVjdCgpO1xuXHR9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHZhciBfZGV2aWNlJHZhbHVlJGdhdHQyO1xuXHRcdGlmIChkZXZpY2UudmFsdWUpIChfZGV2aWNlJHZhbHVlJGdhdHQyID0gZGV2aWNlLnZhbHVlLmdhdHQpID09PSBudWxsIHx8IF9kZXZpY2UkdmFsdWUkZ2F0dDIgPT09IHZvaWQgMCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQyLmRpc2Nvbm5lY3QoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNDb25uZWN0ZWQ6IHJlYWRvbmx5KGlzQ29ubmVjdGVkKSxcblx0XHRkZXZpY2UsXG5cdFx0cmVxdWVzdERldmljZSxcblx0XHRzZXJ2ZXIsXG5cdFx0ZXJyb3Jcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU1NSV2lkdGgvaW5kZXgudHNcbmNvbnN0IHNzcldpZHRoU3ltYm9sID0gU3ltYm9sKFwidnVldXNlLXNzci13aWR0aFwiKTtcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VTU1JXaWR0aCgpIHtcblx0Y29uc3Qgc3NyV2lkdGggPSBoYXNJbmplY3Rpb25Db250ZXh0KCkgPyBpbmplY3RMb2NhbChzc3JXaWR0aFN5bWJvbCwgbnVsbCkgOiBudWxsO1xuXHRyZXR1cm4gdHlwZW9mIHNzcldpZHRoID09PSBcIm51bWJlclwiID8gc3NyV2lkdGggOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBwcm92aWRlU1NSV2lkdGgod2lkdGgsIGFwcCkge1xuXHRpZiAoYXBwICE9PSB2b2lkIDApIGFwcC5wcm92aWRlKHNzcldpZHRoU3ltYm9sLCB3aWR0aCk7XG5cdGVsc2UgcHJvdmlkZUxvY2FsKHNzcldpZHRoU3ltYm9sLCB3aWR0aCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1lZGlhUXVlcnkvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBNZWRpYSBRdWVyeS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWVkaWFRdWVyeVxuKiBAcGFyYW0gcXVlcnlcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VNZWRpYVF1ZXJ5KHF1ZXJ5LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3NyV2lkdGggPSAvKiBAX19QVVJFX18gKi8gdXNlU1NSV2lkdGgoKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwibWF0Y2hNZWRpYVwiIGluIHdpbmRvdyQxICYmIHR5cGVvZiB3aW5kb3ckMS5tYXRjaE1lZGlhID09PSBcImZ1bmN0aW9uXCIpO1xuXHRjb25zdCBzc3JTdXBwb3J0ID0gc2hhbGxvd1JlZih0eXBlb2Ygc3NyV2lkdGggPT09IFwibnVtYmVyXCIpO1xuXHRjb25zdCBtZWRpYVF1ZXJ5ID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBtYXRjaGVzID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQpID0+IHtcblx0XHRtYXRjaGVzLnZhbHVlID0gZXZlbnQubWF0Y2hlcztcblx0fTtcblx0d2F0Y2hFZmZlY3QoKCkgPT4ge1xuXHRcdGlmIChzc3JTdXBwb3J0LnZhbHVlKSB7XG5cdFx0XHRzc3JTdXBwb3J0LnZhbHVlID0gIWlzU3VwcG9ydGVkLnZhbHVlO1xuXHRcdFx0bWF0Y2hlcy52YWx1ZSA9IHRvVmFsdWUocXVlcnkpLnNwbGl0KFwiLFwiKS5zb21lKChxdWVyeVN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBub3QgPSBxdWVyeVN0cmluZy5pbmNsdWRlcyhcIm5vdCBhbGxcIik7XG5cdFx0XHRcdGNvbnN0IG1pbldpZHRoID0gcXVlcnlTdHJpbmcubWF0Y2goL1xcKFxccyptaW4td2lkdGg6XFxzKigtP1xcZCsoPzpcXC5cXGQqKT9bYS16XStcXHMqKVxcKS8pO1xuXHRcdFx0XHRjb25zdCBtYXhXaWR0aCA9IHF1ZXJ5U3RyaW5nLm1hdGNoKC9cXChcXHMqbWF4LXdpZHRoOlxccyooLT9cXGQrKD86XFwuXFxkKik/W2Etel0rXFxzKilcXCkvKTtcblx0XHRcdFx0bGV0IHJlcyA9IEJvb2xlYW4obWluV2lkdGggfHwgbWF4V2lkdGgpO1xuXHRcdFx0XHRpZiAobWluV2lkdGggJiYgcmVzKSByZXMgPSBzc3JXaWR0aCA+PSBweFZhbHVlKG1pbldpZHRoWzFdKTtcblx0XHRcdFx0aWYgKG1heFdpZHRoICYmIHJlcykgcmVzID0gc3NyV2lkdGggPD0gcHhWYWx1ZShtYXhXaWR0aFsxXSk7XG5cdFx0XHRcdHJldHVybiBub3QgPyAhcmVzIDogcmVzO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRtZWRpYVF1ZXJ5LnZhbHVlID0gd2luZG93JDEubWF0Y2hNZWRpYSh0b1ZhbHVlKHF1ZXJ5KSk7XG5cdFx0bWF0Y2hlcy52YWx1ZSA9IG1lZGlhUXVlcnkudmFsdWUubWF0Y2hlcztcblx0fSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIobWVkaWFRdWVyeSwgXCJjaGFuZ2VcIiwgaGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gbWF0Y2hlcy52YWx1ZSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJyZWFrcG9pbnRzL2JyZWFrcG9pbnRzLnRzXG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBUYWlsd2luZCBWMlxuKlxuKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYnJlYWtwb2ludHNcbiovXG5jb25zdCBicmVha3BvaW50c1RhaWx3aW5kID0ge1xuXHRcInNtXCI6IDY0MCxcblx0XCJtZFwiOiA3NjgsXG5cdFwibGdcIjogMTAyNCxcblx0XCJ4bFwiOiAxMjgwLFxuXHRcIjJ4bFwiOiAxNTM2XG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gQm9vdHN0cmFwIFY1XG4qXG4qIEBzZWUgaHR0cHM6Ly9nZXRib290c3RyYXAuY29tL2RvY3MvNS4wL2xheW91dC9icmVha3BvaW50c1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzQm9vdHN0cmFwVjUgPSB7XG5cdHhzOiAwLFxuXHRzbTogNTc2LFxuXHRtZDogNzY4LFxuXHRsZzogOTkyLFxuXHR4bDogMTIwMCxcblx0eHhsOiAxNDAwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gVnVldGlmeSBWMlxuKlxuKiBAc2VlIGh0dHBzOi8vdjIudnVldGlmeWpzLmNvbS9lbi9mZWF0dXJlcy9icmVha3BvaW50cy9cbiovXG5jb25zdCBicmVha3BvaW50c1Z1ZXRpZnlWMiA9IHtcblx0eHM6IDAsXG5cdHNtOiA2MDAsXG5cdG1kOiA5NjAsXG5cdGxnOiAxMjY0LFxuXHR4bDogMTkwNFxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIFZ1ZXRpZnkgVjNcbipcbiogQHNlZSBodHRwczovL3Z1ZXRpZnlqcy5jb20vZW4vc3R5bGVzL2Zsb2F0LyNvdmVydmlld1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzVnVldGlmeVYzID0ge1xuXHR4czogMCxcblx0c206IDYwMCxcblx0bWQ6IDk2MCxcblx0bGc6IDEyODAsXG5cdHhsOiAxOTIwLFxuXHR4eGw6IDI1NjBcbn07XG4vKipcbiogQWxpYXMgdG8gYGJyZWFrcG9pbnRzVnVldGlmeVYyYFxuKlxuKiBAZGVwcmVjYXRlZCBleHBsaWN0bHkgdXNlIGBicmVha3BvaW50c1Z1ZXRpZnlWMmAgb3IgYGJyZWFrcG9pbnRzVnVldGlmeVYzYCBpbnN0ZWFkXG4qL1xuY29uc3QgYnJlYWtwb2ludHNWdWV0aWZ5ID0gYnJlYWtwb2ludHNWdWV0aWZ5VjI7XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBBbnQgRGVzaWduXG4qXG4qIEBzZWUgaHR0cHM6Ly9hbnQuZGVzaWduL2NvbXBvbmVudHMvbGF5b3V0LyNicmVha3BvaW50LXdpZHRoXG4qL1xuY29uc3QgYnJlYWtwb2ludHNBbnREZXNpZ24gPSB7XG5cdHhzOiA0ODAsXG5cdHNtOiA1NzYsXG5cdG1kOiA3NjgsXG5cdGxnOiA5OTIsXG5cdHhsOiAxMjAwLFxuXHR4eGw6IDE2MDBcbn07XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBRdWFzYXIgVjJcbipcbiogQHNlZSBodHRwczovL3F1YXNhci5kZXYvc3R5bGUvYnJlYWtwb2ludHNcbiovXG5jb25zdCBicmVha3BvaW50c1F1YXNhciA9IHtcblx0eHM6IDAsXG5cdHNtOiA2MDAsXG5cdG1kOiAxMDI0LFxuXHRsZzogMTQ0MCxcblx0eGw6IDE5MjBcbn07XG4vKipcbiogU2VtYXRpYyBCcmVha3BvaW50c1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzU2VtYXRpYyA9IHtcblx0bW9iaWxlUzogMzIwLFxuXHRtb2JpbGVNOiAzNzUsXG5cdG1vYmlsZUw6IDQyNSxcblx0dGFibGV0OiA3NjgsXG5cdGxhcHRvcDogMTAyNCxcblx0bGFwdG9wTDogMTQ0MCxcblx0ZGVza3RvcDRLOiAyNTYwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gTWFzdGVyIENTU1xuKlxuKiBAc2VlIGh0dHBzOi8vZG9jcy5tYXN0ZXIuY28vY3NzL2JyZWFrcG9pbnRzXG4qL1xuY29uc3QgYnJlYWtwb2ludHNNYXN0ZXJDc3MgPSB7XG5cdFwiM3hzXCI6IDM2MCxcblx0XCIyeHNcIjogNDgwLFxuXHRcInhzXCI6IDYwMCxcblx0XCJzbVwiOiA3NjgsXG5cdFwibWRcIjogMTAyNCxcblx0XCJsZ1wiOiAxMjgwLFxuXHRcInhsXCI6IDE0NDAsXG5cdFwiMnhsXCI6IDE2MDAsXG5cdFwiM3hsXCI6IDE5MjAsXG5cdFwiNHhsXCI6IDI1NjBcbn07XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBQcmltZUZsZXhcbipcbiogQHNlZSBodHRwczovL3ByaW1lZmxleC5vcmcvaW5zdGFsbGF0aW9uXG4qL1xuY29uc3QgYnJlYWtwb2ludHNQcmltZUZsZXggPSB7XG5cdHNtOiA1NzYsXG5cdG1kOiA3NjgsXG5cdGxnOiA5OTIsXG5cdHhsOiAxMjAwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gRWxlbWVudFVJL0VsZW1lbnRQbHVzXG4qXG4qIEBzZWUgaHR0cHM6Ly9lbGVtZW50LmVsZW1lLmlvLyMvZW4tVVMvY29tcG9uZW50L2xheW91dFxuKiBAc2VlIGh0dHBzOi8vZWxlbWVudC1wbHVzLm9yZy9lbi1VUy9jb21wb25lbnQvbGF5b3V0Lmh0bWxcbiovXG5jb25zdCBicmVha3BvaW50c0VsZW1lbnQgPSB7XG5cdHhzOiAwLFxuXHRzbTogNzY4LFxuXHRtZDogOTkyLFxuXHRsZzogMTIwMCxcblx0eGw6IDE5MjBcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJyZWFrcG9pbnRzL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSB2aWV3cG9ydCBicmVha3BvaW50c1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VCcmVha3BvaW50c1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBvcHRpb25zID0ge30pIHtcblx0ZnVuY3Rpb24gZ2V0VmFsdWUkMShrLCBkZWx0YSkge1xuXHRcdGxldCB2ID0gdG9WYWx1ZShicmVha3BvaW50c1t0b1ZhbHVlKGspXSk7XG5cdFx0aWYgKGRlbHRhICE9IG51bGwpIHYgPSBpbmNyZWFzZVdpdGhVbml0KHYsIGRlbHRhKTtcblx0XHRpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHYgPSBgJHt2fXB4YDtcblx0XHRyZXR1cm4gdjtcblx0fVxuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBzdHJhdGVneSA9IFwibWluLXdpZHRoXCIsIHNzcldpZHRoID0gLyogQF9fUFVSRV9fICovIHVzZVNTUldpZHRoKCkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHNzclN1cHBvcnQgPSB0eXBlb2Ygc3NyV2lkdGggPT09IFwibnVtYmVyXCI7XG5cdGNvbnN0IG1vdW50ZWQgPSBzc3JTdXBwb3J0ID8gc2hhbGxvd1JlZihmYWxzZSkgOiB7IHZhbHVlOiB0cnVlIH07XG5cdGlmIChzc3JTdXBwb3J0KSB0cnlPbk1vdW50ZWQoKCkgPT4gbW91bnRlZC52YWx1ZSA9ICEhd2luZG93JDEpO1xuXHRmdW5jdGlvbiBtYXRjaChxdWVyeSwgc2l6ZSkge1xuXHRcdGlmICghbW91bnRlZC52YWx1ZSAmJiBzc3JTdXBwb3J0KSByZXR1cm4gcXVlcnkgPT09IFwibWluXCIgPyBzc3JXaWR0aCA+PSBweFZhbHVlKHNpemUpIDogc3NyV2lkdGggPD0gcHhWYWx1ZShzaXplKTtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIHdpbmRvdyQxLm1hdGNoTWVkaWEoYCgke3F1ZXJ5fS13aWR0aDogJHtzaXplfSlgKS5tYXRjaGVzO1xuXHR9XG5cdGNvbnN0IGdyZWF0ZXJPckVxdWFsID0gKGspID0+IHtcblx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1pbi13aWR0aDogJHtnZXRWYWx1ZSQxKGspfSlgLCBvcHRpb25zKTtcblx0fTtcblx0Y29uc3Qgc21hbGxlck9yRXF1YWwgPSAoaykgPT4ge1xuXHRcdHJldHVybiB1c2VNZWRpYVF1ZXJ5KCgpID0+IGAobWF4LXdpZHRoOiAke2dldFZhbHVlJDEoayl9KWAsIG9wdGlvbnMpO1xuXHR9O1xuXHRjb25zdCBzaG9ydGN1dE1ldGhvZHMgPSBPYmplY3Qua2V5cyhicmVha3BvaW50cykucmVkdWNlKChzaG9ydGN1dHMsIGspID0+IHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hvcnRjdXRzLCBrLCB7XG5cdFx0XHRnZXQ6ICgpID0+IHN0cmF0ZWd5ID09PSBcIm1pbi13aWR0aFwiID8gZ3JlYXRlck9yRXF1YWwoaykgOiBzbWFsbGVyT3JFcXVhbChrKSxcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHR9KTtcblx0XHRyZXR1cm4gc2hvcnRjdXRzO1xuXHR9LCB7fSk7XG5cdGZ1bmN0aW9uIGN1cnJlbnQoKSB7XG5cdFx0Y29uc3QgcG9pbnRzID0gT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLm1hcCgoaykgPT4gW1xuXHRcdFx0ayxcblx0XHRcdHNob3J0Y3V0TWV0aG9kc1trXSxcblx0XHRcdHB4VmFsdWUoZ2V0VmFsdWUkMShrKSlcblx0XHRdKS5zb3J0KChhLCBiKSA9PiBhWzJdIC0gYlsyXSk7XG5cdFx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHBvaW50cy5maWx0ZXIoKFssIHZdKSA9PiB2LnZhbHVlKS5tYXAoKFtrXSkgPT4gaykpO1xuXHR9XG5cdHJldHVybiBPYmplY3QuYXNzaWduKHNob3J0Y3V0TWV0aG9kcywge1xuXHRcdGdyZWF0ZXJPckVxdWFsLFxuXHRcdHNtYWxsZXJPckVxdWFsLFxuXHRcdGdyZWF0ZXIoaykge1xuXHRcdFx0cmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUkMShrLCAuMSl9KWAsIG9wdGlvbnMpO1xuXHRcdH0sXG5cdFx0c21hbGxlcihrKSB7XG5cdFx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1heC13aWR0aDogJHtnZXRWYWx1ZSQxKGssIC0uMSl9KWAsIG9wdGlvbnMpO1xuXHRcdH0sXG5cdFx0YmV0d2VlbihhLCBiKSB7XG5cdFx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1pbi13aWR0aDogJHtnZXRWYWx1ZSQxKGEpfSkgYW5kIChtYXgtd2lkdGg6ICR7Z2V0VmFsdWUkMShiLCAtLjEpfSlgLCBvcHRpb25zKTtcblx0XHR9LFxuXHRcdGlzR3JlYXRlcihrKSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2goXCJtaW5cIiwgZ2V0VmFsdWUkMShrLCAuMSkpO1xuXHRcdH0sXG5cdFx0aXNHcmVhdGVyT3JFcXVhbChrKSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2goXCJtaW5cIiwgZ2V0VmFsdWUkMShrKSk7XG5cdFx0fSxcblx0XHRpc1NtYWxsZXIoaykge1xuXHRcdFx0cmV0dXJuIG1hdGNoKFwibWF4XCIsIGdldFZhbHVlJDEoaywgLS4xKSk7XG5cdFx0fSxcblx0XHRpc1NtYWxsZXJPckVxdWFsKGspIHtcblx0XHRcdHJldHVybiBtYXRjaChcIm1heFwiLCBnZXRWYWx1ZSQxKGspKTtcblx0XHR9LFxuXHRcdGlzSW5CZXR3ZWVuKGEsIGIpIHtcblx0XHRcdHJldHVybiBtYXRjaChcIm1pblwiLCBnZXRWYWx1ZSQxKGEpKSAmJiBtYXRjaChcIm1heFwiLCBnZXRWYWx1ZSQxKGIsIC0uMSkpO1xuXHRcdH0sXG5cdFx0Y3VycmVudCxcblx0XHRhY3RpdmUoKSB7XG5cdFx0XHRjb25zdCBicHMgPSBjdXJyZW50KCk7XG5cdFx0XHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gYnBzLnZhbHVlLmxlbmd0aCA9PT0gMCA/IFwiXCIgOiBicHMudmFsdWUuYXQoc3RyYXRlZ3kgPT09IFwibWluLXdpZHRoXCIgPyAtMSA6IDApKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCcm9hZGNhc3RDaGFubmVsL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgQnJvYWRjYXN0Q2hhbm5lbFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VCcm9hZGNhc3RDaGFubmVsXG4qIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Jyb2FkY2FzdENoYW5uZWxcbiogQHBhcmFtIG9wdGlvbnNcbipcbiovXG5mdW5jdGlvbiB1c2VCcm9hZGNhc3RDaGFubmVsKG9wdGlvbnMpIHtcblx0Y29uc3QgeyBuYW1lLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiQnJvYWRjYXN0Q2hhbm5lbFwiIGluIHdpbmRvdyQxKTtcblx0Y29uc3QgaXNDbG9zZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgY2hhbm5lbCA9IHJlZigpO1xuXHRjb25zdCBkYXRhID0gcmVmKCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgcG9zdCA9IChkYXRhJDEpID0+IHtcblx0XHRpZiAoY2hhbm5lbC52YWx1ZSkgY2hhbm5lbC52YWx1ZS5wb3N0TWVzc2FnZShkYXRhJDEpO1xuXHR9O1xuXHRjb25zdCBjbG9zZSA9ICgpID0+IHtcblx0XHRpZiAoY2hhbm5lbC52YWx1ZSkgY2hhbm5lbC52YWx1ZS5jbG9zZSgpO1xuXHRcdGlzQ2xvc2VkLnZhbHVlID0gdHJ1ZTtcblx0fTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0XHRjaGFubmVsLnZhbHVlID0gbmV3IEJyb2FkY2FzdENoYW5uZWwobmFtZSk7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihjaGFubmVsLCBcIm1lc3NhZ2VcIiwgKGUpID0+IHtcblx0XHRcdGRhdGEudmFsdWUgPSBlLmRhdGE7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGNoYW5uZWwsIFwibWVzc2FnZWVycm9yXCIsIChlKSA9PiB7XG5cdFx0XHRlcnJvci52YWx1ZSA9IGU7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGNoYW5uZWwsIFwiY2xvc2VcIiwgKCkgPT4ge1xuXHRcdFx0aXNDbG9zZWQudmFsdWUgPSB0cnVlO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH0pO1xuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0Y2xvc2UoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y2hhbm5lbCxcblx0XHRkYXRhLFxuXHRcdHBvc3QsXG5cdFx0Y2xvc2UsXG5cdFx0ZXJyb3IsXG5cdFx0aXNDbG9zZWRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQnJvd3NlckxvY2F0aW9uL2luZGV4LnRzXG5jb25zdCBXUklUQUJMRV9QUk9QRVJUSUVTID0gW1xuXHRcImhhc2hcIixcblx0XCJob3N0XCIsXG5cdFwiaG9zdG5hbWVcIixcblx0XCJocmVmXCIsXG5cdFwicGF0aG5hbWVcIixcblx0XCJwb3J0XCIsXG5cdFwicHJvdG9jb2xcIixcblx0XCJzZWFyY2hcIlxuXTtcbi8qKlxuKiBSZWFjdGl2ZSBicm93c2VyIGxvY2F0aW9uLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VCcm93c2VyTG9jYXRpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VCcm93c2VyTG9jYXRpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJlZnMgPSBPYmplY3QuZnJvbUVudHJpZXMoV1JJVEFCTEVfUFJPUEVSVElFUy5tYXAoKGtleSkgPT4gW2tleSwgcmVmKCldKSk7XG5cdGZvciAoY29uc3QgW2tleSwgcmVmJDFdIG9mIG9iamVjdEVudHJpZXMocmVmcykpIHdhdGNoKHJlZiQxLCAodmFsdWUpID0+IHtcblx0XHRpZiAoISh3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEubG9jYXRpb24pIHx8IHdpbmRvdyQxLmxvY2F0aW9uW2tleV0gPT09IHZhbHVlKSByZXR1cm47XG5cdFx0d2luZG93JDEubG9jYXRpb25ba2V5XSA9IHZhbHVlO1xuXHR9KTtcblx0Y29uc3QgYnVpbGRTdGF0ZSA9ICh0cmlnZ2VyKSA9PiB7XG5cdFx0dmFyIF93aW5kb3ckbG9jYXRpb247XG5cdFx0Y29uc3QgeyBzdGF0ZTogc3RhdGUkMSwgbGVuZ3RoIH0gPSAod2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmhpc3RvcnkpIHx8IHt9O1xuXHRcdGNvbnN0IHsgb3JpZ2luIH0gPSAod2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmxvY2F0aW9uKSB8fCB7fTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBXUklUQUJMRV9QUk9QRVJUSUVTKSByZWZzW2tleV0udmFsdWUgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwIHx8IChfd2luZG93JGxvY2F0aW9uID0gd2luZG93JDEubG9jYXRpb24pID09PSBudWxsIHx8IF93aW5kb3ckbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckbG9jYXRpb25ba2V5XTtcblx0XHRyZXR1cm4gcmVhY3RpdmUoe1xuXHRcdFx0dHJpZ2dlcixcblx0XHRcdHN0YXRlOiBzdGF0ZSQxLFxuXHRcdFx0bGVuZ3RoLFxuXHRcdFx0b3JpZ2luLFxuXHRcdFx0Li4ucmVmc1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBzdGF0ZSA9IHJlZihidWlsZFN0YXRlKFwibG9hZFwiKSk7XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwicG9wc3RhdGVcIiwgKCkgPT4gc3RhdGUudmFsdWUgPSBidWlsZFN0YXRlKFwicG9wc3RhdGVcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJoYXNoY2hhbmdlXCIsICgpID0+IHN0YXRlLnZhbHVlID0gYnVpbGRTdGF0ZShcImhhc2hjaGFuZ2VcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDYWNoZWQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUNhY2hlZChyZWZWYWx1ZSwgY29tcGFyYXRvciA9IChhLCBiKSA9PiBhID09PSBiLCBvcHRpb25zKSB7XG5cdGNvbnN0IHsgZGVlcFJlZnMgPSB0cnVlLC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgY2FjaGVkVmFsdWUgPSBjcmVhdGVSZWYocmVmVmFsdWUudmFsdWUsIGRlZXBSZWZzKTtcblx0d2F0Y2goKCkgPT4gcmVmVmFsdWUudmFsdWUsICh2YWx1ZSkgPT4ge1xuXHRcdGlmICghY29tcGFyYXRvcih2YWx1ZSwgY2FjaGVkVmFsdWUudmFsdWUpKSBjYWNoZWRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuXHR9LCB3YXRjaE9wdGlvbnMpO1xuXHRyZXR1cm4gY2FjaGVkVmFsdWU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBlcm1pc3Npb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBQZXJtaXNzaW9ucyBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVBlcm1pc3Npb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQZXJtaXNzaW9uKHBlcm1pc3Npb25EZXNjLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBjb250cm9scyA9IGZhbHNlLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwicGVybWlzc2lvbnNcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IHBlcm1pc3Npb25TdGF0dXMgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGRlc2MgPSB0eXBlb2YgcGVybWlzc2lvbkRlc2MgPT09IFwic3RyaW5nXCIgPyB7IG5hbWU6IHBlcm1pc3Npb25EZXNjIH0gOiBwZXJtaXNzaW9uRGVzYztcblx0Y29uc3Qgc3RhdGUgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcblx0XHR2YXIgX3Blcm1pc3Npb25TdGF0dXMkdmFsLCBfcGVybWlzc2lvblN0YXR1cyR2YWwyO1xuXHRcdHN0YXRlLnZhbHVlID0gKF9wZXJtaXNzaW9uU3RhdHVzJHZhbCA9IChfcGVybWlzc2lvblN0YXR1cyR2YWwyID0gcGVybWlzc2lvblN0YXR1cy52YWx1ZSkgPT09IG51bGwgfHwgX3Blcm1pc3Npb25TdGF0dXMkdmFsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Blcm1pc3Npb25TdGF0dXMkdmFsMi5zdGF0ZSkgIT09IG51bGwgJiYgX3Blcm1pc3Npb25TdGF0dXMkdmFsICE9PSB2b2lkIDAgPyBfcGVybWlzc2lvblN0YXR1cyR2YWwgOiBcInByb21wdFwiO1xuXHR9O1xuXHR1c2VFdmVudExpc3RlbmVyKHBlcm1pc3Npb25TdGF0dXMsIFwiY2hhbmdlXCIsIHVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRjb25zdCBxdWVyeSA9IGNyZWF0ZVNpbmdsZXRvblByb21pc2UoYXN5bmMgKCkgPT4ge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRpZiAoIXBlcm1pc3Npb25TdGF0dXMudmFsdWUpIHRyeSB7XG5cdFx0XHRwZXJtaXNzaW9uU3RhdHVzLnZhbHVlID0gYXdhaXQgbmF2aWdhdG9yJDEucGVybWlzc2lvbnMucXVlcnkoZGVzYyk7XG5cdFx0fSBjYXRjaCAoX3VudXNlZCkge1xuXHRcdFx0cGVybWlzc2lvblN0YXR1cy52YWx1ZSA9IHZvaWQgMDtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dXBkYXRlKCk7XG5cdFx0fVxuXHRcdGlmIChjb250cm9scykgcmV0dXJuIHRvUmF3KHBlcm1pc3Npb25TdGF0dXMudmFsdWUpO1xuXHR9KTtcblx0cXVlcnkoKTtcblx0aWYgKGNvbnRyb2xzKSByZXR1cm4ge1xuXHRcdHN0YXRlLFxuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHF1ZXJ5XG5cdH07XG5cdGVsc2UgcmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDbGlwYm9hcmQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUNsaXBib2FyZChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgcmVhZCA9IGZhbHNlLCBzb3VyY2UsIGNvcGllZER1cmluZyA9IDE1MDAsIGxlZ2FjeSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0NsaXBib2FyZEFwaVN1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJjbGlwYm9hcmRcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IHBlcm1pc3Npb25SZWFkID0gdXNlUGVybWlzc2lvbihcImNsaXBib2FyZC1yZWFkXCIpO1xuXHRjb25zdCBwZXJtaXNzaW9uV3JpdGUgPSB1c2VQZXJtaXNzaW9uKFwiY2xpcGJvYXJkLXdyaXRlXCIpO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IGNvbXB1dGVkKCgpID0+IGlzQ2xpcGJvYXJkQXBpU3VwcG9ydGVkLnZhbHVlIHx8IGxlZ2FjeSk7XG5cdGNvbnN0IHRleHQgPSBzaGFsbG93UmVmKFwiXCIpO1xuXHRjb25zdCBjb3BpZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgdGltZW91dCA9IHVzZVRpbWVvdXRGbigoKSA9PiBjb3BpZWQudmFsdWUgPSBmYWxzZSwgY29waWVkRHVyaW5nLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVRleHQoKSB7XG5cdFx0bGV0IHVzZUxlZ2FjeSA9ICEoaXNDbGlwYm9hcmRBcGlTdXBwb3J0ZWQudmFsdWUgJiYgaXNBbGxvd2VkKHBlcm1pc3Npb25SZWFkLnZhbHVlKSk7XG5cdFx0aWYgKCF1c2VMZWdhY3kpIHRyeSB7XG5cdFx0XHR0ZXh0LnZhbHVlID0gYXdhaXQgbmF2aWdhdG9yJDEuY2xpcGJvYXJkLnJlYWRUZXh0KCk7XG5cdFx0fSBjYXRjaCAoX3VudXNlZCkge1xuXHRcdFx0dXNlTGVnYWN5ID0gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHVzZUxlZ2FjeSkgdGV4dC52YWx1ZSA9IGxlZ2FjeVJlYWQoKTtcblx0fVxuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgcmVhZCkgdXNlRXZlbnRMaXN0ZW5lcihbXCJjb3B5XCIsIFwiY3V0XCJdLCB1cGRhdGVUZXh0LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdGFzeW5jIGZ1bmN0aW9uIGNvcHkodmFsdWUgPSB0b1ZhbHVlKHNvdXJjZSkpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0bGV0IHVzZUxlZ2FjeSA9ICEoaXNDbGlwYm9hcmRBcGlTdXBwb3J0ZWQudmFsdWUgJiYgaXNBbGxvd2VkKHBlcm1pc3Npb25Xcml0ZS52YWx1ZSkpO1xuXHRcdFx0aWYgKCF1c2VMZWdhY3kpIHRyeSB7XG5cdFx0XHRcdGF3YWl0IG5hdmlnYXRvciQxLmNsaXBib2FyZC53cml0ZVRleHQodmFsdWUpO1xuXHRcdFx0fSBjYXRjaCAoX3VudXNlZDIpIHtcblx0XHRcdFx0dXNlTGVnYWN5ID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmICh1c2VMZWdhY3kpIGxlZ2FjeUNvcHkodmFsdWUpO1xuXHRcdFx0dGV4dC52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0Y29waWVkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdHRpbWVvdXQuc3RhcnQoKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gbGVnYWN5Q29weSh2YWx1ZSkge1xuXHRcdGNvbnN0IHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXHRcdHRhLnZhbHVlID0gdmFsdWU7XG5cdFx0dGEuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0dGEuc3R5bGUub3BhY2l0eSA9IFwiMFwiO1xuXHRcdHRhLnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIFwiXCIpO1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpO1xuXHRcdHRhLnNlbGVjdCgpO1xuXHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcblx0XHR0YS5yZW1vdmUoKTtcblx0fVxuXHRmdW5jdGlvbiBsZWdhY3lSZWFkKCkge1xuXHRcdHZhciBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8sIF9kb2N1bWVudCwgX2RvY3VtZW50JGdldFNlbGVjdGlvMjtcblx0XHRyZXR1cm4gKF9kb2N1bWVudCRnZXRTZWxlY3RpbyA9IChfZG9jdW1lbnQgPSBkb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50ID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCRnZXRTZWxlY3RpbzIgPSBfZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8yID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCRnZXRTZWxlY3RpbzIgPSBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8yLmNhbGwoX2RvY3VtZW50KSkgPT09IG51bGwgfHwgX2RvY3VtZW50JGdldFNlbGVjdGlvMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50JGdldFNlbGVjdGlvMi50b1N0cmluZygpKSAhPT0gbnVsbCAmJiBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8gIT09IHZvaWQgMCA/IF9kb2N1bWVudCRnZXRTZWxlY3RpbyA6IFwiXCI7XG5cdH1cblx0ZnVuY3Rpb24gaXNBbGxvd2VkKHN0YXR1cykge1xuXHRcdHJldHVybiBzdGF0dXMgPT09IFwiZ3JhbnRlZFwiIHx8IHN0YXR1cyA9PT0gXCJwcm9tcHRcIjtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHRleHQ6IHJlYWRvbmx5KHRleHQpLFxuXHRcdGNvcGllZDogcmVhZG9ubHkoY29waWVkKSxcblx0XHRjb3B5XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNsaXBib2FyZEl0ZW1zL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDbGlwYm9hcmRJdGVtcyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgcmVhZCA9IGZhbHNlLCBzb3VyY2UsIGNvcGllZER1cmluZyA9IDE1MDAgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImNsaXBib2FyZFwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgY29udGVudCA9IHJlZihbXSk7XG5cdGNvbnN0IGNvcGllZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCB0aW1lb3V0ID0gdXNlVGltZW91dEZuKCgpID0+IGNvcGllZC52YWx1ZSA9IGZhbHNlLCBjb3BpZWREdXJpbmcsIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcblx0ZnVuY3Rpb24gdXBkYXRlQ29udGVudCgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIG5hdmlnYXRvciQxLmNsaXBib2FyZC5yZWFkKCkudGhlbigoaXRlbXMpID0+IHtcblx0XHRcdGNvbnRlbnQudmFsdWUgPSBpdGVtcztcblx0XHR9KTtcblx0fVxuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgcmVhZCkgdXNlRXZlbnRMaXN0ZW5lcihbXCJjb3B5XCIsIFwiY3V0XCJdLCB1cGRhdGVDb250ZW50LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdGFzeW5jIGZ1bmN0aW9uIGNvcHkodmFsdWUgPSB0b1ZhbHVlKHNvdXJjZSkpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0YXdhaXQgbmF2aWdhdG9yJDEuY2xpcGJvYXJkLndyaXRlKHZhbHVlKTtcblx0XHRcdGNvbnRlbnQudmFsdWUgPSB2YWx1ZTtcblx0XHRcdGNvcGllZC52YWx1ZSA9IHRydWU7XG5cdFx0XHR0aW1lb3V0LnN0YXJ0KCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y29udGVudDogc2hhbGxvd1JlYWRvbmx5KGNvbnRlbnQpLFxuXHRcdGNvcGllZDogcmVhZG9ubHkoY29waWVkKSxcblx0XHRjb3B5LFxuXHRcdHJlYWQ6IHVwZGF0ZUNvbnRlbnRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ2xvbmVkL2luZGV4LnRzXG5mdW5jdGlvbiBjbG9uZUZuSlNPTihzb3VyY2UpIHtcblx0cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc291cmNlKSk7XG59XG5mdW5jdGlvbiB1c2VDbG9uZWQoc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgY2xvbmVkID0gcmVmKHt9KTtcblx0Y29uc3QgaXNNb2RpZmllZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRsZXQgX2xhc3RTeW5jID0gZmFsc2U7XG5cdGNvbnN0IHsgbWFudWFsLCBjbG9uZSA9IGNsb25lRm5KU09OLCBkZWVwID0gdHJ1ZSwgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0d2F0Y2goY2xvbmVkLCAoKSA9PiB7XG5cdFx0aWYgKF9sYXN0U3luYykge1xuXHRcdFx0X2xhc3RTeW5jID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlzTW9kaWZpZWQudmFsdWUgPSB0cnVlO1xuXHR9LCB7XG5cdFx0ZGVlcDogdHJ1ZSxcblx0XHRmbHVzaDogXCJzeW5jXCJcblx0fSk7XG5cdGZ1bmN0aW9uIHN5bmMoKSB7XG5cdFx0X2xhc3RTeW5jID0gdHJ1ZTtcblx0XHRpc01vZGlmaWVkLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xvbmVkLnZhbHVlID0gY2xvbmUodG9WYWx1ZShzb3VyY2UpKTtcblx0fVxuXHRpZiAoIW1hbnVhbCAmJiAoaXNSZWYoc291cmNlKSB8fCB0eXBlb2Ygc291cmNlID09PSBcImZ1bmN0aW9uXCIpKSB3YXRjaChzb3VyY2UsIHN5bmMsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGRlZXAsXG5cdFx0aW1tZWRpYXRlXG5cdH0pO1xuXHRlbHNlIHN5bmMoKTtcblx0cmV0dXJuIHtcblx0XHRjbG9uZWQsXG5cdFx0aXNNb2RpZmllZCxcblx0XHRzeW5jXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNzci1oYW5kbGVycy50c1xuY29uc3QgX2dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDoge307XG5jb25zdCBnbG9iYWxLZXkgPSBcIl9fdnVldXNlX3Nzcl9oYW5kbGVyc19fXCI7XG5jb25zdCBoYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBnZXRIYW5kbGVycygpO1xuZnVuY3Rpb24gZ2V0SGFuZGxlcnMoKSB7XG5cdGlmICghKGdsb2JhbEtleSBpbiBfZ2xvYmFsKSkgX2dsb2JhbFtnbG9iYWxLZXldID0gX2dsb2JhbFtnbG9iYWxLZXldIHx8IHt9O1xuXHRyZXR1cm4gX2dsb2JhbFtnbG9iYWxLZXldO1xufVxuZnVuY3Rpb24gZ2V0U1NSSGFuZGxlcihrZXksIGZhbGxiYWNrKSB7XG5cdHJldHVybiBoYW5kbGVyc1trZXldIHx8IGZhbGxiYWNrO1xufVxuZnVuY3Rpb24gc2V0U1NSSGFuZGxlcihrZXksIGZuKSB7XG5cdGhhbmRsZXJzW2tleV0gPSBmbjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkRGFyay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGRhcmsgdGhlbWUgcHJlZmVyZW5jZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUHJlZmVycmVkRGFya1xuKiBAcGFyYW0gW29wdGlvbnNdXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlUHJlZmVycmVkRGFyayhvcHRpb25zKSB7XG5cdHJldHVybiB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKVwiLCBvcHRpb25zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3RvcmFnZS9ndWVzcy50c1xuZnVuY3Rpb24gZ3Vlc3NTZXJpYWxpemVyVHlwZShyYXdJbml0KSB7XG5cdHJldHVybiByYXdJbml0ID09IG51bGwgPyBcImFueVwiIDogcmF3SW5pdCBpbnN0YW5jZW9mIFNldCA/IFwic2V0XCIgOiByYXdJbml0IGluc3RhbmNlb2YgTWFwID8gXCJtYXBcIiA6IHJhd0luaXQgaW5zdGFuY2VvZiBEYXRlID8gXCJkYXRlXCIgOiB0eXBlb2YgcmF3SW5pdCA9PT0gXCJib29sZWFuXCIgPyBcImJvb2xlYW5cIiA6IHR5cGVvZiByYXdJbml0ID09PSBcInN0cmluZ1wiID8gXCJzdHJpbmdcIiA6IHR5cGVvZiByYXdJbml0ID09PSBcIm9iamVjdFwiID8gXCJvYmplY3RcIiA6ICFOdW1iZXIuaXNOYU4ocmF3SW5pdCkgPyBcIm51bWJlclwiIDogXCJhbnlcIjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3RvcmFnZS9pbmRleC50c1xuY29uc3QgU3RvcmFnZVNlcmlhbGl6ZXJzID0ge1xuXHRib29sZWFuOiB7XG5cdFx0cmVhZDogKHYpID0+IHYgPT09IFwidHJ1ZVwiLFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdG9iamVjdDoge1xuXHRcdHJlYWQ6ICh2KSA9PiBKU09OLnBhcnNlKHYpLFxuXHRcdHdyaXRlOiAodikgPT4gSlNPTi5zdHJpbmdpZnkodilcblx0fSxcblx0bnVtYmVyOiB7XG5cdFx0cmVhZDogKHYpID0+IE51bWJlci5wYXJzZUZsb2F0KHYpLFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdGFueToge1xuXHRcdHJlYWQ6ICh2KSA9PiB2LFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdHN0cmluZzoge1xuXHRcdHJlYWQ6ICh2KSA9PiB2LFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdG1hcDoge1xuXHRcdHJlYWQ6ICh2KSA9PiBuZXcgTWFwKEpTT04ucGFyc2UodikpLFxuXHRcdHdyaXRlOiAodikgPT4gSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh2LmVudHJpZXMoKSkpXG5cdH0sXG5cdHNldDoge1xuXHRcdHJlYWQ6ICh2KSA9PiBuZXcgU2V0KEpTT04ucGFyc2UodikpLFxuXHRcdHdyaXRlOiAodikgPT4gSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh2KSlcblx0fSxcblx0ZGF0ZToge1xuXHRcdHJlYWQ6ICh2KSA9PiBuZXcgRGF0ZSh2KSxcblx0XHR3cml0ZTogKHYpID0+IHYudG9JU09TdHJpbmcoKVxuXHR9XG59O1xuY29uc3QgY3VzdG9tU3RvcmFnZUV2ZW50TmFtZSA9IFwidnVldXNlLXN0b3JhZ2VcIjtcbi8qKlxuKiBSZWFjdGl2ZSBMb2NhbFN0b3JhZ2UvU2Vzc2lvblN0b3JhZ2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVN0b3JhZ2VcbiovXG5mdW5jdGlvbiB1c2VTdG9yYWdlKGtleSwgZGVmYXVsdHMkMSwgc3RvcmFnZSwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRzZXJpYWxpemVyO1xuXHRjb25zdCB7IGZsdXNoID0gXCJwcmVcIiwgZGVlcCA9IHRydWUsIGxpc3RlblRvU3RvcmFnZUNoYW5nZXMgPSB0cnVlLCB3cml0ZURlZmF1bHRzID0gdHJ1ZSwgbWVyZ2VEZWZhdWx0cyA9IGZhbHNlLCBzaGFsbG93LCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZXZlbnRGaWx0ZXIsIG9uRXJyb3IgPSAoZSkgPT4ge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH0sIGluaXRPbk1vdW50ZWQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRhdGEgPSAoc2hhbGxvdyA/IHNoYWxsb3dSZWYgOiByZWYpKHR5cGVvZiBkZWZhdWx0cyQxID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0cyQxKCkgOiBkZWZhdWx0cyQxKTtcblx0Y29uc3Qga2V5Q29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGtleSkpO1xuXHRpZiAoIXN0b3JhZ2UpIHRyeSB7XG5cdFx0c3RvcmFnZSA9IGdldFNTUkhhbmRsZXIoXCJnZXREZWZhdWx0U3RvcmFnZVwiLCAoKSA9PiBkZWZhdWx0V2luZG93ID09PSBudWxsIHx8IGRlZmF1bHRXaW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlZmF1bHRXaW5kb3cubG9jYWxTdG9yYWdlKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0b25FcnJvcihlKTtcblx0fVxuXHRpZiAoIXN0b3JhZ2UpIHJldHVybiBkYXRhO1xuXHRjb25zdCByYXdJbml0ID0gdG9WYWx1ZShkZWZhdWx0cyQxKTtcblx0Y29uc3QgdHlwZSA9IGd1ZXNzU2VyaWFsaXplclR5cGUocmF3SW5pdCk7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSAoX29wdGlvbnMkc2VyaWFsaXplciA9IG9wdGlvbnMuc2VyaWFsaXplcikgIT09IG51bGwgJiYgX29wdGlvbnMkc2VyaWFsaXplciAhPT0gdm9pZCAwID8gX29wdGlvbnMkc2VyaWFsaXplciA6IFN0b3JhZ2VTZXJpYWxpemVyc1t0eXBlXTtcblx0Y29uc3QgeyBwYXVzZTogcGF1c2VXYXRjaCwgcmVzdW1lOiByZXN1bWVXYXRjaCB9ID0gd2F0Y2hQYXVzYWJsZShkYXRhLCAobmV3VmFsdWUpID0+IHdyaXRlKG5ld1ZhbHVlKSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0ZXZlbnRGaWx0ZXJcblx0fSk7XG5cdHdhdGNoKGtleUNvbXB1dGVkLCAoKSA9PiB1cGRhdGUoKSwgeyBmbHVzaCB9KTtcblx0bGV0IGZpcnN0TW91bnRlZCA9IGZhbHNlO1xuXHRjb25zdCBvblN0b3JhZ2VFdmVudCA9IChldikgPT4ge1xuXHRcdGlmIChpbml0T25Nb3VudGVkICYmICFmaXJzdE1vdW50ZWQpIHJldHVybjtcblx0XHR1cGRhdGUoZXYpO1xuXHR9O1xuXHRjb25zdCBvblN0b3JhZ2VDdXN0b21FdmVudCA9IChldikgPT4ge1xuXHRcdGlmIChpbml0T25Nb3VudGVkICYmICFmaXJzdE1vdW50ZWQpIHJldHVybjtcblx0XHR1cGRhdGVGcm9tQ3VzdG9tRXZlbnQoZXYpO1xuXHR9O1xuXHQvKipcblx0KiBUaGUgY3VzdG9tIGV2ZW50IGlzIG5lZWRlZCBmb3Igc2FtZS1kb2N1bWVudCBzeW5jaW5nIHdoZW4gdXNpbmcgY3VzdG9tXG5cdCogc3RvcmFnZSBiYWNrZW5kcywgYnV0IGl0IGRvZXNuJ3Qgd29yayBhY3Jvc3MgZGlmZmVyZW50IGRvY3VtZW50cy5cblx0KlxuXHQqIFRPRE86IENvbnNpZGVyIGltcGxlbWVudGluZyBhIEJyb2FkY2FzdENoYW5uZWwtYmFzZWQgc29sdXRpb24gdGhhdCBmaXhlcyB0aGlzLlxuXHQqL1xuXHRpZiAod2luZG93JDEgJiYgbGlzdGVuVG9TdG9yYWdlQ2hhbmdlcykgaWYgKHN0b3JhZ2UgaW5zdGFuY2VvZiBTdG9yYWdlKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInN0b3JhZ2VcIiwgb25TdG9yYWdlRXZlbnQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0ZWxzZSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBjdXN0b21TdG9yYWdlRXZlbnROYW1lLCBvblN0b3JhZ2VDdXN0b21FdmVudCk7XG5cdGlmIChpbml0T25Nb3VudGVkKSB0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGZpcnN0TW91bnRlZCA9IHRydWU7XG5cdFx0dXBkYXRlKCk7XG5cdH0pO1xuXHRlbHNlIHVwZGF0ZSgpO1xuXHRmdW5jdGlvbiBkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG5cdFx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0XHRjb25zdCBwYXlsb2FkID0ge1xuXHRcdFx0XHRrZXk6IGtleUNvbXB1dGVkLnZhbHVlLFxuXHRcdFx0XHRvbGRWYWx1ZSxcblx0XHRcdFx0bmV3VmFsdWUsXG5cdFx0XHRcdHN0b3JhZ2VBcmVhOiBzdG9yYWdlXG5cdFx0XHR9O1xuXHRcdFx0d2luZG93JDEuZGlzcGF0Y2hFdmVudChzdG9yYWdlIGluc3RhbmNlb2YgU3RvcmFnZSA/IG5ldyBTdG9yYWdlRXZlbnQoXCJzdG9yYWdlXCIsIHBheWxvYWQpIDogbmV3IEN1c3RvbUV2ZW50KGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUsIHsgZGV0YWlsOiBwYXlsb2FkIH0pKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gd3JpdGUodikge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvbGRWYWx1ZSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXlDb21wdXRlZC52YWx1ZSk7XG5cdFx0XHRpZiAodiA9PSBudWxsKSB7XG5cdFx0XHRcdGRpc3BhdGNoV3JpdGVFdmVudChvbGRWYWx1ZSwgbnVsbCk7XG5cdFx0XHRcdHN0b3JhZ2UucmVtb3ZlSXRlbShrZXlDb21wdXRlZC52YWx1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplci53cml0ZSh2KTtcblx0XHRcdFx0aWYgKG9sZFZhbHVlICE9PSBzZXJpYWxpemVkKSB7XG5cdFx0XHRcdFx0c3RvcmFnZS5zZXRJdGVtKGtleUNvbXB1dGVkLnZhbHVlLCBzZXJpYWxpemVkKTtcblx0XHRcdFx0XHRkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIHNlcmlhbGl6ZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gcmVhZChldmVudCkge1xuXHRcdGNvbnN0IHJhd1ZhbHVlID0gZXZlbnQgPyBldmVudC5uZXdWYWx1ZSA6IHN0b3JhZ2UuZ2V0SXRlbShrZXlDb21wdXRlZC52YWx1ZSk7XG5cdFx0aWYgKHJhd1ZhbHVlID09IG51bGwpIHtcblx0XHRcdGlmICh3cml0ZURlZmF1bHRzICYmIHJhd0luaXQgIT0gbnVsbCkgc3RvcmFnZS5zZXRJdGVtKGtleUNvbXB1dGVkLnZhbHVlLCBzZXJpYWxpemVyLndyaXRlKHJhd0luaXQpKTtcblx0XHRcdHJldHVybiByYXdJbml0O1xuXHRcdH0gZWxzZSBpZiAoIWV2ZW50ICYmIG1lcmdlRGVmYXVsdHMpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0XHRcdGlmICh0eXBlb2YgbWVyZ2VEZWZhdWx0cyA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbWVyZ2VEZWZhdWx0cyh2YWx1ZSwgcmF3SW5pdCk7XG5cdFx0XHRlbHNlIGlmICh0eXBlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHtcblx0XHRcdFx0Li4ucmF3SW5pdCxcblx0XHRcdFx0Li4udmFsdWVcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcmF3VmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiByYXdWYWx1ZTtcblx0XHRlbHNlIHJldHVybiBzZXJpYWxpemVyLnJlYWQocmF3VmFsdWUpO1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZShldmVudCkge1xuXHRcdGlmIChldmVudCAmJiBldmVudC5zdG9yYWdlQXJlYSAhPT0gc3RvcmFnZSkgcmV0dXJuO1xuXHRcdGlmIChldmVudCAmJiBldmVudC5rZXkgPT0gbnVsbCkge1xuXHRcdFx0ZGF0YS52YWx1ZSA9IHJhd0luaXQ7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChldmVudCAmJiBldmVudC5rZXkgIT09IGtleUNvbXB1dGVkLnZhbHVlKSByZXR1cm47XG5cdFx0cGF1c2VXYXRjaCgpO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzZXJpYWxpemVkRGF0YSA9IHNlcmlhbGl6ZXIud3JpdGUoZGF0YS52YWx1ZSk7XG5cdFx0XHRpZiAoZXZlbnQgPT09IHZvaWQgMCB8fCAoZXZlbnQgPT09IG51bGwgfHwgZXZlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV2ZW50Lm5ld1ZhbHVlKSAhPT0gc2VyaWFsaXplZERhdGEpIGRhdGEudmFsdWUgPSByZWFkKGV2ZW50KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoZXZlbnQpIG5leHRUaWNrKHJlc3VtZVdhdGNoKTtcblx0XHRcdGVsc2UgcmVzdW1lV2F0Y2goKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlRnJvbUN1c3RvbUV2ZW50KGV2ZW50KSB7XG5cdFx0dXBkYXRlKGV2ZW50LmRldGFpbCk7XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvbG9yTW9kZS9pbmRleC50c1xuY29uc3QgQ1NTX0RJU0FCTEVfVFJBTlMgPSBcIiosKjo6YmVmb3JlLCo6OmFmdGVyey13ZWJraXQtdHJhbnNpdGlvbjpub25lIWltcG9ydGFudDstbW96LXRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7LW8tdHJhbnNpdGlvbjpub25lIWltcG9ydGFudDstbXMtdHJhbnNpdGlvbjpub25lIWltcG9ydGFudDt0cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50fVwiO1xuLyoqXG4qIFJlYWN0aXZlIGNvbG9yIG1vZGUgd2l0aCBhdXRvIGRhdGEgcGVyc2lzdGVuY2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNvbG9yTW9kZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUNvbG9yTW9kZShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBzZWxlY3RvciA9IFwiaHRtbFwiLCBhdHRyaWJ1dGUgPSBcImNsYXNzXCIsIGluaXRpYWxWYWx1ZSA9IFwiYXV0b1wiLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3RvcmFnZSwgc3RvcmFnZUtleSA9IFwidnVldXNlLWNvbG9yLXNjaGVtZVwiLCBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzID0gdHJ1ZSwgc3RvcmFnZVJlZiwgZW1pdEF1dG8sIGRpc2FibGVUcmFuc2l0aW9uID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgbW9kZXMgPSB7XG5cdFx0YXV0bzogXCJcIixcblx0XHRsaWdodDogXCJsaWdodFwiLFxuXHRcdGRhcms6IFwiZGFya1wiLFxuXHRcdC4uLm9wdGlvbnMubW9kZXMgfHwge31cblx0fTtcblx0Y29uc3QgcHJlZmVycmVkRGFyayA9IHVzZVByZWZlcnJlZERhcmsoeyB3aW5kb3c6IHdpbmRvdyQxIH0pO1xuXHRjb25zdCBzeXN0ZW0gPSBjb21wdXRlZCgoKSA9PiBwcmVmZXJyZWREYXJrLnZhbHVlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIpO1xuXHRjb25zdCBzdG9yZSA9IHN0b3JhZ2VSZWYgfHwgKHN0b3JhZ2VLZXkgPT0gbnVsbCA/IHRvUmVmKGluaXRpYWxWYWx1ZSkgOiB1c2VTdG9yYWdlKHN0b3JhZ2VLZXksIGluaXRpYWxWYWx1ZSwgc3RvcmFnZSwge1xuXHRcdHdpbmRvdzogd2luZG93JDEsXG5cdFx0bGlzdGVuVG9TdG9yYWdlQ2hhbmdlc1xuXHR9KSk7XG5cdGNvbnN0IHN0YXRlID0gY29tcHV0ZWQoKCkgPT4gc3RvcmUudmFsdWUgPT09IFwiYXV0b1wiID8gc3lzdGVtLnZhbHVlIDogc3RvcmUudmFsdWUpO1xuXHRjb25zdCB1cGRhdGVIVE1MQXR0cnMgPSBnZXRTU1JIYW5kbGVyKFwidXBkYXRlSFRNTEF0dHJzXCIsIChzZWxlY3RvciQxLCBhdHRyaWJ1dGUkMSwgdmFsdWUpID0+IHtcblx0XHRjb25zdCBlbCA9IHR5cGVvZiBzZWxlY3RvciQxID09PSBcInN0cmluZ1wiID8gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IkMSkgOiB1bnJlZkVsZW1lbnQoc2VsZWN0b3IkMSk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGNvbnN0IGNsYXNzZXNUb0FkZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdFx0Y29uc3QgY2xhc3Nlc1RvUmVtb3ZlID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0XHRsZXQgYXR0cmlidXRlVG9DaGFuZ2UgPSBudWxsO1xuXHRcdGlmIChhdHRyaWJ1dGUkMSA9PT0gXCJjbGFzc1wiKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50ID0gdmFsdWUuc3BsaXQoL1xccy9nKTtcblx0XHRcdE9iamVjdC52YWx1ZXMobW9kZXMpLmZsYXRNYXAoKGkpID0+IChpIHx8IFwiXCIpLnNwbGl0KC9cXHMvZykpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKCh2KSA9PiB7XG5cdFx0XHRcdGlmIChjdXJyZW50LmluY2x1ZGVzKHYpKSBjbGFzc2VzVG9BZGQuYWRkKHYpO1xuXHRcdFx0XHRlbHNlIGNsYXNzZXNUb1JlbW92ZS5hZGQodik7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgYXR0cmlidXRlVG9DaGFuZ2UgPSB7XG5cdFx0XHRrZXk6IGF0dHJpYnV0ZSQxLFxuXHRcdFx0dmFsdWVcblx0XHR9O1xuXHRcdGlmIChjbGFzc2VzVG9BZGQuc2l6ZSA9PT0gMCAmJiBjbGFzc2VzVG9SZW1vdmUuc2l6ZSA9PT0gMCAmJiBhdHRyaWJ1dGVUb0NoYW5nZSA9PT0gbnVsbCkgcmV0dXJuO1xuXHRcdGxldCBzdHlsZTtcblx0XHRpZiAoZGlzYWJsZVRyYW5zaXRpb24pIHtcblx0XHRcdHN0eWxlID0gd2luZG93JDEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdFx0c3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoQ1NTX0RJU0FCTEVfVFJBTlMpKTtcblx0XHRcdHdpbmRvdyQxLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGMgb2YgY2xhc3Nlc1RvQWRkKSBlbC5jbGFzc0xpc3QuYWRkKGMpO1xuXHRcdGZvciAoY29uc3QgYyBvZiBjbGFzc2VzVG9SZW1vdmUpIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7XG5cdFx0aWYgKGF0dHJpYnV0ZVRvQ2hhbmdlKSBlbC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlVG9DaGFuZ2Uua2V5LCBhdHRyaWJ1dGVUb0NoYW5nZS52YWx1ZSk7XG5cdFx0aWYgKGRpc2FibGVUcmFuc2l0aW9uKSB7XG5cdFx0XHR3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKHN0eWxlKS5vcGFjaXR5O1xuXHRcdFx0ZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzdHlsZSk7XG5cdFx0fVxuXHR9KTtcblx0ZnVuY3Rpb24gZGVmYXVsdE9uQ2hhbmdlZChtb2RlKSB7XG5cdFx0dmFyIF9tb2RlcyRtb2RlO1xuXHRcdHVwZGF0ZUhUTUxBdHRycyhzZWxlY3RvciwgYXR0cmlidXRlLCAoX21vZGVzJG1vZGUgPSBtb2Rlc1ttb2RlXSkgIT09IG51bGwgJiYgX21vZGVzJG1vZGUgIT09IHZvaWQgMCA/IF9tb2RlcyRtb2RlIDogbW9kZSk7XG5cdH1cblx0ZnVuY3Rpb24gb25DaGFuZ2VkKG1vZGUpIHtcblx0XHRpZiAob3B0aW9ucy5vbkNoYW5nZWQpIG9wdGlvbnMub25DaGFuZ2VkKG1vZGUsIGRlZmF1bHRPbkNoYW5nZWQpO1xuXHRcdGVsc2UgZGVmYXVsdE9uQ2hhbmdlZChtb2RlKTtcblx0fVxuXHR3YXRjaChzdGF0ZSwgb25DaGFuZ2VkLCB7XG5cdFx0Zmx1c2g6IFwicG9zdFwiLFxuXHRcdGltbWVkaWF0ZTogdHJ1ZVxuXHR9KTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IG9uQ2hhbmdlZChzdGF0ZS52YWx1ZSkpO1xuXHRjb25zdCBhdXRvID0gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBlbWl0QXV0byA/IHN0b3JlLnZhbHVlIDogc3RhdGUudmFsdWU7XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0c3RvcmUudmFsdWUgPSB2O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBPYmplY3QuYXNzaWduKGF1dG8sIHtcblx0XHRzdG9yZSxcblx0XHRzeXN0ZW0sXG5cdFx0c3RhdGVcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvbmZpcm1EaWFsb2cvaW5kZXgudHNcbi8qKlxuKiBIb29rcyBmb3IgY3JlYXRpbmcgY29uZmlybSBkaWFsb2dzLiBVc2VmdWwgZm9yIG1vZGFsIHdpbmRvd3MsIHBvcHVwcyBhbmQgbG9naW5zLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDb25maXJtRGlhbG9nL1xuKiBAcGFyYW0gcmV2ZWFsZWQgYGJvb2xlYW5gIGByZWZgIHRoYXQgaGFuZGxlcyBhIG1vZGFsIHdpbmRvd1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUNvbmZpcm1EaWFsb2cocmV2ZWFsZWQgPSBzaGFsbG93UmVmKGZhbHNlKSkge1xuXHRjb25zdCBjb25maXJtSG9vayA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBjYW5jZWxIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHJldmVhbEhvb2sgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0bGV0IF9yZXNvbHZlID0gbm9vcDtcblx0Y29uc3QgcmV2ZWFsID0gKGRhdGEpID0+IHtcblx0XHRyZXZlYWxIb29rLnRyaWdnZXIoZGF0YSk7XG5cdFx0cmV2ZWFsZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0X3Jlc29sdmUgPSByZXNvbHZlO1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBjb25maXJtID0gKGRhdGEpID0+IHtcblx0XHRyZXZlYWxlZC52YWx1ZSA9IGZhbHNlO1xuXHRcdGNvbmZpcm1Ib29rLnRyaWdnZXIoZGF0YSk7XG5cdFx0X3Jlc29sdmUoe1xuXHRcdFx0ZGF0YSxcblx0XHRcdGlzQ2FuY2VsZWQ6IGZhbHNlXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IGNhbmNlbCA9IChkYXRhKSA9PiB7XG5cdFx0cmV2ZWFsZWQudmFsdWUgPSBmYWxzZTtcblx0XHRjYW5jZWxIb29rLnRyaWdnZXIoZGF0YSk7XG5cdFx0X3Jlc29sdmUoe1xuXHRcdFx0ZGF0YSxcblx0XHRcdGlzQ2FuY2VsZWQ6IHRydWVcblx0XHR9KTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1JldmVhbGVkOiBjb21wdXRlZCgoKSA9PiByZXZlYWxlZC52YWx1ZSksXG5cdFx0cmV2ZWFsLFxuXHRcdGNvbmZpcm0sXG5cdFx0Y2FuY2VsLFxuXHRcdG9uUmV2ZWFsOiByZXZlYWxIb29rLm9uLFxuXHRcdG9uQ29uZmlybTogY29uZmlybUhvb2sub24sXG5cdFx0b25DYW5jZWw6IGNhbmNlbEhvb2sub25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ291bnRkb3duL2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDgob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IDFlMywgaW1tZWRpYXRlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlIH0pO1xuXHR9XG5cdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIDFlMywgeyBpbW1lZGlhdGU6IGZhbHNlIH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIGNvdW50ZG93biB0aW1lciBpbiBzZWNvbmRzLlxuKlxuKiBAcGFyYW0gaW5pdGlhbENvdW50ZG93blxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDb3VudGRvd25cbiovXG5mdW5jdGlvbiB1c2VDb3VudGRvd24oaW5pdGlhbENvdW50ZG93biwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHJlbWFpbmluZyA9IHNoYWxsb3dSZWYodG9WYWx1ZShpbml0aWFsQ291bnRkb3duKSk7XG5cdGNvbnN0IHsgc2NoZWR1bGVyID0gZ2V0RGVmYXVsdFNjaGVkdWxlciQ4KG9wdGlvbnMpLCBvblRpY2ssIG9uQ29tcGxldGUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNvbnRyb2xzID0gc2NoZWR1bGVyKCgpID0+IHtcblx0XHRjb25zdCB2YWx1ZSA9IHJlbWFpbmluZy52YWx1ZSAtIDE7XG5cdFx0cmVtYWluaW5nLnZhbHVlID0gdmFsdWUgPCAwID8gMCA6IHZhbHVlO1xuXHRcdG9uVGljayA9PT0gbnVsbCB8fCBvblRpY2sgPT09IHZvaWQgMCB8fCBvblRpY2soKTtcblx0XHRpZiAocmVtYWluaW5nLnZhbHVlIDw9IDApIHtcblx0XHRcdGNvbnRyb2xzLnBhdXNlKCk7XG5cdFx0XHRvbkNvbXBsZXRlID09PSBudWxsIHx8IG9uQ29tcGxldGUgPT09IHZvaWQgMCB8fCBvbkNvbXBsZXRlKCk7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgcmVzZXQgPSAoY291bnRkb3duKSA9PiB7XG5cdFx0dmFyIF90b1ZhbHVlO1xuXHRcdHJlbWFpbmluZy52YWx1ZSA9IChfdG9WYWx1ZSA9IHRvVmFsdWUoY291bnRkb3duKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogdG9WYWx1ZShpbml0aWFsQ291bnRkb3duKTtcblx0fTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRjb250cm9scy5wYXVzZSgpO1xuXHRcdHJlc2V0KCk7XG5cdH07XG5cdGNvbnN0IHJlc3VtZSA9ICgpID0+IHtcblx0XHRpZiAoIWNvbnRyb2xzLmlzQWN0aXZlLnZhbHVlKSB7XG5cdFx0XHRpZiAocmVtYWluaW5nLnZhbHVlID4gMCkgY29udHJvbHMucmVzdW1lKCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzdGFydCA9IChjb3VudGRvd24pID0+IHtcblx0XHRyZXNldChjb3VudGRvd24pO1xuXHRcdGNvbnRyb2xzLnJlc3VtZSgpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHJlbWFpbmluZyxcblx0XHRyZXNldCxcblx0XHRzdG9wLFxuXHRcdHN0YXJ0LFxuXHRcdHBhdXNlOiBjb250cm9scy5wYXVzZSxcblx0XHRyZXN1bWUsXG5cdFx0aXNBY3RpdmU6IGNvbnRyb2xzLmlzQWN0aXZlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNzc1N1cHBvcnRzL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDc3NTdXBwb3J0cyguLi5hcmdzKSB7XG5cdGxldCBvcHRpb25zID0ge307XG5cdGlmICh0eXBlb2YgdG9WYWx1ZShhcmdzLmF0KC0xKSkgPT09IFwib2JqZWN0XCIpIG9wdGlvbnMgPSBhcmdzLnBvcCgpO1xuXHRjb25zdCBbcHJvcCwgdmFsdWVdID0gYXJncztcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3NyVmFsdWUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpO1xuXHRyZXR1cm4geyBpc1N1cHBvcnRlZDogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlzTW91bnRlZC52YWx1ZTtcblx0XHRpZiAoIWlzQ2xpZW50KSByZXR1cm4gc3NyVmFsdWU7XG5cdFx0cmV0dXJuIGFyZ3MubGVuZ3RoID09PSAyID8gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLkNTUy5zdXBwb3J0cyh0b1ZhbHVlKHByb3ApLCB0b1ZhbHVlKHZhbHVlKSkgOiB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuQ1NTLnN1cHBvcnRzKHRvVmFsdWUocHJvcCkpO1xuXHR9KSB9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDc3NWYXIvaW5kZXgudHNcbi8qKlxuKiBNYW5pcHVsYXRlIENTUyB2YXJpYWJsZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNzc1ZhclxuKiBAcGFyYW0gcHJvcFxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlQ3NzVmFyKHByb3AsIHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGluaXRpYWxWYWx1ZSwgb2JzZXJ2ZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB2YXJpYWJsZSA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgZWxSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF93aW5kb3ckZG9jdW1lbnQ7XG5cdFx0cmV0dXJuIHVucmVmRWxlbWVudCh0YXJnZXQpIHx8ICh3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwIHx8IChfd2luZG93JGRvY3VtZW50ID0gd2luZG93JDEuZG9jdW1lbnQpID09PSBudWxsIHx8IF93aW5kb3ckZG9jdW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcblx0fSk7XG5cdGZ1bmN0aW9uIHVwZGF0ZUNzc1ZhcigpIHtcblx0XHRjb25zdCBrZXkgPSB0b1ZhbHVlKHByb3ApO1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZShlbFJlZik7XG5cdFx0aWYgKGVsICYmIHdpbmRvdyQxICYmIGtleSkge1xuXHRcdFx0dmFyIF93aW5kb3ckZ2V0Q29tcHV0ZWRTdDtcblx0XHRcdHZhcmlhYmxlLnZhbHVlID0gKChfd2luZG93JGdldENvbXB1dGVkU3QgPSB3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKGVsKS5nZXRQcm9wZXJ0eVZhbHVlKGtleSkpID09PSBudWxsIHx8IF93aW5kb3ckZ2V0Q29tcHV0ZWRTdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdyRnZXRDb21wdXRlZFN0LnRyaW0oKSkgfHwgdmFyaWFibGUudmFsdWUgfHwgaW5pdGlhbFZhbHVlO1xuXHRcdH1cblx0fVxuXHRpZiAob2JzZXJ2ZSkgdXNlTXV0YXRpb25PYnNlcnZlcihlbFJlZiwgdXBkYXRlQ3NzVmFyLCB7XG5cdFx0YXR0cmlidXRlRmlsdGVyOiBbXCJzdHlsZVwiLCBcImNsYXNzXCJdLFxuXHRcdHdpbmRvdzogd2luZG93JDFcblx0fSk7XG5cdHdhdGNoKFtlbFJlZiwgKCkgPT4gdG9WYWx1ZShwcm9wKV0sIChfLCBvbGQpID0+IHtcblx0XHRpZiAob2xkWzBdICYmIG9sZFsxXSkgb2xkWzBdLnN0eWxlLnJlbW92ZVByb3BlcnR5KG9sZFsxXSk7XG5cdFx0dXBkYXRlQ3NzVmFyKCk7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHR3YXRjaChbdmFyaWFibGUsIGVsUmVmXSwgKFt2YWwsIGVsXSkgPT4ge1xuXHRcdGNvbnN0IHJhd19wcm9wID0gdG9WYWx1ZShwcm9wKTtcblx0XHRpZiAoKGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zdHlsZSkgJiYgcmF3X3Byb3ApIGlmICh2YWwgPT0gbnVsbCkgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkocmF3X3Byb3ApO1xuXHRcdGVsc2UgZWwuc3R5bGUuc2V0UHJvcGVydHkocmF3X3Byb3AsIHZhbCk7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHRyZXR1cm4gdmFyaWFibGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUN1cnJlbnRFbGVtZW50L2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDdXJyZW50RWxlbWVudChyb290Q29tcG9uZW50KSB7XG5cdGNvbnN0IHZtID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gY29tcHV0ZWRXaXRoQ29udHJvbCgoKSA9PiBudWxsLCAoKSA9PiByb290Q29tcG9uZW50ID8gdW5yZWZFbGVtZW50KHJvb3RDb21wb25lbnQpIDogdm0ucHJveHkuJGVsKTtcblx0b25VcGRhdGVkKGN1cnJlbnRFbGVtZW50LnRyaWdnZXIpO1xuXHRvbk1vdW50ZWQoY3VycmVudEVsZW1lbnQudHJpZ2dlcik7XG5cdHJldHVybiBjdXJyZW50RWxlbWVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ3ljbGVMaXN0L2luZGV4LnRzXG4vKipcbiogQ3ljbGUgdGhyb3VnaCBhIGxpc3Qgb2YgaXRlbXNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQ3ljbGVMaXN0XG4qL1xuZnVuY3Rpb24gdXNlQ3ljbGVMaXN0KGxpc3QsIG9wdGlvbnMpIHtcblx0Y29uc3Qgc3RhdGUgPSBzaGFsbG93UmVmKGdldEluaXRpYWxWYWx1ZSgpKTtcblx0Y29uc3QgbGlzdFJlZiA9IHRvUmVmKGxpc3QpO1xuXHRjb25zdCBpbmRleCA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHR2YXIgX29wdGlvbnMkZmFsbGJhY2tJbmRlO1xuXHRcdFx0Y29uc3QgdGFyZ2V0TGlzdCA9IGxpc3RSZWYudmFsdWU7XG5cdFx0XHRsZXQgaW5kZXgkMSA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2V0SW5kZXhPZikgPyBvcHRpb25zLmdldEluZGV4T2Yoc3RhdGUudmFsdWUsIHRhcmdldExpc3QpIDogdGFyZ2V0TGlzdC5pbmRleE9mKHN0YXRlLnZhbHVlKTtcblx0XHRcdGlmIChpbmRleCQxIDwgMCkgaW5kZXgkMSA9IChfb3B0aW9ucyRmYWxsYmFja0luZGUgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmFsbGJhY2tJbmRleCkgIT09IG51bGwgJiYgX29wdGlvbnMkZmFsbGJhY2tJbmRlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRmYWxsYmFja0luZGUgOiAwO1xuXHRcdFx0cmV0dXJuIGluZGV4JDE7XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0c2V0KHYpO1xuXHRcdH1cblx0fSk7XG5cdGZ1bmN0aW9uIHNldChpKSB7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdCA9IGxpc3RSZWYudmFsdWU7XG5cdFx0Y29uc3QgbGVuZ3RoID0gdGFyZ2V0TGlzdC5sZW5ndGg7XG5cdFx0Y29uc3QgdmFsdWUgPSB0YXJnZXRMaXN0WyhpICUgbGVuZ3RoICsgbGVuZ3RoKSAlIGxlbmd0aF07XG5cdFx0c3RhdGUudmFsdWUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblx0ZnVuY3Rpb24gc2hpZnQoZGVsdGEgPSAxKSB7XG5cdFx0cmV0dXJuIHNldChpbmRleC52YWx1ZSArIGRlbHRhKTtcblx0fVxuXHRmdW5jdGlvbiBuZXh0KG4gPSAxKSB7XG5cdFx0cmV0dXJuIHNoaWZ0KG4pO1xuXHR9XG5cdGZ1bmN0aW9uIHByZXYobiA9IDEpIHtcblx0XHRyZXR1cm4gc2hpZnQoLW4pO1xuXHR9XG5cdGZ1bmN0aW9uIGdldEluaXRpYWxWYWx1ZSgpIHtcblx0XHR2YXIgX3RvVmFsdWUsIF9vcHRpb25zJGluaXRpYWxWYWx1ZTtcblx0XHRyZXR1cm4gKF90b1ZhbHVlID0gdG9WYWx1ZSgoX29wdGlvbnMkaW5pdGlhbFZhbHVlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmluaXRpYWxWYWx1ZSkgIT09IG51bGwgJiYgX29wdGlvbnMkaW5pdGlhbFZhbHVlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRpbml0aWFsVmFsdWUgOiB0b1ZhbHVlKGxpc3QpWzBdKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogdm9pZCAwO1xuXHR9XG5cdHdhdGNoKGxpc3RSZWYsICgpID0+IHNldChpbmRleC52YWx1ZSkpO1xuXHRyZXR1cm4ge1xuXHRcdHN0YXRlLFxuXHRcdGluZGV4LFxuXHRcdG5leHQsXG5cdFx0cHJldixcblx0XHRnbzogc2V0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURhcmsvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBkYXJrIG1vZGUgd2l0aCBhdXRvIGRhdGEgcGVyc2lzdGVuY2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURhcmtcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEYXJrKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHZhbHVlRGFyayA9IFwiZGFya1wiLCB2YWx1ZUxpZ2h0ID0gXCJcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgbW9kZSA9IHVzZUNvbG9yTW9kZSh7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRvbkNoYW5nZWQ6IChtb2RlJDEsIGRlZmF1bHRIYW5kbGVyKSA9PiB7XG5cdFx0XHR2YXIgX29wdGlvbnMkb25DaGFuZ2VkO1xuXHRcdFx0aWYgKG9wdGlvbnMub25DaGFuZ2VkKSAoX29wdGlvbnMkb25DaGFuZ2VkID0gb3B0aW9ucy5vbkNoYW5nZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uQ2hhbmdlZCA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uQ2hhbmdlZC5jYWxsKG9wdGlvbnMsIG1vZGUkMSA9PT0gXCJkYXJrXCIsIGRlZmF1bHRIYW5kbGVyLCBtb2RlJDEpO1xuXHRcdFx0ZWxzZSBkZWZhdWx0SGFuZGxlcihtb2RlJDEpO1xuXHRcdH0sXG5cdFx0bW9kZXM6IHtcblx0XHRcdGRhcms6IHZhbHVlRGFyayxcblx0XHRcdGxpZ2h0OiB2YWx1ZUxpZ2h0XG5cdFx0fVxuXHR9KTtcblx0Y29uc3Qgc3lzdGVtID0gY29tcHV0ZWQoKCkgPT4gbW9kZS5zeXN0ZW0udmFsdWUpO1xuXHRyZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBtb2RlLnZhbHVlID09PSBcImRhcmtcIjtcblx0XHR9LFxuXHRcdHNldCh2KSB7XG5cdFx0XHRjb25zdCBtb2RlVmFsID0gdiA/IFwiZGFya1wiIDogXCJsaWdodFwiO1xuXHRcdFx0aWYgKHN5c3RlbS52YWx1ZSA9PT0gbW9kZVZhbCkgbW9kZS52YWx1ZSA9IFwiYXV0b1wiO1xuXHRcdFx0ZWxzZSBtb2RlLnZhbHVlID0gbW9kZVZhbDtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNYW51YWxSZWZIaXN0b3J5L2luZGV4LnRzXG5mdW5jdGlvbiBmbkJ5cGFzcyh2KSB7XG5cdHJldHVybiB2O1xufVxuZnVuY3Rpb24gZm5TZXRTb3VyY2Uoc291cmNlLCB2YWx1ZSkge1xuXHRyZXR1cm4gc291cmNlLnZhbHVlID0gdmFsdWU7XG59XG5mdW5jdGlvbiBkZWZhdWx0RHVtcChjbG9uZSkge1xuXHRyZXR1cm4gY2xvbmUgPyB0eXBlb2YgY2xvbmUgPT09IFwiZnVuY3Rpb25cIiA/IGNsb25lIDogY2xvbmVGbkpTT04gOiBmbkJ5cGFzcztcbn1cbmZ1bmN0aW9uIGRlZmF1bHRQYXJzZShjbG9uZSkge1xuXHRyZXR1cm4gY2xvbmUgPyB0eXBlb2YgY2xvbmUgPT09IFwiZnVuY3Rpb25cIiA/IGNsb25lIDogY2xvbmVGbkpTT04gOiBmbkJ5cGFzcztcbn1cbi8qKlxuKiBUcmFjayB0aGUgY2hhbmdlIGhpc3Rvcnkgb2YgYSByZWYsIGFsc28gcHJvdmlkZXMgdW5kbyBhbmQgcmVkbyBmdW5jdGlvbmFsaXR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNYW51YWxSZWZIaXN0b3J5XG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VNYW51YWxSZWZIaXN0b3J5KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY2xvbmUgPSBmYWxzZSwgZHVtcCA9IGRlZmF1bHREdW1wKGNsb25lKSwgcGFyc2UgPSBkZWZhdWx0UGFyc2UoY2xvbmUpLCBzZXRTb3VyY2UgPSBmblNldFNvdXJjZSB9ID0gb3B0aW9ucztcblx0ZnVuY3Rpb24gX2NyZWF0ZUhpc3RvcnlSZWNvcmQoKSB7XG5cdFx0cmV0dXJuIG1hcmtSYXcoe1xuXHRcdFx0c25hcHNob3Q6IGR1bXAoc291cmNlLnZhbHVlKSxcblx0XHRcdHRpbWVzdGFtcDogdGltZXN0YW1wKClcblx0XHR9KTtcblx0fVxuXHRjb25zdCBsYXN0ID0gcmVmKF9jcmVhdGVIaXN0b3J5UmVjb3JkKCkpO1xuXHRjb25zdCB1bmRvU3RhY2sgPSByZWYoW10pO1xuXHRjb25zdCByZWRvU3RhY2sgPSByZWYoW10pO1xuXHRjb25zdCBfc2V0U291cmNlID0gKHJlY29yZCkgPT4ge1xuXHRcdHNldFNvdXJjZShzb3VyY2UsIHBhcnNlKHJlY29yZC5zbmFwc2hvdCkpO1xuXHRcdGxhc3QudmFsdWUgPSByZWNvcmQ7XG5cdH07XG5cdGNvbnN0IGNvbW1pdCA9ICgpID0+IHtcblx0XHR1bmRvU3RhY2sudmFsdWUudW5zaGlmdChsYXN0LnZhbHVlKTtcblx0XHRsYXN0LnZhbHVlID0gX2NyZWF0ZUhpc3RvcnlSZWNvcmQoKTtcblx0XHRpZiAob3B0aW9ucy5jYXBhY2l0eSAmJiB1bmRvU3RhY2sudmFsdWUubGVuZ3RoID4gb3B0aW9ucy5jYXBhY2l0eSkgdW5kb1N0YWNrLnZhbHVlLnNwbGljZShvcHRpb25zLmNhcGFjaXR5LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXHRcdGlmIChyZWRvU3RhY2sudmFsdWUubGVuZ3RoKSByZWRvU3RhY2sudmFsdWUuc3BsaWNlKDAsIHJlZG9TdGFjay52YWx1ZS5sZW5ndGgpO1xuXHR9O1xuXHRjb25zdCBjbGVhciA9ICgpID0+IHtcblx0XHR1bmRvU3RhY2sudmFsdWUuc3BsaWNlKDAsIHVuZG9TdGFjay52YWx1ZS5sZW5ndGgpO1xuXHRcdHJlZG9TdGFjay52YWx1ZS5zcGxpY2UoMCwgcmVkb1N0YWNrLnZhbHVlLmxlbmd0aCk7XG5cdH07XG5cdGNvbnN0IHVuZG8gPSAoKSA9PiB7XG5cdFx0Y29uc3Qgc3RhdGUgPSB1bmRvU3RhY2sudmFsdWUuc2hpZnQoKTtcblx0XHRpZiAoc3RhdGUpIHtcblx0XHRcdHJlZG9TdGFjay52YWx1ZS51bnNoaWZ0KGxhc3QudmFsdWUpO1xuXHRcdFx0X3NldFNvdXJjZShzdGF0ZSk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCByZWRvID0gKCkgPT4ge1xuXHRcdGNvbnN0IHN0YXRlID0gcmVkb1N0YWNrLnZhbHVlLnNoaWZ0KCk7XG5cdFx0aWYgKHN0YXRlKSB7XG5cdFx0XHR1bmRvU3RhY2sudmFsdWUudW5zaGlmdChsYXN0LnZhbHVlKTtcblx0XHRcdF9zZXRTb3VyY2Uoc3RhdGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcmVzZXQgPSAoKSA9PiB7XG5cdFx0X3NldFNvdXJjZShsYXN0LnZhbHVlKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRzb3VyY2UsXG5cdFx0dW5kb1N0YWNrLFxuXHRcdHJlZG9TdGFjayxcblx0XHRsYXN0LFxuXHRcdGhpc3Rvcnk6IGNvbXB1dGVkKCgpID0+IFtsYXN0LnZhbHVlLCAuLi51bmRvU3RhY2sudmFsdWVdKSxcblx0XHRjYW5VbmRvOiBjb21wdXRlZCgoKSA9PiB1bmRvU3RhY2sudmFsdWUubGVuZ3RoID4gMCksXG5cdFx0Y2FuUmVkbzogY29tcHV0ZWQoKCkgPT4gcmVkb1N0YWNrLnZhbHVlLmxlbmd0aCA+IDApLFxuXHRcdGNsZWFyLFxuXHRcdGNvbW1pdCxcblx0XHRyZXNldCxcblx0XHR1bmRvLFxuXHRcdHJlZG9cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUmVmSGlzdG9yeS9pbmRleC50c1xuLyoqXG4qIFRyYWNrIHRoZSBjaGFuZ2UgaGlzdG9yeSBvZiBhIHJlZiwgYWxzbyBwcm92aWRlcyB1bmRvIGFuZCByZWRvIGZ1bmN0aW9uYWxpdHkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVJlZkhpc3RvcnlcbiogQHBhcmFtIHNvdXJjZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVJlZkhpc3Rvcnkoc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkZWVwID0gZmFsc2UsIGZsdXNoID0gXCJwcmVcIiwgZXZlbnRGaWx0ZXIsIHNob3VsZENvbW1pdCA9ICgpID0+IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHsgZXZlbnRGaWx0ZXI6IGNvbXBvc2VkRmlsdGVyLCBwYXVzZSwgcmVzdW1lOiByZXN1bWVUcmFja2luZywgaXNBY3RpdmU6IGlzVHJhY2tpbmcgfSA9IHBhdXNhYmxlRmlsdGVyKGV2ZW50RmlsdGVyKTtcblx0bGV0IGxhc3RSYXdWYWx1ZSA9IHNvdXJjZS52YWx1ZTtcblx0Y29uc3QgeyBpZ25vcmVVcGRhdGVzLCBpZ25vcmVQcmV2QXN5bmNVcGRhdGVzLCBzdG9wIH0gPSB3YXRjaElnbm9yYWJsZShzb3VyY2UsIGNvbW1pdCwge1xuXHRcdGRlZXAsXG5cdFx0Zmx1c2gsXG5cdFx0ZXZlbnRGaWx0ZXI6IGNvbXBvc2VkRmlsdGVyXG5cdH0pO1xuXHRmdW5jdGlvbiBzZXRTb3VyY2Uoc291cmNlJDEsIHZhbHVlKSB7XG5cdFx0aWdub3JlUHJldkFzeW5jVXBkYXRlcygpO1xuXHRcdGlnbm9yZVVwZGF0ZXMoKCkgPT4ge1xuXHRcdFx0c291cmNlJDEudmFsdWUgPSB2YWx1ZTtcblx0XHRcdGxhc3RSYXdWYWx1ZSA9IHZhbHVlO1xuXHRcdH0pO1xuXHR9XG5cdGNvbnN0IG1hbnVhbEhpc3RvcnkgPSB1c2VNYW51YWxSZWZIaXN0b3J5KHNvdXJjZSwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0Y2xvbmU6IG9wdGlvbnMuY2xvbmUgfHwgZGVlcCxcblx0XHRzZXRTb3VyY2Vcblx0fSk7XG5cdGNvbnN0IHsgY2xlYXIsIGNvbW1pdDogbWFudWFsQ29tbWl0IH0gPSBtYW51YWxIaXN0b3J5O1xuXHRmdW5jdGlvbiBjb21taXQoKSB7XG5cdFx0aWdub3JlUHJldkFzeW5jVXBkYXRlcygpO1xuXHRcdGlmICghc2hvdWxkQ29tbWl0KGxhc3RSYXdWYWx1ZSwgc291cmNlLnZhbHVlKSkgcmV0dXJuO1xuXHRcdGxhc3RSYXdWYWx1ZSA9IHNvdXJjZS52YWx1ZTtcblx0XHRtYW51YWxDb21taXQoKTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoY29tbWl0Tm93KSB7XG5cdFx0cmVzdW1lVHJhY2tpbmcoKTtcblx0XHRpZiAoY29tbWl0Tm93KSBjb21taXQoKTtcblx0fVxuXHRmdW5jdGlvbiBiYXRjaChmbikge1xuXHRcdGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNhbmNlbCA9ICgpID0+IGNhbmNlbGVkID0gdHJ1ZTtcblx0XHRpZ25vcmVVcGRhdGVzKCgpID0+IHtcblx0XHRcdGZuKGNhbmNlbCk7XG5cdFx0fSk7XG5cdFx0aWYgKCFjYW5jZWxlZCkgY29tbWl0KCk7XG5cdH1cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblx0XHRzdG9wKCk7XG5cdFx0Y2xlYXIoKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdC4uLm1hbnVhbEhpc3RvcnksXG5cdFx0aXNUcmFja2luZyxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWUsXG5cdFx0Y29tbWl0LFxuXHRcdGJhdGNoLFxuXHRcdGRpc3Bvc2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGVib3VuY2VkUmVmSGlzdG9yeS9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3IgW3VzZVJlZkhpc3RvcnldKGh0dHBzOi8vdnVldXNlLm9yZy91c2VSZWZIaXN0b3J5KSB3aXRoIGRlYm91bmNlIGZpbHRlci5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGVib3VuY2VkUmVmSGlzdG9yeVxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRGVib3VuY2VkUmVmSGlzdG9yeShzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBmaWx0ZXIgPSBvcHRpb25zLmRlYm91bmNlID8gZGVib3VuY2VGaWx0ZXIob3B0aW9ucy5kZWJvdW5jZSkgOiB2b2lkIDA7XG5cdHJldHVybiB7IC4uLnVzZVJlZkhpc3Rvcnkoc291cmNlLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogZmlsdGVyXG5cdH0pIH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURldmljZU1vdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIERldmljZU1vdGlvbkV2ZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEZXZpY2VNb3Rpb25cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEZXZpY2VNb3Rpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHJlcXVlc3RQZXJtaXNzaW9ucyA9IGZhbHNlLCBldmVudEZpbHRlciA9IGJ5cGFzc0ZpbHRlciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiBEZXZpY2VNb3Rpb25FdmVudCAhPT0gXCJ1bmRlZmluZWRcIik7XG5cdGNvbnN0IHJlcXVpcmVQZXJtaXNzaW9ucyA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gaXNTdXBwb3J0ZWQudmFsdWUgJiYgXCJyZXF1ZXN0UGVybWlzc2lvblwiIGluIERldmljZU1vdGlvbkV2ZW50ICYmIHR5cGVvZiBEZXZpY2VNb3Rpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbiA9PT0gXCJmdW5jdGlvblwiKTtcblx0Y29uc3QgcGVybWlzc2lvbkdyYW50ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgYWNjZWxlcmF0aW9uID0gcmVmKHtcblx0XHR4OiBudWxsLFxuXHRcdHk6IG51bGwsXG5cdFx0ejogbnVsbFxuXHR9KTtcblx0Y29uc3Qgcm90YXRpb25SYXRlID0gcmVmKHtcblx0XHRhbHBoYTogbnVsbCxcblx0XHRiZXRhOiBudWxsLFxuXHRcdGdhbW1hOiBudWxsXG5cdH0pO1xuXHRjb25zdCBpbnRlcnZhbCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkgPSByZWYoe1xuXHRcdHg6IG51bGwsXG5cdFx0eTogbnVsbCxcblx0XHR6OiBudWxsXG5cdH0pO1xuXHRmdW5jdGlvbiBpbml0KCkge1xuXHRcdGlmICh3aW5kb3ckMSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkZXZpY2Vtb3Rpb25cIiwgY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgKGV2ZW50KSA9PiB7XG5cdFx0XHR2YXIgX2V2ZW50JGFjY2VsZXJhdGlvbiwgX2V2ZW50JGFjY2VsZXJhdGlvbjIsIF9ldmVudCRhY2NlbGVyYXRpb24zLCBfZXZlbnQkYWNjZWxlcmF0aW9uSW4sIF9ldmVudCRhY2NlbGVyYXRpb25JbjIsIF9ldmVudCRhY2NlbGVyYXRpb25JbjMsIF9ldmVudCRyb3RhdGlvblJhdGUsIF9ldmVudCRyb3RhdGlvblJhdGUyLCBfZXZlbnQkcm90YXRpb25SYXRlMztcblx0XHRcdGFjY2VsZXJhdGlvbi52YWx1ZSA9IHtcblx0XHRcdFx0eDogKChfZXZlbnQkYWNjZWxlcmF0aW9uID0gZXZlbnQuYWNjZWxlcmF0aW9uKSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uLngpIHx8IG51bGwsXG5cdFx0XHRcdHk6ICgoX2V2ZW50JGFjY2VsZXJhdGlvbjIgPSBldmVudC5hY2NlbGVyYXRpb24pID09PSBudWxsIHx8IF9ldmVudCRhY2NlbGVyYXRpb24yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uMi55KSB8fCBudWxsLFxuXHRcdFx0XHR6OiAoKF9ldmVudCRhY2NlbGVyYXRpb24zID0gZXZlbnQuYWNjZWxlcmF0aW9uKSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbjMueikgfHwgbnVsbFxuXHRcdFx0fTtcblx0XHRcdGFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkudmFsdWUgPSB7XG5cdFx0XHRcdHg6ICgoX2V2ZW50JGFjY2VsZXJhdGlvbkluID0gZXZlbnQuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eSkgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbkluID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uSW4ueCkgfHwgbnVsbCxcblx0XHRcdFx0eTogKChfZXZlbnQkYWNjZWxlcmF0aW9uSW4yID0gZXZlbnQuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eSkgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbkluMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbkluMi55KSB8fCBudWxsLFxuXHRcdFx0XHR6OiAoKF9ldmVudCRhY2NlbGVyYXRpb25JbjMgPSBldmVudC5hY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5KSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uSW4zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uSW4zLnopIHx8IG51bGxcblx0XHRcdH07XG5cdFx0XHRyb3RhdGlvblJhdGUudmFsdWUgPSB7XG5cdFx0XHRcdGFscGhhOiAoKF9ldmVudCRyb3RhdGlvblJhdGUgPSBldmVudC5yb3RhdGlvblJhdGUpID09PSBudWxsIHx8IF9ldmVudCRyb3RhdGlvblJhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRyb3RhdGlvblJhdGUuYWxwaGEpIHx8IG51bGwsXG5cdFx0XHRcdGJldGE6ICgoX2V2ZW50JHJvdGF0aW9uUmF0ZTIgPSBldmVudC5yb3RhdGlvblJhdGUpID09PSBudWxsIHx8IF9ldmVudCRyb3RhdGlvblJhdGUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkcm90YXRpb25SYXRlMi5iZXRhKSB8fCBudWxsLFxuXHRcdFx0XHRnYW1tYTogKChfZXZlbnQkcm90YXRpb25SYXRlMyA9IGV2ZW50LnJvdGF0aW9uUmF0ZSkgPT09IG51bGwgfHwgX2V2ZW50JHJvdGF0aW9uUmF0ZTMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRyb3RhdGlvblJhdGUzLmdhbW1hKSB8fCBudWxsXG5cdFx0XHR9O1xuXHRcdFx0aW50ZXJ2YWwudmFsdWUgPSBldmVudC5pbnRlcnZhbDtcblx0XHR9KSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR9XG5cdGNvbnN0IGVuc3VyZVBlcm1pc3Npb25zID0gYXN5bmMgKCkgPT4ge1xuXHRcdGlmICghcmVxdWlyZVBlcm1pc3Npb25zLnZhbHVlKSBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0aWYgKHBlcm1pc3Npb25HcmFudGVkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKHJlcXVpcmVQZXJtaXNzaW9ucy52YWx1ZSkge1xuXHRcdFx0Y29uc3QgcmVxdWVzdFBlcm1pc3Npb24gPSBEZXZpY2VNb3Rpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChhd2FpdCByZXF1ZXN0UGVybWlzc2lvbigpID09PSBcImdyYW50ZWRcIikge1xuXHRcdFx0XHRcdHBlcm1pc3Npb25HcmFudGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdFx0XHRpbml0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBpZiAocmVxdWVzdFBlcm1pc3Npb25zICYmIHJlcXVpcmVQZXJtaXNzaW9ucy52YWx1ZSkgZW5zdXJlUGVybWlzc2lvbnMoKS50aGVuKCgpID0+IGluaXQoKSk7XG5cdGVsc2UgaW5pdCgpO1xuXHRyZXR1cm4ge1xuXHRcdGFjY2VsZXJhdGlvbixcblx0XHRhY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5LFxuXHRcdHJvdGF0aW9uUmF0ZSxcblx0XHRpbnRlcnZhbCxcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRyZXF1aXJlUGVybWlzc2lvbnMsXG5cdFx0ZW5zdXJlUGVybWlzc2lvbnMsXG5cdFx0cGVybWlzc2lvbkdyYW50ZWRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGV2aWNlT3JpZW50YXRpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBEZXZpY2VPcmllbnRhdGlvbkV2ZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEZXZpY2VPcmllbnRhdGlvblxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURldmljZU9yaWVudGF0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJEZXZpY2VPcmllbnRhdGlvbkV2ZW50XCIgaW4gd2luZG93JDEpO1xuXHRjb25zdCBpc0Fic29sdXRlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGFscGhhID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgYmV0YSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGdhbW1hID0gc2hhbGxvd1JlZihudWxsKTtcblx0aWYgKHdpbmRvdyQxICYmIGlzU3VwcG9ydGVkLnZhbHVlKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImRldmljZW9yaWVudGF0aW9uXCIsIChldmVudCkgPT4ge1xuXHRcdGlzQWJzb2x1dGUudmFsdWUgPSBldmVudC5hYnNvbHV0ZTtcblx0XHRhbHBoYS52YWx1ZSA9IGV2ZW50LmFscGhhO1xuXHRcdGJldGEudmFsdWUgPSBldmVudC5iZXRhO1xuXHRcdGdhbW1hLnZhbHVlID0gZXZlbnQuZ2FtbWE7XG5cdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRpc0Fic29sdXRlLFxuXHRcdGFscGhhLFxuXHRcdGJldGEsXG5cdFx0Z2FtbWFcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGV2aWNlUGl4ZWxSYXRpby9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgdHJhY2sgYHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvYC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGV2aWNlUGl4ZWxSYXRpb1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURldmljZVBpeGVsUmF0aW8ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHBpeGVsUmF0aW8gPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCBxdWVyeSA9IHVzZU1lZGlhUXVlcnkoKCkgPT4gYChyZXNvbHV0aW9uOiAke3BpeGVsUmF0aW8udmFsdWV9ZHBweClgLCBvcHRpb25zKTtcblx0bGV0IHN0b3AgPSBub29wO1xuXHRpZiAod2luZG93JDEpIHN0b3AgPSB3YXRjaEltbWVkaWF0ZShxdWVyeSwgKCkgPT4gcGl4ZWxSYXRpby52YWx1ZSA9IHdpbmRvdyQxLmRldmljZVBpeGVsUmF0aW8pO1xuXHRyZXR1cm4ge1xuXHRcdHBpeGVsUmF0aW86IHJlYWRvbmx5KHBpeGVsUmF0aW8pLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGV2aWNlc0xpc3QvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgZW51bWVyYXRlRGV2aWNlc2AgbGlzdGluZyBhdmFpbGFibGUgaW5wdXQvb3V0cHV0IGRldmljZXNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGV2aWNlc0xpc3RcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEZXZpY2VzTGlzdChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgcmVxdWVzdFBlcm1pc3Npb25zID0gZmFsc2UsIGNvbnN0cmFpbnRzID0ge1xuXHRcdGF1ZGlvOiB0cnVlLFxuXHRcdHZpZGVvOiB0cnVlXG5cdH0sIG9uVXBkYXRlZDogb25VcGRhdGVkJDEgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRldmljZXMgPSByZWYoW10pO1xuXHRjb25zdCB2aWRlb0lucHV0cyA9IGNvbXB1dGVkKCgpID0+IGRldmljZXMudmFsdWUuZmlsdGVyKChpKSA9PiBpLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiKSk7XG5cdGNvbnN0IGF1ZGlvSW5wdXRzID0gY29tcHV0ZWQoKCkgPT4gZGV2aWNlcy52YWx1ZS5maWx0ZXIoKGkpID0+IGkua2luZCA9PT0gXCJhdWRpb2lucHV0XCIpKTtcblx0Y29uc3QgYXVkaW9PdXRwdXRzID0gY29tcHV0ZWQoKCkgPT4gZGV2aWNlcy52YWx1ZS5maWx0ZXIoKGkpID0+IGkua2luZCA9PT0gXCJhdWRpb291dHB1dFwiKSk7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMgJiYgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMpO1xuXHRjb25zdCBwZXJtaXNzaW9uR3JhbnRlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRsZXQgc3RyZWFtO1xuXHRhc3luYyBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGRldmljZXMudmFsdWUgPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuXHRcdG9uVXBkYXRlZCQxID09PSBudWxsIHx8IG9uVXBkYXRlZCQxID09PSB2b2lkIDAgfHwgb25VcGRhdGVkJDEoZGV2aWNlcy52YWx1ZSk7XG5cdFx0aWYgKHN0cmVhbSkge1xuXHRcdFx0c3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcblx0XHRcdHN0cmVhbSA9IG51bGw7XG5cdFx0fVxuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVBlcm1pc3Npb25zKCkge1xuXHRcdGNvbnN0IGRldmljZU5hbWUgPSBjb25zdHJhaW50cy52aWRlbyA/IFwiY2FtZXJhXCIgOiBcIm1pY3JvcGhvbmVcIjtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm4gZmFsc2U7XG5cdFx0aWYgKHBlcm1pc3Npb25HcmFudGVkLnZhbHVlKSByZXR1cm4gdHJ1ZTtcblx0XHRjb25zdCB7IHN0YXRlLCBxdWVyeSB9ID0gdXNlUGVybWlzc2lvbihkZXZpY2VOYW1lLCB7IGNvbnRyb2xzOiB0cnVlIH0pO1xuXHRcdGF3YWl0IHF1ZXJ5KCk7XG5cdFx0aWYgKHN0YXRlLnZhbHVlICE9PSBcImdyYW50ZWRcIikge1xuXHRcdFx0bGV0IGdyYW50ZWQgPSB0cnVlO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgYWxsRGV2aWNlcyA9IGF3YWl0IG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCk7XG5cdFx0XHRcdGNvbnN0IGhhc0NhbWVyYSA9IGFsbERldmljZXMuc29tZSgoZGV2aWNlKSA9PiBkZXZpY2Uua2luZCA9PT0gXCJ2aWRlb2lucHV0XCIpO1xuXHRcdFx0XHRjb25zdCBoYXNNaWNyb3Bob25lID0gYWxsRGV2aWNlcy5zb21lKChkZXZpY2UpID0+IGRldmljZS5raW5kID09PSBcImF1ZGlvaW5wdXRcIiB8fCBkZXZpY2Uua2luZCA9PT0gXCJhdWRpb291dHB1dFwiKTtcblx0XHRcdFx0Y29uc3RyYWludHMudmlkZW8gPSBoYXNDYW1lcmEgPyBjb25zdHJhaW50cy52aWRlbyA6IGZhbHNlO1xuXHRcdFx0XHRjb25zdHJhaW50cy5hdWRpbyA9IGhhc01pY3JvcGhvbmUgPyBjb25zdHJhaW50cy5hdWRpbyA6IGZhbHNlO1xuXHRcdFx0XHRzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKTtcblx0XHRcdH0gY2F0Y2ggKF91bnVzZWQpIHtcblx0XHRcdFx0c3RyZWFtID0gbnVsbDtcblx0XHRcdFx0Z3JhbnRlZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dXBkYXRlKCk7XG5cdFx0XHRwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IGdyYW50ZWQ7XG5cdFx0fSBlbHNlIHBlcm1pc3Npb25HcmFudGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRyZXR1cm4gcGVybWlzc2lvbkdyYW50ZWQudmFsdWU7XG5cdH1cblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0aWYgKHJlcXVlc3RQZXJtaXNzaW9ucykgZW5zdXJlUGVybWlzc2lvbnMoKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcywgXCJkZXZpY2VjaGFuZ2VcIiwgdXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0dXBkYXRlKCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRkZXZpY2VzLFxuXHRcdGVuc3VyZVBlcm1pc3Npb25zLFxuXHRcdHBlcm1pc3Npb25HcmFudGVkLFxuXHRcdHZpZGVvSW5wdXRzLFxuXHRcdGF1ZGlvSW5wdXRzLFxuXHRcdGF1ZGlvT3V0cHV0cyxcblx0XHRpc1N1cHBvcnRlZFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEaXNwbGF5TWVkaWEvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgbWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYWAgc3RyZWFtaW5nXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURpc3BsYXlNZWRpYVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZURpc3BsYXlNZWRpYShvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGVuYWJsZWQ7XG5cdGNvbnN0IGVuYWJsZWQgPSBzaGFsbG93UmVmKChfb3B0aW9ucyRlbmFibGVkID0gb3B0aW9ucy5lbmFibGVkKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRlbmFibGVkICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRlbmFibGVkIDogZmFsc2UpO1xuXHRjb25zdCB2aWRlbyA9IG9wdGlvbnMudmlkZW87XG5cdGNvbnN0IGF1ZGlvID0gb3B0aW9ucy5hdWRpbztcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHtcblx0XHR2YXIgX25hdmlnYXRvciRtZWRpYURldmljO1xuXHRcdHJldHVybiBuYXZpZ2F0b3IkMSA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IkMSA9PT0gdm9pZCAwIHx8IChfbmF2aWdhdG9yJG1lZGlhRGV2aWMgPSBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMpID09PSBudWxsIHx8IF9uYXZpZ2F0b3IkbWVkaWFEZXZpYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX25hdmlnYXRvciRtZWRpYURldmljLmdldERpc3BsYXlNZWRpYTtcblx0fSk7XG5cdGNvbnN0IGNvbnN0cmFpbnQgPSB7XG5cdFx0YXVkaW8sXG5cdFx0dmlkZW9cblx0fTtcblx0Y29uc3Qgc3RyZWFtID0gc2hhbGxvd1JlZigpO1xuXHRhc3luYyBmdW5jdGlvbiBfc3RhcnQoKSB7XG5cdFx0dmFyIF9zdHJlYW0kdmFsdWU7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCBzdHJlYW0udmFsdWUpIHJldHVybjtcblx0XHRzdHJlYW0udmFsdWUgPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZ2V0RGlzcGxheU1lZGlhKGNvbnN0cmFpbnQpO1xuXHRcdChfc3RyZWFtJHZhbHVlID0gc3RyZWFtLnZhbHVlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJHZhbHVlID09PSB2b2lkIDAgfHwgX3N0cmVhbSR2YWx1ZS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB1c2VFdmVudExpc3RlbmVyKHQsIFwiZW5kZWRcIiwgc3RvcCwgeyBwYXNzaXZlOiB0cnVlIH0pKTtcblx0XHRyZXR1cm4gc3RyZWFtLnZhbHVlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIF9zdG9wKCkge1xuXHRcdHZhciBfc3RyZWFtJHZhbHVlMjtcblx0XHQoX3N0cmVhbSR2YWx1ZTIgPSBzdHJlYW0udmFsdWUpID09PSBudWxsIHx8IF9zdHJlYW0kdmFsdWUyID09PSB2b2lkIDAgfHwgX3N0cmVhbSR2YWx1ZTIuZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuXHRcdHN0cmVhbS52YWx1ZSA9IHZvaWQgMDtcblx0fVxuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdF9zdG9wKCk7XG5cdFx0ZW5hYmxlZC52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuXHRcdGF3YWl0IF9zdGFydCgpO1xuXHRcdGlmIChzdHJlYW0udmFsdWUpIGVuYWJsZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBzdHJlYW0udmFsdWU7XG5cdH1cblx0d2F0Y2goZW5hYmxlZCwgKHYpID0+IHtcblx0XHRpZiAodikgX3N0YXJ0KCk7XG5cdFx0ZWxzZSBfc3RvcCgpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdHJlYW0sXG5cdFx0c3RhcnQsXG5cdFx0c3RvcCxcblx0XHRlbmFibGVkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURvY3VtZW50VmlzaWJpbGl0eS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgdHJhY2sgYGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZWAuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURvY3VtZW50VmlzaWJpbGl0eVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURvY3VtZW50VmlzaWJpbGl0eShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCB9ID0gb3B0aW9ucztcblx0aWYgKCFkb2N1bWVudCQxKSByZXR1cm4gc2hhbGxvd1JlZihcInZpc2libGVcIik7XG5cdGNvbnN0IHZpc2liaWxpdHkgPSBzaGFsbG93UmVmKGRvY3VtZW50JDEudmlzaWJpbGl0eVN0YXRlKTtcblx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInZpc2liaWxpdHljaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdHZpc2liaWxpdHkudmFsdWUgPSBkb2N1bWVudCQxLnZpc2liaWxpdHlTdGF0ZTtcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4gdmlzaWJpbGl0eTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRHJhZ2dhYmxlL2luZGV4LnRzXG5jb25zdCBkZWZhdWx0U2Nyb2xsQ29uZmlnID0ge1xuXHRzcGVlZDogMixcblx0bWFyZ2luOiAzMCxcblx0ZGlyZWN0aW9uOiBcImJvdGhcIlxufTtcbmZ1bmN0aW9uIGNsYW1wQ29udGFpbmVyU2Nyb2xsKGNvbnRhaW5lcikge1xuXHRpZiAoY29udGFpbmVyLnNjcm9sbExlZnQgPiBjb250YWluZXIuc2Nyb2xsV2lkdGggLSBjb250YWluZXIuY2xpZW50V2lkdGgpIGNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgY29udGFpbmVyLnNjcm9sbFdpZHRoIC0gY29udGFpbmVyLmNsaWVudFdpZHRoKTtcblx0aWYgKGNvbnRhaW5lci5zY3JvbGxUb3AgPiBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gY29udGFpbmVyLmNsaWVudEhlaWdodCkgY29udGFpbmVyLnNjcm9sbFRvcCA9IE1hdGgubWF4KDAsIGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSBjb250YWluZXIuY2xpZW50SGVpZ2h0KTtcbn1cbi8qKlxuKiBNYWtlIGVsZW1lbnRzIGRyYWdnYWJsZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRHJhZ2dhYmxlXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEcmFnZ2FibGUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0dmFyIF90b1ZhbHVlLCBfdG9WYWx1ZTIsIF90b1ZhbHVlMywgX3Njcm9sbENvbmZpZyRkaXJlY3RpO1xuXHRjb25zdCB7IHBvaW50ZXJUeXBlcywgcHJldmVudERlZmF1bHQ6IHByZXZlbnREZWZhdWx0JDEsIHN0b3BQcm9wYWdhdGlvbiwgZXhhY3QsIG9uTW92ZSwgb25FbmQsIG9uU3RhcnQsIGluaXRpYWxWYWx1ZSwgYXhpcyA9IFwiYm90aFwiLCBkcmFnZ2luZ0VsZW1lbnQgPSBkZWZhdWx0V2luZG93LCBjb250YWluZXJFbGVtZW50LCBoYW5kbGU6IGRyYWdnaW5nSGFuZGxlID0gdGFyZ2V0LCBidXR0b25zID0gWzBdLCByZXN0cmljdEluVmlldywgYXV0b1Njcm9sbCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBwb3NpdGlvbiA9IHJlZigoX3RvVmFsdWUgPSB0b1ZhbHVlKGluaXRpYWxWYWx1ZSkpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IHByZXNzZWREZWx0YSA9IHJlZigpO1xuXHRjb25zdCBmaWx0ZXJFdmVudCA9IChlKSA9PiB7XG5cdFx0aWYgKHBvaW50ZXJUeXBlcykgcmV0dXJuIHBvaW50ZXJUeXBlcy5pbmNsdWRlcyhlLnBvaW50ZXJUeXBlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblx0Y29uc3QgaGFuZGxlRXZlbnQgPSAoZSkgPT4ge1xuXHRcdGlmICh0b1ZhbHVlKHByZXZlbnREZWZhdWx0JDEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0aWYgKHRvVmFsdWUoc3RvcFByb3BhZ2F0aW9uKSkgZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblx0Y29uc3Qgc2Nyb2xsQ29uZmlnID0gdG9WYWx1ZShhdXRvU2Nyb2xsKTtcblx0Y29uc3Qgc2Nyb2xsU2V0dGluZ3MgPSB0eXBlb2Ygc2Nyb2xsQ29uZmlnID09PSBcIm9iamVjdFwiID8ge1xuXHRcdHNwZWVkOiAoX3RvVmFsdWUyID0gdG9WYWx1ZShzY3JvbGxDb25maWcuc3BlZWQpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZTIgIT09IHZvaWQgMCA/IF90b1ZhbHVlMiA6IGRlZmF1bHRTY3JvbGxDb25maWcuc3BlZWQsXG5cdFx0bWFyZ2luOiAoX3RvVmFsdWUzID0gdG9WYWx1ZShzY3JvbGxDb25maWcubWFyZ2luKSkgIT09IG51bGwgJiYgX3RvVmFsdWUzICE9PSB2b2lkIDAgPyBfdG9WYWx1ZTMgOiBkZWZhdWx0U2Nyb2xsQ29uZmlnLm1hcmdpbixcblx0XHRkaXJlY3Rpb246IChfc2Nyb2xsQ29uZmlnJGRpcmVjdGkgPSBzY3JvbGxDb25maWcuZGlyZWN0aW9uKSAhPT0gbnVsbCAmJiBfc2Nyb2xsQ29uZmlnJGRpcmVjdGkgIT09IHZvaWQgMCA/IF9zY3JvbGxDb25maWckZGlyZWN0aSA6IGRlZmF1bHRTY3JvbGxDb25maWcuZGlyZWN0aW9uXG5cdH0gOiBkZWZhdWx0U2Nyb2xsQ29uZmlnO1xuXHRjb25zdCBnZXRTY3JvbGxBeGlzVmFsdWVzID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyBbdmFsdWUsIHZhbHVlXSA6IFt2YWx1ZS54LCB2YWx1ZS55XTtcblx0Y29uc3QgaGFuZGxlQXV0b1Njcm9sbCA9IChjb250YWluZXIsIHRhcmdldFJlY3QsIHBvc2l0aW9uJDEpID0+IHtcblx0XHRjb25zdCB7IGNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQsIHNjcm9sbExlZnQsIHNjcm9sbFRvcCwgc2Nyb2xsV2lkdGgsIHNjcm9sbEhlaWdodCB9ID0gY29udGFpbmVyO1xuXHRcdGNvbnN0IFttYXJnaW5YLCBtYXJnaW5ZXSA9IGdldFNjcm9sbEF4aXNWYWx1ZXMoc2Nyb2xsU2V0dGluZ3MubWFyZ2luKTtcblx0XHRjb25zdCBbc3BlZWRYLCBzcGVlZFldID0gZ2V0U2Nyb2xsQXhpc1ZhbHVlcyhzY3JvbGxTZXR0aW5ncy5zcGVlZCk7XG5cdFx0bGV0IGRlbHRhWCA9IDA7XG5cdFx0bGV0IGRlbHRhWSA9IDA7XG5cdFx0aWYgKHNjcm9sbFNldHRpbmdzLmRpcmVjdGlvbiA9PT0gXCJ4XCIgfHwgc2Nyb2xsU2V0dGluZ3MuZGlyZWN0aW9uID09PSBcImJvdGhcIikge1xuXHRcdFx0aWYgKHBvc2l0aW9uJDEueCA8IG1hcmdpblggJiYgc2Nyb2xsTGVmdCA+IDApIGRlbHRhWCA9IC1zcGVlZFg7XG5cdFx0XHRlbHNlIGlmIChwb3NpdGlvbiQxLnggKyB0YXJnZXRSZWN0LndpZHRoID4gY2xpZW50V2lkdGggLSBtYXJnaW5YICYmIHNjcm9sbExlZnQgPCBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoKSBkZWx0YVggPSBzcGVlZFg7XG5cdFx0fVxuXHRcdGlmIChzY3JvbGxTZXR0aW5ncy5kaXJlY3Rpb24gPT09IFwieVwiIHx8IHNjcm9sbFNldHRpbmdzLmRpcmVjdGlvbiA9PT0gXCJib3RoXCIpIHtcblx0XHRcdGlmIChwb3NpdGlvbiQxLnkgPCBtYXJnaW5ZICYmIHNjcm9sbFRvcCA+IDApIGRlbHRhWSA9IC1zcGVlZFk7XG5cdFx0XHRlbHNlIGlmIChwb3NpdGlvbiQxLnkgKyB0YXJnZXRSZWN0LmhlaWdodCA+IGNsaWVudEhlaWdodCAtIG1hcmdpblkgJiYgc2Nyb2xsVG9wIDwgc2Nyb2xsSGVpZ2h0IC0gY2xpZW50SGVpZ2h0KSBkZWx0YVkgPSBzcGVlZFk7XG5cdFx0fVxuXHRcdGlmIChkZWx0YVggfHwgZGVsdGFZKSBjb250YWluZXIuc2Nyb2xsQnkoe1xuXHRcdFx0bGVmdDogZGVsdGFYLFxuXHRcdFx0dG9wOiBkZWx0YVksXG5cdFx0XHRiZWhhdmlvcjogXCJhdXRvXCJcblx0XHR9KTtcblx0fTtcblx0bGV0IGF1dG9TY3JvbGxJbnRlcnZhbCA9IG51bGw7XG5cdGNvbnN0IHN0YXJ0QXV0b1Njcm9sbCA9ICgpID0+IHtcblx0XHRjb25zdCBjb250YWluZXIgPSB0b1ZhbHVlKGNvbnRhaW5lckVsZW1lbnQpO1xuXHRcdGlmIChjb250YWluZXIgJiYgIWF1dG9TY3JvbGxJbnRlcnZhbCkgYXV0b1Njcm9sbEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0Y29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdGNvbnN0IHsgeCwgeSB9ID0gcG9zaXRpb24udmFsdWU7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVBvc2l0aW9uID0ge1xuXHRcdFx0XHR4OiB4IC0gY29udGFpbmVyLnNjcm9sbExlZnQsXG5cdFx0XHRcdHk6IHkgLSBjb250YWluZXIuc2Nyb2xsVG9wXG5cdFx0XHR9O1xuXHRcdFx0aWYgKHJlbGF0aXZlUG9zaXRpb24ueCA+PSAwICYmIHJlbGF0aXZlUG9zaXRpb24ueSA+PSAwKSB7XG5cdFx0XHRcdGhhbmRsZUF1dG9TY3JvbGwoY29udGFpbmVyLCB0YXJnZXRSZWN0LCByZWxhdGl2ZVBvc2l0aW9uKTtcblx0XHRcdFx0cmVsYXRpdmVQb3NpdGlvbi54ICs9IGNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuXHRcdFx0XHRyZWxhdGl2ZVBvc2l0aW9uLnkgKz0gY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHRcdFx0cG9zaXRpb24udmFsdWUgPSByZWxhdGl2ZVBvc2l0aW9uO1xuXHRcdFx0fVxuXHRcdH0sIDFlMyAvIDYwKTtcblx0fTtcblx0Y29uc3Qgc3RvcEF1dG9TY3JvbGwgPSAoKSA9PiB7XG5cdFx0aWYgKGF1dG9TY3JvbGxJbnRlcnZhbCkge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsSW50ZXJ2YWwpO1xuXHRcdFx0YXV0b1Njcm9sbEludGVydmFsID0gbnVsbDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGlzUG9pbnRlck5lYXJFZGdlID0gKHBvaW50ZXIsIGNvbnRhaW5lciwgbWFyZ2luLCB0YXJnZXRSZWN0KSA9PiB7XG5cdFx0Y29uc3QgW21hcmdpblgsIG1hcmdpblldID0gdHlwZW9mIG1hcmdpbiA9PT0gXCJudW1iZXJcIiA/IFttYXJnaW4sIG1hcmdpbl0gOiBbbWFyZ2luLngsIG1hcmdpbi55XTtcblx0XHRjb25zdCB7IGNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQgfSA9IGNvbnRhaW5lcjtcblx0XHRyZXR1cm4gcG9pbnRlci54IDwgbWFyZ2luWCB8fCBwb2ludGVyLnggKyB0YXJnZXRSZWN0LndpZHRoID4gY2xpZW50V2lkdGggLSBtYXJnaW5YIHx8IHBvaW50ZXIueSA8IG1hcmdpblkgfHwgcG9pbnRlci55ICsgdGFyZ2V0UmVjdC5oZWlnaHQgPiBjbGllbnRIZWlnaHQgLSBtYXJnaW5ZO1xuXHR9O1xuXHRjb25zdCBjaGVja0F1dG9TY3JvbGwgPSAoKSA9PiB7XG5cdFx0aWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgfHwgIXByZXNzZWREZWx0YS52YWx1ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IGNvbnRhaW5lciA9IHRvVmFsdWUoY29udGFpbmVyRWxlbWVudCk7XG5cdFx0aWYgKCFjb250YWluZXIpIHJldHVybjtcblx0XHRjb25zdCB0YXJnZXRSZWN0ID0gdG9WYWx1ZSh0YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGNvbnN0IHsgeCwgeSB9ID0gcG9zaXRpb24udmFsdWU7XG5cdFx0aWYgKGlzUG9pbnRlck5lYXJFZGdlKHtcblx0XHRcdHg6IHggLSBjb250YWluZXIuc2Nyb2xsTGVmdCxcblx0XHRcdHk6IHkgLSBjb250YWluZXIuc2Nyb2xsVG9wXG5cdFx0fSwgY29udGFpbmVyLCBzY3JvbGxTZXR0aW5ncy5tYXJnaW4sIHRhcmdldFJlY3QpKSBzdGFydEF1dG9TY3JvbGwoKTtcblx0XHRlbHNlIHN0b3BBdXRvU2Nyb2xsKCk7XG5cdH07XG5cdGlmICh0b1ZhbHVlKGF1dG9TY3JvbGwpKSB3YXRjaChwb3NpdGlvbiwgY2hlY2tBdXRvU2Nyb2xsKTtcblx0Y29uc3Qgc3RhcnQgPSAoZSkgPT4ge1xuXHRcdHZhciBfY29udGFpbmVyJGdldEJvdW5kaW47XG5cdFx0aWYgKCF0b1ZhbHVlKGJ1dHRvbnMpLmluY2x1ZGVzKGUuYnV0dG9uKSkgcmV0dXJuO1xuXHRcdGlmICh0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpIHx8ICFmaWx0ZXJFdmVudChlKSkgcmV0dXJuO1xuXHRcdGlmICh0b1ZhbHVlKGV4YWN0KSAmJiBlLnRhcmdldCAhPT0gdG9WYWx1ZSh0YXJnZXQpKSByZXR1cm47XG5cdFx0Y29uc3QgY29udGFpbmVyID0gdG9WYWx1ZShjb250YWluZXJFbGVtZW50KTtcblx0XHRjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyID09PSBudWxsIHx8IGNvbnRhaW5lciA9PT0gdm9pZCAwIHx8IChfY29udGFpbmVyJGdldEJvdW5kaW4gPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSA9PT0gbnVsbCB8fCBfY29udGFpbmVyJGdldEJvdW5kaW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jb250YWluZXIkZ2V0Qm91bmRpbi5jYWxsKGNvbnRhaW5lcik7XG5cdFx0Y29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCBwb3MgPSB7XG5cdFx0XHR4OiBlLmNsaWVudFggLSAoY29udGFpbmVyID8gdGFyZ2V0UmVjdC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0ICsgKGF1dG9TY3JvbGwgPyAwIDogY29udGFpbmVyLnNjcm9sbExlZnQpIDogdGFyZ2V0UmVjdC5sZWZ0KSxcblx0XHRcdHk6IGUuY2xpZW50WSAtIChjb250YWluZXIgPyB0YXJnZXRSZWN0LnRvcCAtIGNvbnRhaW5lclJlY3QudG9wICsgKGF1dG9TY3JvbGwgPyAwIDogY29udGFpbmVyLnNjcm9sbFRvcCkgOiB0YXJnZXRSZWN0LnRvcClcblx0XHR9O1xuXHRcdGlmICgob25TdGFydCA9PT0gbnVsbCB8fCBvblN0YXJ0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblN0YXJ0KHBvcywgZSkpID09PSBmYWxzZSkgcmV0dXJuO1xuXHRcdHByZXNzZWREZWx0YS52YWx1ZSA9IHBvcztcblx0XHRoYW5kbGVFdmVudChlKTtcblx0fTtcblx0Y29uc3QgbW92ZSA9IChlKSA9PiB7XG5cdFx0aWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgfHwgIWZpbHRlckV2ZW50KGUpKSByZXR1cm47XG5cdFx0aWYgKCFwcmVzc2VkRGVsdGEudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBjb250YWluZXIgPSB0b1ZhbHVlKGNvbnRhaW5lckVsZW1lbnQpO1xuXHRcdGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgY2xhbXBDb250YWluZXJTY3JvbGwoY29udGFpbmVyKTtcblx0XHRjb25zdCB0YXJnZXRSZWN0ID0gdG9WYWx1ZSh0YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGxldCB7IHgsIHkgfSA9IHBvc2l0aW9uLnZhbHVlO1xuXHRcdGlmIChheGlzID09PSBcInhcIiB8fCBheGlzID09PSBcImJvdGhcIikge1xuXHRcdFx0eCA9IGUuY2xpZW50WCAtIHByZXNzZWREZWx0YS52YWx1ZS54O1xuXHRcdFx0aWYgKGNvbnRhaW5lcikgeCA9IE1hdGgubWluKE1hdGgubWF4KDAsIHgpLCBjb250YWluZXIuc2Nyb2xsV2lkdGggLSB0YXJnZXRSZWN0LndpZHRoKTtcblx0XHR9XG5cdFx0aWYgKGF4aXMgPT09IFwieVwiIHx8IGF4aXMgPT09IFwiYm90aFwiKSB7XG5cdFx0XHR5ID0gZS5jbGllbnRZIC0gcHJlc3NlZERlbHRhLnZhbHVlLnk7XG5cdFx0XHRpZiAoY29udGFpbmVyKSB5ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgeSksIGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSB0YXJnZXRSZWN0LmhlaWdodCk7XG5cdFx0fVxuXHRcdGlmICh0b1ZhbHVlKGF1dG9TY3JvbGwpICYmIGNvbnRhaW5lcikge1xuXHRcdFx0aWYgKGF1dG9TY3JvbGxJbnRlcnZhbCA9PT0gbnVsbCkgaGFuZGxlQXV0b1Njcm9sbChjb250YWluZXIsIHRhcmdldFJlY3QsIHtcblx0XHRcdFx0eCxcblx0XHRcdFx0eVxuXHRcdFx0fSk7XG5cdFx0XHR4ICs9IGNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuXHRcdFx0eSArPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuXHRcdH1cblx0XHRpZiAoY29udGFpbmVyICYmIChyZXN0cmljdEluVmlldyB8fCBhdXRvU2Nyb2xsKSkge1xuXHRcdFx0aWYgKGF4aXMgIT09IFwieVwiKSB7XG5cdFx0XHRcdGNvbnN0IHJlbGF0aXZlWCA9IHggLSBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdFx0aWYgKHJlbGF0aXZlWCA8IDApIHggPSBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdFx0ZWxzZSBpZiAocmVsYXRpdmVYID4gY29udGFpbmVyLmNsaWVudFdpZHRoIC0gdGFyZ2V0UmVjdC53aWR0aCkgeCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIHRhcmdldFJlY3Qud2lkdGggKyBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdH1cblx0XHRcdGlmIChheGlzICE9PSBcInhcIikge1xuXHRcdFx0XHRjb25zdCByZWxhdGl2ZVkgPSB5IC0gY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHRcdFx0aWYgKHJlbGF0aXZlWSA8IDApIHkgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuXHRcdFx0XHRlbHNlIGlmIChyZWxhdGl2ZVkgPiBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdGFyZ2V0UmVjdC5oZWlnaHQpIHkgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdGFyZ2V0UmVjdC5oZWlnaHQgKyBjb250YWluZXIuc2Nyb2xsVG9wO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRwb3NpdGlvbi52YWx1ZSA9IHtcblx0XHRcdHgsXG5cdFx0XHR5XG5cdFx0fTtcblx0XHRvbk1vdmUgPT09IG51bGwgfHwgb25Nb3ZlID09PSB2b2lkIDAgfHwgb25Nb3ZlKHBvc2l0aW9uLnZhbHVlLCBlKTtcblx0XHRoYW5kbGVFdmVudChlKTtcblx0fTtcblx0Y29uc3QgZW5kID0gKGUpID0+IHtcblx0XHRpZiAodG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSB8fCAhZmlsdGVyRXZlbnQoZSkpIHJldHVybjtcblx0XHRpZiAoIXByZXNzZWREZWx0YS52YWx1ZSkgcmV0dXJuO1xuXHRcdHByZXNzZWREZWx0YS52YWx1ZSA9IHZvaWQgMDtcblx0XHRpZiAoYXV0b1Njcm9sbCkgc3RvcEF1dG9TY3JvbGwoKTtcblx0XHRvbkVuZCA9PT0gbnVsbCB8fCBvbkVuZCA9PT0gdm9pZCAwIHx8IG9uRW5kKHBvc2l0aW9uLnZhbHVlLCBlKTtcblx0XHRoYW5kbGVFdmVudChlKTtcblx0fTtcblx0aWYgKGlzQ2xpZW50KSB7XG5cdFx0Y29uc3QgY29uZmlnID0gKCkgPT4ge1xuXHRcdFx0dmFyIF9vcHRpb25zJGNhcHR1cmU7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjYXB0dXJlOiAoX29wdGlvbnMkY2FwdHVyZSA9IG9wdGlvbnMuY2FwdHVyZSkgIT09IG51bGwgJiYgX29wdGlvbnMkY2FwdHVyZSAhPT0gdm9pZCAwID8gX29wdGlvbnMkY2FwdHVyZSA6IHRydWUsXG5cdFx0XHRcdHBhc3NpdmU6ICF0b1ZhbHVlKHByZXZlbnREZWZhdWx0JDEpXG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkcmFnZ2luZ0hhbmRsZSwgXCJwb2ludGVyZG93blwiLCBzdGFydCwgY29uZmlnKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGRyYWdnaW5nRWxlbWVudCwgXCJwb2ludGVybW92ZVwiLCBtb3ZlLCBjb25maWcpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZHJhZ2dpbmdFbGVtZW50LCBcInBvaW50ZXJ1cFwiLCBlbmQsIGNvbmZpZyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHQuLi50b1JlZnMocG9zaXRpb24pLFxuXHRcdHBvc2l0aW9uLFxuXHRcdGlzRHJhZ2dpbmc6IGNvbXB1dGVkKCgpID0+ICEhcHJlc3NlZERlbHRhLnZhbHVlKSxcblx0XHRzdHlsZTogY29tcHV0ZWQoKCkgPT4gYFxuICAgICAgbGVmdDogJHtwb3NpdGlvbi52YWx1ZS54fXB4O1xuICAgICAgdG9wOiAke3Bvc2l0aW9uLnZhbHVlLnl9cHg7XG4gICAgICAke2F1dG9TY3JvbGwgPyBcInRleHQtd3JhcDogbm93cmFwO1wiIDogXCJcIn1cbiAgICBgKVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEcm9wWm9uZS9pbmRleC50c1xuZnVuY3Rpb24gdXNlRHJvcFpvbmUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgaXNPdmVyRHJvcFpvbmUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZmlsZXMgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRsZXQgY291bnRlciA9IDA7XG5cdGxldCBpc1ZhbGlkID0gdHJ1ZTtcblx0aWYgKGlzQ2xpZW50KSB7XG5cdFx0dmFyIF9vcHRpb25zJG11bHRpcGxlLCBfb3B0aW9ucyRwcmV2ZW50RGVmYXU7XG5cdFx0Y29uc3QgX29wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8geyBvbkRyb3A6IG9wdGlvbnMgfSA6IG9wdGlvbnM7XG5cdFx0Y29uc3QgbXVsdGlwbGUgPSAoX29wdGlvbnMkbXVsdGlwbGUgPSBfb3B0aW9ucy5tdWx0aXBsZSkgIT09IG51bGwgJiYgX29wdGlvbnMkbXVsdGlwbGUgIT09IHZvaWQgMCA/IF9vcHRpb25zJG11bHRpcGxlIDogdHJ1ZTtcblx0XHRjb25zdCBwcmV2ZW50RGVmYXVsdEZvclVuaGFuZGxlZCA9IChfb3B0aW9ucyRwcmV2ZW50RGVmYXUgPSBfb3B0aW9ucy5wcmV2ZW50RGVmYXVsdEZvclVuaGFuZGxlZCkgIT09IG51bGwgJiYgX29wdGlvbnMkcHJldmVudERlZmF1ICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRwcmV2ZW50RGVmYXUgOiBmYWxzZTtcblx0XHRjb25zdCBnZXRGaWxlcyA9IChldmVudCkgPT4ge1xuXHRcdFx0dmFyIF9ldmVudCRkYXRhVHJhbnNmZXIkZiwgX2V2ZW50JGRhdGFUcmFuc2Zlcjtcblx0XHRcdGNvbnN0IGxpc3QgPSBBcnJheS5mcm9tKChfZXZlbnQkZGF0YVRyYW5zZmVyJGYgPSAoX2V2ZW50JGRhdGFUcmFuc2ZlciA9IGV2ZW50LmRhdGFUcmFuc2ZlcikgPT09IG51bGwgfHwgX2V2ZW50JGRhdGFUcmFuc2ZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGRhdGFUcmFuc2Zlci5maWxlcykgIT09IG51bGwgJiYgX2V2ZW50JGRhdGFUcmFuc2ZlciRmICE9PSB2b2lkIDAgPyBfZXZlbnQkZGF0YVRyYW5zZmVyJGYgOiBbXSk7XG5cdFx0XHRyZXR1cm4gbGlzdC5sZW5ndGggPT09IDAgPyBudWxsIDogbXVsdGlwbGUgPyBsaXN0IDogW2xpc3RbMF1dO1xuXHRcdH07XG5cdFx0Y29uc3QgY2hlY2tEYXRhVHlwZXMgPSAodHlwZXMpID0+IHtcblx0XHRcdGNvbnN0IGRhdGFUeXBlcyA9IHVucmVmKF9vcHRpb25zLmRhdGFUeXBlcyk7XG5cdFx0XHRpZiAodHlwZW9mIGRhdGFUeXBlcyA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZGF0YVR5cGVzKHR5cGVzKTtcblx0XHRcdGlmICghKGRhdGFUeXBlcyA9PT0gbnVsbCB8fCBkYXRhVHlwZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGFUeXBlcy5sZW5ndGgpKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGlmICh0eXBlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblx0XHRcdHJldHVybiB0eXBlcy5ldmVyeSgodHlwZSkgPT4gZGF0YVR5cGVzLnNvbWUoKGFsbG93ZWRUeXBlKSA9PiB0eXBlLmluY2x1ZGVzKGFsbG93ZWRUeXBlKSkpO1xuXHRcdH07XG5cdFx0Y29uc3QgY2hlY2tWYWxpZGl0eSA9IChpdGVtcykgPT4ge1xuXHRcdFx0aWYgKF9vcHRpb25zLmNoZWNrVmFsaWRpdHkpIHJldHVybiBfb3B0aW9ucy5jaGVja1ZhbGlkaXR5KGl0ZW1zKTtcblx0XHRcdGNvbnN0IGRhdGFUeXBlc1ZhbGlkID0gY2hlY2tEYXRhVHlwZXMoQXJyYXkuZnJvbShpdGVtcyAhPT0gbnVsbCAmJiBpdGVtcyAhPT0gdm9pZCAwID8gaXRlbXMgOiBbXSkubWFwKChpdGVtKSA9PiBpdGVtLnR5cGUpKTtcblx0XHRcdGNvbnN0IG11bHRpcGxlRmlsZXNWYWxpZCA9IG11bHRpcGxlIHx8IGl0ZW1zLmxlbmd0aCA8PSAxO1xuXHRcdFx0cmV0dXJuIGRhdGFUeXBlc1ZhbGlkICYmIG11bHRpcGxlRmlsZXNWYWxpZDtcblx0XHR9O1xuXHRcdGNvbnN0IGlzU2FmYXJpID0gKCkgPT4gL14oPzooPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEoXCJjaHJvbWVcIiBpbiB3aW5kb3cpO1xuXHRcdGNvbnN0IGhhbmRsZURyYWdFdmVudCA9IChldmVudCwgZXZlbnRUeXBlKSA9PiB7XG5cdFx0XHR2YXIgX2V2ZW50JGRhdGFUcmFuc2ZlcjIsIF9yZWY7XG5cdFx0XHRjb25zdCBkYXRhVHJhbnNmZXJJdGVtTGlzdCA9IChfZXZlbnQkZGF0YVRyYW5zZmVyMiA9IGV2ZW50LmRhdGFUcmFuc2ZlcikgPT09IG51bGwgfHwgX2V2ZW50JGRhdGFUcmFuc2ZlcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRkYXRhVHJhbnNmZXIyLml0ZW1zO1xuXHRcdFx0aXNWYWxpZCA9IChfcmVmID0gZGF0YVRyYW5zZmVySXRlbUxpc3QgJiYgY2hlY2tWYWxpZGl0eShkYXRhVHJhbnNmZXJJdGVtTGlzdCkpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBmYWxzZTtcblx0XHRcdGlmIChwcmV2ZW50RGVmYXVsdEZvclVuaGFuZGxlZCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmICghaXNTYWZhcmkoKSAmJiAhaXNWYWxpZCkge1xuXHRcdFx0XHRpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwibm9uZVwiO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKGV2ZW50LmRhdGFUcmFuc2ZlcikgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcImNvcHlcIjtcblx0XHRcdGNvbnN0IGN1cnJlbnRGaWxlcyA9IGdldEZpbGVzKGV2ZW50KTtcblx0XHRcdHN3aXRjaCAoZXZlbnRUeXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJlbnRlclwiOlxuXHRcdFx0XHRcdHZhciBfb3B0aW9ucyRvbkVudGVyO1xuXHRcdFx0XHRcdGNvdW50ZXIgKz0gMTtcblx0XHRcdFx0XHRpc092ZXJEcm9wWm9uZS52YWx1ZSA9IHRydWU7XG5cdFx0XHRcdFx0KF9vcHRpb25zJG9uRW50ZXIgPSBfb3B0aW9ucy5vbkVudGVyKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkVudGVyID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25FbnRlci5jYWxsKF9vcHRpb25zLCBudWxsLCBldmVudCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJvdmVyXCI6XG5cdFx0XHRcdFx0dmFyIF9vcHRpb25zJG9uT3Zlcjtcblx0XHRcdFx0XHQoX29wdGlvbnMkb25PdmVyID0gX29wdGlvbnMub25PdmVyKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbk92ZXIgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvbk92ZXIuY2FsbChfb3B0aW9ucywgbnVsbCwgZXZlbnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibGVhdmVcIjpcblx0XHRcdFx0XHR2YXIgX29wdGlvbnMkb25MZWF2ZTtcblx0XHRcdFx0XHRjb3VudGVyIC09IDE7XG5cdFx0XHRcdFx0aWYgKGNvdW50ZXIgPT09IDApIGlzT3ZlckRyb3Bab25lLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdFx0KF9vcHRpb25zJG9uTGVhdmUgPSBfb3B0aW9ucy5vbkxlYXZlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkxlYXZlID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25MZWF2ZS5jYWxsKF9vcHRpb25zLCBudWxsLCBldmVudCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJkcm9wXCI6XG5cdFx0XHRcdFx0Y291bnRlciA9IDA7XG5cdFx0XHRcdFx0aXNPdmVyRHJvcFpvbmUudmFsdWUgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAoaXNWYWxpZCkge1xuXHRcdFx0XHRcdFx0dmFyIF9vcHRpb25zJG9uRHJvcDtcblx0XHRcdFx0XHRcdGZpbGVzLnZhbHVlID0gY3VycmVudEZpbGVzO1xuXHRcdFx0XHRcdFx0KF9vcHRpb25zJG9uRHJvcCA9IF9vcHRpb25zLm9uRHJvcCkgPT09IG51bGwgfHwgX29wdGlvbnMkb25Ecm9wID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25Ecm9wLmNhbGwoX29wdGlvbnMsIGN1cnJlbnRGaWxlcywgZXZlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImRyYWdlbnRlclwiLCAoZXZlbnQpID0+IGhhbmRsZURyYWdFdmVudChldmVudCwgXCJlbnRlclwiKSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJhZ292ZXJcIiwgKGV2ZW50KSA9PiBoYW5kbGVEcmFnRXZlbnQoZXZlbnQsIFwib3ZlclwiKSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJhZ2xlYXZlXCIsIChldmVudCkgPT4gaGFuZGxlRHJhZ0V2ZW50KGV2ZW50LCBcImxlYXZlXCIpKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkcm9wXCIsIChldmVudCkgPT4gaGFuZGxlRHJhZ0V2ZW50KGV2ZW50LCBcImRyb3BcIikpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0ZmlsZXMsXG5cdFx0aXNPdmVyRHJvcFpvbmVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUmVzaXplT2JzZXJ2ZXIvaW5kZXgudHNcbi8qKlxuKiBSZXBvcnRzIGNoYW5nZXMgdG8gdGhlIGRpbWVuc2lvbnMgb2YgYW4gRWxlbWVudCdzIGNvbnRlbnQgb3IgdGhlIGJvcmRlci1ib3hcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmVzaXplT2JzZXJ2ZXJcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gY2FsbGJhY2tcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VSZXNpemVPYnNlcnZlcih0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywuLi5vYnNlcnZlck9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGxldCBvYnNlcnZlcjtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG5cdFx0aWYgKG9ic2VydmVyKSB7XG5cdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHRvYnNlcnZlciA9IHZvaWQgMDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHN0b3BXYXRjaCA9IHdhdGNoKGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBfdGFyZ2V0cyA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShfdGFyZ2V0cykgPyBfdGFyZ2V0cy5tYXAoKGVsKSA9PiB1bnJlZkVsZW1lbnQoZWwpKSA6IFt1bnJlZkVsZW1lbnQoX3RhcmdldHMpXTtcblx0fSksIChlbHMpID0+IHtcblx0XHRjbGVhbnVwKCk7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHdpbmRvdyQxKSB7XG5cdFx0XHRvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihjYWxsYmFjayk7XG5cdFx0XHRmb3IgKGNvbnN0IF9lbCBvZiBlbHMpIGlmIChfZWwpIG9ic2VydmVyLm9ic2VydmUoX2VsLCBvYnNlcnZlck9wdGlvbnMpO1xuXHRcdH1cblx0fSwge1xuXHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRmbHVzaDogXCJwb3N0XCJcblx0fSk7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0Y2xlYW51cCgpO1xuXHRcdHN0b3BXYXRjaCgpO1xuXHR9O1xuXHR0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUVsZW1lbnRCb3VuZGluZy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGJvdW5kaW5nIGJveCBvZiBhbiBIVE1MIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRCb3VuZGluZ1xuKiBAcGFyYW0gdGFyZ2V0XG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudEJvdW5kaW5nKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgcmVzZXQgPSB0cnVlLCB3aW5kb3dSZXNpemUgPSB0cnVlLCB3aW5kb3dTY3JvbGwgPSB0cnVlLCBpbW1lZGlhdGUgPSB0cnVlLCB1cGRhdGVUaW1pbmcgPSBcInN5bmNcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaGVpZ2h0ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgYm90dG9tID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgbGVmdCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHJpZ2h0ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgdG9wID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3Qgd2lkdGggPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCB4ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgeSA9IHNoYWxsb3dSZWYoMCk7XG5cdGZ1bmN0aW9uIHJlY2FsY3VsYXRlKCkge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKCFlbCkge1xuXHRcdFx0aWYgKHJlc2V0KSB7XG5cdFx0XHRcdGhlaWdodC52YWx1ZSA9IDA7XG5cdFx0XHRcdGJvdHRvbS52YWx1ZSA9IDA7XG5cdFx0XHRcdGxlZnQudmFsdWUgPSAwO1xuXHRcdFx0XHRyaWdodC52YWx1ZSA9IDA7XG5cdFx0XHRcdHRvcC52YWx1ZSA9IDA7XG5cdFx0XHRcdHdpZHRoLnZhbHVlID0gMDtcblx0XHRcdFx0eC52YWx1ZSA9IDA7XG5cdFx0XHRcdHkudmFsdWUgPSAwO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0aGVpZ2h0LnZhbHVlID0gcmVjdC5oZWlnaHQ7XG5cdFx0Ym90dG9tLnZhbHVlID0gcmVjdC5ib3R0b207XG5cdFx0bGVmdC52YWx1ZSA9IHJlY3QubGVmdDtcblx0XHRyaWdodC52YWx1ZSA9IHJlY3QucmlnaHQ7XG5cdFx0dG9wLnZhbHVlID0gcmVjdC50b3A7XG5cdFx0d2lkdGgudmFsdWUgPSByZWN0LndpZHRoO1xuXHRcdHgudmFsdWUgPSByZWN0Lng7XG5cdFx0eS52YWx1ZSA9IHJlY3QueTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGUoKSB7XG5cdFx0aWYgKHVwZGF0ZVRpbWluZyA9PT0gXCJzeW5jXCIpIHJlY2FsY3VsYXRlKCk7XG5cdFx0ZWxzZSBpZiAodXBkYXRlVGltaW5nID09PSBcIm5leHQtZnJhbWVcIikgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlY2FsY3VsYXRlKCkpO1xuXHR9XG5cdHVzZVJlc2l6ZU9ic2VydmVyKHRhcmdldCwgdXBkYXRlKTtcblx0d2F0Y2goKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCksIChlbGUpID0+ICFlbGUgJiYgdXBkYXRlKCkpO1xuXHR1c2VNdXRhdGlvbk9ic2VydmVyKHRhcmdldCwgdXBkYXRlLCB7IGF0dHJpYnV0ZUZpbHRlcjogW1wic3R5bGVcIiwgXCJjbGFzc1wiXSB9KTtcblx0aWYgKHdpbmRvd1Njcm9sbCkgdXNlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB1cGRhdGUsIHtcblx0XHRjYXB0dXJlOiB0cnVlLFxuXHRcdHBhc3NpdmU6IHRydWVcblx0fSk7XG5cdGlmICh3aW5kb3dSZXNpemUpIHVzZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0aWYgKGltbWVkaWF0ZSkgdXBkYXRlKCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGhlaWdodCxcblx0XHRib3R0b20sXG5cdFx0bGVmdCxcblx0XHRyaWdodCxcblx0XHR0b3AsXG5cdFx0d2lkdGgsXG5cdFx0eCxcblx0XHR5LFxuXHRcdHVwZGF0ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50QnlQb2ludC9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ3KG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiBpbnRlcnZhbCA9PT0gXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiA/IChjYikgPT4gdXNlUmFmRm4oY2IsIHsgaW1tZWRpYXRlIH0pIDogKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCBpbnRlcnZhbCwgeyBpbW1lZGlhdGUgfSk7XG5cdH1cblx0cmV0dXJuIHVzZVJhZkZuO1xufVxuLyoqXG4qIFJlYWN0aXZlIGVsZW1lbnQgYnkgcG9pbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRCeVBvaW50XG4qIEBwYXJhbSBvcHRpb25zIC0gVXNlRWxlbWVudEJ5UG9pbnRPcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudEJ5UG9pbnQob3B0aW9ucykge1xuXHRjb25zdCB7IHgsIHksIGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50LCBtdWx0aXBsZSwgc2NoZWR1bGVyID0gZ2V0RGVmYXVsdFNjaGVkdWxlciQ3KG9wdGlvbnMpIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4ge1xuXHRcdGlmICh0b1ZhbHVlKG11bHRpcGxlKSkgcmV0dXJuIGRvY3VtZW50JDEgJiYgXCJlbGVtZW50c0Zyb21Qb2ludFwiIGluIGRvY3VtZW50JDE7XG5cdFx0cmV0dXJuIGRvY3VtZW50JDEgJiYgXCJlbGVtZW50RnJvbVBvaW50XCIgaW4gZG9jdW1lbnQkMTtcblx0fSk7XG5cdGNvbnN0IGVsZW1lbnQgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGVsZW1lbnQsXG5cdFx0Li4uc2NoZWR1bGVyKCgpID0+IHtcblx0XHRcdHZhciBfZG9jdW1lbnQkZWxlbWVudHNGcm8sIF9kb2N1bWVudCRlbGVtZW50RnJvbTtcblx0XHRcdGVsZW1lbnQudmFsdWUgPSB0b1ZhbHVlKG11bHRpcGxlKSA/IChfZG9jdW1lbnQkZWxlbWVudHNGcm8gPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuZWxlbWVudHNGcm9tUG9pbnQodG9WYWx1ZSh4KSwgdG9WYWx1ZSh5KSkpICE9PSBudWxsICYmIF9kb2N1bWVudCRlbGVtZW50c0ZybyAhPT0gdm9pZCAwID8gX2RvY3VtZW50JGVsZW1lbnRzRnJvIDogW10gOiAoX2RvY3VtZW50JGVsZW1lbnRGcm9tID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmVsZW1lbnRGcm9tUG9pbnQodG9WYWx1ZSh4KSwgdG9WYWx1ZSh5KSkpICE9PSBudWxsICYmIF9kb2N1bWVudCRlbGVtZW50RnJvbSAhPT0gdm9pZCAwID8gX2RvY3VtZW50JGVsZW1lbnRGcm9tIDogbnVsbDtcblx0XHR9KVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50SG92ZXIvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUVsZW1lbnRIb3ZlcihlbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZGVsYXlFbnRlciA9IDAsIGRlbGF5TGVhdmUgPSAwLCB0cmlnZ2VyT25SZW1vdmFsID0gZmFsc2UsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0hvdmVyZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHRpbWVyO1xuXHRjb25zdCB0b2dnbGUgPSAoZW50ZXJpbmcpID0+IHtcblx0XHRjb25zdCBkZWxheSA9IGVudGVyaW5nID8gZGVsYXlFbnRlciA6IGRlbGF5TGVhdmU7XG5cdFx0aWYgKHRpbWVyKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0dGltZXIgPSB2b2lkIDA7XG5cdFx0fVxuXHRcdGlmIChkZWxheSkgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGlzSG92ZXJlZC52YWx1ZSA9IGVudGVyaW5nLCBkZWxheSk7XG5cdFx0ZWxzZSBpc0hvdmVyZWQudmFsdWUgPSBlbnRlcmluZztcblx0fTtcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIGlzSG92ZXJlZDtcblx0dXNlRXZlbnRMaXN0ZW5lcihlbCwgXCJtb3VzZWVudGVyXCIsICgpID0+IHRvZ2dsZSh0cnVlKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKGVsLCBcIm1vdXNlbGVhdmVcIiwgKCkgPT4gdG9nZ2xlKGZhbHNlKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRpZiAodHJpZ2dlck9uUmVtb3ZhbCkgb25FbGVtZW50UmVtb3ZhbChjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQoZWwpKSwgKCkgPT4gdG9nZ2xlKGZhbHNlKSk7XG5cdHJldHVybiBpc0hvdmVyZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUVsZW1lbnRTaXplL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgc2l6ZSBvZiBhbiBIVE1MIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRTaXplXG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudFNpemUodGFyZ2V0LCBpbml0aWFsU2l6ZSA9IHtcblx0d2lkdGg6IDAsXG5cdGhlaWdodDogMFxufSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGJveCA9IFwiY29udGVudC1ib3hcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTVkcgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF91bnJlZkVsZW1lbnQ7XG5cdFx0cmV0dXJuIChfdW5yZWZFbGVtZW50ID0gdW5yZWZFbGVtZW50KHRhcmdldCkpID09PSBudWxsIHx8IF91bnJlZkVsZW1lbnQgPT09IHZvaWQgMCB8fCAoX3VucmVmRWxlbWVudCA9IF91bnJlZkVsZW1lbnQubmFtZXNwYWNlVVJJKSA9PT0gbnVsbCB8fCBfdW5yZWZFbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdW5yZWZFbGVtZW50LmluY2x1ZGVzKFwic3ZnXCIpO1xuXHR9KTtcblx0Y29uc3Qgd2lkdGggPSBzaGFsbG93UmVmKGluaXRpYWxTaXplLndpZHRoKTtcblx0Y29uc3QgaGVpZ2h0ID0gc2hhbGxvd1JlZihpbml0aWFsU2l6ZS5oZWlnaHQpO1xuXHRjb25zdCB7IHN0b3A6IHN0b3AxIH0gPSB1c2VSZXNpemVPYnNlcnZlcih0YXJnZXQsIChbZW50cnldKSA9PiB7XG5cdFx0Y29uc3QgYm94U2l6ZSA9IGJveCA9PT0gXCJib3JkZXItYm94XCIgPyBlbnRyeS5ib3JkZXJCb3hTaXplIDogYm94ID09PSBcImNvbnRlbnQtYm94XCIgPyBlbnRyeS5jb250ZW50Qm94U2l6ZSA6IGVudHJ5LmRldmljZVBpeGVsQ29udGVudEJveFNpemU7XG5cdFx0aWYgKHdpbmRvdyQxICYmIGlzU1ZHLnZhbHVlKSB7XG5cdFx0XHRjb25zdCAkZWxlbSA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdFx0aWYgKCRlbGVtKSB7XG5cdFx0XHRcdGNvbnN0IHJlY3QgPSAkZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdFx0d2lkdGgudmFsdWUgPSByZWN0LndpZHRoO1xuXHRcdFx0XHRoZWlnaHQudmFsdWUgPSByZWN0LmhlaWdodDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGJveFNpemUpIHtcblx0XHRcdGNvbnN0IGZvcm1hdEJveFNpemUgPSB0b0FycmF5KGJveFNpemUpO1xuXHRcdFx0d2lkdGgudmFsdWUgPSBmb3JtYXRCb3hTaXplLnJlZHVjZSgoYWNjLCB7IGlubGluZVNpemUgfSkgPT4gYWNjICsgaW5saW5lU2l6ZSwgMCk7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSBmb3JtYXRCb3hTaXplLnJlZHVjZSgoYWNjLCB7IGJsb2NrU2l6ZSB9KSA9PiBhY2MgKyBibG9ja1NpemUsIDApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aWR0aC52YWx1ZSA9IGVudHJ5LmNvbnRlbnRSZWN0LndpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gZW50cnkuY29udGVudFJlY3QuaGVpZ2h0O1xuXHRcdH1cblx0fSwgb3B0aW9ucyk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgZWxlID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKGVsZSkge1xuXHRcdFx0d2lkdGgudmFsdWUgPSBcIm9mZnNldFdpZHRoXCIgaW4gZWxlID8gZWxlLm9mZnNldFdpZHRoIDogaW5pdGlhbFNpemUud2lkdGg7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSBcIm9mZnNldEhlaWdodFwiIGluIGVsZSA/IGVsZS5vZmZzZXRIZWlnaHQgOiBpbml0aWFsU2l6ZS5oZWlnaHQ7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3Qgc3RvcDIgPSB3YXRjaCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSwgKGVsZSkgPT4ge1xuXHRcdHdpZHRoLnZhbHVlID0gZWxlID8gaW5pdGlhbFNpemUud2lkdGggOiAwO1xuXHRcdGhlaWdodC52YWx1ZSA9IGVsZSA/IGluaXRpYWxTaXplLmhlaWdodCA6IDA7XG5cdH0pO1xuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdHN0b3AxKCk7XG5cdFx0c3RvcDIoKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHdpZHRoLFxuXHRcdGhlaWdodCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUludGVyc2VjdGlvbk9ic2VydmVyL2luZGV4LnRzXG4vKipcbiogRGV0ZWN0cyB0aGF0IGEgdGFyZ2V0IGVsZW1lbnQncyB2aXNpYmlsaXR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VJbnRlcnNlY3Rpb25PYnNlcnZlclxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBjYWxsYmFja1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUludGVyc2VjdGlvbk9ic2VydmVyKHRhcmdldCwgY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHJvb3QsIHJvb3RNYXJnaW4sIHRocmVzaG9sZCA9IDAsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJJbnRlcnNlY3Rpb25PYnNlcnZlclwiIGluIHdpbmRvdyQxKTtcblx0Y29uc3QgdGFyZ2V0cyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gdG9BcnJheSh0b1ZhbHVlKHRhcmdldCkpLm1hcCh1bnJlZkVsZW1lbnQpLmZpbHRlcihub3ROdWxsaXNoKTtcblx0fSk7XG5cdGxldCBjbGVhbnVwID0gbm9vcDtcblx0Y29uc3QgaXNBY3RpdmUgPSBzaGFsbG93UmVmKGltbWVkaWF0ZSk7XG5cdGNvbnN0IHN0b3BXYXRjaCA9IGlzU3VwcG9ydGVkLnZhbHVlID8gd2F0Y2goKCkgPT4gW1xuXHRcdHRhcmdldHMudmFsdWUsXG5cdFx0dW5yZWZFbGVtZW50KHJvb3QpLFxuXHRcdHRvVmFsdWUocm9vdE1hcmdpbiksXG5cdFx0aXNBY3RpdmUudmFsdWVcblx0XSwgKFt0YXJnZXRzJDEsIHJvb3QkMSwgcm9vdE1hcmdpbiQxXSkgPT4ge1xuXHRcdGNsZWFudXAoKTtcblx0XHRpZiAoIWlzQWN0aXZlLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKCF0YXJnZXRzJDEubGVuZ3RoKSByZXR1cm47XG5cdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIHtcblx0XHRcdHJvb3Q6IHVucmVmRWxlbWVudChyb290JDEpLFxuXHRcdFx0cm9vdE1hcmdpbjogcm9vdE1hcmdpbiQxLFxuXHRcdFx0dGhyZXNob2xkXG5cdFx0fSk7XG5cdFx0dGFyZ2V0cyQxLmZvckVhY2goKGVsKSA9PiBlbCAmJiBvYnNlcnZlci5vYnNlcnZlKGVsKSk7XG5cdFx0Y2xlYW51cCA9ICgpID0+IHtcblx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdGNsZWFudXAgPSBub29wO1xuXHRcdH07XG5cdH0sIHtcblx0XHRpbW1lZGlhdGUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pIDogbm9vcDtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRjbGVhbnVwKCk7XG5cdFx0c3RvcFdhdGNoKCk7XG5cdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNBY3RpdmUsXG5cdFx0cGF1c2UoKSB7XG5cdFx0XHRjbGVhbnVwKCk7XG5cdFx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0cmVzdW1lKCkge1xuXHRcdFx0aXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuXHRcdH0sXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50VmlzaWJpbGl0eS9pbmRleC50c1xuLyoqXG4qIFRyYWNrcyB0aGUgdmlzaWJpbGl0eSBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgdmlld3BvcnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRWaXNpYmlsaXR5XG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudFZpc2liaWxpdHkoZWxlbWVudCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHNjcm9sbFRhcmdldCwgdGhyZXNob2xkID0gMCwgcm9vdE1hcmdpbiwgb25jZSA9IGZhbHNlLCBpbml0aWFsVmFsdWUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZWxlbWVudElzVmlzaWJsZSA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgeyBzdG9wIH0gPSB1c2VJbnRlcnNlY3Rpb25PYnNlcnZlcihlbGVtZW50LCAoaW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyaWVzKSA9PiB7XG5cdFx0bGV0IGlzSW50ZXJzZWN0aW5nID0gZWxlbWVudElzVmlzaWJsZS52YWx1ZTtcblx0XHRsZXQgbGF0ZXN0VGltZSA9IDA7XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBpbnRlcnNlY3Rpb25PYnNlcnZlckVudHJpZXMpIGlmIChlbnRyeS50aW1lID49IGxhdGVzdFRpbWUpIHtcblx0XHRcdGxhdGVzdFRpbWUgPSBlbnRyeS50aW1lO1xuXHRcdFx0aXNJbnRlcnNlY3RpbmcgPSBlbnRyeS5pc0ludGVyc2VjdGluZztcblx0XHR9XG5cdFx0ZWxlbWVudElzVmlzaWJsZS52YWx1ZSA9IGlzSW50ZXJzZWN0aW5nO1xuXHRcdGlmIChvbmNlKSB3YXRjaE9uY2UoZWxlbWVudElzVmlzaWJsZSwgKCkgPT4ge1xuXHRcdFx0c3RvcCgpO1xuXHRcdH0pO1xuXHR9LCB7XG5cdFx0cm9vdDogc2Nyb2xsVGFyZ2V0LFxuXHRcdHdpbmRvdzogd2luZG93JDEsXG5cdFx0dGhyZXNob2xkLFxuXHRcdHJvb3RNYXJnaW5cblx0fSk7XG5cdHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFdmVudEJ1cy9pbnRlcm5hbC50c1xuY29uc3QgZXZlbnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRXZlbnRCdXMvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VFdmVudEJ1cyhrZXkpIHtcblx0Y29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50U2NvcGUoKTtcblx0ZnVuY3Rpb24gb24obGlzdGVuZXIpIHtcblx0XHR2YXIgX3Njb3BlJGNsZWFudXBzO1xuXHRcdGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50cy5nZXQoa2V5KSB8fCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuXHRcdGV2ZW50cy5zZXQoa2V5LCBsaXN0ZW5lcnMpO1xuXHRcdGNvbnN0IF9vZmYgPSAoKSA9PiBvZmYobGlzdGVuZXIpO1xuXHRcdHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB2b2lkIDAgfHwgKF9zY29wZSRjbGVhbnVwcyA9IHNjb3BlLmNsZWFudXBzKSA9PT0gbnVsbCB8fCBfc2NvcGUkY2xlYW51cHMgPT09IHZvaWQgMCB8fCBfc2NvcGUkY2xlYW51cHMucHVzaChfb2ZmKTtcblx0XHRyZXR1cm4gX29mZjtcblx0fVxuXHRmdW5jdGlvbiBvbmNlKGxpc3RlbmVyKSB7XG5cdFx0ZnVuY3Rpb24gX2xpc3RlbmVyKC4uLmFyZ3MpIHtcblx0XHRcdG9mZihfbGlzdGVuZXIpO1xuXHRcdFx0bGlzdGVuZXIoLi4uYXJncyk7XG5cdFx0fVxuXHRcdHJldHVybiBvbihfbGlzdGVuZXIpO1xuXHR9XG5cdGZ1bmN0aW9uIG9mZihsaXN0ZW5lcikge1xuXHRcdGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50cy5nZXQoa2V5KTtcblx0XHRpZiAoIWxpc3RlbmVycykgcmV0dXJuO1xuXHRcdGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuXHRcdGlmICghbGlzdGVuZXJzLnNpemUpIHJlc2V0KCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cdFx0ZXZlbnRzLmRlbGV0ZShrZXkpO1xuXHR9XG5cdGZ1bmN0aW9uIGVtaXQoZXZlbnQsIHBheWxvYWQpIHtcblx0XHR2YXIgX2V2ZW50cyRnZXQ7XG5cdFx0KF9ldmVudHMkZ2V0ID0gZXZlbnRzLmdldChrZXkpKSA9PT0gbnVsbCB8fCBfZXZlbnRzJGdldCA9PT0gdm9pZCAwIHx8IF9ldmVudHMkZ2V0LmZvckVhY2goKHYpID0+IHYoZXZlbnQsIHBheWxvYWQpKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdG9uLFxuXHRcdG9uY2UsXG5cdFx0b2ZmLFxuXHRcdGVtaXQsXG5cdFx0cmVzZXRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRXZlbnRTb3VyY2UvaW5kZXgudHNcbmZ1bmN0aW9uIHJlc29sdmVOZXN0ZWRPcHRpb25zJDEob3B0aW9ucykge1xuXHRpZiAob3B0aW9ucyA9PT0gdHJ1ZSkgcmV0dXJuIHt9O1xuXHRyZXR1cm4gb3B0aW9ucztcbn1cbi8qKlxuKiBSZWFjdGl2ZSB3cmFwcGVyIGZvciBFdmVudFNvdXJjZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRXZlbnRTb3VyY2VcbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRTb3VyY2UvRXZlbnRTb3VyY2UgRXZlbnRTb3VyY2VcbiogQHBhcmFtIHVybFxuKiBAcGFyYW0gZXZlbnRzXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRXZlbnRTb3VyY2UodXJsLCBldmVudHMkMSA9IFtdLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgZXZlbnQgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBkYXRhID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3Qgc3RhdHVzID0gc2hhbGxvd1JlZihcIkNPTk5FQ1RJTkdcIik7XG5cdGNvbnN0IGV2ZW50U291cmNlID0gcmVmKG51bGwpO1xuXHRjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHVybFJlZiA9IHRvUmVmKHVybCk7XG5cdGNvbnN0IGxhc3RFdmVudElkID0gc2hhbGxvd1JlZihudWxsKTtcblx0bGV0IGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcblx0bGV0IHJldHJpZWQgPSAwO1xuXHRjb25zdCB7IHdpdGhDcmVkZW50aWFscyA9IGZhbHNlLCBpbW1lZGlhdGUgPSB0cnVlLCBhdXRvQ29ubmVjdCA9IHRydWUsIGF1dG9SZWNvbm5lY3QsIHNlcmlhbGl6ZXIgPSB7IHJlYWQ6ICh2KSA9PiB2IH0gfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNsb3NlID0gKCkgPT4ge1xuXHRcdGlmIChpc0NsaWVudCAmJiBldmVudFNvdXJjZS52YWx1ZSkge1xuXHRcdFx0ZXZlbnRTb3VyY2UudmFsdWUuY2xvc2UoKTtcblx0XHRcdGV2ZW50U291cmNlLnZhbHVlID0gbnVsbDtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwiQ0xPU0VEXCI7XG5cdFx0XHRleHBsaWNpdGx5Q2xvc2VkID0gdHJ1ZTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IF9pbml0ID0gKCkgPT4ge1xuXHRcdGlmIChleHBsaWNpdGx5Q2xvc2VkIHx8IHR5cGVvZiB1cmxSZWYudmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblx0XHRjb25zdCBlcyA9IG5ldyBFdmVudFNvdXJjZSh1cmxSZWYudmFsdWUsIHsgd2l0aENyZWRlbnRpYWxzIH0pO1xuXHRcdHN0YXR1cy52YWx1ZSA9IFwiQ09OTkVDVElOR1wiO1xuXHRcdGV2ZW50U291cmNlLnZhbHVlID0gZXM7XG5cdFx0ZXMub25vcGVuID0gKCkgPT4ge1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJPUEVOXCI7XG5cdFx0XHRlcnJvci52YWx1ZSA9IG51bGw7XG5cdFx0fTtcblx0XHRlcy5vbmVycm9yID0gKGUpID0+IHtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwiQ0xPU0VEXCI7XG5cdFx0XHRlcnJvci52YWx1ZSA9IGU7XG5cdFx0XHRpZiAoZXMucmVhZHlTdGF0ZSA9PT0gMiAmJiAhZXhwbGljaXRseUNsb3NlZCAmJiBhdXRvUmVjb25uZWN0KSB7XG5cdFx0XHRcdGVzLmNsb3NlKCk7XG5cdFx0XHRcdGNvbnN0IHsgcmV0cmllcyA9IC0xLCBkZWxheSA9IDFlMywgb25GYWlsZWQgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zJDEoYXV0b1JlY29ubmVjdCk7XG5cdFx0XHRcdHJldHJpZWQgKz0gMTtcblx0XHRcdFx0aWYgKHR5cGVvZiByZXRyaWVzID09PSBcIm51bWJlclwiICYmIChyZXRyaWVzIDwgMCB8fCByZXRyaWVkIDwgcmV0cmllcykpIHNldFRpbWVvdXQoX2luaXQsIGRlbGF5KTtcblx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIHJldHJpZXMgPT09IFwiZnVuY3Rpb25cIiAmJiByZXRyaWVzKCkpIHNldFRpbWVvdXQoX2luaXQsIGRlbGF5KTtcblx0XHRcdFx0ZWxzZSBvbkZhaWxlZCA9PT0gbnVsbCB8fCBvbkZhaWxlZCA9PT0gdm9pZCAwIHx8IG9uRmFpbGVkKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRlcy5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuXHRcdFx0dmFyIF9zZXJpYWxpemVyJHJlYWQ7XG5cdFx0XHRldmVudC52YWx1ZSA9IG51bGw7XG5cdFx0XHRkYXRhLnZhbHVlID0gKF9zZXJpYWxpemVyJHJlYWQgPSBzZXJpYWxpemVyLnJlYWQoZS5kYXRhKSkgIT09IG51bGwgJiYgX3NlcmlhbGl6ZXIkcmVhZCAhPT0gdm9pZCAwID8gX3NlcmlhbGl6ZXIkcmVhZCA6IG51bGw7XG5cdFx0XHRsYXN0RXZlbnRJZC52YWx1ZSA9IGUubGFzdEV2ZW50SWQ7XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IGV2ZW50X25hbWUgb2YgZXZlbnRzJDEpIHVzZUV2ZW50TGlzdGVuZXIoZXMsIGV2ZW50X25hbWUsIChlKSA9PiB7XG5cdFx0XHR2YXIgX3NlcmlhbGl6ZXIkcmVhZDIsIF9lJGxhc3RFdmVudElkO1xuXHRcdFx0ZXZlbnQudmFsdWUgPSBldmVudF9uYW1lO1xuXHRcdFx0ZGF0YS52YWx1ZSA9IChfc2VyaWFsaXplciRyZWFkMiA9IHNlcmlhbGl6ZXIucmVhZChlLmRhdGEpKSAhPT0gbnVsbCAmJiBfc2VyaWFsaXplciRyZWFkMiAhPT0gdm9pZCAwID8gX3NlcmlhbGl6ZXIkcmVhZDIgOiBudWxsO1xuXHRcdFx0bGFzdEV2ZW50SWQudmFsdWUgPSAoX2UkbGFzdEV2ZW50SWQgPSBlLmxhc3RFdmVudElkKSAhPT0gbnVsbCAmJiBfZSRsYXN0RXZlbnRJZCAhPT0gdm9pZCAwID8gX2UkbGFzdEV2ZW50SWQgOiBudWxsO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fTtcblx0Y29uc3Qgb3BlbiA9ICgpID0+IHtcblx0XHRpZiAoIWlzQ2xpZW50KSByZXR1cm47XG5cdFx0Y2xvc2UoKTtcblx0XHRleHBsaWNpdGx5Q2xvc2VkID0gZmFsc2U7XG5cdFx0cmV0cmllZCA9IDA7XG5cdFx0X2luaXQoKTtcblx0fTtcblx0aWYgKGltbWVkaWF0ZSkgb3BlbigpO1xuXHRpZiAoYXV0b0Nvbm5lY3QpIHdhdGNoKHVybFJlZiwgb3Blbik7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKGNsb3NlKTtcblx0cmV0dXJuIHtcblx0XHRldmVudFNvdXJjZSxcblx0XHRldmVudCxcblx0XHRkYXRhLFxuXHRcdHN0YXR1cyxcblx0XHRlcnJvcixcblx0XHRvcGVuLFxuXHRcdGNsb3NlLFxuXHRcdGxhc3RFdmVudElkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUV5ZURyb3BwZXIvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBbRXllRHJvcHBlciBBUEldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FeWVEcm9wcGVyX0FQSSlcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRXllRHJvcHBlclxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUV5ZURyb3BwZXIob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFZhbHVlID0gXCJcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgXCJFeWVEcm9wcGVyXCIgaW4gd2luZG93KTtcblx0Y29uc3Qgc1JHQkhleCA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0YXN5bmMgZnVuY3Rpb24gb3BlbihvcGVuT3B0aW9ucykge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBuZXcgd2luZG93LkV5ZURyb3BwZXIoKS5vcGVuKG9wZW5PcHRpb25zKTtcblx0XHRzUkdCSGV4LnZhbHVlID0gcmVzdWx0LnNSR0JIZXg7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHNSR0JIZXgsXG5cdFx0b3BlblxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGYXZpY29uL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VGYXZpY29uKG5ld0ljb24gPSBudWxsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBiYXNlVXJsID0gXCJcIiwgcmVsID0gXCJpY29uXCIsIGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBmYXZpY29uID0gdG9SZWYobmV3SWNvbik7XG5cdGNvbnN0IGFwcGx5SWNvbiA9IChpY29uKSA9PiB7XG5cdFx0Y29uc3QgZWxlbWVudHMgPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuaGVhZC5xdWVyeVNlbGVjdG9yQWxsKGBsaW5rW3JlbCo9XCIke3JlbH1cIl1gKTtcblx0XHRpZiAoIWVsZW1lbnRzIHx8IGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29uc3QgbGluayA9IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcblx0XHRcdGlmIChsaW5rKSB7XG5cdFx0XHRcdGxpbmsucmVsID0gcmVsO1xuXHRcdFx0XHRsaW5rLmhyZWYgPSBgJHtiYXNlVXJsfSR7aWNvbn1gO1xuXHRcdFx0XHRsaW5rLnR5cGUgPSBgaW1hZ2UvJHtpY29uLnNwbGl0KFwiLlwiKS5wb3AoKX1gO1xuXHRcdFx0XHRkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCB8fCBkb2N1bWVudCQxLmhlYWQuYXBwZW5kKGxpbmspO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbGVtZW50cyA9PT0gbnVsbCB8fCBlbGVtZW50cyA9PT0gdm9pZCAwIHx8IGVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiBlbC5ocmVmID0gYCR7YmFzZVVybH0ke2ljb259YCk7XG5cdH07XG5cdHdhdGNoKGZhdmljb24sIChpLCBvKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpID09PSBcInN0cmluZ1wiICYmIGkgIT09IG8pIGFwcGx5SWNvbihpKTtcblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHJldHVybiBmYXZpY29uO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGZXRjaC9pbmRleC50c1xuY29uc3QgcGF5bG9hZE1hcHBpbmcgPSB7XG5cdGpzb246IFwiYXBwbGljYXRpb24vanNvblwiLFxuXHR0ZXh0OiBcInRleHQvcGxhaW5cIlxufTtcbi8qKlxuKiAhISFJTVBPUlRBTlQhISFcbipcbiogSWYgeW91IHVwZGF0ZSB0aGUgVXNlRmV0Y2hPcHRpb25zIGludGVyZmFjZSwgYmUgc3VyZSB0byB1cGRhdGUgdGhpcyBvYmplY3RcbiogdG8gaW5jbHVkZSB0aGUgbmV3IG9wdGlvbnNcbiovXG5mdW5jdGlvbiBpc0ZldGNoT3B0aW9ucyhvYmopIHtcblx0cmV0dXJuIG9iaiAmJiBjb250YWluc1Byb3Aob2JqLCBcImltbWVkaWF0ZVwiLCBcInJlZmV0Y2hcIiwgXCJpbml0aWFsRGF0YVwiLCBcInRpbWVvdXRcIiwgXCJiZWZvcmVGZXRjaFwiLCBcImFmdGVyRmV0Y2hcIiwgXCJvbkZldGNoRXJyb3JcIiwgXCJmZXRjaFwiLCBcInVwZGF0ZURhdGFPbkVycm9yXCIpO1xufVxuY29uc3QgcmVBYnNvbHV0ZSA9IC9eKD86W2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pO1xuZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcblx0cmV0dXJuIHJlQWJzb2x1dGUudGVzdCh1cmwpO1xufVxuZnVuY3Rpb24gaGVhZGVyc1RvT2JqZWN0KGhlYWRlcnMpIHtcblx0aWYgKHR5cGVvZiBIZWFkZXJzICE9PSBcInVuZGVmaW5lZFwiICYmIGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGhlYWRlcnMuZW50cmllcygpKTtcblx0cmV0dXJuIGhlYWRlcnM7XG59XG5mdW5jdGlvbiBjb21iaW5lQ2FsbGJhY2tzKGNvbWJpbmF0aW9uLCAuLi5jYWxsYmFja3MpIHtcblx0aWYgKGNvbWJpbmF0aW9uID09PSBcIm92ZXJ3cml0ZVwiKSByZXR1cm4gYXN5bmMgKGN0eCkgPT4ge1xuXHRcdGxldCBjYWxsYmFjaztcblx0XHRmb3IgKGxldCBpID0gY2FsbGJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoY2FsbGJhY2tzW2ldICE9IG51bGwpIHtcblx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2tzW2ldO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmIChjYWxsYmFjaykgcmV0dXJuIHtcblx0XHRcdC4uLmN0eCxcblx0XHRcdC4uLmF3YWl0IGNhbGxiYWNrKGN0eClcblx0XHR9O1xuXHRcdHJldHVybiBjdHg7XG5cdH07XG5cdGVsc2UgcmV0dXJuIGFzeW5jIChjdHgpID0+IHtcblx0XHRmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykgaWYgKGNhbGxiYWNrKSBjdHggPSB7XG5cdFx0XHQuLi5jdHgsXG5cdFx0XHQuLi5hd2FpdCBjYWxsYmFjayhjdHgpXG5cdFx0fTtcblx0XHRyZXR1cm4gY3R4O1xuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlRmV0Y2goY29uZmlnID0ge30pIHtcblx0Y29uc3QgX2NvbWJpbmF0aW9uID0gY29uZmlnLmNvbWJpbmF0aW9uIHx8IFwiY2hhaW5cIjtcblx0Y29uc3QgX29wdGlvbnMgPSBjb25maWcub3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgX2ZldGNoT3B0aW9ucyA9IGNvbmZpZy5mZXRjaE9wdGlvbnMgfHwge307XG5cdGZ1bmN0aW9uIHVzZUZhY3RvcnlGZXRjaCh1cmwsIC4uLmFyZ3MpIHtcblx0XHRjb25zdCBjb21wdXRlZFVybCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdGNvbnN0IGJhc2VVcmwgPSB0b1ZhbHVlKGNvbmZpZy5iYXNlVXJsKTtcblx0XHRcdGNvbnN0IHRhcmdldFVybCA9IHRvVmFsdWUodXJsKTtcblx0XHRcdHJldHVybiBiYXNlVXJsICYmICFpc0Fic29sdXRlVVJMKHRhcmdldFVybCkgPyBqb2luUGF0aHMoYmFzZVVybCwgdGFyZ2V0VXJsKSA6IHRhcmdldFVybDtcblx0XHR9KTtcblx0XHRsZXQgb3B0aW9ucyA9IF9vcHRpb25zO1xuXHRcdGxldCBmZXRjaE9wdGlvbnMgPSBfZmV0Y2hPcHRpb25zO1xuXHRcdGlmIChhcmdzLmxlbmd0aCA+IDApIGlmIChpc0ZldGNoT3B0aW9ucyhhcmdzWzBdKSkgb3B0aW9ucyA9IHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5hcmdzWzBdLFxuXHRcdFx0YmVmb3JlRmV0Y2g6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5iZWZvcmVGZXRjaCwgYXJnc1swXS5iZWZvcmVGZXRjaCksXG5cdFx0XHRhZnRlckZldGNoOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMuYWZ0ZXJGZXRjaCwgYXJnc1swXS5hZnRlckZldGNoKSxcblx0XHRcdG9uRmV0Y2hFcnJvcjogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLm9uRmV0Y2hFcnJvciwgYXJnc1swXS5vbkZldGNoRXJyb3IpXG5cdFx0fTtcblx0XHRlbHNlIGZldGNoT3B0aW9ucyA9IHtcblx0XHRcdC4uLmZldGNoT3B0aW9ucyxcblx0XHRcdC4uLmFyZ3NbMF0sXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdC4uLmhlYWRlcnNUb09iamVjdChmZXRjaE9wdGlvbnMuaGVhZGVycykgfHwge30sXG5cdFx0XHRcdC4uLmhlYWRlcnNUb09iamVjdChhcmdzWzBdLmhlYWRlcnMpIHx8IHt9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpZiAoYXJncy5sZW5ndGggPiAxICYmIGlzRmV0Y2hPcHRpb25zKGFyZ3NbMV0pKSBvcHRpb25zID0ge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLmFyZ3NbMV0sXG5cdFx0XHRiZWZvcmVGZXRjaDogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLmJlZm9yZUZldGNoLCBhcmdzWzFdLmJlZm9yZUZldGNoKSxcblx0XHRcdGFmdGVyRmV0Y2g6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5hZnRlckZldGNoLCBhcmdzWzFdLmFmdGVyRmV0Y2gpLFxuXHRcdFx0b25GZXRjaEVycm9yOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMub25GZXRjaEVycm9yLCBhcmdzWzFdLm9uRmV0Y2hFcnJvcilcblx0XHR9O1xuXHRcdHJldHVybiB1c2VGZXRjaChjb21wdXRlZFVybCwgZmV0Y2hPcHRpb25zLCBvcHRpb25zKTtcblx0fVxuXHRyZXR1cm4gdXNlRmFjdG9yeUZldGNoO1xufVxuZnVuY3Rpb24gdXNlRmV0Y2godXJsLCAuLi5hcmdzKSB7XG5cdHZhciBfZGVmYXVsdFdpbmRvdyRmZXRjaCwgX2dsb2JhbFRoaXM7XG5cdGNvbnN0IHN1cHBvcnRzQWJvcnQgPSB0eXBlb2YgQWJvcnRDb250cm9sbGVyID09PSBcImZ1bmN0aW9uXCI7XG5cdGxldCBmZXRjaE9wdGlvbnMgPSB7fTtcblx0bGV0IG9wdGlvbnMgPSB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdHJlZmV0Y2g6IGZhbHNlLFxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0dXBkYXRlRGF0YU9uRXJyb3I6IGZhbHNlXG5cdH07XG5cdGNvbnN0IGNvbmZpZyA9IHtcblx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0cGF5bG9hZDogdm9pZCAwXG5cdH07XG5cdGlmIChhcmdzLmxlbmd0aCA+IDApIGlmIChpc0ZldGNoT3B0aW9ucyhhcmdzWzBdKSkgb3B0aW9ucyA9IHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdC4uLmFyZ3NbMF1cblx0fTtcblx0ZWxzZSBmZXRjaE9wdGlvbnMgPSBhcmdzWzBdO1xuXHRpZiAoYXJncy5sZW5ndGggPiAxKSB7XG5cdFx0aWYgKGlzRmV0Y2hPcHRpb25zKGFyZ3NbMV0pKSBvcHRpb25zID0ge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLmFyZ3NbMV1cblx0XHR9O1xuXHR9XG5cdGNvbnN0IHsgZmV0Y2ggPSAoX2RlZmF1bHRXaW5kb3ckZmV0Y2ggPSBkZWZhdWx0V2luZG93ID09PSBudWxsIHx8IGRlZmF1bHRXaW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlZmF1bHRXaW5kb3cuZmV0Y2gpICE9PSBudWxsICYmIF9kZWZhdWx0V2luZG93JGZldGNoICE9PSB2b2lkIDAgPyBfZGVmYXVsdFdpbmRvdyRmZXRjaCA6IChfZ2xvYmFsVGhpcyA9IGdsb2JhbFRoaXMpID09PSBudWxsIHx8IF9nbG9iYWxUaGlzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZ2xvYmFsVGhpcy5mZXRjaCwgaW5pdGlhbERhdGEsIHRpbWVvdXQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJlc3BvbnNlRXZlbnQgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgZXJyb3JFdmVudCA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBmaW5hbGx5RXZlbnQgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgaXNGaW5pc2hlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBpc0ZldGNoaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGFib3J0ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgc3RhdHVzQ29kZSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHJlc3BvbnNlID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBkYXRhID0gc2hhbGxvd1JlZihpbml0aWFsRGF0YSB8fCBudWxsKTtcblx0Y29uc3QgY2FuQWJvcnQgPSBjb21wdXRlZCgoKSA9PiBzdXBwb3J0c0Fib3J0ICYmIGlzRmV0Y2hpbmcudmFsdWUpO1xuXHRsZXQgY29udHJvbGxlcjtcblx0bGV0IHRpbWVyO1xuXHRjb25zdCBhYm9ydCA9IChyZWFzb24pID0+IHtcblx0XHRpZiAoc3VwcG9ydHNBYm9ydCkge1xuXHRcdFx0Y29udHJvbGxlciA9PT0gbnVsbCB8fCBjb250cm9sbGVyID09PSB2b2lkIDAgfHwgY29udHJvbGxlci5hYm9ydChyZWFzb24pO1xuXHRcdFx0Y29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblx0XHRcdGNvbnRyb2xsZXIuc2lnbmFsLm9uYWJvcnQgPSAoKSA9PiBhYm9ydGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGZldGNoT3B0aW9ucyA9IHtcblx0XHRcdFx0Li4uZmV0Y2hPcHRpb25zLFxuXHRcdFx0XHRzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblx0Y29uc3QgbG9hZGluZyA9IChpc0xvYWRpbmcpID0+IHtcblx0XHRpc0ZldGNoaW5nLnZhbHVlID0gaXNMb2FkaW5nO1xuXHRcdGlzRmluaXNoZWQudmFsdWUgPSAhaXNMb2FkaW5nO1xuXHR9O1xuXHRpZiAodGltZW91dCkgdGltZXIgPSB1c2VUaW1lb3V0Rm4oYWJvcnQsIHRpbWVvdXQsIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcblx0bGV0IGV4ZWN1dGVDb3VudGVyID0gMDtcblx0Y29uc3QgZXhlY3V0ZSA9IGFzeW5jICh0aHJvd09uRmFpbGVkID0gZmFsc2UpID0+IHtcblx0XHR2YXIgX2NvbnRleHQkb3B0aW9ucztcblx0XHRhYm9ydCgpO1xuXHRcdGxvYWRpbmcodHJ1ZSk7XG5cdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdHN0YXR1c0NvZGUudmFsdWUgPSBudWxsO1xuXHRcdGFib3J0ZWQudmFsdWUgPSBmYWxzZTtcblx0XHRleGVjdXRlQ291bnRlciArPSAxO1xuXHRcdGNvbnN0IGN1cnJlbnRFeGVjdXRlQ291bnRlciA9IGV4ZWN1dGVDb3VudGVyO1xuXHRcdGNvbnN0IGRlZmF1bHRGZXRjaE9wdGlvbnMgPSB7XG5cdFx0XHRtZXRob2Q6IGNvbmZpZy5tZXRob2QsXG5cdFx0XHRoZWFkZXJzOiB7fVxuXHRcdH07XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHRvVmFsdWUoY29uZmlnLnBheWxvYWQpO1xuXHRcdGlmIChwYXlsb2FkKSB7XG5cdFx0XHR2YXIgX3BheWxvYWRNYXBwaW5nJGNvbmZpO1xuXHRcdFx0Y29uc3QgaGVhZGVycyA9IGhlYWRlcnNUb09iamVjdChkZWZhdWx0RmV0Y2hPcHRpb25zLmhlYWRlcnMpO1xuXHRcdFx0Y29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGF5bG9hZCk7XG5cdFx0XHRpZiAoIWNvbmZpZy5wYXlsb2FkVHlwZSAmJiBwYXlsb2FkICYmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBBcnJheS5pc0FycmF5KHByb3RvKSkgJiYgIShwYXlsb2FkIGluc3RhbmNlb2YgRm9ybURhdGEpKSBjb25maWcucGF5bG9hZFR5cGUgPSBcImpzb25cIjtcblx0XHRcdGlmIChjb25maWcucGF5bG9hZFR5cGUpIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSAoX3BheWxvYWRNYXBwaW5nJGNvbmZpID0gcGF5bG9hZE1hcHBpbmdbY29uZmlnLnBheWxvYWRUeXBlXSkgIT09IG51bGwgJiYgX3BheWxvYWRNYXBwaW5nJGNvbmZpICE9PSB2b2lkIDAgPyBfcGF5bG9hZE1hcHBpbmckY29uZmkgOiBjb25maWcucGF5bG9hZFR5cGU7XG5cdFx0XHRkZWZhdWx0RmV0Y2hPcHRpb25zLmJvZHkgPSBjb25maWcucGF5bG9hZFR5cGUgPT09IFwianNvblwiID8gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkgOiBwYXlsb2FkO1xuXHRcdH1cblx0XHRsZXQgaXNDYW5jZWxlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNvbnRleHQgPSB7XG5cdFx0XHR1cmw6IHRvVmFsdWUodXJsKSxcblx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0Li4uZGVmYXVsdEZldGNoT3B0aW9ucyxcblx0XHRcdFx0Li4uZmV0Y2hPcHRpb25zXG5cdFx0XHR9LFxuXHRcdFx0Y2FuY2VsOiAoKSA9PiB7XG5cdFx0XHRcdGlzQ2FuY2VsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0aWYgKG9wdGlvbnMuYmVmb3JlRmV0Y2gpIE9iamVjdC5hc3NpZ24oY29udGV4dCwgYXdhaXQgb3B0aW9ucy5iZWZvcmVGZXRjaChjb250ZXh0KSk7XG5cdFx0aWYgKGlzQ2FuY2VsZWQgfHwgIWZldGNoKSB7XG5cdFx0XHRsb2FkaW5nKGZhbHNlKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXHRcdGxldCByZXNwb25zZURhdGEgPSBudWxsO1xuXHRcdGlmICh0aW1lcikgdGltZXIuc3RhcnQoKTtcblx0XHRyZXR1cm4gZmV0Y2goY29udGV4dC51cmwsIHtcblx0XHRcdC4uLmRlZmF1bHRGZXRjaE9wdGlvbnMsXG5cdFx0XHQuLi5jb250ZXh0Lm9wdGlvbnMsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdC4uLmhlYWRlcnNUb09iamVjdChkZWZhdWx0RmV0Y2hPcHRpb25zLmhlYWRlcnMpLFxuXHRcdFx0XHQuLi5oZWFkZXJzVG9PYmplY3QoKF9jb250ZXh0JG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnMpID09PSBudWxsIHx8IF9jb250ZXh0JG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jb250ZXh0JG9wdGlvbnMuaGVhZGVycylcblx0XHRcdH1cblx0XHR9KS50aGVuKGFzeW5jIChmZXRjaFJlc3BvbnNlKSA9PiB7XG5cdFx0XHRyZXNwb25zZS52YWx1ZSA9IGZldGNoUmVzcG9uc2U7XG5cdFx0XHRzdGF0dXNDb2RlLnZhbHVlID0gZmV0Y2hSZXNwb25zZS5zdGF0dXM7XG5cdFx0XHRyZXNwb25zZURhdGEgPSBhd2FpdCBmZXRjaFJlc3BvbnNlLmNsb25lKClbY29uZmlnLnR5cGVdKCk7XG5cdFx0XHRpZiAoIWZldGNoUmVzcG9uc2Uub2spIHtcblx0XHRcdFx0ZGF0YS52YWx1ZSA9IGluaXRpYWxEYXRhIHx8IG51bGw7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihmZXRjaFJlc3BvbnNlLnN0YXR1c1RleHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9wdGlvbnMuYWZ0ZXJGZXRjaCkgKHtkYXRhOiByZXNwb25zZURhdGF9ID0gYXdhaXQgb3B0aW9ucy5hZnRlckZldGNoKHtcblx0XHRcdFx0ZGF0YTogcmVzcG9uc2VEYXRhLFxuXHRcdFx0XHRyZXNwb25zZTogZmV0Y2hSZXNwb25zZSxcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0ZXhlY3V0ZVxuXHRcdFx0fSkpO1xuXHRcdFx0ZGF0YS52YWx1ZSA9IHJlc3BvbnNlRGF0YTtcblx0XHRcdHJlc3BvbnNlRXZlbnQudHJpZ2dlcihmZXRjaFJlc3BvbnNlKTtcblx0XHRcdHJldHVybiBmZXRjaFJlc3BvbnNlO1xuXHRcdH0pLmNhdGNoKGFzeW5jIChmZXRjaEVycm9yKSA9PiB7XG5cdFx0XHRsZXQgZXJyb3JEYXRhID0gZmV0Y2hFcnJvci5tZXNzYWdlIHx8IGZldGNoRXJyb3IubmFtZTtcblx0XHRcdGlmIChvcHRpb25zLm9uRmV0Y2hFcnJvcikgKHtlcnJvcjogZXJyb3JEYXRhLCBkYXRhOiByZXNwb25zZURhdGF9ID0gYXdhaXQgb3B0aW9ucy5vbkZldGNoRXJyb3Ioe1xuXHRcdFx0XHRkYXRhOiByZXNwb25zZURhdGEsXG5cdFx0XHRcdGVycm9yOiBmZXRjaEVycm9yLFxuXHRcdFx0XHRyZXNwb25zZTogcmVzcG9uc2UudmFsdWUsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdGV4ZWN1dGVcblx0XHRcdH0pKTtcblx0XHRcdGVycm9yLnZhbHVlID0gZXJyb3JEYXRhO1xuXHRcdFx0aWYgKG9wdGlvbnMudXBkYXRlRGF0YU9uRXJyb3IpIGRhdGEudmFsdWUgPSByZXNwb25zZURhdGE7XG5cdFx0XHRlcnJvckV2ZW50LnRyaWdnZXIoZmV0Y2hFcnJvcik7XG5cdFx0XHRpZiAodGhyb3dPbkZhaWxlZCkgdGhyb3cgZmV0Y2hFcnJvcjtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0pLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0aWYgKGN1cnJlbnRFeGVjdXRlQ291bnRlciA9PT0gZXhlY3V0ZUNvdW50ZXIpIGxvYWRpbmcoZmFsc2UpO1xuXHRcdFx0aWYgKHRpbWVyKSB0aW1lci5zdG9wKCk7XG5cdFx0XHRmaW5hbGx5RXZlbnQudHJpZ2dlcihudWxsKTtcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgcmVmZXRjaCA9IHRvUmVmKG9wdGlvbnMucmVmZXRjaCk7XG5cdHdhdGNoKFtyZWZldGNoLCB0b1JlZih1cmwpXSwgKFtyZWZldGNoJDFdKSA9PiByZWZldGNoJDEgJiYgZXhlY3V0ZSgpLCB7IGRlZXA6IHRydWUgfSk7XG5cdGNvbnN0IHNoZWxsID0ge1xuXHRcdGlzRmluaXNoZWQ6IHJlYWRvbmx5KGlzRmluaXNoZWQpLFxuXHRcdGlzRmV0Y2hpbmc6IHJlYWRvbmx5KGlzRmV0Y2hpbmcpLFxuXHRcdHN0YXR1c0NvZGUsXG5cdFx0cmVzcG9uc2UsXG5cdFx0ZXJyb3IsXG5cdFx0ZGF0YSxcblx0XHRjYW5BYm9ydCxcblx0XHRhYm9ydGVkLFxuXHRcdGFib3J0LFxuXHRcdGV4ZWN1dGUsXG5cdFx0b25GZXRjaFJlc3BvbnNlOiByZXNwb25zZUV2ZW50Lm9uLFxuXHRcdG9uRmV0Y2hFcnJvcjogZXJyb3JFdmVudC5vbixcblx0XHRvbkZldGNoRmluYWxseTogZmluYWxseUV2ZW50Lm9uLFxuXHRcdGdldDogc2V0TWV0aG9kKFwiR0VUXCIpLFxuXHRcdHB1dDogc2V0TWV0aG9kKFwiUFVUXCIpLFxuXHRcdHBvc3Q6IHNldE1ldGhvZChcIlBPU1RcIiksXG5cdFx0ZGVsZXRlOiBzZXRNZXRob2QoXCJERUxFVEVcIiksXG5cdFx0cGF0Y2g6IHNldE1ldGhvZChcIlBBVENIXCIpLFxuXHRcdGhlYWQ6IHNldE1ldGhvZChcIkhFQURcIiksXG5cdFx0b3B0aW9uczogc2V0TWV0aG9kKFwiT1BUSU9OU1wiKSxcblx0XHRqc29uOiBzZXRUeXBlKFwianNvblwiKSxcblx0XHR0ZXh0OiBzZXRUeXBlKFwidGV4dFwiKSxcblx0XHRibG9iOiBzZXRUeXBlKFwiYmxvYlwiKSxcblx0XHRhcnJheUJ1ZmZlcjogc2V0VHlwZShcImFycmF5QnVmZmVyXCIpLFxuXHRcdGZvcm1EYXRhOiBzZXRUeXBlKFwiZm9ybURhdGFcIilcblx0fTtcblx0ZnVuY3Rpb24gc2V0TWV0aG9kKG1ldGhvZCkge1xuXHRcdHJldHVybiAocGF5bG9hZCwgcGF5bG9hZFR5cGUpID0+IHtcblx0XHRcdGlmICghaXNGZXRjaGluZy52YWx1ZSkge1xuXHRcdFx0XHRjb25maWcubWV0aG9kID0gbWV0aG9kO1xuXHRcdFx0XHRjb25maWcucGF5bG9hZCA9IHBheWxvYWQ7XG5cdFx0XHRcdGNvbmZpZy5wYXlsb2FkVHlwZSA9IHBheWxvYWRUeXBlO1xuXHRcdFx0XHRpZiAoaXNSZWYoY29uZmlnLnBheWxvYWQpKSB3YXRjaChbcmVmZXRjaCwgdG9SZWYoY29uZmlnLnBheWxvYWQpXSwgKFtyZWZldGNoJDFdKSA9PiByZWZldGNoJDEgJiYgZXhlY3V0ZSgpLCB7IGRlZXA6IHRydWUgfSk7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0Li4uc2hlbGwsXG5cdFx0XHRcdFx0dGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHdhaXRVbnRpbEZpbmlzaGVkKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0ZnVuY3Rpb24gd2FpdFVudGlsRmluaXNoZWQoKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHVudGlsKGlzRmluaXNoZWQpLnRvQmUodHJ1ZSkudGhlbigoKSA9PiByZXNvbHZlKHNoZWxsKSkuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fVxuXHRmdW5jdGlvbiBzZXRUeXBlKHR5cGUpIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0aWYgKCFpc0ZldGNoaW5nLnZhbHVlKSB7XG5cdFx0XHRcdGNvbmZpZy50eXBlID0gdHlwZTtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHQuLi5zaGVsbCxcblx0XHRcdFx0XHR0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gd2FpdFVudGlsRmluaXNoZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRpZiAob3B0aW9ucy5pbW1lZGlhdGUpIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gZXhlY3V0ZSgpKTtcblx0cmV0dXJuIHtcblx0XHQuLi5zaGVsbCxcblx0XHR0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdFx0XHRyZXR1cm4gd2FpdFVudGlsRmluaXNoZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0XHR9XG5cdH07XG59XG5mdW5jdGlvbiBqb2luUGF0aHMoc3RhcnQsIGVuZCkge1xuXHRpZiAoIXN0YXJ0LmVuZHNXaXRoKFwiL1wiKSAmJiAhZW5kLnN0YXJ0c1dpdGgoXCIvXCIpKSByZXR1cm4gYCR7c3RhcnR9LyR7ZW5kfWA7XG5cdGlmIChzdGFydC5lbmRzV2l0aChcIi9cIikgJiYgZW5kLnN0YXJ0c1dpdGgoXCIvXCIpKSByZXR1cm4gYCR7c3RhcnQuc2xpY2UoMCwgLTEpfSR7ZW5kfWA7XG5cdHJldHVybiBgJHtzdGFydH0ke2VuZH1gO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGaWxlRGlhbG9nL2luZGV4LnRzXG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG5cdG11bHRpcGxlOiB0cnVlLFxuXHRhY2NlcHQ6IFwiKlwiLFxuXHRyZXNldDogZmFsc2UsXG5cdGRpcmVjdG9yeTogZmFsc2Vcbn07XG5mdW5jdGlvbiBwcmVwYXJlSW5pdGlhbEZpbGVzKGZpbGVzKSB7XG5cdGlmICghZmlsZXMpIHJldHVybiBudWxsO1xuXHRpZiAoZmlsZXMgaW5zdGFuY2VvZiBGaWxlTGlzdCkgcmV0dXJuIGZpbGVzO1xuXHRjb25zdCBkdCA9IG5ldyBEYXRhVHJhbnNmZXIoKTtcblx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSBkdC5pdGVtcy5hZGQoZmlsZSk7XG5cdHJldHVybiBkdC5maWxlcztcbn1cbi8qKlxuKiBPcGVuIGZpbGUgZGlhbG9nIHdpdGggZWFzZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRmlsZURpYWxvZ1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUZpbGVEaWFsb2cob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGZpbGVzID0gcmVmKHByZXBhcmVJbml0aWFsRmlsZXMob3B0aW9ucy5pbml0aWFsRmlsZXMpKTtcblx0Y29uc3QgeyBvbjogb25DaGFuZ2UsIHRyaWdnZXI6IGNoYW5nZVRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCB7IG9uOiBvbkNhbmNlbCwgdHJpZ2dlcjogY2FuY2VsVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IGlucHV0UmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfdW5yZWZFbGVtZW50O1xuXHRcdGNvbnN0IGlucHV0ID0gKF91bnJlZkVsZW1lbnQgPSB1bnJlZkVsZW1lbnQob3B0aW9ucy5pbnB1dCkpICE9PSBudWxsICYmIF91bnJlZkVsZW1lbnQgIT09IHZvaWQgMCA/IF91bnJlZkVsZW1lbnQgOiBkb2N1bWVudCQxID8gZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikgOiB2b2lkIDA7XG5cdFx0aWYgKGlucHV0KSB7XG5cdFx0XHRpbnB1dC50eXBlID0gXCJmaWxlXCI7XG5cdFx0XHRpbnB1dC5vbmNoYW5nZSA9IChldmVudCkgPT4ge1xuXHRcdFx0XHRmaWxlcy52YWx1ZSA9IGV2ZW50LnRhcmdldC5maWxlcztcblx0XHRcdFx0Y2hhbmdlVHJpZ2dlcihmaWxlcy52YWx1ZSk7XG5cdFx0XHR9O1xuXHRcdFx0aW5wdXQub25jYW5jZWwgPSAoKSA9PiB7XG5cdFx0XHRcdGNhbmNlbFRyaWdnZXIoKTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiBpbnB1dDtcblx0fSk7XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdGZpbGVzLnZhbHVlID0gbnVsbDtcblx0XHRpZiAoaW5wdXRSZWYudmFsdWUgJiYgaW5wdXRSZWYudmFsdWUudmFsdWUpIHtcblx0XHRcdGlucHV0UmVmLnZhbHVlLnZhbHVlID0gXCJcIjtcblx0XHRcdGNoYW5nZVRyaWdnZXIobnVsbCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBhcHBseU9wdGlvbnMgPSAob3B0aW9ucyQxKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSBpbnB1dFJlZi52YWx1ZTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwubXVsdGlwbGUgPSB0b1ZhbHVlKG9wdGlvbnMkMS5tdWx0aXBsZSk7XG5cdFx0ZWwuYWNjZXB0ID0gdG9WYWx1ZShvcHRpb25zJDEuYWNjZXB0KTtcblx0XHRlbC53ZWJraXRkaXJlY3RvcnkgPSB0b1ZhbHVlKG9wdGlvbnMkMS5kaXJlY3RvcnkpO1xuXHRcdGlmIChoYXNPd24ob3B0aW9ucyQxLCBcImNhcHR1cmVcIikpIGVsLmNhcHR1cmUgPSB0b1ZhbHVlKG9wdGlvbnMkMS5jYXB0dXJlKTtcblx0fTtcblx0Y29uc3Qgb3BlbiA9IChsb2NhbE9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBlbCA9IGlucHV0UmVmLnZhbHVlO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRjb25zdCBtZXJnZWRPcHRpb25zID0ge1xuXHRcdFx0Li4uREVGQVVMVF9PUFRJT05TLFxuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLmxvY2FsT3B0aW9uc1xuXHRcdH07XG5cdFx0YXBwbHlPcHRpb25zKG1lcmdlZE9wdGlvbnMpO1xuXHRcdGlmICh0b1ZhbHVlKG1lcmdlZE9wdGlvbnMucmVzZXQpKSByZXNldCgpO1xuXHRcdGVsLmNsaWNrKCk7XG5cdH07XG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRhcHBseU9wdGlvbnMob3B0aW9ucyk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGZpbGVzOiByZWFkb25seShmaWxlcyksXG5cdFx0b3Blbixcblx0XHRyZXNldCxcblx0XHRvbkNhbmNlbCxcblx0XHRvbkNoYW5nZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGaWxlU3lzdGVtQWNjZXNzL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VGaWxlU3lzdGVtQWNjZXNzKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogX3dpbmRvdyA9IGRlZmF1bHRXaW5kb3csIGRhdGFUeXBlID0gXCJUZXh0XCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHdpbmRvdyQxID0gX3dpbmRvdztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwic2hvd1NhdmVGaWxlUGlja2VyXCIgaW4gd2luZG93JDEgJiYgXCJzaG93T3BlbkZpbGVQaWNrZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGNvbnN0IGZpbGVIYW5kbGUgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGRhdGEgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGZpbGUgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGZpbGVOYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfZmlsZSR2YWx1ZSRuYW1lLCBfZmlsZSR2YWx1ZTtcblx0XHRyZXR1cm4gKF9maWxlJHZhbHVlJG5hbWUgPSAoX2ZpbGUkdmFsdWUgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWUubmFtZSkgIT09IG51bGwgJiYgX2ZpbGUkdmFsdWUkbmFtZSAhPT0gdm9pZCAwID8gX2ZpbGUkdmFsdWUkbmFtZSA6IFwiXCI7XG5cdH0pO1xuXHRjb25zdCBmaWxlTUlNRSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX2ZpbGUkdmFsdWUkdHlwZSwgX2ZpbGUkdmFsdWUyO1xuXHRcdHJldHVybiAoX2ZpbGUkdmFsdWUkdHlwZSA9IChfZmlsZSR2YWx1ZTIgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlMi50eXBlKSAhPT0gbnVsbCAmJiBfZmlsZSR2YWx1ZSR0eXBlICE9PSB2b2lkIDAgPyBfZmlsZSR2YWx1ZSR0eXBlIDogXCJcIjtcblx0fSk7XG5cdGNvbnN0IGZpbGVTaXplID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfZmlsZSR2YWx1ZSRzaXplLCBfZmlsZSR2YWx1ZTM7XG5cdFx0cmV0dXJuIChfZmlsZSR2YWx1ZSRzaXplID0gKF9maWxlJHZhbHVlMyA9IGZpbGUudmFsdWUpID09PSBudWxsIHx8IF9maWxlJHZhbHVlMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWUzLnNpemUpICE9PSBudWxsICYmIF9maWxlJHZhbHVlJHNpemUgIT09IHZvaWQgMCA/IF9maWxlJHZhbHVlJHNpemUgOiAwO1xuXHR9KTtcblx0Y29uc3QgZmlsZUxhc3RNb2RpZmllZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX2ZpbGUkdmFsdWUkbGFzdE1vZGlmLCBfZmlsZSR2YWx1ZTQ7XG5cdFx0cmV0dXJuIChfZmlsZSR2YWx1ZSRsYXN0TW9kaWYgPSAoX2ZpbGUkdmFsdWU0ID0gZmlsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGUkdmFsdWU0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsZSR2YWx1ZTQubGFzdE1vZGlmaWVkKSAhPT0gbnVsbCAmJiBfZmlsZSR2YWx1ZSRsYXN0TW9kaWYgIT09IHZvaWQgMCA/IF9maWxlJHZhbHVlJGxhc3RNb2RpZiA6IDA7XG5cdH0pO1xuXHRhc3luYyBmdW5jdGlvbiBvcGVuKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgW2hhbmRsZV0gPSBhd2FpdCB3aW5kb3ckMS5zaG93T3BlbkZpbGVQaWNrZXIoe1xuXHRcdFx0Li4udG9WYWx1ZShvcHRpb25zKSxcblx0XHRcdC4uLl9vcHRpb25zXG5cdFx0fSk7XG5cdFx0ZmlsZUhhbmRsZS52YWx1ZSA9IGhhbmRsZTtcblx0XHRhd2FpdCB1cGRhdGVEYXRhKCk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gY3JlYXRlKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0ZmlsZUhhbmRsZS52YWx1ZSA9IGF3YWl0IHdpbmRvdyQxLnNob3dTYXZlRmlsZVBpY2tlcih7XG5cdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0Li4uX29wdGlvbnNcblx0XHR9KTtcblx0XHRkYXRhLnZhbHVlID0gdm9pZCAwO1xuXHRcdGF3YWl0IHVwZGF0ZURhdGEoKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBzYXZlKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKCFmaWxlSGFuZGxlLnZhbHVlKSByZXR1cm4gc2F2ZUFzKF9vcHRpb25zKTtcblx0XHRpZiAoZGF0YS52YWx1ZSkge1xuXHRcdFx0Y29uc3Qgd3JpdGFibGVTdHJlYW0gPSBhd2FpdCBmaWxlSGFuZGxlLnZhbHVlLmNyZWF0ZVdyaXRhYmxlKCk7XG5cdFx0XHRhd2FpdCB3cml0YWJsZVN0cmVhbS53cml0ZShkYXRhLnZhbHVlKTtcblx0XHRcdGF3YWl0IHdyaXRhYmxlU3RyZWFtLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHVwZGF0ZUZpbGUoKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBzYXZlQXMoX29wdGlvbnMgPSB7fSkge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRmaWxlSGFuZGxlLnZhbHVlID0gYXdhaXQgd2luZG93JDEuc2hvd1NhdmVGaWxlUGlja2VyKHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5fb3B0aW9uc1xuXHRcdH0pO1xuXHRcdGlmIChkYXRhLnZhbHVlKSB7XG5cdFx0XHRjb25zdCB3cml0YWJsZVN0cmVhbSA9IGF3YWl0IGZpbGVIYW5kbGUudmFsdWUuY3JlYXRlV3JpdGFibGUoKTtcblx0XHRcdGF3YWl0IHdyaXRhYmxlU3RyZWFtLndyaXRlKGRhdGEudmFsdWUpO1xuXHRcdFx0YXdhaXQgd3JpdGFibGVTdHJlYW0uY2xvc2UoKTtcblx0XHR9XG5cdFx0YXdhaXQgdXBkYXRlRmlsZSgpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGUoKSB7XG5cdFx0dmFyIF9maWxlSGFuZGxlJHZhbHVlO1xuXHRcdGZpbGUudmFsdWUgPSBhd2FpdCAoKF9maWxlSGFuZGxlJHZhbHVlID0gZmlsZUhhbmRsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGVIYW5kbGUkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlSGFuZGxlJHZhbHVlLmdldEZpbGUoKSk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gdXBkYXRlRGF0YSgpIHtcblx0XHR2YXIgX2ZpbGUkdmFsdWU1LCBfZmlsZSR2YWx1ZTY7XG5cdFx0YXdhaXQgdXBkYXRlRmlsZSgpO1xuXHRcdGNvbnN0IHR5cGUgPSB0b1ZhbHVlKGRhdGFUeXBlKTtcblx0XHRpZiAodHlwZSA9PT0gXCJUZXh0XCIpIGRhdGEudmFsdWUgPSBhd2FpdCAoKF9maWxlJHZhbHVlNSA9IGZpbGUudmFsdWUpID09PSBudWxsIHx8IF9maWxlJHZhbHVlNSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWU1LnRleHQoKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJBcnJheUJ1ZmZlclwiKSBkYXRhLnZhbHVlID0gYXdhaXQgKChfZmlsZSR2YWx1ZTYgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZTYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlNi5hcnJheUJ1ZmZlcigpKTtcblx0XHRlbHNlIGlmICh0eXBlID09PSBcIkJsb2JcIikgZGF0YS52YWx1ZSA9IGZpbGUudmFsdWU7XG5cdH1cblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShkYXRhVHlwZSksIHVwZGF0ZURhdGEpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGRhdGEsXG5cdFx0ZmlsZSxcblx0XHRmaWxlTmFtZSxcblx0XHRmaWxlTUlNRSxcblx0XHRmaWxlU2l6ZSxcblx0XHRmaWxlTGFzdE1vZGlmaWVkLFxuXHRcdG9wZW4sXG5cdFx0Y3JlYXRlLFxuXHRcdHNhdmUsXG5cdFx0c2F2ZUFzLFxuXHRcdHVwZGF0ZURhdGFcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRm9jdXMvaW5kZXgudHNcbi8qKlxuKiBUcmFjayBvciBzZXQgdGhlIGZvY3VzIHN0YXRlIG9mIGEgRE9NIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZvY3VzXG4qIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50IGZvciB0aGUgZm9jdXMgYW5kIGJsdXIgZXZlbnRzLlxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUZvY3VzKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFZhbHVlID0gZmFsc2UsIGZvY3VzVmlzaWJsZSA9IGZhbHNlLCBwcmV2ZW50U2Nyb2xsID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlubmVyRm9jdXNlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCB0YXJnZXRFbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCkpO1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBcImZvY3VzXCIsIChldmVudCkgPT4ge1xuXHRcdHZhciBfbWF0Y2hlcywgX3JlZjtcblx0XHRpZiAoIWZvY3VzVmlzaWJsZSB8fCAoKF9tYXRjaGVzID0gKF9yZWYgPSBldmVudC50YXJnZXQpLm1hdGNoZXMpID09PSBudWxsIHx8IF9tYXRjaGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWF0Y2hlcy5jYWxsKF9yZWYsIFwiOmZvY3VzLXZpc2libGVcIikpKSBpbm5lckZvY3VzZWQudmFsdWUgPSB0cnVlO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIFwiYmx1clwiLCAoKSA9PiBpbm5lckZvY3VzZWQudmFsdWUgPSBmYWxzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0Y29uc3QgZm9jdXNlZCA9IGNvbXB1dGVkKHtcblx0XHRnZXQ6ICgpID0+IGlubmVyRm9jdXNlZC52YWx1ZSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHZhciBfdGFyZ2V0RWxlbWVudCR2YWx1ZSwgX3RhcmdldEVsZW1lbnQkdmFsdWUyO1xuXHRcdFx0aWYgKCF2YWx1ZSAmJiBpbm5lckZvY3VzZWQudmFsdWUpIChfdGFyZ2V0RWxlbWVudCR2YWx1ZSA9IHRhcmdldEVsZW1lbnQudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlID09PSB2b2lkIDAgfHwgX3RhcmdldEVsZW1lbnQkdmFsdWUuYmx1cigpO1xuXHRcdFx0ZWxzZSBpZiAodmFsdWUgJiYgIWlubmVyRm9jdXNlZC52YWx1ZSkgKF90YXJnZXRFbGVtZW50JHZhbHVlMiA9IHRhcmdldEVsZW1lbnQudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlMiA9PT0gdm9pZCAwIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlMi5mb2N1cyh7IHByZXZlbnRTY3JvbGwgfSk7XG5cdFx0fVxuXHR9KTtcblx0d2F0Y2godGFyZ2V0RWxlbWVudCwgKCkgPT4ge1xuXHRcdGZvY3VzZWQudmFsdWUgPSBpbml0aWFsVmFsdWU7XG5cdH0sIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pO1xuXHRyZXR1cm4geyBmb2N1c2VkIH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUZvY3VzV2l0aGluL2luZGV4LnRzXG5jb25zdCBFVkVOVF9GT0NVU19JTiA9IFwiZm9jdXNpblwiO1xuY29uc3QgRVZFTlRfRk9DVVNfT1VUID0gXCJmb2N1c291dFwiO1xuY29uc3QgUFNFVURPX0NMQVNTX0ZPQ1VTX1dJVEhJTiA9IFwiOmZvY3VzLXdpdGhpblwiO1xuLyoqXG4qIFRyYWNrIGlmIGZvY3VzIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHRhcmdldCBlbGVtZW50XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZvY3VzV2l0aGluXG4qIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50IHRvIHRyYWNrXG4qIEBwYXJhbSBvcHRpb25zIEZvY3VzIHdpdGhpbiBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRm9jdXNXaXRoaW4odGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgdGFyZ2V0RWxlbWVudCA9IGNvbXB1dGVkKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpKTtcblx0Y29uc3QgX2ZvY3VzZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZm9jdXNlZCA9IGNvbXB1dGVkKCgpID0+IF9mb2N1c2VkLnZhbHVlKTtcblx0Y29uc3QgYWN0aXZlRWxlbWVudCA9IHVzZUFjdGl2ZUVsZW1lbnQob3B0aW9ucyk7XG5cdGlmICghd2luZG93JDEgfHwgIWFjdGl2ZUVsZW1lbnQudmFsdWUpIHJldHVybiB7IGZvY3VzZWQgfTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgRVZFTlRfRk9DVVNfSU4sICgpID0+IF9mb2N1c2VkLnZhbHVlID0gdHJ1ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBFVkVOVF9GT0NVU19PVVQsICgpID0+IHtcblx0XHR2YXIgX3RhcmdldEVsZW1lbnQkdmFsdWUkLCBfdGFyZ2V0RWxlbWVudCR2YWx1ZSwgX3RhcmdldEVsZW1lbnQkdmFsdWUkMjtcblx0XHRyZXR1cm4gX2ZvY3VzZWQudmFsdWUgPSAoX3RhcmdldEVsZW1lbnQkdmFsdWUkID0gKF90YXJnZXRFbGVtZW50JHZhbHVlID0gdGFyZ2V0RWxlbWVudC52YWx1ZSkgPT09IG51bGwgfHwgX3RhcmdldEVsZW1lbnQkdmFsdWUgPT09IHZvaWQgMCB8fCAoX3RhcmdldEVsZW1lbnQkdmFsdWUkMiA9IF90YXJnZXRFbGVtZW50JHZhbHVlLm1hdGNoZXMpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlJDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YXJnZXRFbGVtZW50JHZhbHVlJDIuY2FsbChfdGFyZ2V0RWxlbWVudCR2YWx1ZSwgUFNFVURPX0NMQVNTX0ZPQ1VTX1dJVEhJTikpICE9PSBudWxsICYmIF90YXJnZXRFbGVtZW50JHZhbHVlJCAhPT0gdm9pZCAwID8gX3RhcmdldEVsZW1lbnQkdmFsdWUkIDogZmFsc2U7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHJldHVybiB7IGZvY3VzZWQgfTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRnBzL2luZGV4LnRzXG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlRnBzKG9wdGlvbnMpIHtcblx0dmFyIF9vcHRpb25zJGV2ZXJ5O1xuXHRjb25zdCBmcHMgPSBzaGFsbG93UmVmKDApO1xuXHRpZiAodHlwZW9mIHBlcmZvcm1hbmNlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZnBzO1xuXHRjb25zdCBldmVyeSA9IChfb3B0aW9ucyRldmVyeSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ldmVyeSkgIT09IG51bGwgJiYgX29wdGlvbnMkZXZlcnkgIT09IHZvaWQgMCA/IF9vcHRpb25zJGV2ZXJ5IDogMTA7XG5cdGxldCBsYXN0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cdGxldCB0aWNrcyA9IDA7XG5cdHVzZVJhZkZuKCgpID0+IHtcblx0XHR0aWNrcyArPSAxO1xuXHRcdGlmICh0aWNrcyA+PSBldmVyeSkge1xuXHRcdFx0Y29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cdFx0XHRjb25zdCBkaWZmID0gbm93IC0gbGFzdDtcblx0XHRcdGZwcy52YWx1ZSA9IE1hdGgucm91bmQoMWUzIC8gKGRpZmYgLyB0aWNrcykpO1xuXHRcdFx0bGFzdCA9IG5vdztcblx0XHRcdHRpY2tzID0gMDtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZnBzO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGdWxsc2NyZWVuL2luZGV4LnRzXG5jb25zdCBldmVudEhhbmRsZXJzID0gW1xuXHRcImZ1bGxzY3JlZW5jaGFuZ2VcIixcblx0XCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFwid2Via2l0ZW5kZnVsbHNjcmVlblwiLFxuXHRcIm1vemZ1bGxzY3JlZW5jaGFuZ2VcIixcblx0XCJNU0Z1bGxzY3JlZW5DaGFuZ2VcIlxuXTtcbi8qKlxuKiBSZWFjdGl2ZSBGdWxsc2NyZWVuIEFQSS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRnVsbHNjcmVlblxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRnVsbHNjcmVlbih0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50LCBhdXRvRXhpdCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB0YXJnZXRSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF91bnJlZkVsZW1lbnQ7XG5cdFx0cmV0dXJuIChfdW5yZWZFbGVtZW50ID0gdW5yZWZFbGVtZW50KHRhcmdldCkpICE9PSBudWxsICYmIF91bnJlZkVsZW1lbnQgIT09IHZvaWQgMCA/IF91bnJlZkVsZW1lbnQgOiBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuZG9jdW1lbnRFbGVtZW50O1xuXHR9KTtcblx0Y29uc3QgaXNGdWxsc2NyZWVuID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHJlcXVlc3RNZXRob2QgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdFwicmVxdWVzdEZ1bGxzY3JlZW5cIixcblx0XHRcdFwid2Via2l0UmVxdWVzdEZ1bGxzY3JlZW5cIixcblx0XHRcdFwid2Via2l0RW50ZXJGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtb3pSZXF1ZXN0RnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtc1JlcXVlc3RGdWxsc2NyZWVuXCJcblx0XHRdLmZpbmQoKG0pID0+IGRvY3VtZW50JDEgJiYgbSBpbiBkb2N1bWVudCQxIHx8IHRhcmdldFJlZi52YWx1ZSAmJiBtIGluIHRhcmdldFJlZi52YWx1ZSk7XG5cdH0pO1xuXHRjb25zdCBleGl0TWV0aG9kID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiBbXG5cdFx0XHRcImV4aXRGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEV4aXRGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEV4aXRGdWxsU2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdENhbmNlbEZ1bGxTY3JlZW5cIixcblx0XHRcdFwibW96Q2FuY2VsRnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtc0V4aXRGdWxsc2NyZWVuXCJcblx0XHRdLmZpbmQoKG0pID0+IGRvY3VtZW50JDEgJiYgbSBpbiBkb2N1bWVudCQxIHx8IHRhcmdldFJlZi52YWx1ZSAmJiBtIGluIHRhcmdldFJlZi52YWx1ZSk7XG5cdH0pO1xuXHRjb25zdCBmdWxsc2NyZWVuRW5hYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0XCJmdWxsU2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdElzRnVsbFNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlblwiLFxuXHRcdFx0XCJtb3pGdWxsU2NyZWVuXCIsXG5cdFx0XHRcIm1zRnVsbHNjcmVlbkVsZW1lbnRcIlxuXHRcdF0uZmluZCgobSkgPT4gZG9jdW1lbnQkMSAmJiBtIGluIGRvY3VtZW50JDEgfHwgdGFyZ2V0UmVmLnZhbHVlICYmIG0gaW4gdGFyZ2V0UmVmLnZhbHVlKTtcblx0fSk7XG5cdGNvbnN0IGZ1bGxzY3JlZW5FbGVtZW50TWV0aG9kID0gW1xuXHRcdFwiZnVsbHNjcmVlbkVsZW1lbnRcIixcblx0XHRcIndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50XCIsXG5cdFx0XCJtb3pGdWxsU2NyZWVuRWxlbWVudFwiLFxuXHRcdFwibXNGdWxsc2NyZWVuRWxlbWVudFwiXG5cdF0uZmluZCgobSkgPT4gZG9jdW1lbnQkMSAmJiBtIGluIGRvY3VtZW50JDEpO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gdGFyZ2V0UmVmLnZhbHVlICYmIGRvY3VtZW50JDEgJiYgcmVxdWVzdE1ldGhvZC52YWx1ZSAhPT0gdm9pZCAwICYmIGV4aXRNZXRob2QudmFsdWUgIT09IHZvaWQgMCAmJiBmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZSAhPT0gdm9pZCAwKTtcblx0Y29uc3QgaXNDdXJyZW50RWxlbWVudEZ1bGxTY3JlZW4gPSAoKSA9PiB7XG5cdFx0aWYgKGZ1bGxzY3JlZW5FbGVtZW50TWV0aG9kKSByZXR1cm4gKGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMVtmdWxsc2NyZWVuRWxlbWVudE1ldGhvZF0pID09PSB0YXJnZXRSZWYudmFsdWU7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXHRjb25zdCBpc0VsZW1lbnRGdWxsU2NyZWVuID0gKCkgPT4ge1xuXHRcdGlmIChmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZSkgaWYgKGRvY3VtZW50JDEgJiYgZG9jdW1lbnQkMVtmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZV0gIT0gbnVsbCkgcmV0dXJuIGRvY3VtZW50JDFbZnVsbHNjcmVlbkVuYWJsZWQudmFsdWVdO1xuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3QgdGFyZ2V0JDEgPSB0YXJnZXRSZWYudmFsdWU7XG5cdFx0XHRpZiAoKHRhcmdldCQxID09PSBudWxsIHx8IHRhcmdldCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQkMVtmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZV0pICE9IG51bGwpIHJldHVybiBCb29sZWFuKHRhcmdldCQxW2Z1bGxzY3JlZW5FbmFibGVkLnZhbHVlXSk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0YXN5bmMgZnVuY3Rpb24gZXhpdCgpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8ICFpc0Z1bGxzY3JlZW4udmFsdWUpIHJldHVybjtcblx0XHRpZiAoZXhpdE1ldGhvZC52YWx1ZSkgaWYgKChkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDFbZXhpdE1ldGhvZC52YWx1ZV0pICE9IG51bGwpIGF3YWl0IGRvY3VtZW50JDFbZXhpdE1ldGhvZC52YWx1ZV0oKTtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHRhcmdldCQxID0gdGFyZ2V0UmVmLnZhbHVlO1xuXHRcdFx0aWYgKCh0YXJnZXQkMSA9PT0gbnVsbCB8fCB0YXJnZXQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0JDFbZXhpdE1ldGhvZC52YWx1ZV0pICE9IG51bGwpIGF3YWl0IHRhcmdldCQxW2V4aXRNZXRob2QudmFsdWVdKCk7XG5cdFx0fVxuXHRcdGlzRnVsbHNjcmVlbi52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGVudGVyKCkge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUgfHwgaXNGdWxsc2NyZWVuLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKGlzRWxlbWVudEZ1bGxTY3JlZW4oKSkgYXdhaXQgZXhpdCgpO1xuXHRcdGNvbnN0IHRhcmdldCQxID0gdGFyZ2V0UmVmLnZhbHVlO1xuXHRcdGlmIChyZXF1ZXN0TWV0aG9kLnZhbHVlICYmICh0YXJnZXQkMSA9PT0gbnVsbCB8fCB0YXJnZXQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0JDFbcmVxdWVzdE1ldGhvZC52YWx1ZV0pICE9IG51bGwpIHtcblx0XHRcdGF3YWl0IHRhcmdldCQxW3JlcXVlc3RNZXRob2QudmFsdWVdKCk7XG5cdFx0XHRpc0Z1bGxzY3JlZW4udmFsdWUgPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRhc3luYyBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdFx0YXdhaXQgKGlzRnVsbHNjcmVlbi52YWx1ZSA/IGV4aXQoKSA6IGVudGVyKCkpO1xuXHR9XG5cdGNvbnN0IGhhbmRsZXJDYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWUgPSBpc0VsZW1lbnRGdWxsU2NyZWVuKCk7XG5cdFx0aWYgKCFpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWUgfHwgaXNFbGVtZW50RnVsbFNjcmVlblZhbHVlICYmIGlzQ3VycmVudEVsZW1lbnRGdWxsU2NyZWVuKCkpIGlzRnVsbHNjcmVlbi52YWx1ZSA9IGlzRWxlbWVudEZ1bGxTY3JlZW5WYWx1ZTtcblx0fTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdGNhcHR1cmU6IGZhbHNlLFxuXHRcdHBhc3NpdmU6IHRydWVcblx0fTtcblx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBldmVudEhhbmRsZXJzLCBoYW5kbGVyQ2FsbGJhY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldFJlZiksIGV2ZW50SGFuZGxlcnMsIGhhbmRsZXJDYWxsYmFjaywgbGlzdGVuZXJPcHRpb25zKTtcblx0dHJ5T25Nb3VudGVkKGhhbmRsZXJDYWxsYmFjaywgZmFsc2UpO1xuXHRpZiAoYXV0b0V4aXQpIHRyeU9uU2NvcGVEaXNwb3NlKGV4aXQpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzRnVsbHNjcmVlbixcblx0XHRlbnRlcixcblx0XHRleGl0LFxuXHRcdHRvZ2dsZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VHYW1lcGFkL2luZGV4LnRzXG4vKipcbiogTWFwcyBhIHN0YW5kYXJkIHN0YW5kYXJkIGdhbWVwYWQgdG8gYW4gWGJveCAzNjAgQ29udHJvbGxlci5cbiovXG5mdW5jdGlvbiBtYXBHYW1lcGFkVG9YYm94MzYwQ29udHJvbGxlcihnYW1lcGFkKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGdhbWVwYWQudmFsdWUpIHJldHVybiB7XG5cdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdGE6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1swXSxcblx0XHRcdFx0YjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzFdLFxuXHRcdFx0XHR4OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMl0sXG5cdFx0XHRcdHk6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1szXVxuXHRcdFx0fSxcblx0XHRcdGJ1bXBlcjoge1xuXHRcdFx0XHRsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNF0sXG5cdFx0XHRcdHJpZ2h0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNV1cblx0XHRcdH0sXG5cdFx0XHR0cmlnZ2Vyczoge1xuXHRcdFx0XHRsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNl0sXG5cdFx0XHRcdHJpZ2h0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbN11cblx0XHRcdH0sXG5cdFx0XHRzdGljazoge1xuXHRcdFx0XHRsZWZ0OiB7XG5cdFx0XHRcdFx0aG9yaXpvbnRhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzBdLFxuXHRcdFx0XHRcdHZlcnRpY2FsOiBnYW1lcGFkLnZhbHVlLmF4ZXNbMV0sXG5cdFx0XHRcdFx0YnV0dG9uOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTBdXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJpZ2h0OiB7XG5cdFx0XHRcdFx0aG9yaXpvbnRhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzJdLFxuXHRcdFx0XHRcdHZlcnRpY2FsOiBnYW1lcGFkLnZhbHVlLmF4ZXNbM10sXG5cdFx0XHRcdFx0YnV0dG9uOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTFdXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkcGFkOiB7XG5cdFx0XHRcdHVwOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTJdLFxuXHRcdFx0XHRkb3duOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTNdLFxuXHRcdFx0XHRsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTRdLFxuXHRcdFx0XHRyaWdodDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzE1XVxuXHRcdFx0fSxcblx0XHRcdGJhY2s6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1s4XSxcblx0XHRcdHN0YXJ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbOV1cblx0XHR9O1xuXHRcdHJldHVybiBudWxsO1xuXHR9KTtcbn1cbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VHYW1lcGFkKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJnZXRHYW1lcGFkc1wiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgZ2FtZXBhZHMgPSByZWYoW10pO1xuXHRjb25zdCBvbkNvbm5lY3RlZEhvb2sgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3Qgb25EaXNjb25uZWN0ZWRIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHN0YXRlRnJvbUdhbWVwYWQgPSAoZ2FtZXBhZCkgPT4ge1xuXHRcdGNvbnN0IGhhcHRpY0FjdHVhdG9ycyA9IFtdO1xuXHRcdGNvbnN0IHZpYnJhdGlvbkFjdHVhdG9yID0gXCJ2aWJyYXRpb25BY3R1YXRvclwiIGluIGdhbWVwYWQgPyBnYW1lcGFkLnZpYnJhdGlvbkFjdHVhdG9yIDogbnVsbDtcblx0XHRpZiAodmlicmF0aW9uQWN0dWF0b3IpIGhhcHRpY0FjdHVhdG9ycy5wdXNoKHZpYnJhdGlvbkFjdHVhdG9yKTtcblx0XHRpZiAoZ2FtZXBhZC5oYXB0aWNBY3R1YXRvcnMpIGhhcHRpY0FjdHVhdG9ycy5wdXNoKC4uLmdhbWVwYWQuaGFwdGljQWN0dWF0b3JzKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWQ6IGdhbWVwYWQuaWQsXG5cdFx0XHRpbmRleDogZ2FtZXBhZC5pbmRleCxcblx0XHRcdGNvbm5lY3RlZDogZ2FtZXBhZC5jb25uZWN0ZWQsXG5cdFx0XHRtYXBwaW5nOiBnYW1lcGFkLm1hcHBpbmcsXG5cdFx0XHR0aW1lc3RhbXA6IGdhbWVwYWQudGltZXN0YW1wLFxuXHRcdFx0dmlicmF0aW9uQWN0dWF0b3I6IGdhbWVwYWQudmlicmF0aW9uQWN0dWF0b3IsXG5cdFx0XHRoYXB0aWNBY3R1YXRvcnMsXG5cdFx0XHRheGVzOiBnYW1lcGFkLmF4ZXMubWFwKChheGVzKSA9PiBheGVzKSxcblx0XHRcdGJ1dHRvbnM6IGdhbWVwYWQuYnV0dG9ucy5tYXAoKGJ1dHRvbikgPT4gKHtcblx0XHRcdFx0cHJlc3NlZDogYnV0dG9uLnByZXNzZWQsXG5cdFx0XHRcdHRvdWNoZWQ6IGJ1dHRvbi50b3VjaGVkLFxuXHRcdFx0XHR2YWx1ZTogYnV0dG9uLnZhbHVlXG5cdFx0XHR9KSlcblx0XHR9O1xuXHR9O1xuXHRjb25zdCB1cGRhdGVHYW1lcGFkU3RhdGUgPSAoKSA9PiB7XG5cdFx0Y29uc3QgX2dhbWVwYWRzID0gKG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IkMS5nZXRHYW1lcGFkcygpKSB8fCBbXTtcblx0XHRmb3IgKGNvbnN0IGdhbWVwYWQgb2YgX2dhbWVwYWRzKSBpZiAoZ2FtZXBhZCAmJiBnYW1lcGFkcy52YWx1ZVtnYW1lcGFkLmluZGV4XSkgZ2FtZXBhZHMudmFsdWVbZ2FtZXBhZC5pbmRleF0gPSBzdGF0ZUZyb21HYW1lcGFkKGdhbWVwYWQpO1xuXHR9O1xuXHRjb25zdCB7IGlzQWN0aXZlLCBwYXVzZSwgcmVzdW1lIH0gPSB1c2VSYWZGbih1cGRhdGVHYW1lcGFkU3RhdGUpO1xuXHRjb25zdCBvbkdhbWVwYWRDb25uZWN0ZWQgPSAoZ2FtZXBhZCkgPT4ge1xuXHRcdGlmICghZ2FtZXBhZHMudmFsdWUuc29tZSgoeyBpbmRleCB9KSA9PiBpbmRleCA9PT0gZ2FtZXBhZC5pbmRleCkpIHtcblx0XHRcdGdhbWVwYWRzLnZhbHVlLnB1c2goc3RhdGVGcm9tR2FtZXBhZChnYW1lcGFkKSk7XG5cdFx0XHRvbkNvbm5lY3RlZEhvb2sudHJpZ2dlcihnYW1lcGFkLmluZGV4KTtcblx0XHR9XG5cdFx0cmVzdW1lKCk7XG5cdH07XG5cdGNvbnN0IG9uR2FtZXBhZERpc2Nvbm5lY3RlZCA9IChnYW1lcGFkKSA9PiB7XG5cdFx0Z2FtZXBhZHMudmFsdWUgPSBnYW1lcGFkcy52YWx1ZS5maWx0ZXIoKHgpID0+IHguaW5kZXggIT09IGdhbWVwYWQuaW5kZXgpO1xuXHRcdG9uRGlzY29ubmVjdGVkSG9vay50cmlnZ2VyKGdhbWVwYWQuaW5kZXgpO1xuXHR9O1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0dXNlRXZlbnRMaXN0ZW5lcihcImdhbWVwYWRjb25uZWN0ZWRcIiwgKGUpID0+IG9uR2FtZXBhZENvbm5lY3RlZChlLmdhbWVwYWQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKFwiZ2FtZXBhZGRpc2Nvbm5lY3RlZFwiLCAoZSkgPT4gb25HYW1lcGFkRGlzY29ubmVjdGVkKGUuZ2FtZXBhZCksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgX2dhbWVwYWRzID0gKG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IkMS5nZXRHYW1lcGFkcygpKSB8fCBbXTtcblx0XHRmb3IgKGNvbnN0IGdhbWVwYWQgb2YgX2dhbWVwYWRzKSBpZiAoZ2FtZXBhZCAmJiBnYW1lcGFkcy52YWx1ZVtnYW1lcGFkLmluZGV4XSkgb25HYW1lcGFkQ29ubmVjdGVkKGdhbWVwYWQpO1xuXHR9KTtcblx0cGF1c2UoKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRvbkNvbm5lY3RlZDogb25Db25uZWN0ZWRIb29rLm9uLFxuXHRcdG9uRGlzY29ubmVjdGVkOiBvbkRpc2Nvbm5lY3RlZEhvb2sub24sXG5cdFx0Z2FtZXBhZHMsXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGlzQWN0aXZlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUdlb2xvY2F0aW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgR2VvbG9jYXRpb24gQVBJLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VHZW9sb2NhdGlvblxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUdlb2xvY2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGVuYWJsZUhpZ2hBY2N1cmFjeSA9IHRydWUsIG1heGltdW1BZ2UgPSAzZTQsIHRpbWVvdXQgPSAyN2UzLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiZ2VvbG9jYXRpb25cIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IGxvY2F0ZWRBdCA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgY29vcmRzID0gcmVmKHtcblx0XHRhY2N1cmFjeTogMCxcblx0XHRsYXRpdHVkZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRcdGxvbmdpdHVkZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRcdGFsdGl0dWRlOiBudWxsLFxuXHRcdGFsdGl0dWRlQWNjdXJhY3k6IG51bGwsXG5cdFx0aGVhZGluZzogbnVsbCxcblx0XHRzcGVlZDogbnVsbFxuXHR9KTtcblx0ZnVuY3Rpb24gdXBkYXRlUG9zaXRpb24ocG9zaXRpb24pIHtcblx0XHRsb2NhdGVkQXQudmFsdWUgPSBwb3NpdGlvbi50aW1lc3RhbXA7XG5cdFx0Y29vcmRzLnZhbHVlID0gcG9zaXRpb24uY29vcmRzO1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0fVxuXHRsZXQgd2F0Y2hlcjtcblx0ZnVuY3Rpb24gcmVzdW1lKCkge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgd2F0Y2hlciA9IG5hdmlnYXRvciQxLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24odXBkYXRlUG9zaXRpb24sIChlcnIpID0+IGVycm9yLnZhbHVlID0gZXJyLCB7XG5cdFx0XHRlbmFibGVIaWdoQWNjdXJhY3ksXG5cdFx0XHRtYXhpbXVtQWdlLFxuXHRcdFx0dGltZW91dFxuXHRcdH0pO1xuXHR9XG5cdGlmIChpbW1lZGlhdGUpIHJlc3VtZSgpO1xuXHRmdW5jdGlvbiBwYXVzZSgpIHtcblx0XHRpZiAod2F0Y2hlciAmJiBuYXZpZ2F0b3IkMSkgbmF2aWdhdG9yJDEuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh3YXRjaGVyKTtcblx0fVxuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0cGF1c2UoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y29vcmRzLFxuXHRcdGxvY2F0ZWRBdCxcblx0XHRlcnJvcixcblx0XHRyZXN1bWUsXG5cdFx0cGF1c2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlSWRsZS9pbmRleC50c1xuY29uc3QgZGVmYXVsdEV2ZW50cyQxID0gW1xuXHRcIm1vdXNlbW92ZVwiLFxuXHRcIm1vdXNlZG93blwiLFxuXHRcInJlc2l6ZVwiLFxuXHRcImtleWRvd25cIixcblx0XCJ0b3VjaHN0YXJ0XCIsXG5cdFwid2hlZWxcIlxuXTtcbmNvbnN0IG9uZU1pbnV0ZSA9IDZlNDtcbi8qKlxuKiBUcmFja3Mgd2hldGhlciB0aGUgdXNlciBpcyBiZWluZyBpbmFjdGl2ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSWRsZVxuKiBAcGFyYW0gdGltZW91dCBkZWZhdWx0IHRvIDEgbWludXRlXG4qIEBwYXJhbSBvcHRpb25zIElkbGVPcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlSWRsZSh0aW1lb3V0ID0gb25lTWludXRlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbml0aWFsU3RhdGUgPSBmYWxzZSwgbGlzdGVuRm9yVmlzaWJpbGl0eUNoYW5nZSA9IHRydWUsIGV2ZW50czogZXZlbnRzJDEgPSBkZWZhdWx0RXZlbnRzJDEsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBldmVudEZpbHRlciA9IHRocm90dGxlRmlsdGVyKDUwKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaWRsZSA9IHNoYWxsb3dSZWYoaW5pdGlhbFN0YXRlKTtcblx0Y29uc3QgbGFzdEFjdGl2ZSA9IHNoYWxsb3dSZWYodGltZXN0YW1wKCkpO1xuXHRjb25zdCBpc1BlbmRpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHRpbWVyO1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHRpZGxlLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHR0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gaWRsZS52YWx1ZSA9IHRydWUsIHRpbWVvdXQpO1xuXHR9O1xuXHRjb25zdCBvbkV2ZW50ID0gY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgKCkgPT4ge1xuXHRcdGxhc3RBY3RpdmUudmFsdWUgPSB0aW1lc3RhbXAoKTtcblx0XHRyZXNldCgpO1xuXHR9KTtcblx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0Y29uc3QgZG9jdW1lbnQkMSA9IHdpbmRvdyQxLmRvY3VtZW50O1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzJDEpIHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIGV2ZW50LCAoKSA9PiB7XG5cdFx0XHRpZiAoIWlzUGVuZGluZy52YWx1ZSkgcmV0dXJuO1xuXHRcdFx0b25FdmVudCgpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0aWYgKGxpc3RlbkZvclZpc2liaWxpdHlDaGFuZ2UpIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsICgpID0+IHtcblx0XHRcdGlmIChkb2N1bWVudCQxLmhpZGRlbiB8fCAhaXNQZW5kaW5nLnZhbHVlKSByZXR1cm47XG5cdFx0XHRvbkV2ZW50KCk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHRzdGFydCgpO1xuXHR9XG5cdGZ1bmN0aW9uIHN0YXJ0KCkge1xuXHRcdGlmIChpc1BlbmRpbmcudmFsdWUpIHJldHVybjtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlmICghaW5pdGlhbFN0YXRlKSByZXNldCgpO1xuXHR9XG5cdGZ1bmN0aW9uIHN0b3AoKSB7XG5cdFx0aWRsZS52YWx1ZSA9IGluaXRpYWxTdGF0ZTtcblx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdGlzUGVuZGluZy52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0aWRsZSxcblx0XHRsYXN0QWN0aXZlLFxuXHRcdHJlc2V0LFxuXHRcdHN0b3AsXG5cdFx0c3RhcnQsXG5cdFx0aXNQZW5kaW5nOiBzaGFsbG93UmVhZG9ubHkoaXNQZW5kaW5nKVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VJbWFnZS9pbmRleC50c1xuYXN5bmMgZnVuY3Rpb24gbG9hZEltYWdlKG9wdGlvbnMpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcblx0XHRjb25zdCB7IHNyYywgc3Jjc2V0LCBzaXplcywgY2xhc3M6IGNsYXp6LCBsb2FkaW5nLCBjcm9zc29yaWdpbiwgcmVmZXJyZXJQb2xpY3ksIHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nLCBmZXRjaFByaW9yaXR5LCBpc21hcCwgdXNlbWFwIH0gPSBvcHRpb25zO1xuXHRcdGltZy5zcmMgPSBzcmM7XG5cdFx0aWYgKHNyY3NldCAhPSBudWxsKSBpbWcuc3Jjc2V0ID0gc3Jjc2V0O1xuXHRcdGlmIChzaXplcyAhPSBudWxsKSBpbWcuc2l6ZXMgPSBzaXplcztcblx0XHRpZiAoY2xhenogIT0gbnVsbCkgaW1nLmNsYXNzTmFtZSA9IGNsYXp6O1xuXHRcdGlmIChsb2FkaW5nICE9IG51bGwpIGltZy5sb2FkaW5nID0gbG9hZGluZztcblx0XHRpZiAoY3Jvc3NvcmlnaW4gIT0gbnVsbCkgaW1nLmNyb3NzT3JpZ2luID0gY3Jvc3NvcmlnaW47XG5cdFx0aWYgKHJlZmVycmVyUG9saWN5ICE9IG51bGwpIGltZy5yZWZlcnJlclBvbGljeSA9IHJlZmVycmVyUG9saWN5O1xuXHRcdGlmICh3aWR0aCAhPSBudWxsKSBpbWcud2lkdGggPSB3aWR0aDtcblx0XHRpZiAoaGVpZ2h0ICE9IG51bGwpIGltZy5oZWlnaHQgPSBoZWlnaHQ7XG5cdFx0aWYgKGRlY29kaW5nICE9IG51bGwpIGltZy5kZWNvZGluZyA9IGRlY29kaW5nO1xuXHRcdGlmIChmZXRjaFByaW9yaXR5ICE9IG51bGwpIGltZy5mZXRjaFByaW9yaXR5ID0gZmV0Y2hQcmlvcml0eTtcblx0XHRpZiAoaXNtYXAgIT0gbnVsbCkgaW1nLmlzTWFwID0gaXNtYXA7XG5cdFx0aWYgKHVzZW1hcCAhPSBudWxsKSBpbWcudXNlTWFwID0gdXNlbWFwO1xuXHRcdGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltZyk7XG5cdFx0aW1nLm9uZXJyb3IgPSByZWplY3Q7XG5cdH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIGxvYWQgYW4gaW1hZ2UgaW4gdGhlIGJyb3dzZXIsIHlvdSBjYW4gd2FpdCB0aGUgcmVzdWx0IHRvIGRpc3BsYXkgaXQgb3Igc2hvdyBhIGZhbGxiYWNrLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VJbWFnZVxuKiBAcGFyYW0gb3B0aW9ucyBJbWFnZSBhdHRyaWJ1dGVzLCBhcyB1c2VkIGluIHRoZSA8aW1nPiB0YWdcbiogQHBhcmFtIGFzeW5jU3RhdGVPcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlSW1hZ2Uob3B0aW9ucywgYXN5bmNTdGF0ZU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBzdGF0ZSA9IHVzZUFzeW5jU3RhdGUoKCkgPT4gbG9hZEltYWdlKHRvVmFsdWUob3B0aW9ucykpLCB2b2lkIDAsIHtcblx0XHRyZXNldE9uRXhlY3V0ZTogdHJ1ZSxcblx0XHQuLi5hc3luY1N0YXRlT3B0aW9uc1xuXHR9KTtcblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShvcHRpb25zKSwgKCkgPT4gc3RhdGUuZXhlY3V0ZShhc3luY1N0YXRlT3B0aW9ucy5kZWxheSksIHsgZGVlcDogdHJ1ZSB9KTtcblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBfcmVzb2x2ZS1lbGVtZW50LnRzXG4vKipcbiogUmVzb2x2ZXMgYW4gZWxlbWVudCBmcm9tIGEgZ2l2ZW4gZWxlbWVudCwgd2luZG93LCBvciBkb2N1bWVudC5cbipcbiogQGludGVybmFsXG4qL1xuZnVuY3Rpb24gcmVzb2x2ZUVsZW1lbnQoZWwpIHtcblx0aWYgKHR5cGVvZiBXaW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgZWwgaW5zdGFuY2VvZiBXaW5kb3cpIHJldHVybiBlbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdGlmICh0eXBlb2YgRG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgZWwgaW5zdGFuY2VvZiBEb2N1bWVudCkgcmV0dXJuIGVsLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGVsO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTY3JvbGwvaW5kZXgudHNcbi8qKlxuKiBXZSBoYXZlIHRvIGNoZWNrIGlmIHRoZSBzY3JvbGwgYW1vdW50IGlzIGNsb3NlIGVub3VnaCB0byBzb21lIHRocmVzaG9sZCBpbiBvcmRlciB0b1xuKiBtb3JlIGFjY3VyYXRlbHkgY2FsY3VsYXRlIGFycml2ZWRTdGF0ZS4gVGhpcyBpcyBiZWNhdXNlIHNjcm9sbFRvcC9zY3JvbGxMZWZ0IGFyZSBub24tcm91bmRlZFxuKiBudW1iZXJzLCB3aGlsZSBzY3JvbGxIZWlnaHQvc2Nyb2xsV2lkdGggYW5kIGNsaWVudEhlaWdodC9jbGllbnRXaWR0aCBhcmUgcm91bmRlZC5cbiogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvc2Nyb2xsSGVpZ2h0I2RldGVybWluZV9pZl9hbl9lbGVtZW50X2hhc19iZWVuX3RvdGFsbHlfc2Nyb2xsZWRcbiovXG5jb25zdCBBUlJJVkVEX1NUQVRFX1RIUkVTSE9MRF9QSVhFTFMgPSAxO1xuLyoqXG4qIFJlYWN0aXZlIHNjcm9sbC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2Nyb2xsXG4qIEBwYXJhbSBlbGVtZW50XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU2Nyb2xsKGVsZW1lbnQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocm90dGxlID0gMCwgaWRsZSA9IDIwMCwgb25TdG9wID0gbm9vcCwgb25TY3JvbGwgPSBub29wLCBvZmZzZXQgPSB7XG5cdFx0bGVmdDogMCxcblx0XHRyaWdodDogMCxcblx0XHR0b3A6IDAsXG5cdFx0Ym90dG9tOiAwXG5cdH0sIG9ic2VydmU6IF9vYnNlcnZlID0geyBtdXRhdGlvbjogZmFsc2UgfSwgZXZlbnRMaXN0ZW5lck9wdGlvbnMgPSB7XG5cdFx0Y2FwdHVyZTogZmFsc2UsXG5cdFx0cGFzc2l2ZTogdHJ1ZVxuXHR9LCBiZWhhdmlvciA9IFwiYXV0b1wiLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgb25FcnJvciA9IChlKSA9PiB7XG5cdFx0Y29uc29sZS5lcnJvcihlKTtcblx0fSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgb2JzZXJ2ZSA9IHR5cGVvZiBfb2JzZXJ2ZSA9PT0gXCJib29sZWFuXCIgPyB7IG11dGF0aW9uOiBfb2JzZXJ2ZSB9IDogX29ic2VydmU7XG5cdGNvbnN0IGludGVybmFsWCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGludGVybmFsWSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHggPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGludGVybmFsWC52YWx1ZTtcblx0XHR9LFxuXHRcdHNldCh4JDEpIHtcblx0XHRcdHNjcm9sbFRvKHgkMSwgdm9pZCAwKTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCB5ID0gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpbnRlcm5hbFkudmFsdWU7XG5cdFx0fSxcblx0XHRzZXQoeSQxKSB7XG5cdFx0XHRzY3JvbGxUbyh2b2lkIDAsIHkkMSk7XG5cdFx0fVxuXHR9KTtcblx0ZnVuY3Rpb24gc2Nyb2xsVG8oX3gsIF95KSB7XG5cdFx0dmFyIF9yZWYsIF90b1ZhbHVlLCBfdG9WYWx1ZTIsIF9kb2N1bWVudDtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0Y29uc3QgX2VsZW1lbnQgPSB0b1ZhbHVlKGVsZW1lbnQpO1xuXHRcdGlmICghX2VsZW1lbnQpIHJldHVybjtcblx0XHQoX3JlZiA9IF9lbGVtZW50IGluc3RhbmNlb2YgRG9jdW1lbnQgPyB3aW5kb3ckMS5kb2N1bWVudC5ib2R5IDogX2VsZW1lbnQpID09PSBudWxsIHx8IF9yZWYgPT09IHZvaWQgMCB8fCBfcmVmLnNjcm9sbFRvKHtcblx0XHRcdHRvcDogKF90b1ZhbHVlID0gdG9WYWx1ZShfeSkpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHkudmFsdWUsXG5cdFx0XHRsZWZ0OiAoX3RvVmFsdWUyID0gdG9WYWx1ZShfeCkpICE9PSBudWxsICYmIF90b1ZhbHVlMiAhPT0gdm9pZCAwID8gX3RvVmFsdWUyIDogeC52YWx1ZSxcblx0XHRcdGJlaGF2aW9yOiB0b1ZhbHVlKGJlaGF2aW9yKVxuXHRcdH0pO1xuXHRcdGNvbnN0IHNjcm9sbENvbnRhaW5lciA9IChfZWxlbWVudCA9PT0gbnVsbCB8fCBfZWxlbWVudCA9PT0gdm9pZCAwIHx8IChfZG9jdW1lbnQgPSBfZWxlbWVudC5kb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB8fCAoX2VsZW1lbnQgPT09IG51bGwgfHwgX2VsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lbGVtZW50LmRvY3VtZW50RWxlbWVudCkgfHwgX2VsZW1lbnQ7XG5cdFx0aWYgKHggIT0gbnVsbCkgaW50ZXJuYWxYLnZhbHVlID0gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbExlZnQ7XG5cdFx0aWYgKHkgIT0gbnVsbCkgaW50ZXJuYWxZLnZhbHVlID0gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcDtcblx0fVxuXHRjb25zdCBpc1Njcm9sbGluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBhcnJpdmVkU3RhdGUgPSByZWFjdGl2ZSh7XG5cdFx0bGVmdDogdHJ1ZSxcblx0XHRyaWdodDogZmFsc2UsXG5cdFx0dG9wOiB0cnVlLFxuXHRcdGJvdHRvbTogZmFsc2Vcblx0fSk7XG5cdGNvbnN0IGRpcmVjdGlvbnMgPSByZWFjdGl2ZSh7XG5cdFx0bGVmdDogZmFsc2UsXG5cdFx0cmlnaHQ6IGZhbHNlLFxuXHRcdHRvcDogZmFsc2UsXG5cdFx0Ym90dG9tOiBmYWxzZVxuXHR9KTtcblx0Y29uc3Qgb25TY3JvbGxFbmQgPSAoZSkgPT4ge1xuXHRcdGlmICghaXNTY3JvbGxpbmcudmFsdWUpIHJldHVybjtcblx0XHRpc1Njcm9sbGluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdGRpcmVjdGlvbnMubGVmdCA9IGZhbHNlO1xuXHRcdGRpcmVjdGlvbnMucmlnaHQgPSBmYWxzZTtcblx0XHRkaXJlY3Rpb25zLnRvcCA9IGZhbHNlO1xuXHRcdGRpcmVjdGlvbnMuYm90dG9tID0gZmFsc2U7XG5cdFx0b25TdG9wKGUpO1xuXHR9O1xuXHRjb25zdCBvblNjcm9sbEVuZERlYm91bmNlZCA9IHVzZURlYm91bmNlRm4ob25TY3JvbGxFbmQsIHRocm90dGxlICsgaWRsZSk7XG5cdGNvbnN0IHNldEFycml2ZWRTdGF0ZSA9ICh0YXJnZXQpID0+IHtcblx0XHR2YXIgX2RvY3VtZW50Mjtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0Y29uc3QgZWwgPSAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwIHx8IChfZG9jdW1lbnQyID0gdGFyZ2V0LmRvY3VtZW50KSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZG9jdW1lbnQyLmRvY3VtZW50RWxlbWVudCkgfHwgKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldC5kb2N1bWVudEVsZW1lbnQpIHx8IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdGNvbnN0IHsgZGlzcGxheSwgZmxleERpcmVjdGlvbiwgZGlyZWN0aW9uIH0gPSB3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKGVsKTtcblx0XHRjb25zdCBkaXJlY3Rpb25NdWx0aXBsZXIgPSBkaXJlY3Rpb24gPT09IFwicnRsXCIgPyAtMSA6IDE7XG5cdFx0Y29uc3Qgc2Nyb2xsTGVmdCA9IGVsLnNjcm9sbExlZnQ7XG5cdFx0ZGlyZWN0aW9ucy5sZWZ0ID0gc2Nyb2xsTGVmdCA8IGludGVybmFsWC52YWx1ZTtcblx0XHRkaXJlY3Rpb25zLnJpZ2h0ID0gc2Nyb2xsTGVmdCA+IGludGVybmFsWC52YWx1ZTtcblx0XHRjb25zdCBsZWZ0ID0gTWF0aC5hYnMoc2Nyb2xsTGVmdCAqIGRpcmVjdGlvbk11bHRpcGxlcikgPD0gKG9mZnNldC5sZWZ0IHx8IDApO1xuXHRcdGNvbnN0IHJpZ2h0ID0gTWF0aC5hYnMoc2Nyb2xsTGVmdCAqIGRpcmVjdGlvbk11bHRpcGxlcikgKyBlbC5jbGllbnRXaWR0aCA+PSBlbC5zY3JvbGxXaWR0aCAtIChvZmZzZXQucmlnaHQgfHwgMCkgLSBBUlJJVkVEX1NUQVRFX1RIUkVTSE9MRF9QSVhFTFM7XG5cdFx0aWYgKGRpc3BsYXkgPT09IFwiZmxleFwiICYmIGZsZXhEaXJlY3Rpb24gPT09IFwicm93LXJldmVyc2VcIikge1xuXHRcdFx0YXJyaXZlZFN0YXRlLmxlZnQgPSByaWdodDtcblx0XHRcdGFycml2ZWRTdGF0ZS5yaWdodCA9IGxlZnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFycml2ZWRTdGF0ZS5sZWZ0ID0gbGVmdDtcblx0XHRcdGFycml2ZWRTdGF0ZS5yaWdodCA9IHJpZ2h0O1xuXHRcdH1cblx0XHRpbnRlcm5hbFgudmFsdWUgPSBzY3JvbGxMZWZ0O1xuXHRcdGxldCBzY3JvbGxUb3AgPSBlbC5zY3JvbGxUb3A7XG5cdFx0aWYgKHRhcmdldCA9PT0gd2luZG93JDEuZG9jdW1lbnQgJiYgIXNjcm9sbFRvcCkgc2Nyb2xsVG9wID0gd2luZG93JDEuZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG5cdFx0ZGlyZWN0aW9ucy50b3AgPSBzY3JvbGxUb3AgPCBpbnRlcm5hbFkudmFsdWU7XG5cdFx0ZGlyZWN0aW9ucy5ib3R0b20gPSBzY3JvbGxUb3AgPiBpbnRlcm5hbFkudmFsdWU7XG5cdFx0Y29uc3QgdG9wID0gTWF0aC5hYnMoc2Nyb2xsVG9wKSA8PSAob2Zmc2V0LnRvcCB8fCAwKTtcblx0XHRjb25zdCBib3R0b20gPSBNYXRoLmFicyhzY3JvbGxUb3ApICsgZWwuY2xpZW50SGVpZ2h0ID49IGVsLnNjcm9sbEhlaWdodCAtIChvZmZzZXQuYm90dG9tIHx8IDApIC0gQVJSSVZFRF9TVEFURV9USFJFU0hPTERfUElYRUxTO1xuXHRcdC8qKlxuXHRcdCogcmV2ZXJzZSBjb2x1bW5zIGFuZCByb3dzIGJlaGF2ZSBleGFjdGx5IHRoZSBvdGhlciB3YXkgYXJvdW5kLFxuXHRcdCogYm90dG9tIGlzIHRyZWF0ZWQgYXMgdG9wIGFuZCB0b3AgaXMgdHJlYXRlZCBhcyB0aGUgbmVnYXRpdmUgdmVyc2lvbiBvZiBib3R0b21cblx0XHQqL1xuXHRcdGlmIChkaXNwbGF5ID09PSBcImZsZXhcIiAmJiBmbGV4RGlyZWN0aW9uID09PSBcImNvbHVtbi1yZXZlcnNlXCIpIHtcblx0XHRcdGFycml2ZWRTdGF0ZS50b3AgPSBib3R0b207XG5cdFx0XHRhcnJpdmVkU3RhdGUuYm90dG9tID0gdG9wO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhcnJpdmVkU3RhdGUudG9wID0gdG9wO1xuXHRcdFx0YXJyaXZlZFN0YXRlLmJvdHRvbSA9IGJvdHRvbTtcblx0XHR9XG5cdFx0aW50ZXJuYWxZLnZhbHVlID0gc2Nyb2xsVG9wO1xuXHR9O1xuXHRjb25zdCBvblNjcm9sbEhhbmRsZXIgPSAoZSkgPT4ge1xuXHRcdHZhciBfZG9jdW1lbnRFbGVtZW50O1xuXHRcdGlmICghd2luZG93JDEpIHJldHVybjtcblx0XHRzZXRBcnJpdmVkU3RhdGUoKF9kb2N1bWVudEVsZW1lbnQgPSBlLnRhcmdldC5kb2N1bWVudEVsZW1lbnQpICE9PSBudWxsICYmIF9kb2N1bWVudEVsZW1lbnQgIT09IHZvaWQgMCA/IF9kb2N1bWVudEVsZW1lbnQgOiBlLnRhcmdldCk7XG5cdFx0aXNTY3JvbGxpbmcudmFsdWUgPSB0cnVlO1xuXHRcdG9uU2Nyb2xsRW5kRGVib3VuY2VkKGUpO1xuXHRcdG9uU2Nyb2xsKGUpO1xuXHR9O1xuXHR1c2VFdmVudExpc3RlbmVyKGVsZW1lbnQsIFwic2Nyb2xsXCIsIHRocm90dGxlID8gdXNlVGhyb3R0bGVGbihvblNjcm9sbEhhbmRsZXIsIHRocm90dGxlLCB0cnVlLCBmYWxzZSkgOiBvblNjcm9sbEhhbmRsZXIsIGV2ZW50TGlzdGVuZXJPcHRpb25zKTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgX2VsZW1lbnQgPSB0b1ZhbHVlKGVsZW1lbnQpO1xuXHRcdFx0aWYgKCFfZWxlbWVudCkgcmV0dXJuO1xuXHRcdFx0c2V0QXJyaXZlZFN0YXRlKF9lbGVtZW50KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fSk7XG5cdGlmICgob2JzZXJ2ZSA9PT0gbnVsbCB8fCBvYnNlcnZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvYnNlcnZlLm11dGF0aW9uKSAmJiBlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCAhPT0gd2luZG93JDEgJiYgZWxlbWVudCAhPT0gZG9jdW1lbnQpIHVzZU11dGF0aW9uT2JzZXJ2ZXIoZWxlbWVudCwgKCkgPT4ge1xuXHRcdGNvbnN0IF9lbGVtZW50ID0gdG9WYWx1ZShlbGVtZW50KTtcblx0XHRpZiAoIV9lbGVtZW50KSByZXR1cm47XG5cdFx0c2V0QXJyaXZlZFN0YXRlKF9lbGVtZW50KTtcblx0fSwge1xuXHRcdGF0dHJpYnV0ZXM6IHRydWUsXG5cdFx0Y2hpbGRMaXN0OiB0cnVlLFxuXHRcdHN1YnRyZWU6IHRydWVcblx0fSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgXCJzY3JvbGxlbmRcIiwgb25TY3JvbGxFbmQsIGV2ZW50TGlzdGVuZXJPcHRpb25zKTtcblx0cmV0dXJuIHtcblx0XHR4LFxuXHRcdHksXG5cdFx0aXNTY3JvbGxpbmcsXG5cdFx0YXJyaXZlZFN0YXRlLFxuXHRcdGRpcmVjdGlvbnMsXG5cdFx0bWVhc3VyZSgpIHtcblx0XHRcdGNvbnN0IF9lbGVtZW50ID0gdG9WYWx1ZShlbGVtZW50KTtcblx0XHRcdGlmICh3aW5kb3ckMSAmJiBfZWxlbWVudCkgc2V0QXJyaXZlZFN0YXRlKF9lbGVtZW50KTtcblx0XHR9XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUluZmluaXRlU2Nyb2xsL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgaW5maW5pdGUgc2Nyb2xsLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VJbmZpbml0ZVNjcm9sbFxuKi9cbmZ1bmN0aW9uIHVzZUluZmluaXRlU2Nyb2xsKGVsZW1lbnQsIG9uTG9hZE1vcmUsIG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkZGlzdGFuY2U7XG5cdGNvbnN0IHsgZGlyZWN0aW9uID0gXCJib3R0b21cIiwgaW50ZXJ2YWwgPSAxMDAsIGNhbkxvYWRNb3JlID0gKCkgPT4gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgc3RhdGUgPSByZWFjdGl2ZSh1c2VTY3JvbGwoZWxlbWVudCwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0b2Zmc2V0OiB7XG5cdFx0XHRbZGlyZWN0aW9uXTogKF9vcHRpb25zJGRpc3RhbmNlID0gb3B0aW9ucy5kaXN0YW5jZSkgIT09IG51bGwgJiYgX29wdGlvbnMkZGlzdGFuY2UgIT09IHZvaWQgMCA/IF9vcHRpb25zJGRpc3RhbmNlIDogMCxcblx0XHRcdC4uLm9wdGlvbnMub2Zmc2V0XG5cdFx0fVxuXHR9KSk7XG5cdGNvbnN0IHByb21pc2UgPSByZWYoKTtcblx0Y29uc3QgaXNMb2FkaW5nID0gY29tcHV0ZWQoKCkgPT4gISFwcm9taXNlLnZhbHVlKTtcblx0Y29uc3Qgb2JzZXJ2ZWRFbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsZW1lbnQpKTtcblx0fSk7XG5cdGNvbnN0IGlzRWxlbWVudFZpc2libGUgPSB1c2VFbGVtZW50VmlzaWJpbGl0eShvYnNlcnZlZEVsZW1lbnQpO1xuXHRjb25zdCBjYW5Mb2FkID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmICghb2JzZXJ2ZWRFbGVtZW50LnZhbHVlKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIGNhbkxvYWRNb3JlKG9ic2VydmVkRWxlbWVudC52YWx1ZSk7XG5cdH0pO1xuXHRmdW5jdGlvbiBjaGVja0FuZExvYWQoKSB7XG5cdFx0c3RhdGUubWVhc3VyZSgpO1xuXHRcdGlmICghb2JzZXJ2ZWRFbGVtZW50LnZhbHVlIHx8ICFpc0VsZW1lbnRWaXNpYmxlLnZhbHVlIHx8ICFjYW5Mb2FkLnZhbHVlIHx8IHByb21pc2UudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCB7IHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0LCBzY3JvbGxXaWR0aCwgY2xpZW50V2lkdGggfSA9IG9ic2VydmVkRWxlbWVudC52YWx1ZTtcblx0XHRjb25zdCBpc05hcnJvd2VyID0gZGlyZWN0aW9uID09PSBcImJvdHRvbVwiIHx8IGRpcmVjdGlvbiA9PT0gXCJ0b3BcIiA/IHNjcm9sbEhlaWdodCA8PSBjbGllbnRIZWlnaHQgOiBzY3JvbGxXaWR0aCA8PSBjbGllbnRXaWR0aDtcblx0XHRpZiAoc3RhdGUuYXJyaXZlZFN0YXRlW2RpcmVjdGlvbl0gfHwgaXNOYXJyb3dlcikgcHJvbWlzZS52YWx1ZSA9IFByb21pc2UuYWxsKFtvbkxvYWRNb3JlKHN0YXRlKSwgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgaW50ZXJ2YWwpKV0pLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0cHJvbWlzZS52YWx1ZSA9IG51bGw7XG5cdFx0XHRuZXh0VGljaygoKSA9PiBjaGVja0FuZExvYWQoKSk7XG5cdFx0fSk7XG5cdH1cblx0dHJ5T25Vbm1vdW50ZWQod2F0Y2goKCkgPT4gW1xuXHRcdHN0YXRlLmFycml2ZWRTdGF0ZVtkaXJlY3Rpb25dLFxuXHRcdGlzRWxlbWVudFZpc2libGUudmFsdWUsXG5cdFx0Y2FuTG9hZC52YWx1ZVxuXHRdLCBjaGVja0FuZExvYWQsIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pKTtcblx0cmV0dXJuIHtcblx0XHRpc0xvYWRpbmcsXG5cdFx0cmVzZXQoKSB7XG5cdFx0XHRuZXh0VGljaygoKSA9PiBjaGVja0FuZExvYWQoKSk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VLZXlNb2RpZmllci9pbmRleC50c1xuY29uc3QgZGVmYXVsdEV2ZW50cyA9IFtcblx0XCJtb3VzZWRvd25cIixcblx0XCJtb3VzZXVwXCIsXG5cdFwia2V5ZG93blwiLFxuXHRcImtleXVwXCJcbl07XG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlS2V5TW9kaWZpZXIobW9kaWZpZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50czogZXZlbnRzJDEgPSBkZWZhdWx0RXZlbnRzLCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgaW5pdGlhbCA9IG51bGwgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHN0YXRlID0gc2hhbGxvd1JlZihpbml0aWFsKTtcblx0aWYgKGRvY3VtZW50JDEpIGV2ZW50cyQxLmZvckVhY2goKGxpc3RlbmVyRXZlbnQpID0+IHtcblx0XHR1c2VFdmVudExpc3RlbmVyKGRvY3VtZW50JDEsIGxpc3RlbmVyRXZlbnQsIChldnQpID0+IHtcblx0XHRcdGlmICh0eXBlb2YgZXZ0LmdldE1vZGlmaWVyU3RhdGUgPT09IFwiZnVuY3Rpb25cIikgc3RhdGUudmFsdWUgPSBldnQuZ2V0TW9kaWZpZXJTdGF0ZShtb2RpZmllcik7XG5cdFx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR9KTtcblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VMb2NhbFN0b3JhZ2UvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBMb2NhbFN0b3JhZ2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUxvY2FsU3RvcmFnZVxuKiBAcGFyYW0ga2V5XG4qIEBwYXJhbSBpbml0aWFsVmFsdWVcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VMb2NhbFN0b3JhZ2Uoa2V5LCBpbml0aWFsVmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gdXNlU3RvcmFnZShrZXksIGluaXRpYWxWYWx1ZSwgd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmxvY2FsU3RvcmFnZSwgb3B0aW9ucyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1hZ2ljS2V5cy9hbGlhc01hcC50c1xuY29uc3QgRGVmYXVsdE1hZ2ljS2V5c0FsaWFzTWFwID0ge1xuXHRjdHJsOiBcImNvbnRyb2xcIixcblx0Y29tbWFuZDogXCJtZXRhXCIsXG5cdGNtZDogXCJtZXRhXCIsXG5cdG9wdGlvbjogXCJhbHRcIixcblx0dXA6IFwiYXJyb3d1cFwiLFxuXHRkb3duOiBcImFycm93ZG93blwiLFxuXHRsZWZ0OiBcImFycm93bGVmdFwiLFxuXHRyaWdodDogXCJhcnJvd3JpZ2h0XCJcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1hZ2ljS2V5cy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGtleXMgcHJlc3NlZCBzdGF0ZSwgd2l0aCBtYWdpY2FsIGtleXMgY29tYmluYXRpb24gc3VwcG9ydC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWFnaWNLZXlzXG4qL1xuZnVuY3Rpb24gdXNlTWFnaWNLZXlzKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHJlYWN0aXZlOiB1c2VSZWFjdGl2ZSA9IGZhbHNlLCB0YXJnZXQgPSBkZWZhdWx0V2luZG93LCBhbGlhc01hcCA9IERlZmF1bHRNYWdpY0tleXNBbGlhc01hcCwgcGFzc2l2ZSA9IHRydWUsIG9uRXZlbnRGaXJlZCA9IG5vb3AgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGN1cnJlbnQgPSByZWFjdGl2ZSgvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKTtcblx0Y29uc3Qgb2JqID0ge1xuXHRcdHRvSlNPTigpIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9LFxuXHRcdGN1cnJlbnRcblx0fTtcblx0Y29uc3QgcmVmcyA9IHVzZVJlYWN0aXZlID8gcmVhY3RpdmUob2JqKSA6IG9iajtcblx0Y29uc3QgbWV0YURlcHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRjb25zdCBkZXBzTWFwID0gbmV3IE1hcChbXG5cdFx0W1wiTWV0YVwiLCBtZXRhRGVwc10sXG5cdFx0W1wiU2hpZnRcIiwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKV0sXG5cdFx0W1wiQWx0XCIsIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCldXG5cdF0pO1xuXHRjb25zdCB1c2VkS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdGZ1bmN0aW9uIHNldFJlZnMoa2V5LCB2YWx1ZSkge1xuXHRcdGlmIChrZXkgaW4gcmVmcykgaWYgKHVzZVJlYWN0aXZlKSByZWZzW2tleV0gPSB2YWx1ZTtcblx0XHRlbHNlIHJlZnNba2V5XS52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXHRcdGN1cnJlbnQuY2xlYXIoKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiB1c2VkS2V5cykgc2V0UmVmcyhrZXksIGZhbHNlKTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGVEZXBzKHZhbHVlLCBlLCBrZXlzJDEpIHtcblx0XHRpZiAoIXZhbHVlIHx8IHR5cGVvZiBlLmdldE1vZGlmaWVyU3RhdGUgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgW21vZGlmaWVyLCBkZXBzU2V0XSBvZiBkZXBzTWFwKSBpZiAoZS5nZXRNb2RpZmllclN0YXRlKG1vZGlmaWVyKSkge1xuXHRcdFx0a2V5cyQxLmZvckVhY2goKGtleSkgPT4gZGVwc1NldC5hZGQoa2V5KSk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gY2xlYXJEZXBzKHZhbHVlLCBrZXkpIHtcblx0XHRpZiAodmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBkZXBzTWFwS2V5ID0gYCR7a2V5WzBdLnRvVXBwZXJDYXNlKCl9JHtrZXkuc2xpY2UoMSl9YDtcblx0XHRjb25zdCBkZXBzID0gZGVwc01hcC5nZXQoZGVwc01hcEtleSk7XG5cdFx0aWYgKCFbXCJzaGlmdFwiLCBcImFsdFwiXS5pbmNsdWRlcyhrZXkpIHx8ICFkZXBzKSByZXR1cm47XG5cdFx0Y29uc3QgZGVwc0FycmF5ID0gQXJyYXkuZnJvbShkZXBzKTtcblx0XHRjb25zdCBkZXBzSW5kZXggPSBkZXBzQXJyYXkuaW5kZXhPZihrZXkpO1xuXHRcdGRlcHNBcnJheS5mb3JFYWNoKChrZXkkMSwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCA+PSBkZXBzSW5kZXgpIHtcblx0XHRcdFx0Y3VycmVudC5kZWxldGUoa2V5JDEpO1xuXHRcdFx0XHRzZXRSZWZzKGtleSQxLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0ZGVwcy5jbGVhcigpO1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZVJlZnMoZSwgdmFsdWUpIHtcblx0XHR2YXIgX2Uka2V5LCBfZSRjb2RlO1xuXHRcdGNvbnN0IGtleSA9IChfZSRrZXkgPSBlLmtleSkgPT09IG51bGwgfHwgX2Uka2V5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZSRrZXkudG9Mb3dlckNhc2UoKTtcblx0XHRjb25zdCB2YWx1ZXMgPSBbKF9lJGNvZGUgPSBlLmNvZGUpID09PSBudWxsIHx8IF9lJGNvZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lJGNvZGUudG9Mb3dlckNhc2UoKSwga2V5XS5maWx0ZXIoQm9vbGVhbik7XG5cdFx0aWYgKCFrZXkpIHJldHVybjtcblx0XHRpZiAoa2V5KSBpZiAodmFsdWUpIGN1cnJlbnQuYWRkKGtleSk7XG5cdFx0ZWxzZSBjdXJyZW50LmRlbGV0ZShrZXkpO1xuXHRcdGZvciAoY29uc3Qga2V5JDEgb2YgdmFsdWVzKSB7XG5cdFx0XHR1c2VkS2V5cy5hZGQoa2V5JDEpO1xuXHRcdFx0c2V0UmVmcyhrZXkkMSwgdmFsdWUpO1xuXHRcdH1cblx0XHR1cGRhdGVEZXBzKHZhbHVlLCBlLCBbLi4uY3VycmVudCwgLi4udmFsdWVzXSk7XG5cdFx0Y2xlYXJEZXBzKHZhbHVlLCBrZXkpO1xuXHRcdGlmIChrZXkgPT09IFwibWV0YVwiICYmICF2YWx1ZSkge1xuXHRcdFx0bWV0YURlcHMuZm9yRWFjaCgoa2V5JDEpID0+IHtcblx0XHRcdFx0Y3VycmVudC5kZWxldGUoa2V5JDEpO1xuXHRcdFx0XHRzZXRSZWZzKGtleSQxLCBmYWxzZSk7XG5cdFx0XHR9KTtcblx0XHRcdG1ldGFEZXBzLmNsZWFyKCk7XG5cdFx0fVxuXHR9XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImtleWRvd25cIiwgKGUpID0+IHtcblx0XHR1cGRhdGVSZWZzKGUsIHRydWUpO1xuXHRcdHJldHVybiBvbkV2ZW50RmlyZWQoZSk7XG5cdH0sIHsgcGFzc2l2ZSB9KTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwia2V5dXBcIiwgKGUpID0+IHtcblx0XHR1cGRhdGVSZWZzKGUsIGZhbHNlKTtcblx0XHRyZXR1cm4gb25FdmVudEZpcmVkKGUpO1xuXHR9LCB7IHBhc3NpdmUgfSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHJlc2V0LCB7IHBhc3NpdmUgfSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCByZXNldCwgeyBwYXNzaXZlIH0pO1xuXHRjb25zdCBwcm94eSA9IG5ldyBQcm94eShyZWZzLCB7IGdldCh0YXJnZXQkMSwgcHJvcCwgcmVjKSB7XG5cdFx0aWYgKHR5cGVvZiBwcm9wICE9PSBcInN0cmluZ1wiKSByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0JDEsIHByb3AsIHJlYyk7XG5cdFx0cHJvcCA9IHByb3AudG9Mb3dlckNhc2UoKTtcblx0XHRpZiAocHJvcCBpbiBhbGlhc01hcCkgcHJvcCA9IGFsaWFzTWFwW3Byb3BdO1xuXHRcdGlmICghKHByb3AgaW4gcmVmcykpIGlmICgvWytfLV0vLnRlc3QocHJvcCkpIHtcblx0XHRcdGNvbnN0IGtleXMkMSA9IHByb3Auc3BsaXQoL1srXy1dL2cpLm1hcCgoaSkgPT4gaS50cmltKCkpO1xuXHRcdFx0cmVmc1twcm9wXSA9IGNvbXB1dGVkKCgpID0+IGtleXMkMS5tYXAoKGtleSkgPT4gdG9WYWx1ZShwcm94eVtrZXldKSkuZXZlcnkoQm9vbGVhbikpO1xuXHRcdH0gZWxzZSByZWZzW3Byb3BdID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdFx0Y29uc3QgciA9IFJlZmxlY3QuZ2V0KHRhcmdldCQxLCBwcm9wLCByZWMpO1xuXHRcdHJldHVybiB1c2VSZWFjdGl2ZSA/IHRvVmFsdWUocikgOiByO1xuXHR9IH0pO1xuXHRyZXR1cm4gcHJveHk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1lZGlhQ29udHJvbHMvaW5kZXgudHNcbi8qKlxuKiBBdXRvbWF0aWNhbGx5IGNoZWNrIGlmIHRoZSByZWYgZXhpc3RzIGFuZCBpZiBpdCBkb2VzIHJ1biB0aGUgY2IgZm5cbiovXG5mdW5jdGlvbiB1c2luZ0VsUmVmKHNvdXJjZSwgY2IpIHtcblx0aWYgKHRvVmFsdWUoc291cmNlKSkgY2IodG9WYWx1ZShzb3VyY2UpKTtcbn1cbi8qKlxuKiBDb252ZXJ0cyBhIFRpbWVSYW5nZSBvYmplY3QgdG8gYW4gYXJyYXlcbiovXG5mdW5jdGlvbiB0aW1lUmFuZ2VUb0FycmF5KHRpbWVSYW5nZXMpIHtcblx0bGV0IHJhbmdlcyA9IFtdO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVSYW5nZXMubGVuZ3RoOyArK2kpIHJhbmdlcyA9IFsuLi5yYW5nZXMsIFt0aW1lUmFuZ2VzLnN0YXJ0KGkpLCB0aW1lUmFuZ2VzLmVuZChpKV1dO1xuXHRyZXR1cm4gcmFuZ2VzO1xufVxuLyoqXG4qIENvbnZlcnRzIGEgVGV4dFRyYWNrTGlzdCBvYmplY3QgdG8gYW4gYXJyYXkgb2YgYFVzZU1lZGlhVGV4dFRyYWNrYFxuKi9cbmZ1bmN0aW9uIHRyYWNrc1RvQXJyYXkodHJhY2tzKSB7XG5cdHJldHVybiBBcnJheS5mcm9tKHRyYWNrcykubWFwKCh7IGxhYmVsLCBraW5kLCBsYW5ndWFnZSwgbW9kZSwgYWN0aXZlQ3VlcywgY3VlcywgaW5CYW5kTWV0YWRhdGFUcmFja0Rpc3BhdGNoVHlwZSB9LCBpZCkgPT4gKHtcblx0XHRpZCxcblx0XHRsYWJlbCxcblx0XHRraW5kLFxuXHRcdGxhbmd1YWdlLFxuXHRcdG1vZGUsXG5cdFx0YWN0aXZlQ3Vlcyxcblx0XHRjdWVzLFxuXHRcdGluQmFuZE1ldGFkYXRhVHJhY2tEaXNwYXRjaFR5cGVcblx0fSkpO1xufVxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG5cdHNyYzogXCJcIixcblx0dHJhY2tzOiBbXVxufTtcbmZ1bmN0aW9uIHVzZU1lZGlhQ29udHJvbHModGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0dGFyZ2V0ID0gdG9SZWYodGFyZ2V0KTtcblx0b3B0aW9ucyA9IHtcblx0XHQuLi5kZWZhdWx0T3B0aW9ucyxcblx0XHQuLi5vcHRpb25zXG5cdH07XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRjb25zdCBjdXJyZW50VGltZSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGR1cmF0aW9uID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3Qgc2Vla2luZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCB2b2x1bWUgPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCB3YWl0aW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGVuZGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHBsYXlpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgcmF0ZSA9IHNoYWxsb3dSZWYoMSk7XG5cdGNvbnN0IHN0YWxsZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgYnVmZmVyZWQgPSByZWYoW10pO1xuXHRjb25zdCB0cmFja3MgPSByZWYoW10pO1xuXHRjb25zdCBzZWxlY3RlZFRyYWNrID0gc2hhbGxvd1JlZigtMSk7XG5cdGNvbnN0IGlzUGljdHVyZUluUGljdHVyZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBtdXRlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmUgPSBCb29sZWFuKGRvY3VtZW50JDEgJiYgXCJwaWN0dXJlSW5QaWN0dXJlRW5hYmxlZFwiIGluIGRvY3VtZW50JDEpO1xuXHRjb25zdCBzb3VyY2VFcnJvckV2ZW50ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHBsYXliYWNrRXJyb3JFdmVudCA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHQvKipcblx0KiBEaXNhYmxlcyB0aGUgc3BlY2lmaWVkIHRyYWNrLiBJZiBubyB0cmFjayBpcyBzcGVjaWZpZWQgdGhlblxuXHQqIGFsbCB0cmFja3Mgd2lsbCBiZSBkaXNhYmxlZFxuXHQqXG5cdCogQHBhcmFtIHRyYWNrIFRoZSBpZCBvZiB0aGUgdHJhY2sgdG8gZGlzYWJsZVxuXHQqL1xuXHRjb25zdCBkaXNhYmxlVHJhY2sgPSAodHJhY2spID0+IHtcblx0XHR1c2luZ0VsUmVmKHRhcmdldCwgKGVsKSA9PiB7XG5cdFx0XHRpZiAodHJhY2spIHtcblx0XHRcdFx0Y29uc3QgaWQgPSB0eXBlb2YgdHJhY2sgPT09IFwibnVtYmVyXCIgPyB0cmFjayA6IHRyYWNrLmlkO1xuXHRcdFx0XHRlbC50ZXh0VHJhY2tzW2lkXS5tb2RlID0gXCJkaXNhYmxlZFwiO1xuXHRcdFx0fSBlbHNlIGZvciAobGV0IGkgPSAwOyBpIDwgZWwudGV4dFRyYWNrcy5sZW5ndGg7ICsraSkgZWwudGV4dFRyYWNrc1tpXS5tb2RlID0gXCJkaXNhYmxlZFwiO1xuXHRcdFx0c2VsZWN0ZWRUcmFjay52YWx1ZSA9IC0xO1xuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBFbmFibGVzIHRoZSBzcGVjaWZpZWQgdHJhY2sgYW5kIGRpc2FibGVzIHRoZVxuXHQqIG90aGVyIHRyYWNrcyB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZFxuXHQqXG5cdCogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayBvZiB0aGUgaWQgb2YgdGhlIHRyYWNrIHRvIGVuYWJsZVxuXHQqIEBwYXJhbSBkaXNhYmxlVHJhY2tzIERpc2FibGUgYWxsIG90aGVyIHRyYWNrc1xuXHQqL1xuXHRjb25zdCBlbmFibGVUcmFjayA9ICh0cmFjaywgZGlzYWJsZVRyYWNrcyA9IHRydWUpID0+IHtcblx0XHR1c2luZ0VsUmVmKHRhcmdldCwgKGVsKSA9PiB7XG5cdFx0XHRjb25zdCBpZCA9IHR5cGVvZiB0cmFjayA9PT0gXCJudW1iZXJcIiA/IHRyYWNrIDogdHJhY2suaWQ7XG5cdFx0XHRpZiAoZGlzYWJsZVRyYWNrcykgZGlzYWJsZVRyYWNrKCk7XG5cdFx0XHRlbC50ZXh0VHJhY2tzW2lkXS5tb2RlID0gXCJzaG93aW5nXCI7XG5cdFx0XHRzZWxlY3RlZFRyYWNrLnZhbHVlID0gaWQ7XG5cdFx0fSk7XG5cdH07XG5cdC8qKlxuXHQqIFRvZ2dsZSBwaWN0dXJlIGluIHBpY3R1cmUgbW9kZSBmb3IgdGhlIHBsYXllci5cblx0Ki9cblx0Y29uc3QgdG9nZ2xlUGljdHVyZUluUGljdHVyZSA9ICgpID0+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dXNpbmdFbFJlZih0YXJnZXQsIGFzeW5jIChlbCkgPT4ge1xuXHRcdFx0XHRpZiAoc3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlKSBpZiAoIWlzUGljdHVyZUluUGljdHVyZS52YWx1ZSkgZWwucmVxdWVzdFBpY3R1cmVJblBpY3R1cmUoKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG5cdFx0XHRcdGVsc2UgZG9jdW1lbnQkMS5leGl0UGljdHVyZUluUGljdHVyZSgpLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBpbmplY3Qgc291cmNlcyB0byB0aGUgbWVkaWEgZWxlbWVudC4gVGhlIHNvdXJjZXMgd2lsbCBiZVxuXHQqIGFwcGVuZGVkIGFzIGNoaWxkcmVuIHRvIHRoZSBtZWRpYSBlbGVtZW50IGFzIGA8c291cmNlPmAgZWxlbWVudHMuXG5cdCovXG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHJldHVybjtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0Y29uc3Qgc3JjID0gdG9WYWx1ZShvcHRpb25zLnNyYyk7XG5cdFx0bGV0IHNvdXJjZXMgPSBbXTtcblx0XHRpZiAoIXNyYykgcmV0dXJuO1xuXHRcdGlmICh0eXBlb2Ygc3JjID09PSBcInN0cmluZ1wiKSBzb3VyY2VzID0gW3sgc3JjIH1dO1xuXHRcdGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSkgc291cmNlcyA9IHNyYztcblx0XHRlbHNlIGlmIChpc09iamVjdChzcmMpKSBzb3VyY2VzID0gW3NyY107XG5cdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcInNvdXJjZVwiKS5mb3JFYWNoKChlKSA9PiB7XG5cdFx0XHRlLnJlbW92ZSgpO1xuXHRcdH0pO1xuXHRcdHNvdXJjZXMuZm9yRWFjaCgoeyBzcmM6IHNyYyQxLCB0eXBlLCBtZWRpYSB9KSA9PiB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoXCJzb3VyY2VcIik7XG5cdFx0XHRzb3VyY2Uuc2V0QXR0cmlidXRlKFwic3JjXCIsIHNyYyQxKTtcblx0XHRcdHNvdXJjZS5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIHR5cGUgfHwgXCJcIik7XG5cdFx0XHRzb3VyY2Uuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEgfHwgXCJcIik7XG5cdFx0XHR1c2VFdmVudExpc3RlbmVyKHNvdXJjZSwgXCJlcnJvclwiLCBzb3VyY2VFcnJvckV2ZW50LnRyaWdnZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0XHRlbC5hcHBlbmRDaGlsZChzb3VyY2UpO1xuXHRcdH0pO1xuXHRcdGVsLmxvYWQoKTtcblx0fSk7XG5cdC8qKlxuXHQqIEFwcGx5IGNvbXBvc2FibGUgc3RhdGUgdG8gdGhlIGVsZW1lbnQsIGFsc28gd2hlbiBlbGVtZW50IGlzIGNoYW5nZWRcblx0Ki9cblx0d2F0Y2goW3RhcmdldCwgdm9sdW1lXSwgKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRlbC52b2x1bWUgPSB2b2x1bWUudmFsdWU7XG5cdH0pO1xuXHR3YXRjaChbdGFyZ2V0LCBtdXRlZF0sICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwubXV0ZWQgPSBtdXRlZC52YWx1ZTtcblx0fSk7XG5cdHdhdGNoKFt0YXJnZXQsIHJhdGVdLCAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGVsLnBsYXliYWNrUmF0ZSA9IHJhdGUudmFsdWU7XG5cdH0pO1xuXHQvKipcblx0KiBMb2FkIFRyYWNrc1xuXHQqL1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKCFkb2N1bWVudCQxKSByZXR1cm47XG5cdFx0Y29uc3QgdGV4dFRyYWNrcyA9IHRvVmFsdWUob3B0aW9ucy50cmFja3MpO1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghdGV4dFRyYWNrcyB8fCAhdGV4dFRyYWNrcy5sZW5ndGggfHwgIWVsKSByZXR1cm47XG5cdFx0LyoqXG5cdFx0KiBUaGUgTWVkaWFBUEkgcHJvdmlkZXMgYW4gQVBJIGZvciBhZGRpbmcgdGV4dCB0cmFja3MsIGJ1dCB0aGV5IGRvbid0IGN1cnJlbnRseVxuXHRcdCogaGF2ZSBhbiBBUEkgZm9yIHJlbW92aW5nIHRleHQgdHJhY2tzLCBzbyBpbnN0ZWFkIHdlIHdpbGwganVzdCBjcmVhdGUgYW5kIHJlbW92ZVxuXHRcdCogdGhlIHRyYWNrcyBtYW51YWxseSB1c2luZyB0aGUgSFRNTCBhcGkuXG5cdFx0Ki9cblx0XHRlbC5xdWVyeVNlbGVjdG9yQWxsKFwidHJhY2tcIikuZm9yRWFjaCgoZSkgPT4gZS5yZW1vdmUoKSk7XG5cdFx0dGV4dFRyYWNrcy5mb3JFYWNoKCh7IGRlZmF1bHQ6IGlzRGVmYXVsdCwga2luZCwgbGFiZWwsIHNyYywgc3JjTGFuZyB9LCBpKSA9PiB7XG5cdFx0XHRjb25zdCB0cmFjayA9IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChcInRyYWNrXCIpO1xuXHRcdFx0dHJhY2suZGVmYXVsdCA9IGlzRGVmYXVsdCB8fCBmYWxzZTtcblx0XHRcdHRyYWNrLmtpbmQgPSBraW5kO1xuXHRcdFx0dHJhY2subGFiZWwgPSBsYWJlbDtcblx0XHRcdHRyYWNrLnNyYyA9IHNyYztcblx0XHRcdHRyYWNrLnNyY2xhbmcgPSBzcmNMYW5nO1xuXHRcdFx0aWYgKHRyYWNrLmRlZmF1bHQpIHNlbGVjdGVkVHJhY2sudmFsdWUgPSBpO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQodHJhY2spO1xuXHRcdH0pO1xuXHR9KTtcblx0LyoqXG5cdCogVGhpcyB3aWxsIGFsbG93IHVzIHRvIHVwZGF0ZSB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIHRpbWV1cGRhdGUgZXZlbnRcblx0KiB3aXRob3V0IHNldHRpbmcgdGhlIG1lZGlhcyBjdXJyZW50IHBvc2l0aW9uLCBidXQgaWYgdGhlIHVzZXIgY2hhbmdlcyB0aGVcblx0KiBjdXJyZW50IHRpbWUgdmlhIHRoZSByZWYsIHRoZW4gdGhlIG1lZGlhIHdpbGwgc2Vlay5cblx0KlxuXHQqIElmIHdlIGRpZCBub3QgdXNlIGFuIGlnbm9yYWJsZSB3YXRjaCwgdGhlbiB0aGUgY3VycmVudCB0aW1lIHVwZGF0ZSBmcm9tXG5cdCogdGhlIHRpbWV1cGRhdGUgZXZlbnQgd291bGQgY2F1c2UgdGhlIG1lZGlhIHRvIHN0dXR0ZXIuXG5cdCovXG5cdGNvbnN0IHsgaWdub3JlVXBkYXRlczogaWdub3JlQ3VycmVudFRpbWVVcGRhdGVzIH0gPSB3YXRjaElnbm9yYWJsZShjdXJyZW50VGltZSwgKHRpbWUpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwuY3VycmVudFRpbWUgPSB0aW1lO1xuXHR9KTtcblx0LyoqXG5cdCogVXNpbmcgYW4gaWdub3JhYmxlIHdhdGNoIHNvIHdlIGNhbiBjb250cm9sIHRoZSBwbGF5IHN0YXRlIHVzaW5nIGEgcmVmIGFuZCBub3Rcblx0KiBhIGZ1bmN0aW9uXG5cdCovXG5cdGNvbnN0IHsgaWdub3JlVXBkYXRlczogaWdub3JlUGxheWluZ1VwZGF0ZXMgfSA9IHdhdGNoSWdub3JhYmxlKHBsYXlpbmcsIChpc1BsYXlpbmcpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0aWYgKGlzUGxheWluZykgZWwucGxheSgpLmNhdGNoKChlKSA9PiB7XG5cdFx0XHRwbGF5YmFja0Vycm9yRXZlbnQudHJpZ2dlcihlKTtcblx0XHRcdHRocm93IGU7XG5cdFx0fSk7XG5cdFx0ZWxzZSBlbC5wYXVzZSgpO1xuXHR9KTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidGltZXVwZGF0ZVwiLCAoKSA9PiBpZ25vcmVDdXJyZW50VGltZVVwZGF0ZXMoKCkgPT4gY3VycmVudFRpbWUudmFsdWUgPSB0b1ZhbHVlKHRhcmdldCkuY3VycmVudFRpbWUpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkdXJhdGlvbmNoYW5nZVwiLCAoKSA9PiBkdXJhdGlvbi52YWx1ZSA9IHRvVmFsdWUodGFyZ2V0KS5kdXJhdGlvbiwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicHJvZ3Jlc3NcIiwgKCkgPT4gYnVmZmVyZWQudmFsdWUgPSB0aW1lUmFuZ2VUb0FycmF5KHRvVmFsdWUodGFyZ2V0KS5idWZmZXJlZCksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInNlZWtpbmdcIiwgKCkgPT4gc2Vla2luZy52YWx1ZSA9IHRydWUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInNlZWtlZFwiLCAoKSA9PiBzZWVraW5nLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXCJ3YWl0aW5nXCIsIFwibG9hZHN0YXJ0XCJdLCAoKSA9PiB7XG5cdFx0d2FpdGluZy52YWx1ZSA9IHRydWU7XG5cdFx0aWdub3JlUGxheWluZ1VwZGF0ZXMoKCkgPT4gcGxheWluZy52YWx1ZSA9IGZhbHNlKTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwibG9hZGVkZGF0YVwiLCAoKSA9PiB3YWl0aW5nLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBsYXlpbmdcIiwgKCkgPT4ge1xuXHRcdHdhaXRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRlbmRlZC52YWx1ZSA9IGZhbHNlO1xuXHRcdGlnbm9yZVBsYXlpbmdVcGRhdGVzKCgpID0+IHBsYXlpbmcudmFsdWUgPSB0cnVlKTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicmF0ZWNoYW5nZVwiLCAoKSA9PiByYXRlLnZhbHVlID0gdG9WYWx1ZSh0YXJnZXQpLnBsYXliYWNrUmF0ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwic3RhbGxlZFwiLCAoKSA9PiBzdGFsbGVkLnZhbHVlID0gdHJ1ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZW5kZWRcIiwgKCkgPT4gZW5kZWQudmFsdWUgPSB0cnVlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwYXVzZVwiLCAoKSA9PiBpZ25vcmVQbGF5aW5nVXBkYXRlcygoKSA9PiBwbGF5aW5nLnZhbHVlID0gZmFsc2UpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwbGF5XCIsICgpID0+IGlnbm9yZVBsYXlpbmdVcGRhdGVzKCgpID0+IHBsYXlpbmcudmFsdWUgPSB0cnVlKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZW50ZXJwaWN0dXJlaW5waWN0dXJlXCIsICgpID0+IGlzUGljdHVyZUluUGljdHVyZS52YWx1ZSA9IHRydWUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImxlYXZlcGljdHVyZWlucGljdHVyZVwiLCAoKSA9PiBpc1BpY3R1cmVJblBpY3R1cmUudmFsdWUgPSBmYWxzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidm9sdW1lY2hhbmdlXCIsICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0dm9sdW1lLnZhbHVlID0gZWwudm9sdW1lO1xuXHRcdG11dGVkLnZhbHVlID0gZWwubXV0ZWQ7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdC8qKlxuXHQqIFRoZSBmb2xsb3dpbmcgbGlzdGVuZXJzIG5lZWQgdG8gbGlzdGVuIHRvIGEgbmVzdGVkXG5cdCogb2JqZWN0IG9uIHRoZSB0YXJnZXQsIHNvIHdlIHdpbGwgaGF2ZSB0byB1c2UgYSBuZXN0ZWRcblx0KiB3YXRjaCBhbmQgbWFudWFsbHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnNcblx0Ki9cblx0Y29uc3QgbGlzdGVuZXJzID0gW107XG5cdGNvbnN0IHN0b3AgPSB3YXRjaChbdGFyZ2V0XSwgKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRzdG9wKCk7XG5cdFx0bGlzdGVuZXJzWzBdID0gdXNlRXZlbnRMaXN0ZW5lcihlbC50ZXh0VHJhY2tzLCBcImFkZHRyYWNrXCIsICgpID0+IHRyYWNrcy52YWx1ZSA9IHRyYWNrc1RvQXJyYXkoZWwudGV4dFRyYWNrcyksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0bGlzdGVuZXJzWzFdID0gdXNlRXZlbnRMaXN0ZW5lcihlbC50ZXh0VHJhY2tzLCBcInJlbW92ZXRyYWNrXCIsICgpID0+IHRyYWNrcy52YWx1ZSA9IHRyYWNrc1RvQXJyYXkoZWwudGV4dFRyYWNrcyksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0bGlzdGVuZXJzWzJdID0gdXNlRXZlbnRMaXN0ZW5lcihlbC50ZXh0VHJhY2tzLCBcImNoYW5nZVwiLCAoKSA9PiB0cmFja3MudmFsdWUgPSB0cmFja3NUb0FycmF5KGVsLnRleHRUcmFja3MpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4gbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcigpKSk7XG5cdHJldHVybiB7XG5cdFx0Y3VycmVudFRpbWUsXG5cdFx0ZHVyYXRpb24sXG5cdFx0d2FpdGluZyxcblx0XHRzZWVraW5nLFxuXHRcdGVuZGVkLFxuXHRcdHN0YWxsZWQsXG5cdFx0YnVmZmVyZWQsXG5cdFx0cGxheWluZyxcblx0XHRyYXRlLFxuXHRcdHZvbHVtZSxcblx0XHRtdXRlZCxcblx0XHR0cmFja3MsXG5cdFx0c2VsZWN0ZWRUcmFjayxcblx0XHRlbmFibGVUcmFjayxcblx0XHRkaXNhYmxlVHJhY2ssXG5cdFx0c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlLFxuXHRcdHRvZ2dsZVBpY3R1cmVJblBpY3R1cmUsXG5cdFx0aXNQaWN0dXJlSW5QaWN0dXJlLFxuXHRcdG9uU291cmNlRXJyb3I6IHNvdXJjZUVycm9yRXZlbnQub24sXG5cdFx0b25QbGF5YmFja0Vycm9yOiBwbGF5YmFja0Vycm9yRXZlbnQub25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTWVtb2l6ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGZ1bmN0aW9uIHJlc3VsdCBjYWNoZSBiYXNlZCBvbiBhcmd1bWVudHNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VNZW1vaXplKHJlc29sdmVyLCBvcHRpb25zKSB7XG5cdGNvbnN0IGluaXRDYWNoZSA9ICgpID0+IHtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhY2hlKSByZXR1cm4gc2hhbGxvd1JlYWN0aXZlKG9wdGlvbnMuY2FjaGUpO1xuXHRcdHJldHVybiBzaGFsbG93UmVhY3RpdmUoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7XG5cdH07XG5cdGNvbnN0IGNhY2hlID0gaW5pdENhY2hlKCk7XG5cdC8qKlxuXHQqIEdlbmVyYXRlIGtleSBmcm9tIGFyZ3Ncblx0Ki9cblx0Y29uc3QgZ2VuZXJhdGVLZXkgPSAoLi4uYXJncykgPT4gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5nZXRLZXkpID8gb3B0aW9ucy5nZXRLZXkoLi4uYXJncykgOiBKU09OLnN0cmluZ2lmeShhcmdzKTtcblx0LyoqXG5cdCogTG9hZCBkYXRhIGFuZCBzYXZlIGluIGNhY2hlXG5cdCovXG5cdGNvbnN0IF9sb2FkRGF0YSA9IChrZXksIC4uLmFyZ3MpID0+IHtcblx0XHRjYWNoZS5zZXQoa2V5LCByZXNvbHZlciguLi5hcmdzKSk7XG5cdFx0cmV0dXJuIGNhY2hlLmdldChrZXkpO1xuXHR9O1xuXHRjb25zdCBsb2FkRGF0YSA9ICguLi5hcmdzKSA9PiBfbG9hZERhdGEoZ2VuZXJhdGVLZXkoLi4uYXJncyksIC4uLmFyZ3MpO1xuXHQvKipcblx0KiBEZWxldGUga2V5IGZyb20gY2FjaGVcblx0Ki9cblx0Y29uc3QgZGVsZXRlRGF0YSA9ICguLi5hcmdzKSA9PiB7XG5cdFx0Y2FjaGUuZGVsZXRlKGdlbmVyYXRlS2V5KC4uLmFyZ3MpKTtcblx0fTtcblx0LyoqXG5cdCogQ2xlYXIgY2FjaGVkIGRhdGFcblx0Ki9cblx0Y29uc3QgY2xlYXJEYXRhID0gKCkgPT4ge1xuXHRcdGNhY2hlLmNsZWFyKCk7XG5cdH07XG5cdGNvbnN0IG1lbW9pemVkID0gKC4uLmFyZ3MpID0+IHtcblx0XHRjb25zdCBrZXkgPSBnZW5lcmF0ZUtleSguLi5hcmdzKTtcblx0XHRpZiAoY2FjaGUuaGFzKGtleSkpIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcblx0XHRyZXR1cm4gX2xvYWREYXRhKGtleSwgLi4uYXJncyk7XG5cdH07XG5cdG1lbW9pemVkLmxvYWQgPSBsb2FkRGF0YTtcblx0bWVtb2l6ZWQuZGVsZXRlID0gZGVsZXRlRGF0YTtcblx0bWVtb2l6ZWQuY2xlYXIgPSBjbGVhckRhdGE7XG5cdG1lbW9pemVkLmdlbmVyYXRlS2V5ID0gZ2VuZXJhdGVLZXk7XG5cdG1lbW9pemVkLmNhY2hlID0gY2FjaGU7XG5cdHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTWVtb3J5L2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDYob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlQ2FsbGJhY2tcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IDFlMywgaW1tZWRpYXRlLCBpbW1lZGlhdGVDYWxsYmFjayB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCBpbnRlcnZhbCwge1xuXHRcdFx0aW1tZWRpYXRlLFxuXHRcdFx0aW1tZWRpYXRlQ2FsbGJhY2tcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gdXNlSW50ZXJ2YWxGbjtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBNZW1vcnkgSW5mby5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWVtb3J5XG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTWVtb3J5KG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBtZW1vcnkgPSByZWYoKTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBcIm1lbW9yeVwiIGluIHBlcmZvcm1hbmNlKTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0Y29uc3QgeyBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDYgfSA9IG9wdGlvbnM7XG5cdFx0c2NoZWR1bGVyKCgpID0+IHtcblx0XHRcdG1lbW9yeS52YWx1ZSA9IHBlcmZvcm1hbmNlLm1lbW9yeTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdG1lbW9yeVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNb3VzZS9pbmRleC50c1xuY29uc3QgVXNlTW91c2VCdWlsdGluRXh0cmFjdG9ycyA9IHtcblx0cGFnZTogKGV2ZW50KSA9PiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXSxcblx0Y2xpZW50OiAoZXZlbnQpID0+IFtldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZXSxcblx0c2NyZWVuOiAoZXZlbnQpID0+IFtldmVudC5zY3JlZW5YLCBldmVudC5zY3JlZW5ZXSxcblx0bW92ZW1lbnQ6IChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ID8gW2V2ZW50Lm1vdmVtZW50WCwgZXZlbnQubW92ZW1lbnRZXSA6IG51bGxcbn07XG4vKipcbiogUmVhY3RpdmUgbW91c2UgcG9zaXRpb24uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1vdXNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTW91c2Uob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdHlwZSA9IFwicGFnZVwiLCB0b3VjaCA9IHRydWUsIHJlc2V0T25Ub3VjaEVuZHMgPSBmYWxzZSwgaW5pdGlhbFZhbHVlID0ge1xuXHRcdHg6IDAsXG5cdFx0eTogMFxuXHR9LCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgdGFyZ2V0ID0gd2luZG93JDEsIHNjcm9sbCA9IHRydWUsIGV2ZW50RmlsdGVyIH0gPSBvcHRpb25zO1xuXHRsZXQgX3ByZXZNb3VzZUV2ZW50ID0gbnVsbDtcblx0bGV0IF9wcmV2U2Nyb2xsWCA9IDA7XG5cdGxldCBfcHJldlNjcm9sbFkgPSAwO1xuXHRjb25zdCB4ID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUueCk7XG5cdGNvbnN0IHkgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZS55KTtcblx0Y29uc3Qgc291cmNlVHlwZSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGV4dHJhY3RvciA9IHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIgPyB0eXBlIDogVXNlTW91c2VCdWlsdGluRXh0cmFjdG9yc1t0eXBlXTtcblx0Y29uc3QgbW91c2VIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZXh0cmFjdG9yKGV2ZW50KTtcblx0XHRfcHJldk1vdXNlRXZlbnQgPSBldmVudDtcblx0XHRpZiAocmVzdWx0KSB7XG5cdFx0XHRbeC52YWx1ZSwgeS52YWx1ZV0gPSByZXN1bHQ7XG5cdFx0XHRzb3VyY2VUeXBlLnZhbHVlID0gXCJtb3VzZVwiO1xuXHRcdH1cblx0XHRpZiAod2luZG93JDEpIHtcblx0XHRcdF9wcmV2U2Nyb2xsWCA9IHdpbmRvdyQxLnNjcm9sbFg7XG5cdFx0XHRfcHJldlNjcm9sbFkgPSB3aW5kb3ckMS5zY3JvbGxZO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgdG91Y2hIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0aWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gZXh0cmFjdG9yKGV2ZW50LnRvdWNoZXNbMF0pO1xuXHRcdFx0aWYgKHJlc3VsdCkge1xuXHRcdFx0XHRbeC52YWx1ZSwgeS52YWx1ZV0gPSByZXN1bHQ7XG5cdFx0XHRcdHNvdXJjZVR5cGUudmFsdWUgPSBcInRvdWNoXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzY3JvbGxIYW5kbGVyID0gKCkgPT4ge1xuXHRcdGlmICghX3ByZXZNb3VzZUV2ZW50IHx8ICF3aW5kb3ckMSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvcyA9IGV4dHJhY3RvcihfcHJldk1vdXNlRXZlbnQpO1xuXHRcdGlmIChfcHJldk1vdXNlRXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ICYmIHBvcykge1xuXHRcdFx0eC52YWx1ZSA9IHBvc1swXSArIHdpbmRvdyQxLnNjcm9sbFggLSBfcHJldlNjcm9sbFg7XG5cdFx0XHR5LnZhbHVlID0gcG9zWzFdICsgd2luZG93JDEuc2Nyb2xsWSAtIF9wcmV2U2Nyb2xsWTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdHgudmFsdWUgPSBpbml0aWFsVmFsdWUueDtcblx0XHR5LnZhbHVlID0gaW5pdGlhbFZhbHVlLnk7XG5cdH07XG5cdGNvbnN0IG1vdXNlSGFuZGxlcldyYXBwZXIgPSBldmVudEZpbHRlciA/IChldmVudCkgPT4gZXZlbnRGaWx0ZXIoKCkgPT4gbW91c2VIYW5kbGVyKGV2ZW50KSwge30pIDogKGV2ZW50KSA9PiBtb3VzZUhhbmRsZXIoZXZlbnQpO1xuXHRjb25zdCB0b3VjaEhhbmRsZXJXcmFwcGVyID0gZXZlbnRGaWx0ZXIgPyAoZXZlbnQpID0+IGV2ZW50RmlsdGVyKCgpID0+IHRvdWNoSGFuZGxlcihldmVudCksIHt9KSA6IChldmVudCkgPT4gdG91Y2hIYW5kbGVyKGV2ZW50KTtcblx0Y29uc3Qgc2Nyb2xsSGFuZGxlcldyYXBwZXIgPSBldmVudEZpbHRlciA/ICgpID0+IGV2ZW50RmlsdGVyKCgpID0+IHNjcm9sbEhhbmRsZXIoKSwge30pIDogKCkgPT4gc2Nyb2xsSGFuZGxlcigpO1xuXHRpZiAodGFyZ2V0KSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcIm1vdXNlbW92ZVwiLCBcImRyYWdvdmVyXCJdLCBtb3VzZUhhbmRsZXJXcmFwcGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGlmICh0b3VjaCAmJiB0eXBlICE9PSBcIm1vdmVtZW50XCIpIHtcblx0XHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXCJ0b3VjaHN0YXJ0XCIsIFwidG91Y2htb3ZlXCJdLCB0b3VjaEhhbmRsZXJXcmFwcGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdFx0aWYgKHJlc2V0T25Ub3VjaEVuZHMpIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRvdWNoZW5kXCIsIHJlc2V0LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdH1cblx0XHRpZiAoc2Nyb2xsICYmIHR5cGUgPT09IFwicGFnZVwiKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInNjcm9sbFwiLCBzY3JvbGxIYW5kbGVyV3JhcHBlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHgsXG5cdFx0eSxcblx0XHRzb3VyY2VUeXBlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1vdXNlSW5FbGVtZW50L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgbW91c2UgcG9zaXRpb24gcmVsYXRlZCB0byBhbiBlbGVtZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNb3VzZUluRWxlbWVudFxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTW91c2VJbkVsZW1lbnQodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3dSZXNpemUgPSB0cnVlLCB3aW5kb3dTY3JvbGwgPSB0cnVlLCBoYW5kbGVPdXRzaWRlID0gdHJ1ZSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHR5cGUgPSBvcHRpb25zLnR5cGUgfHwgXCJwYWdlXCI7XG5cdGNvbnN0IHsgeCwgeSwgc291cmNlVHlwZSB9ID0gdXNlTW91c2Uob3B0aW9ucyk7XG5cdGNvbnN0IHRhcmdldFJlZiA9IHNoYWxsb3dSZWYodGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmRvY3VtZW50LmJvZHkpO1xuXHRjb25zdCBlbGVtZW50WCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGVsZW1lbnRZID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZWxlbWVudFBvc2l0aW9uWCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGVsZW1lbnRQb3NpdGlvblkgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBlbGVtZW50SGVpZ2h0ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZWxlbWVudFdpZHRoID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgaXNPdXRzaWRlID0gc2hhbGxvd1JlZih0cnVlKTtcblx0ZnVuY3Rpb24gdXBkYXRlKCkge1xuXHRcdGlmICghd2luZG93JDEpIHJldHVybjtcblx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXRSZWYpO1xuXHRcdGlmICghZWwgfHwgIShlbCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XG5cdFx0Zm9yIChjb25zdCByZWN0IG9mIGVsLmdldENsaWVudFJlY3RzKCkpIHtcblx0XHRcdGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSByZWN0O1xuXHRcdFx0ZWxlbWVudFBvc2l0aW9uWC52YWx1ZSA9IGxlZnQgKyAodHlwZSA9PT0gXCJwYWdlXCIgPyB3aW5kb3ckMS5wYWdlWE9mZnNldCA6IDApO1xuXHRcdFx0ZWxlbWVudFBvc2l0aW9uWS52YWx1ZSA9IHRvcCArICh0eXBlID09PSBcInBhZ2VcIiA/IHdpbmRvdyQxLnBhZ2VZT2Zmc2V0IDogMCk7XG5cdFx0XHRlbGVtZW50SGVpZ2h0LnZhbHVlID0gaGVpZ2h0O1xuXHRcdFx0ZWxlbWVudFdpZHRoLnZhbHVlID0gd2lkdGg7XG5cdFx0XHRjb25zdCBlbFggPSB4LnZhbHVlIC0gZWxlbWVudFBvc2l0aW9uWC52YWx1ZTtcblx0XHRcdGNvbnN0IGVsWSA9IHkudmFsdWUgLSBlbGVtZW50UG9zaXRpb25ZLnZhbHVlO1xuXHRcdFx0aXNPdXRzaWRlLnZhbHVlID0gd2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwIHx8IGVsWCA8IDAgfHwgZWxZIDwgMCB8fCBlbFggPiB3aWR0aCB8fCBlbFkgPiBoZWlnaHQ7XG5cdFx0XHRpZiAoaGFuZGxlT3V0c2lkZSB8fCAhaXNPdXRzaWRlLnZhbHVlKSB7XG5cdFx0XHRcdGVsZW1lbnRYLnZhbHVlID0gZWxYO1xuXHRcdFx0XHRlbGVtZW50WS52YWx1ZSA9IGVsWTtcblx0XHRcdH1cblx0XHRcdGlmICghaXNPdXRzaWRlLnZhbHVlKSBicmVhaztcblx0XHR9XG5cdH1cblx0Y29uc3Qgc3RvcEZuTGlzdCA9IFtdO1xuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdHN0b3BGbkxpc3QuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRcdHN0b3BGbkxpc3QubGVuZ3RoID0gMDtcblx0fVxuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdHVwZGF0ZSgpO1xuXHR9KTtcblx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0Y29uc3QgeyBzdG9wOiBzdG9wUmVzaXplT2JzZXJ2ZXIgfSA9IHVzZVJlc2l6ZU9ic2VydmVyKHRhcmdldFJlZiwgdXBkYXRlKTtcblx0XHRjb25zdCB7IHN0b3A6IHN0b3BNdXRhdGlvbk9ic2VydmVyIH0gPSB1c2VNdXRhdGlvbk9ic2VydmVyKHRhcmdldFJlZiwgdXBkYXRlLCB7IGF0dHJpYnV0ZUZpbHRlcjogW1wic3R5bGVcIiwgXCJjbGFzc1wiXSB9KTtcblx0XHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaChbXG5cdFx0XHR0YXJnZXRSZWYsXG5cdFx0XHR4LFxuXHRcdFx0eVxuXHRcdF0sIHVwZGF0ZSk7XG5cdFx0c3RvcEZuTGlzdC5wdXNoKHN0b3BSZXNpemVPYnNlcnZlciwgc3RvcE11dGF0aW9uT2JzZXJ2ZXIsIHN0b3BXYXRjaCk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJtb3VzZWxlYXZlXCIsICgpID0+IGlzT3V0c2lkZS52YWx1ZSA9IHRydWUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHRpZiAod2luZG93U2Nyb2xsKSBzdG9wRm5MaXN0LnB1c2godXNlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB1cGRhdGUsIHtcblx0XHRcdGNhcHR1cmU6IHRydWUsXG5cdFx0XHRwYXNzaXZlOiB0cnVlXG5cdFx0fSkpO1xuXHRcdGlmICh3aW5kb3dSZXNpemUpIHN0b3BGbkxpc3QucHVzaCh1c2VFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHgsXG5cdFx0eSxcblx0XHRzb3VyY2VUeXBlLFxuXHRcdGVsZW1lbnRYLFxuXHRcdGVsZW1lbnRZLFxuXHRcdGVsZW1lbnRQb3NpdGlvblgsXG5cdFx0ZWxlbWVudFBvc2l0aW9uWSxcblx0XHRlbGVtZW50SGVpZ2h0LFxuXHRcdGVsZW1lbnRXaWR0aCxcblx0XHRpc091dHNpZGUsXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNb3VzZVByZXNzZWQvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBtb3VzZSBwcmVzc2luZyBzdGF0ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTW91c2VQcmVzc2VkXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTW91c2VQcmVzc2VkKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRvdWNoID0gdHJ1ZSwgZHJhZyA9IHRydWUsIGNhcHR1cmUgPSBmYWxzZSwgaW5pdGlhbFZhbHVlID0gZmFsc2UsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBwcmVzc2VkID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBzb3VyY2VUeXBlID0gc2hhbGxvd1JlZihudWxsKTtcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHtcblx0XHRwcmVzc2VkLFxuXHRcdHNvdXJjZVR5cGVcblx0fTtcblx0Y29uc3Qgb25QcmVzc2VkID0gKHNyY1R5cGUpID0+IChldmVudCkgPT4ge1xuXHRcdHZhciBfb3B0aW9ucyRvblByZXNzZWQ7XG5cdFx0cHJlc3NlZC52YWx1ZSA9IHRydWU7XG5cdFx0c291cmNlVHlwZS52YWx1ZSA9IHNyY1R5cGU7XG5cdFx0KF9vcHRpb25zJG9uUHJlc3NlZCA9IG9wdGlvbnMub25QcmVzc2VkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblByZXNzZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvblByZXNzZWQuY2FsbChvcHRpb25zLCBldmVudCk7XG5cdH07XG5cdGNvbnN0IG9uUmVsZWFzZWQgPSAoZXZlbnQpID0+IHtcblx0XHR2YXIgX29wdGlvbnMkb25SZWxlYXNlZDtcblx0XHRwcmVzc2VkLnZhbHVlID0gZmFsc2U7XG5cdFx0c291cmNlVHlwZS52YWx1ZSA9IG51bGw7XG5cdFx0KF9vcHRpb25zJG9uUmVsZWFzZWQgPSBvcHRpb25zLm9uUmVsZWFzZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uUmVsZWFzZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvblJlbGVhc2VkLmNhbGwob3B0aW9ucywgZXZlbnQpO1xuXHR9O1xuXHRjb25zdCB0YXJnZXQgPSBjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQob3B0aW9ucy50YXJnZXQpIHx8IHdpbmRvdyQxKTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdHBhc3NpdmU6IHRydWUsXG5cdFx0Y2FwdHVyZVxuXHR9O1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJtb3VzZWRvd25cIiwgb25QcmVzc2VkKFwibW91c2VcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwibW91c2VsZWF2ZVwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm1vdXNldXBcIiwgb25SZWxlYXNlZCwgbGlzdGVuZXJPcHRpb25zKTtcblx0aWYgKGRyYWcpIHtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkcmFnc3RhcnRcIiwgb25QcmVzc2VkKFwibW91c2VcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkcm9wXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkcmFnZW5kXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0aWYgKHRvdWNoKSB7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidG91Y2hzdGFydFwiLCBvblByZXNzZWQoXCJ0b3VjaFwiKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInRvdWNoZW5kXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJ0b3VjaGNhbmNlbFwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0cHJlc3NlZCxcblx0XHRzb3VyY2VUeXBlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU5hdmlnYXRvckxhbmd1YWdlL2luZGV4LnRzXG4vKipcbipcbiogUmVhY3RpdmUgdXNlTmF2aWdhdG9yTGFuZ3VhZ2VcbipcbiogRGV0ZWN0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHVzZXIgbGFuZ3VhZ2UgYW5kIHJldHVybnMgYSByZWFjdGl2ZSBsYW5ndWFnZVxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VOYXZpZ2F0b3JMYW5ndWFnZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZU5hdmlnYXRvckxhbmd1YWdlKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBuYXZpZ2F0b3IkMSA9IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5uYXZpZ2F0b3I7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImxhbmd1YWdlXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBsYW5ndWFnZSA9IHNoYWxsb3dSZWYobmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvciQxLmxhbmd1YWdlKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJsYW5ndWFnZWNoYW5nZVwiLCAoKSA9PiB7XG5cdFx0aWYgKG5hdmlnYXRvciQxKSBsYW5ndWFnZS52YWx1ZSA9IG5hdmlnYXRvciQxLmxhbmd1YWdlO1xuXHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0bGFuZ3VhZ2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTmV0d29yay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIE5ldHdvcmsgc3RhdHVzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VOZXR3b3JrXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTmV0d29yayhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgbmF2aWdhdG9yJDEgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEubmF2aWdhdG9yO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJjb25uZWN0aW9uXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBpc09ubGluZSA9IHNoYWxsb3dSZWYodHJ1ZSk7XG5cdGNvbnN0IHNhdmVEYXRhID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IG9mZmxpbmVBdCA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3Qgb25saW5lQXQgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IGRvd25saW5rID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCBkb3dubGlua01heCA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3QgcnR0ID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCBlZmZlY3RpdmVUeXBlID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCB0eXBlID0gc2hhbGxvd1JlZihcInVua25vd25cIik7XG5cdGNvbnN0IGNvbm5lY3Rpb24gPSBpc1N1cHBvcnRlZC52YWx1ZSAmJiBuYXZpZ2F0b3IkMS5jb25uZWN0aW9uO1xuXHRmdW5jdGlvbiB1cGRhdGVOZXR3b3JrSW5mb3JtYXRpb24oKSB7XG5cdFx0aWYgKCFuYXZpZ2F0b3IkMSkgcmV0dXJuO1xuXHRcdGlzT25saW5lLnZhbHVlID0gbmF2aWdhdG9yJDEub25MaW5lO1xuXHRcdG9mZmxpbmVBdC52YWx1ZSA9IGlzT25saW5lLnZhbHVlID8gdm9pZCAwIDogRGF0ZS5ub3coKTtcblx0XHRvbmxpbmVBdC52YWx1ZSA9IGlzT25saW5lLnZhbHVlID8gRGF0ZS5ub3coKSA6IHZvaWQgMDtcblx0XHRpZiAoY29ubmVjdGlvbikge1xuXHRcdFx0ZG93bmxpbmsudmFsdWUgPSBjb25uZWN0aW9uLmRvd25saW5rO1xuXHRcdFx0ZG93bmxpbmtNYXgudmFsdWUgPSBjb25uZWN0aW9uLmRvd25saW5rTWF4O1xuXHRcdFx0ZWZmZWN0aXZlVHlwZS52YWx1ZSA9IGNvbm5lY3Rpb24uZWZmZWN0aXZlVHlwZTtcblx0XHRcdHJ0dC52YWx1ZSA9IGNvbm5lY3Rpb24ucnR0O1xuXHRcdFx0c2F2ZURhdGEudmFsdWUgPSBjb25uZWN0aW9uLnNhdmVEYXRhO1xuXHRcdFx0dHlwZS52YWx1ZSA9IGNvbm5lY3Rpb24udHlwZTtcblx0XHR9XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwib2ZmbGluZVwiLCAoKSA9PiB7XG5cdFx0XHRpc09ubGluZS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0b2ZmbGluZUF0LnZhbHVlID0gRGF0ZS5ub3coKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwib25saW5lXCIsICgpID0+IHtcblx0XHRcdGlzT25saW5lLnZhbHVlID0gdHJ1ZTtcblx0XHRcdG9ubGluZUF0LnZhbHVlID0gRGF0ZS5ub3coKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGlmIChjb25uZWN0aW9uKSB1c2VFdmVudExpc3RlbmVyKGNvbm5lY3Rpb24sIFwiY2hhbmdlXCIsIHVwZGF0ZU5ldHdvcmtJbmZvcm1hdGlvbiwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXBkYXRlTmV0d29ya0luZm9ybWF0aW9uKCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNPbmxpbmU6IHJlYWRvbmx5KGlzT25saW5lKSxcblx0XHRzYXZlRGF0YTogcmVhZG9ubHkoc2F2ZURhdGEpLFxuXHRcdG9mZmxpbmVBdDogcmVhZG9ubHkob2ZmbGluZUF0KSxcblx0XHRvbmxpbmVBdDogcmVhZG9ubHkob25saW5lQXQpLFxuXHRcdGRvd25saW5rOiByZWFkb25seShkb3dubGluayksXG5cdFx0ZG93bmxpbmtNYXg6IHJlYWRvbmx5KGRvd25saW5rTWF4KSxcblx0XHRlZmZlY3RpdmVUeXBlOiByZWFkb25seShlZmZlY3RpdmVUeXBlKSxcblx0XHRydHQ6IHJlYWRvbmx5KHJ0dCksXG5cdFx0dHlwZTogcmVhZG9ubHkodHlwZSlcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTm93L2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDUob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIsIGltbWVkaWF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIGludGVydmFsID09PSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiID8gKGZuKSA9PiB1c2VSYWZGbihmbiwgeyBpbW1lZGlhdGUgfSkgOiAoZm4pID0+IHVzZUludGVydmFsRm4oZm4sIGludGVydmFsLCBvcHRpb25zKTtcblx0fVxuXHRyZXR1cm4gdXNlUmFmRm47XG59XG4vKipcbiogUmVhY3RpdmUgY3VycmVudCBEYXRlIGluc3RhbmNlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VOb3dcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VOb3cob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkNShvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgbm93ID0gcmVmKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4gbm93LnZhbHVlID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG5cdGNvbnN0IGNvbnRyb2xzID0gc2NoZWR1bGVyKHVwZGF0ZSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHRub3csXG5cdFx0Li4uY29udHJvbHNcblx0fTtcblx0ZWxzZSByZXR1cm4gbm93O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VPYmplY3RVcmwvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBVUkwgcmVwcmVzZW50aW5nIGFuIG9iamVjdC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlT2JqZWN0VXJsXG4qIEBwYXJhbSBvYmplY3RcbiovXG5mdW5jdGlvbiB1c2VPYmplY3RVcmwob2JqZWN0KSB7XG5cdGNvbnN0IHVybCA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgcmVsZWFzZSA9ICgpID0+IHtcblx0XHRpZiAodXJsLnZhbHVlKSBVUkwucmV2b2tlT2JqZWN0VVJMKHVybC52YWx1ZSk7XG5cdFx0dXJsLnZhbHVlID0gdm9pZCAwO1xuXHR9O1xuXHR3YXRjaCgoKSA9PiB0b1ZhbHVlKG9iamVjdCksIChuZXdPYmplY3QpID0+IHtcblx0XHRyZWxlYXNlKCk7XG5cdFx0aWYgKG5ld09iamVjdCkgdXJsLnZhbHVlID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXdPYmplY3QpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UocmVsZWFzZSk7XG5cdHJldHVybiByZWFkb25seSh1cmwpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi9tYXRoL3VzZUNsYW1wL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBjbGFtcCBhIHZhbHVlIGJldHdlZW4gdHdvIG90aGVyIHZhbHVlcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQ2xhbXBcbiogQHBhcmFtIHZhbHVlIG51bWJlclxuKiBAcGFyYW0gbWluXG4qIEBwYXJhbSBtYXhcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VDbGFtcCh2YWx1ZSwgbWluLCBtYXgpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8IGlzUmVhZG9ubHkodmFsdWUpKSByZXR1cm4gY29tcHV0ZWQoKCkgPT4gY2xhbXAodG9WYWx1ZSh2YWx1ZSksIHRvVmFsdWUobWluKSwgdG9WYWx1ZShtYXgpKSk7XG5cdGNvbnN0IF92YWx1ZSA9IHJlZih2YWx1ZSk7XG5cdHJldHVybiBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIF92YWx1ZS52YWx1ZSA9IGNsYW1wKF92YWx1ZS52YWx1ZSwgdG9WYWx1ZShtaW4pLCB0b1ZhbHVlKG1heCkpO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlJDEpIHtcblx0XHRcdF92YWx1ZS52YWx1ZSA9IGNsYW1wKHZhbHVlJDEsIHRvVmFsdWUobWluKSwgdG9WYWx1ZShtYXgpKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VPZmZzZXRQYWdpbmF0aW9uL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VPZmZzZXRQYWdpbmF0aW9uKG9wdGlvbnMpIHtcblx0Y29uc3QgeyB0b3RhbCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgcGFnZVNpemUgPSAxMCwgcGFnZSA9IDEsIG9uUGFnZUNoYW5nZSA9IG5vb3AsIG9uUGFnZVNpemVDaGFuZ2UgPSBub29wLCBvblBhZ2VDb3VudENoYW5nZSA9IG5vb3AgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGN1cnJlbnRQYWdlU2l6ZSA9IHVzZUNsYW1wKHBhZ2VTaXplLCAxLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXHRjb25zdCBwYWdlQ291bnQgPSBjb21wdXRlZCgoKSA9PiBNYXRoLm1heCgxLCBNYXRoLmNlaWwodG9WYWx1ZSh0b3RhbCkgLyB0b1ZhbHVlKGN1cnJlbnRQYWdlU2l6ZSkpKSk7XG5cdGNvbnN0IGN1cnJlbnRQYWdlID0gdXNlQ2xhbXAocGFnZSwgMSwgcGFnZUNvdW50KTtcblx0Y29uc3QgaXNGaXJzdFBhZ2UgPSBjb21wdXRlZCgoKSA9PiBjdXJyZW50UGFnZS52YWx1ZSA9PT0gMSk7XG5cdGNvbnN0IGlzTGFzdFBhZ2UgPSBjb21wdXRlZCgoKSA9PiBjdXJyZW50UGFnZS52YWx1ZSA9PT0gcGFnZUNvdW50LnZhbHVlKTtcblx0aWYgKGlzUmVmKHBhZ2UpKSBzeW5jUmVmKHBhZ2UsIGN1cnJlbnRQYWdlLCB7IGRpcmVjdGlvbjogaXNSZWFkb25seShwYWdlKSA/IFwibHRyXCIgOiBcImJvdGhcIiB9KTtcblx0aWYgKGlzUmVmKHBhZ2VTaXplKSkgc3luY1JlZihwYWdlU2l6ZSwgY3VycmVudFBhZ2VTaXplLCB7IGRpcmVjdGlvbjogaXNSZWFkb25seShwYWdlU2l6ZSkgPyBcImx0clwiIDogXCJib3RoXCIgfSk7XG5cdGZ1bmN0aW9uIHByZXYoKSB7XG5cdFx0Y3VycmVudFBhZ2UudmFsdWUtLTtcblx0fVxuXHRmdW5jdGlvbiBuZXh0KCkge1xuXHRcdGN1cnJlbnRQYWdlLnZhbHVlKys7XG5cdH1cblx0Y29uc3QgcmV0dXJuVmFsdWUgPSB7XG5cdFx0Y3VycmVudFBhZ2UsXG5cdFx0Y3VycmVudFBhZ2VTaXplLFxuXHRcdHBhZ2VDb3VudCxcblx0XHRpc0ZpcnN0UGFnZSxcblx0XHRpc0xhc3RQYWdlLFxuXHRcdHByZXYsXG5cdFx0bmV4dFxuXHR9O1xuXHR3YXRjaChjdXJyZW50UGFnZSwgKCkgPT4ge1xuXHRcdG9uUGFnZUNoYW5nZShyZWFjdGl2ZShyZXR1cm5WYWx1ZSkpO1xuXHR9KTtcblx0d2F0Y2goY3VycmVudFBhZ2VTaXplLCAoKSA9PiB7XG5cdFx0b25QYWdlU2l6ZUNoYW5nZShyZWFjdGl2ZShyZXR1cm5WYWx1ZSkpO1xuXHR9KTtcblx0d2F0Y2gocGFnZUNvdW50LCAoKSA9PiB7XG5cdFx0b25QYWdlQ291bnRDaGFuZ2UocmVhY3RpdmUocmV0dXJuVmFsdWUpKTtcblx0fSk7XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlT25saW5lL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgb25saW5lIHN0YXRlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VPbmxpbmVcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VPbmxpbmUob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaXNPbmxpbmUgfSA9IHVzZU5ldHdvcmsob3B0aW9ucyk7XG5cdHJldHVybiBpc09ubGluZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUGFnZUxlYXZlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgc3RhdGUgdG8gc2hvdyB3aGV0aGVyIG1vdXNlIGxlYXZlcyB0aGUgcGFnZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUGFnZUxlYXZlXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlUGFnZUxlYXZlKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0xlZnQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdGlmICghd2luZG93JDEpIHJldHVybjtcblx0XHRldmVudCA9IGV2ZW50IHx8IHdpbmRvdyQxLmV2ZW50O1xuXHRcdGlzTGVmdC52YWx1ZSA9ICEoZXZlbnQucmVsYXRlZFRhcmdldCB8fCBldmVudC50b0VsZW1lbnQpO1xuXHR9O1xuXHRpZiAod2luZG93JDEpIHtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm1vdXNlb3V0XCIsIGhhbmRsZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMS5kb2N1bWVudCwgXCJtb3VzZWxlYXZlXCIsIGhhbmRsZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMS5kb2N1bWVudCwgXCJtb3VzZWVudGVyXCIsIGhhbmRsZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIGlzTGVmdDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2NyZWVuT3JpZW50YXRpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBzY3JlZW4gb3JpZW50YXRpb25cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2NyZWVuT3JpZW50YXRpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VTY3JlZW5PcmllbnRhdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwic2NyZWVuXCIgaW4gd2luZG93JDEgJiYgXCJvcmllbnRhdGlvblwiIGluIHdpbmRvdyQxLnNjcmVlbik7XG5cdGNvbnN0IHNjcmVlbk9yaWVudGF0aW9uID0gaXNTdXBwb3J0ZWQudmFsdWUgPyB3aW5kb3ckMS5zY3JlZW4ub3JpZW50YXRpb24gOiB7fTtcblx0Y29uc3Qgb3JpZW50YXRpb24gPSByZWYoc2NyZWVuT3JpZW50YXRpb24udHlwZSk7XG5cdGNvbnN0IGFuZ2xlID0gc2hhbGxvd1JlZihzY3JlZW5PcmllbnRhdGlvbi5hbmdsZSB8fCAwKTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm9yaWVudGF0aW9uY2hhbmdlXCIsICgpID0+IHtcblx0XHRvcmllbnRhdGlvbi52YWx1ZSA9IHNjcmVlbk9yaWVudGF0aW9uLnR5cGU7XG5cdFx0YW5nbGUudmFsdWUgPSBzY3JlZW5PcmllbnRhdGlvbi5hbmdsZTtcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRjb25zdCBsb2NrT3JpZW50YXRpb24gPSAodHlwZSkgPT4ge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiB0eXBlb2Ygc2NyZWVuT3JpZW50YXRpb24ubG9jayA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gc2NyZWVuT3JpZW50YXRpb24ubG9jayh0eXBlKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIk5vdCBzdXBwb3J0ZWRcIikpO1xuXHR9O1xuXHRjb25zdCB1bmxvY2tPcmllbnRhdGlvbiA9ICgpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdHlwZW9mIHNjcmVlbk9yaWVudGF0aW9uLnVubG9jayA9PT0gXCJmdW5jdGlvblwiKSBzY3JlZW5PcmllbnRhdGlvbi51bmxvY2soKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRvcmllbnRhdGlvbixcblx0XHRhbmdsZSxcblx0XHRsb2NrT3JpZW50YXRpb24sXG5cdFx0dW5sb2NrT3JpZW50YXRpb25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUGFyYWxsYXgvaW5kZXgudHNcbi8qKlxuKiBDcmVhdGUgcGFyYWxsYXggZWZmZWN0IGVhc2lseS4gSXQgdXNlcyBgdXNlRGV2aWNlT3JpZW50YXRpb25gIGFuZCBmYWxsYmFjayB0byBgdXNlTW91c2VgXG4qIGlmIG9yaWVudGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4qXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VQYXJhbGxheCh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRldmljZU9yaWVudGF0aW9uVGlsdEFkanVzdCA9IChpKSA9PiBpLCBkZXZpY2VPcmllbnRhdGlvblJvbGxBZGp1c3QgPSAoaSkgPT4gaSwgbW91c2VUaWx0QWRqdXN0ID0gKGkpID0+IGksIG1vdXNlUm9sbEFkanVzdCA9IChpKSA9PiBpLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3Qgb3JpZW50YXRpb24gPSByZWFjdGl2ZSh1c2VEZXZpY2VPcmllbnRhdGlvbih7IHdpbmRvdzogd2luZG93JDEgfSkpO1xuXHRjb25zdCBzY3JlZW5PcmllbnRhdGlvbiA9IHJlYWN0aXZlKHVzZVNjcmVlbk9yaWVudGF0aW9uKHsgd2luZG93OiB3aW5kb3ckMSB9KSk7XG5cdGNvbnN0IHsgZWxlbWVudFg6IHgsIGVsZW1lbnRZOiB5LCBlbGVtZW50V2lkdGg6IHdpZHRoLCBlbGVtZW50SGVpZ2h0OiBoZWlnaHQgfSA9IHVzZU1vdXNlSW5FbGVtZW50KHRhcmdldCwge1xuXHRcdGhhbmRsZU91dHNpZGU6IGZhbHNlLFxuXHRcdHdpbmRvdzogd2luZG93JDFcblx0fSk7XG5cdGNvbnN0IHNvdXJjZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRpZiAob3JpZW50YXRpb24uaXNTdXBwb3J0ZWQgJiYgKG9yaWVudGF0aW9uLmFscGhhICE9IG51bGwgJiYgb3JpZW50YXRpb24uYWxwaGEgIT09IDAgfHwgb3JpZW50YXRpb24uZ2FtbWEgIT0gbnVsbCAmJiBvcmllbnRhdGlvbi5nYW1tYSAhPT0gMCkpIHJldHVybiBcImRldmljZU9yaWVudGF0aW9uXCI7XG5cdFx0cmV0dXJuIFwibW91c2VcIjtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0cm9sbDogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0aWYgKHNvdXJjZS52YWx1ZSA9PT0gXCJkZXZpY2VPcmllbnRhdGlvblwiKSB7XG5cdFx0XHRcdGxldCB2YWx1ZTtcblx0XHRcdFx0c3dpdGNoIChzY3JlZW5PcmllbnRhdGlvbi5vcmllbnRhdGlvbikge1xuXHRcdFx0XHRcdGNhc2UgXCJsYW5kc2NhcGUtcHJpbWFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSBvcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcImxhbmRzY2FwZS1zZWNvbmRhcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gLW9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwicG9ydHJhaXQtcHJpbWFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSAtb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInBvcnRyYWl0LXNlY29uZGFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSBvcmllbnRhdGlvbi5iZXRhIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiB2YWx1ZSA9IC1vcmllbnRhdGlvbi5iZXRhIC8gOTA7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGRldmljZU9yaWVudGF0aW9uUm9sbEFkanVzdCh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgcmV0dXJuIG1vdXNlUm9sbEFkanVzdCgtKHkudmFsdWUgLSBoZWlnaHQudmFsdWUgLyAyKSAvIGhlaWdodC52YWx1ZSk7XG5cdFx0fSksXG5cdFx0dGlsdDogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0aWYgKHNvdXJjZS52YWx1ZSA9PT0gXCJkZXZpY2VPcmllbnRhdGlvblwiKSB7XG5cdFx0XHRcdGxldCB2YWx1ZTtcblx0XHRcdFx0c3dpdGNoIChzY3JlZW5PcmllbnRhdGlvbi5vcmllbnRhdGlvbikge1xuXHRcdFx0XHRcdGNhc2UgXCJsYW5kc2NhcGUtcHJpbWFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSBvcmllbnRhdGlvbi5iZXRhIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwibGFuZHNjYXBlLXNlY29uZGFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSAtb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInBvcnRyYWl0LXByaW1hcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gb3JpZW50YXRpb24uZ2FtbWEgLyA5MDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJwb3J0cmFpdC1zZWNvbmRhcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gLW9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiB2YWx1ZSA9IG9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGRldmljZU9yaWVudGF0aW9uVGlsdEFkanVzdCh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgcmV0dXJuIG1vdXNlVGlsdEFkanVzdCgoeC52YWx1ZSAtIHdpZHRoLnZhbHVlIC8gMikgLyB3aWR0aC52YWx1ZSk7XG5cdFx0fSksXG5cdFx0c291cmNlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBhcmVudEVsZW1lbnQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVBhcmVudEVsZW1lbnQoZWxlbWVudCA9IHVzZUN1cnJlbnRFbGVtZW50KCkpIHtcblx0Y29uc3QgcGFyZW50RWxlbWVudCA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KGVsZW1lbnQpO1xuXHRcdGlmIChlbCkgcGFyZW50RWxlbWVudC52YWx1ZSA9IGVsLnBhcmVudEVsZW1lbnQ7XG5cdH07XG5cdHRyeU9uTW91bnRlZCh1cGRhdGUpO1xuXHR3YXRjaCgoKSA9PiB0b1ZhbHVlKGVsZW1lbnQpLCB1cGRhdGUpO1xuXHRyZXR1cm4gcGFyZW50RWxlbWVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUGVyZm9ybWFuY2VPYnNlcnZlci9pbmRleC50c1xuLyoqXG4qIE9ic2VydmUgcGVyZm9ybWFuY2UgbWV0cmljcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUGVyZm9ybWFuY2VPYnNlcnZlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVBlcmZvcm1hbmNlT2JzZXJ2ZXIob3B0aW9ucywgY2FsbGJhY2spIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaW1tZWRpYXRlID0gdHJ1ZSwuLi5wZXJmb3JtYW5jZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcIlBlcmZvcm1hbmNlT2JzZXJ2ZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGxldCBvYnNlcnZlcjtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRvYnNlcnZlciA9PT0gbnVsbCB8fCBvYnNlcnZlciA9PT0gdm9pZCAwIHx8IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0fTtcblx0Y29uc3Qgc3RhcnQgPSAoKSA9PiB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0XHRzdG9wKCk7XG5cdFx0XHRvYnNlcnZlciA9IG5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGNhbGxiYWNrKTtcblx0XHRcdG9ic2VydmVyLm9ic2VydmUocGVyZm9ybWFuY2VPcHRpb25zKTtcblx0XHR9XG5cdH07XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHN0b3ApO1xuXHRpZiAoaW1tZWRpYXRlKSBzdGFydCgpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUG9pbnRlci9pbmRleC50c1xuY29uc3QgZGVmYXVsdFN0YXRlID0ge1xuXHR4OiAwLFxuXHR5OiAwLFxuXHRwb2ludGVySWQ6IDAsXG5cdHByZXNzdXJlOiAwLFxuXHR0aWx0WDogMCxcblx0dGlsdFk6IDAsXG5cdHdpZHRoOiAwLFxuXHRoZWlnaHQ6IDAsXG5cdHR3aXN0OiAwLFxuXHRwb2ludGVyVHlwZTogbnVsbFxufTtcbmNvbnN0IGtleXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmtleXMoZGVmYXVsdFN0YXRlKTtcbi8qKlxuKiBSZWFjdGl2ZSBwb2ludGVyIHN0YXRlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQb2ludGVyXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlUG9pbnRlcihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0YXJnZXQgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0luc2lkZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzdGF0ZSA9IHNoYWxsb3dSZWYob3B0aW9ucy5pbml0aWFsVmFsdWUgfHwge30pO1xuXHRPYmplY3QuYXNzaWduKHN0YXRlLnZhbHVlLCBkZWZhdWx0U3RhdGUsIHN0YXRlLnZhbHVlKTtcblx0Y29uc3QgaGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdGlzSW5zaWRlLnZhbHVlID0gdHJ1ZTtcblx0XHRpZiAob3B0aW9ucy5wb2ludGVyVHlwZXMgJiYgIW9wdGlvbnMucG9pbnRlclR5cGVzLmluY2x1ZGVzKGV2ZW50LnBvaW50ZXJUeXBlKSkgcmV0dXJuO1xuXHRcdHN0YXRlLnZhbHVlID0gb2JqZWN0UGljayhldmVudCwga2V5cywgZmFsc2UpO1xuXHR9O1xuXHRpZiAodGFyZ2V0KSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcblx0XHRcdFwicG9pbnRlcmRvd25cIixcblx0XHRcdFwicG9pbnRlcm1vdmVcIixcblx0XHRcdFwicG9pbnRlcnVwXCJcblx0XHRdLCBoYW5kbGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBvaW50ZXJsZWF2ZVwiLCAoKSA9PiBpc0luc2lkZS52YWx1ZSA9IGZhbHNlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0Li4udG9SZWZzKHN0YXRlKSxcblx0XHRpc0luc2lkZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQb2ludGVyTG9jay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHBvaW50ZXIgbG9jay5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUG9pbnRlckxvY2tcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVBvaW50ZXJMb2NrKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBkb2N1bWVudCQxICYmIFwicG9pbnRlckxvY2tFbGVtZW50XCIgaW4gZG9jdW1lbnQkMSk7XG5cdGNvbnN0IGVsZW1lbnQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHRyaWdnZXJFbGVtZW50ID0gc2hhbGxvd1JlZigpO1xuXHRsZXQgdGFyZ2V0RWxlbWVudDtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInBvaW50ZXJsb2NrY2hhbmdlXCIsICgpID0+IHtcblx0XHRcdHZhciBfcG9pbnRlckxvY2tFbGVtZW50O1xuXHRcdFx0Y29uc3QgY3VycmVudEVsZW1lbnQgPSAoX3BvaW50ZXJMb2NrRWxlbWVudCA9IGRvY3VtZW50JDEucG9pbnRlckxvY2tFbGVtZW50KSAhPT0gbnVsbCAmJiBfcG9pbnRlckxvY2tFbGVtZW50ICE9PSB2b2lkIDAgPyBfcG9pbnRlckxvY2tFbGVtZW50IDogZWxlbWVudC52YWx1ZTtcblx0XHRcdGlmICh0YXJnZXRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ID09PSB0YXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdGVsZW1lbnQudmFsdWUgPSBkb2N1bWVudCQxLnBvaW50ZXJMb2NrRWxlbWVudDtcblx0XHRcdFx0aWYgKCFlbGVtZW50LnZhbHVlKSB0YXJnZXRFbGVtZW50ID0gdHJpZ2dlckVsZW1lbnQudmFsdWUgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInBvaW50ZXJsb2NrZXJyb3JcIiwgKCkgPT4ge1xuXHRcdFx0dmFyIF9wb2ludGVyTG9ja0VsZW1lbnQyO1xuXHRcdFx0Y29uc3QgY3VycmVudEVsZW1lbnQgPSAoX3BvaW50ZXJMb2NrRWxlbWVudDIgPSBkb2N1bWVudCQxLnBvaW50ZXJMb2NrRWxlbWVudCkgIT09IG51bGwgJiYgX3BvaW50ZXJMb2NrRWxlbWVudDIgIT09IHZvaWQgMCA/IF9wb2ludGVyTG9ja0VsZW1lbnQyIDogZWxlbWVudC52YWx1ZTtcblx0XHRcdGlmICh0YXJnZXRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ID09PSB0YXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdGNvbnN0IGFjdGlvbiA9IGRvY3VtZW50JDEucG9pbnRlckxvY2tFbGVtZW50ID8gXCJyZWxlYXNlXCIgOiBcImFjcXVpcmVcIjtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gJHthY3Rpb259IHBvaW50ZXIgbG9jay5gKTtcblx0XHRcdH1cblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGxvY2soZSkge1xuXHRcdHZhciBfdW5yZWZFbGVtZW50O1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHRocm93IG5ldyBFcnJvcihcIlBvaW50ZXIgTG9jayBBUEkgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuXCIpO1xuXHRcdHRyaWdnZXJFbGVtZW50LnZhbHVlID0gZSBpbnN0YW5jZW9mIEV2ZW50ID8gZS5jdXJyZW50VGFyZ2V0IDogbnVsbDtcblx0XHR0YXJnZXRFbGVtZW50ID0gZSBpbnN0YW5jZW9mIEV2ZW50ID8gKF91bnJlZkVsZW1lbnQgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KSkgIT09IG51bGwgJiYgX3VucmVmRWxlbWVudCAhPT0gdm9pZCAwID8gX3VucmVmRWxlbWVudCA6IHRyaWdnZXJFbGVtZW50LnZhbHVlIDogdW5yZWZFbGVtZW50KGUpO1xuXHRcdGlmICghdGFyZ2V0RWxlbWVudCkgdGhyb3cgbmV3IEVycm9yKFwiVGFyZ2V0IGVsZW1lbnQgdW5kZWZpbmVkLlwiKTtcblx0XHR0YXJnZXRFbGVtZW50LnJlcXVlc3RQb2ludGVyTG9jaygpO1xuXHRcdHJldHVybiBhd2FpdCB1bnRpbChlbGVtZW50KS50b0JlKHRhcmdldEVsZW1lbnQpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHVubG9jaygpIHtcblx0XHRpZiAoIWVsZW1lbnQudmFsdWUpIHJldHVybiBmYWxzZTtcblx0XHRkb2N1bWVudCQxLmV4aXRQb2ludGVyTG9jaygpO1xuXHRcdGF3YWl0IHVudGlsKGVsZW1lbnQpLnRvQmVOdWxsKCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRlbGVtZW50LFxuXHRcdHRyaWdnZXJFbGVtZW50LFxuXHRcdGxvY2ssXG5cdFx0dW5sb2NrXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBvaW50ZXJTd2lwZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHN3aXBlIGRldGVjdGlvbiBiYXNlZCBvbiBQb2ludGVyRXZlbnRzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQb2ludGVyU3dpcGVcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVBvaW50ZXJTd2lwZSh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB0YXJnZXRSZWYgPSB0b1JlZih0YXJnZXQpO1xuXHRjb25zdCB7IHRocmVzaG9sZCA9IDUwLCBvblN3aXBlLCBvblN3aXBlRW5kLCBvblN3aXBlU3RhcnQsIGRpc2FibGVUZXh0U2VsZWN0ID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHBvc1N0YXJ0ID0gcmVhY3RpdmUoe1xuXHRcdHg6IDAsXG5cdFx0eTogMFxuXHR9KTtcblx0Y29uc3QgdXBkYXRlUG9zU3RhcnQgPSAoeCwgeSkgPT4ge1xuXHRcdHBvc1N0YXJ0LnggPSB4O1xuXHRcdHBvc1N0YXJ0LnkgPSB5O1xuXHR9O1xuXHRjb25zdCBwb3NFbmQgPSByZWFjdGl2ZSh7XG5cdFx0eDogMCxcblx0XHR5OiAwXG5cdH0pO1xuXHRjb25zdCB1cGRhdGVQb3NFbmQgPSAoeCwgeSkgPT4ge1xuXHRcdHBvc0VuZC54ID0geDtcblx0XHRwb3NFbmQueSA9IHk7XG5cdH07XG5cdGNvbnN0IGRpc3RhbmNlWCA9IGNvbXB1dGVkKCgpID0+IHBvc1N0YXJ0LnggLSBwb3NFbmQueCk7XG5cdGNvbnN0IGRpc3RhbmNlWSA9IGNvbXB1dGVkKCgpID0+IHBvc1N0YXJ0LnkgLSBwb3NFbmQueSk7XG5cdGNvbnN0IHsgbWF4LCBhYnMgfSA9IE1hdGg7XG5cdGNvbnN0IGlzVGhyZXNob2xkRXhjZWVkZWQgPSBjb21wdXRlZCgoKSA9PiBtYXgoYWJzKGRpc3RhbmNlWC52YWx1ZSksIGFicyhkaXN0YW5jZVkudmFsdWUpKSA+PSB0aHJlc2hvbGQpO1xuXHRjb25zdCBpc1N3aXBpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaXNQb2ludGVyRG93biA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBkaXJlY3Rpb24gPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKCFpc1RocmVzaG9sZEV4Y2VlZGVkLnZhbHVlKSByZXR1cm4gXCJub25lXCI7XG5cdFx0aWYgKGFicyhkaXN0YW5jZVgudmFsdWUpID4gYWJzKGRpc3RhbmNlWS52YWx1ZSkpIHJldHVybiBkaXN0YW5jZVgudmFsdWUgPiAwID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCI7XG5cdFx0ZWxzZSByZXR1cm4gZGlzdGFuY2VZLnZhbHVlID4gMCA/IFwidXBcIiA6IFwiZG93blwiO1xuXHR9KTtcblx0Y29uc3QgZXZlbnRJc0FsbG93ZWQgPSAoZSkgPT4ge1xuXHRcdHZhciBfcmVmLCBfb3B0aW9ucyRwb2ludGVyVHlwZXMsIF9vcHRpb25zJHBvaW50ZXJUeXBlczI7XG5cdFx0Y29uc3QgaXNSZWxlYXNpbmdCdXR0b24gPSBlLmJ1dHRvbnMgPT09IDA7XG5cdFx0Y29uc3QgaXNQcmltYXJ5QnV0dG9uID0gZS5idXR0b25zID09PSAxO1xuXHRcdHJldHVybiAoX3JlZiA9IChfb3B0aW9ucyRwb2ludGVyVHlwZXMgPSAoX29wdGlvbnMkcG9pbnRlclR5cGVzMiA9IG9wdGlvbnMucG9pbnRlclR5cGVzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRwb2ludGVyVHlwZXMyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRwb2ludGVyVHlwZXMyLmluY2x1ZGVzKGUucG9pbnRlclR5cGUpKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRwb2ludGVyVHlwZXMgIT09IHZvaWQgMCA/IF9vcHRpb25zJHBvaW50ZXJUeXBlcyA6IGlzUmVsZWFzaW5nQnV0dG9uIHx8IGlzUHJpbWFyeUJ1dHRvbikgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IHRydWU7XG5cdH07XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRjb25zdCBzdG9wcyA9IFtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwb2ludGVyZG93blwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKCFldmVudElzQWxsb3dlZChlKSkgcmV0dXJuO1xuXHRcdFx0aXNQb2ludGVyRG93bi52YWx1ZSA9IHRydWU7XG5cdFx0XHRjb25zdCBldmVudFRhcmdldCA9IGUudGFyZ2V0O1xuXHRcdFx0ZXZlbnRUYXJnZXQgPT09IG51bGwgfHwgZXZlbnRUYXJnZXQgPT09IHZvaWQgMCB8fCBldmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG5cdFx0XHRjb25zdCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSA9IGU7XG5cdFx0XHR1cGRhdGVQb3NTdGFydCh4LCB5KTtcblx0XHRcdHVwZGF0ZVBvc0VuZCh4LCB5KTtcblx0XHRcdG9uU3dpcGVTdGFydCA9PT0gbnVsbCB8fCBvblN3aXBlU3RhcnQgPT09IHZvaWQgMCB8fCBvblN3aXBlU3RhcnQoZSk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwb2ludGVybW92ZVwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKCFldmVudElzQWxsb3dlZChlKSkgcmV0dXJuO1xuXHRcdFx0aWYgKCFpc1BvaW50ZXJEb3duLnZhbHVlKSByZXR1cm47XG5cdFx0XHRjb25zdCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSA9IGU7XG5cdFx0XHR1cGRhdGVQb3NFbmQoeCwgeSk7XG5cdFx0XHRpZiAoIWlzU3dpcGluZy52YWx1ZSAmJiBpc1RocmVzaG9sZEV4Y2VlZGVkLnZhbHVlKSBpc1N3aXBpbmcudmFsdWUgPSB0cnVlO1xuXHRcdFx0aWYgKGlzU3dpcGluZy52YWx1ZSkgb25Td2lwZSA9PT0gbnVsbCB8fCBvblN3aXBlID09PSB2b2lkIDAgfHwgb25Td2lwZShlKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBvaW50ZXJ1cFwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKCFldmVudElzQWxsb3dlZChlKSkgcmV0dXJuO1xuXHRcdFx0aWYgKGlzU3dpcGluZy52YWx1ZSkgb25Td2lwZUVuZCA9PT0gbnVsbCB8fCBvblN3aXBlRW5kID09PSB2b2lkIDAgfHwgb25Td2lwZUVuZChlLCBkaXJlY3Rpb24udmFsdWUpO1xuXHRcdFx0aXNQb2ludGVyRG93bi52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0aXNTd2lwaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKVxuXHRdO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdHZhciBfdGFyZ2V0UmVmJHZhbHVlO1xuXHRcdChfdGFyZ2V0UmVmJHZhbHVlID0gdGFyZ2V0UmVmLnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWUgPSBfdGFyZ2V0UmVmJHZhbHVlLnN0eWxlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZS5zZXRQcm9wZXJ0eShcInRvdWNoLWFjdGlvblwiLCBcInBhbi15XCIpO1xuXHRcdGlmIChkaXNhYmxlVGV4dFNlbGVjdCkge1xuXHRcdFx0dmFyIF90YXJnZXRSZWYkdmFsdWUyLCBfdGFyZ2V0UmVmJHZhbHVlMywgX3RhcmdldFJlZiR2YWx1ZTQ7XG5cdFx0XHQoX3RhcmdldFJlZiR2YWx1ZTIgPSB0YXJnZXRSZWYudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWUyID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWUyID0gX3RhcmdldFJlZiR2YWx1ZTIuc3R5bGUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWUyID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZTIuc2V0UHJvcGVydHkoXCItd2Via2l0LXVzZXItc2VsZWN0XCIsIFwibm9uZVwiKTtcblx0XHRcdChfdGFyZ2V0UmVmJHZhbHVlMyA9IHRhcmdldFJlZi52YWx1ZSkgPT09IG51bGwgfHwgX3RhcmdldFJlZiR2YWx1ZTMgPT09IHZvaWQgMCB8fCAoX3RhcmdldFJlZiR2YWx1ZTMgPSBfdGFyZ2V0UmVmJHZhbHVlMy5zdHlsZSkgPT09IG51bGwgfHwgX3RhcmdldFJlZiR2YWx1ZTMgPT09IHZvaWQgMCB8fCBfdGFyZ2V0UmVmJHZhbHVlMy5zZXRQcm9wZXJ0eShcIi1tcy11c2VyLXNlbGVjdFwiLCBcIm5vbmVcIik7XG5cdFx0XHQoX3RhcmdldFJlZiR2YWx1ZTQgPSB0YXJnZXRSZWYudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWU0ID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWU0ID0gX3RhcmdldFJlZiR2YWx1ZTQuc3R5bGUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWU0ID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZTQuc2V0UHJvcGVydHkoXCJ1c2VyLXNlbGVjdFwiLCBcIm5vbmVcIik7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHN0b3BzLmZvckVhY2goKHMpID0+IHMoKSk7XG5cdHJldHVybiB7XG5cdFx0aXNTd2lwaW5nOiByZWFkb25seShpc1N3aXBpbmcpLFxuXHRcdGRpcmVjdGlvbjogcmVhZG9ubHkoZGlyZWN0aW9uKSxcblx0XHRwb3NTdGFydDogcmVhZG9ubHkocG9zU3RhcnQpLFxuXHRcdHBvc0VuZDogcmVhZG9ubHkocG9zRW5kKSxcblx0XHRkaXN0YW5jZVgsXG5cdFx0ZGlzdGFuY2VZLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkQ29sb3JTY2hlbWUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBwcmVmZXJzLWNvbG9yLXNjaGVtZSBtZWRpYSBxdWVyeS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUHJlZmVycmVkQ29sb3JTY2hlbWVcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZENvbG9yU2NoZW1lKG9wdGlvbnMpIHtcblx0Y29uc3QgaXNMaWdodCA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KVwiLCBvcHRpb25zKTtcblx0Y29uc3QgaXNEYXJrID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzRGFyay52YWx1ZSkgcmV0dXJuIFwiZGFya1wiO1xuXHRcdGlmIChpc0xpZ2h0LnZhbHVlKSByZXR1cm4gXCJsaWdodFwiO1xuXHRcdHJldHVybiBcIm5vLXByZWZlcmVuY2VcIjtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZENvbnRyYXN0L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgcHJlZmVycy1jb250cmFzdCBtZWRpYSBxdWVyeS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUHJlZmVycmVkQ29udHJhc3RcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZENvbnRyYXN0KG9wdGlvbnMpIHtcblx0Y29uc3QgaXNNb3JlID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbnRyYXN0OiBtb3JlKVwiLCBvcHRpb25zKTtcblx0Y29uc3QgaXNMZXNzID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbnRyYXN0OiBsZXNzKVwiLCBvcHRpb25zKTtcblx0Y29uc3QgaXNDdXN0b20gPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtY29udHJhc3Q6IGN1c3RvbSlcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzTW9yZS52YWx1ZSkgcmV0dXJuIFwibW9yZVwiO1xuXHRcdGlmIChpc0xlc3MudmFsdWUpIHJldHVybiBcImxlc3NcIjtcblx0XHRpZiAoaXNDdXN0b20udmFsdWUpIHJldHVybiBcImN1c3RvbVwiO1xuXHRcdHJldHVybiBcIm5vLXByZWZlcmVuY2VcIjtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZExhbmd1YWdlcy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIE5hdmlnYXRvciBMYW5ndWFnZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZExhbmd1YWdlc1xuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZExhbmd1YWdlcyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHNoYWxsb3dSZWYoW1wiZW5cIl0pO1xuXHRjb25zdCBuYXZpZ2F0b3IkMSA9IHdpbmRvdyQxLm5hdmlnYXRvcjtcblx0Y29uc3QgdmFsdWUgPSBzaGFsbG93UmVmKG5hdmlnYXRvciQxLmxhbmd1YWdlcyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwibGFuZ3VhZ2VjaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdHZhbHVlLnZhbHVlID0gbmF2aWdhdG9yJDEubGFuZ3VhZ2VzO1xuXHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkUmVkdWNlZE1vdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHByZWZlcnMtcmVkdWNlZC1tb3Rpb24gbWVkaWEgcXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZFJlZHVjZWRNb3Rpb25cbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZFJlZHVjZWRNb3Rpb24ob3B0aW9ucykge1xuXHRjb25zdCBpc1JlZHVjZWQgPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSlcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzUmVkdWNlZC52YWx1ZSkgcmV0dXJuIFwicmVkdWNlXCI7XG5cdFx0cmV0dXJuIFwibm8tcHJlZmVyZW5jZVwiO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkUmVkdWNlZFRyYW5zcGFyZW5jeS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHByZWZlcnMtcmVkdWNlZC10cmFuc3BhcmVuY3kgbWVkaWEgcXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZFJlZHVjZWRUcmFuc3BhcmVuY3lcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZFJlZHVjZWRUcmFuc3BhcmVuY3kob3B0aW9ucykge1xuXHRjb25zdCBpc1JlZHVjZWQgPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtcmVkdWNlZC10cmFuc3BhcmVuY3k6IHJlZHVjZSlcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzUmVkdWNlZC52YWx1ZSkgcmV0dXJuIFwicmVkdWNlXCI7XG5cdFx0cmV0dXJuIFwibm8tcHJlZmVyZW5jZVwiO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJldmlvdXMvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVByZXZpb3VzKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcblx0Y29uc3QgcHJldmlvdXMgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdHdhdGNoKHRvUmVmKHZhbHVlKSwgKF8sIG9sZFZhbHVlKSA9PiB7XG5cdFx0cHJldmlvdXMudmFsdWUgPSBvbGRWYWx1ZTtcblx0fSwgeyBmbHVzaDogXCJzeW5jXCIgfSk7XG5cdHJldHVybiByZWFkb25seShwcmV2aW91cyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNjcmVlblNhZmVBcmVhL2luZGV4LnRzXG5jb25zdCB0b3BWYXJOYW1lID0gXCItLXZ1ZXVzZS1zYWZlLWFyZWEtdG9wXCI7XG5jb25zdCByaWdodFZhck5hbWUgPSBcIi0tdnVldXNlLXNhZmUtYXJlYS1yaWdodFwiO1xuY29uc3QgYm90dG9tVmFyTmFtZSA9IFwiLS12dWV1c2Utc2FmZS1hcmVhLWJvdHRvbVwiO1xuY29uc3QgbGVmdFZhck5hbWUgPSBcIi0tdnVldXNlLXNhZmUtYXJlYS1sZWZ0XCI7XG4vKipcbiogUmVhY3RpdmUgYGVudihzYWZlLWFyZWEtaW5zZXQtKilgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcmVlblNhZmVBcmVhXG4qL1xuZnVuY3Rpb24gdXNlU2NyZWVuU2FmZUFyZWEoKSB7XG5cdGNvbnN0IHRvcCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IHJpZ2h0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgYm90dG9tID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgbGVmdCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGlmIChpc0NsaWVudCkge1xuXHRcdGNvbnN0IHRvcENzc1ZhciA9IHVzZUNzc1Zhcih0b3BWYXJOYW1lKTtcblx0XHRjb25zdCByaWdodENzc1ZhciA9IHVzZUNzc1ZhcihyaWdodFZhck5hbWUpO1xuXHRcdGNvbnN0IGJvdHRvbUNzc1ZhciA9IHVzZUNzc1Zhcihib3R0b21WYXJOYW1lKTtcblx0XHRjb25zdCBsZWZ0Q3NzVmFyID0gdXNlQ3NzVmFyKGxlZnRWYXJOYW1lKTtcblx0XHR0b3BDc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpXCI7XG5cdFx0cmlnaHRDc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtcmlnaHQsIDBweClcIjtcblx0XHRib3R0b21Dc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwcHgpXCI7XG5cdFx0bGVmdENzc1Zhci52YWx1ZSA9IFwiZW52KHNhZmUtYXJlYS1pbnNldC1sZWZ0LCAwcHgpXCI7XG5cdFx0dHJ5T25Nb3VudGVkKHVwZGF0ZSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1c2VEZWJvdW5jZUZuKHVwZGF0ZSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGUoKSB7XG5cdFx0dG9wLnZhbHVlID0gZ2V0VmFsdWUodG9wVmFyTmFtZSk7XG5cdFx0cmlnaHQudmFsdWUgPSBnZXRWYWx1ZShyaWdodFZhck5hbWUpO1xuXHRcdGJvdHRvbS52YWx1ZSA9IGdldFZhbHVlKGJvdHRvbVZhck5hbWUpO1xuXHRcdGxlZnQudmFsdWUgPSBnZXRWYWx1ZShsZWZ0VmFyTmFtZSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR0b3AsXG5cdFx0cmlnaHQsXG5cdFx0Ym90dG9tLFxuXHRcdGxlZnQsXG5cdFx0dXBkYXRlXG5cdH07XG59XG5mdW5jdGlvbiBnZXRWYWx1ZShwb3NpdGlvbikge1xuXHRyZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUocG9zaXRpb24pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTY3JpcHRUYWcvaW5kZXgudHNcbi8qKlxuKiBBc3luYyBzY3JpcHQgdGFnIGxvYWRpbmcuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcmlwdFRhZ1xuKiBAcGFyYW0gc3JjXG4qIEBwYXJhbSBvbkxvYWRlZFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVNjcmlwdFRhZyhzcmMsIG9uTG9hZGVkID0gbm9vcCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW1tZWRpYXRlID0gdHJ1ZSwgbWFudWFsID0gZmFsc2UsIHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiLCBhc3luYyA9IHRydWUsIGNyb3NzT3JpZ2luLCByZWZlcnJlclBvbGljeSwgbm9Nb2R1bGUsIGRlZmVyLCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgYXR0cnMgPSB7fSwgbm9uY2UgPSB2b2lkIDAgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHNjcmlwdFRhZyA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGxldCBfcHJvbWlzZSA9IG51bGw7XG5cdC8qKlxuXHQqIExvYWQgdGhlIHNjcmlwdCBzcGVjaWZpZWQgdmlhIGBzcmNgLlxuXHQqXG5cdCogQHBhcmFtIHdhaXRGb3JTY3JpcHRMb2FkIFdoZXRoZXIgaWYgdGhlIFByb21pc2Ugc2hvdWxkIHJlc29sdmUgb25jZSB0aGUgXCJsb2FkXCIgZXZlbnQgaXMgZW1pdHRlZCBieSB0aGUgPHNjcmlwdD4gYXR0cmlidXRlLCBvciByaWdodCBhZnRlciBhcHBlbmRpbmcgaXQgdG8gdGhlIERPTS5cblx0KiBAcmV0dXJucyBQcm9taXNlPEhUTUxTY3JpcHRFbGVtZW50PlxuXHQqL1xuXHRjb25zdCBsb2FkU2NyaXB0ID0gKHdhaXRGb3JTY3JpcHRMb2FkKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Y29uc3QgcmVzb2x2ZVdpdGhFbGVtZW50ID0gKGVsJDEpID0+IHtcblx0XHRcdHNjcmlwdFRhZy52YWx1ZSA9IGVsJDE7XG5cdFx0XHRyZXNvbHZlKGVsJDEpO1xuXHRcdFx0cmV0dXJuIGVsJDE7XG5cdFx0fTtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHtcblx0XHRcdHJlc29sdmUoZmFsc2UpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZXQgc2hvdWxkQXBwZW5kID0gZmFsc2U7XG5cdFx0bGV0IGVsID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHt0b1ZhbHVlKHNyYyl9XCJdYCk7XG5cdFx0aWYgKCFlbCkge1xuXHRcdFx0ZWwgPSBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdFx0XHRlbC50eXBlID0gdHlwZTtcblx0XHRcdGVsLmFzeW5jID0gYXN5bmM7XG5cdFx0XHRlbC5zcmMgPSB0b1ZhbHVlKHNyYyk7XG5cdFx0XHRpZiAoZGVmZXIpIGVsLmRlZmVyID0gZGVmZXI7XG5cdFx0XHRpZiAoY3Jvc3NPcmlnaW4pIGVsLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47XG5cdFx0XHRpZiAobm9Nb2R1bGUpIGVsLm5vTW9kdWxlID0gbm9Nb2R1bGU7XG5cdFx0XHRpZiAocmVmZXJyZXJQb2xpY3kpIGVsLnJlZmVycmVyUG9saWN5ID0gcmVmZXJyZXJQb2xpY3k7XG5cdFx0XHRpZiAobm9uY2UpIGVsLm5vbmNlID0gbm9uY2U7XG5cdFx0XHRPYmplY3QuZW50cmllcyhhdHRycykuZm9yRWFjaCgoW25hbWUsIHZhbHVlXSkgPT4gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpO1xuXHRcdFx0c2hvdWxkQXBwZW5kID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKGVsLmhhc0F0dHJpYnV0ZShcImRhdGEtbG9hZGVkXCIpKSByZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwiZXJyb3JcIiwgKGV2ZW50KSA9PiByZWplY3QoZXZlbnQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwiYWJvcnRcIiwgKGV2ZW50KSA9PiByZWplY3QoZXZlbnQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwibG9hZFwiLCAoKSA9PiB7XG5cdFx0XHRlbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxvYWRlZFwiLCBcInRydWVcIik7XG5cdFx0XHRvbkxvYWRlZChlbCk7XG5cdFx0XHRyZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0aWYgKHNob3VsZEFwcGVuZCkgZWwgPSBkb2N1bWVudCQxLmhlYWQuYXBwZW5kQ2hpbGQoZWwpO1xuXHRcdGlmICghd2FpdEZvclNjcmlwdExvYWQpIHJlc29sdmVXaXRoRWxlbWVudChlbCk7XG5cdH0pO1xuXHQvKipcblx0KiBFeHBvc2VkIHNpbmdsZXRvbiB3cmFwcGVyIGZvciBgbG9hZFNjcmlwdGAsIGF2b2lkaW5nIGNhbGxpbmcgaXQgdHdpY2UuXG5cdCpcblx0KiBAcGFyYW0gd2FpdEZvclNjcmlwdExvYWQgV2hldGhlciBpZiB0aGUgUHJvbWlzZSBzaG91bGQgcmVzb2x2ZSBvbmNlIHRoZSBcImxvYWRcIiBldmVudCBpcyBlbWl0dGVkIGJ5IHRoZSA8c2NyaXB0PiBhdHRyaWJ1dGUsIG9yIHJpZ2h0IGFmdGVyIGFwcGVuZGluZyBpdCB0byB0aGUgRE9NLlxuXHQqIEByZXR1cm5zIFByb21pc2U8SFRNTFNjcmlwdEVsZW1lbnQ+XG5cdCovXG5cdGNvbnN0IGxvYWQgPSAod2FpdEZvclNjcmlwdExvYWQgPSB0cnVlKSA9PiB7XG5cdFx0aWYgKCFfcHJvbWlzZSkgX3Byb21pc2UgPSBsb2FkU2NyaXB0KHdhaXRGb3JTY3JpcHRMb2FkKTtcblx0XHRyZXR1cm4gX3Byb21pc2U7XG5cdH07XG5cdC8qKlxuXHQqIFVubG9hZCB0aGUgc2NyaXB0IHNwZWNpZmllZCBieSBgc3JjYC5cblx0Ki9cblx0Y29uc3QgdW5sb2FkID0gKCkgPT4ge1xuXHRcdGlmICghZG9jdW1lbnQkMSkgcmV0dXJuO1xuXHRcdF9wcm9taXNlID0gbnVsbDtcblx0XHRpZiAoc2NyaXB0VGFnLnZhbHVlKSBzY3JpcHRUYWcudmFsdWUgPSBudWxsO1xuXHRcdGNvbnN0IGVsID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHt0b1ZhbHVlKHNyYyl9XCJdYCk7XG5cdFx0aWYgKGVsKSBkb2N1bWVudCQxLmhlYWQucmVtb3ZlQ2hpbGQoZWwpO1xuXHR9O1xuXHRpZiAoaW1tZWRpYXRlICYmICFtYW51YWwpIHRyeU9uTW91bnRlZChsb2FkKTtcblx0aWYgKCFtYW51YWwpIHRyeU9uVW5tb3VudGVkKHVubG9hZCk7XG5cdHJldHVybiB7XG5cdFx0c2NyaXB0VGFnLFxuXHRcdGxvYWQsXG5cdFx0dW5sb2FkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNjcm9sbExvY2svaW5kZXgudHNcbmZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3dTY3JvbGwoZWxlKSB7XG5cdGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlKTtcblx0aWYgKHN0eWxlLm92ZXJmbG93WCA9PT0gXCJzY3JvbGxcIiB8fCBzdHlsZS5vdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHwgc3R5bGUub3ZlcmZsb3dYID09PSBcImF1dG9cIiAmJiBlbGUuY2xpZW50V2lkdGggPCBlbGUuc2Nyb2xsV2lkdGggfHwgc3R5bGUub3ZlcmZsb3dZID09PSBcImF1dG9cIiAmJiBlbGUuY2xpZW50SGVpZ2h0IDwgZWxlLnNjcm9sbEhlaWdodCkgcmV0dXJuIHRydWU7XG5cdGVsc2Uge1xuXHRcdGNvbnN0IHBhcmVudCA9IGVsZS5wYXJlbnROb2RlO1xuXHRcdGlmICghcGFyZW50IHx8IHBhcmVudC50YWdOYW1lID09PSBcIkJPRFlcIikgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjaGVja092ZXJmbG93U2Nyb2xsKHBhcmVudCk7XG5cdH1cbn1cbmZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KHJhd0V2ZW50KSB7XG5cdGNvbnN0IGUgPSByYXdFdmVudCB8fCB3aW5kb3cuZXZlbnQ7XG5cdGNvbnN0IF90YXJnZXQgPSBlLnRhcmdldDtcblx0aWYgKGNoZWNrT3ZlcmZsb3dTY3JvbGwoX3RhcmdldCkpIHJldHVybiBmYWxzZTtcblx0aWYgKGUudG91Y2hlcy5sZW5ndGggPiAxKSByZXR1cm4gdHJ1ZTtcblx0aWYgKGUucHJldmVudERlZmF1bHQpIGUucHJldmVudERlZmF1bHQoKTtcblx0cmV0dXJuIGZhbHNlO1xufVxuY29uc3QgZWxJbml0aWFsT3ZlcmZsb3cgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbi8qKlxuKiBMb2NrIHNjcm9sbGluZyBvZiB0aGUgZWxlbWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2Nyb2xsTG9ja1xuKiBAcGFyYW0gZWxlbWVudFxuKi9cbmZ1bmN0aW9uIHVzZVNjcm9sbExvY2soZWxlbWVudCwgaW5pdGlhbFN0YXRlID0gZmFsc2UpIHtcblx0Y29uc3QgaXNMb2NrZWQgPSBzaGFsbG93UmVmKGluaXRpYWxTdGF0ZSk7XG5cdGxldCBzdG9wVG91Y2hNb3ZlTGlzdGVuZXIgPSBudWxsO1xuXHRsZXQgaW5pdGlhbE92ZXJmbG93ID0gXCJcIjtcblx0d2F0Y2godG9SZWYoZWxlbWVudCksIChlbCkgPT4ge1xuXHRcdGNvbnN0IHRhcmdldCA9IHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWwpKTtcblx0XHRpZiAodGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBlbGUgPSB0YXJnZXQ7XG5cdFx0XHRpZiAoIWVsSW5pdGlhbE92ZXJmbG93LmdldChlbGUpKSBlbEluaXRpYWxPdmVyZmxvdy5zZXQoZWxlLCBlbGUuc3R5bGUub3ZlcmZsb3cpO1xuXHRcdFx0aWYgKGVsZS5zdHlsZS5vdmVyZmxvdyAhPT0gXCJoaWRkZW5cIikgaW5pdGlhbE92ZXJmbG93ID0gZWxlLnN0eWxlLm92ZXJmbG93O1xuXHRcdFx0aWYgKGVsZS5zdHlsZS5vdmVyZmxvdyA9PT0gXCJoaWRkZW5cIikgcmV0dXJuIGlzTG9ja2VkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpc0xvY2tlZC52YWx1ZSkgcmV0dXJuIGVsZS5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0fVxuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0Y29uc3QgbG9jayA9ICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWxlbWVudCkpO1xuXHRcdGlmICghZWwgfHwgaXNMb2NrZWQudmFsdWUpIHJldHVybjtcblx0XHRpZiAoaXNJT1MpIHN0b3BUb3VjaE1vdmVMaXN0ZW5lciA9IHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwidG91Y2htb3ZlXCIsIChlKSA9PiB7XG5cdFx0XHRwcmV2ZW50RGVmYXVsdChlKTtcblx0XHR9LCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXHRcdGVsLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcblx0XHRpc0xvY2tlZC52YWx1ZSA9IHRydWU7XG5cdH07XG5cdGNvbnN0IHVubG9jayA9ICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWxlbWVudCkpO1xuXHRcdGlmICghZWwgfHwgIWlzTG9ja2VkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKGlzSU9TKSBzdG9wVG91Y2hNb3ZlTGlzdGVuZXIgPT09IG51bGwgfHwgc3RvcFRvdWNoTW92ZUxpc3RlbmVyID09PSB2b2lkIDAgfHwgc3RvcFRvdWNoTW92ZUxpc3RlbmVyKCk7XG5cdFx0ZWwuc3R5bGUub3ZlcmZsb3cgPSBpbml0aWFsT3ZlcmZsb3c7XG5cdFx0ZWxJbml0aWFsT3ZlcmZsb3cuZGVsZXRlKGVsKTtcblx0XHRpc0xvY2tlZC52YWx1ZSA9IGZhbHNlO1xuXHR9O1xuXHR0cnlPblNjb3BlRGlzcG9zZSh1bmxvY2spO1xuXHRyZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpc0xvY2tlZC52YWx1ZTtcblx0XHR9LFxuXHRcdHNldCh2KSB7XG5cdFx0XHRpZiAodikgbG9jaygpO1xuXHRcdFx0ZWxzZSB1bmxvY2soKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTZXNzaW9uU3RvcmFnZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFNlc3Npb25TdG9yYWdlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTZXNzaW9uU3RvcmFnZVxuKiBAcGFyYW0ga2V5XG4qIEBwYXJhbSBpbml0aWFsVmFsdWVcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTZXNzaW9uU3RvcmFnZShrZXksIGluaXRpYWxWYWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB1c2VTdG9yYWdlKGtleSwgaW5pdGlhbFZhbHVlLCB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuc2Vzc2lvblN0b3JhZ2UsIG9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTaGFyZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFdlYiBTaGFyZSBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNoYXJlXG4qIEBwYXJhbSBzaGFyZU9wdGlvbnNcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VTaGFyZShzaGFyZU9wdGlvbnMgPSB7fSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IF9uYXZpZ2F0b3IgPSBuYXZpZ2F0b3IkMTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IF9uYXZpZ2F0b3IgJiYgXCJjYW5TaGFyZVwiIGluIF9uYXZpZ2F0b3IpO1xuXHRjb25zdCBzaGFyZSA9IGFzeW5jIChvdmVycmlkZU9wdGlvbnMgPSB7fSkgPT4ge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdFx0Li4udG9WYWx1ZShzaGFyZU9wdGlvbnMpLFxuXHRcdFx0XHQuLi50b1ZhbHVlKG92ZXJyaWRlT3B0aW9ucylcblx0XHRcdH07XG5cdFx0XHRsZXQgZ3JhbnRlZCA9IGZhbHNlO1xuXHRcdFx0aWYgKF9uYXZpZ2F0b3IuY2FuU2hhcmUpIGdyYW50ZWQgPSBfbmF2aWdhdG9yLmNhblNoYXJlKGRhdGEpO1xuXHRcdFx0aWYgKGdyYW50ZWQpIHJldHVybiBfbmF2aWdhdG9yLnNoYXJlKGRhdGEpO1xuXHRcdH1cblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzaGFyZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTb3J0ZWQvaW5kZXgudHNcbmNvbnN0IGRlZmF1bHRTb3J0Rm4gPSAoc291cmNlLCBjb21wYXJlRm4pID0+IHNvdXJjZS5zb3J0KGNvbXBhcmVGbik7XG5jb25zdCBkZWZhdWx0Q29tcGFyZSA9IChhLCBiKSA9PiBhIC0gYjtcbmZ1bmN0aW9uIHVzZVNvcnRlZCguLi5hcmdzKSB7XG5cdGNvbnN0IFtzb3VyY2VdID0gYXJncztcblx0bGV0IGNvbXBhcmVGbiA9IGRlZmF1bHRDb21wYXJlO1xuXHRsZXQgb3B0aW9ucyA9IHt9O1xuXHRpZiAoYXJncy5sZW5ndGggPT09IDIpIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdHZhciBfb3B0aW9ucyRjb21wYXJlRm47XG5cdFx0b3B0aW9ucyA9IGFyZ3NbMV07XG5cdFx0Y29tcGFyZUZuID0gKF9vcHRpb25zJGNvbXBhcmVGbiA9IG9wdGlvbnMuY29tcGFyZUZuKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRjb21wYXJlRm4gIT09IHZvaWQgMCA/IF9vcHRpb25zJGNvbXBhcmVGbiA6IGRlZmF1bHRDb21wYXJlO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBfYXJncyQ7XG5cdFx0Y29tcGFyZUZuID0gKF9hcmdzJCA9IGFyZ3NbMV0pICE9PSBudWxsICYmIF9hcmdzJCAhPT0gdm9pZCAwID8gX2FyZ3MkIDogZGVmYXVsdENvbXBhcmU7XG5cdH1cblx0ZWxzZSBpZiAoYXJncy5sZW5ndGggPiAyKSB7XG5cdFx0dmFyIF9hcmdzJDIsIF9hcmdzJDM7XG5cdFx0Y29tcGFyZUZuID0gKF9hcmdzJDIgPSBhcmdzWzFdKSAhPT0gbnVsbCAmJiBfYXJncyQyICE9PSB2b2lkIDAgPyBfYXJncyQyIDogZGVmYXVsdENvbXBhcmU7XG5cdFx0b3B0aW9ucyA9IChfYXJncyQzID0gYXJnc1syXSkgIT09IG51bGwgJiYgX2FyZ3MkMyAhPT0gdm9pZCAwID8gX2FyZ3MkMyA6IHt9O1xuXHR9XG5cdGNvbnN0IHsgZGlydHkgPSBmYWxzZSwgc29ydEZuID0gZGVmYXVsdFNvcnRGbiB9ID0gb3B0aW9ucztcblx0aWYgKCFkaXJ0eSkgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHNvcnRGbihbLi4udG9WYWx1ZShzb3VyY2UpXSwgY29tcGFyZUZuKSk7XG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRjb25zdCByZXN1bHQgPSBzb3J0Rm4odG9WYWx1ZShzb3VyY2UpLCBjb21wYXJlRm4pO1xuXHRcdGlmIChpc1JlZihzb3VyY2UpKSBzb3VyY2UudmFsdWUgPSByZXN1bHQ7XG5cdFx0ZWxzZSBzb3VyY2Uuc3BsaWNlKDAsIHNvdXJjZS5sZW5ndGgsIC4uLnJlc3VsdCk7XG5cdH0pO1xuXHRyZXR1cm4gc291cmNlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTcGVlY2hSZWNvZ25pdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFNwZWVjaFJlY29nbml0aW9uLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTcGVlY2hSZWNvZ25pdGlvblxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TcGVlY2hSZWNvZ25pdGlvbiBTcGVlY2hSZWNvZ25pdGlvblxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVNwZWVjaFJlY29nbml0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGludGVyaW1SZXN1bHRzID0gdHJ1ZSwgY29udGludW91cyA9IHRydWUsIG1heEFsdGVybmF0aXZlcyA9IDEsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBsYW5nID0gdG9SZWYob3B0aW9ucy5sYW5nIHx8IFwiZW4tVVNcIik7XG5cdGNvbnN0IGlzTGlzdGVuaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGlzRmluYWwgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgcmVzdWx0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGxldCByZWNvZ25pdGlvbjtcblx0Y29uc3Qgc3RhcnQgPSAoKSA9PiB7XG5cdFx0aXNMaXN0ZW5pbmcudmFsdWUgPSB0cnVlO1xuXHR9O1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdGlzTGlzdGVuaW5nLnZhbHVlID0gZmFsc2U7XG5cdH07XG5cdGNvbnN0IHRvZ2dsZSA9ICh2YWx1ZSA9ICFpc0xpc3RlbmluZy52YWx1ZSkgPT4ge1xuXHRcdGlmICh2YWx1ZSkgc3RhcnQoKTtcblx0XHRlbHNlIHN0b3AoKTtcblx0fTtcblx0Y29uc3QgU3BlZWNoUmVjb2duaXRpb24gPSB3aW5kb3ckMSAmJiAod2luZG93JDEuU3BlZWNoUmVjb2duaXRpb24gfHwgd2luZG93JDEud2Via2l0U3BlZWNoUmVjb2duaXRpb24pO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gU3BlZWNoUmVjb2duaXRpb24pO1xuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcblx0XHRyZWNvZ25pdGlvbiA9IG5ldyBTcGVlY2hSZWNvZ25pdGlvbigpO1xuXHRcdHJlY29nbml0aW9uLmNvbnRpbnVvdXMgPSBjb250aW51b3VzO1xuXHRcdHJlY29nbml0aW9uLmludGVyaW1SZXN1bHRzID0gaW50ZXJpbVJlc3VsdHM7XG5cdFx0cmVjb2duaXRpb24ubGFuZyA9IHRvVmFsdWUobGFuZyk7XG5cdFx0cmVjb2duaXRpb24ubWF4QWx0ZXJuYXRpdmVzID0gbWF4QWx0ZXJuYXRpdmVzO1xuXHRcdHJlY29nbml0aW9uLm9uc3RhcnQgPSAoKSA9PiB7XG5cdFx0XHRpc0xpc3RlbmluZy52YWx1ZSA9IHRydWU7XG5cdFx0XHRpc0ZpbmFsLnZhbHVlID0gZmFsc2U7XG5cdFx0fTtcblx0XHR3YXRjaChsYW5nLCAobGFuZyQxKSA9PiB7XG5cdFx0XHRpZiAocmVjb2duaXRpb24gJiYgIWlzTGlzdGVuaW5nLnZhbHVlKSByZWNvZ25pdGlvbi5sYW5nID0gbGFuZyQxO1xuXHRcdH0pO1xuXHRcdHJlY29nbml0aW9uLm9ucmVzdWx0ID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRjb25zdCBjdXJyZW50UmVzdWx0ID0gZXZlbnQucmVzdWx0c1tldmVudC5yZXN1bHRJbmRleF07XG5cdFx0XHRjb25zdCB7IHRyYW5zY3JpcHQgfSA9IGN1cnJlbnRSZXN1bHRbMF07XG5cdFx0XHRpc0ZpbmFsLnZhbHVlID0gY3VycmVudFJlc3VsdC5pc0ZpbmFsO1xuXHRcdFx0cmVzdWx0LnZhbHVlID0gdHJhbnNjcmlwdDtcblx0XHRcdGVycm9yLnZhbHVlID0gdm9pZCAwO1xuXHRcdH07XG5cdFx0cmVjb2duaXRpb24ub25lcnJvciA9IChldmVudCkgPT4ge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBldmVudDtcblx0XHR9O1xuXHRcdHJlY29nbml0aW9uLm9uZW5kID0gKCkgPT4ge1xuXHRcdFx0aXNMaXN0ZW5pbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdHJlY29nbml0aW9uLmxhbmcgPSB0b1ZhbHVlKGxhbmcpO1xuXHRcdH07XG5cdFx0d2F0Y2goaXNMaXN0ZW5pbmcsIChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IHtcblx0XHRcdGlmIChuZXdWYWx1ZSA9PT0gb2xkVmFsdWUpIHJldHVybjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuZXdWYWx1ZSkgcmVjb2duaXRpb24uc3RhcnQoKTtcblx0XHRcdFx0ZWxzZSByZWNvZ25pdGlvbi5zdG9wKCk7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0ZXJyb3IudmFsdWUgPSBlcnI7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHN0b3AoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNMaXN0ZW5pbmcsXG5cdFx0aXNGaW5hbCxcblx0XHRyZWNvZ25pdGlvbixcblx0XHRyZXN1bHQsXG5cdFx0ZXJyb3IsXG5cdFx0dG9nZ2xlLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3BlZWNoU3ludGhlc2lzL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgU3BlZWNoU3ludGhlc2lzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTcGVlY2hTeW50aGVzaXNcbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU3BlZWNoU3ludGhlc2lzIFNwZWVjaFN5bnRoZXNpc1xuKi9cbmZ1bmN0aW9uIHVzZVNwZWVjaFN5bnRoZXNpcyh0ZXh0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBwaXRjaCA9IDEsIHJhdGUgPSAxLCB2b2x1bWUgPSAxLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgb25Cb3VuZGFyeSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgc3ludGggPSB3aW5kb3ckMSAmJiB3aW5kb3ckMS5zcGVlY2hTeW50aGVzaXM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBzeW50aCk7XG5cdGNvbnN0IGlzUGxheWluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzdGF0dXMgPSBzaGFsbG93UmVmKFwiaW5pdFwiKTtcblx0Y29uc3Qgc3Bva2VuVGV4dCA9IHRvUmVmKHRleHQgfHwgXCJcIik7XG5cdGNvbnN0IGxhbmcgPSB0b1JlZihvcHRpb25zLmxhbmcgfHwgXCJlbi1VU1wiKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IHRvZ2dsZSA9ICh2YWx1ZSA9ICFpc1BsYXlpbmcudmFsdWUpID0+IHtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSB2YWx1ZTtcblx0fTtcblx0Y29uc3QgYmluZEV2ZW50c0ZvclV0dGVyYW5jZSA9ICh1dHRlcmFuY2UkMSkgPT4ge1xuXHRcdHV0dGVyYW5jZSQxLmxhbmcgPSB0b1ZhbHVlKGxhbmcpO1xuXHRcdHV0dGVyYW5jZSQxLnZvaWNlID0gdG9WYWx1ZShvcHRpb25zLnZvaWNlKSB8fCBudWxsO1xuXHRcdHV0dGVyYW5jZSQxLnBpdGNoID0gdG9WYWx1ZShwaXRjaCk7XG5cdFx0dXR0ZXJhbmNlJDEucmF0ZSA9IHRvVmFsdWUocmF0ZSk7XG5cdFx0dXR0ZXJhbmNlJDEudm9sdW1lID0gdG9WYWx1ZSh2b2x1bWUpO1xuXHRcdHV0dGVyYW5jZSQxLm9uc3RhcnQgPSAoKSA9PiB7XG5cdFx0XHRpc1BsYXlpbmcudmFsdWUgPSB0cnVlO1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJwbGF5XCI7XG5cdFx0fTtcblx0XHR1dHRlcmFuY2UkMS5vbnBhdXNlID0gKCkgPT4ge1xuXHRcdFx0aXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcInBhdXNlXCI7XG5cdFx0fTtcblx0XHR1dHRlcmFuY2UkMS5vbnJlc3VtZSA9ICgpID0+IHtcblx0XHRcdGlzUGxheWluZy52YWx1ZSA9IHRydWU7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcInBsYXlcIjtcblx0XHR9O1xuXHRcdHV0dGVyYW5jZSQxLm9uZW5kID0gKCkgPT4ge1xuXHRcdFx0aXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcImVuZFwiO1xuXHRcdH07XG5cdFx0dXR0ZXJhbmNlJDEub25lcnJvciA9IChldmVudCkgPT4ge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBldmVudDtcblx0XHR9O1xuXHRcdHV0dGVyYW5jZSQxLm9uYm91bmRhcnkgPSAoZXZlbnQpID0+IHtcblx0XHRcdG9uQm91bmRhcnkgPT09IG51bGwgfHwgb25Cb3VuZGFyeSA9PT0gdm9pZCAwIHx8IG9uQm91bmRhcnkoZXZlbnQpO1xuXHRcdH07XG5cdH07XG5cdGNvbnN0IHV0dGVyYW5jZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRzdGF0dXMudmFsdWUgPSBcImluaXRcIjtcblx0XHRjb25zdCBuZXdVdHRlcmFuY2UgPSBuZXcgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKHNwb2tlblRleHQudmFsdWUpO1xuXHRcdGJpbmRFdmVudHNGb3JVdHRlcmFuY2UobmV3VXR0ZXJhbmNlKTtcblx0XHRyZXR1cm4gbmV3VXR0ZXJhbmNlO1xuXHR9KTtcblx0Y29uc3Qgc3BlYWsgPSAoKSA9PiB7XG5cdFx0c3ludGguY2FuY2VsKCk7XG5cdFx0aWYgKHV0dGVyYW5jZSkgc3ludGguc3BlYWsodXR0ZXJhbmNlLnZhbHVlKTtcblx0fTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRzeW50aC5jYW5jZWwoKTtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0YmluZEV2ZW50c0ZvclV0dGVyYW5jZSh1dHRlcmFuY2UudmFsdWUpO1xuXHRcdHdhdGNoKGxhbmcsIChsYW5nJDEpID0+IHtcblx0XHRcdGlmICh1dHRlcmFuY2UudmFsdWUgJiYgIWlzUGxheWluZy52YWx1ZSkgdXR0ZXJhbmNlLnZhbHVlLmxhbmcgPSBsYW5nJDE7XG5cdFx0fSk7XG5cdFx0aWYgKG9wdGlvbnMudm9pY2UpIHdhdGNoKG9wdGlvbnMudm9pY2UsICgpID0+IHtcblx0XHRcdHN5bnRoLmNhbmNlbCgpO1xuXHRcdH0pO1xuXHRcdHdhdGNoKGlzUGxheWluZywgKCkgPT4ge1xuXHRcdFx0aWYgKGlzUGxheWluZy52YWx1ZSkgc3ludGgucmVzdW1lKCk7XG5cdFx0XHRlbHNlIHN5bnRoLnBhdXNlKCk7XG5cdFx0fSk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdGlzUGxheWluZy52YWx1ZSA9IGZhbHNlO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRpc1BsYXlpbmcsXG5cdFx0c3RhdHVzLFxuXHRcdHV0dGVyYW5jZSxcblx0XHRlcnJvcixcblx0XHRzdG9wLFxuXHRcdHRvZ2dsZSxcblx0XHRzcGVha1xuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTdGVwcGVyL2luZGV4LnRzXG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlU3RlcHBlcihzdGVwcywgaW5pdGlhbFN0ZXApIHtcblx0Y29uc3Qgc3RlcHNSZWYgPSByZWYoc3RlcHMpO1xuXHRjb25zdCBzdGVwTmFtZXMgPSBjb21wdXRlZCgoKSA9PiBBcnJheS5pc0FycmF5KHN0ZXBzUmVmLnZhbHVlKSA/IHN0ZXBzUmVmLnZhbHVlIDogT2JqZWN0LmtleXMoc3RlcHNSZWYudmFsdWUpKTtcblx0Y29uc3QgaW5kZXggPSByZWYoc3RlcE5hbWVzLnZhbHVlLmluZGV4T2YoaW5pdGlhbFN0ZXAgIT09IG51bGwgJiYgaW5pdGlhbFN0ZXAgIT09IHZvaWQgMCA/IGluaXRpYWxTdGVwIDogc3RlcE5hbWVzLnZhbHVlWzBdKSk7XG5cdGNvbnN0IGN1cnJlbnQgPSBjb21wdXRlZCgoKSA9PiBhdChpbmRleC52YWx1ZSkpO1xuXHRjb25zdCBpc0ZpcnN0ID0gY29tcHV0ZWQoKCkgPT4gaW5kZXgudmFsdWUgPT09IDApO1xuXHRjb25zdCBpc0xhc3QgPSBjb21wdXRlZCgoKSA9PiBpbmRleC52YWx1ZSA9PT0gc3RlcE5hbWVzLnZhbHVlLmxlbmd0aCAtIDEpO1xuXHRjb25zdCBuZXh0ID0gY29tcHV0ZWQoKCkgPT4gc3RlcE5hbWVzLnZhbHVlW2luZGV4LnZhbHVlICsgMV0pO1xuXHRjb25zdCBwcmV2aW91cyA9IGNvbXB1dGVkKCgpID0+IHN0ZXBOYW1lcy52YWx1ZVtpbmRleC52YWx1ZSAtIDFdKTtcblx0ZnVuY3Rpb24gYXQoaW5kZXgkMSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHN0ZXBzUmVmLnZhbHVlKSkgcmV0dXJuIHN0ZXBzUmVmLnZhbHVlW2luZGV4JDFdO1xuXHRcdHJldHVybiBzdGVwc1JlZi52YWx1ZVtzdGVwTmFtZXMudmFsdWVbaW5kZXgkMV1dO1xuXHR9XG5cdGZ1bmN0aW9uIGdldChzdGVwKSB7XG5cdFx0aWYgKCFzdGVwTmFtZXMudmFsdWUuaW5jbHVkZXMoc3RlcCkpIHJldHVybjtcblx0XHRyZXR1cm4gYXQoc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkpO1xuXHR9XG5cdGZ1bmN0aW9uIGdvVG8oc3RlcCkge1xuXHRcdGlmIChzdGVwTmFtZXMudmFsdWUuaW5jbHVkZXMoc3RlcCkpIGluZGV4LnZhbHVlID0gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCk7XG5cdH1cblx0ZnVuY3Rpb24gZ29Ub05leHQoKSB7XG5cdFx0aWYgKGlzTGFzdC52YWx1ZSkgcmV0dXJuO1xuXHRcdGluZGV4LnZhbHVlKys7XG5cdH1cblx0ZnVuY3Rpb24gZ29Ub1ByZXZpb3VzKCkge1xuXHRcdGlmIChpc0ZpcnN0LnZhbHVlKSByZXR1cm47XG5cdFx0aW5kZXgudmFsdWUtLTtcblx0fVxuXHRmdW5jdGlvbiBnb0JhY2tUbyhzdGVwKSB7XG5cdFx0aWYgKGlzQWZ0ZXIoc3RlcCkpIGdvVG8oc3RlcCk7XG5cdH1cblx0ZnVuY3Rpb24gaXNOZXh0KHN0ZXApIHtcblx0XHRyZXR1cm4gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkgPT09IGluZGV4LnZhbHVlICsgMTtcblx0fVxuXHRmdW5jdGlvbiBpc1ByZXZpb3VzKHN0ZXApIHtcblx0XHRyZXR1cm4gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkgPT09IGluZGV4LnZhbHVlIC0gMTtcblx0fVxuXHRmdW5jdGlvbiBpc0N1cnJlbnQoc3RlcCkge1xuXHRcdHJldHVybiBzdGVwTmFtZXMudmFsdWUuaW5kZXhPZihzdGVwKSA9PT0gaW5kZXgudmFsdWU7XG5cdH1cblx0ZnVuY3Rpb24gaXNCZWZvcmUoc3RlcCkge1xuXHRcdHJldHVybiBpbmRleC52YWx1ZSA8IHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApO1xuXHR9XG5cdGZ1bmN0aW9uIGlzQWZ0ZXIoc3RlcCkge1xuXHRcdHJldHVybiBpbmRleC52YWx1ZSA+IHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0c3RlcHM6IHN0ZXBzUmVmLFxuXHRcdHN0ZXBOYW1lcyxcblx0XHRpbmRleCxcblx0XHRjdXJyZW50LFxuXHRcdG5leHQsXG5cdFx0cHJldmlvdXMsXG5cdFx0aXNGaXJzdCxcblx0XHRpc0xhc3QsXG5cdFx0YXQsXG5cdFx0Z2V0LFxuXHRcdGdvVG8sXG5cdFx0Z29Ub05leHQsXG5cdFx0Z29Ub1ByZXZpb3VzLFxuXHRcdGdvQmFja1RvLFxuXHRcdGlzTmV4dCxcblx0XHRpc1ByZXZpb3VzLFxuXHRcdGlzQ3VycmVudCxcblx0XHRpc0JlZm9yZSxcblx0XHRpc0FmdGVyXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN0b3JhZ2VBc3luYy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFN0b3JhZ2UgaW4gd2l0aCBhc3luYyBzdXBwb3J0LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTdG9yYWdlQXN5bmNcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaW5pdGlhbFZhbHVlXG4qIEBwYXJhbSBzdG9yYWdlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU3RvcmFnZUFzeW5jKGtleSwgaW5pdGlhbFZhbHVlLCBzdG9yYWdlLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJHNlcmlhbGl6ZXI7XG5cdGNvbnN0IHsgZmx1c2ggPSBcInByZVwiLCBkZWVwID0gdHJ1ZSwgbGlzdGVuVG9TdG9yYWdlQ2hhbmdlcyA9IHRydWUsIHdyaXRlRGVmYXVsdHMgPSB0cnVlLCBtZXJnZURlZmF1bHRzID0gZmFsc2UsIHNoYWxsb3csIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBldmVudEZpbHRlciwgb25FcnJvciA9IChlKSA9PiB7XG5cdFx0Y29uc29sZS5lcnJvcihlKTtcblx0fSwgb25SZWFkeSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcmF3SW5pdCA9IHRvVmFsdWUoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgdHlwZSA9IGd1ZXNzU2VyaWFsaXplclR5cGUocmF3SW5pdCk7XG5cdGNvbnN0IGRhdGEgPSAoc2hhbGxvdyA/IHNoYWxsb3dSZWYgOiByZWYpKHRvVmFsdWUoaW5pdGlhbFZhbHVlKSk7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSAoX29wdGlvbnMkc2VyaWFsaXplciA9IG9wdGlvbnMuc2VyaWFsaXplcikgIT09IG51bGwgJiYgX29wdGlvbnMkc2VyaWFsaXplciAhPT0gdm9pZCAwID8gX29wdGlvbnMkc2VyaWFsaXplciA6IFN0b3JhZ2VTZXJpYWxpemVyc1t0eXBlXTtcblx0aWYgKCFzdG9yYWdlKSB0cnkge1xuXHRcdHN0b3JhZ2UgPSBnZXRTU1JIYW5kbGVyKFwiZ2V0RGVmYXVsdFN0b3JhZ2VBc3luY1wiLCAoKSA9PiBkZWZhdWx0V2luZG93ID09PSBudWxsIHx8IGRlZmF1bHRXaW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlZmF1bHRXaW5kb3cubG9jYWxTdG9yYWdlKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0b25FcnJvcihlKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZWFkKGV2ZW50KSB7XG5cdFx0aWYgKCFzdG9yYWdlIHx8IGV2ZW50ICYmIGV2ZW50LmtleSAhPT0ga2V5KSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJhd1ZhbHVlID0gZXZlbnQgPyBldmVudC5uZXdWYWx1ZSA6IGF3YWl0IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXHRcdFx0aWYgKHJhd1ZhbHVlID09IG51bGwpIHtcblx0XHRcdFx0ZGF0YS52YWx1ZSA9IHJhd0luaXQ7XG5cdFx0XHRcdGlmICh3cml0ZURlZmF1bHRzICYmIHJhd0luaXQgIT09IG51bGwpIGF3YWl0IHN0b3JhZ2Uuc2V0SXRlbShrZXksIGF3YWl0IHNlcmlhbGl6ZXIud3JpdGUocmF3SW5pdCkpO1xuXHRcdFx0fSBlbHNlIGlmIChtZXJnZURlZmF1bHRzKSB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gYXdhaXQgc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0XHRcdFx0aWYgKHR5cGVvZiBtZXJnZURlZmF1bHRzID09PSBcImZ1bmN0aW9uXCIpIGRhdGEudmFsdWUgPSBtZXJnZURlZmF1bHRzKHZhbHVlLCByYXdJbml0KTtcblx0XHRcdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIGRhdGEudmFsdWUgPSB7XG5cdFx0XHRcdFx0Li4ucmF3SW5pdCxcblx0XHRcdFx0XHQuLi52YWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRlbHNlIGRhdGEudmFsdWUgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBkYXRhLnZhbHVlID0gYXdhaXQgc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fVxuXHRjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRyZWFkKCkudGhlbigoKSA9PiB7XG5cdFx0XHRvblJlYWR5ID09PSBudWxsIHx8IG9uUmVhZHkgPT09IHZvaWQgMCB8fCBvblJlYWR5KGRhdGEudmFsdWUpO1xuXHRcdFx0cmVzb2x2ZShkYXRhKTtcblx0XHR9KTtcblx0fSk7XG5cdGlmICh3aW5kb3ckMSAmJiBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInN0b3JhZ2VcIiwgKGUpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gcmVhZChlKSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0aWYgKHN0b3JhZ2UpIHdhdGNoV2l0aEZpbHRlcihkYXRhLCBhc3luYyAoKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChkYXRhLnZhbHVlID09IG51bGwpIGF3YWl0IHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuXHRcdFx0ZWxzZSBhd2FpdCBzdG9yYWdlLnNldEl0ZW0oa2V5LCBhd2FpdCBzZXJpYWxpemVyLndyaXRlKGRhdGEudmFsdWUpKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0ZXZlbnRGaWx0ZXJcblx0fSk7XG5cdE9iamVjdC5hc3NpZ24oZGF0YSwge1xuXHRcdHRoZW46IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpLFxuXHRcdGNhdGNoOiBwcm9taXNlLmNhdGNoLmJpbmQocHJvbWlzZSlcblx0fSk7XG5cdHJldHVybiBkYXRhO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTdHlsZVRhZy9pbmRleC50c1xubGV0IF9pZCA9IDA7XG4vKipcbiogSW5qZWN0IDxzdHlsZT4gZWxlbWVudCBpbiBoZWFkLlxuKlxuKiBPdmVybG9hZDogT21pdHRlZCBpZFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTdHlsZVRhZ1xuKiBAcGFyYW0gY3NzXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU3R5bGVUYWcoY3NzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgaXNMb2FkZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgaW1tZWRpYXRlID0gdHJ1ZSwgbWFudWFsID0gZmFsc2UsIGlkID0gYHZ1ZXVzZV9zdHlsZXRhZ18keysrX2lkfWAgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNzc1JlZiA9IHNoYWxsb3dSZWYoY3NzKTtcblx0bGV0IHN0b3AgPSAoKSA9PiB7fTtcblx0Y29uc3QgbG9hZCA9ICgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHJldHVybjtcblx0XHRjb25zdCBlbCA9IGRvY3VtZW50JDEuZ2V0RWxlbWVudEJ5SWQoaWQpIHx8IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdGlmICghZWwuaXNDb25uZWN0ZWQpIHtcblx0XHRcdGVsLmlkID0gaWQ7XG5cdFx0XHRpZiAob3B0aW9ucy5ub25jZSkgZWwubm9uY2UgPSBvcHRpb25zLm5vbmNlO1xuXHRcdFx0aWYgKG9wdGlvbnMubWVkaWEpIGVsLm1lZGlhID0gb3B0aW9ucy5tZWRpYTtcblx0XHRcdGRvY3VtZW50JDEuaGVhZC5hcHBlbmRDaGlsZChlbCk7XG5cdFx0fVxuXHRcdGlmIChpc0xvYWRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdHN0b3AgPSB3YXRjaChjc3NSZWYsICh2YWx1ZSkgPT4ge1xuXHRcdFx0ZWwudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0XHRpc0xvYWRlZC52YWx1ZSA9IHRydWU7XG5cdH07XG5cdGNvbnN0IHVubG9hZCA9ICgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEgfHwgIWlzTG9hZGVkLnZhbHVlKSByZXR1cm47XG5cdFx0c3RvcCgpO1xuXHRcdGRvY3VtZW50JDEuaGVhZC5yZW1vdmVDaGlsZChkb2N1bWVudCQxLmdldEVsZW1lbnRCeUlkKGlkKSk7XG5cdFx0aXNMb2FkZWQudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0aWYgKGltbWVkaWF0ZSAmJiAhbWFudWFsKSB0cnlPbk1vdW50ZWQobG9hZCk7XG5cdGlmICghbWFudWFsKSB0cnlPblNjb3BlRGlzcG9zZSh1bmxvYWQpO1xuXHRyZXR1cm4ge1xuXHRcdGlkLFxuXHRcdGNzczogY3NzUmVmLFxuXHRcdHVubG9hZCxcblx0XHRsb2FkLFxuXHRcdGlzTG9hZGVkOiByZWFkb25seShpc0xvYWRlZClcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3dpcGUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBzd2lwZSBkZXRlY3Rpb24uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVN3aXBlXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTd2lwZSh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocmVzaG9sZCA9IDUwLCBvblN3aXBlLCBvblN3aXBlRW5kLCBvblN3aXBlU3RhcnQsIHBhc3NpdmUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjb29yZHNTdGFydCA9IHJlYWN0aXZlKHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IGNvb3Jkc0VuZCA9IHJlYWN0aXZlKHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IGRpZmZYID0gY29tcHV0ZWQoKCkgPT4gY29vcmRzU3RhcnQueCAtIGNvb3Jkc0VuZC54KTtcblx0Y29uc3QgZGlmZlkgPSBjb21wdXRlZCgoKSA9PiBjb29yZHNTdGFydC55IC0gY29vcmRzRW5kLnkpO1xuXHRjb25zdCB7IG1heCwgYWJzIH0gPSBNYXRoO1xuXHRjb25zdCBpc1RocmVzaG9sZEV4Y2VlZGVkID0gY29tcHV0ZWQoKCkgPT4gbWF4KGFicyhkaWZmWC52YWx1ZSksIGFicyhkaWZmWS52YWx1ZSkpID49IHRocmVzaG9sZCk7XG5cdGNvbnN0IGlzU3dpcGluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBkaXJlY3Rpb24gPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKCFpc1RocmVzaG9sZEV4Y2VlZGVkLnZhbHVlKSByZXR1cm4gXCJub25lXCI7XG5cdFx0aWYgKGFicyhkaWZmWC52YWx1ZSkgPiBhYnMoZGlmZlkudmFsdWUpKSByZXR1cm4gZGlmZlgudmFsdWUgPiAwID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCI7XG5cdFx0ZWxzZSByZXR1cm4gZGlmZlkudmFsdWUgPiAwID8gXCJ1cFwiIDogXCJkb3duXCI7XG5cdH0pO1xuXHRjb25zdCBnZXRUb3VjaEV2ZW50Q29vcmRzID0gKGUpID0+IFtlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFldO1xuXHRjb25zdCB1cGRhdGVDb29yZHNTdGFydCA9ICh4LCB5KSA9PiB7XG5cdFx0Y29vcmRzU3RhcnQueCA9IHg7XG5cdFx0Y29vcmRzU3RhcnQueSA9IHk7XG5cdH07XG5cdGNvbnN0IHVwZGF0ZUNvb3Jkc0VuZCA9ICh4LCB5KSA9PiB7XG5cdFx0Y29vcmRzRW5kLnggPSB4O1xuXHRcdGNvb3Jkc0VuZC55ID0geTtcblx0fTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdHBhc3NpdmUsXG5cdFx0Y2FwdHVyZTogIXBhc3NpdmVcblx0fTtcblx0Y29uc3Qgb25Ub3VjaEVuZCA9IChlKSA9PiB7XG5cdFx0aWYgKGlzU3dpcGluZy52YWx1ZSkgb25Td2lwZUVuZCA9PT0gbnVsbCB8fCBvblN3aXBlRW5kID09PSB2b2lkIDAgfHwgb25Td2lwZUVuZChlLCBkaXJlY3Rpb24udmFsdWUpO1xuXHRcdGlzU3dpcGluZy52YWx1ZSA9IGZhbHNlO1xuXHR9O1xuXHRjb25zdCBzdG9wcyA9IFtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJ0b3VjaHN0YXJ0XCIsIChlKSA9PiB7XG5cdFx0XHRpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMSkgcmV0dXJuO1xuXHRcdFx0Y29uc3QgW3gsIHldID0gZ2V0VG91Y2hFdmVudENvb3JkcyhlKTtcblx0XHRcdHVwZGF0ZUNvb3Jkc1N0YXJ0KHgsIHkpO1xuXHRcdFx0dXBkYXRlQ29vcmRzRW5kKHgsIHkpO1xuXHRcdFx0b25Td2lwZVN0YXJ0ID09PSBudWxsIHx8IG9uU3dpcGVTdGFydCA9PT0gdm9pZCAwIHx8IG9uU3dpcGVTdGFydChlKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRvdWNobW92ZVwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKGUudG91Y2hlcy5sZW5ndGggIT09IDEpIHJldHVybjtcblx0XHRcdGNvbnN0IFt4LCB5XSA9IGdldFRvdWNoRXZlbnRDb29yZHMoZSk7XG5cdFx0XHR1cGRhdGVDb29yZHNFbmQoeCwgeSk7XG5cdFx0XHRpZiAobGlzdGVuZXJPcHRpb25zLmNhcHR1cmUgJiYgIWxpc3RlbmVyT3B0aW9ucy5wYXNzaXZlICYmIE1hdGguYWJzKGRpZmZYLnZhbHVlKSA+IE1hdGguYWJzKGRpZmZZLnZhbHVlKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKCFpc1N3aXBpbmcudmFsdWUgJiYgaXNUaHJlc2hvbGRFeGNlZWRlZC52YWx1ZSkgaXNTd2lwaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpc1N3aXBpbmcudmFsdWUpIG9uU3dpcGUgPT09IG51bGwgfHwgb25Td2lwZSA9PT0gdm9pZCAwIHx8IG9uU3dpcGUoZSk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgW1widG91Y2hlbmRcIiwgXCJ0b3VjaGNhbmNlbFwiXSwgb25Ub3VjaEVuZCwgbGlzdGVuZXJPcHRpb25zKVxuXHRdO1xuXHRjb25zdCBzdG9wID0gKCkgPT4gc3RvcHMuZm9yRWFjaCgocykgPT4gcygpKTtcblx0cmV0dXJuIHtcblx0XHRpc1N3aXBpbmcsXG5cdFx0ZGlyZWN0aW9uLFxuXHRcdGNvb3Jkc1N0YXJ0LFxuXHRcdGNvb3Jkc0VuZCxcblx0XHRsZW5ndGhYOiBkaWZmWCxcblx0XHRsZW5ndGhZOiBkaWZmWSxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRlbXBsYXRlUmVmc0xpc3QvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VUZW1wbGF0ZVJlZnNMaXN0KCkge1xuXHRjb25zdCByZWZzID0gcmVmKFtdKTtcblx0cmVmcy52YWx1ZS5zZXQgPSAoZWwpID0+IHtcblx0XHRpZiAoZWwpIHJlZnMudmFsdWUucHVzaChlbCk7XG5cdH07XG5cdG9uQmVmb3JlVXBkYXRlKCgpID0+IHtcblx0XHRyZWZzLnZhbHVlLmxlbmd0aCA9IDA7XG5cdH0pO1xuXHRyZXR1cm4gcmVmcztcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGV4dERpcmVjdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGRpciBvZiB0aGUgZWxlbWVudCdzIHRleHQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRleHREaXJlY3Rpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUZXh0RGlyZWN0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50LCBzZWxlY3RvciA9IFwiaHRtbFwiLCBvYnNlcnZlID0gZmFsc2UsIGluaXRpYWxWYWx1ZSA9IFwibHRyXCIgfSA9IG9wdGlvbnM7XG5cdGZ1bmN0aW9uIGdldFZhbHVlJDEoKSB7XG5cdFx0dmFyIF9yZWYsIF9kb2N1bWVudCRxdWVyeVNlbGVjdDtcblx0XHRyZXR1cm4gKF9yZWYgPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCB8fCAoX2RvY3VtZW50JHF1ZXJ5U2VsZWN0ID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkgPT09IG51bGwgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZG9jdW1lbnQkcXVlcnlTZWxlY3QuZ2V0QXR0cmlidXRlKFwiZGlyXCIpKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogaW5pdGlhbFZhbHVlO1xuXHR9XG5cdGNvbnN0IGRpciA9IHJlZihnZXRWYWx1ZSQxKCkpO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4gZGlyLnZhbHVlID0gZ2V0VmFsdWUkMSgpKTtcblx0aWYgKG9ic2VydmUgJiYgZG9jdW1lbnQkMSkgdXNlTXV0YXRpb25PYnNlcnZlcihkb2N1bWVudCQxLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLCAoKSA9PiBkaXIudmFsdWUgPSBnZXRWYWx1ZSQxKCksIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcblx0cmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZGlyLnZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KHYpIHtcblx0XHRcdHZhciBfZG9jdW1lbnQkcXVlcnlTZWxlY3QyLCBfZG9jdW1lbnQkcXVlcnlTZWxlY3QzO1xuXHRcdFx0ZGlyLnZhbHVlID0gdjtcblx0XHRcdGlmICghZG9jdW1lbnQkMSkgcmV0dXJuO1xuXHRcdFx0aWYgKGRpci52YWx1ZSkgKF9kb2N1bWVudCRxdWVyeVNlbGVjdDIgPSBkb2N1bWVudCQxLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkcXVlcnlTZWxlY3QyID09PSB2b2lkIDAgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0Mi5zZXRBdHRyaWJ1dGUoXCJkaXJcIiwgZGlyLnZhbHVlKTtcblx0XHRcdGVsc2UgKF9kb2N1bWVudCRxdWVyeVNlbGVjdDMgPSBkb2N1bWVudCQxLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkcXVlcnlTZWxlY3QzID09PSB2b2lkIDAgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0My5yZW1vdmVBdHRyaWJ1dGUoXCJkaXJcIik7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGV4dFNlbGVjdGlvbi9pbmRleC50c1xuZnVuY3Rpb24gZ2V0UmFuZ2VzRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pIHtcblx0dmFyIF9zZWxlY3Rpb24kcmFuZ2VDb3VudDtcblx0Y29uc3QgcmFuZ2VDb3VudCA9IChfc2VsZWN0aW9uJHJhbmdlQ291bnQgPSBzZWxlY3Rpb24ucmFuZ2VDb3VudCkgIT09IG51bGwgJiYgX3NlbGVjdGlvbiRyYW5nZUNvdW50ICE9PSB2b2lkIDAgPyBfc2VsZWN0aW9uJHJhbmdlQ291bnQgOiAwO1xuXHRyZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogcmFuZ2VDb3VudCB9LCAoXywgaSkgPT4gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSkpO1xufVxuLyoqXG4qIFJlYWN0aXZlbHkgdHJhY2sgdXNlciB0ZXh0IHNlbGVjdGlvbiBiYXNlZCBvbiBbYFdpbmRvdy5nZXRTZWxlY3Rpb25gXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldFNlbGVjdGlvbikuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRleHRTZWxlY3Rpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUZXh0U2VsZWN0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX3dpbmRvdyRnZXRTZWxlY3Rpb247XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHNlbGVjdGlvbiA9IHNoYWxsb3dSZWYoKF93aW5kb3ckZ2V0U2VsZWN0aW9uID0gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmdldFNlbGVjdGlvbigpKSAhPT0gbnVsbCAmJiBfd2luZG93JGdldFNlbGVjdGlvbiAhPT0gdm9pZCAwID8gX3dpbmRvdyRnZXRTZWxlY3Rpb24gOiBudWxsKTtcblx0Y29uc3QgdGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX3NlbGVjdGlvbiR2YWx1ZSR0b1N0LCBfc2VsZWN0aW9uJHZhbHVlO1xuXHRcdHJldHVybiAoX3NlbGVjdGlvbiR2YWx1ZSR0b1N0ID0gKF9zZWxlY3Rpb24kdmFsdWUgPSBzZWxlY3Rpb24udmFsdWUpID09PSBudWxsIHx8IF9zZWxlY3Rpb24kdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZWxlY3Rpb24kdmFsdWUudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX3NlbGVjdGlvbiR2YWx1ZSR0b1N0ICE9PSB2b2lkIDAgPyBfc2VsZWN0aW9uJHZhbHVlJHRvU3QgOiBcIlwiO1xuXHR9KTtcblx0Y29uc3QgcmFuZ2VzID0gY29tcHV0ZWQoKCkgPT4gc2VsZWN0aW9uLnZhbHVlID8gZ2V0UmFuZ2VzRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24udmFsdWUpIDogW10pO1xuXHRjb25zdCByZWN0cyA9IGNvbXB1dGVkKCgpID0+IHJhbmdlcy52YWx1ZS5tYXAoKHJhbmdlKSA9PiByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpO1xuXHRmdW5jdGlvbiBvblNlbGVjdGlvbkNoYW5nZSgpIHtcblx0XHRzZWxlY3Rpb24udmFsdWUgPSBudWxsO1xuXHRcdGlmICh3aW5kb3ckMSkgc2VsZWN0aW9uLnZhbHVlID0gd2luZG93JDEuZ2V0U2VsZWN0aW9uKCk7XG5cdH1cblx0aWYgKHdpbmRvdyQxKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLmRvY3VtZW50LCBcInNlbGVjdGlvbmNoYW5nZVwiLCBvblNlbGVjdGlvbkNoYW5nZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4ge1xuXHRcdHRleHQsXG5cdFx0cmVjdHMsXG5cdFx0cmFuZ2VzLFxuXHRcdHNlbGVjdGlvblxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUZXh0YXJlYUF1dG9zaXplL2luZGV4LnRzXG4vKipcbiogQ2FsbCB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCksIGlmIG5vdCBhdmFpbGFibGUsIGp1c3QgY2FsbCB0aGUgZnVuY3Rpb25cbipcbiogQHBhcmFtIHdpbmRvd1xuKiBAcGFyYW0gZm5cbiovXG5mdW5jdGlvbiB0cnlSZXF1ZXN0QW5pbWF0aW9uRnJhbWUod2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBmbikge1xuXHRpZiAod2luZG93JDEgJiYgdHlwZW9mIHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gXCJmdW5jdGlvblwiKSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuXHRlbHNlIGZuKCk7XG59XG5mdW5jdGlvbiB1c2VUZXh0YXJlYUF1dG9zaXplKG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkaW5wdXQsIF9vcHRpb25zJHN0eWxlUHJvcDtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgdGV4dGFyZWEgPSB0b1JlZihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZWxlbWVudCk7XG5cdGNvbnN0IGlucHV0ID0gdG9SZWYoKF9vcHRpb25zJGlucHV0ID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmlucHV0KSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRpbnB1dCAhPT0gdm9pZCAwID8gX29wdGlvbnMkaW5wdXQgOiBcIlwiKTtcblx0Y29uc3Qgc3R5bGVQcm9wID0gKF9vcHRpb25zJHN0eWxlUHJvcCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zdHlsZVByb3ApICE9PSBudWxsICYmIF9vcHRpb25zJHN0eWxlUHJvcCAhPT0gdm9pZCAwID8gX29wdGlvbnMkc3R5bGVQcm9wIDogXCJoZWlnaHRcIjtcblx0Y29uc3QgdGV4dGFyZWFTY3JvbGxIZWlnaHQgPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCB0ZXh0YXJlYU9sZFdpZHRoID0gc2hhbGxvd1JlZigwKTtcblx0ZnVuY3Rpb24gdHJpZ2dlclJlc2l6ZSgpIHtcblx0XHR2YXIgX3RleHRhcmVhJHZhbHVlO1xuXHRcdGlmICghdGV4dGFyZWEudmFsdWUpIHJldHVybjtcblx0XHRsZXQgaGVpZ2h0ID0gXCJcIjtcblx0XHR0ZXh0YXJlYS52YWx1ZS5zdHlsZVtzdHlsZVByb3BdID0gXCIxcHhcIjtcblx0XHR0ZXh0YXJlYVNjcm9sbEhlaWdodC52YWx1ZSA9IChfdGV4dGFyZWEkdmFsdWUgPSB0ZXh0YXJlYS52YWx1ZSkgPT09IG51bGwgfHwgX3RleHRhcmVhJHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGV4dGFyZWEkdmFsdWUuc2Nyb2xsSGVpZ2h0O1xuXHRcdGNvbnN0IF9zdHlsZVRhcmdldCA9IHRvVmFsdWUob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnN0eWxlVGFyZ2V0KTtcblx0XHRpZiAoX3N0eWxlVGFyZ2V0KSBfc3R5bGVUYXJnZXQuc3R5bGVbc3R5bGVQcm9wXSA9IGAke3RleHRhcmVhU2Nyb2xsSGVpZ2h0LnZhbHVlfXB4YDtcblx0XHRlbHNlIGhlaWdodCA9IGAke3RleHRhcmVhU2Nyb2xsSGVpZ2h0LnZhbHVlfXB4YDtcblx0XHR0ZXh0YXJlYS52YWx1ZS5zdHlsZVtzdHlsZVByb3BdID0gaGVpZ2h0O1xuXHR9XG5cdHdhdGNoKFtpbnB1dCwgdGV4dGFyZWFdLCAoKSA9PiBuZXh0VGljayh0cmlnZ2VyUmVzaXplKSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHdhdGNoKHRleHRhcmVhU2Nyb2xsSGVpZ2h0LCAoKSA9PiB7XG5cdFx0dmFyIF9vcHRpb25zJG9uUmVzaXplO1xuXHRcdHJldHVybiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkb25SZXNpemUgPSBvcHRpb25zLm9uUmVzaXplKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblJlc2l6ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkb25SZXNpemUuY2FsbChvcHRpb25zKTtcblx0fSk7XG5cdHVzZVJlc2l6ZU9ic2VydmVyKHRleHRhcmVhLCAoW3sgY29udGVudFJlY3QgfV0pID0+IHtcblx0XHRpZiAodGV4dGFyZWFPbGRXaWR0aC52YWx1ZSA9PT0gY29udGVudFJlY3Qud2lkdGgpIHJldHVybjtcblx0XHR0cnlSZXF1ZXN0QW5pbWF0aW9uRnJhbWUod2luZG93JDEsICgpID0+IHtcblx0XHRcdHRleHRhcmVhT2xkV2lkdGgudmFsdWUgPSBjb250ZW50UmVjdC53aWR0aDtcblx0XHRcdHRyaWdnZXJSZXNpemUoKTtcblx0XHR9KTtcblx0fSk7XG5cdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2F0Y2gpIHdhdGNoKG9wdGlvbnMud2F0Y2gsIHRyaWdnZXJSZXNpemUsIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0ZGVlcDogdHJ1ZVxuXHR9KTtcblx0cmV0dXJuIHtcblx0XHR0ZXh0YXJlYSxcblx0XHRpbnB1dCxcblx0XHR0cmlnZ2VyUmVzaXplXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRocm90dGxlZFJlZkhpc3RvcnkvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIFt1c2VSZWZIaXN0b3J5XShodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmVmSGlzdG9yeSkgd2l0aCB0aHJvdHRsZWQgZmlsdGVyLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VUaHJvdHRsZWRSZWZIaXN0b3J5XG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VUaHJvdHRsZWRSZWZIaXN0b3J5KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdGhyb3R0bGUgPSAyMDAsIHRyYWlsaW5nID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZmlsdGVyID0gdGhyb3R0bGVGaWx0ZXIodGhyb3R0bGUsIHRyYWlsaW5nKTtcblx0cmV0dXJuIHsgLi4udXNlUmVmSGlzdG9yeShzb3VyY2UsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGV2ZW50RmlsdGVyOiBmaWx0ZXJcblx0fSkgfTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZUFnby9pbmRleC50c1xuY29uc3QgREVGQVVMVF9VTklUUyA9IFtcblx0e1xuXHRcdG1heDogNmU0LFxuXHRcdHZhbHVlOiAxZTMsXG5cdFx0bmFtZTogXCJzZWNvbmRcIlxuXHR9LFxuXHR7XG5cdFx0bWF4OiAyNzZlNCxcblx0XHR2YWx1ZTogNmU0LFxuXHRcdG5hbWU6IFwibWludXRlXCJcblx0fSxcblx0e1xuXHRcdG1heDogNzJlNixcblx0XHR2YWx1ZTogMzZlNSxcblx0XHRuYW1lOiBcImhvdXJcIlxuXHR9LFxuXHR7XG5cdFx0bWF4OiA1MTg0ZTUsXG5cdFx0dmFsdWU6IDg2NGU1LFxuXHRcdG5hbWU6IFwiZGF5XCJcblx0fSxcblx0e1xuXHRcdG1heDogMjQxOTJlNSxcblx0XHR2YWx1ZTogNjA0OGU1LFxuXHRcdG5hbWU6IFwid2Vla1wiXG5cdH0sXG5cdHtcblx0XHRtYXg6IDI4NTEyZTYsXG5cdFx0dmFsdWU6IDI1OTJlNixcblx0XHRuYW1lOiBcIm1vbnRoXCJcblx0fSxcblx0e1xuXHRcdG1heDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRcdHZhbHVlOiAzMTUzNmU2LFxuXHRcdG5hbWU6IFwieWVhclwiXG5cdH1cbl07XG5jb25zdCBERUZBVUxUX01FU1NBR0VTID0ge1xuXHRqdXN0Tm93OiBcImp1c3Qgbm93XCIsXG5cdHBhc3Q6IChuKSA9PiBuLm1hdGNoKC9cXGQvKSA/IGAke259IGFnb2AgOiBuLFxuXHRmdXR1cmU6IChuKSA9PiBuLm1hdGNoKC9cXGQvKSA/IGBpbiAke259YCA6IG4sXG5cdG1vbnRoOiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcImxhc3QgbW9udGhcIiA6IFwibmV4dCBtb250aFwiIDogYCR7bn0gbW9udGgke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdHllYXI6IChuLCBwYXN0KSA9PiBuID09PSAxID8gcGFzdCA/IFwibGFzdCB5ZWFyXCIgOiBcIm5leHQgeWVhclwiIDogYCR7bn0geWVhciR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcblx0ZGF5OiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcInllc3RlcmRheVwiIDogXCJ0b21vcnJvd1wiIDogYCR7bn0gZGF5JHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHR3ZWVrOiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcImxhc3Qgd2Vla1wiIDogXCJuZXh0IHdlZWtcIiA6IGAke259IHdlZWske24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdGhvdXI6IChuKSA9PiBgJHtufSBob3VyJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHRtaW51dGU6IChuKSA9PiBgJHtufSBtaW51dGUke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdHNlY29uZDogKG4pID0+IGAke259IHNlY29uZCR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcblx0aW52YWxpZDogXCJcIlxufTtcbmZ1bmN0aW9uIERFRkFVTFRfRk9STUFUVEVSKGRhdGUpIHtcblx0cmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDQob3B0aW9ucykge1xuXHRpZiAoXCJ1cGRhdGVJbnRlcnZhbFwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IHVwZGF0ZUludGVydmFsID0gM2U0IH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIHVwZGF0ZUludGVydmFsKTtcblx0fVxuXHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCAzZTQpO1xufVxuLyoqXG4qIFJlYWN0aXZlIHRpbWUgYWdvIGZvcm1hdHRlci5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVGltZUFnb1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVRpbWVBZ28odGltZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkNChvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBub3csLi4uY29udHJvbHMgfSA9IHVzZU5vdyh7XG5cdFx0c2NoZWR1bGVyLFxuXHRcdGNvbnRyb2xzOiB0cnVlXG5cdH0pO1xuXHRjb25zdCB0aW1lQWdvID0gY29tcHV0ZWQoKCkgPT4gZm9ybWF0VGltZUFnbyhuZXcgRGF0ZSh0b1ZhbHVlKHRpbWUpKSwgb3B0aW9ucywgdG9WYWx1ZShub3cpKSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHR0aW1lQWdvLFxuXHRcdC4uLmNvbnRyb2xzXG5cdH07XG5cdGVsc2UgcmV0dXJuIHRpbWVBZ287XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lQWdvKGZyb20sIG9wdGlvbnMgPSB7fSwgbm93ID0gRGF0ZS5ub3coKSkge1xuXHRjb25zdCB7IG1heCwgbWVzc2FnZXMgPSBERUZBVUxUX01FU1NBR0VTLCBmdWxsRGF0ZUZvcm1hdHRlciA9IERFRkFVTFRfRk9STUFUVEVSLCB1bml0cyA9IERFRkFVTFRfVU5JVFMsIHNob3dTZWNvbmQgPSBmYWxzZSwgcm91bmRpbmcgPSBcInJvdW5kXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJvdW5kRm4gPSB0eXBlb2Ygcm91bmRpbmcgPT09IFwibnVtYmVyXCIgPyAobikgPT4gK24udG9GaXhlZChyb3VuZGluZykgOiBNYXRoW3JvdW5kaW5nXTtcblx0Y29uc3QgZGlmZiA9ICtub3cgLSArZnJvbTtcblx0Y29uc3QgYWJzRGlmZiA9IE1hdGguYWJzKGRpZmYpO1xuXHRmdW5jdGlvbiBnZXRWYWx1ZSQxKGRpZmYkMSwgdW5pdCkge1xuXHRcdHJldHVybiByb3VuZEZuKE1hdGguYWJzKGRpZmYkMSkgLyB1bml0LnZhbHVlKTtcblx0fVxuXHRmdW5jdGlvbiBmb3JtYXQoZGlmZiQxLCB1bml0KSB7XG5cdFx0Y29uc3QgdmFsID0gZ2V0VmFsdWUkMShkaWZmJDEsIHVuaXQpO1xuXHRcdGNvbnN0IHBhc3QgPSBkaWZmJDEgPiAwO1xuXHRcdGNvbnN0IHN0ciA9IGFwcGx5Rm9ybWF0KHVuaXQubmFtZSwgdmFsLCBwYXN0KTtcblx0XHRyZXR1cm4gYXBwbHlGb3JtYXQocGFzdCA/IFwicGFzdFwiIDogXCJmdXR1cmVcIiwgc3RyLCBwYXN0KTtcblx0fVxuXHRmdW5jdGlvbiBhcHBseUZvcm1hdChuYW1lLCB2YWwsIGlzUGFzdCkge1xuXHRcdGNvbnN0IGZvcm1hdHRlciA9IG1lc3NhZ2VzW25hbWVdO1xuXHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmb3JtYXR0ZXIodmFsLCBpc1Bhc3QpO1xuXHRcdHJldHVybiBmb3JtYXR0ZXIucmVwbGFjZShcInswfVwiLCB2YWwudG9TdHJpbmcoKSk7XG5cdH1cblx0aWYgKGFic0RpZmYgPCA2ZTQgJiYgIXNob3dTZWNvbmQpIHJldHVybiBtZXNzYWdlcy5qdXN0Tm93O1xuXHRpZiAodHlwZW9mIG1heCA9PT0gXCJudW1iZXJcIiAmJiBhYnNEaWZmID4gbWF4KSByZXR1cm4gZnVsbERhdGVGb3JtYXR0ZXIobmV3IERhdGUoZnJvbSkpO1xuXHRpZiAodHlwZW9mIG1heCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHZhciBfdW5pdHMkZmluZDtcblx0XHRjb25zdCB1bml0TWF4ID0gKF91bml0cyRmaW5kID0gdW5pdHMuZmluZCgoaSkgPT4gaS5uYW1lID09PSBtYXgpKSA9PT0gbnVsbCB8fCBfdW5pdHMkZmluZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3VuaXRzJGZpbmQubWF4O1xuXHRcdGlmICh1bml0TWF4ICYmIGFic0RpZmYgPiB1bml0TWF4KSByZXR1cm4gZnVsbERhdGVGb3JtYXR0ZXIobmV3IERhdGUoZnJvbSkpO1xuXHR9XG5cdGZvciAoY29uc3QgW2lkeCwgdW5pdF0gb2YgdW5pdHMuZW50cmllcygpKSB7XG5cdFx0aWYgKGdldFZhbHVlJDEoZGlmZiwgdW5pdCkgPD0gMCAmJiB1bml0c1tpZHggLSAxXSkgcmV0dXJuIGZvcm1hdChkaWZmLCB1bml0c1tpZHggLSAxXSk7XG5cdFx0aWYgKGFic0RpZmYgPCB1bml0Lm1heCkgcmV0dXJuIGZvcm1hdChkaWZmLCB1bml0KTtcblx0fVxuXHRyZXR1cm4gbWVzc2FnZXMuaW52YWxpZDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZUFnb0ludGwvaW5kZXgudHNcbmNvbnN0IFVOSVRTID0gW1xuXHR7XG5cdFx0bmFtZTogXCJ5ZWFyXCIsXG5cdFx0bXM6IDMxNTM2ZTZcblx0fSxcblx0e1xuXHRcdG5hbWU6IFwibW9udGhcIixcblx0XHRtczogMjU5MmU2XG5cdH0sXG5cdHtcblx0XHRuYW1lOiBcIndlZWtcIixcblx0XHRtczogNjA0OGU1XG5cdH0sXG5cdHtcblx0XHRuYW1lOiBcImRheVwiLFxuXHRcdG1zOiA4NjRlNVxuXHR9LFxuXHR7XG5cdFx0bmFtZTogXCJob3VyXCIsXG5cdFx0bXM6IDM2ZTVcblx0fSxcblx0e1xuXHRcdG5hbWU6IFwibWludXRlXCIsXG5cdFx0bXM6IDZlNFxuXHR9LFxuXHR7XG5cdFx0bmFtZTogXCJzZWNvbmRcIixcblx0XHRtczogMWUzXG5cdH1cbl07XG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDMob3B0aW9ucykge1xuXHRpZiAoXCJ1cGRhdGVJbnRlcnZhbFwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IHVwZGF0ZUludGVydmFsID0gM2U0IH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIHVwZGF0ZUludGVydmFsKTtcblx0fVxuXHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCAzZTQpO1xufVxuZnVuY3Rpb24gdXNlVGltZUFnb0ludGwodGltZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkMyhvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBub3csLi4uY29udHJvbHMgfSA9IHVzZU5vdyh7XG5cdFx0c2NoZWR1bGVyLFxuXHRcdGNvbnRyb2xzOiB0cnVlXG5cdH0pO1xuXHRjb25zdCByZXN1bHQgPSBjb21wdXRlZCgoKSA9PiBnZXRUaW1lQWdvSW50bFJlc3VsdChuZXcgRGF0ZSh0b1ZhbHVlKHRpbWUpKSwgb3B0aW9ucywgdG9WYWx1ZShub3cpKSk7XG5cdGNvbnN0IHBhcnRzID0gY29tcHV0ZWQoKCkgPT4gcmVzdWx0LnZhbHVlLnBhcnRzKTtcblx0Y29uc3QgdGltZUFnb0ludGwgPSBjb21wdXRlZCgoKSA9PiBmb3JtYXRUaW1lQWdvSW50bFBhcnRzKHBhcnRzLnZhbHVlLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRsb2NhbGU6IHJlc3VsdC52YWx1ZS5yZXNvbHZlZExvY2FsZVxuXHR9KSk7XG5cdHJldHVybiBleHBvc2VDb250cm9scyA/IHtcblx0XHR0aW1lQWdvSW50bCxcblx0XHRwYXJ0cyxcblx0XHQuLi5jb250cm9sc1xuXHR9IDogdGltZUFnb0ludGw7XG59XG4vKipcbiogTm9uLXJlYWN0aXZlIHZlcnNpb24gb2YgdXNlVGltZUFnb0ludGxcbiovXG5mdW5jdGlvbiBmb3JtYXRUaW1lQWdvSW50bChmcm9tLCBvcHRpb25zID0ge30sIG5vdyA9IERhdGUubm93KCkpIHtcblx0Y29uc3QgeyBwYXJ0cywgcmVzb2x2ZWRMb2NhbGUgfSA9IGdldFRpbWVBZ29JbnRsUmVzdWx0KGZyb20sIG9wdGlvbnMsIG5vdyk7XG5cdHJldHVybiBmb3JtYXRUaW1lQWdvSW50bFBhcnRzKHBhcnRzLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRsb2NhbGU6IHJlc29sdmVkTG9jYWxlXG5cdH0pO1xufVxuLyoqXG4qIEdldCBwYXJ0cyBmcm9tIGBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzYC5cbiovXG5mdW5jdGlvbiBnZXRUaW1lQWdvSW50bFJlc3VsdChmcm9tLCBvcHRpb25zID0ge30sIG5vdyA9IERhdGUubm93KCkpIHtcblx0dmFyIF9vcHRpb25zJHVuaXRzO1xuXHRjb25zdCB7IGxvY2FsZSwgcmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgbnVtZXJpYzogXCJhdXRvXCIgfSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcnRmID0gbmV3IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0KGxvY2FsZSwgcmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyk7XG5cdGNvbnN0IHsgbG9jYWxlOiByZXNvbHZlZExvY2FsZSB9ID0gcnRmLnJlc29sdmVkT3B0aW9ucygpO1xuXHRjb25zdCBkaWZmID0gK2Zyb20gLSArbm93O1xuXHRjb25zdCBhYnNEaWZmID0gTWF0aC5hYnMoZGlmZik7XG5cdGNvbnN0IHVuaXRzID0gKF9vcHRpb25zJHVuaXRzID0gb3B0aW9ucy51bml0cykgIT09IG51bGwgJiYgX29wdGlvbnMkdW5pdHMgIT09IHZvaWQgMCA/IF9vcHRpb25zJHVuaXRzIDogVU5JVFM7XG5cdGZvciAoY29uc3QgeyBuYW1lLCBtcyB9IG9mIHVuaXRzKSBpZiAoYWJzRGlmZiA+PSBtcykgcmV0dXJuIHtcblx0XHRyZXNvbHZlZExvY2FsZSxcblx0XHRwYXJ0czogcnRmLmZvcm1hdFRvUGFydHMoTWF0aC5yb3VuZChkaWZmIC8gbXMpLCBuYW1lKVxuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHJlc29sdmVkTG9jYWxlLFxuXHRcdHBhcnRzOiBydGYuZm9ybWF0VG9QYXJ0cygwLCB1bml0c1t1bml0cy5sZW5ndGggLSAxXS5uYW1lKVxuXHR9O1xufVxuLyoqXG4qIEZvcm1hdCBwYXJ0cyBpbnRvIGEgc3RyaW5nXG4qL1xuZnVuY3Rpb24gZm9ybWF0VGltZUFnb0ludGxQYXJ0cyhwYXJ0cywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5zZXJ0U3BhY2UgPSB0cnVlLCBqb2luUGFydHMsIGxvY2FsZSB9ID0gb3B0aW9ucztcblx0aWYgKHR5cGVvZiBqb2luUGFydHMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGpvaW5QYXJ0cyhwYXJ0cywgbG9jYWxlKTtcblx0aWYgKCFpbnNlcnRTcGFjZSkgcmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZSkuam9pbihcIlwiKTtcblx0cmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZS50cmltKCkpLmpvaW4oXCIgXCIpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUaW1lb3V0UG9sbC9pbmRleC50c1xuZnVuY3Rpb24gdXNlVGltZW91dFBvbGwoZm4sIGludGVydmFsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBpbW1lZGlhdGVDYWxsYmFjayA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB7IHN0YXJ0IH0gPSB1c2VUaW1lb3V0Rm4obG9vcCwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlIH0pO1xuXHRjb25zdCBpc0FjdGl2ZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRhc3luYyBmdW5jdGlvbiBsb29wKCkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUpIHJldHVybjtcblx0XHRhd2FpdCBmbigpO1xuXHRcdHN0YXJ0KCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzdW1lKCkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUpIHtcblx0XHRcdGlzQWN0aXZlLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpbW1lZGlhdGVDYWxsYmFjaykgZm4oKTtcblx0XHRcdHN0YXJ0KCk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHBhdXNlKCkge1xuXHRcdGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG5cdH1cblx0aWYgKGltbWVkaWF0ZSAmJiBpc0NsaWVudCkgcmVzdW1lKCk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHBhdXNlKTtcblx0cmV0dXJuIHtcblx0XHRpc0FjdGl2ZSxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZXN0YW1wL2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDIob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIsIGltbWVkaWF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIGludGVydmFsID09PSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiID8gKGNiKSA9PiB1c2VSYWZGbihjYiwgeyBpbW1lZGlhdGUgfSkgOiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIGludGVydmFsLCB7IGltbWVkaWF0ZSB9KTtcblx0fVxuXHRyZXR1cm4gdXNlUmFmRm47XG59XG5mdW5jdGlvbiB1c2VUaW1lc3RhbXAob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIG9mZnNldCA9IDAsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkMihvcHRpb25zKSwgY2FsbGJhY2sgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHRzID0gc2hhbGxvd1JlZih0aW1lc3RhbXAoKSArIG9mZnNldCk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHRzLnZhbHVlID0gdGltZXN0YW1wKCkgKyBvZmZzZXQ7XG5cdGNvbnN0IGNvbnRyb2xzID0gc2NoZWR1bGVyKGNhbGxiYWNrID8gKCkgPT4ge1xuXHRcdHVwZGF0ZSgpO1xuXHRcdGNhbGxiYWNrKHRzLnZhbHVlKTtcblx0fSA6IHVwZGF0ZSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHR0aW1lc3RhbXA6IHRzLFxuXHRcdC4uLmNvbnRyb2xzXG5cdH07XG5cdGVsc2UgcmV0dXJuIHRzO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUaXRsZS9pbmRleC50c1xuZnVuY3Rpb24gdXNlVGl0bGUobmV3VGl0bGUgPSBudWxsLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF9kb2N1bWVudCR0aXRsZSwgX3JlZjtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgcmVzdG9yZU9uVW5tb3VudCA9ICh0KSA9PiB0IH0gPSBvcHRpb25zO1xuXHRjb25zdCBvcmlnaW5hbFRpdGxlID0gKF9kb2N1bWVudCR0aXRsZSA9IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS50aXRsZSkgIT09IG51bGwgJiYgX2RvY3VtZW50JHRpdGxlICE9PSB2b2lkIDAgPyBfZG9jdW1lbnQkdGl0bGUgOiBcIlwiO1xuXHRjb25zdCB0aXRsZSA9IHRvUmVmKChfcmVmID0gbmV3VGl0bGUgIT09IG51bGwgJiYgbmV3VGl0bGUgIT09IHZvaWQgMCA/IG5ld1RpdGxlIDogZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLnRpdGxlKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogbnVsbCk7XG5cdGNvbnN0IGlzUmVhZG9ubHkkMSA9ICEhKG5ld1RpdGxlICYmIHR5cGVvZiBuZXdUaXRsZSA9PT0gXCJmdW5jdGlvblwiKTtcblx0ZnVuY3Rpb24gZm9ybWF0KHQpIHtcblx0XHRpZiAoIShcInRpdGxlVGVtcGxhdGVcIiBpbiBvcHRpb25zKSkgcmV0dXJuIHQ7XG5cdFx0Y29uc3QgdGVtcGxhdGUgPSBvcHRpb25zLnRpdGxlVGVtcGxhdGUgfHwgXCIlc1wiO1xuXHRcdHJldHVybiB0eXBlb2YgdGVtcGxhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHRlbXBsYXRlKHQpIDogdG9WYWx1ZSh0ZW1wbGF0ZSkucmVwbGFjZSgvJXMvZywgdCk7XG5cdH1cblx0d2F0Y2godGl0bGUsIChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IHtcblx0XHRpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlICYmIGRvY3VtZW50JDEpIGRvY3VtZW50JDEudGl0bGUgPSBmb3JtYXQobmV3VmFsdWUgIT09IG51bGwgJiYgbmV3VmFsdWUgIT09IHZvaWQgMCA/IG5ld1ZhbHVlIDogXCJcIik7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHRpZiAob3B0aW9ucy5vYnNlcnZlICYmICFvcHRpb25zLnRpdGxlVGVtcGxhdGUgJiYgZG9jdW1lbnQkMSAmJiAhaXNSZWFkb25seSQxKSB7XG5cdFx0dmFyIF9kb2N1bWVudCRoZWFkO1xuXHRcdHVzZU11dGF0aW9uT2JzZXJ2ZXIoKF9kb2N1bWVudCRoZWFkID0gZG9jdW1lbnQkMS5oZWFkKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkaGVhZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50JGhlYWQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpLCAoKSA9PiB7XG5cdFx0XHRpZiAoZG9jdW1lbnQkMSAmJiBkb2N1bWVudCQxLnRpdGxlICE9PSB0aXRsZS52YWx1ZSkgdGl0bGUudmFsdWUgPSBmb3JtYXQoZG9jdW1lbnQkMS50aXRsZSk7XG5cdFx0fSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdGlmIChyZXN0b3JlT25Vbm1vdW50KSB7XG5cdFx0XHRjb25zdCByZXN0b3JlZFRpdGxlID0gcmVzdG9yZU9uVW5tb3VudChvcmlnaW5hbFRpdGxlLCB0aXRsZS52YWx1ZSB8fCBcIlwiKTtcblx0XHRcdGlmIChyZXN0b3JlZFRpdGxlICE9IG51bGwgJiYgZG9jdW1lbnQkMSkgZG9jdW1lbnQkMS50aXRsZSA9IHJlc3RvcmVkVGl0bGU7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHRpdGxlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUcmFuc2l0aW9uL2luZGV4LnRzXG5jb25zdCBfVHJhbnNpdGlvblByZXNldHMgPSB7XG5cdGVhc2VJblNpbmU6IFtcblx0XHQuMTIsXG5cdFx0MCxcblx0XHQuMzksXG5cdFx0MFxuXHRdLFxuXHRlYXNlT3V0U2luZTogW1xuXHRcdC42MSxcblx0XHQxLFxuXHRcdC44OCxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dFNpbmU6IFtcblx0XHQuMzcsXG5cdFx0MCxcblx0XHQuNjMsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5RdWFkOiBbXG5cdFx0LjExLFxuXHRcdDAsXG5cdFx0LjUsXG5cdFx0MFxuXHRdLFxuXHRlYXNlT3V0UXVhZDogW1xuXHRcdC41LFxuXHRcdDEsXG5cdFx0Ljg5LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0UXVhZDogW1xuXHRcdC40NSxcblx0XHQwLFxuXHRcdC41NSxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbkN1YmljOiBbXG5cdFx0LjMyLFxuXHRcdDAsXG5cdFx0LjY3LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dEN1YmljOiBbXG5cdFx0LjMzLFxuXHRcdDEsXG5cdFx0LjY4LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0Q3ViaWM6IFtcblx0XHQuNjUsXG5cdFx0MCxcblx0XHQuMzUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5RdWFydDogW1xuXHRcdC41LFxuXHRcdDAsXG5cdFx0Ljc1LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dFF1YXJ0OiBbXG5cdFx0LjI1LFxuXHRcdDEsXG5cdFx0LjUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5PdXRRdWFydDogW1xuXHRcdC43Nixcblx0XHQwLFxuXHRcdC4yNCxcblx0XHQxXG5cdF0sXG5cdGVhc2VJblF1aW50OiBbXG5cdFx0LjY0LFxuXHRcdDAsXG5cdFx0Ljc4LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dFF1aW50OiBbXG5cdFx0LjIyLFxuXHRcdDEsXG5cdFx0LjM2LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0UXVpbnQ6IFtcblx0XHQuODMsXG5cdFx0MCxcblx0XHQuMTcsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5FeHBvOiBbXG5cdFx0LjcsXG5cdFx0MCxcblx0XHQuODQsXG5cdFx0MFxuXHRdLFxuXHRlYXNlT3V0RXhwbzogW1xuXHRcdC4xNixcblx0XHQxLFxuXHRcdC4zLFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0RXhwbzogW1xuXHRcdC44Nyxcblx0XHQwLFxuXHRcdC4xMyxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbkNpcmM6IFtcblx0XHQuNTUsXG5cdFx0MCxcblx0XHQxLFxuXHRcdC40NVxuXHRdLFxuXHRlYXNlT3V0Q2lyYzogW1xuXHRcdDAsXG5cdFx0LjU1LFxuXHRcdC40NSxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dENpcmM6IFtcblx0XHQuODUsXG5cdFx0MCxcblx0XHQuMTUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5CYWNrOiBbXG5cdFx0LjM2LFxuXHRcdDAsXG5cdFx0LjY2LFxuXHRcdC0uNTZcblx0XSxcblx0ZWFzZU91dEJhY2s6IFtcblx0XHQuMzQsXG5cdFx0MS41Nixcblx0XHQuNjQsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5PdXRCYWNrOiBbXG5cdFx0LjY4LFxuXHRcdC0uNixcblx0XHQuMzIsXG5cdFx0MS42XG5cdF1cbn07XG4vKipcbiogQ29tbW9uIHRyYW5zaXRpb25zXG4qXG4qIEBzZWUgaHR0cHM6Ly9lYXNpbmdzLm5ldFxuKi9cbmNvbnN0IFRyYW5zaXRpb25QcmVzZXRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5hc3NpZ24oe30sIHsgbGluZWFyOiBpZGVudGl0eSB9LCBfVHJhbnNpdGlvblByZXNldHMpO1xuLyoqXG4qIENyZWF0ZSBhbiBlYXNpbmcgZnVuY3Rpb24gZnJvbSBjdWJpYyBiZXppZXIgcG9pbnRzLlxuKi9cbmZ1bmN0aW9uIGNyZWF0ZUVhc2luZ0Z1bmN0aW9uKFtwMCwgcDEsIHAyLCBwM10pIHtcblx0Y29uc3QgYSA9IChhMSwgYTIpID0+IDEgLSAzICogYTIgKyAzICogYTE7XG5cdGNvbnN0IGIgPSAoYTEsIGEyKSA9PiAzICogYTIgLSA2ICogYTE7XG5cdGNvbnN0IGMgPSAoYTEpID0+IDMgKiBhMTtcblx0Y29uc3QgY2FsY0JlemllciA9ICh0LCBhMSwgYTIpID0+ICgoYShhMSwgYTIpICogdCArIGIoYTEsIGEyKSkgKiB0ICsgYyhhMSkpICogdDtcblx0Y29uc3QgZ2V0U2xvcGUgPSAodCwgYTEsIGEyKSA9PiAzICogYShhMSwgYTIpICogdCAqIHQgKyAyICogYihhMSwgYTIpICogdCArIGMoYTEpO1xuXHRjb25zdCBnZXRUZm9yWCA9ICh4KSA9PiB7XG5cdFx0bGV0IGFHdWVzc1QgPSB4O1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgNDsgKytpKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50U2xvcGUgPSBnZXRTbG9wZShhR3Vlc3NULCBwMCwgcDIpO1xuXHRcdFx0aWYgKGN1cnJlbnRTbG9wZSA9PT0gMCkgcmV0dXJuIGFHdWVzc1Q7XG5cdFx0XHRjb25zdCBjdXJyZW50WCA9IGNhbGNCZXppZXIoYUd1ZXNzVCwgcDAsIHAyKSAtIHg7XG5cdFx0XHRhR3Vlc3NUIC09IGN1cnJlbnRYIC8gY3VycmVudFNsb3BlO1xuXHRcdH1cblx0XHRyZXR1cm4gYUd1ZXNzVDtcblx0fTtcblx0cmV0dXJuICh4KSA9PiBwMCA9PT0gcDEgJiYgcDIgPT09IHAzID8geCA6IGNhbGNCZXppZXIoZ2V0VGZvclgoeCksIHAxLCBwMyk7XG59XG5mdW5jdGlvbiBsZXJwKGEsIGIsIGFscGhhKSB7XG5cdHJldHVybiBhICsgYWxwaGEgKiAoYiAtIGEpO1xufVxuZnVuY3Rpb24gZGVmYXVsdEludGVycG9sYXRpb24oYSwgYiwgdCkge1xuXHRjb25zdCBhVmFsID0gdG9WYWx1ZShhKTtcblx0Y29uc3QgYlZhbCA9IHRvVmFsdWUoYik7XG5cdGlmICh0eXBlb2YgYVZhbCA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGxlcnAoYVZhbCwgYlZhbCwgdCk7XG5cdGlmIChBcnJheS5pc0FycmF5KGFWYWwpICYmIEFycmF5LmlzQXJyYXkoYlZhbCkpIHJldHVybiBhVmFsLm1hcCgodiwgaSkgPT4gbGVycCh2LCB0b1ZhbHVlKGJWYWxbaV0pLCB0KSk7XG5cdHRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIHRyYW5zaXRpb24gdHlwZSwgc3BlY2lmeSBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLlwiKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVhc2luZyhlYXNpbmcpIHtcblx0dmFyIF90b1ZhbHVlO1xuXHRyZXR1cm4gdHlwZW9mIGVhc2luZyA9PT0gXCJmdW5jdGlvblwiID8gZWFzaW5nIDogKF90b1ZhbHVlID0gdG9WYWx1ZShlYXNpbmcpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZSAhPT0gdm9pZCAwID8gX3RvVmFsdWUgOiBpZGVudGl0eTtcbn1cbi8qKlxuKiBUcmFuc2l0aW9uIGZyb20gb25lIHZhbHVlIHRvIGFub3RoZXIuXG4qXG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIGZyb21cbiogQHBhcmFtIHRvXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdHJhbnNpdGlvbihzb3VyY2UsIGZyb20sIHRvLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF90b1ZhbHVlMjtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgZnJvbVZhbCA9IHRvVmFsdWUoZnJvbSk7XG5cdGNvbnN0IHRvVmFsID0gdG9WYWx1ZSh0byk7XG5cdGNvbnN0IGR1cmF0aW9uID0gKF90b1ZhbHVlMiA9IHRvVmFsdWUob3B0aW9ucy5kdXJhdGlvbikpICE9PSBudWxsICYmIF90b1ZhbHVlMiAhPT0gdm9pZCAwID8gX3RvVmFsdWUyIDogMWUzO1xuXHRjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXHRjb25zdCBlbmRBdCA9IERhdGUubm93KCkgKyBkdXJhdGlvbjtcblx0Y29uc3QgaW50ZXJwb2xhdGlvbiA9IHR5cGVvZiBvcHRpb25zLmludGVycG9sYXRpb24gPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaW50ZXJwb2xhdGlvbiA6IGRlZmF1bHRJbnRlcnBvbGF0aW9uO1xuXHRjb25zdCB0cmFucyA9IHR5cGVvZiBvcHRpb25zLmVhc2luZyAhPT0gXCJ1bmRlZmluZWRcIiA/IG5vcm1hbGl6ZUVhc2luZyhvcHRpb25zLmVhc2luZykgOiBub3JtYWxpemVFYXNpbmcob3B0aW9ucy50cmFuc2l0aW9uKTtcblx0Y29uc3QgZWFzZSA9IHR5cGVvZiB0cmFucyA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnMgOiBjcmVhdGVFYXNpbmdGdW5jdGlvbih0cmFucyk7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdHNvdXJjZS52YWx1ZSA9IGZyb21WYWw7XG5cdFx0Y29uc3QgdGljayA9ICgpID0+IHtcblx0XHRcdHZhciBfb3B0aW9ucyRhYm9ydDtcblx0XHRcdGlmICgoX29wdGlvbnMkYWJvcnQgPSBvcHRpb25zLmFib3J0KSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRhYm9ydCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkYWJvcnQuY2FsbChvcHRpb25zKSkge1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cdFx0XHRzb3VyY2UudmFsdWUgPSBpbnRlcnBvbGF0aW9uKGZyb21WYWwsIHRvVmFsLCBlYXNlKChub3cgLSBzdGFydGVkQXQpIC8gZHVyYXRpb24pKTtcblx0XHRcdGlmIChub3cgPCBlbmRBdCkgd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCB8fCB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0c291cmNlLnZhbHVlID0gdG9WYWw7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRpY2soKTtcblx0fSk7XG59XG4vKipcbiogVHJhbnNpdGlvbiBmcm9tIG9uZSB2YWx1ZSB0byBhbm90aGVyLlxuKiBAZGVwcmVjYXRlZCBUaGUgYGV4ZWN1dGVUcmFuc2l0aW9uYCBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgYHRyYW5zaXRpb25gIGluc3RlYWQuXG4qXG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIGZyb21cbiogQHBhcmFtIHRvXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gZXhlY3V0ZVRyYW5zaXRpb24oc291cmNlLCBmcm9tLCB0bywgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiB0cmFuc2l0aW9uKHNvdXJjZSwgZnJvbSwgdG8sIG9wdGlvbnMpO1xufVxuLyoqXG4qIEZvbGxvdyB2YWx1ZSB3aXRoIGEgdHJhbnNpdGlvbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVHJhbnNpdGlvblxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVHJhbnNpdGlvbihzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgY3VycmVudElkID0gMDtcblx0Y29uc3Qgc291cmNlVmFsID0gKCkgPT4ge1xuXHRcdGNvbnN0IHYgPSB0b1ZhbHVlKHNvdXJjZSk7XG5cdFx0cmV0dXJuIHR5cGVvZiBvcHRpb25zLmludGVycG9sYXRpb24gPT09IFwidW5kZWZpbmVkXCIgJiYgQXJyYXkuaXNBcnJheSh2KSA/IHYubWFwKHRvVmFsdWUpIDogdjtcblx0fTtcblx0Y29uc3Qgb3V0cHV0UmVmID0gc2hhbGxvd1JlZihzb3VyY2VWYWwoKSk7XG5cdHdhdGNoKHNvdXJjZVZhbCwgYXN5bmMgKHRvKSA9PiB7XG5cdFx0dmFyIF9vcHRpb25zJG9uU3RhcnRlZCwgX29wdGlvbnMkb25GaW5pc2hlZDtcblx0XHRpZiAodG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSkgcmV0dXJuO1xuXHRcdGNvbnN0IGlkID0gKytjdXJyZW50SWQ7XG5cdFx0aWYgKG9wdGlvbnMuZGVsYXkpIGF3YWl0IHByb21pc2VUaW1lb3V0KHRvVmFsdWUob3B0aW9ucy5kZWxheSkpO1xuXHRcdGlmIChpZCAhPT0gY3VycmVudElkKSByZXR1cm47XG5cdFx0KF9vcHRpb25zJG9uU3RhcnRlZCA9IG9wdGlvbnMub25TdGFydGVkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblN0YXJ0ZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvblN0YXJ0ZWQuY2FsbChvcHRpb25zKTtcblx0XHRhd2FpdCB0cmFuc2l0aW9uKG91dHB1dFJlZiwgb3V0cHV0UmVmLnZhbHVlLCB0bywge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdGFib3J0OiAoKSA9PiB7XG5cdFx0XHRcdHZhciBfb3B0aW9ucyRhYm9ydDI7XG5cdFx0XHRcdHJldHVybiBpZCAhPT0gY3VycmVudElkIHx8ICgoX29wdGlvbnMkYWJvcnQyID0gb3B0aW9ucy5hYm9ydCkgPT09IG51bGwgfHwgX29wdGlvbnMkYWJvcnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRhYm9ydDIuY2FsbChvcHRpb25zKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0KF9vcHRpb25zJG9uRmluaXNoZWQgPSBvcHRpb25zLm9uRmluaXNoZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uRmluaXNoZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvbkZpbmlzaGVkLmNhbGwob3B0aW9ucyk7XG5cdH0sIHsgZGVlcDogdHJ1ZSB9KTtcblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSwgKGRpc2FibGVkKSA9PiB7XG5cdFx0aWYgKGRpc2FibGVkKSB7XG5cdFx0XHRjdXJyZW50SWQrKztcblx0XHRcdG91dHB1dFJlZi52YWx1ZSA9IHNvdXJjZVZhbCgpO1xuXHRcdH1cblx0fSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRjdXJyZW50SWQrKztcblx0fSk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpID8gc291cmNlVmFsKCkgOiBvdXRwdXRSZWYudmFsdWUpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VVcmxTZWFyY2hQYXJhbXMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBVUkxTZWFyY2hQYXJhbXNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVXJsU2VhcmNoUGFyYW1zXG4qIEBwYXJhbSBtb2RlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVXJsU2VhcmNoUGFyYW1zKG1vZGUgPSBcImhpc3RvcnlcIiwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFZhbHVlID0ge30sIHJlbW92ZU51bGxpc2hWYWx1ZXMgPSB0cnVlLCByZW1vdmVGYWxzeVZhbHVlcyA9IGZhbHNlLCB3cml0ZTogZW5hYmxlV3JpdGUgPSB0cnVlLCB3cml0ZU1vZGUgPSBcInJlcGxhY2VcIiwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHN0cmluZ2lmeSA9IChwYXJhbXMpID0+IHBhcmFtcy50b1N0cmluZygpIH0gPSBvcHRpb25zO1xuXHRpZiAoIXdpbmRvdyQxKSByZXR1cm4gcmVhY3RpdmUoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3Qgc3RhdGUgPSByZWFjdGl2ZSh7fSk7XG5cdGZ1bmN0aW9uIGdldFJhd1BhcmFtcygpIHtcblx0XHRpZiAobW9kZSA9PT0gXCJoaXN0b3J5XCIpIHJldHVybiB3aW5kb3ckMS5sb2NhdGlvbi5zZWFyY2ggfHwgXCJcIjtcblx0XHRlbHNlIGlmIChtb2RlID09PSBcImhhc2hcIikge1xuXHRcdFx0Y29uc3QgaGFzaCA9IHdpbmRvdyQxLmxvY2F0aW9uLmhhc2ggfHwgXCJcIjtcblx0XHRcdGNvbnN0IGluZGV4ID0gaGFzaC5pbmRleE9mKFwiP1wiKTtcblx0XHRcdHJldHVybiBpbmRleCA+IDAgPyBoYXNoLnNsaWNlKGluZGV4KSA6IFwiXCI7XG5cdFx0fSBlbHNlIHJldHVybiAod2luZG93JDEubG9jYXRpb24uaGFzaCB8fCBcIlwiKS5yZXBsYWNlKC9eIy8sIFwiXCIpO1xuXHR9XG5cdGZ1bmN0aW9uIGNvbnN0cnVjdFF1ZXJ5KHBhcmFtcykge1xuXHRcdGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5KHBhcmFtcyk7XG5cdFx0aWYgKG1vZGUgPT09IFwiaGlzdG9yeVwiKSByZXR1cm4gYCR7c3RyaW5naWZpZWQgPyBgPyR7c3RyaW5naWZpZWR9YCA6IFwiXCJ9JHt3aW5kb3ckMS5sb2NhdGlvbi5oYXNoIHx8IFwiXCJ9YDtcblx0XHRpZiAobW9kZSA9PT0gXCJoYXNoLXBhcmFtc1wiKSByZXR1cm4gYCR7d2luZG93JDEubG9jYXRpb24uc2VhcmNoIHx8IFwiXCJ9JHtzdHJpbmdpZmllZCA/IGAjJHtzdHJpbmdpZmllZH1gIDogXCJcIn1gO1xuXHRcdGNvbnN0IGhhc2ggPSB3aW5kb3ckMS5sb2NhdGlvbi5oYXNoIHx8IFwiI1wiO1xuXHRcdGNvbnN0IGluZGV4ID0gaGFzaC5pbmRleE9mKFwiP1wiKTtcblx0XHRpZiAoaW5kZXggPiAwKSByZXR1cm4gYCR7d2luZG93JDEubG9jYXRpb24uc2VhcmNoIHx8IFwiXCJ9JHtoYXNoLnNsaWNlKDAsIGluZGV4KX0ke3N0cmluZ2lmaWVkID8gYD8ke3N0cmluZ2lmaWVkfWAgOiBcIlwifWA7XG5cdFx0cmV0dXJuIGAke3dpbmRvdyQxLmxvY2F0aW9uLnNlYXJjaCB8fCBcIlwifSR7aGFzaH0ke3N0cmluZ2lmaWVkID8gYD8ke3N0cmluZ2lmaWVkfWAgOiBcIlwifWA7XG5cdH1cblx0ZnVuY3Rpb24gcmVhZCgpIHtcblx0XHRyZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyhnZXRSYXdQYXJhbXMoKSk7XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlU3RhdGUocGFyYW1zKSB7XG5cdFx0Y29uc3QgdW51c2VkS2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoc3RhdGUpKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBwYXJhbXMua2V5cygpKSB7XG5cdFx0XHRjb25zdCBwYXJhbXNGb3JLZXkgPSBwYXJhbXMuZ2V0QWxsKGtleSk7XG5cdFx0XHRzdGF0ZVtrZXldID0gcGFyYW1zRm9yS2V5Lmxlbmd0aCA+IDEgPyBwYXJhbXNGb3JLZXkgOiBwYXJhbXMuZ2V0KGtleSkgfHwgXCJcIjtcblx0XHRcdHVudXNlZEtleXMuZGVsZXRlKGtleSk7XG5cdFx0fVxuXHRcdEFycmF5LmZyb20odW51c2VkS2V5cykuZm9yRWFjaCgoa2V5KSA9PiBkZWxldGUgc3RhdGVba2V5XSk7XG5cdH1cblx0Y29uc3QgeyBwYXVzZSwgcmVzdW1lIH0gPSB3YXRjaFBhdXNhYmxlKHN0YXRlLCAoKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhcIlwiKTtcblx0XHRPYmplY3Qua2V5cyhzdGF0ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG5cdFx0XHRjb25zdCBtYXBFbnRyeSA9IHN0YXRlW2tleV07XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShtYXBFbnRyeSkpIG1hcEVudHJ5LmZvckVhY2goKHZhbHVlKSA9PiBwYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpKTtcblx0XHRcdGVsc2UgaWYgKHJlbW92ZU51bGxpc2hWYWx1ZXMgJiYgbWFwRW50cnkgPT0gbnVsbCkgcGFyYW1zLmRlbGV0ZShrZXkpO1xuXHRcdFx0ZWxzZSBpZiAocmVtb3ZlRmFsc3lWYWx1ZXMgJiYgIW1hcEVudHJ5KSBwYXJhbXMuZGVsZXRlKGtleSk7XG5cdFx0XHRlbHNlIHBhcmFtcy5zZXQoa2V5LCBtYXBFbnRyeSk7XG5cdFx0fSk7XG5cdFx0d3JpdGUocGFyYW1zLCBmYWxzZSk7XG5cdH0sIHsgZGVlcDogdHJ1ZSB9KTtcblx0ZnVuY3Rpb24gd3JpdGUocGFyYW1zLCBzaG91bGRVcGRhdGUsIHNob3VsZFdyaXRlSGlzdG9yeSA9IHRydWUpIHtcblx0XHRwYXVzZSgpO1xuXHRcdGlmIChzaG91bGRVcGRhdGUpIHVwZGF0ZVN0YXRlKHBhcmFtcyk7XG5cdFx0aWYgKHdyaXRlTW9kZSA9PT0gXCJyZXBsYWNlXCIpIHdpbmRvdyQxLmhpc3RvcnkucmVwbGFjZVN0YXRlKHdpbmRvdyQxLmhpc3Rvcnkuc3RhdGUsIHdpbmRvdyQxLmRvY3VtZW50LnRpdGxlLCB3aW5kb3ckMS5sb2NhdGlvbi5wYXRobmFtZSArIGNvbnN0cnVjdFF1ZXJ5KHBhcmFtcykpO1xuXHRcdGVsc2UgaWYgKHNob3VsZFdyaXRlSGlzdG9yeSkgd2luZG93JDEuaGlzdG9yeS5wdXNoU3RhdGUod2luZG93JDEuaGlzdG9yeS5zdGF0ZSwgd2luZG93JDEuZG9jdW1lbnQudGl0bGUsIHdpbmRvdyQxLmxvY2F0aW9uLnBhdGhuYW1lICsgY29uc3RydWN0UXVlcnkocGFyYW1zKSk7XG5cdFx0bmV4dFRpY2soKCkgPT4gcmVzdW1lKCkpO1xuXHR9XG5cdGZ1bmN0aW9uIG9uQ2hhbmdlZCgpIHtcblx0XHRpZiAoIWVuYWJsZVdyaXRlKSByZXR1cm47XG5cdFx0d3JpdGUocmVhZCgpLCB0cnVlLCBmYWxzZSk7XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwicG9wc3RhdGVcIiwgb25DaGFuZ2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRpZiAobW9kZSAhPT0gXCJoaXN0b3J5XCIpIHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiaGFzaGNoYW5nZVwiLCBvbkNoYW5nZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGNvbnN0IGluaXRpYWwgPSByZWFkKCk7XG5cdGlmIChpbml0aWFsLmtleXMoKS5uZXh0KCkudmFsdWUpIHVwZGF0ZVN0YXRlKGluaXRpYWwpO1xuXHRlbHNlIE9iamVjdC5hc3NpZ24oc3RhdGUsIGluaXRpYWxWYWx1ZSk7XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVXNlck1lZGlhL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYG1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWFgIHN0cmVhbWluZ1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VVc2VyTWVkaWFcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VVc2VyTWVkaWEob3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRlbmFibGVkLCBfb3B0aW9ucyRhdXRvU3dpdGNoO1xuXHRjb25zdCBlbmFibGVkID0gc2hhbGxvd1JlZigoX29wdGlvbnMkZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCkgIT09IG51bGwgJiYgX29wdGlvbnMkZW5hYmxlZCAhPT0gdm9pZCAwID8gX29wdGlvbnMkZW5hYmxlZCA6IGZhbHNlKTtcblx0Y29uc3QgYXV0b1N3aXRjaCA9IHNoYWxsb3dSZWYoKF9vcHRpb25zJGF1dG9Td2l0Y2ggPSBvcHRpb25zLmF1dG9Td2l0Y2gpICE9PSBudWxsICYmIF9vcHRpb25zJGF1dG9Td2l0Y2ggIT09IHZvaWQgMCA/IF9vcHRpb25zJGF1dG9Td2l0Y2ggOiB0cnVlKTtcblx0Y29uc3QgY29uc3RyYWludHMgPSByZWYob3B0aW9ucy5jb25zdHJhaW50cyk7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB7XG5cdFx0dmFyIF9uYXZpZ2F0b3IkbWVkaWFEZXZpYztcblx0XHRyZXR1cm4gbmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCB8fCAoX25hdmlnYXRvciRtZWRpYURldmljID0gbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzKSA9PT0gbnVsbCB8fCBfbmF2aWdhdG9yJG1lZGlhRGV2aWMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uYXZpZ2F0b3IkbWVkaWFEZXZpYy5nZXRVc2VyTWVkaWE7XG5cdH0pO1xuXHRjb25zdCBzdHJlYW0gPSBzaGFsbG93UmVmKCk7XG5cdGZ1bmN0aW9uIGdldERldmljZU9wdGlvbnModHlwZSkge1xuXHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0Y2FzZSBcInZpZGVvXCI6XG5cdFx0XHRcdGlmIChjb25zdHJhaW50cy52YWx1ZSkgcmV0dXJuIGNvbnN0cmFpbnRzLnZhbHVlLnZpZGVvIHx8IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJhdWRpb1wiOlxuXHRcdFx0XHRpZiAoY29uc3RyYWludHMudmFsdWUpIHJldHVybiBjb25zdHJhaW50cy52YWx1ZS5hdWRpbyB8fCBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIF9zdGFydCgpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8IHN0cmVhbS52YWx1ZSkgcmV0dXJuO1xuXHRcdHN0cmVhbS52YWx1ZSA9IGF3YWl0IG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuXHRcdFx0dmlkZW86IGdldERldmljZU9wdGlvbnMoXCJ2aWRlb1wiKSxcblx0XHRcdGF1ZGlvOiBnZXREZXZpY2VPcHRpb25zKFwiYXVkaW9cIilcblx0XHR9KTtcblx0XHRyZXR1cm4gc3RyZWFtLnZhbHVlO1xuXHR9XG5cdGZ1bmN0aW9uIF9zdG9wKCkge1xuXHRcdHZhciBfc3RyZWFtJHZhbHVlO1xuXHRcdChfc3RyZWFtJHZhbHVlID0gc3RyZWFtLnZhbHVlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJHZhbHVlID09PSB2b2lkIDAgfHwgX3N0cmVhbSR2YWx1ZS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG5cdFx0c3RyZWFtLnZhbHVlID0gdm9pZCAwO1xuXHR9XG5cdGZ1bmN0aW9uIHN0b3AoKSB7XG5cdFx0X3N0b3AoKTtcblx0XHRlbmFibGVkLnZhbHVlID0gZmFsc2U7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gc3RhcnQoKSB7XG5cdFx0YXdhaXQgX3N0YXJ0KCk7XG5cdFx0aWYgKHN0cmVhbS52YWx1ZSkgZW5hYmxlZC52YWx1ZSA9IHRydWU7XG5cdFx0cmV0dXJuIHN0cmVhbS52YWx1ZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZXN0YXJ0KCkge1xuXHRcdF9zdG9wKCk7XG5cdFx0cmV0dXJuIGF3YWl0IHN0YXJ0KCk7XG5cdH1cblx0d2F0Y2goZW5hYmxlZCwgKHYpID0+IHtcblx0XHRpZiAodikgX3N0YXJ0KCk7XG5cdFx0ZWxzZSBfc3RvcCgpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0d2F0Y2goY29uc3RyYWludHMsICgpID0+IHtcblx0XHRpZiAoYXV0b1N3aXRjaC52YWx1ZSAmJiBzdHJlYW0udmFsdWUpIHJlc3RhcnQoKTtcblx0fSwge1xuXHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRkZWVwOiB0cnVlXG5cdH0pO1xuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0c3RvcCgpO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdHJlYW0sXG5cdFx0c3RhcnQsXG5cdFx0c3RvcCxcblx0XHRyZXN0YXJ0LFxuXHRcdGNvbnN0cmFpbnRzLFxuXHRcdGVuYWJsZWQsXG5cdFx0YXV0b1N3aXRjaFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VWTW9kZWwvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHYtbW9kZWwgYmluZGluZywgcHJvcHMgKyBlbWl0IC0+IHJlZlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VWTW9kZWxcbiogQHBhcmFtIHByb3BzXG4qIEBwYXJhbSBrZXkgKGRlZmF1bHQgJ21vZGVsVmFsdWUnKVxuKiBAcGFyYW0gZW1pdFxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVZNb2RlbChwcm9wcywga2V5LCBlbWl0LCBvcHRpb25zID0ge30pIHtcblx0dmFyIF92bSQkZW1pdCwgX3ZtJHByb3h5O1xuXHRjb25zdCB7IGNsb25lID0gZmFsc2UsIHBhc3NpdmUgPSBmYWxzZSwgZXZlbnROYW1lLCBkZWVwID0gZmFsc2UsIGRlZmF1bHRWYWx1ZSwgc2hvdWxkRW1pdCB9ID0gb3B0aW9ucztcblx0Y29uc3Qgdm0gPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcblx0Y29uc3QgX2VtaXQgPSBlbWl0IHx8ICh2bSA9PT0gbnVsbCB8fCB2bSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdm0uZW1pdCkgfHwgKHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgfHwgKF92bSQkZW1pdCA9IHZtLiRlbWl0KSA9PT0gbnVsbCB8fCBfdm0kJGVtaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF92bSQkZW1pdC5iaW5kKHZtKSkgfHwgKHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgfHwgKF92bSRwcm94eSA9IHZtLnByb3h5KSA9PT0gbnVsbCB8fCBfdm0kcHJveHkgPT09IHZvaWQgMCB8fCAoX3ZtJHByb3h5ID0gX3ZtJHByb3h5LiRlbWl0KSA9PT0gbnVsbCB8fCBfdm0kcHJveHkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF92bSRwcm94eS5iaW5kKHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2bS5wcm94eSkpO1xuXHRsZXQgZXZlbnQgPSBldmVudE5hbWU7XG5cdGlmICgha2V5KSBrZXkgPSBcIm1vZGVsVmFsdWVcIjtcblx0ZXZlbnQgPSBldmVudCB8fCBgdXBkYXRlOiR7a2V5LnRvU3RyaW5nKCl9YDtcblx0Y29uc3QgY2xvbmVGbiA9ICh2YWwpID0+ICFjbG9uZSA/IHZhbCA6IHR5cGVvZiBjbG9uZSA9PT0gXCJmdW5jdGlvblwiID8gY2xvbmUodmFsKSA6IGNsb25lRm5KU09OKHZhbCk7XG5cdGNvbnN0IGdldFZhbHVlJDEgPSAoKSA9PiBpc0RlZihwcm9wc1trZXldKSA/IGNsb25lRm4ocHJvcHNba2V5XSkgOiBkZWZhdWx0VmFsdWU7XG5cdGNvbnN0IHRyaWdnZXJFbWl0ID0gKHZhbHVlKSA9PiB7XG5cdFx0aWYgKHNob3VsZEVtaXQpIHtcblx0XHRcdGlmIChzaG91bGRFbWl0KHZhbHVlKSkgX2VtaXQoZXZlbnQsIHZhbHVlKTtcblx0XHR9IGVsc2UgX2VtaXQoZXZlbnQsIHZhbHVlKTtcblx0fTtcblx0aWYgKHBhc3NpdmUpIHtcblx0XHRjb25zdCBwcm94eSA9IHJlZihnZXRWYWx1ZSQxKCkpO1xuXHRcdGxldCBpc1VwZGF0aW5nID0gZmFsc2U7XG5cdFx0d2F0Y2goKCkgPT4gcHJvcHNba2V5XSwgKHYpID0+IHtcblx0XHRcdGlmICghaXNVcGRhdGluZykge1xuXHRcdFx0XHRpc1VwZGF0aW5nID0gdHJ1ZTtcblx0XHRcdFx0cHJveHkudmFsdWUgPSBjbG9uZUZuKHYpO1xuXHRcdFx0XHRuZXh0VGljaygoKSA9PiBpc1VwZGF0aW5nID0gZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHdhdGNoKHByb3h5LCAodikgPT4ge1xuXHRcdFx0aWYgKCFpc1VwZGF0aW5nICYmICh2ICE9PSBwcm9wc1trZXldIHx8IGRlZXApKSB0cmlnZ2VyRW1pdCh2KTtcblx0XHR9LCB7IGRlZXAgfSk7XG5cdFx0cmV0dXJuIHByb3h5O1xuXHR9IGVsc2UgcmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZ2V0VmFsdWUkMSgpO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHR0cmlnZ2VyRW1pdCh2YWx1ZSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVk1vZGVscy9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3IgcHJvcHMgdi1tb2RlbCBiaW5kaW5nLiBUaGluayBsaWtlIGB0b1JlZnMocHJvcHMpYCBidXQgY2hhbmdlcyB3aWxsIGFsc28gZW1pdCBvdXQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVZNb2RlbHNcbiogQHBhcmFtIHByb3BzXG4qIEBwYXJhbSBlbWl0XG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVk1vZGVscyhwcm9wcywgZW1pdCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHJldCA9IHt9O1xuXHRmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykgcmV0W2tleV0gPSB1c2VWTW9kZWwocHJvcHMsIGtleSwgZW1pdCwgb3B0aW9ucyk7XG5cdHJldHVybiByZXQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVZpYnJhdGUvaW5kZXgudHNcbmZ1bmN0aW9uIGdldERlZmF1bHRTY2hlZHVsZXIkMShvcHRpb25zID0geyBpbnRlcnZhbDogMCB9KSB7XG5cdGNvbnN0IHsgaW50ZXJ2YWwgfSA9IG9wdGlvbnM7XG5cdGlmIChpbnRlcnZhbCA9PT0gMCkgcmV0dXJuO1xuXHRyZXR1cm4gKGZuKSA9PiB1c2VJbnRlcnZhbEZuKGZuLCBpbnRlcnZhbCwge1xuXHRcdGltbWVkaWF0ZTogZmFsc2UsXG5cdFx0aW1tZWRpYXRlQ2FsbGJhY2s6IGZhbHNlXG5cdH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIHZpYnJhdGVcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVmlicmF0ZVxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9WaWJyYXRpb25fQVBJXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVmlicmF0ZShvcHRpb25zKSB7XG5cdGNvbnN0IHsgcGF0dGVybiA9IFtdLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDEob3B0aW9ucyksIG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zIHx8IHt9O1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gdHlwZW9mIG5hdmlnYXRvciQxICE9PSBcInVuZGVmaW5lZFwiICYmIFwidmlicmF0ZVwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgcGF0dGVyblJlZiA9IHRvUmVmKHBhdHRlcm4pO1xuXHRjb25zdCB2aWJyYXRlID0gKHBhdHRlcm4kMSA9IHBhdHRlcm5SZWYudmFsdWUpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIG5hdmlnYXRvciQxLnZpYnJhdGUocGF0dGVybiQxKTtcblx0fTtcblx0Y29uc3QgaW50ZXJ2YWxDb250cm9scyA9IHNjaGVkdWxlciA9PT0gbnVsbCB8fCBzY2hlZHVsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVkdWxlcih2aWJyYXRlKTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIG5hdmlnYXRvciQxLnZpYnJhdGUoMCk7XG5cdFx0aW50ZXJ2YWxDb250cm9scyA9PT0gbnVsbCB8fCBpbnRlcnZhbENvbnRyb2xzID09PSB2b2lkIDAgfHwgaW50ZXJ2YWxDb250cm9scy5wYXVzZSgpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHBhdHRlcm4sXG5cdFx0aW50ZXJ2YWxDb250cm9scyxcblx0XHR2aWJyYXRlLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVmlydHVhbExpc3QvaW5kZXgudHNcbi8qKlxuKiBQbGVhc2UgY29uc2lkZXIgdXNpbmcgW2B2dWUtdmlydHVhbC1zY3JvbGxlcmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9Ba3J5dW0vdnVlLXZpcnR1YWwtc2Nyb2xsZXIpIGlmIHlvdSBhcmUgbG9va2luZyBmb3IgbW9yZSBmZWF0dXJlcy5cbiovXG5mdW5jdGlvbiB1c2VWaXJ0dWFsTGlzdChsaXN0LCBvcHRpb25zKSB7XG5cdGNvbnN0IHsgY29udGFpbmVyU3R5bGUsIHdyYXBwZXJQcm9wcywgc2Nyb2xsVG8sIGNhbGN1bGF0ZVJhbmdlLCBjdXJyZW50TGlzdCwgY29udGFpbmVyUmVmIH0gPSBcIml0ZW1IZWlnaHRcIiBpbiBvcHRpb25zID8gdXNlVmVydGljYWxWaXJ0dWFsTGlzdChvcHRpb25zLCBsaXN0KSA6IHVzZUhvcml6b250YWxWaXJ0dWFsTGlzdChvcHRpb25zLCBsaXN0KTtcblx0cmV0dXJuIHtcblx0XHRsaXN0OiBjdXJyZW50TGlzdCxcblx0XHRzY3JvbGxUbyxcblx0XHRjb250YWluZXJQcm9wczoge1xuXHRcdFx0cmVmOiBjb250YWluZXJSZWYsXG5cdFx0XHRvblNjcm9sbDogKCkgPT4ge1xuXHRcdFx0XHRjYWxjdWxhdGVSYW5nZSgpO1xuXHRcdFx0fSxcblx0XHRcdHN0eWxlOiBjb250YWluZXJTdHlsZVxuXHRcdH0sXG5cdFx0d3JhcHBlclByb3BzXG5cdH07XG59XG5mdW5jdGlvbiB1c2VWaXJ0dWFsTGlzdFJlc291cmNlcyhsaXN0KSB7XG5cdGNvbnN0IGNvbnRhaW5lclJlZiA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHNpemUgPSB1c2VFbGVtZW50U2l6ZShjb250YWluZXJSZWYpO1xuXHRjb25zdCBjdXJyZW50TGlzdCA9IHJlZihbXSk7XG5cdGNvbnN0IHNvdXJjZSA9IHNoYWxsb3dSZWYobGlzdCk7XG5cdHJldHVybiB7XG5cdFx0c3RhdGU6IHJlZih7XG5cdFx0XHRzdGFydDogMCxcblx0XHRcdGVuZDogMTBcblx0XHR9KSxcblx0XHRzb3VyY2UsXG5cdFx0Y3VycmVudExpc3QsXG5cdFx0c2l6ZSxcblx0XHRjb250YWluZXJSZWZcblx0fTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUdldFZpZXdDYXBhY2l0eShzdGF0ZSwgc291cmNlLCBpdGVtU2l6ZSkge1xuXHRyZXR1cm4gKGNvbnRhaW5lclNpemUpID0+IHtcblx0XHRpZiAodHlwZW9mIGl0ZW1TaXplID09PSBcIm51bWJlclwiKSByZXR1cm4gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG5cdFx0Y29uc3QgeyBzdGFydCA9IDAgfSA9IHN0YXRlLnZhbHVlO1xuXHRcdGxldCBzdW0gPSAwO1xuXHRcdGxldCBjYXBhY2l0eSA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc291cmNlLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzaXplID0gaXRlbVNpemUoaSk7XG5cdFx0XHRzdW0gKz0gc2l6ZTtcblx0XHRcdGNhcGFjaXR5ID0gaTtcblx0XHRcdGlmIChzdW0gPiBjb250YWluZXJTaXplKSBicmVhaztcblx0XHR9XG5cdFx0cmV0dXJuIGNhcGFjaXR5IC0gc3RhcnQ7XG5cdH07XG59XG5mdW5jdGlvbiBjcmVhdGVHZXRPZmZzZXQoc291cmNlLCBpdGVtU2l6ZSkge1xuXHRyZXR1cm4gKHNjcm9sbERpcmVjdGlvbikgPT4ge1xuXHRcdGlmICh0eXBlb2YgaXRlbVNpemUgPT09IFwibnVtYmVyXCIpIHJldHVybiBNYXRoLmZsb29yKHNjcm9sbERpcmVjdGlvbiAvIGl0ZW1TaXplKSArIDE7XG5cdFx0bGV0IHN1bSA9IDA7XG5cdFx0bGV0IG9mZnNldCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UudmFsdWUubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHNpemUgPSBpdGVtU2l6ZShpKTtcblx0XHRcdHN1bSArPSBzaXplO1xuXHRcdFx0aWYgKHN1bSA+PSBzY3JvbGxEaXJlY3Rpb24pIHtcblx0XHRcdFx0b2Zmc2V0ID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvZmZzZXQgKyAxO1xuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FsY3VsYXRlUmFuZ2UodHlwZSwgb3ZlcnNjYW4sIGdldE9mZnNldCwgZ2V0Vmlld0NhcGFjaXR5LCB7IGNvbnRhaW5lclJlZiwgc3RhdGUsIGN1cnJlbnRMaXN0LCBzb3VyY2UgfSkge1xuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBjb250YWluZXJSZWYudmFsdWU7XG5cdFx0aWYgKGVsZW1lbnQpIHtcblx0XHRcdGNvbnN0IG9mZnNldCA9IGdldE9mZnNldCh0eXBlID09PSBcInZlcnRpY2FsXCIgPyBlbGVtZW50LnNjcm9sbFRvcCA6IGVsZW1lbnQuc2Nyb2xsTGVmdCk7XG5cdFx0XHRjb25zdCB2aWV3Q2FwYWNpdHkgPSBnZXRWaWV3Q2FwYWNpdHkodHlwZSA9PT0gXCJ2ZXJ0aWNhbFwiID8gZWxlbWVudC5jbGllbnRIZWlnaHQgOiBlbGVtZW50LmNsaWVudFdpZHRoKTtcblx0XHRcdGNvbnN0IGZyb20gPSBvZmZzZXQgLSBvdmVyc2Nhbjtcblx0XHRcdGNvbnN0IHRvID0gb2Zmc2V0ICsgdmlld0NhcGFjaXR5ICsgb3ZlcnNjYW47XG5cdFx0XHRzdGF0ZS52YWx1ZSA9IHtcblx0XHRcdFx0c3RhcnQ6IGZyb20gPCAwID8gMCA6IGZyb20sXG5cdFx0XHRcdGVuZDogdG8gPiBzb3VyY2UudmFsdWUubGVuZ3RoID8gc291cmNlLnZhbHVlLmxlbmd0aCA6IHRvXG5cdFx0XHR9O1xuXHRcdFx0Y3VycmVudExpc3QudmFsdWUgPSBzb3VyY2UudmFsdWUuc2xpY2Uoc3RhdGUudmFsdWUuc3RhcnQsIHN0YXRlLnZhbHVlLmVuZCkubWFwKChlbGUsIGluZGV4KSA9PiAoe1xuXHRcdFx0XHRkYXRhOiBlbGUsXG5cdFx0XHRcdGluZGV4OiBpbmRleCArIHN0YXRlLnZhbHVlLnN0YXJ0XG5cdFx0XHR9KSk7XG5cdFx0fVxuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlR2V0RGlzdGFuY2UoaXRlbVNpemUsIHNvdXJjZSkge1xuXHRyZXR1cm4gKGluZGV4KSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGluZGV4ICogaXRlbVNpemU7XG5cdFx0cmV0dXJuIHNvdXJjZS52YWx1ZS5zbGljZSgwLCBpbmRleCkucmVkdWNlKChzdW0sIF8sIGkpID0+IHN1bSArIGl0ZW1TaXplKGkpLCAwKTtcblx0fTtcbn1cbmZ1bmN0aW9uIHVzZVdhdGNoRm9yU2l6ZXMoc2l6ZSwgbGlzdCwgY29udGFpbmVyUmVmLCBjYWxjdWxhdGVSYW5nZSkge1xuXHR3YXRjaChbXG5cdFx0c2l6ZS53aWR0aCxcblx0XHRzaXplLmhlaWdodCxcblx0XHQoKSA9PiB0b1ZhbHVlKGxpc3QpLFxuXHRcdGNvbnRhaW5lclJlZlxuXHRdLCAoKSA9PiB7XG5cdFx0Y2FsY3VsYXRlUmFuZ2UoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21wdXRlZFRvdGFsU2l6ZShpdGVtU2l6ZSwgc291cmNlKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHNvdXJjZS52YWx1ZS5sZW5ndGggKiBpdGVtU2l6ZTtcblx0XHRyZXR1cm4gc291cmNlLnZhbHVlLnJlZHVjZSgoc3VtLCBfLCBpbmRleCkgPT4gc3VtICsgaXRlbVNpemUoaW5kZXgpLCAwKTtcblx0fSk7XG59XG5jb25zdCBzY3JvbGxUb0RpY3Rpb25hcnlGb3JFbGVtZW50U2Nyb2xsS2V5ID0ge1xuXHRob3Jpem9udGFsOiBcInNjcm9sbExlZnRcIixcblx0dmVydGljYWw6IFwic2Nyb2xsVG9wXCJcbn07XG5mdW5jdGlvbiBjcmVhdGVTY3JvbGxUbyh0eXBlLCBjYWxjdWxhdGVSYW5nZSwgZ2V0RGlzdGFuY2UsIGNvbnRhaW5lclJlZikge1xuXHRyZXR1cm4gKGluZGV4KSA9PiB7XG5cdFx0aWYgKGNvbnRhaW5lclJlZi52YWx1ZSkge1xuXHRcdFx0Y29udGFpbmVyUmVmLnZhbHVlW3Njcm9sbFRvRGljdGlvbmFyeUZvckVsZW1lbnRTY3JvbGxLZXlbdHlwZV1dID0gZ2V0RGlzdGFuY2UoaW5kZXgpO1xuXHRcdFx0Y2FsY3VsYXRlUmFuZ2UoKTtcblx0XHR9XG5cdH07XG59XG5mdW5jdGlvbiB1c2VIb3Jpem9udGFsVmlydHVhbExpc3Qob3B0aW9ucywgbGlzdCkge1xuXHRjb25zdCByZXNvdXJjZXMgPSB1c2VWaXJ0dWFsTGlzdFJlc291cmNlcyhsaXN0KTtcblx0Y29uc3QgeyBzdGF0ZSwgc291cmNlLCBjdXJyZW50TGlzdCwgc2l6ZSwgY29udGFpbmVyUmVmIH0gPSByZXNvdXJjZXM7XG5cdGNvbnN0IGNvbnRhaW5lclN0eWxlID0geyBvdmVyZmxvd1g6IFwiYXV0b1wiIH07XG5cdGNvbnN0IHsgaXRlbVdpZHRoLCBvdmVyc2NhbiA9IDUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGdldFZpZXdDYXBhY2l0eSA9IGNyZWF0ZUdldFZpZXdDYXBhY2l0eShzdGF0ZSwgc291cmNlLCBpdGVtV2lkdGgpO1xuXHRjb25zdCBjYWxjdWxhdGVSYW5nZSA9IGNyZWF0ZUNhbGN1bGF0ZVJhbmdlKFwiaG9yaXpvbnRhbFwiLCBvdmVyc2NhbiwgY3JlYXRlR2V0T2Zmc2V0KHNvdXJjZSwgaXRlbVdpZHRoKSwgZ2V0Vmlld0NhcGFjaXR5LCByZXNvdXJjZXMpO1xuXHRjb25zdCBnZXREaXN0YW5jZUxlZnQgPSBjcmVhdGVHZXREaXN0YW5jZShpdGVtV2lkdGgsIHNvdXJjZSk7XG5cdGNvbnN0IG9mZnNldExlZnQgPSBjb21wdXRlZCgoKSA9PiBnZXREaXN0YW5jZUxlZnQoc3RhdGUudmFsdWUuc3RhcnQpKTtcblx0Y29uc3QgdG90YWxXaWR0aCA9IGNyZWF0ZUNvbXB1dGVkVG90YWxTaXplKGl0ZW1XaWR0aCwgc291cmNlKTtcblx0dXNlV2F0Y2hGb3JTaXplcyhzaXplLCBsaXN0LCBjb250YWluZXJSZWYsIGNhbGN1bGF0ZVJhbmdlKTtcblx0cmV0dXJuIHtcblx0XHRzY3JvbGxUbzogY3JlYXRlU2Nyb2xsVG8oXCJob3Jpem9udGFsXCIsIGNhbGN1bGF0ZVJhbmdlLCBnZXREaXN0YW5jZUxlZnQsIGNvbnRhaW5lclJlZiksXG5cdFx0Y2FsY3VsYXRlUmFuZ2UsXG5cdFx0d3JhcHBlclByb3BzOiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0XHRyZXR1cm4geyBzdHlsZToge1xuXHRcdFx0XHRoZWlnaHQ6IFwiMTAwJVwiLFxuXHRcdFx0XHR3aWR0aDogYCR7dG90YWxXaWR0aC52YWx1ZSAtIG9mZnNldExlZnQudmFsdWV9cHhgLFxuXHRcdFx0XHRtYXJnaW5MZWZ0OiBgJHtvZmZzZXRMZWZ0LnZhbHVlfXB4YCxcblx0XHRcdFx0ZGlzcGxheTogXCJmbGV4XCJcblx0XHRcdH0gfTtcblx0XHR9KSxcblx0XHRjb250YWluZXJTdHlsZSxcblx0XHRjdXJyZW50TGlzdCxcblx0XHRjb250YWluZXJSZWZcblx0fTtcbn1cbmZ1bmN0aW9uIHVzZVZlcnRpY2FsVmlydHVhbExpc3Qob3B0aW9ucywgbGlzdCkge1xuXHRjb25zdCByZXNvdXJjZXMgPSB1c2VWaXJ0dWFsTGlzdFJlc291cmNlcyhsaXN0KTtcblx0Y29uc3QgeyBzdGF0ZSwgc291cmNlLCBjdXJyZW50TGlzdCwgc2l6ZSwgY29udGFpbmVyUmVmIH0gPSByZXNvdXJjZXM7XG5cdGNvbnN0IGNvbnRhaW5lclN0eWxlID0geyBvdmVyZmxvd1k6IFwiYXV0b1wiIH07XG5cdGNvbnN0IHsgaXRlbUhlaWdodCwgb3ZlcnNjYW4gPSA1IH0gPSBvcHRpb25zO1xuXHRjb25zdCBnZXRWaWV3Q2FwYWNpdHkgPSBjcmVhdGVHZXRWaWV3Q2FwYWNpdHkoc3RhdGUsIHNvdXJjZSwgaXRlbUhlaWdodCk7XG5cdGNvbnN0IGNhbGN1bGF0ZVJhbmdlID0gY3JlYXRlQ2FsY3VsYXRlUmFuZ2UoXCJ2ZXJ0aWNhbFwiLCBvdmVyc2NhbiwgY3JlYXRlR2V0T2Zmc2V0KHNvdXJjZSwgaXRlbUhlaWdodCksIGdldFZpZXdDYXBhY2l0eSwgcmVzb3VyY2VzKTtcblx0Y29uc3QgZ2V0RGlzdGFuY2VUb3AgPSBjcmVhdGVHZXREaXN0YW5jZShpdGVtSGVpZ2h0LCBzb3VyY2UpO1xuXHRjb25zdCBvZmZzZXRUb3AgPSBjb21wdXRlZCgoKSA9PiBnZXREaXN0YW5jZVRvcChzdGF0ZS52YWx1ZS5zdGFydCkpO1xuXHRjb25zdCB0b3RhbEhlaWdodCA9IGNyZWF0ZUNvbXB1dGVkVG90YWxTaXplKGl0ZW1IZWlnaHQsIHNvdXJjZSk7XG5cdHVzZVdhdGNoRm9yU2l6ZXMoc2l6ZSwgbGlzdCwgY29udGFpbmVyUmVmLCBjYWxjdWxhdGVSYW5nZSk7XG5cdHJldHVybiB7XG5cdFx0Y2FsY3VsYXRlUmFuZ2UsXG5cdFx0c2Nyb2xsVG86IGNyZWF0ZVNjcm9sbFRvKFwidmVydGljYWxcIiwgY2FsY3VsYXRlUmFuZ2UsIGdldERpc3RhbmNlVG9wLCBjb250YWluZXJSZWYpLFxuXHRcdGNvbnRhaW5lclN0eWxlLFxuXHRcdHdyYXBwZXJQcm9wczogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHsgc3R5bGU6IHtcblx0XHRcdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdFx0XHRoZWlnaHQ6IGAke3RvdGFsSGVpZ2h0LnZhbHVlIC0gb2Zmc2V0VG9wLnZhbHVlfXB4YCxcblx0XHRcdFx0bWFyZ2luVG9wOiBgJHtvZmZzZXRUb3AudmFsdWV9cHhgXG5cdFx0XHR9IH07XG5cdFx0fSksXG5cdFx0Y3VycmVudExpc3QsXG5cdFx0Y29udGFpbmVyUmVmXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdha2VMb2NrL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgU2NyZWVuIFdha2UgTG9jayBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdha2VMb2NrXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlV2FrZUxvY2sob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCByZXF1ZXN0ZWRUeXBlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHNlbnRpbmVsID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgZG9jdW1lbnRWaXNpYmlsaXR5ID0gdXNlRG9jdW1lbnRWaXNpYmlsaXR5KHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgfSk7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcIndha2VMb2NrXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBpc0FjdGl2ZSA9IGNvbXB1dGVkKCgpID0+ICEhc2VudGluZWwudmFsdWUgJiYgZG9jdW1lbnRWaXNpYmlsaXR5LnZhbHVlID09PSBcInZpc2libGVcIik7XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoc2VudGluZWwsIFwicmVsZWFzZVwiLCAoKSA9PiB7XG5cdFx0XHR2YXIgX3NlbnRpbmVsJHZhbHVlJHR5cGUsIF9zZW50aW5lbCR2YWx1ZTtcblx0XHRcdHJlcXVlc3RlZFR5cGUudmFsdWUgPSAoX3NlbnRpbmVsJHZhbHVlJHR5cGUgPSAoX3NlbnRpbmVsJHZhbHVlID0gc2VudGluZWwudmFsdWUpID09PSBudWxsIHx8IF9zZW50aW5lbCR2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbnRpbmVsJHZhbHVlLnR5cGUpICE9PSBudWxsICYmIF9zZW50aW5lbCR2YWx1ZSR0eXBlICE9PSB2b2lkIDAgPyBfc2VudGluZWwkdmFsdWUkdHlwZSA6IGZhbHNlO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHR3aGVuZXZlcigoKSA9PiBkb2N1bWVudFZpc2liaWxpdHkudmFsdWUgPT09IFwidmlzaWJsZVwiICYmIChkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEudmlzaWJpbGl0eVN0YXRlKSA9PT0gXCJ2aXNpYmxlXCIgJiYgcmVxdWVzdGVkVHlwZS52YWx1ZSwgKHR5cGUpID0+IHtcblx0XHRcdHJlcXVlc3RlZFR5cGUudmFsdWUgPSBmYWxzZTtcblx0XHRcdGZvcmNlUmVxdWVzdCh0eXBlKTtcblx0XHR9KTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBmb3JjZVJlcXVlc3QodHlwZSkge1xuXHRcdHZhciBfc2VudGluZWwkdmFsdWUyO1xuXHRcdGF3YWl0ICgoX3NlbnRpbmVsJHZhbHVlMiA9IHNlbnRpbmVsLnZhbHVlKSA9PT0gbnVsbCB8fCBfc2VudGluZWwkdmFsdWUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2VudGluZWwkdmFsdWUyLnJlbGVhc2UoKSk7XG5cdFx0c2VudGluZWwudmFsdWUgPSBpc1N1cHBvcnRlZC52YWx1ZSA/IGF3YWl0IG5hdmlnYXRvciQxLndha2VMb2NrLnJlcXVlc3QodHlwZSkgOiBudWxsO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QodHlwZSkge1xuXHRcdGlmIChkb2N1bWVudFZpc2liaWxpdHkudmFsdWUgPT09IFwidmlzaWJsZVwiKSBhd2FpdCBmb3JjZVJlcXVlc3QodHlwZSk7XG5cdFx0ZWxzZSByZXF1ZXN0ZWRUeXBlLnZhbHVlID0gdHlwZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZWxlYXNlKCkge1xuXHRcdHJlcXVlc3RlZFR5cGUudmFsdWUgPSBmYWxzZTtcblx0XHRjb25zdCBzID0gc2VudGluZWwudmFsdWU7XG5cdFx0c2VudGluZWwudmFsdWUgPSBudWxsO1xuXHRcdGF3YWl0IChzID09PSBudWxsIHx8IHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHMucmVsZWFzZSgpKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbnRpbmVsLFxuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzQWN0aXZlLFxuXHRcdHJlcXVlc3QsXG5cdFx0Zm9yY2VSZXF1ZXN0LFxuXHRcdHJlbGVhc2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViTm90aWZpY2F0aW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgdXNlV2ViTm90aWZpY2F0aW9uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdlYk5vdGlmaWNhdGlvblxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9ub3RpZmljYXRpb25cbiovXG5mdW5jdGlvbiB1c2VXZWJOb3RpZmljYXRpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHJlcXVlc3RQZXJtaXNzaW9uczogX3JlcXVlc3RGb3JQZXJtaXNzaW9ucyA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRlZmF1bHRXZWJOb3RpZmljYXRpb25PcHRpb25zID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHtcblx0XHRpZiAoIXdpbmRvdyQxIHx8ICEoXCJOb3RpZmljYXRpb25cIiBpbiB3aW5kb3ckMSkpIHJldHVybiBmYWxzZTtcblx0XHRpZiAoTm90aWZpY2F0aW9uLnBlcm1pc3Npb24gPT09IFwiZ3JhbnRlZFwiKSByZXR1cm4gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgbm90aWZpY2F0aW9uJDEgPSBuZXcgTm90aWZpY2F0aW9uKFwiXCIpO1xuXHRcdFx0bm90aWZpY2F0aW9uJDEub25zaG93ID0gKCkgPT4ge1xuXHRcdFx0XHRub3RpZmljYXRpb24kMS5jbG9zZSgpO1xuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoZS5uYW1lID09PSBcIlR5cGVFcnJvclwiKSByZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9KTtcblx0Y29uc3QgcGVybWlzc2lvbkdyYW50ZWQgPSBzaGFsbG93UmVmKGlzU3VwcG9ydGVkLnZhbHVlICYmIFwicGVybWlzc2lvblwiIGluIE5vdGlmaWNhdGlvbiAmJiBOb3RpZmljYXRpb24ucGVybWlzc2lvbiA9PT0gXCJncmFudGVkXCIpO1xuXHRjb25zdCBub3RpZmljYXRpb24gPSByZWYobnVsbCk7XG5cdGNvbnN0IGVuc3VyZVBlcm1pc3Npb25zID0gYXN5bmMgKCkgPT4ge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRpZiAoIXBlcm1pc3Npb25HcmFudGVkLnZhbHVlICYmIE5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uICE9PSBcImRlbmllZFwiKSB7XG5cdFx0XHRpZiAoYXdhaXQgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkgPT09IFwiZ3JhbnRlZFwiKSBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZTtcblx0fTtcblx0Y29uc3QgeyBvbjogb25DbGljaywgdHJpZ2dlcjogY2xpY2tUcmlnZ2VyIH0gPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgeyBvbjogb25TaG93LCB0cmlnZ2VyOiBzaG93VHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHsgb246IG9uRXJyb3IsIHRyaWdnZXI6IGVycm9yVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHsgb246IG9uQ2xvc2UsIHRyaWdnZXI6IGNsb3NlVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHNob3cgPSBhc3luYyAob3ZlcnJpZGVzKSA9PiB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCAhcGVybWlzc2lvbkdyYW50ZWQudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBvcHRpb25zJDEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0V2ViTm90aWZpY2F0aW9uT3B0aW9ucywgb3ZlcnJpZGVzKTtcblx0XHRub3RpZmljYXRpb24udmFsdWUgPSBuZXcgTm90aWZpY2F0aW9uKG9wdGlvbnMkMS50aXRsZSB8fCBcIlwiLCBvcHRpb25zJDEpO1xuXHRcdG5vdGlmaWNhdGlvbi52YWx1ZS5vbmNsaWNrID0gY2xpY2tUcmlnZ2VyO1xuXHRcdG5vdGlmaWNhdGlvbi52YWx1ZS5vbnNob3cgPSBzaG93VHJpZ2dlcjtcblx0XHRub3RpZmljYXRpb24udmFsdWUub25lcnJvciA9IGVycm9yVHJpZ2dlcjtcblx0XHRub3RpZmljYXRpb24udmFsdWUub25jbG9zZSA9IGNsb3NlVHJpZ2dlcjtcblx0XHRyZXR1cm4gbm90aWZpY2F0aW9uLnZhbHVlO1xuXHR9O1xuXHRjb25zdCBjbG9zZSA9ICgpID0+IHtcblx0XHRpZiAobm90aWZpY2F0aW9uLnZhbHVlKSBub3RpZmljYXRpb24udmFsdWUuY2xvc2UoKTtcblx0XHRub3RpZmljYXRpb24udmFsdWUgPSBudWxsO1xuXHR9O1xuXHRpZiAoX3JlcXVlc3RGb3JQZXJtaXNzaW9ucykgdHJ5T25Nb3VudGVkKGVuc3VyZVBlcm1pc3Npb25zKTtcblx0dHJ5T25TY29wZURpc3Bvc2UoY2xvc2UpO1xuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgd2luZG93JDEpIHtcblx0XHRjb25zdCBkb2N1bWVudCQxID0gd2luZG93JDEuZG9jdW1lbnQ7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInZpc2liaWxpdHljaGFuZ2VcIiwgKGUpID0+IHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmIChkb2N1bWVudCQxLnZpc2liaWxpdHlTdGF0ZSA9PT0gXCJ2aXNpYmxlXCIpIGNsb3NlKCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRub3RpZmljYXRpb24sXG5cdFx0ZW5zdXJlUGVybWlzc2lvbnMsXG5cdFx0cGVybWlzc2lvbkdyYW50ZWQsXG5cdFx0c2hvdyxcblx0XHRjbG9zZSxcblx0XHRvbkNsaWNrLFxuXHRcdG9uU2hvdyxcblx0XHRvbkVycm9yLFxuXHRcdG9uQ2xvc2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViU29ja2V0L2luZGV4LnRzXG5jb25zdCBERUZBVUxUX1BJTkdfTUVTU0FHRSA9IFwicGluZ1wiO1xuZnVuY3Rpb24gcmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucykge1xuXHRpZiAob3B0aW9ucyA9PT0gdHJ1ZSkgcmV0dXJuIHt9O1xuXHRyZXR1cm4gb3B0aW9ucztcbn1cbmZ1bmN0aW9uIGdldERlZmF1bHRTY2hlZHVsZXIob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IGludGVydmFsID0gMWUzIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIGludGVydmFsLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdH1cblx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgMWUzLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG59XG4vKipcbiogUmVhY3RpdmUgV2ViU29ja2V0IGNsaWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlV2ViU29ja2V0XG4qIEBwYXJhbSB1cmxcbiovXG5mdW5jdGlvbiB1c2VXZWJTb2NrZXQodXJsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBvbkNvbm5lY3RlZCwgb25EaXNjb25uZWN0ZWQsIG9uRXJyb3IsIG9uTWVzc2FnZSwgaW1tZWRpYXRlID0gdHJ1ZSwgYXV0b0Nvbm5lY3QgPSB0cnVlLCBhdXRvQ2xvc2UgPSB0cnVlLCBwcm90b2NvbHMgPSBbXSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZGF0YSA9IHJlZihudWxsKTtcblx0Y29uc3Qgc3RhdHVzID0gc2hhbGxvd1JlZihcIkNMT1NFRFwiKTtcblx0Y29uc3Qgd3NSZWYgPSByZWYoKTtcblx0Y29uc3QgdXJsUmVmID0gdG9SZWYodXJsKTtcblx0bGV0IGhlYXJ0YmVhdFBhdXNlO1xuXHRsZXQgaGVhcnRiZWF0UmVzdW1lO1xuXHRsZXQgZXhwbGljaXRseUNsb3NlZCA9IGZhbHNlO1xuXHRsZXQgcmV0cmllZCA9IDA7XG5cdGxldCBidWZmZXJlZERhdGEgPSBbXTtcblx0bGV0IHJldHJ5VGltZW91dDtcblx0bGV0IHBvbmdUaW1lb3V0V2FpdDtcblx0Y29uc3QgX3NlbmRCdWZmZXIgPSAoKSA9PiB7XG5cdFx0aWYgKGJ1ZmZlcmVkRGF0YS5sZW5ndGggJiYgd3NSZWYudmFsdWUgJiYgc3RhdHVzLnZhbHVlID09PSBcIk9QRU5cIikge1xuXHRcdFx0Zm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVyZWREYXRhKSB3c1JlZi52YWx1ZS5zZW5kKGJ1ZmZlcik7XG5cdFx0XHRidWZmZXJlZERhdGEgPSBbXTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0UmV0cnkgPSAoKSA9PiB7XG5cdFx0aWYgKHJldHJ5VGltZW91dCAhPSBudWxsKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQocmV0cnlUaW1lb3V0KTtcblx0XHRcdHJldHJ5VGltZW91dCA9IHZvaWQgMDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0SGVhcnRiZWF0ID0gKCkgPT4ge1xuXHRcdGNsZWFyVGltZW91dChwb25nVGltZW91dFdhaXQpO1xuXHRcdHBvbmdUaW1lb3V0V2FpdCA9IHZvaWQgMDtcblx0fTtcblx0Y29uc3QgY2xvc2UgPSAoY29kZSA9IDFlMywgcmVhc29uKSA9PiB7XG5cdFx0cmVzZXRSZXRyeSgpO1xuXHRcdGlmICghaXNDbGllbnQgJiYgIWlzV29ya2VyIHx8ICF3c1JlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGV4cGxpY2l0bHlDbG9zZWQgPSB0cnVlO1xuXHRcdHJlc2V0SGVhcnRiZWF0KCk7XG5cdFx0aGVhcnRiZWF0UGF1c2UgPT09IG51bGwgfHwgaGVhcnRiZWF0UGF1c2UgPT09IHZvaWQgMCB8fCBoZWFydGJlYXRQYXVzZSgpO1xuXHRcdHdzUmVmLnZhbHVlLmNsb3NlKGNvZGUsIHJlYXNvbik7XG5cdFx0d3NSZWYudmFsdWUgPSB2b2lkIDA7XG5cdH07XG5cdGNvbnN0IHNlbmQgPSAoZGF0YSQxLCB1c2VCdWZmZXIgPSB0cnVlKSA9PiB7XG5cdFx0aWYgKCF3c1JlZi52YWx1ZSB8fCBzdGF0dXMudmFsdWUgIT09IFwiT1BFTlwiKSB7XG5cdFx0XHRpZiAodXNlQnVmZmVyKSBidWZmZXJlZERhdGEucHVzaChkYXRhJDEpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRfc2VuZEJ1ZmZlcigpO1xuXHRcdHdzUmVmLnZhbHVlLnNlbmQoZGF0YSQxKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblx0Y29uc3QgX2luaXQgPSAoKSA9PiB7XG5cdFx0aWYgKGV4cGxpY2l0bHlDbG9zZWQgfHwgdHlwZW9mIHVybFJlZi52YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuXHRcdGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmxSZWYudmFsdWUsIHByb3RvY29scyk7XG5cdFx0d3NSZWYudmFsdWUgPSB3cztcblx0XHRzdGF0dXMudmFsdWUgPSBcIkNPTk5FQ1RJTkdcIjtcblx0XHR3cy5vbm9wZW4gPSAoKSA9PiB7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcIk9QRU5cIjtcblx0XHRcdHJldHJpZWQgPSAwO1xuXHRcdFx0b25Db25uZWN0ZWQgPT09IG51bGwgfHwgb25Db25uZWN0ZWQgPT09IHZvaWQgMCB8fCBvbkNvbm5lY3RlZCh3cyk7XG5cdFx0XHRoZWFydGJlYXRSZXN1bWUgPT09IG51bGwgfHwgaGVhcnRiZWF0UmVzdW1lID09PSB2b2lkIDAgfHwgaGVhcnRiZWF0UmVzdW1lKCk7XG5cdFx0XHRfc2VuZEJ1ZmZlcigpO1xuXHRcdH07XG5cdFx0d3Mub25jbG9zZSA9IChldikgPT4ge1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJDTE9TRURcIjtcblx0XHRcdHJlc2V0SGVhcnRiZWF0KCk7XG5cdFx0XHRoZWFydGJlYXRQYXVzZSA9PT0gbnVsbCB8fCBoZWFydGJlYXRQYXVzZSA9PT0gdm9pZCAwIHx8IGhlYXJ0YmVhdFBhdXNlKCk7XG5cdFx0XHRvbkRpc2Nvbm5lY3RlZCA9PT0gbnVsbCB8fCBvbkRpc2Nvbm5lY3RlZCA9PT0gdm9pZCAwIHx8IG9uRGlzY29ubmVjdGVkKHdzLCBldik7XG5cdFx0XHRpZiAoIWV4cGxpY2l0bHlDbG9zZWQgJiYgb3B0aW9ucy5hdXRvUmVjb25uZWN0ICYmICh3c1JlZi52YWx1ZSA9PSBudWxsIHx8IHdzID09PSB3c1JlZi52YWx1ZSkpIHtcblx0XHRcdFx0Y29uc3QgeyByZXRyaWVzID0gLTEsIGRlbGF5ID0gMWUzLCBvbkZhaWxlZCB9ID0gcmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucy5hdXRvUmVjb25uZWN0KTtcblx0XHRcdFx0aWYgKCh0eXBlb2YgcmV0cmllcyA9PT0gXCJmdW5jdGlvblwiID8gcmV0cmllcyA6ICgpID0+IHR5cGVvZiByZXRyaWVzID09PSBcIm51bWJlclwiICYmIChyZXRyaWVzIDwgMCB8fCByZXRyaWVkIDwgcmV0cmllcykpKHJldHJpZWQpKSB7XG5cdFx0XHRcdFx0cmV0cmllZCArPSAxO1xuXHRcdFx0XHRcdGNvbnN0IGRlbGF5VGltZSA9IHR5cGVvZiBkZWxheSA9PT0gXCJmdW5jdGlvblwiID8gZGVsYXkocmV0cmllZCkgOiBkZWxheTtcblx0XHRcdFx0XHRyZXRyeVRpbWVvdXQgPSBzZXRUaW1lb3V0KF9pbml0LCBkZWxheVRpbWUpO1xuXHRcdFx0XHR9IGVsc2Ugb25GYWlsZWQgPT09IG51bGwgfHwgb25GYWlsZWQgPT09IHZvaWQgMCB8fCBvbkZhaWxlZCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0d3Mub25lcnJvciA9IChlKSA9PiB7XG5cdFx0XHRvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCB8fCBvbkVycm9yKHdzLCBlKTtcblx0XHR9O1xuXHRcdHdzLm9ubWVzc2FnZSA9IChlKSA9PiB7XG5cdFx0XHRpZiAob3B0aW9ucy5oZWFydGJlYXQpIHtcblx0XHRcdFx0cmVzZXRIZWFydGJlYXQoKTtcblx0XHRcdFx0Y29uc3QgeyBtZXNzYWdlID0gREVGQVVMVF9QSU5HX01FU1NBR0UsIHJlc3BvbnNlTWVzc2FnZSA9IG1lc3NhZ2UgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMuaGVhcnRiZWF0KTtcblx0XHRcdFx0aWYgKGUuZGF0YSA9PT0gdG9WYWx1ZShyZXNwb25zZU1lc3NhZ2UpKSByZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRkYXRhLnZhbHVlID0gZS5kYXRhO1xuXHRcdFx0b25NZXNzYWdlID09PSBudWxsIHx8IG9uTWVzc2FnZSA9PT0gdm9pZCAwIHx8IG9uTWVzc2FnZSh3cywgZSk7XG5cdFx0fTtcblx0fTtcblx0aWYgKG9wdGlvbnMuaGVhcnRiZWF0KSB7XG5cdFx0Y29uc3QgeyBtZXNzYWdlID0gREVGQVVMVF9QSU5HX01FU1NBR0UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIocmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucy5oZWFydGJlYXQpKSwgcG9uZ1RpbWVvdXQgPSAxZTMgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMuaGVhcnRiZWF0KTtcblx0XHRjb25zdCB7IHBhdXNlLCByZXN1bWUgfSA9IHNjaGVkdWxlcigoKSA9PiB7XG5cdFx0XHRzZW5kKHRvVmFsdWUobWVzc2FnZSksIGZhbHNlKTtcblx0XHRcdGlmIChwb25nVGltZW91dFdhaXQgIT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0cG9uZ1RpbWVvdXRXYWl0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGNsb3NlKCk7XG5cdFx0XHRcdGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcblx0XHRcdH0sIHBvbmdUaW1lb3V0KTtcblx0XHR9KTtcblx0XHRoZWFydGJlYXRQYXVzZSA9IHBhdXNlO1xuXHRcdGhlYXJ0YmVhdFJlc3VtZSA9IHJlc3VtZTtcblx0fVxuXHRpZiAoYXV0b0Nsb3NlKSB7XG5cdFx0aWYgKGlzQ2xpZW50KSB1c2VFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsICgpID0+IGNsb3NlKCksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHR0cnlPblNjb3BlRGlzcG9zZShjbG9zZSk7XG5cdH1cblx0Y29uc3Qgb3BlbiA9ICgpID0+IHtcblx0XHRpZiAoIWlzQ2xpZW50ICYmICFpc1dvcmtlcikgcmV0dXJuO1xuXHRcdGNsb3NlKCk7XG5cdFx0ZXhwbGljaXRseUNsb3NlZCA9IGZhbHNlO1xuXHRcdHJldHJpZWQgPSAwO1xuXHRcdF9pbml0KCk7XG5cdH07XG5cdGlmIChpbW1lZGlhdGUpIG9wZW4oKTtcblx0aWYgKGF1dG9Db25uZWN0KSB3YXRjaCh1cmxSZWYsIG9wZW4pO1xuXHRyZXR1cm4ge1xuXHRcdGRhdGEsXG5cdFx0c3RhdHVzLFxuXHRcdGNsb3NlLFxuXHRcdHNlbmQsXG5cdFx0b3Blbixcblx0XHR3czogd3NSZWZcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViV29ya2VyL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VXZWJXb3JrZXIoYXJnMCwgd29ya2VyT3B0aW9ucywgb3B0aW9ucykge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcblx0Y29uc3QgZGF0YSA9IHJlZihudWxsKTtcblx0Y29uc3Qgd29ya2VyID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBwb3N0ID0gKC4uLmFyZ3MpID0+IHtcblx0XHRpZiAoIXdvcmtlci52YWx1ZSkgcmV0dXJuO1xuXHRcdHdvcmtlci52YWx1ZS5wb3N0TWVzc2FnZSguLi5hcmdzKTtcblx0fTtcblx0Y29uc3QgdGVybWluYXRlID0gZnVuY3Rpb24gdGVybWluYXRlJDEoKSB7XG5cdFx0aWYgKCF3b3JrZXIudmFsdWUpIHJldHVybjtcblx0XHR3b3JrZXIudmFsdWUudGVybWluYXRlKCk7XG5cdH07XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGlmICh0eXBlb2YgYXJnMCA9PT0gXCJzdHJpbmdcIikgd29ya2VyLnZhbHVlID0gbmV3IFdvcmtlcihhcmcwLCB3b3JrZXJPcHRpb25zKTtcblx0XHRlbHNlIGlmICh0eXBlb2YgYXJnMCA9PT0gXCJmdW5jdGlvblwiKSB3b3JrZXIudmFsdWUgPSBhcmcwKCk7XG5cdFx0ZWxzZSB3b3JrZXIudmFsdWUgPSBhcmcwO1xuXHRcdHdvcmtlci52YWx1ZS5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuXHRcdFx0ZGF0YS52YWx1ZSA9IGUuZGF0YTtcblx0XHR9O1xuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRcdGlmICh3b3JrZXIudmFsdWUpIHdvcmtlci52YWx1ZS50ZXJtaW5hdGUoKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGRhdGEsXG5cdFx0cG9zdCxcblx0XHR0ZXJtaW5hdGUsXG5cdFx0d29ya2VyXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdlYldvcmtlckZuL2xpYi9kZXBzUGFyc2VyLnRzXG4vKipcbipcbiogQ29uY2F0ZW5hdGVzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcuXG4qIHRoaXMgc3RyaW5nIHdpbGwgdGhlbiBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIFwiaW1wb3J0U2NyaXB0c1wiIGZ1bmN0aW9uXG4qXG4qIEBwYXJhbSBkZXBzIGFycmF5IG9mIHN0cmluZ1xuKiBAcGFyYW0gbG9jYWxEZXBzIGFycmF5IG9mIGZ1bmN0aW9uXG4qIEByZXR1cm5zIGEgc3RyaW5nIGNvbXBvc2VkIGJ5IHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBhcnJheVxuKiBlbGVtZW50cyBcImRlcHNcIiBhbmQgXCJpbXBvcnRTY3JpcHRzXCIuXG4qXG4qIEBleGFtcGxlXG4qIGRlcHNQYXJzZXIoWydkZW1vMScsICdkZW1vMiddKSAvLyByZXR1cm4gaW1wb3J0U2NyaXB0cygnZGVtbzEnLCAnZGVtbzInKVxuKi9cbmZ1bmN0aW9uIGRlcHNQYXJzZXIoZGVwcywgbG9jYWxEZXBzKSB7XG5cdGlmIChkZXBzLmxlbmd0aCA9PT0gMCAmJiBsb2NhbERlcHMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcblx0Y29uc3QgZGVwc1N0cmluZyA9IGRlcHMubWFwKChkZXApID0+IGAnJHtkZXB9J2ApLnRvU3RyaW5nKCk7XG5cdGNvbnN0IGRlcHNGdW5jdGlvblN0cmluZyA9IGxvY2FsRGVwcy5maWx0ZXIoKGRlcCkgPT4gdHlwZW9mIGRlcCA9PT0gXCJmdW5jdGlvblwiKS5tYXAoKGZuKSA9PiB7XG5cdFx0Y29uc3Qgc3RyID0gZm4udG9TdHJpbmcoKTtcblx0XHRpZiAoc3RyLnRyaW0oKS5zdGFydHNXaXRoKFwiZnVuY3Rpb25cIikpIHJldHVybiBzdHI7XG5cdFx0ZWxzZSByZXR1cm4gYGNvbnN0ICR7Zm4ubmFtZX0gPSAke3N0cn1gO1xuXHR9KS5qb2luKFwiO1wiKTtcblx0Y29uc3QgaW1wb3J0U3RyaW5nID0gYGltcG9ydFNjcmlwdHMoJHtkZXBzU3RyaW5nfSk7YDtcblx0cmV0dXJuIGAke2RlcHNTdHJpbmcudHJpbSgpID09PSBcIlwiID8gXCJcIiA6IGltcG9ydFN0cmluZ30gJHtkZXBzRnVuY3Rpb25TdHJpbmd9YDtcbn1cbnZhciBkZXBzUGFyc2VyX2RlZmF1bHQgPSBkZXBzUGFyc2VyO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9saWIvam9iUnVubmVyLnRzXG4vKipcbiogVGhpcyBmdW5jdGlvbiBhY2NlcHRzIGFzIGEgcGFyYW1ldGVyIGEgZnVuY3Rpb24gXCJ1c2VyRnVuY1wiXG4qIEFuZCBhcyBhIHJlc3VsdCByZXR1cm5zIGFuIGFub255bW91cyBmdW5jdGlvbi5cbiogVGhpcyBhbm9ueW1vdXMgZnVuY3Rpb24sIGFjY2VwdHMgYXMgYXJndW1lbnRzLFxuKiB0aGUgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiBcInVzZUFyZ3NcIiBhbmQgcmV0dXJucyBhIFByb21pc2VcbiogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhcyBhIHdyYXBwZXIsIG9ubHkgaW5zaWRlIGEgV29ya2VyXG4qIGJlY2F1c2UgaXQgZGVwZW5kcyBieSBcInBvc3RNZXNzYWdlXCIuXG4qXG4qIEBwYXJhbSB1c2VyRnVuYyB7RnVuY3Rpb259IGZuIHRoZSBmdW5jdGlvbiB0byBydW4gd2l0aCB3ZWIgd29ya2VyXG4qXG4qIEByZXR1cm5zIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHBhcmFtZXRlcnNcbiogdG8gYmUgcGFzc2VkIHRvIHRoZSBcInVzZXJGdW5jXCIgZnVuY3Rpb25cbiovXG5mdW5jdGlvbiBqb2JSdW5uZXIodXNlckZ1bmMpIHtcblx0cmV0dXJuIChlKSA9PiB7XG5cdFx0Y29uc3QgdXNlckZ1bmNBcmdzID0gZS5kYXRhWzBdO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodXNlckZ1bmMuYXBwbHkodm9pZCAwLCB1c2VyRnVuY0FyZ3MpKS50aGVuKChyZXN1bHQpID0+IHtcblx0XHRcdHBvc3RNZXNzYWdlKFtcIlNVQ0NFU1NcIiwgcmVzdWx0XSk7XG5cdFx0fSkuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRwb3N0TWVzc2FnZShbXCJFUlJPUlwiLCBlcnJvcl0pO1xuXHRcdH0pO1xuXHR9O1xufVxudmFyIGpvYlJ1bm5lcl9kZWZhdWx0ID0gam9iUnVubmVyO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9saWIvY3JlYXRlV29ya2VyQmxvYlVybC50c1xuLyoqXG4qIENvbnZlcnRzIHRoZSBcImZuXCIgZnVuY3Rpb24gaW50byB0aGUgc3ludGF4IG5lZWRlZCB0byBiZSBleGVjdXRlZCB3aXRoaW4gYSB3ZWIgd29ya2VyXG4qXG4qIEBwYXJhbSBmbiB0aGUgZnVuY3Rpb24gdG8gcnVuIHdpdGggd2ViIHdvcmtlclxuKiBAcGFyYW0gZGVwcyBhcnJheSBvZiBzdHJpbmdzLCBpbXBvcnRlZCBpbnRvIHRoZSB3b3JrZXIgdGhyb3VnaCBcImltcG9ydFNjcmlwdHNcIlxuKiBAcGFyYW0gbG9jYWxEZXBzIGFycmF5IG9mIGZ1bmN0aW9uLCBsb2NhbCBkZXBlbmRlbmNpZXNcbipcbiogQHJldHVybnMgYSBibG9iIHVybCwgY29udGFpbmluZyB0aGUgY29kZSBvZiBcImZuXCIgYXMgYSBzdHJpbmdcbipcbiogQGV4YW1wbGVcbiogY3JlYXRlV29ya2VyQmxvYlVybCgoYSxiKSA9PiBhK2IsIFtdKVxuKiAvLyByZXR1cm4gXCJvbm1lc3NhZ2U9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgoYSxiKSA9PiBhICsgYilcbiogLnRoZW4ocG9zdE1lc3NhZ2UoWydTVUNDRVNTJywgcmVzdWx0XSkpXG4qIC5jYXRjaChwb3N0TWVzc2FnZShbJ0VSUk9SJywgZXJyb3JdKVwiXG4qL1xuZnVuY3Rpb24gY3JlYXRlV29ya2VyQmxvYlVybChmbiwgZGVwcywgbG9jYWxEZXBzKSB7XG5cdGNvbnN0IGJsb2JDb2RlID0gYCR7ZGVwc1BhcnNlcl9kZWZhdWx0KGRlcHMsIGxvY2FsRGVwcyl9OyBvbm1lc3NhZ2U9KCR7am9iUnVubmVyX2RlZmF1bHR9KSgke2ZufSlgO1xuXHRjb25zdCBibG9iID0gbmV3IEJsb2IoW2Jsb2JDb2RlXSwgeyB0eXBlOiBcInRleHQvamF2YXNjcmlwdFwiIH0pO1xuXHRyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbn1cbnZhciBjcmVhdGVXb3JrZXJCbG9iVXJsX2RlZmF1bHQgPSBjcmVhdGVXb3JrZXJCbG9iVXJsO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9pbmRleC50c1xuLyoqXG4qIFJ1biBleHBlbnNpdmUgZnVuY3Rpb24gd2l0aG91dCBibG9ja2luZyB0aGUgVUksIHVzaW5nIGEgc2ltcGxlIHN5bnRheCB0aGF0IG1ha2VzIHVzZSBvZiBQcm9taXNlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXZWJXb3JrZXJGblxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VXZWJXb3JrZXJGbihmbiwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZGVwZW5kZW5jaWVzID0gW10sIGxvY2FsRGVwZW5kZW5jaWVzID0gW10sIHRpbWVvdXQsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCB3b3JrZXIgPSByZWYoKTtcblx0Y29uc3Qgd29ya2VyU3RhdHVzID0gc2hhbGxvd1JlZihcIlBFTkRJTkdcIik7XG5cdGNvbnN0IHByb21pc2UgPSByZWYoe30pO1xuXHRjb25zdCB0aW1lb3V0SWQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHdvcmtlclRlcm1pbmF0ZSA9IChzdGF0dXMgPSBcIlBFTkRJTkdcIikgPT4ge1xuXHRcdGlmICh3b3JrZXIudmFsdWUgJiYgd29ya2VyLnZhbHVlLl91cmwgJiYgd2luZG93JDEpIHtcblx0XHRcdHdvcmtlci52YWx1ZS50ZXJtaW5hdGUoKTtcblx0XHRcdFVSTC5yZXZva2VPYmplY3RVUkwod29ya2VyLnZhbHVlLl91cmwpO1xuXHRcdFx0cHJvbWlzZS52YWx1ZSA9IHt9O1xuXHRcdFx0d29ya2VyLnZhbHVlID0gdm9pZCAwO1xuXHRcdFx0d2luZG93JDEuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZC52YWx1ZSk7XG5cdFx0XHR3b3JrZXJTdGF0dXMudmFsdWUgPSBzdGF0dXM7XG5cdFx0fVxuXHR9O1xuXHR3b3JrZXJUZXJtaW5hdGUoKTtcblx0dHJ5T25TY29wZURpc3Bvc2Uod29ya2VyVGVybWluYXRlKTtcblx0Y29uc3QgZ2VuZXJhdGVXb3JrZXIgPSAoKSA9PiB7XG5cdFx0Y29uc3QgYmxvYlVybCA9IGNyZWF0ZVdvcmtlckJsb2JVcmxfZGVmYXVsdChmbiwgZGVwZW5kZW5jaWVzLCBsb2NhbERlcGVuZGVuY2llcyk7XG5cdFx0Y29uc3QgbmV3V29ya2VyID0gbmV3IFdvcmtlcihibG9iVXJsKTtcblx0XHRuZXdXb3JrZXIuX3VybCA9IGJsb2JVcmw7XG5cdFx0bmV3V29ya2VyLm9ubWVzc2FnZSA9IChlKSA9PiB7XG5cdFx0XHRjb25zdCB7IHJlc29sdmUgPSAoKSA9PiB7fSwgcmVqZWN0ID0gKCkgPT4ge30gfSA9IHByb21pc2UudmFsdWU7XG5cdFx0XHRjb25zdCBbc3RhdHVzLCByZXN1bHRdID0gZS5kYXRhO1xuXHRcdFx0c3dpdGNoIChzdGF0dXMpIHtcblx0XHRcdFx0Y2FzZSBcIlNVQ0NFU1NcIjpcblx0XHRcdFx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHRcdFx0d29ya2VyVGVybWluYXRlKHN0YXR1cyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0cmVqZWN0KHJlc3VsdCk7XG5cdFx0XHRcdFx0d29ya2VyVGVybWluYXRlKFwiRVJST1JcIik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRuZXdXb3JrZXIub25lcnJvciA9IChlKSA9PiB7XG5cdFx0XHRjb25zdCB7IHJlamVjdCA9ICgpID0+IHt9IH0gPSBwcm9taXNlLnZhbHVlO1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0cmVqZWN0KGUpO1xuXHRcdFx0d29ya2VyVGVybWluYXRlKFwiRVJST1JcIik7XG5cdFx0fTtcblx0XHRpZiAodGltZW91dCkgdGltZW91dElkLnZhbHVlID0gc2V0VGltZW91dCgoKSA9PiB3b3JrZXJUZXJtaW5hdGUoXCJUSU1FT1VUX0VYUElSRURcIiksIHRpbWVvdXQpO1xuXHRcdHJldHVybiBuZXdXb3JrZXI7XG5cdH07XG5cdGNvbnN0IGNhbGxXb3JrZXIgPSAoLi4uZm5BcmdzKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0dmFyIF93b3JrZXIkdmFsdWU7XG5cdFx0cHJvbWlzZS52YWx1ZSA9IHtcblx0XHRcdHJlc29sdmUsXG5cdFx0XHRyZWplY3Rcblx0XHR9O1xuXHRcdChfd29ya2VyJHZhbHVlID0gd29ya2VyLnZhbHVlKSA9PT0gbnVsbCB8fCBfd29ya2VyJHZhbHVlID09PSB2b2lkIDAgfHwgX3dvcmtlciR2YWx1ZS5wb3N0TWVzc2FnZShbWy4uLmZuQXJnc11dKTtcblx0XHR3b3JrZXJTdGF0dXMudmFsdWUgPSBcIlJVTk5JTkdcIjtcblx0fSk7XG5cdGNvbnN0IHdvcmtlckZuID0gKC4uLmZuQXJncykgPT4ge1xuXHRcdGlmICh3b3JrZXJTdGF0dXMudmFsdWUgPT09IFwiUlVOTklOR1wiKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiW3VzZVdlYldvcmtlckZuXSBZb3UgY2FuIG9ubHkgcnVuIG9uZSBpbnN0YW5jZSBvZiB0aGUgd29ya2VyIGF0IGEgdGltZS5cIik7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcblx0XHR9XG5cdFx0d29ya2VyLnZhbHVlID0gZ2VuZXJhdGVXb3JrZXIoKTtcblx0XHRyZXR1cm4gY2FsbFdvcmtlciguLi5mbkFyZ3MpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHdvcmtlckZuLFxuXHRcdHdvcmtlclN0YXR1cyxcblx0XHR3b3JrZXJUZXJtaW5hdGVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2luZG93Rm9jdXMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IHRyYWNrIHdpbmRvdyBmb2N1cyB3aXRoIGB3aW5kb3cub25mb2N1c2AgYW5kIGB3aW5kb3cub25ibHVyYC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlV2luZG93Rm9jdXNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VXaW5kb3dGb2N1cyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBmb2N1c2VkID0gc2hhbGxvd1JlZih3aW5kb3ckMS5kb2N1bWVudC5oYXNGb2N1cygpKTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiYmx1clwiLCAoKSA9PiB7XG5cdFx0Zm9jdXNlZC52YWx1ZSA9IGZhbHNlO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImZvY3VzXCIsICgpID0+IHtcblx0XHRmb2N1c2VkLnZhbHVlID0gdHJ1ZTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0cmV0dXJuIGZvY3VzZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdpbmRvd1Njcm9sbC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHdpbmRvdyBzY3JvbGwuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdpbmRvd1Njcm9sbFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVdpbmRvd1Njcm9sbChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywuLi5yZXN0IH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gdXNlU2Nyb2xsKHdpbmRvdyQxLCByZXN0KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2luZG93U2l6ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHdpbmRvdyBzaXplLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXaW5kb3dTaXplXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlV2luZG93U2l6ZShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaW5pdGlhbFdpZHRoID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBpbml0aWFsSGVpZ2h0ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBsaXN0ZW5PcmllbnRhdGlvbiA9IHRydWUsIGluY2x1ZGVTY3JvbGxiYXIgPSB0cnVlLCB0eXBlID0gXCJpbm5lclwiIH0gPSBvcHRpb25zO1xuXHRjb25zdCB3aWR0aCA9IHNoYWxsb3dSZWYoaW5pdGlhbFdpZHRoKTtcblx0Y29uc3QgaGVpZ2h0ID0gc2hhbGxvd1JlZihpbml0aWFsSGVpZ2h0KTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4ge1xuXHRcdGlmICh3aW5kb3ckMSkgaWYgKHR5cGUgPT09IFwib3V0ZXJcIikge1xuXHRcdFx0d2lkdGgudmFsdWUgPSB3aW5kb3ckMS5vdXRlcldpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gd2luZG93JDEub3V0ZXJIZWlnaHQ7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSBcInZpc3VhbFwiICYmIHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0KSB7XG5cdFx0XHRjb25zdCB7IHdpZHRoOiB2aXN1YWxWaWV3cG9ydFdpZHRoLCBoZWlnaHQ6IHZpc3VhbFZpZXdwb3J0SGVpZ2h0LCBzY2FsZSB9ID0gd2luZG93JDEudmlzdWFsVmlld3BvcnQ7XG5cdFx0XHR3aWR0aC52YWx1ZSA9IE1hdGgucm91bmQodmlzdWFsVmlld3BvcnRXaWR0aCAqIHNjYWxlKTtcblx0XHRcdGhlaWdodC52YWx1ZSA9IE1hdGgucm91bmQodmlzdWFsVmlld3BvcnRIZWlnaHQgKiBzY2FsZSk7XG5cdFx0fSBlbHNlIGlmIChpbmNsdWRlU2Nyb2xsYmFyKSB7XG5cdFx0XHR3aWR0aC52YWx1ZSA9IHdpbmRvdyQxLmlubmVyV2lkdGg7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSB3aW5kb3ckMS5pbm5lckhlaWdodDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2lkdGgudmFsdWUgPSB3aW5kb3ckMS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSB3aW5kb3ckMS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXHRcdH1cblx0fTtcblx0dXBkYXRlKCk7XG5cdHRyeU9uTW91bnRlZCh1cGRhdGUpO1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0dXNlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGlmICh3aW5kb3ckMSAmJiB0eXBlID09PSBcInZpc3VhbFwiICYmIHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0KSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0LCBcInJlc2l6ZVwiLCB1cGRhdGUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGlmIChsaXN0ZW5PcmllbnRhdGlvbikgd2F0Y2godXNlTWVkaWFRdWVyeShcIihvcmllbnRhdGlvbjogcG9ydHJhaXQpXCIpLCAoKSA9PiB1cGRhdGUoKSk7XG5cdHJldHVybiB7XG5cdFx0d2lkdGgsXG5cdFx0aGVpZ2h0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgRGVmYXVsdE1hZ2ljS2V5c0FsaWFzTWFwLCBTdG9yYWdlU2VyaWFsaXplcnMsIFRyYW5zaXRpb25QcmVzZXRzLCBhc3luY0NvbXB1dGVkLCBicmVha3BvaW50c0FudERlc2lnbiwgYnJlYWtwb2ludHNCb290c3RyYXBWNSwgYnJlYWtwb2ludHNFbGVtZW50LCBicmVha3BvaW50c01hc3RlckNzcywgYnJlYWtwb2ludHNQcmltZUZsZXgsIGJyZWFrcG9pbnRzUXVhc2FyLCBicmVha3BvaW50c1NlbWF0aWMsIGJyZWFrcG9pbnRzVGFpbHdpbmQsIGJyZWFrcG9pbnRzVnVldGlmeSwgYnJlYWtwb2ludHNWdWV0aWZ5VjIsIGJyZWFrcG9pbnRzVnVldGlmeVYzLCBjbG9uZUZuSlNPTiwgY29tcHV0ZWRBc3luYywgY29tcHV0ZWRJbmplY3QsIGNyZWF0ZUZldGNoLCBjcmVhdGVSZXVzYWJsZVRlbXBsYXRlLCBjcmVhdGVUZW1wbGF0ZVByb21pc2UsIGNyZWF0ZVVucmVmRm4sIGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUsIGRlZmF1bHREb2N1bWVudCwgZGVmYXVsdExvY2F0aW9uLCBkZWZhdWx0TmF2aWdhdG9yLCBkZWZhdWx0V2luZG93LCBleGVjdXRlVHJhbnNpdGlvbiwgZm9ybWF0VGltZUFnbywgZm9ybWF0VGltZUFnb0ludGwsIGZvcm1hdFRpbWVBZ29JbnRsUGFydHMsIGdldFNTUkhhbmRsZXIsIG1hcEdhbWVwYWRUb1hib3gzNjBDb250cm9sbGVyLCBvbkNsaWNrT3V0c2lkZSwgb25FbGVtZW50UmVtb3ZhbCwgb25LZXlEb3duLCBvbktleVByZXNzZWQsIG9uS2V5U3Ryb2tlLCBvbktleVVwLCBvbkxvbmdQcmVzcywgb25TdGFydFR5cGluZywgcHJvdmlkZVNTUldpZHRoLCBzZXRTU1JIYW5kbGVyLCB0ZW1wbGF0ZVJlZiwgdHJhbnNpdGlvbiwgdW5yZWZFbGVtZW50LCB1c2VBY3RpdmVFbGVtZW50LCB1c2VBbmltYXRlLCB1c2VBc3luY1F1ZXVlLCB1c2VBc3luY1N0YXRlLCB1c2VCYXNlNjQsIHVzZUJhdHRlcnksIHVzZUJsdWV0b290aCwgdXNlQnJlYWtwb2ludHMsIHVzZUJyb2FkY2FzdENoYW5uZWwsIHVzZUJyb3dzZXJMb2NhdGlvbiwgdXNlQ2FjaGVkLCB1c2VDbGlwYm9hcmQsIHVzZUNsaXBib2FyZEl0ZW1zLCB1c2VDbG9uZWQsIHVzZUNvbG9yTW9kZSwgdXNlQ29uZmlybURpYWxvZywgdXNlQ291bnRkb3duLCB1c2VDc3NTdXBwb3J0cywgdXNlQ3NzVmFyLCB1c2VDdXJyZW50RWxlbWVudCwgdXNlQ3ljbGVMaXN0LCB1c2VEYXJrLCB1c2VEZWJvdW5jZWRSZWZIaXN0b3J5LCB1c2VEZXZpY2VNb3Rpb24sIHVzZURldmljZU9yaWVudGF0aW9uLCB1c2VEZXZpY2VQaXhlbFJhdGlvLCB1c2VEZXZpY2VzTGlzdCwgdXNlRGlzcGxheU1lZGlhLCB1c2VEb2N1bWVudFZpc2liaWxpdHksIHVzZURyYWdnYWJsZSwgdXNlRHJvcFpvbmUsIHVzZUVsZW1lbnRCb3VuZGluZywgdXNlRWxlbWVudEJ5UG9pbnQsIHVzZUVsZW1lbnRIb3ZlciwgdXNlRWxlbWVudFNpemUsIHVzZUVsZW1lbnRWaXNpYmlsaXR5LCB1c2VFdmVudEJ1cywgdXNlRXZlbnRMaXN0ZW5lciwgdXNlRXZlbnRTb3VyY2UsIHVzZUV5ZURyb3BwZXIsIHVzZUZhdmljb24sIHVzZUZldGNoLCB1c2VGaWxlRGlhbG9nLCB1c2VGaWxlU3lzdGVtQWNjZXNzLCB1c2VGb2N1cywgdXNlRm9jdXNXaXRoaW4sIHVzZUZwcywgdXNlRnVsbHNjcmVlbiwgdXNlR2FtZXBhZCwgdXNlR2VvbG9jYXRpb24sIHVzZUlkbGUsIHVzZUltYWdlLCB1c2VJbmZpbml0ZVNjcm9sbCwgdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIsIHVzZUtleU1vZGlmaWVyLCB1c2VMb2NhbFN0b3JhZ2UsIHVzZU1hZ2ljS2V5cywgdXNlTWFudWFsUmVmSGlzdG9yeSwgdXNlTWVkaWFDb250cm9scywgdXNlTWVkaWFRdWVyeSwgdXNlTWVtb2l6ZSwgdXNlTWVtb3J5LCB1c2VNb3VudGVkLCB1c2VNb3VzZSwgdXNlTW91c2VJbkVsZW1lbnQsIHVzZU1vdXNlUHJlc3NlZCwgdXNlTXV0YXRpb25PYnNlcnZlciwgdXNlTmF2aWdhdG9yTGFuZ3VhZ2UsIHVzZU5ldHdvcmssIHVzZU5vdywgdXNlT2JqZWN0VXJsLCB1c2VPZmZzZXRQYWdpbmF0aW9uLCB1c2VPbmxpbmUsIHVzZVBhZ2VMZWF2ZSwgdXNlUGFyYWxsYXgsIHVzZVBhcmVudEVsZW1lbnQsIHVzZVBlcmZvcm1hbmNlT2JzZXJ2ZXIsIHVzZVBlcm1pc3Npb24sIHVzZVBvaW50ZXIsIHVzZVBvaW50ZXJMb2NrLCB1c2VQb2ludGVyU3dpcGUsIHVzZVByZWZlcnJlZENvbG9yU2NoZW1lLCB1c2VQcmVmZXJyZWRDb250cmFzdCwgdXNlUHJlZmVycmVkRGFyaywgdXNlUHJlZmVycmVkTGFuZ3VhZ2VzLCB1c2VQcmVmZXJyZWRSZWR1Y2VkTW90aW9uLCB1c2VQcmVmZXJyZWRSZWR1Y2VkVHJhbnNwYXJlbmN5LCB1c2VQcmV2aW91cywgdXNlUmFmRm4sIHVzZVJlZkhpc3RvcnksIHVzZVJlc2l6ZU9ic2VydmVyLCB1c2VTU1JXaWR0aCwgdXNlU2NyZWVuT3JpZW50YXRpb24sIHVzZVNjcmVlblNhZmVBcmVhLCB1c2VTY3JpcHRUYWcsIHVzZVNjcm9sbCwgdXNlU2Nyb2xsTG9jaywgdXNlU2Vzc2lvblN0b3JhZ2UsIHVzZVNoYXJlLCB1c2VTb3J0ZWQsIHVzZVNwZWVjaFJlY29nbml0aW9uLCB1c2VTcGVlY2hTeW50aGVzaXMsIHVzZVN0ZXBwZXIsIHVzZVN0b3JhZ2UsIHVzZVN0b3JhZ2VBc3luYywgdXNlU3R5bGVUYWcsIHVzZVN1cHBvcnRlZCwgdXNlU3dpcGUsIHVzZVRlbXBsYXRlUmVmc0xpc3QsIHVzZVRleHREaXJlY3Rpb24sIHVzZVRleHRTZWxlY3Rpb24sIHVzZVRleHRhcmVhQXV0b3NpemUsIHVzZVRocm90dGxlZFJlZkhpc3RvcnksIHVzZVRpbWVBZ28sIHVzZVRpbWVBZ29JbnRsLCB1c2VUaW1lb3V0UG9sbCwgdXNlVGltZXN0YW1wLCB1c2VUaXRsZSwgdXNlVHJhbnNpdGlvbiwgdXNlVXJsU2VhcmNoUGFyYW1zLCB1c2VVc2VyTWVkaWEsIHVzZVZNb2RlbCwgdXNlVk1vZGVscywgdXNlVmlicmF0ZSwgdXNlVmlydHVhbExpc3QsIHVzZVdha2VMb2NrLCB1c2VXZWJOb3RpZmljYXRpb24sIHVzZVdlYlNvY2tldCwgdXNlV2ViV29ya2VyLCB1c2VXZWJXb3JrZXJGbiwgdXNlV2luZG93Rm9jdXMsIHVzZVdpbmRvd1Njcm9sbCwgdXNlV2luZG93U2l6ZSB9OyIsImltcG9ydCB7IG5vdE51bGxpc2ggfSBmcm9tIFwiQHZ1ZXVzZS9zaGFyZWRcIjtcbmltcG9ydCB7IGNvbXB1dGVkLCBzaGFsbG93UmVmLCB0b1ZhbHVlLCB3YXRjaCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHRvQXJyYXksIHRyeU9uU2NvcGVEaXNwb3NlIGFzIHRyeU9uU2NvcGVEaXNwb3NlJDEsIHVucmVmRWxlbWVudCB9IGZyb20gXCJAdnVldXNlL2NvcmVcIjtcbmltcG9ydCB7IGNyZWF0ZUZvY3VzVHJhcCB9IGZyb20gXCJmb2N1cy10cmFwXCI7XG5cbi8vI3JlZ2lvbiB1c2VGb2N1c1RyYXAvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBmb2N1cy10cmFwXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZvY3VzVHJhcFxuKi9cbmZ1bmN0aW9uIHVzZUZvY3VzVHJhcCh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgdHJhcDtcblx0Y29uc3QgeyBpbW1lZGlhdGUsLi4uZm9jdXNUcmFwT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaGFzRm9jdXMgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaXNQYXVzZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgYWN0aXZhdGUgPSAob3B0cykgPT4gdHJhcCAmJiB0cmFwLmFjdGl2YXRlKG9wdHMpO1xuXHRjb25zdCBkZWFjdGl2YXRlID0gKG9wdHMpID0+IHRyYXAgJiYgdHJhcC5kZWFjdGl2YXRlKG9wdHMpO1xuXHRjb25zdCBwYXVzZSA9ICgpID0+IHtcblx0XHRpZiAodHJhcCkge1xuXHRcdFx0dHJhcC5wYXVzZSgpO1xuXHRcdFx0aXNQYXVzZWQudmFsdWUgPSB0cnVlO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgdW5wYXVzZSA9ICgpID0+IHtcblx0XHRpZiAodHJhcCkge1xuXHRcdFx0dHJhcC51bnBhdXNlKCk7XG5cdFx0XHRpc1BhdXNlZC52YWx1ZSA9IGZhbHNlO1xuXHRcdH1cblx0fTtcblx0d2F0Y2goY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiB0b0FycmF5KHRvVmFsdWUodGFyZ2V0KSkubWFwKChlbCkgPT4ge1xuXHRcdFx0Y29uc3QgX2VsID0gdG9WYWx1ZShlbCk7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIF9lbCA9PT0gXCJzdHJpbmdcIiA/IF9lbCA6IHVucmVmRWxlbWVudChfZWwpO1xuXHRcdH0pLmZpbHRlcihub3ROdWxsaXNoKTtcblx0fSksIChlbHMpID0+IHtcblx0XHRpZiAoIWVscy5sZW5ndGgpIHJldHVybjtcblx0XHRpZiAoIXRyYXApIHtcblx0XHRcdHRyYXAgPSBjcmVhdGVGb2N1c1RyYXAoZWxzLCB7XG5cdFx0XHRcdC4uLmZvY3VzVHJhcE9wdGlvbnMsXG5cdFx0XHRcdG9uQWN0aXZhdGUoKSB7XG5cdFx0XHRcdFx0aGFzRm9jdXMudmFsdWUgPSB0cnVlO1xuXHRcdFx0XHRcdGlmIChvcHRpb25zLm9uQWN0aXZhdGUpIG9wdGlvbnMub25BY3RpdmF0ZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvbkRlYWN0aXZhdGUoKSB7XG5cdFx0XHRcdFx0aGFzRm9jdXMudmFsdWUgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkRlYWN0aXZhdGUpIG9wdGlvbnMub25EZWFjdGl2YXRlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKGltbWVkaWF0ZSkgYWN0aXZhdGUoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaXNBY3RpdmUgPSB0cmFwID09PSBudWxsIHx8IHRyYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRyYXAuYWN0aXZlO1xuXHRcdFx0dHJhcCA9PT0gbnVsbCB8fCB0cmFwID09PSB2b2lkIDAgfHwgdHJhcC51cGRhdGVDb250YWluZXJFbGVtZW50cyhlbHMpO1xuXHRcdFx0aWYgKCFpc0FjdGl2ZSAmJiBpbW1lZGlhdGUpIGFjdGl2YXRlKCk7XG5cdFx0fVxuXHR9LCB7IGZsdXNoOiBcInBvc3RcIiB9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UkMSgoKSA9PiBkZWFjdGl2YXRlKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGhhc0ZvY3VzLFxuXHRcdGlzUGF1c2VkLFxuXHRcdGFjdGl2YXRlLFxuXHRcdGRlYWN0aXZhdGUsXG5cdFx0cGF1c2UsXG5cdFx0dW5wYXVzZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IHVzZUZvY3VzVHJhcCBhcyB0IH07IiwiaW1wb3J0IHsgdCBhcyB1c2VGb2N1c1RyYXAgfSBmcm9tIFwiLi4vdXNlRm9jdXNUcmFwLWxYWl9ZRy04LmpzXCI7XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGgsIHJlYWN0aXZlLCBzaGFsbG93UmVmIH0gZnJvbSBcInZ1ZVwiO1xuXG4vLyNyZWdpb24gdXNlRm9jdXNUcmFwL2NvbXBvbmVudC50c1xuY29uc3QgVXNlRm9jdXNUcmFwID0gLyogQF9fUFVSRV9fICovIGRlZmluZUNvbXBvbmVudCgocHJvcHMsIHsgc2xvdHMgfSkgPT4ge1xuXHRjb25zdCB0YXJnZXQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGRhdGEgPSByZWFjdGl2ZSh1c2VGb2N1c1RyYXAodGFyZ2V0LCBwcm9wcy5vcHRpb25zKSk7XG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKHNsb3RzLmRlZmF1bHQpIHJldHVybiBoKHByb3BzLmFzIHx8IFwiZGl2XCIsIHsgcmVmOiB0YXJnZXQgfSwgc2xvdHMuZGVmYXVsdChkYXRhKSk7XG5cdH07XG59LCB7XG5cdG5hbWU6IFwiVXNlRm9jdXNUcmFwXCIsXG5cdHByb3BzOiBbXCJhc1wiLCBcIm9wdGlvbnNcIl1cbn0pO1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IFVzZUZvY3VzVHJhcCB9OyIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kaWFsb2coXG4gIHJlZj1cImRpYWxvZ1wiXG4gIHJvbGU9XCJkaWFsb2dcIlxuICBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiXG4gIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgOnN0eWxlPVwieyAnLS13aWR0aCc6IHNldHRpbmdzLndpZHRoID8gYCR7c2V0dGluZ3Mud2lkdGh9cHhgIDogbnVsbCB9XCJcbiAgQG1vdXNldXA9XCJvbk1vdXNlVXBcIlxuKVxuICBVc2VGb2N1c1RyYXAuZGl0by1kaWFsb2dfX2ZvY3VzLXRyYXAoOm9wdGlvbnM9XCJmb2N1c1RyYXBPcHRpb25zXCIpXG4gICAgZm9ybS5kaXRvLXNjcm9sbC1wYXJlbnQoXG4gICAgICBAc3VibWl0LnByZXZlbnQ9XCJzdWJtaXRcIlxuICAgICAgQGtleWRvd24uZW50ZXI9XCJvbkVudGVyXCJcbiAgICApXG4gICAgICAvLyBBZGQgYW4gaW52aXNpYmxlIGJ1dHRvbiB0aGF0IHByZXZlbnRzIHRoZSBjbGVhcmFibGUgYnV0dG9ucyBmcm9tIGJlaW5nXG4gICAgICAvLyBwcmVzc2VkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgRW50ZXIga2V5OlxuICAgICAgYnV0dG9uKFxuICAgICAgICB2LXNob3c9XCJmYWxzZVwiXG4gICAgICApXG4gICAgICBEaXRvU2NoZW1hKFxuICAgICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgICAgOmRhdGE9XCJkaWFsb2dEYXRhXCJcbiAgICAgICAgcGFkZGluZz1cInJvb3RcIlxuICAgICAgICBzY3JvbGxhYmxlXG4gICAgICAgIGdlbmVyYXRlTGFiZWxzXG4gICAgICApXG4gICAgICAgIHRlbXBsYXRlKCNidXR0b25zKVxuICAgICAgICAgIERpdG9CdXR0b25zLmRpdG8tYnV0dG9ucy0tbGFyZ2UoXG4gICAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgICAgOmRhdGE9XCJkaWFsb2dEYXRhXCJcbiAgICAgICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEb21NaXhpbiBmcm9tICcuLi9taXhpbnMvRG9tTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRCdXR0b25TY2hlbWFzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgVXNlRm9jdXNUcmFwIH0gZnJvbSAnQHZ1ZXVzZS9pbnRlZ3JhdGlvbnMvdXNlRm9jdXNUcmFwL2NvbXBvbmVudCdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRGlhbG9nJywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgVXNlRm9jdXNUcmFwIH0sXG4gIGVtaXRzOiBbJ3JlbW92ZSddLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRkaWFsb2dDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICB9XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBjb21wb25lbnRzOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBidXR0b25zOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwcm9taXNlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIHNldHRpbmdzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe1xuICAgICAgICB3aWR0aDogNDgwLFxuICAgICAgICBjbGlja1RvQ2xvc2U6IGZhbHNlXG4gICAgICB9KVxuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIC8vIE1ha2Ugc3VyZSBkaWFsb2cgZGF0YSBjb250YWlucyBhbGwgdGhlIGV4cGVjdGVkIGtleXNcbiAgICBjb25zdCBkaWFsb2dEYXRhID0gY2xvbmUodGhpcy5kYXRhKVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY29tcG9uZW50cykge1xuICAgICAgaWYgKCEoa2V5IGluIGRpYWxvZ0RhdGEpKSB7XG4gICAgICAgIGRpYWxvZ0RhdGFba2V5XSA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpYWxvZ0RhdGFcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBkaWFsb2dDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBzY2hlbWEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZGlhbG9nJyxcbiAgICAgICAgY29tcG9uZW50czogdGhpcy5jb21wb25lbnRzXG4gICAgICB9XG4gICAgfSxcblxuICAgIGJ1dHRvblNjaGVtYXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhnZXRCdXR0b25TY2hlbWFzKHRoaXMuYnV0dG9ucykpLm1hcChcbiAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBidXR0b24gc2NoZW1hcyB0byBhZGQgZGVmYXVsdCBjbGljayBldmVudHNcbiAgICAgICAgICAvLyBmb3IgYm90aCAnc3VibWl0JyBhbmQgJ2NhbmNlbCcgYnV0dG9uczpcbiAgICAgICAgICAoW2tleSwgc2NoZW1hXSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2NhbmNlbCcgJiYgIXNjaGVtYS5ldmVudHMpIHtcbiAgICAgICAgICAgICAgc2NoZW1hID0ge1xuICAgICAgICAgICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLmNhbmNlbCgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW2tleSwgc2NoZW1hXVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBmb2N1c1RyYXBPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgICBmYWxsYmFja0ZvY3VzOiAoKSA9PiB0aGlzLiRyZWZzLmRpYWxvZyxcbiAgICAgICAgb25EZWFjdGl2YXRlOiB0aGlzLmNhbmNlbFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYXNCdXR0b25zKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuYnV0dG9uU2NoZW1hcykubGVuZ3RoID4gMFxuICAgIH0sXG5cbiAgICBoYXNDYW5jZWwoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmJ1dHRvblNjaGVtYXMuY2FuY2VsXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5kb21Pbih3aW5kb3csIHtcbiAgICAgIGtleXVwOiBldmVudCA9PiB7XG4gICAgICAgIGlmICgodGhpcy5oYXNDYW5jZWwgfHwgIXRoaXMuaGFzQnV0dG9ucykgJiYgZXZlbnQua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgICAgICB0aGlzLmNhbmNlbCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICByZW1vdmUoKSB7XG4gICAgICB0aGlzLiRlbWl0KCdyZW1vdmUnKVxuICAgIH0sXG5cbiAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICB0aGlzLnByb21pc2UucmVzb2x2ZSh2YWx1ZSlcbiAgICAgIHRoaXMucmVtb3ZlKClcbiAgICB9LFxuXG4gICAgcmVqZWN0KHZhbHVlKSB7XG4gICAgICB0aGlzLnByb21pc2UucmVqZWN0KHZhbHVlKVxuICAgICAgdGhpcy5yZW1vdmUoKVxuICAgIH0sXG5cbiAgICBvbkVudGVyKGV2ZW50KSB7XG4gICAgICAvLyBIYW5kbGUgRW50ZXIga2V5IG9uIGlucHV0IGZpZWxkcyB0byBzdWJtaXQgdGhlIGZvcm0uIFRoaXMgYWxzbyBoYW5kbGVzXG4gICAgICAvLyBwYXNzd29yZCBtYW5hZ2VycyAoZS5nLiAxUGFzc3dvcmQpIHRoYXQgc2ltdWxhdGUgYW4gdW50cnVzdGVkIEVudGVyXG4gICAgICAvLyBrZXlwcmVzcyB0byBzdWJtaXQsIHdoaWNoIGJyb3dzZXJzIGlnbm9yZS5cbiAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc3VibWl0KClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3VibWl0KCkge1xuICAgICAgdGhpcy5yZXNvbHZlKHRoaXMuZGlhbG9nRGF0YSlcbiAgICB9LFxuXG4gICAgY2FuY2VsKCkge1xuICAgICAgLy8gV2hlbiBjYW5jZWxsaW5nLCByZXNvbHZlIGFzIGB1bmRlZmluZWRgIHNvIHdlIGNhbiBoYXZlIGRpYWxvZ3NcbiAgICAgIC8vIHJldHVybmluZyBudWxsIGFzIGEgZGVmaW5lZCB2YWx1ZSBhcyB3ZWxsLlxuICAgICAgdGhpcy5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICB9LFxuXG4gICAgY2xvc2UoKSB7XG4gICAgICB0aGlzLmNhbmNlbCgpXG4gICAgfSxcblxuICAgIG9uTW91c2VVcCgpIHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLmNsaWNrVG9DbG9zZSkge1xuICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1kaWFsb2cge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGluc2V0OiAwO1xuICB6LWluZGV4OiAkei1pbmRleC1kaWFsb2c7XG4gIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmc7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAvLyBQcmV2ZW50IHNjcm9sbGluZyBvZiB0aGUgcGFnZSBiZWhpbmQgdGhlIGRpYWxvZzpcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZDogcmdiKDAsIDAsIDAsIDAuMik7XG5cbiAgJl9fZm9jdXMtdHJhcCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICB9XG5cbiAgLy8gUGxhY2UgY2FuY2VsIGJ1dHRvbiB2aXN1YWxseSBmaXJzdCBldmVuIHRob3VnaCBzdWJtaXQgY29tZXMgZmlyc3QgaW4gRE9NLFxuICAvLyBzbyB0aGF0IHBhc3N3b3JkIG1hbmFnZXJzIChlLmcuIDFQYXNzd29yZCkgZmluZCB0aGUgc3VibWl0IGJ1dHRvbiBmaXJzdC5cbiAgLmRpdG8tY29udGFpbmVyOmhhcyguZGl0by1idXR0b24tLWNhbmNlbCkge1xuICAgIG9yZGVyOiAtMTtcbiAgfVxuXG4gIC8vIFRPRE86IGAmX19pbm5lcmBcbiAgZm9ybSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBtYXgtd2lkdGg6IHZhcigtLXdpZHRoLCA0ODBweCk7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbiAgICBib3gtc2hhZG93OiAwIDIwcHggNjBweCAtMnB4IHJnYigyNywgMzMsIDU4LCAwLjQpO1xuICB9XG59XG5cbi5kaXRvLWRpYWxvZy1lbnRlci1hY3RpdmUsXG4uZGl0by1kaWFsb2ctbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cztcblxuICBmb3JtIHtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7XG4gIH1cbn1cblxuLmRpdG8tZGlhbG9nLWVudGVyLWZyb20sXG4uZGl0by1kaWFsb2ctbGVhdmUtdG8ge1xuICBvcGFjaXR5OiAwO1xuXG4gIGZvcm0ge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjBweCk7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcm9vdChcbiAgOmRhdGEtYWdlbnQtYnJvd3Nlcj1cImFwcFN0YXRlLmFnZW50LmJyb3dzZXJcIlxuICA6ZGF0YS1hZ2VudC1wbGF0Zm9ybT1cImFwcFN0YXRlLmFnZW50LnBsYXRmb3JtXCJcbiAgOmRhdGEtYWdlbnQtdmVyc2lvbj1cImFwcFN0YXRlLmFnZW50LnZlcnNpb25OdW1iZXJcIlxuKVxuICBUcmFuc2l0aW9uKG5hbWU9XCJkaXRvLWRyYWdcIilcbiAgICAuZGl0by1kcmFnLW92ZXJsYXkoXG4gICAgICB2LWlmPVwiaXNEcmFnZ2luZ0ZpbGVzXCJcbiAgICApXG4gIFRyYW5zaXRpb25Hcm91cChuYW1lPVwiZGl0by1kaWFsb2dcIilcbiAgICBEaXRvRGlhbG9nKFxuICAgICAgdi1mb3I9XCIoZGlhbG9nLCBrZXkpIGluIGRpYWxvZ3NcIlxuICAgICAgOmtleT1cImtleVwiXG4gICAgICA6Y29tcG9uZW50cz1cImRpYWxvZy5jb21wb25lbnRzXCJcbiAgICAgIDpidXR0b25zPVwiZGlhbG9nLmJ1dHRvbnNcIlxuICAgICAgOnByb21pc2U9XCJkaWFsb2cucHJvbWlzZVwiXG4gICAgICA6ZGF0YT1cImRpYWxvZy5kYXRhXCJcbiAgICAgIDpzZXR0aW5ncz1cImRpYWxvZy5zZXR0aW5nc1wiXG4gICAgICBAcmVtb3ZlPVwicmVtb3ZlRGlhbG9nKGtleSlcIlxuICAgIClcbiAgRGl0b05hdmlnYXRpb25cbiAgbWFpbi5kaXRvLXBhZ2UuZGl0by1zY3JvbGwtcGFyZW50KFxuICAgIHYtcmVzaXplPVwib25SZXNpemVQYWdlXCJcbiAgICA6Y2xhc3M9XCJwYWdlQ2xhc3Nlc1wiXG4gIClcbiAgICBEaXRvSGVhZGVyKFxuICAgICAgOnNwaW5uZXI9XCJvcHRpb25zLnNwaW5uZXJcIlxuICAgICAgOmlzTG9hZGluZz1cImlzTG9hZGluZ1wiXG4gICAgKVxuICAgIFJvdXRlclZpZXdcbiAgRGl0b1NpZGViYXJcbiAgICBEaXRvQWNjb3VudChcbiAgICAgIHYtaWY9XCJ1c2VyXCJcbiAgICApXG4gICAgYS5kaXRvLWxvZ2luKFxuICAgICAgdi1lbHNlLWlmPVwiYWxsb3dMb2dpblwiXG4gICAgICBAY2xpY2s9XCJyb290Q29tcG9uZW50LmxvZ2luKClcIlxuICAgIClcbiAgICAgIHNwYW4gTG9naW5cbiAgRGl0b05vdGlmaWNhdGlvbnMocmVmPVwibm90aWZpY2F0aW9uc1wiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGRlbGVnYXRlIGFzIHRpcHB5RGVsZWdhdGUgfSBmcm9tICd0aXBweS5qcydcbmltcG9ydCB7IG1hcENvbmN1cnJlbnRseSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcbmltcG9ydCBEaXRvVXNlciBmcm9tICcuLi9EaXRvVXNlci5qcydcbmltcG9ydCBEaXRvVmlldyBmcm9tICcuLi9jb21wb25lbnRzL0RpdG9WaWV3LnZ1ZSdcbmltcG9ydCBEaXRvRGlhbG9nIGZyb20gJy4vRGl0b0RpYWxvZy52dWUnXG5pbXBvcnQge1xuICBwcm9jZXNzVmlldyxcbiAgcmVzb2x2ZVZpZXdzLFxuICBwcm9jZXNzU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1Jvb3QnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcbiAgY29tcG9uZW50czogeyBEaXRvRGlhbG9nIH0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHZpZXdzOiAoKSA9PiB0aGlzLnJlc29sdmVkVmlld3NcbiAgICB9XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICB1bnJlc29sdmVkVmlld3M6IHsgdHlwZTogW09iamVjdCwgRnVuY3Rpb24sIFByb21pc2VdLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG9wdGlvbnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZXNvbHZlZFZpZXdzOiB7fSxcbiAgICAgIHJlbW92ZVJvdXRlczogbnVsbCxcbiAgICAgIGRpYWxvZ3M6IHt9LFxuICAgICAgcGFnZVdpZHRoOiAwLFxuICAgICAgbG9hZGluZ0NvdW50OiAwLFxuICAgICAgYWxsb3dMb2dpbjogZmFsc2UsXG4gICAgICBpc0RyYWdnaW5nRmlsZXM6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbm90aWZpY2F0aW9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzTW91bnRlZCAmJiB0aGlzLiRyZWZzLm5vdGlmaWNhdGlvbnNcbiAgICB9LFxuXG4gICAgaXNMb2FkaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZGluZ0NvdW50ID4gMFxuICAgIH0sXG5cbiAgICBwYWdlQ2xhc3NlcygpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9ICdkaXRvLXBhZ2UnXG4gICAgICAvLyBOT1RFOiBLZWVwIHN5bmNlZCB3aXRoICRjb250ZW50LXdpZHRoIGluIFNDU1M6XG4gICAgICBjb25zdCBjb250ZW50V2lkdGggPSA5MDBcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHRoaXMuYXBwU3RhdGUucGFnZUNsYXNzLFxuICAgICAgICB7XG4gICAgICAgICAgW2Ake3ByZWZpeH0tLXdpZHRoLTgwYF06IHRoaXMucGFnZVdpZHRoIDw9IGNvbnRlbnRXaWR0aCAqIDAuOCxcbiAgICAgICAgICBbYCR7cHJlZml4fS0td2lkdGgtNjBgXTogdGhpcy5wYWdlV2lkdGggPD0gY29udGVudFdpZHRoICogMC42XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLmFwcFN0YXRlLnRpdGxlID0gZG9jdW1lbnQudGl0bGUgfHwgJ0RpdG8uanMgQWRtaW4nXG4gICAgLy8gV2l0aCBob3QtcmVsb2FkaW5nLCBpdCBsb29rcyBsaWtlIGRlc3Ryb3llZCBob29rcyBhcmVuJ3QgYWx3YXlzIGNhbGxlZFxuICAgIC8vIGZvciByb3V0ZSBjb21wb25lbnRzIHNvIHJlc2V0IHRoZSBhcnJheSBvZiByZWdpc3RlcmVkIGNvbXBvbmVudHMgaW5zdGVhZC5cbiAgICB0aGlzLmFwcFN0YXRlLnJvdXRlQ29tcG9uZW50cyA9IFtdXG4gIH0sXG5cbiAgYXN5bmMgbW91bnRlZCgpIHtcbiAgICB0aGlzLnNldHVwRHJhZ0FuZERyb3AoKVxuXG4gICAgdGlwcHlEZWxlZ2F0ZSh0aGlzLiRlbCwge1xuICAgICAgdGFyZ2V0OiAnLmRpdG8taW5mbycsXG4gICAgICB0aGVtZTogJ2luZm8nLFxuICAgICAgYW5pbWF0aW9uOiAnc2hpZnQtYXdheS1zdWJ0bGUnLFxuICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICBkZWxheTogMjUwLFxuICAgICAgekluZGV4OiAxLFxuICAgICAgYXBwZW5kVG86IG5vZGUgPT4gbm9kZS5jbG9zZXN0KCcuZGl0by1wYW5lJyksXG4gICAgICBvblNob3c6IGluc3RhbmNlID0+IGluc3RhbmNlLnNldENvbnRlbnQoaW5zdGFuY2UucmVmZXJlbmNlLmRhdGFzZXQuaW5mbylcbiAgICB9KVxuXG4gICAgLy8gQ2xlYXIgdGhlIGxhYmVsIG1hcmtlZCBhcyBhY3RpdmUgb24gYWxsIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudHMsIGV4Y2VwdFxuICAgIC8vIHRoZSBvbmVzIHRoYXQgRGl0b0xhYmVsIGl0c2VsZiBpbnRlcmNlcHRzLlxuICAgIHRoaXMuZG9tT24oZG9jdW1lbnQsIHtcbiAgICAgIGNsaWNrOiBldmVudCA9PiB7XG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5kaXRvLWxhYmVsJykpIHtcbiAgICAgICAgICB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBrZXl1cDogZXZlbnQgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmFsbG93TG9naW4gPSBmYWxzZVxuICAgICAgaWYgKGF3YWl0IHRoaXMuZmV0Y2hVc2VyKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlVmlld3MoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dpbigpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICB9XG4gICAgdGhpcy5hbGxvd0xvZ2luID0gdHJ1ZVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBzZXR1cERyYWdBbmREcm9wKCkge1xuICAgICAgLy8gVGhpcyBjb2RlIG9ubHkgaGFwcGVucyB0aGUgdmlzdWFsIGVmZmVjdHMgYXJvdW5kIGRyYWdnaW5nIGFuZCBkcm9wcGluZ1xuICAgICAgLy8gZmlsZXMgaW50byBhIGBEaXRvVHlwZVVwbG9hZGAgY29tcG9uZW50LiBUaGUgYWN0dWFsIHVwbG9hZGluZyBpc1xuICAgICAgLy8gaGFuZGxlZCBieSB0aGUgYERpdG9UeXBlVXBsb2FkYCBjb21wb25lbnQgaXRzZWxmLlxuXG4gICAgICBsZXQgZHJhZ0NvdW50ID0gMFxuICAgICAgbGV0IHVwbG9hZHMgPSBbXVxuXG4gICAgICBjb25zdCB0b2dnbGVEcm9wVGFyZ2V0Q2xhc3MgPSBlbmFibGVkID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB1cGxvYWQgb2YgdXBsb2Fkcykge1xuICAgICAgICAgIHVwbG9hZFxuICAgICAgICAgICAgLmNsb3Nlc3QoJy5kaXRvLWNvbnRhaW5lcicpXG4gICAgICAgICAgICAuY2xhc3NMaXN0LnRvZ2dsZSgnZGl0by1kcm9wLXRhcmdldCcsIGVuYWJsZWQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICAgICAgdXBsb2FkcyA9IFtdXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2V0RHJhZ2dpbmdGaWxlcyA9IGVuYWJsZWQgPT4ge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmdGaWxlcyA9IGVuYWJsZWRcbiAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICB0b2dnbGVEcm9wVGFyZ2V0Q2xhc3ModHJ1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRvZ2dsZURyb3BUYXJnZXRDbGFzcyhmYWxzZSksIDE1MClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICAgIGRyYWdlbnRlcjogZXZlbnQgPT4ge1xuICAgICAgICAgIGlmICghZHJhZ0NvdW50ICYmIGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgICAgICAgdXBsb2FkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXRvLXVwbG9hZCcpXG4gICAgICAgICAgICBjb25zdCBoYXNVcGxvYWRzID0gdXBsb2Fkcy5sZW5ndGggPiAwXG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IGhhc1VwbG9hZHMgPyAnY29weScgOiAnbm9uZSdcbiAgICAgICAgICAgIGlmIChoYXNVcGxvYWRzKSB7XG4gICAgICAgICAgICAgIHNldERyYWdnaW5nRmlsZXModHJ1ZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGRyYWdDb3VudCsrXG4gICAgICAgIH0sXG5cbiAgICAgICAgZHJhZ2xlYXZlOiBldmVudCA9PiB7XG4gICAgICAgICAgZHJhZ0NvdW50LS1cbiAgICAgICAgICBpZiAoIWRyYWdDb3VudCAmJiBldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgICAgIHNldERyYWdnaW5nRmlsZXMoZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGRyYWdvdmVyOiBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgICAgICAgY29uc3QgY2FuRHJvcCA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KFxuICAgICAgICAgICAgICAnLmRpdG8tY29udGFpbmVyOmhhcyguZGl0by11cGxvYWQpJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBjYW5Ecm9wID8gJ2NvcHknIDogJ25vbmUnXG4gICAgICAgICAgICBpZiAoIWNhbkRyb3ApIHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBkcm9wOiBldmVudCA9PiB7XG4gICAgICAgICAgZHJhZ0NvdW50ID0gMFxuICAgICAgICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgICAgIHNldERyYWdnaW5nRmlsZXMoZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBub3RpZnkoeyB0eXBlID0gJ2luZm8nLCB0aXRsZSwgdGV4dCwgZXJyb3IsIGR1cmF0aW9uIH0gPSB7fSkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLm5vdGlmeSh7IHR5cGUsIHRpdGxlLCB0ZXh0LCBlcnJvciwgZHVyYXRpb24gfSlcbiAgICB9LFxuXG4gICAgY2xvc2VOb3RpZmljYXRpb25zKCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLmRlc3Ryb3lBbGwoKVxuICAgIH0sXG5cbiAgICByZWdpc3RlckxvYWRpbmcoaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmxvYWRpbmdDb3VudCArPSBpc0xvYWRpbmcgPyAxIDogLTFcbiAgICB9LFxuXG4gICAgc2hvd0RpYWxvZyh7IGNvbXBvbmVudHMsIGJ1dHRvbnMsIGRhdGEsIHNldHRpbmdzIH0pIHtcbiAgICAgIC8vIFNob3dzIGEgZGl0by1kaWFsb2cgY29tcG9uZW50IGFuZCB3cmFwcyBpdCBpbiBhIHByb21pc2Ugc28gdGhhdCB0aGVcbiAgICAgIC8vIGJ1dHRvbnMgaW4gdGhlIGRpYWxvZyBjYW4gdXNlIGBkaWFsb2cucmVzb2x2ZSgpYCBhbmQgYGRpYWxvZy5yZWplY3QoKWBcbiAgICAgIC8vIHRvIGNsb3NlIHRoZSBtb2RhbCBkaWFsb2cgYW5kIHJlc29sdmUgLyByZWplY3QgdGhlIHByb21pc2UgYXQgb25jZS5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShcbiAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIC8vIFByb2Nlc3MgY29tcG9uZW50cyB0byByZXNvbHZlIGFzeW5jIHNjaGVtYXMuXG4gICAgICAgICAgY29uc3Qgcm91dGVzID0gW11cbiAgICAgICAgICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhcbiAgICAgICAgICAgIHRoaXMuYXBpLFxuICAgICAgICAgICAgeyB0eXBlOiAnZGlhbG9nJywgY29tcG9uZW50cyB9LFxuICAgICAgICAgICAgcm91dGVzLFxuICAgICAgICAgICAgMFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAocm91dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0RpYWxvZ3MgZG8gbm90IHN1cHBvcnQgY29tcG9uZW50cyB0aGF0IHByb2R1Y2Ugcm91dGVzJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBrZXkgPSBgZGlhbG9nLSR7KytkaWFsb2dJZH1gXG4gICAgICAgICAgdGhpcy5kaWFsb2dzW2tleV0gPSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLFxuICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgIHByb21pc2U6IHsgcmVzb2x2ZSwgcmVqZWN0IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9LFxuXG4gICAgcmVtb3ZlRGlhbG9nKGtleSkge1xuICAgICAgZGVsZXRlIHRoaXMuZGlhbG9nc1trZXldXG4gICAgfSxcblxuICAgIGFzeW5jIGxvZ2luKCkge1xuICAgICAgdGhpcy5hbGxvd0xvZ2luID0gdHJ1ZVxuICAgICAgY29uc3Qge1xuICAgICAgICBhZGRpdGlvbmFsQ29tcG9uZW50cyxcbiAgICAgICAgcmVkaXJlY3RBZnRlckxvZ2luXG4gICAgICB9ID0gdGhpcy5vcHRpb25zLmxvZ2luIHx8IHt9XG4gICAgICBjb25zdCBsb2dpbkRhdGEgPSBhd2FpdCB0aGlzLnNob3dEaWFsb2coe1xuICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgdXNlcm5hbWU6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGF1dG9mb2N1czogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFzc3dvcmQ6IHtcbiAgICAgICAgICAgIHR5cGU6ICdwYXNzd29yZCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmFkZGl0aW9uYWxDb21wb25lbnRzXG4gICAgICAgIH0sXG4gICAgICAgIC8vIE5PVEU6IExvZ2luIG11c3QgY29tZSBiZWZvcmUgY2FuY2VsIGluIERPTSBvcmRlciBzbyB0aGF0IHBhc3N3b3JkXG4gICAgICAgIC8vIG1hbmFnZXJzIChlLmcuIDFQYXNzd29yZCkgdGFyZ2V0IHRoZSBzdWJtaXQgYnV0dG9uIGluc3RlYWQgb2YgY2FuY2VsLlxuICAgICAgICAvLyBEaXRvRGlhbG9nIHVzZXMgQ1NTIG9yZGVyIHRvIHZpc3VhbGx5IHBsYWNlIGNhbmNlbCBmaXJzdC5cbiAgICAgICAgYnV0dG9uczoge1xuICAgICAgICAgIGxvZ2luOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgICAgIHRleHQ6ICdMb2dpbidcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgY2FuY2VsOiB7XG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnXG4gICAgICAgICAgICAvLyBOT1RFOiBUaGUgY2xpY2sgZXZlbnQgaXMgYWRkZWQgaW4gRGl0b0RpYWxvZy5idXR0b25TY2hlbWFzKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAobG9naW5EYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICAgIHJlc291cmNlOiB0aGlzLmFwaS51c2Vycy5sb2dpbixcbiAgICAgICAgICAgIGRhdGE6IGxvZ2luRGF0YSxcbiAgICAgICAgICAgIGludGVybmFsOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAocmVkaXJlY3RBZnRlckxvZ2luKSB7XG4gICAgICAgICAgICBsb2NhdGlvbi5yZXBsYWNlKHJlZGlyZWN0QWZ0ZXJMb2dpbilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRVc2VyKHJlc3BvbnNlLmRhdGEudXNlcilcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzb2x2ZVZpZXdzKClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyLnJlc3BvbnNlPy5kYXRhPy5lcnJvciB8fCBlcnJcbiAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICB0aXRsZTogJ0F1dGhlbnRpY2F0aW9uIEVycm9yJyxcbiAgICAgICAgICAgIHRleHQ6IGVycm9yXG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLmxvZ2luKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBuYXZpZ2F0ZUhvbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZSgnLycpXG4gICAgfSxcblxuICAgIGFzeW5jIGxvZ291dCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCh7XG4gICAgICAgICAgcmVzb3VyY2U6IHRoaXMuYXBpLnVzZXJzLmxvZ291dCxcbiAgICAgICAgICBpbnRlcm5hbDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5zZXRVc2VyKG51bGwpXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZUhvbWUoKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGZldGNoVXNlcigpIHtcbiAgICAgIGxldCB1c2VyID0gbnVsbFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICByZXNvdXJjZTogdGhpcy5hcGkudXNlcnMuc2Vzc2lvbixcbiAgICAgICAgICBpbnRlcm5hbDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICB1c2VyID0gcmVzcG9uc2UuZGF0YS51c2VyIHx8IG51bGxcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBlcnJvciA9IGVyci5yZXNwb25zZT8uZGF0YT8uZXJyb3IgfHwgZXJyXG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIHRpdGxlOiAnQXV0aGVudGljYXRpb24gRXJyb3InLFxuICAgICAgICAgIHRleHQ6IGVycm9yXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aGlzLnNldFVzZXIodXNlcilcbiAgICAgIHJldHVybiB1c2VyXG4gICAgfSxcblxuICAgIHNldFVzZXIodXNlcikge1xuICAgICAgdGhpcy5hcHBTdGF0ZS51c2VyID0gKFxuICAgICAgICB1c2VyICYmXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih1c2VyLCBEaXRvVXNlci5wcm90b3R5cGUpXG4gICAgICApXG4gICAgICAvLyBDbGVhciByZXNvbHZlZCB2aWV3cyB3aGVuIHVzZXIgaXMgbG9nZ2VkIG91dC5cbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICB0aGlzLnJlc29sdmVkVmlld3MgPSB7fVxuICAgICAgICB0aGlzLm5hdmlnYXRlSG9tZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGVuc3VyZVVzZXIoKSB7XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmZldGNoVXNlcigpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcmVzb2x2ZVZpZXdzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFZpZXdzID0gYXdhaXQgcmVzb2x2ZVZpZXdzKHRoaXMudW5yZXNvbHZlZFZpZXdzKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFlcnJvci5yZXF1ZXN0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2dpbigpXG4gICAgICB9XG4gICAgICAvLyBDb2xsZWN0IGFsbCByb3V0ZXMgZnJvbSB0aGUgcm9vdCBzY2hlbWEgY29tcG9uZW50c1xuICAgICAgY29uc3Qgcm91dGVzID0gYXdhaXQgbWFwQ29uY3VycmVudGx5KFxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnJlc29sdmVkVmlld3MpLFxuICAgICAgICAoW25hbWUsIHNjaGVtYV0pID0+IHByb2Nlc3NWaWV3KERpdG9WaWV3LCB0aGlzLmFwaSwgc2NoZW1hLCBuYW1lKVxuICAgICAgKVxuICAgICAgLy8gTm93IHRoYXQgdGhlIHJvdXRlcyBhcmUgbG9hZGVkLCByZXBsYWNlIGFsbCBleGlzdGluZyByb3V0ZXMgd2l0aCB0aGVcbiAgICAgIC8vIG5ldyByb3V0ZXMsIGFuZCByZXN0b3JlIHRoZSBjdXJyZW50IHBhdGguXG4gICAgICBjb25zdCB7IGZ1bGxQYXRoIH0gPSB0aGlzLiRyb3V0ZVxuICAgICAgdGhpcy5yZW1vdmVSb3V0ZXM/LigpXG4gICAgICB0aGlzLnJlbW92ZVJvdXRlcyA9IGFkZFJvdXRlcyh0aGlzLiRyb3V0ZXIsIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyb290JyxcbiAgICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgICAgY29tcG9uZW50czoge31cbiAgICAgICAgfSxcbiAgICAgICAgLi4ucm91dGVzLmZsYXQoKVxuICAgICAgXSlcbiAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKGZ1bGxQYXRoKVxuICAgIH0sXG5cbiAgICBvblJlc2l6ZVBhZ2UoeyBjb250ZW50UmVjdDogeyB3aWR0aCB9IH0pIHtcbiAgICAgIHRoaXMucGFnZVdpZHRoID0gd2lkdGhcbiAgICB9XG4gIH1cbn0pXG5cbmxldCBkaWFsb2dJZCA9IDBcblxuZnVuY3Rpb24gYWRkUm91dGVzKHJvdXRlciwgcm91dGVzKSB7XG4gIGNvbnN0IHJlbW92ZXJzID0gW11cbiAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICByZW1vdmVycy5wdXNoKFxuICAgICAgcm91dGVyLmFkZFJvdXRlKHJvdXRlKVxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZm9yIChjb25zdCByZW1vdmUgb2YgcmVtb3ZlcnMpIHtcbiAgICAgIHJlbW92ZSgpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvc3R5bGUnO1xuXG4uZGl0by1hcHAsXG4uZGl0by1yb290IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLmRpdG8tcGFnZSB7XG4gIC0tbWF4LWNvbnRlbnQtd2lkdGg6ICN7JGNvbnRlbnQtd2lkdGh9O1xuICAtLW1heC1wYWdlLXdpZHRoOiBjYWxjKHZhcigtLW1heC1jb250ZW50LXdpZHRoKSArIDIgKiAjeyRjb250ZW50LXBhZGRpbmd9KTtcblxuICBmbGV4OiAwIDEgdmFyKC0tbWF4LXBhZ2Utd2lkdGgpO1xuICBiYWNrZ3JvdW5kOiAkY29udGVudC1jb2xvci1iYWNrZ3JvdW5kO1xuICBtaW4td2lkdGg6IDAlO1xuICBtYXgtd2lkdGg6IHZhcigtLW1heC1wYWdlLXdpZHRoKTtcbiAgb3ZlcmZsb3c6IHZpc2libGU7IC8vIEZvciAuZGl0by1oZWFkZXIgZnVsbC13aWR0aCBiYWNrZ3JvdW5kLlxuXG4gICYtLXdpZGUge1xuICAgIC0tbWF4LWNvbnRlbnQtd2lkdGg6ICN7JGNvbnRlbnQtd2lkdGgtd2lkZX07XG4gIH1cbn1cblxuLmRpdG8tYWNjb3VudCxcbi5kaXRvLWxvZ2luIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZGl0by1kcmFnLW92ZXJsYXkge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgei1pbmRleDogJHotaW5kZXgtZHJhZy1vdmVybGF5O1xuICBiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCwgMC4yNSk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTtcbn1cblxuLmRpdG8tZHJvcC10YXJnZXQge1xuICAtLXNoYWRvdy1hbHBoYTogMC4yNTtcblxuICBiYWNrZ3JvdW5kOiAkY29udGVudC1jb2xvci1iYWNrZ3JvdW5kO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgei1pbmRleDogJHotaW5kZXgtZHJhZy1vdmVybGF5ICsgMTtcbiAgZmlsdGVyOiBkcm9wLXNoYWRvdygwIDRweCA4cHggcmdiKDAsIDAsIDAsIHZhcigtLXNoYWRvdy1hbHBoYSkpKTtcbn1cblxuLmRpdG8tZHJhZy1lbnRlci1hY3RpdmUsXG4uZGl0by1kcmFnLWxlYXZlLWFjdGl2ZSB7XG4gICRkdXJhdGlvbjogMC4xNXM7XG5cbiAgdHJhbnNpdGlvbjpcbiAgICBvcGFjaXR5ICRkdXJhdGlvbixcbiAgICBiYWNrZHJvcC1maWx0ZXIgJGR1cmF0aW9uO1xuXG4gIH4gKiAuZGl0by1kcm9wLXRhcmdldCB7XG4gICAgdHJhbnNpdGlvbjogZmlsdGVyICRkdXJhdGlvbjtcbiAgfVxufVxuXG4uZGl0by1kcmFnLWVudGVyLWZyb20sXG4uZGl0by1kcmFnLWxlYXZlLXRvIHtcbiAgb3BhY2l0eTogMDtcbiAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDApO1xuXG4gIH4gKiAuZGl0by1kcm9wLXRhcmdldCB7XG4gICAgLS1zaGFkb3ctYWxwaGE6IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudWwuZGl0by1tZW51KFxuICB2LXJlc2l6ZT1cIm9uUmVzaXplXCJcbiAgOnN0eWxlPVwieyAnLS13aWR0aCc6IHdpZHRoID8gYCR7d2lkdGh9cHhgIDogbnVsbCB9XCJcbilcbiAgbGkuZGl0by1tZW51X19pdGVtKFxuICAgIHYtZm9yPVwiaXRlbSBpbiBpdGVtc1wiXG4gIClcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtaWY9XCJzaG91bGRTaG93SXRlbShpdGVtKVwiXG4gICAgKVxuICAgICAgYS5kaXRvLW1lbnVfX2xpbmsoXG4gICAgICAgIDpocmVmPVwiZ2V0SXRlbUhyZWYoaXRlbSlcIlxuICAgICAgICA6Y2xhc3M9XCJ7ICdkaXRvLW1lbnVfX2xpbmstLWFjdGl2ZSc6IGlzQWN0aXZlSXRlbShpdGVtKSB9XCJcbiAgICAgICAgQGNsaWNrLnByZXZlbnQuc3RvcD1cIm9uQ2xpY2tJdGVtKGl0ZW0pXCJcbiAgICAgICkge3sgZ2V0TGFiZWwoaXRlbSkgfX1cbiAgICAgIERpdG9NZW51LmRpdG8tbWVudV9fc3ViKFxuICAgICAgICB2LWlmPVwiaXRlbS5pdGVtc1wiXG4gICAgICAgIDppdGVtcz1cIml0ZW0uaXRlbXNcIlxuICAgICAgICA6cGF0aD1cImdldEl0ZW1QYXRoKGl0ZW0sIGZhbHNlKVwiXG4gICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvTWVudScsIHtcbiAgcHJvcHM6IHtcbiAgICBpdGVtczoge1xuICAgICAgdHlwZTogW09iamVjdCwgQXJyYXldLFxuICAgICAgZGVmYXVsdDogKCkgPT4gW11cbiAgICB9LFxuICAgIHBhdGg6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiAwXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBzaG91bGRTaG93SXRlbShpdGVtKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnNob3VsZFJlbmRlclNjaGVtYShpdGVtKSAmJiAoXG4gICAgICAgICAgIWl0ZW0uaXRlbXMgfHxcbiAgICAgICAgICBPYmplY3QudmFsdWVzKGl0ZW0uaXRlbXMpLnNvbWUodGhpcy5zaG91bGRSZW5kZXJTY2hlbWEpXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgb25SZXNpemUoeyBjb250ZW50UmVjdDogeyB3aWR0aCB9IH0pIHtcbiAgICAgIGlmICh3aWR0aCkge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGhcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0SXRlbVBhdGgoaXRlbSwgZmlyc3RDaGlsZCkge1xuICAgICAgY29uc3QgcGF0aCA9IGl0ZW0ucGF0aCA/IGAke3RoaXMucGF0aH0vJHtpdGVtLnBhdGh9YCA6IG51bGxcbiAgICAgIHJldHVybiBmaXJzdENoaWxkICYmIHBhdGggJiYgaXRlbS5pdGVtc1xuICAgICAgICA/IGAke3BhdGh9JHt0aGlzLmdldEl0ZW1QYXRoKE9iamVjdC52YWx1ZXMoaXRlbS5pdGVtcylbMF0sIGZhbHNlKX1gXG4gICAgICAgIDogcGF0aFxuICAgIH0sXG5cbiAgICBnZXRJdGVtSHJlZihpdGVtKSB7XG4gICAgICBjb25zdCBwYXRoID0gdGhpcy5nZXRJdGVtUGF0aChpdGVtLCB0cnVlKVxuICAgICAgcmV0dXJuIHBhdGggPyB0aGlzLiRyb3V0ZXIucmVzb2x2ZShwYXRoKS5ocmVmIDogbnVsbFxuICAgIH0sXG5cbiAgICBpc0FjdGl2ZUl0ZW0oaXRlbSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy4kcm91dGUucGF0aC5zdGFydHNXaXRoKHRoaXMuZ2V0SXRlbVBhdGgoaXRlbSwgZmFsc2UpKSB8fFxuICAgICAgICBpdGVtLml0ZW1zICYmIE9iamVjdC52YWx1ZXMoaXRlbS5pdGVtcykuc29tZSh0aGlzLmlzQWN0aXZlSXRlbSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgb25DbGlja0l0ZW0oaXRlbSkge1xuICAgICAgY29uc3QgcGF0aCA9IHRoaXMuZ2V0SXRlbVBhdGgoaXRlbSwgdHJ1ZSlcbiAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHsgcGF0aCwgZm9yY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AdXNlICdzYXNzOmNvbG9yJztcbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW1lbnUge1xuICAkc2VsZjogJjtcbiAgJGl0ZW0taGVpZ2h0OiAkbWVudS1mb250LXNpemUgKyAyICogJG1lbnUtcGFkZGluZy12ZXI7XG5cbiAgLS1tZW51LWFjdGl2ZS1jb2xvcjogI3skY29sb3Itd2hpdGV9O1xuICAtLW1lbnUtYWN0aXZlLWJhY2tncm91bmQ6ICN7JGNvbG9yLWFjdGl2ZX07XG5cbiAgYm9yZGVyLXJpZ2h0OiAkYm9yZGVyLXN0eWxlO1xuICBwYWRkaW5nOiAwICRtZW51LXNwYWNpbmc7XG5cbiAgJl9faXRlbSB7XG4gICAgJjpoYXMoI3skc2VsZn1fX3N1Yik6bm90KDpoYXMoI3skc2VsZn1fX2xpbmstLWFjdGl2ZSkpIHtcbiAgICAgIC8vIFBvcC1vdXQgc3ViLW1lbnVzIG9uIGhvdmVyOlxuICAgICAgJjpob3ZlciB7XG4gICAgICAgID4gI3skc2VsZn1fX2xpbmsge1xuICAgICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodGVzdDtcbiAgICAgICAgfVxuXG4gICAgICAgICN7JHNlbGZ9X19zdWIge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB3aWR0aDogdmFyKC0td2lkdGgpO1xuICAgICAgICAgIHotaW5kZXg6ICR6LWluZGV4LWhlYWRlcjtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyh2YXIoLS13aWR0aCkgKyAyICogJG1lbnUtc3BhY2luZykpXG4gICAgICAgICAgICB0cmFuc2xhdGVZKC0kaXRlbS1oZWlnaHQpO1xuXG4gICAgICAgICAgI3skc2VsZn1fX2l0ZW06Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgI3skc2VsZn1fX2xpbmsge1xuICAgICAgICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgICAgICAvLyBGaWxsIHRoZSBnYXAgdG8gbm90IGxvb3NlIHRoZSBob3ZlciB3aGVuIG1vdmluZyBvdmVyIGl0LlxuICAgICAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICB0b3A6IDA7XG4gICAgICAgICAgICBsZWZ0OiAtMiAqICRtZW51LXNwYWNpbmc7XG4gICAgICAgICAgICB3aWR0aDogMiAqICRtZW51LXNwYWNpbmc7XG4gICAgICAgICAgICBoZWlnaHQ6ICRpdGVtLWhlaWdodDtcbiAgICAgICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgI3skc2VsZn1fX3N1YiB7XG4gICAgICAgICAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmX19saW5rIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nOiAkbWVudS1wYWRkaW5nO1xuICAgIGxpbmUtaGVpZ2h0OiAkbWVudS1saW5lLWhlaWdodDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBtYXJnaW4tdG9wOiAkbWVudS1zcGFjaW5nO1xuXG4gICAgJjpmb2N1czpub3QoOmFjdGl2ZSwgJi0tYWN0aXZlKSB7XG4gICAgICBib3gtc2hhZG93OiAkc2hhZG93LWZvY3VzO1xuICAgIH1cblxuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogcmdiKDI1NSwgMjU1LCAyNTUsIDAuNSk7XG4gICAgfVxuXG4gICAgJi0tYWN0aXZlIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgY29sb3I6IHZhcigtLW1lbnUtYWN0aXZlLWNvbG9yKTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbWVudS1hY3RpdmUtYmFja2dyb3VuZCk7XG4gICAgICB9XG5cbiAgICAgICY6aGFzKCsgI3skc2VsZn1fX3N1Yikge1xuICAgICAgICAtLW1lbnUtYWN0aXZlLWJhY2tncm91bmQ6ICN7Y29sb3IuYWRqdXN0KCRjb2xvci1hY3RpdmUsICRhbHBoYTogLTAuMyl9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICZfX3N1YiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItbGlnaHRlc3Q7XG4gIH1cblxuICAmX19saW5rLS1hY3RpdmUgKyAmX19zdWIge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyYWlsXG4gIHVsXG4gICAgbGkoXG4gICAgICB2LWZvcj1cImNvbXBvbmVudCBpbiB0cmFpbFwiXG4gICAgKVxuICAgICAgYS5kaXRvLXRyYWlsX19saW5rKFxuICAgICAgICA6Y2xhc3M9XCJ7ICdkaXRvLXRyYWlsX19saW5rLS1hY3RpdmUnOiBjb21wb25lbnQucGF0aCA9PT0gJHJvdXRlLnBhdGggfVwiXG4gICAgICAgIDpocmVmPVwiZ2V0Q29tcG9uZW50SHJlZihjb21wb25lbnQpXCJcbiAgICAgICAgQGNsaWNrLnByZXZlbnQuc3RvcD1cIm9uQ2xpY2tDb21wb25lbnQoY29tcG9uZW50KVwiXG4gICAgICApXG4gICAgICAgIHNwYW4uZGl0by10cmFpbF9fdGV4dChcbiAgICAgICAgICA6Y2xhc3M9XCJ7ICdkaXRvLXRyYWlsX190ZXh0LS1kaXJ0eSc6IGNvbXBvbmVudC5pc0RpcnR5IH1cIlxuICAgICAgICApXG4gICAgICAgICAgfCB7eyBjb21wb25lbnQuYnJlYWRjcnVtYiB9fVxuICBzbG90XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVHJhaWwnLCB7XG4gIGNvbXB1dGVkOiB7XG4gICAgdHJhaWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcHBTdGF0ZS5yb3V0ZUNvbXBvbmVudHMuZmlsdGVyKFxuICAgICAgICBjb21wb25lbnQgPT4gISFjb21wb25lbnQucm91dGVSZWNvcmRcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldENvbXBvbmVudFBhdGgoY29tcG9uZW50KSB7XG4gICAgICAvLyBEbyB0aGUgc2FtZSBhcyBpbiBgRGl0b01lbnVgOiBMaW5rIG1lbnUgaXRlbXMgdG8gdGhlIGZpcnN0IGNoaWxkcmVuLlxuICAgICAgY29uc3QgeyBzY2hlbWEgfSA9IGNvbXBvbmVudFxuICAgICAgcmV0dXJuIHNjaGVtYS50eXBlID09PSAnbWVudSdcbiAgICAgICAgPyBPYmplY3QudmFsdWVzKHNjaGVtYS5pdGVtcylbMF0uZnVsbFBhdGhcbiAgICAgICAgOiBjb21wb25lbnQucGF0aFxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnRIcmVmKGNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlci5yZXNvbHZlKHRoaXMuZ2V0Q29tcG9uZW50UGF0aChjb21wb25lbnQpKS5ocmVmXG4gICAgfSxcblxuICAgIG9uQ2xpY2tDb21wb25lbnQoY29tcG9uZW50KSB7XG4gICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7XG4gICAgICAgIHBhdGg6IHRoaXMuZ2V0Q29tcG9uZW50UGF0aChjb21wb25lbnQpLFxuICAgICAgICBmb3JjZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10cmFpbCB7XG4gICRzZWxmOiAmO1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGhlaWdodDogM2VtO1xuXG4gIHVsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgbGkge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cblxuICAmX19saW5rIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogYmxvY2s7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgICN7JHNlbGZ9X190ZXh0IHtcbiAgICAgICAgY29sb3I6ICRjb2xvci1saWdodDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmX190ZXh0LS1kaXJ0eSB7XG4gICAgJjo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgICB3aWR0aDogOHB4O1xuICAgICAgaGVpZ2h0OiA4cHg7XG4gICAgICBtYXJnaW46IDJweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAwLjVlbTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgfVxuICB9XG5cbiAgbGk6bm90KDpsYXN0LWNoaWxkKSAmX19saW5rIHtcbiAgICAkYW5nbGU6IDMzZGVnO1xuXG4gICAgJjo6YmVmb3JlLFxuICAgICY6OmFmdGVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgd2lkdGg6IDFweDtcbiAgICAgIGhlaWdodDogMC43NWVtO1xuICAgICAgcmlnaHQ6IC0wLjI1ZW07XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgICBvcGFjaXR5OiAwLjU7XG4gICAgfVxuXG4gICAgJjo6YmVmb3JlIHtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoJGFuZ2xlKTtcbiAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcDtcbiAgICB9XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBib3R0b206IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0kYW5nbGUpO1xuICAgICAgdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5uYXYuZGl0by1oZWFkZXJcbiAgRGl0b1RyYWlsXG4gICAgRGl0b1NwaW5uZXIoXG4gICAgICB2LWlmPVwiaXNMb2FkaW5nXCJcbiAgICAgIDpzaXplPVwic3Bpbm5lcj8uc2l6ZVwiXG4gICAgICA6Y29sb3I9XCJzcGlubmVyPy5jb2xvclwiXG4gICAgKVxuICAvLy0gVGVsZXBvcnQgdGFyZ2V0IGZvciBgLmRpdG8tc2NoZW1hLWhlYWRlcmA6XG4gIC5kaXRvLWhlYWRlcl9fdGVsZXBvcnRcbiAgc2xvdFxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0hlYWRlcicsIHtcbiAgcHJvcHM6IHtcbiAgICBzcGlubmVyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSxcbiAgICBpc0xvYWRpbmc6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWhlYWRlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZDogJGNvbG9yLWJsYWNrO1xuICBmb250LXNpemU6ICRoZWFkZXItZm9udC1zaXplO1xuICBsaW5lLWhlaWdodDogJGhlYWRlci1saW5lLWhlaWdodDtcbiAgei1pbmRleDogJHotaW5kZXgtaGVhZGVyO1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAmOjphZnRlciB7XG4gICAgLy8gU2V0IHRoZSBmdWxsLXdpZHRoIGhlYWRlciBiYWNrZ3JvdW5kIHRvIHRoZSBoZWFkZXIgY29sb3IuXG4gICAgY29udGVudDogJyc7XG4gICAgaW5zZXQ6IDA7XG4gICAgd2lkdGg6IDEwMHZ3O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0O1xuICAgIHotaW5kZXg6IC0xO1xuICB9XG5cbiAgc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHBhZGRpbmc6ICRoZWFkZXItcGFkZGluZztcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuXG4gICAgJjplbXB0eSB7XG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICdcXDIwMGInO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICZfX3RlbGVwb3J0IHtcbiAgICAvLyBBbGlnbiB0aGUgdGVsZXBvcnRlZCBzY2hlbWEgaGVhZGVycyBvbiB0b3Agb2YgdG8gdGhlIGhlYWRlciBtZW51LlxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgcGFkZGluZzogMCAkaGVhZGVyLXBhZGRpbmctaG9yO1xuICAgIC8vIFR1cm4gb2ZmIHBvaW50ZXIgZXZlbnRzIHNvIHRoYXQgRGl0b1RyYWlsIGtlZXBzIHJlY2VpdmluZyBldmVudHMuLi5cbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAvLyAuLi5idXQgbW92ZSB0aGVtIHRvIHRoZSBjaGlsZHJlbi5cbiAgICA+ICoge1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgfVxuXG4gICAgLmRpdG8tYnV0dG9uIHtcbiAgICAgIG1hcmdpbjogMCAwICR0YWItbWFyZ2luICR0YWItbWFyZ2luO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5uYXYuZGl0by1uYXZpZ2F0aW9uLmRpdG8tc2Nyb2xsLXBhcmVudFxuICBoMVxuICAgIFJvdXRlckxpbmsuZGl0by1saW5rKHRvPVwiL1wiKSB7eyBhcHBTdGF0ZS50aXRsZSB9fVxuICBEaXRvTWVudS5kaXRvLXNjcm9sbCg6aXRlbXM9XCJ2aWV3c1wiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b05hdmlnYXRpb24nLCB7fSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW5hdmlnYXRpb24ge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICBmbGV4OiAwIDAgbWluLWNvbnRlbnQ7XG4gIGZvbnQtc2l6ZTogJG1lbnUtZm9udC1zaXplO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBiYWNrZ3JvdW5kOiAkY29sb3ItbGlnaHRlcjtcblxuICBoMSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbGluZS1oZWlnaHQ6ICRoZWFkZXItbGluZS1oZWlnaHQ7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWRhcmtlcjtcbiAgICBib3JkZXItcmlnaHQ6ICRib3JkZXItd2lkdGggc29saWQgJGNvbG9yLWRhcmtlc3Q7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcblxuICAgIC5kaXRvLWxpbmsge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwYWRkaW5nOiAkaGVhZGVyLXBhZGRpbmc7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLW5vdGlmaWNhdGlvbnNcbiAgLmRpdG8taGVhZGVyXG4gICAgc3BhblxuICAuZGl0by1ub3RpZmljYXRpb25zX19pbm5lclxuICAgIFZ1ZU5vdGlmaWNhdGlvbnMoXG4gICAgICByZWY9XCJub3RpZmljYXRpb25zXCJcbiAgICAgIGNsYXNzZXM9XCJkaXRvLW5vdGlmaWNhdGlvblwiXG4gICAgICA6ZGFuZ2Vyb3VzbHlTZXRJbm5lckh0bWw9XCJ0cnVlXCJcbiAgICAgIHBvc2l0aW9uPVwiXCJcbiAgICAgIHdpZHRoPVwiXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGFzQXJyYXksIHN0cmlwSHRtbCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b05vdGlmaWNhdGlvbnMnLCB7XG4gIG5vdGlmaWNhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNNb3VudGVkICYmIHRoaXMuJHJlZnMubm90aWZpY2F0aW9uc1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBub3RpZnkoeyB0eXBlID0gJ2luZm8nLCB0aXRsZSwgdGV4dCwgZXJyb3IsIGR1cmF0aW9uIH0gPSB7fSkge1xuICAgICAgdGl0bGUgfHw9IChcbiAgICAgICAge1xuICAgICAgICAgIHdhcm5pbmc6ICdXYXJuaW5nJyxcbiAgICAgICAgICBlcnJvcjogJ0Vycm9yJyxcbiAgICAgICAgICBpbmZvOiAnSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHN1Y2Nlc3M6ICdTdWNjZXNzJ1xuICAgICAgICB9W3R5cGVdIHx8XG4gICAgICAgICdOb3RpZmljYXRpb24nXG4gICAgICApXG4gICAgICB0ZXh0ID0gYDxwPiR7XG4gICAgICAgIGFzQXJyYXkodGV4dCkuam9pbignPC9wPiA8cD4nKVxuICAgICAgfTwvcD5gLnJlcGxhY2UoL1xcbnxcXHJcXG58XFxyL2csICc8YnI+JylcbiAgICAgIGNvbnN0IGxvZyA9IChcbiAgICAgICAge1xuICAgICAgICAgIHdhcm5pbmc6ICd3YXJuJyxcbiAgICAgICAgICBlcnJvcjogJ2Vycm9yJyxcbiAgICAgICAgICBpbmZvOiAnbG9nJyxcbiAgICAgICAgICBzdWNjZXNzOiAnbG9nJ1xuICAgICAgICB9W3R5cGVdIHx8XG4gICAgICAgICdlcnJvcidcbiAgICAgIClcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlW2xvZ10oXG4gICAgICAgIC4uLltcbiAgICAgICAgICBzdHJpcEh0bWwodGV4dCksXG4gICAgICAgICAgLi4uKHR5cGUgPT09ICdlcnJvcicgJiYgZXJyb3IgPyBbZXJyb3JdIDogW10pXG4gICAgICAgIF1cbiAgICAgIClcbiAgICAgIGNvbnN0IHsgbm90aWZpY2F0aW9ucyA9IHRydWUgfSA9IHRoaXMuYXBpXG4gICAgICBpZiAobm90aWZpY2F0aW9ucykge1xuICAgICAgICAvLyBDYWxjdWxhdGUgZGlzcGxheS1kdXJhdGlvbiBmb3IgdGhlIG5vdGlmaWNhdGlvbiBiYXNlZCBvbiBpdHMgY29udGVudFxuICAgICAgICAvLyBhbmQgdGhlIHNldHRpbmcgb2YgdGhlIGBkdXJhdGlvbkZhY3RvcmAgY29uZmlndXJhdGlvbi4gSXQgZGVmaW5lcyB0aGVcbiAgICAgICAgLy8gYW1vdW50IG9mIG1pbGxpc2Vjb25kcyBtdWx0aXBsaWVkIHdpdGggdGhlIGFtb3VudCBvZiBjaGFyYWN0ZXJzXG4gICAgICAgIC8vIGRpc3BsYXllZCBpbiB0aGUgbm90aWZpY2F0aW9uLCBwbHVzIDQwICg0MCArIHRpdGxlICsgbWVzc2FnZSk6XG4gICAgICAgIGNvbnN0IHsgZHVyYXRpb25GYWN0b3IgPSAyMCB9ID0gbm90aWZpY2F0aW9uc1xuICAgICAgICBkdXJhdGlvbiA/Pz0gKDQwICsgdGV4dC5sZW5ndGggKyB0aXRsZS5sZW5ndGgpICogZHVyYXRpb25GYWN0b3JcbiAgICAgICAgdGhpcy4kbm90aWZ5KHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uID09PSAwID8gLTEgOiBkdXJhdGlvbiAvLyA8IDAgLT4gPD0gMCA9IHN0aWNreVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBkZXN0cm95QWxsKCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLmRlc3Ryb3lBbGwoKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkB1c2UgJ3Nhc3M6Y29sb3InO1xuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuQG1peGluIHR5cGUoJGJhY2tncm91bmQpIHtcbiAgYmFja2dyb3VuZDogY29sb3IuYWRqdXN0KCRiYWNrZ3JvdW5kLCAkbGlnaHRuZXNzOiA1JSk7XG4gIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gIGJvcmRlci1sZWZ0OiAxMnB4IHNvbGlkIGNvbG9yLmFkanVzdCgkYmFja2dyb3VuZCwgJGxpZ2h0bmVzczogLTEwJSk7XG59XG5cbi5kaXRvLW5vdGlmaWNhdGlvbnMge1xuICAkbm90aWZpY2F0aW9uLXdpZHRoOiAzMDBweDtcblxuICBmbGV4OiAxO1xuICB6LWluZGV4OiAkei1pbmRleC1ub3RpZmljYXRpb25zO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBtYXJnaW4tbGVmdDogJGZvcm0tc3BhY2luZztcbiAgLy8gRm9yIHRoZSBgQGNvbnRhaW5lcmAgcnVsZSB0byB3b3JrOlxuICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7XG5cbiAgLmRpdG8taGVhZGVyIHtcbiAgICBzcGFuIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gICAgfVxuICB9XG5cbiAgJl9faW5uZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxuXG4gIC52dWUtbm90aWZpY2F0aW9uLWdyb3VwIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6ICRub3RpZmljYXRpb24td2lkdGg7XG5cbiAgICBAY29udGFpbmVyICh3aWR0aCA8ICN7JG5vdGlmaWNhdGlvbi13aWR0aCArICRjb250ZW50LXBhZGRpbmd9KSB7XG4gICAgICBsZWZ0OiB1bnNldDtcbiAgICAgIHJpZ2h0OiAkY29udGVudC1wYWRkaW5nO1xuICAgIH1cbiAgfVxuXG4gIC52dWUtbm90aWZpY2F0aW9uLXdyYXBwZXIge1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICB9XG5cbiAgLmRpdG8tbm90aWZpY2F0aW9uIHtcbiAgICBwYWRkaW5nOiA4cHg7XG4gICAgbWFyZ2luOiAkY29udGVudC1wYWRkaW5nIDA7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG5cbiAgICAubm90aWZpY2F0aW9uLXRpdGxlIHtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgICB9XG5cbiAgICAubm90aWZpY2F0aW9uLWNvbnRlbnQge1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcblxuICAgICAgcCB7XG4gICAgICAgIG1hcmdpbjogMDtcblxuICAgICAgICAmICsgcCB7XG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgJixcbiAgICAmLmluZm8ge1xuICAgICAgQGluY2x1ZGUgdHlwZSgkY29sb3ItYWN0aXZlKTtcbiAgICB9XG5cbiAgICAmLnN1Y2Nlc3Mge1xuICAgICAgQGluY2x1ZGUgdHlwZSgkY29sb3Itc3VjY2Vzcyk7XG4gICAgfVxuXG4gICAgJi53YXJuaW5nIHtcbiAgICAgIEBpbmNsdWRlIHR5cGUoJGNvbG9yLXdhcm5pbmcpO1xuICAgIH1cblxuICAgICYuZXJyb3Ige1xuICAgICAgQGluY2x1ZGUgdHlwZSgkY29sb3ItZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5hc2lkZS5kaXRvLXNpZGViYXIuZGl0by1zY3JvbGwtcGFyZW50KFxuICB2LXJlc2l6ZT1cIm9uUmVzaXplU2lkZWJhclwiXG4gIDpjbGFzcz1cImNsYXNzZXNcIlxuKVxuICBuYXYuZGl0by1oZWFkZXJcbiAgICBzbG90XG4gIC5kaXRvLXNpZGViYXJfX3RlbGVwb3J0LmRpdG8tc2Nyb2xsXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvU2lkZWJhcicsIHtcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2lkZWJhcldpZHRoOiAwXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xhc3NlcygpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9ICdkaXRvLXNpZGViYXInXG4gICAgICAvLyBOT1RFOiBLZWVwIHN5bmNlZCB3aXRoICRzaWRlYmFyLW1heC13aWR0aCBpbiBTQ1NTOlxuICAgICAgY29uc3Qgc2lkZWJhcldpZHRoID0gMzYwXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbYCR7cHJlZml4fS0td2lkdGgtOTlgXTogdGhpcy5zaWRlYmFyV2lkdGggPCBzaWRlYmFyV2lkdGgsXG4gICAgICAgIFtgJHtwcmVmaXh9LS13aWR0aC02MGBdOiB0aGlzLnNpZGViYXJXaWR0aCA8PSBzaWRlYmFyV2lkdGggKiAwLjZcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uUmVzaXplU2lkZWJhcih7IGNvbnRlbnRSZWN0OiB7IHdpZHRoIH0gfSkge1xuICAgICAgdGhpcy5zaWRlYmFyV2lkdGggPSB3aWR0aFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNpZGViYXIge1xuICBmbGV4OiAwIDEgJHNpZGViYXItbWF4LXdpZHRoO1xuICBtYXgtd2lkdGg6ICRzaWRlYmFyLW1heC13aWR0aDtcbiAgbWluLXdpZHRoOiAkc2lkZWJhci1taW4td2lkdGg7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IERvbU1peGluIGZyb20gJy4vRG9tTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0RvbU1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwdWxsZG93bjoge1xuICAgICAgICBvcGVuOiBmYWxzZSxcbiAgICAgICAgc3RhcnRUaW1lOiAwLFxuICAgICAgICBjaGVja1RpbWU6IHRydWUsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIG1vdXNlZG93bjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRQdWxsZG93bk9wZW4oZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnB1bGxkb3duLmhhbmRsZXJzLnJlbW92ZSgpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIG1vdXNldXA6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uUHVsbGRvd25Nb3VzZVVwKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wdWxsZG93bi5oYW5kbGVycy5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaGFuZGxlcnM6IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uUHVsbGRvd25Nb3VzZURvd24odmFsdWUgPSBudWxsKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5zZXRQdWxsZG93bk9wZW4odHJ1ZSlcbiAgICAgICAgdGhpcy5jaGVja1RpbWUgPSB0cnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoZWNrVGltZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uUHVsbGRvd25Nb3VzZVVwKHZhbHVlID0gbnVsbCkge1xuICAgICAgY29uc3QgeyBzdGFydFRpbWUgfSA9IHRoaXMucHVsbGRvd25cbiAgICAgIGlmICghdGhpcy5jaGVja1RpbWUgfHwgc3RhcnRUaW1lICYmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID4gMjUwKSkge1xuICAgICAgICB0aGlzLnNldFB1bGxkb3duT3BlbihmYWxzZSlcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5vblB1bGxkb3duU2VsZWN0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uUHVsbGRvd25TZWxlY3QoLyogdmFsdWUgKi8pIHtcbiAgICAgIC8vIE5PVEU6IFRvIGJlIG92ZXJyaWRkZW4uXG4gICAgfSxcblxuICAgIHNldFB1bGxkb3duT3BlbihvcGVuKSB7XG4gICAgICB0aGlzLnB1bGxkb3duLm9wZW4gPSBvcGVuXG4gICAgICB0aGlzLnB1bGxkb3duLnN0YXJ0VGltZSA9IG9wZW4gPyBEYXRlLm5vdygpIDogMFxuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgdGhpcy5wdWxsZG93bi5oYW5kbGVycyA9IHRoaXMuZG9tT24oZG9jdW1lbnQsIHRoaXMucHVsbGRvd24uZXZlbnRzKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWFjY291bnRcbiAgYShcbiAgICBAbW91c2Vkb3duLnN0b3A9XCJvblB1bGxkb3duTW91c2VEb3duKClcIlxuICApXG4gICAgc3BhbiB7eyB1c2VyLnVzZXJuYW1lIH19XG4gIHVsLmRpdG8tcHVsbGRvd24oOmNsYXNzPVwieyAnZGl0by1wdWxsZG93bi0tb3Blbic6IHB1bGxkb3duLm9wZW4gfVwiKVxuICAgIGxpKFxuICAgICAgdi1mb3I9XCIobGFiZWwsIHZhbHVlKSBvZiBpdGVtc1wiXG4gICAgKVxuICAgICAgYS5kaXRvLXB1bGxkb3duX19pdGVtKFxuICAgICAgICBAbW91c2Vkb3duLnN0b3A9XCJvblB1bGxkb3duTW91c2VEb3duKHZhbHVlKVwiXG4gICAgICAgIEBtb3VzZXVwPVwib25QdWxsZG93bk1vdXNlVXAodmFsdWUpXCJcbiAgICAgICkge3sgbGFiZWwgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFB1bGxkb3duTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1B1bGxkb3duTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0FjY291bnQnLCB7XG4gIG1peGluczogW1B1bGxkb3duTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHNldHRpbmdzOiAnU2V0dGluZ3MnLFxuICAgICAgICBsb2dvdXQ6ICdMb2dvdXQnXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvblB1bGxkb3duU2VsZWN0KHZhbHVlKSB7XG4gICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ2xvZ291dCc6XG4gICAgICAgICAgdGhpcy5yb290Q29tcG9uZW50LmxvZ291dCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc2V0dGluZ3MnOlxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnVE9ETzogSW1wbGVtZW50IFNldHRpbmdzJylcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWFjY291bnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcblxuICAuZGl0by1wdWxsZG93biB7XG4gICAgdG9wOiAkcHVsbGRvd24tcGFkZGluZy12ZXI7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc3Bpbm5lcihcbiAgdi1zaG93PVwibG9hZGluZ1wiXG4gIDpzdHlsZT1cInsgJy0tY29sb3InOiBjb2xvciwgJy0tc2l6ZSc6IHNpemUsICctLW1hcmdpbic6IG1hcmdpbiB9XCJcbilcbiAgLmRpdG8tc3Bpbm5lcl9fcHVsc2UuZGl0by1zcGlubmVyX19wdWxzZTFcbiAgLmRpdG8tc3Bpbm5lcl9fcHVsc2UuZGl0by1zcGlubmVyX19wdWxzZTJcbiAgLmRpdG8tc3Bpbm5lcl9fcHVsc2UuZGl0by1zcGlubmVyX19wdWxzZTNcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9TcGlubmVyJywge1xuICBwcm9wczoge1xuICAgIGxvYWRpbmc6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH0sXG4gICAgc2l6ZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH0sXG4gICAgbWFyZ2luOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tc3Bpbm5lciB7XG4gIC0tY29sb3I6ICM5OTk5OTk7XG4gIC0tc2l6ZTogOHB4O1xuICAtLW1hcmdpbjogMnB4O1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgJl9fcHVsc2Uge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvcik7XG4gICAgd2lkdGg6IHZhcigtLXNpemUpO1xuICAgIGhlaWdodDogdmFyKC0tc2l6ZSk7XG4gICAgbWFyZ2luOiB2YXIoLS1tYXJnaW4pO1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgYW5pbWF0aW9uOiBkaXRvLXNwaW5uZXItcHVsc2UgMC43NXMgY3ViaWMtYmV6aWVyKDAuMiwgMC42OCwgMC4xOCwgMS4wOCkgMHNcbiAgICAgIGluZmluaXRlIGJvdGg7XG4gIH1cblxuICAmX19wdWxzZTEge1xuICAgIGFuaW1hdGlvbi1kZWxheTogMC4xMnM7XG4gIH1cblxuICAmX19wdWxzZTIge1xuICAgIGFuaW1hdGlvbi1kZWxheTogMC4yNHM7XG4gIH1cblxuICAmX19wdWxzZTMge1xuICAgIGFuaW1hdGlvbi1kZWxheTogMC4zNnM7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBkaXRvLXNwaW5uZXItcHVsc2Uge1xuICAwJSxcbiAgODAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICA0NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAwLjc7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBkaXRvLXNwaW5uZXItcHVsc2Uge1xuICAwJSxcbiAgODAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICA0NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAwLjc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuY29tcG9uZW50KFxuICB2LWlmPVwiaXRlbS50eXBlID09PSAndGV4dCdcIlxuICA6aXM9XCJpdGVtLmFzIHx8ICdkaXYnXCJcbikge3sgaXRlbS50ZXh0IH19XG5jb21wb25lbnQoXG4gIHYtZWxzZS1pZj1cIml0ZW0udHlwZSA9PT0gJ2h0bWwnXCJcbiAgOmlzPVwiaXRlbS5hcyB8fCAnZGl2J1wiXG4gIHYtaHRtbD1cIml0ZW0uaHRtbFwiXG4pXG5EaXRvU3Bpbm5lcihcbiAgdi1lbHNlLWlmPVwiaXRlbS50eXBlID09PSAnc3Bpbm5lcidcIlxuICA6c2l6ZT1cIml0ZW0uc2l6ZVwiXG4gIDpjb2xvcj1cIml0ZW0uY29sb3JcIlxuKVxuRGl0b0ljb24oXG4gIHYtZWxzZS1pZj1cIml0ZW0udHlwZSA9PT0gJ2ljb24nXCJcbiAgOm5hbWU9XCJpdGVtLm5hbWVcIlxuICA6ZGlzYWJsZWQ9XCJpdGVtLmRpc2FibGVkXCJcbilcbmNvbXBvbmVudChcbiAgdi1lbHNlLWlmPVwiaXRlbS50eXBlID09PSAnY29tcG9uZW50J1wiXG4gIDppcz1cIml0ZW0uY29tcG9uZW50XCJcbiAgdi1iaW5kPVwiaXRlbS5wcm9wc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvU3Bpbm5lciBmcm9tICcuL0RpdG9TcGlubmVyLnZ1ZSdcbmltcG9ydCB7IERpdG9JY29uIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQWZmaXgnLCB7XG4gIGNvbXBvbmVudHM6IHsgRGl0b1NwaW5uZXIsIERpdG9JY29uIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBpdGVtOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXJlbnRDb250ZXh0OiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgLy8gT3ZlcnJpZGUgRGl0b01peGluJ3MgY29udGV4dCB3aXRoIHRoZSBwYXJlbnQncyBjb250ZXh0XG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudENvbnRleHRcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1hZmZpeCB7XG4gICYtLWh0bWwsXG4gICYtLXRleHQge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgfVxuXG4gICYtLWVsbGlwc2lzIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIGZsZXg6IDE7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWluLXdpZHRoOiAwO1xuICAgIHdpZHRoOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWFmZml4ZXMoXG4gIHYtaWY9XCJoYXNDb250ZW50XCJcbiAgOmNsYXNzPVwiY2xhc3Nlc1wiXG4pXG4gIHNsb3QobmFtZT1cInByZXBlbmRcIilcbiAgRGl0b0FmZml4LmRpdG8tYWZmaXgoXG4gICAgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIHZpc2libGVJdGVtc1wiXG4gICAgOmtleT1cImluZGV4XCJcbiAgICA6Y2xhc3M9XCJnZXRJdGVtQ2xhc3NlcyhpdGVtKVwiXG4gICAgOnN0eWxlPVwiaXRlbS5zdHlsZVwiXG4gICAgOml0ZW09XCJpdGVtXCJcbiAgICA6cGFyZW50Q29udGV4dD1cInBhcmVudENvbnRleHRcIlxuICApXG4gIGJ1dHRvbi5kaXRvLWFmZml4ZXNfX2NsZWFyKFxuICAgIHYtaWY9XCJjbGVhcmFibGVcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHRpdGxlPVwiQ2xlYXJcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICBAY2xpY2suc3RvcD1cIiRlbWl0KCdjbGVhcicpXCJcbiAgICBAbW91c2Vkb3duLnN0b3BcbiAgKVxuICBzbG90KG5hbWU9XCJhcHBlbmRcIilcbiAgLmRpdG8taW5mbyhcbiAgICB2LWlmPVwiaW5saW5lSW5mb1wiXG4gICAgOmRhdGEtaW5mbz1cImlubGluZUluZm9cIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQWZmaXggZnJvbSAnLi9EaXRvQWZmaXgudnVlJ1xuaW1wb3J0IHsgYXNBcnJheSwgaXNTdHJpbmcgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgaGFzU2xvdENvbnRlbnQgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7IHNob3VsZFJlbmRlclNjaGVtYSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9BZmZpeGVzJywge1xuICBjb21wb25lbnRzOiB7IERpdG9BZmZpeCB9LFxuICBlbWl0czogWydjbGVhciddLFxuXG4gIHByb3BzOiB7XG4gICAgaXRlbXM6IHsgdHlwZTogW1N0cmluZywgT2JqZWN0LCBBcnJheV0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtb2RlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHBvc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGFic29sdXRlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY2xlYXJhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBpbmxpbmVJbmZvOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHBhcmVudENvbnRleHQ6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyBjb250ZXh0IHdpdGggdGhlIHBhcmVudCdzIGNvbnRleHRcbiAgICBjb250ZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50Q29udGV4dFxuICAgIH0sXG5cbiAgICBwcm9jZXNzZWRJdGVtcygpIHtcbiAgICAgIHJldHVybiBhc0FycmF5KHRoaXMuaXRlbXMpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcChpdGVtID0+XG4gICAgICAgICAgaXNTdHJpbmcoaXRlbSlcbiAgICAgICAgICAgID8geyB0eXBlOiAndGV4dCcsIHRleHQ6IGl0ZW0gfVxuICAgICAgICAgICAgOiBpdGVtLnR5cGVcbiAgICAgICAgICAgICAgPyBpdGVtXG4gICAgICAgICAgICAgIDogaXRlbS50ZXh0ICE9IG51bGxcbiAgICAgICAgICAgICAgICA/IHsgdHlwZTogJ3RleHQnLCAuLi5pdGVtIH1cbiAgICAgICAgICAgICAgICA6IGl0ZW0uaHRtbCAhPSBudWxsXG4gICAgICAgICAgICAgICAgICA/IHsgdHlwZTogJ2h0bWwnLCAuLi5pdGVtIH1cbiAgICAgICAgICAgICAgICAgIDogaXRlbVxuICAgICAgICApXG4gICAgfSxcblxuICAgIHZpc2libGVJdGVtcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZEl0ZW1zLmZpbHRlcihpdGVtID0+XG4gICAgICAgIHNob3VsZFJlbmRlclNjaGVtYShpdGVtLCB0aGlzLmNvbnRleHQpXG4gICAgICApXG4gICAgfSxcblxuICAgIGNsYXNzZXMoKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSAnZGl0by1hZmZpeGVzJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLSR7dGhpcy5wb3NpdGlvbn1gXTogdGhpcy5wb3NpdGlvbixcbiAgICAgICAgW2Ake3ByZWZpeH0tLSR7dGhpcy5tb2RlfWBdOiB0aGlzLm1vZGUsXG4gICAgICAgIFtgJHtwcmVmaXh9LS1hYnNvbHV0ZWBdOiB0aGlzLmFic29sdXRlXG4gICAgICB9XG4gICAgfSxcblxuICAgIGhhc0NvbnRlbnQoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnZpc2libGVJdGVtcy5sZW5ndGggPiAwIHx8XG4gICAgICAgIHRoaXMuY2xlYXJhYmxlIHx8XG4gICAgICAgIHRoaXMuaW5saW5lSW5mbyB8fFxuICAgICAgICBoYXNTbG90Q29udGVudCh0aGlzLiRzbG90cy5wcmVwZW5kKSB8fFxuICAgICAgICBoYXNTbG90Q29udGVudCh0aGlzLiRzbG90cy5hcHBlbmQpXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRJdGVtQ2xhc3NlcyhpdGVtKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSAnZGl0by1hZmZpeCdcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICBbYCR7cHJlZml4fS0tJHtpdGVtLnR5cGV9YF06IGl0ZW0udHlwZSxcbiAgICAgICAgICBbYCR7cHJlZml4fS0tZWxsaXBzaXNgXTogKFxuICAgICAgICAgICAgdGhpcy5tb2RlID09PSAnZWxsaXBzaXMnICYmIFsndGV4dCcsICdodG1sJ10uaW5jbHVkZXMoaXRlbS50eXBlKVxuICAgICAgICAgIClcbiAgICAgICAgfSxcbiAgICAgICAgaXRlbS5jbGFzc1xuICAgICAgXVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWFmZml4ZXMge1xuICAkc2VsZjogJjtcblxuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6ICRpbnB1dC1wYWRkaW5nLWhvcjtcblxuICAmLS1hYnNvbHV0ZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAkYm9yZGVyLXdpZHRoO1xuICAgIG1hcmdpbjogJGlucHV0LXBhZGRpbmctdmVyICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcblxuICAgID4gKiB7XG4gICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICB9XG5cbiAgICAmI3skc2VsZn0tLXByZWZpeCB7XG4gICAgICByaWdodDogdW5zZXQ7XG4gICAgfVxuXG4gICAgJiN7JHNlbGZ9LS1zdWZmaXgge1xuICAgICAgbGVmdDogdW5zZXQ7XG4gICAgfVxuICB9XG5cbiAgJi0tZWxsaXBzaXMge1xuICAgIGZsZXg6IDE7XG4gIH1cblxuICAmLS1pbnB1dCB7XG4gICAgY29sb3I6ICRjb2xvci1ncmV5O1xuXG4gICAgLmRpdG8taWNvbi0tZGlzYWJsZWQge1xuICAgICAgY29sb3I6ICRjb2xvci1saWdodDtcbiAgICB9XG5cbiAgICBAYXQtcm9vdCAuZGl0by1jb21wb25lbnQ6bm90KDpoYXMoLmRpdG8tY29tcG9uZW50KSk6Zm9jdXMtd2l0aGluICYge1xuICAgICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICB9XG5cbiAgJl9fY2xlYXIge1xuICAgIC0tc2l6ZTogI3tjYWxjKCRpbnB1dC1oZWlnaHQgLSA0ICogJGJvcmRlci13aWR0aCl9O1xuXG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHdpZHRoOiB2YXIoLS1zaXplKTtcbiAgICBoZWlnaHQ6IHZhcigtLXNpemUpO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIG1hcmdpbjogKC0kaW5wdXQtcGFkZGluZy12ZXIgKyAkYm9yZGVyLXdpZHRoKVxuICAgICAgKC0kaW5wdXQtcGFkZGluZy1ob3IgKyAkYm9yZGVyLXdpZHRoKTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlcjogMDtcblxuICAgIEBhdC1yb290IC5kaXRvLWNvbXBvbmVudDpub3QoOmhhcyguZGl0by1jb21wb25lbnQpKTpob3ZlciAmIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cblxuICAgICY6OmJlZm9yZSB7XG4gICAgICBAZXh0ZW5kICVpY29uLWNsZWFyO1xuXG4gICAgICBjb2xvcjogJGNvbG9yLWdyZXk7XG4gICAgfVxuXG4gICAgJjpob3Zlcjo6YmVmb3JlIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItYmxhY2s7XG4gICAgfVxuICB9XG5cbiAgLy8gSGlkZSBvdGhlciBhZmZpeGVzIHdoZW4gY2xlYXIgYnV0dG9uIGlzIHNob3duXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBAYXQtcm9vdCAuZGl0by1jb21wb25lbnQ6aG92ZXI6bm90KDpoYXMoLmRpdG8tY29tcG9uZW50KSlcbiAgICAgICAgI3skc2VsZn06aGFzKCN7JHNlbGZ9X19jbGVhcikgPiAqOm5vdCgjeyRzZWxmfV9fY2xlYXIpIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5jb21wb25lbnQuZGl0by1sYWJlbChcbiAgdi1pZj1cInRleHQgfHwgY29sbGFwc2libGVcIlxuICA6aXM9XCJjb2xsYXBzaWJsZSA/ICdidXR0b24nIDogJ2RpdidcIlxuICA6dHlwZT1cImNvbGxhcHNpYmxlID8gJ2J1dHRvbicgOiBudWxsXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIDpjbGFzcz1cInsgJ2RpdG8tbGFiZWwtLWFjdGl2ZSc6IGlzQWN0aXZlIH1cIlxuKVxuICAuZGl0by1jaGV2cm9uKFxuICAgIHYtaWY9XCJjb2xsYXBzaWJsZVwiXG4gICAgOmNsYXNzPVwieyAnZGl0by1jaGV2cm9uLS1vcGVuJzogIWNvbGxhcHNlZCB9XCJcbiAgKVxuICAuZGl0by1sYWJlbF9faW5uZXIoXG4gICAgdi1pZj1cInRleHQgfHwgcHJlZml4ZXMubGVuZ3RoID4gMCB8fCBzdWZmaXhlcy5sZW5ndGggPiAwXCJcbiAgKVxuICAgIERpdG9BZmZpeGVzKFxuICAgICAgOml0ZW1zPVwicHJlZml4ZXNcIlxuICAgICAgcG9zaXRpb249XCJwcmVmaXhcIlxuICAgICAgOnBhcmVudENvbnRleHQ9XCJjb250ZXh0XCJcbiAgICApXG4gICAgbGFiZWwoXG4gICAgICB2LWlmPVwidGV4dFwiXG4gICAgICA6Zm9yPVwiZGF0YVBhdGhcIlxuICAgICAgdi1odG1sPVwidGV4dFwiXG4gICAgKVxuICAgIERpdG9BZmZpeGVzKFxuICAgICAgOml0ZW1zPVwic3VmZml4ZXNcIlxuICAgICAgbW9kZT1cImVsbGlwc2lzXCJcbiAgICAgIHBvc2l0aW9uPVwic3VmZml4XCJcbiAgICAgIDpwYXJlbnRDb250ZXh0PVwiY29udGV4dFwiXG4gICAgKVxuICAgIC5kaXRvLWluZm8oXG4gICAgICB2LWlmPVwiaW5mb1wiXG4gICAgICA6ZGF0YS1pbmZvPVwiaW5mb1wiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0FmZml4ZXMgZnJvbSAnLi9EaXRvQWZmaXhlcy52dWUnXG5pbXBvcnQgeyBpc09iamVjdCwgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0xhYmVsJywge1xuICBjb21wb25lbnRzOiB7IERpdG9BZmZpeGVzIH0sXG5cbiAgZW1pdHM6IFsnb3BlbiddLFxuXG4gIHByb3BzOiB7XG4gICAgbGFiZWw6IHsgdHlwZTogW1N0cmluZywgT2JqZWN0XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGNvbGxhcHNlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvbGxhcHNpYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaW5mbzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdGV4dCgpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWwgfSA9IHRoaXNcbiAgICAgIHJldHVybiBpc09iamVjdChsYWJlbCkgPyBsYWJlbD8udGV4dCA6IGxhYmVsXG4gICAgfSxcblxuICAgIHByZWZpeGVzKCkge1xuICAgICAgcmV0dXJuIGFzQXJyYXkodGhpcy5sYWJlbD8ucHJlZml4KVxuICAgIH0sXG5cbiAgICBzdWZmaXhlcygpIHtcbiAgICAgIHJldHVybiBhc0FycmF5KHRoaXMubGFiZWw/LnN1ZmZpeClcbiAgICB9LFxuXG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbGxhcHNpYmxlID8geyBvbkNsaWNrOiB0aGlzLm9uQ2xpY2sgfSA6IHt9XG4gICAgfSxcblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwU3RhdGUuYWN0aXZlTGFiZWwgPT09IHRoaXNcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uQ2xpY2soKSB7XG4gICAgICB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID0gdGhpc1xuICAgICAgdGhpcy4kZW1pdCgnb3BlbicsIHRoaXMuY29sbGFwc2VkKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWxhYmVsIHtcbiAgJHNlbGY6ICY7XG5cbiAgLy8gRm9yIGJ1dHRvbnMgYW5kIGNoZXZyb24gdG8gYWxpZ24gcmlnaHQ6XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gVmVydGljYWxseSBjZW50ZXIgYWxsIGl0ZW1zIGluIHRoZSBsYWJlbCwgZS5nLiBjaGV2cm9uLCBlZGl0LWJ1dHRvbnMuXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIG1pbi1oZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gIG1hcmdpbi1yaWdodDogJGZvcm0tc3BhY2luZy1oYWxmOyAvLyBXaGVuIGlubGluZWQuXG5cbiAgJjpoYXMoLmRpdG8tc2NoZW1hLWhlYWRlcikge1xuICAgIC8vIFRoZSBjb250YWluZXIncyBsYWJlbCBpcyB1c2VkIGFzIHRlbGVwb3J0IGZvciBhIG5lc3RlZCBzZWN0aW9uIG9yIG9iamVjdFxuICAgIC8vIGxhYmVsLiBIaWRlIGAmX19pbm5lcmAsIGFzIGl0IGlzIGJlIGR1cGxpY2F0ZWQgaW5zaWRlIHRoZSBuZXN0ZWQgbGFiZWwuXG4gICAgPiAjeyRzZWxmfV9faW5uZXIge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cblxuICAmOm5vdCg6aGFzKCsgLmRpdG8tdGFicykpIHtcbiAgICAvLyBUYWtlIGZ1bGwgd2lkdGggYnV0IG9ubHkgaWYgdGhlcmUgYXJlbid0IGFsc28gdGFicyB0byBiZSBjZW50ZXJlZC5cbiAgICBmbGV4OiAxO1xuICB9XG5cbiAgJl9faW5uZXIge1xuICAgIGZsZXg6IDEgMCAwJTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBnYXA6ICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgfVxuXG4gIGxhYmVsIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIGN1cnNvcjogaW5oZXJpdDtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgfVxuXG4gIC8vIEZpeCBhbGlnbm1lbnQgb2Ygc3ViIGFuZCBzdXAgZWxlbWVudHMgaW4gbGFiZWwgY29udGVudC5cbiAgc3ViLFxuICBzdXAge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gIH1cblxuICBzdWIge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg0cHgpO1xuICB9XG5cbiAgc3VwIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7XG4gIH1cblxuICAuZGl0by1idXR0b25zIHtcbiAgICAvLyBNb3ZlIHRoZSBsYWJlbCBwYWRkaW5nIGluc2lkZSAuZGl0by1idXR0b25zLCBzbyB0aGF0IGl0IGNhcHR1cmVzIGFsbFxuICAgIC8vIG5lYXIgbW91c2UgZXZlbnRzOlxuICAgIG1hcmdpbjogY2FsYygtMSAqIHZhcigtLWxhYmVsLXBhZGRpbmcpKTtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgICBwYWRkaW5nOiB2YXIoLS1sYWJlbC1wYWRkaW5nKTtcbiAgfVxuXG4gICYtLWZpbGwge1xuICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgLy8gSW4gb3JkZXIgZm9yIGVsbGlwc2lzIHRvIHdvcmsgb24gbGFiZWxzIHdpdGhvdXQgYWZmZWN0aW5nIG90aGVyIGxheW91dCxcbiAgICAvLyB3ZSBuZWVkIHRvIHBvc2l0aW9uIGl0IGFic29sdXRlbHkgaW5zaWRlIGl0cyBjb250YWluZXIuIEJ1dCB3ZSBjYW4gb25seVxuICAgIC8vIGRvIHNvIGlmIHRoZXJlIGlzJ3QgYWxzbyBhIGNoZXZyb24gb3Igb3RoZXIgVVggZWxlbWVudHMgYmVzaWRlcyBpdC5cbiAgICAmOmhhcyg+ICN7JHNlbGZ9X19pbm5lcjpvbmx5LWNoaWxkKSB7XG4gICAgICBmbGV4OiAxOyAvLyBXaGVuIGluIGAuZGl0by1zY2hlbWEtaGVhZGVyYC5cblxuICAgICAgPiAjeyRzZWxmfV9faW5uZXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGluc2V0OiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgICY6OmFmdGVyIHtcbiAgICAgIC8vIFNpbmNlIDxsYWJlbD4gdXNlcyBgcG9zaXRpb246IGFic29sdXRlYCwgc2V0IGNvbnRlbnQgdG8gYSB6ZXJvLXdpZHRoXG4gICAgICAvLyBzcGFjZSBvbiBpdHMgcGFyZW50IHRvIGVuZm9yY2UgdGhlIHJpZ2h0IHRleHQgaGVpZ2h0IGluIHRoZSBjb250YWluZXJcbiAgICAgIGNvbnRlbnQ6ICdcXDIwMGInOyAvLyB6ZXJvLXdpZHRoIHNwYWNlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWluZm8ge1xuICAgIG1hcmdpbi1sZWZ0OiAwLjM1ZW07XG4gIH1cblxuICBAYXQtcm9vdCBidXR0b24jeyZ9IHtcbiAgICBib3JkZXI6IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIHRleHQtYWxpZ246IHN0YXJ0O1xuXG4gICAgJjpob3ZlciB7XG4gICAgICAuZGl0by1jaGV2cm9uIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci1kYXJrZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJjpmb2N1czpub3QoOmFjdGl2ZSwgJi0tYWN0aXZlKSB7XG4gICAgICAuZGl0by1jaGV2cm9uIHtcbiAgICAgICAgLXdlYmtpdC10ZXh0LXN0cm9rZTogJGJvcmRlci13aWR0aCAkY29sb3ItYWN0aXZlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCB7XG4gIGdldEl0ZW1Gb3JtU2NoZW1hLFxuICBnZXRJdGVtSWQsXG4gIGdldEl0ZW1VaWQsXG4gIGlzTGlzdFNvdXJjZVxufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBpc09iamVjdCwgaXNTdHJpbmcsIGlzRnVuY3Rpb24gfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtZXRob2RzOiB7XG4gICAgZ2V0SXRlbUZvcm1TY2hlbWEsXG5cbiAgICBnZXRJdGVtVWlkLFxuXG4gICAgZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSwgaW5kZXggPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1RyYW5zaWVudCAmJiBpbmRleCAhPT0gbnVsbFxuICAgICAgICA/IFN0cmluZyhpbmRleClcbiAgICAgICAgOiBnZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtKVxuICAgIH0sXG5cbiAgICBnZXRJdGVtRGF0YVBhdGgoc291cmNlU2NoZW1hLCBpbmRleCkge1xuICAgICAgbGV0IHsgZGF0YVBhdGggfSA9IHRoaXNcbiAgICAgIGlmIChzb3VyY2VTY2hlbWEgIT09IHRoaXMuc2NoZW1hKSB7XG4gICAgICAgIGRhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIHNvdXJjZVNjaGVtYS5uYW1lKVxuICAgICAgfVxuICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgZGF0YVBhdGggPSBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgaW5kZXgpXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVBhdGhcbiAgICB9LFxuXG4gICAgZ2V0SXRlbVN0b3JlKHNvdXJjZVNjaGVtYSwgaXRlbSwgaW5kZXgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENoaWxkU3RvcmUodGhpcy5nZXRJdGVtVWlkKHNvdXJjZVNjaGVtYSwgaXRlbSksIGluZGV4KVxuICAgIH0sXG5cbiAgICByZW1vdmVJdGVtU3RvcmUoc291cmNlU2NoZW1hLCBpdGVtLCBpbmRleCkge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZFN0b3JlKHRoaXMuZ2V0SXRlbVVpZChzb3VyY2VTY2hlbWEsIGl0ZW0pLCBpbmRleClcbiAgICB9LFxuXG4gICAgZmluZEl0ZW1JZEluZGV4KHNvdXJjZVNjaGVtYSwgZGF0YSwgaXRlbUlkKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaXNUcmFuc2llbnRcbiAgICAgICAgPyAvLyBGb3IgdHJhbnNpZW50IGRhdGEsIHRoZSBpbmRleCBpcyB1c2VkIGFzIHRoZSBpZFxuICAgICAgICAgIGl0ZW1JZFxuICAgICAgICA6IGRhdGE/LmZpbmRJbmRleChcbiAgICAgICAgICAgIChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICB0aGlzLmdldEl0ZW1JZChzb3VyY2VTY2hlbWEsIGl0ZW0sIGluZGV4KSA9PT0gaXRlbUlkXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgcmV0dXJuIGluZGV4ICE9PSAtMSA/IGluZGV4IDogbnVsbFxuICAgIH0sXG5cbiAgICBnZXRJdGVtTGFiZWwoc291cmNlU2NoZW1hLCBpdGVtLCB7XG4gICAgICBpbmRleCA9IG51bGwsXG4gICAgICBleHRlbmRlZCA9IGZhbHNlLFxuICAgICAgYXNPYmplY3QgPSBmYWxzZVxuICAgIH0gPSB7fSkge1xuICAgICAgY29uc3QgeyBpdGVtTGFiZWwgfSA9IHNvdXJjZVNjaGVtYVxuICAgICAgaWYgKCFpdGVtIHx8ICFleHRlbmRlZCAmJiBpdGVtTGFiZWwgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhUGF0aFxuICAgICAgY29uc3QgZ2V0RGF0YVBhdGggPSAoKSA9PlxuICAgICAgICAoZGF0YVBhdGggPz89IHRoaXMuZ2V0SXRlbURhdGFQYXRoKHNvdXJjZVNjaGVtYSwgaW5kZXgpKVxuXG4gICAgICBsZXQgZm9ybUxhYmVsXG4gICAgICBjb25zdCBnZXRGb3JtTGFiZWwgPSAoKSA9PlxuICAgICAgICAoZm9ybUxhYmVsID8/PSB0aGlzLmdldExhYmVsKFxuICAgICAgICAgIGdldEl0ZW1Gb3JtU2NoZW1hKHNvdXJjZVNjaGVtYSwgaXRlbSwgdGhpcy5jb250ZXh0KVxuICAgICAgICApKVxuXG4gICAgICBsZXQgdGV4dFxuICAgICAgbGV0IHByZWZpeFxuICAgICAgbGV0IHN1ZmZpeFxuICAgICAgaWYgKGlzRnVuY3Rpb24oaXRlbUxhYmVsKSkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IGl0ZW1MYWJlbC5jYWxsKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgIG5lc3RlZDogZmFsc2UsXG4gICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgICAgICBpbmRleCxcblxuICAgICAgICAgICAgZ2V0IGRhdGFQYXRoKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0RGF0YVBhdGgoKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0IGZvcm1MYWJlbCgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldEZvcm1MYWJlbCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICBpZiAoaXNPYmplY3QobGFiZWwpKSB7XG4gICAgICAgICAgOyh7IHRleHQsIHByZWZpeCwgc3VmZml4IH0gPSBsYWJlbClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0ID0gbGFiZWxcbiAgICAgICAgfVxuICAgICAgICAvLyBJdCdzIHVwIHRvIGBpdGVtTGFiZWwoKWAgZW50aXJlbHkgdG8gcHJvZHVjZSB0aGUgbGFiZWw6XG4gICAgICAgIGV4dGVuZGVkID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcoaXRlbUxhYmVsKSAmJiAhKGl0ZW1MYWJlbCBpbiBpdGVtKSkge1xuICAgICAgICAvLyBgaXRlbUxhYmVsYCBjYW4gYmUgYm90aCBhIGtleSwgb3Igc2ltcGx5IGEgbGFiZWwuXG4gICAgICAgIHRleHQgPSBpdGVtTGFiZWxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIExvb2sgdXAgdGhlIG5hbWUgb24gdGhlIGl0ZW0sIGJ5IHRoZXNlIHJ1bGVzOlxuICAgICAgICAvLyAxLiBJZiBgaXRlbUxhYmVsYCBpcyBhIHN0cmluZywgdXNlIGl0IGFzIHRoZSBwcm9wZXJ0eSBrZXlcbiAgICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiB0aGVyZSBhcmUgY29sdW1ucywgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3RcbiAgICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBzZWUgaWYgdGhlIGl0ZW0gaGFzIGEgcHJvcGVydHkgbmFtZWQgJ25hbWUnXG4gICAgICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gc291cmNlU2NoZW1hXG4gICAgICAgIGNvbnN0IGtleSA9IChcbiAgICAgICAgICBpc1N0cmluZyhpdGVtTGFiZWwpICYmIGl0ZW1MYWJlbCB8fFxuICAgICAgICAgIGlzTGlzdFNvdXJjZShzb3VyY2VTY2hlbWEpICYmIGNvbHVtbnMgJiYgT2JqZWN0LmtleXMoY29sdW1ucylbMF0gfHxcbiAgICAgICAgICAnbmFtZSdcbiAgICAgICAgKVxuICAgICAgICB0ZXh0ID0gaXRlbVtrZXldXG4gICAgICB9XG4gICAgICBjb25zdCBoYWRMYWJlbCA9ICEhdGV4dFxuICAgICAgLy8gSWYgbm8gbGFiZWwgd2FzIGZvdW5kIHNvIGZhciwgdHJ5IHRvIHByb2R1Y2Ugb25lIGZyb20gdGhlIGluZGV4LlxuICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICAvLyBBbHdheXMgdXNlIGV4dGVuZGVkIHN0eWxlIHdoZW4gYXV0by1nZW5lcmF0aW5nIGxhYmVscyBmcm9tIGluZGV4L2lkOlxuICAgICAgICBleHRlbmRlZCA9IHRydWVcbiAgICAgICAgdGV4dCA9XG4gICAgICAgICAgaXNMaXN0U291cmNlKHNvdXJjZVNjaGVtYSkgJiYgaW5kZXggIT09IG51bGxcbiAgICAgICAgICAgID8gKHRleHQgPSBgJHtpbmRleCArIDF9YClcbiAgICAgICAgICAgIDogJydcbiAgICAgIH1cbiAgICAgIGlmIChleHRlbmRlZCkge1xuICAgICAgICBjb25zdCBmb3JtTGFiZWwgPSBnZXRGb3JtTGFiZWwoKVxuICAgICAgICBpZiAoZm9ybUxhYmVsKSB7XG4gICAgICAgICAgLy8gSWYgYSBsYWJlbCB3YXMgcHJvdmlkZWQsIHB1dCBpbiBxdW90ZXMgd2hlbiBwcmVmaXhlZCB3aXRoIHRoZVxuICAgICAgICAgIC8vIGZvcm0gbGFiZWwgZm9yIHRoZSBleHRlbmRlZCBzdHlsZTpcbiAgICAgICAgICB0ZXh0ID0gYCR7Zm9ybUxhYmVsfSAke2hhZExhYmVsID8gYCcke3RleHR9J2AgOiB0ZXh0fWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFzT2JqZWN0XG4gICAgICAgID8gdGV4dCB8fCBwcmVmaXggfHwgc3VmZml4XG4gICAgICAgICAgPyB7IHRleHQsIHByZWZpeCwgc3VmZml4IH1cbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgOiB0ZXh0XG4gICAgfVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuc2xvdChuYW1lPVwicHJlcGVuZFwiKVxuLmRpdG8tc2NoZW1hKFxuICA6Y2xhc3M9XCJ7ICdkaXRvLXNjcm9sbC1wYXJlbnQnOiBzY3JvbGxhYmxlLCAnZGl0by1zY2hlbWEtLW9wZW4nOiBvcGVuZWQgfVwiXG4gIHYtYmluZD1cIiRhdHRyc1wiXG4pXG4gIFRlbGVwb3J0KFxuICAgIHYtaWY9XCJpc1BvcHVsYXRlZCAmJiBwYW5lbEVudHJpZXMubGVuZ3RoID4gMFwiXG4gICAgdG89XCIuZGl0by1zaWRlYmFyX190ZWxlcG9ydFwiXG4gIClcbiAgICBEaXRvUGFuZWxzKFxuICAgICAgdi1pZj1cImFjdGl2ZVwiXG4gICAgICA6cGFuZWxzPVwicGFuZWxFbnRyaWVzXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIClcbiAgVGVsZXBvcnQoXG4gICAgdi1pZj1cImhhc0hlYWRlclwiXG4gICAgOnRvPVwiaGVhZGVyVGVsZXBvcnRcIlxuICAgIDpkaXNhYmxlZD1cIiFoZWFkZXJUZWxlcG9ydFwiXG4gIClcbiAgICAuZGl0by1zY2hlbWEtaGVhZGVyKFxuICAgICAgdi1pZj1cImFjdGl2ZVwiXG4gICAgKVxuICAgICAgRGl0b0xhYmVsKFxuICAgICAgICB2LWlmPVwiaGFzTGFiZWxcIlxuICAgICAgICA6bGFiZWw9XCJsYWJlbFwiXG4gICAgICAgIDppbmZvPVwiaW5mb1wiXG4gICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgOmNvbGxhcHNpYmxlPVwiY29sbGFwc2libGVcIlxuICAgICAgICA6Y29sbGFwc2VkPVwiIW9wZW5lZFwiXG4gICAgICAgIEBvcGVuPVwib25PcGVuXCJcbiAgICAgIClcbiAgICAgIFRyYW5zaXRpb24oXG4gICAgICAgIHYtaWY9XCJ0YWJzXCJcbiAgICAgICAgbmFtZT1cImRpdG8tZmFkZVwiXG4gICAgICApXG4gICAgICAgIERpdG9UYWJzKFxuICAgICAgICAgIHYtaWY9XCJvcGVuZWRcIlxuICAgICAgICAgIHYtbW9kZWw9XCJzZWxlY3RlZFRhYlwiXG4gICAgICAgICAgOnRhYnM9XCJ0YWJzXCJcbiAgICAgICAgKVxuICAgICAgRGl0b0NsaXBib2FyZChcbiAgICAgICAgdi1pZj1cImNsaXBib2FyZFwiXG4gICAgICAgIDpjbGlwYm9hcmQ9XCJjbGlwYm9hcmRcIlxuICAgICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgIClcbiAgICAgIHNsb3QobmFtZT1cImVkaXQtYnV0dG9uc1wiKVxuICBUcmFuc2l0aW9uSGVpZ2h0KDplbmFibGVkPVwiaW5saW5lZFwiKVxuICAgIC5kaXRvLXNjaGVtYS1jb250ZW50KFxuICAgICAgdi1pZj1cIm9wZW5lZFwiXG4gICAgICByZWY9XCJjb250ZW50XCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tc2Nyb2xsJzogc2Nyb2xsYWJsZSB9XCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1pZj1cImhhc1RhYnNcIlxuICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICB2LWZvcj1cIih0YWJTY2hlbWEsIHRhYikgaW4gdGFic1wiXG4gICAgICAgICAgOmtleT1cInRhYlwiXG4gICAgICAgIClcbiAgICAgICAgICAvLy0gVE9ETzogU3dpdGNoIHRvIHYtaWYgaW5zdGVhZCBvZiB2LXNob3csIG9uY2UgdmFsaWRhdGlvbiBpc1xuICAgICAgICAgIC8vLSBkZWNvdXBsZWQgZnJvbSBjb21wb25lbnRzLlxuICAgICAgICAgIERpdG9QYW5lLmRpdG8tcGFuZV9fdGFiKFxuICAgICAgICAgICAgdi1zaG93PVwic2VsZWN0ZWRUYWIgPT09IHRhYlwiXG4gICAgICAgICAgICByZWY9XCJ0YWJzXCJcbiAgICAgICAgICAgIDp0YWI9XCJ0YWJcIlxuICAgICAgICAgICAgOnNjaGVtYT1cInRhYlNjaGVtYVwiXG4gICAgICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgICAgIDpwYWRkaW5nPVwicGFkZGluZ1wiXG4gICAgICAgICAgICA6c2luZ2xlPVwic2luZ2xlICYmICFpbmxpbmVkICYmICFoYXNNYWluUGFuZVwiXG4gICAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICA6Y29tcGFjdD1cImNvbXBhY3RcIlxuICAgICAgICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZ2VuZXJhdGVMYWJlbHNcIlxuICAgICAgICAgICAgOmFjY3VtdWxhdGVkQmFzaXM9XCJhY2N1bXVsYXRlZEJhc2lzXCJcbiAgICAgICAgICApXG4gICAgICBEaXRvUGFuZS5kaXRvLXBhbmVfX21haW4oXG4gICAgICAgIHYtaWY9XCJoYXNNYWluUGFuZVwiXG4gICAgICAgIHJlZj1cImNvbXBvbmVudHNcIlxuICAgICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpwYWRkaW5nPVwicGFkZGluZ1wiXG4gICAgICAgIDpzaW5nbGU9XCJzaW5nbGUgJiYgIWlubGluZWQgJiYgIWhhc1RhYnNcIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIDpjb21wYWN0PVwiY29tcGFjdFwiXG4gICAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImdlbmVyYXRlTGFiZWxzXCJcbiAgICAgICAgOmFjY3VtdWxhdGVkQmFzaXM9XCJhY2N1bXVsYXRlZEJhc2lzXCJcbiAgICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCIhaW5saW5lZCAmJiBpc1BvcHVsYXRlZFwiXG4gICAgICAgIG5hbWU9XCJidXR0b25zXCJcbiAgICAgIClcbiAgc2xvdChcbiAgICB2LWlmPVwiaW5saW5lZCAmJiAhaGFzSGVhZGVyXCJcbiAgICBuYW1lPVwiZWRpdC1idXR0b25zXCJcbiAgKVxuc2xvdChuYW1lPVwiYXBwZW5kXCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHtcbiAgaXNPYmplY3QsXG4gIGlzQXJyYXksXG4gIGlzRnVuY3Rpb24sXG4gIGlzUmVnRXhwLFxuICBlcXVhbHMsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoLFxuICBsYWJlbGl6ZVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgVHJhbnNpdGlvbkhlaWdodCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBDb250ZXh0TWl4aW4gZnJvbSAnLi4vbWl4aW5zL0NvbnRleHRNaXhpbi5qcydcbmltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0l0ZW1NaXhpbi5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7XG4gIGdldE5hbWVkU2NoZW1hcyxcbiAgZ2V0UGFuZWxFbnRyaWVzLFxuICBzZXREZWZhdWx0VmFsdWVzLFxuICBwcm9jZXNzRGF0YSxcbiAgaXNFbXB0eVNjaGVtYSxcbiAgaXNOZXN0ZWRcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IsIGdldFN0b3JlQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvU2NoZW1hJywge1xuICBtaXhpbnM6IFtDb250ZXh0TWl4aW4sIEl0ZW1NaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgVHJhbnNpdGlvbkhlaWdodCB9LFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRzY2hlbWFDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICB9XG4gIH0sXG5cbiAgaW5qZWN0OiBbXG4gICAgJyRzY2hlbWFQYXJlbnRDb21wb25lbnQnXG4gIF0sXG5cbiAgcHJvcHM6IHtcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIC8vIGBkYXRhU2NoZW1hYCBpcyBvbmx5IHByb3ZpZGVkIGZvciBwYW5lbHMsIHdoZXJlIHRoZSBwYW5lbCBzY2hlbWFcbiAgICAvLyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZGF0YSBzY2hlbWEgZm9yIHBhbmVscyB3aXRob3V0IG93biBkYXRhLlxuICAgIGRhdGFTY2hlbWE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBwcm9wcyA9PiBwcm9wcy5zY2hlbWEgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBpbmZvOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHBhZGRpbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgYWN0aXZlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBpbmxpbmVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb21wYWN0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY29sbGFwc2VkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY29sbGFwc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBzY3JvbGxhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaGFzT3duRGF0YTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGdlbmVyYXRlTGFiZWxzOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbGFiZWxOb2RlOiB7IHR5cGU6IEhUTUxFbGVtZW50LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgYWNjdW11bGF0ZWRCYXNpczogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgY29uc3QgeyBkYXRhIH0gPSB0aGlzLnNjaGVtYVxuICAgIHJldHVybiB7XG4gICAgICAvLyBBbGxvdyBzY2hlbWEgdG8gcHJvdmlkZSBtb3JlIGRhdGEgdGhyb3VnaCBgc2NoZW1hLmRhdGFgLCB2dWUtc3R5bGU6XG4gICAgICAuLi4oXG4gICAgICAgIGRhdGEgJiYgaXNGdW5jdGlvbihkYXRhKVxuICAgICAgICAgID8gZGF0YSh0aGlzLmNvbnRleHQpXG4gICAgICAgICAgOiBkYXRhXG4gICAgICApLFxuICAgICAgc2VsZWN0ZWRUYWI6IG51bGwsXG4gICAgICBjb21wb25lbnRzUmVnaXN0cnk6IHt9LFxuICAgICAgcGFuZXNSZWdpc3RyeToge30sXG4gICAgICBwYW5lbHNSZWdpc3RyeToge30sXG4gICAgICBzY3JvbGxQb3NpdGlvbnM6IHt9XG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbmVzdGVkKCkge1xuICAgICAgLy8gRm9yIGBDb250ZXh0TWl4aW5gOlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHNjaGVtYUNvbXBvbmVudCgpIHtcbiAgICAgIC8vIE92ZXJyaWRlIERpdG9NaXhpbidzIHNjaGVtYUNvbXBvbmVudCgpIHdoaWNoIHVzZXMgdGhlIGluamVjdGVkIHZhbHVlLlxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcGFyZW50U2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgLy8gRG9uJ3QgcmV0dXJuIHRoZSBhY3R1YWwgcGFyZW50IHNjaGVtYSBpcyB0aGlzIHNjaGVtYSBoYW5kbGVzIGl0cyBvd25cbiAgICAgIC8vIGRhdGEuIFRoaXMgcHJldmVudHMgZGVsZWdhdGluZyBldmVudHMgdG8gdGhlIHBhcmVudCwgYW5kIHJlZ2lzdGVyaW5nXG4gICAgICAvLyBjb21wb25lbnRzIHdpdGggdGhlIHBhcmVudCB0aGF0IHdvdWxkIGNhdXNlIGl0IHRvIHNldCBpc0RpcnR5IGZsYWdzLlxuICAgICAgcmV0dXJuIHRoaXMuaGFzT3duRGF0YSA/IG51bGwgOiB0aGlzLnBhcmVudENvbXBvbmVudC5zY2hlbWFDb21wb25lbnRcbiAgICB9LFxuXG4gICAgcGFuZWxFbnRyaWVzKCkge1xuICAgICAgcmV0dXJuIGdldFBhbmVsRW50cmllcyh0aGlzLnNjaGVtYS5wYW5lbHMsIHRoaXMuZGF0YVBhdGgpXG4gICAgfSxcblxuICAgIHRhYnMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnRhYnMpXG4gICAgfSxcblxuICAgIGRlZmF1bHRUYWIoKSB7XG4gICAgICBsZXQgZmlyc3QgPSBudWxsXG4gICAgICBpZiAodGhpcy50YWJzKSB7XG4gICAgICAgIGNvbnN0IHRhYnMgPSBPYmplY3QudmFsdWVzKHRoaXMudGFicykuZmlsdGVyKHRoaXMuc2hvdWxkUmVuZGVyU2NoZW1hKVxuICAgICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgZGVmYXVsdFRhYiB9IG9mIHRhYnMpIHtcbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbihkZWZhdWx0VGFiKSA/IGRlZmF1bHRUYWIodGhpcy5jb250ZXh0KSA6IGRlZmF1bHRUYWIpIHtcbiAgICAgICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgfVxuICAgICAgICAgIGZpcnN0ID8/PSBuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmaXJzdFxuICAgIH0sXG5cbiAgICByb3V0ZVRhYigpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5oYXNoPy5zbGljZSgxKSB8fCBudWxsXG4gICAgfSxcblxuICAgIGNsaXBib2FyZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYT8uY2xpcGJvYXJkID8/IG51bGxcbiAgICB9LFxuXG4gICAgaGFzSGVhZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzTGFiZWwgfHwgdGhpcy5oYXNUYWJzIHx8ICEhdGhpcy5jbGlwYm9hcmRcbiAgICB9LFxuXG4gICAgaGVhZGVyVGVsZXBvcnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1RvcExldmVsU2NoZW1hXG4gICAgICAgID8gJy5kaXRvLWhlYWRlcl9fdGVsZXBvcnQnXG4gICAgICAgIDogdGhpcy5sYWJlbE5vZGVcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlXG4gICAgcHJvY2Vzc2VkRGF0YSgpIHtcbiAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NEYXRhKHsgdGFyZ2V0OiAnc2VydmVyJywgc2NoZW1hT25seTogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBjbGlwYm9hcmREYXRhOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0RhdGEoeyB0YXJnZXQ6ICdjbGlwYm9hcmQnLCBzY2hlbWFPbmx5OiB0cnVlIH0pXG4gICAgICB9LFxuXG4gICAgICBzZXQoZGF0YSkge1xuICAgICAgICB0aGlzLnNldERhdGEoZGF0YSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xpcGJvYXJkSXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsaXBib2FyZERhdGFcbiAgICB9LFxuXG4gICAgZm9ybUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwoXG4gICAgICAgIHRoaXMuZ2V0SXRlbUZvcm1TY2hlbWEodGhpcy5zb3VyY2VTY2hlbWEsIHRoaXMuZGF0YSwgdGhpcy5jb250ZXh0KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc05lc3RlZCgpIHtcbiAgICAgIHJldHVybiBpc05lc3RlZCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgaXNEaXJ0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvbWVDb21wb25lbnQoaXQgPT4gaXQuaXNEaXJ0eSlcbiAgICB9LFxuXG4gICAgaXNUb3VjaGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc29tZUNvbXBvbmVudChpdCA9PiBpdC5pc1RvdWNoZWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmVyeUNvbXBvbmVudChpdCA9PiBpdC5pc1ZhbGlkKVxuICAgIH0sXG5cbiAgICBpc1ZhbGlkYXRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZXJ5Q29tcG9uZW50KGl0ID0+IGl0LmlzVmFsaWRhdGVkKVxuICAgIH0sXG5cbiAgICBoYXNFcnJvcnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb21lQ29tcG9uZW50KGl0ID0+IGl0Lmhhc0Vycm9ycylcbiAgICB9LFxuXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuZGF0YVxuICAgIH0sXG5cbiAgICBoYXNMYWJlbCgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMubGFiZWwgfHwgdGhpcy5jb2xsYXBzaWJsZVxuICAgIH0sXG5cbiAgICBoYXNUYWJzKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy50YWJzXG4gICAgfSxcblxuICAgIGlzVG9wTGV2ZWxTY2hlbWEoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNOZXN0ZWQgJiYgIXRoaXMuaW5saW5lZFxuICAgIH0sXG5cbiAgICBoYXNUb3BMZXZlbFRhYnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNUYWJzICYmIHRoaXMuaXNUb3BMZXZlbFNjaGVtYVxuICAgIH0sXG5cbiAgICBoYXNNYWluUGFuZSgpIHtcbiAgICAgIGNvbnN0IHsgY29tcG9uZW50cyB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIHJldHVybiAhIWNvbXBvbmVudHMgJiYgT2JqZWN0LmtleXMoY29tcG9uZW50cykubGVuZ3RoID4gMFxuICAgIH0sXG5cbiAgICBvcGVuZWQ6IGdldFN0b3JlQWNjZXNzb3IoJ29wZW5lZCcsIHtcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb2xsYXBzZWRcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbXBvbmVudHMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbXBvbmVudHNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnBhbmVzUmVnaXN0cnkpXG4gICAgfSxcblxuICAgIHBhbmVscygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucGFuZWxzUmVnaXN0cnkpXG4gICAgfSxcblxuICAgIGNvbXBvbmVudHNCeURhdGFQYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xpc3RFbnRyaWVzQnlEYXRhUGF0aCh0aGlzLmNvbXBvbmVudHNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZXNCeURhdGFQYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xpc3RFbnRyaWVzQnlEYXRhUGF0aCh0aGlzLnBhbmVzUmVnaXN0cnkpXG4gICAgfSxcblxuICAgIHBhbmVsc0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMucGFuZWxzUmVnaXN0cnkpXG4gICAgfSxcblxuICAgIHdpZGU6IGdldFNjaGVtYUFjY2Vzc29yKCd3aWRlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHNjaGVtYToge1xuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcihzY2hlbWEpIHtcbiAgICAgICAgLy8gRm9yIGZvcm1zIHdpdGggdHlwZSBkZXBlbmRpbmcgb24gbG9hZGVkIGRhdGEsIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlXG4gICAgICAgIC8vIGFjdHVhbCBzY2hlbWEgdG8gYmVjb21lIHJlYWR5IGJlZm9yZSBzZXR0aW5nIHVwIHNjaGVtYSByZWxhdGVkIHRoaW5nc1xuICAgICAgICBpZiAoIWlzRW1wdHlTY2hlbWEoc2NoZW1hKSkge1xuICAgICAgICAgIHRoaXMuc2V0dXBTY2hlbWEoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJvdXRlVGFiOiB7XG4gICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMzM5MyNpc3N1ZWNvbW1lbnQtMTE1ODQ3MDE0OVxuICAgICAgZmx1c2g6ICdwb3N0JyxcbiAgICAgIGhhbmRsZXIocm91dGVUYWIpIHtcbiAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGN1cnJlbnQgcGF0aCB0byBrbm93IGlmIHRhYiBjaGFuZ2VzIHNob3VsZCBzdGlsbCBiZVxuICAgICAgICAvLyBoYW5kbGVkLCBidXQgcmVtb3ZlIHRoZSB0cmFpbGluZyBgL2NyZWF0ZWAgb3IgYC86aWRgIGZyb20gaXQgc28gdGhhdFxuICAgICAgICAvLyB0YWJzIGluZm9ybXMgdGhhdCBzdGF5IG9wZW4gYWZ0ZXIgY3JlYXRpb24gc3RpbGwgd29yay5cbiAgICAgICAgaWYgKHRoaXMuaGFzVG9wTGV2ZWxUYWJzKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9IHJvdXRlVGFiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2VsZWN0ZWRUYWIobmV3VGFiLCBvbGRUYWIpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGFibGUpIHtcbiAgICAgICAgY29uc3QgeyBjb250ZW50IH0gPSB0aGlzLiRyZWZzXG4gICAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb25zW29sZFRhYl0gPSBjb250ZW50LnNjcm9sbFRvcFxuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgY29udGVudC5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFBvc2l0aW9uc1tuZXdUYWJdID8/IDBcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhhc1RvcExldmVsVGFicykge1xuICAgICAgICBjb25zdCB0YWIgPSB0aGlzLnNob3VsZFJlbmRlclNjaGVtYSh0aGlzLnRhYnNbbmV3VGFiXSlcbiAgICAgICAgICA/IG5ld1RhYlxuICAgICAgICAgIDogdGhpcy5kZWZhdWx0VGFiXG4gICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHtcbiAgICAgICAgICBxdWVyeTogdGhpcy4kcm91dGUucXVlcnksXG4gICAgICAgICAgaGFzaDogdGFiID8gYCMke3RhYn1gIDogbnVsbFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaGFzRXJyb3JzKSB7XG4gICAgICAgIHRoaXMucmVwb3NpdGlvbkVycm9ycygpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgICBpZiAodGhpcy5zY3JvbGxhYmxlICYmIHRoaXMud2lkZSkge1xuICAgICAgdGhpcy5hcHBTdGF0ZS5wYWdlQ2xhc3MgPSAnZGl0by1wYWdlLS13aWRlJ1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSB0aGlzLnJvdXRlVGFiIHx8IHRoaXMuZGVmYXVsdFRhYlxuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICB0aGlzLmVtaXRFdmVudCgnZGVzdHJveScpXG4gICAgdGhpcy5fcmVnaXN0ZXIoZmFsc2UpXG4gICAgaWYgKHRoaXMuc2Nyb2xsYWJsZSAmJiB0aGlzLndpZGUpIHtcbiAgICAgIHRoaXMuYXBwU3RhdGUucGFnZUNsYXNzID0gbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0dXBTY2hlbWEoKSB7XG4gICAgICB0aGlzLnNldHVwU2NoZW1hRmllbGRzKClcbiAgICAgIC8vIERlbGVnYXRlIGNoYW5nZSBldmVudHMgdGhyb3VnaCB0byBwYXJlbnQgc2NoZW1hOlxuICAgICAgdGhpcy5kZWxlZ2F0ZSgnY2hhbmdlJywgdGhpcy5wYXJlbnRTY2hlbWFDb21wb25lbnQpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnaW5pdGlhbGl6ZScpIC8vIE5vdCBgJ2NyZWF0ZSdgLCBzaW5jZSB0aGF0J3MgZm9yIGRhdGEuXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllc0J5RGF0YVBhdGgodGhpcy5jb21wb25lbnRzQnlEYXRhUGF0aCwgZGF0YVBhdGgpXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudEJ5RGF0YVBhdGgoZGF0YVBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudHNCeU5hbWUoZGF0YVBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzQnlOYW1lKHRoaXMuY29tcG9uZW50c0J5RGF0YVBhdGgsIGRhdGFQYXRoKVxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnRCeU5hbWUobmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudHMoZGF0YVBhdGhPck5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzKHRoaXMuY29tcG9uZW50c0J5RGF0YVBhdGgsIGRhdGFQYXRoT3JOYW1lKVxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnQoZGF0YVBhdGhPck5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudHMoZGF0YVBhdGhPck5hbWUpWzBdIHx8IG51bGxcbiAgICB9LFxuXG4gICAgZ2V0UGFuZWxzQnlEYXRhUGF0aChkYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJpZXNCeURhdGFQYXRoKHRoaXMucGFuZWxzQnlEYXRhUGF0aCwgZGF0YVBhdGgpXG4gICAgfSxcblxuICAgIGdldFBhbmVsQnlEYXRhUGF0aChkYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFuZWxzQnlEYXRhUGF0aChkYXRhUGF0aClbMF0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICBnZXRQYW5lbHMoZGF0YVBhdGhPck5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzKHRoaXMucGFuZWxzQnlEYXRhUGF0aCwgZGF0YVBhdGhPck5hbWUpXG4gICAgfSxcblxuICAgIGdldFBhbmVsKGRhdGFQYXRoT3JOYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQYW5lbHMoZGF0YVBhdGhPck5hbWUpWzBdIHx8IG51bGxcbiAgICB9LFxuXG4gICAgc29tZUNvbXBvbmVudChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNQb3B1bGF0ZWQgJiYgdGhpcy5jb21wb25lbnRzLnNvbWUoY2FsbGJhY2spXG4gICAgfSxcblxuICAgIGV2ZXJ5Q29tcG9uZW50KGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1BvcHVsYXRlZCAmJiB0aGlzLmNvbXBvbmVudHMuZXZlcnkoY2FsbGJhY2spXG4gICAgfSxcblxuICAgIG9uT3BlbihvcGVuKSB7XG4gICAgICB0aGlzLmVtaXRFdmVudCgnb3BlbicsIHsgY29udGV4dDogeyBvcGVuIH0gfSlcbiAgICAgIC8vIFByZXZlbnQgY2xvc2luZyB0aGUgc2NoZW1hIHdpdGggaW52YWxpZCBkYXRhLCBzaW5jZSB0aGUgaW4tY29tcG9uZW50XG4gICAgICAvLyB2YWxpZGF0aW9uIHdpbGwgbm90IGJlIGV4ZWN1dGVkIG9uY2UgaXQncyBjbG9zZWQuXG5cbiAgICAgIC8vIFRPRE86IE1vdmUgdmFsaWRhdGlvbiBvdXQgb2YgY29tcG9uZW50cywgdG8gc2NoZW1hLCBqdXN0IGxpa2VcbiAgICAgIC8vIHByb2Nlc3NpbmcsIGFuZCB1c2UgYHNob3dWYWxpZGF0aW9uRXJyb3JzKClgIGZvciB0aGUgcmVzdWx0aW5nIGVycm9ycyxcbiAgICAgIC8vIHRoZW4gcmVtb3ZlIHRoaXMgcmVxdWlyZW1lbnQsIHNpbmNlIHdlIGNhbiB2YWxpZGF0ZSBjbG9zZWQgZm9ybXMgYW5kXG4gICAgICAvLyBzY2hlbWFzIHRoZW4uXG4gICAgICBpZiAoIXRoaXMub3BlbmVkIHx8IG9wZW4gfHwgdGhpcy52YWxpZGF0ZUFsbCgpKSB7XG4gICAgICAgIHRoaXMub3BlbmVkID0gb3BlblxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdjaGFuZ2UnKVxuICAgIH0sXG5cbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHMpIHtcbiAgICAgICAgY29tcG9uZW50LnJlc2V0VmFsaWRhdGlvbigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyRXJyb3JzKCkge1xuICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5jb21wb25lbnRzKSB7XG4gICAgICAgIGNvbXBvbmVudC5jbGVhckVycm9ycygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlcG9zaXRpb25FcnJvcnMoKSB7XG4gICAgICAvLyBGaXJlIGEgZmFrZSBzY3JvbGwgZXZlbnQgdG8gZm9yY2UgdGhlIHJlcG9zaXRpb25pbmcgb2YgZXJyb3IgdG9vbHRpcHMsXG4gICAgICAvLyBhcyBvdGhlcndpc2UgdGhleSBzb21ldGltZXMgZG9uJ3Qgc2hvdyB1cCBpbiB0aGUgcmlnaHQgcGxhY2UgaW5pdGlhbGx5XG4gICAgICAvLyB3aGVuIGNoYW5naW5nIHRhYnMuXG4gICAgICBjb25zdCBzY3JvbGxDb250YWluZXIgPSB0aGlzLiRyZWZzLmNvbnRlbnQuY2xvc2VzdCgnLmRpdG8tc2Nyb2xsJylcbiAgICAgIGNvbnN0IGRpc3BhdGNoID0gKCkgPT4gc2Nyb2xsQ29udGFpbmVyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdzY3JvbGwnKSlcbiAgICAgIGRpc3BhdGNoKClcbiAgICAgIC8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gaGFuZGxlIGAmLS1sYWJlbC12ZXJ0aWNhbGAgYmFzZWQgbGF5b3V0IGNoYW5nZXMuXG4gICAgICBzZXRUaW1lb3V0KGRpc3BhdGNoLCAwKVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMub3BlbmVkID0gdHJ1ZVxuICAgICAgcmV0dXJuIHRoaXMucGFyZW50U2NoZW1hQ29tcG9uZW50Py5mb2N1cygpXG4gICAgfSxcblxuICAgIHZhbGlkYXRlQWxsKG1hdGNoLCBub3RpZnkgPSB0cnVlKSB7XG4gICAgICBjb25zdCB7IGNvbXBvbmVudHNCeURhdGFQYXRoIH0gPSB0aGlzXG4gICAgICBsZXQgZGF0YVBhdGhzXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgY2hlY2sgPSBpc0Z1bmN0aW9uKG1hdGNoKVxuICAgICAgICAgID8gbWF0Y2hcbiAgICAgICAgICA6IGlzUmVnRXhwKG1hdGNoKVxuICAgICAgICAgICAgPyBmaWVsZCA9PiBtYXRjaC50ZXN0KGZpZWxkKVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIGRhdGFQYXRocyA9IGNoZWNrXG4gICAgICAgICAgPyBPYmplY3Qua2V5cyhjb21wb25lbnRzQnlEYXRhUGF0aCkuZmlsdGVyKGNoZWNrKVxuICAgICAgICAgIDogaXNBcnJheShtYXRjaClcbiAgICAgICAgICAgID8gbWF0Y2hcbiAgICAgICAgICAgIDogW21hdGNoXVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICAgIH1cbiAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZVxuICAgICAgbGV0IGZpcnN0ID0gdHJ1ZVxuICAgICAgZGF0YVBhdGhzIHx8PSBPYmplY3Qua2V5cyhjb21wb25lbnRzQnlEYXRhUGF0aClcbiAgICAgIGZvciAoY29uc3QgZGF0YVBhdGggb2YgZGF0YVBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgaWYgKCFjb21wb25lbnQudmFsaWRhdGUobm90aWZ5KSkge1xuICAgICAgICAgICAgLy8gRm9jdXMgZmlyc3QgZXJyb3IgZmllbGRcbiAgICAgICAgICAgIGlmIChub3RpZnkgJiYgZmlyc3QpIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50LnNjcm9sbEludG9WaWV3KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2VcbiAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSAmJiAhaXNWYWxpZCkge1xuICAgICAgICB0aGlzLm5vdGlmeUVycm9ycygpXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNWYWxpZFxuICAgIH0sXG5cbiAgICB2ZXJpZnlBbGwobWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQWxsKG1hdGNoLCBmYWxzZSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cywgZmlyc3QgPSB0cnVlKSB7XG4gICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICAgIGNvbnN0IHVubWF0Y2hlZCA9IFtdXG4gICAgICBjb25zdCB3YXNGaXJzdCA9IGZpcnN0XG4gICAgICBmb3IgKGNvbnN0IFtkYXRhUGF0aCwgZXJyc10gb2YgT2JqZWN0LmVudHJpZXMoZXJyb3JzKSkge1xuICAgICAgICAvLyBJZiB0aGUgc2NoZW1hIGlzIGEgZGF0YS1yb290LCBwcmVmaXggaXRzIG93biBkYXRhUGF0aCB0byBhbGwgZXJyb3JzLFxuICAgICAgICAvLyBzaW5jZSB0aGUgZGF0YSB0aGF0IGl0IHNlbmRzIGFuZCB2YWxpZGF0ZXMgd2lsbCBiZSB1bnByZWZpeGVkLlxuICAgICAgICBjb25zdCBmdWxsRGF0YVBhdGggPSB0aGlzLmhhc093bkRhdGFcbiAgICAgICAgICA/IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIGRhdGFQYXRoKVxuICAgICAgICAgIDogZGF0YVBhdGhcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcywgdGhpcy5kYXRhUGF0aCwgdGhpcy5oYXNPd25EYXRhLCBmdWxsRGF0YVBhdGgpXG4gICAgICAgIC8vIENvbnZlcnQgZnJvbSBKYXZhU2NyaXB0IHByb3BlcnR5IGFjY2VzcyBub3RhdGlvbiwgdG8gb3VyIG93biBmb3JtXG4gICAgICAgIC8vIG9mIHJlbGF0aXZlIEpTT04gcG9pbnRlcnMgYXMgZGF0YS1wYXRoczpcbiAgICAgICAgY29uc3QgZGF0YVBhdGhQYXJ0cyA9IHBhcnNlRGF0YVBhdGgoZnVsbERhdGFQYXRoKVxuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZVxuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aFBhcnRzKVxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJzLCBmaXJzdCAmJiBmb2N1cykpIHtcbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZVxuICAgICAgICAgICAgZmlyc3QgPSBmYWxzZVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgIC8vIENvdWxkbid0IGZpbmQgYSBjb21wb25lbnQgaW4gYW4gYWN0aXZlIGZvcm0gZm9yIHRoZSBnaXZlbiBkYXRhUGF0aC5cbiAgICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSBjb21wb25lbnQgc2VydmluZyBhIHBhcnQgb2YgdGhlIGRhdGFQYXRoLFxuICAgICAgICAgIC8vIGFuZCB0YWtlIGl0IGZyb20gdGhlcmU6XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgICAgd2hpbGUgKGRhdGFQYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGhQYXJ0cylcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmF2aWdhdGVkID0gYXdhaXQgY29tcG9uZW50Lm5hdmlnYXRlVG9Db21wb25lbnQ/LihcbiAgICAgICAgICAgICAgICBmdWxsRGF0YVBhdGgsXG4gICAgICAgICAgICAgICAgc3ViQ29tcG9uZW50cyA9PiB7XG4gICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2Ygc3ViQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGVycm9ycykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgKFtkYXRhUGF0aF0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZURhdGFQYXRoKGRhdGFQYXRoKS5zdGFydHNXaXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5kYXRhUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhtYXRjaGVkKS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNob3dWYWxpZGF0aW9uRXJyb3JzKG1hdGNoZWQsIGZpcnN0ICYmIGZvY3VzKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChuYXZpZ2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCBhIG5lc3RlZCBmb3JtIHRvIGRpc3BsYXkgYXQgbGVhc3QgcGFydHMgZm8gdGhlIGVycm9ycy5cbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCBzaG93IGFsbCBlcnJvcnMgYXQgb25jZSwgc28gd2UncmUgZG9uZS4gRG9uJ3QgY2FsbFxuICAgICAgICAgICAgICAgIC8vIGBub3RpZnlFcnJvcnMoKWAgeWV0LCBhcyB3ZSBjYW4gb25seSBkaXNwbGF5IGl0IG9uY2VcbiAgICAgICAgICAgICAgICAvLyBgc2hvd1ZhbGlkYXRpb25FcnJvcnMoKWAgd2FzIGNhbGxlZCBmcm9tIGBEaXRvRm9ybS5tb3VudGVkKClgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN0aWxsIGhlcmUsIHNvIGtlZXAgcmVtb3ZpbmcgdGhlIGxhc3QgcGFydCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG4gICAgICAgICAgICBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFdoZW4gdGhlIGVycm9yIGNhbid0IGJlIG1hdGNoZWQsIGFkZCBpdCB0byBhIGxpc3Qgb2YgdW5tYXRjaGVkXG4gICAgICAgICAgLy8gZXJyb3JzIHdpdGggZGVjZW50IG1lc3NhZ2UsIHRvIHJlcG9ydCBhdCB0aGUgZW5kLlxuICAgICAgICAgIGNvbnN0IGZpZWxkID0gbGFiZWxpemUocHJvcGVydHkpXG4gICAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJycykge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gZmllbGRcbiAgICAgICAgICAgICAgPyBgVGhlIGZpZWxkICR7ZmllbGR9YFxuICAgICAgICAgICAgICA6IGBUaGUgJHt0aGlzLmZvcm1MYWJlbH1gXG4gICAgICAgICAgICB1bm1hdGNoZWQucHVzaChgJHtwcmVmaXh9ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3QgPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKHdhc0ZpcnN0ICYmICFmaXJzdCkge1xuICAgICAgICB0aGlzLm5vdGlmeUVycm9ycyh1bm1hdGNoZWQuam9pbignXFxuJykpXG4gICAgICB9XG4gICAgICByZXR1cm4gIWZpcnN0XG4gICAgfSxcblxuICAgIG5vdGlmeUVycm9ycyhtZXNzYWdlKSB7XG4gICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIHRpdGxlOiAnVmFsaWRhdGlvbiBFcnJvcnMnLFxuICAgICAgICB0ZXh0OiBtZXNzYWdlIHx8ICdQbGVhc2UgY29ycmVjdCB0aGUgaGlnaGxpZ2h0ZWQgZXJyb3JzLidcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHJlc2V0RGF0YSgpIHtcbiAgICAgIC8vIFdlIGNhbid0IHNldCBgdGhpcy5kYXRhID0gLi4uYCBiZWNhdXNlIGl0J3MgYSBwcm9wZXJ0eSwgYnV0IHdlIGNhbiBzZXRcbiAgICAgIC8vIGFsbCBrbm93biBwcm9wZXJ0aWVzIG9uIGl0IHRvIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnlcbiAgICAgIC8vIGBzZXREZWZhdWx0VmFsdWVzKClgLCBhcyB0aGV5IGFyZSBhbGwgcmVhY3RpdmUgYWxyZWFkeSBmcm9tIHRoZSBzdGFydHM6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLW11dGF0aW5nLXByb3BzXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZGF0YSwgc2V0RGVmYXVsdFZhbHVlcyh0aGlzLmRhdGFTY2hlbWEsIHt9LCB0aGlzKSlcbiAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgIH0sXG5cbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBkYXRhKSB7XG4gICAgICAgIGlmIChuYW1lIGluIHRoaXMuZGF0YSkge1xuICAgICAgICAgIGlmICghZXF1YWxzKHRoaXMuZGF0YVtuYW1lXSwgZGF0YVtuYW1lXSkpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tbXV0YXRpbmctcHJvcHNcbiAgICAgICAgICAgIHRoaXMuZGF0YVtuYW1lXSA9IGRhdGFbbmFtZV1cbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lKSkge1xuICAgICAgICAgICAgICBjb21wb25lbnQubWFya0RpcnR5KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZmlsdGVyRGF0YShkYXRhKSB7XG4gICAgICAvLyBGaWx0ZXJzIG91dCBhcnJheXMgYW5kIG9iamVjdHMgdGhhdCBhcmUgYmFja2VkIGJ5IGRhdGEgcmVzb3VyY2VzXG4gICAgICAvLyB0aGVtc2VsdmVzLCBhcyB0aG9zZSBhcmUgYWxyZWFkeSB0YWtlbiBjYXJlIG9mIHRocm91Z2ggdGhlaXIgb3duIEFQSVxuICAgICAgLy8gcmVzb3VyY2UgZW5kLXBvaW50cyBhbmQgc2hvdWxkbid0IGJlIHNldC5cbiAgICAgIGNvbnN0IGxvY2FsRGF0YSA9IHt9XG4gICAgICBjb25zdCBmb3JlaWduRGF0YSA9IHt9XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkodmFsdWUpIHx8IGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeU5hbWUobmFtZSlcbiAgICAgICAgICBpZiAoY29tcG9uZW50cy5zb21lKGNvbXBvbmVudCA9PiBjb21wb25lbnQucHJvdmlkZXNEYXRhKSkge1xuICAgICAgICAgICAgZm9yZWlnbkRhdGFbbmFtZV0gPSB2YWx1ZVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbG9jYWxEYXRhW25hbWVdID0gdmFsdWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGxvY2FsRGF0YSwgZm9yZWlnbkRhdGEgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzRGF0YSh7IHRhcmdldCA9ICdjbGlwYm9hcmQnLCBzY2hlbWFPbmx5ID0gdHJ1ZSB9ID0ge30pIHtcbiAgICAgIHJldHVybiBwcm9jZXNzRGF0YShcbiAgICAgICAgdGhpcy5kYXRhU2NoZW1hLFxuICAgICAgICB0aGlzLnNvdXJjZVNjaGVtYSxcbiAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICB0aGlzLmRhdGFQYXRoLFxuICAgICAgICB7XG4gICAgICAgICAgLy8gTmVlZGVkIGZvciBEaXRvQ29udGV4dCBoYW5kbGluZyBpbnNpZGUgYHByb2Nlc3NEYXRhYCBhbmRcbiAgICAgICAgICAvLyBgcHJvY2Vzc1NjaGVtYURhdGEoKWA6XG4gICAgICAgICAgcm9vdERhdGE6IHRoaXMucm9vdERhdGEsXG4gICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgIHNjaGVtYU9ubHksXG4gICAgICAgICAgdGFyZ2V0XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyKGFkZCkge1xuICAgICAgLy8gYCRzY2hlbWFQYXJlbnRDb21wb25lbnQoKWAgaXMgb25seSBzZXQgaWYgb25lIG9mIHRoZSBhbmNlc3RvcnMgdXNlc1xuICAgICAgLy8gdGhlIGBTY2hlbWFQYXJlbnRNaXhpbmA6XG4gICAgICB0aGlzLiRzY2hlbWFQYXJlbnRDb21wb25lbnQoKT8uX3JlZ2lzdGVyU2NoZW1hQ29tcG9uZW50KHRoaXMsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudCwgYWRkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckVudHJ5KHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5LCBjb21wb25lbnQsIGFkZClcbiAgICAgIC8vIE9ubHkgcmVnaXN0ZXIgd2l0aCB0aGUgcGFyZW50IGlmIHNjaGVtYSBzaGFyZXMgZGF0YSB3aXRoIGl0LlxuICAgICAgdGhpcy5wYXJlbnRTY2hlbWFDb21wb25lbnQ/Ll9yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyUGFuZShwYW5lLCBhZGQpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyRW50cnkodGhpcy5wYW5lc1JlZ2lzdHJ5LCBwYW5lLCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlclBhbmVsKHBhbmVsLCBhZGQpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyRW50cnkodGhpcy5wYW5lbHNSZWdpc3RyeSwgcGFuZWwsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyRW50cnkocmVnaXN0cnksIGVudHJ5LCBhZGQpIHtcbiAgICAgIGNvbnN0IHVpZCA9IGVudHJ5LiR1aWRcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgcmVnaXN0cnlbdWlkXSA9IGVudHJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgcmVnaXN0cnlbdWlkXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfbGlzdEVudHJpZXNCeURhdGFQYXRoKHJlZ2lzdHJ5KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZWdpc3RyeSkucmVkdWNlKChlbnRyaWVzQnlEYXRhUGF0aCwgZW50cnkpID0+IHtcbiAgICAgICAgLy8gTXVsdGlwbGUgZW50cmllcyBjYW4gYmUgbGlua2VkIHRvIHRoZSBzYW1lIGRhdGEtcGF0aCwgZS5nLiB3aGVuXG4gICAgICAgIC8vIHRoZXJlIGFyZSB0YWJzLiBMaW5rIGVhY2ggZGF0YS1wYXRoIHRvIGFuIGFycmF5IG9mIGVudHJpZXMuXG4gICAgICAgIGNvbnN0IHsgZGF0YVBhdGggfSA9IGVudHJ5XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSAoZW50cmllc0J5RGF0YVBhdGhbZGF0YVBhdGhdIHx8PSBbXSlcbiAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICByZXR1cm4gZW50cmllc0J5RGF0YVBhdGhcbiAgICAgIH0sIHt9KVxuICAgIH0sXG5cbiAgICBfZ2V0RW50cmllcyhlbnRyaWVzQnlEYXRhUGF0aCwgZGF0YVBhdGgpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChkYXRhUGF0aCkuc3RhcnRzV2l0aCh0aGlzLmRhdGFQYXRoKVxuICAgICAgICA/IHRoaXMuX2dldEVudHJpZXNCeURhdGFQYXRoKGVudHJpZXNCeURhdGFQYXRoLCBkYXRhUGF0aClcbiAgICAgICAgOiB0aGlzLl9nZXRFbnRyaWVzQnlOYW1lKGVudHJpZXNCeURhdGFQYXRoLCBkYXRhUGF0aClcbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXNCeURhdGFQYXRoKGVudHJpZXNCeURhdGFQYXRoLCBkYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIGVudHJpZXNCeURhdGFQYXRoW25vcm1hbGl6ZURhdGFQYXRoKGRhdGFQYXRoKV0gfHwgW11cbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXNCeU5hbWUoZW50cmllc0J5RGF0YVBhdGgsIG5hbWUpIHtcbiAgICAgIHJldHVybiBlbnRyaWVzQnlEYXRhUGF0aFthcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKV0gfHwgW11cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zY2hlbWEge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXG4gID4gLmRpdG8tc2NoZW1hLWhlYWRlciArIC5kaXRvLXNjaGVtYS1jb250ZW50ID4gLmRpdG8tcGFuZSB7XG4gICAgbWFyZ2luLXRvcDogJGZvcm0tc3BhY2luZy1oYWxmO1xuICB9XG5cbiAgJjpoYXMoPiAuZGl0by1zY2hlbWEtY29udGVudCArIC5kaXRvLWVkaXQtYnV0dG9ucykge1xuICAgIC8vIERpc3BsYXkgdGhlIGlubGluZWQgZWRpdCBidXR0b25zIHRvIHRoZSByaWdodCBvZiB0aGUgc2NoZW1hOlxuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcblxuICAgID4gLmRpdG8tZWRpdC1idXR0b25zIHtcbiAgICAgIGZsZXg6IDEgMCAwJTtcbiAgICAgIG1hcmdpbi1sZWZ0OiAkZm9ybS1zcGFjaW5nO1xuICAgIH1cbiAgfVxuXG4gID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgIGZsZXg6IDAgMSAxMDAlO1xuICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAvLyBTbyB0aGF0IHNjaGVtYSBidXR0b25zIGNhbiBiZSBzdGlja3kgdG8gdGhlIGJvdHRvbS5cbiAgICAvLyBOT1RFOiBXZSBhbHNvIG5lZWQgZ3JpZCBmb3IgYFRyYW5zaXRpb25IZWlnaHRgIHRvIHdvcmsgd2VsbC4gU3dpdGNoaW5nXG4gICAgLy8gdG8gZmxleCBib3ggaGVyZSBjYXVzZXMganVtcHkgY29sbGFwc2luZyB0cmFuc2l0aW9ucy5cbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogbWluLWNvbnRlbnQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxMDAlO1xuXG4gICAgPiA6b25seS1jaGlsZCB7XG4gICAgICBncmlkLXJvdy1lbmQ6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXNjaGVtYS1oZWFkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cbiAgLmRpdG8taGVhZGVyICYge1xuICAgIC8vIFdoZW4gdGVsZXBvcnRlZCBpbnRvIG1haW4gaGVhZGVyLlxuICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbiAgfVxuXG4gIC5kaXRvLWxhYmVsICYge1xuICAgIC8vIFdoZW4gdGVsZXBvcnRlZCBpbnRvIGNvbnRhaW5lciBsYWJlbC5cbiAgICBmbGV4OiAxO1xuICB9XG5cbiAgPiAuZGl0by1sYWJlbCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxuXG4gID4gLmRpdG8tYnV0dG9ucyB7XG4gICAgbWFyZ2luLWxlZnQ6IHZhcigtLWJ1dHRvbi1tYXJnaW4sIDApO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9TY2hlbWEuZGl0by1zY2hlbWEtaW5saW5lZChcbiAgOnNjaGVtYT1cInNjaGVtYVwiXG4gIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgOmRhdGE9XCJkYXRhXCJcbiAgOm1ldGE9XCJtZXRhXCJcbiAgOnN0b3JlPVwic3RvcmVcIlxuICA6bGFiZWw9XCJpc0NvbXBhY3QgPyBudWxsIDogbGFiZWxcIlxuICA6aW5mbz1cImluZm9cIlxuICA6cGFkZGluZz1cInBhZGRpbmcgPz8gJ2lubGluZWQnXCJcbiAgOmlubGluZWQ9XCJ0cnVlXCJcbiAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICA6Y29tcGFjdD1cImlzQ29tcGFjdFwiXG4gIDpjb2xsYXBzZWQ9XCJjb2xsYXBzZWRcIlxuICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gIDpnZW5lcmF0ZUxhYmVscz1cIiFpc0NvbXBhY3RcIlxuICA6bGFiZWxOb2RlPVwibGFiZWxOb2RlXCJcbiAgOmFjY3VtdWxhdGVkQmFzaXM9XCJhY2N1bXVsYXRlZEJhc2lzXCJcbilcbiAgLy8tIFJlbmRlciBkaXRvLWVkaXQtYnV0dG9ucyBmb3IgaW5saW5lZCBzY2hlbWFzIHNlcGFyYXRlbHkgZnJvbSBhbGxcbiAgLy8tIG90aGVycyBpbiBgVHlwZUxpc3RgIGFzIGEgc2NvcGUsIGZvciBiZXR0ZXIgaGFuZGxpbmcgb2YgbGF5b3V0LlxuICB0ZW1wbGF0ZSgjZWRpdC1idXR0b25zKVxuICAgIERpdG9FZGl0QnV0dG9ucyhcbiAgICAgIHYtaWY9XCJkZWxldGFibGUgfHwgZHJhZ2dhYmxlIHx8IGVkaXRhYmxlXCJcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICA6ZGVsZXRhYmxlPVwiZGVsZXRhYmxlXCJcbiAgICAgIDpkcmFnZ2FibGU9XCJkcmFnZ2FibGVcIlxuICAgICAgOmVkaXRhYmxlPVwiZWRpdGFibGVcIlxuICAgICAgOmVkaXRQYXRoPVwiZWRpdFBhdGhcIlxuICAgICAgQGRlbGV0ZT1cIiRlbWl0KCdkZWxldGUnKVwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBpc0NvbXBhY3QgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9TY2hlbWFJbmxpbmVkJywge1xuICBlbWl0czogWydkZWxldGUnXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBsYWJlbDogeyB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgaW5mbzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBwYWRkaW5nOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgY29sbGFwc2VkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY29sbGFwc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkcmFnZ2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBlZGl0YWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRlbGV0YWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGVkaXRQYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGxhYmVsTm9kZTogeyB0eXBlOiBIVE1MRWxlbWVudCwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGFjY3VtdWxhdGVkQmFzaXM6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGlzQ29tcGFjdCgpIHtcbiAgICAgIHJldHVybiBpc0NvbXBhY3QodGhpcy5zY2hlbWEpXG4gICAgfSxcblxuICAgIGhhc0xhYmVsKCkge1xuICAgICAgcmV0dXJuICF0aGlzLmlzQ29tcGFjdCAmJiAhIXRoaXMubGFiZWxcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zY2hlbWEtaW5saW5lZCB7XG4gIC8vIFVzZSBncmlkIGxheW91dCBmb3IgdHdvIHJlYXNvbnM6IEZvciBgVHJhbnNpdGlvbkhlaWdodGAgdG8gd29yayBzbW9vdGhseSxcbiAgLy8gYW5kIHRvIGFsaWduIHRoZSBoZWFkZXIgYWJvdmUgdGhlIGNvbnRlbnQgd2hlbiB0aGUgaGVhZGVyIGlzIG5vdCB0ZWxlcG9ydGVkXG4gIC8vIG91dHNpZGUgb2YgdGhlIHNjaGVtYS5cbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBtaW4tY29udGVudDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxMDAlO1xuXG4gICY6bm90KDpob3ZlciwgLmRpdG8tc2NoZW1hLS1vcGVuKSB7XG4gICAgPiAuZGl0by1zY2hlbWEtaGVhZGVyIHtcbiAgICAgID4gLmRpdG8tY2xpcGJvYXJkIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZS9uby10ZW1wbGF0ZS1zaGFkb3cgLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcGFuZShcbiAgdi1pZj1cImlzUG9wdWxhdGVkICYmIGNvbXBvbmVudFNjaGVtYXMubGVuZ3RoID4gMFwiXG4gIHYtcmVzaXplPVwib25SZXNpemVQYW5lXCJcbiAgOmNsYXNzPVwiY2xhc3Nlc1wiXG4pXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPWB7XG4gICAgICBzY2hlbWEsXG4gICAgICBkYXRhUGF0aCxcbiAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgbmVzdGVkLFxuICAgICAgc3RvcmVcbiAgICB9LCBpbmRleCBpbiBjb21wb25lbnRTY2hlbWFzYFxuICApXG4gICAgLy8tIFVzZSA8c3Bhbj4gZm9yIC5kaXRvLXBhbmVfX2JyZWFrIHNvIHdlIGNhbiB1c2UgdGhlXG4gICAgLy8tIGAuZGl0by1jb250YWluZXI6Zmlyc3Qtb2YtdHlwZWAgc2VsZWN0b3IuXG4gICAgc3Bhbi5kaXRvLXBhbmVfX2JyZWFrKFxuICAgICAgdi1pZj1cIlsnYmVmb3JlJywgJ2JvdGgnXS5pbmNsdWRlcyhzY2hlbWEuYnJlYWspXCJcbiAgICApXG4gICAgRGl0b0NvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXJTY2hlbWEoc2NoZW1hKVwiXG4gICAgICByZWY9XCJjb250YWluZXJzXCJcbiAgICAgIDprZXk9XCJuZXN0ZWREYXRhUGF0aFwiXG4gICAgICA6ZGF0YS1pbmRleD1cImluZGV4XCJcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICA6c2luZ2xlPVwiaXNTaW5nbGVDb21wb25lbnRcIlxuICAgICAgOm5lc3RlZD1cIm5lc3RlZFwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICA6Y29tcGFjdD1cImNvbXBhY3RcIlxuICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZ2VuZXJhdGVMYWJlbHNcIlxuICAgICAgOnZlcnRpY2FsTGFiZWxzPVwiaXNJbkxhYmVsZWRSb3coaW5kZXgpXCJcbiAgICAgIDphY2N1bXVsYXRlZEJhc2lzPVwiYWNjdW11bGF0ZWRCYXNpc1wiXG4gICAgKVxuICAgIHNwYW4uZGl0by1wYW5lX19icmVhayhcbiAgICAgIHYtaWY9XCJbJ2FmdGVyJywgJ2JvdGgnXS5pbmNsdWRlcyhzY2hlbWEuYnJlYWspXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBDb250ZXh0TWl4aW4gZnJvbSAnLi4vbWl4aW5zL0NvbnRleHRNaXhpbi5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGlzTmVzdGVkIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9QYW5lJywge1xuICBtaXhpbnM6IFtDb250ZXh0TWl4aW5dLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0YWJDb21wb25lbnQ6ICgpID0+IHRoaXMudGFiQ29tcG9uZW50XG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGFiOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHBhZGRpbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb21wYWN0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhY2N1bXVsYXRlZEJhc2lzOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb25zOiBbXVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG5lc3RlZCgpIHtcbiAgICAgIC8vIEZvciBgQ29udGV4dE1peGluYDpcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBjbGFzc2VzKCkge1xuICAgICAgY29uc3QgcHJlZml4ID0gJ2RpdG8tcGFuZSdcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtgJHtwcmVmaXh9LS1zaW5nbGVgXTogdGhpcy5pc1NpbmdsZUNvbXBvbmVudCxcbiAgICAgICAgW2Ake3ByZWZpeH0tLXBhZGRpbmctJHt0aGlzLnBhZGRpbmd9YF06ICEhdGhpcy5wYWRkaW5nXG4gICAgICB9XG4gICAgfSxcblxuICAgIHRhYkNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYiA/IHRoaXMgOiB0aGlzLiR0YWJDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRTY2hlbWFzKCkge1xuICAgICAgLy8gQ29tcHV0ZSBhIGNvbXBvbmVudHMgbGlzdCB3aGljaCBoYXMgdGhlIGRhdGFQYXRoIGJha2VkIGludG8gaXRzIGtleXNcbiAgICAgIC8vIGFuZCBhZGRzIHRoZSBrZXkgYXMgdGhlIG5hbWUgdG8gZWFjaCBjb21wb25lbnQsIHVzZWQgZm9yIGxhYmVscywgZXRjLlxuICAgICAgLy8gTk9URTogc2NoZW1hIGNhbiBiZSBudWxsIHdoaWxlIG11bHRpLWZvcm0gbGlzdHMgbG9hZCB0aGVpciBkYXRhLFxuICAgICAgLy8gYmVjYXVzZSBvbmx5IHRoZSBhdmFpbGFibGUgZGF0YSB3aWxsIGRldGVybWluZSB0aGUgdHlwZSBvZiBmb3JtLlxuICAgICAgLy8gV2hlbiBlZGl0aW5nIHByaW1pdGl2ZSB2YWx1ZXMgdGhyb3VnaCBhIGZvcm0sIGRvIG5vdCBhcHBlbmQgJ25hbWUnIHRvXG4gICAgICAvLyB0aGUgY29tcG9uZW50J3MgZGF0YVBhdGggc28gaXQgY2FuIGJlIG1hcHBlZCB0byBmcm9tIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgICAgLy8gTk9URTogTm90IGFsbCBzY2hlbWFzIC8gY29tcG9uZW50cyBoYXZlIGEgc291cmNlU2NoZW1hLCBlLmcuIGRpYWxvZ3MuXG4gICAgICBjb25zdCB3cmFwUHJpbWl0aXZlcyA9IHRoaXMuc291cmNlU2NoZW1hPy53cmFwUHJpbWl0aXZlc1xuICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuc2NoZW1hPy5jb21wb25lbnRzIHx8IHt9KS5tYXAoXG4gICAgICAgIChbbmFtZSwgc2NoZW1hXSkgPT4ge1xuICAgICAgICAgIC8vIEFsd2F5cyBhZGQgbmFtZSB0byBjb21wb25lbnQgc2NoZW1hLCBidXQgY2xvbmUgaXQgZmlyc3QgdG8gYXZvaWRcbiAgICAgICAgICAvLyBtdXRhdGluZyB0aGUgb3JpZ2luYWwgc2NoZW1hIHBvdGVudGlhbGx5IHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzLlxuICAgICAgICAgIHNjaGVtYSA9IHsgLi4uc2NoZW1hLCBuYW1lIH1cbiAgICAgICAgICAvLyBTaGFyZSBkYXRhUGF0aCBhbmQgc3RvcmUgd2l0aCBwYXJlbnQgaWYgbm90IG5lc3RlZDpcbiAgICAgICAgICBjb25zdCBuZXN0ZWQgPSBpc05lc3RlZChzY2hlbWEpXG4gICAgICAgICAgY29uc3QgbmVzdGVkRGF0YVBhdGggPSBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICAgICAgbmVzdGVkICYmICF3cmFwUHJpbWl0aXZlc1xuICAgICAgICAgICAgICAgID8gbmVzdGVkRGF0YVBhdGhcbiAgICAgICAgICAgICAgICA6IHRoaXMuZGF0YVBhdGgsXG4gICAgICAgICAgICBuZXN0ZWREYXRhUGF0aCxcbiAgICAgICAgICAgIG5lc3RlZCxcbiAgICAgICAgICAgIHN0b3JlOiB0aGlzLmdldENoaWxkU3RvcmUobmFtZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9LFxuXG4gICAgaXNTaW5nbGVDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaW5nbGUgJiYgdGhpcy5jb21wb25lbnRTY2hlbWFzLmxlbmd0aCA9PT0gMVxuICAgIH0sXG5cbiAgICB2ZXJ0aWNhbExhYmVsc0J5SW5kaWNlcygpIHtcbiAgICAgIGNvbnN0IHsgcG9zaXRpb25zIH0gPSB0aGlzXG5cbiAgICAgIGNvbnN0IGlzTGFzdEluUm93ID0gaW5kZXggPT4gKFxuICAgICAgICBwb3NpdGlvbnNbaW5kZXhdICYmIChcbiAgICAgICAgICBpbmRleCA9PT0gcG9zaXRpb25zLmxlbmd0aCAtIDEgfHxcbiAgICAgICAgICBmaW5kTmV4dFBvc2l0aW9uKGluZGV4KS50b3AgPiBwb3NpdGlvbnNbaW5kZXhdLnRvcFxuICAgICAgICApXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGZpbmROZXh0UG9zaXRpb24gPSBpbmRleCA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleCArIDE7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAocG9zaXRpb25zW2ldKSByZXR1cm4gcG9zaXRpb25zW2ldXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93cyA9IFtdXG4gICAgICBsZXQgcm93ID0gW11cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwb3NpdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHJvdy5wdXNoKGluZGV4KVxuICAgICAgICBpZiAoaXNMYXN0SW5Sb3coaW5kZXgpKSB7XG4gICAgICAgICAgcm93cy5wdXNoKHJvdylcbiAgICAgICAgICByb3cgPSBbXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocm93Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgcm93cy5wdXNoKHJvdylcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmVydGljYWxMYWJlbHNCeUluZGljZXMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGxldCBoYXNMYWJlbHNJblJvdyA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggb2Ygcm93KSB7XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uc1tpbmRleF1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwb3NpdGlvbj8uaGVpZ2h0ID4gMiAmJiAoXG4gICAgICAgICAgICAgIHBvc2l0aW9uLm5vZGUubWF0Y2hlcygnOmhhcyg+IC5kaXRvLWxhYmVsKScpIHx8XG4gICAgICAgICAgICAgIHBvc2l0aW9uLm5vZGVcbiAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLmRpdG8tY29udGFpbmVyJylcbiAgICAgICAgICAgICAgICAubWF0Y2hlcygnLmRpdG8tY29udGFpbmVyLS1sYWJlbC12ZXJ0aWNhbCcpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgbmVzdGVkIHNjaGVtYXMsIGUuZy4gJ3NlY3Rpb24nIG9yICdvYmplY3QnIGFuZFxuICAgICAgICAgICAgLy8gZGV0ZWN0IGxhYmVscyB0aGVyZSB0b28uXG4gICAgICAgICAgICBoYXNMYWJlbHNJblJvdyA9IHRydWVcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggb2Ygcm93KSB7XG4gICAgICAgICAgdmVydGljYWxMYWJlbHNCeUluZGljZXNbaW5kZXhdID0gaGFzTGFiZWxzSW5Sb3dcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmVydGljYWxMYWJlbHNCeUluZGljZXNcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICAnY29tcG9uZW50U2NoZW1hcy5sZW5ndGgnKGxlbmd0aCkge1xuICAgICAgdGhpcy5wb3NpdGlvbnMubGVuZ3RoID0gbGVuZ3RoXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIoZmFsc2UpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIF9yZWdpc3RlcihhZGQpIHtcbiAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50Ll9yZWdpc3RlclBhbmUodGhpcywgYWRkKVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIGlmICh0aGlzLnRhYikge1xuICAgICAgICByZXR1cm4gdGhpcy4kcm91dGVyLnB1c2goeyBoYXNoOiBgIyR7dGhpcy50YWJ9YCB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvblJlc2l6ZVBhbmUoKSB7XG4gICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHRoaXMuJHJlZnMuY29udGFpbmVycykge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSBjb250YWluZXIuJGVsXG4gICAgICAgICAgY29uc3QgaW5kZXggPSArbm9kZS5kYXRhc2V0LmluZGV4XG4gICAgICAgICAgY29uc3QgYm91bmRzID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKVxuICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmcpXG4gICAgICAgICAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KHN0eWxlLmZvbnRTaXplKVxuICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGJvdW5kcy5oZWlnaHQgLSAyICogcGFkZGluZ1xuICAgICAgICAgIHRoaXMucG9zaXRpb25zW2luZGV4XSA9XG4gICAgICAgICAgICBoZWlnaHQgPD0gMFxuICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICB0b3A6IGJvdW5kcy55LFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLyBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgIG5vZGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGlzSW5MYWJlbGVkUm93KGluZGV4KSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZlcnRpY2FsTGFiZWxzQnlJbmRpY2VzW2luZGV4XVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhbmUge1xuICAkc2VsZjogJjtcbiAgJHJvb3QtcGFkZGluZzogJGNvbnRlbnQtcGFkZGluZyAtICRmb3JtLXNwYWNpbmctaGFsZjtcblxuICAtLXBhbmUtcGFkZGluZzogMHB4O1xuICAtLWNvbnRhaW5lci1wYWRkaW5nOiAjeyRmb3JtLXNwYWNpbmctaGFsZn07XG5cbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbGV4LWZsb3c6IHJvdyB3cmFwO1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDtcbiAgLy8gUmVtb3ZlIHRoZSBwYWRkaW5nIGFkZGVkIGJ5IGAuZGl0by1jb250YWluZXJgIGluc2lkZSBgLmRpdG8tcGFuZWA6XG4gIG1hcmdpbjogLSRmb3JtLXNwYWNpbmctaGFsZjtcbiAgcGFkZGluZzogdmFyKC0tcGFuZS1wYWRkaW5nKTtcbiAgLy8gVXNlIGBmbGV4OiAwJWAgZm9yIGFsbCBgLmRpdG8tcGFuZWAgZXhjZXB0IGAuZGl0by1wYW5lX19tYWluYCxcbiAgLy8gc28gdGhhdCB0aGUgYC5kaXRvLWJ1dHRvbnMtLW1haW5gIGNhbiBiZSBtb3ZlZCBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tLlxuICBmbGV4OiAwJTtcblxuICAmX19tYWluIHtcbiAgICBmbGV4OiAxMDAlO1xuICB9XG5cbiAgJi0tcGFkZGluZy1yb290IHtcbiAgICAvLyBBIHJvb3QtbGV2ZWwgcGFuZSBpbnNpZGUgYSBzY3JvbGwgdmlldy4gQ2xlYXIgbmVnYXRpdmUgbWFyZ2luIGZyb20gYWJvdmUuXG4gICAgbWFyZ2luOiAwO1xuICAgIC8vIE1vdmUgdGhlIG5lZ2F0aXZlIG1hcmdpbiB1c2VkIHRvIHJlbW92ZSB0aGUgcGFkZGluZyBhZGRlZCBieVxuICAgIC8vIGAuZGl0by1jb250YWluZXJgIGluc2lkZSBgLmRpdG8tcGFuZWAgdG8gdGhlIHBhZGRpbmc6XG4gICAgLS1wYW5lLXBhZGRpbmc6ICN7JHJvb3QtcGFkZGluZ307XG5cbiAgICAmI3skc2VsZn0tLXNpbmdsZSB7XG4gICAgICAtLXBhbmUtcGFkZGluZzogI3skY29udGVudC1wYWRkaW5nfTtcbiAgICAgIC0tY29udGFpbmVyLXBhZGRpbmc6IDBweDtcbiAgICB9XG5cbiAgICAmOmhhcyg+IC5kaXRvLWNvbnRhaW5lci0tbGFiZWwtdmVydGljYWw6Zmlyc3Qtb2YtdHlwZSkge1xuICAgICAgLy8gUmVkdWNlIHRvcCBzcGFjaW5nIHdoZW4gdGhlIGZpcnN0IHJvdyBoYXMgbGFiZWxzLlxuICAgICAgbWFyZ2luLXRvcDogLSRmb3JtLXNwYWNpbmctaGFsZjtcbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IGEgcnVsZXIgYmV0d2VlbiB0YWJiZWQgY29tcG9uZW50cyBhbmQgdG93YXJkcyB0aGUgLmRpdG8tYnV0dG9uc1xuICAgICZfX3RhYiArICZfX21haW4ge1xuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgLy8gVXNlIGEgcHNldWRvIGVsZW1lbnQgdG8gZGlzcGxheSBhIHJ1bGVyIHdpdGggcHJvcGVyIG1hcmdpbnNcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogJGJvcmRlci1zdHlsZTtcbiAgICAgICAgLy8gU2hpZnQgcnVsZXIgdXAgYnkgJHJvb3QtcGFkZGluZyB0byBleGNsdWRlIHJlbW92ZWQgJGZvcm0tc3BhY2luZy1oYWxmXG4gICAgICAgIG1hcmdpbjogKC0kcm9vdC1wYWRkaW5nKSAkZm9ybS1zcGFjaW5nLWhhbGYgJHJvb3QtcGFkZGluZztcbiAgICAgICAgcGFkZGluZzogJGZvcm0tc3BhY2luZy1oYWxmO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX21haW4gKyAuZGl0by1idXR0b25zLS1tYWluIHtcbiAgICAgIC8vIE5lZWRlZCBmb3JtcyB3aXRoIHN0aWNreSBtYWluIGJ1dHRvbnMuXG4gICAgICBtYXJnaW46ICRjb250ZW50LXBhZGRpbmc7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIH1cbiAgfVxuXG4gICYtLXBhZGRpbmctaW5saW5lZCB7XG4gICAgLS1wYW5lLXBhZGRpbmc6IDBweDtcbiAgfVxuXG4gICYtLXBhZGRpbmctbmVzdGVkIHtcbiAgICAtLXBhbmUtcGFkZGluZzogI3skZm9ybS1zcGFjaW5nfTtcblxuICAgICY6aGFzKD4gLmRpdG8tY29udGFpbmVyLS1sYWJlbC12ZXJ0aWNhbDpmaXJzdC1vZi10eXBlKSB7XG4gICAgICAvLyBSZWR1Y2UgdG9wIHNwYWNpbmcgd2hlbiB0aGUgZmlyc3Qgcm93IGhhcyBsYWJlbHMuXG4gICAgICBwYWRkaW5nLXRvcDogJGZvcm0tc3BhY2luZy1oYWxmO1xuICAgIH1cbiAgfVxuXG4gICZfX2JyZWFrIHtcbiAgICAvLyBgJl9icmVha2AgaXMgcmVuZGVyZWQgYXMgPHNwYW4+IHNvIHdlIGNhbiB1c2UgdGhlXG4gICAgLy8gYC5kaXRvLWNvbnRhaW5lcjpmaXJzdC1vZi10eXBlYCBzZWxlY3RvciB0byBtYXRjaCB0aGUgZmlyc3QgY29udGFpbmVyXG4gICAgLy8gZXZlbiBpZiBpdCBoYXMgYSBicmVhayBiZWZvcmUgaXQuXG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgZmxleDogMTAwJTtcbiAgICBoZWlnaHQ6IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZyYWN0aW9uKHZhbHVlKSB7XG4gIGNvbnN0IG1hdGNoID0gKFxuICAgIGlzU3RyaW5nKHZhbHVlKSAmJlxuICAgIHZhbHVlLm1hdGNoKC9eXFxzKihbKy1dP1xcZCspXFxzKlxcL1xccyooWystXT9cXGQrKVxccyokLylcbiAgKVxuICBpZiAobWF0Y2gpIHtcbiAgICBjb25zdCBbLCBkaXZpZGVuZCwgZGl2aXNvcl0gPSBtYXRjaFxuICAgIHJldHVybiBwYXJzZUZsb2F0KGRpdmlkZW5kKSAvIHBhcnNlRmxvYXQoZGl2aXNvcilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSlcbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNvbnRhaW5lcihcbiAgdi1zaG93PVwiY29tcG9uZW50VmlzaWJsZVwiXG4gIDpjbGFzcz1cImNvbnRhaW5lckNsYXNzZXNcIlxuICA6c3R5bGU9XCJjb250YWluZXJTdHlsZXNcIlxuKVxuICBUZWxlcG9ydChcbiAgICB2LWlmPVwiaXNNb3VudGVkICYmIHBhbmVsRW50cmllcy5sZW5ndGggPiAwXCJcbiAgICB0bz1cIi5kaXRvLXNpZGViYXJfX3RlbGVwb3J0XCJcbiAgKVxuICAgIERpdG9QYW5lbHMoXG4gICAgICA6cGFuZWxzPVwicGFuZWxFbnRyaWVzXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIClcbiAgRGl0b0xhYmVsKFxuICAgIHYtaWY9XCJoYXNMYWJlbFwiXG4gICAgOmNsYXNzPVwibGFiZWxDbGFzc2VzXCJcbiAgICA6ZGF0YVBhdGg9XCJsYWJlbERhdGFQYXRoXCJcbiAgICA6bGFiZWw9XCJsYWJlbFwiXG4gICAgOmluZm89XCJpbmZvXCJcbiAgKVxuICBjb21wb25lbnQuZGl0by1jb21wb25lbnQoXG4gICAgdi1pZj1cIiEoaGFzTGFiZWwgJiYgaXNMYWJlbClcIlxuICAgIDppcz1cInR5cGVDb21wb25lbnRcIlxuICAgIHJlZj1cImNvbXBvbmVudFwiXG4gICAgOmNsYXNzPVwiY29tcG9uZW50Q2xhc3Nlc1wiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOndpZHRoPVwid2lkdGhcIlxuICAgIDpsYWJlbD1cImxhYmVsXCJcbiAgICA6c2luZ2xlPVwic2luZ2xlXCJcbiAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICA6YWNjdW11bGF0ZWRCYXNpcz1cImNvbWJpbmVkQmFzaXNcIlxuICAgIEBlcnJvcnM9XCJvbkVycm9yc1wiXG4gICAgQHVwZGF0ZTpjb21wb25lbnQ9XCJ2YWx1ZSA9PiAoY29tcG9uZW50ID0gdmFsdWUpXCJcbiAgKVxuICBEaXRvRXJyb3JzKDplcnJvcnM9XCJlcnJvcnNcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc1N0cmluZywgaXNOdW1iZXIgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBWYWx1ZU1peGluIGZyb20gJy4uL21peGlucy9WYWx1ZU1peGluLmpzJ1xuaW1wb3J0IENvbnRleHRNaXhpbiBmcm9tICcuLi9taXhpbnMvQ29udGV4dE1peGluLmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7XG4gIGdldEFsbFBhbmVsRW50cmllcyxcbiAgZ2V0VHlwZUNvbXBvbmVudCxcbiAgaGFzTGFiZWwsXG4gIG9taXRTcGFjaW5nXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IHBhcnNlRnJhY3Rpb24gfSBmcm9tICcuLi91dGlscy9tYXRoLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Db250YWluZXInLCB7XG4gIG1peGluczogW1ZhbHVlTWl4aW4sIENvbnRleHRNaXhpbl0sXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIG5lc3RlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBjb21wYWN0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB2ZXJ0aWNhbExhYmVsczogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGFjY3VtdWxhdGVkQmFzaXM6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcnM6IG51bGwsXG4gICAgICAvLyBUaGUgbmVzdGVkIHR5cGUgY29tcG9uZW50IGluc3RhbmNlLCBmb3IgY29udGV4dC1iYXNlZCBzY2hlbWEgYWNjZXNzb3JcbiAgICAgIC8vIGV2YWx1YXRpb24uXG4gICAgICBjb21wb25lbnQ6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjb250ZXh0KCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dChcbiAgICAgICAgLy8gV2hlbiBhdmFpbGFibGUsIHVzZSB0aGUgdHlwZSBjb21wb25lbnQgZm9yIGNvbnRleHQtYmFzZWQgc2NoZW1hXG4gICAgICAgIC8vIGFjY2Vzc29ycywgYnV0IGZhbGwgYmFjayB0byBjb250YWluZXIuXG4gICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGFyY2hpdGVjdHVyYWwgaW52ZXJzaW9uIHRvIGVsaW1pbmF0ZSB0aW1pbmcgaXNzdWVzOlxuICAgICAgICAvLyAtIFR5cGUgY29tcG9uZW50cyByZW5kZXIgRGl0b0NvbnRhaW5lciBhdCB0aGVpciByb290XG4gICAgICAgIC8vIC0gUGFzcyB0eXBlIGNvbXBvbmVudCBjb250ZW50IHRocm91Z2ggY29udGFpbmVyJ3MgZGVmYXVsdCBzbG90XG4gICAgICAgIC8vIC0gRGl0b1BhbmUvRGl0b0J1dHRvbnMgcmVuZGVyIHR5cGUgY29tcG9uZW50cyBkaXJlY3RseVxuICAgICAgICAvLyAtIEVsaW1pbmF0ZXMgbmVlZCBmb3IgY29tcG9uZW50IGluc3RhbmNlIHN5bmNocm9uaXphdGlvblxuICAgICAgICAvLyAtIFByb3ZpZGVzIHRydWUgc3luY2hyb25vdXMgYWNjZXNzIHRvIGNvbXBvbmVudCBjb250ZXh0XG4gICAgICAgIHRoaXMuY29tcG9uZW50ID8/IHRoaXMsXG4gICAgICAgIHsgbmVzdGVkOiB0aGlzLm5lc3RlZCB9XG4gICAgICApXG4gICAgfSxcblxuICAgIG5hbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEubmFtZVxuICAgIH0sXG5cbiAgICB0eXBlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnR5cGVcbiAgICB9LFxuXG4gICAgdHlwZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiBnZXRUeXBlQ29tcG9uZW50KHRoaXMudHlwZSlcbiAgICB9LFxuXG4gICAgaXNMYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdsYWJlbCdcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gaGFzTGFiZWwodGhpcy5zY2hlbWEsIHRoaXMuZ2VuZXJhdGVMYWJlbHMpXG4gICAgfSxcblxuICAgIGxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzTGFiZWwgPyB0aGlzLmdldExhYmVsKHRoaXMuc2NoZW1hKSA6IG51bGxcbiAgICB9LFxuXG4gICAgbGFiZWxEYXRhUGF0aCgpIHtcbiAgICAgIC8vIFVubmVzdGVkIHR5cGVzIGRvbid0IGhhdmUgYSBkYXRhUGF0aCBmb3IgdGhlbXNlbHZlcywgZG9uJ3QgdXNlIGl0OlxuICAgICAgcmV0dXJuIHRoaXMubmVzdGVkID8gdGhpcy5kYXRhUGF0aCA6IG51bGxcbiAgICB9LFxuXG4gICAgaW5mbzogZ2V0U2NoZW1hQWNjZXNzb3IoJ2luZm8nLCB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICB3aWR0aDogZ2V0U2NoZW1hQWNjZXNzb3IoJ3dpZHRoJywge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVDb21wb25lbnQ/LmRlZmF1bHRXaWR0aFxuICAgICAgfSxcbiAgICAgIGdldCh3aWR0aCkge1xuICAgICAgICAvLyBVc2UgMTAwJSA9PSAxLjAgYXMgZGVmYXVsdCB3aWR0aCB3aGVuIG5vdGhpbmcgaXMgc2V0OlxuICAgICAgICByZXR1cm4gd2lkdGggPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gMS4wXG4gICAgICAgICAgOiBpc1N0cmluZyh3aWR0aClcbiAgICAgICAgICAgID8gd2lkdGgubWF0Y2goL15cXHMqWzw+XT9cXHMqKC4qKSQvKVsxXSAvLyBSZW1vdmUgd2lkdGggb3BlcmF0b3JcbiAgICAgICAgICAgIDogd2lkdGhcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIHdpZHRoT3BlcmF0b3I6IGdldFNjaGVtYUFjY2Vzc29yKCd3aWR0aCcsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGdldCh3aWR0aCkge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcod2lkdGgpXG4gICAgICAgICAgPyB3aWR0aC5tYXRjaCgvXlxccyooWzw+XT8pLylbMV0gfHwgbnVsbFxuICAgICAgICAgIDogbnVsbFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50VmlzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Zpc2libGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZUNvbXBvbmVudD8uZGVmYXVsdFZpc2libGVcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbXBvbmVudERpc2FibGVkOiBnZXRTY2hlbWFBY2Nlc3NvcignZGlzYWJsZWQnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIGRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGZsZXhHcm93KCkge1xuICAgICAgLy8gSW50ZXJwcmV0ICc+NTAlJyBhcyAnNTAlLCBmbGV4LWdyb3c6IDFgXG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLndpZHRoT3BlcmF0b3IgPT09ICc+JyB8fFxuICAgICAgICB0aGlzLndpZHRoID09PSAnZmlsbCdcbiAgICAgIClcbiAgICB9LFxuXG4gICAgZmxleFNocmluaygpIHtcbiAgICAgIC8vIEludGVycHJldCAnPDUwJScgYXMgJzUwJSwgZmxleC1zaHJpbms6IDFgXG4gICAgICByZXR1cm4gdGhpcy53aWR0aE9wZXJhdG9yID09PSAnPCdcbiAgICB9LFxuXG4gICAgZmxleEJhc2lzKCkge1xuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoXG4gICAgICAvLyAnYXV0bycgPSBubyBmaXR0aW5nOlxuICAgICAgcmV0dXJuIFtudWxsLCAnYXV0bycsICdmaWxsJ10uaW5jbHVkZXMod2lkdGgpXG4gICAgICAgID8gJ2F1dG8nXG4gICAgICAgIDogLyUkLy50ZXN0KHdpZHRoKVxuICAgICAgICAgID8gcGFyc2VGbG9hdCh3aWR0aCkgLyAxMDAgLy8gcGVyY2VudGFnZSAtPiBmcmFjdGlvblxuICAgICAgICAgIDogL1thLXpdLy50ZXN0KHdpZHRoKVxuICAgICAgICAgICAgPyB3aWR0aCAvLyBuYXRpdmUgdW5pdHNcbiAgICAgICAgICAgIDogcGFyc2VGcmFjdGlvbih3aWR0aCkgLy8gZnJhY3Rpb25cbiAgICB9LFxuXG4gICAgY29tYmluZWRCYXNpcygpIHtcbiAgICAgIGNvbnN0IHsgYWNjdW11bGF0ZWRCYXNpcywgZmxleEJhc2lzIH0gPSB0aGlzXG4gICAgICByZXR1cm4gaXNOdW1iZXIoYWNjdW11bGF0ZWRCYXNpcykgJiYgaXNOdW1iZXIoZmxleEJhc2lzKVxuICAgICAgICA/IGFjY3VtdWxhdGVkQmFzaXMgKiBmbGV4QmFzaXNcbiAgICAgICAgOiBudWxsXG4gICAgfSxcblxuICAgIGNvbnRhaW5lckNsYXNzZXMoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBjbGFzc2VzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgY29uc3QgcHJlZml4ID0gJ2RpdG8tY29udGFpbmVyJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLWRpc2FibGVkYF06IHRoaXMuY29tcG9uZW50RGlzYWJsZWQsXG4gICAgICAgIFtgJHtwcmVmaXh9LS1oYXMtZXJyb3JzYF06ICEhdGhpcy5lcnJvcnMsXG4gICAgICAgIFtgJHtwcmVmaXh9LS1zaW5nbGVgXTogdGhpcy5zaW5nbGUsXG4gICAgICAgIFtgJHtwcmVmaXh9LS1jb21wYWN0YF06IHRoaXMuY29tcGFjdCxcbiAgICAgICAgW2Ake3ByZWZpeH0tLWxhYmVsLXZlcnRpY2FsYF06IHRoaXMudmVydGljYWxMYWJlbHMsXG4gICAgICAgIFtgJHtwcmVmaXh9LS1vbWl0LXNwYWNpbmdgXTogb21pdFNwYWNpbmcodGhpcy5zY2hlbWEpLFxuICAgICAgICAuLi4oaXNTdHJpbmcoY2xhc3NlcykgPyB7IFtjbGFzc2VzXTogdHJ1ZSB9IDogY2xhc3NlcylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY29udGFpbmVyU3R5bGVzKCkge1xuICAgICAgY29uc3QgeyBmbGV4QmFzaXMsIGNvbWJpbmVkQmFzaXMgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7XG4gICAgICAgICctLWdyb3cnOiB0aGlzLmZsZXhHcm93ID8gMSA6IDAsXG4gICAgICAgICctLXNocmluayc6IHRoaXMuZmxleFNocmluayA/IDEgOiAwLFxuICAgICAgICAnLS1iYXNpcyc6IGlzTnVtYmVyKGZsZXhCYXNpcykgPyBgJHtmbGV4QmFzaXMgKiAxMDB9JWAgOiBmbGV4QmFzaXMsXG4gICAgICAgICctLWJhc2lzLW1vYmlsZSc6XG4gICAgICAgICAgaXNOdW1iZXIoY29tYmluZWRCYXNpcykgJiYgY29tYmluZWRCYXNpcyA8PSAwLjI1XG4gICAgICAgICAgICA/IGAke2ZsZXhCYXNpcyAqIDIwMH0lYFxuICAgICAgICAgICAgOiBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXBvbmVudENsYXNzZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jb21wb25lbnQtLXNpbmdsZSc6IHRoaXMuc2luZ2xlLFxuICAgICAgICAuLi50aGlzLmdldExheW91dENsYXNzZXMoJ2RpdG8tY29tcG9uZW50JylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbGFiZWxDbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tbGFiZWwtLXZpc2libGUnOiB0aGlzLmlzTGFiZWwsXG4gICAgICAgIC4uLnRoaXMuZ2V0TGF5b3V0Q2xhc3NlcygnZGl0by1sYWJlbCcpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHBhbmVsRW50cmllcygpIHtcbiAgICAgIHJldHVybiBnZXRBbGxQYW5lbEVudHJpZXMoXG4gICAgICAgIHRoaXMuYXBpLFxuICAgICAgICB0aGlzLnNjaGVtYSxcbiAgICAgICAgdGhpcy5kYXRhUGF0aCxcbiAgICAgICAgdGhpcy4kcmVmcy5jb21wb25lbnQsXG4gICAgICAgIHRoaXMudGFiQ29tcG9uZW50XG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRMYXlvdXRDbGFzc2VzKHByZWZpeCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLWZpbGxgXTogdGhpcy53aWR0aCA9PT0gJ2ZpbGwnIHx8IHRoaXMuZmxleEJhc2lzICE9PSAnYXV0bycsXG4gICAgICAgIFtgJHtwcmVmaXh9LS1ncm93YF06IHRoaXMuZmxleEdyb3csXG4gICAgICAgIFtgJHtwcmVmaXh9LS1zaHJpbmtgXTogdGhpcy5mbGV4U2hyaW5rXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uRXJyb3JzKGVycm9ycykge1xuICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnNcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jb250YWluZXIge1xuICAtLWdyb3c6IDA7XG4gIC0tc2hyaW5rOiAxO1xuICAtLWJhc2lzOiBhdXRvO1xuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleDogdmFyKC0tZ3JvdykgdmFyKC0tc2hyaW5rKSB2YXIoLS1iYXNpcyk7XG4gIGZsZXgtZmxvdzogY29sdW1uO1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLy8gVG8gcHJldmVudCBsaXN0IHRhYmxlcyBmcm9tIGJsb3dpbmcgb3V0IG9mIHRoZWlyIGZsZXggYm94IGNvbnRhaW5lcnMuXG4gIG1heC13aWR0aDogMTAwJTtcbiAgLy8gQ2Fubm90IHVzZSBtYXJnaW4gaGVyZSBhcyBpdCBuZWVkcyB0byBiZSBwYXJ0IG9mIGJveC1zaXppbmcgZm9yXG4gIC8vIHBlcmNlbnRhZ2VzIGluIGZsZXgtYmFzaXMgdG8gd29yay5cbiAgcGFkZGluZzogdmFyKC0tY29udGFpbmVyLXBhZGRpbmcpO1xuXG4gID4gLmRpdG8tbGFiZWw6bm90KC5kaXRvLWxhYmVsLS12aXNpYmxlKTpvbmx5LWNoaWxkIHtcbiAgICAvLyBVc2VkIGUuZy4gd2hlbiBzb3VyY2VzIGhpZGUgdGhlbXNlbHZlcyBkdWUgdG8gbWF4RGVwdGgsIGJ1dCB0aGUgbGFiZWxcbiAgICAvLyBpcyByZW5kZXJlZCBhYm92ZSBpdC5cbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgJjplbXB0eSB7XG4gICAgcGFkZGluZzogMDtcbiAgfVxuXG4gIC5kaXRvLXBhbmUgPiAmIHtcbiAgICAuZGl0by1wYWdlLS13aWR0aC04MCAmIHtcbiAgICAgIGZsZXgtZ3JvdzogMTtcbiAgICAgIGZsZXgtYmFzaXM6IHZhcigtLWJhc2lzLW1vYmlsZSwgdmFyKC0tYmFzaXMpKTtcbiAgICAgIC8vIERFQlVHOiBiYWNrZ3JvdW5kOiB5ZWxsb3c7XG4gICAgfVxuXG4gICAgLmRpdG8tcGFnZS0td2lkdGgtNjAgJiB7XG4gICAgICBmbGV4LWJhc2lzOiBjYWxjKDIgKiB2YXIoLS1iYXNpcykpO1xuICAgICAgLy8gREVCVUc6IGJhY2tncm91bmQ6IG9yYW5nZTtcbiAgICB9XG5cbiAgICAuZGl0by1zaWRlYmFyLS13aWR0aC05OSAmIHtcbiAgICAgIGZsZXgtZ3JvdzogMTtcbiAgICAgIC8vIERFQlVHOiBiYWNrZ3JvdW5kOiB5ZWxsb3c7XG4gICAgfVxuXG4gICAgLmRpdG8tc2lkZWJhci0td2lkdGgtNjAgJiB7XG4gICAgICBmbGV4LWJhc2lzOiBjYWxjKDIgKiB2YXIoLS1iYXNpcykpO1xuICAgICAgLy8gREVCVUc6IGJhY2tncm91bmQ6IG9yYW5nZTtcbiAgICB9XG4gIH1cblxuICAmLS1zaW5nbGUge1xuICAgIGhlaWdodDogMTAwJTsgLy8gU28gdGhhdCBsaXN0IGJ1dHRvbnMgY2FuIGJlIHN0aWNreSBhdCB0aGUgYm90dG9tO1xuICB9XG5cbiAgJi0tbGFiZWwtdmVydGljYWwge1xuICAgIC8vIEZvciBwbGFpbiBjb21wb25lbnRzIHdpdGhvdXQgbGFiZWxzIGluIHJvd3Mgd2l0aCBvdGhlciBjb21wb25lbnRzIHRoYXRcbiAgICAvLyBoYXZlIGxhYmVscywgYWRkIHNvbWUgc3BhY2luZyB0byB0aGUgdG9wIHRvIGFsaWduIHdpdGggdGhlIG90aGVyXG4gICAgLy8gY29tcG9uZW50cyAoZS5nLiAgYnV0dG9ucyk6XG4gICAgPiAuZGl0by1jb21wb25lbnQ6Zmlyc3QtY2hpbGQ6bm90KC5kaXRvLXNlY3Rpb24sIC5kaXRvLWxpc3QsIC5kaXRvLW9iamVjdCkge1xuICAgICAgbWFyZ2luLXRvcDogJGlucHV0LWhlaWdodDtcbiAgICB9XG4gIH1cblxuICAmLS1jb21wYWN0Om5vdCgmLS1sYWJlbC12ZXJ0aWNhbCkge1xuICAgIC8vIERpc3BsYXkgbGFiZWxzIGluIGNvbXBhY3Qgc2NoZW1hIGFzIGlubGluZS1ibG9ja3MsIHRvIGFsbG93IGNvbXBhY3RcbiAgICAvLyBsYXlvdXRzIHdpdGggYHdpZHRoOiAnYXV0bydgIGVsZW1lbnRzOlxuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1mbG93OiByb3cgd3JhcDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG5cbiAgJi0tb21pdC1zcGFjaW5nIHtcbiAgICBwYWRkaW5nOiAwO1xuXG4gICAgPiAuZGl0by1sYWJlbCB7XG4gICAgICBtYXJnaW46ICRmb3JtLXNwYWNpbmctaGFsZiAkZm9ybS1zcGFjaW5nLWhhbGYgMDtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tY29tcG9uZW50IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICYtLWZpbGwge1xuICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgJi5kaXRvLWNoZWNrYm94LFxuICAgICYuZGl0by1yYWRpby1idXR0b24ge1xuICAgICAgLy8gV2ViS2l0IGRvZXNuJ3QgbGlrZSBjaGFuZ2VkIHdpZHRoIG9uIGNoZWNrYm94ZXMgYW5kIHJhZGlvcywgb3ZlcnJpZGU6XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICB3aWR0aDogYXV0bztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdGFic1xuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cIih0YWJTY2hlbWEsIGtleSkgaW4gdGFic1wiXG4gIClcbiAgICBhLmRpdG8tdGFic19fbGluayhcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXJTY2hlbWEodGFiU2NoZW1hKVwiXG4gICAgICA6a2V5PVwia2V5XCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tdGFic19fbGluay0tYWN0aXZlJzogbW9kZWxWYWx1ZSA9PT0ga2V5IH1cIlxuICAgICAgQGNsaWNrPVwiJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywga2V5KVwiXG4gICAgKSB7eyBnZXRMYWJlbCh0YWJTY2hlbWEsIGtleSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9UYWJzJywge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuICBwcm9wczoge1xuICAgIHRhYnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQHVzZSAnc2Fzczpjb2xvcic7XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10YWJzIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAmX19saW5rIHtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGluIG1haW4gaGVhZGVyOlxuICAgIC5kaXRvLWhlYWRlciAmIHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodDtcbiAgICAgIHBhZGRpbmc6ICR0YWItcGFkZGluZy12ZXIgJHRhYi1wYWRkaW5nLWhvcjtcbiAgICAgIG1hcmdpbi1sZWZ0OiAkdGFiLW1hcmdpbjtcbiAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6ICR0YWItcmFkaXVzO1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICR0YWItcmFkaXVzO1xuXG4gICAgICAmOmFjdGl2ZSB7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodGVzdDtcbiAgICAgIH1cblxuICAgICAgJi0tYWN0aXZlIHtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0ZXN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gaW5zaWRlIGEgaW5saW5lIHNjaGVtYTpcbiAgICAuZGl0by1zY2hlbWEtaW5saW5lZCAmLFxuICAgIC5kaXRvLWxhYmVsICYge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0ZXI7XG4gICAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcbiAgICAgIG1hcmdpbi1sZWZ0OiAtJGJvcmRlci13aWR0aDtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cbiAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkdGFiLXJhZGl1cztcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogJHRhYi1yYWRpdXM7XG4gICAgICB9XG5cbiAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAkdGFiLXJhZGl1cztcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICR0YWItcmFkaXVzO1xuICAgICAgfVxuXG4gICAgICAmOmFjdGl2ZSB7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodGVyO1xuICAgICAgfVxuXG4gICAgICAmLS1hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgICBib3JkZXItY29sb3I6IGNvbG9yLmFkanVzdCgkY29sb3ItYWN0aXZlLCAkbGlnaHRuZXNzOiAtMTAlKTtcbiAgICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgICAgei1pbmRleDogMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuZGl0by1zY2hlbWEgJiB7XG4gICAgLy8gUHVzaCBjbGlwYm9hcmQgdG8gdGhlIHJpZ2h0IGluIHRoZSBmbGV4IGxheW91dCwgc2VlOlxuICAgIC8vIGh0dHBzOi8vY29kZXBlbi5pby90aG9sZXgvcGVuL2h2ZUJ4L1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuXG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIG1hcmdpbi1yaWdodDogYXV0bztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLy8tIE9ubHkgc2hvdyBwYW5lbHMgaW4gdGFicyB3aGVuIHRoZSB0YWJzIGFyZSBhbHNvIHZpc2libGUuXG5jb21wb25lbnQuZGl0by1wYW5lbChcbiAgdi1pZj1cInNob3VsZFJlbmRlclNjaGVtYShwYW5lbFNjaGVtYSlcIlxuICB2LXNob3c9XCJ2aXNpYmxlICYmICghcGFuZWxUYWJDb21wb25lbnQgfHwgcGFuZWxUYWJDb21wb25lbnQudmlzaWJsZSlcIlxuICA6aXM9XCJwYW5lbFRhZ1wiXG4gIEBzdWJtaXQucHJldmVudFxuKVxuICBEaXRvU2NoZW1hLmRpdG8tcGFuZWxfX3NjaGVtYShcbiAgICA6c2NoZW1hPVwicGFuZWxTY2hlbWFcIlxuICAgIDpkYXRhU2NoZW1hPVwicGFuZWxEYXRhU2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJwYW5lbERhdGFQYXRoXCJcbiAgICA6ZGF0YT1cInBhbmVsRGF0YVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgcGFkZGluZz1cIm5lc3RlZFwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIDpoYXNPd25EYXRhPVwiaGFzT3duRGF0YVwiXG4gICAgZ2VuZXJhdGVMYWJlbHNcbiAgKVxuICAgIHRlbXBsYXRlKCNwcmVwZW5kKVxuICAgICAgaDIuZGl0by1wYW5lbF9faGVhZGVyKDpjbGFzcz1cInsgJ2RpdG8tcGFuZWxfX2hlYWRlci0tc3RpY2t5Jzogc3RpY2t5IH1cIilcbiAgICAgICAgc3BhbiB7eyBnZXRMYWJlbChzY2hlbWEpIH19XG4gICAgICAgIERpdG9CdXR0b25zLmRpdG8tYnV0dG9ucy0tc21hbGwoXG4gICAgICAgICAgOmJ1dHRvbnM9XCJwYW5lbEJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgIDpkYXRhUGF0aD1cInBhbmVsRGF0YVBhdGhcIlxuICAgICAgICAgIDpkYXRhPVwicGFuZWxEYXRhXCJcbiAgICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIClcbiAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgIERpdG9CdXR0b25zKFxuICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJwYW5lbERhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJwYW5lbERhdGFcIlxuICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgQ29udGV4dE1peGluIGZyb20gJy4uL21peGlucy9Db250ZXh0TWl4aW4uanMnXG5pbXBvcnQgVmFsaWRhdG9yTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1ZhbGlkYXRvck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmVsJywge1xuICBtaXhpbnM6IFtDb250ZXh0TWl4aW4sIFZhbGlkYXRvck1peGluXSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkcGFuZWxDb21wb25lbnQ6ICgpID0+IHRoaXMsXG4gICAgICAkdGFiQ29tcG9uZW50OiAoKSA9PiB0aGlzLnBhbmVsVGFiQ29tcG9uZW50XG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFuZWxUYWJDb21wb25lbnQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvd25EYXRhOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbmVzdGVkKCkge1xuICAgICAgLy8gRm9yIGBDb250ZXh0TWl4aW5gOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgcGFuZWxDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYW5lbFRhYkNvbXBvbmVudFxuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIGdldEJ1dHRvblNjaGVtYXModGhpcy5zY2hlbWEuYnV0dG9ucylcbiAgICB9LFxuXG4gICAgcGFuZWxCdXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIGdldEJ1dHRvblNjaGVtYXModGhpcy5zY2hlbWEucGFuZWxCdXR0b25zKVxuICAgIH0sXG5cbiAgICBoYXNPd25EYXRhKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5vd25EYXRhXG4gICAgfSxcblxuICAgIHBhbmVsRGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm93bkRhdGEgfHwgdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIHBhbmVsU2NoZW1hKCkge1xuICAgICAgaWYgKHRoaXMuaGFzT3duRGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbW92ZSBgZGF0YWAgZnJvbSB0aGUgc2NoZW1hLCBzbyB0aGF0IERpdG9TY2hlbWEgaXNuJ3QgdXNpbmcgaXQgdG9cbiAgICAgICAgLy8gcHJvZHVjZSBpdHMgb3duIGRhdGEuIFNlZSAkZmlsdGVycyBwYW5lbCBmb3IgbW9yZSBkZXRhaWxzIG9uIGRhdGEuXG4gICAgICAgIGNvbnN0IHsgZGF0YSwgLi4uc2NoZW1hIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgICByZXR1cm4gc2NoZW1hXG4gICAgICB9XG4gICAgfSxcblxuICAgIHBhbmVsVGFnKCkge1xuICAgICAgLy8gUGFuZWxzIHRoYXQgcHJvdmlkZSB0aGVpciBvd24gZGF0YSBuZWVkIHRoZWlyIG93biBmb3JtLlxuICAgICAgcmV0dXJuIHRoaXMuaGFzT3duRGF0YSA/ICdmb3JtJyA6ICdkaXYnXG4gICAgfSxcblxuICAgIHBhbmVsRGF0YVNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc093bkRhdGEgPyB0aGlzLnNjaGVtYSA6IHRoaXMuc2NoZW1hQ29tcG9uZW50LnNjaGVtYVxuICAgIH0sXG5cbiAgICBwYW5lbERhdGFQYXRoKCkge1xuICAgICAgLy8gSWYgdGhlIHBhbmVsIHByb3ZpZGVzIGl0cyBvd24gZGF0YSwgdGhlbiBpdCBuZWVkcyB0byBwcmVmaXggYWxsXG4gICAgICAvLyBjb21wb25lbnRzIHdpdGggaXRzIGRhdGEtcGF0aCwgYnV0IGlmIGl0IHNoYXJlcyBkYXRhIHdpdGggdGhlIHNjaGVtYVxuICAgICAgLy8gY29tcG9uZW50LCB0aGVuIGl0IHNob3VsZCBzaGFyZSB0aGUgZGF0YS1wYXRoIG5hbWUgc3BhY2UgdG9vLlxuICAgICAgcmV0dXJuIHRoaXMuaGFzT3duRGF0YSA/IHRoaXMuZGF0YVBhdGggOiB0aGlzLnNjaGVtYUNvbXBvbmVudC5kYXRhUGF0aFxuICAgIH0sXG5cbiAgICB2aXNpYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigndmlzaWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSksXG5cbiAgICBzdGlja3k6IGdldFNjaGVtYUFjY2Vzc29yKCdzdGlja3knLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgICAvLyBOT1RFOiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBgc2NoZW1hLmRhdGFgIGhhbmRsaW5nIGluIERpdG9TY2hlbWEsXG4gICAgLy8gd2hlcmUgdGhlIGRhdGEgaXMgYWRkZWQgdG8gdGhlIGFjdHVhbCBjb21wb25lbnQuXG4gICAgY29uc3QgeyBkYXRhIH0gPSB0aGlzLnNjaGVtYVxuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLm93bkRhdGEgPSBpc0Z1bmN0aW9uKGRhdGEpXG4gICAgICAgID8gZGF0YSh0aGlzLmNvbnRleHQpXG4gICAgICAgIDogZGF0YVxuICAgIH1cbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIoZmFsc2UpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIF9yZWdpc3RlcihhZGQpIHtcbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSBwYW5lbHMgc28gdGhhdCBvdGhlciBjb21wb25lbnRzIGNhbiBmaW5kIHRoZW0gYnkgdGhlaXJcbiAgICAgIC8vIGRhdGEtcGF0aCwgZS5nLiBpbiBUeXBlTGlzdC5vbkZpbHRlckVycm9ycygpXG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudC5fcmVnaXN0ZXJQYW5lbCh0aGlzLCBhZGQpXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tcGFuZWwge1xuICAmOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgIG1hcmdpbi1ib3R0b206ICRjb250ZW50LXBhZGRpbmc7XG4gIH1cblxuICAmX19oZWFkZXIge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICAgIGJhY2tncm91bmQ6ICRidXR0b24tY29sb3I7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcblxuICAgICYtLXN0aWNreSB7XG4gICAgICAkbWFyZ2luOiAkaW5wdXQtaGVpZ2h0LWZhY3RvciAqICRsaW5lLWhlaWdodCAqICRmb250LXNpemUtc21hbGwgK1xuICAgICAgICAkZm9ybS1zcGFjaW5nO1xuXG4gICAgICBwb3NpdGlvbjogc3RpY2t5O1xuICAgICAgdG9wOiAkY29udGVudC1wYWRkaW5nO1xuICAgICAgbWFyZ2luLWJvdHRvbTogJG1hcmdpbjtcbiAgICAgIHotaW5kZXg6IDE7XG5cbiAgICAgICYgKyAqIHtcbiAgICAgICAgbWFyZ2luLXRvcDogLSRtYXJnaW47XG4gICAgICB9XG5cbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29udGVudC1jb2xvci1iYWNrZ3JvdW5kO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAkY29udGVudC1wYWRkaW5nO1xuICAgICAgICB0b3A6IC0kY29udGVudC1wYWRkaW5nO1xuICAgICAgICBtYXJnaW46IC0kYm9yZGVyLXdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5kaXRvLWJ1dHRvbnMge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgcmlnaHQ6ICRpbnB1dC1wYWRkaW5nLXZlcjtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgIH1cbiAgfVxuXG4gICZfX3NjaGVtYSB7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICAgIGJhY2tncm91bmQ6ICRjb250ZW50LWNvbG9yLWJhY2tncm91bmQ7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICAgIGJvcmRlci10b3A6IDA7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuXG4gICAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgICAuZGl0by1vYmplY3Qge1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG5cbiAgICAgID4gLmRpdG8tYnV0dG9ucyB7XG4gICAgICAgIC0tYnV0dG9uLW1hcmdpbjogI3skZm9ybS1zcGFjaW5nfTtcblxuICAgICAgICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nO1xuXG4gICAgICAgIC5kaXRvLWNvbnRhaW5lciB7XG4gICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC5kaXRvLWxhYmVsIHtcbiAgICAgIGxhYmVsIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcGFuZWxzKFxuICB2LWlmPVwicGFuZWxzLmxlbmd0aCA+IDBcIlxuKVxuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cInsgc2NoZW1hLCBkYXRhUGF0aCwgdGFiQ29tcG9uZW50IH0gaW4gcGFuZWxzXCJcbiAgKVxuICAgIERpdG9QYW5lbChcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXJTY2hlbWEoc2NoZW1hKVwiXG4gICAgICA6a2V5PVwiZ2V0UGFuZWxLZXkoZGF0YVBhdGgsIHRhYkNvbXBvbmVudClcIlxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUoc2NoZW1hLm5hbWUpXCJcbiAgICAgIDpkaXNhYmxlZD1cInNjaGVtYS5kaXNhYmxlZCA/PyBkaXNhYmxlZFwiXG4gICAgICA6cGFuZWxUYWJDb21wb25lbnQ9XCJ0YWJDb21wb25lbnRcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IENvbnRleHRNaXhpbiBmcm9tICcuLi9taXhpbnMvQ29udGV4dE1peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9QYW5lbHMnLCB7XG4gIG1peGluczogW0NvbnRleHRNaXhpbl0sXG5cbiAgcHJvcHM6IHtcbiAgICBwYW5lbHM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkYXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbmVzdGVkKCkge1xuICAgICAgLy8gRm9yIGBDb250ZXh0TWl4aW5gOlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRQYW5lbEtleShkYXRhUGF0aCwgdGFiQ29tcG9uZW50KSB7XG4gICAgICAvLyBBbGxvdyBzZXBhcmF0ZSB0YWJzIHRvIHVzZSBwYW5lbHMgb2YgdGhlIHNhbWUgbmFtZSwgYnlcbiAgICAgIC8vIHByZWZpeGluZyB0aGVpciBrZXkgd2l0aCB0aGUgdGFiIG5hbWUuXG4gICAgICByZXR1cm4gdGFiQ29tcG9uZW50ID8gYCR7dGFiQ29tcG9uZW50LnRhYn1fJHtkYXRhUGF0aH1gIDogZGF0YVBhdGhcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYW5lbHMge1xuICBtYXJnaW46ICRjb250ZW50LXBhZGRpbmc7XG4gIG1hcmdpbi1sZWZ0OiAkZm9ybS1zcGFjaW5nO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1idXR0b25zKFxuICB2LWlmPVwiYnV0dG9uU2NoZW1hcyB8fCBoYXNTbG90Q29udGVudCgkc2xvdHMuZGVmYXVsdClcIlxuKVxuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cIihidXR0b25TY2hlbWEsIGJ1dHRvbkRhdGFQYXRoKSBpbiBidXR0b25TY2hlbWFzXCJcbiAgKVxuICAgIERpdG9Db250YWluZXIoXG4gICAgICB2LWlmPVwic2hvdWxkUmVuZGVyU2NoZW1hKGJ1dHRvblNjaGVtYSlcIlxuICAgICAgOmtleT1cImJ1dHRvbkRhdGFQYXRoXCJcbiAgICAgIDpzY2hlbWE9XCJidXR0b25TY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiYnV0dG9uRGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUoYnV0dG9uU2NoZW1hLm5hbWUpXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICApXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPVwidm5vZGUgb2YgJHNsb3RzLmRlZmF1bHQ/LigpXCJcbiAgKVxuICAgIC8vLSBSZW5kZXIgZWFjaCBub2RlIGluIHRoZSBkZWZhdWx0IHNsb3QgdGhyb3VnaCBgZGl0by12bm9kZWAsXG4gICAgLy8tIHNvIGl0IGNhbiBiZSB3cmFwcGVkIGluIGEgYC5kaXRvLWNvbnRhaW5lcmAgY2xhc3MuXG4gICAgLmRpdG8tY29udGFpbmVyKFxuICAgICAgdi1pZj1cImhhc1ZOb2RlQ29udGVudCh2bm9kZSlcIlxuICAgIClcbiAgICAgIERpdG9Wbm9kZSg6dm5vZGU9XCJ2bm9kZVwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgQ29udGV4dE1peGluIGZyb20gJy4uL21peGlucy9Db250ZXh0TWl4aW4uanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBoYXNTbG90Q29udGVudCwgaGFzVk5vZGVDb250ZW50IH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0J1dHRvbnMnLCB7XG4gIG1peGluczogW0NvbnRleHRNaXhpbl0sXG5cbiAgcHJvdmlkZToge1xuICAgICR0YWJDb21wb25lbnQ6ICgpID0+IG51bGxcbiAgfSxcblxuICBwcm9wczoge1xuICAgIGJ1dHRvbnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBuZXN0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGJ1dHRvblNjaGVtYXMoKSB7XG4gICAgICAvLyBDb21wdXRlIGEgYnV0dG9ucyBsaXN0IHdoaWNoIGhhcyB0aGUgZGF0YVBhdGggYmFrZWQgaW50byBpdHMga2V5cy5cbiAgICAgIGNvbnN0IHsgZGF0YVBhdGgsIGJ1dHRvbnMgfSA9IHRoaXNcbiAgICAgIHJldHVybiBidXR0b25zXG4gICAgICAgID8gT2JqZWN0LnZhbHVlcyhidXR0b25zKS5yZWR1Y2UoKHNjaGVtYXMsIGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgc2NoZW1hc1thcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgYnV0dG9uLm5hbWUpXSA9IGJ1dHRvblxuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYXNcbiAgICAgICAgICB9LCB7fSlcbiAgICAgICAgOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYXNTbG90Q29udGVudCxcbiAgICBoYXNWTm9kZUNvbnRlbnRcbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi5kaXRvLWJ1dHRvbnMge1xuICA+IC5kaXRvLWNvbnRhaW5lciB7XG4gICAgcGFkZGluZzogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4vLy0gU2V0IGBAY2xpY2suc3RvcGAgdG8gcHJldmVudCBjbGljayBldmVudHMgZnJvbSBidWJibGluZyB0byBkaXRvLWxhYmVsLlxuRGl0b0J1dHRvbnMuZGl0by1lZGl0LWJ1dHRvbnMuZGl0by1idXR0b25zLS1yb3VuZChcbiAgOmJ1dHRvbnM9XCJidXR0b25zXCJcbiAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICA6ZGF0YT1cImRhdGFcIlxuICA6bWV0YT1cIm1ldGFcIlxuICA6c3RvcmU9XCJzdG9yZVwiXG4gIDpuZXN0ZWQ9XCJuZXN0ZWRcIlxuICBAY2xpY2suc3RvcFxuKVxuICAvLy0gRmlyZWZveCBkb2Vzbid0IGxpa2UgPGJ1dHRvbj4gaGVyZSwgc28gdXNlIDxhPiBpbnN0ZWFkOlxuICBhLmRpdG8tYnV0dG9uKFxuICAgIHYtaWY9XCJkcmFnZ2FibGVcIlxuICAgIDpjbGFzcz1cInsgJ2RpdG8tYnV0dG9uLS1kaXNhYmxlZCc6IGlzRHJhZ2dhYmxlRGlzYWJsZWQgfVwiXG4gICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kcmFnKVwiXG4gIClcbiAgUm91dGVyTGluay5kaXRvLWJ1dHRvbihcbiAgICB2LWlmPVwiZWRpdGFibGVcIlxuICAgIDpjbGFzcz1cInsgJ2RpdG8tYnV0dG9uLS1kaXNhYmxlZCc6IGlzRWRpdGFibGVEaXNhYmxlZCB9XCJcbiAgICA6dG89XCJlZGl0UGF0aCA/IHsgcGF0aDogZWRpdFBhdGggfSA6IHt9XCJcbiAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmVkaXQpXCJcbiAgKVxuICBEaXRvQ3JlYXRlQnV0dG9uKFxuICAgIHYtaWY9XCJjcmVhdGFibGVcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cImRhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpuZXN0ZWQ9XCJuZXN0ZWRcIlxuICAgIDpwYXRoPVwiY3JlYXRlUGF0aFwiXG4gICAgOnZlcmI9XCJ2ZXJicy5jcmVhdGVcIlxuICAgIDp0ZXh0PVwiY3JlYXRlQnV0dG9uVGV4dFwiXG4gICAgOmRpc2FibGVkPVwiaXNDcmVhdGFibGVEaXNhYmxlZFwiXG4gIClcbiAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgIHYtaWY9XCJkZWxldGFibGVcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIDpkaXNhYmxlZD1cImlzRGVsZXRhYmxlRGlzYWJsZWRcIlxuICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZGVsZXRlKVwiXG4gICAgQGNsaWNrPVwiJGVtaXQoJ2RlbGV0ZScpXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgQ29udGV4dE1peGluIGZyb20gJy4uL21peGlucy9Db250ZXh0TWl4aW4uanMnXG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRWRpdEJ1dHRvbnMnLCB7XG4gIG1peGluczogW0NvbnRleHRNaXhpbl0sXG4gIGVtaXRzOiBbJ2RlbGV0ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgYnV0dG9uczogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtPYmplY3QsIEFycmF5XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBuZXN0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRyYWdnYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGVkaXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY3JlYXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGVsZXRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdFBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgY3JlYXRlUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9ybUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwodGhpcy5zY2hlbWEuZm9ybSlcbiAgICB9LFxuXG4gICAgaXNEcmFnZ2FibGVEaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmhhc1NjaGVtYU9wdGlvbignZHJhZ2dhYmxlJylcbiAgICB9LFxuXG4gICAgaXNEZWxldGFibGVEaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmhhc1NjaGVtYU9wdGlvbignZGVsZXRhYmxlJylcbiAgICB9LFxuXG4gICAgaXNFZGl0YWJsZURpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5kaXNhYmxlZCB8fFxuICAgICAgICAhdGhpcy5lZGl0UGF0aCB8fFxuICAgICAgICAhdGhpcy5oYXNTY2hlbWFPcHRpb24oJ2VkaXRhYmxlJylcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaXNDcmVhdGFibGVEaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgfHxcbiAgICAgICAgIXRoaXMuY3JlYXRlUGF0aCB8fFxuICAgICAgICAhdGhpcy5oYXNTY2hlbWFPcHRpb24oJ2NyZWF0YWJsZScpXG4gICAgICApXG4gICAgfSxcblxuICAgIGNyZWF0ZUJ1dHRvblRleHQoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvLyBBbGxvdyBzY2hlbWEgdG8gb3ZlcnJpZGUgY3JlYXRlIGJ1dHRvbiB0aHJvdWdoIGNyZWF0YWJsZSBvYmplY3Q6XG4gICAgICAgIHRoaXMuc2NoZW1hLmNyZWF0YWJsZT8ubGFiZWwgfHwgKFxuICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGUgY3JlYXRlIGJ1dHRvbiBsYWJlbHMgZnJvbSBmcm9tIGxhYmVscyBmb3IgbGlzdFxuICAgICAgICAgIC8vIHNvdXJjZXMgd2l0aCBvbmx5IG9uZSBmb3JtOlxuICAgICAgICAgIHRoaXMuZm9ybUxhYmVsICYmXG4gICAgICAgICAgYCR7Y2FwaXRhbGl6ZSh0aGlzLnZlcmJzLmNyZWF0ZSl9ICR7dGhpcy5mb3JtTGFiZWx9YFxuICAgICAgICApIHx8XG4gICAgICAgIG51bGxcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhc1NjaGVtYU9wdGlvbihuYW1lKSB7XG4gICAgICAvLyBBbGwgb3B0aW9ucyBjYW4gYmUgZGlzYWJsZWQgb24gYSBwZXItZm9ybSBiYXNpcyBieSBzZXR0aW5nXG4gICAgICAvLyBgc2NoZW1hW25hbWVdYCB0byBgZmFsc2VgIG9yIGEgY2FsbGJhY2sgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICByZXR1cm4gdGhpcy5nZXRTY2hlbWFWYWx1ZShuYW1lLCB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tZWRpdC1idXR0b25zIHtcbiAgLy8gT3ZlcnJpZGUgY3Vyc29yIGZyb20gY29sbGFwc2libGUgZGl0by1sYWJlbDpcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmbGV4OiBub25lO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jcmVhdGUtYnV0dG9uXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICB2LWlmPVwiY3JlYXRhYmxlRm9ybVwiXG4gICAgOnR5cGU9XCJpc0lubGluZWQgPyAnYnV0dG9uJyA6ICdzdWJtaXQnXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJiKVwiXG4gICAgQGNsaWNrPVwiY3JlYXRlSXRlbShjcmVhdGFibGVGb3JtKVwiXG4gICkge3sgdGV4dCB9fVxuICB0ZW1wbGF0ZShcbiAgICB2LWVsc2UtaWY9XCJjcmVhdGFibGVGb3Jtc1wiXG4gIClcbiAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYilcIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25QdWxsZG93bk1vdXNlRG93bigpXCJcbiAgICApIHt7IHRleHQgfX1cbiAgICB1bC5kaXRvLXB1bGxkb3duKDpjbGFzcz1cInsgJ2RpdG8tcHVsbGRvd24tLW9wZW4nOiBwdWxsZG93bi5vcGVuIH1cIilcbiAgICAgIGxpKFxuICAgICAgICB2LWZvcj1cIihmb3JtLCB0eXBlKSBpbiBjcmVhdGFibGVGb3Jtc1wiXG4gICAgICAgIHYtc2hvdz1cInNob3VsZFNob3dTY2hlbWEoZm9ybSlcIlxuICAgICAgKVxuICAgICAgICBhLmRpdG8tcHVsbGRvd25fX2l0ZW0oXG4gICAgICAgICAgOmNsYXNzPWB7XG4gICAgICAgICAgICAnZGl0by1wdWxsZG93bl9faXRlbS0tZGlzYWJsZWQnOiBzaG91bGREaXNhYmxlU2NoZW1hKGZvcm0pXG4gICAgICAgICAgfWBcbiAgICAgICAgICBAbW91c2Vkb3duLnN0b3A9XCJvblB1bGxkb3duTW91c2VEb3duKHR5cGUpXCJcbiAgICAgICAgICBAbW91c2V1cD1cIm9uUHVsbGRvd25Nb3VzZVVwKHR5cGUpXCJcbiAgICAgICAgKSB7eyBnZXRMYWJlbChmb3JtKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgQ29udGV4dE1peGluIGZyb20gJy4uL21peGlucy9Db250ZXh0TWl4aW4uanMnXG5pbXBvcnQgUHVsbGRvd25NaXhpbiBmcm9tICcuLi9taXhpbnMvUHVsbGRvd25NaXhpbi5qcydcbmltcG9ydCB7IGdldEZvcm1TY2hlbWFzLCBpc0lubGluZWQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0NyZWF0ZUJ1dHRvbicsIHtcbiAgbWl4aW5zOiBbQ29udGV4dE1peGluLCBQdWxsZG93bk1peGluXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgLy8gVGhlIG5leHQgZm91ciBwcm9wcyBhcmUgdGhlcmUgZm9yIGBEaXRvQ29udGV4dGAgYW5kIHRoZSBgY29udGV4dCgpYFxuICAgIC8vIGdldHRlciBpbiBgRGl0b01peGluYC5cbiAgICAvLyBUT0RPOiBTaG91bGQgdGhleSBiZSBtb3ZlZCB0byBzaGFyZWQgbWl4aW4gdGhhdCBkZWZpbmVzIHRoZW0gYXMgcmVxdWlyZWRcbiAgICAvLyBhbmQgYWxzbyBwcm92aWRlcyB0aGUgYGNvbnRleHQoKWAgZ2V0dGVyLCBwZXJoYXBzIGBDb250ZXh0TWl4aW5gP1xuICAgIC8vIGBzY2hlbWFgIGNvdWxkIGJlIGluY2x1ZGVkIGFzIHdlbGwsIGFuZCBgQ29udGV4dE1peGluYCBjb3VsZCBiZSB1c2VkIGluXG4gICAgLy8gYERpdG9Gb3JtYCwgYERpdG9WaWV3YCwgYERpdG9QYW5lbGAsIGBEaXRvU2NoZW1hYCwgYERpdG9FZGl0QnV0dG9uc2AsXG4gICAgLy8gZXRjPyBCdXQgdGhlIHByb2JsZW0gd2l0aCB0aGUgcm9vdCBjb21wb25lbnRzIGlzIHRoYXQgdGhleSBkb24ndCBoYXZlXG4gICAgLy8gdGhlc2UgcHJvcHMuIFdlIGNvdWxkIGFkZCBhIGBjb250ZXh0QXR0cmlidXRlcygpYCBnZXR0ZXIgZm9yIGVhc3kgcGFzc2luZ1xuICAgIC8vIG9uIGFzIGB2LWJpbmQ9XCJjb250ZXh0QXR0cmlidXRlc1wiYC5cbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbmVzdGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgcGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdmVyYjogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb3JtcygpIHtcbiAgICAgIHJldHVybiBnZXRGb3JtU2NoZW1hcyh0aGlzLnNjaGVtYSwgdGhpcy5jb250ZXh0KVxuICAgIH0sXG5cbiAgICBjcmVhdGFibGVGb3JtcygpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLmZvcm1zKS5maWx0ZXIoXG4gICAgICAgIChbLCBmb3JtXSkgPT4gdGhpcy5pc0Zvcm1DcmVhdGFibGUoZm9ybSlcbiAgICAgIClcbiAgICAgIHJldHVybiBlbnRyaWVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcylcbiAgICAgICAgOiBudWxsXG4gICAgfSxcblxuICAgIGNyZWF0YWJsZUZvcm0oKSB7XG4gICAgICBjb25zdCBmb3JtcyA9IHRoaXMuY3JlYXRhYmxlRm9ybXNcbiAgICAgIHJldHVybiBmb3JtcyAmJiBPYmplY3Qua2V5cyhmb3JtcykubGVuZ3RoID09PSAxICYmIGZvcm1zLmRlZmF1bHQgfHwgbnVsbFxuICAgIH0sXG5cbiAgICBpc0lubGluZWQoKSB7XG4gICAgICByZXR1cm4gaXNJbmxpbmVkKHRoaXMuc2NoZW1hKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaXNGb3JtQ3JlYXRhYmxlKGZvcm0pIHtcbiAgICAgIC8vIEZvcm1zIGNhbiBiZSBleGNsdWRlZCBmcm9tIHRoZSBsaXN0IGJ5IHByb3ZpZGluZyBgaWY6IGZhbHNlYCBvclxuICAgICAgLy8gYGNyZWF0YWJsZTogZmFsc2VgLlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5zaG91bGRSZW5kZXJTY2hlbWEoZm9ybSkgJiZcbiAgICAgICAgdGhpcy5nZXRTY2hlbWFWYWx1ZSgnY3JlYXRhYmxlJywge1xuICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICBzY2hlbWE6IGZvcm1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgY3JlYXRlSXRlbShmb3JtLCB0eXBlID0gbnVsbCkge1xuICAgICAgaWYgKCF0aGlzLnNob3VsZERpc2FibGVTY2hlbWEoZm9ybSkpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbmxpbmVkKSB7XG4gICAgICAgICAgdGhpcy5zb3VyY2VDb21wb25lbnQuY3JlYXRlSXRlbShmb3JtLCB0eXBlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHsgY3JlYXRhYmxlIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0ge1xuICAgICAgICAgICAgLi4uKHR5cGUgJiYgeyB0eXBlIH0pLFxuICAgICAgICAgICAgLi4uY3JlYXRhYmxlPy5xdWVyeT8uKHRoaXMuY29udGV4dClcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goe1xuICAgICAgICAgICAgcGF0aDogYCR7dGhpcy5wYXRofS9jcmVhdGVgLFxuICAgICAgICAgICAgcXVlcnlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhbGxvd2VkIHRvIGNyZWF0ZSBpdGVtIGZvciBnaXZlbiBmb3JtJylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25QdWxsZG93blNlbGVjdCh0eXBlKSB7XG4gICAgICB0aGlzLmNyZWF0ZUl0ZW0odGhpcy5mb3Jtc1t0eXBlXSwgdHlwZSlcbiAgICAgIHRoaXMuc2V0UHVsbGRvd25PcGVuKGZhbHNlKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi5kaXRvLWNyZWF0ZS1idXR0b24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgLmRpdG8tcHVsbGRvd24ge1xuICAgIHJpZ2h0OiAwO1xuXG4gICAgLmRpdG8tYnV0dG9ucy0tc3RpY2t5ICYge1xuICAgICAgdG9wOiB1bnNldDtcbiAgICAgIHJpZ2h0OiB1bnNldDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNsaXBib2FyZC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLS1yb3VuZChcbiAgdi1pZj1cImNsaXBib2FyZFwiXG4pXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi0tY29weShcbiAgICByZWY9XCJjb3B5RGF0YVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgdGl0bGU9XCJDb3B5IERhdGFcIlxuICAgIDpkaXNhYmxlZD1cIiFjb3B5RW5hYmxlZFwiXG4gICAgQGNsaWNrPVwib25Db3B5XCJcbiAgKVxuICBidXR0b24uZGl0by1idXR0b24uZGl0by1idXR0b24tLXBhc3RlKFxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHRpdGxlPVwiUGFzdGUgRGF0YVwiXG4gICAgOmRpc2FibGVkPVwiIXBhc3RlRW5hYmxlZFwiXG4gICAgQGNsaWNrPVwib25QYXN0ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc09iamVjdCwgY2xvbmUsIGRlaW5kZW50IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9DbGlwYm9hcmQnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcblxuICBwcm9wczoge1xuICAgIGNsaXBib2FyZDogeyB0eXBlOiBbQm9vbGVhbiwgT2JqZWN0XSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29weUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgcGFzdGVFbmFibGVkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsaXBib2FyZE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3QodGhpcy5jbGlwYm9hcmQpID8gdGhpcy5jbGlwYm9hcmQgOiB7fVxuICAgIH0sXG5cbiAgICBjb3B5RGF0YSgpIHtcbiAgICAgIGNvbnN0IHsgY29weSB9ID0gdGhpcy5jbGlwYm9hcmRPcHRpb25zXG4gICAgICByZXR1cm4gY29weVxuICAgICAgICA/IGNsaXBib2FyZERhdGEgPT5cbiAgICAgICAgICAgIGNvcHkuY2FsbCh0aGlzLCBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBjbGlwYm9hcmREYXRhIH0pKVxuICAgICAgICA6IGNsaXBib2FyZERhdGEgPT4gY2xvbmUoY2xpcGJvYXJkRGF0YSlcbiAgICB9LFxuXG4gICAgcGFzdGVEYXRhKCkge1xuICAgICAgY29uc3QgeyBwYXN0ZSB9ID0gdGhpcy5jbGlwYm9hcmRPcHRpb25zXG4gICAgICByZXR1cm4gcGFzdGVcbiAgICAgICAgPyBjbGlwYm9hcmREYXRhID0+XG4gICAgICAgICAgICBwYXN0ZS5jYWxsKHRoaXMsIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IGNsaXBib2FyZERhdGEgfSkpXG4gICAgICAgIDogY2xpcGJvYXJkRGF0YSA9PiBjbGlwYm9hcmREYXRhXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgLy8gQ2hlY2sgcmlnaHQgYXdheSBhbHNvIGluIGNhc2UgdGhlcmUncyBhbHJlYWR5IGRhdGEgKGUuZy4gY3JlYXRlIGZvcm0pOlxuICAgICdwYXJlbnRDb21wb25lbnQuaGFzRGF0YSc6IHtcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgIGhhbmRsZXI6ICd1cGRhdGVDb3B5J1xuICAgIH0sXG5cbiAgICAnYXBwU3RhdGUuY2xpcGJvYXJkRGF0YSc6IHtcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgIGhhbmRsZXI6ICd1cGRhdGVQYXN0ZSdcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICAvLyBDaGVjayBjbGlwYm9hcmQgY29udGVudCB3aGVuZXZlciBzb21ldGhpbmcgZ2V0cyBjb3BpZWQgb3IgdGhlIHdpbmRvdyBnZXRzXG4gICAgLy8gKHJlKWFjdGl2YXRlZCwgYXMgdGhvc2UgYXJlIHRoZSBtb21lbnRzIHdoZW4gdGhlIGNsaXBib2FyZCBjYW4gY2hhbmdlOlxuICAgIHRoaXMuZG9tT24oZG9jdW1lbnQsIHsgY29weTogdGhpcy51cGRhdGVQYXN0ZSB9KVxuICAgIHRoaXMuZG9tT24od2luZG93LCB7IGZvY3VzOiB0aGlzLnVwZGF0ZVBhc3RlIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGNoZWNrQ2xpcGJvYXJkRGF0YShjbGlwYm9hcmREYXRhKSB7XG4gICAgICBjb25zdCB7ICRzY2hlbWEsIC4uLmRhdGEgfSA9IGNsaXBib2FyZERhdGEgfHwge31cbiAgICAgIHJldHVybiAkc2NoZW1hID09PSB0aGlzLnNjaGVtYS5uYW1lID8gZGF0YSA6IG51bGxcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2xpcGJvYXJkRGF0YShyZXBvcnQpIHtcbiAgICAgIC8vIFVzZSB0aGUgaW50ZXJuYWwgY2xpcGJvYXJkIGFzIGZhbGxiYWNrLlxuICAgICAgbGV0IHsgY2xpcGJvYXJkRGF0YSB9ID0gdGhpcy5hcHBTdGF0ZVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQ/LnJlYWRUZXh0Py4oKVxuICAgICAgICBpZiAoanNvbikge1xuICAgICAgICAgIGNsaXBib2FyZERhdGEgPSBKU09OLnBhcnNlKGpzb24pXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAocmVwb3J0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIsIGVyci5uYW1lLCBlcnIubWVzc2FnZSlcbiAgICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIGFsZXJ0KGRlaW5kZW50YFxuICAgICAgICAgICAgICBUaGUgZGF0YSBpbiB0aGUgY2xpcGJvYXJkIGFwcGVhcnMgdG8gYmUgbWFsZm9ybWVkOlxuICAgICAgICAgICAgICAke2Vyci5tZXNzYWdlfVxuICAgICAgICAgICAgYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmNoZWNrQ2xpcGJvYXJkRGF0YShjbGlwYm9hcmREYXRhKVxuICAgIH0sXG5cbiAgICB1cGRhdGVDb3B5KCkge1xuICAgICAgdGhpcy5jb3B5RW5hYmxlZCA9IHRoaXMucGFyZW50Q29tcG9uZW50Lmhhc0RhdGFcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlUGFzdGUoKSB7XG4gICAgICB0aGlzLnBhc3RlRW5hYmxlZCA9ICEhdGhpcy5jaGVja0NsaXBib2FyZERhdGEodGhpcy5hcHBTdGF0ZS5jbGlwYm9hcmREYXRhKVxuICAgICAgaWYgKCF0aGlzLnBhc3RlRW5hYmxlZCAmJiB0aGlzLmFwcFN0YXRlLmFnZW50LmNocm9tZSkge1xuICAgICAgICAvLyBTZWUgaWYgdGhlIGNsaXBib2FyZCBjb250ZW50IGlzIHZhbGlkIEpTT04gZGF0YSB0aGF0IGlzIGNvbXBhdGlibGVcbiAgICAgICAgLy8gd2l0aCB0aGUgY3VycmVudCB0YXJnZXQgc2NoZW1hLCBhbmQgb25seSB0aGVuIGFjdGl2YXRlIHRoZSBwYXN0aW5nOlxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5nZXRDbGlwYm9hcmREYXRhKGZhbHNlKSAvLyBEb24ndCByZXBvcnRcbiAgICAgICAgdGhpcy5wYXN0ZUVuYWJsZWQgPSAhIWRhdGFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgb25Db3B5KCkge1xuICAgICAgbGV0IGRhdGEgPSB0aGlzLnBhcmVudENvbXBvbmVudC5jbGlwYm9hcmREYXRhXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAkc2NoZW1hOiB0aGlzLnNjaGVtYS5uYW1lLFxuICAgICAgICAgICAgLi4udGhpcy5jb3B5RGF0YShkYXRhKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBLZWVwIGFuIGludGVybmFsIGNsaXBib2FyZCBhcyBmYWxsYmFjay5cbiAgICAgICAgdGhpcy5hcHBTdGF0ZS5jbGlwYm9hcmREYXRhID0gZGF0YVxuICAgICAgICB0aGlzLnBhc3RlRW5hYmxlZCA9IHRydWVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMilcbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQ/Lihqc29uKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJyLm5hbWUsIGVyci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICBhbGVydChlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBvblBhc3RlKCkge1xuICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldENsaXBib2FyZERhdGEodHJ1ZSkgLy8gUmVwb3J0XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gZGF0YSAmJiB0aGlzLnBhc3RlRGF0YShkYXRhKVxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMucGFyZW50Q29tcG9uZW50LmNsaXBib2FyZERhdGEgPSBkYXRhXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgIGFsZXJ0KGVycm9yLm1lc3NhZ2UpXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY2xpcGJvYXJkIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1zY2hlbWEgJiB7XG4gICAgLy8gUHVzaCBjbGlwYm9hcmQgdG8gdGhlIHJpZ2h0IGluIHRoZSBmbGV4IGxheW91dCwgc2VlOlxuICAgIC8vIGh0dHBzOi8vY29kZXBlbi5pby90aG9sZXgvcGVuL2h2ZUJ4L1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICB9XG5cbiAgLmRpdG8taGVhZGVyICYge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuXG4gICAgLmRpdG8tYnV0dG9uIHtcbiAgICAgIG1hcmdpbjogMCAwICR0YWItbWFyZ2luICR0YWItbWFyZ2luO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHNldExvYWRpbmcoaXNMb2FkaW5nLCB7IHVwZGF0ZVJvb3QgPSBmYWxzZSwgdXBkYXRlVmlldyA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgaWYgKCF0aGlzLmlzTG9hZGluZyBeICFpc0xvYWRpbmcpIHtcbiAgICAgICAgLy8gQm9vbGVhbiB4b3JcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSAhIWlzTG9hZGluZ1xuICAgICAgICBpZiAodXBkYXRlUm9vdCkge1xuICAgICAgICAgIHRoaXMucm9vdENvbXBvbmVudC5yZWdpc3RlckxvYWRpbmcoaXNMb2FkaW5nKVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVWaWV3KSB7XG4gICAgICAgICAgdGhpcy52aWV3Q29tcG9uZW50LnNldExvYWRpbmcodGhpcy5pc0xvYWRpbmcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi9JdGVtTWl4aW4uanMnXG5pbXBvcnQgTG9hZGluZ01peGluIGZyb20gJy4vTG9hZGluZ01peGluLmpzJ1xuaW1wb3J0IHsgc2V0RGVmYXVsdFZhbHVlcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGFzc2lnbkRlZXBseSwgaXNPYmplY3QsIGlzU3RyaW5nLCBsYWJlbGl6ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtJdGVtTWl4aW4sIExvYWRpbmdNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHJlc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgLy8gUGFzcyBsb2NhbCB2ZXJicyBvdmVycmlkZXMgb24gdG8gY2hpbGRyZW4sIHNlZSB2ZXJicygpIGNvbXB1dGVkIHByb3AuXG4gICAgICAkdmVyYnM6ICgpID0+IHRoaXMudmVyYnMsXG4gICAgICAkaXNQb3B1bGF0ZWQ6ICgpID0+IHRoaXMuaGFzRGF0YVxuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsb2FkZWREYXRhOiBudWxsLFxuICAgICAgYWJvcnRDb250cm9sbGVyOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICByZXNvdXJjZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlKClcbiAgICB9LFxuXG4gICAgcHJvdmlkZXNEYXRhKCkge1xuICAgICAgLy8gVGhpcyBjb21wb25lbnQgaXMgYSBkYXRhLXNvdXJjZSBpZiBpdCBoYXMgYW4gYXNzb2NpYXRlZCBBUEkgcmVzb3VyY2U6XG4gICAgICByZXR1cm4gISF0aGlzLnJlc291cmNlXG4gICAgfSxcblxuICAgIGxpbmtzVG9WaWV3KCkge1xuICAgICAgLy8gUmV0dXJucyBgZmFsc2VgaGVyZSwgYnV0IGlzIG92ZXJyaWRkZW4gdG8gcmV0dXJuIGB0cnVlYCBpblxuICAgICAgLy8gYFNvdXJjZU1peGluYCBmb3IgY29tcG9uZW50IHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlaXIgb3duIGRhdGEsIGJ1dFxuICAgICAgLy8gZWRpdCB0aGVpciBpdGVtcyB0aHJvdWdoIGEgbGlua2VkIHZpZXcuICBJbiB0aGlzIGNhc2UsIHJlYWwgaWRzIG5lZWQgdG9cbiAgICAgIC8vIGJlIHVzZWQuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNUcmFuc2llbnQoKSB7XG4gICAgICAvLyBDaGVjayB0aGUgZm9ybSB0aGF0IHRoaXMgY29tcG9uZW50IGJlbG9uZ3MgdG8gYXMgd2VsbCwgc2luY2UgaXQgbWF5IGJlXG4gICAgICAvLyBpbiBjcmVhdGlvbiBtb2RlLCB3aGljaCBtYWtlcyBpdCB0cmFuc2llbnQuXG4gICAgICAvLyBOT1RFOiBUaGlzIGRvZXMgbm90IGxvb3AgZW5kbGVzc2x5IGJlY2F1c2UgRGl0b0Zvcm0gcmVkZWZpbmVzXG4gICAgICAvLyBgaXNUcmFuc2llbnQoKWAgdG8gb25seSByZXR1cm4gYCF0aGlzLnByb3ZpZGVzRGF0YWAuXG4gICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtQ29tcG9uZW50XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhdGhpcy5wcm92aWRlc0RhdGEgJiZcbiAgICAgICAgIXRoaXMubGlua3NUb1ZpZXcgfHxcbiAgICAgICAgZm9ybSAmJiAoXG4gICAgICAgICAgZm9ybS5pc1RyYW5zaWVudCB8fFxuICAgICAgICAgIGZvcm0uaXNDcmVhdGluZ1xuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIHRyYW5zaWVudE5vdGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmlzVHJhbnNpZW50ICYmIChcbiAgICAgICAgICAnPGI+Tm90ZTwvYj46IHRoZSBwYXJlbnQgc3RpbGwgbmVlZHMgdG8gYmUgc2F2ZWQgJyArXG4gICAgICAgICAgJ2luIG9yZGVyIHRvIHBlcnNpc3QgdGhpcyBjaGFuZ2UuJ1xuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIHNob3VsZExvYWQoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhdGhpcy5pc1RyYW5zaWVudCAmJlxuICAgICAgICAhdGhpcy5pc0xvYWRpbmdcbiAgICAgIClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgIC8vIEJhc2UgZGVmaW5pdGlvbiwgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IERpdG9Gb3JtIGFuZCBTb3VyY2VNaXhpblxuICAgICAgcmV0dXJuICEhdGhpcy5sb2FkZWREYXRhXG4gICAgfSxcblxuICAgIHZlcmJzKCkge1xuICAgICAgLy8gVGhlIGFjdHVhbCBjb2RlIGlzIHRoZSBgZ2V0VmVyYnMoKWAgbWV0aG9kLCBmb3IgZWFzaWVyIG92ZXJyaWRpbmcgb2ZcbiAgICAgIC8vIHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgaW4gY29tcG9uZW50cyB0aGF0IHVzZSB0aGUgUmVzb3VyY2VNaXhpbi5cbiAgICAgIHJldHVybiB0aGlzLmdldFZlcmJzKClcbiAgICB9LFxuXG4gICAgcGFnaW5hdGlvblJhbmdlKCkge1xuICAgICAgLy8gT25seSBhcHBseSBwYWdpbmF0aW9uIHRvIGxpc3RzLlxuICAgICAgY29uc3QgeyBwYWdpbmF0ZTogYW1vdW50IH0gPSB0aGlzLnNvdXJjZVNjaGVtYVxuICAgICAgaWYgKHRoaXMuaXNMaXN0U291cmNlICYmIGFtb3VudCkge1xuICAgICAgICBjb25zdCB7IHBhZ2UgPSAwIH0gPSB0aGlzLnF1ZXJ5IHx8IHt9XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFnZSAqIGFtb3VudFxuICAgICAgICByZXR1cm4gW3N0YXJ0LCBzdGFydCArIGFtb3VudCAtIDFdXG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBxdWVyeVBhcmFtcygpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5wYWdpbmF0aW9uUmFuZ2VcbiAgICAgIGNvbnN0IHsgcGFnZSwgLi4ucXVlcnkgfSA9IHRoaXMucXVlcnkgfHwge31cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnF1ZXJ5LCAvLyBRdWVyeSBtYXkgb3ZlcnJpZGUgc2NvcGUuXG4gICAgICAgIC4uLihyYW5nZSAmJiB7XG4gICAgICAgICAgLy8gUGFzcyBwYWdpbmF0aW9uIGFzIHJhbmdlLCBzbyB0aGF0IHdlIGF1dG9tYXRpY2FsbHkgZ2V0IE9iamVjdGlvbidzXG4gICAgICAgICAgLy8gcmVzdWx0cyBjb3VudGluZzpcbiAgICAgICAgICByYW5nZTogcmFuZ2Uuam9pbignLCcpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgLy8gV2hlbiBjcmVhdGluZyBuZXN0ZWQgZGF0YSwgd2Ugc3RpbGwgbmVlZCB0byBjYWxsIHNldHVwRGF0YSgpXG4gICAgaWYgKHRoaXMucHJvdmlkZXNEYXRhIHx8IHRoaXMuaXNDcmVhdGluZykge1xuICAgICAgdGhpcy5zZXR1cERhdGEoKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UmVzb3VyY2UoeyBtZXRob2QgPSAnZ2V0JywgY2hpbGQgfSA9IHt9KSB7XG4gICAgICAvLyBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXNvdXJjZSBmb3IgdGhlXG4gICAgICAvLyBhc3NvY2lhdGVkIHNvdXJjZSBzY2hlbWEuXG4gICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuc291cmNlU2NoZW1hPy5yZXNvdXJjZVxuICAgICAgcmV0dXJuIGdldFJlc291cmNlKHJlc291cmNlLCB7XG4gICAgICAgIHR5cGU6ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBwYXJlbnQ6IHRoaXMucGFyZW50UmVzb3VyY2VDb21wb25lbnQ/LmdldFJlc291cmNlKHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgY2hpbGQ6IHJlc291cmNlXG4gICAgICAgIH0pID8/IG51bGwsXG4gICAgICAgIGNoaWxkXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBnZXRWZXJicygpIHtcbiAgICAgIGNvbnN0IHZlcmJzID0gdGhpcy4kdmVyYnMoKVxuICAgICAgcmV0dXJuIHRoaXMuaXNUcmFuc2llbnRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi52ZXJicyxcbiAgICAgICAgICAgIC8vIE92ZXJyaWRlIGRlZmF1bHQgdmVyYnMgd2l0aCB0aGVpciB0cmFuc2llbnQgdmVyc2lvbnM6XG4gICAgICAgICAgICBjcmVhdGU6ICdhZGQnLFxuICAgICAgICAgICAgY3JlYXRlZDogJ2FkZGVkJyxcbiAgICAgICAgICAgIHNhdmU6ICdhcHBseScsXG4gICAgICAgICAgICBzYXZlZDogJ2FwcGxpZWQnLFxuICAgICAgICAgICAgZGVsZXRlOiAncmVtb3ZlJyxcbiAgICAgICAgICAgIGRlbGV0ZWQ6ICdyZW1vdmVkJ1xuICAgICAgICAgIH1cbiAgICAgICAgOiB2ZXJic1xuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBjbGVhckRhdGEoKSB7XG4gICAgICB0aGlzLmxvYWRlZERhdGEgPSBudWxsXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIHNldERhdGEoZGF0YSkge1xuICAgICAgdGhpcy5sb2FkZWREYXRhID0gZGF0YVxuICAgIH0sXG5cbiAgICBzZXR1cERhdGEoKSB7XG4gICAgICAvLyBBY3R1YWwgY29kZSBpcyBpbiBzZXBhcmF0ZSBmdW5jdGlvbiBzbyBpdCdzIGVhc2VyIHRvIG92ZXJyaWRlXG4gICAgICAvLyBgc2V0dXBEYXRhKClgIGFuZCBhbmQgY2FsbCBgZW5zdXJlRGF0YSgpYCBmcm9tIHRoZSBvdmVycmlkZXMsXG4gICAgICAvLyBzZWUgRGl0b0Zvcm0gYW5kIFNvdXJjZU1peGluLlxuICAgICAgdGhpcy5lbnN1cmVEYXRhKClcbiAgICB9LFxuXG4gICAgZW5zdXJlRGF0YSgpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZExvYWQpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGF0YSkge1xuICAgICAgICAgIHRoaXMucmVsb2FkRGF0YSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2FkRGF0YSh0cnVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbG9hZERhdGEoKSB7XG4gICAgICB0aGlzLmxvYWREYXRhKGZhbHNlKVxuICAgIH0sXG5cbiAgICBsb2FkRGF0YShjbGVhcikge1xuICAgICAgaWYgKCF0aGlzLmlzVHJhbnNpZW50KSB7XG4gICAgICAgIGlmIChjbGVhcikge1xuICAgICAgICAgIHRoaXMuY2xlYXJEYXRhKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlcXVlc3REYXRhKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3JlYXRlRGF0YShzY2hlbWEsIHR5cGUpIHtcbiAgICAgIHJldHVybiBzZXREZWZhdWx0VmFsdWVzKHNjaGVtYSwgdHlwZSA/IHsgdHlwZSB9IDoge30sIHRoaXMpXG4gICAgfSxcblxuICAgIHJlcXVlc3REYXRhKCkge1xuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJ5UGFyYW1zXG4gICAgICB0aGlzLmhhbmRsZVJlcXVlc3QoeyBtZXRob2Q6ICdnZXQnLCBxdWVyeSB9LCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGRhdGE/LnR5cGUgPT09ICdGaWx0ZXJWYWxpZGF0aW9uJyAmJlxuICAgICAgICAgICAgICB0aGlzLm9uRmlsdGVyRXJyb3JzPy4oZGF0YS5lcnJvcnMpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1VuYXV0aG9yaXplZEVycm9yKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBDYW4gd2UgcmVhbGx5IHN3YWxsb3cgdGhlc2UgZXJyb3JzP1xuICAgICAgICAgICAgICAvLyBJcyBjYWxsaW5nIGBlbnN1cmVVc2VyKClgIGluIGBvbkJlZm9yZVJlcXVlc3QoKWAgZW5vdWdoP1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldERhdGEocmVzcG9uc2UuZGF0YSlcbiAgICAgICAgICB0aGlzLmVtaXRTY2hlbWFFdmVudCgnbG9hZCcpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGlvbkVycm9yKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAwXG4gICAgfSxcblxuICAgIGlzVW5hdXRob3JpemVkRXJyb3IocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZT8uc3RhdHVzID09PSA0MDFcbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlUmVxdWVzdChcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICByZXNvdXJjZSA9IHRoaXMuZ2V0UmVzb3VyY2UoeyBtZXRob2QgfSksXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBkYXRhXG4gICAgICB9LFxuICAgICAgY2FsbGJhY2tcbiAgICApIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdPcHRpb25zID0ge1xuICAgICAgICB1cGRhdGVSb290OiB0cnVlLCAvLyBEaXNwbGF5IHNwaW5uZXIgaW4gaGVhZGVyIHdoZW4gbG9hZGluZyBpbiByZXNvdXJjZXNcbiAgICAgICAgdXBkYXRlVmlldzogdGhpcy5pc0luVmlldyAvLyBOb3RpZnkgdmlldyBvZiBsb2FkaW5nIGZvciB2aWV3IGNvbXBvbmVudHNcbiAgICAgIH1cbiAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyPy5hYm9ydCgpXG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICB0aGlzLmFib3J0Q29udHJvbGxlciA9IGNvbnRyb2xsZXJcbiAgICAgIGNvbnN0IHsgc2lnbmFsIH0gPSBjb250cm9sbGVyXG4gICAgICBtZXRob2QgPSByZXNvdXJjZS5tZXRob2QgfHwgbWV0aG9kXG4gICAgICBjb25zdCByZXF1ZXN0ID0geyBtZXRob2QsIHJlc291cmNlLCBxdWVyeSwgZGF0YSwgc2lnbmFsIH1cbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlLCBsb2FkaW5nT3B0aW9ucylcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgICAvLyBQYXNzIGJvdGggcmVxdWVzdCBhbmQgcmVzcG9uc2UgdG8gdGhlIGNhbGxiYWNrLCBzbyB0aGV5IGNhbiBiZVxuICAgICAgICAvLyBleHBvc2VkIHRvIGZ1cnRoZXIgY2FsbGJhY2tzIHRocm91Z2ggRGl0b0NvbnRleHQuXG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm5hbWUgIT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgIC8vIElmIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSwgZXJyb3JzIHdlcmUgYWxyZWFkeSBoYW5kbGVkLlxuICAgICAgICAgIGNvbnN0IHsgcmVzcG9uc2UgfSA9IGVycm9yXG4gICAgICAgICAgaWYgKCFjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U/LmRhdGFcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gaXNTdHJpbmcoZGF0YT8udHlwZSlcbiAgICAgICAgICAgICAgPyBsYWJlbGl6ZShkYXRhLnR5cGUpXG4gICAgICAgICAgICAgIDogJ0Vycm9yJ1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGRhdGE/Lm1lc3NhZ2UgPz8gZXJyb3JcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHsgdHlwZTogJ2Vycm9yJywgZXJyb3IsIHRpdGxlLCB0ZXh0IH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5hYm9ydENvbnRyb2xsZXIgPT09IGNvbnRyb2xsZXIpIHtcbiAgICAgICAgLy8gT25seSBjbGVhciB0aGUgbG9hZGluZyBzdGF0ZSBpZiB0aGlzIGlzIHN0aWxsIHRoZSBjdXJyZW50IHJlcXVlc3QuXG4gICAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyID0gbnVsbFxuICAgICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UsIGxvYWRpbmdPcHRpb25zKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRQYXlsb2FkRGF0YShidXR0b24sIG1ldGhvZCkge1xuICAgICAgLy8gQ29udmVudGlvbjogb25seSBwb3N0LCBwdXQgYW5kIHBhdGNoIHJlcXVlc3RzIHBhc3MgdGhlIGRhdGEgYXMgcGF5bG9hZC5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXS5pbmNsdWRlcyhtZXRob2QpICYmIChcbiAgICAgICAgICAvLyBUT0RPOiBVc2UgYGhhbmRsZURhdGFTY2hlbWEoKWAgYXN5bmNocm9ub3VzbHkgaGVyZSBpbnN0ZWFkLCB0b1xuICAgICAgICAgIC8vIG9mZmVyIHRoZSBzYW1lIGFtb3VudCBvZiBwb3NzaWJpbGl0aWVzIGZvciBkYXRhIGxvYWRpbmcuXG4gICAgICAgICAgYnV0dG9uLmdldFNjaGVtYVZhbHVlKFsncmVzb3VyY2UnLCAnZGF0YSddKSB8fFxuICAgICAgICAgIGJ1dHRvbi5wcm9jZXNzZWRJdGVtXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VibWl0KGJ1dHRvbikge1xuICAgICAgbGV0IHsgcmVzb3VyY2UgfSA9IGJ1dHRvbi5zY2hlbWFcbiAgICAgIHJlc291cmNlID0gZ2V0UmVzb3VyY2UocmVzb3VyY2UsIHtcbiAgICAgICAgcGFyZW50OiB0aGlzLmdldFJlc291cmNlKHtcbiAgICAgICAgICBtZXRob2Q6IHJlc291cmNlPy5tZXRob2QsXG4gICAgICAgICAgY2hpbGQ6IHJlc291cmNlXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgICAgaWYgKHJlc291cmNlKSB7XG4gICAgICAgIGNvbnN0IHsgbWV0aG9kIH0gPSByZXNvdXJjZVxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRQYXlsb2FkRGF0YShidXR0b24sIG1ldGhvZClcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VibWl0UmVzb3VyY2UoYnV0dG9uLCByZXNvdXJjZSwgbWV0aG9kLCBkYXRhKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdFJlc291cmNlKGJ1dHRvbiwgcmVzb3VyY2UsIG1ldGhvZCwgZGF0YSwge1xuICAgICAgc2V0RGF0YSA9IGZhbHNlLFxuICAgICAgb25TdWNjZXNzLFxuICAgICAgb25FcnJvcixcbiAgICAgIG5vdGlmeVN1Y2Nlc3MgPSAoKSA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgIHRpdGxlOiAnUmVxdWVzdCBTdWNjZXNzZnVsJyxcbiAgICAgICAgICB0ZXh0OiAnUmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQuJ1xuICAgICAgICB9KSxcbiAgICAgIG5vdGlmeUVycm9yID0gZXJyb3IgPT5cbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IEVycm9yJyxcbiAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICBgVW5hYmxlIHRvIHNlbmQgcmVxdWVzdCR7ZXJyb3IgPyAnOicgOiAnJ31gLFxuICAgICAgICAgICAgZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3JcbiAgICAgICAgICBdXG4gICAgICAgIH0pXG4gICAgfSA9IHt9KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUmVxdWVzdChcbiAgICAgICAgICB7IG1ldGhvZCwgcmVzb3VyY2UsIGRhdGEgfSxcbiAgICAgICAgICBhc3luYyAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlPy5kYXRhXG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIFNlZSBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBEaXRvLmpzIHZhbGlkYXRpb24gZXJyb3I6XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuaXNWYWxpZGF0aW9uRXJyb3IocmVzcG9uc2UpICYmIGRhdGEuZXJyb3JzXG4gICAgICAgICAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dWYWxpZGF0aW9uRXJyb3JzKGVycm9ycywgdHJ1ZSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzT2JqZWN0KGRhdGEpID8gZGF0YSA6IGVyclxuICAgICAgICAgICAgICAgIG9uRXJyb3I/LihlcnJvcilcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgIG5vdGlmeTogbm90aWZ5RXJyb3IsXG4gICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdW5kZXJseWluZyBkYXRhIGJlZm9yZSBjYWxsaW5nIGBub3RpZnkoKWAgb3JcbiAgICAgICAgICAgICAgLy8gYHRoaXMuaXRlbUxhYmVsYCwgc28gaWQgaXMgc2V0IGFmdGVyIGNyZWF0aW5nIG5ldyBpdGVtcy5cbiAgICAgICAgICAgICAgaWYgKHNldERhdGEgJiYgZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBmb3JlaWduIGRhdGEgZW50cmllcyB3aGVuIHVwZGF0aW5nIHRoZSBkYXRhLlxuICAgICAgICAgICAgICAgIGNvbnN0IHsgZm9yZWlnbkRhdGEgfSA9IHRoaXMubWFpblNjaGVtYUNvbXBvbmVudC5maWx0ZXJEYXRhKFxuICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC8vIFRlbGwgdGhlIHBhcmVudCByb3V0ZSB0byByZWxvYWQgaXRzIGRhdGEsIHNvIHRoYXQgaXQgY2FuXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGl0cyBmb3JlaWduIGRhdGEgZW50cmllcy5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRNZXRhID0gdGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudD8ucm91dGVSZWNvcmQ/Lm1ldGFcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50TWV0YSkge1xuICAgICAgICAgICAgICAgICAgcGFyZW50TWV0YS5yZWxvYWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YShhc3NpZ25EZWVwbHkoe30sIGZvcmVpZ25EYXRhLCBkYXRhKSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvblN1Y2Nlc3M/LigpXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ3N1Y2Nlc3MnLCB7XG4gICAgICAgICAgICAgICAgbm90aWZ5OiBub3RpZnlTdWNjZXNzXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVtaXRCdXR0b25FdmVudChidXR0b24sIGV2ZW50LCB7IG5vdGlmeSwgZXJyb3IgfSkge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBjb250ZXh0IG91dHNpZGUgb2YgYGVtaXRFdmVudCgpYCwgc28gdGhhdFxuICAgICAgLy8gYGNvbnRleHQud2FzTm90aWZpZWRgIGNhbiBiZSBjaGVja2VkIGFmdGVyLlxuICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBEaXRvQ29udGV4dChidXR0b24sIHtcbiAgICAgICAgbmVzdGVkOiBmYWxzZSxcbiAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICBpdGVtTGFiZWw6IHRoaXMuaXRlbUxhYmVsLFxuICAgICAgICBlcnJvclxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJ1dHRvbi5lbWl0RXZlbnQoZXZlbnQsIHsgY29udGV4dCB9KVxuICAgICAgaWYgKFxuICAgICAgICBub3RpZnkgJiZcbiAgICAgICAgLy8gUHJldmVudCBkZWZhdWx0IGlmIGFueXRoaW5nIHdhcyByZXR1cm5lZCBmcm9tIHRoZSBldmVudCBoYW5kbGVyLlxuICAgICAgICByZXMgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAvLyBEbyBub3QgZGlzcGxheSBkZWZhdWx0IG5vdGlmaWNhdGlvbiBpZiB0aGUgZXZlbnQgaGFuZGxlciBhbHJlYWR5XG4gICAgICAgIC8vIGRpc3BsYXllZCBhIG5vdGlmaWNhdGlvbi5cbiAgICAgICAgIWNvbnRleHQud2FzTm90aWZpZWRcbiAgICAgICkge1xuICAgICAgICBub3RpZnkoZXJyb3IpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGgocGF0aCkge1xuICAvLyBGb3IgcGF0aHMgc3RhcmluZyB3aXRoIGAvYCwgd2UgY2FuIHVzZSB0aGUgbmF0aXZlIGBVUkwoKWAgY2xhc3MgdG8gcmVzb2x2ZVxuICAvLyB0aGUgcGF0aCwgd2hpY2ggd2lsbCBhbHNvIGhhbmRsZSBgLi5gIGFuZCBgLmAgc2VnbWVudHM6XG4gIHJldHVybiBuZXcgVVJMKGBmaWxlOiR7cGF0aH1gKS5wYXRobmFtZVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWZvcm0uZGl0by1zY3JvbGwtcGFyZW50KFxuICA6Y2xhc3M9XCJ7ICdkaXRvLWZvcm0tbmVzdGVkJzogaXNOZXN0ZWRSb3V0ZSB9XCJcbiAgOmRhdGEtcmVzb3VyY2U9XCJzb3VyY2VTY2hlbWEucGF0aFwiXG4pXG4gIC8vLSBPbmx5IHJlbmRlciBhIHJvdXRlci12aWV3IGhlcmUgaWYgdGhpcyBpc24ndCB0aGUgbGFzdCBkYXRhIHJvdXRlIGFuZCBub3QgYVxuICAvLy0gbmVzdGVkIGZvcm0gcm91dGUsIHdoaWNoIHdpbGwgYXBwZWFyIGVsc2V3aGVyZSBpbiBpdHMgb3duIHZpZXcuXG4gIFJvdXRlclZpZXcoXG4gICAgdi1pZj1cIiFpc0xhc3RVbm5lc3RlZFJvdXRlICYmICFpc05lc3RlZFJvdXRlXCJcbiAgICB2LXNob3c9XCIhaXNBY3RpdmVSb3V0ZVwiXG4gIClcbiAgLy8tIE5PVEU6IE5lc3RlZCBmb3JtIGNvbXBvbmVudHMgYXJlIGtlcHQgYWxpdmUgYnkgdXNpbmcgYHYtc2hvd2AgaW5zdGVhZCBvZlxuICAvLy0gYHYtaWZgIGhlcmUsIHNvIGV2ZW50IGhhbmRsaW5nIGFuZCBvdGhlciB0aGluZ3Mgc3RpbGwgd29yayB3aXRoIG5lc3RlZFxuICAvLy0gZWRpdGluZy5cbiAgRGl0b0Zvcm1Jbm5lcihcbiAgICB2LXNob3c9XCJpc0FjdGl2ZVJvdXRlXCJcbiAgICA6bmVzdGVkPVwiaXNOZXN0ZWRSb3V0ZVwiXG4gIClcbiAgICAvLy0gUHJldmVudCBpbXBsaWNpdCBzdWJtaXNzaW9uIG9mIHRoZSBmb3JtLCBmb3IgZXhhbXBsZSB3aGVuIHR5cGluZyBlbnRlclxuICAgIC8vLSBpbiBhbiBpbnB1dCBmaWVsZC5cbiAgICAvLy0gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzUxNTA3ODA2XG4gICAgYnV0dG9uKFxuICAgICAgdi1zaG93PVwiZmFsc2VcIlxuICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICBkaXNhYmxlZFxuICAgIClcbiAgICBEaXRvU2NoZW1hKFxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpwYWRkaW5nPVwiaXNOZXN0ZWRSb3V0ZSA/ICduZXN0ZWQnIDogJ3Jvb3QnXCJcbiAgICAgIDphY3RpdmU9XCJpc0FjdGl2ZVJvdXRlXCJcbiAgICAgIDpkaXNhYmxlZD1cImlzTG9hZGluZ1wiXG4gICAgICA6c2Nyb2xsYWJsZT1cIiFpc05lc3RlZFJvdXRlXCJcbiAgICAgIGdlbmVyYXRlTGFiZWxzXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI2J1dHRvbnMpXG4gICAgICAgIERpdG9CdXR0b25zLmRpdG8tYnV0dG9ucy0tcm91bmQuZGl0by1idXR0b25zLS1sYXJnZS5kaXRvLWJ1dHRvbnMtLW1haW4oXG4gICAgICAgICAgOmNsYXNzPVwieyAnZGl0by1idXR0b25zLS1zdGlja3knOiAhaXNOZXN0ZWRSb3V0ZSB9XCJcbiAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImlzTG9hZGluZ1wiXG4gICAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBjbG9uZSwgY2FwaXRhbGl6ZSwgcGFyc2VEYXRhUGF0aCwgYXNzaWduRGVlcGx5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgUm91dGVNaXhpbiBmcm9tICcuLi9taXhpbnMvUm91dGVNaXhpbi5qcydcbmltcG9ydCBSZXNvdXJjZU1peGluIGZyb20gJy4uL21peGlucy9SZXNvdXJjZU1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2UsIGdldE1lbWJlclJlc291cmNlIH0gZnJvbSAnLi4vdXRpbHMvcmVzb3VyY2UuanMnXG5pbXBvcnQgeyBnZXRCdXR0b25TY2hlbWFzLCBpc09iamVjdFNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IHJlc29sdmVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvcGF0aC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRm9ybScsIHtcbiAgbWl4aW5zOiBbUm91dGVNaXhpbiwgUmVzb3VyY2VNaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3JlYXRlZERhdGE6IG51bGwsXG4gICAgICBjbG9uZWREYXRhOiB1bmRlZmluZWQsXG4gICAgICBzb3VyY2VLZXk6IG51bGwsXG4gICAgICBpc0Zvcm06IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB2ZXJicygpIHtcbiAgICAgIC8vIEFkZCBzdWJtaXQgLyBzdWJtaXR0ZWQgdG8gdGhlIHZlcmJzIHJldHVybmVkIGJ5IFJlc291cmNlTWl4aW5cbiAgICAgIC8vIE5PVEU6IFRoZXNlIGdldCBwYXNzZWQgb24gdG8gY2hpbGRyZW4gdGhyb3VnaDpcbiAgICAgIC8vIGBwcm92aWRlKCkgLi4uIHsgJHZlcmJzOiAoKSA9PiB0aGlzLnZlcmJzIH1gIGluIFJlc291cmNlTWl4aW5cbiAgICAgIGNvbnN0IHZlcmJzID0gdGhpcy5nZXRWZXJicygpXG4gICAgICBjb25zdCB7IGlzQ3JlYXRpbmcsIHByb3ZpZGVzRGF0YSB9ID0gdGhpc1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udmVyYnMsXG4gICAgICAgIHN1Ym1pdDogaXNDcmVhdGluZyA/IHZlcmJzLmNyZWF0ZSA6IHZlcmJzLnNhdmUsXG4gICAgICAgIHN1Ym1pdHRlZDogaXNDcmVhdGluZyA/IHZlcmJzLmNyZWF0ZWQgOiB2ZXJicy5zYXZlZCxcbiAgICAgICAgY2FuY2VsOiBwcm92aWRlc0RhdGEgPyB2ZXJicy5jYW5jZWwgOiB2ZXJicy5jbG9zZSxcbiAgICAgICAgY2FuY2VsbGVkOiBwcm92aWRlc0RhdGEgPyB2ZXJicy5jYW5jZWxsZWQgOiB2ZXJicy5jbG9zZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2NoZW1hKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlbUZvcm1TY2hlbWEoXG4gICAgICAgIHRoaXMuc291cmNlU2NoZW1hLFxuICAgICAgICB0aGlzLmRhdGEgfHwgKFxuICAgICAgICAgIHRoaXMuY3JlYXRpb25UeXBlXG4gICAgICAgICAgICA/IC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgeWV0IGJ1dCB0aGUgdHlwZSB0byBjcmVhdGUgYSBuZXcgaXRlbSBpc1xuICAgICAgICAgICAgICAvLyBpcyBzcGVjaWZpZWQsIHByb3ZpZGUgYSB0ZW1wb3JhcnkgZW1wdHkgb2JqZWN0IHdpdGgganVzdCB0aGVcbiAgICAgICAgICAgICAgLy8gdHlwZSBzZXQsIHNvIGBnZXRJdGVtRm9ybVNjaGVtYSgpYCBjYW4gZGV0ZXJtaW5lIHRoZSBmb3JtLlxuICAgICAgICAgICAgICB7IHR5cGU6IHRoaXMuY3JlYXRpb25UeXBlIH1cbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICApLFxuICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKFxuICAgICAgICBhc3NpZ25EZWVwbHkoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2FuY2VsOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5jYW5jZWwoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzdWJtaXQ6ICF0aGlzLmlzTXV0YXRpbmcgJiYge1xuICAgICAgICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgICAgICAgLy8gU3VibWl0IGJ1dHRvbnMgY2xvc2UgdGhlIGZvcm0gYnkgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY2xvc2VGb3JtOiB0cnVlLFxuICAgICAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgICAgICBjbGljazogKHsgY29tcG9uZW50OiBidXR0b24gfSkgPT4gYnV0dG9uLnN1Ym1pdCgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuc2NoZW1hLmJ1dHRvbnNcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc0FjdGl2ZVJvdXRlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNMYXN0Um91dGUgfHwgdGhpcy5pc0xhc3RVbm5lc3RlZFJvdXRlXG4gICAgfSxcblxuICAgIGlzVHJhbnNpZW50KCkge1xuICAgICAgcmV0dXJuICF0aGlzLnByb3ZpZGVzRGF0YVxuICAgIH0sXG5cbiAgICBpc0NyZWF0aW5nKCkge1xuICAgICAgLy8gdGhpcy5wYXJhbSBpcyBpbmhlcml0ZWQgZnJvbSBSb3V0ZU1peGluXG4gICAgICByZXR1cm4gdGhpcy5wYXJhbSA9PT0gJ2NyZWF0ZSdcbiAgICB9LFxuXG4gICAgaXNEaXJ0eSgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc011dGF0aW5nICYmICEhdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5pc0RpcnR5XG4gICAgfSxcblxuICAgIGlzTXV0YXRpbmcoKSB7XG4gICAgICAvLyBXaGVuIGBzb3VyY2VTY2hlbWEubXV0YXRlYCBpcyB0cnVlLCB0aGUgZm9ybSBlZGl0cyB0aGUgaW5oZXJpdGVkIGRhdGFcbiAgICAgIC8vIGRpcmVjdGx5IGluc3RlYWQgb2YgbWFraW5nIGEgY29weSBmb3IgcGVyc2lzdGVuY2UgdXBvbiBzdWJtaXNzaW9uLlxuICAgICAgLy8gU2VlIGBpbmhlcml0ZWREYXRhKClgIGNvbXB1dGVkIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gISF0aGlzLnNvdXJjZVNjaGVtYS5tdXRhdGVcbiAgICB9LFxuXG4gICAgc2VsZWN0ZWRUYWIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5zZWxlY3RlZFRhYiB8fCBudWxsXG4gICAgfSxcblxuICAgIGNyZWF0aW9uVHlwZSgpIHtcbiAgICAgIC8vIFRoZSB0eXBlIG9mIGZvcm0gdG8gY3JlYXRlLCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZm9ybXMgdG8gY2hvb3NlIGZyb20uXG4gICAgICByZXR1cm4gdGhpcy4kcm91dGUucXVlcnkudHlwZVxuICAgIH0sXG5cbiAgICBpdGVtSWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMucGFyYW0gPz8gbnVsbFxuICAgIH0sXG5cbiAgICBtZXRob2QoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NyZWF0aW5nID8gJ3Bvc3QnIDogJ3BhdGNoJ1xuICAgIH0sXG5cbiAgICBicmVhZGNydW1iUHJlZml4KCkge1xuICAgICAgcmV0dXJuIGNhcGl0YWxpemUodGhpcy5pc0NyZWF0aW5nID8gdGhpcy52ZXJicy5jcmVhdGUgOiB0aGlzLnZlcmJzLmVkaXQpXG4gICAgfSxcblxuICAgIGRhdGEoKSB7XG4gICAgICAvLyBSZXR1cm4gZGlmZmVyZW50IGRhdGEgXCJjb250YWluZXJzXCIgYmFzZWQgb24gZGlmZmVyZW50IHNjZW5hcmlvczpcbiAgICAgIC8vIDEuIGNyZWF0ZWREYXRhLCBpZiB3ZSdyZSBpbiBhIGZvcm0gZm9yIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG4gICAgICAvLyAyLiBsb2FkZWREYXRhLCBpZiB0aGUgZm9ybSBpdHNlbGYgaXMgdGhlIHJvb3Qgb2YgdGhlIGRhdGEgKGUuZy4gd2hlblxuICAgICAgLy8gICAgZGlyZWN0bHkgbG9hZGluZyBhbiBlZGl0aW5nIHJvb3QpLlxuICAgICAgLy8gMy4gVGhlIGRhdGEgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCwgd2hpY2ggaXRzZWxmIG1heSBiZSBlaXRoZXIgYVxuICAgICAgLy8gICAgdmlldyB0aGF0IGxvYWRlZCB0aGUgZGF0YSwgb3IgYSBmb3JtIHRoYXQgZWl0aGVyIGxvYWRlZCB0aGUgZGF0YSwgb3JcbiAgICAgIC8vICAgIGFsc28gaW5oZXJpdGVkIGl0IGZyb20gaXRzIHBhcmVudC4gTm90ZSB0aGF0IHdlIHVzZSBhIGNsb25lIG9mIGl0LFxuICAgICAgLy8gICAgc28sIGRhdGEgY2hhbmdlcyBhcmVuJ3QgYXBwbGllZCB1bnRpbCBzZXRTb3VyY2VEYXRhKCkgaXMgY2FsbGVkLlxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlZERhdGEgfHwgdGhpcy5sb2FkZWREYXRhIHx8IHRoaXMuaW5oZXJpdGVkRGF0YSB8fCBudWxsXG4gICAgfSxcblxuICAgIGRhdGFQYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YVBhdGhGcm9tKHRoaXMuZGF0YUNvbXBvbmVudClcbiAgICB9LFxuXG4gICAgc291cmNlRGF0YSgpIHtcbiAgICAgIC8vIFBvc3NpYmxlIHBhcmVudHMgYXJlIERpdG9Gb3JtIGZvciBmb3Jtcywgb3IgRGl0b1ZpZXcgZm9yIHJvb3QgbGlzdHMuXG4gICAgICAvLyBCb3RoIGhhdmUgYSBkYXRhIHByb3BlcnR5IHdoaWNoIGFic3RyYWN0cyBhd2F5IGxvYWRpbmcgYW5kIGluaGVyaXRpbmdcbiAgICAgIC8vIG9mIGRhdGEuXG4gICAgICAvLyBGb3JtcyB0aGF0IGFyZSBhYm91dCB0byBiZSBkZXN0cm95ZWQgZHVlIHRvIG5hdmlnYXRpb24gbG9vc2UgdGhlaXJcbiAgICAgIC8vIHJvdXRlLXJlY29yZCwgYnV0IG1pZ2h0IHN0aWxsIHRyaWdnZXIgdGhpcyBnZXR0ZXIuIEZpbHRlciB0aG9zZSBvdXQuXG4gICAgICBsZXQgZGF0YSA9IHRoaXMucm91dGVSZWNvcmQgPyB0aGlzLnBhcmVudFJvdXRlQ29tcG9uZW50LmRhdGEgOiBudWxsXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIGRhdGEgYnkgc3BsaXR0aW5nIHRoZSBkYXRhUGF0aCwgaXRlcmF0ZSB0aHJvdWdoIHRoZVxuICAgICAgICAvLyBhY3R1YWwgZGF0YSBhbmQgbG9vayBuZXN0IGNoaWxkLWRhdGEgdXAuXG4gICAgICAgIGNvbnN0IGRhdGFQYXJ0cyA9IHBhcnNlRGF0YVBhdGgoXG4gICAgICAgICAgdGhpcy5nZXREYXRhUGF0aEZyb20odGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudClcbiAgICAgICAgKVxuICAgICAgICAvLyBDb21wYXJlIGRhdGFQYXJ0cyBhZ2FpbnN0IG1hdGNoZWQgcm91dGVQYXRoIHBhcnRzLCB0byBpZGVudGlmeSB0aG9zZVxuICAgICAgICAvLyBwYXJ0cyB0aGF0IG5lZWQgdG8gYmUgdHJlYXRlZCBsaWtlIGlkcyBhbmQgbWFwcGVkIHRvIGluZGljZXMgaW4gZGF0YS5cbiAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gdGhpcy5yb3V0ZVJlY29yZC5wYXRoLnNwbGl0KCcvJylcbiAgICAgICAgY29uc3Qgcm91dGVQYXJ0cyA9IHBhdGhQYXJ0cy5zbGljZShwYXRoUGFydHMubGVuZ3RoIC0gZGF0YVBhcnRzLmxlbmd0aClcbiAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMuc291cmNlS2V5ID0gbnVsbFxuICAgICAgICBjb25zdCBsYXN0RGF0YVBhcnQgPSBkYXRhUGFydHNbZGF0YVBhcnRzLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmIChpc09iamVjdFNvdXJjZSh0aGlzLnNvdXJjZVNjaGVtYSkgJiYgbGFzdERhdGFQYXJ0ID09PSAnY3JlYXRlJykge1xuICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gb2JqZWN0IHNvdXJjZSBhbmQgYXJlIGNyZWF0aW5nLCB0aGUgZGF0YVBhdGggbmVlZHMgdG9cbiAgICAgICAgICAvLyBiZSBzaG9ydGVuZWQgYnkgdGhlICdjcmVhdGUnIGVudHJ5LiBUaGlzIGlzbid0IG5lZWRlZCBmb3IgbGlzdFxuICAgICAgICAgIC8vIHNvdXJjZXMsIGFzIHRoZXJlIHRoZSBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgbWFwcGVkIHRvIHRoZSBpdGVtIGlkLlxuICAgICAgICAgIGRhdGFQYXJ0cy5sZW5ndGgtLVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gZGF0YVBhcnRzLmxlbmd0aDsgaSA8IGwgJiYgZGF0YTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF0YVBhcnQgPSBkYXRhUGFydHNbaV1cbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIDppZCBwYXJ0LCBmaW5kIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB3aXRoIGdpdmVuIGlkLlxuICAgICAgICAgIGNvbnN0IGtleSA9IC9eOmlkLy50ZXN0KHJvdXRlUGFydHNbaV0pXG4gICAgICAgICAgICA/IGRhdGFQYXJ0ID09PSAnY3JlYXRlJ1xuICAgICAgICAgICAgICA/IG51bGwgLy8gVGhlcmUncyBubyBpbmRleCBmb3IgZW50cmllcyBhYm91dCB0byBiZSBjcmVhdGVkXG4gICAgICAgICAgICAgIDogdGhpcy5maW5kSXRlbUlkSW5kZXgodGhpcy5zb3VyY2VTY2hlbWEsIGRhdGEsIGRhdGFQYXJ0KVxuICAgICAgICAgICAgOiBkYXRhUGFydFxuICAgICAgICAgIC8vIFNraXAgdGhlIGZpbmFsIGxvb2t1cCBidXQgcmVtZW1iZXIgYHNvdXJjZUtleWAsIGFzIHdlIHdhbnQgdGhlXG4gICAgICAgICAgLy8gcGFyZW50IGRhdGEgc28gd2UgY2FuIHJlcGxhY2UgdGhlIGVudHJ5IGF0IGBzb3VyY2VLZXlgIG9uIGl0LlxuICAgICAgICAgIGlmIChpID09PSBsIC0gMSkge1xuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2lkZS1lZmZlY3RzLWluLWNvbXB1dGVkLXByb3BlcnRpZXNcbiAgICAgICAgICAgIHRoaXMuc291cmNlS2V5ID0ga2V5XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhXG4gICAgfSxcblxuICAgIGluaGVyaXRlZERhdGEoKSB7XG4gICAgICAvLyBEYXRhIGluaGVyaXRlZCBmcm9tIHBhcmVudCwgYW5kIGNsb25lZCB0byBwcm90ZWN0IGFnYWluc3QgcmVhY3RpdmVcbiAgICAgIC8vIGNoYW5nZXMgdW50aWwgY2hhbmdlcyBhcmUgYXBwbGllZCB0aHJvdWdoIHNldFNvdXJjZURhdGEoKSwgdW5sZXNzXG4gICAgICAvLyBgc291cmNlU2NoZW1hLm11dGF0ZWAgaXMgdHJ1ZSwgaW4gd2hpY2ggY2FzZSBkYXRhIGlzIG11dGF0ZWQgZGlyZWN0bHkuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNUcmFuc2llbnQgJiZcbiAgICAgICAgdGhpcy5jbG9uZWREYXRhID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdGhpcy5zb3VyY2VEYXRhICYmXG4gICAgICAgIHRoaXMuc291cmNlS2V5ICE9PSBudWxsXG4gICAgICApIHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnNvdXJjZURhdGFbdGhpcy5zb3VyY2VLZXldXG4gICAgICAgIGlmICghdGhpcy5pc011dGF0aW5nKSB7XG4gICAgICAgICAgLy8gVXNlIGEgdHJpY2sgdG8gc3RvcmUgY2xvbmVkIGluaGVyaXRlZCBkYXRhIGluIGNsb25lZERhdGEsIHRvIG1ha2VcbiAgICAgICAgICAvLyBpdCByZWFjdGl2ZSBhbmQgcHJldmVudCBpdCBmcm9tIGJlaW5nIGNsb25lZCBtdWx0aXBsZSB0aW1lcy5cbiAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICAgIHRoaXMuY2xvbmVkRGF0YSA9IGRhdGEgPSBjbG9uZShkYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkYXRhID09PSBudWxsICYmXG4gICAgICAgICAgIXRoaXMuaXNDcmVhdGluZyAmJlxuICAgICAgICAgIGlzT2JqZWN0U291cmNlKHRoaXMuc291cmNlU2NoZW1hKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBJZiBkYXRhIG9mIGFuIG9iamVjdCBzb3VyY2UgaXMgbnVsbCwgcmVkaXJlY3QgdG8gaXRzIGNyZWF0ZSByb3V0ZS5cbiAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHsgcGF0aDogYCR7dGhpcy5wYXRofS9jcmVhdGVgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmNsb25lZERhdGFcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uaGFzRGF0YSgpXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuZGF0YVxuICAgIH0sXG5cbiAgICBpdGVtTGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zb3VyY2VTY2hlbWEsIHRoaXMuZGF0YSwgeyBleHRlbmRlZDogdHJ1ZSB9KVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgICRyb3V0ZToge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1yb3V0ZXIvaXNzdWVzLzMzOTMjaXNzdWVjb21tZW50LTExNTg0NzAxNDlcbiAgICAgIGZsdXNoOiAncG9zdCcsXG4gICAgICBoYW5kbGVyKHRvLCBmcm9tKSB7XG4gICAgICAgIC8vIFJlbG9hZCBmb3JtIGRhdGEgd2hlbiBuYXZpZ2F0aW5nIHRvIGEgZGlmZmVyZW50IGVudGl0eSBpbiBzYW1lIGZvcm0uXG4gICAgICAgIGNvbnN0IHBhcmFtID0gdGhpcy5tZXRhPy5wYXJhbVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcGFyYW0gJiZcbiAgICAgICAgICB0aGlzLnByb3ZpZGVzRGF0YSAmJlxuICAgICAgICAgIC8vIFRPRE86IFNlZSBpZiB3ZSBjYW4gcmVtb3ZlIHRoaXMgZHVlIHRvIGBmbHVzaDogJ3Bvc3QnYC5cbiAgICAgICAgICBmcm9tLm1hdGNoZWRbMF0ucGF0aCA9PT0gdG8ubWF0Y2hlZFswXS5wYXRoICYmIC8vIFN0YXlpbmcgb24gc2FtZSBmb3JtXG4gICAgICAgICAgZnJvbS5wYXJhbXNbcGFyYW1dICE9PSAnY3JlYXRlJyAmJiAvLyBCdXQgaGF2ZW4ndCBiZWVuIGNyZWF0aW5nXG4gICAgICAgICAgdG8ucGFyYW1zW3BhcmFtXSAhPT0gZnJvbS5wYXJhbXNbcGFyYW1dIC8vIEdvaW5nIHRvIGEgZGlmZmVyZW50IGVudGl0eVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmxvYWREYXRhKHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc291cmNlRGF0YTogJ2NsZWFyQ2xvbmVkRGF0YScsXG4gICAgLy8gTmVlZGVkIGZvciB0aGUgJ2NyZWF0ZScgcmVkaXJlY3QgaW4gYGluaGVyaXRlZERhdGEoKWAgdG8gd29yazpcbiAgICBjcmVhdGU6ICdzZXR1cERhdGEnXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGVtaXRTY2hlbWFFdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5lbWl0RXZlbnQoZXZlbnQsIHBhcmFtcylcbiAgICB9LFxuXG4gICAgZ2V0RGF0YVBhdGhGcm9tKHJvdXRlQ29tcG9uZW50KSB7XG4gICAgICAvLyBHZXQgdGhlIGRhdGEgcGF0aCBieSBkZW5vcm1hbGl6ZVBhdGggdGhlIHJlbGF0aXZlIHJvdXRlIHBhdGhcbiAgICAgIHJldHVybiB0aGlzLmFwaS5kZW5vcm1hbGl6ZVBhdGgoXG4gICAgICAgIHRoaXMucGF0aFxuICAgICAgICAgIC8vIERpdG9WaWV3cyBoYXZlIG5lc3RlZCByb3V0ZXMsIHNvIGRvbid0IHJlbW92ZSB0aGVpciBwYXRoLlxuICAgICAgICAgIC5zbGljZSgocm91dGVDb21wb25lbnQuaXNWaWV3ID8gMCA6IHJvdXRlQ29tcG9uZW50LnBhdGgubGVuZ3RoKSArIDEpXG4gICAgICApXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLmdldFJlc291cmNlKClcbiAgICBnZXRSZXNvdXJjZShvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IFJlc291cmNlTWl4aW4ubWV0aG9kcy5nZXRSZXNvdXJjZS5jYWxsKHRoaXMsIG9wdGlvbnMpXG4gICAgICByZXR1cm4gZ2V0TWVtYmVyUmVzb3VyY2UodGhpcy5pdGVtSWQsIHJlc291cmNlKSB8fCByZXNvdXJjZVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5zZXR1cERhdGEoKVxuICAgIHNldHVwRGF0YSgpIHtcbiAgICAgIGlmICh0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVkRGF0YSB8fD0gdGhpcy5jcmVhdGVEYXRhKHRoaXMuc2NoZW1hLCB0aGlzLmNyZWF0aW9uVHlwZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW5zdXJlRGF0YSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldFNvdXJjZURhdGEoZGF0YSkge1xuICAgICAgaWYgKHRoaXMuc291cmNlRGF0YSAmJiB0aGlzLnNvdXJjZUtleSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB7IG1haW5TY2hlbWFDb21wb25lbnQgfSA9IHRoaXNcbiAgICAgICAgdGhpcy5zb3VyY2VEYXRhW3RoaXMuc291cmNlS2V5XSA9XG4gICAgICAgICAgbWFpblNjaGVtYUNvbXBvbmVudC5maWx0ZXJEYXRhKGRhdGEpLmxvY2FsRGF0YVxuICAgICAgICBtYWluU2NoZW1hQ29tcG9uZW50Lm9uQ2hhbmdlKClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBhZGRTb3VyY2VEYXRhKGRhdGEpIHtcbiAgICAgIHJldHVybiBpc09iamVjdFNvdXJjZSh0aGlzLnNvdXJjZVNjaGVtYSlcbiAgICAgICAgPyB0aGlzLnNldFNvdXJjZURhdGEoZGF0YSlcbiAgICAgICAgOiAhIXRoaXMuc291cmNlRGF0YT8ucHVzaChkYXRhKVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5jbGVhckRhdGEoKVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMuc2V0RGF0YShudWxsKVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5zZXREYXRhKClcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIC8vIHNldERhdGEoKSBpcyBjYWxsZWQgYWZ0ZXIgc3VibWl0IHdoZW4gZGF0YSBoYXMgY2hhbmdlZC5cbiAgICAgIGlmICh0aGlzLmlzVHJhbnNpZW50KSB7XG4gICAgICAgIC8vIEZvciBjb21wb25lbnRzIHdpdGggdHJhbnNpZW50IGRhdGEsIG1vZGlmeSB0aGlzLnNvdXJjZURhdGEuXG4gICAgICAgIHRoaXMuc2V0U291cmNlRGF0YShkYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jcmVhdGVkRGF0YSA9IG51bGxcbiAgICAgICAgdGhpcy5sb2FkZWREYXRhID0gZGF0YVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjbGVhckNsb25lZERhdGEodG8sIGZyb20pIHtcbiAgICAgIC8vIE9ubHkgY2xlYXIgaWYgdGhlIHdhdGNoZWQgc291cmNlRGF0YSBpdHNlbGYgY2hhbmdlcyBpbiB0aGUgZm9ybS5cbiAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICB0aGlzLmNsb25lZERhdGEgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgY2FuY2VsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xvc2UoKVxuICAgIH0sXG5cbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlKHRoaXMucGFyZW50Um91dGVDb21wb25lbnQucGF0aClcbiAgICB9LFxuXG4gICAgZ2V0U3VibWl0VmVyYihwcmVzZW50ID0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICA/IHByZXNlbnRcbiAgICAgICAgICA/ICdjcmVhdGUnXG4gICAgICAgICAgOiAnY3JlYXRlZCdcbiAgICAgICAgOiBwcmVzZW50XG4gICAgICAgICAgPyAnc3VibWl0J1xuICAgICAgICAgIDogJ3N1Ym1pdHRlZCdcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VibWl0KGJ1dHRvbiwgeyB2YWxpZGF0ZSA9IHRydWUsIGNsb3NlRm9ybSA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgaWYgKHZhbGlkYXRlICYmICF0aGlzLnZhbGlkYXRlQWxsKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdldFZlcmIgPSBwcmVzZW50ID0+IHRoaXMudmVyYnNbdGhpcy5nZXRTdWJtaXRWZXJiKHByZXNlbnQpXVxuXG4gICAgICAvLyBBbGxvdyBidXR0b25zIHRvIG92ZXJyaWRlIGJvdGggbWV0aG9kIGFuZCByZXNvdXJjZSBwYXRoIHRvIHN1Ym1pdCB0bzpcbiAgICAgIGxldCB7IG1ldGhvZCB9ID0gdGhpc1xuICAgICAgbGV0IHJlc291cmNlID0gdGhpcy5nZXRSZXNvdXJjZSh7IG1ldGhvZCB9KVxuICAgICAgY29uc3QgYnV0dG9uUmVzb3VyY2UgPSBnZXRSZXNvdXJjZShidXR0b24uc2NoZW1hLnJlc291cmNlLCB7XG4gICAgICAgIHBhcmVudDogcmVzb3VyY2VcbiAgICAgIH0pXG4gICAgICByZXNvdXJjZSA9IGJ1dHRvblJlc291cmNlIHx8IHJlc291cmNlXG4gICAgICBtZXRob2QgPSByZXNvdXJjZT8ubWV0aG9kIHx8IG1ldGhvZFxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpXG4gICAgICBsZXQgc3VjY2Vzc1xuICAgICAgaWYgKCFidXR0b25SZXNvdXJjZSAmJiB0aGlzLmlzVHJhbnNpZW50KSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zaWVudChidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEsIHtcbiAgICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHRoaXMuZW1pdFNjaGVtYUV2ZW50KHRoaXMuZ2V0U3VibWl0VmVyYigpKSxcbiAgICAgICAgICBvbkVycm9yOiBlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5lbWl0U2NoZW1hRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IGVycm9yIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG5vdGlmeVN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmlzQ3JlYXRpbmdcbiAgICAgICAgICAgICAgICA/IGBJdGVtICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gXG4gICAgICAgICAgICAgICAgOiBgQ2hhbmdlICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gLFxuICAgICAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICAgICAgdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgICAgICAgICAgICA/IGAke3RoaXMuaXRlbUxhYmVsfSB3YXMgJHt2ZXJifS5gXG4gICAgICAgICAgICAgICAgICA6IGBDaGFuZ2VzIHRvICR7dGhpcy5pdGVtTGFiZWx9IHdlcmUgJHt2ZXJifS5gLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNpZW50Tm90ZVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbm90aWZ5RXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKHRydWUpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICB0aXRsZTogJ1JlcXVlc3QgRXJyb3InLFxuICAgICAgICAgICAgICB0ZXh0OiBgVW5hYmxlIHRvICR7dmVyYn0gJHt0aGlzLml0ZW1MYWJlbH0uYFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWNjZXNzID0gYXdhaXQgdGhpcy5zdWJtaXRSZXNvdXJjZShidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEsIHtcbiAgICAgICAgICBzZXREYXRhOiB0cnVlLFxuICAgICAgICAgIG9uU3VjY2VzczogKCkgPT4gdGhpcy5lbWl0U2NoZW1hRXZlbnQodGhpcy5nZXRTdWJtaXRWZXJiKCkpLFxuICAgICAgICAgIG9uRXJyb3I6IGVycm9yID0+XG4gICAgICAgICAgICB0aGlzLmVtaXRTY2hlbWFFdmVudCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgZXJyb3IgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgbm90aWZ5U3VjY2VzczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmVyYiA9IGdldFZlcmIoZmFsc2UpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgdGl0bGU6IGBTdWNjZXNzZnVsbHkgJHtjYXBpdGFsaXplKHZlcmIpfWAsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuaXRlbUxhYmVsfSB3YXMgJHt2ZXJifS5gXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbm90aWZ5RXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKHRydWUpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICB0aXRsZTogJ1JlcXVlc3QgRXJyb3InLFxuICAgICAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byAke3ZlcmJ9ICR7dGhpcy5pdGVtTGFiZWx9JHtlcnJvciA/ICc6JyA6ICcnfWAsXG4gICAgICAgICAgICAgICAgZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3JcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbigpXG4gICAgICAgIGlmIChjbG9zZUZvcm0gfHwgYnV0dG9uLmNsb3NlRm9ybSkge1xuICAgICAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDcmVhdGluZykge1xuICAgICAgICAgIC8vIFJlZGlyZWN0IHRvIHRoZSBmb3JtIGVkaXRpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbTpcbiAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0SXRlbUlkKHRoaXMuc2NoZW1hLCB0aGlzLmRhdGEpXG4gICAgICAgICAgdGhpcy4kcm91dGVyLnJlcGxhY2Uoe1xuICAgICAgICAgICAgcGF0aDogcmVzb2x2ZVBhdGgoYCR7dGhpcy5wYXRofS8uLi8ke2lkfWApLFxuICAgICAgICAgICAgLy8gUHJlc2VydmUgaGFzaCBmb3IgdGFiczpcbiAgICAgICAgICAgIGhhc2g6IHRoaXMuJHJvdXRlLmhhc2hcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH0sXG5cbiAgICBhc3luYyBzdWJtaXRUcmFuc2llbnQoYnV0dG9uLCBfcmVzb3VyY2UsIF9tZXRob2QsIGRhdGEsIHtcbiAgICAgIG9uU3VjY2VzcyxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBub3RpZnlTdWNjZXNzLFxuICAgICAgbm90aWZ5RXJyb3JcbiAgICB9KSB7XG4gICAgICAvLyBIYW5kbGUgdGhlIGRlZmF1bHQgXCJzdWJtaXR0aW5nXCIgb2YgdHJhbnNpZW50LCBuZXN0ZWQgZGF0YTpcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmlzQ3JlYXRpbmdcbiAgICAgICAgPyB0aGlzLmFkZFNvdXJjZURhdGEoZGF0YSlcbiAgICAgICAgOiB0aGlzLnNldFNvdXJjZURhdGEoZGF0YSlcbiAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgIG9uU3VjY2Vzcz8uKClcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0QnV0dG9uRXZlbnQoYnV0dG9uLCAnc3VjY2VzcycsIHtcbiAgICAgICAgICBub3RpZnk6IG5vdGlmeVN1Y2Nlc3NcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gJ0NvdWxkIG5vdCBzdWJtaXQgdHJhbnNpZW50IGl0ZW0nXG4gICAgICAgIG9uRXJyb3I/LihlcnJvcilcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0QnV0dG9uRXZlbnQoYnV0dG9uLCAnZXJyb3InLCB7XG4gICAgICAgICAgbm90aWZ5OiBub3RpZnlFcnJvcixcbiAgICAgICAgICBlcnJvclxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN1Y2Nlc3NcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4vLy0gVXNlIGEgPGRpdj4gZm9yIG5lc3RlZCBmb3JtcywgYXMgd2Ugc2hvdWxkbid0IG5lc3QgYWN0dWFsIDxmb3JtPiB0YWdzLlxuZGl2KFxuICB2LWlmPVwibmVzdGVkXCJcbilcbiAgc2xvdFxuZm9ybS5kaXRvLXNjcm9sbC1wYXJlbnQoXG4gIHYtZWxzZVxuICBAc3VibWl0LnByZXZlbnRcbilcbiAgc2xvdFxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Zvcm1Jbm5lcicsIHtcbiAgcHJvcHM6IHtcbiAgICBuZXN0ZWQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0Zvcm0gZnJvbSAnLi9EaXRvRm9ybS52dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Zvcm1OZXN0ZWQnLCB7XG4gIGV4dGVuZHM6IERpdG9Gb3JtXG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tZm9ybS1uZXN0ZWQge1xuICAvLyBObyBzY3JvbGxpbmcgaW5zaWRlIG5lc3RlZCBmb3JtcywgYW5kIHByZXZlbnQgb3BlbiAubXVsdGlzZWxlY3QgZnJvbVxuICAvLyBiZWluZyBjcm9wcGVkLlxuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tZXJyb3JzKFxuICB2LWlmPVwiZXJyb3JzXCJcbilcbiAgdWxcbiAgICBsaShcbiAgICAgIHYtZm9yPVwiZXJyb3Igb2YgZXJyb3JzXCJcbiAgICApIHt7IGVycm9yIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHRpcHB5IGZyb20gJ3RpcHB5LmpzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IG1hcmtSYXcgfSBmcm9tICd2dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Vycm9ycycsIHtcbiAgcHJvcHM6IHtcbiAgICBlcnJvcnM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpcDogbnVsbFxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGVycm9ycygpIHtcbiAgICAgIHRoaXMuJG5leHRUaWNrKHRoaXMudXBkYXRlRXJyb3JzKVxuICAgIH1cbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy50aXA/LmRlc3Ryb3koKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB1cGRhdGVFcnJvcnMoKSB7XG4gICAgICBsZXQgeyB0aXAgfSA9IHRoaXNcbiAgICAgIHRpcD8uaGlkZSgpXG4gICAgICBpZiAodGhpcy5lcnJvcnMpIHtcbiAgICAgICAgdGlwID0gdGhpcy50aXAgPz89IG1hcmtSYXcodGlwcHkodGhpcy4kZWwuY2xvc2VzdCgnLmRpdG8tY29udGFpbmVyJykpKVxuICAgICAgICB0aXAuc2V0UHJvcHMoe1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuZXJyb3JzLmpvaW4oJ1xcbicpLFxuICAgICAgICAgIHRoZW1lOiAnZXJyb3InLFxuICAgICAgICAgIHRyaWdnZXI6ICdtYW51YWwnLFxuICAgICAgICAgIGFwcGVuZFRvOiAncGFyZW50JyxcbiAgICAgICAgICBwbGFjZW1lbnQ6ICdib3R0b20tc3RhcnQnLFxuICAgICAgICAgIGFuaW1hdGlvbjogJ3NoaWZ0LWF3YXktc3VidGxlJyxcbiAgICAgICAgICBwb3BwZXJPcHRpb25zOiB7XG4gICAgICAgICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdmbGlwJyxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICBoaWRlT25DbGljazogZmFsc2UsXG4gICAgICAgICAgb2Zmc2V0OiBbMywgM10sIC8vIDEvMiBmb3JtLXNwYWNpbmdcbiAgICAgICAgICB6SW5kZXg6IDFcbiAgICAgICAgfSlcbiAgICAgICAgdGlwLnBvcHBlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoKSA9PiB0aXAuaGlkZSgpKVxuICAgICAgICB0aXAuc2hvdygpXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZXJyb3JzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG5cbiAgdWwge1xuICAgIGNvbG9yOiAkY29sb3ItZXJyb3I7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc2NvcGVzXG4gIFJvdXRlckxpbmsoXG4gICAgdi1mb3I9XCIoc2NvcGUsIGtleSkgaW4gc2NvcGVzXCJcbiAgICA6a2V5PVwia2V5XCJcbiAgICB2LXNsb3Q9XCJ7IG5hdmlnYXRlIH1cIlxuICAgIDp0bz1cImdldFNjb3BlTGluayhzY29wZSlcIlxuICAgIGN1c3RvbVxuICApXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWJ1dHRvbi0tc2VsZWN0ZWQnOiBzY29wZS5uYW1lID09PSBxdWVyeS5zY29wZSB9XCJcbiAgICAgIDp0aXRsZT1cInNjb3BlLmhpbnQgfHwgZ2V0TGFiZWwoc2NvcGUpXCJcbiAgICAgIEBjbGljaz1cIm5hdmlnYXRlXCJcbiAgICApIHt7IGdldExhYmVsKHNjb3BlKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1Njb3BlcycsIHtcbiAgcHJvcHM6IHtcbiAgICBxdWVyeTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2NvcGVzOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRTY29wZUxpbmsoc2NvcGUpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0geyAuLi50aGlzLnF1ZXJ5LCBzY29wZTogc2NvcGUubmFtZSB9XG4gICAgICBpZiAocXVlcnkucGFnZSkge1xuICAgICAgICBxdWVyeS5wYWdlID0gMFxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlMaW5rKHF1ZXJ5KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjb3BlcyB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgLmRpdG8tYnV0dG9uIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgLy8gQSBiaXQgbW9yZSB0aGFuIHRoZSB3aWR0aCBvZiBlbGxpcHNpcywgdG8gcHJldmVudCByZXBsYWNpbmcgc2hvcnQgd29yZHNcbiAgICAvLyB3aXRoIGVsbGlwc2lzLlxuICAgIG1pbi13aWR0aDogM2VtO1xuICAgIGZsZXg6IDAgMSBhdXRvO1xuXG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxZW07XG4gICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxZW07XG4gICAgICBwYWRkaW5nLWxlZnQ6IDFlbTtcbiAgICB9XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDFlbTtcbiAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxZW07XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07XG4gICAgfVxuXG4gICAgJiArIC5kaXRvLWJ1dHRvbiB7XG4gICAgICBtYXJnaW4tbGVmdDogLTFweDtcbiAgICB9IC8vIERvbid0IGNvdmVyIHRoZSBmb2N1c2VkIGJvcmRlciBvZiBidXR0b25zOlxuICAgICY6Zm9jdXMge1xuICAgICAgei1pbmRleDogMTtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuUGFnaW5hdGlvbihcbiAgdi1tb2RlbDpwYWdlPVwicGFnZVwiXG4gIDpwYWdlU2l6ZT1cImxpbWl0XCJcbiAgOnRvdGFsPVwidG90YWxcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IERpdG9QYWdpbmF0aW9uIGFzIFBhZ2luYXRpb24gfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhZ2luYXRpb24nLCB7XG4gIGNvbXBvbmVudHM6IHsgUGFnaW5hdGlvbiB9LFxuXG4gIHByb3BzOiB7XG4gICAgcXVlcnk6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHBhZ2U6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuICgrdGhpcy5xdWVyeS5wYWdlIHx8IDApICsgMVxuICAgICAgfSxcblxuICAgICAgc2V0KHBhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZSAhPT0gcGFnZSkge1xuICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKFxuICAgICAgICAgICAgdGhpcy5nZXRRdWVyeUxpbmsoe1xuICAgICAgICAgICAgICAuLi50aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgICBwYWdlOiBwYWdlIC0gMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXREcmFnZ2FibGVPcHRpb25zKGZvcmNlRmFsbGJhY2sgPSBmYWxzZSkge1xuICAgICAgY29uc3QgcHJlZml4ID0gJ2RpdG8tZHJhZ2dhYmxlJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgIGhhbmRsZTogJy5kaXRvLWJ1dHRvbi0tZHJhZycsXG4gICAgICAgIGRyYWdDbGFzczogYCR7cHJlZml4fV9fZHJhZ2AsXG4gICAgICAgIGNob3NlbkNsYXNzOiBgJHtwcmVmaXh9X19jaG9zZW5gLFxuICAgICAgICBnaG9zdENsYXNzOiBgJHtwcmVmaXh9X19naG9zdGAsXG4gICAgICAgIGZhbGxiYWNrQ2xhc3M6IGAke3ByZWZpeH1fX2ZhbGxiYWNrYCxcbiAgICAgICAgZm9yY2VGYWxsYmFjayxcbiAgICAgICAgb25TdGFydDogdGhpcy5vblN0YXJ0RHJhZyxcbiAgICAgICAgb25FbmQ6IHRoaXMub25FbmREcmFnXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uU3RhcnREcmFnKCkge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZVxuICAgIH0sXG5cbiAgICBvbkVuZERyYWcoeyBvbGRJbmRleCwgbmV3SW5kZXggfSkge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2VcbiAgICAgIGlmIChvbGRJbmRleCAhPT0gbmV3SW5kZXgpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHVwZGF0ZU9yZGVyKHNvdXJjZVNjaGVtYSwgbGlzdCwgcGFnaW5hdGlvblJhbmdlKSB7XG4gICAgICBjb25zdCB7IG9yZGVyS2V5IH0gPSBzb3VyY2VTY2hlbWFcbiAgICAgIGlmIChvcmRlcktleSkge1xuICAgICAgICAvLyBSZW9yZGVyIHRoZSBjaGFuZ2VkIGVudHJpZXMgYnkgdGhlaXIgb3JkZXIga2V5LCB0YWtpbmcgcGFnaW5hdGlvblxuICAgICAgICAvLyBvZmZzZXRzIGludG8gYWNjb3VudDpcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFnaW5hdGlvblJhbmdlPy5bMF0gfHwgMFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBsaXN0W2ldW29yZGVyS2V5XSA9IGkgKyBvZmZzZXRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmVlLWl0ZW0oXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOmNsYXNzPWB7XG4gICAgJ2RpdG8tdHJlZS1pdGVtLS1kcmFnZ2luZyc6IGlzRHJhZ2dpbmcsXG4gICAgJ2RpdG8tdHJlZS1pdGVtLS1hY3RpdmUnOiBhY3RpdmVcbiAgfWBcbiAgOnN0eWxlPVwibGV2ZWwgPiAwICYmIHsgJy0tbGV2ZWwnOiBsZXZlbCB9XCJcbiAgOmRhdGEtcGF0aD1cInBhdGhcIlxuKVxuICAuZGl0by10cmVlLWhlYWRlcihcbiAgICB2LWlmPVwibGFiZWxcIlxuICApXG4gICAgLmRpdG8tdHJlZS1icmFuY2goXG4gICAgICB2LWlmPVwibnVtRW50cmllc1wiXG4gICAgICBAY2xpY2suc3RvcD1cIm9wZW5lZCA9ICFvcGVuZWRcIlxuICAgIClcbiAgICAgIC5kaXRvLWNoZXZyb24oXG4gICAgICAgIHYtaWY9XCJudW1FbnRyaWVzXCJcbiAgICAgICAgOmNsYXNzPVwieyAnZGl0by1jaGV2cm9uLS1vcGVuJzogb3BlbmVkIH1cIlxuICAgICAgKVxuICAgICAgLmRpdG8tdHJlZS1sYWJlbChcbiAgICAgICAgdi1odG1sPVwibGFiZWxcIlxuICAgICAgKVxuICAgICAgLmRpdG8tdHJlZS1pbmZvKFxuICAgICAgICB2LWlmPVwiZGV0YWlsc1wiXG4gICAgICApIHt7IGRldGFpbHMgfX1cbiAgICAuZGl0by10cmVlLWxlYWYoXG4gICAgICB2LWVsc2VcbiAgICApXG4gICAgICAuZGl0by10cmVlLWxhYmVsKFxuICAgICAgICB2LWh0bWw9XCJsYWJlbFwiXG4gICAgICApXG4gICAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtLXNtYWxsKFxuICAgICAgdi1pZj1cImhhc0VkaXRCdXR0b25zXCJcbiAgICApXG4gICAgICAvLy0gRmlyZWZveCBkb2Vzbid0IGxpa2UgPGJ1dHRvbj4gaGVyZSwgc28gdXNlIDxhPiBpbnN0ZWFkOlxuICAgICAgYS5kaXRvLWJ1dHRvbihcbiAgICAgICAgdi1pZj1cImRyYWdnYWJsZVwiXG4gICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZHJhZylcIlxuICAgICAgKVxuICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICB2LWlmPVwiZWRpdGFibGVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5lZGl0KVwiXG4gICAgICAgIEBjbGljaz1cIm9uRWRpdFwiXG4gICAgICApXG4gICAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICAgIHYtaWY9XCJkZWxldGFibGVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kZWxldGUpXCJcbiAgICAgICAgQGNsaWNrPVwib25EZWxldGVcIlxuICAgICAgKVxuICB0YWJsZS5kaXRvLXByb3BlcnRpZXMoXG4gICAgdi1pZj1cInByb3BlcnRpZXNcIlxuICAgIHYtc2hvdz1cIm9wZW5lZFwiXG4gIClcbiAgICB0cihcbiAgICAgIHYtZm9yPVwicHJvcGVydHkgaW4gcHJvcGVydGllc1wiXG4gICAgKVxuICAgICAgdGRcbiAgICAgICAgRGl0b0xhYmVsKFxuICAgICAgICAgIHYtaWY9XCJwcm9wZXJ0eS5sYWJlbCAhPT0gZmFsc2VcIlxuICAgICAgICAgIDpkYXRhUGF0aD1cImdldFByb3BlcnR5RGF0YVBhdGgocHJvcGVydHkpXCJcbiAgICAgICAgICA6bGFiZWw9XCJnZXRMYWJlbChwcm9wZXJ0eSlcIlxuICAgICAgICApXG4gICAgICBEaXRvVGFibGVDZWxsKFxuICAgICAgICA6Y2VsbD1cInByb3BlcnR5XCJcbiAgICAgICAgOnNjaGVtYT1cInByb3BlcnR5XCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZ2V0UHJvcGVydHlEYXRhUGF0aChwcm9wZXJ0eSlcIlxuICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICA6bWV0YT1cIm5lc3RlZE1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIClcbiAgRGl0b0RyYWdnYWJsZShcbiAgICB2LWlmPVwiY2hpbGRyZW5TY2hlbWFcIlxuICAgIHYtc2hvdz1cIm9wZW5lZFwiXG4gICAgOm9wdGlvbnM9XCJnZXREcmFnZ2FibGVPcHRpb25zKHRydWUpXCJcbiAgICA6ZHJhZ2dhYmxlPVwiY2hpbGRyZW5EcmFnZ2FibGVcIlxuICAgIDptb2RlbFZhbHVlPVwidXBkYXRlT3JkZXIoY2hpbGRyZW5TY2hlbWEsIGNoaWxkcmVuTGlzdClcIlxuICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cInZhbHVlID0+IChjaGlsZHJlbkxpc3QgPSB2YWx1ZSlcIlxuICApXG4gICAgRGl0b1RyZWVJdGVtKFxuICAgICAgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNoaWxkcmVuSXRlbXNcIlxuICAgICAgOmtleT1cImdldEl0ZW1VaWQoY2hpbGRyZW5TY2hlbWEsIGl0ZW0uZGF0YSlcIlxuICAgICAgOnNjaGVtYT1cImNoaWxkcmVuU2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cImdldEl0ZW1EYXRhUGF0aChjaGlsZHJlblNjaGVtYSwgaW5kZXgpXCJcbiAgICAgIDpkYXRhPVwiaXRlbS5kYXRhXCJcbiAgICAgIDpwYXRoPVwiaXRlbS5wYXRoXCJcbiAgICAgIDpvcGVuPVwiaXRlbS5vcGVuXCJcbiAgICAgIDphY3RpdmU9XCJpdGVtLmFjdGl2ZVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiY2hpbGRyZW5EcmFnZ2FibGVcIlxuICAgICAgOmxhYmVsPVwiZ2V0SXRlbUxhYmVsKGNoaWxkcmVuU2NoZW1hLCBpdGVtLmRhdGEsIHsgaW5kZXggfSlcIlxuICAgICAgOmxldmVsPVwibGV2ZWwgKyAxXCJcbiAgICApXG4gICAgLy8tIFRPRE86IENvbnZlcnQgZGl0by10cmVlLWl0ZW0gdG8gdXNlIGRpdG8tbGFiZWwgaW50ZXJuYWxseSwgYW5kIHRoZW5cbiAgICAvLy0gcGFzcyBgYXNPYmplY3Q6IHRydWVgIGluIHRoZSBgZ2V0SXRlbUxhYmVsKClgIGNhbGwgYWJvdmUuXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0l0ZW1NaXhpbidcbmltcG9ydCBTb3J0YWJsZU1peGluIGZyb20gJy4uL21peGlucy9Tb3J0YWJsZU1peGluLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGdldE5hbWVkU2NoZW1hcywgaGFzRm9ybVNjaGVtYSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVHJlZUl0ZW0nLCB7XG4gIG1peGluczogW0l0ZW1NaXhpbiwgU29ydGFibGVNaXhpbl0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTpkYXRhJ10sXG4gIGluamVjdDogWydjb250YWluZXInXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogW0FycmF5LCBPYmplY3RdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgcGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgb3BlbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGFjdGl2ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRyYWdnYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGxhYmVsOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGxldmVsOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlbmVkOiB0aGlzLm9wZW4gfHwgdGhpcy5zY2hlbWEub3BlblxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG1ldGEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXIubWV0YVxuICAgIH0sXG5cbiAgICBzdG9yZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5zdG9yZVxuICAgIH0sXG5cbiAgICBkaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5kaXNhYmxlZFxuICAgIH0sXG5cbiAgICBuZXN0ZWRNZXRhKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGhpcy5tZXRhLFxuICAgICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hXG4gICAgICB9XG4gICAgfSxcblxuICAgIHByb3BlcnRpZXMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnByb3BlcnRpZXMpXG4gICAgfSxcblxuICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGJlIG5hbWVkIGBzb3VyY2VTY2hlbWFgIGluc3RlYWQ/IFVzZSBTb3VyY2VNaXhpbj9cbiAgICBjaGlsZHJlblNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5jaGlsZHJlblxuICAgIH0sXG5cbiAgICBjaGlsZHJlbkxpc3Q6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuY2hpbGRyZW5TY2hlbWE/Lm5hbWVcbiAgICAgICAgcmV0dXJuIG5hbWUgJiYgdGhpcy5kYXRhW25hbWVdXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuY2hpbGRyZW5TY2hlbWE/Lm5hbWVcbiAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU9yZGVyKHRoaXMuY2hpbGRyZW5TY2hlbWEsIHZhbHVlKVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tbXV0YXRpbmctcHJvcHNcbiAgICAgICAgICB0aGlzLmRhdGFbbmFtZV0gPSB2YWx1ZVxuICAgICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpkYXRhJywgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hpbGRyZW5EcmFnZ2FibGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmNoaWxkcmVuTGlzdD8ubGVuZ3RoID4gMSAmJlxuICAgICAgICB0aGlzLmdldFNjaGVtYVZhbHVlKCdkcmFnZ2FibGUnLCB7XG4gICAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuY2hpbGRyZW5TY2hlbWFcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgbnVtQ2hpbGRyZW4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbkxpc3Q/Lmxlbmd0aCB8fCAwXG4gICAgfSxcblxuICAgIG51bVByb3BlcnRpZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzPy5sZW5ndGggfHwgMFxuICAgIH0sXG5cbiAgICBudW1FbnRyaWVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubnVtUHJvcGVydGllcyArIHRoaXMubnVtQ2hpbGRyZW5cbiAgICB9LFxuXG4gICAgY2hpbGRyZW5JdGVtcygpIHtcbiAgICAgIGNvbnN0IHsgY2hpbGRyZW5TY2hlbWEsIGNoaWxkcmVuTGlzdCB9ID0gdGhpc1xuICAgICAgaWYgKGNoaWxkcmVuU2NoZW1hICYmIGNoaWxkcmVuTGlzdCkge1xuICAgICAgICBjb25zdCB7IGVkaXRQYXRoIH0gPSB0aGlzLmNvbnRhaW5lclxuICAgICAgICBjb25zdCBjaGlsZHJlbk9wZW4gPSAhdGhpcy5wYXRoICYmIGNoaWxkcmVuU2NoZW1hLm9wZW5cbiAgICAgICAgLy8gQnVpbGQgYSBjaGlsZHJlbiBsaXN0IHdpdGggY2hpbGQgbWV0YSBpbmZvcm1hdGlvbiBmb3IgdGhlIHRlbXBsYXRlLlxuICAgICAgICByZXR1cm4gY2hpbGRyZW5MaXN0Lm1hcCgoZGF0YSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gKFxuICAgICAgICAgICAgY2hpbGRyZW5TY2hlbWEucGF0aCAmJlxuICAgICAgICAgICAgYCR7dGhpcy5wYXRofS8ke2NoaWxkcmVuU2NoZW1hLnBhdGh9LyR7aW5kZXh9YFxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zdCBvcGVuID0gKFxuICAgICAgICAgICAgY2hpbGRyZW5PcGVuIHx8XG4gICAgICAgICAgICAvLyBPbmx5IGNvdW50IGFzIFwiaW4gZWRpdCBwYXRoXCIgd2hlbiBpdCdzIG5vdCB0aGUgZnVsbCBlZGl0IHBhdGguXG4gICAgICAgICAgICBlZGl0UGF0aC5zdGFydHNXaXRoKHBhdGgpICYmIHBhdGgubGVuZ3RoIDwgZWRpdFBhdGgubGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IGVkaXRQYXRoID09PSBwYXRoXG4gICAgICAgICAgcmV0dXJuIHsgZGF0YSwgcGF0aCwgb3BlbiwgYWN0aXZlIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXVxuICAgIH0sXG5cbiAgICBkZXRhaWxzKCkge1xuICAgICAgY29uc3QgeyBudW1DaGlsZHJlbiB9ID0gdGhpc1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgbnVtQ2hpbGRyZW4gJiZcbiAgICAgICAgYCR7bnVtQ2hpbGRyZW59ICR7XG4gICAgICAgICAgbnVtQ2hpbGRyZW4gPT09IDEgPyAnaXRlbScgOiAnaXRlbXMnXG4gICAgICAgIH1gXG4gICAgICApXG4gICAgfSxcblxuICAgIGhhc0VkaXRCdXR0b25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZHJhZ2dhYmxlIHx8IHRoaXMuZWRpdGFibGUgfHwgdGhpcy5kZWxldGFibGVcbiAgICB9LFxuXG4gICAgLy8gVE9ETzogU3VwcG9ydCBjcmVhdGFibGUhXG4gICAgLy8gVE9ETzogQWRkIHN1cHBvcnQgZm9yIGNyZWF0YWJsZSwgZWRpdGFibGUgYW5kIGRlbGV0YWJsZSBvdmVycmlkZXMgb24gdGhlXG4gICAgLy8gYXNzb2NpYXRlZCBmb3JtcywganVzdCBsaWtlIGluIGBUeXBlTGlzdGAgYW5kIGBUeXBlT2JqZWN0YCwgdGhyb3VnaFxuICAgIC8vIGBEaXRvRWRpdEJ1dHRvbnNgLiBJdCB3b3VsZCBiZSBiZXN0IHRvIHVzZSBgRGl0b0VkaXRCdXR0b25zYCBoZXJlIHRvby5cbiAgICBjcmVhdGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdjcmVhdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoY3JlYXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGFibGUgJiYgaGFzRm9ybVNjaGVtYSh0aGlzLnNjaGVtYSlcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGVkaXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZWRpdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRhYmxlICYmIGhhc0Zvcm1TY2hlbWEodGhpcy5zY2hlbWEpXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBkZWxldGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkZWxldGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRQcm9wZXJ0eURhdGFQYXRoKHByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgcHJvcGVydHkubmFtZSlcbiAgICB9LFxuXG4gICAgZWRpdFBhdGgocGF0aCkge1xuICAgICAgLy8gQWxsIHdlIGdvdCB0byBkbyBpcyBwdXNoIHRoZSByaWdodCBlZGl0IHBhdGggdG8gdGhlIHJvdXRlciwgdGhlIHJlc3RcbiAgICAgIC8vIGlzIGhhbmRsZWQgYnkgb3VyIHJvdXRlcywgYWxsb3dpbmcgcmVsb2FkcyBhcyB3ZWxsLlxuICAgICAgdGhpcy4kcm91dGVyLnB1c2goe1xuICAgICAgICBwYXRoOiBgJHt0aGlzLmNvbnRhaW5lci5wYXRofSR7cGF0aH1gLFxuICAgICAgICAvLyBQcmVzZXJ2ZSBjdXJyZW50IHF1ZXJ5XG4gICAgICAgIHF1ZXJ5OiB0aGlzLiRyb3V0ZS5xdWVyeVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb25FZGl0KCkge1xuICAgICAgdGhpcy5lZGl0UGF0aCh0aGlzLnBhdGgpXG4gICAgfSxcblxuICAgIG9uRGVsZXRlKCkge1xuICAgICAgLy8gVE9ETzogSW1wbGVtZW50IVxuICAgIH0sXG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLm9uQ2hhbmdlKClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlXG4gICAgb25FbmREcmFnKGV2ZW50KSB7XG4gICAgICBTb3J0YWJsZU1peGluLm1ldGhvZHMub25FbmREcmFnLmNhbGwodGhpcywgZXZlbnQpXG4gICAgICBjb25zdCB7IGl0ZW0gfSA9IGV2ZW50XG4gICAgICAvLyBQcmVzZXJ2ZSBhY3RpdmUgc3RhdGUgb2YgZWRpdGVkIHN1Yi1pdGVtcywgYnkgZWRpdGluZyB0aGVpciBuZXcgcGF0aC5cbiAgICAgIGlmIChpdGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl0by10cmVlLWl0ZW0tLWFjdGl2ZScpKSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVkaXRQYXRoKGV2ZW50Lml0ZW0uZGF0YXNldC5wYXRoKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRyZWUtaXRlbSB7XG4gIC0tY2hldnJvbi1pbmRlbnQ6ICN7JGNoZXZyb24taW5kZW50fTtcblxuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gID4gLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgID4gLmRpdG8tdHJlZS1icmFuY2gsXG4gICAgPiAuZGl0by10cmVlLWxlYWYge1xuICAgICAgLy8gVXNlIGAtLWxldmVsYCBDU1MgdmFyaWFibGUgdG8gY2FsY3VsYXRlZCB0aGUgYWNjdW11bGF0ZWQgaW5kZW50XG4gICAgICAvLyBwYWRkaW5nIGRpcmVjdGx5IGluc3RlYWQgb2YgaGF2aW5nIGl0IGFjY3VtdWxhdGUgaW4gbmVzdGVkIENTUy5cbiAgICAgIC8vIFRoaXMgd2F5LCB3ZSBjYW4ga2VlcCB0aGUgJi0tYWN0aXZlIGFyZWEgY292ZXIgdGhlIGZ1bGwgd2lkdGg6XG4gICAgICBwYWRkaW5nLWxlZnQ6IGNhbGModmFyKC0tY2hldnJvbi1pbmRlbnQpICogKHZhcigtLWxldmVsLCAxKSAtIDEpKTtcbiAgICB9XG4gIH1cblxuICAuZGl0by10cmVlLWJyYW5jaCB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG5cbiAgLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICB9XG5cbiAgLmRpdG8tdHJlZS1icmFuY2gsXG4gIC5kaXRvLXRyZWUtbGVhZiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4OiBhdXRvO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbWluLXdpZHRoOiAwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW46IDFweCAwO1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuICB9XG5cbiAgLmRpdG8tdHJlZS1sYWJlbCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gICAgZ2FwOiAwLjI1ZW07XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB9XG5cbiAgLmRpdG8tdHJlZS1pbmZvIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB9XG5cbiAgLmRpdG8tdHJlZS1pbmZvIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDAuMzVlbTtcbiAgICBjb2xvcjogcmdiYSgkY29sb3ItYmxhY2ssIDAuMik7XG4gIH1cblxuICAuZGl0by1idXR0b25zIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBtYXJnaW46IDFweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gIH1cblxuICAuZGl0by10cmVlLWhlYWRlcjpob3ZlciB7XG4gICAgPiAuZGl0by1idXR0b25zIHtcbiAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgfSAvLyBIaWRlIGJ1dHRvbnMgZHVyaW5nIGRyYWdnaW5nXG4gIH1cblxuICAmLS1kcmFnZ2luZyB7XG4gICAgLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgICAgPiAuZGl0by1idXR0b25zIHtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYtLWFjdGl2ZSB7XG4gICAgPiAuZGl0by10cmVlLWhlYWRlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgcGFkZGluZzogMCAkaW5wdXQtcGFkZGluZy1ob3I7XG4gICAgICBtYXJnaW46IDAgKC0kaW5wdXQtcGFkZGluZy1ob3IpO1xuXG4gICAgICA+IC5kaXRvLXRyZWUtYnJhbmNoIHtcbiAgICAgICAgPiAuZGl0by1jaGV2cm9uOjpiZWZvcmUge1xuICAgICAgICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgPiAqID4gLmRpdG8tdHJlZS1sYWJlbCB7XG4gICAgICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tcHJvcGVydGllcyB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWFyZ2luLWxlZnQ6ICRjaGV2cm9uLWluZGVudDtcblxuICAgID4gdHIge1xuICAgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuICAgIH1cblxuICAgIC5kaXRvLWxhYmVsIHtcbiAgICAgIG1hcmdpbjogMDtcblxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiAnOiAnO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG50aGVhZC5kaXRvLXRhYmxlLWhlYWRcbiAgdHJcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtZm9yPVwiY29sdW1uIGluIGNvbHVtbnNcIlxuICAgIClcbiAgICAgIHRoKFxuICAgICAgICB2LWlmPVwic2hvdWxkUmVuZGVyU2NoZW1hKGNvbHVtbilcIlxuICAgICAgICA6Y2xhc3M9XCJnZXRDb2x1bW5DbGFzcyhjb2x1bW4pXCJcbiAgICAgIClcbiAgICAgICAgUm91dGVyTGluayhcbiAgICAgICAgICB2LWlmPVwiY29sdW1uLnNvcnRhYmxlXCJcbiAgICAgICAgICB2LXNsb3Q9XCJ7IG5hdmlnYXRlIH1cIlxuICAgICAgICAgIDp0bz1cImdldFNvcnRMaW5rKGNvbHVtbilcIlxuICAgICAgICAgIGN1c3RvbVxuICAgICAgICApXG4gICAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICA6Y2xhc3M9XCJnZXRTb3J0Q2xhc3MoY29sdW1uKVwiXG4gICAgICAgICAgICBAY2xpY2s9XCJuYXZpZ2F0ZVwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLmRpdG8tYnV0dG9uX19vcmRlci1hcnJvd3NcbiAgICAgICAgICAgIHNwYW4ge3sgZ2V0TGFiZWwoY29sdW1uKSB9fVxuICAgICAgICBzcGFuKFxuICAgICAgICAgIHYtZWxzZVxuICAgICAgICApIHt7IGdldExhYmVsKGNvbHVtbikgfX1cbiAgICB0aChcbiAgICAgIHYtaWY9XCJoYXNFZGl0QnV0dG9uc1wiXG4gICAgKVxuICAgICAgLy8tIEVtcHR5IDxzcGFuPiBpcyBuZWVkZWQgZm9yIHN0eWxpbmcsIHNlZSBfdGFibGUuc2Nzc1xuICAgICAgc3BhblxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBoeXBoZW5hdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9UYWJsZUhlYWQnLCB7XG4gIHByb3BzOiB7XG4gICAgcXVlcnk6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGNvbHVtbnM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGhhc0VkaXRCdXR0b25zOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNvcnQoKSB7XG4gICAgICBjb25zdCBvcmRlciA9ICh0aGlzLnF1ZXJ5Lm9yZGVyIHx8ICcnKS5zcGxpdCgvXFxzKy8pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBvcmRlclswXSxcbiAgICAgICAgb3JkZXI6IG9yZGVyWzFdXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRDb2x1bW5DbGFzcyhjb2x1bW4pIHtcbiAgICAgIHJldHVybiBgZGl0by1jb2x1bW4tLSR7aHlwaGVuYXRlKGNvbHVtbi5uYW1lKX1gXG4gICAgfSxcblxuICAgIGdldFNvcnRDbGFzcyhjb2x1bW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnNvcnQubmFtZSA9PT0gY29sdW1uLm5hbWVcbiAgICAgICAgPyBgZGl0by1idXR0b24tLXNlbGVjdGVkIGRpdG8tYnV0dG9uLS1vcmRlci0ke3RoaXMuc29ydC5vcmRlcn1gXG4gICAgICAgIDogbnVsbFxuICAgIH0sXG5cbiAgICBnZXRTb3J0TGluayhjb2x1bW4pIHtcbiAgICAgIC8vIFRvZ2dsZSBvcmRlciBpZiB0aGUgc2FtZSBjb2x1bW4gaXMgY2xpY2tlZCBhZ2Fpbi5cbiAgICAgIGNvbnN0IG9yZGVyID1cbiAgICAgICAgdGhpcy5zb3J0Lm5hbWUgPT09IGNvbHVtbi5uYW1lICYmIHRoaXMuc29ydC5vcmRlciA9PT0gJ2FzYydcbiAgICAgICAgICA/ICdkZXNjJ1xuICAgICAgICAgIDogJ2FzYydcbiAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5TGluayh7XG4gICAgICAgIC4uLnRoaXMucXVlcnksXG4gICAgICAgIG9yZGVyOiBgJHtjb2x1bW4ubmFtZX0gJHtvcmRlcn1gXG4gICAgICB9KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRhYmxlLWhlYWQge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB0ciB7XG4gICAgdGgge1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcblxuICAgICAgLmRpdG8tYnV0dG9uIHtcbiAgICAgICAgLy8gQ29udmVudGlvbjogTmVzdGVkIHNwYW5zIGhhbmRsZSBwYWRkaW5nLCBzZWUgYmVsb3dcbiAgICAgICAgZGlzcGxheTogYmxvY2s7IC8vIE92ZXJyaWRlIGRlZmF1bHQgaW5saW5lLWZsZXggcG9zaXRpb25pbmcuXG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgICAgfVxuXG4gICAgICBzcGFuIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAvLyBDb252ZW50aW9uOiBOZXN0ZWQgc3BhbnMgaGFuZGxlIHBhZGRpbmdcbiAgICAgICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG5cbiAgICAgICAgJjplbXB0eTo6YWZ0ZXIge1xuICAgICAgICAgIC8vIFByZXZlbnQgZW1wdHkgPHRoPiBmcm9tIGNvbGxhcHNpbmdcbiAgICAgICAgICBjb250ZW50OiAnXFwyMDBiJzsgLy8gemVyby13aWR0aCBzcGFjZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA+IHNwYW4ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudGQoXG4gIDpjbGFzcz1cImNlbGwuY2xhc3NcIlxuICA6c3R5bGU9XCJjZWxsLnN0eWxlXCJcbilcbiAgLy8tIFRPRE86IEltcGxlbWVudCBpbmxpbmVkIGNvbXBvbmVudHMgaW4gY2VsbCBtb2RlIVxuICBjb21wb25lbnQoXG4gICAgdi1pZj1cImNlbGwuY29tcG9uZW50XCJcbiAgICA6aXM9XCJjZWxsLmNvbXBvbmVudFwiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOm5lc3RlZD1cIm5lc3RlZFwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICApXG4gIHNwYW4oXG4gICAgdi1lbHNlXG4gICAgdi1odG1sPVwicmVuZGVyQ2VsbChkYXRhKVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IENvbnRleHRNaXhpbiBmcm9tICcuLi9taXhpbnMvQ29udGV4dE1peGluLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RhYmxlQ2VsbCcsIHtcbiAgbWl4aW5zOiBbQ29udGV4dE1peGluXSxcblxuICBwcm9wczoge1xuICAgIGNlbGw6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBuZXN0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgcmVuZGVyQ2VsbChpdGVtKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHJlbmRlciB9ID0gdGhpcy5jZWxsXG4gICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bbmFtZV1cbiAgICAgIHJldHVybiByZW5kZXJcbiAgICAgICAgPyByZW5kZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgICAgZGF0YVBhdGg6IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIG5hbWUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgOiBlc2NhcGVIdG1sKHZhbHVlKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXVwbG9hZC1maWxlXG4gIC5kaXRvLXRodW1ibmFpbChcbiAgICB2LWlmPVwidGh1bWJuYWlsXCJcbiAgICA6Y2xhc3M9XCJgZGl0by10aHVtYm5haWwtLSR7dGh1bWJuYWlsfWBcIlxuICApXG4gICAgLmRpdG8tdGh1bWJuYWlsX19pbm5lclxuICAgICAgaW1nKFxuICAgICAgICB2LWlmPVwic291cmNlXCJcbiAgICAgICAgOnNyYz1cInNvdXJjZVwiXG4gICAgICAgIGNyb3Nzb3JpZ2luPVwiYW5vbnltb3VzXCJcbiAgICAgIClcbiAgICAgIC5kaXRvLXRodW1ibmFpbF9fdHlwZShcbiAgICAgICAgdi1lbHNlXG4gICAgICApXG4gICAgICAgIHNwYW4ge3sgdHlwZSB9fVxuICBzcGFuIHt7IGZpbGUubmFtZSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1VwbG9hZEZpbGUnLCB7XG4gIHByb3BzOiB7XG4gICAgZmlsZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGh1bWJuYWlsOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRodW1ibmFpbFVybDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwbG9hZFVybDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHR5cGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBUWVBFU1t0aGlzLmZpbGUudHlwZV0gfHxcbiAgICAgICAgdGhpcy5maWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKS50b1VwcGVyQ2FzZSgpXG4gICAgICApXG4gICAgfSxcblxuICAgIHNvdXJjZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwbG9hZFVybCB8fCB0aGlzLnRodW1ibmFpbFVybFxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgICdmaWxlLnVwbG9hZC5maWxlJzoge1xuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcihmaWxlKSB7XG4gICAgICAgIGlmICh0aGlzLnRodW1ibmFpbCAmJiBmaWxlPy50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XG4gICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZFVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnVwbG9hZFVybCA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcblxuY29uc3QgVFlQRVMgPSB7XG4gICd0ZXh0L3BsYWluJzogJ1RYVCcsXG4gICd0ZXh0L2h0bWwnOiAnSFRNTCcsXG4gICd0ZXh0L2Nzcyc6ICdDU1MnLFxuICAndGV4dC9qYXZhc2NyaXB0JzogJ0pTJyxcbiAgJ2ltYWdlL2pwZWcnOiAnSlBHJyxcbiAgJ2ltYWdlL3BuZyc6ICdQTkcnLFxuICAnaW1hZ2UvZ2lmJzogJ0dJRicsXG4gICdpbWFnZS9zdmcreG1sJzogJ1NWRycsXG4gICdtb3ZpZS9tcDQnOiAnTVA0JyxcbiAgJ2F1ZGlvL21wZWcnOiAnTVAzJyxcbiAgJ2FwcGxpY2F0aW9uL2pzb24nOiAnSlNPTicsXG4gICdhcHBsaWNhdGlvbi94bWwnOiAnWE1MJyxcbiAgJ2FwcGxpY2F0aW9uL3BkZic6ICdQREYnLFxuICAnYXBwbGljYXRpb24vemlwJzogJ1pJUCdcbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkB1c2UgJ3Nhc3M6bWF0aCc7XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by11cGxvYWQtZmlsZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbn1cblxuLmRpdG8tdGh1bWJuYWlsIHtcbiAgJHNlbGY6ICY7XG5cbiAgLy8gU21hbGwgc2l6ZSBieSBkZWZhdWx0XG4gIC0tbWF4LXNpemU6ICN7MSAqICRpbnB1dC1oZWlnaHR9O1xuICAtLWNvcm5lci1zaXplOiBjYWxjKHZhcigtLW1heC1zaXplKSAvIDUpO1xuICAtLXNoYWRvdy1zaXplOiAxcHg7XG4gIC0tbWluLXNpemU6IGNhbGMoMiAqIHZhcigtLWNvcm5lci1zaXplKSk7XG4gIC0tbWFyZ2luOiAwZW07XG4gIC0tZHJvcC1zaGFkb3c6IGRyb3Atc2hhZG93KFxuICAgIDAgY2FsYyh2YXIoLS1zaGFkb3ctc2l6ZSkgKiAwLjc1KSB2YXIoLS1zaGFkb3ctc2l6ZSlcbiAgICAgICN7cmdiYSgkY29sb3ItYmxhY2ssIDAuNCl9XG4gICk7XG5cbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW46IHZhcigtLW1hcmdpbik7XG4gIG1hcmdpbi1yaWdodDogMC41ZW07XG4gIGZpbHRlcjogdmFyKC0tZHJvcC1zaGFkb3cpO1xuXG4gICYtLXNtYWxsIHtcbiAgICAtLW1heC1zaXplOiAjezEgKiAkaW5wdXQtaGVpZ2h0fTtcbiAgICAtLW1hcmdpbjogMGVtO1xuICAgIC0tc2hhZG93LXNpemU6IDFweDtcbiAgfVxuXG4gICYtLW1lZGl1bSB7XG4gICAgLS1tYXgtc2l6ZTogI3syICogJGlucHV0LWhlaWdodH07XG4gICAgLS1tYXJnaW46IDAuMjVlbTtcbiAgICAtLXNoYWRvdy1zaXplOiAxLjVweDtcbiAgfVxuXG4gICYtLWxhcmdlIHtcbiAgICAtLW1heC1zaXplOiAjezQgKiAkaW5wdXQtaGVpZ2h0fTtcbiAgICAtLW1hcmdpbjogMC41ZW07XG4gICAgLS1zaGFkb3ctc2l6ZTogMi41cHg7XG4gIH1cblxuICAmX19pbm5lciB7XG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICBjbGlwLXBhdGg6IHBvbHlnb24oXG4gICAgICAwIDAsXG4gICAgICBjYWxjKDEwMCUgLSB2YXIoLS1jb3JuZXItc2l6ZSkpIDAsXG4gICAgICAxMDAlIHZhcigtLWNvcm5lci1zaXplKSxcbiAgICAgIDEwMCUgMTAwJSxcbiAgICAgIDAgMTAwJVxuICAgICk7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBjb250ZW50OiAnJztcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgd2lkdGg6IHZhcigtLWNvcm5lci1zaXplKTtcbiAgICAgIGhlaWdodDogdmFyKC0tY29ybmVyLXNpemUpO1xuICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjZmZmZmZmLCAjZWVlZWVlIDQwJSwgI2RkZGRkZCA1MCUpO1xuICAgICAgZmlsdGVyOiB2YXIoLS1kcm9wLXNoYWRvdyk7XG4gICAgfVxuICB9XG5cbiAgJl9fdHlwZSB7XG4gICAgLS1mb250LXNpemU6IHZhcigtLWNvcm5lci1zaXplKTtcblxuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBtaW4td2lkdGg6IHZhcigtLW1pbi1zaXplKTtcbiAgICBtaW4taGVpZ2h0OiB2YXIoLS1tYXgtc2l6ZSk7XG4gICAgYXNwZWN0LXJhdGlvOiAzIC8gNDtcblxuICAgIHNwYW4ge1xuICAgICAgLS1jb2xvcjogI3skY29sb3ItZ3JleX07XG5cbiAgICAgIGZvbnQtc2l6ZTogbWluKHZhcigtLWZvbnQtc2l6ZSksICN7MS4yNSAqICRmb250LXNpemV9KTtcbiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvcik7XG5cbiAgICAgICN7JHNlbGZ9Om5vdCgjeyRzZWxmfS0tc21hbGwpICYge1xuICAgICAgICBwYWRkaW5nOiAwIGNhbGModmFyKC0tZm9udC1zaXplKSAvIDQpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiBjYWxjKHZhcigtLWZvbnQtc2l6ZSkgLyA0KTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sb3IpO1xuICAgICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIH1cblxuICAgICAgI3skc2VsZn0tLW1lZGl1bSAmIHtcbiAgICAgICAgLS1jb2xvcjogI3skY29sb3ItbGlnaHR9O1xuICAgICAgfVxuXG4gICAgICAjeyRzZWxmfS0tbGFyZ2UgJiB7XG4gICAgICAgIC0tY29sb3I6ICN7JGNvbG9yLWxpZ2h0ZXJ9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGltZyB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgLy8gU1ZHIGltYWdlcyBuZWVkIDEwMCUgc2V0dGluZ3MgdG8gc2NhbGUgaW50byB0aGUgY29udGFpbmVyLlxuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBtaW4td2lkdGg6IHZhcigtLW1pbi1zaXplKTtcbiAgICBtaW4taGVpZ2h0OiB2YXIoLS1taW4tc2l6ZSk7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS1tYXgtc2l6ZSk7XG4gICAgbWF4LWhlaWdodDogdmFyKC0tbWF4LXNpemUpO1xuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIGlzUmVmLCBuZXh0VGljaywgdG9WYWx1ZSwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBkZWZhdWx0RG9jdW1lbnQsIHRyeU9uTW91bnRlZCwgdHJ5T25TY29wZURpc3Bvc2UsIHVucmVmRWxlbWVudCB9IGZyb20gXCJAdnVldXNlL2NvcmVcIjtcbmltcG9ydCBTb3J0YWJsZSBmcm9tIFwic29ydGFibGVqc1wiO1xuXG4vLyNyZWdpb24gdXNlU29ydGFibGUvaW5kZXgudHNcbi8qKlxuKiBXcmFwcGVyIGZvciBzb3J0YWJsZWpzLlxuKiBAcGFyYW0gZWxcbiogQHBhcmFtIGxpc3RcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTb3J0YWJsZShlbCwgbGlzdCwgb3B0aW9ucyA9IHt9KSB7XG5cdGxldCBzb3J0YWJsZTtcblx0Y29uc3QgeyBkb2N1bWVudCA9IGRlZmF1bHREb2N1bWVudCwgd2F0Y2hFbGVtZW50ID0gZmFsc2UsLi4ucmVzZXRPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHsgb25VcGRhdGU6IChlKSA9PiB7XG5cdFx0bW92ZUFycmF5RWxlbWVudChsaXN0LCBlLm9sZEluZGV4LCBlLm5ld0luZGV4LCBlKTtcblx0fSB9O1xuXHRjb25zdCBlbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4gdHlwZW9mIGVsID09PSBcInN0cmluZ1wiID8gZG9jdW1lbnQgPT09IG51bGwgfHwgZG9jdW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpIDogdW5yZWZFbGVtZW50KGVsKSk7XG5cdGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG5cdFx0c29ydGFibGUgPT09IG51bGwgfHwgc29ydGFibGUgPT09IHZvaWQgMCB8fCBzb3J0YWJsZS5kZXN0cm95KCk7XG5cdFx0c29ydGFibGUgPSB2b2lkIDA7XG5cdH07XG5cdGNvbnN0IGluaXRTb3J0YWJsZSA9ICh0YXJnZXQpID0+IHtcblx0XHRpZiAoIXRhcmdldCB8fCBzb3J0YWJsZSAhPT0gdm9pZCAwKSByZXR1cm47XG5cdFx0c29ydGFibGUgPSBuZXcgU29ydGFibGUodGFyZ2V0LCB7XG5cdFx0XHQuLi5kZWZhdWx0T3B0aW9ucyxcblx0XHRcdC4uLnJlc2V0T3B0aW9uc1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBzdGFydCA9ICgpID0+IHtcblx0XHRjb25zdCB0YXJnZXQgPSBlbGVtZW50LnZhbHVlO1xuXHRcdGlmICh0YXJnZXQpIGluaXRTb3J0YWJsZSh0YXJnZXQpO1xuXHR9O1xuXHRjb25zdCBvcHRpb24gPSAobmFtZSwgdmFsdWUpID0+IHtcblx0XHRpZiAodmFsdWUgIT09IHZvaWQgMCkgc29ydGFibGUgPT09IG51bGwgfHwgc29ydGFibGUgPT09IHZvaWQgMCB8fCBzb3J0YWJsZS5vcHRpb24obmFtZSwgdmFsdWUpO1xuXHRcdGVsc2UgcmV0dXJuIHNvcnRhYmxlID09PSBudWxsIHx8IHNvcnRhYmxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzb3J0YWJsZS5vcHRpb24obmFtZSk7XG5cdH07XG5cdGxldCBzdG9wV2F0Y2g7XG5cdGlmICh3YXRjaEVsZW1lbnQgJiYgdHlwZW9mIGVsICE9PSBcInN0cmluZ1wiKSBzdG9wV2F0Y2ggPSB3YXRjaChlbGVtZW50LCAobmV3RWxlbWVudCkgPT4ge1xuXHRcdGNsZWFudXAoKTtcblx0XHRpZiAobmV3RWxlbWVudCkgaW5pdFNvcnRhYmxlKG5ld0VsZW1lbnQpO1xuXHR9LCB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdGZsdXNoOiBcInBvc3RcIlxuXHR9KTtcblx0ZWxzZSB0cnlPbk1vdW50ZWQoc3RhcnQpO1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdGNsZWFudXAoKTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHN0b3BXYXRjaCA9PT0gbnVsbCB8fCBzdG9wV2F0Y2ggPT09IHZvaWQgMCB8fCBzdG9wV2F0Y2goKTtcblx0XHRjbGVhbnVwKCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdHN0b3AsXG5cdFx0c3RhcnQsXG5cdFx0b3B0aW9uXG5cdH07XG59XG4vKipcbiogSW5zZXJ0cyBhIGVsZW1lbnQgaW50byB0aGUgRE9NIGF0IGEgZ2l2ZW4gaW5kZXguXG4qIEBwYXJhbSBwYXJlbnRFbGVtZW50XG4qIEBwYXJhbSBlbGVtZW50XG4qIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BbGZyZWQtU2t5Ymx1ZS92dWUtZHJhZ2dhYmxlLXBsdXMvYmxvYi9hMzgyOTIyMjA5NWUxOTQ5YmYyYzlhMjA5NzlkN2I1OTMwZTY2ZjE0L3NyYy91dGlscy9pbmRleC50cyNMODFDMS1MOTRDMlxuKi9cbmZ1bmN0aW9uIGluc2VydE5vZGVBdChwYXJlbnRFbGVtZW50LCBlbGVtZW50LCBpbmRleCkge1xuXHRjb25zdCByZWZFbGVtZW50ID0gcGFyZW50RWxlbWVudC5jaGlsZHJlbltpbmRleF07XG5cdHBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIHJlZkVsZW1lbnQpO1xufVxuLyoqXG4qIFJlbW92ZXMgYSBub2RlIGZyb20gdGhlIERPTS5cbiogQHBhcmFtIHtOb2RlfSBub2RlXG4qIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0FsZnJlZC1Ta3libHVlL3Z1ZS1kcmFnZ2FibGUtcGx1cy9ibG9iL2EzODI5MjIyMDk1ZTE5NDliZjJjOWEyMDk3OWQ3YjU5MzBlNjZmMTQvc3JjL3V0aWxzL2luZGV4LnRzI0w5NkMxLUwxMDJDMlxuKi9cbmZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSkge1xuXHRpZiAobm9kZS5wYXJlbnROb2RlKSBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG59XG5mdW5jdGlvbiBtb3ZlQXJyYXlFbGVtZW50KGxpc3QsIGZyb20sIHRvLCBlID0gbnVsbCkge1xuXHRpZiAoZSAhPSBudWxsKSB7XG5cdFx0cmVtb3ZlTm9kZShlLml0ZW0pO1xuXHRcdGluc2VydE5vZGVBdChlLmZyb20sIGUuaXRlbSwgZnJvbSk7XG5cdH1cblx0Y29uc3QgX3ZhbHVlSXNSZWYgPSBpc1JlZihsaXN0KTtcblx0Y29uc3QgYXJyYXkgPSBfdmFsdWVJc1JlZiA/IFsuLi50b1ZhbHVlKGxpc3QpXSA6IHRvVmFsdWUobGlzdCk7XG5cdGlmICh0byA+PSAwICYmIHRvIDwgYXJyYXkubGVuZ3RoKSB7XG5cdFx0Y29uc3QgZWxlbWVudCA9IGFycmF5LnNwbGljZShmcm9tLCAxKVswXTtcblx0XHRuZXh0VGljaygoKSA9PiB7XG5cdFx0XHRhcnJheS5zcGxpY2UodG8sIDAsIGVsZW1lbnQpO1xuXHRcdFx0aWYgKF92YWx1ZUlzUmVmKSBsaXN0LnZhbHVlID0gYXJyYXk7XG5cdFx0fSk7XG5cdH1cbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyB1c2VTb3J0YWJsZSBhcyBpLCBtb3ZlQXJyYXlFbGVtZW50IGFzIG4sIHJlbW92ZU5vZGUgYXMgciwgaW5zZXJ0Tm9kZUF0IGFzIHQgfTsiLCJpbXBvcnQgeyBpIGFzIHVzZVNvcnRhYmxlIH0gZnJvbSBcIi4uL3VzZVNvcnRhYmxlLUNjNUxLYkRELmpzXCI7XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGgsIHJlYWN0aXZlLCBzaGFsbG93UmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlVk1vZGVsIH0gZnJvbSBcIkB2dWV1c2UvY29yZVwiO1xuXG4vLyNyZWdpb24gdXNlU29ydGFibGUvY29tcG9uZW50LnRzXG5jb25zdCBVc2VTb3J0YWJsZSA9IC8qIEBfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoKHByb3BzLCB7IHNsb3RzIH0pID0+IHtcblx0Y29uc3QgbGlzdCA9IHVzZVZNb2RlbChwcm9wcywgXCJtb2RlbFZhbHVlXCIpO1xuXHRjb25zdCB0YXJnZXQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGRhdGEgPSByZWFjdGl2ZSh1c2VTb3J0YWJsZSh0YXJnZXQsIGxpc3QsIHByb3BzLm9wdGlvbnMpKTtcblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoc2xvdHMuZGVmYXVsdCkgcmV0dXJuIGgocHJvcHMuYXMgfHwgXCJkaXZcIiwgeyByZWY6IHRhcmdldCB9LCBzbG90cy5kZWZhdWx0KGRhdGEpKTtcblx0fTtcbn0sIHtcblx0bmFtZTogXCJVc2VTb3J0YWJsZVwiLFxuXHRwcm9wczogW1xuXHRcdFwiYXNcIixcblx0XHRcIm1vZGVsVmFsdWVcIixcblx0XHRcIm9wdGlvbnNcIlxuXHRdXG59KTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBVc2VTb3J0YWJsZSB9OyIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5Vc2VTb3J0YWJsZS5kaXRvLWRyYWdnYWJsZShcbiAgdi1pZj1cImRyYWdnYWJsZVwiXG4gIDpjbGFzcz1cInsgJ2RpdG8tZHJhZ2dhYmxlLS1kcmFnZ2luZyc6IGlzRHJhZ2dpbmcgfVwiXG4gIDphcz1cImFzXCJcbiAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgOm9wdGlvbnM9XCJ7IC4uLm9wdGlvbnMsIG9uU3RhcnQsIG9uRW5kIH1cIlxuICBAdXBkYXRlOm1vZGVsVmFsdWU9XCIkZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCAkZXZlbnQpXCJcbilcbiAgc2xvdFxuY29tcG9uZW50KFxuICB2LWVsc2VcbiAgOmlzPVwiYXNcIlxuKVxuICBzbG90XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudCdcbmltcG9ydCBEb21NaXhpbiBmcm9tICcuLi9taXhpbnMvRG9tTWl4aW4uanMnXG5pbXBvcnQgeyBVc2VTb3J0YWJsZSB9IGZyb20gJ0B2dWV1c2UvaW50ZWdyYXRpb25zL3VzZVNvcnRhYmxlL2NvbXBvbmVudCdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRHJhZ2dhYmxlJywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgVXNlU29ydGFibGUgfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIGFzOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnZGl2J1xuICAgIH0sXG4gICAgb3B0aW9uczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIGRyYWdnYWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW91c2VFdmVudHM6IG51bGwsXG4gICAgICBpc0RyYWdnaW5nOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25TdGFydChldmVudCkge1xuICAgICAgdGhpcy5vcHRpb25zLm9uU3RhcnQ/LihldmVudClcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWVcbiAgICAgIHRoaXMubW91c2VFdmVudHM/LnJlbW92ZSgpXG4gICAgfSxcblxuICAgIG9uRW5kKGV2ZW50KSB7XG4gICAgICB0aGlzLm9wdGlvbnMub25FbmQ/LihldmVudClcbiAgICAgIC8vIEtlZXAgYGlzRHJhZ2dpbmdgIHRydWUgdW50aWwgdGhlIG5leHQgbW91c2UgaW50ZXJhY3Rpb24gc28gdGhhdFxuICAgICAgLy8gY29uZnVzZWQgaG92ZXIgc3RhdGVzIGFyZSBjbGVhcmVkIGJlZm9yZSByZW1vdmluZyB0aGUgaG92ZXIgY2F0Y2hlci5cbiAgICAgIHRoaXMubW91c2VFdmVudHMgPSB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICAgIG1vdXNlZG93bjogdGhpcy5vbk1vdXNlLFxuICAgICAgICBtb3VzZW1vdmU6IHRoaXMub25Nb3VzZSxcbiAgICAgICAgbW91c2VsZWF2ZTogdGhpcy5vbk1vdXNlXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbk1vdXNlKCkge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2VcbiAgICAgIHRoaXMubW91c2VFdmVudHM/LnJlbW92ZSgpXG4gICAgICB0aGlzLm1vdXNlRXZlbnRzID0gbnVsbFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRyYWdnYWJsZSB7XG4gIC8vIE92ZXJsYXkgYSBob3ZlciBjYXRjaGVyIHdoaWxlIHdlJ3JlIGRyYWdnaW5nIHRvIHByZXZlbnQgaG92ZXIgc3RhdGVzIGZyb21cbiAgLy8gZ2V0dGluZyBzdHVjayAvIGNvbmZ1c2VkLiBTYWZhcmkgc3RydWdnbGVzIHdpdGggdGhpcywgc28gZGlzYWJsZSBpdCB0aGVyZS5cbiAgQGluY2x1ZGUgYnJvd3Nlci1xdWVyeSgoJ2Nocm9tZScsICdmaXJlZm94JykpIHtcbiAgICAmOmhhcygmX19jaG9zZW4pLFxuICAgICYtLWRyYWdnaW5nIHtcbiAgICAgID4gKiB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgICAgICA+IDpmaXJzdC1jaGlsZDo6YWZ0ZXIge1xuICAgICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICBpbnNldDogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICZfX2ZhbGxiYWNrIHtcbiAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDAgMnB4IDRweCAkY29sb3Itc2hhZG93KTtcblxuICAgIC8vIE5lc3RlZCA8dGQ+IG5lZWQgdG8gYWxzbyBzd2l0Y2ggdG8gYGRpc3BsYXk6IGZsZXhgIHN0eWxlIGR1cmluZyBkcmFnZ2luZy5cbiAgICAmLFxuICAgIHRkIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG5cbiAgICAgID4gKiB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5mdW5jdGlvbiBEaXRvVk5vZGUoeyB2bm9kZSB9KSB7XG4gIHJldHVybiB2bm9kZVxufVxuXG5EaXRvVk5vZGUucHJvcHMgPSB7XG4gIHZub2RlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1Zub2RlJywgRGl0b1ZOb2RlKVxuPC9zY3JpcHQ+XG4iLCIvLyBEaXRvVHlwZUNvbXBvbmVudCBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjb21wb25lbnQgZm9yIGFsbCBvdGhlciB0eXBlXG4vLyBjb21wb25lbnRzIGluc2lkZSB0aGUgdHlwZXMvIGZvbGRlci4gVGhlcmUncyBhbHNvIGEgc2VwYXJhdGUgY29uY3JldGVcbi8vIGBEaXRvVHlwZUNvbXBvbmVudC52dWVgIGNvbXBvbmVudCwgdXNlIHRvIHJlbmRlciBgeyB0eXBlOiAnY29tcG9uZW50JyB9YFxuaW1wb3J0IHsgYXNBcnJheSwgY2FtZWxpemUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFR5cGVNaXhpbiBmcm9tICcuL21peGlucy9UeXBlTWl4aW4uanMnXG5pbXBvcnQgeyByZWdpc3RlclR5cGVDb21wb25lbnQsIGdldFR5cGVDb21wb25lbnQgfSBmcm9tICcuL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZXh0ZW5kczogRGl0b0NvbXBvbmVudCxcbiAgbWl4aW5zOiBbVHlwZU1peGluXSxcblxuICBuYXRpdmVGaWVsZDogZmFsc2UsXG4gIHRleHRGaWVsZDogZmFsc2UsXG4gIC8vIFNldCByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBhbGwgb2YgdGhlc2UgdGhhdCBhcmUgdXNlZCBieSBtb3N0IHR5cGVcbiAgLy8gY29tcG9uZW50cy4gVGhlc2Ugb25seSBuZWVkIGRlZmluaW5nIGluIHN1Yi1jbGFzc2VzIHdoZW4gdGhleSBkaWZmZXIuXG4gIGRlZmF1bHRWYWx1ZTogbnVsbCxcbiAgZGVmYXVsdE5lc3RlZDogdHJ1ZSxcbiAgZGVmYXVsdFZpc2libGU6IHRydWUsXG4gIGRlZmF1bHRNdWx0aXBsZTogZmFsc2UsXG4gIGdlbmVyYXRlTGFiZWw6IHRydWUsXG4gIGV4Y2x1ZGVWYWx1ZTogZmFsc2UsXG4gIGlnbm9yZU1pc3NpbmdWYWx1ZTogbnVsbCxcbiAgb21pdFNwYWNpbmc6IGZhbHNlLFxuXG4gIGNvbXBvbmVudDogRGl0b0NvbXBvbmVudC5jb21wb25lbnQsXG5cbiAgZ2V0OiBnZXRUeXBlQ29tcG9uZW50LFxuXG4gIHJlZ2lzdGVyKHR5cGVzLCBkZWZpbml0aW9uID0ge30pIHtcbiAgICB0eXBlcyA9IGFzQXJyYXkodHlwZXMpXG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoXG4gICAgICBgRGl0b1R5cGUke2NhbWVsaXplKHR5cGVzWzBdLCB0cnVlKX1gLFxuICAgICAgZGVmaW5pdGlvblxuICAgIClcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIHJlZ2lzdGVyVHlwZUNvbXBvbmVudCh0eXBlLCBjb21wb25lbnQpXG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRcbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9CdXR0b24uZGl0by1idXR0b24oXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIDp0eXBlPVwidHlwZVwiXG4gIDp0ZXh0PVwidGV4dFwiXG4gIDp0aXRsZT1cInRpdGxlXCJcbiAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICA6Y2xhc3M9XCJidXR0b25DbGFzc1wiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgIERpdG9BZmZpeGVzKFxuICAgICAgdi1pZj1cInByZWZpeGVzLmxlbmd0aCA+IDBcIlxuICAgICAgOml0ZW1zPVwicHJlZml4ZXNcIlxuICAgICAgcG9zaXRpb249XCJwcmVmaXhcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgOnBhcmVudENvbnRleHQ9XCJjb250ZXh0XCJcbiAgICApXG4gIHRlbXBsYXRlKCNzdWZmaXgpXG4gICAgRGl0b0FmZml4ZXMoXG4gICAgICB2LWlmPVwic3VmZml4ZXMubGVuZ3RoID4gMFwiXG4gICAgICA6aXRlbXM9XCJzdWZmaXhlc1wiXG4gICAgICBwb3NpdGlvbj1cInN1ZmZpeFwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICA6cGFyZW50Q29udGV4dD1cImNvbnRleHRcIlxuICAgIClcbiAgICAuZGl0by1pbmZvKFxuICAgICAgdi1pZj1cIiFsYWJlbCAmJiBpbmZvXCJcbiAgICAgIDpkYXRhLWluZm89XCJpbmZvXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9BZmZpeGVzIGZyb20gJy4uL2NvbXBvbmVudHMvRGl0b0FmZml4ZXMudnVlJ1xuaW1wb3J0IHsgRGl0b0J1dHRvbiB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGhhc1Jlc291cmNlIH0gZnJvbSAnLi4vdXRpbHMvcmVzb3VyY2UuanMnXG5pbXBvcnQgeyBsYWJlbGl6ZSwgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ2J1dHRvbicsICdzdWJtaXQnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGNvbXBvbmVudHM6IHsgRGl0b0FmZml4ZXMsIERpdG9CdXR0b24gfSxcbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgICBleGNsdWRlVmFsdWU6IHRydWUsXG4gICAgZGVmYXVsdFdpZHRoOiAnYXV0bycsXG4gICAgZ2VuZXJhdGVMYWJlbDogZmFsc2UsXG5cbiAgICBkYXRhKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNSdW5uaW5nOiBmYWxzZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgdmVyYigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVyYnNbdGhpcy5uYW1lXVxuICAgICAgfSxcblxuICAgICAgYnV0dG9uQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcmIgPyBgZGl0by1idXR0b24tLSR7dGhpcy52ZXJifWAgOiBudWxsXG4gICAgICB9LFxuXG4gICAgICB0ZXh0OiBnZXRTY2hlbWFBY2Nlc3NvcigndGV4dCcsIHtcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgICB9KSxcblxuICAgICAgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQgfHwgbGFiZWxpemUodGhpcy52ZXJiKVxuICAgICAgfSxcblxuICAgICAgcHJlZml4ZXMoKSB7XG4gICAgICAgIHJldHVybiBhc0FycmF5KHRoaXMuc2NoZW1hLnByZWZpeClcbiAgICAgIH0sXG5cbiAgICAgIHN1ZmZpeGVzKCkge1xuICAgICAgICByZXR1cm4gYXNBcnJheSh0aGlzLnNjaGVtYS5zdWZmaXgpXG4gICAgICB9LFxuXG4gICAgICBjbG9zZUZvcm06IGdldFNjaGVtYUFjY2Vzc29yKCdjbG9zZUZvcm0nLCB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICAvLyBAb3ZlcnJpZGVcbiAgICAgIGdldEV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgeyBvbkZvY3VzLCBvbkJsdXIsIG9uQ2xpY2sgfSA9IHRoaXNcbiAgICAgICAgcmV0dXJuIHsgb25Gb2N1cywgb25CbHVyLCBvbkNsaWNrIH1cbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIHN1Ym1pdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlQ29tcG9uZW50Py5zdWJtaXQodGhpcywgb3B0aW9ucylcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIG9uQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZW1pdEV2ZW50KCdjbGljaycsIHtcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy5zY2hlbWFDb21wb25lbnRcbiAgICAgICAgICB9KVxuICAgICAgICAgIC8vIEhhdmUgYnV0dG9ucyB0aGF0IGRlZmluZSByZXNvdXJjZXMgY2FsbCBgdGhpcy5zdWJtaXQoKWAgYnkgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICByZXMgPT09IHVuZGVmaW5lZCAmJiAvLyBNZWFuaW5nOiBkb24ndCBwcmV2ZW50IGRlZmF1bHQuXG4gICAgICAgICAgICBoYXNSZXNvdXJjZSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3VibWl0KClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5lbWl0RXZlbnQoJ2Vycm9yJywgeyBlcnJvciB9KVxuICAgICAgICAgIGlmIChyZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3IuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnkoeyB0eXBlOiAnZXJyb3InLCB0ZXh0OiBlcnIgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5ub3RpZnkoeyB0eXBlOiAnZXJyb3InLCB0ZXh0OiBlcnJvciB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWJ1dHRvbiB7XG4gICRzZWxmOiAmO1xuXG4gICZfX3RleHQge1xuICAgIEBpbmNsdWRlIGVsbGlwc2lzO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNoZWNrYm94XG4gIGlucHV0KFxuICAgIDppZD1cImRhdGFQYXRoXCJcbiAgICByZWY9XCJlbGVtZW50XCJcbiAgICB2LW1vZGVsPVwidmFsdWVcIlxuICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY2hlY2tib3gnLCB7XG4gIG5hdGl2ZUZpZWxkOiB0cnVlXG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY2hlY2tib3gge1xuICBAZXh0ZW5kICVpbnB1dC1ib3JkZXJsZXNzO1xufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0Z1bmN0aW9uLFxuICBpc1Byb21pc2UsXG4gIG5vcm1hbGl6ZURhdGFQYXRoLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IG1hcmtSYXcsIHJlZiB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBMb2FkaW5nTWl4aW4gZnJvbSAnLi9Mb2FkaW5nTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0xvYWRpbmdNaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGFzeW5jRGF0YUVudHJpZXM6IG1hcmtSYXcoe30pXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVEYXRhU2NoZW1hKHNjaGVtYSwgbmFtZSwgbG9hZGluZ09wdGlvbnMpIHtcbiAgICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICBzY2hlbWEgPSB7IGRhdGE6IHNjaGVtYSB9XG4gICAgICB9XG4gICAgICBsZXQgeyBkYXRhID0gdW5kZWZpbmVkLCBkYXRhUGF0aCA9IG51bGwgfSA9IHNjaGVtYVxuICAgICAgLy8gQ3JlYXRlIGEgcmVhY3RpdmUgZW50cnkgZm9yIHRoZSBhc3luYyBkYXRhLCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC5cbiAgICAgIC8vIE5PVEU6IGBtYXJrUmF3KClgIGlzIHVzZWQgdG8gYXZvaWQgcmVhY3Rpdml0eSBvbiBgYXN5bmNEYXRhRW50cmllc2BcbiAgICAgIC8vIGl0c2VsZiwgYXMgcmVhY3Rpdml0eSBpcyBvbmx5IGRlc2lyZWQgb24gYHJlYWN0aXZlVmVyc2lvbmAsIHdoaWNoIGlzXG4gICAgICAvLyB1c2VkIHRvIHRyaWdnZXIgY29udHJvbGxlZCByZWV2YWx1YXRpb24gb2YgdGhlIGNvbXB1dGVkIGdldHRlci5cbiAgICAgIGNvbnN0IGFzeW5jRW50cnkgPSAodGhpcy5hc3luY0RhdGFFbnRyaWVzW25hbWVdID8/PSB7XG4gICAgICAgIHJlYWN0aXZlVmVyc2lvbjogcmVmKDEpLFxuICAgICAgICBkZXBlbmRlbmN5RnVuY3Rpb246IG51bGwsXG4gICAgICAgIHJlc29sdmVkRGF0YTogdW5kZWZpbmVkLFxuICAgICAgICByZXNvbHZpbmc6IGZhbHNlLFxuICAgICAgICByZXNvbHZlZDogZmFsc2VcbiAgICAgIH0pXG4gICAgICAvLyBJZiB0aGUgZGF0YSBjYWxsYmFjayBwcm92aWRlZCBhIGRlcGVuZGVuY3kgZnVuY3Rpb24gd2hlbiBpdCB3YXMgY2FsbGVkLFxuICAgICAgLy8gY2FsIGl0IGluIGV2ZXJ5IGNhbGwgb2YgYGhhbmRsZURhdGFTY2hlbWEoKWAgdG8gZm9yY2UgVnVlIHRvIGtlZXAgdHJhY2tcbiAgICAgIC8vIG9mIHRoZSBhc3luYyBkZXBlbmRlbmNpZXMuIEFsc28gYWNjZXNzIGByZWFjdGl2ZVZlcnNpb24udmFsdWVgIHJpZ2h0XG4gICAgICAvLyBhd2F5LCB0byBlbnN1cmUgdGhhdCB0aGUgcmVhY3RpdmUgcHJvcGVydHkgaXMgdHJhY2tlZCBhcyBhIGRlcGVuZGVuY3k6XG4gICAgICBhc3luY0VudHJ5LnJlYWN0aXZlVmVyc2lvbi52YWx1ZSAmJlxuICAgICAgYXN5bmNFbnRyeS5kZXBlbmRlbmN5RnVuY3Rpb24/Lih0aGlzLmNvbnRleHQpXG5cbiAgICAgIGlmIChhc3luY0VudHJ5LnJlc29sdmVkKSB7XG4gICAgICAgIC8vIElmIHRoZSBkYXRhIHdhcyByZXNvbHZlZCBhbHJlYWR5LCByZXR1cm4gaXQgYW5kIGNsZWFyIHRoZSByZXNvbHZlZFxuICAgICAgICAvLyB2YWx1ZS4gVGhpcyB3b3JrcyBiZWNhdXNlIFZ1ZSBjYWNoZXMgdGhlIHJlc3VsdCBvZiBjb21wdXRlZCBnZXR0ZXJzXG4gICAgICAgIC8vIGFuZCBvbmx5IHJlZXZhbHVhdGVzIGlmIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZWQuIFRoaXMgaXMgdG9cbiAgICAgICAgLy8gZW5zdXJlIHRoYXQgYSBjYWNoZWQgdmFsdWUgaGVyZSBkb2Vzbid0IGJsb2NrIC8gb3ZlcnJpZGVcbiAgICAgICAgLy8gcmVldmFsdWF0aW9uIHdoZW4gYSBkZXBlbmRlbmN5IGNoYW5nZXM6XG4gICAgICAgIGNvbnN0IHsgcmVzb2x2ZWREYXRhIH0gPSBhc3luY0VudHJ5XG4gICAgICAgIGFzeW5jRW50cnkucmVzb2x2ZWREYXRhID0gdW5kZWZpbmVkXG4gICAgICAgIGFzeW5jRW50cnkucmVzb2x2ZWQgPSBmYWxzZVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhXG4gICAgICB9XG4gICAgICAvLyBBdm9pZCBjYWxsaW5nIHRoZSBkYXRhIGZ1bmN0aW9uIHR3aWNlOlxuICAgICAgaWYgKGFzeW5jRW50cnkucmVzb2x2aW5nKSB7XG4gICAgICAgIGRhdGEgPSBudWxsXG4gICAgICB9IGVsc2UgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZGF0YSkpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBkYXRhKHRoaXMuY29udGV4dClcbiAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IG9mIHRoZSBkYXRhIGZ1bmN0aW9uIGlzIGFub3RoZXIgZnVuY3Rpb24sIHRoZW4gdGhlXG4gICAgICAgICAgLy8gZmlyc3QgZGF0YSBmdW5jdGlvbiBpcyB0aGVyZSB0byB0cmFjayBkZXBlbmRlbmNpZXMgYW5kIHRoZSByZWFsXG4gICAgICAgICAgLy8gZGF0YSBsb2FkaW5nIGhhcHBlbnMgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgaXQgcmV0dXJuZWQuIEtlZXAgdHJhY2tcbiAgICAgICAgICAvLyBpdCBpbiBgZGVwZW5kZW5jeUZ1bmN0aW9uYCBzbyBpdCBjYW4gYmUgY2FsbGVkIG9uIGVhY2ggY2FsbCBvZlxuICAgICAgICAgIC8vIGBoYW5kbGVEYXRhU2NoZW1hKClgIHRvIGtlZXAgdGhlIGRlcGVuZGVuY2llcyBpbnRhY3QsIGFuZCBjYWxsXG4gICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIHRoYXQgaXQgcmV0dXJuZWQgb25jZSB0byBnZXQgdGhlIGFjdHVhbCBkYXRhOlxuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGFzeW5jRW50cnkuZGVwZW5kZW5jeUZ1bmN0aW9uID0gZGF0YVxuICAgICAgICAgICAgZGF0YSA9IHJlc3VsdCh0aGlzLmNvbnRleHQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTk9URTogSWYgdGhlIGRhdGEgaXMgbm90IGEgcHJvbWlzZSwgaXQgaXMgcmVzb2x2ZWQgYWxyZWFkeS5cbiAgICAgICAgaWYgKGlzUHJvbWlzZShkYXRhKSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkYXRhIGlzIGFzeW5jaHJvbm91cywgaXQgY2FuJ3QgYmUgcmV0dXJuZWQgc3RyYWlnaHQgYXdheS5cbiAgICAgICAgICAvLyBCdXQgd2UgY2FuIGNoZWF0IHVzaW5nIGNvbXB1dGVkIHByb3BlcnRpZXMgYW5kIGByZXNvbHZlZERhdGFgLFxuICAgICAgICAgIC8vIHdoaWNoIGlzIGdvaW5nIHRvIHJlY2VpdmUgdGhlIGxvYWRlZCBkYXRhIGFzeW5jaHJvbm91c2x5LFxuICAgICAgICAgIC8vIHRyaWdnZXJpbmcgYSByZWNvbXB1dGUgb2YgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgY2FsbHNcbiAgICAgICAgICAvLyBgaGFuZGxlRGF0YVNjaGVtYSgpYC5cbiAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmluZyA9IHRydWVcbiAgICAgICAgICB0aGlzLnJlc29sdmVEYXRhKGRhdGEsIGxvYWRpbmdPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgIGFzeW5jRW50cnkucmVzb2x2ZWREYXRhID0gZGF0YVxuICAgICAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmluZyA9IGZhbHNlXG4gICAgICAgICAgICAgIGFzeW5jRW50cnkucmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgICAgICAgIC8vIFRyaWdnZXIgcmVldmFsdWF0aW9uIG9mIHRoZSBjb21wdXRlZCBnZXR0ZXIgYnkgaW5jcmVhc2luZyB0aGVcbiAgICAgICAgICAgICAgLy8gYHJlYWN0aXZlVmVyc2lvbmAgdmFsdWUuXG4gICAgICAgICAgICAgIGFzeW5jRW50cnkucmVhY3RpdmVWZXJzaW9uLnZhbHVlKytcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmluZyA9IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIC8vIENsZWFyIGRhdGEgdW50aWwgcHJvbWlzZSBpcyByZXNvbHZlZCBhbmQgYHJlc29sdmVkRGF0YWAgaXMgc2V0XG4gICAgICAgICAgZGF0YSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhUGF0aCkge1xuICAgICAgICBkYXRhID0gZ2V0VmFsdWVBdERhdGFQYXRoKFxuICAgICAgICAgIHRoaXMucm9vdERhdGEsXG4gICAgICAgICAgbm9ybWFsaXplRGF0YVBhdGgoYCR7dGhpcy5kYXRhUGF0aH0vJHtkYXRhUGF0aH1gKVxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH0sXG5cbiAgICBhc3luYyByZXNvbHZlRGF0YShsb2FkLCBsb2FkaW5nT3B0aW9ucyA9IHt9KSB7XG4gICAgICAvLyBVc2UgYSB0aW1lb3V0IHRvIGFsbG93IGFscmVhZHkgcmVzb2x2ZWQgcHJvbWlzZXMgdG8gcmV0dXJuIGRhdGEgd2l0aG91dFxuICAgICAgLy8gc2hvd2luZyBhIGxvYWRpbmcgaW5kaWNhdG9yLlxuICAgICAgbGV0IGNsZWFyTG9hZGluZyA9IGZhbHNlXG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNldExvYWRpbmcodHJ1ZSwgbG9hZGluZ09wdGlvbnMpXG4gICAgICAgIGNsZWFyTG9hZGluZyA9IHRydWVcbiAgICAgIH0sIDApXG4gICAgICBsZXQgZGF0YSA9IG51bGxcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBhd2FpdCAoaXNGdW5jdGlvbihsb2FkKSA/IGxvYWQoKSA6IGxvYWQpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmFkZEVycm9yKGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpXG4gICAgICB9XG4gICAgICBpZiAoY2xlYXJMb2FkaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0TG9hZGluZyhmYWxzZSwgbG9hZGluZ09wdGlvbnMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IERhdGFNaXhpbiBmcm9tICcuL0RhdGFNaXhpbi5qcydcbmltcG9ydCB7XG4gIGhhc1ZpZXdTY2hlbWEsXG4gIGdldFZpZXdFZGl0UGF0aCxcbiAgZ2V0TXVsdGlwbGVWYWx1ZVxufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgc2V0VGVtcG9yYXJ5SWQsIGlzUmVmZXJlbmNlIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc1N0cmluZyxcbiAgaXNGdW5jdGlvbixcbiAgbm9ybWFsaXplRGF0YVBhdGgsXG4gIGxhYmVsaXplLFxuICBkZWJvdW5jZUFzeW5jXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0RhdGFNaXhpbl0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBtdWx0aXBsZSgpIHtcbiAgICAgIHJldHVybiBnZXRNdWx0aXBsZVZhbHVlKHRoaXMuc2NoZW1hKVxuICAgIH0sXG5cbiAgICBzZWxlY3RlZFZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRWYWx1ZSA9IHZhbHVlID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnJlbGF0ZVxuICAgICAgICAgICAgPyB0aGlzLmdldFZhbHVlRm9yT3B0aW9uKHZhbHVlKVxuICAgICAgICAgICAgOiB2YWx1ZVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFzT3B0aW9uc1xuICAgICAgICAgICAgPyB0aGlzLmdldE9wdGlvbkZvclZhbHVlKHZhbClcbiAgICAgICAgICAgICAgPyB2YWxcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICAgdGhpcy5tdWx0aXBsZSAmJiBpc0FycmF5KHRoaXMudmFsdWUpXG4gICAgICAgICAgICA/IHRoaXMudmFsdWUubWFwKGNvbnZlcnRWYWx1ZSkuZmlsdGVyKHZhbHVlID0+IHZhbHVlICE9PSBudWxsKVxuICAgICAgICAgICAgOiBjb252ZXJ0VmFsdWUodGhpcy52YWx1ZSlcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgLy8gQXMgc29vbiBhcyB0aGUgb3B0aW9ucyBhcmUgYXZhaWxhYmxlLCBhbmQuLi5cbiAgICAgICAgICB0aGlzLmhhc09wdGlvbnMgJiYgKFxuICAgICAgICAgICAgLy8gLi4uaWYgdGhlIHZhbHVlIGlzIGZvcmNlZCB0byBudWxsIGJlY2F1c2UgYSBkaXNhcHBlYXJlZCBvcHRpb24uLi5cbiAgICAgICAgICAgIHZhbHVlID09PSBudWxsICYmIHRoaXMudmFsdWUgIT09IG51bGwgfHxcbiAgICAgICAgICAgIC8vIC4uLm9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlZmVyZW5jZSwgcmVwbGFjZSBpdCB3aXRoIGl0cyBvcHRpb25cbiAgICAgICAgICAgIC8vIHZhbHVlLCBzbyB0aGF0IGl0J2xsIGhvbGQgYWN0dWFsIGRhdGEsIG5vdCBqdXN0IGEgcmVmZXJlbmNlIGlkLlxuICAgICAgICAgICAgaXNSZWZlcmVuY2UodGhpcy52YWx1ZSlcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjb252ZXJ0VmFsdWUgPSB2YWx1ZSA9PlxuICAgICAgICAgIHRoaXMucmVsYXRlXG4gICAgICAgICAgICA/IHRoaXMuZ2V0T3B0aW9uRm9yVmFsdWUodmFsdWUpXG4gICAgICAgICAgICA6IHZhbHVlXG5cbiAgICAgICAgdGhpcy52YWx1ZSA9XG4gICAgICAgICAgdGhpcy5tdWx0aXBsZSAmJiBpc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgPyB2YWx1ZS5tYXAoY29udmVydFZhbHVlKVxuICAgICAgICAgICAgOiBjb252ZXJ0VmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlbGVjdGVkT3B0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uRm9yVmFsdWUodGhpcy5zZWxlY3RlZFZhbHVlKVxuICAgIH0sXG5cbiAgICBvcHRpb25zKCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuaGFuZGxlRGF0YVNjaGVtYSh0aGlzLnNjaGVtYS5vcHRpb25zLCAnb3B0aW9ucycpID8/IFtdXG4gICAgICBpZiAoIWlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9wdGlvbnMgZGF0YSwgc2hvdWxkIGJlIGFycmF5OiAke2RhdGF9YClcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NPcHRpb25zKGRhdGEpXG4gICAgfSxcblxuICAgIGFjdGl2ZU9wdGlvbnMoKSB7XG4gICAgICAvLyBUaGlzIGlzIG92ZXJyaWRkZW4gaW4gYFR5cGVNdWx0aXNlbGVjdGAgdG8gcmV0dXJuIHRoZSBgc2VhcmNoZWRPcHRpb25zYFxuICAgICAgLy8gd2hlbiBhIHNlYXJjaCBmaWx0ZXIgd2FzIGFwcGxpZWQuXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zXG4gICAgfSxcblxuICAgIGhhc09wdGlvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVPcHRpb25zLmxlbmd0aCA+IDBcbiAgICB9LFxuXG4gICAgcmVsYXRlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVsYXRlJywge1xuICAgICAgLy8gVE9ETzogQ29udmVydCB0byBgcmVsYXRlQnk6ICdpZCdgXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAvLyBXZSBjYW5ub3QgdXNlIHNjaGVtYSBhY2Nlc3NvciBjYWxsYmFjayBtYWdpYyBmb3IgYHJlbGF0ZWAgYXMgd2UgbmVlZFxuICAgICAgLy8gdGhpcyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQncyBsaWZlLXNwYW4sIHNlZSBgcHJvY2Vzc0RhdGEoKWAgYmVsb3cuXG4gICAgICBjYWxsYmFjazogZmFsc2VcbiAgICB9KSxcblxuICAgIGdyb3VwQnk6IGdldFNjaGVtYUFjY2Vzc29yKCdncm91cEJ5Jywge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBvcHRpb25zLmxhYmVsS2V5YCAvIGBvcHRpb25MYWJlbEtleWA/XG4gICAgb3B0aW9uTGFiZWw6IGdldFNjaGVtYUFjY2Vzc29yKCdvcHRpb25zLmxhYmVsJywge1xuICAgICAgdHlwZTogW1N0cmluZywgRnVuY3Rpb25dLFxuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIGdldChsYWJlbCkge1xuICAgICAgICAvLyBJZiBubyBgbGFiZWxgIHdhcyBwcm92aWRlZCBidXQgdGhlIG9wdGlvbnMgYXJlIG9iamVjdHMsIGFzc3VtZSBhXG4gICAgICAgIC8vIGRlZmF1bHQgdmFsdWUgb2YgJ2xhYmVsJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBsYWJlbCB8fFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uS2V5KCdsYWJlbCcpIHx8XG4gICAgICAgICAgbnVsbFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYG9wdGlvbnMudmFsdWVLZXlgIC8gYG9wdGlvblZhbHVlS2V5YD9cbiAgICBvcHRpb25WYWx1ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ29wdGlvbnMudmFsdWUnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBGdW5jdGlvbl0sXG4gICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgZ2V0KHZhbHVlKSB7XG4gICAgICAgIC8vIElmIG5vIGBsYWJlbGAgd2FzIHByb3ZpZGVkIGJ1dCB0aGUgb3B0aW9ucyBhcmUgb2JqZWN0cywgYXNzdW1lIGFcbiAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZSBvZiAndmFsdWUnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlIHx8XG4gICAgICAgICAgdGhpcy5yZWxhdGUgJiYgJ2lkJyB8fFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uS2V5KCd2YWx1ZScpIHx8XG4gICAgICAgICAgbnVsbFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBvcHRpb25FcXVhbHM6IGdldFNjaGVtYUFjY2Vzc29yKCdvcHRpb25zLmVxdWFscycsIHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHNlYXJjaCB0byBgb3B0aW9ucy5zZWFyY2hgP1xuICAgIHNlYXJjaEZpbHRlcjogZ2V0U2NoZW1hQWNjZXNzb3IoJ3NlYXJjaCcsIHtcbiAgICAgIHR5cGU6IFtPYmplY3QsIEZ1bmN0aW9uXSxcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICBnZXQoc2VhcmNoKSB7XG4gICAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgICBjb25zdCB7IGZpbHRlciwgZGVib3VuY2UgfSA9IGlzRnVuY3Rpb24oc2VhcmNoKVxuICAgICAgICAgICAgPyB7IGZpbHRlcjogc2VhcmNoIH1cbiAgICAgICAgICAgIDogc2VhcmNoXG4gICAgICAgICAgcmV0dXJuIGRlYm91bmNlID8gZGVib3VuY2VBc3luYyhmaWx0ZXIsIGRlYm91bmNlKSA6IGZpbHRlclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG5cbiAgICBlZGl0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2VkaXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgZWRpdGFibGUgJiZcbiAgICAgICAgICBoYXNWaWV3U2NoZW1hKHRoaXMuc2NoZW1hLCB0aGlzLmNvbnRleHQpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGVkaXRQYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgdGhpcy5zZWxlY3RlZFZhbHVlXG4gICAgICAgID8gZ2V0Vmlld0VkaXRQYXRoKHRoaXMuc2NoZW1hLCB0aGlzLnNlbGVjdGVkVmFsdWUsIHRoaXMuY29udGV4dClcbiAgICAgICAgOiBudWxsXG4gICAgfSxcblxuICAgIGdyb3VwQnlMYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwQnkgPyAnbGFiZWwnIDogbnVsbFxuICAgIH0sXG5cbiAgICBncm91cEJ5T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwQnkgPyAnb3B0aW9ucycgOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRPcHRpb25LZXkoa2V5KSB7XG4gICAgICBjb25zdCBbb3B0aW9uXSA9IHRoaXMuYWN0aXZlT3B0aW9uc1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KG9wdGlvbikgJiYga2V5IGluIG9wdGlvbiA/IGtleSA6IG51bGxcbiAgICB9LFxuXG4gICAgcHJvY2Vzc09wdGlvbnMob3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlbGF0ZSkge1xuICAgICAgICAgIC8vIElmIGlkcyBhcmUgbWlzc2luZyBhbmQgd2Ugd2FudCB0byByZWxhdGUsIHNldCB0ZW1wb3JhcnkgaWRzLlxuICAgICAgICAgIC8vIE5PVEU6IFdlIG5lZWQgdG8gbW9kaWZ5IHRoZSBhY3R1YWwgZGF0YSwgbWFraW5nIGEgY29weSB3b24ndCB3b3JrXG4gICAgICAgICAgLy8gYXMgaXQgd29uJ3QgcHJvcGFnYXRlLlxuICAgICAgICAgIC8vIE5PVEU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB0aGUgZGF0YSBpcyBmcm9tIHRoZSBncmFwaCB0aGF0XG4gICAgICAgICAgLy8gd2UncmUgY3VycmVudGx5IGVkaXRpbmcuXG4gICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCEoJ2lkJyBpbiBvcHRpb24pKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgICAgc2V0VGVtcG9yYXJ5SWQob3B0aW9uLCAnaWQnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncm91cEJ5KSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBlZCA9IHt9XG4gICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMucmVkdWNlKFxuICAgICAgICAgICAgKHJlc3VsdHMsIG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBncm91cCA9IG9wdGlvblt0aGlzLmdyb3VwQnldXG4gICAgICAgICAgICAgIGxldCBlbnRyeSA9IGdyb3VwZWRbZ3JvdXBdXG4gICAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeSA9IGdyb3VwZWRbZ3JvdXBdID0ge1xuICAgICAgICAgICAgICAgICAgW3RoaXMuZ3JvdXBCeUxhYmVsXTogZ3JvdXAsXG4gICAgICAgICAgICAgICAgICBbdGhpcy5ncm91cEJ5T3B0aW9uc106IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChlbnRyeSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbnRyeVt0aGlzLmdyb3VwQnlPcHRpb25zXS5wdXNoKG9wdGlvbilcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnNcbiAgICB9LFxuXG4gICAgZ2V0T3B0aW9uRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgIGNvbnN0IGZpbmRPcHRpb24gPSAob3B0aW9ucywgdmFsdWUsIGdyb3VwQnkpID0+IHtcbiAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgb3B0aW9uIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSBhbmQgcmV0dXJuIHRoZVxuICAgICAgICAvLyB3aG9sZSBvYmplY3QuXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoZ3JvdXBCeSkge1xuICAgICAgICAgICAgY29uc3QgZm91bmQgPSBmaW5kT3B0aW9uKG9wdGlvbi5vcHRpb25zLCB2YWx1ZSwgbnVsbClcbiAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm91bmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMub3B0aW9uRXF1YWxzXG4gICAgICAgICAgICAgID8gdGhpcy5vcHRpb25FcXVhbHMobmV3IERpdG9Db250ZXh0KHRoaXMsIHsgdmFsdWUsIG9wdGlvbiB9KSlcbiAgICAgICAgICAgICAgOiB2YWx1ZSA9PT0gdGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXG4gICAgICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm9wdGlvblZhbHVlXG4gICAgICAgID8gZmluZE9wdGlvbih0aGlzLmFjdGl2ZU9wdGlvbnMsIHZhbHVlLCB0aGlzLmdyb3VwQnkpXG4gICAgICAgIDogdmFsdWVcbiAgICB9LFxuXG4gICAgZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKSB7XG4gICAgICBjb25zdCB7IG9wdGlvblZhbHVlIH0gPSB0aGlzXG4gICAgICByZXR1cm4gaXNTdHJpbmcob3B0aW9uVmFsdWUpXG4gICAgICAgID8gb3B0aW9uPy5bb3B0aW9uVmFsdWVdID8/IG51bGxcbiAgICAgICAgOiBpc0Z1bmN0aW9uKG9wdGlvblZhbHVlKVxuICAgICAgICAgID8gb3B0aW9uVmFsdWUobmV3IERpdG9Db250ZXh0KHRoaXMsIHsgb3B0aW9uIH0pKVxuICAgICAgICAgIDogb3B0aW9uXG4gICAgfSxcblxuICAgIGdldExhYmVsRm9yT3B0aW9uKG9wdGlvbikge1xuICAgICAgY29uc3QgeyBvcHRpb25MYWJlbCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzU3RyaW5nKG9wdGlvbkxhYmVsKVxuICAgICAgICA/IG9wdGlvbj8uW29wdGlvbkxhYmVsXVxuICAgICAgICA6IGlzRnVuY3Rpb24ob3B0aW9uTGFiZWwpXG4gICAgICAgICAgPyBvcHRpb25MYWJlbChuZXcgRGl0b0NvbnRleHQodGhpcywgeyBvcHRpb24gfSkpXG4gICAgICAgICAgOiBsYWJlbGl6ZShgJHtvcHRpb259YClcbiAgICB9XG4gIH0sXG5cbiAgcHJvY2Vzc1ZhbHVlKHsgc2NoZW1hLCB2YWx1ZSwgZGF0YVBhdGggfSwgZ3JhcGgpIHtcbiAgICBpZiAoc2NoZW1hLnJlbGF0ZSkge1xuICAgICAgLy8gRm9yIGludGVybmFsbHkgcmVsYXRpbmcgZGF0YSAoYHNjaGVtYS5vcHRpb25zLmRhdGFQYXRoYCksIHdlIG5lZWQgdG9cbiAgICAgIC8vIHByb2Nlc3MgYm90aCB0aGUgb3B0aW9ucyAoZm9yICcjcmVmJykgYW5kIHRoZSB2YWx1ZSAoJyNpZCcpLlxuICAgICAgLy8gU2VlIGBEYXRhTWl4aW4uaGFuZGxlRGF0YVNjaGVtYSgpYDpcbiAgICAgIGNvbnN0IHBhdGggPSBzY2hlbWEub3B0aW9ucz8uZGF0YVBhdGhcbiAgICAgIGNvbnN0IHJlbGF0ZWREYXRhUGF0aCA9IHBhdGhcbiAgICAgICAgPyBub3JtYWxpemVEYXRhUGF0aChgJHtkYXRhUGF0aH0vJHtwYXRofWApXG4gICAgICAgIDogbnVsbFxuICAgICAgZ3JhcGguYWRkUmVsYXRpb24oZGF0YVBhdGgsIHJlbGF0ZWREYXRhUGF0aCwgc2NoZW1hKVxuICAgICAgaWYgKHJlbGF0ZWREYXRhUGF0aCkge1xuICAgICAgICBncmFwaC5zZXRTb3VyY2VSZWxhdGVkKHJlbGF0ZWREYXRhUGF0aClcbiAgICAgIH1cbiAgICAgIC8vIENvbnZlcnQgcmVsYXRpbmcgb2JqZWN0cyB0byBhIHNoYWxsb3cgY29weSB3aXRoIG9ubHkgdGhlIGlkIGxlZnQuXG4gICAgICAvLyBUT0RPOiBDb252ZXJ0IHRvIHVzaW5nIGByZWxhdGVCeWA6XG4gICAgICBjb25zdCBwcm9jZXNzUmVsYXRlID0gdmFsdWUgPT4gKHZhbHVlID8geyBpZDogdmFsdWUuaWQgfSA6IHZhbHVlKVxuICAgICAgLy8gU2VsZWN0ZWQgb3B0aW9ucyBjYW4gYmUgYm90aCBvYmplY3RzICYgYXJyYXlzLCBlLmcuICdjaGVja2JveGVzJzpcbiAgICAgIHZhbHVlID1cbiAgICAgICAgZ2V0TXVsdGlwbGVWYWx1ZShzY2hlbWEpICYmIGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZS5tYXAocHJvY2Vzc1JlbGF0ZSlcbiAgICAgICAgICA6IHByb2Nlc3NSZWxhdGUodmFsdWUpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudWwuZGl0by1jaGVja2JveGVzKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cImBkaXRvLWxheW91dC0tJHtzY2hlbWEubGF5b3V0IHx8ICd2ZXJ0aWNhbCd9YFwiXG4pXG4gIGxpKFxuICAgIHYtZm9yPVwib3B0aW9uIGluIG9wdGlvbnNcIlxuICApXG4gICAgbGFiZWxcbiAgICAgIC5kaXRvLWNoZWNrYm94XG4gICAgICAgIGlucHV0KFxuICAgICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICAgIHYtbW9kZWw9XCJzZWxlY3RlZE9wdGlvbnNcIlxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgOnZhbHVlPVwiZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKVwiXG4gICAgICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgICAgIClcbiAgICAgICAgc3BhbiB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHRpb24pIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE9wdGlvbnNNaXhpbiBmcm9tICcuLi9taXhpbnMvT3B0aW9uc01peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NoZWNrYm94ZXMnLCB7XG4gIG1peGluczogW09wdGlvbnNNaXhpbl0sXG5cbiAgbmF0aXZlRmllbGQ6IHRydWUsXG4gIGRlZmF1bHRWYWx1ZTogW10sXG4gIGRlZmF1bHRXaWR0aDogJ2F1dG8nLFxuICBkZWZhdWx0TXVsdGlwbGU6IHRydWUsXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICAvLyBAb3ZlcnJpZGVcbiAgICBtdWx0aXBsZSgpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSxcblxuICAgIHNlbGVjdGVkT3B0aW9uczoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2VsZWN0ZWRWYWx1ZSB8fCBbXSkuZmlsdGVyKHZhbHVlID0+IHZhbHVlKVxuICAgICAgfSxcblxuICAgICAgc2V0KG9wdGlvbikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSBvcHRpb24gfHwgW11cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jaGVja2JveGVzIHtcbiAgbGFiZWwge1xuICAgIEBleHRlbmQgJWlucHV0LWJvcmRlcmxlc3M7XG4gIH1cblxuICBpbnB1dCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNvZGUoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOnN0eWxlPVwic3R5bGVcIlxuKVxuICAuZGl0by1jb2RlX19lZGl0b3IocmVmPVwiZWRpdG9yXCIpXG4gIC5kaXRvLXJlc2l6ZShcbiAgICB2LWlmPVwicmVzaXphYmxlXCJcbiAgICBAbW91c2Vkb3duLnN0b3AucHJldmVudD1cIm9uRHJhZ1Jlc2l6ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCBDb2RlRmxhc2sgZnJvbSAnY29kZWZsYXNrJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NvZGUnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBsaW5lczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2xpbmVzJywge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogM1xuICAgIH0pLFxuXG4gICAgbGFuZ3VhZ2U6IGdldFNjaGVtYUFjY2Vzc29yKCdsYW5ndWFnZScsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdqYXZhc2NyaXB0J1xuICAgIH0pLFxuXG4gICAgaW5kZW50U2l6ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2luZGVudFNpemUnLCB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAyXG4gICAgfSksXG5cbiAgICByZXNpemFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdyZXNpemFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIHN0eWxlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCB8fCBgY2FsYygke3RoaXMubGluZXN9ZW0gKiB2YXIoLS1saW5lLWhlaWdodCkpYFxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IGZsYXNrID0gbmV3IENvZGVGbGFzayh0aGlzLiRyZWZzLmVkaXRvciwge1xuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICBpbmRlbnRTaXplOiB0aGlzLmluZGVudFNpemUsXG4gICAgICBsaW5lTnVtYmVyczogZmFsc2VcbiAgICB9KVxuXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBpZ25vcmVXYXRjaCA9IGZhbHNlXG4gICAgbGV0IGlnbm9yZVVwZGF0ZSA9IGZhbHNlXG5cbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb2N1c2VkICYmIGNoYW5nZWQpIHtcbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uRm9jdXMgPSAoKSA9PiB0aGlzLm9uRm9jdXMoKVxuXG4gICAgY29uc3Qgb25CbHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH1cblxuICAgIHRoaXMuZG9tT24odGhpcy4kcmVmcy5lZGl0b3IucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKSwge1xuICAgICAgZm9jdXM6IG9uRm9jdXMsXG4gICAgICBibHVyOiBvbkJsdXJcbiAgICB9KVxuXG4gICAgY29uc3Qgc2V0Q29kZSA9IGNvZGUgPT4ge1xuICAgICAgaWYgKGNvZGUgIT09IGZsYXNrLmNvZGUpIHtcbiAgICAgICAgaWdub3JlVXBkYXRlID0gdHJ1ZVxuICAgICAgICBmbGFzay51cGRhdGVDb2RlKGNvZGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0VmFsdWUgPSB2YWx1ZSA9PiB7XG4gICAgICBpZiAodmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgaWdub3JlV2F0Y2ggPSB0cnVlXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICBvbkNoYW5nZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZmxhc2sub25VcGRhdGUodmFsdWUgPT4ge1xuICAgICAgaWYgKGlnbm9yZVVwZGF0ZSkge1xuICAgICAgICBpZ25vcmVVcGRhdGUgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0VmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuJHdhdGNoKCd2YWx1ZScsIHZhbHVlID0+IHtcbiAgICAgIGlmIChpZ25vcmVXYXRjaCkge1xuICAgICAgICBpZ25vcmVXYXRjaCA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDb2RlKHZhbHVlIHx8ICcnKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLiR3YXRjaCgnbGFuZ3VhZ2UnLCBsYW5ndWFnZSA9PiB7XG4gICAgICBmbGFzay51cGRhdGVMYW5ndWFnZShsYW5ndWFnZSlcbiAgICB9KVxuXG4gICAgc2V0Q29kZSh0aGlzLnZhbHVlIHx8ICcnKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpPy5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXJFbGVtZW50KCkge1xuICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKT8uYmx1cigpXG4gICAgfSxcblxuICAgIG9uRHJhZ1Jlc2l6ZShldmVudCkge1xuICAgICAgY29uc3QgZ2V0UG9pbnQgPSAoeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0pID0+ICh7IHgsIHkgfSlcblxuICAgICAgbGV0IHByZXZZID0gZ2V0UG9pbnQoZXZlbnQpLnlcbiAgICAgIGxldCBoZWlnaHQgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUodGhpcy4kZWwpLmhlaWdodClcblxuICAgICAgY29uc3QgbW91c2Vtb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCB7IHkgfSA9IGdldFBvaW50KGV2ZW50KVxuICAgICAgICBoZWlnaHQgKz0geSAtIHByZXZZXG4gICAgICAgIHByZXZZID0geVxuICAgICAgICB0aGlzLmhlaWdodCA9IGAke01hdGgubWF4KGhlaWdodCwgMCl9cHhgXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5kb21Pbihkb2N1bWVudCwge1xuICAgICAgICBtb3VzZW1vdmUsXG5cbiAgICAgICAgbW91c2V1cChldmVudCkge1xuICAgICAgICAgIG1vdXNlbW92ZShldmVudClcbiAgICAgICAgICBoYW5kbGVycy5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNvZGUge1xuICBAZXh0ZW5kICVpbnB1dDtcblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC8vIEZvciBwcm9wZXIgc2l6aW5nIG9mIGNvbnRlbnQgYWxvbmcgd2l0aCA6c3R5bGU9XCJzdHlsZVwiIHNldHRpbmcgYWJvdmUsXG4gIC8vIGZvciBwcm9wZXIgbGluZS1oZWlnaHQgY2FsY3VsYXRpb24uXG4gIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICBtaW4taGVpZ2h0OiBjYWxjKDFlbSAqIHZhcigtLWxpbmUtaGVpZ2h0KSArIDIgKiAkaW5wdXQtcGFkZGluZy12ZXIpO1xuXG4gIC5jb2RlZmxhc2sge1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgLy8gSWdub3JlIHRoZSBwYXJlbnQgcGFkZGluZyBkZWZpbmVkIGFib3ZlIHdoaWNoIGlzIG9ubHkgbmVlZGVkIHRvIHNldFxuICAgIC8vIHRoZSBkZXNpcmVkIGhlaWdodCB3aXRoIDpzdHlsZT1cInN0eWxlXCIuXG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG5cbiAgICAmX190ZXh0YXJlYSxcbiAgICAmX19wcmUge1xuICAgICAgLy8gVXNlIHNhbWUgcGFkZGluZyBhcyAuZGl0by1jb2RlXG4gICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcbiAgICB9XG5cbiAgICAmX190ZXh0YXJlYSxcbiAgICAmX19jb2RlLFxuICAgICZfX2xpbmVzIHtcbiAgICAgIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktbW9ubztcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplKTtcbiAgICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1saW5lLWhlaWdodCk7XG4gICAgfVxuXG4gICAgJl9fbGluZXMge1xuICAgICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9UcmlnZ2VyLmRpdG8tY29sb3IoXG4gIHYtbW9kZWw6c2hvdz1cInNob3dQb3B1cFwiXG4gIHRyaWdnZXI9XCJmb2N1c1wiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIERpdG9JbnB1dChcbiAgICAgIDppZD1cImRhdGFQYXRoXCJcbiAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgdi1tb2RlbD1cImhleFZhbHVlXCJcbiAgICAgIHR5cGU9XCJpbnB1dFwiXG4gICAgICBzaXplPVwiOFwiXG4gICAgICA6Zm9jdXNlZD1cInNob3dQb3B1cFwiXG4gICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgICAgICBEaXRvQWZmaXhlcyhcbiAgICAgICAgICA6aXRlbXM9XCJzY2hlbWEucHJlZml4XCJcbiAgICAgICAgICBwb3NpdGlvbj1cInByZWZpeFwiXG4gICAgICAgICAgbW9kZT1cImlucHV0XCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgOnBhcmVudENvbnRleHQ9XCJjb250ZXh0XCJcbiAgICAgICAgKVxuICAgICAgdGVtcGxhdGUoI3N1ZmZpeClcbiAgICAgICAgRGl0b0FmZml4ZXMoXG4gICAgICAgICAgOml0ZW1zPVwic2NoZW1hLnN1ZmZpeFwiXG4gICAgICAgICAgcG9zaXRpb249XCJzdWZmaXhcIlxuICAgICAgICAgIG1vZGU9XCJpbnB1dFwiXG4gICAgICAgICAgOmNsZWFyYWJsZT1cInNob3dDbGVhckJ1dHRvblwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIDppbmxpbmVJbmZvPVwiaW5saW5lSW5mb1wiXG4gICAgICAgICAgOnBhcmVudENvbnRleHQ9XCJjb250ZXh0XCJcbiAgICAgICAgICBAY2xlYXI9XCJjbGVhclwiXG4gICAgICAgIClcbiAgICAgICAgICB0ZW1wbGF0ZSgjYXBwZW5kKVxuICAgICAgICAgICAgLmRpdG8tY29sb3JfX3ByZXZpZXcoXG4gICAgICAgICAgICAgIHYtaWY9XCJ2YWx1ZVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIGRpdig6c3R5bGU9XCJ7IGJhY2tncm91bmQ6IGAjJHtoZXhWYWx1ZSB8fCAnMDAwMDAwMDAnfWAgfVwiKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgU2tldGNoUGlja2VyLmRpdG8tY29sb3JfX3BpY2tlcihcbiAgICAgIHYtbW9kZWw9XCJjb2xvclZhbHVlXCJcbiAgICAgIDpkaXNhYmxlQWxwaGE9XCIhYWxwaGFcIlxuICAgICAgOmRpc2FibGVGaWVsZHM9XCIhaW5wdXRzXCJcbiAgICAgIDpwcmVzZXRDb2xvcnM9XCJwcmVzZXRzXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHRpbnljb2xvciBmcm9tICd0aW55Y29sb3IyJ1xuaW1wb3J0IHsgU2tldGNoIGFzIFNrZXRjaFBpY2tlciB9IGZyb20gJ0Bsazc3L3Z1ZTMtY29sb3InXG5pbXBvcnQgeyBpc09iamVjdCwgaXNTdHJpbmcgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgRGl0b1RyaWdnZXIsIERpdG9JbnB1dCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9BZmZpeGVzIGZyb20gJy4uL2NvbXBvbmVudHMvRGl0b0FmZml4ZXMudnVlJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gTW9ua2V5LXBhdGNoIHRoZSBgU2tldGNoUGlja2VyJ3NgIGBoZXhgIGNvbXB1dGVkIHByb3BlcnR5IHRvIHJldHVybiBsb3dlcmNhc2Vcbi8vIGhleCB2YWx1ZXMgaW5zdGVhZCBvZiB1cHBlcmNhc2Ugb25lcy5cbmNvbnN0IHsgaGV4IH0gPSBTa2V0Y2hQaWNrZXIuY29tcHV0ZWRcblNrZXRjaFBpY2tlci5jb21wdXRlZC5oZXggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBoZXguY2FsbCh0aGlzKS50b0xvd2VyQ2FzZSgpXG59XG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY29sb3InLCB7XG4gIGNvbXBvbmVudHM6IHsgRGl0b1RyaWdnZXIsIERpdG9JbnB1dCwgRGl0b0FmZml4ZXMsIFNrZXRjaFBpY2tlciB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dQb3B1cDogZmFsc2UsXG4gICAgICBjb252ZXJ0ZWRWYWx1ZTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNhblVwZGF0ZVZhbHVlKCkge1xuICAgICAgcmV0dXJuICF0aGlzLmZvY3VzZWQgfHwgdGhpcy5yZWFkb25seVxuICAgIH0sXG5cbiAgICBjb2xvclZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSB8fFxuICAgICAgICAgIHRoaXMudmFsdWUgfHxcbiAgICAgICAgICAodGhpcy5jb2xvckZvcm1hdCA9PT0gJ2hleCcgPyAnJyA6IHt9KVxuICAgICAgICApXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGNvbnZlcnRDb2xvcih2YWx1ZSwgdGhpcy5jb2xvckZvcm1hdClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgaGV4VmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aW55Y29sb3IodGhpcy52YWx1ZSlcbiAgICAgICAgcmV0dXJuIGNvbG9yLmlzVmFsaWQoKVxuICAgICAgICAgID8gY29sb3JcbiAgICAgICAgICAgICAgLnRvU3RyaW5nKGNvbG9yLmdldEFscGhhKCkgPCAxID8gJ2hleDgnIDogJ2hleDYnKVxuICAgICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICA6IG51bGxcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjb2xvciA9IHRpbnljb2xvcih2YWx1ZSlcbiAgICAgICAgaWYgKGNvbG9yLmlzVmFsaWQoKSkge1xuICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gY29udmVydENvbG9yKHZhbHVlLCB0aGlzLmNvbG9yRm9ybWF0KVxuICAgICAgICAgIGlmICh0aGlzLmNhblVwZGF0ZVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gY29udmVydGVkVmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU3RvcmUgdG8gY2hhbmdlIGxhdGVyLCBvbmNlIGBjYW5VcGRhdGVWYWx1ZWAgaXMgdHJ1ZSBhZ2Fpbi5cbiAgICAgICAgICAgIC8vIFNlZSBgd2F0Y2hgIGJlbG93LlxuICAgICAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFRPRE86IGBmb3JtYXRgIGNsYXNoZXMgd2l0aCBUeXBlTWl4aW4uZm9ybWF0KClgLCB3aGljaCBzaGFsbCBiZSByZW5hbWVkXG4gICAgLy8gc29vbiB0byBgZm9ybWF0VmFsdWUoKWAuIFJlbmFtZSBgY29sb3JGb3JtYXRgIGJhY2sgdG8gYGZvcm1hdGAgYWZ0ZXIuXG4gICAgY29sb3JGb3JtYXQ6IGdldFNjaGVtYUFjY2Vzc29yKCdmb3JtYXQnLCB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnaGV4J1xuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBzaG93QWxwaGFgP1xuICAgIGFscGhhOiBnZXRTY2hlbWFBY2Nlc3NvcignYWxwaGEnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgc2hvd0lucHV0c2A/XG4gICAgaW5wdXRzOiBnZXRTY2hlbWFBY2Nlc3NvcignaW5wdXRzJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9KSxcblxuICAgIHByZXNldHM6IGdldFNjaGVtYUFjY2Vzc29yKCdwcmVzZXRzJywge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBkZWZhdWx0OiBbXG4gICAgICAgICcjZmZmZmZmJyxcbiAgICAgICAgJyNjM2MzYzMnLFxuICAgICAgICAnIzdmN2Y3ZicsXG4gICAgICAgICcjMDAwMDAwJyxcbiAgICAgICAgJyM4ODAwMTUnLFxuICAgICAgICAnI2VkMWMyNCcsXG4gICAgICAgICcjZmY3ZjI3JyxcbiAgICAgICAgJyNmZmYyMDAnLFxuXG4gICAgICAgICcjMjJiMTRjJyxcbiAgICAgICAgJyMwMGEyZTgnLFxuICAgICAgICAnIzNmNDhjYycsXG4gICAgICAgICcjYTM0OWE0JyxcbiAgICAgICAgJyNiOTdhNTcnLFxuICAgICAgICAnI2ZmYWVjOScsXG4gICAgICAgICcjZmZjOTBlJyxcbiAgICAgICAgJyMwMDAwMDAwMCdcbiAgICAgIF1cbiAgICB9KVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6ICdvbkNoYW5nZScsXG5cbiAgICBjYW5VcGRhdGVWYWx1ZShjYW5VcGRhdGVWYWx1ZSkge1xuICAgICAgaWYgKGNhblVwZGF0ZVZhbHVlICYmIHRoaXMuY29udmVydGVkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY29udmVydGVkVmFsdWVcbiAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbnZlcnRDb2xvcihjb2xvciwgZm9ybWF0KSB7XG4gIHJldHVybiBpc09iamVjdChjb2xvcikgLy8gYSB2dWUzLWNvbG9yIGNvbG9yIG9iamVjdFxuICAgID8gdG9WdWUzQ29sb3JGb3JtYXQoY29sb3IsIGZvcm1hdClcbiAgICA6IHRvVGlueUNvbG9yRm9ybWF0KHRpbnljb2xvcihjb2xvciksIGZvcm1hdClcbn1cblxuZnVuY3Rpb24gdG9WdWUzQ29sb3JGb3JtYXQoY29sb3IsIGZvcm1hdCkge1xuICBjb25zdCB2YWx1ZSA9XG4gICAgY29sb3JbXG4gICAgICB7XG4gICAgICAgIGhleDogY29sb3I/LmEgPCAxID8gJ2hleDgnIDogJ2hleCcsXG4gICAgICAgIHJnYjogJ3JnYmEnXG4gICAgICB9W2Zvcm1hdF0gfHxcbiAgICAgIGZvcm1hdFxuICAgIF1cbiAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZVswXSA9PT0gJyMnID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHZhbHVlXG59XG5cbi8vIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBpbiB0aW55Y29sb3IsIGJ1dCBpdCBvbmx5IGhhcyB0aGUgc3RyaW5nIGVxdWl2YWxlbnRcbi8vIG9mIGl0LlxuZnVuY3Rpb24gdG9UaW55Q29sb3JGb3JtYXQoY29sb3IsIGZvcm1hdCkge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgJ3JnYic6XG4gICAgICByZXR1cm4gY29sb3IudG9SZ2IoKVxuICAgIGNhc2UgJ3ByZ2InOlxuICAgICAgcmV0dXJuIGNvbG9yLnRvUGVyY2VudGFnZVJnYigpXG4gICAgY2FzZSAnbmFtZSc6XG4gICAgICByZXR1cm4gY29sb3IudG9OYW1lKClcbiAgICBjYXNlICdoc2wnOlxuICAgICAgcmV0dXJuIGNvbG9yLnRvSHNsKClcbiAgICBjYXNlICdoc3YnOlxuICAgICAgcmV0dXJuIGNvbG9yLnRvSHN2KClcbiAgICBjYXNlICdoZXgzJzpcbiAgICAgIHJldHVybiBgIyR7Y29sb3IudG9IZXgodHJ1ZSl9YFxuICAgIGNhc2UgJ2hleDQnOlxuICAgICAgcmV0dXJuIGAjJHtjb2xvci50b0hleDgodHJ1ZSl9YFxuICAgIGNhc2UgJ2hleDgnOlxuICAgICAgcmV0dXJuIGAjJHtjb2xvci50b0hleDgoKX1gXG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICdoZXg2JzpcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gUHJlc2VydmUgYWxwaGEgY2hhbm5lbCBpZiBwcmVzZW50XG4gICAgICByZXR1cm4gY29sb3IuZ2V0QWxwaGEoKSA8IDFcbiAgICAgICAgPyBgIyR7Y29sb3IudG9IZXg4KCl9YFxuICAgICAgICA6IGAjJHtjb2xvci50b0hleCgpfWBcbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJGNvbG9yLXN3YXRjaC13aWR0aDogJHBhdHRlcm4tdHJhbnNwYXJlbmN5LXNpemU7XG4kY29sb3Itc3dhdGNoLXJhZGl1czogJGJvcmRlci1yYWRpdXMgLSAkYm9yZGVyLXdpZHRoO1xuXG4uZGl0by1jb2xvciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIGlucHV0IHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgcGFkZGluZy1yaWdodDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgICB9XG4gIH1cblxuICAmX19waWNrZXIge1xuICAgIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgIGJveC1zaGFkb3c6ICRzaGFkb3ctd2luZG93O1xuICB9XG5cbiAgJl9fcHJldmlldyB7XG4gICAgYmFja2dyb3VuZDogJHBhdHRlcm4tdHJhbnNwYXJlbmN5O1xuICAgIG1hcmdpbjogKC0kaW5wdXQtcGFkZGluZy12ZXIpICgtJGlucHV0LXBhZGRpbmctaG9yKTtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgICBib3JkZXItbGVmdDogJGJvcmRlci1zdHlsZTtcblxuICAgICYsXG4gICAgZGl2IHtcbiAgICAgIHdpZHRoOiAkY29sb3Itc3dhdGNoLXdpZHRoO1xuICAgICAgaGVpZ2h0OiBjYWxjKCRpbnB1dC1oZWlnaHQgLSAyICogJGJvcmRlci13aWR0aCk7XG4gICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJGNvbG9yLXN3YXRjaC1yYWRpdXM7XG4gICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogJGNvbG9yLXN3YXRjaC1yYWRpdXM7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5oZXJpdCBpbnB1dCBmb2N1cyBzdGF0ZVxuICAuZGl0by1pbnB1dDpmb2N1cy13aXRoaW4gJl9fcHJldmlldyxcbiAgLmRpdG8taW5wdXQtLWZvY3VzICZfX3ByZXZpZXcge1xuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmNvbXBvbmVudChcbiAgOmlzPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gIHYtYmluZD1cIiRwcm9wc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuLy8gVGhpcyBpcyB0aGUgZ2VuZXJhbCBwdXJwb3NlICdjb21wb25lbnQnIHR5cGUsIHdoaWNoIGNhbiByZXNvbHZlIHRvIGFueSBjdXN0b21cbi8vIGNvbXBvbmVudCB0aHJvdWdoIGBzY2hlbWEuY29tcG9uZW50YCwgc2VlIGByZXNvbHZlU2NoZW1hQ29tcG9uZW50KClgLiBUaGlzXG4vLyBjYW4gYmUgdXNlZCB0byBuZXN0IGFyYml0cmFyeSB2dWUgY29tcG9uZW50cyBpbiBzY2hlbWE6XG4vLyB7XG4vLyAgIHR5cGU6ICdjb21wb25lbnQnLFxuLy8gICBjb21wb25lbnQ6IGltcG9ydCgnLi9jb21wb25lbnQnKVxuLy8gfVxuXG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyByZXNvbHZlU2NoZW1hQ29tcG9uZW50IH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NvbXBvbmVudCcsIHtcbiAgLy8gT3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGBkZWZhdWx0VmFsdWU6IG51bGxgIHRvIG5vdCBzZXQgYW55IGRhdGEgZm9yIGN1c3RvbVxuICAvLyBjb21wb25lbnRzLCB1bmxlc3MgdGhleSBwcm92aWRlIGEgZGVmYXVsdCB2YWx1ZS5cbiAgZGVmYXVsdFZhbHVlOiAoKSA9PiB1bmRlZmluZWQsIC8vIENhbGxiYWNrIHRvIG92ZXJyaWRlIGBkZWZhdWx0VmFsdWU6IG51bGxgXG4gIGlnbm9yZU1pc3NpbmdWYWx1ZTogKHsgc2NoZW1hIH0pID0+ICEoJ2RlZmF1bHQnIGluIHNjaGVtYSksXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShhcGksIHNjaGVtYSkge1xuICAgIGF3YWl0IHJlc29sdmVTY2hlbWFDb21wb25lbnQoc2NoZW1hKVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLy8tIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHRyaWdnZXIgZXZhbHVhdGlvbiBvZiBgdmFsdWVgIHRoYXQgZG9zZSBub3Rcbi8vLSBpbnZvbHZlIGFjdHVhbGx5IHJlbmRlcmluZyBpdCB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm90IHZpc2libGUuXG5pbnB1dC5kaXRvLXRleHQuZGl0by1pbnB1dChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgOm5hbWU9XCJuYW1lXCJcbiAgdHlwZT1cInRleHRcIlxuICA6dmFsdWU9XCJ2YWx1ZVwiXG4gIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgOnJlYWRvbmx5PVwidHJ1ZVwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFZhbHVlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1ZhbHVlTWl4aW4uanMnXG5pbXBvcnQgRGF0YU1peGluIGZyb20gJy4uL21peGlucy9EYXRhTWl4aW4uanMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ2NvbXB1dGVkJywgJ2RhdGEnLCAnaGlkZGVuJ10sXG4gIC8vIEB2dWUvY29tcG9uZW50XG4gIHtcbiAgICBtaXhpbnM6IFtEYXRhTWl4aW5dLFxuXG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiB1bmRlZmluZWQsIC8vIENhbGxiYWNrIHRvIG92ZXJyaWRlIGBkZWZhdWx0VmFsdWU6IG51bGxgXG4gICAgZGVmYXVsdFZpc2libGU6IGZhbHNlLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICBjb25zdCB7IHNjaGVtYSB9ID0gdGhpc1xuICAgICAgICAgIGlmIChzY2hlbWEuZGF0YSB8fCBzY2hlbWEuZGF0YVBhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5oYW5kbGVEYXRhU2NoZW1hKHNjaGVtYSwgJ3ZhbHVlJylcbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5uYW1lXSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBWYWx1ZU1peGluLmNvbXB1dGVkLnZhbHVlLmdldC5jYWxsKHRoaXMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgVmFsdWVNaXhpbi5jb21wdXRlZC52YWx1ZS5zZXQuY2FsbCh0aGlzLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tZGF0ZVxuICBjb21wb25lbnQoXG4gICAgOmlzPVwiZ2V0Q29tcG9uZW50KHR5cGUpXCJcbiAgICA6aWQ9XCJkYXRhUGF0aFwiXG4gICAgcmVmPVwiZWxlbWVudFwiXG4gICAgdi1tb2RlbD1cImRhdGVWYWx1ZVwiXG4gICAgOmxvY2FsZT1cImxvY2FsZVwiXG4gICAgOmZvcm1hdD1cImZvcm1hdHNcIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICApXG4gICAgdGVtcGxhdGUoI3ByZWZpeClcbiAgICAgIERpdG9BZmZpeGVzKFxuICAgICAgICA6aXRlbXM9XCJzY2hlbWEucHJlZml4XCJcbiAgICAgICAgcG9zaXRpb249XCJwcmVmaXhcIlxuICAgICAgICBtb2RlPVwiaW5wdXRcIlxuICAgICAgICBhYnNvbHV0ZVxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIDpwYXJlbnRDb250ZXh0PVwiY29udGV4dFwiXG4gICAgICApXG4gICAgdGVtcGxhdGUoI3N1ZmZpeClcbiAgICAgIERpdG9BZmZpeGVzKFxuICAgICAgICA6aXRlbXM9XCJzY2hlbWEuc3VmZml4XCJcbiAgICAgICAgcG9zaXRpb249XCJzdWZmaXhcIlxuICAgICAgICBtb2RlPVwiaW5wdXRcIlxuICAgICAgICBhYnNvbHV0ZVxuICAgICAgICA6Y2xlYXJhYmxlPVwic2hvd0NsZWFyQnV0dG9uXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICA6aW5saW5lSW5mbz1cImlubGluZUluZm9cIlxuICAgICAgICA6cGFyZW50Q29udGV4dD1cImNvbnRleHRcIlxuICAgICAgICBAY2xlYXI9XCJjbGVhclwiXG4gICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCBEaXRvQWZmaXhlcyBmcm9tICcuLi9jb21wb25lbnRzL0RpdG9BZmZpeGVzLnZ1ZSdcbmltcG9ydCB7XG4gIERpdG9EYXRlUGlja2VyLFxuICBEaXRvVGltZVBpY2tlcixcbiAgRGl0b0RhdGVUaW1lUGlja2VyXG59IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuaW1wb3J0IHsgaXNEYXRlLCBhc3NpZ25EZWVwbHkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWydkYXRlJywgJ2RhdGV0aW1lJywgJ3RpbWUnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGNvbXBvbmVudHM6IHsgRGl0b0FmZml4ZXMgfSxcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG9ubHkgaGVyZSBzbyB3ZSBnZXQgcGxhY2Vob2xkZXIgYWRkZWQuIENvbWUgdXAgd2l0aCBhXG4gICAgLy8gYmV0dGVyIHdheSB0byBzdXBwb3J0IGF0dHJpYnV0ZXMgcGVyIGNvbXBvbmVudCAoYSBsaXN0IG9mIGFjdHVhbGx5XG4gICAgLy8gc3VwcG9ydGVkIGF0dHJpYnV0ZXMpXG4gICAgbmF0aXZlRmllbGQ6IHRydWUsXG4gICAgdGV4dEZpZWxkOiB0cnVlLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGRhdGVWYWx1ZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpc1xuICAgICAgICAgIHJldHVybiB2YWx1ZSA/IG5ldyBEYXRlKHZhbHVlKSA6IHZhbHVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIFRPRE86IFJlbmFtZSB0byBgZm9ybWF0YCwgb25jZSBgc2NoZW1hLmZvcm1hdCgpYCB3YXMgcmVtb3ZlZCB0b1xuICAgICAgLy8gYGZvcm1hdFZhbHVlKClgLlxuICAgICAgZm9ybWF0czogZ2V0U2NoZW1hQWNjZXNzb3IoJ2Zvcm1hdHMnLCB7XG4gICAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgZ2V0KGZvcm1hdHMpIHtcbiAgICAgICAgICBjb25zdCB7IGRhdGUsIHRpbWUgfSA9IGFzc2lnbkRlZXBseSh7fSwgdGhpcy5hcGkuZm9ybWF0cywgZm9ybWF0cylcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0ZTogWydkYXRlJywgJ2RhdGV0aW1lJ10uaW5jbHVkZXModGhpcy50eXBlKSA/IGRhdGUgOiBudWxsLFxuICAgICAgICAgICAgdGltZTogWyd0aW1lJywgJ2RhdGV0aW1lJ10uaW5jbHVkZXModGhpcy50eXBlKSA/IHRpbWUgOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBnZXRDb21wb25lbnQodHlwZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGU6IERpdG9EYXRlUGlja2VyLFxuICAgICAgICAgIHRpbWU6IERpdG9UaW1lUGlja2VyLFxuICAgICAgICAgIGRhdGV0aW1lOiBEaXRvRGF0ZVRpbWVQaWNrZXJcbiAgICAgICAgfVt0eXBlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzVmFsdWUoeyB2YWx1ZSB9KSB7XG4gICAgICByZXR1cm4gaXNEYXRlKHZhbHVlKSA/IHZhbHVlLnRvSVNPU3RyaW5nKCkgOiB2YWx1ZVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFF1ZXJ5KHF1ZXJ5KSB7XG4gIGNvbnN0IGVudHJpZXMgPSBxdWVyeVxuICAgID8gaXNBcnJheShxdWVyeSlcbiAgICAgID8gcXVlcnlcbiAgICAgIDogT2JqZWN0LmVudHJpZXMocXVlcnkpXG4gICAgOiBbXVxuICByZXR1cm4gKFxuICAgIG5ldyBVUkxTZWFyY2hQYXJhbXMoXG4gICAgICAvLyBFeHBhbmQgYXJyYXkgdmFsdWVzIGludG8gbXVsdGlwbGUgZW50cmllcyB1bmRlciB0aGUgc2FtZSBrZXksIHNvXG4gICAgICAvLyBgZm9ybWF0UXVlcnkoeyBmb286IFsxLCAyXSwgYmFyOiAzIH0pYCA9PiAnZm9vPTEmZm9vPTImYmFyPTMnLlxuICAgICAgZW50cmllcy5yZWR1Y2UoXG4gICAgICAgIChlbnRyaWVzLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgIC8vIFByZXZlbnQgbnVsbCBvciB1bmRlZmluZWQgdmFsdWVzIGZyb20gYmVjb21pbmcgc3RyaW5ncyxcbiAgICAgICAgICAgICAgLy8gYnV0IHNpbmNlIHRoZXkncmUgZW50cmllcyBpbiBhbiBhcnJheSwgd2Ugc3RpbGwgaW5jbHVkZSB0aGVtLlxuICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goW2tleSwgdmFsID8/ICcnXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICAgIH0sXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgKVxuICAgICAgLnRvU3RyaW5nKClcbiAgICAgIC8vIGRlY29kZSBhbGwgdGhlc2UgZW5jb2RlZCBjaGFyYWN0ZXJzIHRvIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgYXNcbiAgICAgIC8vIHZ1ZS1yb3V0ZXIncyBvd24gcXVlcnkgZW5jb2RpbmcuXG4gICAgICAucmVwbGFjZUFsbCgvJSg/OjIxfDI0fDI4fDI5fDJDfDJGfDNBfDNCfDNEfDNGfDQwKS9nLCBkZWNvZGVVUklDb21wb25lbnQpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VSb3V0ZSh7IHBhdGgsIHF1ZXJ5LCBoYXNoIH0pIHtcbiAgLy8gUHJlc2VydmUgYGhpc3Rvcnkuc3RhdGVgLCBzZWU6XG4gIC8vIGh0dHBzOi8vcm91dGVyLnZ1ZWpzLm9yZy9ndWlkZS9taWdyYXRpb24vI3VzYWdlLW9mLWhpc3Rvcnktc3RhdGVcbiAgY29uc3QgeyBsb2NhdGlvbiB9ID0gd2luZG93XG4gIGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuICAgIGhpc3Rvcnkuc3RhdGUsXG4gICAgbnVsbCxcbiAgICBgJHtcbiAgICAgIGxvY2F0aW9uLm9yaWdpblxuICAgIH0ke1xuICAgICAgcGF0aCA/PyBsb2NhdGlvbi5wYXRobmFtZVxuICAgIH0/JHtcbiAgICAgIHF1ZXJ5ID8gZm9ybWF0UXVlcnkocXVlcnkpIDogbG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpXG4gICAgfSR7XG4gICAgICBoYXNoID8/IGxvY2F0aW9uLmhhc2hcbiAgICB9YFxuICApXG59XG4iLCJpbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IEl0ZW1NaXhpbiBmcm9tICcuL0l0ZW1NaXhpbi5qcydcbmltcG9ydCBSZXNvdXJjZU1peGluIGZyb20gJy4vUmVzb3VyY2VNaXhpbi5qcydcbmltcG9ydCBTY2hlbWFQYXJlbnRNaXhpbiBmcm9tICcuLi9taXhpbnMvU2NoZW1hUGFyZW50TWl4aW4uanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciwgZ2V0U3RvcmVBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IHJlcGxhY2VSb3V0ZSB9IGZyb20gJy4uL3V0aWxzL3JvdXRlLmpzJ1xuaW1wb3J0IHtcbiAgcHJvY2Vzc1JvdXRlU2NoZW1hLFxuICBwcm9jZXNzRm9ybXMsXG4gIGdldE5hbWVkU2NoZW1hcyxcbiAgZ2V0QnV0dG9uU2NoZW1hcyxcbiAgaGFzRm9ybVNjaGVtYSxcbiAgZ2V0Rm9ybVNjaGVtYXMsXG4gIGdldFZpZXdTY2hlbWEsXG4gIGdldFZpZXdQYXRoLFxuICBpc0NvbXBhY3QsXG4gIGlzSW5saW5lZCxcbiAgaXNPYmplY3RTb3VyY2UsXG4gIGlzTGlzdFNvdXJjZVxufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQXJyYXksXG4gIGlzTnVtYmVyLFxuICBlcXVhbHMsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyByYXcgfSBmcm9tICdAZGl0b2pzL3VpJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtJdGVtTWl4aW4sIFJlc291cmNlTWl4aW4sIFNjaGVtYVBhcmVudE1peGluXSxcblxuICBkZWZhdWx0VmFsdWU6IGNvbnRleHQgPT4gKGlzTGlzdFNvdXJjZShjb250ZXh0LnNjaGVtYSkgPyBbXSA6IG51bGwpLFxuICAvLyBFeGNsdWRlIGFsbCBzb3VyY2VzIHRoYXQgaGF2ZSB0aGVpciBvd24gcmVzb3VyY2UgaGFuZGxpbmcgdGhlIGRhdGEuXG4gIGV4Y2x1ZGVWYWx1ZTogY29udGV4dCA9PiAhIWNvbnRleHQuc2NoZW1hLnJlc291cmNlLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRzb3VyY2VDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JhcHBlZFByaW1pdGl2ZXM6IG51bGwsXG4gICAgICB1bndyYXBwaW5nUHJpbWl0aXZlczogcmF3KGZhbHNlKVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIGlzT2JqZWN0U291cmNlKCkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0U291cmNlKHRoaXMudHlwZSlcbiAgICB9LFxuXG4gICAgaXNMaXN0U291cmNlKCkge1xuICAgICAgcmV0dXJuIGlzTGlzdFNvdXJjZSh0aGlzLnR5cGUpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLmhhc0RhdGEoKVxuICAgIGhhc0RhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZhbHVlXG4gICAgfSxcblxuICAgIHNob3VsZFJlbmRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZURlcHRoIDwgdGhpcy5tYXhEZXB0aFxuICAgIH0sXG5cbiAgICBpc1JlYWR5KCkge1xuICAgICAgLy8gTGlzdHMgdGhhdCBoYXZlIG5vIGRhdGEgYW5kIG5vIGFzc29jaWF0ZWQgcmVzb3VyY2Ugc2hvdWxkIHN0aWxsIHJlbmRlcixcbiAgICAgIC8vIGFzIHRoZXkgbWF5IGJlIGdldHRpbmcgdGhlaXIgZGF0YSBlbHNld2hlcmUsIGUuZy4gYGNvbXB1dGUoKWAuXG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnNob3VsZFJlbmRlciAmJlxuICAgICAgICAodGhpcy5oYXNEYXRhIHx8ICF0aGlzLnByb3ZpZGVzRGF0YSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaXNJblZpZXcoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZpZXdDb21wb25lbnRcbiAgICB9LFxuXG4gICAgd3JhcFByaW1pdGl2ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEud3JhcFByaW1pdGl2ZXNcbiAgICB9LFxuXG4gICAgbGlzdERhdGE6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnZhbHVlXG4gICAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB0byBsaXN0IGFycmF5LlxuICAgICAgICAgIGRhdGEgPSBkYXRhICE9IG51bGwgPyBbZGF0YV0gOiBbXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIGRhdGEgZ2V0cyBpbmhlcml0ZWQgZnJvbSBwYXJlbnQsIHVud3JhcHBpbmcgaXMgbm90IGhhcHBlbmluZ1xuICAgICAgICAgIC8vIGF0IHRoZSByb290IGluIGBzZXREYXRhKClgLCBidXQgaGVyZSBpbnN0ZWFkLlxuICAgICAgICAgIGRhdGEgPSB0aGlzLnVud3JhcExpc3REYXRhKGRhdGEpIHx8IGRhdGFcbiAgICAgICAgfVxuICAgICAgICBkYXRhIHx8PSBbXVxuICAgICAgICBjb25zdCB7IHdyYXBQcmltaXRpdmVzIH0gPSB0aGlzXG4gICAgICAgIGlmICh3cmFwUHJpbWl0aXZlcykge1xuICAgICAgICAgIGlmICh0aGlzLnVud3JhcHBpbmdQcmltaXRpdmVzLnZhbHVlKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBkb25lIHVud3JhcHBpbmcgb25jZSBgbGlzdERhdGFgIGlzIHJlZXZhbHVhdGVkLCBzbyBzZXRcbiAgICAgICAgICAgIC8vIHRoaXMgdG8gYGZhbHNlYCBhZ2Fpbi4gU2VlIGB3cmFwcGVkUHJpbWl0aXZlc2Agd2F0Y2hlciBhYm92ZS5cbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgICB0aGlzLnVud3JhcHBpbmdQcmltaXRpdmVzLnZhbHVlID0gZmFsc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ29udmVydCBkYXRhIHRvIGEgbGlzdCBvZiB3cmFwcGVkIHByaW1pdGl2ZXMsIGFuZCByZXR1cm4gaXQuXG4gICAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICAgICAgdGhpcy53cmFwcGVkUHJpbWl0aXZlcyA9IGRhdGEubWFwKHZhbHVlID0+ICh7XG4gICAgICAgICAgICAgIFt3cmFwUHJpbWl0aXZlc106IHZhbHVlXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZFByaW1pdGl2ZXNcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfSxcblxuICAgICAgc2V0KGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMud3JhcFByaW1pdGl2ZXMpIHtcbiAgICAgICAgICB0aGlzLndyYXBwZWRQcmltaXRpdmVzID0gZGF0YVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmlzT2JqZWN0U291cmNlXG4gICAgICAgICAgICA/IGRhdGE/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBkYXRhWzBdXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBkYXRhXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb2JqZWN0RGF0YToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICAvLyBBbHdheXMgZ28gdGhyb3VnaCBgbGlzdERhdGFgIGludGVybmFsbHksIHdoaWNoIGRvZXMgYWxsIHRoZVxuICAgICAgICAvLyBwcm9jZXNzaW5nIG9mIGB3cmFwUHJpbWl0aXZlc2AsIGV0Yy5cbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdERhdGFbMF0gfHwgbnVsbFxuICAgICAgfSxcblxuICAgICAgc2V0KGRhdGEpIHtcbiAgICAgICAgdGhpcy5saXN0RGF0YSA9IGRhdGEgPyBbZGF0YV0gOiBbXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzb3VyY2VTY2hlbWEoKSB7XG4gICAgICAvLyBUaGUgc291cmNlU2NoZW1hIG9mIGEgbGlzdCBpcyB0aGUgbGlzdCdzIHNjaGVtYSBpdHNlbGYuXG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFcbiAgICB9LFxuXG4gICAgc291cmNlRGVwdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm91dGUubWF0Y2hlZC5yZWR1Y2UoXG4gICAgICAgIChkZXB0aCwgcmVjb3JkKSA9PiAoXG4gICAgICAgICAgZGVwdGggKyAocmVjb3JkLm1ldGEuc2NoZW1hID09PSB0aGlzLnNvdXJjZVNjaGVtYSA/IDEgOiAwKVxuICAgICAgICApLFxuICAgICAgICAwXG4gICAgICApXG4gICAgfSxcblxuICAgIHBhdGgoKSB7XG4gICAgICAvLyBUaGlzIGlzIHVzZWQgaW4gVHlwZUxpc3QgZm9yIERpdG9Gb3JtQ2hvb3Nlci5cbiAgICAgIHJldHVybiB0aGlzLnJvdXRlQ29tcG9uZW50LmdldENoaWxkUGF0aCh0aGlzLnNjaGVtYS5wYXRoKVxuICAgIH0sXG5cbiAgICBkZWZhdWx0UXVlcnkoKSB7XG4gICAgICBjb25zdCB7IGRlZmF1bHRPcmRlcjogb3JkZXIgfSA9IHRoaXNcbiAgICAgIHJldHVybiBvcmRlciA/IHsgb3JkZXIgfSA6IHt9XG4gICAgfSxcblxuICAgIHF1ZXJ5OiBnZXRTdG9yZUFjY2Vzc29yKCdxdWVyeScsIHtcbiAgICAgIGdldChxdWVyeSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdFF1ZXJ5LFxuICAgICAgICAgIC4uLnF1ZXJ5XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIHNldChxdWVyeSkge1xuICAgICAgICAvLyBBbHdheXMga2VlcCB0aGUgZGlzcGxheWVkIHF1ZXJ5IHBhcmFtZXRlcnMgaW4gc3luYyB3aXRoIHRoZSBzdG9yZWRcbiAgICAgICAgLy8gb25lcy4gVXNlIHNjb3BlIGFuZCBwYWdlIGZyb20gdGhlIGxpc3Qgc2NoZW1hIGFzIGRlZmF1bHRzLCBidXQgYWxsb3dcbiAgICAgICAgLy8gdGhlIHJvdXRlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gb3ZlcnJpZGUgdGhlbS5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHNjb3BlID0gdGhpcy5kZWZhdWx0U2NvcGU/Lm5hbWUsXG4gICAgICAgICAgcGFnZSA9IHRoaXMuc2NoZW1hLnBhZ2UsXG4gICAgICAgICAgdHlwZVxuICAgICAgICB9ID0gdGhpcy5xdWVyeVxuICAgICAgICAvLyBQcmVzZXJ2ZSAvIG1lcmdlIGN1cnJlbnRseSBzdG9yZWQgdmFsdWVzLCBpbmNsdWRpbmcgYW55IGN1c3RvbSBxdWVyeVxuICAgICAgICAvLyBwYXJhbWV0ZXJzIGFkZGVkIGJ5IGNyZWF0YWJsZS5xdWVyeVxuICAgICAgICBxdWVyeSA9IHtcbiAgICAgICAgICAuLi50aGlzLnF1ZXJ5LFxuICAgICAgICAgIC4uLihzY29wZSAhPSBudWxsICYmIHsgc2NvcGUgfSksXG4gICAgICAgICAgLi4uKHBhZ2UgIT0gbnVsbCAmJiB7IHBhZ2UgfSksXG4gICAgICAgICAgLi4uKHR5cGUgIT0gbnVsbCAmJiB7IHR5cGUgfSksXG4gICAgICAgICAgLi4ucXVlcnlcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVxdWFscyhxdWVyeSwgdGhpcy4kcm91dGUucXVlcnkpKSB7XG4gICAgICAgICAgLy8gQ2hhbmdlIHRoZSByb3V0ZSBxdWVyeSBwYXJhbWV0ZXJzLCBidXQgZG9uJ3QgdHJpZ2dlciBhIHJvdXRlXG4gICAgICAgICAgLy8gY2hhbmdlLCBhcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSBsaXN0IHRvIHJlbG9hZC5cbiAgICAgICAgICByZXBsYWNlUm91dGUoeyBxdWVyeSB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVyeSAvLyBMZXQgZ2V0U3RvcmVBY2Nlc3NvcigpIGRvIHRoZSBhY3R1YWwgc2V0dGluZ1xuICAgICAgfVxuICAgIH0pLFxuXG4gICAgdG90YWw6IGdldFN0b3JlQWNjZXNzb3IoJ3RvdGFsJyksXG5cbiAgICBjb2x1bW5zKCkge1xuICAgICAgcmV0dXJuIGdldE5hbWVkU2NoZW1hcyh0aGlzLnNjaGVtYS5jb2x1bW5zKVxuICAgIH0sXG5cbiAgICBzY29wZXMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnNjb3BlcylcbiAgICB9LFxuXG4gICAgZGVmYXVsdFNjb3BlKCkge1xuICAgICAgbGV0IGZpcnN0ID0gbnVsbFxuICAgICAgaWYgKHRoaXMuc2NvcGVzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGUgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNjb3BlcykpIHtcbiAgICAgICAgICBpZiAoc2NvcGUuZGVmYXVsdFNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NvcGVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgICAgZmlyc3QgPSBzY29wZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0XG4gICAgfSxcblxuICAgIGRlZmF1bHRPcmRlcigpIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmNvbHVtbnMpKSB7XG4gICAgICAgICAgY29uc3QgeyBkZWZhdWx0U29ydCB9ID0gY29sdW1uXG4gICAgICAgICAgaWYgKGRlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBpc1N0cmluZyhkZWZhdWx0U29ydCkgPyBkZWZhdWx0U29ydCA6ICdhc2MnXG4gICAgICAgICAgICByZXR1cm4gYCR7Y29sdW1uLm5hbWV9ICR7ZGlyZWN0aW9ufWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIG5lc3RlZE1ldGEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLm1ldGEsXG4gICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9ybXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhnZXRGb3JtU2NoZW1hcyh0aGlzLnNjaGVtYSwgdGhpcy5jb250ZXh0KSlcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgbGlua2VkIHZpZXcgc2NoZW1hIGlmIHRoaXMgc291cmNlIGVkaXRzIGl0IGl0cyBpdGVtcyB0aHJvdWdoXG4gICAgLy8gYSBsaW5rZWQgdmlldy5cbiAgICB2aWV3KCkge1xuICAgICAgcmV0dXJuIGdldFZpZXdTY2hlbWEodGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dClcbiAgICB9LFxuXG4gICAgbGlua3NUb1ZpZXcoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZpZXdcbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLmJ1dHRvbnMpXG4gICAgfSxcblxuICAgIGlzQ29tcGFjdCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1zLmV2ZXJ5KGlzQ29tcGFjdClcbiAgICB9LFxuXG4gICAgaXNJbmxpbmVkKCkge1xuICAgICAgcmV0dXJuIGlzSW5saW5lZCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgcGFnaW5hdGU6IGdldFNjaGVtYUFjY2Vzc29yKCdwYWdpbmF0ZScsIHtcbiAgICAgIHR5cGU6IE51bWJlclxuICAgIH0pLFxuXG4gICAgcmVuZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVuZGVyJywge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICBjcmVhdGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdjcmVhdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoY3JlYXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGFibGUgJiYgaGFzRm9ybVNjaGVtYSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICA/IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gIXRoaXMudmFsdWVcbiAgICAgICAgICAgIDogdHJ1ZVxuICAgICAgICAgIDogZmFsc2VcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGVkaXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZWRpdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRhYmxlICYmICF0aGlzLmlzSW5saW5lZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBkcmFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkcmFnZ2FibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZSAmJiB0aGlzLmxpc3REYXRhLmxlbmd0aCA+IDEgJiYgZHJhZ2dhYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb2xsYXBzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGNvbGxhcHNpYmxlKSB7XG4gICAgICAgIHJldHVybiBjb2xsYXBzaWJsZSAmJiB0aGlzLmlzSW5saW5lZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29sbGFwc2VkOiBnZXRTY2hlbWFBY2Nlc3NvcignY29sbGFwc2VkJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGNvbGxhcHNlZCkge1xuICAgICAgICByZXR1cm4gY29sbGFwc2VkICYmIHRoaXMuY29sbGFwc2libGVcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG1heERlcHRoOiBnZXRTY2hlbWFBY2Nlc3NvcignbWF4RGVwdGgnLCB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAxXG4gICAgfSksXG5cbiAgICBjcmVhdGVQYXRoKCkge1xuICAgICAgaWYgKHRoaXMuY3JlYXRhYmxlKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgZ2V0Vmlld1BhdGgodGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dCkgfHxcbiAgICAgICAgICB0aGlzLnBhdGhcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICAkcm91dGU6IHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtcm91dGVyL2lzc3Vlcy8zMzkzI2lzc3VlY29tbWVudC0xMTU4NDcwMTQ5XG4gICAgICBmbHVzaDogJ3Bvc3QnLFxuICAgICAgaGFuZGxlcih0bywgZnJvbSkge1xuICAgICAgICBpZiAodGhpcy5wcm92aWRlc0RhdGEpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmcm9tLnBhdGggPT09IHRvLnBhdGggJiZcbiAgICAgICAgICAgIGZyb20uaGFzaCA9PT0gdG8uaGFzaFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gUGF0aHMgYW5kIGhhc2hlcyByZW1haW4gdGhlIHNhbWUsIHNvIG9ubHkgcXVlcmllcyBoYXZlIGNoYW5nZWQuXG4gICAgICAgICAgICAvLyBVcGRhdGUgZmlsdGVyIGFuZCByZWxvYWQgZGF0YSB3aXRob3V0IGNsZWFyaW5nLlxuICAgICAgICAgICAgdGhpcy5xdWVyeSA9IHRvLnF1ZXJ5XG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhKGZhbHNlKVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0aGlzLm1ldGEucmVsb2FkICYmXG4gICAgICAgICAgICBmcm9tLnBhdGggIT09IHRvLnBhdGggJiZcbiAgICAgICAgICAgIGZyb20ucGF0aC5zdGFydHNXaXRoKHRvLnBhdGgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHNvdXJjZSB3aGVuIG5hdmlnYXRpbmcgYmFjayB0byBhIHBhcmVudC1yb3V0ZSBhZnRlclxuICAgICAgICAgICAgLy8gY2hhbmdpbmcgZGF0YSBpbiBhIGNoaWxkLXJvdXRlLlxuICAgICAgICAgICAgdGhpcy5tZXRhLnJlbG9hZCA9IGZhbHNlXG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhKGZhbHNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB3cmFwcGVkUHJpbWl0aXZlczoge1xuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGhhbmRsZXIodG8sIGZyb20pIHtcbiAgICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcyB9ID0gdGhpc1xuICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIHNldHRpbmcgb2Ygd3JhcHBlZFByaW1pdGl2ZXMgYXJyYXlcbiAgICAgICAgaWYgKHdyYXBQcmltaXRpdmVzICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXaGVuZXZlciB0aGUgd3JhcHBlZFByaW1pdGl2ZXMgY2hhbmdlLCBtYXAgdGhlaXIgdmFsdWVzIGJhY2sgdG8gdGhlXG4gICAgICAgICAgLy8gYXJyYXkgb2YgcHJpbWl0aXZlcywgaW4gYSBwcmltaXRpdmUgd2F5IDopXG4gICAgICAgICAgLy8gQnV0IHNldCBgdW53cmFwcGluZ1ByaW1pdGl2ZXNgIHRvIHRydWUsIHNvIHRoZSBgbGlzdERhdGFgIGNvbXB1dGVkXG4gICAgICAgICAgLy8gcHJvcGVydHkga25vd3MgYWJvdXQgaXQsIHdoaWNoIHNldHMgaXQgdG8gYGZhbHNlYCBhZ2Fpbi5cbiAgICAgICAgICB0aGlzLnVud3JhcHBpbmdQcmltaXRpdmVzLnZhbHVlID0gdHJ1ZVxuICAgICAgICAgIHRoaXMudmFsdWUgPSB0by5tYXAob2JqZWN0ID0+IG9iamVjdFt3cmFwUHJpbWl0aXZlc10pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHNldHVwRGF0YSgpIHtcbiAgICAgIHRoaXMucXVlcnkgPSB0aGlzLiRyb3V0ZS5xdWVyeVxuICAgICAgdGhpcy5lbnN1cmVEYXRhKClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uY2xlYXJEYXRhKClcbiAgICBjbGVhckRhdGEoKSB7XG4gICAgICB0aGlzLnRvdGFsID0gMFxuICAgICAgdGhpcy52YWx1ZSA9IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uc2V0RGF0YSgpXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICAvLyBXaGVuIG5ldyBkYXRhIGlzIGxvYWRlZCwgd2UgY2FuIHN0b3JlIGl0IHJpZ2h0IGJhY2sgaW4gdGhlIGRhdGEgb2YgdGhlXG4gICAgICAvLyB2aWV3IG9yIGZvcm0gdGhhdCBjcmVhdGVkIHRoaXMgbGlzdCBjb21wb25lbnQuXG4gICAgICAvLyBTdXBwb3J0IHR3byBmb3JtYXRzIGZvciBsaXN0IGRhdGE6XG4gICAgICAvLyAtIEFycmF5OiBgWy4uLl1gXG4gICAgICAvLyAtIE9iamVjdDogYHsgcmVzdWx0czogWy4uLl0sIHRvdGFsIH1gLCBzZWUgYHVud3JhcExpc3REYXRhKClgXG4gICAgICBpZiAoXG4gICAgICAgICFkYXRhIHx8XG4gICAgICAgIHRoaXMuaXNMaXN0U291cmNlICYmIGlzQXJyYXkoZGF0YSkgfHxcbiAgICAgICAgdGhpcy5pc09iamVjdFNvdXJjZSAmJiBpc09iamVjdChkYXRhKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBkYXRhXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudW53cmFwTGlzdERhdGEoZGF0YSkpIHtcbiAgICAgICAgLy8gVGhlIGZvcm1hdCBkaWRuJ3QgbWF0Y2gsIHNlZSBpZiB3ZSByZWNlaXZlZCBhIGB7IHJlc3VsdHMsIHRvdGFsIH1gXG4gICAgICAgIC8vIG9iamVjdCwgaW4gd2hpY2ggY2FzZSBgdGhpcy52YWx1ZWAgd2FzIGFscmVhZHkgc2V0IGJ5XG4gICAgICAgIC8vIGB1bndyYXBMaXN0RGF0YSgpYCBhbmQgd2UncmUgZG9uZSBub3cuXG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGRhdGEpICYmIHRoaXMuaXNJblZpZXcpIHtcbiAgICAgICAgLy8gVGhlIGNvbnRyb2xsZXIgaXMgc2VuZGluZyBkYXRhIGZvciBhIGZ1bGwgbXVsdGktY29tcG9uZW50IHZpZXcsXG4gICAgICAgIC8vIGluY2x1ZGluZyB0aGUgbmVzdGVkIGxpc3QgZGF0YS5cbiAgICAgICAgdGhpcy52aWV3Q29tcG9uZW50LnNldERhdGEoZGF0YSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdW53cmFwTGlzdERhdGEoZGF0YSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmlzTGlzdFNvdXJjZSAmJlxuICAgICAgICBpc09iamVjdChkYXRhKSAmJlxuICAgICAgICBpc051bWJlcihkYXRhLnRvdGFsKSAmJlxuICAgICAgICBpc0FycmF5KGRhdGEucmVzdWx0cylcbiAgICAgICkge1xuICAgICAgICAvLyBJZiBAZGl0b2pzL3NlcnZlciBzZW5kcyBkYXRhIGluIHRoZSBmb3JtIG9mIGB7IHJlc3VsdHMsIHRvdGFsIH1gXG4gICAgICAgIC8vIHJlcGxhY2UgdGhlIHZhbHVlIHdpdGggcmVzdWx0LCBidXQgcmVtZW1iZXIgdGhlIHRvdGFsIGluIHRoZSBzdG9yZS5cbiAgICAgICAgdGhpcy50b3RhbCA9IGRhdGEudG90YWxcbiAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGEucmVzdWx0c1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGVJdGVtKHNjaGVtYSwgdHlwZSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuY3JlYXRlRGF0YShzY2hlbWEsIHR5cGUpXG4gICAgICBpZiAodGhpcy5pc09iamVjdFNvdXJjZSkge1xuICAgICAgICB0aGlzLm9iamVjdERhdGEgPSBpdGVtXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxpc3REYXRhLnB1c2goaXRlbSlcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbGxhcHNpYmxlKSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHRoaXMub3BlblNjaGVtYUNvbXBvbmVudCgtMSkpXG4gICAgICB9XG4gICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIHJldHVybiBpdGVtXG4gICAgfSxcblxuICAgIHJlbW92ZUl0ZW0oaXRlbSwgaW5kZXgpIHtcbiAgICAgIGxldCByZW1vdmVkID0gZmFsc2VcbiAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgIHRoaXMub2JqZWN0RGF0YSA9IG51bGxcbiAgICAgICAgcmVtb3ZlZCA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgbGlzdERhdGEgfSA9IHRoaXNcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBsaXN0RGF0YS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgcmVtb3ZlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtU3RvcmUodGhpcy5zY2hlbWEsIGl0ZW0sIGluZGV4KVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZXRlSXRlbShpdGVtLCBpbmRleCkge1xuICAgICAgY29uc3QgbGFiZWwgPSAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIGl0ZW0sIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBleHRlbmRlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuXG4gICAgICBjb25zdCBub3RpZnkgPSAoKSA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogdGhpcy5pc1RyYW5zaWVudCA/ICdpbmZvJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3NmdWxseSBSZW1vdmVkJyxcbiAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICBgJHtsYWJlbH0gd2FzICR7dGhpcy52ZXJicy5kZWxldGVkfS5gLFxuICAgICAgICAgICAgdGhpcy50cmFuc2llbnROb3RlXG4gICAgICAgICAgXVxuICAgICAgICB9KVxuXG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgYERvIHlvdSByZWFsbHkgd2FudCB0byAke3RoaXMudmVyYnMuZGVsZXRlfSAke2xhYmVsfT9gXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtLCBpbmRleClcbiAgICAgICAgICBub3RpZnkoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IHRoaXMuZ2V0SXRlbUlkKHRoaXMuc2NoZW1hLCBpdGVtLCBpbmRleClcbiAgICAgICAgICBjb25zdCBtZXRob2QgPSAnZGVsZXRlJ1xuICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gZ2V0TWVtYmVyUmVzb3VyY2UoXG4gICAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgICB0aGlzLmdldFJlc291cmNlKHsgbWV0aG9kIH0pXG4gICAgICAgICAgKVxuICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVSZXF1ZXN0KHsgbWV0aG9kLCByZXNvdXJjZSB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtLCBpbmRleClcbiAgICAgICAgICAgICAgICBub3RpZnkoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMucmVsb2FkRGF0YSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRTY2hlbWFDb21wb25lbnQoaW5kZXgpIHtcbiAgICAgIGNvbnN0IHsgc2NoZW1hQ29tcG9uZW50cyB9ID0gdGhpc1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHNjaGVtYUNvbXBvbmVudHNcbiAgICAgIHJldHVybiBzY2hlbWFDb21wb25lbnRzWygoaW5kZXggJSBsZW5ndGgpICsgbGVuZ3RoKSAlIGxlbmd0aF1cbiAgICB9LFxuXG4gICAgb3BlblNjaGVtYUNvbXBvbmVudChpbmRleCkge1xuICAgICAgY29uc3Qgc2NoZW1hQ29tcG9uZW50ID0gdGhpcy5nZXRTY2hlbWFDb21wb25lbnQoaW5kZXgpXG4gICAgICBpZiAoc2NoZW1hQ29tcG9uZW50KSB7XG4gICAgICAgIHNjaGVtYUNvbXBvbmVudC5vcGVuZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG5hdmlnYXRlVG9Db21wb25lbnQoZGF0YVBhdGgsIG9uQ29tcGxldGUpIHtcbiAgICAgIGlmICh0aGlzLmNvbGxhcHNpYmxlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVBhdGguc3RhcnRzV2l0aCh0aGlzLmRhdGFQYXRoKVxuICAgICAgICAgID8gdGhpcy5pc0xpc3RTb3VyY2VcbiAgICAgICAgICAgID8gcGFyc2VEYXRhUGF0aChkYXRhUGF0aC5zbGljZSh0aGlzLmRhdGFQYXRoLmxlbmd0aCArIDEpKVswXSA/PyBudWxsXG4gICAgICAgICAgICA6IDBcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgaWYgKGluZGV4ICE9PSBudWxsICYmIGlzTnVtYmVyKCtpbmRleCkpIHtcbiAgICAgICAgICBjb25zdCBzY2hlbWFDb21wb25lbnQgPSB0aGlzLmdldFNjaGVtYUNvbXBvbmVudCgraW5kZXgpXG4gICAgICAgICAgaWYgKHNjaGVtYUNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgeyBvcGVuZWQgfSA9IHNjaGVtYUNvbXBvbmVudFxuICAgICAgICAgICAgaWYgKCFvcGVuZWQpIHtcbiAgICAgICAgICAgICAgc2NoZW1hQ29tcG9uZW50Lm9wZW5lZCA9IHRydWVcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy4kbmV4dFRpY2soKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHNjaGVtYUNvbXBvbmVudC5nZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aClcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRzLmxlbmd0aCA+IDAgJiYgKG9uQ29tcGxldGU/Lihjb21wb25lbnRzKSA/PyB0cnVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2NoZW1hQ29tcG9uZW50Lm9wZW5lZCA9IG9wZW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGVUb1JvdXRlQ29tcG9uZW50KGRhdGFQYXRoLCBvbkNvbXBsZXRlKVxuICAgIH0sXG5cbiAgICBuYXZpZ2F0ZVRvUm91dGVDb21wb25lbnQoZGF0YVBhdGgsIG9uQ29tcGxldGUpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGxPbkNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBsYXN0IHJvdXRlIGNvbXBvbmVudCwgd2hpY2ggd2lsbCBiZSB0aGUgY29tcG9uZW50IHRoYXRcbiAgICAgICAgICAvLyB3ZSBqdXN0IG5hdmlnYXRlZCB0bywgYW5kIHBhc3MgaXQgb24gdG8gYG9uQ29tcGxldGUoKWBcbiAgICAgICAgICBjb25zdCB7IHJvdXRlQ29tcG9uZW50cyB9ID0gdGhpcy5hcHBTdGF0ZVxuICAgICAgICAgIGNvbnN0IHJvdXRlQ29tcG9uZW50ID0gcm91dGVDb21wb25lbnRzW3JvdXRlQ29tcG9uZW50cy5sZW5ndGggLSAxXVxuICAgICAgICAgIHJlc29sdmUob25Db21wbGV0ZT8uKFtyb3V0ZUNvbXBvbmVudF0pID8/IHRydWUpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhUGF0aFBhcnRzID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgICAgICAgLy8gU2VlIGlmIHdlIGNhbiBmaW5kIGEgcm91dGUgdGhhdCBjYW4gc2VydmUgcGFydCBvZiB0aGUgZ2l2ZW4gZGF0YVBhdGgsXG4gICAgICAgIC8vIGFuZCB0YWtlIGl0IGZyb20gdGhlcmU6XG4gICAgICAgIHdoaWxlIChkYXRhUGF0aFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5yb3V0ZUNvbXBvbmVudC5nZXRDaGlsZFBhdGgoXG4gICAgICAgICAgICB0aGlzLmFwaS5ub3JtYWxpemVQYXRoKG5vcm1hbGl6ZURhdGFQYXRoKGRhdGFQYXRoUGFydHMpKVxuICAgICAgICAgIClcbiAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgYWN0dWFsbHkgaXMgYSByb3V0ZSBmb3IgdGhpcyBzdWItY29tcG9uZW50OlxuICAgICAgICAgIGNvbnN0IHsgbWF0Y2hlZCB9ID0gdGhpcy4kcm91dGVyLnJlc29sdmUocGF0aClcbiAgICAgICAgICBpZiAobWF0Y2hlZC5sZW5ndGggJiYgbWF0Y2hlZFswXS5uYW1lICE9PSAnY2F0Y2gtYWxsJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuJHJvdXRlLnBhdGggPT09IHBhdGgpIHtcbiAgICAgICAgICAgICAgLy8gV2UncmUgYWxyZWFkeSB0aGVyZSwgc28ganVzdCBjYWxsIGBvbkNvbXBsZXRlKClgOlxuICAgICAgICAgICAgICBjYWxsT25Db21wbGV0ZSgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgY29tcG9uZW50J3MgcGF0aCwgdGhlbiBjYWxsIGBvbkNvbXBsZXRlKClgXzpcbiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyXG4gICAgICAgICAgICAgICAgLnB1c2goeyBwYXRoIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdClcbiAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgbGFzdCByb3V0ZSBjb21wb25lbnQgdG8gYmUgbW91bnRlZCBpbiB0aGUgbmV4dFxuICAgICAgICAgICAgICAgIC8vIHRpY2sgYmVmb3JlIGNhbGxpbmcgYG9uQ29tcGxldGUoKWBcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljayhjYWxsT25Db21wbGV0ZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEtlZXAgcmVtb3ZpbmcgdGhlIGxhc3QgcGFydCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG4gICAgICAgICAgZGF0YVBhdGhQYXJ0cy5wb3AoKVxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICB9KVxuICAgIH1cbiAgfSwgLy8gZW5kIG9mIGBtZXRob2RzYFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBuYW1lLFxuICAgIHJvdXRlcyxcbiAgICBsZXZlbCxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgcHJvY2VzcyA9IG51bGxcbiAgKSB7XG4gICAgcHJvY2Vzc1JvdXRlU2NoZW1hKGFwaSwgc2NoZW1hLCBuYW1lKVxuICAgIGNvbnN0IGlubGluZWQgPSBpc0lubGluZWQoc2NoZW1hKVxuICAgIGlmIChpbmxpbmVkICYmIHNjaGVtYS5yZXNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTmVzdGVkICR7XG4gICAgICAgICAgdGhpcy5pc0xpc3RTb3VyY2VcbiAgICAgICAgICAgID8gJ2xpc3RzJ1xuICAgICAgICAgICAgOiB0aGlzLmlzT2JqZWN0U291cmNlXG4gICAgICAgICAgICAgID8gJ29iamVjdHMnXG4gICAgICAgICAgICAgIDogJ3NjaGVtYSdcbiAgICAgICAgfSBjYW5ub3QgbG9hZCBkYXRhIGZyb20gdGhlaXIgb3duIHJlc291cmNlc2BcbiAgICAgIClcbiAgICB9XG4gICAgLy8gVXNlIGRpZmZlcmVudGx5IG5hbWVkIHVybCBwYXJhbWV0ZXJzIG9uIGVhY2ggbmVzdGVkIGxldmVsIGZvciBpZCBhc1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IHdvdWxkIGNsYXNoIGFuZCBvdmVycmlkZSBlYWNoIG90aGVyIGluc2lkZSAkcm91dGUucGFyYW1zXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMTM0NVxuICAgIGNvbnN0IHBhcmFtID0gYGlkJHtsZXZlbCArIDF9YFxuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gICAgY29uc3QgZm9ybU1ldGEgPSB7XG4gICAgICAuLi5tZXRhLFxuICAgICAgLy8gV2hlbiBjaGlsZHJlbiBhcmUgZmxhdHRlbmVkIChlLmcuIHRyZWUtbGlzdHMpLCBpbmNsdWRlIHRoZSBgZmxhdHRlbmBcbiAgICAgIC8vIHNldHRpbmcgYWxzbywgZm9yIGZsYXR0ZW5pbmcgYmVsb3cuXG4gICAgICBmbGF0dGVuLFxuICAgICAgbmVzdGVkLFxuICAgICAgcGFyYW1cbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBhd2FpdCBwcm9jZXNzRm9ybXMoYXBpLCBzY2hlbWEsIGxldmVsKVxuICAgIGlmIChwcm9jZXNzKSB7XG4gICAgICBhd2FpdCBwcm9jZXNzKGNoaWxkUm91dGVzLCBsZXZlbCArIDEpXG4gICAgfVxuICAgIC8vIElubGluZWQgZm9ybXMgZG9uJ3QgbmVlZCB0byBhY3R1YWxseSBhZGQgcm91dGVzLlxuICAgIGlmIChoYXNGb3JtU2NoZW1hKHNjaGVtYSkgJiYgIWlubGluZWQpIHtcbiAgICAgIC8vIExpc3RzIGluIHNpbmdsZS1jb21wb25lbnQtdmlld3MgKGxldmVsID09PSAwKSB1c2UgdGhlaXIgdmlldydzIHBhdGgsXG4gICAgICAvLyB3aGlsZSBhbGwgb3RoZXJzIG5lZWQgdGhlaXIgcGF0aCBwcmVmaXhlZCB3aXRoIHRoZSBwYXJlbnQncyBwYXRoOlxuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IGxldmVsID09PSAwID8gJycgOiBzY2hlbWEucGF0aFxuICAgICAgY29uc3QgZm9ybVJvdXRlID0ge1xuICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKFxuICAgICAgICAgIHNvdXJjZVBhdGgsXG4gICAgICAgICAgLy8gT2JqZWN0IHNvdXJjZXMgZG9uJ3QgbmVlZCBpZCBwYXJhbXMgaW4gdGhlaXIgZm9ybSBwYXRocywgYXMgdGhleVxuICAgICAgICAgIC8vIGRpcmVjdGx5IGVkaXQgb25lIG9iamVjdC5cbiAgICAgICAgICBpc0xpc3RTb3VyY2Uoc2NoZW1hKSA/IHBhcmFtIDogbnVsbFxuICAgICAgICApLFxuICAgICAgICBjb21wb25lbnQ6IERpdG9Db21wb25lbnQuY29tcG9uZW50KFxuICAgICAgICAgIG5lc3RlZCA/ICdEaXRvRm9ybU5lc3RlZCcgOiAnRGl0b0Zvcm0nXG4gICAgICAgICksXG4gICAgICAgIG1ldGE6IGZvcm1NZXRhXG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3RTb3VyY2Uoc2NoZW1hKSkge1xuICAgICAgICAvLyBBbHNvIGFkZCBhIHBhcmFtIHJvdXRlLCBzaW1wbHkgdG8gaGFuZGxlICcvY3JlYXRlJyBsaW5rcyB0aGUgc2FtZVxuICAgICAgICAvLyB3YXkgdGhhdCBsaXN0cyBkbywgd2hlcmUgaXQgb3ZlcmxhcHMgd2l0aCA6aWQgZm9yIGl0ZW0gaWRzLlxuICAgICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgICAgLi4uZm9ybVJvdXRlLFxuICAgICAgICAgIHBhdGg6IGdldFBhdGhXaXRoUGFyYW0oc291cmNlUGF0aCwgcGFyYW0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoc291cmNlUGF0aCkge1xuICAgICAgICAvLyBKdXN0IHJlZGlyZWN0IGJhY2sgdG8gdGhlIHBhcmVudCB3aGVuIGEgbmVzdGVkIHNvdXJjZSByb3V0ZSBpcyBoaXQuXG4gICAgICAgIHJvdXRlcy5wdXNoKHtcbiAgICAgICAgICBwYXRoOiBzb3VyY2VQYXRoLFxuICAgICAgICAgIHJlZGlyZWN0OiAnLicsXG4gICAgICAgICAgbWV0YVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgLy8gUGFydGl0aW9uIGNoaWxkUm91dGVzIGludG8gdGhvc2UgdGhhdCBuZWVkIGZsYXR0ZW5pbmcgKGUuZy4gdHJlZS1saXN0cylcbiAgICAgIC8vIGFuZCB0aG9zZSB0aGF0IGRvbid0LCBhbmQgcHJvY2VzcyBlYWNoIGdyb3VwIHNlcGFyYXRlbHkgYWZ0ZXIuXG4gICAgICBjb25zdCBbZmxhdFJvdXRlcywgc3ViUm91dGVzXSA9IGNoaWxkUm91dGVzLnJlZHVjZShcbiAgICAgICAgKHJlcywgcm91dGUpID0+IHtcbiAgICAgICAgICByZXNbcm91dGUubWV0YS5mbGF0dGVuID8gMCA6IDFdLnB1c2gocm91dGUpXG4gICAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICB9LFxuICAgICAgICBbW10sIFtdXVxuICAgICAgKVxuICAgICAgaWYgKHN1YlJvdXRlcy5sZW5ndGgpIHtcbiAgICAgICAgZm9ybVJvdXRlLmNoaWxkcmVuID0gc3ViUm91dGVzXG4gICAgICB9XG4gICAgICByb3V0ZXMucHVzaChmb3JtUm91dGUpXG4gICAgICAvLyBBZGQgdGhlIHByZWZpeGVkIGZvcm1Sb3V0ZXMgd2l0aCB0aGVpciBjaGlsZHJlbiBmb3IgbmVzdGVkIGxpc3RzLlxuICAgICAgaWYgKGZsYXRSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGRSb3V0ZSBvZiBmbGF0Um91dGVzKSB7XG4gICAgICAgICAgcm91dGVzLnB1c2goe1xuICAgICAgICAgICAgLi4uKGNoaWxkUm91dGUucmVkaXJlY3QgPyBjaGlsZFJvdXRlIDogZm9ybVJvdXRlKSxcbiAgICAgICAgICAgIHBhdGg6IGAke2Zvcm1Sb3V0ZS5wYXRofS8ke2NoaWxkUm91dGUucGF0aH1gLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAuLi5jaGlsZFJvdXRlLm1ldGEsXG4gICAgICAgICAgICAgIGZsYXR0ZW5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHByb2Nlc3NWYWx1ZSh7IHNjaGVtYSwgdmFsdWUsIGRhdGFQYXRoIH0sIGdyYXBoKSB7XG4gICAgZ3JhcGguYWRkU291cmNlKGRhdGFQYXRoLCBzY2hlbWEpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UGF0aFdpdGhQYXJhbShwYXRoLCBwYXJhbSkge1xuICByZXR1cm4gcGFyYW1cbiAgICA/IHBhdGhcbiAgICAgID8gYCR7cGF0aH0vOiR7cGFyYW19YFxuICAgICAgOiBgOiR7cGFyYW19YFxuICAgIDogcGF0aFxufVxuIiwiaW1wb3J0IHsgaXNBcnJheSwgYXNBcnJheSwgbGFiZWxpemUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgZ2V0TmFtZWRTY2hlbWFzLCBwcm9jZXNzTmVzdGVkU2NoZW1hRGVmYXVsdHMgfSBmcm9tICcuL3NjaGVtYSdcblxuZXhwb3J0IGNvbnN0IGZpbHRlckNvbXBvbmVudHMgPSB7XG4gICd0ZXh0JyhmaWx0ZXIpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ2NvbnRhaW5zJyxcbiAgICAgICAgdmFsdWU6ICdjb250YWlucydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZXF1YWxzJyxcbiAgICAgICAgdmFsdWU6ICdlcXVhbHMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3N0YXJ0cyB3aXRoJyxcbiAgICAgICAgdmFsdWU6ICdzdGFydHMtd2l0aCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZW5kcyB3aXRoJyxcbiAgICAgICAgdmFsdWU6ICdlbmRzLXdpdGgnXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiB7XG4gICAgICBvcGVyYXRvcjogZmlsdGVyLm9wZXJhdG9yc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgd2lkdGg6ICcyLzUnLFxuICAgICAgICAgICAgb3B0aW9uczogaXNBcnJheShmaWx0ZXIub3BlcmF0b3JzKVxuICAgICAgICAgICAgICA/IG9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgb3B0aW9uID0+IGZpbHRlci5vcGVyYXRvcnMuaW5jbHVkZXMob3B0aW9uLnZhbHVlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBvcHRpb25zLFxuICAgICAgICAgICAgY2xlYXJhYmxlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwsXG4gICAgICB0ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgd2lkdGg6IGZpbHRlci5vcGVyYXRvcnMgPyAnMy81JyA6ICdmaWxsJyxcbiAgICAgICAgY2xlYXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gICdkYXRlLXJhbmdlJygpIHtcbiAgICBjb25zdCBkYXRldGltZSA9IHtcbiAgICAgIHR5cGU6ICdkYXRldGltZScsXG4gICAgICB3aWR0aDogJzEvMicsXG4gICAgICBmb3JtYXRzOiB7XG4gICAgICAgIC8vIFVzZSBzaG9ydGVyIGRhdGUgZm9ybWF0IGluIGRhdGUtcmFuZ2UgZmlsdGVyczpcbiAgICAgICAgZGF0ZToge1xuICAgICAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgeWVhcjogJ251bWVyaWMnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjbGVhcmFibGU6IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IGRhdGV0aW1lLFxuICAgICAgdG86IGRhdGV0aW1lXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGaWx0ZXJzUGFuZWwoYXBpLCBmaWx0ZXJzLCBkYXRhUGF0aCwgcXVlcnkpIHtcbiAgY29uc3QgeyBzdGlja3ksIC4uLmZpbHRlclNjaGVtYXMgfSA9IGZpbHRlcnNcbiAgY29uc3QgcGFuZWwgPSB7XG4gICAgdHlwZTogJ3BhbmVsJyxcbiAgICBsYWJlbDogJ0ZpbHRlcnMnLFxuICAgIG5hbWU6ICckZmlsdGVycycsXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgc3RpY2t5LFxuXG4gICAgLy8gTk9URTogT24gcGFuZWxzLCB0aGUgZGF0YSgpIGNhbGxiYWNrIGRvZXMgc29tZXRoaW5nIGVsc2UgdGhhbiBvbiBub3JtYWxcbiAgICAvLyBzY2hlbWE6IEl0IHByb2R1Y2VzIHRoZSBgZGF0YWAgcHJvcGVydHkgdG8gYmUgcGFzc2VkIHRvIHRoZSBwYW5lbCdzXG4gICAgLy8gc2NoZW1hLCBub3QgdGhlIGRhdGEgdG8gYmUgdXNlZCBmb3IgdGhlIHBhbmVsIGNvbXBvbmVudCBkaXJlY3RseS5cbiAgICBkYXRhKCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmlsdGVyc0RhdGEoXG4gICAgICAgIHBhbmVsLFxuICAgICAgICBxdWVyeS52YWx1ZVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRzOiBjcmVhdGVGaWx0ZXJzQ29tcG9uZW50cyhmaWx0ZXJTY2hlbWFzKSxcbiAgICBidXR0b25zOiBjcmVhdGVGaWx0ZXJzQnV0dG9ucyhmYWxzZSksXG4gICAgcGFuZWxCdXR0b25zOiBjcmVhdGVGaWx0ZXJzQnV0dG9ucyh0cnVlKSxcblxuICAgIGV2ZW50czoge1xuICAgICAgY2hhbmdlKCkge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVycygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0RmlsdGVyc0RhdGEodGhpcy5zY2hlbWEsIHRoaXMuZGF0YSlcbiAgICAgIH0sXG5cbiAgICAgIGhhc0ZpbHRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBhcHBseUZpbHRlcnMoKSB7XG4gICAgICAgIHF1ZXJ5LnZhbHVlID0ge1xuICAgICAgICAgIC4uLnF1ZXJ5LnZhbHVlLFxuICAgICAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXJzLFxuICAgICAgICAgIC8vIENsZWFyIHBhZ2luYXRpb24gd2hlbiBhcHBseWluZyBvciBjbGVhcmluZyBmaWx0ZXJzOlxuICAgICAgICAgIHBhZ2U6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBjbGVhckZpbHRlcnMoKSB7XG4gICAgICAgIHRoaXMucmVzZXREYXRhKClcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcnMoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm9jZXNzTmVzdGVkU2NoZW1hRGVmYXVsdHMoYXBpLCBwYW5lbClcbiAgcmV0dXJuIHBhbmVsXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcnNCdXR0b25zKHNtYWxsKSB7XG4gIHJldHVybiB7XG4gICAgY2xlYXI6IHtcbiAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgdGV4dDogc21hbGwgPyBudWxsIDogJ0NsZWFyJyxcbiAgICAgIGRpc2FibGVkOiAoeyBzY2hlbWFDb21wb25lbnQgfSkgPT4gIXNjaGVtYUNvbXBvbmVudC5oYXNGaWx0ZXJzLFxuICAgICAgZXZlbnRzOiB7XG4gICAgICAgIGNsaWNrKHsgc2NoZW1hQ29tcG9uZW50IH0pIHtcbiAgICAgICAgICAvLyBTaW5jZSBwYW5lbCBidXR0b25zIGFyZSBvdXRzaWRlIG9mIHRoZSBzY2hlbWEsIHdlIG5lZWQgdG8gdXNlIHRoZVxuICAgICAgICAgIC8vIHNjaGVtYSBjb21wb25lbnQgcmVjZWl2ZWQgZnJvbSB0aGUgaW5pdGlhbGl6ZSBldmVudCBiZWxvdzpcbiAgICAgICAgICBzY2hlbWFDb21wb25lbnQuY2xlYXJGaWx0ZXJzKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdWJtaXQ6IHtcbiAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgdGV4dDogc21hbGwgPyBudWxsIDogJ0ZpbHRlcicsXG4gICAgICB2aXNpYmxlOiAhc21hbGwsXG4gICAgICBldmVudHM6IHtcbiAgICAgICAgY2xpY2soeyBzY2hlbWFDb21wb25lbnQgfSkge1xuICAgICAgICAgIHNjaGVtYUNvbXBvbmVudC5hcHBseUZpbHRlcnMoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERhdGFOYW1lKGZpbHRlck5hbWUpIHtcbiAgLy8gUHJlZml4IGZpbHRlciBkYXRhIGtleXMgd2l0aCAnJCcgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIgZGF0YSBrZXlzOlxuICByZXR1cm4gYCQke2ZpbHRlck5hbWV9YFxufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJOYW1lKGRhdGFOYW1lKSB7XG4gIHJldHVybiBkYXRhTmFtZS5zdGFydHNXaXRoKCckJykgPyBkYXRhTmFtZS5zbGljZSgxKSA6IG51bGxcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmlsdGVyc0NvbXBvbmVudHMoZmlsdGVycykge1xuICBjb25zdCBjb21wcyA9IHt9XG4gIGZvciAoY29uc3QgZmlsdGVyIG9mIE9iamVjdC52YWx1ZXMoZ2V0TmFtZWRTY2hlbWFzKGZpbHRlcnMpIHx8IHt9KSkge1xuICAgIC8vIFN1cHBvcnQgYm90aCBjdXN0b20gZm9ybXMgYW5kIGRlZmF1bHQgZmlsdGVyIGNvbXBvbmVudHMsIHRocm91Z2ggdGhlXG4gICAgLy8gYGZpbHRlckNvbXBvbmVudHNgIHJlZ2lzdHJ5LiBFdmVuIGZvciBkZWZhdWx0IGZpbHRlcnMsIHN0aWxsIHVzZSB0aGVcbiAgICAvLyBwcm9wZXJ0aWVzIGluIGBmaWx0ZXJgIGFzIHRoZSBiYXNlIGZvciBgZm9ybWAsIHNvIHRoaW5ncyBsaWtlIGBsYWJlbGBcbiAgICAvLyBjYW4gYmUgY2hhbmdlZCBvbiB0aGUgcmVzdWx0aW5nIGZvcm0uXG4gICAgY29uc3QgeyBmaWx0ZXI6IHR5cGUsIHdpZHRoLCAuLi5mb3JtIH0gPSBmaWx0ZXJcbiAgICBjb25zdCBjb21wb25lbnRzID0gdHlwZVxuICAgICAgPyBmaWx0ZXJDb21wb25lbnRzW3R5cGVdPy4oZmlsdGVyKVxuICAgICAgOiBmaWx0ZXIuY29tcG9uZW50c1xuICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICBmb3JtLnR5cGUgPSAnZm9ybSdcbiAgICAgIGZvcm0uY29tcG9uZW50cyA9IHt9XG4gICAgICAvLyBDb252ZXJ0IGxhYmVscyB0byBwbGFjZWhvbGRlcnM6XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNvbXBvbmVudF0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9uZW50cykpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgIGNvbnN0IGxhYmVsID0gY29tcG9uZW50LmxhYmVsIHx8IGxhYmVsaXplKGNvbXBvbmVudC5uYW1lIHx8IGtleSlcbiAgICAgICAgICBmb3JtLmNvbXBvbmVudHNba2V5XSA9IHtcbiAgICAgICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgICAgIGxhYmVsOiBmYWxzZSxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBsYWJlbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29tcHNbZ2V0RGF0YU5hbWUoZmlsdGVyLm5hbWUpXSA9IHtcbiAgICAgICAgbGFiZWw6IGZvcm0ubGFiZWwgPz8gbGFiZWxpemUoZmlsdGVyLm5hbWUpLFxuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGRlZmF1bHQ6ICgpID0+ICh7fSksXG4gICAgICAgIGZvcm0sXG4gICAgICAgIGlubGluZWQ6IHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBmaWx0ZXIgJyR7ZmlsdGVyLm5hbWV9JzogVW5rbm93biBmaWx0ZXIgdHlwZSAnJHt0eXBlfScuYFxuICAgICAgKVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29tcHNcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50c0ZvckZpbHRlcihzY2hlbWEsIGRhdGFOYW1lKSB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IHNjaGVtYS5jb21wb25lbnRzW2RhdGFOYW1lXVxuICByZXR1cm4gY29tcG9uZW50Py5mb3JtPy5jb21wb25lbnRzXG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbHRlcnNEYXRhKHNjaGVtYSwgZGF0YSkge1xuICBjb25zdCBmaWx0ZXJzID0gW11cbiAgZm9yIChjb25zdCBkYXRhTmFtZSBpbiBkYXRhKSB7XG4gICAgY29uc3QgZW50cnkgPSBkYXRhW2RhdGFOYW1lXVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgLy8gTWFwIGNvbXBvbmVudHMgc2VxdWVuY2UgdG8gYXJndW1lbnRzOlxuICAgICAgY29uc3QgYXJncyA9IE9iamVjdC5rZXlzKFxuICAgICAgICBnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgZGF0YU5hbWUpXG4gICAgICApLm1hcChcbiAgICAgICAga2V5ID0+IGVudHJ5W2tleV0gPz8gbnVsbFxuICAgICAgKVxuICAgICAgLy8gT25seSBhcHBseSBmaWx0ZXIgaWYgdGhlcmUgYXJlIHNvbWUgYXJndW1lbnRzIHRoYXQgYXJlbid0IG51bGw6XG4gICAgICBpZiAoYXJncy5zb21lKHZhbHVlID0+IHZhbHVlICE9PSBudWxsKSkge1xuICAgICAgICBmaWx0ZXJzLnB1c2goXG4gICAgICAgICAgYCR7XG4gICAgICAgICAgICBnZXRGaWx0ZXJOYW1lKGRhdGFOYW1lKVxuICAgICAgICAgIH06JHtcbiAgICAgICAgICAgIGFyZ3MubWFwKEpTT04uc3RyaW5naWZ5KS5qb2luKCcsJylcbiAgICAgICAgICB9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmaWx0ZXJzXG59XG5cbmZ1bmN0aW9uIHBhcnNlRmlsdGVyc0RhdGEoc2NoZW1hLCBxdWVyeSkge1xuICBjb25zdCBmaWx0ZXJzID0ge31cbiAgLy8gU2FtZSBhcyBAZGl0b2pzL3NlcnZlcidzIFF1ZXJ5UGFyYW1ldGVycy5maWx0ZXI6IFRyYW5zbGF0ZSB0aGUgc3RyaW5nIGRhdGFcbiAgLy8gZnJvbSAkcm91dGUucXVlcnkgYmFjayB0byBwYXJhbSBsaXN0cyBwZXIgZmlsdGVyOlxuICBpZiAocXVlcnkpIHtcbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBhc0FycmF5KHF1ZXJ5LmZpbHRlcikpIHtcbiAgICAgIGNvbnN0IFssIGZpbHRlck5hbWUsIGpzb25dID0gZmlsdGVyLm1hdGNoKC9eKFxcdyspOiguKikkLylcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbHRlcnNbZmlsdGVyTmFtZV0gPSBhc0FycmF5KEpTT04ucGFyc2UoYFske2pzb259XWApKVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgfVxuICBjb25zdCBmaWx0ZXJzRGF0YSA9IHt9XG4gIGZvciAoY29uc3QgZGF0YU5hbWUgaW4gc2NoZW1hLmNvbXBvbmVudHMpIHtcbiAgICBjb25zdCBkYXRhID0ge31cbiAgICAvLyBJZiB3ZSBoYXZlIHJldHJpZXZlZCBwYXJhbXMgZnJvbSB0aGUgcXVlcnksIGZldGNoIHRoZSBhc3NvY2lhdGVkXG4gICAgLy8gZm9ybSBjb21wb25lbnRzIHNvIHdlIGNhbiBtYXAgdGhlIHZhbHVlcyBiYWNrIHRvIG9iamVjdCBrZXlzOlxuICAgIGNvbnN0IGFyZ3MgPSBmaWx0ZXJzW2dldEZpbHRlck5hbWUoZGF0YU5hbWUpXVxuICAgIGlmIChhcmdzKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRzID0gZ2V0Q29tcG9uZW50c0ZvckZpbHRlcihzY2hlbWEsIGRhdGFOYW1lKVxuICAgICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgZGF0YVtrZXldID0gYXJnc1tpbmRleCsrXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZpbHRlcnNEYXRhW2RhdGFOYW1lXSA9IGRhdGFcbiAgfVxuICByZXR1cm4gZmlsdGVyc0RhdGFcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1saXN0KFxuICB2LWlmPVwiaXNSZWFkeVwiXG4gIDppZD1cImRhdGFQYXRoXCJcbilcbiAgLmRpdG8tbGlzdF9faGVhZGVyKFxuICAgIHYtaWY9XCJzY29wZXMgfHwgaGFzUGFnaW5hdGlvblwiXG4gIClcbiAgICBEaXRvU2NvcGVzKFxuICAgICAgdi1pZj1cInNjb3Blc1wiXG4gICAgICA6cXVlcnk9XCJxdWVyeVwiXG4gICAgICA6c2NvcGVzPVwic2NvcGVzXCJcbiAgICApXG4gICAgLy8tIFdoZW4gdGhlcmUncyBvbmx5IHBhZ2luYXRpb24gd2l0aG91dCBzY29wZXMsIHdlIG5lZWQgYSBnb29kIG9sJyBzcGFjZXJcbiAgICAvLy0gZGl2LCBmb3IgdGhlIGxheW91dCBub3QgdG8gYnJlYWsuLi5cbiAgICAuZGl0by1zcGFjZXIoXG4gICAgICB2LWVsc2UtaWY9XCJoYXNQYWdpbmF0aW9uXCJcbiAgICApXG4gICAgRGl0b1BhZ2luYXRpb24oXG4gICAgICB2LWlmPVwiaGFzUGFnaW5hdGlvblwiXG4gICAgICA6cXVlcnk9XCJxdWVyeVwiXG4gICAgICA6bGltaXQ9XCJwYWdpbmF0ZVwiXG4gICAgICA6dG90YWw9XCJ0b3RhbCB8fCAwXCJcbiAgICApXG4gIHRhYmxlLmRpdG8tdGFibGUoXG4gICAgOmNsYXNzPWB7XG4gICAgICAnZGl0by10YWJsZS0tc2VwYXJhdG9ycyc6IGlzSW5saW5lZCxcbiAgICAgICdkaXRvLXRhYmxlLS1sYXJnZXItcGFkZGluZyc6IGhhc0VkaXRCdXR0b25zICYmICFpc0lubGluZWQsXG4gICAgICAnZGl0by10YWJsZS0tYWx0ZXJuYXRlLWNvbG9ycyc6ICFpc0lubGluZWQsXG4gICAgICAnZGl0by10YWJsZS0tZXZlbi1jb3VudCc6IGhhc0V2ZW5Db3VudFxuICAgIH1gXG4gIClcbiAgICBEaXRvVGFibGVIZWFkKFxuICAgICAgdi1pZj1cImNvbHVtbnNcIlxuICAgICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgIDpoYXNFZGl0QnV0dG9ucz1cImhhc0VkaXRCdXR0b25zXCJcbiAgICApXG4gICAgRGl0b0RyYWdnYWJsZShcbiAgICAgIGFzPVwidGJvZHlcIlxuICAgICAgOm9wdGlvbnM9XCJnZXREcmFnZ2FibGVPcHRpb25zKClcIlxuICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgICA6bW9kZWxWYWx1ZT1cInVwZGF0ZU9yZGVyKHNvdXJjZVNjaGVtYSwgbGlzdERhdGEsIHBhZ2luYXRpb25SYW5nZSlcIlxuICAgICAgQHVwZGF0ZTptb2RlbFZhbHVlPVwidmFsdWUgPT4gKGxpc3REYXRhID0gdmFsdWUpXCJcbiAgICApXG4gICAgICB0cihcbiAgICAgICAgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGxpc3REYXRhXCJcbiAgICAgICAgOmlkPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgOmtleT1cImdldEl0ZW1VaWQoc2NoZW1hLCBpdGVtKVwiXG4gICAgICApXG4gICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgIHYtaWY9XCJjb2x1bW5zXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJjb2x1bW4gaW4gY29sdW1uc1wiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgRGl0b1RhYmxlQ2VsbChcbiAgICAgICAgICAgICAgdi1pZj1cInNob3VsZFJlbmRlclNjaGVtYShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgOmtleT1cImNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZ2V0Q2VsbENsYXNzKGNvbHVtbilcIlxuICAgICAgICAgICAgICA6Y2VsbD1cImNvbHVtblwiXG4gICAgICAgICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgICA6bWV0YT1cIm5lc3RlZE1ldGFcIlxuICAgICAgICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgICAgICAgIDpuZXN0ZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgICAgICAgICApXG4gICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgIHYtZWxzZVxuICAgICAgICApXG4gICAgICAgICAgdGRcbiAgICAgICAgICAgIERpdG9TY2hlbWFJbmxpbmVkKFxuICAgICAgICAgICAgICB2LWlmPVwiaXNJbmxpbmVkXCJcbiAgICAgICAgICAgICAgOmxhYmVsPVwiZ2V0SXRlbUxhYmVsKHNjaGVtYSwgaXRlbSwgeyBpbmRleCwgYXNPYmplY3Q6IHRydWUgfSlcIlxuICAgICAgICAgICAgICA6c2NoZW1hPVwiZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBpdGVtLCBjb250ZXh0KVwiXG4gICAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICAgIDptZXRhPVwibmVzdGVkTWV0YVwiXG4gICAgICAgICAgICAgIDpzdG9yZT1cImdldEl0ZW1TdG9yZShzY2hlbWEsIGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgICAgICAgICAgIDpjb2xsYXBzZWQ9XCJjb2xsYXBzZWRcIlxuICAgICAgICAgICAgICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gICAgICAgICAgICAgIDpkZWxldGFibGU9XCJkZWxldGFibGVcIlxuICAgICAgICAgICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgICAgICAgICAgOmVkaXRhYmxlPVwiZWRpdGFibGVcIlxuICAgICAgICAgICAgICA6ZWRpdFBhdGg9XCJnZXRFZGl0UGF0aChpdGVtLCBpbmRleClcIlxuICAgICAgICAgICAgICBAZGVsZXRlPVwiZGVsZXRlSXRlbShpdGVtLCBpbmRleClcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29tcG9uZW50KFxuICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgOmlzPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICAgIDpuZXN0ZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJyZW5kZXJcIlxuICAgICAgICAgICAgICB2LWh0bWw9XCJyZW5kZXIoZ2V0Q29udGV4dChpdGVtLCBpbmRleCkpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgICAgICB2LWh0bWw9XCJnZXRJdGVtTGFiZWwoc2NoZW1hLCBpdGVtLCB7IGluZGV4IH0pXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgdGQuZGl0by10YWJsZV9fYnV0dG9ucyhcbiAgICAgICAgICB2LWlmPVwiaGFzQ2VsbEVkaXRCdXR0b25zXCJcbiAgICAgICAgKVxuICAgICAgICAgIERpdG9FZGl0QnV0dG9ucyhcbiAgICAgICAgICAgIG5lc3RlZFxuICAgICAgICAgICAgOnNjaGVtYT1cImdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgaXRlbSwgY29udGV4dClcIlxuICAgICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICA6bWV0YT1cIm5lc3RlZE1ldGFcIlxuICAgICAgICAgICAgOnN0b3JlPVwiZ2V0SXRlbVN0b3JlKHNjaGVtYSwgaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgICAgICAgICA6ZGVsZXRhYmxlPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgICAgIDpkcmFnZ2FibGU9XCJkcmFnZ2FibGVcIlxuICAgICAgICAgICAgOmVkaXRhYmxlPVwiZWRpdGFibGVcIlxuICAgICAgICAgICAgOmVkaXRQYXRoPVwiZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgIEBkZWxldGU9XCJkZWxldGVJdGVtKGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgKVxuICAgIC8vLSBSZW5kZXIgY3JlYXRlIGJ1dHRvbnMgaW5zaWRlIHRhYmxlIHdoZW4gbm90IGluIGEgc2luZ2xlIGNvbXBvbmVudCB2aWV3OlxuICAgIHRmb290KFxuICAgICAgdi1pZj1cImhhc0xpc3RCdXR0b25zICYmICFzaW5nbGVcIlxuICAgIClcbiAgICAgIHRyXG4gICAgICAgIHRkLmRpdG8tdGFibGVfX2J1dHRvbnMoOmNvbHNwYW49XCJudW1Db2x1bW5zXCIpXG4gICAgICAgICAgRGl0b0VkaXRCdXR0b25zKFxuICAgICAgICAgICAgOmJ1dHRvbnM9XCJidXR0b25TY2hlbWFzXCJcbiAgICAgICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgICAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgICAgICAgICA6Y3JlYXRhYmxlPVwiY3JlYXRhYmxlXCJcbiAgICAgICAgICAgIDpjcmVhdGVQYXRoPVwiY3JlYXRlUGF0aFwiXG4gICAgICAgICAgKVxuICAvLy0gUmVuZGVyIGNyZWF0ZSBidXR0b25zIG91dHNpZGUgdGFibGUgd2hlbiBpbiBhIHNpbmdsZSBjb21wb25lbnQgdmlldzpcbiAgRGl0b0VkaXRCdXR0b25zLmRpdG8tYnV0dG9ucy0tbGFyZ2UuZGl0by1idXR0b25zLS1tYWluLmRpdG8tYnV0dG9ucy0tc3RpY2t5KFxuICAgIHYtaWY9XCJoYXNMaXN0QnV0dG9ucyAmJiBzaW5nbGVcIlxuICAgIDpidXR0b25zPVwiYnV0dG9uU2NoZW1hc1wiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwibGlzdERhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgOmNyZWF0YWJsZT1cImNyZWF0YWJsZVwiXG4gICAgOmNyZWF0ZVBhdGg9XCJjcmVhdGVQYXRoXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBTb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvU291cmNlTWl4aW4uanMnXG5pbXBvcnQgU29ydGFibGVNaXhpbiBmcm9tICcuLi9taXhpbnMvU29ydGFibGVNaXhpbi5qcydcbmltcG9ydCB7XG4gIGdldFZpZXdFZGl0UGF0aCxcbiAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudCxcbiAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHNcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgY3JlYXRlRmlsdGVyc1BhbmVsIH0gZnJvbSAnLi4vdXRpbHMvZmlsdGVyLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgcGlja0J5LCBlcXVhbHMsIGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdsaXN0Jywge1xuICBtaXhpbnM6IFtTb3VyY2VNaXhpbiwgU29ydGFibGVNaXhpbl0sXG5cbiAgZ2V0U291cmNlVHlwZSh0eXBlKSB7XG4gICAgLy8gTm8gbmVlZCBmb3IgdHJhbnNmb3JtYXRpb24gaGVyZS4gU2VlIFR5cGVUcmVlTGlzdCBmb3IgZGV0YWlscy5cbiAgICByZXR1cm4gdHlwZVxuICB9LFxuXG4gIGdldFBhbmVsU2NoZW1hKGFwaSwgc2NoZW1hLCBkYXRhUGF0aCwgY29tcG9uZW50KSB7XG4gICAgY29uc3QgeyBmaWx0ZXJzIH0gPSBzY2hlbWFcbiAgICAvLyBTZWUgaWYgdGhpcyBsaXN0IGNvbXBvbmVudCB3YW50cyB0byBkaXNwbGF5IGEgZmlsdGVyIHBhbmVsLCBhbmQgaWYgc28sXG4gICAgLy8gY3JlYXRlIHRoZSBwYW5lbCBzY2hlbWEgZm9yIGl0IHRocm91Z2ggYGdldEZpbHRlcnNQYW5lbCgpYC5cbiAgICBpZiAoZmlsdGVycykge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZpbHRlcnNQYW5lbChcbiAgICAgICAgYXBpLFxuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgLy8gUGFzcyBhIGNvbXB1dGVkIHZhbHVlIHRvIGdldCAvIHNldCB0aGUgcXVlcnksIHNlZSBnZXRGaWx0ZXJzUGFuZWwoKVxuICAgICAgICBjb21wdXRlZCh7XG4gICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5xdWVyeVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBzZXQocXVlcnkpIHtcbiAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlcyBmb3IgY29tcGFyaW5nIHdpdGggZXF1YWxzKClcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IG9iaiA9PiBwaWNrQnkob2JqLCB2YWx1ZSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgaWYgKCFlcXVhbHMoZmlsdGVyKHF1ZXJ5KSwgZmlsdGVyKGNvbXBvbmVudC5xdWVyeSkpKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5xdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5sb2FkRGF0YShmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaGFzUGFnaW5hdGlvbigpIHtcbiAgICAgIHJldHVybiAhIXRoaXMucGFnaW5hdGVcbiAgICB9LFxuXG4gICAgaGFzTGlzdEJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gISEodGhpcy5idXR0b25TY2hlbWFzIHx8IHRoaXMuY3JlYXRhYmxlKVxuICAgIH0sXG5cbiAgICBoYXNFZGl0QnV0dG9ucygpIHtcbiAgICAgIGNvbnN0IHsgbGlzdERhdGEgfSA9IHRoaXNcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGxpc3REYXRhLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIHRoaXMuZWRpdGFibGUgfHxcbiAgICAgICAgICB0aGlzLmRlbGV0YWJsZSB8fFxuICAgICAgICAgIHRoaXMuZHJhZ2dhYmxlXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaGFzQ2VsbEVkaXRCdXR0b25zKCkge1xuICAgICAgcmV0dXJuICF0aGlzLmlzSW5saW5lZCAmJiB0aGlzLmhhc0VkaXRCdXR0b25zXG4gICAgfSxcblxuICAgIGhhc0V2ZW5Db3VudCgpIHtcbiAgICAgIHJldHVybiAhKHRoaXMubGlzdERhdGEubGVuZ3RoICUgMilcbiAgICB9LFxuXG4gICAgbnVtQ29sdW1ucygpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLmNvbHVtbnMgPyBPYmplY3Qua2V5cyh0aGlzLmNvbHVtbnMpLmxlbmd0aCA6IDEpICtcbiAgICAgICAgKHRoaXMuaGFzQ2VsbEVkaXRCdXR0b25zID8gMSA6IDApXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXREYXRhUGF0aChpbmRleCkge1xuICAgICAgcmV0dXJuIGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIGluZGV4KVxuICAgIH0sXG5cbiAgICBnZXRFZGl0UGF0aChpdGVtLCBpbmRleCkge1xuICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldEl0ZW1JZCh0aGlzLnNjaGVtYSwgaXRlbSwgaW5kZXgpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgZ2V0Vmlld0VkaXRQYXRoKHRoaXMuc2NoZW1hLCBpZCwgdGhpcy5jb250ZXh0KSB8fFxuICAgICAgICAgIGAke3RoaXMucGF0aH0vJHtpZH1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIGdldENlbGxDbGFzcyhjb2x1bW4pIHtcbiAgICAgIHJldHVybiBgZGl0by1jZWxsLS0ke2h5cGhlbmF0ZShjb2x1bW4ubmFtZSl9YFxuICAgIH0sXG5cbiAgICBnZXRDb250ZXh0KGl0ZW0sIGluZGV4KSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgIGluZGV4LFxuICAgICAgICBkYXRhUGF0aDogdGhpcy5nZXREYXRhUGF0aChpbmRleClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uRmlsdGVyRXJyb3JzKGVycm9ycykge1xuICAgICAgY29uc3QgZmlsdGVyc0RhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgJyRmaWx0ZXJzJylcbiAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5zY2hlbWFDb21wb25lbnQuZ2V0UGFuZWxCeURhdGFQYXRoKGZpbHRlcnNEYXRhUGF0aClcbiAgICAgIGlmIChwYW5lbCkge1xuICAgICAgICBwYW5lbC5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIHRydWUpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBuYW1lLFxuICAgIHJvdXRlcyxcbiAgICBsZXZlbCxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgcHJvY2VzcyA9IG51bGxcbiAgKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudChzY2hlbWEpLFxuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLmNvbHVtbnMpLFxuICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgYXBpLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgZmxhdHRlbixcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgKVxuICAgIF0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1saXN0IHtcbiAgJHNlbGY6ICY7XG5cbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICZfX2hlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgcGFkZGluZy1ib3R0b206ICRjb250ZW50LXBhZGRpbmctaGFsZjtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgICY6ZW1wdHkge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG5cbiAgICAuZGl0by1zY29wZXMsXG4gICAgLmRpdG8tcGFnaW5hdGlvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleDogMCAxIGF1dG87XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgfVxuICB9XG5cbiAgJi5kaXRvLWNvbXBvbmVudC0tc2luZ2xlIHtcbiAgICAvLyBTbyB0aGF0IGxpc3QgYnV0dG9ucyBjYW4gYmUgc3RpY2t5IHRvIHRoZSBib3R0b206XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbi1jb250ZW50O1xuICAgIGhlaWdodDogMTAwJTtcblxuICAgIC8vIE1ha2Ugc2luZ2xlIGxpc3QgaGVhZGVyLCBuYXZpZ2F0aW9uIGFuZCBidXR0b25zIHN0aWNreSB0byB0aGUgdG9wIGFuZFxuICAgIC8vIGJvdHRvbTpcbiAgICAjeyRzZWxmfV9faGVhZGVyIHtcbiAgICAgIHBvc2l0aW9uOiBzdGlja3k7XG4gICAgICB0b3A6IDA7XG4gICAgICBtYXJnaW4tdG9wOiAtJGNvbnRlbnQtcGFkZGluZztcbiAgICAgIHBhZGRpbmctdG9wOiAkY29udGVudC1wYWRkaW5nO1xuICAgICAgYmFja2dyb3VuZDogJGNvbnRlbnQtY29sb3ItYmFja2dyb3VuZDtcbiAgICAgIHotaW5kZXg6IDE7XG5cbiAgICAgICsgLmRpdG8tdGFibGUge1xuICAgICAgICAuZGl0by10YWJsZS1oZWFkIHtcbiAgICAgICAgICBwb3NpdGlvbjogc3RpY2t5O1xuICAgICAgICAgIHRvcDogY2FsYygkaW5wdXQtaGVpZ2h0ICsgJGNvbnRlbnQtcGFkZGluZyArICRjb250ZW50LXBhZGRpbmctaGFsZik7XG4gICAgICAgICAgYmFja2dyb3VuZDogJGNvbnRlbnQtY29sb3ItYmFja2dyb3VuZDtcbiAgICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9MYWJlbC5kaXRvLWxhYmVsLWNvbXBvbmVudChcbiAgOmxhYmVsPVwidmFsdWVcIlxuICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2xhYmVsJywge1xuICBleGNsdWRlVmFsdWU6IHRydWUsXG4gIGdlbmVyYXRlTGFiZWw6IGZhbHNlXG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tbGFiZWwtY29tcG9uZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgaGVpZ2h0OiAyZW07XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IE9yZGVyZWRNYXAgZnJvbSAnb3JkZXJlZG1hcCc7XG5cbmZ1bmN0aW9uIGZpbmREaWZmU3RhcnQoYSwgYiwgcG9zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT0gYS5jaGlsZENvdW50IHx8IGkgPT0gYi5jaGlsZENvdW50KVxuICAgICAgICAgICAgcmV0dXJuIGEuY2hpbGRDb3VudCA9PSBiLmNoaWxkQ291bnQgPyBudWxsIDogcG9zO1xuICAgICAgICBsZXQgY2hpbGRBID0gYS5jaGlsZChpKSwgY2hpbGRCID0gYi5jaGlsZChpKTtcbiAgICAgICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgICAgICAgIHBvcyArPSBjaGlsZEEubm9kZVNpemU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoaWxkQS5zYW1lTWFya3VwKGNoaWxkQikpXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICBpZiAoY2hpbGRBLmlzVGV4dCAmJiBjaGlsZEEudGV4dCAhPSBjaGlsZEIudGV4dCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGNoaWxkQS50ZXh0W2pdID09IGNoaWxkQi50ZXh0W2pdOyBqKyspXG4gICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZEEuY29udGVudC5zaXplIHx8IGNoaWxkQi5jb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBpbm5lciA9IGZpbmREaWZmU3RhcnQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwb3MgKyAxKTtcbiAgICAgICAgICAgIGlmIChpbm5lciAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBwb3MgKz0gY2hpbGRBLm5vZGVTaXplO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmREaWZmRW5kKGEsIGIsIHBvc0EsIHBvc0IpIHtcbiAgICBmb3IgKGxldCBpQSA9IGEuY2hpbGRDb3VudCwgaUIgPSBiLmNoaWxkQ291bnQ7Oykge1xuICAgICAgICBpZiAoaUEgPT0gMCB8fCBpQiA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGlBID09IGlCID8gbnVsbCA6IHsgYTogcG9zQSwgYjogcG9zQiB9O1xuICAgICAgICBsZXQgY2hpbGRBID0gYS5jaGlsZCgtLWlBKSwgY2hpbGRCID0gYi5jaGlsZCgtLWlCKSwgc2l6ZSA9IGNoaWxkQS5ub2RlU2l6ZTtcbiAgICAgICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgICAgICAgIHBvc0EgLT0gc2l6ZTtcbiAgICAgICAgICAgIHBvc0IgLT0gc2l6ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hpbGRBLnNhbWVNYXJrdXAoY2hpbGRCKSlcbiAgICAgICAgICAgIHJldHVybiB7IGE6IHBvc0EsIGI6IHBvc0IgfTtcbiAgICAgICAgaWYgKGNoaWxkQS5pc1RleHQgJiYgY2hpbGRBLnRleHQgIT0gY2hpbGRCLnRleHQpIHtcbiAgICAgICAgICAgIGxldCBzYW1lID0gMCwgbWluU2l6ZSA9IE1hdGgubWluKGNoaWxkQS50ZXh0Lmxlbmd0aCwgY2hpbGRCLnRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIHdoaWxlIChzYW1lIDwgbWluU2l6ZSAmJiBjaGlsZEEudGV4dFtjaGlsZEEudGV4dC5sZW5ndGggLSBzYW1lIC0gMV0gPT0gY2hpbGRCLnRleHRbY2hpbGRCLnRleHQubGVuZ3RoIC0gc2FtZSAtIDFdKSB7XG4gICAgICAgICAgICAgICAgc2FtZSsrO1xuICAgICAgICAgICAgICAgIHBvc0EtLTtcbiAgICAgICAgICAgICAgICBwb3NCLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBhOiBwb3NBLCBiOiBwb3NCIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkQS5jb250ZW50LnNpemUgfHwgY2hpbGRCLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gZmluZERpZmZFbmQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwb3NBIC0gMSwgcG9zQiAtIDEpO1xuICAgICAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBwb3NBIC09IHNpemU7XG4gICAgICAgIHBvc0IgLT0gc2l6ZTtcbiAgICB9XG59XG5cbi8qKlxuQSBmcmFnbWVudCByZXByZXNlbnRzIGEgbm9kZSdzIGNvbGxlY3Rpb24gb2YgY2hpbGQgbm9kZXMuXG5cbkxpa2Ugbm9kZXMsIGZyYWdtZW50cyBhcmUgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMsIGFuZCB5b3VcbnNob3VsZCBub3QgbXV0YXRlIHRoZW0gb3IgdGhlaXIgY29udGVudC4gUmF0aGVyLCB5b3UgY3JlYXRlIG5ld1xuaW5zdGFuY2VzIHdoZW5ldmVyIG5lZWRlZC4gVGhlIEFQSSB0cmllcyB0byBtYWtlIHRoaXMgZWFzeS5cbiovXG5jbGFzcyBGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgY2hpbGQgbm9kZXMgaW4gdGhpcyBmcmFnbWVudC5cbiAgICAqL1xuICAgIGNvbnRlbnQsIHNpemUpIHtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZSB8fCAwO1xuICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSArPSBjb250ZW50W2ldLm5vZGVTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBJbnZva2UgYSBjYWxsYmFjayBmb3IgYWxsIGRlc2NlbmRhbnQgbm9kZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdHdvXG4gICAgcG9zaXRpb25zIChyZWxhdGl2ZSB0byBzdGFydCBvZiB0aGlzIGZyYWdtZW50KS4gRG9lc24ndCBkZXNjZW5kXG4gICAgaW50byBhIG5vZGUgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBgZmFsc2VgLlxuICAgICovXG4gICAgbm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmLCBub2RlU3RhcnQgPSAwLCBwYXJlbnQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IHBvcyA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY29udGVudFtpXSwgZW5kID0gcG9zICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoZW5kID4gZnJvbSAmJiBmKGNoaWxkLCBub2RlU3RhcnQgKyBwb3MsIHBhcmVudCB8fCBudWxsLCBpKSAhPT0gZmFsc2UgJiYgY2hpbGQuY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcG9zICsgMTtcbiAgICAgICAgICAgICAgICBjaGlsZC5ub2Rlc0JldHdlZW4oTWF0aC5tYXgoMCwgZnJvbSAtIHN0YXJ0KSwgTWF0aC5taW4oY2hpbGQuY29udGVudC5zaXplLCB0byAtIHN0YXJ0KSwgZiwgbm9kZVN0YXJ0ICsgc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENhbGwgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBldmVyeSBkZXNjZW5kYW50IG5vZGUuIGBwb3NgIHdpbGwgYmVcbiAgICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZyYWdtZW50LiBUaGUgY2FsbGJhY2sgbWF5IHJldHVyblxuICAgIGBmYWxzZWAgdG8gcHJldmVudCB0cmF2ZXJzYWwgb2YgYSBnaXZlbiBub2RlJ3MgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBkZXNjZW5kYW50cyhmKSB7XG4gICAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKDAsIHRoaXMuc2l6ZSwgZik7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dHJhY3QgdGhlIHRleHQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuIFNlZSB0aGUgc2FtZSBtZXRob2Qgb25cbiAgICBbYE5vZGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS50ZXh0QmV0d2VlbikuXG4gICAgKi9cbiAgICB0ZXh0QmV0d2Vlbihmcm9tLCB0bywgYmxvY2tTZXBhcmF0b3IsIGxlYWZUZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIiwgZmlyc3QgPSB0cnVlO1xuICAgICAgICB0aGlzLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgbGV0IG5vZGVUZXh0ID0gbm9kZS5pc1RleHQgPyBub2RlLnRleHQuc2xpY2UoTWF0aC5tYXgoZnJvbSwgcG9zKSAtIHBvcywgdG8gLSBwb3MpXG4gICAgICAgICAgICAgICAgOiAhbm9kZS5pc0xlYWYgPyBcIlwiXG4gICAgICAgICAgICAgICAgICAgIDogbGVhZlRleHQgPyAodHlwZW9mIGxlYWZUZXh0ID09PSBcImZ1bmN0aW9uXCIgPyBsZWFmVGV4dChub2RlKSA6IGxlYWZUZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBub2RlLnR5cGUuc3BlYy5sZWFmVGV4dCA/IG5vZGUudHlwZS5zcGVjLmxlYWZUZXh0KG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNCbG9jayAmJiAobm9kZS5pc0xlYWYgJiYgbm9kZVRleHQgfHwgbm9kZS5pc1RleHRibG9jaykgJiYgYmxvY2tTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IGJsb2NrU2VwYXJhdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGV4dCArPSBub2RlVGV4dDtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgY29tYmluZWQgY29udGVudCBvZiB0aGlzXG4gICAgZnJhZ21lbnQgYW5kIHRoZSBvdGhlci5cbiAgICAqL1xuICAgIGFwcGVuZChvdGhlcikge1xuICAgICAgICBpZiAoIW90aGVyLnNpemUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLnNpemUpXG4gICAgICAgICAgICByZXR1cm4gb3RoZXI7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5sYXN0Q2hpbGQsIGZpcnN0ID0gb3RoZXIuZmlyc3RDaGlsZCwgY29udGVudCA9IHRoaXMuY29udGVudC5zbGljZSgpLCBpID0gMDtcbiAgICAgICAgaWYgKGxhc3QuaXNUZXh0ICYmIGxhc3Quc2FtZU1hcmt1cChmaXJzdCkpIHtcbiAgICAgICAgICAgIGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSA9IGxhc3Qud2l0aFRleHQobGFzdC50ZXh0ICsgZmlyc3QudGV4dCk7XG4gICAgICAgICAgICBpID0gMTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgaSA8IG90aGVyLmNvbnRlbnQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBjb250ZW50LnB1c2gob3RoZXIuY29udGVudFtpXSk7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29udGVudCwgdGhpcy5zaXplICsgb3RoZXIuc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEN1dCBvdXQgdGhlIHN1Yi1mcmFnbWVudCBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gcG9zaXRpb25zLlxuICAgICovXG4gICAgY3V0KGZyb20sIHRvID0gdGhpcy5zaXplKSB7XG4gICAgICAgIGlmIChmcm9tID09IDAgJiYgdG8gPT0gdGhpcy5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXSwgc2l6ZSA9IDA7XG4gICAgICAgIGlmICh0byA+IGZyb20pXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgcG9zIDwgdG87IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY29udGVudFtpXSwgZW5kID0gcG9zICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgICAgICAgICAgaWYgKGVuZCA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IGZyb20gfHwgZW5kID4gdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc1RleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5jdXQoTWF0aC5tYXgoMCwgZnJvbSAtIHBvcyksIE1hdGgubWluKGNoaWxkLnRleHQubGVuZ3RoLCB0byAtIHBvcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY3V0KE1hdGgubWF4KDAsIGZyb20gLSBwb3MgLSAxKSwgTWF0aC5taW4oY2hpbGQuY29udGVudC5zaXplLCB0byAtIHBvcyAtIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIHNpemUgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudChyZXN1bHQsIHNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGN1dEJ5SW5kZXgoZnJvbSwgdG8pIHtcbiAgICAgICAgaWYgKGZyb20gPT0gdG8pXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGlmIChmcm9tID09IDAgJiYgdG8gPT0gdGhpcy5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KHRoaXMuY29udGVudC5zbGljZShmcm9tLCB0bykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgZnJhZ21lbnQgaW4gd2hpY2ggdGhlIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4IGlzXG4gICAgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIG5vZGUuXG4gICAgKi9cbiAgICByZXBsYWNlQ2hpbGQoaW5kZXgsIG5vZGUpIHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmNvbnRlbnRbaW5kZXhdO1xuICAgICAgICBpZiAoY3VycmVudCA9PSBub2RlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGxldCBjb3B5ID0gdGhpcy5jb250ZW50LnNsaWNlKCk7XG4gICAgICAgIGxldCBzaXplID0gdGhpcy5zaXplICsgbm9kZS5ub2RlU2l6ZSAtIGN1cnJlbnQubm9kZVNpemU7XG4gICAgICAgIGNvcHlbaW5kZXhdID0gbm9kZTtcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudChjb3B5LCBzaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGJ5IHByZXBlbmRpbmcgdGhlIGdpdmVuIG5vZGUgdG8gdGhpc1xuICAgIGZyYWdtZW50LlxuICAgICovXG4gICAgYWRkVG9TdGFydChub2RlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoW25vZGVdLmNvbmNhdCh0aGlzLmNvbnRlbnQpLCB0aGlzLnNpemUgKyBub2RlLm5vZGVTaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGJ5IGFwcGVuZGluZyB0aGUgZ2l2ZW4gbm9kZSB0byB0aGlzXG4gICAgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBhZGRUb0VuZChub2RlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQodGhpcy5jb250ZW50LmNvbmNhdChub2RlKSwgdGhpcy5zaXplICsgbm9kZS5ub2RlU2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBmcmFnbWVudCB0byBhbm90aGVyIG9uZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoICE9IG90aGVyLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50W2ldLmVxKG90aGVyLmNvbnRlbnRbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgZnJhZ21lbnQsIG9yIGBudWxsYCBpZiBpdCBpcyBlbXB0eS5cbiAgICAqL1xuICAgIGdldCBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCA/IHRoaXMuY29udGVudFswXSA6IG51bGw7IH1cbiAgICAvKipcbiAgICBUaGUgbGFzdCBjaGlsZCBvZiB0aGUgZnJhZ21lbnQsIG9yIGBudWxsYCBpZiBpdCBpcyBlbXB0eS5cbiAgICAqL1xuICAgIGdldCBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID8gdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXSA6IG51bGw7IH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIGNoaWxkIG5vZGVzIGluIHRoaXMgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBnZXQgY2hpbGRDb3VudCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNoaWxkIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LiBSYWlzZSBhbiBlcnJvciB3aGVuIHRoZVxuICAgIGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiAgICAqL1xuICAgIGNoaWxkKGluZGV4KSB7XG4gICAgICAgIGxldCBmb3VuZCA9IHRoaXMuY29udGVudFtpbmRleF07XG4gICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IFwiICsgaW5kZXggKyBcIiBvdXQgb2YgcmFuZ2UgZm9yIFwiICsgdGhpcyk7XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCwgaWYgaXQgZXhpc3RzLlxuICAgICovXG4gICAgbWF5YmVDaGlsZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50W2luZGV4XSB8fCBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBDYWxsIGBmYCBmb3IgZXZlcnkgY2hpbGQgbm9kZSwgcGFzc2luZyB0aGUgbm9kZSwgaXRzIG9mZnNldFxuICAgIGludG8gdGhpcyBwYXJlbnQgbm9kZSwgYW5kIGl0cyBpbmRleC5cbiAgICAqL1xuICAgIGZvckVhY2goZikge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcCA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY29udGVudFtpXTtcbiAgICAgICAgICAgIGYoY2hpbGQsIHAsIGkpO1xuICAgICAgICAgICAgcCArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBmaXJzdCBwb3NpdGlvbiBhdCB3aGljaCB0aGlzIGZyYWdtZW50IGFuZCBhbm90aGVyXG4gICAgZnJhZ21lbnQgZGlmZmVyLCBvciBgbnVsbGAgaWYgdGhleSBhcmUgdGhlIHNhbWUuXG4gICAgKi9cbiAgICBmaW5kRGlmZlN0YXJ0KG90aGVyLCBwb3MgPSAwKSB7XG4gICAgICAgIHJldHVybiBmaW5kRGlmZlN0YXJ0KHRoaXMsIG90aGVyLCBwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBmaXJzdCBwb3NpdGlvbiwgc2VhcmNoaW5nIGZyb20gdGhlIGVuZCwgYXQgd2hpY2ggdGhpc1xuICAgIGZyYWdtZW50IGFuZCB0aGUgZ2l2ZW4gZnJhZ21lbnQgZGlmZmVyLCBvciBgbnVsbGAgaWYgdGhleSBhcmVcbiAgICB0aGUgc2FtZS4gU2luY2UgdGhpcyBwb3NpdGlvbiB3aWxsIG5vdCBiZSB0aGUgc2FtZSBpbiBib3RoXG4gICAgbm9kZXMsIGFuIG9iamVjdCB3aXRoIHR3byBzZXBhcmF0ZSBwb3NpdGlvbnMgaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICBmaW5kRGlmZkVuZChvdGhlciwgcG9zID0gdGhpcy5zaXplLCBvdGhlclBvcyA9IG90aGVyLnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZpbmREaWZmRW5kKHRoaXMsIG90aGVyLCBwb3MsIG90aGVyUG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgaW5kZXggYW5kIGlubmVyIG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gcmVsYXRpdmVcbiAgICBwb3NpdGlvbiBpbiB0aGlzIGZyYWdtZW50LiBUaGUgcmVzdWx0IG9iamVjdCB3aWxsIGJlIHJldXNlZFxuICAgIChvdmVyd3JpdHRlbikgdGhlIG5leHQgdGltZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbmRJbmRleChwb3MpIHtcbiAgICAgICAgaWYgKHBvcyA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldEluZGV4KDAsIHBvcyk7XG4gICAgICAgIGlmIChwb3MgPT0gdGhpcy5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHJldEluZGV4KHRoaXMuY29udGVudC5sZW5ndGgsIHBvcyk7XG4gICAgICAgIGlmIChwb3MgPiB0aGlzLnNpemUgfHwgcG9zIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBQb3NpdGlvbiAke3Bvc30gb3V0c2lkZSBvZiBmcmFnbWVudCAoJHt0aGlzfSlgKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGN1clBvcyA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSB0aGlzLmNoaWxkKGkpLCBlbmQgPSBjdXJQb3MgKyBjdXIubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoZW5kID49IHBvcykge1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gcG9zKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgoaSArIDEsIGVuZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldEluZGV4KGksIGN1clBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJQb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgZGVidWdnaW5nIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGlzIGZyYWdtZW50LlxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBcIjxcIiArIHRoaXMudG9TdHJpbmdJbm5lcigpICsgXCI+XCI7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nSW5uZXIoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuam9pbihcIiwgXCIpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZnJhZ21lbnQuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID8gdGhpcy5jb250ZW50Lm1hcChuID0+IG4udG9KU09OKCkpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBmcmFnbWVudCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgRnJhZ21lbnQuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQodmFsdWUubWFwKHNjaGVtYS5ub2RlRnJvbUpTT04pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSBmcmFnbWVudCBmcm9tIGFuIGFycmF5IG9mIG5vZGVzLiBFbnN1cmVzIHRoYXQgYWRqYWNlbnRcbiAgICB0ZXh0IG5vZGVzIHdpdGggdGhlIHNhbWUgbWFya3MgYXJlIGpvaW5lZCB0b2dldGhlci5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tQXJyYXkoYXJyYXkpIHtcbiAgICAgICAgaWYgKCFhcnJheS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGxldCBqb2luZWQsIHNpemUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IGFycmF5W2ldO1xuICAgICAgICAgICAgc2l6ZSArPSBub2RlLm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKGkgJiYgbm9kZS5pc1RleHQgJiYgYXJyYXlbaSAtIDFdLnNhbWVNYXJrdXAobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWpvaW5lZClcbiAgICAgICAgICAgICAgICAgICAgam9pbmVkID0gYXJyYXkuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgam9pbmVkW2pvaW5lZC5sZW5ndGggLSAxXSA9IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUZXh0KGpvaW5lZFtqb2luZWQubGVuZ3RoIC0gMV0udGV4dCArIG5vZGUudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChqb2luZWQpIHtcbiAgICAgICAgICAgICAgICBqb2luZWQucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KGpvaW5lZCB8fCBhcnJheSwgc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGZyYWdtZW50IGZyb20gc29tZXRoaW5nIHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIGFcbiAgICBzZXQgb2Ygbm9kZXMuIEZvciBgbnVsbGAsIGl0IHJldHVybnMgdGhlIGVtcHR5IGZyYWdtZW50LiBGb3IgYVxuICAgIGZyYWdtZW50LCB0aGUgZnJhZ21lbnQgaXRzZWxmLiBGb3IgYSBub2RlIG9yIGFycmF5IG9mIG5vZGVzLCBhXG4gICAgZnJhZ21lbnQgY29udGFpbmluZyB0aG9zZSBub2Rlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tKG5vZGVzKSB7XG4gICAgICAgIGlmICghbm9kZXMpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGlmIChub2RlcyBpbnN0YW5jZW9mIEZyYWdtZW50KVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mcm9tQXJyYXkobm9kZXMpO1xuICAgICAgICBpZiAobm9kZXMuYXR0cnMpXG4gICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KFtub2Rlc10sIG5vZGVzLm5vZGVTaXplKTtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4gbm90IGNvbnZlcnQgXCIgKyBub2RlcyArIFwiIHRvIGEgRnJhZ21lbnRcIiArXG4gICAgICAgICAgICAobm9kZXMubm9kZXNCZXR3ZWVuID8gXCIgKGxvb2tzIGxpa2UgbXVsdGlwbGUgdmVyc2lvbnMgb2YgcHJvc2VtaXJyb3ItbW9kZWwgd2VyZSBsb2FkZWQpXCIgOiBcIlwiKSk7XG4gICAgfVxufVxuLyoqXG5BbiBlbXB0eSBmcmFnbWVudC4gSW50ZW5kZWQgdG8gYmUgcmV1c2VkIHdoZW5ldmVyIGEgbm9kZSBkb2Vzbid0XG5jb250YWluIGFueXRoaW5nIChyYXRoZXIgdGhhbiBhbGxvY2F0aW5nIGEgbmV3IGVtcHR5IGZyYWdtZW50IGZvclxuZWFjaCBsZWFmIG5vZGUpLlxuKi9cbkZyYWdtZW50LmVtcHR5ID0gbmV3IEZyYWdtZW50KFtdLCAwKTtcbmNvbnN0IGZvdW5kID0geyBpbmRleDogMCwgb2Zmc2V0OiAwIH07XG5mdW5jdGlvbiByZXRJbmRleChpbmRleCwgb2Zmc2V0KSB7XG4gICAgZm91bmQuaW5kZXggPSBpbmRleDtcbiAgICBmb3VuZC5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlRGVlcChhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghKGEgJiYgdHlwZW9mIGEgPT0gXCJvYmplY3RcIikgfHxcbiAgICAgICAgIShiICYmIHR5cGVvZiBiID09IFwib2JqZWN0XCIpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGFycmF5ID0gQXJyYXkuaXNBcnJheShhKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShiKSAhPSBhcnJheSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghY29tcGFyZURlZXAoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgcCBpbiBhKVxuICAgICAgICAgICAgaWYgKCEocCBpbiBiKSB8fCAhY29tcGFyZURlZXAoYVtwXSwgYltwXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBwIGluIGIpXG4gICAgICAgICAgICBpZiAoIShwIGluIGEpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuQSBtYXJrIGlzIGEgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBub2RlLFxuc3VjaCBhcyBpdCBiZWluZyBlbXBoYXNpemVkLCBpbiBjb2RlIGZvbnQsIG9yIGEgbGluay4gSXQgaGFzIGFcbnR5cGUgYW5kIG9wdGlvbmFsbHkgYSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgZnVydGhlclxuaW5mb3JtYXRpb24gKHN1Y2ggYXMgdGhlIHRhcmdldCBvZiB0aGUgbGluaykuIE1hcmtzIGFyZSBjcmVhdGVkXG50aHJvdWdoIGEgYFNjaGVtYWAsIHdoaWNoIGNvbnRyb2xzIHdoaWNoIHR5cGVzIGV4aXN0IGFuZCB3aGljaFxuYXR0cmlidXRlcyB0aGV5IGhhdmUuXG4qL1xuY2xhc3MgTWFyayB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgdHlwZSBvZiB0aGlzIG1hcmsuXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBUaGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYXJrLlxuICAgICovXG4gICAgYXR0cnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgIH1cbiAgICAvKipcbiAgICBHaXZlbiBhIHNldCBvZiBtYXJrcywgY3JlYXRlIGEgbmV3IHNldCB3aGljaCBjb250YWlucyB0aGlzIG9uZSBhc1xuICAgIHdlbGwsIGluIHRoZSByaWdodCBwb3NpdGlvbi4gSWYgdGhpcyBtYXJrIGlzIGFscmVhZHkgaW4gdGhlIHNldCxcbiAgICB0aGUgc2V0IGl0c2VsZiBpcyByZXR1cm5lZC4gSWYgYW55IG1hcmtzIHRoYXQgYXJlIHNldCB0byBiZVxuICAgIFtleGNsdXNpdmVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrU3BlYy5leGNsdWRlcykgd2l0aCB0aGlzIG1hcmsgYXJlIHByZXNlbnQsXG4gICAgdGhvc2UgYXJlIHJlcGxhY2VkIGJ5IHRoaXMgb25lLlxuICAgICovXG4gICAgYWRkVG9TZXQoc2V0KSB7XG4gICAgICAgIGxldCBjb3B5LCBwbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvdGhlciA9IHNldFtpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKG90aGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZS5leGNsdWRlcyhvdGhlci50eXBlKSkge1xuICAgICAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICAgICAgY29weSA9IHNldC5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG90aGVyLnR5cGUuZXhjbHVkZXModGhpcy50eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBsYWNlZCAmJiBvdGhlci50eXBlLnJhbmsgPiB0aGlzLnR5cGUucmFuaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcHkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gc2V0LnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICAgICAgICBjb3B5LnB1c2godGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb3B5KVxuICAgICAgICAgICAgICAgICAgICBjb3B5LnB1c2gob3RoZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgIGNvcHkgPSBzZXQuc2xpY2UoKTtcbiAgICAgICAgaWYgKCFwbGFjZWQpXG4gICAgICAgICAgICBjb3B5LnB1c2godGhpcyk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmUgdGhpcyBtYXJrIGZyb20gdGhlIGdpdmVuIHNldCwgcmV0dXJuaW5nIGEgbmV3IHNldC4gSWYgdGhpc1xuICAgIG1hcmsgaXMgbm90IGluIHRoZSBzZXQsIHRoZSBzZXQgaXRzZWxmIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgcmVtb3ZlRnJvbVNldChzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAodGhpcy5lcShzZXRbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhpcyBtYXJrIGlzIGluIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MuXG4gICAgKi9cbiAgICBpc0luU2V0KHNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKHNldFtpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoaXMgbWFyayBoYXMgdGhlIHNhbWUgdHlwZSBhbmQgYXR0cmlidXRlcyBhc1xuICAgIGFub3RoZXIgbWFyay5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAodGhpcy50eXBlID09IG90aGVyLnR5cGUgJiYgY29tcGFyZURlZXAodGhpcy5hdHRycywgb3RoZXIuYXR0cnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIG1hcmsgdG8gYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBvYmogPSB7IHR5cGU6IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICAgIGZvciAobGV0IF8gaW4gdGhpcy5hdHRycykge1xuICAgICAgICAgICAgb2JqLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbWFyayBmcm9tIEpTT04uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgTWFyay5mcm9tSlNPTlwiKTtcbiAgICAgICAgbGV0IHR5cGUgPSBzY2hlbWEubWFya3NbanNvbi50eXBlXTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZXJlIGlzIG5vIG1hcmsgdHlwZSAke2pzb24udHlwZX0gaW4gdGhpcyBzY2hlbWFgKTtcbiAgICAgICAgbGV0IG1hcmsgPSB0eXBlLmNyZWF0ZShqc29uLmF0dHJzKTtcbiAgICAgICAgdHlwZS5jaGVja0F0dHJzKG1hcmsuYXR0cnMpO1xuICAgICAgICByZXR1cm4gbWFyaztcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHR3byBzZXRzIG9mIG1hcmtzIGFyZSBpZGVudGljYWwuXG4gICAgKi9cbiAgICBzdGF0aWMgc2FtZVNldChhLCBiKSB7XG4gICAgICAgIGlmIChhID09IGIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIWFbaV0uZXEoYltpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcHJvcGVybHkgc29ydGVkIG1hcmsgc2V0IGZyb20gbnVsbCwgYSBzaW5nbGUgbWFyaywgb3IgYW5cbiAgICB1bnNvcnRlZCBhcnJheSBvZiBtYXJrcy5cbiAgICAqL1xuICAgIHN0YXRpYyBzZXRGcm9tKG1hcmtzKSB7XG4gICAgICAgIGlmICghbWFya3MgfHwgQXJyYXkuaXNBcnJheShtYXJrcykgJiYgbWFya3MubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gTWFyay5ub25lO1xuICAgICAgICBpZiAobWFya3MgaW5zdGFuY2VvZiBNYXJrKVxuICAgICAgICAgICAgcmV0dXJuIFttYXJrc107XG4gICAgICAgIGxldCBjb3B5ID0gbWFya3Muc2xpY2UoKTtcbiAgICAgICAgY29weS5zb3J0KChhLCBiKSA9PiBhLnR5cGUucmFuayAtIGIudHlwZS5yYW5rKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxufVxuLyoqXG5UaGUgZW1wdHkgc2V0IG9mIG1hcmtzLlxuKi9cbk1hcmsubm9uZSA9IFtdO1xuXG4vKipcbkVycm9yIHR5cGUgcmFpc2VkIGJ5IFtgTm9kZS5yZXBsYWNlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUucmVwbGFjZSkgd2hlblxuZ2l2ZW4gYW4gaW52YWxpZCByZXBsYWNlbWVudC5cbiovXG5jbGFzcyBSZXBsYWNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKlxuUmVwbGFjZUVycm9yID0gZnVuY3Rpb24odGhpczogYW55LCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgbGV0IGVyciA9IEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSlcbiAgOyhlcnIgYXMgYW55KS5fX3Byb3RvX18gPSBSZXBsYWNlRXJyb3IucHJvdG90eXBlXG4gIHJldHVybiBlcnJcbn0gYXMgYW55XG5cblJlcGxhY2VFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSlcblJlcGxhY2VFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZXBsYWNlRXJyb3JcblJlcGxhY2VFcnJvci5wcm90b3R5cGUubmFtZSA9IFwiUmVwbGFjZUVycm9yXCJcbiovXG4vKipcbkEgc2xpY2UgcmVwcmVzZW50cyBhIHBpZWNlIGN1dCBvdXQgb2YgYSBsYXJnZXIgZG9jdW1lbnQuIEl0XG5zdG9yZXMgbm90IG9ubHkgYSBmcmFnbWVudCwgYnV0IGFsc28gdGhlIGRlcHRoIHVwIHRvIHdoaWNoIG5vZGVzIG9uXG5ib3RoIHNpZGUgYXJlIOKAmG9wZW7igJkgKGN1dCB0aHJvdWdoKS5cbiovXG5jbGFzcyBTbGljZSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2xpY2UuIFdoZW4gc3BlY2lmeWluZyBhIG5vbi16ZXJvIG9wZW4gZGVwdGgsIHlvdSBtdXN0XG4gICAgbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vZGVzIG9mIGF0IGxlYXN0IHRoYXQgZGVwdGggYXQgdGhlXG4gICAgYXBwcm9wcmlhdGUgc2lkZSBvZiB0aGUgZnJhZ21lbnTigJRpLmUuIGlmIHRoZSBmcmFnbWVudCBpcyBhblxuICAgIGVtcHR5IHBhcmFncmFwaCBub2RlLCBgb3BlblN0YXJ0YCBhbmQgYG9wZW5FbmRgIGNhbid0IGJlIGdyZWF0ZXJcbiAgICB0aGFuIDEuXG4gICAgXG4gICAgSXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIGNvbnRlbnQgb2Ygb3BlbiBub2RlcyB0byBjb25mb3JtIHRvXG4gICAgdGhlIHNjaGVtYSdzIGNvbnRlbnQgY29uc3RyYWludHMsIHRob3VnaCBpdCBzaG91bGQgYmUgYSB2YWxpZFxuICAgIHN0YXJ0L2VuZC9taWRkbGUgZm9yIHN1Y2ggYSBub2RlLCBkZXBlbmRpbmcgb24gd2hpY2ggc2lkZXMgYXJlXG4gICAgb3Blbi5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzbGljZSdzIGNvbnRlbnQuXG4gICAgKi9cbiAgICBjb250ZW50LCBcbiAgICAvKipcbiAgICBUaGUgb3BlbiBkZXB0aCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZyYWdtZW50LlxuICAgICovXG4gICAgb3BlblN0YXJ0LCBcbiAgICAvKipcbiAgICBUaGUgb3BlbiBkZXB0aCBhdCB0aGUgZW5kLlxuICAgICovXG4gICAgb3BlbkVuZCkge1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLm9wZW5TdGFydCA9IG9wZW5TdGFydDtcbiAgICAgICAgdGhpcy5vcGVuRW5kID0gb3BlbkVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHNpemUgdGhpcyBzbGljZSB3b3VsZCBhZGQgd2hlbiBpbnNlcnRlZCBpbnRvIGEgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5zaXplIC0gdGhpcy5vcGVuU3RhcnQgLSB0aGlzLm9wZW5FbmQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaW5zZXJ0QXQocG9zLCBmcmFnbWVudCkge1xuICAgICAgICBsZXQgY29udGVudCA9IGluc2VydEludG8odGhpcy5jb250ZW50LCBwb3MgKyB0aGlzLm9wZW5TdGFydCwgZnJhZ21lbnQpO1xuICAgICAgICByZXR1cm4gY29udGVudCAmJiBuZXcgU2xpY2UoY29udGVudCwgdGhpcy5vcGVuU3RhcnQsIHRoaXMub3BlbkVuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVtb3ZlQmV0d2Vlbihmcm9tLCB0bykge1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKHJlbW92ZVJhbmdlKHRoaXMuY29udGVudCwgZnJvbSArIHRoaXMub3BlblN0YXJ0LCB0byArIHRoaXMub3BlblN0YXJ0KSwgdGhpcy5vcGVuU3RhcnQsIHRoaXMub3BlbkVuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3RzIHdoZXRoZXIgdGhpcyBzbGljZSBpcyBlcXVhbCB0byBhbm90aGVyIHNsaWNlLlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5lcShvdGhlci5jb250ZW50KSAmJiB0aGlzLm9wZW5TdGFydCA9PSBvdGhlci5vcGVuU3RhcnQgJiYgdGhpcy5vcGVuRW5kID09IG90aGVyLm9wZW5FbmQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQgKyBcIihcIiArIHRoaXMub3BlblN0YXJ0ICsgXCIsXCIgKyB0aGlzLm9wZW5FbmQgKyBcIilcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCBhIHNsaWNlIHRvIGEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGpzb24gPSB7IGNvbnRlbnQ6IHRoaXMuY29udGVudC50b0pTT04oKSB9O1xuICAgICAgICBpZiAodGhpcy5vcGVuU3RhcnQgPiAwKVxuICAgICAgICAgICAganNvbi5vcGVuU3RhcnQgPSB0aGlzLm9wZW5TdGFydDtcbiAgICAgICAgaWYgKHRoaXMub3BlbkVuZCA+IDApXG4gICAgICAgICAgICBqc29uLm9wZW5FbmQgPSB0aGlzLm9wZW5FbmQ7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIHNsaWNlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHJldHVybiBTbGljZS5lbXB0eTtcbiAgICAgICAgbGV0IG9wZW5TdGFydCA9IGpzb24ub3BlblN0YXJ0IHx8IDAsIG9wZW5FbmQgPSBqc29uLm9wZW5FbmQgfHwgMDtcbiAgICAgICAgaWYgKHR5cGVvZiBvcGVuU3RhcnQgIT0gXCJudW1iZXJcIiB8fCB0eXBlb2Ygb3BlbkVuZCAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBTbGljZS5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTbGljZShGcmFnbWVudC5mcm9tSlNPTihzY2hlbWEsIGpzb24uY29udGVudCksIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNsaWNlIGZyb20gYSBmcmFnbWVudCBieSB0YWtpbmcgdGhlIG1heGltdW0gcG9zc2libGVcbiAgICBvcGVuIHZhbHVlIG9uIGJvdGggc2lkZSBvZiB0aGUgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBzdGF0aWMgbWF4T3BlbihmcmFnbWVudCwgb3Blbklzb2xhdGluZyA9IHRydWUpIHtcbiAgICAgICAgbGV0IG9wZW5TdGFydCA9IDAsIG9wZW5FbmQgPSAwO1xuICAgICAgICBmb3IgKGxldCBuID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsgbiAmJiAhbi5pc0xlYWYgJiYgKG9wZW5Jc29sYXRpbmcgfHwgIW4udHlwZS5zcGVjLmlzb2xhdGluZyk7IG4gPSBuLmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICBvcGVuU3RhcnQrKztcbiAgICAgICAgZm9yIChsZXQgbiA9IGZyYWdtZW50Lmxhc3RDaGlsZDsgbiAmJiAhbi5pc0xlYWYgJiYgKG9wZW5Jc29sYXRpbmcgfHwgIW4udHlwZS5zcGVjLmlzb2xhdGluZyk7IG4gPSBuLmxhc3RDaGlsZClcbiAgICAgICAgICAgIG9wZW5FbmQrKztcbiAgICAgICAgcmV0dXJuIG5ldyBTbGljZShmcmFnbWVudCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICB9XG59XG4vKipcblRoZSBlbXB0eSBzbGljZS5cbiovXG5TbGljZS5lbXB0eSA9IG5ldyBTbGljZShGcmFnbWVudC5lbXB0eSwgMCwgMCk7XG5mdW5jdGlvbiByZW1vdmVSYW5nZShjb250ZW50LCBmcm9tLCB0bykge1xuICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IGNvbnRlbnQuZmluZEluZGV4KGZyb20pLCBjaGlsZCA9IGNvbnRlbnQubWF5YmVDaGlsZChpbmRleCk7XG4gICAgbGV0IHsgaW5kZXg6IGluZGV4VG8sIG9mZnNldDogb2Zmc2V0VG8gfSA9IGNvbnRlbnQuZmluZEluZGV4KHRvKTtcbiAgICBpZiAob2Zmc2V0ID09IGZyb20gfHwgY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgIGlmIChvZmZzZXRUbyAhPSB0byAmJiAhY29udGVudC5jaGlsZChpbmRleFRvKS5pc1RleHQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlJlbW92aW5nIG5vbi1mbGF0IHJhbmdlXCIpO1xuICAgICAgICByZXR1cm4gY29udGVudC5jdXQoMCwgZnJvbSkuYXBwZW5kKGNvbnRlbnQuY3V0KHRvKSk7XG4gICAgfVxuICAgIGlmIChpbmRleCAhPSBpbmRleFRvKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlJlbW92aW5nIG5vbi1mbGF0IHJhbmdlXCIpO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2VDaGlsZChpbmRleCwgY2hpbGQuY29weShyZW1vdmVSYW5nZShjaGlsZC5jb250ZW50LCBmcm9tIC0gb2Zmc2V0IC0gMSwgdG8gLSBvZmZzZXQgLSAxKSkpO1xufVxuZnVuY3Rpb24gaW5zZXJ0SW50byhjb250ZW50LCBkaXN0LCBpbnNlcnQsIHBhcmVudCkge1xuICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IGNvbnRlbnQuZmluZEluZGV4KGRpc3QpLCBjaGlsZCA9IGNvbnRlbnQubWF5YmVDaGlsZChpbmRleCk7XG4gICAgaWYgKG9mZnNldCA9PSBkaXN0IHx8IGNoaWxkLmlzVGV4dCkge1xuICAgICAgICBpZiAocGFyZW50ICYmICFwYXJlbnQuY2FuUmVwbGFjZShpbmRleCwgaW5kZXgsIGluc2VydCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQuY3V0KDAsIGRpc3QpLmFwcGVuZChpbnNlcnQpLmFwcGVuZChjb250ZW50LmN1dChkaXN0KSk7XG4gICAgfVxuICAgIGxldCBpbm5lciA9IGluc2VydEludG8oY2hpbGQuY29udGVudCwgZGlzdCAtIG9mZnNldCAtIDEsIGluc2VydCwgY2hpbGQpO1xuICAgIHJldHVybiBpbm5lciAmJiBjb250ZW50LnJlcGxhY2VDaGlsZChpbmRleCwgY2hpbGQuY29weShpbm5lcikpO1xufVxuZnVuY3Rpb24gcmVwbGFjZSgkZnJvbSwgJHRvLCBzbGljZSkge1xuICAgIGlmIChzbGljZS5vcGVuU3RhcnQgPiAkZnJvbS5kZXB0aClcbiAgICAgICAgdGhyb3cgbmV3IFJlcGxhY2VFcnJvcihcIkluc2VydGVkIGNvbnRlbnQgZGVlcGVyIHRoYW4gaW5zZXJ0aW9uIHBvc2l0aW9uXCIpO1xuICAgIGlmICgkZnJvbS5kZXB0aCAtIHNsaWNlLm9wZW5TdGFydCAhPSAkdG8uZGVwdGggLSBzbGljZS5vcGVuRW5kKVxuICAgICAgICB0aHJvdyBuZXcgUmVwbGFjZUVycm9yKFwiSW5jb25zaXN0ZW50IG9wZW4gZGVwdGhzXCIpO1xuICAgIHJldHVybiByZXBsYWNlT3V0ZXIoJGZyb20sICR0bywgc2xpY2UsIDApO1xufVxuZnVuY3Rpb24gcmVwbGFjZU91dGVyKCRmcm9tLCAkdG8sIHNsaWNlLCBkZXB0aCkge1xuICAgIGxldCBpbmRleCA9ICRmcm9tLmluZGV4KGRlcHRoKSwgbm9kZSA9ICRmcm9tLm5vZGUoZGVwdGgpO1xuICAgIGlmIChpbmRleCA9PSAkdG8uaW5kZXgoZGVwdGgpICYmIGRlcHRoIDwgJGZyb20uZGVwdGggLSBzbGljZS5vcGVuU3RhcnQpIHtcbiAgICAgICAgbGV0IGlubmVyID0gcmVwbGFjZU91dGVyKCRmcm9tLCAkdG8sIHNsaWNlLCBkZXB0aCArIDEpO1xuICAgICAgICByZXR1cm4gbm9kZS5jb3B5KG5vZGUuY29udGVudC5yZXBsYWNlQ2hpbGQoaW5kZXgsIGlubmVyKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFzbGljZS5jb250ZW50LnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGNsb3NlKG5vZGUsIHJlcGxhY2VUd29XYXkoJGZyb20sICR0bywgZGVwdGgpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIXNsaWNlLm9wZW5TdGFydCAmJiAhc2xpY2Uub3BlbkVuZCAmJiAkZnJvbS5kZXB0aCA9PSBkZXB0aCAmJiAkdG8uZGVwdGggPT0gZGVwdGgpIHsgLy8gU2ltcGxlLCBmbGF0IGNhc2VcbiAgICAgICAgbGV0IHBhcmVudCA9ICRmcm9tLnBhcmVudCwgY29udGVudCA9IHBhcmVudC5jb250ZW50O1xuICAgICAgICByZXR1cm4gY2xvc2UocGFyZW50LCBjb250ZW50LmN1dCgwLCAkZnJvbS5wYXJlbnRPZmZzZXQpLmFwcGVuZChzbGljZS5jb250ZW50KS5hcHBlbmQoY29udGVudC5jdXQoJHRvLnBhcmVudE9mZnNldCkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCB7IHN0YXJ0LCBlbmQgfSA9IHByZXBhcmVTbGljZUZvclJlcGxhY2Uoc2xpY2UsICRmcm9tKTtcbiAgICAgICAgcmV0dXJuIGNsb3NlKG5vZGUsIHJlcGxhY2VUaHJlZVdheSgkZnJvbSwgc3RhcnQsIGVuZCwgJHRvLCBkZXB0aCkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrSm9pbihtYWluLCBzdWIpIHtcbiAgICBpZiAoIXN1Yi50eXBlLmNvbXBhdGlibGVDb250ZW50KG1haW4udHlwZSkpXG4gICAgICAgIHRocm93IG5ldyBSZXBsYWNlRXJyb3IoXCJDYW5ub3Qgam9pbiBcIiArIHN1Yi50eXBlLm5hbWUgKyBcIiBvbnRvIFwiICsgbWFpbi50eXBlLm5hbWUpO1xufVxuZnVuY3Rpb24gam9pbmFibGUoJGJlZm9yZSwgJGFmdGVyLCBkZXB0aCkge1xuICAgIGxldCBub2RlID0gJGJlZm9yZS5ub2RlKGRlcHRoKTtcbiAgICBjaGVja0pvaW4obm9kZSwgJGFmdGVyLm5vZGUoZGVwdGgpKTtcbiAgICByZXR1cm4gbm9kZTtcbn1cbmZ1bmN0aW9uIGFkZE5vZGUoY2hpbGQsIHRhcmdldCkge1xuICAgIGxldCBsYXN0ID0gdGFyZ2V0Lmxlbmd0aCAtIDE7XG4gICAgaWYgKGxhc3QgPj0gMCAmJiBjaGlsZC5pc1RleHQgJiYgY2hpbGQuc2FtZU1hcmt1cCh0YXJnZXRbbGFzdF0pKVxuICAgICAgICB0YXJnZXRbbGFzdF0gPSBjaGlsZC53aXRoVGV4dCh0YXJnZXRbbGFzdF0udGV4dCArIGNoaWxkLnRleHQpO1xuICAgIGVsc2VcbiAgICAgICAgdGFyZ2V0LnB1c2goY2hpbGQpO1xufVxuZnVuY3Rpb24gYWRkUmFuZ2UoJHN0YXJ0LCAkZW5kLCBkZXB0aCwgdGFyZ2V0KSB7XG4gICAgbGV0IG5vZGUgPSAoJGVuZCB8fCAkc3RhcnQpLm5vZGUoZGVwdGgpO1xuICAgIGxldCBzdGFydEluZGV4ID0gMCwgZW5kSW5kZXggPSAkZW5kID8gJGVuZC5pbmRleChkZXB0aCkgOiBub2RlLmNoaWxkQ291bnQ7XG4gICAgaWYgKCRzdGFydCkge1xuICAgICAgICBzdGFydEluZGV4ID0gJHN0YXJ0LmluZGV4KGRlcHRoKTtcbiAgICAgICAgaWYgKCRzdGFydC5kZXB0aCA+IGRlcHRoKSB7XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoJHN0YXJ0LnRleHRPZmZzZXQpIHtcbiAgICAgICAgICAgIGFkZE5vZGUoJHN0YXJ0Lm5vZGVBZnRlciwgdGFyZ2V0KTtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspXG4gICAgICAgIGFkZE5vZGUobm9kZS5jaGlsZChpKSwgdGFyZ2V0KTtcbiAgICBpZiAoJGVuZCAmJiAkZW5kLmRlcHRoID09IGRlcHRoICYmICRlbmQudGV4dE9mZnNldClcbiAgICAgICAgYWRkTm9kZSgkZW5kLm5vZGVCZWZvcmUsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBjbG9zZShub2RlLCBjb250ZW50KSB7XG4gICAgbm9kZS50eXBlLmNoZWNrQ29udGVudChjb250ZW50KTtcbiAgICByZXR1cm4gbm9kZS5jb3B5KGNvbnRlbnQpO1xufVxuZnVuY3Rpb24gcmVwbGFjZVRocmVlV2F5KCRmcm9tLCAkc3RhcnQsICRlbmQsICR0bywgZGVwdGgpIHtcbiAgICBsZXQgb3BlblN0YXJ0ID0gJGZyb20uZGVwdGggPiBkZXB0aCAmJiBqb2luYWJsZSgkZnJvbSwgJHN0YXJ0LCBkZXB0aCArIDEpO1xuICAgIGxldCBvcGVuRW5kID0gJHRvLmRlcHRoID4gZGVwdGggJiYgam9pbmFibGUoJGVuZCwgJHRvLCBkZXB0aCArIDEpO1xuICAgIGxldCBjb250ZW50ID0gW107XG4gICAgYWRkUmFuZ2UobnVsbCwgJGZyb20sIGRlcHRoLCBjb250ZW50KTtcbiAgICBpZiAob3BlblN0YXJ0ICYmIG9wZW5FbmQgJiYgJHN0YXJ0LmluZGV4KGRlcHRoKSA9PSAkZW5kLmluZGV4KGRlcHRoKSkge1xuICAgICAgICBjaGVja0pvaW4ob3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgYWRkTm9kZShjbG9zZShvcGVuU3RhcnQsIHJlcGxhY2VUaHJlZVdheSgkZnJvbSwgJHN0YXJ0LCAkZW5kLCAkdG8sIGRlcHRoICsgMSkpLCBjb250ZW50KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChvcGVuU3RhcnQpXG4gICAgICAgICAgICBhZGROb2RlKGNsb3NlKG9wZW5TdGFydCwgcmVwbGFjZVR3b1dheSgkZnJvbSwgJHN0YXJ0LCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgICAgIGFkZFJhbmdlKCRzdGFydCwgJGVuZCwgZGVwdGgsIGNvbnRlbnQpO1xuICAgICAgICBpZiAob3BlbkVuZClcbiAgICAgICAgICAgIGFkZE5vZGUoY2xvc2Uob3BlbkVuZCwgcmVwbGFjZVR3b1dheSgkZW5kLCAkdG8sIGRlcHRoICsgMSkpLCBjb250ZW50KTtcbiAgICB9XG4gICAgYWRkUmFuZ2UoJHRvLCBudWxsLCBkZXB0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIG5ldyBGcmFnbWVudChjb250ZW50KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VUd29XYXkoJGZyb20sICR0bywgZGVwdGgpIHtcbiAgICBsZXQgY29udGVudCA9IFtdO1xuICAgIGFkZFJhbmdlKG51bGwsICRmcm9tLCBkZXB0aCwgY29udGVudCk7XG4gICAgaWYgKCRmcm9tLmRlcHRoID4gZGVwdGgpIHtcbiAgICAgICAgbGV0IHR5cGUgPSBqb2luYWJsZSgkZnJvbSwgJHRvLCBkZXB0aCArIDEpO1xuICAgICAgICBhZGROb2RlKGNsb3NlKHR5cGUsIHJlcGxhY2VUd29XYXkoJGZyb20sICR0bywgZGVwdGggKyAxKSksIGNvbnRlbnQpO1xuICAgIH1cbiAgICBhZGRSYW5nZSgkdG8sIG51bGwsIGRlcHRoLCBjb250ZW50KTtcbiAgICByZXR1cm4gbmV3IEZyYWdtZW50KGNvbnRlbnQpO1xufVxuZnVuY3Rpb24gcHJlcGFyZVNsaWNlRm9yUmVwbGFjZShzbGljZSwgJGFsb25nKSB7XG4gICAgbGV0IGV4dHJhID0gJGFsb25nLmRlcHRoIC0gc2xpY2Uub3BlblN0YXJ0LCBwYXJlbnQgPSAkYWxvbmcubm9kZShleHRyYSk7XG4gICAgbGV0IG5vZGUgPSBwYXJlbnQuY29weShzbGljZS5jb250ZW50KTtcbiAgICBmb3IgKGxldCBpID0gZXh0cmEgLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgbm9kZSA9ICRhbG9uZy5ub2RlKGkpLmNvcHkoRnJhZ21lbnQuZnJvbShub2RlKSk7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IG5vZGUucmVzb2x2ZU5vQ2FjaGUoc2xpY2Uub3BlblN0YXJ0ICsgZXh0cmEpLFxuICAgICAgICBlbmQ6IG5vZGUucmVzb2x2ZU5vQ2FjaGUobm9kZS5jb250ZW50LnNpemUgLSBzbGljZS5vcGVuRW5kIC0gZXh0cmEpIH07XG59XG5cbi8qKlxuWW91IGNhbiBbX3Jlc29sdmVfXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5yZXNvbHZlKSBhIHBvc2l0aW9uIHRvIGdldCBtb3JlXG5pbmZvcm1hdGlvbiBhYm91dCBpdC4gT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBzdWNoIGFcbnJlc29sdmVkIHBvc2l0aW9uLCBwcm92aWRpbmcgdmFyaW91cyBwaWVjZXMgb2YgY29udGV4dFxuaW5mb3JtYXRpb24sIGFuZCBzb21lIGhlbHBlciBtZXRob2RzLlxuXG5UaHJvdWdob3V0IHRoaXMgaW50ZXJmYWNlLCBtZXRob2RzIHRoYXQgdGFrZSBhbiBvcHRpb25hbCBgZGVwdGhgXG5wYXJhbWV0ZXIgd2lsbCBpbnRlcnByZXQgdW5kZWZpbmVkIGFzIGB0aGlzLmRlcHRoYCBhbmQgbmVnYXRpdmVcbm51bWJlcnMgYXMgYHRoaXMuZGVwdGggKyB2YWx1ZWAuXG4qL1xuY2xhc3MgUmVzb2x2ZWRQb3Mge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIHRoYXQgd2FzIHJlc29sdmVkLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHBhdGgsIFxuICAgIC8qKlxuICAgIFRoZSBvZmZzZXQgdGhpcyBwb3NpdGlvbiBoYXMgaW50byBpdHMgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICBwYXJlbnRPZmZzZXQpIHtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMucGFyZW50T2Zmc2V0ID0gcGFyZW50T2Zmc2V0O1xuICAgICAgICB0aGlzLmRlcHRoID0gcGF0aC5sZW5ndGggLyAzIC0gMTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZXNvbHZlRGVwdGgodmFsKSB7XG4gICAgICAgIGlmICh2YWwgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcHRoO1xuICAgICAgICBpZiAodmFsIDwgMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcHRoICsgdmFsO1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgcGFyZW50IG5vZGUgdGhhdCB0aGUgcG9zaXRpb24gcG9pbnRzIGludG8uIE5vdGUgdGhhdCBldmVuIGlmXG4gICAgYSBwb3NpdGlvbiBwb2ludHMgaW50byBhIHRleHQgbm9kZSwgdGhhdCBub2RlIGlzIG5vdCBjb25zaWRlcmVkXG4gICAgdGhlIHBhcmVudOKAlHRleHQgbm9kZXMgYXJlIOKAmGZsYXTigJkgaW4gdGhpcyBtb2RlbCwgYW5kIGhhdmUgbm8gY29udGVudC5cbiAgICAqL1xuICAgIGdldCBwYXJlbnQoKSB7IHJldHVybiB0aGlzLm5vZGUodGhpcy5kZXB0aCk7IH1cbiAgICAvKipcbiAgICBUaGUgcm9vdCBub2RlIGluIHdoaWNoIHRoZSBwb3NpdGlvbiB3YXMgcmVzb2x2ZWQuXG4gICAgKi9cbiAgICBnZXQgZG9jKCkgeyByZXR1cm4gdGhpcy5ub2RlKDApOyB9XG4gICAgLyoqXG4gICAgVGhlIGFuY2VzdG9yIG5vZGUgYXQgdGhlIGdpdmVuIGxldmVsLiBgcC5ub2RlKHAuZGVwdGgpYCBpcyB0aGVcbiAgICBzYW1lIGFzIGBwLnBhcmVudGAuXG4gICAgKi9cbiAgICBub2RlKGRlcHRoKSB7IHJldHVybiB0aGlzLnBhdGhbdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpICogM107IH1cbiAgICAvKipcbiAgICBUaGUgaW5kZXggaW50byB0aGUgYW5jZXN0b3IgYXQgdGhlIGdpdmVuIGxldmVsLiBJZiB0aGlzIHBvaW50c1xuICAgIGF0IHRoZSAzcmQgbm9kZSBpbiB0aGUgMm5kIHBhcmFncmFwaCBvbiB0aGUgdG9wIGxldmVsLCBmb3JcbiAgICBleGFtcGxlLCBgcC5pbmRleCgwKWAgaXMgMSBhbmQgYHAuaW5kZXgoMSlgIGlzIDIuXG4gICAgKi9cbiAgICBpbmRleChkZXB0aCkgeyByZXR1cm4gdGhpcy5wYXRoW3RoaXMucmVzb2x2ZURlcHRoKGRlcHRoKSAqIDMgKyAxXTsgfVxuICAgIC8qKlxuICAgIFRoZSBpbmRleCBwb2ludGluZyBhZnRlciB0aGlzIHBvc2l0aW9uIGludG8gdGhlIGFuY2VzdG9yIGF0IHRoZVxuICAgIGdpdmVuIGxldmVsLlxuICAgICovXG4gICAgaW5kZXhBZnRlcihkZXB0aCkge1xuICAgICAgICBkZXB0aCA9IHRoaXMucmVzb2x2ZURlcHRoKGRlcHRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXgoZGVwdGgpICsgKGRlcHRoID09IHRoaXMuZGVwdGggJiYgIXRoaXMudGV4dE9mZnNldCA/IDAgOiAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBub2RlIGF0IHRoZSBnaXZlblxuICAgIGxldmVsLlxuICAgICovXG4gICAgc3RhcnQoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIHJldHVybiBkZXB0aCA9PSAwID8gMCA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXSArIDE7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSAoYWJzb2x1dGUpIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIG5vZGUgYXQgdGhlIGdpdmVuXG4gICAgbGV2ZWwuXG4gICAgKi9cbiAgICBlbmQoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0KGRlcHRoKSArIHRoaXMubm9kZShkZXB0aCkuY29udGVudC5zaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgKGFic29sdXRlKSBwb3NpdGlvbiBkaXJlY3RseSBiZWZvcmUgdGhlIHdyYXBwaW5nIG5vZGUgYXQgdGhlXG4gICAgZ2l2ZW4gbGV2ZWwsIG9yLCB3aGVuIGBkZXB0aGAgaXMgYHRoaXMuZGVwdGggKyAxYCwgdGhlIG9yaWdpbmFsXG4gICAgcG9zaXRpb24uXG4gICAgKi9cbiAgICBiZWZvcmUoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIGlmICghZGVwdGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZXJlIGlzIG5vIHBvc2l0aW9uIGJlZm9yZSB0aGUgdG9wLWxldmVsIG5vZGVcIik7XG4gICAgICAgIHJldHVybiBkZXB0aCA9PSB0aGlzLmRlcHRoICsgMSA/IHRoaXMucG9zIDogdGhpcy5wYXRoW2RlcHRoICogMyAtIDFdO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgKGFic29sdXRlKSBwb3NpdGlvbiBkaXJlY3RseSBhZnRlciB0aGUgd3JhcHBpbmcgbm9kZSBhdCB0aGVcbiAgICBnaXZlbiBsZXZlbCwgb3IgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIHdoZW4gYGRlcHRoYCBpcyBgdGhpcy5kZXB0aCArIDFgLlxuICAgICovXG4gICAgYWZ0ZXIoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIGlmICghZGVwdGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZXJlIGlzIG5vIHBvc2l0aW9uIGFmdGVyIHRoZSB0b3AtbGV2ZWwgbm9kZVwiKTtcbiAgICAgICAgcmV0dXJuIGRlcHRoID09IHRoaXMuZGVwdGggKyAxID8gdGhpcy5wb3MgOiB0aGlzLnBhdGhbZGVwdGggKiAzIC0gMV0gKyB0aGlzLnBhdGhbZGVwdGggKiAzXS5ub2RlU2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hlbiB0aGlzIHBvc2l0aW9uIHBvaW50cyBpbnRvIGEgdGV4dCBub2RlLCB0aGlzIHJldHVybnMgdGhlXG4gICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9zaXRpb24gYW5kIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBub2RlLlxuICAgIFdpbGwgYmUgemVybyBmb3IgcG9zaXRpb25zIHRoYXQgcG9pbnQgYmV0d2VlbiBub2Rlcy5cbiAgICAqL1xuICAgIGdldCB0ZXh0T2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5wb3MgLSB0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBub2RlIGRpcmVjdGx5IGFmdGVyIHRoZSBwb3NpdGlvbiwgaWYgYW55LiBJZiB0aGUgcG9zaXRpb25cbiAgICBwb2ludHMgaW50byBhIHRleHQgbm9kZSwgb25seSB0aGUgcGFydCBvZiB0aGF0IG5vZGUgYWZ0ZXIgdGhlXG4gICAgcG9zaXRpb24gaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICBnZXQgbm9kZUFmdGVyKCkge1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQsIGluZGV4ID0gdGhpcy5pbmRleCh0aGlzLmRlcHRoKTtcbiAgICAgICAgaWYgKGluZGV4ID09IHBhcmVudC5jaGlsZENvdW50KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBkT2ZmID0gdGhpcy5wb3MgLSB0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdLCBjaGlsZCA9IHBhcmVudC5jaGlsZChpbmRleCk7XG4gICAgICAgIHJldHVybiBkT2ZmID8gcGFyZW50LmNoaWxkKGluZGV4KS5jdXQoZE9mZikgOiBjaGlsZDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBub2RlIGRpcmVjdGx5IGJlZm9yZSB0aGUgcG9zaXRpb24sIGlmIGFueS4gSWYgdGhlXG4gICAgcG9zaXRpb24gcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIG9ubHkgdGhlIHBhcnQgb2YgdGhhdCBub2RlXG4gICAgYmVmb3JlIHRoZSBwb3NpdGlvbiBpcyByZXR1cm5lZC5cbiAgICAqL1xuICAgIGdldCBub2RlQmVmb3JlKCkge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmluZGV4KHRoaXMuZGVwdGgpO1xuICAgICAgICBsZXQgZE9mZiA9IHRoaXMucG9zIC0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGRPZmYpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuY2hpbGQoaW5kZXgpLmN1dCgwLCBkT2ZmKTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID09IDAgPyBudWxsIDogdGhpcy5wYXJlbnQuY2hpbGQoaW5kZXggLSAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlIHBhcmVudCBub2RlIGF0IHRoZVxuICAgIGdpdmVuIGRlcHRoICh3aGljaCBkZWZhdWx0cyB0byBgdGhpcy5kZXB0aGApLlxuICAgICovXG4gICAgcG9zQXRJbmRleChpbmRleCwgZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy5wYXRoW2RlcHRoICogM10sIHBvcyA9IGRlcHRoID09IDAgPyAwIDogdGhpcy5wYXRoW2RlcHRoICogMyAtIDFdICsgMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKVxuICAgICAgICAgICAgcG9zICs9IG5vZGUuY2hpbGQoaSkubm9kZVNpemU7XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbWFya3MgYXQgdGhpcyBwb3NpdGlvbiwgZmFjdG9yaW5nIGluIHRoZSBzdXJyb3VuZGluZ1xuICAgIG1hcmtzJyBbYGluY2x1c2l2ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrU3BlYy5pbmNsdXNpdmUpIHByb3BlcnR5LiBJZiB0aGVcbiAgICBwb3NpdGlvbiBpcyBhdCB0aGUgc3RhcnQgb2YgYSBub24tZW1wdHkgbm9kZSwgdGhlIG1hcmtzIG9mIHRoZVxuICAgIG5vZGUgYWZ0ZXIgaXQgKGlmIGFueSkgYXJlIHJldHVybmVkLlxuICAgICovXG4gICAgbWFya3MoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudCwgaW5kZXggPSB0aGlzLmluZGV4KCk7XG4gICAgICAgIC8vIEluIGFuIGVtcHR5IHBhcmVudCwgcmV0dXJuIHRoZSBlbXB0eSBhcnJheVxuICAgICAgICBpZiAocGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIE1hcmsubm9uZTtcbiAgICAgICAgLy8gV2hlbiBpbnNpZGUgYSB0ZXh0IG5vZGUsIGp1c3QgcmV0dXJuIHRoZSB0ZXh0IG5vZGUncyBtYXJrc1xuICAgICAgICBpZiAodGhpcy50ZXh0T2Zmc2V0KVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5jaGlsZChpbmRleCkubWFya3M7XG4gICAgICAgIGxldCBtYWluID0gcGFyZW50Lm1heWJlQ2hpbGQoaW5kZXggLSAxKSwgb3RoZXIgPSBwYXJlbnQubWF5YmVDaGlsZChpbmRleCk7XG4gICAgICAgIC8vIElmIHRoZSBgYWZ0ZXJgIGZsYWcgaXMgdHJ1ZSBvZiB0aGVyZSBpcyBubyBub2RlIGJlZm9yZSwgbWFrZVxuICAgICAgICAvLyB0aGUgbm9kZSBhZnRlciB0aGlzIHBvc2l0aW9uIHRoZSBtYWluIHJlZmVyZW5jZS5cbiAgICAgICAgaWYgKCFtYWluKSB7XG4gICAgICAgICAgICBsZXQgdG1wID0gbWFpbjtcbiAgICAgICAgICAgIG1haW4gPSBvdGhlcjtcbiAgICAgICAgICAgIG90aGVyID0gdG1wO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzZSBhbGwgbWFya3MgaW4gdGhlIG1haW4gbm9kZSwgZXhjZXB0IHRob3NlIHRoYXQgaGF2ZVxuICAgICAgICAvLyBgaW5jbHVzaXZlYCBzZXQgdG8gZmFsc2UgYW5kIGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3RoZXIgbm9kZS5cbiAgICAgICAgbGV0IG1hcmtzID0gbWFpbi5tYXJrcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChtYXJrc1tpXS50eXBlLnNwZWMuaW5jbHVzaXZlID09PSBmYWxzZSAmJiAoIW90aGVyIHx8ICFtYXJrc1tpXS5pc0luU2V0KG90aGVyLm1hcmtzKSkpXG4gICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrc1tpLS1dLnJlbW92ZUZyb21TZXQobWFya3MpO1xuICAgICAgICByZXR1cm4gbWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbWFya3MgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24sIGlmIGFueSwgZXhjZXB0IHRob3NlXG4gICAgdGhhdCBhcmUgbm9uLWluY2x1c2l2ZSBhbmQgbm90IHByZXNlbnQgYXQgcG9zaXRpb24gYCRlbmRgLiBUaGlzXG4gICAgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgZ2V0dGluZyB0aGUgc2V0IG9mIG1hcmtzIHRvIHByZXNlcnZlIGFmdGVyIGFcbiAgICBkZWxldGlvbi4gV2lsbCByZXR1cm4gYG51bGxgIGlmIHRoaXMgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZlxuICAgIGl0cyBwYXJlbnQgbm9kZSBvciBpdHMgcGFyZW50IG5vZGUgaXNuJ3QgYSB0ZXh0YmxvY2sgKGluIHdoaWNoXG4gICAgY2FzZSBubyBtYXJrcyBzaG91bGQgYmUgcHJlc2VydmVkKS5cbiAgICAqL1xuICAgIG1hcmtzQWNyb3NzKCRlbmQpIHtcbiAgICAgICAgbGV0IGFmdGVyID0gdGhpcy5wYXJlbnQubWF5YmVDaGlsZCh0aGlzLmluZGV4KCkpO1xuICAgICAgICBpZiAoIWFmdGVyIHx8ICFhZnRlci5pc0lubGluZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgbWFya3MgPSBhZnRlci5tYXJrcywgbmV4dCA9ICRlbmQucGFyZW50Lm1heWJlQ2hpbGQoJGVuZC5pbmRleCgpKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChtYXJrc1tpXS50eXBlLnNwZWMuaW5jbHVzaXZlID09PSBmYWxzZSAmJiAoIW5leHQgfHwgIW1hcmtzW2ldLmlzSW5TZXQobmV4dC5tYXJrcykpKVxuICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3NbaS0tXS5yZW1vdmVGcm9tU2V0KG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZGVwdGggdXAgdG8gd2hpY2ggdGhpcyBwb3NpdGlvbiBhbmQgdGhlIGdpdmVuIChub24tcmVzb2x2ZWQpXG4gICAgcG9zaXRpb24gc2hhcmUgdGhlIHNhbWUgcGFyZW50IG5vZGVzLlxuICAgICovXG4gICAgc2hhcmVkRGVwdGgocG9zKSB7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gdGhpcy5kZXB0aDsgZGVwdGggPiAwOyBkZXB0aC0tKVxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnQoZGVwdGgpIDw9IHBvcyAmJiB0aGlzLmVuZChkZXB0aCkgPj0gcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBkZXB0aDtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYSByYW5nZSBiYXNlZCBvbiB0aGUgcGxhY2Ugd2hlcmUgdGhpcyBwb3NpdGlvbiBhbmQgdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb24gZGl2ZXJnZSBhcm91bmQgYmxvY2sgY29udGVudC4gSWYgYm90aCBwb2ludCBpbnRvXG4gICAgdGhlIHNhbWUgdGV4dGJsb2NrLCBmb3IgZXhhbXBsZSwgYSByYW5nZSBhcm91bmQgdGhhdCB0ZXh0YmxvY2tcbiAgICB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGV5IHBvaW50IGludG8gZGlmZmVyZW50IGJsb2NrcywgdGhlIHJhbmdlXG4gICAgYXJvdW5kIHRob3NlIGJsb2NrcyBpbiB0aGVpciBzaGFyZWQgYW5jZXN0b3IgaXMgcmV0dXJuZWQuIFlvdSBjYW5cbiAgICBwYXNzIGluIGFuIG9wdGlvbmFsIHByZWRpY2F0ZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggYSBwYXJlbnRcbiAgICBub2RlIHRvIHNlZSBpZiBhIHJhbmdlIGludG8gdGhhdCBwYXJlbnQgaXMgYWNjZXB0YWJsZS5cbiAgICAqL1xuICAgIGJsb2NrUmFuZ2Uob3RoZXIgPSB0aGlzLCBwcmVkKSB7XG4gICAgICAgIGlmIChvdGhlci5wb3MgPCB0aGlzLnBvcylcbiAgICAgICAgICAgIHJldHVybiBvdGhlci5ibG9ja1JhbmdlKHRoaXMpO1xuICAgICAgICBmb3IgKGxldCBkID0gdGhpcy5kZXB0aCAtICh0aGlzLnBhcmVudC5pbmxpbmVDb250ZW50IHx8IHRoaXMucG9zID09IG90aGVyLnBvcyA/IDEgOiAwKTsgZCA+PSAwOyBkLS0pXG4gICAgICAgICAgICBpZiAob3RoZXIucG9zIDw9IHRoaXMuZW5kKGQpICYmICghcHJlZCB8fCBwcmVkKHRoaXMubm9kZShkKSkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZVJhbmdlKHRoaXMsIG90aGVyLCBkKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJ5IHdoZXRoZXIgdGhlIGdpdmVuIHBvc2l0aW9uIHNoYXJlcyB0aGUgc2FtZSBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIHNhbWVQYXJlbnQob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zIC0gdGhpcy5wYXJlbnRPZmZzZXQgPT0gb3RoZXIucG9zIC0gb3RoZXIucGFyZW50T2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gdGhlIGdyZWF0ZXIgb2YgdGhpcyBhbmQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgbWF4KG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlci5wb3MgPiB0aGlzLnBvcyA/IG90aGVyIDogdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBzbWFsbGVyIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIG1pbihvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIucG9zIDwgdGhpcy5wb3MgPyBvdGhlciA6IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBzdHIgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLmRlcHRoOyBpKyspXG4gICAgICAgICAgICBzdHIgKz0gKHN0ciA/IFwiL1wiIDogXCJcIikgKyB0aGlzLm5vZGUoaSkudHlwZS5uYW1lICsgXCJfXCIgKyB0aGlzLmluZGV4KGkgLSAxKTtcbiAgICAgICAgcmV0dXJuIHN0ciArIFwiOlwiICsgdGhpcy5wYXJlbnRPZmZzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHJlc29sdmUoZG9jLCBwb3MpIHtcbiAgICAgICAgaWYgKCEocG9zID49IDAgJiYgcG9zIDw9IGRvYy5jb250ZW50LnNpemUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJQb3NpdGlvbiBcIiArIHBvcyArIFwiIG91dCBvZiByYW5nZVwiKTtcbiAgICAgICAgbGV0IHBhdGggPSBbXTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gMCwgcGFyZW50T2Zmc2V0ID0gcG9zO1xuICAgICAgICBmb3IgKGxldCBub2RlID0gZG9jOzspIHtcbiAgICAgICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IG5vZGUuY29udGVudC5maW5kSW5kZXgocGFyZW50T2Zmc2V0KTtcbiAgICAgICAgICAgIGxldCByZW0gPSBwYXJlbnRPZmZzZXQgLSBvZmZzZXQ7XG4gICAgICAgICAgICBwYXRoLnB1c2gobm9kZSwgaW5kZXgsIHN0YXJ0ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICghcmVtKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNUZXh0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcGFyZW50T2Zmc2V0ID0gcmVtIC0gMTtcbiAgICAgICAgICAgIHN0YXJ0ICs9IG9mZnNldCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFBvcyhwb3MsIHBhdGgsIHBhcmVudE9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHJlc29sdmVDYWNoZWQoZG9jLCBwb3MpIHtcbiAgICAgICAgbGV0IGNhY2hlID0gcmVzb2x2ZUNhY2hlLmdldChkb2MpO1xuICAgICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGUuZWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBlbHQgPSBjYWNoZS5lbHRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChlbHQucG9zID09IHBvcylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVDYWNoZS5zZXQoZG9jLCBjYWNoZSA9IG5ldyBSZXNvbHZlQ2FjaGUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBjYWNoZS5lbHRzW2NhY2hlLmldID0gUmVzb2x2ZWRQb3MucmVzb2x2ZShkb2MsIHBvcyk7XG4gICAgICAgIGNhY2hlLmkgPSAoY2FjaGUuaSArIDEpICUgcmVzb2x2ZUNhY2hlU2l6ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5jbGFzcyBSZXNvbHZlQ2FjaGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVsdHMgPSBbXTtcbiAgICAgICAgdGhpcy5pID0gMDtcbiAgICB9XG59XG5jb25zdCByZXNvbHZlQ2FjaGVTaXplID0gMTIsIHJlc29sdmVDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG4vKipcblJlcHJlc2VudHMgYSBmbGF0IHJhbmdlIG9mIGNvbnRlbnQsIGkuZS4gb25lIHRoYXQgc3RhcnRzIGFuZFxuZW5kcyBpbiB0aGUgc2FtZSBub2RlLlxuKi9cbmNsYXNzIE5vZGVSYW5nZSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgbm9kZSByYW5nZS4gYCRmcm9tYCBhbmQgYCR0b2Agc2hvdWxkIHBvaW50IGludG8gdGhlXG4gICAgc2FtZSBub2RlIHVudGlsIGF0IGxlYXN0IHRoZSBnaXZlbiBgZGVwdGhgLCBzaW5jZSBhIG5vZGUgcmFuZ2VcbiAgICBkZW5vdGVzIGFuIGFkamFjZW50IHNldCBvZiBub2RlcyBpbiBhIHNpbmdsZSBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEEgcmVzb2x2ZWQgcG9zaXRpb24gYWxvbmcgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50LiBNYXkgaGF2ZSBhXG4gICAgYGRlcHRoYCBncmVhdGVyIHRoYW4gdGhpcyBvYmplY3QncyBgZGVwdGhgIHByb3BlcnR5LCBzaW5jZVxuICAgIHRoZXNlIGFyZSB0aGUgcG9zaXRpb25zIHRoYXQgd2VyZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHJhbmdlLFxuICAgIG5vdCByZS1yZXNvbHZlZCBwb3NpdGlvbnMgZGlyZWN0bHkgYXQgaXRzIGJvdW5kYXJpZXMuXG4gICAgKi9cbiAgICAkZnJvbSwgXG4gICAgLyoqXG4gICAgQSBwb3NpdGlvbiBhbG9uZyB0aGUgZW5kIG9mIHRoZSBjb250ZW50LiBTZWVcbiAgICBjYXZlYXQgZm9yIFtgJGZyb21gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVJhbmdlLiRmcm9tKS5cbiAgICAqL1xuICAgICR0bywgXG4gICAgLyoqXG4gICAgVGhlIGRlcHRoIG9mIHRoZSBub2RlIHRoYXQgdGhpcyByYW5nZSBwb2ludHMgaW50by5cbiAgICAqL1xuICAgIGRlcHRoKSB7XG4gICAgICAgIHRoaXMuJGZyb20gPSAkZnJvbTtcbiAgICAgICAgdGhpcy4kdG8gPSAkdG87XG4gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgc3RhcnQoKSB7IHJldHVybiB0aGlzLiRmcm9tLmJlZm9yZSh0aGlzLmRlcHRoICsgMSk7IH1cbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgZW5kKCkgeyByZXR1cm4gdGhpcy4kdG8uYWZ0ZXIodGhpcy5kZXB0aCArIDEpOyB9XG4gICAgLyoqXG4gICAgVGhlIHBhcmVudCBub2RlIHRoYXQgdGhlIHJhbmdlIHBvaW50cyBpbnRvLlxuICAgICovXG4gICAgZ2V0IHBhcmVudCgpIHsgcmV0dXJuIHRoaXMuJGZyb20ubm9kZSh0aGlzLmRlcHRoKTsgfVxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBpbmRleCBvZiB0aGUgcmFuZ2UgaW4gdGhlIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgZ2V0IHN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLiRmcm9tLmluZGV4KHRoaXMuZGVwdGgpOyB9XG4gICAgLyoqXG4gICAgVGhlIGVuZCBpbmRleCBvZiB0aGUgcmFuZ2UgaW4gdGhlIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgZ2V0IGVuZEluZGV4KCkgeyByZXR1cm4gdGhpcy4kdG8uaW5kZXhBZnRlcih0aGlzLmRlcHRoKTsgfVxufVxuXG5jb25zdCBlbXB0eUF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgdHJlZSB0aGF0IG1ha2VzIHVwIGFcblByb3NlTWlycm9yIGRvY3VtZW50LiBTbyBhIGRvY3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGBOb2RlYCwgd2l0aFxuY2hpbGRyZW4gdGhhdCBhcmUgYWxzbyBpbnN0YW5jZXMgb2YgYE5vZGVgLlxuXG5Ob2RlcyBhcmUgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMuIEluc3RlYWQgb2YgY2hhbmdpbmcgdGhlbSwgeW91XG5jcmVhdGUgbmV3IG9uZXMgd2l0aCB0aGUgY29udGVudCB5b3Ugd2FudC4gT2xkIG9uZXMga2VlcCBwb2ludGluZ1xuYXQgdGhlIG9sZCBkb2N1bWVudCBzaGFwZS4gVGhpcyBpcyBtYWRlIGNoZWFwZXIgYnkgc2hhcmluZ1xuc3RydWN0dXJlIGJldHdlZW4gdGhlIG9sZCBhbmQgbmV3IGRhdGEgYXMgbXVjaCBhcyBwb3NzaWJsZSwgd2hpY2ggYVxudHJlZSBzaGFwZSBsaWtlIHRoaXMgKHdpdGhvdXQgYmFjayBwb2ludGVycykgbWFrZXMgZWFzeS5cblxuKipEbyBub3QqKiBkaXJlY3RseSBtdXRhdGUgdGhlIHByb3BlcnRpZXMgb2YgYSBgTm9kZWAgb2JqZWN0LiBTZWVcblt0aGUgZ3VpZGVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvZ3VpZGUvI2RvYykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4qL1xuY2xhc3MgTm9kZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgdHlwZSBvZiBub2RlIHRoYXQgdGhpcyBpcy5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIEFuIG9iamVjdCBtYXBwaW5nIGF0dHJpYnV0ZSBuYW1lcyB0byB2YWx1ZXMuIFRoZSBraW5kIG9mXG4gICAgYXR0cmlidXRlcyBhbGxvd2VkIGFuZCByZXF1aXJlZCBhcmVcbiAgICBbZGV0ZXJtaW5lZF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmF0dHJzKSBieSB0aGUgbm9kZSB0eXBlLlxuICAgICovXG4gICAgYXR0cnMsIFxuICAgIC8vIEEgZnJhZ21lbnQgaG9sZGluZyB0aGUgbm9kZSdzIGNoaWxkcmVuLlxuICAgIGNvbnRlbnQsIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrcyAodGhpbmdzIGxpa2Ugd2hldGhlciBpdCBpcyBlbXBoYXNpemVkIG9yIHBhcnQgb2YgYVxuICAgIGxpbmspIGFwcGxpZWQgdG8gdGhpcyBub2RlLlxuICAgICovXG4gICAgbWFya3MgPSBNYXJrLm5vbmUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgICAgICB0aGlzLm1hcmtzID0gbWFya3M7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQgfHwgRnJhZ21lbnQuZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBhcnJheSBvZiB0aGlzIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAqL1xuICAgIGdldCBjaGlsZHJlbigpIHsgcmV0dXJuIHRoaXMuY29udGVudC5jb250ZW50OyB9XG4gICAgLyoqXG4gICAgVGhlIHNpemUgb2YgdGhpcyBub2RlLCBhcyBkZWZpbmVkIGJ5IHRoZSBpbnRlZ2VyLWJhc2VkIFtpbmRleGluZ1xuICAgIHNjaGVtZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9ndWlkZS8jZG9jLmluZGV4aW5nKS4gRm9yIHRleHQgbm9kZXMsIHRoaXMgaXMgdGhlXG4gICAgYW1vdW50IG9mIGNoYXJhY3RlcnMuIEZvciBvdGhlciBsZWFmIG5vZGVzLCBpdCBpcyBvbmUuIEZvclxuICAgIG5vbi1sZWFmIG5vZGVzLCBpdCBpcyB0aGUgc2l6ZSBvZiB0aGUgY29udGVudCBwbHVzIHR3byAodGhlXG4gICAgc3RhcnQgYW5kIGVuZCB0b2tlbikuXG4gICAgKi9cbiAgICBnZXQgbm9kZVNpemUoKSB7IHJldHVybiB0aGlzLmlzTGVhZiA/IDEgOiAyICsgdGhpcy5jb250ZW50LnNpemU7IH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgdGhlIG5vZGUgaGFzLlxuICAgICovXG4gICAgZ2V0IGNoaWxkQ291bnQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuY2hpbGRDb3VudDsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguIFJhaXNlcyBhbiBlcnJvciB3aGVuIHRoZVxuICAgIGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiAgICAqL1xuICAgIGNoaWxkKGluZGV4KSB7IHJldHVybiB0aGlzLmNvbnRlbnQuY2hpbGQoaW5kZXgpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCwgaWYgaXQgZXhpc3RzLlxuICAgICovXG4gICAgbWF5YmVDaGlsZChpbmRleCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lm1heWJlQ2hpbGQoaW5kZXgpOyB9XG4gICAgLyoqXG4gICAgQ2FsbCBgZmAgZm9yIGV2ZXJ5IGNoaWxkIG5vZGUsIHBhc3NpbmcgdGhlIG5vZGUsIGl0cyBvZmZzZXRcbiAgICBpbnRvIHRoaXMgcGFyZW50IG5vZGUsIGFuZCBpdHMgaW5kZXguXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHsgdGhpcy5jb250ZW50LmZvckVhY2goZik7IH1cbiAgICAvKipcbiAgICBJbnZva2UgYSBjYWxsYmFjayBmb3IgYWxsIGRlc2NlbmRhbnQgbm9kZXMgcmVjdXJzaXZlbHkgYmV0d2VlblxuICAgIHRoZSBnaXZlbiB0d28gcG9zaXRpb25zIHRoYXQgYXJlIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHRoaXNcbiAgICBub2RlJ3MgY29udGVudC4gVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aCB0aGUgbm9kZSwgaXRzXG4gICAgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIG5vZGUgKG1ldGhvZCByZWNlaXZlciksXG4gICAgaXRzIHBhcmVudCBub2RlLCBhbmQgaXRzIGNoaWxkIGluZGV4LiBXaGVuIHRoZSBjYWxsYmFjayByZXR1cm5zXG4gICAgZmFsc2UgZm9yIGEgZ2l2ZW4gbm9kZSwgdGhhdCBub2RlJ3MgY2hpbGRyZW4gd2lsbCBub3QgYmVcbiAgICByZWN1cnNlZCBvdmVyLiBUaGUgbGFzdCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhXG4gICAgc3RhcnRpbmcgcG9zaXRpb24gdG8gY291bnQgZnJvbS5cbiAgICAqL1xuICAgIG5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgc3RhcnRQb3MgPSAwKSB7XG4gICAgICAgIHRoaXMuY29udGVudC5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYsIHN0YXJ0UG9zLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbCB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgbm9kZS4gRG9lc24ndFxuICAgIGRlc2NlbmQgaW50byBhIG5vZGUgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBgZmFsc2VgLlxuICAgICovXG4gICAgZGVzY2VuZGFudHMoZikge1xuICAgICAgICB0aGlzLm5vZGVzQmV0d2VlbigwLCB0aGlzLmNvbnRlbnQuc2l6ZSwgZik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbmNhdGVuYXRlcyBhbGwgdGhlIHRleHQgbm9kZXMgZm91bmQgaW4gdGhpcyBmcmFnbWVudCBhbmQgaXRzXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgdGV4dENvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pc0xlYWYgJiYgdGhpcy50eXBlLnNwZWMubGVhZlRleHQpXG4gICAgICAgICAgICA/IHRoaXMudHlwZS5zcGVjLmxlYWZUZXh0KHRoaXMpXG4gICAgICAgICAgICA6IHRoaXMudGV4dEJldHdlZW4oMCwgdGhpcy5jb250ZW50LnNpemUsIFwiXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYWxsIHRleHQgYmV0d2VlbiBwb3NpdGlvbnMgYGZyb21gIGFuZCBgdG9gLiBXaGVuXG4gICAgYGJsb2NrU2VwYXJhdG9yYCBpcyBnaXZlbiwgaXQgd2lsbCBiZSBpbnNlcnRlZCB0byBzZXBhcmF0ZSB0ZXh0XG4gICAgZnJvbSBkaWZmZXJlbnQgYmxvY2sgbm9kZXMuIElmIGBsZWFmVGV4dGAgaXMgZ2l2ZW4sIGl0J2xsIGJlXG4gICAgaW5zZXJ0ZWQgZm9yIGV2ZXJ5IG5vbi10ZXh0IGxlYWYgbm9kZSBlbmNvdW50ZXJlZCwgb3RoZXJ3aXNlXG4gICAgW2BsZWFmVGV4dGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5sZWFmVGV4dCkgd2lsbCBiZSB1c2VkLlxuICAgICovXG4gICAgdGV4dEJldHdlZW4oZnJvbSwgdG8sIGJsb2NrU2VwYXJhdG9yLCBsZWFmVGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LnRleHRCZXR3ZWVuKGZyb20sIHRvLCBibG9ja1NlcGFyYXRvciwgbGVhZlRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoaXMgbm9kZSdzIGZpcnN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5maXJzdENoaWxkOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGlzIG5vZGUncyBsYXN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxhc3RDaGlsZDsgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0d28gbm9kZXMgcmVwcmVzZW50IHRoZSBzYW1lIHBpZWNlIG9mIGRvY3VtZW50LlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgKHRoaXMuc2FtZU1hcmt1cChvdGhlcikgJiYgdGhpcy5jb250ZW50LmVxKG90aGVyLmNvbnRlbnQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGUgbWFya3VwICh0eXBlLCBhdHRyaWJ1dGVzLCBhbmQgbWFya3MpIG9mIHRoaXMgbm9kZSB0b1xuICAgIHRob3NlIG9mIGFub3RoZXIuIFJldHVybnMgYHRydWVgIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSBtYXJrdXAuXG4gICAgKi9cbiAgICBzYW1lTWFya3VwKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc01hcmt1cChvdGhlci50eXBlLCBvdGhlci5hdHRycywgb3RoZXIubWFya3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSdzIG1hcmt1cCBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiB0eXBlLFxuICAgIGF0dHJpYnV0ZXMsIGFuZCBtYXJrcy5cbiAgICAqL1xuICAgIGhhc01hcmt1cCh0eXBlLCBhdHRycywgbWFya3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSB0eXBlICYmXG4gICAgICAgICAgICBjb21wYXJlRGVlcCh0aGlzLmF0dHJzLCBhdHRycyB8fCB0eXBlLmRlZmF1bHRBdHRycyB8fCBlbXB0eUF0dHJzKSAmJlxuICAgICAgICAgICAgTWFyay5zYW1lU2V0KHRoaXMubWFya3MsIG1hcmtzIHx8IE1hcmsubm9uZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBub2RlIHdpdGggdGhlIHNhbWUgbWFya3VwIGFzIHRoaXMgbm9kZSwgY29udGFpbmluZ1xuICAgIHRoZSBnaXZlbiBjb250ZW50IChvciBlbXB0eSwgaWYgbm8gY29udGVudCBpcyBnaXZlbikuXG4gICAgKi9cbiAgICBjb3B5KGNvbnRlbnQgPSBudWxsKSB7XG4gICAgICAgIGlmIChjb250ZW50ID09IHRoaXMuY29udGVudClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcy50eXBlLCB0aGlzLmF0dHJzLCBjb250ZW50LCB0aGlzLm1hcmtzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUsIHdpdGggdGhlIGdpdmVuIHNldCBvZiBtYXJrcyBpbnN0ZWFkXG4gICAgb2YgdGhlIG5vZGUncyBvd24gbWFya3MuXG4gICAgKi9cbiAgICBtYXJrKG1hcmtzKSB7XG4gICAgICAgIHJldHVybiBtYXJrcyA9PSB0aGlzLm1hcmtzID8gdGhpcyA6IG5ldyBOb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGhpcy5jb250ZW50LCBtYXJrcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlIHdpdGggb25seSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZVxuICAgIGdpdmVuIHBvc2l0aW9ucy4gSWYgYHRvYCBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvIHRoZSBlbmQgb2ZcbiAgICB0aGUgbm9kZS5cbiAgICAqL1xuICAgIGN1dChmcm9tLCB0byA9IHRoaXMuY29udGVudC5zaXplKSB7XG4gICAgICAgIGlmIChmcm9tID09IDAgJiYgdG8gPT0gdGhpcy5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weSh0aGlzLmNvbnRlbnQuY3V0KGZyb20sIHRvKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEN1dCBvdXQgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucywgYW5kXG4gICAgcmV0dXJuIGl0IGFzIGEgYFNsaWNlYCBvYmplY3QuXG4gICAgKi9cbiAgICBzbGljZShmcm9tLCB0byA9IHRoaXMuY29udGVudC5zaXplLCBpbmNsdWRlUGFyZW50cyA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChmcm9tID09IHRvKVxuICAgICAgICAgICAgcmV0dXJuIFNsaWNlLmVtcHR5O1xuICAgICAgICBsZXQgJGZyb20gPSB0aGlzLnJlc29sdmUoZnJvbSksICR0byA9IHRoaXMucmVzb2x2ZSh0byk7XG4gICAgICAgIGxldCBkZXB0aCA9IGluY2x1ZGVQYXJlbnRzID8gMCA6ICRmcm9tLnNoYXJlZERlcHRoKHRvKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gJGZyb20uc3RhcnQoZGVwdGgpLCBub2RlID0gJGZyb20ubm9kZShkZXB0aCk7XG4gICAgICAgIGxldCBjb250ZW50ID0gbm9kZS5jb250ZW50LmN1dCgkZnJvbS5wb3MgLSBzdGFydCwgJHRvLnBvcyAtIHN0YXJ0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBTbGljZShjb250ZW50LCAkZnJvbS5kZXB0aCAtIGRlcHRoLCAkdG8uZGVwdGggLSBkZXB0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucyB3aXRoXG4gICAgdGhlIGdpdmVuIHNsaWNlLiBUaGUgc2xpY2UgbXVzdCAnZml0JywgbWVhbmluZyBpdHMgb3BlbiBzaWRlc1xuICAgIG11c3QgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzdXJyb3VuZGluZyBjb250ZW50LCBhbmQgaXRzXG4gICAgY29udGVudCBub2RlcyBtdXN0IGJlIHZhbGlkIGNoaWxkcmVuIGZvciB0aGUgbm9kZSB0aGV5IGFyZSBwbGFjZWRcbiAgICBpbnRvLiBJZiBhbnkgb2YgdGhpcyBpcyB2aW9sYXRlZCwgYW4gZXJyb3Igb2YgdHlwZVxuICAgIFtgUmVwbGFjZUVycm9yYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlJlcGxhY2VFcnJvcikgaXMgdGhyb3duLlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0bywgc2xpY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2UodGhpcy5yZXNvbHZlKGZyb20pLCB0aGlzLnJlc29sdmUodG8pLCBzbGljZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIG5vZGUgZGlyZWN0bHkgYWZ0ZXIgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgbm9kZUF0KHBvcykge1xuICAgICAgICBmb3IgKGxldCBub2RlID0gdGhpczs7KSB7XG4gICAgICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHBvcyk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gcG9zIHx8IG5vZGUuaXNUZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgcG9zIC09IG9mZnNldCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgKGRpcmVjdCkgY2hpbGQgbm9kZSBhZnRlciB0aGUgZ2l2ZW4gb2Zmc2V0LCBpZiBhbnksXG4gICAgYW5kIHJldHVybiBpdCBhbG9uZyB3aXRoIGl0cyBpbmRleCBhbmQgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoaXNcbiAgICBub2RlLlxuICAgICovXG4gICAgY2hpbGRBZnRlcihwb3MpIHtcbiAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gdGhpcy5jb250ZW50LmZpbmRJbmRleChwb3MpO1xuICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnQubWF5YmVDaGlsZChpbmRleCksIGluZGV4LCBvZmZzZXQgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgKGRpcmVjdCkgY2hpbGQgbm9kZSBiZWZvcmUgdGhlIGdpdmVuIG9mZnNldCwgaWYgYW55LFxuICAgIGFuZCByZXR1cm4gaXQgYWxvbmcgd2l0aCBpdHMgaW5kZXggYW5kIG9mZnNldCByZWxhdGl2ZSB0byB0aGlzXG4gICAgbm9kZS5cbiAgICAqL1xuICAgIGNoaWxkQmVmb3JlKHBvcykge1xuICAgICAgICBpZiAocG9zID09IDApXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBudWxsLCBpbmRleDogMCwgb2Zmc2V0OiAwIH07XG4gICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IHRoaXMuY29udGVudC5maW5kSW5kZXgocG9zKTtcbiAgICAgICAgaWYgKG9mZnNldCA8IHBvcylcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudC5jaGlsZChpbmRleCksIGluZGV4LCBvZmZzZXQgfTtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNvbnRlbnQuY2hpbGQoaW5kZXggLSAxKTtcbiAgICAgICAgcmV0dXJuIHsgbm9kZSwgaW5kZXg6IGluZGV4IC0gMSwgb2Zmc2V0OiBvZmZzZXQgLSBub2RlLm5vZGVTaXplIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFJlc29sdmUgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCwgcmV0dXJuaW5nIGFuXG4gICAgW29iamVjdF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlJlc29sdmVkUG9zKSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjb250ZXh0LlxuICAgICovXG4gICAgcmVzb2x2ZShwb3MpIHsgcmV0dXJuIFJlc29sdmVkUG9zLnJlc29sdmVDYWNoZWQodGhpcywgcG9zKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzb2x2ZU5vQ2FjaGUocG9zKSB7IHJldHVybiBSZXNvbHZlZFBvcy5yZXNvbHZlKHRoaXMsIHBvcyk7IH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgYSBnaXZlbiBtYXJrIG9yIG1hcmsgdHlwZSBvY2N1cnMgaW4gdGhpcyBkb2N1bWVudFxuICAgIGJldHdlZW4gdGhlIHR3byBnaXZlbiBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICByYW5nZUhhc01hcmsoZnJvbSwgdG8sIHR5cGUpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGlmICh0byA+IGZyb20pXG4gICAgICAgICAgICB0aGlzLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNJblNldChub2RlLm1hcmtzKSlcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAhZm91bmQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhIGJsb2NrIChub24taW5saW5lIG5vZGUpXG4gICAgKi9cbiAgICBnZXQgaXNCbG9jaygpIHsgcmV0dXJuIHRoaXMudHlwZS5pc0Jsb2NrOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSB0ZXh0YmxvY2sgbm9kZSwgYSBibG9jayBub2RlIHdpdGggaW5saW5lXG4gICAgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpc1RleHRibG9jaygpIHsgcmV0dXJuIHRoaXMudHlwZS5pc1RleHRibG9jazsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG5vZGUgYWxsb3dzIGlubGluZSBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlubGluZUNvbnRlbnQoKSB7IHJldHVybiB0aGlzLnR5cGUuaW5saW5lQ29udGVudDsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGFuIGlubGluZSBub2RlIChhIHRleHQgbm9kZSBvciBhIG5vZGUgdGhhdCBjYW5cbiAgICBhcHBlYXIgYW1vbmcgdGV4dCkuXG4gICAgKi9cbiAgICBnZXQgaXNJbmxpbmUoKSB7IHJldHVybiB0aGlzLnR5cGUuaXNJbmxpbmU7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhIHRleHQgbm9kZS5cbiAgICAqL1xuICAgIGdldCBpc1RleHQoKSB7IHJldHVybiB0aGlzLnR5cGUuaXNUZXh0OyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSBsZWFmIG5vZGUuXG4gICAgKi9cbiAgICBnZXQgaXNMZWFmKCkgeyByZXR1cm4gdGhpcy50eXBlLmlzTGVhZjsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGFuIGF0b20sIGkuZS4gd2hlbiBpdCBkb2VzIG5vdCBoYXZlIGRpcmVjdGx5XG4gICAgZWRpdGFibGUgY29udGVudC4gVGhpcyBpcyB1c3VhbGx5IHRoZSBzYW1lIGFzIGBpc0xlYWZgLCBidXQgY2FuXG4gICAgYmUgY29uZmlndXJlZCB3aXRoIHRoZSBbYGF0b21gIHByb3BlcnR5XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuYXRvbSlcbiAgICBvbiBhIG5vZGUncyBzcGVjICh0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSBub2RlIGlzIGRpc3BsYXllZCBhc1xuICAgIGFuIHVuZWRpdGFibGUgW25vZGUgdmlld10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuTm9kZVZpZXcpKS5cbiAgICAqL1xuICAgIGdldCBpc0F0b20oKSB7IHJldHVybiB0aGlzLnR5cGUuaXNBdG9tOyB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZSBmb3IgZGVidWdnaW5nXG4gICAgcHVycG9zZXMuXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNwZWMudG9EZWJ1Z1N0cmluZyh0aGlzKTtcbiAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnR5cGUubmFtZTtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5zaXplKVxuICAgICAgICAgICAgbmFtZSArPSBcIihcIiArIHRoaXMuY29udGVudC50b1N0cmluZ0lubmVyKCkgKyBcIilcIjtcbiAgICAgICAgcmV0dXJuIHdyYXBNYXJrcyh0aGlzLm1hcmtzLCBuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjb250ZW50IG1hdGNoIGluIHRoaXMgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgKi9cbiAgICBjb250ZW50TWF0Y2hBdChpbmRleCkge1xuICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLnR5cGUuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCAwLCBpbmRleCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsZWQgY29udGVudE1hdGNoQXQgb24gYSBub2RlIHdpdGggaW52YWxpZCBjb250ZW50XCIpO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciByZXBsYWNpbmcgdGhlIHJhbmdlIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gIChieVxuICAgIGNoaWxkIGluZGV4KSB3aXRoIHRoZSBnaXZlbiByZXBsYWNlbWVudCBmcmFnbWVudCAod2hpY2ggZGVmYXVsdHNcbiAgICB0byB0aGUgZW1wdHkgZnJhZ21lbnQpIHdvdWxkIGxlYXZlIHRoZSBub2RlJ3MgY29udGVudCB2YWxpZC4gWW91XG4gICAgY2FuIG9wdGlvbmFsbHkgcGFzcyBgc3RhcnRgIGFuZCBgZW5kYCBpbmRpY2VzIGludG8gdGhlXG4gICAgcmVwbGFjZW1lbnQgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBjYW5SZXBsYWNlKGZyb20sIHRvLCByZXBsYWNlbWVudCA9IEZyYWdtZW50LmVtcHR5LCBzdGFydCA9IDAsIGVuZCA9IHJlcGxhY2VtZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgbGV0IG9uZSA9IHRoaXMuY29udGVudE1hdGNoQXQoZnJvbSkubWF0Y2hGcmFnbWVudChyZXBsYWNlbWVudCwgc3RhcnQsIGVuZCk7XG4gICAgICAgIGxldCB0d28gPSBvbmUgJiYgb25lLm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCB0byk7XG4gICAgICAgIGlmICghdHdvIHx8ICF0d28udmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGUuYWxsb3dzTWFya3MocmVwbGFjZW1lbnQuY2hpbGQoaSkubWFya3MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciByZXBsYWNpbmcgdGhlIHJhbmdlIGBmcm9tYCB0byBgdG9gIChieSBpbmRleCkgd2l0aFxuICAgIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSB3b3VsZCBsZWF2ZSB0aGUgbm9kZSdzIGNvbnRlbnQgdmFsaWQuXG4gICAgKi9cbiAgICBjYW5SZXBsYWNlV2l0aChmcm9tLCB0bywgdHlwZSwgbWFya3MpIHtcbiAgICAgICAgaWYgKG1hcmtzICYmICF0aGlzLnR5cGUuYWxsb3dzTWFya3MobWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmNvbnRlbnRNYXRjaEF0KGZyb20pLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICYmIHN0YXJ0Lm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCB0byk7XG4gICAgICAgIHJldHVybiBlbmQgPyBlbmQudmFsaWRFbmQgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBub2RlJ3MgY29udGVudCBjb3VsZCBiZSBhcHBlbmRlZCB0byB0aGlzXG4gICAgbm9kZS4gSWYgdGhhdCBub2RlIGlzIGVtcHR5LCB0aGlzIHdpbGwgb25seSByZXR1cm4gdHJ1ZSBpZiB0aGVyZVxuICAgIGlzIGF0IGxlYXN0IG9uZSBub2RlIHR5cGUgdGhhdCBjYW4gYXBwZWFyIGluIGJvdGggbm9kZXMgKHRvIGF2b2lkXG4gICAgbWVyZ2luZyBjb21wbGV0ZWx5IGluY29tcGF0aWJsZSBub2RlcykuXG4gICAgKi9cbiAgICBjYW5BcHBlbmQob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhblJlcGxhY2UodGhpcy5jaGlsZENvdW50LCB0aGlzLmNoaWxkQ291bnQsIG90aGVyLmNvbnRlbnQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmNvbXBhdGlibGVDb250ZW50KG90aGVyLnR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSBhbmQgaXRzIGRlc2NlbmRhbnRzIGNvbmZvcm0gdG8gdGhlXG4gICAgc2NoZW1hLCBhbmQgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhleSBkbyBub3QuXG4gICAgKi9cbiAgICBjaGVjaygpIHtcbiAgICAgICAgdGhpcy50eXBlLmNoZWNrQ29udGVudCh0aGlzLmNvbnRlbnQpO1xuICAgICAgICB0aGlzLnR5cGUuY2hlY2tBdHRycyh0aGlzLmF0dHJzKTtcbiAgICAgICAgbGV0IGNvcHkgPSBNYXJrLm5vbmU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcmsgPSB0aGlzLm1hcmtzW2ldO1xuICAgICAgICAgICAgbWFyay50eXBlLmNoZWNrQXR0cnMobWFyay5hdHRycyk7XG4gICAgICAgICAgICBjb3B5ID0gbWFyay5hZGRUb1NldChjb3B5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU1hcmsuc2FtZVNldChjb3B5LCB0aGlzLm1hcmtzKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIGNvbGxlY3Rpb24gb2YgbWFya3MgZm9yIG5vZGUgJHt0aGlzLnR5cGUubmFtZX06ICR7dGhpcy5tYXJrcy5tYXAobSA9PiBtLnR5cGUubmFtZSl9YCk7XG4gICAgICAgIHRoaXMuY29udGVudC5mb3JFYWNoKG5vZGUgPT4gbm9kZS5jaGVjaygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IG9iaiA9IHsgdHlwZTogdGhpcy50eXBlLm5hbWUgfTtcbiAgICAgICAgZm9yIChsZXQgXyBpbiB0aGlzLmF0dHJzKSB7XG4gICAgICAgICAgICBvYmouYXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5zaXplKVxuICAgICAgICAgICAgb2JqLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQudG9KU09OKCk7XG4gICAgICAgIGlmICh0aGlzLm1hcmtzLmxlbmd0aClcbiAgICAgICAgICAgIG9iai5tYXJrcyA9IHRoaXMubWFya3MubWFwKG4gPT4gbi50b0pTT04oKSk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbm9kZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAoIWpzb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIE5vZGUuZnJvbUpTT05cIik7XG4gICAgICAgIGxldCBtYXJrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGpzb24ubWFya3MpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uLm1hcmtzKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgbWFyayBkYXRhIGZvciBOb2RlLmZyb21KU09OXCIpO1xuICAgICAgICAgICAgbWFya3MgPSBqc29uLm1hcmtzLm1hcChzY2hlbWEubWFya0Zyb21KU09OKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoanNvbi50eXBlID09IFwidGV4dFwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGpzb24udGV4dCAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB0ZXh0IG5vZGUgaW4gSlNPTlwiKTtcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEudGV4dChqc29uLnRleHQsIG1hcmtzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29udGVudCA9IEZyYWdtZW50LmZyb21KU09OKHNjaGVtYSwganNvbi5jb250ZW50KTtcbiAgICAgICAgbGV0IG5vZGUgPSBzY2hlbWEubm9kZVR5cGUoanNvbi50eXBlKS5jcmVhdGUoanNvbi5hdHRycywgY29udGVudCwgbWFya3MpO1xuICAgICAgICBub2RlLnR5cGUuY2hlY2tBdHRycyhub2RlLmF0dHJzKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxufVxuTm9kZS5wcm90b3R5cGUudGV4dCA9IHVuZGVmaW5lZDtcbmNsYXNzIFRleHROb2RlIGV4dGVuZHMgTm9kZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBhdHRycywgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgc3VwZXIodHlwZSwgYXR0cnMsIG51bGwsIG1hcmtzKTtcbiAgICAgICAgaWYgKCFjb250ZW50KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFbXB0eSB0ZXh0IG5vZGVzIGFyZSBub3QgYWxsb3dlZFwiKTtcbiAgICAgICAgdGhpcy50ZXh0ID0gY29udGVudDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUuc3BlYy50b0RlYnVnU3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcodGhpcyk7XG4gICAgICAgIHJldHVybiB3cmFwTWFya3ModGhpcy5tYXJrcywgSlNPTi5zdHJpbmdpZnkodGhpcy50ZXh0KSk7XG4gICAgfVxuICAgIGdldCB0ZXh0Q29udGVudCgpIHsgcmV0dXJuIHRoaXMudGV4dDsgfVxuICAgIHRleHRCZXR3ZWVuKGZyb20sIHRvKSB7IHJldHVybiB0aGlzLnRleHQuc2xpY2UoZnJvbSwgdG8pOyB9XG4gICAgZ2V0IG5vZGVTaXplKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIG1hcmsobWFya3MpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtzID09IHRoaXMubWFya3MgPyB0aGlzIDogbmV3IFRleHROb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGhpcy50ZXh0LCBtYXJrcyk7XG4gICAgfVxuICAgIHdpdGhUZXh0KHRleHQpIHtcbiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy50ZXh0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dE5vZGUodGhpcy50eXBlLCB0aGlzLmF0dHJzLCB0ZXh0LCB0aGlzLm1hcmtzKTtcbiAgICB9XG4gICAgY3V0KGZyb20gPSAwLCB0byA9IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLnRleHQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhUZXh0KHRoaXMudGV4dC5zbGljZShmcm9tLCB0bykpO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5zYW1lTWFya3VwKG90aGVyKSAmJiB0aGlzLnRleHQgPT0gb3RoZXIudGV4dDtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgYmFzZSA9IHN1cGVyLnRvSlNPTigpO1xuICAgICAgICBiYXNlLnRleHQgPSB0aGlzLnRleHQ7XG4gICAgICAgIHJldHVybiBiYXNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHdyYXBNYXJrcyhtYXJrcywgc3RyKSB7XG4gICAgZm9yIChsZXQgaSA9IG1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICBzdHIgPSBtYXJrc1tpXS50eXBlLm5hbWUgKyBcIihcIiArIHN0ciArIFwiKVwiO1xuICAgIHJldHVybiBzdHI7XG59XG5cbi8qKlxuSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgbWF0Y2ggc3RhdGUgb2YgYSBub2RlIHR5cGUnc1xuW2NvbnRlbnQgZXhwcmVzc2lvbl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmNvbnRlbnQpLCBhbmQgY2FuIGJlIHVzZWQgdG9cbmZpbmQgb3V0IHdoZXRoZXIgZnVydGhlciBjb250ZW50IG1hdGNoZXMgaGVyZSwgYW5kIHdoZXRoZXIgYSBnaXZlblxucG9zaXRpb24gaXMgYSB2YWxpZCBlbmQgb2YgdGhlIG5vZGUuXG4qL1xuY2xhc3MgQ29udGVudE1hdGNoIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG1hdGNoIHN0YXRlIHJlcHJlc2VudHMgYSB2YWxpZCBlbmQgb2YgdGhlIG5vZGUuXG4gICAgKi9cbiAgICB2YWxpZEVuZCkge1xuICAgICAgICB0aGlzLnZhbGlkRW5kID0gdmFsaWRFbmQ7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uZXh0ID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy53cmFwQ2FjaGUgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgcGFyc2Uoc3RyaW5nLCBub2RlVHlwZXMpIHtcbiAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBUb2tlblN0cmVhbShzdHJpbmcsIG5vZGVUeXBlcyk7XG4gICAgICAgIGlmIChzdHJlYW0ubmV4dCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRNYXRjaC5lbXB0eTtcbiAgICAgICAgbGV0IGV4cHIgPSBwYXJzZUV4cHIoc3RyZWFtKTtcbiAgICAgICAgaWYgKHN0cmVhbS5uZXh0KVxuICAgICAgICAgICAgc3RyZWFtLmVycihcIlVuZXhwZWN0ZWQgdHJhaWxpbmcgdGV4dFwiKTtcbiAgICAgICAgbGV0IG1hdGNoID0gZGZhKG5mYShleHByKSk7XG4gICAgICAgIGNoZWNrRm9yRGVhZEVuZHMobWF0Y2gsIHN0cmVhbSk7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG4gICAgLyoqXG4gICAgTWF0Y2ggYSBub2RlIHR5cGUsIHJldHVybmluZyBhIG1hdGNoIGFmdGVyIHRoYXQgbm9kZSBpZlxuICAgIHN1Y2Nlc3NmdWwuXG4gICAgKi9cbiAgICBtYXRjaFR5cGUodHlwZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmV4dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0aGlzLm5leHRbaV0udHlwZSA9PSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHRbaV0ubmV4dDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFRyeSB0byBtYXRjaCBhIGZyYWdtZW50LiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgbWF0Y2ggd2hlblxuICAgIHN1Y2Nlc3NmdWwuXG4gICAgKi9cbiAgICBtYXRjaEZyYWdtZW50KGZyYWcsIHN0YXJ0ID0gMCwgZW5kID0gZnJhZy5jaGlsZENvdW50KSB7XG4gICAgICAgIGxldCBjdXIgPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGN1ciAmJiBpIDwgZW5kOyBpKyspXG4gICAgICAgICAgICBjdXIgPSBjdXIubWF0Y2hUeXBlKGZyYWcuY2hpbGQoaSkudHlwZSk7XG4gICAgICAgIHJldHVybiBjdXI7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGlubGluZUNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQubGVuZ3RoICE9IDAgJiYgdGhpcy5uZXh0WzBdLnR5cGUuaXNJbmxpbmU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZmlyc3QgbWF0Y2hpbmcgbm9kZSB0eXBlIGF0IHRoaXMgbWF0Y2ggcG9zaXRpb24gdGhhdCBjYW5cbiAgICBiZSBnZW5lcmF0ZWQuXG4gICAgKi9cbiAgICBnZXQgZGVmYXVsdFR5cGUoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyB0eXBlIH0gPSB0aGlzLm5leHRbaV07XG4gICAgICAgICAgICBpZiAoISh0eXBlLmlzVGV4dCB8fCB0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcGF0aWJsZShvdGhlcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmV4dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3RoZXIubmV4dC5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0W2ldLnR5cGUgPT0gb3RoZXIubmV4dFtqXS50eXBlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnkgdG8gbWF0Y2ggdGhlIGdpdmVuIGZyYWdtZW50LCBhbmQgaWYgdGhhdCBmYWlscywgc2VlIGlmIGl0IGNhblxuICAgIGJlIG1hZGUgdG8gbWF0Y2ggYnkgaW5zZXJ0aW5nIG5vZGVzIGluIGZyb250IG9mIGl0LiBXaGVuXG4gICAgc3VjY2Vzc2Z1bCwgcmV0dXJuIGEgZnJhZ21lbnQgb2YgaW5zZXJ0ZWQgbm9kZXMgKHdoaWNoIG1heSBiZVxuICAgIGVtcHR5IGlmIG5vdGhpbmcgaGFkIHRvIGJlIGluc2VydGVkKS4gV2hlbiBgdG9FbmRgIGlzIHRydWUsIG9ubHlcbiAgICByZXR1cm4gYSBmcmFnbWVudCBpZiB0aGUgcmVzdWx0aW5nIG1hdGNoIGdvZXMgdG8gdGhlIGVuZCBvZiB0aGVcbiAgICBjb250ZW50IGV4cHJlc3Npb24uXG4gICAgKi9cbiAgICBmaWxsQmVmb3JlKGFmdGVyLCB0b0VuZCA9IGZhbHNlLCBzdGFydEluZGV4ID0gMCkge1xuICAgICAgICBsZXQgc2VlbiA9IFt0aGlzXTtcbiAgICAgICAgZnVuY3Rpb24gc2VhcmNoKG1hdGNoLCB0eXBlcykge1xuICAgICAgICAgICAgbGV0IGZpbmlzaGVkID0gbWF0Y2gubWF0Y2hGcmFnbWVudChhZnRlciwgc3RhcnRJbmRleCk7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWQgJiYgKCF0b0VuZCB8fCBmaW5pc2hlZC52YWxpZEVuZCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmZyb20odHlwZXMubWFwKHRwID0+IHRwLmNyZWF0ZUFuZEZpbGwoKSkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaC5uZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgdHlwZSwgbmV4dCB9ID0gbWF0Y2gubmV4dFtpXTtcbiAgICAgICAgICAgICAgICBpZiAoISh0eXBlLmlzVGV4dCB8fCB0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSkgJiYgc2Vlbi5pbmRleE9mKG5leHQpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW4ucHVzaChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gc2VhcmNoKG5leHQsIHR5cGVzLmNvbmNhdCh0eXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VhcmNoKHRoaXMsIFtdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBhIHNldCBvZiB3cmFwcGluZyBub2RlIHR5cGVzIHRoYXQgd291bGQgYWxsb3cgYSBub2RlIG9mIHRoZVxuICAgIGdpdmVuIHR5cGUgdG8gYXBwZWFyIGF0IHRoaXMgcG9zaXRpb24uIFRoZSByZXN1bHQgbWF5IGJlIGVtcHR5XG4gICAgKHdoZW4gaXQgZml0cyBkaXJlY3RseSkgYW5kIHdpbGwgYmUgbnVsbCB3aGVuIG5vIHN1Y2ggd3JhcHBpbmdcbiAgICBleGlzdHMuXG4gICAgKi9cbiAgICBmaW5kV3JhcHBpbmcodGFyZ2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy53cmFwQ2FjaGUubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgICAgICBpZiAodGhpcy53cmFwQ2FjaGVbaV0gPT0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBDYWNoZVtpICsgMV07XG4gICAgICAgIGxldCBjb21wdXRlZCA9IHRoaXMuY29tcHV0ZVdyYXBwaW5nKHRhcmdldCk7XG4gICAgICAgIHRoaXMud3JhcENhY2hlLnB1c2godGFyZ2V0LCBjb21wdXRlZCk7XG4gICAgICAgIHJldHVybiBjb21wdXRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wdXRlV3JhcHBpbmcodGFyZ2V0KSB7XG4gICAgICAgIGxldCBzZWVuID0gT2JqZWN0LmNyZWF0ZShudWxsKSwgYWN0aXZlID0gW3sgbWF0Y2g6IHRoaXMsIHR5cGU6IG51bGwsIHZpYTogbnVsbCB9XTtcbiAgICAgICAgd2hpbGUgKGFjdGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gYWN0aXZlLnNoaWZ0KCksIG1hdGNoID0gY3VycmVudC5tYXRjaDtcbiAgICAgICAgICAgIGlmIChtYXRjaC5tYXRjaFR5cGUodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBvYmogPSBjdXJyZW50OyBvYmoudHlwZTsgb2JqID0gb2JqLnZpYSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob2JqLnR5cGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmV2ZXJzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaC5uZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgdHlwZSwgbmV4dCB9ID0gbWF0Y2gubmV4dFtpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuaXNMZWFmICYmICF0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSAmJiAhKHR5cGUubmFtZSBpbiBzZWVuKSAmJiAoIWN1cnJlbnQudHlwZSB8fCBuZXh0LnZhbGlkRW5kKSkge1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmUucHVzaCh7IG1hdGNoOiB0eXBlLmNvbnRlbnRNYXRjaCwgdHlwZSwgdmlhOiBjdXJyZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICBzZWVuW3R5cGUubmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiBvdXRnb2luZyBlZGdlcyB0aGlzIG5vZGUgaGFzIGluIHRoZSBmaW5pdGVcbiAgICBhdXRvbWF0b24gdGhhdCBkZXNjcmliZXMgdGhlIGNvbnRlbnQgZXhwcmVzc2lvbi5cbiAgICAqL1xuICAgIGdldCBlZGdlQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQubGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIF9uX+KAi3RoIG91dGdvaW5nIGVkZ2UgZnJvbSB0aGlzIG5vZGUgaW4gdGhlIGZpbml0ZVxuICAgIGF1dG9tYXRvbiB0aGF0IGRlc2NyaWJlcyB0aGUgY29udGVudCBleHByZXNzaW9uLlxuICAgICovXG4gICAgZWRnZShuKSB7XG4gICAgICAgIGlmIChuID49IHRoaXMubmV4dC5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlcmUncyBubyAke259dGggZWRnZSBpbiB0aGlzIGNvbnRlbnQgbWF0Y2hgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dFtuXTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHNlZW4gPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gc2NhbihtKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2gobSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG0ubmV4dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG0ubmV4dFtpXS5uZXh0KSA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgc2NhbihtLm5leHRbaV0ubmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgc2Nhbih0aGlzKTtcbiAgICAgICAgcmV0dXJuIHNlZW4ubWFwKChtLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3V0ID0gaSArIChtLnZhbGlkRW5kID8gXCIqXCIgOiBcIiBcIikgKyBcIiBcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbS5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIG91dCArPSAoaSA/IFwiLCBcIiA6IFwiXCIpICsgbS5uZXh0W2ldLnR5cGUubmFtZSArIFwiLT5cIiArIHNlZW4uaW5kZXhPZihtLm5leHRbaV0ubmV4dCk7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9KS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbn1cbi8qKlxuQGludGVybmFsXG4qL1xuQ29udGVudE1hdGNoLmVtcHR5ID0gbmV3IENvbnRlbnRNYXRjaCh0cnVlKTtcbmNsYXNzIFRva2VuU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpbmcsIG5vZGVUeXBlcykge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICAgICAgdGhpcy5ub2RlVHlwZXMgPSBub2RlVHlwZXM7XG4gICAgICAgIHRoaXMuaW5saW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICB0aGlzLnRva2VucyA9IHN0cmluZy5zcGxpdCgvXFxzKig/PVxcYnxcXFd8JCkvKTtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5zW3RoaXMudG9rZW5zLmxlbmd0aCAtIDFdID09IFwiXCIpXG4gICAgICAgICAgICB0aGlzLnRva2Vucy5wb3AoKTtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5zWzBdID09IFwiXCIpXG4gICAgICAgICAgICB0aGlzLnRva2Vucy5zaGlmdCgpO1xuICAgIH1cbiAgICBnZXQgbmV4dCgpIHsgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMucG9zXTsgfVxuICAgIGVhdCh0b2spIHsgcmV0dXJuIHRoaXMubmV4dCA9PSB0b2sgJiYgKHRoaXMucG9zKysgfHwgdHJ1ZSk7IH1cbiAgICBlcnIoc3RyKSB7IHRocm93IG5ldyBTeW50YXhFcnJvcihzdHIgKyBcIiAoaW4gY29udGVudCBleHByZXNzaW9uICdcIiArIHRoaXMuc3RyaW5nICsgXCInKVwiKTsgfVxufVxuZnVuY3Rpb24gcGFyc2VFeHByKHN0cmVhbSkge1xuICAgIGxldCBleHBycyA9IFtdO1xuICAgIGRvIHtcbiAgICAgICAgZXhwcnMucHVzaChwYXJzZUV4cHJTZXEoc3RyZWFtKSk7XG4gICAgfSB3aGlsZSAoc3RyZWFtLmVhdChcInxcIikpO1xuICAgIHJldHVybiBleHBycy5sZW5ndGggPT0gMSA/IGV4cHJzWzBdIDogeyB0eXBlOiBcImNob2ljZVwiLCBleHBycyB9O1xufVxuZnVuY3Rpb24gcGFyc2VFeHByU2VxKHN0cmVhbSkge1xuICAgIGxldCBleHBycyA9IFtdO1xuICAgIGRvIHtcbiAgICAgICAgZXhwcnMucHVzaChwYXJzZUV4cHJTdWJzY3JpcHQoc3RyZWFtKSk7XG4gICAgfSB3aGlsZSAoc3RyZWFtLm5leHQgJiYgc3RyZWFtLm5leHQgIT0gXCIpXCIgJiYgc3RyZWFtLm5leHQgIT0gXCJ8XCIpO1xuICAgIHJldHVybiBleHBycy5sZW5ndGggPT0gMSA/IGV4cHJzWzBdIDogeyB0eXBlOiBcInNlcVwiLCBleHBycyB9O1xufVxuZnVuY3Rpb24gcGFyc2VFeHByU3Vic2NyaXB0KHN0cmVhbSkge1xuICAgIGxldCBleHByID0gcGFyc2VFeHByQXRvbShzdHJlYW0pO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKHN0cmVhbS5lYXQoXCIrXCIpKVxuICAgICAgICAgICAgZXhwciA9IHsgdHlwZTogXCJwbHVzXCIsIGV4cHIgfTtcbiAgICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdChcIipcIikpXG4gICAgICAgICAgICBleHByID0geyB0eXBlOiBcInN0YXJcIiwgZXhwciB9O1xuICAgICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KFwiP1wiKSlcbiAgICAgICAgICAgIGV4cHIgPSB7IHR5cGU6IFwib3B0XCIsIGV4cHIgfTtcbiAgICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdChcIntcIikpXG4gICAgICAgICAgICBleHByID0gcGFyc2VFeHByUmFuZ2Uoc3RyZWFtLCBleHByKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xufVxuZnVuY3Rpb24gcGFyc2VOdW0oc3RyZWFtKSB7XG4gICAgaWYgKC9cXEQvLnRlc3Qoc3RyZWFtLm5leHQpKVxuICAgICAgICBzdHJlYW0uZXJyKFwiRXhwZWN0ZWQgbnVtYmVyLCBnb3QgJ1wiICsgc3RyZWFtLm5leHQgKyBcIidcIik7XG4gICAgbGV0IHJlc3VsdCA9IE51bWJlcihzdHJlYW0ubmV4dCk7XG4gICAgc3RyZWFtLnBvcysrO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJSYW5nZShzdHJlYW0sIGV4cHIpIHtcbiAgICBsZXQgbWluID0gcGFyc2VOdW0oc3RyZWFtKSwgbWF4ID0gbWluO1xuICAgIGlmIChzdHJlYW0uZWF0KFwiLFwiKSkge1xuICAgICAgICBpZiAoc3RyZWFtLm5leHQgIT0gXCJ9XCIpXG4gICAgICAgICAgICBtYXggPSBwYXJzZU51bShzdHJlYW0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtYXggPSAtMTtcbiAgICB9XG4gICAgaWYgKCFzdHJlYW0uZWF0KFwifVwiKSlcbiAgICAgICAgc3RyZWFtLmVycihcIlVuY2xvc2VkIGJyYWNlZCByYW5nZVwiKTtcbiAgICByZXR1cm4geyB0eXBlOiBcInJhbmdlXCIsIG1pbiwgbWF4LCBleHByIH07XG59XG5mdW5jdGlvbiByZXNvbHZlTmFtZShzdHJlYW0sIG5hbWUpIHtcbiAgICBsZXQgdHlwZXMgPSBzdHJlYW0ubm9kZVR5cGVzLCB0eXBlID0gdHlwZXNbbmFtZV07XG4gICAgaWYgKHR5cGUpXG4gICAgICAgIHJldHVybiBbdHlwZV07XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IHR5cGVOYW1lIGluIHR5cGVzKSB7XG4gICAgICAgIGxldCB0eXBlID0gdHlwZXNbdHlwZU5hbWVdO1xuICAgICAgICBpZiAodHlwZS5pc0luR3JvdXAobmFtZSkpXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMClcbiAgICAgICAgc3RyZWFtLmVycihcIk5vIG5vZGUgdHlwZSBvciBncm91cCAnXCIgKyBuYW1lICsgXCInIGZvdW5kXCIpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJBdG9tKHN0cmVhbSkge1xuICAgIGlmIChzdHJlYW0uZWF0KFwiKFwiKSkge1xuICAgICAgICBsZXQgZXhwciA9IHBhcnNlRXhwcihzdHJlYW0pO1xuICAgICAgICBpZiAoIXN0cmVhbS5lYXQoXCIpXCIpKVxuICAgICAgICAgICAgc3RyZWFtLmVycihcIk1pc3NpbmcgY2xvc2luZyBwYXJlblwiKTtcbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuICAgIGVsc2UgaWYgKCEvXFxXLy50ZXN0KHN0cmVhbS5uZXh0KSkge1xuICAgICAgICBsZXQgZXhwcnMgPSByZXNvbHZlTmFtZShzdHJlYW0sIHN0cmVhbS5uZXh0KS5tYXAodHlwZSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RyZWFtLmlubGluZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHN0cmVhbS5pbmxpbmUgPSB0eXBlLmlzSW5saW5lO1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLmlubGluZSAhPSB0eXBlLmlzSW5saW5lKVxuICAgICAgICAgICAgICAgIHN0cmVhbS5lcnIoXCJNaXhpbmcgaW5saW5lIGFuZCBibG9jayBjb250ZW50XCIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJuYW1lXCIsIHZhbHVlOiB0eXBlIH07XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0ucG9zKys7XG4gICAgICAgIHJldHVybiBleHBycy5sZW5ndGggPT0gMSA/IGV4cHJzWzBdIDogeyB0eXBlOiBcImNob2ljZVwiLCBleHBycyB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyZWFtLmVycihcIlVuZXhwZWN0ZWQgdG9rZW4gJ1wiICsgc3RyZWFtLm5leHQgKyBcIidcIik7XG4gICAgfVxufVxuLy8gQ29uc3RydWN0IGFuIE5GQSBmcm9tIGFuIGV4cHJlc3Npb24gYXMgcmV0dXJuZWQgYnkgdGhlIHBhcnNlci4gVGhlXG4vLyBORkEgaXMgcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgb2Ygc3RhdGVzLCB3aGljaCBhcmUgdGhlbXNlbHZlc1xuLy8gYXJyYXlzIG9mIGVkZ2VzLCB3aGljaCBhcmUgYHt0ZXJtLCB0b31gIG9iamVjdHMuIFRoZSBmaXJzdCBzdGF0ZSBpc1xuLy8gdGhlIGVudHJ5IHN0YXRlIGFuZCB0aGUgbGFzdCBub2RlIGlzIHRoZSBzdWNjZXNzIHN0YXRlLlxuLy9cbi8vIE5vdGUgdGhhdCB1bmxpa2UgdHlwaWNhbCBORkFzLCB0aGUgZWRnZSBvcmRlcmluZyBpbiB0aGlzIG9uZSBpc1xuLy8gc2lnbmlmaWNhbnQsIGluIHRoYXQgaXQgaXMgdXNlZCB0byBjb250cnVjdCBmaWxsZXIgY29udGVudCB3aGVuXG4vLyBuZWNlc3NhcnkuXG5mdW5jdGlvbiBuZmEoZXhwcikge1xuICAgIGxldCBuZmEgPSBbW11dO1xuICAgIGNvbm5lY3QoY29tcGlsZShleHByLCAwKSwgbm9kZSgpKTtcbiAgICByZXR1cm4gbmZhO1xuICAgIGZ1bmN0aW9uIG5vZGUoKSB7IHJldHVybiBuZmEucHVzaChbXSkgLSAxOyB9XG4gICAgZnVuY3Rpb24gZWRnZShmcm9tLCB0bywgdGVybSkge1xuICAgICAgICBsZXQgZWRnZSA9IHsgdGVybSwgdG8gfTtcbiAgICAgICAgbmZhW2Zyb21dLnB1c2goZWRnZSk7XG4gICAgICAgIHJldHVybiBlZGdlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb25uZWN0KGVkZ2VzLCB0bykge1xuICAgICAgICBlZGdlcy5mb3JFYWNoKGVkZ2UgPT4gZWRnZS50byA9IHRvKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tcGlsZShleHByLCBmcm9tKSB7XG4gICAgICAgIGlmIChleHByLnR5cGUgPT0gXCJjaG9pY2VcIikge1xuICAgICAgICAgICAgcmV0dXJuIGV4cHIuZXhwcnMucmVkdWNlKChvdXQsIGV4cHIpID0+IG91dC5jb25jYXQoY29tcGlsZShleHByLCBmcm9tKSksIFtdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJzZXFcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGNvbXBpbGUoZXhwci5leHByc1tpXSwgZnJvbSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gZXhwci5leHBycy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgICAgICBjb25uZWN0KG5leHQsIGZyb20gPSBub2RlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4cHIudHlwZSA9PSBcInN0YXJcIikge1xuICAgICAgICAgICAgbGV0IGxvb3AgPSBub2RlKCk7XG4gICAgICAgICAgICBlZGdlKGZyb20sIGxvb3ApO1xuICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgbG9vcCksIGxvb3ApO1xuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGxvb3ApXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJwbHVzXCIpIHtcbiAgICAgICAgICAgIGxldCBsb29wID0gbm9kZSgpO1xuICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgZnJvbSksIGxvb3ApO1xuICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgbG9vcCksIGxvb3ApO1xuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGxvb3ApXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJvcHRcIikge1xuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGZyb20pXS5jb25jYXQoY29tcGlsZShleHByLmV4cHIsIGZyb20pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJyYW5nZVwiKSB7XG4gICAgICAgICAgICBsZXQgY3VyID0gZnJvbTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwci5taW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZSgpO1xuICAgICAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGN1ciksIG5leHQpO1xuICAgICAgICAgICAgICAgIGN1ciA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhwci5tYXggPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBjdXIpLCBjdXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGV4cHIubWluOyBpIDwgZXhwci5tYXg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgZWRnZShjdXIsIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBjdXIpLCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY3VyID0gbmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW2VkZ2UoY3VyKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwibmFtZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gW2VkZ2UoZnJvbSwgdW5kZWZpbmVkLCBleHByLnZhbHVlKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGV4cHIgdHlwZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNtcChhLCBiKSB7IHJldHVybiBiIC0gYTsgfVxuLy8gR2V0IHRoZSBzZXQgb2Ygbm9kZXMgcmVhY2hhYmxlIGJ5IG51bGwgZWRnZXMgZnJvbSBgbm9kZWAuIE9taXRcbi8vIG5vZGVzIHdpdGggb25seSBhIHNpbmdsZSBudWxsLW91dC1lZGdlLCBzaW5jZSB0aGV5IG1heSBsZWFkIHRvXG4vLyBuZWVkbGVzcyBkdXBsaWNhdGVkIG5vZGVzLlxuZnVuY3Rpb24gbnVsbEZyb20obmZhLCBub2RlKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIHNjYW4obm9kZSk7XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KGNtcCk7XG4gICAgZnVuY3Rpb24gc2Nhbihub2RlKSB7XG4gICAgICAgIGxldCBlZGdlcyA9IG5mYVtub2RlXTtcbiAgICAgICAgaWYgKGVkZ2VzLmxlbmd0aCA9PSAxICYmICFlZGdlc1swXS50ZXJtKVxuICAgICAgICAgICAgcmV0dXJuIHNjYW4oZWRnZXNbMF0udG8pO1xuICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgdGVybSwgdG8gfSA9IGVkZ2VzW2ldO1xuICAgICAgICAgICAgaWYgKCF0ZXJtICYmIHJlc3VsdC5pbmRleE9mKHRvKSA9PSAtMSlcbiAgICAgICAgICAgICAgICBzY2FuKHRvKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIENvbXBpbGVzIGFuIE5GQSBhcyBwcm9kdWNlZCBieSBgbmZhYCBpbnRvIGEgREZBLCBtb2RlbGVkIGFzIGEgc2V0XG4vLyBvZiBzdGF0ZSBvYmplY3RzIChgQ29udGVudE1hdGNoYCBpbnN0YW5jZXMpIHdpdGggdHJhbnNpdGlvbnNcbi8vIGJldHdlZW4gdGhlbS5cbmZ1bmN0aW9uIGRmYShuZmEpIHtcbiAgICBsZXQgbGFiZWxlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgcmV0dXJuIGV4cGxvcmUobnVsbEZyb20obmZhLCAwKSk7XG4gICAgZnVuY3Rpb24gZXhwbG9yZShzdGF0ZXMpIHtcbiAgICAgICAgbGV0IG91dCA9IFtdO1xuICAgICAgICBzdGF0ZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIG5mYVtub2RlXS5mb3JFYWNoKCh7IHRlcm0sIHRvIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRlcm0pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBsZXQgc2V0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAob3V0W2ldWzBdID09IHRlcm0pXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQgPSBvdXRbaV1bMV07XG4gICAgICAgICAgICAgICAgbnVsbEZyb20obmZhLCB0bykuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChbdGVybSwgc2V0ID0gW11dKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldC5pbmRleE9mKG5vZGUpID09IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0LnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGxhYmVsZWRbc3RhdGVzLmpvaW4oXCIsXCIpXSA9IG5ldyBDb250ZW50TWF0Y2goc3RhdGVzLmluZGV4T2YobmZhLmxlbmd0aCAtIDEpID4gLTEpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YXRlcyA9IG91dFtpXVsxXS5zb3J0KGNtcCk7XG4gICAgICAgICAgICBzdGF0ZS5uZXh0LnB1c2goeyB0eXBlOiBvdXRbaV1bMF0sIG5leHQ6IGxhYmVsZWRbc3RhdGVzLmpvaW4oXCIsXCIpXSB8fCBleHBsb3JlKHN0YXRlcykgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrRm9yRGVhZEVuZHMobWF0Y2gsIHN0cmVhbSkge1xuICAgIGZvciAobGV0IGkgPSAwLCB3b3JrID0gW21hdGNoXTsgaSA8IHdvcmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHN0YXRlID0gd29ya1tpXSwgZGVhZCA9ICFzdGF0ZS52YWxpZEVuZCwgbm9kZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdGF0ZS5uZXh0Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBzdGF0ZS5uZXh0W2pdO1xuICAgICAgICAgICAgbm9kZXMucHVzaCh0eXBlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKGRlYWQgJiYgISh0eXBlLmlzVGV4dCB8fCB0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSkpXG4gICAgICAgICAgICAgICAgZGVhZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHdvcmsuaW5kZXhPZihuZXh0KSA9PSAtMSlcbiAgICAgICAgICAgICAgICB3b3JrLnB1c2gobmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlYWQpXG4gICAgICAgICAgICBzdHJlYW0uZXJyKFwiT25seSBub24tZ2VuZXJhdGFibGUgbm9kZXMgKFwiICsgbm9kZXMuam9pbihcIiwgXCIpICsgXCIpIGluIGEgcmVxdWlyZWQgcG9zaXRpb24gKHNlZSBodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL2d1aWRlLyNnZW5lcmF0YWJsZSlcIik7XG4gICAgfVxufVxuXG4vLyBGb3Igbm9kZSB0eXBlcyB3aGVyZSBhbGwgYXR0cnMgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgKG9yIHdoaWNoIGRvbid0XG4vLyBoYXZlIGFueSBhdHRyaWJ1dGVzKSwgYnVpbGQgdXAgYSBzaW5nbGUgcmV1c2FibGUgZGVmYXVsdCBhdHRyaWJ1dGVcbi8vIG9iamVjdCwgYW5kIHVzZSBpdCBmb3IgYWxsIG5vZGVzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBzcGVjaWZpY1xuLy8gYXR0cmlidXRlcy5cbmZ1bmN0aW9uIGRlZmF1bHRBdHRycyhhdHRycykge1xuICAgIGxldCBkZWZhdWx0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgYXR0ck5hbWUgaW4gYXR0cnMpIHtcbiAgICAgICAgbGV0IGF0dHIgPSBhdHRyc1thdHRyTmFtZV07XG4gICAgICAgIGlmICghYXR0ci5oYXNEZWZhdWx0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGRlZmF1bHRzW2F0dHJOYW1lXSA9IGF0dHIuZGVmYXVsdDtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xufVxuZnVuY3Rpb24gY29tcHV0ZUF0dHJzKGF0dHJzLCB2YWx1ZSkge1xuICAgIGxldCBidWlsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycykge1xuICAgICAgICBsZXQgZ2l2ZW4gPSB2YWx1ZSAmJiB2YWx1ZVtuYW1lXTtcbiAgICAgICAgaWYgKGdpdmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBhdHRyID0gYXR0cnNbbmFtZV07XG4gICAgICAgICAgICBpZiAoYXR0ci5oYXNEZWZhdWx0KVxuICAgICAgICAgICAgICAgIGdpdmVuID0gYXR0ci5kZWZhdWx0O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIGF0dHJpYnV0ZSBcIiArIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGJ1aWx0W25hbWVdID0gZ2l2ZW47XG4gICAgfVxuICAgIHJldHVybiBidWlsdDtcbn1cbmZ1bmN0aW9uIGNoZWNrQXR0cnMoYXR0cnMsIHZhbHVlcywgdHlwZSwgbmFtZSkge1xuICAgIGZvciAobGV0IG5hbWUgaW4gdmFsdWVzKVxuICAgICAgICBpZiAoIShuYW1lIGluIGF0dHJzKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbnN1cHBvcnRlZCBhdHRyaWJ1dGUgJHtuYW1lfSBmb3IgJHt0eXBlfSBvZiB0eXBlICR7bmFtZX1gKTtcbiAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKSB7XG4gICAgICAgIGxldCBhdHRyID0gYXR0cnNbbmFtZV07XG4gICAgICAgIGlmIChhdHRyLnZhbGlkYXRlKVxuICAgICAgICAgICAgYXR0ci52YWxpZGF0ZSh2YWx1ZXNbbmFtZV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRBdHRycyh0eXBlTmFtZSwgYXR0cnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBpZiAoYXR0cnMpXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpXG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBuZXcgQXR0cmlidXRlKHR5cGVOYW1lLCBuYW1lLCBhdHRyc1tuYW1lXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuTm9kZSB0eXBlcyBhcmUgb2JqZWN0cyBhbGxvY2F0ZWQgb25jZSBwZXIgYFNjaGVtYWAgYW5kIHVzZWQgdG9cblt0YWddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlLnR5cGUpIGBOb2RlYCBpbnN0YW5jZXMuIFRoZXkgY29udGFpbiBpbmZvcm1hdGlvblxuYWJvdXQgdGhlIG5vZGUgdHlwZSwgc3VjaCBhcyBpdHMgbmFtZSBhbmQgd2hhdCBraW5kIG9mIG5vZGUgaXRcbnJlcHJlc2VudHMuXG4qL1xuY2xhc3MgTm9kZVR5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5hbWUgdGhlIG5vZGUgdHlwZSBoYXMgaW4gdGhpcyBzY2hlbWEuXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBBIGxpbmsgYmFjayB0byB0aGUgYFNjaGVtYWAgdGhlIG5vZGUgdHlwZSBiZWxvbmdzIHRvLlxuICAgICovXG4gICAgc2NoZW1hLCBcbiAgICAvKipcbiAgICBUaGUgc3BlYyB0aGF0IHRoaXMgdHlwZSBpcyBiYXNlZCBvblxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBzZXQgb2YgbWFya3MgYWxsb3dlZCBpbiB0aGlzIG5vZGUuIGBudWxsYCBtZWFucyBhbGwgbWFya3NcbiAgICAgICAgYXJlIGFsbG93ZWQuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWFya1NldCA9IG51bGw7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gc3BlYy5ncm91cCA/IHNwZWMuZ3JvdXAuc3BsaXQoXCIgXCIpIDogW107XG4gICAgICAgIHRoaXMuYXR0cnMgPSBpbml0QXR0cnMobmFtZSwgc3BlYy5hdHRycyk7XG4gICAgICAgIHRoaXMuZGVmYXVsdEF0dHJzID0gZGVmYXVsdEF0dHJzKHRoaXMuYXR0cnMpO1xuICAgICAgICB0aGlzLmNvbnRlbnRNYXRjaCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5saW5lQ29udGVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNCbG9jayA9ICEoc3BlYy5pbmxpbmUgfHwgbmFtZSA9PSBcInRleHRcIik7XG4gICAgICAgIHRoaXMuaXNUZXh0ID0gbmFtZSA9PSBcInRleHRcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ1ZSBpZiB0aGlzIGlzIGFuIGlubGluZSB0eXBlLlxuICAgICovXG4gICAgZ2V0IGlzSW5saW5lKCkgeyByZXR1cm4gIXRoaXMuaXNCbG9jazsgfVxuICAgIC8qKlxuICAgIFRydWUgaWYgdGhpcyBpcyBhIHRleHRibG9jayB0eXBlLCBhIGJsb2NrIHRoYXQgY29udGFpbnMgaW5saW5lXG4gICAgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpc1RleHRibG9jaygpIHsgcmV0dXJuIHRoaXMuaXNCbG9jayAmJiB0aGlzLmlubGluZUNvbnRlbnQ7IH1cbiAgICAvKipcbiAgICBUcnVlIGZvciBub2RlIHR5cGVzIHRoYXQgYWxsb3cgbm8gY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpc0xlYWYoKSB7IHJldHVybiB0aGlzLmNvbnRlbnRNYXRjaCA9PSBDb250ZW50TWF0Y2guZW1wdHk7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBub2RlIGlzIGFuIGF0b20sIGkuZS4gd2hlbiBpdCBkb2VzIG5vdCBoYXZlXG4gICAgZGlyZWN0bHkgZWRpdGFibGUgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpc0F0b20oKSB7IHJldHVybiB0aGlzLmlzTGVhZiB8fCAhIXRoaXMuc3BlYy5hdG9tOyB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRydWUgd2hlbiB0aGlzIG5vZGUgdHlwZSBpcyBwYXJ0IG9mIHRoZSBnaXZlblxuICAgIFtncm91cF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmdyb3VwKS5cbiAgICAqL1xuICAgIGlzSW5Hcm91cChncm91cCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHMuaW5kZXhPZihncm91cCkgPiAtMTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG5vZGUgdHlwZSdzIFt3aGl0ZXNwYWNlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMud2hpdGVzcGFjZSkgb3B0aW9uLlxuICAgICovXG4gICAgZ2V0IHdoaXRlc3BhY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwZWMud2hpdGVzcGFjZSB8fCAodGhpcy5zcGVjLmNvZGUgPyBcInByZVwiIDogXCJub3JtYWxcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoaXMgbm9kZSB0eXBlIGhhcyBhbnkgcmVxdWlyZWQgYXR0cmlidXRlcy5cbiAgICAqL1xuICAgIGhhc1JlcXVpcmVkQXR0cnMoKSB7XG4gICAgICAgIGZvciAobGV0IG4gaW4gdGhpcy5hdHRycylcbiAgICAgICAgICAgIGlmICh0aGlzLmF0dHJzW25dLmlzUmVxdWlyZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBub2RlIGFsbG93cyBzb21lIG9mIHRoZSBzYW1lIGNvbnRlbnQgYXNcbiAgICB0aGUgZ2l2ZW4gbm9kZSB0eXBlLlxuICAgICovXG4gICAgY29tcGF0aWJsZUNvbnRlbnQob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgdGhpcy5jb250ZW50TWF0Y2guY29tcGF0aWJsZShvdGhlci5jb250ZW50TWF0Y2gpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXB1dGVBdHRycyhhdHRycykge1xuICAgICAgICBpZiAoIWF0dHJzICYmIHRoaXMuZGVmYXVsdEF0dHJzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEF0dHJzO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZUF0dHJzKHRoaXMuYXR0cnMsIGF0dHJzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgYE5vZGVgIG9mIHRoaXMgdHlwZS4gVGhlIGdpdmVuIGF0dHJpYnV0ZXMgYXJlXG4gICAgY2hlY2tlZCBhbmQgZGVmYXVsdGVkICh5b3UgY2FuIHBhc3MgYG51bGxgIHRvIHVzZSB0aGUgdHlwZSdzXG4gICAgZGVmYXVsdHMgZW50aXJlbHksIGlmIG5vIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZXhpc3QpLiBgY29udGVudGBcbiAgICBtYXkgYmUgYSBgRnJhZ21lbnRgLCBhIG5vZGUsIGFuIGFycmF5IG9mIG5vZGVzLCBvclxuICAgIGBudWxsYC4gU2ltaWxhcmx5IGBtYXJrc2AgbWF5IGJlIGBudWxsYCB0byBkZWZhdWx0IHRvIHRoZSBlbXB0eVxuICAgIHNldCBvZiBtYXJrcy5cbiAgICAqL1xuICAgIGNyZWF0ZShhdHRycyA9IG51bGwsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVGV4dClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVUeXBlLmNyZWF0ZSBjYW4ndCBjb25zdHJ1Y3QgdGV4dCBub2Rlc1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIHRoaXMuY29tcHV0ZUF0dHJzKGF0dHJzKSwgRnJhZ21lbnQuZnJvbShjb250ZW50KSwgTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIExpa2UgW2BjcmVhdGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVR5cGUuY3JlYXRlKSwgYnV0IGNoZWNrIHRoZSBnaXZlbiBjb250ZW50XG4gICAgYWdhaW5zdCB0aGUgbm9kZSB0eXBlJ3MgY29udGVudCByZXN0cmljdGlvbnMsIGFuZCB0aHJvdyBhbiBlcnJvclxuICAgIGlmIGl0IGRvZXNuJ3QgbWF0Y2guXG4gICAgKi9cbiAgICBjcmVhdGVDaGVja2VkKGF0dHJzID0gbnVsbCwgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20oY29udGVudCk7XG4gICAgICAgIHRoaXMuY2hlY2tDb250ZW50KGNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgdGhpcy5jb21wdXRlQXR0cnMoYXR0cnMpLCBjb250ZW50LCBNYXJrLnNldEZyb20obWFya3MpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTGlrZSBbYGNyZWF0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlVHlwZS5jcmVhdGUpLCBidXQgc2VlIGlmIGl0IGlzXG4gICAgbmVjZXNzYXJ5IHRvIGFkZCBub2RlcyB0byB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBnaXZlbiBmcmFnbWVudFxuICAgIHRvIG1ha2UgaXQgZml0IHRoZSBub2RlLiBJZiBubyBmaXR0aW5nIHdyYXBwaW5nIGNhbiBiZSBmb3VuZCxcbiAgICByZXR1cm4gbnVsbC4gTm90ZSB0aGF0LCBkdWUgdG8gdGhlIGZhY3QgdGhhdCByZXF1aXJlZCBub2RlcyBjYW5cbiAgICBhbHdheXMgYmUgY3JlYXRlZCwgdGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkIGlmIHlvdSBwYXNzIG51bGwgb3JcbiAgICBgRnJhZ21lbnQuZW1wdHlgIGFzIGNvbnRlbnQuXG4gICAgKi9cbiAgICBjcmVhdGVBbmRGaWxsKGF0dHJzID0gbnVsbCwgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgYXR0cnMgPSB0aGlzLmNvbXB1dGVBdHRycyhhdHRycyk7XG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKGNvbnRlbnQpO1xuICAgICAgICBpZiAoY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdGhpcy5jb250ZW50TWF0Y2guZmlsbEJlZm9yZShjb250ZW50KTtcbiAgICAgICAgICAgIGlmICghYmVmb3JlKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29udGVudCA9IGJlZm9yZS5hcHBlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hdGNoZWQgPSB0aGlzLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGNvbnRlbnQpO1xuICAgICAgICBsZXQgYWZ0ZXIgPSBtYXRjaGVkICYmIG1hdGNoZWQuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSk7XG4gICAgICAgIGlmICghYWZ0ZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIGF0dHJzLCBjb250ZW50LmFwcGVuZChhZnRlciksIE1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGZyYWdtZW50IGlzIHZhbGlkIGNvbnRlbnQgZm9yIHRoaXMgbm9kZVxuICAgIHR5cGUuXG4gICAgKi9cbiAgICB2YWxpZENvbnRlbnQoY29udGVudCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5jb250ZW50TWF0Y2gubWF0Y2hGcmFnbWVudChjb250ZW50KTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC52YWxpZEVuZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50LmNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd3NNYXJrcyhjb250ZW50LmNoaWxkKGkpLm1hcmtzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaHJvd3MgYSBSYW5nZUVycm9yIGlmIHRoZSBnaXZlbiBmcmFnbWVudCBpcyBub3QgdmFsaWQgY29udGVudCBmb3IgdGhpc1xuICAgIG5vZGUgdHlwZS5cbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNoZWNrQ29udGVudChjb250ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZENvbnRlbnQoY29udGVudCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBjb250ZW50IGZvciBub2RlICR7dGhpcy5uYW1lfTogJHtjb250ZW50LnRvU3RyaW5nKCkuc2xpY2UoMCwgNTApfWApO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNoZWNrQXR0cnMoYXR0cnMpIHtcbiAgICAgICAgY2hlY2tBdHRycyh0aGlzLmF0dHJzLCBhdHRycywgXCJub2RlXCIsIHRoaXMubmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG1hcmsgdHlwZSBpcyBhbGxvd2VkIGluIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIGFsbG93c01hcmtUeXBlKG1hcmtUeXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcmtTZXQgPT0gbnVsbCB8fCB0aGlzLm1hcmtTZXQuaW5kZXhPZihtYXJrVHlwZSkgPiAtMTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MgYXJlIGFsbG93ZWQgaW4gdGhpcyBub2RlLlxuICAgICovXG4gICAgYWxsb3dzTWFya3MobWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMubWFya1NldCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dzTWFya1R5cGUobWFya3NbaV0udHlwZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlcyB0aGUgbWFya3MgdGhhdCBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBub2RlIGZyb20gdGhlIGdpdmVuIHNldC5cbiAgICAqL1xuICAgIGFsbG93ZWRNYXJrcyhtYXJrcykge1xuICAgICAgICBpZiAodGhpcy5tYXJrU2V0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbWFya3M7XG4gICAgICAgIGxldCBjb3B5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dzTWFya1R5cGUobWFya3NbaV0udHlwZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvcHkpXG4gICAgICAgICAgICAgICAgICAgIGNvcHkgPSBtYXJrcy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvcHkpIHtcbiAgICAgICAgICAgICAgICBjb3B5LnB1c2gobWFya3NbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhY29weSA/IG1hcmtzIDogY29weS5sZW5ndGggPyBjb3B5IDogTWFyay5ub25lO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjb21waWxlKG5vZGVzLCBzY2hlbWEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIG5vZGVzLmZvckVhY2goKG5hbWUsIHNwZWMpID0+IHJlc3VsdFtuYW1lXSA9IG5ldyBOb2RlVHlwZShuYW1lLCBzY2hlbWEsIHNwZWMpKTtcbiAgICAgICAgbGV0IHRvcFR5cGUgPSBzY2hlbWEuc3BlYy50b3BOb2RlIHx8IFwiZG9jXCI7XG4gICAgICAgIGlmICghcmVzdWx0W3RvcFR5cGVdKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJTY2hlbWEgaXMgbWlzc2luZyBpdHMgdG9wIG5vZGUgdHlwZSAoJ1wiICsgdG9wVHlwZSArIFwiJylcIik7XG4gICAgICAgIGlmICghcmVzdWx0LnRleHQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkV2ZXJ5IHNjaGVtYSBuZWVkcyBhICd0ZXh0JyB0eXBlXCIpO1xuICAgICAgICBmb3IgKGxldCBfIGluIHJlc3VsdC50ZXh0LmF0dHJzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgdGV4dCBub2RlIHR5cGUgc2hvdWxkIG5vdCBoYXZlIGF0dHJpYnV0ZXNcIik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVUeXBlKHR5cGVOYW1lLCBhdHRyTmFtZSwgdHlwZSkge1xuICAgIGxldCB0eXBlcyA9IHR5cGUuc3BsaXQoXCJ8XCIpO1xuICAgIHJldHVybiAodmFsdWUpID0+IHtcbiAgICAgICAgbGV0IG5hbWUgPSB2YWx1ZSA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHZhbHVlO1xuICAgICAgICBpZiAodHlwZXMuaW5kZXhPZihuYW1lKSA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRXhwZWN0ZWQgdmFsdWUgb2YgdHlwZSAke3R5cGVzfSBmb3IgYXR0cmlidXRlICR7YXR0ck5hbWV9IG9uIHR5cGUgJHt0eXBlTmFtZX0sIGdvdCAke25hbWV9YCk7XG4gICAgfTtcbn1cbi8vIEF0dHJpYnV0ZSBkZXNjcmlwdG9yc1xuY2xhc3MgQXR0cmlidXRlIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlTmFtZSwgYXR0ck5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5oYXNEZWZhdWx0ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsIFwiZGVmYXVsdFwiKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gb3B0aW9ucy5kZWZhdWx0O1xuICAgICAgICB0aGlzLnZhbGlkYXRlID0gdHlwZW9mIG9wdGlvbnMudmFsaWRhdGUgPT0gXCJzdHJpbmdcIiA/IHZhbGlkYXRlVHlwZSh0eXBlTmFtZSwgYXR0ck5hbWUsIG9wdGlvbnMudmFsaWRhdGUpIDogb3B0aW9ucy52YWxpZGF0ZTtcbiAgICB9XG4gICAgZ2V0IGlzUmVxdWlyZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5oYXNEZWZhdWx0O1xuICAgIH1cbn1cbi8vIE1hcmtzXG4vKipcbkxpa2Ugbm9kZXMsIG1hcmtzICh3aGljaCBhcmUgYXNzb2NpYXRlZCB3aXRoIG5vZGVzIHRvIHNpZ25pZnlcbnRoaW5ncyBsaWtlIGVtcGhhc2lzIG9yIGJlaW5nIHBhcnQgb2YgYSBsaW5rKSBhcmVcblt0YWdnZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrLnR5cGUpIHdpdGggdHlwZSBvYmplY3RzLCB3aGljaCBhcmVcbmluc3RhbnRpYXRlZCBvbmNlIHBlciBgU2NoZW1hYC5cbiovXG5jbGFzcyBNYXJrVHlwZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSBvZiB0aGUgbWFyayB0eXBlLlxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByYW5rLCBcbiAgICAvKipcbiAgICBUaGUgc2NoZW1hIHRoYXQgdGhpcyBtYXJrIHR5cGUgaW5zdGFuY2UgaXMgcGFydCBvZi5cbiAgICAqL1xuICAgIHNjaGVtYSwgXG4gICAgLyoqXG4gICAgVGhlIHNwZWMgb24gd2hpY2ggdGhlIHR5cGUgaXMgYmFzZWQuXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMucmFuayA9IHJhbms7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgICAgICB0aGlzLmF0dHJzID0gaW5pdEF0dHJzKG5hbWUsIHNwZWMuYXR0cnMpO1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkID0gbnVsbDtcbiAgICAgICAgbGV0IGRlZmF1bHRzID0gZGVmYXVsdEF0dHJzKHRoaXMuYXR0cnMpO1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gZGVmYXVsdHMgPyBuZXcgTWFyayh0aGlzLCBkZWZhdWx0cykgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrIG9mIHRoaXMgdHlwZS4gYGF0dHJzYCBtYXkgYmUgYG51bGxgIG9yIGFuIG9iamVjdFxuICAgIGNvbnRhaW5pbmcgb25seSBzb21lIG9mIHRoZSBtYXJrJ3MgYXR0cmlidXRlcy4gVGhlIG90aGVycywgaWZcbiAgICB0aGV5IGhhdmUgZGVmYXVsdHMsIHdpbGwgYmUgYWRkZWQuXG4gICAgKi9cbiAgICBjcmVhdGUoYXR0cnMgPSBudWxsKSB7XG4gICAgICAgIGlmICghYXR0cnMgJiYgdGhpcy5pbnN0YW5jZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICAgICAgICByZXR1cm4gbmV3IE1hcmsodGhpcywgY29tcHV0ZUF0dHJzKHRoaXMuYXR0cnMsIGF0dHJzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNvbXBpbGUobWFya3MsIHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKSwgcmFuayA9IDA7XG4gICAgICAgIG1hcmtzLmZvckVhY2goKG5hbWUsIHNwZWMpID0+IHJlc3VsdFtuYW1lXSA9IG5ldyBNYXJrVHlwZShuYW1lLCByYW5rKyssIHNjaGVtYSwgc3BlYykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBXaGVuIHRoZXJlIGlzIGEgbWFyayBvZiB0aGlzIHR5cGUgaW4gdGhlIGdpdmVuIHNldCwgYSBuZXcgc2V0XG4gICAgd2l0aG91dCBpdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgaW5wdXQgc2V0IGlzIHJldHVybmVkLlxuICAgICovXG4gICAgcmVtb3ZlRnJvbVNldChzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoc2V0W2ldLnR5cGUgPT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHNldCA9IHNldC5zbGljZSgwLCBpKS5jb25jYXQoc2V0LnNsaWNlKGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIGEgbWFyayBvZiB0aGlzIHR5cGUgaW4gdGhlIGdpdmVuIHNldC5cbiAgICAqL1xuICAgIGlzSW5TZXQoc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHNldFtpXS50eXBlID09IHRoaXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFtpXTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGVja0F0dHJzKGF0dHJzKSB7XG4gICAgICAgIGNoZWNrQXR0cnModGhpcy5hdHRycywgYXR0cnMsIFwibWFya1wiLCB0aGlzLm5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBRdWVyaWVzIHdoZXRoZXIgYSBnaXZlbiBtYXJrIHR5cGUgaXNcbiAgICBbZXhjbHVkZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrU3BlYy5leGNsdWRlcykgYnkgdGhpcyBvbmUuXG4gICAgKi9cbiAgICBleGNsdWRlcyhvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5leGNsdWRlZC5pbmRleE9mKG90aGVyKSA+IC0xO1xuICAgIH1cbn1cbi8qKlxuQSBkb2N1bWVudCBzY2hlbWEuIEhvbGRzIFtub2RlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVR5cGUpIGFuZCBbbWFya1xudHlwZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmtUeXBlKSBvYmplY3RzIGZvciB0aGUgbm9kZXMgYW5kIG1hcmtzIHRoYXQgbWF5XG5vY2N1ciBpbiBjb25mb3JtaW5nIGRvY3VtZW50cywgYW5kIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yXG5jcmVhdGluZyBhbmQgZGVzZXJpYWxpemluZyBzdWNoIGRvY3VtZW50cy5cblxuV2hlbiBnaXZlbiwgdGhlIHR5cGUgcGFyYW1ldGVycyBwcm92aWRlIHRoZSBuYW1lcyBvZiB0aGUgbm9kZXMgYW5kXG5tYXJrcyBpbiB0aGlzIHNjaGVtYS5cbiovXG5jbGFzcyBTY2hlbWEge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIHNjaGVtYSBmcm9tIGEgc2NoZW1hIFtzcGVjaWZpY2F0aW9uXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuU2NoZW1hU3BlYykuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgW2xpbmVicmVha1xuICAgICAgICByZXBsYWNlbWVudF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmxpbmVicmVha1JlcGxhY2VtZW50KSBub2RlIGRlZmluZWRcbiAgICAgICAgaW4gdGhpcyBzY2hlbWEsIGlmIGFueS5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5saW5lYnJlYWtSZXBsYWNlbWVudCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBBbiBvYmplY3QgZm9yIHN0b3Jpbmcgd2hhdGV2ZXIgdmFsdWVzIG1vZHVsZXMgbWF5IHdhbnQgdG9cbiAgICAgICAgY29tcHV0ZSBhbmQgY2FjaGUgcGVyIHNjaGVtYS4gKElmIHlvdSB3YW50IHRvIHN0b3JlIHNvbWV0aGluZ1xuICAgICAgICBpbiBpdCwgdHJ5IHRvIHVzZSBwcm9wZXJ0eSBuYW1lcyB1bmxpa2VseSB0byBjbGFzaC4pXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY2FjaGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IGluc3RhbmNlU3BlYyA9IHRoaXMuc3BlYyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIHNwZWMpXG4gICAgICAgICAgICBpbnN0YW5jZVNwZWNbcHJvcF0gPSBzcGVjW3Byb3BdO1xuICAgICAgICBpbnN0YW5jZVNwZWMubm9kZXMgPSBPcmRlcmVkTWFwLmZyb20oc3BlYy5ub2RlcyksXG4gICAgICAgICAgICBpbnN0YW5jZVNwZWMubWFya3MgPSBPcmRlcmVkTWFwLmZyb20oc3BlYy5tYXJrcyB8fCB7fSksXG4gICAgICAgICAgICB0aGlzLm5vZGVzID0gTm9kZVR5cGUuY29tcGlsZSh0aGlzLnNwZWMubm9kZXMsIHRoaXMpO1xuICAgICAgICB0aGlzLm1hcmtzID0gTWFya1R5cGUuY29tcGlsZSh0aGlzLnNwZWMubWFya3MsIHRoaXMpO1xuICAgICAgICBsZXQgY29udGVudEV4cHJDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgaWYgKHByb3AgaW4gdGhpcy5tYXJrcylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihwcm9wICsgXCIgY2FuIG5vdCBiZSBib3RoIGEgbm9kZSBhbmQgYSBtYXJrXCIpO1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0aGlzLm5vZGVzW3Byb3BdLCBjb250ZW50RXhwciA9IHR5cGUuc3BlYy5jb250ZW50IHx8IFwiXCIsIG1hcmtFeHByID0gdHlwZS5zcGVjLm1hcmtzO1xuICAgICAgICAgICAgdHlwZS5jb250ZW50TWF0Y2ggPSBjb250ZW50RXhwckNhY2hlW2NvbnRlbnRFeHByXSB8fFxuICAgICAgICAgICAgICAgIChjb250ZW50RXhwckNhY2hlW2NvbnRlbnRFeHByXSA9IENvbnRlbnRNYXRjaC5wYXJzZShjb250ZW50RXhwciwgdGhpcy5ub2RlcykpO1xuICAgICAgICAgICAgdHlwZS5pbmxpbmVDb250ZW50ID0gdHlwZS5jb250ZW50TWF0Y2guaW5saW5lQ29udGVudDtcbiAgICAgICAgICAgIGlmICh0eXBlLnNwZWMubGluZWJyZWFrUmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5saW5lYnJlYWtSZXBsYWNlbWVudClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdWx0aXBsZSBsaW5lYnJlYWsgbm9kZXMgZGVmaW5lZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuaXNJbmxpbmUgfHwgIXR5cGUuaXNMZWFmKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkxpbmVicmVhayByZXBsYWNlbWVudCBub2RlcyBtdXN0IGJlIGlubGluZSBsZWFmIG5vZGVzXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMubGluZWJyZWFrUmVwbGFjZW1lbnQgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHlwZS5tYXJrU2V0ID0gbWFya0V4cHIgPT0gXCJfXCIgPyBudWxsIDpcbiAgICAgICAgICAgICAgICBtYXJrRXhwciA/IGdhdGhlck1hcmtzKHRoaXMsIG1hcmtFeHByLnNwbGl0KFwiIFwiKSkgOlxuICAgICAgICAgICAgICAgICAgICBtYXJrRXhwciA9PSBcIlwiIHx8ICF0eXBlLmlubGluZUNvbnRlbnQgPyBbXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0aGlzLm1hcmtzKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMubWFya3NbcHJvcF0sIGV4Y2wgPSB0eXBlLnNwZWMuZXhjbHVkZXM7XG4gICAgICAgICAgICB0eXBlLmV4Y2x1ZGVkID0gZXhjbCA9PSBudWxsID8gW3R5cGVdIDogZXhjbCA9PSBcIlwiID8gW10gOiBnYXRoZXJNYXJrcyh0aGlzLCBleGNsLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlRnJvbUpTT04gPSBqc29uID0+IE5vZGUuZnJvbUpTT04odGhpcywganNvbik7XG4gICAgICAgIHRoaXMubWFya0Zyb21KU09OID0ganNvbiA9PiBNYXJrLmZyb21KU09OKHRoaXMsIGpzb24pO1xuICAgICAgICB0aGlzLnRvcE5vZGVUeXBlID0gdGhpcy5ub2Rlc1t0aGlzLnNwZWMudG9wTm9kZSB8fCBcImRvY1wiXTtcbiAgICAgICAgdGhpcy5jYWNoZWQud3JhcHBpbmdzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBpbiB0aGlzIHNjaGVtYS4gVGhlIGB0eXBlYCBtYXkgYmUgYSBzdHJpbmcgb3IgYVxuICAgIGBOb2RlVHlwZWAgaW5zdGFuY2UuIEF0dHJpYnV0ZXMgd2lsbCBiZSBleHRlbmRlZCB3aXRoIGRlZmF1bHRzLFxuICAgIGBjb250ZW50YCBtYXkgYmUgYSBgRnJhZ21lbnRgLCBgbnVsbGAsIGEgYE5vZGVgLCBvciBhbiBhcnJheSBvZlxuICAgIG5vZGVzLlxuICAgICovXG4gICAgbm9kZSh0eXBlLCBhdHRycyA9IG51bGwsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdHlwZSA9IHRoaXMubm9kZVR5cGUodHlwZSk7XG4gICAgICAgIGVsc2UgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5vZGVUeXBlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBub2RlIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUuc2NoZW1hICE9IHRoaXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vZGUgdHlwZSBmcm9tIGRpZmZlcmVudCBzY2hlbWEgdXNlZCAoXCIgKyB0eXBlLm5hbWUgKyBcIilcIik7XG4gICAgICAgIHJldHVybiB0eXBlLmNyZWF0ZUNoZWNrZWQoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdGV4dCBub2RlIGluIHRoZSBzY2hlbWEuIEVtcHR5IHRleHQgbm9kZXMgYXJlIG5vdFxuICAgIGFsbG93ZWQuXG4gICAgKi9cbiAgICB0ZXh0KHRleHQsIG1hcmtzKSB7XG4gICAgICAgIGxldCB0eXBlID0gdGhpcy5ub2Rlcy50ZXh0O1xuICAgICAgICByZXR1cm4gbmV3IFRleHROb2RlKHR5cGUsIHR5cGUuZGVmYXVsdEF0dHJzLCB0ZXh0LCBNYXJrLnNldEZyb20obWFya3MpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBhdHRyaWJ1dGVzLlxuICAgICovXG4gICAgbWFyayh0eXBlLCBhdHRycykge1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHR5cGUgPSB0aGlzLm1hcmtzW3R5cGVdO1xuICAgICAgICByZXR1cm4gdHlwZS5jcmVhdGUoYXR0cnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG5vZGVUeXBlKG5hbWUpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gdGhpcy5ub2Rlc1tuYW1lXTtcbiAgICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVW5rbm93biBub2RlIHR5cGU6IFwiICsgbmFtZSk7XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG59XG5mdW5jdGlvbiBnYXRoZXJNYXJrcyhzY2hlbWEsIG1hcmtzKSB7XG4gICAgbGV0IGZvdW5kID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbmFtZSA9IG1hcmtzW2ldLCBtYXJrID0gc2NoZW1hLm1hcmtzW25hbWVdLCBvayA9IG1hcms7XG4gICAgICAgIGlmIChtYXJrKSB7XG4gICAgICAgICAgICBmb3VuZC5wdXNoKG1hcmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzY2hlbWEubWFya3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFyayA9IHNjaGVtYS5tYXJrc1twcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBcIl9cIiB8fCAobWFyay5zcGVjLmdyb3VwICYmIG1hcmsuc3BlYy5ncm91cC5zcGxpdChcIiBcIikuaW5kZXhPZihuYW1lKSA+IC0xKSlcbiAgICAgICAgICAgICAgICAgICAgZm91bmQucHVzaChvayA9IG1hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghb2spXG4gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJVbmtub3duIG1hcmsgdHlwZTogJ1wiICsgbWFya3NbaV0gKyBcIidcIik7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gaXNUYWdSdWxlKHJ1bGUpIHsgcmV0dXJuIHJ1bGUudGFnICE9IG51bGw7IH1cbmZ1bmN0aW9uIGlzU3R5bGVSdWxlKHJ1bGUpIHsgcmV0dXJuIHJ1bGUuc3R5bGUgIT0gbnVsbDsgfVxuLyoqXG5BIERPTSBwYXJzZXIgcmVwcmVzZW50cyBhIHN0cmF0ZWd5IGZvciBwYXJzaW5nIERPTSBjb250ZW50IGludG8gYVxuUHJvc2VNaXJyb3IgZG9jdW1lbnQgY29uZm9ybWluZyB0byBhIGdpdmVuIHNjaGVtYS4gSXRzIGJlaGF2aW9yIGlzXG5kZWZpbmVkIGJ5IGFuIGFycmF5IG9mIFtydWxlc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlBhcnNlUnVsZSkuXG4qL1xuY2xhc3MgRE9NUGFyc2VyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBwYXJzZXIgdGhhdCB0YXJnZXRzIHRoZSBnaXZlbiBzY2hlbWEsIHVzaW5nIHRoZSBnaXZlblxuICAgIHBhcnNpbmcgcnVsZXMuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc2NoZW1hIGludG8gd2hpY2ggdGhlIHBhcnNlciBwYXJzZXMuXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoZSBzZXQgb2YgW3BhcnNlIHJ1bGVzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuUGFyc2VSdWxlKSB0aGF0IHRoZSBwYXJzZXJcbiAgICB1c2VzLCBpbiBvcmRlciBvZiBwcmVjZWRlbmNlLlxuICAgICovXG4gICAgcnVsZXMpIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMucnVsZXMgPSBydWxlcztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhZ3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0eWxlcyA9IFtdO1xuICAgICAgICBsZXQgbWF0Y2hlZFN0eWxlcyA9IHRoaXMubWF0Y2hlZFN0eWxlcyA9IFtdO1xuICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgaWYgKGlzVGFnUnVsZShydWxlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGFncy5wdXNoKHJ1bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNTdHlsZVJ1bGUocnVsZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcCA9IC9bXj1dKi8uZXhlYyhydWxlLnN0eWxlKVswXTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZFN0eWxlcy5pbmRleE9mKHByb3ApIDwgMClcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFN0eWxlcy5wdXNoKHByb3ApO1xuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbmx5IG5vcm1hbGl6ZSBsaXN0IGVsZW1lbnRzIHdoZW4gbGlzdHMgaW4gdGhlIHNjaGVtYSBjYW4ndCBkaXJlY3RseSBjb250YWluIHRoZW1zZWx2ZXNcbiAgICAgICAgdGhpcy5ub3JtYWxpemVMaXN0cyA9ICF0aGlzLnRhZ3Muc29tZShyID0+IHtcbiAgICAgICAgICAgIGlmICghL14odWx8b2wpXFxiLy50ZXN0KHIudGFnKSB8fCAhci5ub2RlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBub2RlID0gc2NoZW1hLm5vZGVzW3Iubm9kZV07XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jb250ZW50TWF0Y2gubWF0Y2hUeXBlKG5vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUGFyc2UgYSBkb2N1bWVudCBmcm9tIHRoZSBjb250ZW50IG9mIGEgRE9NIG5vZGUuXG4gICAgKi9cbiAgICBwYXJzZShkb20sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgY29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQodGhpcywgb3B0aW9ucywgZmFsc2UpO1xuICAgICAgICBjb250ZXh0LmFkZEFsbChkb20sIE1hcmsubm9uZSwgb3B0aW9ucy5mcm9tLCBvcHRpb25zLnRvKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZmluaXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFBhcnNlcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gRE9NIG5vZGUsIGxpa2VcbiAgICBbYHBhcnNlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLkRPTVBhcnNlci5wYXJzZSksIGFuZCB0YWtlcyB0aGUgc2FtZSBzZXQgb2ZcbiAgICBvcHRpb25zLiBCdXQgdW5saWtlIHRoYXQgbWV0aG9kLCB3aGljaCBwcm9kdWNlcyBhIHdob2xlIG5vZGUsXG4gICAgdGhpcyBvbmUgcmV0dXJucyBhIHNsaWNlIHRoYXQgaXMgb3BlbiBhdCB0aGUgc2lkZXMsIG1lYW5pbmcgdGhhdFxuICAgIHRoZSBzY2hlbWEgY29uc3RyYWludHMgYXJlbid0IGFwcGxpZWQgdG8gdGhlIHN0YXJ0IG9mIG5vZGVzIHRvXG4gICAgdGhlIGxlZnQgb2YgdGhlIGlucHV0IGFuZCB0aGUgZW5kIG9mIG5vZGVzIGF0IHRoZSBlbmQuXG4gICAgKi9cbiAgICBwYXJzZVNsaWNlKGRvbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBjb250ZXh0ID0gbmV3IFBhcnNlQ29udGV4dCh0aGlzLCBvcHRpb25zLCB0cnVlKTtcbiAgICAgICAgY29udGV4dC5hZGRBbGwoZG9tLCBNYXJrLm5vbmUsIG9wdGlvbnMuZnJvbSwgb3B0aW9ucy50byk7XG4gICAgICAgIHJldHVybiBTbGljZS5tYXhPcGVuKGNvbnRleHQuZmluaXNoKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hdGNoVGFnKGRvbSwgY29udGV4dCwgYWZ0ZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFmdGVyID8gdGhpcy50YWdzLmluZGV4T2YoYWZ0ZXIpICsgMSA6IDA7IGkgPCB0aGlzLnRhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBydWxlID0gdGhpcy50YWdzW2ldO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMoZG9tLCBydWxlLnRhZykgJiZcbiAgICAgICAgICAgICAgICAocnVsZS5uYW1lc3BhY2UgPT09IHVuZGVmaW5lZCB8fCBkb20ubmFtZXNwYWNlVVJJID09IHJ1bGUubmFtZXNwYWNlKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZS5jb250ZXh0IHx8IGNvbnRleHQubWF0Y2hlc0NvbnRleHQocnVsZS5jb250ZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5nZXRBdHRycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcnVsZS5nZXRBdHRycyhkb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBydWxlLmF0dHJzID0gcmVzdWx0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXRjaFN0eWxlKHByb3AsIHZhbHVlLCBjb250ZXh0LCBhZnRlcikge1xuICAgICAgICBmb3IgKGxldCBpID0gYWZ0ZXIgPyB0aGlzLnN0eWxlcy5pbmRleE9mKGFmdGVyKSArIDEgOiAwOyBpIDwgdGhpcy5zdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBydWxlID0gdGhpcy5zdHlsZXNbaV0sIHN0eWxlID0gcnVsZS5zdHlsZTtcbiAgICAgICAgICAgIGlmIChzdHlsZS5pbmRleE9mKHByb3ApICE9IDAgfHxcbiAgICAgICAgICAgICAgICBydWxlLmNvbnRleHQgJiYgIWNvbnRleHQubWF0Y2hlc0NvbnRleHQocnVsZS5jb250ZXh0KSB8fFxuICAgICAgICAgICAgICAgIC8vIFRlc3QgdGhhdCB0aGUgc3R5bGUgc3RyaW5nIGVpdGhlciBwcmVjaXNlbHkgbWF0Y2hlcyB0aGUgcHJvcCxcbiAgICAgICAgICAgICAgICAvLyBvciBoYXMgYW4gJz0nIHNpZ24gYWZ0ZXIgdGhlIHByb3AsIGZvbGxvd2VkIGJ5IHRoZSBnaXZlblxuICAgICAgICAgICAgICAgIC8vIHZhbHVlLlxuICAgICAgICAgICAgICAgIHN0eWxlLmxlbmd0aCA+IHByb3AubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIChzdHlsZS5jaGFyQ29kZUF0KHByb3AubGVuZ3RoKSAhPSA2MSB8fCBzdHlsZS5zbGljZShwcm9wLmxlbmd0aCArIDEpICE9IHZhbHVlKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChydWxlLmdldEF0dHJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJ1bGUuZ2V0QXR0cnModmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBydWxlLmF0dHJzID0gcmVzdWx0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydWxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHNjaGVtYVJ1bGVzKHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZ1bmN0aW9uIGluc2VydChydWxlKSB7XG4gICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBydWxlLnByaW9yaXR5ID09IG51bGwgPyA1MCA6IHJ1bGUucHJpb3JpdHksIGkgPSAwO1xuICAgICAgICAgICAgZm9yICg7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHJlc3VsdFtpXSwgbmV4dFByaW9yaXR5ID0gbmV4dC5wcmlvcml0eSA9PSBudWxsID8gNTAgOiBuZXh0LnByaW9yaXR5O1xuICAgICAgICAgICAgICAgIGlmIChuZXh0UHJpb3JpdHkgPCBwcmlvcml0eSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKGksIDAsIHJ1bGUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gc2NoZW1hLm1hcmtzKSB7XG4gICAgICAgICAgICBsZXQgcnVsZXMgPSBzY2hlbWEubWFya3NbbmFtZV0uc3BlYy5wYXJzZURPTTtcbiAgICAgICAgICAgIGlmIChydWxlcylcbiAgICAgICAgICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnQocnVsZSA9IGNvcHkocnVsZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShydWxlLm1hcmsgfHwgcnVsZS5pZ25vcmUgfHwgcnVsZS5jbGVhck1hcmspKVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS5tYXJrID0gbmFtZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHNjaGVtYS5ub2Rlcykge1xuICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2NoZW1hLm5vZGVzW25hbWVdLnNwZWMucGFyc2VET007XG4gICAgICAgICAgICBpZiAocnVsZXMpXG4gICAgICAgICAgICAgICAgcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0KHJ1bGUgPSBjb3B5KHJ1bGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocnVsZS5ub2RlIHx8IHJ1bGUuaWdub3JlIHx8IHJ1bGUubWFyaykpXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlLm5vZGUgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIERPTSBwYXJzZXIgdXNpbmcgdGhlIHBhcnNpbmcgcnVsZXMgbGlzdGVkIGluIGFcbiAgICBzY2hlbWEncyBbbm9kZSBzcGVjc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLnBhcnNlRE9NKSwgcmVvcmRlcmVkIGJ5XG4gICAgW3ByaW9yaXR5XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuR2VuZXJpY1BhcnNlUnVsZS5wcmlvcml0eSkuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5jYWNoZWQuZG9tUGFyc2VyIHx8XG4gICAgICAgICAgICAoc2NoZW1hLmNhY2hlZC5kb21QYXJzZXIgPSBuZXcgRE9NUGFyc2VyKHNjaGVtYSwgRE9NUGFyc2VyLnNjaGVtYVJ1bGVzKHNjaGVtYSkpKTtcbiAgICB9XG59XG5jb25zdCBibG9ja1RhZ3MgPSB7XG4gICAgYWRkcmVzczogdHJ1ZSwgYXJ0aWNsZTogdHJ1ZSwgYXNpZGU6IHRydWUsIGJsb2NrcXVvdGU6IHRydWUsIGNhbnZhczogdHJ1ZSxcbiAgICBkZDogdHJ1ZSwgZGl2OiB0cnVlLCBkbDogdHJ1ZSwgZmllbGRzZXQ6IHRydWUsIGZpZ2NhcHRpb246IHRydWUsIGZpZ3VyZTogdHJ1ZSxcbiAgICBmb290ZXI6IHRydWUsIGZvcm06IHRydWUsIGgxOiB0cnVlLCBoMjogdHJ1ZSwgaDM6IHRydWUsIGg0OiB0cnVlLCBoNTogdHJ1ZSxcbiAgICBoNjogdHJ1ZSwgaGVhZGVyOiB0cnVlLCBoZ3JvdXA6IHRydWUsIGhyOiB0cnVlLCBsaTogdHJ1ZSwgbm9zY3JpcHQ6IHRydWUsIG9sOiB0cnVlLFxuICAgIG91dHB1dDogdHJ1ZSwgcDogdHJ1ZSwgcHJlOiB0cnVlLCBzZWN0aW9uOiB0cnVlLCB0YWJsZTogdHJ1ZSwgdGZvb3Q6IHRydWUsIHVsOiB0cnVlXG59O1xuY29uc3QgaWdub3JlVGFncyA9IHtcbiAgICBoZWFkOiB0cnVlLCBub3NjcmlwdDogdHJ1ZSwgb2JqZWN0OiB0cnVlLCBzY3JpcHQ6IHRydWUsIHN0eWxlOiB0cnVlLCB0aXRsZTogdHJ1ZVxufTtcbmNvbnN0IGxpc3RUYWdzID0geyBvbDogdHJ1ZSwgdWw6IHRydWUgfTtcbi8vIFVzaW5nIGEgYml0ZmllbGQgZm9yIG5vZGUgY29udGV4dCBvcHRpb25zXG5jb25zdCBPUFRfUFJFU0VSVkVfV1MgPSAxLCBPUFRfUFJFU0VSVkVfV1NfRlVMTCA9IDIsIE9QVF9PUEVOX0xFRlQgPSA0O1xuZnVuY3Rpb24gd3NPcHRpb25zRm9yKHR5cGUsIHByZXNlcnZlV2hpdGVzcGFjZSwgYmFzZSkge1xuICAgIGlmIChwcmVzZXJ2ZVdoaXRlc3BhY2UgIT0gbnVsbClcbiAgICAgICAgcmV0dXJuIChwcmVzZXJ2ZVdoaXRlc3BhY2UgPyBPUFRfUFJFU0VSVkVfV1MgOiAwKSB8XG4gICAgICAgICAgICAocHJlc2VydmVXaGl0ZXNwYWNlID09PSBcImZ1bGxcIiA/IE9QVF9QUkVTRVJWRV9XU19GVUxMIDogMCk7XG4gICAgcmV0dXJuIHR5cGUgJiYgdHlwZS53aGl0ZXNwYWNlID09IFwicHJlXCIgPyBPUFRfUFJFU0VSVkVfV1MgfCBPUFRfUFJFU0VSVkVfV1NfRlVMTCA6IGJhc2UgJiB+T1BUX09QRU5fTEVGVDtcbn1cbmNsYXNzIE5vZGVDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBhdHRycywgbWFya3MsIHNvbGlkLCBtYXRjaCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMubWFya3MgPSBtYXJrcztcbiAgICAgICAgdGhpcy5zb2xpZCA9IHNvbGlkO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBbXTtcbiAgICAgICAgLy8gTWFya3MgYXBwbGllZCB0byB0aGUgbm9kZSdzIGNoaWxkcmVuXG4gICAgICAgIHRoaXMuYWN0aXZlTWFya3MgPSBNYXJrLm5vbmU7XG4gICAgICAgIHRoaXMubWF0Y2ggPSBtYXRjaCB8fCAob3B0aW9ucyAmIE9QVF9PUEVOX0xFRlQgPyBudWxsIDogdHlwZS5jb250ZW50TWF0Y2gpO1xuICAgIH1cbiAgICBmaW5kV3JhcHBpbmcobm9kZSkge1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2gpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIGxldCBmaWxsID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgICAgICAgICAgaWYgKGZpbGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGZpbGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaCwgd3JhcDtcbiAgICAgICAgICAgICAgICBpZiAod3JhcCA9IHN0YXJ0LmZpbmRXcmFwcGluZyhub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggPSBzdGFydDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2guZmluZFdyYXBwaW5nKG5vZGUudHlwZSk7XG4gICAgfVxuICAgIGZpbmlzaChvcGVuRW5kKSB7XG4gICAgICAgIGlmICghKHRoaXMub3B0aW9ucyAmIE9QVF9QUkVTRVJWRV9XUykpIHsgLy8gU3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdLCBtO1xuICAgICAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC5pc1RleHQgJiYgKG0gPSAvWyBcXHRcXHJcXG5cXHUwMDBjXSskLy5leGVjKGxhc3QudGV4dCkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHQgPSBsYXN0O1xuICAgICAgICAgICAgICAgIGlmIChsYXN0LnRleHQubGVuZ3RoID09IG1bMF0ubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQucG9wKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdID0gdGV4dC53aXRoVGV4dCh0ZXh0LnRleHQuc2xpY2UoMCwgdGV4dC50ZXh0Lmxlbmd0aCAtIG1bMF0ubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHRoaXMuY29udGVudCk7XG4gICAgICAgIGlmICghb3BlbkVuZCAmJiB0aGlzLm1hdGNoKVxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuYXBwZW5kKHRoaXMubWF0Y2guZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID8gdGhpcy50eXBlLmNyZWF0ZSh0aGlzLmF0dHJzLCBjb250ZW50LCB0aGlzLm1hcmtzKSA6IGNvbnRlbnQ7XG4gICAgfVxuICAgIGlubGluZUNvbnRleHQobm9kZSkge1xuICAgICAgICBpZiAodGhpcy50eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5pbmxpbmVDb250ZW50O1xuICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRbMF0uaXNJbmxpbmU7XG4gICAgICAgIHJldHVybiBub2RlLnBhcmVudE5vZGUgJiYgIWJsb2NrVGFncy5oYXNPd25Qcm9wZXJ0eShub2RlLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxufVxuY2xhc3MgUGFyc2VDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBUaGUgcGFyc2VyIHdlIGFyZSB1c2luZy5cbiAgICBwYXJzZXIsIFxuICAgIC8vIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGlzIHBhcnNlLlxuICAgIG9wdGlvbnMsIGlzT3Blbikge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5pc09wZW4gPSBpc09wZW47XG4gICAgICAgIHRoaXMub3BlbiA9IDA7XG4gICAgICAgIHRoaXMubG9jYWxQcmVzZXJ2ZVdTID0gZmFsc2U7XG4gICAgICAgIGxldCB0b3BOb2RlID0gb3B0aW9ucy50b3BOb2RlLCB0b3BDb250ZXh0O1xuICAgICAgICBsZXQgdG9wT3B0aW9ucyA9IHdzT3B0aW9uc0ZvcihudWxsLCBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSwgMCkgfCAoaXNPcGVuID8gT1BUX09QRU5fTEVGVCA6IDApO1xuICAgICAgICBpZiAodG9wTm9kZSlcbiAgICAgICAgICAgIHRvcENvbnRleHQgPSBuZXcgTm9kZUNvbnRleHQodG9wTm9kZS50eXBlLCB0b3BOb2RlLmF0dHJzLCBNYXJrLm5vbmUsIHRydWUsIG9wdGlvbnMudG9wTWF0Y2ggfHwgdG9wTm9kZS50eXBlLmNvbnRlbnRNYXRjaCwgdG9wT3B0aW9ucyk7XG4gICAgICAgIGVsc2UgaWYgKGlzT3BlbilcbiAgICAgICAgICAgIHRvcENvbnRleHQgPSBuZXcgTm9kZUNvbnRleHQobnVsbCwgbnVsbCwgTWFyay5ub25lLCB0cnVlLCBudWxsLCB0b3BPcHRpb25zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdG9wQ29udGV4dCA9IG5ldyBOb2RlQ29udGV4dChwYXJzZXIuc2NoZW1hLnRvcE5vZGVUeXBlLCBudWxsLCBNYXJrLm5vbmUsIHRydWUsIG51bGwsIHRvcE9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5vZGVzID0gW3RvcENvbnRleHRdO1xuICAgICAgICB0aGlzLmZpbmQgPSBvcHRpb25zLmZpbmRQb3NpdGlvbnM7XG4gICAgICAgIHRoaXMubmVlZHNCbG9jayA9IGZhbHNlO1xuICAgIH1cbiAgICBnZXQgdG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1t0aGlzLm9wZW5dO1xuICAgIH1cbiAgICAvLyBBZGQgYSBET00gbm9kZSB0byB0aGUgY29udGVudC4gVGV4dCBpcyBpbnNlcnRlZCBhcyB0ZXh0IG5vZGUsXG4gICAgLy8gb3RoZXJ3aXNlLCB0aGUgbm9kZSBpcyBwYXNzZWQgdG8gYGFkZEVsZW1lbnRgIG9yLCBpZiBpdCBoYXMgYVxuICAgIC8vIGBzdHlsZWAgYXR0cmlidXRlLCBgYWRkRWxlbWVudFdpdGhTdHlsZXNgLlxuICAgIGFkZERPTShkb20sIG1hcmtzKSB7XG4gICAgICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHRoaXMuYWRkVGV4dE5vZGUoZG9tLCBtYXJrcyk7XG4gICAgICAgIGVsc2UgaWYgKGRvbS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KGRvbSwgbWFya3MpO1xuICAgIH1cbiAgICBhZGRUZXh0Tm9kZShkb20sIG1hcmtzKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGRvbS5ub2RlVmFsdWU7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcCwgcHJlc2VydmVXUyA9ICh0b3Aub3B0aW9ucyAmIE9QVF9QUkVTRVJWRV9XU19GVUxMKSA/IFwiZnVsbFwiXG4gICAgICAgICAgICA6IHRoaXMubG9jYWxQcmVzZXJ2ZVdTIHx8ICh0b3Aub3B0aW9ucyAmIE9QVF9QUkVTRVJWRV9XUykgPiAwO1xuICAgICAgICBsZXQgeyBzY2hlbWEgfSA9IHRoaXMucGFyc2VyO1xuICAgICAgICBpZiAocHJlc2VydmVXUyA9PT0gXCJmdWxsXCIgfHxcbiAgICAgICAgICAgIHRvcC5pbmxpbmVDb250ZXh0KGRvbSkgfHxcbiAgICAgICAgICAgIC9bXiBcXHRcXHJcXG5cXHUwMDBjXS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICghcHJlc2VydmVXUykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvWyBcXHRcXHJcXG5cXHUwMDBjXSsvZywgXCIgXCIpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgc3RhcnRzIHdpdGggd2hpdGVzcGFjZSwgYW5kIHRoZXJlIGlzIG5vIG5vZGUgYmVmb3JlIGl0LCBvclxuICAgICAgICAgICAgICAgIC8vIGEgaGFyZCBicmVhaywgb3IgYSB0ZXh0IG5vZGUgdGhhdCBlbmRzIHdpdGggd2hpdGVzcGFjZSwgc3RyaXAgdGhlXG4gICAgICAgICAgICAgICAgLy8gbGVhZGluZyBzcGFjZS5cbiAgICAgICAgICAgICAgICBpZiAoL15bIFxcdFxcclxcblxcdTAwMGNdLy50ZXN0KHZhbHVlKSAmJiB0aGlzLm9wZW4gPT0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlQmVmb3JlID0gdG9wLmNvbnRlbnRbdG9wLmNvbnRlbnQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb21Ob2RlQmVmb3JlID0gZG9tLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlQmVmb3JlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZG9tTm9kZUJlZm9yZSAmJiBkb21Ob2RlQmVmb3JlLm5vZGVOYW1lID09ICdCUicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAobm9kZUJlZm9yZS5pc1RleHQgJiYgL1sgXFx0XFxyXFxuXFx1MDAwY10kLy50ZXN0KG5vZGVCZWZvcmUudGV4dCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwcmVzZXJ2ZVdTID09PSBcImZ1bGxcIikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYS5saW5lYnJlYWtSZXBsYWNlbWVudCAmJiAvW1xcclxcbl0vLnRlc3QodmFsdWUpICYmIHRoaXMudG9wLmZpbmRXcmFwcGluZyhzY2hlbWEubGluZWJyZWFrUmVwbGFjZW1lbnQuY3JlYXRlKCkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmVzID0gdmFsdWUuc3BsaXQoL1xccj9cXG58XFxyLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0Tm9kZShzY2hlbWEubGluZWJyZWFrUmVwbGFjZW1lbnQuY3JlYXRlKCksIG1hcmtzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVzW2ldKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnROb2RlKHNjaGVtYS50ZXh0KGxpbmVzW2ldKSwgbWFya3MsICEvXFxTLy50ZXN0KGxpbmVzW2ldKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCIgXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0Tm9kZShzY2hlbWEudGV4dCh2YWx1ZSksIG1hcmtzLCAhL1xcUy8udGVzdCh2YWx1ZSkpO1xuICAgICAgICAgICAgdGhpcy5maW5kSW5UZXh0KGRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRJbnNpZGUoZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gZmluZCBhIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0YWcgYW5kIHVzZSB0aGF0IHRvIHBhcnNlLiBJZlxuICAgIC8vIG5vbmUgaXMgZm91bmQsIHRoZSBlbGVtZW50J3MgY29udGVudCBub2RlcyBhcmUgYWRkZWQgZGlyZWN0bHkuXG4gICAgYWRkRWxlbWVudChkb20sIG1hcmtzLCBtYXRjaEFmdGVyKSB7XG4gICAgICAgIGxldCBvdXRlcldTID0gdGhpcy5sb2NhbFByZXNlcnZlV1MsIHRvcCA9IHRoaXMudG9wO1xuICAgICAgICBpZiAoZG9tLnRhZ05hbWUgPT0gXCJQUkVcIiB8fCAvcHJlLy50ZXN0KGRvbS5zdHlsZSAmJiBkb20uc3R5bGUud2hpdGVTcGFjZSkpXG4gICAgICAgICAgICB0aGlzLmxvY2FsUHJlc2VydmVXUyA9IHRydWU7XG4gICAgICAgIGxldCBuYW1lID0gZG9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHJ1bGVJRDtcbiAgICAgICAgaWYgKGxpc3RUYWdzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHRoaXMucGFyc2VyLm5vcm1hbGl6ZUxpc3RzKVxuICAgICAgICAgICAgbm9ybWFsaXplTGlzdChkb20pO1xuICAgICAgICBsZXQgcnVsZSA9ICh0aGlzLm9wdGlvbnMucnVsZUZyb21Ob2RlICYmIHRoaXMub3B0aW9ucy5ydWxlRnJvbU5vZGUoZG9tKSkgfHxcbiAgICAgICAgICAgIChydWxlSUQgPSB0aGlzLnBhcnNlci5tYXRjaFRhZyhkb20sIHRoaXMsIG1hdGNoQWZ0ZXIpKTtcbiAgICAgICAgb3V0OiBpZiAocnVsZSA/IHJ1bGUuaWdub3JlIDogaWdub3JlVGFncy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5maW5kSW5zaWRlKGRvbSk7XG4gICAgICAgICAgICB0aGlzLmlnbm9yZUZhbGxiYWNrKGRvbSwgbWFya3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFydWxlIHx8IHJ1bGUuc2tpcCB8fCBydWxlLmNsb3NlUGFyZW50KSB7XG4gICAgICAgICAgICBpZiAocnVsZSAmJiBydWxlLmNsb3NlUGFyZW50KVxuICAgICAgICAgICAgICAgIHRoaXMub3BlbiA9IE1hdGgubWF4KDAsIHRoaXMub3BlbiAtIDEpO1xuICAgICAgICAgICAgZWxzZSBpZiAocnVsZSAmJiBydWxlLnNraXAubm9kZVR5cGUpXG4gICAgICAgICAgICAgICAgZG9tID0gcnVsZS5za2lwO1xuICAgICAgICAgICAgbGV0IHN5bmMsIG9sZE5lZWRzQmxvY2sgPSB0aGlzLm5lZWRzQmxvY2s7XG4gICAgICAgICAgICBpZiAoYmxvY2tUYWdzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvcC5jb250ZW50Lmxlbmd0aCAmJiB0b3AuY29udGVudFswXS5pc0lubGluZSAmJiB0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuLS07XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IHRoaXMudG9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXRvcC50eXBlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWRvbS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sZWFmRmFsbGJhY2soZG9tLCBtYXJrcyk7XG4gICAgICAgICAgICAgICAgYnJlYWsgb3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGlubmVyTWFya3MgPSBydWxlICYmIHJ1bGUuc2tpcCA/IG1hcmtzIDogdGhpcy5yZWFkU3R5bGVzKGRvbSwgbWFya3MpO1xuICAgICAgICAgICAgaWYgKGlubmVyTWFya3MpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBbGwoZG9tLCBpbm5lck1hcmtzKTtcbiAgICAgICAgICAgIGlmIChzeW5jKVxuICAgICAgICAgICAgICAgIHRoaXMuc3luYyh0b3ApO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0Jsb2NrID0gb2xkTmVlZHNCbG9jaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBpbm5lck1hcmtzID0gdGhpcy5yZWFkU3R5bGVzKGRvbSwgbWFya3MpO1xuICAgICAgICAgICAgaWYgKGlubmVyTWFya3MpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50QnlSdWxlKGRvbSwgcnVsZSwgaW5uZXJNYXJrcywgcnVsZS5jb25zdW1pbmcgPT09IGZhbHNlID8gcnVsZUlEIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvY2FsUHJlc2VydmVXUyA9IG91dGVyV1M7XG4gICAgfVxuICAgIC8vIENhbGxlZCBmb3IgbGVhZiBET00gbm9kZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgaWdub3JlZFxuICAgIGxlYWZGYWxsYmFjayhkb20sIG1hcmtzKSB7XG4gICAgICAgIGlmIChkb20ubm9kZU5hbWUgPT0gXCJCUlwiICYmIHRoaXMudG9wLnR5cGUgJiYgdGhpcy50b3AudHlwZS5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgdGhpcy5hZGRUZXh0Tm9kZShkb20ub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlxcblwiKSwgbWFya3MpO1xuICAgIH1cbiAgICAvLyBDYWxsZWQgZm9yIGlnbm9yZWQgbm9kZXNcbiAgICBpZ25vcmVGYWxsYmFjayhkb20sIG1hcmtzKSB7XG4gICAgICAgIC8vIElnbm9yZWQgQlIgbm9kZXMgc2hvdWxkIGF0IGxlYXN0IGNyZWF0ZSBhbiBpbmxpbmUgY29udGV4dFxuICAgICAgICBpZiAoZG9tLm5vZGVOYW1lID09IFwiQlJcIiAmJiAoIXRoaXMudG9wLnR5cGUgfHwgIXRoaXMudG9wLnR5cGUuaW5saW5lQ29udGVudCkpXG4gICAgICAgICAgICB0aGlzLmZpbmRQbGFjZSh0aGlzLnBhcnNlci5zY2hlbWEudGV4dChcIi1cIiksIG1hcmtzLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gUnVuIGFueSBzdHlsZSBwYXJzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlJ3Mgc3R5bGVzLiBFaXRoZXJcbiAgICAvLyByZXR1cm4gYW4gdXBkYXRlZCBhcnJheSBvZiBtYXJrcywgb3IgbnVsbCB0byBpbmRpY2F0ZSBzb21lIG9mIHRoZVxuICAgIC8vIHN0eWxlcyBoYWQgYSBydWxlIHdpdGggYGlnbm9yZWAgc2V0LlxuICAgIHJlYWRTdHlsZXMoZG9tLCBtYXJrcykge1xuICAgICAgICBsZXQgc3R5bGVzID0gZG9tLnN0eWxlO1xuICAgICAgICAvLyBCZWNhdXNlIG1hbnkgcHJvcGVydGllcyB3aWxsIG9ubHkgc2hvdyB1cCBpbiAnbm9ybWFsaXplZCcgZm9ybVxuICAgICAgICAvLyBpbiBgc3R5bGUuaXRlbWAgKGkuZS4gdGV4dC1kZWNvcmF0aW9uIGJlY29tZXNcbiAgICAgICAgLy8gdGV4dC1kZWNvcmF0aW9uLWxpbmUsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZXRjKSwgd2UgZGlyZWN0bHlcbiAgICAgICAgLy8gcXVlcnkgdGhlIHN0eWxlcyBtZW50aW9uZWQgaW4gb3VyIHJ1bGVzIGluc3RlYWQgb2YgaXRlcmF0aW5nXG4gICAgICAgIC8vIG92ZXIgdGhlIGl0ZW1zLlxuICAgICAgICBpZiAoc3R5bGVzICYmIHN0eWxlcy5sZW5ndGgpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFyc2VyLm1hdGNoZWRTdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMucGFyc2VyLm1hdGNoZWRTdHlsZXNbaV0sIHZhbHVlID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhZnRlciA9IHVuZGVmaW5lZDs7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHRoaXMucGFyc2VyLm1hdGNoU3R5bGUobmFtZSwgdmFsdWUsIHRoaXMsIGFmdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcnVsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmlnbm9yZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmNsZWFyTWFyaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzLmZpbHRlcihtID0+ICFydWxlLmNsZWFyTWFyayhtKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrcy5jb25jYXQodGhpcy5wYXJzZXIuc2NoZW1hLm1hcmtzW3J1bGUubWFya10uY3JlYXRlKHJ1bGUuYXR0cnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmNvbnN1bWluZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBydWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG4gICAgLy8gTG9vayB1cCBhIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBub2RlLiBJZiBub25lIGFyZSBmb3VuZCwgcmV0dXJuXG4gICAgLy8gZmFsc2UuIE90aGVyd2lzZSwgYXBwbHkgaXQsIHVzZSBpdHMgcmV0dXJuIHZhbHVlIHRvIGRyaXZlIHRoZSB3YXlcbiAgICAvLyB0aGUgbm9kZSdzIGNvbnRlbnQgaXMgd3JhcHBlZCwgYW5kIHJldHVybiB0cnVlLlxuICAgIGFkZEVsZW1lbnRCeVJ1bGUoZG9tLCBydWxlLCBtYXJrcywgY29udGludWVBZnRlcikge1xuICAgICAgICBsZXQgc3luYywgbm9kZVR5cGU7XG4gICAgICAgIGlmIChydWxlLm5vZGUpIHtcbiAgICAgICAgICAgIG5vZGVUeXBlID0gdGhpcy5wYXJzZXIuc2NoZW1hLm5vZGVzW3J1bGUubm9kZV07XG4gICAgICAgICAgICBpZiAoIW5vZGVUeXBlLmlzTGVhZikge1xuICAgICAgICAgICAgICAgIGxldCBpbm5lciA9IHRoaXMuZW50ZXIobm9kZVR5cGUsIHJ1bGUuYXR0cnMgfHwgbnVsbCwgbWFya3MsIHJ1bGUucHJlc2VydmVXaGl0ZXNwYWNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3luYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtzID0gaW5uZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuaW5zZXJ0Tm9kZShub2RlVHlwZS5jcmVhdGUocnVsZS5hdHRycyksIG1hcmtzLCBkb20ubm9kZU5hbWUgPT0gXCJCUlwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGVhZkZhbGxiYWNrKGRvbSwgbWFya3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hcmtUeXBlID0gdGhpcy5wYXJzZXIuc2NoZW1hLm1hcmtzW3J1bGUubWFya107XG4gICAgICAgICAgICBtYXJrcyA9IG1hcmtzLmNvbmNhdChtYXJrVHlwZS5jcmVhdGUocnVsZS5hdHRycykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydEluID0gdGhpcy50b3A7XG4gICAgICAgIGlmIChub2RlVHlwZSAmJiBub2RlVHlwZS5pc0xlYWYpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRpbnVlQWZ0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudChkb20sIG1hcmtzLCBjb250aW51ZUFmdGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChydWxlLmdldENvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICAgICAgcnVsZS5nZXRDb250ZW50KGRvbSwgdGhpcy5wYXJzZXIuc2NoZW1hKS5mb3JFYWNoKG5vZGUgPT4gdGhpcy5pbnNlcnROb2RlKG5vZGUsIG1hcmtzLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRET00gPSBkb207XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUuY29udGVudEVsZW1lbnQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBjb250ZW50RE9NID0gZG9tLnF1ZXJ5U2VsZWN0b3IocnVsZS5jb250ZW50RWxlbWVudCk7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcnVsZS5jb250ZW50RWxlbWVudCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgY29udGVudERPTSA9IHJ1bGUuY29udGVudEVsZW1lbnQoZG9tKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUuY29udGVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgY29udGVudERPTSA9IHJ1bGUuY29udGVudEVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmZpbmRBcm91bmQoZG9tLCBjb250ZW50RE9NLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQWxsKGNvbnRlbnRET00sIG1hcmtzKTtcbiAgICAgICAgICAgIHRoaXMuZmluZEFyb3VuZChkb20sIGNvbnRlbnRET00sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3luYyAmJiB0aGlzLnN5bmMoc3RhcnRJbikpXG4gICAgICAgICAgICB0aGlzLm9wZW4tLTtcbiAgICB9XG4gICAgLy8gQWRkIGFsbCBjaGlsZCBub2RlcyBiZXR3ZWVuIGBzdGFydEluZGV4YCBhbmQgYGVuZEluZGV4YCAob3IgdGhlXG4gICAgLy8gd2hvbGUgbm9kZSwgaWYgbm90IGdpdmVuKS4gSWYgYHN5bmNgIGlzIHBhc3NlZCwgdXNlIGl0IHRvXG4gICAgLy8gc3luY2hyb25pemUgYWZ0ZXIgZXZlcnkgYmxvY2sgZWxlbWVudC5cbiAgICBhZGRBbGwocGFyZW50LCBtYXJrcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gc3RhcnRJbmRleCB8fCAwO1xuICAgICAgICBmb3IgKGxldCBkb20gPSBzdGFydEluZGV4ID8gcGFyZW50LmNoaWxkTm9kZXNbc3RhcnRJbmRleF0gOiBwYXJlbnQuZmlyc3RDaGlsZCwgZW5kID0gZW5kSW5kZXggPT0gbnVsbCA/IG51bGwgOiBwYXJlbnQuY2hpbGROb2Rlc1tlbmRJbmRleF07IGRvbSAhPSBlbmQ7IGRvbSA9IGRvbS5uZXh0U2libGluZywgKytpbmRleCkge1xuICAgICAgICAgICAgdGhpcy5maW5kQXRQb2ludChwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYWRkRE9NKGRvbSwgbWFya3MpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluZEF0UG9pbnQocGFyZW50LCBpbmRleCk7XG4gICAgfVxuICAgIC8vIFRyeSB0byBmaW5kIGEgd2F5IHRvIGZpdCB0aGUgZ2l2ZW4gbm9kZSB0eXBlIGludG8gdGhlIGN1cnJlbnRcbiAgICAvLyBjb250ZXh0LiBNYXkgYWRkIGludGVybWVkaWF0ZSB3cmFwcGVycyBhbmQvb3IgbGVhdmUgbm9uLXNvbGlkXG4gICAgLy8gbm9kZXMgdGhhdCB3ZSdyZSBpbi5cbiAgICBmaW5kUGxhY2Uobm9kZSwgbWFya3MsIGNhdXRpb3VzKSB7XG4gICAgICAgIGxldCByb3V0ZSwgc3luYztcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSB0aGlzLm9wZW4sIHBlbmFsdHkgPSAwOyBkZXB0aCA+PSAwOyBkZXB0aC0tKSB7XG4gICAgICAgICAgICBsZXQgY3ggPSB0aGlzLm5vZGVzW2RlcHRoXTtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGN4LmZpbmRXcmFwcGluZyhub2RlKTtcbiAgICAgICAgICAgIGlmIChmb3VuZCAmJiAoIXJvdXRlIHx8IHJvdXRlLmxlbmd0aCA+IGZvdW5kLmxlbmd0aCArIHBlbmFsdHkpKSB7XG4gICAgICAgICAgICAgICAgcm91dGUgPSBmb3VuZDtcbiAgICAgICAgICAgICAgICBzeW5jID0gY3g7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN4LnNvbGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhdXRpb3VzKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBwZW5hbHR5ICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb3V0ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLnN5bmMoc3luYyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBtYXJrcyA9IHRoaXMuZW50ZXJJbm5lcihyb3V0ZVtpXSwgbnVsbCwgbWFya3MsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gaW5zZXJ0IHRoZSBnaXZlbiBub2RlLCBhZGp1c3RpbmcgdGhlIGNvbnRleHQgd2hlbiBuZWVkZWQuXG4gICAgaW5zZXJ0Tm9kZShub2RlLCBtYXJrcywgY2F1dGlvdXMpIHtcbiAgICAgICAgaWYgKG5vZGUuaXNJbmxpbmUgJiYgdGhpcy5uZWVkc0Jsb2NrICYmICF0aGlzLnRvcC50eXBlKSB7XG4gICAgICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLnRleHRibG9ja0Zyb21Db250ZXh0KCk7XG4gICAgICAgICAgICBpZiAoYmxvY2spXG4gICAgICAgICAgICAgICAgbWFya3MgPSB0aGlzLmVudGVySW5uZXIoYmxvY2ssIG51bGwsIG1hcmtzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5uZXJNYXJrcyA9IHRoaXMuZmluZFBsYWNlKG5vZGUsIG1hcmtzLCBjYXV0aW91cyk7XG4gICAgICAgIGlmIChpbm5lck1hcmtzKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRXh0cmEoKTtcbiAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcDtcbiAgICAgICAgICAgIGlmICh0b3AubWF0Y2gpXG4gICAgICAgICAgICAgICAgdG9wLm1hdGNoID0gdG9wLm1hdGNoLm1hdGNoVHlwZShub2RlLnR5cGUpO1xuICAgICAgICAgICAgbGV0IG5vZGVNYXJrcyA9IE1hcmsubm9uZTtcbiAgICAgICAgICAgIGZvciAobGV0IG0gb2YgaW5uZXJNYXJrcy5jb25jYXQobm9kZS5tYXJrcykpXG4gICAgICAgICAgICAgICAgaWYgKHRvcC50eXBlID8gdG9wLnR5cGUuYWxsb3dzTWFya1R5cGUobS50eXBlKSA6IG1hcmtNYXlBcHBseShtLnR5cGUsIG5vZGUudHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIG5vZGVNYXJrcyA9IG0uYWRkVG9TZXQobm9kZU1hcmtzKTtcbiAgICAgICAgICAgIHRvcC5jb250ZW50LnB1c2gobm9kZS5tYXJrKG5vZGVNYXJrcykpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gc3RhcnQgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlLCBhZGp1c3RpbmcgdGhlIGNvbnRleHQgd2hlblxuICAgIC8vIG5lY2Vzc2FyeS5cbiAgICBlbnRlcih0eXBlLCBhdHRycywgbWFya3MsIHByZXNlcnZlV1MpIHtcbiAgICAgICAgbGV0IGlubmVyTWFya3MgPSB0aGlzLmZpbmRQbGFjZSh0eXBlLmNyZWF0ZShhdHRycyksIG1hcmtzLCBmYWxzZSk7XG4gICAgICAgIGlmIChpbm5lck1hcmtzKVxuICAgICAgICAgICAgaW5uZXJNYXJrcyA9IHRoaXMuZW50ZXJJbm5lcih0eXBlLCBhdHRycywgbWFya3MsIHRydWUsIHByZXNlcnZlV1MpO1xuICAgICAgICByZXR1cm4gaW5uZXJNYXJrcztcbiAgICB9XG4gICAgLy8gT3BlbiBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGVcbiAgICBlbnRlcklubmVyKHR5cGUsIGF0dHJzLCBtYXJrcywgc29saWQgPSBmYWxzZSwgcHJlc2VydmVXUykge1xuICAgICAgICB0aGlzLmNsb3NlRXh0cmEoKTtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wO1xuICAgICAgICB0b3AubWF0Y2ggPSB0b3AubWF0Y2ggJiYgdG9wLm1hdGNoLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB3c09wdGlvbnNGb3IodHlwZSwgcHJlc2VydmVXUywgdG9wLm9wdGlvbnMpO1xuICAgICAgICBpZiAoKHRvcC5vcHRpb25zICYgT1BUX09QRU5fTEVGVCkgJiYgdG9wLmNvbnRlbnQubGVuZ3RoID09IDApXG4gICAgICAgICAgICBvcHRpb25zIHw9IE9QVF9PUEVOX0xFRlQ7XG4gICAgICAgIGxldCBhcHBseU1hcmtzID0gTWFyay5ub25lO1xuICAgICAgICBtYXJrcyA9IG1hcmtzLmZpbHRlcihtID0+IHtcbiAgICAgICAgICAgIGlmICh0b3AudHlwZSA/IHRvcC50eXBlLmFsbG93c01hcmtUeXBlKG0udHlwZSkgOiBtYXJrTWF5QXBwbHkobS50eXBlLCB0eXBlKSkge1xuICAgICAgICAgICAgICAgIGFwcGx5TWFya3MgPSBtLmFkZFRvU2V0KGFwcGx5TWFya3MpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBOb2RlQ29udGV4dCh0eXBlLCBhdHRycywgYXBwbHlNYXJrcywgc29saWQsIG51bGwsIG9wdGlvbnMpKTtcbiAgICAgICAgdGhpcy5vcGVuKys7XG4gICAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIGFsbCBub2RlcyBhYm92ZSB0aGlzLm9wZW4gYXJlIGZpbmlzaGVkIGFuZCBhZGRlZCB0b1xuICAgIC8vIHRoZWlyIHBhcmVudHNcbiAgICBjbG9zZUV4dHJhKG9wZW5FbmQgPSBmYWxzZSkge1xuICAgICAgICBsZXQgaSA9IHRoaXMubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGkgPiB0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgIGZvciAoOyBpID4gdGhpcy5vcGVuOyBpLS0pXG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlc1tpIC0gMV0uY29udGVudC5wdXNoKHRoaXMubm9kZXNbaV0uZmluaXNoKG9wZW5FbmQpKTtcbiAgICAgICAgICAgIHRoaXMubm9kZXMubGVuZ3RoID0gdGhpcy5vcGVuICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHRoaXMub3BlbiA9IDA7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSh0aGlzLmlzT3Blbik7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzWzBdLmZpbmlzaCghISh0aGlzLmlzT3BlbiB8fCB0aGlzLm9wdGlvbnMudG9wT3BlbikpO1xuICAgIH1cbiAgICBzeW5jKHRvKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZW47IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ub2Rlc1tpXSA9PSB0bykge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbiA9IGk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmxvY2FsUHJlc2VydmVXUykge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbaV0ub3B0aW9ucyB8PSBPUFRfUFJFU0VSVkVfV1M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBnZXQgY3VycmVudFBvcygpIHtcbiAgICAgICAgdGhpcy5jbG9zZUV4dHJhKCk7XG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5vcGVuOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLm5vZGVzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gY29udGVudC5sZW5ndGggLSAxOyBqID49IDA7IGotLSlcbiAgICAgICAgICAgICAgICBwb3MgKz0gY29udGVudFtqXS5ub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChpKVxuICAgICAgICAgICAgICAgIHBvcysrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuICAgIGZpbmRBdFBvaW50KHBhcmVudCwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmluZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRbaV0ubm9kZSA9PSBwYXJlbnQgJiYgdGhpcy5maW5kW2ldLm9mZnNldCA9PSBvZmZzZXQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFtpXS5wb3MgPSB0aGlzLmN1cnJlbnRQb3M7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRJbnNpZGUocGFyZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmluZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRbaV0ucG9zID09IG51bGwgJiYgcGFyZW50Lm5vZGVUeXBlID09IDEgJiYgcGFyZW50LmNvbnRhaW5zKHRoaXMuZmluZFtpXS5ub2RlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kW2ldLnBvcyA9IHRoaXMuY3VycmVudFBvcztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZmluZEFyb3VuZChwYXJlbnQsIGNvbnRlbnQsIGJlZm9yZSkge1xuICAgICAgICBpZiAocGFyZW50ICE9IGNvbnRlbnQgJiYgdGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLnBvcyA9PSBudWxsICYmIHBhcmVudC5ub2RlVHlwZSA9PSAxICYmIHBhcmVudC5jb250YWlucyh0aGlzLmZpbmRbaV0ubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcyA9IGNvbnRlbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5maW5kW2ldLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zICYgKGJlZm9yZSA/IDIgOiA0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFtpXS5wb3MgPSB0aGlzLmN1cnJlbnRQb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kSW5UZXh0KHRleHROb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmluZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRbaV0ubm9kZSA9PSB0ZXh0Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kW2ldLnBvcyA9IHRoaXMuY3VycmVudFBvcyAtICh0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gdGhpcy5maW5kW2ldLm9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gY29udGV4dCBzdHJpbmcgbWF0Y2hlcyB0aGlzIGNvbnRleHQuXG4gICAgbWF0Y2hlc0NvbnRleHQoY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dC5pbmRleE9mKFwifFwiKSA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuc3BsaXQoL1xccypcXHxcXHMqLykuc29tZSh0aGlzLm1hdGNoZXNDb250ZXh0LCB0aGlzKTtcbiAgICAgICAgbGV0IHBhcnRzID0gY29udGV4dC5zcGxpdChcIi9cIik7XG4gICAgICAgIGxldCBvcHRpb24gPSB0aGlzLm9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgbGV0IHVzZVJvb3QgPSAhdGhpcy5pc09wZW4gJiYgKCFvcHRpb24gfHwgb3B0aW9uLnBhcmVudC50eXBlID09IHRoaXMubm9kZXNbMF0udHlwZSk7XG4gICAgICAgIGxldCBtaW5EZXB0aCA9IC0ob3B0aW9uID8gb3B0aW9uLmRlcHRoICsgMSA6IDApICsgKHVzZVJvb3QgPyAwIDogMSk7XG4gICAgICAgIGxldCBtYXRjaCA9IChpLCBkZXB0aCkgPT4ge1xuICAgICAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocGFydCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IHBhcnRzLmxlbmd0aCAtIDEgfHwgaSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyBkZXB0aCA+PSBtaW5EZXB0aDsgZGVwdGgtLSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaChpIC0gMSwgZGVwdGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGRlcHRoID4gMCB8fCAoZGVwdGggPT0gMCAmJiB1c2VSb290KSA/IHRoaXMubm9kZXNbZGVwdGhdLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogb3B0aW9uICYmIGRlcHRoID49IG1pbkRlcHRoID8gb3B0aW9uLm5vZGUoZGVwdGggLSBtaW5EZXB0aCkudHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IChuZXh0Lm5hbWUgIT0gcGFydCAmJiAhbmV4dC5pc0luR3JvdXAocGFydCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbWF0Y2gocGFydHMubGVuZ3RoIC0gMSwgdGhpcy5vcGVuKTtcbiAgICB9XG4gICAgdGV4dGJsb2NrRnJvbUNvbnRleHQoKSB7XG4gICAgICAgIGxldCAkY29udGV4dCA9IHRoaXMub3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAoJGNvbnRleHQpXG4gICAgICAgICAgICBmb3IgKGxldCBkID0gJGNvbnRleHQuZGVwdGg7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlZmx0ID0gJGNvbnRleHQubm9kZShkKS5jb250ZW50TWF0Y2hBdCgkY29udGV4dC5pbmRleEFmdGVyKGQpKS5kZWZhdWx0VHlwZTtcbiAgICAgICAgICAgICAgICBpZiAoZGVmbHQgJiYgZGVmbHQuaXNUZXh0YmxvY2sgJiYgZGVmbHQuZGVmYXVsdEF0dHJzKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmbHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5wYXJzZXIuc2NoZW1hLm5vZGVzKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMucGFyc2VyLnNjaGVtYS5ub2Rlc1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh0eXBlLmlzVGV4dGJsb2NrICYmIHR5cGUuZGVmYXVsdEF0dHJzKVxuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gS2x1ZGdlIHRvIHdvcmsgYXJvdW5kIGRpcmVjdGx5IG5lc3RlZCBsaXN0IG5vZGVzIHByb2R1Y2VkIGJ5IHNvbWVcbi8vIHRvb2xzIGFuZCBhbGxvd2VkIGJ5IGJyb3dzZXJzIHRvIG1lYW4gdGhhdCB0aGUgbmVzdGVkIGxpc3QgaXNcbi8vIGFjdHVhbGx5IHBhcnQgb2YgdGhlIGxpc3QgaXRlbSBhYm92ZSBpdC5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpc3QoZG9tKSB7XG4gICAgZm9yIChsZXQgY2hpbGQgPSBkb20uZmlyc3RDaGlsZCwgcHJldkl0ZW0gPSBudWxsOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBsZXQgbmFtZSA9IGNoaWxkLm5vZGVUeXBlID09IDEgPyBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgICAgICAgaWYgKG5hbWUgJiYgbGlzdFRhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgcHJldkl0ZW0pIHtcbiAgICAgICAgICAgIHByZXZJdGVtLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIGNoaWxkID0gcHJldkl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSA9PSBcImxpXCIpIHtcbiAgICAgICAgICAgIHByZXZJdGVtID0gY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSkge1xuICAgICAgICAgICAgcHJldkl0ZW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gQXBwbHkgYSBDU1Mgc2VsZWN0b3IuXG5mdW5jdGlvbiBtYXRjaGVzKGRvbSwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gKGRvbS5tYXRjaGVzIHx8IGRvbS5tc01hdGNoZXNTZWxlY3RvciB8fCBkb20ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGRvbS5tb3pNYXRjaGVzU2VsZWN0b3IpLmNhbGwoZG9tLCBzZWxlY3Rvcik7XG59XG5mdW5jdGlvbiBjb3B5KG9iaikge1xuICAgIGxldCBjb3B5ID0ge307XG4gICAgZm9yIChsZXQgcHJvcCBpbiBvYmopXG4gICAgICAgIGNvcHlbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgcmV0dXJuIGNvcHk7XG59XG4vLyBVc2VkIHdoZW4gZmluZGluZyBhIG1hcmsgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIGZyYWdtZW50IHBhcnNlLlxuLy8gQ2hlY2tzIHdoZXRoZXIgaXQgd291bGQgYmUgcmVhc29uYWJsZSB0byBhcHBseSBhIGdpdmVuIG1hcmsgdHlwZSB0b1xuLy8gYSBnaXZlbiBub2RlLCBieSBsb29raW5nIGF0IHRoZSB3YXkgdGhlIG1hcmsgb2NjdXJzIGluIHRoZSBzY2hlbWEuXG5mdW5jdGlvbiBtYXJrTWF5QXBwbHkobWFya1R5cGUsIG5vZGVUeXBlKSB7XG4gICAgbGV0IG5vZGVzID0gbm9kZVR5cGUuc2NoZW1hLm5vZGVzO1xuICAgIGZvciAobGV0IG5hbWUgaW4gbm9kZXMpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IG5vZGVzW25hbWVdO1xuICAgICAgICBpZiAoIXBhcmVudC5hbGxvd3NNYXJrVHlwZShtYXJrVHlwZSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IHNlZW4gPSBbXSwgc2NhbiA9IChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKG1hdGNoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2guZWRnZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBtYXRjaC5lZGdlKGkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG5vZGVUeXBlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG5leHQpIDwgMCAmJiBzY2FuKG5leHQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNjYW4ocGFyZW50LmNvbnRlbnRNYXRjaCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbi8qKlxuQSBET00gc2VyaWFsaXplciBrbm93cyBob3cgdG8gY29udmVydCBQcm9zZU1pcnJvciBub2RlcyBhbmRcbm1hcmtzIG9mIHZhcmlvdXMgdHlwZXMgdG8gRE9NIG5vZGVzLlxuKi9cbmNsYXNzIERPTVNlcmlhbGl6ZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlcmlhbGl6ZXIuIGBub2Rlc2Agc2hvdWxkIG1hcCBub2RlIG5hbWVzIHRvIGZ1bmN0aW9uc1xuICAgIHRoYXQgdGFrZSBhIG5vZGUgYW5kIHJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgRE9NLiBgbWFya3NgIGRvZXMgdGhlIHNhbWUgZm9yIG1hcmsgbmFtZXMsIGJ1dCBhbHNvIGdldHMgYW5cbiAgICBhcmd1bWVudCB0aGF0IHRlbGxzIGl0IHdoZXRoZXIgdGhlIG1hcmsncyBjb250ZW50IGlzIGJsb2NrIG9yXG4gICAgaW5saW5lIGNvbnRlbnQgKGZvciB0eXBpY2FsIHVzZSwgaXQnbGwgYWx3YXlzIGJlIGlubGluZSkuIEEgbWFya1xuICAgIHNlcmlhbGl6ZXIgbWF5IGJlIGBudWxsYCB0byBpbmRpY2F0ZSB0aGF0IG1hcmtzIG9mIHRoYXQgdHlwZVxuICAgIHNob3VsZCBub3QgYmUgc2VyaWFsaXplZC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHNlcmlhbGl6YXRpb24gZnVuY3Rpb25zLlxuICAgICovXG4gICAgbm9kZXMsIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrIHNlcmlhbGl6YXRpb24gZnVuY3Rpb25zLlxuICAgICovXG4gICAgbWFya3MpIHtcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgICAgICB0aGlzLm1hcmtzID0gbWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGlzIGZyYWdtZW50IHRvIGEgRE9NIGZyYWdtZW50LiBXaGVuXG4gICAgbm90IGluIHRoZSBicm93c2VyLCB0aGUgYGRvY3VtZW50YCBvcHRpb24sIGNvbnRhaW5pbmcgYSBET01cbiAgICBkb2N1bWVudCwgc2hvdWxkIGJlIHBhc3NlZCBzbyB0aGF0IHRoZSBzZXJpYWxpemVyIGNhbiBjcmVhdGVcbiAgICBub2Rlcy5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZUZyYWdtZW50KGZyYWdtZW50LCBvcHRpb25zID0ge30sIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IGRvYyhvcHRpb25zKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIGxldCB0b3AgPSB0YXJnZXQsIGFjdGl2ZSA9IFtdO1xuICAgICAgICBmcmFnbWVudC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGggfHwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQga2VlcCA9IDAsIHJlbmRlcmVkID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoa2VlcCA8IGFjdGl2ZS5sZW5ndGggJiYgcmVuZGVyZWQgPCBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUubWFya3NbcmVuZGVyZWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWFya3NbbmV4dC50eXBlLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0LmVxKGFjdGl2ZVtrZWVwXVswXSkgfHwgbmV4dC50eXBlLnNwZWMuc3Bhbm5pbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGtlZXArKztcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKGtlZXAgPCBhY3RpdmUubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0b3AgPSBhY3RpdmUucG9wKClbMV07XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJlbmRlcmVkIDwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZCA9IG5vZGUubWFya3NbcmVuZGVyZWQrK107XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXJrRE9NID0gdGhpcy5zZXJpYWxpemVNYXJrKGFkZCwgbm9kZS5pc0lubGluZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXJrRE9NKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUucHVzaChbYWRkLCB0b3BdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5hcHBlbmRDaGlsZChtYXJrRE9NLmRvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBtYXJrRE9NLmNvbnRlbnRET00gfHwgbWFya0RPTS5kb207XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b3AuYXBwZW5kQ2hpbGQodGhpcy5zZXJpYWxpemVOb2RlSW5uZXIobm9kZSwgb3B0aW9ucykpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZXJpYWxpemVOb2RlSW5uZXIobm9kZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgeyBkb20sIGNvbnRlbnRET00gfSA9IHJlbmRlclNwZWMoZG9jKG9wdGlvbnMpLCB0aGlzLm5vZGVzW25vZGUudHlwZS5uYW1lXShub2RlKSwgbnVsbCwgbm9kZS5hdHRycyk7XG4gICAgICAgIGlmIChjb250ZW50RE9NKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5pc0xlYWYpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDb250ZW50IGhvbGUgbm90IGFsbG93ZWQgaW4gYSBsZWFmIG5vZGUgc3BlY1wiKTtcbiAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplRnJhZ21lbnQobm9kZS5jb250ZW50LCBvcHRpb25zLCBjb250ZW50RE9NKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9tO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhpcyBub2RlIHRvIGEgRE9NIG5vZGUuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdVxuICAgIG5lZWQgdG8gc2VyaWFsaXplIGEgcGFydCBvZiBhIGRvY3VtZW50LCBhcyBvcHBvc2VkIHRvIHRoZSB3aG9sZVxuICAgIGRvY3VtZW50LiBUbyBzZXJpYWxpemUgYSB3aG9sZSBkb2N1bWVudCwgdXNlXG4gICAgW2BzZXJpYWxpemVGcmFnbWVudGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5ET01TZXJpYWxpemVyLnNlcmlhbGl6ZUZyYWdtZW50KSBvblxuICAgIGl0cyBbY29udGVudF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUuY29udGVudCkuXG4gICAgKi9cbiAgICBzZXJpYWxpemVOb2RlKG5vZGUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgZG9tID0gdGhpcy5zZXJpYWxpemVOb2RlSW5uZXIobm9kZSwgb3B0aW9ucyk7XG4gICAgICAgIGZvciAobGV0IGkgPSBub2RlLm1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgd3JhcCA9IHRoaXMuc2VyaWFsaXplTWFyayhub2RlLm1hcmtzW2ldLCBub2RlLmlzSW5saW5lLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmICh3cmFwKSB7XG4gICAgICAgICAgICAgICAgKHdyYXAuY29udGVudERPTSB8fCB3cmFwLmRvbSkuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICAgICAgICAgICAgICBkb20gPSB3cmFwLmRvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9tO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNlcmlhbGl6ZU1hcmsobWFyaywgaW5saW5lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHRvRE9NID0gdGhpcy5tYXJrc1ttYXJrLnR5cGUubmFtZV07XG4gICAgICAgIHJldHVybiB0b0RPTSAmJiByZW5kZXJTcGVjKGRvYyhvcHRpb25zKSwgdG9ET00obWFyaywgaW5saW5lKSwgbnVsbCwgbWFyay5hdHRycyk7XG4gICAgfVxuICAgIHN0YXRpYyByZW5kZXJTcGVjKGRvYywgc3RydWN0dXJlLCB4bWxOUyA9IG51bGwsIGJsb2NrQXJyYXlzSW4pIHtcbiAgICAgICAgcmV0dXJuIHJlbmRlclNwZWMoZG9jLCBzdHJ1Y3R1cmUsIHhtbE5TLCBibG9ja0FycmF5c0luKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSBzZXJpYWxpemVyIHVzaW5nIHRoZSBbYHRvRE9NYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLnRvRE9NKVxuICAgIHByb3BlcnRpZXMgaW4gYSBzY2hlbWEncyBub2RlIGFuZCBtYXJrIHNwZWNzLlxuICAgICovXG4gICAgc3RhdGljIGZyb21TY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuY2FjaGVkLmRvbVNlcmlhbGl6ZXIgfHxcbiAgICAgICAgICAgIChzY2hlbWEuY2FjaGVkLmRvbVNlcmlhbGl6ZXIgPSBuZXcgRE9NU2VyaWFsaXplcih0aGlzLm5vZGVzRnJvbVNjaGVtYShzY2hlbWEpLCB0aGlzLm1hcmtzRnJvbVNjaGVtYShzY2hlbWEpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdhdGhlciB0aGUgc2VyaWFsaXplcnMgaW4gYSBzY2hlbWEncyBub2RlIHNwZWNzIGludG8gYW4gb2JqZWN0LlxuICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCBhcyBhIGJhc2UgdG8gYnVpbGQgYSBjdXN0b20gc2VyaWFsaXplciBmcm9tLlxuICAgICovXG4gICAgc3RhdGljIG5vZGVzRnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGdhdGhlclRvRE9NKHNjaGVtYS5ub2Rlcyk7XG4gICAgICAgIGlmICghcmVzdWx0LnRleHQpXG4gICAgICAgICAgICByZXN1bHQudGV4dCA9IG5vZGUgPT4gbm9kZS50ZXh0O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBHYXRoZXIgdGhlIHNlcmlhbGl6ZXJzIGluIGEgc2NoZW1hJ3MgbWFyayBzcGVjcyBpbnRvIGFuIG9iamVjdC5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXJrc0Zyb21TY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBnYXRoZXJUb0RPTShzY2hlbWEubWFya3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdhdGhlclRvRE9NKG9iaikge1xuICAgIGxldCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGxldCBuYW1lIGluIG9iaikge1xuICAgICAgICBsZXQgdG9ET00gPSBvYmpbbmFtZV0uc3BlYy50b0RPTTtcbiAgICAgICAgaWYgKHRvRE9NKVxuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gdG9ET007XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBkb2Mob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zLmRvY3VtZW50IHx8IHdpbmRvdy5kb2N1bWVudDtcbn1cbmNvbnN0IHN1c3BpY2lvdXNBdHRyaWJ1dGVDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBzdXNwaWNpb3VzQXR0cmlidXRlcyhhdHRycykge1xuICAgIGxldCB2YWx1ZSA9IHN1c3BpY2lvdXNBdHRyaWJ1dGVDYWNoZS5nZXQoYXR0cnMpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICBzdXNwaWNpb3VzQXR0cmlidXRlQ2FjaGUuc2V0KGF0dHJzLCB2YWx1ZSA9IHN1c3BpY2lvdXNBdHRyaWJ1dGVzSW5uZXIoYXR0cnMpKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBzdXNwaWNpb3VzQXR0cmlidXRlc0lubmVyKGF0dHJzKSB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgZnVuY3Rpb24gc2Nhbih2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWVbMF0gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbih2YWx1ZVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgc2Nhbih2YWx1ZVtwcm9wXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2NhbihhdHRycyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHJlbmRlclNwZWMoZG9jLCBzdHJ1Y3R1cmUsIHhtbE5TLCBibG9ja0FycmF5c0luKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJ1Y3R1cmUgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIHsgZG9tOiBkb2MuY3JlYXRlVGV4dE5vZGUoc3RydWN0dXJlKSB9O1xuICAgIGlmIChzdHJ1Y3R1cmUubm9kZVR5cGUgIT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHsgZG9tOiBzdHJ1Y3R1cmUgfTtcbiAgICBpZiAoc3RydWN0dXJlLmRvbSAmJiBzdHJ1Y3R1cmUuZG9tLm5vZGVUeXBlICE9IG51bGwpXG4gICAgICAgIHJldHVybiBzdHJ1Y3R1cmU7XG4gICAgbGV0IHRhZ05hbWUgPSBzdHJ1Y3R1cmVbMF0sIHN1c3BpY2lvdXM7XG4gICAgaWYgKHR5cGVvZiB0YWdOYW1lICE9IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBhcnJheSBwYXNzZWQgdG8gcmVuZGVyU3BlY1wiKTtcbiAgICBpZiAoYmxvY2tBcnJheXNJbiAmJiAoc3VzcGljaW91cyA9IHN1c3BpY2lvdXNBdHRyaWJ1dGVzKGJsb2NrQXJyYXlzSW4pKSAmJlxuICAgICAgICBzdXNwaWNpb3VzLmluZGV4T2Yoc3RydWN0dXJlKSA+IC0xKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlVzaW5nIGFuIGFycmF5IGZyb20gYW4gYXR0cmlidXRlIG9iamVjdCBhcyBhIERPTSBzcGVjLiBUaGlzIG1heSBiZSBhbiBhdHRlbXB0ZWQgY3Jvc3Mgc2l0ZSBzY3JpcHRpbmcgYXR0YWNrLlwiKTtcbiAgICBsZXQgc3BhY2UgPSB0YWdOYW1lLmluZGV4T2YoXCIgXCIpO1xuICAgIGlmIChzcGFjZSA+IDApIHtcbiAgICAgICAgeG1sTlMgPSB0YWdOYW1lLnNsaWNlKDAsIHNwYWNlKTtcbiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUuc2xpY2Uoc3BhY2UgKyAxKTtcbiAgICB9XG4gICAgbGV0IGNvbnRlbnRET007XG4gICAgbGV0IGRvbSA9ICh4bWxOUyA/IGRvYy5jcmVhdGVFbGVtZW50TlMoeG1sTlMsIHRhZ05hbWUpIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkpO1xuICAgIGxldCBhdHRycyA9IHN0cnVjdHVyZVsxXSwgc3RhcnQgPSAxO1xuICAgIGlmIChhdHRycyAmJiB0eXBlb2YgYXR0cnMgPT0gXCJvYmplY3RcIiAmJiBhdHRycy5ub2RlVHlwZSA9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGF0dHJzKSkge1xuICAgICAgICBzdGFydCA9IDI7XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpXG4gICAgICAgICAgICBpZiAoYXR0cnNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBzcGFjZSA9IG5hbWUuaW5kZXhPZihcIiBcIik7XG4gICAgICAgICAgICAgICAgaWYgKHNwYWNlID4gMClcbiAgICAgICAgICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZU5TKG5hbWUuc2xpY2UoMCwgc3BhY2UpLCBuYW1lLnNsaWNlKHNwYWNlICsgMSksIGF0dHJzW25hbWVdKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lID09IFwic3R5bGVcIiAmJiBkb20uc3R5bGUpXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gYXR0cnNbbmFtZV07XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKG5hbWUsIGF0dHJzW25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RydWN0dXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IHN0cnVjdHVyZVtpXTtcbiAgICAgICAgaWYgKGNoaWxkID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoaSA8IHN0cnVjdHVyZS5sZW5ndGggLSAxIHx8IGkgPiBzdGFydClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNvbnRlbnQgaG9sZSBtdXN0IGJlIHRoZSBvbmx5IGNoaWxkIG9mIGl0cyBwYXJlbnQgbm9kZVwiKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRvbSwgY29udGVudERPTTogZG9tIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgeyBkb206IGlubmVyLCBjb250ZW50RE9NOiBpbm5lckNvbnRlbnQgfSA9IHJlbmRlclNwZWMoZG9jLCBjaGlsZCwgeG1sTlMsIGJsb2NrQXJyYXlzSW4pO1xuICAgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGlubmVyKTtcbiAgICAgICAgICAgIGlmIChpbm5lckNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudERPTSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdWx0aXBsZSBjb250ZW50IGhvbGVzXCIpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRET00gPSBpbm5lckNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZG9tLCBjb250ZW50RE9NIH07XG59XG5cbmV4cG9ydCB7IENvbnRlbnRNYXRjaCwgRE9NUGFyc2VyLCBET01TZXJpYWxpemVyLCBGcmFnbWVudCwgTWFyaywgTWFya1R5cGUsIE5vZGUsIE5vZGVSYW5nZSwgTm9kZVR5cGUsIFJlcGxhY2VFcnJvciwgUmVzb2x2ZWRQb3MsIFNjaGVtYSwgU2xpY2UgfTtcbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1tYXJrdXAoOmlkPVwiZGF0YVBhdGhcIilcbiAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtLXRvb2xiYXIoXG4gICAgdi1pZj1cImdyb3VwZWRCdXR0b25zLmxlbmd0aCA+IDBcIlxuICApXG4gICAgLmRpdG8tYnV0dG9uc19fZ3JvdXAoXG4gICAgICB2LWZvcj1cImJ1dHRvbnMgaW4gZ3JvdXBlZEJ1dHRvbnNcIlxuICAgIClcbiAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgdi1mb3I9XCJ7IG5hbWUsIGljb24sIGlzQWN0aXZlLCBvbkNsaWNrIH0gaW4gYnV0dG9uc1wiXG4gICAgICAgIDprZXk9XCJuYW1lXCJcbiAgICAgICAgOmNsYXNzPVwieyAnZGl0by1idXR0b24tLWFjdGl2ZSc6IGlzQWN0aXZlIH1cIlxuICAgICAgICBAY2xpY2s9XCJvbkNsaWNrXCJcbiAgICAgIClcbiAgICAgICAgRGl0b0ljb24oOm5hbWU9XCJpY29uXCIpXG4gIEVkaXRvckNvbnRlbnQuZGl0by1tYXJrdXAtZWRpdG9yKFxuICAgIHJlZj1cImVkaXRvclwiXG4gICAgOmVkaXRvcj1cImVkaXRvclwiXG4gICAgOnN0eWxlPVwic3R5bGVzXCJcbiAgKVxuICAuZGl0by1yZXNpemUoXG4gICAgdi1pZj1cInJlc2l6YWJsZVwiXG4gICAgQG1vdXNlZG93bi5zdG9wLnByZXZlbnQ9XCJvbkRyYWdSZXNpemVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG4vLyBUaXB0YXA6XG5pbXBvcnQgeyBFZGl0b3IsIEVkaXRvckNvbnRlbnQsIE1hcmssIGdldE1hcmtBdHRyaWJ1dGVzIH0gZnJvbSAnQHRpcHRhcC92dWUtMydcbmltcG9ydCB7IFNsaWNlLCBGcmFnbWVudCB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG4vLyBFc3NlbnRpYWxzOlxuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1kb2N1bWVudCdcbmltcG9ydCB7IFRleHQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10ZXh0J1xuLy8gTWFya3M6XG5pbXBvcnQgeyBCb2xkIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tYm9sZCdcbmltcG9ydCB7IENvZGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1jb2RlJ1xuaW1wb3J0IHsgSXRhbGljIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taXRhbGljJ1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWxpbmsnXG5pbXBvcnQgeyBTdHJpa2UgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1zdHJpa2UnXG5pbXBvcnQgeyBTdWJzY3JpcHQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1zdWJzY3JpcHQnXG5pbXBvcnQgeyBTdXBlcnNjcmlwdCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXN1cGVyc2NyaXB0J1xuaW1wb3J0IHsgVW5kZXJsaW5lIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdW5kZXJsaW5lJ1xuLy8gTm9kZXM6XG5pbXBvcnQgeyBCbG9ja3F1b3RlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tYmxvY2txdW90ZSdcbmltcG9ydCB7IENvZGVCbG9jayB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUtYmxvY2snXG5pbXBvcnQgeyBIYXJkQnJlYWsgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1oYXJkLWJyZWFrJ1xuaW1wb3J0IHsgSGVhZGluZyB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWhlYWRpbmcnXG5pbXBvcnQgeyBQYXJhZ3JhcGggfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1wYXJhZ3JhcGgnXG5pbXBvcnQgeyBIb3Jpem9udGFsUnVsZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWhvcml6b250YWwtcnVsZSdcbmltcG9ydCB7IE9yZGVyZWRMaXN0IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tb3JkZXJlZC1saXN0J1xuaW1wb3J0IHsgQnVsbGV0TGlzdCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWJ1bGxldC1saXN0J1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1saXN0LWl0ZW0nXG5pbXBvcnQgeyBGb290bm90ZXMsIEZvb3Rub3RlUmVmZXJlbmNlLCBGb290bm90ZSB9IGZyb20gJ3RpcHRhcC1mb290bm90ZXMnXG4vLyBUT0RPOlxuLy8gaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1pbWFnZSdcbi8vIGltcG9ydCB7IE1lbnRpb24gfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1tZW50aW9uJ1xuLy8gaW1wb3J0IHsgQ29kZUJsb2NrSGlnaGxpZ2h0IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tY29kZS1ibG9jay1oaWdobGlnaHQnXG4vLyBpbXBvcnQgeyBUYWJsZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlJ1xuLy8gaW1wb3J0IHsgVGFibGVDZWxsIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUtY2VsbCdcbi8vIGltcG9ydCB7IFRhYmxlSGVhZGVyIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUtaGVhZGVyJ1xuLy8gaW1wb3J0IHsgVGFibGVOb2RlcyB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLW5vZGVzJ1xuLy8gaW1wb3J0IHsgVGFibGVSb3cgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1yb3cnXG4vLyBpbXBvcnQgeyBUYXNrTGlzdCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhc2stbGlzdCdcbi8vIGltcG9ydCB7IFRhc2tJdGVtIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFzay1pdGVtJ1xuLy8gVG9vbHM6XG5pbXBvcnQgeyBIaXN0b3J5IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taGlzdG9yeSdcblxuaW1wb3J0IHsgRGl0b0ljb24gfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7IGlzQXJyYXksIGlzT2JqZWN0LCBoeXBoZW5hdGUsIGRlYm91bmNlLCBjYW1lbGl6ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignbWFya3VwJywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFZGl0b3JDb250ZW50LFxuICAgIERpdG9JY29uXG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZWRpdG9yOiBudWxsLFxuICAgICAgaGVpZ2h0OiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbGluZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEubGluZXMgfHwgMTBcbiAgICB9LFxuXG4gICAgaGFyZEJyZWFrKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5zY2hlbWEuaGFyZEJyZWFrXG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQgfHwgYGNhbGMoJHt0aGlzLmxpbmVzfWVtICogdmFyKC0tbGluZS1oZWlnaHQpKWBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWFya0J1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdtYXJrcycsIHtcbiAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgaXRhbGljOiB0cnVlLFxuICAgICAgICB1bmRlcmxpbmU6IHRydWUsXG4gICAgICAgIHN0cmlrZTogdHJ1ZSxcbiAgICAgICAgc21hbGw6IHRydWUsXG4gICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgIHN1YnNjcmlwdDogdHJ1ZSxcbiAgICAgICAgc3VwZXJzY3JpcHQ6IHRydWUsXG4gICAgICAgIGxpbms6IHtcbiAgICAgICAgICBvbkNsaWNrOiBlZGl0b3IgPT4gdGhpcy5vbkNsaWNrTGluayhlZGl0b3IpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGJhc2ljTm9kZUJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdub2RlcycsIHtcbiAgICAgICAgcGFyYWdyYXBoOiB7XG4gICAgICAgICAgY29tbWFuZDogJ3NldFBhcmFncmFwaCdcbiAgICAgICAgfSxcbiAgICAgICAgaGVhZGluZzoge1xuICAgICAgICAgIGF0dHJpYnV0ZTogJ2xldmVsJyxcbiAgICAgICAgICB2YWx1ZXM6IFsxLCAyLCAzLCA0LCA1LCA2XVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhZHZhbmNlZE5vZGVCdXR0b25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QnV0dG9ucygnbm9kZXMnLCB7XG4gICAgICAgIGJ1bGxldExpc3Q6IHRydWUsXG4gICAgICAgIG9yZGVyZWRMaXN0OiB0cnVlLFxuICAgICAgICBibG9ja3F1b3RlOiB0cnVlLFxuICAgICAgICBjb2RlQmxvY2s6IHRydWVcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHRvb2xCdXR0b25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QnV0dG9ucygndG9vbHMnLCB7XG4gICAgICAgIHVuZG86IHRydWUsXG4gICAgICAgIHJlZG86IHRydWUsXG4gICAgICAgIGZvb3Rub3Rlczoge1xuICAgICAgICAgIGNvbW1hbmQ6ICdhZGRGb290bm90ZSdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgZ3JvdXBlZEJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLm1hcmtCdXR0b25zLFxuICAgICAgICB0aGlzLmJhc2ljTm9kZUJ1dHRvbnMsXG4gICAgICAgIHRoaXMuYWR2YW5jZWROb2RlQnV0dG9ucyxcbiAgICAgICAgdGhpcy50b29sQnV0dG9uc1xuICAgICAgXS5maWx0ZXIoYnV0dG9ucyA9PiBidXR0b25zLmxlbmd0aCA+IDApXG4gICAgfSxcblxuICAgIHBhcnNlT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZToge1xuICAgICAgICAgICdjb2xsYXBzZSc6IGZhbHNlLFxuICAgICAgICAgICdwcmVzZXJ2ZSc6IHRydWUsXG4gICAgICAgICAgJ3ByZXNlcnZlLWFsbCc6ICdmdWxsJ1xuICAgICAgICB9W3RoaXMud2hpdGVzcGFjZV1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZWRpdG9yT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVkaXRhYmxlOiAhdGhpcy5yZWFkeW9ubHksXG4gICAgICAgIGF1dG9Gb2N1czogdGhpcy5hdXRvZm9jdXMsXG4gICAgICAgIGRpc2FibGVJbnB1dFJ1bGVzOiAhdGhpcy5lbmFibGVSdWxlcy5pbnB1dCxcbiAgICAgICAgZGlzYWJsZVBhc3RlUnVsZXM6ICF0aGlzLmVuYWJsZVJ1bGVzLnBhc3RlLFxuICAgICAgICBwYXJzZU9wdGlvbnM6IHRoaXMucGFyc2VPcHRpb25zLFxuICAgICAgICBlZGl0b3JQcm9wczogdGhpcy5oYXJkQnJlYWtcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgaGFuZGxlUGFzdGU6ICh2aWV3LCBldmVudCwgc2xpY2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlcyA9IFtdXG5cbiAgICAgICAgICAgICAgICBzbGljZS5jb250ZW50LmZvckVhY2goKG5vZGUsIG9mZnNldCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDAgJiYgbm9kZS50eXBlLm5hbWUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBoYXJkIGJyZWFrIGJldHdlZW4gcGFyYWdyYXBoc1xuICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKHZpZXcuc3RhdGUuc2NoZW1hLm5vZGVzLmhhcmRCcmVhay5jcmVhdGUoKSlcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBjb250ZW50IGZyb20gcGFyYWdyYXBocywga2VlcCBvdGhlciBub2RlcyBhcy1pc1xuICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5uYW1lID09PSAncGFyYWdyYXBoJykge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmNvbnRlbnQuZm9yRWFjaChjaGlsZCA9PiBub2Rlcy5wdXNoKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gdmlldy5zdGF0ZS5zY2hlbWEubm9kZXMucGFyYWdyYXBoLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICBGcmFnbWVudC5mcm9tKG5vZGVzKVxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICB2aWV3LnN0YXRlLnRyLnJlcGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHBhcmFncmFwaCksIDAsIDApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge31cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzaXphYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVzaXphYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICB3aGl0ZXNwYWNlOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2hpdGVzcGFjZScsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdjb2xsYXBzZSdcbiAgICAgIC8vIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICdjb2xsYXBzZScsICdwcmVzZXJ2ZScsICdwcmVzZXJ2ZS1hbGwnXG4gICAgfSksXG5cbiAgICBlbmFibGVSdWxlczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2VuYWJsZVJ1bGVzJywge1xuICAgICAgdHlwZTogW09iamVjdCwgQm9vbGVhbl0sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChlbmFibGVSdWxlcykge1xuICAgICAgICByZXR1cm4gaXNPYmplY3QoZW5hYmxlUnVsZXMpXG4gICAgICAgICAgPyBlbmFibGVSdWxlc1xuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBpbnB1dDogISFlbmFibGVSdWxlcyxcbiAgICAgICAgICAgICAgcGFzdGU6ICEhZW5hYmxlUnVsZXNcbiAgICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcmVhZHlvbmx5OiAndXBkYXRlRWRpdG9yT3B0aW9ucycsXG4gICAgYXV0b2ZvY3VzOiAndXBkYXRlRWRpdG9yT3B0aW9ucycsXG4gICAgZW5hYmxlUnVsZXM6ICd1cGRhdGVFZGl0b3JPcHRpb25zJ1xuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBpZ25vcmVXYXRjaCA9IGZhbHNlXG5cbiAgICBjb25zdCBvbkZvY3VzID0gKCkgPT4gdGhpcy5vbkZvY3VzKClcblxuICAgIGNvbnN0IG9uQmx1ciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25CbHVyKClcbiAgICAgIHVwZGF0ZVZhbHVlKClcbiAgICB9XG5cbiAgICBjb25zdCBvblVwZGF0ZSA9ICgpID0+IHtcbiAgICAgIHNldFZhbHVlRGVib3VuY2VkKClcbiAgICAgIHRoaXMub25JbnB1dCgpXG4gICAgfVxuXG4gICAgY29uc3Qgc2V0VmFsdWVEZWJvdW5jZWQgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgICBpZ25vcmVXYXRjaCA9IHRydWVcbiAgICAgIHVwZGF0ZVZhbHVlKClcbiAgICB9LCAxMDApXG5cbiAgICBjb25zdCB1cGRhdGVWYWx1ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmVkaXRvci5nZXRIVE1MKClcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5oYXJkQnJlYWtcbiAgICAgICAgPyBjb250ZW50LnJlcGxhY2UoL148cD4oLio/KTxcXC9wPiQvcywgJyQxJylcbiAgICAgICAgOiBjb250ZW50XG4gICAgICBpZiAodmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuZm9jdXNlZCAmJiBjaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgICBjaGFuZ2VkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLiR3YXRjaCgndmFsdWUnLCB2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlV2F0Y2gpIHtcbiAgICAgICAgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuaGFyZEJyZWFrXG4gICAgICAgICAgPyBgPHA+JHt2YWx1ZX08L3A+YFxuICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgdGhpcy5lZGl0b3IuY29tbWFuZHMuc2V0Q29udGVudChjb250ZW50LCB7XG4gICAgICAgICAgZW1pdFVwZGF0ZTogZmFsc2UsXG4gICAgICAgICAgcGFyc2VPcHRpb25zOiB0aGlzLnBhcnNlT3B0aW9uc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3Ioe1xuICAgICAgLi4udGhpcy5lZGl0b3JPcHRpb25zLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIG9uQmx1cixcbiAgICAgIG9uVXBkYXRlLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5nZXRFeHRlbnNpb25zKCksXG4gICAgICBjb250ZW50OiB0aGlzLnZhbHVlIHx8ICcnXG4gICAgfSlcbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uRHJhZ1Jlc2l6ZShldmVudCkge1xuICAgICAgY29uc3QgZ2V0UG9pbnQgPSAoeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0pID0+ICh7IHgsIHkgfSlcblxuICAgICAgbGV0IHByZXZZID0gZ2V0UG9pbnQoZXZlbnQpLnlcbiAgICAgIGxldCBoZWlnaHQgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUodGhpcy4kcmVmcy5lZGl0b3IuJGVsKS5oZWlnaHQpXG5cbiAgICAgIGNvbnN0IG1vdXNlbW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgeyB5IH0gPSBnZXRQb2ludChldmVudClcbiAgICAgICAgaGVpZ2h0ICs9IHkgLSBwcmV2WVxuICAgICAgICBwcmV2WSA9IHlcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBgJHtNYXRoLm1heChoZWlnaHQsIDApfXB4YFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuZG9tT24oZG9jdW1lbnQsIHtcbiAgICAgICAgbW91c2Vtb3ZlLFxuXG4gICAgICAgIG1vdXNldXAoZXZlbnQpIHtcbiAgICAgICAgICBtb3VzZW1vdmUoZXZlbnQpXG4gICAgICAgICAgaGFuZGxlcnMucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgdXBkYXRlRWRpdG9yT3B0aW9ucygpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnNldE9wdGlvbnModGhpcy5lZGl0b3JPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBvbkNsaWNrTGluayhlZGl0b3IpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLnJvb3RDb21wb25lbnQuc2hvd0RpYWxvZyh7XG4gICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICBEaXRvSWNvbixcbiAgICAgICAgICBocmVmOiB7XG4gICAgICAgICAgICB0eXBlOiAndXJsJyxcbiAgICAgICAgICAgIGxhYmVsOiAnTGluaycsXG4gICAgICAgICAgICBhdXRvZm9jdXM6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICBsYWJlbDogJ1RpdGxlJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYnV0dG9uczoge1xuICAgICAgICAgIGNhbmNlbDoge30sXG4gICAgICAgICAgYXBwbHk6IHsgdHlwZTogJ3N1Ym1pdCcgfSxcbiAgICAgICAgICByZW1vdmU6IHtcbiAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICBjbGljayh7IGRpYWxvZ0NvbXBvbmVudCB9KSB7XG4gICAgICAgICAgICAgICAgZGlhbG9nQ29tcG9uZW50LnJlc29sdmUobnVsbClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF0YTogZ2V0TWFya0F0dHJpYnV0ZXModGhpcy5lZGl0b3Iuc3RhdGUsICdsaW5rJylcbiAgICAgIH0pXG4gICAgICBpZiAoYXR0cmlidXRlcykge1xuICAgICAgICBsZXQgeyBocmVmLCB0aXRsZSB9ID0gYXR0cmlidXRlc1xuICAgICAgICBpZiAoaHJlZikge1xuICAgICAgICAgIC8vIFNlZSBpZiBgaHJlZmAgY2FuIGJlIHBhcnNlZCBhcyBhIFVSTCwgYW5kIGlmIG5vdCxcbiAgICAgICAgICAvLyBwcmVmaXggaXQgd2l0aCBhIGRlZmF1bHQgcHJvdG9jb2wuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBVUkwoaHJlZilcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGhyZWYgPSBgaHR0cHM6Ly8ke2hyZWZ9YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlZGl0b3IuY29tbWFuZHMuc2V0TGluayh7IGhyZWYsIHRpdGxlIH0pXG4gICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLnVuc2V0TGluaygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEV4dGVuc2lvbnMoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1hcmtzID0ge30sXG4gICAgICAgIG5vZGVzID0ge30sXG4gICAgICAgIHRvb2xzID0ge31cbiAgICAgIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLy8gRXNzZW50aWFsczpcbiAgICAgICAgdG9vbHMuZm9vdG5vdGVzXG4gICAgICAgICAgPyBEb2N1bWVudC5leHRlbmQoeyBjb250ZW50OiAnYmxvY2srIGZvb3Rub3Rlcz8nIH0pXG4gICAgICAgICAgOiBEb2N1bWVudCxcblxuICAgICAgICBUZXh0LFxuICAgICAgICBQYXJhZ3JhcGgsIC8vIGJ1dHRvbiBjYW4gYmUgY29udHJvbGxlZCwgYnV0IG5vZGUgbmVlZHMgdG8gYmUgb24uXG5cbiAgICAgICAgLy8gTWFya3M6IGBzY2hlbWEubWFya3NgXG4gICAgICAgIG1hcmtzLmJvbGQgJiYgQm9sZCxcbiAgICAgICAgbWFya3MuaXRhbGljICYmIEl0YWxpYyxcbiAgICAgICAgbWFya3MudW5kZXJsaW5lICYmIFVuZGVybGluZSxcbiAgICAgICAgbWFya3Muc3RyaWtlICYmIFN0cmlrZSxcbiAgICAgICAgbWFya3Muc21hbGwgJiYgU21hbGwsXG4gICAgICAgIG1hcmtzLmNvZGUgJiYgQ29kZSxcbiAgICAgICAgbWFya3Muc3Vic2NyaXB0ICYmIFN1cGVyc2NyaXB0LFxuICAgICAgICBtYXJrcy5zdXBlcnNjcmlwdCAmJiBTdWJzY3JpcHQsXG4gICAgICAgIG1hcmtzLmxpbmsgJiYgTGlua1dpdGhUaXRsZSxcblxuICAgICAgICAvLyBOb2RlczogYHNjaGVtYS5ub2Rlc2BcbiAgICAgICAgbm9kZXMuYmxvY2txdW90ZSAmJiBCbG9ja3F1b3RlLFxuICAgICAgICBub2Rlcy5jb2RlQmxvY2sgJiYgQ29kZUJsb2NrLFxuICAgICAgICBub2Rlcy5oZWFkaW5nICYmIEhlYWRpbmcuY29uZmlndXJlKHsgbGV2ZWxzOiBub2Rlcy5oZWFkaW5nIH0pLFxuICAgICAgICBub2Rlcy5ob3Jpem9udGFsUnVsZSAmJiBIb3Jpem9udGFsUnVsZSxcbiAgICAgICAgKG5vZGVzLm9yZGVyZWRMaXN0IHx8IG5vZGVzLmJ1bGxldExpc3QpICYmIExpc3RJdGVtLFxuICAgICAgICBub2Rlcy5idWxsZXRMaXN0ICYmIEJ1bGxldExpc3QsXG4gICAgICAgIG5vZGVzLm9yZGVyZWRMaXN0ICYmIE9yZGVyZWRMaXN0LFxuXG4gICAgICAgIC8vIEZvb3Rub3RlczpcbiAgICAgICAgLi4uKHRvb2xzLmZvb3Rub3RlcyA/IFtGb290bm90ZXMsIEZvb3Rub3RlLCBGb290bm90ZVJlZmVyZW5jZV0gOiBbXSksXG5cbiAgICAgICAgLy8gVE9ETzpcbiAgICAgICAgLy8gbm9kZXMudG9kb0xpc3QgJiYgVG9kb0l0ZW0sXG4gICAgICAgIC8vIG5vZGVzLnRvZG9MaXN0ICYmIFRvZG9MaXN0LFxuXG4gICAgICAgIC8vIFRvb2xzOiBgc2NoZW1hLnRvb2xzYFxuICAgICAgICB0b29scy5oaXN0b3J5ICYmIEhpc3RvcnksXG5cbiAgICAgICAgSGFyZEJyZWFrLmV4dGVuZCh7XG4gICAgICAgICAgYWRkS2V5Ym9hcmRTaG9ydGN1dHM6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNldEhhcmRCcmVhayA9ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNldEhhcmRCcmVhaygpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAnTW9kLUVudGVyJzogc2V0SGFyZEJyZWFrLFxuICAgICAgICAgICAgICAnU2hpZnQtRW50ZXInOiBzZXRIYXJkQnJlYWssXG4gICAgICAgICAgICAgIC4uLih0aGlzLmhhcmRCcmVhayA/IHsgRW50ZXI6IHNldEhhcmRCcmVhayB9IDogbnVsbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICBdLmZpbHRlcihleHRlbnNpb24gPT4gISFleHRlbnNpb24pXG4gICAgfSxcblxuICAgIGdldEJ1dHRvbnMoc2V0dGluZ3NOYW1lLCBkZXNjcmlwdGlvbnMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBbXVxuICAgICAgY29uc3QgeyBjb21tYW5kcyB9ID0gdGhpcy5lZGl0b3JcblxuICAgICAgY29uc3QgYWRkQnV0dG9uID0gKHsgbmFtZSwgaWNvbiwgY29tbWFuZCwgYXR0cmlidXRlcywgb25DbGljayB9KSA9PiB7XG4gICAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBpY29uLFxuICAgICAgICAgIGlzQWN0aXZlOiB0aGlzLmVkaXRvci5pc0FjdGl2ZShuYW1lLCBhdHRyaWJ1dGVzKSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBjb21tYW5kID8/PVxuICAgICAgICAgICAgICBuYW1lIGluIGNvbW1hbmRzXG4gICAgICAgICAgICAgICAgPyBuYW1lXG4gICAgICAgICAgICAgICAgOiBgdG9nZ2xlJHtjYW1lbGl6ZShuYW1lLCB0cnVlKX1gXG4gICAgICAgICAgICBpZiAoY29tbWFuZCBpbiBjb21tYW5kcykge1xuICAgICAgICAgICAgICBjb25zdCBhcHBseSA9IGF0dHJpYnV0ZXMgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5jaGFpbigpW2NvbW1hbmRdKGF0dHJpYnV0ZXMpLmZvY3VzKCkucnVuKClcbiAgICAgICAgICAgICAgb25DbGlja1xuICAgICAgICAgICAgICAgID8gb25DbGljayh0aGlzLmVkaXRvciwgYXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICA6IGFwcGx5KGF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2NoZW1hW3NldHRpbmdzTmFtZV1cbiAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBkZXNjcmlwdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoZGVzY3JpcHRpb25zKSkge1xuICAgICAgICAgIGNvbnN0IHNldHRpbmdOYW1lID0gWyd1bmRvJywgJ3JlZG8nXS5pbmNsdWRlcyhuYW1lKSA/ICdoaXN0b3J5JyA6IG5hbWVcbiAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nbc2V0dGluZ05hbWVdXG4gICAgICAgICAgY29uc3QgaWNvbiA9IGh5cGhlbmF0ZShuYW1lKVxuICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgYWRkQnV0dG9uKHsgbmFtZSwgaWNvbiB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBjb21tYW5kLCBhdHRyaWJ1dGUsIHZhbHVlcywgb25DbGljayB9ID0gZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlcykgJiYgaXNBcnJheShzZXR0aW5nKSkge1xuICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBoZWFkaW5nIGxldmVsIGF0dHJzOlxuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmcuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYWRkQnV0dG9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBgJHtpY29ufS0ke3ZhbHVlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBbYXR0cmlidXRlXTogdmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZEJ1dHRvbih7IG5hbWUsIGljb24sIGNvbW1hbmQsIG9uQ2xpY2sgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RcbiAgICB9LFxuXG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgdGhpcy5lZGl0b3IuY29tbWFuZHMuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyRWxlbWVudCgpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmNvbW1hbmRzLmJsdXIoKVxuICAgIH1cbiAgfVxufSlcblxuY29uc3QgU21hbGwgPSBNYXJrLmNyZWF0ZSh7XG4gIG5hbWU6ICdzbWFsbCcsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbeyB0YWc6ICdzbWFsbCcgfV1cbiAgfSxcblxuICByZW5kZXJIVE1MKCkge1xuICAgIHJldHVybiBbJ3NtYWxsJywgMF1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U21hbGw6XG4gICAgICAgIGF0dHJpYnV0ZXMgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy5zZXRNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgICAgfSxcbiAgICAgIHRvZ2dsZVNtYWxsOlxuICAgICAgICBhdHRyaWJ1dGVzID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUsIGF0dHJpYnV0ZXMpXG4gICAgICAgIH0sXG4gICAgICB1bnNldFNtYWxsOlxuICAgICAgICAoKSA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG5cbmNvbnN0IExpbmtXaXRoVGl0bGUgPSBMaW5rLmV4dGVuZCh7XG4gIGluY2x1c2l2ZTogZmFsc2UsXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaHJlZjoge1xuICAgICAgICBkZWZhdWx0OiBudWxsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnYScsXG4gICAgICAgIGdldEF0dHJzOiBlbGVtZW50ID0+ICh7XG4gICAgICAgICAgaHJlZjogZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxcbiAgICAgICAgICB0aXRsZTogZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJylcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydhJywgSFRNTEF0dHJpYnV0ZXMsIDBdXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1tYXJrdXAge1xuICBAZXh0ZW5kICVpbnB1dDtcblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgLlByb3NlTWlycm9yIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgfVxuXG4gIC5kaXRvLW1hcmt1cC1lZGl0b3Ige1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgICBtYXJnaW4tdG9wOiAkaW5wdXQtcGFkZGluZy12ZXI7XG4gICAgLy8gTW92ZSBwYWRkaW5nIFwiaW5zaWRlXCIgZWRpdG9yIHRvIGNvcnJlY3RseSBwb3NpdGlvbiBzY3JvbGxiYXJcbiAgICBtYXJnaW4tcmlnaHQ6IC0kaW5wdXQtcGFkZGluZy1ob3I7XG4gICAgcGFkZGluZy1yaWdodDogJGlucHV0LXBhZGRpbmctaG9yO1xuICB9XG5cbiAgLmRpdG8tYnV0dG9ucy0tdG9vbGJhciB7XG4gICAgbWFyZ2luOiAwO1xuICB9XG5cbiAgaDEsXG4gIGgyLFxuICBoMyxcbiAgcCxcbiAgdWwsXG4gIG9sLFxuICBwcmUsXG4gIGJsb2NrcXVvdGUge1xuICAgIG1hcmdpbjogMXJlbSAwO1xuXG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cblxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIH1cbiAgfVxuXG4gIGgxLFxuICBoMixcbiAgaDMge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICB9XG5cbiAgaDEge1xuICAgIGZvbnQtc2l6ZTogMS40cmVtO1xuICB9XG5cbiAgaDIge1xuICAgIGZvbnQtc2l6ZTogMS4ycmVtO1xuICB9XG5cbiAgdWwge1xuICAgIGxpc3Qtc3R5bGU6IGRpc2M7XG4gIH1cblxuICBjb2RlIHtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LW1vbm87XG4gIH1cblxuICBwcmUge1xuICAgIHBhZGRpbmc6IDAuN3JlbSAxcmVtO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1kYXJrZXI7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xuXG4gICAgY29kZSB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gIH1cblxuICBwIGNvZGUge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBwYWRkaW5nOiAwIDAuM3JlbTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItbGlnaHRlcjtcbiAgfVxuXG4gIGEge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICBjb2xvcjogYmx1ZTtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgfVxuXG4gIHVsLFxuICBvbCB7XG4gICAgcGFkZGluZy1sZWZ0OiAycmVtO1xuICB9XG5cbiAgbGkge1xuICAgICYgPiBwLFxuICAgICYgPiBvbCxcbiAgICAmID4gdWwge1xuICAgICAgbWFyZ2luOiAwO1xuICAgIH1cbiAgfVxuXG4gIGJsb2NrcXVvdGUge1xuICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgJGNvbG9yLWxpZ2h0ZXI7XG4gICAgcGFkZGluZy1sZWZ0OiAxZW07XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xuXG4gICAgcCB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgfVxuICB9XG5cbiAgb2wuZm9vdG5vdGVzIHtcbiAgICBtYXJnaW4tdG9wOiAxZW07XG4gICAgcGFkZGluZzogMWVtIDA7XG4gICAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsO1xuICAgIHBhZGRpbmctbGVmdDogMmVtO1xuXG4gICAgJjpoYXMobGkpIHtcbiAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAkY29sb3ItbGlnaHQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLW11bHRpc2VsZWN0XG4gIC5kaXRvLW11bHRpc2VsZWN0X19pbm5lclxuICAgIERpdG9BZmZpeGVzKFxuICAgICAgOml0ZW1zPVwic2NoZW1hLnByZWZpeFwiXG4gICAgICBwb3NpdGlvbj1cInByZWZpeFwiXG4gICAgICBtb2RlPVwiaW5wdXRcIlxuICAgICAgYWJzb2x1dGVcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIDpwYXJlbnRDb250ZXh0PVwiY29udGV4dFwiXG4gICAgKVxuICAgIFZ1ZU11bHRpc2VsZWN0KFxuICAgICAgcmVmPVwiZWxlbWVudFwiXG4gICAgICB2LW1vZGVsPVwic2VsZWN0ZWRPcHRpb25zXCJcbiAgICAgIDpjbGFzcz1cIm11bHRpc2VsZWN0Q2xhc3Nlc1wiXG4gICAgICA6c2hvd0xhYmVscz1cImZhbHNlXCJcbiAgICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcbiAgICAgIHRhZ1BsYWNlaG9sZGVyPVwiUHJlc3MgZW50ZXIgdG8gYWRkIG5ldyB0YWdcIlxuICAgICAgOm9wdGlvbnM9XCJwb3B1bGF0ZSAmJiBhY3RpdmVPcHRpb25zIHx8IFtdXCJcbiAgICAgIDpjdXN0b21MYWJlbD1cImdldExhYmVsRm9yT3B0aW9uXCJcbiAgICAgIDp0cmFja0J5PVwib3B0aW9uVmFsdWVcIlxuICAgICAgOmdyb3VwTGFiZWw9XCJncm91cEJ5TGFiZWxcIlxuICAgICAgOmdyb3VwVmFsdWVzPVwiZ3JvdXBCeU9wdGlvbnNcIlxuICAgICAgOm11bHRpcGxlPVwibXVsdGlwbGVcIlxuICAgICAgOnRhZ2dhYmxlPVwidGFnZ2FibGVcIlxuICAgICAgOnNlYXJjaGFibGU9XCJzZWFyY2hhYmxlXCJcbiAgICAgIDppbnRlcm5hbFNlYXJjaD1cIiFzZWFyY2hGaWx0ZXJcIlxuICAgICAgOnByZXNlcnZlU2VhcmNoPVwiISFzZWFyY2hGaWx0ZXJcIlxuICAgICAgOmNsZWFyT25TZWxlY3Q9XCIhc2VhcmNoRmlsdGVyXCJcbiAgICAgIDpjbG9zZU9uU2VsZWN0PVwiIXN0YXlPcGVuXCJcbiAgICAgIDpsb2FkaW5nPVwiaXNMb2FkaW5nXCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgICAgQG9wZW49XCJvbk9wZW5cIlxuICAgICAgQGNsb3NlPVwib25DbG9zZVwiXG4gICAgICBAdGFnPVwib25BZGRUYWdcIlxuICAgICAgQHNlYXJjaC1jaGFuZ2U9XCJvblNlYXJjaENoYW5nZVwiXG4gICAgKVxuICAgIERpdG9BZmZpeGVzKFxuICAgICAgOml0ZW1zPVwic2NoZW1hLnN1ZmZpeFwiXG4gICAgICBwb3NpdGlvbj1cInN1ZmZpeFwiXG4gICAgICBtb2RlPVwiaW5wdXRcIlxuICAgICAgYWJzb2x1dGVcbiAgICAgIDpjbGVhcmFibGU9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgOmlubGluZUluZm89XCJpbmxpbmVJbmZvXCJcbiAgICAgIDpwYXJlbnRDb250ZXh0PVwiY29udGV4dFwiXG4gICAgICBAY2xlYXI9XCJjbGVhclwiXG4gICAgKVxuICAvLy0gRWRpdCBidXR0b24gaXMgbmV2ZXIgZGlzYWJsZWQsIGV2ZW4gaWYgdGhlIGZpZWxkIGlzIGRpc2FibGVkLlxuICBEaXRvRWRpdEJ1dHRvbnMoXG4gICAgdi1pZj1cImVkaXRhYmxlXCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJkYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICA6ZGlzYWJsZWQ9XCJmYWxzZVwiXG4gICAgOmVkaXRhYmxlPVwiZWRpdGFibGVcIlxuICAgIDplZGl0UGF0aD1cImVkaXRQYXRoXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcbmltcG9ydCBEaXRvQWZmaXhlcyBmcm9tICcuLi9jb21wb25lbnRzL0RpdG9BZmZpeGVzLnZ1ZSdcbmltcG9ydCBWdWVNdWx0aXNlbGVjdCBmcm9tICd2dWUtbXVsdGlzZWxlY3QnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgaXNCb29sZWFuIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdtdWx0aXNlbGVjdCcsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcbiAgY29tcG9uZW50czogeyBEaXRvQWZmaXhlcywgVnVlTXVsdGlzZWxlY3QgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZWFyY2hlZE9wdGlvbnM6IG51bGwsXG4gICAgICBwb3B1bGF0ZTogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzZWxlY3RlZE9wdGlvbnM6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGVcbiAgICAgICAgICA/ICh0aGlzLnNlbGVjdGVkVmFsdWUgfHwgW10pXG4gICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gb3B0aW9uIGNhbm5vdCBiZSBmb3VuZCwgd2UgbWF5IGJlIGluIHRhZ2dhYmxlIG1vZGUgYW5kXG4gICAgICAgICAgICAgICAgLy8gY2FuIGFkZCBpdC5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9PiAoXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbkZvclZhbHVlKHZhbHVlKSB8fCB0aGlzLmFkZFRhZ09wdGlvbih2YWx1ZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBvcHRpb25zIHRoYXQgd2UgY291bGRuJ3QgbWF0Y2guXG4gICAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBkaXNwbGF5IGFuIGVycm9yIGluc3RlYWQ/XG4gICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRPcHRpb25cbiAgICAgIH0sXG5cbiAgICAgIHNldChvcHRpb24pIHtcbiAgICAgICAgLy8gQ29udmVydCB2YWx1ZSB0byBvcHRpb25zIG9iamVjdCwgc2luY2UgdnVlLW11bHRpc2VsZWN0IGNhbid0IG1hcCB0aGF0XG4gICAgICAgIC8vIGl0c2VsZiB1bmZvcnR1bmF0ZWx5LiBgdHJhY2stYnlgIGlzIHVzZWQgZm9yIDprZXkgbWFwcGluZyBpdCBzZWVtcy5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdGhpcy5tdWx0aXBsZVxuICAgICAgICAgID8gKG9wdGlvbiB8fCBbXSkubWFwKHZhbHVlID0+IHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24odmFsdWUpKVxuICAgICAgICAgIDogdGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhY3RpdmVPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoZWRPcHRpb25zIHx8IHRoaXMub3B0aW9uc1xuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGVcbiAgICBtdWx0aXBsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ211bHRpcGxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBzZWFyY2hhYmxlOiBnZXRTY2hlbWFBY2Nlc3Nvcignc2VhcmNoYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgdGFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCd0YWdnYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgc3RheU9wZW46IGdldFNjaGVtYUFjY2Vzc29yKCdzdGF5T3BlbicsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgbXVsdGlzZWxlY3RDbGFzc2VzKCkge1xuICAgICAgY29uc3QgcHJlZml4ID0gJ211bHRpc2VsZWN0J1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLW11bHRpcGxlYF06IHRoaXMubXVsdGlwbGUsXG4gICAgICAgIFtgJHtwcmVmaXh9LS1sb2FkaW5nYF06IHRoaXMuaXNMb2FkaW5nLFxuICAgICAgICBbYCR7cHJlZml4fS0taGlnaGxpZ2h0YF06IHRoaXMuc2hvd0hpZ2hsaWdodFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwbGFjZWhvbGRlcigpIHtcbiAgICAgIGxldCB7IHBsYWNlaG9sZGVyLCBzZWFyY2hhYmxlLCB0YWdnYWJsZSB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIGlmIChpc0Jvb2xlYW4ocGxhY2Vob2xkZXIpKSB7XG4gICAgICAgIHBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXIgPyB1bmRlZmluZWQgOiBudWxsXG4gICAgICB9XG4gICAgICByZXR1cm4gcGxhY2Vob2xkZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHNlYXJjaGFibGUgJiYgdGFnZ2FibGVcbiAgICAgICAgICA/IGBTZWFyY2ggb3IgYWRkIGEgJHt0aGlzLmxhYmVsfWBcbiAgICAgICAgICA6IHNlYXJjaGFibGVcbiAgICAgICAgICAgID8gYFNlbGVjdCBvciBzZWFyY2ggJHt0aGlzLmxhYmVsfWBcbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIDogcGxhY2Vob2xkZXJcbiAgICB9LFxuXG4gICAgc2hvd0hpZ2hsaWdodCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzTW91bnRlZCAmJiB0aGlzLiRyZWZzLmVsZW1lbnQucG9pbnRlckRpcnR5XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgaWYgKHRoaXMuYXV0b2ZvY3VzKSB7XG4gICAgICAvLyB2dWUtbXVsdGlzZWxlY3QgZG9lc24ndCBzdXBwb3J0IHRoZSBhdXRvZm9jdXMgYXR0cmlidXRlLiBXZSBuZWVkIHRvXG4gICAgICAvLyBoYW5kbGUgaXQgaGVyZS5cbiAgICAgIHRoaXMuZm9jdXMoKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgYWRkVGFnT3B0aW9uKHRhZykge1xuICAgICAgaWYgKHRoaXMudGFnZ2FibGUpIHtcbiAgICAgICAgY29uc3QgeyBvcHRpb25MYWJlbCwgb3B0aW9uVmFsdWUgfSA9IHRoaXNcbiAgICAgICAgY29uc3Qgb3B0aW9uID1cbiAgICAgICAgICBvcHRpb25MYWJlbCAmJiBvcHRpb25WYWx1ZVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXTogdGFnLFxuICAgICAgICAgICAgICAgIC8vIFRPRE86IERlZmluZSBhIHNpbXBsZSBzY2hlbWEgb3B0aW9uIHRvIGNvbnZlcnQgdGhlIHRhZyB2YWx1ZVxuICAgICAgICAgICAgICAgIC8vIHRvIHNvbWV0aGluZyBlbHNlLCBlLmcuIGB0b1RhZzogdGFnID0+IHVuZGVyc2NvcmUodGFnKWBcbiAgICAgICAgICAgICAgICBbb3B0aW9uVmFsdWVdOiB0YWdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB0YWdcbiAgICAgICAgdGhpcy5vcHRpb25zLnB1c2gob3B0aW9uKVxuICAgICAgICByZXR1cm4gb3B0aW9uXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzRWxlbWVudCgpIHtcbiAgICAgIHRoaXMuJHJlZnMuZWxlbWVudC5hY3RpdmF0ZSgpXG4gICAgfSxcblxuICAgIGJsdXJFbGVtZW50KCkge1xuICAgICAgdGhpcy4kcmVmcy5lbGVtZW50LmRlYWN0aXZhdGUoKVxuICAgIH0sXG5cbiAgICBvbk9wZW4oKSB7XG4gICAgICB0aGlzLnBvcHVsYXRlID0gdHJ1ZVxuICAgIH0sXG5cbiAgICBvbkNsb3NlKCkge1xuICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgZmlyZSBibHVyIGV2ZW50cyB3aGlsZSB0aGUgbXVsdGlzZWxlY3QgaXMgb3BlbiAoc2VlXG4gICAgICAvLyBiZWxvdyksIHdlIG5lZWQgdG8gZG8gaXQgaGVyZSwgd2hlbiBpdCdzIGFjdHVhbGx5IGNsb3NlZC5cbiAgICAgIGlmICh0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkJsdXIoKSB7XG4gICAgICBpZiAoIXRoaXMuJHJlZnMuZWxlbWVudC5pc09wZW4pIHtcbiAgICAgICAgVHlwZU1peGluLm1ldGhvZHMub25CbHVyLmNhbGwodGhpcylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25BZGRUYWcodGFnKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSB0aGlzLmFkZFRhZ09wdGlvbih0YWcpXG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPz89IFtdXG4gICAgICAgIHRoaXMudmFsdWUucHVzaCh0aGlzLmdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbikpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG9uU2VhcmNoQ2hhbmdlKHNlYXJjaFRlcm0pIHtcbiAgICAgIGlmICh0aGlzLnNlYXJjaEZpbHRlcikge1xuICAgICAgICBpZiAoc2VhcmNoVGVybSkge1xuICAgICAgICAgIC8vIFNldCBgc2VhcmNoZWRPcHRpb25zYCB0byBhbiBlbXB0eSBhcnJheSwgYmVmb3JlIGl0IHdpbGwgYmVcbiAgICAgICAgICAvLyBwb3B1bGF0ZWQgYXN5bmNocm9ub3VzbHkgd2l0aCB0aGUgYWN0dWFsIHJlc3VsdHMuXG4gICAgICAgICAgdGhpcy5zZWFyY2hlZE9wdGlvbnMgPSBbXVxuICAgICAgICAgIHRoaXMuc2VhcmNoZWRPcHRpb25zID0gYXdhaXQgdGhpcy5yZXNvbHZlRGF0YShcbiAgICAgICAgICAgICgpID0+IHRoaXMuc2VhcmNoRmlsdGVyKG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IHNlYXJjaFRlcm0gfSkpXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENsZWFyIGBzZWFyY2hlZE9wdGlvbnNgIHdoZW4gdGhlIHF1ZXJ5IGlzIGNsZWFyZWQuXG4gICAgICAgICAgdGhpcy5zZWFyY2hlZE9wdGlvbnMgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuQGltcG9ydCAndnVlLW11bHRpc2VsZWN0L2Rpc3QvdnVlLW11bHRpc2VsZWN0LmNzcyc7XG5cbiRzcGlubmVyLXdpZHRoOiAkc2VsZWN0LWFycm93LXdpZHRoO1xuJHRhZy1pY29uLXdpZHRoOiAxLjhlbTtcbiR0YWctbWFyZ2luOiAycHg7XG4kdGFnLXBhZGRpbmc6IDNweDtcbiR0YWctbGluZS1oZWlnaHQ6IDFlbTtcblxuLmRpdG8tbXVsdGlzZWxlY3Qge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICZfX2lubmVyIHtcbiAgICBmbGV4OiAxO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cblxuICAuZGl0by1lZGl0LWJ1dHRvbnMge1xuICAgIG1hcmdpbi1sZWZ0OiAkZm9ybS1zcGFjaW5nLWhhbGY7XG4gIH1cblxuICAubXVsdGlzZWxlY3Qge1xuICAgICRzZWxmOiBsYXN0LXNlbGVjdG9yKCYpO1xuXG4gICAgLS1pbnB1dC13aWR0aDogMTAwJTtcblxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBtaW4taGVpZ2h0OiBpbmhlcml0O1xuICAgIGNvbG9yOiAkY29sb3ItYmxhY2s7XG5cbiAgICAmLS1tdWx0aXBsZSB7XG4gICAgICAtLWlucHV0LXdpZHRoOiBhdXRvO1xuICAgIH1cblxuICAgICZfX3RhZ3Mge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICAgIG1pbi1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgIHBhZGRpbmc6IDAgJHNwaW5uZXItd2lkdGggMCAwO1xuICAgICAgLy8gU28gdGFncyBjYW4gZmxvYXQgb24gbXVsdGlwbGUgbGluZXMgYW5kIGhhdmUgcHJvcGVyIG1hcmdpbnM6XG4gICAgICBwYWRkaW5nLWJvdHRvbTogJHRhZy1tYXJnaW47XG5cbiAgICAgIC5kaXRvLWNvbnRhaW5lci0taGFzLWVycm9ycyAmIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAkY29sb3ItZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fdGFnIHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgbWFyZ2luOiAkdGFnLW1hcmdpbiAwIDAgJHRhZy1tYXJnaW47XG4gICAgICBib3JkZXItcmFkaXVzOiAxZW07XG4gICAgICBwYWRkaW5nOiAkdGFnLXBhZGRpbmcgJHRhZy1pY29uLXdpZHRoICR0YWctcGFkZGluZyAwLjhlbTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAkdGFnLWxpbmUtaGVpZ2h0O1xuICAgICAgaGVpZ2h0OiBjYWxjKCRpbnB1dC1oZWlnaHQgLSAyICogJHRhZy1wYWRkaW5nKTtcbiAgICB9XG5cbiAgICAmX190YWdzLXdyYXAge1xuICAgICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgICBsaW5lLWhlaWdodDogMDtcbiAgICB9XG5cbiAgICAmX19zaW5nbGUsXG4gICAgJl9fcGxhY2Vob2xkZXIsXG4gICAgJl9faW5wdXQge1xuICAgICAgQGluY2x1ZGUgZWxsaXBzaXM7XG5cbiAgICAgIGZsZXg6IDEgMCAwJTtcbiAgICAgIHdpZHRoOiAwO1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIG1hcmdpbjogMCAwIDFweCAwO1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgICAvLyBTYWRseSwgdnVlLXNlbGVjdCBzZXRzIHN0eWxlPVwicGFkZGluZzogLi4uO1wiIGluIGFkZGl0aW9uIHRvIHVzaW5nXG4gICAgICAvLyBjbGFzc2VzLCBzbyBgIWltcG9ydGFudGAgaXMgbmVjZXNzYXJ5OlxuICAgICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmcgIWltcG9ydGFudDtcbiAgICAgIC8vIFNvIGlucHV0IGNhbiBmbG9hdCBuZXh0IHRvIHRhZ3MgYW5kIGhhdmUgcHJvcGVyIG1hcmdpbnMgd2l0aFxuICAgICAgLy8gJl9fdGFnczpcbiAgICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIH1cblxuICAgICZfX3BsYWNlaG9sZGVyLFxuICAgICZfX2lucHV0OjpwbGFjZWhvbGRlciB7XG4gICAgICBjb2xvcjogJGNvbG9yLXBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgICZfX3BsYWNlaG9sZGVyIHtcbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgLy8gRW5mb3JjZSBhY3R1YWwgbGluZS1oZWlnaHQgZm9yIHBvc2l0aW9uaW5nLlxuICAgICAgICBjb250ZW50OiAnXFwyMDBiJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmX19zZWxlY3QsXG4gICAgJl9fc3Bpbm5lciB7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgLy8gJGJvcmRlci13aWR0aCB0byBwcmV2ZW50IG1hc2tpbmcgYm9yZGVyIHdpdGggJl9fc3Bpbm5lclxuICAgICAgdG9wOiAkYm9yZGVyLXdpZHRoO1xuICAgICAgcmlnaHQ6ICRib3JkZXItd2lkdGg7XG4gICAgICBib3R0b206ICRib3JkZXItd2lkdGg7XG4gICAgICBoZWlnaHQ6IGluaGVyaXQ7XG4gICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICB9XG5cbiAgICAmX19zZWxlY3Qge1xuICAgICAgd2lkdGg6ICRzZWxlY3QtYXJyb3ctd2lkdGg7XG5cbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBpbmNsdWRlIGFycm93KCRzZWxlY3QtYXJyb3ctc2l6ZSk7XG5cbiAgICAgICAgYm90dG9tOiAkc2VsZWN0LWFycm93LWJvdHRvbTtcbiAgICAgICAgcmlnaHQ6ICRzZWxlY3QtYXJyb3ctcmlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fc3Bpbm5lciB7XG4gICAgICB3aWR0aDogJHNwaW5uZXItd2lkdGg7XG5cbiAgICAgICY6OmJlZm9yZSxcbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgLy8gQ2hhbmdlIHRoZSB3aWR0aCBvZiB0aGUgbG9hZGluZyBzcGlubmVyXG4gICAgICAgIGJvcmRlci13aWR0aDogM3B4O1xuICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgICAgICBpbnNldDogMDtcbiAgICAgICAgbWFyZ2luOiBhdXRvO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX29wdGlvbiB7XG4gICAgICAkb3B0aW9uOiBsYXN0LXNlbGVjdG9yKCYpO1xuXG4gICAgICBtaW4taGVpZ2h0OiB1bnNldDtcbiAgICAgIGhlaWdodDogdW5zZXQ7XG4gICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0O1xuICAgICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgLy8gSW5zdHJ1Y3Rpb24gdGV4dCBmb3Igb3B0aW9ucyAoZS5nLiBcIlByZXNzIGVudGVyIHRvIGFkZCBuZXcgdGFnXCIpXG4gICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgICAgIHBhZGRpbmctbGVmdDogJGlucHV0LXBhZGRpbmctaG9yO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IHNob3cgdGhlIGhpZ2hsaWdodCBvbmNlIHRoZSBwdWxsZG93biBoYXMgcmVjZWl2ZWQgbW91c2Ugb3JcbiAgICAgIC8vIGtleWJvYXJkIGludGVyYWN0aW9uLCBpbiB3aGljaCBjYXNlIGAmLS1oaWdobGlnaHRgIHdpbGwgYmUgc2V0LFxuICAgICAgLy8gd2hpY2ggaXMgY29udHJvbGxlZCBieSBgcG9pbnRlckRpcnR5YCBpbiB2dWUtbXVsdGlzZWxlY3QuXG4gICAgICAvLyBVbnRpbCB0aGVuLCBjbGVhciB0aGUgaGlnaGxpZ2h0IHN0eWxlLCBidXQgb25seSBpZiBpdCBpc24ndCBhbHNvXG4gICAgICAvLyBkaXNhYmxlZCBvciBzZWxlY3RlZCwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGtlZXAgdGhlIHN0eWxlLlxuICAgICAgQGF0LXJvb3QgI3skc2VsZn06bm90KCN7JHNlbGZ9LS1oaWdobGlnaHQpXG4gICAgICAgICAgI3skb3B0aW9ufTpub3QoI3skb3B0aW9ufS0tZGlzYWJsZWQpOm5vdCgjeyRvcHRpb259LS1zZWxlY3RlZCkge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuXG4gICAgICAmLS1oaWdobGlnaHQge1xuICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIEBhdC1yb290ICN7JHNlbGZ9I3skc2VsZn0tLWhpZ2hsaWdodCAje2xhc3Qtc2VsZWN0b3IoJil9IHtcbiAgICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAmLS1zZWxlY3RlZCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWhpZ2hsaWdodDtcblxuICAgICAgICBAYXQtcm9vdCAjeyRzZWxmfSN7JHNlbGZ9LS1oaWdobGlnaHQgJiN7JG9wdGlvbn0tLWhpZ2hsaWdodCB7XG4gICAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICYtLWRpc2FibGVkIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmX190YWcge1xuICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG5cbiAgICAmX190YWctaWNvbiB7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgICAgd2lkdGg6ICR0YWctaWNvbi13aWR0aDtcbiAgICAgIG1hcmdpbjogMDtcblxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWNsZWFyO1xuXG4gICAgICAgIGZvbnQtc2l6ZTogMC45ZW07XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgIH1cblxuICAgICAgJjpob3Zlcjo6YWZ0ZXIge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fdGFncyxcbiAgICAmX19jb250ZW50LXdyYXBwZXIge1xuICAgICAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgfVxuXG4gICAgJl9fY29udGVudC13cmFwcGVyIHtcbiAgICAgIHotaW5kZXg6ICR6LWluZGV4LXBvcHVwO1xuICAgICAgYm9yZGVyLWNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgICY6bm90KCYtLWFib3ZlKSAjeyRzZWxmfV9fY29udGVudC13cmFwcGVyIHtcbiAgICAgIG1hcmdpbjogKC0kYm9yZGVyLXdpZHRoKSAwIDA7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuICAgIH1cblxuICAgICYtLWFib3ZlICN7JHNlbGZ9X19jb250ZW50LXdyYXBwZXIge1xuICAgICAgbWFyZ2luOiAwIDAgKC0kYm9yZGVyLXdpZHRoKTtcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICRib3JkZXItY29sb3I7XG4gICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgfVxuXG4gICAgJi0tYWN0aXZlIHtcbiAgICAgICN7JHNlbGZ9X19wbGFjZWhvbGRlciB7XG4gICAgICAgIC8vIERvbid0IHVzZSBgZGlzcGxheTogbm9uZWAgdG8gaGlkZSBwbGFjZS1ob2xkZXIsIGFzIHRoZSBsYXlvdXQgd291bGRcbiAgICAgICAgLy8gY29sbGFwc2UuXG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAjeyRzZWxmfV9fc2luZ2xlLFxuICAgICAgI3skc2VsZn1fX2lucHV0IHtcbiAgICAgICAgLy8gU2FkbHksIHZ1ZS1zZWxlY3Qgc2V0cyBgc3R5bGU9XCJ3aWR0aFwiYCBpbiBhZGRpdGlvbiB0byB1c2luZyBjbGFzc2VzXG4gICAgICAgIC8vIHNvIGAhaW1wb3J0YW50YCBpcyBuZWNlc3Nhcnk6XG4gICAgICAgIHdpZHRoOiB2YXIoLS1pbnB1dC13aWR0aCkgIWltcG9ydGFudDtcbiAgICAgIH1cblxuICAgICAgI3skc2VsZn1fX3RhZ3Mge1xuICAgICAgICBib3JkZXItY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG4gICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgfVxuXG4gICAgICAmI3skc2VsZn0tLWFib3ZlIHtcbiAgICAgICAgI3skc2VsZn1fX3RhZ3Mge1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG4gICAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLS1sb2FkaW5nIHtcbiAgICAgICN7JHNlbGZ9X190YWdzIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgICB9XG5cbiAgICAgICN7JHNlbGZ9X19jb250ZW50LXdyYXBwZXIge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcHV0ZWQ6IHtcbiAgICBpbnB1dFZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlICE9PSBudWxsID8gdGhpcy52YWx1ZSA6ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9XG4gICAgICAgICAgdmFsdWUgIT09ICcnXG4gICAgICAgICAgICA/IHRoaXMuaXNJbnRlZ2VyXG4gICAgICAgICAgICAgID8gTnVtYmVyKHZhbHVlKVxuICAgICAgICAgICAgICA6IHBhcnNlRmxvYXQodmFsdWUpXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgaXNJbnRlZ2VyKCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHN0ZXBWYWx1ZSgpIHtcbiAgICAgIC8vIERvbid0IHNob3cgc3RlcHMgaWYgdGhlIGlucHV0IGlzIGFsc28gY2xlYXJhYmxlLCBzaW5jZSB0aGUgc3RlcCBidXR0b25zXG4gICAgICAvLyB3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGNsZWFyIGJ1dHRvbi5cbiAgICAgIHJldHVybiB0aGlzLnN0ZXAgPT0gbnVsbCAmJiAhdGhpcy5pc0ludGVnZXJcbiAgICAgICAgPyAnYW55J1xuICAgICAgICA6IHRoaXMuc3RlcFxuICAgIH0sXG5cbiAgICBkZWNpbWFsczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RlY2ltYWxzJywge1xuICAgICAgdHlwZTogTnVtYmVyXG4gICAgfSksXG5cbiAgICBzdGVwOiBnZXRTY2hlbWFBY2Nlc3Nvcignc3RlcCcsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChzdGVwKSB7XG4gICAgICAgIC8vIEZvciBpbnRlZ2Vycywgcm91bmQgdGhlIHN0ZXBzIHRvIHRoZSBuZXh0IGJpZ2dlciBpbnRlZ2VyIHZhbHVlOlxuICAgICAgICByZXR1cm4gdGhpcy5pc0ludGVnZXIgJiYgc3RlcCAhPSBudWxsID8gTWF0aC5jZWlsKHN0ZXApIDogc3RlcFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgbWluOiBnZXRTY2hlbWFBY2Nlc3NvcignbWluJywge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZ2V0KG1pbikge1xuICAgICAgICBtaW4gPVxuICAgICAgICAgIG1pbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ3JhbmdlJywgeyB0eXBlOiBBcnJheSB9KT8uWzBdXG4gICAgICAgICAgICA6IG1pblxuICAgICAgICByZXR1cm4gdGhpcy5pc0ludGVnZXIgJiYgbWluICE9IG51bGwgPyBNYXRoLmZsb29yKG1pbikgOiBtaW5cbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG1heDogZ2V0U2NoZW1hQWNjZXNzb3IoJ21heCcsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChtYXgpIHtcbiAgICAgICAgbWF4ID1cbiAgICAgICAgICBtYXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB0aGlzLmdldFNjaGVtYVZhbHVlKCdyYW5nZScsIHsgdHlwZTogQXJyYXkgfSk/LlsxXVxuICAgICAgICAgICAgOiBtYXhcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyICYmIG1heCAhPSBudWxsID8gTWF0aC5jZWlsKG1heCkgOiBtYXhcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIHJhbmdlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmFuZ2UnLCB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8gYHRoaXMubWluYCwgYHRoaXMubWF4YCBhbHJlYWR5IHN1cHBvcnQgYHNjaGVtYS5yYW5nZWAsXG4gICAgICAgIC8vIHNvIHJlZGlyZWN0IHRoZXJlLlxuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzXG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCAmJiBtYXggIT0gbnVsbCA/IFttaW4sIG1heF0gOiB1bmRlZmluZWRcbiAgICAgIH0sXG5cbiAgICAgIHNldChyYW5nZSkge1xuICAgICAgICAvLyBQcm92aWRlIGEgc2V0dGVyIHRoYXQgZGVsZWdhdGVzIHRvIGBbdGhpcy5taW4sIHRoaXMubWF4XWAsXG4gICAgICAgIC8vIHNpbmNlIHRob3NlIGFscmVhZHkgaGFuZGxlIGBzY2hlbWEucmFuZ2VgLlxuICAgICAgICBpZiAoaXNBcnJheShyYW5nZSkpIHtcbiAgICAgICAgICA7W3RoaXMubWluLCB0aGlzLm1heF0gPSByYW5nZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0VmFsaWRhdGlvbnMoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9ucyA9IHt9XG4gICAgICBjb25zdCB7IHJhbmdlLCBtaW4sIG1heCwgZGVjaW1hbHMsIHN0ZXAgfSA9IHRoaXNcbiAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICB2YWxpZGF0aW9ucy5yYW5nZSA9IHJhbmdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobWluICE9IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5taW4gPSBtaW5cbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4ICE9IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5tYXggPSBtYXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlY2ltYWxzICE9IG51bGwpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMuZGVjaW1hbHMgPSBkZWNpbWFsc1xuICAgICAgfSBlbHNlIGlmIChzdGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2ltYWxzID0gKGAke3N0ZXB9YC5zcGxpdCgnLicpWzFdIHx8ICcnKS5sZW5ndGhcbiAgICAgICAgaWYgKGRlY2ltYWxzID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRpb25zLmRlY2ltYWxzID0gZGVjaW1hbHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5pbnRlZ2VyID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0ludGVnZXIpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMuaW50ZWdlciA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0aW9uc1xuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9JbnB1dC5kaXRvLW51bWJlcihcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cImlucHV0VmFsdWVcIlxuICB0eXBlPVwibnVtYmVyXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIDptaW49XCJtaW5cIlxuICA6bWF4PVwibWF4XCJcbiAgOnN0ZXA9XCJzdGVwVmFsdWVcIlxuKVxuICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgIERpdG9BZmZpeGVzKFxuICAgICAgOml0ZW1zPVwic2NoZW1hLnByZWZpeFwiXG4gICAgICBwb3NpdGlvbj1cInByZWZpeFwiXG4gICAgICBtb2RlPVwiaW5wdXRcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgOnBhcmVudENvbnRleHQ9XCJjb250ZXh0XCJcbiAgICApXG4gIHRlbXBsYXRlKCNzdWZmaXgpXG4gICAgRGl0b0FmZml4ZXMoXG4gICAgICA6aXRlbXM9XCJzY2hlbWEuc3VmZml4XCJcbiAgICAgIHBvc2l0aW9uPVwic3VmZml4XCJcbiAgICAgIG1vZGU9XCJpbnB1dFwiXG4gICAgICA6Y2xlYXJhYmxlPVwic2hvd0NsZWFyQnV0dG9uXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIDppbmxpbmVJbmZvPVwiaW5saW5lSW5mb1wiXG4gICAgICA6cGFyZW50Q29udGV4dD1cImNvbnRleHRcIlxuICAgICAgQGNsZWFyPVwiY2xlYXJcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgTnVtYmVyTWl4aW4gZnJvbSAnLi4vbWl4aW5zL051bWJlck1peGluLmpzJ1xuaW1wb3J0IERpdG9BZmZpeGVzIGZyb20gJy4uL2NvbXBvbmVudHMvRGl0b0FmZml4ZXMudnVlJ1xuaW1wb3J0IHsgRGl0b0lucHV0IH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ251bWJlcicsICdpbnRlZ2VyJ10sXG4gIC8vIEB2dWUvY29tcG9uZW50XG4gIHtcbiAgICBtaXhpbnM6IFtOdW1iZXJNaXhpbl0sXG4gICAgY29tcG9uZW50czogeyBEaXRvSW5wdXQsIERpdG9BZmZpeGVzIH0sXG4gICAgbmF0aXZlRmllbGQ6IHRydWUsXG4gICAgdGV4dEZpZWxkOiB0cnVlLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGlzSW50ZWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2ludGVnZXInXG4gICAgICB9XG4gICAgfVxuICB9XG4pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4vLyBPbmx5IHNob3cgc3BpbiBidXR0b25zIGlmIHRoZSBudW1iZXIgY29tcG9uZW50IGRlZmluZXMgYSBzdGVwIHNpemUuXG5pbnB1dFt0eXBlPSdudW1iZXInXTpub3QoW3N0ZXBdKSB7XG4gICY6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG4gICY6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICBtYXJnaW46IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tb2JqZWN0KFxuICB2LWlmPVwiaXNSZWFkeVwiXG4gIDppZD1cImRhdGFQYXRoXCJcbilcbiAgLmRpdG8tb2JqZWN0LWNvbnRlbnQoXG4gICAgdi1pZj1cIm9iamVjdERhdGFcIlxuICApXG4gICAgLy8tIFN1cHBvcnQgdGhlIHNhbWUgcmVuZGVyaW5nIG9wdGlvbnMgYXMgVHlwZUxpc3Q6XG4gICAgRGl0b1NjaGVtYUlubGluZWQoXG4gICAgICB2LWlmPVwiaXNJbmxpbmVkXCJcbiAgICAgIDpsYWJlbD1cIm9iamVjdExhYmVsXCJcbiAgICAgIDpzY2hlbWE9XCJnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIG9iamVjdERhdGEsIGNvbnRleHQpXCJcbiAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwib2JqZWN0RGF0YVwiXG4gICAgICA6bWV0YT1cIm5lc3RlZE1ldGFcIlxuICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWQgfHwgaXNMb2FkaW5nXCJcbiAgICAgIDpjb2xsYXBzZWQ9XCJjb2xsYXBzZWRcIlxuICAgICAgOmNvbGxhcHNpYmxlPVwiY29sbGFwc2libGVcIlxuICAgICAgOmRlbGV0YWJsZT1cIm9iamVjdERhdGEgJiYgZGVsZXRhYmxlXCJcbiAgICAgIDplZGl0YWJsZT1cIm9iamVjdERhdGEgJiYgZWRpdGFibGVcIlxuICAgICAgOmVkaXRQYXRoPVwicGF0aFwiXG4gICAgICA6YWNjdW11bGF0ZWRCYXNpcz1cImFjY3VtdWxhdGVkQmFzaXNcIlxuICAgICAgQGRlbGV0ZT1cImRlbGV0ZUl0ZW0ob2JqZWN0RGF0YSlcIlxuICAgIClcbiAgICBjb21wb25lbnQoXG4gICAgICB2LWVsc2UtaWY9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgICAgIDppcz1cInNjaGVtYS5jb21wb25lbnRcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJvYmplY3REYXRhXCJcbiAgICAgIDpuZXN0ZWQ9XCJmYWxzZVwiXG4gICAgKVxuICAgIHNwYW4oXG4gICAgICB2LWVsc2UtaWY9XCJyZW5kZXJcIlxuICAgICAgdi1odG1sPVwicmVuZGVyKGdldENvbnRleHQoKSlcIlxuICAgIClcbiAgICBzcGFuKFxuICAgICAgdi1lbHNlXG4gICAgICB2LWh0bWw9XCJnZXRJdGVtTGFiZWwoc2NoZW1hLCBvYmplY3REYXRhKVwiXG4gICAgKVxuICAvLy0gTk9URTogYERpdG9FZGl0QnV0dG9uc2AgaGVyZSBvbmx5IGhhbmRsZSB0aGUgY3JlYXRlIGJ1dHRvbiBvdXRzaWRlIG9mIHRoZVxuICAvLy0gc2NoZW1hLCB0aGUgZWRpdCBidXR0b25zIGluc2lkZSBhcmUgaGFuZGxlZCBieSBgRGl0b1NjaGVtYUlubGluZWRgLlxuICBEaXRvRWRpdEJ1dHRvbnMoXG4gICAgOmJ1dHRvbnM9XCJidXR0b25TY2hlbWFzXCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJvYmplY3REYXRhXCJcbiAgICA6cGF0aD1cInBhdGhcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgOmNyZWF0YWJsZT1cImNyZWF0YWJsZVwiXG4gICAgOmNyZWF0ZVBhdGg9XCJjcmVhdGVQYXRoXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBTb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvU291cmNlTWl4aW4uanMnXG5pbXBvcnQgeyByZXNvbHZlU2NoZW1hQ29tcG9uZW50IH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ29iamVjdCcsIHtcbiAgbWl4aW5zOiBbU291cmNlTWl4aW5dLFxuXG4gIGdldFNvdXJjZVR5cGUodHlwZSkge1xuICAgIC8vIE5vIG5lZWQgZm9yIHRyYW5zZm9ybWF0aW9uIGhlcmUuIFNlZSBUeXBlVHJlZUxpc3QgZm9yIGRldGFpbHMuXG4gICAgcmV0dXJuIHR5cGVcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG9iamVjdExhYmVsKCkge1xuICAgICAgLy8gT25seSBzaG93IGEgbGFiZWwgaWYgdGhlIG9iamVjdCBpcyBjb2xsYXBzaWJsZS5cbiAgICAgIHJldHVybiB0aGlzLmNvbGxhcHNpYmxlXG4gICAgICAgID8gdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIHRoaXMub2JqZWN0RGF0YSwgeyBhc09iamVjdDogdHJ1ZSB9KVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldENvbnRleHQoKSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgZGF0YTogdGhpcy5vYmplY3REYXRhIH0pXG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBuYW1lLFxuICAgIHJvdXRlcyxcbiAgICBsZXZlbCxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgcHJvY2VzcyA9IG51bGxcbiAgKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudChzY2hlbWEpLFxuICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgYXBpLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgZmxhdHRlbixcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgKVxuICAgIF0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1vYmplY3Qge1xuICBkaXNwbGF5OiBmbGV4O1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmc7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1pbi13aWR0aDogbWluLWNvbnRlbnQ7XG5cbiAgLmRpdG8tb2JqZWN0LWNvbnRlbnQge1xuICAgIGZsZXg6IDAgMSAxMDAlO1xuICB9XG5cbiAgPiAuZGl0by1lZGl0LWJ1dHRvbnMge1xuICAgIGZsZXg6IDEgMCAwJTtcbiAgICBtYXJnaW4tbGVmdDogJGZvcm0tc3BhY2luZztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcigncGFuZWwnLCB7XG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBleGNsdWRlVmFsdWU6IHRydWUsXG4gIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICBvbWl0U3BhY2luZzogdHJ1ZSxcblxuICBnZXRQYW5lbFNjaGVtYShhcGksIHNjaGVtYSkge1xuICAgIC8vIEZvciBhIFR5cGVQYW5lbCwgdGhlIGNvbXBvbmVudCBzY2hlbWEgaXMgYWxzbyB0aGUgcGFuZWwgc2NoZW1hLCBidXRcbiAgICAvLyByZW1vdmUgdGhlIGFkZGVkIG5hbWUsIHNvIGl0IGRvZXNuJ3QgZ2V0IGFwcGVuZGVkIHR3aWNlIHRvIGRhdGEtcGF0aC5cbiAgICBjb25zdCB7IG5hbWUsIC4uLnBhbmVsIH0gPSBzY2hlbWFcbiAgICByZXR1cm4gcGFuZWxcbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnByb2dyZXNzLmRpdG8tcHJvZ3Jlc3MoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIDp2YWx1ZT1cInByb2dyZXNzVmFsdWVcIlxuICA6bWF4PVwicHJvZ3Jlc3NNYXhcIlxuICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgTnVtYmVyTWl4aW4gZnJvbSAnLi4vbWl4aW5zL051bWJlck1peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3Byb2dyZXNzJywge1xuICBtaXhpbnM6IFtOdW1iZXJNaXhpbl0sXG4gIGNvbXB1dGVkOiB7XG4gICAgcHJvZ3Jlc3NWYWx1ZSgpIHtcbiAgICAgIGxldCB7IHZhbHVlLCByYW5nZSwgc3RlcCB9ID0gdGhpc1xuICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgIHZhbHVlIC09IHJhbmdlWzBdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZXApIHtcbiAgICAgICAgICB2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgLyBzdGVwKSAqIHN0ZXBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSAnJ1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcblxuICAgIHByb2dyZXNzTWF4KCkge1xuICAgICAgY29uc3QgeyByYW5nZSB9ID0gdGhpc1xuICAgICAgcmV0dXJuIHJhbmdlID8gcmFuZ2VbMV0gLSByYW5nZVswXSA6IG51bGxcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG51bC5kaXRvLXJhZGlvLWJ1dHRvbnMoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOmNsYXNzPVwiYGRpdG8tbGF5b3V0LS0ke3NjaGVtYS5sYXlvdXQgfHwgJ3ZlcnRpY2FsJ31gXCJcbilcbiAgbGkoXG4gICAgdi1mb3I9XCJvcHRpb24gaW4gb3B0aW9uc1wiXG4gIClcbiAgICBsYWJlbFxuICAgICAgaW5wdXQuZGl0by1yYWRpby1idXR0b24oXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXG4gICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgIDp2YWx1ZT1cImdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbilcIlxuICAgICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIClcbiAgICAgIHwge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdyYWRpbycsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcblxuICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgZGVmYXVsdFdpZHRoOiAnYXV0bydcbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1yYWRpby1idXR0b25zIHtcbiAgbGFiZWwge1xuICAgIEBleHRlbmQgJWlucHV0LWJvcmRlcmxlc3M7XG4gIH1cblxuICAuZGl0by1yYWRpby1idXR0b24ge1xuICAgIG1hcmdpbi1yaWdodDogJGZvcm0tc3BhY2luZztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zZWN0aW9uKDpjbGFzcz1cInsgJ2RpdG8tc2VjdGlvbi0tbGFiZWxsZWQnOiBoYXNMYWJlbCB9XCIpXG4gIERpdG9TY2hlbWFJbmxpbmVkLmRpdG8tc2VjdGlvbl9fc2NoZW1hKFxuICAgIDpzY2hlbWE9XCJnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIGl0ZW0sIGNvbnRleHQpXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJpdGVtXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICA6bGFiZWw9XCJsYWJlbFwiXG4gICAgOmluZm89XCJpbmZvXCJcbiAgICA6cGFkZGluZz1cImhhc0xhYmVsID8gJ25lc3RlZCcgOiAnaW5saW5lZCdcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICA6Y29sbGFwc2VkPVwiY29sbGFwc2VkXCJcbiAgICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gICAgOmxhYmVsTm9kZT1cImxhYmVsTm9kZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgZ2V0SXRlbUZvcm1TY2hlbWEsIHByb2Nlc3NTY2hlbWFDb21wb25lbnRzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3NlY3Rpb24nLCB7XG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6ICh7IHNjaGVtYSB9KSA9PiAhc2NoZW1hLm5lc3RlZCAmJiAhKCdkZWZhdWx0JyBpbiBzY2hlbWEpLFxuICBkZWZhdWx0TmVzdGVkOiBmYWxzZSxcbiAgZ2VuZXJhdGVMYWJlbDogZmFsc2UsXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmVzdGVkID8gdGhpcy52YWx1ZSA6IHRoaXMuZGF0YVxuICAgIH0sXG5cbiAgICBoYXNMYWJlbCgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuc2NoZW1hLmxhYmVsXG4gICAgfSxcblxuICAgIGNvbGxhcHNpYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignY29sbGFwc2libGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIGNvbGxhcHNlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChjb2xsYXBzZWQpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxhcHNlZCAmJiB0aGlzLmNvbGxhcHNpYmxlXG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0SXRlbUZvcm1TY2hlbWFcbiAgfSxcblxuICBhc3luYyBwcm9jZXNzU2NoZW1hKGFwaSwgc2NoZW1hLCBuYW1lLCByb3V0ZXMsIGxldmVsKSB7XG4gICAgLy8gUHJvY2VzcyBzZWN0aW9uIGNvbXBvbmVudHMgc28gdGhlaXIgZm9ybXMgZ2V0IHJlc29sdmVkIHRvby5cbiAgICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhhcGksIHNjaGVtYSwgcm91dGVzLCBsZXZlbClcbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNlY3Rpb24ge1xuICAmLS1sYWJlbGxlZCB7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzICRlYXNlLW91dC1xdWFydDtcbiAgICBtYXJnaW4tdG9wOiAkZm9ybS1zcGFjaW5nLWhhbGY7XG5cbiAgICAmOmhhcyguZGl0by1zY2hlbWEtLW9wZW4pIHtcbiAgICAgIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLy8tIE5lc3RpbmcgaXMgbmVlZGVkIHRvIG1ha2UgYW4gYXJyb3cgYXBwZWFyIG92ZXIgdGhlIHNlbGVjdCBpdGVtOlxuLmRpdG8tc2VsZWN0XG4gIC5kaXRvLXNlbGVjdF9faW5uZXJcbiAgICBEaXRvQWZmaXhlcyhcbiAgICAgIDppdGVtcz1cInNjaGVtYS5wcmVmaXhcIlxuICAgICAgcG9zaXRpb249XCJwcmVmaXhcIlxuICAgICAgbW9kZT1cImlucHV0XCJcbiAgICAgIGFic29sdXRlXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICA6cGFyZW50Q29udGV4dD1cImNvbnRleHRcIlxuICAgIClcbiAgICBzZWxlY3QoXG4gICAgICA6aWQ9XCJkYXRhUGF0aFwiXG4gICAgICByZWY9XCJlbGVtZW50XCJcbiAgICAgIHYtbW9kZWw9XCJzZWxlY3RlZFZhbHVlXCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgICAgQG1vdXNlZG93bj1cInBvcHVsYXRlID0gdHJ1ZVwiXG4gICAgICBAZm9jdXM9XCJwb3B1bGF0ZSA9IHRydWVcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWlmPVwicG9wdWxhdGVcIlxuICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICB2LWZvcj1cIm9wdGlvbiBpbiBvcHRpb25zXCJcbiAgICAgICAgKVxuICAgICAgICAgIG9wdGdyb3VwKFxuICAgICAgICAgICAgdi1pZj1cImdyb3VwQnlcIlxuICAgICAgICAgICAgOmxhYmVsPVwib3B0aW9uW2dyb3VwQnlMYWJlbF1cIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIG9wdGlvbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJvcHQgaW4gb3B0aW9uW2dyb3VwQnlPcHRpb25zXVwiXG4gICAgICAgICAgICAgIDp2YWx1ZT1cImdldFZhbHVlRm9yT3B0aW9uKG9wdClcIlxuICAgICAgICAgICAgKSB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHQpIH19XG4gICAgICAgICAgb3B0aW9uKFxuICAgICAgICAgICAgdi1lbHNlXG4gICAgICAgICAgICA6dmFsdWU9XCJnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgICApIHt7IGdldExhYmVsRm9yT3B0aW9uKG9wdGlvbikgfX1cbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJzZWxlY3RlZE9wdGlvblwiXG4gICAgICApXG4gICAgICAgIG9wdGlvbig6dmFsdWU9XCJzZWxlY3RlZFZhbHVlXCIpIHt7IGdldExhYmVsRm9yT3B0aW9uKHNlbGVjdGVkT3B0aW9uKSB9fVxuICAgIERpdG9BZmZpeGVzKFxuICAgICAgOml0ZW1zPVwic2NoZW1hLnN1ZmZpeFwiXG4gICAgICBwb3NpdGlvbj1cInN1ZmZpeFwiXG4gICAgICBtb2RlPVwiaW5wdXRcIlxuICAgICAgYWJzb2x1dGVcbiAgICAgIDpjbGVhcmFibGU9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgOmlubGluZUluZm89XCJpbmxpbmVJbmZvXCJcbiAgICAgIDpwYXJlbnRDb250ZXh0PVwiY29udGV4dFwiXG4gICAgICBAY2xlYXI9XCJjbGVhclwiXG4gICAgKVxuICAvLy0gRWRpdCBidXR0b24gaXMgbmV2ZXIgZGlzYWJsZWQsIGV2ZW4gaWYgdGhlIGZpZWxkIGlzIGRpc2FibGVkLlxuICBEaXRvRWRpdEJ1dHRvbnMoXG4gICAgdi1pZj1cImVkaXRhYmxlXCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJkYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICA6ZGlzYWJsZWQ9XCJmYWxzZVwiXG4gICAgOmVkaXRhYmxlPVwiZWRpdGFibGVcIlxuICAgIDplZGl0UGF0aD1cImVkaXRQYXRoXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcbmltcG9ydCBEaXRvQWZmaXhlcyBmcm9tICcuLi9jb21wb25lbnRzL0RpdG9BZmZpeGVzLnZ1ZSdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdzZWxlY3QnLCB7XG4gIG1peGluczogW09wdGlvbnNNaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgRGl0b0FmZml4ZXMgfSxcblxuICBuYXRpdmVGaWVsZDogdHJ1ZSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBEaXNhYmxlIGxhenktcG9wdWxhdGlvbiBmb3Igbm93LlxuICAgICAgLy8gVE9ETzogU2V0IHRvIGBmYWxzZWAgT25jZSBsaW5ldG8gZTJlIHRlc3RzIGFkZHJlc3MgdGhlaXIgaXNzdWVzLlxuICAgICAgcG9wdWxhdGU6IHRydWVcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zZWxlY3Qge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIHNlbGVjdCB7XG4gICAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgICBwYWRkaW5nLXJpZ2h0OiAkc2VsZWN0LWFycm93LXdpZHRoO1xuICB9XG5cbiAgLy8gYCZfX19pbm5lcmAgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIGVkaXQgYnV0dG9ucyBhcHBlYXIgdG8gdGhlIHJpZ2h0IG9mIHRoZVxuICAvLyBzZWxlY3Q6XG4gICZfX2lubmVyIHtcbiAgICBmbGV4OiAxO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgICY6OmJlZm9yZSB7XG4gICAgICBAaW5jbHVkZSBhcnJvdygkc2VsZWN0LWFycm93LXNpemUpO1xuXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206ICRzZWxlY3QtYXJyb3ctYm90dG9tO1xuICAgICAgcmlnaHQ6ICRzZWxlY3QtYXJyb3ctcmlnaHQ7XG5cbiAgICAgIC5kaXRvLWNvbnRhaW5lci0tZGlzYWJsZWQgJiB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWVkaXQtYnV0dG9ucyB7XG4gICAgbWFyZ2luLWxlZnQ6ICRmb3JtLXNwYWNpbmctaGFsZjtcbiAgfVxuXG4gIC8vIEhhbmRsZSB3aWR0aCBmaWxsIHNlcGFyYXRlbHkgZHVlIHRvIHJlcXVpcmVkIG5lc3Rpbmcgb2Ygc2VsZWN0OlxuICAmLmRpdG8tY29tcG9uZW50LS1maWxsIHtcbiAgICBzZWxlY3Qge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNsaWRlclxuICBpbnB1dC5kaXRvLXJhbmdlKFxuICAgIDppZD1cImRhdGFQYXRoXCJcbiAgICByZWY9XCJlbGVtZW50XCJcbiAgICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gICAgdHlwZT1cInJhbmdlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICA6bWluPVwibWluXCJcbiAgICA6bWF4PVwibWF4XCJcbiAgICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4gIClcbiAgRGl0b0lucHV0LmRpdG8tbnVtYmVyKFxuICAgIHYtaWY9XCJpbnB1dFwiXG4gICAgdi1tb2RlbD1cImlucHV0VmFsdWVcIlxuICAgIHR5cGU9XCJudW1iZXJcIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIDptaW49XCJtaW5cIlxuICAgIDptYXg9XCJtYXhcIlxuICAgIDpzdGVwPVwic3RlcFZhbHVlXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBOdW1iZXJNaXhpbiBmcm9tICcuLi9taXhpbnMvTnVtYmVyTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgRGl0b0lucHV0IH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcignc2xpZGVyJywge1xuICBtaXhpbnM6IFtOdW1iZXJNaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgRGl0b0lucHV0IH0sXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBzaG93SW5wdXRgP1xuICAgIGlucHV0OiBnZXRTY2hlbWFBY2Nlc3NvcignaW5wdXQnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zbGlkZXIge1xuICBAZXh0ZW5kICVpbnB1dDtcblxuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLXJhbmdlIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGhlaWdodDogY2FsYygxZW0gKiB2YXIoLS1saW5lLWhlaWdodCkpO1xuICB9XG5cbiAgLmRpdG8tbnVtYmVyIHtcbiAgICBib3JkZXI6IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWUvdmFsaWQtdGVtcGxhdGUtcm9vdCAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+PC90ZW1wbGF0ZT5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3NwYWNlcicsIHtcbiAgZGVmYXVsdFZhbHVlOiAoKSA9PiB1bmRlZmluZWQsIC8vIENhbGxiYWNrIHRvIG92ZXJyaWRlIGBkZWZhdWx0VmFsdWU6IG51bGxgXG4gIGV4Y2x1ZGVWYWx1ZTogdHJ1ZSxcbiAgZ2VuZXJhdGVMYWJlbDogZmFsc2Vcbn0pXG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvU3dpdGNoLmRpdG8tc3dpdGNoKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICB2LW1vZGVsPVwidmFsdWVcIlxuICA6bGFiZWxzPVwibGFiZWxzXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgRGl0b1N3aXRjaCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3N3aXRjaCcsIHtcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZGVmYXVsdFdpZHRoOiAnYXV0bycsXG5cbiAgY29tcG9uZW50czoge1xuICAgIERpdG9Td2l0Y2hcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGxhYmVscygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5sYWJlbHNcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zd2l0Y2gge1xuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1zbWFsbDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGdldERlZmF1bHRWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXB1dGVkOiB7XG4gICAgdHJpbTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3RyaW0nLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KVxuICB9LFxuXG4gIHByb2Nlc3NWYWx1ZShjb250ZXh0KSB7XG4gICAgbGV0IHsgc2NoZW1hLCB2YWx1ZSB9ID0gY29udGV4dFxuICAgIGlmIChzY2hlbWEudHJpbSAmJiB2YWx1ZSAhPSBudWxsICYmIGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgLy8gVGV4dCBmaWVsZHMgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSBhIGBTdHJpbmdgIHZhbHVlIHdoZW4gYGZvcm1hdCgpYFxuICAgICAgLy8gd2l0aG91dCBgcGFyc2UoKWAgaXMgdXNlZC5cbiAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpXG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKHNjaGVtYSwgY29udGV4dClcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvSW5wdXQuZGl0by10ZXh0KFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gIDp0eXBlPVwiaW5wdXRUeXBlXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG4gIHRlbXBsYXRlKCNwcmVmaXgpXG4gICAgRGl0b0FmZml4ZXMoXG4gICAgICA6aXRlbXM9XCJzY2hlbWEucHJlZml4XCJcbiAgICAgIHBvc2l0aW9uPVwicHJlZml4XCJcbiAgICAgIG1vZGU9XCJpbnB1dFwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICA6cGFyZW50Q29udGV4dD1cImNvbnRleHRcIlxuICAgIClcbiAgdGVtcGxhdGUoI3N1ZmZpeClcbiAgICBEaXRvQWZmaXhlcyhcbiAgICAgIDppdGVtcz1cInNjaGVtYS5zdWZmaXhcIlxuICAgICAgcG9zaXRpb249XCJzdWZmaXhcIlxuICAgICAgbW9kZT1cImlucHV0XCJcbiAgICAgIDpjbGVhcmFibGU9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgOmlubGluZUluZm89XCJpbmxpbmVJbmZvXCJcbiAgICAgIDpwYXJlbnRDb250ZXh0PVwiY29udGV4dFwiXG4gICAgICBAY2xlYXI9XCJjbGVhclwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBUZXh0TWl4aW4gZnJvbSAnLi4vbWl4aW5zL1RleHRNaXhpbidcbmltcG9ydCBEaXRvQWZmaXhlcyBmcm9tICcuLi9jb21wb25lbnRzL0RpdG9BZmZpeGVzLnZ1ZSdcbmltcG9ydCB7IERpdG9JbnB1dCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG5jb25zdCBtYXNrZWRQYXNzd29yZCA9ICcqKioqKioqKioqKioqKioqJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgW1xuICAgICd0ZXh0JyxcbiAgICAnZW1haWwnLFxuICAgICd1cmwnLFxuICAgICdob3N0bmFtZScsXG4gICAgJ2RvbWFpbicsXG4gICAgJ3RlbCcsXG4gICAgJ3Bhc3N3b3JkJyxcbiAgICAnY3JlZGl0Y2FyZCdcbiAgXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIG1peGluczogW1RleHRNaXhpbl0sXG4gICAgY29tcG9uZW50czogeyBEaXRvSW5wdXQsIERpdG9BZmZpeGVzIH0sXG4gICAgbmF0aXZlRmllbGQ6IHRydWUsXG4gICAgdGV4dEZpZWxkOiB0cnVlLFxuICAgIGlnbm9yZU1pc3NpbmdWYWx1ZTogKHsgc2NoZW1hIH0pID0+IHNjaGVtYS50eXBlID09PSAncGFzc3dvcmQnLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGlucHV0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjcmVkaXRjYXJkOiAndGV4dCcsXG4gICAgICAgICAgICBob3N0bmFtZTogJ3RleHQnLFxuICAgICAgICAgICAgZG9tYWluOiAndGV4dCdcbiAgICAgICAgICB9W3RoaXMudHlwZV0gfHxcbiAgICAgICAgICB0aGlzLnR5cGVcbiAgICAgICAgKVxuICAgICAgfSxcblxuICAgICAgaW5wdXRWYWx1ZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudHlwZSA9PT0gJ3Bhc3N3b3JkJyAmJlxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhdGhpcy5mb2N1c2VkXG4gICAgICAgICAgKVxuICAgICAgICAgICAgPyBtYXNrZWRQYXNzd29yZFxuICAgICAgICAgICAgOiB0aGlzLnZhbHVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgZ2V0VmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHJ1bGUgPSB7XG4gICAgICAgICAgZW1haWw6ICdlbWFpbCcsXG4gICAgICAgICAgdXJsOiAndXJsJyxcbiAgICAgICAgICBob3N0bmFtZTogJ2hvc3RuYW1lJyxcbiAgICAgICAgICBkb21haW46ICdkb21haW4nLFxuICAgICAgICAgIHBhc3N3b3JkOiAncGFzc3dvcmQnLFxuICAgICAgICAgIGNyZWRpdGNhcmQ6ICdjcmVkaXRjYXJkJ1xuICAgICAgICB9W3RoaXMudHlwZV1cbiAgICAgICAgcmV0dXJuIHJ1bGUgPyB7IFtydWxlXTogdHJ1ZSB9IDoge31cbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnRleHRhcmVhLmRpdG8tdGV4dGFyZWEuZGl0by1pbnB1dChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIDpyb3dzPVwibGluZXNcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLXRleHRhcmVhLS1yZXNpemFibGUnOiByZXNpemFibGUgfVwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFRleHRNaXhpbiBmcm9tICcuLi9taXhpbnMvVGV4dE1peGluJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCd0ZXh0YXJlYScsIHtcbiAgbWl4aW5zOiBbVGV4dE1peGluXSxcbiAgbmF0aXZlRmllbGQ6IHRydWUsXG4gIHRleHRGaWVsZDogdHJ1ZSxcblxuICBjb21wdXRlZDoge1xuICAgIGxpbmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxpbmVzIHx8IDRcbiAgICB9LFxuXG4gICAgcmVzaXphYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVzaXphYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSlcbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRleHRhcmVhIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHJlc2l6ZTogbm9uZTtcbiAgbWluLWhlaWdodDogY2FsYygxZW0gKiB2YXIoLS1saW5lLWhlaWdodCkgKyAjezIgKiAkaW5wdXQtcGFkZGluZy12ZXJ9KTtcblxuICAmLS1yZXNpemFibGUge1xuICAgIHJlc2l6ZTogdmVydGljYWw7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdHJlZS1saXN0XG4gIERpdG9TY29wZXMoXG4gICAgdi1pZj1cInNjb3Blc1wiXG4gICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgIDpzY29wZXM9XCJzY29wZXNcIlxuICApXG4gIC5kaXRvLXRyZWUtcGFuZWxcbiAgICBEaXRvVHJlZUl0ZW0oXG4gICAgICA6c2NoZW1hPVwidHJlZVNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJ0cmVlRGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJ0cmVlRGF0YVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgIDpvcGVuPVwidHJ1ZVwiXG4gICAgICBAdXBkYXRlOmRhdGE9XCJkYXRhID0+ICh2YWx1ZSA9IGRhdGEpXCJcbiAgICApXG4gICAgLmRpdG8tdHJlZS1mb3JtLWNvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJlZGl0UGF0aCAmJiBoYXNFZGl0YWJsZUZvcm1zXCJcbiAgICApXG4gICAgICAvLy0gSW5jbHVkZSBhIHJvdXRlci12aWV3IGZvciB0aGUgb3B0aW9uYWwgRGl0b0Zvcm1JbmxpbmVkXG4gICAgICBSb3V0ZXJWaWV3XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFNvdXJjZU1peGluIGZyb20gJy4uL21peGlucy9Tb3VyY2VNaXhpbi5qcydcbmltcG9ydCB7XG4gIGhhc0Zvcm1TY2hlbWEsXG4gIGdldEZvcm1TY2hlbWFzLFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ3RyZWUtbGlzdCcsICd0cmVlLW9iamVjdCddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgbWl4aW5zOiBbU291cmNlTWl4aW5dLFxuXG4gICAgcHJvdmlkZSgpIHtcbiAgICAgIHJldHVybiB7IGNvbnRhaW5lcjogdGhpcyB9XG4gICAgfSxcblxuICAgIGdldFNvdXJjZVR5cGUodHlwZSkge1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICd0cmVlLW9iamVjdCcgPyAnb2JqZWN0JyA6ICdsaXN0J1xuICAgIH0sXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgcGF0aCgpIHtcbiAgICAgICAgLy8gQWNjZXNzZWQgZnJvbSBEaXRvVHJlZUl0ZW0gdGhyb3VnaCBgY29udGFpbmVyLnBhdGhgOlxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50Py5wYXRoXG4gICAgICB9LFxuXG4gICAgICBlZGl0UGF0aCgpIHtcbiAgICAgICAgLy8gQWNjZXNzZWQgZnJvbSBEaXRvVHJlZUl0ZW0gdGhyb3VnaCBgY29udGFpbmVyLmVkaXRQYXRoYDpcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuJHJvdXRlLnBhdGguc2xpY2UodGhpcy5wYXRoPy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBwYXRoLnN0YXJ0c1dpdGgoYC8ke3RoaXMuc2NoZW1hLnBhdGh9YCkgPyBwYXRoIDogJydcbiAgICAgIH0sXG5cbiAgICAgIHRyZWVEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xpc3RTb3VyY2VcbiAgICAgICAgICA/IHsgW3RoaXMubmFtZV06IHRoaXMudmFsdWUgfVxuICAgICAgICAgIDogdGhpcy52YWx1ZVxuICAgICAgfSxcblxuICAgICAgdHJlZURhdGFQYXRoKCkge1xuICAgICAgICAvLyBSZW1vdmUgYG5hbWVgIGZyb20gYGRhdGFQYXRoYCwgYXMgaXQgaXMgYWRkZWRcbiAgICAgICAgLy8gdG8gYHRyZWVEYXRhYCBhbmQgYHRyZWVTY2hlbWFgXG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgID8gdGhpcy5kYXRhUGF0aC5zbGljZSgwLCB0aGlzLmRhdGFQYXRoLmxlbmd0aCAtIHRoaXMubmFtZS5sZW5ndGgpXG4gICAgICAgICAgOiB0aGlzLmRhdGFQYXRoXG4gICAgICB9LFxuXG4gICAgICB0cmVlU2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xpc3RTb3VyY2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5zY2hlbWFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdGhpcy5zY2hlbWFcbiAgICAgIH0sXG5cbiAgICAgIGhhc0VkaXRhYmxlRm9ybXMoKSB7XG4gICAgICAgIGNvbnN0IGhhc0VkaXRhYmxlRm9ybXMgPSBzY2hlbWEgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBoYXNGb3JtU2NoZW1hKHNjaGVtYSkgJiYgKFxuICAgICAgICAgICAgICB0aGlzLmdldFNjaGVtYVZhbHVlKCdlZGl0YWJsZScsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNjaGVtYVxuICAgICAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgICBzY2hlbWEuY2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgaGFzRWRpdGFibGVGb3JtcyhzY2hlbWEuY2hpbGRyZW4pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNFZGl0YWJsZUZvcm1zKHRoaXMuc2NoZW1hKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBwcm9jZXNzU2NoZW1hKFxuICAgICAgYXBpLFxuICAgICAgc2NoZW1hLFxuICAgICAgbmFtZSxcbiAgICAgIHJvdXRlcyxcbiAgICAgIGxldmVsLFxuICAgICAgbmVzdGVkID0gdHJ1ZSxcbiAgICAgIGZsYXR0ZW4gPSBmYWxzZSxcbiAgICAgIHByb2Nlc3MgPSBudWxsXG4gICAgKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHJlc29sdmVTY2hlbWFDb21wb25lbnRzKHNjaGVtYS5wcm9wZXJ0aWVzKSxcbiAgICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgICBhcGksXG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcm91dGVzLFxuICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIG5lc3RlZCxcbiAgICAgICAgICBmbGF0dGVuLFxuICAgICAgICAgIC8vIFBhc3MgcHJvY2VzcygpIHRvIGFkZCBtb3JlIHJvdXRlcyB0byBjaGlsZFJvdXRlczpcbiAgICAgICAgICAoY2hpbGRSb3V0ZXMsIGxldmVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSBzY2hlbWFcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgICAgICAvLyBBZGQgYHR5cGVgIHRvIHRoZSBuZXN0ZWQgdHJlZSBsaXN0LlxuICAgICAgICAgICAgICBjaGlsZHJlbi50eXBlID0gJ3RyZWUtbGlzdCdcbiAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2FsbCBgcHJvY2Vzc1NjaGVtYSgpYCBmb3IgdGhlIG5lc3RlZCB0cmVlIGxpc3Q6XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTY2hlbWEoXG4gICAgICAgICAgICAgICAgYXBpLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLm5hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGRSb3V0ZXMsXG4gICAgICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICAgICAgbmVzdGVkLFxuICAgICAgICAgICAgICAgIHRydWUsIC8vIFBhc3MgYHRydWVgIGZvciBgZmxhdHRlbmAgaW4gdHJlZSBsaXN0cy5cbiAgICAgICAgICAgICAgICBwcm9jZXNzXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIF0pXG4gICAgfSxcblxuICAgIGdldEZvcm1TY2hlbWFzRm9yUHJvY2Vzc2luZyhzY2hlbWEsIGNvbnRleHQpIHtcbiAgICAgIC8vIENvbnZlcnQgbmVzdGVkIGNoaWxkcmVuIHNjaGVtYSB0byBzdGFuZC1hbG9uZSBzY2hlbWEgY29tcG9uZW50LFxuICAgICAgLy8gcHJlc2VudCBpbiBlYWNoIG9mIHRoZSBmb3JtcywgYXMgcmVxdWlyZWQgYnkgYHByb2Nlc3NTY2hlbWFEYXRhKClgXG4gICAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSBzY2hlbWFcbiAgICAgIHJldHVybiBnZXRGb3JtU2NoZW1hcyhcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjaGlsZHJlblxuICAgICAgICAgID8gZm9ybSA9PiAoe1xuICAgICAgICAgICAgICAuLi5mb3JtLFxuICAgICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgLi4uZm9ybS5jb21wb25lbnRzLFxuICAgICAgICAgICAgICAgIFtjaGlsZHJlbi5uYW1lXTogY2hpbGRyZW5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IG51bGxcbiAgICAgIClcbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRyZWUtbGlzdCB7XG4gIEBleHRlbmQgJWZpZWxkO1xuXG4gIC5kaXRvLXRyZWUtcGFuZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXG4gICAgPiAuZGl0by10cmVlLWl0ZW0ge1xuICAgICAgZmxleDogMSAxIDI1JTtcbiAgICB9XG5cbiAgICA+IC5kaXRvLXRyZWUtZm9ybS1jb250YWluZXIge1xuICAgICAgZmxleDogMCAxIDc1JTtcbiAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29udGVudC1jb2xvci1iYWNrZ3JvdW5kO1xuICAgICAgYm9yZGVyLWxlZnQ6ICRib3JkZXItc3R5bGU7XG4gICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXMgLSAxO1xuICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICRib3JkZXItcmFkaXVzIC0gMTtcbiAgICAgIG1hcmdpbjogKC0kaW5wdXQtcGFkZGluZy12ZXIpICgtJGlucHV0LXBhZGRpbmctaG9yKTtcbiAgICAgIG1hcmdpbi1sZWZ0OiAkaW5wdXQtcGFkZGluZy1ob3I7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgZmlsZXNpemUgfSBmcm9tICdmaWxlc2l6ZSdcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZpbGVTaXplKHNpemUpIHtcbiAgcmV0dXJuIGZpbGVzaXplKHNpemUsIHsgYmFzZTogMTAgfSlcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by11cGxvYWRcbiAgLy8tIEluIG9yZGVyIHRvIGhhbmRsZSB1cGxvYWQgYnV0dG9ucyBpbiBtdWx0aXBsZSBwb3NzaWJsZSBwbGFjZXMsIGRlcGVuZGluZ1xuICAvLy0gb24gd2hldGhlciB0aGV5IGhhbmRsZSBzaW5nbGUgb3IgbXVsdGlwbGUgdXBsb2FkcywgcmVuZGVyIHRoZSB1cGxvYWRcbiAgLy8tIGNvbXBvbmVudCBpbnZpc2libHkgYXQgdGhlIHJvb3QsIGFuZCBkZWxlZ2F0ZSB0aGUgY2xpY2sgZXZlbnRzIHRvIGl0IGZyb21cbiAgLy8tIHRoZSBidXR0b25zIHJlbmRlcmVkIGZ1cnRoZXIgYmVsb3cuIEx1Y2tpbHkgdGhpcyB3b3JrcyBzdXJwcmlzaW5nbHkgd2VsbC5cbiAgVnVlVXBsb2FkLmRpdG8tdXBsb2FkX19pbnB1dChcbiAgICByZWY9XCJ1cGxvYWRcIlxuICAgIHYtbW9kZWw9XCJ1cGxvYWRzXCJcbiAgICA6aW5wdXRJZD1cImRhdGFQYXRoXCJcbiAgICA6bmFtZT1cImRhdGFQYXRoXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgOnBvc3RBY3Rpb249XCJ1cGxvYWRQYXRoXCJcbiAgICA6ZXh0ZW5zaW9ucz1cImV4dGVuc2lvbnNcIlxuICAgIDphY2NlcHQ9XCJhY2NlcHRcIlxuICAgIDptdWx0aXBsZT1cIm11bHRpcGxlXCJcbiAgICA6c2l6ZT1cIm1heFNpemVcIlxuICAgIDpkcm9wPVwiJGVsPy5jbG9zZXN0KCcuZGl0by1jb250YWluZXInKVwiXG4gICAgOmRyb3BEaXJlY3Rvcnk9XCJ0cnVlXCJcbiAgICBAaW5wdXQtZmlsdGVyPVwib25JbnB1dEZpbHRlclwiXG4gICAgQGlucHV0LWZpbGU9XCJvbklucHV0RmlsZVwiXG4gIClcbiAgdGFibGUuZGl0by10YWJsZS5kaXRvLXRhYmxlLS1zZXBhcmF0b3JzLmRpdG8tdGFibGUtLWJhY2tncm91bmRcbiAgICAvLy0gU3R5bGluZyBjb21lcyBmcm9tIGBEaXRvVGFibGVIZWFkYFxuICAgIHRoZWFkLmRpdG8tdGFibGUtaGVhZFxuICAgICAgdHJcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuIEZpbGVcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuIFNpemVcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuIFN0YXR1c1xuICAgICAgICB0aFxuICAgICAgICAgIHNwYW5cbiAgICBEaXRvRHJhZ2dhYmxlKFxuICAgICAgdi1tb2RlbD1cImZpbGVzXCJcbiAgICAgIGFzPVwidGJvZHlcIlxuICAgICAgOm9wdGlvbnM9XCJnZXREcmFnZ2FibGVPcHRpb25zKClcIlxuICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtaWY9XCJtdWx0aXBsZSB8fCAhaXNVcGxvYWRBY3RpdmVcIlxuICAgICAgKVxuICAgICAgICB0cihcbiAgICAgICAgICB2LWZvcj1cIihmaWxlLCBpbmRleCkgaW4gZmlsZXNcIlxuICAgICAgICAgIDprZXk9XCJmaWxlLm5hbWVcIlxuICAgICAgICApXG4gICAgICAgICAgdGQoXG4gICAgICAgICAgICB2LWlmPVwicmVuZGVyXCJcbiAgICAgICAgICAgIHYtaHRtbD1cInJlbmRlckZpbGUoZmlsZSwgaW5kZXgpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgdGQoXG4gICAgICAgICAgICB2LWVsc2UtaWY9XCJkb3dubG9hZFVybHNbaW5kZXhdXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBhKFxuICAgICAgICAgICAgICA6ZG93bmxvYWQ9XCJmaWxlLm5hbWVcIlxuICAgICAgICAgICAgICA6aHJlZj1cImRvd25sb2FkVXJsc1tpbmRleF1cIlxuICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICBAY2xpY2sucHJldmVudD1cIm9uQ2xpY2tEb3dubG9hZChmaWxlLCBpbmRleClcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBEaXRvVXBsb2FkRmlsZShcbiAgICAgICAgICAgICAgICA6ZmlsZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgIDp0aHVtYm5haWw9XCJ0aHVtYm5haWxzXCJcbiAgICAgICAgICAgICAgICA6dGh1bWJuYWlsVXJsPVwidGh1bWJuYWlsVXJsc1tpbmRleF1cIlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgdGQoXG4gICAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICApXG4gICAgICAgICAgICBEaXRvVXBsb2FkRmlsZShcbiAgICAgICAgICAgICAgOmZpbGU9XCJmaWxlXCJcbiAgICAgICAgICAgICAgOnRodW1ibmFpbD1cInRodW1ibmFpbHNcIlxuICAgICAgICAgICAgICA6dGh1bWJuYWlsVXJsPVwidGh1bWJuYWlsVXJsc1tpbmRleF1cIlxuICAgICAgICAgICAgKVxuICAgICAgICAgIHRkLmRpdG8tdXBsb2FkX19zaXplIHt7IGZvcm1hdEZpbGVTaXplKGZpbGUuc2l6ZSkgfX1cbiAgICAgICAgICB0ZC5kaXRvLXVwbG9hZF9fc3RhdHVzXG4gICAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgICAgdi1pZj1cImZpbGUudXBsb2FkXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICAgICAgdi1pZj1cImZpbGUudXBsb2FkLmVycm9yXCJcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHwgRXJyb3I6IHt7IGZpbGUudXBsb2FkLmVycm9yIH19XG4gICAgICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgICAgIHYtZWxzZS1pZj1cImZpbGUudXBsb2FkLmFjdGl2ZVwiXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB8IFVwbG9hZGluZy4uLlxuICAgICAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJmaWxlLnVwbG9hZC5zdWNjZXNzXCJcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHwgVXBsb2FkZWRcbiAgICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfCBTdG9yZWRcbiAgICAgICAgICB0ZC5kaXRvLXRhYmxlX19idXR0b25zXG4gICAgICAgICAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy0tcm91bmRcbiAgICAgICAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uLmRpdG8tYnV0dG9uLS11cGxvYWQoXG4gICAgICAgICAgICAgICAgdi1pZj1cIiFtdWx0aXBsZVwiXG4gICAgICAgICAgICAgICAgOnRpdGxlPVwidXBsb2FkVGl0bGVcIlxuICAgICAgICAgICAgICAgIEBjbGljaz1cIm9uQ2xpY2tVcGxvYWRcIlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC8vLSBGaXJlZm94IGRvZXNuJ3QgbGlrZSA8YnV0dG9uPiBoZXJlLCBzbyB1c2UgPGE+IGluc3RlYWQ6XG4gICAgICAgICAgICAgIGEuZGl0by1idXR0b24oXG4gICAgICAgICAgICAgICAgdi1pZj1cImRyYWdnYWJsZVwiXG4gICAgICAgICAgICAgICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kcmFnKVwiXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgICAgICAgIHYtaWY9XCJkZWxldGFibGVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZGVsZXRlKVwiXG4gICAgICAgICAgICAgICAgQGNsaWNrPVwiZGVsZXRlRmlsZShmaWxlLCBpbmRleClcIlxuICAgICAgICAgICAgICApXG4gICAgdGZvb3QoXG4gICAgICB2LWlmPVwibXVsdGlwbGUgfHwgaXNVcGxvYWRBY3RpdmUgfHwgIWhhc0ZpbGVzXCJcbiAgICApXG4gICAgICB0clxuICAgICAgICB0ZCg6Y29sc3Bhbj1cIjRcIilcbiAgICAgICAgICAuZGl0by11cGxvYWQtZm9vdGVyXG4gICAgICAgICAgICBwcm9ncmVzcy5kaXRvLXByb2dyZXNzKFxuICAgICAgICAgICAgICB2LWlmPVwiaXNVcGxvYWRBY3RpdmVcIlxuICAgICAgICAgICAgICA6dmFsdWU9XCJ1cGxvYWRQcm9ncmVzc1wiXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy0tcm91bmRcbiAgICAgICAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgICAgICAgIHYtaWY9XCJpc1VwbG9hZEFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgQGNsaWNrLnByZXZlbnQ9XCJ1cGxvYWQuYWN0aXZlID0gZmFsc2VcIlxuICAgICAgICAgICAgICApIENhbmNlbFxuICAgICAgICAgICAgICBidXR0b24uZGl0by1idXR0b24uZGl0by1idXR0b24tLXVwbG9hZChcbiAgICAgICAgICAgICAgICB2LWlmPVwibXVsdGlwbGUgfHwgIWhhc0ZpbGVzXCJcbiAgICAgICAgICAgICAgICA6dGl0bGU9XCJ1cGxvYWRUaXRsZVwiXG4gICAgICAgICAgICAgICAgQGNsaWNrPVwib25DbGlja1VwbG9hZFwiXG4gICAgICAgICAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgU29ydGFibGVNaXhpbiBmcm9tICcuLi9taXhpbnMvU29ydGFibGVNaXhpbi5qcydcbmltcG9ydCBwYXJzZUZpbGVTaXplIGZyb20gJ2ZpbGVzaXplLXBhcnNlcidcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBmb3JtYXRGaWxlU2l6ZSB9IGZyb20gJy4uL3V0aWxzL3VuaXRzLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNBcnJheSwgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgVnVlVXBsb2FkIGZyb20gJ3Z1ZS11cGxvYWQtY29tcG9uZW50J1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3VwbG9hZCcsIHtcbiAgbWl4aW5zOiBbU29ydGFibGVNaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgVnVlVXBsb2FkIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBsb2FkczogW11cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB1cGxvYWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy51cGxvYWRcbiAgICB9LFxuXG4gICAgdXBsb2FkVGl0bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/ICdVcGxvYWQgRmlsZXMnIDogJ1VwbG9hZCBGaWxlJ1xuICAgIH0sXG5cbiAgICBmaWxlcygpIHtcbiAgICAgIHJldHVybiBhc0ZpbGVzKHRoaXMudmFsdWUpXG4gICAgfSxcblxuICAgIGRvd25sb2FkVXJscygpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVzLm1hcCgoZmlsZSwgaW5kZXgpID0+IHRoaXMuZ2V0RG93bmxvYWRVcmwoZmlsZSwgaW5kZXgpKVxuICAgIH0sXG5cbiAgICB0aHVtYm5haWxVcmxzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZXMubWFwKChmaWxlLCBpbmRleCkgPT4gdGhpcy5nZXRUaHVtYm5haWxVcmwoZmlsZSwgaW5kZXgpKVxuICAgIH0sXG5cbiAgICBtdWx0aXBsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ211bHRpcGxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgLy8gTm8gY2FsbGJhY2sgYXMgaXQncyB1c2VkIGluIGBwcm9jZXNzVmFsdWUoKWBcbiAgICAgIGNhbGxiYWNrOiBmYWxzZVxuICAgIH0pLFxuXG4gICAgZXh0ZW5zaW9uczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2V4dGVuc2lvbnMnLCB7XG4gICAgICB0eXBlOiBbQXJyYXksIFN0cmluZywgUmVnRXhwXVxuICAgIH0pLFxuXG4gICAgYWNjZXB0OiBnZXRTY2hlbWFBY2Nlc3NvcignYWNjZXB0Jywge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBnZXQoYWNjZXB0KSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KGFjY2VwdCkgPyBhY2NlcHQuam9pbignLCcpIDogYWNjZXB0XG4gICAgICB9XG4gICAgfSksXG5cbiAgICBtYXhTaXplOiBnZXRTY2hlbWFBY2Nlc3NvcignbWF4U2l6ZScsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBnZXQobWF4U2l6ZSkge1xuICAgICAgICByZXR1cm4gbWF4U2l6ZSA/IHBhcnNlRmlsZVNpemUobWF4U2l6ZSkgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGRyYWdnYWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RyYWdnYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChkcmFnZ2FibGUpIHtcbiAgICAgICAgcmV0dXJuIGRyYWdnYWJsZSAmJiB0aGlzLmZpbGVzLmxlbmd0aCA+IDFcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGRlbGV0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RlbGV0YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgcmVuZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVuZGVyJywge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICB0aHVtYm5haWxzOiBnZXRTY2hlbWFBY2Nlc3NvcigndGh1bWJuYWlscycsIHtcbiAgICAgIHR5cGU6IFtCb29sZWFuLCBTdHJpbmddLFxuICAgICAgZGVmYXVsdCh0aHVtYm5haWxzKSB7XG4gICAgICAgIHJldHVybiB0aHVtYm5haWxzID8/ICEhdGhpcy5zY2hlbWEudGh1bWJuYWlsVXJsXG4gICAgICB9LFxuICAgICAgZ2V0KHRodW1ibmFpbHMpIHtcbiAgICAgICAgcmV0dXJuIHRodW1ibmFpbHMgPT09IHRydWUgPyAnbWVkaXVtJyA6IHRodW1ibmFpbHMgfHwgbnVsbFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgaGFzRmlsZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlcy5sZW5ndGggPiAwXG4gICAgfSxcblxuICAgIGhhc1VwbG9hZHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGxvYWRzLmxlbmd0aCA+IDBcbiAgICB9LFxuXG4gICAgaXNVcGxvYWRSZWFkeSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuaGFzVXBsb2FkcyAmJlxuICAgICAgICAhKHRoaXMudXBsb2FkLmFjdGl2ZSB8fCB0aGlzLnVwbG9hZC51cGxvYWRlZClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaXNVcGxvYWRBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNVcGxvYWRzICYmIHRoaXMudXBsb2FkLmFjdGl2ZVxuICAgIH0sXG5cbiAgICB1cGxvYWRQcm9ncmVzcygpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMudXBsb2Fkcy5yZWR1Y2UoKHRvdGFsLCBmaWxlKSA9PiB0b3RhbCArICtmaWxlLnByb2dyZXNzLCAwKSAvXG4gICAgICAgIHRoaXMudXBsb2Fkcy5sZW5ndGhcbiAgICAgIClcbiAgICB9LFxuXG4gICAgdXBsb2FkUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlVXJsKHtcbiAgICAgICAgdHlwZTogJ3VwbG9hZCcsXG4gICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICBwYXRoOiB0aGlzLmFwaS5ub3JtYWxpemVQYXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICB9KVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGlzVXBsb2FkUmVhZHkocmVhZHkpIHtcbiAgICAgIGlmIChyZWFkeSkge1xuICAgICAgICAvLyBBdXRvLXVwbG9hZC5cbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBsb2FkLmFjdGl2ZSA9IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvcm1hdEZpbGVTaXplLFxuXG4gICAgZ2V0RmlsZUNvbnRleHQoZmlsZSwgaW5kZXgpIHtcbiAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlXG4gICAgICAgID8gbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgIHZhbHVlOiBmaWxlLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5maWxlcyxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgZGF0YVBhdGg6IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIGluZGV4KVxuICAgICAgICAgIH0pXG4gICAgICAgIDogdGhpcy5jb250ZXh0XG4gICAgfSxcblxuICAgIHJlbmRlckZpbGUoZmlsZSwgaW5kZXgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlcih0aGlzLmdldEZpbGVDb250ZXh0KGZpbGUsIGluZGV4KSlcbiAgICB9LFxuXG4gICAgZ2V0RG93bmxvYWRVcmwoZmlsZSwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBmaWxlLnVybFxuICAgICAgICA/IGZpbGUudXJsXG4gICAgICAgIDogIWZpbGUudXBsb2FkIHx8IGZpbGUudXBsb2FkLnN1Y2Nlc3NcbiAgICAgICAgICA/IHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2Rvd25sb2FkVXJsJywge1xuICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5nZXRGaWxlQ29udGV4dChmaWxlLCBpbmRleClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBudWxsXG4gICAgfSxcblxuICAgIGdldFRodW1ibmFpbFVybChmaWxlLCBpbmRleCkge1xuICAgICAgcmV0dXJuICFmaWxlLnVwbG9hZCB8fCBmaWxlLnVwbG9hZC5zdWNjZXNzXG4gICAgICAgID8gdGhpcy5nZXRTY2hlbWFWYWx1ZSgndGh1bWJuYWlsVXJsJywge1xuICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgICAgY29udGV4dDogdGhpcy5nZXRGaWxlQ29udGV4dChmaWxlLCBpbmRleClcbiAgICAgICAgICB9KSB8fCAoXG4gICAgICAgICAgICBmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJylcbiAgICAgICAgICAgICAgPyBmaWxlLnVybFxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICApXG4gICAgICAgIDogbnVsbFxuICAgIH0sXG5cbiAgICBkZWxldGVGaWxlKGZpbGUsIGluZGV4KSB7XG4gICAgICBjb25zdCB7IG5hbWUgfSA9IGZpbGVcblxuICAgICAgaWYgKFxuICAgICAgICBmaWxlICYmXG4gICAgICAgIHdpbmRvdy5jb25maXJtKFxuICAgICAgICAgIGBEbyB5b3UgcmVhbGx5IHdhbnQgdG8gJHt0aGlzLnZlcmJzLnJlbW92ZX0gJHtuYW1lfT9gXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGUudXBsb2FkKSB7XG4gICAgICAgICAgdGhpcy51cGxvYWQucmVtb3ZlKGZpbGUudXBsb2FkKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICAgIHRpdGxlOiAnU3VjY2Vzc2Z1bGx5IFJlbW92ZWQnLFxuICAgICAgICAgIHRleHQ6IGAke25hbWV9IHdhcyAke3RoaXMudmVyYnMuZGVsZXRlZH0uYFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRGaWxlSW5kZXgoZmlsZSkge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWx1ZVxuICAgICAgICA/IHRoaXMudmFsdWUuZmluZEluZGV4KGl0ID0+IGl0LmlkID09PSBmaWxlLmlkKVxuICAgICAgICA6IC0xXG4gICAgfSxcblxuICAgIGFkZEZpbGUoZmlsZSkge1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlLnB1c2goZmlsZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gW2ZpbGVdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBmaWxlXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlcGxhY2VGaWxlKGZpbGUsIG5ld0ZpbGUpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRGaWxlSW5kZXgoZmlsZSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBpZiAobmV3RmlsZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZVtpbmRleF0gPSBuZXdGaWxlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld0ZpbGVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVtb3ZlRmlsZShmaWxlKSB7XG4gICAgICB0aGlzLnJlcGxhY2VGaWxlKGZpbGUsIG51bGwpXG4gICAgfSxcblxuICAgIG9uSW5wdXRGaWxlKG5ld0ZpbGUsIG9sZEZpbGUpIHtcbiAgICAgIGlmIChuZXdGaWxlICYmICFvbGRGaWxlKSB7XG4gICAgICAgIGNvbnN0IHsgaWQsIG5hbWUsIHNpemUgfSA9IG5ld0ZpbGVcbiAgICAgICAgdGhpcy5hZGRGaWxlKHsgaWQsIG5hbWUsIHNpemUsIHVwbG9hZDogbmV3RmlsZSB9KVxuICAgICAgfVxuICAgICAgaWYgKG5ld0ZpbGUgJiYgb2xkRmlsZSkge1xuICAgICAgICBjb25zdCB7IHN1Y2Nlc3MsIGVycm9yIH0gPSBuZXdGaWxlXG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgICAgY29uc3QgZmlsZSA9IG5ld0ZpbGUucmVzcG9uc2VbMF1cbiAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgZmlsZS51cGxvYWQgPSBuZXdGaWxlXG4gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSB1cGxvYWQgZmlsZSBvYmplY3Qgd2l0aCB0aGUgZmlsZSBvYmplY3QgcmVjZWl2ZWRcbiAgICAgICAgICAgIC8vIGZyb20gdGhlIHVwbG9hZCByZXNwb25zZS5cbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUZpbGUobmV3RmlsZSwgZmlsZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWxlKG5ld0ZpbGUpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVGaWxlKG5ld0ZpbGUpXG4gICAgICAgICAgY29uc3QgdGV4dCA9IChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWJvcnQ6ICdVcGxvYWQgYWJvcnRlZCcsXG4gICAgICAgICAgICAgIGRlbmllZDogJ1VwbG9hZCBkZW5pZWQnLFxuICAgICAgICAgICAgICBleHRlbnNpb246IGBVbnN1cHBvcnRlZCBmaWxlLXR5cGU6ICR7bmV3RmlsZS5uYW1lfWAsXG4gICAgICAgICAgICAgIG5ldHdvcms6ICdOZXR3b3JrIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyB1cGxvYWQnLFxuICAgICAgICAgICAgICBzZXJ2ZXI6ICdTZXJ2ZXIgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHVwbG9hZCcsXG4gICAgICAgICAgICAgIHNpemU6IGBGaWxlIGlzIHRvbyBsYXJnZTogJHtmb3JtYXRGaWxlU2l6ZShuZXdGaWxlLnNpemUpfWAsXG4gICAgICAgICAgICAgIHRpbWVvdXQ6ICdUaW1lb3V0IG9jY3VycmVkIGR1cmluZyB1cGxvYWQnXG4gICAgICAgICAgICB9W2Vycm9yXSB8fFxuICAgICAgICAgICAgYFVua25vd24gRmlsZSBVcGxvYWQgRXJyb3I6ICcke2Vycm9yfSdgXG4gICAgICAgICAgKVxuICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIHRpdGxlOiAnRmlsZSBVcGxvYWQgRXJyb3InLFxuICAgICAgICAgICAgdGV4dFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25JbnB1dEZpbHRlcihuZXdGaWxlIC8qLCBvbGRGaWxlLCBwcmV2ZW50ICovKSB7XG4gICAgICBjb25zdCB4aHIgPSBuZXdGaWxlPy54aHJcbiAgICAgIGlmICh0aGlzLmFwaS5jb3JzPy5jcmVkZW50aWFscyAmJiB4aHIgJiYgIXhoci53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgb25DbGlja0Rvd25sb2FkKGZpbGUsIGluZGV4KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMuZG93bmxvYWRVcmxzW2luZGV4XSlcbiAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKVxuICAgICAgICB0aGlzLmRvd25sb2FkKHtcbiAgICAgICAgICBmaWxlbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICAgIHVybDogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25DbGlja1VwbG9hZChldmVudCkge1xuICAgICAgLy8gRGVsZWdhdGUgdGhlIGNsaWNrIGV2ZW50IHRvIHRoZSBoaWRkZW4gZmlsZSBpbnB1dC5cbiAgICAgIHRoaXMudXBsb2FkLiRlbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBldmVudC5jb25zdHJ1Y3RvcihldmVudC50eXBlLCBldmVudClcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgcHJvY2Vzc1ZhbHVlKHsgc2NoZW1hLCB2YWx1ZSB9KSB7XG4gICAgLy8gRmlsdGVyIG91dCBhbGwgbmV3bHkgYWRkZWQgZmlsZXMgdGhhdCB3ZXJlbid0IGFjdHVhbGx5IHVwbG9hZGVkLlxuICAgIGNvbnN0IGZpbGVzID0gYXNGaWxlcyh2YWx1ZSlcbiAgICAgIC5tYXAoKHsgdXBsb2FkLCAuLi5maWxlIH0pID0+ICghdXBsb2FkIHx8IHVwbG9hZC5zdWNjZXNzID8gZmlsZSA6IG51bGwpKVxuICAgICAgLmZpbHRlcihmaWxlID0+IGZpbGUpXG4gICAgcmV0dXJuIHNjaGVtYS5tdWx0aXBsZSA/IGZpbGVzIDogZmlsZXNbMF0gfHwgbnVsbFxuICB9XG59KVxuXG5mdW5jdGlvbiBhc0ZpbGVzKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IGFzQXJyYXkodmFsdWUpIDogW11cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXVwbG9hZCB7XG4gIC5kaXRvLXRhYmxlIHtcbiAgICB0cixcbiAgICAuZGl0by10YWJsZV9fYnV0dG9ucyB7XG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIH1cbiAgfVxuXG4gICZfX3NpemUsXG4gICZfX3N0YXR1cyB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgfVxuXG4gICYgJl9faW5wdXQge1xuICAgIC8vIFNlZSBgb25DbGlja1VwbG9hZCgpYCBtZXRob2QgZm9yIGRldGFpbHMuXG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cblxuICAmX19mb290ZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICAgLmRpdG8tcHJvZ3Jlc3Mge1xuICAgICAgZmxleDogYXV0bztcbiAgICAgIG1hcmdpbi1yaWdodDogJGZvcm0tc3BhY2luZztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBtb3VudGVkKG5vZGUsIGJpbmRpbmcpIHtcbiAgICBvYnNlcnZlUmVzaXplKG5vZGUsIGJpbmRpbmcudmFsdWUsIGJpbmRpbmcuYXJnKVxuICB9LFxuXG4gIHVubW91bnRlZChub2RlLCBiaW5kaW5nKSB7XG4gICAgdW5vYnNlcnZlUmVzaXplKG5vZGUsIGJpbmRpbmcudmFsdWUsIGJpbmRpbmcuYXJnKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZlUmVzaXplKG5vZGUsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgT2JzZXJ2ZXIuZ2V0T2JzZXJ2ZXIob3B0aW9ucykub2JzZXJ2ZShub2RlLCBoYW5kbGVyKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5vYnNlcnZlUmVzaXplKG5vZGUsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgT2JzZXJ2ZXIuZ2V0T2JzZXJ2ZXIob3B0aW9ucykudW5vYnNlcnZlKG5vZGUsIGhhbmRsZXIpXG59XG5cbmV4cG9ydCBjb25zdCBpc1Jlc2l6ZVN1cHBvcnRlZCA9IHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCdcblxuY29uc3Qgb2JzZXJ2ZXJzID0ge31cblxuY2xhc3MgT2JzZXJ2ZXIge1xuICBjb25zdHJ1Y3RvcihrZXksIG9wdGlvbnMpIHtcbiAgICB0aGlzLmtleSA9IGtleVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLm9ic2VydmVyID0gaXNSZXNpemVTdXBwb3J0ZWRcbiAgICAgID8gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4gdGhpcy5oYW5kbGUoZW50cmllcykpXG4gICAgICA6IG51bGxcbiAgICB0aGlzLmhhbmRsZXJzQnlOb2RlID0gbmV3IFdlYWtNYXAoKVxuICAgIHRoaXMubm9kZUNvdW50ID0gMFxuICB9XG5cbiAgb2JzZXJ2ZShub2RlLCBoYW5kbGVyKSB7XG4gICAgbGV0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc0J5Tm9kZS5nZXQobm9kZSlcbiAgICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgICBoYW5kbGVycyA9IG5ldyBTZXQoKVxuICAgICAgdGhpcy5oYW5kbGVyc0J5Tm9kZS5zZXQobm9kZSwgaGFuZGxlcnMpXG4gICAgICB0aGlzLm9ic2VydmVyPy5vYnNlcnZlKG5vZGUsIHRoaXMub3B0aW9ucylcbiAgICAgIHRoaXMubm9kZUNvdW50KytcbiAgICB9XG4gICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpXG4gIH1cblxuICB1bm9ic2VydmUobm9kZSwgaGFuZGxlcikge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc0J5Tm9kZS5nZXQobm9kZSlcbiAgICBpZiAoaGFuZGxlcnM/LmRlbGV0ZShoYW5kbGVyKSAmJiBoYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzQnlOb2RlLmRlbGV0ZShub2RlKVxuICAgICAgdGhpcy5vYnNlcnZlcj8udW5vYnNlcnZlKG5vZGUpXG4gICAgICBpZiAoLS10aGlzLm5vZGVDb3VudCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgb2JzZXJ2ZXJzW3RoaXMua2V5XVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZShlbnRyaWVzKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnNCeU5vZGUuZ2V0KGVudHJ5LnRhcmdldClcbiAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICB0YXJnZXQ6IGVudHJ5LnRhcmdldCxcbiAgICAgICAgICBjb250ZW50UmVjdDogZW50cnkuY29udGVudFJlY3QsXG4gICAgICAgICAgLy8gVXNlIGBhc0FycmF5YCBzaW5jZSBGaXJlZm94IGJlZm9yZSB2OTIgcmV0dXJucyB0aGVzZSBhcyBvYmplY3RzOlxuICAgICAgICAgIGJvcmRlckJveFNpemU6IGFzQXJyYXkoZW50cnkuYm9yZGVyQm94U2l6ZSksXG4gICAgICAgICAgY29udGVudEJveFNpemU6IGFzQXJyYXkoZW50cnkuY29udGVudEJveFNpemUpLFxuICAgICAgICAgIGRldmljZVBpeGVsQ29udGVudEJveFNpemU6IGFzQXJyYXkoZW50cnkuZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZSlcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICBoYW5kbGVyKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldE9ic2VydmVyKHsgYm94ID0gJ2NvbnRlbnQtYm94JyB9ID0ge30pIHtcbiAgICBjb25zdCBvcHRpb25zID0geyBib3ggfVxuICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpXG4gICAgb2JzZXJ2ZXJzW2tleV0gfHw9IG5ldyBPYnNlcnZlcihrZXksIG9wdGlvbnMpXG4gICAgcmV0dXJuIG9ic2VydmVyc1trZXldXG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IFtcbiAgJ2NyZWF0ZScsICdjcmVhdGVkJyxcbiAgJ3NhdmUnLCAnc2F2ZWQnLFxuICAnYXBwbHknLCAnYXBwbGllZCcsXG4gICdzdWJtaXQnLCAnc3VibWl0dGVkJyxcbiAgJ2RlbGV0ZScsICdkZWxldGVkJyxcbiAgJ3JlbW92ZScsICdyZW1vdmVkJyxcbiAgJ2NsZWFyJywgJ2NsZWFyZWQnLFxuICAnZWRpdCcsICdlZGl0ZWQnLFxuICAnY2xvc2UnLCAnY2xvc2VkJyxcbiAgJ2NhbmNlbCcsICdjYW5jZWxsZWQnLFxuICAnZHJhZycsICdkcmFnZ2VkJyxcbiAgJ2xvZ2luJywgJ2xvZ2dlZCBpbidcbl0ucmVkdWNlKCh2ZXJicywgdmVyYikgPT4ge1xuICB2ZXJic1t2ZXJiXSA9IHZlcmJcbiAgcmV0dXJuIHZlcmJzXG59LCB7fSlcbiIsImltcG9ydCB7IGNyZWF0ZUFwcCwgaCBhcyBjcmVhdGVFbGVtZW50IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgY3JlYXRlUm91dGVyLCBjcmVhdGVXZWJIaXN0b3J5IH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCBWdWVOb3RpZmljYXRpb25zIGZyb20gJ0BreXZnL3Z1ZTMtbm90aWZpY2F0aW9uJ1xuaW1wb3J0IHtcbiAgaXNTdHJpbmcsXG4gIGlzQWJzb2x1dGVVcmwsXG4gIGFzc2lnbkRlZXBseSxcbiAgaHlwaGVuYXRlLFxuICBjYW1lbGl6ZSxcbiAgZGVmYXVsdEZvcm1hdHNcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCAqIGFzIGNvbXBvbmVudHMgZnJvbSAnLi9jb21wb25lbnRzL2luZGV4LmpzJ1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi90eXBlcy9pbmRleC5qcydcbmltcG9ydCBEaXRvUm9vdCBmcm9tICcuL2NvbXBvbmVudHMvRGl0b1Jvb3QudnVlJ1xuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgUmVzaXplRGlyZWN0aXZlIGZyb20gJy4vZGlyZWN0aXZlcy9yZXNpemUuanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSB9IGZyb20gJy4vdXRpbHMvcmVzb3VyY2UuanMnXG5pbXBvcnQgeyBmb3JtYXRRdWVyeSB9IGZyb20gJy4vdXRpbHMvcm91dGUuanMnXG5pbXBvcnQgdmVyYnMgZnJvbSAnLi92ZXJicy5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGl0b0FkbWluIHtcbiAgY29uc3RydWN0b3IoZWwsIHtcbiAgICAvLyBgZGl0b2AgY29udGFpbnMgdGhlIGJhc2UgYW5kIGFwaSBzZXR0aW5ncyBwYXNzZWQgZnJvbSBgQWRtaW5Db250cm9sbGVyYFxuICAgIGRpdG8gPSB7fSxcbiAgICBhcGksXG4gICAgdmlld3MgPSB7fSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSB7fSkge1xuICAgIHRoaXMuZWwgPSBlbFxuICAgIC8vIE1lcmdlIGluIGBhcGlgIHNldHRpbmdzIGFzIHBhc3NlZCBmcm9tIGBjb25maWcuYWRtaW5gIGFuZCB0aHJvdWdoIHRoZVxuICAgIC8vIGBBZG1pbkNvbnRyb2xsZXJgIHdpdGggYGFwaWAgdmFsdWVzIGZyb20gZnJvbSAnYWRtaW4vaW5kZXguanMnXG4gICAgLy8gTk9URTogYEFkbWluQ29udHJvbGxlcmAgcHJvdmlkZXMgYGRpdG8uYXBpLmJhc2VgXG4gICAgdGhpcy5hcGkgPSBhcGkgPSBhc3NpZ25EZWVwbHkoeyBiYXNlOiAnLycgfSwgZGl0by5hcGksIGFwaSlcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG5cbiAgICAvLyBTZXR1cCBkZWZhdWx0IGFwaSBzZXR0aW5nczpcbiAgICBhcGkubG9jYWxlIHx8PSAnZW4tVVMnXG4gICAgYXBpLmZvcm1hdHMgPSBhc3NpZ25EZWVwbHkoe30sIGRlZmF1bHRGb3JtYXRzLCBhcGkuZm9ybWF0cylcbiAgICBhcGkucmVxdWVzdCB8fD0gb3B0aW9ucyA9PiByZXF1ZXN0KGFwaSwgb3B0aW9ucylcbiAgICBhcGkuZ2V0QXBpVXJsIHx8PSBvcHRpb25zID0+IGdldEFwaVVybChhcGksIG9wdGlvbnMpXG4gICAgYXBpLmlzQXBpVXJsIHx8PSB1cmwgPT4gaXNBcGlVcmwoYXBpLCB1cmwpXG4gICAgLy8gU2V0dGluZyBgYXBpLm5vcm1hbGl6ZVBhdGhzID0gdHJ1ZSAocGx1cmFsKSBzZXRzIGJvdGg6XG4gICAgLy8gYGFwaS5ub3JtYWxpemVQYXRoID0gaHlwaGVuYXRlYCBhbmQgYGFwaS5kZW5vcm1hbGl6ZVBhdGggPSBjYW1lbGl6ZWBcbiAgICBhcGkubm9ybWFsaXplUGF0aCB8fD0gYXBpLm5vcm1hbGl6ZVBhdGhzID8gaHlwaGVuYXRlIDogdmFsID0+IHZhbFxuICAgIGFwaS5kZW5vcm1hbGl6ZVBhdGggfHw9IGFwaS5ub3JtYWxpemVQYXRocyA/IGNhbWVsaXplIDogdmFsID0+IHZhbFxuXG4gICAgLy8gQWxsb3cgZGVmaW5pdGlvbiBvZiBkZWZhdWx0cyBmb3IgYWRtaW4gY29tcG9uZW50IHR5cGVzLCBuZXN0ZWQgcGVyIHR5cGU6XG4gICAgLy8gYXBpLmRlZmF1bHRzID0ge1xuICAgIC8vICAgJ211bHRpc2VsZWN0Jzoge1xuICAgIC8vICAgICBzZWxlY3RhYmxlOiB0cnVlXG4gICAgLy8gICB9LFxuICAgIC8vICAgJ2Zha2UtdHlwZSc6IHNjaGVtYSA9PiB7XG4gICAgLy8gICAgIC8vIFJldHVybiBkZWZhdWx0cywgb3IgZGlyZWN0bHkgbW9kaWZ5IHRoZSBzY2hlbWE6XG4gICAgLy8gICAgIE9iamVjdC5hc3NpZ24oc2NoZW1hLCB7XG4gICAgLy8gICAgICAgdHlwZTogJ3JlYWwtdHlwZScsXG4gICAgLy8gICAgICAgZm9ybWF0OiAoeyB2YWx1ZSB9KSA9PiBgRm9ybWF0dGVkICR7dmFsdWV9YCxcbiAgICAvLyAgICAgICBwcm9jZXNzOiAoeyB2YWx1ZSB9KSA9PiBgUHJvY2Vzc2VkICR7dmFsdWV9YFxuICAgIC8vICAgICB9KVxuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIGFwaS5kZWZhdWx0cyB8fD0ge31cblxuICAgIC8vIEFsbG93IHRoZSBjb25maWd1cmF0aW9uIG9mIGFsbCBhdXRoIHJlc291cmNlcywgbGlrZSBzbzpcbiAgICAvLyBhcGkudXNlcnMgPSB7XG4gICAgLy8gICBwYXRoOiAnL2FkbWlucycsXG4gICAgLy8gICAvLyBUaGVzZSBhcmUgdGhlIGRlZmF1bHRzOlxuICAgIC8vICAgbG9naW46IHtcbiAgICAvLyAgICAgcGF0aDogJ2xvZ2luJyxcbiAgICAvLyAgICAgbWV0aG9kOiAncG9zdCdcbiAgICAvLyAgIH0sXG4gICAgLy8gICBsb2dvdXQ6IHtcbiAgICAvLyAgICAgcGF0aDogJ2xvZ291dCcsXG4gICAgLy8gICAgIG1ldGhvZDogJ3Bvc3QnXG4gICAgLy8gICB9LFxuICAgIC8vICAgc2Vzc2lvbjoge1xuICAgIC8vICAgICBwYXRoOiAnc2Vzc2lvbicsXG4gICAgLy8gICAgIG1ldGhvZDogJ2dldCdcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gICAgY29uc3QgdXNlcnMgPSBnZXRSZXNvdXJjZShhcGkudXNlcnMsIHtcbiAgICAgIHR5cGU6ICdjb2xsZWN0aW9uJ1xuICAgIH0pIHx8IHt9XG4gICAgdXNlcnMubG9naW4gPSBnZXRSZXNvdXJjZSh1c2Vycy5sb2dpbiB8fCAnbG9naW4nLCB7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHBhcmVudDogdXNlcnNcbiAgICB9KVxuICAgIHVzZXJzLmxvZ291dCA9IGdldFJlc291cmNlKHVzZXJzLmxvZ291dCB8fCAnbG9nb3V0Jywge1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBwYXJlbnQ6IHVzZXJzXG4gICAgfSlcbiAgICB1c2Vycy5zZXNzaW9uID0gZ2V0UmVzb3VyY2UodXNlcnMuc2Vzc2lvbiB8fCAnc2Vzc2lvbicsIHtcbiAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICBwYXJlbnQ6IHVzZXJzXG4gICAgfSlcbiAgICBhcGkudXNlcnMgPSB1c2Vyc1xuXG4gICAgLy8gQWxsb3cgb3ZlcnJpZGluZyBvZiByZXNvdXJjZSBwYXRoIGhhbmRsZXJzOlxuICAgIC8vIGFwaS5yZXNvdXJjZXMgPSB7XG4gICAgLy8gICBjb2xsZWN0aW9uKHJlc291cmNlKSB7XG4gICAgLy8gICAgIHJldHVybiByZXNvdXJjZS5wYXJlbnRcbiAgICAvLyAgICAgICA/IGAke3Jlc291cmNlLnBhdGh9PyR7cmVzb3VyY2UucGFyZW50LnBhdGh9X2lkPSR7XG4gICAgLy8gICAgICAgICAgcmVzb3VyY2UucGFyZW50LmlkfWBcbiAgICAvLyAgICAgICA6IHJlc291cmNlLnBhdGhcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICBhcGkucmVzb3VyY2VzID0ge1xuICAgICAgYW55KHJlc291cmNlKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzW3Jlc291cmNlPy50eXBlXSB8fCB0aGlzLmRlZmF1bHRcbiAgICAgICAgcmV0dXJuIHJlc291cmNlICYmIGhhbmRsZXIuY2FsbCh0aGlzLCByZXNvdXJjZSlcbiAgICAgIH0sXG5cbiAgICAgIGRlZmF1bHQocmVzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHRoaXMuYW55KHJlc291cmNlLnBhcmVudClcbiAgICAgICAgcmV0dXJuIHBhcmVudFBhdGhcbiAgICAgICAgICA/IGAke3BhcmVudFBhdGh9LyR7cmVzb3VyY2UucGF0aH1gXG4gICAgICAgICAgOiByZXNvdXJjZS5wYXRoXG4gICAgICB9LFxuXG4gICAgICBjb2xsZWN0aW9uKHJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHQocmVzb3VyY2UpXG4gICAgICB9LFxuXG4gICAgICBtZW1iZXIocmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZGVmYXVsdChyZXNvdXJjZSl9LyR7cmVzb3VyY2UuaWR9YFxuICAgICAgfSxcblxuICAgICAgdXBsb2FkKHJlc291cmNlKSB7XG4gICAgICAgIC8vIERpdG8uanMgU2VydmVyIGhhbmRsZXMgdXBsb2FkIHJvdXRlcyBvbiB0aGUgY29sbGVjdGlvbiByZXNvdXJjZTpcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29sbGVjdGlvbihyZXNvdXJjZS5wYXJlbnQpfS91cGxvYWQvJHtyZXNvdXJjZS5wYXRofWBcbiAgICAgIH0sXG5cbiAgICAgIC4uLmFwaS5yZXNvdXJjZXNcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBvdmVycmlkaW5nIC8gZXh0ZW5kaW5nIG9mIGhlYWRlcnM6XG4gICAgLy8gYXBpLmhlYWRlcnMgPSB7XG4gICAgLy8gICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgLy8gfVxuICAgIGFwaS5oZWFkZXJzID0ge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIC4uLmFwaS5oZWFkZXJzXG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nKGVsKSkge1xuICAgICAgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKVxuICAgIH1cblxuICAgIGNvbnN0IGFwcCA9ICh0aGlzLmFwcCA9IGNyZWF0ZUFwcCh7XG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIERpdG9Sb290LFxuICAgICAgICBWdWVOb3RpZmljYXRpb25zLFxuICAgICAgICAvLyBUaGlzIG1heSBvbmx5IGJlIG5lZWRlZCB0byBhdm9pZCB0cmVlLXNoYWNraW5nIG9mIHRoZXNlIGNvbXBvbmVudHMsXG4gICAgICAgIC8vIHNpbmNlIHRoZXkgYWN0dWFsbHkgaGFuZGxlIHJlZ2lzdHJ5IGludGVybmFsbHkgYWxyZWFkeS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgb25jZSB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uLlxuICAgICAgICAuLi5jb21wb25lbnRzLFxuICAgICAgICAuLi50eXBlc1xuICAgICAgfSxcblxuICAgICAgLy8gTW9zdCBpbmplY3RzIGFyZSBkZWZpbmVkIGFzIGZ1bmN0aW9ucywgdG8gcHJlc2VydmUgcmVhY3RpdmVuZXNzIGFjcm9zc1xuICAgICAgLy8gcHJvdmlkZS9pbmplY3QsIHNlZTpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvaXNzdWVzLzcwMTcjaXNzdWVjb21tZW50LTQ4MDkwNjY5MVxuICAgICAgcHJvdmlkZToge1xuICAgICAgICBhcGksXG4gICAgICAgIC8vIEEgZGVmYXVsdCBsaXN0IG9mIHZlcmJzIGFyZSBwcm92aWRlZCBieSAkdmVyYnMoKSBhbmQgY2FuIGJlXG4gICAgICAgIC8vIG92ZXJyaWRkZW4gYXQgYW55IHBvaW50IGluIHRoZSBjb21wb25lbnQgaGllcmFyY2h5LlxuICAgICAgICAkdmVyYnM6ICgpID0+IHZlcmJzLFxuICAgICAgICAvLyBQcm92aWRlIGRlZmF1bHRzIHNvIERpdG9NaXhpbiBjYW4gaW5qZWN0IHRoZW0gZm9yIGFsbCBjb21wb25lbnRzOlxuICAgICAgICAvLyAgIGluamVjdDogWyAgJyRpc1BvcHVsYXRlZCcsICckc2NoZW1hQ29tcG9uZW50JywgJyRyb3V0ZUNvbXBvbmVudCcgXVxuICAgICAgICAkdmlld3M6ICgpID0+IHt9LFxuICAgICAgICAkaXNQb3B1bGF0ZWQ6ICgpID0+IHRydWUsXG4gICAgICAgICRwYXJlbnRDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRzY2hlbWFDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRzY2hlbWFQYXJlbnRDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRyb3V0ZUNvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJGRhdGFDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRzb3VyY2VDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRyZXNvdXJjZUNvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJGRpYWxvZ0NvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHBhbmVsQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkdGFiQ29tcG9uZW50OiAoKSA9PiBudWxsXG4gICAgICB9LFxuXG4gICAgICByZW5kZXI6ICgpID0+XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoRGl0b1Jvb3QsIHtcbiAgICAgICAgICByZWY6ICdyb290JyxcbiAgICAgICAgICBjbGFzczogZGl0by5zZXR0aW5ncy5yb290Q2xhc3MsXG4gICAgICAgICAgdW5yZXNvbHZlZFZpZXdzOiB2aWV3cyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgIH0pXG4gICAgfSkpXG5cbiAgICAvLyBQcmV2ZW50IGVuZGxlc3MgbG9vcHMgb2YgZXJyb3IgbWVzc2FnZXMgZHVyaW5nIHJlbmRlciBmdW5jdGlvbnMgYnlcbiAgICAvLyBzZXR0aW5nIGEgY3VzdG9tIGVycm9yIGhhbmRsZXIuXG4gICAgYXBwLmNvbmZpZy5lcnJvckhhbmRsZXIgPSBjb25zb2xlLmVycm9yXG5cbiAgICBhcHAudXNlKFZ1ZU5vdGlmaWNhdGlvbnMsIHtcbiAgICAgIGNvbXBvbmVudE5hbWU6ICdWdWVOb3RpZmljYXRpb25zJyxcbiAgICAgIG5hbWU6ICdub3RpZnknXG4gICAgfSlcblxuICAgIGFwcC5kaXJlY3RpdmUoJ3Jlc2l6ZScsIFJlc2l6ZURpcmVjdGl2ZSlcblxuICAgIGFwcC51c2UoXG4gICAgICBjcmVhdGVSb3V0ZXIoe1xuICAgICAgICAvLyBTdGFydCB3aXRoIGEgY2F0Y2gtYWxsIHJvdXRlLCB0byBiZSByZXBsYWNlZCBieSB0aGUgYWN0dWFsIHJvdXRlc1xuICAgICAgICAvLyBvbmNlIHRoZSBzY2hlbWFzIGFyZSBsb2FkZWQsIHRvIHByZXZlbnQgdnVlLXJvdXRlciBmcm9tIGNvbXBsYWluaW5nLFxuICAgICAgICAvLyBzZWU6IGByZXNvbHZlVmlld3MoKWAgaW4gYERpdG9Sb290YCBmb3IgdGhlIGFjdHVhbCByb3V0ZSBzZXR1cC5cbiAgICAgICAgcm91dGVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2NhdGNoLWFsbCcsXG4gICAgICAgICAgICBwYXRoOiAnLzpfKC4qKScsXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7fVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgaGlzdG9yeTogY3JlYXRlV2ViSGlzdG9yeShkaXRvLmJhc2UpLFxuICAgICAgICBsaW5rQWN0aXZlQ2xhc3M6ICcnLFxuICAgICAgICBsaW5rRXhhY3RBY3RpdmVDbGFzczogJydcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgZWwuY2xhc3NMaXN0LmFkZCgnZGl0by1hcHAnKVxuICAgIGFwcC5tb3VudChlbClcbiAgfVxuXG4gIHJlZ2lzdGVyKHR5cGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIodHlwZSwgb3B0aW9ucylcbiAgfVxufVxuXG5jbGFzcyBSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlc3BvbnNlKSB7XG4gICAgc3VwZXIoXG4gICAgICBgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZTogJHtyZXNwb25zZS5zdGF0dXN9ICgke1xuICAgICAgICByZXNwb25zZS5zdGF0dXNUZXh0XG4gICAgICB9KWBcbiAgICApXG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChhcGksIHtcbiAgdXJsLFxuICBtZXRob2QgPSAnZ2V0JyxcbiAgcXVlcnkgPSBudWxsLFxuICBoZWFkZXJzID0gbnVsbCxcbiAgZGF0YSA9IG51bGwsXG4gIHNpZ25hbCA9IG51bGxcbn0pIHtcbiAgY29uc3QgaXNBcGlVcmwgPSBhcGkuaXNBcGlVcmwodXJsKVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYXBpLmdldEFwaVVybCh7IHVybCwgcXVlcnkgfSksIHtcbiAgICBtZXRob2Q6IG1ldGhvZC50b1VwcGVyQ2FzZSgpLFxuICAgIC4uLihkYXRhICYmIHsgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSksXG4gICAgaGVhZGVyczoge1xuICAgICAgLi4uKGlzQXBpVXJsICYmIGFwaS5oZWFkZXJzKSxcbiAgICAgIC4uLmhlYWRlcnNcbiAgICB9LFxuICAgIGNyZWRlbnRpYWxzOlxuICAgICAgaXNBcGlVcmwgJiYgYXBpLmNvcnM/LmNyZWRlbnRpYWxzXG4gICAgICAgID8gJ2luY2x1ZGUnXG4gICAgICAgIDogJ3NhbWUtb3JpZ2luJyxcbiAgICBzaWduYWxcbiAgfSlcblxuICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgcmVzcG9uc2UuZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICB9XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IocmVzcG9uc2UpXG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbmZ1bmN0aW9uIGlzQXBpVXJsKGFwaSwgdXJsKSB7XG4gIHJldHVybiAhaXNBYnNvbHV0ZVVybCh1cmwpIHx8IHVybC5zdGFydHNXaXRoKGFwaS51cmwpXG59XG5cbmZ1bmN0aW9uIGdldEFwaVVybChhcGksIHsgdXJsLCBxdWVyeSB9KSB7XG4gIGlmICghdXJsLnN0YXJ0c1dpdGgoYXBpLnVybCkgJiYgIWlzQWJzb2x1dGVVcmwodXJsKSkge1xuICAgIHVybCA9IGNvbWJpbmVVcmxzKGFwaS51cmwsIHVybClcbiAgfVxuICAvLyBTdXBwb3J0IG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMsIHRvIGJlIGFyZSBhZGRlZCB0byB0aGUgVVJMLlxuICBjb25zdCBzZWFyY2ggPSBmb3JtYXRRdWVyeShxdWVyeSlcbiAgcmV0dXJuIHNlYXJjaCA/IGAke3VybH0ke3VybC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nfSR7c2VhcmNofWAgOiB1cmxcbn1cblxuZnVuY3Rpb24gY29tYmluZVVybHMoYmFzZVVybCwgcmVsYXRpdmVVcmwpIHtcbiAgLy8gVXNlIHNhbWUgYXBwcm9hY2ggYXMgYXhpb3MgYGNvbWJpbmVVUkxzKClgIHRvIGpvaW4gYmFzZVVybCAmIHJlbGF0aXZlVXJsOlxuICByZXR1cm4gYCR7YmFzZVVybC5yZXBsYWNlKC9cXC8rJC8sICcnKX0vJHtyZWxhdGl2ZVVybC5yZXBsYWNlKC9eXFwvKy8sICcnKX1gXG59XG4iXSwibmFtZXMiOlsicGFyc2VVc2VyQWdlbnQiLCJ1c2VyQWdlbnQiLCJhZ2VudCIsInVhIiwib3MiLCJwbGF0Zm9ybSIsIm1hdGNoIiwiYnJvd3NlciIsInYxIiwidjIiLCJydiIsInZlcnNpb24iLCJhcHBTdGF0ZSIsInJlYWN0aXZlIiwiYXBwZW5kRGF0YVBhdGgiLCJkYXRhUGF0aCIsInRva2VuIiwicGFyc2VQYXJlbnREYXRhUGF0aCIsInBhdGgiLCJwYXJzZURhdGFQYXRoIiwicGFyc2VJdGVtRGF0YVBhdGgiLCJuZXN0ZWQiLCJnZXRJdGVtRGF0YVBhdGgiLCJub3JtYWxpemVEYXRhUGF0aCIsInBhcnNlUGFyZW50SXRlbURhdGFQYXRoIiwiaXNJbnRlZ2VyIiwiZ2V0UGFyZW50SXRlbURhdGFQYXRoIiwiZ2V0SXRlbSIsInJvb3RJdGVtIiwiZ2V0VmFsdWVBdERhdGFQYXRoIiwiZ2V0UGFyZW50SXRlbSIsImdldExhc3REYXRhUGF0aFRva2VuIiwiZ2V0TGFzdERhdGFQYXRoTmFtZSIsImdldExhc3REYXRhUGF0aEluZGV4IiwiaW5kZXgiLCJ0ZW1wb3JhcnlJZCIsInNldFRlbXBvcmFyeUlkIiwiZGF0YSIsImlkS2V5IiwiaXNUZW1wb3JhcnlJZCIsImlkIiwiaXNSZWZlcmVuY2UiLCJoYXNPd25Qcm9wZXJ0eSIsImNvbnRleHRzIiwidG9PYmplY3QiLCJjb250ZXh0IiwicmF3U3RhcnQiLCJ0b1JhdyIsInJhdyIsIm9iamVjdCIsImdldCIsImtleSIsImRlZmF1bHRWYWx1ZSIsInZhbHVlIiwiaXNGdW5jdGlvbiIsInNldCIsIkRpdG9Db250ZXh0IiwiY29tcG9uZW50IiwiaXRlbSIsIm9wdGlvbnMiLCJsb2NhdGlvbiIsInJlc291cmNlIiwiRW1pdHRlck1peGluIiwiZXZlbnQiLCJjYWxsYmFjayIsImlzQXJyYXkiLCJldiIsImlzUGxhaW5PYmplY3QiLCJsaXN0ZW5lcnMiLCJjYWxsYmFja3MiLCJvbiIsImFyZ3MiLCJlbnRyeSIsImNiIiwicXVldWUiLCJyZXNvbHZlIiwibmV4dCIsInJlc3VsdCIsImVycm9ycyIsInJlcyIsImVycm9yIiwidGFyZ2V0IiwiVmFsdWVNaXhpbiIsImNvbXB1dGVWYWx1ZSIsImZvcm1hdCIsInBhcnNlIiwiQ29udGV4dE1peGluIiwiZ2V0UHJvY2Vzc2VkUGFyZW50RGF0YSIsInNjaGVtYUNvbXBvbmVudCIsImlzQ3JlZGl0Q2FyZCIsImRlY2ltYWxzIiwiaXNEb21haW4iLCJpc0VtYWlsIiwiaXNIb3N0bmFtZSIsIm1heCIsIm1pbiIsInNldHRpbmdzIiwicGFzc3dvcmQiLCJpc1VybCIsIlZhbGlkYXRpb25NaXhpbiIsIm5vdGlmeSIsImlzVmFsaWQiLCJydWxlIiwic2V0dGluZyIsInZhbGlkYXRvciIsInZhbGlkYXRvcnMiLCJ2YWxpZGF0ZSIsIm1lc3NhZ2UiLCJhZGRMYWJlbCIsImZvY3VzIiwiZ2V0U2NoZW1hQWNjZXNzb3IiLCJrZXlPckRhdGFQYXRoIiwidHlwZSIsImRlZiIsImlzU3RyaW5nIiwibmFtZSIsImdldFN0b3JlQWNjZXNzb3IiLCJUeXBlTWl4aW4iLCJub2RlIiwiY2xlYXJhYmxlIiwiZXZlbnRzIiwiY2FtZWxpemUiLCJuYXRpdmVGaWVsZCIsInRleHRGaWVsZCIsImF0dHJpYnV0ZXMiLCJ2YWxpZGF0aW9ucyIsImFkZCIsIm9uRm9jdXMiLCJvbkJsdXIiLCJvbklucHV0Iiwib25DaGFuZ2UiLCJlbGVtZW50IiwiYXNBcnJheSIsInVpZE1hcCIsInVpZCIsImdldFVpZCIsImdldEl0ZW1JZCIsIlNjaGVtYUdyYXBoIiwiZGVmYXVsdHMiLCJzdWJHcmFwaCIsInBhcnQiLCJzY2hlbWEiLCJyZWxhdGVkRGF0YVBhdGgiLCJuYW5vaWQiLCJmbGF0dGVuIiwiZ3JhcGgiLCJlbnRyaWVzIiwiJHNldHRpbmdzIiwic3ViS2V5Iiwic291cmNlU2NoZW1hIiwiY2xpcGJvYXJkIiwiaW50ZXJuYWwiLCJyZWxhdGVkIiwicmVmZXJlbmNlIiwic291cmNlIiwicmVsYXRpb24iLCJ2YWx1ZXMiLCJyZW1vdmVJZCIsInJlZmVyZW5jZUlkIiwicmVmS2V5IiwicmV2VmFsdWUiLCJ0eXBlQ2hlY2tlcnMiLCJpc0Jvb2xlYW4iLCJpc051bWJlciIsImlzRGF0ZSIsImlzT2JqZWN0IiwiaXNSZWdFeHAiLCJ0eXBlQ29udmVydGVycyIsImlzTWF0Y2hpbmdUeXBlIiwidHlwZXMiLCJjb252ZXJ0VHlwZSIsImNvbnZlcnRlciIsInR5cGVDb21wb25lbnRzIiwidW5rbm93blR5cGVSZXBvcnRlZCIsImVtcHR5U2NoZW1hIiwicmVnaXN0ZXJUeXBlQ29tcG9uZW50IiwiZ2V0VHlwZUNvbXBvbmVudCIsImFsbG93TnVsbCIsIml0ZXJhdGVTY2hlbWFDb21wb25lbnRzIiwic2NoZW1hcyIsImlzU2luZ2xlQ29tcG9uZW50VmlldyIsImlzU2NoZW1hIiwiaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMiLCJnZXRUYWJTY2hlbWFzIiwiZmluZE5lc3RlZFNjaGVtYUNvbXBvbmVudCIsInNvbWVOZXN0ZWRTY2hlbWFDb21wb25lbnQiLCJoYXNOZXN0ZWRTY2hlbWFDb21wb25lbnRzIiwiaXNGb3JtIiwiaXNWaWV3IiwiaXNUYWIiLCJpc1BhbmVsIiwiaXNNZW51IiwiZ2V0U2NoZW1hSWRlbnRpZmllciIsInJlc29sdmVkU2NoZW1hcyIsInJlc29sdmVTY2hlbWEiLCJ1bndyYXBNb2R1bGUiLCJpc1Byb21pc2UiLCJpc01vZHVsZSIsImtleXMiLCJyZXNvbHZlU2NoZW1hcyIsInVucmVzb2x2ZWRTY2hlbWFzIiwicmVzb2x2ZUl0ZW0iLCJtYXBDb25jdXJyZW50bHkiLCJyZXNvbHZlVmlld3MiLCJ1bnJlc29sdmVkVmlld3MiLCJmbGF0dGVuVmlld3MiLCJ2aWV3cyIsInJlc29sdmVTY2hlbWFDb21wb25lbnQiLCJtYXJrUmF3IiwiRGl0b01peGluIiwicmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMiLCJwcm9jZXNzZWRTY2hlbWFEZXB0aHMiLCJwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyIsImFwaSIsInJvdXRlcyIsImxldmVsIiwibWF4RGVwdGgiLCJkZXB0aCIsInByb21pc2VzIiwicHJvY2VzcyIsInJlbGF0aXZlTGV2ZWwiLCJwcm9jZXNzU2NoZW1hQ29tcG9uZW50IiwiZ2V0UGFuZWxTY2hlbWFzIiwicHJvY2Vzc1NjaGVtYURlZmF1bHRzIiwicGFuZWwiLCJnZXRUeXBlT3B0aW9ucyIsInByb2Nlc3NWaWV3IiwiZnVsbFBhdGgiLCJwcm9jZXNzUm91dGVTY2hlbWEiLCJjaGlsZHJlbiIsInByb2Nlc3NOZXN0ZWRTY2hlbWFzIiwiYXNzaWduRGVlcGx5IiwicHJvY2Vzc05lc3RlZFNjaGVtYURlZmF1bHRzIiwiZm9ybXMiLCJnZXRGb3JtU2NoZW1hcyIsImZvcm0iLCJwcm9jZXNzRm9ybXMiLCJjb21wb25lbnRzIiwicHJvY2Vzc0Zvcm0iLCJwcm9jZXNzVGFiIiwicHJvY2Vzc1BhbmVsIiwidGFicyIsInBhbmVscyIsInRhYiIsImhhc0Zvcm1TY2hlbWEiLCJoYXNNdWx0aXBsZUZvcm1TY2hlbWFzIiwiZ2V0Vmlld0Zvcm1TY2hlbWEiLCJ2aWV3Iiwidmlld1NjaGVtYSIsImdldFZpZXdTY2hlbWEiLCJoYXNWaWV3U2NoZW1hIiwiZ2V0Vmlld1BhdGgiLCJnZXRWaWV3RWRpdFBhdGgiLCJtb2RpZnlGb3JtIiwiY29tcGFjdCIsImdldEl0ZW1Gb3JtU2NoZW1hRnJvbUZvcm1zIiwiZ2V0SXRlbUZvcm1TY2hlbWEiLCJpc0VtcHR5U2NoZW1hIiwiaXNDb21wYWN0IiwiaXNJbmxpbmVkIiwiaXNOZXN0ZWQiLCJoYXNMYWJlbCIsImdlbmVyYXRlTGFiZWxzIiwibGFiZWwiLCJvbWl0U3BhY2luZyIsImdldFNjaGVtYVZhbHVlIiwiY29udmVydGVkIiwic2hvdWxkUmVuZGVyU2NoZW1hIiwiZ2V0Q29udGV4dCIsImdldERlZmF1bHRWYWx1ZSIsImNsb25lIiwic2hvdWxkRXhjbHVkZVZhbHVlIiwiZXhjbHVkZVZhbHVlIiwic2hvdWxkSWdub3JlTWlzc2luZ1ZhbHVlIiwiZ2V0TXVsdGlwbGVWYWx1ZSIsInNldERlZmF1bHRWYWx1ZXMiLCJwcm9jZXNzU2NoZW1hRGF0YSIsInJvb3REYXRhIiwiY29tcHV0ZSIsImNsb25lSXRlbSIsImNvcHkiLCJvcmRlcktleSIsInByb2Nlc3NEYXRhIiwic2NoZW1hT25seSIsInByb2Nlc3NlZERhdGEiLCJ3cmFwUHJpbWl0aXZlcyIsInByb2Nlc3NWYWx1ZSIsInByb2Nlc3NCZWZvcmUiLCJwcm9jZXNzQWZ0ZXIiLCJwcm9jZXNzQ29tcG9uZW50cyIsImdldERhdGFQYXRoIiwiY29tcG9uZW50U2NoZW1hIiwiY29tcG9uZW50RGF0YVBhdGgiLCJwcm9jZXNzSXRlbSIsIml0ZW1EYXRhUGF0aCIsInByb2Nlc3NlZEl0ZW0iLCJnZXROYW1lZFNjaGVtYXMiLCJhcnJheSIsInRvU2NoZW1hIiwiZ2V0QnV0dG9uU2NoZW1hcyIsImJ1dHRvbnMiLCJnZXRUeXBlIiwic2NoZW1hT3JUeXBlIiwiZ2V0U291cmNlVHlwZSIsImdldFBhbmVsRW50cnkiLCJ0YWJDb21wb25lbnQiLCJnZXRQYW5lbEVudHJpZXMiLCJwYW5lbFNjaGVtYXMiLCJwYW5lbEVudHJpZXMiLCJnZXRBbGxQYW5lbEVudHJpZXMiLCJwYW5lbFNjaGVtYSIsImlzT2JqZWN0U291cmNlIiwiaXNMaXN0U291cmNlIiwiZ2V0SXRlbVVpZCIsImhhc1Jlc291cmNlIiwiZ2V0UmVzb3VyY2UiLCJwYXJlbnQiLCJkZWZzIiwiZ2V0TWVtYmVyUmVzb3VyY2UiLCJwaWNrQnkiLCJzZWxmIiwiZ2V0UGFyZW50Q29tcG9uZW50IiwibmV4dFVpZCIsImxhYmVsaXplIiwic3RvcmUiLCJvbGRLZXkiLCJ2ZXJiIiwicXVlcnkiLCJ1cmwiLCJtZXRob2QiLCJzaWduYWwiLCJjaGVja1VzZXIiLCJyZXNwb25zZSIsImVxdWFscyIsImNhY2hlIiwibG9hZENhY2hlIiwiY2FjaGVLZXkiLCJsb2NhbGUiLCJhIiwiYm9keSIsImdldENvbXB1dGVkQWNjZXNzb3IiLCJnZXR0ZXIiLCJjb21wdXRlZCIsImFjY2Vzc29yIiwid2F0Y2giLCJoYW5kbGVycyIsImV4cHIiLCJhZGRFdmVudCIsImh5cGhlbmF0ZSIsImhhc0xpc3RlbmVycyIsInBhcmVudEhhc0xpc3RlbmVycyIsImVtaXRFdmVudCIsImhhbmRsZVBhcmVudExpc3RlbmVycyIsImhhbmRsZUxpc3RlbmVycyIsInBhcmFtcyIsImN1cnJlbnQiLCJyZXNvbHZlTWVyZ2VkT3B0aW9ucyIsIm1peGlucyIsIm1lcmdlT3B0aW9ucyIsInRvIiwiZnJvbSIsIm1peGluIiwiZGl0b09wdGlvbktleXMiLCJEaXRvQ29tcG9uZW50IiwiZGVmaW5pdGlvbiIsImhhc1ZOb2RlQ29udGVudCIsInZub2RlIiwiQ29tbWVudCIsImhhc1Nsb3RDb250ZW50Iiwic2xvdCIsInByb3BzIiwidXNlU2xvdHMiLCJfIiwiZGVzY3JpYmVEYXRlIiwiZGF0ZSIsImFsdGVyRGF0ZSIsIm92ZXJyaWRlcyIsInBhcnNlRGF0ZSIsInN0cmluZyIsInRpbWUiLCJ0aW1lRGVmYXVsdCIsImRheSIsInNlcDEiLCJtb250aCIsInNlcDIiLCJ5ZWFyIiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIiwiZ2V0RGF0ZVBhcnRzIiwiZ2V0TW9udGhJbmRleCIsImlzVmFsaWRUaW1lUGFydCIsImdldERhdGVQYXJ0QXRQb3NpdGlvbiIsInBvc2l0aW9uIiwicGFydHMiLCJnZXRQb3NpdGlvbiIsImxlbmd0aCIsInBvcyIsIm9mZnNldCIsImlzVVMiLCJzdGFydCIsImVuZCIsInNob3J0Rm9ybWF0IiwibG9uZ0Zvcm1hdCIsImkiLCJfc2ZjX21haW4iLCJ3ZWVrZGF5TmFtZXMiLCJtb250aE5hbWVzIiwiZ2V0TG9jYWxlTmFtZXMiLCJtb2RlIiwidXBkYXRlIiwic3RlcCIsImN1cnJlbnRWYWx1ZSIsImVudGVyIiwic3RhcnRZZWFyIiwiZmlyc3REYXlXZWVrIiwibnVtRGF5cyIsInByZXZNb250aCIsInByZXZNb250aE51bURheXMiLCJub3ciLCJpc0RheSIsInN0YXRlIiwibmV4dE1vbnRoTmVlZCIsIm5leHRNb250aCIsImxvY2FsZU5hbWVzIiwibmFtZXMiLCJhZGRFdmVudHMiLCJ0YXJnZXRzIiwiaGFuZGxlciIsImNvbWJpbmVFdmVudHMiLCJnZXRLZXkiLCJnZXRLZXlOYXZpZ2F0aW9uIiwiZ2V0VGFyZ2V0IiwiY2xhc3NlcyIsInNob3ciLCJ0cmlnZ2VyIiwicG9wdXAiLCJlbCIsImJvdW5kcyIsInRyaWdnZXJMZWZ0IiwidHJpZ2dlclRvcCIsInRyaWdnZXJXaWR0aCIsInRyaWdnZXJIZWlnaHQiLCJwb3B1cFdpZHRoIiwicG9wdXBIZWlnaHQiLCJwYXJ0MSIsInBhcnQyIiwid2luV2lkdGgiLCJ3aW5IZWlnaHQiLCJsZWZ0IiwidG9wIiwidHJpZ2dlckJvdW5kcyIsImlucHV0Iiwic2l6ZSIsImdldExlbmd0aCIsInByZWZpeCIsInNldFNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsIkRpdG9UcmlnZ2VyIiwiRGl0b0NhbGVuZGFyIiwiRGl0b0lucHV0IiwiRGl0b0ljb24iLCJkZWZhdWx0Rm9ybWF0cyIsImdldERhdGVQYXJ0IiwiY2FsZW5kYXIiLCJ0b2dnbGUiLCJzZWxlY3Rpb24iLCJzbW9vdGgiLCJzY3JvbGwiLCJyZWYiLCJsaW5lSGVpZ2h0IiwiZGlzdGFuY2UiLCJjb3VudCIsImlzRGlnaXQiLCJjaGFyIiwiRGl0b0RhdGVQaWNrZXIiLCJEaXRvVGltZVBpY2tlciIsInRyYW5zaXRpb24iLCJkaXNhYmxlZCIsInRleHQiLCJzaG93UHJldiIsInNob3dOZXh0IiwiY3VycmVudFBhZ2UiLCJudW1QYWdlcyIsInNob3dMZW5ndGgiLCJwYWdlIiwiYnV0dG9uIiwiY2hlY2tlZCIsInVuY2hlY2tlZCIsIm1vZGVsVmFsdWUiLCJUcmFuc2l0aW9uSGVpZ2h0IiwiZW5hYmxlZCIsInNsb3RzIiwiY3JlYXRlRWxlbWVudCIsIlRyYW5zaXRpb24iLCJzZXRTdHlsZSIsInN0eWxlIiwibmV4dFRpbWVvdXQiLCJmb3JjZVJlcGFpbnQiLCJ3aWR0aCIsImhlaWdodCIsIkRvbU1peGluIiwicmVtb3ZlIiwiRGl0b1VzZXIiLCJyb2xlcyIsInJvbGUiLCJTY2hlbWFQYXJlbnRNaXhpbiIsInNjaGVtYUNvbXBvbmVudHMiLCJWYWxpZGF0b3JNaXhpbiIsIml0IiwiZmlyc3QiLCJSb3V0ZU1peGluIiwicm91dGVDb21wb25lbnQiLCJtYXRjaGVkIiwicmVjb3JkIiwiYnJlYWRjcnVtYiIsInJvdXRlQ29tcG9uZW50cyIsIm9rIiwicmVjb3JkUGF0aCIsInJvb3RQYXRoIiwiZ2V0Q29tbW9uUHJlZml4IiwiaXNMb2FkaW5nIiwidHJ5T25TY29wZURpc3Bvc2UiLCJmbiIsImZhaWxTaWxlbnRseSIsImdldEN1cnJlbnRTY29wZSIsIm9uU2NvcGVEaXNwb3NlIiwiaXNDbGllbnQiLCJpc0RlZiIsInZhbCIsIm5vdE51bGxpc2giLCJ0b0FycmF5IiwiZ2V0TGlmZUN5Y2xlVGFyZ2V0IiwiZ2V0Q3VycmVudEluc3RhbmNlIiwidHJ5T25Nb3VudGVkIiwic3luYyIsIm9uTW91bnRlZCIsIm5leHRUaWNrIiwiZGVmYXVsdERvY3VtZW50IiwidW5yZWZFbGVtZW50IiwiZWxSZWYiLCJfJGVsIiwicGxhaW4iLCJ0b1ZhbHVlIiwiY2xvbmVGbkpTT04iLCJ1c2VWTW9kZWwiLCJlbWl0IiwiX3ZtJCRlbWl0IiwiX3ZtJHByb3h5IiwicGFzc2l2ZSIsImV2ZW50TmFtZSIsImRlZXAiLCJzaG91bGRFbWl0Iiwidm0iLCJfZW1pdCIsImNsb25lRm4iLCJnZXRWYWx1ZSQxIiwidHJpZ2dlckVtaXQiLCJwcm94eSIsImlzVXBkYXRpbmciLCJ2IiwidXNlRm9jdXNUcmFwIiwidHJhcCIsImltbWVkaWF0ZSIsImZvY3VzVHJhcE9wdGlvbnMiLCJoYXNGb2N1cyIsInNoYWxsb3dSZWYiLCJpc1BhdXNlZCIsImFjdGl2YXRlIiwib3B0cyIsImRlYWN0aXZhdGUiLCJwYXVzZSIsInVucGF1c2UiLCJfZWwiLCJlbHMiLCJjcmVhdGVGb2N1c1RyYXAiLCJpc0FjdGl2ZSIsInRyeU9uU2NvcGVEaXNwb3NlJDEiLCJVc2VGb2N1c1RyYXAiLCJkZWZpbmVDb21wb25lbnQiLCJoIiwiZGlhbG9nRGF0YSIsIkRpdG9EaWFsb2ciLCJ0aXBweURlbGVnYXRlIiwiaW5zdGFuY2UiLCJlcnIiLCJkcmFnQ291bnQiLCJ1cGxvYWRzIiwidG9nZ2xlRHJvcFRhcmdldENsYXNzIiwidXBsb2FkIiwic2V0RHJhZ2dpbmdGaWxlcyIsImhhc1VwbG9hZHMiLCJjYW5Ecm9wIiwidGl0bGUiLCJkdXJhdGlvbiIsInJlamVjdCIsImRpYWxvZ0lkIiwiYWRkaXRpb25hbENvbXBvbmVudHMiLCJyZWRpcmVjdEFmdGVyTG9naW4iLCJsb2dpbkRhdGEiLCJ1c2VyIiwiRGl0b1ZpZXciLCJhZGRSb3V0ZXMiLCJyb3V0ZXIiLCJyZW1vdmVycyIsInJvdXRlIiwiZmlyc3RDaGlsZCIsImxvZyIsInN0cmlwSHRtbCIsIm5vdGlmaWNhdGlvbnMiLCJkdXJhdGlvbkZhY3RvciIsIlB1bGxkb3duTWl4aW4iLCJzdGFydFRpbWUiLCJvcGVuIiwiRGl0b1NwaW5uZXIiLCJEaXRvQWZmaXgiLCJEaXRvQWZmaXhlcyIsIkl0ZW1NaXhpbiIsIml0ZW1JZCIsImV4dGVuZGVkIiwiYXNPYmplY3QiLCJpdGVtTGFiZWwiLCJmb3JtTGFiZWwiLCJnZXRGb3JtTGFiZWwiLCJzdWZmaXgiLCJjb2x1bW5zIiwiaGFkTGFiZWwiLCJkZWZhdWx0VGFiIiwicm91dGVUYWIiLCJuZXdUYWIiLCJvbGRUYWIiLCJjb250ZW50IiwiZGF0YVBhdGhPck5hbWUiLCJzY3JvbGxDb250YWluZXIiLCJkaXNwYXRjaCIsImNvbXBvbmVudHNCeURhdGFQYXRoIiwiZGF0YVBhdGhzIiwiY2hlY2siLCJmaWVsZCIsInVubWF0Y2hlZCIsIndhc0ZpcnN0IiwiZXJycyIsImZ1bGxEYXRhUGF0aCIsImRhdGFQYXRoUGFydHMiLCJmb3VuZCIsInByb3BlcnR5Iiwic3ViQ29tcG9uZW50cyIsImxvY2FsRGF0YSIsImZvcmVpZ25EYXRhIiwicGFuZSIsInJlZ2lzdHJ5IiwiZW50cmllc0J5RGF0YVBhdGgiLCJfd2l0aERpcmVjdGl2ZXMiLCJfb3BlbkJsb2NrIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9GcmFnbWVudCIsIl9yZW5kZXJMaXN0IiwiX2N0eCIsIl9ob2lzdGVkXzEiLCJfY3JlYXRlQmxvY2siLCJfY29tcG9uZW50X0RpdG9Db250YWluZXIiLCJuZXN0ZWREYXRhUGF0aCIsIl9ob2lzdGVkXzIiLCJwb3NpdGlvbnMiLCJpc0xhc3RJblJvdyIsImZpbmROZXh0UG9zaXRpb24iLCJyb3dzIiwicm93IiwidmVydGljYWxMYWJlbHNCeUluZGljZXMiLCJoYXNMYWJlbHNJblJvdyIsImNvbnRhaW5lciIsInBhZGRpbmciLCJmb250U2l6ZSIsInBhcnNlRnJhY3Rpb24iLCJkaXZpZGVuZCIsImRpdmlzb3IiLCJhY2N1bXVsYXRlZEJhc2lzIiwiZmxleEJhc2lzIiwiY29tYmluZWRCYXNpcyIsImNhcGl0YWxpemUiLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiX3dpdGhNb2RpZmllcnMiLCIkZXZlbnQiLCJfdG9EaXNwbGF5U3RyaW5nIiwiX2hvaXN0ZWRfNCIsImNyZWF0YWJsZSIsImNsaXBib2FyZERhdGEiLCJwYXN0ZSIsIiRzY2hlbWEiLCJyZXBvcnQiLCJqc29uIiwiZGVpbmRlbnQiLCJMb2FkaW5nTWl4aW4iLCJ1cGRhdGVSb290IiwidXBkYXRlVmlldyIsIlJlc291cmNlTWl4aW4iLCJhbW91bnQiLCJyYW5nZSIsImNoaWxkIiwidmVyYnMiLCJjbGVhciIsImxvYWRpbmdPcHRpb25zIiwiY29udHJvbGxlciIsInJlcXVlc3QiLCJzZXREYXRhIiwib25TdWNjZXNzIiwib25FcnJvciIsIm5vdGlmeVN1Y2Nlc3MiLCJub3RpZnlFcnJvciIsInBhcmVudE1ldGEiLCJyZXNvbHZlUGF0aCIsImlzQ3JlYXRpbmciLCJwcm92aWRlc0RhdGEiLCJkYXRhUGFydHMiLCJwYXRoUGFydHMiLCJyb3V0ZVBhcnRzIiwibGFzdERhdGFQYXJ0IiwibCIsImRhdGFQYXJ0IiwicGFyYW0iLCJtYWluU2NoZW1hQ29tcG9uZW50IiwicHJlc2VudCIsImNsb3NlRm9ybSIsImdldFZlcmIiLCJidXR0b25SZXNvdXJjZSIsInN1Y2Nlc3MiLCJfcmVzb3VyY2UiLCJfbWV0aG9kIiwiRGl0b0Zvcm0iLCJ0aXAiLCJ0aXBweSIsInNjb3BlIiwiUGFnaW5hdGlvbiIsIlNvcnRhYmxlTWl4aW4iLCJmb3JjZUZhbGxiYWNrIiwib2xkSW5kZXgiLCJuZXdJbmRleCIsImxpc3QiLCJwYWdpbmF0aW9uUmFuZ2UiLCJfbm9ybWFsaXplU3R5bGUiLCJfY2FjaGUiLCJfbm9ybWFsaXplQ2xhc3MiLCJfaG9pc3RlZF81IiwiX2hvaXN0ZWRfNyIsIl9tZXJnZVByb3BzIiwiX2hvaXN0ZWRfOCIsIl9jb21wb25lbnRfRGl0b0xhYmVsIiwiX2NyZWF0ZVZOb2RlIiwiX2NvbXBvbmVudF9EaXRvVGFibGVDZWxsIiwiX2NvbXBvbmVudF9EaXRvRHJhZ2dhYmxlIiwiX2NvbXBvbmVudF9EaXRvVHJlZUl0ZW0iLCJjaGlsZHJlblNjaGVtYSIsImNoaWxkcmVuTGlzdCIsImVkaXRQYXRoIiwiY2hpbGRyZW5PcGVuIiwibnVtQ2hpbGRyZW4iLCJlZGl0YWJsZSIsIm9yZGVyIiwiY29sdW1uIiwicmVuZGVyIiwiZXNjYXBlSHRtbCIsIlRZUEVTIiwiZmlsZSIsInJlYWRlciIsInVzZVNvcnRhYmxlIiwic29ydGFibGUiLCJkb2N1bWVudCIsIndhdGNoRWxlbWVudCIsInJlc2V0T3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwiZSIsIm1vdmVBcnJheUVsZW1lbnQiLCJjbGVhbnVwIiwiaW5pdFNvcnRhYmxlIiwiU29ydGFibGUiLCJvcHRpb24iLCJzdG9wV2F0Y2giLCJuZXdFbGVtZW50Iiwic3RvcCIsImluc2VydE5vZGVBdCIsInBhcmVudEVsZW1lbnQiLCJyZWZFbGVtZW50IiwicmVtb3ZlTm9kZSIsIl92YWx1ZUlzUmVmIiwiaXNSZWYiLCJVc2VTb3J0YWJsZSIsIkRpdG9WTm9kZSIsIkRpdG9UeXBlQ29tcG9uZW50JDEiLCJEaXRvVHlwZUNvbXBvbmVudCIsIkRpdG9CdXR0b24iLCJvbkNsaWNrIiwiRGF0YU1peGluIiwiYXN5bmNFbnRyeSIsInJlc29sdmVkRGF0YSIsImxvYWQiLCJjbGVhckxvYWRpbmciLCJ0aW1lciIsIk9wdGlvbnNNaXhpbiIsImNvbnZlcnRWYWx1ZSIsInNlYXJjaCIsImZpbHRlciIsImRlYm91bmNlIiwiZGVib3VuY2VBc3luYyIsImdyb3VwZWQiLCJyZXN1bHRzIiwiZ3JvdXAiLCJmaW5kT3B0aW9uIiwiZ3JvdXBCeSIsIm9wdGlvblZhbHVlIiwib3B0aW9uTGFiZWwiLCJwcm9jZXNzUmVsYXRlIiwiZmxhc2siLCJDb2RlRmxhc2siLCJjaGFuZ2VkIiwiaWdub3JlV2F0Y2giLCJpZ25vcmVVcGRhdGUiLCJzZXRDb2RlIiwiY29kZSIsInNldFZhbHVlIiwibGFuZ3VhZ2UiLCJnZXRQb2ludCIsIngiLCJ5IiwicHJldlkiLCJtb3VzZW1vdmUiLCJoZXgiLCJTa2V0Y2hQaWNrZXIiLCJjb252ZXJ0Q29sb3IiLCJjb2xvciIsInRpbnljb2xvciIsImNvbnZlcnRlZFZhbHVlIiwiY2FuVXBkYXRlVmFsdWUiLCJ0b1Z1ZTNDb2xvckZvcm1hdCIsInRvVGlueUNvbG9yRm9ybWF0IiwiZm9ybWF0cyIsIkRpdG9EYXRlVGltZVBpY2tlciIsImZvcm1hdFF1ZXJ5IiwicmVwbGFjZVJvdXRlIiwiaGFzaCIsIlNvdXJjZU1peGluIiwiZGVmYXVsdFNvcnQiLCJkaXJlY3Rpb24iLCJkcmFnZ2FibGUiLCJjb2xsYXBzaWJsZSIsImNvbGxhcHNlZCIsInJlbW92ZWQiLCJsaXN0RGF0YSIsIm9uQ29tcGxldGUiLCJvcGVuZWQiLCJjYWxsT25Db21wbGV0ZSIsImlubGluZWQiLCJtZXRhIiwiZm9ybU1ldGEiLCJjaGlsZFJvdXRlcyIsInNvdXJjZVBhdGgiLCJmb3JtUm91dGUiLCJnZXRQYXRoV2l0aFBhcmFtIiwiZmxhdFJvdXRlcyIsInN1YlJvdXRlcyIsImNoaWxkUm91dGUiLCJmaWx0ZXJDb21wb25lbnRzIiwiZGF0ZXRpbWUiLCJjcmVhdGVGaWx0ZXJzUGFuZWwiLCJmaWx0ZXJzIiwic3RpY2t5IiwiZmlsdGVyU2NoZW1hcyIsInBhcnNlRmlsdGVyc0RhdGEiLCJjcmVhdGVGaWx0ZXJzQ29tcG9uZW50cyIsImNyZWF0ZUZpbHRlcnNCdXR0b25zIiwiZm9ybWF0RmlsdGVyc0RhdGEiLCJzbWFsbCIsImdldERhdGFOYW1lIiwiZmlsdGVyTmFtZSIsImdldEZpbHRlck5hbWUiLCJkYXRhTmFtZSIsImNvbXBzIiwiZ2V0Q29tcG9uZW50c0ZvckZpbHRlciIsImZpbHRlcnNEYXRhIiwiX2NvbXBvbmVudF9EaXRvVGFibGVIZWFkIiwiX2NvbXBvbmVudF9EaXRvU2NoZW1hSW5saW5lZCIsIl9yZXNvbHZlRHluYW1pY0NvbXBvbmVudCIsIl9jb21wb25lbnRfRGl0b0VkaXRCdXR0b25zIiwiX2hvaXN0ZWRfOSIsIm9iaiIsImZpbHRlcnNEYXRhUGF0aCIsImZpbmREaWZmU3RhcnQiLCJiIiwiY2hpbGRBIiwiY2hpbGRCIiwiaiIsImlubmVyIiwiZmluZERpZmZFbmQiLCJwb3NBIiwicG9zQiIsImlBIiwiaUIiLCJzYW1lIiwibWluU2l6ZSIsIkZyYWdtZW50IiwiZiIsIm5vZGVTdGFydCIsImJsb2NrU2VwYXJhdG9yIiwibGVhZlRleHQiLCJub2RlVGV4dCIsIm90aGVyIiwibGFzdCIsInAiLCJvdGhlclBvcyIsInJldEluZGV4IiwiY3VyUG9zIiwiY3VyIiwibiIsImpvaW5lZCIsIm5vZGVzIiwiU2xpY2UiLCJvcGVuU3RhcnQiLCJvcGVuRW5kIiwiZnJhZ21lbnQiLCJpbnNlcnRJbnRvIiwicmVtb3ZlUmFuZ2UiLCJvcGVuSXNvbGF0aW5nIiwiaW5kZXhUbyIsIm9mZnNldFRvIiwiZGlzdCIsImluc2VydCIsIkVkaXRvckNvbnRlbnQiLCJlZGl0b3IiLCJzbGljZSIsInBhcmFncmFwaCIsImVuYWJsZVJ1bGVzIiwidXBkYXRlVmFsdWUiLCJvblVwZGF0ZSIsInNldFZhbHVlRGVib3VuY2VkIiwiRWRpdG9yIiwiZGlhbG9nQ29tcG9uZW50IiwiZ2V0TWFya0F0dHJpYnV0ZXMiLCJocmVmIiwibWFya3MiLCJ0b29scyIsIkRvY3VtZW50IiwiVGV4dCIsIlBhcmFncmFwaCIsIkJvbGQiLCJJdGFsaWMiLCJVbmRlcmxpbmUiLCJTdHJpa2UiLCJTbWFsbCIsIkNvZGUiLCJTdXBlcnNjcmlwdCIsIlN1YnNjcmlwdCIsIkxpbmtXaXRoVGl0bGUiLCJCbG9ja3F1b3RlIiwiQ29kZUJsb2NrIiwiSGVhZGluZyIsIkhvcml6b250YWxSdWxlIiwiTGlzdEl0ZW0iLCJCdWxsZXRMaXN0IiwiT3JkZXJlZExpc3QiLCJGb290bm90ZXMiLCJGb290bm90ZSIsIkZvb3Rub3RlUmVmZXJlbmNlIiwiSGlzdG9yeSIsIkhhcmRCcmVhayIsInNldEhhcmRCcmVhayIsImV4dGVuc2lvbiIsInNldHRpbmdzTmFtZSIsImRlc2NyaXB0aW9ucyIsImNvbW1hbmRzIiwiYWRkQnV0dG9uIiwiaWNvbiIsImNvbW1hbmQiLCJkZXNjcmlwdGlvbiIsInNldHRpbmdOYW1lIiwiYXR0cmlidXRlIiwiTWFyayIsIkxpbmsiLCJIVE1MQXR0cmlidXRlcyIsIlZ1ZU11bHRpc2VsZWN0IiwicGxhY2Vob2xkZXIiLCJzZWFyY2hhYmxlIiwidGFnZ2FibGUiLCJ0YWciLCJzZWFyY2hUZXJtIiwiTnVtYmVyTWl4aW4iLCJEaXRvU3dpdGNoIiwiVGV4dE1peGluIiwibWFza2VkUGFzc3dvcmQiLCJoYXNFZGl0YWJsZUZvcm1zIiwiZm9ybWF0RmlsZVNpemUiLCJmaWxlc2l6ZSIsIlZ1ZVVwbG9hZCIsImFzRmlsZXMiLCJhY2NlcHQiLCJtYXhTaXplIiwicGFyc2VGaWxlU2l6ZSIsInRodW1ibmFpbHMiLCJ0b3RhbCIsInJlYWR5IiwibmV3RmlsZSIsIm9sZEZpbGUiLCJ4aHIiLCJibG9iIiwiZmlsZXMiLCJSZXNpemVEaXJlY3RpdmUiLCJiaW5kaW5nIiwib2JzZXJ2ZVJlc2l6ZSIsInVub2JzZXJ2ZVJlc2l6ZSIsIk9ic2VydmVyIiwiaXNSZXNpemVTdXBwb3J0ZWQiLCJvYnNlcnZlcnMiLCJib3giLCJEaXRvQWRtaW4iLCJkaXRvIiwiZ2V0QXBpVXJsIiwiaXNBcGlVcmwiLCJ1c2VycyIsInBhcmVudFBhdGgiLCJhcHAiLCJjcmVhdGVBcHAiLCJEaXRvUm9vdCIsIlZ1ZU5vdGlmaWNhdGlvbnMiLCJjcmVhdGVSb3V0ZXIiLCJjcmVhdGVXZWJIaXN0b3J5IiwiUmVxdWVzdEVycm9yIiwiaGVhZGVycyIsImlzQWJzb2x1dGVVcmwiLCJjb21iaW5lVXJscyIsImJhc2VVcmwiLCJyZWxhdGl2ZVVybCJdLCJtYXBwaW5ncyI6Imt3R0FHTyxTQUFTQSxHQUFlQyxFQUFZLEdBQUksQ0FDN0MsTUFBTUMsRUFBUSxDQUFBLEVBRVJDLEVBQUtGLEVBQVUsWUFBVyxFQUMxQixDQUFDRyxDQUFFLEVBQ1Asa0VBQWtFLEtBQ2hFRCxDQUNOLEdBQVMsQ0FBQSxFQUNERSxFQUNKLENBQ0UsT0FBVSxNQUNWLE9BQVUsTUFDVixLQUFRLE1BQ1IsaUJBQWtCLFNBQ3hCLEVBQU1ELENBQUUsR0FDSkEsRUFFRixPQUFJQyxJQUNGSCxFQUFNLFNBQVdHLEVBQ2pCSCxFQUFNRyxDQUFRLEVBQUksSUFFcEJGLEVBQUcsUUFDRCwrR0FDQSxDQUFDRyxFQUFPQyxFQUFTQyxFQUFJQyxFQUFJQyxJQUFPLENBRTlCLEdBQUksQ0FBQ1IsRUFBTSxPQUFRLENBQ2pCLE1BQU1TLEVBQVVELEdBQU1ELEdBQU1ELEdBQ3hCLENBQUNOLEVBQU0sU0FBV0ssSUFBWSxZQUdoQ0wsRUFBTSxRQUFVUyxFQUNoQlQsRUFBTSxjQUFnQixXQUFXUyxDQUFPLEdBRTFDVCxFQUFNLFFBQVVLLEVBQ2hCTCxFQUFNSyxDQUFPLEVBQUksRUFDbkIsQ0FDRixDQUNKLEVBQ01MLEVBQU0sUUFFUixPQUFPQSxFQUFNLE9BRVJBLENBQ1QsQ0MzQ0EsTUFBQVUsR0FBZUMsV0FBUyxDQUN0QixNQUFPLEdBQ1AsZ0JBQWlCLENBQUEsRUFDakIsS0FBTSxLQUNOLE1BQU9iLEdBQWUsVUFBVSxXQUFhLEVBQUUsRUFDL0MsVUFBVyxDQUFBLEVBQ1gsWUFBYSxLQUNiLGNBQWUsSUFDakIsQ0FBQyxFQ0pNLFNBQVNjLEVBQWVDLEVBQVVDLEVBQU8sQ0FDOUMsT0FBT0QsRUFDSCxHQUFHQSxDQUFRLElBQUlDLENBQUssR0FDcEJBLENBQ04sQ0FFTyxTQUFTQyxHQUFv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