From 40dd13e9f0f76f5503573fbce4652489f24aa860 Mon Sep 17 00:00:00 2001 From: Jonas Plotzky Date: Fri, 5 Jul 2024 16:24:06 +0200 Subject: [PATCH] remove transparency check --- Distribution/FudgeCore.d.ts | 16 -------- Distribution/FudgeCore.js | 46 +--------------------- Source/Core/Component/ComponentMaterial.ts | 7 ---- Source/Core/Material/Material.ts | 9 ----- Source/Core/Texture/Texture.ts | 35 ---------------- 5 files changed, 1 insertion(+), 112 deletions(-) diff --git a/Distribution/FudgeCore.d.ts b/Distribution/FudgeCore.d.ts index 2300a19..fea1885 100644 --- a/Distribution/FudgeCore.d.ts +++ b/Distribution/FudgeCore.d.ts @@ -2549,11 +2549,6 @@ declare namespace FudgeCore { /** Support sorting of objects with transparency when rendering, render objects in the back first. When this component is used as a part of a {@link ParticleSystem}, try enabling this when disabling {@link ComponentParticleSystem.depthMask} */ sortForAlpha: boolean; constructor(_material?: Material); - /** - * Returns true if the material has any areas (color or texture) with alpha < 1. - * ⚠️ CAUTION: Computionally expensive for textured materials, see {@link Texture.hasTransparency} - */ - get hasTransparency(): boolean; serialize(): Serialization; deserialize(_serialization: Serialization): Promise; } @@ -3564,11 +3559,6 @@ declare namespace FudgeCore { * Makes this material reference the given {@link Coat} if it is compatible with the referenced {@link Shader} */ set coat(_coat: Coat); - /** - * Returns true if the material has any areas (color or texture) with alpha < 1. - * ⚠️ CAUTION: Computionally expensive for textured materials, see {@link Texture.hasTransparency} - */ - get hasTransparency(): boolean; /** * Creates a new {@link Coat} instance that is valid for the {@link Shader} referenced by this material */ @@ -8348,12 +8338,6 @@ declare namespace FudgeCore { get mipmap(): MIPMAP; set wrap(_wrap: WRAP); get wrap(): WRAP; - /** - * Returns true if the texture has any texels with alpha < 1. - * ⚠️ CAUTION: Has to be recomputed whenever the texture/image data changes. - */ - get hasTransparency(): boolean; - protected set hasTransparency(_hasTransparency: boolean); /** * Returns the image source of this texture. */ diff --git a/Distribution/FudgeCore.js b/Distribution/FudgeCore.js index 9dfa14b..f3d5e5d 100644 --- a/Distribution/FudgeCore.js +++ b/Distribution/FudgeCore.js @@ -6581,13 +6581,6 @@ var FudgeCore; this.material = _material; // this.mutatorCoat = _material.getCoat().getMutatorForComponent(); } - /** - * Returns true if the material has any areas (color or texture) with alpha < 1. - * ⚠️ CAUTION: Computionally expensive for textured materials, see {@link Texture.hasTransparency} - */ - get hasTransparency() { - return this.material?.hasTransparency || this.clrPrimary.a < 1; - } //#region Transfer serialize() { let serialization = { @@ -8954,14 +8947,6 @@ var FudgeCore; throw (new Error("Shader and coat don't match")); this.#coat = _coat; } - /** - * Returns true if the material has any areas (color or texture) with alpha < 1. - * ⚠️ CAUTION: Computionally expensive for textured materials, see {@link Texture.hasTransparency} - */ - get hasTransparency() { - let coat = this.coat; - return coat.color?.a < 1 || coat.texture?.hasTransparency; - } /** * Creates a new {@link Coat} instance that is valid for the {@link Shader} referenced by this material */ @@ -21732,7 +21717,6 @@ var FudgeCore; let Texture = class Texture extends FudgeCore.Mutable { #mipmap; #wrap; - #hasTransparency; constructor(_name = "Texture") { super(); this.idResource = undefined; @@ -21757,33 +21741,6 @@ var FudgeCore; get wrap() { return this.#wrap; } - /** - * Returns true if the texture has any texels with alpha < 1. - * ⚠️ CAUTION: Has to be recomputed whenever the texture/image data changes. - */ - get hasTransparency() { - if (this.#hasTransparency != null) - return this.#hasTransparency; - let imageData; - if (this.texImageSource instanceof ImageData) { - imageData = this.texImageSource; - } - else { - const canvas = document.createElement('canvas'); - canvas.width = this.texImageSource.width; - canvas.height = this.texImageSource.height; - const crc2 = canvas.getContext('2d'); - crc2.drawImage(this.texImageSource, 0, 0); - imageData = crc2.getImageData(0, 0, this.texImageSource.width, this.texImageSource.height); - } - for (let i = 0; i < imageData.data.length; i += 4) - if (imageData.data[i + 3] < 255) - return this.#hasTransparency = true; - return this.#hasTransparency = false; - } - set hasTransparency(_hasTransparency) { - this.#hasTransparency = _hasTransparency; - } /** * Generates and binds the texture in WebGL from the {@link texImageSource}. * Injected by {@link RenderInjectorTexture}. Used by the render system. @@ -21875,7 +21832,6 @@ var FudgeCore; return new Promise((_resolve, _reject) => { this.image.addEventListener("load", () => { this.renderData = null; // refresh render data on next draw call - this.hasTransparency = null; // reset transparency check _resolve(); }); this.image.addEventListener("error", () => _reject()); @@ -22525,4 +22481,4 @@ var FudgeCore; } FudgeCore.Timer = Timer; })(FudgeCore || (FudgeCore = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVkZ2VDb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vU291cmNlL0NvcmUvRGVidWcvRGVidWdUYXJnZXQudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Z0ludGVyZmFjZXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Z0NvbnNvbGUudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Zy50cyIsIi4uL1NvdXJjZS9Db3JlL0V2ZW50L0V2ZW50LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9NdXRhYmxlLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9TZXJpYWxpemVyLnRzIiwiLi4vU291cmNlL0NvcmUvR3JhcGgvTm9kZS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnQudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZWN5Y2xlL1JlY3ljYWJsZUFycmF5LnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yU2hhZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yQ29hdC50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJJbmplY3Rvck1lc2gudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZW5kZXIvUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvUmVjeWNsZS9SZWN5Y2xlci50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvVmVjdG9yMi50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvUmVjdGFuZ2xlLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlcldlYkdMLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yVGV4dHVyZS50cyIsIi4uL1NvdXJjZS9Db3JlL1BoeXNpY3MvSGVscGVyc1BoeXNpY3MudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50LnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludEF4aWFsLnRzIiwiLi4vU291cmNlL0NvcmUvUmVmZXJlbmNlcy50cyIsIi4uL1NvdXJjZS9Db3JlL0FuaW1hdGlvbi9BbmltYXRpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uRnVuY3Rpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uR0xURi50cyIsIi4uL1NvdXJjZS9Db3JlL0FuaW1hdGlvbi9BbmltYXRpb25LZXkudHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uU2VxdWVuY2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uU3ByaXRlLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW8udHMiLCIuLi9Tb3VyY2UvQ29yZS9FdmVudC9FdmVudEF1ZGlvLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW9NYW5hZ2VyLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW9Pc2NpbGxhdG9yLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudEFtYmllbnRPY2NsdXNpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QW5pbWF0b3IudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QXVkaW8udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QXVkaW9MaXN0ZW5lci50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRCbG9vbS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRDYW1lcmEudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50RmFjZUNhbWVyYS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRGb2cudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50R3JhcGhGaWx0ZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9MaWdodC9MaWdodC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRMaWdodC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRNYXRlcmlhbC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRNZXNoLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFBpY2sudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50U2NyaXB0LnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b24udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50U2tlbGV0b24udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50VGV4dC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRUcmFuc2Zvcm0udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50VlJEZXZpY2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db250cm9sL0NvbnRyb2wudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db250cm9sL0F4aXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db250cm9sL0tleWJvYXJkLnRzIiwiLi4vU291cmNlL0NvcmUvRGVidWcvRGVidWdBbGVydC50cyIsIi4uL1NvdXJjZS9Db3JlL0RlYnVnL0RlYnVnRGlhbG9nLnRzIiwiLi4vU291cmNlL0NvcmUvRGVidWcvRGVidWdUZXh0QXJlYS50cyIsIi4uL1NvdXJjZS9Db3JlL0V2ZW50L0V2ZW50S2V5Ym9hcmQudHMiLCIuLi9Tb3VyY2UvQ29yZS9FdmVudC9FdmVudFRpbWVyLnRzIiwiLi4vU291cmNlL0NvcmUvRXZlbnQvRXZlbnRUb3VjaC50cyIsIi4uL1NvdXJjZS9Db3JlL0dyYXBoL0dyYXBoLnRzIiwiLi4vU291cmNlL0NvcmUvR3JhcGgvR3JhcGhHTFRGLnRzIiwiLi4vU291cmNlL0NvcmUvR3JhcGgvR3JhcGhJbnN0YW5jZS50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGVyaWFsL0NvYXQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0Q29sb3JlZC50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGVyaWFsL0NvYXRSZW1pc3NpdmUudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0VGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0UmVtaXNzaXZlVGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0UmVtaXNzaXZlVGV4dHVyZWROb3JtYWxzLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29hdFRvb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2xvci50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGVyaWFsL01hdGVyaWFsLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvTWF0ZXJpYWxHTFRGLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9DYWxjLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9GcmFtaW5nLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9HZW8yLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9HZW8zLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9MRklCNC50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvTWF0cml4M3gzLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9NYXRyaXg0eDQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL05vaXNlLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9Ob2lzZTIudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL05vaXNlMy50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvTm9pc2U0LnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9RdWF0ZXJuaW9uLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9SYW5kb20udHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL1ZlY3RvcjMudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL1ZlY3RvcjQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL0ZhY2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2gudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hDdWJlLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoUG9seWdvbi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaEV4dHJ1c2lvbi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaEZCWC50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaEZyb21EYXRhLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoR0xURi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaE9CSi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaFB5cmFtaWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hRdWFkLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoVGVycmFpbi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaFJlbGllZi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaFJvdGF0aW9uLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoU3BoZXJlLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoU3ByaXRlLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoVG9ydXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL1F1YWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL1ZlcnRleC50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvVmVydGljZXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9QYXJ0aWNsZVN5c3RlbS9QYXJ0aWNsZVN5c3RlbS50cyIsIi4uL1NvdXJjZS9Db3JlL1BhcnRpY2xlU3lzdGVtL1NoYWRlclBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvUGF0aGluZy9Db21wb25lbnRXYWxrZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9QYXRoaW5nL0NvbXBvbmVudFdheXBvaW50LnRzIiwiLi4vU291cmNlL0NvcmUvUGF0aGluZy9Db25uZWN0aW9uLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Db21wb25lbnRSaWdpZGJvZHkudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0RlYnVnUGh5c2ljc0RyYXcudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50Q3lsaW5kcmljYWwudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50UHJpc21hdGljLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludFJhZ2RvbGwudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50UmV2b2x1dGUudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50U3BoZXJpY2FsLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludFVuaXZlcnNhbC50cyIsIi4uL1NvdXJjZS9Db3JlL1BoeXNpY3MvSm9pbnRXZWxkaW5nLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9QaHlzaWNzLnRzIiwiLi4vU291cmNlL0NvcmUvUmF5L0JveC50cyIsIi4uL1NvdXJjZS9Db3JlL1JheS9QaWNrLnRzIiwiLi4vU291cmNlL0NvcmUvUmF5L1BpY2tlci50cyIsIi4uL1NvdXJjZS9Db3JlL1JheS9SYXkudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZW5kZXIvR2l6bW9zLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlci50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJNZXNoLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1ZpZXdwb3J0LnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1hSVmlld3BvcnQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TZXJpYWxpemF0aW9uL0ZpbGVJb0Jyb3dzZXJMb2NhbC50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vTXV0YWJsZUFycmF5LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9Qcm9qZWN0LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvQnVmZmVyUmVhZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYTG9hZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYTm9kZS50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vRkJYL2xvYWRGcm9tTm9kZXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9TZXJpYWxpemF0aW9uL0ZCWC9wYXJzZU5vZGVzRnJvbUJpbmFyeS50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vR0xURi9HTFRGLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9HTFRGL0dMVEZMb2FkZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvTWVyZ2VkU2hhZGVyU291cmNlcy50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyQW1iaWVudE9jY2x1c2lvbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJCbG9vbS50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJGbGF0LnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckZsYXRTa2luLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckZsYXRUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJGbGF0VGV4dHVyZWRTa2luLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckdpem1vLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckdpem1vVGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyR291cmF1ZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJHb3VyYXVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJHb3VyYXVkVGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyR291cmF1ZFRleHR1cmVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyTGl0U2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXRUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXRUZXh0dXJlZFNraW4udHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyTWF0Q2FwLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaG9uZ1RleHR1cmVkLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nVGV4dHVyZWROb3JtYWxzLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nVGV4dHVyZWROb3JtYWxzU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaG9uZ1RleHR1cmVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaWNrLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBpY2tUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJUb29uLnRzIiwiLi4vU291cmNlL0NvcmUvVGV4dHVyZS9UZXh0dXJlLnRzIiwiLi4vU291cmNlL0NvcmUvVGV4dHVyZS9UZXh0dXJlRGVmYXVsdC50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvTG9vcC50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvVGltZS50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvVGltZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQVUsU0FBUyxDQW9CbEI7QUFwQkQsV0FBVSxTQUFTO0lBQ2pCOztPQUVHO0lBQ0gsTUFBc0IsV0FBVztRQUcvQjs7V0FFRztRQUNJLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBZ0IsRUFBRSxHQUFHLEtBQWU7WUFDL0QsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsMkJBQTJCO1lBQ2xFLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSztnQkFDbkIsSUFBSSxHQUFHLFlBQVksTUFBTTtvQkFDdkIsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsK0JBQStCOztvQkFFNUUsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQywrQkFBK0I7WUFDakUsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO0tBQ0Y7SUFmcUIscUJBQVcsY0FlaEMsQ0FBQTtBQUNILENBQUMsRUFwQlMsU0FBUyxLQUFULFNBQVMsUUFvQmxCO0FDcEJELG9DQUFvQztBQUNwQyxJQUFVLFNBQVMsQ0FnQ2xCO0FBakNELG9DQUFvQztBQUNwQyxXQUFVLFNBQVM7SUFDakI7O09BRUc7SUFDSCxJQUFZLFlBZVg7SUFmRCxXQUFZLFlBQVk7UUFDdEIsK0NB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Q0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksU0FBUyxHQUFjLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRCxTQUFTLENBQUMsR0FBRyxDQUFDO2dCQUNaLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDakMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcs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WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDWixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcs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Q0FBQyxDQUFDO2dCQUM3SSxNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyRixNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLEVBQUUsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUV6QixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQSxJQUFJO2dCQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzVFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQSxJQUFJO2dCQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDNUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBLElBQUk7Z0JBQUMsRUFBRSxD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VyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUU5QixJQUFJLEVBQUUsR0FBVyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNyRCxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFFekMsSUFBSSxFQUFFLEdBQVcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFDckQsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLElBQUksRUFBRSxHQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7Z0JBQ3RELENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztZQUMxQyxJQUFJLEVBQUUsR0FBVyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO2dCQUN0RCxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFFMUMsSUFBSSxDQUFDLEdBQVcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRWxFLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ1AsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNO2dCQUNkLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTTtnQkFDZCxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU07Z0JBQ2QsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNO2dCQUNkLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBUyxNQUFNO2dCQUNwRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQVMsTUFBTTtnQkFDcEcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFPLE1BQU07Z0JBQ3BHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBTyxNQUFNO2dCQUNwRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUcsTUFBTTtnQkFDcEcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFHLE1BQU07Z0JBQ3BHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRyxPQUFPO2dCQUNyRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUcsT0FBTztnQkFDckcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFHLE9BQU87Z0JBQ3JHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFL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QUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxD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QUFNLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxnREFBZ0Q7Z0JBQ2xHLE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyw4Q0FBOEM7Z0JBQ2pHLE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2xELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2xELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBRWxELG1FQUFtRTtnQkFDbkUsTUFBTSxFQUFFLEdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLEdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLEdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDM0Is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QUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDMUUsTUFBTSxFQUFFLEdBQVcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQy9ELE1BQU0sRUFBRSxHQUFXLEVBQUUsR0FBRyxDQUFDO29CQUN2QixDQUFDLENBQUMsR0FBRztvQkFDTCxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzFFLE1BQU0sRUFBRSxHQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUMvRCxNQUFNLEVBQUUsR0FBVyxFQUFFLEdBQUcsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENB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QUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNyQyxVQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsV0FBVyxnRUFBZ0UsQ0FBQyxDQUFDO2dCQUN6RyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzVDLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxLQUFLLEdBQWMsTUFBTSxDQUFDO1lBRTlCLElBQUksR0FBRyxHQUFZLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLElBQUksR0FBRyxHQUFZLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxVQUFBLFFBQVEsRUFBRSxDQUFDO1lBQy9CLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksVUFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFbkQsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFDRCxJQUFJLElBQUksR0FBWSxJQUFJLFVBQUEsT0FB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SSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDbkQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQUEsSUFBSSxDQUNqQixJQUFJLENBQUMsUUFBUSxFQUNiLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQzNDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQzNDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQzNDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQzNDLEtBQUssQ0FDTixDQUFDLENBQUM7b0JBQ0gsS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLFVBQUEsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFBLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQUEsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDdEUsQ0FBQztnQkFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsb0RBQW9EO29CQUNsRixLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksVUFBQSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQUEsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFB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LENBQUMsTUFBTTtZQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVNLFFBQVEsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVNLFFBQVEsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVNLFFBQVEsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVNLFVBQVUsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVNLFVBQVUsQ0FBQyxVQUFrQixJQUFJLENBQUMsTUFBTTtZQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVB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WUFDekMsdUJBQXVCO1lBQ3ZCLHVFQUF1RTtZQUN2RSwyR0FBMkc7WUFDM0csb0NBQW9DO1lBQ3BDLElBQUk7WUFDSixPQUFPO1lBQ1Asa0hBQWtIO1lBQ2xILE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLENBQUM7S0FDRjtJQTdGWSxlQUFLLFFBNkZqQixDQUFBO0FBQ0gsQ0FBQyxFQTNHUyxTQUFTLEtBQVQsU0FBUyxRQTJHbEIiLCJzb3VyY2VzQ29udGVudCI6WyJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBCYXNlIGNsYXNzIGZvciB0aGUgZGlmZmVyZW50IERlYnVnVGFyZ2V0cywgbWFpbmx5IGZvciB0ZWNobmljYWwgcHVycG9zZSBvZiBpbmhlcml0YW5jZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICBwdWJsaWMgZGVsZWdhdGVzOiBNYXBEZWJ1Z0ZpbHRlclRvRGVsZWdhdGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXJnZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgc3RyaW5nLCBzZXBhcmF0ZWQgYnkgJywgJ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG1lcmdlQXJndW1lbnRzKF9tZXNzYWdlOiBPYmplY3QsIC4uLl9hcmdzOiBPYmplY3RbXSk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBvdXQ6IHN0cmluZyA9IF9tZXNzYWdlLnRvU3RyaW5nKCk7IC8vSlNPTi5zdHJpbmdpZnkoX21lc3NhZ2UpO1xyXG4gICAgICBmb3IgKGxldCBhcmcgb2YgX2FyZ3MpXHJcbiAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIE51bWJlcilcclxuICAgICAgICAgIG91dCArPSBcIiwgXCIgKyBhcmcudG9QcmVjaXNpb24oMikudG9TdHJpbmcoKTsgLy9KU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIG91dCArPSBcIiwgXCIgKyBhcmcudG9TdHJpbmcoKTsgLy9KU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpO1xyXG4gICAgICByZXR1cm4gb3V0O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnQWxlcnQudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBmaWx0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gZGVidWcgYWN0aXZpdGllcywgbW9yZSB0byBjb21lXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gREVCVUdfRklMVEVSIHtcclxuICAgIE5PTkUgPSAweDAwLFxyXG4gICAgSU5GTyA9IDB4MDEsXHJcbiAgICBMT0cgPSAweDAyLFxyXG4gICAgV0FSTiA9IDB4MDQsXHJcbiAgICBFUlJPUiA9IDB4MDgsXHJcbiAgICBGVURHRSA9IDB4MTAsXHJcbiAgICBDTEVBUiA9IDB4MTAwLFxyXG4gICAgR1JPVVAgPSAweDEwMSxcclxuICAgIEdST1VQQ09MTEFQU0VEID0gMHgxMDIsXHJcbiAgICBHUk9VUEVORCA9IDB4MTA0LFxyXG4gICAgU09VUkNFID0gMHgyMDAsXHJcbiAgICBNRVNTQUdFUyA9IElORk8gfCBMT0cgfCBXQVJOIHwgRVJST1IgfCBGVURHRSxcclxuICAgIEZPUk1BVCA9IENMRUFSIHwgR1JPVVAgfCBHUk9VUENPTExBUFNFRCB8IEdST1VQRU5ELFxyXG4gICAgQUxMID0gTUVTU0FHRVMgfCBGT1JNQVRcclxuICB9XHJcblxyXG4gIGV4cG9ydCBjb25zdCBERUJVR19TWU1CT0w6IHsgW2ZpbHRlcjogbnVtYmVyXTogc3RyaW5nIH0gPSB7XHJcbiAgICBbREVCVUdfRklMVEVSLklORk9dOiBcIuKck1wiLFxyXG4gICAgW0RFQlVHX0ZJTFRFUi5MT0ddOiBcIuKcjlwiLFxyXG4gICAgW0RFQlVHX0ZJTFRFUi5XQVJOXTogXCLimqBcIixcclxuICAgIFtERUJVR19GSUxURVIuRVJST1JdOiBcIuKdjFwiLFxyXG4gICAgW0RFQlVHX0ZJTFRFUi5GVURHRV06IFwi8J+OslwiLFxyXG4gICAgW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdOiBcIvCflJdcIlxyXG4gIH07XHJcblxyXG4gIGV4cG9ydCB0eXBlIE1hcERlYnVnVGFyZ2V0VG9EZWxlZ2F0ZSA9IE1hcDxEZWJ1Z1RhcmdldCwgRnVuY3Rpb24+O1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWFwRGVidWdGaWx0ZXJUb0RlbGVnYXRlIHsgW2ZpbHRlcjogbnVtYmVyXTogRnVuY3Rpb24gfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z1RhcmdldC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogUm91dGluZyB0byB0aGUgc3RhbmRhcmQtY29uc29sZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBEZWJ1Z0NvbnNvbGUgZXh0ZW5kcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGVnYXRlczogTWFwRGVidWdGaWx0ZXJUb0RlbGVnYXRlID0ge1xyXG4gICAgICBbREVCVUdfRklMVEVSLklORk9dOiBjb25zb2xlLmluZm8sXHJcbiAgICAgIFtERUJVR19GSUxURVIuTE9HXTogY29uc29sZS5sb2csXHJcbiAgICAgIFtERUJVR19GSUxURVIuV0FSTl06IGNvbnNvbGUud2FybixcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5FUlJPUl06IGNvbnNvbGUuZXJyb3IsXHJcbiAgICAgIFtERUJVR19GSUxURVIuRlVER0VdOiBEZWJ1Z0NvbnNvbGUuZnVkZ2UsXHJcbiAgICAgIFtERUJVR19GSUxURVIuQ0xFQVJdOiBjb25zb2xlLmNsZWFyLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkdST1VQXTogY29uc29sZS5ncm91cCxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5HUk9VUENPTExBUFNFRF06IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQsXHJcbiAgICAgIFtERUJVR19GSUxURVIuR1JPVVBFTkRdOiBjb25zb2xlLmdyb3VwRW5kLFxyXG4gICAgICBbREVCVUdfRklMVEVSLlNPVVJDRV06IERlYnVnQ29uc29sZS5zb3VyY2VcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG91bGQgYmUgdXNlZCB0byBkaXNwbGF5IHVuY3JpdGljYWwgc3RhdGUgaW5mb3JtYXRpb24gb2YgRlVER0UsIG9ubHkgdmlzaWJsZSBpbiBicm93c2VyJ3MgdmVyYm9zZSBtb2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZnVkZ2UoX21lc3NhZ2U6IE9iamVjdCwgLi4uX2FyZ3M6IE9iamVjdFtdKTogdm9pZCB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5GVURHRV0sIF9tZXNzYWdlLCAuLi5fYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwbGF5cyBhbiBleHRyYSBsaW5lIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiB0aGUgZGVidWcgbWVzc2FnZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNvdXJjZShfbWVzc2FnZTogT2JqZWN0LCAuLi5fYXJnczogT2JqZWN0W10pOiB2b2lkIHtcclxuICAgICAgY29uc29sZS5sb2coREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdLCBfbWVzc2FnZSwgLi4uX2FyZ3MpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiRGVidWdUYXJnZXQudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z0ludGVyZmFjZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z0NvbnNvbGUudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBEZWJ1Zy1DbGFzcyBvZmZlcnMgZnVuY3Rpb25zIGtub3duIGZyb20gdGhlIGNvbnNvbGUtb2JqZWN0IGFuZCBhZGRpdGlvbnMsIFxyXG4gICAqIHJvdXRpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHZhcmlvdXMge0BsaW5rIERlYnVnVGFyZ2V0fXMgdGhhdCBjYW4gYmUgZWFzaWx5IGRlZmluZWQgYnkgdGhlIGRldmVsb3BlcnMgYW5kIHJlZ2lzdGVyZCBieSB1c2Vyc1xyXG4gICAqIE92ZXJyaWRlIGZ1bmN0aW9ucyBpbiBzdWJjbGFzc2VzIG9mIHtAbGluayBEZWJ1Z1RhcmdldH0gYW5kIHJlZ2lzdGVyIHRoZW0gYXMgdGhlaXIgZGVsZWdhdGVzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIERlYnVnIHtcclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggc2V0IGZpbHRlciwgdGhpcyBhc3NvY2lhdGl2ZSBhcnJheSBrZWVwcyByZWZlcmVuY2VzIHRvIHRoZSByZWdpc3RlcmVkIGRlbGVnYXRlIGZ1bmN0aW9ucyBvZiB0aGUgY2hvc2VuIHtAbGluayBEZWJ1Z1RhcmdldH1zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGRlbGVnYXRlczogeyBbZmlsdGVyOiBudW1iZXJdOiBNYXBEZWJ1Z1RhcmdldFRvRGVsZWdhdGUgfSA9IERlYnVnLnNldHVwQ29uc29sZSgpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGUtIC8gQWN0aXZhdGUgYSBmaWx0ZXIgZm9yIHRoZSBnaXZlbiBEZWJ1Z1RhcmdldC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0RmlsdGVyKF90YXJnZXQ6IERlYnVnVGFyZ2V0LCBfZmlsdGVyOiBERUJVR19GSUxURVIpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgZmlsdGVyIGluIERlYnVnLmRlbGVnYXRlcylcclxuICAgICAgICBEZWJ1Zy5kZWxlZ2F0ZXNbZmlsdGVyXS5kZWxldGUoX3RhcmdldCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBmaWx0ZXIgaW4gREVCVUdfRklMVEVSKSB7XHJcbiAgICAgICAgbGV0IHBhcnNlZDogbnVtYmVyID0gcGFyc2VJbnQoZmlsdGVyKTtcclxuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGlmIChbREVCVUdfRklMVEVSLk1FU1NBR0VTLCBERUJVR19GSUxURVIuRk9STUFULCBERUJVR19GSUxURVIuQUxMXS5pbmRleE9mKHBhcnNlZCkgIT0gLTEpXHJcbiAgICAgICAgICAvLyBkb250IGRlbGVnYXRlIGNvbWJvcy4uLiBcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmIChfZmlsdGVyICYgcGFyc2VkKVxyXG4gICAgICAgICAgRGVidWcuZGVsZWdhdGVzW3BhcnNlZF0uc2V0KF90YXJnZXQsIF90YXJnZXQuZGVsZWdhdGVzW3BhcnNlZF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGZpbHRlcihzKSBmb3IgdGhlIGdpdmVuIERlYnVnVGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWx0ZXIoX3RhcmdldDogRGVidWdUYXJnZXQpOiBERUJVR19GSUxURVIge1xyXG4gICAgICBsZXQgcmVzdWx0OiBERUJVR19GSUxURVIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBmaWx0ZXIgaW4gX3RhcmdldC5kZWxlZ2F0ZXMpXHJcbiAgICAgICAgcmVzdWx0IHw9IHBhcnNlSW50KGZpbHRlcik7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBmaWx0ZXIgdG8gdGhlIGdpdmVuIERlYnVnVGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhZGRGaWx0ZXIoX3RhcmdldDogRGVidWdUYXJnZXQsIF9maWx0ZXI6IERFQlVHX0ZJTFRFUik6IHZvaWQge1xyXG4gICAgICBsZXQgY3VycmVudDogREVCVUdfRklMVEVSID0gRGVidWcuZ2V0RmlsdGVyKF90YXJnZXQpO1xyXG4gICAgICBEZWJ1Zy5zZXRGaWx0ZXIoX3RhcmdldCwgY3VycmVudCB8IF9maWx0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGEgZmlsdGVyIGZyb20gdGhlIGdpdmVuIERlYnVnVGFyZ2V0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUZpbHRlcihfdGFyZ2V0OiBEZWJ1Z1RhcmdldCwgX2ZpbHRlcjogREVCVUdfRklMVEVSKTogdm9pZCB7XHJcbiAgICAgIGxldCBjdXJyZW50OiBERUJVR19GSUxURVIgPSBEZWJ1Zy5nZXRGaWx0ZXIoX3RhcmdldCk7XHJcbiAgICAgIERlYnVnLnNldEZpbHRlcihfdGFyZ2V0LCBjdXJyZW50IF4gX2ZpbHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmZvKC4uLikgZGlzcGxheXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aXRoIGxvdyBwcmlvcml0eVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGluZm8oX21lc3NhZ2U6IHVua25vd24sIC4uLl9hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLklORk8sIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIGluZm9ybWF0aW9uIHdpdGggbWVkaXVtIHByaW9yaXR5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgbG9nKF9tZXNzYWdlOiB1bmtub3duLCAuLi5fYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmRlbGVnYXRlKERFQlVHX0ZJTFRFUi5MT0csIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IG5vbi1jb25mb3JtaXRpZXMgaW4gdXNhZ2UsIHdoaWNoIGlzIGVtcGhhc2l6ZWQgZS5nLiBieSBjb2xvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHdhcm4oX21lc3NhZ2U6IHVua25vd24sIC4uLl9hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLldBUk4sIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIGNyaXRpY2FsIGluZm9ybWF0aW9uIGFib3V0IGZhaWx1cmVzLCB3aGljaCBpcyBlbXBoYXNpemVkIGUuZy4gYnkgY29sb3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihfbWVzc2FnZTogdW5rbm93biwgLi4uX2FyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuRVJST1IsIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIG1lc3NhZ2VzIGZyb20gRlVER0VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBmdWRnZShfbWVzc2FnZTogdW5rbm93biwgLi4uX2FyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuRlVER0UsIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgb3V0cHV0IGFuZCByZW1vdmVzIHByZXZpb3VzIG1lc3NhZ2VzIGlmIHBvc3NpYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmRlbGVnYXRlKERFQlVHX0ZJTFRFUi5DTEVBUiwgbnVsbCwgbnVsbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9wZW5zIGEgbmV3IGdyb3VwIGZvciBtZXNzYWdlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdyb3VwKF9uYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLkdST1VQLCBfbmFtZSwgbnVsbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9wZW5zIGEgbmV3IGdyb3VwIGZvciBtZXNzYWdlcyB0aGF0IGlzIGNvbGxhcHNlZCBhdCBmaXJzdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdyb3VwQ29sbGFwc2VkKF9uYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLkdST1VQQ09MTEFQU0VELCBfbmFtZSwgbnVsbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENsb3NlcyB0aGUgeW91bmdlc3QgZ3JvdXBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBncm91cEVuZCgpOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLkdST1VQRU5ELCBudWxsLCBudWxsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTG9nIGEgYnJhbmNoIG9mIHRoZSBub2RlIGhpZXJhcmNoeVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGJyYW5jaChfYnJhbmNoOiBOb2RlKTogdm9pZCB7XHJcbiAgICAgIGlmIChfYnJhbmNoLm5DaGlsZHJlbiA+IDApXHJcbiAgICAgICAgRGVidWcuZ3JvdXAoX2JyYW5jaC5uYW1lKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIERlYnVnLmZ1ZGdlKF9icmFuY2gubmFtZSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBfYnJhbmNoLmdldENoaWxkcmVuKCkpIERlYnVnLmJyYW5jaChjaGlsZCk7XHJcblxyXG4gICAgICBpZiAoX2JyYW5jaC5uQ2hpbGRyZW4gPiAwKVxyXG4gICAgICAgIERlYnVnLmdyb3VwRW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwbGF5cyBtZXNzYWdlcyBhYm91dCB0aGUgc291cmNlIG9mIHRoZSBkZWJ1ZyBjYWxsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc291cmNlKF9tZXNzYWdlOiB1bmtub3duLCAuLi5fYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmRlbGVnYXRlKERFQlVHX0ZJTFRFUi5TT1VSQ0UsIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb29rdXAgYWxsIGRlbGVnYXRlcyByZWdpc3RlcmVkIHRvIHRoZSBmaWx0ZXIgYW5kIGNhbGwgdGhlbSB1c2luZyB0aGUgZ2l2ZW4gYXJndW1lbnRzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGRlbGVnYXRlKF9maWx0ZXI6IERFQlVHX0ZJTFRFUiwgX21lc3NhZ2U6IHVua25vd24sIF9hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgaWYgKF9maWx0ZXIgPT0gREVCVUdfRklMVEVSLkxPRyB8fCBfZmlsdGVyID09IERFQlVHX0ZJTFRFUi5XQVJOIHx8IF9maWx0ZXIgPT0gREVCVUdfRklMVEVSLkVSUk9SKSB7XHJcbiAgICAgICAgaWYgKERlYnVnLmRlbGVnYXRlc1tERUJVR19GSUxURVIuU09VUkNFXSlcclxuICAgICAgICAgIGZvciAobGV0IGRlbGVnYXRlIG9mIERlYnVnLmRlbGVnYXRlc1tERUJVR19GSUxURVIuU09VUkNFXS52YWx1ZXMoKSlcclxuICAgICAgICAgICAgaWYgKGRlbGVnYXRlKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRyYWNlOiBzdHJpbmdbXSA9IG5ldyBFcnJvcihcIlRlc3RcIikuc3RhY2suc3BsaXQoXCJcXG5cIik7XHJcbiAgICAgICAgICAgICAgZGVsZWdhdGUodHJhY2VbM10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGRlbGVnYXRlczogTWFwRGVidWdUYXJnZXRUb0RlbGVnYXRlID0gRGVidWcuZGVsZWdhdGVzW19maWx0ZXJdO1xyXG4gICAgICBmb3IgKGxldCBkZWxlZ2F0ZSBvZiBkZWxlZ2F0ZXMudmFsdWVzKCkpXHJcbiAgICAgICAgaWYgKGRlbGVnYXRlKVxyXG4gICAgICAgICAgaWYgKF9hcmdzICYmIF9hcmdzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIGRlbGVnYXRlKF9tZXNzYWdlLCAuLi5fYXJncyk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGRlbGVnYXRlKF9tZXNzYWdlKTtcclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHNldHVwIHJvdXRpbmcgdG8gc3RhbmRhcmQgY29uc29sZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBzZXR1cENvbnNvbGUoKToge30ge1xyXG4gICAgICBsZXQgcmVzdWx0OiB7IFtmaWx0ZXI6IG51bWJlcl06IE1hcERlYnVnVGFyZ2V0VG9EZWxlZ2F0ZSB9ID0ge307XHJcbiAgICAgIGxldCBmaWx0ZXJzOiBERUJVR19GSUxURVJbXSA9IFtcclxuICAgICAgICBERUJVR19GSUxURVIuSU5GTywgREVCVUdfRklMVEVSLkxPRywgREVCVUdfRklMVEVSLldBUk4sIERFQlVHX0ZJTFRFUi5FUlJPUiwgREVCVUdfRklMVEVSLkZVREdFLFxyXG4gICAgICAgIERFQlVHX0ZJTFRFUi5DTEVBUiwgREVCVUdfRklMVEVSLkdST1VQLCBERUJVR19GSUxURVIuR1JPVVBDT0xMQVBTRUQsIERFQlVHX0ZJTFRFUi5HUk9VUEVORCxcclxuICAgICAgICBERUJVR19GSUxURVIuU09VUkNFXHJcbiAgICAgIF07XHJcblxyXG4gICAgICBmb3IgKGxldCBmaWx0ZXIgb2YgZmlsdGVycylcclxuICAgICAgICByZXN1bHRbZmlsdGVyXSA9IG5ldyBNYXAoW1tEZWJ1Z0NvbnNvbGUsIERlYnVnQ29uc29sZS5kZWxlZ2F0ZXNbZmlsdGVyXV1dKTtcclxuXHJcbiAgICAgIHJlc3VsdFtERUJVR19GSUxURVIuU09VUkNFXS5kZWxldGUoRGVidWdDb25zb2xlKTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGludGVyZmFjZSBNYXBFdmVudFR5cGVUb0xpc3RlbmVyIHtcclxuICAgIFtldmVudFR5cGU6IHN0cmluZ106IEV2ZW50TGlzdGVuZXJVbmlmaWVkW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUeXBlcyBvZiBldmVudHMgc3BlY2lmaWMgdG8gRlVER0UsIGluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBET00vQnJvd3Nlci1UeXBlcyBhbmQgY3VzdG9tIHN0cmluZ3NcclxuICAgKi9cclxuICBleHBvcnQgY29uc3QgZW51bSBFVkVOVCB7XHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB0YXJnZXRzIHJlZ2lzdGVyZWQgYXQge0BsaW5rIExvb3B9LCB3aGVuIHJlcXVlc3RlZCBhbmltYXRpb24gZnJhbWUgc3RhcnRzICovXHJcbiAgICBMT09QX0ZSQU1FID0gXCJsb29wRnJhbWVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEge0BsaW5rIENvbXBvbmVudH0gd2hlbiBpdHMgYmVpbmcgYWRkZWQgdG8gYSB7QGxpbmsgTm9kZX0gKi9cclxuICAgIENPTVBPTkVOVF9BREQgPSBcImNvbXBvbmVudEFkZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgQ29tcG9uZW50fSB3aGVuIGl0cyBiZWluZyByZW1vdmVkIGZyb20gYSB7QGxpbmsgTm9kZX0gKi9cclxuICAgIENPTVBPTkVOVF9SRU1PVkUgPSBcImNvbXBvbmVudFJlbW92ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgQ29tcG9uZW50fSB3aGVuIGl0cyBiZWluZyBhY3RpdmF0ZWQgKi9cclxuICAgIENPTVBPTkVOVF9BQ1RJVkFURSA9IFwiY29tcG9uZW50QWN0aXZhdGVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEge0BsaW5rIENvbXBvbmVudH0gd2hlbiBpdHMgYmVpbmcgZGVhY3RpdmF0ZWQgKi9cclxuICAgIENPTVBPTkVOVF9ERUFDVElWQVRFID0gXCJjb21wb25lbnREZWFjdGl2YXRlXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIHtAbGluayBOb2RlfSwgaXQncyBzdWNjZXNzb3JzIGFuZCBhbmNlc3RvcnMgd2hlbiBpdHMgYmVpbmcgYWN0aXZhdGVkICovXHJcbiAgICBOT0RFX0FDVElWQVRFID0gXCJub2RlQWN0aXZhdGVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEge0BsaW5rIE5vZGV9LCBpdCdzIHN1Y2Nlc3NvcnMgYW5kIGFuY2VzdG9ycyB3aGVuIGl0cyBiZWluZyBkZWFjdGl2YXRlZCAqL1xyXG4gICAgTk9ERV9ERUFDVElWQVRFID0gXCJub2RlRGVhY3RpdmF0ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSBjaGlsZCB7QGxpbmsgTm9kZX0gYW5kIGl0cyBhbmNlc3RvcnMgYWZ0ZXIgaXQgd2FzIGFwcGVuZGVkIHRvIGEgcGFyZW50ICovXHJcbiAgICBDSElMRF9BUFBFTkQgPSBcImNoaWxkQXBwZW5kXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIGNoaWxkIHtAbGluayBOb2RlfSBhbmQgaXRzIGFuY2VzdG9ycyBqdXN0IGJlZm9yZSBpdHMgYmVpbmcgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgKi9cclxuICAgIENISUxEX1JFTU9WRSA9IFwiY2hpbGRSZW1vdmVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEge0BsaW5rIE11dGFibGV9IHdoZW4gaXQgbXV0YXRlcyAqL1xyXG4gICAgTVVUQVRFID0gXCJtdXRhdGVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIGJ5IGEge0BsaW5rIEdyYXBofSB3aGVuIGl0IG11dGF0ZXMsIHtAbGluayBHcmFwaEluc3RhbmNlfXMgY29ubmVjdGVkIHRvIHRoZSBncmFwaCBsaXN0ZW4gKi9cclxuICAgIE1VVEFURV9HUkFQSCA9IFwibXV0YXRlR3JhcGhcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIGJ5IGEge0BsaW5rIEdyYXBoSW5zdGFuY2V9IHdoZW4gaXQgcmVmbGVjdGVkIHRoZSBtdXRhdGlvbiBvZiB0aGUge0BsaW5rIEdyYXBofSBpdCdzIGNvbm5lY3RlZCB0byAqL1xyXG4gICAgTVVUQVRFX0lOU1RBTkNFID0gXCJtdXRhdGVHcmFwaERvbmVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBWaWV3cG9ydH0gd2hlbiBpdCBnZXRzIHRoZSBmb2N1cyB0byByZWNlaXZlIGtleWJvYXJkIGlucHV0ICovXHJcbiAgICBGT0NVU19JTiA9IFwiZm9jdXNpblwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFZpZXdwb3J0fSB3aGVuIGl0IGxvc2VzIHRoZSBmb2N1cyB0byByZWNlaXZlIGtleWJvYXJkIGlucHV0ICovXHJcbiAgICBGT0NVU19PVVQgPSBcImZvY3Vzb3V0XCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgTm9kZX0gd2hlbiBpdCdzIGRvbmUgc2VyaWFsaXppbmcgKi9cclxuICAgIE5PREVfU0VSSUFMSVpFRCA9IFwibm9kZVNlcmlhbGl6ZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBOb2RlfSBhbmQgYWxsIGl0cyB7QGxpbmsgQ29tcG9uZW50fXMgd2hlbiBpdCdzIGRvbmUgZGVzZXJpYWxpemluZywgc28gYWxsIGNvbXBvbmVudHMsIGNoaWxkcmVuIGFuZCBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgKi9cclxuICAgIE5PREVfREVTRVJJQUxJWkVEID0gXCJub2RlRGVzZXJpYWxpemVkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgR3JhcGhJbnN0YW5jZX0gd2hlbiBpdCdzIGNvbnRlbnQgaXMgc2V0IGFjY29yZGluZyB0byBhIHNlcmlhbGl6YXRpb24gb2YgYSB7QGxpbmsgR3JhcGh9LiBCcm9hZGNhc3RlZCwgc28gbmVlZHMgdG8gYmUgY2F1Z2h0IGluIGNhcHR1cmUuICovXHJcbiAgICBHUkFQSF9JTlNUQU5USUFURUQgPSBcImdyYXBoSW5zdGFudGlhdGVkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIHtAbGluayBHcmFwaH0gd2hlbiBpdCdzIGZpbmlzaGVkIGRlc2VyaWFsaXppbmcuIEJyb2FkY2FzdGVkLCBzbyBuZWVkcyB0byBiZSBjYXVnaHQgaW4gY2FwdHVyZS4gKi9cclxuICAgIEdSQVBIX0RFU0VSSUFMSVpFRCA9IFwiZ3JhcGhEZXNlcmlhbGl6ZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIGJ5IGEge0BsaW5rIEdyYXBofSB3aGVuIGl0IGFuZCBpdHMgY29ubmVjdGVkIGluc3RhbmNlcyBoYXZlIGZpbmlzaGVkIG11dGF0aW5nICAqL1xyXG4gICAgR1JBUEhfTVVUQVRFRCA9IFwiZ3JhcGhNdXRhdGVkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgVGltZX0gd2hlbiBpdCdzIHNjYWxpbmcgY2hhbmdlZCAgKi9cclxuICAgIFRJTUVfU0NBTEVEID0gXCJ0aW1lU2NhbGVkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgRmlsZUlvQnJvd3NlckxvY2FsfSB3aGVuIGEgbGlzdCBvZiBmaWxlcyBoYXMgYmVlbiBsb2FkZWQgICovXHJcbiAgICBGSUxFX0xPQURFRCA9IFwiZmlsZUxvYWRlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIEZpbGVJb0Jyb3dzZXJMb2NhbH0gd2hlbiBhIGxpc3Qgb2YgZmlsZXMgaGFzIGJlZW4gc2F2ZWQgKi9cclxuICAgIEZJTEVfU0FWRUQgPSBcImZpbGVTYXZlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIE5vZGV9IHdoZW4gcmVjYWxjdWxhdGluZyB0cmFuc2Zvcm1zIGZvciByZW5kZXIgKi9cclxuICAgIFJFTkRFUl9QUkVQQVJFID0gXCJyZW5kZXJQcmVwYXJlXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgVmlld3BvcnR9IGFuZCB7QGxpbmsgTm9kZX0gd2hlbiByZWNhbGN1bGF0aW9uIG9mIHRoZSBicmFuY2ggdG8gcmVuZGVyIHN0YXJ0cy4gKi9cclxuICAgIFJFTkRFUl9QUkVQQVJFX1NUQVJUID0gXCJyZW5kZXJQcmVwYXJlU3RhcnRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBWaWV3cG9ydH0gYW5kIHtAbGluayBOb2RlfSB3aGVuIHJlY2FsY3VsYXRpb24gb2YgdGhlIGJyYW5jaCB0byByZW5kZXIgZW5kcy4gVGhlIGJyYW5jaCBkaXNwYXRjaGVzIGJlZm9yZSB0aGUgbGlnaHRzIGFyZSB0cmFuc21pdHRlZCB0byB0aGUgc2hhZGVycyAgKi9cclxuICAgIFJFTkRFUl9QUkVQQVJFX0VORCA9IFwicmVuZGVyUHJlcGFyZUVuZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFZpZXdwb3J0fSBhdCB0aGUgZW5kIG9mIGEgcmVuZGVyZWQgZnJhbWUgcmlnaHQgYmVmb3JlIGl0IGdldHMgZGlzcGxheWVkLiBBdCB0aGlzIHBvaW50IHtAbGluayBHaXptb3N9IGNhbiBzdGlsbCBiZSBkcmF3bi4gKi9cclxuICAgIFJFTkRFUl9FTkQgPSBcInJlbmRlckVuZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIEpvaW50fS1Db21wb25lbnRzIGluIG9yZGVyIHRvIGRpc2Nvbm5lY3QgKi9cclxuICAgIERJU0NPTk5FQ1RfSk9JTlQgPSBcImRpc2Nvbm5lY3RKb2ludFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIE5vZGV9IHdoZW4gaXQgZ2V0cyBhdHRhY2hlZCB0byBhIHZpZXdwb3J0IGZvciByZW5kZXJpbmcuIEJyb2FkY2FzdGVkLCBzbyBuZWVkcyB0byBiZSBjYXVnaHQgaW4gY2FwdHVyZS4gKi9cclxuICAgIEFUVEFDSF9CUkFOQ0ggPSBcImF0dGFjaEJyYW5jaFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFByb2plY3R9IHdoZW4gaXQncyBkb25lIGxvYWRpbmcgcmVzb3VyY2VzIGZyb20gYSB1cmwgKi9cclxuICAgIFJFU09VUkNFU19MT0FERUQgPSBcInJlc291cmNlc0xvYWRlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIENvbXBvbmVudFdhbGtlcn0gYW5kIHtAbGluayBDb21wb25lbnRXYXlwb2ludH0gd2hlbiBhIHtAbGluayBDb21wb25lbnRXYWxrZXJ9IHJlYWNoZXMgYSB7QGxpbmsgV2F5cG9pbnR9IG9yIHtAbGluayBDb21wb25lbnRXYXlwb2ludH0gKi9cclxuICAgIFdBWVBPSU5UX1JFQUNIRUQgPSBcIndheXBvaW50UmVhY2hlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIENvbXBvbmVudFdhbGtlcn0gd2hlbiB0aGUgZmluYWwge0BsaW5rIFdheXBvaW50fSBpbiB0aGUgY3VycmVudCBwYXRoIGhhcyBiZWVuIHJlYWNoZWQgKi9cclxuICAgIFBBVEhJTkdfQ09OQ0xVREVEID0gXCJwYXRoaW5nQ29uY2x1ZGVkXCJcclxuICB9XHJcblxyXG4gIC8qKiBVbmlvbiB0eXBlIG9mIG90aGVyIGV2ZW50IHR5cGVzIHNlcnZpbmcgYXMgYW5ub3RhdGlvbiBmb3IgbGlzdGVuZXJzIGFuZCBoYW5kbGVycyAqL1xyXG4gIGV4cG9ydCB0eXBlIEV2ZW50VW5pZmllZCA9IEV2ZW50IHwgQ3VzdG9tRXZlbnQgfCBFdmVudFBoeXNpY3M7XHJcblxyXG4gIC8qKiBVbmlmaWVkIGxpc3RlbmVyIHR5cGUgZXh0ZW5kaW5nIEV2ZW50TGlzdGVuZXIgYW5kIEV2ZW50TGlzdGVuZXJPYmplY3QgZm9yIEN1c3RvbUV2ZW50IGFuZCBvdGhlcnMgKi9cclxuICBleHBvcnQgdHlwZSBFdmVudExpc3RlbmVyVW5pZmllZCA9XHJcbiAgICAoKF9ldmVudDogRXZlbnQpID0+IHZvaWQpIHxcclxuICAgICgoX2V2ZW50OiBDdXN0b21FdmVudCkgPT4gdm9pZCkgfFxyXG4gICAgKChfZXZlbnQ6IEV2ZW50UGh5c2ljcykgPT4gdm9pZCkgfFxyXG4gICAgKChfZXZlbnQ6IEV2ZW50VGltZXIpID0+IHZvaWQpIHxcclxuICAgIEV2ZW50TGlzdGVuZXIgfFxyXG4gICAgRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdDtcclxuXHJcbiAgLyoqIEV4dGVuZHMgRXZlbnRUYXJnZXQgdG8gd29yayB3aXRoIHtAbGluayBFdmVudExpc3RlbmVyVW5pZmllZH0gYW5kIHtAbGluayBFdmVudFVuaWZpZWR9ICovXHJcbiAgZXhwb3J0IGNsYXNzIEV2ZW50VGFyZ2V0VW5pZmllZCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcclxuICAgIC8qKlxyXG4gICAgICogU2VlIHtAbGluayBFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyfSBmb3IgcmVmZXJlbmNlLiBXb3JrcyB3aXRoIHtAbGluayBFdmVudExpc3RlbmVyVW5pZmllZH0gYW5kIHtAbGluayBFdmVudFVuaWZpZWR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKF90eXBlOiBzdHJpbmcsIF9oYW5kbGVyOiBFdmVudExpc3RlbmVyVW5pZmllZCwgX29wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkIHtcclxuICAgICAgc3VwZXIuYWRkRXZlbnRMaXN0ZW5lcihfdHlwZSwgPEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3Q+X2hhbmRsZXIsIF9vcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlZSB7QGxpbmsgRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcn0gZm9yIHJlZmVyZW5jZS4gV29ya3Mgd2l0aCB7QGxpbmsgRXZlbnRMaXN0ZW5lclVuaWZpZWR9IGFuZCB7QGxpbmsgRXZlbnRVbmlmaWVkfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihfdHlwZTogc3RyaW5nLCBfaGFuZGxlcjogRXZlbnRMaXN0ZW5lclVuaWZpZWQsIF9vcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoX3R5cGUsIDxFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0Pl9oYW5kbGVyLCBfb3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWUge0BsaW5rIEV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnR9IGZvciByZWZlcmVuY2UuIFdvcmtzIHdpdGggd2l0aCB7QGxpbmsgRXZlbnRVbmlmaWVkfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcGF0Y2hFdmVudChfZXZlbnQ6IEV2ZW50VW5pZmllZCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChfZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZSBjbGFzcyBmb3IgRXZlbnRUYXJnZXQgc2luZ2xldG9ucywgd2hpY2ggYXJlIGZpeGVkIGVudGl0aWVzIGluIHRoZSBzdHJ1Y3R1cmUgb2YgRlVER0UsIHN1Y2ggYXMgdGhlIGNvcmUgbG9vcCBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRXZlbnRUYXJnZXRTdGF0aWMgZXh0ZW5kcyBFdmVudFRhcmdldFVuaWZpZWQge1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB0YXJnZXRTdGF0aWM6IEV2ZW50VGFyZ2V0U3RhdGljID0gbmV3IEV2ZW50VGFyZ2V0U3RhdGljKCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHtAbGluayB0YXJnZXRTdGF0aWN9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZEV2ZW50TGlzdGVuZXIoX3R5cGU6IHN0cmluZywgX2hhbmRsZXI6IEV2ZW50TGlzdGVuZXIpOiB2b2lkIHtcclxuICAgICAgRXZlbnRUYXJnZXRTdGF0aWMudGFyZ2V0U3RhdGljLmFkZEV2ZW50TGlzdGVuZXIoX3R5cGUsIF9oYW5kbGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBmcm9tIHtAbGluayB0YXJnZXRTdGF0aWN9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoX3R5cGU6IHN0cmluZywgX2hhbmRsZXI6IEV2ZW50TGlzdGVuZXIpOiB2b2lkIHtcclxuICAgICAgRXZlbnRUYXJnZXRTdGF0aWMudGFyZ2V0U3RhdGljLnJlbW92ZUV2ZW50TGlzdGVuZXIoX3R5cGUsIF9oYW5kbGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BhdGNoIGFuIGV2ZW50IG9uIHtAbGluayB0YXJnZXRTdGF0aWN9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRpc3BhdGNoRXZlbnQoX2V2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICBFdmVudFRhcmdldFN0YXRpYy50YXJnZXRTdGF0aWMuZGlzcGF0Y2hFdmVudChfZXZlbnQpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgZGF0YXR5cGVzIG9mIHRoZSBhdHRyaWJ1dGVzIGEgbXV0YXRvciBhcyBzdHJpbmdzIFxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgIFthdHRyaWJ1dGU6IHN0cmluZ106IHN0cmluZyB8IE9iamVjdDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIGRlc2NyaWJpbmcgYSBtdXRhdG9yLCB3aGljaCBpcyBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIG5hbWVzIG9mIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBNdXRhdG9yIHtcclxuICAgIFthdHRyaWJ1dGU6IHN0cmluZ106IEdlbmVyYWw7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEludGVyZmFjZXMgZGVkaWNhdGVkIGZvciBlYWNoIHB1cnBvc2UuIEV4dHJhIGF0dHJpYnV0ZSBuZWNlc3NhcnkgZm9yIGNvbXBpbGV0aW1lIHR5cGUgY2hlY2tpbmcsIG5vdCBleGlzdGVudCBhdCBydW50aW1lXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBNdXRhdG9yRm9yQW5pbWF0aW9uIGV4dGVuZHMgTXV0YXRvciB7IHJlYWRvbmx5IGZvckFuaW1hdGlvbjogbnVsbCB9XHJcbiAgZXhwb3J0IGludGVyZmFjZSBNdXRhdG9yRm9yVXNlckludGVyZmFjZSBleHRlbmRzIE11dGF0b3IgeyByZWFkb25seSBmb3JVc2VySW50ZXJmYWNlOiBudWxsIH1cclxuICAvLyBleHBvcnQgaW50ZXJmYWNlIE11dGF0b3JGb3JDb21wb25lbnQgZXh0ZW5kcyBNdXRhdG9yIHsgcmVhZG9ubHkgZm9yVXNlckNvbXBvbmVudDogbnVsbDsgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsZWN0IGFwcGxpY2FibGUgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UgYW5kIGNvcGllcyBvZiB0aGVpciB2YWx1ZXMgaW4gYSBNdXRhdG9yLW9iamVjdFxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNdXRhdG9yT2ZBcmJpdHJhcnkoX29iamVjdDogT2JqZWN0KTogTXV0YXRvciB7XHJcbiAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHt9O1xyXG4gICAgbGV0IGF0dHJpYnV0ZXM6IChzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wpW10gPSBSZWZsZWN0Lm93bktleXMoUmVmbGVjdC5nZXRQcm90b3R5cGVPZihfb2JqZWN0KSk7XHJcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xyXG4gICAgICBsZXQgdmFsdWU6IE9iamVjdCA9IFJlZmxlY3QuZ2V0KF9vYmplY3QsIGF0dHJpYnV0ZSk7XHJcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAvLyBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGUpKVxyXG4gICAgICAvLyAgIGNvbnRpbnVlO1xyXG4gICAgICBtdXRhdG9yW2F0dHJpYnV0ZS50b1N0cmluZygpXSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXNlIGNsYXNzIGZvciBhbGwgdHlwZXMgYmVpbmcgbXV0YWJsZSB1c2luZyB7QGxpbmsgTXV0YXRvcn0tb2JqZWN0cywgdGh1cyBwcm92aWRpbmcgYW5kIHVzaW5nIGludGVyZmFjZXMgY3JlYXRlZCBhdCBydW50aW1lLiAgXHJcbiAgICogTXV0YWJsZXMgcHJvdmlkZSBhIHtAbGluayBNdXRhdG9yfSB0aGF0IGlzIGJ1aWxkIGJ5IGNvbGxlY3RpbmcgYWxsIG9iamVjdC1wcm9wZXJ0aWVzIHRoYXQgYXJlIGVpdGhlciBvZiBhIHByaW1pdGl2ZSB0eXBlIG9yIGFnYWluIE11dGFibGUuXHJcbiAgICogU3ViY2xhc3NlcyBjYW4gZWl0aGVyIHJlZHVjZSB0aGUgc3RhbmRhcmQge0BsaW5rIE11dGF0b3J9IGJ1aWx0IGJ5IHRoaXMgYmFzZSBjbGFzcyBieSBkZWxldGluZyBwcm9wZXJ0aWVzIG9yIGltcGxlbWVudCBhbiBpbmRpdmlkdWFsIGdldE11dGF0b3ItbWV0aG9kLlxyXG4gICAqIFRoZSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9mIHRoZSB7QGxpbmsgTXV0YXRvcn0gbXVzdCBtYXRjaCBwdWJsaWMgcHJvcGVydGllcyBvciBnZXR0ZXJzL3NldHRlcnMgb2YgdGhlIG9iamVjdC5cclxuICAgKiBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBpZ25vcmVkIGlmIG5vdCBoYW5kbGVkIGJ5IGFuIG92ZXJyaWRlIG9mIHRoZSBtdXRhdGUtbWV0aG9kIGluIHRoZSBzdWJjbGFzcyBhbmQgdGhyb3cgZXJyb3JzIGluIGFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHVzZXItaW50ZXJmYWNlIGZvciB0aGUgb2JqZWN0LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNdXRhYmxlIGV4dGVuZHMgRXZlbnRUYXJnZXRVbmlmaWVkIHtcclxuICAgIC8qKlxyXG4gICAgICogRGVjb3JhdG9yIGFsbG93cyB0byBhdHRhY2gge0BsaW5rIE11dGFibGV9IGZ1bmN0aW9uYWxpdHkgdG8gZXhpc3RpbmcgY2xhc3Nlcy4gXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgZGVjb3JhdGUoX2NvbnN0cnVjdG9yOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgLy8gICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJ1c2VSZW5kZXJEYXRhXCIsIHtcclxuICAgIC8vICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TXV0YXRvcih0aGlzOiBNdXRhYmxlRm9yVXNlckludGVyZmFjZSk6IE11dGF0b3Ige1xyXG4gICAgLy8gICAgICAgcmV0dXJuIGdldE11dGF0b3JPZkFyYml0cmFyeSh0aGlzKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TXV0YXRvckZyb21QYXRoKF9tdXRhdG9yOiBNdXRhdG9yLCBfcGF0aDogc3RyaW5nW10pOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IGtleTogc3RyaW5nID0gX3BhdGhbMF07XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge307XHJcbiAgICAgIGlmIChfbXV0YXRvcltrZXldID09IHVuZGVmaW5lZCkgLy8gaWYgdGhlIHBhdGggZGV2aWF0ZXMgZnJvbSBtdXRhdG9yIHN0cnVjdHVyZSwgcmV0dXJuIHRoZSBtdXRhdG9yXHJcbiAgICAgICAgcmV0dXJuIF9tdXRhdG9yO1xyXG4gICAgICBtdXRhdG9yW2tleV0gPSBfbXV0YXRvcltrZXldO1xyXG4gICAgICBpZiAoX3BhdGgubGVuZ3RoID4gMSlcclxuICAgICAgICBtdXRhdG9yW2tleV0gPSBNdXRhYmxlLmdldE11dGF0b3JGcm9tUGF0aChtdXRhdG9yW2tleV0sIF9wYXRoLnNsaWNlKDEsIF9wYXRoLmxlbmd0aCkpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgdHlwZSBvZiB0aGlzIG11dGFibGUgc3ViY2xhc3MgYXMgdGhlIG5hbWUgb2YgdGhlIHJ1bnRpbWUgY2xhc3NcclxuICAgICAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIHRoZSBtdXRhYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0IGFwcGxpY2FibGUgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UgYW5kIGNvcGllcyBvZiB0aGVpciB2YWx1ZXMgaW4gYSBNdXRhdG9yLW9iamVjdC5cclxuICAgICAqIEJ5IGRlZmF1bHQsIGEgbXV0YXRvciBjYW5ub3QgYmUgZXh0ZW5kZWQsIHNpbmNlIGV4dGVuc2lvbnMgYXJlIG5vdCBhdmFpbGFibGUgaW4gdGhlIG9iamVjdCB0aGUgbXV0YXRvciBiZWxvbmdzIHRvLlxyXG4gICAgICogQSBtdXRhdG9yIG1heSBiZSByZWR1Y2VkIGJ5IHRoZSBkZXNjZW5kYW50cyBvZiB7QGxpbmsgTXV0YWJsZX0gdG8gY29udGFpbiBvbmx5IHRoZSBwcm9wZXJ0aWVzIG5lZWRlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3IoX2V4dGVuZGFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHt9O1xyXG5cclxuICAgICAgLy8gY29sbGVjdCBwcmltaXRpdmUgYW5kIG11dGFibGUgYXR0cmlidXRlc1xyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gdGhpcykge1xyXG4gICAgICAgIGxldCB2YWx1ZTogT2JqZWN0ID0gdGhpc1thdHRyaWJ1dGVdO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmICEodmFsdWUgaW5zdGFuY2VvZiBNdXRhYmxlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTXV0YWJsZUFycmF5KSAmJiAhKHZhbHVlLmhhc093blByb3BlcnR5KFwiaWRSZXNvdXJjZVwiKSkpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICBtdXRhdG9yW2F0dHJpYnV0ZV0gPSB0aGlzW2F0dHJpYnV0ZV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghX2V4dGVuZGFibGUpXHJcbiAgICAgICAgLy8gbXV0YXRvciBjYW4gYmUgcmVkdWNlZCBidXQgbm90IGV4dGVuZGVkIVxyXG4gICAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhtdXRhdG9yKTtcclxuICAgICAgLy8gZGVsZXRlIHVud2FudGVkIGF0dHJpYnV0ZXNcclxuICAgICAgdGhpcy5yZWR1Y2VNdXRhdG9yKG11dGF0b3IpO1xyXG5cclxuICAgICAgLy8gcmVwbGFjZSByZWZlcmVuY2VzIHRvIG11dGFibGUgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbXV0YXRvcnNcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIG11dGF0b3IpIHtcclxuICAgICAgICBsZXQgdmFsdWU6IE9iamVjdCA9IG11dGF0b3JbYXR0cmlidXRlXTtcclxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNdXRhYmxlKVxyXG4gICAgICAgICAgbXV0YXRvclthdHRyaWJ1dGVdID0gdmFsdWUuZ2V0TXV0YXRvcigpO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGVBcnJheSlcclxuICAgICAgICAgIG11dGF0b3JbYXR0cmlidXRlXSA9IHZhbHVlLm1hcCgoX3ZhbHVlKSA9PiBfdmFsdWUuZ2V0TXV0YXRvcigpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZSBhbmQgdGhlaXIgdmFsdWVzIGFwcGxpY2FibGUgZm9yIGFuaW1hdGlvbi5cclxuICAgICAqIEJhc2ljIGZ1bmN0aW9uYWxpdHkgaXMgaWRlbnRpY2FsIHRvIHtAbGluayBnZXRNdXRhdG9yfSwgcmV0dXJuZWQgbXV0YXRvciBzaG91bGQgdGhlbiBiZSByZWR1Y2VkIGJ5IHRoZSBzdWJjbGFzc2VkIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yRm9yQW5pbWF0aW9uKCk6IE11dGF0b3JGb3JBbmltYXRpb24ge1xyXG4gICAgICByZXR1cm4gPE11dGF0b3JGb3JBbmltYXRpb24+dGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbGxlY3QgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlIGFuZCB0aGVpciB2YWx1ZXMgYXBwbGljYWJsZSBmb3IgdGhlIHVzZXIgaW50ZXJmYWNlLlxyXG4gICAgICogQmFzaWMgZnVuY3Rpb25hbGl0eSBpcyBpZGVudGljYWwgdG8ge0BsaW5rIGdldE11dGF0b3J9LCByZXR1cm5lZCBtdXRhdG9yIHNob3VsZCB0aGVuIGJlIHJlZHVjZWQgYnkgdGhlIHN1YmNsYXNzZWQgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlKCk6IE11dGF0b3JGb3JVc2VySW50ZXJmYWNlIHtcclxuICAgICAgcmV0dXJuIDxNdXRhdG9yRm9yVXNlckludGVyZmFjZT50aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29sbGVjdCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UgYW5kIHRoZWlyIHZhbHVlcyBhcHBsaWNhYmxlIGZvciBpbmRpdml1YWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBCYXNpYyBmdW5jdGlvbmFsaXR5IGlzIGlkZW50aWNhbCB0byB7QGxpbmsgZ2V0TXV0YXRvcn0sIHJldHVybmVkIG11dGF0b3Igc2hvdWxkIHRoZW4gYmUgcmVkdWNlZCBieSB0aGUgc3ViY2xhc3NlZCBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvckZvckNvbXBvbmVudCgpOiBNdXRhdG9yRm9yQ29tcG9uZW50IHtcclxuICAgIC8vICAgICByZXR1cm4gPE11dGF0b3JGb3JDb21wb25lbnQ+dGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAvLyB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGUgc2FtZSBhdHRyaWJ1dGVzIGFzIHRoZSBnaXZlbiBtdXRhdG9yLCBidXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB0eXBlcyBhcyBzdHJpbmctdmFsdWVzXHJcbiAgICAgKiBEb2VzIG5vdCByZWN1cnNlIGludG8gb2JqZWN0cyFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBfbXV0YXRvcikge1xyXG4gICAgICAgIGxldCB0eXBlOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgIGxldCB2YWx1ZTogbnVtYmVyIHwgYm9vbGVhbiB8IHN0cmluZyB8IG9iamVjdCA9IF9tdXRhdG9yW2F0dHJpYnV0ZV07XHJcbiAgICAgICAgaWYgKF9tdXRhdG9yW2F0dHJpYnV0ZV0gIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09IFwib2JqZWN0XCIpXHJcbiAgICAgICAgICAgIHR5cGUgPSAoPEdlbmVyYWw+dGhpcylbYXR0cmlidXRlXS5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgICAgICAgZWxzZSBpZiAodHlwZW9mICh2YWx1ZSkgPT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgICAgICB0eXBlID0gdmFsdWVbXCJuYW1lXCJdO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0eXBlID0gX211dGF0b3JbYXR0cmlidXRlXS5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgICAgIHR5cGVzW2F0dHJpYnV0ZV0gPSB0eXBlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBtdXRhdG9yIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW5zdGFuY2VcclxuICAgICAqIEBwYXJhbSBfbXV0YXRvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIF9tdXRhdG9yKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBPYmplY3QgPSBfbXV0YXRvclthdHRyaWJ1dGVdO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGUpXHJcbiAgICAgICAgICBfbXV0YXRvclthdHRyaWJ1dGVdID0gdmFsdWUuZ2V0TXV0YXRvcigpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIF9tdXRhdG9yW2F0dHJpYnV0ZV0gPSAoPEdlbmVyYWw+dGhpcylbYXR0cmlidXRlXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSBhY2NvcmRpbmcgdG8gdGhlIHN0YXRlIG9mIHRoZSBtdXRhdG9yLlxyXG4gICAgICogVGhlIG11dGF0aW9uIG1heSBiZSByZXN0cmljdGVkIHRvIGEgc3Vic2V0IG9mIHRoZSBtdXRhdG9yIGFuZCB0aGUgZXZlbnQgZGlzcGF0Y2hpbmcgc3VwcHJlc3NlZC5cclxuICAgICAqIFVzZXMgbXV0YXRlQmFzZSwgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBpbiBzdWJjbGFzc2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCB0aGlzLm11dGF0ZUJhc2UoX211dGF0b3IsIF9zZWxlY3Rpb24pO1xyXG4gICAgICBpZiAoX2Rpc3BhdGNoTXV0YXRlKVxyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuTVVUQVRFLCB7IGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBtdXRhdG9yOiBfbXV0YXRvciB9IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJhc2UgbWV0aG9kIGZvciBtdXRhdGlvbiwgYWx3YXlzIGF2YWlsYWJsZSB0byBzdWJjbGFzc2VzLiBEbyBub3Qgb3ZlcndyaXRlIGluIHN1YmNsYXNzZXMhXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhc3luYyBtdXRhdGVCYXNlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uPzogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7fTtcclxuICAgICAgaWYgKCFfc2VsZWN0aW9uKVxyXG4gICAgICAgIG11dGF0b3IgPSBfbXV0YXRvcjtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBfc2VsZWN0aW9uKSAvLyByZWR1Y2UgdGhlIG11dGF0b3IgdG8gdGhlIHNlbGVjdGlvblxyXG4gICAgICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3JbYXR0cmlidXRlXSkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgICAgIG11dGF0b3JbYXR0cmlidXRlXSA9IF9tdXRhdG9yW2F0dHJpYnV0ZV07XHJcblxyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gbXV0YXRvcikge1xyXG4gICAgICAgIGlmICghUmVmbGVjdC5oYXModGhpcywgYXR0cmlidXRlKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGxldCBtdXRhbnQ6IE9iamVjdCA9IFJlZmxlY3QuZ2V0KHRoaXMsIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBNdXRhdG9yID0gPE11dGF0b3I+bXV0YXRvclthdHRyaWJ1dGVdO1xyXG4gICAgICAgIGlmIChtdXRhbnQgaW5zdGFuY2VvZiBNdXRhYmxlQXJyYXkgfHwgbXV0YW50IGluc3RhbmNlb2YgTXV0YWJsZSlcclxuICAgICAgICAgIGF3YWl0IG11dGFudC5tdXRhdGUodmFsdWUsIG51bGwsIGZhbHNlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBSZWZsZWN0LnNldCh0aGlzLCBhdHRyaWJ1dGUsIHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWR1Y2VzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBnZW5lcmFsIG11dGF0b3IgYWNjb3JkaW5nIHRvIGRlc2lyZWQgb3B0aW9ucyBmb3IgbXV0YXRpb24uIFRvIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXNcclxuICAgICAqIEBwYXJhbSBfbXV0YXRvciBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkO1xyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGV4cG9ydCB0eXBlIEdlbmVyYWwgPSBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIG5lZWRlZCB0byByZWNyZWF0ZSBhbiBvYmplY3QgaWRlbnRpY2FsIHRvIHRoZSBvbmUgaXQgb3JpZ2luYXRlZCBmcm9tLiBcclxuICAgKiBBIHNlcmlhbGl6YXRpb24gaXMgdXNlZCB0byBjcmVhdGUgY29waWVzIG9mIGV4aXN0aW5nIG9iamVjdHMgYXQgcnVudGltZSBvciB0byBzdG9yZSBvYmplY3RzIGFzIHN0cmluZ3Mgb3IgcmVjcmVhdGUgdGhlbS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YXRpb24ge1xyXG4gICAgW3R5cGU6IHN0cmluZ106IEdlbmVyYWw7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZSB7XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgU2VyaWFsaXphdGlvbn0gb2YgdGhpcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uO1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNyZWF0ZXMgdGhpcyBpbnN0YW5jZSBvZiB7QGxpbmsgU2VyaWFsaXphYmxlfSB3aXRoIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgU2VyaWFsaXphdGlvbn0uXHJcbiAgICAgKi9cclxuICAgIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+O1xyXG4gIH1cclxuXHJcbiAgaW50ZXJmYWNlIE5hbWVzcGFjZVJlZ2lzdGVyIHtcclxuICAgIFtuYW1lOiBzdHJpbmddOiBPYmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIHRoZSBleHRlcm5hbCBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gb2Yge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cy4gVGhlIGludGVybmFsIHByb2Nlc3MgaXMgaGFuZGxlZCBieSB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLiAgXHJcbiAgICogQSB7QGxpbmsgU2VyaWFsaXphdGlvbn0gb2JqZWN0IGNhbiBiZSBjcmVhdGVkIGZyb20gYSB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3QgYW5kIGEgSlNPTi1TdHJpbmcgbWF5IGJlIGNyZWF0ZWQgZnJvbSB0aGF0LiAgXHJcbiAgICogVmljZSB2ZXJzYSwgYSBKU09OLVN0cmluZyBjYW4gYmUgcGFyc2VkIHRvIGEge0BsaW5rIFNlcmlhbGl6YXRpb259IHdoaWNoIGNhbiBiZSBkZXNlcmlhbGl6ZWQgdG8gYSB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3QuXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICBbU2VyaWFsaXphYmxlXSDihpIgKHNlcmlhbGl6ZSkg4oaSIFtTZXJpYWxpemF0aW9uXSDihpIgKHN0cmluZ2lmeSkg4oaSIFtTdHJpbmddIOKGkiAoc2F2ZSBvciBzZW5kKVxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkyAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpMgICAgICAgICAgICAgICAgICDihpMgICAgICAgICBcclxuICAgKiAgICAgICAgICAgICAgICBbU2VyaWFsaXphYmxlXSDihpAgKGRlc2VyaWFsaXplKSDihpAgW1NlcmlhbGl6YXRpb25dIOKGkCAocGFyc2UpIOKGkCAobG9hZCkg4oaQIFtNZWRpdW1dXHJcbiAgICogYGBgICAgICAgXHJcbiAgICogV2hpbGUgdGhlIGludGVybmFsIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBtZXRob2QxcyBvZiB0aGUgb2JqZWN0cyBjYXJlIG9mIHRoZSBzZWxlY3Rpb24gb2YgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHJlY3JlYXRlIHRoZSBvYmplY3QgYW5kIGl0cyBzdHJ1Y3R1cmUsICBcclxuICAgKiB0aGUge0BsaW5rIFNlcmlhbGl6ZXJ9IGtlZXBzIHRyYWNrIG9mIHRoZSBuYW1lc3BhY2VzIGFuZCBjbGFzc2VzIGluIG9yZGVyIHRvIHJlY3JlYXRlIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMuIFRoZSBnZW5lcmFsIHN0cnVjdHVyZSBvZiBhIHtAbGluayBTZXJpYWxpemF0aW9ufSBpcyBhcyBmb2xsb3dzICBcclxuICAgKiBgYGB0ZXh0XHJcbiAgICoge1xyXG4gICAqICAgICAgbmFtZXNwYWNlTmFtZS5jbGFzc05hbWU6IHtcclxuICAgKiAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5VmFsdWUsXHJcbiAgICogICAgICAgICAgLi4uLFxyXG4gICAqICAgICAgICAgIHByb3BlcnR5TmFtZU9mUmVmZXJlbmNlOiBTZXJpYWxpemF0aW9uT2ZUaGVSZWZlcmVuY2VkT2JqZWN0LFxyXG4gICAqICAgICAgICAgIC4uLixcclxuICAgKiAgICAgICAgICBjb25zdHJ1Y3Rvck5hbWVPZlN1cGVyY2xhc3M6IFNlcmlhbGl6YXRpb25PZlN1cGVyQ2xhc3NcclxuICAgKiAgICAgIH1cclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICogU2luY2UgdGhlIGluc3RhbmNlIG9mIHRoZSBzdXBlcmNsYXNzIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkLCBcclxuICAgKiB0aGUgU2VyaWFsaXphdGlvbk9mU3VwZXJDbGFzcyBvbWl0cyB0aGUgdGhlIG5hbWVzcGFjZU5hbWUuY2xhc3NOYW1lIGtleSBhbmQgY29uc2lzdHMgb25seSBvZiBpdHMgdmFsdWUuIFxyXG4gICAqIFRoZSBjb25zdHJ1Y3Rvck5hbWVPZlN1cGVyY2xhc3MgaXMgZ2l2ZW4gaW5zdGVhZCBhcyBhIHByb3BlcnR5IG5hbWUgaW4gdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlIHN1YmNsYXNzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTZXJpYWxpemVyIHtcclxuICAgIC8qKiBJbiBvcmRlciBmb3IgdGhlIFNlcmlhbGl6ZXIgdG8gY3JlYXRlIGNsYXNzIGluc3RhbmNlcywgaXQgbmVlZHMgYWNjZXNzIHRvIHRoZSBhcHByb3ByaWF0ZSBuYW1lc3BhY2VzICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBuYW1lc3BhY2VzOiBOYW1lc3BhY2VSZWdpc3RlciA9IHsgXCLGklwiOiBGdWRnZUNvcmUgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVycyBhIG5hbWVzcGFjZSB0byB0aGUge0BsaW5rIFNlcmlhbGl6ZXJ9LCB0byBlbmFibGUgYXV0b21hdGljIGluc3RhbnRpYXRpb24gb2YgY2xhc3NlcyBkZWZpbmVkIHdpdGhpblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyTmFtZXNwYWNlKF9uYW1lc3BhY2U6IE9iamVjdCk6IHN0cmluZyB7XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gU2VyaWFsaXplci5uYW1lc3BhY2VzKVxyXG4gICAgICAgIGlmIChTZXJpYWxpemVyLm5hbWVzcGFjZXNbbmFtZV0gPT0gX25hbWVzcGFjZSlcclxuICAgICAgICAgIHJldHVybiBuYW1lO1xyXG5cclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IFNlcmlhbGl6ZXIuZmluZE5hbWVzcGFjZUluKF9uYW1lc3BhY2UsIHdpbmRvdyk7XHJcbiAgICAgIGlmICghbmFtZSlcclxuICAgICAgICBmb3IgKGxldCBwYXJlbnROYW1lIGluIFNlcmlhbGl6ZXIubmFtZXNwYWNlcykge1xyXG4gICAgICAgICAgbmFtZSA9IFNlcmlhbGl6ZXIuZmluZE5hbWVzcGFjZUluKF9uYW1lc3BhY2UsIFNlcmlhbGl6ZXIubmFtZXNwYWNlc1twYXJlbnROYW1lXSk7XHJcbiAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICBuYW1lID0gcGFyZW50TmFtZSArIFwiLlwiICsgbmFtZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFuYW1lKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5hbWVzcGFjZSBub3QgZm91bmQuIE1heWJlIHBhcmVudCBuYW1lc3BhY2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmU/XCIpO1xyXG5cclxuICAgICAgU2VyaWFsaXplci5uYW1lc3BhY2VzW25hbWVdID0gX25hbWVzcGFjZTtcclxuICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGphdmFzY3JpcHQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXphYmxlIEZVREdFLW9iamVjdCBnaXZlbixcclxuICAgICAqIGluY2x1ZGluZyBhdHRhY2hlZCBjb21wb25lbnRzLCBjaGlsZHJlbiwgc3VwZXJjbGFzcy1vYmplY3RzIGFsbCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHJlY29uc3RydWN0aW9uXHJcbiAgICAgKiBAcGFyYW0gX29iamVjdCBBbiBvYmplY3QgdG8gc2VyaWFsaXplLCBpbXBsZW1lbnRpbmcgdGhlIHtAbGluayBTZXJpYWxpemFibGV9IGludGVyZmFjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShfb2JqZWN0OiBTZXJpYWxpemFibGUpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgLy8gVE9ETzogc2F2ZSB0aGUgbmFtZXNwYWNlIHdpdGggdGhlIGNvbnN0cnVjdG9ycyBuYW1lXHJcbiAgICAgIC8vIHNlcmlhbGl6YXRpb25bX29iamVjdC5jb25zdHJ1Y3Rvci5uYW1lXSA9IF9vYmplY3Quc2VyaWFsaXplKCk7XHJcbiAgICAgIGxldCBwYXRoOiBzdHJpbmcgPSB0aGlzLmdldEZ1bGxQYXRoKF9vYmplY3QpO1xyXG4gICAgICBpZiAoIXBhdGgpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOYW1lc3BhY2Ugb2Ygc2VyaWFsaXphYmxlIG9iamVjdCBvZiB0eXBlICR7X29iamVjdC5jb25zdHJ1Y3Rvci5uYW1lfSBub3QgZm91bmQuIE1heWJlIHRoZSBuYW1lc3BhY2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBvciB0aGUgY2xhc3Mgbm90IGV4cG9ydGVkP2ApO1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3BhdGhdID0gX29iamVjdC5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICAgIC8vIHJldHVybiBfb2JqZWN0LnNlcmlhbGl6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIEZVREdFLW9iamVjdCByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSB7QGxpbmsgU2VyaWFsaXphdGlvbn0gZ2l2ZW4sXHJcbiAgICAgKiBpbmNsdWRpbmcgYXR0YWNoZWQgY29tcG9uZW50cywgY2hpbGRyZW4sIHN1cGVyY2xhc3Mtb2JqZWN0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgbGV0IHJlY29uc3RydWN0OiBTZXJpYWxpemFibGU7XHJcbiAgICAgIGxldCBwYXRoOiBzdHJpbmc7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gbG9vcCBjb25zdHJ1Y3RlZCBzb2xlbHkgdG8gYWNjZXNzIHR5cGUtcHJvcGVydHkuIE9ubHkgb25lIGV4cGVjdGVkIVxyXG4gICAgICAgIGZvciAocGF0aCBpbiBfc2VyaWFsaXphdGlvbikge1xyXG4gICAgICAgICAgcmVjb25zdHJ1Y3QgPSBTZXJpYWxpemVyLnJlY29uc3RydWN0KHBhdGgpO1xyXG4gICAgICAgICAgcmVjb25zdHJ1Y3QgPSBhd2FpdCByZWNvbnN0cnVjdC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltwYXRoXSk7XHJcbiAgICAgICAgICByZXR1cm4gcmVjb25zdHJ1Y3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICBsZXQgbWVzc2FnZTogc3RyaW5nID0gYERlc2VyaWFsaXphdGlvbiBvZiAke3BhdGh9LCAke3JlY29uc3RydWN0ID8gUmVmbGVjdC5nZXQocmVjb25zdHJ1Y3QsIFwiaWRSZXNvdXJjZVwiKSA6IFwiXCJ9IGZhaWxlZDogYCArIF9lcnJvcjtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIEFycmF5IG9mIGphdmFzY3JpcHQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXphYmxlIEZVREdFLW9iamVjdHMgZ2l2ZW4gaW4gdGhlIGFycmF5LFxyXG4gICAgICogaW5jbHVkaW5nIGF0dGFjaGVkIGNvbXBvbmVudHMsIGNoaWxkcmVuLCBzdXBlcmNsYXNzLW9iamVjdHMgYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgcmVjb25zdHJ1Y3Rpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVBcnJheTxUIGV4dGVuZHMgU2VyaWFsaXphYmxlPihfdHlwZTogbmV3ICgpID0+IFQsIF9vYmplY3RzOiBTZXJpYWxpemFibGVbXSk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbnM6IFNlcmlhbGl6YXRpb25bXSA9IFtdO1xyXG4gICAgICBsZXQgcGF0aDogc3RyaW5nID0gdGhpcy5nZXRGdWxsUGF0aChuZXcgX3R5cGUoKSk7XHJcbiAgICAgIGlmICghcGF0aClcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5hbWVzcGFjZSBvZiBzZXJpYWxpemFibGUgb2JqZWN0IG9mIHR5cGUgJHtfdHlwZS5uYW1lfSBub3QgZm91bmQuIE1heWJlIHRoZSBuYW1lc3BhY2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBvciB0aGUgY2xhc3Mgbm90IGV4cG9ydGVkP2ApO1xyXG5cclxuICAgICAgZm9yIChsZXQgb2JqZWN0IG9mIF9vYmplY3RzKVxyXG4gICAgICAgIHNlcmlhbGl6YXRpb25zLnB1c2gob2JqZWN0LnNlcmlhbGl6ZSgpKTtcclxuXHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge307XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bcGF0aF0gPSBzZXJpYWxpemF0aW9ucztcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIEFycmF5IG9mIEZVREdFLW9iamVjdHMgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgYXJyYXkgb2Yge0BsaW5rIFNlcmlhbGl6YXRpb259cyBnaXZlbixcclxuICAgICAqIGluY2x1ZGluZyBhdHRhY2hlZCBjb21wb25lbnRzLCBjaGlsZHJlbiwgc3VwZXJjbGFzcy1vYmplY3RzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZGVzZXJpYWxpemVBcnJheShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlW10+IHtcclxuICAgICAgbGV0IHNlcmlhbGl6YWJsZXM6IFNlcmlhbGl6YWJsZVtdID0gW107XHJcbiAgICAgIGxldCBjb25zdHJ1Y3Q6IG5ldyAoKSA9PiBTZXJpYWxpemFibGU7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uczogU2VyaWFsaXphdGlvbltdID0gW107XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gbG9vcCBjb25zdHJ1Y3RlZCBzb2xlbHkgdG8gYWNjZXNzIHR5cGUtcHJvcGVydHkuIE9ubHkgb25lIGV4cGVjdGVkIVxyXG4gICAgICAgIGZvciAobGV0IHBhdGggaW4gX3NlcmlhbGl6YXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0cnVjdCA9IFNlcmlhbGl6ZXIuZ2V0Q29uc3RydWN0b3IocGF0aCk7XHJcbiAgICAgICAgICBzZXJpYWxpemF0aW9ucyA9IF9zZXJpYWxpemF0aW9uW3BhdGhdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZXNlcmlhbGl6YXRpb24gZmFpbGVkOiBcIiArIF9lcnJvcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IHNlcmlhbGl6YXRpb24gb2Ygc2VyaWFsaXphdGlvbnMpIHtcclxuICAgICAgICBsZXQgc2VyaWFsaXphYmxlOiBTZXJpYWxpemFibGUgPSBuZXcgY29uc3RydWN0KCk7XHJcbiAgICAgICAgYXdhaXQgc2VyaWFsaXphYmxlLmRlc2VyaWFsaXplKHNlcmlhbGl6YXRpb24pO1xyXG4gICAgICAgIHNlcmlhbGl6YWJsZXMucHVzaChzZXJpYWxpemFibGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gc2VyaWFsaXphYmxlcztcclxuICAgIH1cclxuXHJcbiAgICAvL1RPRE86IGltcGxlbWVudCBwcmV0dGlmaWVyIHRvIG1ha2UgSlNPTi1TdHJpbmdpZmljYXRpb24gb2Ygc2VyaWFsaXphdGlvbnMgbW9yZSByZWFkYWJsZSwgZS5nLiBwbGFjaW5nIHgsIHkgYW5kIHogaW4gb25lIGxpbmVcclxuICAgIC8qKlxyXG4gICAgICogUHJldHRpZnkgYSBKU09OLVN0cmluZywgdG8gbWFrZSBpdCBtb3JlIHJlYWRhYmxlLlxyXG4gICAgICogbm90IGltcGxlbWVudGVkIHlldFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHByZXR0aWZ5KF9qc29uOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gX2pzb247IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQsIGh1bWFuIHJlYWRhYmxlIEpTT04tU3RyaW5nLCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHtAbGluayBTZXJpYWxpemF0aW9ufSB0aGF0IG1heSBoYXZlIGJlZW4gY3JlYXRlZCBieSB7QGxpbmsgU2VyaWFsaXplcn0uc2VyaWFsaXplXHJcbiAgICAgKiBAcGFyYW0gX3NlcmlhbGl6YXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzdHJpbmdpZnkoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBzdHJpbmcge1xyXG4gICAgICAvLyBhZGp1c3RtZW50cyB0byBzZXJpYWxpemF0aW9uIGNhbiBiZSBtYWRlIGhlcmUgYmVmb3JlIHN0cmluZ2lmaWNhdGlvbiwgaWYgZGVzaXJlZFxyXG4gICAgICBsZXQganNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoX3NlcmlhbGl6YXRpb24sIG51bGwsIDIpO1xyXG4gICAgICBsZXQgcHJldHR5OiBzdHJpbmcgPSBTZXJpYWxpemVyLnByZXR0aWZ5KGpzb24pO1xyXG4gICAgICByZXR1cm4gcHJldHR5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBTZXJpYWxpemF0aW9ufSBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIEpTT04tU3RyaW5nLiBSZXN1bHQgbWF5IGJlIHBhc3NlZCB0byB7QGxpbmsgU2VyaWFsaXplci5kZXNlcmlhbGl6ZX1cclxuICAgICAqIEBwYXJhbSBfanNvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZShfanNvbjogc3RyaW5nKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKF9qc29uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IG9mIHRoZSBjbGFzcyBkZWZpbmVkIHdpdGggdGhlIGZ1bGwgcGF0aCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZU5hbWUocykgYW5kIHRoZSBjbGFzc05hbWUgc2VwZXJhdGVkIGJ5IGRvdHMoLikgXHJcbiAgICAgKiBAcGFyYW0gX3BhdGggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVjb25zdHJ1Y3QoX3BhdGg6IHN0cmluZyk6IFNlcmlhbGl6YWJsZSB7XHJcbiAgICAgIGxldCBjb25zdHJ1Y3RvcjogbmV3ICgpID0+IFNlcmlhbGl6YWJsZSA9IFNlcmlhbGl6ZXIuZ2V0Q29uc3RydWN0b3IoX3BhdGgpO1xyXG4gICAgICBsZXQgcmVjb25zdHJ1Y3Rpb246IFNlcmlhbGl6YWJsZSA9IG5ldyBjb25zdHJ1Y3RvcigpO1xyXG4gICAgICByZXR1cm4gcmVjb25zdHJ1Y3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBnZXRDb25zdHJ1Y3RvcjxUIGV4dGVuZHMgU2VyaWFsaXphYmxlPihfdHlwZTogc3RyaW5nLCBfbmFtZXNwYWNlOiBPYmplY3QgPSBGdWRnZUNvcmUpOiBuZXcgKCkgPT4gVCB7XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNvbnN0cnVjdG9yIGZyb20gdGhlIGdpdmVuIHBhdGggdG8gYSBjbGFzc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnN0cnVjdG9yPFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KF9wYXRoOiBzdHJpbmcpOiBuZXcgKCkgPT4gVCB7XHJcbiAgICAgIGxldCB0eXBlTmFtZTogc3RyaW5nID0gX3BhdGguc3Vic3RyaW5nKF9wYXRoLmxhc3RJbmRleE9mKFwiLlwiKSArIDEpO1xyXG4gICAgICBsZXQgbmFtZXNwYWNlOiBPYmplY3QgPSBTZXJpYWxpemVyLmdldE5hbWVzcGFjZShfcGF0aCk7XHJcbiAgICAgIGlmICghbmFtZXNwYWNlKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uc3RydWN0b3Igb2Ygc2VyaWFsaXphYmxlIG9iamVjdCBvZiB0eXBlICR7X3BhdGh9IG5vdCBmb3VuZC4gTWF5YmUgdGhlIG5hbWVzcGFjZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkP2ApO1xyXG4gICAgICByZXR1cm4gKDxHZW5lcmFsPm5hbWVzcGFjZSlbdHlwZU5hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0LCBpZiBmb3VuZCBpbiB0aGUgcmVnaXN0ZXJlZCBuYW1lc3BhY2VzXHJcbiAgICAgKiBAcGFyYW0gX29iamVjdCBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RnVsbFBhdGgoX29iamVjdDogU2VyaWFsaXphYmxlKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHR5cGVOYW1lOiBzdHJpbmcgPSBfb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICAgIC8vIERlYnVnLmxvZyhcIlNlYXJjaGluZyBuYW1lc3BhY2Ugb2Y6IFwiICsgdHlwZU5hbWUpO1xyXG4gICAgICBmb3IgKGxldCBuYW1lc3BhY2VOYW1lIGluIFNlcmlhbGl6ZXIubmFtZXNwYWNlcykge1xyXG4gICAgICAgIGxldCBmb3VuZDogR2VuZXJhbCA9ICg8R2VuZXJhbD5TZXJpYWxpemVyLm5hbWVzcGFjZXMpW25hbWVzcGFjZU5hbWVdW3R5cGVOYW1lXTtcclxuICAgICAgICBpZiAoZm91bmQgJiYgX29iamVjdCBpbnN0YW5jZW9mIGZvdW5kKVxyXG4gICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZU5hbWUgKyBcIi5cIiArIHR5cGVOYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlLW9iamVjdCBkZWZpbmVkIHdpdGhpbiB0aGUgZnVsbCBwYXRoLCBpZiByZWdpc3RlcmVkXHJcbiAgICAgKiBAcGFyYW0gX3BhdGhcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0TmFtZXNwYWNlKF9wYXRoOiBzdHJpbmcpOiBPYmplY3Qge1xyXG4gICAgICBsZXQgbmFtZXNwYWNlTmFtZTogc3RyaW5nID0gX3BhdGguc3Vic3RyKDAsIF9wYXRoLmxhc3RJbmRleE9mKFwiLlwiKSk7XHJcbiAgICAgIHJldHVybiBTZXJpYWxpemVyLm5hbWVzcGFjZXNbbmFtZXNwYWNlTmFtZV0gfHwgRnVkZ2VDb3JlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgdGhlIG5hbWVzcGFjZS1vYmplY3QgaW4gcHJvcGVydGllcyBvZiB0aGUgcGFyZW50LW9iamVjdCAoZS5nLiB3aW5kb3cpLCBpZiBwcmVzZW50XHJcbiAgICAgKiBAcGFyYW0gX25hbWVzcGFjZSBcclxuICAgICAqIEBwYXJhbSBfcGFyZW50IFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kTmFtZXNwYWNlSW4oX25hbWVzcGFjZTogT2JqZWN0LCBfcGFyZW50OiBPYmplY3QpOiBzdHJpbmcge1xyXG4gICAgICBmb3IgKGxldCBwcm9wIGluIF9wYXJlbnQpXHJcbiAgICAgICAgaWYgKCg8R2VuZXJhbD5fcGFyZW50KVtwcm9wXSA9PSBfbmFtZXNwYWNlKVxyXG4gICAgICAgICAgcmV0dXJuIHByb3A7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHR5cGUgQ29uc3RydWN0b3I8VD4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IEdlbmVyYWxbXSkgPT4gVDtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyAoYWJzdHJhY3QpIGNsYXNzIGltcGxlbWVudGluZyB7QGxpbmsgU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbH0gZnJvbSBhbnkgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBTZXJpYWxpemFibGVSZXNvdXJjZX0gYnkgbWl4aW5nIGluIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGxvYWQgdGhlIHJlc291cmNlIGZyb20gYW4gZXh0ZXJuYWwgc291cmNlLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBtaXhpblNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWw8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxTZXJpYWxpemFibGVSZXNvdXJjZT4+KF9iYXNlOiBUQmFzZSkgeyAvKiBlc2xpbnQtZGlzYWJsZS1saW5lICovIC8vZGlzYWJsZSBlc2xpbnQgYmVjYXVzZSBvbmx5IHR5cGUgaW5mZXJlbmNlIHNlZW1zIHRvIGJlIGFibGUgdG8gaGFuZGxlIG1peGluIGFic3RyYWN0IGNsYXNzZXMgY29ycmVjdGx5XHJcbiAgICBhYnN0cmFjdCBjbGFzcyBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsIGV4dGVuZHMgX2Jhc2UgaW1wbGVtZW50cyBGdWRnZUNvcmUuU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCB7XHJcbiAgICAgIHB1YmxpYyB1cmw6IFJlcXVlc3RJbmZvO1xyXG5cclxuICAgICAgcHVibGljIHN0YXR1czogUkVTT1VSQ0VfU1RBVFVTID0gUkVTT1VSQ0VfU1RBVFVTLlBFTkRJTkc7XHJcblxyXG4gICAgICAvKipcclxuICAgICAgICogUmV0dXJucyBhIHtAbGluayBTZXJpYWxpemF0aW9ufSBvZiB0aGlzIHJlc291cmNlLiBCeSBkZWZhdWx0IG9ubHkgdGhlIGRhdGEgbmVlZGVkIHRvIGxvYWQgaXQgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlIGlzIHNlcmlhbGl6ZWQgKFwidXJsXCIsIFwibmFtZVwiLCBcImlkUmVzb3VyY2VcIikuIFNldCBfc3VwZXIgdG8gdHJ1ZSB0byBzZXJpYWxpemUgYWxsIGRhdGEuXHJcbiAgICAgICAqL1xyXG4gICAgICBwdWJsaWMgc2VyaWFsaXplKF9zdXBlcjogYm9vbGVhbiA9IGZhbHNlKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IF9zdXBlciA/IHN1cGVyLnNlcmlhbGl6ZSgpIDogeyBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsIG5hbWU6IHRoaXMubmFtZSB9O1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb24udXJsID0gdGhpcy51cmwudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgICB0aGlzLnVybCA9IF9zZXJpYWxpemF0aW9uLnVybDtcclxuICAgICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwdWJsaWMgYWJzdHJhY3QgbG9hZCgpOiBQcm9taXNlPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWw+O1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoX2Jhc2UucHJvdG90eXBlIGluc3RhbmNlb2YgTXV0YWJsZSkge1xyXG4gICAgICAvKipcclxuICAgICAgICogTWl4aW4gdGhlIHtAbGluayBNdXRhYmxlfSBmdW5jdGlvbmFsaXR5IGludG8gdGhlIGNsYXNzXHJcbiAgICAgICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAgICAgKi9cclxuICAgICAgZnVuY3Rpb24gbWl4aW5NdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwgJiBNdXRhYmxlPj4oX2Jhc2U6IFRCYXNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuICAgICAgICBhYnN0cmFjdCBjbGFzcyBNdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCBleHRlbmRzIF9iYXNlIHtcclxuICAgICAgICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKF9tdXRhdG9yLnVybCAhPSB1bmRlZmluZWQgfHwgX211dGF0b3IubmFtZSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgICAgICAgZGVsZXRlIF9tdXRhdG9yLnN0YXR1cztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBNdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG1peGluTXV0YWJsZVNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwoPFRCYXNlICYgQ29uc3RydWN0b3I8U2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCAmIE11dGFibGU+PlNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsO1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWFwQ2xhc3NUb0NvbXBvbmVudHMge1xyXG4gICAgW2NsYXNzTmFtZTogc3RyaW5nXTogQ29tcG9uZW50W107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgc2NlbmV0cmVlLlxyXG4gICAqIEBhdXRob3JzIEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0dyYXBoXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE5vZGUgZXh0ZW5kcyBFdmVudFRhcmdldFVuaWZpZWQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZzsgLy8gVGhlIG5hbWUgdG8gY2FsbCB0aGlzIG5vZGUgYnkuXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgcHVibGljIHRpbWVzdGFtcFVwZGF0ZTogbnVtYmVyID0gMDtcclxuICAgIC8qKiBUaGUgbnVtYmVyIG9mIG5vZGVzIG9mIHRoZSB3aG9sZSBicmFuY2ggaW5jbHVkaW5nIHRoaXMgbm9kZSBhbmQgYWxsIHN1Y2Nlc3NvcnMgKi9cclxuICAgIHB1YmxpYyBuTm9kZXNJbkJyYW5jaDogbnVtYmVyID0gMDtcclxuICAgIC8qKiBUaGUgcmFkaXVzIG9mIHRoZSBib3VuZGluZyBzcGhlcmUgaW4gd29ybGQgZGltZW5zaW9ucyBlbmNsb3NpbmcgdGhlIGdlb21ldHJ5IG9mIHRoaXMgbm9kZSBhbmQgYWxsIHN1Y2Nlc3NvcnMgaW4gdGhlIGJyYW5jaCAqL1xyXG4gICAgcHVibGljIHJhZGl1czogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIHBhcmVudDogTm9kZSB8IG51bGwgPSBudWxsOyAvLyBUaGUgcGFyZW50IG9mIHRoaXMgbm9kZS5cclxuICAgIHByaXZhdGUgY2hpbGRyZW46IE5vZGVbXSA9IFtdOyAvLyBhcnJheSBvZiBjaGlsZCBub2RlcyBhcHBlbmRlZCB0byB0aGlzIG5vZGUuXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudHM6IE1hcENsYXNzVG9Db21wb25lbnRzID0ge307XHJcbiAgICAvLyBwcml2YXRlIHRhZ3M6IHN0cmluZ1tdID0gW107IC8vIE5hbWVzIG9mIHRhZ3MgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhpcyBub2RlLiAoVE9ETzogQXMgb2YgeWV0IG5vIGZ1bmN0aW9uYWxpdHkpXHJcbiAgICAvLyBwcml2YXRlIGxheWVyczogc3RyaW5nW10gPSBbXTsgLy8gTmFtZXMgb2YgdGhlIGxheWVycyB0aGlzIG5vZGUgaXMgb24uIChUT0RPOiBBcyBvZiB5ZXQgbm8gZnVuY3Rpb25hbGl0eSlcclxuICAgIHByaXZhdGUgbGlzdGVuZXJzOiBNYXBFdmVudFR5cGVUb0xpc3RlbmVyID0ge307XHJcbiAgICBwcml2YXRlIGNhcHR1cmVzOiBNYXBFdmVudFR5cGVUb0xpc3RlbmVyID0ge307XHJcbiAgICBwcml2YXRlIGFjdGl2ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgI210eFdvcmxkSW52ZXJzZVVwZGF0ZWQ6IG51bWJlcjtcclxuICAgICNtdHhXb3JsZEludmVyc2U6IE1hdHJpeDR4NDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgbm9kZSB3aXRoIGEgbmFtZSBhbmQgaW5pdGlhbGl6ZXMgYWxsIGF0dHJpYnV0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIG11dGF0b3ItbGlrZSBwYXRoIHN0cmluZyB0byBnZXQgZnJvbSBvbmUgbm9kZSB0byBhbm90aGVyIG9yIG51bGwgaWYgbm8gcGF0aCBpcyBmb3VuZCBlLmcuOlxyXG4gICAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAgICogXCJub2RlL3BhcmVudC9jaGlsZHJlbi8xL2NvbXBvbmVudHMvQ29tcG9uZW50U2tlbGV0b24vMFwiXHJcbiAgICAgKiBgYGBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQQVRIX0ZST01fVE8oX2Zyb206IE5vZGUgfCBDb21wb25lbnQsIF90bzogTm9kZSB8IENvbXBvbmVudCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICBjb25zdCBmcm9tOiBOb2RlID0gX2Zyb20gaW5zdGFuY2VvZiBDb21wb25lbnQgPyBfZnJvbS5ub2RlIDogX2Zyb207XHJcbiAgICAgIGNvbnN0IHRvOiBOb2RlID0gX3RvIGluc3RhbmNlb2YgQ29tcG9uZW50ID8gX3RvLm5vZGUgOiBfdG87XHJcbiAgICAgIGlmICghZnJvbSB8fCAhdG8pXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAvLyBmaW5kIHBhdGhzIHRvIGxvd2VzdCBjb21tb24gYW5jZXN0b3JcclxuICAgICAgbGV0IHBhdGhGcm9tOiBOb2RlW10gPSBmcm9tLmdldFBhdGgoKTtcclxuICAgICAgbGV0IHBhdGhUbzogTm9kZVtdID0gdG8uZ2V0UGF0aCgpO1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSBudWxsO1xyXG4gICAgICB3aGlsZSAocGF0aEZyb20ubGVuZ3RoICYmIHBhdGhUby5sZW5ndGggJiYgcGF0aEZyb21bMF0gPT0gcGF0aFRvWzBdKSB7XHJcbiAgICAgICAgYW5jZXN0b3IgPSBwYXRoRnJvbS5zaGlmdCgpO1xyXG4gICAgICAgIHBhdGhUby5zaGlmdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHBhdGhUby51bnNoaWZ0KGFuY2VzdG9yKTtcclxuXHJcbiAgICAgIGlmICghYW5jZXN0b3IpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgcmVsYXRpdmUgcGF0aFxyXG4gICAgICBsZXQgcGF0aFRvQW5jZXN0b3I6IHN0cmluZ1tdID0gcGF0aEZyb20ubWFwKF9ub2RlID0+IFwicGFyZW50XCIpOyAvLyBUT0RPOiB1c2UgXCJrZXlvZiBOb2RlXCIgYXMgdHlwZVxyXG4gICAgICBsZXQgcGF0aEZyb21BbmNlc3Rvcjogc3RyaW5nW10gPSBwYXRoVG9cclxuICAgICAgICAuZmxhdE1hcCgoX25vZGUsIF9pbmRleCwgX2FycmF5KSA9PiBbXCJjaGlsZHJlblwiLCBfbm9kZS5maW5kQ2hpbGQoX2FycmF5W19pbmRleCArIDFdKS50b1N0cmluZygpXSlcclxuICAgICAgICAuc2xpY2UoMCwgLTIpO1xyXG5cclxuICAgICAgaWYgKF9mcm9tIGluc3RhbmNlb2YgQ29tcG9uZW50KVxyXG4gICAgICAgIHBhdGhUb0FuY2VzdG9yLnVuc2hpZnQoXCJub2RlXCIpO1xyXG4gICAgICBpZiAoX3RvIGluc3RhbmNlb2YgQ29tcG9uZW50KVxyXG4gICAgICAgIHBhdGhGcm9tQW5jZXN0b3IucHVzaChcImNvbXBvbmVudHNcIiwgX3RvLnR5cGUsIHRvLmNvbXBvbmVudHNbX3RvLnR5cGVdLmluZGV4T2YoX3RvKS50b1N0cmluZygpKTtcclxuXHJcbiAgICAgIHJldHVybiBwYXRoVG9BbmNlc3Rvci5jb25jYXQocGF0aEZyb21BbmNlc3Rvcikuam9pbihcIi9cIik7IC8vIFRPRE86IG9yIG1heWJlIHZhbGlkYXRlIHRoaXMgc3RyaW5nIHdpdGggbm9kZSBhbmQgY29tcG9uZW50IG9iamVjdHM/XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBOb2RlfSBvciB7QGxpbmsgQ29tcG9uZW50fSBmb3VuZCBhdCB0aGUgZ2l2ZW4gcGF0aCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBub2RlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBGSU5EPFQgPSBOb2RlIHwgQ29tcG9uZW50PihfZnJvbTogTm9kZSB8IENvbXBvbmVudCwgX3BhdGg6IHN0cmluZyk6IFQge1xyXG4gICAgICBpZiAoX3BhdGggPT0gXCJcIilcclxuICAgICAgICByZXR1cm4gPFQ+X2Zyb207XHJcblxyXG4gICAgICBsZXQgcGF0aDogc3RyaW5nW10gPSBfcGF0aC5zcGxpdChcIi9cIik7XHJcbiAgICAgIGxldCB0bzogR2VuZXJhbCA9IF9mcm9tO1xyXG5cclxuICAgICAgd2hpbGUgKHBhdGgubGVuZ3RoICYmIHRvKVxyXG4gICAgICAgIHRvID0gUmVmbGVjdC5nZXQodG8sIHBhdGguc2hpZnQoKSk7XHJcblxyXG4gICAgICByZXR1cm4gdG87XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvcnRjdXQgdG8gcmV0cmlldmUgdGhpcyBub2RlcyB7QGxpbmsgQ29tcG9uZW50VHJhbnNmb3JtfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNtcFRyYW5zZm9ybSgpOiBDb21wb25lbnRUcmFuc2Zvcm0ge1xyXG4gICAgICByZXR1cm4gPENvbXBvbmVudFRyYW5zZm9ybT50aGlzLmdldENvbXBvbmVudHMoQ29tcG9uZW50VHJhbnNmb3JtKT8uWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvcnRjdXQgdG8gcmV0cmlldmUgdGhlIGxvY2FsIHtAbGluayBNYXRyaXg0eDR9IGF0dGFjaGVkIHRvIHRoaXMgbm9kZXMge0BsaW5rIENvbXBvbmVudFRyYW5zZm9ybX0gIFxyXG4gICAgICogRmFpbHMgaWYgbm8ge0BsaW5rIENvbXBvbmVudFRyYW5zZm9ybX0gaXMgYXR0YWNoZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhMb2NhbCgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gdGhpcy5jbXBUcmFuc2Zvcm0/Lm10eExvY2FsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbXR4V29ybGRJbnZlcnNlKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhXb3JsZEludmVyc2VVcGRhdGVkICE9IHRoaXMudGltZXN0YW1wVXBkYXRlKVxyXG4gICAgICAgIHRoaXMuI210eFdvcmxkSW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4V29ybGQpO1xyXG5cclxuICAgICAgdGhpcy4jbXR4V29ybGRJbnZlcnNlVXBkYXRlZCA9IHRoaXMudGltZXN0YW1wVXBkYXRlO1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4V29ybGRJbnZlcnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGF0dGFjaGVkIHRvIHRoaXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBuQ2hpbGRyZW4oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdG9yIHlpZWxkaW5nIHRoZSBub2RlIGFuZCBhbGwgZGVjZW5kYW50cyBpbiB0aGUgZ3JhcGggYmVsb3cgZm9yIGl0ZXJhdGlvblxyXG4gICAgICogSW5hY3RpdmUgbm9kZXMgYW5kIHRoZWlyIGRlc2NlbmRhbnRzIGNhbiBiZSBmaWx0ZXJlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgKiBnZXRJdGVyYXRvcihfYWN0aXZlOiBib29sZWFuID0gZmFsc2UpOiBJdGVyYWJsZUl0ZXJhdG9yPE5vZGU+IHtcclxuICAgICAgaWYgKCFfYWN0aXZlIHx8IHRoaXMuaXNBY3RpdmUpIHtcclxuICAgICAgICB5aWVsZCB0aGlzO1xyXG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXHJcbiAgICAgICAgICB5aWVsZCogY2hpbGQuZ2V0SXRlcmF0b3IoX2FjdGl2ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGlzIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgaW4gdGhlIGdyYXBoIGJlbG93XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPE5vZGU+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlcmF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlLSAvIEFjdGl2YXRlIHRoaXMgbm9kZS4gSW5hY3RpdmUgbm9kZXMgd2lsbCBub3QgYmUgcHJvY2Vzc2VkIGJ5IHRoZSByZW5kZXJlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IF9vbjtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChfb24gPyBFVkVOVC5OT0RFX0FDVElWQVRFIDogRVZFTlQuTk9ERV9ERUFDVElWQVRFLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICB0aGlzLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChfb24gPyBFVkVOVC5OT0RFX0FDVElWQVRFIDogRVZFTlQuTk9ERV9ERUFDVElWQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gI3JlZ2lvbiBTY2VuZXRyZWVcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGlzIG5vZGVzIHBhcmVudCBub2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYXJlbnQoKTogTm9kZSB8IG51bGwge1xyXG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFjZXMgYmFjayB0aGUgYW5jZXN0b3JzIG9mIHRoaXMgbm9kZSBhbmQgcmV0dXJucyB0aGUgZmlyc3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFuY2VzdG9yKCk6IE5vZGUgfCBudWxsIHtcclxuICAgICAgbGV0IGFuY2VzdG9yOiBOb2RlID0gdGhpcztcclxuICAgICAgd2hpbGUgKGFuY2VzdG9yLmdldFBhcmVudCgpKVxyXG4gICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50KCk7XHJcbiAgICAgIHJldHVybiBhbmNlc3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNlcyB0aGUgaGllcmFyY2h5IHVwd2FyZHMgdG8gdGhlIGZpcnN0IGFuY2VzdG9yIGFuZCByZXR1cm5zIHRoZSBwYXRoIHRocm91Z2ggdGhlIGdyYXBoIHRvIHRoaXMgbm9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UGF0aCgpOiBOb2RlW10ge1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSB0aGlzO1xyXG4gICAgICBsZXQgcGF0aDogTm9kZVtdID0gW3RoaXNdO1xyXG4gICAgICB3aGlsZSAoYW5jZXN0b3IuZ2V0UGFyZW50KCkpXHJcbiAgICAgICAgcGF0aC51bnNoaWZ0KGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50KCkpO1xyXG4gICAgICByZXR1cm4gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgY2hpbGQgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDaGlsZChfaW5kZXg6IG51bWJlcik6IE5vZGUge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltfaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNsb25lIG9mIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDaGlsZHJlbigpOiBOb2RlW10ge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5zbGljZSgwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVmZXJlbmNlcyB0byBjaGlsZG5vZGVzIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q2hpbGRyZW5CeU5hbWUoX25hbWU6IHN0cmluZyk6IE5vZGVbXSB7XHJcbiAgICAgIGxldCBmb3VuZDogTm9kZVtdID0gW107XHJcbiAgICAgIGZvdW5kID0gdGhpcy5jaGlsZHJlbi5maWx0ZXIoKF9ub2RlOiBOb2RlKSA9PiBfbm9kZS5uYW1lID09IF9uYW1lKTtcclxuICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2ltcGx5IGNhbGxzIHtAbGluayBhZGRDaGlsZH0uIFRoaXMgcmVmZXJlbmNlIGlzIGhlcmUgc29sZWx5IGJlY2F1c2UgYXBwZW5kQ2hpbGQgaXMgdGhlIGVxdWl2YWxlbnQgbWV0aG9kIGluIERPTS5cclxuICAgICAqIFNlZSBhbmQgcHJlZmVyYWJseSB1c2Uge0BsaW5rIGFkZENoaWxkfVxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGFwcGVuZENoaWxkOiAoX2NoaWxkOiBOb2RlKSA9PiB2b2lkID0gdGhpcy5hZGRDaGlsZDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoZSBnaXZlbiByZWZlcmVuY2UgdG8gYSBub2RlIHRvIHRoZSBsaXN0IG9mIGNoaWxkcmVuLCBpZiBub3QgYWxyZWFkeSBpblxyXG4gICAgICogQHRocm93cyBFcnJvciB3aGVuIHRyeWluZyB0byBhZGQgYW4gYW5jZXN0b3Igb2YgdGhpcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZENoaWxkKF9jaGlsZDogTm9kZSk6IHZvaWQ7XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHJlZmVyZW5jZSB0byBhIG5vZGUgdG8gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gYXQgdGhlIGdpdmVuIGluZGV4LiBJZiBpdCBpcyBhbHJlYWR5IGEgY2hpbGQsIGl0IGlzIG1vdmVkIHRvIHRoZSBuZXcgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDaGlsZChfY2hpbGQ6IE5vZGUsIF9pbmRleDogbnVtYmVyKTogdm9pZDtcclxuICAgIHB1YmxpYyBhZGRDaGlsZChfY2hpbGQ6IE5vZGUsIF9pbmRleD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBpZiAodGhpcy5jaGlsZHJlbi5pbmNsdWRlcyhfY2hpbGQpICYmIF9pbmRleCA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgLy8gX25vZGUgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIHRoaXNcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgaW5BdWRpb0dyYXBoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBncmFwaExpc3RlbmVkOiBOb2RlID0gQXVkaW9NYW5hZ2VyLmRlZmF1bHQuZ2V0R3JhcGhMaXN0ZW5pbmdUbygpO1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSB0aGlzO1xyXG4gICAgICB3aGlsZSAoYW5jZXN0b3IpIHtcclxuICAgICAgICBhbmNlc3Rvci50aW1lc3RhbXBVcGRhdGUgPSAwO1xyXG4gICAgICAgIGluQXVkaW9HcmFwaCA9IGluQXVkaW9HcmFwaCB8fCAoYW5jZXN0b3IgPT0gZ3JhcGhMaXN0ZW5lZCk7XHJcbiAgICAgICAgaWYgKGFuY2VzdG9yID09IF9jaGlsZClcclxuICAgICAgICAgIHRocm93IChuZXcgRXJyb3IoXCJDeWNsaWMgcmVmZXJlbmNlIHByb2hpYml0ZWQgaW4gbm9kZSBoaWVyYXJjaHksIGFuY2VzdG9ycyBtdXN0IG5vdCBiZSBhZGRlZCBhcyBjaGlsZHJlblwiKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwcmV2aW91c1BhcmVudDogTm9kZSA9IF9jaGlsZC5wYXJlbnQ7XHJcbiAgICAgIGlmIChwcmV2aW91c1BhcmVudCA9PSB0aGlzICYmIF9pbmRleCA+IHByZXZpb3VzUGFyZW50LmZpbmRDaGlsZChfY2hpbGQpKVxyXG4gICAgICAgIF9pbmRleC0tO1xyXG5cclxuICAgICAgaWYgKHByZXZpb3VzUGFyZW50KVxyXG4gICAgICAgIHByZXZpb3VzUGFyZW50LnJlbW92ZUNoaWxkKF9jaGlsZCk7XHJcblxyXG4gICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShfaW5kZXggPz8gdGhpcy5jaGlsZHJlbi5sZW5ndGgsIDAsIF9jaGlsZCk7XHJcbiAgICAgIF9jaGlsZC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICBfY2hpbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuQ0hJTERfQVBQRU5ELCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICBpZiAoaW5BdWRpb0dyYXBoKVxyXG4gICAgICAgIF9jaGlsZC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5EKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGdpdmUgbm9kZSBmcm9tIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDaGlsZChfY2hpbGQ6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSB0aGlzLmZpbmRDaGlsZChfY2hpbGQpO1xyXG4gICAgICBpZiAoZm91bmQgPCAwKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIF9jaGlsZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5DSElMRF9SRU1PVkUsIHsgYnViYmxlczogdHJ1ZSB9KSk7XHJcbiAgICAgIF9jaGlsZC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlQuTk9ERV9ERUFDVElWQVRFKSk7XHJcbiAgICAgIGlmICh0aGlzLmlzRGVzY2VuZGFudE9mKEF1ZGlvTWFuYWdlci5kZWZhdWx0LmdldEdyYXBoTGlzdGVuaW5nVG8oKSkpXHJcbiAgICAgICAgX2NoaWxkLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVF9BVURJTy5DSElMRF9SRU1PVkUpKTtcclxuICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoZm91bmQsIDEpO1xyXG4gICAgICBfY2hpbGQucGFyZW50ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUFsbENoaWxkcmVuKCk6IHZvaWQge1xyXG4gICAgICB3aGlsZSAodGhpcy5jaGlsZHJlbi5sZW5ndGgpXHJcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmNoaWxkcmVuWzBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9yIC0xIGlmIG5vdCBmb3VuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZENoaWxkKF9zZWFyY2g6IE5vZGUpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5pbmRleE9mKF9zZWFyY2gpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgYSBjaGlsZCBub2RlIHdpdGggYW5vdGhlciwgcHJlc2VydmluZyB0aGUgcG9zaXRpb24gaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlcGxhY2VDaGlsZChfcmVwbGFjZTogTm9kZSwgX3dpdGg6IE5vZGUpOiBib29sZWFuIHtcclxuICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSB0aGlzLmZpbmRDaGlsZChfcmVwbGFjZSk7XHJcbiAgICAgIGlmIChmb3VuZCA8IDApXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgbGV0IHByZXZpb3VzUGFyZW50OiBOb2RlID0gX3dpdGguZ2V0UGFyZW50KCk7XHJcbiAgICAgIGlmIChwcmV2aW91c1BhcmVudClcclxuICAgICAgICBwcmV2aW91c1BhcmVudC5yZW1vdmVDaGlsZChfd2l0aCk7XHJcblxyXG4gICAgICBfcmVwbGFjZS5wYXJlbnQgPSBudWxsO1xyXG4gICAgICB0aGlzLmNoaWxkcmVuW2ZvdW5kXSA9IF93aXRoO1xyXG4gICAgICBfd2l0aC5wYXJlbnQgPSB0aGlzO1xyXG5cclxuICAgICAgX3dpdGguZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuQ0hJTERfQVBQRU5ELCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICBpZiAodGhpcy5pc0Rlc2NlbmRhbnRPZihBdWRpb01hbmFnZXIuZGVmYXVsdC5nZXRHcmFwaExpc3RlbmluZ1RvKCkpKVxyXG4gICAgICAgIF93aXRoLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVF9BVURJTy5DSElMRF9BUFBFTkQpKTtcclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0aW1lc3RhbXAgbWF0Y2hlcyB0aGUgbGFzdCB1cGRhdGUgdGltZXN0YW1wIHRoaXMgbm9kZSB1bmRlcndlbnQsIGVsc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzVXBkYXRlZChfdGltZXN0YW1wVXBkYXRlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuICh0aGlzLnRpbWVzdGFtcFVwZGF0ZSA9PSBfdGltZXN0YW1wVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgZ2l2ZW4gbm9kZSwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgZWxzZSBmYWxzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNEZXNjZW5kYW50T2YoX2FuY2VzdG9yOiBOb2RlKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBub2RlOiBOb2RlID0gdGhpcztcclxuICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPSBfYW5jZXN0b3IpXHJcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50O1xyXG4gICAgICByZXR1cm4gKG5vZGUgIT0gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIGEgTXV0YXRvciBmcm9tIHtAbGluayBBbmltYXRpb259IHRvIGFsbCBpdHMgY29tcG9uZW50cyBhbmQgdHJhbnNmZXJzIGl0IHRvIGl0cyBjaGlsZHJlbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFwcGx5QW5pbWF0aW9uKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGlmIChcImNvbXBvbmVudHNcIiBpbiBfbXV0YXRvcikge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50VHlwZSBpbiBfbXV0YXRvci5jb21wb25lbnRzKSB7XHJcbiAgICAgICAgICBsZXQgY29tcG9uZW50c09mVHlwZTogQ29tcG9uZW50W10gPSB0aGlzLmNvbXBvbmVudHNbY29tcG9uZW50VHlwZV07IC8vIFRPRE86IGFkZCBlcnJvcnMgaWYgbm9kZSBkb2Vzbid0IGNvbnRhaW4gcHJvcGVydHlcclxuICAgICAgICAgIGxldCBtdXRhdG9yc0ZvclR5cGU6IE11dGF0b3JbXSA9IF9tdXRhdG9yLmNvbXBvbmVudHNbY29tcG9uZW50VHlwZV07XHJcbiAgICAgICAgICBpZiAoY29tcG9uZW50c09mVHlwZSAhPSB1bmRlZmluZWQgJiYgbXV0YXRvcnNGb3JUeXBlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gbXV0YXRvcnNGb3JUeXBlKSB7XHJcbiAgICAgICAgICAgICAgY29tcG9uZW50c09mVHlwZVtpXS5tdXRhdGUobXV0YXRvcnNGb3JUeXBlW2ldLCBudWxsLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFwiY2hpbGRyZW5cIiBpbiBfbXV0YXRvcikge1xyXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGROYW1lIGluIF9tdXRhdG9yLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiB0aGlzLmdldENoaWxkcmVuQnlOYW1lKGNoaWxkTmFtZSkpIHtcclxuICAgICAgICAgICAgY2hpbGROb2RlLmFwcGx5QW5pbWF0aW9uKF9tdXRhdG9yLmNoaWxkcmVuW2NoaWxkTmFtZV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vICNyZWdpb24gQ29tcG9uZW50c1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY29tcG9uZW50cyBhdHRhY2hlZCB0byB0aGlzIG5vZGUsIGluZGVwZW5kZW50IG9mIHR5cGUuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QWxsQ29tcG9uZW50cygpOiBDb21wb25lbnRbXSB7XHJcbiAgICAgIGxldCBhbGw6IENvbXBvbmVudFtdID0gW107XHJcbiAgICAgIGZvciAobGV0IHR5cGUgaW4gdGhpcy5jb21wb25lbnRzKSB7XHJcbiAgICAgICAgYWxsID0gYWxsLmNvbmNhdCh0aGlzLmNvbXBvbmVudHNbdHlwZV0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhbGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhlIGxpc3Qgb2YgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gY2xhc3MgYXR0YWNoZWQgdG8gdGhpcyBub2RlLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbXBvbmVudHM8VCBleHRlbmRzIENvbXBvbmVudD4oX2NsYXNzOiBuZXcgKCkgPT4gVCk6IFRbXSB7XHJcbiAgICAgIHJldHVybiA8VFtdPih0aGlzLmNvbXBvbmVudHNbX2NsYXNzLm5hbWVdIHx8IFtdKS5zbGljZSgwKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZmlyc3QgY29tcG9udGVudCBmb3VuZCBvZiB0aGUgZ2l2ZW4gY2xhc3MgYXR0YWNoZWQgdGhpcyBub2RlIG9yIG51bGwsIGlmIGxpc3QgaXMgZW1wdHkgb3IgZG9lc24ndCBleGlzdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50PFQgZXh0ZW5kcyBDb21wb25lbnQ+KF9jbGFzczogbmV3ICgpID0+IFQpOiBUIHtcclxuICAgICAgbGV0IGxpc3Q6IFRbXSA9IDxUW10+dGhpcy5jb21wb25lbnRzW19jbGFzcy5uYW1lXTtcclxuICAgICAgaWYgKGxpc3QpXHJcbiAgICAgICAgcmV0dXJuIGxpc3RbMF07XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0YWNoIHRoZSBnaXZlbiBjb21wb25lbnQgdG8gdGhpcyBub2RlLiBJZGVudGljYWwgdG8ge0BsaW5rIGFkZENvbXBvbmVudH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGF0dGFjaChfY29tcG9uZW50OiBDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgdGhpcy5hZGRDb21wb25lbnQoX2NvbXBvbmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRhY2ggdGhlIGdpdmVuIGNvbXBvbmVudCB0byB0aGlzIG5vZGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZENvbXBvbmVudChfY29tcG9uZW50OiBDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgaWYgKF9jb21wb25lbnQubm9kZSA9PSB0aGlzKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgbGV0IGNtcExpc3Q6IENvbXBvbmVudFtdID0gdGhpcy5jb21wb25lbnRzW19jb21wb25lbnQudHlwZV07XHJcbiAgICAgIGlmIChjbXBMaXN0ID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRzW19jb21wb25lbnQudHlwZV0gPSBbX2NvbXBvbmVudF07XHJcbiAgICAgIGVsc2UgaWYgKGNtcExpc3QubGVuZ3RoICYmIF9jb21wb25lbnQuaXNTaW5nbGV0b24pXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgJHtfY29tcG9uZW50LnR5cGV9IGlzIG1hcmtlZCBzaW5nbGV0b24gYW5kIGNhbid0IGJlIGF0dGFjaGVkLCBubyBtb3JlIHRoYW4gb25lIGFsbG93ZWRgKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGNtcExpc3QucHVzaChfY29tcG9uZW50KTtcclxuXHJcbiAgICAgIF9jb21wb25lbnQuYXR0YWNoVG9Ob2RlKHRoaXMpO1xyXG4gICAgICBfY29tcG9uZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULkNPTVBPTkVOVF9BREQpKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50VG9UYXJnZXRPbmx5KG5ldyBDdXN0b21FdmVudChFVkVOVC5DT01QT05FTlRfQURELCB7IGRldGFpbDogX2NvbXBvbmVudCB9KSk7IC8vIFRPRE86IHNlZSBpZiB0aGlzIGlzIGJlIGZlYXNhYmxlXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRhY2ggdGhlIGdpdmVuIGNvbXBvbmVudCBmcm9tIHRoaXMgbm9kZS4gSWRlbnRpY2FsIHRvIHtAbGluayByZW1vdmVDb21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZXRhY2goX2NvbXBvbmVudDogQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KF9jb21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbGwgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gY2xhc3MgYXR0YWNoZWQgdG8gdGhpcyBub2RlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlQ29tcG9uZW50cyhfY2xhc3M6IG5ldyAoKSA9PiBDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nZXRDb21wb25lbnRzKF9jbGFzcykuZm9yRWFjaChfY29tcG9uZW50ID0+IHRoaXMucmVtb3ZlQ29tcG9uZW50KF9jb21wb25lbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb21wb25lbnQgZnJvbSB0aGUgbm9kZSwgaWYgaXQgd2FzIGF0dGFjaGVkLCBhbmQgc2V0cyBpdHMgcGFyZW50IHRvIG51bGwuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlQ29tcG9uZW50KF9jb21wb25lbnQ6IENvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBjb21wb25lbnRzT2ZUeXBlOiBDb21wb25lbnRbXSA9IHRoaXMuY29tcG9uZW50c1tfY29tcG9uZW50LnR5cGVdO1xyXG4gICAgICAgIGxldCBmb3VuZEF0OiBudW1iZXIgPSBjb21wb25lbnRzT2ZUeXBlLmluZGV4T2YoX2NvbXBvbmVudCk7XHJcbiAgICAgICAgaWYgKGZvdW5kQXQgPCAwKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIF9jb21wb25lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSkpO1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudFRvVGFyZ2V0T25seShuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgeyBkZXRhaWw6IF9jb21wb25lbnQgfSkpOyAvLyBUT0RPOiBzZWUgaWYgdGhpcyB3b3VsZCBiZSBmZWFzYWJsZVxyXG4gICAgICAgIGNvbXBvbmVudHNPZlR5cGUuc3BsaWNlKGZvdW5kQXQsIDEpO1xyXG4gICAgICAgIF9jb21wb25lbnQuYXR0YWNoVG9Ob2RlKG51bGwpO1xyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZW1vdmUgY29tcG9uZW50ICcke19jb21wb25lbnR9J2luIG5vZGUgbmFtZWQgJyR7dGhpcy5uYW1lfSdgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vICNyZWdpb24gU2VyaWFsaXphdGlvblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGFjdGl2ZTogdGhpcy5hY3RpdmVcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGxldCBjb21wb25lbnRzOiBTZXJpYWxpemF0aW9uID0ge307XHJcbiAgICAgIGZvciAobGV0IHR5cGUgaW4gdGhpcy5jb21wb25lbnRzKSB7XHJcbiAgICAgICAgY29tcG9uZW50c1t0eXBlXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHNbdHlwZV0pIHtcclxuICAgICAgICAgIC8vIGNvbXBvbmVudHNbdHlwZV0ucHVzaChjb21wb25lbnQuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgICAgY29tcG9uZW50c1t0eXBlXS5wdXNoKFNlcmlhbGl6ZXIuc2VyaWFsaXplKGNvbXBvbmVudCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzZXJpYWxpemF0aW9uW1wiY29tcG9uZW50c1wiXSA9IGNvbXBvbmVudHM7XHJcblxyXG4gICAgICBsZXQgY2hpbGRyZW46IFNlcmlhbGl6YXRpb25bXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChTZXJpYWxpemVyLnNlcmlhbGl6ZShjaGlsZCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bXCJjaGlsZHJlblwiXSA9IGNoaWxkcmVuO1xyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5OT0RFX1NFUklBTElaRUQpKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgLy8gdGhpcy5wYXJlbnQgPSBpcyBzZXQgd2hlbiB0aGUgbm9kZXMgYXJlIGFkZGVkXHJcblxyXG4gICAgICAvLyBkZXNlcmlhbGl6ZSBjb21wb25lbnRzIGZpcnN0IHNvIHNjcmlwdHMgY2FuIHJlYWN0IHRvIGNoaWxkcmVuIGJlaW5nIGFwcGVuZGVkXHJcbiAgICAgIGZvciAobGV0IHR5cGUgaW4gX3NlcmlhbGl6YXRpb24uY29tcG9uZW50cykge1xyXG4gICAgICAgIGZvciAobGV0IHNlcmlhbGl6ZWRDb21wb25lbnQgb2YgX3NlcmlhbGl6YXRpb24uY29tcG9uZW50c1t0eXBlXSkge1xyXG4gICAgICAgICAgbGV0IGRlc2VyaWFsaXplZENvbXBvbmVudDogQ29tcG9uZW50ID0gPENvbXBvbmVudD5hd2FpdCBTZXJpYWxpemVyLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWRDb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQoZGVzZXJpYWxpemVkQ29tcG9uZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5jaGlsZHJlbilcclxuICAgICAgICBmb3IgKGxldCBzZXJpYWxpemVkQ2hpbGQgb2YgX3NlcmlhbGl6YXRpb24uY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGxldCBkZXNlcmlhbGl6ZWRDaGlsZDogTm9kZSA9IDxOb2RlPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoc2VyaWFsaXplZENoaWxkKTtcclxuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZGVzZXJpYWxpemVkQ2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQpKTtcclxuICAgICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0QWxsQ29tcG9uZW50cygpKVxyXG4gICAgICAgIGNvbXBvbmVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5OT0RFX0RFU0VSSUFMSVpFRCkpO1xyXG5cclxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgaWYgdGhpcyBpcyBhIGdvb2QgaWRlYVxyXG4gICAgICAvLyBjb25zdCBobmRHcmFwaERlc2VyaWFsaXplZDogRXZlbnRMaXN0ZW5lclVuaWZpZWQgPSAoKSA9PiB7XHJcbiAgICAgIC8vICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0QWxsQ29tcG9uZW50cygpKVxyXG4gICAgICAvLyAgICAgY29tcG9uZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgeyBidWJibGVzOiBmYWxzZSB9KSk7XHJcbiAgICAgIC8vICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAvLyAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HUkFQSF9JTlNUQU5USUFURUQsIGhuZEdyYXBoRGVzZXJpYWxpemVkLCB0cnVlKTtcclxuICAgICAgLy8gfTtcclxuICAgICAgLy8gdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAvLyB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR1JBUEhfSU5TVEFOVElBVEVELCBobmRHcmFwaERlc2VyaWFsaXplZCwgdHJ1ZSk7XHJcblxyXG4gICAgICB0aGlzLmFjdGl2YXRlKF9zZXJpYWxpemF0aW9uLmFjdGl2ZSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHN0cmluZyBhcyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9IaWVyYXJjaHlTdHJpbmcoX25vZGU6IE5vZGUgPSBudWxsLCBfbGV2ZWw6IG51bWJlciA9IDApOiBzdHJpbmcge1xyXG4gICAgICAvLyBUT0RPOiByZWZhY3RvciBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5XHJcbiAgICAgIGlmICghX25vZGUpXHJcbiAgICAgICAgX25vZGUgPSB0aGlzO1xyXG5cclxuICAgICAgbGV0IHByZWZpeDogc3RyaW5nID0gXCIrXCIucmVwZWF0KF9sZXZlbCk7XHJcblxyXG4gICAgICBsZXQgb3V0cHV0OiBzdHJpbmcgPSBwcmVmaXggKyBcIiBcIiArIF9ub2RlLm5hbWUgKyBcIiB8IFwiO1xyXG4gICAgICBmb3IgKGxldCB0eXBlIGluIF9ub2RlLmNvbXBvbmVudHMpXHJcbiAgICAgICAgb3V0cHV0ICs9IF9ub2RlLmNvbXBvbmVudHNbdHlwZV0ubGVuZ3RoICsgXCIgXCIgKyB0eXBlLnNwbGl0KFwiQ29tcG9uZW50XCIpLnBvcCgpICsgXCIsIFwiO1xyXG4gICAgICBvdXRwdXQgPSBvdXRwdXQuc2xpY2UoMCwgLTIpICsgXCI8L2JyPlwiO1xyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBfbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgIG91dHB1dCArPSB0aGlzLnRvSGllcmFyY2h5U3RyaW5nKGNoaWxkLCBfbGV2ZWwgKyAxKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vICNyZWdpb24gRXZlbnRzXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUuIFRoZSBnaXZlbiBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBtYXRjaGluZyBldmVudCBpcyBwYXNzZWQgdG8gdGhlIG5vZGUuXHJcbiAgICAgKiBEZXZpYXRpbmcgZnJvbSB0aGUgc3RhbmRhcmQgRXZlbnRUYXJnZXQsIGhlcmUgdGhlIF9oYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiBhbmQgX2NhcHR1cmUgaXMgdGhlIG9ubHkgb3B0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihfdHlwZTogRVZFTlQgfCBzdHJpbmcsIF9oYW5kbGVyOiBFdmVudExpc3RlbmVyVW5pZmllZCwgX2NhcHR1cmU6IGJvb2xlYW4gLyp8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKi8gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICBsZXQgbGlzdExpc3RlbmVyczogTWFwRXZlbnRUeXBlVG9MaXN0ZW5lciA9IF9jYXB0dXJlID8gdGhpcy5jYXB0dXJlcyA6IHRoaXMubGlzdGVuZXJzO1xyXG4gICAgICBpZiAoIWxpc3RMaXN0ZW5lcnNbX3R5cGVdKVxyXG4gICAgICAgIGxpc3RMaXN0ZW5lcnNbX3R5cGVdID0gW107XHJcbiAgICAgIGxpc3RMaXN0ZW5lcnNbX3R5cGVdLnB1c2goX2hhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIG5vZGUuIFRoZSBzaWduYXR1cmUgbXVzdCBtYXRjaCB0aGUgb25lIHVzZWQgd2l0aCBhZGRFdmVudExpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKF90eXBlOiBFVkVOVCB8IHN0cmluZywgX2hhbmRsZXI6IEV2ZW50TGlzdGVuZXJVbmlmaWVkLCBfY2FwdHVyZTogYm9vbGVhbiAvKnwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMqLyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgIGxldCBsaXN0ZW5lcnNGb3JUeXBlOiBFdmVudExpc3RlbmVyVW5pZmllZFtdID0gX2NhcHR1cmUgPyB0aGlzLmNhcHR1cmVzW190eXBlXSA6IHRoaXMubGlzdGVuZXJzW190eXBlXTtcclxuICAgICAgaWYgKGxpc3RlbmVyc0ZvclR5cGUpXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gbGlzdGVuZXJzRm9yVHlwZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcclxuICAgICAgICAgIGlmIChsaXN0ZW5lcnNGb3JUeXBlW2ldID09IF9oYW5kbGVyKVxyXG4gICAgICAgICAgICBsaXN0ZW5lcnNGb3JUeXBlLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGF0Y2hlcyBhIHN5bnRoZXRpYyBldmVudCB0byB0YXJnZXQuIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgdHJ1ZSAoc3RhbmRhcmQ6IHJldHVybiB0cnVlIG9ubHkgaWYgZWl0aGVyIGV2ZW50J3MgY2FuY2VsYWJsZSBhdHRyaWJ1dGUgdmFsdWUgaXMgZmFsc2Ugb3IgaXRzIHByZXZlbnREZWZhdWx0KCkgbWV0aG9kIHdhcyBub3QgaW52b2tlZClcclxuICAgICAqIFRoZSBldmVudCB0cmF2ZWxzIGludG8gdGhlIGhpZXJhcmNoeSB0byB0aGlzIG5vZGUgZGlzcGF0Y2hpbmcgdGhlIGV2ZW50LCBpbnZva2luZyBtYXRjaGluZyBoYW5kbGVycyBvZiB0aGUgbm9kZXMgYW5jZXN0b3JzIGxpc3RlbmluZyB0byB0aGUgY2FwdHVyZSBwaGFzZSwgXHJcbiAgICAgKiB0aGFuIHRoZSBtYXRjaGluZyBoYW5kbGVyIG9mIHRoZSB0YXJnZXQgbm9kZSBpbiB0aGUgdGFyZ2V0IHBoYXNlLCBhbmQgYmFjayBvdXQgb2YgdGhlIGhpZXJhcmNoeSBpbiB0aGUgYnViYmxpbmcgcGhhc2UsIGludm9raW5nIGFwcHJvcHJpYXRlIGhhbmRsZXJzIG9mIHRoZSBhbnZlc3RvcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQoX2V2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgYW5jZXN0b3JzOiBOb2RlW10gPSBbXTtcclxuICAgICAgbGV0IHVwY29taW5nOiBOb2RlID0gdGhpcztcclxuICAgICAgLy8gb3ZlcndyaXRlIGV2ZW50IHRhcmdldFxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcInRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgUmVmbGVjdCBpbnN0ZWFkIG9mIE9iamVjdCB0aHJvdWdob3V0LiBTZWUgYWxzbyBSZW5kZXIgYW5kIE11dGFibGUuLi5cclxuICAgICAgd2hpbGUgKHVwY29taW5nLnBhcmVudClcclxuICAgICAgICBhbmNlc3RvcnMucHVzaCh1cGNvbWluZyA9IHVwY29taW5nLnBhcmVudCk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwicGF0aFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbmV3IEFycmF5PE5vZGU+KHRoaXMsIC4uLmFuY2VzdG9ycykgfSk7XHJcblxyXG4gICAgICAvLyBjYXB0dXJlIHBoYXNlXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiZXZlbnRQaGFzZVwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogRXZlbnQuQ0FQVFVSSU5HX1BIQVNFIH0pO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBhbmNlc3RvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSBhbmNlc3RvcnNbaV07XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJjdXJyZW50VGFyZ2V0XCIsIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBhbmNlc3RvciB9KTtcclxuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcnMoYW5jZXN0b3IuY2FwdHVyZXNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0YXJnZXQgcGhhc2VcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJldmVudFBoYXNlXCIsIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBFdmVudC5BVF9UQVJHRVQgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzKHRoaXMuY2FwdHVyZXNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG4gICAgICB0aGlzLmNhbGxMaXN0ZW5lcnModGhpcy5saXN0ZW5lcnNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG5cclxuICAgICAgaWYgKCFfZXZlbnQuYnViYmxlcylcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIGJ1YmJsZSBwaGFzZVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImV2ZW50UGhhc2VcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IEV2ZW50LkJVQkJMSU5HX1BIQVNFIH0pO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGFuY2VzdG9yOiBOb2RlID0gYW5jZXN0b3JzW2ldO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogYW5jZXN0b3IgfSk7XHJcbiAgICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzKGFuY2VzdG9yLmxpc3RlbmVyc1tfZXZlbnQudHlwZV0sIF9ldmVudCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7IC8vVE9ETzogcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSwgc2VlIGRvY3VtZW50YXRpb24gb2YgZGlzcGF0Y2ggZXZlbnRcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGF0Y2hlcyBhIHN5bnRoZXRpYyBldmVudCB0byB0YXJnZXQgd2l0aG91dCB0cmF2ZWxsaW5nIHRocm91Z2ggdGhlIGdyYXBoIGhpZXJhcmNoeSBuZWl0aGVyIGR1cmluZyBjYXB0dXJlIG5vciBidWJibGluZyBwaGFzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcGF0Y2hFdmVudFRvVGFyZ2V0T25seShfZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiZXZlbnRQaGFzZVwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogRXZlbnQuQVRfVEFSR0VUIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImN1cnJlbnRUYXJnZXRcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMgfSk7XHJcbiAgICAgIHRoaXMuY2FsbExpc3RlbmVycyh0aGlzLmxpc3RlbmVyc1tfZXZlbnQudHlwZV0sIF9ldmVudCk7IC8vIFRPRE86IGV4YW1pbmUgaWYgdGhpcyBzaG91bGQgZ28gdG8gdGhlIGNhcHR1cmVzIGluc3RlYWQgb2YgdGhlIGxpc3RlbmVyc1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQnJvYWRjYXN0cyBhIHN5bnRoZXRpYyBldmVudCB0byB0aGlzIG5vZGUgYW5kIGZyb20gdGhlcmUgdG8gYWxsIG5vZGVzIGRlZXBlciBpbiB0aGUgaGllcmFyY2h5LFxyXG4gICAgICogaW52b2tpbmcgbWF0Y2hpbmcgaGFuZGxlcnMgb2YgdGhlIG5vZGVzIGxpc3RlbmluZyB0byB0aGUgY2FwdHVyZSBwaGFzZS4gV2F0Y2ggcGVyZm9ybWFuY2Ugd2hlbiB0aGVyZSBhcmUgbWFueSBub2RlcyBpbnZvbHZlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYnJvYWRjYXN0RXZlbnQoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAvLyBvdmVyd3JpdGUgZXZlbnQgdGFyZ2V0IGFuZCBwaGFzZVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImV2ZW50UGhhc2VcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IEV2ZW50LkNBUFRVUklOR19QSEFTRSB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJ0YXJnZXRcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMgfSk7XHJcbiAgICAgIHRoaXMuYnJvYWRjYXN0RXZlbnRSZWN1cnNpdmUoX2V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJyb2FkY2FzdEV2ZW50UmVjdXJzaXZlKF9ldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgLy8gY2FwdHVyZSBwaGFzZSBvbmx5XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgbGV0IGNhcHR1cmVzOiBFdmVudExpc3RlbmVyVW5pZmllZFtdID0gdGhpcy5jYXB0dXJlc1tfZXZlbnQudHlwZV0gfHwgW107XHJcbiAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgY2FwdHVyZXMpXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGhhbmRsZXIoX2V2ZW50KTtcclxuICAgICAgLy8gYXBwZWFycyB0byBiZSBzbG93ZXIsIGFzdG9uaXNoaW5nbHkuLi5cclxuICAgICAgLy8gY2FwdHVyZXMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgLy8gICAgIGhhbmRsZXIoX2V2ZW50KTtcclxuICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAvLyBzYW1lIGZvciBjaGlsZHJlblxyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY2hpbGQuYnJvYWRjYXN0RXZlbnRSZWN1cnNpdmUoX2V2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsbExpc3RlbmVycyhfbGlzdGVuZXJzOiBFdmVudExpc3RlbmVyVW5pZmllZFtdLCBfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIGlmIChfbGlzdGVuZXJzPy5sZW5ndGggPiAwKVxyXG4gICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgX2xpc3RlbmVycylcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIGhhbmRsZXIoX2V2ZW50KTtcclxuICAgIH1cclxuICAgIC8vICNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RyYW5zZmVyL1NlcmlhbGl6ZXIudHNcIi8+XHJcbi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVHJhbnNmZXIvTXV0YWJsZS50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqIFxyXG4gICAqIFN1cGVyY2xhc3MgZm9yIGFsbCB7QGxpbmsgQ29tcG9uZW50fXMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8ge0BsaW5rIE5vZGV9cy5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMCB8IEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5ICBcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHtcclxuICAgIC8qKiBzdWJjbGFzc2VzIGdldCBhIGlTdWJjbGFzcyBudW1iZXIgZm9yIGlkZW50aWZpY2F0aW9uICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyO1xyXG4gICAgLyoqIHJlZmVycyBiYWNrIHRvIHRoaXMgY2xhc3MgZnJvbSBhbnkgc3ViY2xhc3MgZS5nLiBpbiBvcmRlciB0byBmaW5kIGNvbXBhdGlibGUgb3RoZXIgcmVzb3VyY2VzKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYmFzZUNsYXNzOiB0eXBlb2YgQ29tcG9uZW50ID0gQ29tcG9uZW50O1xyXG4gICAgLyoqIGxpc3Qgb2YgYWxsIHRoZSBzdWJjbGFzc2VzIGRlcml2ZWQgZnJvbSB0aGlzIGNsYXNzLCBpZiB0aGV5IHJlZ2lzdGVyZWQgcHJvcGVybHkqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdWJjbGFzc2VzOiB0eXBlb2YgQ29tcG9uZW50W10gPSBbXTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgc2luZ2xldG9uOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByb3RlY3RlZCBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgI25vZGU6IE5vZGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5NVVRBVEUsIChfZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuI25vZGUpIHtcclxuICAgICAgICAgIC8vIFRPRE86IGZpbmQgdGhlIG51bWJlciBvZiB0aGUgY29tcG9uZW50IGluIHRoZSBhcnJheSBpZiBub3Qgc2luZ2xldG9uXHJcbiAgICAgICAgICBfZXZlbnQuZGV0YWlsLmNvbXBvbmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgIF9ldmVudC5kZXRhaWwuY29tcG9uZW50SW5kZXggPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50cyh0aGlzLmNvbnN0cnVjdG9yKS5pbmRleE9mKHRoaXMpO1xyXG4gICAgICAgICAgdGhpcy4jbm9kZS5kaXNwYXRjaEV2ZW50KF9ldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YmNsYXNzOiB0eXBlb2YgQ29tcG9uZW50KTogbnVtYmVyIHsgcmV0dXJuIENvbXBvbmVudC5zdWJjbGFzc2VzLnB1c2goX3N1YmNsYXNzKSAtIDE7IH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXMgdHJ1ZSwgd2hlbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGNsYXNzIGNhbiBiZSBhdHRhY2hlZCB0byBhIG5vZGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc1NpbmdsZXRvbigpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBub2RlLCB0aGlzIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgYXR0YWNoZWQgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBub2RlKCk6IE5vZGUgfCBudWxsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZS0gLyBBY3RpdmF0ZSB0aGlzIGNvbXBvbmVudC4gSW5hY3RpdmUgY29tcG9uZW50cyB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgYnkgdGhlIHJlbmRlcmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWN0aXZhdGUoX29uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYWN0aXZlID0gX29uO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KF9vbiA/IEVWRU5ULkNPTVBPTkVOVF9BQ1RJVkFURSA6IEVWRU5ULkNPTVBPTkVOVF9ERUFDVElWQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmllcyB0byBhdHRhY2ggdGhlIGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gbm9kZSwgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgbm9kZSBpdCB3YXMgYXR0YWNoZWQgdG8gaWYgYXBwbGljYWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXR0YWNoVG9Ob2RlKF9jb250YWluZXI6IE5vZGUgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLiNub2RlID09IF9jb250YWluZXIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBsZXQgcHJldmlvdXNDb250YWluZXI6IE5vZGUgPSB0aGlzLiNub2RlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChwcmV2aW91c0NvbnRhaW5lcilcclxuICAgICAgICAgIHByZXZpb3VzQ29udGFpbmVyLnJlbW92ZUNvbXBvbmVudCh0aGlzKTtcclxuICAgICAgICB0aGlzLiNub2RlID0gX2NvbnRhaW5lcjtcclxuICAgICAgICBpZiAodGhpcy4jbm9kZSlcclxuICAgICAgICAgIHRoaXMuI25vZGUuYWRkQ29tcG9uZW50KHRoaXMpO1xyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICB0aGlzLiNub2RlID0gcHJldmlvdXNDb250YWluZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRlIHRoaXMgdG8gZHJhdyB2aXN1YWwgYWlkcyBmb3IgdGhpcyBjb21wb25lbnQgaW5zaWRlIHRoZSBlZGl0b3JzIHJlbmRlciB2aWV3LiBVc2Uge0BsaW5rIEdpem1vc30gaW5zaWRlIHRoZSBvdmVycmlkZSB0byBkcmF3IHN0dWZmLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcz8oKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlZSB7QGxpbmsgZHJhd0dpem1vc30uIE9ubHkgZGlzcGxheWVkIHdoaWxlIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zU2VsZWN0ZWQ/KCk6IHZvaWQ7XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBhY3RpdmU6IHRoaXMuYWN0aXZlXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5hY3RpdmF0ZShfc2VyaWFsaXphdGlvbi5hY3RpdmUpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5hY3RpdmUpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYWN0aXZhdGUoX211dGF0b3IuYWN0aXZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2luZ2xldG9uO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubXR4V29ybGQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBXcmFwcyBhIHJlZ3VsYXIgSmF2YXNjcmlwdCBBcnJheSBhbmQgb2ZmZXJzIHZlcnkgbGltaXRlZCBmdW5jdGlvbmFsaXR5IGdlYXJlZCBzb2xlbHkgdG93YXJkcyBhdm9pZGluZyBnYXJiYWdlIGNvbGxldGlvbi5cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9SZWN5Y2xlclxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZWN5Y2FibGVBcnJheTxUPiB7XHJcbiAgICAjbGVuZ3RoOiBudW1iZXIgPSAwO1xyXG4gICAgI2FycmF5OiBBcnJheTxUPiA9IG5ldyBBcnJheTxUPigpO1xyXG4gICAgLy8gI3R5cGU6IG5ldyAoKSA9PiBUO1xyXG5cclxuICAgIC8vIC8vdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxyXG4gICAgLy8gY29uc3RydWN0b3IoX3R5cGU6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpIHtcclxuICAgIC8vICAgdGhpcy4jdHlwZSA9IF90eXBlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNsZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2aXJ0dWFsIGxlbmd0aCBvZiB0aGUgYXJyYXkgdG8gemVybyBidXQga2VlcHMgdGhlIGVudHJpZXMgYmV5b25kLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI2xlbmd0aCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWN5Y2xlIHRoaXMgYXJyYXlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGVuZHMgYSBuZXcgZW50cnkgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXksIGFuZCByZXR1cm5zIHRoZSBuZXcgbGVuZ3RoIG9mIHRoZSBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHB1c2goX2VudHJ5OiBUKTogbnVtYmVyIHtcclxuICAgICAgdGhpcy4jYXJyYXlbdGhpcy4jbGVuZ3RoXSA9IF9lbnRyeTtcclxuICAgICAgdGhpcy4jbGVuZ3RoKys7XHJcbiAgICAgIHJldHVybiB0aGlzLiNsZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBsYXN0IGVudHJ5IGZyb20gdGhlIGFycmF5IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9wKCk6IFQge1xyXG4gICAgICB0aGlzLiNsZW5ndGgtLTtcclxuICAgICAgcmV0dXJuIHRoaXMuI2FycmF5W3RoaXMuI2xlbmd0aF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWN5Y2xlcyB0aGUgb2JqZWN0IGZvbGxvd2luZyB0aGUgbGFzdCBpbiB0aGUgYXJyYXkgYW5kIGluY3JlYXNlcyB0aGUgYXJyYXkgbGVuZ3RoXHJcbiAgICAgKiBJdCBtdXN0IGJlIGFzc3VyZWQsIHRoYXQgbm9uZSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgYXJyYXkgaXMgc3RpbGwgaW4gYW55IHVzZSBvZiBhbnkga2luZCFcclxuICAgICAqL1xyXG4gICAgLy8gcHVibGljIHJlY3ljbGUoKTogVCB7XHJcbiAgICAvLyAgIGlmICh0aGlzLiNsZW5ndGggPCB0aGlzLiNhcnJheS5sZW5ndGgpIHtcclxuICAgIC8vICAgICB0aGlzLiNsZW5ndGgrKztcclxuICAgIC8vICAgICByZXR1cm4gdGhpcy4jYXJyYXlbdGhpcy4jbGVuZ3RoKytdO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHRoaXMuI2FycmF5LnB1c2goUmVjeWNsZXIuZ2V0KHRoaXMuI3R5cGUpKTtcclxuICAgIC8vICAgcmV0dXJuIHRoaXMuI2FycmF5W3RoaXMuI2xlbmd0aCsrXTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy4jbGVuZ3RoOyBpKyspXHJcbiAgICAgICAgeWllbGQgdGhpcy4jYXJyYXlbaV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgYXJyYXkgc29ydGVkIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29tcGFyZSBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U29ydGVkKF9zb3J0OiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKTogVFtdIHtcclxuICAgICAgbGV0IHNvcnRlZDogVFtdID0gdGhpcy4jYXJyYXkuc2xpY2UoMCwgdGhpcy4jbGVuZ3RoKTtcclxuICAgICAgc29ydGVkLnNvcnQoX3NvcnQpO1xyXG4gICAgICByZXR1cm4gc29ydGVkO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEJhc2VjbGFzcyBmb3Ige0BsaW5rIFJlbmRlckluamVjdG9yQ29hdH0gYW5kIHtAbGluayBSZW5kZXJJbmplY3RvclRleHR1cmV9XHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdHMgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIHdpdGggdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGdpdmVuIGluamVjdG9yLiBOYW1lIG9mIHRoZSBjb25zdHJ1Y3RvciBhbmQgdGhlIG5hbWUgb2YgdGhlIGluamVjdG9yIG1ldGhvZCBtdXN0IG1hdGNoLlxyXG4gICAgICogVXNlZCBpbiBzdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaW5qZWN0KF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9pbmplY3RvcjogdHlwZW9mIFJlbmRlckluamVjdG9yKTogdm9pZCB7XHJcbiAgICAgIGxldCBpbmplY3Rpb246IEZ1bmN0aW9uID0gUmVmbGVjdC5nZXQoX2luamVjdG9yLCBcImluamVjdFwiICsgX2NvbnN0cnVjdG9yLm5hbWUpO1xyXG4gICAgICBpZiAoIWluamVjdGlvbikge1xyXG4gICAgICAgIERlYnVnLmVycm9yKFwiTm8gaW5qZWN0aW9uIGRlY29yYXRvciBkZWZpbmVkIGZvciBcIiArIF9jb25zdHJ1Y3Rvci5uYW1lKTtcclxuICAgICAgfVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJ1c2VSZW5kZXJEYXRhXCIsIHtcclxuICAgICAgICB2YWx1ZTogaW5qZWN0aW9uXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBHaXZlcyBXZWJHTCBCdWZmZXIgdGhlIGRhdGEgZnJvbSB0aGUge0BsaW5rIFNoYWRlcn1cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVuZGVySW5qZWN0b3JTaGFkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGdpdmVuIHtAbGluayBTaGFkZXJ9LXN1YmNsYXNzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVjb3JhdGUoX2NvbnN0cnVjdG9yOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLCBcInVzZVByb2dyYW1cIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclNoYWRlci51c2VQcm9ncmFtXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLCBcImRlbGV0ZVByb2dyYW1cIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclNoYWRlci5kZWxldGVQcm9ncmFtXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLCBcImNyZWF0ZVByb2dyYW1cIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclNoYWRlci5jcmVhdGVQcm9ncmFtXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoaXMgcHJvZ3JhbSB0byB1c2UgYXMgdGhlIGFjdGl2ZSBwcm9ncmFtIGluIFdlYkdMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgdXNlUHJvZ3JhbSh0aGlzOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5wcm9ncmFtKVxyXG4gICAgICAgIHRoaXMuY3JlYXRlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNyYzMudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVsZXRlcyB0aGlzIHByb2dyYW0gZnJvbSBXZWJHTCwgY2xlYXJpbmcgdGhlIHVzZWQgbWVtb3J5IG9uIHRoZSBHUFUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVsZXRlUHJvZ3JhbSh0aGlzOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBpZiAodGhpcy5wcm9ncmFtKSB7XHJcbiAgICAgICAgY3JjMy5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuYXR0cmlidXRlcztcclxuICAgICAgICBkZWxldGUgdGhpcy51bmlmb3JtcztcclxuICAgICAgICBkZWxldGUgdGhpcy5wcm9ncmFtO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBjcmVhdGVQcm9ncmFtKHRoaXM6IHR5cGVvZiBTaGFkZXIpOiB2b2lkIHtcclxuICAgICAgRGVidWcuZnVkZ2UoXCJDcmVhdGUgc2hhZGVyIHByb2dyYW1cIiwgdGhpcy5uYW1lKTtcclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGxldCBwcm9ncmFtOiBXZWJHTFByb2dyYW0gPSBjcmMzLmNyZWF0ZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHNoZFZlcnRleDogV2ViR0xTaGFkZXIgPSBjb21waWxlU2hhZGVyKHRoaXMuZ2V0VmVydGV4U2hhZGVyU291cmNlKCksIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVkVSVEVYX1NIQURFUik7XHJcbiAgICAgICAgbGV0IHNoZEZyYWdtZW50OiBXZWJHTFNoYWRlciA9IGNvbXBpbGVTaGFkZXIodGhpcy5nZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQUdNRU5UX1NIQURFUik7XHJcblxyXG4gICAgICAgIGNyYzMuYXR0YWNoU2hhZGVyKHByb2dyYW0sIFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTFNoYWRlcj4oc2hkVmVydGV4KSk7XHJcbiAgICAgICAgY3JjMy5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMU2hhZGVyPihzaGRGcmFnbWVudCkpO1xyXG4gICAgICAgIGNyYzMubGlua1Byb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvcjogc3RyaW5nID0gUmVuZGVyV2ViR0wuYXNzZXJ0PHN0cmluZz4oY3JjMy5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSk7XHJcbiAgICAgICAgaWYgKGVycm9yICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBsaW5raW5nIFNoYWRlcjogXCIgKyBlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGRldGVjdEF0dHJpYnV0ZXMoKTtcclxuICAgICAgICB0aGlzLnVuaWZvcm1zID0gZGV0ZWN0VW5pZm9ybXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGVmaW5lLmluY2x1ZGVzKFwiU0tJTlwiKSkge1xyXG4gICAgICAgICAgY29uc3QgYmxvY2tJbmRleDogbnVtYmVyID0gY3JjMy5nZXRVbmlmb3JtQmxvY2tJbmRleChwcm9ncmFtLCBVTklGT1JNX0JMT0NLUy5TS0lOLk5BTUUpO1xyXG4gICAgICAgICAgY3JjMy51bmlmb3JtQmxvY2tCaW5kaW5nKHByb2dyYW0sIGJsb2NrSW5kZXgsIFVOSUZPUk1fQkxPQ0tTLlNLSU4uQklORElORyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kZWZpbmUuZmluZChfZGVmaW5lID0+IFtcIkZMQVRcIiwgXCJHT1VSQVVEXCIsIFwiUEhPTkdcIl0uaW5jbHVkZXMoX2RlZmluZSkpKSB7XHJcbiAgICAgICAgICBpZiAoIVJlbmRlcldlYkdMLnVib0xpZ2h0cylcclxuICAgICAgICAgICAgUmVuZGVyV2ViR0wudWJvTGlnaHRzID0gY3JlYXRlVUJPTGlnaHRzKCk7XHJcbiAgICAgICAgICBpZiAoIVJlbmRlcldlYkdMLnVib0xpZ2h0c1ZhcmlhYmxlT2Zmc2V0cylcclxuICAgICAgICAgICAgUmVuZGVyV2ViR0wudWJvTGlnaHRzVmFyaWFibGVPZmZzZXRzID0gZGV0ZWN0VUJPTGlnaHRzVmFyaWFibGVPZmZzZXRzKCk7XHJcblxyXG4gICAgICAgICAgLy8gYmluZCBsaWdodHMgVUJPIHRvIHNoYWRlciBwcm9ncmFtXHJcbiAgICAgICAgICBjb25zdCBibG9ja0luZGV4OiBudW1iZXIgPSBjcmMzLmdldFVuaWZvcm1CbG9ja0luZGV4KHByb2dyYW0sIFVOSUZPUk1fQkxPQ0tTLkxJR0hUUy5OQU1FKTtcclxuICAgICAgICAgIGNyYzMudW5pZm9ybUJsb2NrQmluZGluZyhwcm9ncmFtLCBibG9ja0luZGV4LCBVTklGT1JNX0JMT0NLUy5MSUdIVFMuQklORElORyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBibG9ja0luZGV4OiBudW1iZXIgPSBjcmMzLmdldFVuaWZvcm1CbG9ja0luZGV4KHByb2dyYW0sIFVOSUZPUk1fQkxPQ0tTLkZPRy5OQU1FKTtcclxuICAgICAgICBpZiAoYmxvY2tJbmRleCAhPSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LklOVkFMSURfSU5ERVgpXHJcbiAgICAgICAgICBjcmMzLnVuaWZvcm1CbG9ja0JpbmRpbmcocHJvZ3JhbSwgYmxvY2tJbmRleCwgVU5JRk9STV9CTE9DS1MuRk9HLkJJTkRJTkcpO1xyXG5cclxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XHJcbiAgICAgICAgRGVidWcuZXJyb3IoX2Vycm9yKTtcclxuICAgICAgICBkZWJ1Z2dlcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgZnVuY3Rpb24gY29tcGlsZVNoYWRlcihfc2hhZGVyQ29kZTogc3RyaW5nLCBfc2hhZGVyVHlwZTogR0xlbnVtKTogV2ViR0xTaGFkZXIgfCBudWxsIHtcclxuICAgICAgICBsZXQgd2ViR0xTaGFkZXI6IFdlYkdMU2hhZGVyID0gY3JjMy5jcmVhdGVTaGFkZXIoX3NoYWRlclR5cGUpO1xyXG4gICAgICAgIGNyYzMuc2hhZGVyU291cmNlKHdlYkdMU2hhZGVyLCBfc2hhZGVyQ29kZSk7XHJcbiAgICAgICAgY3JjMy5jb21waWxlU2hhZGVyKHdlYkdMU2hhZGVyKTtcclxuICAgICAgICBsZXQgZXJyb3I6IHN0cmluZyA9IFJlbmRlcldlYkdMLmFzc2VydDxzdHJpbmc+KGNyYzMuZ2V0U2hhZGVySW5mb0xvZyh3ZWJHTFNoYWRlcikpO1xyXG4gICAgICAgIGlmIChlcnJvciAhPT0gXCJcIikge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coX3NoYWRlckNvZGUpO1xyXG5cclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGNvbXBpbGluZyBzaGFkZXI6IFwiICsgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDaGVjayBmb3IgYW55IGNvbXBpbGF0aW9uIGVycm9ycy5cclxuICAgICAgICBpZiAoIWNyYzMuZ2V0U2hhZGVyUGFyYW1ldGVyKHdlYkdMU2hhZGVyLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTVBJTEVfU1RBVFVTKSkge1xyXG4gICAgICAgICAgYWxlcnQoY3JjMy5nZXRTaGFkZXJJbmZvTG9nKHdlYkdMU2hhZGVyKSk7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHdlYkdMU2hhZGVyO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBkZXRlY3RBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IG51bWJlciB9IHtcclxuICAgICAgICBsZXQgZGV0ZWN0ZWRBdHRyaWJ1dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGVDb3VudDogbnVtYmVyID0gY3JjMy5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQUNUSVZFX0FUVFJJQlVURVMpO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhdHRyaWJ1dGVDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgYXR0cmlidXRlSW5mbzogV2ViR0xBY3RpdmVJbmZvID0gUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMQWN0aXZlSW5mbz4oY3JjMy5nZXRBY3RpdmVBdHRyaWIocHJvZ3JhbSwgaSkpO1xyXG4gICAgICAgICAgaWYgKCFhdHRyaWJ1dGVJbmZvKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGRldGVjdGVkQXR0cmlidXRlc1thdHRyaWJ1dGVJbmZvLm5hbWVdID0gY3JjMy5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGVJbmZvLm5hbWUpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRldGVjdGVkQXR0cmlidXRlcztcclxuICAgICAgfVxyXG5cclxuICAgICAgZnVuY3Rpb24gZGV0ZWN0VW5pZm9ybXMoKTogeyBbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb24gfSB7XHJcbiAgICAgICAgbGV0IGRldGVjdGVkVW5pZm9ybXM6IHsgW25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9uIH0gPSB7fTtcclxuICAgICAgICBsZXQgdW5pZm9ybUNvdW50OiBudW1iZXIgPSBjcmMzLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BQ1RJVkVfVU5JRk9STVMpO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB1bmlmb3JtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGluZm86IFdlYkdMQWN0aXZlSW5mbyA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTEFjdGl2ZUluZm8+KGNyYzMuZ2V0QWN0aXZlVW5pZm9ybShwcm9ncmFtLCBpKSk7XHJcbiAgICAgICAgICBpZiAoIWluZm8pIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gY3JjMy5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgaW5mby5uYW1lKTtcclxuICAgICAgICAgIGlmIChsb2NhdGlvbilcclxuICAgICAgICAgICAgZGV0ZWN0ZWRVbmlmb3Jtc1tpbmZvLm5hbWVdID0gUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMVW5pZm9ybUxvY2F0aW9uPihsb2NhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkZXRlY3RlZFVuaWZvcm1zO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBjcmVhdGVVQk9MaWdodHMoKTogV2ViR0xCdWZmZXIge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrSW5kZXg6IG51bWJlciA9IGNyYzMuZ2V0VW5pZm9ybUJsb2NrSW5kZXgocHJvZ3JhbSwgVU5JRk9STV9CTE9DS1MuTElHSFRTLk5BTUUpO1xyXG4gICAgICAgIGNvbnN0IGJsb2NrU2l6ZTogbnVtYmVyID0gY3JjMy5nZXRBY3RpdmVVbmlmb3JtQmxvY2tQYXJhbWV0ZXIocHJvZ3JhbSwgYmxvY2tJbmRleCwgY3JjMy5VTklGT1JNX0JMT0NLX0RBVEFfU0laRSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHVibzogV2ViR0xCdWZmZXIgPSBSZW5kZXJXZWJHTC5hc3NlcnQoY3JjMy5jcmVhdGVCdWZmZXIoKSk7XHJcbiAgICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIHVibyk7XHJcbiAgICAgICAgY3JjMy5idWZmZXJEYXRhKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIGJsb2NrU2l6ZSwgY3JjMy5EWU5BTUlDX0RSQVcpO1xyXG4gICAgICAgIGNyYzMuYmluZEJ1ZmZlckJhc2UoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgVU5JRk9STV9CTE9DS1MuTElHSFRTLkJJTkRJTkcsIHVibyk7XHJcblxyXG4gICAgICAgIHJldHVybiB1Ym87XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGRldGVjdFVCT0xpZ2h0c1ZhcmlhYmxlT2Zmc2V0cygpOiB0eXBlb2YgUmVuZGVyV2ViR0wudWJvTGlnaHRzVmFyaWFibGVPZmZzZXRzIHtcclxuICAgICAgICBjb25zdCB1Ym9WYXJpYWJsZU5hbWVzOiBzdHJpbmdbXSA9IFtcclxuICAgICAgICAgIFwidV9uTGlnaHRzRGlyZWN0aW9uYWxcIixcclxuICAgICAgICAgIFwidV9uTGlnaHRzUG9pbnRcIixcclxuICAgICAgICAgIFwidV9uTGlnaHRzU3BvdFwiLFxyXG4gICAgICAgICAgXCJ1X2FtYmllbnQudmN0Q29sb3JcIixcclxuICAgICAgICAgIFwidV9kaXJlY3Rpb25hbFswXS52Y3RDb2xvclwiLFxyXG4gICAgICAgICAgXCJ1X3BvaW50WzBdLnZjdENvbG9yXCIsXHJcbiAgICAgICAgICBcInVfc3BvdFswXS52Y3RDb2xvclwiXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3QgdWJvVmFyaWFibGVJbmRpY2VzOiBudW1iZXJbXSA9IDxudW1iZXJbXT5jcmMzLmdldFVuaWZvcm1JbmRpY2VzKFxyXG4gICAgICAgICAgcHJvZ3JhbSxcclxuICAgICAgICAgIHVib1ZhcmlhYmxlTmFtZXNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCB1Ym9WYXJpYWJsZU9mZnNldHM6IG51bWJlcltdID0gY3JjMy5nZXRBY3RpdmVVbmlmb3JtcyhcclxuICAgICAgICAgIHByb2dyYW0sXHJcbiAgICAgICAgICB1Ym9WYXJpYWJsZUluZGljZXMsXHJcbiAgICAgICAgICBjcmMzLlVOSUZPUk1fT0ZGU0VUXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgdWJvVmFyaWFibGVOYW1lVG9PZmZzZXQ6IHR5cGVvZiBSZW5kZXJXZWJHTC51Ym9MaWdodHNWYXJpYWJsZU9mZnNldHMgPSB7fTtcclxuICAgICAgICB1Ym9WYXJpYWJsZU5hbWVzLmZvckVhY2goKF9uYW1lLCBfaW5kZXgpID0+IHVib1ZhcmlhYmxlTmFtZVRvT2Zmc2V0W19uYW1lXSA9IHVib1ZhcmlhYmxlT2Zmc2V0c1tfaW5kZXhdKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHVib1ZhcmlhYmxlTmFtZVRvT2Zmc2V0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdpdmVzIFdlYkdMIEJ1ZmZlciB0aGUgZGF0YSBmcm9tIHRoZSB7QGxpbmsgQ29hdH1cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVuZGVySW5qZWN0b3JDb2F0IGV4dGVuZHMgUmVuZGVySW5qZWN0b3Ige1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGdpdmVuIHtAbGluayBDb2F0fS1zdWJjbGFzc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgUmVuZGVySW5qZWN0b3IuaW5qZWN0KF9jb25zdHJ1Y3RvciwgUmVuZGVySW5qZWN0b3JDb2F0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdENvYXRDb2xvcmVkKHRoaXM6IENvYXRDb2xvcmVkLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsKTogdm9pZCB7XHJcbiAgICAgIGxldCB1bmlmb3JtOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X3ZjdENvbG9yXCJdO1xyXG4gICAgICBsZXQgY29sb3I6IENvbG9yID0gQ29sb3IuUFJPRFVDVCh0aGlzLmNvbG9yLCBfY21wTWF0ZXJpYWwuY2xyUHJpbWFyeSk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtNGZ2KHVuaWZvcm0sIGNvbG9yLmdldCgpKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoY29sb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdFJlbWlzc2l2ZSh0aGlzOiBDb2F0UmVtaXNzaXZlLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlckluamVjdG9yQ29hdC5pbmplY3RDb2F0Q29sb3JlZC5jYWxsKHRoaXMsIF9zaGFkZXIsIF9jbXBNYXRlcmlhbCk7XHJcbiAgICAgIGxldCB1bmlmb3JtOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X2ZEaWZmdXNlXCJdO1xyXG4gICAgICBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkudW5pZm9ybTFmKHVuaWZvcm0sIHRoaXMuZGlmZnVzZSk7XHJcbiAgICAgIHVuaWZvcm0gPSBfc2hhZGVyLnVuaWZvcm1zW1widV9mTWV0YWxsaWNcIl07XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtMWYodW5pZm9ybSwgdGhpcy5tZXRhbGxpYyk7XHJcbiAgICAgIHVuaWZvcm0gPSBfc2hhZGVyLnVuaWZvcm1zW1widV9mU3BlY3VsYXJcIl07XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtMWYodW5pZm9ybSwgdGhpcy5zcGVjdWxhcik7XHJcbiAgICAgIHVuaWZvcm0gPSBfc2hhZGVyLnVuaWZvcm1zW1widV9mSW50ZW5zaXR5XCJdO1xyXG4gICAgICBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkudW5pZm9ybTFmKHVuaWZvcm0sIHRoaXMuaW50ZW5zaXR5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdENvYXRUZXh0dXJlZCh0aGlzOiBDb2F0VGV4dHVyZWQsIF9zaGFkZXI6IHR5cGVvZiBTaGFkZXIsIF9jbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwpOiB2b2lkIHtcclxuICAgICAgUmVuZGVySW5qZWN0b3JDb2F0LmluamVjdENvYXRDb2xvcmVkLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICB0aGlzLnRleHR1cmUudXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uQ09MT1IuVU5JRk9STV0sIFRFWFRVUkVfTE9DQVRJT04uQ09MT1IuSU5ERVgpO1xyXG4gICAgICBjcmMzLnVuaWZvcm1NYXRyaXgzZnYoX3NoYWRlci51bmlmb3Jtc1tcInVfbXR4UGl2b3RcIl0sIGZhbHNlLCBfY21wTWF0ZXJpYWwubXR4UGl2b3QuZ2V0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdFJlbWlzc2l2ZVRleHR1cmVkKHRoaXM6IENvYXRSZW1pc3NpdmVUZXh0dXJlZCwgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3RvckNvYXQuaW5qZWN0Q29hdFJlbWlzc2l2ZS5jYWxsKHRoaXMsIF9zaGFkZXIsIF9jbXBNYXRlcmlhbCk7XHJcblxyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgdGhpcy50ZXh0dXJlLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5VTklUKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoX3NoYWRlci51bmlmb3Jtc1tURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSUZPUk1dLCBURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLklOREVYKTtcclxuICAgICAgY3JjMy51bmlmb3JtTWF0cml4M2Z2KF9zaGFkZXIudW5pZm9ybXNbXCJ1X210eFBpdm90XCJdLCBmYWxzZSwgX2NtcE1hdGVyaWFsLm10eFBpdm90LmdldCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdENvYXRSZW1pc3NpdmVUZXh0dXJlZE5vcm1hbHModGhpczogQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFscywgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3RvckNvYXQuaW5qZWN0Q29hdFJlbWlzc2l2ZVRleHR1cmVkLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICB0aGlzLm5vcm1hbE1hcC51c2VSZW5kZXJEYXRhKFRFWFRVUkVfTE9DQVRJT04uTk9STUFMLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uTk9STUFMLlVOSUZPUk1dLCBURVhUVVJFX0xPQ0FUSU9OLk5PUk1BTC5JTkRFWCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBpbmplY3RDb2F0VG9vbih0aGlzOiBDb2F0VG9vbiwgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3RvckNvYXQuaW5qZWN0Q29hdFJlbWlzc2l2ZS5jYWxsKHRoaXMsIF9zaGFkZXIsIF9jbXBNYXRlcmlhbCk7XHJcblxyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgdGhpcy50ZXhUb29uLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5UT09OLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uVE9PTi5VTklGT1JNXSwgVEVYVFVSRV9MT0NBVElPTi5UT09OLklOREVYKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdENvYXRUb29uVGV4dHVyZWQodGhpczogQ29hdFRvb24sIF9zaGFkZXI6IHR5cGVvZiBTaGFkZXIsIF9jbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwpOiB2b2lkIHtcclxuICAgICAgUmVuZGVySW5qZWN0b3JDb2F0LmluamVjdENvYXRSZW1pc3NpdmVUZXh0dXJlZC5jYWxsKHRoaXMsIF9zaGFkZXIsIF9jbXBNYXRlcmlhbCk7XHJcblxyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgdGhpcy50ZXhUb29uLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5UT09OLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uVE9PTi5VTklGT1JNXSwgVEVYVFVSRV9MT0NBVElPTi5UT09OLklOREVYKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQnVmZmVycyB0aGUgZGF0YSBmcm9tIHRoZSB7QGxpbmsgTWVzaH0gaW50byBhIFdlYkdMIEJ1ZmZlclxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3Rvck1lc2gge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNsYXNzIGludG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBnaXZlbiB7QGxpbmsgTWVzaH0tc3ViY2xhc3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVzZVJlbmRlckJ1ZmZlcnNcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3Rvck1lc2gudXNlUmVuZGVyQnVmZmVyc1xyXG4gICAgICB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiZ2V0UmVuZGVyQnVmZmVyc1wiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yTWVzaC5nZXRSZW5kZXJCdWZmZXJzXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJkZWxldGVSZW5kZXJCdWZmZXJzXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JNZXNoLmRlbGV0ZVJlbmRlckJ1ZmZlcnNcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBnZXRSZW5kZXJCdWZmZXJzKHRoaXM6IE1lc2gpOiBSZW5kZXJCdWZmZXJzIHtcclxuICAgICAgaWYgKHRoaXMucmVuZGVyTWVzaC5idWZmZXJzID09IG51bGwpIHtcclxuICAgICAgICB0aGlzLnJlbmRlck1lc2guYnVmZmVycyA9IHtcclxuICAgICAgICAgIHZlcnRpY2VzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC52ZXJ0aWNlcyksXHJcbiAgICAgICAgICBpbmRpY2VzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5yZW5kZXJNZXNoLmluZGljZXMpLFxyXG4gICAgICAgICAgbm9ybWFsczogY3JlYXRlQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCB0aGlzLnJlbmRlck1lc2gubm9ybWFscyksXHJcbiAgICAgICAgICB0ZXh0dXJlVVZzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC50ZXh0dXJlVVZzKSxcclxuICAgICAgICAgIGNvbG9yczogY3JlYXRlQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCB0aGlzLnJlbmRlck1lc2guY29sb3JzKSxcclxuICAgICAgICAgIHRhbmdlbnRzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC50YW5nZW50cyksXHJcbiAgICAgICAgICBuSW5kaWNlczogdGhpcy5yZW5kZXJNZXNoLmluZGljZXMubGVuZ3RoXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyTWVzaC5ib25lcylcclxuICAgICAgICAgIHRoaXMucmVuZGVyTWVzaC5idWZmZXJzLmJvbmVzID0gY3JlYXRlQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCB0aGlzLnJlbmRlck1lc2guYm9uZXMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJNZXNoLndlaWdodHMpXHJcbiAgICAgICAgICB0aGlzLnJlbmRlck1lc2guYnVmZmVycy53ZWlnaHRzID0gY3JlYXRlQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCB0aGlzLnJlbmRlck1lc2gud2VpZ2h0cyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlck1lc2guYnVmZmVycztcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihfdHlwZTogR0xlbnVtLCBfYXJyYXk6IEZsb2F0MzJBcnJheSB8IFVpbnQxNkFycmF5IHwgVWludDhBcnJheSk6IFdlYkdMQnVmZmVyIHtcclxuICAgICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICAgIGxldCBidWZmZXI6IFdlYkdMQnVmZmVyID0gUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMQnVmZmVyPihjcmMzLmNyZWF0ZUJ1ZmZlcigpKTtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoX3R5cGUsIGJ1ZmZlcik7XHJcbiAgICAgICAgY3JjMy5idWZmZXJEYXRhKF90eXBlLCBfYXJyYXksIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU1RBVElDX0RSQVcpO1xyXG4gICAgICAgIHJldHVybiBidWZmZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHVzZVJlbmRlckJ1ZmZlcnModGhpczogTWVzaCwgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX210eE1lc2hUb1dvcmxkOiBNYXRyaXg0eDQsIF9tdHhNZXNoVG9WaWV3OiBNYXRyaXg0eDQsIF9pZD86IG51bWJlcik6IFJlbmRlckJ1ZmZlcnMge1xyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgbGV0IHJlbmRlckJ1ZmZlcnM6IFJlbmRlckJ1ZmZlcnMgPSB0aGlzLmdldFJlbmRlckJ1ZmZlcnMoKTtcclxuXHJcbiAgICAgIGxldCB1bmlmb3JtOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcclxuXHJcbiAgICAgIHVuaWZvcm0gPSBfc2hhZGVyLnVuaWZvcm1zW1widV9tdHhNZXNoVG9WaWV3XCJdO1xyXG4gICAgICBjcmMzLnVuaWZvcm1NYXRyaXg0ZnYodW5pZm9ybSwgZmFsc2UsIF9tdHhNZXNoVG9WaWV3LmdldCgpKTtcclxuXHJcbiAgICAgIHVuaWZvcm0gPSBfc2hhZGVyLnVuaWZvcm1zW1widV9tdHhNZXNoVG9Xb3JsZFwiXTtcclxuICAgICAgaWYgKHVuaWZvcm0pXHJcbiAgICAgICAgY3JjMy51bmlmb3JtTWF0cml4NGZ2KHVuaWZvcm0sIGZhbHNlLCBfbXR4TWVzaFRvV29ybGQuZ2V0KCkpO1xyXG5cclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X210eE5vcm1hbE1lc2hUb1dvcmxkXCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSkge1xyXG4gICAgICAgIGxldCBub3JtYWxNYXRyaXg6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5UUkFOU1BPU0UoTWF0cml4NHg0LklOVkVSU0UoX210eE1lc2hUb1dvcmxkKSk7XHJcbiAgICAgICAgY3JjMy51bmlmb3JtTWF0cml4NGZ2KHVuaWZvcm0sIGZhbHNlLCBub3JtYWxNYXRyaXguZ2V0KCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBmZWVkIGluIGFuIGlkIG9mIHRoZSBub2RlIGlmIHNoYWRlciBhY2NlcHRzIHVfaWQuIFVzZWQgZm9yIHBpY2tpbmdcclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X2lkXCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSlcclxuICAgICAgICBjcmMzLnVuaWZvcm0xaSh1bmlmb3JtLCBfaWQpO1xyXG5cclxuICAgICAgc2V0QXR0cmlidXRlQnVmZmVyKFwiYV92Y3RQb3NpdGlvblwiLCByZW5kZXJCdWZmZXJzLnZlcnRpY2VzLCAzKTtcclxuICAgICAgc2V0QXR0cmlidXRlQnVmZmVyKFwiYV92Y3RDb2xvclwiLCByZW5kZXJCdWZmZXJzLmNvbG9ycywgNCk7XHJcbiAgICAgIHNldEF0dHJpYnV0ZUJ1ZmZlcihcImFfdmN0VGV4dHVyZVwiLCByZW5kZXJCdWZmZXJzLnRleHR1cmVVVnMsIDIpO1xyXG4gICAgICBzZXRBdHRyaWJ1dGVCdWZmZXIoXCJhX3ZjdE5vcm1hbFwiLCByZW5kZXJCdWZmZXJzLm5vcm1hbHMsIDMpO1xyXG4gICAgICBzZXRBdHRyaWJ1dGVCdWZmZXIoXCJhX3ZjdFRhbmdlbnRcIiwgcmVuZGVyQnVmZmVycy50YW5nZW50cywgNCk7XHJcblxyXG4gICAgICBjb25zdCBhQm9uZTogbnVtYmVyID0gX3NoYWRlci5hdHRyaWJ1dGVzW1wiYV92Y3RCb25lc1wiXTtcclxuICAgICAgaWYgKGFCb25lKSB7XHJcbiAgICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCByZW5kZXJCdWZmZXJzLmJvbmVzKTtcclxuICAgICAgICBjcmMzLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGFCb25lKTtcclxuICAgICAgICBjcmMzLnZlcnRleEF0dHJpYklQb2ludGVyKGFCb25lLCA0LCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX0JZVEUsIDAsIDApO1xyXG4gICAgICB9XHJcbiAgICAgIHNldEF0dHJpYnV0ZUJ1ZmZlcihcImFfdmN0V2VpZ2h0c1wiLCByZW5kZXJCdWZmZXJzLndlaWdodHMsIDQpO1xyXG5cclxuICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHJlbmRlckJ1ZmZlcnMuaW5kaWNlcyk7XHJcblxyXG4gICAgICByZXR1cm4gcmVuZGVyQnVmZmVycztcclxuXHJcbiAgICAgIGZ1bmN0aW9uIHNldEF0dHJpYnV0ZUJ1ZmZlcihfbmFtZTogc3RyaW5nLCBfYnVmZmVyOiBXZWJHTEJ1ZmZlciwgX3NpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGU6IG51bWJlciA9IF9zaGFkZXIuYXR0cmlidXRlc1tfbmFtZV07XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCBfYnVmZmVyKTtcclxuICAgICAgICBjcmMzLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgY3JjMy52ZXJ0ZXhBdHRyaWJQb2ludGVyKGF0dHJpYnV0ZSwgX3NpemUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRkxPQVQsIGZhbHNlLCAwLCAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZGVsZXRlUmVuZGVyQnVmZmVycyhfcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycyk6IHZvaWQge1xyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgaWYgKF9yZW5kZXJCdWZmZXJzKSB7XHJcbiAgICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCBudWxsKTtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbnVsbCk7XHJcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhfcmVuZGVyQnVmZmVycykuZmlsdGVyKF9idWZmZXIgPT4gX2J1ZmZlciBpbnN0YW5jZW9mIFdlYkdMQnVmZmVyKS5mb3JFYWNoKChfYnVmZmVyLCBfaW5kZXgpID0+IHtcclxuICAgICAgICAgIGNyYzMuZGVsZXRlQnVmZmVyKF9idWZmZXIpO1xyXG4gICAgICAgICAgY3JjMy5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoX2luZGV4KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgbmFtZXNwYWNlIFBhcnRpY2xlRGF0YSB7XHJcblxyXG4gICAgZXhwb3J0IGVudW0gRlVOQ1RJT04ge1xyXG4gICAgICAvLyBWQUxVRSA9IFwidmFsdWVcIixcclxuICAgICAgQURESVRJT04gPSBcImFkZGl0aW9uXCIsXHJcbiAgICAgIFNVQlRSQUNUSU9OID0gXCJzdWJ0cmFjdGlvblwiLFxyXG4gICAgICBNVUxUSVBMSUNBVElPTiA9IFwibXVsdGlwbGljYXRpb25cIixcclxuICAgICAgRElWSVNJT04gPSBcImRpdmlzaW9uXCIsXHJcbiAgICAgIE1PRFVMTyA9IFwibW9kdWxvXCIsXHJcbiAgICAgIFBPV0VSID0gXCJwb3dlclwiLFxyXG4gICAgICBQT0xZTk9NSUFMMyA9IFwicG9seW5vbWlhbDNcIixcclxuICAgICAgU1FVQVJFX1JPT1QgPSBcInNxdWFyZVJvb3RcIixcclxuICAgICAgUkFORE9NID0gXCJyYW5kb21cIixcclxuICAgICAgUkFORE9NX1JBTkdFID0gXCJyYW5kb21SYW5nZVwiXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNvbnN0IEZVTkNUSU9OX01JTklNVU1fUEFSQU1FVEVSUzogeyBba2V5IGluIFBhcnRpY2xlRGF0YS5GVU5DVElPTl06IG51bWJlciB9ID0ge1xyXG4gICAgICAvLyBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlZBTFVFXTogMSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5BRERJVElPTl06IDIsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uU1VCVFJBQ1RJT05dOiAyLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLk1VTFRJUExJQ0FUSU9OXTogMixcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5ESVZJU0lPTl06IDIsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uTU9EVUxPXTogMixcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5QT1dFUl06IDIsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uUE9MWU5PTUlBTDNdOiA1LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlNRVUFSRV9ST09UXTogMSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5SQU5ET01dOiAxLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlJBTkRPTV9SQU5HRV06IDNcclxuICAgIH07XHJcblxyXG4gICAgZXhwb3J0IGNvbnN0IFBSRURFRklORURfVkFSSUFCTEVTOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgICBzeXN0ZW1EdXJhdGlvbjogXCJ1X2ZQYXJ0aWNsZVN5c3RlbUR1cmF0aW9uXCIsXHJcbiAgICAgIHN5c3RlbVNpemU6IFwidV9mUGFydGljbGVTeXN0ZW1TaXplXCIsXHJcbiAgICAgIHN5c3RlbVRpbWU6IFwidV9mUGFydGljbGVTeXN0ZW1UaW1lXCIsXHJcbiAgICAgIHBhcnRpY2xlSWQ6IFwiZlBhcnRpY2xlSWRcIlxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXBpbGVzIHBhcnRpY2xlIHN5c3RlbSBzaGFkZXJzICh7QGxpbmsgU2hhZGVyUGFydGljbGVTeXN0ZW19KSBmcm9tIHNoYWRlciB1bml2ZXJzYWwgZGVyaXZhdGVzIGZvciBXZWJHTFxyXG4gICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyMlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtIGV4dGVuZHMgUmVuZGVySW5qZWN0b3JTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBGVU5DVElPTlM6IHsgW2tleSBpbiBQYXJ0aWNsZURhdGEuRlVOQ1RJT05dOiBGdW5jdGlvbiB9ID0ge1xyXG4gICAgICAvLyBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlZBTFVFXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAvLyAgIHJldHVybiBgKCR7X3BhcmFtZXRlcnNbMF19KWA7XHJcbiAgICAgIC8vIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uQURESVRJT05dOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGAoJHtfcGFyYW1ldGVycy5yZWR1Y2UoKF9hY2N1bXVsYXRvcjogc3RyaW5nLCBfdmFsdWU6IHN0cmluZykgPT4gYCR7X2FjY3VtdWxhdG9yfSArICR7X3ZhbHVlfWApfSlgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlNVQlRSQUNUSU9OXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBgKCR7X3BhcmFtZXRlcnMucmVkdWNlKChfYWNjdW11bGF0b3I6IHN0cmluZywgX3ZhbHVlOiBzdHJpbmcpID0+IGAke19hY2N1bXVsYXRvcn0gLSAke192YWx1ZX1gKX0pYDtcclxuICAgICAgfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5NVUxUSVBMSUNBVElPTl06IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICByZXR1cm4gYCgke19wYXJhbWV0ZXJzLnJlZHVjZSgoX2FjY3VtdWxhdG9yOiBzdHJpbmcsIF92YWx1ZTogc3RyaW5nKSA9PiBgJHtfYWNjdW11bGF0b3J9ICogJHtfdmFsdWV9YCl9KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uRElWSVNJT05dOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGAoJHtfcGFyYW1ldGVyc1swXX0gLyAke19wYXJhbWV0ZXJzWzFdfSlgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLk1PRFVMT106IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICByZXR1cm4gYCgke19wYXJhbWV0ZXJzLnJlZHVjZSgoX2FjY3VtdWxhdG9yOiBzdHJpbmcsIF92YWx1ZTogc3RyaW5nKSA9PiBgbW9kKCR7X2FjY3VtdWxhdG9yfSwgJHtfdmFsdWV9KWApfSlgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlBPV0VSXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBgcG93KCR7X3BhcmFtZXRlcnNbMF19LCAke19wYXJhbWV0ZXJzWzFdfSlgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlBPTFlOT01JQUwzXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIGxldCB4OiBzdHJpbmcgPSBfcGFyYW1ldGVyc1swXTtcclxuICAgICAgICBsZXQgYTogc3RyaW5nID0gX3BhcmFtZXRlcnNbMV07XHJcbiAgICAgICAgbGV0IGI6IHN0cmluZyA9IF9wYXJhbWV0ZXJzWzJdO1xyXG4gICAgICAgIGxldCBjOiBzdHJpbmcgPSBfcGFyYW1ldGVyc1szXTtcclxuICAgICAgICBsZXQgZDogc3RyaW5nID0gX3BhcmFtZXRlcnNbNF07XHJcbiAgICAgICAgcmV0dXJuIGAoJHthfSAqIHBvdygke3h9LCAzLjApICsgJHtifSAqIHBvdygke3h9LCAyLjApICsgJHtjfSAqICR7eH0gKyAke2R9KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uU1FVQVJFX1JPT1RdOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgbGV0IHg6IHN0cmluZyA9IF9wYXJhbWV0ZXJzWzBdO1xyXG4gICAgICAgIHJldHVybiBgc3FydCgke3h9KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uUkFORE9NXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBgZmV0Y2hSYW5kb21OdW1iZXIoaW50KCR7X3BhcmFtZXRlcnNbMF19KSwgaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUsIGlQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNMZW5ndGgpYDtcclxuICAgICAgfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5SQU5ET01fUkFOR0VdOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGAoJHtSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLkZVTkNUSU9OU1tcInJhbmRvbVwiXShfcGFyYW1ldGVycyl9ICogKCR7X3BhcmFtZXRlcnNbMl19IC0gJHtfcGFyYW1ldGVyc1sxXX0pICsgJHtfcGFyYW1ldGVyc1sxXX0pYDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgc3VwZXIuZGVjb3JhdGUoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcImdldFZlcnRleFNoYWRlclNvdXJjZVwiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uZ2V0VmVydGV4U2hhZGVyU291cmNlXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJnZXRGcmFnbWVudFNoYWRlclNvdXJjZVwiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2VcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgdmVydGV4IHNoYWRlciBvZiB0aGUge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtfSBmcm9tIHRoZSBzZXQge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtLmRhdGF9IGFuZCB0aGUgb3JpZ2luYWwge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtLnZlcnRleFNoYWRlclNvdXJjZX0uXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0VmVydGV4U2hhZGVyU291cmNlKHRoaXM6IFNoYWRlclBhcnRpY2xlU3lzdGVtKTogc3RyaW5nIHtcclxuICAgICAgbGV0IGRhdGE6IFBhcnRpY2xlRGF0YS5TeXN0ZW0gPSB0aGlzLmRhdGE7XHJcbiAgICAgIGxldCBtdHhMb2NhbDogUGFydGljbGVEYXRhLlRyYW5zZm9ybWF0aW9uW10gPSBkYXRhPy5tdHhMb2NhbDtcclxuICAgICAgbGV0IG10eFdvcmxkOiBQYXJ0aWNsZURhdGEuVHJhbnNmb3JtYXRpb25bXSA9IGRhdGE/Lm10eFdvcmxkO1xyXG5cclxuICAgICAgbGV0IHNvdXJjZTogc3RyaW5nID0gdGhpcy52ZXJ0ZXhTaGFkZXJTb3VyY2VcclxuICAgICAgICAucmVwbGFjZShcIiN2ZXJzaW9uIDMwMCBlc1wiLCBgI3ZlcnNpb24gMzAwIGVzXFxuI2RlZmluZSAke3RoaXMuZGVmaW5lWzBdfSR7ZGF0YS5jb2xvciA/IFwiXFxuI2RlZmluZSBQQVJUSUNMRV9DT0xPUlwiIDogXCJcIn1gKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokdmFyaWFibGVzKi9cIiwgUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZVZhcmlhYmxlcyhkYXRhPy52YXJpYWJsZXMsIGRhdGE/LnZhcmlhYmxlTmFtZXMpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4TG9jYWwqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlVHJhbnNmb3JtYXRpb25zKG10eExvY2FsLCBcIkxvY2FsXCIpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4TG9jYWwqL1wiLCBtdHhMb2NhbCAmJiBtdHhMb2NhbC5sZW5ndGggPiAwID8gXCIqIG10eExvY2FsXCIgOiBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4V29ybGQqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlVHJhbnNmb3JtYXRpb25zKG10eFdvcmxkLCBcIldvcmxkXCIpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4V29ybGQqL1wiLCBtdHhXb3JsZCAmJiBtdHhXb3JsZC5sZW5ndGggPiAwID8gXCJtdHhXb3JsZCAqXCIgOiBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlQWxsKFwiLyokY29sb3IqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlQ29sb3IoZGF0YT8uY29sb3IpKTtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBmcmFnbWVudCBzaGFkZXIgb2YgdGhlIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbX0gZnJvbSB0aGUgc2V0IHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS5kYXRhfSBhbmQgdGhlIG9yaWdpbmFsIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS5mcmFnbWVudFNoYWRlclNvdXJjZX0uXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UodGhpczogU2hhZGVyUGFydGljbGVTeXN0ZW0pOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5mcmFnbWVudFNoYWRlclNvdXJjZS5yZXBsYWNlKFwiI3ZlcnNpb24gMzAwIGVzXCIsIGAjdmVyc2lvbiAzMDAgZXNcXG4jZGVmaW5lICR7dGhpcy5kZWZpbmVbMF19JHt0aGlzLmRhdGEuY29sb3IgPyBcIlxcbiNkZWZpbmUgUEFSVElDTEVfQ09MT1JcIiA6IFwiXCJ9YClcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gY29kZSBnZW5lcmF0aW9uXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVWYXJpYWJsZXMoX3ZhcmlhYmxlczogUGFydGljbGVEYXRhLlN5c3RlbVtcInZhcmlhYmxlc1wiXSwgX3ZhcmlhYmxlTmFtZXM6IFBhcnRpY2xlRGF0YS5TeXN0ZW1bXCJ2YXJpYWJsZU5hbWVzXCJdKTogc3RyaW5nIHtcclxuICAgICAgaWYgKCFfdmFyaWFibGVzKSByZXR1cm4gXCJcIjtcclxuXHJcbiAgICAgIHJldHVybiBfdmFyaWFibGVzXHJcbiAgICAgICAgLm1hcCgoX3ZhcmlhYmxlLCBfaW5kZXgpID0+ICh7IG5hbWU6IFwiZlBhcnRpY2xlU3lzdGVtVmFyaWFibGVfXCIgKyBfdmFyaWFibGVOYW1lc1tfaW5kZXhdLCB2YWx1ZTogUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUV4cHJlc3Npb24oX3ZhcmlhYmxlKSB9KSlcclxuICAgICAgICAubWFwKF92YXJpYWJsZSA9PiBgZmxvYXQgJHtfdmFyaWFibGUubmFtZX0gPSAke192YXJpYWJsZS52YWx1ZX07YClcclxuICAgICAgICAucmVkdWNlKChfYWNjdW11bGF0b3I6IHN0cmluZywgX2NvZGU6IHN0cmluZykgPT4gYCR7X2FjY3VtdWxhdG9yfVxcbiR7X2NvZGV9YCwgXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVUcmFuc2Zvcm1hdGlvbnMoX3RyYW5zZm9ybWF0aW9uczogUGFydGljbGVEYXRhLlN5c3RlbVtcIm10eExvY2FsXCJdLCBfbG9jYWxPcldvcmxkOiBcIkxvY2FsXCIgfCBcIldvcmxkXCIpOiBzdHJpbmcge1xyXG4gICAgICBpZiAoIV90cmFuc2Zvcm1hdGlvbnMgfHwgX3RyYW5zZm9ybWF0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIFwiXCI7XHJcblxyXG4gICAgICBsZXQgdHJhbnNmb3JtYXRpb25zOiBbUGFydGljbGVEYXRhLlRyYW5zZm9ybWF0aW9uW1widHJhbnNmb3JtYXRpb25cIl0sIHN0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBfdHJhbnNmb3JtYXRpb25zXHJcbiAgICAgICAgLm1hcChfZGF0YSA9PiB7XHJcbiAgICAgICAgICBsZXQgaXNTY2FsZTogYm9vbGVhbiA9IF9kYXRhLnRyYW5zZm9ybWF0aW9uID09PSBcInNjYWxlXCI7XHJcbiAgICAgICAgICBsZXQgW3gsIHksIHpdID0gW19kYXRhLnBhcmFtZXRlcnNbMF0sIF9kYXRhLnBhcmFtZXRlcnNbMV0sIF9kYXRhLnBhcmFtZXRlcnNbMl1dXHJcbiAgICAgICAgICAgIC5tYXAoKF92YWx1ZSkgPT4gX3ZhbHVlID8gUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUV4cHJlc3Npb24oX3ZhbHVlKSA6IChpc1NjYWxlID8gXCIxLjBcIiA6IFwiMC4wXCIpKSBhcyBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XHJcblxyXG4gICAgICAgICAgcmV0dXJuIFtfZGF0YS50cmFuc2Zvcm1hdGlvbiwgeCwgeSwgel07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBsZXQgY29kZTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgY29kZSArPSB0cmFuc2Zvcm1hdGlvbnNcclxuICAgICAgICAubWFwKChbX3RyYW5zZm9ybWF0aW9uLCBfeCwgX3ksIF96XSwgX2luZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGxldCByb3RhdGVJZDogc3RyaW5nID0gX2luZGV4ICsgX2xvY2FsT3JXb3JsZDtcclxuICAgICAgICAgIGlmIChfdHJhbnNmb3JtYXRpb24gPT0gXCJyb3RhdGVcIikge1xyXG4gICAgICAgICAgICBsZXQgdG9SYWRpYW5zOiAoX3ZhbHVlOiBzdHJpbmcpID0+IHN0cmluZyA9IChfdmFsdWU6IHN0cmluZykgPT4gYCR7X3ZhbHVlfSAqICR7Q2FsYy5kZWcycmFkfWA7XHJcbiAgICAgICAgICAgIHJldHVybiBgZmxvYXQgZlhSYWRpYW5zJHtyb3RhdGVJZH0gPSAke3RvUmFkaWFucyhfeCl9O1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZZUmFkaWFucyR7cm90YXRlSWR9ID0gJHt0b1JhZGlhbnMoX3kpfTtcclxuICAgICAgICAgICAgICBmbG9hdCBmWlJhZGlhbnMke3JvdGF0ZUlkfSA9ICR7dG9SYWRpYW5zKF96KX07XHJcbiAgICAgICAgICAgICAgZmxvYXQgZlNpblgke3JvdGF0ZUlkfSA9IHNpbihmWFJhZGlhbnMke3JvdGF0ZUlkfSk7XHJcbiAgICAgICAgICAgICAgZmxvYXQgZkNvc1gke3JvdGF0ZUlkfSA9IGNvcyhmWFJhZGlhbnMke3JvdGF0ZUlkfSk7IFxyXG4gICAgICAgICAgICAgIGZsb2F0IGZTaW5ZJHtyb3RhdGVJZH0gPSBzaW4oZllSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZDb3NZJHtyb3RhdGVJZH0gPSBjb3MoZllSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZTaW5aJHtyb3RhdGVJZH0gPSBzaW4oZlpSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZDb3NaJHtyb3RhdGVJZH0gPSBjb3MoZlpSYWRpYW5zJHtyb3RhdGVJZH0pO1xcbmA7XHJcbiAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmlsdGVyKChfdHJhbnNmb3JtYXRpb246IHN0cmluZykgPT4gX3RyYW5zZm9ybWF0aW9uICE9IFwiXCIpXHJcbiAgICAgICAgLnJlZHVjZSgoX2FjY3VtdWxhdG9yOiBzdHJpbmcsIF9jb2RlOiBzdHJpbmcpID0+IGAke19hY2N1bXVsYXRvcn1cXG4ke19jb2RlfWAsIFwiXCIpO1xyXG4gICAgICBjb2RlICs9IFwiXFxuXCI7XHJcblxyXG4gICAgICBjb2RlICs9IGBtYXQ0IG10eCR7X2xvY2FsT3JXb3JsZH0gPSBgO1xyXG4gICAgICBjb2RlICs9IHRyYW5zZm9ybWF0aW9uc1xyXG4gICAgICAgIC5tYXAoKFtfdHJhbnNmb3JtYXRpb24sIF94LCBfeSwgX3pdLCBfaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgbGV0IHJvdGF0ZUlkOiBzdHJpbmcgPSBfaW5kZXggKyBfbG9jYWxPcldvcmxkO1xyXG4gICAgICAgICAgc3dpdGNoIChfdHJhbnNmb3JtYXRpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBcInRyYW5zbGF0ZVwiOlxyXG4gICAgICAgICAgICAgIHJldHVybiBgbWF0NChcclxuICAgICAgICAgICAgICAxLjAsIDAuMCwgMC4wLCAwLjAsXHJcbiAgICAgICAgICAgICAgMC4wLCAxLjAsIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAxLjAsIDAuMCxcclxuICAgICAgICAgICAgICAke194fSwgJHtfeX0sICR7X3p9LCAxLjApYDtcclxuICAgICAgICAgICAgY2FzZSBcInJvdGF0ZVwiOlxyXG4gICAgICAgICAgICAgIHJldHVybiBgbWF0NChcclxuICAgICAgICAgICAgICBmQ29zWiR7cm90YXRlSWR9ICogZkNvc1kke3JvdGF0ZUlkfSwgZlNpbloke3JvdGF0ZUlkfSAqIGZDb3NZJHtyb3RhdGVJZH0sIC1mU2luWSR7cm90YXRlSWR9LCAwLjAsXHJcbiAgICAgICAgICAgICAgZkNvc1oke3JvdGF0ZUlkfSAqIGZTaW5ZJHtyb3RhdGVJZH0gKiBmU2luWCR7cm90YXRlSWR9IC0gZlNpbloke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0sIGZTaW5aJHtyb3RhdGVJZH0gKiBmU2luWSR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSArIGZDb3NaJHtyb3RhdGVJZH0gKiBmQ29zWCR7cm90YXRlSWR9LCBmQ29zWSR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSwgMC4wLFxyXG4gICAgICAgICAgICAgIGZDb3NaJHtyb3RhdGVJZH0gKiBmU2luWSR7cm90YXRlSWR9ICogZkNvc1gke3JvdGF0ZUlkfSArIGZTaW5aJHtyb3RhdGVJZH0gKiBmU2luWCR7cm90YXRlSWR9LCBmU2luWiR7cm90YXRlSWR9ICogZlNpblkke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0gLSBmQ29zWiR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSwgZkNvc1kke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0sIDAuMCxcclxuICAgICAgICAgICAgICAwLjAsIDAuMCwgMC4wLCAxLjBcclxuICAgICAgICAgICAgICApYDtcclxuICAgICAgICAgICAgY2FzZSBcInNjYWxlXCI6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGBtYXQ0KFxyXG4gICAgICAgICAgICAgICR7X3h9LCAwLjAsIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgJHtfeX0sIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAke196fSwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDEuMFxyXG4gICAgICAgICAgICAgIClgO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X3RyYW5zZm9ybWF0aW9ufVwiIGlzIG5vdCBhIHRyYW5zZm9ybWF0aW9uYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5yZWR1Y2UoKF9hY2N1bXVsYXRvcjogc3RyaW5nLCBfY29kZTogc3RyaW5nKSA9PiBgJHtfYWNjdW11bGF0b3J9ICogXFxuJHtfY29kZX1gKTtcclxuICAgICAgY29kZSArPSBcIjtcXG5cIjtcclxuXHJcbiAgICAgIHJldHVybiBjb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlQ29sb3IoX2NvbG9yOiBQYXJ0aWNsZURhdGEuRXhwcmVzc2lvbltdKTogc3RyaW5nIHtcclxuICAgICAgaWYgKCFfY29sb3IpIHJldHVybiBcIlwiO1xyXG5cclxuICAgICAgbGV0IHJnYmE6IHN0cmluZyA9IFtfY29sb3JbMF0sIF9jb2xvclsxXSwgX2NvbG9yWzJdLCBfY29sb3JbM11dXHJcbiAgICAgICAgLm1hcCgoX3ZhbHVlKTogc3RyaW5nID0+IF92YWx1ZSA/IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uZ2VuZXJhdGVFeHByZXNzaW9uKF92YWx1ZSkgOiBcIjEuMFwiKVxyXG4gICAgICAgIC5qb2luKFwiLCBcIik7XHJcblxyXG4gICAgICByZXR1cm4gYHZlYzQoJHtyZ2JhfSk7YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUV4cHJlc3Npb24oX2V4cHJlc3Npb246IFBhcnRpY2xlRGF0YS5FeHByZXNzaW9uKTogc3RyaW5nIHtcclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc0Z1bmN0aW9uKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCBwYXJhbWV0ZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHBhcmFtIG9mIF9leHByZXNzaW9uLnBhcmFtZXRlcnMpIHtcclxuICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlRXhwcmVzc2lvbihwYXJhbSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUZ1bmN0aW9uKF9leHByZXNzaW9uLmZ1bmN0aW9uLCBwYXJhbWV0ZXJzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc1ZhcmlhYmxlKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIHJldHVybiBQYXJ0aWNsZURhdGEuUFJFREVGSU5FRF9WQVJJQUJMRVNbX2V4cHJlc3Npb24udmFsdWVdIHx8IFwiZlBhcnRpY2xlU3lzdGVtVmFyaWFibGVfXCIgKyBfZXhwcmVzc2lvbi52YWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc0NvbnN0YW50KF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCB2YWx1ZTogc3RyaW5nID0gX2V4cHJlc3Npb24udmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm4gYCR7dmFsdWV9JHt2YWx1ZS5pbmNsdWRlcyhcIi5cIikgPyBcIlwiIDogXCIuMFwifWA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChQYXJ0aWNsZURhdGEuaXNDb2RlKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCBjb2RlOiBzdHJpbmcgPSBfZXhwcmVzc2lvbi5jb2RlXHJcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxiW2EtekEtel0rXFx3Kig/IVxcKClcXGIvZywgKF9tYXRjaCkgPT4gUGFydGljbGVEYXRhLlBSRURFRklORURfVkFSSUFCTEVTW19tYXRjaF0gfHwgXCJmUGFydGljbGVTeXN0ZW1WYXJpYWJsZV9cIiArIF9tYXRjaClcclxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8oPzwhXFwuKVxcYlxcZCtcXGIoPyFcXC4pL2csIChfbWF0Y2gpID0+IF9tYXRjaCArIFwiLjBcIik7XHJcbiAgICAgICAgY29kZSA9IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0ucmVwbGFjZUZ1bmN0aW9ucyhjb2RlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBpbnZhbGlkIG5vZGUgc3RydWN0dXJlIGluIHBhcnRpY2xlIHN5c3RlbSBzZXJpYWxpemF0aW9uYDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUZ1bmN0aW9uKF9mdW5jdGlvbjogUGFydGljbGVEYXRhLkZVTkNUSU9OLCBfcGFyYW1ldGVyczogc3RyaW5nW10pOiBzdHJpbmcge1xyXG4gICAgICBpZiAoX3BhcmFtZXRlcnMubGVuZ3RoIDwgUGFydGljbGVEYXRhLkZVTkNUSU9OX01JTklNVU1fUEFSQU1FVEVSU1tfZnVuY3Rpb25dKVxyXG4gICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X2Z1bmN0aW9ufVwiIG5lZWRzIGF0IGxlYXN0ICR7UGFydGljbGVEYXRhLkZVTkNUSU9OX01JTklNVU1fUEFSQU1FVEVSU1tfZnVuY3Rpb25dfSBwYXJhbWV0ZXJzYDtcclxuICAgICAgaWYgKE9iamVjdC52YWx1ZXMoUGFydGljbGVEYXRhLkZVTkNUSU9OKS5pbmNsdWRlcyhfZnVuY3Rpb24pKVxyXG4gICAgICAgIHJldHVybiBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLkZVTkNUSU9OU1tfZnVuY3Rpb25dKF9wYXJhbWV0ZXJzKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X2Z1bmN0aW9ufVwiIGlzIG5vdCBhbiBvcGVyYXRpb25gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlcGxhY2VGdW5jdGlvbnMoX2NvZGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBmdW5jdGlvblJlZ2V4OiBSZWdFeHAgPSAvXFxiW2EtekEtel9dK1xcdypcXCgvZztcclxuICAgICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXk7XHJcbiAgICAgIHdoaWxlICgobWF0Y2ggPSBmdW5jdGlvblJlZ2V4LmV4ZWMoX2NvZGUpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGZ1bmN0aW9uR2VuZXJhdG9yOiBGdW5jdGlvbiA9IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uRlVOQ1RJT05TWzxQYXJ0aWNsZURhdGEuRlVOQ1RJT04+bWF0Y2hbMF0uc2xpY2UoMCwgLTEpXTtcclxuICAgICAgICBpZiAoIWZ1bmN0aW9uR2VuZXJhdG9yKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGxldCBjb21tYUluZGljZXM6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgbGV0IG9wZW5CcmFja2V0czogbnVtYmVyID0gMTtcclxuICAgICAgICBsZXQgYXJndW1lbnRzTGFzdEluZGV4OiBudW1iZXIgPSBmdW5jdGlvblJlZ2V4Lmxhc3RJbmRleDtcclxuICAgICAgICB3aGlsZSAob3BlbkJyYWNrZXRzID4gMCkge1xyXG4gICAgICAgICAgc3dpdGNoIChfY29kZVthcmd1bWVudHNMYXN0SW5kZXhdKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCIoXCI6XHJcbiAgICAgICAgICAgICAgb3BlbkJyYWNrZXRzKys7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCIpXCI6XHJcbiAgICAgICAgICAgICAgb3BlbkJyYWNrZXRzLS07XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCIsXCI6XHJcbiAgICAgICAgICAgICAgaWYgKG9wZW5CcmFja2V0cyA9PSAxKVxyXG4gICAgICAgICAgICAgICAgY29tbWFJbmRpY2VzLnB1c2goYXJndW1lbnRzTGFzdEluZGV4KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFyZ3VtZW50c0xhc3RJbmRleCsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGFyZ3M6IHN0cmluZ1tdID1cclxuICAgICAgICAgIFtmdW5jdGlvblJlZ2V4Lmxhc3RJbmRleCAtIDEsIC4uLmNvbW1hSW5kaWNlcywgYXJndW1lbnRzTGFzdEluZGV4IC0gMV0ucmVkdWNlPHN0cmluZ1tdPigoX2FjY3VtdWxhdG9yLCBfcG9zaXRpb24sIF9pbmRleCwgX3Bvc2l0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gX2luZGV4ID09IF9wb3NpdGlvbnMubGVuZ3RoIC0gMSA/XHJcbiAgICAgICAgICAgICAgX2FjY3VtdWxhdG9yIDpcclxuICAgICAgICAgICAgICBfYWNjdW11bGF0b3IuY29uY2F0KF9jb2RlLnNsaWNlKF9wb3NpdGlvbiArIDEsIF9wb3NpdGlvbnNbX2luZGV4ICsgMV0pLnRyaW0oKSk7XHJcbiAgICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uUmVnZXgubGFzdEluZGV4ID0gbWF0Y2guaW5kZXg7XHJcbiAgICAgICAgX2NvZGUgPSBgJHtfY29kZS5zbGljZSgwLCBtYXRjaC5pbmRleCl9KCR7ZnVuY3Rpb25HZW5lcmF0b3IoYXJncyl9KSR7X2NvZGUuc2xpY2UoYXJndW1lbnRzTGFzdEluZGV4KX1gO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfY29kZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCdWZmZXJzIHRoZSByYW5kb20gbnVtYmVyIGRhdGEgZm9yIHRoZSBwYXJ0aWNsZSBzeXN0ZW0gKHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX0pIGludG8gYSBXZWJHTCBUZXh0dXJlXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVzZVJlbmRlckRhdGFcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnVzZVJlbmRlckRhdGFcclxuICAgICAgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcImRlbGV0ZVJlbmRlckRhdGFcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLmRlbGV0ZVJlbmRlckRhdGFcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB1c2VSZW5kZXJEYXRhKHRoaXM6IENvbXBvbmVudFBhcnRpY2xlU3lzdGVtKTogdm9pZCB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBpZiAodGhpcy5yZW5kZXJEYXRhKSB7XHJcbiAgICAgICAgLy8gYnVmZmVycyBleGlzdFxyXG4gICAgICAgIGNyYzMuYWN0aXZlVGV4dHVyZShURVhUVVJFX0xPQ0FUSU9OLlBBUlRJQ0xFLlVOSVQpOyAvLyBBVFRFTlRJT04hOiBjaGFuZ2luZyB0aGlzIGlkIHJlcXVpcmVzIGNoYW5naW5nIG9mIGNvcnJlc3BvbmRpbmcgaWQgaW4gcGFydGljbGUgcmVuZGVyIG1ldGhvZCwgdXNlIGN0cmwgKyBzaGlmdCArIGYgc2VhcmNoIVxyXG4gICAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCB0aGlzLnJlbmRlckRhdGEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmU6IFdlYkdMVGV4dHVyZSA9IFJlbmRlci5hc3NlcnQ8V2ViR0xUZXh0dXJlPihjcmMzLmNyZWF0ZVRleHR1cmUoKSk7XHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIHRleHR1cmUpO1xyXG5cclxuICAgICAgICBsZXQgdGV4dHVyZVNpemU6IG51bWJlciA9IE1hdGguY2VpbChNYXRoLnNxcnQodGhpcy5zaXplKSk7XHJcbiAgICAgICAgdGV4dHVyZVNpemUgPSBNYXRoLm1pbih0ZXh0dXJlU2l6ZSwgY3JjMy5nZXRQYXJhbWV0ZXIoY3JjMy5NQVhfVEVYVFVSRV9TSVpFKSk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IHVzZSBpbnRlcm5hbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciwgYWRkaXRpb25hbGx5IG1heWJlIHVzZSBhIHNlZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byByZWNyZWF0ZSB0aGUgc2FtZSByYW5kb20gbnVtYmVyc1xyXG4gICAgICAgIGxldCByYW5kb21OdW1iZXJzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0ZXh0dXJlU2l6ZSAqIHRleHR1cmVTaXplOyBpKyspXHJcbiAgICAgICAgICByYW5kb21OdW1iZXJzLnB1c2goTWF0aC5yYW5kb20oKSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjcmMzLnRleEltYWdlMkQoXHJcbiAgICAgICAgICAgIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SMzJGLCB0ZXh0dXJlU2l6ZSwgdGV4dHVyZVNpemUsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZMT0FULFxyXG4gICAgICAgICAgICBGbG9hdDMyQXJyYXkuZnJvbShyYW5kb21OdW1iZXJzKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICAgIERlYnVnLmVycm9yKF9lcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoY3JjMy5URVhUVVJFXzJELCBjcmMzLlRFWFRVUkVfTUlOX0ZJTFRFUiwgY3JjMy5ORUFSRVNUKTtcclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoY3JjMy5URVhUVVJFXzJELCBjcmMzLlRFWFRVUkVfTUFHX0ZJTFRFUiwgY3JjMy5ORUFSRVNUKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJEYXRhID0gdGV4dHVyZTtcclxuXHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIG51bGwpO1xyXG5cclxuICAgICAgICB0aGlzLnVzZVJlbmRlckRhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZGVsZXRlUmVuZGVyRGF0YSh0aGlzOiBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMucmVuZGVyRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBudWxsKTtcclxuICAgICAgY3JjMy5kZWxldGVUZXh0dXJlKHRoaXMucmVuZGVyRGF0YSk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLnJlbmRlckRhdGE7XHJcbiAgICAgIFxyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgb2JqZWN0cyB0aGF0IGNhbiBiZSByZWN5Y2xlZCwgaS5lLiB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gYnkgcmV1c2luZyB0aGUgb2JqZWN0IGluc3RlYWQgb2YgcmVwbGFjaW5nIGl0IHdpdGggYSBuZXcgb25lLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgUmVjeWNhYmxlIHtcclxuICAgIC8qKlxyXG4gICAgICogUmVjeWNsZXMgdGhlIG9iamVjdCBmb3IgdGhlIG5leHQgcmV1c2UgYnkgc2V0dGluZyBpdHMgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHN0YXRlcy5cclxuICAgICAqL1xyXG4gICAgcmVjeWNsZSgpOiB2b2lkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS2VlcHMgYSBkZXBvdCBvZiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBmb3IgcmV1c2UsIHNvcnRlZCBieSB0eXBlLiAgXHJcbiAgICogVXNpbmcge0BsaW5rIFJlY3ljbGVyfSByZWR1Y2VzIGxvYWQgb24gdGhlIGNhcmJhZ2UgY29sbGVjdG9yIGFuZCB0aHVzIHN1cHBvcnRzIHNtb290aCBwZXJmb3JtYW5jZS5cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9SZWN5Y2xlclxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWN5Y2xlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBkZXBvdDogeyBbdHlwZTogc3RyaW5nXTogT2JqZWN0W10gfSA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2hlcyBhbiBvYmplY3Qgb2YgdGhlIHJlcXVlc3RlZCB0eXBlIGZyb20gdGhlIGRlcG90LCBjYWxscyBpdHMgcmVjeWNsZS1tZXRob2QgYW5kIHJldHVybnMgaXQuXHJcbiAgICAgKiBJZiB0aGUgZGVwb3QgZm9yIHRoYXQgdHlwZSBpcyBlbXB0eSBpdCByZXR1cm5zIGEgbmV3IG9iamVjdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUuXHJcbiAgICAgKiBAcGFyYW0gX3QgVGhlIGNsYXNzIGlkZW50aWZpZXIgb2YgdGhlIGRlc2lyZWQgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBSZWN5Y2FibGUgfCBSZWN5Y2FibGVBcnJheTxUPj4oX3Q6IG5ldyAoKSA9PiBUKTogVCB7XHJcbiAgICAgIGxldCBrZXk6IHN0cmluZyA9IF90Lm5hbWU7XHJcbiAgICAgIGxldCBpbnN0YW5jZXM6IE9iamVjdFtdID0gUmVjeWNsZXIuZGVwb3Rba2V5XTtcclxuICAgICAgaWYgKGluc3RhbmNlcyAmJiBpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBpbnN0YW5jZTogVCA9IDxUPmluc3RhbmNlcy5wb3AoKTtcclxuICAgICAgICBpbnN0YW5jZS5yZWN5Y2xlKCk7XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICByZXR1cm4gbmV3IF90KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGZXRjaGVzIGFuIG9iamVjdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgZnJvbSB0aGUgZGVwb3QgYW5kIHJldHVybnMgaXQuIOKaoO+4jyoqRE9FUyBOT1QqKiBjYWxsIGl0cyByZWN5Y2xlLW1ldGhvZC5cclxuICAgICAqIEZhc3RlciB0aGFuIHtAbGluayBSZWN5Y2xlci5nZXR9LCBidXQgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXV0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJldXNlPFQgZXh0ZW5kcyBPYmplY3Q+KF90OiBuZXcgKCkgPT4gVCk6IFQge1xyXG4gICAgICByZXR1cm4gPFQ+UmVjeWNsZXIuZGVwb3RbX3QubmFtZV0/LnBvcCgpID8/IG5ldyBfdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb2YgdGhlIHJlcXVlc3RlZCB0eXBlIGluIHRoZSBkZXBvdCwgYnV0IGRvZXMgbm90IHJlbW92ZSBpdCB0aGVyZS4gXHJcbiAgICAgKiBJZiBubyBvYmplY3Qgb2YgdGhlIHJlcXVlc3RlZCB0eXBlIHdhcyBpbiB0aGUgZGVwb3QsIG9uZSBpcyBjcmVhdGVkLCBzdG9yZWQgYW5kIGJvcnJvd2VkLlxyXG4gICAgICogRm9yIHNob3J0IHRlcm0gdXNhZ2Ugb2Ygb2JqZWN0cyBpbiBhIGxvY2FsIHNjb3BlLCB3aGVuIHRoZXJlIHdpbGwgYmUgbm8gb3RoZXIgY2FsbCB0byB7QGxpbmsgUmVjeWNsZXIuZ2V0fSwge0BsaW5rIFJlY3ljbGVyLnJldXNlfSBvciB7QGxpbmsgUmVjeWNsZXIuYm9ycm93fSFcclxuICAgICAqIEBwYXJhbSBfdCBUaGUgY2xhc3MgaWRlbnRpZmllciBvZiB0aGUgZGVzaXJlZCBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBib3Jyb3c8VCBleHRlbmRzIFJlY3ljYWJsZT4oX3Q6IG5ldyAoKSA9PiBUKTogVCB7XHJcbiAgICAgIGxldCB0OiBUO1xyXG4gICAgICBsZXQga2V5OiBzdHJpbmcgPSBfdC5uYW1lO1xyXG4gICAgICBsZXQgaW5zdGFuY2VzOiBPYmplY3RbXSA9IFJlY3ljbGVyLmRlcG90W2tleV07XHJcbiAgICAgIGlmICghaW5zdGFuY2VzIHx8IGluc3RhbmNlcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIHQgPSBuZXcgX3QoKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZSh0KTtcclxuICAgICAgICByZXR1cm4gdDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgaW5zdGFuY2U6IFQgPSA8VD5pbnN0YW5jZXNbMF07XHJcbiAgICAgIGluc3RhbmNlLnJlY3ljbGUoKTtcclxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcmVzIHRoZSBvYmplY3QgaW4gdGhlIGRlcG90IGZvciBsYXRlciByZWN5Y2xpbmcuIFVzZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgdGhyb3dpbmcgaW4gb2JqZWN0cyB0aGF0IGFyZSBhYm91dCB0byBsb29zZSBzY29wZSBhbmQgYXJlIG5vdCByZWZlcmVuY2VkIGJ5IGFueSBvdGhlclxyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0b3JlKF9pbnN0YW5jZTogT2JqZWN0KTogdm9pZCB7XHJcbiAgICAgIGxldCBrZXk6IHN0cmluZyA9IF9pbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgICAvL0RlYnVnLmxvZyhrZXkpO1xyXG4gICAgICBsZXQgaW5zdGFuY2VzOiBPYmplY3RbXSA9IFJlY3ljbGVyLmRlcG90W2tleV0gfHwgW107XHJcbiAgICAgIGluc3RhbmNlcy5wdXNoKF9pbnN0YW5jZSk7XHJcbiAgICAgIFJlY3ljbGVyLmRlcG90W2tleV0gPSBpbnN0YW5jZXM7XHJcbiAgICAgIC8vIERlYnVnLmxvZyhgT2JqZWN0TWFuYWdlci5kZXBvdFske2tleX1dOiAke09iamVjdE1hbmFnZXIuZGVwb3Rba2V5XS5sZW5ndGh9YCk7XHJcbiAgICAgIC8vRGVidWcubG9nKHRoaXMuZGVwb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcmVzIHRoZSBwcm92aWRlZCBvYmplY3RzIHVzaW5nIHRoZSB7QGxpbmsgUmVjeWNsZXIuc3RvcmV9IG1ldGhvZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0b3JlTXVsdGlwbGUoLi4uX2luc3RhbmNlczogT2JqZWN0W10pOiB2b2lkIHsgLy8gVE9ETzogbWF5YmUgbWFrZSB0aGlzIHRoZSBkZWZhdWx0IHN0b3JlIG1ldGhvZFxyXG4gICAgICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIF9pbnN0YW5jZXMpXHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUoaW5zdGFuY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1wdHlzIHRoZSBkZXBvdCBvZiBhIGdpdmVuIHR5cGUsIGxlYXZpbmcgdGhlIG9iamVjdHMgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gTWF5IHJlc3VsdCBpbiBhIHNob3J0IHN0YWxsIHdoZW4gbWFueSBvYmplY3RzIHdlcmUgaW5cclxuICAgICAqIEBwYXJhbSBfdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGR1bXA8VD4oX3Q6IG5ldyAoKSA9PiBUKTogdm9pZCB7XHJcbiAgICAgIGxldCBrZXk6IHN0cmluZyA9IF90Lm5hbWU7XHJcbiAgICAgIFJlY3ljbGVyLmRlcG90W2tleV0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtcHR5cyBhbGwgZGVwb3RzLCBsZWF2aW5nIGFsbCBvYmplY3RzIHRvIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gTWF5IHJlc3VsdCBpbiBhIHNob3J0IHN0YWxsIHdoZW4gbWFueSBvYmplY3RzIHdlcmUgaW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkdW1wQWxsKCk6IHZvaWQge1xyXG4gICAgICBSZWN5Y2xlci5kZXBvdCA9IHt9O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyBhbmQgbWFuaXB1bGF0ZXMgYSB0d29kaW1lbnNpb25hbCB2ZWN0b3IgY29tcHJpc2VkIG9mIHRoZSBjb21wb25lbnRzIHggYW5kIHlcclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgICAgICAreVxyXG4gICAqICAgICAgICAgICAgIHxfXyAreFxyXG4gICAqIGBgYFxyXG4gICAqIEBhdXRob3JzIEx1a2FzIFNjaGV1ZXJsZSwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVjdG9yMiBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xyXG4gICAgcHVibGljIHk6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2V0KF94LCBfeSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFN0YXRpY1xyXG4gICAgLyoqIFxyXG4gICAgICogQSBzaG9ydGhhbmQgZm9yIHdyaXRpbmcgYG5ldyBWZWN0b3IyKDAsIDApYC5cclxuICAgICAqIEByZXR1cm5zIEEgbmV3IHZlY3RvciB3aXRoIHRoZSB2YWx1ZXMgKDAsIDApXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgWkVSTygpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoMCwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQSBzaG9ydGhhbmQgZm9yIHdyaXRpbmcgYG5ldyBWZWN0b3IyKF9zY2FsZSwgX3NjYWxlKWAuXHJcbiAgICAgKiBAcGFyYW0gX3NjYWxlIHRoZSBzY2FsZSBvZiB0aGUgdmVjdG9yLiBEZWZhdWx0OiAxXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgT05FKF9zY2FsZTogbnVtYmVyID0gMSk6IFZlY3RvcjIge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjIgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgdmVjdG9yLnNldChfc2NhbGUsIF9zY2FsZSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQSBzaG9ydGhhbmQgZm9yIHdyaXRpbmcgYG5ldyBWZWN0b3IyKHgsIDApYC5cclxuICAgICAqIEBwYXJhbSBfc2NhbGUgVGhlIG51bWJlciB0byB3cml0ZSBpbiB0aGUgeCBjb29yZGluYXRlLiBEZWZhdWx0OiAxXHJcbiAgICAgKiBAcmV0dXJucyBBIG5ldyB2ZWN0b3Igd2l0aCB0aGUgdmFsdWVzIChfc2NhbGUsIDApXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgWChfc2NhbGU6IG51bWJlciA9IDEpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoX3NjYWxlLCAwKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBBIHNob3J0aGFuZCBmb3Igd3JpdGluZyBgbmV3IFZlY3RvcjIoMCwgeSlgLlxyXG4gICAgICogQHBhcmFtIF9zY2FsZSBUaGUgbnVtYmVyIHRvIHdyaXRlIGluIHRoZSB5IGNvb3JkaW5hdGUuIERlZmF1bHQ6IDFcclxuICAgICAqIEByZXR1cm5zIEEgbmV3IHZlY3RvciB3aXRoIHRoZSB2YWx1ZXMgKDAsIF9zY2FsZSlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBZKF9zY2FsZTogbnVtYmVyID0gMSk6IFZlY3RvcjIge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjIgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgdmVjdG9yLnNldCgwLCBfc2NhbGUpO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciB0aHJvdWdoIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBnaXZlbiB2ZWN0b3IgYnkgdGhlIGdpdmVuIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFRSQU5TRk9STUFUSU9OKF92ZWN0b3I6IFZlY3RvcjIsIF9tdHhUcmFuc2Zvcm06IE1hdHJpeDN4MywgX2luY2x1ZGVUcmFuc2xhdGlvbjogYm9vbGVhbiA9IHRydWUpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIGxldCBtOiBGbG9hdDMyQXJyYXkgPSBfbXR4VHJhbnNmb3JtLmdldCgpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KFxyXG4gICAgICAgIG1bMF0gKiBfdmVjdG9yLnggKyBtWzNdICogX3ZlY3Rvci55LFxyXG4gICAgICAgIG1bMV0gKiBfdmVjdG9yLnggKyBtWzRdICogX3ZlY3Rvci55XHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoX2luY2x1ZGVUcmFuc2xhdGlvbilcclxuICAgICAgICB2ZWN0b3IuYWRkKF9tdHhUcmFuc2Zvcm0udHJhbnNsYXRpb24pO1xyXG5cclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB2ZWN0b3Igd2hpY2ggaXMgYSBjb3B5IG9mIHRoZSBnaXZlbiB2ZWN0b3Igc2NhbGVkIHRvIHRoZSBnaXZlbiBsZW5ndGguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTk9STUFMSVpBVElPTihfdmVjdG9yOiBWZWN0b3IyLCBfbGVuZ3RoOiBudW1iZXIgPSAxKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBtYWduaXR1ZGVTcXVhcmVkOiBudW1iZXIgPSBfdmVjdG9yLm1hZ25pdHVkZVNxdWFyZWQ7XHJcbiAgICAgIGlmIChtYWduaXR1ZGVTcXVhcmVkID09IDApXHJcbiAgICAgICAgdGhyb3cgKG5ldyBSYW5nZUVycm9yKFwiSW1wb3NzaWJsZSBub3JtYWxpemF0aW9uXCIpKTtcclxuICAgICAgbGV0IHZlY3RvcjogVmVjdG9yMiA9IF92ZWN0b3IuY2xvbmU7XHJcbiAgICAgIHZlY3Rvci5zY2FsZShfbGVuZ3RoIC8gTWF0aC5zcXJ0KG1hZ25pdHVkZVNxdWFyZWQpKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBuZXcgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gdmVjdG9yIHNjYWxlZCBieSB0aGUgZ2l2ZW4gc2NhbGluZyBmYWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTQ0FMRShfdmVjdG9yOiBWZWN0b3IyLCBfc2NhbGU6IG51bWJlcik6IFZlY3RvcjIge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjIgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgdmVjdG9yLnNldChfdmVjdG9yLnggKiBfc2NhbGUsIF92ZWN0b3IueSAqIF9zY2FsZSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgdmVjdG9yIGF0dGFpbmVkIGJ5IGFkZGl0aW9uIG9mIGFsbCBnaXZlbiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNVTSguLi5fdmVjdG9yczogVmVjdG9yMltdKTogVmVjdG9yMiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICBmb3IgKGxldCB2ZWN0b3Igb2YgX3ZlY3RvcnMpXHJcbiAgICAgICAgcmVzdWx0LnNldChyZXN1bHQueCArIHZlY3Rvci54LCByZXN1bHQueSArIHZlY3Rvci55KTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgc3VidHJhY3Rpb24gb2YgdHdvIHZlY3RvcnMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgRElGRkVSRU5DRShfbWludWVuZDogVmVjdG9yMiwgX3N1YnRyYWhlbmQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoX21pbnVlbmQueCAtIF9zdWJ0cmFoZW5kLngsIF9taW51ZW5kLnkgLSBfc3VidHJhaGVuZC55KTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIFZlY3RvcnMuIER1ZSB0byB0aGVtIGJlaW5nIG9ubHkgMiBEaW1lbnNpb25hbCwgdGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBudW1iZXIsXHJcbiAgICAgKiB3aGljaCBpbXBsaWNpdGx5IGlzIG9uIHRoZSBaIGF4aXMuIEl0IGlzIGFsc28gdGhlIHNpZ25lZCBtYWduaXR1ZGUgb2YgdGhlIHJlc3VsdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDUk9TUyhfYTogVmVjdG9yMiwgX2I6IFZlY3RvcjIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX2EueCAqIF9iLnkgLSBfYS55ICogX2IueDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIHRoZSBkb3Rwcm9kdWN0IG9mIDIgdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBET1QoX2E6IFZlY3RvcjIsIF9iOiBWZWN0b3IyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIF9hLnggKiBfYi54ICsgX2EueSAqIF9iLnk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBvcnRob2dvbmFsIHZlY3RvciB0byB0aGUgZ2l2ZW4gdmVjdG9yLiBSb3RhdGVzIGNvdW50ZXJjbG9ja3dpc2UgYnkgZGVmYXVsdC5cclxuICAgICAqIGBgYHRleHRcclxuICAgICAqIOKGkSA9PiDihpAgPT4g4oaTID0+IOKGkiA9PiDihpFcclxuICAgICAqIGBgYFxyXG4gICAgICogQHBhcmFtIF92ZWN0b3IgVmVjdG9yIHRvIGdldCB0aGUgb3J0aG9nb25hbCBlcXVpdmFsZW50IG9mXHJcbiAgICAgKiBAcGFyYW0gX2Nsb2Nrd2lzZSBTaG91bGQgdGhlIHJvdGF0aW9uIGJlIGNsb2Nrd2lzZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGNvdW50ZXJjbG9ja3dpc2U/IGRlZmF1bHQ6IGZhbHNlXHJcbiAgICAgKiBAcmV0dXJucyBBIFZlY3RvciB0aGF0IGlzIG9ydGhvZ29uYWwgdG8gYW5kIGhhcyB0aGUgc2FtZSBtYWduaXR1ZGUgYXMgdGhlIGdpdmVuIFZlY3Rvci4gIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE9SVEhPR09OQUwoX3ZlY3RvcjogVmVjdG9yMiwgX2Nsb2Nrd2lzZTogYm9vbGVhbiA9IGZhbHNlKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgaWYgKF9jbG9ja3dpc2UpXHJcbiAgICAgICAgcmVzdWx0LnNldChfdmVjdG9yLnksIC1fdmVjdG9yLngpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmVzdWx0LnNldCgtX3ZlY3Rvci55LCBfdmVjdG9yLngpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGNhcnRlc2lhbiB2ZWN0b3IgZnJvbSBwb2xhciBjb29yZGluYXRlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEdFTyhfYW5nbGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHZlY3RvcjogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICBsZXQgZ2VvOiBHZW8yID0gUmVjeWNsZXIucmV1c2UoR2VvMik7XHJcbiAgICAgIGdlby5zZXQoX2FuZ2xlLCBfbWFnbml0dWRlKTtcclxuICAgICAgdmVjdG9yLmdlbyA9IGdlbztcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoZ2VvKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBBY2Nlc3NvcnNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYWduaXR1ZGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGguaHlwb3QodGhpcy54LCB0aGlzLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc3F1YXJlIG9mIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZlY3RvciB3aXRob3V0IGNhbGN1bGF0aW5nIGEgc3F1YXJlIHJvb3QuIEZhc3RlciBmb3Igc2ltcGxlIHByb3hpbWl0eSBldmFsdWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1hZ25pdHVkZVNxdWFyZWQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIFZlY3RvcjIuRE9UKHRoaXMsIHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHBvbGFyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZ2VvKCk6IEdlbzIge1xyXG4gICAgICBsZXQgZ2VvOiBHZW8yID0gUmVjeWNsZXIuZ2V0KEdlbzIpO1xyXG4gICAgICBnZW8ubWFnbml0dWRlID0gdGhpcy5tYWduaXR1ZGU7XHJcblxyXG4gICAgICBpZiAoZ2VvLm1hZ25pdHVkZSA9PT0gMClcclxuICAgICAgICByZXR1cm4gZ2VvO1xyXG5cclxuICAgICAgZ2VvLmFuZ2xlID0gMTgwICogTWF0aC5hdGFuMih0aGlzLnkgLyBnZW8ubWFnbml0dWRlLCB0aGlzLnggLyBnZW8ubWFnbml0dWRlKSAvIE1hdGguUEk7XHJcbiAgICAgIHJldHVybiBnZW87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3QgdGhlIGNhcnRlc2lhbiB2YWx1ZXMgb2YgdGhpcyB2ZWN0b3IgdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBhcyBwb2xhciBjb29yZGluYXRlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IGdlbyhfZ2VvOiBHZW8yKSB7XHJcbiAgICAgIHRoaXMuc2V0KF9nZW8ubWFnbml0dWRlLCAwKTtcclxuICAgICAgdGhpcy50cmFuc2Zvcm0oTWF0cml4M3gzLlJPVEFUSU9OKF9nZW8uYW5nbGUpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjbG9uZSBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjbG9uZSgpOiBWZWN0b3IyIHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGUgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGludG8gdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXQoX29yaWdpbmFsLngsIF9vcmlnaW5hbC55KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvb3JkaW5hdGVzIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiB2ZWN0b3IgYXJlIHRvIGJlIGNvbnNpZGVyZWQgaWRlbnRpY2FsIHdpdGhpbiB0aGUgZ2l2ZW4gdG9sZXJhbmNlXHJcbiAgICAgKiBUT0RPOiBleGFtaW5lLCBpZiB0b2xlcmFuY2UgYXMgY3JpdGVyaXVtIGZvciB0aGUgZGlmZmVyZW5jZSBpcyBhcHByb3ByaWF0ZSB3aXRoIHZlcnkgbGFyZ2UgY29vcmRpbmF0ZSB2YWx1ZXMgb3IgaWYgX3RvbGVyYW5jZSBzaG91bGQgYmUgbXVsdGlwbGllZCBieSBjb29yZGluYXRlIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBlcXVhbHMoX2NvbXBhcmU6IFZlY3RvcjIsIF90b2xlcmFuY2U6IG51bWJlciA9IE51bWJlci5FUFNJTE9OKTogYm9vbGVhbiB7XHJcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLnggLSBfY29tcGFyZS54KSA+IF90b2xlcmFuY2UpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKE1hdGguYWJzKHRoaXMueSAtIF9jb21wYXJlLnkpID4gX3RvbGVyYW5jZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGUgZXhlY3V0aW5nIHZlY3RvciwgY2hhbmdpbmcgdGhlIGV4ZWN1dG9yLlxyXG4gICAgICogQHBhcmFtIF9hZGRlbmQgVGhlIHZlY3RvciB0byBhZGQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGQoX2FkZGVuZDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICB0aGlzLnggKz0gX2FkZGVuZC54O1xyXG4gICAgICB0aGlzLnkgKz0gX2FkZGVuZC55O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gdmVjdG9yIGZyb20gdGhlIGV4ZWN1dGluZyB2ZWN0b3IsIGNoYW5naW5nIHRoZSBleGVjdXRvci5cclxuICAgICAqIEBwYXJhbSBfc3VidHJhaGVuZCBUaGUgdmVjdG9yIHRvIHN1YnRyYWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3VidHJhY3QoX3N1YnRyYWhlbmQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuICAgICAgdGhpcy54IC09IF9zdWJ0cmFoZW5kLng7XHJcbiAgICAgIHRoaXMueSAtPSBfc3VidHJhaGVuZC55O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlcyB0aGUgVmVjdG9yIGJ5IHRoZSBnaXZlbiBfc2NhbGFyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX3NjYWxhcjogbnVtYmVyKTogVmVjdG9yMiB7XHJcbiAgICAgIHRoaXMueCAqPSBfc2NhbGFyO1xyXG4gICAgICB0aGlzLnkgKj0gX3NjYWxhcjtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemVzIHRoaXMgdG8gdGhlIGdpdmVuIGxlbmd0aCwgMSBieSBkZWZhdWx0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBub3JtYWxpemUoX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb3B5KFZlY3RvcjIuTk9STUFMSVpBVElPTih0aGlzLCBfbGVuZ3RoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCk6IFZlY3RvcjIge1xyXG4gICAgICB0aGlzLnggPSBfeDtcclxuICAgICAgdGhpcy55ID0gX3k7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbdGhpcy54LCB0aGlzLnldKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhpcyB2ZWN0b3IgYnkgdGhlIGdpdmVuIG1hdHJpeCwgaW5jbHVkaW5nIG9yIGV4bHVkaW5nIHRoZSB0cmFuc2xhdGlvbi5cclxuICAgICAqIEluY2x1ZGluZyBpcyB0aGUgZGVmYXVsdCwgZXhjbHVkaW5nIHdpbGwgb25seSByb3RhdGUgYW5kIHNjYWxlIHRoaXMgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNmb3JtKF9tdHhUcmFuc2Zvcm06IE1hdHJpeDN4MywgX2luY2x1ZGVUcmFuc2xhdGlvbjogYm9vbGVhbiA9IHRydWUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHRyYW5zZm9ybWVkOiBWZWN0b3IyID0gVmVjdG9yMi5UUkFOU0ZPUk1BVElPTih0aGlzLCBfbXR4VHJhbnNmb3JtLCBfaW5jbHVkZVRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5jb3B5KHRyYW5zZm9ybWVkKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNmb3JtZWQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciBlYWNoIGRpbWVuc2lvbiwgbW92ZXMgdGhlIGNvbXBvbmVudCB0byB0aGUgbWluaW11bSBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtaW4oX2NvbXBhcmU6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuICAgICAgdGhpcy54ID0gTWF0aC5taW4odGhpcy54LCBfY29tcGFyZS54KTtcclxuICAgICAgdGhpcy55ID0gTWF0aC5taW4odGhpcy55LCBfY29tcGFyZS55KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZvciBlYWNoIGRpbWVuc2lvbiwgbW92ZXMgdGhlIGNvbXBvbmVudCB0byB0aGUgbWF4aW11bSBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYXgoX2NvbXBhcmU6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuICAgICAgdGhpcy54ID0gTWF0aC5tYXgodGhpcy54LCBfY29tcGFyZS54KTtcclxuICAgICAgdGhpcy55ID0gTWF0aC5tYXgodGhpcy55LCBfY29tcGFyZS55KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgei1jb21wb25lbnQgb2YgdGhlIGdpdmVuIG1hZ25pdHVkZSAoZGVmYXVsdD0wKSB0byB0aGUgdmVjdG9yIGFuZCByZXR1cm5zIGEgbmV3IFZlY3RvcjNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvVmVjdG9yMyhfejogbnVtYmVyID0gMCk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy54LCB0aGlzLnksIF96KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBgKCR7dGhpcy54LnRvUHJlY2lzaW9uKDUpfSwgJHt0aGlzLnkudG9QcmVjaXNpb24oNSl9KWA7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VzIHRoZSBzdGFuZGFyZCBhcnJheS5tYXAgZnVuY3Rpb25hbGl0eSB0byBwZXJmb3JtIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiBhbGwgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvclxyXG4gICAgICogYW5kIHJldHVybiBhIG5ldyB2ZWN0b3Igd2l0aCB0aGUgcmVzdWx0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWFwKF9mdW5jdGlvbjogKHZhbHVlOiBudW1iZXIsIGluZGV4OiBudW1iZXIsIGFycmF5OiBBcnJheUxpa2U8bnVtYmVyPikgPT4gbnVtYmVyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBjb3B5OiBWZWN0b3IyID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgICBjb3B5LnNldCguLi5bdGhpcy54LCB0aGlzLnldLm1hcChfZnVuY3Rpb24pKTtcclxuICAgICAgcmV0dXJuIGNvcHk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuZ2V0TXV0YXRvcigpO1xyXG4gICAgICAvLyBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGB7IFwiclwiOiAke3RoaXMucn0sIFwiZ1wiOiAke3RoaXMuZ30sIFwiYlwiOiAke3RoaXMuYn0sIFwiYVwiOiAke3RoaXMuYX19YDsgfTtcclxuICAgICAgc2VyaWFsaXphdGlvbi50b0pTT04gPSAoKSA9PiB7IHJldHVybiBgWyR7dGhpcy54fSwgJHt0aGlzLnl9XWA7IH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8VmVjdG9yMj4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfc2VyaWFsaXphdGlvbikgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIFt0aGlzLngsIHRoaXMueV0gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICB4OiB0aGlzLngsIHk6IHRoaXMueVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyoqICovIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIi4uL1JlY3ljbGUvUmVjeWNsZXIudHNcIi8+XHJcbi8vLzxyZWZlcmVuY2UgcGF0aD1cIlZlY3RvcjIudHNcIi8+XHJcblxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBEZWZpbmVzIHRoZSBvcmlnaW4gb2YgYSByZWN0YW5nbGVcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBPUklHSU4yRCB7XHJcbiAgICBUT1BMRUZUID0gMHgwMCxcclxuICAgIFRPUENFTlRFUiA9IDB4MDEsXHJcbiAgICBUT1BSSUdIVCA9IDB4MDIsXHJcbiAgICBDRU5URVJMRUZUID0gMHgxMCxcclxuICAgIENFTlRFUiA9IDB4MTEsXHJcbiAgICBDRU5URVJSSUdIVCA9IDB4MTIsXHJcbiAgICBCT1RUT01MRUZUID0gMHgyMCxcclxuICAgIEJPVFRPTUNFTlRFUiA9IDB4MjEsXHJcbiAgICBCT1RUT01SSUdIVCA9IDB4MjJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgYSByZWN0YW5nbGUgd2l0aCBwb3NpdGlvbiBhbmQgc2l6ZSBhbmQgYWRkIGNvbWZvcnRhYmxlIG1ldGhvZHMgdG8gaXRcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlY3RhbmdsZSBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIHBvc2l0aW9uOiBWZWN0b3IyID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgcHVibGljIHNpemU6IFZlY3RvcjIgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMik7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3dpZHRoOiBudW1iZXIgPSAxLCBfaGVpZ2h0OiBudW1iZXIgPSAxLCBfb3JpZ2luOiBPUklHSU4yRCA9IE9SSUdJTjJELlRPUExFRlQpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zZXRQb3NpdGlvbkFuZFNpemUoX3gsIF95LCBfd2lkdGgsIF9oZWlnaHQsIF9vcmlnaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG5ldyByZWN0YW5nbGUgY3JlYXRlZCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgR0VUKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3dpZHRoOiBudW1iZXIgPSAxLCBfaGVpZ2h0OiBudW1iZXIgPSAxLCBfb3JpZ2luOiBPUklHSU4yRCA9IE9SSUdJTjJELlRPUExFRlQpOiBSZWN0YW5nbGUge1xyXG4gICAgICBsZXQgcmVjdDogUmVjdGFuZ2xlID0gUmVjeWNsZXIuZ2V0KFJlY3RhbmdsZSk7XHJcbiAgICAgIHJlY3Quc2V0UG9zaXRpb25BbmRTaXplKF94LCBfeSwgX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgICAgcmV0dXJuIHJlY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB4KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLng7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHkoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2l6ZS54O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2l6ZS55O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBsZWZ0bW9zdCBleHBhbnNpb24sIHJlc3BlY3RpbmcgYWxzbyBuZWdhdGl2ZSB2YWx1ZXMgb2Ygd2lkdGhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBsZWZ0KCk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0aGlzLnNpemUueCA+IDApXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDtcclxuICAgICAgcmV0dXJuICh0aGlzLnBvc2l0aW9uLnggKyB0aGlzLnNpemUueCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgdG9wbW9zdCBleHBhbnNpb24sIHJlc3BlY3RpbmcgYWxzbyBuZWdhdGl2ZSB2YWx1ZXMgb2YgaGVpZ2h0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdG9wKCk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0aGlzLnNpemUueSA+IDApXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgICAgcmV0dXJuICh0aGlzLnBvc2l0aW9uLnkgKyB0aGlzLnNpemUueSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgcmlnaHRtb3N0IGV4cGFuc2lvbiwgcmVzcGVjdGluZyBhbHNvIG5lZ2F0aXZlIHZhbHVlcyBvZiB3aWR0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJpZ2h0KCk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0aGlzLnNpemUueCA+IDApXHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnBvc2l0aW9uLnggKyB0aGlzLnNpemUueCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLng7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgbG93ZXN0IGV4cGFuc2lvbiwgcmVzcGVjdGluZyBhbHNvIG5lZ2F0aXZlIHZhbHVlcyBvZiBoZWlnaHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBib3R0b20oKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMuc2l6ZS55ID4gMClcclxuICAgICAgICByZXR1cm4gKHRoaXMucG9zaXRpb24ueSArIHRoaXMuc2l6ZS55KTtcclxuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHgoX3g6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnBvc2l0aW9uLnggPSBfeDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgeShfeTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb24ueSA9IF95O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB3aWR0aChfd2lkdGg6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNpemUueCA9IF93aWR0aDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgaGVpZ2h0KF9oZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNpemUueSA9IF9oZWlnaHQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGxlZnQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5zaXplLnggPSB0aGlzLnJpZ2h0IC0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLnBvc2l0aW9uLnggPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRvcChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNpemUueSA9IHRoaXMuYm90dG9tIC0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLnBvc2l0aW9uLnkgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJpZ2h0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuc2l6ZS54ID0gdGhpcy5wb3NpdGlvbi54ICsgX3ZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBib3R0b20oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5zaXplLnkgPSB0aGlzLnBvc2l0aW9uLnkgKyBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjbG9uZSgpOiBSZWN0YW5nbGUge1xyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVCh0aGlzLngsIHRoaXMueSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldFBvc2l0aW9uQW5kU2l6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoaXMgcmVjdGFuZ2xlIHRvIHRoZSB2YWx1ZXMgZ2l2ZW4gYnkgdGhlIHJlY3RhbmdsZSBwcm92aWRlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29weShfcmVjdDogUmVjdGFuZ2xlKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0UG9zaXRpb25BbmRTaXplKF9yZWN0LngsIF9yZWN0LnksIF9yZWN0LndpZHRoLCBfcmVjdC5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcG9zaXRpb24gYW5kIHNpemUgb2YgdGhlIHJlY3RhbmdsZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHBhcmFtZXRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFBvc2l0aW9uQW5kU2l6ZShfeDogbnVtYmVyID0gMCwgX3k6IG51bWJlciA9IDAsIF93aWR0aDogbnVtYmVyID0gMSwgX2hlaWdodDogbnVtYmVyID0gMSwgX29yaWdpbjogT1JJR0lOMkQgPSBPUklHSU4yRC5UT1BMRUZUKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2l6ZS5zZXQoX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgICAgc3dpdGNoIChfb3JpZ2luICYgMHgwMykge1xyXG4gICAgICAgIGNhc2UgMHgwMDogdGhpcy5wb3NpdGlvbi54ID0gX3g7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMHgwMTogdGhpcy5wb3NpdGlvbi54ID0gX3ggLSBfd2lkdGggLyAyOyBicmVhaztcclxuICAgICAgICBjYXNlIDB4MDI6IHRoaXMucG9zaXRpb24ueCA9IF94IC0gX3dpZHRoOyBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBzd2l0Y2ggKF9vcmlnaW4gJiAweDMwKSB7XHJcbiAgICAgICAgY2FzZSAweDAwOiB0aGlzLnBvc2l0aW9uLnkgPSBfeTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAweDEwOiB0aGlzLnBvc2l0aW9uLnkgPSBfeSAtIF9oZWlnaHQgLyAyOyBicmVhaztcclxuICAgICAgICBjYXNlIDB4MjA6IHRoaXMucG9zaXRpb24ueSA9IF95IC0gX2hlaWdodDsgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHBvaW50IGZyb20gdGhpcyByZWN0YW5nbGVzIHNwYWNlIHRvIHRoZSB0YXJnZXQgcmVjdGFuZ2xlcyBzcGFjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRUb1JlY3QoX3BvaW50OiBWZWN0b3IyLCBfdGFyZ2V0OiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IF9wb2ludC5jbG9uZTtcclxuICAgICAgcmVzdWx0LnN1YnRyYWN0KHRoaXMucG9zaXRpb24pO1xyXG4gICAgICByZXN1bHQueCAqPSBfdGFyZ2V0LndpZHRoIC8gdGhpcy53aWR0aDtcclxuICAgICAgcmVzdWx0LnkgKj0gX3RhcmdldC5oZWlnaHQgLyB0aGlzLmhlaWdodDtcclxuICAgICAgcmVzdWx0LmFkZChfdGFyZ2V0LnBvc2l0aW9uKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcG9pbnQgaXMgaW5zaWRlIG9mIHRoaXMgcmVjdGFuZ2xlIG9yIG9uIHRoZSBib3JkZXJcclxuICAgICAqIEBwYXJhbSBfcG9pbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzSW5zaWRlKF9wb2ludDogVmVjdG9yMik6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gKF9wb2ludC54ID49IHRoaXMubGVmdCAmJiBfcG9pbnQueCA8PSB0aGlzLnJpZ2h0ICYmIF9wb2ludC55ID49IHRoaXMudG9wICYmIF9wb2ludC55IDw9IHRoaXMuYm90dG9tKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlY3RhbmdsZSBjb2xsaWRlcyB3aXRoIHRoZSByZWN0YW5nbGUgZ2l2ZW5cclxuICAgICAqIEBwYXJhbSBfcmVjdCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbGxpZGVzKF9yZWN0OiBSZWN0YW5nbGUpOiBib29sZWFuIHtcclxuICAgICAgaWYgKHRoaXMubGVmdCA+IF9yZWN0LnJpZ2h0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnJpZ2h0IDwgX3JlY3QubGVmdCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy50b3AgPiBfcmVjdC5ib3R0b20pIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuYm90dG9tIDwgX3JlY3QudG9wKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmVjdGFuZ2xlIGNyZWF0ZWQgYnkgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlIG9yIG51bGwsIGlmIHRoZXkgZG9uJ3QgY29sbGlkZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0SW50ZXJzZWN0aW9uKF9yZWN0OiBSZWN0YW5nbGUpOiBSZWN0YW5nbGUge1xyXG4gICAgICBpZiAoIXRoaXMuY29sbGlkZXMoX3JlY3QpKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IGludGVyc2VjdGlvbjogUmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgpO1xyXG4gICAgICBpbnRlcnNlY3Rpb24ueCA9IE1hdGgubWF4KHRoaXMubGVmdCwgX3JlY3QubGVmdCk7XHJcbiAgICAgIGludGVyc2VjdGlvbi55ID0gTWF0aC5tYXgodGhpcy50b3AsIF9yZWN0LnRvcCk7XHJcbiAgICAgIGludGVyc2VjdGlvbi53aWR0aCA9IE1hdGgubWluKHRoaXMucmlnaHQsIF9yZWN0LnJpZ2h0KSAtIGludGVyc2VjdGlvbi54O1xyXG4gICAgICBpbnRlcnNlY3Rpb24uaGVpZ2h0ID0gTWF0aC5taW4odGhpcy5ib3R0b20sIF9yZWN0LmJvdHRvbSkgLSBpbnRlcnNlY3Rpb24ueTtcclxuXHJcbiAgICAgIHJldHVybiBpbnRlcnNlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAqIFJldHVybnMgdGhlIHJlY3RhbmdsZSBjcmVhdGVkIGJ5IHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBhbmQgdGhlIGdpdmVuIHJlY3RhbmdsZSBvciBudWxsLCBpZiB0aGV5IGRvbid0IGNvbGxpZGVcclxuICovXHJcbiAgICBwdWJsaWMgY292ZXJzKF9yZWN0OiBSZWN0YW5nbGUpOiBib29sZWFuIHtcclxuICAgICAgaWYgKHRoaXMubGVmdCA+IF9yZWN0LmxlZnQpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMucmlnaHQgPCBfcmVjdC5yaWdodCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy50b3AgPiBfcmVjdC50b3ApIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuYm90dG9tIDwgX3JlY3QuYm90dG9tKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJlY3RhbmdsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHJlc3VsdDogc3RyaW5nID0gYMaSLlJlY3RhbmdsZShwb3NpdGlvbjoke3RoaXMucG9zaXRpb24udG9TdHJpbmcoKX0sIHNpemU6JHt0aGlzLnNpemUudG9TdHJpbmcoKX1gO1xyXG4gICAgICByZXN1bHQgKz0gYCwgbGVmdDoke3RoaXMubGVmdC50b1ByZWNpc2lvbig1KX0sIHRvcDoke3RoaXMudG9wLnRvUHJlY2lzaW9uKDUpfSwgcmlnaHQ6JHt0aGlzLnJpZ2h0LnRvUHJlY2lzaW9uKDUpfSwgYm90dG9tOiR7dGhpcy5ib3R0b20udG9QcmVjaXNpb24oNSl9YDtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qICovIH1cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCJSZW5kZXJJbmplY3Rvci50c1wiLz5cclxuLy8vPHJlZmVyZW5jZSBwYXRoPVwiUmVuZGVySW5qZWN0b3JTaGFkZXIudHNcIi8+XHJcbi8vLzxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlckluamVjdG9yQ29hdC50c1wiLz5cclxuLy8vPHJlZmVyZW5jZSBwYXRoPVwiUmVuZGVySW5qZWN0b3JNZXNoLnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCJSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCJSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCIuLi9NYXRoL1JlY3RhbmdsZS50c1wiLz5cclxuXHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8vIGV4cG9ydCBkZWNsYXJlIGxldCBmdWRnZUNvbmZpZzogR2VuZXJhbDtcclxuXHJcbiAgZXhwb3J0IHR5cGUgUmVuZGVyVGV4dHVyZSA9IFdlYkdMVGV4dHVyZTtcclxuXHJcbiAgZXhwb3J0IGVudW0gQkxFTkQge1xyXG4gICAgT1BBUVVFLCBUUkFOU1BBUkVOVCwgQURESVRJVkUsIFNVQlRSQUNUSVZFLCBNT0RVTEFURVxyXG4gIH1cclxuXHJcbiAgLy8gd2Ugd2FudCB0eXBlIGluZmVyZW5jZSBoZXJlIHNvIHdlIGNhbiB1c2UgdnMgY29kZSB0byBzZWFyY2ggZm9yIHJlZmVyZW5jZXNcclxuICBleHBvcnQgY29uc3QgVU5JRk9STV9CTE9DS1MgPSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuICAgIExJR0hUUzoge1xyXG4gICAgICBOQU1FOiBcIkxpZ2h0c1wiLFxyXG4gICAgICBCSU5ESU5HOiAwXHJcbiAgICB9LFxyXG4gICAgU0tJTjoge1xyXG4gICAgICBOQU1FOiBcIlNraW5cIixcclxuICAgICAgQklORElORzogMVxyXG4gICAgfSxcclxuICAgIEZPRzoge1xyXG4gICAgICBOQU1FOiBcIkZvZ1wiLFxyXG4gICAgICBCSU5ESU5HOiAyXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgZXhwb3J0IGNvbnN0IFRFWFRVUkVfTE9DQVRJT04gPSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuICAgIENPTE9SOiB7XHJcbiAgICAgIFVOSUZPUk06IFwidV90ZXhDb2xvclwiLFxyXG4gICAgICBVTklUOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwLFxyXG4gICAgICBJTkRFWDogMCAvLyBjb3VsZCBjb21wdXRlIHRoZXNlIGJ5IFVOSVQgLSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwIFxyXG4gICAgfSxcclxuICAgIE5PUk1BTDoge1xyXG4gICAgICBVTklGT1JNOiBcInVfdGV4Tm9ybWFsXCIsXHJcbiAgICAgIFVOSVQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTEsXHJcbiAgICAgIElOREVYOiAxXHJcbiAgICB9LFxyXG4gICAgUEFSVElDTEU6IHtcclxuICAgICAgVU5JRk9STTogXCJ1X3BhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1wiLFxyXG4gICAgICBVTklUOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUyLFxyXG4gICAgICBJTkRFWDogMlxyXG4gICAgfSxcclxuICAgIFRFWFQ6IHtcclxuICAgICAgVU5JRk9STTogXCJ1X3RleFRleHRcIiwgLy8gVE9ETzogYWRkIHRleHQgdW5pZm9ybSB0byBzaGFkZXIuLi5cclxuICAgICAgVU5JVDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMyxcclxuICAgICAgSU5ERVg6IDNcclxuICAgIH0sXHJcbiAgICBUT09OOiB7XHJcbiAgICAgIFVOSUZPUk06IFwidV90ZXhUb29uXCIsXHJcbiAgICAgIFVOSVQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTQsXHJcbiAgICAgIElOREVYOiA0XHJcbiAgICB9XHJcbiAgfSBhcyBjb25zdDtcclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZSBjbGFzcyBmb3IgUmVuZGVyTWFuYWdlciwgaGFuZGxpbmcgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHJlbmRlcmluZyBzeXN0ZW0sIGluIHRoaXMgY2FzZSBXZWJHTC5cclxuICAgKiBNZXRob2RzIGFuZCBhdHRyaWJ1dGVzIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHksIG9ubHkgdGhyb3VnaCB7QGxpbmsgUmVuZGVyfVxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJXZWJHTCBleHRlbmRzIEV2ZW50VGFyZ2V0U3RhdGljIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgdWJvTGlnaHRzOiBXZWJHTEJ1ZmZlcjtcclxuICAgIHB1YmxpYyBzdGF0aWMgdWJvTGlnaHRzVmFyaWFibGVPZmZzZXRzOiB7IFtfbmFtZTogc3RyaW5nXTogbnVtYmVyIH07IC8vIE1hcHMgdGhlIG5hbWVzIG9mIHRoZSB2YXJpYWJsZXMgaW5zaWRlIHRoZSBMaWdodHMgdW5pZm9ybSBibG9jayB0byB0aGVpciByZXNwZWN0aXZlIGJ5dGUgb2Zmc2V0XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuaW5pdGlhbGl6ZSgpO1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyDGknBpY2tlZDogUGlja1tdO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlY3RSZW5kZXI6IFJlY3RhbmdsZSA9IFJlbmRlcldlYkdMLmdldENhbnZhc1JlY3QoKTtcclxuICAgIHByaXZhdGUgc3RhdGljIHNpemVQaWNrOiBudW1iZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmJvTWFpbjogV2ViR0xGcmFtZWJ1ZmZlcjsgLy8gdXNlZCBmb3IgZm9yd2FyZCByZW5kZXJpbmcgcGFzc2VzLCBlLmcuIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgb2JqZWN0c1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmJvUG9zdDogV2ViR0xGcmFtZWJ1ZmZlcjsgLy8gdXNlZCBmb3IgcG9zdC1wcm9jZXNzaW5nIGVmZmVjdHMsIGF0dGFjaG1lbnRzIGdldCBzd2FwcGVkIGZvciBkaWZmZXJlbnQgZWZmZWN0c1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmJvVGFyZ2V0OiBXZWJHTEZyYW1lYnVmZmVyOyAvLyB1c2VkIHRvIHJlbmRlciB0aGUgZmluYWwgaW1hZ2UgdG8sIHVzdWFsbHkgXCJudWxsXCIgdG8gcmVuZGVyIHRvIHRoZSBjYW52YXMgZGVmYXVsdCBmcmFtZWJ1ZmZlci4gVXNlZCBieSBYUiB0byByZW5kZXIgdG8gdGhlIFhSV2ViR0xMYXllciBmcmFtZWJ1ZmZlci5cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyB0ZXhDb2xvcjogV2ViR0xUZXh0dXJlOyAvLyBzdG9yZXMgdGhlIGNvbG9yIG9mIGVhY2ggcGl4ZWwgcmVuZGVyZWRcclxuICAgIHByaXZhdGUgc3RhdGljIHRleFBvc2l0aW9uOiBXZWJHTFRleHR1cmU7IC8vIHN0b3JlcyB0aGUgcG9zaXRpb24gb2YgZWFjaCBwaXhlbCBpbiB3b3JsZCBzcGFjZVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4Tm9ybWFsOiBXZWJHTFRleHR1cmU7IC8vIHN0b3JlcyB0aGUgbm9ybWFsIG9mIGVhY2ggcGl4ZWwgaW4gd29ybGQgc3BhY2VcclxuICAgIHByaXZhdGUgc3RhdGljIHRleE5vaXNlOiBXZWJHTFRleHR1cmU7IC8vIHN0b3JlcyByYW5kb20gdmFsdWVzIGZvciBlYWNoIHBpeGVsLCB1c2VkIGZvciBhbWJpZW50IG9jY2x1c2lvblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4RGVwdGhTdGVuY2lsOiBXZWJHTFRleHR1cmU7IC8vIHN0b3JlcyB0aGUgZGVwdGggb2YgZWFjaCBwaXhlbCwgY3VycmVudGx5IHVudXNlZFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4Qmxvb21TYW1wbGVzOiBXZWJHTFRleHR1cmVbXTsgLy8gc3RvcmVzIGRvd24gYW5kIHVwc2FtcGxlZCB2ZXJzaW9ucyBvZiB0aGUgY29sb3IgdGV4dHVyZSwgdXNlZCBmb3IgYmxvb21cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyB1Ym9Gb2c6IFdlYkdMQnVmZmVyOyAvLyBzdG9yZXMgdGhlIGZvZyBwYXJhbWV0ZXJzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBvZmZzY3JlZW4tY2FudmFzLCByZW5kZXJpbmdjb250ZXh0IGFuZCBoYXJkd2FyZSB2aWV3cG9ydC4gQ2FsbCBvbmNlIGJlZm9yZSBjcmVhdGluZyBhbnkgcmVzb3VyY2VzIGxpa2UgbWVzaGVzIG9yIHNoYWRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplKF9hbnRpYWxpYXM/OiBib29sZWFuLCBfYWxwaGE/OiBib29sZWFuKTogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB7XHJcbiAgICAgIGxldCBmdWRnZUNvbmZpZzogR2VuZXJhbCA9IFJlZmxlY3QuZ2V0KGdsb2JhbFRoaXMsIFwiZnVkZ2VDb25maWdcIikgfHwge307XHJcbiAgICAgIGNvbnN0IGFudGlhbGlhczogYm9vbGVhbiA9IChfYW50aWFsaWFzICE9IHVuZGVmaW5lZCkgPyBfYW50aWFsaWFzIDogZnVkZ2VDb25maWcuYW50aWFsaWFzIHx8IGZhbHNlO1xyXG4gICAgICBpZiAoYW50aWFsaWFzKVxyXG4gICAgICAgIERlYnVnLmVycm9yKFwiVGhlIGRlZmF1bHQgYW50aWFsaWFzaW5nIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgcG9zdC1wcm9jZXNzaW5nIGVmZmVjdHMgYW5kIHdpbGwgdGhlcmVmb3JlIGJlIGRpc2FibGVkLlwiKTtcclxuICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzOiBXZWJHTENvbnRleHRBdHRyaWJ1dGVzID0geyAvLyBUT0RPOiBcclxuICAgICAgICBhbHBoYTogKF9hbHBoYSAhPSB1bmRlZmluZWQpID8gX2FscGhhIDogZnVkZ2VDb25maWcuYWxwaGEgfHwgZmFsc2UsXHJcbiAgICAgICAgYW50aWFsaWFzOiBmYWxzZSxcclxuICAgICAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IGZhbHNlLFxyXG4gICAgICAgIHN0ZW5jaWw6IHRydWVcclxuICAgICAgfTtcclxuICAgICAgRGVidWcuZnVkZ2UoXCJJbml0aWFsaXplIFJlbmRlcldlYkdMXCIsIGNvbnRleHRBdHRyaWJ1dGVzKTtcclxuICAgICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuICAgICAgY3JjMyA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTDJSZW5kZXJpbmdDb250ZXh0PihcclxuICAgICAgICBjYW52YXMuZ2V0Q29udGV4dChcIndlYmdsMlwiLCBjb250ZXh0QXR0cmlidXRlcyksXHJcbiAgICAgICAgXCJXZWJHTC1jb250ZXh0IGNvdWxkbid0IGJlIGNyZWF0ZWRcIlxyXG4gICAgICApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzID0gY3JjMztcclxuICAgICAgLy8gRW5hYmxlIGJhY2tmYWNlLSBhbmQgekJ1ZmZlci1jdWxsaW5nLlxyXG4gICAgICBjcmMzLmVuYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNVTExfRkFDRSk7XHJcbiAgICAgIGNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfVEVTVCk7XHJcbiAgICAgIGNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQkxFTkQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyID0gUmVuZGVyV2ViR0wuZ2V0Q2FudmFzUmVjdCgpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuaW5pdGlhbGl6ZUF0dGFjaG1lbnRzKCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmFkanVzdEF0dGFjaG1lbnRzKCk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC51Ym9Gb2cgPSBSZW5kZXJXZWJHTC5hc3NlcnQoY3JjMy5jcmVhdGVCdWZmZXIoKSk7XHJcblxyXG4gICAgICByZXR1cm4gY3JjMztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2hlY2tzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIHRocm93cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgV2ViR0wtZXJyb3Jjb2RlIGlmIHRoZSB2YWx1ZSBpcyBudWxsXHJcbiAgICAqIEBwYXJhbSBfdmFsdWUgIHZhbHVlIHRvIGNoZWNrIGFnYWluc3QgbnVsbFxyXG4gICAgKiBAcGFyYW0gX21lc3NhZ2UgIG9wdGlvbmFsLCBhZGRpdGlvbmFsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb25cclxuICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzc2VydDxUPihfdmFsdWU6IFQgfCBudWxsLCBfbWVzc2FnZTogc3RyaW5nID0gXCJcIik6IFQge1xyXG4gICAgICBpZiAoX3ZhbHVlID09PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXJ0aW9uIGZhaWxlZC4gJHtfbWVzc2FnZX0sIFdlYkdMLUVycm9yOiAke1JlbmRlcldlYkdMLmNyYzMgPyBSZW5kZXJXZWJHTC5jcmMzLmdldEVycm9yKCkgOiBcIlwifWApO1xyXG4gICAgICByZXR1cm4gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBvZmZzY3JlZW4tY2FudmFzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHtcclxuICAgICAgcmV0dXJuIDxIVE1MQ2FudmFzRWxlbWVudD5SZW5kZXJXZWJHTC5jcmMzLmNhbnZhczsgLy8gVE9ETzogZW5hYmxlIE9mZnNjcmVlbkNhbnZhc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJpbmcgY29udGV4dFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFJlbmRlcmluZ0NvbnRleHQoKTogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB7XHJcbiAgICAgIHJldHVybiBSZW5kZXJXZWJHTC5jcmMzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgcmVjdGFuZ2xlIGRlc2NyaWJpbmcgdGhlIHNpemUgb2YgdGhlIG9mZnNjcmVlbi1jYW52YXMuIHgseSBhcmUgMCBhdCBhbGwgdGltZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q2FudmFzUmVjdCgpOiBSZWN0YW5nbGUge1xyXG4gICAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IDxIVE1MQ2FudmFzRWxlbWVudD5SZW5kZXJXZWJHTC5jcmMzLmNhbnZhcztcclxuICAgICAgcmV0dXJuIFJlY3RhbmdsZS5HRVQoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2l6ZSBvZiB0aGUgb2Zmc2NyZWVuLWNhbnZhcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXRDYW52YXNTaXplKF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5jYW52YXMud2lkdGggPSBfd2lkdGg7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuY2FudmFzLmhlaWdodCA9IF9oZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGFyZWEgb24gdGhlIG9mZnNjcmVlbi1jYW52YXMgdG8gcmVuZGVyIHRoZSBjYW1lcmEgaW1hZ2UgdG8uXHJcbiAgICAgKiBAcGFyYW0gX3JlY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXRSZW5kZXJSZWN0YW5nbGUoX3JlY3Q6IFJlY3RhbmdsZSk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyLnNldFBvc2l0aW9uQW5kU2l6ZShfcmVjdC54LCBfcmVjdC55LCBfcmVjdC53aWR0aCwgX3JlY3QuaGVpZ2h0KTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy52aWV3cG9ydChfcmVjdC54LCBfcmVjdC55LCBfcmVjdC53aWR0aCwgX3JlY3QuaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFyIHRoZSBvZmZzY3JlZW4gcmVuZGVyYnVmZmVyIHdpdGggdGhlIGdpdmVuIHtAbGluayBDb2xvcn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGVhcihfY29sb3I/OiBDb2xvcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmNsZWFyQ29sb3IoX2NvbG9yPy5yID8/IDAsIF9jb2xvcj8uZyA/PyAwLCBfY29sb3I/LmIgPz8gMCwgX2NvbG9yPy5hID8/IDEpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmNsZWFyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQlVGRkVSX0JJVCB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfQlVGRkVSX0JJVCB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU1RFTkNJTF9CVUZGRVJfQklUKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZmluYWwgZnJhbWVidWZmZXIgdG8gcmVuZGVyIHRvLiBJZiBudWxsLCB0aGUgY2FudmFzIGRlZmF1bHQgZnJhbWVidWZmZXIgaXMgdXNlZC5cclxuICAgICAqIFVzZWQgYnkgWFIgdG8gcmVuZGVyIHRvIHRoZSBYUldlYkdMTGF5ZXIgZnJhbWVidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0RnJhbWVidWZmZXJUYXJnZXQoX2J1ZmZlcjogV2ViR0xGcmFtZWJ1ZmZlcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5mYm9UYXJnZXQgPSBfYnVmZmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXQgdGhlIGZyYW1lYnVmZmVyIHRvIHRoZSBtYWluIGNvbG9yIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZXNldEZyYW1lYnVmZmVyKCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBhcmVhIG9uIHRoZSBvZmZzY3JlZW4tY2FudmFzIHRoZSBjYW1lcmEgaW1hZ2UgZ2V0cyByZW5kZXJlZCB0by5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZW5kZXJSZWN0YW5nbGUoKTogUmVjdGFuZ2xlIHtcclxuICAgICAgcmV0dXJuIFJlbmRlcldlYkdMLnJlY3RSZW5kZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGUgLyBEaXNhYmxlIFdlYkdMcyBkZXB0aCB0ZXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldERlcHRoVGVzdChfdGVzdDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBpZiAoX3Rlc3QpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5lbmFibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9URVNUKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuZGlzYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIX1RFU1QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlIC8gRGlzYWJsZSBXZWJHTHMgc2Npc3NvciB0ZXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldFNjaXNzb3JUZXN0KF90ZXN0OiBib29sZWFuLCBfeD86IG51bWJlciwgX3k/OiBudW1iZXIsIF93aWR0aD86IG51bWJlciwgX2hlaWdodD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBpZiAoX3Rlc3QpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5lbmFibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TQ0lTU09SX1RFU1QpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5kaXNhYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU0NJU1NPUl9URVNUKTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5zY2lzc29yKF94LCBfeSwgX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBXZWJHTHMgdmlld3BvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Vmlld3BvcnQoX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3dpZHRoOiBudW1iZXIsIF9oZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLnZpZXdwb3J0KF94LCBfeSwgX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYmxlbmQgbW9kZSB0byByZW5kZXIgd2l0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldEJsZW5kTW9kZShfbW9kZTogQkxFTkQpOiB2b2lkIHtcclxuICAgICAgLy8g4pqg77iPIENBVVRJT046IGFsbCBibGVuZGluZyBpcyBkb25lIHdpdGggcHJlbXVsdGlwbGllZCBhbHBoYSBpbiB0aGUgc2hhZGVyLCBzbyB0aGUgYmxlbmQgZnVuY3Rpb25zIGFyZSBzZXQgYWNjb3JkaW5nbHlcclxuICAgICAgc3dpdGNoIChfbW9kZSkge1xyXG4gICAgICAgIGNhc2UgQkxFTkQuT1BBUVVFOlxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEVxdWF0aW9uKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlVOQ19BREQpO1xyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuWkVSTyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJMRU5ELlRSQU5TUEFSRU5UOlxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEVxdWF0aW9uKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlVOQ19BREQpO1xyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuT05FX01JTlVTX1NSQ19BTFBIQSk7XHJcbiAgICAgICAgICAvLyBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlNSQ19BTFBIQSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQkxFTkQuQURESVRJVkU6XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX0FERCk7XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk9ORSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUpO1xyXG4gICAgICAgICAgLy8gUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TUkNfQUxQSEEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRFNUX0FMUEhBKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQkxFTkQuU1VCVFJBQ1RJVkU6XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1QpO1xyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuT05FKTtcclxuICAgICAgICAgIC8vIFJlbmRlcldlYkdMLmNyYzMuYmxlbmRGdW5jKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU1JDX0FMUEhBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRTVF9BTFBIQSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJMRU5ELk1PRFVMQVRFOiAvLyBjb2xvciBnZXRzIG11bHRpcGxpZWQsIHRyaWVkIHRvIGNvcHkgdW5pdHlzIFwiUGFydGljbGUgU2hhZGVyOiBCbGVuZGluZyBPcHRpb246IFJlbmRlcmluZyBNb2RlOiBNb2R1bGF0ZVwiXHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX0FERCk7XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRTVF9DT0xPUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWQgdGhlICh3b3JsZCkgcG9zaXRpb24gZnJvbSB0aGUgcGl4ZWwgYXQgdGhlIGdpdmVuIHBvaW50IG9uIHRoZSByZW5kZXItcmVjdGFuZ2xlIChvcmlnaW4gdG9wIGxlZnQpLlxyXG4gICAgICog4pqg77iPIENBVVRJT046IEN1cnJlbnRseSBvbmx5IHdvcmtzIHdoZW4gYW1iaWVudCBvY2NsdXNpb24gaXMgYWN0aXZlIGR1ZSB0byB3cml0aW5nIHRvIHRoZSBwb3NpdGlvbiB0ZXh0dXJlIGJlaW5nIGRpc2FibGVkIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwb2ludFJlbmRlclRvV29ybGQoX3JlbmRlcjogVmVjdG9yMik6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjb25zdCBkYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgICAgY3JjMy5yZWFkQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDEpO1xyXG4gICAgICBjcmMzLnJlYWRQaXhlbHMoX3JlbmRlci54LCBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyLmhlaWdodCAtIF9yZW5kZXIueSwgMSwgMSwgY3JjMy5SR0JBLCBjcmMzLkZMT0FULCBkYXRhKTtcclxuICAgICAgY3JjMy5yZWFkQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDApO1xyXG4gICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHBvc2l0aW9uLnNldChkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdKTtcclxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZXMgZGlmZmVyZW50IGZyYW1lYnVmZmVycyBhc3dlbGwgYXMgdGV4dHVyZSBhdHRhY2htZW50cyB0byB1c2UgYXMgcmVuZGVyIHRhcmdldHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplQXR0YWNobWVudHMoKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuZ2V0RXh0ZW5zaW9uKFwiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdFwiKTsgLy8gVE9ETzogZGlzYWJsZSBzc2FvIGlmIG5vdCBzdXBwb3J0ZWRcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLmZib01haW4gPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xGcmFtZWJ1ZmZlcj4oUmVuZGVyV2ViR0wuY3JjMy5jcmVhdGVGcmFtZWJ1ZmZlcigpKTtcclxuICAgICAgUmVuZGVyV2ViR0wuZmJvUG9zdCA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTEZyYW1lYnVmZmVyPihSZW5kZXJXZWJHTC5jcmMzLmNyZWF0ZUZyYW1lYnVmZmVyKCkpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5mYm9UYXJnZXQgPSBudWxsO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wudGV4Q29sb3IgPSBjcmVhdGVUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgUmVuZGVyV2ViR0wudGV4UG9zaXRpb24gPSBjcmVhdGVUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgUmVuZGVyV2ViR0wudGV4Tm9ybWFsID0gY3JlYXRlVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgIFJlbmRlcldlYkdMLnRleERlcHRoU3RlbmNpbCA9IGNyZWF0ZVRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNMQU1QX1RPX0VER0UpO1xyXG4gICAgICBSZW5kZXJXZWJHTC50ZXhOb2lzZSA9IGNyZWF0ZVRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNMQU1QX1RPX0VER0UpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzID0gbmV3IEFycmF5KDYpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1tpXSA9IGNyZWF0ZVRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FQVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcblxyXG4gICAgICBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKF9maWx0ZXI6IG51bWJlciwgX3dyYXA6IG51bWJlcik6IFdlYkdMVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmNyYzM7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZTogV2ViR0xUZXh0dXJlID0gUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMVGV4dHVyZT4oY3JjMy5jcmVhdGVUZXh0dXJlKCkpO1xyXG4gICAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfTUlOX0ZJTFRFUiwgX2ZpbHRlcik7XHJcbiAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01BR19GSUxURVIsIF9maWx0ZXIpO1xyXG4gICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1MsIF93cmFwKTtcclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfV1JBUF9ULCBfd3JhcCk7XHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIG51bGwpO1xyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3RzIHRoZSBzaXplIG9mIHRoZSBkaWZmZXJlbnQgdGV4dHVyZSBhdHRhY2htZW50cyAocmVuZGVyIHRhcmdldHMpIHRvIHRoZSBjYW52YXMgc2l6ZVxyXG4gICAgICog4pqg77iPIENBVVRJT046IEV4cGVuc2l2ZSBvcGVyYXRpb24sIHVzZSBvbmx5IHdoZW4gY2FudmFzIHNpemUgY2hhbmdlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkanVzdEF0dGFjaG1lbnRzKCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gY3JjMy5jYW52YXMud2lkdGggfHwgMTtcclxuICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBjcmMzLmNhbnZhcy5oZWlnaHQgfHwgMTtcclxuXHJcbiAgICAgIGNyYzMuYWN0aXZlVGV4dHVyZShjcmMzLlRFWFRVUkUwKTtcclxuXHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhDb2xvcik7XHJcbiAgICAgIGNyYzMudGV4SW1hZ2UyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQSwgd2lkdGgsIGhlaWdodCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX0JZVEUsIG51bGwpO1xyXG5cclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleFBvc2l0aW9uKTtcclxuICAgICAgLy8gSW4gdmlldyBzcGFjZSAxNkYgd291bGQgYmUgcHJlY2lzZSBlbm91Z2guLi4gYnV0IHdlIHdhbnQgdG8gdXNlIHdvcmxkIHNwYWNlIGZvciBjYWxjdWxhdGlvbnNcclxuICAgICAgY3JjMy50ZXhJbWFnZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBMzJGLCB3aWR0aCwgaGVpZ2h0LCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRkxPQVQsIG51bGwpO1xyXG5cclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleE5vcm1hbCk7XHJcbiAgICAgIGNyYzMudGV4SW1hZ2UyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQTE2Riwgd2lkdGgsIGhlaWdodCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZMT0FULCBudWxsKTtcclxuXHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhEZXB0aFN0ZW5jaWwpO1xyXG4gICAgICBjcmMzLnRleEltYWdlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIMjRfU1RFTkNJTDgsIHdpZHRoLCBoZWlnaHQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfU1RFTkNJTCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTlNJR05FRF9JTlRfMjRfOCwgbnVsbCk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleENvbG9yLCAwKTtcclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQxLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleFBvc2l0aW9uLCAwKTtcclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQyLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleE5vcm1hbCwgMCk7XHJcbiAgICAgIGNyYzMuZnJhbWVidWZmZXJUZXh0dXJlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4RGVwdGhTdGVuY2lsLCAwKTtcclxuICAgICAgY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgbnVsbCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwLCBkaXZpc29yOiBudW1iZXIgPSAxOyBpIDwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzLmxlbmd0aDsgaSsrLCBkaXZpc29yICo9IDIpIHtcclxuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IE1hdGgubWF4KE1hdGgucm91bmQoY3JjMy5jYW52YXMud2lkdGggLyBkaXZpc29yKSwgMSk7XHJcbiAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gTWF0aC5tYXgoTWF0aC5yb3VuZChjcmMzLmNhbnZhcy5oZWlnaHQgLyBkaXZpc29yKSwgMSk7XHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1tpXSk7XHJcbiAgICAgICAgY3JjMy50ZXhJbWFnZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfQllURSwgbnVsbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5WYWx1ZXM6IG51bWJlciA9IHdpZHRoICogaGVpZ2h0ICogNDtcclxuICAgICAgY29uc3Qgbm9pc2VEYXRhOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoblZhbHVlcyk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgblZhbHVlczsgaSArPSA0KSB7XHJcbiAgICAgICAgbm9pc2VEYXRhW2ldID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KTtcclxuICAgICAgICBub2lzZURhdGFbaSArIDFdID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KTtcclxuICAgICAgICBub2lzZURhdGFbaSArIDJdID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KTtcclxuICAgICAgICBub2lzZURhdGFbaSArIDNdID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShjcmMzLlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleE5vaXNlKTtcclxuICAgICAgY3JjMy50ZXhJbWFnZTJEKGNyYzMuVEVYVFVSRV8yRCwgMCwgY3JjMy5SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBjcmMzLlJHQkEsIGNyYzMuVU5TSUdORURfQllURSwgbm9pc2VEYXRhKTtcclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShjcmMzLlRFWFRVUkVfMkQsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBQaWNraW5nXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSB0ZXh0dXJlIGJ1ZmZlciB0byBiZSB1c2VkIGFzIHBpY2stYnVmZmVyXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgY3JlYXRlUGlja1RleHR1cmUoX3NpemU6IG51bWJlcik6IFJlbmRlclRleHR1cmUge1xyXG4gICAgICAvLyBjcmVhdGUgdG8gcmVuZGVyIHRvXHJcbiAgICAgIGNvbnN0IHRhcmdldFRleHR1cmU6IFJlbmRlclRleHR1cmUgPSBSZW5kZXJXZWJHTC5hc3NlcnQoUmVuZGVyLmNyYzMuY3JlYXRlVGV4dHVyZSgpKTtcclxuICAgICAgUmVuZGVyLmNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCB0YXJnZXRUZXh0dXJlKTsgLy8gVE9ETzogY2hlY2sgaWYgc3VwZXJjbGFzcyAoUmVuZGVyV2ViR0wpIHNob3VsZCByZWZlciBkb3dud2FyZHMgdG8gc3ViY2xhc3MgKFJlbmRlcikgbGlrZSB0aGlzXHJcblxyXG4gICAgICB7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxGb3JtYXQ6IG51bWJlciA9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQTMySTtcclxuICAgICAgICBjb25zdCBmb3JtYXQ6IG51bWJlciA9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQV9JTlRFR0VSO1xyXG4gICAgICAgIGNvbnN0IHR5cGU6IG51bWJlciA9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuSU5UO1xyXG4gICAgICAgIFJlbmRlci5waWNrQnVmZmVyID0gbmV3IEludDMyQXJyYXkoX3NpemUgKiBfc2l6ZSAqIDQpO1xyXG4gICAgICAgIFJlbmRlci5jcmMzLnRleEltYWdlMkQoXHJcbiAgICAgICAgICBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIGludGVybmFsRm9ybWF0LCBfc2l6ZSwgX3NpemUsIDAsIGZvcm1hdCwgdHlwZSwgUmVuZGVyLnBpY2tCdWZmZXJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBzZXQgdGhlIGZpbHRlcmluZyBzbyB3ZSBkb24ndCBuZWVkIG1pcHNcclxuICAgICAgICBSZW5kZXIuY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01JTl9GSUxURVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTElORUFSKTtcclxuICAgICAgICBSZW5kZXIuY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfUywgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgICBSZW5kZXIuY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZnJhbWVidWZmZXI6IFdlYkdMRnJhbWVidWZmZXIgPSBSZW5kZXIuY3JjMy5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG4gICAgICBSZW5kZXIuY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpO1xyXG4gICAgICBjb25zdCBhdHRhY2htZW50UG9pbnQ6IG51bWJlciA9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDA7XHJcbiAgICAgIFJlbmRlci5jcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnRQb2ludCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCB0YXJnZXRUZXh0dXJlLCAwKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLnNpemVQaWNrID0gX3NpemU7XHJcbiAgICAgIHJldHVybiB0YXJnZXRUZXh0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0UGlja3MoX3NpemU6IG51bWJlciwgX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhKTogUGlja1tdIHtcclxuICAgICAgLy8gZXZhbHVhdGUgdGV4dHVyZSBieSByZWFkaW5nIHBpeGVscyBhbmQgZXh0cmFjdCwgY29udmVydCBhbmQgc3RvcmUgdGhlIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggbWVzaCBoaXRcclxuICAgICAgbGV0IGRhdGE6IEludDMyQXJyYXkgPSBuZXcgSW50MzJBcnJheShfc2l6ZSAqIF9zaXplICogNCk7XHJcbiAgICAgIFJlbmRlci5jcmMzLnJlYWRQaXhlbHMoMCwgMCwgX3NpemUsIF9zaXplLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkFfSU5URUdFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5JTlQsIGRhdGEpO1xyXG5cclxuICAgICAgbGV0IG10eFZpZXdUb1dvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSU5WRVJTRShfY21wQ2FtZXJhLm10eFdvcmxkVG9WaWV3KTtcclxuICAgICAgbGV0IHBpY2tlZDogUGlja1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBSZW5kZXIuxpJwaWNrZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgekJ1ZmZlcjogbnVtYmVyID0gZGF0YVs0ICogaSArIDBdICsgZGF0YVs0ICogaSArIDFdIC8gMjU2O1xyXG4gICAgICAgIGlmICh6QnVmZmVyID09IDApIC8vIGRpc2NhcmQgbWlzc2VzIFxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgbGV0IHBpY2s6IFBpY2sgPSBSZW5kZXIuxpJwaWNrZWRbaV07XHJcbiAgICAgICAgcGljay56QnVmZmVyID0gY29udmVydEludDMydG9GbG9hdDMyKGRhdGEsIDQgKiBpICsgMCkgKiAyIC0gMTtcclxuICAgICAgICBwaWNrLmNvbG9yID0gY29udmVydEludDMydG9Db2xvcihkYXRhLCA0ICogaSArIDEpO1xyXG4gICAgICAgIHBpY2sudGV4dHVyZVVWID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgICAgIHBpY2sudGV4dHVyZVVWLnNldChjb252ZXJ0SW50MzJ0b0Zsb2F0MzIoZGF0YSwgNCAqIGkgKyAyKSwgY29udmVydEludDMydG9GbG9hdDMyKGRhdGEsIDQgKiBpICsgMykpO1xyXG4gICAgICAgIHBpY2subXR4Vmlld1RvV29ybGQgPSBtdHhWaWV3VG9Xb3JsZDtcclxuXHJcbiAgICAgICAgcGlja2VkLnB1c2gocGljayk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBwaWNrZWQ7XHJcblxyXG4gICAgICBmdW5jdGlvbiBjb252ZXJ0SW50MzJ0b0Zsb2F0MzIoX2ludDMyQXJyYXk6IEludDMyQXJyYXksIF9pbmRleDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgYnVmZmVyOiBBcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig0KTtcclxuICAgICAgICBsZXQgdmlldzogRGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcclxuICAgICAgICB2aWV3LnNldEludDMyKDAsIF9pbnQzMkFycmF5W19pbmRleF0pO1xyXG4gICAgICAgIHJldHVybiB2aWV3LmdldEZsb2F0MzIoMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGNvbnZlcnRJbnQzMnRvQ29sb3IoX2ludDMyQXJyYXk6IEludDMyQXJyYXksIF9pbmRleDogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICAgIGxldCBidWZmZXI6IEFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDQpO1xyXG4gICAgICAgIGxldCB2aWV3OiBEYXRhVmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xyXG4gICAgICAgIHZpZXcuc2V0SW50MzIoMCwgX2ludDMyQXJyYXlbX2luZGV4XSk7XHJcbiAgICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IENvbG9yLkNTUyhgcmdiKCR7dmlldy5nZXRVaW50OCgwKX0sICR7dmlldy5nZXRVaW50OCgxKX0sICR7dmlldy5nZXRVaW50OCgyKX0pYCwgdmlldy5nZXRVaW50OCgzKSAvIDI1NSk7XHJcbiAgICAgICAgcmV0dXJuIGNvbG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFRoZSByZW5kZXIgZnVuY3Rpb24gZm9yIHBpY2tpbmcgYSBzaW5nbGUgbm9kZS4gXHJcbiAgICAqIEEgY2FtZXJhcHJvamVjdGlvbiB3aXRoIGV4dHJlbWVseSBuYXJyb3cgZm9jdXMgaXMgdXNlZCwgc28gZWFjaCBwaXhlbCBvZiB0aGUgYnVmZmVyIHdvdWxkIGhvbGQgdGhlIHNhbWUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbm9kZSwgIFxyXG4gICAgKiBidXQgdGhlIGZyYWdtZW50IHNoYWRlciByZW5kZXJzIG9ubHkgMSBwaXhlbCBmb3IgZWFjaCBub2RlIGludG8gdGhlIHJlbmRlciBidWZmZXIsIDFzdCBub2RlIHRvIDFzdCBwaXhlbCwgMm5kIG5vZGUgdG8gc2Vjb25kIHBpeGVsIGV0Yy5cclxuICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHBpY2soX25vZGU6IE5vZGUsIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IHZvaWQgeyAvLyBjcmVhdGUgVGV4dHVyZSB0byByZW5kZXIgdG8sIGludC1yZ2JhXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCk7XHJcbiAgICAgICAgbGV0IGNtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCA9IF9ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCk7XHJcbiAgICAgICAgbGV0IGNvYXQ6IENvYXQgPSBjbXBNYXRlcmlhbC5tYXRlcmlhbC5jb2F0O1xyXG4gICAgICAgIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IGNvYXQgaW5zdGFuY2VvZiBDb2F0VGV4dHVyZWQgPyBTaGFkZXJQaWNrVGV4dHVyZWQgOiBTaGFkZXJQaWNrO1xyXG5cclxuICAgICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG4gICAgICAgIGNvYXQudXNlUmVuZGVyRGF0YShzaGFkZXIsIGNtcE1hdGVyaWFsKTtcclxuICAgICAgICBsZXQgbXR4TWVzaFRvVmlldzogTWF0cml4NHg0ID0gdGhpcy5jYWxjTWVzaFRvVmlldyhfbm9kZSwgY21wTWVzaC5tdHhXb3JsZCwgX2NtcENhbWVyYS5tdHhXb3JsZFRvVmlldywgX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcblxyXG4gICAgICAgIGxldCBzaXplVW5pZm9ybUxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiA9IHNoYWRlci51bmlmb3Jtc1tcInVfdmN0U2l6ZVwiXTtcclxuICAgICAgICBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkudW5pZm9ybTJmdihzaXplVW5pZm9ybUxvY2F0aW9uLCBbUmVuZGVyV2ViR0wuc2l6ZVBpY2ssIFJlbmRlcldlYkdMLnNpemVQaWNrXSk7XHJcblxyXG4gICAgICAgIGxldCBtZXNoOiBNZXNoID0gY21wTWVzaC5tZXNoO1xyXG4gICAgICAgIGxldCByZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gbWVzaC51c2VSZW5kZXJCdWZmZXJzKHNoYWRlciwgX25vZGUubXR4V29ybGQsIG10eE1lc2hUb1ZpZXcsIFJlbmRlci7GknBpY2tlZC5sZW5ndGgpO1xyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuZHJhd0VsZW1lbnRzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCByZW5kZXJCdWZmZXJzLm5JbmRpY2VzLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX1NIT1JULCAwKTtcclxuXHJcbiAgICAgICAgbGV0IHBpY2s6IFBpY2sgPSBuZXcgUGljayhfbm9kZSk7XHJcbiAgICAgICAgUmVuZGVyLsaScGlja2VkLnB1c2gocGljayk7XHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgIC8vXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHBpY2tHaXptb3MoX2dpem1vczogQ29tcG9uZW50W10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgLy8gYnVmZmVyIHRoZXNlIGludG8gYm90aCBzaGFkZXJzIGFzIHdlIGRvbid0IGtub3cgd2hpY2ggb25lIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGdpem1vXHJcbiAgICAgIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IFNoYWRlclBpY2s7XHJcbiAgICAgIHNoYWRlci51c2VQcm9ncmFtKCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTJmdihzaGFkZXIudW5pZm9ybXNbXCJ1X3ZjdFNpemVcIl0sIFtSZW5kZXJXZWJHTC5zaXplUGljaywgUmVuZGVyV2ViR0wuc2l6ZVBpY2tdKTtcclxuICAgICAgc2hhZGVyID0gU2hhZGVyUGlja1RleHR1cmVkO1xyXG4gICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0yZnYoc2hhZGVyLnVuaWZvcm1zW1widV92Y3RTaXplXCJdLCBbUmVuZGVyV2ViR0wuc2l6ZVBpY2ssIFJlbmRlcldlYkdMLnNpemVQaWNrXSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybU1hdHJpeDNmdihzaGFkZXIudW5pZm9ybXNbXCJ1X210eFBpdm90XCJdLCBmYWxzZSwgTWF0cml4M3gzLklERU5USVRZKCkuZ2V0KCkpOyAvLyBvbmx5IG5lZWRlZCBmb3IgdGV4dHVyZWQgcGljayBzaGFkZXIsIGJ1dCBnaXptb3MgaGF2ZSBubyBwaXZvdFxyXG5cclxuICAgICAgR2l6bW9zLnBpY2soX2dpem1vcywgX2NtcENhbWVyYSwgUmVuZGVyLsaScGlja2VkKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVmZmVyIHRoZSBmb2cgcGFyYW1ldGVycyBpbnRvIHRoZSBmb2cgdWJvXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgYnVmZmVyRm9nKF9jbXBGb2c6IENvbXBvbmVudEZvZyk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgY29uc3QgZGF0YTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSg4KTtcclxuXHJcbiAgICAgIGRhdGFbMF0gPSBfY21wRm9nPy5pc0FjdGl2ZSA/IDEgOiAwO1xyXG4gICAgICBpZiAoX2NtcEZvZykge1xyXG4gICAgICAgIGRhdGFbMV0gPSBfY21wRm9nLm5lYXI7XHJcbiAgICAgICAgZGF0YVsyXSA9IF9jbXBGb2cuZmFyO1xyXG4gICAgICAgIGRhdGEuc2V0KF9jbXBGb2cuY29sb3IuZ2V0KCksIDQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBidWZmZXIgZGF0YSB0byBib3VuZCBidWZmZXJcclxuICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIFJlbmRlcldlYkdMLnVib0ZvZyk7XHJcbiAgICAgIGNyYzMuYnVmZmVyRGF0YShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBkYXRhLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlNUQVRJQ19EUkFXKTtcclxuXHJcbiAgICAgIC8vIGJpbmQgYnVmZmVyIHRvIGJpbmRpbmcgcG9pbnRcclxuICAgICAgY3JjMy5iaW5kQnVmZmVyQmFzZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBVTklGT1JNX0JMT0NLUy5GT0cuQklORElORywgUmVuZGVyV2ViR0wudWJvRm9nKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1ZmZlciB0aGUgZGF0YSBmcm9tIHRoZSBsaWdodHMgaW4gdGhlIHNjZW5lZ3JhcGggaW50byB0aGUgbGlnaHRzIHVib1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGJ1ZmZlckxpZ2h0cyhfbGlnaHRzOiBNYXBMaWdodFR5cGVUb0xpZ2h0TGlzdCk6IHZvaWQge1xyXG4gICAgICBpZiAoIVJlbmRlcldlYkdMLnVib0xpZ2h0cylcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgUmVuZGVyV2ViR0wudWJvTGlnaHRzKTtcclxuXHJcbiAgICAgIC8vIGZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhbWJpZW50IGxpZ2h0IGNvbG9yXHJcbiAgICAgIGxldCBjbXBMaWdodHM6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PiA9IF9saWdodHMuZ2V0KExpZ2h0QW1iaWVudCk7XHJcbiAgICAgIGlmIChjbXBMaWdodHMpIHtcclxuICAgICAgICBsZXQgY2xyU3VtOiBDb2xvciA9IG5ldyBDb2xvcigwLCAwLCAwLCAwKTtcclxuICAgICAgICBmb3IgKGxldCBjbXBMaWdodCBvZiBjbXBMaWdodHMpXHJcbiAgICAgICAgICBjbHJTdW0uYWRkKGNtcExpZ2h0LmxpZ2h0LmNvbG9yKTtcclxuXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5idWZmZXJTdWJEYXRhKFxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5VTklGT1JNX0JVRkZFUixcclxuICAgICAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0c1ZhcmlhYmxlT2Zmc2V0c1tcInVfYW1iaWVudC52Y3RDb2xvclwiXSwgLy8gYnl0ZSBvZmZzZXQgb2YgdGhlIHN0cnVjdCBMaWdodCBcInVfYW1iaWVudFwiIGluc2lkZSB0aGUgdWJvXHJcbiAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KGNsclN1bS5nZXQoKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBmaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgbGlnaHQgZGF0YSBmb3IgZWFjaCBsaWdodCB0eXBlXHJcbiAgICAgIC8vIHdlIGFyZSBjdXJyZW50bHkgZG9pbmcgYSBtYXhpbXVtIG9mIDQgY3JjMy5idWZmZXJTdWJEYXRhKCkgY2FsbHMsIGJ1dCB3ZSBjb3VsZCBkbyB0aGlzIGluIG9uZSBjYWxsXHJcbiAgICAgIGJ1ZmZlckxpZ2h0c09mVHlwZShMaWdodERpcmVjdGlvbmFsLCBcInVfbkxpZ2h0c0RpcmVjdGlvbmFsXCIsIFwidV9kaXJlY3Rpb25hbFwiKTtcclxuICAgICAgYnVmZmVyTGlnaHRzT2ZUeXBlKExpZ2h0UG9pbnQsIFwidV9uTGlnaHRzUG9pbnRcIiwgXCJ1X3BvaW50XCIpO1xyXG4gICAgICBidWZmZXJMaWdodHNPZlR5cGUoTGlnaHRTcG90LCBcInVfbkxpZ2h0c1Nwb3RcIiwgXCJ1X3Nwb3RcIik7XHJcblxyXG4gICAgICBmdW5jdGlvbiBidWZmZXJMaWdodHNPZlR5cGUoX3R5cGU6IFR5cGVPZkxpZ2h0LCBfdW5pTmFtZTogc3RyaW5nLCBfdW5pU3RydWN0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjbXBMaWdodHM6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PiA9IF9saWdodHMuZ2V0KF90eXBlKTtcclxuXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5idWZmZXJTdWJEYXRhKFxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5VTklGT1JNX0JVRkZFUixcclxuICAgICAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0c1ZhcmlhYmxlT2Zmc2V0c1tfdW5pTmFtZV0sIC8vIGJ5dGUgb2Zmc2V0IG9mIHRoZSB1aW50IFwidV9uTGlnaHRzRGlyZWN0aW9uYWxcIiBpbnNpZGUgdGhlIHVib1xyXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoW2NtcExpZ2h0cz8ubGVuZ3RoID8/IDBdKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmICghY21wTGlnaHRzKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBsaWdodERhdGFTaXplOiBudW1iZXIgPSA0ICsgMTYgKyAxNjsgLy8gdmN0Q29sb3IgKyBtdHhTaGFwZSArIG10eFNoYXBlSW52ZXJzZSwgYXMgZmxvYXQzMnNcclxuICAgICAgICBjb25zdCBsaWdodHNEYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGNtcExpZ2h0cy5sZW5ndGggKiBsaWdodERhdGFTaXplKTtcclxuXHJcbiAgICAgICAgbGV0IGlMaWdodDogbnVtYmVyID0gMDtcclxuICAgICAgICBmb3IgKGxldCBjbXBMaWdodCBvZiBjbXBMaWdodHMpIHtcclxuICAgICAgICAgIGNvbnN0IGxpZ2h0RGF0YU9mZnNldDogbnVtYmVyID0gaUxpZ2h0ICogbGlnaHREYXRhU2l6ZTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgdmN0Q29sb3JcclxuICAgICAgICAgIGxpZ2h0c0RhdGEuc2V0KGNtcExpZ2h0LmxpZ2h0LmNvbG9yLmdldCgpLCBsaWdodERhdGFPZmZzZXQgKyAwKTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgbXR4U2hhcGVcclxuICAgICAgICAgIGxldCBtdHhUb3RhbDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QoY21wTGlnaHQubm9kZS5tdHhXb3JsZCwgY21wTGlnaHQubXR4UGl2b3QpO1xyXG4gICAgICAgICAgaWYgKF90eXBlID09IExpZ2h0RGlyZWN0aW9uYWwpIHtcclxuICAgICAgICAgICAgbGV0IHplcm86IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgICAgICAgICAgbXR4VG90YWwudHJhbnNsYXRpb24gPSB6ZXJvO1xyXG4gICAgICAgICAgICBSZWN5Y2xlci5zdG9yZSh6ZXJvKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsaWdodHNEYXRhLnNldChtdHhUb3RhbC5nZXQoKSwgbGlnaHREYXRhT2Zmc2V0ICsgNCk7IC8vIG9mZnNldCArIHZjdENvbG9yXHJcblxyXG4gICAgICAgICAgLy8gc2V0IG10eFNoYXBlSW52ZXJzZVxyXG4gICAgICAgICAgaWYgKF90eXBlICE9IExpZ2h0RGlyZWN0aW9uYWwpIHtcclxuICAgICAgICAgICAgbGV0IG10eEludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFRvdGFsKTtcclxuICAgICAgICAgICAgbGlnaHRzRGF0YS5zZXQobXR4SW52ZXJzZS5nZXQoKSwgbGlnaHREYXRhT2Zmc2V0ICsgNCArIDE2KTsgLy8gb2Zmc2V0ICsgdmN0Q29sb3IgKyBtdHhTaGFwZVxyXG4gICAgICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhJbnZlcnNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhUb3RhbCk7XHJcbiAgICAgICAgICBpTGlnaHQrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuYnVmZmVyU3ViRGF0YShcclxuICAgICAgICAgIFJlbmRlcldlYkdMLmNyYzMuVU5JRk9STV9CVUZGRVIsXHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNWYXJpYWJsZU9mZnNldHNbYCR7X3VuaVN0cnVjdH1bMF0udmN0Q29sb3JgXSwgLy8gYnl0ZSBvZmZzZXQgb2YgdGhlIHN0cnVjdCBMaWdodCBhcnJheSBpbnNpZGUgdGhlIHVib1xyXG4gICAgICAgICAgbGlnaHRzRGF0YVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoZSBnaXZlbiBub2RlcyB1c2luZyB0aGUgZ2l2ZW4gY2FtZXJhIGFuZCB0aGUgcG9zdCBwcm9jZXNzIGNvbXBvbmVudHMgYXR0YWNoZWQgdG8gdGhlIHNhbWUgbm9kZSBhcyB0aGUgY2FtZXJhXHJcbiAgICAgKiBUaGUgb3BhcXVlIG5vZGVzIGFyZSBkcmF3biBmaXJzdCwgdGhlbiBzc2FvIGlzIGFwcGxpZWQsIHRoZW4gYmxvb20gaXMgYXBwbGllZCwgdGhlbiBub2RlcyBhbHBoYSAoc29ydEZvckFscGhhKSBhcmUgZHJhd24uXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZHJhd05vZGVzKF9ub2Rlc09wYXF1ZTogSXRlcmFibGU8Tm9kZT4sIF9ub2Rlc0FscGhhOiBJdGVyYWJsZTxOb2RlPiwgX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcblxyXG4gICAgICBjb25zdCBjbXBGb2c6IENvbXBvbmVudEZvZyA9IF9jbXBDYW1lcmEubm9kZT8uZ2V0Q29tcG9uZW50KENvbXBvbmVudEZvZyk7XHJcbiAgICAgIGNvbnN0IGNtcEFtYmllbnRPY2NsdXNpb246IENvbXBvbmVudEFtYmllbnRPY2NsdXNpb24gPSBfY21wQ2FtZXJhLm5vZGU/LmdldENvbXBvbmVudChDb21wb25lbnRBbWJpZW50T2NjbHVzaW9uKTtcclxuICAgICAgY29uc3QgY21wQmxvb206IENvbXBvbmVudEJsb29tID0gX2NtcENhbWVyYS5ub2RlPy5nZXRDb21wb25lbnQoQ29tcG9uZW50Qmxvb20pO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuYnVmZmVyRm9nKGNtcEZvZyk7XHJcblxyXG4gICAgICAvLyBvcGFxdWUgcGFzcyBcclxuICAgICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgZGlzYWJsaW5nIGJsZW5kaW5nIGZvciBhbGwgb3BhcXVlIG9iamVjdHMsIHRoaXMgbWlnaHQgaW1wcm92ZSBwZXJmb3JtYW5jZSBcclxuICAgICAgLy8gYXMgb3RoZXJ3aXNlIHRoZSAzIGNvbG9yIGF0dGFjaG1lbnRzIChjb2xvciwgcG9zaXRpb24gYW5kIG5vcm1hbHMpIGFsbCBuZWVkIHRvIGJlIGJsZW5kZWRcclxuICAgICAgY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvTWFpbik7XHJcbiAgICAgIGNyYzMuZHJhd0J1ZmZlcnMoY21wQW1iaWVudE9jY2x1c2lvbj8uaXNBY3RpdmUgPyAvLyBvbmx5IHVzZSBwb3NpdGlvbiBhbmQgbm9ybWFsIHRleHR1cmVzIGlmIGFtYmllbnQgb2NjbHVzaW9uIGlzIGFjdGl2ZVxyXG4gICAgICAgIFtXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQxLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQyXSA6XHJcbiAgICAgICAgW1dlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDBdXHJcbiAgICAgICk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNsZWFyKF9jbXBDYW1lcmEuY2xyQmFja2dyb3VuZCk7XHJcblxyXG4gICAgICAvLyBjcmMzLmRpc2FibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5CTEVORCk7XHJcbiAgICAgIGZvciAobGV0IG5vZGUgb2YgX25vZGVzT3BhcXVlKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmRyYXdOb2RlKG5vZGUsIF9jbXBDYW1lcmEpO1xyXG4gICAgICAvLyBjcmMzLmVuYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkJMRU5EKTtcclxuXHJcbiAgICAgIC8vIGFtYmllbnQgb2NjbHVzaW9uIHBhc3NcclxuICAgICAgaWYgKGNtcEFtYmllbnRPY2NsdXNpb24/LmlzQWN0aXZlKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmRyYXdBbWJpZW50T2NjbHVzaW9uKF9jbXBDYW1lcmEsIGNtcEFtYmllbnRPY2NsdXNpb24pO1xyXG5cclxuICAgICAgLy8gYmxvb20gcGFzc1xyXG4gICAgICBpZiAoY21wQmxvb20/LmlzQWN0aXZlKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmRyYXdCbG9vbShjbXBCbG9vbSk7XHJcblxyXG4gICAgICAvLyB0cmFuc3BhcmVudCBwYXNzIFRPRE86IHRoaW5rIGFib3V0IGRpc2FibGluZyBkZXB0aCB3cml0ZSBmb3IgYWxsIHRyYW5zcGFyZW50IG9iamVjdHMgLT4gdGhpcyBtaWdodCBtYWtlIGRlcHRoIG1hc2sgb3B0aW9uIGluIGNvbXBvbmVudCBwYXJ0aWNsZSBzeXN0ZW0gb2Jzb2xldGVcclxuICAgICAgY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvTWFpbik7XHJcbiAgICAgIGNyYzMuZHJhd0J1ZmZlcnMoW1dlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDBdKTtcclxuXHJcbiAgICAgIC8vIGNyYzMuZGVwdGhNYXNrKGZhbHNlKTtcclxuICAgICAgZm9yIChsZXQgbm9kZSBvZiBfbm9kZXNBbHBoYSlcclxuICAgICAgICBSZW5kZXJXZWJHTC5kcmF3Tm9kZShub2RlLCBfY21wQ2FtZXJhKTtcclxuICAgICAgLy8gY3JjMy5kZXB0aE1hc2sodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBjb3B5IGZyYW1lYnVmZmVyIHRvIGNhbnZhc1xyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJFQURfRlJBTUVCVUZGRVIsIFJlbmRlcldlYkdMLmZib01haW4pO1xyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRSQVdfRlJBTUVCVUZGRVIsIFJlbmRlcldlYkdMLmZib1RhcmdldCk7XHJcbiAgICAgIGNyYzMuYmxpdEZyYW1lYnVmZmVyKDAsIDAsIGNyYzMuY2FudmFzLndpZHRoLCBjcmMzLmNhbnZhcy5oZWlnaHQsIDAsIDAsIGNyYzMuY2FudmFzLndpZHRoLCBjcmMzLmNhbnZhcy5oZWlnaHQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQlVGRkVSX0JJVCB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfQlVGRkVSX0JJVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoZSBvY2NsdXNpb24gb3ZlciB0aGUgY29sb3ItYnVmZmVyLCB1c2luZyB0aGUgZ2l2ZW4gYW1iaWVudC1vY2NsdXNpb24tY29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZHJhd0FtYmllbnRPY2NsdXNpb24oX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhLCBfY21wQW1iaWVudE9jY2x1c2lvbjogQ29tcG9uZW50QW1iaWVudE9jY2x1c2lvbik6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBTaGFkZXJBbWJpZW50T2NjbHVzaW9uLnVzZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLmJpbmRUZXh0dXJlKFNoYWRlckFtYmllbnRPY2NsdXNpb24sIFJlbmRlcldlYkdMLnRleFBvc2l0aW9uLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwLCBcInVfdGV4UG9zaXRpb25cIik7XHJcbiAgICAgIFJlbmRlcldlYkdMLmJpbmRUZXh0dXJlKFNoYWRlckFtYmllbnRPY2NsdXNpb24sIFJlbmRlcldlYkdMLnRleE5vcm1hbCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMSwgXCJ1X3RleE5vcm1hbFwiKTtcclxuICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQW1iaWVudE9jY2x1c2lvbiwgUmVuZGVyV2ViR0wudGV4Tm9pc2UsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTIsIFwidV90ZXhOb2lzZVwiKTtcclxuXHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZOZWFyXCJdLCBfY21wQ2FtZXJhLmdldE5lYXIoKSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZGYXJcIl0sIF9jbXBDYW1lcmEuZ2V0RmFyKCkpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihTaGFkZXJBbWJpZW50T2NjbHVzaW9uLnVuaWZvcm1zW1widV9mQmlhc1wiXSwgX2NtcEFtYmllbnRPY2NsdXNpb24uYmlhcyk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZTYW1wbGVSYWRpdXNcIl0sIF9jbXBBbWJpZW50T2NjbHVzaW9uLnNhbXBsZVJhZGl1cyk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZBdHRlbnVhdGlvbkNvbnN0YW50XCJdLCBfY21wQW1iaWVudE9jY2x1c2lvbi5hdHRlbnVhdGlvbkNvbnN0YW50KTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZkF0dGVudWF0aW9uTGluZWFyXCJdLCBfY21wQW1iaWVudE9jY2x1c2lvbi5hdHRlbnVhdGlvbkxpbmVhcik7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZBdHRlbnVhdGlvblF1YWRyYXRpY1wiXSwgX2NtcEFtYmllbnRPY2NsdXNpb24uYXR0ZW51YXRpb25RdWFkcmF0aWMpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0yZihTaGFkZXJBbWJpZW50T2NjbHVzaW9uLnVuaWZvcm1zW1widV92Y3RSZXNvbHV0aW9uXCJdLCBSZW5kZXJXZWJHTC5nZXRDYW52YXMoKS53aWR0aCwgUmVuZGVyV2ViR0wuZ2V0Q2FudmFzKCkuaGVpZ2h0KTtcclxuICAgICAgY3JjMy51bmlmb3JtM2Z2KFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X3ZjdENhbWVyYVwiXSwgX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbi5nZXQoKSk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9Qb3N0KTtcclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleENvbG9yLCAwKTtcclxuICAgICAgUmVuZGVyV2ViR0wuc2V0QmxlbmRNb2RlKEJMRU5ELlNVQlRSQUNUSVZFKTtcclxuICAgICAgY3JjMy5kcmF3QXJyYXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCAwLCAzKTtcclxuICAgICAgUmVuZGVyV2ViR0wuc2V0QmxlbmRNb2RlKEJMRU5ELlRSQU5TUEFSRU5UKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoZSBibG9vbS1lZmZlY3Qgb3ZlciB0aGUgY29sb3ItYnVmZmVyLCB1c2luZyB0aGUgZ2l2ZW4gYmxvb20tY29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZHJhd0Jsb29tKF9jbXBCbG9vbTogQ29tcG9uZW50Qmxvb20pOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgU2hhZGVyQmxvb20udXNlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgLy8gZXh0cmFjdCBicmlnaHQgY29sb3JzLCBjb3VsZCBtb3ZlIHRoaXMgdG8gbWFpbiByZW5kZXIgcGFzcyBzbyB0aGF0IGluZGl2aWR1YWwgb2JqZWN0cyBjYW4gYmUgZXhlbXB0IGZyb20gYmxvb21cclxuICAgICAgY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvUG9zdCk7XHJcbiAgICAgIGNyYzMuZnJhbWVidWZmZXJUZXh0dXJlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9BVFRBQ0hNRU5UMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXNbMF0sIDApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jbGVhcigpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQmxvb20sIFJlbmRlcldlYkdMLnRleENvbG9yLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwLCBcInVfdGV4U291cmNlXCIpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfZlRocmVzaG9sZFwiXSwgX2NtcEJsb29tLnRocmVzaG9sZCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV9pTW9kZVwiXSwgMCk7XHJcbiAgICAgIGNyYzMuZHJhd0FycmF5cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgMCwgMyk7XHJcblxyXG4gICAgICAvLyBkb3duc2FtcGxlXHJcbiAgICAgIGNvbnN0IGl0ZXJhdGlvbnM6IG51bWJlciA9IFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlcy5sZW5ndGg7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDEsIGRpdmlzb3I6IG51bWJlciA9IDI7IGkgPCBpdGVyYXRpb25zOyBpKyssIGRpdmlzb3IgKj0gMikge1xyXG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gTWF0aC5tYXgoTWF0aC5yb3VuZChjcmMzLmNhbnZhcy53aWR0aCAvIGRpdmlzb3IpLCAxKTtcclxuICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXIgPSBNYXRoLm1heChNYXRoLnJvdW5kKGNyYzMuY2FudmFzLmhlaWdodCAvIGRpdmlzb3IpLCAxKTtcclxuXHJcbiAgICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1tpXSwgMCk7XHJcbiAgICAgICAgY3JjMy52aWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQmxvb20sIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1tpIC0gMV0sIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAsIFwidV90ZXhTb3VyY2VcIik7XHJcbiAgICAgICAgY3JjMy51bmlmb3JtMWkoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X2lNb2RlXCJdLCAxKTtcclxuICAgICAgICBjcmMzLnVuaWZvcm0yZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfdmN0VGV4ZWxcIl0sIDAuNSAvIHdpZHRoLCAwLjUgLyBoZWlnaHQpOyAvLyBoYWxmIHRleGVsIHNpemVcclxuICAgICAgICAvLyBjcmMzLnVuaWZvcm0yZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfdmN0UmVzb2x1dGlvblwiXSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGNyYzMuZHJhd0FycmF5cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgMCwgMyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLnNldEJsZW5kTW9kZShCTEVORC5BRERJVElWRSk7XHJcblxyXG4gICAgICAvLyB1cHNhbXBsZVxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBpdGVyYXRpb25zIC0gMSwgZGl2aXNvcjogbnVtYmVyID0gMiAqKiAoaXRlcmF0aW9ucyAtIDIpOyBpID4gMDsgaS0tLCBkaXZpc29yIC89IDIpIHtcclxuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IE1hdGgubWF4KE1hdGgucm91bmQoY3JjMy5jYW52YXMud2lkdGggLyBkaXZpc29yKSwgMSk7XHJcbiAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gTWF0aC5tYXgoTWF0aC5yb3VuZChjcmMzLmNhbnZhcy5oZWlnaHQgLyBkaXZpc29yKSwgMSk7XHJcblxyXG4gICAgICAgIGNyYzMuZnJhbWVidWZmZXJUZXh0dXJlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9BVFRBQ0hNRU5UMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXNbaSAtIDFdLCAwKTtcclxuICAgICAgICBjcmMzLnZpZXdwb3J0KDAsIDAsIE1hdGgucm91bmQod2lkdGgpLCBNYXRoLnJvdW5kKGhlaWdodCkpO1xyXG5cclxuICAgICAgICBSZW5kZXJXZWJHTC5iaW5kVGV4dHVyZShTaGFkZXJCbG9vbSwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzW2ldLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwLCBcInVfdGV4U291cmNlXCIpO1xyXG4gICAgICAgIGNyYzMudW5pZm9ybTFpKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV9pTW9kZVwiXSwgMik7XHJcbiAgICAgICAgY3JjMy51bmlmb3JtMmYoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X3ZjdFRleGVsXCJdLCAwLjUgLyB3aWR0aCwgMC41IC8gaGVpZ2h0KTsgLy8gaGFsZiB0ZXhlbCBzaXplXHJcbiAgICAgICAgLy8gY3JjMy51bmlmb3JtMmYoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X3ZjdFJlc29sdXRpb25cIl0sIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICBjcmMzLmRyYXdBcnJheXMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5UUklBTkdMRVMsIDAsIDMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjcmMzLnZpZXdwb3J0KDAsIDAsIGNyYzMuY2FudmFzLndpZHRoLCBjcmMzLmNhbnZhcy5oZWlnaHQpO1xyXG5cclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleENvbG9yLCAwKTtcclxuICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQmxvb20sIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1swXSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMCwgXCJ1X3RleFNvdXJjZVwiKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X2lNb2RlXCJdLCAzKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X2ZJbnRlbnNpdHlcIl0sIF9jbXBCbG9vbS5pbnRlbnNpdHkpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfZkhpZ2hsaWdodERlc2F0dXJhdGlvblwiXSwgX2NtcEJsb29tLmhpZ2hsaWdodERlc2F0dXJhdGlvbik7XHJcbiAgICAgIGNyYzMuZHJhd0FycmF5cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgMCwgMyk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBhIG1lc2ggYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBpbmZvcyBhbmQgdGhlIGNvbXBsZXRlIHByb2plY3Rpb24gbWF0cml4XHJcbiAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkcmF3Tm9kZShfbm9kZTogTm9kZSwgX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhKTogdm9pZCB7XHJcbiAgICAgIGxldCBjbXBNZXNoOiBDb21wb25lbnRNZXNoID0gX25vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICBsZXQgY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsID0gX25vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1hdGVyaWFsKTtcclxuICAgICAgbGV0IGNtcFRleHQ6IENvbXBvbmVudFRleHQgPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50VGV4dCk7XHJcbiAgICAgIGxldCBjb2F0OiBDb2F0ID0gY21wTWF0ZXJpYWwubWF0ZXJpYWwuY29hdDtcclxuICAgICAgbGV0IGNtcFBhcnRpY2xlU3lzdGVtOiBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSA9IF9ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk7XHJcbiAgICAgIGxldCBkcmF3UGFydGljbGVzOiBib29sZWFuID0gY21wUGFydGljbGVTeXN0ZW0gJiYgY21wUGFydGljbGVTeXN0ZW0uaXNBY3RpdmU7XHJcbiAgICAgIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IGNtcE1hdGVyaWFsLm1hdGVyaWFsLmdldFNoYWRlcigpO1xyXG4gICAgICBpZiAoZHJhd1BhcnRpY2xlcylcclxuICAgICAgICBzaGFkZXIgPSBjbXBQYXJ0aWNsZVN5c3RlbS5wYXJ0aWNsZVN5c3RlbS5nZXRTaGFkZXJGcm9tKHNoYWRlcik7XHJcblxyXG4gICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG4gICAgICBjb2F0LnVzZVJlbmRlckRhdGEoc2hhZGVyLCBjbXBNYXRlcmlhbCk7XHJcblxyXG4gICAgICBsZXQgbXR4TWVzaFRvV29ybGQ6IE1hdHJpeDR4NCA9IGNtcE1lc2gubXR4V29ybGQ7XHJcblxyXG4gICAgICBpZiAoY21wVGV4dD8uaXNBY3RpdmUpXHJcbiAgICAgICAgbXR4TWVzaFRvV29ybGQgPSBjbXBUZXh0LnVzZVJlbmRlckRhdGEobXR4TWVzaFRvV29ybGQsIF9jbXBDYW1lcmEpO1xyXG5cclxuICAgICAgbGV0IG10eE1lc2hUb1ZpZXc6IE1hdHJpeDR4NCA9IFJlbmRlcldlYkdMLmNhbGNNZXNoVG9WaWV3KF9ub2RlLCBtdHhNZXNoVG9Xb3JsZCwgX2NtcENhbWVyYS5tdHhXb3JsZFRvVmlldywgX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgIGxldCByZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gY21wTWVzaC5tZXNoLnVzZVJlbmRlckJ1ZmZlcnMoc2hhZGVyLCBtdHhNZXNoVG9Xb3JsZCwgbXR4TWVzaFRvVmlldyk7XHJcblxyXG4gICAgICBpZiAoY21wTWVzaC5za2VsZXRvbj8uaXNBY3RpdmUpXHJcbiAgICAgICAgY21wTWVzaC5za2VsZXRvbi51c2VSZW5kZXJCdWZmZXIoc2hhZGVyKTtcclxuXHJcbiAgICAgIGxldCB1bmlmb3JtOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiA9IHNoYWRlci51bmlmb3Jtc1tcInVfdmN0Q2FtZXJhXCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSlcclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLnVuaWZvcm0zZnYodW5pZm9ybSwgX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbi5nZXQoKSk7XHJcblxyXG4gICAgICB1bmlmb3JtID0gc2hhZGVyLnVuaWZvcm1zW1widV9tdHhXb3JsZFRvVmlld1wiXTtcclxuICAgICAgaWYgKHVuaWZvcm0pXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy51bmlmb3JtTWF0cml4NGZ2KHVuaWZvcm0sIGZhbHNlLCBfY21wQ2FtZXJhLm10eFdvcmxkVG9WaWV3LmdldCgpKTtcclxuXHJcbiAgICAgIHVuaWZvcm0gPSBzaGFkZXIudW5pZm9ybXNbXCJ1X210eFdvcmxkVG9DYW1lcmFcIl07XHJcbiAgICAgIGlmICh1bmlmb3JtKSB7XHJcbiAgICAgICAgLy8gbGV0IG10eFdvcmxkVG9DYW1lcmE6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNJT04oX2NtcENhbWVyYS5tdHhXb3JsZCk7IC8vIHRvZG86IG9wdGltaXplL3N0b3JlIGluIGNhbWVyYVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMudW5pZm9ybU1hdHJpeDRmdih1bmlmb3JtLCBmYWxzZSwgX2NtcENhbWVyYS5tdHhDYW1lcmFJbnZlcnNlLmdldCgpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdW5pZm9ybSA9IHNoYWRlci51bmlmb3Jtc1tcInVfZkFscGhhQ2xpcFwiXTtcclxuICAgICAgaWYgKHVuaWZvcm0pXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy51bmlmb3JtMWYodW5pZm9ybSwgY21wTWF0ZXJpYWwubWF0ZXJpYWwuYWxwaGFDbGlwKTtcclxuXHJcbiAgICAgIGlmIChkcmF3UGFydGljbGVzKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmRyYXdQYXJ0aWNsZXMoY21wUGFydGljbGVTeXN0ZW0sIHNoYWRlciwgcmVuZGVyQnVmZmVycywgX25vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudEZhY2VDYW1lcmEpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuZHJhd0VsZW1lbnRzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCByZW5kZXJCdWZmZXJzLm5JbmRpY2VzLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX1NIT1JULCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGRyYXdQYXJ0aWNsZXMoX2NtcFBhcnRpY2xlU3lzdGVtOiBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSwgX3NoYWRlcjogU2hhZGVySW50ZXJmYWNlLCBfcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycywgX2NtcEZhY2VDYW1lcmE6IENvbXBvbmVudEZhY2VDYW1lcmEpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGNyYzMuZGVwdGhNYXNrKF9jbXBQYXJ0aWNsZVN5c3RlbS5kZXB0aE1hc2spO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoX2NtcFBhcnRpY2xlU3lzdGVtLmJsZW5kTW9kZSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbXCJ1X2lCbGVuZE1vZGVcIl0sIF9jbXBQYXJ0aWNsZVN5c3RlbS5ibGVuZE1vZGUpO1xyXG4gICAgICBfY21wUGFydGljbGVTeXN0ZW0udXNlUmVuZGVyRGF0YSgpO1xyXG5cclxuICAgICAgY3JjMy51bmlmb3JtMWYoX3NoYWRlci51bmlmb3Jtc1tcInVfZlBhcnRpY2xlU3lzdGVtRHVyYXRpb25cIl0sIF9jbXBQYXJ0aWNsZVN5c3RlbS5kdXJhdGlvbik7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKF9zaGFkZXIudW5pZm9ybXNbXCJ1X2ZQYXJ0aWNsZVN5c3RlbVNpemVcIl0sIF9jbXBQYXJ0aWNsZVN5c3RlbS5zaXplKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoX3NoYWRlci51bmlmb3Jtc1tcInVfZlBhcnRpY2xlU3lzdGVtVGltZVwiXSwgX2NtcFBhcnRpY2xlU3lzdGVtLnRpbWUpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uUEFSVElDTEUuVU5JRk9STV0sIFRFWFRVUkVfTE9DQVRJT04uUEFSVElDTEUuSU5ERVgpO1xyXG5cclxuICAgICAgbGV0IGZhY2VDYW1lcmE6IGJvb2xlYW4gPSBfY21wRmFjZUNhbWVyYSAmJiBfY21wRmFjZUNhbWVyYS5pc0FjdGl2ZTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoX3NoYWRlci51bmlmb3Jtc1tcInVfYlBhcnRpY2xlU3lzdGVtRmFjZUNhbWVyYVwiXSwgZmFjZUNhbWVyYSA/IDEgOiAwKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoX3NoYWRlci51bmlmb3Jtc1tcInVfYlBhcnRpY2xlU3lzdGVtUmVzdHJpY3RcIl0sIGZhY2VDYW1lcmEgJiYgX2NtcEZhY2VDYW1lcmEucmVzdHJpY3QgPyAxIDogMCk7XHJcblxyXG4gICAgICBjcmMzLmRyYXdFbGVtZW50c0luc3RhbmNlZChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgX3JlbmRlckJ1ZmZlcnMubkluZGljZXMsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfU0hPUlQsIDAsIF9jbXBQYXJ0aWNsZVN5c3RlbS5zaXplKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLnNldEJsZW5kTW9kZShCTEVORC5UUkFOU1BBUkVOVCk7XHJcbiAgICAgIGNyYzMuZGVwdGhNYXNrKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNhbGNNZXNoVG9WaWV3KF9ub2RlOiBOb2RlLCBfbXR4TWVzaFRvV29ybGQ6IE1hdHJpeDR4NCwgX210eFdvcmxkVG9WaWV3OiBNYXRyaXg0eDQsIF90YXJnZXQ/OiBWZWN0b3IzKTogTWF0cml4NHg0IHtcclxuICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBhIFJlbmRlciBmdW5jdGlvbiBhcyBpdCBkb2VzIG5vdCBkbyBhbnl0aGluZyB3aXRoIFdlYkdMXHJcbiAgICAgIGxldCBjbXBGYWNlQ2FtZXJhOiBDb21wb25lbnRGYWNlQ2FtZXJhID0gX25vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudEZhY2VDYW1lcmEpO1xyXG4gICAgICBpZiAoY21wRmFjZUNhbWVyYSAmJiBjbXBGYWNlQ2FtZXJhLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgbGV0IG10eE1lc2hUb1ZpZXc6IE1hdHJpeDR4NDsgLy8gbWVzaCB0byB3b3JsZD9cclxuICAgICAgICBtdHhNZXNoVG9WaWV3ID0gX210eE1lc2hUb1dvcmxkLmNsb25lO1xyXG4gICAgICAgIG10eE1lc2hUb1ZpZXcubG9va0F0KF90YXJnZXQsIGNtcEZhY2VDYW1lcmEudXBMb2NhbCA/IG51bGwgOiBjbXBGYWNlQ2FtZXJhLnVwLCBjbXBGYWNlQ2FtZXJhLnJlc3RyaWN0KTtcclxuICAgICAgICByZXR1cm4gTWF0cml4NHg0LlBST0RVQ1QoX210eFdvcmxkVG9WaWV3LCBtdHhNZXNoVG9WaWV3KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIE1hdHJpeDR4NC5QUk9EVUNUKF9tdHhXb3JsZFRvVmlldywgX210eE1lc2hUb1dvcmxkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBiaW5kVGV4dHVyZShfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF90ZXh0dXJlOiBXZWJHTFRleHR1cmUsIF91bml0OiBudW1iZXIsIF91bmlmb3JtOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgY3JjMy5hY3RpdmVUZXh0dXJlKF91bml0KTtcclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIF90ZXh0dXJlKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoX3NoYWRlci51bmlmb3Jtc1tfdW5pZm9ybV0sIF91bml0IC0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdpdmVzIFdlYkdMIEJ1ZmZlciB0aGUgZGF0YSBmcm9tIHRoZSB7QGxpbmsgVGV4dHVyZX1cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVuZGVySW5qZWN0b3JUZXh0dXJlIGV4dGVuZHMgUmVuZGVySW5qZWN0b3Ige1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlckluamVjdG9yLmluamVjdChfY29uc3RydWN0b3IsIFJlbmRlckluamVjdG9yVGV4dHVyZSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcImRlbGV0ZVJlbmRlckRhdGFcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclRleHR1cmUuZGVsZXRlUmVuZGVyRGF0YVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdFRleHR1cmUodGhpczogVGV4dHVyZSwgX3RleHR1cmVVbml0OiBudW1iZXIgPSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwKTogdm9pZCB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBpZiAoIXRoaXMucmVuZGVyRGF0YSlcclxuICAgICAgICB0aGlzLnJlbmRlckRhdGEgPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xUZXh0dXJlPihjcmMzLmNyZWF0ZVRleHR1cmUoKSk7IC8vIFRPRE86IGNoZWNrIGlmIGFsbCBXZWJHTC1DcmVhdGlvbnMgYXJlIGFzc2VydGVkXHJcblxyXG4gICAgICBjcmMzLmFjdGl2ZVRleHR1cmUoX3RleHR1cmVVbml0KTtcclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIHRoaXMucmVuZGVyRGF0YSk7XHJcblxyXG4gICAgICBpZiAodGhpcy50ZXh0dXJlRGlydHkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gQWx3YXlzIHByZW11bHRpcGx5IGFscGhhIHdoaWxlIGxvYWRpbmcgdGV4dHVyZXNcclxuICAgICAgICAgIGNyYzMucGl4ZWxTdG9yZWkoY3JjMy5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRydWUpO1xyXG4gICAgICAgICAgY3JjMy50ZXhJbWFnZTJEKFxyXG4gICAgICAgICAgICBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX0JZVEUsXHJcbiAgICAgICAgICAgIHRoaXMudGV4SW1hZ2VTb3VyY2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBjcmMzLnBpeGVsU3RvcmVpKGNyYzMuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5taXBtYXBEaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnRleHR1cmVEaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgICAgRGVidWcuZXJyb3IoX2Vycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLm1pcG1hcERpcnR5KSB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLm1pcG1hcCkge1xyXG4gICAgICAgICAgY2FzZSBNSVBNQVAuQ1JJU1A6XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NQUdfRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QpO1xyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfTUlOX0ZJTFRFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIE1JUE1BUC5NRURJVU06XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NQUdfRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QpO1xyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfTUlOX0ZJTFRFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUX01JUE1BUF9MSU5FQVIpO1xyXG4gICAgICAgICAgICBjcmMzLmdlbmVyYXRlTWlwbWFwKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBNSVBNQVAuQkxVUlJZOlxyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfTUFHX0ZJTFRFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FQVIpO1xyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfTUlOX0ZJTFRFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FQVJfTUlQTUFQX0xJTkVBUik7XHJcbiAgICAgICAgICAgIGNyYzMuZ2VuZXJhdGVNaXBtYXAoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJEKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIE1JUE1BUC5TTU9PVEg6XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NQUdfRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUik7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NSU5fRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1pcG1hcERpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLndyYXBEaXJ0eSkge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy53cmFwKSB7XHJcbiAgICAgICAgICBjYXNlIFdSQVAuUkVQRUFUOlxyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfV1JBUF9TLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJFUEVBVCk7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVQRUFUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFdSQVAuQ0xBTVA6XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1MsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBXUkFQLk1JUlJPUjpcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfUywgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5NSVJST1JFRF9SRVBFQVQpO1xyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfV1JBUF9ULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk1JUlJPUkVEX1JFUEVBVCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy53cmFwRGlydHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZGVsZXRlUmVuZGVyRGF0YSh0aGlzOiBUZXh0dXJlKTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5yZW5kZXJEYXRhKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgbnVsbCk7XHJcbiAgICAgIGNyYzMuZGVsZXRlVGV4dHVyZSh0aGlzLnJlbmRlckRhdGEpO1xyXG4gICAgICB0aGlzLnJlbmRlckRhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLnRleHR1cmVEaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMubWlwbWFwRGlydHkgPSB0cnVlO1xyXG4gICAgICB0aGlzLndyYXBEaXJ0eSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIGV4cG9ydCBjb25zdCBlbnVtIEVWRU5UX1BIWVNJQ1Mge1xyXG4gICAgVFJJR0dFUl9FTlRFUiA9IFwiVHJpZ2dlckVudGVyZWRDb2xsaXNpb25cIixcclxuICAgIFRSSUdHRVJfRVhJVCA9IFwiVHJpZ2dlckxlZnRDb2xsaXNpb25cIixcclxuICAgIENPTExJU0lPTl9FTlRFUiA9IFwiQ29sbGlkZXJFbnRlcmVkQ29sbGlzaW9uXCIsXHJcbiAgICBDT0xMSVNJT05fRVhJVCA9IFwiQ29sbGlkZXJMZWZ0Q29sbGlzaW9uXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNwZWNpYWwgdHlwZSBvZiB7QGxpbmsgRXZlbnR9IGZvciBwaHlzaWNzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBFdmVudFBoeXNpY3MgZXh0ZW5kcyBFdmVudCB7XHJcbiAgICAvKipcclxuICAgICAqIENvbXBvbmVudFJpZ2lkYm9keSB0aGF0IGNvbGxpZGVkIHdpdGggdGhpcyBDb21wb25lbnRSaWdpZGJvZHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNtcFJpZ2lkYm9keTogQ29tcG9uZW50UmlnaWRib2R5O1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9ybWFsIGltcHVsc2UgYmV0d2VlbiB0aGUgdHdvIGNvbGxpZGluZyBvYmplY3RzLiBOb3JtYWwgcmVwcmVzZW50cyB0aGUgZGVmYXVsdCBpbXB1bHNlLlxyXG4gICAgICogSW1wdWxzZSBpcyBvbmx5IGhhcHBlbmluZyBvbiBDT0xMSVNJT05fRU5URVIsIHNvIHRoZXJlIGlzIG5vIGltcHVsc2Ugb24gZXhpdCBub3Igb24gdHJpZ2dlcnMuXHJcbiAgICAgKiBVc2UgdGhlIHZlbG9jaXR5IG9mIHRoZSBjbXBSaWdpZGJvZHkgdG8gZGV0ZXJtaW5lIHRoZSBpbnRlbnNpdHkgb2YgdGhlIEVWRU5UIGluc3RlYWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBub3JtYWxJbXB1bHNlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgdGFuZ2VudEltcHVsc2U6IG51bWJlcjtcclxuICAgIHB1YmxpYyBiaW5vbWFsSW1wdWxzZTogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBwb2ludCB3aGVyZSB0aGUgY29sbGlzaW9uL3RyaWdnZXJpbmcgaW5pdGlhbGx5IGhhcHBlbmVkLiBUaGUgY29sbGlzaW9uIHBvaW50IGV4aXN0cyBvbmx5IG9uIENPTExJU0lPTl9FTlRFUiAvIFRSSUdHRVJfRU5URVIuICovXHJcbiAgICBwdWJsaWMgY29sbGlzaW9uUG9pbnQ6IFZlY3RvcjM7XHJcbiAgICAvKiogVGhlIG5vcm1hbCB2ZWN0b3Igb2YgdGhlIGNvbGxpc2lvbi4gT25seSBleGlzdGluZyBvbiBDT0xMSVNJT05fRU5URVIgKi9cclxuICAgIHB1YmxpYyBjb2xsaXNpb25Ob3JtYWw6IFZlY3RvcjM7XHJcblxyXG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgZXZlbnQgY3VzdG9taXplZCBmb3IgcGh5c2ljcy4gSG9sZGluZyBpbmZvcm1hdGlvbnMgYWJvdXQgaW1wdWxzZXMuIENvbGxpc2lvbiBwb2ludCBhbmQgdGhlIGJvZHkgdGhhdCBpcyBjb2xsaWRpbmcgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdHlwZTogRVZFTlRfUEhZU0lDUywgX2hpdFJpZ2lkYm9keTogQ29tcG9uZW50UmlnaWRib2R5LCBfbm9ybWFsSW1wdWxzZTogbnVtYmVyLCBfdGFuZ2VudEltcHVsc2U6IG51bWJlciwgX2Jpbm9ybWFsSW1wdWxzZTogbnVtYmVyLCBfY29sbGlzaW9uUG9pbnQ6IFZlY3RvcjMgPSBudWxsLCBfY29sbGlzaW9uTm9ybWFsOiBWZWN0b3IzID0gbnVsbCkge1xyXG4gICAgICBzdXBlcihfdHlwZSk7XHJcbiAgICAgIHRoaXMuY21wUmlnaWRib2R5ID0gX2hpdFJpZ2lkYm9keTtcclxuICAgICAgdGhpcy5ub3JtYWxJbXB1bHNlID0gX25vcm1hbEltcHVsc2U7XHJcbiAgICAgIHRoaXMudGFuZ2VudEltcHVsc2UgPSBfdGFuZ2VudEltcHVsc2U7XHJcbiAgICAgIHRoaXMuYmlub21hbEltcHVsc2UgPSBfYmlub3JtYWxJbXB1bHNlO1xyXG4gICAgICB0aGlzLmNvbGxpc2lvblBvaW50ID0gX2NvbGxpc2lvblBvaW50O1xyXG4gICAgICB0aGlzLmNvbGxpc2lvbk5vcm1hbCA9IF9jb2xsaXNpb25Ob3JtYWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEdyb3VwcyB0byBwbGFjZSBhIG5vZGUgaW4sIG5vdCBldmVyeSBncm91cCBzaG91bGQgY29sbGlkZSB3aXRoIGV2ZXJ5IGdyb3VwLiBVc2UgYSBNYXNrIGluIHRvIGV4Y2x1ZGUgY29sbGlzaW9uc1xyXG4gICovXHJcbiAgZXhwb3J0IGVudW0gQ09MTElTSU9OX0dST1VQIHsgLy9UT0RPIEdpdmUgYSBwb3NzaWJsaXRoeSB0byBzZXQgd2hpY2ggbGF5ZXIgY29sbGlkZXMgd2l0aCB3aGljaCwgQ29sbGlzaW9uTWF0cml4P1xyXG4gICAgREVGQVVMVCA9IDEsXHJcbiAgICBHUk9VUF8xID0gMixcclxuICAgIEdST1VQXzIgPSA0LFxyXG4gICAgR1JPVVBfMyA9IDgsXHJcbiAgICBHUk9VUF80ID0gMTYsXHJcbiAgICBHUk9VUF81ID0gMzJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgcmlnaWRib2R5IHdoaWNoIGRldGVybWluZXMgdGhlIHdheSBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgcGh5c2ljYWwgYW5kIHRoZSB2aXN1YWwgd29ybGRcclxuICAqL1xyXG4gIGV4cG9ydCBlbnVtIEJPRFlfVFlQRSB7XHJcbiAgICAvKiogVGhlIGJvZHkgaWdub3JlcyB0aGUgaGllcmFyY2h5IG9mIHRoZSByZW5kZXIgZ3JhcGgsIGlzIGNvbXBsZXRlbHkgY29udHJvbGxlZCAgYnkgcGh5c2ljcyBhbmQgdGFrZXMgaXRzIG5vZGUgd2l0aCBpdCAgKi9cclxuICAgIERZTkFNSUMsIC8vID0gT0lNTy5SaWdpZEJvZHlUeXBlLkRZTkFNSUMsXHJcbiAgICAvKiogVGhlIGJvZHkgaWdub3JlcyB0aGUgaGllcmFyY2h5IG9mIHRoZSByZW5kZXIgZ3JhcGgsIGlzIGNvbXBsZXRlbHkgaW1tb3ZlYmxlIGFuZCBrZWVwcyBpdHMgbm9kZSBmcm9tIG1vdmluZyAgKi9cclxuICAgIFNUQVRJQywgLy8gPSBPSU1PLlJpZ2lkQm9keVR5cGUuU1RBVElDLFxyXG4gICAgLyoqIFRoZSBib2R5IGlzIGNvbnRyb2xsZWQgYnkgaXRzIG5vZGUgYW5kIG1vdmVzIHdpdGggaXQsIHdoaWxlIGl0IGltcGFjdHMgdGhlIHBoeXNpY2FsIHdvcmxkIGUuZy4gYnkgY29sbGlzaW9ucyAqL1xyXG4gICAgS0lORU1BVElDIC8vID0gT0lNTy5SaWdpZEJvZHlUeXBlLktJTkVNQVRJQ1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBEaWZmZXJlbnQgdHlwZXMgb2YgY29sbGlkZXIgc2hhcGVzLCB3aXRoIGRpZmZlcmVudCBvcHRpb25zIGluIHNjYWxpbmcgQk9YID0gVmVjdG9yMyhsZW5ndGgsIGhlaWdodCwgZGVwdGgpLFxyXG4gICogU1BIRVJFID0gVmVjdG9yMyhkaWFtZXRlciwgeCwgeCksIENBUFNVTEUgPSBWZWN0b3IzKGRpYW1ldGVyLCBoZWlnaHQsIHgpLCBDWUxJTkRFUiA9IFZlY3RvcjMoZGlhbWV0ZXIsIGhlaWdodCwgeCksXHJcbiAgKiBDT05FID0gVmVjdG9yKGRpYW1ldGVyLCBoZWlnaHQsIHgpLCBQWVJBTUlEID0gVmVjdG9yMyhsZW5ndGgsIGhlaWdodCwgZGVwdGgpOyB4ID09IHVudXNlZC5cclxuICAqIENPTlZFWCA9IENvbXBvbmVudE1lc2ggbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGluIHRoZSBSQiBQcm9wZXJ0eSBjb252ZXhNZXNoLCB0aGUgcG9pbnRzIG9mIHRoYXQgY29tcG9uZW50IGFyZSB1c2VkIHRvIGNyZWF0ZSBhIGNvbGxpZGVyIHRoYXQgbWF0Y2hlcyxcclxuICAqIHRoZSBjbG9zZXN0IHBvc3NpYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoYXQgZm9ybSwgaW4gZm9ybSBvZiBhIGh1bGwuIENvbnZleCBpcyBleHBlcmltZW50YWwgYW5kIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgYmVoYXZpb3VyIHdoZW4gdmVydGljZXNcclxuICAqIGFyZSB0b28gY2xvc2UgdG8gb25lIGFub3RoZXIgYW5kIHRoZSBnaXZlbiB2ZXJ0aWNlcyBkbyBub3QgZm9ybSBhIGluIGl0c2VsZiBjbG9zZWQgc2hhcGUgYW5kIGhhdmluZyBhIGdlbnVzIG9mIDAgKG5vIGhvbGVzKS4gVmVydGljZXMgaW4gdGhlIENvbXBvbmVudE1lc2ggY2FuIGJlIHNjYWxlZCBkaWZmZXJlbnRseSBcclxuICAqIGZvciB0ZXh0dXJpbmcvbm9ybWFsIG9yIG90aGVyIHJlYXNvbnMsIHNvIHRoZSBjb2xsaWRlciBtaWdodCBiZSBvZmYgY29tcGFyZWQgdG8gdGhlIHZpc3VhbCBzaGFwZSwgdGhpcyBjYW4gYmUgY29ycmVjdGVkIGJ5IGNoYW5naW5nIHRoZSBwaXZvdCBzY2FsZSBvZiB0aGUgQ29tcG9uZW50UmlnaWRib2R5LiAgXHJcbiAgKi9cclxuICBleHBvcnQgZW51bSBDT0xMSURFUl9UWVBFIHtcclxuICAgIENVQkUsXHJcbiAgICBTUEhFUkUsXHJcbiAgICBDQVBTVUxFLFxyXG4gICAgQ1lMSU5ERVIsXHJcbiAgICBDT05FLFxyXG4gICAgUFlSQU1JRCxcclxuICAgIENPTlZFWFxyXG4gIH1cclxuXHJcbiAgLyoqIERpc3BsYXlpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGRlYnVnIGluZm9ybWF0aW9uIGFib3V0IGRpZmZlcmVudCBwaHlzaWMgZmVhdHVyZXMuIERlZmF1bHQgPSBKT0lOVFNfQU5EX0NPTExJREVSLiAqL1xyXG4gIGV4cG9ydCBlbnVtIFBIWVNJQ1NfREVCVUdNT0RFIHtcclxuICAgIE5PTkUsXHJcbiAgICBDT0xMSURFUlMsXHJcbiAgICBKT0lOVFNfQU5EX0NPTExJREVSLFxyXG4gICAgQk9VTkRJTkdfQk9YRVMsXHJcbiAgICBDT05UQUNUUyxcclxuICAgIFBIWVNJQ19PQkpFQ1RTX09OTFlcclxuICB9XHJcblxyXG4gIC8qKiBJbmZvIGFib3V0IFJheWNhc3RzIHNob3QgZnJvbSB0aGUgcGh5c2ljcyBzeXN0ZW0uICovXHJcbiAgZXhwb3J0IGNsYXNzIFJheUhpdEluZm8gaW1wbGVtZW50cyBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIGhpdDogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBoaXREaXN0YW5jZTogbnVtYmVyO1xyXG4gICAgcHVibGljIGhpdFBvaW50OiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICBwdWJsaWMgcmlnaWRib2R5Q29tcG9uZW50OiBDb21wb25lbnRSaWdpZGJvZHk7XHJcbiAgICBwdWJsaWMgaGl0Tm9ybWFsOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICBwdWJsaWMgcmF5RW5kOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICBwdWJsaWMgcmF5T3JpZ2luOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICB0aGlzLnJlY3ljbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5oaXQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5oaXREaXN0YW5jZSA9IDA7XHJcbiAgICAgIHRoaXMuaGl0UG9pbnQucmVjeWNsZSgpO1xyXG4gICAgICB0aGlzLnJpZ2lkYm9keUNvbXBvbmVudCA9IG51bGw7XHJcbiAgICAgIHRoaXMuaGl0Tm9ybWFsLnJlY3ljbGUoKTtcclxuICAgICAgdGhpcy5yYXlPcmlnaW4ucmVjeWNsZSgpO1xyXG4gICAgICB0aGlzLnJheUVuZC5yZWN5Y2xlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogR2VuZXJhbCBzZXR0aW5ncyBmb3IgdGhlIHBoeXNpYyBzaW11bGF0aW9uIGFuZCB0aGUgZGVidWcgb2YgaXQuICovXHJcbiAgZXhwb3J0IGNsYXNzIFBoeXNpY3NTZXR0aW5ncyB7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9kZWZhdWx0Q29sbGlzaW9uR3JvdXA6IG51bWJlciwgX2RlZmF1bHRDb2xsaXNpb25NYXNrOiBudW1iZXIpIHtcclxuICAgICAgaWYgKHR5cGVvZiBPSU1PID09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB0aGlzLmRlZmF1bHRDb2xsaXNpb25Hcm91cCA9IF9kZWZhdWx0Q29sbGlzaW9uR3JvdXA7XHJcbiAgICAgIHRoaXMuZGVmYXVsdENvbGxpc2lvbk1hc2sgPSBfZGVmYXVsdENvbGxpc2lvbk1hc2s7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENoYW5nZSBpZiByaWdpZGJvZGllcyBhcmUgYWJsZSB0byBzbGVlcCAoZG9uJ3QgYmUgY29uc2lkZXJlZCBpbiBwaHlzaWNhbCBjYWxjdWxhdGlvbnMpIHdoZW4gdGhlaXIgbW92ZW1lbnQgaXMgYmVsb3cgYSB0aHJlc2hvbGQuIERlYWN0aXZhdGlvbiBpcyBkZWNyZWFzaW5nIHBlcmZvcm1hbmNlIGZvciBtaW5vciBhZHZhbnRhZ2UgaW4gcHJlY2lzaW9uLiAqL1xyXG4gICAgcHVibGljIGdldCBkaXNhYmxlU2xlZXBpbmcoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuZGlzYWJsZVNsZWVwaW5nO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkaXNhYmxlU2xlZXBpbmcoX3ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5kaXNhYmxlU2xlZXBpbmcgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKiogU2xlZXBpbmcgVGhyZXNob2xkIGZvciBNb3ZlbWVudCBWZWxvY3RpeS4gKi9cclxuICAgIHB1YmxpYyBnZXQgc2xlZXBpbmdWZWxvY2l0eVRocmVzaG9sZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLnNsZWVwaW5nVmVsb2NpdHlUaHJlc2hvbGQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNsZWVwaW5nVmVsb2NpdHlUaHJlc2hvbGQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLnNsZWVwaW5nVmVsb2NpdHlUaHJlc2hvbGQgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNsZWVwaW5nIFRocmVzaG9sZCBmb3IgUm90YXRpb24gVmVsb2NpdHkuICovXHJcbiAgICBwdWJsaWMgZ2V0IHNsZWVwaW5nQW5ndWxhclZlbG9jaXR5VGhyZXNob2xkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuc2xlZXBpbmdBbmd1bGFyVmVsb2NpdHlUaHJlc2hvbGQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNsZWVwaW5nQW5ndWxhclZlbG9jaXR5VGhyZXNob2xkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5zbGVlcGluZ0FuZ3VsYXJWZWxvY2l0eVRocmVzaG9sZCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhyZXNob2xkIGhvdyBsb25nIHRoZSBSaWdpZGJvZHkgbXVzdCBiZSBiZWxvdy9hYm92ZSB0aGUgdGhyZXNob2xkIHRvIGNvdW50IGFzIHNsZWVwaW5nLiAqL1xyXG4gICAgcHVibGljIGdldCBzbGVlcGluZ1RpbWVUaHJlc2hvbGQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5zbGVlcGluZ1RpbWVUaHJlc2hvbGQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNsZWVwaW5nVGltZVRocmVzaG9sZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuc2xlZXBpbmdUaW1lVGhyZXNob2xkID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFcnJvciB0aHJlc2hvbGQuIERlZmF1bHQgaXMgMC4wNS4gVGhlIGhpZ2hlciB0aGUgbW9yZSBsaWtlbHkgY29sbGlzaW9ucyBnZXQgZGV0ZWN0ZWQgYmVmb3JlIGFjdHVhbCBpbXBhY3QgYXQgaGlnaCBzcGVlZHMgYnV0IGl0J3MgdmlzdWFsbHkgbGVzcyBhY2N1cmF0ZS4gKi9cclxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdENvbGxpc2lvbk1hcmdpbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLmRlZmF1bHRHSktNYXJnaW47XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGRlZmF1bHRDb2xsaXNpb25NYXJnaW4oX3RoaWNrbmVzczogbnVtYmVyKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5kZWZhdWx0R0pLTWFyZ2luID0gX3RoaWNrbmVzcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGRlZmF1bHQgYXBwbGllZCBmcmljdGlvbiBiZXR3ZWVuIHR3byByaWdpZGJvZGllcyB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlLiBIb3cgbXVjaCB2ZWxvY2l0eSBpcyBzbG93ZWQgZG93biB3aGVuIG1vdmluZyBhY2Nyb3NzIHRoaXMgc3VyZmFjZS4gKi9cclxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdEZyaWN0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuZGVmYXVsdEZyaWN0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkZWZhdWx0RnJpY3Rpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRGcmljdGlvbiA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQm91bmNpbmVzcyBvZiByaWdpZGJvZGllcy4gSG93IG11Y2ggb2YgdGhlIGltcGFjdCBpcyByZXN0aXR1dGVkLiAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0UmVzdGl0dXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5kZWZhdWx0UmVzdGl0dXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGRlZmF1bHRSZXN0aXR1dGlvbihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuZGVmYXVsdFJlc3RpdHV0aW9uID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHcm91cHMgdGhlIGRlZmF1bHQgcmlnaWRib2R5IHdpbGwgY29sbGlkZSB3aXRoLiBTZXQgaXQgbGlrZTogKFBIWVNJQ1NfR1JPVVAuREVGQVVMVCB8IFBIWVNJQ1NfR1JPVVAuR1JPVVBfMSB8IFBIWVNJQ1NfR1JPVVAuR1JPVVBfMiB8IFBIWVNJQ1NfR1JPVVAuR1JPVVBfMykgXHJcbiAgICAgKiB0byBjb2xsaWRlIHdpdGggbXVsdGlwbGUgZ3JvdXBzLiBEZWZhdWx0IGlzIGNvbGxpc2lvbiB3aXRoIGV2ZXJ5dGhpbmcgYnV0IHRyaWdnZXJzLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdENvbGxpc2lvbk1hc2soKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5kZWZhdWx0Q29sbGlzaW9uTWFzaztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdENvbGxpc2lvbk1hc2soX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRDb2xsaXNpb25NYXNrID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgZ3JvdXAgdGhhdCB0aGlzIHJpZ2lkYm9keSBiZWxvbmdzIHRvLiBEZWZhdWx0IGlzIHRoZSBERUZBVUxUIEdyb3VwIHdoaWNoIG1lYW5zIGl0cyBqdXN0IGEgbm9ybWFsIFJpZ2lkYm9keSBub3QgYSB0cmlnZ2VyIG5vciBhbnl0aGluZyBzcGVjaWFsLiAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q29sbGlzaW9uR3JvdXAoKTogQ09MTElTSU9OX0dST1VQIHtcclxuICAgICAgcmV0dXJuIDxDT0xMSVNJT05fR1JPVVA+T0lNTy5TZXR0aW5nLmRlZmF1bHRDb2xsaXNpb25Hcm91cDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdENvbGxpc2lvbkdyb3VwKF92YWx1ZTogQ09MTElTSU9OX0dST1VQKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5kZWZhdWx0Q29sbGlzaW9uR3JvdXAgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENoYW5nZSB0aGUgdHlwZSBvZiBqb2ludCBzb2x2ZXIgYWxnb3JpdGhtLiBEZWZhdWx0IEl0ZXJhdGl2ZSA9PSAwLCBpcyBmYXN0ZXIgYnV0IGxlc3Mgc3RhYmxlLiBEaXJlY3QgPT0gMSwgc2xvdyBidXQgbW9yZSBzdGFibGUsIHJlY29tbWVuZGVkIGZvciBjb21wbGV4IGpvaW50IHdvcmsuIENoYW5nZSB0aGlzIHNldHRpbmcgb25seSBhdCB0aGUgc3RhcnQgb2YgeW91ciBnYW1lLiAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q29uc3RyYWludFNvbHZlclR5cGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5kZWZhdWx0Sm9pbnRDb25zdHJhaW50U29sdmVyVHlwZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdENvbnN0cmFpbnRTb2x2ZXJUeXBlKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5kZWZhdWx0Sm9pbnRDb25zdHJhaW50U29sdmVyVHlwZSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGNvcnJlY3Rpb24gYWxnb3JpdGhtIHVzZWQgdG8gY29ycmVjdCBwaHlzaWNzIGNhbGN1bGF0aW9ucy4gQ2hhbmdlIHRoaXMgb25seSBhdCB0aGUgYmVnaW5uaW5nIG9mIHlvdXIgZ2FtZS4gRWFjaCBoYXMgZGlmZmVyZW50IGFwcHJvYWNoZXMsIHNvIGlmIHlvdSBoYXZlIHByb2JsZW1zIHRlc3QgYW5vdGhlclxyXG4gICAgICogIERlZmF1bHQgMCA9IEJhdW1nYXJ0ZSAoZmFzdCBidXQgbGVzcyBjb3JyZWN0IGluZHVjZXMgc29tZSBlbmVyZ3kgZXJyb3JzKSwgMSA9IFNwbGl0LUltcHVsc2UgKGZhc3QgYW5kIG5vIGVuZ2VyeSBlcnJvcnMsIGJ1dCBtb3JlIGluYWNjdXJhdGUgZm9yIGpvaW50cyksIDIgPSBOb24tbGluZWFyIEdhdXNzIFNlaWRlbCAoc2xvd2VzdCBidXQgbW9zdCBhY2N1cmF0ZSkqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q29ycmVjdGlvbkFsZ29yaXRobSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLmRlZmF1bHRKb2ludFBvc2l0aW9uQ29ycmVjdGlvbkFsZ29yaXRobTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdENvcnJlY3Rpb25BbGdvcml0aG0oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRKb2ludFBvc2l0aW9uQ29ycmVjdGlvbkFsZ29yaXRobSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIHByZWNpc2lvbiBvZiB0aGUgc2ltdWxhdGlvbiBpbiBmb3JtIG9mIG51bWJlciBvZiBpdGVyYXRpb25zIHRoZSBzaW11bGF0aW9ucyBydW5zIHRocm91Z2ggdW50aWwgaXQgYWNjZXB0cyB0aGUgcmVzdWx0LlxyXG4gICAgICogIDEwIERlZmF1bHQgLSBIaWdoZXIgbWVhbnMgbW9yZSBwcmVjaXNpb24gYnV0IHJlc3VsdHMgaW4gYSBwZXJmb3JtYW5jZSBkZWNyZWFzZS4gVGhpcyBoZWxwcyBlc3BlY2lhbGx5IHdpdGggam9pbnRzLFxyXG4gICAgICogYnV0IGFsc28gdGhlIGdlbmVyYWwgc3RhYmlsaXR5IG9mIHRoZSBzaW11bGF0aW9uIGR1ZSB0byBzaW11bGF0aW9uIHN0ZXBzIGJlaW5nIHJlY2hlY2tlZCBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgYmVpbmcgc2V0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNvbHZlckl0ZXJhdGlvbnMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIFBoeXNpY3MuYWN0aXZlSW5zdGFuY2UuZ2V0T2ltb1dvcmxkKCkuZ2V0TnVtUG9zaXRpb25JdGVyYXRpb25zKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNvbHZlckl0ZXJhdGlvbnMoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgUGh5c2ljcy5hY3RpdmVJbnN0YW5jZS5nZXRPaW1vV29ybGQoKS5zZXROdW1Qb3NpdGlvbkl0ZXJhdGlvbnMoX3ZhbHVlKTtcclxuICAgICAgUGh5c2ljcy5hY3RpdmVJbnN0YW5jZS5nZXRPaW1vV29ybGQoKS5zZXROdW1WZWxvY2l0eUl0ZXJhdGlvbnMoX3ZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgICAqIEFjdHMgYXMgdGhlIHBoeXNpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byB7QGxpbmsgTm9kZX0ncy5cclxuICAgICAqIFRoZSB0eXBlIG9mIGNvbm5jZXRpb24gaXMgZGVmaW5lZCBieSB0aGUgc3ViY2xhc3NlcyBsaWtlIHByaXNtYXRpYyBqb2ludCwgY3lsaW5kZXIgam9pbnQgZXRjLlxyXG4gICAgICogQSBSaWdpZGJvZHkgb24gdGhlIHtAbGluayBOb2RlfSB0aGF0IHRoaXMgY29tcG9uZW50IGlzIGFkZGVkIHRvIGlzIG5lZWRlZC4gU2V0dGluZyB0aGUgY29ubmVjdGVkUmlnaWRib2R5IGFuZFxyXG4gICAgICogaW5pdGlhbGl6aW5nIHRoZSBjb25uZWN0aW9uIGNyZWF0ZXMgYSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdGhlbS4gVGhpcyBkaWZmZXJzIGZyb20gYSBjb25uZWN0aW9uIHRocm91Z2ggaGllcmFyY2h5XHJcbiAgICAgKiBpbiB0aGUgbm9kZSBzdHJ1Y3R1cmUgb2YgZnVkZ2UuIEpvaW50cyBjYW4gaGF2ZSBkaWZmZXJlbnQgRE9GJ3MgKERlZ3JlZXMgT2YgRnJlZWRvbSksIDEgQXhpcyB0aGF0IGNhbiBlaXRoZXIgdHdpc3Qgb3Igc3dpbmcgaXMgYSBkZWdyZWUgb2YgZnJlZWRvbS5cclxuICAgICAqIEEgam9pbnQgdHlwaWNhbGx5IGNvbnNpc3RzIG9mIGEgbW90b3IgdGhhdCBsaW1pdHMgbW92ZW1lbnQvcm90YXRpb24gb3IgaXMgYWN0aXZseSB0cnlpbmcgdG8gbW92ZSB0byBhIGxpbWl0LiBBbmQgYSBzcHJpbmcgd2hpY2ggZGVmaW5lcyB0aGUgcmlnaWRpdHkuXHJcbiAgICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSAyMDIwXHJcbiAgICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgSm9pbnQgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgLyoqIHJlZmVycyBiYWNrIHRvIHRoaXMgY2xhc3MgZnJvbSBhbnkgc3ViY2xhc3MgZS5nLiBpbiBvcmRlciB0byBmaW5kIGNvbXBhdGlibGUgb3RoZXIgcmVzb3VyY2VzKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYmFzZUNsYXNzOiB0eXBlb2YgSm9pbnQgPSBKb2ludDtcclxuICAgIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIEpvaW50W10gPSBbXTtcclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50Sm9pbnQpO1xyXG4gICAgcHJvdGVjdGVkIHNpbmdsZXRvbjogYm9vbGVhbiA9IGZhbHNlOyAvL011bHRpcGxlIGpvaW50cyBjYW4gYmUgYXR0YWNoZWQgdG8gb25lIE5vZGVcclxuXHJcbiAgICAjaWRCb2R5QW5jaG9yOiBudW1iZXIgPSAwO1xyXG4gICAgI2lkQm9keVRpZWQ6IG51bWJlciA9IDA7XHJcbiAgICAjYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5O1xyXG4gICAgI2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHk7XHJcblxyXG4gICAgI2Nvbm5lY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgI2FuY2hvcjogT0lNTy5WZWMzO1xyXG4gICAgI2ludGVybmFsQ29sbGlzaW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgI2JyZWFrRm9yY2U6IG51bWJlciA9IDA7XHJcbiAgICAjYnJlYWtUb3JxdWU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI25hbWVDaGlsZFRvQ29ubmVjdDogc3RyaW5nO1xyXG5cclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBqb2ludDogT0lNTy5Kb2ludDtcclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBjb25maWc6IE9JTU8uSm9pbnRDb25maWc7XHJcblxyXG4gICAgLyoqIENyZWF0ZSBhIGpvaW50IGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgdHdvIGdpdmVuIFJpZ2lkYm9keUNvbXBvbmVudHMuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmJvZHlBbmNob3IgPSBfYm9keUFuY2hvcjtcclxuICAgICAgdGhpcy5ib2R5VGllZCA9IF9ib2R5VGllZDtcclxuXHJcbiAgICAgIC8qXHJcbiAgICAgICAgVGVsbCB0aGUgcGh5c2ljcyB0aGF0IHRoZXJlIGlzIGEgbmV3IGpvaW50IGFuZCBvbiB0aGUgcGh5c2ljcyBzdGFydCB0aGUgYWN0dWFsIGpvaW50IGlzIGZpcnN0IGNyZWF0ZWQuIFZhbHVlcyBjYW4gYmUgc2V0IGJ1dCB0aGVcclxuICAgICAgICBhY3R1YWwgY29uc3RyYWludCBhaW4ndCBleGlzdGVudCB1bnRpbCB0aGUgZ2FtZSBzdGFydHNcclxuICAgICAgKi9cclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9BREQsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgdGhpcy5obmRFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWdpc3RlclN1YmNsYXNzKF9zdWJjbGFzczogdHlwZW9mIEpvaW50KTogbnVtYmVyIHsgcmV0dXJuIEpvaW50LnN1YmNsYXNzZXMucHVzaChfc3ViY2xhc3MpIC0gMTsgfVxyXG5cclxuICAgIC8qKiBHZXQvU2V0IHRoZSBmaXJzdCBDb21wb25lbnRSaWdpZGJvZHkgb2YgdGhpcyBjb25uZWN0aW9uLiBJdCBzaG91bGQgYWx3YXlzIGJlIHRoZSBvbmUgdGhhdCB0aGlzIGNvbXBvbmVudCBpcyBhdHRhY2hlZCB0b28gaW4gdGhlIHNjZW5lVHJlZS4gKi9cclxuICAgIHB1YmxpYyBnZXQgYm9keUFuY2hvcigpOiBDb21wb25lbnRSaWdpZGJvZHkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jYm9keUFuY2hvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGJvZHlBbmNob3IoX2NtcFJCOiBDb21wb25lbnRSaWdpZGJvZHkpIHtcclxuICAgICAgdGhpcy4jaWRCb2R5QW5jaG9yID0gX2NtcFJCICE9IG51bGwgPyBfY21wUkIuaWQgOiAtMTtcclxuICAgICAgdGhpcy4jYm9keUFuY2hvciA9IF9jbXBSQjtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0L1NldCB0aGUgc2Vjb25kIENvbXBvbmVudFJpZ2lkYm9keSBvZiB0aGlzIGNvbm5lY3Rpb24uICovXHJcbiAgICBwdWJsaWMgZ2V0IGJvZHlUaWVkKCk6IENvbXBvbmVudFJpZ2lkYm9keSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNib2R5VGllZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYm9keVRpZWQoX2NtcFJCOiBDb21wb25lbnRSaWdpZGJvZHkpIHtcclxuICAgICAgdGhpcy4jaWRCb2R5VGllZCA9IF9jbXBSQiAhPSBudWxsID8gX2NtcFJCLmlkIDogLTE7XHJcbiAgICAgIHRoaXMuI2JvZHlUaWVkID0gX2NtcFJCO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGV4YWN0IHBvc2l0aW9uIHdoZXJlIHRoZSB0d28ge0BsaW5rIE5vZGV9cyBhcmUgY29ubmVjdGVkLiBXaGVuIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdGhlIGpvaW50IG5lZWRzIHRvIGJlIHJlY29ubmVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGFuY2hvcigpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRoaXMuI2FuY2hvci54LCB0aGlzLiNhbmNob3IueSwgdGhpcy4jYW5jaG9yLnopO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBhbmNob3IoX3ZhbHVlOiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMuI2FuY2hvciA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZvcmNlIG5lZWRlZCB0byBicmVhayB0aGUgSk9JTlQsIHdoaWxlIHJvdGF0aW5nLCBpbiBOZXd0b24uIDAgZXF1YWxzIHVuYnJlYWthYmxlIChkZWZhdWx0KSBcclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGJyZWFrVG9ycXVlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNicmVha1RvcnF1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYnJlYWtUb3JxdWUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jYnJlYWtUb3JxdWUgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuc2V0QnJlYWtUb3JxdWUodGhpcy4jYnJlYWtUb3JxdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFtb3VudCBvZiBmb3JjZSBuZWVkZWQgdG8gYnJlYWsgdGhlIEpPSU5ULCBpbiBOZXd0b24uIDAgZXF1YWxzIHVuYnJlYWthYmxlIChkZWZhdWx0KSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBicmVha0ZvcmNlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNicmVha0ZvcmNlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBicmVha0ZvcmNlKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI2JyZWFrRm9yY2UgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuc2V0QnJlYWtGb3JjZSh0aGlzLiNicmVha0ZvcmNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBJZiB0aGUgdHdvIGNvbm5lY3RlZCBSaWdpZEJvZGllcyBjb2xsaWRlIHdpdGggZWF0aCBvdGhlci4gKERlZmF1bHQgPSBmYWxzZSlcclxuICAgICAgKiBPbiBhIHdlbGRpbmcgam9pbnQgdGhlIGNvbm5lY3RlZCBib2RpZXMgc2hvdWxkIG5vdCBiZSBjb2xsaWRpbmcgd2l0aCBlYWNoIG90aGVyLFxyXG4gICAgICAqIGZvciBiZXN0IHJlc3VsdHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpbnRlcm5hbENvbGxpc2lvbigpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2ludGVybmFsQ29sbGlzaW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBpbnRlcm5hbENvbGxpc2lvbihfdmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgdGhpcy4jaW50ZXJuYWxDb2xsaXNpb24gPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuc2V0QWxsb3dDb2xsaXNpb24odGhpcy4jaW50ZXJuYWxDb2xsaXNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29ubmVjdCBhIGNoaWxkIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0byB0aGUgam9pbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25uZWN0Q2hpbGQoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNuYW1lQ2hpbGRUb0Nvbm5lY3QgPSBfbmFtZTtcclxuICAgICAgaWYgKCF0aGlzLm5vZGUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGNoaWxkcmVuOiBOb2RlW10gPSB0aGlzLm5vZGUuZ2V0Q2hpbGRyZW5CeU5hbWUoX25hbWUpO1xyXG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEpXHJcbiAgICAgICAgdGhpcy5jb25uZWN0Tm9kZShjaGlsZHJlbi5wb3AoKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gYXQgJHt0aGlzLm5vZGUubmFtZX0gZmFpbHMgdG8gY29ubmVjdCBjaGlsZCB3aXRoIG5vbiBleGlzdGVudCBvciBhbWJpZ291cyBuYW1lICR7X25hbWV9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0IHRoZSBnaXZlbiBub2RlIHRvIHRoZSBqb2ludC4gVGllaW5nIGl0cyByaWdpZGJvZHkgdG8gdGhlIG5vZGVzIHJpZ2lkYm9keSB0aGlzIGNvbXBvbmVudCBpcyBhdHRhY2hlZCB0by5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbm5lY3ROb2RlKF9ub2RlOiBOb2RlKTogdm9pZCB7XHJcbiAgICAgIGlmICghX25vZGUgfHwgIXRoaXMubm9kZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBEZWJ1Zy5mdWRnZShgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IGNvbm5lY3RlZCAke3RoaXMubm9kZS5uYW1lfSBhbmQgJHtfbm9kZS5uYW1lfWApO1xyXG5cclxuICAgICAgbGV0IGNvbm5lY3RCb2R5OiBDb21wb25lbnRSaWdpZGJvZHkgPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50UmlnaWRib2R5KTtcclxuICAgICAgbGV0IHRoaXNCb2R5OiBDb21wb25lbnRSaWdpZGJvZHkgPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudFJpZ2lkYm9keSk7XHJcblxyXG4gICAgICBpZiAoIWNvbm5lY3RCb2R5IHx8ICF0aGlzQm9keSkge1xyXG4gICAgICAgIERlYnVnLndhcm4oYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBhdCAke3RoaXMubm9kZS5uYW1lfSBmYWlscyBkdWUgdG8gbWlzc2luZyByaWdpZGJvZGllcyBvbiAke3RoaXMubm9kZS5uYW1lfSBvciAke19ub2RlLm5hbWV9YCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmJvZHlBbmNob3IgPSB0aGlzQm9keTtcclxuICAgICAgdGhpcy5ib2R5VGllZCA9IGNvbm5lY3RCb2R5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDaGVjayBpZiBjb25uZWN0aW9uIGlzIGRpcnR5LCBzbyB3aGVuIGVpdGhlciByYiBpcyBjaGFuZ2VkIGRpc2Nvbm5lY3QgYW5kIHJlY29ubmVjdC4gSW50ZXJuYWxseSB1c2VkIG5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLiAqL1xyXG4gICAgcHVibGljIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6aW5nIGFuZCBjb25uZWN0aW5nIHRoZSB0d28gcmlnaWRib2RpZXMgd2l0aCB0aGUgY29uZmlndXJlZCBqb2ludCBwcm9wZXJ0aWVzXHJcbiAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSB0aGUgcGh5c2ljcyBzeXN0ZW0uIE5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuI2Nvbm5lY3RlZCA9PSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0aGlzLiNpZEJvZHlBbmNob3IgPT0gLTEgfHwgdGhpcy4jaWRCb2R5VGllZCA9PSAtMSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuI25hbWVDaGlsZFRvQ29ubmVjdClcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0Q2hpbGQodGhpcy4jbmFtZUNoaWxkVG9Db25uZWN0KTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29uc3RydWN0Sm9pbnQoKTtcclxuICAgICAgICB0aGlzLiNjb25uZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYWRkSm9pbnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzY29ubmVjdGluZyB0aGUgdHdvIHJpZ2lkYm9kaWVzIGFuZCByZW1vdmluZyB0aGVtIGZyb20gdGhlIHBoeXNpY3Mgc3lzdGVtLFxyXG4gICAgICogaXMgYXV0b21hdGljYWxseSBjYWxsZWQgYnkgdGhlIHBoeXNpY3Mgc3lzdGVtLiBObyB1c2VyIGludGVyYWN0aW9uIG5lZWRlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLiNjb25uZWN0ZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSm9pbnQoKTtcclxuICAgICAgICB0aGlzLiNjb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgSm9pbnQgdXNlZCBieSB0aGUgcGh5c2ljcyBlbmdpbmUuIFVzZWQgaW50ZXJuYWxseSBubyB1c2VyIGludGVyYWN0aW9uIG5lZWRlZC5cclxuICAgICAqIE9ubHkgdG8gYmUgdXNlZCB3aGVuIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBub3QgYWRkZWQgd2l0aGluIEZVREdFIGlzIG5lZWRlZC5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T2ltb0pvaW50KCk6IE9JTU8uSm9pbnQge1xyXG4gICAgICByZXR1cm4gdGhpcy5qb2ludDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuI2dldE11dGF0b3IoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5hbmNob3IgPSB0aGlzLmFuY2hvci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLmFuY2hvciA9IGF3YWl0IG5ldyBWZWN0b3IzKCkuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYW5jaG9yKTtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICB0aGlzLmNvbm5lY3RDaGlsZChfc2VyaWFsaXphdGlvbi5uYW1lQ2hpbGRUb0Nvbm5lY3QpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKHRydWUpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKG11dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIG11dGF0b3IuYW5jaG9yID0gdGhpcy5hbmNob3IuZ2V0TXV0YXRvcigpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYW5jaG9yKSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICB0aGlzLmFuY2hvciA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5hbmNob3IpKSk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5hbmNob3I7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLm5hbWVDaGlsZFRvQ29ubmVjdCkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5jb25uZWN0Q2hpbGQoX211dGF0b3IubmFtZUNoaWxkVG9Db25uZWN0KTtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9tdXRhdG9yKTtcclxuICAgICAgdGhpcy5kZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNwcmluZ0RhbXBlcjtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLmpvaW50O1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubW90b3I7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUZWxsIHRoZSBGdWRnZVBoeXNpY3Mgc3lzdGVtIHRoYXQgdGhpcyBqb2ludCBuZWVkcyB0byBiZSBoYW5kbGVkIGluIHRoZSBuZXh0IGZyYW1lLiAqL1xyXG4gICAgcHJvdGVjdGVkIGRpcnR5U3RhdHVzKCk6IHZvaWQge1xyXG4gICAgICBQaHlzaWNzLmNoYW5nZUpvaW50U3RhdHVzKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhZGRKb2ludCgpOiB2b2lkIHtcclxuICAgICAgUGh5c2ljcy5hZGRKb2ludCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVtb3ZlSm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIFBoeXNpY3MucmVtb3ZlSm9pbnQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEpvaW50KC4uLl9jb25maWdQYXJhbXM6IE9iamVjdFtdKTogdm9pZCB7XHJcbiAgICAgIGxldCBwb3NCb2R5QW5jaG9yOiBWZWN0b3IzID0gdGhpcy5ib2R5QW5jaG9yLm5vZGUubXR4V29ybGQudHJhbnNsYXRpb247IC8vU2V0dGluZyB0aGUgYW5jaG9yIHBvc2l0aW9uIGxvY2FsbHkgZnJvbSB0aGUgZmlyc3QgcmlnaWRib2R5XHJcbiAgICAgIGxldCB3b3JsZEFuY2hvcjogT0lNTy5WZWMzID0gbmV3IE9JTU8uVmVjMyhwb3NCb2R5QW5jaG9yLnggKyB0aGlzLiNhbmNob3IueCwgcG9zQm9keUFuY2hvci55ICsgdGhpcy4jYW5jaG9yLnksIHBvc0JvZHlBbmNob3IueiArIHRoaXMuI2FuY2hvci56KTtcclxuXHJcbiAgICAgIC8vIEB0cy1pZ25vcmUgICAgLy8gdW5mb3J0dW5hdGVseSwgbWV0aG9kIGluaXQgaXMgbm90IGEgbWVtYmVyIG9mIHRoZSBiYXNlIGNsYXNzIE9JTU8uSm9pbnRDb25maWdcclxuICAgICAgdGhpcy5jb25maWcuaW5pdCh0aGlzLiNib2R5QW5jaG9yLmdldE9pbW9SaWdpZGJvZHkoKSwgdGhpcy4jYm9keVRpZWQuZ2V0T2ltb1JpZ2lkYm9keSgpLCB3b3JsZEFuY2hvciwgLi4uX2NvbmZpZ1BhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbmZpZ3VyZUpvaW50KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmpvaW50LnNldEJyZWFrRm9yY2UodGhpcy5icmVha0ZvcmNlKTtcclxuICAgICAgdGhpcy5qb2ludC5zZXRCcmVha1RvcnF1ZSh0aGlzLmJyZWFrVG9ycXVlKTtcclxuICAgICAgdGhpcy5qb2ludC5zZXRBbGxvd0NvbGxpc2lvbih0aGlzLiNpbnRlcm5hbENvbGxpc2lvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRlbGV0ZUZyb21NdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yLCBfZGVsZXRlOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGtleSBpbiBfZGVsZXRlKVxyXG4gICAgICAgIGRlbGV0ZSBfbXV0YXRvcltrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaG5kRXZlbnQgPSAoX2V2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgICBzd2l0Y2ggKF9ldmVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBFVkVOVC5DT01QT05FTlRfQUREOlxyXG4gICAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRElTQ09OTkVDVF9KT0lOVCwgKCkgPT4geyB0aGlzLmRpc2Nvbm5lY3QoKTsgdGhpcy5kaXJ0eVN0YXR1cygpOyB9LCB0cnVlKTtcclxuICAgICAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX1JFTU9WRTpcclxuICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkRJU0NPTk5FQ1RfSk9JTlQsICgpID0+IHsgdGhpcy5kaXNjb25uZWN0KCk7IHRoaXMuZGlydHlTdGF0dXMoKTsgfSwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUpvaW50KCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAjZ2V0TXV0YXRvciA9ICgpOiBNdXRhdG9yID0+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgbmFtZUNoaWxkVG9Db25uZWN0OiB0aGlzLiNuYW1lQ2hpbGRUb0Nvbm5lY3QsXHJcbiAgICAgICAgaW50ZXJuYWxDb2xsaXNpb246IHRoaXMuI2ludGVybmFsQ29sbGlzaW9uLFxyXG4gICAgICAgIGJyZWFrRm9yY2U6IHRoaXMuI2JyZWFrRm9yY2UsXHJcbiAgICAgICAgYnJlYWtUb3JxdWU6IHRoaXMuI2JyZWFrVG9ycXVlXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfTtcclxuXHJcbiAgICAjbXV0YXRlID0gKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCA9PiB7XHJcbiAgICAgIHRoaXMubXV0YXRlQmFzZShfbXV0YXRvciwgW1wiaW50ZXJuYWxDb2xsaXNpb25cIiwgXCJicmVha0ZvcmNlXCIsIFwiYnJlYWtUb3JxdWVcIl0pO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgICAqIEJhc2UgY2xhc3MgZm9yIGpvaW50cyBvcGVyYXRpbmcgd2l0aCBleGFjdGx5IG9uZSBheGlzXHJcbiAgICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIEpvaW50QXhpYWwgZXh0ZW5kcyBKb2ludCB7XHJcbiAgICBwcm90ZWN0ZWQgc3ByaW5nRGFtcGVyOiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuICAgIFxyXG4gICAgLy9JbnRlcm5hbCBWYXJpYWJsZXNcclxuICAgICNtYXhNb3RvcjogbnVtYmVyID0gMTA7XHJcbiAgICAjbWluTW90b3I6IG51bWJlciA9IC0xMDtcclxuICAgICNtb3RvclNwZWVkOiBudW1iZXIgPSAwO1xyXG4gICAgI2F4aXM6IE9JTU8uVmVjMztcclxuICAgICNzcHJpbmdGcmVxdWVuY3k6IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRGFtcGluZzogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvKiogQ3JlYXRpbmcgYSBjeWxpbmRyaWNhbCBqb2ludCBiZXR3ZWVuIHR3byBDb21wb25lbnRSaWdpZGJvZGllcyBtb3Zpbmcgb24gb25lIGF4aXMgYW5kIHJvdGF0aW5nIGFyb3VuZCBhbm90aGVyIGJvdW5kIG9uIGEgbG9jYWwgYW5jaG9ycG9pbnQuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2F4aXM6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAxLCAwKSwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCk7XHJcbiAgICAgIHRoaXMuYXhpcyA9IF9heGlzO1xyXG4gICAgICB0aGlzLmFuY2hvciA9IF9sb2NhbEFuY2hvcjtcclxuICAgICAgdGhpcy5taW5Nb3RvciA9IC0xMDtcclxuICAgICAgdGhpcy5tYXhNb3RvciA9IDEwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBHZXQvU2V0IHRyYW5zZm9yIG9mIGZ1ZGdlIHByb3BlcnRpZXMgdG8gdGhlIHBoeXNpY3MgZW5naW5lXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBheGlzIGNvbm5lY3RpbmcgdGhlIHRoZSB0d28ge0BsaW5rIE5vZGV9cyBlLmcuIFZlY3RvcjMoMCwxLDApIHRvIGhhdmUgYSB1cHdhcmQgY29ubmVjdGlvbi5cclxuICAgICAqICBXaGVuIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdGhlIGpvaW50IG5lZWRzIHRvIGJlIHJlY29ubmVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGF4aXMoKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLiNheGlzLngsIHRoaXMuI2F4aXMueSwgdGhpcy4jYXhpcy56KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYXhpcyhfdmFsdWU6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy4jYXhpcyA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heE1vdG9yKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtYXhNb3RvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG1heE1vdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21heE1vdG9yID0gX3ZhbHVlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgICg8T0lNTy5QcmlzbWF0aWNKb2ludD48dW5rbm93bj50aGlzLmpvaW50KS5nZXRMaW1pdE1vdG9yKCkudXBwZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHsgLyogKi8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBMb3dlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1pbk1vdG9yKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtaW5Nb3RvcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWluTW90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWluTW90b3IgPSBfdmFsdWU7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgKDxPSU1PLlByaXNtYXRpY0pvaW50Pjx1bmtub3duPnRoaXMuam9pbnQpLmdldExpbWl0TW90b3IoKS5sb3dlckxpbWl0ID0gX3ZhbHVlO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikgeyAvKiAqLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGFtcGluZyBvZiB0aGUgc3ByaW5nLiAxIGVxdWFscyBjb21wbGV0bHkgZGFtcGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0RhbXBpbmcoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0RhbXBpbmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0RhbXBpbmcoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGluZyA9IF92YWx1ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAoPE9JTU8uUHJpc21hdGljSm9pbnQ+PHVua25vd24+dGhpcy5qb2ludCkuZ2V0U3ByaW5nRGFtcGVyKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikgeyAvKiAqLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIHRhcmdldCBzcGVlZCBvZiB0aGUgbW90b3IgaW4gbS9zLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1vdG9yU3BlZWQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21vdG9yU3BlZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBtb3RvclNwZWVkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21vdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgKDxPSU1PLlByaXNtYXRpY0pvaW50PnRoaXMuam9pbnQpLmdldExpbWl0TW90b3IoKS5tb3RvclNwZWVkID0gX3ZhbHVlO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikgeyAvKiAqLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gVGhlIHNtYWxsZXIgdGhlIHZhbHVlIHRoZSBsZXNzIHJlc3RyaWN0aXZlIGlzIHRoZSBzcHJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdGcmVxdWVuY3koKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRnJlcXVlbmN5KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAoPE9JTU8uUHJpc21hdGljSm9pbnQ+dGhpcy5qb2ludCkuZ2V0U3ByaW5nRGFtcGVyKCkuZnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikgeyAvKiAqLyB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmdcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy4jZ2V0TXV0YXRvcigpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmF4aXMgPSB0aGlzLmF4aXMuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5heGlzID0gYXdhaXQgbmV3IFZlY3RvcjMoKS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5heGlzKTtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYXhpcykgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5heGlzID0gbmV3IFZlY3RvcjMoLi4uPG51bWJlcltdPihPYmplY3QudmFsdWVzKF9tdXRhdG9yLmF4aXMpKSk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5heGlzO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX211dGF0b3IpO1xyXG4gICAgICB0aGlzLmRlbGV0ZUZyb21NdXRhdG9yKF9tdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBtdXRhdG9yLmF4aXMgPSB0aGlzLmF4aXMuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKG11dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc3ByaW5nRGFtcGVyID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeSwgdGhpcy4jc3ByaW5nRGFtcGluZyk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KHRoaXMuI2F4aXMpO1xyXG4gICAgfVxyXG5cclxuICAgICNnZXRNdXRhdG9yID0gKCk6IE11dGF0b3IgPT4ge1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICBzcHJpbmdEYW1waW5nOiB0aGlzLiNzcHJpbmdEYW1waW5nLFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeTogdGhpcy4jc3ByaW5nRnJlcXVlbmN5LFxyXG4gICAgICAgIG1heE1vdG9yOiB0aGlzLiNtYXhNb3RvcixcclxuICAgICAgICBtaW5Nb3RvcjogdGhpcy4jbWluTW90b3IsXHJcbiAgICAgICAgbW90b3JTcGVlZDogdGhpcy4jbW90b3JTcGVlZFxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH07XHJcblxyXG4gICAgI211dGF0ZSA9IChfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgPT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZUJhc2UoX211dGF0b3IsIFtcInNwcmluZ0RhbXBpbmdcIiwgXCJzcHJpbmdGcmVxdWVuY3lcIiwgXCJtYXhNb3RvclwiLCBcIm1pbk1vdG9yXCIsIFwibW90b3JTcGVlZFwiXSk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Zy9EZWJ1Z1RhcmdldC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnL0RlYnVnLnRzXCIvPlxyXG4vLyAvIDxyZWZlcmVuY2UgcGF0aD1cIlRpbWUvVGltZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkV2ZW50L0V2ZW50LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiU2VyaWFsaXphdGlvbi9NdXRhYmxlLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiU2VyaWFsaXphdGlvbi9TZXJpYWxpemVyLnRzXCIvPiBcclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkdyYXBoL05vZGUudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDb21wb25lbnQvQ29tcG9uZW50LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUmVjeWNsZS9SZWN5Y2FibGVBcnJheS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlci9SZW5kZXJXZWJHTC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlci9SZW5kZXJJbmplY3RvclRleHR1cmUudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJQaHlzaWNzL0hlbHBlcnNQaHlzaWNzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUGh5c2ljcy9Kb2ludC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlBoeXNpY3MvSm9pbnRBeGlhbC50c1wiLz5cclxuXHJcblxyXG4vL2dsb2JhbCBmdW5jdGlvbnNcclxuZnVuY3Rpb24gaWZOdW1iZXIoX2NoZWNrOiBudW1iZXIsIF9kZWZhdWx0OiBudW1iZXIpOiBudW1iZXIge1xyXG4gIHJldHVybiB0eXBlb2YgX2NoZWNrID09IFwidW5kZWZpbmVkXCIgPyBfZGVmYXVsdCA6IF9jaGVjaztcclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBbmltYXRpb25TdHJ1Y3R1cmUgdGhhdCB0aGUgQW5pbWF0aW9uIHVzZXMgdG8gbWFwIHRoZSBTZXF1ZW5jZXMgdG8gdGhlIEF0dHJpYnV0ZXMuXHJcbiAgICogQnVpbHQgb3V0IG9mIGEge0BsaW5rIE5vZGV9J3Mgc2VyaWFsc2F0aW9uLCBpdCBzd2FwcyB0aGUgdmFsdWVzIHdpdGgge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXMuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb25TdHJ1Y3R1cmUge1xyXG4gICAgW2F0dHJpYnV0ZTogc3RyaW5nXTogQW5pbWF0aW9uU3RydWN0dXJlW10gfCBBbmltYXRpb25TdHJ1Y3R1cmUgfCBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3IzIGV4dGVuZHMgQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgIHg/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHk/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHo/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3I0IGV4dGVuZHMgQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgIHg/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHk/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHo/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHc/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VNYXRyaXg0eDQgZXh0ZW5kcyBBbmltYXRpb25TdHJ1Y3R1cmUge1xyXG4gICAgcm90YXRpb24/OiBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjMgfCBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjQ7XHJcbiAgICBzY2FsZT86IEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yMztcclxuICAgIHRyYW5zbGF0aW9uPzogQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3IzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBbiBhc3NvY2lhdGl2ZSBhcnJheSBtYXBwaW5nIG5hbWVzIG9mIGxhYmxlcyB0byB0aW1lc3RhbXBzLlxyXG4gICogTGFiZWxzIG5lZWQgdG8gYmUgdW5pcXVlIHBlciBBbmltYXRpb24uXHJcbiAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvbkxhYmVsIHtcclxuICAgIFtuYW1lOiBzdHJpbmddOiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IEFuaW1hdGlvbiBFdmVudCBUcmlnZ2Vyc1xyXG4gICogQGF1dGhvciBMdWthcyBTY2hldWVybGUsIEhGVSwgMjAxOVxyXG4gICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb25FdmVudFRyaWdnZXIge1xyXG4gICAgW25hbWU6IHN0cmluZ106IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVybmFsbHkgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHZhcmlvdXMgZ2VuZXJhdGVkIHN0cnVjdHVyZXMgYW5kIGV2ZW50cy5cclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZW51bSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUge1xyXG4gICAgLyoqRGVmYXVsdDogZm9yd2FyZCwgY29udGlub3VzICovXHJcbiAgICBOT1JNQUwsXHJcbiAgICAvKipiYWNrd2FyZCwgY29udGlub3VzICovXHJcbiAgICBSRVZFUlNFLFxyXG4gICAgLyoqZm9yd2FyZCwgcmFzdGVyZWQgKi9cclxuICAgIFJBU1RFUkVELFxyXG4gICAgLyoqYmFja3dhcmQsIHJhc3RlcmVkICovXHJcbiAgICBSQVNURVJFRFJFVkVSU0VcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGRpZmZlcmVudCBwbGF5bW9kZXMgdGhlIGFuaW1hdGlvbiB1c2VzIHRvIHBsYXkgYmFjayBpdHMgYW5pbWF0aW9uLlxyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBBTklNQVRJT05fUExBWU1PREUge1xyXG4gICAgLyoqUGxheXMgYW5pbWF0aW9uIGluIGEgbG9vcDogaXQgcmVzdGFydHMgb25jZSBpdCBoaXQgdGhlIGVuZC4qL1xyXG4gICAgTE9PUCA9IFwibG9vcFwiLFxyXG4gICAgLyoqUGxheXMgYW5pbWF0aW9uIG9uY2UgYW5kIHN0b3BzIGF0IHRoZSBsYXN0IGtleS9mcmFtZSovXHJcbiAgICBQTEFZX09OQ0UgPSBcInBsYXlPbmNlXCIsXHJcbiAgICAvKipQbGF5cyBhbmltYXRpb24gb25jZSBhbmQgc3RvcHMgb24gdGhlIGZpcnN0IGtleS9mcmFtZSAqL1xyXG4gICAgUExBWV9PTkNFX1JFU0VUID0gXCJwbGF5T25jZVJlc2V0XCIsXHJcbiAgICAvKipQbGF5cyBhbmltYXRpb24gbGlrZSBMT09QLCBidXQgYmFja3dhcmRzLiovXHJcbiAgICBSRVZFUlNFX0xPT1AgPSBcInJldmVyc2VMb29wXCIsXHJcbiAgICAvKipDYXVzZXMgdGhlIGFuaW1hdGlvbiBub3QgdG8gcGxheSBhdCBhbGwuIFVzZWZ1bCBmb3IganVtcGluZyB0byB2YXJpb3VzIHBvc2l0aW9ucyBpbiB0aGUgYW5pbWF0aW9uIHdpdGhvdXQgcHJvY2VlZGluZyBpbiB0aGUgYW5pbWF0aW9uLiovXHJcbiAgICBTVE9QID0gXCJzdG9wXCJcclxuICAgIC8vVE9ETzogYWRkIGFuIElOSEVSSVQgYW5kIGEgUElOR1BPTkcgbW9kZVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gQU5JTUFUSU9OX1FVQU5USVpBVElPTiB7XHJcbiAgICAvL1RPRE86IGFkZCBhbiBpbi1kZXB0aCBkZXNjcmlwdGlvbiBvZiB3aGF0IGhhcHBlbnMgdG8gdGhlIGFuaW1hdGlvbiAoYW5kIGV2ZW50cykgZGVwZW5kaW5nIG9uIHRoZSBxdWFudGl6YXRpb24uIFVzZSBHcmFwaHMgdG8gZXhwbGFpbi5cclxuICAgIC8qKkNhbGN1bGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBhbmltYXRpb24gYXQgdGhlIGV4YWN0IHBvc2l0aW9uIG9mIHRpbWUuIElnbm9yZXMgRlBTIHZhbHVlIG9mIGFuaW1hdGlvbi4qL1xyXG4gICAgQ09OVElOT1VTID0gXCJjb250aW5vdXNcIixcclxuICAgIC8qKkxpbWl0cyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIHN0YXRlIG9mIHRoZSBhbmltYXRpb24gdG8gdGhlIEZQUyB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uLiBTa2lwcyBmcmFtZXMgaWYgbmVlZGVkLiovXHJcbiAgICBESVNDUkVURSA9IFwiZGlzY3JldGVcIixcclxuICAgIC8qKiBBZHZhbmNlcyB0aGUgdGltZSBlYWNoIGZyYW1lIGFjY29yZGluZyB0byB0aGUgRlBTIHZhbHVlIG9mIHRoZSBhbmltYXRpb24sIGlnbm9yaW5nIHRoZSBhY3R1YWwgZHVyYXRpb24gb2YgdGhlIGZyYW1lcy4gRG9lc24ndCBza2lwIGFueSBmcmFtZXMuKi9cclxuICAgIEZSQU1FUyA9IFwiZnJhbWVzXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlc2NyaWJlcyBhbmQgY29udHJvbHMgYW5kIGFuaW1hdGlvbiBieSB5aWVsZGluZyBtdXRhdG9ycyBcclxuICAgKiBhY2NvcmRpbmcgdG8gdGhlIHN0b3JlZCB7QGxpbmsgQW5pbWF0aW9uU3RydWN0dXJlfSBhbmQge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXNcclxuICAgKiBBcHBsaWVkIHRvIGEge0BsaW5rIE5vZGV9IGRpcmVjdGx5IHZpYSBzY3JpcHQgb3Ige0BsaW5rIENvbXBvbmVudEFuaW1hdG9yfS5cclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMTAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQW5pbWF0aW9uIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIC8vIC8qKiByZWZlcnMgYmFjayB0byB0aGlzIGNsYXNzIGZyb20gYW55IHN1YmNsYXNzIGUuZy4gaW4gb3JkZXIgdG8gZmluZCBjb21wYXRpYmxlIG90aGVyIHJlc291cmNlcyovXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJhc2VDbGFzczogdHlwZW9mIEFuaW1hdGlvbiA9IEFuaW1hdGlvbjtcclxuICAgIC8vIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIEFuaW1hdGlvbltdID0gW107XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQW5pbWF0aW9uLnJlZ2lzdGVyU3ViY2xhc3MoQW5pbWF0aW9uKTtcclxuICAgIHB1YmxpYyBpZFJlc291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xyXG4gICAgcHVibGljIHRvdGFsVGltZTogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsYWJlbHM6IEFuaW1hdGlvbkxhYmVsID0ge307IC8vIGEgbGFiZWwgbWFya3MgYSBzcGVjaWZpYyB0aW1lIHRvIGNvbnZlbmllbnRseSBqdW1wIHRvIHVzaW5nIGEgdGV4dCBpZGVudGlmaWVyXHJcbiAgICAvLyBzdGVwc1BlclNlY29uZDogbnVtYmVyID0gMTA7XHJcbiAgICBwdWJsaWMgYW5pbWF0aW9uU3RydWN0dXJlOiBBbmltYXRpb25TdHJ1Y3R1cmU7IC8vIFRPRE86IGlmIHNldCB0aGUgY2FjaGUgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgKGFuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQpXHJcbiAgICBwdWJsaWMgZXZlbnRzOiBBbmltYXRpb25FdmVudFRyaWdnZXIgPSB7fTtcclxuICAgIHByb3RlY3RlZCBmcmFtZXNQZXJTZWNvbmQ6IG51bWJlciA9IDYwOyAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBhbmQgaXRzIGFjY2Vzc29ycyB0byAjZnJhbWVzUGVyU2Vjb25kP1xyXG5cclxuICAgIC8vIHByb2Nlc3NlZCBldmVudGxpc3QgYW5kIGFuaW1hdGlvbiBzdHJ1Y3V0cmVzIGZvciBwbGF5YmFjay5cclxuICAgIHByaXZhdGUgZXZlbnRzUHJvY2Vzc2VkOiBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25FdmVudFRyaWdnZXI+ID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcj4oKTtcclxuICAgICNhbmltYXRpb25TdHJ1Y3R1cmVzUHJvY2Vzc2VkOiBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25TdHJ1Y3R1cmU+ID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvblN0cnVjdHVyZT4oKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IEFuaW1hdGlvbi5uYW1lLCBfYW5pbVN0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge30sIF9mcHM6IG51bWJlciA9IDYwKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IF9hbmltU3RydWN0dXJlO1xyXG4gICAgICB0aGlzLiNhbmltYXRpb25TdHJ1Y3R1cmVzUHJvY2Vzc2VkLnNldChBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuTk9STUFMLCBfYW5pbVN0cnVjdHVyZSk7XHJcbiAgICAgIHRoaXMuZnJhbWVzUGVyU2Vjb25kID0gX2ZwcztcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbFRpbWUoKTtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YkNsYXNzOiB0eXBlb2YgQW5pbWF0aW9uKTogbnVtYmVyIHsgcmV0dXJuIEFuaW1hdGlvbi5zdWJjbGFzc2VzLnB1c2goX3N1YkNsYXNzKSAtIDE7IH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGdldExhYmVscygpOiBFbnVtZXJhdG9yIHtcclxuICAgICAgLy9UT0RPOiB0aGlzIGFjdHVhbGx5IG5lZWRzIHRlc3RpbmdcclxuICAgICAgbGV0IGVuOiBFbnVtZXJhdG9yID0gbmV3IEVudW1lcmF0b3IodGhpcy5sYWJlbHMpO1xyXG4gICAgICByZXR1cm4gZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBmcHMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZnJhbWVzUGVyU2Vjb25kO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZnBzKF9mcHM6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmZyYW1lc1BlclNlY29uZCA9IF9mcHM7XHJcbiAgICAgIHRoaXMuZXZlbnRzUHJvY2Vzc2VkLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXIgdGhpcyBhbmltYXRpb25zIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZC5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIGEge0BsaW5rIE11dGF0b3J9IHdpdGggdGhlIGluZm9ybWF0aW9uIHRvIGFwcGx5IHRvIHRoZSB7QGxpbmsgTm9kZX0gdG8gYW5pbWF0ZVxyXG4gICAgICogaW4gdGhlIHN0YXRlIHRoZSBhbmltYXRpb24gaXMgaW4gYXQgdGhlIGdpdmVuIHRpbWUsIGRpcmVjdGlvbiBhbmQgcXVhbnRpemF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdGF0ZShfdGltZTogbnVtYmVyLCBfZGlyZWN0aW9uOiBudW1iZXIsIF9xdWFudGl6YXRpb246IEFOSU1BVElPTl9RVUFOVElaQVRJT04pOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG06IE11dGF0b3IgPSB7fTtcclxuICAgICAgbGV0IGFuaW1hdGlvblN0cnVjdHVyZTogQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFO1xyXG5cclxuICAgICAgaWYgKF9xdWFudGl6YXRpb24gPT0gQU5JTUFUSU9OX1FVQU5USVpBVElPTi5DT05USU5PVVMpXHJcbiAgICAgICAgYW5pbWF0aW9uU3RydWN0dXJlID0gX2RpcmVjdGlvbiA8IDAgPyBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRSA6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUw7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhbmltYXRpb25TdHJ1Y3R1cmUgPSBfZGlyZWN0aW9uIDwgMCA/IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0UgOiBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkFTVEVSRUQ7XHJcblxyXG4gICAgICBtID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvck11dGF0b3IodGhpcy5nZXRQcm9jZXNzZWRBbmltYXRpb25TdHJ1Y3R1cmUoYW5pbWF0aW9uU3RydWN0dXJlKSwgX3RpbWUpO1xyXG4gICAgICByZXR1cm4gbTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgZXZlbnRzIHRoZSB7QGxpbmsgQ29tcG9uZW50QW5pbWF0b3J9IG5lZWRzIHRvIGZpcmUgYmV0d2VlbiBfbWluIGFuZCBfbWF4IGlucHV0IHZhbHVlcy5cclxuICAgICAqIEBwYXJhbSBfZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdGhlIGFuaW1hdGlvbiBpcyBzdXBwb3NlZCB0byBydW4gaW4uID4wID09IGZvcndhcmQsIDAgPT0gc3RvcCwgPDAgPT0gYmFja3dhcmRzXHJcbiAgICAgKiBAcmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5ncyB3aXRoIHRoZSBuYW1lcyBvZiB0aGUgY3VzdG9tIGV2ZW50cyB0byBmaXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RXZlbnRzVG9GaXJlKF9taW46IG51bWJlciwgX21heDogbnVtYmVyLCBfcXVhbnRpemF0aW9uOiBBTklNQVRJT05fUVVBTlRJWkFUSU9OLCBfZGlyZWN0aW9uOiBudW1iZXIpOiBzdHJpbmdbXSB7XHJcbiAgICAgIGxldCBldmVudExpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGxldCBtaW5TZWN0aW9uOiBudW1iZXIgPSBNYXRoLmZsb29yKF9taW4gLyB0aGlzLnRvdGFsVGltZSk7XHJcbiAgICAgIGxldCBtYXhTZWN0aW9uOiBudW1iZXIgPSBNYXRoLmZsb29yKF9tYXggLyB0aGlzLnRvdGFsVGltZSk7XHJcbiAgICAgIF9taW4gPSBfbWluICUgdGhpcy50b3RhbFRpbWU7XHJcbiAgICAgIF9tYXggPSBfbWF4ICUgdGhpcy50b3RhbFRpbWU7XHJcblxyXG4gICAgICB3aGlsZSAobWluU2VjdGlvbiA8PSBtYXhTZWN0aW9uKSB7XHJcbiAgICAgICAgbGV0IGV2ZW50VHJpZ2dlcnM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciA9IHRoaXMuZ2V0Q29ycmVjdEV2ZW50TGlzdChfZGlyZWN0aW9uLCBfcXVhbnRpemF0aW9uKTtcclxuICAgICAgICBpZiAobWluU2VjdGlvbiA9PSBtYXhTZWN0aW9uKSB7XHJcbiAgICAgICAgICBldmVudExpc3QgPSBldmVudExpc3QuY29uY2F0KHRoaXMuY2hlY2tFdmVudHNCZXR3ZWVuKGV2ZW50VHJpZ2dlcnMsIF9taW4sIF9tYXgpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZXZlbnRMaXN0ID0gZXZlbnRMaXN0LmNvbmNhdCh0aGlzLmNoZWNrRXZlbnRzQmV0d2VlbihldmVudFRyaWdnZXJzLCBfbWluLCB0aGlzLnRvdGFsVGltZSkpO1xyXG4gICAgICAgICAgX21pbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1pblNlY3Rpb24rKztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGV2ZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gRXZlbnQgdG8gdGhlIExpc3Qgb2YgZXZlbnRzLlxyXG4gICAgICogQHBhcmFtIF9uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudCAobmVlZHMgdG8gYmUgdW5pcXVlIHBlciBBbmltYXRpb24pLlxyXG4gICAgICogQHBhcmFtIF90aW1lIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGV2ZW50IChpbiBtaWxsaXNlY29uZHMpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0RXZlbnQoX25hbWU6IHN0cmluZywgX3RpbWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLmV2ZW50c1tfbmFtZV0gPSBfdGltZTtcclxuICAgICAgdGhpcy5ldmVudHNQcm9jZXNzZWQuY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgbGlzdCBvZiBldmVudHMuXHJcbiAgICAgKiBAcGFyYW0gX25hbWUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVtb3ZlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlRXZlbnQoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBkZWxldGUgdGhpcy5ldmVudHNbX25hbWVdO1xyXG4gICAgICB0aGlzLmV2ZW50c1Byb2Nlc3NlZC5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIChSZS0pQ2FsY3VsYXRlIHRoZSB0b3RhbCB0aW1lIG9mIHRoZSBBbmltYXRpb24uIENhbGN1bGF0aW9uLWhlYXZ5LCB1c2Ugb25seSBpZiBhY3R1YWxseSBuZWVkZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWxjdWxhdGVUb3RhbFRpbWUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudG90YWxUaW1lID0gMDtcclxuICAgICAgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclRpbWUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICAvLyBpZiAodGhpcy50b3RhbFRpbWUgPT0gMCkgLy8gYW5pbWF0aW9ucyB3aXRoIG9uZSBrZXlmcmFtZSBuZWVkIGEgdG90YWwgdGltZSAhPSAwIHRvIHdvcmtcclxuICAgICAgLy8gICB0aGlzLnRvdGFsVGltZSA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHRvIHVzZSBmb3IgYW5pbWF0aW9uIHNhbXBsaW5nIHdoZW4gYXBwbHlpbmcgYSBwbGF5bW9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TW9kYWxUaW1lKF90aW1lOiBudW1iZXIsIF9wbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFLCBfdGltZVN0b3A6IG51bWJlciA9IF90aW1lKTogbnVtYmVyIHtcclxuICAgICAgc3dpdGNoIChfcGxheW1vZGUpIHtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5TVE9QOlxyXG4gICAgICAgICAgLy8gcmV0dXJuIHRoaXMubG9jYWxUaW1lLmdldE9mZnNldCgpO1xyXG4gICAgICAgICAgcmV0dXJuIF90aW1lU3RvcDtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0U6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvdGFsVGltZSAtIDAuMDE7ICAgICAvL1RPRE86IHRoaXMgbWlnaHQgY2F1c2Ugc29tZSBpc3N1ZXNcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0VfUkVTRVQ6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpXHJcbiAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBfdGltZVN0b3AgaW5zdGVhZD9cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxUaW1lICsgMC4wMTsgICAgIC8vVE9ETzogdGhpcyBtaWdodCBjYXVzZSBzb21lIGlzc3Vlc1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfdGltZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIGRpcmVjdGlvbiB0aGUgYW5pbWF0aW9uIHNob3VsZCBjdXJyZW50bHkgYmUgcGxheWluZyBpbi5cclxuICAgICAqIEBwYXJhbSBfdGltZSB0aGUgdGltZSBhdCB3aGljaCB0byBjYWxjdWxhdGUgdGhlIGRpcmVjdGlvblxyXG4gICAgICogQHJldHVybnMgMSBpZiBmb3J3YXJkLCAwIGlmIHN0b3AsIC0xIGlmIGJhY2t3YXJkc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2FsY3VsYXRlRGlyZWN0aW9uKF90aW1lOiBudW1iZXIsIF9wbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFKTogbnVtYmVyIHtcclxuICAgICAgc3dpdGNoIChfcGxheW1vZGUpIHtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5TVE9QOlxyXG4gICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgLy8gY2FzZSBBTklNQVRJT05fUExBWU1PREUuUElOR1BPTkc6XHJcbiAgICAgICAgLy8gICBpZiAoTWF0aC5mbG9vcihfdGltZSAvIHRoaXMuYW5pbWF0aW9uLnRvdGFsVGltZSkgJSAyID09IDApXHJcbiAgICAgICAgLy8gICAgIHJldHVybiAxO1xyXG4gICAgICAgIC8vICAgZWxzZVxyXG4gICAgICAgIC8vICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgY2FzZSBBTklNQVRJT05fUExBWU1PREUuUkVWRVJTRV9MT09QOlxyXG4gICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIGNhc2UgQU5JTUFUSU9OX1BMQVlNT0RFLlBMQVlfT05DRTpcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0VfUkVTRVQ6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIHRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgczogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGxhYmVsczoge30sXHJcbiAgICAgICAgZXZlbnRzOiB7fSxcclxuICAgICAgICBmcmFtZXNQZXJTZWNvbmQ6IHRoaXMuZnJhbWVzUGVyU2Vjb25kXHJcbiAgICAgICAgLy8gc3BzOiB0aGlzLnN0ZXBzUGVyU2Vjb25kXHJcbiAgICAgIH07XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5sYWJlbHMpIHtcclxuICAgICAgICBzLmxhYmVsc1tuYW1lXSA9IHRoaXMubGFiZWxzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5ldmVudHMpIHtcclxuICAgICAgICBzLmV2ZW50c1tuYW1lXSA9IHRoaXMuZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHMuYW5pbWF0aW9uU3RydWN0dXJlID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclNlcmlhbGl6YXRpb24odGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICByZXR1cm4gcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfc2VyaWFsaXphdGlvbi5uYW1lO1xyXG4gICAgICB0aGlzLmZyYW1lc1BlclNlY29uZCA9IF9zZXJpYWxpemF0aW9uLmZyYW1lc1BlclNlY29uZDtcclxuICAgICAgLy8gdGhpcy5zdGVwc1BlclNlY29uZCA9IF9zZXJpYWxpemF0aW9uLnNwcztcclxuICAgICAgdGhpcy5sYWJlbHMgPSB7fTtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBfc2VyaWFsaXphdGlvbi5sYWJlbHMpIHtcclxuICAgICAgICB0aGlzLmxhYmVsc1tuYW1lXSA9IF9zZXJpYWxpemF0aW9uLmxhYmVsc1tuYW1lXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmV2ZW50cyA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuYW1lIGluIF9zZXJpYWxpemF0aW9uLmV2ZW50cykge1xyXG4gICAgICAgIHRoaXMuZXZlbnRzW25hbWVdID0gX3NlcmlhbGl6YXRpb24uZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZXZlbnRzUHJvY2Vzc2VkID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcj4oKTtcclxuXHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlID0gYXdhaXQgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvckRlc2VyaWFsaXphdGlvbihfc2VyaWFsaXphdGlvbi5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG5cclxuICAgICAgdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZCA9IG5ldyBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25TdHJ1Y3R1cmU+KCk7XHJcblxyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsVGltZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgIC8vICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnRvdGFsVGltZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIGFuIEFuaW1hdGlvblN0cnVjdHVyZSBhbmQgcmV0dXJucyB0aGUgU2VyaWFsaXphdGlvbiBvZiBzYWlkIFN0cnVjdHVyZS5cclxuICAgICAqIEBwYXJhbSBfc3RydWN0dXJlIFRoZSBBbmltYXRpb24gU3RydWN0dXJlIGF0IHRoZSBjdXJyZW50IGxldmVsIHRvIHRyYW5zZm9ybSBpbnRvIHRoZSBTZXJpYWxpemF0aW9uLlxyXG4gICAgICogQHJldHVybnMgdGhlIGZpbGxlZCBTZXJpYWxpemF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYXZlcnNlU3RydWN0dXJlRm9yU2VyaWFsaXphdGlvbihfc3RydWN0dXJlOiBPYmplY3QpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBfc3RydWN0dXJlKSB7XHJcbiAgICAgICAgbGV0IHN0cnVjdHVyZU9yU2VxdWVuY2U6IE9iamVjdCA9ICg8R2VuZXJhbD5fc3RydWN0dXJlKVtwcm9wZXJ0eV07XHJcbiAgICAgICAgaWYgKHN0cnVjdHVyZU9yU2VxdWVuY2UgaW5zdGFuY2VvZiBBbmltYXRpb25TZXF1ZW5jZSlcclxuICAgICAgICAgIHNlcmlhbGl6YXRpb25bcHJvcGVydHldID0gc3RydWN0dXJlT3JTZXF1ZW5jZS5zZXJpYWxpemUoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBzZXJpYWxpemF0aW9uW3Byb3BlcnR5XSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JTZXJpYWxpemF0aW9uKHN0cnVjdHVyZU9yU2VxdWVuY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmF2ZXJzZXMgYSBTZXJpYWxpemF0aW9uIHRvIGNyZWF0ZSBhIG5ldyBBbmltYXRpb25TdHJ1Y3R1cmUuXHJcbiAgICAgKiBAcGFyYW0gX3NlcmlhbGl6YXRpb24gVGhlIHNlcmlhbGl6YXRpb24gdG8gdHJhbnNmZXIgaW50byBhbiBBbmltYXRpb25TdHJ1Y3R1cmVcclxuICAgICAqIEByZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIEFuaW1hdGlvblN0cnVjdHVyZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyB0cmF2ZXJzZVN0cnVjdHVyZUZvckRlc2VyaWFsaXphdGlvbihfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8QW5pbWF0aW9uU3RydWN0dXJlPiB7XHJcbiAgICAgIGxldCBzdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zZXJpYWxpemF0aW9uKSB7XHJcbiAgICAgICAgaWYgKF9zZXJpYWxpemF0aW9uW25dLmFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBsZXQgYW5pbVNlcTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgICAgIHN0cnVjdHVyZVtuXSA9IDxBbmltYXRpb25TZXF1ZW5jZT4oYXdhaXQgYW5pbVNlcS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltuXSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzdHJ1Y3R1cmVbbl0gPSBhd2FpdCB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yRGVzZXJpYWxpemF0aW9uKF9zZXJpYWxpemF0aW9uW25dKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHN0cnVjdHVyZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnRzIHRvIGJlIHVzZWQgd2l0aCB0aGVzZSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRDb3JyZWN0RXZlbnRMaXN0KF9kaXJlY3Rpb246IG51bWJlciwgX3F1YW50aXphdGlvbjogQU5JTUFUSU9OX1FVQU5USVpBVElPTik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGlmIChfcXVhbnRpemF0aW9uICE9IEFOSU1BVElPTl9RVUFOVElaQVRJT04uRlJBTUVTKSB7XHJcbiAgICAgICAgaWYgKF9kaXJlY3Rpb24gPj0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJFVkVSU0UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoX2RpcmVjdGlvbiA+PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJBU1RFUkVEKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIGFuIHtAbGluayBBbmltYXRpb25TdHJ1Y3R1cmV9IGFuZCByZXR1cm5zIGEge0BsaW5rIE11dGF0b3J9IGRlc2NyaWJpbmcgdGhlIHN0YXRlIGF0IHRoZSBnaXZlbiB0aW1lXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhdmVyc2VTdHJ1Y3R1cmVGb3JNdXRhdG9yKF9zdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSwgX3RpbWU6IG51bWJlcik6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbmV3TXV0YXRvcjogTXV0YXRvciA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zdHJ1Y3R1cmUpIHtcclxuICAgICAgICBpZiAoX3N0cnVjdHVyZVtuXSBpbnN0YW5jZW9mIEFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBuZXdNdXRhdG9yW25dID0gKDxBbmltYXRpb25TZXF1ZW5jZT5fc3RydWN0dXJlW25dKS5ldmFsdWF0ZShfdGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ld011dGF0b3Jbbl0gPSB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yTXV0YXRvcig8QW5pbWF0aW9uU3RydWN0dXJlPl9zdHJ1Y3R1cmVbbl0sIF90aW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBuZXdNdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIHRoZSBjdXJyZW50IEFuaW1hdGlvblN0cmN1dHVyZSB0byBmaW5kIHRoZSB0b3RhbFRpbWUgb2YgdGhpcyBhbmltYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gX3N0cnVjdHVyZSBUaGUgc3RydWN0dXJlIHRvIHRyYXZlcnNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhdmVyc2VTdHJ1Y3R1cmVGb3JUaW1lKF9zdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zdHJ1Y3R1cmUpIHtcclxuICAgICAgICBpZiAoX3N0cnVjdHVyZVtuXSBpbnN0YW5jZW9mIEFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBsZXQgc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlID0gPEFuaW1hdGlvblNlcXVlbmNlPl9zdHJ1Y3R1cmVbbl07XHJcbiAgICAgICAgICBpZiAoc2VxdWVuY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgc2VxdWVuY2VUaW1lOiBudW1iZXIgPSBzZXF1ZW5jZS5nZXRLZXkoc2VxdWVuY2UubGVuZ3RoIC0gMSkudGltZTtcclxuICAgICAgICAgICAgdGhpcy50b3RhbFRpbWUgPSBNYXRoLm1heChzZXF1ZW5jZVRpbWUsIHRoaXMudG90YWxUaW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclRpbWUoPEFuaW1hdGlvblN0cnVjdHVyZT5fc3RydWN0dXJlW25dKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgdGhlIGV4aXN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIHtAbGluayBBbmltYXRpb25TdHJjdXR1cmV9IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIF90eXBlIHRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3R1cmUgdG8gZ2V0XHJcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVxdWVzdGVkIFtbQGxpbmsgQW5pbWF0aW9uU3RydWN0dXJlXV1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRBbmltYXRpb25TdHJ1Y3R1cmUoX3R5cGU6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRSk6IEFuaW1hdGlvblN0cnVjdHVyZSB7XHJcbiAgICAgIGlmICghdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZC5oYXMoX3R5cGUpKSB7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbFRpbWUoKTtcclxuICAgICAgICBsZXQgYWU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICAgIHN3aXRjaCAoX3R5cGUpIHtcclxuICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLk5PUk1BTDpcclxuICAgICAgICAgICAgYWUgPSB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SRVZFUlNFOlxyXG4gICAgICAgICAgICBhZSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JOZXdTdHJ1Y3R1cmUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUsIHRoaXMuY2FsY3VsYXRlUmV2ZXJzZVNlcXVlbmNlLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJBU1RFUkVEOlxyXG4gICAgICAgICAgICBhZSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JOZXdTdHJ1Y3R1cmUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUsIHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRTZXF1ZW5jZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0U6XHJcbiAgICAgICAgICAgIGFlID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvck5ld1N0cnVjdHVyZSh0aGlzLmdldFByb2Nlc3NlZEFuaW1hdGlvblN0cnVjdHVyZShBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRSksIHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRTZXF1ZW5jZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuI2FuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQuc2V0KF90eXBlLCBhZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2FuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQuZ2V0KF90eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgdGhlIGV4aXN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIHtAbGluayBBbmltYXRpb25FdmVudFRyaWdnZXJ9IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIF90eXBlIFRoZSB0eXBlIG9mIEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB0byBnZXRcclxuICAgICAqIEByZXR1cm5zIHRoZSByZXF1ZXN0ZWQge0BsaW5rIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcn1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoX3R5cGU6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRSk6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGlmICghdGhpcy5ldmVudHNQcm9jZXNzZWQuaGFzKF90eXBlKSkge1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICAgICAgbGV0IGV2OiBBbmltYXRpb25FdmVudFRyaWdnZXIgPSB7fTtcclxuICAgICAgICBzd2l0Y2ggKF90eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUw6XHJcbiAgICAgICAgICAgIGV2ID0gdGhpcy5ldmVudHM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRTpcclxuICAgICAgICAgICAgZXYgPSB0aGlzLmNhbGN1bGF0ZVJldmVyc2VFdmVudFRyaWdnZXJzKHRoaXMuZXZlbnRzKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRDpcclxuICAgICAgICAgICAgZXYgPSB0aGlzLmNhbGN1bGF0ZVJhc3RlcmVkRXZlbnRUcmlnZ2Vycyh0aGlzLmV2ZW50cyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkFTVEVSRURSRVZFUlNFOlxyXG4gICAgICAgICAgICBldiA9IHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRFdmVudFRyaWdnZXJzKHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SRVZFUlNFKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50c1Byb2Nlc3NlZC5zZXQoX3R5cGUsIGV2KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5ldmVudHNQcm9jZXNzZWQuZ2V0KF90eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYXZlcnNlcyBhbiBleGlzdGluZyBzdHJ1Y3R1cmUgdG8gYXBwbHkgYSByZWNhbGN1bGF0aW9uIGZ1bmN0aW9uIHRvIHRoZSBBbmltYXRpb25TdHJ1Y3R1cmUgdG8gc3RvcmUgaW4gYSBuZXcgU3RydWN0dXJlLlxyXG4gICAgICogQHBhcmFtIF9vbGRTdHJ1Y3R1cmUgVGhlIG9sZCBzdHJ1Y3R1cmUgdG8gdHJhdmVyc2VcclxuICAgICAqIEBwYXJhbSBfZnVuY3Rpb25Ub1VzZSBUaGUgZnVuY3Rpb24gdG8gdXNlIHRvIHJlY2FsY3VsYXRlZCB0aGUgc3RydWN0dXJlLlxyXG4gICAgICogQHJldHVybnMgQSBuZXcgQW5pbWF0aW9uIFN0cnVjdHVyZSB3aXRoIHRoZSByZWNhbHVsYXRlZCBBbmltYXRpb24gU2VxdWVuY2VzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYXZlcnNlU3RydWN0dXJlRm9yTmV3U3RydWN0dXJlKF9vbGRTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSwgX2Z1bmN0aW9uVG9Vc2U6IEZ1bmN0aW9uKTogQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgICAgbGV0IG5ld1N0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge307XHJcbiAgICAgIGZvciAobGV0IG4gaW4gX29sZFN0cnVjdHVyZSkge1xyXG4gICAgICAgIGlmIChfb2xkU3RydWN0dXJlW25dIGluc3RhbmNlb2YgQW5pbWF0aW9uU2VxdWVuY2UpIHtcclxuICAgICAgICAgIG5ld1N0cnVjdHVyZVtuXSA9IF9mdW5jdGlvblRvVXNlKF9vbGRTdHJ1Y3R1cmVbbl0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXdTdHJ1Y3R1cmVbbl0gPSB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yTmV3U3RydWN0dXJlKDxBbmltYXRpb25TdHJ1Y3R1cmU+X29sZFN0cnVjdHVyZVtuXSwgX2Z1bmN0aW9uVG9Vc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3U3RydWN0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHJldmVyc2VkIEFuaW1hdGlvbiBTZXF1ZW5jZSBvdXQgb2YgYSBnaXZlbiBTZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfc2VxdWVuY2UgVGhlIHNlcXVlbmNlIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IHNlcXVlbmNlIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgVGhlIHJldmVyc2VkIFNlcXVlbmNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUmV2ZXJzZVNlcXVlbmNlKF9zZXF1ZW5jZTogQW5pbWF0aW9uU2VxdWVuY2UpOiBBbmltYXRpb25TZXF1ZW5jZSB7XHJcbiAgICAgIGxldCBzZXE6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfc2VxdWVuY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgb2xkS2V5OiBBbmltYXRpb25LZXkgPSBfc2VxdWVuY2UuZ2V0S2V5KGkpO1xyXG4gICAgICAgIGxldCBrZXk6IEFuaW1hdGlvbktleSA9IG5ldyBBbmltYXRpb25LZXkodGhpcy50b3RhbFRpbWUgLSBvbGRLZXkudGltZSwgb2xkS2V5LnZhbHVlLCBvbGRLZXkuaW50ZXJwb2xhdGlvbiwgb2xkS2V5LnNsb3BlT3V0LCBvbGRLZXkuc2xvcGVJbik7XHJcbiAgICAgICAgc2VxLmFkZEtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgcmFzdGVyZWQge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfSBvdXQgb2YgYSBnaXZlbiBzZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfc2VxdWVuY2UgVGhlIHNlcXVlbmNlIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IHNlcXVlbmNlIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgdGhlIHJhc3RlcmVkIHNlcXVlbmNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJhc3RlcmVkU2VxdWVuY2UoX3NlcXVlbmNlOiBBbmltYXRpb25TZXF1ZW5jZSk6IEFuaW1hdGlvblNlcXVlbmNlIHtcclxuICAgICAgbGV0IHNlcTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgbGV0IGZyYW1lVGltZTogbnVtYmVyID0gMTAwMCAvIHRoaXMuZnJhbWVzUGVyU2Vjb25kO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy50b3RhbFRpbWU7IGkgKz0gZnJhbWVUaW1lKSB7XHJcbiAgICAgICAgbGV0IGtleTogQW5pbWF0aW9uS2V5ID0gbmV3IEFuaW1hdGlvbktleShpLCBfc2VxdWVuY2UuZXZhbHVhdGUoaSksIEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkNPTlNUQU5ULCAwLCAwKTtcclxuICAgICAgICBzZXEuYWRkS2V5KGtleSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHNlcTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmV2ZXJzZWQge0BsaW5rIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcn0gb2JqZWN0IGJhc2VkIG9uIHRoZSBnaXZlbiBvbmUuICBcclxuICAgICAqIEBwYXJhbSBfZXZlbnRzIHRoZSBldmVudCBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSBuZXcgb25lIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgdGhlIHJldmVyc2VkIGV2ZW50IG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJldmVyc2VFdmVudFRyaWdnZXJzKF9ldmVudHM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlcik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGxldCBhZTogQW5pbWF0aW9uRXZlbnRUcmlnZ2VyID0ge307XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gX2V2ZW50cykge1xyXG4gICAgICAgIGFlW25hbWVdID0gdGhpcy50b3RhbFRpbWUgLSBfZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSByYXN0ZXJlZCB7QGxpbmsgQW5pbWF0aW9uRXZlbnRUcmlnZ2VyfSBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIG9uZS4gIFxyXG4gICAgICogQHBhcmFtIF9ldmVudHMgdGhlIGV2ZW50IG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIG5ldyBvbmUgb3V0IG9mXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgcmFzdGVyZWQgZXZlbnQgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUmFzdGVyZWRFdmVudFRyaWdnZXJzKF9ldmVudHM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlcik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGxldCBhZTogQW5pbWF0aW9uRXZlbnRUcmlnZ2VyID0ge307XHJcbiAgICAgIGxldCBmcmFtZVRpbWU6IG51bWJlciA9IDEwMDAgLyB0aGlzLmZyYW1lc1BlclNlY29uZDtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBfZXZlbnRzKSB7XHJcbiAgICAgICAgYWVbbmFtZV0gPSBfZXZlbnRzW25hbWVdIC0gKF9ldmVudHNbbmFtZV0gJSBmcmFtZVRpbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB3aGljaCBldmVudHMgbGF5IGJldHdlZW4gdHdvIGdpdmVuIHRpbWVzIGFuZCByZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgb25lcyB0aGF0IGRvLlxyXG4gICAgICogQHBhcmFtIF9ldmVudFRyaWdnZXJzIFRoZSBldmVudCBvYmplY3QgdG8gY2hlY2sgdGhlIGV2ZW50cyBpbnNpZGUgb2ZcclxuICAgICAqIEBwYXJhbSBfbWluIHRoZSBtaW5pbXVtIG9mIHRoZSByYW5nZSB0byBjaGVjayBiZXR3ZWVuIChpbmNsdXNpdmUpXHJcbiAgICAgKiBAcGFyYW0gX21heCB0aGUgbWF4aW11bSBvZiB0aGUgcmFuZ2UgdG8gY2hlY2sgYmV0d2VlbiAoZXhjbHVzaXZlKVxyXG4gICAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIG5hbWVzIG9mIHRoZSBldmVudHMgaW4gdGhlIGdpdmVuIHJhbmdlLiBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja0V2ZW50c0JldHdlZW4oX2V2ZW50VHJpZ2dlcnM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciwgX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIpOiBzdHJpbmdbXSB7XHJcbiAgICAgIGxldCBldmVudHNUb1RyaWdnZXI6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gX2V2ZW50VHJpZ2dlcnMpIHtcclxuICAgICAgICBpZiAoX21pbiA8PSBfZXZlbnRUcmlnZ2Vyc1tuYW1lXSAmJiBfZXZlbnRUcmlnZ2Vyc1tuYW1lXSA8IF9tYXgpIHtcclxuICAgICAgICAgIGV2ZW50c1RvVHJpZ2dlci5wdXNoKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZXZlbnRzVG9UcmlnZ2VyO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyBiZXR3ZWVuIHtAbGluayBBbmltYXRpb25LZXl9cy5cclxuICAgKiBSZXByZXNlbnRlZCBpbnRlcm5hbGx5IGJ5IGEgY3ViaWMgZnVuY3Rpb24gKGBmKHgpID0gYXjCsyArIGJ4wrIgKyBjeCArIGRgKS4gXHJcbiAgICogT25seSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgd2hlbiB0aGUga2V5cyBjaGFuZ2UsIHNvIGF0IHJ1bnRpbWUgaXQgc2hvdWxkIG9ubHkgYmUgY2FsY3VsYXRlZCBvbmNlLlxyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQW5pbWF0aW9uRnVuY3Rpb24ge1xyXG4gICAgcHJpdmF0ZSBhOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBiOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBjOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBkOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBrZXlJbjogQW5pbWF0aW9uS2V5O1xyXG4gICAgcHJpdmF0ZSBrZXlPdXQ6IEFuaW1hdGlvbktleTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2tleUluOiBBbmltYXRpb25LZXksIF9rZXlPdXQ6IEFuaW1hdGlvbktleSA9IG51bGwpIHtcclxuICAgICAgdGhpcy5rZXlJbiA9IF9rZXlJbjtcclxuICAgICAgdGhpcy5rZXlPdXQgPSBfa2V5T3V0O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2V0S2V5SW4oX2tleUluOiBBbmltYXRpb25LZXkpIHtcclxuICAgICAgdGhpcy5rZXlJbiA9IF9rZXlJbjtcclxuICAgICAgdGhpcy5jYWxjdWxhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNldEtleU91dChfa2V5T3V0OiBBbmltYXRpb25LZXkpIHtcclxuICAgICAgdGhpcy5rZXlPdXQgPSBfa2V5T3V0O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHZhbHVlcyBvZiB0aGlzIGN1YmljIGZ1bmN0aW9uLiBgZih4KSA9IGF4wrMgKyBieMKyICsgY3ggKyBkYFxyXG4gICAgICogVXNlZCBieSBlZGl0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IHsgYTogbnVtYmVyOyBiOiBudW1iZXI7IGM6IG51bWJlcjsgZDogbnVtYmVyIH0ge1xyXG4gICAgICByZXR1cm4geyBhOiB0aGlzLmEsIGI6IHRoaXMuYiwgYzogdGhpcy5jLCBkOiB0aGlzLmQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBhdCB0aGUgZ2l2ZW4gdGltZS5cclxuICAgICAqIEBwYXJhbSBfdGltZSB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0byBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gaW4gbWlsbGlzZWNvbmRzLiBXaWxsIGJlIGNvcnJlY3RlZCBmb3Igb2Zmc2V0IGludGVybmFsbHkuXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIHRpbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGV2YWx1YXRlKF90aW1lOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICBfdGltZSAtPSB0aGlzLmtleUluLnRpbWU7XHJcbiAgICAgIGxldCB0aW1lMjogbnVtYmVyID0gX3RpbWUgKiBfdGltZTtcclxuICAgICAgbGV0IHRpbWUzOiBudW1iZXIgPSB0aW1lMiAqIF90aW1lO1xyXG4gICAgICByZXR1cm4gdGhpcy5hICogdGltZTMgKyB0aGlzLmIgKiB0aW1lMiArIHRoaXMuYyAqIF90aW1lICsgdGhpcy5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogKFJlLSlDYWxjdWxhdGVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjdWJpYyBmdW5jdGlvbi5cclxuICAgICAqIFNlZSBodHRwczovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzMxNzM0NjkvY2FsY3VsYXRlLWN1YmljLWVxdWF0aW9uLWZyb20tdHdvLXBvaW50cy1hbmQtdHdvLXNsb3Blcy12YXJpYWJseVxyXG4gICAgICogYW5kIGh0dHBzOi8vamlya2FkZWxsb3JvLmdpdGh1Yi5pby9GVURHRS9Eb2N1bWVudGF0aW9uL0xvZ3MvMTkwNDEwX05vdGl6ZW5fTFNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNhbGN1bGF0ZSgpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLmtleUluKSB7XHJcbiAgICAgICAgdGhpcy5kID0gdGhpcy5jID0gdGhpcy5iID0gdGhpcy5hID0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmtleU91dCB8fCB0aGlzLmtleUluLmludGVycG9sYXRpb24gPT0gQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04uQ09OU1RBTlQpIHtcclxuICAgICAgICB0aGlzLmQgPSB0aGlzLmtleUluLnZhbHVlO1xyXG4gICAgICAgIHRoaXMuYyA9IHRoaXMuYiA9IHRoaXMuYSA9IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgeDE6IG51bWJlciA9IHRoaXMua2V5T3V0LnRpbWUgLSB0aGlzLmtleUluLnRpbWU7XHJcblxyXG4gICAgICB0aGlzLmQgPSB0aGlzLmtleUluLnZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5rZXlJbi5pbnRlcnBvbGF0aW9uID09IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkxJTkVBUikge1xyXG4gICAgICAgIHRoaXMuYyA9ICh0aGlzLmtleU91dC52YWx1ZSAtIHRoaXMua2V5SW4udmFsdWUpIC8geDE7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmMgPSB0aGlzLmtleUluLnNsb3BlT3V0O1xyXG4gICAgICB0aGlzLmEgPSAoLXgxICogKHRoaXMua2V5SW4uc2xvcGVPdXQgKyB0aGlzLmtleU91dC5zbG9wZUluKSAtIDIgKiB0aGlzLmtleUluLnZhbHVlICsgMiAqIHRoaXMua2V5T3V0LnZhbHVlKSAvIC1NYXRoLnBvdyh4MSwgMyk7XHJcbiAgICAgIHRoaXMuYiA9ICh0aGlzLmtleU91dC5zbG9wZUluIC0gdGhpcy5rZXlJbi5zbG9wZU91dCAtIDMgKiB0aGlzLmEgKiBNYXRoLnBvdyh4MSwgMikpIC8gKDIgKiB4MSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQW4ge0BsaW5rIEFuaW1hdGlvbn0gbG9hZGVkIGZyb20gYSBnbFRGLUZpbGUuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBBbmltYXRpb25HTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKEFuaW1hdGlvbikge1xyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8gPSB0aGlzLnVybCwgX25hbWU6IHN0cmluZyA9IHRoaXMubmFtZSk6IFByb21pc2U8QW5pbWF0aW9uR0xURj4ge1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICByZXR1cm4gR0xURkxvYWRlci5sb2FkUmVzb3VyY2UodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmZyYW1lc1BlclNlY29uZCA9IHRoaXMuZnBzO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBcclxuICBleHBvcnQgZW51bSBBTklNQVRJT05fSU5URVJQT0xBVElPTiB7XHJcbiAgICBDT05TVEFOVCxcclxuICAgIExJTkVBUixcclxuICAgIENVQklDXHJcbiAgfVxyXG4gIC8vIHR5cGUgQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiA9IFwiY29uc3RhbnRcIiB8IFwibGluZWFyXCIgfCBcImN1YmljXCI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGNvbnRpbm91cyBwb2ludHMgaW4gdGltZSB0aGVpciBhY2NvbXBhbnlpbmcgdmFsdWVzIGFzIHdlbGwgYXMgdGhlaXIgc2xvcGVzLiBcclxuICAgKiBBbHNvIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgQW5pbWF0aW9uRnVuY3Rpb259cyB0aGF0IGNvbWUgaW4gYW5kIG91dCBvZiB0aGUgc2lkZXMuIFxyXG4gICAqIFRoZSB7QGxpbmsgQW5pbWF0aW9uRnVuY3Rpb259cyBhcmUgaGFuZGxlZCBieSB0aGUge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXMuXHJcbiAgICogSWYgdGhlIHByb3BlcnR5IGNvbnN0YW50IGlzIHRydWUsIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgYW5kIHdpbCBub3QgYmUgaW50ZXJwb2xhdGVkIGJldHdlZW4gdGhpcyBhbmQgdGhlIG5leHQga2V5IGluIGEgc2VxdWVuY2VcclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEFuaW1hdGlvbktleSBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgLy8gVE9ETzogY2hlY2sgaWYgZnVuY3Rpb25JbiBjYW4gYmUgcmVtb3ZlZFxyXG4gICAgLyoqRG9uJ3QgbW9kaWZ5IHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiovXHJcbiAgICBwdWJsaWMgZnVuY3Rpb25JbjogQW5pbWF0aW9uRnVuY3Rpb247XHJcbiAgICAvKipEb24ndCBtb2RpZnkgdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuKi9cclxuICAgIHB1YmxpYyBmdW5jdGlvbk91dDogQW5pbWF0aW9uRnVuY3Rpb247XHJcblxyXG4gICAgI3RpbWU6IG51bWJlcjtcclxuICAgICN2YWx1ZTogbnVtYmVyO1xyXG4gICAgI2ludGVycG9sYXRpb246IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OO1xyXG5cclxuICAgICNzbG9wZUluOiBudW1iZXIgPSAwO1xyXG4gICAgI3Nsb3BlT3V0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGltZTogbnVtYmVyID0gMCwgX3ZhbHVlOiBudW1iZXIgPSAwLCBfaW50ZXJwb2xhdGlvbjogQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04gPSBBTklNQVRJT05fSU5URVJQT0xBVElPTi5DVUJJQywgX3Nsb3BlSW46IG51bWJlciA9IDAsIF9zbG9wZU91dDogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLiN0aW1lID0gX3RpbWU7XHJcbiAgICAgIHRoaXMuI3ZhbHVlID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLiNpbnRlcnBvbGF0aW9uID0gX2ludGVycG9sYXRpb247XHJcbiAgICAgIHRoaXMuI3Nsb3BlSW4gPSBfc2xvcGVJbjtcclxuICAgICAgdGhpcy4jc2xvcGVPdXQgPSBfc2xvcGVPdXQ7XHJcblxyXG4gICAgICB0aGlzLmZ1bmN0aW9uT3V0ID0gbmV3IEFuaW1hdGlvbkZ1bmN0aW9uKHRoaXMsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhdGljIGNvbXBhcmF0aW9uIGZ1bmN0aW9uIHRvIHVzZSBpbiBhbiBhcnJheSBzb3J0IGZ1bmN0aW9uIHRvIHNvcnQgdGhlIGtleXMgYnkgdGhlaXIgdGltZS5cclxuICAgICAqIEBwYXJhbSBfYSB0aGUgYW5pbWF0aW9uIGtleSB0byBjaGVja1xyXG4gICAgICogQHBhcmFtIF9iIHRoZSBhbmltYXRpb24ga2V5IHRvIGNoZWNrIGFnYWluc3RcclxuICAgICAqIEByZXR1cm5zID4wIGlmIGE+YiwgMCBpZiBhPWIsIDwwIGlmIGE8YlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmUoX2E6IEFuaW1hdGlvbktleSwgX2I6IEFuaW1hdGlvbktleSk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBfYS50aW1lIC0gX2IudGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0aW1lKF90aW1lOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jdGltZSA9IF90aW1lO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICAgIHRoaXMuZnVuY3Rpb25PdXQuY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB2YWx1ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN2YWx1ZSA9IF92YWx1ZTtcclxuICAgICAgdGhpcy5mdW5jdGlvbkluLmNhbGN1bGF0ZSgpO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uT3V0LmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaW50ZXJwb2xhdGlvbigpOiBBTklNQVRJT05fSU5URVJQT0xBVElPTiB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNpbnRlcnBvbGF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgaW50ZXJwb2xhdGlvbihfaW50ZXJwb2xhdGlvbjogQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04pIHtcclxuICAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IF9pbnRlcnBvbGF0aW9uO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICAgIHRoaXMuZnVuY3Rpb25PdXQuY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzbG9wZUluKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzbG9wZUluO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2xvcGVJbihfc2xvcGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzbG9wZUluID0gX3Nsb3BlO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzbG9wZU91dCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2xvcGVPdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzbG9wZU91dChfc2xvcGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzbG9wZU91dCA9IF9zbG9wZTtcclxuICAgICAgdGhpcy5mdW5jdGlvbk91dC5jYWxjdWxhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge307XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udGltZSA9IHRoaXMuI3RpbWU7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udmFsdWUgPSB0aGlzLiN2YWx1ZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pbnRlcnBvbGF0aW9uID0gdGhpcy4jaW50ZXJwb2xhdGlvbjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zbG9wZUluID0gdGhpcy4jc2xvcGVJbjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zbG9wZU91dCA9IHRoaXMuI3Nsb3BlT3V0O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLiN0aW1lID0gX3NlcmlhbGl6YXRpb24udGltZTtcclxuICAgICAgdGhpcy4jdmFsdWUgPSBfc2VyaWFsaXphdGlvbi52YWx1ZTtcclxuICAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IF9zZXJpYWxpemF0aW9uLmludGVycG9sYXRpb247XHJcbiAgICAgIHRoaXMuI3Nsb3BlSW4gPSBfc2VyaWFsaXphdGlvbi5zbG9wZUluO1xyXG4gICAgICB0aGlzLiNzbG9wZU91dCA9IF9zZXJpYWxpemF0aW9uLnNsb3BlT3V0O1xyXG4gICAgICAvLyBpZiAoX3NlcmlhbGl6YXRpb24uaW50ZXJwb2xhdGlvbiA9PSB1bmRlZmluZWQpXHJcbiAgICAgIC8vICAgaWYgKF9zZXJpYWxpemF0aW9uLmNvbnN0YW50KSAvLyBUT0RPOiByZW1vdmUgdGhpcyB3aGVuIGNvbnN0YW50IGlzIHJlbW92ZWRcclxuICAgICAgLy8gICAgIHRoaXMuI2ludGVycG9sYXRpb24gPSBcImNvbnN0YW50XCI7XHJcbiAgICAgIC8vICAgZWxzZVxyXG4gICAgICAvLyAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IFwiY3ViaWNcIjtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICAvL1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBzZXF1ZW5jZSBvZiB7QGxpbmsgQW5pbWF0aW9uS2V5fXMgdGhhdCBpcyBtYXBwZWQgdG8gYW4gYXR0cmlidXRlIG9mIGEge0BsaW5rIE5vZGV9IG9yIGl0cyB7QGxpbmsgQ29tcG9uZW50fXMgaW5zaWRlIHRoZSB7QGxpbmsgQW5pbWF0aW9ufS5cclxuICAgKiBQcm92aWRlcyBmdW5jdGlvbnMgdG8gbW9kaWZ5IHNhaWQga2V5c1xyXG4gICAqIEBhdXRob3JzIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5IHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcXVlbmNlIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7XHJcbiAgICBwcml2YXRlIGtleXM6IEFuaW1hdGlvbktleVtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihfa2V5czogQW5pbWF0aW9uS2V5W10gPSBbXSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmtleXMgPSBfa2V5cztcclxuICAgICAgdGhpcy5yZWdlbmVyYXRlRnVuY3Rpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMua2V5cy5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmFsdWF0ZXMgdGhlIHNlcXVlbmNlIGF0IHRoZSBnaXZlbiBwb2ludCBpbiB0aW1lLlxyXG4gICAgICogQHBhcmFtIF90aW1lIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBzZXF1ZW5jZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNlcXVlbmNlIGF0IHRoZSBnaXZlbiB0aW1lLiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGtleXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBldmFsdWF0ZShfdGltZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMua2V5cy5sZW5ndGggPT0gMClcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvL1RPRE86IHNob3VsZG4ndCByZXR1cm4gMCBidXQgc29tZXRoaW5nIGluZGljYXRpbmcgbm8gY2hhbmdlLCBsaWtlIG51bGwuIHByb2JhYmx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgaW4gTm9kZSBhcyB3ZWxsIHRvIGlnbm9yZSBub24tbnVtZXJpYyB2YWx1ZXMgaW4gdGhlIGFwcGx5QW5pbWF0aW9uIGZ1bmN0aW9uXHJcbiAgICAgIGlmICh0aGlzLmtleXMubGVuZ3RoID09IDEgfHwgdGhpcy5rZXlzWzBdLnRpbWUgPj0gX3RpbWUpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5c1swXS52YWx1ZTtcclxuXHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmtleXNbaV0udGltZSA8PSBfdGltZSAmJiBfdGltZSA8IHRoaXMua2V5c1tpICsgMV0udGltZSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMua2V5c1tpXS5mdW5jdGlvbk91dC5ldmFsdWF0ZShfdGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmICh0aGlzLmtleXNbaV0udGltZSA9PSBfdGltZSlcclxuICAgICAgICAvLyAgIHJldHVybiB0aGlzLmtleXNbaV0udmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMua2V5c1t0aGlzLmtleXMubGVuZ3RoIC0gMV0udmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGtleSB0byB0aGUgc2VxdWVuY2UuXHJcbiAgICAgKiBAcGFyYW0gX2tleSB0aGUga2V5IHRvIGFkZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkS2V5KF9rZXk6IEFuaW1hdGlvbktleSk6IHZvaWQge1xyXG4gICAgICB0aGlzLmtleXMucHVzaChfa2V5KTtcclxuICAgICAgdGhpcy5rZXlzLnNvcnQoQW5pbWF0aW9uS2V5LmNvbXBhcmUpO1xyXG4gICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vZGlmeXMgYSBnaXZlbiBrZXkgaW4gdGhlIHNlcXVlbmNlLlxyXG4gICAgICogQHBhcmFtIF9rZXkgdGhlIGtleSB0byBhZGRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vZGlmeUtleShfa2V5OiBBbmltYXRpb25LZXksIF90aW1lPzogbnVtYmVyLCBfdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgaWYgKF90aW1lICE9IG51bGwpXHJcbiAgICAgICAgX2tleS50aW1lID0gX3RpbWU7XHJcbiAgICAgIGlmIChfdmFsdWUgIT0gbnVsbClcclxuICAgICAgICBfa2V5LnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLmtleXMuc29ydChBbmltYXRpb25LZXkuY29tcGFyZSk7XHJcbiAgICAgIHRoaXMucmVnZW5lcmF0ZUZ1bmN0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGdpdmVuIGtleSBmcm9tIHRoZSBzZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfa2V5IHRoZSBrZXkgdG8gcmVtb3ZlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVLZXkoX2tleTogQW5pbWF0aW9uS2V5KTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5rZXlzW2ldID09IF9rZXkpIHtcclxuICAgICAgICAgIHRoaXMua2V5cy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgYSBrZXkgaW4gdGhlIHNlcXVlbmNlIGV4YWN0bHkgbWF0Y2hpbmcgdGhlIGdpdmVuIHRpbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5kS2V5KF90aW1lOiBudW1iZXIpOiBBbmltYXRpb25LZXkge1xyXG4gICAgICBmb3IgKGxldCBrZXkgb2YgdGhpcy5rZXlzKVxyXG4gICAgICAgIGlmIChrZXkudGltZSA9PSBfdGltZSlcclxuICAgICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgQW5pbWF0aW9uIEtleSBhdCB0aGUgZ2l2ZW4gaW5kZXggZnJvbSB0aGUga2V5cy5cclxuICAgICAqIEBwYXJhbSBfaW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggYXQgd2hpY2ggdG8gcmVtb3ZlIHRoZSBrZXlcclxuICAgICAqIEByZXR1cm5zIHRoZSByZW1vdmVkIEFuaW1hdGlvbktleSBpZiBzdWNjZXNzZnVsLCBudWxsIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUtleUF0SW5kZXgoX2luZGV4OiBudW1iZXIpOiBBbmltYXRpb25LZXkge1xyXG4gICAgICBpZiAoX2luZGV4IDwgMCB8fCBfaW5kZXggPj0gdGhpcy5rZXlzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhazogQW5pbWF0aW9uS2V5ID0gdGhpcy5rZXlzW19pbmRleF07XHJcbiAgICAgIHRoaXMua2V5cy5zcGxpY2UoX2luZGV4LCAxKTtcclxuICAgICAgdGhpcy5yZWdlbmVyYXRlRnVuY3Rpb25zKCk7XHJcbiAgICAgIHJldHVybiBhaztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSBrZXkgZnJvbSB0aGUgc2VxdWVuY2UgYXQgdGhlIGRlc2lyZWQgaW5kZXguXHJcbiAgICAgKiBAcGFyYW0gX2luZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IGF0IHdoaWNoIHRvIGdldCB0aGUga2V5XHJcbiAgICAgKiBAcmV0dXJucyB0aGUgQW5pbWF0aW9uS2V5IGF0IHRoZSBpbmRleCBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0S2V5KF9pbmRleDogbnVtYmVyKTogQW5pbWF0aW9uS2V5IHtcclxuICAgICAgaWYgKF9pbmRleCA8IDAgfHwgX2luZGV4ID49IHRoaXMua2V5cy5sZW5ndGgpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIHJldHVybiB0aGlzLmtleXNbX2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhpcyBzZXF1ZW5jZSdzIGtleXMuIFRoaXMgaXMgbm90IGEgY29weSwgYnV0IHRoZSBhY3R1YWwgYXJyYXkgdXNlZCBpbnRlcm5hbGx5LiBIYW5kbGUgd2l0aCBjYXJlIVxyXG4gICAgICogVXNlZCBieSBFZGl0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXlzKCk6IEFuaW1hdGlvbktleVtdIHtcclxuICAgICAgcmV0dXJuIHRoaXMua2V5cztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGtleXM6IFtdLFxyXG4gICAgICAgIGFuaW1hdGlvblNlcXVlbmNlOiB0cnVlXHJcbiAgICAgIH07XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzLmtleXNbaV0gPSB0aGlzLmtleXNbaV0uc2VyaWFsaXplKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IF9zZXJpYWxpemF0aW9uLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyB0aGlzLmtleXMucHVzaCg8QW5pbWF0aW9uS2V5PlNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ua2V5c1tpXSkpO1xyXG4gICAgICAgIGxldCBrOiBBbmltYXRpb25LZXkgPSBuZXcgQW5pbWF0aW9uS2V5KCk7XHJcbiAgICAgICAgYXdhaXQgay5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5rZXlzW2ldKTtcclxuICAgICAgICB0aGlzLmtleXNbaV0gPSBrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgeyAvKiAqLyB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdGhhdCAocmUtKWdlbmVyYXRlcyBhbGwgZnVuY3Rpb25zIGluIHRoZSBzZXF1ZW5jZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWdlbmVyYXRlRnVuY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGY6IEFuaW1hdGlvbkZ1bmN0aW9uID0gbmV3IEFuaW1hdGlvbkZ1bmN0aW9uKHRoaXMua2V5c1tpXSk7XHJcbiAgICAgICAgdGhpcy5rZXlzW2ldLmZ1bmN0aW9uT3V0ID0gZjtcclxuICAgICAgICBpZiAoaSA9PSB0aGlzLmtleXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgLy9UT0RPOiBjaGVjayBpZiB0aGlzIGlzIGV2ZW4gdXNlZnVsLiBNYXliZSB1cGRhdGUgdGhlIHJ1bmNvbmRpdGlvbiB0byBsZW5ndGggLSAxIGluc3RlYWQuIE1pZ2h0IGJlIHJlZHVuZGFudCBpZiBmdW5jdGlvbkluIGlzIHJlbW92ZWQsIHNlZSBUT0RPIGluIEFuaW1hdGlvbktleS5cclxuICAgICAgICAgIGYuc2V0S2V5T3V0ID0gdGhpcy5rZXlzWzBdO1xyXG4gICAgICAgICAgdGhpcy5rZXlzWzBdLmZ1bmN0aW9uSW4gPSBmO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGYuc2V0S2V5T3V0ID0gdGhpcy5rZXlzW2kgKyAxXTtcclxuICAgICAgICB0aGlzLmtleXNbaSArIDFdLmZ1bmN0aW9uSW4gPSBmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNwcml0ZSBleHRlbmRzIEFuaW1hdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQW5pbWF0aW9uLnJlZ2lzdGVyU3ViY2xhc3MoQW5pbWF0aW9uU3ByaXRlKTtcclxuICAgIHB1YmxpYyB0ZXh0dXJlOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQuY29sb3I7XHJcbiAgICBwcml2YXRlIGlkVGV4dHVyZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBmcmFtZXM6IG51bWJlciA9IDI1O1xyXG4gICAgcHJpdmF0ZSB3cmFwQWZ0ZXI6IG51bWJlciA9IDU7XHJcbiAgICBwcml2YXRlIHN0YXJ0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMCwgMCk7XHJcbiAgICBwcml2YXRlIHNpemU6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMig4MCwgODApO1xyXG4gICAgcHJpdmF0ZSBuZXh0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoODAsIDApO1xyXG4gICAgcHJpdmF0ZSB3cmFwOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMCwgODApO1xyXG5cclxuICAgIC8vIFRPRE86IGZwcyBzaG91bGQgYmUgYSBwYXJhbWV0ZXIgdG9vXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiQW5pbWF0aW9uU3ByaXRlXCIpIHsgLy99LCBfZnBzOiBudW1iZXIgPSAxNSkge1xyXG4gICAgICBzdXBlcihfbmFtZSwge30sIDEpO1xyXG4gICAgICB0aGlzLmZyYW1lc1BlclNlY29uZCA9IHRoaXMuZnJhbWVzO1xyXG4gICAgICB0aGlzLmNyZWF0ZSh0aGlzLnRleHR1cmUsIHRoaXMuZnJhbWVzLCB0aGlzLndyYXBBZnRlciwgdGhpcy5zdGFydCwgdGhpcy5zaXplLCB0aGlzLm5leHQsIHRoaXMud3JhcCwgdGhpcy5mcmFtZXNQZXJTZWNvbmQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGV4dHVyZSB0byBiZSB1c2VkIGFzIHRoZSBzcHJpdGVzaGVldFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0VGV4dHVyZShfdGV4dHVyZTogVGV4dHVyZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnRleHR1cmUgPSBfdGV4dHVyZTtcclxuICAgICAgdGhpcy5pZFRleHR1cmUgPSBfdGV4dHVyZS5pZFJlc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGlzIGFuaW1hdGlvbiBzcHJpdGUgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGUoX3RleHR1cmU6IFRleHR1cmUsIF9mcmFtZXM6IG51bWJlciwgX3dyYXBBZnRlcjogbnVtYmVyLCBfc3RhcnQ6IFZlY3RvcjIsIF9zaXplOiBWZWN0b3IyLCBfbmV4dDogVmVjdG9yMiwgX3dyYXA6IFZlY3RvcjIsIF9mcmFtZXNQZXJTZWNvbmQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldFRleHR1cmUoX3RleHR1cmUpO1xyXG4gICAgICB0aGlzLmZyYW1lcyA9IF9mcmFtZXM7XHJcbiAgICAgIHRoaXMud3JhcEFmdGVyID0gX3dyYXBBZnRlcjtcclxuICAgICAgdGhpcy5zdGFydCA9IF9zdGFydDtcclxuICAgICAgdGhpcy5zaXplID0gX3NpemU7XHJcbiAgICAgIHRoaXMubmV4dCA9IF9uZXh0O1xyXG4gICAgICB0aGlzLndyYXAgPSBfd3JhcDtcclxuICAgICAgdGhpcy5mcmFtZXNQZXJTZWNvbmQgPSBfZnJhbWVzUGVyU2Vjb25kO1xyXG5cclxuICAgICAgbGV0IHNjYWxlOiBWZWN0b3IyID0gdGhpcy5nZXRTY2FsZSgpO1xyXG4gICAgICBsZXQgcG9zaXRpb25zOiBWZWN0b3IyW10gPSB0aGlzLmdldFBvc2l0aW9ucygpO1xyXG5cclxuICAgICAgbGV0IHhUcmFuc2xhdGlvbjogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgbGV0IHlUcmFuc2xhdGlvbjogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgbGV0IHhTY2FsZTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgbGV0IHlTY2FsZTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgeFNjYWxlLmFkZEtleShuZXcgQW5pbWF0aW9uS2V5KDAsIHNjYWxlLngpKTtcclxuICAgICAgeVNjYWxlLmFkZEtleShuZXcgQW5pbWF0aW9uS2V5KDAsIHNjYWxlLnkpKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGZyYW1lOiBudW1iZXIgPSAwOyBmcmFtZSA8PSB0aGlzLmZyYW1lczsgZnJhbWUrKykge1xyXG4gICAgICAgIGxldCB0aW1lOiBudW1iZXIgPSAxMDAwICogZnJhbWUgLyB0aGlzLmZyYW1lc1BlclNlY29uZDtcclxuICAgICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjIgPSBwb3NpdGlvbnNbTWF0aC5taW4oZnJhbWUsIHRoaXMuZnJhbWVzIC0gMSldOyAvL3JlcGVhdCB0aGUgbGFzdCBrZXkgdG8gZ2l2ZSB0aGUgbGFzdCBmcmFtZSBzb21lIHRpbWVcclxuICAgICAgICB4VHJhbnNsYXRpb24uYWRkS2V5KG5ldyBBbmltYXRpb25LZXkodGltZSwgcG9zaXRpb24ueCAvIHRoaXMudGV4dHVyZS50ZXhJbWFnZVNvdXJjZS53aWR0aCkpOy8vLCAwLCAwLCB0cnVlKSlcclxuICAgICAgICB5VHJhbnNsYXRpb24uYWRkS2V5KG5ldyBBbmltYXRpb25LZXkodGltZSwgcG9zaXRpb24ueSAvIHRoaXMudGV4dHVyZS50ZXhJbWFnZVNvdXJjZS5oZWlnaHQpKTsvLywgMCwgMCwgdHJ1ZSkpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlID0ge1xyXG4gICAgICAgIFwiY29tcG9uZW50c1wiOiB7XHJcbiAgICAgICAgICBcIkNvbXBvbmVudE1hdGVyaWFsXCI6IFt7XHJcbiAgICAgICAgICAgIFwibXR4UGl2b3RcIjoge1xyXG4gICAgICAgICAgICAgIFwidHJhbnNsYXRpb25cIjoge1xyXG4gICAgICAgICAgICAgICAgeDogeFRyYW5zbGF0aW9uLFxyXG4gICAgICAgICAgICAgICAgeTogeVRyYW5zbGF0aW9uXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBcInNjYWxpbmdcIjoge1xyXG4gICAgICAgICAgICAgICAgeDogeFNjYWxlLFxyXG4gICAgICAgICAgICAgICAgeTogeVNjYWxlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzY2FsZSBvZiB0aGUgc3ByaXRlc2hlZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNjYWxlKCk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgdGhpcy5zaXplLnggLyB0aGlzLnRleHR1cmUudGV4SW1hZ2VTb3VyY2Uud2lkdGgsXHJcbiAgICAgICAgdGhpcy5zaXplLnkgLyB0aGlzLnRleHR1cmUudGV4SW1hZ2VTb3VyY2UuaGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbnMgb2YgdGhlIHNwcml0ZXNoZWV0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQb3NpdGlvbnMoKTogVmVjdG9yMltdIHtcclxuICAgICAgbGV0IGlOZXh0OiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgaVdyYXA6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBwb3NpdGlvbnM6IFZlY3RvcjJbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBmcmFtZTogbnVtYmVyID0gMDsgZnJhbWUgPCB0aGlzLmZyYW1lczsgZnJhbWUrKykge1xyXG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgdGhpcy5zdGFydC54ICsgaU5leHQgKiB0aGlzLm5leHQueCArIGlXcmFwICogdGhpcy53cmFwLngsXHJcbiAgICAgICAgICB0aGlzLnN0YXJ0LnkgKyBpTmV4dCAqIHRoaXMubmV4dC55ICsgaVdyYXAgKiB0aGlzLndyYXAueVxyXG4gICAgICAgICkpO1xyXG5cclxuICAgICAgICBpTmV4dCsrO1xyXG4gICAgICAgIGlmIChpTmV4dCA+PSB0aGlzLndyYXBBZnRlcikge1xyXG4gICAgICAgICAgaU5leHQgPSAwO1xyXG4gICAgICAgICAgaVdyYXArKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBvc2l0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb24/OiBzdHJpbmdbXSwgX2Rpc3BhdGNoTXV0YXRlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMudGV4dHVyZSwgdGhpcy5mcmFtZXMsIHRoaXMud3JhcEFmdGVyLCB0aGlzLnN0YXJ0LCB0aGlzLnNpemUsIHRoaXMubmV4dCwgdGhpcy53cmFwLCB0aGlzLmZyYW1lc1BlclNlY29uZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pZFJlc291cmNlID0gdGhpcy5pZFJlc291cmNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkVGV4dHVyZSA9IHRoaXMuaWRUZXh0dXJlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmZyYW1lcyA9IHRoaXMuZnJhbWVzO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLndyYXBBZnRlciA9IHRoaXMud3JhcEFmdGVyO1xyXG4gICAgICBmb3IgKGxldCBuYW1lIG9mIFtcInN0YXJ0XCIsIFwic2l6ZVwiLCBcIm5leHRcIiwgXCJ3cmFwXCJdKVxyXG4gICAgICAgIHNlcmlhbGl6YXRpb25bbmFtZV0gPSAoPFZlY3RvcjI+UmVmbGVjdC5nZXQodGhpcywgbmFtZSkpLnNlcmlhbGl6ZSgpO1xyXG5cclxuICAgICAgbGV0IGFuaW1hdGlvbnNTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IHt9OyAvLyBubyBuZWVkIHRvIHNlcmlhbGl6ZSBzdHJ1Y3R1cmVcclxuICAgICAgLy8gbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IGFuaW1hdGlvbnNTdHJ1Y3R1cmU7IC8vIHJlc3RvcmUgZXhpc3RlbnQgc3RydWN0dXJlXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfczogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgaWYgKF9zLmlkVGV4dHVyZSlcclxuICAgICAgICB0aGlzLnRleHR1cmUgPSA8VGV4dHVyZT5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKF9zLmlkVGV4dHVyZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC5jb2xvcjtcclxuXHJcbiAgICAgIGZvciAobGV0IG5hbWUgb2YgW1wic3RhcnRcIiwgXCJzaXplXCIsIFwibmV4dFwiLCBcIndyYXBcIl0pXHJcbiAgICAgICAgKDxWZWN0b3IyPlJlZmxlY3QuZ2V0KHRoaXMsIG5hbWUpKS5kZXNlcmlhbGl6ZShfc1tuYW1lXSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMudGV4dHVyZSwgX3MuZnJhbWVzLCBfcy53cmFwQWZ0ZXIsIHRoaXMuc3RhcnQsIHRoaXMuc2l6ZSwgdGhpcy5uZXh0LCB0aGlzLndyYXAsIHRoaXMuZnJhbWVzUGVyU2Vjb25kKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIHRoZSB7QGxpbmsgQW5pbWF0aW9uU3ByaXRlfSBpbnRvIGFuIHtAbGluayBBbmltYXRpb259XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb252ZXJ0VG9BbmltYXRpb24oKTogQW5pbWF0aW9uIHtcclxuICAgICAgbGV0IGFuaW1hdGlvbjogQW5pbWF0aW9uID0gbmV3IEFuaW1hdGlvbih0aGlzLm5hbWUsIHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlLCB0aGlzLmZyYW1lc1BlclNlY29uZCk7XHJcbiAgICAgIHJldHVybiBhbmltYXRpb247XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRXh0ZW5zaW9uIG9mIEF1ZGlvQnVmZmVyIHdpdGggYSBsb2FkIG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBidWZmZXIgaW4gdGhlIHtAbGluayBBdWRpb01hbmFnZXJ9LmRlZmF1bHQgdG8gYmUgdXNlZCB3aXRoIHtAbGluayBDb21wb25lbnRBdWRpb31cclxuICAgKiBAYXV0aG9ycyBUaG9tYXMgRG9ybmVyLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBBdWRpbyBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGVSZXNvdXJjZSB7XHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJBdWRpb1wiO1xyXG4gICAgcHVibGljIGlkUmVzb3VyY2U6IHN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgIHB1YmxpYyBidWZmZXI6IEF1ZGlvQnVmZmVyID0gdW5kZWZpbmVkO1xyXG4gICAgcHVibGljIHBhdGg6IFVSTCA9IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgdXJsOiBSZXF1ZXN0SW5mbyA9IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgcmVhZHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3VybD86IFJlcXVlc3RJbmZvKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIGlmIChfdXJsKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkKF91cmwpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IF91cmwudG9TdHJpbmcoKS5zcGxpdChcIi9cIikucG9wKCk7XHJcbiAgICAgIH1cclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXN5bmNocm9ub3VzbHkgbG9hZHMgdGhlIGF1ZGlvIChtcDMpIGZyb20gdGhlIGdpdmVuIHVybFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBEZWJ1Zy5mdWRnZShcIkF1ZGlvTG9hZFwiLCBfdXJsKTtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucGF0aCA9IG5ldyBVUkwodGhpcy51cmwudG9TdHJpbmcoKSwgUHJvamVjdC5iYXNlVVJMKTtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgd2luZG93LmZldGNoKHRoaXMucGF0aC50b1N0cmluZygpKTtcclxuICAgICAgY29uc3QgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuICAgICAgbGV0IGJ1ZmZlcjogQXVkaW9CdWZmZXIgPSBhd2FpdCBBdWRpb01hbmFnZXIuZGVmYXVsdC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlCdWZmZXIpO1xyXG4gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcclxuICAgICAgdGhpcy5yZWFkeSA9IHRydWU7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlRfQVVESU8uUkVBRFkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdXJsOiB0aGlzLnVybCxcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkKF9zZXJpYWxpemF0aW9uLnVybCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9zZXJpYWxpemF0aW9uLm5hbWU7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb24/OiBzdHJpbmdbXSwgX2Rpc3BhdGNoTXV0YXRlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgdXJsOiBzdHJpbmcgPSBfbXV0YXRvci51cmw7IC8vIHNhdmUgdXJsIGZvciByZWNvbnN0cnVjdGlvbiBhZnRlciBleGNsdXNpb25cclxuICAgICAgaWYgKF9tdXRhdG9yLnVybCAhPSB0aGlzLnVybC50b1N0cmluZygpKVxyXG4gICAgICAgIHRoaXMubG9hZChfbXV0YXRvci51cmwpO1xyXG4gICAgICAvLyBleGNlcHQgdXJsIGZyb20gbXV0YXRvciBmb3IgZnVydGhlciBwcm9jZXNzaW5nXHJcbiAgICAgIGRlbGV0ZSAoX211dGF0b3IudXJsKTtcclxuICAgICAgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICAvLyByZWNvbnN0cnVjdCwgZm9yIG11dGF0b3IgbWF5IGJlIGtlcHQgYnkgY2FsbGVyXHJcbiAgICAgIFJlZmxlY3Quc2V0KF9tdXRhdG9yLCBcInVybFwiLCB1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIC8vIGRlbGV0ZSBfbXV0YXRvci5pZFJlc291cmNlOyBcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlYWR5O1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGNvbnN0IGVudW0gRVZFTlRfQVVESU8ge1xyXG4gICAgLyoqIGJyb2FkY2FzdCB0byBhIHtAbGluayBOb2RlfSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBpbiB0aGUgZ3JhcGggYWZ0ZXIgaXQgd2FzIGFwcGVuZGVkIHRvIGEgcGFyZW50ICovXHJcbiAgICBDSElMRF9BUFBFTkQgPSBcImNoaWxkQXBwZW5kVG9BdWRpb0dyYXBoXCIsXHJcbiAgICAvKiogYnJvYWRjYXN0IHRvIGEge0BsaW5rIE5vZGV9IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGluIHRoZSBncmFwaCBqdXN0IGJlZm9yZSBpdHMgYmVpbmcgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgKi9cclxuICAgIENISUxEX1JFTU9WRSA9IFwiY2hpbGRSZW1vdmVGcm9tQXVkaW9HcmFwaFwiLFxyXG4gICAgLyoqIGJyb2FkY2FzdCB0byBhIHtAbGluayBOb2RlfSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBpbiB0aGUgZ3JhcGggdG8gdXBkYXRlIHRoZSBwYW5uZXJzIGluIEF1ZGlvQ29tcG9uZW50cyAqL1xyXG4gICAgVVBEQVRFID0gXCJ1cGRhdGVBdWRpb0dyYXBoXCIsXHJcbiAgICAvKiogZmlyZWQgd2hlbiB0aGUgYXVkaW8gZmlsZSB3YXMgbG9hZGVkIGFuZCBpcyByZWFkeSBmb3IgcGxheWluZyAqL1xyXG4gICAgUkVBRFkgPSBcInJlYWR5XCIsXHJcbiAgICAvKiogZmlyZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBhdWRpbyBpcyByZWFjaGVkIHdoaWxlIHBsYXlpbmcgKi9cclxuICAgIEVOREVEID0gXCJlbmRlZFwiXHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiLi4vRXZlbnQvRXZlbnRBdWRpby50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRXh0ZW5kcyB0aGUgc3RhbmRhcmQgQXVkaW9Db250ZXh0IGZvciBpbnRlZ3JhdGlvbiB3aXRoIEZVREdFLWdyYXBocy5cclxuICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBvYmplY3QgYXQgc3RhcnR1cCB0byBiZSBhZGRyZXNzZWQgYXMgQXVkaW9NYW5hZ2VyIGRlZmF1bHQuXHJcbiAgICogT3RoZXIgb2JqZWN0cyBvZiB0aGlzIGNsYXNzIG1heSBiZSBjcmVhdGUgZm9yIHNwZWNpYWwgcHVycG9zZXMuXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEF1ZGlvTWFuYWdlciBleHRlbmRzIEF1ZGlvQ29udGV4dCB7XHJcbiAgICAvKiogVGhlIGRlZmF1bHQgY29udGV4dCB0aGF0IG1heSBiZSB1c2VkIHRocm91Z2hvdXQgdGhlIHByb2plY3Qgd2l0aG91dCB0aGUgbmVlZCB0byBjcmVhdGUgb3RoZXJzICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHQ6IEF1ZGlvTWFuYWdlciA9IG5ldyBBdWRpb01hbmFnZXIoeyBsYXRlbmN5SGludDogXCJpbnRlcmFjdGl2ZVwiLCBzYW1wbGVSYXRlOiA0NDEwMCB9KTtcclxuICAgIHByaXZhdGUgc3RhdGljIGV2ZW50VXBkYXRlOiBFdmVudCA9IG5ldyBFdmVudChFVkVOVF9BVURJTy5VUERBVEUpO1xyXG4gICAgLyoqIFRoZSBtYXN0ZXIgdm9sdW1lIGFsbCBBdWRpb05vZGVzIGluIHRoZSBjb250ZXh0IHNob3VsZCBhdHRhY2ggdG8gKi9cclxuICAgIHB1YmxpYyByZWFkb25seSBnYWluOiBHYWluTm9kZTtcclxuICAgIHByaXZhdGUgZ3JhcGg6IE5vZGUgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBjbXBMaXN0ZW5lcjogQ29tcG9uZW50QXVkaW9MaXN0ZW5lciA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb250ZXh0T3B0aW9ucz86IEF1ZGlvQ29udGV4dE9wdGlvbnMpIHtcclxuICAgICAgc3VwZXIoX2NvbnRleHRPcHRpb25zKTtcclxuICAgICAgdGhpcy5nYWluID0gdGhpcy5jcmVhdGVHYWluKCk7XHJcbiAgICAgIHRoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuZGVzdGluYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBtYXN0ZXIgdm9sdW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgdm9sdW1lKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuZ2Fpbi5nYWluLnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtYXN0ZXIgdm9sdW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZXMgRlVER0UtZ3JhcGggdG8gbGlzdGVuIHRvLiBFYWNoIHtAbGluayBDb21wb25lbnRBdWRpb30gaW4gdGhlIGdyYXBoIHdpbGwgY29ubmVjdCB0byB0aGlzIGNvbnRleHRzIG1hc3RlciBnYWluLCBhbGwgb3RoZXJzIGRpc2Nvbm5lY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsaXN0ZW5UbyA9IChfZ3JhcGg6IE5vZGUgfCBudWxsKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmdyYXBoKVxyXG4gICAgICAgIHRoaXMuZ3JhcGguYnJvYWRjYXN0RXZlbnQobmV3IEV2ZW50KEVWRU5UX0FVRElPLkNISUxEX1JFTU9WRSkpO1xyXG4gICAgICBpZiAoIV9ncmFwaClcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRoaXMuZ3JhcGggPSBfZ3JhcGg7XHJcbiAgICAgIHRoaXMuZ3JhcGguYnJvYWRjYXN0RXZlbnQobmV3IEV2ZW50KEVWRU5UX0FVRElPLkNISUxEX0FQUEVORCkpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBGVURHRS1ncmFwaCBjdXJyZW50bHkgbGlzdGVuaW5nIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRHcmFwaExpc3RlbmluZ1RvID0gKCk6IE5vZGUgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncmFwaDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHtAbGluayBDb21wb25lbnRBdWRpb0xpc3RlbmVyfSB0aGF0IHNlcnZlcyB0aGUgc3BhdGlhbCBsb2NhdGlvbiBhbmQgb3JpZW50YXRpb24gZm9yIHRoaXMgY29udGV4dHMgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxpc3RlbldpdGggPSAoX2NtcExpc3RlbmVyOiBDb21wb25lbnRBdWRpb0xpc3RlbmVyIHwgbnVsbCk6IHZvaWQgPT4ge1xyXG4gICAgICB0aGlzLmNtcExpc3RlbmVyID0gX2NtcExpc3RlbmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNwYXRpYWwgc2V0dGluZ3Mgb2YgdGhlIEF1ZGlvTm9kZXMgZWZmZWN0ZWQgaW4gdGhlIGN1cnJlbnQgRlVER0UtZ3JhcGhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZSA9ICgpOiB2b2lkID0+IHtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUgIT0gXCJydW5uaW5nXCIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICAvLyB0aGlzLmdyYXBoLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVF9BVURJTy5VUERBVEUpKTtcclxuICAgICAgdGhpcy5ncmFwaC5icm9hZGNhc3RFdmVudChBdWRpb01hbmFnZXIuZXZlbnRVcGRhdGUpO1xyXG4gICAgICBpZiAodGhpcy5jbXBMaXN0ZW5lcilcclxuICAgICAgICB0aGlzLmNtcExpc3RlbmVyLnVwZGF0ZSh0aGlzLmxpc3RlbmVyKTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwiLy8gbmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgICBcclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogRW51bWVyYXRvciBmb3IgYWxsIHBvc3NpYmxlIE9zY2lsbGF0b3IgVHlwZXNcclxuLy8gICAgICAqL1xyXG4vLyAgICAgdHlwZSBPU0NJTExBVE9SX1RZUEUgPSBcInNpbmVcIiB8IFwic3F1YXJlXCIgfCBcInNhd3Rvb3RoXCIgfCBcInRyaWFuZ2xlXCIgfCBcImN1c3RvbVwiO1xyXG5cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogSW50ZXJmYWNlIHRvIGNyZWF0ZSBDdXN0b20gT3NjaWxsYXRvciBUeXBlcy5cclxuLy8gICAgICAqIFN0YXJ0LS9FbmRwb2ludCBvZiBhIGN1c3R1bSBjdXJ2ZSBlLmcuIHNpbmUgY3VydmUuXHJcbi8vICAgICAgKiBCb3RoIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBpbmJldHdlZW4gLTEgYW5kIDEuXHJcbi8vICAgICAgKiBAcGFyYW0gc3RhcnRwb2ludCBzdGFydHBvaW50IG9mIGEgY3VydmUgXHJcbi8vICAgICAgKiBAcGFyYW0gZW5kcG9pbnQgRW5kcG9pbnQgb2YgYSBjdXJ2ZSBcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaW50ZXJmYWNlIE9zY2lsbGF0b3JXYXZlIHtcclxuLy8gICAgICAgICBzdGFydHBvaW50OiBudW1iZXI7XHJcbi8vICAgICAgICAgZW5kcG9pbnQ6IG51bWJlcjtcclxuLy8gICAgIH1cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogQWRkIGFuIHtAbGluayBBdWRpb0ZpbHRlcn0gdG8gYW4ge0BsaW5rIEF1ZGlvXV1cclxuLy8gICAgICAqIEBhdXRob3JzIFRob21hcyBEb3JuZXIsIEhGVSwgMjAxOVxyXG4vLyAgICAgICovXHJcbi8vICAgICBleHBvcnQgY2xhc3MgQXVkaW9Pc2NpbGxhdG9yIHtcclxuXHJcbi8vICAgICAgICAgcHVibGljIGF1ZGlvT3NjaWxsYXRvcjogT3NjaWxsYXRvck5vZGU7IFxyXG5cclxuLy8gICAgICAgICBwcml2YXRlIGZyZXF1ZW5jeTogbnVtYmVyO1xyXG4vLyAgICAgICAgIHByaXZhdGUgb3NjaWxsYXRvclR5cGU6IE9TQ0lMTEFUT1JfVFlQRTtcclxuLy8gICAgICAgICBwcml2YXRlIG9zY2lsbGF0b3JXYXZlOiBQZXJpb2RpY1dhdmU7XHJcblxyXG4vLyAgICAgICAgIHByaXZhdGUgbG9jYWxHYWluOiBHYWluTm9kZTtcclxuLy8gICAgICAgICBwcml2YXRlIGxvY2FsR2FpblZhbHVlOiBudW1iZXI7XHJcblxyXG4vLyAgICAgICAgIGNvbnN0cnVjdG9yKF9hdWRpb1NldHRpbmdzOiBBdWRpb1NldHRpbmdzLCBfb3NjaWxsYXRvclR5cGU/OiBPU0NJTExBVE9SX1RZUEUpIHtcclxuLy8gICAgICAgICAgICAgdGhpcy5hdWRpb09zY2lsbGF0b3IgPSBfYXVkaW9TZXR0aW5ncy5nZXRBdWRpb0NvbnRleHQoKS5jcmVhdGVPc2NpbGxhdG9yKCk7XHJcbi8vICAgICAgICAgICAgIHRoaXMubG9jYWxHYWluID0gX2F1ZGlvU2V0dGluZ3MuZ2V0QXVkaW9Db250ZXh0KCkuY3JlYXRlR2FpbigpO1xyXG4vLyAgICAgICAgICAgICB0aGlzLm9zY2lsbGF0b3JUeXBlID0gX29zY2lsbGF0b3JUeXBlO1xyXG4vLyAgICAgICAgICAgICBpZiAodGhpcy5vc2NpbGxhdG9yVHlwZSAhPSBcImN1c3RvbVwiKSB7XHJcbi8vICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvci50eXBlID0gdGhpcy5vc2NpbGxhdG9yVHlwZTtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICBlbHNlIHtcclxuLy8gICAgICAgICAgICAgICAgIGlmICghdGhpcy5vc2NpbGxhdG9yV2F2ZSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9Pc2NpbGxhdG9yLnNldFBlcmlvZGljV2F2ZSh0aGlzLm9zY2lsbGF0b3JXYXZlKTtcclxuLy8gICAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRlIGEgQ3VzdG9tIFBlcmlvZGljIFdhdmUgZmlyc3QgdG8gdXNlIEN1c3RvbSBUeXBlXCIpO1xyXG4vLyAgICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgc2V0T3NjaWxsYXRvclR5cGUoX29zY2lsbGF0b3JUeXBlOiBPU0NJTExBVE9SX1RZUEUpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgaWYgKHRoaXMub3NjaWxsYXRvclR5cGUgIT0gXCJjdXN0b21cIikge1xyXG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hdWRpb09zY2lsbGF0b3IudHlwZSA9IHRoaXMub3NjaWxsYXRvclR5cGU7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgZWxzZSB7XHJcbi8vICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3NjaWxsYXRvcldhdmUpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvci5zZXRQZXJpb2RpY1dhdmUodGhpcy5vc2NpbGxhdG9yV2F2ZSk7XHJcbi8vICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBnZXRPc2NpbGxhdG9yVHlwZSgpOiBPU0NJTExBVE9SX1RZUEUge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gdGhpcy5vc2NpbGxhdG9yVHlwZTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBjcmVhdGVQZXJpb2RpY1dhdmUoX2F1ZGlvU2V0dGluZ3M6IEF1ZGlvU2V0dGluZ3MsIF9yZWFsOiBPc2NpbGxhdG9yV2F2ZSwgX2ltYWc6IE9zY2lsbGF0b3JXYXZlKTogdm9pZCB7XHJcbi8vICAgICAgICAgICAgIGxldCB3YXZlUmVhbDogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgyKTtcclxuLy8gICAgICAgICAgICAgd2F2ZVJlYWxbMF0gPSBfcmVhbC5zdGFydHBvaW50O1xyXG4vLyAgICAgICAgICAgICB3YXZlUmVhbFsxXSA9IF9yZWFsLmVuZHBvaW50O1xyXG5cclxuLy8gICAgICAgICAgICAgbGV0IHdhdmVJbWFnOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDIpO1xyXG4vLyAgICAgICAgICAgICB3YXZlSW1hZ1swXSA9IF9pbWFnLnN0YXJ0cG9pbnQ7XHJcbi8vICAgICAgICAgICAgIHdhdmVJbWFnWzFdID0gX2ltYWcuZW5kcG9pbnQ7XHJcblxyXG4vLyAgICAgICAgICAgICB0aGlzLm9zY2lsbGF0b3JXYXZlID0gX2F1ZGlvU2V0dGluZ3MuZ2V0QXVkaW9Db250ZXh0KCkuY3JlYXRlUGVyaW9kaWNXYXZlKHdhdmVSZWFsLCB3YXZlSW1hZyk7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgc2V0TG9jYWxHYWluKF9sb2NhbEdhaW46IEdhaW5Ob2RlKTogdm9pZCB7XHJcbi8vICAgICAgICAgICAgIHRoaXMubG9jYWxHYWluID0gX2xvY2FsR2FpbjtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBnZXRMb2NhbEdhaW4oKTogR2Fpbk5vZGUge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbEdhaW47XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgc2V0TG9jYWxHYWluVmFsdWUoX2xvY2FsR2FpblZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgdGhpcy5sb2NhbEdhaW5WYWx1ZSA9IF9sb2NhbEdhaW5WYWx1ZTtcclxuLy8gICAgICAgICAgICAgdGhpcy5sb2NhbEdhaW4uZ2Fpbi52YWx1ZSA9IHRoaXMubG9jYWxHYWluVmFsdWU7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgZ2V0TG9jYWxHYWluVmFsdWUoKTogbnVtYmVyIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxHYWluVmFsdWU7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgc2V0RnJlcXVlbmN5KF9hdWRpb1NldHRpbmdzOiBBdWRpb1NldHRpbmdzLCBfZnJlcXVlbmN5OiBudW1iZXIpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBfZnJlcXVlbmN5O1xyXG4vLyAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvci5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUodGhpcy5mcmVxdWVuY3ksIF9hdWRpb1NldHRpbmdzLmdldEF1ZGlvQ29udGV4dCgpLmN1cnJlbnRUaW1lKTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBnZXRGcmVxdWVuY3koKTogbnVtYmVyIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJlcXVlbmN5O1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcHVibGljIGNyZWF0ZVNuYXJlKF9hdWRpb1NldHRpbmdzOiBBdWRpb1NldHRpbmdzKTogdm9pZCB7XHJcbi8vICAgICAgICAgICAgIHRoaXMuc2V0T3NjaWxsYXRvclR5cGUoXCJ0cmlhbmdsZVwiKTtcclxuLy8gICAgICAgICAgICAgdGhpcy5zZXRGcmVxdWVuY3koX2F1ZGlvU2V0dGluZ3MsIDEwMCk7XHJcbi8vICAgICAgICAgICAgIHRoaXMuc2V0TG9jYWxHYWluVmFsdWUoMCk7XHJcbi8vICAgICAgICAgICAgIHRoaXMubG9jYWxHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUoMCwgX2F1ZGlvU2V0dGluZ3MuZ2V0QXVkaW9Db250ZXh0KCkuY3VycmVudFRpbWUpO1xyXG4vLyAgICAgICAgICAgICB0aGlzLmxvY2FsR2Fpbi5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMSwgX2F1ZGlvU2V0dGluZ3MuZ2V0QXVkaW9Db250ZXh0KCkuY3VycmVudFRpbWUgKyAuMSk7XHJcblxyXG4vLyAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvci5jb25uZWN0KHRoaXMubG9jYWxHYWluKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vIH0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBdHRhY2hlZCB0byBhIHtAbGluayBOb2RlfSB3aXRoIGFuIGF0dGFjaGVkIHtAbGluayBDb21wb25lbnRDYW1lcmF9IHRoaXMgY2F1c2VzIHRoZSByZW5kZXJlZCBpbWFnZSB0byByZWNlaXZlIGFuIGFtYmllbnQgb2NjbHVzaW9uIGVmZmVjdC5cclxuICAgKiBAYXV0aG9ycyBSb2xhbmQgSGVlciwgSEZVLCAyMDIzIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEFtYmllbnRPY2NsdXNpb24gZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEFtYmllbnRPY2NsdXNpb24pO1xyXG5cclxuICAgIHB1YmxpYyBzYW1wbGVSYWRpdXM6IG51bWJlcjtcclxuICAgIHB1YmxpYyBiaWFzOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYXR0ZW51YXRpb25Db25zdGFudDogbnVtYmVyO1xyXG4gICAgcHVibGljIGF0dGVudWF0aW9uTGluZWFyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYXR0ZW51YXRpb25RdWFkcmF0aWM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3NhbXBsZVJhZGl1czogbnVtYmVyID0gMTYsIF9iaWFzOiBudW1iZXIgPSAwLjA3LCBfYXR0ZW51YXRpb25Db25zdGFudDogbnVtYmVyID0gMi41LCBfYXR0ZW51YXRpb25MaW5lYXI6IG51bWJlciA9IDEsIF9hdHRlbnVhdGlvblF1YWRyYXRpYzogbnVtYmVyID0gMSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNhbXBsZVJhZGl1cyA9IF9zYW1wbGVSYWRpdXM7XHJcbiAgICAgIHRoaXMuYmlhcyA9IF9iaWFzO1xyXG4gICAgICB0aGlzLmF0dGVudWF0aW9uQ29uc3RhbnQgPSBfYXR0ZW51YXRpb25Db25zdGFudDtcclxuICAgICAgdGhpcy5hdHRlbnVhdGlvbkxpbmVhciA9IF9hdHRlbnVhdGlvbkxpbmVhcjtcclxuICAgICAgdGhpcy5hdHRlbnVhdGlvblF1YWRyYXRpYyA9IF9hdHRlbnVhdGlvblF1YWRyYXRpYztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHNhbXBsZVJhZGl1czogdGhpcy5zYW1wbGVSYWRpdXMsXHJcbiAgICAgICAgYmlhczogdGhpcy5iaWFzLFxyXG4gICAgICAgIGF0dGVudWF0aW9uQ29uc3RhbnQ6IHRoaXMuYXR0ZW51YXRpb25Db25zdGFudCxcclxuICAgICAgICBhdHRlbnVhdGlvbkxpbmVhcjogdGhpcy5hdHRlbnVhdGlvbkxpbmVhcixcclxuICAgICAgICBhdHRlbnVhdGlvblF1YWRyYXRpYzogdGhpcy5hdHRlbnVhdGlvblF1YWRyYXRpY1xyXG4gICAgICB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuc2FtcGxlUmFkaXVzID0gX3NlcmlhbGl6YXRpb24uc2FtcGxlUmFkaXVzO1xyXG4gICAgICB0aGlzLmJpYXMgPSBfc2VyaWFsaXphdGlvbi5iaWFzO1xyXG4gICAgICB0aGlzLmF0dGVudWF0aW9uQ29uc3RhbnQgPSBfc2VyaWFsaXphdGlvbi5hdHRlbnVhdGlvbkNvbnN0YW50O1xyXG4gICAgICB0aGlzLmF0dGVudWF0aW9uTGluZWFyID0gX3NlcmlhbGl6YXRpb24uYXR0ZW51YXRpb25MaW5lYXI7XHJcbiAgICAgIHRoaXMuYXR0ZW51YXRpb25RdWFkcmF0aWMgPSBfc2VyaWFsaXphdGlvbi5hdHRlbnVhdGlvblF1YWRyYXRpYztcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RpbWUvTG9vcC50c1wiLz5cclxuLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BbmltYXRpb24vQW5pbWF0aW9uLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIGFuIHtAbGluayBBbmltYXRpb259IGFuZCBjb250cm9scyBpdC4gQ29udHJvbHMgcXVhbnRpemF0aW9uIGFuZCBwbGF5bW9kZSBhcyB3ZWxsIGFzIHNwZWVkLlxyXG4gICAqIEBhdXRob3JzIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50QW5pbWF0b3IgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEFuaW1hdG9yKTtcclxuICAgIC8vVE9ETzogYWRkIGZ1bmN0aW9uYWxpdHkgdG8gYmxlbmQgZnJvbSBvbmUgYW5pbWF0aW9uIHRvIGFub3RoZXIuXHJcbiAgICBwdWJsaWMgYW5pbWF0aW9uOiBBbmltYXRpb247XHJcbiAgICBwdWJsaWMgcGxheW1vZGU6IEFOSU1BVElPTl9QTEFZTU9ERTtcclxuICAgIHB1YmxpYyBxdWFudGl6YXRpb246IEFOSU1BVElPTl9RVUFOVElaQVRJT047XHJcbiAgICBwdWJsaWMgc2NhbGVXaXRoR2FtZVRpbWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIGFuaW1hdGVJbkVkaXRvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICNzY2FsZTogbnVtYmVyID0gMTtcclxuICAgICN0aW1lTG9jYWw6IFRpbWU7XHJcbiAgICAjcHJldmlvdXM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9hbmltYXRpb24/OiBBbmltYXRpb24sIF9wbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFID0gQU5JTUFUSU9OX1BMQVlNT0RFLkxPT1AsIF9xdWFudGl6YXRpb246IEFOSU1BVElPTl9RVUFOVElaQVRJT04gPSBBTklNQVRJT05fUVVBTlRJWkFUSU9OLkNPTlRJTk9VUykge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnBsYXltb2RlID0gX3BsYXltb2RlO1xyXG4gICAgICB0aGlzLnF1YW50aXphdGlvbiA9IF9xdWFudGl6YXRpb247XHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uID0gX2FuaW1hdGlvbjtcclxuXHJcbiAgICAgIHRoaXMuI3RpbWVMb2NhbCA9IG5ldyBUaW1lKCk7XHJcblxyXG4gICAgICAvL1RPRE86IHVwZGF0ZSBhbmltYXRpb24gdG90YWwgdGltZSB3aGVuIGxvYWRpbmcgYSBkaWZmZXJlbnQgYW5pbWF0aW9uP1xyXG4gICAgICB0aGlzLmFuaW1hdGlvbj8uY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcblxyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgKCkgPT4gdGhpcy5hY3RpdmF0ZShmYWxzZSkpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNISUxEX1JFTU9WRSwgKCkgPT4gdGhpcy5hY3RpdmF0ZShmYWxzZSkpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZhdGUodHJ1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2NhbGUoX3NjYWxlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc2NhbGUgPSBfc2NhbGU7XHJcbiAgICAgIHRoaXMudXBkYXRlU2NhbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNjYWxlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIHRoZSBjdXJyZW50IHNhbXBsZSB0aW1lIG9mIHRoZSBhbmltYXRpb24gIFxyXG4gICAgICogLSBzZXQ6IGp1bXAgdG8gYSBjZXJ0YWluIHNhbXBsZSB0aW1lIGluIHRoZSBhbmltYXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0aW1lKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0aW1lTG9jYWwuZ2V0KCkgJSB0aGlzLmFuaW1hdGlvbi50b3RhbFRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0aW1lKF90aW1lOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5qdW1wVG8oX3RpbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhY3RpdmF0ZShfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgc3VwZXIuYWN0aXZhdGUoX29uKTtcclxuICAgICAgaWYgKCF0aGlzLm5vZGUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5hY3RpdmF0ZUxpc3RlbmVycyhfb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSnVtcHMgdG8gYSBjZXJ0YWluIHRpbWUgaW4gdGhlIGFuaW1hdGlvbiB0byBwbGF5IGZyb20gdGhlcmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBqdW1wVG8oX3RpbWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLiN0aW1lTG9jYWwuc2V0KF90aW1lKTtcclxuICAgICAgdGhpcy4jcHJldmlvdXMgPSBfdGltZTtcclxuICAgICAgX3RpbWUgPSBfdGltZSAlIHRoaXMuYW5pbWF0aW9uLnRvdGFsVGltZTtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB0aGlzLmFuaW1hdGlvbi5nZXRTdGF0ZShfdGltZSwgdGhpcy5hbmltYXRpb24uY2FsY3VsYXRlRGlyZWN0aW9uKF90aW1lLCB0aGlzLnBsYXltb2RlKSwgdGhpcy5xdWFudGl6YXRpb24pO1xyXG4gICAgICB0aGlzLm5vZGUuYXBwbHlBbmltYXRpb24obXV0YXRvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBKdW1wcyB0byBhIGNlcnRhaW4gbGFiZWwgaW4gdGhlIGFuaW1hdGlvbiBpZiBkZWZpbmVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBqdW1wVG9MYWJlbChfbGFiZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBsZXQgdGltZTogbnVtYmVyID0gdGhpcy5hbmltYXRpb24ubGFiZWxzW19sYWJlbF07XHJcbiAgICAgIGlmICh0aW1lKVxyXG4gICAgICAgIHRoaXMuanVtcFRvKHRpbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yY2VzIGFuIHVwZGF0ZSBvZiB0aGUgYW5pbWF0aW9uIGZyb20gb3V0c2lkZS4gVXNlZCBpbiB0aGUgVmlld0FuaW1hdGlvbi4gU2hvdWxkbid0IGJlIHVzZWQgZHVyaW5nIHRoZSBnYW1lLlxyXG4gICAgICogQHBhcmFtIF90aW1lIHRoZSAodW5zY2FsZWQpIHRpbWUgdG8gdXBkYXRlIHRoZSBhbmltYXRpb24gd2l0aC5cclxuICAgICAqIEByZXR1cm5zIHRoZSBNdXRhdG9yIGZvciBBbmltYXRpb24uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQW5pbWF0aW9uKF90aW1lOiBudW1iZXIpOiBNdXRhdG9yIHtcclxuICAgICAgdGhpcy4jcHJldmlvdXMgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUFuaW1hdGlvbkxvb3AobnVsbCwgX3RpbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiB0cmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkQW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb24uaWRSZXNvdXJjZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5wbGF5bW9kZSA9IHRoaXMucGxheW1vZGU7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24ucXVhbnRpemF0aW9uID0gdGhpcy5xdWFudGl6YXRpb247XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc2NhbGUgPSB0aGlzLnNjYWxlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNjYWxlV2l0aEdhbWVUaW1lID0gdGhpcy5zY2FsZVdpdGhHYW1lVGltZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5hbmltYXRlSW5FZGl0b3IgPSB0aGlzLmFuaW1hdGVJbkVkaXRvcjtcclxuXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgdGhpcy5hbmltYXRpb24gPSA8QW5pbWF0aW9uPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRBbmltYXRpb24pO1xyXG4gICAgICB0aGlzLnBsYXltb2RlID0gX3NlcmlhbGl6YXRpb24ucGxheW1vZGU7XHJcbiAgICAgIHRoaXMucXVhbnRpemF0aW9uID0gX3NlcmlhbGl6YXRpb24ucXVhbnRpemF0aW9uO1xyXG4gICAgICB0aGlzLnNjYWxlID0gX3NlcmlhbGl6YXRpb24uc2NhbGU7XHJcbiAgICAgIHRoaXMuc2NhbGVXaXRoR2FtZVRpbWUgPSBfc2VyaWFsaXphdGlvbi5zY2FsZVdpdGhHYW1lVGltZTtcclxuICAgICAgdGhpcy5hbmltYXRlSW5FZGl0b3IgPSBfc2VyaWFsaXphdGlvbi5hbmltYXRlSW5FZGl0b3I7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5hbmltYXRlSW5FZGl0b3IpICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBbmltYXRpb24oMCk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUxpc3RlbmVycyh0aGlzLmFjdGl2ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgICAgbGV0IHR5cGVzOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMgPSBzdXBlci5nZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3IpO1xyXG4gICAgICBpZiAodHlwZXMucGxheW1vZGUpXHJcbiAgICAgICAgdHlwZXMucGxheW1vZGUgPSBBTklNQVRJT05fUExBWU1PREU7XHJcbiAgICAgIGlmICh0eXBlcy5xdWFudGl6YXRpb24pXHJcbiAgICAgICAgdHlwZXMucXVhbnRpemF0aW9uID0gQU5JTUFUSU9OX1FVQU5USVpBVElPTjtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZUxpc3RlbmVycyhfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgaWYgKF9vbiAmJiAoUHJvamVjdC5tb2RlICE9IE1PREUuRURJVE9SIHx8IFByb2plY3QubW9kZSA9PSBNT0RFLkVESVRPUiAmJiB0aGlzLmFuaW1hdGVJbkVkaXRvcikpIHtcclxuICAgICAgICBUaW1lLmdhbWUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5USU1FX1NDQUxFRCwgdGhpcy51cGRhdGVTY2FsZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUkVOREVSX1BSRVBBUkUsIHRoaXMudXBkYXRlQW5pbWF0aW9uTG9vcCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgVGltZS5nYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVElNRV9TQ0FMRUQsIHRoaXMudXBkYXRlU2NhbGUpO1xyXG4gICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlJFTkRFUl9QUkVQQVJFLCB0aGlzLnVwZGF0ZUFuaW1hdGlvbkxvb3ApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIHVwZGF0ZUFuaW1hdGlvblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBBbmltYXRpb24uXHJcbiAgICAgKiBVc2VzIHRoZSBidWlsdC1pbiB0aW1lIHVubGVzcyBhIGRpZmZlcmVudCB0aW1lIGlzIHNwZWNpZmllZC5cclxuICAgICAqIE1heSBhbHNvIGJlIGNhbGxlZCBmcm9tIHVwZGF0ZUFuaW1hdGlvbigpLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZUFuaW1hdGlvbkxvb3AgPSAoX2U6IEV2ZW50LCBfdGltZT86IG51bWJlcik6IE11dGF0b3IgPT4ge1xyXG4gICAgICBpZiAodGhpcy5hbmltYXRpb24udG90YWxUaW1lID09IDApIFxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IHRpbWU6IG51bWJlciA9IF90aW1lIHx8IF90aW1lID09PSAwID8gX3RpbWUgOiB0aGlzLiN0aW1lTG9jYWwuZ2V0KCk7XHJcbiAgICAgIGlmICh0aGlzLnF1YW50aXphdGlvbiA9PSBBTklNQVRJT05fUVVBTlRJWkFUSU9OLkZSQU1FUykge1xyXG4gICAgICAgIHRpbWUgPSB0aGlzLiNwcmV2aW91cyArICgxMDAwIC8gdGhpcy5hbmltYXRpb24uZnBzKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgZGlyZWN0aW9uOiBudW1iZXIgPSB0aGlzLmFuaW1hdGlvbi5jYWxjdWxhdGVEaXJlY3Rpb24odGltZSwgdGhpcy5wbGF5bW9kZSk7XHJcbiAgICAgIHRpbWUgPSB0aGlzLmFuaW1hdGlvbi5nZXRNb2RhbFRpbWUodGltZSwgdGhpcy5wbGF5bW9kZSwgdGhpcy4jdGltZUxvY2FsLmdldE9mZnNldCgpKTtcclxuICAgICAgdGhpcy5leGVjdXRlRXZlbnRzKHRoaXMuYW5pbWF0aW9uLmdldEV2ZW50c1RvRmlyZSh0aGlzLiNwcmV2aW91cywgdGltZSwgdGhpcy5xdWFudGl6YXRpb24sIGRpcmVjdGlvbikpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuI3ByZXZpb3VzICE9IHRpbWUpIHtcclxuICAgICAgICB0aGlzLiNwcmV2aW91cyA9IHRpbWU7XHJcbiAgICAgICAgdGltZSA9IHRpbWUgJSB0aGlzLmFuaW1hdGlvbi50b3RhbFRpbWU7XHJcbiAgICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB0aGlzLmFuaW1hdGlvbi5nZXRTdGF0ZSh0aW1lLCBkaXJlY3Rpb24sIHRoaXMucXVhbnRpemF0aW9uKTtcclxuICAgICAgICBpZiAodGhpcy5ub2RlKSB7XHJcbiAgICAgICAgICB0aGlzLm5vZGUuYXBwbHlBbmltYXRpb24obXV0YXRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpcmVzIGFsbCBjdXN0b20gZXZlbnRzIHRoZSBBbmltYXRpb24gc2hvdWxkIGhhdmUgZmlyZWQgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgZnJhbWUuXHJcbiAgICAgKiBAcGFyYW0gX2V2ZW50cyBhIGxpc3Qgb2YgbmFtZXMgb2YgY3VzdG9tIGV2ZW50cyB0byBmaXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXhlY3V0ZUV2ZW50cyhfZXZlbnRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgX2V2ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoX2V2ZW50c1tpXSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzY2FsZSBvZiB0aGUgYW5pbWF0aW9uIGlmIHRoZSB1c2VyIGNoYW5nZXMgaXQgb3IgaWYgdGhlIGdsb2JhbCBnYW1lIHRpbWVyIGNoYW5nZWQgaXRzIHNjYWxlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVNjYWxlID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICBsZXQgbmV3U2NhbGU6IG51bWJlciA9IHRoaXMuI3NjYWxlO1xyXG4gICAgICBpZiAodGhpcy5zY2FsZVdpdGhHYW1lVGltZSlcclxuICAgICAgICBuZXdTY2FsZSAqPSBUaW1lLmdhbWUuZ2V0U2NhbGUoKTtcclxuICAgICAgdGhpcy4jdGltZUxvY2FsLnNldFNjYWxlKG5ld1NjYWxlKTtcclxuICAgIH07XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGVudW0gQVVESU9fUEFOTkVSIHtcclxuICAgIENPTkVfSU5ORVJfQU5HTEUgPSBcImNvbmVJbm5lckFuZ2xlXCIsXHJcbiAgICBDT05FX09VVEVSX0FOR0xFID0gXCJjb25lT3V0ZXJBbmdsZVwiLFxyXG4gICAgQ09ORV9PVVRFUl9HQUlOID0gXCJjb25lT3V0ZXJHYWluXCIsXHJcbiAgICBESVNUQU5DRV9NT0RFTCA9IFwiZGlzdGFuY2VNb2RlbFwiLFxyXG4gICAgTUFYX0RJU1RBTkNFID0gXCJtYXhEaXN0YW5jZVwiLFxyXG4gICAgUEFOTklOR19NT0RFTCA9IFwicGFubmluZ01vZGVsXCIsXHJcbiAgICBSRUZfRElTVEFOQ0UgPSBcInJlZkRpc3RhbmNlXCIsXHJcbiAgICBST0xMT0ZGX0ZBQ1RPUiA9IFwicm9sbG9mZkZhY3RvclwiXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBBVURJT19OT0RFX1RZUEUge1xyXG4gICAgU09VUkNFLCBQQU5ORVIsIEdBSU5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkcyBhIG1pbmltYWwgYXVkaW8gZ3JhcGggKGJ5IGRlZmF1bHQgaW4ge0BsaW5rIEF1ZGlvTWFuYWdlcn0uZGVmYXVsdCkgYW5kIHN5bmNocm9uaXplcyBpdCB3aXRoIHRoZSBjb250YWluaW5nIHtAbGluayBOb2RlfVxyXG4gICAqIGBgYHRleHRcclxuICAgKiDilIwgQXVkaW9NYW5hZ2VyKC5kZWZhdWx0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcclxuICAgKiDilIIg4pSMIENvbXBvbmVudEF1ZGlvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICDilIJcclxuICAgKiDilIIg4pSCICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQIOKUgiAgXHJcbiAgICog4pSCIOKUgiAgICDilIJzb3VyY2XilIIg4oaSIOKUgnBhbm5lcuKUgiDihpIg4pSCIGdhaW4g4pSCIOKGkiDilIIgZ2FpbiDilIIg4pSCXHJcbiAgICog4pSCIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilIDilJgg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUmCDilIIgIFxyXG4gICAqIOKUgiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICAgICAgICAg4pSCXHJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXHJcbiAgICogYGBgXHJcbiAgICogQGF1dGhvcnMgVGhvbWFzIERvcm5lciwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50QXVkaW8gZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEF1ZGlvKTtcclxuICAgIC8qKiBwbGFjZXMgYW5kIGRpcmVjdHMgdGhlIHBhbm5lciByZWxhdGl2ZSB0byB0aGUgd29ybGQgdHJhbnNmb3JtIG9mIHRoZSB7QGxpbmsgTm9kZX0gICovXHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG5cclxuICAgIHByb3RlY3RlZCBzaW5nbGV0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIGF1ZGlvOiBBdWRpbztcclxuICAgIHByaXZhdGUgZ2FpbjogR2Fpbk5vZGU7XHJcbiAgICBwcml2YXRlIHBhbm5lcjogUGFubmVyTm9kZTtcclxuICAgIHByaXZhdGUgc291cmNlOiBBdWRpb0J1ZmZlclNvdXJjZU5vZGU7XHJcbiAgICBwcml2YXRlIGF1ZGlvTWFuYWdlcjogQXVkaW9NYW5hZ2VyO1xyXG4gICAgcHJpdmF0ZSBwbGF5aW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9hdWRpbzogQXVkaW8gPSBudWxsLCBfbG9vcDogYm9vbGVhbiA9IGZhbHNlLCBfc3RhcnQ6IGJvb2xlYW4gPSBmYWxzZSwgX2F1ZGlvTWFuYWdlcjogQXVkaW9NYW5hZ2VyID0gQXVkaW9NYW5hZ2VyLmRlZmF1bHQpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5pbnN0YWxsKF9hdWRpb01hbmFnZXIpO1xyXG4gICAgICB0aGlzLmNyZWF0ZVNvdXJjZShfYXVkaW8sIF9sb29wKTtcclxuXHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLmhhbmRsZUF0dGFjaCk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCB0aGlzLmhhbmRsZUF0dGFjaCk7XHJcblxyXG4gICAgICBpZiAoX3N0YXJ0KVxyXG4gICAgICAgIHRoaXMucGxheShfc3RhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdm9sdW1lKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuZ2Fpbi5nYWluLnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGxvb3AoX29uOiBib29sZWFuKSB7XHJcbiAgICAgIHRoaXMuc291cmNlLmxvb3AgPSBfb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBsb29wKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2UubG9vcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHBsYXliYWNrUmF0ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUudmFsdWUgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBwbGF5YmFja1JhdGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS52YWx1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldCBpc1BsYXlpbmcoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBsYXlpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc0F0dGFjaGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5ub2RlICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc0xpc3RlbmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGdpdmVuIHtAbGluayBBdWRpb30gYXMgdGhlIGF1ZGlvIHNvdXJjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QXVkaW8oX2F1ZGlvOiBBdWRpbyk6IHZvaWQge1xyXG4gICAgICB0aGlzLmNyZWF0ZVNvdXJjZShfYXVkaW8sIHRoaXMuc291cmNlLmxvb3ApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEF1ZGlvfSBjdXJyZW50bHkgdXNlZCBhcyBhdWRpbyBzb3VyY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEF1ZGlvKCk6IEF1ZGlvIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXVkaW87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHByb3BlcnR5IG9mIHRoZSBwYW5uZXIgdG8gdGhlIGdpdmVuIHZhbHVlLiBVc2UgdG8gbWFuaXB1bGF0ZSByYW5nZSBhbmQgcm9sbG9mZiBldGMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRQYW5uZXIoX3Byb3BlcnR5OiBBVURJT19QQU5ORVIsIF92YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIFJlZmxlY3Quc2V0KHRoaXMucGFubmVyLCBfcHJvcGVydHksIF92YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogbWF5IGJlIHVzZWQgZm9yIHNlcmlhbGl6YXRpb24gb2YgQXVkaW9Ob2Rlc1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBtdXRhdG9yIGZvciB0aGUgc3BlY2lmaWVkIEF1ZGlvTm9kZSBvZiB0aGUgc3RhbmRhcmQgZ3JhcGhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3JPZk5vZGUoX3R5cGU6IEFVRElPX05PREVfVFlQRSk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbm9kZTogQXVkaW9Ob2RlID0gdGhpcy5nZXRBdWRpb05vZGUoX3R5cGUpO1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IGdldE11dGF0b3JPZkFyYml0cmFyeShub2RlKTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgQXVkaW9Ob2RlIG9mIHRoZSBzdGFuZGFyZCBncmFwaCBmb3IgZnVydGhlciBtYW5pcHVsYXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEF1ZGlvTm9kZShfdHlwZTogQVVESU9fTk9ERV9UWVBFKTogQXVkaW9Ob2RlIHtcclxuICAgICAgc3dpdGNoIChfdHlwZSkge1xyXG4gICAgICAgIGNhc2UgQVVESU9fTk9ERV9UWVBFLlNPVVJDRTogcmV0dXJuIHRoaXMuc291cmNlO1xyXG4gICAgICAgIGNhc2UgQVVESU9fTk9ERV9UWVBFLlBBTk5FUjogcmV0dXJuIHRoaXMucGFubmVyO1xyXG4gICAgICAgIGNhc2UgQVVESU9fTk9ERV9UWVBFLkdBSU46IHJldHVybiB0aGlzLmdhaW47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0IG9yIHN0b3AgcGxheWluZyB0aGUgYXVkaW9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHBsYXkoX29uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgIGlmIChfb24pIHtcclxuICAgICAgICBpZiAodGhpcy5hdWRpby5pc1JlYWR5KSB7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNvdXJjZSh0aGlzLmF1ZGlvLCB0aGlzLnNvdXJjZS5sb29wLCB0aGlzLnBsYXliYWNrUmF0ZSk7XHJcbiAgICAgICAgICB0aGlzLnNvdXJjZS5zdGFydCgwLCAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hdWRpby5hZGRFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLlJFQURZLCB0aGlzLmhuZEF1ZGlvUmVhZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNvdXJjZS5hZGRFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLkVOREVELCB0aGlzLmhuZEF1ZGlvRW5kZWQpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5zb3VyY2Uuc3RvcCgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKF9lcnJvcjogdW5rbm93bikgeyAvKiBjYXRjaCBleGNlcHRpb24gd2hlbiBzb3VyY2UgaGFzbid0IGJlZW4gc3RhcnRlZC4uLiAqLyB9XHJcbiAgICAgIHRoaXMucGxheWluZyA9IF9vbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc2VydHMgQXVkaW9Ob2RlcyBiZXR3ZWVuIHRoZSBwYW5uZXIgYW5kIHRoZSBsb2NhbCBnYWluIG9mIHRoaXMge0BsaW5rIENvbXBvbmVudEF1ZGlvfVxyXG4gICAgICogX2lucHV0IGFuZCBfb3V0cHV0IG1heSBiZSB0aGUgc2FtZSBBdWRpb05vZGUsIGlmIHRoZXJlIGlzIG9ubHkgb25lIHRvIGluc2VydCxcclxuICAgICAqIG9yIG1heSBoYXZlIG11bHRpcGxlIEF1ZGlvTm9kZSBiZXR3ZWVuIHRoZW0gdG8gY3JlYXRlIGFuIGVmZmVjdC1ncmFwaC5cXFxyXG4gICAgICogTm90ZSB0aGF0IHtAbGluayBDb21wb25lbnRBdWRpb30gZG9lcyBub3Qga2VlcCB0cmFjayBvZiBpbnNlcnRlZCBBdWRpb05vZGVzIVxyXG4gICAgICogYGBgdGV4dFxyXG4gICAgICog4pSMIEF1ZGlvTWFuYWdlciguZGVmYXVsdCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXHJcbiAgICAgKiDilIIg4pSMIENvbXBvbmVudEF1ZGlvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICDilIJcclxuICAgICAqIOKUgiDilIIgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQIOKUgiAgXHJcbiAgICAgKiDilIIg4pSCICAgIOKUgnNvdXJjZeKUgiDihpIg4pSCcGFubmVy4pSCIOKGkiDilIJfaW5wdXTilIIg4oaSIC4uLiAg4oaSIOKUgl9vdXRwdXTilIIg4oaSIOKUgiBnYWluIOKUgiDihpIg4pSCIGdhaW4g4pSCIOKUglxyXG4gICAgICog4pSCIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilIDilJggICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUgiDilJTilIDilIDilIDilIDilIDilIDilJgg4pSCICBcclxuICAgICAqIOKUgiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICAgICAgICAg4pSCXHJcbiAgICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcclxuICAgICAqIGBgYFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5zZXJ0QXVkaW9Ob2RlcyhfaW5wdXQ6IEF1ZGlvTm9kZSwgX291dHB1dDogQXVkaW9Ob2RlKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucGFubmVyLmRpc2Nvbm5lY3QoMCk7XHJcbiAgICAgIGlmICghX2lucHV0ICYmICFfb3V0cHV0KSB7XHJcbiAgICAgICAgdGhpcy5wYW5uZXIuY29ubmVjdCh0aGlzLmdhaW4pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBhbm5lci5jb25uZWN0KF9pbnB1dCk7XHJcbiAgICAgIF9vdXRwdXQuY29ubmVjdCh0aGlzLmdhaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0aXZhdGUgb3ZlcnJpZGUuIENvbm5lY3RzIG9yIGRpc2Nvbm5lY3RzIEF1ZGlvTm9kZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBzdXBlci5hY3RpdmF0ZShfb24pO1xyXG4gICAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbm5lY3RzIHRoaXMgY29tcG9uZW50cyBnYWluLW5vZGUgdG8gdGhlIGdhaW4gbm9kZSBvZiB0aGUgQXVkaW9NYW5hZ2VyIHRoaXMgY29tcG9uZW50IHJ1bnMgb24uXHJcbiAgICAgKiBPbmx5IGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIGNvbXBvbmVudCBpcyBub3QgYXR0YWNoZWQgdG8gYSB7QGxpbmsgTm9kZX0gYnV0IG5lZWRzIHRvIGJlIGhlYXJkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29ubmVjdChfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgaWYgKF9vbilcclxuICAgICAgICB0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmF1ZGlvTWFuYWdlci5nYWluKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuYXVkaW9NYW5hZ2VyLmdhaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4U2hhcGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMubm9kZS5tdHhXb3JsZCwgdGhpcy5tdHhQaXZvdCk7XHJcbiAgICAgIG10eFNoYXBlLnNjYWxpbmcgPSBuZXcgVmVjdG9yMygwLjUsIDAuNSwgMC41KTtcclxuICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IENvbG9yLkNTUyhcImNvcm5mbG93ZXJibHVlXCIpO1xyXG4gICAgICBHaXptb3MuZHJhd0ljb24oVGV4dHVyZURlZmF1bHQuaWNvbkF1ZGlvLCBtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKG10eFNoYXBlLCBjb2xvcik7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pZFJlc291cmNlID0gdGhpcy5hdWRpbz8uaWRSZXNvdXJjZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5wbGF5aW5nID0gdGhpcy5wbGF5aW5nO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmxvb3AgPSB0aGlzLmxvb3A7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udm9sdW1lID0gdGhpcy52b2x1bWU7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZ2V0TXV0YXRvck9mTm9kZShBVURJT19OT0RFX1RZUEUuUEFOTkVSKSk7XHJcbiAgICAgIC8vIFRPRE86IHNlcmlhbGl6ZSBwYW5uZXIgcGFyYW1ldGVyc1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgbGV0IGF1ZGlvOiBBdWRpbyA9IDxBdWRpbz5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLmNyZWF0ZVNvdXJjZShhdWRpbywgX3NlcmlhbGl6YXRpb24ubG9vcCk7XHJcbiAgICAgIHRoaXMudm9sdW1lID0gX3NlcmlhbGl6YXRpb24udm9sdW1lO1xyXG4gICAgICB0aGlzLnBsYXkoX3NlcmlhbGl6YXRpb24ucGxheWluZyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIGxldCBhdWRpbzogTXV0YXRvciA9IG11dGF0b3IuYXVkaW87XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLmF1ZGlvOyAvLyBqdXN0IHRvIHJlYXJyYW5nZSBpbiBpbnRlcmZhY2VzLi4uXHJcbiAgICAgIG11dGF0b3IubG9vcCA9IHRoaXMubG9vcDtcclxuICAgICAgbXV0YXRvci52b2x1bWUgPSB0aGlzLnZvbHVtZTtcclxuICAgICAgbXV0YXRvci5hdWRpbyA9IGF1ZGlvOyAvLy4uLiBzbyBhdWRpbyBjb21lcyBsYXN0XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yKTtcclxuICAgIC8vICAgLy8gdGhpcy52b2x1bWUgPSBfbXV0YXRvci52b2x1bWU7XHJcbiAgICAvLyAgIC8vIHRoaXMubG9vcCA9IF9tdXRhdG9yLmxvb3A7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgc3VwZXIucmVkdWNlTXV0YXRvcihfbXV0YXRvcik7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5saXN0ZW5lZDtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICBwcml2YXRlIGhuZEF1ZGlvUmVhZHk6IEV2ZW50TGlzdGVuZXIgPSAoX2V2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICBEZWJ1Zy5mdWRnZShcIkF1ZGlvIHN0YXJ0XCIsIFJlZmxlY3QuZ2V0KF9ldmVudC50YXJnZXQsIFwidXJsXCIpKTtcclxuICAgICAgaWYgKHRoaXMucGxheWluZylcclxuICAgICAgICB0aGlzLnBsYXkodHJ1ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgaG5kQXVkaW9FbmRlZDogRXZlbnRMaXN0ZW5lciA9IChfZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIERlYnVnLmZ1ZGdlKFwiQXVkaW8gZW5kZWRcIiwgUmVmbGVjdC5nZXQoX2V2ZW50LnRhcmdldCwgXCJ1cmxcIikpO1xyXG4gICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBpbnN0YWxsKF9hdWRpb01hbmFnZXI6IEF1ZGlvTWFuYWdlciA9IEF1ZGlvTWFuYWdlci5kZWZhdWx0KTogdm9pZCB7XHJcbiAgICAgIGxldCBhY3RpdmU6IGJvb2xlYW4gPSB0aGlzLmlzQWN0aXZlO1xyXG4gICAgICB0aGlzLmFjdGl2YXRlKGZhbHNlKTtcclxuICAgICAgdGhpcy5hdWRpb01hbmFnZXIgPSBfYXVkaW9NYW5hZ2VyO1xyXG4gICAgICB0aGlzLnBhbm5lciA9IF9hdWRpb01hbmFnZXIuY3JlYXRlUGFubmVyKCk7XHJcbiAgICAgIHRoaXMuZ2FpbiA9IF9hdWRpb01hbmFnZXIuY3JlYXRlR2FpbigpO1xyXG4gICAgICB0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbik7XHJcbiAgICAgIHRoaXMuZ2Fpbi5jb25uZWN0KF9hdWRpb01hbmFnZXIuZ2Fpbik7XHJcbiAgICAgIHRoaXMuYWN0aXZhdGUoYWN0aXZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVNvdXJjZShfYXVkaW86IEF1ZGlvLCBfbG9vcDogYm9vbGVhbiwgX3BsYXliYWNrUmF0ZTogbnVtYmVyID0gMS4wKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLnNvdXJjZSkge1xyXG4gICAgICAgIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB0aGlzLnNvdXJjZS5idWZmZXIgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc291cmNlID0gdGhpcy5hdWRpb01hbmFnZXIuY3JlYXRlQnVmZmVyU291cmNlKCk7XHJcbiAgICAgIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5wYW5uZXIpO1xyXG5cclxuICAgICAgaWYgKF9hdWRpbykge1xyXG4gICAgICAgIHRoaXMuYXVkaW8gPSBfYXVkaW87XHJcbiAgICAgICAgdGhpcy5zb3VyY2UuYnVmZmVyID0gX2F1ZGlvLmJ1ZmZlcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zb3VyY2UubG9vcCA9IF9sb29wO1xyXG4gICAgICB0aGlzLnBsYXliYWNrUmF0ZSA9IF9wbGF5YmFja1JhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDb25uZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCh0aGlzLmlzQWN0aXZlICYmIHRoaXMuaXNBdHRhY2hlZCAmJiB0aGlzLmxpc3RlbmVkKTtcclxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XHJcbiAgICAgICAgLy8gbm9wXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBBdXRvbWF0aWNhbGx5IGNvbm5lY3RzL2Rpc2Nvbm5lY3RzIEF1ZGlvTm9kZXMgd2hlbiBhZGRpbmcvcmVtb3ZpbmcgdGhpcyBjb21wb25lbnQgdG8vZnJvbSBhIG5vZGUuIFxyXG4gICAgICogVGhlcmVmb3JlIHVudXNlZCBBdWRpb05vZGVzIG1heSBiZSBnYXJiYWdlIGNvbGxlY3RlZCB3aGVuIGFuIHVudXNlZCBjb21wb25lbnQgaXMgY29sbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQXR0YWNoID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgLy8gRGVidWcubG9nKF9ldmVudCk7XHJcbiAgICAgIGlmIChfZXZlbnQudHlwZSA9PSBFVkVOVC5DT01QT05FTlRfQUREKSB7XHJcbiAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5ELCB0aGlzLmhhbmRsZUdyYXBoLCB0cnVlKTtcclxuICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5DSElMRF9SRU1PVkUsIHRoaXMuaGFuZGxlR3JhcGgsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLlVQREFURSwgdGhpcy51cGRhdGUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZWQgPSB0aGlzLm5vZGUuaXNEZXNjZW5kYW50T2YoQXVkaW9NYW5hZ2VyLmRlZmF1bHQuZ2V0R3JhcGhMaXN0ZW5pbmdUbygpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5DSElMRF9BUFBFTkQsIHRoaXMuaGFuZGxlR3JhcGgsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLkNISUxEX1JFTU9WRSwgdGhpcy5oYW5kbGVHcmFwaCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlRfQVVESU8uVVBEQVRFLCB0aGlzLnVwZGF0ZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBkYXRlQ29ubmVjdGlvbigpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBBdXRvbWF0aWNhbGx5IGNvbm5lY3RzL2Rpc2Nvbm5lY3RzIEF1ZGlvTm9kZXMgd2hlbiBhcHBlbmRpbmcvcmVtb3ZpbmcgdGhlIEZVREdFLWdyYXBoIHRoZSBjb21wb25lbnQgaXMgaW4uIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUdyYXBoID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgLy8gRGVidWcubG9nKF9ldmVudCk7XHJcbiAgICAgIHRoaXMubGlzdGVuZWQgPSAoX2V2ZW50LnR5cGUgPT0gRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5EKTtcclxuICAgICAgdGhpcy51cGRhdGVDb25uZWN0aW9uKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBcclxuICAgICAqIFVwZGF0ZXMgdGhlIHBhbm5lciBub2RlLCBpdHMgcG9zaXRpb24gYW5kIGRpcmVjdGlvbiwgdXNpbmcgdGhlIHdvcmxkbWF0cml4IG9mIHRoZSBjb250YWluZXIgYW5kIHRoZSBwaXZvdCBvZiB0aGlzIGNvbXBvbmVudC4gXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gdGhpcy5tdHhQaXZvdDtcclxuICAgICAgaWYgKHRoaXMubm9kZSlcclxuICAgICAgICBtdHhSZXN1bHQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG5cclxuICAgICAgLy8gRGVidWcubG9nKG10eFJlc3VsdC50b1N0cmluZygpKTtcclxuICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IzID0gbXR4UmVzdWx0LnRyYW5zbGF0aW9uO1xyXG4gICAgICBsZXQgZm9yd2FyZDogVmVjdG9yMyA9IFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oVmVjdG9yMy5aKDEpLCBtdHhSZXN1bHQsIGZhbHNlKTtcclxuXHJcbiAgICAgIHRoaXMucGFubmVyLnBvc2l0aW9uWC52YWx1ZSA9IHBvc2l0aW9uLng7XHJcbiAgICAgIHRoaXMucGFubmVyLnBvc2l0aW9uWS52YWx1ZSA9IHBvc2l0aW9uLnk7XHJcbiAgICAgIHRoaXMucGFubmVyLnBvc2l0aW9uWi52YWx1ZSA9IHBvc2l0aW9uLno7XHJcblxyXG4gICAgICB0aGlzLnBhbm5lci5vcmllbnRhdGlvblgudmFsdWUgPSBmb3J3YXJkLng7XHJcbiAgICAgIHRoaXMucGFubmVyLm9yaWVudGF0aW9uWS52YWx1ZSA9IGZvcndhcmQueTtcclxuICAgICAgdGhpcy5wYW5uZXIub3JpZW50YXRpb25aLnZhbHVlID0gZm9yd2FyZC56O1xyXG5cclxuICAgICAgUmVjeWNsZXIuc3RvcmUoZm9yd2FyZCk7XHJcbiAgICAgIC8vIFRPRE86IGV4YW1pbmUgd2h5IHRoZSBmb2xsb3dpbmcgcHJvZHVjZXMgZXJyb25lb3VzIHJlc3VsdHMsIHNlZSB0ZXN0IFwiU3BhdGlhbCBBdWRpb1wiXHJcbiAgICAgIGlmICh0aGlzLm5vZGUpXHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogU2VydmVzIHRvIHNldCB0aGUgc3BhdGlhbCBsb2NhdGlvbiBhbmQgb3JpZW50YXRpb24gb2YgQXVkaW9MaXN0ZW5lcnMgcmVsYXRpdmUgdG8gdGhlXHJcbiAgICogd29ybGQgdHJhbnNmb3JtIG9mIHRoZSB7QGxpbmsgTm9kZX0gaXQgaXMgYXR0YWNoZWQgdG8uXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50QXVkaW9MaXN0ZW5lciBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50QXVkaW9MaXN0ZW5lcik7XHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgcG9zaXRpb24gYW5kIG9yaWVudGF0aW9uIG9mIHRoZSBnaXZlbiBBdWRpb0xpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGUoX2xpc3RlbmVyOiBBdWRpb0xpc3RlbmVyKTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4UGl2b3Q7XHJcbiAgICAgIGlmICh0aGlzLm5vZGUpXHJcbiAgICAgICAgbXR4UmVzdWx0ID0gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5ub2RlLm10eFdvcmxkLCB0aGlzLm10eFBpdm90KTtcclxuXHJcbiAgICAgIC8vIERlYnVnLmxvZyhtdHhSZXN1bHQudG9TdHJpbmcoKSk7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IG10eFJlc3VsdC50cmFuc2xhdGlvbjtcclxuICAgICAgbGV0IGZvcndhcmQ6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKFZlY3RvcjMuWigxKSwgbXR4UmVzdWx0LCBmYWxzZSk7XHJcbiAgICAgIGxldCB1cDogVmVjdG9yMyA9IFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oVmVjdG9yMy5ZKCksIG10eFJlc3VsdCwgZmFsc2UpO1xyXG4gICAgICBpZiAoX2xpc3RlbmVyLnBvc2l0aW9uWCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBfbGlzdGVuZXIucG9zaXRpb25YLnZhbHVlID0gcG9zaXRpb24ueDtcclxuICAgICAgICBfbGlzdGVuZXIucG9zaXRpb25ZLnZhbHVlID0gcG9zaXRpb24ueTtcclxuICAgICAgICBfbGlzdGVuZXIucG9zaXRpb25aLnZhbHVlID0gcG9zaXRpb24uejtcclxuXHJcbiAgICAgICAgX2xpc3RlbmVyLmZvcndhcmRYLnZhbHVlID0gZm9yd2FyZC54O1xyXG4gICAgICAgIF9saXN0ZW5lci5mb3J3YXJkWS52YWx1ZSA9IGZvcndhcmQueTtcclxuICAgICAgICBfbGlzdGVuZXIuZm9yd2FyZFoudmFsdWUgPSBmb3J3YXJkLno7XHJcblxyXG4gICAgICAgIF9saXN0ZW5lci51cFgudmFsdWUgPSB1cC54O1xyXG4gICAgICAgIF9saXN0ZW5lci51cFkudmFsdWUgPSB1cC55O1xyXG4gICAgICAgIF9saXN0ZW5lci51cFoudmFsdWUgPSB1cC56O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEZpcmVmb3ggc3RpbGwgdXNlcyBkZXByZWNhdGVkIG1ldGhvZHMuIFRPRE86IGRlbGV0ZSBhcyBzb29uIGFzIHBvc3NpYmxlIVxyXG4gICAgICAgIF9saXN0ZW5lci5zZXRQb3NpdGlvbihwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KTtcclxuICAgICAgICBfbGlzdGVuZXIuc2V0T3JpZW50YXRpb24oZm9yd2FyZC54LCBmb3J3YXJkLnksIGZvcndhcmQueiwgdXAueCwgdXAueSwgdXAueik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKGZvcndhcmQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh1cCk7XHJcbiAgICAgIGlmICh0aGlzLm5vZGUpXHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuXHJcbiAgICAgIC8vIERlYnVnLmxvZyhtdHhSZXN1bHQudHJhbnNsYXRpb24udG9TdHJpbmcoKSwgZm9yd2FyZC50b1N0cmluZygpLCB1cC50b1N0cmluZygpKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQXR0YWNoZWQgdG8gYSB7QGxpbmsgTm9kZX0gd2l0aCBhbiBhdHRhY2hlZCB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSB0aGlzIGNhdXNlcyB0aGUgcmVuZGVyZWQgaW1hZ2UgdG8gcmVjZWl2ZSBhIGJsb29tLWVmZmVjdC5cclxuICAgKiBAYXV0aG9ycyBSb2xhbmQgSGVlciwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEJsb29tIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRCbG9vbSk7XHJcbiAgICBcclxuICAgICN0aHJlc2hvbGQ6IG51bWJlcjtcclxuICAgICNpbnRlbnNpdHk6IG51bWJlcjtcclxuICAgICNoaWdobGlnaHREZXNhdHVyYXRpb246IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3RocmVzaG9sZDogbnVtYmVyID0gMC45NSwgX2ludGVuc2l0eTogbnVtYmVyID0gMS4wLCBfZGVzYXR1cmF0ZUhpZ2hsaWdodHM6IG51bWJlciA9IDAuNSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLiN0aHJlc2hvbGQgPSBfdGhyZXNob2xkO1xyXG4gICAgICB0aGlzLiNpbnRlbnNpdHkgPSBfaW50ZW5zaXR5O1xyXG4gICAgICB0aGlzLiNoaWdobGlnaHREZXNhdHVyYXRpb24gPSBfZGVzYXR1cmF0ZUhpZ2hsaWdodHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0aHJlc2hvbGQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RocmVzaG9sZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGhyZXNob2xkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3RocmVzaG9sZCA9IENhbGMuY2xhbXAoX3ZhbHVlLCAwLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGludGVuc2l0eSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaW50ZW5zaXR5O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBpbnRlbnNpdHkoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jaW50ZW5zaXR5ID0gTWF0aC5tYXgoMCwgX3ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGhpZ2hsaWdodERlc2F0dXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaGlnaGxpZ2h0RGVzYXR1cmF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBoaWdobGlnaHREZXNhdHVyYXRpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jaGlnaGxpZ2h0RGVzYXR1cmF0aW9uID0gQ2FsYy5jbGFtcChfdmFsdWUsIDAsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgdGhyZXNob2xkOiB0aGlzLiN0aHJlc2hvbGQsXHJcbiAgICAgICAgaW50ZW5zaXR5OiB0aGlzLiNpbnRlbnNpdHksXHJcbiAgICAgICAgZGVzYXR1cmF0ZUhpZ2hsaWdodHM6IHRoaXMuI2hpZ2hsaWdodERlc2F0dXJhdGlvbixcclxuICAgICAgfTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLiN0aHJlc2hvbGQgPSBfc2VyaWFsaXphdGlvbi50aHJlc2hvbGQ7XHJcbiAgICAgIHRoaXMuI2ludGVuc2l0eSA9IF9zZXJpYWxpemF0aW9uLmludGVuc2l0eTtcclxuICAgICAgdGhpcy4jaGlnaGxpZ2h0RGVzYXR1cmF0aW9uID0gX3NlcmlhbGl6YXRpb24uZGVzYXR1cmF0ZUhpZ2hsaWdodHM7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgbXV0YXRvci50aHJlc2hvbGQgPSB0aGlzLnRocmVzaG9sZDtcclxuICAgICAgbXV0YXRvci5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5oaWdobGlnaHREZXNhdHVyYXRpb24gPSB0aGlzLmhpZ2hsaWdodERlc2F0dXJhdGlvbjtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJDb21wb25lbnQudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBlbnVtIEZJRUxEX09GX1ZJRVcge1xyXG4gICAgSE9SSVpPTlRBTCA9IFwiaG9yaXpvbnRhbFwiLFxyXG4gICAgVkVSVElDQUwgPSBcInZlcnRpY2FsXCIsXHJcbiAgICBESUFHT05BTCA9IFwiZGlhZ29uYWxcIlxyXG4gIH1cclxuICAvKipcclxuICAgKiBEZWZpbmVzIGlkZW50aWZpZXJzIGZvciB0aGUgdmFyaW91cyBwcm9qZWN0aW9ucyBhIGNhbWVyYSBjYW4gcHJvdmlkZS4gIFxyXG4gICAqIFRPRE86IGNoYW5nZSBiYWNrIHRvIG51bWJlciBlbnVtIGlmIHN0cmluZ3Mgbm90IG5lZWRlZFxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIFBST0pFQ1RJT04ge1xyXG4gICAgQ0VOVFJBTCA9IFwiY2VudHJhbFwiLFxyXG4gICAgT1JUSE9HUkFQSElDID0gXCJvcnRob2dyYXBoaWNcIixcclxuICAgIERJTUVUUklDID0gXCJkaW1ldHJpY1wiLFxyXG4gICAgU1RFUkVPID0gXCJzdGVyZW9cIlxyXG4gIH1cclxuICAvKipcclxuICAgKiBUaGUgY2FtZXJhIGNvbXBvbmVudCBob2xkcyB0aGUgcHJvamVjdGlvbi1tYXRyaXggYW5kIG90aGVyIGRhdGEgbmVlZGVkIHRvIHJlbmRlciBhIHNjZW5lIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBub2RlIGl0IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAqIEBhdXRob3JzIEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50Q2FtZXJhIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRDYW1lcmEpO1xyXG5cclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcbiAgICBwdWJsaWMgY2xyQmFja2dyb3VuZDogQ29sb3IgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMSk7IC8vIFRoZSBjb2xvciBvZiB0aGUgYmFja2dyb3VuZCB0aGUgY2FtZXJhIHdpbGwgcmVuZGVyLlxyXG4gICAgLy9wcml2YXRlIG9ydGhvZ3JhcGhpYzogYm9vbGVhbiA9IGZhbHNlOyAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGltYWdlIHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBwZXJzcGVjdGl2ZSBvciBvcnRob2dyYXBoaWMgcHJvamVjdGlvbi5cclxuICAgIHByaXZhdGUgcHJvamVjdGlvbjogUFJPSkVDVElPTiA9IFBST0pFQ1RJT04uQ0VOVFJBTDtcclxuICAgIHByaXZhdGUgZmllbGRPZlZpZXc6IG51bWJlciA9IDQ1OyAvLyBUaGUgY2FtZXJhJ3Mgc2Vuc29yYW5nbGUuXHJcbiAgICBwcml2YXRlIGFzcGVjdFJhdGlvOiBudW1iZXIgPSAxLjA7XHJcbiAgICBwcml2YXRlIGRpcmVjdGlvbjogRklFTERfT0ZfVklFVyA9IEZJRUxEX09GX1ZJRVcuRElBR09OQUw7XHJcbiAgICBwcml2YXRlIG5lYXI6IG51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIGZhcjogbnVtYmVyID0gMjAwMDtcclxuICAgIHByaXZhdGUgYmFja2dyb3VuZEVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlOyAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBiYWNrZ3JvdW5kIG9mIHRoaXMgY2FtZXJhIHdpbGwgYmUgcmVuZGVyZWQuXHJcbiAgICAvLyBUT0RPOiBleGFtaW5lLCBpZiBiYWNrZ3JvdW5kIHNob3VsZCBiZSBhbiBhdHRyaWJ1dGUgb2YgQ2FtZXJhIG9yIFZpZXdwb3J0XHJcblxyXG4gICAgI210eFdvcmxkVG9WaWV3OiBNYXRyaXg0eDQ7XHJcbiAgICAjbXR4Q2FtZXJhSW52ZXJzZTogTWF0cml4NHg0O1xyXG4gICAgI210eFByb2plY3Rpb246IE1hdHJpeDR4NCA9IG5ldyBNYXRyaXg0eDQ7IC8vIFRoZSBtYXRyaXggdG8gbXVsdGlwbHkgZWFjaCBzY2VuZSBvYmplY3RzIHRyYW5zZm9ybWF0aW9uIGJ5LCB0byBkZXRlcm1pbmUgd2hlcmUgaXQgd2lsbCBiZSBkcmF3bi5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMgd29ybGR0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaS5lLiB0aGUgdHJhbnNmb3JtYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGdyYXBoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbXR4V29ybGQoKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG10eENhbWVyYTogTWF0cml4NHg0ID0gdGhpcy5tdHhQaXZvdC5jbG9uZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBtdHhDYW1lcmEgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICAvLyBubyBjb250YWluZXIgbm9kZSBvciBubyB3b3JsZCB0cmFuc2Zvcm1hdGlvbiBmb3VuZCAtPiBjb250aW51ZSB3aXRoIHBpdm90IG9ubHlcclxuICAgICAgICAvLyBUT0RPOiBtYXliZSB1c2UgaWYgKCkgdGhlbiBpbnN0ZWFkIG9mIHRyeSBjYXRjaFxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBtdHhDYW1lcmE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0aGUgd29ybGR0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgY2FtZXJhIGNvbnRhaW5lciwgdGhlIHBpdm90IG9mIHRoaXMgY2FtZXJhIGFuZCB0aGUgaW52ZXJzaW9uIG9mIHRoZSBwcm9qZWN0aW9uIG1hdHJpeFxyXG4gICAgICogeWllbGRpbmcgdGhlIHdvcmxkc3BhY2UgdG8gdmlld3NwYWNlIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG10eFdvcmxkVG9WaWV3KCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhXb3JsZFRvVmlldylcclxuICAgICAgICByZXR1cm4gdGhpcy4jbXR4V29ybGRUb1ZpZXc7XHJcblxyXG4gICAgICAvL1RPRE86IG9wdGltaXplLCBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIGlmIG5laXRoZXIgbXR4V29ybGQgbm9yIHBpdm90IGhhdmUgY2hhbmdlZFxyXG4gICAgICB0aGlzLiNtdHhXb3JsZFRvVmlldyA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMuI210eFByb2plY3Rpb24sIHRoaXMubXR4Q2FtZXJhSW52ZXJzZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtdHhXb3JsZFRvVmlldztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGludmVyc2lvbiBvZiB0aGlzIGNhbWVyYXMgd29ybGR0cmFuc2Zvcm1hdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG10eENhbWVyYUludmVyc2UoKTogTWF0cml4NHg0IHtcclxuICAgICAgaWYgKHRoaXMuI210eENhbWVyYUludmVyc2UpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI210eENhbWVyYUludmVyc2U7XHJcblxyXG4gICAgICAvL1RPRE86IG9wdGltaXplLCBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIGlmIG5laXRoZXIgbXR4V29ybGQgbm9yIHBpdm90IGhhdmUgY2hhbmdlZFxyXG4gICAgICB0aGlzLiNtdHhDYW1lcmFJbnZlcnNlID0gTWF0cml4NHg0LklOVkVSU0UodGhpcy5tdHhXb3JsZCk7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtdHhDYW1lcmFJbnZlcnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcHJvamVjdGlvbm1hdHJpeCBvZiB0aGlzIGNhbWVyYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG10eFByb2plY3Rpb24oKTogTWF0cml4NHg0IHtcclxuICAgICAgaWYgKHRoaXMuI210eFByb2plY3Rpb24pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI210eFByb2plY3Rpb247XHJcblxyXG4gICAgICAvL1RPRE86IG9wdGltaXplLCBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIGlmIG5laXRoZXIgbXR4V29ybGQgbm9yIHBpdm90IGhhdmUgY2hhbmdlZFxyXG4gICAgICB0aGlzLiNtdHhQcm9qZWN0aW9uID0gbmV3IE1hdHJpeDR4NDtcclxuICAgICAgcmV0dXJuIHRoaXMuI210eFByb2plY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhpcyBjYW1lcmFzIHtAbGluayBtdHhXb3JsZFRvVmlld30gYW5kIHtAbGluayBtdHhDYW1lcmFJbnZlcnNlfSBtYXRyaWNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXRXb3JsZFRvVmlldygpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuI210eFdvcmxkVG9WaWV3KSBSZWN5Y2xlci5zdG9yZSh0aGlzLiNtdHhXb3JsZFRvVmlldyk7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhDYW1lcmFJbnZlcnNlKSBSZWN5Y2xlci5zdG9yZSh0aGlzLiNtdHhDYW1lcmFJbnZlcnNlKTtcclxuICAgICAgdGhpcy4jbXR4V29ybGRUb1ZpZXcgPSBudWxsO1xyXG4gICAgICB0aGlzLiNtdHhDYW1lcmFJbnZlcnNlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMge0BsaW5rIFBST0pFQ1RJT059IG1vZGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFByb2plY3Rpb24oKTogUFJPSkVDVElPTiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGJhY2tncm91bmQgb2YgdGhlIGNhbWVyYSBzaG91bGQgYmUgcmVuZGVyZWQsIGZhbHNlIGlmIG5vdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QmFja2dyb3VuZEVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmJhY2tncm91bmRFbmFibGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY2FtZXJhcyBhc3BlY3QgcmF0aW9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFzcGVjdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5hc3BlY3RSYXRpbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMgZmllbGQgb2YgdmlldyBpbiBkZWdyZWVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGaWVsZE9mVmlldygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5maWVsZE9mVmlldztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMgZGlyZWN0aW9uIGkuZS4gdGhlIHBsYW5lIG9uIHdoaWNoIHRoZSBmaWVsZE9mVmlldy1BbmdsZSBpcyBnaXZlblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGlyZWN0aW9uKCk6IEZJRUxEX09GX1ZJRVcge1xyXG4gICAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjYW1lcmFzIG5lYXIgdmFsdWUgaS5lLiB0aGUgbWluaW11bSBkaXN0YW5jZSB0byByZW5kZXIgb2JqZWN0cyBhdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TmVhcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5uZWFyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY2FtZXJhcyBmYXIgdmFsdWUgaS5lLiB0aGUgbWF4aW11bSBkaXN0YW5jZSB0byByZW5kZXIgb2JqZWN0cyBhdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RmFyKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZhcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY2FtZXJhIHRvIHBlcnNwZWN0aXZlIHByb2plY3Rpb24uIFRoZSB3b3JsZCBvcmlnaW4gaXMgaW4gdGhlIGNlbnRlciBvZiB0aGUgY2FudmFzZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSBfYXNwZWN0IFRoZSBhc3BlY3QgcmF0aW8gYmV0d2VlbiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHByb2plY3Rpb25zcGFjZS4oRGVmYXVsdCA9IGNhbnZhcy5jbGllbnRXaWR0aCAvIGNhbnZhcy5DbGllbnRIZWlnaHQpXHJcbiAgICAgKiBAcGFyYW0gX2ZpZWxkT2ZWaWV3IFRoZSBmaWVsZCBvZiB2aWV3IGluIERlZ3JlZXMuIChEZWZhdWx0ID0gNDUpXHJcbiAgICAgKiBAcGFyYW0gX2RpcmVjdGlvbiBUaGUgcGxhbmUgb24gd2hpY2ggdGhlIGZpZWxkT2ZWaWV3LUFuZ2xlIGlzIGdpdmVuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvamVjdENlbnRyYWwoX2FzcGVjdDogbnVtYmVyID0gdGhpcy5hc3BlY3RSYXRpbywgX2ZpZWxkT2ZWaWV3OiBudW1iZXIgPSB0aGlzLmZpZWxkT2ZWaWV3LCBfZGlyZWN0aW9uOiBGSUVMRF9PRl9WSUVXID0gdGhpcy5kaXJlY3Rpb24sIF9uZWFyOiBudW1iZXIgPSB0aGlzLm5lYXIsIF9mYXI6IG51bWJlciA9IHRoaXMuZmFyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYXNwZWN0UmF0aW8gPSBfYXNwZWN0O1xyXG4gICAgICB0aGlzLmZpZWxkT2ZWaWV3ID0gX2ZpZWxkT2ZWaWV3O1xyXG4gICAgICB0aGlzLmRpcmVjdGlvbiA9IF9kaXJlY3Rpb247XHJcbiAgICAgIHRoaXMucHJvamVjdGlvbiA9IFBST0pFQ1RJT04uQ0VOVFJBTDtcclxuICAgICAgdGhpcy5uZWFyID0gX25lYXI7XHJcbiAgICAgIHRoaXMuZmFyID0gX2ZhcjtcclxuICAgICAgdGhpcy4jbXR4UHJvamVjdGlvbiA9IE1hdHJpeDR4NC5QUk9KRUNUSU9OX0NFTlRSQUwoX2FzcGVjdCwgdGhpcy5maWVsZE9mVmlldywgX25lYXIsIF9mYXIsIHRoaXMuZGlyZWN0aW9uKTsgLy8gVE9ETzogcmVtb3ZlIG1hZ2ljIG51bWJlcnNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY2FtZXJhIHRvIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uLiBEZWZhdWx0IHZhbHVlcyBhcmUgZGVyaXZlZCB0aGUgY2FudmFzIGNsaWVudCBkaW1lbnNpb25zXHJcbiAgICAgKiBAcGFyYW0gX2xlZnQgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIGxlZnQgYm9yZGVyLiAgICBcclxuICAgICAqIEBwYXJhbSBfcmlnaHQgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIHJpZ2h0IGJvcmRlci4gIFxyXG4gICAgICogQHBhcmFtIF9ib3R0b20gVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIGJvdHRvbSBib3JkZXIuXHJcbiAgICAgKiBAcGFyYW0gX3RvcCBUaGUgcG9zaXRpb252YWx1ZSBvZiB0aGUgcHJvamVjdGlvbnNwYWNlJ3MgdG9wIGJvcmRlci4gICAgICBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb2plY3RPcnRob2dyYXBoaWMoX2xlZnQ6IG51bWJlciA9IC1SZW5kZXIuZ2V0Q2FudmFzKCkuY2xpZW50V2lkdGggLyAyLCBfcmlnaHQ6IG51bWJlciA9IFJlbmRlci5nZXRDYW52YXMoKS5jbGllbnRXaWR0aCAvIDIsIF9ib3R0b206IG51bWJlciA9IFJlbmRlci5nZXRDYW52YXMoKS5jbGllbnRIZWlnaHQgLyAyLCBfdG9wOiBudW1iZXIgPSAtUmVuZGVyLmdldENhbnZhcygpLmNsaWVudEhlaWdodCAvIDIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5wcm9qZWN0aW9uID0gUFJPSkVDVElPTi5PUlRIT0dSQVBISUM7XHJcbiAgICAgIHRoaXMuI210eFByb2plY3Rpb24gPSBNYXRyaXg0eDQuUFJPSkVDVElPTl9PUlRIT0dSQVBISUMoX2xlZnQsIF9yaWdodCwgX2JvdHRvbSwgX3RvcCwgNDAwLCAtNDAwKTsgLy8gVE9ETzogZXhhbWluZSBtYWdpYyBudW1iZXJzIVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBjYWxjdWxhdGVkIGRpbWVuc2lvbiBvZiBhIHByb2plY3Rpb24gc3VyZmFjZSBpbiB0aGUgaHlwb3RoZXRpY2FsIGRpc3RhbmNlIG9mIDEgdG8gdGhlIGNhbWVyYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UHJvamVjdGlvblJlY3RhbmdsZSgpOiBSZWN0YW5nbGUge1xyXG4gICAgICBsZXQgdGFuRm92OiBudW1iZXIgPSBNYXRoLnRhbihNYXRoLlBJICogdGhpcy5maWVsZE9mVmlldyAvIDM2MCk7IC8vIEhhbGYgb2YgdGhlIGFuZ2xlLCB0byBjYWxjdWxhdGUgZGltZW5zaW9uIGZyb20gdGhlIGNlbnRlciAtPiByaWdodCBhbmdsZVxyXG4gICAgICBsZXQgdGFuSG9yaXpvbnRhbDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHRhblZlcnRpY2FsOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09IEZJRUxEX09GX1ZJRVcuRElBR09OQUwpIHtcclxuICAgICAgICBsZXQgYXNwZWN0OiBudW1iZXIgPSBNYXRoLnNxcnQodGhpcy5hc3BlY3RSYXRpbyk7XHJcbiAgICAgICAgdGFuSG9yaXpvbnRhbCA9IHRhbkZvdiAqIGFzcGVjdDtcclxuICAgICAgICB0YW5WZXJ0aWNhbCA9IHRhbkZvdiAvIGFzcGVjdDtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpcmVjdGlvbiA9PSBGSUVMRF9PRl9WSUVXLlZFUlRJQ0FMKSB7XHJcbiAgICAgICAgdGFuVmVydGljYWwgPSB0YW5Gb3Y7XHJcbiAgICAgICAgdGFuSG9yaXpvbnRhbCA9IHRhblZlcnRpY2FsICogdGhpcy5hc3BlY3RSYXRpbztcclxuICAgICAgfSBlbHNlIHsvL0ZPVl9ESVJFQ1RJT04uSE9SSVpPTlRBTFxyXG4gICAgICAgIHRhbkhvcml6b250YWwgPSB0YW5Gb3Y7XHJcbiAgICAgICAgdGFuVmVydGljYWwgPSB0YW5Ib3Jpem9udGFsIC8gdGhpcy5hc3BlY3RSYXRpbztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIFJlY3RhbmdsZS5HRVQoMCwgMCwgdGFuSG9yaXpvbnRhbCAqIDIsIHRhblZlcnRpY2FsICogMik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBwb2ludCBmcm9tIHdvcmxkIHNwYWNlIHRvIGNsaXAgc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50V29ybGRUb0NsaXAoX3BvaW50SW5Xb3JsZFNwYWNlOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjM7XHJcbiAgICAgIGxldCBtOiBGbG9hdDMyQXJyYXkgPSB0aGlzLm10eFdvcmxkVG9WaWV3LmdldCgpO1xyXG4gICAgICBsZXQgdzogbnVtYmVyID0gbVszXSAqIF9wb2ludEluV29ybGRTcGFjZS54ICsgbVs3XSAqIF9wb2ludEluV29ybGRTcGFjZS55ICsgbVsxMV0gKiBfcG9pbnRJbldvcmxkU3BhY2UueiArIG1bMTVdO1xyXG5cclxuICAgICAgcmVzdWx0ID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9pbnRJbldvcmxkU3BhY2UsIHRoaXMubXR4V29ybGRUb1ZpZXcpO1xyXG4gICAgICByZXN1bHQuc2NhbGUoMSAvIHcpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gcG9pbnQgZnJvbSBjbGlwIHNwYWNlIHRvIHdvcmxkIHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaXBUb1dvcmxkKF9wb2ludEluQ2xpcFNwYWNlOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBtdHhWaWV3VG9Xb3JsZDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklOVkVSU0UodGhpcy5tdHhXb3JsZFRvVmlldyk7XHJcbiAgICAgIGxldCBtOiBGbG9hdDMyQXJyYXkgPSBtdHhWaWV3VG9Xb3JsZC5nZXQoKTtcclxuICAgICAgbGV0IHJheVdvcmxkOiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9pbnRJbkNsaXBTcGFjZSwgbXR4Vmlld1RvV29ybGQsIHRydWUpO1xyXG4gICAgICBsZXQgdzogbnVtYmVyID0gbVszXSAqIF9wb2ludEluQ2xpcFNwYWNlLnggKyBtWzddICogX3BvaW50SW5DbGlwU3BhY2UueSArIG1bMTFdICogX3BvaW50SW5DbGlwU3BhY2UueiArIG1bMTVdO1xyXG4gICAgICByYXlXb3JsZC5zY2FsZSgxIC8gdyk7XHJcblxyXG4gICAgICByZXR1cm4gcmF5V29ybGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuY2xyQmFja2dyb3VuZCxcclxuICAgICAgICBiYWNrZ3JvdW5kRW5hYmxlZDogdGhpcy5iYWNrZ3JvdW5kRW5hYmxlZCxcclxuICAgICAgICBwcm9qZWN0aW9uOiB0aGlzLnByb2plY3Rpb24sXHJcbiAgICAgICAgZmllbGRPZlZpZXc6IHRoaXMuZmllbGRPZlZpZXcsXHJcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbixcclxuICAgICAgICBuZWFyOiB0aGlzLm5lYXIsXHJcbiAgICAgICAgZmFyOiB0aGlzLmZhcixcclxuICAgICAgICBhc3BlY3Q6IHRoaXMuYXNwZWN0UmF0aW8sXHJcbiAgICAgICAgcGl2b3Q6IHRoaXMubXR4UGl2b3Quc2VyaWFsaXplKCksXHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmNsckJhY2tncm91bmQuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYmFja2dyb3VuZENvbG9yKTtcclxuICAgICAgdGhpcy5iYWNrZ3JvdW5kRW5hYmxlZCA9IF9zZXJpYWxpemF0aW9uLmJhY2tncm91bmRFbmFibGVkO1xyXG4gICAgICB0aGlzLnByb2plY3Rpb24gPSBfc2VyaWFsaXphdGlvbi5wcm9qZWN0aW9uO1xyXG4gICAgICB0aGlzLmZpZWxkT2ZWaWV3ID0gX3NlcmlhbGl6YXRpb24uZmllbGRPZlZpZXc7XHJcbiAgICAgIHRoaXMuYXNwZWN0UmF0aW8gPSBfc2VyaWFsaXphdGlvbi5hc3BlY3Q7XHJcbiAgICAgIHRoaXMuZGlyZWN0aW9uID0gX3NlcmlhbGl6YXRpb24uZGlyZWN0aW9uO1xyXG4gICAgICB0aGlzLm5lYXIgPSBfc2VyaWFsaXphdGlvbi5uZWFyID8/IHRoaXMubmVhcjtcclxuICAgICAgdGhpcy5mYXIgPSBfc2VyaWFsaXphdGlvbi5mYXIgPz8gdGhpcy5mYXI7XHJcbiAgICAgIGF3YWl0IHRoaXMubXR4UGl2b3QuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ucGl2b3QpO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5wcm9qZWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBQUk9KRUNUSU9OLk9SVEhPR1JBUEhJQzpcclxuICAgICAgICAgIHRoaXMucHJvamVjdE9ydGhvZ3JhcGhpYygpOyAvLyBUT0RPOiBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIHBhcmFtZXRlcnNcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUFJPSkVDVElPTi5DRU5UUkFMOlxyXG4gICAgICAgICAgdGhpcy5wcm9qZWN0Q2VudHJhbCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0gc3VwZXIuZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yKTtcclxuICAgICAgaWYgKHR5cGVzLmRpcmVjdGlvbilcclxuICAgICAgICB0eXBlcy5kaXJlY3Rpb24gPSBGSUVMRF9PRl9WSUVXO1xyXG4gICAgICBpZiAodHlwZXMucHJvamVjdGlvbilcclxuICAgICAgICB0eXBlcy5wcm9qZWN0aW9uID0gUFJPSkVDVElPTjtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMucHJvamVjdGlvbikge1xyXG4gICAgICAgIGNhc2UgUFJPSkVDVElPTi5DRU5UUkFMOlxyXG4gICAgICAgICAgdGhpcy5wcm9qZWN0Q2VudHJhbCh0aGlzLmFzcGVjdFJhdGlvLCB0aGlzLmZpZWxkT2ZWaWV3LCB0aGlzLmRpcmVjdGlvbiwgdGhpcy5uZWFyLCB0aGlzLmZhcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4V29ybGQuY2xvbmU7XHJcbiAgICAgIG10eFdvcmxkLnNjYWxpbmcgPSBuZXcgVmVjdG9yMygwLjUsIDAuNSwgMC41KTtcclxuICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IENvbG9yLkNTUyhcImxpZ2h0Z3JleVwiKTtcclxuICAgICAgR2l6bW9zLmRyYXdJY29uKFRleHR1cmVEZWZhdWx0Lmljb25DYW1lcmEsIG10eFdvcmxkLCBjb2xvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUobXR4V29ybGQsIGNvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd1dpcmVGcnVzdHVtKHRoaXMuZ2V0QXNwZWN0KCksIHRoaXMuZ2V0RmllbGRPZlZpZXcoKSwgdGhpcy5nZXROZWFyKCksIHRoaXMuZ2V0RmFyKCksIHRoaXMuZ2V0RGlyZWN0aW9uKCksIHRoaXMubXR4V29ybGQsIENvbG9yLkNTUyhcImxpZ2h0Z3JleVwiKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci50cmFuc2Zvcm07XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogTWFrZXMgdGhlIG5vZGUgZmFjZSB0aGUgY2FtZXJhIHdoZW4gcmVuZGVyaW5nLCByZXNwZWN0aW5nIHJlc3RyaWN0aW9ucyBmb3Igcm90YXRpb24gYXJvdW5kIHNwZWNpZmljIGF4aXNcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEZhY2VDYW1lcmEgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEZhY2VDYW1lcmEpO1xyXG5cclxuICAgIHB1YmxpYyB1cExvY2FsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyB1cDogVmVjdG9yMyA9IFZlY3RvcjMuWSgxKTtcclxuICAgIHB1YmxpYyByZXN0cmljdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIGEge0BsaW5rIE1hdGVyaWFsfSB0byB0aGUgbm9kZVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5IC0gMjAyMVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRGb2cgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEZvZyk7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG4gICAgcHVibGljIG5lYXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBmYXI6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKSwgX25lYXI6IG51bWJlciA9IDEsIF9mYXI6IG51bWJlciA9IDUwKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuY29sb3IgPSBfY29sb3I7XHJcbiAgICAgIHRoaXMubmVhciA9IF9uZWFyO1xyXG4gICAgICB0aGlzLmZhciA9IF9mYXI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBjb2xvcjogdGhpcy5jb2xvci5zZXJpYWxpemUoKSxcclxuICAgICAgICBuZWFyOiB0aGlzLm5lYXIsXHJcbiAgICAgICAgZmFyOiB0aGlzLmZhclxyXG4gICAgICB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29sb3IuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uY29sb3IpO1xyXG4gICAgICB0aGlzLm5lYXIgPSBfc2VyaWFsaXphdGlvbi5uZWFyID8/IHRoaXMubmVhcjtcclxuICAgICAgdGhpcy5mYXIgPSBfc2VyaWFsaXphdGlvbi5mYXIgPz8gdGhpcy5mYXI7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRmlsdGVycyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBhIGdyYXBoIGluc3RhbmNlIGFuZCB0aGUgZ3JhcGggaXQgaXMgY29ubmVjdGVkIHRvLiBJZiBhY3RpdmUsIG5vIHN5bmNocm9uaXphdGlvbiBvY2N1cnMuXHJcbiAgICogTWF5YmUgbW9yZSBmaW5lZ3JhaW5lZCBpbiB0aGUgZnV0dXJlLi4uXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjJcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRHcmFwaEZpbHRlciBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50R3JhcGhGaWx0ZXIpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCB0eXBlIFR5cGVPZkxpZ2h0ID0gbmV3ICgpID0+IExpZ2h0O1xyXG4gIC8qKlxyXG4gICAqIEJhc2VjbGFzcyBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIGxpZ2h0cy4gXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgTGlnaHQgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHtcclxuICAgIHB1YmxpYyBjb2xvcjogQ29sb3I7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSkpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5jb2xvciA9IF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBUeXBlT2ZMaWdodH0gb2YgdGhpcyBsaWdodC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFR5cGUoKTogVHlwZU9mTGlnaHQge1xyXG4gICAgICByZXR1cm4gPFR5cGVPZkxpZ2h0PnRoaXMuY29uc3RydWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgY29sb3I6IHRoaXMuY29sb3Iuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgdGhpcy5jb2xvci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5jb2xvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKCk6IHZvaWQgey8qKi8gfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW1iaWVudCBsaWdodCwgY29taW5nIGZyb20gYWxsIGRpcmVjdGlvbnMsIGlsbHVtaW5hdGluZyBldmVyeXRoaW5nIHdpdGggaXRzIGNvbG9yIGluZGVwZW5kZW50IG9mIHBvc2l0aW9uIGFuZCBvcmllbnRhdGlvbiAobGlrZSBhIGZvZ2d5IGRheSBvciBpbiB0aGUgc2hhZGVzKSAgXHJcbiAgICogQXR0YWNoZWQgdG8gYSBub2RlIGJ5IHtAbGluayBDb21wb25lbnRMaWdodH0sIHRoZSBwaXZvdCBtYXRyaXggaXMgaWdub3JlZC5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogfiB+IH4gIFxyXG4gICAqICB+IH4gfiAgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIExpZ2h0QW1iaWVudCBleHRlbmRzIExpZ2h0IHtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRGlyZWN0aW9uYWwgbGlnaHQsIGlsbHVtaW5hdGluZyBldmVyeXRoaW5nIGZyb20gYSBzcGVjaWZpZWQgZGlyZWN0aW9uIHdpdGggaXRzIGNvbG9yIChsaWtlIHN0YW5kaW5nIGluIGJyaWdodCBzdW5saWdodCkgIFxyXG4gICAqIEF0dGFjaGVkIHRvIGEgbm9kZSBieSB7QGxpbmsgQ29tcG9uZW50TGlnaHR9LCB0aGUgcGl2b3QgbWF0cml4IHNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBsaWdodCBvbmx5LlxyXG4gICAqIGBgYHRleHRcclxuICAgKiAtLS0+ICBcclxuICAgKiAtLS0+ICBcclxuICAgKiAtLS0+ICBcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTGlnaHREaXJlY3Rpb25hbCBleHRlbmRzIExpZ2h0IHtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogT21uaWRpcmVjdGlvbmFsIGxpZ2h0IGVtaXR0aW5nIGZyb20gaXRzIHBvc2l0aW9uLCBpbGx1bWluYXRpbmcgb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlaXIgcG9zaXRpb24gYW5kIGRpc3RhbmNlIHdpdGggaXRzIGNvbG9yIChsaWtlIGEgY29sb3JlZCBsaWdodCBidWxiKSAgXHJcbiAgICogQXR0YWNoZWQgdG8gYSBub2RlIGJ5IHtAbGluayBDb21wb25lbnRMaWdodH0sIHRoZSBwaXZvdCBtYXRyaXggc3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGlnaHQsIGl0J3Mgc2hhcGUgYW5kIHJvdGF0aW9uLiBcclxuICAgKiBTbyB3aXRoIHVuZXZlbiBzY2FsaW5nLCBvdGhlciBzaGFwZXMgdGhhbiBhIHBlcmZlY3Qgc3BoZXJlLCBzdWNoIGFzIGFuIG92YWwgb3IgYSBkaXNjLCBhcmUgcG9zc2libGUsIHdoaWNoIGNyZWF0ZXMgYSB2aXNpYmxlIGVmZmVjdCBvZiB0aGUgcm90YXRpb24gdG9vLiBcclxuICAgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodCBkcm9wcyBsaW5lYXJseSBmcm9tIDEgaW4gdGhlIGNlbnRlciB0byAwIGF0IHRoZSBwZXJpbWV0ZXIgb2YgdGhlIHNoYXBlLlxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgIC5cXHwvLlxyXG4gICAqICAgICAgICAtLSBvIC0tXHJcbiAgICogICAgICAgICDCtC98XFxgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIExpZ2h0UG9pbnQgZXh0ZW5kcyBMaWdodCB7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNwb3QgbGlnaHQgZW1pdHRpbmcgd2l0aGluIGEgc3BlY2lmaWVkIGFuZ2xlIGZyb20gaXRzIHBvc2l0aW9uLCBpbGx1bWluYXRpbmcgb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlaXIgcG9zaXRpb24gYW5kIGRpc3RhbmNlIHdpdGggaXRzIGNvbG9yICBcclxuICAgKiBBdHRhY2hlZCB0byBhIG5vZGUgYnkge0BsaW5rIENvbXBvbmVudExpZ2h0fSwgdGhlIHBpdm90IG1hdHJpeCBzcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsaWdodCwgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIHNpemUgYW5kIGFuZ2xlcyBvZiB0aGUgY29uZS5cclxuICAgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodCBkcm9wcyBsaW5lYXJseSBmcm9tIDEgaW4gdGhlIGNlbnRlciB0byAwIGF0IHRoZSBvdXRlciBsaW1pdHMgb2YgdGhlIGNvbmUuXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgIG8gIFxyXG4gICAqICAgICAgICAgL3xcXCAgXHJcbiAgICogICAgICAgIC8gfCBcXCBcclxuICAgKiBgYGAgICBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTGlnaHRTcG90IGV4dGVuZHMgTGlnaHQge1xyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIi4uL0xpZ2h0L0xpZ2h0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyBpZGVudGlmaWVycyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgbGlnaHQgdGhpcyBjb21wb25lbnQgY2FuIHByb3ZpZGUuICBcclxuICAgKi9cclxuICAvLyBleHBvcnQgbGV0IExJR0hUX1RZUEU6IHsgW3R5cGU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gIGV4cG9ydCBlbnVtIExJR0hUX1RZUEUge1xyXG4gICAgQU1CSUVOVCA9IFwiTGlnaHRBbWJpZW50XCIsXHJcbiAgICBESVJFQ1RJT05BTCA9IFwiTGlnaHREaXJlY3Rpb25hbFwiLFxyXG4gICAgUE9JTlQgPSBcIkxpZ2h0UG9pbnRcIixcclxuICAgIFNQT1QgPSBcIkxpZ2h0U3BvdFwiXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAgKiBBdHRhY2hlcyBhIHtAbGluayBMaWdodH0gdG8gdGhlIG5vZGVcclxuICAgICogVGhlIHBpdm90IG1hdHJpeCBoYXMgZGlmZmVyZW50IGVmZmVjdHMgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZSB7QGxpbmsgTGlnaHR9LiBTZWUgdGhlcmUgZm9yIGRldGFpbHMuXHJcbiAgICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRMaWdodCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50TGlnaHQpO1xyXG5cclxuICAgIC8vIHByaXZhdGUgc3RhdGljIGNvbnN0cnVjdG9yczogeyBbdHlwZTogc3RyaW5nXTogR2VuZXJhbCB9ID0geyBbTElHSFRfVFlQRS5BTUJJRU5UXTogTGlnaHRBbWJpZW50LCBbTElHSFRfVFlQRS5ESVJFQ1RJT05BTF06IExpZ2h0RGlyZWN0aW9uYWwsIFtMSUdIVF9UWVBFLlBPSU5UXTogTGlnaHRQb2ludCwgW0xJR0hUX1RZUEUuU1BPVF06IExpZ2h0U3BvdCB9O1xyXG4gICAgcHVibGljIG10eFBpdm90OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgIHB1YmxpYyBsaWdodDogTGlnaHQgPSBudWxsO1xyXG4gICAgLy9UT0RPOiBzaW5jZSB0aGVyZSBpcyBhbG1vc3Qgbm8gZnVuY3Rpb25hbGl0eSBsZWZ0IGluIExpZ2h0LCBlbGltaW5hdGUgaXQgYW5kIHB1dCBhbGwgaW4gdGhlIGNvbXBvbmVudCBhcyB3aXRoIHRoZSBjYW1lcmEuLi5cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2xpZ2h0OiBMaWdodCA9IG5ldyBMaWdodEFtYmllbnQoKSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNpbmdsZXRvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxpZ2h0ID0gX2xpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHVzZSBUeXBlT2ZMaWdodCBhcyByZXR1cm4gdHlwZT9cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0eXBlIG9mIHtAbGluayBMaWdodH0gdXNlZCBieSB0aGlzIGNvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFR5cGU8VCBleHRlbmRzIExpZ2h0PihfY2xhc3M6IG5ldyAoKSA9PiBUKTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHJPbGQ6IE11dGF0b3IgPSB7fTtcclxuICAgICAgaWYgKHRoaXMubGlnaHQpXHJcbiAgICAgICAgbXRyT2xkID0gdGhpcy5saWdodC5nZXRNdXRhdG9yKCk7XHJcblxyXG4gICAgICB0aGlzLmxpZ2h0ID0gbmV3IF9jbGFzcygpO1xyXG4gICAgICB0aGlzLmxpZ2h0Lm11dGF0ZShtdHJPbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHBpdm90OiB0aGlzLm10eFBpdm90LnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIGxpZ2h0OiBTZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLmxpZ2h0KVxyXG4gICAgICB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgYXdhaXQgdGhpcy5tdHhQaXZvdC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5waXZvdCk7XHJcbiAgICAgIHRoaXMubGlnaHQgPSBhd2FpdCA8UHJvbWlzZTxMaWdodD4+U2VyaWFsaXplci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5saWdodCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IudHlwZSA9IHRoaXMubGlnaHQuZ2V0VHlwZSgpLm5hbWU7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy50eXBlKVxyXG4gICAgICAgIHR5cGVzLnR5cGUgPSBMSUdIVF9UWVBFO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCB0eXBlOiBzdHJpbmcgPSBfbXV0YXRvci50eXBlO1xyXG4gICAgICBpZiAodHlwZW9mICh0eXBlKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlICE9IHRoaXMubGlnaHQuY29uc3RydWN0b3IubmFtZSlcclxuICAgICAgICB0aGlzLnNldFR5cGUoU2VyaWFsaXplci5nZXRDb25zdHJ1Y3RvcjxMaWdodD4odHlwZSkpO1xyXG4gICAgICBkZWxldGUgKF9tdXRhdG9yLnR5cGUpOyAvLyBleGNsdWRlIGxpZ2h0IHR5cGUgZnJvbSBmdXJ0aGVyIG11dGF0aW9uXHJcbiAgICAgIHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgX211dGF0b3IudHlwZSA9IHR5cGU7IC8vIHJlY29uc3RydWN0IG11dGF0b3JcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcygpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFNoYXBlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG4gICAgICBtdHhTaGFwZS5zY2FsaW5nID0gbmV3IFZlY3RvcjMoMC41LCAwLjUsIDAuNSk7XHJcbiAgICAgIEdpem1vcy5kcmF3SWNvbihUZXh0dXJlRGVmYXVsdC5pY29uTGlnaHQsIG10eFNoYXBlLCB0aGlzLmxpZ2h0LmNvbG9yKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4U2hhcGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4U2hhcGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMubm9kZS5tdHhXb3JsZCwgdGhpcy5tdHhQaXZvdCk7XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5DU1MoXCJ5ZWxsb3dcIik7XHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMubGlnaHQuZ2V0VHlwZSgpKSB7XHJcbiAgICAgICAgY2FzZSBMaWdodERpcmVjdGlvbmFsOlxyXG4gICAgICAgICAgY29uc3QgcmFkaXVzOiBudW1iZXIgPSAwLjU7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd1dpcmVDaXJjbGUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgICAgICAgIGNvbnN0IGxpbmVzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkoMTApLmZpbGwobnVsbCkubWFwKCgpID0+IFJlY3ljbGVyLmdldChWZWN0b3IzKSk7XHJcbiAgICAgICAgICBsaW5lc1swXS5zZXQoMCwgMCwgMCk7IGxpbmVzWzFdLnNldCgwLCAwLCAxKTtcclxuICAgICAgICAgIGxpbmVzWzJdLnNldCgwLCByYWRpdXMsIDApOyBsaW5lc1szXS5zZXQoMCwgcmFkaXVzLCAxKTtcclxuICAgICAgICAgIGxpbmVzWzZdLnNldCgwLCAtcmFkaXVzLCAwKTsgbGluZXNbN10uc2V0KDAsIC1yYWRpdXMsIDEpO1xyXG4gICAgICAgICAgbGluZXNbNF0uc2V0KHJhZGl1cywgMCwgMCk7IGxpbmVzWzVdLnNldChyYWRpdXMsIDAsIDEpO1xyXG4gICAgICAgICAgbGluZXNbOF0uc2V0KC1yYWRpdXMsIDAsIDApOyBsaW5lc1s5XS5zZXQoLXJhZGl1cywgMCwgMSk7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd0xpbmVzKGxpbmVzLCBtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgICAgICAgUmVjeWNsZXIuc3RvcmVNdWx0aXBsZSguLi5saW5lcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExpZ2h0UG9pbnQ6XHJcbiAgICAgICAgICBtdHhTaGFwZS5zY2FsZShuZXcgVmVjdG9yMygyLCAyLCAyKSk7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd1dpcmVTcGhlcmUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTGlnaHRTcG90OlxyXG4gICAgICAgICAgR2l6bW9zLmRyYXdXaXJlQ29uZShtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHtAbGluayBNYXRlcmlhbH0gdG8gdGhlIG5vZGVcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOSAtIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50TWF0ZXJpYWwgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudE1hdGVyaWFsKTtcclxuICAgIHB1YmxpYyBjbHJQcmltYXJ5OiBDb2xvciA9IENvbG9yLkNTUyhcIndoaXRlXCIpO1xyXG4gICAgcHVibGljIGNsclNlY29uZGFyeTogQ29sb3IgPSBDb2xvci5DU1MoXCJ3aGl0ZVwiKTtcclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4M3gzID0gTWF0cml4M3gzLklERU5USVRZKCk7XHJcbiAgICBwdWJsaWMgbWF0ZXJpYWw6IE1hdGVyaWFsO1xyXG4gICAgLyoqIFN1cHBvcnQgc29ydGluZyBvZiBvYmplY3RzIHdpdGggdHJhbnNwYXJlbmN5IHdoZW4gcmVuZGVyaW5nLCByZW5kZXIgb2JqZWN0cyBpbiB0aGUgYmFjayBmaXJzdC4gV2hlbiB0aGlzIGNvbXBvbmVudCBpcyB1c2VkIGFzIGEgcGFydCBvZiBhIHtAbGluayBQYXJ0aWNsZVN5c3RlbX0sIHRyeSBlbmFibGluZyB0aGlzIHdoZW4gZGlzYWJsaW5nIHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbS5kZXB0aE1hc2t9ICovXHJcbiAgICBwdWJsaWMgc29ydEZvckFscGhhOiBib29sZWFuID0gZmFsc2U7IC8vIFRPRE86IG1heWJlIG1ha2UgdGhpcyBhIHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbD9cclxuICAgIC8vIHB1YmxpYyBtdXRhdG9yQ29hdDogTXV0YXRvckZvckNvbXBvbmVudDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX21hdGVyaWFsOiBNYXRlcmlhbCA9IG51bGwpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5tYXRlcmlhbCA9IF9tYXRlcmlhbDtcclxuICAgICAgLy8gdGhpcy5tdXRhdG9yQ29hdCA9IF9tYXRlcmlhbC5nZXRDb2F0KCkuZ2V0TXV0YXRvckZvckNvbXBvbmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtYXRlcmlhbCBoYXMgYW55IGFyZWFzIChjb2xvciBvciB0ZXh0dXJlKSB3aXRoIGFscGhhIDwgMS5cclxuICAgICAqIOKaoO+4jyBDQVVUSU9OOiBDb21wdXRpb25hbGx5IGV4cGVuc2l2ZSBmb3IgdGV4dHVyZWQgbWF0ZXJpYWxzLCBzZWUge0BsaW5rIFRleHR1cmUuaGFzVHJhbnNwYXJlbmN5fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGhhc1RyYW5zcGFyZW5jeSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMubWF0ZXJpYWw/Lmhhc1RyYW5zcGFyZW5jeSB8fCB0aGlzLmNsclByaW1hcnkuYSA8IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBzb3J0Rm9yQWxwaGE6IHRoaXMuc29ydEZvckFscGhhLFxyXG4gICAgICAgIGNsclByaW1hcnk6IHRoaXMuY2xyUHJpbWFyeS5zZXJpYWxpemUoKSxcclxuICAgICAgICBjbHJTZWNvbmRhcnk6IHRoaXMuY2xyU2Vjb25kYXJ5LnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIHBpdm90OiB0aGlzLm10eFBpdm90LnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKCksXHJcbiAgICAgICAgaWRNYXRlcmlhbDogdGhpcy5tYXRlcmlhbC5pZFJlc291cmNlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm1hdGVyaWFsID0gPE1hdGVyaWFsPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRNYXRlcmlhbCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuY2xyUHJpbWFyeS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5jbHJQcmltYXJ5KTtcclxuICAgICAgYXdhaXQgdGhpcy5jbHJTZWNvbmRhcnkuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uY2xyU2Vjb25kYXJ5KTtcclxuICAgICAgdGhpcy5zb3J0Rm9yQWxwaGEgPSBfc2VyaWFsaXphdGlvbi5zb3J0Rm9yQWxwaGE7XHJcbiAgICAgIGF3YWl0IHRoaXMubXR4UGl2b3QuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ucGl2b3QpO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBnZXRNdXRhdG9yRm9yVXNlckludGVyZmFjZSgpOiBNdXRhdG9yRm9yVXNlckludGVyZmFjZSB7XHJcbiAgICAvLyAgIGxldCBtdXRhdG9yQ29hdDogTXV0YXRvckZvckNvbXBvbmVudCA9IHRoaXMubWF0ZXJpYWwuZ2V0Q29hdCgpLmdldE11dGF0b3JGb3JDb21wb25lbnQoKTtcclxuICAgIC8vICAgcmV0dXJuIDxNdXRhdG9yRm9yVXNlckludGVyZmFjZT48dW5rbm93bj5tdXRhdG9yQ29hdDtcclxuICAgIC8vIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIGEge0BsaW5rIE1lc2h9IHRvIHRoZSBub2RlXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50TWVzaCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50TWVzaCk7XHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgIHB1YmxpYyBtZXNoOiBNZXNoO1xyXG4gICAgcHVibGljIHNrZWxldG9uOiBDb21wb25lbnRTa2VsZXRvbjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX21lc2g/OiBNZXNoLCBfc2tlbGV0b24/OiBDb21wb25lbnRTa2VsZXRvbikge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLm1lc2ggPSBfbWVzaDtcclxuICAgICAgdGhpcy5za2VsZXRvbiA9IF9za2VsZXRvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHJhZGl1cygpOiBudW1iZXIge1xyXG4gICAgICBsZXQgc2NhbGluZzogVmVjdG9yMyA9IHRoaXMubXR4V29ybGQuc2NhbGluZztcclxuICAgICAgbGV0IHNjYWxlOiBudW1iZXIgPSBNYXRoLm1heChNYXRoLmFicyhzY2FsaW5nLngpLCBNYXRoLmFicyhzY2FsaW5nLnkpLCBNYXRoLmFicyhzY2FsaW5nLnopKTtcclxuICAgICAgcmV0dXJuIHRoaXMubWVzaC5yYWRpdXMgKiBzY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENhbGN1bGF0ZXMgdGhlIHBvc2l0aW9uIG9mIGEgdmVydGV4IHRyYW5zZm9ybWVkIGJ5IHRoZSBza2VsZXRvblxyXG4gICAgLy8gICogQHBhcmFtIF9pbmRleCBpbmRleCBvZiB0aGUgdmVydGV4XHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHB1YmxpYyBnZXRWZXJ0ZXhQb3NpdGlvbihfaW5kZXg6IG51bWJlcik6IFZlY3RvcjMge1xyXG4gICAgLy8gICAvLyBleHRyYWN0IHRoZSB2ZXJ0ZXggZGF0YSAodmVydGljZXM6IDNEIHZlY3RvcnMsIGJvbmUgaW5kaWNlcyAmIHdlaWdodHM6IDREIHZlY3RvcnMpXHJcbiAgICAvLyAgIGNvbnN0IGlWZXJ0ZXg6IG51bWJlciA9IF9pbmRleCAqIDM7XHJcbiAgICAvLyAgIGNvbnN0IGlCb25lSW5mbHVlbmNlOiBudW1iZXIgPSBfaW5kZXggKiA0O1xyXG5cclxuICAgIC8vICAgY29uc3QgdmVydGV4OiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoLi4uUmVmbGVjdC5nZXQodGhpcy5tZXNoLCBcInJlbmRlck1lc2hcIikudmVydGljZXMuc2xpY2UoaVZlcnRleCwgaVZlcnRleCArIDMpKTtcclxuICAgIC8vICAgaWYgKCEodGhpcy5tZXNoIGluc3RhbmNlb2YgTWVzaFNraW4pKSByZXR1cm4gdmVydGV4O1xyXG5cclxuICAgIC8vICAgY29uc3QgaUJvbmVzOiBVaW50OEFycmF5ID0gdGhpcy5tZXNoLmlCb25lcy5zbGljZShpQm9uZUluZmx1ZW5jZSwgaUJvbmVJbmZsdWVuY2UgKyA0KTtcclxuICAgIC8vICAgY29uc3Qgd2VpZ2h0czogRmxvYXQzMkFycmF5ID0gdGhpcy5tZXNoLndlaWdodHMuc2xpY2UoaUJvbmVJbmZsdWVuY2UsIGlCb25lSW5mbHVlbmNlICsgNCk7XHJcblxyXG4gICAgLy8gICAvLyBnZXQgYm9uZSBtYXRyaWNlc1xyXG4gICAgLy8gICBjb25zdCBtdHhCb25lczogQXJyYXk8TWF0cml4NHg0PiA9IHRoaXMuc2tlbGV0b24ubXR4Qm9uZXM7XHJcblxyXG4gICAgLy8gICAvLyBza2luIG1hdHJpeCBTID0gc3VtX2k9MV5te3dfaSAqIEJfaX1cclxuICAgIC8vICAgY29uc3Qgc2tpbk1hdHJpeDogTWF0cml4NHg0ID0gbmV3IE1hdHJpeDR4NCgpO1xyXG4gICAgLy8gICBza2luTWF0cml4LnNldChBcnJheVxyXG4gICAgLy8gICAgIC5mcm9tKGlCb25lcylcclxuICAgIC8vICAgICAubWFwKChpQm9uZSwgaVdlaWdodCkgPT4gbXR4Qm9uZXNbaUJvbmVdLmdldCgpLm1hcCh2YWx1ZSA9PiB2YWx1ZSAqIHdlaWdodHNbaVdlaWdodF0pKSAvLyBhcHBseSB3ZWlnaHQgb24gZWFjaCBtYXRyaXhcclxuICAgIC8vICAgICAucmVkdWNlKChtdHhTdW0sIG10eEJvbmUpID0+IG10eFN1bS5tYXAoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgKyBtdHhCb25lW2luZGV4XSkpIC8vIHN1bSB1cCB0aGUgbWF0cmljZXNcclxuICAgIC8vICAgKTtcclxuXHJcbiAgICAvLyAgIC8vIHRyYW5zZm9ybSB2ZXJ0ZXhcclxuICAgIC8vICAgdmVydGV4LnRyYW5zZm9ybShza2luTWF0cml4KTtcclxuXHJcbiAgICAvLyAgIHJldHVybiB2ZXJ0ZXg7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gVE9ETzogcmVtb3ZlIG9yIHRoaW5rIGlmIHRoZSB0cmFuc2Zvcm1lZCBib3VuZGluZyBib3ggaXMgb2YgdmFsdWUgb3IgY2FuIGJlIG1hZGUgdG8gYmVcclxuICAgIC8vIHB1YmxpYyBnZXQgYm91bmRpbmdCb3goKTogQm94IHtcclxuICAgIC8vICAgbGV0IGJveDogQm94ID0gUmVjeWNsZXIuZ2V0KEJveCk7XHJcbiAgICAvLyAgIGJveC5zZXQoXHJcbiAgICAvLyAgICAgVmVjdG9yMy5UUkFOU0ZPUk1BVElPTih0aGlzLm1lc2guYm91bmRpbmdCb3gubWluLCB0aGlzLm10eFdvcmxkLCB0cnVlKSxcclxuICAgIC8vICAgICBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKHRoaXMubWVzaC5ib3VuZGluZ0JveC5tYXgsIHRoaXMubXR4V29ybGQsIHRydWUpXHJcbiAgICAvLyAgICk7XHJcbiAgICAvLyAgIHJldHVybiBib3g7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbjtcclxuICAgICAgLyogYXQgdGhpcyBwb2ludCBvZiB0aW1lLCBzZXJpYWxpemF0aW9uIGFzIHJlc291cmNlIGFuZCBhcyBpbmxpbmUgb2JqZWN0IGlzIHBvc3NpYmxlLiBUT0RPOiBjaGVjayBpZiBpbmxpbmUgYmVjb21lcyBvYnNvbGV0ZSAqL1xyXG4gICAgICBsZXQgaWRNZXNoOiBzdHJpbmcgPSB0aGlzLm1lc2guaWRSZXNvdXJjZTtcclxuICAgICAgaWYgKGlkTWVzaClcclxuICAgICAgICBzZXJpYWxpemF0aW9uID0geyBpZE1lc2g6IGlkTWVzaCB9O1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbiA9IHsgbWVzaDogU2VyaWFsaXplci5zZXJpYWxpemUodGhpcy5tZXNoKSB9O1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2tlbGV0b24pXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbi5za2VsZXRvbiA9IE5vZGUuUEFUSF9GUk9NX1RPKHRoaXMsIHRoaXMuc2tlbGV0b24pO1xyXG5cclxuICAgICAgc2VyaWFsaXphdGlvbi5waXZvdCA9IHRoaXMubXR4UGl2b3Quc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgbGV0IG1lc2g6IE1lc2g7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZE1lc2gpXHJcbiAgICAgICAgbWVzaCA9IDxNZXNoPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRNZXNoKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIG1lc2ggPSA8TWVzaD5hd2FpdCBTZXJpYWxpemVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLm1lc2gpO1xyXG4gICAgICB0aGlzLm1lc2ggPSBtZXNoO1xyXG5cclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLnNrZWxldG9uKSB7XHJcbiAgICAgICAgY29uc3QgaG5kTm9kZURlc2VyaWFsaXplZDogRXZlbnRMaXN0ZW5lclVuaWZpZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBobmRHcmFwaERlc2VyaWFsaXplZDogRXZlbnRMaXN0ZW5lclVuaWZpZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b24gPSBOb2RlLkZJTkQodGhpcywgX3NlcmlhbGl6YXRpb24uc2tlbGV0b24pIGFzIENvbXBvbmVudFNrZWxldG9uO1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HUkFQSF9ERVNFUklBTElaRUQsIGhuZEdyYXBoRGVzZXJpYWxpemVkKTtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuR1JBUEhfSU5TVEFOVElBVEVELCBobmRHcmFwaERlc2VyaWFsaXplZCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0RFU0VSSUFMSVpFRCwgaG5kTm9kZURlc2VyaWFsaXplZCk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR1JBUEhfREVTRVJJQUxJWkVELCBobmRHcmFwaERlc2VyaWFsaXplZCwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5HUkFQSF9JTlNUQU5USUFURUQsIGhuZEdyYXBoRGVzZXJpYWxpemVkLCB0cnVlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0RFU0VSSUFMSVpFRCwgaG5kTm9kZURlc2VyaWFsaXplZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMubXR4UGl2b3QuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ucGl2b3QpO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yRm9yVXNlckludGVyZmFjZSgpOiBNdXRhdG9yRm9yVXNlckludGVyZmFjZSB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yRm9yVXNlckludGVyZmFjZSA9IDxNdXRhdG9yRm9yVXNlckludGVyZmFjZT50aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgLy8gaWYgKCF0aGlzLm1lc2gpXHJcbiAgICAgIC8vICAgbXV0YXRvci5tZXNoID0gTWVzaDtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMubWVzaClcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5DU1MoXCJzYWxtb25cIik7XHJcbiAgICAgIEdpem1vcy5kcmF3V2lyZU1lc2godGhpcy5tZXNoLCB0aGlzLm10eFdvcmxkLCBjb2xvciwgMC4xKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoY29sb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIGV4cG9ydCBlbnVtIFBBUlRJQ0xFX1NZU1RFTV9QTEFZTU9ERSB7XHJcbiAgICAvKipQbGF5cyBwYXJ0aWNsZSBzeXN0ZW0gaW4gYSBsb29wOiBpdCByZXN0YXJ0cyBvbmNlIGl0IGhpdCB0aGUgZW5kLiovXHJcbiAgICBMT09QLFxyXG4gICAgLyoqUGxheXMgcGFydGljbGUgc3lzdGVtIG9uY2UgYW5kIHN0b3BzIGF0IHRoZSBsYXN0IHBvaW50IGluIHRpbWUuKi9cclxuICAgIFBMQVlfT05DRVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXR0YWNoZXMgYSB7QGxpbmsgUGFydGljbGVTeXN0ZW19IHRvIHRoZSBub2RlLiBcclxuICAgKiBXb3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayBDb21wb25lbnRNZXNofSBhbmQge0BsaW5rIENvbXBvbmVudE1hdGVyaWFsfSB0byBjcmVhdGUgYSBzaGFkZXIgcGFydGljbGUgc3lzdGVtLlxyXG4gICAqIEFkZGl0aW9uYWxseSBhIHtAbGluayBDb21wb25lbnRGYWNlQ2FtZXJhfSBjYW4gYmUgYXR0YWNoZWQgdG8gbWFrZSB0aGUgcGFydGljbGVzIGZhY2UgdGhlIGNhbWVyYS5cclxuICAgKiBAYXV0aG9yIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFBhcnRpY2xlU3lzdGVtIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk7XHJcbiAgICBwdWJsaWMgcGFydGljbGVTeXN0ZW06IFBhcnRpY2xlU3lzdGVtO1xyXG4gICAgLyoqIFdoZW4gZGlzYWJsZWQgdHJ5IGVuYWJsaW5nIHtAbGluayBDb21wb25lbnRNYXRlcmlhbC5zb3J0Rm9yQWxwaGF9ICovXHJcbiAgICBwdWJsaWMgZGVwdGhNYXNrOiBib29sZWFuO1xyXG4gICAgcHVibGljIGJsZW5kTW9kZTogQkxFTkQ7XHJcbiAgICBwdWJsaWMgcGxheU1vZGU6IFBBUlRJQ0xFX1NZU1RFTV9QTEFZTU9ERTtcclxuICAgIHB1YmxpYyBkdXJhdGlvbjogbnVtYmVyO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgQSB0ZXh0dXJlIGZpbGVkIHdpdGggcmFuZG9tIG51bWJlcnMuIFVzZWQgYnkgdGhlIHJlbmRlciBlbmdpbmUgKi9cclxuICAgIHByb3RlY3RlZCByZW5kZXJEYXRhOiB1bmtub3duO1xyXG5cclxuICAgIC8qKiBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyAqL1xyXG4gICAgI3NpemU6IG51bWJlcjtcclxuICAgICN0aW1lU2NhbGU6IG51bWJlciA9IDE7XHJcbiAgICByZWFkb25seSAjdGltZTogVGltZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3BhcnRpY2xlU3lzdGVtOiBQYXJ0aWNsZVN5c3RlbSA9IG51bGwpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5wYXJ0aWNsZVN5c3RlbSA9IF9wYXJ0aWNsZVN5c3RlbTtcclxuICAgICAgdGhpcy5kZXB0aE1hc2sgPSB0cnVlO1xyXG4gICAgICB0aGlzLmJsZW5kTW9kZSA9IEJMRU5ELkFERElUSVZFO1xyXG4gICAgICB0aGlzLnBsYXlNb2RlID0gUEFSVElDTEVfU1lTVEVNX1BMQVlNT0RFLkxPT1A7XHJcbiAgICAgIHRoaXMuZHVyYXRpb24gPSAxMDAwO1xyXG4gICAgICB0aGlzLnNpemUgPSAxMDtcclxuICAgICAgdGhpcy4jdGltZSA9IG5ldyBUaW1lKCk7XHJcblxyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy5obmRFdmVudCk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCB0aGlzLmhuZEV2ZW50KTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCB0aGlzLmhuZEV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHBhcnRpY2xlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NpemU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMuIENhdXRpb246IFNldHRpbmcgdGhpcyB3aWxsIHJlaW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlcnMgYXJyYXkodGV4dHVyZSkgdXNlZCBpbiB0aGUgc2hhZGVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHNpemUoX3NpemU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzaXplID0gX3NpemU7XHJcbiAgICAgIHRoaXMuZGVsZXRlUmVuZGVyRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGltZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGltZS5nZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWUoX3RpbWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN0aW1lLnNldChfdGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0aW1lU2NhbGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RpbWVTY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWVTY2FsZShfc2NhbGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN0aW1lU2NhbGUgPSBfc2NhbGU7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZVNjYWxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogR2VuZXJhdGVzIGFuZCBiaW5kcyB0aGUgcmFuZG9tIG51bWJlcnMgdGV4dHVyZSBpbiBXZWJHTFxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXNlUmVuZGVyRGF0YSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBEZWxldGVzIHRoZSByYW5kb20gbnVtYmVycyB0ZXh0dXJlIGluIFdlYkdMIGZyZWVpbmcgdGhlIGFsbG9jYXRlZCBncHUgbWVtb3J5LlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW19LiBcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVuZGVyRGF0YSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKCksXHJcbiAgICAgICAgaWRQYXJ0aWNsZVN5c3RlbTogdGhpcy5wYXJ0aWNsZVN5c3RlbT8uaWRSZXNvdXJjZSxcclxuICAgICAgICBkZXB0aE1hc2s6IHRoaXMuZGVwdGhNYXNrLFxyXG4gICAgICAgIGJsZW5kTW9kZTogdGhpcy5ibGVuZE1vZGUsXHJcbiAgICAgICAgcGxheU1vZGU6IHRoaXMucGxheU1vZGUsXHJcbiAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXHJcbiAgICAgICAgc2l6ZTogdGhpcy5zaXplXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZFBhcnRpY2xlU3lzdGVtKSB0aGlzLnBhcnRpY2xlU3lzdGVtID0gPFBhcnRpY2xlU3lzdGVtPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRQYXJ0aWNsZVN5c3RlbSk7XHJcbiAgICAgIHRoaXMuZGVwdGhNYXNrID0gX3NlcmlhbGl6YXRpb24uZGVwdGhNYXNrO1xyXG4gICAgICB0aGlzLmJsZW5kTW9kZSA9IF9zZXJpYWxpemF0aW9uLmJsZW5kTW9kZTtcclxuICAgICAgdGhpcy5wbGF5TW9kZSA9IF9zZXJpYWxpemF0aW9uLnBsYXlNb2RlO1xyXG4gICAgICB0aGlzLmR1cmF0aW9uID0gX3NlcmlhbGl6YXRpb24uZHVyYXRpb247XHJcbiAgICAgIHRoaXMuc2l6ZSA9IF9zZXJpYWxpemF0aW9uLnNpemU7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcihfZXh0ZW5kYWJsZT86IGJvb2xlYW4pOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKHRydWUpO1xyXG4gICAgICBtdXRhdG9yLnNpemUgPSB0aGlzLnNpemU7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yRm9yVXNlckludGVyZmFjZSgpOiBNdXRhdG9yRm9yVXNlckludGVyZmFjZSB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yRm9yVXNlckludGVyZmFjZSA9IDxNdXRhdG9yRm9yVXNlckludGVyZmFjZT50aGlzLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLnBhcnRpY2xlU3lzdGVtO1xyXG4gICAgICBtdXRhdG9yLnBhcnRpY2xlU3lzdGVtID0gdGhpcy5wYXJ0aWNsZVN5c3RlbT8uZ2V0TXV0YXRvckZvclVzZXJJbnRlcmZhY2UoKTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JGb3JBbmltYXRpb24oKTogTXV0YXRvckZvckFuaW1hdGlvbiB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yRm9yQW5pbWF0aW9uID0gPE11dGF0b3JGb3JBbmltYXRpb24+dGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLnBhcnRpY2xlU3lzdGVtO1xyXG4gICAgICBkZWxldGUgbXV0YXRvci5zaXplO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgICAgbGV0IHR5cGVzOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMgPSBzdXBlci5nZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3IpO1xyXG4gICAgICBpZiAodHlwZXMuYmxlbmRNb2RlKVxyXG4gICAgICAgIHR5cGVzLmJsZW5kTW9kZSA9IEJMRU5EO1xyXG4gICAgICBpZiAodHlwZXMucGxheU1vZGUpXHJcbiAgICAgICAgdHlwZXMucGxheU1vZGUgPSBQQVJUSUNMRV9TWVNURU1fUExBWU1PREU7XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJhbmRvbU51bWJlcnNSZW5kZXJEYXRhO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IudGltZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByaXZhdGUgaG5kRXZlbnQgPSAoX2V2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgICBzd2l0Y2ggKF9ldmVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBFVkVOVC5OT0RFX0RFU0VSSUFMSVpFRDpcclxuICAgICAgICBjYXNlIEVWRU5ULkNPTVBPTkVOVF9BREQ6XHJcbiAgICAgICAgICBUaW1lLmdhbWUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5USU1FX1NDQUxFRCwgdGhpcy51cGRhdGVUaW1lU2NhbGUpO1xyXG4gICAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUkVOREVSX1BSRVBBUkUsIHRoaXMudXBkYXRlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX1JFTU9WRTpcclxuICAgICAgICAgIFRpbWUuZ2FtZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRJTUVfU0NBTEVELCB0aGlzLnVwZGF0ZVRpbWVTY2FsZSk7XHJcbiAgICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5SRU5ERVJfUFJFUEFSRSwgdGhpcy51cGRhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAodGhpcy50aW1lID4gdGhpcy5kdXJhdGlvbilcclxuICAgICAgICBzd2l0Y2ggKHRoaXMucGxheU1vZGUpIHtcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBjYXNlIFBBUlRJQ0xFX1NZU1RFTV9QTEFZTU9ERS5MT09QOlxyXG4gICAgICAgICAgICB0aGlzLnRpbWUgPSAwO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgUEFSVElDTEVfU1lTVEVNX1BMQVlNT0RFLlBMQVlfT05DRTpcclxuICAgICAgICAgICAgdGhpcy50aW1lID0gdGhpcy5kdXJhdGlvbjtcclxuICAgICAgICAgICAgdGhpcy50aW1lU2NhbGUgPSAwO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlVGltZVNjYWxlID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICBsZXQgdGltZVNjYWxlOiBudW1iZXIgPSB0aGlzLiN0aW1lU2NhbGUgKiBUaW1lLmdhbWUuZ2V0U2NhbGUoKTtcclxuICAgICAgdGhpcy4jdGltZS5zZXRTY2FsZSh0aW1lU2NhbGUpO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgZW51bSBQSUNLIHtcclxuICAgIFJBRElVUyA9IFwicmFkaXVzXCIsXHJcbiAgICBDQU1FUkEgPSBcImNhbWVyYVwiLFxyXG4gICAgUEhZU0lDUyA9IFwicGh5c2ljc1wiXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBwaWNraW5nIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIG5vZGVcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRQaWNrIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRQaWNrKTtcclxuICAgIHB1YmxpYyBwaWNrOiBQSUNLID0gUElDSy5SQURJVVM7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQaWNrcyB0aGUgbm9kZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBSYXl9IGFuZCBpbnZva2VzIGV2ZW50cyBhY2NvcmRpbmdseVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGlja0FuZERpc3BhdGNoKF9yYXk6IFJheSwgX2V2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcclxuICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBjbXBNZXNoID8gY21wTWVzaC5tdHhXb3JsZC50cmFuc2xhdGlvbiA6IHRoaXMubm9kZS5tdHhXb3JsZC50cmFuc2xhdGlvbjtcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy5waWNrKSB7XHJcbiAgICAgICAgY2FzZSBQSUNLLlJBRElVUzpcclxuICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBvbmx5IGJlIG5vZGUucmFkaXVzLiBBZGp1c3RtZW50IG5lZWRlZCwgaWYgbWVzaCB3YXMgdHJhbnNmb3JtZWQuLi5cclxuICAgICAgICAgIGlmIChfcmF5LmdldERpc3RhbmNlKHBvc2l0aW9uKS5tYWduaXR1ZGUgPCB0aGlzLm5vZGUucmFkaXVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5kaXNwYXRjaEV2ZW50KF9ldmVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0suUEhZU0lDUzpcclxuICAgICAgICAgIGxldCBoaXRJbmZvOiBSYXlIaXRJbmZvID0gUGh5c2ljcy5yYXljYXN0KF9yYXkub3JpZ2luLCBfcmF5LmRpcmVjdGlvbiwgVmVjdG9yMy5ESUZGRVJFTkNFKHBvc2l0aW9uLCBfcmF5Lm9yaWdpbikubWFnbml0dWRlU3F1YXJlZCk7XHJcbiAgICAgICAgICBpZiAoaGl0SW5mby5oaXQpXHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5kaXNwYXRjaEV2ZW50KF9ldmVudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICAvL1RPRE86IFBJQ0suQ0FNRVJBXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgICAgbGV0IHR5cGVzOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMgPSBzdXBlci5nZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3IpO1xyXG4gICAgICBpZiAodHlwZXMucGljaylcclxuICAgICAgICB0eXBlcy5waWNrID0gUElDSztcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEJhc2UgY2xhc3MgZm9yIHNjcmlwdHMgdGhlIHVzZXIgd3JpdGVzXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRTY3JpcHQgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgLy8gcmVnaXN0ZXJpbmcgdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2UsIG9ubHkgaXRzIHN1YmNsYXNzZXMuIE9yIHRoaXMgY29tcG9uZW50IG11c3QgcmVmZXIgdG8gc2NyaXB0cyB0byBiZSBhdHRhY2hlZCB0byB0aGlzIGNvbXBvbmVudFxyXG4gICAgLy8gVE9ETzogcmV0aGluayAmIHJlZmFjdG9yXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50U2NyaXB0KTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2luZ2xldG9uID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TXV0YXRvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMubXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1ZmZlcnMgdGhlIGJvbmUgZGF0YSBmcm9tIHRoZSB7QGxpbmsgQ29tcG9uZW50U2tlbGV0b259IGludG8gYSBXZWJHTCBCdWZmZXJcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbiB7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVzZVJlbmRlckJ1ZmZlclwiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b24udXNlUmVuZGVyQnVmZmVyXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJ1cGRhdGVSZW5kZXJCdWZmZXJcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9uLnVwZGF0ZVJlbmRlckJ1ZmZlclxyXG4gICAgICB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiZGVsZXRlUmVuZGVyQnVmZmVyXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbi5kZWxldGVSZW5kZXJCdWZmZXJcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB1c2VSZW5kZXJCdWZmZXIodGhpczogQ29tcG9uZW50U2tlbGV0b24sIF9zaGFkZXI6IHR5cGVvZiBTaGFkZXIpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnJlbmRlckJ1ZmZlcilcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXJCYXNlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIFVOSUZPUk1fQkxPQ0tTLlNLSU4uQklORElORywgdGhpcy5yZW5kZXJCdWZmZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgdXBkYXRlUmVuZGVyQnVmZmVyKHRoaXM6IENvbXBvbmVudFNrZWxldG9uKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMucmVuZGVyQnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYm9uZXNCeXRlU2l6ZTogbnVtYmVyID0gMjU2ICogMTYgKiA0OyAvLyBDQVVUSU9OOiB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgc2hhZGVyIHNvdXJjZSBjb2RlIHdoZXJlIDI1NiBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYm9uZXNcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJCdWZmZXIgPSBSZW5kZXJXZWJHTC5hc3NlcnQoY3JjMy5jcmVhdGVCdWZmZXIoKSk7XHJcbiAgICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIHRoaXMucmVuZGVyQnVmZmVyKTtcclxuICAgICAgICBjcmMzLmJ1ZmZlckRhdGEoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgYm9uZXNCeXRlU2l6ZSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5EWU5BTUlDX0RSQVcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubXR4Qm9uZXMubGVuZ3RoICogMTYpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5tdHhCb25lcy5sZW5ndGg7IGkrKylcclxuICAgICAgICBkYXRhLnNldCh0aGlzLm10eEJvbmVzW2ldLmdldCgpLCBpICogMTYpO1xyXG5cclxuICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIHRoaXMucmVuZGVyQnVmZmVyKTtcclxuICAgICAgY3JjMy5idWZmZXJTdWJEYXRhKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIDAsIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZGVsZXRlUmVuZGVyQnVmZmVyKHRoaXM6IENvbXBvbmVudFNrZWxldG9uKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5yZW5kZXJCdWZmZXIpXHJcbiAgICAgICAgY3JjMy5kZWxldGVCdWZmZXIodGhpcy5yZW5kZXJCdWZmZXIpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIi4vLi4vUmVuZGVyL1JlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b24udHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBIb2xkcyBhbiBhcnJheSBvZiBib25lcyAoe0BsaW5rIE5vZGV9cyB3aXRoaW4gYSB7QGxpbmsgR3JhcGh9KS4gUmVmZXJlbmNlZCBmcm9tIGEge0BsaW5rIENvbXBvbmVudE1lc2h9IGl0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgTWVzaH0gYW5kIGVuYWJsZSBza2lubmluZyBmb3IgdGhlIG1lc2guXHJcbiAgICogQGF1dGhvcnMgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjItMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9uLmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFNrZWxldG9uIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIC8qKiBUaGUgYm9uZXMgdXNlZCBmb3Igc2tpbm5pbmcgKi9cclxuICAgIHB1YmxpYyBib25lczogTm9kZVtdO1xyXG4gICAgLyoqIFdoZW4gYXBwbGllZCB0byB2ZXJ0aWNlcywgaXQgbW92ZXMgdGhlbSBmcm9tIG9iamVjdC9tb2RlbCBzcGFjZSB0byBib25lLWxvY2FsIHNwYWNlIGFzIGlmIHRoZSBib25lIHdlcmUgYXQgaXRzIGluaXRpYWwgcG9zZSAqL1xyXG4gICAgcHVibGljIG10eEJpbmRJbnZlcnNlczogTWF0cml4NHg0W107IC8vIFRPRE86IHRoaW5rIGFib3V0IHNlcmlhbGl6aW5nIHRoaXMgc2VwYXJhdGVseSB0byBtYWtlIGl0IHNoYXJlYWJsZSBiZXR3ZWVuIHNrZWxldG9uIHNlcmlhbGl6YXRpb25zXHJcblxyXG4gICAgcHJvdGVjdGVkIHJlbmRlckJ1ZmZlcjogdW5rbm93bjtcclxuICAgIHByb3RlY3RlZCBzaW5nbGV0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBDb250YWlucyB0aGUgYm9uZSB0cmFuc2Zvcm1hdGlvbnMgYXBwbGljYWJsZSB0byB0aGUgdmVydGljZXMgb2YgYSB7QGxpbmsgTWVzaH0gKi9cclxuICAgIHByb3RlY3RlZCByZWFkb25seSBtdHhCb25lczogTWF0cml4NHg0W10gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvbmVzOiBOb2RlW10gPSBbXSwgX210eEJvbmVJbnZlcnNlczogTWF0cml4NHg0W10gPSBbXSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmJvbmVzID0gX2JvbmVzO1xyXG4gICAgICB0aGlzLm10eEJpbmRJbnZlcnNlcyA9IF9tdHhCb25lSW52ZXJzZXM7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5ib25lcy5sZW5ndGg7IGkrKylcclxuICAgICAgICBpZiAodGhpcy5tdHhCaW5kSW52ZXJzZXNbaV0gPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMubXR4QmluZEludmVyc2VzW2ldID0gdGhpcy5ib25lc1tpXS5tdHhXb3JsZEludmVyc2UuY2xvbmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbn0uXHJcbiAgICAgKiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1c2VSZW5kZXJCdWZmZXIoX3NoYWRlcjogU2hhZGVySW50ZXJmYWNlKTogUmVuZGVyQnVmZmVycyB7IHJldHVybiBudWxsOyAvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b259LlxyXG4gICAgICogVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlUmVuZGVyQnVmZmVyKCk6IFJlbmRlckJ1ZmZlcnMgeyByZXR1cm4gbnVsbDsgLyogaW5qZWN0ZWQgYnkgUmVuZGVySW5qZWN0b3IqLyB9XHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9ufS5cclxuICAgICAqIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZVJlbmRlckJ1ZmZlcigpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBub2RlIGFzIGEgYm9uZSB3aXRoIGl0cyBiaW5kIGludmVyc2UgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRCb25lKF9ib25lOiBOb2RlLCBfbXR4QmluZEludmVyc2U6IE1hdHJpeDR4NCA9IF9ib25lLm10eFdvcmxkSW52ZXJzZS5jbG9uZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLmJvbmVzLnB1c2goX2JvbmUpO1xyXG4gICAgICB0aGlzLm10eEJpbmRJbnZlcnNlcy5wdXNoKF9tdHhCaW5kSW52ZXJzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBib25lIGluIHRoZSBib25lcyBhcnJheSB3aGljaCBoYXMgdGhlIGdpdmVuIG5hbWUsIGFuZCAtMSBvdGhlcndpc2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmRleE9mKF9uYW1lOiBzdHJpbmcpOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIGdpdmVuIGJvbmUgbm9kZSBpbiB0aGUgYm9uZSBhcnJheSwgb3IgLTEgaWYgaXQgaXMgbm90IHByZXNlbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmRleE9mKF9ub2RlOiBOb2RlKTogbnVtYmVyO1xyXG4gICAgcHVibGljIGluZGV4T2YoX25hbWU6IHN0cmluZyB8IE5vZGUpOiBudW1iZXIge1xyXG4gICAgICBpZiAodHlwZW9mIChfbmFtZSkgPT0gXCJzdHJpbmdcIilcclxuICAgICAgICByZXR1cm4gdGhpcy5ib25lcy5maW5kSW5kZXgoKF9ib25lOiBOb2RlKSA9PiBfYm9uZS5uYW1lID09IF9uYW1lKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiB0aGlzLmJvbmVzLmluZGV4T2YoX25hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgYm9uZSBtYXRyaWNlcyB0byBiZSB1c2VkIGJ5IHRoZSBzaGFkZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZSgpOiB2b2lkIHtcclxuICAgICAgZm9yIChjb25zdCBtdHhCb25lIG9mIHRoaXMubXR4Qm9uZXMpXHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4Qm9uZSk7XHJcbiAgICAgIHRoaXMubXR4Qm9uZXMubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmJvbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IG10eEJvbmU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMuYm9uZXNbaV0ubXR4V29ybGQsIHRoaXMubXR4QmluZEludmVyc2VzW2ldKTtcclxuICAgICAgICB0aGlzLm10eEJvbmVzLnB1c2gobXR4Qm9uZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgcG9zZSBvZiB0aGlzIHNrZWxldG9uIHRvIHRoZSBkZWZhdWx0IHBvc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0UG9zZSgpOiB2b2lkIHsgLy8gVE9ETzogdGVzdCB0aGlzXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmJvbmVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHRoaXMuYm9uZXNbaV0ubXR4TG9jYWwuY29weShNYXRyaXg0eDQuSU5WRVJTRSh0aGlzLm10eEJpbmRJbnZlcnNlc1tpXSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmJvbmVzID0gdGhpcy5ib25lcy5tYXAoX2JvbmUgPT4gTm9kZS5QQVRIX0ZST01fVE8odGhpcywgX2JvbmUpKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5tdHhCaW5kSW52ZXJzZXMgPSBTZXJpYWxpemVyLnNlcmlhbGl6ZUFycmF5KE1hdHJpeDR4NCwgdGhpcy5tdHhCaW5kSW52ZXJzZXMpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPENvbXBvbmVudFNrZWxldG9uPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuXHJcbiAgICAgIGNvbnN0IGhuZE5vZGVEZXNlcmlhbGl6ZWQ6IEV2ZW50TGlzdGVuZXJVbmlmaWVkID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYm9uZXMgPSBfc2VyaWFsaXphdGlvbi5ib25lcy5tYXAoKF9wYXRoOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGxldCBib25lOiBOb2RlID0gTm9kZS5GSU5EKHRoaXMsIF9wYXRoKSBhcyBOb2RlO1xyXG4gICAgICAgICAgaWYgKCFib25lKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Tm9kZS5uYW1lfSBcIiR7dGhpcy5ub2RlLm5hbWV9XCIgJHtDb21wb25lbnRTa2VsZXRvbi5uYW1lfTogQ291bGQgbm90IGZpbmQgYm9uZSAke19wYXRofWApO1xyXG4gICAgICAgICAgcmV0dXJuIGJvbmU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuXHJcbiAgICAgIHRoaXMubXR4QmluZEludmVyc2VzID0gPE1hdHJpeDR4NFtdPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemVBcnJheShfc2VyaWFsaXphdGlvbi5tdHhCaW5kSW52ZXJzZXMpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQXR0YWNoZXMgYSB7QGxpbmsgVGV4dHVyZVRleHR9IHRvIHRoZSBub2RlLiBcclxuICAgKiBXb3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayBDb21wb25lbnRNZXNofSBhbmQge0BsaW5rIENvbXBvbmVudE1hdGVyaWFsfSB0byBjcmVhdGUgYSB0ZXh0IG5vZGUuXHJcbiAgICogQSAndGV4dHVyZWQnIHtAbGluayBNYXRlcmlhbH0gKGUuZy4ge0BsaW5rIFNoYWRlckxpdFRleHR1cmVkfSkgbXVzdCBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIHRleHQgcHJvcGVybHkuIElkZWFsbHkgYSB7QGxpbmsgTWVzaFF1YWR9IHNob3VsZCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgdGV4dCBvbnRvLlxyXG4gICAqIEFkZGl0aW9uYWxseSBhIHtAbGluayBDb21wb25lbnRGYWNlQ2FtZXJhfSBjYW4gYmUgYXR0YWNoZWQgdG8gbWFrZSB0aGUgdGV4dCBmYWNlIHRoZSBjYW1lcmEuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFRleHQgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudFRleHQpO1xyXG5cclxuICAgIHB1YmxpYyByZWFkb25seSB0ZXh0dXJlOiBUZXh0dXJlVGV4dDtcclxuICAgIHB1YmxpYyByZWFkb25seSBtdHhXb3JsZDogTWF0cml4NHg0O1xyXG5cclxuICAgIC8qKiAtIG9uOiBUaGUgdGV4dHMgc2l6ZSBpcyBmaXhlZCB0byBtYXRjaCB0aGUgc2V0IGZvbnQgc2l6ZVxyXG4gICAgICogIC0gb2ZmOiBUaGUgZm9udCBzaXplIGlzIHN0cmV0Y2hlZCB0byBtYXRjaCB0aGUgYXR0YWNoZWQgbWVzaGVzIHNpemVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpeGVkU2l6ZTogYm9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3RleHQ/OiBzdHJpbmcsIF9mb250Pzogc3RyaW5nKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlVGV4dChDb21wb25lbnRUZXh0Lm5hbWUsIF90ZXh0LCBfZm9udCk7XHJcbiAgICAgIHRoaXMubXR4V29ybGQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgICAgdGhpcy5maXhlZFNpemUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXNlUmVuZGVyRGF0YShfbXR4TWVzaFRvV29ybGQ6IE1hdHJpeDR4NCwgX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhKTogTWF0cml4NHg0IHtcclxuICAgICAgdGhpcy50ZXh0dXJlLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5VTklUKTtcclxuICAgICAgdGhpcy5tdHhXb3JsZC5jb3B5KF9tdHhNZXNoVG9Xb3JsZCk7XHJcblxyXG4gICAgICBsZXQgc2NhbGluZzogVmVjdG9yMyA9IFJlY3ljbGVyLmdldChWZWN0b3IzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmZpeGVkU2l6ZSkge1xyXG4gICAgICAgIGxldCBzY2FsZTogbnVtYmVyO1xyXG4gICAgICAgIGxldCByZWN0OiBSZWN0YW5nbGUgPSBSZW5kZXIuZ2V0UmVuZGVyUmVjdGFuZ2xlKCk7XHJcbiAgICAgICAgc3dpdGNoIChfY21wQ2FtZXJhLmdldERpcmVjdGlvbigpKSB7XHJcbiAgICAgICAgICBjYXNlIEZJRUxEX09GX1ZJRVcuVkVSVElDQUw6XHJcbiAgICAgICAgICAgIHNjYWxlID0gMSAvIHJlY3QuaGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkhPUklaT05UQUw6XHJcbiAgICAgICAgICAgIHNjYWxlID0gMSAvIHJlY3Qud2lkdGggKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEZJRUxEX09GX1ZJRVcuRElBR09OQUw6XHJcbiAgICAgICAgICAgIHNjYWxlID0gMSAvIE1hdGguc3FydCgocmVjdC53aWR0aCAqIHJlY3QuaGVpZ2h0KSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZGlzdGFuY2U6IG51bWJlciA9IF9jbXBDYW1lcmEubXR4V29ybGQudHJhbnNsYXRpb24uZ2V0RGlzdGFuY2UoX210eE1lc2hUb1dvcmxkLnRyYW5zbGF0aW9uKTtcclxuICAgICAgICBzY2FsZSA9IHNjYWxlICogZGlzdGFuY2U7XHJcbiAgICAgICAgc2NhbGluZy5zZXQodGhpcy50ZXh0dXJlLndpZHRoICogc2NhbGUsIHRoaXMudGV4dHVyZS5oZWlnaHQgKiBzY2FsZSwgMSk7XHJcbiAgICAgICAgdGhpcy5tdHhXb3JsZC5zY2FsaW5nID0gc2NhbGluZztcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShkaXN0YW5jZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IHBpeGVsc1RvVW5pdHM6IG51bWJlciA9IDEgLyB0aGlzLnRleHR1cmUuaGVpZ2h0O1xyXG4gICAgICAgIHNjYWxpbmcuc2V0KHRoaXMudGV4dHVyZS53aWR0aCAqIHBpeGVsc1RvVW5pdHMsIHRoaXMudGV4dHVyZS5oZWlnaHQgKiBwaXhlbHNUb1VuaXRzLCAxKTtcclxuICAgICAgICB0aGlzLm10eFdvcmxkLnNjYWxlKHNjYWxpbmcpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgUmVjeWNsZXIuc3RvcmUoc2NhbGluZyk7XHJcbiAgICAgIHJldHVybiB0aGlzLm10eFdvcmxkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zU2VsZWN0ZWQoKTogdm9pZCB7XHJcbiAgICAgIGxldCBtZXNoOiBNZXNoID0gdGhpcy5ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKT8ubWVzaDtcclxuICAgICAgbGV0IGNtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCA9IHRoaXMubm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpO1xyXG4gICAgICBpZiAobWVzaCA9PSBudWxsIHx8IGNtcE1hdGVyaWFsID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdXaXJlTWVzaChtZXNoLCB0aGlzLm10eFdvcmxkLCBjbXBNYXRlcmlhbC5jbHJQcmltYXJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnRleHR1cmUubmFtZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGVudW0gQkFTRSB7XHJcbiAgICBTRUxGLCBQQVJFTlQsIFdPUkxELCBOT0RFXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHRyYW5zZm9ybS17QGxpbmsgTWF0cml4NHg0fSB0byB0aGUgbm9kZSwgbW92aW5nLCBzY2FsaW5nIGFuZCByb3RhdGluZyBpdCBpbiBzcGFjZSByZWxhdGl2ZSB0byBpdHMgcGFyZW50LlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFRyYW5zZm9ybSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50VHJhbnNmb3JtKTtcclxuICAgIHB1YmxpYyBtdHhMb2NhbDogTWF0cml4NHg0O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbXR4SW5pdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCkpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5tdHhMb2NhbCA9IF9tdHhJbml0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2Zvcm1hdGlvbnMgcmVzcGVjdGluZyB0aGUgaGllcmFyY2h5XHJcbiAgICAvKipcclxuICAgICAqIHJlY2FsY3VsYXRlcyB0aGlzIGxvY2FsIG1hdHJpeCB0byB5aWVsZCB0aGUgaWRlbnRpY2FsIHdvcmxkIG1hdHJpeCBiYXNlZCBvbiB0aGUgZ2l2ZW4gbm9kZS5cclxuICAgICAqIFVzZSByZWJhc2UgYmVmb3JlIGFwcGVuZGluZyB0aGUgY29udGFpbmVyIG9mIHRoaXMgY29tcG9uZW50IHRvIGFub3RoZXIgbm9kZSB3aGlsZSBwcmVzZXJ2aW5nIGl0cyB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgd29ybGQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWJhc2UoX25vZGU6IE5vZGUgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4TG9jYWw7XHJcbiAgICAgIGxldCBjb250YWluZXI6IE5vZGUgPSB0aGlzLm5vZGU7XHJcbiAgICAgIGlmIChjb250YWluZXIpXHJcbiAgICAgICAgbXR4UmVzdWx0ID0gY29udGFpbmVyLm10eFdvcmxkO1xyXG5cclxuICAgICAgaWYgKF9ub2RlKVxyXG4gICAgICAgIG10eFJlc3VsdCA9IE1hdHJpeDR4NC5SRUxBVElWRShtdHhSZXN1bHQsIG51bGwsIF9ub2RlLm10eFdvcmxkSW52ZXJzZSk7XHJcblxyXG4gICAgICB0aGlzLm10eExvY2FsID0gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgZ2l2ZW4gdHJhbnNmb3JtYXRpb24gcmVsYXRpdmUgdG8gdGhlIHNlbGVjdGVkIGJhc2UgKFNFTEYsIFBBUkVOVCwgV09STEQpIG9yIGEgcGFydGljdWxhciBvdGhlciBub2RlIChOT0RFKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNmb3JtKF9tdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCwgX2Jhc2U6IEJBU0UgPSBCQVNFLlNFTEYsIF9ub2RlOiBOb2RlID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICBzd2l0Y2ggKF9iYXNlKSB7XHJcbiAgICAgICAgY2FzZSBCQVNFLlNFTEY6XHJcbiAgICAgICAgICB0aGlzLm10eExvY2FsLm11bHRpcGx5KF9tdHhUcmFuc2Zvcm0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCQVNFLlBBUkVOVDpcclxuICAgICAgICAgIHRoaXMubXR4TG9jYWwubXVsdGlwbHkoX210eFRyYW5zZm9ybSwgdHJ1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJBU0UuTk9ERTpcclxuICAgICAgICAgIGlmICghX25vZGUpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJBU0UuTk9ERSByZXF1aXJlcyBhIG5vZGUgZ2l2ZW4gYXMgYmFzZVwiKTtcclxuICAgICAgICBjYXNlIEJBU0UuV09STEQ6XHJcbiAgICAgICAgICB0aGlzLnJlYmFzZShfbm9kZSk7XHJcbiAgICAgICAgICB0aGlzLm10eExvY2FsLm11bHRpcGx5KF9tdHhUcmFuc2Zvcm0sIHRydWUpO1xyXG5cclxuICAgICAgICAgIGxldCBub2RlOiBOb2RlID0gdGhpcy5ub2RlO1xyXG4gICAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgbGV0IG10eFRlbXA6IE1hdHJpeDR4NDtcclxuICAgICAgICAgICAgaWYgKF9iYXNlID09IEJBU0UuTk9ERSkge1xyXG4gICAgICAgICAgICAgIC8vIGZpeCBtdHhXb3JsZCBvZiBjb250YWluZXIgZm9yIHN1YnNlcXVlbnQgcmViYXNpbmcgXHJcbiAgICAgICAgICAgICAgbXR4VGVtcCA9IE1hdHJpeDR4NC5QUk9EVUNUKF9ub2RlLm10eFdvcmxkLCBub2RlLm10eExvY2FsKTtcclxuICAgICAgICAgICAgICBub2RlLm10eFdvcmxkLmNvcHkobXR4VGVtcCk7XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4VGVtcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBwYXJlbnQ6IE5vZGUgPSBub2RlLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgLy8gZml4IG10eExvY2FsIGZvciBjdXJyZW50IHBhcmVudFxyXG4gICAgICAgICAgICAgIHRoaXMucmViYXNlKG5vZGUuZ2V0UGFyZW50KCkpO1xyXG4gICAgICAgICAgICAgIG10eFRlbXAgPSBNYXRyaXg0eDQuUFJPRFVDVChub2RlLmdldFBhcmVudCgpLm10eFdvcmxkLCBub2RlLm10eExvY2FsKTtcclxuICAgICAgICAgICAgICBub2RlLm10eFdvcmxkLmNvcHkobXR4VGVtcCk7XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4VGVtcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGxvY2FsOiB0aGlzLm10eExvY2FsLnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIGF3YWl0IHRoaXMubXR4TG9jYWwuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ubG9jYWwpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAvLyAgICAgdGhpcy5sb2NhbC5tdXRhdGUoX211dGF0b3IpO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7IFxyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLmxvY2FsLmdldE11dGF0b3IoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgIC8vICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHRoaXMubG9jYWwuZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yKTtcclxuICAgIC8vICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLndvcmxkO1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVzY3JpYmVzIGEgVlIgQ29udHJvbGxlciBhbmQgaXRzIGNhcGFiaWxpdGllcy5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVlJDb250cm9sbGVyIHtcclxuICAgIHB1YmxpYyBjbXBUcmFuc2Zvcm06IENvbXBvbmVudFRyYW5zZm9ybSA9IG51bGw7XHJcbiAgICBwdWJsaWMgZ2FtZVBhZDogR2FtZXBhZCA9IG51bGw7XHJcbiAgICBwdWJsaWMgdGh1bWJzdGlja1g6IG51bWJlciA9IG51bGw7XHJcbiAgICBwdWJsaWMgdGh1bWJzdGlja1k6IG51bWJlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWUiBDb21wb25lbnQgQ2xhc3MsIGZvciBTZXNzaW9uIE1hbmFnZW1lbnQsIENvbnRyb2xsZXIgTWFuYWdlbWVudCBhbmQgUmVmZXJlbmNlIFNwYWNlIE1hbmFnZW1lbnQuIFxyXG4gICAqIEBhdXRob3IgVmFsZW50aW4gU2NobWlkYmVyZ2VyLCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50VlJEZXZpY2UgZXh0ZW5kcyBDb21wb25lbnRDYW1lcmEge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudFZSRGV2aWNlKTtcclxuICAgIHB1YmxpYyByaWdodENudHJsOiBWUkNvbnRyb2xsZXIgPSBuZXcgVlJDb250cm9sbGVyKCk7XHJcbiAgICBwdWJsaWMgbGVmdENudHJsOiBWUkNvbnRyb2xsZXIgPSBuZXcgVlJDb250cm9sbGVyKCk7XHJcblxyXG4gICAgI210eExvY2FsOiBNYXRyaXg0eDQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy5nZXRNdHhMb2NhbEZyb21DbXBUcmFuc2Zvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgYWN0dWFsIG1hdHJpeCBvZiB0aGUgdnIgLSBkZXZpY2UuXHJcbiAgICAgKiBDcmVhdG9ycyBzaG91bGQgdXNlIHRoaXMgZm9yIHJlYWRvbmx5IHB1cnBvc2VzLiAgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbXR4TG9jYWwoKTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI210eExvY2FsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIFZlY3RvcjMgYXMgUG9zaXRpb24gb2YgdGhlIHJlZmVyZW5jZSBzcGFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCB0cmFuc2xhdGlvbihfdHJhbnNsYXRpb246IFZlY3RvcjMpIHtcclxuICAgICAgbGV0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gX3RyYW5zbGF0aW9uLmNsb25lO1xyXG4gICAgICB0cmFuc2xhdGlvbi5zdWJ0cmFjdCh0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbik7XHJcbiAgICAgIHRyYW5zbGF0aW9uLm5lZ2F0ZSgpO1xyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UgPSBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UuZ2V0T2Zmc2V0UmVmZXJlbmNlU3BhY2UobmV3IFhSUmlnaWRUcmFuc2Zvcm0odHJhbnNsYXRpb24pKTtcclxuICAgICAgdGhpcy4jbXR4TG9jYWwudHJhbnNsYXRpb24gPSBfdHJhbnNsYXRpb247XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHRyYW5zbGF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgVmVjdG9yMyBSb3RhdGlvbiBvZiB0aGUgcmVmZXJlbmNlIHNwYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHJvdGF0aW9uKF9yb3RhdGlvbjogVmVjdG9yMykge1xyXG4gICAgICBsZXQgcm90YXRpb246IFZlY3RvcjMgPSBfcm90YXRpb24uY2xvbmU7IFxyXG4gICAgICByb3RhdGlvbi5zdWJ0cmFjdCh0aGlzLiNtdHhMb2NhbC5yb3RhdGlvbik7XHJcbiAgICAgIHJvdGF0aW9uLm5lZ2F0ZSgpO1xyXG4gICAgICBsZXQgb3JpZW50YXRpb246IFF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xyXG4gICAgICBvcmllbnRhdGlvbi5ldWxlckFuZ2xlcyA9IHJvdGF0aW9uO1xyXG4gICAgICAvLyBSb3RhdGlvbiBuZWVkcyB0byBiZSBzZXQgaW4gdGhlIE9yaWdpbiAoMCwwLDApLCBvdGhlcndpc2UgdGhlIFhSLVJpZyBnZXRzIHJvdGF0ZWQgYXJvdW5kIHRoZSBvcmlnaW4uIFxyXG4gICAgICAvLyBzZXQgeHIgLSByaWcgYmFjayB0byBvcmlnaW5cclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbiwgVmVjdG9yMy5aRVJPKCkpKSk7XHJcbiAgICAgIC8vIHJvdGF0ZSB4ciByaWcgaW4gb3JpZ2luXHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybShWZWN0b3IzLlpFUk8oKSwgb3JpZW50YXRpb24pKTtcclxuICAgICAgLy8gc2V0IHhyIC0gcmlnIGJhY2sgdG8gbGFzdCBwb3NpdGlvbiBcclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRShWZWN0b3IzLlpFUk8oKSwgdGhpcy4jbXR4TG9jYWwudHJhbnNsYXRpb24pKSk7XHJcbiAgICAgIHRoaXMuI210eExvY2FsLnJvdGF0aW9uID0gX3JvdGF0aW9uO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyb3RhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgVmVjdG9yMyBpbiBQb3NpdGlvbiBvZiB0aGUgcmVmZXJlbmNlIHNwYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlKF9ieTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSBfYnkuY2xvbmU7XHJcbiAgICAgIHRyYW5zbGF0aW9uLnRyYW5zZm9ybSh0aGlzLiNtdHhMb2NhbC5xdWF0ZXJuaW9uKTtcclxuICAgICAgdHJhbnNsYXRpb24ubmVnYXRlKCk7XHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybSh0cmFuc2xhdGlvbikpO1xyXG4gICAgICB0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGUoX2J5KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFZlY3RvcjMgaW4gUm90YXRpb24gb2YgdGhlIHJlZmVyZW5jZSBzcGFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJvdGF0ZShfYnk6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgbGV0IHJvdGF0aW9uOiBWZWN0b3IzID0gX2J5LmNsb25lLm5lZ2F0ZSgpOyBcclxuICAgICAgbGV0IG9yaWVudGF0aW9uOiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuICAgICAgb3JpZW50YXRpb24uZXVsZXJBbmdsZXMgPSByb3RhdGlvbjtcclxuICAgICAgLy8gUm90YXRpb24gbmVlZHMgdG8gYmUgYWRkZWQgaW4gdGhlIE9yaWdpbiAoMCwwLDApLCBvdGhlcndpc2UgdGhlIFhSLVJpZyBnZXRzIHJvdGF0ZWQgYXJvdW5kIHRoZSBvcmlnaW4uIFxyXG4gICAgICAvLyBzZXQgeHIgLSByaWcgYmFjayB0byBvcmlnaW5cclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbiwgVmVjdG9yMy5aRVJPKCkpKSk7XHJcbiAgICAgIC8vIHJvdGF0ZSB4ciByaWcgaW4gb3JpZ2luXHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybShWZWN0b3IzLlpFUk8oKSwgb3JpZW50YXRpb24pKTtcclxuICAgICAgLy8gc2V0IHhyIC0gcmlnIGJhY2sgdG8gbGFzdCBwb3NpdGlvbiBcclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuRElGRkVSRU5DRShWZWN0b3IzLlpFUk8oKSwgdGhpcy4jbXR4TG9jYWwudHJhbnNsYXRpb24pKSk7XHJcbiAgICAgIHRoaXMuI210eExvY2FsLnJvdGF0ZShfYnkpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyb3RhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNdHhMb2NhbEZyb21DbXBUcmFuc2Zvcm0oKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI210eExvY2FsID0gdGhpcy5ub2RlLm10eExvY2FsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIGV4cG9ydCBjb25zdCBlbnVtIEVWRU5UX0NPTlRST0wge1xyXG4gICAgSU5QVVQgPSBcImlucHV0XCIsXHJcbiAgICBPVVRQVVQgPSBcIm91dHB1dFwiXHJcbiAgfVxyXG5cclxuICBleHBvcnQgY29uc3QgZW51bSBDT05UUk9MX1RZUEUge1xyXG4gICAgLyoqIFRoZSBvdXRwdXQgc2ltcGx5IGZvbGxvd3MgdGhlIHNjYWxlZCBhbmQgZGVsYXllZCBpbnB1dCAqL1xyXG4gICAgUFJPUE9SVElPTkFMLFxyXG4gICAgLyoqIFRoZSBvdXRwdXQgdmFsdWUgY2hhbmdlcyBvdmVyIHRpbWUgd2l0aCBhIHJhdGUgZ2l2ZW4gYnkgdGhlIHNjYWxlZCBhbmQgZGVsYXllZCBpbnB1dCAqL1xyXG4gICAgSU5URUdSQUwsXHJcbiAgICAvKiogVGhlIG91dHB1dCB2YWx1ZSByZWFjdHMgdG8gY2hhbmdlcyBvZiB0aGUgc2NhbGVkIGlucHV0IGFuZCBkcm9wcyB0byAwIHdpdGggZ2l2ZW4gZGVsYXksIGlmIGlucHV0IHJlbWFpbnMgY29uc3RhbnQgKi9cclxuICAgIERJRkZFUkVOVElBTFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJvY2Vzc2VzIGlucHV0IHNpZ25hbHMgb2YgdHlwZSBudW1iZXIgYW5kIGdlbmVyYXRlcyBhbiBvdXRwdXQgc2lnbmFsIG9mIHRoZSBzYW1lIHR5cGUgdXNpbmcgXHJcbiAgICogcHJvcG9ydGlvbmFsLCBpbnRlZ3JhbCBvciBkaWZmZXJlbnRpYWwgbWFwcGluZywgYW4gYW1wbGlmaWNhdGlvbiBmYWN0b3IgYW5kIGEgbGluZWFyIGRhbXBlbmluZy9kZWxheVxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxyXG4gICAqICAgICAgICAg4pSCICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgcGFzcyB0aHJvdWdoIChQcm9wb3J0aW9uYWwpICAgICAg4pSCXHJcbiAgICogSW5wdXQg4oaSIOKUgiDihpIg4pSCYW1wbGlmeeKUgiDihpIg4pSCZGVsYXnilIIg4oaSIOKanyBzdW0gdXAgb3ZlciB0aW1lIChJbnRlZ3JhbCkg4pqeIOKGkiDilIIg4oaSIE91dHB1dFxyXG4gICAqICAgICAgICAg4pSCICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgcGFzcyBjaGFuZ2UgIChEaWZmZXJlbnRpYWwpICAgICAg4pSCXHJcbiAgICogICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbnRyb2wgZXh0ZW5kcyBFdmVudFRhcmdldCB7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogQ09OVFJPTF9UWVBFO1xyXG4gICAgcHVibGljIGFjdGl2ZTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgcHJvdGVjdGVkIHJhdGVEaXNwYXRjaE91dHB1dDogbnVtYmVyID0gMDtcclxuICAgIHByb3RlY3RlZCB2YWx1ZVByZXZpb3VzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIG91dHB1dEJhc2U6IG51bWJlciA9IDA7XHJcbiAgICBwcm90ZWN0ZWQgb3V0cHV0VGFyZ2V0OiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIG91dHB1dFByZXZpb3VzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIG91dHB1dFRhcmdldFByZXZpb3VzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIGZhY3RvcjogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgdGltZTogVGltZSA9IFRpbWUuZ2FtZTtcclxuICAgIHByb3RlY3RlZCB0aW1lVmFsdWVEZWxheTogbnVtYmVyID0gMDtcclxuICAgIHByb3RlY3RlZCB0aW1lT3V0cHV0VGFyZ2V0U2V0OiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIGlkVGltZXI6IG51bWJlciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZywgX2ZhY3RvcjogbnVtYmVyID0gMSwgX3R5cGU6IENPTlRST0xfVFlQRSA9IENPTlRST0xfVFlQRS5QUk9QT1JUSU9OQUwsIF9kZWxheTogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmZhY3RvciA9IF9mYWN0b3I7XHJcbiAgICAgIHRoaXMudHlwZSA9IF90eXBlO1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLnNldERlbGF5KF9kZWxheSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHRpbWUtb2JqZWN0IHRvIGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IGluIHtAbGluayBDT05UUk9MX1RZUEUuSU5URUdSQUx9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRUaW1lYmFzZShfdGltZTogVGltZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnRpbWUgPSBfdGltZTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVPdXRwdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZlZWQgYW4gaW5wdXQgdmFsdWUgaW50byB0aGlzIGNvbnRyb2wgYW5kIGZpcmUgdGhlIGV2ZW50cyB7QGxpbmsgRVZFTlRfQ09OVFJPTC5JTlBVVH0gYW5kIHtAbGluayBFVkVOVF9DT05UUk9MLk9VVFBVVH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldElucHV0KF9pbnB1dDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5hY3RpdmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5vdXRwdXRCYXNlID0gdGhpcy5jYWxjdWxhdGVPdXRwdXQoKTtcclxuICAgICAgdGhpcy52YWx1ZVByZXZpb3VzID0gdGhpcy5nZXRWYWx1ZURlbGF5ZWQoKTtcclxuICAgICAgdGhpcy5vdXRwdXRUYXJnZXQgPSB0aGlzLmZhY3RvciAqIF9pbnB1dDtcclxuICAgICAgdGhpcy50aW1lT3V0cHV0VGFyZ2V0U2V0ID0gdGhpcy50aW1lLmdldCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMudHlwZSA9PSBDT05UUk9MX1RZUEUuRElGRkVSRU5USUFMKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZVByZXZpb3VzID0gdGhpcy5vdXRwdXRUYXJnZXQgLSB0aGlzLm91dHB1dFRhcmdldFByZXZpb3VzO1xyXG4gICAgICAgIHRoaXMub3V0cHV0VGFyZ2V0UHJldmlvdXMgPSB0aGlzLm91dHB1dFRhcmdldDtcclxuICAgICAgICB0aGlzLm91dHB1dFRhcmdldCA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlRfQ09OVFJPTC5JTlBVVCkpO1xyXG4gICAgICBpZiAodGhpcy50eXBlID09IENPTlRST0xfVFlQRS5ESUZGRVJFTlRJQUwpXHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaE91dHB1dCh0aGlzLnZhbHVlUHJldmlvdXMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaE91dHB1dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRPRE86IGRlc2NyaWJlIVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHVsc2UoX2lucHV0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXRJbnB1dChfaW5wdXQpO1xyXG4gICAgICB0aGlzLnNldElucHV0KDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0aW1lIHRvIHRha2UgZm9yIHRoZSBpbnRlcm5hbCBsaW5lYXIgZGFtcGVuaW5nIHVudGlsIHRoZSBmaW5hbCBvdXB1dCB2YWx1ZSBpcyByZWFjaGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXREZWxheShfdGltZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudGltZVZhbHVlRGVsYXkgPSBNYXRoLm1heCgwLCBfdGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBvdXRwdXQtZXZlbnRzIHRvIGRpc3BhdGNoIHBlciBzZWNvbmQuIFxyXG4gICAgICogQXQgdGhlIGRlZmF1bHQgb2YgMCwgdGhlIGNvbnRyb2wgb3V0cHV0IG11c3QgYmUgcG9sbGVkIGFuZCB3aWxsIG9ubHkgYWN0aXZlbHkgZGlzcGF0Y2hlZCBvbmNlIGVhY2ggdGltZSBpbnB1dCBvY2N1cnMgYW5kIHRoZSBvdXRwdXQgY2hhbmdlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFJhdGVEaXNwYXRjaE91dHB1dChfcmF0ZURpc3BhdGNoT3V0cHV0OiBudW1iZXIgPSAwKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmF0ZURpc3BhdGNoT3V0cHV0ID0gX3JhdGVEaXNwYXRjaE91dHB1dDtcclxuICAgICAgdGhpcy50aW1lLmRlbGV0ZVRpbWVyKHRoaXMuaWRUaW1lcik7XHJcbiAgICAgIHRoaXMuaWRUaW1lciA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHRoaXMucmF0ZURpc3BhdGNoT3V0cHV0KVxyXG4gICAgICAgIHRoaXMuaWRUaW1lciA9IHRoaXMudGltZS5zZXRUaW1lcigxMDAwIC8gdGhpcy5yYXRlRGlzcGF0Y2hPdXRwdXQsIDAsIHRoaXMuZGlzcGF0Y2hPdXRwdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBmYWN0b3IgdG8gbXVsdGlwbHkgdGhlIGlucHV0IHZhbHVlIGdpdmVuIHdpdGgge0BsaW5rIHNldElucHV0fSB3aXRoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRGYWN0b3IoX2ZhY3RvcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZmFjdG9yID0gX2ZhY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoaXMgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T3V0cHV0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZU91dHB1dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgb3V0cHV0IG9mIHRoaXMgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlT3V0cHV0KCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBvdXRwdXQ6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCB2YWx1ZTogbnVtYmVyID0gdGhpcy5nZXRWYWx1ZURlbGF5ZWQoKTtcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBDT05UUk9MX1RZUEUuSU5URUdSQUw6XHJcbiAgICAgICAgICBsZXQgdGltZUN1cnJlbnQ6IG51bWJlciA9IHRoaXMudGltZS5nZXQoKTtcclxuICAgICAgICAgIGxldCB0aW1lRWxhcHNlZFNpbmNlSW5wdXQ6IG51bWJlciA9IHRpbWVDdXJyZW50IC0gdGhpcy50aW1lT3V0cHV0VGFyZ2V0U2V0O1xyXG4gICAgICAgICAgb3V0cHV0ID0gdGhpcy5vdXRwdXRCYXNlO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnRpbWVWYWx1ZURlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICBpZiAodGltZUVsYXBzZWRTaW5jZUlucHV0IDwgdGhpcy50aW1lVmFsdWVEZWxheSkge1xyXG4gICAgICAgICAgICAgIG91dHB1dCArPSAwLjUgKiAodGhpcy52YWx1ZVByZXZpb3VzICsgdmFsdWUpICogdGltZUVsYXBzZWRTaW5jZUlucHV0O1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG91dHB1dCArPSAwLjUgKiAodGhpcy52YWx1ZVByZXZpb3VzICsgdmFsdWUpICogdGhpcy50aW1lVmFsdWVEZWxheTtcclxuICAgICAgICAgICAgICB0aW1lRWxhcHNlZFNpbmNlSW5wdXQgLT0gdGhpcy50aW1lVmFsdWVEZWxheTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgb3V0cHV0ICs9IHZhbHVlICogdGltZUVsYXBzZWRTaW5jZUlucHV0O1xyXG4gICAgICAgICAgLy8gdmFsdWUgKz0gMC41ICogKHRoaXMuaW5wdXRQcmV2aW91cyAtIGlucHV0KSAqIHRoaXMudGltZUlucHV0RGVsYXkgKyBpbnB1dCAqIHRpbWVFbGFwc2VkU2luY2VJbnB1dDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ09OVFJPTF9UWVBFLkRJRkZFUkVOVElBTDpcclxuICAgICAgICBjYXNlIENPTlRST0xfVFlQRS5QUk9QT1JUSU9OQUw6XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIG91dHB1dCA9IHZhbHVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogY2FsY3VsYXRlcyB0aGUgb3V0cHV0IGNvbnNpZGVyaW5nIHRoZSB0aW1lIG9mIHRoZSBkZWxheVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhbHVlRGVsYXllZCgpOiBudW1iZXIge1xyXG4gICAgICBpZiAodGhpcy50aW1lVmFsdWVEZWxheSA+IDApIHtcclxuICAgICAgICBsZXQgdGltZUVsYXBzZWRTaW5jZUlucHV0OiBudW1iZXIgPSB0aGlzLnRpbWUuZ2V0KCkgLSB0aGlzLnRpbWVPdXRwdXRUYXJnZXRTZXQ7XHJcbiAgICAgICAgaWYgKHRpbWVFbGFwc2VkU2luY2VJbnB1dCA8IHRoaXMudGltZVZhbHVlRGVsYXkpXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVByZXZpb3VzICsgKHRoaXMub3V0cHV0VGFyZ2V0IC0gdGhpcy52YWx1ZVByZXZpb3VzKSAqIHRpbWVFbGFwc2VkU2luY2VJbnB1dCAvIHRoaXMudGltZVZhbHVlRGVsYXk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMub3V0cHV0VGFyZ2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGlzcGF0Y2hPdXRwdXQgPSAoX2V2ZW50T3JWYWx1ZTogRXZlbnRUaW1lciB8IG51bWJlcik6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuYWN0aXZlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGxldCB0aW1lcjogVGltZXIgPSB0aGlzLnRpbWUuZ2V0VGltZXIodGhpcy5pZFRpbWVyKTtcclxuICAgICAgbGV0IG91dHB1dDogbnVtYmVyO1xyXG4gICAgICBpZiAodHlwZW9mIChfZXZlbnRPclZhbHVlKSA9PSBcIm51bWJlclwiKVxyXG4gICAgICAgIG91dHB1dCA9IF9ldmVudE9yVmFsdWU7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLmNhbGN1bGF0ZU91dHB1dCgpO1xyXG4gICAgICBsZXQgb3V0cHV0Q2hhbmdlZDogYm9vbGVhbiA9IChvdXRwdXQgIT0gdGhpcy5vdXRwdXRQcmV2aW91cyk7XHJcblxyXG4gICAgICBpZiAodGltZXIpIHtcclxuICAgICAgICB0aW1lci5hY3RpdmUgPSBvdXRwdXRDaGFuZ2VkO1xyXG4gICAgICAgIGlmICghb3V0cHV0Q2hhbmdlZClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5vdXRwdXRQcmV2aW91cyA9IG91dHB1dDtcclxuXHJcbiAgICAgIGxldCBldmVudDogQ3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoRVZFTlRfQ09OVFJPTC5PVVRQVVQsIHtcclxuICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgIG91dHB1dDogb3V0cHV0XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIkNvbnRyb2wudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgbXVsdGlwbGUgY29udHJvbHMgYXMgaW5wdXRzIGFuZCBjcmVhdGVzIGFuIG91dHB1dCBmcm9tIHRoYXQuXHJcbiAgICogQXMgYSBzdWJjbGFzcyBvZiB7QGxpbmsgQ29udHJvbH0sIGF4aXMgY2FsY3VsYXRlcyB0aGUgb3VwdXQgc3VtbWluZyB1cCB0aGUgaW5wdXRzIGFuZCBwcm9jZXNzaW5nIHRoZSByZXN1bHQgdXNpbmcgaXRzIG93biBzZXR0aW5ncy4gIFxyXG4gICAqIERpc3BhdGNoZXMge0BsaW5rIEVWRU5UX0NPTlRST0wuT1VUUFVUfSBhbmQge0BsaW5rIEVWRU5UX0NPTlRST0wuSU5QVVR9IHdoZW4gb25lIG9mIHRoZSBjb250cm9scyBkaXNwYXRjaGVzIHRoZW0uXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcclxuICAgKiAgICAgICAgICAg4pSCIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgSW5wdXQg4oaSIOKUgiDilIJjb250cm9s4pSCXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgICAgICAgICDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgICAgICAgICDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICBcXOKUjOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUglxyXG4gICAqICAgSW5wdXQg4oaSIOKUgiDilIJjb250cm9s4pSCLS0t4pSCc3Vt4pSCIOKGkiDilIJpbnRlcm5hbCBjb250cm9sIOKUgiDihpIg4pSCIOKGkiBPdXRwdXRcclxuICAgKiAgICAgICAgICAg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgL+KUlOKUgOKUgOKUgOKUmCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUglxyXG4gICAqICAgICAgICAgICDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXHJcbiAgICogICBJbnB1dCDihpIg4pSCIOKUgmNvbnRyb2zilIIvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcclxuICAgKiAgICAgICAgICAg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggIFxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBBeGlzIGV4dGVuZHMgQ29udHJvbCB7XHJcbiAgICBwcml2YXRlIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBDb250cm9sPiA9IG5ldyBNYXAoKTtcclxuICAgIHByaXZhdGUgc3VtUHJldmlvdXM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgdGhlIGNvbnRyb2wgZ2l2ZW4gdG8gdGhlIGxpc3Qgb2YgY29udHJvbHMgZmVlZGluZyBpbnRvIHRoaXMgYXhpc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkQ29udHJvbChfY29udHJvbDogQ29udHJvbCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmNvbnRyb2xzLnNldChfY29udHJvbC5uYW1lLCBfY29udHJvbCk7XHJcbiAgICAgIF9jb250cm9sLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRfQ09OVFJPTC5JTlBVVCwgdGhpcy5obmRJbnB1dEV2ZW50KTtcclxuICAgICAgX2NvbnRyb2wuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9DT05UUk9MLk9VVFBVVCwgdGhpcy5obmRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbnRyb2woX25hbWU6IHN0cmluZyk6IENvbnRyb2wge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb250cm9scy5nZXQoX25hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDb250cm9sKF9uYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgbGV0IGNvbnRyb2w6IENvbnRyb2wgPSB0aGlzLmdldENvbnRyb2woX25hbWUpO1xyXG4gICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgIGNvbnRyb2wucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVF9DT05UUk9MLklOUFVULCB0aGlzLmhuZElucHV0RXZlbnQpO1xyXG4gICAgICAgIGNvbnRyb2wucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVF9DT05UUk9MLk9VVFBVVCwgdGhpcy5obmRPdXRwdXRFdmVudCk7XHJcbiAgICAgICAgdGhpcy5jb250cm9scy5kZWxldGUoX25hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGF4aXMgYWZ0ZXIgc3VtbWluZyB1cCBhbGwgaW5wdXRzIGFuZCBwcm9jZXNzaW5nIHRoZSBzdW0gYWNjb3JkaW5nIHRvIHRoZSBheGlzJyBzZXR0aW5nc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T3V0cHV0KCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBzdW1JbnB1dDogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChsZXQgY29udHJvbCBvZiB0aGlzLmNvbnRyb2xzKSB7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sWzFdLmFjdGl2ZSlcclxuICAgICAgICAgIHN1bUlucHV0ICs9IGNvbnRyb2xbMV0uZ2V0T3V0cHV0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdW1JbnB1dCAhPSB0aGlzLnN1bVByZXZpb3VzKVxyXG4gICAgICAgIHN1cGVyLnNldElucHV0KHN1bUlucHV0KTtcclxuXHJcbiAgICAgIHRoaXMuc3VtUHJldmlvdXMgPSBzdW1JbnB1dDtcclxuXHJcbiAgICAgIHJldHVybiBzdXBlci5nZXRPdXRwdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhuZE91dHB1dEV2ZW50OiBFdmVudExpc3RlbmVyID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgY29udHJvbDogQ29udHJvbCA9ICg8Q29udHJvbD5fZXZlbnQudGFyZ2V0KTtcclxuICAgICAgbGV0IGV2ZW50OiBDdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChFVkVOVF9DT05UUk9MLk9VVFBVVCwge1xyXG4gICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgY29udHJvbDogY29udHJvbCxcclxuICAgICAgICAgIGlucHV0OiAoPEN1c3RvbUV2ZW50Pl9ldmVudCkuZGV0YWlsLm91dHB1dCxcclxuICAgICAgICAgIG91dHB1dDogdGhpcy5nZXRPdXRwdXQoKVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgaG5kSW5wdXRFdmVudDogRXZlbnRMaXN0ZW5lciA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5hY3RpdmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGV2ZW50OiBFdmVudCA9IG5ldyBFdmVudChFVkVOVF9DT05UUk9MLklOUFVULCBfZXZlbnQpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBpbnRlcmZhY2UgS2V5UHJlc3NlZCB7XHJcbiAgICBbY29kZTogc3RyaW5nXTogYm9vbGVhbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbGxlY3RzIHRoZSBrZXlzIHByZXNzZWQgb24gdGhlIGtleWJvYXJkIGFuZCBzdG9yZXMgdGhlaXIgc3RhdHVzLiBcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgS2V5Ym9hcmQge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMga2V5c1ByZXNzZWQ6IEtleVByZXNzZWQgPSBLZXlib2FyZC5pbml0aWFsaXplKCk7XHJcbiAgICAvLyBwcml2YXRlIHN0YXRpYyBjb2RlX2VuOiBPYmplY3Q7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSBnaXZlbiBrZXlzIGlzIGlzIGN1cnJlbnRseSBiZWluZyBwcmVzc2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc3NlZE9uZShfa2V5czogS0VZQk9BUkRfQ09ERVtdKTogYm9vbGVhbiB7XHJcbiAgICAgIGZvciAobGV0IGNvZGUgb2YgX2tleXMpIHtcclxuICAgICAgICBpZiAoS2V5Ym9hcmQua2V5c1ByZXNzZWRbY29kZV0pXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBnaXZlbiBrZXlzIGFyZSBjdXJyZW50bHkgYmVpbmcgcHJlc3NlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc3NlZENvbWJvKF9rZXlzOiBLRVlCT0FSRF9DT0RFW10pOiBib29sZWFuIHtcclxuICAgICAgZm9yIChsZXQgY29kZSBvZiBfa2V5cykge1xyXG4gICAgICAgIGlmICghS2V5Ym9hcmQua2V5c1ByZXNzZWRbY29kZV0pXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBnaXZlbiBhcyBfYWN0aXZlIGlmIG9uZSBvciwgd2hlbiBfY29tYm8gaXMgdHJ1ZSwgYWxsIG9mIHRoZSBnaXZlbiBrZXlzIGFyZSBwcmVzc2VkLlxyXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgZ2l2ZW4gYXMgX2luYWN0aXZlIGlmIG5vdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBtYXBUb1ZhbHVlPFQ+KF9hY3RpdmU6IFQsIF9pbmFjdGl2ZTogVCwgX2tleXM6IEtFWUJPQVJEX0NPREVbXSwgX2NvbWJvOiBib29sZWFuID0gZmFsc2UpOiBUIHtcclxuICAgICAgaWYgKCFfY29tYm8gJiYgS2V5Ym9hcmQuaXNQcmVzc2VkT25lKF9rZXlzKSlcclxuICAgICAgICByZXR1cm4gX2FjdGl2ZTtcclxuICAgICAgaWYgKEtleWJvYXJkLmlzUHJlc3NlZENvbWJvKF9rZXlzKSlcclxuICAgICAgICByZXR1cm4gX2FjdGl2ZTtcclxuICAgICAgcmV0dXJuIF9pbmFjdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBiYWxhbmNlZCB0ZXJuYXJ5IHZhbHVlIChlaXRoZXIgLTEsIDAgb3IgMSkgXHJcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIG1hdGNoIG9mIHRoZSBrZXlzIGN1cnJlbnRseSBiZWluZyBwcmVzc2VkIGFuZCB0aGUgbGlzdHMgb2Yga2V5cyBnaXZlbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBtYXBUb1RyaXQoX3Bvc2l0aXZlOiBLRVlCT0FSRF9DT0RFW10sIF9uZWdhdGl2ZTogS0VZQk9BUkRfQ09ERVtdKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIEtleWJvYXJkLm1hcFRvVmFsdWUoLTEsIDAsIF9uZWdhdGl2ZSkgKyBLZXlib2FyZC5tYXBUb1ZhbHVlKDEsIDAsIF9wb3NpdGl2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBsb2NhbGUoX2tleWJvYXJkOiBPYmplY3QpOiB2b2lkIHtcclxuICAgIC8vICAgaWYgKCFLZXlib2FyZC5jb2RlX2VuKSB7XHJcbiAgICAvLyAgICAgLy8gc2F2ZSBvcmlnaW5hbCBrZXlib2FyZCBjb2RlcyB0byBiZSBhYmxlIHRvIHN3aXRjaCBiYWNrIGxhdGVyXHJcbiAgICAvLyAgICAgS2V5Ym9hcmQuY29kZV9lbiA9IHt9O1xyXG4gICAgLy8gICAgIE9iamVjdC5hc3NpZ24oS2V5Ym9hcmQuY29kZV9lbiwgS0VZQk9BUkRfQ09ERSk7XHJcbiAgICAvLyAgIH1cclxuXHJcbiAgICAvLyAgIGZvciAobGV0IGtleSBpbiBfa2V5Ym9hcmQpIHtcclxuICAgIC8vICAgICBsZXQgdmFsdWU6IHN0cmluZyA9IFJlZmxlY3QuZ2V0KF9rZXlib2FyZCwga2V5KTtcclxuICAgIC8vICAgICBmb3IgKGxldCBvcmlnaW5hbCBpbiBLRVlCT0FSRF9DT0RFKVxyXG4gICAgLy8gICAgICAgaWYgKFJlZmxlY3QuZ2V0KEtFWUJPQVJEX0NPREUsIG9yaWdpbmFsKSA9PSB2YWx1ZSlcclxuICAgIC8vICAgICAgICAgLy8gcmVtb3ZlIG9yaWdpbmFsIGtleSB0aGUgeWllbGRzIHRoZSB2YWx1ZVxyXG4gICAgLy8gICAgICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KEtFWUJPQVJEX0NPREUsIG9yaWdpbmFsKTtcclxuICAgIC8vICAgICAvLyBhZGQgbmV3IGtleSB0byB5aWVsZCB0aGF0IHZhbHVlXHJcbiAgICAvLyAgICAgUmVmbGVjdC5zZXQoS0VZQk9BUkRfQ09ERSwga2V5LCB2YWx1ZSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbml0aWFsaXplKCk6IEtleVByZXNzZWQge1xyXG4gICAgICBsZXQgc3RvcmU6IEtleVByZXNzZWQgPSB7fTtcclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgS2V5Ym9hcmQuaG5kS2V5SW50ZXJhY3Rpb24pO1xyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgS2V5Ym9hcmQuaG5kS2V5SW50ZXJhY3Rpb24pO1xyXG4gICAgICByZXR1cm4gc3RvcmU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaG5kS2V5SW50ZXJhY3Rpb24oX2V2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIEtleWJvYXJkLmtleXNQcmVzc2VkW19ldmVudC5jb2RlXSA9IChfZXZlbnQudHlwZSA9PSBcImtleWRvd25cIik7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z1RhcmdldC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogUm91dGluZyB0byB0aGUgYWxlcnQgYm94XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIERlYnVnQWxlcnQgZXh0ZW5kcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGVnYXRlczogTWFwRGVidWdGaWx0ZXJUb0RlbGVnYXRlID0ge1xyXG4gICAgICBbREVCVUdfRklMVEVSLklORk9dOiBEZWJ1Z0FsZXJ0LmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuSU5GT10pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkxPR106IERlYnVnQWxlcnQuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5MT0ddKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5XQVJOXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLldBUk5dKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5FUlJPUl06IERlYnVnQWxlcnQuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5FUlJPUl0pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkZVREdFXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLkZVREdFXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuU09VUkNFXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLlNPVVJDRV0pXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBcclxuICAgICAqIFJldHVybnMgYSBkZWxlZ2F0ZS1mdW5jdGlvbiBleHBlY3RpbmcgYSBtZXNzYWdlIHRvIGxvZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVEZWxlZ2F0ZShfaGVhZGxpbmU6IHN0cmluZyk6IEZ1bmN0aW9uIHtcclxuICAgICAgbGV0IGRlbGVnYXRlOiBGdW5jdGlvbiA9IGZ1bmN0aW9uIChfbWVzc2FnZTogT2JqZWN0LCAuLi5fYXJnczogT2JqZWN0W10pOiB2b2lkIHtcclxuICAgICAgICBsZXQgYXJnczogc3RyaW5nW10gPSBfYXJncy5tYXAoX2FyZyA9PiBfYXJnLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGxldCBvdXQ6IHN0cmluZyA9IF9oZWFkbGluZSArIFwiIFwiICsgRGVidWdUYXJnZXQubWVyZ2VBcmd1bWVudHMoX21lc3NhZ2UsIGFyZ3MpO1xyXG4gICAgICAgIGFsZXJ0KG91dCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBkZWxlZ2F0ZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnVGFyZ2V0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSb3V0aW5nIHRvIGEgSFRNTERpYWxvZ0VsZW1lbnRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRGVidWdEaWFsb2cgZXh0ZW5kcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICAvLyBUT0RPOiBjaGVja291dCBIVE1MRGlhbG9nRWxlbWVudDsgISEhXHJcbiAgfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z1RhcmdldC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogUm91dGUgdG8gYW4gSFRNTFRleHRBcmVhLCBtYXkgYmUgb2Jzb2xldGUgd2hlbiB1c2luZyBIVE1MRGlhbG9nRWxlbWVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBEZWJ1Z1RleHRBcmVhIGV4dGVuZHMgRGVidWdUYXJnZXQge1xyXG4gICAgcHVibGljIHN0YXRpYyB0ZXh0QXJlYTogSFRNTFRleHRBcmVhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgYXV0b1Njcm9sbDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWxlZ2F0ZXM6IE1hcERlYnVnRmlsdGVyVG9EZWxlZ2F0ZSA9IHtcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5JTkZPXTogRGVidWdUZXh0QXJlYS5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLklORk9dKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5MT0ddOiBEZWJ1Z1RleHRBcmVhLmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuTE9HXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuV0FSTl06IERlYnVnVGV4dEFyZWEuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5XQVJOXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuRVJST1JdOiBEZWJ1Z1RleHRBcmVhLmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuRVJST1JdKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5GVURHRV06IERlYnVnVGV4dEFyZWEuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5GVURHRV0pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkNMRUFSXTogRGVidWdUZXh0QXJlYS5jbGVhcixcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5HUk9VUF06IERlYnVnVGV4dEFyZWEuZ3JvdXAsXHJcbiAgICAgIFtERUJVR19GSUxURVIuR1JPVVBDT0xMQVBTRURdOiBEZWJ1Z1RleHRBcmVhLmdyb3VwLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkdST1VQRU5EXTogRGVidWdUZXh0QXJlYS5ncm91cEVuZCxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdOiBEZWJ1Z1RleHRBcmVhLmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuU09VUkNFXSlcclxuICAgIH07XHJcbiAgICBwcml2YXRlIHN0YXRpYyBncm91cHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIHRleHQgYXJlYSBhbmQgdGhlIGdyb3Vwc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLnRleHRBcmVhLnRleHRDb250ZW50ID0gXCJcIjtcclxuICAgICAgRGVidWdUZXh0QXJlYS5ncm91cHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJlZ2lucyBhIG5ldyBncm91cCB3aXRoIHRoZSBnaXZlbiBuYW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXAoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLnByaW50KFwi4pa8IFwiICsgX25hbWUpO1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLmdyb3Vwcy5wdXNoKF9uYW1lKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRW5kcyB0aGUgbGFzdCBncm91cFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdyb3VwRW5kKCk6IHZvaWQge1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLmdyb3Vwcy5wb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBkZWxlZ2F0ZS1mdW5jdGlvbiBleHBlY3RpbmcgYSBtZXNzYWdlIHRvIGxvZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVEZWxlZ2F0ZShfaGVhZGxpbmU6IHN0cmluZyk6IEZ1bmN0aW9uIHtcclxuICAgICAgbGV0IGRlbGVnYXRlOiBGdW5jdGlvbiA9IGZ1bmN0aW9uIChfbWVzc2FnZTogT2JqZWN0LCAuLi5fYXJnczogT2JqZWN0W10pOiB2b2lkIHtcclxuICAgICAgICBEZWJ1Z1RleHRBcmVhLnByaW50KF9oZWFkbGluZSArIFwiIFwiICsgRGVidWdUYXJnZXQubWVyZ2VBcmd1bWVudHMoX21lc3NhZ2UsIF9hcmdzKSk7XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBkZWxlZ2F0ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRJbmRlbnRhdGlvbihfbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfbGV2ZWw7IGkrKylcclxuICAgICAgICByZXN1bHQgKz0gXCJ8IFwiO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHByaW50KF90ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgRGVidWdUZXh0QXJlYS50ZXh0QXJlYS50ZXh0Q29udGVudCArPSBEZWJ1Z1RleHRBcmVhLmdldEluZGVudGF0aW9uKERlYnVnVGV4dEFyZWEuZ3JvdXBzLmxlbmd0aCkgKyBfdGV4dCArIFwiXFxuXCI7XHJcbiAgICAgIGlmIChEZWJ1Z1RleHRBcmVhLmF1dG9TY3JvbGwpXHJcbiAgICAgICAgRGVidWdUZXh0QXJlYS50ZXh0QXJlYS5zY3JvbGxUb3AgPSBEZWJ1Z1RleHRBcmVhLnRleHRBcmVhLnNjcm9sbEhlaWdodDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBUaGUgY29kZXMgc2VudCBmcm9tIGEgc3RhbmRhcmQgZW5nbGlzaCBrZXlib2FyZCBsYXlvdXRcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBLRVlCT0FSRF9DT0RFIHtcclxuICAgIEEgPSBcIktleUFcIixcclxuICAgIEIgPSBcIktleUJcIixcclxuICAgIEMgPSBcIktleUNcIixcclxuICAgIEQgPSBcIktleURcIixcclxuICAgIEUgPSBcIktleUVcIixcclxuICAgIEYgPSBcIktleUZcIixcclxuICAgIEcgPSBcIktleUdcIixcclxuICAgIEggPSBcIktleUhcIixcclxuICAgIEkgPSBcIktleUlcIixcclxuICAgIEogPSBcIktleUpcIixcclxuICAgIEsgPSBcIktleUtcIixcclxuICAgIEwgPSBcIktleUxcIixcclxuICAgIE0gPSBcIktleU1cIixcclxuICAgIE4gPSBcIktleU5cIixcclxuICAgIE8gPSBcIktleU9cIixcclxuICAgIFAgPSBcIktleVBcIixcclxuICAgIFEgPSBcIktleVFcIixcclxuICAgIFIgPSBcIktleVJcIixcclxuICAgIFMgPSBcIktleVNcIixcclxuICAgIFQgPSBcIktleVRcIixcclxuICAgIFUgPSBcIktleVVcIixcclxuICAgIFYgPSBcIktleVZcIixcclxuICAgIFcgPSBcIktleVdcIixcclxuICAgIFggPSBcIktleVhcIixcclxuICAgIFkgPSBcIktleVlcIixcclxuICAgIFogPSBcIktleVpcIixcclxuICAgIEVTQyA9IFwiRXNjYXBlXCIsXHJcbiAgICBaRVJPID0gXCJEaWdpdDBcIixcclxuICAgIE9ORSA9IFwiRGlnaXQxXCIsXHJcbiAgICBUV08gPSBcIkRpZ2l0MlwiLFxyXG4gICAgVEhSRUUgPSBcIkRpZ2l0M1wiLFxyXG4gICAgRk9VUiA9IFwiRGlnaXQ0XCIsXHJcbiAgICBGSVZFID0gXCJEaWdpdDVcIixcclxuICAgIFNJWCA9IFwiRGlnaXQ2XCIsXHJcbiAgICBTRVZFTiA9IFwiRGlnaXQ3XCIsXHJcbiAgICBFSUdIVCA9IFwiRGlnaXQ4XCIsXHJcbiAgICBOSU5FID0gXCJEaWdpdDlcIixcclxuICAgIE1JTlVTID0gXCJNaW51c1wiLFxyXG4gICAgRVFVQUwgPSBcIkVxdWFsXCIsXHJcbiAgICBCQUNLU1BBQ0UgPSBcIkJhY2tzcGFjZVwiLFxyXG4gICAgVEFCVUxBVE9SID0gXCJUYWJcIixcclxuICAgIEJSQUNLRVRfTEVGVCA9IFwiQnJhY2tldExlZnRcIixcclxuICAgIEJSQUNLRVRfUklHSFQgPSBcIkJyYWNrZXRSaWdodFwiLFxyXG4gICAgRU5URVIgPSBcIkVudGVyXCIsXHJcbiAgICBDVFJMX0xFRlQgPSBcIkNvbnRyb2xMZWZ0XCIsXHJcbiAgICBTRU1JQ09MT04gPSBcIlNlbWljb2xvblwiLFxyXG4gICAgUVVPVEUgPSBcIlF1b3RlXCIsXHJcbiAgICBCQUNLX1FVT1RFID0gXCJCYWNrcXVvdGVcIixcclxuICAgIFNISUZUX0xFRlQgPSBcIlNoaWZ0TGVmdFwiLFxyXG4gICAgQkFDS1NMQVNIID0gXCJCYWNrc2xhc2hcIixcclxuICAgIENPTU1BID0gXCJDb21tYVwiLFxyXG4gICAgUEVSSU9EID0gXCJQZXJpb2RcIixcclxuICAgIFNMQVNIID0gXCJTbGFzaFwiLFxyXG4gICAgU0hJRlRfUklHSFQgPSBcIlNoaWZ0UmlnaHRcIixcclxuICAgIE5VTVBBRF9NVUxUSVBMWSA9IFwiTnVtcGFkTXVsdGlwbHlcIixcclxuICAgIEFMVF9MRUZUID0gXCJBbHRMZWZ0XCIsXHJcbiAgICBTUEFDRSA9IFwiU3BhY2VcIixcclxuICAgIENBUFNfTE9DSyA9IFwiQ2Fwc0xvY2tcIixcclxuICAgIEYxID0gXCJGMVwiLFxyXG4gICAgRjIgPSBcIkYyXCIsXHJcbiAgICBGMyA9IFwiRjNcIixcclxuICAgIEY0ID0gXCJGNFwiLFxyXG4gICAgRjUgPSBcIkY1XCIsXHJcbiAgICBGNiA9IFwiRjZcIixcclxuICAgIEY3ID0gXCJGN1wiLFxyXG4gICAgRjggPSBcIkY4XCIsXHJcbiAgICBGOSA9IFwiRjlcIixcclxuICAgIEYxMCA9IFwiRjEwXCIsXHJcbiAgICBQQVVTRSA9IFwiUGF1c2VcIixcclxuICAgIFNDUk9MTF9MT0NLID0gXCJTY3JvbGxMb2NrXCIsXHJcbiAgICBOVU1QQUQ3ID0gXCJOdW1wYWQ3XCIsXHJcbiAgICBOVU1QQUQ4ID0gXCJOdW1wYWQ4XCIsXHJcbiAgICBOVU1QQUQ5ID0gXCJOdW1wYWQ5XCIsXHJcbiAgICBOVU1QQURfU1VCVFJBQ1QgPSBcIk51bXBhZFN1YnRyYWN0XCIsXHJcbiAgICBOVU1QQUQ0ID0gXCJOdW1wYWQ0XCIsXHJcbiAgICBOVU1QQUQ1ID0gXCJOdW1wYWQ1XCIsXHJcbiAgICBOVU1QQUQ2ID0gXCJOdW1wYWQ2XCIsXHJcbiAgICBOVU1QQURfQUREID0gXCJOdW1wYWRBZGRcIixcclxuICAgIE5VTVBBRDEgPSBcIk51bXBhZDFcIixcclxuICAgIE5VTVBBRDIgPSBcIk51bXBhZDJcIixcclxuICAgIE5VTVBBRDMgPSBcIk51bXBhZDNcIixcclxuICAgIE5VTVBBRDAgPSBcIk51bXBhZDBcIixcclxuICAgIE5VTVBBRF9ERUNJTUFMID0gXCJOdW1wYWREZWNpbWFsXCIsXHJcbiAgICBQUklOVF9TQ1JFRU4gPSBcIlByaW50U2NyZWVuXCIsXHJcbiAgICBJTlRMX0JBQ0tfU0xBU0ggPSBcIkludGxCYWNrU2xhc2hcIixcclxuICAgIEYxMSA9IFwiRjExXCIsXHJcbiAgICBGMTIgPSBcIkYxMlwiLFxyXG4gICAgTlVNUEFEX0VRVUFMID0gXCJOdW1wYWRFcXVhbFwiLFxyXG4gICAgRjEzID0gXCJGMTNcIixcclxuICAgIEYxNCA9IFwiRjE0XCIsXHJcbiAgICBGMTUgPSBcIkYxNVwiLFxyXG4gICAgRjE2ID0gXCJGMTZcIixcclxuICAgIEYxNyA9IFwiRjE3XCIsXHJcbiAgICBGMTggPSBcIkYxOFwiLFxyXG4gICAgRjE5ID0gXCJGMTlcIixcclxuICAgIEYyMCA9IFwiRjIwXCIsXHJcbiAgICBGMjEgPSBcIkYyMVwiLFxyXG4gICAgRjIyID0gXCJGMjJcIixcclxuICAgIEYyMyA9IFwiRjIzXCIsXHJcbiAgICBGMjQgPSBcIkYyNFwiLFxyXG4gICAgS0FOQV9NT0RFID0gXCJLYW5hTW9kZVwiLFxyXG4gICAgTEFORzIgPSBcIkxhbmcyXCIsXHJcbiAgICBMQU5HMSA9IFwiTGFuZzFcIixcclxuICAgIElOVExfUk8gPSBcIkludGxSb1wiLFxyXG4gICAgQ09OVkVSVCA9IFwiQ29udmVydFwiLFxyXG4gICAgTk9OX0NPTlZFUlQgPSBcIk5vbkNvbnZlcnRcIixcclxuICAgIElOVExfWUVOID0gXCJJbnRsWWVuXCIsXHJcbiAgICBOVU1QQURfQ09NTUEgPSBcIk51bXBhZENvbW1hXCIsXHJcbiAgICBVTkRPID0gXCJVbmRvXCIsXHJcbiAgICBQQVNURSA9IFwiUGFzdGVcIixcclxuICAgIE1FRElBX1RSQUNLX1BSRVZJT1VTID0gXCJNZWRpYVRyYWNrUHJldmlvdXNcIixcclxuICAgIENVVCA9IFwiQ3V0XCIsXHJcbiAgICBDT1BZID0gXCJDb3B5XCIsXHJcbiAgICBNRURJQV9UUkFDS19ORVhUID0gXCJNZWRpYVRyYWNrTmV4dFwiLFxyXG4gICAgTlVNUEFEX0VOVEVSID0gXCJOdW1wYWRFbnRlclwiLFxyXG4gICAgQ1RSTF9SSUdIVCA9IFwiQ29udHJvbFJpZ2h0XCIsXHJcbiAgICBBVURJT19WT0xVTUVfTVVURSA9IFwiQXVkaW9Wb2x1bWVNdXRlXCIsXHJcbiAgICBMQVVOQ0hfQVBQMiA9IFwiTGF1bmNoQXBwMlwiLFxyXG4gICAgTUVESUFfUExBWV9QQVVTRSA9IFwiTWVkaWFQbGF5UGF1c2VcIixcclxuICAgIE1FRElBX1NUT1AgPSBcIk1lZGlhU3RvcFwiLFxyXG4gICAgRUpFQ1QgPSBcIkVqZWN0XCIsXHJcbiAgICBBVURJT19WT0xVTUVfRE9XTiA9IFwiQXVkaW9Wb2x1bWVEb3duXCIsXHJcbiAgICBWT0xVTUVfRE9XTiA9IFwiVm9sdW1lRG93blwiLFxyXG4gICAgQVVESU9fVk9MVU1FX1VQID0gXCJBdWRpb1ZvbHVtZVVwXCIsXHJcbiAgICBWT0xVTUVfVVAgPSBcIlZvbHVtZVVwXCIsXHJcbiAgICBCUk9XU0VSX0hPTUUgPSBcIkJyb3dzZXJIb21lXCIsXHJcbiAgICBOVU1QQURfRElWSURFID0gXCJOdW1wYWREaXZpZGVcIixcclxuICAgIEFMVF9SSUdIVCA9IFwiQWx0UmlnaHRcIixcclxuICAgIEhFTFAgPSBcIkhlbHBcIixcclxuICAgIE5VTV9MT0NLID0gXCJOdW1Mb2NrXCIsXHJcbiAgICBIT01FID0gXCJIb21lXCIsXHJcbiAgICBBUlJPV19VUCA9IFwiQXJyb3dVcFwiLFxyXG4gICAgQVJST1dfUklHSFQgPSBcIkFycm93UmlnaHRcIixcclxuICAgIEFSUk9XX0RPV04gPSBcIkFycm93RG93blwiLFxyXG4gICAgQVJST1dfTEVGVCA9IFwiQXJyb3dMZWZ0XCIsXHJcbiAgICBFTkQgPSBcIkVuZFwiLFxyXG4gICAgUEFHRV9VUCA9IFwiUGFnZVVwXCIsXHJcbiAgICBQQUdFX0RPV04gPSBcIlBhZ2VEb3duXCIsXHJcbiAgICBJTlNFUlQgPSBcIkluc2VydFwiLFxyXG4gICAgREVMRVRFID0gXCJEZWxldGVcIixcclxuICAgIE1FVEFfTEVGVCA9IFwiTWV0YV9MZWZ0XCIsXHJcbiAgICBPU19MRUZUID0gXCJPU0xlZnRcIixcclxuICAgIE1FVEFfUklHSFQgPSBcIk1ldGFSaWdodFwiLFxyXG4gICAgT1NfUklHSFQgPSBcIk9TUmlnaHRcIixcclxuICAgIENPTlRFWFRfTUVOVSA9IFwiQ29udGV4dE1lbnVcIixcclxuICAgIFBPV0VSID0gXCJQb3dlclwiLFxyXG4gICAgQlJPV1NFUl9TRUFSQ0ggPSBcIkJyb3dzZXJTZWFyY2hcIixcclxuICAgIEJST1dTRVJfRkFWT1JJVEVTID0gXCJCcm93c2VyRmF2b3JpdGVzXCIsXHJcbiAgICBCUk9XU0VSX1JFRlJFU0ggPSBcIkJyb3dzZXJSZWZyZXNoXCIsXHJcbiAgICBCUk9XU0VSX1NUT1AgPSBcIkJyb3dzZXJTdG9wXCIsXHJcbiAgICBCUk9XU0VSX0ZPUldBUkQgPSBcIkJyb3dzZXJGb3J3YXJkXCIsXHJcbiAgICBCUk9XU0VSX0JBQ0sgPSBcIkJyb3dzZXJCYWNrXCIsXHJcbiAgICBMQVVOQ0hfQVBQMSA9IFwiTGF1bmNoQXBwMVwiLFxyXG4gICAgTEFVTkNIX01BSUwgPSBcIkxhdW5jaE1haWxcIixcclxuICAgIExBVU5DSF9NRURJQV9QTEFZRVIgPSBcIkxhdW5jaE1lZGlhUGxheWVyXCIsXHJcblxyXG4gICAgLy9tYWMgYnJpbmdzIHRoaXMgYnV0dHRvblxyXG4gICAgRk4gPSBcIkZuXCIsIC8vbm8gZXZlbnQgZmlyZWQgYWN0dWFsbHlcclxuXHJcbiAgICAvL0xpbnV4IGJyaW5ncyB0aGVzZVxyXG4gICAgQUdBSU4gPSBcIkFnYWluXCIsXHJcbiAgICBQUk9QUyA9IFwiUHJvcHNcIixcclxuICAgIFNFTEVDVCA9IFwiU2VsZWN0XCIsXHJcbiAgICBPUEVOID0gXCJPcGVuXCIsXHJcbiAgICBGSU5EID0gXCJGaW5kXCIsXHJcbiAgICBXQUtFX1VQID0gXCJXYWtlVXBcIixcclxuICAgIE5VTVBBRF9QQVJFTlRfTEVGVCA9IFwiTnVtcGFkUGFyZW50TGVmdFwiLFxyXG4gICAgTlVNUEFEX1BBUkVOVF9SSUdIVCA9IFwiTnVtcGFkUGFyZW50UmlnaHRcIixcclxuXHJcbiAgICAvL2FuZHJvaWRcclxuICAgIFNMRUVQID0gXCJTbGVlcFwiXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBLRVlCT0FSRF9DT0RFX0RFIHtcclxuICAgIFogPSBLRVlCT0FSRF9DT0RFLlksXHJcbiAgICBZID0gS0VZQk9BUkRfQ09ERS5aLFxyXG4gICAgw5YgPSBLRVlCT0FSRF9DT0RFLlNFTUlDT0xPTixcclxuICAgIMOEID0gS0VZQk9BUkRfQ09ERS5RVU9URSxcclxuICAgIMOcID0gS0VZQk9BUkRfQ09ERS5CUkFDS0VUX0xFRlQsXHJcbiAgICBIQVNIID0gS0VZQk9BUkRfQ09ERS5CQUNLU0xBU0gsXHJcbiAgICBQTFVTID0gS0VZQk9BUkRfQ09ERS5CUkFDS0VUX1JJR0hULFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIFxyXG4gICAgw58gPSBLRVlCT0FSRF9DT0RFLk1JTlVTLFxyXG4gICAgQUNVVEUgPSBLRVlCT0FSRF9DT0RFLkVRVUFMLFxyXG4gICAgTEVTU19USEFOID0gS0VZQk9BUkRfQ09ERS5JTlRMX0JBQ0tfU0xBU0gsXHJcbiAgICBNSU5VUyA9IEtFWUJPQVJEX0NPREUuU0xBU0hcclxuICB9XHJcblxyXG4gIC8qIFxyXG4gIEZpcmVmb3ggY2FuJ3QgbWFrZSB1c2Ugb2YgdGhvc2UgYnV0dG9ucyBhbmQgQ29tYmluYXRpb25zOlxyXG4gIFNJTkdFTEVfQlVUVE9OUzpcclxuICAgRHJ1Y2ssXHJcbiAgQ09NQklOQVRJT05TOlxyXG4gICBTaGlmdCArIEYxMCwgU2hpZnQgKyBOdW1wYWQ1LFxyXG4gICBDVFJMICsgcSwgQ1RSTCArIEY0LFxyXG4gICBBTFQgKyBGMSwgQUxUICsgRjIsIEFMVCArIEYzLCBBTFQgKyBGNywgQUxUICsgRjgsIEFMVCArIEYxMFxyXG4gIE9wZXJhIHdvbid0IGRvIGdvb2Qgd2l0aCB0aGVzZSBCdXR0b25zIGFuZCBjb21iaW5hdGlvbnM6XHJcbiAgU0lOR0xFX0JVVFRPTlM6XHJcbiAgIEZsb2F0MzJBcnJheSwgRjExLCBBTFQsXHJcbiAgQ09NQklOQVRJT05TOlxyXG4gICBDVFJMICsgcSwgQ1RSTCArIHQsIENUUkwgKyBoLCBDVFJMICsgZywgQ1RSTCArIG4sIENUUkwgKyBmIFxyXG4gICBBTFQgKyBGMSwgQUxUICsgRjIsIEFMVCArIEY0LCBBTFQgKyBGNSwgQUxUICsgRjYsIEFMVCArIEY3LCBBTFQgKyBGOCwgQUxUICsgRjEwXHJcbiAgICovXHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgY29uc3QgZW51bSBFVkVOVF9USU1FUiB7XHJcbiAgICBDQUxMID0gXCLGkmxhcHNlXCJcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gZXZlbnQgdGhhdCByZXByZXNlbnRzIGEgY2FsbCBmcm9tIGEge0BsaW5rIFRpbWVyfVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBFdmVudFRpbWVyIHtcclxuICAgIHB1YmxpYyB0eXBlOiBFVkVOVF9USU1FUiA9IEVWRU5UX1RJTUVSLkNBTEw7XHJcbiAgICBwdWJsaWMgdGFyZ2V0OiBUaW1lcjtcclxuICAgIHB1YmxpYyBhcmd1bWVudHM6IE9iamVjdFtdO1xyXG4gICAgcHVibGljIGZpcnN0Q2FsbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgbGFzdENhbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBjb3VudDogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGltZXI6IFRpbWVyLCAuLi5fYXJndW1lbnRzOiBPYmplY3RbXSkge1xyXG4gICAgICB0aGlzLnRhcmdldCA9IF90aW1lcjtcclxuICAgICAgdGhpcy5hcmd1bWVudHMgPSBfYXJndW1lbnRzO1xyXG4gICAgICB0aGlzLmZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQ3VzdG9tIHRvdWNoIGV2ZW50c1xyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIEVWRU5UX1RPVUNIIHtcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgZmlyZWQgaW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHRvdWNobW92ZSwgZGV0YWlscyBvZmZzZXQgdG8gc3RhcnRpbmcgdG91Y2ggKi9cclxuICAgIE1PVkUgPSBcInRvdWNoTW92ZVwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHRoZSB0b3VjaGVzIGhhdmVuJ3QgbW92ZWQgb3V0c2lkZSBvZiB0aGUgdGFwIHJhZGl1cyAqL1xyXG4gICAgVEFQID0gXCJ0b3VjaFRhcFwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHRoZSB0b3VjaGVzIGhhdmUgbW92ZWQgb3V0c2lkZSBvZiB0aGUgbm90Y2ggcmFkaXVzLCBkZXRhaWxzIG9mZnNldCBhbmQgY2FyZGluYWwgZGlyZWN0aW9uICovXHJcbiAgICBOT1RDSCA9IFwidG91Y2hOb3RjaFwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHRoZSB0b3VjaGVzIGhhdmVuJ3QgbW92ZWQgb3V0c2lkZSBvZiB0aGUgdGFwIHJhZGl1cyBmb3Igc29tZSB0aW1lICovXHJcbiAgICBMT05HID0gXCJ0b3VjaExvbmdcIixcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgZmlyZWQgd2hlbiB0d28gdGFwcyB3ZXJlIGRldGVjdGVkIGluIHNob3J0IHN1Y2Nlc3Npb24gKi9cclxuICAgIERPVUJMRSA9IFwidG91Y2hEb3VibGVcIixcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgZmlyZWQgd2hlbiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgb25seSB0d28gdG91Y2hlcyBjaGFuZ2VzIGJleW9uZCBhIHRvbGVyYW5jZSAqL1xyXG4gICAgUElOQ0ggPSBcInRvdWNoUGluY2hcIixcclxuICAgIC8qKiBjdXN0b20gZXZlbnQgbm90IGltcGxlbWVudGVkIHlldCAqL1xyXG4gICAgUk9UQVRFID0gXCJ0b3VjaFJvdGF0ZVwiXHJcbiAgfVxyXG5cclxuICAvKiogRGV0YWlscyBmb3IgQ3VzdG9tVG91Y2hFdmVudHMsIHVzZSBhcyBnZW5lcmljIEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+ICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBFdmVudFRvdWNoRGV0YWlsIHtcclxuICAgIHBvc2l0aW9uOiBWZWN0b3IyO1xyXG4gICAgdG91Y2hlczogVG91Y2hMaXN0O1xyXG4gICAgb2Zmc2V0PzogVmVjdG9yMjtcclxuICAgIG1vdmVtZW50PzogVmVjdG9yMjtcclxuICAgIGNhcmRpbmFsPzogVmVjdG9yMjtcclxuICAgIHBpbmNoPzogVmVjdG9yMjtcclxuICAgIHBpbmNoRGVsdGE/OiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXRjaGVzIEN1c3RvbVRvdWNoRXZlbnRzIHRvIHRoZSBFdmVudFRhcmdldCBnaXZlbiB3aXRoIHRoZSBjb25zdHJ1Y3Rvci5cclxuICAgKiBXaGVuIHVzaW5nIHRvdWNoIGV2ZW50cywgbWFrZSBzdXJlIHRvIHNldCBgdG91Y2gtYWN0aW9uOiBub25lYCBpbiBDU1MgXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUb3VjaEV2ZW50RGlzcGF0Y2hlciB7XHJcbiAgICBwdWJsaWMgcG9zU3RhcnQ6IFZlY3RvcjIgPSBWZWN0b3IyLlpFUk8oKTtcclxuICAgIHB1YmxpYyBwb3NOb3RjaDogVmVjdG9yMiA9IFZlY3RvcjIuWkVSTygpO1xyXG4gICAgcHVibGljIHJhZGl1c1RhcDogbnVtYmVyO1xyXG4gICAgcHVibGljIHJhZGl1c05vdGNoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRhcmdldDogRXZlbnRUYXJnZXQ7XHJcbiAgICBwcml2YXRlIHBvc1ByZXY6IFZlY3RvcjIgPSBWZWN0b3IyLlpFUk8oKTtcclxuICAgIHByaXZhdGUgbW92ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgdGltZXJEb3VibGU6IFRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lckxvbmc6IFRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lRG91YmxlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRpbWVMb25nOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRpbWU6IFRpbWUgPSBuZXcgVGltZSgpO1xyXG4gICAgcHJpdmF0ZSBwaW5jaERpc3RhbmNlOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBwaW5jaFRvbGVyYW5jZTogbnVtYmVyID0gMTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3RhcmdldDogRXZlbnRUYXJnZXQsIF9yYWRpdXNUYXA6IG51bWJlciA9IDUsIF9yYWRpdXNOb3RjaDogbnVtYmVyID0gNTAsIF90aW1lRG91YmxlOiBudW1iZXIgPSAyMDAsIF90aW1lckxvbmc6IG51bWJlciA9IDEwMDApIHtcclxuICAgICAgdGhpcy50YXJnZXQgPSBfdGFyZ2V0O1xyXG4gICAgICB0aGlzLnJhZGl1c1RhcCA9IF9yYWRpdXNUYXA7XHJcbiAgICAgIHRoaXMucmFkaXVzTm90Y2ggPSBfcmFkaXVzTm90Y2g7XHJcbiAgICAgIHRoaXMudGltZURvdWJsZSA9IF90aW1lRG91YmxlO1xyXG4gICAgICB0aGlzLnRpbWVMb25nID0gX3RpbWVyTG9uZztcclxuICAgICAgdGhpcy5hY3RpdmF0ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlLS9BY3RpdmF0ZXMgdGhlIGRpc3BhdGNoIG9mIEN1c3RvbVRvdWNoRXZlbnRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3RpdmF0ZShfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgaWYgKF9vbikge1xyXG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIDxFdmVudExpc3RlbmVyPnRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCA8RXZlbnRMaXN0ZW5lcj50aGlzLmhuZEV2ZW50KTtcclxuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIDxFdmVudExpc3RlbmVyPnRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgPEV2ZW50TGlzdGVuZXI+dGhpcy5obmRFdmVudCk7XHJcbiAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCA8RXZlbnRMaXN0ZW5lcj50aGlzLmhuZEV2ZW50KTtcclxuICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCA8RXZlbnRMaXN0ZW5lcj50aGlzLmhuZEV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhuZEV2ZW50ID0gKF9ldmVudDogVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgICBfZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgbGV0IHRvdWNoRmlyc3Q6IFRvdWNoID0gX2V2ZW50LnRvdWNoZXNbMF07XHJcbiAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMiA9IHRoaXMuY2FsY0F2ZXJhZ2VQb3NpdGlvbihfZXZlbnQudG91Y2hlcyk7IC8vbmV3IFZlY3RvcjIodG91Y2hGaXJzdD8uY2xpZW50WCwgdG91Y2hGaXJzdD8uY2xpZW50WSk7XHJcbiAgICAgIGxldCBvZmZzZXQ6IFZlY3RvcjI7XHJcblxyXG4gICAgICBzd2l0Y2ggKF9ldmVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInRvdWNoc3RhcnRcIjpcclxuICAgICAgICAgIHRoaXMubW92ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc3RhcnRHZXN0dXJlKHBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgICBpZiAoX2V2ZW50LnRvdWNoZXMubGVuZ3RoID09IDIpIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgcGluY2hcclxuICAgICAgICAgICAgbGV0IHBpbmNoOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoX2V2ZW50LnRvdWNoZXNbMV0uY2xpZW50WCAtIHRvdWNoRmlyc3QuY2xpZW50WCwgX2V2ZW50LnRvdWNoZXNbMV0uY2xpZW50WSAtIHRvdWNoRmlyc3QuY2xpZW50WSk7XHJcbiAgICAgICAgICAgIHRoaXMucGluY2hEaXN0YW5jZSA9IHBpbmNoLm1hZ25pdHVkZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgZGlzcGF0Y2hMb25nOiBUaW1lckhhbmRsZXIgPSAoX2V2ZW50VGltZXI6IEV2ZW50VGltZXIpOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+KEVWRU5UX1RPVUNILkxPTkcsIHtcclxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBwb3NpdGlvbjogcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLnRpbWVyTG9uZz8uY2xlYXIoKTtcclxuICAgICAgICAgIHRoaXMudGltZXJMb25nID0gbmV3IFRpbWVyKHRoaXMudGltZSwgdGhpcy50aW1lTG9uZywgMSwgZGlzcGF0Y2hMb25nKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJ0b3VjaGVuZFwiOlxyXG4gICAgICAgICAgdGhpcy50aW1lckxvbmc/LmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgaWYgKF9ldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gc3RpbGwgdG91Y2hlcyBhY3RpdmVcclxuICAgICAgICAgICAgdGhpcy5zdGFydEdlc3R1cmUocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgZGlzcGF0Y2hUYXA6IFRpbWVySGFuZGxlciA9IChfZXZlbnRUaW1lcjogRXZlbnRUaW1lcik6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudDxFdmVudFRvdWNoRGV0YWlsPihFVkVOVF9UT1VDSC5UQVAsIHtcclxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBwb3NpdGlvbjogcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSB3YXMgYSB0YXAgYmVmb3JlIGFuZCB0aW1lciBpcyBzdGlsbCBydW5uaW5nIC0+IGRvdWJsZSB0YXBcclxuICAgICAgICAgIGlmICh0aGlzLnRpbWVyRG91YmxlPy5hY3RpdmUpIHtcclxuICAgICAgICAgICAgdGhpcy50aW1lckRvdWJsZS5jbGVhcigpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnRpbWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudDxFdmVudFRvdWNoRGV0YWlsPihFVkVOVF9UT1VDSC5ET1VCTEUsIHtcclxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBwb3NpdGlvbjogcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzIH1cclxuICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm1vdmVkKVxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSB3YXMgbW92ZW1lbnQsIG90aGVyd2lzZSBzZXQgdGltZXIgdG8gZmlyZSB0YXBcclxuICAgICAgICAgICAgdGhpcy50aW1lckRvdWJsZSA9IG5ldyBUaW1lcih0aGlzLnRpbWUsIHRoaXMudGltZURvdWJsZSwgMSwgZGlzcGF0Y2hUYXApO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJ0b3VjaG1vdmVcIjpcclxuICAgICAgICAgIHRoaXMuZGV0ZWN0UGluY2goX2V2ZW50LCBwb3NpdGlvbik7XHJcbiAgICAgICAgICBvZmZzZXQgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodGhpcy5wb3NQcmV2LCB0aGlzLnBvc1N0YXJ0KTtcclxuICAgICAgICAgIHRoaXMubW92ZWQgfHw9IChvZmZzZXQubWFnbml0dWRlIDwgdGhpcy5yYWRpdXNUYXApOyAvLyByZW1lbWJlciB0aGF0IHRvdWNoIG1vdmVkIG92ZXIgdGFwIHJhZGl1c1xyXG4gICAgICAgICAgbGV0IG1vdmVtZW50OiBWZWN0b3IyID0gVmVjdG9yMi5ESUZGRVJFTkNFKHBvc2l0aW9uLCB0aGlzLnBvc1ByZXYpO1xyXG4gICAgICAgICAgdGhpcy50YXJnZXQuZGlzcGF0Y2hFdmVudChcclxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+KEVWRU5UX1RPVUNILk1PVkUsIHtcclxuICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLCBkZXRhaWw6IHsgcG9zaXRpb246IHBvc2l0aW9uLCB0b3VjaGVzOiBfZXZlbnQudG91Y2hlcywgb2Zmc2V0OiBvZmZzZXQsIG1vdmVtZW50OiBtb3ZlbWVudCB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIC8vIGZpcmUgbm90Y2ggd2hlbiB0b3VjaGVzIG1vdmVkIG91dCBvZiBub3RjaCByYWRpdXMgYW5kIHJlc2V0IG5vdGNoXHJcbiAgICAgICAgICBvZmZzZXQgPSBWZWN0b3IyLkRJRkZFUkVOQ0UocG9zaXRpb24sIHRoaXMucG9zTm90Y2gpO1xyXG4gICAgICAgICAgaWYgKG9mZnNldC5tYWduaXR1ZGUgPiB0aGlzLnJhZGl1c05vdGNoKSB7XHJcbiAgICAgICAgICAgIGxldCBjYXJkaW5hbDogVmVjdG9yMiA9IE1hdGguYWJzKG9mZnNldC54KSA+IE1hdGguYWJzKG9mZnNldC55KSA/XHJcbiAgICAgICAgICAgICAgVmVjdG9yMi5YKG9mZnNldC54IDwgMCA/IC0xIDogMSkgOlxyXG4gICAgICAgICAgICAgIFZlY3RvcjIuWShvZmZzZXQueSA8IDAgPyAtMSA6IDEpO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudDxFdmVudFRvdWNoRGV0YWlsPihFVkVOVF9UT1VDSC5OT1RDSCwge1xyXG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiB7IHBvc2l0aW9uOiBwb3NpdGlvbiwgdG91Y2hlczogX2V2ZW50LnRvdWNoZXMsIG9mZnNldDogb2Zmc2V0LCBjYXJkaW5hbDogY2FyZGluYWwsIG1vdmVtZW50OiBtb3ZlbWVudCB9XHJcbiAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLnBvc05vdGNoID0gcG9zaXRpb247XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL1RPRE86IHBpbmNoLCByb3RhdGUuLi5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5wb3NQcmV2LnNldChwb3NpdGlvbi54LCBwb3NpdGlvbi55KTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBkZXRlY3RQaW5jaCA9IChfZXZlbnQ6IFRvdWNoRXZlbnQsIF9wb3NpdGlvbjogVmVjdG9yMik6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoX2V2ZW50LnRvdWNoZXMubGVuZ3RoICE9IDIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IHQ6IFRvdWNoTGlzdCA9IF9ldmVudC50b3VjaGVzO1xyXG4gICAgICBsZXQgcGluY2g6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMih0WzFdLmNsaWVudFggLSB0WzBdLmNsaWVudFgsIHRbMV0uY2xpZW50WSAtIHRbMF0uY2xpZW50WSk7XHJcbiAgICAgIGxldCBwaW5jaERpc3RhbmNlOiBudW1iZXIgPSBwaW5jaC5tYWduaXR1ZGU7XHJcbiAgICAgIGxldCBwaW5jaERlbHRhOiBudW1iZXIgPSBwaW5jaERpc3RhbmNlIC0gdGhpcy5waW5jaERpc3RhbmNlO1xyXG4gICAgICBpZiAoTWF0aC5hYnMocGluY2hEZWx0YSkgPiB0aGlzLnBpbmNoVG9sZXJhbmNlKVxyXG4gICAgICAgIHRoaXMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8RXZlbnRUb3VjaERldGFpbD4oRVZFTlRfVE9VQ0guUElOQ0gsIHtcclxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiB7IHBvc2l0aW9uOiBfcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzLCBwaW5jaDogcGluY2gsIHBpbmNoRGVsdGE6IHBpbmNoRGVsdGEgfVxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICB0aGlzLnBpbmNoRGlzdGFuY2UgPSBwaW5jaERpc3RhbmNlO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0R2VzdHVyZShfcG9zaXRpb246IFZlY3RvcjIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5wb3NOb3RjaC5zZXQoX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55KTtcclxuICAgICAgdGhpcy5wb3NTdGFydC5zZXQoX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGNBdmVyYWdlUG9zaXRpb24oX3RvdWNoZXM6IFRvdWNoTGlzdCk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgYXZlcmFnZTogVmVjdG9yMiA9IFZlY3RvcjIuWkVSTygpO1xyXG4gICAgICBmb3IgKGxldCB0b3VjaCBvZiBfdG91Y2hlcykge1xyXG4gICAgICAgIGF2ZXJhZ2UueCArPSB0b3VjaC5jbGllbnRYO1xyXG4gICAgICAgIGF2ZXJhZ2UueSArPSB0b3VjaC5jbGllbnRZO1xyXG4gICAgICB9XHJcbiAgICAgIGF2ZXJhZ2Uuc2NhbGUoMSAvIF90b3VjaGVzLmxlbmd0aCk7XHJcbiAgICAgIHJldHVybiBhdmVyYWdlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBub2RlIG1hbmFnZWQgYnkge0BsaW5rIFByb2plY3R9IHRoYXQgZnVuY3Rpb25zIGFzIGEgdGVtcGxhdGUgZm9yIHtAbGluayBHcmFwaEluc3RhbmNlfXMgXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvUmVzb3VyY2VcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgR3JhcGggZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlUmVzb3VyY2Uge1xyXG4gICAgcHVibGljIGlkUmVzb3VyY2U6IHN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgIC8vICNzeW5jaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIkdyYXBoXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTVVUQVRFLCB0aGlzLmhuZE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pZFJlc291cmNlID0gdGhpcy5pZFJlc291cmNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnR5cGUgPSB0aGlzLnR5cGU7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgYXdhaXQgUHJvamVjdC5yZXN5bmNHcmFwaEluc3RhbmNlcyh0aGlzKTtcclxuICAgICAgdGhpcy5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlQuR1JBUEhfREVTRVJJQUxJWkVEKSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRGVzZXJpYWxpemVkXCIsIHRoaXMubmFtZSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaG5kTXV0YXRlID0gYXN5bmMgKF9ldmVudDogQ3VzdG9tRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuXHJcbiAgICAgIC8vIFRPRE86IGlmIHBhdGggY29udGFpbnMgYSBncmFwaCBpbnN0YW5jZSBiZWxvdyB0aGlzLCBkb24ndCBkaXNwYXRjaCFcclxuICAgICAgLy8gbGV0IHBhdGg6IE5vZGVbXSA9IFJlZmxlY3QuZ2V0KF9ldmVudCwgXCJwYXRoXCIpO1xyXG4gICAgICAvLyBmb3IgKGxldCBub2RlIG9mIHBhdGgpXHJcbiAgICAgIC8vICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlICYmIG5vZGUuaWRTb3VyY2UgIT0gdGhpcy5pZFJlc291cmNlKVxyXG4gICAgICAvLyAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gY29uc29sZS5sb2coXCJHcmFwaCBtdXRhdGVzXCIsIHRoaXMubmFtZSk7XHJcbiAgICAgIC8vIHRoaXMuI3N5bmNpbmcgPSB0cnVlO1xyXG4gICAgICBfZXZlbnQuZGV0YWlsLnBhdGggPSBSZWZsZWN0LmdldChfZXZlbnQsIFwicGF0aFwiKTsgLy8gc2F2ZSBwYXRoIHRvIHRhcmdldCBpbiBkZXRhaWxcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5NVVRBVEVfR1JBUEgsIHsgZGV0YWlsOiBfZXZlbnQuZGV0YWlsIH0pKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5HUkFQSF9NVVRBVEVELCB7IGRldGFpbDogX2V2ZW50LmRldGFpbCB9KSk7XHJcbiAgICAgIC8vIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTVVUQVRFX0lOU1RBTkNFKSk7XHJcbiAgICAgIC8vIHRoaXMuI3N5bmNpbmcgPSBmYWxzZTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIEdyYXBofSBsb2FkZWQgZnJvbSBhIGdsVEYtRmlsZS5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgR3JhcGhHTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKEdyYXBoKSB7XHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsLCBfbmFtZTogc3RyaW5nID0gdGhpcy5uYW1lKTogUHJvbWlzZTxHcmFwaEdMVEY+IHtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgcmV0dXJuIEdMVEZMb2FkZXIubG9hZFJlc291cmNlKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUodHJ1ZSk7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLmNvbXBvbmVudHNbQ29tcG9uZW50U2tlbGV0b24ubmFtZV07XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLmNoaWxkcmVuO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLy8gZW51bSBTWU5DIHtcclxuICAvLyAgIFJFQURZLCBHUkFQSF9TWU5DRUQsIEdSQVBIX0RPTkUsIElOU1RBTkNFXHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiBBbiBpbnN0YW5jZSBvZiBhIHtAbGluayBHcmFwaH0uICBcclxuICAgKiBUaGlzIG5vZGUga2VlcHMgYSByZWZlcmVuY2UgdG8gaXRzIHJlc291cmNlIGFuIGNhbiB0aHVzIG9wdGltaXplIHNlcmlhbGl6YXRpb25cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9SZXNvdXJjZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBHcmFwaEluc3RhbmNlIGV4dGVuZHMgTm9kZSB7XHJcbiAgICAvKiogaWQgb2YgdGhlIHJlc291cmNlIHRoYXQgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQgZnJvbSAqL1xyXG4gICAgLy8gVE9ETzogZXhhbWluZSwgaWYgdGhpcyBzaG91bGQgYmUgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBHcmFwaCwgaW5zdGVhZCBvZiB0aGUgaWRcclxuICAgIHB1YmxpYyBzdGF0aWMgY291bnQ6IG51bWJlciA9IDA7XHJcbiAgICAjaWRTb3VyY2U6IHN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgIC8vICNzeW5jOiBTWU5DID0gU1lOQy5SRUFEWTtcclxuICAgICNkZXNlcmlhbGl6ZUZyb21Tb3VyY2U6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBjb25zdHJ1Y3RvciBhbG9uZSB3aWxsIG5vdCBjcmVhdGUgYSByZWNvbnN0cnVjdGlvbiwgYnV0IG9ubHkgc2F2ZSB0aGUgaWQuXHJcbiAgICAgKiBUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGdyYXBoLCBjYWxsIHJlc2V0IG9uIHRoaXMgb3Igc2V0IHdpdGggYSBncmFwaCBhcyBwYXJhbWV0ZXIuXHJcbiAgICAgKiBQcmVmZXIgUHJvamVjdC5jcmVhdGVHcmFwaEluc3RhbmNlKF9ncmFwaCkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfZ3JhcGg/OiBHcmFwaCkge1xyXG4gICAgICBzdXBlcihcIkdyYXBoSW5zdGFuY2VcIik7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5NVVRBVEUsIHRoaXMuaG5kTXV0YXRpb25JbnN0YW5jZSk7XHJcblxyXG4gICAgICBpZiAoIV9ncmFwaClcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRoaXMuI2lkU291cmNlID0gX2dyYXBoLmlkUmVzb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpZFNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaWRTb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNyZWF0ZSB0aGlzIG5vZGUgZnJvbSB0aGUge0BsaW5rIEdyYXBofSByZWZlcmVuY2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyByZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgbGV0IHJlc291cmNlOiBHcmFwaCA9IDxHcmFwaD5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKHRoaXMuI2lkU291cmNlKTtcclxuICAgICAgYXdhaXQgdGhpcy5zZXQocmVzb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVE9ETzogb3B0aW1pemUgdXNpbmcgdGhlIHJlZmVyZW5jZWQgR3JhcGgsIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBvbmx5IHRoZSBkaWZmZXJlbmNlc1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IGZpbHRlcjogQ29tcG9uZW50R3JhcGhGaWx0ZXIgPSB0aGlzLmdldENvbXBvbmVudChDb21wb25lbnRHcmFwaEZpbHRlcik7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge307XHJcblxyXG4gICAgICBpZiAoZmlsdGVyICYmIGZpbHRlci5pc0FjdGl2ZSkgeyAvLyBpZiBncmFwaCBzeW5jaHJvbmlzYXRpb24gaXMgdW5maWx0ZXJlZCwga25vd2luZyB0aGUgc291cmNlIGlzIHN1ZmZpY2llbnQgZm9yIHNlcmlhbGl6YXRpb25cclxuICAgICAgICBzZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgICAgbGV0IGdyYXBoOiBHcmFwaCA9IHRoaXMuZ2V0KCk7XHJcbiAgICAgICAgaWYgKGdyYXBoIGluc3RhbmNlb2YgR3JhcGhHTFRGKSB7IC8vIGxpa2UgZm9yIHRoZSBHcmFwaEdMVEY6IGNoaWxkcmVuIGFuZCBjb21wb25lbnRzIGxvYWRlZCBmcm9tIGdsdGYgbXVzdCBuZXZlciBiZSBzZXJpYWxpemVkXHJcbiAgICAgICAgICBkZWxldGUgc2VyaWFsaXphdGlvbi5jb21wb25lbnRzW0NvbXBvbmVudFNrZWxldG9uLm5hbWVdO1xyXG4gICAgICAgICAgZGVsZXRlIHNlcmlhbGl6YXRpb24uY2hpbGRyZW47XHJcbiAgICAgICAgICBzZXJpYWxpemF0aW9uLnVybCA9IGdyYXBoLnVybDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZUZyb21Tb3VyY2UgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWRTb3VyY2UgPSB0aGlzLiNpZFNvdXJjZTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy4jaWRTb3VyY2UgPSBfc2VyaWFsaXphdGlvbi5pZFNvdXJjZSA/PyBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlO1xyXG4gICAgICBpZiAoIV9zZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplRnJvbVNvdXJjZSkge1xyXG4gICAgICAgIGxldCBncmFwaDogR3JhcGggPSA8R3JhcGg+PHVua25vd24+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZSh0aGlzLiNpZFNvdXJjZSk7XHJcbiAgICAgICAgaWYgKGdyYXBoIGluc3RhbmNlb2YgR3JhcGhHTFRGKVxyXG4gICAgICAgICAgYXdhaXQgR0xURkxvYWRlci5sb2FkUmVzb3VyY2UodGhpcywgX3NlcmlhbGl6YXRpb24udXJsKTtcclxuXHJcbiAgICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pOyAvLyBpbnN0YW5jZSBpcyBkZXNlcmlhbGl6ZWQgZnJvbSBpbmRpdmlkdWFsIGRhdGFcclxuXHJcbiAgICAgICAgdGhpcy4jZGVzZXJpYWxpemVGcm9tU291cmNlID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBncmFwaDogR3JhcGggPSB0aGlzLmdldCgpO1xyXG4gICAgICBpZiAoZ3JhcGgpXHJcbiAgICAgICAgLy8gaWYgKF9zZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplRnJvbVNvdXJjZSkgLy8gbm8gY29tcG9uZW50cy0+IGFzc3VtZSBzeW5jaHJvbml6ZWQgR3JhcGhJbnN0YW5jZVxyXG4gICAgICAgIC8vICAgYXdhaXQgdGhpcy5zZXQoZ3JhcGgpOyAvLyByZWNyZWF0ZSBjb21wbGV0ZSBpbnN0YW5jZSBmcm9tIHNvdXJjZSBncmFwaFxyXG4gICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdFRvR3JhcGgoKTsgLy8gb3RoZXJ3aXNlIGp1c3QgY29ubmVjdFxyXG4gICAgICAvLyB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiUmVnaXN0ZXIgZm9yIHJlc3luY1wiLCBfc2VyaWFsaXphdGlvbi5uYW1lLCB0aGlzLm5hbWUpO1xyXG4gICAgICAgIFByb2plY3QucmVnaXN0ZXJHcmFwaEluc3RhbmNlRm9yUmVzeW5jKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29ubmVjdHMgdGhpcyBncmFwaCBpbnN0YW5jZSB0byB0aGUgZ3JhcGggcmVmZXJlbmNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3RUb0dyYXBoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgZ3JhcGg6IEdyYXBoID0gdGhpcy5nZXQoKTtcclxuICAgICAgaWYgKHRoaXMuI2Rlc2VyaWFsaXplRnJvbVNvdXJjZSlcclxuICAgICAgICBhd2FpdCB0aGlzLnNldChncmFwaCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhpcyBub2RlIHRvIGJlIGEgcmVjcmVhdGlvbiBvZiB0aGUge0BsaW5rIEdyYXBofSBnaXZlblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgc2V0KF9ncmFwaDogR3JhcGgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy4jaWRTb3VyY2UgPSBfZ3JhcGguaWRSZXNvdXJjZTtcclxuXHJcbiAgICAgIGxldCBjdXJyZW50R3JhcGg6IEdyYXBoID0gdGhpcy5nZXQoKTtcclxuICAgICAgaWYgKGN1cnJlbnRHcmFwaCkge1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQmVmb3JlIFJlbW92ZVwiLCBjdXJyZW50R3JhcGgubmFtZSwgdGhpcy5uYW1lLCBjdXJyZW50R3JhcGgubGlzdGVuZXJzKTtcclxuICAgICAgICBjdXJyZW50R3JhcGgucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5NVVRBVEVfR1JBUEgsIHRoaXMuaG5kTXV0YXRpb25HcmFwaCk7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJBZnRlciBSZW1vdmVcIiwgY3VycmVudEdyYXBoLm5hbWUsIHRoaXMubmFtZSwgY3VycmVudEdyYXBoLmxpc3RlbmVycyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRPRE86IGV4YW1pbmUsIGlmIHRoZSBzZXJpYWxpemF0aW9uIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIEdyYXBoIGZvciBvcHRpbWl6YXRpb24gPC0gYWxzbyB1c2VmdWwgZm9yIHN5bmMgd2l0aCBpbnN0YW5jZXNcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBTZXJpYWxpemVyLnNlcmlhbGl6ZShfZ3JhcGgpO1xyXG4gICAgICAvL1NlcmlhbGl6ZXIuZGVzZXJpYWxpemUoc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGZvciAobGV0IHBhdGggaW4gc2VyaWFsaXphdGlvbikge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZGVzZXJpYWxpemUoc2VyaWFsaXphdGlvbltwYXRoXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMubmFtZSArIEdyYXBoSW5zdGFuY2UuY291bnQrKyk7XHJcblxyXG4gICAgICAvLyBncmFwaC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk1VVEFURSwgKF9ldmVudDogQ3VzdG9tRXZlbnQpID0+IHRoaXMuaG5kTXV0YXRpb24sIHRydWUpO1xyXG4gICAgICBfZ3JhcGguYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5NVVRBVEVfR1JBUEgsIHRoaXMuaG5kTXV0YXRpb25HcmFwaCk7XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkFkZFwiLCBfZ3JhcGgubmFtZSwgdGhpcy5uYW1lLCBfZ3JhcGgubGlzdGVuZXJzKTtcclxuICAgICAgLy8gZ3JhcGguYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5NVVRBVEVfR1JBUEhfRE9ORSwgKCkgPT4geyBjb25zb2xlLmxvZyhcIkRvbmVcIiwgdGhpcy5uYW1lKTsgLyogdGhpcy4jc3luYyA9IHRydWU7ICovIH0pO1xyXG5cclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIGNvbnNvbGUubG9nKF9ncmFwaD8ubGlzdGVuZXJzKTtcclxuICAgICAgdGhpcy5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlQuR1JBUEhfSU5TVEFOVElBVEVEKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZ3JhcGggdGhpcyBpbnN0YW5jZXMgcmVmZXJzIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQoKTogR3JhcGgge1xyXG4gICAgICByZXR1cm4gPEdyYXBoPlByb2plY3QucmVzb3VyY2VzW3RoaXMuI2lkU291cmNlXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNvdXJjZSBncmFwaCBtdXRhdGVkLCByZWZsZWN0IG11dGF0aW9uIGluIHRoaXMgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBobmRNdXRhdGlvbkdyYXBoID0gYXN5bmMgKF9ldmVudDogQ3VzdG9tRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJSZWZsZWN0IEdyYXBoLU11dGF0aW9uIHRvIEluc3RhbmNlXCIsIFNZTkNbdGhpcy4jc3luY10sICg8R3JhcGg+X2V2ZW50LmN1cnJlbnRUYXJnZXQpLm5hbWUsIHRoaXMuZ2V0UGF0aCgpLm1hcChfbm9kZSA9PiBfbm9kZS5uYW1lKSk7XHJcbiAgICAgIC8vIGlmICh0aGlzLiNzeW5jICE9IFNZTkMuUkVBRFkpIHtcclxuICAgICAgLy8gICAvLyBjb25zb2xlLmxvZyhcIlN5bmMgYWJvcnRlZCwgc3dpdGNoIHRvIHJlYWR5XCIpO1xyXG4gICAgICAvLyAgIHRoaXMuI3N5bmMgPSBTWU5DLlJFQURZO1xyXG4gICAgICAvLyAgIHJldHVybjtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCgpKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vIHRoaXMuI3N5bmMgPSBTWU5DLkdSQVBIX1NZTkNFRDsgLy8gZG8gbm90IHN5bmMgYWdhaW4sIHNpbmNlIG11dGF0aW9uIGlzIGFscmVhZHkgYSBzeW5jaHJvbml6YXRpb25cclxuICAgICAgYXdhaXQgdGhpcy5yZWZsZWN0TXV0YXRpb24oX2V2ZW50LCA8R3JhcGg+X2V2ZW50LmN1cnJlbnRUYXJnZXQsIHRoaXMsIF9ldmVudC5kZXRhaWwucGF0aCk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTVVUQVRFX0lOU1RBTkNFLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaW5zdGFuY2UgbXV0YXRlZCwgcmVmbGVjdCBtdXRhdGlvbiBpbiBzb3VyY2UgZ3JhcGhcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBobmRNdXRhdGlvbkluc3RhbmNlID0gYXN5bmMgKF9ldmVudDogQ3VzdG9tRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJSZWZsZWN0IEluc3RhbmNlLU11dGF0aW9uIHRvIEdyYXBoXCIsIFNZTkNbdGhpcy4jc3luY10sIHRoaXMuZ2V0UGF0aCgpLm1hcChfbm9kZSA9PiBfbm9kZS5uYW1lKSwgdGhpcy5nZXQoKS5uYW1lKTtcclxuICAgICAgLy8gaWYgKHRoaXMuI3N5bmMgIT0gU1lOQy5SRUFEWSkge1xyXG4gICAgICAvLyAgIC8vIGNvbnNvbGUubG9nKFwiU3luYyBhYm9ydGVkLCBzd2l0Y2ggdG8gcmVhZHlcIik7XHJcbiAgICAgIC8vICAgdGhpcy4jc3luYyA9IFNZTkMuUkVBRFk7XHJcbiAgICAgIC8vICAgcmV0dXJuO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICAvLyBpZiAoX2V2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UgJiYgX2V2ZW50LnRhcmdldCAhPSB0aGlzKSB7XHJcbiAgICAgIC8vICAgLy8gY29uc29sZS5sb2coXCJTeW5jIGFib3J0ZWQsIHRhcmdldCBhbHJlYWR5IHN5bmNlZFwiKTtcclxuICAgICAgLy8gICByZXR1cm47XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmlzRmlsdGVyZWQoKSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAvLyB0aGlzLiNzeW5jID0gU1lOQy5JTlNUQU5DRTsgLy8gZG8gbm90IHN5bmMgYWdhaW4sIHNpbmNlIG11dGF0aW9uIGlzIGFscmVhZHkgYSBzeW5jaHJvbml6YXRpb25cclxuICAgICAgYXdhaXQgdGhpcy5yZWZsZWN0TXV0YXRpb24oX2V2ZW50LCB0aGlzLCB0aGlzLmdldCgpLCBSZWZsZWN0LmdldChfZXZlbnQsIFwicGF0aFwiKSk7XHJcbiAgICAgIHRoaXMuZ2V0KCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuTVVUQVRFLCB7IGRldGFpbDogX2V2ZW50LmRldGFpbCB9KSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIHJlZmxlY3QgbXV0YXRpb24gZnJvbSBhIHNvdXJjZSBncmFwaCBvciBpbnN0YW5jZSB0byBhIGRlc3RpbmF0aW9uIGluc3RhbmNlIG9yIGdyYXBoXHJcbiAgICBwcml2YXRlIGFzeW5jIHJlZmxlY3RNdXRhdGlvbihfZXZlbnQ6IEN1c3RvbUV2ZW50LCBfc291cmNlOiBOb2RlLCBfZGVzdGluYXRpb246IE5vZGUsIF9wYXRoOiBOb2RlW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJSZWZsZWN0IG11dGF0aW9uXCIsIF9zb3VyY2UsIF9kZXN0aW5hdGlvbik7XHJcblxyXG5cclxuICAgICAgZm9yIChsZXQgbm9kZSBvZiBfcGF0aCkgLy8gaXRlcmF0ZSB1cCB0aGUgZXZlbnQgcGF0aCwgd2hpY2ggbWF5IGNvbnRhaW4gcmVndWxhciBOb2RlcyBvciBHcmFwaEluc3RhbmNlc1xyXG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgR3JhcGhJbnN0YW5jZSkgLy8gdW50aWwgdGhpcyBHcmFwaEluc3RhbmNlIGlzIGZvdW5kIChvciBubyBHcmFwaEluc3RhbmNlLi4uKVxyXG4gICAgICAgICAgaWYgKG5vZGUgPT0gdGhpcylcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJTeW5jIGFib3J0ZWQsIHRhcmdldCBhbHJlYWR5IHN5bmNlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgLy8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBub2RlIGluIHRoZSBkZXN0aW5hdGlvbiBoaWVyYXJjaHlcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSBfcGF0aC5pbmRleE9mKF9zb3VyY2UpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBpbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgbGV0IGNoaWxkSW5kZXg6IG51bWJlciA9IF9wYXRoW2ldLmdldFBhcmVudCgpLmZpbmRDaGlsZChfcGF0aFtpXSk7IC8vIGdldCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkbm9kZSBpbiB0aGUgb3JpZ2luYWwgcGF0aFxyXG4gICAgICAgIF9kZXN0aW5hdGlvbiA9IF9kZXN0aW5hdGlvbi5nZXRDaGlsZChjaGlsZEluZGV4KTsgLy8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIGNoaWxkIGluIHRoaXMgcGF0aFxyXG4gICAgICAgIC8vIFRPRE86IHJlc3BlY3QgaW5kZXggZm9yIG5vbi1zaW5nbGV0b24gY29tcG9uZW50cy4uLlxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBtdXRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50IGluIHRoZSBkZXN0aW5hdGlvblxyXG4gICAgICBsZXQgY21wTXV0YXRlOiBDb21wb25lbnQgPSBfZGVzdGluYXRpb24uZ2V0Q29tcG9uZW50KF9ldmVudC5kZXRhaWwuY29tcG9uZW50LmNvbnN0cnVjdG9yKTtcclxuICAgICAgaWYgKGNtcE11dGF0ZSlcclxuICAgICAgICBhd2FpdCBjbXBNdXRhdGUubXV0YXRlKF9ldmVudC5kZXRhaWwubXV0YXRvciwgbnVsbCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNGaWx0ZXJlZCgpOiBib29sZWFuIHtcclxuICAgICAgbGV0IGNtcEZpbHRlcjogQ29tcG9uZW50R3JhcGhGaWx0ZXIgPSB0aGlzLmdldENvbXBvbmVudChDb21wb25lbnRHcmFwaEZpbHRlcik7XHJcbiAgICAgIHJldHVybiAoY21wRmlsdGVyICYmIGNtcEZpbHRlci5pc0FjdGl2ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogSG9sZHMgZGF0YSB0byBmZWVkIGludG8gYSB7QGxpbmsgU2hhZGVyfSB0byBkZXNjcmliZSB0aGUgc3VyZmFjZSBvZiB7QGxpbmsgTWVzaH0uICBcclxuICAgKiB7QGxpbmsgTWF0ZXJpYWx9cyByZWZlcmVuY2Uge0BsaW5rIENvYXR9IGFuZCB7QGxpbmsgU2hhZGVyfS4gICBcclxuICAgKiBUaGUgbWV0aG9kIHVzZVJlbmRlckRhdGEgd2lsbCBiZSBpbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3J9IGF0IHJ1bnRpbWUsIGV4dGVuZGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNsYXNzIHRvIGRlYWwgd2l0aCB0aGUgcmVuZGVyZXIuXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvYXQgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHtcclxuICAgIC8vIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIkNvYXRcIjtcclxuICAgIC8vIHByb3RlY3RlZCByZW5kZXJEYXRhOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfTsgLy8gdGhpcyB3YXNuJ3QgdXNlZCBhbnl3aGVyZS4uLlxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcmVuZGVyLXBhcmFtZXRlcnMgZnJvbSB0aGlzIGFuZCB0aGUgZ2l2ZW4gbWF0ZXJpYWwgaW5zaWRlIHRoZSBnaXZlbiBzaGFkZXIuXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JDb2F0fS4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXNlUmVuZGVyRGF0YShfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9jbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5yZW5kZXJEYXRhO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpbXBsZXN0IHtAbGluayBDb2F0fSBwcm92aWRpbmcganVzdCBhIGNvbG9yXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yQ29hdC5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBjbGFzcyBDb2F0Q29sb3JlZCBleHRlbmRzIENvYXQge1xyXG4gICAgcHVibGljIGNvbG9yOiBDb2xvcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuY29sb3IgPSBfY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmNvbG9yID0gdGhpcy5jb2xvci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29sb3IuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uY29sb3IpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIENvYXR9IHByb3ZpZGluZyBhIGNvbG9yIGFuZCBwYXJhbWV0ZXJzIGZvciB0aGUgcGhvbmcgc2hhZGluZyBtb2RlbC5cclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRSZW1pc3NpdmUgZXh0ZW5kcyBDb2F0Q29sb3JlZCB7XHJcbiAgICBwdWJsaWMgZGlmZnVzZTogbnVtYmVyO1xyXG4gICAgcHVibGljIHNwZWN1bGFyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgaW50ZW5zaXR5OiBudW1iZXI7XHJcblxyXG4gICAgI21ldGFsbGljOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoKSwgX2RpZmZ1c2U6IG51bWJlciA9IDEsIF9zcGVjdWxhcjogbnVtYmVyID0gMC41LCBfaW50ZW5zaXR5OiBudW1iZXIgPSAwLjcsIF9tZXRhbGxpYzogbnVtYmVyID0gMC4wKSB7XHJcbiAgICAgIHN1cGVyKF9jb2xvcik7XHJcbiAgICAgIHRoaXMuZGlmZnVzZSA9IF9kaWZmdXNlO1xyXG4gICAgICB0aGlzLnNwZWN1bGFyID0gX3NwZWN1bGFyO1xyXG4gICAgICB0aGlzLmludGVuc2l0eSA9IF9pbnRlbnNpdHk7XHJcbiAgICAgIHRoaXMubWV0YWxsaWMgPSBfbWV0YWxsaWM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBtZXRhbGxpYygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWV0YWxsaWM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1ldGFsbGljKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21ldGFsbGljID0gQ2FsYy5jbGFtcChfdmFsdWUsIDAsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5kaWZmdXNlID0gdGhpcy5kaWZmdXNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhcjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5tZXRhbGxpYyA9IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgdGhpcy5kaWZmdXNlID0gX3NlcmlhbGl6YXRpb24uZGlmZnVzZTtcclxuICAgICAgdGhpcy5zcGVjdWxhciA9IF9zZXJpYWxpemF0aW9uLnNwZWN1bGFyO1xyXG4gICAgICB0aGlzLmludGVuc2l0eSA9IF9zZXJpYWxpemF0aW9uLmludGVuc2l0eSA/PyB0aGlzLmludGVuc2l0eTtcclxuICAgICAgdGhpcy5tZXRhbGxpYyA9IF9zZXJpYWxpemF0aW9uLm1ldGFsbGljID8/IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLmRpZmZ1c2U7XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLnNwZWN1bGFyO1xyXG4gICAgICBkZWxldGUgbXV0YXRvci5pbnRlbnNpdHk7XHJcbiAgICAgIG11dGF0b3IuZGlmZnVzZSA9IHRoaXMuZGlmZnVzZTtcclxuICAgICAgbXV0YXRvci5zcGVjdWxhciA9IHRoaXMuc3BlY3VsYXI7XHJcbiAgICAgIG11dGF0b3IuaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7XHJcbiAgICAgIG11dGF0b3IubWV0YWxsaWMgPSB0aGlzLm1ldGFsbGljO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIENvYXR9IHByb3ZpZGluZyBhIHRleHR1cmUgYW5kIGFkZGl0aW9uYWwgZGF0YSBmb3IgdGV4dHVyaW5nXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yQ29hdC5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBjbGFzcyBDb2F0VGV4dHVyZWQgZXh0ZW5kcyBDb2F0Q29sb3JlZCB7XHJcbiAgICBwdWJsaWMgdGV4dHVyZTogVGV4dHVyZSA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoKSwgX3RleHR1cmU6IFRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC5jb2xvcikge1xyXG4gICAgICBzdXBlcihfY29sb3IpO1xyXG4gICAgICB0aGlzLnRleHR1cmUgPSBfdGV4dHVyZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWRUZXh0dXJlID0gdGhpcy50ZXh0dXJlLmlkUmVzb3VyY2U7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBpZiAoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKVxyXG4gICAgICAgIHRoaXMudGV4dHVyZSA9IDxUZXh0dXJlPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCJDb2F0VGV4dHVyZWQudHNcIi8+XHJcblxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBIHtAbGluayBDb2F0fSBwcm92aWRpbmcgYSB0ZXh0dXJlIGFuZCBhZGRpdGlvbmFsIGRhdGEgZm9yIHRleHR1cmluZ1xyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvYXQuZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29hdFJlbWlzc2l2ZVRleHR1cmVkIGV4dGVuZHMgQ29hdFRleHR1cmVkIHtcclxuICAgIHB1YmxpYyBkaWZmdXNlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgc3BlY3VsYXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBpbnRlbnNpdHk6IG51bWJlcjtcclxuXHJcbiAgICAjbWV0YWxsaWM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfdGV4dHVyZTogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LmNvbG9yLCBfZGlmZnVzZTogbnVtYmVyID0gMSwgX3NwZWN1bGFyOiBudW1iZXIgPSAwLjUsIF9pbnRlbnNpdHk6IG51bWJlciA9IDAuNywgX21ldGFsbGljOiBudW1iZXIgPSAwLjApIHtcclxuICAgICAgc3VwZXIoX2NvbG9yLCBfdGV4dHVyZSk7XHJcbiAgICAgIHRoaXMuZGlmZnVzZSA9IF9kaWZmdXNlO1xyXG4gICAgICB0aGlzLnNwZWN1bGFyID0gX3NwZWN1bGFyO1xyXG4gICAgICB0aGlzLmludGVuc2l0eSA9IF9pbnRlbnNpdHk7XHJcbiAgICAgIHRoaXMubWV0YWxsaWMgPSBfbWV0YWxsaWM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBtZXRhbGxpYygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWV0YWxsaWM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1ldGFsbGljKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21ldGFsbGljID0gQ2FsYy5jbGFtcChfdmFsdWUsIDAsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5kaWZmdXNlID0gdGhpcy5kaWZmdXNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhcjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5tZXRhbGxpYyA9IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB0aGlzLmRpZmZ1c2UgPSBfc2VyaWFsaXphdGlvbi5kaWZmdXNlO1xyXG4gICAgICB0aGlzLnNwZWN1bGFyID0gX3NlcmlhbGl6YXRpb24uc3BlY3VsYXI7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX3NlcmlhbGl6YXRpb24uaW50ZW5zaXR5ID8/IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICB0aGlzLm1ldGFsbGljID0gX3NlcmlhbGl6YXRpb24ubWV0YWxsaWMgPz8gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgZGVsZXRlIG11dGF0b3IuZGlmZnVzZTtcclxuICAgICAgZGVsZXRlIG11dGF0b3Iuc3BlY3VsYXI7XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5kaWZmdXNlID0gdGhpcy5kaWZmdXNlO1xyXG4gICAgICBtdXRhdG9yLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhcjtcclxuICAgICAgbXV0YXRvci5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5tZXRhbGxpYyA9IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiQ29hdFRleHR1cmVkLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgdGV4dHVyZSBhbmQgYWRkaXRpb25hbCBkYXRhIGZvciB0ZXh0dXJpbmdcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRSZW1pc3NpdmVUZXh0dXJlZE5vcm1hbHMgZXh0ZW5kcyBDb2F0UmVtaXNzaXZlVGV4dHVyZWQge1xyXG4gICAgcHVibGljIG5vcm1hbE1hcDogVGV4dHVyZSA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoKSwgX3RleHR1cmU6IFRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC5jb2xvciwgX25vcm1hbE1hcDogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0Lm5vcm1hbCwgX2RpZmZ1c2U/OiBudW1iZXIsIF9zcGVjdWxhcjogbnVtYmVyID0gdW5kZWZpbmVkLCBfaW50ZW5zaXR5OiBudW1iZXIgPSB1bmRlZmluZWQsIF9tZXRhbGxpYzogbnVtYmVyID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHN1cGVyKF9jb2xvciwgX3RleHR1cmUsIF9kaWZmdXNlLCBfc3BlY3VsYXIsIF9pbnRlbnNpdHksIF9tZXRhbGxpYyk7XHJcbiAgICAgIHRoaXMubm9ybWFsTWFwID0gX25vcm1hbE1hcDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uaWROb3JtYWxNYXAgPSB0aGlzLm5vcm1hbE1hcC5pZFJlc291cmNlO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmlkTm9ybWFsTWFwKVxyXG4gICAgICAgIHRoaXMubm9ybWFsTWFwID0gPFRleHR1cmU+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZE5vcm1hbE1hcCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIENvYXR9IHByb3ZpZGluZyBhIGNvbG9yIGFuZCBwYXJhbWV0ZXJzIGZvciB0aGUgdG9vbiBzaGFkaW5nIG1vZGVsLlxyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvYXQuZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29hdFRvb24gZXh0ZW5kcyBtaXhpbkNvYXRUb29uKENvYXRSZW1pc3NpdmUpIHtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKCksIF90ZXhUb29uOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQudG9vbiwgX2RpZmZ1c2U/OiBudW1iZXIsIF9zcGVjdWxhcjogbnVtYmVyID0gMS4yLCBfaW50ZW5zaXR5PzogbnVtYmVyLCBfbWV0YWxsaWM/OiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIoX2NvbG9yLCBfZGlmZnVzZSwgX3NwZWN1bGFyLCBfaW50ZW5zaXR5LCBfbWV0YWxsaWMpO1xyXG4gICAgICB0aGlzLnRleFRvb24gPSBfdGV4VG9vbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIENvYXR9IHByb3ZpZGluZyBhIHRleHR1cmUsIGEgY29sb3IgYW5kIHBhcmFtZXRlcnMgZm9yIHRoZSB0b29uIHNoYWRpbmcgbW9kZWwuXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yQ29hdC5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBjbGFzcyBDb2F0VG9vblRleHR1cmVkIGV4dGVuZHMgbWl4aW5Db2F0VG9vbihDb2F0UmVtaXNzaXZlVGV4dHVyZWQpIHtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKCksIF90ZXh0dXJlOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQuY29sb3IsIF90ZXhUb29uOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQudG9vbiwgX2RpZmZ1c2U/OiBudW1iZXIsIF9zcGVjdWxhcjogbnVtYmVyID0gMS4yLCBfaW50ZW5zaXR5PzogbnVtYmVyLCBfbWV0YWxsaWM/OiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIoX2NvbG9yLCBfdGV4dHVyZSwgX2RpZmZ1c2UsIF9zcGVjdWxhciwgX2ludGVuc2l0eSwgX21ldGFsbGljKTtcclxuICAgICAgdGhpcy50ZXhUb29uID0gX3RleFRvb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBtaXhpbkNvYXRUb29uPFRCYXNlIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBHZW5lcmFsW10pID0+IFNlcmlhbGl6YWJsZT4oX2Jhc2U6IFRCYXNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuICAgIGFic3RyYWN0IGNsYXNzIENvYXRUb29uIGV4dGVuZHMgX2Jhc2Uge1xyXG4gICAgICBwdWJsaWMgdGV4VG9vbjogVGV4dHVyZTtcclxuXHJcbiAgICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uLmlkVGV4VG9vbiA9IHRoaXMudGV4VG9vbi5pZFJlc291cmNlO1xyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgICBpZiAoX3NlcmlhbGl6YXRpb24uaWRUZXhUb29uKVxyXG4gICAgICAgICAgdGhpcy50ZXhUb29uID0gPFRleHR1cmU+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZFRleFRvb24pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIENvYXRUb29uO1xyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBEZWZpbmVzIGEgY29sb3IgYXMgdmFsdWVzIGluIHRoZSByYW5nZSBvZiAwIHRvIDEgZm9yIHRoZSBmb3VyIGNoYW5uZWxzIHJlZCwgZ3JlZW4sIGJsdWUgYW5kIGFscGhhIChmb3Igb3BhY2l0eSlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29sb3IgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgLy8gY3JjMiBvbmx5IHVzZWQgZm9yIGNvbnZlcnRpbmcgY29sb3JzIGZyb20gc3RyaW5ncyBwcmVkZWZpbmVkIGJ5IENTU1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3JjMjogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gKCgpID0+IHtcclxuICAgICAgY29uc3QgY3JjMjogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKS5nZXRDb250ZXh0KFwiMmRcIiwgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XHJcbiAgICAgIGNyYzIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJjb3B5XCI7XHJcbiAgICAgIHJldHVybiBjcmMyO1xyXG4gICAgfSkoKTtcclxuXHJcbiAgICBwdWJsaWMgcjogbnVtYmVyO1xyXG4gICAgcHVibGljIGc6IG51bWJlcjtcclxuICAgIHB1YmxpYyBiOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYTogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcjogbnVtYmVyID0gMSwgX2c6IG51bWJlciA9IDEsIF9iOiBudW1iZXIgPSAxLCBfYTogbnVtYmVyID0gMSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldENsYW1wZWQoX3IsIF9nLCBfYiwgX2EpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBVaW50OENsYW1wZWRBcnJheX0gd2l0aCB0aGUgOC1iaXQgY29sb3IgY2hhbm5lbHMgaW4gdGhlIG9yZGVyIFJHQkEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Qnl0ZXNGcm9tQ1NTKF9rZXl3b3JkOiBzdHJpbmcpOiBVaW50OENsYW1wZWRBcnJheSB7XHJcbiAgICAgIENvbG9yLmNyYzIuZmlsbFN0eWxlID0gX2tleXdvcmQ7XHJcbiAgICAgIENvbG9yLmNyYzIuZmlsbFJlY3QoMCwgMCwgMSwgMSk7XHJcbiAgICAgIHJldHVybiBDb2xvci5jcmMyLmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG5ldyB7QGxpbmsgQ29sb3J9IG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIGNzcyBjb2xvciBrZXl3b3JkLiBcclxuICAgICAqIFBhc3NpbmcgYW4gX2FscGhhIHZhbHVlIHdpbGwgb3ZlcnJpZGUgdGhlIGFscGhhIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUga2V5d29yZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDU1MoX2tleXdvcmQ6IHN0cmluZywgX2FscGhhPzogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICByZXR1cm4gUmVjeWNsZXIuZ2V0KENvbG9yKS5zZXRDU1MoX2tleXdvcmQsIF9hbHBoYSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0cnVucyB0aGUgcHJvZHVjdCBvZiB0d28gY29sb3JzLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9EVUNUKF9jbHJBOiBDb2xvciwgX2NsckI6IENvbG9yKTogQ29sb3Ige1xyXG4gICAgICByZXR1cm4gX2NsckEuY2xvbmUubXVsdGlwbHkoX2NsckIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsb25lIG9mIHRoaXMgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogQ29sb3Ige1xyXG4gICAgICByZXR1cm4gUmVjeWNsZXIucmV1c2UoQ29sb3IpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3BpZXMgdGhlIGNvbG9yIGNoYW5uZWxzIG9mIHRoZSBnaXZlbiBjb2xvciBpbnRvIHRoaXMgY29sb3IgYW5kIHJldHVybnMgaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9jb2xvcjogQ29sb3IpOiBDb2xvciB7XHJcbiAgICAgIHRoaXMuciA9IF9jb2xvci5yO1xyXG4gICAgICB0aGlzLmcgPSBfY29sb3IuZztcclxuICAgICAgdGhpcy5iID0gX2NvbG9yLmI7XHJcbiAgICAgIHRoaXMuYSA9IF9jb2xvci5hO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5yID0gMTsgdGhpcy5nID0gMTsgdGhpcy5iID0gMTsgdGhpcy5hID0gMTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBjb2xvciBmcm9tIHRoZSBnaXZlbiBjc3MgY29sb3Iga2V5d29yZC4gT3B0aW5hbGx5IHNldHMgdGhlIGFscGhhIHZhbHVlIHRvIHRoZSBnaXZlbiB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldENTUyhfa2V5d29yZDogc3RyaW5nLCBfYWxwaGE/OiBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIGNvbnN0IGJ5dGVzUkdCQTogVWludDhDbGFtcGVkQXJyYXkgPSBDb2xvci5nZXRCeXRlc0Zyb21DU1MoX2tleXdvcmQpO1xyXG4gICAgICB0aGlzLnNldEJ5dGVzKGJ5dGVzUkdCQVswXSwgYnl0ZXNSR0JBWzFdLCBieXRlc1JHQkFbMl0sIGJ5dGVzUkdCQVszXSk7XHJcbiAgICAgIHRoaXMuYSA9IF9hbHBoYSA/PyB0aGlzLmE7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGNvbG9yIGZyb20gdGhlIGdpdmVuIDgtYml0IHZhbHVlcyBmb3IgdGhlIGNvbG9yIGNoYW5uZWxzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Qnl0ZXMoX3I6IG51bWJlciwgX2c6IG51bWJlciwgX2I6IG51bWJlciwgX2E6IG51bWJlcik6IENvbG9yO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEJ5dGVzKF9yZ2JhOiBVaW50OENsYW1wZWRBcnJheSk6IENvbG9yO1xyXG4gICAgcHVibGljIHNldEJ5dGVzKF9yOiBudW1iZXIgfCBVaW50OENsYW1wZWRBcnJheSwgX2c/OiBudW1iZXIsIF9iPzogbnVtYmVyLCBfYT86IG51bWJlcik6IENvbG9yIHtcclxuICAgICAgaWYgKF9yIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpXHJcbiAgICAgICAgdGhpcy5zZXRCeXRlcyhfclswXSwgX3JbMV0sIF9yWzJdLCBfclszXSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnNldENsYW1wZWQoX3IgLyAyNTUsIF9nIC8gMjU1LCBfYiAvIDI1NSwgX2EgLyAyNTUpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbG9yIGNoYW5uZWxzIG9mIHRoaXMgY29sb3IgYW5kIGNsYW1wcyB0aGVtIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldENsYW1wZWQoX3I6IG51bWJlciwgX2c6IG51bWJlciwgX2I6IG51bWJlciwgX2E6IG51bWJlcik6IENvbG9yO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSB0aGUgZ2l2ZW4ge0BsaW5rIEZsb2F0MzJBcnJheX0gd2hpbGUgY2xhbXBpbmcgdGhlIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDbGFtcGVkKF9yZ2JhOiBGbG9hdDMyQXJyYXkpOiBDb2xvcjtcclxuICAgIHB1YmxpYyBzZXRDbGFtcGVkKF9yOiBudW1iZXIgfCBGbG9hdDMyQXJyYXksIF9nPzogbnVtYmVyLCBfYj86IG51bWJlciwgX2E/OiBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIGlmIChfciBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlcclxuICAgICAgICB0aGlzLnNldENsYW1wZWQoX3JbMF0sIF9yWzFdLCBfclsyXSwgX3JbM10pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5zZXQoXHJcbiAgICAgICAgICBDYWxjLmNsYW1wKF9yLCAwLCAxKSxcclxuICAgICAgICAgIENhbGMuY2xhbXAoX2csIDAsIDEpLFxyXG4gICAgICAgICAgQ2FsYy5jbGFtcChfYiwgMCwgMSksXHJcbiAgICAgICAgICBDYWxjLmNsYW1wKF9hLCAwLCAxKVxyXG4gICAgICAgICk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29sb3IgY2hhbm5lbHMgb2YgdGhpcyBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldChfcjogbnVtYmVyLCBfZzogbnVtYmVyLCBfYjogbnVtYmVyLCBfYTogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICB0aGlzLnIgPSBfcjsgdGhpcy5nID0gX2c7IHRoaXMuYiA9IF9iOyB0aGlzLmEgPSBfYTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBjb2xvciBjaGFubmVscyBvZiB0aGlzIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFt0aGlzLnIsIHRoaXMuZywgdGhpcy5iLCB0aGlzLmFdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgVWludDhDbGFtcGVkQXJyYXl9IG9mIHRoZSBjb2xvciBjaGFubmVscyBvZiB0aGlzIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Qnl0ZXMoKTogVWludDhDbGFtcGVkQXJyYXkge1xyXG4gICAgICByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KFt0aGlzLnIgKiAyNTUsIHRoaXMuZyAqIDI1NSwgdGhpcy5iICogMjU1LCB0aGlzLmEgKiAyNTVdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNzcyBjb2xvciBrZXl3b3JkIHJlcHJlc2VudGluZyB0aGlzIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q1NTKCk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBieXRlczogVWludDhDbGFtcGVkQXJyYXkgPSB0aGlzLmdldEJ5dGVzKCk7XHJcbiAgICAgIHJldHVybiBgUkdCQSgke2J5dGVzWzBdfSwgJHtieXRlc1sxXX0sICR7Ynl0ZXNbMl19LCAke3RoaXMuYX0pYDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGhleCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEhleCgpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgYnl0ZXM6IFVpbnQ4Q2xhbXBlZEFycmF5ID0gdGhpcy5nZXRCeXRlcygpO1xyXG4gICAgICBsZXQgaGV4OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICBmb3IgKGxldCBieXRlIG9mIGJ5dGVzKVxyXG4gICAgICAgIGhleCArPSBieXRlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIik7XHJcbiAgICAgIHJldHVybiBoZXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSB0aGUgZ2l2ZW4gaGV4IHN0cmluZyBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEhleChfaGV4OiBzdHJpbmcpOiBDb2xvciB7XHJcbiAgICAgIGxldCBieXRlczogVWludDhDbGFtcGVkQXJyYXkgPSB0aGlzLmdldEJ5dGVzKCk7XHJcbiAgICAgIGxldCBjaGFubmVsOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBieXRlIGluIGJ5dGVzKVxyXG4gICAgICAgIGJ5dGVzW2J5dGVdID0gcGFyc2VJbnQoX2hleC5zdWJzdHIoY2hhbm5lbCsrICogMiwgMiksIDE2KTtcclxuICAgICAgcmV0dXJuIHRoaXMuc2V0Qnl0ZXMoYnl0ZXMpOztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIGNvbG9yIHRvIHRoaXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGQoX2NvbG9yOiBDb2xvcik6IENvbG9yIHtcclxuICAgICAgdGhpcy5yICs9IF9jb2xvci5yO1xyXG4gICAgICB0aGlzLmcgKz0gX2NvbG9yLmc7XHJcbiAgICAgIHRoaXMuYiArPSBfY29sb3IuYjtcclxuICAgICAgdGhpcy5hICs9IF9jb2xvci5hO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGxpZXMgdGhpcyB3aXRoIHRoZSBnaXZlbiBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG11bHRpcGx5KF9jb2xvcjogQ29sb3IpOiBDb2xvciB7XHJcbiAgICAgIHRoaXMuciAqPSBfY29sb3IucjtcclxuICAgICAgdGhpcy5nICo9IF9jb2xvci5nO1xyXG4gICAgICB0aGlzLmIgKj0gX2NvbG9yLmI7XHJcbiAgICAgIHRoaXMuYSAqPSBfY29sb3IuYTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYChyOiAke3RoaXMuci50b0ZpeGVkKDMpfSwgZzogJHt0aGlzLmcudG9GaXhlZCgzKX0sIGI6ICR7dGhpcy5iLnRvRml4ZWQoMyl9LCBhOiAke3RoaXMuYS50b0ZpeGVkKDMpfSlgO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB0aGlzLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYHsgXCJyXCI6ICR7dGhpcy5yfSwgXCJnXCI6ICR7dGhpcy5nfSwgXCJiXCI6ICR7dGhpcy5ifSwgXCJhXCI6ICR7dGhpcy5hfX1gOyB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGBbJHt0aGlzLnJ9LCAke3RoaXMuZ30sICR7dGhpcy5ifSwgJHt0aGlzLmF9XWA7IH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9zZXJpYWxpemF0aW9uKSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgW3RoaXMuciwgdGhpcy5nLCB0aGlzLmIsIHRoaXMuYV0gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyoqICovIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZWNsYXNzIGZvciBtYXRlcmlhbHMuIENvbWJpbmVzIGEge0BsaW5rIFNoYWRlcn0gd2l0aCBhIGNvbXBhdGlibGUge0BsaW5rIENvYXR9XHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWF0ZXJpYWwgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlUmVzb3VyY2Uge1xyXG4gICAgLyoqIFRoZSBuYW1lIHRvIGNhbGwgdGhlIE1hdGVyaWFsIGJ5LiAqL1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICAgIHB1YmxpYyBpZFJlc291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ2xpcHBpbmcgdGhyZXNob2xkIGZvciBhbHBoYSB2YWx1ZXMsIGV2ZXJ5IHBpeGVsIHdpdGggYWxwaGEgPCBhbHBoYUNsaXAgd2lsbCBiZSBkaXNjYXJkZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhbHBoYUNsaXA6IG51bWJlciA9IDAuMDE7XHJcblxyXG4gICAgcHJpdmF0ZSBzaGFkZXJUeXBlOiB0eXBlb2YgU2hhZGVyOyAvLyBUaGUgc2hhZGVyIHByb2dyYW0gdXNlZCBieSB0aGlzIEJhc2VNYXRlcmlhbFxyXG4gICAgI2NvYXQ6IENvYXQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcsIF9zaGFkZXI/OiB0eXBlb2YgU2hhZGVyLCBfY29hdD86IENvYXQpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICAgIHRoaXMuc2hhZGVyVHlwZSA9IF9zaGFkZXI7XHJcbiAgICAgIGlmIChfc2hhZGVyKSB7XHJcbiAgICAgICAgaWYgKF9jb2F0KVxyXG4gICAgICAgICAgdGhpcy5jb2F0ID0gX2NvYXQ7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5jb2F0ID0gdGhpcy5jcmVhdGVDb2F0TWF0Y2hpbmdTaGFkZXIoKTtcclxuICAgICAgfVxyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHJlZmVyZW5jZWQge0BsaW5rIENvYXR9IGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY29hdCgpOiBDb2F0IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NvYXQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1ha2VzIHRoaXMgbWF0ZXJpYWwgcmVmZXJlbmNlIHRoZSBnaXZlbiB7QGxpbmsgQ29hdH0gaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSByZWZlcmVuY2VkIHtAbGluayBTaGFkZXJ9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgY29hdChfY29hdDogQ29hdCkge1xyXG4gICAgICBpZiAodGhpcy5zaGFkZXJUeXBlKVxyXG4gICAgICAgIGlmIChfY29hdC5jb25zdHJ1Y3RvciAhPSB0aGlzLnNoYWRlclR5cGUuZ2V0Q29hdCgpKVxyXG4gICAgICAgICAgaWYgKF9jb2F0IGluc3RhbmNlb2YgdGhpcy5zaGFkZXJUeXBlLmdldENvYXQoKSlcclxuICAgICAgICAgICAgRGVidWcuZnVkZ2UoXCJDb2F0IGlzIGV4dGVuc2lvbiBvZiBDb2F0IHJlcXVpcmVkIGJ5IHNoYWRlclwiKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgKG5ldyBFcnJvcihcIlNoYWRlciBhbmQgY29hdCBkb24ndCBtYXRjaFwiKSk7XHJcbiAgICAgIHRoaXMuI2NvYXQgPSBfY29hdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0ZXJpYWwgaGFzIGFueSBhcmVhcyAoY29sb3Igb3IgdGV4dHVyZSkgd2l0aCBhbHBoYSA8IDEuXHJcbiAgICAgKiDimqDvuI8gQ0FVVElPTjogQ29tcHV0aW9uYWxseSBleHBlbnNpdmUgZm9yIHRleHR1cmVkIG1hdGVyaWFscywgc2VlIHtAbGluayBUZXh0dXJlLmhhc1RyYW5zcGFyZW5jeX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBoYXNUcmFuc3BhcmVuY3koKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBjb2F0OiBDb2F0VGV4dHVyZWQgPSA8Q29hdFRleHR1cmVkPnRoaXMuY29hdDtcclxuICAgICAgcmV0dXJuIGNvYXQuY29sb3I/LmEgPCAxIHx8IGNvYXQudGV4dHVyZT8uaGFzVHJhbnNwYXJlbmN5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29hdH0gaW5zdGFuY2UgdGhhdCBpcyB2YWxpZCBmb3IgdGhlIHtAbGluayBTaGFkZXJ9IHJlZmVyZW5jZWQgYnkgdGhpcyBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlQ29hdE1hdGNoaW5nU2hhZGVyKCk6IENvYXQge1xyXG4gICAgICBsZXQgY29hdDogQ29hdCA9IG5ldyAodGhpcy5zaGFkZXJUeXBlLmdldENvYXQoKSkoKTtcclxuICAgICAgcmV0dXJuIGNvYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2VzIHRoZSBtYXRlcmlhbHMgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiB7QGxpbmsgU2hhZGVyfSwgY3JlYXRlcyBhbmQgcmVmZXJlbmNlcyBhIG5ldyB7QGxpbmsgQ29hdH0gaW5zdGFuY2UgIFxyXG4gICAgICogYW5kIG11dGF0ZXMgdGhlIG5ldyBjb2F0IHRvIHByZXNlcnZlIG1hdGNoaW5nIHByb3BlcnRpZXMuXHJcbiAgICAgKiBAcGFyYW0gX3NoYWRlclR5cGUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTaGFkZXIoX3NoYWRlclR5cGU6IHR5cGVvZiBTaGFkZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zaGFkZXJUeXBlID0gX3NoYWRlclR5cGU7XHJcbiAgICAgIGxldCBjb2F0OiBDb2F0ID0gdGhpcy5jcmVhdGVDb2F0TWF0Y2hpbmdTaGFkZXIoKTtcclxuICAgICAgY29hdC5tdXRhdGUodGhpcy4jY29hdD8uZ2V0TXV0YXRvcigpKTtcclxuICAgICAgdGhpcy5jb2F0ID0gY29hdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBTaGFkZXJ9IHJlZmVyZW5jZWQgYnkgdGhpcyBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U2hhZGVyKCk6IHR5cGVvZiBTaGFkZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5zaGFkZXJUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgLy8gVE9ETzogdGhpcyB0eXBlIG9mIHNlcmlhbGl6YXRpb24gd2FzIGltcGxlbWVudGVkIGZvciBpbXBsaWNpdCBNYXRlcmlhbCBjcmVhdGUuIENoZWNrIGlmIG9ic29sZXRlIHdoZW4gb25seSBvbmUgbWF0ZXJpYWwgY2xhc3MgZXhpc3RzIGFuZC9vciBtYXRlcmlhbHMgYXJlIHN0b3JlZCBzZXBhcmF0ZWx5XHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgaWRSZXNvdXJjZTogdGhpcy5pZFJlc291cmNlLFxyXG4gICAgICAgIHNoYWRlcjogdGhpcy5zaGFkZXJUeXBlLm5hbWUsXHJcbiAgICAgICAgY29hdDogU2VyaWFsaXplci5zZXJpYWxpemUodGhpcy4jY29hdCksXHJcbiAgICAgICAgYWxwaGFDbGlwOiB0aGlzLmFscGhhQ2xpcFxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9zZXJpYWxpemF0aW9uLm5hbWU7XHJcbiAgICAgIFByb2plY3QucmVnaXN0ZXIodGhpcywgX3NlcmlhbGl6YXRpb24uaWRSZXNvdXJjZSk7XHJcbiAgICAgIHRoaXMuc2hhZGVyVHlwZSA9ICg8R2VuZXJhbD5GdWRnZUNvcmUpW19zZXJpYWxpemF0aW9uLnNoYWRlcl07XHJcbiAgICAgIGxldCBjb2F0OiBDb2F0ID0gPENvYXQ+YXdhaXQgU2VyaWFsaXplci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5jb2F0KTtcclxuICAgICAgdGhpcy5jb2F0ID0gY29hdDtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmFscGhhQ2xpcCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy5hbHBoYUNsaXAgPSBfc2VyaWFsaXphdGlvbi5hbHBoYUNsaXA7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IuY29hdCA9IHRoaXMuY29hdC5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIC8vIGRlbGV0ZSBfbXV0YXRvci5pZFJlc291cmNlO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIE1hdGVyaWFsfSBsb2FkZWQgZnJvbSBhIGdsVEYtRmlsZS5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWF0ZXJpYWxHTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKE1hdGVyaWFsKSB7XHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsLCBfbmFtZTogc3RyaW5nID0gdGhpcy5uYW1lKTogUHJvbWlzZTxNYXRlcmlhbEdMVEY+IHtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgcmV0dXJuIEdMVEZMb2FkZXIubG9hZFJlc291cmNlKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEFic3RyYWN0IGNsYXNzIHN1cHBvcnRpbmcgdmFyaW91cyBhcml0aG1ldGljYWwgaGVscGVyIGZ1bmN0aW9uc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDYWxjIHtcclxuICAgIC8qKiBmYWN0b3IgbXVsdGlwbGllZCB3aXRoIGFuZ2xlIGluIGRlZ3JlZXMgeWllbGRzIHRoZSBhbmdsZSBpbiByYWRpYW4gKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVnMnJhZDogbnVtYmVyID0gTWF0aC5QSSAvIDE4MDtcclxuICAgIC8qKiBmYWN0b3IgbXVsdGlwbGllZCB3aXRoIGFuZ2xlIGluIHJhZGlhbiB5aWVsZHMgdGhlIGFuZ2xlIGluIGRlZ3JlZXMgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcmFkMmRlZzogbnVtYmVyID0gMSAvIENhbGMuZGVnMnJhZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgb25lIG9mIHRoZSB2YWx1ZXMgcGFzc2VkIGluLCBlaXRoZXIgX3ZhbHVlIGlmIHdpdGhpbiBfbWluIGFuZCBfbWF4IG9yIHRoZSBib3VuZGFyeSBiZWluZyBleGNlZWRlZCBieSBfdmFsdWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGFtcDxUPihfdmFsdWU6IFQsIF9taW46IFQsIF9tYXg6IFQsIF9pc1NtYWxsZXI6IChfdmFsdWUxOiBULCBfdmFsdWUyOiBUKSA9PiBib29sZWFuID0gKF92YWx1ZTE6IFQsIF92YWx1ZTI6IFQpID0+IHsgcmV0dXJuIF92YWx1ZTEgPCBfdmFsdWUyOyB9KTogVCB7XHJcbiAgICAgIGlmIChfaXNTbWFsbGVyKF92YWx1ZSwgX21pbikpIHJldHVybiBfbWluO1xyXG4gICAgICBpZiAoX2lzU21hbGxlcihfbWF4LCBfdmFsdWUpKSByZXR1cm4gX21heDtcclxuICAgICAgcmV0dXJuIF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZhbHVlcyAoX2EsIF9iKSBmb3IgdGhlIGdpdmVuIGludGVycG9sYXRpb24gZmFjdG9yIChfZikuIGYgaXMgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgbGVycChfYTogbnVtYmVyLCBfYjogbnVtYmVyLCBfZjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIF9hICsgKF9iIC0gX2EpICogQ2FsYy5jbGFtcChfZiwgMCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGludGVyZmFjZSBCb3JkZXIge1xyXG4gICAgbGVmdDogbnVtYmVyO1xyXG4gICAgdG9wOiBudW1iZXI7XHJcbiAgICByaWdodDogbnVtYmVyO1xyXG4gICAgYm90dG9tOiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGcmFtaW5nIGRlc2NyaWJlcyBob3cgdG8gbWFwIGEgcmVjdGFuZ2xlIGludG8gYSBnaXZlbiBmcmFtZVxyXG4gICAqIGFuZCBob3cgcG9pbnRzIGluIHRoZSBmcmFtZSBjb3JyZXNwb25kIHRvIHBvaW50cyBpbiB0aGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBhbmQgdmljZSB2ZXJzYVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5ICBcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0ZyYW1pbmdcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgRnJhbWluZyBleHRlbmRzIE11dGFibGUge1xyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsvKiogKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBhIHBvaW50IGluIHRoZSBnaXZlbiBmcmFtZSBhY2NvcmRpbmcgdG8gdGhpcyBmcmFtaW5nXHJcbiAgICAgKiBAcGFyYW0gX3BvaW50SW5GcmFtZSBUaGUgcG9pbnQgaW4gdGhlIGZyYW1lIGdpdmVuXHJcbiAgICAgKiBAcGFyYW0gX3JlY3RGcmFtZSBUaGUgZnJhbWUgdGhlIHBvaW50IGlzIHJlbGF0aXZlIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRQb2ludChfcG9pbnRJbkZyYW1lOiBWZWN0b3IyLCBfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBWZWN0b3IyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBhIHBvaW50IGluIGEgZ2l2ZW4gcmVjdGFuZ2xlIGJhY2sgdG8gYSBjYWxjdWxhdGVkIGZyYW1lIG9mIG9yaWdpblxyXG4gICAgICogQHBhcmFtIF9wb2ludCBUaGUgcG9pbnQgaW4gdGhlIHJlY3RhbmdsZVxyXG4gICAgICogQHBhcmFtIF9yZWN0IFRoZSByZWN0YW5nbGUgdGhlIHBvaW50IGlzIHJlbGF0aXZlIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRQb2ludEludmVyc2UoX3BvaW50OiBWZWN0b3IyLCBfcmVjdDogUmVjdGFuZ2xlKTogVmVjdG9yMjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgcmVjdGFuZ2xlIGFzIHRoZSBmcmFtZSBhbmQgY3JlYXRlcyBhIG5ldyByZWN0YW5nbGUgYWNjb3JkaW5nIHRvIHRoZSBmcmFtaW5nXHJcbiAgICAgKiBAcGFyYW0gX3JlY3RGcmFtZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0UmVjdChfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBSZWN0YW5nbGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBoYXMgYSBmaXhlZCB3aWR0aCBhbmQgaGVpZ2h0IGFuZCBkaXNwbGF5IHNob3VsZCBzY2FsZSB0byBmaXQgdGhlIGZyYW1lXHJcbiAgICogUG9pbnRzIGFyZSBzY2FsZWQgaW4gdGhlIHNhbWUgcmF0aW9cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRnJhbWluZ0ZpeGVkIGV4dGVuZHMgRnJhbWluZyB7XHJcbiAgICBwdWJsaWMgd2lkdGg6IG51bWJlciA9IDMwMDtcclxuICAgIHB1YmxpYyBoZWlnaHQ6IG51bWJlciA9IDE1MDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3dpZHRoOiBudW1iZXIgPSAzMDAsIF9oZWlnaHQ6IG51bWJlciA9IDE1MCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldFNpemUoX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBmcmFtaW5nIHRvIHRoZSBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTaXplKF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy53aWR0aCA9IF93aWR0aDtcclxuICAgICAgdGhpcy5oZWlnaHQgPSBfaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQb2ludChfcG9pbnRJbkZyYW1lOiBWZWN0b3IyLCBfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIHRoaXMud2lkdGggKiAoX3BvaW50SW5GcmFtZS54IC0gX3JlY3RGcmFtZS54KSAvIF9yZWN0RnJhbWUud2lkdGgsXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgKiAoX3BvaW50SW5GcmFtZS55IC0gX3JlY3RGcmFtZS55KSAvIF9yZWN0RnJhbWUuaGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFBvaW50SW52ZXJzZShfcG9pbnQ6IFZlY3RvcjIsIF9yZWN0OiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIF9wb2ludC54ICogX3JlY3Qud2lkdGggLyB0aGlzLndpZHRoICsgX3JlY3QueCxcclxuICAgICAgICBfcG9pbnQueSAqIF9yZWN0LmhlaWdodCAvIHRoaXMuaGVpZ2h0ICsgX3JlY3QueVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSZWN0KF9yZWN0RnJhbWU6IFJlY3RhbmdsZSk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogV2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBhcmUgZnJhY3Rpb25zIG9mIHRob3NlIG9mIHRoZSBmcmFtZSwgc2NhbGVkIGJ5IG5vcm1lZCB2YWx1ZXMgbm9ybVdpZHRoIGFuZCBub3JtSGVpZ2h0LlxyXG4gICAqIERpc3BsYXkgc2hvdWxkIHNjYWxlIHRvIGZpdCB0aGUgZnJhbWUgYW5kIHBvaW50cyBhcmUgc2NhbGVkIGluIHRoZSBzYW1lIHJhdGlvXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEZyYW1pbmdTY2FsZWQgZXh0ZW5kcyBGcmFtaW5nIHtcclxuICAgIHB1YmxpYyBub3JtV2lkdGg6IG51bWJlciA9IDEuMDtcclxuICAgIHB1YmxpYyBub3JtSGVpZ2h0OiBudW1iZXIgPSAxLjA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgZnJhbWluZyB0byB0aGUgZ2l2ZW4gbm9ybWVkIHdpZHRoIGFuZCBoZWlnaHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFNjYWxlKF9ub3JtV2lkdGg6IG51bWJlciwgX25vcm1IZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLm5vcm1XaWR0aCA9IF9ub3JtV2lkdGg7XHJcbiAgICAgIHRoaXMubm9ybUhlaWdodCA9IF9ub3JtSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQb2ludChfcG9pbnRJbkZyYW1lOiBWZWN0b3IyLCBfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIHRoaXMubm9ybVdpZHRoICogKF9wb2ludEluRnJhbWUueCAtIF9yZWN0RnJhbWUueCksXHJcbiAgICAgICAgdGhpcy5ub3JtSGVpZ2h0ICogKF9wb2ludEluRnJhbWUueSAtIF9yZWN0RnJhbWUueSlcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UG9pbnRJbnZlcnNlKF9wb2ludDogVmVjdG9yMiwgX3JlY3Q6IFJlY3RhbmdsZSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgX3BvaW50LnggLyB0aGlzLm5vcm1XaWR0aCArIF9yZWN0LngsXHJcbiAgICAgICAgX3BvaW50LnkgLyB0aGlzLm5vcm1IZWlnaHQgKyBfcmVjdC55XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJlY3QoX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogUmVjdGFuZ2xlIHtcclxuICAgICAgcmV0dXJuIFJlY3RhbmdsZS5HRVQoMCwgMCwgdGhpcy5ub3JtV2lkdGggKiBfcmVjdEZyYW1lLndpZHRoLCB0aGlzLm5vcm1IZWlnaHQgKiBfcmVjdEZyYW1lLmhlaWdodCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBmaXRzIGludG8gYSBtYXJnaW4gZ2l2ZW4gYXMgZnJhY3Rpb25zIG9mIHRoZSBzaXplIG9mIHRoZSBmcmFtZSBnaXZlbiBieSBub3JtQW5jaG9yXHJcbiAgICogcGx1cyBhbiBhYnNvbHV0ZSBwYWRkaW5nIGdpdmVuIGJ5IHBpeGVsQm9yZGVyLiBEaXNwbGF5IHNob3VsZCBmaXQgaW50byB0aGlzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBGcmFtaW5nQ29tcGxleCBleHRlbmRzIEZyYW1pbmcge1xyXG4gICAgcHVibGljIG1hcmdpbjogQm9yZGVyID0geyBsZWZ0OiAwLCB0b3A6IDAsIHJpZ2h0OiAwLCBib3R0b206IDAgfTtcclxuICAgIHB1YmxpYyBwYWRkaW5nOiBCb3JkZXIgPSB7IGxlZnQ6IDAsIHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCB9O1xyXG5cclxuICAgIHB1YmxpYyBnZXRQb2ludChfcG9pbnRJbkZyYW1lOiBWZWN0b3IyLCBfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIF9wb2ludEluRnJhbWUueCAtIHRoaXMucGFkZGluZy5sZWZ0IC0gdGhpcy5tYXJnaW4ubGVmdCAqIF9yZWN0RnJhbWUud2lkdGgsXHJcbiAgICAgICAgX3BvaW50SW5GcmFtZS55IC0gdGhpcy5wYWRkaW5nLnRvcCAtIHRoaXMubWFyZ2luLnRvcCAqIF9yZWN0RnJhbWUuaGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0UG9pbnRJbnZlcnNlKF9wb2ludDogVmVjdG9yMiwgX3JlY3Q6IFJlY3RhbmdsZSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgX3BvaW50LnggKyB0aGlzLnBhZGRpbmcubGVmdCArIHRoaXMubWFyZ2luLmxlZnQgKiBfcmVjdC53aWR0aCxcclxuICAgICAgICBfcG9pbnQueSArIHRoaXMucGFkZGluZy50b3AgKyB0aGlzLm1hcmdpbi50b3AgKiBfcmVjdC5oZWlnaHRcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmVjdChfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBSZWN0YW5nbGUge1xyXG4gICAgICBpZiAoIV9yZWN0RnJhbWUpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBsZXQgbWluWDogbnVtYmVyID0gX3JlY3RGcmFtZS54ICsgdGhpcy5tYXJnaW4ubGVmdCAqIF9yZWN0RnJhbWUud2lkdGggKyB0aGlzLnBhZGRpbmcubGVmdDtcclxuICAgICAgbGV0IG1pblk6IG51bWJlciA9IF9yZWN0RnJhbWUueSArIHRoaXMubWFyZ2luLnRvcCAqIF9yZWN0RnJhbWUuaGVpZ2h0ICsgdGhpcy5wYWRkaW5nLnRvcDtcclxuICAgICAgbGV0IG1heFg6IG51bWJlciA9IF9yZWN0RnJhbWUueCArICgxIC0gdGhpcy5tYXJnaW4ucmlnaHQpICogX3JlY3RGcmFtZS53aWR0aCAtIHRoaXMucGFkZGluZy5yaWdodDtcclxuICAgICAgbGV0IG1heFk6IG51bWJlciA9IF9yZWN0RnJhbWUueSArICgxIC0gdGhpcy5tYXJnaW4uYm90dG9tKSAqIF9yZWN0RnJhbWUuaGVpZ2h0IC0gdGhpcy5wYWRkaW5nLmJvdHRvbTtcclxuXHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKG1pblgsIG1pblksIG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIHJldHVybiB7IG1hcmdpbjogdGhpcy5tYXJnaW4sIHBhZGRpbmc6IHRoaXMucGFkZGluZyB9O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yMiBhcyBwb2xhciBjb29yZGluYXRlcyBcclxuICAgKiBgYGB0ZXh0XHJcbiAgICogIOKGlS0gYW5nbGUgKEFuZ2xlIHRvIHRoZSB4LWF4aXMpXHJcbiAgICogIC3ihpIgTWFnbml0dWRlIChEaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIpICBcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgR2VvMiBpbXBsZW1lbnRzIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgbWFnbml0dWRlOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGFuZ2xlOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYW5nbGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpIHtcclxuICAgICAgdGhpcy5zZXQoX2FuZ2xlLCBfbWFnbml0dWRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGlzIGluc3RhbmNlIGF0IG9uY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldChfYW5nbGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpOiB2b2lkIHtcclxuICAgICAgdGhpcy5tYWduaXR1ZGUgPSBfbWFnbml0dWRlO1xyXG4gICAgICB0aGlzLmFuZ2xlID0gX2FuZ2xlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHByZXR0eSBzdHJpbmcgcmVwcmVzZW50YXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgYW5nbGU6ICR7dGhpcy5hbmdsZS50b1ByZWNpc2lvbig1KX0sICBtYWduaXR1ZGU6ICR7dGhpcy5tYWduaXR1ZGUudG9QcmVjaXNpb24oNSl9YDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvcjMgYXMgZ2VvZ3JhcGhpYyBjb29yZGluYXRlcyBhcyBzZWVuIG9uIGEgZ2xvYmVcclxuICAgKiBgYGB0ZXh0XHJcbiAgICog4oaQfOKGkiBMb25naXR1ZGUgKEFuZ2xlIHRvIHRoZSB6LWF4aXMpIFxyXG4gICAqICDihpUtIExhdGl0dWRlIChBbmdsZSB0byB0aGUgZXF1YXRvcilcclxuICAgKiAgLeKGkiBNYWduaXR1ZGUgKERpc3RhbmNlIGZyb20gdGhlIGNlbnRlcikgIFxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBHZW8zIGltcGxlbWVudHMgUmVjeWNhYmxlIHtcclxuICAgIHB1YmxpYyBtYWduaXR1ZGU6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbGF0aXR1ZGU6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbG9uZ2l0dWRlOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbG9uZ2l0dWRlOiBudW1iZXIgPSAwLCBfbGF0aXR1ZGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpIHtcclxuICAgICAgdGhpcy5zZXQoX2xvbmdpdHVkZSwgX2xhdGl0dWRlLCBfbWFnbml0dWRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGlzIGluc3RhbmNlIGF0IG9uY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldChfbG9uZ2l0dWRlOiBudW1iZXIgPSAwLCBfbGF0aXR1ZGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpOiB2b2lkIHtcclxuICAgICAgdGhpcy5tYWduaXR1ZGUgPSBfbWFnbml0dWRlO1xyXG4gICAgICB0aGlzLmxhdGl0dWRlID0gX2xhdGl0dWRlO1xyXG4gICAgICB0aGlzLmxvbmdpdHVkZSA9IF9sb25naXR1ZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcHJldHR5IHN0cmluZyByZXByZXNlbnRhdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGBsb25naXR1ZGU6ICR7dGhpcy5sb25naXR1ZGUudG9QcmVjaXNpb24oNSl9LCBsYXRpdHVkZTogJHt0aGlzLmxhdGl0dWRlLnRvUHJlY2lzaW9uKDUpfSwgbWFnbml0dWRlOiAke3RoaXMubWFnbml0dWRlLnRvUHJlY2lzaW9uKDUpfWA7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLy8gRnJvbSBodHRwOi8vYmFhZ29lLmNvbS9lbi9SYW5kb21NdXNpbmdzL2phdmFzY3JpcHQvXHJcbiAgLy8gSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5jb20+LCAyMDEwXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIE1hc2goKTogRnVuY3Rpb24ge1xyXG4gICAgbGV0IG46IG51bWJlciA9IDB4ZWZjODI0OWQ7XHJcblxyXG4gICAgbGV0IG1hc2g6IEZ1bmN0aW9uID0gZnVuY3Rpb24gKF9kYXRhOiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICBfZGF0YSA9IF9kYXRhLnRvU3RyaW5nKCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG4gKz0gX2RhdGEuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBsZXQgaDogbnVtYmVyID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XHJcbiAgICAgICAgbiA9IGggPj4+IDA7XHJcbiAgICAgICAgaCAtPSBuO1xyXG4gICAgICAgIGggKj0gbjtcclxuICAgICAgICBuID0gaCA+Pj4gMDtcclxuICAgICAgICBoIC09IG47XHJcbiAgICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKG4gPj4+IDApICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcclxuICAgIH07XHJcblxyXG4gICAgLy8gbWFzaC52ZXJzaW9uID0gJ01hc2ggMC45JztcclxuICAgIHJldHVybiBtYXNoO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEZyb20gaHR0cDovL2JhYWdvZS5jb20vZW4vUmFuZG9tTXVzaW5ncy9qYXZhc2NyaXB0L1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBMRklCNCgpOiBGdW5jdGlvbiB7XHJcbiAgICAvLyBHZW9yZ2UgTWFyc2FnbGlhJ3MgTEZJQjQsXHJcbiAgICAvL2h0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9zY2kuY3J5cHQvbXNnL2ViNGRkZGU3ODJiMTcwNTFcclxuICAgIGxldCBhcmdzOiBudW1iZXJbXSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XHJcbiAgICBsZXQgazA6IG51bWJlciA9IDAsXHJcbiAgICAgIGsxOiBudW1iZXIgPSA1OCxcclxuICAgICAgazI6IG51bWJlciA9IDExOSxcclxuICAgICAgazM6IG51bWJlciA9IDE3ODtcclxuXHJcbiAgICBsZXQgczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICBsZXQgbWFzaDogRnVuY3Rpb24gPSBNYXNoKCk7XHJcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcclxuICAgICAgYXJncyA9IFsrbmV3IERhdGUoKV07XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgMjU2OyBqKyspIHtcclxuICAgICAgc1tqXSA9IG1hc2goXCIgXCIpO1xyXG4gICAgICBzW2pdIC09IG1hc2goXCIgXCIpICogNC43NjgzNzE1ODIwMzEyNWUtNzsgLy8gMl4tMjFcclxuICAgICAgaWYgKHNbal0gPCAwKSB7XHJcbiAgICAgICAgc1tqXSArPSAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgMjU2OyBqKyspIHtcclxuICAgICAgICBzW2pdIC09IG1hc2goYXJnc1tpXSk7XHJcbiAgICAgICAgc1tqXSAtPSBtYXNoKGFyZ3NbaV0pICogNC43NjgzNzE1ODIwMzEyNWUtNzsgLy8gMl4tMjFcclxuICAgICAgICBpZiAoc1tqXSA8IDApIHtcclxuICAgICAgICAgIHNbal0gKz0gMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIG1hc2ggPSBudWxsO1xyXG5cclxuICAgIGxldCByYW5kb206IEZ1bmN0aW9uID0gZnVuY3Rpb24gKCk6IG51bWJlciB7XHJcbiAgICAgIGxldCB4OiBudW1iZXI7XHJcblxyXG4gICAgICBrMCA9IChrMCArIDEpICYgMjU1O1xyXG4gICAgICBrMSA9IChrMSArIDEpICYgMjU1O1xyXG4gICAgICBrMiA9IChrMiArIDEpICYgMjU1O1xyXG4gICAgICBrMyA9IChrMyArIDEpICYgMjU1O1xyXG5cclxuICAgICAgeCA9IHNbazBdIC0gc1trMV07XHJcbiAgICAgIGlmICh4IDwgMCkge1xyXG4gICAgICAgIHggKz0gMTtcclxuICAgICAgfVxyXG4gICAgICB4IC09IHNbazJdO1xyXG4gICAgICBpZiAoeCA8IDApIHtcclxuICAgICAgICB4ICs9IDE7XHJcbiAgICAgIH1cclxuICAgICAgeCAtPSBzW2szXTtcclxuICAgICAgaWYgKHggPCAwKSB7XHJcbiAgICAgICAgeCArPSAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gc1trMF0gPSB4O1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyByYW5kb20udWludDMyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gICByZXR1cm4gcmFuZG9tKCkgKiAweDEwMDAwMDAwMCA+Pj4gMDsgLy8gMl4zMlxyXG4gICAgLy8gfTtcclxuICAgIC8vIHJhbmRvbS5mcmFjdDUzID0gcmFuZG9tO1xyXG4gICAgLy8gcmFuZG9tLnZlcnNpb24gPSBcIkxGSUI0IDAuOVwiO1xyXG4gICAgLy8gcmFuZG9tLmFyZ3MgPSBhcmdzO1xyXG5cclxuICAgIHJldHVybiByYW5kb207XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgdGhlIG1hdHJpeCBhcyB0cmFuc2xhdGlvbiwgcm90YXRpb24gYW5kIHNjYWxpbmcge0BsaW5rIFZlY3RvcjJ9LCBiZWluZyBjYWxjdWxhdGVkIGZyb20gdGhlIG1hdHJpeFxyXG4gICAqL1xyXG4gIGludGVyZmFjZSBWZWN0b3JSZXByZXNlbnRhdGlvbiB7XHJcbiAgICB0cmFuc2xhdGlvbjogVmVjdG9yMjtcclxuICAgIHJvdGF0aW9uOiBudW1iZXI7XHJcbiAgICBzY2FsaW5nOiBWZWN0b3IyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2ltcGxlIGNsYXNzIGZvciAzeDMgbWF0cml4IG9wZXJhdGlvbnNcclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIwXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1hdHJpeDN4MyBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwcml2YXRlIGRhdGE6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7IC8vIFRoZSBkYXRhIG9mIHRoZSBtYXRyaXguXHJcbiAgICBwcml2YXRlIG11dGF0b3I6IE11dGF0b3IgPSBudWxsOyAvLyBwcmVwYXJlZCBmb3Igb3B0aW1pemF0aW9uLCBrZWVwIG11dGF0b3IgdG8gcmVkdWNlIHJlZHVuZGFudCBjYWxjdWxhdGlvbiBhbmQgZm9yIGNvbXBhcmlzb24uIFNldCB0byBudWxsIHdoZW4gZGF0YSBjaGFuZ2VzIVxyXG4gICAgcHJpdmF0ZSB2ZWN0b3JzOiBWZWN0b3JSZXByZXNlbnRhdGlvbjsgLy8gdmVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWF0cml4XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnJlY3ljbGUoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9UT0RPOiBmaWd1cmUgb3V0IHdoYXQgdGhpcyBpcyB1c2VkIGZvclxyXG4gICAgLyoqIFRPRE86IGRlc2NyaWJlISAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9KRUNUSU9OKF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBuZXcgTWF0cml4M3gzO1xyXG4gICAgICBtdHhSZXN1bHQuZGF0YS5zZXQoW1xyXG4gICAgICAgIDIgLyBfd2lkdGgsIDAsIDAsXHJcbiAgICAgICAgMCwgLTIgLyBfaGVpZ2h0LCAwLFxyXG4gICAgICAgIC0xLCAxLCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgYSBuZXcgaWRlbnRpdHkgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIElERU5USVRZKCk6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4M3gzID0gUmVjeWNsZXIuZ2V0KE1hdHJpeDN4Myk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgdHJhbnNsYXRlcyBjb29yZGluYXRlcyBhbG9uZyB0aGUgeC0gYW5kIHktYXhpcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBWZWN0b3IyfS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU0xBVElPTihfdHJhbnNsYXRlOiBWZWN0b3IyKTogTWF0cml4M3gzIHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXgzeDMpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICAxLCAwLCAwLFxyXG4gICAgICAgIDAsIDEsIDAsXHJcbiAgICAgICAgX3RyYW5zbGF0ZS54LCBfdHJhbnNsYXRlLnksIDFcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgcm90YXRlcyBjb29yZGluYXRlcyBvbiB0aGUgei1heGlzIHdoZW4gbXVsdGlwbGllZCBieS5cclxuICAgICAqIEBwYXJhbSBfYW5nbGVJbkRlZ3JlZXMgVGhlIHZhbHVlIG9mIHRoZSByb3RhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBST1RBVElPTihfYW5nbGVJbkRlZ3JlZXM6IG51bWJlcik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4M3gzID0gUmVjeWNsZXIucmV1c2UoTWF0cml4M3gzKTtcclxuICAgICAgbGV0IGFuZ2xlSW5SYWRpYW5zOiBudW1iZXIgPSBfYW5nbGVJbkRlZ3JlZXMgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIGxldCBzaW46IG51bWJlciA9IE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbGV0IGNvczogbnVtYmVyID0gTWF0aC5jb3MoYW5nbGVJblJhZGlhbnMpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBjb3MsIHNpbiwgMCxcclxuICAgICAgICAtc2luLCBjb3MsIDAsXHJcbiAgICAgICAgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCBzY2FsZXMgY29vcmRpbmF0ZXMgYWxvbmcgdGhlIHgtIGFuZCB5LWF4aXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGxpbmsgVmVjdG9yMn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTQ0FMSU5HKF9zY2FsYXI6IFZlY3RvcjIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDN4Myk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIF9zY2FsYXIueCwgMCwgMCxcclxuICAgICAgICAwLCBfc2NhbGFyLnksIDAsXHJcbiAgICAgICAgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdHdvIHBhc3NlZCBtYXRyaWNlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9EVUNUKF9tdHhMZWZ0OiBNYXRyaXgzeDMsIF9tdHhSaWdodDogTWF0cml4M3gzKTogTWF0cml4M3gzIHtcclxuICAgICAgbGV0IGEwMDogbnVtYmVyID0gX210eExlZnQuZGF0YVswICogMyArIDBdO1xyXG4gICAgICBsZXQgYTAxOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzAgKiAzICsgMV07XHJcbiAgICAgIGxldCBhMDI6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMCAqIDMgKyAyXTtcclxuICAgICAgbGV0IGExMDogbnVtYmVyID0gX210eExlZnQuZGF0YVsxICogMyArIDBdO1xyXG4gICAgICBsZXQgYTExOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzEgKiAzICsgMV07XHJcbiAgICAgIGxldCBhMTI6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMSAqIDMgKyAyXTtcclxuICAgICAgbGV0IGEyMDogbnVtYmVyID0gX210eExlZnQuZGF0YVsyICogMyArIDBdO1xyXG4gICAgICBsZXQgYTIxOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzIgKiAzICsgMV07XHJcbiAgICAgIGxldCBhMjI6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMiAqIDMgKyAyXTtcclxuICAgICAgbGV0IGIwMDogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMCAqIDMgKyAwXTtcclxuICAgICAgbGV0IGIwMTogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMCAqIDMgKyAxXTtcclxuICAgICAgbGV0IGIwMjogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMCAqIDMgKyAyXTtcclxuICAgICAgbGV0IGIxMDogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMSAqIDMgKyAwXTtcclxuICAgICAgbGV0IGIxMTogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMSAqIDMgKyAxXTtcclxuICAgICAgbGV0IGIxMjogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMSAqIDMgKyAyXTtcclxuICAgICAgbGV0IGIyMDogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMiAqIDMgKyAwXTtcclxuICAgICAgbGV0IGIyMTogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMiAqIDMgKyAxXTtcclxuICAgICAgbGV0IGIyMjogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMiAqIDMgKyAyXTtcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4M3gzID0gUmVjeWNsZXIucmV1c2UoTWF0cml4M3gzKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwLFxyXG4gICAgICAgIGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMSxcclxuICAgICAgICBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjIsXHJcbiAgICAgICAgYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwLFxyXG4gICAgICAgIGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMSxcclxuICAgICAgICBiMTAgKiBhMDIgKyBiMTEgKiBhMTIgKyBiMTIgKiBhMjIsXHJcbiAgICAgICAgYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwLFxyXG4gICAgICAgIGIyMCAqIGEwMSArIGIyMSAqIGExMSArIGIyMiAqIGEyMSxcclxuICAgICAgICBiMjAgKiBhMDIgKyBiMjEgKiBhMTIgKyBiMjIgKiBhMjJcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgaW52ZXJzZSBvZiBhIHBhc3NlZCBtYXRyaXguXHJcbiAgICAgKiBAcGFyYW0gX210eCBUaGUgbWF0cml4IHRvIGNvbXB1dGUgdGhlIGludmVyc2Ugb2YuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSU5WRVJTRShfbXR4OiBNYXRyaXgzeDMpOiBNYXRyaXgzeDMge1xyXG4gICAgICBsZXQgbTogRmxvYXQzMkFycmF5ID0gX210eC5kYXRhO1xyXG4gICAgICBsZXQgbTAwOiBudW1iZXIgPSBtWzAgKiAzICsgMF07XHJcbiAgICAgIGxldCBtMDE6IG51bWJlciA9IG1bMCAqIDMgKyAxXTtcclxuICAgICAgbGV0IG0wMjogbnVtYmVyID0gbVswICogMyArIDJdO1xyXG4gICAgICBsZXQgbTEwOiBudW1iZXIgPSBtWzEgKiAzICsgMF07XHJcbiAgICAgIGxldCBtMTE6IG51bWJlciA9IG1bMSAqIDMgKyAxXTtcclxuICAgICAgbGV0IG0xMjogbnVtYmVyID0gbVsxICogMyArIDJdO1xyXG4gICAgICBsZXQgbTIwOiBudW1iZXIgPSBtWzIgKiAzICsgMF07XHJcbiAgICAgIGxldCBtMjE6IG51bWJlciA9IG1bMiAqIDMgKyAxXTtcclxuICAgICAgbGV0IG0yMjogbnVtYmVyID0gbVsyICogMyArIDJdO1xyXG5cclxuICAgICAgbGV0IGQ6IG51bWJlciA9IDEgL1xyXG4gICAgICAgIChtMDAgKiAobTExICogbTIyIC0gbTIxICogbTEyKSAtXHJcbiAgICAgICAgICBtMDEgKiAobTEwICogbTIyIC0gbTEyICogbTIwKSArXHJcbiAgICAgICAgICBtMDIgKiAobTEwICogbTIxIC0gbTExICogbTIwKSk7XHJcblxyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDN4Myk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIGQgKiAobTExICogbTIyIC0gbTIxICogbTEyKSwgLy8gWzBdXHJcbiAgICAgICAgZCAqIChtMDIgKiBtMjEgLSBtMDEgKiBtMjIpLCAvLyBbMV1cclxuICAgICAgICBkICogKG0wMSAqIG0xMiAtIG0wMiAqIG0xMSksIC8vIFsyXVxyXG4gICAgICAgIGQgKiAobTEyICogbTIwIC0gbTEwICogbTIyKSwgLy8gWzNdXHJcbiAgICAgICAgZCAqIChtMDAgKiBtMjIgLSBtMDIgKiBtMjApLCAvLyBbNF1cclxuICAgICAgICBkICogKG0xMCAqIG0wMiAtIG0wMCAqIG0xMiksIC8vIFs1XVxyXG4gICAgICAgIGQgKiAobTEwICogbTIxIC0gbTIwICogbTExKSwgLy8gWzZdXHJcbiAgICAgICAgZCAqIChtMjAgKiBtMDEgLSBtMDAgKiBtMjEpLCAvLyBbN11cclxuICAgICAgICBkICogKG0wMCAqIG0xMSAtIG0xMCAqIG0wMSkgLy8gWzhdXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gYSB2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zbGF0aW9uIHtAbGluayBWZWN0b3IyfS4gIFxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSwgc2luY2UgdGhlIHZlY3RvciBpcyBnb2luZyB0byBiZSByZXVzZWQgYnkgUmVjeWNsZXIuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeCBpZ25vcmluZyBpdHMgcm90YXRpb24gYW5kIHNjYWxpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0cmFuc2xhdGlvbigpOiBWZWN0b3IyIHtcclxuICAgICAgaWYgKCF0aGlzLnZlY3RvcnMudHJhbnNsYXRpb24pXHJcbiAgICAgICAgdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uID0gbmV3IFZlY3RvcjIodGhpcy5kYXRhWzZdLCB0aGlzLmRhdGFbN10pO1xyXG4gICAgICByZXR1cm4gdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uOyAvLyAuY2xvbmU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRyYW5zbGF0aW9uKF90cmFuc2xhdGlvbjogVmVjdG9yMikge1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KF90cmFuc2xhdGlvbi5nZXQoKSwgNik7XHJcbiAgICAgIC8vIG5vIGZ1bGwgY2FjaGUgcmVzZXQgcmVxdWlyZWRcclxuICAgICAgdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uID0gX3RyYW5zbGF0aW9uO1xyXG4gICAgICB0aGlzLm11dGF0b3IgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiBhIGNvcHkgb2YgdGhlIGNhbGN1bGF0ZWQgcm90YXRpb24ge0BsaW5rIFZlY3RvcjJ9ICAgXHJcbiAgICAgKiAtIHNldDogZWZmZWN0IHRoZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByb3RhdGlvbigpOiBudW1iZXIge1xyXG4gICAgICBpZiAoIXRoaXMudmVjdG9ycy5yb3RhdGlvbilcclxuICAgICAgICB0aGlzLnZlY3RvcnMucm90YXRpb24gPSB0aGlzLmdldEV1bGVyQW5nbGUoKTtcclxuICAgICAgcmV0dXJuIHRoaXMudmVjdG9ycy5yb3RhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcm90YXRpb24oX3JvdGF0aW9uOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5tdXRhdGUoeyBcInJvdGF0aW9uXCI6IF9yb3RhdGlvbiB9KTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogLSBnZXQ6IHJldHVybiBhIHZlY3RvciByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NhbGUge0BsaW5rIFZlY3RvcjN9LiAgXHJcbiAgICAgKiAqKkNhdXRpb24hKiogRG8gbm90IG1hbmlwdWxhdGUgcmVzdWx0LCBpbnN0ZWFkIGNyZWF0ZSBhIGNsb25lISAgICBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNjYWxpbmcoKTogVmVjdG9yMiB7XHJcbiAgICAgIGlmICghdGhpcy52ZWN0b3JzLnNjYWxpbmcpXHJcbiAgICAgICAgdGhpcy52ZWN0b3JzLnNjYWxpbmcgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICAgIE1hdGguaHlwb3QodGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0pICogKHRoaXMuZGF0YVswXSA8IDAgPyAtMSA6IDEpLFxyXG4gICAgICAgICAgTWF0aC5oeXBvdCh0aGlzLmRhdGFbM10sIHRoaXMuZGF0YVs0XSkgKiAodGhpcy5kYXRhWzRdIDwgMCA/IC0xIDogMSlcclxuICAgICAgICApO1xyXG4gICAgICByZXR1cm4gdGhpcy52ZWN0b3JzLnNjYWxpbmc7IC8vIC5jbG9uZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2NhbGluZyhfc2NhbGluZzogVmVjdG9yMikge1xyXG4gICAgICB0aGlzLm11dGF0ZSh7IFwic2NhbGluZ1wiOiBfc2NhbGluZyB9KTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogTWF0cml4M3gzIHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKE1hdHJpeDN4MykuY29weSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgbWF0cml4IHRvIHRoZSBpZGVudGl0eS1tYXRyaXggYW5kIGNsZWFycyBjYWNoZS4gVXNlZCBieSB0aGUgcmVjeWNsZXIgdG8gcmVzZXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldChbXHJcbiAgICAgICAgMSwgMCwgMCxcclxuICAgICAgICAwLCAxLCAwLFxyXG4gICAgICAgIDAsIDAsIDFcclxuICAgICAgXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhlIG1hdHJpeCB0byB0aGUgaWRlbnRpdHktbWF0cml4IGFuZCBjbGVhcnMgY2FjaGUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5yZWN5Y2xlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zbGF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSB0cmFuc2xhdGlvbiBieSB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjJ9IHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlKF9ieTogVmVjdG9yMik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4M3gzID0gTWF0cml4M3gzLlBST0RVQ1QodGhpcywgTWF0cml4M3gzLlRSQU5TTEFUSU9OKF9ieSkpO1xyXG4gICAgICAvLyBUT0RPOiBwb3NzaWJsZSBvcHRpbWl6YXRpb24sIHRyYW5zbGF0aW9uIG1heSBhbHRlciBtdXRhdG9yIGluc3RlYWQgb2YgZGVsZXRpbmcgaXQuXHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYWxvbmcgdGhlIHgtYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZVgoX3g6IG51bWJlcik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIHRoaXMuZGF0YVs2XSArPSBfeDtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgICAgdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYWxvbmcgdGhlIHktYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZVkoX3k6IG51bWJlcik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIHRoaXMuZGF0YVs3XSArPSBfeTtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgICAgdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUm90YXRpb25cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHJvdGF0aW9uIGFyb3VuZCB0aGUgei1BeGlzIHRvIHRoaXMgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3RhdGUoX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IE1hdHJpeDN4My5QUk9EVUNUKHRoaXMsIE1hdHJpeDN4My5ST1RBVElPTihfYW5nbGVJbkRlZ3JlZXMpKTtcclxuICAgICAgdGhpcy5zZXQobXR4UmVzdWx0LmRhdGEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSZXN1bHQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTY2FsaW5nXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBzY2FsaW5nIGJ5IHRoZSBnaXZlbiB7QGxpbmsgVmVjdG9yMn0gdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZShfYnk6IFZlY3RvcjIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IE1hdHJpeDN4My5QUk9EVUNUKHRoaXMsIE1hdHJpeDN4My5TQ0FMSU5HKF9ieSkpO1xyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHgtQXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWChfYnk6IG51bWJlcik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjIgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoX2J5LCAxKTtcclxuICAgICAgdGhpcy5zY2FsZSh2ZWN0b3IpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh2ZWN0b3IpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBzY2FsaW5nIGFsb25nIHRoZSB5LUF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZVkoX2J5OiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDEsIF9ieSk7XHJcbiAgICAgIHRoaXMuc2NhbGUodmVjdG9yKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodmVjdG9yKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmb3JtYXRpb25cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhpcyBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShfbXR4UmlnaHQ6IE1hdHJpeDN4Myk6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IE1hdHJpeDN4My5QUk9EVUNUKHRoaXMsIF9tdHhSaWdodCk7XHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgZXVsZXItYW5nbGVzIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCByb3RhdGlvbiBvZiB0aGlzIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RXVsZXJBbmdsZSgpOiBudW1iZXIge1xyXG4gICAgICBsZXQgc2NhbGluZzogVmVjdG9yMiA9IHRoaXMuc2NhbGluZztcclxuXHJcbiAgICAgIGxldCBzMDogbnVtYmVyID0gdGhpcy5kYXRhWzBdIC8gc2NhbGluZy54O1xyXG4gICAgICBsZXQgczE6IG51bWJlciA9IHRoaXMuZGF0YVsxXSAvIHNjYWxpbmcueDtcclxuICAgICAgbGV0IHMzOiBudW1iZXIgPSB0aGlzLmRhdGFbM10gLyBzY2FsaW5nLnk7XHJcbiAgICAgIGxldCBzNDogbnVtYmVyID0gdGhpcy5kYXRhWzRdIC8gc2NhbGluZy55O1xyXG5cclxuICAgICAgbGV0IHhTa2V3OiBudW1iZXIgPSBNYXRoLmF0YW4yKC1zMywgczQpO1xyXG4gICAgICBsZXQgeVNrZXc6IG51bWJlciA9IE1hdGguYXRhbjIoczAsIHMxKTtcclxuXHJcbiAgICAgIGxldCBzeTogbnVtYmVyID0gTWF0aC5oeXBvdChzMCwgczEpOyAvLyBwcm9iYWJseSAyLiBwYXJhbSBzaG91bGQgYmUgdGhpcy5kYXRhWzRdIC8gc2NhbGluZy55XHJcbiAgICAgIGxldCByb3RhdGlvbjogbnVtYmVyO1xyXG5cclxuICAgICAgaWYgKCEoc3kgPiAxZS02KSlcclxuICAgICAgICByb3RhdGlvbiA9IHlTa2V3O1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcm90YXRpb24gPSB4U2tldztcclxuXHJcbiAgICAgIHJvdGF0aW9uICo9IENhbGMucmFkMmRlZztcclxuXHJcbiAgICAgIHJldHVybiByb3RhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4IHRvIHRoZSBnaXZlbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldChfYXJyYXk6IEFycmF5TGlrZTxudW1iZXI+KTogTWF0cml4M3gzIHtcclxuICAgICAgdGhpcy5kYXRhLnNldChfYXJyYXkpO1xyXG4gICAgICB0aGlzLnJlc2V0Q2FjaGUoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3BpZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBtYXRyaXggaW50byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBNYXRyaXgzeDMpOiBNYXRyaXgzeDMge1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KF9vcmlnaW5hbC5kYXRhKTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7IC8vIFRPRE86IGZvciBub3cgcmVzZXQgdGhlIGNhY2hlLCBhcyBpIGhhdmUgbm8gaWRlYSBob3cgdGhlIGNhY2hpbmcgd29ya3MgZm9yIG1hdHJpeDN4My5cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGDGki5NYXRyaXgzeDModHJhbnNsYXRpb246ICR7dGhpcy50cmFuc2xhdGlvbi50b1N0cmluZygpfSwgcm90YXRpb246ICR7dGhpcy5yb3RhdGlvbi50b1N0cmluZygpfSwgc2NhbGluZzogJHt0aGlzLnNjYWxpbmcudG9TdHJpbmcoKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgb2YgdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICAvLyB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IHRoaXMudHJhbnNsYXRpb24uc2VyaWFsaXplKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sXHJcbiAgICAgICAgc2NhbGluZzogdGhpcy5zY2FsaW5nLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IGF3YWl0IHRoaXMudHJhbnNsYXRpb24uZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24udHJhbnNsYXRpb24pLFxyXG4gICAgICAgIHJvdGF0aW9uOiBfc2VyaWFsaXphdGlvbi5yb3RhdGlvbixcclxuICAgICAgICBzY2FsaW5nOiBhd2FpdCB0aGlzLnNjYWxpbmcuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uc2NhbGluZylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5tdXRhdGUobXV0YXRvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBpZiAodGhpcy5tdXRhdG9yKVxyXG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0b3I7XHJcblxyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICB0cmFuc2xhdGlvbjogdGhpcy50cmFuc2xhdGlvbi5nZXRNdXRhdG9yKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sXHJcbiAgICAgICAgc2NhbGluZzogdGhpcy5zY2FsaW5nLmdldE11dGF0b3IoKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gY2FjaGUgbXV0YXRvclxyXG4gICAgICB0aGlzLm11dGF0b3IgPSBtdXRhdG9yO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBvbGRUcmFuc2xhdGlvbjogVmVjdG9yMiA9IHRoaXMudHJhbnNsYXRpb247XHJcbiAgICAgIGxldCBvbGRSb3RhdGlvbjogbnVtYmVyID0gdGhpcy5yb3RhdGlvbjtcclxuICAgICAgbGV0IG9sZFNjYWxpbmc6IFZlY3RvcjIgPSB0aGlzLnNjYWxpbmc7XHJcbiAgICAgIGxldCBuZXdUcmFuc2xhdGlvbjogVmVjdG9yMiA9IDxWZWN0b3IyPl9tdXRhdG9yW1widHJhbnNsYXRpb25cIl07XHJcbiAgICAgIGxldCBuZXdSb3RhdGlvbjogbnVtYmVyID0gPG51bWJlcj5fbXV0YXRvcltcInJvdGF0aW9uXCJdO1xyXG4gICAgICBsZXQgbmV3U2NhbGluZzogVmVjdG9yMiA9IDxWZWN0b3IyPl9tdXRhdG9yW1wic2NhbGluZ1wiXTtcclxuICAgICAgbGV0IHZlY3RvcnM6IFZlY3RvclJlcHJlc2VudGF0aW9uID0geyB0cmFuc2xhdGlvbjogb2xkVHJhbnNsYXRpb24sIHJvdGF0aW9uOiBvbGRSb3RhdGlvbiwgc2NhbGluZzogb2xkU2NhbGluZyB9O1xyXG4gICAgICBpZiAobmV3VHJhbnNsYXRpb24pIHtcclxuICAgICAgICB2ZWN0b3JzLnRyYW5zbGF0aW9uID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICBuZXdUcmFuc2xhdGlvbi54ICE9IHVuZGVmaW5lZCA/IG5ld1RyYW5zbGF0aW9uLnggOiBvbGRUcmFuc2xhdGlvbi54LFxyXG4gICAgICAgICAgbmV3VHJhbnNsYXRpb24ueSAhPSB1bmRlZmluZWQgPyBuZXdUcmFuc2xhdGlvbi55IDogb2xkVHJhbnNsYXRpb24ueVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZlY3RvcnMucm90YXRpb24gPSAobmV3Um90YXRpb24gPT0gdW5kZWZpbmVkKSA/IG9sZFJvdGF0aW9uIDogbmV3Um90YXRpb247XHJcblxyXG4gICAgICBpZiAobmV3U2NhbGluZykge1xyXG4gICAgICAgIHZlY3RvcnMuc2NhbGluZyA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgbmV3U2NhbGluZy54ICE9IHVuZGVmaW5lZCA/IG5ld1NjYWxpbmcueCA6IG9sZFNjYWxpbmcueCxcclxuICAgICAgICAgIG5ld1NjYWxpbmcueSAhPSB1bmRlZmluZWQgPyBuZXdTY2FsaW5nLnkgOiBvbGRTY2FsaW5nLnlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBUT0RPOiBwb3NzaWJsZSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gd2hlbiBvbmx5IG9uZSBvciB0d28gY29tcG9uZW50cyBjaGFuZ2UsIHRoZW4gdXNlIG9sZCBtYXRyaXggaW5zdGVhZCBvZiBJREVOVElUWSBhbmQgdHJhbnNmb3JtIGJ5IGRpZmZlcmVuY2VzL3F1b3RpZW50c1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBNYXRyaXgzeDMuSURFTlRJVFkoKTtcclxuICAgICAgaWYgKHZlY3RvcnMudHJhbnNsYXRpb24pXHJcbiAgICAgICAgbXR4UmVzdWx0LnRyYW5zbGF0ZSh2ZWN0b3JzLnRyYW5zbGF0aW9uKTtcclxuICAgICAgaWYgKHZlY3RvcnMucm90YXRpb24pIHtcclxuICAgICAgICBtdHhSZXN1bHQucm90YXRlKHZlY3RvcnMucm90YXRpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh2ZWN0b3JzLnNjYWxpbmcpXHJcbiAgICAgICAgbXR4UmVzdWx0LnNjYWxlKHZlY3RvcnMuc2NhbGluZyk7XHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuXHJcbiAgICAgIHRoaXMudmVjdG9ycyA9IHZlY3RvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGlmIChfbXV0YXRvci50cmFuc2xhdGlvbikgdHlwZXMudHJhbnNsYXRpb24gPSBcIlZlY3RvcjJcIjtcclxuICAgICAgaWYgKF9tdXRhdG9yLnJvdGF0aW9uICE9IHVuZGVmaW5lZCkgdHlwZXMucm90YXRpb24gPSBcIm51bWJlclwiO1xyXG4gICAgICBpZiAoX211dGF0b3Iuc2NhbGluZykgdHlwZXMuc2NhbGluZyA9IFwiVmVjdG9yMlwiO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldENhY2hlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnZlY3RvcnMgPSB7IHRyYW5zbGF0aW9uOiBudWxsLCByb3RhdGlvbjogbnVsbCwgc2NhbGluZzogbnVsbCB9O1xyXG4gICAgICB0aGlzLm11dGF0b3IgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyBhIDR4NCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYW5kIHByb3ZpZGVzIG9wZXJhdGlvbnMgZm9yIGl0LlxyXG4gICAqIGBgYHRleHRcclxuICAgKiBbIDAsIDEsIDIsIDMgXSDihpAgcm93IHZlY3RvciB4XHJcbiAgICogWyA0LCA1LCA2LCA3IF0g4oaQIHJvdyB2ZWN0b3IgeVxyXG4gICAqIFsgOCwgOSwxMCwxMSBdIOKGkCByb3cgdmVjdG9yIHpcclxuICAgKiBbMTIsMTMsMTQsMTUgXSDihpAgdHJhbnNsYXRpb25cclxuICAgKiAgICAgICAgICAgIOKGkSAgaG9tb2dlbmVvdXMgY29sdW1uXHJcbiAgICogYGBgXHJcbiAgICogQGF1dGhvcnMgSmFzY2hhIEthcmFnw7ZsLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOSB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNYXRyaXg0eDQgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgcHJpdmF0ZSBkYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTsgLy8gVGhlIGRhdGEgb2YgdGhlIG1hdHJpeC5cclxuICAgIHByaXZhdGUgbXV0YXRvcjogTXV0YXRvciA9IG51bGw7IC8vIHByZXBhcmVkIGZvciBvcHRpbWl6YXRpb24sIGtlZXAgbXV0YXRvciB0byByZWR1Y2UgcmVkdW5kYW50IGNhbGN1bGF0aW9uIGFuZCBmb3IgY29tcGFyaXNvbi4gU2V0IHRvIG51bGwgd2hlbiBkYXRhIGNoYW5nZXMhXHJcblxyXG4gICAgcmVhZG9ubHkgI3RyYW5zbGF0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICByZWFkb25seSAjc2NhbGluZzogVmVjdG9yMyA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgcmVhZG9ubHkgI3JvdGF0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5PTkUoKTtcclxuICAgIHJlYWRvbmx5ICNxdWF0ZXJuaW9uOiBRdWF0ZXJuaW9uID0gUXVhdGVybmlvbi5JREVOVElUWSgpO1xyXG5cclxuICAgICN0cmFuc2xhdGlvbkRpcnR5OiBib29sZWFuO1xyXG4gICAgI3NjYWxpbmdEaXJ0eTogYm9vbGVhbjtcclxuICAgICNyb3RhdGlvbkRpcnR5OiBib29sZWFuO1xyXG4gICAgI3F1YXRlcm5pb25EaXJ0eTogYm9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMucmVjeWNsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBTVEFUSUNTXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIGEgbmV3IGlkZW50aXR5IG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIElERU5USVRZKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIuZ2V0KE1hdHJpeDR4NCk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wb3NlcyBhIG5ldyBtYXRyaXggYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiwgcm90YXRpb24gYW5kIHNjYWxpbmcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgQ09NUE9TSVRJT04oX3RyYW5zbGF0aW9uPzogVmVjdG9yMywgX3JvdGF0aW9uPzogVmVjdG9yMyB8IFF1YXRlcm5pb24sIF9zY2FsaW5nPzogVmVjdG9yMyk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCByZXN1bHQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICByZXN1bHQubXV0YXRlKHsgXCJ0cmFuc2xhdGlvblwiOiBfdHJhbnNsYXRpb24sIFwicm90YXRpb25cIjogX3JvdGF0aW9uLCBcInNjYWxpbmdcIjogX3NjYWxpbmcgfSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0d28gcGFzc2VkIG1hdHJpY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0RVQ1QoX210eExlZnQ6IE1hdHJpeDR4NCwgX210eFJpZ2h0OiBNYXRyaXg0eDQpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgYTogRmxvYXQzMkFycmF5ID0gX210eExlZnQuZGF0YTtcclxuICAgICAgbGV0IGI6IEZsb2F0MzJBcnJheSA9IF9tdHhSaWdodC5kYXRhO1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIGxldCBhMDA6IG51bWJlciA9IGFbMCAqIDQgKyAwXTtcclxuICAgICAgbGV0IGEwMTogbnVtYmVyID0gYVswICogNCArIDFdO1xyXG4gICAgICBsZXQgYTAyOiBudW1iZXIgPSBhWzAgKiA0ICsgMl07XHJcbiAgICAgIGxldCBhMDM6IG51bWJlciA9IGFbMCAqIDQgKyAzXTtcclxuICAgICAgbGV0IGExMDogbnVtYmVyID0gYVsxICogNCArIDBdO1xyXG4gICAgICBsZXQgYTExOiBudW1iZXIgPSBhWzEgKiA0ICsgMV07XHJcbiAgICAgIGxldCBhMTI6IG51bWJlciA9IGFbMSAqIDQgKyAyXTtcclxuICAgICAgbGV0IGExMzogbnVtYmVyID0gYVsxICogNCArIDNdO1xyXG4gICAgICBsZXQgYTIwOiBudW1iZXIgPSBhWzIgKiA0ICsgMF07XHJcbiAgICAgIGxldCBhMjE6IG51bWJlciA9IGFbMiAqIDQgKyAxXTtcclxuICAgICAgbGV0IGEyMjogbnVtYmVyID0gYVsyICogNCArIDJdO1xyXG4gICAgICBsZXQgYTIzOiBudW1iZXIgPSBhWzIgKiA0ICsgM107XHJcbiAgICAgIGxldCBhMzA6IG51bWJlciA9IGFbMyAqIDQgKyAwXTtcclxuICAgICAgbGV0IGEzMTogbnVtYmVyID0gYVszICogNCArIDFdO1xyXG4gICAgICBsZXQgYTMyOiBudW1iZXIgPSBhWzMgKiA0ICsgMl07XHJcbiAgICAgIGxldCBhMzM6IG51bWJlciA9IGFbMyAqIDQgKyAzXTtcclxuICAgICAgbGV0IGIwMDogbnVtYmVyID0gYlswICogNCArIDBdO1xyXG4gICAgICBsZXQgYjAxOiBudW1iZXIgPSBiWzAgKiA0ICsgMV07XHJcbiAgICAgIGxldCBiMDI6IG51bWJlciA9IGJbMCAqIDQgKyAyXTtcclxuICAgICAgbGV0IGIwMzogbnVtYmVyID0gYlswICogNCArIDNdO1xyXG4gICAgICBsZXQgYjEwOiBudW1iZXIgPSBiWzEgKiA0ICsgMF07XHJcbiAgICAgIGxldCBiMTE6IG51bWJlciA9IGJbMSAqIDQgKyAxXTtcclxuICAgICAgbGV0IGIxMjogbnVtYmVyID0gYlsxICogNCArIDJdO1xyXG4gICAgICBsZXQgYjEzOiBudW1iZXIgPSBiWzEgKiA0ICsgM107XHJcbiAgICAgIGxldCBiMjA6IG51bWJlciA9IGJbMiAqIDQgKyAwXTtcclxuICAgICAgbGV0IGIyMTogbnVtYmVyID0gYlsyICogNCArIDFdO1xyXG4gICAgICBsZXQgYjIyOiBudW1iZXIgPSBiWzIgKiA0ICsgMl07XHJcbiAgICAgIGxldCBiMjM6IG51bWJlciA9IGJbMiAqIDQgKyAzXTtcclxuICAgICAgbGV0IGIzMDogbnVtYmVyID0gYlszICogNCArIDBdO1xyXG4gICAgICBsZXQgYjMxOiBudW1iZXIgPSBiWzMgKiA0ICsgMV07XHJcbiAgICAgIGxldCBiMzI6IG51bWJlciA9IGJbMyAqIDQgKyAyXTtcclxuICAgICAgbGV0IGIzMzogbnVtYmVyID0gYlszICogNCArIDNdO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBiMDAgKiBhMDAgKyBiMDEgKiBhMTAgKyBiMDIgKiBhMjAgKyBiMDMgKiBhMzAsXHJcbiAgICAgICAgYjAwICogYTAxICsgYjAxICogYTExICsgYjAyICogYTIxICsgYjAzICogYTMxLFxyXG4gICAgICAgIGIwMCAqIGEwMiArIGIwMSAqIGExMiArIGIwMiAqIGEyMiArIGIwMyAqIGEzMixcclxuICAgICAgICBiMDAgKiBhMDMgKyBiMDEgKiBhMTMgKyBiMDIgKiBhMjMgKyBiMDMgKiBhMzMsXHJcbiAgICAgICAgYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwICsgYjEzICogYTMwLFxyXG4gICAgICAgIGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMSArIGIxMyAqIGEzMSxcclxuICAgICAgICBiMTAgKiBhMDIgKyBiMTEgKiBhMTIgKyBiMTIgKiBhMjIgKyBiMTMgKiBhMzIsXHJcbiAgICAgICAgYjEwICogYTAzICsgYjExICogYTEzICsgYjEyICogYTIzICsgYjEzICogYTMzLFxyXG4gICAgICAgIGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGIyMiAqIGEyMCArIGIyMyAqIGEzMCxcclxuICAgICAgICBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjEgKyBiMjMgKiBhMzEsXHJcbiAgICAgICAgYjIwICogYTAyICsgYjIxICogYTEyICsgYjIyICogYTIyICsgYjIzICogYTMyLFxyXG4gICAgICAgIGIyMCAqIGEwMyArIGIyMSAqIGExMyArIGIyMiAqIGEyMyArIGIyMyAqIGEzMyxcclxuICAgICAgICBiMzAgKiBhMDAgKyBiMzEgKiBhMTAgKyBiMzIgKiBhMjAgKyBiMzMgKiBhMzAsXHJcbiAgICAgICAgYjMwICogYTAxICsgYjMxICogYTExICsgYjMyICogYTIxICsgYjMzICogYTMxLFxyXG4gICAgICAgIGIzMCAqIGEwMiArIGIzMSAqIGExMiArIGIzMiAqIGEyMiArIGIzMyAqIGEzMixcclxuICAgICAgICBiMzAgKiBhMDMgKyBiMzEgKiBhMTMgKyBiMzIgKiBhMjMgKyBiMzMgKiBhMzNcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgdHJhbnNwb3NlIG9mIGEgcGFzc2VkIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU1BPU0UoX210eDogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIF9tdHguY2xvbmUudHJhbnNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgaW52ZXJzZSBvZiBhIHBhc3NlZCBtYXRyaXguXHJcbiAgICAgKiBAcGFyYW0gX210eCBUaGUgbWF0cml4IHRvIGNvbXB1dGUgdGhlIGludmVyc2Ugb2YuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSU5WRVJTRShfbXR4OiBNYXRyaXg0eDQpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gX210eC5jbG9uZS5pbnZlcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgbWF0cml4IHdpdGggdGhlIGdpdmVuIHRyYW5zbGF0aW9uLCBpdHMgei1heGlzIHBvaW50aW5nIGRpcmVjdGx5IGF0IHRoZSBnaXZlbiB0YXJnZXQsXHJcbiAgICAgKiBhbmQgYSBtaW5pbWFsIGFuZ2xlIGJldHdlZW4gaXRzIHktYXhpcyBhbmQgdGhlIGdpdmVuIHVwLXtAbGluayBWZWN0b3IzfSwgcmVzcGV0aXZlbHkgY2FsY3VsYXRpbmcgeWF3IGFuZCBwaXRjaC5cclxuICAgICAqIFRoZSBwaXRjaCBtYXkgYmUgcmVzdHJpY3RlZCB0byB0aGUgdXAtdmVjdG9yIHRvIG9ubHkgY2FsY3VsYXRlIHlhdy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBMT09LX0FUKF90cmFuc2xhdGlvbjogVmVjdG9yMywgX3RhcmdldDogVmVjdG9yMywgX3VwOiBWZWN0b3IzID0gVmVjdG9yMy5ZKCksIF9yZXN0cmljdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IHpBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF90YXJnZXQsIF90cmFuc2xhdGlvbik7XHJcbiAgICAgIHpBeGlzLm5vcm1hbGl6ZSgpO1xyXG4gICAgICBsZXQgdmN0Q3Jvc3M6IFZlY3RvcjMgPSBWZWN0b3IzLkNST1NTKF91cCwgekF4aXMpO1xyXG4gICAgICBpZiAodmN0Q3Jvc3MubWFnbml0dWRlU3F1YXJlZCA9PSAwKSAvLyBleHBlcmltZW50YWwgd29ya2Fyb3VuZDogaWYgeiBhbmQgdXAgaXMgcGFyYWxsZWwsIHRoZXJlIGlzIG5vIHVwIHRvIHJlbWFpbi4uLlxyXG4gICAgICAgIHZjdENyb3NzLnggPSAwLjAwMTsgLy8gc28gdGlsdCBhIGxpdHRsZVxyXG4gICAgICBsZXQgeEF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04odmN0Q3Jvc3MpO1xyXG4gICAgICBsZXQgeUF4aXM6IFZlY3RvcjMgPSBfcmVzdHJpY3QgPyBfdXAgOiBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyh6QXhpcywgeEF4aXMpKTtcclxuICAgICAgekF4aXMgPSBfcmVzdHJpY3QgPyBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyh4QXhpcywgX3VwKSkgOiB6QXhpcztcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICB4QXhpcy54LCB4QXhpcy55LCB4QXhpcy56LCAwLFxyXG4gICAgICAgIHlBeGlzLngsIHlBeGlzLnksIHlBeGlzLnosIDAsXHJcbiAgICAgICAgekF4aXMueCwgekF4aXMueSwgekF4aXMueiwgMCxcclxuICAgICAgICBfdHJhbnNsYXRpb24ueCxcclxuICAgICAgICBfdHJhbnNsYXRpb24ueSxcclxuICAgICAgICBfdHJhbnNsYXRpb24ueixcclxuICAgICAgICAxXHJcbiAgICAgIF0pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKHpBeGlzLCB4QXhpcywgeUF4aXMsIHZjdENyb3NzKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgbWF0cml4IHdpdGggdGhlIGdpdmVuIHRyYW5zbGF0aW9uLCBpdHMgei1heGlzIHBvaW50aW5nIGRpcmVjdGx5IGluIHRoZSBnaXZlbiBkaXJlY3Rpb24sXHJcbiAgICAgKiBhbmQgYSBtaW5pbWFsIGFuZ2xlIGJldHdlZW4gaXRzIHktYXhpcyBhbmQgdGhlIGdpdmVuIHVwLXtAbGluayBWZWN0b3IzfS4gSWRlYWxseSB1cCBzaG91bGQgYmUgcGVycGVuZGljdWxhciB0byB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIExPT0tfSU4oX3RyYW5zbGF0aW9uOiBWZWN0b3IzLCBfZGlyZWN0aW9uOiBWZWN0b3IzLCBfdXA6IFZlY3RvcjMgPSBWZWN0b3IzLlkoKSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB6QXhpczogVmVjdG9yMyA9IFZlY3RvcjMuTk9STUFMSVpBVElPTihfZGlyZWN0aW9uKTtcclxuICAgICAgbGV0IHhBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5OT1JNQUxJWkFUSU9OKFZlY3RvcjMuQ1JPU1MoX3VwLCB6QXhpcykpO1xyXG4gICAgICBsZXQgeUF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyh6QXhpcywgeEF4aXMpKTtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICB4QXhpcy54LCB4QXhpcy55LCB4QXhpcy56LCAwLFxyXG4gICAgICAgIHlBeGlzLngsIHlBeGlzLnksIHlBeGlzLnosIDAsXHJcbiAgICAgICAgekF4aXMueCwgekF4aXMueSwgekF4aXMueiwgMCxcclxuICAgICAgICBfdHJhbnNsYXRpb24ueCwgX3RyYW5zbGF0aW9uLnksIF90cmFuc2xhdGlvbi56LCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKHpBeGlzLCB4QXhpcywgeUF4aXMpO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24sIGl0cyB5LWF4aXMgbWF0Y2hpbmcgdGhlIGdpdmVuIHVwLXtAbGluayBWZWN0b3IzfVxyXG4gICAgICogYW5kIGl0cyB6LWF4aXMgZmFjaW5nIHRvd2FyZHMgdGhlIGdpdmVuIHRhcmdldCBhdCBhIG1pbmltYWwgYW5nbGUsIHJlc3BldGl2ZWx5IGNhbGN1bGF0aW5nIHlhdyBvbmx5LlxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIFNIT1dfVE8oX3RyYW5zbGF0aW9uOiBWZWN0b3IzLCBfdGFyZ2V0OiBWZWN0b3IzLCBfdXA6IFZlY3RvcjMgPSBWZWN0b3IzLlkoKSk6IE1hdHJpeDR4NCB7XHJcbiAgICAvLyAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIuZ2V0KE1hdHJpeDR4NCk7XHJcbiAgICAvLyAgIGxldCB6QXhpczogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShfdGFyZ2V0LCBfdHJhbnNsYXRpb24pO1xyXG4gICAgLy8gICB6QXhpcy5ub3JtYWxpemUoKTtcclxuICAgIC8vICAgbGV0IHhBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5OT1JNQUxJWkFUSU9OKFZlY3RvcjMuQ1JPU1MoX3VwLCB6QXhpcykpO1xyXG4gICAgLy8gICAvLyBsZXQgeUF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyh6QXhpcywgeEF4aXMpKTtcclxuICAgIC8vICAgekF4aXMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyh4QXhpcywgX3VwKSk7XHJcbiAgICAvLyAgIG10eFJlc3VsdC5kYXRhLnNldChcclxuICAgIC8vICAgICBbXHJcbiAgICAvLyAgICAgICB4QXhpcy54LCB4QXhpcy55LCB4QXhpcy56LCAwLFxyXG4gICAgLy8gICAgICAgX3VwLngsIF91cC55LCBfdXAueiwgMCxcclxuICAgIC8vICAgICAgIHpBeGlzLngsIHpBeGlzLnksIHpBeGlzLnosIDAsXHJcbiAgICAvLyAgICAgICBfdHJhbnNsYXRpb24ueCxcclxuICAgIC8vICAgICAgIF90cmFuc2xhdGlvbi55LFxyXG4gICAgLy8gICAgICAgX3RyYW5zbGF0aW9uLnosXHJcbiAgICAvLyAgICAgICAxXHJcbiAgICAvLyAgICAgXSk7XHJcbiAgICAvLyAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgdHJhbnNsYXRlcyBjb29yZGluYXRlcyBhbG9uZyB0aGUgeC0sIHktIGFuZCB6LWF4aXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGxpbmsgVmVjdG9yM30uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgVFJBTlNMQVRJT04oX3RyYW5zbGF0ZTogVmVjdG9yMyk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIucmV1c2UoTWF0cml4NHg0KTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgMSwgMCwgMCwgMCxcclxuICAgICAgICAwLCAxLCAwLCAwLFxyXG4gICAgICAgIDAsIDAsIDEsIDAsXHJcbiAgICAgICAgX3RyYW5zbGF0ZS54LCBfdHJhbnNsYXRlLnksIF90cmFuc2xhdGUueiwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIG9uIHRoZSB4LWF4aXMgd2hlbiBtdWx0aXBsaWVkIGJ5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJPVEFUSU9OX1goX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIpOiBNYXRyaXg0eDQge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIGxldCBhbmdsZUluUmFkaWFuczogbnVtYmVyID0gX2FuZ2xlSW5EZWdyZWVzICogQ2FsYy5kZWcycmFkO1xyXG4gICAgICBsZXQgc2luOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIGxldCBjb3M6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgMSwgMCwgMCwgMCxcclxuICAgICAgICAwLCBjb3MsIHNpbiwgMCxcclxuICAgICAgICAwLCAtc2luLCBjb3MsIDAsXHJcbiAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIG9uIHRoZSB5LWF4aXMgd2hlbiBtdWx0aXBsaWVkIGJ5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJPVEFUSU9OX1koX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBsZXQgYW5nbGVJblJhZGlhbnM6IG51bWJlciA9IF9hbmdsZUluRGVncmVlcyAqIENhbGMuZGVnMnJhZDtcclxuICAgICAgbGV0IHNpbjogbnVtYmVyID0gTWF0aC5zaW4oYW5nbGVJblJhZGlhbnMpO1xyXG4gICAgICBsZXQgY29zOiBudW1iZXIgPSBNYXRoLmNvcyhhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIGNvcywgMCwgLXNpbiwgMCxcclxuICAgICAgICAwLCAxLCAwLCAwLFxyXG4gICAgICAgIHNpbiwgMCwgY29zLCAwLFxyXG4gICAgICAgIDAsIDAsIDAsIDFcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgcm90YXRlcyBjb29yZGluYXRlcyBvbiB0aGUgei1heGlzIHdoZW4gbXVsdGlwbGllZCBieS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBST1RBVElPTl9aKF9hbmdsZUluRGVncmVlczogbnVtYmVyKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBsZXQgYW5nbGVJblJhZGlhbnM6IG51bWJlciA9IF9hbmdsZUluRGVncmVlcyAqIENhbGMuZGVnMnJhZDtcclxuICAgICAgbGV0IHNpbjogbnVtYmVyID0gTWF0aC5zaW4oYW5nbGVJblJhZGlhbnMpO1xyXG4gICAgICBsZXQgY29zOiBudW1iZXIgPSBNYXRoLmNvcyhhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIGNvcywgc2luLCAwLCAwLFxyXG4gICAgICAgIC1zaW4sIGNvcywgMCwgMCxcclxuICAgICAgICAwLCAwLCAxLCAwLFxyXG4gICAgICAgIDAsIDAsIDAsIDFcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgcm90YXRlcyBjb29yZGluYXRlcyB3aGVuIG11bHRpcGxpZWQgYnksIHVzaW5nIHRoZSByb3RhdGlvbiBldWxlciBhbmdsZXMgb3IgdW5pdCBxdWF0ZXJuaW9uIGdpdmVuLlxyXG4gICAgICogUm90YXRpb24gb2NjdXJzIGFyb3VuZCB0aGUgYXhpcyBpbiB0aGUgb3JkZXIgWi1ZLVggLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJPVEFUSU9OKF9yb3RhdGlvbjogVmVjdG9yMyB8IFF1YXRlcm5pb24pOiBNYXRyaXg0eDQge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLmdldChNYXRyaXg0eDQpO1xyXG4gICAgICBNYXRyaXg0eDQuc2V0Um90YXRpb24obXR4UmVzdWx0LmRhdGEsIF9yb3RhdGlvbik7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgc2NhbGVzIGNvb3JkaW5hdGVzIGFsb25nIHRoZSB4LSwgeS0gYW5kIHotYXhpcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBWZWN0b3IzfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNDQUxJTkcoX3NjYWxhcjogVmVjdG9yMyk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIucmV1c2UoTWF0cml4NHg0KTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgX3NjYWxhci54LCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIF9zY2FsYXIueSwgMCwgMCxcclxuICAgICAgICAwLCAwLCBfc2NhbGFyLnosIDAsXHJcbiAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbWF0cml4IHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBiYXNlLlxyXG4gICAgICogSWYga25vd24sIHBhc3MgdGhlIGludmVyc2Ugb2YgdGhlIGJhc2UgdG8gYXZvaWQgdW5uZWNjZXNhcnkgY2FsY3VsYXRpb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUkVMQVRJVkUoX210eDogTWF0cml4NHg0LCBfbXR4QmFzZTogTWF0cml4NHg0LCBfbXR4SW52ZXJzZT86IE1hdHJpeDR4NCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmIChfbXR4SW52ZXJzZSlcclxuICAgICAgICByZXR1cm4gTWF0cml4NHg0LlBST0RVQ1QoX210eEludmVyc2UsIF9tdHgpO1xyXG5cclxuICAgICAgbGV0IG10eEludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKF9tdHhCYXNlKTtcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QobXR4SW52ZXJzZSwgX210eCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eEludmVyc2UpO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFBST0pFQ1RJT05TXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgbWF0cml4IHRoYXQgYXBwbGllcyBwZXJzcGVjdGl2ZSB0byBhbiBvYmplY3QsIGlmIGl0cyB0cmFuc2Zvcm0gaXMgbXVsdGlwbGllZCBieSBpdC5cclxuICAgICAqIEBwYXJhbSBfYXNwZWN0IFRoZSBhc3BlY3QgcmF0aW8gYmV0d2VlbiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHByb2plY3Rpb25zcGFjZS4oRGVmYXVsdCA9IGNhbnZhcy5jbGllbnRXaWR0aCAvIGNhbnZhcy5DbGllbnRIZWlnaHQpXHJcbiAgICAgKiBAcGFyYW0gX2ZpZWxkT2ZWaWV3SW5EZWdyZWVzIFRoZSBmaWVsZCBvZiB2aWV3IGluIERlZ3JlZXMuIChEZWZhdWx0ID0gNDUpXHJcbiAgICAgKiBAcGFyYW0gX25lYXIgVGhlIG5lYXIgY2xpcHNwYWNlIGJvcmRlciBvbiB0aGUgei1heGlzLlxyXG4gICAgICogQHBhcmFtIF9mYXIgVGhlIGZhciBjbGlwc3BhY2UgYm9yZGVyIG9uIHRoZSB6LWF4aXMuXHJcbiAgICAgKiBAcGFyYW0gX2RpcmVjdGlvbiBUaGUgcGxhbmUgb24gd2hpY2ggdGhlIGZpZWxkT2ZWaWV3LUFuZ2xlIGlzIGdpdmVuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0pFQ1RJT05fQ0VOVFJBTChfYXNwZWN0OiBudW1iZXIsIF9maWVsZE9mVmlld0luRGVncmVlczogbnVtYmVyLCBfbmVhcjogbnVtYmVyLCBfZmFyOiBudW1iZXIsIF9kaXJlY3Rpb246IEZJRUxEX09GX1ZJRVcpOiBNYXRyaXg0eDQge1xyXG4gICAgICAvL1RPRE86IGNhbWVyYSBsb29rcyBkb3duIG5lZ2F0aXZlIHotZGlyZWN0aW9uLCBzaG91bGQgYmUgcG9zaXRpdmVcclxuICAgICAgbGV0IGZpZWxkT2ZWaWV3SW5SYWRpYW5zOiBudW1iZXIgPSBfZmllbGRPZlZpZXdJbkRlZ3JlZXMgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIGxldCBmOiBudW1iZXIgPSBNYXRoLnRhbigwLjUgKiAoTWF0aC5QSSAtIGZpZWxkT2ZWaWV3SW5SYWRpYW5zKSk7XHJcbiAgICAgIGxldCByYW5nZUludjogbnVtYmVyID0gMS4wIC8gKF9uZWFyIC0gX2Zhcik7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIucmV1c2UoTWF0cml4NHg0KTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgZiwgMCwgMCwgMCxcclxuICAgICAgICAwLCBmLCAwLCAwLFxyXG4gICAgICAgIDAsIDAsIChfbmVhciArIF9mYXIpICogcmFuZ2VJbnYsIC0xLFxyXG4gICAgICAgIDAsIDAsIF9uZWFyICogX2ZhciAqIHJhbmdlSW52ICogMiwgMFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIGlmIChfZGlyZWN0aW9uID09IEZJRUxEX09GX1ZJRVcuRElBR09OQUwpIHtcclxuICAgICAgICBfYXNwZWN0ID0gTWF0aC5zcXJ0KF9hc3BlY3QpO1xyXG4gICAgICAgIG10eFJlc3VsdC5kYXRhWzBdID0gZiAvIF9hc3BlY3Q7XHJcbiAgICAgICAgbXR4UmVzdWx0LmRhdGFbNV0gPSBmICogX2FzcGVjdDtcclxuICAgICAgfSBlbHNlIGlmIChfZGlyZWN0aW9uID09IEZJRUxEX09GX1ZJRVcuVkVSVElDQUwpXHJcbiAgICAgICAgbXR4UmVzdWx0LmRhdGFbMF0gPSBmIC8gX2FzcGVjdDtcclxuICAgICAgZWxzZSAvL0ZPVl9ESVJFQ1RJT04uSE9SSVpPTlRBTFxyXG4gICAgICAgIG10eFJlc3VsdC5kYXRhWzVdID0gZiAqIF9hc3BlY3Q7XHJcblxyXG4gICAgICAvLyBIQUNLOiBtYXRyaXggc2hvdWxkIGxvb2sgaW4gcG9zaXRpdmUgei1kaXJlY3Rpb24sIHByZWZlcmFibHkgdGhlIG1hdHJpeCBzaG91bGQgYmUgY2FsY3VsYXRlZCBsaWtlIHRoYXQgcmlnaHQgYXdheVxyXG4gICAgICBtdHhSZXN1bHQucm90YXRlWSgxODApO1xyXG5cclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgbWF0cml4IHRoYXQgYXBwbGllcyBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiB0byBhbiBvYmplY3QsIGlmIGl0cyB0cmFuc2Zvcm0gaXMgbXVsdGlwbGllZCBieSBpdC5cclxuICAgICAqIEBwYXJhbSBfbGVmdCBUaGUgcG9zaXRpb252YWx1ZSBvZiB0aGUgcHJvamVjdGlvbnNwYWNlJ3MgbGVmdCBib3JkZXIuXHJcbiAgICAgKiBAcGFyYW0gX3JpZ2h0IFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyByaWdodCBib3JkZXIuXHJcbiAgICAgKiBAcGFyYW0gX2JvdHRvbSBUaGUgcG9zaXRpb252YWx1ZSBvZiB0aGUgcHJvamVjdGlvbnNwYWNlJ3MgYm90dG9tIGJvcmRlci5cclxuICAgICAqIEBwYXJhbSBfdG9wIFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyB0b3AgYm9yZGVyLlxyXG4gICAgICogQHBhcmFtIF9uZWFyIFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBuZWFyIGJvcmRlci5cclxuICAgICAqIEBwYXJhbSBfZmFyIFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBmYXIgYm9yZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJPSkVDVElPTl9PUlRIT0dSQVBISUMoX2xlZnQ6IG51bWJlciwgX3JpZ2h0OiBudW1iZXIsIF9ib3R0b206IG51bWJlciwgX3RvcDogbnVtYmVyLCBfbmVhcjogbnVtYmVyID0gLTQwMCwgX2ZhcjogbnVtYmVyID0gNDAwKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICAyIC8gKF9yaWdodCAtIF9sZWZ0KSwgMCwgMCwgMCxcclxuICAgICAgICAwLCAtMiAvIChfdG9wIC0gX2JvdHRvbSksIDAsIDAsXHJcbiAgICAgICAgMCwgMCwgMiAvIChfZmFyIC0gX25lYXIpLCAwLFxyXG4gICAgICAgIChfbGVmdCArIF9yaWdodCkgLyAoX2xlZnQgLSBfcmlnaHQpLFxyXG4gICAgICAgIChfYm90dG9tICsgX3RvcCkgLyAoX2JvdHRvbSAtIF90b3ApLFxyXG4gICAgICAgIChfbmVhciArIF9mYXIpIC8gKF9uZWFyIC0gX2ZhciksXHJcbiAgICAgICAgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgcm90YXRpb24gcGFydCBvZiB0aGUgZ2l2ZW4gbWF0cml4ZXMgZGF0YSBhcnJheSB0byB0aGUgZ2l2ZW4gcm90YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIHNldFJvdGF0aW9uKF9tOiBGbG9hdDMyQXJyYXksIF9yb3RhdGlvbjogVmVjdG9yMyB8IFF1YXRlcm5pb24pOiB2b2lkIHtcclxuICAgICAgaWYgKF9yb3RhdGlvbiBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcclxuICAgICAgICBjb25zdCBhbmdsZXNSYWQ6IFZlY3RvcjMgPSBWZWN0b3IzLlNDQUxFKF9yb3RhdGlvbiwgQ2FsYy5kZWcycmFkKTtcclxuICAgICAgICBjb25zdCBzaW5YOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZXNSYWQueCk7XHJcbiAgICAgICAgY29uc3QgY29zWDogbnVtYmVyID0gTWF0aC5jb3MoYW5nbGVzUmFkLngpO1xyXG4gICAgICAgIGNvbnN0IHNpblk6IG51bWJlciA9IE1hdGguc2luKGFuZ2xlc1JhZC55KTtcclxuICAgICAgICBjb25zdCBjb3NZOiBudW1iZXIgPSBNYXRoLmNvcyhhbmdsZXNSYWQueSk7XHJcbiAgICAgICAgY29uc3Qgc2luWjogbnVtYmVyID0gTWF0aC5zaW4oYW5nbGVzUmFkLnopO1xyXG4gICAgICAgIGNvbnN0IGNvc1o6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlc1JhZC56KTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShhbmdsZXNSYWQpO1xyXG5cclxuICAgICAgICBfbVswXSA9IGNvc1ogKiBjb3NZOyAvKiovICAgICAgICAgICAgICAgICBfbVsxXSA9IHNpblogKiBjb3NZOyAvKiovICAgICAgICAgICAgICAgICBfbVsyXSA9IC1zaW5ZO1xyXG4gICAgICAgIF9tWzRdID0gY29zWiAqIHNpblkgKiBzaW5YIC0gc2luWiAqIGNvc1g7IF9tWzVdID0gc2luWiAqIHNpblkgKiBzaW5YICsgY29zWiAqIGNvc1g7IF9tWzZdID0gY29zWSAqIHNpblg7XHJcbiAgICAgICAgX21bOF0gPSBjb3NaICogc2luWSAqIGNvc1ggKyBzaW5aICogc2luWDsgX21bOV0gPSBzaW5aICogc2luWSAqIGNvc1ggLSBjb3NaICogc2luWDsgX21bMTBdID0gY29zWSAqIGNvc1g7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgcm90YXRpb25Ob3JtYWxpemVkOiBRdWF0ZXJuaW9uID0gUXVhdGVybmlvbi5OT1JNQUxJWkFUSU9OKF9yb3RhdGlvbik7XHJcbiAgICAgICAgY29uc3QgeDogbnVtYmVyID0gcm90YXRpb25Ob3JtYWxpemVkLngsIHk6IG51bWJlciA9IHJvdGF0aW9uTm9ybWFsaXplZC55LCB6OiBudW1iZXIgPSByb3RhdGlvbk5vcm1hbGl6ZWQueiwgdzogbnVtYmVyID0gcm90YXRpb25Ob3JtYWxpemVkLnc7XHJcbiAgICAgICAgY29uc3QgeHg6IG51bWJlciA9IHggKiB4LCB4eTogbnVtYmVyID0geCAqIHksIHh6OiBudW1iZXIgPSB4ICogeiwgeHc6IG51bWJlciA9IHggKiB3O1xyXG4gICAgICAgIGNvbnN0IHl5OiBudW1iZXIgPSB5ICogeSwgeXo6IG51bWJlciA9IHkgKiB6LCB5dzogbnVtYmVyID0geSAqIHc7XHJcbiAgICAgICAgY29uc3Qgeno6IG51bWJlciA9IHogKiB6LCB6dzogbnVtYmVyID0geiAqIHc7XHJcbiAgICAgICAgY29uc3Qgd3c6IG51bWJlciA9IHcgKiB3O1xyXG5cclxuICAgICAgICBfbVswXSA9IHd3ICsgeHggLSB5eSAtIHp6OyBfbVsxXSA9IDIgKiAoeHkgKyB6dyk7LyoqLyBfbVsyXSA9IDIgKiAoeHogLSB5dyk7XHJcbiAgICAgICAgX21bNF0gPSAyICogKHh5IC0gencpOy8qKi8gX21bNV0gPSB3dyAtIHh4ICsgeXkgLSB6ejsgX21bNl0gPSAyICogKHl6ICsgeHcpO1xyXG4gICAgICAgIF9tWzhdID0gMiAqICh4eiArIHl3KTsvKiovIF9tWzldID0gMiAqICh5eiAtIHh3KTsvKiovIF9tWzEwXSA9IHd3IC0geHggLSB5eSArIHp6O1xyXG5cclxuICAgICAgICAvLyBfbVswXSA9IDEgLSAyICogKHl5ICsgenopOyBfbVsxXSA9IDIgKiAoeHkgKyB6dyk7LyoqLyBfbVsyXSA9IDIgKiAoeHogLSB5dyk7XHJcbiAgICAgICAgLy8gX21bNF0gPSAyICogKHh5IC0gencpOy8qKi8gX21bNV0gPSAxIC0gMiAqICh4eCArIHp6KTsgX21bNl0gPSAyICogKHl6ICsgeHcpO1xyXG4gICAgICAgIC8vIF9tWzhdID0gMiAqICh4eiArIHl3KTsvKiovIF9tWzldID0gMiAqICh5eiAtIHh3KTsvKiovIF9tWzEwXSA9IDEgLSAyICogKHh4ICsgeXkpO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKHJvdGF0aW9uTm9ybWFsaXplZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiAgQWNjZXNzb3JzXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIGEgdmVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2xhdGlvbiB7QGxpbmsgVmVjdG9yM30uICBcclxuICAgICAqICoqQ2F1dGlvbiEqKiBVc2UgaW1tZWRpYXRlbHkgYW5kIHJlYWRvbmx5LCBzaW5jZSB0aGUgdmVjdG9yIGlzIGdvaW5nIHRvIGJlIHJldXNlZCBpbnRlcm5hbGx5LiBDcmVhdGUgYSBjbG9uZSB0byBrZWVwIGxvbmdlciBhbmQgbWFuaXB1bGF0ZS4gXHJcbiAgICAgKiAtIHNldDogZWZmZWN0IHRoZSBtYXRyaXggaWdub3JpbmcgaXRzIHJvdGF0aW9uIGFuZCBzY2FsaW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdHJhbnNsYXRpb24oKTogVmVjdG9yMyB7XHJcbiAgICAgIGlmICh0aGlzLiN0cmFuc2xhdGlvbkRpcnR5KSB7XHJcbiAgICAgICAgdGhpcy4jdHJhbnNsYXRpb24uc2V0KHRoaXMuZGF0YVsxMl0sIHRoaXMuZGF0YVsxM10sIHRoaXMuZGF0YVsxNF0pO1xyXG4gICAgICAgIHRoaXMuI3RyYW5zbGF0aW9uRGlydHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jdHJhbnNsYXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRyYW5zbGF0aW9uKF90cmFuc2xhdGlvbjogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLm11dGF0ZSh7IFwidHJhbnNsYXRpb25cIjogX3RyYW5zbGF0aW9uIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gYSB2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJvdGF0aW9uIHtAbGluayBWZWN0b3IzfS4gIFxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSBhbmQgcmVhZG9ubHksIHNpbmNlIHRoZSB2ZWN0b3IgaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGludGVybmFsbHkuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdGF0aW9uKCk6IFZlY3RvcjMge1xyXG4gICAgICBpZiAodGhpcy4jcm90YXRpb25EaXJ0eSkge1xyXG4gICAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5zY2FsaW5nO1xyXG5cclxuICAgICAgICBsZXQgczA6IG51bWJlciA9IHRoaXMuZGF0YVswXSAvIHNjYWxpbmcueDtcclxuICAgICAgICBsZXQgczE6IG51bWJlciA9IHRoaXMuZGF0YVsxXSAvIHNjYWxpbmcueDtcclxuICAgICAgICBsZXQgczI6IG51bWJlciA9IHRoaXMuZGF0YVsyXSAvIHNjYWxpbmcueDtcclxuICAgICAgICBsZXQgczY6IG51bWJlciA9IHRoaXMuZGF0YVs2XSAvIHNjYWxpbmcueTtcclxuICAgICAgICBsZXQgczEwOiBudW1iZXIgPSB0aGlzLmRhdGFbMTBdIC8gc2NhbGluZy56O1xyXG5cclxuICAgICAgICBsZXQgc3k6IG51bWJlciA9IE1hdGguaHlwb3QoczAsIHMxKTsgLy8gcHJvYmFibHkgMi4gcGFyYW0gc2hvdWxkIGJlIHRoaXMuZGF0YVs0XSAvIHNjYWxpbmcueVxyXG5cclxuICAgICAgICBsZXQgc2luZ3VsYXI6IGJvb2xlYW4gPSBzeSA8IDFlLTY7IC8vIElmXHJcblxyXG4gICAgICAgIGxldCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB6MTogbnVtYmVyO1xyXG4gICAgICAgIGxldCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCB6MjogbnVtYmVyO1xyXG5cclxuICAgICAgICBpZiAoIXNpbmd1bGFyKSB7XHJcbiAgICAgICAgICB4MSA9IE1hdGguYXRhbjIoczYsIHMxMCk7XHJcbiAgICAgICAgICB5MSA9IE1hdGguYXRhbjIoLXMyLCBzeSk7XHJcbiAgICAgICAgICB6MSA9IE1hdGguYXRhbjIoczEsIHMwKTtcclxuXHJcbiAgICAgICAgICB4MiA9IE1hdGguYXRhbjIoLXM2LCAtczEwKTtcclxuICAgICAgICAgIHkyID0gTWF0aC5hdGFuMigtczIsIC1zeSk7XHJcbiAgICAgICAgICB6MiA9IE1hdGguYXRhbjIoLXMxLCAtczApO1xyXG5cclxuICAgICAgICAgIGlmIChNYXRoLmFicyh4MikgKyBNYXRoLmFicyh5MikgKyBNYXRoLmFicyh6MikgPCBNYXRoLmFicyh4MSkgKyBNYXRoLmFicyh5MSkgKyBNYXRoLmFicyh6MSkpIHtcclxuICAgICAgICAgICAgeDEgPSB4MjtcclxuICAgICAgICAgICAgeTEgPSB5MjtcclxuICAgICAgICAgICAgejEgPSB6MjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgeDEgPSBNYXRoLmF0YW4yKC10aGlzLmRhdGFbOV0gLyBzY2FsaW5nLnosIHRoaXMuZGF0YVs1XSAvIHNjYWxpbmcueSk7XHJcbiAgICAgICAgICB5MSA9IE1hdGguYXRhbjIoLXRoaXMuZGF0YVsyXSAvIHNjYWxpbmcueCwgc3kpO1xyXG4gICAgICAgICAgejEgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy4jcm90YXRpb24uc2V0KHgxLCB5MSwgejEpO1xyXG4gICAgICAgIHRoaXMuI3JvdGF0aW9uLnNjYWxlKENhbGMucmFkMmRlZyk7XHJcbiAgICAgICAgdGhpcy4jcm90YXRpb25EaXJ0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jcm90YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdGF0aW9uKF9yb3RhdGlvbjogUXVhdGVybmlvbiB8IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy5tdXRhdGUoeyBcInJvdGF0aW9uXCI6IF9yb3RhdGlvbiB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIGEgdmVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2FsaW5nIHtAbGluayBWZWN0b3IzfS4gIFxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSBhbmQgcmVhZG9ubHksIHNpbmNlIHRoZSB2ZWN0b3IgaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGludGVybmFsbHkuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNjYWxpbmcoKTogVmVjdG9yMyB7XHJcbiAgICAgIGlmICh0aGlzLiNzY2FsaW5nRGlydHkpIHtcclxuICAgICAgICB0aGlzLiNzY2FsaW5nLnNldChcclxuICAgICAgICAgIE1hdGguaHlwb3QodGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0sIHRoaXMuZGF0YVsyXSksIC8vKiAodGhpcy5kYXRhWzBdIDwgMCA/IC0xIDogMSksXHJcbiAgICAgICAgICBNYXRoLmh5cG90KHRoaXMuZGF0YVs0XSwgdGhpcy5kYXRhWzVdLCB0aGlzLmRhdGFbNl0pLCAvLyogKHRoaXMuZGF0YVs1XSA8IDAgPyAtMSA6IDEpLFxyXG4gICAgICAgICAgTWF0aC5oeXBvdCh0aGlzLmRhdGFbOF0sIHRoaXMuZGF0YVs5XSwgdGhpcy5kYXRhWzEwXSkgLy8gKiAodGhpcy5kYXRhWzEwXSA8IDAgPyAtMSA6IDEpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLiNzY2FsaW5nRGlydHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jc2NhbGluZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2NhbGluZyhfc2NhbGluZzogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLm11dGF0ZSh7IFwic2NhbGluZ1wiOiBfc2NhbGluZyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIGEgdW5pdCBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyB0aGUgcm90YXRpb24gb2YgdGhpcyBtYXRyaXguXHJcbiAgICAgKiAqKkNhdXRpb24hKiogVXNlIGltbWVkaWF0ZWx5IGFuZCByZWFkb25seSwgc2luY2UgdGhlIHF1YXRlcm5pb24gaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGludGVybmFsbHkuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHF1YXRlcm5pb24oKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGlmICh0aGlzLiNxdWF0ZXJuaW9uRGlydHkpIHtcclxuICAgICAgICB0aGlzLiNxdWF0ZXJuaW9uLmV1bGVyQW5nbGVzID0gdGhpcy5yb3RhdGlvbjtcclxuICAgICAgICB0aGlzLiNxdWF0ZXJuaW9uRGlydHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI3F1YXRlcm5pb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHF1YXRlcm5pb24oX3F1YXRlcm5pb246IFF1YXRlcm5pb24pIHtcclxuICAgICAgdGhpcy5tdXRhdGUoeyBcInJvdGF0aW9uXCI6IF9xdWF0ZXJuaW9uIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCBjYXJkaW5hbCB4LWF4aXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcmlnaHQoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByaWdodDogVmVjdG9yMyA9IHRoaXMuZ2V0WCgpO1xyXG4gICAgICByaWdodC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHJpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCBjYXJkaW5hbCB5LWF4aXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdXAoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB1cDogVmVjdG9yMyA9IHRoaXMuZ2V0WSgpO1xyXG4gICAgICB1cC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHVwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCBjYXJkaW5hbCB6LWF4aXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZm9yd2FyZCgpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGZvcndhcmQ6IFZlY3RvcjMgPSB0aGlzLmdldFooKTtcclxuICAgICAgZm9yd2FyZC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIGZvcndhcmQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCkuY29weSh0aGlzKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBtYXRyaXggdG8gdGhlIGlkZW50aXR5LW1hdHJpeCBhbmQgY2xlYXJzIGNhY2hlLiBVc2VkIGJ5IHRoZSByZWN5Y2xlciB0byByZXNldC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0KFtcclxuICAgICAgICAxLCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIDEsIDAsIDAsXHJcbiAgICAgICAgMCwgMCwgMSwgMCxcclxuICAgICAgICAwLCAwLCAwLCAxXHJcbiAgICAgIF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBtYXRyaXggdG8gdGhlIGlkZW50aXR5LW1hdHJpeCBhbmQgY2xlYXJzIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmVjeWNsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNwb3NlIHRoaXMgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc3Bvc2UoKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IHRoaXMuZGF0YTtcclxuICAgICAgdGhpcy5zZXQoW1xyXG4gICAgICAgIG1bMF0sIG1bNF0sIG1bOF0sIG1bMTJdLFxyXG4gICAgICAgIG1bMV0sIG1bNV0sIG1bOV0sIG1bMTNdLFxyXG4gICAgICAgIG1bMl0sIG1bNl0sIG1bMTBdLCBtWzE0XSxcclxuICAgICAgICBtWzNdLCBtWzddLCBtWzExXSwgbVsxNV1cclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52ZXJ0IHRoaXMgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnZlcnQoKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IHRoaXMuZGF0YTtcclxuICAgICAgbGV0IG0wMDogbnVtYmVyID0gbVswICogNCArIDBdO1xyXG4gICAgICBsZXQgbTAxOiBudW1iZXIgPSBtWzAgKiA0ICsgMV07XHJcbiAgICAgIGxldCBtMDI6IG51bWJlciA9IG1bMCAqIDQgKyAyXTtcclxuICAgICAgbGV0IG0wMzogbnVtYmVyID0gbVswICogNCArIDNdO1xyXG4gICAgICBsZXQgbTEwOiBudW1iZXIgPSBtWzEgKiA0ICsgMF07XHJcbiAgICAgIGxldCBtMTE6IG51bWJlciA9IG1bMSAqIDQgKyAxXTtcclxuICAgICAgbGV0IG0xMjogbnVtYmVyID0gbVsxICogNCArIDJdO1xyXG4gICAgICBsZXQgbTEzOiBudW1iZXIgPSBtWzEgKiA0ICsgM107XHJcbiAgICAgIGxldCBtMjA6IG51bWJlciA9IG1bMiAqIDQgKyAwXTtcclxuICAgICAgbGV0IG0yMTogbnVtYmVyID0gbVsyICogNCArIDFdO1xyXG4gICAgICBsZXQgbTIyOiBudW1iZXIgPSBtWzIgKiA0ICsgMl07XHJcbiAgICAgIGxldCBtMjM6IG51bWJlciA9IG1bMiAqIDQgKyAzXTtcclxuICAgICAgbGV0IG0zMDogbnVtYmVyID0gbVszICogNCArIDBdO1xyXG4gICAgICBsZXQgbTMxOiBudW1iZXIgPSBtWzMgKiA0ICsgMV07XHJcbiAgICAgIGxldCBtMzI6IG51bWJlciA9IG1bMyAqIDQgKyAyXTtcclxuICAgICAgbGV0IG0zMzogbnVtYmVyID0gbVszICogNCArIDNdO1xyXG4gICAgICBsZXQgdG1wMDogbnVtYmVyID0gbTIyICogbTMzO1xyXG4gICAgICBsZXQgdG1wMTogbnVtYmVyID0gbTMyICogbTIzO1xyXG4gICAgICBsZXQgdG1wMjogbnVtYmVyID0gbTEyICogbTMzO1xyXG4gICAgICBsZXQgdG1wMzogbnVtYmVyID0gbTMyICogbTEzO1xyXG4gICAgICBsZXQgdG1wNDogbnVtYmVyID0gbTEyICogbTIzO1xyXG4gICAgICBsZXQgdG1wNTogbnVtYmVyID0gbTIyICogbTEzO1xyXG4gICAgICBsZXQgdG1wNjogbnVtYmVyID0gbTAyICogbTMzO1xyXG4gICAgICBsZXQgdG1wNzogbnVtYmVyID0gbTMyICogbTAzO1xyXG4gICAgICBsZXQgdG1wODogbnVtYmVyID0gbTAyICogbTIzO1xyXG4gICAgICBsZXQgdG1wOTogbnVtYmVyID0gbTIyICogbTAzO1xyXG4gICAgICBsZXQgdG1wMTA6IG51bWJlciA9IG0wMiAqIG0xMztcclxuICAgICAgbGV0IHRtcDExOiBudW1iZXIgPSBtMTIgKiBtMDM7XHJcbiAgICAgIGxldCB0bXAxMjogbnVtYmVyID0gbTIwICogbTMxO1xyXG4gICAgICBsZXQgdG1wMTM6IG51bWJlciA9IG0zMCAqIG0yMTtcclxuICAgICAgbGV0IHRtcDE0OiBudW1iZXIgPSBtMTAgKiBtMzE7XHJcbiAgICAgIGxldCB0bXAxNTogbnVtYmVyID0gbTMwICogbTExO1xyXG4gICAgICBsZXQgdG1wMTY6IG51bWJlciA9IG0xMCAqIG0yMTtcclxuICAgICAgbGV0IHRtcDE3OiBudW1iZXIgPSBtMjAgKiBtMTE7XHJcbiAgICAgIGxldCB0bXAxODogbnVtYmVyID0gbTAwICogbTMxO1xyXG4gICAgICBsZXQgdG1wMTk6IG51bWJlciA9IG0zMCAqIG0wMTtcclxuICAgICAgbGV0IHRtcDIwOiBudW1iZXIgPSBtMDAgKiBtMjE7XHJcbiAgICAgIGxldCB0bXAyMTogbnVtYmVyID0gbTIwICogbTAxO1xyXG4gICAgICBsZXQgdG1wMjI6IG51bWJlciA9IG0wMCAqIG0xMTtcclxuICAgICAgbGV0IHRtcDIzOiBudW1iZXIgPSBtMTAgKiBtMDE7XHJcblxyXG4gICAgICBsZXQgdDA6IG51bWJlciA9ICh0bXAwICogbTExICsgdG1wMyAqIG0yMSArIHRtcDQgKiBtMzEpIC1cclxuICAgICAgICAodG1wMSAqIG0xMSArIHRtcDIgKiBtMjEgKyB0bXA1ICogbTMxKTtcclxuXHJcbiAgICAgIGxldCB0MTogbnVtYmVyID0gKHRtcDEgKiBtMDEgKyB0bXA2ICogbTIxICsgdG1wOSAqIG0zMSkgLVxyXG4gICAgICAgICh0bXAwICogbTAxICsgdG1wNyAqIG0yMSArIHRtcDggKiBtMzEpO1xyXG4gICAgICBsZXQgdDI6IG51bWJlciA9ICh0bXAyICogbTAxICsgdG1wNyAqIG0xMSArIHRtcDEwICogbTMxKSAtXHJcbiAgICAgICAgKHRtcDMgKiBtMDEgKyB0bXA2ICogbTExICsgdG1wMTEgKiBtMzEpO1xyXG4gICAgICBsZXQgdDM6IG51bWJlciA9ICh0bXA1ICogbTAxICsgdG1wOCAqIG0xMSArIHRtcDExICogbTIxKSAtXHJcbiAgICAgICAgKHRtcDQgKiBtMDEgKyB0bXA5ICogbTExICsgdG1wMTAgKiBtMjEpO1xyXG5cclxuICAgICAgbGV0IGQ6IG51bWJlciA9IDEuMCAvIChtMDAgKiB0MCArIG0xMCAqIHQxICsgbTIwICogdDIgKyBtMzAgKiB0Myk7XHJcblxyXG4gICAgICB0aGlzLnNldChbXHJcbiAgICAgICAgZCAqIHQwLCAvLyBbMF1cclxuICAgICAgICBkICogdDEsIC8vIFsxXVxyXG4gICAgICAgIGQgKiB0MiwgLy8gWzJdXHJcbiAgICAgICAgZCAqIHQzLCAvLyBbM11cclxuICAgICAgICBkICogKCh0bXAxICogbTEwICsgdG1wMiAqIG0yMCArIHRtcDUgKiBtMzApIC0gKHRtcDAgKiBtMTAgKyB0bXAzICogbTIwICsgdG1wNCAqIG0zMCkpLCAgICAgICAgLy8gWzRdXHJcbiAgICAgICAgZCAqICgodG1wMCAqIG0wMCArIHRtcDcgKiBtMjAgKyB0bXA4ICogbTMwKSAtICh0bXAxICogbTAwICsgdG1wNiAqIG0yMCArIHRtcDkgKiBtMzApKSwgICAgICAgIC8vIFs1XVxyXG4gICAgICAgIGQgKiAoKHRtcDMgKiBtMDAgKyB0bXA2ICogbTEwICsgdG1wMTEgKiBtMzApIC0gKHRtcDIgKiBtMDAgKyB0bXA3ICogbTEwICsgdG1wMTAgKiBtMzApKSwgICAgICAvLyBbNl1cclxuICAgICAgICBkICogKCh0bXA0ICogbTAwICsgdG1wOSAqIG0xMCArIHRtcDEwICogbTIwKSAtICh0bXA1ICogbTAwICsgdG1wOCAqIG0xMCArIHRtcDExICogbTIwKSksICAgICAgLy8gWzddXHJcbiAgICAgICAgZCAqICgodG1wMTIgKiBtMTMgKyB0bXAxNSAqIG0yMyArIHRtcDE2ICogbTMzKSAtICh0bXAxMyAqIG0xMyArIHRtcDE0ICogbTIzICsgdG1wMTcgKiBtMzMpKSwgIC8vIFs4XVxyXG4gICAgICAgIGQgKiAoKHRtcDEzICogbTAzICsgdG1wMTggKiBtMjMgKyB0bXAyMSAqIG0zMykgLSAodG1wMTIgKiBtMDMgKyB0bXAxOSAqIG0yMyArIHRtcDIwICogbTMzKSksICAvLyBbOV1cclxuICAgICAgICBkICogKCh0bXAxNCAqIG0wMyArIHRtcDE5ICogbTEzICsgdG1wMjIgKiBtMzMpIC0gKHRtcDE1ICogbTAzICsgdG1wMTggKiBtMTMgKyB0bXAyMyAqIG0zMykpLCAgLy8gWzEwXVxyXG4gICAgICAgIGQgKiAoKHRtcDE3ICogbTAzICsgdG1wMjAgKiBtMTMgKyB0bXAyMyAqIG0yMykgLSAodG1wMTYgKiBtMDMgKyB0bXAyMSAqIG0xMyArIHRtcDIyICogbTIzKSksICAvLyBbMTFdXHJcbiAgICAgICAgZCAqICgodG1wMTQgKiBtMjIgKyB0bXAxNyAqIG0zMiArIHRtcDEzICogbTEyKSAtICh0bXAxNiAqIG0zMiArIHRtcDEyICogbTEyICsgdG1wMTUgKiBtMjIpKSwgIC8vIFsxMl1cclxuICAgICAgICBkICogKCh0bXAyMCAqIG0zMiArIHRtcDEyICogbTAyICsgdG1wMTkgKiBtMjIpIC0gKHRtcDE4ICogbTIyICsgdG1wMjEgKiBtMzIgKyB0bXAxMyAqIG0wMikpLCAgLy8gWzEzXVxyXG4gICAgICAgIGQgKiAoKHRtcDE4ICogbTEyICsgdG1wMjMgKiBtMzIgKyB0bXAxNSAqIG0wMikgLSAodG1wMjIgKiBtMzIgKyB0bXAxNCAqIG0wMiArIHRtcDE5ICogbTEyKSksICAvLyBbMTRdXHJcbiAgICAgICAgZCAqICgodG1wMjIgKiBtMjIgKyB0bXAxNiAqIG0wMiArIHRtcDIxICogbTEyKSAtICh0bXAyMCAqIG0xMiArIHRtcDIzICogbTIyICsgdG1wMTcgKiBtMDIpKSAgLy8gWzE1XVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zbGF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSB0cmFuc2xhdGlvbiBieSB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjN9IHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICogSWYgX2xvY2FsIGlzIHRydWUsIHRoZSB0cmFuc2xhdGlvbiBvY2N1cnMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHJvdGF0aW9uIGFuZCBzY2FsaW5nIG9mIHRoaXMgbWF0cml4LFxyXG4gICAgICogb3RoZXJ3aXNlLCBpdCBvY2N1cnMgYWNjb3JkaW5nIHRvIHRoZSBwYXJlbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGUoX2J5OiBWZWN0b3IzLCBfbG9jYWw6IGJvb2xlYW4gPSB0cnVlKTogTWF0cml4NHg0IHtcclxuICAgICAgaWYgKF9sb2NhbCkge1xyXG4gICAgICAgIGxldCBtdHhUcmFuc2xhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlRSQU5TTEFUSU9OKF9ieSk7XHJcbiAgICAgICAgdGhpcy5tdWx0aXBseShtdHhUcmFuc2xhdGlvbik7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4VHJhbnNsYXRpb24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGF0YVsxMl0gKz0gX2J5Lng7XHJcbiAgICAgICAgdGhpcy5kYXRhWzEzXSArPSBfYnkueTtcclxuICAgICAgICB0aGlzLmRhdGFbMTRdICs9IF9ieS56O1xyXG4gICAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy4jdHJhbnNsYXRpb25EaXJ0eSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvbnN0IG1hdHJpeDogTWF0cml4NHg0ID0gTWF0cml4NHg0Lk1VTFRJUExJQ0FUSU9OKHRoaXMsIE1hdHJpeDR4NC5UUkFOU0xBVElPTihfYnkpKTtcclxuICAgICAgLy8gLy8gVE9ETzogcG9zc2libGUgb3B0aW1pemF0aW9uLCB0cmFuc2xhdGlvbiBtYXkgYWx0ZXIgbXV0YXRvciBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0LlxyXG4gICAgICAvLyB0aGlzLnNldChtYXRyaXgpO1xyXG4gICAgICAvLyBSZWN5Y2xlci5zdG9yZShtYXRyaXgpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSB0cmFuc2xhdGlvbiBhbG9uZyB0aGUgeC1heGlzIHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlWChfeDogbnVtYmVyLCBfbG9jYWw6IGJvb2xlYW4gPSB0cnVlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5YKF94KTtcclxuICAgICAgdGhpcy50cmFuc2xhdGUodHJhbnNsYXRpb24sIF9sb2NhbCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHRyYW5zbGF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYWxvbmcgdGhlIHktYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZVkoX3k6IG51bWJlciwgX2xvY2FsOiBib29sZWFuID0gdHJ1ZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB0cmFuc2xhdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuWShfeSk7XHJcbiAgICAgIHRoaXMudHJhbnNsYXRlKHRyYW5zbGF0aW9uLCBfbG9jYWwpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh0cmFuc2xhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHRyYW5zbGF0aW9uIGFsb25nIHRoZSB6LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGVaKF96OiBudW1iZXIsIF9sb2NhbDogYm9vbGVhbiA9IHRydWUpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSBWZWN0b3IzLlooX3opO1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZSh0cmFuc2xhdGlvbiwgX2xvY2FsKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBSb3RhdGlvblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIHRoaXMgbWF0cml4IGJ5IGdpdmVuIHtAbGluayBWZWN0b3IzfSBpbiB0aGUgb3JkZXIgWiwgWSwgWC4gUmlnaHQgaGFuZCByb3RhdGlvbiBpcyB1c2VkLCB0aHVtYiBwb2ludHMgaW4gYXhpcyBkaXJlY3Rpb24sIGZpbmdlcnMgY3VybGluZyBpbmRpY2F0ZSByb3RhdGlvblxyXG4gICAgICogVGhlIHJvdGF0aW9uIGlzIGFwcGVuZGVkIHRvIGFscmVhZHkgYXBwbGllZCB0cmFuc2Zvcm1zLCB0aHVzIG11bHRpcGxpZWQgZnJvbSB0aGUgcmlnaHQuIFNldCBfZnJvbUxlZnQgdG8gdHJ1ZSB0byBzd2l0Y2ggYW5kIHB1dCBpdCBpbiBmcm9udC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJvdGF0ZShfYnk6IFZlY3RvcjMsIF9mcm9tTGVmdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG10eFJvdGF0aW9uOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT04oX2J5KTtcclxuICAgICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgX2Zyb21MZWZ0KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4Um90YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSByb3RhdGlvbiBhcm91bmQgdGhlIHgtYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJvdGF0ZVgoX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIsIF9mcm9tTGVmdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG10eFJvdGF0aW9uOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT05fWChfYW5nbGVJbkRlZ3JlZXMpO1xyXG4gICAgICB0aGlzLm11bHRpcGx5KG10eFJvdGF0aW9uLCBfZnJvbUxlZnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSb3RhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHJvdGF0aW9uIGFyb3VuZCB0aGUgeS1heGlzIHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlWShfYW5nbGVJbkRlZ3JlZXM6IG51bWJlciwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTl9ZKF9hbmdsZUluRGVncmVlcyk7XHJcbiAgICAgIHRoaXMubXVsdGlwbHkobXR4Um90YXRpb24sIF9mcm9tTGVmdCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJvdGF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgcm90YXRpb24gYXJvdW5kIHRoZSB6LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3RhdGVaKF9hbmdsZUluRGVncmVlczogbnVtYmVyLCBfZnJvbUxlZnQ6IGJvb2xlYW4gPSBmYWxzZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtdHhSb3RhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OX1ooX2FuZ2xlSW5EZWdyZWVzKTtcclxuICAgICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgX2Zyb21MZWZ0KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4Um90YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdHMgdGhlIHJvdGF0aW9uIG9mIHRoaXMgbWF0cml4IHRvIHBvaW50IHRoZSB6LWF4aXMgZGlyZWN0bHkgYXQgdGhlIGdpdmVuIHRhcmdldCBhbmQgdGlsdHMgaXQgdG8gYWNjb3JkIHdpdGggdGhlIGdpdmVuIHVwLXtAbGluayBWZWN0b3IzfSxcclxuICAgICAqIHJlc3BlY3RpdmVseSBjYWxjdWxhdGluZyB5YXcgYW5kIHBpdGNoLiBJZiBubyB1cC17QGxpbmsgVmVjdG9yM30gaXMgZ2l2ZW4sIHRoZSBwcmV2aW91cyB1cC17QGxpbmsgVmVjdG9yM30gaXMgdXNlZC4gXHJcbiAgICAgKiBUaGUgcGl0Y2ggbWF5IGJlIHJlc3RyaWN0ZWQgdG8gdGhlIHVwLXZlY3RvciB0byBvbmx5IGNhbGN1bGF0ZSB5YXcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb29rQXQoX3RhcmdldDogVmVjdG9yMywgX3VwPzogVmVjdG9yMywgX3Jlc3RyaWN0OiBib29sZWFuID0gZmFsc2UpOiBNYXRyaXg0eDQge1xyXG4gICAgICBfdXAgPSBfdXAgPyBWZWN0b3IzLk5PUk1BTElaQVRJT04oX3VwKSA6IFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLnVwKTtcclxuXHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfQVQodGhpcy50cmFuc2xhdGlvbiwgX3RhcmdldCwgX3VwLCBfcmVzdHJpY3QpO1xyXG4gICAgICBtdHhSZXN1bHQuc2NhbGUodGhpcy5zY2FsaW5nKTtcclxuICAgICAgdGhpcy5zZXQobXR4UmVzdWx0LmRhdGEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSZXN1bHQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdHMgdGhlIHJvdGF0aW9uIG9mIHRoaXMgbWF0cml4IHRvIGFsaWduIHRoZSB6LWF4aXMgd2l0aCB0aGUgZ2l2ZW4gZGlyZWN0aW9uIGFuZCB0aWx0cyBpdCB0byBhY2NvcmQgd2l0aCB0aGUgZ2l2ZW4gdXAte0BsaW5rIFZlY3RvcjN9LlxyXG4gICAgICogVXAgc2hvdWxkIGJlIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGdpdmVuIGRpcmVjdGlvbi4gSWYgbm8gdXAtdmVjdG9yIGlzIHByb3ZpZGVkLCAoMCwgMSwgMCkgaXMgdXNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvb2tJbihfZGlyZWN0aW9uOiBWZWN0b3IzLCBfdXA6IFZlY3RvcjMgPSBWZWN0b3IzLlkoKSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfSU4odGhpcy50cmFuc2xhdGlvbiwgX2RpcmVjdGlvbiwgX3VwKTtcclxuICAgICAgbXR4UmVzdWx0LnNjYWxlKHRoaXMuc2NhbGluZyk7XHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTYW1lIGFzIHtAbGluayBNYXRyaXg0eDQubG9va0F0fSwgYnV0IG9wdGltaXplZCBhbmQgbmVlZHMgdGVzdGluZ1xyXG4gICAgICovXHJcbiAgICAvLyBUT0RPOiB0ZXN0aW5nIGxvb2thdCB0aGF0IHJlYWxseSBqdXN0IHJvdGF0ZXMgdGhlIG1hdHJpeCByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmVcclxuICAgIC8vIHB1YmxpYyBsb29rQXRSb3RhdGUoX3RhcmdldDogVmVjdG9yMywgX3VwPzogVmVjdG9yMywgX3ByZXNlcnZlU2NhbGluZzogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIC8vICAgaWYgKCFfdXApXHJcbiAgICAvLyAgICAgX3VwID0gdGhpcy5nZXRZKCk7XHJcblxyXG4gICAgLy8gICBsZXQgc2NhbGluZzogVmVjdG9yMyA9IHRoaXMuc2NhbGluZztcclxuICAgIC8vICAgbGV0IGRpZmZlcmVuY2U6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX3RhcmdldCwgdGhpcy50cmFuc2xhdGlvbik7XHJcbiAgICAvLyAgIGRpZmZlcmVuY2Uubm9ybWFsaXplKCk7XHJcbiAgICAvLyAgIGxldCBjb3M6IG51bWJlciA9IFZlY3RvcjMuRE9UKFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLmdldFooKSksIGRpZmZlcmVuY2UpO1xyXG4gICAgLy8gICBsZXQgc2luOiBudW1iZXIgPSBWZWN0b3IzLkRPVChWZWN0b3IzLk5PUk1BTElaQVRJT04odGhpcy5nZXRYKCkpLCBkaWZmZXJlbmNlKTtcclxuICAgIC8vICAgLy8gY29uc29sZS5sb2coc2luLCBjb3MpO1xyXG4gICAgLy8gICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IFJlY3ljbGVyLmdldChNYXRyaXg0eDQpO1xyXG4gICAgLy8gICBtdHhSb3RhdGlvbi5kYXRhLnNldChbXHJcbiAgICAvLyAgICAgY29zLCAwLCAtc2luLCAwLFxyXG4gICAgLy8gICAgIDAsIDEsIDAsIDAsXHJcbiAgICAvLyAgICAgc2luLCAwLCBjb3MsIDAsXHJcbiAgICAvLyAgICAgMCwgMCwgMCwgMVxyXG4gICAgLy8gICBdKTtcclxuICAgIC8vICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgZmFsc2UpO1xyXG5cclxuICAgIC8vICAgY29zID0gVmVjdG9yMy5ET1QoVmVjdG9yMy5OT1JNQUxJWkFUSU9OKHRoaXMuZ2V0WigpKSwgZGlmZmVyZW5jZSk7XHJcbiAgICAvLyAgIHNpbiA9IC1WZWN0b3IzLkRPVChWZWN0b3IzLk5PUk1BTElaQVRJT04odGhpcy5nZXRZKCkpLCBkaWZmZXJlbmNlKTtcclxuICAgIC8vICAgLy8gY29uc29sZS5sb2coc2luLCBjb3MpO1xyXG4gICAgLy8gICBtdHhSb3RhdGlvbi5kYXRhLnNldChbXHJcbiAgICAvLyAgICAgMSwgMCwgMCwgMCxcclxuICAgIC8vICAgICAwLCBjb3MsIHNpbiwgMCxcclxuICAgIC8vICAgICAwLCAtc2luLCBjb3MsIDAsXHJcbiAgICAvLyAgICAgMCwgMCwgMCwgMVxyXG4gICAgLy8gICBdKTtcclxuICAgIC8vICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgZmFsc2UpO1xyXG4gICAgLy8gICB0aGlzLnNjYWxpbmcgPSBzY2FsaW5nO1xyXG4gICAgLy8gICBSZWN5Y2xlci5zdG9yZShtdHhSb3RhdGlvbik7XHJcbiAgICAvLyB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2NhbGluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgc2NhbGluZyBieSB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjN9IHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX2J5OiBWZWN0b3IzKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4U2NhbGluZzogTWF0cml4NHg0ID0gTWF0cml4NHg0LlNDQUxJTkcoX2J5KTtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLCBtdHhTY2FsaW5nKTtcclxuICAgICAgdGhpcy5zZXQobXR4UmVzdWx0LmRhdGEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKG10eFNjYWxpbmcsIG10eFJlc3VsdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHgtYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWChfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfYnksIDEsIDEpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHktYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWShfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldCgxLCBfYnksIDEpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHotYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWihfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldCgxLCAxLCBfYnkpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZm9ybWF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShfbWF0cml4OiBNYXRyaXg0eDQsIF9mcm9tTGVmdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBfZnJvbUxlZnQgPyBNYXRyaXg0eDQuUFJPRFVDVChfbWF0cml4LCB0aGlzKSA6IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMsIF9tYXRyaXgpO1xyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICAvLyBwdWJsaWMgZ2V0RXVsZXJBbmdsZXNOZXcoKTogVmVjdG9yMyB7XHJcbiAgICAvLyAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5zY2FsaW5nO1xyXG5cclxuICAgIC8vICAgbGV0IHRoZXRhWDogbnVtYmVyLCB0aGV0YVk6IG51bWJlciwgdGhldGFaOiBudW1iZXI7XHJcbiAgICAvLyAgIGxldCByMDI6IG51bWJlciA9IHRoaXMuZGF0YVsyXSAvIHNjYWxpbmcuejtcclxuICAgIC8vICAgbGV0IHIxMTogbnVtYmVyID0gdGhpcy5kYXRhWzVdIC8gc2NhbGluZy55O1xyXG5cclxuICAgIC8vICAgaWYgKHIwMiA8IDEpIHtcclxuICAgIC8vICAgICBpZiAocjAyID4gLTEpIHtcclxuICAgIC8vICAgICAgIHRoZXRhWSA9IE1hdGguYXNpbigtcjAyKTtcclxuICAgIC8vICAgICAgIHRoZXRhWiA9IE1hdGguYXRhbjIodGhpcy5kYXRhWzFdIC8gc2NhbGluZy55LCB0aGlzLmRhdGFbMF0gLyBzY2FsaW5nLngpO1xyXG4gICAgLy8gICAgICAgdGhldGFYID0gTWF0aC5hdGFuMih0aGlzLmRhdGFbOV0gLyBzY2FsaW5nLnosIHRoaXMuZGF0YVsxMF0gLyBzY2FsaW5nLnopO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBlbHNlIHtcclxuICAgIC8vICAgICAgIHRoZXRhWSA9IE1hdGguUEkgLyAyO1xyXG4gICAgLy8gICAgICAgdGhldGFaID0gLU1hdGguYXRhbjIodGhpcy5kYXRhWzZdIC8gc2NhbGluZy55LCByMTEpO1xyXG4gICAgLy8gICAgICAgdGhldGFYID0gMDtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgZWxzZSB7XHJcbiAgICAvLyAgICAgdGhldGFZID0gLU1hdGguUEkgLyAyO1xyXG4gICAgLy8gICAgIHRoZXRhWiA9IE1hdGguYXRhbjIoLXRoaXMuZGF0YVs2XSAvIHNjYWxpbmcueSwgcjExKTtcclxuICAgIC8vICAgICB0aGV0YVggPSAwO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHRoaXMuI2V1bGVyQW5nbGVzLnNldCgtdGhldGFYLCB0aGV0YVksIHRoZXRhWik7XHJcbiAgICAvLyAgIHRoaXMuI2V1bGVyQW5nbGVzLnNjYWxlKE1hdGhlbWF0aWMucmFkMmRlZyk7XHJcblxyXG4gICAgLy8gICByZXR1cm4gdGhpcy4jZXVsZXJBbmdsZXM7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGlzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX2FycmF5OiBBcnJheUxpa2U8bnVtYmVyPik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoX2FycmF5KTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gbWF0cml4IGludG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgdGhpcy5kYXRhLnNldChfb3JpZ2luYWwuZGF0YSk7XHJcbiAgICAgIHRoaXMuI3RyYW5zbGF0aW9uRGlydHkgPSBfb3JpZ2luYWwuI3RyYW5zbGF0aW9uRGlydHk7XHJcbiAgICAgIHRoaXMuI3JvdGF0aW9uRGlydHkgPSBfb3JpZ2luYWwuI3JvdGF0aW9uRGlydHk7XHJcbiAgICAgIHRoaXMuI3NjYWxpbmdEaXJ0eSA9IF9vcmlnaW5hbC4jc2NhbGluZ0RpcnR5O1xyXG4gICAgICB0aGlzLiNxdWF0ZXJuaW9uRGlydHkgPSBfb3JpZ2luYWwuI3F1YXRlcm5pb25EaXJ0eTtcclxuICAgICAgaWYgKCF0aGlzLiN0cmFuc2xhdGlvbkRpcnR5KVxyXG4gICAgICAgIHRoaXMuI3RyYW5zbGF0aW9uLmNvcHkoX29yaWdpbmFsLiN0cmFuc2xhdGlvbik7XHJcbiAgICAgIGlmICghdGhpcy4jcm90YXRpb25EaXJ0eSlcclxuICAgICAgICB0aGlzLiNyb3RhdGlvbi5jb3B5KF9vcmlnaW5hbC4jcm90YXRpb24pO1xyXG4gICAgICBpZiAoIXRoaXMuI3NjYWxpbmdEaXJ0eSlcclxuICAgICAgICB0aGlzLiNzY2FsaW5nLmNvcHkoX29yaWdpbmFsLiNzY2FsaW5nKTtcclxuICAgICAgaWYgKCF0aGlzLiNxdWF0ZXJuaW9uRGlydHkpXHJcbiAgICAgICAgdGhpcy4jcXVhdGVybmlvbi5jb3B5KF9vcmlnaW5hbC4jcXVhdGVybmlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgxpIuTWF0cml4NHg0KHRyYW5zbGF0aW9uOiAke3RoaXMudHJhbnNsYXRpb24udG9TdHJpbmcoKX0sIHJvdGF0aW9uOiAke3RoaXMucm90YXRpb24udG9TdHJpbmcoKX0sIHNjYWxpbmc6ICR7dGhpcy5zY2FsaW5nLnRvU3RyaW5nKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIC8vIFRPRE86IG9wdGltaXphdGlvbiwgaXQgc2hvdWxkbid0IGFsd2F5cyByZXR1cm4gYSBjb3B5LCBzaW5jZSB0aGlzIGJsb2F0cyBtZW1vcnlcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB4LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFgoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0sIHRoaXMuZGF0YVsyXSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB5LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFkoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzRdLCB0aGlzLmRhdGFbNV0sIHRoaXMuZGF0YVs2XSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB6LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFooKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzhdLCB0aGlzLmRhdGFbOV0sIHRoaXMuZGF0YVsxMF0pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3dhcHMgdGhlIHR3byBjYXJkaW5hbCBheGlzIGFuZCByZXZlcnNlcyB0aGUgdGhpcmQsIGVmZmVjdGl2ZWx5IHJvdGF0aW5nIHRoZSB0cmFuc2Zvcm0gMTgwIGRlZ3JlZXMgYXJvdW5kIG9uZSBhbmQgOTAgZGVncmVlcyBhcm91bmQgYSBzZWNvbmQgYXhpc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3dhcFhZKCk6IHZvaWQge1xyXG4gICAgICBsZXQgdGVtcDogbnVtYmVyW10gPSBbdGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0sIHRoaXMuZGF0YVsyXV07IC8vIHN0b3JlIHgtYXhpc1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KFt0aGlzLmRhdGFbNF0sIHRoaXMuZGF0YVs1XSwgdGhpcy5kYXRhWzZdXSwgMCk7IC8vIG92ZXJ3cml0ZSB4LWF4aXMgd2l0aCB5LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldCh0ZW1wLCA0KTsgLy8gb3ZlcndyaXRlIFkgd2l0aCB0ZW1wXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoWy10aGlzLmRhdGFbOF0sIC10aGlzLmRhdGFbOV0sIC10aGlzLmRhdGFbMTBdXSwgOCk7IC8vIHJldmVyc2Ugei1heGlzXHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTd2FwcyB0aGUgdHdvIGNhcmRpbmFsIGF4aXMgYW5kIHJldmVyc2VzIHRoZSB0aGlyZCwgZWZmZWN0aXZlbHkgcm90YXRpbmcgdGhlIHRyYW5zZm9ybSAxODAgZGVncmVlcyBhcm91bmQgb25lIGFuZCA5MCBkZWdyZWVzIGFyb3VuZCBhIHNlY29uZCBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzd2FwWFooKTogdm9pZCB7XHJcbiAgICAgIGxldCB0ZW1wOiBudW1iZXJbXSA9IFt0aGlzLmRhdGFbMF0sIHRoaXMuZGF0YVsxXSwgdGhpcy5kYXRhWzJdXTsgLy8gc3RvcmUgeC1heGlzXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoW3RoaXMuZGF0YVs4XSwgdGhpcy5kYXRhWzldLCB0aGlzLmRhdGFbMTBdXSwgMCk7IC8vIG92ZXJ3cml0ZSB4LWF4aXMgd2l0aCB6LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldCh0ZW1wLCA4KTsgLy8gb3ZlcndyaXRlIFogd2l0aCB0ZW1wXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoWy10aGlzLmRhdGFbNF0sIC10aGlzLmRhdGFbNV0sIC10aGlzLmRhdGFbNl1dLCA0KTsgLy8gcmV2ZXJzZSB5LWF4aXNcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN3YXBzIHRoZSB0d28gY2FyZGluYWwgYXhpcyBhbmQgcmV2ZXJzZXMgdGhlIHRoaXJkLCBlZmZlY3RpdmVseSByb3RhdGluZyB0aGUgdHJhbnNmb3JtIDE4MCBkZWdyZWVzIGFyb3VuZCBvbmUgYW5kIDkwIGRlZ3JlZXMgYXJvdW5kIGEgc2Vjb25kIGF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN3YXBZWigpOiB2b2lkIHtcclxuICAgICAgbGV0IHRlbXA6IG51bWJlcltdID0gW3RoaXMuZGF0YVs0XSwgdGhpcy5kYXRhWzVdLCB0aGlzLmRhdGFbNl1dOyAvLyBzdG9yZSB5LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldChbdGhpcy5kYXRhWzhdLCB0aGlzLmRhdGFbOV0sIHRoaXMuZGF0YVsxMF1dLCA0KTsgLy8gb3ZlcndyaXRlIHktYXhpcyB3aXRoIHotYXhpc1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KHRlbXAsIDgpOyAvLyBvdmVyd3JpdGUgWiB3aXRoIHRlbXBcclxuICAgICAgdGhpcy5kYXRhLnNldChbLXRoaXMuZGF0YVswXSwgLXRoaXMuZGF0YVsxXSwgLXRoaXMuZGF0YVsyXV0sIDApOyAvLyByZXZlcnNlIHgtYXhpc1xyXG4gICAgICB0aGlzLnJlc2V0Q2FjaGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRyYW5sYXRpb24gZnJvbSB0aGlzIG1hdHJpeCB0byB0aGUgdGFyZ2V0IG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VHJhbnNsYXRpb25UbyhfbXR4VGFyZ2V0OiBNYXRyaXg0eDQpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGRpZmZlcmVuY2U6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIGRpZmZlcmVuY2Uuc2V0KF9tdHhUYXJnZXQuZGF0YVsxMl0gLSB0aGlzLmRhdGFbMTJdLCBfbXR4VGFyZ2V0LmRhdGFbMTNdIC0gdGhpcy5kYXRhWzEzXSwgX210eFRhcmdldC5kYXRhWzE0XSAtIHRoaXMuZGF0YVsxNF0pO1xyXG4gICAgICByZXR1cm4gZGlmZmVyZW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICAvLyB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IHRoaXMudHJhbnNsYXRpb24uc2VyaWFsaXplKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24uc2VyaWFsaXplKCksXHJcbiAgICAgICAgc2NhbGluZzogdGhpcy5zY2FsaW5nLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IGF3YWl0IHRoaXMudHJhbnNsYXRpb24uZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24udHJhbnNsYXRpb24pLFxyXG4gICAgICAgIHJvdGF0aW9uOiBhd2FpdCB0aGlzLnJvdGF0aW9uLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnJvdGF0aW9uKSxcclxuICAgICAgICBzY2FsaW5nOiBhd2FpdCB0aGlzLnNjYWxpbmcuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uc2NhbGluZylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5tdXRhdGUobXV0YXRvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBpZiAodGhpcy5tdXRhdG9yKVxyXG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0b3I7XHJcblxyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICB0cmFuc2xhdGlvbjogdGhpcy50cmFuc2xhdGlvbi5nZXRNdXRhdG9yKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24uZ2V0TXV0YXRvcigpLFxyXG4gICAgICAgIHNjYWxpbmc6IHRoaXMuc2NhbGluZy5nZXRNdXRhdG9yKClcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGNhY2hlIG11dGF0b3JcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvcjtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBtOiBGbG9hdDMyQXJyYXkgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICBpZiAoX211dGF0b3IudHJhbnNsYXRpb24pIHtcclxuICAgICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSB0aGlzLnRyYW5zbGF0aW9uO1xyXG4gICAgICAgIHRyYW5zbGF0aW9uLm11dGF0ZShfbXV0YXRvci50cmFuc2xhdGlvbik7XHJcbiAgICAgICAgbVsxMl0gPSB0cmFuc2xhdGlvbi54OyBtWzEzXSA9IHRyYW5zbGF0aW9uLnk7IG1bMTRdID0gdHJhbnNsYXRpb24uejtcclxuICAgICAgICB0aGlzLiN0cmFuc2xhdGlvbkRpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfbXV0YXRvci5yb3RhdGlvbiB8fCBfbXV0YXRvci5zY2FsaW5nKSB7XHJcbiAgICAgICAgLy8gVE9ETzogbWFrZSBmdWxsIHZlY3RvciBhbmQgcXVhdGVybmlvbiBtdXRhdG9ycyBtYW5kYXRvcnk/XHJcblxyXG4gICAgICAgIGxldCByb3RhdGlvbjogVmVjdG9yMyB8IFF1YXRlcm5pb24gPSBfbXV0YXRvci5yb3RhdGlvbj8udyAhPSB1bmRlZmluZWQgP1xyXG4gICAgICAgICAgdGhpcy4jcXVhdGVybmlvbiA6IC8vIHVzaW5nIHRoaXMuI3F1YXRlcm5pb24gYXNzdW1lcyB3ZSBnZXQgYSBmdWxsIHF1YXRlcm5pb24gbXV0YXRvciB3aXRoIHgsIHksIHogYW5kIHcgc2V0IHNvIHdlIG5ldmVyIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHF1YXRlcm5pb24gaGVyZS4gVGhpcyBtaWdodCBjYXVzZSB0cm91YmxlIGlmIHdlIGV2ZXIgd2FudCB0byBtdXRhdGUgb25seSBhIHBhcnQgb2YgYSBxdWF0ZXJuaW9uLi4uXHJcbiAgICAgICAgICBpc0Z1bGxWZWN0b3JNdXRhdG9yKF9tdXRhdG9yLnJvdGF0aW9uKSA/IHRoaXMuI3JvdGF0aW9uIDogdGhpcy5yb3RhdGlvbjsgLy8gaGFjayB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWNhbGN1bGF0aW9uIG9mIHJvdGF0aW9uIGFuZCBzY2FsaW5nLiBUaGlzIHJlY2FsY3VsYXRpb24gaXMgdW5uZWNlc3Nhcnkgd2hlbiB3ZSBnZXQgYSBmdWxsIG11dGF0b3IgaS5lLiB3aXRoIHgsIHkgYW5kIHogc2V0XHJcblxyXG4gICAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gaXNGdWxsVmVjdG9yTXV0YXRvcihfbXV0YXRvci5zY2FsaW5nKSA/IHRoaXMuI3NjYWxpbmcgOiB0aGlzLnNjYWxpbmc7XHJcblxyXG4gICAgICAgIGlmIChfbXV0YXRvci5yb3RhdGlvbilcclxuICAgICAgICAgIHJvdGF0aW9uLm11dGF0ZShfbXV0YXRvci5yb3RhdGlvbik7XHJcblxyXG4gICAgICAgIGlmIChfbXV0YXRvci5zY2FsaW5nKVxyXG4gICAgICAgICAgc2NhbGluZy5tdXRhdGUoX211dGF0b3Iuc2NhbGluZyk7XHJcblxyXG4gICAgICAgIE1hdHJpeDR4NC5zZXRSb3RhdGlvbihtLCByb3RhdGlvbik7XHJcbiAgICAgICAgY29uc3QgaXNFdWxlclJvdGF0aW9uOiBib29sZWFuID0gcm90YXRpb24gaW5zdGFuY2VvZiBWZWN0b3IzO1xyXG4gICAgICAgIHRoaXMuI3JvdGF0aW9uRGlydHkgPSAhaXNFdWxlclJvdGF0aW9uO1xyXG4gICAgICAgIHRoaXMuI3F1YXRlcm5pb25EaXJ0eSA9IGlzRXVsZXJSb3RhdGlvbjtcclxuXHJcbiAgICAgICAgY29uc3Qgc3g6IG51bWJlciA9IHNjYWxpbmcueCwgc3k6IG51bWJlciA9IHNjYWxpbmcueSwgc3o6IG51bWJlciA9IHNjYWxpbmcuejtcclxuICAgICAgICBtWzBdICo9IHN4OyBtWzFdICo9IHN4OyBtWzJdICo9IHN4O1xyXG4gICAgICAgIG1bNF0gKj0gc3k7IG1bNV0gKj0gc3k7IG1bNl0gKj0gc3k7XHJcbiAgICAgICAgbVs4XSAqPSBzejsgbVs5XSAqPSBzejsgbVsxMF0gKj0gc3o7XHJcbiAgICAgICAgdGhpcy4jc2NhbGluZ0RpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcblxyXG4gICAgICBmdW5jdGlvbiBpc0Z1bGxWZWN0b3JNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIF9tdXRhdG9yICYmIF9tdXRhdG9yLnggIT0gdW5kZWZpbmVkICYmIF9tdXRhdG9yLnkgIT0gdW5kZWZpbmVkICYmIF9tdXRhdG9yLnogIT0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGlmIChfbXV0YXRvci50cmFuc2xhdGlvbikgdHlwZXMudHJhbnNsYXRpb24gPSBcIlZlY3RvcjNcIjtcclxuICAgICAgaWYgKF9tdXRhdG9yLnJvdGF0aW9uKSB0eXBlcy5yb3RhdGlvbiA9IFwiVmVjdG9yM1wiO1xyXG4gICAgICBpZiAoX211dGF0b3Iuc2NhbGluZykgdHlwZXMuc2NhbGluZyA9IFwiVmVjdG9yM1wiO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldENhY2hlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLiN0cmFuc2xhdGlvbkRpcnR5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy4jcm90YXRpb25EaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMuI3F1YXRlcm5pb25EaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMuI3NjYWxpbmdEaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIE5vaXNlMiwgTm9pc2UzIGFuZCBOb2lzZTRcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5vaXNlIHtcclxuICAgIHByb3RlY3RlZCBwZXJtOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoNTEyKTtcclxuICAgIHByb3RlY3RlZCBwZXJtTW9kMTI6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSg1MTIpO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb20gdmFsdWUgYmV0d2VlbiAtMSBhbmQgMSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcG9zaXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic3RyYWN0IHNhbXBsZTogKC4uLl9hcmdzOiBudW1iZXJbXSkgPT4gbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIGNvbnN0IHA6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgyNTYpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMjU2OyBpKyspXHJcbiAgICAgICAgcFtpXSA9IGk7XHJcblxyXG4gICAgICBsZXQgbjogbnVtYmVyO1xyXG4gICAgICBsZXQgcTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAyNTU7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgICBuID0gTWF0aC5mbG9vcigoaSArIDEpICogX3JhbmRvbSgpKTtcclxuICAgICAgICBxID0gcFtpXTtcclxuICAgICAgICBwW2ldID0gcFtuXTtcclxuICAgICAgICBwW25dID0gcTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDUxMjsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5wZXJtW2ldID0gcFtpICYgMjU1XTtcclxuICAgICAgICB0aGlzLnBlcm1Nb2QxMltpXSA9IHRoaXMucGVybVtpXSAlIDEyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCIuL05vaXNlLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICogZG9uZSBieSBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqXHJcbiAgICogQmFzZWQgb24gZXhhbXBsZSBjb2RlIGJ5IFN0ZWZhbiBHdXN0YXZzb24gKHN0ZWd1QGl0bi5saXUuc2UpLlxyXG4gICAqIE9wdGltaXNhdGlvbnMgYnkgUGV0ZXIgRWFzdG1hbiAocGVhc3RtYW5AZHJpenpsZS5zdGFuZm9yZC5lZHUpLlxyXG4gICAqIEJldHRlciByYW5rIG9yZGVyaW5nIG1ldGhvZCBieSBTdGVmYW4gR3VzdGF2c29uIGluIDIwMTIuXHJcbiAgICpcclxuICAgKiBUaGlzIGNvZGUgd2FzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSBpdHMgb3JpZ2luYWwgYXV0aG9yLFxyXG4gICAqIFN0ZWZhbiBHdXN0YXZzb24uIFlvdSBtYXkgdXNlIGl0IGFzIHlvdSBzZWUgZml0LCBidXRcclxuICAgKiBhdHRyaWJ1dGlvbiBpcyBhcHByZWNpYXRlZC5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTm9pc2UyIGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAoMy4wIC0gTWF0aC5zcXJ0KDMuMCkpIC8gNi4wO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JhZGllbnQ6IG51bWJlcltdW10gPSBbWzEsIDFdLCBbLTEsIDFdLCBbMSwgLTFdLCBbLTEsIC0xXSwgWzEsIDBdLCBbLTEsIDBdLCBbMSwgMF0sIFstMSwgMF0sIFswLCAxXSwgWzAsIC0xXSwgWzAsIDFdLCBbMCwgLTFdXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIpID0+IHtcclxuICAgICAgICAvLyBTa2V3IHRoZSBpbnB1dCBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggc2ltcGxleCBjZWxsIHdlJ3JlIGluXHJcbiAgICAgICAgY29uc3QgczogbnVtYmVyID0gKF94ICsgX3kpICogMC41ICogKE1hdGguc3FydCgzLjApIC0gMS4wKTsgLy8gSGFpcnkgZmFjdG9yIGZvciAyRFxyXG4gICAgICAgIGNvbnN0IGk6IG51bWJlciA9IE1hdGguZmxvb3IoX3ggKyBzKTtcclxuICAgICAgICBjb25zdCBqOiBudW1iZXIgPSBNYXRoLmZsb29yKF95ICsgcyk7XHJcbiAgICAgICAgY29uc3QgdDogbnVtYmVyID0gKGkgKyBqKSAqIE5vaXNlMi5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgWDA6IG51bWJlciA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSkgc3BhY2VcclxuICAgICAgICBjb25zdCBZMDogbnVtYmVyID0gaiAtIHQ7XHJcbiAgICAgICAgY29uc3QgeDA6IG51bWJlciA9IF94IC0gWDA7IC8vIFRoZSB4LHkgZGlzdGFuY2VzIGZyb20gdGhlIGNlbGwgb3JpZ2luXHJcbiAgICAgICAgY29uc3QgeTA6IG51bWJlciA9IF95IC0gWTA7XHJcblxyXG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBzaW1wbGV4IHdlIGFyZSBpbi5cclxuICAgICAgICBjb25zdCBpMTogbnVtYmVyID0geDAgPiB5MCA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGoxOiBudW1iZXIgPSB4MCA+IHkwID8gMCA6IDE7XHJcblxyXG4gICAgICAgIC8vIE9mZnNldDpudW1iZXJzIGZvciBjb3JuZXJzXHJcbiAgICAgICAgY29uc3QgeDE6IG51bWJlciA9IHgwIC0gaTEgKyBOb2lzZTIub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHkxOiBudW1iZXIgPSB5MCAtIGoxICsgTm9pc2UyLm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MjogbnVtYmVyID0geDAgLSAxLjAgKyAyLjAgKiBOb2lzZTIub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHkyOiBudW1iZXIgPSB5MCAtIDEuMCArIDIuMCAqIE5vaXNlMi5vZmZzZXQ7XHJcblxyXG4gICAgICAgIC8vIFdvcmsgb3V0IHRoZSBoYXNoZWQgZ3JhZGllbnQgaW5kaWNlcyBvZiB0aGUgdGhyZWUgc2ltcGxleCBjb3JuZXJzXHJcbiAgICAgICAgY29uc3QgaWk6IG51bWJlciA9IGkgJiAyNTU7XHJcbiAgICAgICAgY29uc3Qgamo6IG51bWJlciA9IGogJiAyNTU7XHJcbiAgICAgICAgY29uc3QgZzA6IG51bWJlcltdID0gTm9pc2UyLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgdGhpcy5wZXJtW2pqXV1dO1xyXG4gICAgICAgIGNvbnN0IGcxOiBudW1iZXJbXSA9IE5vaXNlMi5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIGkxICsgdGhpcy5wZXJtW2pqICsgajFdXV07XHJcbiAgICAgICAgY29uc3QgZzI6IG51bWJlcltdID0gTm9pc2UyLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgMSArIHRoaXMucGVybVtqaiArIDFdXV07XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgY29udHJpYnV0aW9uIGZyb20gdGhlIHRocmVlIGNvcm5lcnNcclxuICAgICAgICBjb25zdCB0MDogbnVtYmVyID0gMC41IC0geDAgKiB4MCAtIHkwICogeTA7XHJcbiAgICAgICAgY29uc3QgbjA6IG51bWJlciA9IHQwIDwgMCA/IDAuMCA6IE1hdGgucG93KHQwLCA0KSAqIChnMFswXSAqIHgwICsgZzBbMV0gKiB5MCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHQxOiBudW1iZXIgPSAwLjUgLSB4MSAqIHgxIC0geTEgKiB5MTtcclxuICAgICAgICBjb25zdCBuMTogbnVtYmVyID0gdDEgPCAwID8gMC4wIDogTWF0aC5wb3codDEsIDQpICogKGcxWzBdICogeDEgKyBnMVsxXSAqIHkxKTtcclxuXHJcbiAgICAgICAgY29uc3QgdDI6IG51bWJlciA9IDAuNSAtIHgyICogeDIgLSB5MiAqIHkyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDAgPyAwLjAgOiBNYXRoLnBvdyh0MiwgNCkgKiAoZzJbMF0gKiB4MiArIGcyWzFdICogeTIpO1xyXG5cclxuICAgICAgICAvLyBBZGQgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggY29ybmVyIHRvIGdldCB0aGUgZmluYWwgbm9pc2UgdmFsdWUuXHJcbiAgICAgICAgLy8gVGhlIHJlc3VsdCBpcyBzY2FsZWQgdG8gcmV0dXJuIHZhbHVlcyBpbiB0aGUgaW50ZXJ2YWwgWy0xLCAxXVxyXG4gICAgICAgIHJldHVybiA3MC4xNDgwNTc3MDY1Mzk1MiAqIChuMCArIG4xICsgbjIpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzYW1wbGUgPSAoX3g6IG51bWJlciwgX3k6IG51bWJlcik6IG51bWJlciA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzYW1wbGUoX3gsIF95KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogVGhpcyBpcyBhbiBhZGFwdGlvbiBvZiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9mYXN0LXNpbXBsZXgtbm9pc2VcclxuICAgKiBkb25lIGJ5IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICpcclxuICAgKiBCYXNlZCBvbiBleGFtcGxlIGNvZGUgYnkgU3RlZmFuIEd1c3RhdnNvbiAoc3RlZ3VAaXRuLmxpdS5zZSkuXHJcbiAgICogT3B0aW1pc2F0aW9ucyBieSBQZXRlciBFYXN0bWFuIChwZWFzdG1hbkBkcml6emxlLnN0YW5mb3JkLmVkdSkuXHJcbiAgICogQmV0dGVyIHJhbmsgb3JkZXJpbmcgbWV0aG9kIGJ5IFN0ZWZhbiBHdXN0YXZzb24gaW4gMjAxMi5cclxuICAgKlxyXG4gICAqIFRoaXMgY29kZSB3YXMgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IGl0cyBvcmlnaW5hbCBhdXRob3IsXHJcbiAgICogU3RlZmFuIEd1c3RhdnNvbi4gWW91IG1heSB1c2UgaXQgYXMgeW91IHNlZSBmaXQsIGJ1dFxyXG4gICAqIGF0dHJpYnV0aW9uIGlzIGFwcHJlY2lhdGVkLlxyXG4gICAqL1xyXG4gIC8vIFRPRE86IFRlc3RcclxuICBleHBvcnQgY2xhc3MgTm9pc2UzIGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAxLjAgLyA2LjA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBncmFkaWVudDogbnVtYmVyW11bXSA9IFtbMSwgMSwgMF0sIFstMSwgMSwgMF0sIFsxLCAtMSwgMF0sIFstMSwgLTEsIDBdLCBbMSwgMCwgMV0sIFstMSwgMCwgMV0sIFsxLCAwLCAtMV0sIFstMSwgMCwgLTFdLCBbMCwgMSwgMV0sIFswLCAtMSwgLTFdLCBbMCwgMSwgLTFdLCBbMCwgLTEsIC0xXVxyXG4gICAgXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIpID0+IHtcclxuICAgICAgICAvLyBTa2V3IHRoZSBpbnB1dCBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggc2ltcGxleCBjZWxsIHdlJ3JlIGluXHJcbiAgICAgICAgY29uc3QgczogbnVtYmVyID0gKF94ICsgX3kgKyBfeikgLyAzLjA7IC8vIFZlcnkgbmljZSBhbmQgc2ltcGxlIHNrZXcgZmFjdG9yIGZvciAzRFxyXG4gICAgICAgIGNvbnN0IGk6IG51bWJlciA9IE1hdGguZmxvb3IoX3ggKyBzKTtcclxuICAgICAgICBjb25zdCBqOiBudW1iZXIgPSBNYXRoLmZsb29yKF95ICsgcyk7XHJcbiAgICAgICAgY29uc3QgazogbnVtYmVyID0gTWF0aC5mbG9vcihfeiArIHMpO1xyXG4gICAgICAgIGNvbnN0IHQ6IG51bWJlciA9IChpICsgaiArIGspICogTm9pc2UzLm9mZnNldDtcclxuICAgICAgICBjb25zdCBYMDogbnVtYmVyID0gaSAtIHQ7IC8vIFVuc2tldyB0aGUgY2VsbCBvcmlnaW4gYmFjayB0byAoeCx5LHopIHNwYWNlXHJcbiAgICAgICAgY29uc3QgWTA6IG51bWJlciA9IGogLSB0O1xyXG4gICAgICAgIGNvbnN0IFowOiBudW1iZXIgPSBrIC0gdDtcclxuICAgICAgICBjb25zdCB4MDogbnVtYmVyID0gX3ggLSBYMDsgLy8gVGhlIHgseSx6IGRpc3RhbmNlcyBmcm9tIHRoZSBjZWxsIG9yaWdpblxyXG4gICAgICAgIGNvbnN0IHkwOiBudW1iZXIgPSBfeSAtIFkwO1xyXG4gICAgICAgIGNvbnN0IHowOiBudW1iZXIgPSBfeiAtIFowO1xyXG5cclxuICAgICAgICAvLyBEZXRlcmluZSB3aGljaCBzaW1wbGV4IHdlIGFyZSBpblxyXG4gICAgICAgIGxldCBpMTogbnVtYmVyLCBqMTogbnVtYmVyLCBrMTogbnVtYmVyIC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgb2Ygc2ltcGxleCBpbiAoaSxqLGspIGNvb3Jkc1xyXG4gICAgICAgICAgO1xyXG4gICAgICAgIGxldCBpMjogbnVtYmVyLCBqMjogbnVtYmVyLCBrMjogbnVtYmVyIC8vIE9mZnNldHMgZm9yIHRoaXJkIGNvcm5lciBvZiBzaW1wbGV4IGluIChpLGosaykgY29vcmRzXHJcbiAgICAgICAgICA7XHJcbiAgICAgICAgaWYgKHgwID49IHkwKSB7XHJcbiAgICAgICAgICBpZiAoeTAgPj0gejApIHtcclxuICAgICAgICAgICAgaTEgPSBpMiA9IGoyID0gMTtcclxuICAgICAgICAgICAgajEgPSBrMSA9IGsyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoeDAgPj0gejApIHtcclxuICAgICAgICAgICAgaTEgPSBpMiA9IGsyID0gMTtcclxuICAgICAgICAgICAgajEgPSBrMSA9IGoyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGsxID0gaTIgPSBrMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gajEgPSBqMiA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh5MCA8IHowKSB7XHJcbiAgICAgICAgICAgIGsxID0gajIgPSBrMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gajEgPSBpMiA9IDA7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHgwIDwgejApIHtcclxuICAgICAgICAgICAgajEgPSBqMiA9IGsyID0gMTtcclxuICAgICAgICAgICAgaTEgPSBrMSA9IGkyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGoxID0gaTIgPSBqMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gazEgPSBrMiA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB4MTogbnVtYmVyID0geDAgLSBpMSArIE5vaXNlMy5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5MTogbnVtYmVyID0geTAgLSBqMSArIE5vaXNlMy5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejE6IG51bWJlciA9IHowIC0gazEgKyBOb2lzZTMub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHgyOiBudW1iZXIgPSB4MCAtIGkyICsgMi4wICogTm9pc2UzLm9mZnNldDsgLy8gT2Zmc2V0cyBmb3IgdGhpcmQgY29ybmVyIGluICh4LHkseikgY29vcmRzXHJcbiAgICAgICAgY29uc3QgeTI6IG51bWJlciA9IHkwIC0gajIgKyAyLjAgKiBOb2lzZTMub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHoyOiBudW1iZXIgPSB6MCAtIGsyICsgMi4wICogTm9pc2UzLm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MzogbnVtYmVyID0geDAgLSAxLjAgKyAzLjAgKiBOb2lzZTMub2Zmc2V0OyAvLyBPZmZzZXRzIGZvciBsYXN0IGNvcm5lciBpbiAoeCx5LHopIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkzOiBudW1iZXIgPSB5MCAtIDEuMCArIDMuMCAqIE5vaXNlMy5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejM6IG51bWJlciA9IHowIC0gMS4wICsgMy4wICogTm9pc2UzLm9mZnNldDtcclxuXHJcbiAgICAgICAgLy8gV29yayA6bnVtYmVydXQgdGhlIGhhc2hlZCBncmFkaWVudCBpbmRpY2VzIG9mIHRoZSBmb3VyIHNpbXBsZXggY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IGlpOiBudW1iZXIgPSBpICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGpqOiBudW1iZXIgPSBqICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGtrOiBudW1iZXIgPSBrICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGcwOiBudW1iZXJbXSA9IE5vaXNlMy5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIHRoaXMucGVybVtqaiArIHRoaXMucGVybVtra11dXV07XHJcbiAgICAgICAgY29uc3QgZzE6IG51bWJlcltdID0gTm9pc2UzLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgaTEgKyB0aGlzLnBlcm1bamogKyBqMSArIHRoaXMucGVybVtrayArIGsxXV1dXTtcclxuICAgICAgICBjb25zdCBnMjogbnVtYmVyW10gPSBOb2lzZTMuZ3JhZGllbnRbdGhpcy5wZXJtTW9kMTJbaWkgKyBpMiArIHRoaXMucGVybVtqaiArIGoyICsgdGhpcy5wZXJtW2trICsgazJdXV1dO1xyXG4gICAgICAgIGNvbnN0IGczOiBudW1iZXJbXSA9IE5vaXNlMy5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIDEgKyB0aGlzLnBlcm1bamogKyAxICsgdGhpcy5wZXJtW2trICsgMV1dXV07XHJcblxyXG4gICAgICAgIC8vIENhbGN1Om51bWJlcmF0ZSB0aGUgY29udHJpYnV0aW9uIGZyb20gdGhlIGZvdXIgY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IHQwOiBudW1iZXIgPSAwLjUgLSB4MCAqIHgwIC0geTAgKiB5MCAtIHowICogejA7XHJcbiAgICAgICAgY29uc3QgbjA6IG51bWJlciA9IHQwIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDAsIDQpICogKGcwWzBdICogeDAgKyBnMFsxXSAqIHkwICsgZzBbMl0gKiB6MCk7XHJcbiAgICAgICAgY29uc3QgdDE6IG51bWJlciA9IDAuNSAtIHgxICogeDEgLSB5MSAqIHkxIC0gejEgKiB6MTtcclxuICAgICAgICBjb25zdCBuMTogbnVtYmVyID0gdDEgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MSwgNCkgKiAoZzFbMF0gKiB4MSArIGcxWzFdICogeTEgKyBnMVsyXSAqIHoxKTtcclxuICAgICAgICBjb25zdCB0MjogbnVtYmVyID0gMC41IC0geDIgKiB4MiAtIHkyICogeTIgLSB6MiAqIHoyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDBcclxuICAgICAgICAgID8gMC4wXHJcbiAgICAgICAgICA6IE1hdGgucG93KHQyLCA0KSAqIChnMlswXSAqIHgyICsgZzJbMV0gKiB5MiArIGcyWzJdICogejIpO1xyXG4gICAgICAgIGNvbnN0IHQzOiBudW1iZXIgPSAwLjUgLSB4MyAqIHgzIC0geTMgKiB5MyAtIHozICogejM7XHJcbiAgICAgICAgY29uc3QgbjM6IG51bWJlciA9IHQzIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDMsIDQpICogKGczWzBdICogeDMgKyBnM1sxXSAqIHkzICsgZzNbMl0gKiB6Myk7XHJcblxyXG4gICAgICAgIC8vIEFkZCBjb250cmlidXRpb25zIGZyb20gZWFjaCBjb3JuZXIgdG8gZ2V0IHRoZSBmaW5hbCBub2lzZSB2YWx1ZS5cclxuICAgICAgICAvLyBUaGUgcmVzdWx0IGlzIHNjYWxlZCB0byBzdGF5IGp1c3QgaW5zaWRlIFstMSwxXVxyXG4gICAgICAgIHJldHVybiA5NC42ODQ5MzE1MDY4MTk3MiAqIChuMCArIG4xICsgbjIgKyBuMyk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNhbXBsZSA9IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NhbXBsZShfeCwgX3ksIF96KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLy8gVE9ETzogVGVzdFxyXG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICogZG9uZSBieSBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqXHJcbiAgICogQmFzZWQgb24gZXhhbXBsZSBjb2RlIGJ5IFN0ZWZhbiBHdXN0YXZzb24gKHN0ZWd1QGl0bi5saXUuc2UpLlxyXG4gICAqIE9wdGltaXNhdGlvbnMgYnkgUGV0ZXIgRWFzdG1hbiAocGVhc3RtYW5AZHJpenpsZS5zdGFuZm9yZC5lZHUpLlxyXG4gICAqIEJldHRlciByYW5rIG9yZGVyaW5nIG1ldGhvZCBieSBTdGVmYW4gR3VzdGF2c29uIGluIDIwMTIuXHJcbiAgICpcclxuICAgKiBUaGlzIGNvZGUgd2FzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSBpdHMgb3JpZ2luYWwgYXV0aG9yLFxyXG4gICAqIFN0ZWZhbiBHdXN0YXZzb24uIFlvdSBtYXkgdXNlIGl0IGFzIHlvdSBzZWUgZml0LCBidXRcclxuICAgKiBhdHRyaWJ1dGlvbiBpcyBhcHByZWNpYXRlZC5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTm9pc2U0IGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAoNS4wIC0gTWF0aC5zcXJ0KDUuMCkpIC8gMjAuMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGdyYWRpZW50OiBudW1iZXJbXVtdID0gW1swLCAxLCAxLCAxXSwgWzAsIDEsIDEsIC0xXSwgWzAsIDEsIC0xLCAxXSwgWzAsIDEsIC0xLCAtMV0sIFswLCAtMSwgMSwgMV0sIFswLCAtMSwgMSwgLTFdLCBbMCwgLTEsIC0xLCAxXSwgWzAsIC0xLCAtMSwgLTFdLCBbMSwgMCwgMSwgMV0sIFsxLCAwLCAxLCAtMV0sIFsxLCAwLCAtMSwgMV0sIFsxLCAwLCAtMSwgLTFdLCBbLTEsIDAsIDEsIDFdLCBbLTEsIDAsIDEsIC0xXSwgWy0xLCAwLCAtMSwgMV0sIFstMSwgMCwgLTEsIC0xXSwgWzEsIDEsIDAsIDFdLCBbMSwgMSwgMCwgLTFdLCBbMSwgLTEsIDAsIDFdLCBbMSwgLTEsIDAsIC0xXSwgWy0xLCAxLCAwLCAxXSwgWy0xLCAxLCAwLCAtMV0sIFstMSwgLTEsIDAsIDFdLCBbLTEsIC0xLCAwLCAtMV0sIFsxLCAxLCAxLCAwXSwgWzEsIDEsIC0xLCAwXSwgWzEsIC0xLCAxLCAwXSwgWzEsIC0xLCAtMSwgMF0sIFstMSwgMSwgMSwgMF0sIFstMSwgMSwgLTEsIDBdLCBbLTEsIC0xLCAxLCAwXSwgWy0xLCAtMSwgLTEsIDBdXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyLCBfdzogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gICAgICAgIC8vIFNrZXcgdGhlICh4LHkseix3KSBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggY2VsbCBvZiAyNCBzaW1wbGljZXMgd2UncmUgaW5cclxuICAgICAgICBjb25zdCBzOiBudW1iZXIgPSAoX3ggKyBfeSArIF96ICsgX3cpICogKE1hdGguc3FydCg1LjApIC0gMS4wKSAvIDQuMDsgLy8gRmFjdG9yIGZvciA0RCBza2V3aW5nXHJcbiAgICAgICAgY29uc3QgaTogbnVtYmVyID0gTWF0aC5mbG9vcihfeCArIHMpO1xyXG4gICAgICAgIGNvbnN0IGo6IG51bWJlciA9IE1hdGguZmxvb3IoX3kgKyBzKTtcclxuICAgICAgICBjb25zdCBrOiBudW1iZXIgPSBNYXRoLmZsb29yKF96ICsgcyk7XHJcbiAgICAgICAgY29uc3QgbDogbnVtYmVyID0gTWF0aC5mbG9vcihfdyArIHMpO1xyXG4gICAgICAgIGNvbnN0IHQ6IG51bWJlciA9IChpICsgaiArIGsgKyBsKSAqIE5vaXNlNC5vZmZzZXQ7IC8vIEZhY3RvciBmb3IgNEQgdW5za2V3aW5nXHJcbiAgICAgICAgY29uc3QgWDA6IG51bWJlciA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSx6LHcpIHNwYWNlXHJcbiAgICAgICAgY29uc3QgWTA6IG51bWJlciA9IGogLSB0O1xyXG4gICAgICAgIGNvbnN0IFowOiBudW1iZXIgPSBrIC0gdDtcclxuICAgICAgICBjb25zdCBXMDogbnVtYmVyID0gbCAtIHQ7XHJcbiAgICAgICAgY29uc3QgeDA6IG51bWJlciA9IF94IC0gWDA7IC8vIFRoZSB4LHkseix3IGRpc3RhbmNlcyBmcm9tIHRoZSBjZWxsIG9yaWdpblxyXG4gICAgICAgIGNvbnN0IHkwOiBudW1iZXIgPSBfeSAtIFkwO1xyXG4gICAgICAgIGNvbnN0IHowOiBudW1iZXIgPSBfeiAtIFowO1xyXG4gICAgICAgIGNvbnN0IHcwOiBudW1iZXIgPSBfdyAtIFcwO1xyXG5cclxuICAgICAgICAvLyBUbyBmaW5kIG91dCB3aGljaCBvZiB0aGUgMjQgcG9zc2libGUgc2ltcGxpY2VzIHdlJ3JlIGluLCB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGVcclxuICAgICAgICAvLyBtYWduaXR1ZGUgb3JkZXJpbmcgb2YgeDAsIHkwLCB6MCBhbmQgdzAuIFNpeCBwYWlyLXdpc2UgY29tcGFyaXNvbnMgYXJlIHBlcmZvcm1lZCBiZXR3ZWVuXHJcbiAgICAgICAgLy8gZWFjaCBwb3NzaWJsZSBwYWlyIG9mIHRoZSBmb3VyIGNvb3JkaW5hdGVzLCBhbmQgdGhlIHJlc3VsdHMgYXJlIHVzZWQgdG8gcmFuayB0aGUgbnVtYmVycy5cclxuICAgICAgICBsZXQgcmFua3g6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbGV0IHJhbmt5OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxldCByYW5rejogbnVtYmVyID0gMDtcclxuICAgICAgICBsZXQgcmFua3c6IG51bWJlciA9IDA7XHJcbiAgICAgICAgaWYgKHgwID4geTApIHJhbmt4Kys7XHJcbiAgICAgICAgZWxzZSByYW5reSsrO1xyXG4gICAgICAgIGlmICh4MCA+IHowKSByYW5reCsrO1xyXG4gICAgICAgIGVsc2UgcmFua3orKztcclxuICAgICAgICBpZiAoeDAgPiB3MCkgcmFua3grKztcclxuICAgICAgICBlbHNlIHJhbmt3Kys7XHJcbiAgICAgICAgaWYgKHkwID4gejApIHJhbmt5Kys7XHJcbiAgICAgICAgZWxzZSByYW5reisrO1xyXG4gICAgICAgIGlmICh5MCA+IHcwKSByYW5reSsrO1xyXG4gICAgICAgIGVsc2UgcmFua3crKztcclxuICAgICAgICBpZiAoejAgPiB3MCkgcmFua3orKztcclxuICAgICAgICBlbHNlIHJhbmt3Kys7XHJcblxyXG4gICAgICAgIC8vIHNpbXBsZXhbY10gaXMgYSA0LXZlY3RvciB3aXRoIHRoZSBudW1iZXJzIDAsIDEsIDIgYW5kIDMgaW4gc29tZSBvcmRlci5cclxuICAgICAgICAvLyBNYW55IHZhbHVlcyBvZiBjIHdpbGwgbmV2ZXIgb2NjdXIsIHNpbmNlIGUuZy4geD55Pno+dyBtYWtlcyB4PHosIHk8dyBhbmQgeDx3XHJcbiAgICAgICAgLy8gaW1wb3NzaWJsZS4gT25seSB0aGUgMjQgaW5kaWNlcyB3aGljaCBoYXZlIG5vbi16ZXJvIGVudHJpZXMgbWFrZSBhbnkgc2Vuc2UuXHJcbiAgICAgICAgLy8gV2UgdXNlIGEgdGhyZXNob2xkaW5nIHRvIHNldCB0aGUgY29vcmRpbmF0ZXMgaW4gdHVybiBmcm9tIHRoZSBsYXJnZXN0IG1hZ25pdHVkZS5cclxuICAgICAgICAvLyBSYW5rIDMgZGVub3RlcyB0aGUgbGFyZ2VzdCBjb29yZGluYXRlLlxyXG4gICAgICAgIGNvbnN0IGkxOiBudW1iZXIgPSByYW5reCA+PSAzID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgajE6IG51bWJlciA9IHJhbmt5ID49IDMgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBrMTogbnVtYmVyID0gcmFua3ogPj0gMyA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGwxOiBudW1iZXIgPSByYW5rdyA+PSAzID8gMSA6IDA7XHJcbiAgICAgICAgLy8gUmFuayA6IDIgZGVub3RlcyB0aGUgc2Vjb25kIGxhcmdlc3QgY29vcmRpbmF0ZS5cclxuICAgICAgICBjb25zdCBpMjogbnVtYmVyID0gcmFua3ggPj0gMiA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGoyOiBudW1iZXIgPSByYW5reSA+PSAyID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgazI6IG51bWJlciA9IHJhbmt6ID49IDIgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBsMjogbnVtYmVyID0gcmFua3cgPj0gMiA/IDEgOiAwO1xyXG4gICAgICAgIC8vIFJhbmsgOiAxIGRlbm90ZXMgdGhlIHNlY29uZCBzbWFsbGVzdCBjb29yZGluYXRlLlxyXG4gICAgICAgIGNvbnN0IGkzOiBudW1iZXIgPSByYW5reCA+PSAxID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgajM6IG51bWJlciA9IHJhbmt5ID49IDEgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBrMzogbnVtYmVyID0gcmFua3ogPj0gMSA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGwzOiBudW1iZXIgPSByYW5rdyA+PSAxID8gMSA6IDA7XHJcblxyXG4gICAgICAgIC8vIFRoZSBmaWZ0aCBjb3JuZXIgaGFzIGFsbCBjb29yZGluYXRlIG9mZnNldHMgPSAxLCBzbyBubyBuZWVkIHRvIGNvbXB1dGUgdGhhdC5cclxuICAgICAgICBjb25zdCB4MTogbnVtYmVyID0geDAgLSBpMSArIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkxOiBudW1iZXIgPSB5MCAtIGoxICsgTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB6MTogbnVtYmVyID0gejAgLSBrMSArIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzE6IG51bWJlciA9IHcwIC0gbDEgKyBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHgyOiBudW1iZXIgPSB4MCAtIGkyICsgMi4wICogTm9pc2U0Lm9mZnNldDsgLy8gT2Zmc2V0cyBmb3IgdGhpcmQgY29ybmVyIGluICh4LHkseix3KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5MjogbnVtYmVyID0geTAgLSBqMiArIDIuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejI6IG51bWJlciA9IHowIC0gazIgKyAyLjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHcyOiBudW1iZXIgPSB3MCAtIGwyICsgMi4wICogTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MzogbnVtYmVyID0geDAgLSBpMyArIDMuMCAqIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIGZvdXJ0aCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkzOiBudW1iZXIgPSB5MCAtIGozICsgMy4wICogTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB6MzogbnVtYmVyID0gejAgLSBrMyArIDMuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzM6IG51bWJlciA9IHcwIC0gbDMgKyAzLjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHg0OiBudW1iZXIgPSB4MCAtIDEuMCArIDQuMCAqIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIGxhc3QgY29ybmVyIGluICh4LHkseix3KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5NDogbnVtYmVyID0geTAgLSAxLjAgKyA0LjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHo0OiBudW1iZXIgPSB6MCAtIDEuMCArIDQuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzQ6IG51bWJlciA9IHcwIC0gMS4wICsgNC4wICogTm9pc2U0Lm9mZnNldDtcclxuXHJcbiAgICAgICAgLy8gV29yayBvdXQgdGhlIGhhc2hlZCBncmFkaWVudCBpbmRpY2VzIG9mIHRoZSBmaXZlIHNpbXBsZXggY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IGlpOiBudW1iZXIgPSBpICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGpqOiBudW1iZXIgPSBqICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGtrOiBudW1iZXIgPSBrICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGxsOiBudW1iZXIgPSBsICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGcwOiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtpaSArIHRoaXMucGVybVtqaiArIHRoaXMucGVybVtrayArIHRoaXMucGVybVtsbF1dXV0gJVxyXG4gICAgICAgICAgMzJcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IGcxOiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtcclxuICAgICAgICAgICAgaWkgKyBpMSArIHRoaXMucGVybVtqaiArIGoxICsgdGhpcy5wZXJtW2trICsgazEgKyB0aGlzLnBlcm1bbGwgKyBsMV1dXVxyXG4gICAgICAgICAgXSAlIDMyXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCBnMjogbnVtYmVyW10gPSBOb2lzZTQuZ3JhZGllbnRbXHJcbiAgICAgICAgICB0aGlzLnBlcm1bXHJcbiAgICAgICAgICAgIGlpICsgaTIgKyB0aGlzLnBlcm1bamogKyBqMiArIHRoaXMucGVybVtrayArIGsyICsgdGhpcy5wZXJtW2xsICsgbDJdXV1cclxuICAgICAgICAgIF0gJSAzMlxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgZzM6IG51bWJlcltdID0gTm9pc2U0LmdyYWRpZW50W1xyXG4gICAgICAgICAgdGhpcy5wZXJtW1xyXG4gICAgICAgICAgICBpaSArIGkzICsgdGhpcy5wZXJtW2pqICsgajMgKyB0aGlzLnBlcm1ba2sgKyBrMyArIHRoaXMucGVybVtsbCArIGwzXV1dXHJcbiAgICAgICAgICBdICUgMzJcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IGc0OiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtcclxuICAgICAgICAgICAgaWkgKyAxICsgdGhpcy5wZXJtW2pqICsgMSArIHRoaXMucGVybVtrayArIDEgKyB0aGlzLnBlcm1bbGwgKyAxXV1dXHJcbiAgICAgICAgICBdICUgMzJcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmaXZlIGNvcm5lcnNcclxuICAgICAgICBjb25zdCB0MDogbnVtYmVyID0gMC41IC0geDAgKiB4MCAtIHkwICogeTAgLSB6MCAqIHowIC0gdzAgKiB3MDtcclxuICAgICAgICBjb25zdCBuMDogbnVtYmVyID0gdDAgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MCwgNCkgKiAoZzBbMF0gKiB4MCArIGcwWzFdICogeTAgKyBnMFsyXSAqIHowICsgZzBbM10gKiB3MCk7XHJcbiAgICAgICAgY29uc3QgdDE6IG51bWJlciA9IDAuNSAtIHgxICogeDEgLSB5MSAqIHkxIC0gejEgKiB6MSAtIHcxICogdzE7XHJcbiAgICAgICAgY29uc3QgbjE6IG51bWJlciA9IHQxIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDEsIDQpICogKGcxWzBdICogeDEgKyBnMVsxXSAqIHkxICsgZzFbMl0gKiB6MSArIGcxWzNdICogdzEpO1xyXG4gICAgICAgIGNvbnN0IHQyOiBudW1iZXIgPSAwLjUgLSB4MiAqIHgyIC0geTIgKiB5MiAtIHoyICogejIgLSB3MiAqIHcyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDBcclxuICAgICAgICAgID8gMC4wXHJcbiAgICAgICAgICA6IE1hdGgucG93KHQyLCA0KSAqIChnMlswXSAqIHgyICsgZzJbMV0gKiB5MiArIGcyWzJdICogejIgKyBnMlszXSAqIHcyKTtcclxuICAgICAgICBjb25zdCB0MzogbnVtYmVyID0gMC41IC0geDMgKiB4MyAtIHkzICogeTMgLSB6MyAqIHozIC0gdzMgKiB3MztcclxuICAgICAgICBjb25zdCBuMzogbnVtYmVyID0gdDMgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MywgNCkgKiAoZzNbMF0gKiB4MyArIGczWzFdICogeTMgKyBnM1syXSAqIHozICsgZzNbM10gKiB3Myk7XHJcbiAgICAgICAgY29uc3QgdDQ6IG51bWJlciA9IDAuNSAtIHg0ICogeDQgLSB5NCAqIHk0IC0gejQgKiB6NCAtIHc0ICogdzQ7XHJcbiAgICAgICAgY29uc3QgbjQ6IG51bWJlciA9IHQ0IDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDQsIDQpICogKGc0WzBdICogeDQgKyBnNFsxXSAqIHk0ICsgZzRbMl0gKiB6NCArIGc0WzNdICogdzQpO1xyXG5cclxuICAgICAgICAvLyBTdW0gdXAgYW5kIHNjYWxlIHRoZSByZXN1bHQgdG8gY292ZXIgdGhlIHJhbmdlIFstMSwxXVxyXG4gICAgICAgIHJldHVybiA3Mi4zNzg1NTc2NTE1MzY2NSAqIChuMCArIG4xICsgbjIgKyBuMyArIG40KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2FtcGxlKF94LCBfeSwgX3osIF93KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAqIFN0b3JpbmcgYW5kIG1hbmlwdWxhdGluZyByb3RhdGlvbnMgaW4gdGhlIGZvcm0gb2YgcXVhdGVybmlvbnMuXHJcbiAgICAqIENvbnN0cnVjdGVkIG91dCBvZiB0aGUgNCBjb21wb25lbnRzOiAoeCwgeSwgeiwgdykuIE1hdGhlbWF0aWNhbCBub3RhdGlvbjogdyArIHhpICsgeWogKyB6ay5cclxuICAgICogQSBRdWF0ZXJuaW9uIGNhbiBiZSBkZXNjcmliZWQgd2l0aCBhbiBheGlzIGFuZCBhbmdsZTogKHgsIHksIHopID0gc2luKGFuZ2xlLzIpKmF4aXM7IHcgPSBjb3MoYW5nbGUvMikuXHJcbiAgICAqIHJvbGw6IHgsIHBpdGNoOiB5LCB5YXc6IHouIE5vdGUgdGhhdCBvcGVyYXRpb25zIGFyZSBhZGFwdGVkIHRvIHdvcmsgd2l0aCB2ZWN0b3JzIHdoZXJlIHkgaXMgdXAgYW5kIHogaXMgZm9yd2FyZC5cclxuICAgICogQGF1dGhvcnMgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjMgfCBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFF1YXRlcm5pb24gZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIHg6IG51bWJlcjtcclxuICAgIHB1YmxpYyB5OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgejogbnVtYmVyO1xyXG4gICAgcHVibGljIHc6IG51bWJlcjtcclxuICAgIHByaXZhdGUgbXV0YXRvcjogTXV0YXRvciA9IG51bGw7IC8vIHByZXBhcmVkIGZvciBvcHRpbWl6YXRpb24sIGtlZXAgbXV0YXRvciB0byByZWR1Y2UgcmVkdW5kYW50IGNhbGN1bGF0aW9uIGFuZCBmb3IgY29tcGFyaXNvbi4gU2V0IHRvIG51bGwgd2hlbiBkYXRhIGNoYW5nZXMhXHJcblxyXG4gICAgcmVhZG9ubHkgI2V1bGVyQW5nbGVzOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7IC8vIGV1bGVyIGFuZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcXVhdGVybmlvbiBpbiBkZWdyZWVzLlxyXG4gICAgI2V1bGVyQW5nbGVzRGlydHk6IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3o6IG51bWJlciA9IDAsIF93OiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2V0KF94LCBfeSwgX3osIF93KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gU1RBVElDU1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBhIG5ldyBpZGVudGl0eSBxdWF0ZXJuaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSURFTlRJVFkoKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBxdWF0ZXJuaW9uIHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gcXVhdGVybmlvbiBzY2FsZWQgdG8gbGVuZ3RoIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTk9STUFMSVpBVElPTihfcTogUXVhdGVybmlvbik6IFF1YXRlcm5pb24ge1xyXG4gICAgICByZXR1cm4gX3EuY2xvbmUubm9ybWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcXVhdGVybmlvbiB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgd2hlbiBtdWx0aXBsaWVkIGJ5LCB1c2luZyB0aGUgYW5nbGVzIGdpdmVuLlxyXG4gICAgICogUm90YXRpb24gb2NjdXJzIGFyb3VuZCB0aGUgYXhpcyBpbiB0aGUgb3JkZXIgWi1ZLVguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX2V1bGVyQW5nbGVzOiBWZWN0b3IzKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgcmVzdWx0LmV1bGVyQW5nbGVzID0gX2V1bGVyQW5nbGVzO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHF1YXRlcm5pb24gdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIHdoZW4gbXVsdGlwbGllZCBieSwgdXNpbmcgdGhlIGF4aXMgYW5kIGFuZ2xlIGdpdmVuLlxyXG4gICAgICog4pqg77iPIFVOVEVTVEVEIVxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIFJPVEFUSU9OKF9heGlzOiBWZWN0b3IzLCBfYW5nbGU6IG51bWJlcik6IFF1YXRlcm5pb24ge1xyXG4gICAgLy8gICBjb25zdCByZXN1bHQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcblxyXG4gICAgLy8gICAvLyBOb3JtYWxpemUgdGhlIGF4aXNcclxuICAgIC8vICAgY29uc3QgYXhpczogVmVjdG9yMyA9IF9heGlzLmNsb25lO1xyXG4gICAgLy8gICBheGlzLm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgIC8vICAgLy8gQ2FsY3VsYXRlIHRoZSBxdWF0ZXJuaW9uIGNvbXBvbmVudHNcclxuICAgIC8vICAgY29uc3QgaGFsZkFuZ2xlOiBudW1iZXIgPSBfYW5nbGUgLyAyO1xyXG4gICAgLy8gICBjb25zdCBzOiBudW1iZXIgPSBNYXRoLnNpbihoYWxmQW5nbGUpO1xyXG4gICAgLy8gICByZXN1bHQueCA9IGF4aXMueCAqIHM7XHJcbiAgICAvLyAgIHJlc3VsdC55ID0gYXhpcy55ICogcztcclxuICAgIC8vICAgcmVzdWx0LnogPSBheGlzLnogKiBzO1xyXG4gICAgLy8gICByZXN1bHQudyA9IE1hdGguY29zKGhhbGZBbmdsZSk7XHJcblxyXG4gICAgLy8gICBSZWN5Y2xlci5zdG9yZShheGlzKTtcclxuXHJcbiAgICAvLyAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0d28gcGFzc2VkIHF1YXRlcm5pb25zLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0RVQ1QoX3FMZWZ0OiBRdWF0ZXJuaW9uLCBfcVJpZ2h0OiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIHJldHVybiBfcUxlZnQuY2xvbmUubXVsdGlwbHkoX3FSaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgaW52ZXJzZSBvZiBhIHBhc3NlZCBxdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIElOVkVSU0UoX3E6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgcmV0dXJuIF9xLmNsb25lLmludmVydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGNvbmp1Z2F0ZSBvZiBhIHBhc3NlZCBxdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENPTkpVR0FUSU9OKF9xOiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIHJldHVybiBfcS5jbG9uZS5jb25qdWdhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBxdWF0ZXJuaW9ucy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBET1QoX3ExOiBRdWF0ZXJuaW9uLCBfcTI6IFF1YXRlcm5pb24pOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX3ExLnggKiBfcTIueCArIF9xMS55ICogX3EyLnkgKyBfcTEueiAqIF9xMi56ICsgX3ExLncgKiBfcTIudztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdGVybmlvbnMgYmFzZWQgb24gdGhlIGdpdmVuIF9mYWN0b3IuIFdoZW4gX2ZhY3RvciBpcyAwIHRoZSByZXN1bHQgaXMgX2Zyb20sIHdoZW4gX2ZhY3RvciBpcyAxIHRoZSByZXN1bHQgaXMgX3RvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIExFUlAoX2Zyb206IFF1YXRlcm5pb24sIF90bzogUXVhdGVybmlvbiwgX2ZhY3RvcjogbnVtYmVyKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgKF9mcm9tLnggKiAoMSAtIF9mYWN0b3IpICsgX3RvLnggKiBfZmFjdG9yKSxcclxuICAgICAgICAoX2Zyb20ueSAqICgxIC0gX2ZhY3RvcikgKyBfdG8ueSAqIF9mYWN0b3IpLFxyXG4gICAgICAgIChfZnJvbS56ICogKDEgLSBfZmFjdG9yKSArIF90by56ICogX2ZhY3RvciksXHJcbiAgICAgICAgKF9mcm9tLncgKiAoMSAtIF9mYWN0b3IpICsgX3RvLncgKiBfZmFjdG9yKVxyXG4gICAgICApO1xyXG4gICAgICByZXN1bHQubm9ybWFsaXplKCk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdGVybmlvbnMgYmFzZWQgb24gdGhlIGdpdmVuIF9mYWN0b3IuIFdoZW4gX2ZhY3RvciBpcyAwIHRoZSByZXN1bHQgaXMgX2Zyb20sIHdoZW4gX2ZhY3RvciBpcyAxIHRoZSByZXN1bHQgaXMgX3RvLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTTEVSUChfZnJvbTogUXVhdGVybmlvbiwgX3RvOiBRdWF0ZXJuaW9uLCBfZmFjdG9yOiBudW1iZXIpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgLy8gRnJvbTogaHR0cHM6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvc2xlcnAvXHJcbiAgICAgIGxldCBjb3NIYWxmVGhldGE6IG51bWJlciA9IF9mcm9tLncgKiBfdG8udyArIF9mcm9tLnggKiBfdG8ueCArIF9mcm9tLnkgKiBfdG8ueSArIF9mcm9tLnogKiBfdG8uejtcclxuICAgICAgaWYgKE1hdGguYWJzKGNvc0hhbGZUaGV0YSkgPj0gMSlcclxuICAgICAgICByZXR1cm4gX2Zyb207XHJcbiAgICAgIGxldCBoYWxmVGhldGE6IG51bWJlciA9IE1hdGguYWNvcyhjb3NIYWxmVGhldGEpO1xyXG4gICAgICBsZXQgc2luSGFsZlRoZXRhOiBudW1iZXIgPSBNYXRoLnNxcnQoMSAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YSk7XHJcbiAgICAgIGlmIChNYXRoLmFicyhzaW5IYWxmVGhldGEpIDwgMC4wMDEpIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBRdWF0ZXJuaW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICAoX2Zyb20ueCAqIDAuNSArIF90by54ICogMC41KSxcclxuICAgICAgICAgIChfZnJvbS55ICogMC41ICsgX3RvLnkgKiAwLjUpLFxyXG4gICAgICAgICAgKF9mcm9tLnogKiAwLjUgKyBfdG8ueiAqIDAuNSksXHJcbiAgICAgICAgICAoX2Zyb20udyAqIDAuNSArIF90by53ICogMC41KVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgcmF0aW9BOiBudW1iZXIgPSBNYXRoLnNpbigoMSAtIF9mYWN0b3IpICogaGFsZlRoZXRhKSAvIHNpbkhhbGZUaGV0YTtcclxuICAgICAgbGV0IHJhdGlvQjogbnVtYmVyID0gTWF0aC5zaW4oX2ZhY3RvciAqIGhhbGZUaGV0YSkgLyBzaW5IYWxmVGhldGE7XHJcbiAgICAgIGxldCByZXN1bHQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgKF9mcm9tLnggKiByYXRpb0EgKyBfdG8ueCAqIHJhdGlvQiksXHJcbiAgICAgICAgKF9mcm9tLnkgKiByYXRpb0EgKyBfdG8ueSAqIHJhdGlvQiksXHJcbiAgICAgICAgKF9mcm9tLnogKiByYXRpb0EgKyBfdG8ueiAqIHJhdGlvQiksXHJcbiAgICAgICAgKF9mcm9tLncgKiByYXRpb0EgKyBfdG8udyAqIHJhdGlvQilcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICBsZXQgcmVzdWx0OiBRdWF0ZXJuaW9uID0gUmVjeWNsZXIucmV1c2UoUXVhdGVybmlvbik7XHJcbiAgICAgIHJlc3VsdC5jb3B5KHRoaXMpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogLSBnZXQ6IHJldHVybiB0aGUgZXVsZXIgYW5nbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJvdGF0aW9uIGluIGRlZ3JlZXMuIFxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSBhbmQgcmVhZG9ubHksIHNpbmNlIHRoZSB2ZWN0b3IgaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGludGVybmFsbHkuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBzZXQgdGhlIGV1bGVyIGFuZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByb3RhdGlvbiBpbiBkZWdyZWVzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGV1bGVyQW5nbGVzKCk6IFZlY3RvcjMge1xyXG4gICAgICBpZiAodGhpcy4jZXVsZXJBbmdsZXNEaXJ0eSkge1xyXG4gICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzRGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMueCA9PSAwICYmIHRoaXMueSA9PSAwICYmIHRoaXMueiA9PSAwICYmIHRoaXMudyA9PSAxKSB7XHJcbiAgICAgICAgICB0aGlzLiNldWxlckFuZ2xlcy5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy4jZXVsZXJBbmdsZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByb2xsICh4LWF4aXMgcm90YXRpb24pXHJcbiAgICAgICAgbGV0IHNpbnJjb3NwOiBudW1iZXIgPSAyICogKHRoaXMudyAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueik7XHJcbiAgICAgICAgbGV0IGNvc3Jjb3NwOiBudW1iZXIgPSAxIC0gMiAqICh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xyXG4gICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnggPSBNYXRoLmF0YW4yKHNpbnJjb3NwLCBjb3NyY29zcCk7XHJcblxyXG4gICAgICAgIC8vIHBpdGNoICh5LWF4aXMgcm90YXRpb24pXHJcbiAgICAgICAgbGV0IHNpbnA6IG51bWJlciA9IDIgKiAodGhpcy53ICogdGhpcy55IC0gdGhpcy56ICogdGhpcy54KTtcclxuICAgICAgICBpZiAoTWF0aC5hYnMoc2lucCkgPj0gMSlcclxuICAgICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnkgPSBzaW5wIDwgMCA/IC1NYXRoLmFicyhNYXRoLlBJIC8gMikgOiBNYXRoLmFicyhNYXRoLlBJIC8gMik7IC8vIHVzZSA5MCBkZWdyZWVzIGlmIG91dCBvZiByYW5nZVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnkgPSBNYXRoLmFzaW4oc2lucCk7XHJcblxyXG4gICAgICAgIC8vIHlhdyAoei1heGlzIHJvdGF0aW9uKVxyXG4gICAgICAgIGxldCBzaW55Y29zcDogbnVtYmVyID0gMiAqICh0aGlzLncgKiB0aGlzLnogKyB0aGlzLnggKiB0aGlzLnkpO1xyXG4gICAgICAgIGxldCBjb3N5Y29zcDogbnVtYmVyID0gMSAtIDIgKiAodGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56KTtcclxuICAgICAgICB0aGlzLiNldWxlckFuZ2xlcy56ID0gTWF0aC5hdGFuMihzaW55Y29zcCwgY29zeWNvc3ApO1xyXG5cclxuICAgICAgICB0aGlzLiNldWxlckFuZ2xlcy5zY2FsZShDYWxjLnJhZDJkZWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jZXVsZXJBbmdsZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBldWxlckFuZ2xlcyhfZXVsZXJBbmdsZXM6IFZlY3RvcjMpIHtcclxuICAgICAgY29uc3QgaGFsZkFuZ2xlc0luUmFkaWFuczogVmVjdG9yMyA9IFZlY3RvcjMuU0NBTEUoX2V1bGVyQW5nbGVzLCBDYWxjLmRlZzJyYWQgLyAyKTtcclxuICAgICAgY29uc3QgY29zWDogbnVtYmVyID0gTWF0aC5jb3MoaGFsZkFuZ2xlc0luUmFkaWFucy54KTtcclxuICAgICAgY29uc3QgY29zWTogbnVtYmVyID0gTWF0aC5jb3MoaGFsZkFuZ2xlc0luUmFkaWFucy55KTtcclxuICAgICAgY29uc3QgY29zWjogbnVtYmVyID0gTWF0aC5jb3MoaGFsZkFuZ2xlc0luUmFkaWFucy56KTtcclxuICAgICAgY29uc3Qgc2luWDogbnVtYmVyID0gTWF0aC5zaW4oaGFsZkFuZ2xlc0luUmFkaWFucy54KTtcclxuICAgICAgY29uc3Qgc2luWTogbnVtYmVyID0gTWF0aC5zaW4oaGFsZkFuZ2xlc0luUmFkaWFucy55KTtcclxuICAgICAgY29uc3Qgc2luWjogbnVtYmVyID0gTWF0aC5zaW4oaGFsZkFuZ2xlc0luUmFkaWFucy56KTtcclxuXHJcbiAgICAgIHRoaXMuc2V0KFxyXG4gICAgICAgIHNpblggKiBjb3NZICogY29zWiAtIGNvc1ggKiBzaW5ZICogc2luWixcclxuICAgICAgICBjb3NYICogc2luWSAqIGNvc1ogKyBzaW5YICogY29zWSAqIHNpblosXHJcbiAgICAgICAgY29zWCAqIGNvc1kgKiBzaW5aIC0gc2luWCAqIHNpblkgKiBjb3NaLFxyXG4gICAgICAgIGNvc1ggKiBjb3NZICogY29zWiArIHNpblggKiBzaW5ZICogc2luWlxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy4jZXVsZXJBbmdsZXMuY29weShfZXVsZXJBbmdsZXMpO1xyXG4gICAgICB0aGlzLiNldWxlckFuZ2xlc0RpcnR5ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemVzIHRoaXMgcXVhdGVybmlvbiB0byBhIGxlbmd0aCBvZiAxIChhIHVuaXQgcXVhdGVybmlvbikgbWFraW5nIGl0IGEgdmFsaWQgcm90YXRpb24gcmVwcmVzZW50YXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5vcm1hbGl6ZSgpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgbGV0IGxlbmd0aDogbnVtYmVyID0gTWF0aC5zcXJ0KHRoaXMueCAqKiAyICsgdGhpcy55ICoqIDIgKyB0aGlzLnogKiogMiArIHRoaXMudyAqKiAyKTtcclxuICAgICAgdGhpcy54IC89IGxlbmd0aDtcclxuICAgICAgdGhpcy55IC89IGxlbmd0aDtcclxuICAgICAgdGhpcy56IC89IGxlbmd0aDtcclxuICAgICAgdGhpcy53IC89IGxlbmd0aDtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVnYXRlIHRoaXMgcXVhdGVybmlvbiBhbmQgcmV0dXJucyBpdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICB0aGlzLnggKj0gLTE7XHJcbiAgICAgIHRoaXMueSAqPSAtMTtcclxuICAgICAgdGhpcy56ICo9IC0xO1xyXG4gICAgICB0aGlzLncgKj0gLTE7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgcXVhdGVybmlvbiB0byB0aGUgaWRlbnRpdHktcXVhdGVybmlvbiBhbmQgY2xlYXJzIGNhY2hlLiBVc2VkIGJ5IHRoZSByZWN5Y2xlciB0byByZXNldC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0KDAsIDAsIDAsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52ZXJ0IHRoaXMgcXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGludmVydCgpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgLy8gcXVhdGVybmlvbiBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcclxuICAgICAgcmV0dXJuIHRoaXMuY29uanVnYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25qdWdhdGVzIHRoaXMgcXVhdGVybmlvbiBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbmp1Z2F0ZSgpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgdGhpcy54ICo9IC0xO1xyXG4gICAgICB0aGlzLnkgKj0gLTE7XHJcbiAgICAgIHRoaXMueiAqPSAtMTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhpcyBxdWF0ZXJuaW9uIHdpdGggdGhlIGdpdmVuIHF1YXRlcm5pb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIG11bHRpcGx5KF9vdGhlcjogUXVhdGVybmlvbiwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgY29uc3QgYTogUXVhdGVybmlvbiA9IF9mcm9tTGVmdCA/IF9vdGhlciA6IHRoaXM7XHJcbiAgICAgIGNvbnN0IGI6IFF1YXRlcm5pb24gPSBfZnJvbUxlZnQgPyB0aGlzIDogX290aGVyO1xyXG4gICAgICAvLyBmcm9tOiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXHJcbiAgICAgIGNvbnN0IGF4OiBudW1iZXIgPSBhLng7XHJcbiAgICAgIGNvbnN0IGF5OiBudW1iZXIgPSBhLnk7XHJcbiAgICAgIGNvbnN0IGF6OiBudW1iZXIgPSBhLno7XHJcbiAgICAgIGNvbnN0IGF3OiBudW1iZXIgPSBhLnc7XHJcbiAgICAgIGNvbnN0IGJ4OiBudW1iZXIgPSBiLng7XHJcbiAgICAgIGNvbnN0IGJ5OiBudW1iZXIgPSBiLnk7XHJcbiAgICAgIGNvbnN0IGJ6OiBudW1iZXIgPSBiLno7XHJcbiAgICAgIGNvbnN0IGJ3OiBudW1iZXIgPSBiLnc7XHJcblxyXG4gICAgICB0aGlzLnNldChcclxuICAgICAgICBheCAqIGJ3ICsgYXkgKiBieiAtIGF6ICogYnkgKyBhdyAqIGJ4LFxyXG4gICAgICAgIC1heCAqIGJ6ICsgYXkgKiBidyArIGF6ICogYnggKyBhdyAqIGJ5LFxyXG4gICAgICAgIGF4ICogYnkgLSBheSAqIGJ4ICsgYXogKiBidyArIGF3ICogYnosXHJcbiAgICAgICAgLWF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBieiArIGF3ICogYndcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3o6IG51bWJlciwgX3c6IG51bWJlcik6IFF1YXRlcm5pb24ge1xyXG4gICAgICB0aGlzLnggPSBfeDsgdGhpcy55ID0gX3k7IHRoaXMueiA9IF96OyB0aGlzLncgPSBfdztcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcXVhdGVybmlvbiBpbnRvIHRoaXMgcXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIHRoaXMueCA9IF9vcmlnaW5hbC54OyB0aGlzLnkgPSBfb3JpZ2luYWwueTsgdGhpcy56ID0gX29yaWdpbmFsLno7IHRoaXMudyA9IF9vcmlnaW5hbC53O1xyXG4gICAgICB0aGlzLiNldWxlckFuZ2xlc0RpcnR5ID0gX29yaWdpbmFsLiNldWxlckFuZ2xlc0RpcnR5O1xyXG4gICAgICBpZiAoIXRoaXMuI2V1bGVyQW5nbGVzRGlydHkpXHJcbiAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXMuY29weShfb3JpZ2luYWwuI2V1bGVyQW5nbGVzKTtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHF1YXRlcm5pb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgxpIuUXVhdGVybmlvbih4OiAke3RoaXMueH0sIHk6ICR7dGhpcy55fSwgejogJHt0aGlzLnp9LCB3OiAke3RoaXMud30pYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjdXJyZW50bHkgcXVhdGVybmlvbnMgYXJlIG5ldmVyIHNlcmlhbGl6ZWQsIHNvIHRoaXMgaXMgbm90IG5lZWRlZC4gQnV0IG1heWJlIGl0IHdpbGwgYmUgaW4gdGhlIGZ1dHVyZS5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYFske3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9LCAke3RoaXMud31dYDsgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxRdWF0ZXJuaW9uPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9zZXJpYWxpemF0aW9uKSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgW3RoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMud10gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBpZiAoIXRoaXMubXV0YXRvcilcclxuICAgICAgICB0aGlzLm11dGF0b3IgPSB7IHg6IHRoaXMueCwgeTogdGhpcy55LCB6OiB0aGlzLnosIHc6IHRoaXMudyB9O1xyXG4gICAgICByZXR1cm4gdGhpcy5tdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy54ID0gX211dGF0b3IueCA/PyB0aGlzLng7XHJcbiAgICAgIHRoaXMueSA9IF9tdXRhdG9yLnkgPz8gdGhpcy55O1xyXG4gICAgICB0aGlzLnogPSBfbXV0YXRvci56ID8/IHRoaXMuejtcclxuICAgICAgdGhpcy53ID0gX211dGF0b3IudyA/PyB0aGlzLnc7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyoqICovIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0Q2FjaGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI2V1bGVyQW5nbGVzRGlydHkgPSB0cnVlO1xyXG4gICAgICB0aGlzLm11dGF0b3IgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENsYXNzIGZvciBjcmVhdGluZyByYW5kb20gdmFsdWVzLCBzdXBwb3J0aW5nIEphdmFzY3JpcHQncyBNYXRoLnJhbmRvbSBhbmQgYSBkZXRlcm1pbmlzdGlnIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoUFJORykgXHJcbiAgICogdGhhdCBjYW4gYmUgZmVkIHdpdGggYSBzZWVkIGFuZCB0aGVuIHJldHVybnMgYSByZXByb2R1Y2FibGUgc2V0IG9mIHJhbmRvbSBudW1iZXJzIChpZiB0aGUgcHJlY2lzaW9uIG9mIEphdmFzY3JpcHQgYWxsb3dzKSBcclxuICAgKiBcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJhbmRvbSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHQ6IFJhbmRvbSA9IG5ldyBSYW5kb20oKTtcclxuICAgIHByaXZhdGUgZ2VuZXJhdGU6IEZ1bmN0aW9uID0gTWF0aC5yYW5kb207XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJhbmRvbX0uIFxyXG4gICAgICogSWYgYSBzZWVkIGlzIGdpdmVuLCBMRklCNCBpcyB1c2VkIGFzIGdlbmVyYXRvciwgcmVwcm9kdWNpbmcgYSBzZXJpZXMgb2YgbnVtYmVycyBmcm9tIHRoYXQgc2VlZC5cclxuICAgICAqIElmIGEgZnVuY3Rpb24gcHJvZHVjaW5nIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUgdXNlZCBhcyBnZW5lcmF0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihfc2VlZE9yRnVuY3Rpb24/OiBudW1iZXIgfCBGdW5jdGlvbikge1xyXG4gICAgICBpZiAoX3NlZWRPckZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pXHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZSA9IF9zZWVkT3JGdW5jdGlvbjtcclxuICAgICAgZWxzZSBpZiAoX3NlZWRPckZ1bmN0aW9uID09IHVuZGVmaW5lZClcclxuICAgICAgICB0aGlzLmdlbmVyYXRlID0gTWF0aC5yYW5kb207XHJcbiAgICAgIGVsc2VcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLmdlbmVyYXRlID0gbmV3IExGSUI0KF9zZWVkT3JGdW5jdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbm9ybWVkIHJhbmRvbSBudW1iZXIsIHRodXMgaW4gdGhlIHJhbmdlIG9mIFswLCAxW1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Tm9ybSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIG9mIGdpdmVuIFtfbWluLCBfbWF4W1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmFuZ2UoX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX21pbiArIHRoaXMuZ2VuZXJhdGUoKSAqIChfbWF4IC0gX21pbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgbnVtYmVyIGluIHRoZSByYW5nZSBvZiBnaXZlbiBmbG9vcmVkIFtfbWluLCBfbWF4W1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmFuZ2VGbG9vcmVkKF9taW46IG51bWJlciwgX21heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5nZXRSYW5nZShfbWluLCBfbWF4KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgb3IgZmFsc2UgcmFuZG9tbHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJvb2xlYW4oKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKCkgPCAwLjU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIC0xIG9yIDEgcmFuZG9tbHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNpZ24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbigpID8gMSA6IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIGluZGV4IGludG8gdGhlIGdpdmVuIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRJbmRleDxUPihfYXJyYXk6IEFycmF5PFQ+KTogbnVtYmVyIHtcclxuICAgICAgaWYgKF9hcnJheS5sZW5ndGggPiAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJhbmdlRmxvb3JlZCgwLCBfYXJyYXkubGVuZ3RoKTtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRFbGVtZW50PFQ+KF9hcnJheTogQXJyYXk8VD4pOiBUIHtcclxuICAgICAgaWYgKF9hcnJheS5sZW5ndGggPiAwKVxyXG4gICAgICAgIHJldHVybiBfYXJyYXlbdGhpcy5nZXRJbmRleChfYXJyYXkpXTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgcmFuZG9tbHkgc2VsZWN0ZWQgZWxlbWVudCBmcm9tIHRoZSBnaXZlbiBhcnJheSBhbmQgcmV0dXJucyBpdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3BsaWNlPFQ+KF9hcnJheTogQXJyYXk8VD4pOiBUIHtcclxuICAgICAgcmV0dXJuIF9hcnJheS5zcGxpY2UodGhpcy5nZXRJbmRleChfYXJyYXkpLCAxKVswXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb21seSBzZWxlY3RlZCBrZXkgZnJvbSB0aGUgZ2l2ZW4gTWFwLWluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXk8VCwgVT4oX21hcDogTWFwPFQsIFU+KTogVCB7XHJcbiAgICAgIGxldCBrZXlzOiBHZW5lcmFsID0gQXJyYXkuZnJvbShfbWFwLmtleXMoKSk7XHJcbiAgICAgIHJldHVybiBrZXlzW3RoaXMuZ2V0SW5kZXgoa2V5cyldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eU5hbWU8VD4oX29iamVjdDogVCk6IGtleW9mIFQge1xyXG4gICAgICBsZXQga2V5czogc3RyaW5nW10gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhfb2JqZWN0KTtcclxuICAgICAgcmV0dXJuIDxrZXlvZiBUPmtleXNbdGhpcy5nZXRJbmRleChrZXlzKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tbHkgc2VsZWN0ZWQgc3ltYm9sIGZyb20gdGhlIGdpdmVuIG9iamVjdCwgaWYgc3ltYm9scyBhcmUgdXNlZCBhcyBrZXlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eVN5bWJvbDxUPihfb2JqZWN0OiBUKTogc3ltYm9sIHtcclxuICAgICAgbGV0IGtleXM6IHN5bWJvbFtdID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhfb2JqZWN0KTtcclxuICAgICAgcmV0dXJuIGtleXNbdGhpcy5nZXRJbmRleChrZXlzKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIHRocmVlLWRpbWVuc2lvbmFsIHZlY3RvciBpbiB0aGUgbGltaXRzIG9mIHRoZSBib3ggZGVmaW5lZCBieSB0aGUgdmVjdG9ycyBnaXZlbiBhcyBbX2Nvcm5lcjAsIF9jb3JuZXIxW1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmVjdG9yMyhfY29ybmVyMDogVmVjdG9yMywgX2Nvcm5lcjE6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueCwgX2Nvcm5lcjEueCksIHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueSwgX2Nvcm5lcjEueSksIHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueiwgX2Nvcm5lcjEueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSB0d28tZGltZW5zaW9uYWwgdmVjdG9yIGluIHRoZSBsaW1pdHMgb2YgdGhlIHJlY3RhbmdsZSBkZWZpbmVkIGJ5IHRoZSB2ZWN0b3JzIGdpdmVuIGFzIFtfY29ybmVyMCwgX2Nvcm5lcjFbXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWZWN0b3IyKF9jb3JuZXIwOiBWZWN0b3IyLCBfY29ybmVyMTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy5nZXRSYW5nZShfY29ybmVyMC54LCBfY29ybmVyMS54KSwgdGhpcy5nZXRSYW5nZShfY29ybmVyMC55LCBfY29ybmVyMS55KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFuZGFyZCB7QGxpbmsgUmFuZG9tfS1pbnN0YW5jZSB1c2luZyBNYXRoLnJhbmRvbSgpLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjb25zdCByYW5kb206IFJhbmRvbSA9IG5ldyBSYW5kb20oKTtcclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyBhbmQgbWFuaXB1bGF0ZXMgYSB0aHJlZWRpbWVuc2lvbmFsIHZlY3RvciBjb21wcmlzZWQgb2YgdGhlIGNvbXBvbmVudHMgeCwgeSBhbmQgelxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgICAgICt5XHJcbiAgICogICAgICAgICAgICAgfF9fICt4XHJcbiAgICogICAgICAgICAgICAvXHJcbiAgICogICAgICAgICAgK3ogICBcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5LTIwMjIgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVjdG9yMyBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xyXG4gICAgcHVibGljIHk6IG51bWJlcjtcclxuICAgIHB1YmxpYyB6OiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3o6IG51bWJlciA9IDApIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zZXQoX3gsIF95LCBfeik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFN0YXRpY1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB4LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFgoX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KF9zY2FsZSwgMCwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB5LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFkoX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDAsIF9zY2FsZSwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB6LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFooX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDAsIDAsIF9zY2FsZSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIHZhbHVlIDAgb24gZWFjaCBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgWkVSTygpOiBWZWN0b3IzIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHZlY3Rvci5zZXQoMCwgMCwgMCk7IC8vIHNob3VsZCBiZSBzZXQgdG8gMCBieSByZWN5Y2xlciBhbHJlYWR5P1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciBvZiB0aGUgZ2l2ZW4gc2l6ZSBvbiBlYWNoIG9mIHRoZSB0aHJlZSBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgT05FKF9zY2FsZTogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfc2NhbGUsIF9zY2FsZSwgX3NjYWxlKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB2ZWN0b3IgdGhyb3VnaCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGJ5IHRoZSBnaXZlbiBtYXRyaXggb3Igcm90YXRpb24gcXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU0ZPUk1BVElPTihfdmVjdG9yOiBWZWN0b3IzLCBfdHJhbnNmb3JtOiBNYXRyaXg0eDQgfCBRdWF0ZXJuaW9uLCBfaW5jbHVkZVRyYW5zbGF0aW9uOiBib29sZWFuID0gdHJ1ZSk6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuXHJcbiAgICAgIGlmIChfdHJhbnNmb3JtIGluc3RhbmNlb2YgTWF0cml4NHg0KSB7XHJcbiAgICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IF90cmFuc2Zvcm0uZ2V0KCk7XHJcblxyXG4gICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICBtWzBdICogX3ZlY3Rvci54ICsgbVs0XSAqIF92ZWN0b3IueSArIG1bOF0gKiBfdmVjdG9yLnosXHJcbiAgICAgICAgICBtWzFdICogX3ZlY3Rvci54ICsgbVs1XSAqIF92ZWN0b3IueSArIG1bOV0gKiBfdmVjdG9yLnosXHJcbiAgICAgICAgICBtWzJdICogX3ZlY3Rvci54ICsgbVs2XSAqIF92ZWN0b3IueSArIG1bMTBdICogX3ZlY3Rvci56XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKF9pbmNsdWRlVHJhbnNsYXRpb24pXHJcbiAgICAgICAgICByZXN1bHQuYWRkKF90cmFuc2Zvcm0udHJhbnNsYXRpb24pO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBGcm9tOiBodHRwczovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy90cmFuc2Zvcm1zL2luZGV4Lmh0bVxyXG4gICAgICAgIC8vIHJlc3VsdCA9IHEgKiBxdWF0ZXJuaW9uKHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnosIDApICogY29uaihxKVxyXG5cclxuICAgICAgICAvLyBxICogcXVhdGVybmlvbih2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56LCAwKSAuLi5cclxuICAgICAgICBjb25zdCBxeDogbnVtYmVyID0gX3RyYW5zZm9ybS53ICogX3ZlY3Rvci54ICsgX3RyYW5zZm9ybS55ICogX3ZlY3Rvci56IC0gX3RyYW5zZm9ybS56ICogX3ZlY3Rvci55O1xyXG4gICAgICAgIGNvbnN0IHF5OiBudW1iZXIgPSBfdHJhbnNmb3JtLncgKiBfdmVjdG9yLnkgKyBfdHJhbnNmb3JtLnogKiBfdmVjdG9yLnggLSBfdHJhbnNmb3JtLnggKiBfdmVjdG9yLno7XHJcbiAgICAgICAgY29uc3QgcXo6IG51bWJlciA9IF90cmFuc2Zvcm0udyAqIF92ZWN0b3IueiArIF90cmFuc2Zvcm0ueCAqIF92ZWN0b3IueSAtIF90cmFuc2Zvcm0ueSAqIF92ZWN0b3IueDtcclxuICAgICAgICBjb25zdCBxdzogbnVtYmVyID0gLV90cmFuc2Zvcm0ueCAqIF92ZWN0b3IueCAtIF90cmFuc2Zvcm0ueSAqIF92ZWN0b3IueSAtIF90cmFuc2Zvcm0ueiAqIF92ZWN0b3IuejtcclxuXHJcbiAgICAgICAgLy8gLi4uICogY29uaihxKVxyXG4gICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICBxeCAqIF90cmFuc2Zvcm0udyArIHF3ICogLSBfdHJhbnNmb3JtLnggKyBxeSAqIC0gX3RyYW5zZm9ybS56IC0gcXogKiAtIF90cmFuc2Zvcm0ueSxcclxuICAgICAgICAgIHF5ICogX3RyYW5zZm9ybS53ICsgcXcgKiAtIF90cmFuc2Zvcm0ueSArIHF6ICogLSBfdHJhbnNmb3JtLnggLSBxeCAqIC0gX3RyYW5zZm9ybS56LFxyXG4gICAgICAgICAgcXogKiBfdHJhbnNmb3JtLncgKyBxdyAqIC0gX3RyYW5zZm9ybS56ICsgcXggKiAtIF90cmFuc2Zvcm0ueSAtIHF5ICogLSBfdHJhbnNmb3JtLnhcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgdG8gdGhlIGdpdmVuIGxlbmd0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE5PUk1BTElaQVRJT04oX3ZlY3RvcjogVmVjdG9yMywgX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgbWFnbml0dWRlU3F1YXJlZDogbnVtYmVyID0gX3ZlY3Rvci5tYWduaXR1ZGVTcXVhcmVkO1xyXG4gICAgICBpZiAobWFnbml0dWRlU3F1YXJlZCA9PSAwKVxyXG4gICAgICAgIHRocm93IChuZXcgUmFuZ2VFcnJvcihcIkltcG9zc2libGUgbm9ybWFsaXphdGlvblwiKSk7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBfdmVjdG9yLmNsb25lO1xyXG4gICAgICB2ZWN0b3Iuc2NhbGUoX2xlbmd0aCAvIE1hdGguc3FydChtYWduaXR1ZGVTcXVhcmVkKSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgdmVjdG9yIGF0dGFpbmVkIGJ5IGFkZGl0aW9uIG9mIGFsbCBnaXZlbiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNVTSguLi5fdmVjdG9yczogVmVjdG9yM1tdKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgZm9yIChsZXQgdmVjdG9yIG9mIF92ZWN0b3JzKVxyXG4gICAgICAgIHJlc3VsdC5zZXQocmVzdWx0LnggKyB2ZWN0b3IueCwgcmVzdWx0LnkgKyB2ZWN0b3IueSwgcmVzdWx0LnogKyB2ZWN0b3Iueik7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHN1YnRyYWN0aW9uIG9mIHR3byB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIERJRkZFUkVOQ0UoX21pbnVlbmQ6IFZlY3RvcjMsIF9zdWJ0cmFoZW5kOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfbWludWVuZC54IC0gX3N1YnRyYWhlbmQueCwgX21pbnVlbmQueSAtIF9zdWJ0cmFoZW5kLnksIF9taW51ZW5kLnogLSBfc3VidHJhaGVuZC56KTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBuZXcgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gdmVjdG9yIHNjYWxlZCBieSB0aGUgZ2l2ZW4gc2NhbGluZyBmYWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTQ0FMRShfdmVjdG9yOiBWZWN0b3IzLCBfc2NhbGluZzogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBzY2FsZWQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgc2NhbGVkLnNldChfdmVjdG9yLnggKiBfc2NhbGluZywgX3ZlY3Rvci55ICogX3NjYWxpbmcsIF92ZWN0b3IueiAqIF9zY2FsaW5nKTtcclxuICAgICAgcmV0dXJuIHNjYWxlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIHRoZSBjcm9zc3Byb2R1Y3Qgb2YgMiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENST1NTKF9hOiBWZWN0b3IzLCBfYjogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHZlY3Rvci5zZXQoXHJcbiAgICAgICAgX2EueSAqIF9iLnogLSBfYS56ICogX2IueSxcclxuICAgICAgICBfYS56ICogX2IueCAtIF9hLnggKiBfYi56LFxyXG4gICAgICAgIF9hLnggKiBfYi55IC0gX2EueSAqIF9iLnhcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgdGhlIGRvdHByb2R1Y3Qgb2YgMiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIERPVChfYTogVmVjdG9yMywgX2I6IFZlY3RvcjMpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX2EueCAqIF9iLnggKyBfYS55ICogX2IueSArIF9hLnogKiBfYi56OztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHJlZmxlY3Rpb24gb2YgdGhlIGluY29taW5nIHZlY3RvciBhdCB0aGUgZ2l2ZW4gbm9ybWFsIHZlY3Rvci4gVGhlIGxlbmd0aCBvZiBub3JtYWwgc2hvdWxkIGJlIDEuXHJcbiAgICAgKiAgICAgX19fX19fX19fX19fX19fX19fXHJcbiAgICAgKiAgICAgICAgICAgL3xcXFxyXG4gICAgICogaW5jb21pbmcgLyB8IFxcIHJlZmxlY3Rpb25cclxuICAgICAqICAgICAgICAgLyAgfCAgXFwgICBcclxuICAgICAqICAgICAgICAgIG5vcm1hbFxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUkVGTEVDVElPTihfaW5jb21pbmc6IFZlY3RvcjMsIF9ub3JtYWw6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGRvdDogbnVtYmVyID0gLVZlY3RvcjMuRE9UKF9pbmNvbWluZywgX25vcm1hbCk7XHJcbiAgICAgIGxldCByZWZsZWN0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5TVU0oX2luY29taW5nLCBWZWN0b3IzLlNDQUxFKF9ub3JtYWwsIDIgKiBkb3QpKTtcclxuICAgICAgcmV0dXJuIHJlZmxlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXZpZGVzIHRoZSBkaXZpZGVuZCBieSB0aGUgZGl2aXNvciBjb21wb25lbnQgYnkgY29tcG9uZW50IGFuZCByZXR1cm5zIHRoZSByZXN1bHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSQVRJTyhfZGl2aWRlbmQ6IFZlY3RvcjMsIF9kaXZpc29yOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfZGl2aWRlbmQueCAvIF9kaXZpc29yLngsIF9kaXZpZGVuZC55IC8gX2Rpdmlzb3IueSwgX2RpdmlkZW5kLnogLyBfZGl2aXNvci56KTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBjYXJ0ZXNpYW4gdmVjdG9yIGZyb20gZ2VvZ3JhcGhpYyBjb29yZGluYXRlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEdFTyhfbG9uZ2l0dWRlOiBudW1iZXIgPSAwLCBfbGF0aXR1ZGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICBsZXQgZ2VvOiBHZW8zID0gUmVjeWNsZXIucmV1c2UoR2VvMyk7XHJcbiAgICAgIGdlby5zZXQoX2xvbmdpdHVkZSwgX2xhdGl0dWRlLCBfbWFnbml0dWRlKTtcclxuICAgICAgdmVjdG9yLmdlbyA9IGdlbztcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoZ2VvKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgYW5nbGUgaW4gZGVncmVlcyBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gdmVjdG9yc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEFOR0xFKF9mcm9tOiBWZWN0b3IzLCBfdG86IFZlY3RvcjMpOiBudW1iZXIge1xyXG4gICAgICBsZXQgYW5nbGU6IG51bWJlciA9IE1hdGguYWNvcyhWZWN0b3IzLkRPVChfZnJvbSwgX3RvKSAvIChfZnJvbS5tYWduaXR1ZGUgKiBfdG8ubWFnbml0dWRlKSk7XHJcbiAgICAgIHJldHVybiBhbmdsZSAqIENhbGMucmFkMmRlZztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBBY2Nlc3NvcnNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYWduaXR1ZGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGguaHlwb3QodGhpcy54LCB0aGlzLnksIHRoaXMueik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzcXVhcmUgb2YgdGhlIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yIHdpdGhvdXQgY2FsY3VsYXRpbmcgYSBzcXVhcmUgcm9vdC4gRmFzdGVyIGZvciBzaW1wbGUgcHJveGltaXR5IGV2YWx1YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlU3F1YXJlZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gVmVjdG9yMy5ET1QodGhpcywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIGdldDogcmV0dXJucyBhIGdlb2dyYXBoaWMgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2ZWN0b3IgIFxyXG4gICAgICogLSBzZXQ6IGFkanVzdCB0aGUgY2FydGVzaWFuIHZhbHVlcyBvZiB0aGlzIHZlY3RvciB0byByZXByZXNlbnQgdGhlIGdpdmVuIGFzIGdlb2dyYXBoaWMgY29vcmRpbmF0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBnZW8oX2dlbzogR2VvMykge1xyXG4gICAgICB0aGlzLnNldCgwLCAwLCBfZ2VvLm1hZ25pdHVkZSk7XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtKE1hdHJpeDR4NC5ST1RBVElPTl9YKC1fZ2VvLmxhdGl0dWRlKSk7XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtKE1hdHJpeDR4NC5ST1RBVElPTl9ZKF9nZW8ubG9uZ2l0dWRlKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGdlbygpOiBHZW8zIHtcclxuICAgICAgbGV0IGdlbzogR2VvMyA9IFJlY3ljbGVyLmdldChHZW8zKTtcclxuICAgICAgZ2VvLm1hZ25pdHVkZSA9IHRoaXMubWFnbml0dWRlO1xyXG5cclxuICAgICAgaWYgKGdlby5tYWduaXR1ZGUgPT09IDApXHJcbiAgICAgICAgcmV0dXJuIGdlbztcclxuXHJcbiAgICAgIGdlby5sb25naXR1ZGUgPSAxODAgKiBNYXRoLmF0YW4yKHRoaXMueCAvIGdlby5tYWduaXR1ZGUsIHRoaXMueiAvIGdlby5tYWduaXR1ZGUpIC8gTWF0aC5QSTtcclxuICAgICAgZ2VvLmxhdGl0dWRlID0gMTgwICogTWF0aC5hc2luKHRoaXMueSAvIGdlby5tYWduaXR1ZGUpIC8gTWF0aC5QSTtcclxuICAgICAgcmV0dXJuIGdlbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjbG9uZSBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjbG9uZSgpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGUgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGludG8gdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXQoX29yaWdpbmFsLngsIF9vcmlnaW5hbC55LCBfb3JpZ2luYWwueik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0KDAsIDAsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb29yZGluYXRlcyBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yIGFyZSB0byBiZSBjb25zaWRlcmVkIGlkZW50aWNhbCB3aXRoaW4gdGhlIGdpdmVuIHRvbGVyYW5jZVxyXG4gICAgICogVE9ETzogZXhhbWluZSwgaWYgdG9sZXJhbmNlIGFzIGNyaXRlcml1bSBmb3IgdGhlIGRpZmZlcmVuY2UgaXMgYXBwcm9wcmlhdGUgd2l0aCB2ZXJ5IGxhcmdlIGNvb3JkaW5hdGUgdmFsdWVzIG9yIGlmIF90b2xlcmFuY2Ugc2hvdWxkIGJlIG11bHRpcGxpZWQgYnkgY29vcmRpbmF0ZSB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXF1YWxzKF9jb21wYXJlOiBWZWN0b3IzLCBfdG9sZXJhbmNlOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTik6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAoTWF0aC5hYnModGhpcy54IC0gX2NvbXBhcmUueCkgPiBfdG9sZXJhbmNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLnkgLSBfY29tcGFyZS55KSA+IF90b2xlcmFuY2UpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKE1hdGguYWJzKHRoaXMueiAtIF9jb21wYXJlLnopID4gX3RvbGVyYW5jZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9zaXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgaXMgd2l0aGluIGEgY3ViZSB3aXRoIHRoZSBvcHBvc2l0ZSBjb3JuZXJzIDEgYW5kIDJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzSW5zaWRlQ3ViZShfY29ybmVyMTogVmVjdG9yMywgX2Nvcm5lcjI6IFZlY3RvcjMpOiBib29sZWFuIHtcclxuICAgICAgbGV0IGRpYWdvbmFsOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF9jb3JuZXIyLCBfY29ybmVyMSk7XHJcbiAgICAgIGxldCByZWxhdGl2ZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLCBfY29ybmVyMSk7XHJcbiAgICAgIGxldCByYXRpbzogVmVjdG9yMyA9IFZlY3RvcjMuUkFUSU8ocmVsYXRpdmUsIGRpYWdvbmFsKTtcclxuICAgICAgaWYgKHJhdGlvLnggPiAxIHx8IHJhdGlvLnggPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHJhdGlvLnkgPiAxIHx8IHJhdGlvLnkgPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHJhdGlvLnogPiAxIHx8IHJhdGlvLnogPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBvc2l0aW9uIGRlc2NyaWJlZCBieSB0aGlzIGlzIHdpdGhpbiBhIHNwaGVyZSB3aXRoIHRoZSBnaXZlbiBjZW50ZXIgYW5kIHJhZGl1c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJbnNpZGVTcGhlcmUoX2NlbnRlcjogVmVjdG9yMywgX3JhZGl1czogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBkaWZmZXJlbmNlOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHRoaXMsIF9jZW50ZXIpO1xyXG4gICAgICByZXR1cm4gZGlmZmVyZW5jZS5tYWduaXR1ZGVTcXVhcmVkIDwgKF9yYWRpdXMgKiBfcmFkaXVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfYWRkZW5kOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIHRoaXMueCArPSBfYWRkZW5kLng7XHJcbiAgICAgIHRoaXMueSArPSBfYWRkZW5kLnk7XHJcbiAgICAgIHRoaXMueiArPSBfYWRkZW5kLno7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN1YnRyYWN0KF9zdWJ0cmFoZW5kOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIHRoaXMueCAtPSBfc3VidHJhaGVuZC54O1xyXG4gICAgICB0aGlzLnkgLT0gX3N1YnRyYWhlbmQueTtcclxuICAgICAgdGhpcy56IC09IF9zdWJ0cmFoZW5kLno7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbGVzIHRoaXMgdmVjdG9yIGJ5IHRoZSBnaXZlbiBzY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZShfc2NhbGFyOiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgdGhpcy54ICo9IF9zY2FsYXI7XHJcbiAgICAgIHRoaXMueSAqPSBfc2NhbGFyO1xyXG4gICAgICB0aGlzLnogKj0gX3NjYWxhcjtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemVzIHRoaXMgdG8gdGhlIGdpdmVuIGxlbmd0aCwgMSBieSBkZWZhdWx0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBub3JtYWxpemUoX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb3B5KFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLCBfbGVuZ3RoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGVzIHRoaXMgdmVjdG9yIGJ5IGZsaXBwaW5nIHRoZSBzaWducyBvZiBpdHMgY29tcG9uZW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSAtdGhpcy54O1xyXG4gICAgICB0aGlzLnkgPSAtdGhpcy55O1xyXG4gICAgICB0aGlzLnogPSAtdGhpcy56O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYW5kIHJldHVybnMgaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwLCBfejogbnVtYmVyID0gMCk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSBfeDtcclxuICAgICAgdGhpcy55ID0gX3k7XHJcbiAgICAgIHRoaXMueiA9IF96O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoW3RoaXMueCwgdGhpcy55LCB0aGlzLnpdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhpcyB2ZWN0b3IgYnkgdGhlIGdpdmVuIG1hdHJpeCBvciByb3RhdGlvbiBxdWF0ZXJuaW9uLiBcclxuICAgICAqIEluY2x1ZGluZyBvciBleGx1ZGluZyB0aGUgdHJhbnNsYXRpb24gaWYgYSBtYXRyaXggaXMgcGFzc2VkLlxyXG4gICAgICogSW5jbHVkaW5nIGlzIHRoZSBkZWZhdWx0LCBleGNsdWRpbmcgd2lsbCBvbmx5IHJvdGF0ZSBhbmQgc2NhbGUgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2Zvcm0oX3RyYW5zZm9ybTogTWF0cml4NHg0IHwgUXVhdGVybmlvbiwgX2luY2x1ZGVUcmFuc2xhdGlvbjogYm9vbGVhbiA9IHRydWUpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHRyYW5zZm9ybWVkOiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTih0aGlzLCBfdHJhbnNmb3JtLCBfaW5jbHVkZVRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5jb3B5KHRyYW5zZm9ybWVkKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNmb3JtZWQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyb3BzIHRoZSB6LWNvbXBvbmVudCBhbmQgcmV0dXJucyBhIFZlY3RvcjIgY29uc2lzdGluZyBvZiB0aGUgeC0gYW5kIHktY29tcG9uZW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9WZWN0b3IyKCk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy54LCB0aGlzLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVmbGVjdHMgdGhpcyB2ZWN0b3IgYXQgYSBnaXZlbiBub3JtYWwuIFNlZSB7QGxpbmsgVmVjdG9yMy5SRUZMRUNUSU9OfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVmbGVjdChfbm9ybWFsOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHJlZmxlY3RlZDogVmVjdG9yMyA9IFZlY3RvcjMuUkVGTEVDVElPTih0aGlzLCBfbm9ybWFsKTtcclxuICAgICAgdGhpcy5zZXQocmVmbGVjdGVkLngsIHJlZmxlY3RlZC55LCByZWZsZWN0ZWQueik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlZmxlY3RlZCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2h1ZmZsZXMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNodWZmbGUoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBhOiBudW1iZXJbXSA9IFt0aGlzLngsIHRoaXMueSwgdGhpcy56XTtcclxuICAgICAgdGhpcy5zZXQoUmFuZG9tLmRlZmF1bHQuc3BsaWNlKGEpLCBSYW5kb20uZGVmYXVsdC5zcGxpY2UoYSksIGFbMF0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGJld3R3ZWVuIHRoaXMgdmVjdG9yIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREaXN0YW5jZShfdG86IFZlY3RvcjMpOiBudW1iZXIge1xyXG4gICAgICBsZXQgZGlmZmVyZW5jZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLCBfdG8pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShkaWZmZXJlbmNlKTtcclxuICAgICAgcmV0dXJuIGRpZmZlcmVuY2UubWFnbml0dWRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggZGltZW5zaW9uLCBtb3ZlcyB0aGUgY29tcG9uZW50IHRvIHRoZSBtaW5pbXVtIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1pbihfY29tcGFyZTogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSBNYXRoLm1pbih0aGlzLngsIF9jb21wYXJlLngpO1xyXG4gICAgICB0aGlzLnkgPSBNYXRoLm1pbih0aGlzLnksIF9jb21wYXJlLnkpO1xyXG4gICAgICB0aGlzLnogPSBNYXRoLm1pbih0aGlzLnosIF9jb21wYXJlLnopO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciBlYWNoIGRpbWVuc2lvbiwgbW92ZXMgdGhlIGNvbXBvbmVudCB0byB0aGUgbWF4aW11bSBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYXgoX2NvbXBhcmU6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgdGhpcy54ID0gTWF0aC5tYXgodGhpcy54LCBfY29tcGFyZS54KTtcclxuICAgICAgdGhpcy55ID0gTWF0aC5tYXgodGhpcy55LCBfY29tcGFyZS55KTtcclxuICAgICAgdGhpcy56ID0gTWF0aC5tYXgodGhpcy56LCBfY29tcGFyZS56KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZlY3RvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHJlc3VsdDogc3RyaW5nID0gYCgke3RoaXMueC50b1ByZWNpc2lvbig1KX0sICR7dGhpcy55LnRvUHJlY2lzaW9uKDUpfSwgJHt0aGlzLnoudG9QcmVjaXNpb24oNSl9KWA7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VzIHRoZSBzdGFuZGFyZCBhcnJheS5tYXAgZnVuY3Rpb25hbGl0eSB0byBwZXJmb3JtIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiBhbGwgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvclxyXG4gICAgICogYW5kIHJldHVybiBhIG5ldyB2ZWN0b3Igd2l0aCB0aGUgcmVzdWx0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWFwKF9mdW5jdGlvbjogKHZhbHVlOiBudW1iZXIsIGluZGV4OiBudW1iZXIsIGFycmF5OiBBcnJheUxpa2U8bnVtYmVyPikgPT4gbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBjb3B5OiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG4gICAgICBjb3B5LnNldCguLi5bdGhpcy54LCB0aGlzLnksIHRoaXMuel0ubWFwKF9mdW5jdGlvbikpO1xyXG4gICAgICByZXR1cm4gY29weTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYHsgXCJyXCI6ICR7dGhpcy5yfSwgXCJnXCI6ICR7dGhpcy5nfSwgXCJiXCI6ICR7dGhpcy5ifSwgXCJhXCI6ICR7dGhpcy5hfX1gOyB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGBbJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fV1gOyB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFZlY3RvcjM+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX3NlcmlhbGl6YXRpb24pID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBbdGhpcy54LCB0aGlzLnksIHRoaXMuel0gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKF9tdXRhdG9yLnggIT09IHVuZGVmaW5lZClcclxuICAgICAgICB0aGlzLnggPSBfbXV0YXRvci54O1xyXG4gICAgICBpZiAoX211dGF0b3IueSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRoaXMueSA9IF9tdXRhdG9yLnk7XHJcbiAgICAgIGlmIChfbXV0YXRvci56ICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy56ID0gX211dGF0b3IuejtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7IHg6IHRoaXMueCwgeTogdGhpcy55LCB6OiB0aGlzLnogfTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcbiAgICAvLyNlbmRyZWdpb24gVHJhbnNmZXJcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBTdG9yZXMgYW5kIG1hbmlwdWxhdGVzIGEgZm91cmRpbWVuc2lvbmFsIHZlY3RvciBjb21wcmlzZWQgb2YgdGhlIGNvbXBvbmVudHMgeCwgeSwgeiBhbmQgdy5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVjdG9yNCBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xyXG4gICAgcHVibGljIHk6IG51bWJlcjtcclxuICAgIHB1YmxpYyB6OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgdzogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfeDogbnVtYmVyID0gMCwgX3k6IG51bWJlciA9IDAsIF96OiBudW1iZXIgPSAwLCBfdzogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldChfeCwgX3ksIF96LCBfdyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFnbml0dWRlIChsZW5ndGgpIG9mIHRoZSB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBNYXRoLmh5cG90KHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc3F1YXJlZCBtYWduaXR1ZGUgKGxlbmd0aCkgb2YgdGhlIHZlY3Rvci4gRmFzdGVyIGZvciBzaW1wbGUgcHJveGltaXR5IGV2YWx1YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlU3F1YXJlZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5kb3QodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogVmVjdG9yNCB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5yZXVzZShWZWN0b3I0KS5jb3B5KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBjb21wb25lbnRzIG9mIHRoZSBnaXZlbiB2ZWN0b3IgaW50byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNldChfb3JpZ2luYWwueCwgX29yaWdpbmFsLnksIF9vcmlnaW5hbC56LCBfb3JpZ2luYWwudyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBWZWN0b3I0IHtcclxuICAgICAgdGhpcy54ID0gX3g7IHRoaXMueSA9IF95OyB0aGlzLnogPSBfejsgdGhpcy53ID0gX3c7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgIHJldHVybiBbdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfYWRkZW5kOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCArPSBfYWRkZW5kLng7IHRoaXMueSArPSBfYWRkZW5kLnk7IHRoaXMueiArPSBfYWRkZW5kLno7IHRoaXMudyArPSBfYWRkZW5kLnc7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN1YnRyYWN0KF9zdWJ0cmFoZW5kOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCAtPSBfc3VidHJhaGVuZC54OyB0aGlzLnkgLT0gX3N1YnRyYWhlbmQueTsgdGhpcy56IC09IF9zdWJ0cmFoZW5kLno7IHRoaXMudyAtPSBfc3VidHJhaGVuZC53O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlcyB0aGlzIHZlY3RvciBieSB0aGUgZ2l2ZW4gc2NhbGFyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX3NjYWxhcjogbnVtYmVyKTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCAqPSBfc2NhbGFyOyB0aGlzLnkgKj0gX3NjYWxhcjsgdGhpcy56ICo9IF9zY2FsYXI7IHRoaXMudyAqPSBfc2NhbGFyO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgdGhpcyB2ZWN0b3IgdG8gdGhlIGdpdmVuIGxlbmd0aCwgMSBieSBkZWZhdWx0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbm9ybWFsaXplKF9sZW5ndGg6IG51bWJlciA9IDEpOiBWZWN0b3I0IHtcclxuICAgICAgbGV0IG1hZ25pdHVkZVNxdWFyZWQ6IG51bWJlciA9IHRoaXMubWFnbml0dWRlU3F1YXJlZDtcclxuICAgICAgaWYgKG1hZ25pdHVkZVNxdWFyZWQgPT0gMClcclxuICAgICAgICB0aHJvdyAobmV3IFJhbmdlRXJyb3IoXCJJbXBvc3NpYmxlIG5vcm1hbGl6YXRpb25cIikpO1xyXG4gICAgICB0aGlzLnNjYWxlKF9sZW5ndGggLyBNYXRoLnNxcnQobWFnbml0dWRlU3F1YXJlZCkpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoaXMgaW5zdGFuY2UgYW5kIGFub3RoZXIgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZG90KF9vdGhlcjogVmVjdG9yNCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLnggKiBfb3RoZXIueCArIHRoaXMueSAqIF9vdGhlci55ICsgdGhpcy56ICogX290aGVyLnogKyB0aGlzLncgKiBfb3RoZXIudztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHsgdG9KU09OOiAoKSA9PiBgWyR7dGhpcy54fSwgJHt0aGlzLnl9LCAke3RoaXMuen0sICR7dGhpcy53fV1gIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxWZWN0b3I0PiB7XHJcbiAgICAgIFt0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLnddID0gSlNPTi5wYXJzZSg8c3RyaW5nPjx1bmtub3duPl9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsgLyoqICovIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRGVzY3JpYmVzIGEgZmFjZSBvZiBhIHtAbGluayBNZXNofSBieSByZWZlcmVuY2luZyB0aHJlZSB7QGxpbmsgVmVydGljZXN9IHdpdGggdGhlaXIgaW5kaXplc1xyXG4gICAqIGFuZCBjYWxjdWxhdGVzIGZhY2Ugbm9ybWFscy5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBGYWNlIHtcclxuICAgIHB1YmxpYyBpbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgcHVibGljIGFuZ2xlczogbnVtYmVyW10gPSBbXTtcclxuICAgIHB1YmxpYyBub3JtYWxVbnNjYWxlZDogVmVjdG9yMztcclxuICAgIHB1YmxpYyBub3JtYWw6IFZlY3RvcjM7XHJcbiAgICBwcml2YXRlIHZlcnRpY2VzOiBWZXJ0aWNlcztcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3ZlcnRpY2VzOiBWZXJ0aWNlcywgX2luZGV4MDogbnVtYmVyLCBfaW5kZXgxOiBudW1iZXIsIF9pbmRleDI6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmluZGljZXMgPSBbX2luZGV4MCwgX2luZGV4MSwgX2luZGV4Ml07XHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBfdmVydGljZXM7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlTm9ybWFscygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIHZlcnRleCByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBpbmRleFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UG9zaXRpb24oX2luZGV4OiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmVydGljZXMucG9zaXRpb24odGhpcy5pbmRpY2VzW19pbmRleF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogbXVzdCBiZSBjb3BsYW5hclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJbnNpZGUoX3BvaW50OiBWZWN0b3IzKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBkaWZmczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGluZGV4IG9mIHRoaXMuaW5kaWNlcykge1xyXG4gICAgICAgIGxldCBkaWZmOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHRoaXMudmVydGljZXMucG9zaXRpb24oaW5kZXgpLCBfcG9pbnQpO1xyXG4gICAgICAgIGRpZmZzLnB1c2goZGlmZik7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG4wOiBWZWN0b3IzID0gVmVjdG9yMy5DUk9TUyhkaWZmc1sxXSwgZGlmZnNbMF0pO1xyXG4gICAgICBsZXQgbjE6IFZlY3RvcjMgPSBWZWN0b3IzLkNST1NTKGRpZmZzWzJdLCBkaWZmc1sxXSk7XHJcbiAgICAgIGxldCBuMjogVmVjdG9yMyA9IFZlY3RvcjMuQ1JPU1MoZGlmZnNbMF0sIGRpZmZzWzJdKTtcclxuXHJcbiAgICAgIGxldCBkb3QxOiBudW1iZXIgPSBWZWN0b3IzLkRPVChuMCwgbjEpO1xyXG4gICAgICBsZXQgZG90MjogbnVtYmVyID0gVmVjdG9yMy5ET1QobjAsIG4yKTtcclxuXHJcbiAgICAgIHJldHVybiAhKGRvdDEgPCAwIHx8IGRvdDIgPCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZU5vcm1hbHMoKTogdm9pZCB7XHJcbiAgICAgIGxldCB0cmlnb246IFZlY3RvcjNbXSA9IHRoaXMuaW5kaWNlcy5tYXAoKF9pbmRleDogbnVtYmVyKSA9PiB0aGlzLnZlcnRpY2VzLnBvc2l0aW9uKF9pbmRleCkpO1xyXG4gICAgICBsZXQgdjE6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzFdLCB0cmlnb25bMF0pO1xyXG4gICAgICBsZXQgdjI6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzJdLCB0cmlnb25bMF0pO1xyXG4gICAgICB0aGlzLm5vcm1hbFVuc2NhbGVkID0gVmVjdG9yMy5DUk9TUyh2MSwgdjIpO1xyXG4gICAgICB0aGlzLm5vcm1hbCA9IFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLm5vcm1hbFVuc2NhbGVkKTtcclxuICAgICAgdGhpcy5hbmdsZXMucHVzaChcclxuICAgICAgICBWZWN0b3IzLkFOR0xFKHYxLCB2MiksXHJcbiAgICAgICAgVmVjdG9yMy5BTkdMRShWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzJdLCB0cmlnb25bMV0pLCBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzBdLCB0cmlnb25bMV0pKSxcclxuICAgICAgICBWZWN0b3IzLkFOR0xFKFZlY3RvcjMuRElGRkVSRU5DRSh0cmlnb25bMF0sIHRyaWdvblsyXSksIFZlY3RvcjMuRElGRkVSRU5DRSh0cmlnb25bMV0sIHRyaWdvblsyXSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG1lc2hlcy4gXHJcbiAgICogTWVzaGVzIHByb3ZpZGUgaW5kZXhlZCB2ZXJ0aWNlcywgdGhlIG9yZGVyIG9mIGluZGljZXMgdG8gY3JlYXRlIHRyaWdvbnMgYW5kIG5vcm1hbHMsIGFuZCB0ZXh0dXJlIGNvb3JkaW5hdGVzXHJcbiAgICogXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTkvMjJcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JNZXNoLmRlY29yYXRlXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lc2ggZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlUmVzb3VyY2Uge1xyXG4gICAgLyoqIHJlZmVycyBiYWNrIHRvIHRoaXMgY2xhc3MgZnJvbSBhbnkgc3ViY2xhc3MgZS5nLiBpbiBvcmRlciB0byBmaW5kIGNvbXBhdGlibGUgb3RoZXIgcmVzb3VyY2VzKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYmFzZUNsYXNzOiB0eXBlb2YgTWVzaCA9IE1lc2g7XHJcbiAgICAvKiogbGlzdCBvZiBhbGwgdGhlIHN1YmNsYXNzZXMgZGVyaXZlZCBmcm9tIHRoaXMgY2xhc3MsIGlmIHRoZXkgcmVnaXN0ZXJlZCBwcm9wZXJseSovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN1YmNsYXNzZXM6IHR5cGVvZiBNZXNoW10gPSBbXTtcclxuXHJcbiAgICAvLyBUT0RPOiByZW5hbWUgdmVydGljZXMgdG8gdmVydGljZXNTbW9vdGggb3IganVzdCBjbG91ZCwgYW5kIGNsb3VkIHRvIHZlcnRpY2VzXHJcblxyXG4gICAgcHVibGljIGlkUmVzb3VyY2U6IHN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIk1lc2hcIjtcclxuICAgIC8vIGJhc2Ugc3RydWN0dXJlIGZvciBtZXNoZXMgaW4gRlVER0VcclxuICAgIHB1YmxpYyB2ZXJ0aWNlczogVmVydGljZXMgPSBuZXcgVmVydGljZXMoKTtcclxuICAgIHB1YmxpYyBmYWNlczogRmFjZVtdID0gW107XHJcblxyXG4gICAgLy8gcHVibGljIHJlbmRlckJ1ZmZlcnM6IFJlbmRlckJ1ZmZlcnM7IC8qIGRlZmluZWQgYnkgUmVuZGVySW5qZWN0b3IqL1xyXG5cclxuICAgIC8qKiBib3VuZGluZyBib3ggQUFCQiAqL1xyXG4gICAgcHJvdGVjdGVkIMaSYm94OiBCb3g7XHJcbiAgICAvLyBUT0RPOiBleHBsb3JlIG1hdGhlbWF0aWNzIGZvciBlYXN5IHRyYW5zZm9ybWF0aW9ucyBvZiByYWRpdXMgXHJcbiAgICAvKiogYm91bmRpbmcgcmFkaXVzICovXHJcbiAgICBwcm90ZWN0ZWQgxpJyYWRpdXM6IG51bWJlcjtcclxuXHJcbiAgICAjcmVuZGVyTWVzaDogUmVuZGVyTWVzaDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFwiKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgIFByb2plY3QucmVnaXN0ZXIodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWdpc3RlclN1YmNsYXNzKF9zdWJDbGFzczogdHlwZW9mIE1lc2gpOiBudW1iZXIgeyByZXR1cm4gTWVzaC5zdWJjbGFzc2VzLnB1c2goX3N1YkNsYXNzKSAtIDE7IH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHJlbmRlck1lc2goKTogUmVuZGVyTWVzaCB7XHJcbiAgICAgIGlmICh0aGlzLiNyZW5kZXJNZXNoID09IG51bGwpXHJcbiAgICAgICAgdGhpcy4jcmVuZGVyTWVzaCA9IG5ldyBSZW5kZXJNZXNoKHRoaXMpO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI3JlbmRlck1lc2g7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBib3VuZGluZ0JveCgpOiBCb3gge1xyXG4gICAgICBpZiAodGhpcy7GkmJveCA9PSBudWxsKVxyXG4gICAgICAgIHRoaXMuxpJib3ggPSB0aGlzLmNyZWF0ZUJvdW5kaW5nQm94KCk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy7GkmJveDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgcmFkaXVzKCk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0aGlzLsaScmFkaXVzID09IG51bGwpXHJcbiAgICAgICAgdGhpcy7GknJhZGl1cyA9IHRoaXMuY3JlYXRlUmFkaXVzKCk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy7GknJhZGl1cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3Rvck1lc2h9LlxyXG4gICAgICogVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXNlUmVuZGVyQnVmZmVycyhfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9tdHhNZXNoVG9Xb3JsZDogTWF0cml4NHg0LCBfbXR4TWVzaFRvVmlldzogTWF0cml4NHg0LCBfaWQ/OiBudW1iZXIpOiBSZW5kZXJCdWZmZXJzIHsgcmV0dXJuIG51bGw7IC8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JNZXNofS5cclxuICAgICAqIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlbmRlckJ1ZmZlcnMoKTogUmVuZGVyQnVmZmVycyB7IHJldHVybiBudWxsOyAvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yTWVzaH0uXHJcbiAgICAgKiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVSZW5kZXJCdWZmZXJzKF9yZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgUmVuZGVySW5qZWN0b3IqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGJvdW5kcyBvZiB0aGlzIG1lc2ggYXN3ZWxsIGFzIHRoZSBidWZmZXJzIG9mIHRoZSBhc3NvY2lhdGVkIHtAbGluayBSZW5kZXJNZXNofS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLsaSYm94ID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLsaScmFkaXVzID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgdGhpcy5kZWxldGVSZW5kZXJCdWZmZXJzKHRoaXMucmVuZGVyTWVzaC5idWZmZXJzKTtcclxuICAgICAgdGhpcy5yZW5kZXJNZXNoLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICAvLyBTZXJpYWxpemUvRGVzZXJpYWxpemUgZm9yIGFsbCBtZXNoZXMgdGhhdCBjYWxjdWxhdGUgd2l0aG91dCBwYXJhbWV0ZXJzXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSAvLyBzdG9yZSBmb3IgZWRpdG9yIHZpZXdcclxuICAgICAgfTsgLy8gbm8gZGF0YSBuZWVkZWQgLi4uXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgLy8gdHlwZSBpcyBhbiBhY2Nlc3NvciBhbmQgbXVzdCBub3QgYmUgZGVzZXJpYWxpemVkXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIC8vIFRPRE86IHNvIG11Y2ggdG8gZGVsZXRlLi4uIHJhdGhlciBqdXN0IGdhdGhlciB3aGF0IHRvIG11dGF0ZVxyXG4gICAgICBkZWxldGUgX211dGF0b3IuxpJib3g7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci7GknJhZGl1cztcclxuXHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5yZW5kZXJCdWZmZXJzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVSYWRpdXMoKTogbnVtYmVyIHtcclxuICAgICAgLy9UT0RPOiByYWRpdXMgYW5kIGJvdW5kaW5nIGJveCBjb3VsZCBiZSBjcmVhdGVkIG9uIGNvbnN0cnVjdGlvbiBvZiB2ZXJ0ZXgtYXJyYXlcclxuICAgICAgbGV0IHJhZGl1czogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICByYWRpdXMgPSBNYXRoLm1heChyYWRpdXMsIHRoaXMudmVydGljZXMucG9zaXRpb24oaSkubWFnbml0dWRlU3F1YXJlZCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE1hdGguc3FydChyYWRpdXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVCb3VuZGluZ0JveCgpOiBCb3gge1xyXG4gICAgICBsZXQgYm94OiBCb3ggPSBSZWN5Y2xlci5nZXQoQm94KTtcclxuICAgICAgYm94LnNldCgpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBwb2ludDogVmVjdG9yMyA9IHRoaXMudmVydGljZXMucG9zaXRpb24oaSk7XHJcbiAgICAgICAgYm94LmV4cGFuZChwb2ludCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGJveDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIHNpbXBsZSBjdWJlIHdpdGggZWRnZXMgb2YgbGVuZ3RoIDEsIGVhY2ggZmFjZSBjb25zaXN0aW5nIG9mIHR3byB0cmlnb25zXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICgxMikgNF9fX183ICAoMTEpXHJcbiAgICogICAgICAgKDgpIDAvX18zL3wgKDEwKVxyXG4gICAqICAgICAgICgxNSkgfHw1X3x8NiAoMTQpXHJcbiAgICogICAgICAgKDkpIDF8L18yfC8gKDEzKVxyXG4gICAqIGBgYFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hDdWJlIGV4dGVuZHMgTWVzaCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hDdWJlKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaEN1YmVcIikge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcblxyXG4gICAgICAvLyBubyBzaGFyZWQgdmVydGljZXMsIGNvcm5lcnMgbmVlZCB0aHJlZSBub3JtYWxzIGZvciBQaG9uZyBhbmQgR291cmF1ZFxyXG4gICAgICB0aGlzLnZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKFxyXG4gICAgICAgIC8vIGZyb250IHZlcnRpY2VzXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygtMC41LCAwLjUsIDAuNSksIG5ldyBWZWN0b3IyKDAsIDApKSwgLy8gMFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoLTAuNSwgLTAuNSwgMC41KSwgbmV3IFZlY3RvcjIoMCwgMSkpLCAvLyAxXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygwLjUsIC0wLjUsIDAuNSksIG5ldyBWZWN0b3IyKDEsIDEpKSwgLy8gMlxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC41LCAwLjUsIDAuNSksIG5ldyBWZWN0b3IyKDEsIDApKSAvLzNcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIGdlbmVyYXRlIHZlcnRpY2VzIG9uIHNpZGVzXHJcbiAgICAgIGZvciAobGV0IGFuZ2xlOiBudW1iZXIgPSA5MDsgYW5nbGUgPCAzNjA7IGFuZ2xlICs9IDkwKSB7XHJcbiAgICAgICAgbGV0IHRyYW5zZm9ybTogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OKFZlY3RvcjMuWShhbmdsZSkpO1xyXG4gICAgICAgIGxldCBzaWRlOiBWZXJ0ZXhbXSA9IHRoaXMudmVydGljZXMuc2xpY2UoMCwgNCkubWFwKChfdjogVmVydGV4KSA9PlxyXG4gICAgICAgICAgbmV3IFZlcnRleChWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF92LnBvc2l0aW9uLCB0cmFuc2Zvcm0pLCBfdi51dikpO1xyXG4gICAgICAgIHRoaXMudmVydGljZXMucHVzaCguLi5zaWRlKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBmb3IgdG9wIGFuZCBib3R0b21cclxuICAgICAgZm9yIChsZXQgYW5nbGU6IG51bWJlciA9IDkwOyBhbmdsZSA8IDM2MDsgYW5nbGUgKz0gMTgwKSB7XHJcbiAgICAgICAgbGV0IHRyYW5zZm9ybTogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OKFZlY3RvcjMuWChhbmdsZSkpO1xyXG4gICAgICAgIGxldCBzaWRlOiBWZXJ0ZXhbXSA9IHRoaXMudmVydGljZXMuc2xpY2UoMCwgNCkubWFwKChfdjogVmVydGV4KSA9PlxyXG4gICAgICAgICAgbmV3IFZlcnRleChWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF92LnBvc2l0aW9uLCB0cmFuc2Zvcm0pLCBfdi51dikpO1xyXG4gICAgICAgIHRoaXMudmVydGljZXMucHVzaCguLi5zaWRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5mYWNlcyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMjQ7IGkgKz0gNClcclxuICAgICAgICAvLyBnZW5lcmF0ZSBmYWNlc1xyXG4gICAgICAgIHRoaXMuZmFjZXMucHVzaCguLi5uZXcgUXVhZCh0aGlzLnZlcnRpY2VzLCBpICsgMCwgaSArIDEsIGkgKyAyLCBpICsgMykuZmFjZXMpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgZmxhdCBwb2x5Z29uLiBBbGwgdHJpZ29ucyBzaGFyZSB2ZXJ0ZXggMCwgc28gY2FyZWZ1bCBkZXNpZ24gaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGNvbmNhdmUgcG9seWdvbnMuIFxyXG4gICAqIFZlcnRleCAwIGlzIGFsc28gYXNzb2NpYXRlZCB3aXRoIHRoZSBmYWNlIG5vcm1hbC5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgICAgICAgMCBcclxuICAgKiAgICAgICAgICAgMeKVsXzilbIgIDQgLi4uXHJcbiAgICogICAgICAgICAgICDilbJ8X+KVsuKVsSBcclxuICAgKiAgICAgICAgICAgIDIgICAzXHJcbiAgICogYGBgXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEtMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUG9seWdvbiBleHRlbmRzIE1lc2gge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoUG9seWdvbik7XHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHNoYXBlRGVmYXVsdDogVmVjdG9yMltdID0gWyAvLyB0cmlnb24gaXMgdGhlIG1pbmltYWwgc2hhcGVcclxuICAgICAgbmV3IFZlY3RvcjIoLTEsIC0xKSxcclxuICAgICAgbmV3IFZlY3RvcjIoMSwgLTEpLFxyXG4gICAgICBuZXcgVmVjdG9yMigwLCAxKVxyXG4gICAgXTtcclxuICAgIHByb3RlY3RlZCBzaGFwZTogTXV0YWJsZUFycmF5PFZlY3RvcjI+ID0gbmV3IE11dGFibGVBcnJheTxWZWN0b3IyPihWZWN0b3IyKTtcclxuICAgIHByb3RlY3RlZCBmaXRUZXh0dXJlOiBib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoUG9seWdvblwiLCBfc2hhcGU6IFZlY3RvcjJbXSA9IE1lc2hQb2x5Z29uLnNoYXBlRGVmYXVsdCwgX2ZpdFRleHR1cmU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lKTtcclxuICAgICAgdGhpcy5jcmVhdGUoX3NoYXBlLCBfZml0VGV4dHVyZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldCBtaW5WZXJ0aWNlcygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gMztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSB0aGlzIG1lc2ggZnJvbSB0aGUgZ2l2ZW4gdmVydGljZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGUoX3NoYXBlOiBWZWN0b3IyW10gPSBbXSwgX2ZpdFRleHR1cmU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2hhcGUgPSA8TXV0YWJsZUFycmF5PFZlY3RvcjI+Pk11dGFibGVBcnJheS5mcm9tKF9zaGFwZS5tYXAoX3ZlcnRleCA9PiBfdmVydGV4LmNsb25lKSk7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgdGhpcy5maXRUZXh0dXJlID0gX2ZpdFRleHR1cmU7XHJcblxyXG4gICAgICBpZiAoX3NoYXBlLmxlbmd0aCA8IHRoaXMubWluVmVydGljZXMpIHtcclxuICAgICAgICBEZWJ1Zy53YXJuKGBBdCBsZWFzdCAke3RoaXMubWluVmVydGljZXN9IHZlcnRpY2VzIG5lZWRlZCB0byBjb25zdHJ1Y3QgTWVzaFBvbHlnb24sIGRlZmF1bHQgdHJpZ29uIHVzZWRgKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZShNZXNoUG9seWdvbi5zaGFwZURlZmF1bHQsIHRydWUpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHNoYXBlOiBWZWN0b3IyW10gPSBfc2hhcGU7XHJcblxyXG4gICAgICBsZXQgbWluOiBWZWN0b3IyID0gVmVjdG9yMi5aRVJPKCk7XHJcbiAgICAgIGxldCBtYXg6IFZlY3RvcjIgPSBWZWN0b3IyLlpFUk8oKTtcclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICBmb3IgKGxldCB2ZXJ0ZXggb2Ygc2hhcGUpIHtcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2gobmV3IFZlcnRleCh2ZXJ0ZXgudG9WZWN0b3IzKCkpKTtcclxuXHJcbiAgICAgICAgbWluLnggPSBNYXRoLm1pbihtaW4ueCwgdmVydGV4LngpO1xyXG4gICAgICAgIG1heC54ID0gTWF0aC5tYXgobWF4LngsIHZlcnRleC54KTtcclxuICAgICAgICBtaW4ueSA9IE1hdGgubWluKG1pbi55LCB2ZXJ0ZXgueSk7XHJcbiAgICAgICAgbWF4LnkgPSBNYXRoLm1heChtYXgueSwgdmVydGV4LnkpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBzaXplOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIobWF4LnggLSBtaW4ueCwgbWF4LnkgLSBtaW4ueSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5maXRUZXh0dXJlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdGV4dHVyZVVWOiBWZWN0b3IyID0gVmVjdG9yMi5ESUZGRVJFTkNFKHNoYXBlW2ldLCBtaW4pO1xyXG4gICAgICAgICAgdGhpcy52ZXJ0aWNlc1tpXS51diA9IG5ldyBWZWN0b3IyKHRleHR1cmVVVi54IC8gc2l6ZS54LCAxIC0gdGV4dHVyZVVWLnkgLyBzaXplLnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBfc2hhcGUuZm9yRWFjaCgoX3ZlcnRleCwgX2kpID0+IHRoaXMudmVydGljZXNbX2ldLnV2ID0gbmV3IFZlY3RvcjIoX3ZlcnRleC54LCAtX3ZlcnRleC55KSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZmFjZXMgPSBbXTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMjsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKHRoaXMudmVydGljZXMsIGkgLSAxLCBpLCAwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNoYXBlID0gU2VyaWFsaXplci5zZXJpYWxpemVBcnJheShWZWN0b3IyLCB0aGlzLnNoYXBlKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5maXRUZXh0dXJlID0gdGhpcy5maXRUZXh0dXJlO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgbGV0IHZlY3RvcnM6IFZlY3RvcjJbXSA9IDxWZWN0b3IyW10+YXdhaXQgU2VyaWFsaXplci5kZXNlcmlhbGl6ZUFycmF5KF9zZXJpYWxpemF0aW9uLnNoYXBlKTtcclxuICAgICAgdGhpcy5jcmVhdGUodmVjdG9ycywgX3NlcmlhbGl6YXRpb24uZml0VGV4dHVyZSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMuc2hhcGUsIHRoaXMuZml0VGV4dHVyZSk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTVVUQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgc3VwZXIucmVkdWNlTXV0YXRvcihfbXV0YXRvcik7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCJNZXNoUG9seWdvbi50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGFuIGV4dHJ1c2lvbiBvZiBhIHBvbHlnb24gYnkgYSBzZXJpZXMgb2YgdHJhbnNmb3JtYXRpb25zXHJcbiAgICogYGBgdGV4dCAgXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgX19fX1xyXG4gICAqIFBvbHlnb24gICAgICAgICBfX19f4pWx4pWyICAg4pWyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICogVHJhbnNmb3JtIDAgIOKGkiDilbEg4pWyX1/ilbJf4pWyX19f4pWyIOKGkCBUcmFuc2Zvcm0gMiAgICAgICAgICB6IF9f4pSCXHJcbiAgICogKGJhc2UpICAgICAgICAg4pWyX+KVsV9f4pWxIOKVsSAgIOKVsSAgIChsaWQpICAgICAgICAgICAgICAgICAgICAg4pWyICAgICAgIFxyXG4gICAqICAgICBUcmFuc2Zvcm0gMSAg4oaSICDilbLilbFfX1/ilbEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFxyXG4gICAqIGBgYFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaEV4dHJ1c2lvbiBleHRlbmRzIE1lc2hQb2x5Z29uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaEV4dHJ1c2lvbik7XHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIG10eERlZmF1bHRzOiBNYXRyaXg0eDRbXSA9IFsgLy8gb2Zmc2V0IG9mICswLjV6IGFuZCAtMC41eiBhcyBkZWZhdWx0XHJcbiAgICAgIE1hdHJpeDR4NC5UUkFOU0xBVElPTihWZWN0b3IzLlooMC41KSksXHJcbiAgICAgIE1hdHJpeDR4NC5UUkFOU0xBVElPTihWZWN0b3IzLlooLTAuNSkpXHJcbiAgICBdO1xyXG4gICAgcHJpdmF0ZSBtdHhUcmFuc2Zvcm1zOiBNdXRhYmxlQXJyYXk8TWF0cml4NHg0PiA9IG5ldyBNdXRhYmxlQXJyYXkoTWF0cml4NHg0KTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaEV4dHJ1c2lvblwiLCBfdmVydGljZXM6IFZlY3RvcjJbXSA9IE1lc2hQb2x5Z29uLnNoYXBlRGVmYXVsdCwgX210eFRyYW5zZm9ybXM6IE1hdHJpeDR4NFtdID0gTWVzaEV4dHJ1c2lvbi5tdHhEZWZhdWx0cywgX2ZpdFRleHR1cmU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lLCBfdmVydGljZXMsIF9maXRUZXh0dXJlKTtcclxuICAgICAgdGhpcy5leHRydWRlKF9tdHhUcmFuc2Zvcm1zKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJNdXRhdG9yXCIsIHRoaXMuZ2V0TXV0YXRvcigpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udHJhbnNmb3JtcyA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplQXJyYXkoTWF0cml4NHg0LCB0aGlzLm10eFRyYW5zZm9ybXMpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGxldCBtdHhUcmFuc2Zvcm1zOiBNYXRyaXg0eDRbXTtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLnRyYW5zZm9ybXMpXHJcbiAgICAgICAgbXR4VHJhbnNmb3JtcyA9IDxNYXRyaXg0eDRbXT5hd2FpdCBTZXJpYWxpemVyLmRlc2VyaWFsaXplQXJyYXkoX3NlcmlhbGl6YXRpb24udHJhbnNmb3Jtcyk7XHJcbiAgICAgIHRoaXMuZXh0cnVkZShtdHhUcmFuc2Zvcm1zKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgdGhpcy5leHRydWRlKHRoaXMubXR4VHJhbnNmb3Jtcyk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTVVUQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgc3VwZXIucmVkdWNlTXV0YXRvcihfbXV0YXRvcik7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcml2YXRlIGV4dHJ1ZGUoX210eFRyYW5zZm9ybXM6IE1hdHJpeDR4NFtdID0gTWVzaEV4dHJ1c2lvbi5tdHhEZWZhdWx0cyk6IHZvaWQge1xyXG4gICAgICB0aGlzLm10eFRyYW5zZm9ybXMgPSA8TXV0YWJsZUFycmF5PE1hdHJpeDR4ND4+TXV0YWJsZUFycmF5LmZyb20oPE11dGFibGVBcnJheTxNYXRyaXg0eDQ+Pl9tdHhUcmFuc2Zvcm1zKTtcclxuICAgICAgbGV0IG5UcmFuc2Zvcm1zOiBudW1iZXIgPSBfbXR4VHJhbnNmb3Jtcy5sZW5ndGg7XHJcbiAgICAgIGxldCBuVmVydGljZXNTaGFwZTogbnVtYmVyID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgbmV3IHZlcnRleCBjbG91ZCwgY3VycmVudCBjbG91ZCBob2xkcyBNZXNoUG9seWdvblxyXG4gICAgICBsZXQgdmVydGljZXM6IFZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKCk7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgYmFzZSBieSB0cmFuc2Zvcm1hdGlvbiBvZiBwb2x5Z29uIHdpdGggZmlyc3QgdHJhbnNmb3JtXHJcbiAgICAgIGxldCBiYXNlOiBWZXJ0ZXhbXSA9IHRoaXMudmVydGljZXMubWFwKChfdjogVmVydGV4KSA9PiBuZXcgVmVydGV4KFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oX3YucG9zaXRpb24sIF9tdHhUcmFuc2Zvcm1zWzBdLCB0cnVlKSwgX3YudXYpKTtcclxuICAgICAgdmVydGljZXMucHVzaCguLi5iYXNlKTtcclxuICAgICAgLy8gY3JlYXRlIGxpZCBieSB0cmFuc2Zvcm1hdGlvbiBvZiBwb2x5Z29uIHdpdGggbGFzdCB0cmFuc2Zvcm1cclxuICAgICAgbGV0IGxpZDogVmVydGV4W10gPSB0aGlzLnZlcnRpY2VzLm1hcCgoX3Y6IFZlcnRleCkgPT4gbmV3IFZlcnRleChWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF92LnBvc2l0aW9uLCBfbXR4VHJhbnNmb3Jtc1tuVHJhbnNmb3JtcyAtIDFdLCB0cnVlKSwgX3YudXYpKTtcclxuICAgICAgdmVydGljZXMucHVzaCguLi5saWQpO1xyXG5cclxuICAgICAgLy8gcmVjcmVhdGUgYmFzZSBmYWNlcyB0byByZWNhbGN1bGF0ZSBub3JtYWxzXHJcbiAgICAgIHRoaXMuZmFjZXMgPSB0aGlzLmZhY2VzLm1hcCgoX2ZhY2U6IEZhY2UpID0+IG5ldyBGYWNlKHZlcnRpY2VzLCBfZmFjZS5pbmRpY2VzWzBdLCBfZmFjZS5pbmRpY2VzWzFdLCBfZmFjZS5pbmRpY2VzWzJdKSk7XHJcbiAgICAgIC8vIGNyZWF0ZSB0aGUgbGlkIGZhY2VzIHVzaW5nIHRoZSBpbmRpY2VzIG9mIHRoZSBiYXNlIGZhY2VzLCBidXQgd2l0aCBhbiBpbmRleCBvZmZzZXQgYW5kIHJldmVyc2Ugb3JkZXIgb2YgaW5kaWNlc1xyXG4gICAgICB0aGlzLmZhY2VzLnB1c2goLi4udGhpcy5mYWNlcy5tYXAoX2ZhY2UgPT5cclxuICAgICAgICBuZXcgRmFjZSh2ZXJ0aWNlcywgX2ZhY2UuaW5kaWNlc1syXSArIG5WZXJ0aWNlc1NoYXBlLCBfZmFjZS5pbmRpY2VzWzFdICsgblZlcnRpY2VzU2hhcGUsIF9mYWNlLmluZGljZXNbMF0gKyBuVmVydGljZXNTaGFwZSlcclxuICAgICAgKSk7XHJcblxyXG4gICAgICBmb3IgKGxldCB0OiBudW1iZXIgPSAwOyB0IDwgblRyYW5zZm9ybXM7IHQrKykge1xyXG4gICAgICAgIGxldCBtdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCA9IF9tdHhUcmFuc2Zvcm1zW3RdO1xyXG4gICAgICAgIGxldCByZWZlclRvQ2xvc2U6IG51bWJlciA9IHZlcnRpY2VzLmxlbmd0aDtcclxuICAgICAgICBsZXQgd3JhcDogVmVydGV4W10gPSB0aGlzLnZlcnRpY2VzLm1hcCgoX3Y6IFZlcnRleCwgX2k6IG51bWJlcikgPT5cclxuICAgICAgICAgIG5ldyBWZXJ0ZXgoVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfdi5wb3NpdGlvbiwgbXR4VHJhbnNmb3JtLCB0cnVlKSwgbmV3IFZlY3RvcjIoX2kgLyBuVmVydGljZXNTaGFwZSwgdCAvIG5UcmFuc2Zvcm1zKSlcclxuICAgICAgICApO1xyXG4gICAgICAgIHZlcnRpY2VzLnB1c2goLi4ud3JhcCk7XHJcbiAgICAgICAgdmVydGljZXMucHVzaChuZXcgVmVydGV4KHJlZmVyVG9DbG9zZSwgbmV3IFZlY3RvcjIoMSwgdCAvIG5UcmFuc2Zvcm1zKSkpO1xyXG4gICAgICAgIC8vIGlmIChpID4gMCAmJiBpIDwgblRyYW5zZm9ybXMgLSAxKVxyXG4gICAgICAgIC8vICAgdmVydGljZXMucHVzaCguLi53cmFwLm1hcCgoX3ZlY3RvcjogVmVjdG9yMykgPT4gX3ZlY3Rvci5jbG9uZSkpOyA8LSBubyBzbGljaW5nIGZvciBmbGF0IHNoYWRpbmcgeWV0Li4uXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNyZWF0ZSBpbmRpemVzIGZvciB3cmFwcGVyXHJcbiAgICAgIGZvciAobGV0IHQ6IG51bWJlciA9IDA7IHQgPCBuVHJhbnNmb3JtcyAtIDE7IHQrKylcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgblZlcnRpY2VzU2hhcGU7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGluZGV4OiBudW1iZXIgPVxyXG4gICAgICAgICAgICArIDIgKiBuVmVydGljZXNTaGFwZSAvLyBiYXNlICYgbGlkIGFyZSBvZmZzZXRzIFxyXG4gICAgICAgICAgICArIHQgKiAoblZlcnRpY2VzU2hhcGUgKyAxKSAvLyBvZmZzZXQgZm9yIGVhY2ggdHJhbnNmb3JtYXRpb25cclxuICAgICAgICAgICAgKyBpO1xyXG4gICAgICAgICAgbGV0IHF1YWQ6IFF1YWQgPSBuZXcgUXVhZCh2ZXJ0aWNlcywgaW5kZXgsIGluZGV4ICsgblZlcnRpY2VzU2hhcGUgKyAxLCBpbmRleCArIG5WZXJ0aWNlc1NoYXBlICsgMiwgaW5kZXggKyAxLCBRVUFEU1BMSVQuQVRfMCk7XHJcbiAgICAgICAgICB0aGlzLmZhY2VzLnB1c2goLi4ucXVhZC5mYWNlcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHByaXZhdGUgY2FsY3VsYXRlUG9seWdvbkxlbmd0aHMoKTogbnVtYmVyW10ge1xyXG4gICAgLy8gICBsZXQgcmVzdWx0OiBudW1iZXJbXSA9IFtdO1xyXG4gICAgLy8gICBsZXQgZmlyc3Q6IFZlY3RvcjM7XHJcbiAgICAvLyAgIGxldCBwcmV2OiBWZWN0b3IzO1xyXG4gICAgLy8gICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgLy8gICAgIGxldCBjdXJyZW50OiBWZWN0b3IzID0gbmV3IFZlY3RvcjModGhpcy52ZXJ0aWNlc1tpXSwgdGhpcy52ZXJ0aWNlc1tpICsgMV0sIHRoaXMudmVydGljZXNbaSArIDJdKTtcclxuICAgIC8vICAgICBpZiAocHJldilcclxuICAgIC8vICAgICAgIHJlc3VsdC5wdXNoKFZlY3RvcjMuRElGRkVSRU5DRShjdXJyZW50LCBwcmV2KS5tYWduaXR1ZGUpO1xyXG4gICAgLy8gICAgIGVsc2VcclxuICAgIC8vICAgICAgIGZpcnN0ID0gY3VycmVudDtcclxuICAgIC8vICAgICBwcmV2ID0gY3VycmVudDtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICByZXN1bHQucHVzaChWZWN0b3IzLkRJRkZFUkVOQ0UoZmlyc3QsIHByZXYpLm1hZ25pdHVkZSk7XHJcbiAgICAvLyAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgbWVzaCBsb2FkZWQgZnJvbSBhbiBGQlgtRmlsZS5cclxuICAgKiBAYXV0aG9ycyBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoRkJYIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKE1lc2gpIHtcclxuICAgIC8vIHB1YmxpYyB1cmw6IFJlcXVlc3RJbmZvO1xyXG4gICAgcHVibGljIGlNZXNoOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsLCBfaU1lc2g6IG51bWJlciA9IHRoaXMuaU1lc2gpOiBQcm9taXNlPE1lc2hGQlg+IHtcclxuICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMuaU1lc2ggPSBfaU1lc2g7XHJcbiAgICAgIGNvbnN0IGxvYWRlcjogRkJYTG9hZGVyID0gYXdhaXQgRkJYTG9hZGVyLkxPQUQodGhpcy51cmwudG9TdHJpbmcoKSk7XHJcbiAgICAgIGNvbnN0IGdlb21ldHJ5RkJYOiBGQlguR2VvbWV0cnkgPSAoXHJcbiAgICAgICAgbG9hZGVyLmZieC5vYmplY3RzLmdlb21ldHJpZXNbX2lNZXNoXSB8fFxyXG4gICAgICAgIGxvYWRlci5mYngub2JqZWN0cy5nZW9tZXRyaWVzLmZpbmQoX29iamVjdCA9PiBfb2JqZWN0Lm5hbWUgPT0gdGhpcy5uYW1lKSB8fFxyXG4gICAgICAgIGxvYWRlci5mYngub2JqZWN0cy5tb2RlbHMuZmluZChfb2JqZWN0ID0+IF9vYmplY3QubmFtZSA9PSB0aGlzLm5hbWUgJiYgX29iamVjdC5zdWJ0eXBlID09IFwiTWVzaFwiKS5jaGlsZHJlblswXVxyXG4gICAgICApLmxvYWQoKTtcclxuICAgICAgaWYgKGdlb21ldHJ5RkJYKVxyXG4gICAgICAgIHRoaXMubmFtZSA9IGdlb21ldHJ5RkJYLm5hbWUubGVuZ3RoID4gMCA/IGdlb21ldHJ5RkJYLm5hbWUgOiBnZW9tZXRyeUZCWC5wYXJlbnRzWzBdLm5hbWU7XHJcblxyXG4gICAgICBsZXQgcG9zaXRpb25zOiBWZWN0b3IzW10gPSBbXTtcclxuICAgICAgbGV0IHZlcnRleEJ1ZmZlcjogRmxvYXQzMkFycmF5ID0gZ2VvbWV0cnlGQlguVmVydGljZXM7XHJcbiAgICAgIGZvciAobGV0IGlWZXJ0ZXg6IG51bWJlciA9IDA7IGlWZXJ0ZXggPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpVmVydGV4ICs9IDMpIHtcclxuICAgICAgICBwb3NpdGlvbnMucHVzaChuZXcgVmVjdG9yMyh2ZXJ0ZXhCdWZmZXJbaVZlcnRleCArIDBdLCB2ZXJ0ZXhCdWZmZXJbaVZlcnRleCArIDFdLCB2ZXJ0ZXhCdWZmZXJbaVZlcnRleCArIDJdKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCB1dnM6IFZlY3RvcjJbXSA9IFtdO1xyXG4gICAgICBpZiAoZ2VvbWV0cnlGQlguTGF5ZXJFbGVtZW50VVYpIHtcclxuICAgICAgICBsZXQgdXZCdWZmZXI6IEZsb2F0MzJBcnJheSA9IGdlb21ldHJ5RkJYLkxheWVyRWxlbWVudFVWLlVWO1xyXG4gICAgICAgIGZvciAobGV0IGl1djogbnVtYmVyID0gMDsgaXV2IDwgdXZCdWZmZXIubGVuZ3RoOyBpdXYgKz0gMikge1xyXG4gICAgICAgICAgdXZzLnB1c2gobmV3IFZlY3RvcjIodXZCdWZmZXJbaXV2XSwgMSAtIHV2QnVmZmVyW2l1diArIDFdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbm9ybWFsczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGlmIChnZW9tZXRyeUZCWC5MYXllckVsZW1lbnROb3JtYWwpIHtcclxuICAgICAgICBsZXQgbm9ybWFsQnVmZmVyOiBGbG9hdDMyQXJyYXkgPSBnZW9tZXRyeUZCWC5MYXllckVsZW1lbnROb3JtYWwuTm9ybWFscztcclxuICAgICAgICBmb3IgKGxldCBpTm9ybWFsOiBudW1iZXIgPSAwOyBpTm9ybWFsIDwgbm9ybWFsQnVmZmVyLmxlbmd0aDsgaU5vcm1hbCArPSAzKSB7XHJcbiAgICAgICAgICBub3JtYWxzLnB1c2gobmV3IFZlY3RvcjMobm9ybWFsQnVmZmVyW2lOb3JtYWxdLCBub3JtYWxCdWZmZXJbaU5vcm1hbCArIDFdLCBub3JtYWxCdWZmZXJbaU5vcm1hbCArIDJdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbWFwVmVydGV4VG9JbmRleDogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICAgICAgbGV0IG5ld1ZlcnRleEluZGljZXM6IG51bWJlcltdW10gPSBbXTtcclxuICAgICAgbGV0IGlQb2x5Z29uOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgaXNFbmRPZlBvbHlnb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgbGV0IHBvbHlnb246IG51bWJlcltdID0gW107XHJcblxyXG4gICAgICBnZW9tZXRyeUZCWC5Qb2x5Z29uVmVydGV4SW5kZXguZm9yRWFjaCgoX2lWZXJ0ZXgsIF9pUG9seWdvblZlcnRleCkgPT4ge1xyXG4gICAgICAgIGlmIChfaVZlcnRleCA8IDApIHtcclxuICAgICAgICAgIF9pVmVydGV4ID0gX2lWZXJ0ZXggXiAtIDE7XHJcbiAgICAgICAgICBpc0VuZE9mUG9seWdvbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBwb3NpdGlvbnNbX2lWZXJ0ZXhdO1xyXG4gICAgICAgIGxldCB1djogVmVjdG9yMiA9IHV2c1t0aGlzLmdldERhdGFJbmRleChnZW9tZXRyeUZCWC5MYXllckVsZW1lbnRVViwgX2lWZXJ0ZXgsIGlQb2x5Z29uLCBfaVBvbHlnb25WZXJ0ZXgpXTtcclxuXHJcbiAgICAgICAgbGV0IHZlcnRleEtleTogc3RyaW5nID0gcG9zaXRpb24udG9TdHJpbmcoKSArIHV2LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaWYgKCFtYXBWZXJ0ZXhUb0luZGV4Lmhhcyh2ZXJ0ZXhLZXkpKSB7XHJcbiAgICAgICAgICBsZXQgbm9ybWFsOiBWZWN0b3IzID0gbm9ybWFsc1t0aGlzLmdldERhdGFJbmRleChnZW9tZXRyeUZCWC5MYXllckVsZW1lbnROb3JtYWwsIF9pVmVydGV4LCBpUG9seWdvbiwgX2lQb2x5Z29uVmVydGV4KV07XHJcblxyXG4gICAgICAgICAgdGhpcy52ZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgocG9zaXRpb24sIHV2LCBub3JtYWwpKTtcclxuICAgICAgICAgIG1hcFZlcnRleFRvSW5kZXguc2V0KHZlcnRleEtleSwgdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSAxKTtcclxuICAgICAgICAgIGlmICghbmV3VmVydGV4SW5kaWNlc1tfaVZlcnRleF0pXHJcbiAgICAgICAgICAgIG5ld1ZlcnRleEluZGljZXNbX2lWZXJ0ZXhdID0gW107XHJcbiAgICAgICAgICBuZXdWZXJ0ZXhJbmRpY2VzW19pVmVydGV4XS5wdXNoKHRoaXMudmVydGljZXMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBvbHlnb24ucHVzaChtYXBWZXJ0ZXhUb0luZGV4LmdldCh2ZXJ0ZXhLZXkpKTtcclxuXHJcbiAgICAgICAgaWYgKGlzRW5kT2ZQb2x5Z29uKSB7XHJcbiAgICAgICAgICBpZiAocG9seWdvbi5sZW5ndGggPT0gMykge1xyXG4gICAgICAgICAgICB0aGlzLmZhY2VzLnB1c2gobmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgcG9seWdvblswXSwgcG9seWdvblsxXSwgcG9seWdvblsyXSkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChwb2x5Z29uLmxlbmd0aCA9PSA0KSB7XHJcbiAgICAgICAgICAgIGxldCBxdWFkOiBRdWFkID0gbmV3IFF1YWQodGhpcy52ZXJ0aWNlcywgcG9seWdvblswXSwgcG9seWdvblsxXSwgcG9seWdvblsyXSwgcG9seWdvblszXSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmFjZXMucHVzaCguLi5xdWFkLmZhY2VzKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDI7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgIHRoaXMuZmFjZXMucHVzaChuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCBwb2x5Z29uWzBdLCBwb2x5Z29uW2kgLSAxXSwgcG9seWdvbltpIC0gMF0pKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGAke01lc2hMb2FkZXJGQlgubmFtZX06IFBvbHlnb25zIHdpdGggbW9yZSB0aGFuIDQgdmVydGljZXMgYXJlIG5vdCBzdXBwb3J0ZWQuYCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBwb2x5Z29uID0gW107XHJcbiAgICAgICAgICBpc0VuZE9mUG9seWdvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgaVBvbHlnb24rKztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGdlb21ldHJ5RkJYLmNoaWxkcmVuPy5bMF0udHlwZSA9PSBcIkRlZm9ybWVyXCIpIHtcclxuICAgICAgICBjb25zdCBmYnhEZWZvcm1lcjogRkJYLkRlZm9ybWVyID0gZ2VvbWV0cnlGQlguY2hpbGRyZW5bMF07XHJcbiAgICAgICAgY29uc3Qgc2tlbGV0b246IENvbXBvbmVudFNrZWxldG9uID0gYXdhaXQgbG9hZGVyLmdldFNrZWxldG9uKGZieERlZm9ybWVyLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdKTsgLy8gRGVmb3JtZXIuU3ViRGVmb3JtZXIuTGltYk5vZGVcclxuICAgICAgICB0aGlzLmNyZWF0ZUJvbmVzKGZieERlZm9ybWVyLCBza2VsZXRvbiwgdGhpcy52ZXJ0aWNlcywgbmV3VmVydGV4SW5kaWNlcyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlNZXNoID0gdGhpcy5pTWVzaDtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5pTWVzaCA9IF9zZXJpYWxpemF0aW9uLmlNZXNoO1xyXG4gICAgICByZXR1cm4gc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RGF0YUluZGV4KF9sYXllckVsZW1lbnQ6IEZCWC5MYXllckVsZW1lbnRVViB8IEZCWC5MYXllckVsZW1lbnROb3JtYWwsIF9pVmVydGV4OiBudW1iZXIsIF9pUG9seWdvbjogbnVtYmVyLCBfaVBvbHlnb25WZXJ0ZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID1cclxuICAgICAgICBfbGF5ZXJFbGVtZW50Lk1hcHBpbmdJbmZvcm1hdGlvblR5cGUgPT0gXCJCeVZlcnRleFwiID9cclxuICAgICAgICAgIF9pVmVydGV4IDpcclxuICAgICAgICAgIF9sYXllckVsZW1lbnQuTWFwcGluZ0luZm9ybWF0aW9uVHlwZSA9PSBcIkJ5UG9seWdvblwiID9cclxuICAgICAgICAgICAgX2lQb2x5Z29uIDpcclxuICAgICAgICAgICAgX2lQb2x5Z29uVmVydGV4O1xyXG5cclxuICAgICAgaWYgKF9sYXllckVsZW1lbnQuUmVmZXJlbmNlSW5mb3JtYXRpb25UeXBlID09PSAnSW5kZXhUb0RpcmVjdCcpIHtcclxuICAgICAgICBsZXQgaW5kaWNlczogVWludDE2QXJyYXkgPSAoX2xheWVyRWxlbWVudCBhcyBGQlguTGF5ZXJFbGVtZW50VVYpLlVWSW5kZXggfHwgKF9sYXllckVsZW1lbnQgYXMgRkJYLkxheWVyRWxlbWVudE5vcm1hbCkuTm9ybWFsc0luZGV4O1xyXG4gICAgICAgIGluZGV4ID0gaW5kaWNlc1tpbmRleF07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUJvbmVzKF9kZWZvcm1lckZCWDogRkJYLkRlZm9ybWVyLCBfc2tlbGV0b246IENvbXBvbmVudFNrZWxldG9uLCBfdmVydGljZXM6IFZlcnRpY2VzLCBfbmV3VmVydGV4SW5kaWNlcz86IG51bWJlcltdW10pOiB2b2lkIHtcclxuICAgICAgZm9yIChjb25zdCBmYnhTdWJEZWZvcm1lciBvZiBfZGVmb3JtZXJGQlguY2hpbGRyZW4gYXMgRkJYLlN1YkRlZm9ybWVyW10pIHtcclxuICAgICAgICBmYnhTdWJEZWZvcm1lci5sb2FkKCk7XHJcbiAgICAgICAgaWYgKGZieFN1YkRlZm9ybWVyLkluZGV4ZXMpXHJcbiAgICAgICAgICBmb3IgKGxldCBpQm9uZUluZmx1ZW5jZTogbnVtYmVyID0gMDsgaUJvbmVJbmZsdWVuY2UgPCBmYnhTdWJEZWZvcm1lci5JbmRleGVzLmxlbmd0aDsgaUJvbmVJbmZsdWVuY2UrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpVmVydGV4OiBudW1iZXIgPSBmYnhTdWJEZWZvcm1lci5JbmRleGVzW2lCb25lSW5mbHVlbmNlXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpVmVydGV4TmV3IG9mIF9uZXdWZXJ0ZXhJbmRpY2VzID8gX25ld1ZlcnRleEluZGljZXNbaVZlcnRleF0gOiBbaVZlcnRleF0pIHtcclxuICAgICAgICAgICAgICAoX3ZlcnRpY2VzW2lWZXJ0ZXhOZXddLmJvbmVzIHx8IChfdmVydGljZXNbaVZlcnRleE5ld10uYm9uZXMgPSBbXSkpLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgaW5kZXg6IF9za2VsZXRvbi5pbmRleE9mKGZieFN1YkRlZm9ybWVyLmNoaWxkcmVuWzBdLm5hbWUpLFxyXG4gICAgICAgICAgICAgICAgd2VpZ2h0OiBmYnhTdWJEZWZvcm1lci5XZWlnaHRzW2lCb25lSW5mbHVlbmNlXSB8fCAxXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKiBBbGxvd3MgdG8gY3JlYXRlIGN1c3RvbSBtZXNoZXMgZnJvbSBnaXZlbiBEYXRhICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hGcm9tRGF0YSBleHRlbmRzIE1lc2gge1xyXG4gICAgcHJvdGVjdGVkIHZlcnRpY2VzVG9TZXQ6IEZsb2F0MzJBcnJheTtcclxuICAgIHByb3RlY3RlZCB0ZXh0dXJlVVZzVG9TZXQ6IEZsb2F0MzJBcnJheTtcclxuICAgIHByb3RlY3RlZCBpbmRpY2VzVG9TZXQ6IFVpbnQxNkFycmF5O1xyXG4gICAgcHJvdGVjdGVkIGZhY2VOb3JtYWxzVG9TZXQ6IEZsb2F0MzJBcnJheTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3ZlcnRpY2VzOiBGbG9hdDMyQXJyYXksIF90ZXh0dXJlVVZzOiBGbG9hdDMyQXJyYXksIF9pbmRpY2VzOiBVaW50MTZBcnJheSwgX2ZhY2VOb3JtYWxzOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy52ZXJ0aWNlc1RvU2V0ID0gX3ZlcnRpY2VzO1xyXG4gICAgICB0aGlzLnRleHR1cmVVVnNUb1NldCA9IF90ZXh0dXJlVVZzO1xyXG4gICAgICB0aGlzLmluZGljZXNUb1NldCA9IF9pbmRpY2VzO1xyXG4gICAgICB0aGlzLmZhY2VOb3JtYWxzVG9TZXQgPSBfZmFjZU5vcm1hbHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVZlcnRpY2VzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZlcnRpY2VzVG9TZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVRleHR1cmVVVnMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZVVWc1RvU2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJbmRpY2VzKCk6IFVpbnQxNkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5kaWNlc1RvU2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVGbGF0Tm9ybWFscygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy5mYWNlTm9ybWFsc1RvU2V0O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgTWVzaH0gbG9hZGVkIGZyb20gYSBnbFRGLUZpbGUuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hHTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKE1lc2gpIHtcclxuICAgIHB1YmxpYyBpUHJpbWl0aXZlOiBudW1iZXI7IC8vIG1vc3QgbGlrZWx5IHdpbGwgbm90IHN0YXkgY29uc2lzdGVudCB3aXRoIHRoZSBnbFRGIGZpbGUuLi5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsLCBfbmFtZTogc3RyaW5nID0gdGhpcy5uYW1lLCBfaVByaW1pdGl2ZTogbnVtYmVyID0gdGhpcy5pUHJpbWl0aXZlKTogUHJvbWlzZTxNZXNoR0xURj4ge1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmlQcmltaXRpdmUgPSBfaVByaW1pdGl2ZTtcclxuICAgICAgcmV0dXJuIEdMVEZMb2FkZXIubG9hZFJlc291cmNlKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pUHJpbWl0aXZlID0gdGhpcy5pUHJpbWl0aXZlO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLmlQcmltaXRpdmUgPSBfc2VyaWFsaXphdGlvbi5pUHJpbWl0aXZlO1xyXG4gICAgICByZXR1cm4gc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEEgbWVzaCBsb2FkZWQgZnJvbSBhbiBPQkotZmlsZS5cclxuICAgKiBTaW1wbGUgV2F2ZWZyb250IE9CSiBpbXBvcnQuIFRha2VzIGEgd2F2ZWZyb250IG9iaiBzdHJpbmcuIFRvIExvYWQgZnJvbSBhIGZpbGUgdXJsLCB1c2UgdGhlXHJcbiAgICogc3RhdGljIExPQUQgTWV0aG9kLiBDdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIHRyaWFuZ3VsYXRlZCBNZXNoZXNcclxuICAgKiAoYWN0aXZhdGUgJ0dlb21lbnRyeSDihpIgVHJpYW5ndWxhdGUgRmFjZXMnIGluIEJsZW5kZXJzIG9iaiBleHBvcnRlcilcclxuICAgKiBAdG9kbyBMb2FkIE1hdGVyaWFscywgU3VwcG9ydCBRdWFkc1xyXG4gICAqIEBhdXRob3JzIFNpbW9uIFN0b3JsLVNjaHVsa2UgMjAyMSB8IEx1aXMgS2VjaywgSEZVLCAyMDIxIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEtMjAyMiB8IE1hdHRoaWFzIFJvbWluZywgSEZVLCAyMDIzIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hPQkogZXh0ZW5kcyBtaXhpblNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwoTWVzaCkge1xyXG5cclxuICAgIHB1YmxpYyBhc3luYyBsb2FkKF91cmw6IFJlcXVlc3RJbmZvID0gdGhpcy51cmwpOiBQcm9taXNlPE1lc2hPQko+IHtcclxuICAgICAgY29uc3QgdXJsOiBzdHJpbmcgPSBuZXcgVVJMKF91cmwudG9TdHJpbmcoKSwgUHJvamVjdC5iYXNlVVJMKS50b1N0cmluZygpO1xyXG4gICAgICBjb25zdCBkYXRhOiBzdHJpbmcgPSBhd2FpdCAoYXdhaXQgZmV0Y2godXJsKSkudGV4dCgpO1xyXG4gICAgICB0aGlzLm5hbWUgPSB1cmwuc3BsaXQoXCIvXCIpLnBvcCgpO1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcblxyXG4gICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBkYXRhLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgY29uc3QgcG9zaXRpb25zOiBWZWN0b3IzW10gPSBbXTtcclxuICAgICAgY29uc3QgdXZzOiBWZWN0b3IyW10gPSBbXTtcclxuICAgICAgY29uc3Qgbm9ybWFsczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGNvbnN0IG5vcm1zOiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgICAgY29uc3QgdmVydGljZXM6IFZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKCk7XHJcbiAgICAgIGNvbnN0IGZhY2VzOiBGYWNlW10gPSBbXTtcclxuICAgICAgY29uc3QgbWFwUG9zaXRpb25VVk5vcm1hbFRvSW5kZXg6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICAgICAgY29uc3QgbWFwUG9zaXRpb25Ob3JtYWxUb0luZGV4OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcblxyXG4gICAgICAvLyBUT0RPOiB0aGluayBhYm91dCBjcmVhdGluZyB0aGUgbmVlZGVkIGJ1ZmZlcnMgZm9yIHJlbmRlcm1lc2ggaGVyZSBhbHJlYWR5Li4uXHJcbiAgICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBsaW5lLnRyaW0oKS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgc3dpdGNoIChwYXJ0cy5zaGlmdCgpKSB7XHJcbiAgICAgICAgICBjYXNlIFwidlwiOiAvL1ZlcnRleCAtIGV4YW1wbGU6IHYgMC43MCAtMC40NSAtMC41MiAgICAgICAgIFxyXG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChuZXcgVmVjdG9yMyguLi5wYXJ0cy5tYXAoX3ZhbHVlID0+ICtfdmFsdWUpKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcInZuXCI6IC8vTm9ybWFsIC0gZXhhbXBsZTogdm4gMC4wMCAwLjAwIDEuMDBcclxuICAgICAgICAgICAgbm9ybWFscy5wdXNoKG5ldyBWZWN0b3IzKC4uLnBhcnRzLm1hcChfdmFsdWUgPT4gK192YWx1ZSkpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwidnRcIjogLy9UZXhjb29yZCAtIGV4YW1wbGU6IHZ0IDAuNTQ1NDU0IDAuNDcyMzgyXHJcbiAgICAgICAgICAgIHV2cy5wdXNoKG5ldyBWZWN0b3IyKC4uLnBhcnRzLm1hcCgoX3ZhbHVlLCBfaW5kZXgpID0+ICtfdmFsdWUgKiAoX2luZGV4ID09IDEgPyAtMSA6IDEpKSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJmXCI6IC8qRmFjZSBJbmRpY2VzIC0gZXhhbXBsZTogZiAxLzEvMSAyLzIvMSAzLzMvMSAtLT4gdmVydGV4MS90ZXhjb29yZDEvbm9ybWFsMSB2ZXJ0ZXgyL3RleGNvb3JkMi9ub3JtYWwyIHZlcnRleDMvdGV4Y29vcmQzL25vcm1hbDMqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGtleTogc3RyaW5nID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgICAgbGV0IGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSBtYXBQb3NpdGlvblVWTm9ybWFsVG9JbmRleFtrZXldO1xyXG4gICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IHZlcnRpY2VzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRleEluZm86IHN0cmluZ1tdID0gcGFydHNbaV0uc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IzID0gcG9zaXRpb25zWyt2ZXJ0ZXhJbmZvWzBdIC0gMV07IC8vIG9iaiB1c2VzIDEtYmFzZWQgaW5kaWNlc1xyXG4gICAgICAgICAgICAgICAgbGV0IHV2OiBWZWN0b3IyID0gdXZzWyt2ZXJ0ZXhJbmZvWzFdIC0gMV0gPz8gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5vcm1hbDogVmVjdG9yMyA9IG5vcm1hbHNbK3ZlcnRleEluZm9bMl0gLSAxXSA/PyB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbClcclxuICAgICAgICAgICAgICAgICAgbm9ybXMucHVzaChub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56KTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQga2V5UG9zTm9ybTogc3RyaW5nID0gYCR7dmVydGV4SW5mb1swXX0vJHt2ZXJ0ZXhJbmZvWzJdfWA7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgobWFwUG9zaXRpb25Ob3JtYWxUb0luZGV4W2tleVBvc05vcm1dID8/IHBvc2l0aW9uLCB1diwgbm9ybWFsKSk7XHJcbiAgICAgICAgICAgICAgICBtYXBQb3NpdGlvblVWTm9ybWFsVG9JbmRleFtrZXldID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFwUG9zaXRpb25Ob3JtYWxUb0luZGV4W2tleVBvc05vcm1dID09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgICAgbWFwUG9zaXRpb25Ob3JtYWxUb0luZGV4W2tleVBvc05vcm1dID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGluZGljZXMucHVzaChpbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBmYWNlcy5wdXNoKG5ldyBGYWNlKHZlcnRpY2VzLCBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMl0sIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSwgaW5kaWNlc1tpbmRpY2VzLmxlbmd0aCAtIDNdKSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKF9lOiB1bmtub3duKSB7XHJcbiAgICAgICAgICAgICAgRGVidWcuZnVkZ2UoXCJGYWNlIGV4Y2x1ZGVkXCIsICg8RXJyb3I+X2UpLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICB0aGlzLnZlcnRpY2VzID0gdmVydGljZXM7XHJcbiAgICAgIHRoaXMuZmFjZXMgPSBmYWNlcztcclxuICAgICAgaWYgKG5vcm1zLmxlbmd0aCA+IDApIC8vIFRPRE86IHJlbmRlcm1lc2ggc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIHVuZGVmaW5lZCBub3JtYWxzIGNvcnJlY3RseSwgaS5lLiBjYWxjdWxhdGUgdGhlbSBvbmx5IGlmIHRoZXkgYXJlIG5vdCBwcmVzZW50IGluIHRoZSB2ZXJ0aWNlc1xyXG4gICAgICAgIHRoaXMucmVuZGVyTWVzaC5ub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShub3Jtcyk7XHJcbiAgICAgIC8vIF9tZXNoLnJlbmRlck1lc2guaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShpbmRpY2VzKTsgLy8gZG9lbnMndCBzZWVtIHRvIGFmZmVjdCBzY2VuZSBsb2FkaW5nIHRpbWUuLi5cclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgc2ltcGxlIHB5cmFtaWQgd2l0aCBlZGdlcyBhdCB0aGUgYmFzZSBvZiBsZW5ndGggMSBhbmQgYSBoZWlnaHQgb2YgMS4gVGhlIHNpZGVzIGNvbnNpc3Rpbmcgb2Ygb25lLCB0aGUgYmFzZSBvZiB0d28gdHJpZ29uc1xyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgICAgICAgIDRcclxuICAgKiAgICAgICAgICAgICAgL1xcYC5cclxuICAgKiAgICAgICAgICAgIDMvX19cXF9cXCAyXHJcbiAgICogICAgICAgICAgIDAvX19fX1xcLzFcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUHlyYW1pZCBleHRlbmRzIE1lc2gge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoUHlyYW1pZCk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hQeXJhbWlkXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICAvLyB0aGlzLmNyZWF0ZSgpO1xyXG5cclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcyhcclxuICAgICAgICAvLyBncm91bmQgdmVydGljZXNcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKC0wLjUsIDAuMCwgMC41KSwgbmV3IFZlY3RvcjIoMCwgMSkpLFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC41LCAwLjAsIDAuNSksIG5ldyBWZWN0b3IyKDEsIDEpKSxcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuNSwgMC4wLCAtMC41KSwgbmV3IFZlY3RvcjIoMSwgMCkpLFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoLTAuNSwgMC4wLCAtMC41KSwgbmV3IFZlY3RvcjIoMCwgMCkpLFxyXG4gICAgICAgIC8vIHRpcCAodmVydGV4ICM0KVxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC4wLCAxLjAsIDAuMCksIG5ldyBWZWN0b3IyKDAuNSwgMC41KSksXHJcbiAgICAgICAgLy8gZmxvb3IgYWdhaW4gZm9yIGRvd25zaWRlIHRleHR1cmVcclxuICAgICAgICBuZXcgVmVydGV4KDAsIG5ldyBWZWN0b3IyKDAsIDApKSxcclxuICAgICAgICBuZXcgVmVydGV4KDEsIG5ldyBWZWN0b3IyKDEsIDApKSxcclxuICAgICAgICBuZXcgVmVydGV4KDIsIG5ldyBWZWN0b3IyKDEsIDEpKSxcclxuICAgICAgICBuZXcgVmVydGV4KDMsIG5ldyBWZWN0b3IyKDAsIDEpKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmZhY2VzID0gW1xyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDQsIDAsIDEpLFxyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDQsIDEsIDIpLFxyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDQsIDIsIDMpLFxyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDQsIDMsIDApLFxyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDUgKyAwLCA1ICsgMiwgNSArIDEpLFxyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDUgKyAwLCA1ICsgMywgNSArIDIpXHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgYSBzaW1wbGUgcXVhZCB3aXRoIGVkZ2VzIG9mIGxlbmd0aCAxLCB0aGUgZmFjZSBjb25zaXN0aW5nIG9mIHR3byB0cmlnb25zXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAwIF9fIDNcclxuICAgKiAgICAgICAgIHxfXFx8XHJcbiAgICogICAgICAgIDEgICAgMiAgICAgICAgICAgICBcclxuICAgKiBgYGAgXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTktMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUXVhZCBleHRlbmRzIE1lc2hQb2x5Z29uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFF1YWQpO1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBzaGFwZTogVmVjdG9yMltdID0gW1xyXG4gICAgICBuZXcgVmVjdG9yMigtMC41LCAwLjUpLCBuZXcgVmVjdG9yMigtMC41LCAtMC41KSwgbmV3IFZlY3RvcjIoMC41LCAtMC41KSwgbmV3IFZlY3RvcjIoMC41LCAwLjUpXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoUXVhZFwiKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lLCBNZXNoUXVhZC5zaGFwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLy8gZmxhdCBlcXVhbHMgc21vb3RoXHJcbiAgICAvLyBwdWJsaWMgZ2V0IHZlcnRpY2VzRmxhdCgpOiBGbG9hdDMyQXJyYXkgeyByZXR1cm4gdGhpcy52ZXJ0aWNlczsgfVxyXG4gICAgLy8gcHVibGljIGdldCBpbmRpY2VzRmxhdCgpOiBVaW50MTZBcnJheSB7IHJldHVybiB0aGlzLmluZGljZXM7IH1cclxuICAgIC8vIHB1YmxpYyBnZXQgbm9ybWFsc0ZsYXQoKTogRmxvYXQzMkFycmF5IHsgcmV0dXJuIHRoaXMubm9ybWFsc1ZlcnRleDsgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2dlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHRoaXMuY3JlYXRlKE1lc2hRdWFkLnNoYXBlLCB0cnVlKTsgLy8gdGhpcyBzZWVtcyB0byBiZSBkaXNwYXRjaGVkIGRvdWJsZWQgd2hpbGUgZGVzZXJpYWxpemluZyB0aGUgcmVzb3VyY2VzXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgc3VwZXIucmVkdWNlTXV0YXRvcihfbXV0YXRvcik7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zaGFwZTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLmZpdFRleHR1cmU7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKiBcclxuICAgKiBUaGlzIGZ1bmN0aW9uIHR5cGUgdGFrZXMgeCBhbmQgeiBhcyBQYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGEgbnVtYmVyIGJldHdlZW4gLTEgYW5kIDEgdG8gYmUgdXNlZCBhcyBhIGhlaWdodG1hcC4gXHJcbiAgICogeCAqIHogKiAyIHJlcHJlc2VudCB0aGUgYW1vdXQgb2YgZmFjZXMgd2hpY2ggYXJlIGNyZWF0ZWQuIEFzIGEgcmVzdWx0IHlvdSBnZXQgMSB2ZXJ0ZXggbW9yZSBpbiBlYWNoIGRpcmVjdGlvbiAoeCBhbmQgeiBheGlzKVxyXG4gICAqIFRoZSB5LWNvbXBvbmVudCBvZiB0aGUgcmVzdWx0aW5nIG1lc2ggbWF5IGJlIG1vdmVkIHRvIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIGEgbWF4aW11bSBoZWlnaHQuXHJcbiAgICogQGF1dGhvcnMgU2ltb24gU3RvcmwtU2NodWxrZSwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEtMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCB0eXBlIEhlaWdodE1hcEZ1bmN0aW9uID0gKHg6IG51bWJlciwgejogbnVtYmVyKSA9PiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJ0aWNhbCBwcm9qZWN0aW9uIG9mIGEgZ2l2ZW4gcG9zaXRpb24gb250byB0aGUgdGVycmFpblxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUZXJyYWluSW5mbyB7XHJcbiAgICAvKiogdGhlIHBvc2l0aW9uIG9mIHRoZSBwb2ludCB2ZXJ0aWNhbGx5IHByb2plY3RlZCBvbiB0aGUgdGVycmFpbiBpbiB3b3JsZCBjb29yZGluYXRlcyAqL1xyXG4gICAgcHVibGljIHBvc2l0aW9uOiBWZWN0b3IzO1xyXG4gICAgLyoqIHRoZSBub3JtYWwgb2YgdGhlIGZhY2Ugb2YgdGhlIHRlcnJhaW4gdW5kZXIgdGhlIHBvaW50IGluIHdvcmxkIGNvb3JkaW5hdGVzICovXHJcbiAgICBwdWJsaWMgbm9ybWFsOiBWZWN0b3IzO1xyXG4gICAgLyoqIHZlcnRpY2FsIGRpc3RhbmNlIG9mIHRoZSBwb2ludCB0byB0aGUgdGVycmFpbiwgbmVnYXRpdmUgaWYgYmVsb3cgKi9cclxuICAgIHB1YmxpYyBkaXN0YW5jZTogbnVtYmVyO1xyXG4gICAgLyoqIHRoZSBwb3NpdGlvbiBpbiBmYWNlIGNvb3JkaW5hdGVzICovXHJcbiAgICBwdWJsaWMgcG9zaXRpb25GYWNlOiBWZWN0b3IzO1xyXG4gICAgLyoqIHRoZSBpbmRleCBvZiB0aGUgZmFjZSB0aGUgcG9zaXRpb24gaXMgaW5zaWRlICovXHJcbiAgICBwdWJsaWMgaW5kZXg6IG51bWJlcjtcclxuICAgIC8qKiB0aGUgZ3JpZCBjb29yZGluYXRlcyBvZiB0aGUgcXVhZCB0aGUgZmFjZSBiZWxvbmdzIHRvICovXHJcbiAgICBwdWJsaWMgZ3JpZDogVmVjdG9yMjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgdGVycmFpbiBzcHJlYWRzIG91dCBpbiB0aGUgeC16LXBsYW5lLCB5IGlzIHRoZSBoZWlnaHQgZGVyaXZlZCBmcm9tIHRoZSBoZWlnaHRtYXAgZnVuY3Rpb24uIFxyXG4gICAqIFRoZSB0ZXJyYWluIGlzIGFsd2F5cyAxIGluIHNpemUgaW4gYWxsIGRpbWVuc2lvbnMsIGZpdHRpbmcgaW50byB0aGUgdW5pdC1jdWJlLiBcclxuICAgKiBSZXNvbHV0aW9uIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBxdWFkcyBpbiB4IGFuZCB6IGRpbWVuc2lvbiwgc2NhbGUgdGhlIGZhY3RvciBhcHBsaWVkIHRvIHRoZSB4LHotY29vcmRpbmF0ZXMgcGFzc2VkIHRvIHRoZSBoZWlnaHRtYXAgZnVuY3Rpb24uXHJcbiAgICogU3RhbmRhcmQgZnVuY3Rpb24gaXMgdGhlIHNpbXBsZXggbm9pc2UgaW1wbGVtZW50ZWQgd2l0aCBGVURHRSwgYnV0IGFub3RoZXIgZnVuY3Rpb24gY2FuIGJlIGdpdmVuLlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjIgfCBTaW1vbiBTdG9ybC1TY2h1bGtlLCBIRlUsIDIwMjAgfCBNb3JpdHogQmVhdWdyYW5kLCBIRlUsIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFRlcnJhaW4gZXh0ZW5kcyBNZXNoIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFRlcnJhaW4pO1xyXG4gICAgcHJvdGVjdGVkIHJlc29sdXRpb246IFZlY3RvcjI7XHJcbiAgICBwcm90ZWN0ZWQgc2NhbGU6IFZlY3RvcjI7XHJcbiAgICBwcm90ZWN0ZWQgc2VlZDogbnVtYmVyO1xyXG4gICAgcHJvdGVjdGVkIGhlaWdodE1hcEZ1bmN0aW9uOiBIZWlnaHRNYXBGdW5jdGlvbiA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hUZXJyYWluXCIsIF9yZXNvbHV0aW9uOiBWZWN0b3IyID0gVmVjdG9yMi5PTkUoMiksIF9zY2FsZUlucHV0OiBWZWN0b3IyID0gVmVjdG9yMi5PTkUoKSwgX2Z1bmN0aW9uT3JTZWVkOiBIZWlnaHRNYXBGdW5jdGlvbiB8IG51bWJlciA9IDApIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZShfcmVzb2x1dGlvbiwgX3NjYWxlSW5wdXQsIF9mdW5jdGlvbk9yU2VlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgdGhpcyBtZXNoIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZShfcmVzb2x1dGlvbjogVmVjdG9yMiA9IFZlY3RvcjIuT05FKDIpLCBfc2NhbGVJbnB1dDogVmVjdG9yMiA9IFZlY3RvcjIuT05FKCksIF9mdW5jdGlvbk9yU2VlZDogSGVpZ2h0TWFwRnVuY3Rpb24gfCBudW1iZXIgPSAwKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgdGhpcy5zZWVkID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLnJlc29sdXRpb24gPSBuZXcgVmVjdG9yMihNYXRoLnJvdW5kKF9yZXNvbHV0aW9uLngpLCBNYXRoLnJvdW5kKF9yZXNvbHV0aW9uLnkpKTtcclxuICAgICAgdGhpcy5zY2FsZSA9IF9zY2FsZUlucHV0LmNsb25lO1xyXG5cclxuICAgICAgaWYgKF9mdW5jdGlvbk9yU2VlZCBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxyXG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwRnVuY3Rpb24gPSBfZnVuY3Rpb25PclNlZWQ7XHJcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiAoX2Z1bmN0aW9uT3JTZWVkKSA9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgdGhpcy5zZWVkID0gX2Z1bmN0aW9uT3JTZWVkO1xyXG4gICAgICAgIGxldCBwcm5nOiBSYW5kb20gPSBuZXcgUmFuZG9tKHRoaXMuc2VlZCk7XHJcbiAgICAgICAgdGhpcy5oZWlnaHRNYXBGdW5jdGlvbiA9IG5ldyBOb2lzZTIoKCkgPT4gcHJuZy5nZXROb3JtKCkpLnNhbXBsZTsgLy8gVE9ETyBjYWxsIFBSTkdcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgdGhpcy5oZWlnaHRNYXBGdW5jdGlvbiA9IG5ldyBOb2lzZTIoKS5zYW1wbGU7XHJcblxyXG4gICAgICB0aGlzLnZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKCk7XHJcbiAgICAgIC8vSXRlcmF0ZSBvdmVyIGVhY2ggY2VsbCB0byBnZW5lcmF0ZSBncmlkIG9mIHZlcnRpY2VzXHJcbiAgICAgIGZvciAobGV0IHo6IG51bWJlciA9IDA7IHogPD0gdGhpcy5yZXNvbHV0aW9uLnk7IHorKykge1xyXG4gICAgICAgIGZvciAobGV0IHg6IG51bWJlciA9IDA7IHggPD0gdGhpcy5yZXNvbHV0aW9uLng7IHgrKykge1xyXG4gICAgICAgICAgbGV0IHhOb3JtOiBudW1iZXIgPSB4IC8gdGhpcy5yZXNvbHV0aW9uLng7XHJcbiAgICAgICAgICBsZXQgek5vcm06IG51bWJlciA9IHogLyB0aGlzLnJlc29sdXRpb24ueTtcclxuICAgICAgICAgIHRoaXMudmVydGljZXMucHVzaChuZXcgVmVydGV4KFxyXG4gICAgICAgICAgICBuZXcgVmVjdG9yMyh4Tm9ybSAtIDAuNSwgdGhpcy5oZWlnaHRNYXBGdW5jdGlvbih4Tm9ybSAqIHRoaXMuc2NhbGUueCwgek5vcm0gKiB0aGlzLnNjYWxlLnkpLCB6Tm9ybSAtIDAuNSksXHJcbiAgICAgICAgICAgIG5ldyBWZWN0b3IyKHhOb3JtLCB6Tm9ybSlcclxuICAgICAgICAgICkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHF1YWRzOiBRdWFkW10gPSBbXTtcclxuICAgICAgbGV0IHNwbGl0OiBRVUFEU1BMSVQgPSBRVUFEU1BMSVQuQVRfMDtcclxuICAgICAgZm9yIChsZXQgejogbnVtYmVyID0gMDsgeiA8IHRoaXMucmVzb2x1dGlvbi55OyB6KyspIHtcclxuICAgICAgICBmb3IgKGxldCB4OiBudW1iZXIgPSAwOyB4IDwgdGhpcy5yZXNvbHV0aW9uLng7IHgrKykge1xyXG4gICAgICAgICAgcXVhZHMucHVzaChuZXcgUXVhZChcclxuICAgICAgICAgICAgdGhpcy52ZXJ0aWNlcyxcclxuICAgICAgICAgICAgKHggKyAwKSArICh6ICsgMCkgKiAodGhpcy5yZXNvbHV0aW9uLnggKyAxKSxcclxuICAgICAgICAgICAgKHggKyAwKSArICh6ICsgMSkgKiAodGhpcy5yZXNvbHV0aW9uLnggKyAxKSxcclxuICAgICAgICAgICAgKHggKyAxKSArICh6ICsgMSkgKiAodGhpcy5yZXNvbHV0aW9uLnggKyAxKSxcclxuICAgICAgICAgICAgKHggKyAxKSArICh6ICsgMCkgKiAodGhpcy5yZXNvbHV0aW9uLnggKyAxKSxcclxuICAgICAgICAgICAgc3BsaXRcclxuICAgICAgICAgICkpO1xyXG4gICAgICAgICAgc3BsaXQgPSAoc3BsaXQgPT0gUVVBRFNQTElULkFUXzApID8gUVVBRFNQTElULkFUXzEgOiBRVUFEU1BMSVQuQVRfMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucmVzb2x1dGlvbi54ICUgMiA9PSAwKSAvLyByZXZlcnNlIGxhc3Qgc3BsaXQgY2hhbmdlIGlmIHgtcmVzb2x1dGlvbiBpcyBldmVuXHJcbiAgICAgICAgICBzcGxpdCA9IChzcGxpdCA9PSBRVUFEU1BMSVQuQVRfMCkgPyBRVUFEU1BMSVQuQVRfMSA6IFFVQURTUExJVC5BVF8wO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZmFjZXMgPSBxdWFkcy5mbGF0TWFwKChfcXVhZDogUXVhZCkgPT4gX3F1YWQuZmFjZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVydGljYWwgcHJvamVjdGlvbiBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24gb250byB0aGUgdGVycmFpbi5cclxuICAgICAqIFBhc3MgdGhlIG92ZXJhbGwgd29ybGQgdHJhbnNmb3JtYXRpb24gb2YgdGhlIHRlcnJhaW4gaWYgdGhlIHBvc2l0aW9uIGlzIGdpdmVuIGluIHdvcmxkIGNvb3JkaW5hdGVzLlxyXG4gICAgICogSWYgYXQgaGFuZCwgcGFzcyB0aGUgaW52ZXJzZSB0b28gdG8gYXZvaWQgdW5uZWNlc3NhcnkgY2FsY3VsYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRUZXJyYWluSW5mbyhfcG9zaXRpb246IFZlY3RvcjMsIF9tdHhXb3JsZDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCksIF9tdHhJbnZlcnNlPzogTWF0cml4NHg0KTogVGVycmFpbkluZm8ge1xyXG4gICAgICBpZiAoIV9tdHhJbnZlcnNlKVxyXG4gICAgICAgIF9tdHhJbnZlcnNlID0gTWF0cml4NHg0LklOVkVSU0UoX210eFdvcmxkKTtcclxuXHJcbiAgICAgIGxldCB0ZXJyYWluSW5mbzogVGVycmFpbkluZm8gPSBuZXcgVGVycmFpbkluZm87XHJcblxyXG4gICAgICBsZXQgcG9zTG9jYWw6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF9wb3NpdGlvbiwgX210eEludmVyc2UsIHRydWUpO1xyXG5cclxuXHJcbiAgICAgIGxldCB6OiBudW1iZXIgPSBNYXRoLmZsb29yKChwb3NMb2NhbC56ICsgMC41KSAqIHRoaXMucmVzb2x1dGlvbi55KTtcclxuICAgICAgbGV0IHg6IG51bWJlciA9IE1hdGguZmxvb3IoKHBvc0xvY2FsLnggKyAwLjUpICogdGhpcy5yZXNvbHV0aW9uLngpO1xyXG4gICAgICBpZiAoeiA8IDAgfHwgeiA+IHRoaXMucmVzb2x1dGlvbi55IC0gMSB8fCB4IDwgMCB8fCB4ID4gdGhpcy5yZXNvbHV0aW9uLnggLSAxKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSAoeiAqIHRoaXMucmVzb2x1dGlvbi54ICsgeCkgKiAyO1xyXG4gICAgICBsZXQgZmFjZTogRmFjZSA9IHRoaXMuZmFjZXNbaW5kZXhdO1xyXG5cclxuICAgICAgbGV0IHJheTogUmF5ID0gbmV3IFJheShWZWN0b3IzLlkoKSwgcG9zTG9jYWwpO1xyXG4gICAgICBsZXQgcG9pbnQ6IFZlY3RvcjMgPSByYXkuaW50ZXJzZWN0RmFjZVBsYW5lKGZhY2UpO1xyXG4gICAgICBpZiAoIWZhY2UuaXNJbnNpZGUocG9pbnQpKSB7XHJcbiAgICAgICAgaW5kZXgrKztcclxuICAgICAgICBmYWNlID0gdGhpcy5mYWNlc1tpbmRleF07XHJcbiAgICAgICAgcG9pbnQgPSByYXkuaW50ZXJzZWN0RmFjZVBsYW5lKGZhY2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0ZXJyYWluSW5mby5pbmRleCA9IGluZGV4O1xyXG4gICAgICB0ZXJyYWluSW5mby5wb3NpdGlvbkZhY2UgPSBwb2ludDtcclxuICAgICAgdGVycmFpbkluZm8ucG9zaXRpb24gPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKHBvaW50LCBfbXR4V29ybGQsIHRydWUpO1xyXG4gICAgICB0ZXJyYWluSW5mby5ub3JtYWwgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKGZhY2Uubm9ybWFsLCBNYXRyaXg0eDQuVFJBTlNQT1NFKF9tdHhJbnZlcnNlKSwgZmFsc2UpO1xyXG4gICAgICB0ZXJyYWluSW5mby5kaXN0YW5jZSA9IF9wb3NpdGlvbi55IC0gdGVycmFpbkluZm8ucG9zaXRpb24ueTtcclxuICAgICAgdGVycmFpbkluZm8uZ3JpZCA9IHRoaXMuZ2V0R3JpZEZyb21GYWNlSW5kZXgoaW5kZXgpO1xyXG4gICAgICByZXR1cm4gdGVycmFpbkluZm87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBncmlkIGNvb3JkaW5hdGVzIG9mIHRoZSBxdWFkIHRoZSBnaXZlbiBmYWNlIGJlbG9uZ3MgdG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRHcmlkRnJvbUZhY2VJbmRleChfaW5kZXg6IG51bWJlcik6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IyID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgICBsZXQgaVF1YWQ6IG51bWJlciA9IE1hdGguZmxvb3IoX2luZGV4IC8gMik7XHJcbiAgICAgIHJlc3VsdC5zZXQoaVF1YWQgJSB0aGlzLnJlc29sdXRpb24ueSwgTWF0aC5mbG9vcihpUXVhZCAvIHRoaXMucmVzb2x1dGlvbi54KSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSB0d28gZmFjZXMgZm9ybWluZyB0aGUgcXVhZCB0aGUgZ2l2ZW4gZ3JpZCBwb3NpdGlvbiBiZWxvbmdzIHRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RmFjZUluZGljZXNGcm9tR3JpZChfZ3JpZDogVmVjdG9yMik6IG51bWJlcltdIHtcclxuICAgICAgbGV0IGlRdWFkOiBudW1iZXIgPSBfZ3JpZC55ICogMiAqIHRoaXMucmVzb2x1dGlvbi54ICsgX2dyaWQueCAqIDI7XHJcbiAgICAgIHJldHVybiBbaVF1YWQsIGlRdWFkICsgMV07XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNlZWQgPSB0aGlzLnNlZWQ7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc2NhbGUgPSB0aGlzLnNjYWxlLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnJlc29sdXRpb24gPSB0aGlzLnJlc29sdXRpb24uc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlc29sdXRpb24uZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ucmVzb2x1dGlvbik7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2NhbGUuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uc2NhbGUpO1xyXG4gICAgICB0aGlzLnNlZWQgPSBfc2VyaWFsaXphdGlvbi5zZWVkO1xyXG4gICAgICB0aGlzLmNyZWF0ZSh0aGlzLnJlc29sdXRpb24sIHRoaXMuc2NhbGUsIHRoaXMuc2VlZCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMucmVzb2x1dGlvbiwgdGhpcy5zY2FsZSwgdGhpcy5zZWVkKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIk1lc2hUZXJyYWluLnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgYSBwbGFuYXIgR3JpZCBhbmQgYXBwbGllcyBhIEhlaWdodG1hcC1GdW5jdGlvbiB0byBpdC5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMSB8IE1vcml0eiBCZWF1Z3JhbmQsIEhGVSwgMjAyMFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUmVsaWVmIGV4dGVuZHMgTWVzaFRlcnJhaW4ge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoUmVsaWVmKTtcclxuICAgIHByaXZhdGUgdGV4dHVyZTogVGV4dHVyZUltYWdlID0gbnVsbDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFJlbGllZlwiLCBfdGV4dHVyZTogVGV4dHVyZUltYWdlID0gbnVsbCkge1xyXG4gICAgICBzdXBlcihfbmFtZSwgVmVjdG9yMi5PTkUoMiksIHVuZGVmaW5lZCwgKF94OiBudW1iZXIsIF96OiBudW1iZXIpID0+IDApO1xyXG4gICAgICB0aGlzLnNldFRleHR1cmUoX3RleHR1cmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUhlaWdodE1hcEZ1bmN0aW9uKF90ZXh0dXJlOiBUZXh0dXJlSW1hZ2UpOiBIZWlnaHRNYXBGdW5jdGlvbiB7XHJcbiAgICAgIGxldCBhcnJheTogVWludDhDbGFtcGVkQXJyYXkgPSBNZXNoUmVsaWVmLnRleHR1cmVUb0NsYW1wZWRBcnJheShfdGV4dHVyZSk7XHJcbiAgICAgIGxldCBoZWlnaHRNYXBGdW5jdGlvbjogSGVpZ2h0TWFwRnVuY3Rpb24gPSAoX3g6IG51bWJlciwgX3o6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGxldCBwaXhlbDogbnVtYmVyID0gTWF0aC5yb3VuZChfeiAqIF90ZXh0dXJlLmltYWdlLndpZHRoICsgX3gpO1xyXG4gICAgICAgIHJldHVybiBhcnJheVtwaXhlbCAqIDRdIC8gMjU1O1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gaGVpZ2h0TWFwRnVuY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4dHVyZVRvQ2xhbXBlZEFycmF5KF90ZXh0dXJlOiBUZXh0dXJlSW1hZ2UpOiBVaW50OENsYW1wZWRBcnJheSB7XHJcbiAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgY2FudmFzLndpZHRoID0gX3RleHR1cmUuaW1hZ2Uud2lkdGg7XHJcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBfdGV4dHVyZS5pbWFnZS5oZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgY3JjOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICBjcmMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgIGNyYy5kcmF3SW1hZ2UoX3RleHR1cmUuaW1hZ2UsIDAsIDApO1xyXG5cclxuICAgICAgcmV0dXJuIGNyYy5nZXRJbWFnZURhdGEoMCwgMCwgX3RleHR1cmUuaW1hZ2Uud2lkdGgsIF90ZXh0dXJlLmltYWdlLmhlaWdodCkuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRleHR1cmUgdG8gYmUgdXNlZCBhcyBoZWlnaHRtYXBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFRleHR1cmUoX3RleHR1cmU6IFRleHR1cmVJbWFnZSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgaWYgKCFfdGV4dHVyZSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRoaXMudGV4dHVyZSA9IF90ZXh0dXJlO1xyXG4gICAgICBsZXQgcmVzb2x1dGlvbjogVmVjdG9yMiA9IF90ZXh0dXJlID8gbmV3IFZlY3RvcjIoX3RleHR1cmUuaW1hZ2Uud2lkdGggLSAxLCBfdGV4dHVyZS5pbWFnZS5oZWlnaHQgLSAxKSA6IHVuZGVmaW5lZDtcclxuICAgICAgc3VwZXIuY3JlYXRlKHJlc29sdXRpb24sIHJlc29sdXRpb24sIE1lc2hSZWxpZWYuY3JlYXRlSGVpZ2h0TWFwRnVuY3Rpb24oX3RleHR1cmUpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLnNlZWQ7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLnNjYWxlO1xyXG4gICAgICBkZWxldGUgc2VyaWFsaXphdGlvbi5yZXNvbHV0aW9uO1xyXG5cclxuICAgICAgaWYgKHRoaXMudGV4dHVyZSlcclxuICAgICAgICBzZXJpYWxpemF0aW9uLmlkVGV4dHVyZSA9IHRoaXMudGV4dHVyZS5pZFJlc291cmNlO1xyXG5cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZFRleHR1cmUpIHtcclxuICAgICAgICB0aGlzLnRleHR1cmUgPSA8VGV4dHVyZUltYWdlPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKTtcclxuICAgICAgICB0aGlzLnNldFRleHR1cmUodGhpcy50ZXh0dXJlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLnRleHR1cmUpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZShfbXV0YXRvci50ZXh0dXJlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNlZWQ7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zY2FsZTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlc29sdXRpb247XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLyAvPHJlZmVyZW5jZSBwYXRoPVwiTWVzaFBvbHlnb24udHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyBhIHJvdGF0aW9uIG9mIGEgcG9seWdvbiBhcm91bmQgdGhlIHktYXhpc1xyXG4gICAqIGBgYHRleHQgICAgICAgXHJcbiAgICogICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICogICAgICAgICAgICAgICAgICBfICDihpEgMF8xXHJcbiAgICogICAgICAgICAgICAgICAgIOKUgiAgIOKUguKGkngg4pSCMiAgICAgICAgIFxyXG4gICAqICAgICAgICAgICAgICAgICAg4pWyICDilIIgIOKVsTMgICAgICAgICBcclxuICAgKiAgICAgICAgICAgICAgICAgIOKVsSAg4pSCICDilbIgICBcclxuICAgKiAgICAgICAgICAgICAgICAg4pWxX19f4pSCX19f4pWyNCBcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICA1XHJcbiAgICogYGBgXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEtMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUm90YXRpb24gZXh0ZW5kcyBNZXNoIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFJvdGF0aW9uKTtcclxuICAgIHByb3RlY3RlZCBzdGF0aWMgdmVydGljZXNEZWZhdWx0OiBWZWN0b3IyW10gPSBbIC8vIGxpbmUgaXMgdGhlIG1pbmltYWwgc2hhcGVcclxuICAgICAgbmV3IFZlY3RvcjIoMC41LCAwLjUpLFxyXG4gICAgICBuZXcgVmVjdG9yMigwLjUsIC0wLjUpXHJcbiAgICBdO1xyXG4gICAgcHJvdGVjdGVkIHNoYXBlOiBNdXRhYmxlQXJyYXk8VmVjdG9yMj4gPSBuZXcgTXV0YWJsZUFycmF5PFZlY3RvcjI+KFZlY3RvcjIpO1xyXG4gICAgcHJvdGVjdGVkIGxvbmdpdHVkZXM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFJvdGF0aW9uXCIsIF9zaGFwZTogVmVjdG9yMltdID0gTWVzaFJvdGF0aW9uLnZlcnRpY2VzRGVmYXVsdCwgX2xvbmdpdHVkZXM6IG51bWJlciA9IDMpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLnJvdGF0ZShfc2hhcGUsIF9sb25naXR1ZGVzKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJNdXRhdG9yXCIsIHRoaXMuZ2V0TXV0YXRvcigpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IG1pblZlcnRpY2VzKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiAyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zaGFwZSA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplQXJyYXkoVmVjdG9yMiwgdGhpcy5zaGFwZSk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24ubG9uZ2l0dWRlcyA9IHRoaXMubG9uZ2l0dWRlcztcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBsZXQgc2hhcGU6IFZlY3RvcjJbXSA9IDxWZWN0b3IyW10+YXdhaXQgU2VyaWFsaXplci5kZXNlcmlhbGl6ZUFycmF5KF9zZXJpYWxpemF0aW9uLnNoYXBlKTtcclxuICAgICAgdGhpcy5sb25naXR1ZGVzID0gX3NlcmlhbGl6YXRpb24ubG9uZ2l0dWRlcztcclxuICAgICAgdGhpcy5yb3RhdGUoc2hhcGUsIHRoaXMubG9uZ2l0dWRlcyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMucm90YXRlKHRoaXMuc2hhcGUsIHRoaXMubG9uZ2l0dWRlcyk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTVVUQVRFKSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgcm90YXRlKF9zaGFwZTogVmVjdG9yMltdLCBfbG9uZ2l0dWRlczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgdGhpcy5zaGFwZSA9IDxNdXRhYmxlQXJyYXk8VmVjdG9yMj4+TXV0YWJsZUFycmF5LmZyb20oX3NoYXBlLm1hcChfdmVydGV4ID0+IF92ZXJ0ZXguY2xvbmUpKTtcclxuICAgICAgdGhpcy5sb25naXR1ZGVzID0gTWF0aC5yb3VuZChfbG9uZ2l0dWRlcyk7XHJcbiAgICAgIGxldCBhbmdsZTogbnVtYmVyID0gMzYwIC8gdGhpcy5sb25naXR1ZGVzO1xyXG4gICAgICBsZXQgbXR4Um90YXRlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT05fWShhbmdsZSk7XHJcbiAgICAgIC8vIGNvcHkgb3JpZ2luYWwgcG9seWdvbiBhcyBWZWN0b3IzIGFycmF5XHJcbiAgICAgIGxldCBwb2x5Z29uOiBWZWN0b3IzW10gPSBbXTtcclxuICAgICAgbGV0IGRpc3RhbmNlczogbnVtYmVyW10gPSBbMF07XHJcbiAgICAgIGxldCB0b3RhbDogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuc2hhcGUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwb2x5Z29uLnB1c2godGhpcy5zaGFwZVtpXS50b1ZlY3RvcjMoKSk7XHJcbiAgICAgICAgaWYgKGkgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgZGlzdGFuY2U6IG51bWJlciA9IFZlY3RvcjIuRElGRkVSRU5DRSh0aGlzLnNoYXBlW2ldLCB0aGlzLnNoYXBlW2kgLSAxXSkubWFnbml0dWRlO1xyXG4gICAgICAgICAgdG90YWwgKz0gZGlzdGFuY2U7XHJcbiAgICAgICAgICBkaXN0YW5jZXMucHVzaCh0b3RhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGRpc3RhbmNlcy5mb3JFYWNoKChfZW50cnksIF9pbmRleCkgPT4geyBkaXN0YW5jZXNbX2luZGV4XSA9IF9lbnRyeSAvIHRvdGFsOyB9KTtcclxuXHJcbiAgICAgIGxldCBuVmVydGljZXNQb2x5Z29uOiBudW1iZXIgPSBwb2x5Z29uLmxlbmd0aDtcclxuXHJcbiAgICAgIGxldCBjbG91ZDogVmVydGljZXMgPSBuZXcgVmVydGljZXMoKTtcclxuICAgICAgZm9yIChsZXQgbG9uZ2l0dWRlOiBudW1iZXIgPSAwOyBsb25naXR1ZGUgPD0gdGhpcy5sb25naXR1ZGVzOyBsb25naXR1ZGUrKykge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBuVmVydGljZXNQb2x5Z29uOyBpKyspIHtcclxuICAgICAgICAgIGxldCB1djogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKGxvbmdpdHVkZSAvIHRoaXMubG9uZ2l0dWRlcywgZGlzdGFuY2VzW2ldKTtcclxuICAgICAgICAgIC8vIFRPRE86IGxhc3Qgc2VjdG9yIHNob3VsZCBvbmx5IGJlIHJlZmVyZW5jZXMgdG8gdGhlIGZpcnN0IG1lcmlkaWFuXHJcbiAgICAgICAgICBpZiAobG9uZ2l0dWRlID09IHRoaXMubG9uZ2l0dWRlcylcclxuICAgICAgICAgICAgY2xvdWQucHVzaChuZXcgVmVydGV4KGksIHV2KSk7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGxvbmdpdHVkZSA+IDAgJiYgdGhpcy5zaGFwZVtpXS54ID09IDApIC8vIHVzZSBhIHNpbmdsZSB2ZXJ0ZXggd2hlbiBpdCdzIG9uIHRoZSByb3RhdGlvbiBheGlzXHJcbiAgICAgICAgICAgICAgY2xvdWQucHVzaChuZXcgVmVydGV4KGksIHV2KSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBjbG91ZC5wdXNoKG5ldyBWZXJ0ZXgocG9seWdvbltpXS5jbG9uZSwgdXYpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcG9seWdvbi5mb3JFYWNoKChfdmVjdG9yOiBWZWN0b3IzKSA9PiBfdmVjdG9yLnRyYW5zZm9ybShtdHhSb3RhdGUpKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIC8vIGNvcHkgaW5kaWNlcyB0byBuZXcgaW5kZXggYXJyYXlcclxuICAgICAgbGV0IGZhY2VzOiBGYWNlW10gPSBbXTtcclxuXHJcbiAgICAgIGZvciAobGV0IGxvbmdpdHVkZTogbnVtYmVyID0gMDsgbG9uZ2l0dWRlIDwgdGhpcy5sb25naXR1ZGVzOyBsb25naXR1ZGUrKykge1xyXG4gICAgICAgIGZvciAobGV0IGxhdGl0dWRlOiBudW1iZXIgPSAwOyBsYXRpdHVkZSA8IG5WZXJ0aWNlc1BvbHlnb24gLSAxOyBsYXRpdHVkZSsrKSB7XHJcbiAgICAgICAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGxvbmdpdHVkZSAqIG5WZXJ0aWNlc1BvbHlnb24gKyBsYXRpdHVkZTtcclxuICAgICAgICAgIGxldCBxdWFkOiBRdWFkID0gbmV3IFF1YWQoY2xvdWQsIHN0YXJ0ICsgMSwgc3RhcnQgKyAxICsgblZlcnRpY2VzUG9seWdvbiwgc3RhcnQgKyBuVmVydGljZXNQb2x5Z29uLCBzdGFydCk7XHJcbiAgICAgICAgICBmYWNlcy5wdXNoKC4uLnF1YWQuZmFjZXMpO1xyXG4gICAgICAgICAgLy8gVE9ETzogY2F0Y2ggaW52YWxpZCBmYWNlcyByaWdodCBoZXJlLi4uXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnZlcnRpY2VzID0gY2xvdWQ7XHJcbiAgICAgIHRoaXMuZmFjZXMgPSBmYWNlcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIFVWIFNwaGVyZSB3aXRoIGEgZ2l2ZW4gbnVtYmVyIG9mIHNlY3RvcnMgYW5kIHN0YWNrcyAoY2xhbXBlZCBhdCAxMjgqMTI4KVxyXG4gICAqIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGh0dHA6Ly93d3cuc29uZ2hvLmNhL29wZW5nbC9nbF9zcGhlcmUuaHRtbFxyXG4gICAqIEBhdXRob3JzIFNpbW9uIFN0b3JsLVNjaHVsa2UsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIwXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hTcGhlcmUgZXh0ZW5kcyBNZXNoUm90YXRpb24ge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoU3BoZXJlKTtcclxuICAgIHByaXZhdGUgbGF0aXR1ZGVzOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hTcGhlcmVcIiwgX2xvbmdpdHVkZXM6IG51bWJlciA9IDgsIF9sYXRpdHVkZXM6IG51bWJlciA9IDgpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZShfbG9uZ2l0dWRlcywgX2xhdGl0dWRlcyk7IC8vIFRPRE86IHdoZW4gZGVzZXJpYWxpemVkIHRoaXMgY2F1c2VzIHRoaXMgY2F1c2VzIHRoZSBtZXNoIHRvIGJlIGNyZWF0ZWQgdHdpY2VcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSB0aGlzIHNwaGVyZSB3aXRoIGEgZ2l2ZW4gbnVtYmVyIG9mIGxvbmdpdHVkZXMgYW5kIGxhdGl0dWRlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlKF9sb25naXR1ZGVzOiBudW1iZXIgPSAzLCBfbGF0aXR1ZGVzOiBudW1iZXIgPSAyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgLy9DbGFtcCByZXNvbHV0aW9uIHRvIHByZXZlbnQgcGVyZm9ybWFuY2UgaXNzdWVzXHJcbiAgICAgIHRoaXMubG9uZ2l0dWRlcyA9IE1hdGgubWluKE1hdGgucm91bmQoX2xvbmdpdHVkZXMpLCAxMjgpO1xyXG4gICAgICB0aGlzLmxhdGl0dWRlcyA9IE1hdGgubWluKE1hdGgucm91bmQoX2xhdGl0dWRlcyksIDEyOCk7XHJcblxyXG4gICAgICBpZiAoX2xvbmdpdHVkZXMgPCAzIHx8IF9sYXRpdHVkZXMgPCAyKSB7XHJcbiAgICAgICAgRGVidWcud2FybihcIlVWIFNwaGVyZSBtdXN0IGhhdmUgYXQgbGVhc3QgMyBsb25naXR1ZGVzIGFuZCAyIGxhdGl0dWRlcyB0byBmb3JtIGEgMy1kaW1lbnNpb25hbCBzaGFwZS5cIik7XHJcbiAgICAgICAgdGhpcy5sb25naXR1ZGVzID0gTWF0aC5tYXgoMywgX2xvbmdpdHVkZXMpO1xyXG4gICAgICAgIHRoaXMubGF0aXR1ZGVzID0gTWF0aC5tYXgoMiwgX2xhdGl0dWRlcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzaGFwZTogVmVjdG9yMltdID0gW107XHJcbiAgICAgIGxldCBzdGVwOiBudW1iZXIgPSBNYXRoLlBJIC8gdGhpcy5sYXRpdHVkZXM7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPD0gdGhpcy5sYXRpdHVkZXM7ICsraSkge1xyXG4gICAgICAgIGxldCBhbmdsZTogbnVtYmVyID0gTWF0aC5QSSAvIDIgLSBpICogc3RlcDtcclxuICAgICAgICBsZXQgeDogbnVtYmVyID0gTWF0aC5jb3MoYW5nbGUpO1xyXG4gICAgICAgIGxldCB5OiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZSk7XHJcblxyXG4gICAgICAgIHNoYXBlLnB1c2gobmV3IFZlY3RvcjIoeCAvIDIsIHkgLyAyKSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGxhY2UgZmlyc3QgYW5kIGxhc3QgdmVydGV4IGV4YWN0bHkgb24gcm90YXRpb24gYXhpc1xyXG4gICAgICBzaGFwZVswXS54ID0gMDtcclxuICAgICAgc2hhcGVbc2hhcGUubGVuZ3RoIC0gMV0ueCA9IDA7XHJcblxyXG4gICAgICBzdXBlci5yb3RhdGUoc2hhcGUsIF9sb25naXR1ZGVzKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBkZWxldGUgc2VyaWFsaXphdGlvbi5zaGFwZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5sYXRpdHVkZXMgPSB0aGlzLmxhdGl0dWRlcztcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB0aGlzLmNyZWF0ZShfc2VyaWFsaXphdGlvbi5sb25naXR1ZGVzLCBfc2VyaWFsaXphdGlvbi5sYXRpdHVkZXMpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZSh0aGlzLmxvbmdpdHVkZXMsIHRoaXMubGF0aXR1ZGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNoYXBlO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgdHdvIHF1YWRzIHBsYWNlZCBiYWNrIHRvIGJhY2ssIHRoZSBvbmUgZmFjaW5nIGluIG5lZ2F0aXZlIFotZGlyZWN0aW9uIGlzIHRleHR1cmVkIHJldmVyc2VkXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAwIF9fIDNcclxuICAgKiAgICAgICAgIHxfX3xcclxuICAgKiAgICAgICAgMSAgICAyICAgICAgICAgICAgIFxyXG4gICAqIGBgYCBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoU3ByaXRlIGV4dGVuZHMgTWVzaCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hTcHJpdGUpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoU3ByaXRlXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLnZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoLTAuNSwgMC41LCAwKSwgbmV3IFZlY3RvcjIoMCwgMCkpLFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoLTAuNSwgLTAuNSwgMCksIG5ldyBWZWN0b3IyKDAsIDEpKSxcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuNSwgLTAuNSwgMCksIG5ldyBWZWN0b3IyKDEsIDEpKSxcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuNSwgMC41LCAwKSwgbmV3IFZlY3RvcjIoMSwgMCkpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZmFjZXMgPSBbXHJcbiAgICAgICAgbmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgMSwgMiwgMCksXHJcbiAgICAgICAgbmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgMiwgMywgMCksXHJcbiAgICAgICAgbmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgMCwgMywgMSksXHJcbiAgICAgICAgbmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgMywgMiwgMSlcclxuICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmbGF0IGlzIHN0YW5kYXJkIGhlcmUgLy8gVE9ETzogaXMgdGhpcyBzdGlsbCBuZWVkZWQ/XHJcbiAgICBwdWJsaWMgZ2V0IHZlcnRpY2VzRmxhdCgpOiBGbG9hdDMyQXJyYXkgeyByZXR1cm4gdGhpcy5yZW5kZXJNZXNoLnZlcnRpY2VzOyB9XHJcbiAgICBwdWJsaWMgZ2V0IGluZGljZXNGbGF0KCk6IFVpbnQxNkFycmF5IHsgcmV0dXJuIHRoaXMucmVuZGVyTWVzaC5pbmRpY2VzOyB9XHJcblxyXG4gICAgLy8gaW5zdGVhZCwgc21vb3RoIHNoYWRpbmcgd291bGQgbmVlZCBleHRyYSBhdHRlbnRpb24gYnV0IGlzIG5vdCByZWxldmFudC4uLlxyXG5cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIFRvcnVzIHdpdGggYSBnaXZlbiB0aGlja25lc3MgYW5kIHRoZSBudW1iZXIgb2YgbWFqb3ItIGFuZCBtaW5vciBzZWdtZW50c1xyXG4gICAqIEBhdXRob3JzIFNpbW9uIFN0b3JsLVNjaHVsa2UsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIwXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hUb3J1cyBleHRlbmRzIE1lc2hSb3RhdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hUb3J1cyk7XHJcbiAgICBwcml2YXRlIHNpemU6IG51bWJlciA9IDAuMjU7XHJcbiAgICBwcml2YXRlIGxhdGl0dWRlczogbnVtYmVyID0gMTI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hUb3J1c1wiLCBfc2l6ZTogbnVtYmVyID0gMC4yNSwgX2xvbmdpdHVkZXM6IG51bWJlciA9IDgsIF9sYXRpdHVkZXM6IG51bWJlciA9IDYpIHtcclxuICAgICAgc3VwZXIoX25hbWUsIE1lc2hUb3J1cy5nZXRTaGFwZShfc2l6ZSwgTWF0aC5tYXgoMywgX2xhdGl0dWRlcykpLCBfbG9uZ2l0dWRlcyk7XHJcbiAgICAgIHRoaXMuc2l6ZSA9IF9zaXplO1xyXG4gICAgICB0aGlzLmxvbmdpdHVkZXMgPSBfbG9uZ2l0dWRlcztcclxuICAgICAgdGhpcy5sYXRpdHVkZXMgPSBNYXRoLm1heCgzLCBfbGF0aXR1ZGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRTaGFwZShfc2l6ZTogbnVtYmVyLCBfbGF0aXR1ZGVzOiBudW1iZXIpOiBWZWN0b3IyW10ge1xyXG4gICAgICBsZXQgc2hhcGU6IFZlY3RvcjJbXSA9IFtdO1xyXG4gICAgICBsZXQgcmFkaXVzOiBudW1iZXIgPSBfc2l6ZSAvIDI7XHJcbiAgICAgIGxldCBjZW50ZXI6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMigwLjI1ICsgcmFkaXVzLCAwKTtcclxuICAgICAgZm9yIChsZXQgbGF0aXR1ZGU6IG51bWJlciA9IDA7IGxhdGl0dWRlIDw9IF9sYXRpdHVkZXM7IGxhdGl0dWRlKyspIHtcclxuICAgICAgICBsZXQgYW5nbGU6IG51bWJlciA9IDIgKiBNYXRoLlBJICogbGF0aXR1ZGUgLyBfbGF0aXR1ZGVzO1xyXG4gICAgICAgIHNoYXBlLnB1c2goVmVjdG9yMi5TVU0oY2VudGVyLCBuZXcgVmVjdG9yMihyYWRpdXMgKiAtTWF0aC5jb3MoYW5nbGUpLCByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSkpKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHNoYXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIHRoaXMgdG9ydXMgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVyc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlKF9zaXplOiBudW1iZXIgPSAwLjI1LCBfbG9uZ2l0dWRlczogbnVtYmVyID0gOCwgX2xhdGl0dWRlczogbnVtYmVyID0gNik6IHZvaWQge1xyXG4gICAgICB0aGlzLnNpemUgPSBfc2l6ZTtcclxuICAgICAgdGhpcy5sYXRpdHVkZXMgPSBNYXRoLm1heCgzLCBfbGF0aXR1ZGVzKTtcclxuICAgICAgc3VwZXIucm90YXRlKE1lc2hUb3J1cy5nZXRTaGFwZShfc2l6ZSwgX2xhdGl0dWRlcyksIF9sb25naXR1ZGVzKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmxhdGl0dWRlcyA9IHRoaXMubGF0aXR1ZGVzO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNpemUgPSB0aGlzLnNpemU7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgdGhpcy5jcmVhdGUoX3NlcmlhbGl6YXRpb24uc2l6ZSwgX3NlcmlhbGl6YXRpb24ubG9uZ2l0dWRlcywgX3NlcmlhbGl6YXRpb24ubGF0aXR1ZGVzKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgdGhpcy5jcmVhdGUodGhpcy5zaXplLCB0aGlzLmxvbmdpdHVkZXMsIHRoaXMubGF0aXR1ZGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNoYXBlO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGVudW0gUVVBRFNQTElUIHtcclxuICAgIFBMQU5BUiwgQVRfMCwgQVRfMVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBzdXJmYWNlIGNyZWF0ZWQgd2l0aCBmb3VyIHZlcnRpY2VzIHdoaWNoIGltbWVkaWF0ZWx5IGNyZWF0ZXMgbm9uZSwgb25lIG9yIHR3byB7QGxpbmsgRmFjZX1zIGRlcGVuZGluZyBvbiB2ZXJ0aWNlcyBhdCBpZGVudGljYWwgcG9zaXRpb25zLlxyXG4gICAqIGBgYHRleHRcclxuICAgKiBRVUFEU1BMSVQ6ICBQTEFOQVIgICAgICAgICAgICAgICAgICBBVF8wICAgICAgICAgICAgICAgICAgICAgQVRfMVxyXG4gICAqICAgICAgICAgICAgIDAgXyAzICAgICAgICAgICAgICAgICAgIDAgXyAzICAgICAgICAgICAgICAgICAgICAwIF8gMyAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgKiAgICAgICAgICAgICAgfFxcfCAgICAgICAgICAgICAgICAgICAgIHxcXHwgICAgICAgICAgICAgICAgICAgICAgfC98ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAqICAgICAgICAgICAgIDEg4oC+IDIgICAgICAgICAgICAgICAgICAgMSDigL4gMiAgICAgICAgICAgICAgICAgICAgMSDigL4gMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAqICBzaGFyZWQgbGFzdCB2ZXJ0ZXggMiAgICAgIGxhc3QgdmVydGljZXMgMiArIDMgICAgICBsYXN0IHZlcnRpY2VzIDMgKyAwIFxyXG4gICAqICAgICAgXHJcbiAgICogYGBgIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFF1YWQge1xyXG4gICAgcHVibGljIGZhY2VzOiBGYWNlW107XHJcbiAgICAjc3BsaXQ6IFFVQURTUExJVDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3ZlcnRpY2VzOiBWZXJ0aWNlcywgX2luZGV4MDogbnVtYmVyLCBfaW5kZXgxOiBudW1iZXIsIF9pbmRleDI6IG51bWJlciwgX2luZGV4MzogbnVtYmVyLCBfc3BsaXQ6IFFVQURTUExJVCA9IFFVQURTUExJVC5QTEFOQVIpIHtcclxuICAgICAgdGhpcy5mYWNlcyA9IFtdO1xyXG4gICAgICB0aGlzLiNzcGxpdCA9IF9zcGxpdDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoX3NwbGl0ICE9IFFVQURTUExJVC5BVF8xKVxyXG4gICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKF92ZXJ0aWNlcywgX2luZGV4MCwgX2luZGV4MSwgX2luZGV4MikpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuZmFjZXMucHVzaChuZXcgRmFjZShfdmVydGljZXMsIF9pbmRleDEsIF9pbmRleDIsIF9pbmRleDMpKTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHtcclxuICAgICAgICBEZWJ1Zy5mdWRnZShcIkZhY2UgZXhjbHVkZWRcIiwgKDxFcnJvcj5fZSkubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoX3NwbGl0ID09IFFVQURTUExJVC5QTEFOQVIpXHJcbiAgICAgICAgICB0aGlzLmZhY2VzLnB1c2gobmV3IEZhY2UoX3ZlcnRpY2VzLCBfaW5kZXgzLCBfaW5kZXgwLCBfaW5kZXgyKSk7XHJcbiAgICAgICAgZWxzZSBpZiAoX3NwbGl0ID09IFFVQURTUExJVC5BVF8wKVxyXG4gICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKF92ZXJ0aWNlcywgX2luZGV4MCwgX2luZGV4MiwgX2luZGV4MykpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuZmFjZXMucHVzaChuZXcgRmFjZShfdmVydGljZXMsIF9pbmRleDEsIF9pbmRleDMsIF9pbmRleDApKTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHtcclxuICAgICAgICBEZWJ1Zy5mdWRnZShcIkZhY2UgZXhjbHVkZWRcIiwgKDxFcnJvcj5fZSkubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNwbGl0KCk6IFFVQURTUExJVCB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcGxpdDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBCb25lIHtcclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICB3ZWlnaHQ6IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8vIFRPRE86IHRoZSByZWZlciB0byAgZGVzY3JpcHRpb24gaXMgbm8gbG9uZ2VyIGNvcnJlY3QgYXMgcmVmZXIgdG8gYWxzbyB3b3JrcyBmb3IgYm9uZSBpbmRpY2VzXHJcbiAgLyoqXHJcbiAgICogUmVwcmVzZW50cyBhIHZlcnRleCBvZiBhIG1lc2ggd2l0aCBleHRlbmRlZCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSB1diBjb29yZGluYXRlcyBhbmQgdGhlIHZlcnRleCBub3JtYWwuXHJcbiAgICogSXQgbWF5IHJlZmVyIHRvIGFub3RoZXIgdmVydGV4IHZpYSBhbiBpbmRleCBpbnRvIHNvbWUgYXJyYXksIGluIHdoaWNoIGNhc2UgdGhlIHBvc2l0aW9uIGFuZCB0aGUgbm9ybWFsIGFyZSBzdG9yZWQgdGhlcmUuXHJcbiAgICogVGhpcyB3YXksIHZlcnRleCBwb3NpdGlvbiBhbmQgbm9ybWFsIGlzIGEgMToxIGFzc29jaWF0aW9uLCB2ZXJ0ZXggdG8gdGV4dHVyZSBjb29yZGluYXRlcyBhIDE6biBhc3NvY2lhdGlvbi5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBWZXJ0ZXgge1xyXG4gICAgcHVibGljIHBvc2l0aW9uOiBWZWN0b3IzO1xyXG4gICAgcHVibGljIHV2OiBWZWN0b3IyIHwgbnVsbDtcclxuICAgIHB1YmxpYyBub3JtYWw6IFZlY3RvcjM7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG4gICAgcHVibGljIHRhbmdlbnQ6IFZlY3RvcjQgfCBudWxsO1xyXG4gICAgcHVibGljIHJlZmVyVG86IG51bWJlcjtcclxuICAgIHB1YmxpYyBib25lczogQm9uZVtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwcmVzZW50cyBhIHZlcnRleCBvZiBhIG1lc2ggd2l0aCBleHRlbmRlZCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSB1diBjb29yZGluYXRlcyB0aGUgdmVydGV4IG5vcm1hbCBhbmQgaXRzIHRhbmdlbnRzLlxyXG4gICAgICogSXQgbWF5IHJlZmVyIHRvIGFub3RoZXIgdmVydGV4IHZpYSBhbiBpbmRleCBpbnRvIHNvbWUgYXJyYXksIGluIHdoaWNoIGNhc2UgdGhlIHBvc2l0aW9uIGFuZCB0aGUgbm9ybWFsIGFyZSBzdG9yZWQgdGhlcmUuXHJcbiAgICAgKiBUaGlzIHdheSwgdmVydGV4IHBvc2l0aW9uIGFuZCBub3JtYWwgaXMgYSAxOjEgYXNzb2NpYXRpb24sIHZlcnRleCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVzIGEgMTpuIGFzc29jaWF0aW9uLlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcG9zaXRpb25PckluZGV4OiBWZWN0b3IzIHwgbnVtYmVyLCBfdXY6IFZlY3RvcjIgPSBudWxsLCBfbm9ybWFsOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCksIF90YW5nZW50OiBWZWN0b3I0ID0gbnVsbCwgX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKSwgX2JvbmVzOiBCb25lW10gPSBudWxsKSB7XHJcbiAgICAgIGlmIChfcG9zaXRpb25PckluZGV4IGluc3RhbmNlb2YgVmVjdG9yMylcclxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gX3Bvc2l0aW9uT3JJbmRleDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMucmVmZXJUbyA9IF9wb3NpdGlvbk9ySW5kZXg7XHJcblxyXG4gICAgICB0aGlzLnV2ID0gX3V2O1xyXG4gICAgICB0aGlzLm5vcm1hbCA9IF9ub3JtYWw7XHJcbiAgICAgIHRoaXMudGFuZ2VudCA9IF90YW5nZW50O1xyXG4gICAgICB0aGlzLmNvbG9yID0gX2NvbG9yO1xyXG4gICAgICB0aGlzLmJvbmVzID0gX2JvbmVzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEFycmF5IHdpdGggZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSB0byBzZXJ2ZSBhcyBhIHtAbGluayBWZXJ0ZXh9LWNsb3VkLiBcclxuICAgKiBBY2Nlc3NvcnMgeWllbGQgcG9zaXRpb24gb3Igbm9ybWFsIGFsc28gZm9yIHZlcnRpY2VzIHJlZmVyZW5jaW5nIG90aGVyIHZlcnRpY2VzXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVydGljZXMgZXh0ZW5kcyBBcnJheTxWZXJ0ZXg+IHtcclxuICAgIC8vIFRPRE86IHRoaXMgY2xhc3MgbWF5IGJlY29tZSBtb3JlIHBvd2VyZnVsIGJ5IGhpZGluZyB0aGUgYXJyYXkgYW5kIGFkZCBtb3JlIHNlcnZpY2UgbWV0aG9kcyBsaWtlIGNhbGN1bGF0aW5nIGJvdW5kaW5nIGJveCwgcmFkaXVzIGV0Yy5cclxuICAgIC8vIHNlZSBpZiBhIHByb3h5IG9mIHRoZSBhcnJheSBpbnRlcmZhY2luZyBbXSB3b3VsZCBkbyBhIGdvb2Qgam9iIC0+IHRlc3RlZDogcHJveHkgaXMgYWJvdXQgMjAgdGltZXMgc2xvd2VyIVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc3Vic2V0IG9mIHZlcnRpY2VzIHRoYXQgZG8gbm90IHJlZmVyIHRvIG90aGVyIHZlcnRpY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgb3JpZ2luYWxzKCk6IEFycmF5PFZlcnRleD4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoX3ZlcnRleCA9PiBfdmVydGV4LnJlZmVyVG8gPT0gdW5kZWZpbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgdGhlIHBvc2l0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVydGV4IGFkZHJlc3NlZCwgcmVzb2x2aW5nIHJlZmVyZW5jZXMgYmV0d2VlbiB2ZXJ0aWNlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvc2l0aW9uKF9pbmRleDogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZXJ0ZXg6IFZlcnRleCA9IHRoaXNbX2luZGV4XTtcclxuICAgICAgcmV0dXJuICh2ZXJ0ZXgucmVmZXJUbyA9PSB1bmRlZmluZWQpID8gdmVydGV4LnBvc2l0aW9uIDogdGhpc1t2ZXJ0ZXgucmVmZXJUb10ucG9zaXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIHRoZSBub3JtYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkLCByZXNvbHZpbmcgcmVmZXJlbmNlcyBiZXR3ZWVuIHZlcnRpY2VzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbm9ybWFsKF9pbmRleDogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZXJ0ZXg6IFZlcnRleCA9IHRoaXNbX2luZGV4XTtcclxuICAgICAgcmV0dXJuICh2ZXJ0ZXgucmVmZXJUbyA9PSB1bmRlZmluZWQpID8gdmVydGV4Lm5vcm1hbCA6IHRoaXNbdmVydGV4LnJlZmVyVG9dLm5vcm1hbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgdGhlIHRhbmdlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0YW5nZW50KF9pbmRleDogbnVtYmVyKTogVmVjdG9yNCB7XHJcbiAgICAgIHJldHVybiB0aGlzW19pbmRleF0udGFuZ2VudDsgLy8gdGFuZ2VudHMgY2FuIG5vdCBiZSBzaGFyZWQgYXMgdGhleSBhcmUgZGVwZW5kZW50IG9uIHRoZSB1di1jb29yZGluYXRlc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0aGUgdXYtY29vcmRpbmF0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1dihfaW5kZXg6IG51bWJlcik6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gdGhpc1tfaW5kZXhdLnV2O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0aGUgY29sb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2xvcihfaW5kZXg6IG51bWJlcik6IENvbG9yIHtcclxuICAgICAgcmV0dXJuIHRoaXNbX2luZGV4XS5jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgdGhlIGJvbmVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVydGV4IGFkZHJlc3NlZCwgcmVzb2x2aW5nIHJlZmVyZW5jZXMgYmV0d2VlbiB2ZXJ0aWNlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJvbmVzKF9pbmRleDogbnVtYmVyKTogQm9uZVtdIHtcclxuICAgICAgbGV0IHZlcnRleDogVmVydGV4ID0gdGhpc1tfaW5kZXhdO1xyXG4gICAgICByZXR1cm4gKHZlcnRleC5yZWZlclRvID09IHVuZGVmaW5lZCkgPyB2ZXJ0ZXguYm9uZXMgOiB0aGlzW3ZlcnRleC5yZWZlclRvXS5ib25lcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG5hbWVzYXBjZSBmb3IgaGFuZGxpbmcgdGhlIHBhcnRpY2xlIGRhdGFcclxuICAgKi9cclxuICBleHBvcnQgbmFtZXNwYWNlIFBhcnRpY2xlRGF0YSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGEgcGFydGljbGUgc3lzdGVtLiBEZXNjcmliZXMgdGhlIHBhcnRpY2xlIGJlaGF2aW9yIGFuZCBhcHBlYXJhbmNlLlxyXG4gICAgICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFN5c3RlbSB7XHJcbiAgICAgIHZhcmlhYmxlTmFtZXM/OiBzdHJpbmdbXTtcclxuICAgICAgdmFyaWFibGVzPzogRXhwcmVzc2lvbltdOyAvL3sgW25hbWU6IHN0cmluZ106IEV4cHJlc3Npb24gfTtcclxuICAgICAgY29sb3I/OiBFeHByZXNzaW9uW107XHJcbiAgICAgIG10eExvY2FsPzogVHJhbnNmb3JtYXRpb25bXTtcclxuICAgICAgbXR4V29ybGQ/OiBUcmFuc2Zvcm1hdGlvbltdO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCB0eXBlIFJlY3Vyc2l2ZSA9IFN5c3RlbSB8IEV4cHJlc3Npb25bXSB8IFRyYW5zZm9ybWF0aW9uW10gfCBUcmFuc2Zvcm1hdGlvbiB8IEV4cHJlc3Npb247XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgRXhwcmVzc2lvbiA9IEZ1bmN0aW9uIHwgVmFyaWFibGUgfCBDb25zdGFudCB8IENvZGU7XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XHJcbiAgICAgIGZ1bmN0aW9uOiBGVU5DVElPTjtcclxuICAgICAgcGFyYW1ldGVyczogRXhwcmVzc2lvbltdO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGUge1xyXG4gICAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29uc3RhbnQge1xyXG4gICAgICB2YWx1ZTogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZSB7XHJcbiAgICAgIGNvZGU6IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHtcclxuICAgICAgdHJhbnNmb3JtYXRpb246IFwidHJhbnNsYXRlXCIgfCBcInJvdGF0ZVwiIHwgXCJzY2FsZVwiO1xyXG4gICAgICBwYXJhbWV0ZXJzOiBFeHByZXNzaW9uW107XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgRXhwcmVzc2lvbn1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihfZGF0YTogUmVjdXJzaXZlKTogX2RhdGEgaXMgRXhwcmVzc2lvbiB7XHJcbiAgICAgIHJldHVybiBpc0Z1bmN0aW9uKF9kYXRhKSB8fCBpc1ZhcmlhYmxlKF9kYXRhKSB8fCBpc0NvbnN0YW50KF9kYXRhKSB8fCBpc0NvZGUoX2RhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhIGlzIGEge0BsaW5rIEZ1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihfZGF0YTogUmVjdXJzaXZlKTogX2RhdGEgaXMgRnVuY3Rpb24ge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIF9kYXRhID09IFwib2JqZWN0XCIgJiYgXCJmdW5jdGlvblwiIGluIF9kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhIGlzIGEge0BsaW5rIFZhcmlhYmxlfVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNWYXJpYWJsZShfZGF0YTogUmVjdXJzaXZlKTogX2RhdGEgaXMgVmFyaWFibGUge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIF9kYXRhID09IFwib2JqZWN0XCIgJiYgXCJ2YWx1ZVwiIGluIF9kYXRhICYmIHR5cGVvZiBfZGF0YS52YWx1ZSA9PSBcInN0cmluZ1wiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhIGlzIGEge0BsaW5rIENvbnN0YW50fVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDb25zdGFudChfZGF0YTogUmVjdXJzaXZlKTogX2RhdGEgaXMgQ29uc3RhbnQge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIF9kYXRhID09IFwib2JqZWN0XCIgJiYgXCJ2YWx1ZVwiIGluIF9kYXRhICYmIHR5cGVvZiBfZGF0YS52YWx1ZSA9PSBcIm51bWJlclwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhIGlzIGEge0BsaW5rIENvZGV9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvZGUoX2RhdGE6IFJlY3Vyc2l2ZSk6IF9kYXRhIGlzIENvZGUge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIF9kYXRhID09IFwib2JqZWN0XCIgJiYgXCJjb2RlXCIgaW4gX2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgVHJhbnNmb3JtYXRpb259XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zZm9ybWF0aW9uKF9kYXRhOiBSZWN1cnNpdmUpOiBfZGF0YSBpcyBUcmFuc2Zvcm1hdGlvbiB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgX2RhdGEgPT0gXCJvYmplY3RcIiAmJiBcInRyYW5zZm9ybWF0aW9uXCIgaW4gX2RhdGE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIb2xkcyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbXV0YXRlIHRoZSBwYXJ0aWNsZXMgb2YgYSBwYXJ0aWNsZSBzeXN0ZW0uXHJcbiAgICogQSBmdWxsIHBhcnRpY2xlIHN5c3RlbSBpcyBjb21wb3NlZCBieSBhdHRhY2hpbmcgYSB7QGxpbmsgQ29tcG9uZW50UGFydGljbGVTeXN0ZW19LCB7QGxpbmsgQ29tcG9uZW50TWVzaH0gYW5kIHtAbGluayBDb21wb25lbnRNYXRlcmlhbH0gdG8gdGhlIHNhbWUge0BsaW5rIE5vZGV9LiBcclxuICAgKiBBZGRpdGlvbmFsbHkgYSB7QGxpbmsgQ29tcG9uZW50RmFjZUNhbWVyYX0gY2FuIGJlIGF0dGFjaGVkIHRvIG1ha2UgdGhlIHBhcnRpY2xlcyBmYWNlIHRoZSBjYW1lcmEuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBhcnRpY2xlU3lzdGVtIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICNkYXRhOiBQYXJ0aWNsZURhdGEuU3lzdGVtO1xyXG4gICAgLyoqIE1hcCBvZiBzaGFkZXIgdW5pdmVyc2FsIGRlcml2YXRlcyB0byBjb3JyZXNwb25kaW5nIGNvbXB1dGVkIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbX0uIFxyXG4gICAgICogVGhpcyB3YXkgZWFjaCBwYXJ0aWNsZSBzeXN0ZW0gcmVzb3VyY2UgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBtdWx0aXBsZSBzaGFkZXIgdW5pdmVyc2FsIGRlcml2YXRlcyAqL1xyXG4gICAgI3NoYWRlclRvU2hhZGVyUGFydGljbGVTeXN0ZW06IE1hcDxTaGFkZXJJbnRlcmZhY2UsIFNoYWRlclBhcnRpY2xlU3lzdGVtPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFBhcnRpY2xlU3lzdGVtLm5hbWUsIF9kYXRhOiBQYXJ0aWNsZURhdGEuU3lzdGVtID0ge30pIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICAgIHRoaXMuZGF0YSA9IF9kYXRhO1xyXG5cclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogUGFydGljbGVEYXRhLlN5c3RlbSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZGF0YShfZGF0YTogUGFydGljbGVEYXRhLlN5c3RlbSkge1xyXG4gICAgICB0aGlzLiNkYXRhID0gX2RhdGE7XHJcbiAgICAgIHRoaXMuI3NoYWRlclRvU2hhZGVyUGFydGljbGVTeXN0ZW0uZm9yRWFjaChfc2hhZGVyID0+IF9zaGFkZXIuZGVsZXRlUHJvZ3JhbSgpKTtcclxuICAgICAgdGhpcy4jc2hhZGVyVG9TaGFkZXJQYXJ0aWNsZVN5c3RlbS5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNvcnJlc3BvbmRpbmcge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtfSBmb3IgdGhlIGdpdmVuIHNoYWRlciB1bml2ZXJzYWwgZGVyaXZhdGUuXHJcbiAgICAgKiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtIHRvIHJlbmRlciB0aGUgcGFydGljbGUgc3lzdGVtLlxyXG4gICAgICogQHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtfVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTaGFkZXJGcm9tKF9zb3VyY2U6IFNoYWRlckludGVyZmFjZSk6IFNoYWRlclBhcnRpY2xlU3lzdGVtIHtcclxuICAgICAgaWYgKCF0aGlzLiNzaGFkZXJUb1NoYWRlclBhcnRpY2xlU3lzdGVtLmhhcyhfc291cmNlKSkge1xyXG4gICAgICAgIGxldCBwYXJ0aWNsZVNoYWRlcjogU2hhZGVyUGFydGljbGVTeXN0ZW0gPSBuZXcgU2hhZGVyUGFydGljbGVTeXN0ZW0oKTtcclxuICAgICAgICBwYXJ0aWNsZVNoYWRlci5kYXRhID0gdGhpcy5kYXRhO1xyXG4gICAgICAgIHBhcnRpY2xlU2hhZGVyLmRlZmluZSA9IFsuLi5wYXJ0aWNsZVNoYWRlci5kZWZpbmUsIC4uLl9zb3VyY2UuZGVmaW5lXTtcclxuICAgICAgICBwYXJ0aWNsZVNoYWRlci52ZXJ0ZXhTaGFkZXJTb3VyY2UgPSBfc291cmNlLmdldFZlcnRleFNoYWRlclNvdXJjZSgpO1xyXG4gICAgICAgIHBhcnRpY2xlU2hhZGVyLmZyYWdtZW50U2hhZGVyU291cmNlID0gX3NvdXJjZS5nZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpO1xyXG4gICAgICAgIHRoaXMuI3NoYWRlclRvU2hhZGVyUGFydGljbGVTeXN0ZW0uc2V0KF9zb3VyY2UsIHBhcnRpY2xlU2hhZGVyKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI3NoYWRlclRvU2hhZGVyUGFydGljbGVTeXN0ZW0uZ2V0KF9zb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgaWRSZXNvdXJjZTogdGhpcy5pZFJlc291cmNlLFxyXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICBkYXRhOiB0aGlzLmRhdGFcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgdGhpcy5kYXRhID0gX3NlcmlhbGl6YXRpb24uZGF0YTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlKCk6IE11dGF0b3JGb3JVc2VySW50ZXJmYWNlIHtcclxuICAgICAgcmV0dXJuIDxNdXRhdG9yRm9yVXNlckludGVyZmFjZT5zdXBlci5nZXRNdXRhdG9yKCk7IC8vIHJlbW92ZSBkYXRhIGZyb20gbXV0YXRvclxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IuZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLmNhY2hlZE11dGF0b3JzO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2hhZGVyTWFwO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgV2ViR0wgc2hhZGVycHJvZ3JhbSBmb3IgYSBwYXJ0aWNsZSBzeXN0ZW0uIE1hbmFnZWQgYnkgYSB7QGxpbmsgUGFydGljbGVTeXN0ZW19LiBJdCB1c2VzIHtAbGluayBQYXJ0aWNsZVN5c3RlbS5kYXRhfSB0byBnZW5lcmF0ZSBhbmQgaW5qZWN0IGNvZGUgaW50byBhIHNoYWRlciB1bml2ZXJzYWwgZGVyaXZhdGUgKEdMU0wpIHRodXMgY3JlYXRpbmcgYSBzaGFkZXIgcGFydGljbGUgc3lzdGVtIGZyb20gYSBzdXBwbGllZCB7QGxpbmsgU2hhZGVyfXMgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgc291cmNlIGNvZGUuXHJcbiAgICogQGF1dGhvciBKb25hcyBQbG90emt5LCBIRlUsIDIwMjJcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBjbGFzcyBTaGFkZXJQYXJ0aWNsZVN5c3RlbSBpbXBsZW1lbnRzIFNoYWRlckludGVyZmFjZSB7XHJcbiAgICBwdWJsaWMgZGF0YTogUGFydGljbGVEYXRhLlN5c3RlbTtcclxuICAgIHB1YmxpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1wiUEFSVElDTEVcIl07XHJcbiAgICBwdWJsaWMgdmVydGV4U2hhZGVyU291cmNlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZnJhZ21lbnRTaGFkZXJTb3VyY2U6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xyXG4gICAgcHVibGljIGF0dHJpYnV0ZXM6IHsgW25hbWU6IHN0cmluZ106IG51bWJlciB9O1xyXG4gICAgcHVibGljIHVuaWZvcm1zOiB7IFtuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHsgcmV0dXJuIFwiXCI7IC8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbX0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7IHJldHVybiBcIlwiOyAvKiBpbmplY3RlZCBieSBkZWNvcmF0b3IgKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVQcm9ncmFtKCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbX0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVzZVByb2dyYW0oKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgZGVjb3JhdG9yICovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtfS4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlUHJvZ3JhbSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBkZWNvcmF0b3IgKi8gfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgdGhpcyBub2RlIHRvIGFjY2VzcyB0aGUgd2F5cG9pbnQgZ3JpZCBlc3RhYmxpc2hlZCB0aHJvdWdoIHtAbGluayBDb21wb25lbnRXYXlwb2ludH1zIGFuZCB0aGVpciB7QGxpbmsgQ29ubmVjdGlvbn1zLFxyXG4gICAqIGZpbmQgYSBwYXRoIHRocm91Z2ggdGhlbSBhbmQgZXZlbiB3YWxrIGRvd24gdGhlIHBhdGguXHJcbiAgICogQGF1dGhvciBMdWthcyBTY2hldWVybGUsIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRXYWxrZXIgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudFdhbGtlcik7XHJcbiAgICAvKiogVGhlIHNwZWVkIHRoZSB3YWxrZXIgc2hvdWxkIG1vdmUgd2l0aC4gQ29ycmVzcG9uZHMgdG8gdW5pdHMvcy4gKi9cclxuICAgIHB1YmxpYyBzcGVlZDogbnVtYmVyID0gMTtcclxuICAgIC8qKiBJZiB0cnVlLCBtb3ZlIHRoZSBub2RlIHRoaXMgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvIHRocm91Z2ggZm9yY2VzIGluc3RlYWQgb2YgZGlyZWN0bHkgdGhyb3VnaCB0aGUgdHJhbnNmb3JtLiBSZXF1aXJlcyBhIFtbQ29tcG9uZW50UmlnaWRib2R5XV0gaWYgdHJ1ZS4gKi9cclxuICAgIC8vIHB1YmxpYyBtb3ZlVGhyb3VnaFBoeXNpY3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKioga2VlcHMgdGhlIGRhdGEgbmVlZGVkIGZvciB0aGUgY3VycmVudCB3YWxrICovXHJcbiAgICAjd2Fsa0RhdGE6IFdhbGtEYXRhID0geyBwYXRoOiBbXSwgdG90YWxQcm9ncmVzczogLTEgfTtcclxuICAgIC8qKiBrZWVwcyB0aGUgcHJvbWlzZSB0byByZXNvbHZlIHdoZW4gdGhlIHdhbGtlciBoYXMgcmVhY2hlZCB0aGUgZ29hbCAqL1xyXG4gICAgI3Byb21pc2VSZXNvbHZlck9uV2Fsa0ZpbmlzaGVkOiAoKSA9PiB2b2lkO1xyXG4gICAgLyoqIHN0YXR1cyBvZiB3aGV0aGVyIGl0IHNob3VsZCByb3RhdGUgdGhlIHdhbGtlciB0byB0aGUgd2Fsa2luZyBkaXJlY3Rpb24gKi9cclxuICAgICNyb3RhdGVJbldhbGtEaXJlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgaWYgKFByb2plY3QubW9kZSA9PSBNT0RFLkVESVRPUilcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLiNoYW5kbGVBdHRhY2guYmluZCh0aGlzKSk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCB0aGlzLiNoYW5kbGVEZXRhY2guYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKSxcclxuICAgICAgICBzcGVlZDogdGhpcy5zcGVlZFxyXG4gICAgICAgIC8vIG1vdmVUaHJvdWdoUGh5c2ljczogdGhpcy5tb3ZlVGhyb3VnaFBoeXNpY3MsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLnNwZWVkID0gX3NlcmlhbGl6YXRpb24uc3BlZWQ7XHJcbiAgICAgIC8vIHRoaXMubW92ZVRocm91Z2hQaHlzaWNzID0gX3NlcmlhbGl6YXRpb24ubW92ZVRocm91Z2hQaHlzaWNzO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsZXBvcnRzIChtb3ZlcyBpbnN0YW50bHkpIHRvIHRoZSBfdGFyZ2V0IFdheXBvaW50LlxyXG4gICAgICogQHBhcmFtIF90YXJnZXRcclxuICAgICAqIEByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbW92ZVRvKF90YXJnZXQ6IFdheXBvaW50KTogUHJvbWlzZTx2b2lkPjtcclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIHdhbGtlciBmcm9tIHRoZSBfc3RhcnQgdG8gdGhlIF9lbmQgV2F5cG9pbnQuXHJcbiAgICAgKiBUZWxlcG9ydHMgKG1vdmVzIGluc3RhbnRseSkgdG8gdGhlIF9zdGFydCBwb2ludCwgdGhlbiBtb3ZlcyB0aHJvdWdoIHRoZSB3YXlwb2ludCBjb25uZWN0aW9ucyB0byB0aGUgX2VuZCBwb2ludC5cclxuICAgICAqIEBwYXJhbSBfc3RhcnQgXHJcbiAgICAgKiBAcGFyYW0gX2VuZFxyXG4gICAgICogQHBhcmFtIF9yb3RhdGUgUm90YXRlcyB0aGUgd2Fsa2VyIHRvIGxvb2sgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgd2F5cG9pbnRcclxuICAgICAqIEByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIF9lbmQgcG9pbnQgaXMgcmVhY2hlZC4gUmVqZWN0cyBpZiBfZW5kIGNhbid0IGJlIHJlYWNoZWQgKG5vIHBhdGggZm91bmQpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbW92ZVRvKF9zdGFydDogV2F5cG9pbnQsIF9lbmQ6IFdheXBvaW50LCBfcm90YXRlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD47XHJcbiAgICBwdWJsaWMgYXN5bmMgbW92ZVRvKF9zdGFydDogV2F5cG9pbnQsIF9lbmQ/OiBXYXlwb2ludCwgX3JvdGF0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICghX3N0YXJ0KSByZXR1cm47XHJcbiAgICAgIGxldCB0cmFuc2xhdGU6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX3N0YXJ0Lm10eFdvcmxkLnRyYW5zbGF0aW9uLCB0aGlzLm5vZGUubXR4V29ybGQudHJhbnNsYXRpb24pO1xyXG4gICAgICB0aGlzLm5vZGUubXR4TG9jYWwudHJhbnNsYXRlKHRyYW5zbGF0ZSk7XHJcbiAgICAgIGlmICghX2VuZCB8fCBfc3RhcnQgPT09IF9lbmQpIHtcclxuICAgICAgICB0aGlzLiN3YWxrRGF0YSA9IHsgcGF0aDogW10sIHRvdGFsUHJvZ3Jlc3M6IC0xIH07XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuI3JvdGF0ZUluV2Fsa0RpcmVjdGlvbiA9IF9yb3RhdGU7XHJcblxyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgbGV0IHBhdGg6IFBhdGhpbmdOb2RlW10gfCBudWxsID0gdGhpcy5nZXRQYXRoKF9zdGFydCwgX2VuZCk7XHJcbiAgICAgICAgaWYgKCFwYXRoIHx8IHBhdGgubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBfcmVqZWN0KCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuI3dhbGtEYXRhID0geyBwYXRoLCB0b3RhbFByb2dyZXNzOiAwIH07XHJcbiAgICAgICAgdGhpcy4jcHJvbWlzZVJlc29sdmVyT25XYWxrRmluaXNoZWQgPSBfcmVzb2x2ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuI3JvdGF0ZUluV2Fsa0RpcmVjdGlvbiAmJiB0aGlzLiN3YWxrRGF0YS5wYXRoLmxlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdGF0ZVRvd2FyZHModGhpcy4jd2Fsa0RhdGEucGF0aFswXS53YXlwb2ludCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGFrZXMgY2FyZSBvZiB0aGUgbW92aW5nIGFsZ29yaXRobSBieSBjYWxjdWxhdGluZyB0aGUgbmV4dCBzdGVwIGFuZCBtb3ZpbmcgYWxvbmcgdGhpcyBzdGVwICovXHJcbiAgICBwcm90ZWN0ZWQgbW92aW5nKCk6IHZvaWQge1xyXG4gICAgICAvLyBhcmUgd2UgY3VycmVudGx5IG1vdmluZz9cclxuICAgICAgaWYgKHRoaXMuI3dhbGtEYXRhLnRvdGFsUHJvZ3Jlc3MgPCAwIHx8IHRoaXMuI3dhbGtEYXRhLnBhdGgubGVuZ3RoID09IDApIHJldHVybjtcclxuICAgICAgLy8gZG8gd2UgaGF2ZSBhIGN1cnJlbnQgcGF0aCB3ZSBjYW4gZm9sbG93XHJcbiAgICAgIGxldCBjdXJyZW50UGF0aDogUGF0aGluZ05vZGUgPSB0aGlzLiN3YWxrRGF0YS5wYXRoW3RoaXMuI3dhbGtEYXRhLnRvdGFsUHJvZ3Jlc3NdO1xyXG4gICAgICBpZiAoIWN1cnJlbnRQYXRoKSByZXR1cm47XHJcblxyXG4gICAgICAvLyBob3cgYmlnIG9mIGEgc3RlcCBhcmUgd2UgdGFraW5nIHRoaXMgZnJhbWU/XHJcbiAgICAgIGxldCBkZWx0YTogbnVtYmVyID0gdGhpcy5zcGVlZCAqIGN1cnJlbnRQYXRoLnByZXZpb3VzQ29ubmVjdGlvbi5zcGVlZE1vZGlmaWVyICogTG9vcC50aW1lRnJhbWVHYW1lIC8gMTAwMDtcclxuICAgICAgLy8gaG93IGZhciBhd2F5IGFyZSB3ZSBmcm9tIHRoZSBuZXh0IHdheXBvaW50P1xyXG4gICAgICBsZXQgc3RlcDogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShcclxuICAgICAgICBjdXJyZW50UGF0aC53YXlwb2ludC5tdHhXb3JsZC50cmFuc2xhdGlvbixcclxuICAgICAgICB0aGlzLm5vZGUubXR4V29ybGQudHJhbnNsYXRpb25cclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIGxldCBzdGVwUm90YXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5DT05TVFJVQ1RJT04oc3RlcCk7XHJcbiAgICAgIC8vIHN0ZXBSb3RhdGlvbi5yb3RhdGUodGhpcy5ub2RlLm10eFdvcmxkLnJvdGF0aW9uKTtcclxuICAgICAgLy8gc3RlcCA9IHN0ZXBSb3RhdGlvbi50cmFuc2xhdGlvbjtcclxuXHJcbiAgICAgIGxldCBzY2FsZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShcclxuICAgICAgICBjdXJyZW50UGF0aC53YXlwb2ludC5tdHhXb3JsZC5zY2FsaW5nLFxyXG4gICAgICAgIHRoaXMubm9kZS5tdHhXb3JsZC5zY2FsaW5nXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoZGVsdGEgKiBkZWx0YSA8IHN0ZXAubWFnbml0dWRlU3F1YXJlZCkgeyAvLyB3b24ndCByZWFjaCBuZXh0IHdheXBvaW50IHlldC4gVXNpbmcgc3F1YXJlcyBiZWNhdXNlIHRoYXQncyBmYXN0ZXIgdG8gY29tcHV0ZSB0aGFuIHNxcnRcclxuICAgICAgICBzdGVwLm5vcm1hbGl6ZShkZWx0YSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLm10eExvY2FsLnRyYW5zbGF0ZShzdGVwLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHNjYWxlLm1hZ25pdHVkZVNxdWFyZWQgPiAwKSB7XHJcbiAgICAgICAgICBzY2FsZS5ub3JtYWxpemUoZGVsdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vZGUubXR4TG9jYWwuc2NhbGluZyA9IFZlY3RvcjMuU1VNKHNjYWxlLCB0aGlzLm5vZGUubXR4TG9jYWwuc2NhbGluZyk7XHJcbiAgICAgICAgLy8gdGhpcy5ub2RlLm10eExvY2FsLnNjYWxlKFZlY3RvcjMuU1VNKHNjYWxlLCB0aGlzLm5vZGUubXR4TG9jYWwuc2NhbGluZykpO1xyXG4gICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IG1vdmVtZW50IHRocm91Z2ggcGh5c2ljc1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICAvLyByZWFjaGVkIG5leHQgcG9pbnRcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5XQVlQT0lOVF9SRUFDSEVELCB7IGJ1YmJsZXM6IHRydWUsIGRldGFpbDogY3VycmVudFBhdGgud2F5cG9pbnQgfSkpO1xyXG4gICAgICAoPENvbXBvbmVudFdheXBvaW50PmN1cnJlbnRQYXRoLndheXBvaW50KS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5XQVlQT0lOVF9SRUFDSEVELCB7IGJ1YmJsZXM6IHRydWUsIGRldGFpbDogdGhpcyB9KSk7XHJcbiAgICAgIFxyXG4gICAgICBsZXQgdHJhbnNsYXRlOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKGN1cnJlbnRQYXRoLndheXBvaW50Lm10eFdvcmxkLnRyYW5zbGF0aW9uLCB0aGlzLm5vZGUubXR4V29ybGQudHJhbnNsYXRpb24pO1xyXG4gICAgICB0aGlzLm5vZGUubXR4TG9jYWwudHJhbnNsYXRlKHRyYW5zbGF0ZSwgZmFsc2UpO1xyXG4gICAgICB0aGlzLm5vZGUubXR4TG9jYWwuc2NhbGluZyA9IGN1cnJlbnRQYXRoLndheXBvaW50Lm10eFdvcmxkLnNjYWxpbmc7XHJcbiAgICAgIHRoaXMuI3dhbGtEYXRhLnRvdGFsUHJvZ3Jlc3MrKztcclxuXHJcbiAgICAgIC8vIHJlYWNoZWQgZmluYWwgcG9pbnQsIGZpbmlzaGVkIHdhbGtpbmdcclxuICAgICAgaWYgKHRoaXMuI3dhbGtEYXRhLnRvdGFsUHJvZ3Jlc3MgPj0gdGhpcy4jd2Fsa0RhdGEucGF0aC5sZW5ndGgpIHtcclxuICAgICAgICBpZiAodGhpcy4jcHJvbWlzZVJlc29sdmVyT25XYWxrRmluaXNoZWQpIHRoaXMuI3Byb21pc2VSZXNvbHZlck9uV2Fsa0ZpbmlzaGVkKCk7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5QQVRISU5HX0NPTkNMVURFRCwgeyBidWJibGVzOiB0cnVlLCBkZXRhaWw6IGN1cnJlbnRQYXRoLndheXBvaW50IH0pKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNob3VsZCB3ZSByb3RhdGUgd2Fsa2VyP1xyXG4gICAgICBpZiAodGhpcy4jcm90YXRlSW5XYWxrRGlyZWN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5yb3RhdGVUb3dhcmRzKHRoaXMuI3dhbGtEYXRhLnBhdGhbdGhpcy4jd2Fsa0RhdGEudG90YWxQcm9ncmVzc10ud2F5cG9pbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIGZpbmQgdGhlIHBhdGggYmV0d2VlbiB0d28gZ2l2ZW4gd2F5cG9pbnRzICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UGF0aChfc3RhcnQ6IFdheXBvaW50LCBfZW5kOiBXYXlwb2ludCk6IFBhdGhpbmdOb2RlW10ge1xyXG4gICAgICAvLyBUT0RPOiB1c2UgYSBtb3JlIGVmZmljaWVudCBhbGdvcml0aG0gbGlrZSBBKiBpbnN0ZWFkIG9mIERpamtzdHJhXHJcbiAgICAgIC8vIHNldHVwIHRoZSBncmFwaCBvZiBwYXRocyBiYXNlZCBvbiB0aGUgc3RhcnQgbm9kZVxyXG4gICAgICBsZXQgdW52aXNpdGVkTm9kZXM6IFBhdGhpbmdOb2RlW10gPSBbXTtcclxuICAgICAgbGV0IHByb2Nlc3NlZFdheXBvaW50czogV2F5cG9pbnRbXSA9IFtfc3RhcnRdO1xyXG4gICAgICBsZXQgd2F5cG9pbnRzVG9TZWFyY2hUaHJvdWdoOiBXYXlwb2ludFtdID0gW19zdGFydF07XHJcbiAgICAgIGRvIHtcclxuICAgICAgICBsZXQgd2F5cG9pbnQ6IFdheXBvaW50ID0gd2F5cG9pbnRzVG9TZWFyY2hUaHJvdWdoLnBvcCgpO1xyXG4gICAgICAgIGZvciAobGV0IGNvbm5lY3Rpb24gb2Ygd2F5cG9pbnQuY29ubmVjdGlvbnMpIHtcclxuICAgICAgICAgIGlmICghcHJvY2Vzc2VkV2F5cG9pbnRzLmluY2x1ZGVzKGNvbm5lY3Rpb24uZW5kKSAmJiBjb25uZWN0aW9uLnN0YXJ0LmlzQWN0aXZlICYmIGNvbm5lY3Rpb24uZW5kLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHdheXBvaW50c1RvU2VhcmNoVGhyb3VnaC5wdXNoKGNvbm5lY3Rpb24uZW5kKTtcclxuICAgICAgICAgICAgcHJvY2Vzc2VkV2F5cG9pbnRzLnB1c2goY29ubmVjdGlvbi5lbmQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB1bnZpc2l0ZWROb2Rlcy5wdXNoKHsgd2F5cG9pbnQsIGRpc3RhbmNlOiB3YXlwb2ludCA9PT0gX3N0YXJ0ID8gMCA6IEluZmluaXR5LCBwcmV2aW91czogbnVsbCwgcHJldmlvdXNDb25uZWN0aW9uOiBudWxsIH0pO1xyXG4gICAgICB9IHdoaWxlICh3YXlwb2ludHNUb1NlYXJjaFRocm91Z2gubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAvLyBkbyB0aGUgZGlqa3N0cmFcclxuICAgICAgd2hpbGUgKHVudmlzaXRlZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1bnZpc2l0ZWROb2Rlcy5zb3J0KChfYTogUGF0aGluZ05vZGUsIF9iOiBQYXRoaW5nTm9kZSkgPT4gX2EuZGlzdGFuY2UgLSBfYi5kaXN0YW5jZSk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlOiBQYXRoaW5nTm9kZSA9IHVudmlzaXRlZE5vZGVzLnNoaWZ0KCk7XHJcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlLndheXBvaW50ID09PSBfZW5kKSByZXR1cm4gdGhpcy5wYXRoaW5nTm9kZVRvUGF0aChjdXJyZW50Tm9kZSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGNvbiBvZiBjdXJyZW50Tm9kZS53YXlwb2ludC5jb25uZWN0aW9ucykge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGlvblVzYWJsZShjb24pKSBjb250aW51ZTtcclxuICAgICAgICAgIGxldCBlbmROb2RlOiBQYXRoaW5nTm9kZSA9IHVudmlzaXRlZE5vZGVzLmZpbmQoX24gPT4gX24ud2F5cG9pbnQgPT09IGNvbi5lbmQpO1xyXG4gICAgICAgICAgaWYgKCFlbmROb2RlKSBjb250aW51ZTtcclxuICAgICAgICAgIGxldCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY3VycmVudE5vZGUuZGlzdGFuY2UgKyB0aGlzLmNhbGN1bGF0ZUNvbm5lY3Rpb25Db3N0KGNvbik7XHJcbiAgICAgICAgICBpZiAobmV3RGlzdGFuY2UgPj0gZW5kTm9kZS5kaXN0YW5jZSkgY29udGludWU7XHJcbiAgICAgICAgICBlbmROb2RlLmRpc3RhbmNlID0gbmV3RGlzdGFuY2U7XHJcbiAgICAgICAgICBlbmROb2RlLnByZXZpb3VzID0gY3VycmVudE5vZGU7XHJcbiAgICAgICAgICBlbmROb2RlLnByZXZpb3VzQ29ubmVjdGlvbiA9IGNvbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgYSBjb25uZWN0aW9uIGlzIHVzYWJsZSBieSB0aGlzIHNwZWNpZmljIHdhbGtlci5cclxuICAgICAqICoqQWx3YXlzIHJldHVybnMgdHJ1ZSwgdW5sZXNzIG92ZXJ3cml0dGVuIGluIGEgY3VzdG9tIFdhbGtlciBzdWJjbGFzcy4qKlxyXG4gICAgICogQ2FuIGJlIHVzZWQgdG8gaW5mbHVlbmNlIHRoZSBwYXRoZmluZGluZyBhbGdvcml0aG0gZm9yIGN1c3RvbSB3YXlwb2ludCAvIGNvbm5lY3Rpb24gc3lzdGVtcy5cclxuICAgICAqIEBwYXJhbSBfY29ubmVjdGlvbiBBIGNvbm5lY3Rpb24gdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgdXNhYmxlIGJ5IHRoaXMgd2Fsa2VyLCBmYWxzZSBpZiBub3RcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGlzQ29ubmVjdGlvblVzYWJsZShfY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIG5ldyBkaXN0YW5jZSBiYXNlZCBvbiBhIGNvbm5lY3Rpb24uXHJcbiAgICAgKiAqKkFsd2F5cyByZXR1cm5zIHRoZSBwbGFpbiBjb25uZWN0aW9ucyBjb3N0IHVubGVzcyBvdmVyd3JpdHRlbiBpbiBhIGN1c3RvbSB3YWxrZXIgc3ViY2xhc3MuKipcclxuICAgICAqIENhbiBiZSB1c2VkIHRvIGluZmx1ZW5jZSB0aGUgcGF0aGZpbmRpbmcgYWxnb3JpdGhtIGZvciBjdXN0b20gd2F5cG9pbnQgLyBjb25uZWN0aW9uIHN5c3RlbXMuXHJcbiAgICAgKiBAcGFyYW0gX2Nvbm5lY3Rpb24gQSBjb25uZWN0aW9uIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgYW1vdW50IG9mIGNvc3QgYSBjb25uZWN0aW9uIGVuY3VycyB0byB0aGUgY3VycmVudCB3YWxrZXIgb3IgMCBpZiBjb3N0IGlzIG5lZ2F0aXZlLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlQ29ubmVjdGlvbkNvc3QoX2Nvbm5lY3Rpb246IENvbm5lY3Rpb24pOiBudW1iZXIge1xyXG4gICAgICBpZiAoX2Nvbm5lY3Rpb24uY29zdCA+PSAwKVxyXG4gICAgICAgIHJldHVybiBfY29ubmVjdGlvbi5jb3N0O1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBhdGhpbmdOb2RlVG9QYXRoKF9ub2RlOiBQYXRoaW5nTm9kZSk6IFBhdGhpbmdOb2RlW10ge1xyXG4gICAgICBsZXQgcGF0aDogUGF0aGluZ05vZGVbXSA9IFtdO1xyXG4gICAgICBpZiAoIV9ub2RlKSByZXR1cm4gcGF0aDtcclxuICAgICAgZG8ge1xyXG4gICAgICAgIHBhdGgucHVzaChfbm9kZSk7XHJcbiAgICAgICAgX25vZGUgPSBfbm9kZS5wcmV2aW91cztcclxuICAgICAgfSB3aGlsZSAoX25vZGU/LnByZXZpb3VzKTtcclxuICAgICAgcmV0dXJuIHBhdGgucmV2ZXJzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcm90YXRlVG93YXJkcyhfd2F5cG9pbnQ6IFdheXBvaW50KTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHhMb29rOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuTE9PS19BVCh0aGlzLm5vZGUubXR4V29ybGQudHJhbnNsYXRpb24sIF93YXlwb2ludC5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgIHRoaXMubm9kZS5tdHhMb2NhbC5yb3RhdGlvbiA9IG10eExvb2sucm90YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgI2hhbmRsZUF0dGFjaCgpOiB2b2lkIHtcclxuICAgICAgTG9vcC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkxPT1BfRlJBTUUsIHRoaXMubW92aW5nLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgICNoYW5kbGVEZXRhY2goKTogdm9pZCB7XHJcbiAgICAgIExvb3AucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5MT09QX0ZSQU1FLCB0aGlzLm1vdmluZy5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBbiBpbnRlcm5hbCBpbnRlcmZhY2UgdG8gbWFuYWdlIHBhdGhpbmcgZGF0YSBpbnNpZGUgdGhlIFdhbGtlclxyXG4gICAqL1xyXG4gIGludGVyZmFjZSBQYXRoaW5nTm9kZSB7XHJcbiAgICB3YXlwb2ludDogV2F5cG9pbnQ7XHJcbiAgICBkaXN0YW5jZTogbnVtYmVyO1xyXG4gICAgcHJldmlvdXM6IFBhdGhpbmdOb2RlO1xyXG4gICAgcHJldmlvdXNDb25uZWN0aW9uOiBDb25uZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW4gaW50ZXJuYWwgaW50ZXJmYWNlIHRvIG1hbmFnZSB0aGUgZGF0YSBvZiB0aGUgY3VycmVudGx5IHdhbGtlZCBwYXRoXHJcbiAgICovXHJcbiAgaW50ZXJmYWNlIFdhbGtEYXRhIHtcclxuICAgIHBhdGg6IFBhdGhpbmdOb2RlW107XHJcbiAgICB0b3RhbFByb2dyZXNzOiBudW1iZXI7XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFVuaWZpZXMgV2F5cG9pbnRzIG9mIHRoZSBwYXRoaW5nIGFsZ29yaXRobXNcclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBXYXlwb2ludCB7XHJcbiAgICBjb25uZWN0aW9uczogQ29ubmVjdGlvbltdO1xyXG4gICAgbXR4TG9jYWw6IE1hdHJpeDR4NDtcclxuICAgIG10eFdvcmxkOiBNYXRyaXg0eDQ7XHJcbiAgICBpc0FjdGl2ZTogYm9vbGVhbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgYSBwb3NpdGlvbiB0aGF0IGEge0BsaW5rIENvbXBvbmVudFdhbGtlcn0gY2FuIHVzZSBhcyBhIHRhcmdldCBwb2ludC5cclxuICAgKiBJbXBsZW1lbnRzIHtAbGluayBXYXlwb2ludH0uXHJcbiAgICogUmVnaXN0ZXJzIGl0c2VsZiB0byBhIHN0YXRpYyBsaXN0IG9mIGFsbCBhdmFpbGFibGUgd2F5cG9pbnRzXHJcbiAgICogQGF1dGhvciBMdWthcyBTY2hldWVybGUsIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRXYXlwb2ludCBleHRlbmRzIENvbXBvbmVudCBpbXBsZW1lbnRzIFdheXBvaW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyh0aGlzKTtcclxuICAgIHN0YXRpYyByZWFkb25seSAjd2F5cG9pbnRzOiBDb21wb25lbnRXYXlwb2ludFtdID0gW107XHJcblxyXG4gICAgcHVibGljIG10eExvY2FsOiBNYXRyaXg0eDQ7XHJcblxyXG4gICAgI2Nvbm5lY3Rpb25zOiBDb25uZWN0aW9uW107XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9tdHhJbml0OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKSwgX2Nvbm5lY3Rpb25zOiBDb25uZWN0aW9uW10gPSBbXSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLiNjb25uZWN0aW9ucyA9IF9jb25uZWN0aW9ucztcclxuICAgICAgdGhpcy5tdHhMb2NhbCA9IF9tdHhJbml0O1xyXG4gICAgICB0aGlzLnNpbmdsZXRvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKFByb2plY3QubW9kZSA9PSBNT0RFLkVESVRPUilcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy4jaGFuZGxlQXR0YWNoLmJpbmQodGhpcykpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgdGhpcy4jaGFuZGxlRGV0YWNoLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBbGwgdGhlIHdheXBvaW50cyB0aGF0IGFyZSBjdXJyZW50bHkgbG9hZGVkIGluIHRoZSBzY2VuZS4gKipEbyBub3QgZWRpdCwgdHJlYXQgYXMgcmVhZG9ubHkhKiogKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHdheXBvaW50cygpOiBDb21wb25lbnRXYXlwb2ludFtdIHtcclxuICAgICAgcmV0dXJuIENvbXBvbmVudFdheXBvaW50LiN3YXlwb2ludHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNob3J0aGFuZCB0byBjcmVhdGUgYSBjb25uZWN0aW9uIGJldHdlZW4gdHdvIHtAbGluayBDb21wb25lbnRXYXlwb2ludH1zXHJcbiAgICAgKiBAcGFyYW0gX3N0YXJ0IFRoZSB7QGxpbmsgQ29tcG9uZW50V2F5cG9pbnR9IGZyb20gd2hpY2ggdG8gc3RhcnQgdGhlIGNvbm5lY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0gX2VuZCBUaGUge0BsaW5rIENvbXBvbmVudFdheXBvaW50fSB0byB3aGljaCB0aGUgY29ubmVjdGlvbiBsZWFkcy5cclxuICAgICAqIEBwYXJhbSBfY29zdCBUaGUgY29zdCBvZiB0aGUgY29ubmVjdGlvbi4gVGhlIGhpZ2hlciB0aGUgdmFsdWUsIHRoZSBsZXNzIGxpa2VseSBpdCBpcyB0byBiZSB0YWtlbi4gQ2Fubm90IGJlIG5lZ2F0aXZlLlxyXG4gICAgICogQHBhcmFtIF9zcGVlZE1vZGlmaWVyIEhvdyBmYXN0IHRoZSBjb25uZWN0aW9uIGNhbiBiZSB3YWxrZWQgb24uIERlZmF1bHRzIHRvIDFcclxuICAgICAqIEBwYXJhbSBfYm90aFdheXMgSWYgdHJ1ZSwgY3JlYXRlcyBhIGNvbm5lY3Rpb24gaW4gYm90aCBkaXJlY3Rpb25zLiBEZWZhdWx0OiBmYWxzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZENvbm5lY3Rpb24oX3N0YXJ0OiBDb21wb25lbnRXYXlwb2ludCwgX2VuZDogQ29tcG9uZW50V2F5cG9pbnQsIF9jb3N0OiBudW1iZXIsIF9zcGVlZE1vZGlmaWVyOiBudW1iZXIgPSAxLCBfYm90aFdheXM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICBfc3RhcnQuYWRkQ29ubmVjdGlvbih7IGNvc3Q6IF9jb3N0LCBlbmQ6IF9lbmQsIHN0YXJ0OiBfc3RhcnQsIHNwZWVkTW9kaWZpZXI6IF9zcGVlZE1vZGlmaWVyIH0pO1xyXG4gICAgICBpZiAoX2JvdGhXYXlzKVxyXG4gICAgICAgIF9lbmQuYWRkQ29ubmVjdGlvbih7IGNvc3Q6IF9jb3N0LCBlbmQ6IF9zdGFydCwgc3RhcnQ6IF9lbmQsIHNwZWVkTW9kaWZpZXI6IF9zcGVlZE1vZGlmaWVyIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25zKCk6IENvbm5lY3Rpb25bXSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGN1cnJlbnQgd29ybGQgcG9zaXRpb24gb2YgdGhlIFdheXBvaW50LiBSZXR1cm5zIGEgbmV3IE1hdHJpeCB3aXRob3V0IGNvbm5lY3Rpb24gdG8gdGhlIFdheXBvaW50ICovXHJcbiAgICBwdWJsaWMgZ2V0IG10eFdvcmxkKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHJldHVybiBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm10eExvY2FsLCB0aGlzLm5vZGUubXR4V29ybGQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBZGRzIGEgbmV3IHtAbGluayBDb25uZWN0aW9ufSB0byB0aGlzIHdheXBvaW50ICovXHJcbiAgICBwdWJsaWMgYWRkQ29ubmVjdGlvbihfY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xyXG4gICAgICB0aGlzLiNjb25uZWN0aW9ucy5wdXNoKF9jb25uZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmVtb3ZlcyBhIHtAbGluayBDb25uZWN0aW9ufSBmcm9tIHRoaXMgd2F5cG9pbnQgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDb25uZWN0aW9uKF9jb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gdGhpcy4jY29ubmVjdGlvbnMuaW5kZXhPZihfY29ubmVjdGlvbik7XHJcbiAgICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcclxuICAgICAgdGhpcy4jY29ubmVjdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIG1hdHJpeDogdGhpcy5tdHhMb2NhbC5zZXJpYWxpemUoKSxcclxuICAgICAgICBjb25uZWN0aW9uczogdGhpcy4jY29ubmVjdGlvbnMubWFwKF9jb24gPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbm5lY3Rpb246IFNlcmlhbGl6ZWRDb25uZWN0aW9uID0geyBjb3N0OiBfY29uLmNvc3QsIGVuZDogX2Nvbi5lbmQsIHNwZWVkTW9kaWZpZXI6IF9jb24uc3BlZWRNb2RpZmllciB9O1xyXG4gICAgICAgICAgaWYgKGNvbm5lY3Rpb24uZW5kIGluc3RhbmNlb2YgQ29tcG9uZW50V2F5cG9pbnQpIHtcclxuICAgICAgICAgICAgY29ubmVjdGlvbi5lbmQgPSBOb2RlLlBBVEhfRlJPTV9UTyh0aGlzLCBjb25uZWN0aW9uLmVuZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcclxuICAgICAgICB9KVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm10eExvY2FsLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLm1hdHJpeCk7XHJcbiAgICAgIGNvbnN0IGhuZE5vZGVEZXNlcmlhbGl6ZWQ6IEV2ZW50TGlzdGVuZXJVbmlmaWVkID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb25zID0gX3NlcmlhbGl6YXRpb24uY29ubmVjdGlvbnMubWFwKChfY29uOiBTZXJpYWxpemVkQ29ubmVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbm5lY3Rpb246IENvbm5lY3Rpb24gPSB7IGNvc3Q6IF9jb24uY29zdCwgZW5kOiB0aGlzLnNlcmlhbGl6ZWRXYXlwb2ludFRvV2F5cG9pbnQoX2Nvbi5lbmQpLCBzcGVlZE1vZGlmaWVyOiBfY29uLnNwZWVkTW9kaWZpZXIsIHN0YXJ0OiB0aGlzIH07XHJcbiAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIGhuZE5vZGVEZXNlcmlhbGl6ZWQpO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIGhuZE5vZGVEZXNlcmlhbGl6ZWQpO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zKCk6IHZvaWQge1xyXG4gICAgICBsZXQgc2NhbGVWZWN0b3I6IFZlY3RvcjMgPSBWZWN0b3IzLlNDQUxFKFZlY3RvcjMuT05FKCksIDAuMSk7XHJcbiAgICAgIGxldCBtdHg6IE1hdHJpeDR4NCA9IHRoaXMubXR4V29ybGQ7XHJcbiAgICAgIEdpem1vcy5kcmF3U3BoZXJlKE1hdHJpeDR4NC5DT01QT1NJVElPTihtdHgudHJhbnNsYXRpb24sIFZlY3RvcjMuWkVSTygpLCBzY2FsZVZlY3RvciksIENvbG9yLkNTUyhcIm9yYW5nZVwiKSk7XHJcbiAgICAgIC8vIHJldHVybjtcclxuICAgICAgbGV0IGxpbmVzOiBWZWN0b3IzW10gPSBbXTtcclxuICAgICAgZm9yIChsZXQgY29ubmVjdGlvbiBvZiB0aGlzLmNvbm5lY3Rpb25zKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIHN0YXJ0IGFuZCBlbmQgcG9pbnQgYXJlIG9uIHRoZSBzYW1lIHBvaW50LCBkb24ndCBkcmF3IGxpbmUuXHJcbiAgICAgICAgbGV0IHRtcE10eDogTWF0cml4NHg0ID0gY29ubmVjdGlvbi5lbmQubXR4V29ybGQuY2xvbmU7XHJcbiAgICAgICAgbGV0IGRpcmVjdGlvblZlY3RvcjogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShtdHgudHJhbnNsYXRpb24sIHRtcE10eC50cmFuc2xhdGlvbik7XHJcbiAgICAgICAgaWYgKGRpcmVjdGlvblZlY3Rvci5tYWduaXR1ZGVTcXVhcmVkID09PSAwKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgLy8gaWYgb25lIG9mIHRoZSB3YXlwb2ludHMgaXMgaW5hY3RpdmUsIGRvbid0IGRyYXcgZ2l6bW9zXHJcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmVuZC5pc0FjdGl2ZSB8fCAhY29ubmVjdGlvbi5zdGFydC5pc0FjdGl2ZSkgY29udGludWU7XHJcblxyXG4gICAgICAgIC8vIGFjdHVhbCBsaW5lXHJcbiAgICAgICAgbGluZXMucHVzaChtdHgudHJhbnNsYXRpb24pO1xyXG4gICAgICAgIGxpbmVzLnB1c2godG1wTXR4LnRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgICAgLy8gYXJyb3cgaGVhZHNcclxuICAgICAgICBsZXQgZGlyZWN0aW9uTXR4OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuTE9PS19JTih0bXBNdHgudHJhbnNsYXRpb24sIGRpcmVjdGlvblZlY3Rvcik7XHJcbiAgICAgICAgZGlyZWN0aW9uTXR4LnNjYWxlKHNjYWxlVmVjdG9yKTtcclxuICAgICAgICBHaXptb3MuZHJhd1dpcmVDb25lKGRpcmVjdGlvbk10eCwgQ29sb3IuQ1NTKFwib3JhbmdlXCIpKTtcclxuICAgICAgfVxyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKGxpbmVzLCBNYXRyaXg0eDQuSURFTlRJVFkoKSwgQ29sb3IuQ1NTKFwib3JhbmdlXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQW4gaW50ZXJuYWwgZnVuY3Rpb24gdG8gaGVscCB0aGUgZGVzZXJpYWxpemF6dGlvbiBwcm9jZXNzLiAqL1xyXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVkV2F5cG9pbnRUb1dheXBvaW50KF9wb2ludDogc3RyaW5nIHwgV2F5cG9pbnQpOiBXYXlwb2ludCB7XHJcbiAgICAgIGlmICh0eXBlb2YgX3BvaW50ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gX3BvaW50O1xyXG4gICAgICByZXR1cm4gTm9kZS5GSU5EKHRoaXMsIF9wb2ludCkgYXMgQ29tcG9uZW50V2F5cG9pbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgI2hhbmRsZUF0dGFjaCgpOiB2b2lkIHtcclxuICAgICAgQ29tcG9uZW50V2F5cG9pbnQuI3dheXBvaW50cy5wdXNoKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgICNoYW5kbGVEZXRhY2goKTogdm9pZCB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gQ29tcG9uZW50V2F5cG9pbnQuI3dheXBvaW50cy5pbmRleE9mKHRoaXMpO1xyXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgIENvbXBvbmVudFdheXBvaW50LiN3YXlwb2ludHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIERlZmluZXMgYSBDb25uZWN0aW9uIGluIHRoZSB3YXkgaXQncyBzZXJpYWxpemVkIGluIHJlc291cmNlcyBAaW50ZXJuYWwgKi9cclxuICBpbnRlcmZhY2UgU2VyaWFsaXplZENvbm5lY3Rpb24ge1xyXG4gICAgZW5kOiBXYXlwb2ludCB8IHN0cmluZztcclxuICAgIGNvc3Q6IG51bWJlcjtcclxuICAgIHNwZWVkTW9kaWZpZXI6IG51bWJlcjtcclxuICB9XHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBkaXJlY3RlZCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIHdheXBvaW50c1xyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb24ge1xyXG4gICAgLyoqIFRoZSBzdGFydCAvIG9yaWdpbiB3YXlwb2ludCBvZiB0aGlzIGNvbm5lY3Rpb24uICovXHJcbiAgICBzdGFydDogV2F5cG9pbnQ7XHJcbiAgICAvKiogVGhlIGVuZCAvIHRhcmdldCB3YXlwb2ludCBvZiB0aGlzIGNvbm5lY3Rpb24uICovXHJcbiAgICBlbmQ6IFdheXBvaW50O1xyXG4gICAgLyoqIFRoZSBjb3N0IG9mIHRoZSBjb25uZWN0aW9uLCB0aGUgaGlnaGVyIHRoZSBsZXNzIGxpa2VseSB0byBiZSB0YWtlbi4gQ2Fubm90IGJlIG5lZ2F0aXZlLiAqL1xyXG4gICAgY29zdDogbnVtYmVyO1xyXG4gICAgLyoqIE1vZGlmaWVzIHRoZSBzcGVlZCB0aGF0IGEgd2Fsa2VyIGNhbiB3YWxrIHBhc3QgdGhpcyBjb25uZWN0aW9uIGJ5IG11bHRpcGx5aW5nIHRoZSBzcGVlZCB3aXRoIHRoaXMgdmFsdWUuIE5lZWRzIHRvIGJlID4wICovXHJcbiAgICBzcGVlZE1vZGlmaWVyOiBudW1iZXI7XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgYXV0b21hdGljIGFkanVzdG1lbnQgb2YgdGhlIGNvbGxpZGVyXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gQk9EWV9JTklUIHtcclxuICAgIC8qKiBDb2xsaWRlciB1c2VzIHRoZSBwaXZvdCBvZiB0aGUgbWVzaCBmb3IgaW5pdGlsaWFsaXphdGlvbiAqL1xyXG4gICAgVE9fTUVTSCxcclxuICAgIC8qKiBDb2xsaWRlciB1c2VzIHRoZSB0cmFuc2Zvcm0gb2YgdGhlIG5vZGUgZm9yIGluaXRpbGlhbGl6YXRpb24gKi9cclxuICAgIFRPX05PREUsXHJcbiAgICAvKiogQ29sbGlkZXIgdXNlcyBpdHMgb3duIHBpdm90IGZvciBpbml0aWxpYWxpemF0aW9uICovXHJcbiAgICBUT19QSVZPVFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWN0cyBhcyB0aGUgcGh5c2ljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBOb2RlfSBpdCdzIGF0dGFjaGVkIHRvLlxyXG4gICAqIEl0J3MgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgRlVER0UgcmVuZGVyZWQgd29ybGQgYW5kIHRoZSBQaHlzaWNzIHdvcmxkLlxyXG4gICAqIEZvciB0aGUgcGh5c2ljcyB0byBjb3JyZWN0bHkgZ2V0IHRoZSB0cmFuc2Zvcm1hdGlvbnMgcm90YXRpb25zIG5lZWQgdG8gYmUgYXBwbGllZCB3aXRoIGZyb20gbGVmdCA9IHRydWUuXHJcbiAgICogT3Igcm90YXRpb25zIG5lZWQgdG8gaGFwcGVuIGJlZm9yZSBzY2FsaW5nLlxyXG4gICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50UmlnaWRib2R5IGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRSaWdpZGJvZHkpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWFwQm9keVR5cGU6IHsgW3R5cGU6IG51bWJlcl06IG51bWJlciB9ID0gKHR5cGVvZiBPSU1PID09IFwidW5kZWZpbmVkXCIpID9cclxuICAgICAge1xyXG4gICAgICAgIFtCT0RZX1RZUEUuRFlOQU1JQ106IEJPRFlfVFlQRS5EWU5BTUlDLCBbQk9EWV9UWVBFLlNUQVRJQ106IEJPRFlfVFlQRS5TVEFUSUMsIFtCT0RZX1RZUEUuS0lORU1BVElDXTogQk9EWV9UWVBFLktJTkVNQVRJQ1xyXG4gICAgICB9IDoge1xyXG4gICAgICAgIFtCT0RZX1RZUEUuRFlOQU1JQ106IE9JTU8uUmlnaWRCb2R5VHlwZS5EWU5BTUlDLCBbQk9EWV9UWVBFLlNUQVRJQ106IE9JTU8uUmlnaWRCb2R5VHlwZS5TVEFUSUMsIFtCT0RZX1RZUEUuS0lORU1BVElDXTogT0lNTy5SaWdpZEJvZHlUeXBlLktJTkVNQVRJQ1xyXG4gICAgICB9O1xyXG5cclxuICAgIC8qKiBUcmFuc2Zvcm1hdGlvbiBvZiB0aGUgY29sbGlkZXIgcmVsYXRpdmUgdG8gdGhlIG5vZGUncyB0cmFuc2Zvcm0uIE9uY2Ugc2V0IG1vc3RseSByZW1haW5zIGNvbnN0YW50LiBcclxuICAgICAqIElmIGFsdGVyZWQsIHtAbGluayBpc0luaXRpYWxpemVkfSBtdXN0IGJlIHJlc2V0IHRvIGZhbHNlIHRvIHJlY3JlYXRlIHRoZSBjb2xsaWRlciBpbiB0aGUgbmV4dCB7QGxpbmsgUmVuZGVyLnByZXBhcmV9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogVmVydGljZXMgdGhhdCBidWlsZCBhIGNvbnZleCBtZXNoIChmb3JtIHRoYXQgaXMgaW4gaXRzZWxmIGNsb3NlZCkuIE5lZWRzIHRvIHNldCBpbiB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSByYiBpZiBub25lIG9mIHRoZSBzdGFuZGFyZCBjb2xsaWRlcnMgaXMgdXNlZC4gXHJcbiAgICAgKiBVbnRlc3RlZCBhbmQgbm90IHlldCBmdWxseSBzdXBwb3J0ZWQgYnkgc2VyaWFsaXphdGlvbiBhbmQgbXV0YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb252ZXhNZXNoOiBGbG9hdDMyQXJyYXkgPSBudWxsO1xyXG5cclxuICAgIC8qKiBDb2xsaXNpb25zIHdpdGggcmlnaWRib2RpZXMgaGFwcGVuaW5nIHRvIHRoaXMgYm9keSwgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBjdXN0b20gb25Db2xsaXNpb25TdGF5IGZ1bmN0aW9uYWxpdHkuICovXHJcbiAgICBwdWJsaWMgY29sbGlzaW9uczogQ29tcG9uZW50UmlnaWRib2R5W10gPSBuZXcgQXJyYXkoKTtcclxuICAgIC8qKiBUcmlnZ2VycyB0aGF0IGFyZSBjdXJyZW50bHkgdHJpZ2dlcmluZyB0aGlzIGJvZHkgKi9cclxuICAgIHB1YmxpYyB0cmlnZ2VyaW5nczogQ29tcG9uZW50UmlnaWRib2R5W10gPSBuZXcgQXJyYXkoKTtcclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBUaGUgZ3JvdXBzIHRoaXMgb2JqZWN0IGNvbGxpZGVzIHdpdGguIEdyb3VwcyBtdXN0IGJlIHdyaXRlbiBpbiBmb3JtIG9mXHJcbiAgICAgKiAgZS5nLiBjb2xsaXNpb25NYXNrID0ge0BsaW5rIENPTExJU0lPTl9HUk9VUC5ERUZBVUxUfSB8IHtAbGluayBDT0xMSVNJT05fR1JPVVB9Li4uLiBhbmQgc28gb24gdG8gY29sbGlkZSB3aXRoIG11bHRpcGxlIGdyb3Vwcy4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2xsaXNpb25NYXNrOiBudW1iZXI7XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQXV0b21hdGljIGFkanVzdG1lbnQgb2YgdGhlIHBpdm90IHdoZW4ge0BsaW5rIFJlbmRlci5wcmVwYXJlfSBpcyBjYWxsZWQgYWNjb3JkaW5nIHRvIHtAbGluayBCT0RZX0lOSVR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0aWFsaXphdGlvbjogQk9EWV9JTklUID0gQk9EWV9JTklULlRPX1BJVk9UO1xyXG4gICAgLyoqIE1hcmtzIGlmIGNvbGxpZGVyIHdhcyBpbml0aWFsaXplZC4gUmVzZXQgdG8gZmFsc2UgdG8gaW5pdGlhbGl6ZSBhZ2FpbiBlLmcuIGFmdGVyIG1hbmlwdWxhdGlvbiBvZiBtdHhQaXZvdCAqL1xyXG4gICAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSUQgdG8gcmVmZXJlbmNlIHRoaXMgc3BlY2lmaWMgQ29tcG9uZW50UmlnaWRib2R5ICovXHJcbiAgICAjaWQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy9Qcml2YXRlIGluZm9ybWF0aW9ucyAtIE1vc3RseSBPaW1vUGh5c2ljcyB2YXJpYWJsZXMgdGhhdCBzaG91bGQgbm90IGJlIGV4cG9zZWQgdG8gdGhlIEZVREdFIFVzZXIgYW5kIG1hbmlwdWxhdGVkIGJ5IHRoZW1cclxuICAgICNjb2xsaWRlcjogT0lNTy5TaGFwZTtcclxuICAgICNjb2xsaWRlckluZm86IE9JTU8uU2hhcGVDb25maWc7XHJcbiAgICAjY29sbGlzaW9uR3JvdXA6IENPTExJU0lPTl9HUk9VUCA9IENPTExJU0lPTl9HUk9VUC5ERUZBVUxUO1xyXG4gICAgI3R5cGVDb2xsaWRlcjogQ09MTElERVJfVFlQRSA9IENPTExJREVSX1RZUEUuQ1VCRTtcclxuXHJcbiAgICAjcmlnaWRib2R5OiBPSU1PLlJpZ2lkQm9keTtcclxuICAgICNyaWdpZGJvZHlJbmZvOiBPSU1PLlJpZ2lkQm9keUNvbmZpZyA9IG5ldyBPSU1PLlJpZ2lkQm9keUNvbmZpZygpO1xyXG4gICAgI3R5cGVCb2R5OiBCT0RZX1RZUEUgPSBCT0RZX1RZUEUuRFlOQU1JQztcclxuXHJcbiAgICAjbWFzc0RhdGE6IE9JTU8uTWFzc0RhdGEgPSBuZXcgT0lNTy5NYXNzRGF0YSgpO1xyXG4gICAgI3Jlc3RpdHV0aW9uOiBudW1iZXI7XHJcbiAgICAjZnJpY3Rpb246IG51bWJlcjtcclxuICAgICNkYW1waW5nTGluZWFyOiBudW1iZXIgPSAwLjE7XHJcbiAgICAjZGFtcGluZ0FuZ3VsYXI6IG51bWJlciA9IDAuMTtcclxuICAgICNlZmZlY3RSb3RhdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuT05FKCk7XHJcbiAgICAjZWZmZWN0R3Jhdml0eTogbnVtYmVyID0gMTtcclxuICAgICNpc1RyaWdnZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICNtdHhQaXZvdFVuc2NhbGVkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgICNtdHhQaXZvdEludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG5cclxuICAgICNjYWxsYmFja3M6IE9JTU8uQ29udGFjdENhbGxiYWNrOyAvL0NhbGxiYWNrIE1ldGhvZHMgd2hlbiB3aXRoaW4gdGhlIG9pbW9TeXN0ZW0gYSBldmVudCBpcyBoYXBwZW5pbmdcclxuXHJcbiAgICAvLyAjcGh5c2ljczogUGh5c2ljczsgLy9UT0RPOiBrZWVwIGEgcG9pbnRlciB0byB0aGUgcGh5c2ljcyBpbnN0YW5jZSB1c2VkIGJ5IHRoaXMgY29tcG9uZW50XHJcblxyXG4gICAgLyoqIENyZWF0aW5nIGEgbmV3IHJpZ2lkYm9keSB3aXRoIGEgd2VpZ2h0IGluIGtnLCBhIHBoeXNpY3MgdHlwZSAoZGVmYXVsdCA9IGR5bmFtaWMpLCBhIGNvbGxpZGVyIHR5cGUgd2hhdCBwaHlzaWNhbCBmb3JtIGhhcyB0aGUgY29sbGlkZXIsIHRvIHdoYXQgZ3JvdXAgZG9lcyBpdCBiZWxvbmcsIGlzIHRoZXJlIGEgdHJhbnNmb3JtIE1hdHJpeCB0aGF0IHNob3VsZCBiZSB1c2VkLCBhbmQgaXMgdGhlIGNvbGxpZGVyIGRlZmluZWQgYXMgYSBncm91cCBvZiBwb2ludHMgdGhhdCByZXByZXNlbnQgYSBjb252ZXggbWVzaC4gKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbWFzczogbnVtYmVyID0gMSwgX3R5cGU6IEJPRFlfVFlQRSA9IEJPRFlfVFlQRS5EWU5BTUlDLCBfY29sbGlkZXJUeXBlOiBDT0xMSURFUl9UWVBFID0gQ09MTElERVJfVFlQRS5DVUJFLCBfZ3JvdXA6IENPTExJU0lPTl9HUk9VUCA9IFBoeXNpY3Muc2V0dGluZ3MuZGVmYXVsdENvbGxpc2lvbkdyb3VwLCBfbXR4VHJhbnNmb3JtOiBNYXRyaXg0eDQgPSBudWxsLCBfY29udmV4TWVzaDogRmxvYXQzMkFycmF5ID0gbnVsbCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmNyZWF0ZShfbWFzcywgX3R5cGUsIF9jb2xsaWRlclR5cGUsIF9ncm91cCwgX210eFRyYW5zZm9ybSwgX2NvbnZleE1lc2gpO1xyXG5cclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9BREQsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgdGhpcy5obmRFdmVudCk7XHJcbiAgICAgIC8vIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0RFU0VSSUFMSVpFRCwgdGhpcy5obmRFdmVudCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gQWNjZXNzb3JzXHJcbiAgICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNpZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVXNlZCBmb3IgY2FsY3VsYXRpb24gb2YgdGhlIGdlb21ldHJpY2FsIHJlbGF0aW9uc2hpcCBvZiBub2RlIGFuZCBjb2xsaWRlciBieSB7QGxpbmsgUmVuZGVyfSovXHJcbiAgICBwdWJsaWMgZ2V0IG10eFBpdm90SW52ZXJzZSgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4UGl2b3RJbnZlcnNlO1xyXG4gICAgfVxyXG4gICAgLyoqIFVzZWQgZm9yIGNhbGN1bGF0aW9uIG9mIHRoZSBnZW9tZXRyaWNhbCByZWxhdGlvbnNoaXAgb2Ygbm9kZSBhbmQgY29sbGlkZXIgYnkge0BsaW5rIFJlbmRlcn0qL1xyXG4gICAgcHVibGljIGdldCBtdHhQaXZvdFVuc2NhbGVkKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtdHhQaXZvdFVuc2NhbGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXRyaWV2ZSB0aGUgYm9keSB0eXBlLiBTZWUge0BsaW5rIEJPRFlfVFlQRX0gKi9cclxuICAgIHB1YmxpYyBnZXQgdHlwZUJvZHkoKTogQk9EWV9UWVBFIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3R5cGVCb2R5O1xyXG4gICAgfVxyXG4gICAgLyoqIFNldCB0aGUgYm9keSB0eXBlLiBTZWUge0BsaW5rIEJPRFlfVFlQRX0gKi9cclxuICAgIHB1YmxpYyBzZXQgdHlwZUJvZHkoX3ZhbHVlOiBCT0RZX1RZUEUpIHtcclxuICAgICAgdGhpcy4jdHlwZUJvZHkgPSBfdmFsdWU7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRUeXBlKENvbXBvbmVudFJpZ2lkYm9keS5tYXBCb2R5VHlwZVt0aGlzLiN0eXBlQm9keV0pO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TWFzc0RhdGEodGhpcy4jbWFzc0RhdGEpOyAvL2hhdmUgdG8gcmVzZXQgbWFzcyBhZnRlciBjaGFuZ2luZyB0aGUgdHlwZSwgc2luY2UgT2ltbyBpcyBoYW5kbGluZyBtYXNzIGludGVybmFsbHkgd3Jvbmcgd2hlbiBzd2l0Y2hpbmcgdHlwZXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIHNoYXBlIHRoYXQgcmVwcmVzZW50cyB0aGUge0BsaW5rIE5vZGV9IGluIHRoZSBwaHlzaWNhbCB3b3JsZC4gRGVmYXVsdCBpcyBhIEN1YmUuICovXHJcbiAgICBwdWJsaWMgZ2V0IHR5cGVDb2xsaWRlcigpOiBDT0xMSURFUl9UWVBFIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3R5cGVDb2xsaWRlcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdHlwZUNvbGxpZGVyKF92YWx1ZTogQ09MTElERVJfVFlQRSkge1xyXG4gICAgICBpZiAoX3ZhbHVlICE9IHRoaXMuI3R5cGVDb2xsaWRlciAmJiB0aGlzLiNyaWdpZGJvZHkgIT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuI3R5cGVDb2xsaWRlciA9IF92YWx1ZTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgY29sbGlzaW9uIGdyb3VwIHRoaXMge0BsaW5rIE5vZGV9IGJlbG9uZ3MgdG8gaXQncyB0aGUgZGVmYXVsdCBncm91cCBub3JtYWxseSB3aGljaCBtZWFucyBpdCBwaHlzaWNhbGx5IGNvbGxpZGVzIHdpdGggZXZlcnkgZ3JvdXAgYmVzaWRlcyB0cmlnZ2VyLiAqL1xyXG4gICAgcHVibGljIGdldCBjb2xsaXNpb25Hcm91cCgpOiBDT0xMSVNJT05fR1JPVVAge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY29sbGlzaW9uR3JvdXA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGNvbGxpc2lvbkdyb3VwKF92YWx1ZTogQ09MTElTSU9OX0dST1VQKSB7XHJcbiAgICAgIHRoaXMuI2NvbGxpc2lvbkdyb3VwID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy4jcmlnaWRib2R5ICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpLnNldENvbGxpc2lvbkdyb3VwKHRoaXMuI2NvbGxpc2lvbkdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogTWFya2luZyB0aGUgQm9keSBhcyBhIHRyaWdnZXIgdGhlcmVmb3JlIG5vdCBpbmZsdWVuY2luZyB0aGUgY29sbGlzaW9uIHN5c3RlbSBidXQgb25seSBzZW5kaW5nIHRyaWdnZXJFdmVudHMgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNUcmlnZ2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaXNUcmlnZ2VyO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBpc1RyaWdnZXIoX3ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgIHRoaXMuI2lzVHJpZ2dlciA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuZ2V0T2ltb1JpZ2lkYm9keSgpICE9IG51bGwpIHtcclxuICAgICAgICB0aGlzLmdldE9pbW9SaWdpZGJvZHkoKS5faXNUcmlnZ2VyID0gdGhpcy4jaXNUcmlnZ2VyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwaHlzaWNhbCB3ZWlnaHQgb2YgdGhlIHtAbGluayBOb2RlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1hc3MoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JpZ2lkYm9keS5nZXRNYXNzKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNldHRpbmcgdGhlIHBoeXNpY2FsIHdlaWdodCBvZiB0aGUge0BsaW5rIE5vZGV9IGluIGtnXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgbWFzcyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtYXNzRGF0YS5tYXNzID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5ub2RlICE9IG51bGwpXHJcbiAgICAgICAgaWYgKHRoaXMuI3JpZ2lkYm9keSAhPSBudWxsKVxyXG4gICAgICAgICAgdGhpcy4jcmlnaWRib2R5LnNldE1hc3NEYXRhKHRoaXMuI21hc3NEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRHJhZyBvZiBsaW5lYXIgbW92ZW1lbnQuIEEgQm9keSBkb2VzIHNsb3cgZG93biBldmVuIG9uIGEgc3VyZmFjZSB3aXRob3V0IGZyaWN0aW9uLiAqL1xyXG4gICAgcHVibGljIGdldCBkYW1wVHJhbnNsYXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JpZ2lkYm9keS5nZXRMaW5lYXJEYW1waW5nKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGRhbXBUcmFuc2xhdGlvbihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNkYW1waW5nTGluZWFyID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TGluZWFyRGFtcGluZyhfdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBEcmFnIG9mIHJvdGF0aW9uLiAqL1xyXG4gICAgcHVibGljIGdldCBkYW1wUm90YXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JpZ2lkYm9keS5nZXRBbmd1bGFyRGFtcGluZygpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkYW1wUm90YXRpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jZGFtcGluZ0FuZ3VsYXIgPSBfdmFsdWU7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRBbmd1bGFyRGFtcGluZyhfdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgZmFjdG9yIHRoaXMgcmlnaWRib2R5IHJlYWN0cyByb3RhdGlvbnMgdGhhdCBoYXBwZW4gaW4gdGhlIHBoeXNpY2FsIHdvcmxkLiAwIHRvIGxvY2sgcm90YXRpb24gdGhpcyBheGlzLiAqL1xyXG4gICAgcHVibGljIGdldCBlZmZlY3RSb3RhdGlvbigpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2VmZmVjdFJvdGF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBlZmZlY3RSb3RhdGlvbihfZWZmZWN0OiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMuI2VmZmVjdFJvdGF0aW9uID0gX2VmZmVjdDtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldFJvdGF0aW9uRmFjdG9yKG5ldyBPSU1PLlZlYzModGhpcy4jZWZmZWN0Um90YXRpb24ueCwgdGhpcy4jZWZmZWN0Um90YXRpb24ueSwgdGhpcy4jZWZmZWN0Um90YXRpb24ueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgZmFjdG9yIHRoaXMgcmlnaWRib2R5IHJlYWN0cyB0byB3b3JsZCBncmF2aXR5LiBEZWZhdWx0ID0gMSBlLmcuIDEqOS44MSBtL3MuICovXHJcbiAgICBwdWJsaWMgZ2V0IGVmZmVjdEdyYXZpdHkoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2VmZmVjdEdyYXZpdHk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGVmZmVjdEdyYXZpdHkoX2VmZmVjdDogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI2VmZmVjdEdyYXZpdHkgPSBfZWZmZWN0O1xyXG4gICAgICBpZiAodGhpcy4jcmlnaWRib2R5ICE9IG51bGwpIHRoaXMuI3JpZ2lkYm9keS5zZXRHcmF2aXR5U2NhbGUodGhpcy4jZWZmZWN0R3Jhdml0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGZyaWN0aW9uIG9mIHRoZSByaWdpZGJvZHksIHdoaWNoIGlzIHRoZSBmYWN0b3Igb2Ygc2xpZGluZyByZXNpc3RhbmNlIG9mIHRoaXMgcmlnaWRib2R5IG9uIHN1cmZhY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZnJpY3Rpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2ZyaWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBmcmljdGlvbiBvZiB0aGUgcmlnaWRib2R5LCB3aGljaCBpcyB0aGUgZmFjdG9yIG9mICBzbGlkaW5nIHJlc2lzdGFuY2Ugb2YgdGhpcyByaWdpZGJvZHkgb24gc3VyZmFjZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBmcmljdGlvbihfZnJpY3Rpb246IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNmcmljdGlvbiA9IF9mcmljdGlvbjtcclxuICAgICAgaWYgKHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKSAhPSBudWxsKVxyXG4gICAgICAgIHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKS5zZXRGcmljdGlvbih0aGlzLiNmcmljdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHJlc3RpdHV0aW9uIG9mIHRoZSByaWdpZGJvZHksIHdoaWNoIGlzIHRoZSBmYWN0b3Igb2YgYm91bmNpbmVzcyBvZiB0aGlzIHJpZ2lkYm9keSBvbiBzdXJmYWNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJlc3RpdHV0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyZXN0aXR1dGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgcmVzdGl0dXRpb24gb2YgdGhlIHJpZ2lkYm9keSwgd2hpY2ggaXMgdGhlIGZhY3RvciBvZiBib3VuY2luZXNzIG9mIHRoaXMgcmlnaWRib2R5IG9uIHN1cmZhY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgcmVzdGl0dXRpb24oX3Jlc3RpdHV0aW9uOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcmVzdGl0dXRpb24gPSBfcmVzdGl0dXRpb247XHJcbiAgICAgIGlmICh0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkgIT0gbnVsbClcclxuICAgICAgICB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuc2V0UmVzdGl0dXRpb24odGhpcy4jcmVzdGl0dXRpb24pO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmb3JtYXRpb25cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmlnaWRib2R5IGluIHRoZSBmb3JtIHRoZSBwaHlzaWNzIGVuZ2luZSBpcyB1c2luZyBpdCwgc2hvdWxkIG5vdCBiZSB1c2VkIHVubGVzcyBhIGZ1bmN0aW9uYWxpdHlcclxuICAgICAqIGlzIG5vdCBwcm92aWRlZCB0aHJvdWdoIHRoZSBGVURHRSBJbnRlZ3JhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE9pbW9SaWdpZGJvZHkoKTogT0lNTy5SaWdpZEJvZHkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jcmlnaWRib2R5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSb3RhdGluZyB0aGUgcmlnaWRib2R5IHRoZXJlZm9yZSBjaGFuZ2luZyBpdCdzIHJvdGF0aW9uIG92ZXIgdGltZSBkaXJlY3RseSBpbiBwaHlzaWNzLiBUaGlzIHdheSBwaHlzaWNzIGlzIGNoYW5naW5nIGluc3RlYWQgb2YgdHJhbnNmb3JtLiBcclxuICAgICAqICBCdXQgeW91IGFyZSBhYmxlIHRvIGluY3JlbWVudGFsIGNoYW5naW5nIGl0IGluc3RlYWQgb2YgYSBkaXJlY3Qgcm90YXRpb24uICBBbHRob3VnaCBpdCdzIGFsd2F5cyBwcmVmZXJlZCB0byB1c2UgZm9yY2VzIGluIHBoeXNpY3MuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3RhdGVCb2R5KF9yb3RhdGlvbkNoYW5nZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkucm90YXRlWHl6KG5ldyBPSU1PLlZlYzMoX3JvdGF0aW9uQ2hhbmdlLnggKiBDYWxjLmRlZzJyYWQsIF9yb3RhdGlvbkNoYW5nZS55ICogQ2FsYy5kZWcycmFkLCBfcm90YXRpb25DaGFuZ2UueiAqIENhbGMuZGVnMnJhZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUcmFuc2xhdGluZyB0aGUgcmlnaWRib2R5IHRoZXJlZm9yZSBjaGFuZ2luZyBpdCdzIHBsYWNlIG92ZXIgdGltZSBkaXJlY3RseSBpbiBwaHlzaWNzLiBUaGlzIHdheSBwaHlzaWNzIGlzIGNoYW5naW5nIGluc3RlYWQgb2YgdHJhbnNmb3JtLiBcclxuICAgICAqICBCdXQgeW91IGFyZSBhYmxlIHRvIGluY3JlbWVudGFsbHkgY2hhbmdpbmcgaXQgaW5zdGVhZCBvZiBhIGRpcmVjdCBwb3NpdGlvbi4gQWx0aG91Z2ggaXQncyBhbHdheXMgcHJlZmVyZWQgdG8gdXNlIGZvcmNlcyBpbiBwaHlzaWNzLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZUJvZHkoX3RyYW5zbGF0aW9uQ2hhbmdlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS50cmFuc2xhdGUobmV3IE9JTU8uVmVjMyhfdHJhbnNsYXRpb25DaGFuZ2UueCwgX3RyYW5zbGF0aW9uQ2hhbmdlLnksIF90cmFuc2xhdGlvbkNoYW5nZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgUE9TSVRJT04gb2YgdGhlIHtAbGluayBOb2RlfSBpbiB0aGUgcGh5c2ljYWwgc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFBvc2l0aW9uKCk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdG1wUG9zOiBPSU1PLlZlYzMgPSB0aGlzLiNyaWdpZGJvZHkuZ2V0UG9zaXRpb24oKTtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRtcFBvcy54LCB0bXBQb3MueSwgdG1wUG9zLnopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBQT1NJVElPTiBvZiB0aGUge0BsaW5rIE5vZGV9IGluIHRoZSBwaHlzaWNhbCBzcGFjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0UG9zaXRpb24oX3ZhbHVlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRQb3NpdGlvbihuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgY3VycmVudCBST1RBVElPTiBvZiB0aGUge0BsaW5rIE5vZGV9IGluIHRoZSBwaHlzaWNhbCBzcGFjZS4gTm90ZSB0aGlzIHJhbmdlIGZyb20gLXBpIHRvIHBpLCBzbyAtOTAgdG8gOTAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSb3RhdGlvbigpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uOiBPSU1PLlF1YXQgPSB0aGlzLiNyaWdpZGJvZHkuZ2V0T3JpZW50YXRpb24oKTtcclxuICAgICAgbGV0IHRtcFF1YXQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgIHRtcFF1YXQuc2V0KG9yaWVudGF0aW9uLngsIG9yaWVudGF0aW9uLnksIG9yaWVudGF0aW9uLnosIG9yaWVudGF0aW9uLncpO1xyXG4gICAgICBsZXQgZXVsZXJBbmdsZXM6IFZlY3RvcjMgPSB0bXBRdWF0LmV1bGVyQW5nbGVzLmNsb25lO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh0bXBRdWF0KTtcclxuICAgICAgcmV0dXJuIGV1bGVyQW5nbGVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBST1RBVElPTiBvZiB0aGUge0BsaW5rIE5vZGV9IGluIHRoZSBwaHlzaWNhbCBzcGFjZSwgaW4gZGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Um90YXRpb24oX3ZhbHVlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIGxldCBxdWF0OiBPSU1PLlF1YXQgPSBuZXcgT0lNTy5RdWF0KCk7XHJcbiAgICAgIGxldCBtdHhSb3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICBtdHhSb3Qucm90YXRlKG5ldyBWZWN0b3IzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopKTtcclxuICAgICAgbGV0IGFycmF5OiBGbG9hdDMyQXJyYXkgPSBtdHhSb3QuZ2V0KCk7XHJcbiAgICAgIGxldCByb3Q6IE9JTU8uTWF0MyA9IG5ldyBPSU1PLk1hdDMoYXJyYXlbMF0sIGFycmF5WzRdLCBhcnJheVs4XSwgYXJyYXlbMV0sIGFycmF5WzVdLCBhcnJheVs5XSwgYXJyYXlbMl0sIGFycmF5WzZdLCBhcnJheVsxMF0pO1xyXG4gICAgICBxdWF0LmZyb21NYXQzKHJvdCk7XHJcbiAgICAgIC8vIHF1YXQubm9ybWFsaXplKCk7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRPcmllbnRhdGlvbihxdWF0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSBjdXJyZW50IFNDQUxJTkcgaW4gdGhlIHBoeXNpY2FsIHNwYWNlLiAqL1xyXG4gICAgcHVibGljIGdldFNjYWxpbmcoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5ub2RlLm10eFdvcmxkLnNjYWxpbmcuY2xvbmU7XHJcbiAgICAgIHNjYWxpbmcueCAqPSB0aGlzLm10eFBpdm90LnNjYWxpbmcueDtcclxuICAgICAgc2NhbGluZy55ICo9IHRoaXMubXR4UGl2b3Quc2NhbGluZy55O1xyXG4gICAgICBzY2FsaW5nLnogKj0gdGhpcy5tdHhQaXZvdC5zY2FsaW5nLno7XHJcbiAgICAgIHJldHVybiBzY2FsaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTY2FsaW5nIHJlcXVpcmVzIHRoZSBjb2xsaWRlciB0byBiZSBjb21wbGV0ZWx5IHJlY3JlYXRlZCBhbmV3ICovXHJcbiAgICBwdWJsaWMgc2V0U2NhbGluZyhfdmFsdWU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgLy8gbGV0IHNjYWxpbmc6IFZlY3RvcjMgPSBfdmFsdWUuY2xvbmU7ICAgXHJcbiAgICAgIHRoaXMuY3JlYXRlQ29sbGlkZXIobmV3IE9JTU8uVmVjMyhfdmFsdWUueCAvIDIsIF92YWx1ZS55IC8gMiwgX3ZhbHVlLnogLyAyKSwgdGhpcy4jdHlwZUNvbGxpZGVyKTsgLy9yZWNyZWF0ZSB0aGUgY29sbGlkZXJcclxuICAgICAgdGhpcy4jY29sbGlkZXIgPSBuZXcgT0lNTy5TaGFwZSh0aGlzLiNjb2xsaWRlckluZm8pO1xyXG4gICAgICBsZXQgb2xkQ29sbGlkZXI6IE9JTU8uU2hhcGUgPSB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCk7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5hZGRTaGFwZSh0aGlzLiNjb2xsaWRlcik7IC8vYWRkIG5ldyBjb2xsaWRlciwgYmVmb3JlIHJlbW92aW5nIHRoZSBvbGQsIHNvIHRoZSByYiBpcyBuZXZlciBhY3RpdmUgd2l0aCAwIGNvbGxpZGVyc1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkucmVtb3ZlU2hhcGUob2xkQ29sbGlkZXIpOyAvL3JlbW92ZSB0aGUgb2xkIGNvbGxpZGVyXHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnVzZXJEYXRhID0gdGhpczsgLy9yZXNldCB0aGUgZXh0cmEgaW5mb3JtYXRpb24gc28gdGhhdCB0aGlzIGNvbGxpZGVyIGtub3dzIHRvIHdoaWNoIEZVREdFIENvbXBvbmVudCBpdCdzIGNvbm5lY3RlZFxyXG4gICAgICB0aGlzLiNjb2xsaWRlci5zZXRDb2xsaXNpb25Hcm91cCh0aGlzLmNvbGxpc2lvbkdyb3VwKTtcclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0Q29sbGlzaW9uTWFzayh0aGlzLmNvbGxpc2lvbk1hc2spO1xyXG5cclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0UmVzdGl0dXRpb24odGhpcy4jcmVzdGl0dXRpb24pO1xyXG4gICAgICB0aGlzLiNjb2xsaWRlci5zZXRGcmljdGlvbih0aGlzLiNmcmljdGlvbik7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnNldENvbnRhY3RDYWxsYmFjayh0aGlzLiNjYWxsYmFja3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZXMgdGhlIHJpZ2lkYm9keSBhY2NvcmRpbmcgdG8gaXRzIGluaXRpYWxpemF0aW9uIHNldHRpbmcgdG8gbWF0Y2ggdGhlIG1lc2gsIHRoZSBub2RlIG9yIGl0cyBvd24gcGl2b3QgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMubm9kZSkgLy8gZGVsYXkgaW5pdGlhbGl6YXRpb24gdW50aWwgdGhpcyByaWdpZGJvZHkgaXMgYXR0YWNoZWQgdG8gYSBub2RlXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBzd2l0Y2ggKE51bWJlcih0aGlzLmluaXRpYWxpemF0aW9uKSkge1xyXG4gICAgICAgIGNhc2UgQk9EWV9JTklULlRPX05PREU6XHJcbiAgICAgICAgICB0aGlzLm10eFBpdm90ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJPRFlfSU5JVC5UT19NRVNIOlxyXG4gICAgICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICAgICAgaWYgKGNtcE1lc2gpXHJcbiAgICAgICAgICAgIHRoaXMubXR4UGl2b3QgPSBjbXBNZXNoLm10eFBpdm90LmNsb25lO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCT0RZX0lOSVQuVE9fUElWT1Q6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBsZXQgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMubm9kZS5tdHhXb3JsZCwgdGhpcy5tdHhQaXZvdCk7XHJcblxyXG4gICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBtdHhXb3JsZC50cmFuc2xhdGlvbjsgLy9BZGRpbmcgdGhlIG9mZnNldHMgZnJvbSB0aGUgcGl2b3RcclxuICAgICAgbGV0IHJvdGF0aW9uOiBWZWN0b3IzID0gbXR4V29ybGQucm90YXRpb247XHJcbiAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gbXR4V29ybGQuc2NhbGluZztcclxuICAgICAgLy9zY2FsaW5nIHJlcXVpcmVzIGNvbGxpZGVyIHRvIGJlIHJlY3JlYXRlZFxyXG4gICAgICB0aGlzLnNldFNjYWxpbmcoc2NhbGluZyk7XHJcblxyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TWFzc0RhdGEodGhpcy4jbWFzc0RhdGEpO1xyXG4gICAgICB0aGlzLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsgLy9zZXQgdGhlIGFjdHVhbCBuZXcgcm90YXRpb24vcG9zaXRpb24gZm9yIHRoaXMgUmIgYWdhaW4gc2luY2UgaXQncyBub3cgdXBkYXRlZFxyXG4gICAgICB0aGlzLnNldFJvdGF0aW9uKHJvdGF0aW9uKTtcclxuXHJcbiAgICAgIGxldCBzY2FsaW5nSW52ZXJzZTogVmVjdG9yMyA9IHRoaXMubm9kZS5tdHhXb3JsZC5zY2FsaW5nLm1hcChfaSA9PiAxIC8gX2kpO1xyXG4gICAgICB0aGlzLiNtdHhQaXZvdFVuc2NhbGVkID0gTWF0cml4NHg0LkNPTVBPU0lUSU9OKHRoaXMubXR4UGl2b3QudHJhbnNsYXRpb24sIHRoaXMubXR4UGl2b3Qucm90YXRpb24sIHNjYWxpbmdJbnZlcnNlKTtcclxuICAgICAgdGhpcy4jbXR4UGl2b3RJbnZlcnNlID0gTWF0cml4NHg0LklOVkVSU0UodGhpcy4jbXR4UGl2b3RVbnNjYWxlZCk7XHJcblxyXG4gICAgICB0aGlzLmFkZFJpZ2lkYm9keVRvV29ybGQoKTtcclxuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBWZWxvY2l0eSBhbmQgRm9yY2VzXHJcbiAgICAvKipcclxuICAgICogR2V0IHRoZSBjdXJyZW50IFZFTE9DSVRZIG9mIHRoZSB7QGxpbmsgTm9kZX1cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmVsb2NpdHkoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZWxvY2l0eTogT0lNTy5WZWMzID0gdGhpcy4jcmlnaWRib2R5LmdldExpbmVhclZlbG9jaXR5KCk7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IFZFTE9DSVRZIG9mIHRoZSB7QGxpbmsgTm9kZX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFZlbG9jaXR5KF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgdmVsb2NpdHk6IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRMaW5lYXJWZWxvY2l0eSh2ZWxvY2l0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgQU5HVUxBUiAtIFZFTE9DSVRZIG9mIHRoZSB7QGxpbmsgTm9kZX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFuZ3VsYXJWZWxvY2l0eSgpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHZlbG9jaXR5OiBPSU1PLlZlYzMgPSB0aGlzLiNyaWdpZGJvZHkuZ2V0QW5ndWxhclZlbG9jaXR5KCk7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IEFOR1VMQVIgLSBWRUxPQ0lUWSBvZiB0aGUge0BsaW5rIE5vZGV9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRBbmd1bGFyVmVsb2NpdHkoX3ZhbHVlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIGxldCB2ZWxvY2l0eTogT0lNTy5WZWMzID0gbmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldEFuZ3VsYXJWZWxvY2l0eSh2ZWxvY2l0eSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBcHBsaWVzIGEgY29udGlub3VzIEZPUkNFIGF0IHRoZSBjZW50ZXIgb2YgdGhlIFJJR0lEQk9EWSBpbiB0aGUgdGhyZWUgZGltZW5zaW9ucy4gQ29uc2lkZXJpbmcgdGhlIHJpZ2lkYm9keSdzIE1BU1MuXHJcbiAgICAqIFRoZSBmb3JjZSBpcyBtZWFzdXJlZCBpbiBuZXd0b24sIDFrZyBuZWVkcyBhYm91dCAxMCBOZXd0b24gdG8gZmlnaHQgYWdhaW5zdCBncmF2aXR5LlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhcHBseUZvcmNlKF9mb3JjZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYXBwbHlGb3JjZVRvQ2VudGVyKG5ldyBPSU1PLlZlYzMoX2ZvcmNlLngsIF9mb3JjZS55LCBfZm9yY2UueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBcHBsaWVzIGEgY29udGlub3VzIEZPUkNFIGF0IGEgc3BlY2lmaWMgcG9pbnQgaW4gdGhlIHdvcmxkIHRvIHRoZSBSSUdJREJPRFkgaW4gdGhlIHRocmVlIGRpbWVuc2lvbnMuIENvbnNpZGVyaW5nIHRoZSByaWdpZGJvZHkncyBNQVNTXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGFwcGx5Rm9yY2VBdFBvaW50KF9mb3JjZTogVmVjdG9yMywgX3dvcmxkUG9pbnQ6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFwcGx5Rm9yY2UobmV3IE9JTU8uVmVjMyhfZm9yY2UueCwgX2ZvcmNlLnksIF9mb3JjZS56KSwgbmV3IE9JTU8uVmVjMyhfd29ybGRQb2ludC54LCBfd29ybGRQb2ludC55LCBfd29ybGRQb2ludC56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwcGxpZXMgYSBjb250aW5vdXMgUk9UQVRJT05BTCBGT1JDRSAoVG9ycXVlKSB0byB0aGUgUklHSURCT0RZIGluIHRoZSB0aHJlZSBkaW1lbnNpb25zLiBDb25zaWRlcmluZyB0aGUgcmlnaWRib2R5J3MgTUFTU1xyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhcHBseVRvcnF1ZShfcm90YXRpb25hbEZvcmNlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5hcHBseVRvcnF1ZShuZXcgT0lNTy5WZWMzKF9yb3RhdGlvbmFsRm9yY2UueCwgX3JvdGF0aW9uYWxGb3JjZS55LCBfcm90YXRpb25hbEZvcmNlLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXBwbGllcyBhIGluc3RhbnQgRk9SQ0UgYXQgYSBwb2ludC9yaWdpZGJvZHljZW50ZXIgdG8gdGhlIFJJR0lEQk9EWSBpbiB0aGUgdGhyZWUgZGltZW5zaW9ucy4gQ29uc2lkZXJpbmcgdGhlIHJpZ2lkYm9kJ3MgTUFTU1xyXG4gICAgKiBJbmZsdWVuY2luZyB0aGUgYW5ndWxhciBzcGVlZCBhbmQgdGhlIGxpbmVhciBzcGVlZC4gXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGFwcGx5SW1wdWxzZUF0UG9pbnQoX2ltcHVsc2U6IFZlY3RvcjMsIF93b3JsZFBvaW50OiBWZWN0b3IzID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICBfd29ybGRQb2ludCA9IF93b3JsZFBvaW50ICE9IG51bGwgPyBfd29ybGRQb2ludCA6IHRoaXMuZ2V0UG9zaXRpb24oKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFwcGx5SW1wdWxzZShuZXcgT0lNTy5WZWMzKF9pbXB1bHNlLngsIF9pbXB1bHNlLnksIF9pbXB1bHNlLnopLCBuZXcgT0lNTy5WZWMzKF93b3JsZFBvaW50LngsIF93b3JsZFBvaW50LnksIF93b3JsZFBvaW50LnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXBwbGllcyBhIGluc3RhbnQgRk9SQ0UgdG8gdGhlIFJJR0lEQk9EWSBpbiB0aGUgdGhyZWUgZGltZW5zaW9ucy4gQ29uc2lkZXJpbmcgdGhlIHJpZ2lkYm9keSdzIE1BU1NcclxuICAgICogT25seSBpbmZsdWVuY2luZyBpdCdzIHNwZWVkIG5vdCByb3RhdGlvbi5cclxuICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHlMaW5lYXJJbXB1bHNlKF9pbXB1bHNlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5hcHBseUxpbmVhckltcHVsc2UobmV3IE9JTU8uVmVjMyhfaW1wdWxzZS54LCBfaW1wdWxzZS55LCBfaW1wdWxzZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIGEgaW5zdGFudCBST1RBVElPTkFMLUZPUkNFIHRvIHRoZSBSSUdJREJPRFkgaW4gdGhlIHRocmVlIGRpbWVuc2lvbnMuIENvbnNpZGVyaW5nIHRoZSByaWdpZGJvZHkncyBNQVNTXHJcbiAgICAgKiBPbmx5IGluZmx1ZW5jaW5nIGl0J3Mgcm90YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcHBseUFuZ3VsYXJJbXB1bHNlKF9yb3RhdGlvbmFsSW1wdWxzZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYXBwbHlBbmd1bGFySW1wdWxzZShuZXcgT0lNTy5WZWMzKF9yb3RhdGlvbmFsSW1wdWxzZS54LCBfcm90YXRpb25hbEltcHVsc2UueSwgX3JvdGF0aW9uYWxJbXB1bHNlLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoYW5naW5nIHRoZSBWRUxPQ0lUWSBvZiB0aGUgUklHSURCT0RZLiBPbmx5IGluZmx1ZW5jaW5nIHRoZSBsaW5lYXIgc3BlZWQgbm90IGFuZ3VsYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFZlbG9jaXR5KF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYWRkTGluZWFyVmVsb2NpdHkobmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2luZyB0aGUgVkVMT0NJVFkgb2YgdGhlIFJJR0lEQk9EWS4gT25seSBpbmZsdWVuY2luZyB0aGUgYW5ndWxhciBzcGVlZCBub3QgdGhlIGxpbmVhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkQW5ndWxhclZlbG9jaXR5KF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYWRkQW5ndWxhclZlbG9jaXR5KG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGUtIC8gQWN0aXZhdGUgdGhlIHJpZ2lkYm9kaWVzIGF1dG8tc2xlZXBpbmcgZnVuY3Rpb24uXHJcbiAgICAgKiBJZiBhY3RpdmF0ZWQgdGhlIHJpZ2lkYm9keSB3aWxsIGF1dG9tYXRpY2FsbHkgc2xlZXAgd2hlbiBuZWVkZWQsIGluY3JlYXNpbmcgcGVyZm9ybWFuY2UuXHJcbiAgICAgKiBJZiBkZWFjdGl2YXRlZCB0aGUgcmlnaWRib2R5IGdldHMgc3RvcHBlZCBmcm9tIHNsZWVwaW5nIHdoZW4gbW92ZW1lbnQgaXMgdG9vIG1pbmltYWwuIERlY3JlYXNpbmcgcGVyZm9ybWFuY2UsIGZvciByYXJlbHkgbW9yZSBwcmVjaXNlIHBoeXNpY3MgcmVzdWx0cyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlQXV0b1NsZWVwKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0QXV0b1NsZWVwKF9vbik7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gQ29sbGlzaW9uXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENoZWNraW5nIGZvciBDb2xsaXNpb24gd2l0aCBvdGhlciBDb2xsaWRlcnMgYW5kIGRpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sbGlkZXIuXHJcbiAgICAvLyAgKiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBpbiB0aGUgUmVuZGVyTWFuYWdlciwgbm8gaW50ZXJhY3Rpb24gbmVlZGVkLlxyXG4gICAgLy8gICovXHJcbiAgICAvLyBwdWJsaWMgY2hlY2tDb2xsaXNpb25FdmVudHMoKTogdm9pZCB7XHJcbiAgICAvLyAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSAvLyBjaGVjayBjb2xsaXNpb25zIG9ubHkgaWYgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkXHJcbiAgICAvLyAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vICAgbGV0IGNvbnRhY3RMaW5rOiBPSU1PLkNvbnRhY3RMaW5rID0gdGhpcy4jcmlnaWRib2R5LmdldENvbnRhY3RMaW5rTGlzdCgpOyAvLyBhbGwgcGh5c2ljYWwgY29udGFjdHMgYmV0d2VlbiBjb2xsaWRpbmcgYm9kaWVzIG9uIHRoaXMgcmJcclxuICAgIC8vICAgd2hpbGUgKGNvbnRhY3RMaW5rICE9IG51bGwpIHtcclxuICAgIC8vICAgICBsZXQgb3RoZXI6IENvbXBvbmVudFJpZ2lkYm9keSA9IGNvbnRhY3RMaW5rLmdldE90aGVyKCkudXNlckRhdGE7IC8vIGdldCB0aGUgb3RoZXIgY29tcG9uZW50IHJpZ2lkYm9keSBpbnZvbHZlZCBpbiB0aGUgY29sbGlzaW9uXHJcbiAgICAvLyAgICAgaWYgKCFvdGhlci5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAvLyAgICAgICBjb250YWN0TGluayA9IGNvbnRhY3RMaW5rLmdldE5leHQoKTtcclxuICAgIC8vICAgICAgIGNvbnRpbnVlO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgbGV0IGNvbnRhY3Q6IE9JTU8uQ29udGFjdCA9IGNvbnRhY3RMaW5rLmdldENvbnRhY3QoKTtcclxuICAgIC8vICAgICBsZXQgd2FzVG91Y2hpbmc6IGJvb2xlYW4gPSB0aGlzLmNvbGxpc2lvbnMuaW5jbHVkZXMob3RoZXIpO1xyXG4gICAgLy8gICAgIGxldCBpc1RvdWNoaW5nOiBib29sZWFuID0gY29udGFjdC5pc1RvdWNoaW5nKCk7XHJcblxyXG4gICAgLy8gICAgIGlmICghd2FzVG91Y2hpbmcgJiYgaXNUb3VjaGluZykgeyAvLyBFTlRFUlxyXG4gICAgLy8gICAgICAgbGV0IG1hbmlmb2xkOiBPSU1PLk1hbmlmb2xkID0gY29udGFjdC5nZXRNYW5pZm9sZCgpO1xyXG4gICAgLy8gICAgICAgbGV0IHBvaW50czogT0lNTy5NYW5pZm9sZFBvaW50W10gPSBtYW5pZm9sZC5nZXRQb2ludHMoKTsgLy8gQWxsIHBvaW50cyBpbiB0aGUgY29sbGlzaW9uIHdoZXJlIHRoZSB0d28gYm9kaWVzIGFyZSB0b3VjaGluZywgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgaW1wYWN0XHJcbiAgICAvLyAgICAgICBsZXQgbm9ybWFsSW1wdWxzZTogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICAgIGxldCBiaW5vcm1hbEltcHVsc2U6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgICBsZXQgdGFuZ2VudEltcHVsc2U6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgICBmb3IgKGxldCBtYW5pZm9sZFBvaW50IG9mIHBvaW50cykgeyAvLyBUaGUgaW1wYWN0IG9mIHRoZSBjb2xsaXNpb24gaW52b2x2aW5nIGFsbCB0b3VjaGluZyBwb2ludHNcclxuICAgIC8vICAgICAgICAgbm9ybWFsSW1wdWxzZSArPSBtYW5pZm9sZFBvaW50LmdldE5vcm1hbEltcHVsc2UoKTtcclxuICAgIC8vICAgICAgICAgYmlub3JtYWxJbXB1bHNlICs9IG1hbmlmb2xkUG9pbnQuZ2V0Qmlub3JtYWxJbXB1bHNlKCk7XHJcbiAgICAvLyAgICAgICAgIHRhbmdlbnRJbXB1bHNlICs9IG1hbmlmb2xkUG9pbnQuZ2V0VGFuZ2VudEltcHVsc2UoKTtcclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICAgIGxldCBub3JtYWw6IE9JTU8uVmVjMyA9IG1hbmlmb2xkLmdldE5vcm1hbCgpO1xyXG4gICAgLy8gICAgICAgbGV0IGNvbGxpc2lvbk5vcm1hbDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnopO1xyXG4gICAgLy8gICAgICAgbGV0IGNvbGxpc2lvbkNlbnRlclBvaW50OiBWZWN0b3IzID0gdGhpcy5jb2xsaXNpb25DZW50ZXJQb2ludChwb2ludHMsIG1hbmlmb2xkLmdldE51bVBvaW50cygpKTtcclxuICAgIC8vICAgICAgIHRoaXMuY29sbGlzaW9ucy5wdXNoKG90aGVyKTtcclxuICAgIC8vICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuQ09MTElTSU9OX0VOVEVSLCBvdGhlciwgbm9ybWFsSW1wdWxzZSwgdGFuZ2VudEltcHVsc2UsIGJpbm9ybWFsSW1wdWxzZSwgY29sbGlzaW9uQ2VudGVyUG9pbnQsIGNvbGxpc2lvbk5vcm1hbCkpOyAvLyBTZW5kaW5nIHRoZSBnaXZlbiBldmVudFxyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAod2FzVG91Y2hpbmcgJiYgIWlzVG91Y2hpbmcpIHsgLy8gRVhJVFxyXG4gICAgLy8gICAgICAgdGhpcy5jb2xsaXNpb25zLnNwbGljZSh0aGlzLmNvbGxpc2lvbnMuaW5kZXhPZihvdGhlciksIDEpO1xyXG4gICAgLy8gICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudFBoeXNpY3MoRVZFTlRfUEhZU0lDUy5DT0xMSVNJT05fRVhJVCwgb3RoZXIsIDAsIDAsIDApKTtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGNvbnRhY3RMaW5rID0gY29udGFjdExpbmsuZ2V0TmV4dCgpOyAvLyBTdGFydCB0aGUgc2FtZSByb3V0aW5lIHdpdGggdGhlIG5leHQgY29sbGlzaW9uIGluIHRoZSBsaXN0XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlbmRzIGEgcmF5IHRocm91Z2ggdGhpcyBzcGVjaWZpYyBib2R5IGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSB3b3JsZCBhbmQgY2hlY2tzIGlmIHRoaXMgYm9keSB3YXMgaGl0IGJ5IHRoZSByYXksXHJcbiAgICAgKiByZXR1cm5pbmcgaW5mbyBhYm91dCB0aGUgaGl0LiBQcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFuZCBpbmZvcm1hdGlvbiBhIHJlZ3VsYXIgcmF5Y2FzdCBkb2VzIGJ1dCB0aGUgcmF5IGlzIG9ubHkgdGVzdGluZyBhZ2FpbnN0IHRoaXMgc3BlY2lmaWMgYm9keS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJheWNhc3RUaGlzQm9keShfb3JpZ2luOiBWZWN0b3IzLCBfZGlyZWN0aW9uOiBWZWN0b3IzLCBfbGVuZ3RoOiBudW1iZXIsIF9kZWJ1Z0RyYXc6IGJvb2xlYW4gPSBmYWxzZSk6IFJheUhpdEluZm8ge1xyXG4gICAgICBsZXQgaGl0SW5mbzogUmF5SGl0SW5mbyA9IG5ldyBSYXlIaXRJbmZvKCk7XHJcbiAgICAgIGxldCBnZW9tZXRyeTogT0lNTy5HZW9tZXRyeSA9IHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKS5nZXRHZW9tZXRyeSgpO1xyXG4gICAgICBsZXQgdHJhbnNmb3JtOiBPSU1PLlRyYW5zZm9ybSA9IHRoaXMuI3JpZ2lkYm9keS5nZXRUcmFuc2Zvcm0oKTtcclxuICAgICAgbGV0IHNjYWxlZERpcmVjdGlvbjogVmVjdG9yMyA9IF9kaXJlY3Rpb24uY2xvbmU7XHJcbiAgICAgIHNjYWxlZERpcmVjdGlvbi5zY2FsZShfbGVuZ3RoKTtcclxuICAgICAgbGV0IGVuZHBvaW50OiBWZWN0b3IzID0gVmVjdG9yMy5TVU0oc2NhbGVkRGlyZWN0aW9uLCBfb3JpZ2luLmNsb25lKTtcclxuICAgICAgbGV0IG9pbW9SYXk6IE9JTU8uUmF5Q2FzdEhpdCA9IG5ldyBPSU1PLlJheUNhc3RIaXQoKTtcclxuICAgICAgbGV0IGhpdDogYm9vbGVhbiA9IGdlb21ldHJ5LnJheUNhc3QobmV3IE9JTU8uVmVjMyhfb3JpZ2luLngsIF9vcmlnaW4ueSwgX29yaWdpbi56KSwgbmV3IE9JTU8uVmVjMyhlbmRwb2ludC54LCBlbmRwb2ludC55LCBlbmRwb2ludC56KSwgdHJhbnNmb3JtLCBvaW1vUmF5KTsgLy90aGUgYWN0dWFsIE9pbW9QaHlzaWNzIFJheWNhc3RcclxuICAgICAgaWYgKGhpdCkgeyAgLy9JZiBoaXQgcmV0dXJuIGEgYnVuY2ggb2YgaW5mb3JtYXRpb25zIGFib3V0IHRoZSBoaXRcclxuICAgICAgICBoaXRJbmZvLmhpdCA9IHRydWU7XHJcbiAgICAgICAgaGl0SW5mby5oaXRQb2ludCA9IG5ldyBWZWN0b3IzKG9pbW9SYXkucG9zaXRpb24ueCwgb2ltb1JheS5wb3NpdGlvbi55LCBvaW1vUmF5LnBvc2l0aW9uLnopO1xyXG4gICAgICAgIGhpdEluZm8uaGl0Tm9ybWFsID0gbmV3IFZlY3RvcjMob2ltb1JheS5ub3JtYWwueCwgb2ltb1JheS5ub3JtYWwueSwgb2ltb1JheS5ub3JtYWwueik7XHJcbiAgICAgICAgbGV0IGR4OiBudW1iZXIgPSBfb3JpZ2luLnggLSBoaXRJbmZvLmhpdFBvaW50Lng7ICAvL2NhbGN1bGF0ZSBoaXQgZGlzdGFuY2VcclxuICAgICAgICBsZXQgZHk6IG51bWJlciA9IF9vcmlnaW4ueSAtIGhpdEluZm8uaGl0UG9pbnQueTtcclxuICAgICAgICBsZXQgZHo6IG51bWJlciA9IF9vcmlnaW4ueiAtIGhpdEluZm8uaGl0UG9pbnQuejtcclxuICAgICAgICBoaXRJbmZvLmhpdERpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkeik7XHJcbiAgICAgICAgaGl0SW5mby5yaWdpZGJvZHlDb21wb25lbnQgPSB0aGlzO1xyXG4gICAgICAgIGhpdEluZm8ucmF5T3JpZ2luID0gX29yaWdpbjtcclxuICAgICAgICBoaXRJbmZvLnJheUVuZCA9IGVuZHBvaW50O1xyXG4gICAgICB9IGVsc2UgeyAvL09ubHkgdGVsbCB0aGUgb3JpZ2luLCBhbmQgdGhlIGhpdCBwb2ludCBpcyB0aGUgZW5kIG9mIHRoZSByYXkuXHJcbiAgICAgICAgaGl0SW5mby5yYXlPcmlnaW4gPSBfb3JpZ2luO1xyXG4gICAgICAgIGhpdEluZm8uaGl0UG9pbnQgPSBuZXcgVmVjdG9yMyhlbmRwb2ludC54LCBlbmRwb2ludC55LCBlbmRwb2ludC56KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoX2RlYnVnRHJhdykge1xyXG4gICAgICAgIFBoeXNpY3MuZGVidWdEcmF3LmRlYnVnUmF5KGhpdEluZm8ucmF5T3JpZ2luLCBoaXRJbmZvLmhpdFBvaW50LCBuZXcgQ29sb3IoMCwgMSwgMCwgMSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBoaXRJbmZvO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZyAtIFNvbWUgcHJvcGVydGllcyBtaWdodCBiZSBtaXNzaW5nLCBlLmcuIGNvbnZleE1lc2ggKEZsb2F0MzJBcnJheSlcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcblxyXG4gICAgICBkZWxldGUgc2VyaWFsaXphdGlvbi5tdHhQaXZvdDtcclxuICAgICAgZGVsZXRlIHNlcmlhbGl6YXRpb24uYWN0aXZlO1xyXG5cclxuICAgICAgc2VyaWFsaXphdGlvbi50eXBlQm9keSA9IEJPRFlfVFlQRVt0aGlzLiN0eXBlQm9keV07XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udHlwZUNvbGxpZGVyID0gQ09MTElERVJfVFlQRVt0aGlzLiN0eXBlQ29sbGlkZXJdO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmluaXRpYWxpemF0aW9uID0gQk9EWV9JTklUW3RoaXMuaW5pdGlhbGl6YXRpb25dO1xyXG5cclxuICAgICAgc2VyaWFsaXphdGlvbi5pZCA9IHRoaXMuI2lkO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnBpdm90ID0gdGhpcy5tdHhQaXZvdC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHRoaXMubXR4UGl2b3QuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ucGl2b3QpO1xyXG4gICAgICB0aGlzLiNpZCA9IF9zZXJpYWxpemF0aW9uLmlkO1xyXG4gICAgICB0aGlzLm1hc3MgPSBpZk51bWJlcihfc2VyaWFsaXphdGlvbi5tYXNzLCB0aGlzLm1hc3MpO1xyXG4gICAgICB0aGlzLmRhbXBUcmFuc2xhdGlvbiA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLmRhbXBUcmFuc2xhdGlvbiwgdGhpcy5kYW1wVHJhbnNsYXRpb24pO1xyXG4gICAgICB0aGlzLmRhbXBSb3RhdGlvbiA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLmRhbXBSb3RhdGlvbiwgdGhpcy5kYW1wUm90YXRpb24pO1xyXG4gICAgICB0aGlzLmNvbGxpc2lvbkdyb3VwID0gaWZOdW1iZXIoX3NlcmlhbGl6YXRpb24uY29sbGlzaW9uR3JvdXAsIHRoaXMuY29sbGlzaW9uR3JvdXApO1xyXG4gICAgICB0aGlzLmVmZmVjdFJvdGF0aW9uID0gX3NlcmlhbGl6YXRpb24uZWZmZWN0Um90YXRpb24gfHwgdGhpcy5lZmZlY3RSb3RhdGlvbjtcclxuICAgICAgdGhpcy5lZmZlY3RHcmF2aXR5ID0gaWZOdW1iZXIoX3NlcmlhbGl6YXRpb24uZWZmZWN0R3Jhdml0eSwgdGhpcy5lZmZlY3RHcmF2aXR5KTtcclxuICAgICAgdGhpcy5mcmljdGlvbiA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLmZyaWN0aW9uLCB0aGlzLmZyaWN0aW9uKTtcclxuICAgICAgdGhpcy5yZXN0aXR1dGlvbiA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLnJlc3RpdHV0aW9uLCB0aGlzLnJlc3RpdHV0aW9uKTtcclxuICAgICAgdGhpcy5pc1RyaWdnZXIgPSBfc2VyaWFsaXphdGlvbi5pc1RyaWdnZXIgfHwgdGhpcy5pc1RyaWdnZXI7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb24gPSBfc2VyaWFsaXphdGlvbi5pbml0aWFsaXphdGlvbjtcclxuXHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb24gPSA8bnVtYmVyPjx1bmtub3duPkJPRFlfSU5JVFtfc2VyaWFsaXphdGlvbi5pbml0aWFsaXphdGlvbl07XHJcbiAgICAgIHRoaXMudHlwZUJvZHkgPSA8bnVtYmVyPjx1bmtub3duPkJPRFlfVFlQRVtfc2VyaWFsaXphdGlvbi50eXBlQm9keV07XHJcbiAgICAgIHRoaXMudHlwZUNvbGxpZGVyID0gPG51bWJlcj48dW5rbm93bj5DT0xMSURFUl9UWVBFW19zZXJpYWxpemF0aW9uLnR5cGVDb2xsaWRlcl07XHJcbiAgICAgIC8vIHRoaXMuY3JlYXRlKHRoaXMubWFzcywgdGhpcy4jdHlwZUJvZHksIHRoaXMuI3R5cGVDb2xsaWRlciwgdGhpcy5jb2xsaXNpb25Hcm91cCwgbnVsbCwgdGhpcy5jb252ZXhNZXNoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENoYW5nZSBwcm9wZXJ0aWVzIGJ5IGFuIGFzc29jaWF0aXZlIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKF9tdXRhdG9yLnR5cGVCb2R5ICE9IHVuZGVmaW5lZClcclxuICAgICAgICBfbXV0YXRvci50eXBlQm9keSA9IHBhcnNlSW50KF9tdXRhdG9yLnR5cGVCb2R5KTtcclxuICAgICAgaWYgKF9tdXRhdG9yLnR5cGVDb2xsaWRlciAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgX211dGF0b3IudHlwZUNvbGxpZGVyID0gcGFyc2VJbnQoX211dGF0b3IudHlwZUNvbGxpZGVyKTtcclxuICAgICAgaWYgKF9tdXRhdG9yLmluaXRpYWxpemF0aW9uICE9IHVuZGVmaW5lZClcclxuICAgICAgICBfbXV0YXRvci5pbml0aWFsaXphdGlvbiA9IHBhcnNlSW50KF9tdXRhdG9yLmluaXRpYWxpemF0aW9uKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICBpZiAoX211dGF0b3IuaW5pdGlhbGl6YXRpb24gIT0gdW5kZWZpbmVkICYmIHRoaXMuaXNBY3RpdmUpXHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgIC8vIFRPRE86IHNlZSBpZiB0aGlzIGFsdGVybmF0aXZlIHNob3VsZCBiZSwgYXQgbGVhc3QgcGFydGlhbGx5LCBkb25lIHdpdGggbXV0YXRlU2VsZWN0aW9uXHJcbiAgICAgIC8vIGxldCBjYWxsSWZFeGlzdDogRnVuY3Rpb24gPSAoX2tleTogc3RyaW5nLCBfc2V0dGVyOiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICAvLyAgIGlmIChfbXV0YXRvcltfa2V5XSlcclxuICAgICAgLy8gICAgIF9zZXR0ZXIoX211dGF0b3JbX2tleV0pO1xyXG4gICAgICAvLyB9O1xyXG5cclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJmcmljdGlvblwiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMuZnJpY3Rpb24gPSBfdmFsdWUpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcInJlc3RpdHV0aW9uXCIsIChfdmFsdWU6IG51bWJlcikgPT4gdGhpcy5yZXN0aXR1dGlvbiA9IF92YWx1ZSk7XHJcbiAgICAgIC8vIGNhbGxJZkV4aXN0KFwibWFzc1wiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMubWFzcyA9IF92YWx1ZSk7XHJcbiAgICAgIC8vIGNhbGxJZkV4aXN0KFwiZGFtcFRyYW5zbGF0aW9uXCIsIChfdmFsdWU6IG51bWJlcikgPT4gdGhpcy5kYW1wVHJhbnNsYXRpb24gPSBfdmFsdWUpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcImRhbXBSb3RhdGlvblwiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMuZGFtcFJvdGF0aW9uID0gX3ZhbHVlKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJlZmZlY3RHcmF2aXR5XCIsIChfdmFsdWU6IG51bWJlcikgPT4gdGhpcy5lZmZlY3RHcmF2aXR5ID0gX3ZhbHVlKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJjb2xsaXNpb25Hcm91cFwiLCAoX3ZhbHVlOiBDT0xMSVNJT05fR1JPVVApID0+IHRoaXMuY29sbGlzaW9uR3JvdXAgPSBfdmFsdWUpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcInR5cGVCb2R5XCIsIChfdmFsdWU6IHN0cmluZykgPT4gdGhpcy50eXBlQm9keSA9IHBhcnNlSW50KF92YWx1ZSkpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcInR5cGVDb2xsaWRlclwiLCAoX3ZhbHVlOiBzdHJpbmcpID0+IHRoaXMudHlwZUNvbGxpZGVyID0gcGFyc2VJbnQoX3ZhbHVlKSk7XHJcblxyXG4gICAgICAvLyB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULk1VVEFURSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcblxyXG4gICAgICBtdXRhdG9yLmZyaWN0aW9uID0gdGhpcy5mcmljdGlvbjtcclxuICAgICAgbXV0YXRvci5yZXN0aXR1dGlvbiA9IHRoaXMucmVzdGl0dXRpb247XHJcbiAgICAgIG11dGF0b3IubWFzcyA9IHRoaXMubWFzcztcclxuICAgICAgbXV0YXRvci5kYW1wVHJhbnNsYXRpb24gPSB0aGlzLmRhbXBUcmFuc2xhdGlvbjtcclxuICAgICAgbXV0YXRvci5kYW1wUm90YXRpb24gPSB0aGlzLmRhbXBSb3RhdGlvbjtcclxuICAgICAgbXV0YXRvci5lZmZlY3RHcmF2aXR5ID0gdGhpcy5lZmZlY3RHcmF2aXR5O1xyXG4gICAgICBtdXRhdG9yLnR5cGVCb2R5ID0gdGhpcy4jdHlwZUJvZHk7XHJcbiAgICAgIG11dGF0b3IudHlwZUNvbGxpZGVyID0gdGhpcy4jdHlwZUNvbGxpZGVyO1xyXG4gICAgICBtdXRhdG9yLmlzVHJpZ2dlciA9IHRoaXMuI2lzVHJpZ2dlcjtcclxuXHJcbiAgICAgIC8vIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhtdXRhdG9yKTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0gc3VwZXIuZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yKTtcclxuICAgICAgaWYgKHR5cGVzLnR5cGVCb2R5KVxyXG4gICAgICAgIHR5cGVzLnR5cGVCb2R5ID0gQk9EWV9UWVBFO1xyXG4gICAgICBpZiAodHlwZXMudHlwZUNvbGxpZGVyKVxyXG4gICAgICAgIHR5cGVzLnR5cGVDb2xsaWRlciA9IENPTExJREVSX1RZUEU7XHJcbiAgICAgIGlmICh0eXBlcy5pbml0aWFsaXphdGlvbilcclxuICAgICAgICB0eXBlcy5pbml0aWFsaXphdGlvbiA9IEJPRFlfSU5JVDtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuY29udmV4TWVzaDsgLy9Db252ZXggTWVzaCBjYW4ndCBiZSBzaG93biBpbiB0aGUgZWRpdG9yIGJlY2F1c2UgZmxvYXQzMkFycmF5IGlzIG5vdCBhIHZpYWJsZSBtdXRhdG9yXHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5jb2xsaXNpb25NYXNrO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuaXNJbml0aWFsaXplZDtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vIEFjdGl2YXRlIHRoZSBmdW5jdGlvbnMgb2YgdGhpcyBjb21wb25lbnQgYXMgcmVzcG9uc2UgdG8gZXZlbnRzXHJcbiAgICBwcml2YXRlIGhuZEV2ZW50ID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgc3dpdGNoIChfZXZlbnQudHlwZSkge1xyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX0FERDpcclxuICAgICAgICAgIC8vIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQUNUSVZBVEUsIHRoaXMuYWRkUmlnaWRib2R5VG9Xb3JsZCk7XHJcbiAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0RFQUNUSVZBVEUsIHRoaXMucmVtb3ZlUmlnaWRib2R5RnJvbVdvcmxkKTtcclxuICAgICAgICAgIC8vIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfQUNUSVZBVEUsIHRoaXMuYWRkUmlnaWRib2R5VG9Xb3JsZCwgdHJ1ZSk7IC8vIHVzZSBjYXB0dXJlIHRvIHJlYWN0IHRvIGJyb2FkY2FzdCFcclxuICAgICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVBQ1RJVkFURSwgdGhpcy5yZW1vdmVSaWdpZGJvZHlGcm9tV29ybGQsIHRydWUpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLm5vZGUuY21wVHJhbnNmb3JtKVxyXG4gICAgICAgICAgICBEZWJ1Zy53YXJuKFwiQ29tcG9uZW50UmlnaWRib2R5IGF0dGFjaGVkIHRvIG5vZGUgbWlzc2luZyBDb21wb25lbnRUcmFuc2Zvcm1cIiwgdGhpcy5ub2RlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX1JFTU9WRTpcclxuICAgICAgICAgIC8vIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLmFkZFJpZ2lkYm9keVRvV29ybGQpO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHRoaXMucmVtb3ZlUmlnaWRib2R5RnJvbVdvcmxkKTtcclxuICAgICAgICAgIC8vIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfQUNUSVZBVEUsIHRoaXMuYWRkUmlnaWRib2R5VG9Xb3JsZCwgdHJ1ZSk7IC8vIHVzZSBjYXB0dXJlIHRvIHJlYWN0IHRvIGJyb2FkY2FzdCFcclxuICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVBQ1RJVkFURSwgdGhpcy5yZW1vdmVSaWdpZGJvZHlGcm9tV29ybGQsIHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVSaWdpZGJvZHlGcm9tV29ybGQoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRVZFTlQuTk9ERV9ERVNFUklBTElaRUQ6XHJcbiAgICAgICAgICBpZiAoIXRoaXMubm9kZS5jbXBUcmFuc2Zvcm0pXHJcbiAgICAgICAgICAgIERlYnVnLmVycm9yKFwiQ29tcG9uZW50UmlnaWRib2R5IGF0dGFjaGVkIHRvIG5vZGUgbWlzc2luZyBDb21wb25lbnRUcmFuc2Zvcm1cIiwgdGhpcy5ub2RlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vI3JlZ2lvbiBDcmVhdGlvblxyXG4gICAgcHJpdmF0ZSBjcmVhdGUoX21hc3M6IG51bWJlciA9IDEsIF90eXBlOiBCT0RZX1RZUEUgPSBCT0RZX1RZUEUuRFlOQU1JQywgX2NvbGxpZGVyVHlwZTogQ09MTElERVJfVFlQRSA9IENPTExJREVSX1RZUEUuQ1VCRSwgX2dyb3VwOiBDT0xMSVNJT05fR1JPVVAgPSBQaHlzaWNzLnNldHRpbmdzLmRlZmF1bHRDb2xsaXNpb25Hcm91cCwgX210eFRyYW5zZm9ybTogTWF0cml4NHg0ID0gbnVsbCwgX2NvbnZleE1lc2g6IEZsb2F0MzJBcnJheSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgLy9TZXR0aW5nIHVwIGFsbCBpbmNvbWluZyB2YWx1ZXMgdG8gYmUgaW50ZXJuYWwgdmFsdWVzXHJcbiAgICAgIHRoaXMuY29udmV4TWVzaCA9IF9jb252ZXhNZXNoO1xyXG4gICAgICB0aGlzLiN0eXBlQm9keSA9IF90eXBlO1xyXG4gICAgICB0aGlzLiNjb2xsaXNpb25Hcm91cCA9IF9ncm91cDtcclxuICAgICAgdGhpcy4jdHlwZUNvbGxpZGVyID0gX2NvbGxpZGVyVHlwZTtcclxuICAgICAgdGhpcy5tYXNzID0gX21hc3M7XHJcbiAgICAgIHRoaXMuI3Jlc3RpdHV0aW9uID0gUGh5c2ljcy5zZXR0aW5ncy5kZWZhdWx0UmVzdGl0dXRpb247XHJcbiAgICAgIHRoaXMuI2ZyaWN0aW9uID0gUGh5c2ljcy5zZXR0aW5ncy5kZWZhdWx0RnJpY3Rpb247XHJcbiAgICAgIHRoaXMuY29sbGlzaW9uTWFzayA9IFBoeXNpY3Muc2V0dGluZ3MuZGVmYXVsdENvbGxpc2lvbk1hc2s7XHJcbiAgICAgIC8vQ3JlYXRlIHRoZSBhY3R1YWwgcmlnaWRib2R5IGluIHRoZSBPaW1vUGh5c2ljcyBTcGFjZVxyXG4gICAgICB0aGlzLmNyZWF0ZVJpZ2lkYm9keShfbWFzcywgX3R5cGUsIHRoaXMuI3R5cGVDb2xsaWRlciwgX210eFRyYW5zZm9ybSwgdGhpcy4jY29sbGlzaW9uR3JvdXApO1xyXG4gICAgICB0aGlzLiNpZCA9IFBoeXNpY3MuZGlzdHJpYnV0ZUJvZHlJRCgpO1xyXG5cclxuICAgICAgLy8gRXZlbnQgQ2FsbGJhY2tzIGRpcmVjdGx5IGZyb20gT0lNTyBQaHlzaWNzXHJcbiAgICAgIHRoaXMuI2NhbGxiYWNrcyA9IG5ldyBPSU1PLkNvbnRhY3RDYWxsYmFjaygpOyAvL2ZlaG1cclxuICAgICAgdGhpcy4jY2FsbGJhY2tzLmJlZ2luVHJpZ2dlckNvbnRhY3QgPSB0aGlzLnRyaWdnZXJFbnRlcjtcclxuICAgICAgdGhpcy4jY2FsbGJhY2tzLmVuZFRyaWdnZXJDb250YWN0ID0gdGhpcy50cmlnZ2VyRXhpdDtcclxuICAgICAgdGhpcy4jY2FsbGJhY2tzLnBvc3RTb2x2ZSA9IHRoaXMuY29sbGlzaW9uRW50ZXI7IC8vIHVzZSBwb3N0U29sdmUgZm9yIGNvbGxpc2lvbkVudGVyIHRvIGdldCB0aGUgaW1wdWxzZVxyXG4gICAgICB0aGlzLiNjYWxsYmFja3MuZW5kQ29udGFjdCA9IHRoaXMuY29sbGlzaW9uRXhpdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ3JlYXRlcyB0aGUgYWN0dWFsIE9pbW9QaHlzaWNzIFJpZ2lkYm9keSBvdXQgb2YgaW5mb3JtYXRpb25zIHRoZSBGVURHRSBDb21wb25lbnQgaGFzLiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVSaWdpZGJvZHkoX21hc3M6IG51bWJlciwgX3R5cGU6IEJPRFlfVFlQRSwgX2NvbGxpZGVyVHlwZTogQ09MTElERVJfVFlQRSwgX210eFRyYW5zZm9ybTogTWF0cml4NHg0LCBfY29sbGlzaW9uR3JvdXA6IENPTExJU0lPTl9HUk9VUCA9IENPTExJU0lPTl9HUk9VUC5ERUZBVUxUKTogdm9pZCB7XHJcbiAgICAgIGxldCBvaW1vVHlwZTogbnVtYmVyOyAvL05lZWQgdGhlIGNvbnZlcnNpb24gZnJvbSBzaW1wbGUgZW51bSB0byBudW1iZXIgYmVjYXVzZSBpZiBlbnVtIGlzIGRlZmluZWQgYXMgT2ltby5SaWdpZHlCb2R5VHlwZSB5b3UgaGF2ZSB0byBpbmNsdWRlIE9pbW8gdG8gdXNlIEZVREdFIGF0IGFsbFxyXG4gICAgICBzd2l0Y2ggKF90eXBlKSB7XHJcbiAgICAgICAgY2FzZSBCT0RZX1RZUEUuRFlOQU1JQzpcclxuICAgICAgICAgIG9pbW9UeXBlID0gT0lNTy5SaWdpZEJvZHlUeXBlLkRZTkFNSUM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJPRFlfVFlQRS5TVEFUSUM6XHJcbiAgICAgICAgICBvaW1vVHlwZSA9IE9JTU8uUmlnaWRCb2R5VHlwZS5TVEFUSUM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJPRFlfVFlQRS5LSU5FTUFUSUM6XHJcbiAgICAgICAgICBvaW1vVHlwZSA9IE9JTU8uUmlnaWRCb2R5VHlwZS5LSU5FTUFUSUM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgb2ltb1R5cGUgPSBPSU1PLlJpZ2lkQm9keVR5cGUuRFlOQU1JQztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZW1vdmUgYWxsIHByZXZpb3VzIHNoYXBlcyBmcm9tIHdvcmxkLiBOZWNlc3Nhcnk/XHJcbiAgICAgIC8vIHdoaWxlICh0aGlzLiNyaWdpZGJvZHkgJiYgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpICE9IG51bGwpXHJcbiAgICAgIC8vICAgdGhpcy4jcmlnaWRib2R5LnJlbW92ZVNoYXBlKHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKSk7XHJcblxyXG4gICAgICBsZXQgdG1wVHJhbnNmb3JtOiBNYXRyaXg0eDQgPSBfbXR4VHJhbnNmb3JtID09IG51bGwgPyBzdXBlci5ub2RlICE9IG51bGwgPyBzdXBlci5ub2RlLm10eFdvcmxkIDogTWF0cml4NHg0LklERU5USVRZKCkgOiBfbXR4VHJhbnNmb3JtOyAvL0dldCB0cmFuc2Zvcm0gaW5mb3JtYXRpb25zIGZyb20gdGhlIHdvcmxkLCBzaW5jZSBwaHlzaWNzIGRvZXMgbm90IGNhcmUgYWJvdXQgaGllcmFyY2h5XHJcbiAgICAgIC8vQ29udmVydCBpbmZvcm1hdGlvbnMgZnJvbSBGVURHRSB0byBPaW1vUGh5c2ljcyBhbmQgY3JlYXRpbmcgYSBjb2xsaWRlciB3aXRoIGl0LCB3aGlsZSBhbHNvIGFkZGluZyBhIHBpdm90IHRvIGRlcml2YXRlIGZyb20gdGhlIHRyYW5zZm9ybSBpbmZvcm1hdGlvbnMgaWYgbmVlZGVkXHJcbiAgICAgIGxldCBzY2FsZTogT0lNTy5WZWMzID0gbmV3IE9JTU8uVmVjMygodG1wVHJhbnNmb3JtLnNjYWxpbmcueCAqIHRoaXMubXR4UGl2b3Quc2NhbGluZy54KSAvIDIsICh0bXBUcmFuc2Zvcm0uc2NhbGluZy55ICogdGhpcy5tdHhQaXZvdC5zY2FsaW5nLnkpIC8gMiwgKHRtcFRyYW5zZm9ybS5zY2FsaW5nLnogKiB0aGlzLm10eFBpdm90LnNjYWxpbmcueikgLyAyKTtcclxuICAgICAgbGV0IHBvc2l0aW9uOiBPSU1PLlZlYzMgPSBuZXcgT0lNTy5WZWMzKHRtcFRyYW5zZm9ybS50cmFuc2xhdGlvbi54ICsgdGhpcy5tdHhQaXZvdC50cmFuc2xhdGlvbi54LCB0bXBUcmFuc2Zvcm0udHJhbnNsYXRpb24ueSArIHRoaXMubXR4UGl2b3QudHJhbnNsYXRpb24ueSwgdG1wVHJhbnNmb3JtLnRyYW5zbGF0aW9uLnogKyB0aGlzLm10eFBpdm90LnRyYW5zbGF0aW9uLnopO1xyXG4gICAgICBsZXQgcm90YXRpb246IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzModG1wVHJhbnNmb3JtLnJvdGF0aW9uLnggKyB0aGlzLm10eFBpdm90LnJvdGF0aW9uLngsIHRtcFRyYW5zZm9ybS5yb3RhdGlvbi55ICsgdGhpcy5tdHhQaXZvdC5yb3RhdGlvbi55LCB0bXBUcmFuc2Zvcm0ucm90YXRpb24ueiArIHRoaXMubXR4UGl2b3Qucm90YXRpb24ueik7XHJcbiAgICAgIHRoaXMuY3JlYXRlQ29sbGlkZXIoc2NhbGUsIF9jb2xsaWRlclR5cGUpO1xyXG4gICAgICAvL1NldHRpbmcgaW5mb3JtYXRpb25zIGFib3V0IG1hc3MsIHBvc2l0aW9uL3JvdGF0aW9uIGFuZCBwaHlzaWNhbCByZWFjdGlvbiB0eXBlXHJcbiAgICAgIHRoaXMuI21hc3NEYXRhLm1hc3MgPSBfbWFzczsgLy9fdHlwZSAhPSBQSFlTSUNTX1RZUEUuU1RBVElDID8gX21hc3MgOiAwOyAvL0lmIGEgb2JqZWN0IGlzIHN0YXRpYyBpdCBhY3RzIGFzIGlmIGl0IGhhcyBubyBtYXNzXHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keUluZm8udHlwZSA9IG9pbW9UeXBlO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHlJbmZvLnBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keUluZm8ucm90YXRpb24uZnJvbUV1bGVyWHl6KG5ldyBPSU1PLlZlYzMocm90YXRpb24ueCwgcm90YXRpb24ueSwgcm90YXRpb24ueikpOyAvL0NvbnZlcnQgZXVsZXJBbmdsZXMgaW4gZGVncmVlIHRvIHRoZSBpbnRlcm5hbGx5IHVzZWQgcXVhdGVybmlvbnNcclxuICAgICAgLy9DcmVhdGluZyB0aGUgYWN0dWFsIHJpZ2lkYm9keSBhbmQgaXQncyBjb2xsaWRlclxyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkgPSBuZXcgT0lNTy5SaWdpZEJvZHkodGhpcy4jcmlnaWRib2R5SW5mbyk7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyID0gbmV3IE9JTU8uU2hhcGUodGhpcy4jY29sbGlkZXJJbmZvKTtcclxuICAgICAgLy9GaWxsaW5nIHRoZSBhZGRpdGlvbmFsIHNldHRpbmdzIGFuZCBpbmZvcm1hdGlvbnMgdGhlIHJpZ2lkYm9keSBuZWVkcy4gV2hvIGlzIGNvbGxpZGluZywgaG93IGlzIHRoZSBjb2xsaXNpb24gaGFuZGxlZCAoZGFtcGluZywgaW5mbHVlbmNlIGZhY3RvcnMpXHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnVzZXJEYXRhID0gdGhpcztcclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0Q29sbGlzaW9uR3JvdXAoX2NvbGxpc2lvbkdyb3VwKTtcclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0Q29sbGlzaW9uTWFzayh0aGlzLmNvbGxpc2lvbk1hc2spO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYWRkU2hhcGUodGhpcy4jY29sbGlkZXIpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TWFzc0RhdGEodGhpcy4jbWFzc0RhdGEpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuc2V0UmVzdGl0dXRpb24odGhpcy4jcmVzdGl0dXRpb24pO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuc2V0RnJpY3Rpb24odGhpcy4jZnJpY3Rpb24pO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuc2V0Q29udGFjdENhbGxiYWNrKHRoaXMuI2NhbGxiYWNrcyk7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRMaW5lYXJEYW1waW5nKHRoaXMuI2RhbXBpbmdMaW5lYXIpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0QW5ndWxhckRhbXBpbmcodGhpcy4jZGFtcGluZ0FuZ3VsYXIpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0R3Jhdml0eVNjYWxlKHRoaXMuI2VmZmVjdEdyYXZpdHkpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0Um90YXRpb25GYWN0b3IobmV3IE9JTU8uVmVjMyh0aGlzLiNlZmZlY3RSb3RhdGlvbi54LCB0aGlzLiNlZmZlY3RSb3RhdGlvbi55LCB0aGlzLiNlZmZlY3RSb3RhdGlvbi56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENyZWF0ZXMgYSBjb2xsaWRlciBhIHNoYXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0IGluIHRoZSBwaHlzaWNhbCB3b3JsZC4gICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNvbGxpZGVyKF9zY2FsZTogT0lNTy5WZWMzLCBfY29sbGlkZXJUeXBlOiBDT0xMSURFUl9UWVBFKTogdm9pZCB7XHJcbiAgICAgIGxldCBzaGFwZUNvbmY6IE9JTU8uU2hhcGVDb25maWcgPSBuZXcgT0lNTy5TaGFwZUNvbmZpZygpOyAvL0NvbGxpZGVyIHdpdGggZ2VvbWV0cnkgYW5kIGluZm9zIGxpa2UgZnJpY3Rpb24vcmVzdGl0dXRpb24gYW5kIG1vcmVcclxuICAgICAgbGV0IGdlb21ldHJ5OiBPSU1PLkdlb21ldHJ5O1xyXG4gICAgICBpZiAodGhpcy50eXBlQ29sbGlkZXIgIT0gX2NvbGxpZGVyVHlwZSkgLy9JZiB0aGUgY29sbGlkZXIgdHlwZSB3YXMgY2hhbmdlZCBzZXQgdGhlIGludGVybmFsIG9uZSBuZXcsIGVsc2UgZG9uJ3Qgc28gdGhlcmUgaXMgbm90IGluZmluaXRlIHNldCBjYWxsc1xyXG4gICAgICAgIHRoaXMudHlwZUNvbGxpZGVyID0gX2NvbGxpZGVyVHlwZTtcclxuICAgICAgc3dpdGNoIChfY29sbGlkZXJUeXBlKSB7ICAvL0NyZWF0ZSBhIGRpZmZlcmVudCBPaW1vUGh5c2ljcyBnZW9tZXRyeSBiYXNlZCBvbiB0aGUgZ2l2ZW4gdHlwZS4gVGhhdCBpcyBvbmx5IHRoZSBtYXRoZW1hdGljYWwgc2hhcGUgb2YgdGhlIGNvbGxpZGVyXHJcbiAgICAgICAgY2FzZSBDT0xMSURFUl9UWVBFLkNVQkU6XHJcbiAgICAgICAgICBnZW9tZXRyeSA9IG5ldyBPSU1PLkJveEdlb21ldHJ5KF9zY2FsZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuU1BIRVJFOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgT0lNTy5TcGhlcmVHZW9tZXRyeShfc2NhbGUueCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuQ0FQU1VMRTpcclxuICAgICAgICAgIGdlb21ldHJ5ID0gbmV3IE9JTU8uQ2Fwc3VsZUdlb21ldHJ5KF9zY2FsZS54LCBfc2NhbGUueSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuQ1lMSU5ERVI6XHJcbiAgICAgICAgICBnZW9tZXRyeSA9IG5ldyBPSU1PLkN5bGluZGVyR2VvbWV0cnkoX3NjYWxlLngsIF9zY2FsZS55KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ09MTElERVJfVFlQRS5DT05FOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgT0lNTy5Db25lR2VvbWV0cnkoX3NjYWxlLngsIF9zY2FsZS55KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ09MTElERVJfVFlQRS5QWVJBTUlEOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSB0aGlzLmNyZWF0ZUNvbnZleEdlb21ldHJ5Q29sbGlkZXIodGhpcy5jcmVhdGVQeXJhbWlkVmVydGljZXMoKSwgX3NjYWxlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ09MTElERVJfVFlQRS5DT05WRVg6XHJcbiAgICAgICAgICBnZW9tZXRyeSA9IHRoaXMuY3JlYXRlQ29udmV4R2VvbWV0cnlDb2xsaWRlcih0aGlzLmNvbnZleE1lc2gsIF9zY2FsZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBzaGFwZUNvbmYuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcclxuICAgICAgdGhpcy4jY29sbGlkZXJJbmZvID0gc2hhcGVDb25mOyAvL3RoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGFkZCBhbiBhY3R1YWwgY29sbGlkZXIgdG8gdGhlIHJpZ2lkYm9keSBpbiBjcmVhdGVSaWdpZGJvZHlcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ3JlYXRpbmcgYSBzaGFwZSB0aGF0IHJlcHJlc2VudHMgYSBpbiBpdHNlbGYgY2xvc2VkIGZvcm0sIG91dCBvZiB0aGUgZ2l2ZW4gdmVydGljZXMuICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNvbnZleEdlb21ldHJ5Q29sbGlkZXIoX3ZlcnRpY2VzOiBGbG9hdDMyQXJyYXksIF9zY2FsZTogT0lNTy5WZWMzKTogT0lNTy5Db252ZXhIdWxsR2VvbWV0cnkge1xyXG4gICAgICBsZXQgdmVydGljZXNBc1ZlYzM6IE9JTU8uVmVjM1tdID0gbmV3IEFycmF5KCk7IC8vQ29udmVydCBGVURHRSBWZWN0b3IzIHRvIE9pbW9WZWMzXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfdmVydGljZXMubGVuZ3RoOyBpICs9IDMpIHsgLy8zIFZhbHVlcyBmb3Igb25lIHBvaW50XHJcbiAgICAgICAgdmVydGljZXNBc1ZlYzMucHVzaChuZXcgT0lNTy5WZWMzKF92ZXJ0aWNlc1tpXSAqIF9zY2FsZS54LCBfdmVydGljZXNbaSArIDFdICogX3NjYWxlLnksIF92ZXJ0aWNlc1tpICsgMl0gKiBfc2NhbGUueikpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBuZXcgT0lNTy5Db252ZXhIdWxsR2VvbWV0cnkodmVydGljZXNBc1ZlYzMpOyAvL1RlbGwgT2ltb1BoeXNpY3MgdG8gY3JlYXRlIGEgaHVsbCB0aGF0IGludm9sdmVzIGFsbCBwb2ludHMgYnV0IGNsb3NlIGl0IG9mLiBBIGNvbnZleCBzaGFwZSBjYW4gbm90IGhhdmUgYSBob2xlIGluIGl0LlxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB2ZXJ0aWNlcyB0aGF0IGNvbnN0cnVjdCBhIHB5cmFtaWQuIFRoZSB2ZXJ0aWNlcyBvZiB0aGUgaW1wbGVtZW50ZWQgcHlyYW1pZCBtZXNoIGNhbiBiZSB1c2VkIHRvby4gQnV0IHRoZXkgYXJlIGhhbGZlZCBhbmQgZG91YmxlIHNpZGVkLCBzbyBpdCdzIG1vcmUgcGVyZm9ybWFudCB0byB1c2UgdGhpcy4gKi9cclxuICAgIHByaXZhdGUgY3JlYXRlUHlyYW1pZFZlcnRpY2VzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIGxldCB2ZXJ0aWNlczogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgICAgLyowKi8tMSwgMCwgMSwgLyoxKi8gMSwgMCwgMSwgIC8qMiovIDEsIDAsIC0xLCAvKjMqLyAtMSwgMCwgLTEsXHJcbiAgICAgICAgLyo0Ki8gMCwgMiwgMFxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIHZlcnRpY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBZGRpbmcgdGhpcyBDb21wb25lbnRSaWdpZGJvZHkgdG8gdGhlIFBoeXNpc2NzLndvcmxkIGdpdmluZyB0aGUgb2ltb1BoeXNpY3Mgc3lzdGVtIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgKi9cclxuICAgIHByaXZhdGUgYWRkUmlnaWRib2R5VG9Xb3JsZCA9ICgpOiB2b2lkID0+IHtcclxuICAgICAgaWYgKCF0aGlzLiNyaWdpZGJvZHkuX3dvcmxkKVxyXG4gICAgICAgIFBoeXNpY3MuYWRkUmlnaWRib2R5KHRoaXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKiogUmVtb3ZpbmcgdGhpcyBDb21wb25lbnRSaWdpZGJvZHkgZnJvbSB0aGUgUGh5c2lzY3Mud29ybGQgdGFraW5nIHRoZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgb2ltb1BoeXNpY3Mgc3lzdGVtICovXHJcbiAgICBwcml2YXRlIHJlbW92ZVJpZ2lkYm9keUZyb21Xb3JsZCA9ICgpOiB2b2lkID0+IHtcclxuICAgICAgUGh5c2ljcy5yZW1vdmVSaWdpZGJvZHkodGhpcyk7XHJcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIHByaXZhdGUgRVZFTlQgZnVuY3Rpb25zXHJcbiAgICAvL0NhbGN1bGF0aW5nIHRoZSBjZW50ZXIgb2YgYSBjb2xsaXNpb24gYXMgYSBzaW5ndWxhciBwb2ludCAtIGluIGNhc2UgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwb2ludCAtIGJ5IGdldHRpbmcgdGhlIGdlb21ldHJpY2FsIGNlbnRlciBvZiBhbGwgY29sbGlkaW5nIHBvaW50c1xyXG4gICAgcHJpdmF0ZSBjb2xsaXNpb25DZW50ZXJQb2ludChfY29sUG9pbnRzOiBPSU1PLk1hbmlmb2xkUG9pbnRbXSwgX251bVBvaW50czogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB0b3RhbFBvaW50czogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHRvdGFsWDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHRvdGFsWTogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHRvdGFsWjogbnVtYmVyID0gMDtcclxuICAgICAgX2NvbFBvaW50cy5mb3JFYWNoKChfdmFsdWU6IE9JTU8uTWFuaWZvbGRQb2ludCk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGlmICh0b3RhbFBvaW50cyA8IF9udW1Qb2ludHMpIHtcclxuICAgICAgICAgIHRvdGFsUG9pbnRzKys7XHJcbiAgICAgICAgICB0b3RhbFggKz0gX3ZhbHVlLmdldFBvc2l0aW9uMigpLng7XHJcbiAgICAgICAgICB0b3RhbFkgKz0gX3ZhbHVlLmdldFBvc2l0aW9uMigpLnk7XHJcbiAgICAgICAgICB0b3RhbFogKz0gX3ZhbHVlLmdldFBvc2l0aW9uMigpLno7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRvdGFsWCAvIF9udW1Qb2ludHMsIHRvdGFsWSAvIF9udW1Qb2ludHMsIHRvdGFsWiAvIF9udW1Qb2ludHMpOztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByaXZhdGUgY29sbGlzaW9uRW50ZXIoX2NvbnRhY3Q6IE9JTU8uQ29udGFjdCk6IHZvaWQge1xyXG4gICAgICBsZXQgYm9keUE6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9jb250YWN0LmdldFNoYXBlMSgpPy51c2VyRGF0YTtcclxuICAgICAgbGV0IGJvZHlCOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTIoKT8udXNlckRhdGE7XHJcblxyXG4gICAgICBpZiAoIWJvZHlBIHx8ICFib2R5QiB8fCBib2R5QS5jb2xsaXNpb25zLmluY2x1ZGVzKGJvZHlCKSkgLy8gYWxyZWFkeSBlbnRlcmVkXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgYm9keUEuY29sbGlzaW9ucy5wdXNoKGJvZHlCKTtcclxuICAgICAgYm9keUIuY29sbGlzaW9ucy5wdXNoKGJvZHlBKTtcclxuXHJcbiAgICAgIC8vIFRPRE86IG1heWJlIHJhdGhlciBleHBvc2UgdGhlIG1hbmlmb2xkIHRvIHRoZSBldmVudCBvciBzb21ldGhpbmdcclxuICAgICAgbGV0IG1hbmlmb2xkOiBPSU1PLk1hbmlmb2xkID0gX2NvbnRhY3QuZ2V0TWFuaWZvbGQoKTtcclxuICAgICAgbGV0IHBvaW50czogT0lNTy5NYW5pZm9sZFBvaW50W10gPSBtYW5pZm9sZC5nZXRQb2ludHMoKTsgLy8gQWxsIHBvaW50cyBpbiB0aGUgY29sbGlzaW9uIHdoZXJlIHRoZSB0d28gYm9kaWVzIGFyZSB0b3VjaGluZywgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgaW1wYWN0XHJcbiAgICAgIGxldCBub3JtYWxJbXB1bHNlOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgdGFuZ2VudEltcHVsc2U6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBiaW5vcm1hbEltcHVsc2U6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAobGV0IG1hbmlmb2xkUG9pbnQgb2YgcG9pbnRzKSB7IC8vIFRoZSBpbXBhY3Qgb2YgdGhlIGNvbGxpc2lvbiBpbnZvbHZpbmcgYWxsIHRvdWNoaW5nIHBvaW50c1xyXG4gICAgICAgIG5vcm1hbEltcHVsc2UgKz0gbWFuaWZvbGRQb2ludC5nZXROb3JtYWxJbXB1bHNlKCk7XHJcbiAgICAgICAgdGFuZ2VudEltcHVsc2UgKz0gbWFuaWZvbGRQb2ludC5nZXRUYW5nZW50SW1wdWxzZSgpO1xyXG4gICAgICAgIGJpbm9ybWFsSW1wdWxzZSArPSBtYW5pZm9sZFBvaW50LmdldEJpbm9ybWFsSW1wdWxzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBub3JtYWw6IE9JTU8uVmVjMyA9IG1hbmlmb2xkLmdldE5vcm1hbCgpO1xyXG4gICAgICBsZXQgY29sbGlzaW9uTm9ybWFsOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMobm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueik7XHJcbiAgICAgIGxldCBjb2xsaXNpb25DZW50ZXJQb2ludDogVmVjdG9yMyA9IGJvZHlBLmNvbGxpc2lvbkNlbnRlclBvaW50KHBvaW50cywgbWFuaWZvbGQuZ2V0TnVtUG9pbnRzKCkpO1xyXG4gICAgICBib2R5QS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudFBoeXNpY3MoRVZFTlRfUEhZU0lDUy5DT0xMSVNJT05fRU5URVIsIGJvZHlCLCBub3JtYWxJbXB1bHNlLCB0YW5nZW50SW1wdWxzZSwgYmlub3JtYWxJbXB1bHNlLCBjb2xsaXNpb25DZW50ZXJQb2ludCwgY29sbGlzaW9uTm9ybWFsKSk7XHJcbiAgICAgIGJvZHlCLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLkNPTExJU0lPTl9FTlRFUiwgYm9keUEsIG5vcm1hbEltcHVsc2UsIHRhbmdlbnRJbXB1bHNlLCBiaW5vcm1hbEltcHVsc2UsIGNvbGxpc2lvbkNlbnRlclBvaW50LCBjb2xsaXNpb25Ob3JtYWwpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbGxpc2lvbkV4aXQoX2NvbnRhY3Q6IE9JTU8uQ29udGFjdCk6IHZvaWQge1xyXG4gICAgICBsZXQgYm9keUE6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9jb250YWN0LmdldFNoYXBlMSgpPy51c2VyRGF0YTtcclxuICAgICAgbGV0IGJvZHlCOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTIoKT8udXNlckRhdGE7XHJcblxyXG4gICAgICBpZiAoIWJvZHlBIHx8ICFib2R5QiB8fCAhYm9keUEuY29sbGlzaW9ucy5pbmNsdWRlcyhib2R5QikpIC8vIGFscmVhZHkgZXhpdGVkXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgYm9keUEuY29sbGlzaW9ucy5zcGxpY2UoYm9keUEuY29sbGlzaW9ucy5pbmRleE9mKGJvZHlCKSwgMSk7XHJcbiAgICAgIGJvZHlCLmNvbGxpc2lvbnMuc3BsaWNlKGJvZHlCLmNvbGxpc2lvbnMuaW5kZXhPZihib2R5QSksIDEpO1xyXG5cclxuICAgICAgYm9keUEuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuQ09MTElTSU9OX0VYSVQsIGJvZHlCLCAwLCAwLCAwKSk7XHJcbiAgICAgIGJvZHlCLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLkNPTExJU0lPTl9FWElULCBib2R5QSwgMCwgMCwgMCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBUcmlnZ2VyIEVudGVyaW5nRXZlbnQgQ2FsbGJhY2ssIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5IE9JTU8gUGh5c2ljcyB3aXRoaW4gdGhlaXIgY2FsY3VsYXRpb25zLlxyXG4gICAgKiBTaW5jZSB0aGUgZXZlbnQgZG9lcyBub3Qga25vdyB3aGljaCBib2R5IGlzIHRoZSB0cmlnZ2VyIGluaWF0b3IsIHRoZSBldmVudCBjYW4gYmUgbGlzdGVuZWQgdG9cclxuICAgICogb24gZWl0aGVyIHRoZSB0cmlnZ2VyIG9yIHRoZSB0cmlnZ2VyZWQuIChUaGlzIGlzIG9ubHkgcG9zc2libGUgd2l0aCB0aGUgRlVER0UgT0lNTyBGb3JrISlcclxuICAgICovXHJcbiAgICBwcml2YXRlIHRyaWdnZXJFbnRlcihfY29udGFjdDogT0lNTy5Db250YWN0KTogdm9pZCB7XHJcbiAgICAgIGxldCBib2R5QTogQ29tcG9uZW50UmlnaWRib2R5ID0gX2NvbnRhY3QuZ2V0U2hhcGUxKCk/LnVzZXJEYXRhO1xyXG4gICAgICBsZXQgYm9keUI6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9jb250YWN0LmdldFNoYXBlMigpPy51c2VyRGF0YTtcclxuXHJcbiAgICAgIGlmICghYm9keUEgfHwgIWJvZHlCIHx8IGJvZHlBLnRyaWdnZXJpbmdzLmluY2x1ZGVzKGJvZHlCKSkgLy8gYWxyZWFkeSBlbnRlcmVkXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgYm9keUEudHJpZ2dlcmluZ3MucHVzaChib2R5Qik7XHJcbiAgICAgIGJvZHlCLnRyaWdnZXJpbmdzLnB1c2goYm9keUEpO1xyXG5cclxuICAgICAgbGV0IG1hbmlmb2xkOiBPSU1PLk1hbmlmb2xkID0gX2NvbnRhY3QuZ2V0TWFuaWZvbGQoKTtcclxuICAgICAgbGV0IHBvaW50czogT0lNTy5NYW5pZm9sZFBvaW50W10gPSBtYW5pZm9sZC5nZXRQb2ludHMoKTsgXHJcbiAgICAgIGxldCBub3JtYWw6IE9JTU8uVmVjMyA9IG1hbmlmb2xkLmdldE5vcm1hbCgpO1xyXG4gICAgICBsZXQgY29sbGlzaW9uTm9ybWFsOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMobm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueik7XHJcbiAgICAgIGxldCBjb2xsaXNpb25DZW50ZXJQb2ludDogVmVjdG9yMyA9IGJvZHlBLmNvbGxpc2lvbkNlbnRlclBvaW50KHBvaW50cywgbWFuaWZvbGQuZ2V0TnVtUG9pbnRzKCkpO1xyXG5cclxuICAgICAgYm9keUEuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuVFJJR0dFUl9FTlRFUiwgYm9keUIsIDAsIDAsIDAsIGNvbGxpc2lvbkNlbnRlclBvaW50LCBjb2xsaXNpb25Ob3JtYWwpKTtcclxuICAgICAgYm9keUIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuVFJJR0dFUl9FTlRFUiwgYm9keUEsIDAsIDAsIDAsIGNvbGxpc2lvbkNlbnRlclBvaW50LCBjb2xsaXNpb25Ob3JtYWwpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogVHJpZ2dlciBMZWF2aW5nRXZlbnQgQ2FsbGJhY2ssIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5IE9JTU8gUGh5c2ljcyB3aXRoaW4gdGhlaXIgY2FsY3VsYXRpb25zLlxyXG4gICAgKiBTaW5jZSB0aGUgZXZlbnQgZG9lcyBub3Qga25vdyB3aGljaCBib2R5IGlzIHRoZSB0cmlnZ2VyIGluaWF0b3IsIHRoZSBldmVudCBjYW4gYmUgbGlzdGVuZWQgdG9cclxuICAgICogb24gZWl0aGVyIHRoZSB0cmlnZ2VyIG9yIHRoZSB0cmlnZ2VyZWQuIChUaGlzIGlzIG9ubHkgcG9zc2libGUgd2l0aCB0aGUgRlVER0UgT0lNTyBGb3JrISlcclxuICAgICovXHJcbiAgICBwcml2YXRlIHRyaWdnZXJFeGl0KF9jb250YWN0OiBPSU1PLkNvbnRhY3QpOiB2b2lkIHtcclxuICAgICAgbGV0IGJvZHlBOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTEoKT8udXNlckRhdGE7XHJcbiAgICAgIGxldCBib2R5QjogQ29tcG9uZW50UmlnaWRib2R5ID0gX2NvbnRhY3QuZ2V0U2hhcGUyKCk/LnVzZXJEYXRhO1xyXG5cclxuICAgICAgaWYgKCFib2R5QSB8fCAhYm9keUIgfHwgIWJvZHlBLnRyaWdnZXJpbmdzLmluY2x1ZGVzKGJvZHlCKSkgLy8gYWxyZWFkeSBleGl0ZWRcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBib2R5QS50cmlnZ2VyaW5ncy5zcGxpY2UoYm9keUEuY29sbGlzaW9ucy5pbmRleE9mKGJvZHlCKSwgMSk7XHJcbiAgICAgIGJvZHlCLnRyaWdnZXJpbmdzLnNwbGljZShib2R5Qi5jb2xsaXNpb25zLmluZGV4T2YoYm9keUEpLCAxKTtcclxuXHJcbiAgICAgIGJvZHlBLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLlRSSUdHRVJfRVhJVCwgYm9keUIsIDAsIDAsIDApKTtcclxuICAgICAgYm9keUIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuVFJJR0dFUl9FWElULCBib2R5QSwgMCwgMCwgMCkpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKiBJbnRlcm5hbCBjbGFzcyBmb3IgaG9sZGluZyBkYXRhIGFib3V0IHBoeXNpY3MgZGVidWcgdmVydGljZXMuKi9cclxuICBleHBvcnQgY2xhc3MgUGh5c2ljc0RlYnVnVmVydGV4QnVmZmVyIHtcclxuICAgIHB1YmxpYyBnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuICAgIHB1YmxpYyBudW1WZXJ0aWNlczogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBhdHRyaWJzOiBBcnJheTxQaHlzaWNzRGVidWdWZXJ0ZXhBdHRyaWJ1dGU+O1xyXG4gICAgcHVibGljIGluZGljZXM6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgb2Zmc2V0czogQXJyYXk8bnVtYmVyPjtcclxuICAgIHB1YmxpYyBzdHJpZGU6IG51bWJlcjtcclxuICAgIHB1YmxpYyBidWZmZXI6IFdlYkdMQnVmZmVyO1xyXG4gICAgcHVibGljIGRhdGFMZW5ndGg6IG51bWJlcjtcclxuXHJcbiAgICAvKiogU2V0dXAgdGhlIHJlbmRlcmluZyBjb250ZXh0IGZvciB0aGlzIGJ1ZmZlciBhbmQgY3JlYXRlIHRoZSBhY3R1YWwgYnVmZmVyIGZvciB0aGlzIGNvbnRleHQuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3JlbmRlcmluZ0NvbnRleHQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpIHtcclxuICAgICAgdGhpcy5nbCA9IF9yZW5kZXJpbmdDb250ZXh0O1xyXG4gICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZpbGwgdGhlIGJvdW5kIGJ1ZmZlciB3aXRoIGRhdGEuIFVzZWQgYXQgYnVmZmVyIGluaXRpYWxpemF0aW9uICovXHJcbiAgICBwdWJsaWMgc2V0RGF0YShfYXJyYXk6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuYXR0cmlicyA9PSBudWxsKSB0aHJvdyBcInNldCBhdHRyaWJ1dGVzIGZpcnN0XCI7XHJcbiAgICAgIHRoaXMubnVtVmVydGljZXMgPSBfYXJyYXkubGVuZ3RoIC8gKHRoaXMuc3RyaWRlIC8gNCk7XHJcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy5idWZmZXIpO1xyXG4gICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoX2FycmF5KSwgdGhpcy5nbC5EWU5BTUlDX0RSQVcpO1xyXG4gICAgICAvL25vdCBuZWNlc3NhcnkgYW4gaW4gd2ViZ2wyIGFueW1vcmUgdG8gcmViaW5kIHRoZSBzYW1lIGxhc3QgYnVmZmVyICh3aGljaCBpcyBhY2hpZXZlZCBieSBnaXZpbmcgYSBudWxsIGJ1ZmZlciksIGFmdGVyIGJ1ZmZlciBpcyBjaGFuZ2VkLiBSZW1vdmVkIGl0IG9uIGFsbCBvdGhlciBvY2Nhc2lvbnNcclxuICAgICAgLy8gdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBudWxsKTsgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNldCBTaGFkZXIgQXR0cmlidXRlcyBpbmZvcm1hdGlvbnMgYnkgZ2V0dGluZyB0aGVpciBwb3NpdGlvbiBpbiB0aGUgc2hhZGVyLCBzZXR0aW5nIHRoZSBvZmZzZXQsIHN0cmlkZSBhbmQgc2l6ZS4gRm9yIGxhdGVyIHVzZSBpbiB0aGUgYmluZGluZyBwcm9jZXNzICovXHJcbiAgICBwdWJsaWMgc2V0QXR0cmlicyhfYXR0cmliczogQXJyYXk8UGh5c2ljc0RlYnVnVmVydGV4QXR0cmlidXRlPik6IHZvaWQge1xyXG4gICAgICB0aGlzLmF0dHJpYnMgPSBfYXR0cmlicztcclxuICAgICAgdGhpcy5vZmZzZXRzID0gW107XHJcbiAgICAgIHRoaXMuc3RyaWRlID0gMDtcclxuICAgICAgbGV0IG46IG51bWJlciA9IF9hdHRyaWJzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIHRoaXMub2Zmc2V0cy5wdXNoKHRoaXMuc3RyaWRlKTtcclxuICAgICAgICB0aGlzLnN0cmlkZSArPSBfYXR0cmlic1tpXS5mbG9hdDMyQ291bnQgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIDMyYml0IGZsb2F0IEJ5dGVzIGFyZSBhIGNvbnN0YW50IG9mIDRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIHNoYWRlciAqL1xyXG4gICAgcHVibGljIGxvYWRBdHRyaWJJbmRpY2VzKF9wcm9ncmFtOiBQaHlzaWNzRGVidWdTaGFkZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5pbmRpY2VzID0gX3Byb2dyYW0uZ2V0QXR0cmliSW5kaWNlcyh0aGlzLmF0dHJpYnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFbmFibGUgYSBhdHRyaWJ1dGUgaW4gYSBzaGFkZXIgZm9yIHRoaXMgY29udGV4dCwgKi9cclxuICAgIHB1YmxpYyBiaW5kQXR0cmlicygpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuaW5kaWNlcyA9PSBudWxsKSB0aHJvdyBcImluZGljZXMgYXJlIG5vdCBsb2FkZWRcIjtcclxuICAgICAgbGV0IG46IG51bWJlciA9IHRoaXMuYXR0cmlicy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy5idWZmZXIpOyAvL21ha2luZyB0aGUgYnVmZmVyIG9mIHRoaXMgY2xhc3MgdGhlIGN1cnJlbnQgYnVmZmVyXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICB0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRoaXMuaW5kaWNlc1tpXSk7IC8vZW5hYmxlIHRoZSBBdHRyaWJ1dGVcclxuICAgICAgICB0aGlzLmdsLnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5pbmRpY2VzW2ldLCB0aGlzLmF0dHJpYnNbaV0uZmxvYXQzMkNvdW50LCB0aGlzLmdsLkZMT0FULCBmYWxzZSwgdGhpcy5zdHJpZGUsIHRoaXMub2Zmc2V0c1tpXSk7IC8vY3JlYXRlcyBhIHBvaW50ZXIgYW5kIHN0cnVjdHVyZSBmb3IgdGhpcyBhdHRyaWJ1dGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIGNsYXNzIGZvciBob2xkaW5nIGRhdGEgYWJvdXQgUGh5c2ljc0RlYnVnVmVydGV4QnVmZmVycyAqL1xyXG4gIGV4cG9ydCBjbGFzcyBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlciB7XHJcbiAgICBwdWJsaWMgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XHJcbiAgICBwdWJsaWMgYnVmZmVyOiBXZWJHTEJ1ZmZlcjtcclxuICAgIHB1YmxpYyBjb3VudDogbnVtYmVyO1xyXG5cclxuICAgIC8qKiBTZXR1cCB0aGUgcmVuZGVyaW5nIGNvbnRleHQgZm9yIHRoaXMgYnVmZmVyIGFuZCBjcmVhdGUgdGhlIGFjdHVhbCBidWZmZXIgZm9yIHRoaXMgY29udGV4dC4gKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmVuZGVyaW5nQ29udGV4dDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCkge1xyXG4gICAgICB0aGlzLmdsID0gX3JlbmRlcmluZ0NvbnRleHQ7XHJcbiAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRmlsbCB0aGUgYm91bmQgYnVmZmVyIHdpdGggZGF0YSBhbW91bnQuIFVzZWQgYXQgYnVmZmVyIGluaXRpYWxpemF0aW9uICovXHJcbiAgICBwdWJsaWMgc2V0RGF0YShfYXJyYXk6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcclxuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuYnVmZmVyKTtcclxuICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG5ldyBJbnQxNkFycmF5KF9hcnJheSksIHRoaXMuZ2wuRFlOQU1JQ19EUkFXKTtcclxuICAgICAgdGhpcy5jb3VudCA9IF9hcnJheS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBhY3R1YWwgRHJhd0NhbGwgZm9yIHBoeXNpY3NEZWJ1Z0RyYXcgQnVmZmVycy4gVGhpcyBpcyB3aGVyZSB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGVidWcgaXMgYWN0dWFsbHkgZHJhd24uICovXHJcbiAgICBwdWJsaWMgZHJhdyhfbW9kZTogbnVtYmVyID0gdGhpcy5nbC5UUklBTkdMRVMsIF9jb3VudDogbnVtYmVyID0gLTEpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuYnVmZmVyKTtcclxuICAgICAgdGhpcy5nbC5kcmF3RWxlbWVudHMoX21vZGUsIF9jb3VudCA+PSAwID8gX2NvdW50IDogdGhpcy5jb3VudCwgdGhpcy5nbC5VTlNJR05FRF9TSE9SVCwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogSW50ZXJuYWwgY2xhc3MgZm9yIG1hbmFnaW5nIGRhdGEgYWJvdXQgd2ViR0wgQXR0cmlidXRlcyAqL1xyXG4gIGV4cG9ydCBjbGFzcyBQaHlzaWNzRGVidWdWZXJ0ZXhBdHRyaWJ1dGUge1xyXG4gICAgcHVibGljIGZsb2F0MzJDb3VudDogbnVtYmVyO1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2Zsb2F0MzJDb3VudDogbnVtYmVyLCBfbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmZsb2F0MzJDb3VudCA9IF9mbG9hdDMyQ291bnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogSW50ZXJuYWwgY2xhc3MgZm9yIFNoYWRlcnMgdXNlZCBvbmx5IGJ5IHRoZSBwaHlzaWNzIGRlYnVnRHJhdyAqL1xyXG4gIGV4cG9ydCBjbGFzcyBQaHlzaWNzRGVidWdTaGFkZXIge1xyXG4gICAgcHVibGljIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xyXG4gICAgcHVibGljIHByb2dyYW06IFdlYkdMUHJvZ3JhbTtcclxuICAgIHB1YmxpYyB2ZXJ0ZXhTaGFkZXI6IFdlYkdMU2hhZGVyO1xyXG4gICAgcHVibGljIGZyYWdtZW50U2hhZGVyOiBXZWJHTFNoYWRlcjtcclxuICAgIHB1YmxpYyB1bmlmb3JtTG9jYXRpb25NYXA6IE1hcDxzdHJpbmcsIFdlYkdMVW5pZm9ybUxvY2F0aW9uPjtcclxuXHJcbiAgICAvKiogSW50cm9kdWNlIHRoZSBGVURHRSBSZW5kZXJpbmcgQ29udGV4dCB0byB0aGlzIGNsYXNzLCBjcmVhdGluZyBhIHByb2dyYW0gYW5kIHZlcnRleC9mcmFnbWVudCBzaGFkZXIgaW4gdGhpcyBjb250ZXh0ICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3JlbmRlcmluZ0NvbnRleHQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpIHtcclxuICAgICAgdGhpcy5nbCA9IF9yZW5kZXJpbmdDb250ZXh0O1xyXG4gICAgICB0aGlzLnByb2dyYW0gPSB0aGlzLmdsLmNyZWF0ZVByb2dyYW0oKTtcclxuICAgICAgdGhpcy52ZXJ0ZXhTaGFkZXIgPSB0aGlzLmdsLmNyZWF0ZVNoYWRlcih0aGlzLmdsLlZFUlRFWF9TSEFERVIpO1xyXG4gICAgICB0aGlzLmZyYWdtZW50U2hhZGVyID0gdGhpcy5nbC5jcmVhdGVTaGFkZXIodGhpcy5nbC5GUkFHTUVOVF9TSEFERVIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUYWtlIGdsc2wgc2hhZGVycyBhcyBzdHJpbmdzIGFuZCBjb21waWxlIHRoZW0sIGF0dGFjaGluZyB0aGUgY29tcGlsZWQgc2hhZGVycyB0byBhIHByb2dyYW0gdGhhdHMgdXNlZCBieSB0aGlzIHJlbmRlcmluZyBjb250ZXh0LiAqL1xyXG4gICAgcHVibGljIGNvbXBpbGUoX3ZlcnRleFNvdXJjZTogc3RyaW5nLCBfZnJhZ21lbnRTb3VyY2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICB0aGlzLnVuaWZvcm1Mb2NhdGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBXZWJHTFVuaWZvcm1Mb2NhdGlvbj4oKTtcclxuICAgICAgdGhpcy5jb21waWxlU2hhZGVyKHRoaXMudmVydGV4U2hhZGVyLCBfdmVydGV4U291cmNlKTtcclxuICAgICAgdGhpcy5jb21waWxlU2hhZGVyKHRoaXMuZnJhZ21lbnRTaGFkZXIsIF9mcmFnbWVudFNvdXJjZSk7XHJcbiAgICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHRoaXMucHJvZ3JhbSwgdGhpcy52ZXJ0ZXhTaGFkZXIpO1xyXG4gICAgICB0aGlzLmdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHRoaXMuZnJhZ21lbnRTaGFkZXIpO1xyXG4gICAgICB0aGlzLmdsLmxpbmtQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICAgIGlmICghdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSwgdGhpcy5nbC5MSU5LX1NUQVRVUykpIHsgIC8vbWFrZSBzdXJlIHRoZSBsaW5raW5nIHdvcmtlZCwgc28gdGhlIHByb2dyYW0gaXMgdmFsaWQsIGFuZCBzaGFkZXJzIGFyZSB3b3JraW5nXHJcbiAgICAgICAgRGVidWcubG9nKHRoaXMuZ2wuZ2V0UHJvZ3JhbUluZm9Mb2codGhpcy5wcm9ncmFtKSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5nbC52YWxpZGF0ZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcclxuICAgICAgaWYgKCF0aGlzLmdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLCB0aGlzLmdsLlZBTElEQVRFX1NUQVRVUykpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRVJST1IgdmFsaWRhdGluZyBwcm9ncmFtIVwiLCB0aGlzLmdsLmdldFByb2dyYW1JbmZvTG9nKHRoaXMucHJvZ3JhbSkpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgaW5kZXggb2YgYSBhdHRyaWJ1dGUgaW4gYSBzaGFkZXIgaW4gdGhpcyBwcm9ncmFtICovXHJcbiAgICBwdWJsaWMgZ2V0QXR0cmliSW5kZXgoX25hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgX25hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgdGhlIGxvY2F0aW9uIG9mIGEgdW5pZm9ybSBpbiBhIHNoYWRlciBpbiB0aGlzIHByb2dyYW0gKi9cclxuICAgIHB1YmxpYyBnZXRVbmlmb3JtTG9jYXRpb24oX25hbWU6IHN0cmluZyk6IFdlYkdMVW5pZm9ybUxvY2F0aW9uIHtcclxuICAgICAgaWYgKHRoaXMudW5pZm9ybUxvY2F0aW9uTWFwLmhhcyhfbmFtZSkpIHJldHVybiB0aGlzLnVuaWZvcm1Mb2NhdGlvbk1hcC5nZXQoX25hbWUpO1xyXG4gICAgICBsZXQgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCBfbmFtZSk7XHJcbiAgICAgIHRoaXMudW5pZm9ybUxvY2F0aW9uTWFwLnNldChfbmFtZSwgbG9jYXRpb24pO1xyXG4gICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdldCBhbGwgaW5kaWNlcyBmb3IgZXZlcnkgYXR0cmlidXRlIGluIHRoZSBzaGFkZXJzIG9mIHRoaXMgcHJvZ3JhbSAqL1xyXG4gICAgcHVibGljIGdldEF0dHJpYkluZGljZXMoX2F0dHJpYnM6IEFycmF5PFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZT4pOiBBcnJheTxudW1iZXI+IHtcclxuICAgICAgbGV0IGluZGljZXM6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuICAgICAgX2F0dHJpYnMuZm9yRWFjaChfdmFsdWUgPT4ge1xyXG4gICAgICAgIGluZGljZXMucHVzaCh0aGlzLmdldEF0dHJpYkluZGV4KF92YWx1ZS5uYW1lKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gaW5kaWNlcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGVsbCB0aGUgRlVER0UgUmVuZGVyaW5nIENvbnRleHQgdG8gdXNlIHRoaXMgcHJvZ3JhbSB0byBkcmF3LiAqL1xyXG4gICAgcHVibGljIHVzZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvbXBpbGUgYSBzaGFkZXIgb3V0IG9mIGEgc3RyaW5nIGFuZCB2YWxpZGF0ZSBpdC4gKi9cclxuICAgIHB1YmxpYyBjb21waWxlU2hhZGVyKF9zaGFkZXI6IFdlYkdMU2hhZGVyLCBfc291cmNlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nbC5zaGFkZXJTb3VyY2UoX3NoYWRlciwgX3NvdXJjZSk7XHJcbiAgICAgIHRoaXMuZ2wuY29tcGlsZVNoYWRlcihfc2hhZGVyKTtcclxuICAgICAgaWYgKCF0aGlzLmdsLmdldFNoYWRlclBhcmFtZXRlcihfc2hhZGVyLCB0aGlzLmdsLkNPTVBJTEVfU1RBVFVTKSkge1xyXG4gICAgICAgIERlYnVnLmxvZyh0aGlzLmdsLmdldFNoYWRlckluZm9Mb2coX3NoYWRlcikpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogSW50ZXJuYWwgQ2xhc3MgdXNlZCB0byBkcmF3IGRlYnVnSW5mb3JtYXRpb25zIGFib3V0IHRoZSBwaHlzaWNzIHNpbXVsYXRpb24gb250byB0aGUgcmVuZGVyQ29udGV4dC4gTm8gdXNlciBpbnRlcmFjdGlvbiBuZWVkZWQuIFxyXG4gICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVIDIwMjAgLy9CYXNlZCBvbiBPaW1vUGh5c2ljcyBIYXhlIERlYnVnRHJhd0RlbW8gXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBoeXNpY3NEZWJ1Z0RyYXcgZXh0ZW5kcyBSZW5kZXJXZWJHTCB7XHJcbiAgICBwdWJsaWMgb2ltb0RlYnVnRHJhdzogT0lNTy5EZWJ1Z0RyYXc7IC8vdGhlIG9yaWdpbmFsIHBoeXNpY3MgZW5naW5lIGRlYnVnRHJhdyBjbGFzcyByZWNlaXZpbmcgY2FsbHMgZnJvbSB0aGUgb2ltb1BoeXNpY3MuV29ybGQsIGFuZCBwcm92aWRpbmcgaW5mb3JtYXRpb25zIGluIGZvcm0gb2YgcG9pbnRzL2xpbmVzL3RyaWFuZ2xlcyB3aGF0IHRoZSBwaHlzaWNzIHdvcmxkIGxvb2tzIGxpa2VcclxuICAgIHB1YmxpYyBzdHlsZTogT0lNTy5EZWJ1Z0RyYXdTdHlsZTsgLy9jb2xvcnMgb2YgdGhlIGRlYnVnIGluZm9ybWF0aW9ucywgdW5jaGFuZ2VkIGluIEZVREdFIGludGVncmF0aW9uLCBiYXNpY2FsbHkgY29sb3JpbmcgdGhpbmdzIGxpa2Ugc2xlZXBpbmcvYWN0aXZlIHJiJ3MgZGlmZmVyZW50bHksIGpvaW50cyB3aGl0ZSBhbmQgc3VjaC4gTm8gbmVlZCB0byBoYXZlIHVzZXJzIGNoYW5nZSBhbnl0aGluZy5cclxuICAgIHB1YmxpYyBnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuXHJcbiAgICBwdWJsaWMgcHJvZ3JhbTogV2ViR0xQcm9ncmFtOyAvL3Byb2dyYW0gdGhhdCBpcyB1c2VkIGluIHRoZSBGVURHRSByZW5kZXJpbmcgY29udGV4dCBjb250YWluaW5nIHNoYWRlcnMgYW5kIHVzZSBpbmZvcm1hdGlvbnMgZm9yIHRoZSBjb250ZXh0IHRvIGtub3cgaG93IHRvIGRyYXdcclxuICAgIHB1YmxpYyBzaGFkZXI6IFBoeXNpY3NEZWJ1Z1NoYWRlcjtcclxuXHJcbiAgICAvL0J1ZmZlcnMgZm9yIHBvaW50cy9saW5lcy90cmlhbmdsZXMuIEluZGV4IEJ1ZmZlciBmb3IgdGhlIGFtb3VudCBvZiBkcmF3Q2FsbHMgYW5kIFZlcnRleCBCdWZmZXIgZm9yIHRoZSBpbmZvcm1hdGlvbnNcclxuICAgIHB1YmxpYyBwb2ludFZCTzogUGh5c2ljc0RlYnVnVmVydGV4QnVmZmVyO1xyXG4gICAgcHVibGljIHBvaW50SUJPOiBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcjtcclxuXHJcbiAgICBwdWJsaWMgbGluZVZCTzogUGh5c2ljc0RlYnVnVmVydGV4QnVmZmVyO1xyXG4gICAgcHVibGljIGxpbmVJQk86IFBoeXNpY3NEZWJ1Z0luZGV4QnVmZmVyO1xyXG5cclxuICAgIHB1YmxpYyB0cmlWQk86IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcjtcclxuICAgIHB1YmxpYyB0cmlJQk86IFBoeXNpY3NEZWJ1Z0luZGV4QnVmZmVyO1xyXG5cclxuICAgIHB1YmxpYyBwb2ludERhdGE6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgcG9pbnRJYm9EYXRhOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIG51bVBvaW50RGF0YTogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBsaW5lRGF0YTogQXJyYXk8bnVtYmVyPjtcclxuICAgIHB1YmxpYyBsaW5lSWJvRGF0YTogQXJyYXk8bnVtYmVyPjtcclxuICAgIHB1YmxpYyBudW1MaW5lRGF0YTogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyB0cmlEYXRhOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIHRyaUlib0RhdGE6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgbnVtVHJpRGF0YTogbnVtYmVyO1xyXG5cclxuICAgIC8qKiBDcmVhdGluZyB0aGUgZGVidWcgZm9yIHBoeXNpY3MgaW4gRlVER0UuIFRlbGwgaXQgdG8gZHJhdyBvbmx5IHdpcmVmcmFtZSBvYmplY3RzLCBzaW5jZSBGVURHRSBpcyBoYW5kbGluZyByZW5kZXJpbmcgb2YgdGhlIG9iamVjdHMgYmVzaWRlcyBwaHlzaWNzLiBcclxuICAgICAqIE92ZXJyaWRlIE9pbW9QaHlzaWNzIEZ1bmN0aW9ucyB3aXRoIG93biByZW5kZXJpbmcuIEluaXRpYWxpemUgYnVmZmVycyBhbmQgY29ubmVjdCB0aGVtIHdpdGggdGhlIGNvbnRleHQgZm9yIGxhdGVyIHVzZS4gKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgIHRoaXMuc3R5bGUgPSBuZXcgT0lNTy5EZWJ1Z0RyYXdTdHlsZSgpO1xyXG4gICAgICB0aGlzLm9pbW9EZWJ1Z0RyYXcgPSBuZXcgT0lNTy5EZWJ1Z0RyYXcoKTtcclxuICAgICAgdGhpcy5vaW1vRGVidWdEcmF3LndpcmVmcmFtZSA9IHRydWU7IC8vVHJpYW5nbGUgUmVuZGVyaW5nIGlzIGhhbmRsZWQgYnkgRlVER0Ugc28sIG9ubHkgdGhlIHBoeXNpY3MgbGluZXMvcG9pbnRzIG5lZWQgdG8gYmUgcmVuZGVyZWQsIGFsdGhvdWdoIHRyaWFuZ2xlIGlzIHN0aWxsIGltcGxlbWVudGVkXHJcblxyXG4gICAgICB0aGlzLmdsID0gUmVuZGVyV2ViR0wuY3JjMztcclxuICAgICAgdGhpcy5pbml0aWFsaXplT3ZlcnJpZGUoKTtcclxuICAgICAgdGhpcy5zaGFkZXIgPSBuZXcgUGh5c2ljc0RlYnVnU2hhZGVyKHRoaXMuZ2wpO1xyXG4gICAgICB0aGlzLnNoYWRlci5jb21waWxlKHRoaXMudmVydGV4U2hhZGVyU291cmNlKCksIHRoaXMuZnJhZ21lbnRTaGFkZXJTb3VyY2UoKSk7XHJcblxyXG4gICAgICB0aGlzLmluaXRpYWxpemVCdWZmZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJlY2VpdmUgdGhlIGN1cnJlbnQgRGVidWdNb2RlIGZyb20gdGhlIHBoeXNpY3Mgc2V0dGluZ3MgYW5kIHNldCB0aGUgT2ltb1BoeXNpY3MuRGVidWdEcmF3IGJvb2xlYW5zIHRvIHNob3cgb25seSBjZXJ0YWluIGluZm9ybWF0aW9ucy5cclxuICAgICAqIE5lZWRlZCBzaW5jZSBzb21lIGRlYnVnIGluZm9ybWF0aW9ucyBleGNsdWRlIG90aGVycywgYW5kIGNhbid0IGJlIGRyYXduIGF0IHRoZSBzYW1lIHRpbWUsIGJ5IE9pbW9QaHlzaWNzLiBBbmQgZm9yIHVzZXJzIGl0IHByb3ZpZGVzIG1vcmUgcmVhZGFiaWxpdHlcclxuICAgICAqIHRvIGRlYnVnIG9ubHkgd2hhdCB0aGV5IG5lZWQgYW5kIGlzIGNvbW1vbmx5IGRlYnVnZ2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0RGVidWdNb2RlKF9tb2RlOiBQSFlTSUNTX0RFQlVHTU9ERSA9IFBIWVNJQ1NfREVCVUdNT0RFLk5PTkUpOiB2b2lkIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXHJcbiAgICAgIGxldCBkcmF3ID0geyBkcmF3QWFiYnM6IGZhbHNlLCBkcmF3QmFzZXM6IGZhbHNlLCBkcmF3QnZoOiBmYWxzZSwgZHJhd0NvbnRhY3RCYXNlczogZmFsc2UsIGRyYXdDb250YWN0czogZmFsc2UsIGRyYXdKb2ludExpbWl0czogZmFsc2UsIGRyYXdKb2ludHM6IGZhbHNlLCBkcmF3UGFpcnM6IGZhbHNlLCBkcmF3U2hhcGVzOiBmYWxzZSB9O1xyXG5cclxuICAgICAgc3dpdGNoIChfbW9kZSkge1xyXG4gICAgICAgIGNhc2UgUEhZU0lDU19ERUJVR01PREUuQ09MTElERVJTOiAvL0NvbGxpZGVycyBhbmQgQmFzZXNcclxuICAgICAgICAgIGRyYXcuZHJhd0Jhc2VzID0gZHJhdy5kcmF3U2hhcGVzID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUEhZU0lDU19ERUJVR01PREUuSk9JTlRTX0FORF9DT0xMSURFUjogLy9Db2xsaWRlcnMgYW5kIGpvaW50c1xyXG4gICAgICAgICAgZHJhdy5kcmF3Sm9pbnRzID0gZHJhdy5kcmF3Sm9pbnRMaW1pdHMgPSBkcmF3LmRyYXdTaGFwZXMgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSFlTSUNTX0RFQlVHTU9ERS5QSFlTSUNfT0JKRUNUU19PTkxZOiAvL1BoeXNpY3MgT2JqZWN0cyBvbmx5LCBzaG93cyBzYW1lIGFzIENvbGxpZGVyIC8gSm9pbnRzIGJ1dCBhbHNvIGhpZGluZyBldmVyeSBvdGhlciBmdWRnZSBvYmplY3RcclxuICAgICAgICAgIGRyYXcuZHJhd0Jhc2VzID0gZHJhdy5kcmF3Sm9pbnRMaW1pdHMgPSBkcmF3LmRyYXdKb2ludHMgPSBkcmF3LmRyYXdTaGFwZXMgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSFlTSUNTX0RFQlVHTU9ERS5DT05UQUNUUzogLy9Db250YWN0c1xyXG4gICAgICAgICAgZHJhdy5kcmF3QmFzZXMgPSBkcmF3LmRyYXdDb250YWN0QmFzZXMgPSBkcmF3LmRyYXdDb250YWN0cyA9IGRyYXcuZHJhd1BhaXJzID0gZHJhdy5kcmF3U2hhcGVzID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUEhZU0lDU19ERUJVR01PREUuQk9VTkRJTkdfQk9YRVM6IC8vQm91bmRpbmcgQm94IC8gQnJvYWRwaGFzZSBCdmggLyBCYXNlc1xyXG4gICAgICAgICAgZHJhdy5kcmF3QWFiYnMgPSBkcmF3LmRyYXdCYXNlcyA9IGRyYXcuZHJhd0J2aCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMub2ltb0RlYnVnRHJhdywgZHJhdyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENyZWF0aW5nIHRoZSBlbXB0eSByZW5kZXIgYnVmZmVycy4gRGVmaW5pbmcgdGhlIGF0dHJpYnV0ZXMgdXNlZCBpbiBzaGFkZXJzLlxyXG4gICAgICogTmVlZHMgdG8gY3JlYXRlIGVtcHR5IGJ1ZmZlcnMgdG8gYWxyZWFkeSBoYXZlIHRoZW0gcmVhZHkgdG8gZHJhdyBsYXRlciBvbiwgbGlua2luZyBpcyBvbmx5IHBvc3NpYmxlIHdpdGggZXhpc3RpbmcgYnVmZmVycy4gKi9cclxuICAgIHB1YmxpYyBpbml0aWFsaXplQnVmZmVycygpOiB2b2lkIHtcclxuICAgICAgbGV0IGF0dHJpYnM6IEFycmF5PFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZT4gPSBbXHJcbiAgICAgICAgbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZSgzLCBcImFQb3NpdGlvblwiKSxcclxuICAgICAgICBuZXcgUGh5c2ljc0RlYnVnVmVydGV4QXR0cmlidXRlKDMsIFwiYU5vcm1hbFwiKSxcclxuICAgICAgICBuZXcgUGh5c2ljc0RlYnVnVmVydGV4QXR0cmlidXRlKDMsIFwiYUNvbG9yXCIpXHJcbiAgICAgIF07XHJcblxyXG4gICAgICB0aGlzLnBvaW50VkJPID0gbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy5wb2ludElCTyA9IG5ldyBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy5wb2ludFZCTy5zZXRBdHRyaWJzKGF0dHJpYnMpO1xyXG4gICAgICB0aGlzLnBvaW50VkJPLmxvYWRBdHRyaWJJbmRpY2VzKHRoaXMuc2hhZGVyKTtcclxuICAgICAgdGhpcy5saW5lVkJPID0gbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy5saW5lSUJPID0gbmV3IFBoeXNpY3NEZWJ1Z0luZGV4QnVmZmVyKHRoaXMuZ2wpO1xyXG4gICAgICB0aGlzLmxpbmVWQk8uc2V0QXR0cmlicyhhdHRyaWJzKTtcclxuICAgICAgdGhpcy5saW5lVkJPLmxvYWRBdHRyaWJJbmRpY2VzKHRoaXMuc2hhZGVyKTtcclxuICAgICAgdGhpcy50cmlWQk8gPSBuZXcgUGh5c2ljc0RlYnVnVmVydGV4QnVmZmVyKHRoaXMuZ2wpO1xyXG4gICAgICB0aGlzLnRyaUlCTyA9IG5ldyBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy50cmlWQk8uc2V0QXR0cmlicyhhdHRyaWJzKTtcclxuICAgICAgdGhpcy50cmlWQk8ubG9hZEF0dHJpYkluZGljZXModGhpcy5zaGFkZXIpO1xyXG5cclxuICAgICAgdGhpcy5jbGVhckJ1ZmZlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQmVmb3JlIE9pbW9QaHlzaWNzLndvcmxkIGlzIGZpbGxpbmcgdGhlIGRlYnVnLiBNYWtlIHN1cmUgdGhlIGJ1ZmZlcnMgYXJlIHJlc2V0LiBBbHNvIHJlY2VpdmluZyB0aGUgZGVidWdNb2RlIGZyb20gc2V0dGluZ3MgYW5kIHVwZGF0aW5nIHRoZSBjdXJyZW50IHByb2plY3Rpb24gZm9yIHRoZSB2ZXJ0ZXhTaGFkZXIuICovXHJcbiAgICBwdWJsaWMgY2xlYXJCdWZmZXJzKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmdsLmxpbmVXaWR0aCgyLjApOyAvL0RvZXMgbm90IGFmZmVjdCBhbnl0aGluZyBiZWNhdXNlIGxpbmVXaWR0aCBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgYnkgTWljcm9zb2Z0IEVkZ2UgYW5kIEZVREdFIGlzIG9wdGltaXplZCBmb3IgQ2hyb21lXHJcblxyXG4gICAgICB0aGlzLnBvaW50RGF0YSA9IFtdOyAvL1Jlc2V0dGluZyB0aGUgZGF0YSB0byBiZSBmaWxsZWQgYWdhaW5cclxuICAgICAgdGhpcy5saW5lRGF0YSA9IFtdO1xyXG4gICAgICB0aGlzLnRyaURhdGEgPSBbXTtcclxuXHJcbiAgICAgIHRoaXMubnVtUG9pbnREYXRhID0gMDsgLy9SZXNldHRpbmcgdGhlIGFtb3VudCBvZiBkYXRhIGNhbGxzXHJcbiAgICAgIHRoaXMubnVtTGluZURhdGEgPSAwO1xyXG4gICAgICB0aGlzLm51bVRyaURhdGEgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBZnRlciBPaW1vUGh5c2ljcy53b3JsZCBmaWxsZWQgdGhlIGRlYnVnLiBSZW5kZXJpbmcgY2FsbHMuIFNldHRpbmcgdGhpcyBwcm9ncmFtIHRvIGJlIHVzZWQgYnkgdGhlIEZVREdFIHJlbmRlcmluZyBjb250ZXh0LiBBbmQgZHJhdyBlYWNoIHVwZGF0ZWQgYnVmZmVyIGFuZCByZXNldHRpbmcgdGhlbS4gKi9cclxuICAgIHB1YmxpYyBkcmF3QnVmZmVycygpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zaGFkZXIudXNlKCk7XHJcbiAgICAgIGxldCBwcm9qZWN0aW9uOiBGbG9hdDMyQXJyYXkgPSBQaHlzaWNzLm1haW5DYW0ubXR4V29ybGRUb1ZpZXcuZ2V0KCk7XHJcbiAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLnNoYWRlci5nZXRVbmlmb3JtTG9jYXRpb24oXCJ1X210eE1lc2hUb1ZpZXdcIiksIGZhbHNlLCBwcm9qZWN0aW9uKTtcclxuXHJcblxyXG4gICAgICBpZiAodGhpcy5udW1Qb2ludERhdGEgPiAwKSB7XHJcbiAgICAgICAgdGhpcy5wb2ludElib0RhdGEgPSBbXTsgIC8vQnVmZmVyIHNpemUgbWF0Y2hpbmcgdG8gd2hhdHMgbmVlZGVkXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMubnVtUG9pbnREYXRhOyBpKyspIHtcclxuICAgICAgICAgIHRoaXMucG9pbnRJYm9EYXRhLnB1c2goaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9pbnRJQk8uc2V0RGF0YSh0aGlzLnBvaW50SWJvRGF0YSk7IC8vU2V0IEluZGV4IGJ1ZmZlciB0byBjb3JyZWN0IHNpemVcclxuICAgICAgICB0aGlzLnBvaW50VkJPLnNldERhdGEodGhpcy5wb2ludERhdGEpOyAvL1NldCBWZXJ0ZXggQnVmZmVyIHRvIGN1cnJlbnQgRGF0YVxyXG4gICAgICAgIHRoaXMucG9pbnRWQk8uYmluZEF0dHJpYnMoKTtcclxuICAgICAgICB0aGlzLnBvaW50SUJPLmRyYXcodGhpcy5nbC5QT0lOVFMsIHRoaXMubnVtUG9pbnREYXRhKTsgLy9UaGUgYWN0dWFsIGRyYXcgY2FsbCBmb3IgZWFjaCBpbmRleCBpbiBpYm9cclxuICAgICAgICB0aGlzLm51bVBvaW50RGF0YSA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubnVtTGluZURhdGEgPiAwKSB7XHJcbiAgICAgICAgdGhpcy5saW5lSWJvRGF0YSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bUxpbmVEYXRhOyBpKyspIHtcclxuICAgICAgICAgIHRoaXMubGluZUlib0RhdGEucHVzaChpICogMik7XHJcbiAgICAgICAgICB0aGlzLmxpbmVJYm9EYXRhLnB1c2goaSAqIDIgKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saW5lSUJPLnNldERhdGEodGhpcy5saW5lSWJvRGF0YSk7XHJcbiAgICAgICAgdGhpcy5saW5lVkJPLnNldERhdGEodGhpcy5saW5lRGF0YSk7XHJcbiAgICAgICAgdGhpcy5saW5lVkJPLmJpbmRBdHRyaWJzKCk7XHJcbiAgICAgICAgdGhpcy5saW5lSUJPLmRyYXcodGhpcy5nbC5MSU5FUywgdGhpcy5udW1MaW5lRGF0YSAqIDIpO1xyXG4gICAgICAgIHRoaXMubnVtTGluZURhdGEgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm51bVRyaURhdGEgPiAwKSB7XHJcbiAgICAgICAgdGhpcy50cmlJYm9EYXRhID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMubnVtVHJpRGF0YTsgaSsrKSB7XHJcbiAgICAgICAgICB0aGlzLnRyaUlib0RhdGEucHVzaChpICogMyk7XHJcbiAgICAgICAgICB0aGlzLnRyaUlib0RhdGEucHVzaChpICogMyArIDEpO1xyXG4gICAgICAgICAgdGhpcy50cmlJYm9EYXRhLnB1c2goaSAqIDMgKyAyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50cmlJQk8uc2V0RGF0YSh0aGlzLnRyaUlib0RhdGEpO1xyXG4gICAgICAgIHRoaXMudHJpVkJPLnNldERhdGEodGhpcy50cmlEYXRhKTtcclxuICAgICAgICB0aGlzLnRyaVZCTy5iaW5kQXR0cmlicygpO1xyXG4gICAgICAgIHRoaXMudHJpSUJPLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsIHRoaXMubnVtVHJpRGF0YSAqIDMpO1xyXG4gICAgICAgIHRoaXMubnVtVHJpRGF0YSA9IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogRHJhd2luZyB0aGUgcmF5IGludG8gdGhlIGRlYnVnRHJhdyBDYWxsLiBCeSB1c2luZyB0aGUgb3ZlcndyaXR0ZW4gbGluZSByZW5kZXJpbmcgZnVuY3Rpb25zIGFuZCBkcmF3aW5nIGEgcG9pbnQgKHBvaW50U2l6ZSBkZWZpbmVkIGluIHRoZSBzaGFkZXIpIGF0IHRoZSBlbmQgb2YgdGhlIHJheS4gKi9cclxuICAgIHB1YmxpYyBkZWJ1Z1JheShfb3JpZ2luOiBWZWN0b3IzLCBfZW5kOiBWZWN0b3IzLCBfY29sb3I6IENvbG9yKTogdm9pZCB7XHJcbiAgICAgIHRoaXMub2ltb0RlYnVnRHJhdy5saW5lKG5ldyBPSU1PLlZlYzMoX29yaWdpbi54LCBfb3JpZ2luLnksIF9vcmlnaW4ueiksIG5ldyBPSU1PLlZlYzMoX2VuZC54LCBfZW5kLnksIF9lbmQueiksIG5ldyBPSU1PLlZlYzMoX2NvbG9yLnIsIF9jb2xvci5nLCBfY29sb3IuYikpO1xyXG4gICAgICB0aGlzLm9pbW9EZWJ1Z0RyYXcucG9pbnQobmV3IE9JTU8uVmVjMyhfZW5kLngsIF9lbmQueSwgX2VuZC56KSwgbmV3IE9JTU8uVmVjMyhfY29sb3IuciwgX2NvbG9yLmcsIF9jb2xvci5iKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE92ZXJyaWRpbmcgdGhlIGV4aXN0aW5nIGZ1bmN0aW9ucyBmcm9tIE9pbW9QaHlzaWNzLkRlYnVnRHJhdyB3aXRob3V0IGFjdHVhbGx5IGluaGVyaXQgZnJvbSB0aGUgY2xhc3MsIHRvIGF2b2lkIGNvbXBpbGVyIHByb2JsZW1zLiBcclxuICAgICAqIE92ZXJyaWRpbmcgdGhlbSB0byByZWNlaXZlIGRlYnVnSW5mb3JtYXRpb25zIGluIHRoZSBmb3JtYXQgdGhlIHBoeXNpYyBlbmdpbmUgcHJvdmlkZXMgdGhlbSBidXQgaGFuZGxpbmcgdGhlIHJlbmRlcmluZyBpbiB0aGUgZnVkZ2UgY29udGV4dC4gKi9cclxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZU92ZXJyaWRlKCk6IHZvaWQge1xyXG4gICAgICAvL092ZXJyaWRlIHBvaW50L2xpbmUvdHJpYW5nbGUgZnVuY3Rpb25zIG9mIE9pbW9QaHlzaWNzIHdoaWNoIGFyZSB1c2VkIHRvIGRyYXcgd2lyZWZyYW1lcyBvZiBvYmplY3RzLCBsaW5lcyBvZiByYXljYXN0cyBvciB0cmlhbmdsZXMgd2hlbiB0aGUgb2JqZWN0cyBhcmUgcmVuZGVyZWQgYnkgdGhlIHBoeXNpY3Mgbm90IEZVREdFICh1bnVzZWQpXHJcblxyXG4gICAgICBPSU1PLkRlYnVnRHJhdy5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiAoX3Y6IE9JTU8uVmVjMywgX2NvbG9yOiBPSU1PLlZlYzMpOiB2b2lkIHtcclxuICAgICAgICBsZXQgZGVidWdXcmFwcGVyOiBQaHlzaWNzRGVidWdEcmF3ID0gUGh5c2ljcy5kZWJ1Z0RyYXc7IC8vR2V0IHRoZSBjdXN0b20gcGh5c2ljcyBkZWJ1ZyBjbGFzcyB0byBoYXZlIGFjY2VzcyB0byB0aGUgZGF0YS5cclxuICAgICAgICBpZiAoUGh5c2ljcy5tYWluQ2FtICE9IG51bGwpIHsgLy9vbmx5IGFjdCB3aGVuIHRoZXJlIGlzIGEgY2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nXHJcbiAgICAgICAgICBsZXQgZGF0YTogQXJyYXk8TnVtYmVyPiA9IGRlYnVnV3JhcHBlci5wb2ludERhdGE7IC8vZ2V0IHRoZSBhbHJlYWR5IHdyaXR0ZW4gYnVmZmVyIGluZm9ybWF0aW9uc1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF92LngsIF92LnksIF92LnopOyAvL0Nvb3JkaW5hdGVzIG9mIHRoZSBwb2ludFxyXG4gICAgICAgICAgZGF0YS5wdXNoKDAsIDAsIDApOyAvL1BvaW50IE5vcm1hbHMgLSBFbXB0eSBzaW5jZSBpdCdzIG5vdCBhIHBvbHlnb25cclxuICAgICAgICAgIGRhdGEucHVzaChfY29sb3IueCwgX2NvbG9yLnksIF9jb2xvci56KTsgLy9Db2xvciBvZiB0aGUgcG9pbnRcclxuICAgICAgICAgIGRlYnVnV3JhcHBlci5udW1Qb2ludERhdGErKztcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBPSU1PLkRlYnVnRHJhdy5wcm90b3R5cGUubGluZSA9IGZ1bmN0aW9uIChfdjE6IE9JTU8uVmVjMywgX3YyOiBPSU1PLlZlYzMsIF9jb2xvcjogT0lNTy5WZWMzKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGRlYnVnV3JhcHBlcjogUGh5c2ljc0RlYnVnRHJhdyA9IFBoeXNpY3MuZGVidWdEcmF3O1xyXG4gICAgICAgIGlmIChQaHlzaWNzLm1haW5DYW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IGRhdGE6IEFycmF5PG51bWJlcj4gPSBkZWJ1Z1dyYXBwZXIubGluZURhdGE7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX3YxLngsIF92MS55LCBfdjEueik7IC8vUG9pbnQgMSBDb29yZGluYXRlc1xyXG4gICAgICAgICAgZGF0YS5wdXNoKDAsIDAsIDApOyAvL1AxIE5vcm1hbHMgLSBFbXB0eSBzaW5jZSBpdCdzIG5vdCBhIHBvbHlnb25cclxuICAgICAgICAgIGRhdGEucHVzaChfY29sb3IueCwgX2NvbG9yLnksIF9jb2xvci56KTsgLy9QMSBDb2xvclxyXG4gICAgICAgICAgZGF0YS5wdXNoKF92Mi54LCBfdjIueSwgX3YyLnopOyAvL1BvaW50IDIgQ29vcmRpbmF0ZXNcclxuICAgICAgICAgIGRhdGEucHVzaCgwLCAwLCAwKTtcclxuICAgICAgICAgIGRhdGEucHVzaChfY29sb3IueCwgX2NvbG9yLnksIF9jb2xvci56KTtcclxuICAgICAgICAgIGRlYnVnV3JhcHBlci5udW1MaW5lRGF0YSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIE9JTU8uRGVidWdEcmF3LnByb3RvdHlwZS50cmlhbmdsZSA9IGZ1bmN0aW9uIChfdjE6IE9JTU8uVmVjMywgX3YyOiBPSU1PLlZlYzMsIF92MzogT0lNTy5WZWMzLCBfbjE6IE9JTU8uVmVjMywgX24yOiBPSU1PLlZlYzMsIF9uMzogT0lNTy5WZWMzLCBfY29sb3I6IE9JTU8uVmVjMyk6IHZvaWQge1xyXG4gICAgICAgIGxldCBkZWJ1Z1dyYXBwZXI6IFBoeXNpY3NEZWJ1Z0RyYXcgPSBQaHlzaWNzLmRlYnVnRHJhdztcclxuICAgICAgICBpZiAoUGh5c2ljcy5tYWluQ2FtICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBkYXRhOiBBcnJheTxudW1iZXI+ID0gZGVidWdXcmFwcGVyLnRyaURhdGE7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX3YxLngsIF92MS55LCBfdjEueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX24xLngsIF9uMS55LCBfbjEueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX3YyLngsIF92Mi55LCBfdjIueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX24yLngsIF9uMi55LCBfbjIueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX3YzLngsIF92My55LCBfdjMueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX24zLngsIF9uMy55LCBfbjMueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7XHJcbiAgICAgICAgICBkZWJ1Z1dyYXBwZXIubnVtVHJpRGF0YSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIHNvdXJjZSBjb2RlIChzdHJpbmcpIG9mIHRoZSBpbiBwaHlzaWNzRGVidWcgdXNlZCB2ZXJ5IHNpbXBsZSB2ZXJ0ZXhTaGFkZXIuXHJcbiAgICAgKiAgSGFuZGxpbmcgdGhlIHByb2plY3Rpb24gKHdoaWNoIGluY2x1ZGVzLCB2aWV3L3dvcmxkW2lzIGFsd2F5cyBpZGVudGl0eSBpbiB0aGlzIGNhc2VdL3Byb2plY3Rpb24gaW4gRlVER0UpLiBJbmNyZWFzaW5nIHRoZSBzaXplIG9mIHNpbmdsZSBwb2ludHMgZHJhd24uXHJcbiAgICAgKiAgQW5kIHRyYW5zZmVyIHBvc2l0aW9uIGNvbG9yIHRvIHRoZSBmcmFnbWVudFNoYWRlci4gKi9cclxuICAgIHByaXZhdGUgdmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgXHJcblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5cdFx0XHRhdHRyaWJ1dGUgdmVjMyBhUG9zaXRpb247XHJcblx0XHRcdGF0dHJpYnV0ZSB2ZWMzIGFDb2xvcjtcclxuXHRcdFx0YXR0cmlidXRlIHZlYzMgYU5vcm1hbDtcclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZQb3NpdGlvbjtcclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2Q29sb3I7XHJcblx0XHRcdHVuaWZvcm0gbWF0NCB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG5cdFx0XHR2b2lkIG1haW4oKSB7XHJcblx0XHRcdFx0dlBvc2l0aW9uID0gYVBvc2l0aW9uO1xyXG5cdFx0XHRcdHZDb2xvciA9IGFDb2xvcjtcclxuXHRcdFx0XHR2Tm9ybWFsID0gYU5vcm1hbDtcclxuXHRcdFx0XHRnbF9Qb3NpdGlvbiA9IHVfbXR4TWVzaFRvVmlldyAqIHZlYzQoYVBvc2l0aW9uLDEuMCk7XHJcblx0XHRcdFx0Z2xfUG9pbnRTaXplID0gNi4wO1xyXG5cdFx0XHR9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIHNvdXJjZSBjb2RlIChzdHJpbmcpIG9mIHRoZSBpbiBwaHlzaWNzRGVidWcgdXNlZCBzdXBlciBzaW1wbGUgZnJhZ21lbnRTaGFkZXIuIFVubGl0IC0gb25seSBjb2xvcml6aW5nIHRoZSBkcmF3biBwaXhlbHMsIG5vcm1hbHMvcG9zaXRpb24gYXJlIGdpdmVuIHRvIG1ha2UgaXQgZXhwYW5kYWJsZSAqL1xyXG4gICAgcHJpdmF0ZSBmcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYFxyXG4gICAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZQb3NpdGlvbjtcclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2Q29sb3I7XHJcblxyXG5cdFx0XHR2b2lkIG1haW4oKSB7XHJcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCh2Q29sb3IsIDEuMCk7XHJcblx0XHRcdH1gO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gYm9kaWVzIHdpdGggYSBkZWZpbmVkIGF4ZSBvZiB0cmFuc2xhdGlvbiBhbmQgcm90YXRpb24uIFR3byBEZWdyZWVzIG9mIEZyZWVkb20gaW4gdGhlIGRlZmluZWQgYXhpcy5cclxuICAgKiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC4gQSBtb3RvciBjYW4gYmUgZGVmaW5lZCBmb3Igcm90YXRpb24gYW5kIHRyYW5zbGF0aW9uLCBhbG9uZyB3aXRoIHNwcmluZyBzZXR0aW5ncy5cclxuICAgKiBcclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgICAgSm9pbnRIb2xkZXIgLSBib2R5QW5jaG9yXHJcbiAgICogICAgICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkFxyXG4gICAqICAgICAgICAgICAgICAgICAgICDilIIgICDilIJcclxuICAgKiAgICAgICAgICAgPOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgiAgIOKUguKUgOKUgOKUgOKUgOKUgOKUgD4gdGllZCBib2R5LCBzbGlkaW5nIG9uIGF4aXMgPSAxc3QgZGVncmVlIG9mIGZyZWVkb21cclxuICAgKiAgICAgICAgICAgICAgICAgICAg4pSCICAg4pSCICAgICAgICByb3RhdGluZyBhcm91bmQgYXhpcyA9IDJuZCBkZWdyZWUgb2YgZnJlZWRvbSBcclxuICAgKiAgICAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSYXHJcbiAgICogYGBgICBcclxuICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50Q3lsaW5kcmljYWwgZXh0ZW5kcyBKb2ludEF4aWFsIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50Q3lsaW5kcmljYWwpO1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2ludDogT0lNTy5DeWxpbmRyaWNhbEpvaW50O1xyXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogT0lNTy5DeWxpbmRyaWNhbEpvaW50Q29uZmlnID0gbmV3IE9JTU8uQ3lsaW5kcmljYWxKb2ludENvbmZpZygpO1xyXG4gICAgcHJvdGVjdGVkIG1vdG9yOiBPSU1PLlRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yO1xyXG5cclxuICAgICNzcHJpbmdEYW1waW5nUm90YXRpb246IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRnJlcXVlbmN5Um90YXRpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgI21vdG9yRm9yY2U6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI21heFJvdG9yOiBudW1iZXIgPSAzNjA7XHJcbiAgICAjbWluUm90b3I6IG51bWJlciA9IDA7XHJcbiAgICAjcm90b3JUb3JxdWU6IG51bWJlciA9IDA7XHJcbiAgICAjcm90b3JTcGVlZDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjcm90b3I6IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3I7XHJcbiAgICAjcm90b3JTcHJpbmdEYW1wZXI6IE9JTU8uU3ByaW5nRGFtcGVyO1xyXG5cclxuICAgIC8qKiBDcmVhdGluZyBhIGN5bGluZHJpY2FsIGpvaW50IGJldHdlZW4gdHdvIENvbXBvbmVudFJpZ2lkYm9kaWVzIG1vdmluZyBvbiBvbmUgYXhpcyBhbmQgcm90YXRpbmcgYXJvdW5kIGFub3RoZXIgYm91bmQgb24gYSBsb2NhbCBhbmNob3Jwb2ludC4gKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYXhpczogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDEsIDApLCBfbG9jYWxBbmNob3I6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAwLCAwKSkge1xyXG4gICAgICBzdXBlcihfYm9keUFuY2hvciwgX2JvZHlUaWVkLCBfYXhpcywgX2xvY2FsQW5jaG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyLnNwcmluZ0RhbXBpbmcgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHJhbnNsYXRpb25hbFNwcmluZ0RhbXBlcigpLmRhbXBpbmdSYXRpbyA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHNwcmluZyBpbiBIei4gQXQgMCB0aGUgc3ByaW5nIGlzIHJpZ2lkLCBlcXVhbHMgbm8gc3ByaW5nLiBUaGUgc21hbGxlciB0aGUgdmFsdWUgdGhlIGxlc3MgcmVzdHJpY3RpdmUgaXMgdGhlIHNwcmluZy5cclxuICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBzdXBlci5zcHJpbmdGcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHJhbnNsYXRpb25hbFNwcmluZ0RhbXBlcigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC4gSW5mbHVlbmNpbmcgVE9SUVVFIC8gUk9UQVRJT05cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0RhbXBpbmdSb3RhdGlvbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRGFtcGluZ1JvdGF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nUm90YXRpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGluZ1JvdGF0aW9uID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFJvdGF0aW9uYWxTcHJpbmdEYW1wZXIoKS5kYW1waW5nUmF0aW8gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gSW5mbHVlbmNpbmcgVE9SUVVFIC8gUk9UQVRJT05cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdGcmVxdWVuY3lSb3RhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRnJlcXVlbmN5Um90YXRpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRnJlcXVlbmN5Um90YXRpb24gPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0Um90YXRpb25hbFNwcmluZ0RhbXBlcigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMtQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heFJvdG9yKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtYXhSb3RvcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWF4Um90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWF4Um90b3IgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0Um90YXRpb25hbExpbWl0TW90b3IoKS51cHBlckxpbWl0ID0gX3ZhbHVlICogQ2FsYy5kZWcycmFkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIExvd2VyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMgQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1pblJvdG9yKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtaW5Sb3RvcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWluUm90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWluUm90b3IgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0Um90YXRpb25hbExpbWl0TW90b3IoKS5sb3dlckxpbWl0ID0gX3ZhbHVlICogQ2FsYy5kZWcycmFkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIHRhcmdldCByb3RhdGlvbmFsIHNwZWVkIG9mIHRoZSBtb3RvciBpbiBtL3MuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yU3BlZWQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JvdG9yU3BlZWQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdG9yU3BlZWQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRSb3RhdGlvbmFsTGltaXRNb3RvcigpLm1vdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgbWF4aW11bSBtb3RvciB0b3JxdWUgaW4gTmV3dG9uLiBmb3JjZSA8PSAwIGVxdWFscyBkaXNhYmxlZC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90b3JUb3JxdWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JvdG9yVG9ycXVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCByb3RvclRvcnF1ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNyb3RvclRvcnF1ZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRSb3RhdGlvbmFsTGltaXRNb3RvcigpLm1vdG9yVG9ycXVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBVcHBlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBtYXhNb3RvcihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBzdXBlci5tYXhNb3RvciA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbClcclxuICAgICAgICB0aGlzLmpvaW50LmdldFRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yKCkudXBwZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBMb3dlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBtaW5Nb3RvcihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBzdXBlci5taW5Nb3RvciA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbClcclxuICAgICAgICB0aGlzLmpvaW50LmdldFRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yKCkubG93ZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG1vdG9yU3BlZWQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbClcclxuICAgICAgICB0aGlzLmpvaW50LmdldFRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yKCkubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBtYXhpbXVtIG1vdG9yIGZvcmNlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1vdG9yRm9yY2UoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21vdG9yRm9yY2U7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1vdG9yRm9yY2UoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbW90b3JGb3JjZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRUcmFuc2xhdGlvbmFsTGltaXRNb3RvcigpLm1vdG9yRm9yY2UgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuI2dldE11dGF0b3IoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX211dGF0b3IpO1xyXG4gICAgICB0aGlzLmRlbGV0ZUZyb21NdXRhdG9yKF9tdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKG11dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JvdG9yU3ByaW5nRGFtcGVyID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuc3ByaW5nRnJlcXVlbmN5Um90YXRpb24sIHRoaXMuc3ByaW5nRGFtcGluZ1JvdGF0aW9uKTtcclxuXHJcbiAgICAgIHRoaXMubW90b3IgPSBuZXcgT0lNTy5UcmFuc2xhdGlvbmFsTGltaXRNb3RvcigpLnNldExpbWl0cyhzdXBlci5taW5Nb3Rvciwgc3VwZXIubWF4TW90b3IpO1xyXG4gICAgICB0aGlzLm1vdG9yLnNldE1vdG9yKHN1cGVyLm1vdG9yU3BlZWQsIHRoaXMubW90b3JGb3JjZSk7XHJcbiAgICAgIHRoaXMuI3JvdG9yID0gbmV3IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHModGhpcy5taW5Sb3RvciAqIENhbGMuZGVnMnJhZCwgdGhpcy5tYXhSb3RvciAqIENhbGMuZGVnMnJhZCk7XHJcbiAgICAgIHRoaXMuI3JvdG9yLnNldE1vdG9yKHRoaXMucm90b3JTcGVlZCwgdGhpcy5yb3RvclRvcnF1ZSk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZyA9IG5ldyBPSU1PLkN5bGluZHJpY2FsSm9pbnRDb25maWcoKTtcclxuICAgICAgc3VwZXIuY29uc3RydWN0Sm9pbnQoKTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnLnRyYW5zbGF0aW9uYWxTcHJpbmdEYW1wZXIgPSB0aGlzLnNwcmluZ0RhbXBlcjtcclxuICAgICAgdGhpcy5jb25maWcudHJhbnNsYXRpb25hbExpbWl0TW90b3IgPSB0aGlzLm1vdG9yO1xyXG4gICAgICB0aGlzLmNvbmZpZy5yb3RhdGlvbmFsTGltaXRNb3RvciA9IHRoaXMuI3JvdG9yO1xyXG4gICAgICB0aGlzLmNvbmZpZy5yb3RhdGlvbmFsU3ByaW5nRGFtcGVyID0gdGhpcy4jcm90b3JTcHJpbmdEYW1wZXI7XHJcblxyXG4gICAgICB0aGlzLmpvaW50ID0gbmV3IE9JTU8uQ3lsaW5kcmljYWxKb2ludCh0aGlzLmNvbmZpZyk7XHJcbiAgICAgIHRoaXMuY29uZmlndXJlSm9pbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAjZ2V0TXV0YXRvciA9ICgpOiBNdXRhdG9yID0+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgbW90b3JGb3JjZTogdGhpcy5tb3RvckZvcmNlLFxyXG4gICAgICAgIHNwcmluZ0RhbXBpbmdSb3RhdGlvbjogdGhpcy5zcHJpbmdEYW1waW5nUm90YXRpb24sXHJcbiAgICAgICAgc3ByaW5nRnJlcXVlbmN5Um90YXRpb246IHRoaXMuc3ByaW5nRnJlcXVlbmN5Um90YXRpb24sXHJcbiAgICAgICAgbWF4Um90b3I6IHRoaXMubWF4Um90b3IsXHJcbiAgICAgICAgbWluUm90b3I6IHRoaXMubWluUm90b3IsXHJcbiAgICAgICAgcm90b3JUb3JxdWU6IHRoaXMucm90b3JUb3JxdWUsXHJcbiAgICAgICAgcm90b3JTcGVlZDogdGhpcy5yb3RvclNwZWVkXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfTtcclxuXHJcbiAgICAjbXV0YXRlID0gKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCA9PiB7XHJcbiAgICAgIHRoaXMubXV0YXRlQmFzZShfbXV0YXRvciwgW1wibW90b3JGb3JjZVwiLCBcInJvdG9yVG9ycXVlXCIsIFwicm90b3JTcGVlZFwiLCBcIm1heFJvdG9yXCIsIFwibWluUm90b3JcIiwgXCJzcHJpbmdEYW1waW5nUm90YXRpb25cIiwgXCJzcHJpbmdGcmVxdWVuY3lSb3RhdGlvblwiLCBcInNwcmluZ0ZyZXF1ZW5jeVwiXSk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIGEgZGVmaW5lZCBheGUgbW92ZW1lbnQuXHJcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHNsaWRpbmcgam9pbnQgYWxvbmcgb25lIGF4aXMuIFR3byBSaWdpZEJvZGllcyBuZWVkIHRvIGJlIGRlZmluZWQgdG8gdXNlIGl0LlxyXG4gICAgICogQSBtb3RvciBjYW4gYmUgZGVmaW5lZCB0byBtb3ZlIHRoZSBjb25uZWN0ZWQgYWxvbmcgdGhlIGRlZmluZWQgYXhpcy4gR3JlYXQgdG8gY29uc3RydWN0IHN0YW5kYXJkIHNwcmluZ3Mgb3IgcGh5c2ljYWwgc2xpZGVycy5cclxuICAgICAqIFxyXG4gICAgICogYGBgdGV4dFxyXG4gICAgICogICAgICAgICAgSm9pbnRIb2xkZXIgLSBib2R5QW5jaG9yXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4pSM4pSA4pSA4pSA4pSQXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4pSCICAg4pSCXHJcbiAgICAgKiAgICAgICAgICAgPOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgiAgIOKUguKUgOKUgOKUgOKUgOKUgOKUgD4gdGllZCBib2R5LCBzbGlkaW5nIG9uIG9uZSBBeGlzLCAxIERlZ3JlZSBvZiBGcmVlZG9tXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4pSCICAg4pSCXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSYXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBKb2ludFByaXNtYXRpYyBleHRlbmRzIEpvaW50QXhpYWwge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IEpvaW50LnJlZ2lzdGVyU3ViY2xhc3MoSm9pbnRQcmlzbWF0aWMpO1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2ludDogT0lNTy5QcmlzbWF0aWNKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uUHJpc21hdGljSm9pbnRDb25maWcgPSBuZXcgT0lNTy5QcmlzbWF0aWNKb2ludENvbmZpZygpO1xyXG4gICAgcHJvdGVjdGVkIG1vdG9yOiBPSU1PLlRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yO1xyXG4gICAgLy9JbnRlcm5hbGx5IHVzZWQgdmFyaWFibGVzIC0gSm9pbnQgUHJvcGVydGllcyB0aGF0IGFyZSB1c2VkIGV2ZW4gd2hlbiBubyBhY3R1YWwgam9pbnQgaXMgY3VycmVudGx5IGV4aXN0ZW50XHJcblxyXG4gICAgI21vdG9yRm9yY2U6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqIENyZWF0aW5nIGEgcHJpc21hdGljIGpvaW50IGJldHdlZW4gdHdvIENvbXBvbmVudFJpZ2lkYm9kaWVzIG9ubHkgbW92aW5nIG9uIG9uZSBheGlzIGJvdW5kIG9uIGEgbG9jYWwgYW5jaG9ycG9pbnQuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2F4aXM6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAxLCAwKSwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCwgX2F4aXMsIF9sb2NhbEFuY2hvcik7XHJcblxyXG4gICAgICB0aGlzLm1heE1vdG9yID0gMTA7XHJcbiAgICAgIHRoaXMubWluTW90b3IgPSAtMTA7XHJcbiAgICB9XHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIG1heGltdW0gbW90b3IgZm9yY2UgaW4gTmV3dG9uLiBmb3JjZSA8PSAwIGVxdWFscyBkaXNhYmxlZC4gVGhpcyBpcyB0aGUgZm9yY2UgdGhhdCB0aGUgbW90b3IgaXMgdXNpbmcgdG8gaG9sZCB0aGUgcG9zaXRpb24sIG9yIHJlYWNoIGl0IGlmIGEgbW90b3JTcGVlZCBpcyBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1vdG9yRm9yY2UoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21vdG9yRm9yY2U7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1vdG9yRm9yY2UoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbW90b3JGb3JjZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yKCkubW90b3JGb3JjZSA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZ1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgbW90b3JGb3JjZTogdGhpcy5tb3RvckZvcmNlLFxyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tb3RvckZvcmNlID0gX3NlcmlhbGl6YXRpb24ubW90b3JGb3JjZTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIG11dGF0b3IubW90b3JGb3JjZSA9IHRoaXMubW90b3JGb3JjZTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLm1vdG9yRm9yY2UpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMubW90b3JGb3JjZSA9IF9tdXRhdG9yLm1vdG9yRm9yY2U7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5tb3RvckZvcmNlO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKiogQWN0dWFsIGNyZWF0aW9uIG9mIGEgam9pbnQgaW4gdGhlIE9pbW9QaHlzaWNzIHN5c3RlbSAqL1xyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEpvaW50KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLm1vdG9yID0gbmV3IE9JTU8uVHJhbnNsYXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHModGhpcy5taW5Nb3RvciwgdGhpcy5tYXhNb3Rvcik7IC8vQ3JlYXRlIG1vdG9yIHNldHRpbmdzLCB0byBob2xkIHBvc2l0aW9ucywgc2V0IGNvbnN0cmFpbnQgbWluL21heFxyXG4gICAgICB0aGlzLm1vdG9yLnNldE1vdG9yKHRoaXMubW90b3JTcGVlZCwgdGhpcy5tb3RvckZvcmNlKTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IE9JTU8uUHJpc21hdGljSm9pbnRDb25maWcoKTsgLy9DcmVhdGUgYSBzcGVjaWZpYyBjb25maWcgZm9yIHRoaXMgam9pbnQgdHlwZSB0aGF0IGlzIGNhbGN1bGF0aW5nIHRoZSBsb2NhbCBheGlzIGZvciBib3RoIGJvZGllc1xyXG4gICAgICBzdXBlci5jb25zdHJ1Y3RKb2ludCgpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcuc3ByaW5nRGFtcGVyID0gdGhpcy5zcHJpbmdEYW1wZXI7IC8vVGVsbGluZyB0aGUgY29uZmlnIHRvIHVzZSB0aGUgbW90b3Ivc3ByaW5nIG9mIHRoZSBGVURHRSBDb21wb25lbnRcclxuICAgICAgdGhpcy5jb25maWcubGltaXRNb3RvciA9IHRoaXMubW90b3I7XHJcblxyXG4gICAgICB0aGlzLmpvaW50ID0gbmV3IE9JTU8uUHJpc21hdGljSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyZUpvaW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAqIEEgcGh5c2ljYWwgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBib2RpZXMsIGRlc2lnbmVkIHRvIHNpbXVsYXRlIGJlaGF2aW91ciB3aXRoaW4gYSByZWFsIGJvZHkuIEl0IGhhcyB0d28gYXhpcywgYSBzd2luZyBhbmQgdHdpc3QgYXhpcywgYW5kIGFsc28gdGhlIHBlcnBlbmRpY3VsYXIgYXhpcywgXHJcbiAgICAqIHNpbWlsYXIgdG8gYSBTcGhlcmljYWwgam9pbnQsIGJ1dCBtb3JlIHJlc3RyaWN0aXZlIGluIGl0J3MgYW5nbGVzIGFuZCBvbmx5IHR3byBkZWdyZWVzIG9mIGZyZWVkb20uIFR3byBSaWdpZEJvZGllcyBuZWVkIHRvIGJlIGRlZmluZWQgdG8gdXNlIGl0LiBNb3N0bHkgdXNlZCB0byBjcmVhdGUgaHVtYW5saWtlIGpvaW50cyB0aGF0IGJlaGF2ZSBsaWtlIGEgXHJcbiAgICAqIGxpZmVsZXNzIGJvZHkuXHJcbiAgICAqIGBgYHRleHQgICAgICAgIFxyXG4gICAgKiAgICAgICAgICAgICAgICAgIFxyXG4gICAgKiAgICAgICAgICAgICAgICAgICAgICBhbmNob3IgLSBpdCBjYW4gdHdpc3Qgb24gb25lIGF4aXMgYW5kIHN3aW5nIG9uIGFub3RoZXJcclxuICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXHJcbiAgICAqICAgICAgICAgeiAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkCDilIIg4pSM4pSA4pSA4pSA4pSQXHJcbiAgICAqICAgICAgICAg4oaRICAgICAgICAgICAg4pSCICAg4pSCIOKGkyDilIIgICDilIIgICAgICAgIGUuZy4geiA9IFR3aXN0QXhpcywgaXQgY2FuIHJvdGF0ZSBpbi1pdHNlbGYgYXJvdW5kIHRoaXMgYXhpcyBcclxuICAgICogICAgLXgg4oaQ4pSA4pS84pSA4oaSIHggICAgICAgIOKUgiAgIOKUgiB4IOKUgiAgIOKUgiAgICAgICAgZS5nLiB4ID0gU3dpbmdBeGlzLCBpdCBjYW4gcm90YXRlIGFuY2hvcmVkIGFyb3VuZCB0aGUgYmFzZSBvbiB0aGlzIGF4aXMgICBcclxuICAgICogICAgICAgICDihpMgICAgICAgICAgICDilIIgICDilIIgICDilIIgICDilIIgICAgICAgICAgIFxyXG4gICAgKiAgICAgICAgLXogICAgICAgICAgICDilJTilIDilIDilIDilJggICDilJTilIDilIDilIDilJggICAgICAgICBlLmcuIHlvdSBjYW4gdHdpc3QgdGhlIGxlZyBpbi1pdHNlbGYgdG8gYSBjZXJ0YWluIGRlZ3JlZSxcclxuICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBhbHNvIHJvdGF0ZSBpdCBmb3J3YXJkL2JhY2t3YXJkL2xlZnQvcmlnaHQgdG8gYSBjZXJ0YWluIGRlZ3JlZVxyXG4gICAgKiAgICAgICAgICAgICAgICBib2R5QW5jaG9yICAgICAgICAgIGJvZHlUaWVkXHJcbiAgICAqICAgICAgICAgICAgICAoZS5nLiBwZWx2aXMpICAgICAgICAgKGUuZy4gdXBwZXItbGVnKVxyXG4gICAgKiBcclxuICAgICogYGBgXHJcbiAgICAqIFR3aXN0IGVxdWFscyBhIHJvdGF0aW9uIGFyb3VuZCBhIHBvaW50IHdpdGhvdXQgbW92aW5nIG9uIGFuIGF4aXMuXHJcbiAgICAqIFN3aW5nIGVxdWFscyBhIHJvdGF0aW9uIG9uIGEgcG9pbnQgd2l0aCBhIG1vdmluZyBsb2NhbCBheGlzLlxyXG4gICAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAgKi9cclxuICBleHBvcnQgY2xhc3MgSm9pbnRSYWdkb2xsIGV4dGVuZHMgSm9pbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IEpvaW50LnJlZ2lzdGVyU3ViY2xhc3MoSm9pbnRSYWdkb2xsKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uUmFnZG9sbEpvaW50O1xyXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogT0lNTy5SYWdkb2xsSm9pbnRDb25maWcgPSBuZXcgT0lNTy5SYWdkb2xsSm9pbnRDb25maWcoKTtcclxuXHJcbiAgICAjc3ByaW5nRGFtcGluZ1R3aXN0OiBudW1iZXIgPSAwO1xyXG4gICAgI3NwcmluZ0ZyZXF1ZW5jeVR3aXN0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNzcHJpbmdEYW1waW5nU3dpbmc6IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRnJlcXVlbmN5U3dpbmc6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI21heE1vdG9yVHdpc3Q6IG51bWJlciA9IDM2MDtcclxuICAgICNtaW5Nb3RvclR3aXN0OiBudW1iZXIgPSAwO1xyXG4gICAgI21vdG9yVG9ycXVlVHdpc3Q6IG51bWJlciA9IDA7XHJcbiAgICAjbW90b3JTcGVlZFR3aXN0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtb3RvclR3aXN0OiBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yO1xyXG4gICAgI3NwcmluZ0RhbXBlclR3aXN0OiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuICAgICNzcHJpbmdEYW1wZXJTd2luZzogT0lNTy5TcHJpbmdEYW1wZXI7XHJcbiAgICAjYXhpc0ZpcnN0OiBPSU1PLlZlYzM7XHJcbiAgICAjYXhpc1NlY29uZDogT0lNTy5WZWMzO1xyXG5cclxuICAgICNtYXhBbmdsZUZpcnN0OiBudW1iZXIgPSAwO1xyXG4gICAgI21heEFuZ2xlU2Vjb25kOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYXhpc0ZpcnN0OiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMSwgMCwgMCksIF9heGlzU2Vjb25kOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMSksIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQpO1xyXG4gICAgICB0aGlzLmF4aXNGaXJzdCA9IF9heGlzRmlyc3Q7XHJcbiAgICAgIHRoaXMuYXhpc1NlY29uZCA9IF9heGlzU2Vjb25kO1xyXG4gICAgICB0aGlzLmFuY2hvciA9IF9sb2NhbEFuY2hvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXhpcyBjb25uZWN0aW5nIHRoZSB0aGUgdHdvIHtAbGluayBOb2RlfXMgZS5nLiBWZWN0b3IzKDAsMSwwKSB0byBoYXZlIGEgdXB3YXJkIGNvbm5lY3Rpb24uXHJcbiAgICAgKiAgV2hlbiBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uIHRoZSBqb2ludCBuZWVkcyB0byBiZSByZWNvbm5lY3RlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBheGlzRmlyc3QoKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLiNheGlzRmlyc3QueCwgdGhpcy4jYXhpc0ZpcnN0LnksIHRoaXMuI2F4aXNGaXJzdC56KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYXhpc0ZpcnN0KF92YWx1ZTogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLiNheGlzRmlyc3QgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBUaGUgYXhpcyBjb25uZWN0aW5nIHRoZSB0aGUgdHdvIHtAbGluayBOb2RlfXMgZS5nLiBWZWN0b3IzKDAsMSwwKSB0byBoYXZlIGEgdXB3YXJkIGNvbm5lY3Rpb24uXHJcbiAgICAqICBXaGVuIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdGhlIGpvaW50IG5lZWRzIHRvIGJlIHJlY29ubmVjdGVkLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXhpc1NlY29uZCgpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRoaXMuI2F4aXNTZWNvbmQueCwgdGhpcy4jYXhpc1NlY29uZC55LCB0aGlzLiNheGlzU2Vjb25kLnopO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBheGlzU2Vjb25kKF92YWx1ZTogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLiNheGlzU2Vjb25kID0gbmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KTtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIGFuZ2xlIG9mIHJvdGF0aW9uIGFsb25nIHRoZSBmaXJzdCBheGlzLiBWYWx1ZSBuZWVkcyB0byBiZSBwb3NpdGl2ZS4gQ2hhbmdlcyBkbyByZWJ1aWxkIHRoZSBqb2ludFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heEFuZ2xlRmlyc3RBeGlzKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtYXhBbmdsZUZpcnN0ICogQ2FsYy5yYWQyZGVnO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtYXhBbmdsZUZpcnN0QXhpcyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtYXhBbmdsZUZpcnN0ID0gX3ZhbHVlICogQ2FsYy5kZWcycmFkO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1heGltdW0gYW5nbGUgb2Ygcm90YXRpb24gYWxvbmcgdGhlIHNlY29uZCBheGlzLiBWYWx1ZSBuZWVkcyB0byBiZSBwb3NpdGl2ZS4gQ2hhbmdlcyBkbyByZWJ1aWxkIHRoZSBqb2ludFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heEFuZ2xlU2Vjb25kQXhpcygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4QW5nbGVTZWNvbmQgKiBDYWxjLnJhZDJkZWc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1heEFuZ2xlU2Vjb25kQXhpcyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtYXhBbmdsZVNlY29uZCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYW1waW5nIG9mIHRoZSBzcHJpbmcuIDEgZXF1YWxzIGNvbXBsZXRseSBkYW1wZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRGFtcGluZ1R3aXN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdEYW1waW5nVHdpc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0RhbXBpbmdUd2lzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdEYW1waW5nVHdpc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHdpc3RTcHJpbmdEYW1wZXIoKS5kYW1waW5nUmF0aW8gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gVGhlIHNtYWxsZXIgdGhlIHZhbHVlIHRoZSBsZXNzIHJlc3RyaWN0aXZlIGlzIHRoZSBzcHJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdGcmVxdWVuY3lUd2lzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5VHdpc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeVR3aXN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVR3aXN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFR3aXN0U3ByaW5nRGFtcGVyKCkuZnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nU3dpbmcoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0RhbXBpbmdTd2luZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRGFtcGluZ1N3aW5nKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmdTd2luZyA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRTd2luZ1NwcmluZ0RhbXBlcigpLmRhbXBpbmdSYXRpbyA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHNwcmluZyBpbiBIei4gQXQgMCB0aGUgc3ByaW5nIGlzIHJpZ2lkLCBlcXVhbHMgbm8gc3ByaW5nLiBUaGUgc21hbGxlciB0aGUgdmFsdWUgdGhlIGxlc3MgcmVzdHJpY3RpdmUgaXMgdGhlIHNwcmluZy5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0ZyZXF1ZW5jeVN3aW5nKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdGcmVxdWVuY3lTd2luZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRnJlcXVlbmN5U3dpbmcoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRnJlcXVlbmN5U3dpbmcgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3dpbmdTcHJpbmdEYW1wZXIoKS5mcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMtQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heE1vdG9yVHdpc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21heE1vdG9yVHdpc3QgKiBDYWxjLnJhZDJkZWc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1heE1vdG9yVHdpc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgX3ZhbHVlICo9IENhbGMuZGVnMnJhZDtcclxuICAgICAgdGhpcy4jbWF4TW90b3JUd2lzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRUd2lzdExpbWl0TW90b3IoKS51cHBlckxpbWl0ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIExvd2VyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMgQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1pbk1vdG9yVHdpc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21pbk1vdG9yVHdpc3QgKiBDYWxjLnJhZDJkZWc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1pbk1vdG9yVHdpc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgX3ZhbHVlICo9IENhbGMuZGVnMnJhZDtcclxuICAgICAgdGhpcy4jbWluTW90b3JUd2lzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRUd2lzdExpbWl0TW90b3IoKS5sb3dlckxpbWl0ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSB0YXJnZXQgcm90YXRpb25hbCBzcGVlZCBvZiB0aGUgbW90b3IgaW4gbS9zLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtb3RvclNwZWVkVHdpc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21vdG9yU3BlZWRUd2lzdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbW90b3JTcGVlZFR3aXN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21vdG9yU3BlZWRUd2lzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRUd2lzdExpbWl0TW90b3IoKS5tb3RvclNwZWVkID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBtYXhpbXVtIG1vdG9yIHRvcnF1ZSBpbiBOZXd0b24uIGZvcmNlIDw9IDAgZXF1YWxzIGRpc2FibGVkLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtb3RvclRvcnF1ZVR3aXN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvclRvcnF1ZVR3aXN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtb3RvclRvcnF1ZVR3aXN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21vdG9yVG9ycXVlVHdpc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHdpc3RMaW1pdE1vdG9yKCkubW90b3JUb3JxdWUgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogSWYgdGhlIHR3byBjb25uZWN0ZWQgUmlnaWRCb2RpZXMgY29sbGlkZSB3aXRoIGVhdGggb3RoZXIuIChEZWZhdWx0ID0gZmFsc2UpXHJcbiAgICAgKi9cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmdcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy4jZ2V0TXV0YXRvcigpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmF4aXNGaXJzdCA9IHRoaXMuYXhpc0ZpcnN0LnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmF4aXNTZWNvbmQgPSB0aGlzLmF4aXNTZWNvbmQuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgdGhpcy5heGlzRmlyc3QuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYXhpc0ZpcnN0KTtcclxuICAgICAgYXdhaXQgdGhpcy5heGlzU2Vjb25kLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmF4aXNTZWNvbmQpO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5heGlzRmlyc3QpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYXhpc0ZpcnN0ID0gbmV3IFZlY3RvcjMoLi4uPG51bWJlcltdPihPYmplY3QudmFsdWVzKF9tdXRhdG9yLmF4aXNGaXJzdCkpKTtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYXhpc1NlY29uZCkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5heGlzU2Vjb25kID0gbmV3IFZlY3RvcjMoLi4uPG51bWJlcltdPihPYmplY3QudmFsdWVzKF9tdXRhdG9yLmF4aXNTZWNvbmQpKSk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5heGlzRmlyc3Q7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5heGlzU2Vjb25kO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX211dGF0b3IpO1xyXG4gICAgICB0aGlzLmRlbGV0ZUZyb21NdXRhdG9yKF9tdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKG11dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIG11dGF0b3IuYXhpc0ZpcnN0ID0gdGhpcy5heGlzRmlyc3QuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBtdXRhdG9yLmF4aXNTZWNvbmQgPSB0aGlzLmF4aXNTZWNvbmQuZ2V0TXV0YXRvcigpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGVyVHdpc3QgPSBuZXcgT0lNTy5TcHJpbmdEYW1wZXIoKS5zZXRTcHJpbmcodGhpcy5zcHJpbmdGcmVxdWVuY3lUd2lzdCwgdGhpcy5zcHJpbmdEYW1waW5nVHdpc3QpO1xyXG4gICAgICB0aGlzLiNzcHJpbmdEYW1wZXJTd2luZyA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLnNwcmluZ0ZyZXF1ZW5jeVN3aW5nLCB0aGlzLnNwcmluZ0RhbXBpbmdTd2luZyk7XHJcblxyXG4gICAgICB0aGlzLiNtb3RvclR3aXN0ID0gbmV3IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHModGhpcy5taW5Nb3RvclR3aXN0LCB0aGlzLm1heE1vdG9yVHdpc3QpO1xyXG4gICAgICB0aGlzLiNtb3RvclR3aXN0LnNldE1vdG9yKHRoaXMubW90b3JTcGVlZFR3aXN0LCB0aGlzLm1vdG9yVG9ycXVlVHdpc3QpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgT0lNTy5SYWdkb2xsSm9pbnRDb25maWcoKTtcclxuICAgICAgc3VwZXIuY29uc3RydWN0Sm9pbnQodGhpcy5heGlzRmlyc3QsIHRoaXMuYXhpc1NlY29uZCk7XHJcbiAgICAgIHRoaXMuY29uZmlnLnN3aW5nU3ByaW5nRGFtcGVyID0gdGhpcy4jc3ByaW5nRGFtcGVyU3dpbmc7XHJcbiAgICAgIHRoaXMuY29uZmlnLnR3aXN0U3ByaW5nRGFtcGVyID0gdGhpcy4jc3ByaW5nRGFtcGVyVHdpc3Q7XHJcbiAgICAgIHRoaXMuY29uZmlnLnR3aXN0TGltaXRNb3RvciA9IHRoaXMuI21vdG9yVHdpc3Q7XHJcbiAgICAgIHRoaXMuY29uZmlnLm1heFN3aW5nQW5nbGUxID0gdGhpcy4jbWF4QW5nbGVGaXJzdDtcclxuICAgICAgdGhpcy5jb25maWcubWF4U3dpbmdBbmdsZTIgPSB0aGlzLiNtYXhBbmdsZVNlY29uZDtcclxuXHJcbiAgICAgIHRoaXMuam9pbnQgPSBuZXcgT0lNTy5SYWdkb2xsSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICBzdXBlci5jb25maWd1cmVKb2ludCgpO1xyXG4gICAgfVxyXG5cclxuICAgICNnZXRNdXRhdG9yID0gKCk6IE11dGF0b3IgPT4ge1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICBtYXhBbmdsZUZpcnN0OiB0aGlzLiNtYXhBbmdsZUZpcnN0LFxyXG4gICAgICAgIG1heEFuZ2xlU2Vjb25kOiB0aGlzLiNtYXhBbmdsZVNlY29uZCxcclxuICAgICAgICBzcHJpbmdEYW1waW5nVHdpc3Q6IHRoaXMuc3ByaW5nRGFtcGluZ1R3aXN0LFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeVR3aXN0OiB0aGlzLnNwcmluZ0ZyZXF1ZW5jeVR3aXN0LFxyXG4gICAgICAgIHNwcmluZ0RhbXBpbmdTd2luZzogdGhpcy5zcHJpbmdEYW1waW5nU3dpbmcsXHJcbiAgICAgICAgc3ByaW5nRnJlcXVlbmN5U3dpbmc6IHRoaXMuc3ByaW5nRnJlcXVlbmN5U3dpbmcsXHJcbiAgICAgICAgbWF4TW90b3JUd2lzdDogdGhpcy4jbWF4TW90b3JUd2lzdCxcclxuICAgICAgICBtaW5Nb3RvclR3aXN0OiB0aGlzLiNtaW5Nb3RvclR3aXN0LFxyXG4gICAgICAgIG1vdG9yU3BlZWRUd2lzdDogdGhpcy5tb3RvclNwZWVkVHdpc3QsXHJcbiAgICAgICAgbW90b3JUb3JxdWVUd2lzdDogdGhpcy5tb3RvclRvcnF1ZVR3aXN0XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfTtcclxuXHJcbiAgICAjbXV0YXRlID0gKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLm1heEFuZ2xlRmlyc3QpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuI21heEFuZ2xlRmlyc3QgPSBfbXV0YXRvci5tYXhBbmdsZUZpcnN0O1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5tYXhBbmdsZVNlY29uZCkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy4jbWF4QW5nbGVTZWNvbmQgPSBfbXV0YXRvci5tYXhBbmdsZVNlY29uZDtcclxuICAgICAgdGhpcy5tdXRhdGVCYXNlKF9tdXRhdG9yLCBbXHJcbiAgICAgICAgXCJzcHJpbmdEYW1waW5nVHdpc3RcIiwgXCJzcHJpbmdGcmVxdWVuY3lUd2lzdFwiLCBcInNwcmluZ0RhbXBpbmdTd2luZ1wiLCBcInNwcmluZ0ZyZXF1ZW5jeVN3aW5nXCIsIFwibWF4TW90b3JUd2lzdFwiLCBcIm1pbk1vdG9yVHdpc3RcIiwgXCJtb3RvclNwZWVkVHdpc3RcIiwgXCJtb3RvclRvcnF1ZVR3aXN0XCJcclxuICAgICAgXSk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIGEgZGVmaW5lZCBheGUgb2Ygcm90YXRpb24uIEFsc28ga25vd24gYXMgSElOR0Ugam9pbnQuXHJcbiAgICAgKiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC4gQSBtb3RvciBjYW4gYmUgZGVmaW5lZCB0byByb3RhdGUgdGhlIGNvbm5lY3RlZCBhbG9uZyB0aGUgZGVmaW5lZCBheGlzLlxyXG4gICAgICogXHJcbiAgICAgKiBgYGB0ZXh0ICAgICAgICBcclxuICAgICAqICAgICAgICAgICAgICAgICAgcm90YXRpb24gYXhpcywgMXN0IERlZ3JlZSBvZiBmcmVlZG9tXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4oaRXHJcbiAgICAgKiAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkOKUguKUjOKUgOKUgOKUgOKUgOKUkCAgICAgXHJcbiAgICAgKiAgICAgICAgICAgICAgIOKUgiAgIOKUguKUguKUgiAgICDilIIgIFxyXG4gICAgICogICAgICAgICAgICAgICDilIIgICDilILilILilIIgICAg4pSCIFxyXG4gICAgICogICAgICAgICAgICAgICDilIIgICDilILilILilIIgICAg4pSCIFxyXG4gICAgICogICAgICAgICAgICAgICDilJTilIDilIDilIDilJjilILilJTilIDilIDilIDilIDilJhcclxuICAgICAqICAgICAgICAgICAgICAgICAgICDilIIgICBcclxuICAgICAqICAgICAgYm9keUFuY2hvciAgICAgICAgIGJvZHlUaWVkXHJcbiAgICAgKiAgIChlLmcuIERvb3JoaW5nZSkgICAgICAgKGUuZy4gRG9vcilcclxuICAgICAqIGBgYFxyXG4gICAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50UmV2b2x1dGUgZXh0ZW5kcyBKb2ludEF4aWFsIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50UmV2b2x1dGUpO1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2ludDogT0lNTy5SZXZvbHV0ZUpvaW50O1xyXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogT0lNTy5SZXZvbHV0ZUpvaW50Q29uZmlnID0gbmV3IE9JTU8uUmV2b2x1dGVKb2ludENvbmZpZygpO1xyXG5cclxuICAgICNtb3RvclRvcnF1ZTogbnVtYmVyID0gMDtcclxuICAgICNyb3RvcjogT0lNTy5Sb3RhdGlvbmFsTGltaXRNb3RvcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2F4aXM6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAxLCAwKSwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCwgX2F4aXMsIF9sb2NhbEFuY2hvcik7XHJcblxyXG4gICAgICB0aGlzLm1heE1vdG9yID0gMzYwO1xyXG4gICAgICB0aGlzLm1pbk1vdG9yID0gMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgVXBwZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gQXhpcy1BbmdsZSBtZWFzdXJlZCBpbiBEZWdyZWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgbWF4TW90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIubWF4TW90b3IgPSBfdmFsdWU7XHJcbiAgICAgIF92YWx1ZSAqPSBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50KVxyXG4gICAgICAgIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcigpLnVwcGVyTGltaXQgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgTG93ZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gQXhpcyBBbmdsZSBtZWFzdXJlZCBpbiBEZWdyZWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgbWluTW90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIubWluTW90b3IgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50KVxyXG4gICAgICAgIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcigpLmxvd2VyTGltaXQgPSBfdmFsdWUgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIG1heGltdW0gbW90b3IgZm9yY2UgaW4gTmV3dG9uLiBmb3JjZSA8PSAwIGVxdWFscyBkaXNhYmxlZC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbW90b3JUb3JxdWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21vdG9yVG9ycXVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtb3RvclRvcnF1ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtb3RvclRvcnF1ZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yKCkubW90b3JUb3JxdWUgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogSWYgdGhlIHR3byBjb25uZWN0ZWQgUmlnaWRCb2RpZXMgY29sbGlkZSB3aXRoIGVhdGggb3RoZXIuIChEZWZhdWx0ID0gZmFsc2UpXHJcbiAgICAgKi9cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmdcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIG1vdG9yVG9ycXVlOiB0aGlzLm1vdG9yVG9ycXVlLFxyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tb3RvclRvcnF1ZSA9IF9zZXJpYWxpemF0aW9uLm1vdG9yVG9ycXVlO1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgbXV0YXRvci5tb3RvclRvcnF1ZSA9IHRoaXMubW90b3JUb3JxdWU7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5tb3RvclRvcnF1ZSkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5tb3RvclRvcnF1ZSA9IF9tdXRhdG9yLm1vdG9yVG9ycXVlO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubW90b3JUb3JxdWU7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcm90b3IgPSBuZXcgT0lNTy5Sb3RhdGlvbmFsTGltaXRNb3RvcigpLnNldExpbWl0cyhzdXBlci5taW5Nb3RvciAqIENhbGMuZGVnMnJhZCwgc3VwZXIubWF4TW90b3IgKiBDYWxjLmRlZzJyYWQpO1xyXG4gICAgICB0aGlzLiNyb3Rvci5zZXRNb3Rvcih0aGlzLm1vdG9yU3BlZWQsIHRoaXMubW90b3JUb3JxdWUpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgT0lNTy5SZXZvbHV0ZUpvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KCk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZy5zcHJpbmdEYW1wZXIgPSB0aGlzLnNwcmluZ0RhbXBlcjtcclxuICAgICAgdGhpcy5jb25maWcubGltaXRNb3RvciA9IHRoaXMuI3JvdG9yO1xyXG5cclxuICAgICAgdGhpcy5qb2ludCA9IG5ldyBPSU1PLlJldm9sdXRlSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyZUpvaW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAgKiBBIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gYm9kaWVzIHdpdGggdGhyZWUgRGVncmVlcyBvZiBGcmVlZG9tLCBhbHNvIGtub3duIGFzIGJhbGwgYW5kIHNvY2tldCBqb2ludC4gVHdvIGJvZGllcyBjb25uZWN0ZWQgYXQgdGhlaXIgYW5jaG9yIGJ1dCBmcmVlIHRvIHJvdGF0ZS5cclxuICAgICAqIFVzZWQgZm9yIHRoaW5ncyBsaWtlIHRoZSBjb25uZWN0aW9uIG9mIGJvbmVzIGluIHRoZSBodW1hbiBzaG91bGRlciAoaWYgc2ltcGxpZmllZCwgZWxzZSBiZXR0ZXIgdXNlIEpvaW50UmFnZG9sbCkuIFR3byBSaWdpZEJvZGllcyBuZWVkIHRvIGJlIGRlZmluZWQgdG8gdXNlIGl0LiBPbmx5IHNwcmluZyBzZXR0aW5ncyBjYW4gYmUgZGVmaW5lZC5cclxuICAgICAqIDMgRGVncmVlcyBhcmUgc3dpbmcgaG9yaXpvbnRhbCwgc3dpbmcgdmVydGljYWwgYW5kIHR3aXN0LlxyXG4gICAgICogXHJcbiAgICAgKiBgYGB0ZXh0XHJcbiAgICAgKiAgICAgICAgICAgICAgSm9pbnRIb2xkZXJcclxuICAgICAqICAgICAgICAgeiAgICAgIGJvZHlBbmNob3IgKGUuZy4gSHVtYW4tU2hvdWxkZXIpICAgICBcclxuICAgICAqICAgICAgeSAg4oaRICAgICAgICAgIFxyXG4gICAgICogICAgICAgIFxcfCAgICAgICAgICDilIDilIDilIAo4peP4pSA4pSA4pSAXHJcbiAgICAgKiAgLXggPC0tLXwtLS0+IHggICAgICAgICAgIGJvZHlUaWVkICAgICAgICBcclxuICAgICAqICAgICAgICAgfFxcICAgICAgICAgICAgICAgIChlLmcuIFVwcGVyLUFybSkgXHJcbiAgICAgKiAgICAgICAgIOKGkyAteSAgICAgICBcclxuICAgICAqICAgICAgICAteiAgICAgICAgICBcclxuICAgICAqIGBgYFxyXG4gICAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50U3BoZXJpY2FsIGV4dGVuZHMgSm9pbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IEpvaW50LnJlZ2lzdGVyU3ViY2xhc3MoSm9pbnRTcGhlcmljYWwpO1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2ludDogT0lNTy5TcGhlcmljYWxKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uU3BoZXJpY2FsSm9pbnRDb25maWcgPSBuZXcgT0lNTy5TcGhlcmljYWxKb2ludENvbmZpZygpO1xyXG5cclxuICAgICNzcHJpbmdEYW1waW5nOiBudW1iZXIgPSAwO1xyXG4gICAgI3NwcmluZ0ZyZXF1ZW5jeTogbnVtYmVyID0gMDtcclxuICAgICNzcHJpbmdEYW1wZXI6IE9JTU8uU3ByaW5nRGFtcGVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfbG9jYWxBbmNob3I6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAwLCAwKSkge1xyXG4gICAgICBzdXBlcihfYm9keUFuY2hvciwgX2JvZHlUaWVkKTtcclxuICAgICAgdGhpcy5hbmNob3IgPSBuZXcgVmVjdG9yMyhfbG9jYWxBbmNob3IueCwgX2xvY2FsQW5jaG9yLnksIF9sb2NhbEFuY2hvci56KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdEYW1waW5nO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmcgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3ByaW5nRGFtcGVyKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIFRoZSBzbWFsbGVyIHRoZSB2YWx1ZSB0aGUgbGVzcyByZXN0cmljdGl2ZSBpcyB0aGUgc3ByaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRnJlcXVlbmN5KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdGcmVxdWVuY3k7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdGcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3ByaW5nRGFtcGVyKCkuZnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBzcHJpbmdEYW1waW5nOiB0aGlzLnNwcmluZ0RhbXBpbmcsXHJcbiAgICAgICAgc3ByaW5nRnJlcXVlbmN5OiB0aGlzLnNwcmluZ0ZyZXF1ZW5jeSxcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuc3ByaW5nRGFtcGluZyA9IF9zZXJpYWxpemF0aW9uLnNwcmluZ0RhbXBpbmc7XHJcbiAgICAgIHRoaXMuc3ByaW5nRnJlcXVlbmN5ID0gX3NlcmlhbGl6YXRpb24uc3ByaW5nRnJlcXVlbmN5O1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgbXV0YXRvci5zcHJpbmdEYW1waW5nID0gdGhpcy5zcHJpbmdEYW1waW5nO1xyXG4gICAgICBtdXRhdG9yLnNwcmluZ0ZyZXF1ZW5jeSA9IHRoaXMuc3ByaW5nRnJlcXVlbmN5O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy5tdXRhdGVCYXNlKF9tdXRhdG9yLCBbXCJzcHJpbmdEYW1waW5nXCIsIFwic3ByaW5nRnJlcXVlbmN5XCJdKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNwcmluZ0RhbXBpbmc7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zcHJpbmdGcmVxdWVuY3k7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGVyID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuc3ByaW5nRnJlcXVlbmN5LCB0aGlzLnNwcmluZ0RhbXBpbmcpO1xyXG4gICAgICB0aGlzLmNvbmZpZyA9IG5ldyBPSU1PLlNwaGVyaWNhbEpvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KCk7XHJcbiAgICAgIHRoaXMuY29uZmlnLnNwcmluZ0RhbXBlciA9IHRoaXMuI3NwcmluZ0RhbXBlcjtcclxuXHJcbiAgICAgIHRoaXMuam9pbnQgPSBuZXcgT0lNTy5TcGhlcmljYWxKb2ludCh0aGlzLmNvbmZpZyk7XHJcbiAgICAgIHN1cGVyLmNvbmZpZ3VyZUpvaW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAgKiBBIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gYm9kaWVzIHdpdGggdHdvIGRlZmluZWQgYXhpcyAobm9ybWFsbHkgZS5nLiAoMCwwLDEpIGFuZCByb3RhdGlvbigxLDAsMCkpLCB0aGV5IHNoYXJlIHRoZSBzYW1lIGFuY2hvciBhbmQgaGF2ZSBmcmVlIHJvdGF0aW9uLCBidXQgdHJhbnNmZXIgdGhlIHR3aXN0LlxyXG4gICAgICogSW4gcmVhbGl0eSB1c2VkIGluIGNhcnMgdG8gdHJhbnNmZXIgdGhlIG1vcmUgc3RhYmxlIHN0YXRpb25hcnkgZm9yY2Ugb24gdGhlIHZlbG9jaXR5IGF4aXMgdG8gdGhlIGJ1bXBpbmcsIGRhbXBlZCBtb3Zpbmcgd2hlZWwuIFR3byBSaWdpZEJvZGllcyBuZWVkIHRvIGJlIGRlZmluZWQgdG8gdXNlIGl0LlxyXG4gICAgICogVGhlIHR3byBtb3RvcnMgY2FuIGJlIGRlZmluZWQgZm9yIHRoZSB0d28gcm90YXRpb24gYXhpcywgYWxvbmcgd2l0aCBzcHJpbmdzLiBcclxuICAgICAqIGBgYHRleHQgICAgICAgIFxyXG4gICAgICogICAgICAgICAgICAgICAgICBcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuY2hvciAtIHR3aXN0IGlzIHRyYW5zZmVyZWQgYmV0d2VlbiBib2RpZXNcclxuICAgICAqICAgICAgICAgeiAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiAgICAgICAgIOKGkSAgICAgICAgICAgIC0tLS0tICB8ICAtLS0tLS0tLS0tLS1cclxuICAgICAqICAgICAgICAgfCAgICAgICAgICAgfCAgICAgfCDihpMgfCAgICAgICAgICAgIHwgXHJcbiAgICAgKiAgLXggPC0tLXwtLS0+IHggICAgIHwgICAgIHwgeCB8ICAgICAgICAgICAgfCAgICAgICAgICAgZS5nLiB3aGVlbCBjYW4gc3RpbGwgdHVybiB1cC9kb3duLCBcclxuICAgICAqICAgICAgICAgfCAgICAgICAgICAgfCAgICAgfCAgIHwgICAgICAgICAgICB8ICAgICAgICAgICBsZWZ0IHJpZ2h0IGJ1dCB0cmFuc2ZlcmluZyBpdCdzIHJvdGF0aW9uIG9uIHRvIHRoZSB3aGVlbC1heGlzLlxyXG4gICAgICogICAgICAgICDihpMgICAgICAgICAgICAtLS0tLSAgICAgLS0tLS0tLS0tLS0tXHJcbiAgICAgKiAgICAgICAgLXogICAgXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgYXR0YWNoZWRSQiAgICAgICAgICBjb25uZWN0ZWRSQlxyXG4gICAgICogICAgICAgICAgICAgICAgKGUuZy4gd2hlZWwpICAgICAgIChlLmcuIHdoZWVsLWF4aXMpXHJcbiAgICAgKiBgYGBcclxuICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICAgKi9cclxuICBleHBvcnQgY2xhc3MgSm9pbnRVbml2ZXJzYWwgZXh0ZW5kcyBKb2ludCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gSm9pbnQucmVnaXN0ZXJTdWJjbGFzcyhKb2ludFVuaXZlcnNhbCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGpvaW50OiBPSU1PLlVuaXZlcnNhbEpvaW50O1xyXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogT0lNTy5Vbml2ZXJzYWxKb2ludENvbmZpZyA9IG5ldyBPSU1PLlVuaXZlcnNhbEpvaW50Q29uZmlnKCk7XHJcblxyXG4gICAgI3NwcmluZ0RhbXBpbmdGaXJzdDogbnVtYmVyID0gMDtcclxuICAgICNzcHJpbmdGcmVxdWVuY3lGaXJzdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjc3ByaW5nRGFtcGluZ1NlY29uZDogbnVtYmVyID0gMDtcclxuICAgICNzcHJpbmdGcmVxdWVuY3lTZWNvbmQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI21heFJvdG9yRmlyc3Q6IG51bWJlciA9IDM2MDtcclxuICAgICNtaW5Sb3RvckZpcnN0OiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yVG9ycXVlRmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgICAjcm90b3JTcGVlZEZpcnN0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtYXhSb3RvclNlY29uZDogbnVtYmVyID0gMzYwO1xyXG4gICAgI21pblJvdG9yU2Vjb25kOiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yVG9ycXVlU2Vjb25kOiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yU3BlZWRTZWNvbmQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI21vdG9yRmlyc3Q6IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3I7XHJcbiAgICAjbW90b3JTZWNvbmQ6IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3I7XHJcbiAgICAjYXhpc1NwcmluZ0RhbXBlckZpcnN0OiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuICAgICNheGlzU3ByaW5nRGFtcGVyU2Vjb25kOiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuICAgICNheGlzRmlyc3Q6IE9JTU8uVmVjMztcclxuICAgICNheGlzU2Vjb25kOiBPSU1PLlZlYzM7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9heGlzRmlyc3Q6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygxLCAwLCAwKSwgX2F4aXNTZWNvbmQ6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAwLCAxKSwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCk7XHJcbiAgICAgIHRoaXMuYXhpc0ZpcnN0ID0gX2F4aXNGaXJzdDtcclxuICAgICAgdGhpcy5heGlzU2Vjb25kID0gX2F4aXNTZWNvbmQ7XHJcbiAgICAgIHRoaXMuYW5jaG9yID0gX2xvY2FsQW5jaG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBHZXQvU2V0IHRyYW5zZm9yIG9mIGZ1ZGdlIHByb3BlcnRpZXMgdG8gdGhlIHBoeXNpY3MgZW5naW5lXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBheGlzIGNvbm5lY3RpbmcgdGhlIHRoZSB0d28ge0BsaW5rIE5vZGV9cyBlLmcuIFZlY3RvcjMoMCwxLDApIHRvIGhhdmUgYSB1cHdhcmQgY29ubmVjdGlvbi5cclxuICAgICAqICBXaGVuIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdGhlIGpvaW50IG5lZWRzIHRvIGJlIHJlY29ubmVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGF4aXNGaXJzdCgpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRoaXMuI2F4aXNGaXJzdC54LCB0aGlzLiNheGlzRmlyc3QueSwgdGhpcy4jYXhpc0ZpcnN0LnopO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBheGlzRmlyc3QoX3ZhbHVlOiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMuI2F4aXNGaXJzdCA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICogVGhlIGF4aXMgY29ubmVjdGluZyB0aGUgdGhlIHR3byB7QGxpbmsgTm9kZX1zIGUuZy4gVmVjdG9yMygwLDEsMCkgdG8gaGF2ZSBhIHVwd2FyZCBjb25uZWN0aW9uLlxyXG4gICAgKiAgV2hlbiBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uIHRoZSBqb2ludCBuZWVkcyB0byBiZSByZWNvbm5lY3RlZC5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGF4aXNTZWNvbmQoKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLiNheGlzU2Vjb25kLngsIHRoaXMuI2F4aXNTZWNvbmQueSwgdGhpcy4jYXhpc1NlY29uZC56KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYXhpc1NlY29uZChfdmFsdWU6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy4jYXhpc1NlY29uZCA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGFtcGluZyBvZiB0aGUgc3ByaW5nLiAxIGVxdWFscyBjb21wbGV0bHkgZGFtcGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0RhbXBpbmdGaXJzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRGFtcGluZ0ZpcnN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nRmlyc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGluZ0ZpcnN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFNwcmluZ0RhbXBlcjEoKS5kYW1waW5nUmF0aW8gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gVGhlIHNtYWxsZXIgdGhlIHZhbHVlIHRoZSBsZXNzIHJlc3RyaWN0aXZlIGlzIHRoZSBzcHJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdGcmVxdWVuY3lGaXJzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5Rmlyc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeUZpcnN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeUZpcnN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFNwcmluZ0RhbXBlcjEoKS5mcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGFtcGluZyBvZiB0aGUgc3ByaW5nLiAxIGVxdWFscyBjb21wbGV0bHkgZGFtcGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0RhbXBpbmdTZWNvbmQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0RhbXBpbmdTZWNvbmQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0RhbXBpbmdTZWNvbmQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGluZ1NlY29uZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRTcHJpbmdEYW1wZXIyKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIFRoZSBzbWFsbGVyIHRoZSB2YWx1ZSB0aGUgbGVzcyByZXN0cmljdGl2ZSBpcyB0aGUgc3ByaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRnJlcXVlbmN5U2Vjb25kKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdGcmVxdWVuY3lTZWNvbmQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeVNlY29uZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdGcmVxdWVuY3lTZWNvbmQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3ByaW5nRGFtcGVyMigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgVXBwZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gQXhpcy1BbmdsZSBtZWFzdXJlZCBpbiBEZWdyZWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWF4Um90b3JGaXJzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4Um90b3JGaXJzdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWF4Um90b3JGaXJzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtYXhSb3RvckZpcnN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IxKCkudXBwZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgTG93ZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gQXhpcyBBbmdsZSBtZWFzdXJlZCBpbiBEZWdyZWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWluUm90b3JGaXJzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWluUm90b3JGaXJzdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWluUm90b3JGaXJzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtaW5Sb3RvckZpcnN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IxKCkubG93ZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgdGFyZ2V0IHJvdGF0aW9uYWwgc3BlZWQgb2YgdGhlIG1vdG9yIGluIG0vcy4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90b3JTcGVlZEZpcnN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RvclNwZWVkRmlyc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdG9yU3BlZWRGaXJzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNyb3RvclNwZWVkRmlyc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcjEoKS5tb3RvclNwZWVkID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1heGltdW0gbW90b3IgdG9ycXVlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yVG9ycXVlRmlyc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JvdG9yVG9ycXVlRmlyc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdG9yVG9ycXVlRmlyc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JUb3JxdWVGaXJzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMSgpLm1vdG9yVG9ycXVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMtQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heFJvdG9yU2Vjb25kKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtYXhSb3RvclNlY29uZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWF4Um90b3JTZWNvbmQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWF4Um90b3JTZWNvbmQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcjIoKS51cHBlckxpbWl0ID0gX3ZhbHVlICogQ2FsYy5kZWcycmFkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBMb3dlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzIEFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtaW5Sb3RvclNlY29uZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWluUm90b3JTZWNvbmQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1pblJvdG9yU2Vjb25kKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21pblJvdG9yU2Vjb25kID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IyKCkubG93ZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgdGFyZ2V0IHJvdGF0aW9uYWwgc3BlZWQgb2YgdGhlIG1vdG9yIGluIG0vcy4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90b3JTcGVlZFNlY29uZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jcm90b3JTcGVlZFNlY29uZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcm90b3JTcGVlZFNlY29uZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNyb3RvclNwZWVkU2Vjb25kID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IyKCkubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgbWF4aW11bSBtb3RvciB0b3JxdWUgaW4gTmV3dG9uLiBmb3JjZSA8PSAwIGVxdWFscyBkaXNhYmxlZC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90b3JUb3JxdWVTZWNvbmQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JvdG9yVG9ycXVlU2Vjb25kO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCByb3RvclRvcnF1ZVNlY29uZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNyb3RvclRvcnF1ZVNlY29uZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMigpLm1vdG9yVG9ycXVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIElmIHRoZSB0d28gY29ubmVjdGVkIFJpZ2lkQm9kaWVzIGNvbGxpZGUgd2l0aCBlYXRoIG90aGVyLiAoRGVmYXVsdCA9IGZhbHNlKVxyXG4gICAgICovXHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuI2dldE11dGF0b3IoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5maXJzdEF4aXMgPSB0aGlzLmF4aXNGaXJzdC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zZWNvbmRBeGlzID0gdGhpcy5heGlzU2Vjb25kLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuYXhpc0ZpcnN0ID0gYXdhaXQgbmV3IFZlY3RvcjMoKS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5heGlzRmlyc3QpO1xyXG4gICAgICB0aGlzLmF4aXNTZWNvbmQgPSBhd2FpdCBuZXcgVmVjdG9yMygpLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmF4aXNTZWNvbmQpO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5heGlzRmlyc3QpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYXhpc0ZpcnN0ID0gbmV3IFZlY3RvcjMoLi4uPG51bWJlcltdPihPYmplY3QudmFsdWVzKF9tdXRhdG9yLmF4aXNGaXJzdCkpKTtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYXhpc1NlY29uZCkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5heGlzU2Vjb25kID0gbmV3IFZlY3RvcjMoLi4uPG51bWJlcltdPihPYmplY3QudmFsdWVzKF9tdXRhdG9yLmF4aXNTZWNvbmQpKSk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5heGlzRmlyc3Q7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5heGlzU2Vjb25kO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX211dGF0b3IpO1xyXG4gICAgICB0aGlzLmRlbGV0ZUZyb21NdXRhdG9yKF9tdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKG11dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIG11dGF0b3IuYXhpc0ZpcnN0ID0gdGhpcy5heGlzRmlyc3QuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBtdXRhdG9yLmF4aXNTZWNvbmQgPSB0aGlzLmF4aXNTZWNvbmQuZ2V0TXV0YXRvcigpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jYXhpc1NwcmluZ0RhbXBlckZpcnN0ID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeUZpcnN0LCB0aGlzLiNzcHJpbmdEYW1waW5nRmlyc3QpO1xyXG4gICAgICB0aGlzLiNheGlzU3ByaW5nRGFtcGVyU2Vjb25kID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVNlY29uZCwgdGhpcy4jc3ByaW5nRGFtcGluZ1NlY29uZCk7XHJcblxyXG4gICAgICB0aGlzLiNtb3RvckZpcnN0ID0gbmV3IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHModGhpcy4jbWluUm90b3JGaXJzdCAqIENhbGMuZGVnMnJhZCwgdGhpcy4jbWF4Um90b3JGaXJzdCAqIENhbGMuZGVnMnJhZCk7XHJcbiAgICAgIHRoaXMuI21vdG9yRmlyc3Quc2V0TW90b3IodGhpcy4jcm90b3JTcGVlZEZpcnN0LCB0aGlzLiNyb3RvclRvcnF1ZUZpcnN0KTtcclxuICAgICAgdGhpcy4jbW90b3JTZWNvbmQgPSBuZXcgT0lNTy5Sb3RhdGlvbmFsTGltaXRNb3RvcigpLnNldExpbWl0cyh0aGlzLiNtaW5Sb3RvckZpcnN0ICogQ2FsYy5kZWcycmFkLCB0aGlzLiNtYXhSb3RvckZpcnN0ICogQ2FsYy5kZWcycmFkKTtcclxuICAgICAgdGhpcy4jbW90b3JTZWNvbmQuc2V0TW90b3IodGhpcy4jcm90b3JTcGVlZEZpcnN0LCB0aGlzLiNyb3RvclRvcnF1ZUZpcnN0KTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IE9JTU8uVW5pdmVyc2FsSm9pbnRDb25maWcoKTtcclxuICAgICAgc3VwZXIuY29uc3RydWN0Sm9pbnQodGhpcy4jYXhpc0ZpcnN0LCB0aGlzLiNheGlzU2Vjb25kKTtcclxuICAgICAgdGhpcy5jb25maWcubGltaXRNb3RvcjEgPSB0aGlzLiNtb3RvckZpcnN0O1xyXG4gICAgICB0aGlzLmNvbmZpZy5saW1pdE1vdG9yMiA9IHRoaXMuI21vdG9yU2Vjb25kO1xyXG4gICAgICB0aGlzLmNvbmZpZy5zcHJpbmdEYW1wZXIxID0gdGhpcy4jYXhpc1NwcmluZ0RhbXBlckZpcnN0O1xyXG4gICAgICB0aGlzLmNvbmZpZy5zcHJpbmdEYW1wZXIyID0gdGhpcy4jYXhpc1NwcmluZ0RhbXBlclNlY29uZDtcclxuXHJcbiAgICAgIHRoaXMuam9pbnQgPSBuZXcgT0lNTy5Vbml2ZXJzYWxKb2ludCh0aGlzLmNvbmZpZyk7XHJcbiAgICAgIHN1cGVyLmNvbmZpZ3VyZUpvaW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgI2dldE11dGF0b3IgPSAoKTogTXV0YXRvciA9PiB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge1xyXG4gICAgICAgIHNwcmluZ0RhbXBpbmdGaXJzdDogdGhpcy4jc3ByaW5nRGFtcGluZ0ZpcnN0LFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeUZpcnN0OiB0aGlzLiNzcHJpbmdGcmVxdWVuY3lGaXJzdCxcclxuICAgICAgICBzcHJpbmdEYW1waW5nU2Vjb25kOiB0aGlzLiNzcHJpbmdEYW1waW5nU2Vjb25kLFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeVNlY29uZDogdGhpcy4jc3ByaW5nRnJlcXVlbmN5U2Vjb25kLFxyXG4gICAgICAgIG1heFJvdG9yRmlyc3Q6IHRoaXMuI21heFJvdG9yRmlyc3QsXHJcbiAgICAgICAgbWluUm90b3JGaXJzdDogdGhpcy4jbWluUm90b3JGaXJzdCxcclxuICAgICAgICByb3RvclNwZWVkRmlyc3Q6IHRoaXMuI3JvdG9yU3BlZWRGaXJzdCxcclxuICAgICAgICByb3RvclRvcnF1ZUZpcnN0OiB0aGlzLiNyb3RvclRvcnF1ZUZpcnN0LFxyXG4gICAgICAgIG1heFJvdG9yU2Vjb25kOiB0aGlzLiNtYXhSb3RvclNlY29uZCxcclxuICAgICAgICBtaW5Sb3RvclNlY29uZDogdGhpcy4jbWluUm90b3JTZWNvbmQsXHJcbiAgICAgICAgcm90b3JTcGVlZFNlY29uZDogdGhpcy4jcm90b3JTcGVlZFNlY29uZCxcclxuICAgICAgICByb3RvclRvcnF1ZVNlY29uZDogdGhpcy4jcm90b3JUb3JxdWVTZWNvbmRcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9O1xyXG5cclxuICAgICNtdXRhdGUgPSAoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkID0+IHtcclxuICAgICAgdGhpcy5tdXRhdGVCYXNlKF9tdXRhdG9yLCBbXHJcbiAgICAgICAgXCJzcHJpbmdEYW1waW5nRmlyc3RcIiwgXCJzcHJpbmdGcmVxdWVuY3lGaXJzdFwiLCBcInNwcmluZ0RhbXBpbmdTZWNvbmRcIiwgXCJzcHJpbmdGcmVxdWVuY3lTZWNvbmRcIixcclxuICAgICAgICBcIm1heFJvdG9yRmlyc3RcIiwgXCJtaW5Sb3RvckZpcnN0XCIsIFwicm90b3JTcGVlZEZpcnN0XCIsIFwicm90b3JUb3JxdWVGaXJzdFwiLFxyXG4gICAgICAgIFwibWF4Um90b3JTZWNvbmRcIiwgXCJtaW5Sb3RvclNlY29uZFwiLCBcInJvdG9yU3BlZWRTZWNvbmRcIiwgXCIucm90b3JUb3JxdWVTZWNvbmRcIl1cclxuICAgICAgKTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAgKiBBIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gYm9kaWVzIHdpdGggbm8gbW92ZW1lbnQuIFxyXG4gICAgICogQmVzdCB3YXkgdG8gc2ltdWxhdGUgY29udmV4IG9iamVjdHMgbGlrZSBhIGNoYWlyIHNlYXQgY29ubmVjdGVkIHRvIGNoYWlyIGxlZ3MuXHJcbiAgICAgKiBUaGUgYWN0dWFsIGFuY2hvciBwb2ludCBkb2VzIG5vdCBtYXR0ZXIgdGhhdCBtdWNoLCBvbmx5IGluIHZlcnkgc3BlY2lmaWMgZWRnZSBjYXNlcy5cclxuICAgICAqIEJlY2F1c2Ugd2VsZGluZyBtZWFucyB0aGV5IHNpbXBseSBkbyBub3QgZGlzY29ubmVjdC4gKHVubGVzcyB5b3UgYWRkIEJyZWFrYWJpbGl0eSlcclxuICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICAgKi9cclxuICBleHBvcnQgY2xhc3MgSm9pbnRXZWxkaW5nIGV4dGVuZHMgSm9pbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IEpvaW50LnJlZ2lzdGVyU3ViY2xhc3MoSm9pbnRXZWxkaW5nKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uR2VuZXJpY0pvaW50O1xyXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogT0lNTy5HZW5lcmljSm9pbnRDb25maWcgPSBuZXcgT0lNTy5HZW5lcmljSm9pbnRDb25maWcoKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCk7XHJcblxyXG4gICAgICB0aGlzLmFuY2hvciA9IG5ldyBWZWN0b3IzKF9sb2NhbEFuY2hvci54LCBfbG9jYWxBbmNob3IueSwgX2xvY2FsQW5jaG9yLnopO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZ1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgT0lNTy5HZW5lcmljSm9pbnRDb25maWcoKTtcclxuICAgICAgc3VwZXIuY29uc3RydWN0Sm9pbnQobmV3IE9JTU8uTWF0MygpLCBuZXcgT0lNTy5NYXQzKCkpO1xyXG5cclxuICAgICAgdGhpcy5qb2ludCA9IG5ldyBPSU1PLkdlbmVyaWNKb2ludCh0aGlzLmNvbmZpZyk7XHJcbiAgICAgIHRoaXMuam9pbnQuc2V0QWxsb3dDb2xsaXNpb24odGhpcy5pbnRlcm5hbENvbGxpc2lvbik7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0Rpc3RyaWJ1dGlvbi9PaW1vUGh5c2ljcy5kLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAqIE1hbmFnZXMgdGhlIE9JTU8gcGh5c2ljcyBlbmdpbmUgZm9yIEZVREdFLiBNdWx0aXBsZSBpbnN0YW5jZXMgbWF5IGJlIGNyZWF0ZWQsIG9uZSBpcyBhY3RpdmUgYXQgYSB0aW1lLlxyXG4gICAgKiBBbGwgbWV0aG9kcyBhcmUgc3RhdGljIGFuZCB1c2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW5zdGFuY2UuIEF0IHN0YXJ0dXAsIGEgZGVmYXVsdCBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCBiZWNvbWUgdGhlIGFjdGl2ZSBpbnN0YW5jZVxyXG4gICAgKiBBdHRhY2hpbmcgYSB7QGxpbmsgQ29tcG9uZW50UmlnaWRib2R5fSB0byBhIHtAbGluayBOb2RlfSBwbGFjZXMgYSBwaHlzaWNzIGNvbGxpZGVyIGluIHRoZSBwaHlzaWNzIGluc3RhbmNlIGFjdGl2ZSBhdCB0aGF0IHRpbWUuXHJcbiAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVIDIwMjBcclxuICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBoeXNpY3Mge1xyXG4gICAgLyoqIFRoZSBTRVRUSU5HUyB0aGF0IGFwcGx5IHRvIHRoZSBwaHlzaWNhbCB3b3JsZC4gUmFuZ2luZyBmcm9tIHRoaW5ncyBsaWtlIHNsZWVwaW5nLCBjb2xsaXNpb25TaGFwZVRoaWNrbmVzcyBhbmQgb3RoZXJzICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldHRpbmdzOiBQaHlzaWNzU2V0dGluZ3MgPSBuZXcgUGh5c2ljc1NldHRpbmdzKENPTExJU0lPTl9HUk9VUC5ERUZBVUxULCAoQ09MTElTSU9OX0dST1VQLkRFRkFVTFQgfCBDT0xMSVNJT05fR1JPVVAuR1JPVVBfMSB8IENPTExJU0lPTl9HUk9VUC5HUk9VUF8yIHwgQ09MTElTSU9OX0dST1VQLkdST1VQXzMgfCBDT0xMSVNJT05fR1JPVVAuR1JPVVBfNCkpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgxpJhY3RpdmU6IFBoeXNpY3MgPSBuZXcgUGh5c2ljcygpO1xyXG5cclxuICAgIHByaXZhdGUgb2ltb1dvcmxkOiBPSU1PLldvcmxkO1xyXG4gICAgcHJpdmF0ZSBib2R5TGlzdDogQ29tcG9uZW50UmlnaWRib2R5W10gPSBuZXcgQXJyYXkoKTtcclxuICAgIHByaXZhdGUgam9pbnRMaXN0OiBKb2ludFtdID0gbmV3IEFycmF5KCk7XHJcblxyXG4gICAgLyoqIFRoZSByZW5kZXJpbmcgb2YgcGh5c2ljYWwgZGVidWcgaW5mb3JtYXRpb25zLiBVc2VkIGludGVybmFsbHkgbm8gaW50ZXJhY3Rpb24gbmVlZGVkLiovXHJcbiAgICAjZGVidWdEcmF3OiBQaHlzaWNzRGVidWdEcmF3O1xyXG4gICAgLyoqIFRoZSBjYW1lcmEvdmlld3BvcnQgdGhlIHBoeXNpY3MgYXJlIGRlYnVnZ2VkIHRvLiBVc2VkIGludGVybmFsbHkgbm8gaW50ZXJhY3Rpb24gbmVlZGVkLiAqL1xyXG4gICAgI21haW5DYW06IENvbXBvbmVudENhbWVyYTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgT0lNTyA9PSBcInVuZGVmaW5lZFwiKSB7Ly8gQ2hlY2sgaWYgT0lNTyBOYW1lc3BhY2Ugd2FzIGxvYWRlZCwgZWxzZSBkbyBub3QgdXNlIGFueSBwaHlzaWNzLiBDaGVjayBpcyBuZWVkZWQgdG8gZW5zdXJlIEZVREdFIGNhbiBiZSB1c2VkIHdpdGhvdXQgUGh5c2ljc1xyXG4gICAgICAgIERlYnVnLmVycm9yKFwiT0lNTyBwaHlzaWNzIGVuZ2luZSBub3QgY29ubmVjdGVkIVwiKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm9pbW9Xb3JsZCA9IG5ldyBPSU1PLldvcmxkKCk7XHJcbiAgICAgIHRoaXMuI2RlYnVnRHJhdyA9IG5ldyBQaHlzaWNzRGVidWdEcmF3KCk7ICAvL0NyZWF0ZSBhIEZVREdFIFBoeXNpY3MgZGVidWdnaW5nIGhhbmRsaW5nIG9iamVjdFxyXG4gICAgICB0aGlzLm9pbW9Xb3JsZC5zZXREZWJ1Z0RyYXcodGhpcy4jZGVidWdEcmF3Lm9pbW9EZWJ1Z0RyYXcpOyAvL1RlbGwgT2ltb1BoeXNpY3Mgd2hlcmUgdG8gZGVidWcgdG8gYW5kIGhvdyBpdCB3aWxsIGJlIGhhbmRsZWRcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lIHRoZSBjdXJyZW50bHkgYWN0aXZlIFBoeXNpY3MgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXQgYWN0aXZlSW5zdGFuY2UoX3BoeXNpY3M6IFBoeXNpY3MpIHtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZSA9IF9waHlzaWNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgUGh5c2ljcyBpbnN0YW5jZSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgYWN0aXZlSW5zdGFuY2UoKTogUGh5c2ljcyB7XHJcbiAgICAgIHJldHVybiBQaHlzaWNzLsaSYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGRlYnVnRHJhdygpOiBQaHlzaWNzRGVidWdEcmF3IHtcclxuICAgICAgcmV0dXJuIFBoeXNpY3MuxpJhY3RpdmUuI2RlYnVnRHJhdztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IG1haW5DYW0oKTogQ29tcG9uZW50Q2FtZXJhIHtcclxuICAgICAgcmV0dXJuIFBoeXNpY3MuxpJhY3RpdmUuI21haW5DYW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENhc3QgYSBSQVkgaW50byB0aGUgcGh5c2ljYWwgd29ybGQgZnJvbSBhIG9yaWdpbiBwb2ludCBpbiBhIGNlcnRhaW4gZGlyZWN0aW9uLiBSZWNlaXZpbmcgaW5mb3JtYXRpb25zIGFib3V0IHRoZSBoaXQgb2JqZWN0IGFuZCB0aGVcclxuICAgICogaGl0IHBvaW50LiBEbyBub3Qgc3BlY2lmeSBhIF9ncm91cCB0byByYXljYXN0IHRoZSB3aG9sZSB3b3JsZCwgZWxzZSBvbmx5IGJvZGllcyB3aXRoaW4gdGhlIHNwZWNpZmljIGdyb3VwIGNhbiBiZSBoaXQuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByYXljYXN0KF9vcmlnaW46IFZlY3RvcjMsIF9kaXJlY3Rpb246IFZlY3RvcjMsIF9sZW5ndGg6IG51bWJlciA9IDEsIF9kZWJ1Z0RyYXc6IGJvb2xlYW4gPSBmYWxzZSwgX2dyb3VwOiBDT0xMSVNJT05fR1JPVVAgPSBDT0xMSVNJT05fR1JPVVAuREVGQVVMVCk6IFJheUhpdEluZm8ge1xyXG4gICAgICBsZXQgaGl0SW5mbzogUmF5SGl0SW5mbyA9IG5ldyBSYXlIaXRJbmZvKCk7XHJcbiAgICAgIGxldCByYXk6IE9JTU8uUmF5Q2FzdENsb3Nlc3QgPSBuZXcgT0lNTy5SYXlDYXN0Q2xvc2VzdCgpO1xyXG4gICAgICBsZXQgYmVnaW46IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzMoX29yaWdpbi54LCBfb3JpZ2luLnksIF9vcmlnaW4ueik7XHJcbiAgICAgIGxldCBlbmQ6IE9JTU8uVmVjMyA9IHRoaXMuZ2V0UmF5RW5kUG9pbnQoYmVnaW4sIG5ldyBWZWN0b3IzKF9kaXJlY3Rpb24ueCwgX2RpcmVjdGlvbi55LCBfZGlyZWN0aW9uLnopLCBfbGVuZ3RoKTtcclxuICAgICAgcmF5LmNsZWFyKCk7XHJcbiAgICAgIGlmIChfZ3JvdXAgPT0gQ09MTElTSU9OX0dST1VQLkRFRkFVTFQpIHsgLy9DYXNlIDE6IFJheWNhc3RpbmcgdGhlIHdob2xlIHdvcmxkLCBub3JtYWwgbW9kZVxyXG4gICAgICAgIFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkLnJheUNhc3QoYmVnaW4sIGVuZCwgcmF5KTtcclxuICAgICAgfSBlbHNlIHsgLy9DYXNlMjogUmF5Y2FzdGluZyBvbiBlYWNoIGJvZHkgaW4gYSBzcGVjaWZpYyBncm91cFxyXG4gICAgICAgIGxldCBhbGxIaXRzOiBSYXlIaXRJbmZvW10gPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLmJvZHlMaXN0LmZvckVhY2goZnVuY3Rpb24gKF92YWx1ZTogQ29tcG9uZW50UmlnaWRib2R5KTogdm9pZCB7XHJcbiAgICAgICAgICBpZiAoX3ZhbHVlLmNvbGxpc2lvbkdyb3VwID09IF9ncm91cCkge1xyXG4gICAgICAgICAgICBoaXRJbmZvID0gX3ZhbHVlLnJheWNhc3RUaGlzQm9keShfb3JpZ2luLCBfZGlyZWN0aW9uLCBfbGVuZ3RoKTtcclxuICAgICAgICAgICAgaWYgKGhpdEluZm8uaGl0ID09IHRydWUpIHsgLy9FdmVyeSBoaXQgaXMgY291bGQgcG90ZW50aWFsbHkgYmUgdGhlIGNsb3Nlc3RcclxuICAgICAgICAgICAgICBhbGxIaXRzLnB1c2goaGl0SW5mbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBhbGxIaXRzLmZvckVhY2goZnVuY3Rpb24gKF92YWx1ZTogUmF5SGl0SW5mbyk6IHZvaWQgeyAvL2dldCB0aGUgY2xvc2VzdCBoaXRJbmZvXHJcbiAgICAgICAgICBpZiAoX3ZhbHVlLmhpdERpc3RhbmNlIDwgaGl0SW5mby5oaXREaXN0YW5jZSB8fCBoaXRJbmZvLmhpdCA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBoaXRJbmZvID0gX3ZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyYXkuaGl0KSB7IC8vRmlsbCBpbiBpbmZvcm1hdGlvbnMgb24gdGhlIGhpdFxyXG4gICAgICAgIGhpdEluZm8uaGl0ID0gdHJ1ZTtcclxuICAgICAgICBoaXRJbmZvLmhpdFBvaW50ID0gbmV3IFZlY3RvcjMocmF5LnBvc2l0aW9uLngsIHJheS5wb3NpdGlvbi55LCByYXkucG9zaXRpb24ueik7XHJcbiAgICAgICAgaGl0SW5mby5oaXROb3JtYWwgPSBuZXcgVmVjdG9yMyhyYXkubm9ybWFsLngsIHJheS5ub3JtYWwueSwgcmF5Lm5vcm1hbC56KTtcclxuICAgICAgICBoaXRJbmZvLmhpdERpc3RhbmNlID0gdGhpcy5nZXRSYXlEaXN0YW5jZShfb3JpZ2luLCBoaXRJbmZvLmhpdFBvaW50KTtcclxuICAgICAgICBoaXRJbmZvLnJpZ2lkYm9keUNvbXBvbmVudCA9IHJheS5zaGFwZS51c2VyRGF0YTtcclxuICAgICAgICBoaXRJbmZvLnJheUVuZCA9IG5ldyBWZWN0b3IzKGVuZC54LCBlbmQueSwgZW5kLnopO1xyXG4gICAgICAgIGhpdEluZm8ucmF5T3JpZ2luID0gX29yaWdpbjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBoaXRJbmZvLnJheU9yaWdpbiA9IF9vcmlnaW47XHJcbiAgICAgICAgaGl0SW5mby5oaXRQb2ludCA9IG5ldyBWZWN0b3IzKGVuZC54LCBlbmQueSwgZW5kLnopO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChfZGVidWdEcmF3KSB7IC8vSGFuZGxlIGRlYnVnZ2luZ1xyXG4gICAgICAgIFBoeXNpY3MuxpJhY3RpdmUuI2RlYnVnRHJhdy5kZWJ1Z1JheShoaXRJbmZvLnJheU9yaWdpbiwgaGl0SW5mby5oaXRQb2ludCwgbmV3IENvbG9yKDAsIDEsIDAsIDEpKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaGl0SW5mbztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFNpbXVsYXRlcyB0aGUgcGh5c2ljYWwgd29ybGQuIF9kZWx0YVRpbWUgaXMgdGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gcGh5c2ljYWwgc3RlcHMgaW4gc2Vjb25kcy4gRGVmYXVsdCBpcyB7QGxpbmsgTG9vcC50aW1lRnJhbWVHYW1lfSAvIDEwMDAgdG8gcnVuIGluIHN5bmMgd2l0aCB0aGUge0BsaW5rIExvb3B9LlxyXG4gICAgKiBUaGUgbWF4aW11bSB2YWx1ZSBpcyAxLzMwIG9mIGEgc2Vjb25kLCB0byBoYXZlIG1vcmUgY29uc2lzdGVudCBmcmFtZSBjYWxjdWxhdGlvbnMuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzaW11bGF0ZShfZGVsdGFUaW1lOiBudW1iZXIgPSBMb29wLnRpbWVGcmFtZUdhbWUgLyAxMDAwKTogdm9pZCB7XHJcbiAgICAgIGlmIChQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdC5sZW5ndGggPiAwKVxyXG4gICAgICAgIFBoeXNpY3MuY29ubmVjdEpvaW50cygpOyAvLyBDb25uZWN0IGpvaW50cyBpZiBhbnl0aGluZyBoYXMgaGFwcGVuZWQgYmV0d2VlbiB0aGUgbGFzdCBjYWxsIHRvIGFueSBvZiB0aGUgdHdvIHBhaXJlZCByaWdpZGJvZGllc1xyXG4gICAgICBpZiAoX2RlbHRhVGltZSA9PSAwKSAvLyBObyB0aW1lIHBhc3NlZCwgbm8gbmVlZCB0byB1cGRhdGUgdGhlIHBoeXNpY3Mgd29ybGRcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBfZGVsdGFUaW1lID0gX2RlbHRhVGltZSA+IDEgLyAzMCA/IDEgLyAzMCA6IF9kZWx0YVRpbWU7IC8vIElmIGluc3RlYWQgb2YgYSBmaXhlZCByYXRlIHRoZSBnYW1lIGZyYW1lcmF0ZSBpcyB1c2VkLCBtYWtlIHN1cmUgaXJyZWd1bGFyIHRpbWluZ3MgYXJlIGZpeGVkIHRvIDMwZnBzXHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkLnN0ZXAoX2RlbHRhVGltZSk7ICAvLyBVcGRhdGUgdGhlIHNpbXVsYXRpb24gYnkgdGhlIGdpdmVuIGRlbHRhVGltZVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW5zdGFuY2UgdXNpbmcgdGhlIHtAbGluayBDb21wb25lbnRDYW1lcmF9IGdpdmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhdyhfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEsIF9tb2RlPzogUEhZU0lDU19ERUJVR01PREUpOiB2b2lkIHtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS4jZGVidWdEcmF3LnNldERlYnVnTW9kZShfbW9kZSk7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuI21haW5DYW0gPSBfY21wQ2FtZXJhO1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5kZWJ1Z0RyYXcoKTsgLy9GaWxsaW5nIHRoZSBwaHlzaWNzIHdvcmxkIGRlYnVnIGluZm9ybWF0aW9ucyBpbnRvIHRoZSBkZWJ1ZyByZW5kZXJpbmcgaGFuZGxlclxyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLiNkZWJ1Z0RyYXcuZHJhd0J1ZmZlcnMoKTtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS4jZGVidWdEcmF3LmNsZWFyQnVmZmVycygpOyAgLy9VcGRhdGVzIGluZm8gYWJvdXQgdGhlIGN1cnJlbnQgcHJvamVjdGlvbiwgcmVzZXR0aW5nIHRoZSBwb2ludHMvbGluZXMvdHJpYW5nbGVzIHRoYXQgbmVlZCB0byBiZSBkcmF3biBmcm9tIGRlYnVnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogQWRqdXN0cyB0aGUgdHJhbnNmb3JtcyBvZiB0aGUge0BsaW5rIENvbXBvbmVudFJpZ2lkYm9keX1zIGluIHRoZSBnaXZlbiBicmFuY2ggdG8gbWF0Y2ggdGhlaXIgbm9kZXMgb3IgbWVzaGVzXHJcbiAgICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkanVzdFRyYW5zZm9ybXMoX2JyYW5jaDogTm9kZSwgX3RvTWVzaDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlci5wcmVwYXJlKF9icmFuY2gsIHsgaWdub3JlUGh5c2ljczogdHJ1ZSB9KTtcclxuICAgICAgZm9yIChsZXQgbm9kZSBvZiBSZW5kZXIubm9kZXNQaHlzaWNzKVxyXG4gICAgICAgIG5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudFJpZ2lkYm9keSkuaW5pdGlhbGl6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBHZXQgdGhlIGFwcGxpZWQgZ3Jhdml0YXRpb25hbCBmb3JjZSBvZiB0aGUgYWN0aXZlIGluc3RhbmNlLiBEZWZhdWx0IGVhcnRoIGdyYXZpdHkgPSA5LjgxIG0vc1xyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0R3Jhdml0eSgpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHRtcFZlYzogT0lNTy5WZWMzID0gUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuZ2V0R3Jhdml0eSgpO1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModG1wVmVjLngsIHRtcFZlYy55LCB0bXBWZWMueik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFNldCB0aGUgYXBwbGllZCBncmF2aXRhdGlvbmFsIGZvcmNlIG9mIHRoZSBhY3RpdmUgaW5zdGFuY2UuIERlZmF1bHQgZWFydGggZ3Jhdml0eSA9IDkuODEgbS9zXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXRHcmF2aXR5KF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgdG1wVmVjOiBPSU1PLlZlYzMgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5zZXRHcmF2aXR5KHRtcFZlYyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFkZCBhIG5ldyBPSU1PIFJpZ2lkYm9keSB0byB0aGUgYWN0aXZlIGluc3RhbmNlLCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgYSBGVURHRSBSaWdpZGJvZHkgQ29tcG9uZW50LlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYWRkUmlnaWRib2R5KF9jbXBSQjogQ29tcG9uZW50UmlnaWRib2R5KTogdm9pZCB7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuYm9keUxpc3QucHVzaChfY21wUkIpO1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5hZGRSaWdpZEJvZHkoX2NtcFJCLmdldE9pbW9SaWdpZGJvZHkoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFJlbW92ZSB0aGUgT0lNTyBSaWdpZGJvZHkgdG8gdGhlIGFjdGl2ZSBpbnN0YW5jZSwgaGFwcGVucyBhdXRvbWF0aWNhbGx5IHdoZW4gcmVtb3ZpbmcgYSBGVURHRSBSaWdpZGJvZHkgQ29tcG9uZW50XHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVSaWdpZGJvZHkoX2NtcFJCOiBDb21wb25lbnRSaWdpZGJvZHkpOiB2b2lkIHtcclxuICAgICAgLy8gVE9ETzogdHdvIGxpc3RzIGFyZSBiZWluZyBtYW5hZ2VkLCBpbmZvIG1pZ2h0IGRldmlhdGUuIENsZWFudXAhXHJcbiAgICAgIGxldCBvaW1vUmlnaWRCb2R5OiBPSU1PLlJpZ2lkQm9keSA9IF9jbXBSQi5nZXRPaW1vUmlnaWRib2R5KCk7XHJcbiAgICAgIGlmIChvaW1vUmlnaWRCb2R5Ll93b3JsZClcclxuICAgICAgICBvaW1vUmlnaWRCb2R5Ll93b3JsZC5yZW1vdmVSaWdpZEJvZHkob2ltb1JpZ2lkQm9keSk7XHJcbiAgICAgIC8vIHdoYXQgaWYgdGhlIHJpZ2lkYm9keXMgb2ltby13b3JsZCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGFjdGl2ZSBpbnN0YW5jZT9cclxuICAgICAgbGV0IGlkOiBudW1iZXIgPSBQaHlzaWNzLsaSYWN0aXZlLmJvZHlMaXN0LmluZGV4T2YoX2NtcFJCKTtcclxuICAgICAgaWYgKGlkID4gLTEpXHJcbiAgICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5ib2R5TGlzdC5zcGxpY2UoaWQsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBZGQgYSBuZXcgT0lNTyBKb2ludC9Db25zdHJhaW50IHRvIHRoZSBhY3RpdmUgaW5zdGFuY2UsIGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIGFkZGluZyBhIEZVREdFIEpvaW50IENvbXBvbmVudFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYWRkSm9pbnQoX2NtcEpvaW50OiBKb2ludCk6IHZvaWQge1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5hZGRKb2ludChfY21wSm9pbnQuZ2V0T2ltb0pvaW50KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDYWxsZWQgaW50ZXJuYWxseSB0byBpbmZvcm0gdGhlIHBoeXNpY3Mgc3lzdGVtIHRoYXQgYSBqb2ludCBoYXMgYSBjaGFuZ2Ugb2YgY29yZSBwcm9wZXJ0aWVzIGFuZCBuZWVkcyB0byBiZSByZWNyZWF0ZWQuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjaGFuZ2VKb2ludFN0YXR1cyhfY21wSm9pbnQ6IEpvaW50KTogdm9pZCB7XHJcbiAgICAgIGlmIChQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdC5pbmRleE9mKF9jbXBKb2ludCkgPCAwKVxyXG4gICAgICAgIFBoeXNpY3MuxpJhY3RpdmUuam9pbnRMaXN0LnB1c2goX2NtcEpvaW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBSZW1vdmUgdGhlIE9JTU8gSm9pbnQvQ29uc3RyYWludCB0byB0aGUgYWN0aXZlIGluc3RhbmNlLCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiByZW1vdmluZyBhIEZVREdFIEpvaW50IENvbXBvbmVudFxyXG4gICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVKb2ludChfY21wSm9pbnQ6IEpvaW50KTogdm9pZCB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQucmVtb3ZlSm9pbnQoX2NtcEpvaW50LmdldE9pbW9Kb2ludCgpKTtcclxuICAgICAgfSBjYXRjaCAoX2Vycm9yOiB1bmtub3duKSB7XHJcbiAgICAgICAgRGVidWcuZnVkZ2UoX2Vycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXR1cm5zIGFsbCB0aGUgQ29tcG9uZW50UmlnaWRib2RpZXMgdGhhdCBhcmUga25vd24gdG8gdGhlIGFjdGl2ZSBpbnN0YW5jZS4gKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Qm9keUxpc3QoKTogQ29tcG9uZW50UmlnaWRib2R5W10ge1xyXG4gICAgICByZXR1cm4gUGh5c2ljcy7GkmFjdGl2ZS5ib2R5TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2l2aW5nIGEgQ29tcG9uZW50UmlnaWRib2R5IGEgc3BlY2lmaWMgaWRlbnRpZmljYXRpb24gbnVtYmVyIHNvIGl0IGNhbiBiZSByZWZlcmVuY2VkIGluIHRoZSBsb2FkaW5nIHByb2Nlc3MuIEFuZCByZW1vdmVkIHJiJ3MgY2FuIHJlY2VpdmUgYSBuZXcgaWQuICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRpc3RyaWJ1dGVCb2R5SUQoKTogbnVtYmVyIHtcclxuICAgICAgbGV0IGZyZWVJZDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGZyZWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5ib2R5TGlzdC5mb3JFYWNoKChfdmFsdWU6IENvbXBvbmVudFJpZ2lkYm9keSk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGlmIChfdmFsdWUuaWQgIT0gZnJlZUlkKSB7XHJcbiAgICAgICAgICBmcmVlID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZnJlZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWZyZWUpIHtcclxuICAgICAgICAgIGZyZWVJZCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gZnJlZUlkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIENvbm5lY3QgYWxsIGpvaW50cyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHlldC4gVXNlZCBpbnRlcm5hbGx5IG5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgY2FsbGVkIGFuZCBuZWVkZWQgdG8gbWFrZSBzdXJlIGpvaW50cyBjb25uZWN0L2Rpc2Nvbm5lY3RcclxuICAgICAqIGlmIGFueSBvZiB0aGUgdHdvIHBhaXJlZCBDb21wb25lbnRSaWdpZGJvZGllcyBjaGFuZ2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY29ubmVjdEpvaW50cygpOiB2b2lkIHsgLy9UcnkgdG8gY29ubmVjdCBkaXJ0eSBqb2ludHMgdW50aWwgdGhleSBhcmUgY29ubmVjdGVkXHJcbiAgICAgIGxldCBqb2ludHNUb0Nvbm5lY3Q6IEpvaW50W10gPSBQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdDtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3QgPSBbXTtcclxuICAgICAgam9pbnRzVG9Db25uZWN0LmZvckVhY2goKF9qb2ludDogSm9pbnQpOiB2b2lkID0+IHtcclxuICAgICAgICBpZiAoX2pvaW50LmlzQ29ubmVjdGVkKCkgPT0gZmFsc2UpXHJcbiAgICAgICAgICBpZiAoX2pvaW50LmlzQWN0aXZlKVxyXG4gICAgICAgICAgICBfam9pbnQuY29ubmVjdCgpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdC5wdXNoKF9qb2ludCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZW1vdmUgYWxsIG9pbW8gam9pbnRzIGFuZCByaWdpZGJvZGllcywgc28gdGhhdCB0aGV5IGNhbiBiZSByZXVzZWQgaW4gYW5vdGhlciB3b3JsZCAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYW51cCgpOiB2b2lkIHtcclxuICAgICAgbGV0IG9pbW9Xb3JsZDogT0lNTy5Xb3JsZCA9IFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkO1xyXG4gICAgICBpZiAob2ltb1dvcmxkICE9IG51bGwpIHtcclxuICAgICAgICAvL1Jlc2V0dGluZyB0aGUgd29ybGQgc28gYSBuZXcgd29ybGQgY2FuIGJlIGNyZWF0ZWQsIGZpeCBmb3IgcmUtb3BlbmluZyBhIHByb2plY3QgaW4gZWRpdG9yLCBtYWtpbmcgc3VyZSB0aGVyZSBhcmUgbm8gb2xkIHRoaW5ncyBjYWxjdWxhdGVkXHJcbiAgICAgICAgbGV0IGpvaW50c1dvcmxkOiBudW1iZXIgPSBvaW1vV29ybGQuZ2V0TnVtSm9pbnRzKCk7XHJcbiAgICAgICAgbGV0IGJvZGllc1dvcmxkOiBudW1iZXIgPSBvaW1vV29ybGQuZ2V0TnVtUmlnaWRCb2RpZXMoKTtcclxuICAgICAgICBmb3IgKGxldCBib2R5IG9mIFBoeXNpY3MuxpJhY3RpdmUuYm9keUxpc3QpXHJcbiAgICAgICAgICBib2R5LmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdCA9IG5ldyBBcnJheSgpOyAvLyBUT0RPOiBzZWUgaWYgaXQgd291bGQgYmUgc21hcnRlciwgZG8gdXNlIHRoZXNlIGFycmF5cy4gRGVmaW5pdGVseSBtb3JlIGludHVpdGl2ZS4uLlxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBqb2ludHNXb3JsZDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgb2ltb0pvaW50OiBPSU1PLkpvaW50ID0gUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuZ2V0Sm9pbnRMaXN0KCk7XHJcbiAgICAgICAgICBvaW1vV29ybGQucmVtb3ZlSm9pbnQob2ltb0pvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGJvZGllc1dvcmxkOyBpKyspIHtcclxuICAgICAgICAgIGxldCBvaW1vQm9keTogT0lNTy5SaWdpZEJvZHkgPSBvaW1vV29ybGQuZ2V0UmlnaWRCb2R5TGlzdCgpO1xyXG4gICAgICAgICAgb2ltb1dvcmxkLnJlbW92ZVJpZ2lkQm9keShvaW1vQm9keSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLyoqIFJldHVybnMgdGhlIENvbXBvbmVudFJpZ2lkYm9keSB3aXRoIHRoZSBnaXZlbiBpZC4gVXNlZCBpbnRlcm5hbGx5IHRvIHJlY29ubmVjdCBqb2ludHMgb24gbG9hZGluZyBpbiB0aGUgZWRpdG9yLiAqL1xyXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgZ2V0Qm9keUJ5SUQoX2lkOiBudW1iZXIpOiBDb21wb25lbnRSaWdpZGJvZHkge1xyXG4gICAgLy8gICBsZXQgYm9keTogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbDtcclxuICAgIC8vICAgUGh5c2ljcy4jYWN0aXZlUGh5c2ljcy5ib2R5TGlzdC5mb3JFYWNoKCh2YWx1ZTogQ29tcG9uZW50UmlnaWRib2R5KTogdm9pZCA9PiB7XHJcbiAgICAvLyAgICAgaWYgKHZhbHVlLmlkID09IF9pZCkge1xyXG4gICAgLy8gICAgICAgYm9keSA9IHZhbHVlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyAgIHJldHVybiBib2R5O1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGVuZHBvaW50IG9mIG1hdGhlbWF0aWNhbCByYXkuIEJ5IGFkZGluZyB0aGUgbXVsdGlwbGllZCBkaXJlY3Rpb24gdG8gdGhlIG9yaWdpbi4gXHJcbiAgICAgICAqIFVzZWQgYmVjYXVzZSBPaW1vUGh5c2ljcyBkZWZpbmVzIHJheSBieSBzdGFydC9lbmQuIEJ1dCBHYW1lRW5naW5lcyBjb21tb25seSB1c2Ugb3JpZ2luL2RpcmVjdGlvbi5cclxuICAgICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRSYXlFbmRQb2ludChfc3RhcnQ6IE9JTU8uVmVjMywgX2RpcmVjdGlvbjogVmVjdG9yMywgX2xlbmd0aDogbnVtYmVyKTogT0lNTy5WZWMzIHtcclxuICAgICAgbGV0IG9yaWdpbjogVmVjdG9yMyA9IFJlY3ljbGVyLmdldChWZWN0b3IzKTtcclxuICAgICAgb3JpZ2luLnNldChfc3RhcnQueCwgX3N0YXJ0LnksIF9zdGFydC56KTtcclxuICAgICAgbGV0IHNjYWxlZERpcmVjdGlvbjogVmVjdG9yMyA9IF9kaXJlY3Rpb24uY2xvbmU7XHJcbiAgICAgIHNjYWxlZERpcmVjdGlvbi5zY2FsZShfbGVuZ3RoKTtcclxuICAgICAgbGV0IGVuZHBvaW50OiBWZWN0b3IzID0gVmVjdG9yMy5TVU0oc2NhbGVkRGlyZWN0aW9uLCBvcmlnaW4pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShzY2FsZWREaXJlY3Rpb24pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShlbmRwb2ludCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG9yaWdpbik7XHJcbiAgICAgIHJldHVybiBuZXcgT0lNTy5WZWMzKGVuZHBvaW50LngsIGVuZHBvaW50LnksIGVuZHBvaW50LnopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBnZXQgdGhlIGRpc3RhbmNlIGluIHdoaWNoIGEgcmF5IGhpdCBieSBzdWJ0cmFjdGluZyBwb2ludHMgZnJvbSBlYWNoIG90aGVyIGFuZCBnZXQgdGhlIHNxdWFyZSByb290IG9mIHRoZSBzcXVhcmVkIHByb2R1Y3Qgb2YgZWFjaCBjb21wb25lbnQuICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRSYXlEaXN0YW5jZShfb3JpZ2luOiBWZWN0b3IzLCBfaGl0UG9pbnQ6IFZlY3RvcjMpOiBudW1iZXIge1xyXG4gICAgICBsZXQgZHg6IG51bWJlciA9IF9vcmlnaW4ueCAtIF9oaXRQb2ludC54O1xyXG4gICAgICBsZXQgZHk6IG51bWJlciA9IF9vcmlnaW4ueSAtIF9oaXRQb2ludC55O1xyXG4gICAgICBsZXQgZHo6IG51bWJlciA9IF9vcmlnaW4ueiAtIF9oaXRQb2ludC56O1xyXG4gICAgICByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkeik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJldHVybnMgdGhlIGFjdHVhbCB1c2VkIHdvcmxkIG9mIHRoZSBPSU1PIHBoeXNpY3MgZW5naW5lLiBObyB1c2VyIGludGVyYWN0aW9uIG5lZWRlZCAtIE9ubHkgZm9yIGFkdmFuY2VkIHVzZXJzIHRoYXQgbmVlZCB0byBhY2Nlc3MgaXQgZGlyZWN0bHkgKi9cclxuICAgIHB1YmxpYyBnZXRPaW1vV29ybGQoKTogT0lNTy5Xb3JsZCB7XHJcbiAgICAgIHJldHVybiBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyAvKiogVXBkYXRlcyBhbGwge0BsaW5rIFJpZ2lkYm9kaWVzfSBrbm93biB0byB0aGUgUGh5c2ljcy53b3JsZCB0byBtYXRjaCB0aGVpciBjb250YWluZXJzIG9yIG1lc2hlcyB0cmFuc2Zvcm1hdGlvbnMgKi9cclxuICAgIC8vIHByaXZhdGUgdXBkYXRlV29ybGRGcm9tV29ybGRNYXRyaXgoX3RvTWVzaDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAvLyAgIGZvciAobGV0IGJvZHkgb2YgdGhpcy5ib2R5TGlzdClcclxuICAgIC8vICAgICBib2R5LnVwZGF0ZUZyb21Xb3JsZChfdG9NZXNoKTtcclxuICAgIC8vIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBEZWZpbmVzIGEgdGhyZWVkaW1lbnNpb25hbCBib3ggYnkgdHdvIGNvcm5lci1wb2ludHMsIG9uZSB3aXRoIG1pbmltYWwgdmFsdWVzIGFuZCBvbmUgd2l0aCBtYXhpbXVtIHZhbHVlc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBCb3ggaW1wbGVtZW50cyBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIG1pbjogVmVjdG9yMztcclxuICAgIHB1YmxpYyBtYXg6IFZlY3RvcjM7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9taW46IFZlY3RvcjMgPSBWZWN0b3IzLk9ORShJbmZpbml0eSksIF9tYXg6IFZlY3RvcjMgPSBWZWN0b3IzLk9ORSgtSW5maW5pdHkpKSB7XHJcbiAgICAgIHRoaXMuc2V0KF9taW4sIF9tYXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lIHRoZSBjb3JuZXJzIG9mIHRoaXMgYm94LCBzdGFuZGFyZCB2YWx1ZXMgYXJlIEluZmluaXR5IGZvciBtaW4sIGFuZCAtSW5maW5pdHkgZm9yIG1heCwgXHJcbiAgICAgKiBjcmVhdGluZyBhbiBpbXBvc3NpYmxlIGludmVydGVkIGJveCB0aGF0IGNhbiBub3QgY29udGFpbiBhbnkgcG9pbnRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX21pbjogVmVjdG9yMyA9IFZlY3RvcjMuT05FKEluZmluaXR5KSwgX21heDogVmVjdG9yMyA9IFZlY3RvcjMuT05FKC1JbmZpbml0eSkpOiB2b2lkIHtcclxuICAgICAgdGhpcy5taW4gPSBfbWluO1xyXG4gICAgICB0aGlzLm1heCA9IF9tYXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFeHBhbmQgdGhlIGJveCBpZiBuZWNlc3NhcnkgdG8gaW5jbHVkZSB0aGUgZ2l2ZW4gcG9pbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGV4cGFuZChfaW5jbHVkZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLm1pbi5taW4oX2luY2x1ZGUpO1xyXG4gICAgICB0aGlzLm1heC5tYXgoX2luY2x1ZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLm1pbi5zZXQoSW5maW5pdHksIEluZmluaXR5LCBJbmZpbml0eSk7XHJcbiAgICAgIHRoaXMubWF4LnNldCgtSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5KTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBTdG9yZXMgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkge0BsaW5rIFJlbmRlcn0tcGlja2luZyBlLmcuIHVzaW5nIHtAbGluayBQaWNrZXJ9IGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBmdXJ0aGVyIGNhbGN1bGF0aW9uIG9mIHBvc2l0aW9ucyBhbmQgbm9ybWFscyBldGMuXHJcbiAgICogXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUGljayB7XHJcbiAgICBwdWJsaWMgbm9kZTogTm9kZTtcclxuICAgIHB1YmxpYyB6QnVmZmVyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG4gICAgcHVibGljIHRleHR1cmVVVjogVmVjdG9yMjtcclxuICAgIHB1YmxpYyBnaXptbz86IENvbXBvbmVudDtcclxuICAgICNtdHhWaWV3VG9Xb3JsZDogTWF0cml4NHg0O1xyXG4gICAgI3Bvc1dvcmxkOiBWZWN0b3IzO1xyXG4gICAgI3Bvc01lc2g6IFZlY3RvcjM7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ub2RlOiBOb2RlKSB7XHJcbiAgICAgIHRoaXMubm9kZSA9IF9ub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWNjZXNzb3IgdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSB3b3JsZCBwb3NpdGlvbiBvZiBpbnRlcnNlY3Rpb24gb2Yge0BsaW5rIFJheX0gYW5kIHtAbGluayBNZXNofSBvbmx5IHdoZW4gdXNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwb3NXb3JsZCgpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKHRoaXMuI3Bvc1dvcmxkKVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNwb3NXb3JsZDtcclxuICAgICAgbGV0IHBvaW50SW5DbGlwU3BhY2U6IFZlY3RvcjMgPSBWZWN0b3IzLloodGhpcy56QnVmZmVyKTtcclxuICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IHRoaXMuI210eFZpZXdUb1dvcmxkLmdldCgpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihwb2ludEluQ2xpcFNwYWNlLCB0aGlzLiNtdHhWaWV3VG9Xb3JsZCwgdHJ1ZSk7XHJcbiAgICAgIGxldCB3OiBudW1iZXIgPSBtWzNdICogcG9pbnRJbkNsaXBTcGFjZS54ICsgbVs3XSAqIHBvaW50SW5DbGlwU3BhY2UueSArIG1bMTFdICogcG9pbnRJbkNsaXBTcGFjZS56ICsgbVsxNV07XHJcbiAgICAgIHJlc3VsdC5zY2FsZSgxIC8gdyk7XHJcblxyXG4gICAgICB0aGlzLiNwb3NXb3JsZCA9IHJlc3VsdDtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjY2Vzc29yIHRvIGNhbGN1bGF0ZSBhbmQgc3RvcmUgcG9zaXRpb24gaW4gbWVzaC1zcGFjZSBvZiBpbnRlcnNlY3Rpb24gb2Yge0BsaW5rIFJheX0gYW5kIHtAbGluayBNZXNofSBvbmx5IHdoZW4gdXNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwb3NNZXNoKCk6IFZlY3RvcjMge1xyXG4gICAgICBpZiAodGhpcy4jcG9zTWVzaClcclxuICAgICAgICByZXR1cm4gdGhpcy4jcG9zTWVzaDtcclxuICAgICAgbGV0IG10eFdvcmxkVG9NZXNoOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSU5WRVJTRSh0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpLm10eFdvcmxkKTtcclxuICAgICAgbGV0IHBvc01lc2g6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKHRoaXMucG9zV29ybGQsIG10eFdvcmxkVG9NZXNoKTtcclxuICAgICAgdGhpcy4jcG9zTWVzaCA9IHBvc01lc2g7XHJcbiAgICAgIHJldHVybiBwb3NNZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWNjZXNzb3IgdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgZmFjZSBub3JtYWwgaW4gd29ybGQtc3BhY2UgYXQgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB7QGxpbmsgUmF5fSBhbmQge0BsaW5rIE1lc2h9IG9ubHkgd2hlbiB1c2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG5vcm1hbCgpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IzO1xyXG5cclxuICAgICAgZm9yIChsZXQgZmFjZSBvZiBjbXBNZXNoLm1lc2guZmFjZXMpIHtcclxuICAgICAgICBpZiAoZmFjZS5pc0luc2lkZSh0aGlzLnBvc01lc2gpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBmYWNlLm5vcm1hbC5jbG9uZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmVzdWx0LnRyYW5zZm9ybShjbXBNZXNoLm10eFdvcmxkLCBmYWxzZSk7XHJcbiAgICAgIHJlc3VsdC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBzb2xlbHkgYnkgdGhlIHJlbmRlcmVyIHRvIGVuYWJsZSBjYWxjdWxhdGlvbiBvZiB0aGUgd29ybGQgY29vcmRpbmF0ZXMgb2YgdGhpcyB7QGxpbmsgUGlja31cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBtdHhWaWV3VG9Xb3JsZChfbXR4Vmlld1RvV29ybGQ6IE1hdHJpeDR4NCkge1xyXG4gICAgICB0aGlzLiNtdHhWaWV3VG9Xb3JsZCA9IF9tdHhWaWV3VG9Xb3JsZDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBQcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgcGlja2luZyB1c2luZyB7QGxpbmsgUmVuZGVyfVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBpY2tlciB7XHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgcmF5IHBsdXMgbWluIGFuZCBtYXggdmFsdWVzIGZvciB0aGUgbmVhciBhbmQgZmFyIHBsYW5lcyB0byBjb25zdHJ1Y3QgdGhlIHBpY2tlci1jYW1lcmEsXHJcbiAgICAgKiB0aGVuIHJlbmRlcnMgdGhlIHBpY2stdGV4dHVyZSBhbmQgcmV0dXJucyBhbiB1bnNvcnRlZCB7QGxpbmsgUGlja30tYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGl0cyBvZiB0aGUgcmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tSYXkoX25vZGVzOiBOb2RlW10sIF9yYXk6IFJheSwgX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIsIF9waWNrR2l6bW9zOiBib29sZWFuID0gZmFsc2UsIF9naXptb3NGaWx0ZXI/OiBNYXA8c3RyaW5nLCBib29sZWFuPik6IFBpY2tbXSB7XHJcbiAgICAgIGxldCBjbXBDYW1lcmFQaWNrOiBDb21wb25lbnRDYW1lcmEgPSBuZXcgQ29tcG9uZW50Q2FtZXJhKCk7XHJcbiAgICAgIGNtcENhbWVyYVBpY2subXR4UGl2b3QudHJhbnNsYXRpb24gPSBfcmF5Lm9yaWdpbjtcclxuICAgICAgY21wQ2FtZXJhUGljay5tdHhQaXZvdC5sb29rQXQoVmVjdG9yMy5TVU0oX3JheS5vcmlnaW4sIF9yYXkuZGlyZWN0aW9uKSk7XHJcbiAgICAgIGNtcENhbWVyYVBpY2sucHJvamVjdENlbnRyYWwoMSwgMC4wMDEsIEZJRUxEX09GX1ZJRVcuRElBR09OQUwsIF9taW4sIF9tYXgpO1xyXG5cclxuICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBSZW5kZXIucGlja0JyYW5jaChfbm9kZXMsIGNtcENhbWVyYVBpY2ssIF9waWNrR2l6bW9zLCBfZ2l6bW9zRmlsdGVyKTtcclxuICAgICAgcmV0dXJuIHBpY2tzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBjYW1lcmEgYW5kIGEgcG9pbnQgb24gaXRzIHZpcnR1YWwgbm9ybWVkIHByb2plY3Rpb24gcGxhbmUgKGRpc3RhbmNlIDEpIHRvIGNvbnN0cnVjdCB0aGUgcGlja2VyLWNhbWVyYSxcclxuICAgICAqIHRoZW4gcmVuZGVycyB0aGUgcGljay10ZXh0dXJlIGFuZCByZXR1cm5zIGFuIHVuc29ydGVkIHtAbGluayBQaWNrfS1hcnJheSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBoaXRzIG9mIHRoZSByYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcGlja0NhbWVyYShfbm9kZXM6IE5vZGVbXSwgX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhLCBfcG9zUHJvamVjdGlvbjogVmVjdG9yMiwgX3BpY2tHaXptb3M6IGJvb2xlYW4gPSBmYWxzZSwgX2dpem1vc0ZpbHRlcj86IE1hcDxzdHJpbmcsIGJvb2xlYW4+KTogUGlja1tdIHtcclxuICAgICAgbGV0IHJheTogUmF5ID0gbmV3IFJheShuZXcgVmVjdG9yMygtX3Bvc1Byb2plY3Rpb24ueCwgX3Bvc1Byb2plY3Rpb24ueSwgMSkpO1xyXG4gICAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSByYXkuZGlyZWN0aW9uLm1hZ25pdHVkZTtcclxuXHJcbiAgICAgIGlmIChfY21wQ2FtZXJhLm5vZGUpIHtcclxuICAgICAgICBsZXQgbXR4Q2FtZXJhOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVChfY21wQ2FtZXJhLm5vZGUubXR4V29ybGQsIF9jbXBDYW1lcmEubXR4UGl2b3QpO1xyXG4gICAgICAgIHJheS50cmFuc2Zvcm0obXR4Q2FtZXJhKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhDYW1lcmEpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICByYXkudHJhbnNmb3JtKF9jbXBDYW1lcmEubXR4UGl2b3QpO1xyXG5cclxuICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBQaWNrZXIucGlja1JheShfbm9kZXMsIHJheSwgbGVuZ3RoICogX2NtcENhbWVyYS5nZXROZWFyKCksIGxlbmd0aCAqIF9jbXBDYW1lcmEuZ2V0RmFyKCksIF9waWNrR2l6bW9zLCBfZ2l6bW9zRmlsdGVyKTtcclxuICAgICAgcmV0dXJuIHBpY2tzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgdGhlIGNhbWVyYSBvZiB0aGUgZ2l2ZW4gdmlld3BvcnQgYW5kIGEgcG9pbnQgdGhlIGNsaWVudCBzdXJmYWNlIHRvIGNvbnN0cnVjdCB0aGUgcGlja2VyLWNhbWVyYSxcclxuICAgICAqIHRoZW4gcmVuZGVycyB0aGUgcGljay10ZXh0dXJlIGFuZCByZXR1cm5zIGFuIHVuc29ydGVkIHtAbGluayBQaWNrfS1hcnJheSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBoaXRzIG9mIHRoZSByYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcGlja1ZpZXdwb3J0KF92aWV3cG9ydDogVmlld3BvcnQsIF9wb3NDbGllbnQ6IFZlY3RvcjIpOiBQaWNrW10ge1xyXG4gICAgICBsZXQgcG9zUHJvamVjdGlvbjogVmVjdG9yMiA9IF92aWV3cG9ydC5wb2ludENsaWVudFRvUHJvamVjdGlvbihfcG9zQ2xpZW50KTtcclxuICAgICAgbGV0IG5vZGVzOiBOb2RlW10gPSBBcnJheS5mcm9tKF92aWV3cG9ydC5nZXRCcmFuY2goKS5nZXRJdGVyYXRvcih0cnVlKSk7XHJcbiAgICAgIGxldCBwaWNrczogUGlja1tdID0gUGlja2VyLnBpY2tDYW1lcmEobm9kZXMsIF92aWV3cG9ydC5jYW1lcmEsIHBvc1Byb2plY3Rpb24sIF92aWV3cG9ydC5naXptb3NFbmFibGVkLCBfdmlld3BvcnQuZ2l6bW9zRmlsdGVyKTtcclxuICAgICAgcmV0dXJuIHBpY2tzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZWQgYnkgYW4gb3JpZ2luIGFuZCBhIGRpcmVjdGlvbiBvZiB0eXBlIHtAbGluayBQaWNrfSwgcmF5cyBhcmUgdXNlZCB0byBjYWxjdWxhdGUgcGlja2luZyBhbmQgaW50ZXJzZWN0aW9uc1xyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJheSB7XHJcbiAgICBwdWJsaWMgb3JpZ2luOiBWZWN0b3IzO1xyXG4gICAgcHVibGljIGRpcmVjdGlvbjogVmVjdG9yMztcclxuICAgIC8qKiBUT0RPOiBzdXBwb3J0IGxlbmd0aCAqL1xyXG4gICAgcHVibGljIGxlbmd0aDogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfZGlyZWN0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5aKDEpLCBfb3JpZ2luOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCksIF9sZW5ndGg6IG51bWJlciA9IDEpIHtcclxuICAgICAgdGhpcy5vcmlnaW4gPSBfb3JpZ2luO1xyXG4gICAgICB0aGlzLmRpcmVjdGlvbiA9IF9kaXJlY3Rpb247XHJcbiAgICAgIHRoaXMubGVuZ3RoID0gX2xlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB0aGlzIHJheSB3aXRoIGEgcGxhbmUgZGVmaW5lZCBieSBcclxuICAgICAqIHRoZSBnaXZlbiBwb2ludCBvZiBvcmlnaW4gYW5kIHRoZSBwbGFuZXMgbm9ybWFsLiBBbGwgdmFsdWVzIGFuZCBjYWxjdWxhdGlvbnNcclxuICAgICAqIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZSBzeXN0ZW0sIHByZWZlcmFibHkgdGhlIHdvcmxkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnRlcnNlY3RQbGFuZShfb3JpZ2luOiBWZWN0b3IzLCBfbm9ybWFsOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBkaWZmZXJlbmNlOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF9vcmlnaW4sIHRoaXMub3JpZ2luKTtcclxuICAgICAgbGV0IGZhY3RvcjogbnVtYmVyID0gVmVjdG9yMy5ET1QoZGlmZmVyZW5jZSwgX25vcm1hbCkgLyBWZWN0b3IzLkRPVCh0aGlzLmRpcmVjdGlvbiwgX25vcm1hbCk7XHJcbiAgICAgIGxldCBpbnRlcnNlY3Q6IFZlY3RvcjMgPSBWZWN0b3IzLlNVTSh0aGlzLm9yaWdpbiwgVmVjdG9yMy5TQ0FMRSh0aGlzLmRpcmVjdGlvbiwgZmFjdG9yKSk7XHJcbiAgICAgIHJldHVybiBpbnRlcnNlY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwb2ludCBvZiBpbnRlcnNlY3Rpb24gb2YgdGhpcyByYXkgd2l0aCBhIHBsYW5lIGRlZmluZWQgYnkgdGhlIGZhY2UuIFxyXG4gICAgICogQWxsIHZhbHVlcyBhbmQgY2FsY3VsYXRpb25zIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZSBzeXN0ZW0sIHByZWZlcmFibHkgdGhlIHdvcmxkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnRlcnNlY3RGYWNlUGxhbmUoX2ZhY2U6IEZhY2UpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJzZWN0UGxhbmUoX2ZhY2UuZ2V0UG9zaXRpb24oMCksIF9mYWNlLm5vcm1hbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzaG9ydGVzdCBkaXN0YW5jZSBmcm9tIHRoZSByYXkgdG8gdGhlIGdpdmVuIHRhcmdldCBwb2ludC5cclxuICAgICAqIEFsbCB2YWx1ZXMgYW5kIGNhbGN1bGF0aW9ucyBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoZSBzYW1lIGNvb3JkaW5hdGUgc3lzdGVtLCBwcmVmZXJhYmx5IHRoZSB3b3JsZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERpc3RhbmNlKF90YXJnZXQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IG9yaWdpblRvVGFyZ2V0OiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF90YXJnZXQsIHRoaXMub3JpZ2luKTtcclxuICAgICAgbGV0IHJheVNlY3Rpb246IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04odGhpcy5kaXJlY3Rpb24sIDEpO1xyXG4gICAgICBsZXQgcHJvamVjdGVkTGVuZ3RoOiBudW1iZXIgPSBWZWN0b3IzLkRPVChvcmlnaW5Ub1RhcmdldCwgcmF5U2VjdGlvbik7XHJcbiAgICAgIHJheVNlY3Rpb24uc2NhbGUocHJvamVjdGVkTGVuZ3RoKTtcclxuICAgICAgcmF5U2VjdGlvbi5hZGQodGhpcy5vcmlnaW4pO1xyXG4gICAgICBsZXQgZGlzdGFuY2U6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX3RhcmdldCwgcmF5U2VjdGlvbik7XHJcbiAgICAgIHJldHVybiBkaXN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybSB0aGUgcmF5IGJ5IHRoZSBnaXZlbiBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zZm9ybShfbXR4VHJhbnNmb3JtOiBNYXRyaXg0eDQpOiB2b2lkIHtcclxuICAgICAgdGhpcy5vcmlnaW4udHJhbnNmb3JtKF9tdHhUcmFuc2Zvcm0pO1xyXG4gICAgICB0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm0oX210eFRyYW5zZm9ybSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlYWRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJheVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGBvcmlnaW46ICR7dGhpcy5vcmlnaW4udG9TdHJpbmcoKX0sIGRpcmVjdGlvbjogJHt0aGlzLmRpcmVjdGlvbi50b1N0cmluZygpfSwgbGVuZ3RoOiAke3RoaXMubGVuZ3RoLnRvUHJlY2lzaW9uKDUpfWA7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBnaXptb3MgZHJhd2luZyBpbnRlcmZhY2UuIHtAbGluayBDb21wb25lbnR9cyBjYW4gdXNlIHRoaXMgdG8gZHJhdyB2aXN1YWwgYWlkcyBpbnNpZGUge0BsaW5rIENvbXBvbmVudC5kcmF3R2l6bW9zfSBhbmQge0BsaW5rIENvbXBvbmVudC5kcmF3R2l6bW9zU2VsZWN0ZWR9LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBHaXptb3Mge1xyXG4gICAgLyoqIFxyXG4gICAgICogVGhlIGRlZmF1bHQgb3BhY2l0eSBvZiBvY2NsdWRlZCBnaXptbyBwYXJ0cy4gVXNlIHRoaXMgdG8gY29udHJvbCB0aGUgdmlzaWJpbGl0eSBvZiBnaXptb3MgYmVoaW5kIG9iamVjdHMuXHJcbiAgICAgKiBTZXQgdG8gMCB0byBtYWtlIG9jY2x1ZGVkIGdpem1vIHBhcnRzIGRpc2FwcGVhci4gU2V0IHRvIDEgdG8gbWFrZSBvY2NsdWRlZCBnaXptbyBwYXJ0cyBmdWxseSB2aXNpYmxlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBhbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSAwLjM7IC8vIGN1cnJlbnRseSBnaXptb3MgY2FuIGFsd2F5cyBiZSBwaWNrZWQgZXZlbiBpZiB0aGlzIGlzIHNldCB0byAwLi4uXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGlja0lkOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwb3NJY29uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7IC8vIGNhY2hlIHRoZSBwb3NpdGlvbnMgb2YgaWNvbnMgdG8gYXZvaWQgZHJhd2luZyB0aGVtIHdpdGhpbiBlYWNoIG90aGVyXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYXJyYXlCdWZmZXI6IFdlYkdMQnVmZmVyID0gUmVuZGVyV2ViR0wuYXNzZXJ0KFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS5jcmVhdGVCdWZmZXIoKSk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbmRleEJ1ZmZlcjogV2ViR0xCdWZmZXIgPSBSZW5kZXJXZWJHTC5hc3NlcnQoUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLmNyZWF0ZUJ1ZmZlcigpKTtcclxuXHJcbiAgICBzdGF0aWMgI2NhbWVyYTogQ29tcG9uZW50Q2FtZXJhOyAvLyBUT0RPOiBtYXliZSByYXRoZXIgcGFzcyB0aGUgY2FtZXJhIGludG8gdGhlIGRyYXdHaXptb3MgbWV0aG9kcyBvbiBjb21wb25lbnRzP1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNhbWVyYSB3aGljaCBpcyBjdXJyZW50bHkgdXNlZCB0byBkcmF3IGdpem1vcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgY2FtZXJhKCk6IENvbXBvbmVudENhbWVyYSB7XHJcbiAgICAgIHJldHVybiBHaXptb3MuI2NhbWVyYTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgcXVhZCgpOiBNZXNoUXVhZCB7XHJcbiAgICAgIGxldCBxdWFkOiBNZXNoUXVhZCA9IG5ldyBNZXNoUXVhZChcIkdpem1vUXVhZFwiKTtcclxuICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKHF1YWQpO1xyXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KEdpem1vcywgXCJxdWFkXCIsIHsgdmFsdWU6IHF1YWQgfSk7XHJcbiAgICAgIHJldHVybiBHaXptb3MucXVhZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgY3ViZSgpOiBNZXNoQ3ViZSB7XHJcbiAgICAgIGxldCBjdWJlOiBNZXNoQ3ViZSA9IG5ldyBNZXNoQ3ViZShcIkdpem1vQ3ViZVwiKTtcclxuICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKGN1YmUpO1xyXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KEdpem1vcywgXCJjdWJlXCIsIHsgdmFsdWU6IGN1YmUgfSk7XHJcbiAgICAgIHJldHVybiBHaXptb3MuY3ViZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgc3BoZXJlKCk6IE1lc2hTcGhlcmUge1xyXG4gICAgICBsZXQgc3BoZXJlOiBNZXNoU3BoZXJlID0gbmV3IE1lc2hTcGhlcmUoXCJHaXptb1NwaGVyZVwiLCA2LCA2KTtcclxuICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKHNwaGVyZSk7XHJcbiAgICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoR2l6bW9zLCBcInNwaGVyZVwiLCB7IHZhbHVlOiBzcGhlcmUgfSk7XHJcbiAgICAgIHJldHVybiBHaXptb3Muc3BoZXJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHRoaW5rIGFib3V0IGRyYXdpbmcgdGhlc2Ugb24gdGhlIGZseSBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlbS4gVGhlbiB3ZSBjb3VsZCBhY2NlcHQgYSBwb3NpdGlvbiwgcmFkaXVzIGV0Yy4gcGFyYW1ldGVyIGFuZCBkcmF3IHRoZW0gaW5kZXBlbmRlbnQgZnJvbSB0aGUgbXR4V29ybGRcclxuICAgIHByaXZhdGUgc3RhdGljIGdldCB3aXJlQ2lyY2xlKCk6IFZlY3RvcjNbXSB7XHJcbiAgICAgIGNvbnN0IHJhZGl1czogbnVtYmVyID0gMC41O1xyXG4gICAgICBjb25zdCBzZWdtZW50czogbnVtYmVyID0gNDU7XHJcbiAgICAgIGNvbnN0IGNpcmNsZTogVmVjdG9yM1tdID0gbmV3IEFycmF5KHNlZ21lbnRzKS5maWxsKG51bGwpLm1hcCgoKSA9PiBSZWN5Y2xlci5nZXQoVmVjdG9yMykpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc2VnbWVudHM7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlOiBudW1iZXIgPSAoaSAvIHNlZ21lbnRzKSAqIDIgKiBNYXRoLlBJO1xyXG4gICAgICAgIGNvbnN0IHg6IG51bWJlciA9IHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKTtcclxuICAgICAgICBjb25zdCB5OiBudW1iZXIgPSByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSk7XHJcbiAgICAgICAgY2lyY2xlW2ldLnNldCh4LCB5LCAwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbGluZXM6IFZlY3RvcjNbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc2VnbWVudHM7IGkrKylcclxuICAgICAgICBsaW5lcy5wdXNoKGNpcmNsZVtpXSwgY2lyY2xlWyhpICsgMSkgJSBzZWdtZW50c10pO1xyXG5cclxuICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShHaXptb3MsIFwid2lyZUNpcmNsZVwiLCB7IHZhbHVlOiBsaW5lcyB9KTtcclxuICAgICAgcmV0dXJuIEdpem1vcy53aXJlQ2lyY2xlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCB3aXJlU3BoZXJlKCk6IFZlY3RvcjNbXSB7XHJcbiAgICAgIGxldCBsaW5lczogVmVjdG9yM1tdID0gR2l6bW9zLndpcmVDaXJjbGUuY29uY2F0KCk7XHJcbiAgICAgIGxldCBtdHhSb3RhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OX1goOTApO1xyXG4gICAgICBsaW5lcy5wdXNoKC4uLkdpem1vcy53aXJlQ2lyY2xlLm1hcCgoX3BvaW50OiBWZWN0b3IzKSA9PiBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF9wb2ludCwgbXR4Um90YXRpb24pKSk7XHJcbiAgICAgIG10eFJvdGF0aW9uLnJvdGF0ZVkoOTApO1xyXG4gICAgICBsaW5lcy5wdXNoKC4uLkdpem1vcy53aXJlQ2lyY2xlLm1hcCgoX3BvaW50OiBWZWN0b3IzKSA9PiBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF9wb2ludCwgbXR4Um90YXRpb24pKSk7XHJcblxyXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KEdpem1vcywgXCJ3aXJlU3BoZXJlXCIsIHsgdmFsdWU6IGxpbmVzIH0pO1xyXG4gICAgICByZXR1cm4gR2l6bW9zLndpcmVTcGhlcmU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0IHdpcmVDb25lKCk6IFZlY3RvcjNbXSB7XHJcbiAgICAgIGNvbnN0IHJhZGl1czogbnVtYmVyID0gMC41O1xyXG4gICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IDE7XHJcbiAgICAgIGNvbnN0IGFwZXg6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgICAgY29uc3QgcXVhZDogVmVjdG9yM1tdID0gW1xyXG4gICAgICAgIG5ldyBWZWN0b3IzKHJhZGl1cywgMCwgaGVpZ2h0KSxcclxuICAgICAgICBuZXcgVmVjdG9yMygtcmFkaXVzLCAwLCBoZWlnaHQpLFxyXG4gICAgICAgIG5ldyBWZWN0b3IzKDAsIHJhZGl1cywgaGVpZ2h0KSxcclxuICAgICAgICBuZXcgVmVjdG9yMygwLCAtcmFkaXVzLCBoZWlnaHQpXHJcbiAgICAgIF07XHJcblxyXG4gICAgICBsZXQgbGluZXM6IFZlY3RvcjNbXSA9IEdpem1vcy53aXJlQ2lyY2xlLm1hcCgoX3BvaW50OiBWZWN0b3IzKSA9PiBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF9wb2ludCwgTWF0cml4NHg0LlRSQU5TTEFUSU9OKFZlY3RvcjMuWigxKSkpKTtcclxuXHJcbiAgICAgIGxpbmVzLnB1c2goLi4uW2FwZXgsIHF1YWRbMF0sIGFwZXgsIHF1YWRbMV0sIGFwZXgsIHF1YWRbMl0sIGFwZXgsIHF1YWRbM11dKTtcclxuXHJcbiAgICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoR2l6bW9zLCBcIndpcmVDb25lXCIsIHsgdmFsdWU6IGxpbmVzIH0pO1xyXG4gICAgICByZXR1cm4gR2l6bW9zLndpcmVDb25lO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCB3aXJlQ3ViZSgpOiBWZWN0b3IzW10ge1xyXG4gICAgICBjb25zdCBoYWxmU2l6ZTogbnVtYmVyID0gMC41O1xyXG4gICAgICBjb25zdCBjdWJlOiBWZWN0b3IzW10gPSBbXHJcbiAgICAgICAgbmV3IFZlY3RvcjMoaGFsZlNpemUsIGhhbGZTaXplLCBoYWxmU2l6ZSksIG5ldyBWZWN0b3IzKC1oYWxmU2l6ZSwgaGFsZlNpemUsIGhhbGZTaXplKSxcclxuICAgICAgICBuZXcgVmVjdG9yMygtaGFsZlNpemUsIC1oYWxmU2l6ZSwgaGFsZlNpemUpLCBuZXcgVmVjdG9yMyhoYWxmU2l6ZSwgLWhhbGZTaXplLCBoYWxmU2l6ZSksXHJcbiAgICAgICAgbmV3IFZlY3RvcjMoaGFsZlNpemUsIGhhbGZTaXplLCAtaGFsZlNpemUpLCBuZXcgVmVjdG9yMygtaGFsZlNpemUsIGhhbGZTaXplLCAtaGFsZlNpemUpLFxyXG4gICAgICAgIG5ldyBWZWN0b3IzKC1oYWxmU2l6ZSwgLWhhbGZTaXplLCAtaGFsZlNpemUpLCBuZXcgVmVjdG9yMyhoYWxmU2l6ZSwgLWhhbGZTaXplLCAtaGFsZlNpemUpXHJcbiAgICAgIF07XHJcblxyXG4gICAgICBjb25zdCBsaW5lczogVmVjdG9yM1tdID0gW1xyXG4gICAgICAgIGN1YmVbMF0sIGN1YmVbMV0sIGN1YmVbMV0sIGN1YmVbMl0sIGN1YmVbMl0sIGN1YmVbM10sIGN1YmVbM10sIGN1YmVbMF0sXHJcbiAgICAgICAgY3ViZVs0XSwgY3ViZVs1XSwgY3ViZVs1XSwgY3ViZVs2XSwgY3ViZVs2XSwgY3ViZVs3XSwgY3ViZVs3XSwgY3ViZVs0XSxcclxuICAgICAgICBjdWJlWzBdLCBjdWJlWzRdLCBjdWJlWzFdLCBjdWJlWzVdLCBjdWJlWzJdLCBjdWJlWzZdLCBjdWJlWzNdLCBjdWJlWzddXHJcbiAgICAgIF07XHJcblxyXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KEdpem1vcywgXCJ3aXJlQ3ViZVwiLCB7IHZhbHVlOiBsaW5lcyB9KTtcclxuICAgICAgcmV0dXJuIEdpem1vcy53aXJlQ3ViZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFyZSB3ZSBjdXJyZW50bHkgcmVuZGVyaW5nIGZvciBwaWNraW5nP1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgcGlja2luZygpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGlja0lkICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyB0aGUgc2NlbmUncyBnaXptb3MgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgZ2l2ZW4gdmlld3BvcnRzIGNhbWVyYS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXcoX3ZpZXdwb3J0OiBWaWV3cG9ydCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuI2NhbWVyYSA9IF92aWV3cG9ydC5jYW1lcmE7XHJcbiAgICAgIEdpem1vcy5wb3NJY29ucy5jbGVhcigpO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBnaXptbyBvZiBSZW5kZXIuZ2l6bW9zKVxyXG4gICAgICAgIFJlZmxlY3Quc2V0KGdpem1vLm5vZGUsIFwiekNhbWVyYVwiLCBfdmlld3BvcnQuY2FtZXJhLnBvaW50V29ybGRUb0NsaXAoZ2l6bW8ubm9kZS5tdHhXb3JsZC50cmFuc2xhdGlvbikueik7XHJcblxyXG4gICAgICBjb25zdCBzb3J0ZWQ6IENvbXBvbmVudFtdID0gUmVuZGVyLmdpem1vcy5nZXRTb3J0ZWQoKF9hLCBfYikgPT4gUmVmbGVjdC5nZXQoX2Iubm9kZSwgXCJ6Q2FtZXJhXCIpIC0gUmVmbGVjdC5nZXQoX2Eubm9kZSwgXCJ6Q2FtZXJhXCIpKTtcclxuICAgICAgZm9yIChjb25zdCBnaXptbyBvZiBzb3J0ZWQpIHtcclxuICAgICAgICBnaXptby5kcmF3R2l6bW9zPy4oKTtcclxuICAgICAgICBpZiAoX3ZpZXdwb3J0Lmdpem1vc1NlbGVjdGVkPy5pbmNsdWRlcyhnaXptby5ub2RlKSlcclxuICAgICAgICAgIGdpem1vLmRyYXdHaXptb3NTZWxlY3RlZD8uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2soX2dpem1vczogQ29tcG9uZW50W10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSwgX3BpY2tlZDogUGlja1tdKTogdm9pZCB7XHJcbiAgICAgIEdpem1vcy4jY2FtZXJhID0gX2NtcENhbWVyYTtcclxuICAgICAgR2l6bW9zLnBvc0ljb25zLmNsZWFyKCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBnaXptbyBvZiBfZ2l6bW9zKSB7XHJcbiAgICAgICAgR2l6bW9zLnBpY2tJZCA9IF9waWNrZWQubGVuZ3RoO1xyXG4gICAgICAgIGdpem1vLmRyYXdHaXptb3MoKTtcclxuICAgICAgICBsZXQgcGljazogUGljayA9IG5ldyBQaWNrKGdpem1vLm5vZGUpO1xyXG4gICAgICAgIHBpY2suZ2l6bW8gPSBnaXptbztcclxuICAgICAgICBfcGlja2VkLnB1c2gocGljayk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEdpem1vcy5waWNrSWQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSBjYW1lcmEgZnJ1c3R1bSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFRoZSBmcnVzdHVtIGlzIG9yaWVudGVkIGFsb25nIHRoZSB6LWF4aXMsIHdpdGggdGhlIHRpcCBvZiB0aGUgdHJ1bmNhdGVkIHB5cmFtaWQgYXQgdGhlIG9yaWdpbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3V2lyZUZydXN0dW0oX2FzcGVjdDogbnVtYmVyLCBfZm92OiBudW1iZXIsIF9uZWFyOiBudW1iZXIsIF9mYXI6IG51bWJlciwgX2RpcmVjdGlvbjogRklFTERfT0ZfVklFVywgX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBmOiBudW1iZXIgPSBNYXRoLnRhbihDYWxjLmRlZzJyYWQgKiBfZm92IC8gMik7XHJcblxyXG4gICAgICBsZXQgc2NhbGVYOiBudW1iZXIgPSBmO1xyXG4gICAgICBsZXQgc2NhbGVZOiBudW1iZXIgPSBmO1xyXG5cclxuICAgICAgc3dpdGNoIChfZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkhPUklaT05UQUw6XHJcbiAgICAgICAgICBzY2FsZVkgPSBmIC8gX2FzcGVjdDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRklFTERfT0ZfVklFVy5WRVJUSUNBTDpcclxuICAgICAgICAgIHNjYWxlWCA9IGYgKiBfYXNwZWN0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkRJQUdPTkFMOlxyXG4gICAgICAgICAgY29uc3QgZGlhZ29uYWxBc3BlY3Q6IG51bWJlciA9IE1hdGguc3FydChfYXNwZWN0KTtcclxuICAgICAgICAgIHNjYWxlWCA9IGYgKiBkaWFnb25hbEFzcGVjdDtcclxuICAgICAgICAgIHNjYWxlWSA9IGYgLyBkaWFnb25hbEFzcGVjdDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBuZWFyWDogbnVtYmVyID0gX25lYXIgKiBzY2FsZVg7XHJcbiAgICAgIGNvbnN0IG5lYXJZOiBudW1iZXIgPSBfbmVhciAqIHNjYWxlWTtcclxuICAgICAgY29uc3QgZmFyWDogbnVtYmVyID0gX2ZhciAqIHNjYWxlWDtcclxuICAgICAgY29uc3QgZmFyWTogbnVtYmVyID0gX2ZhciAqIHNjYWxlWTtcclxuXHJcbiAgICAgIGNvbnN0IGZydXN0dW06IFZlY3RvcjNbXSA9IG5ldyBBcnJheSg4KS5maWxsKG51bGwpLm1hcCgoKSA9PiBSZWN5Y2xlci5nZXQoVmVjdG9yMykpO1xyXG5cclxuICAgICAgZnJ1c3R1bVswXS5zZXQoLW5lYXJYLCBuZWFyWSwgX25lYXIpO1xyXG4gICAgICBmcnVzdHVtWzFdLnNldChuZWFyWCwgbmVhclksIF9uZWFyKTtcclxuICAgICAgZnJ1c3R1bVsyXS5zZXQobmVhclgsIC1uZWFyWSwgX25lYXIpO1xyXG4gICAgICBmcnVzdHVtWzNdLnNldCgtbmVhclgsIC1uZWFyWSwgX25lYXIpO1xyXG5cclxuICAgICAgZnJ1c3R1bVs0XS5zZXQoLWZhclgsIGZhclksIF9mYXIpO1xyXG4gICAgICBmcnVzdHVtWzVdLnNldChmYXJYLCBmYXJZLCBfZmFyKTtcclxuICAgICAgZnJ1c3R1bVs2XS5zZXQoZmFyWCwgLWZhclksIF9mYXIpO1xyXG4gICAgICBmcnVzdHVtWzddLnNldCgtZmFyWCwgLWZhclksIF9mYXIpO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdMaW5lcyhbXHJcbiAgICAgICAgZnJ1c3R1bVswXSwgZnJ1c3R1bVsxXSwgZnJ1c3R1bVsxXSwgZnJ1c3R1bVsyXSwgZnJ1c3R1bVsyXSwgZnJ1c3R1bVszXSwgZnJ1c3R1bVszXSwgZnJ1c3R1bVswXSwgLy8gbmVhciBwbGFuZVxyXG4gICAgICAgIGZydXN0dW1bNF0sIGZydXN0dW1bNV0sIGZydXN0dW1bNV0sIGZydXN0dW1bNl0sIGZydXN0dW1bNl0sIGZydXN0dW1bN10sIGZydXN0dW1bN10sIGZydXN0dW1bNF0sIC8vIGZhciBwbGFuZVxyXG4gICAgICAgIGZydXN0dW1bMF0sIGZydXN0dW1bNF0sIGZydXN0dW1bMV0sIGZydXN0dW1bNV0sIGZydXN0dW1bMl0sIGZydXN0dW1bNl0sIGZydXN0dW1bM10sIGZydXN0dW1bN10gIC8vIHNpZGVzXHJcbiAgICAgIF0sIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKC4uLmZydXN0dW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSB3aXJlZnJhbWUgY3ViZS4gVGhlIGN1YmUgaGFzIGEgc2lkZS1sZW5ndGggb2YgMSBhbmQgaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBvcmlnaW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVDdWJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdMaW5lcyhHaXptb3Mud2lyZUN1YmUsIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSB3aXJlZnJhbWUgc3BoZXJlLiBUaGUgc3BoZXJlIGhhcyBhIGRpYW1ldGVyIG9mIDEgYW5kIGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgb3JpZ2luLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdXaXJlU3BoZXJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBfbXR4V29ybGQuY2xvbmU7XHJcblxyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlU3BoZXJlLCBtdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICAgIG10eFdvcmxkLmxvb2tBdChHaXptb3MuI2NhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgIEdpem1vcy5kcmF3V2lyZUNpcmNsZShtdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhXb3JsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIGNvbmUgd2l0aCBhIGhlaWdodCBhbmQgZGlhbWV0ZXIgb2YgMS4gVGhlIGNvbmUgaXMgb3JpZW50ZWQgYWxvbmcgdGhlIHotYXhpcyB3aXRoIHRoZSB0aXAgYXQgdGhlIG9yaWdpbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3V2lyZUNvbmUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlQ29uZSwgX210eFdvcmxkLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgY2lyY2xlIHdpdGggYSBkaWFtZXRlciBvZiAxLiBUaGUgY2lyY2xlIGxpZXMgaW4gdGhlIHgteSBwbGFuZSwgd2l0aCBpdHMgY2VudGVyIGF0IHRoZSBvcmlnaW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVDaXJjbGUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlQ2lyY2xlLCBfbXR4V29ybGQsIF9jb2xvciwgX2FscGhhT2NjbHVkZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgbGluZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgdGhlIGdpdmVuIHZlcnRpY2VzLiBcclxuICAgICAqIFZlcnRpY2VzIGFyZSBwYWlyZWQgc2VxdWVudGlhbGx5LCBzbyBmb3IgZXhhbXBsZSwgbGluZXMgd2lsbCBiZSBkcmF3biBiZXR3ZWVuIHZlcnRpY2VzIDAgYW5kIDEsIDIgYW5kIDMsIDQgYW5kIDUsIGV0Yy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3TGluZXMoX3ZlcnRpY2VzOiBWZWN0b3IzW10sIF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgY29uc3Qgc2hhZGVyOiB0eXBlb2YgU2hhZGVyID0gU2hhZGVyR2l6bW87XHJcbiAgICAgIHNoYWRlci51c2VQcm9ncmFtKCk7XHJcblxyXG4gICAgICBjb25zdCBsaW5lRGF0YTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShfdmVydGljZXMubGVuZ3RoICogMyk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfdmVydGljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBwb2ludDogVmVjdG9yMyA9IF92ZXJ0aWNlc1tpXTtcclxuICAgICAgICBsaW5lRGF0YS5zZXQocG9pbnQuZ2V0KCksIGkgKiAzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgR2l6bW9zLmJ1ZmZlclBvc2l0aW9ucyhzaGFkZXIsIEdpem1vcy5hcnJheUJ1ZmZlcik7XHJcbiAgICAgIEdpem1vcy5idWZmZXJNYXRyaXgoc2hhZGVyLCBfbXR4V29ybGQpO1xyXG4gICAgICBjcmMzLmJ1ZmZlckRhdGEoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIGxpbmVEYXRhLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRZTkFNSUNfRFJBVyk7XHJcblxyXG4gICAgICBHaXptb3MuZHJhd0dpem1vcyhzaGFkZXIsIEdpem1vcy5kcmF3QXJyYXlzLCBfdmVydGljZXMubGVuZ3RoLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgd2lyZWZyYW1lIG1lc2guXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVNZXNoKF9tZXNoOiBNZXNoLCBfbXR4V29ybGQ6IE1hdHJpeDR4NCwgX2NvbG9yOiBDb2xvciwgX2FscGhhT2NjbHVkZWQ6IG51bWJlciA9IEdpem1vcy5hbHBoYU9jY2x1ZGVkKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNvbnN0IHNoYWRlcjogdHlwZW9mIFNoYWRlciA9IFNoYWRlckdpem1vO1xyXG4gICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgY29uc3QgcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycyA9IF9tZXNoLmdldFJlbmRlckJ1ZmZlcnMoKTtcclxuICAgICAgY29uc3QgcmVuZGVyTWVzaDogUmVuZGVyTWVzaCA9IF9tZXNoLnJlbmRlck1lc2g7IC8vIFRPRE86IGRvbid0IGJyZWFjaCBlbmNhcHN1bGF0aW9uIGhlcmUuLi5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJlbmRlck1lc2guaW5kaWNlcy5sZW5ndGg7IGkgKz0gMykgeyAvLyBUT0RPOiB0aGluayBhYm91dCBjYWNoaW5nIHRoaXMgaW4gdGhlIG1lc2hcclxuICAgICAgICBjb25zdCBhOiBudW1iZXIgPSByZW5kZXJNZXNoLmluZGljZXNbaV07XHJcbiAgICAgICAgY29uc3QgYjogbnVtYmVyID0gcmVuZGVyTWVzaC5pbmRpY2VzW2kgKyAxXTtcclxuICAgICAgICBjb25zdCBjOiBudW1iZXIgPSByZW5kZXJNZXNoLmluZGljZXNbaSArIDJdO1xyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIGxpbmUgc2VnbWVudHMgZm9yIHRoZSB0cmlhbmdsZSB0byB0aGUgbGluZSBpbmRpY2VzXHJcbiAgICAgICAgaW5kaWNlcy5wdXNoKGEsIGIsIGIsIGMsIGMsIGEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgR2l6bW9zLmluZGV4QnVmZmVyKTtcclxuICAgICAgY3JjMy5idWZmZXJEYXRhKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG5ldyBVaW50MTZBcnJheShpbmRpY2VzKSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5EWU5BTUlDX0RSQVcpO1xyXG5cclxuICAgICAgR2l6bW9zLmJ1ZmZlclBvc2l0aW9ucyhzaGFkZXIsIHJlbmRlckJ1ZmZlcnMudmVydGljZXMpO1xyXG4gICAgICBHaXptb3MuYnVmZmVyTWF0cml4KHNoYWRlciwgX210eFdvcmxkKTtcclxuXHJcbiAgICAgIEdpem1vcy5kcmF3R2l6bW9zKHNoYWRlciwgR2l6bW9zLmRyYXdFbGVtZW50c0xpbmVzLCBpbmRpY2VzLmxlbmd0aCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIHNvbGlkIGN1YmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd0N1YmUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd01lc2goR2l6bW9zLmN1YmUsIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIHNvbGlkIHNwaGVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3U3BoZXJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdNZXNoKEdpem1vcy5zcGhlcmUsIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIHNvbGlkIG1lc2guXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd01lc2goX21lc2g6IE1lc2gsIF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgY29uc3Qgc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UgPSBHaXptb3MucGlja2luZyA/IFNoYWRlclBpY2sgOiBTaGFkZXJHaXptbztcclxuICAgICAgc2hhZGVyLnVzZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIGxldCByZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gX21lc2gudXNlUmVuZGVyQnVmZmVycyhzaGFkZXIsIF9tdHhXb3JsZCwgTWF0cml4NHg0LlBST0RVQ1QoR2l6bW9zLiNjYW1lcmEubXR4V29ybGRUb1ZpZXcsIF9tdHhXb3JsZCksIEdpem1vcy5waWNrSWQpO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdHaXptb3Moc2hhZGVyLCBHaXptb3MuZHJhd0VsZW1lbnRzVHJpYW5sZ2VzLCByZW5kZXJCdWZmZXJzLm5JbmRpY2VzLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGFuIGljb24gZnJvbSBhIHtAbGluayBUZXh0dXJlfSBvbiBhIHtAbGluayBNZXNoUXVhZH0uIFRoZSBpY29uIGlzIGFmZmVjdGVkIGJ5IHRoZSBnaXZlbiB0cmFuc2Zvcm0gYW5kIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdJY29uKF90ZXh0dXJlOiBUZXh0dXJlLCBfbXR4V29ybGQ6IE1hdHJpeDR4NCwgX2NvbG9yOiBDb2xvciwgX2FscGhhT2NjbHVkZWQ6IG51bWJlciA9IEdpem1vcy5hbHBoYU9jY2x1ZGVkKTogdm9pZCB7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogc3RyaW5nID0gX210eFdvcmxkLnRyYW5zbGF0aW9uLnRvU3RyaW5nKCk7XHJcbiAgICAgIGlmIChHaXptb3MucG9zSWNvbnMuaGFzKHBvc2l0aW9uKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIEdpem1vcy5wb3NJY29ucy5hZGQocG9zaXRpb24pO1xyXG5cclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGNvbnN0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlID0gR2l6bW9zLnBpY2tpbmcgPyBTaGFkZXJQaWNrVGV4dHVyZWQgOiBTaGFkZXJHaXptb1RleHR1cmVkO1xyXG4gICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBfbXR4V29ybGQuY2xvbmU7XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBfY29sb3IuY2xvbmU7XHJcblxyXG4gICAgICBsZXQgYmFjazogVmVjdG9yMyA9IEdpem1vcy4jY2FtZXJhLm10eFdvcmxkLmZvcndhcmQubmVnYXRlKCk7XHJcbiAgICAgIGxldCB1cDogVmVjdG9yMyA9IEdpem1vcy4jY2FtZXJhLm10eFdvcmxkLnVwO1xyXG4gICAgICBtdHhXb3JsZC5sb29rSW4oYmFjaywgdXApO1xyXG5cclxuICAgICAgbGV0IGRpc3RhbmNlOiBudW1iZXIgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoR2l6bW9zLiNjYW1lcmEubXR4V29ybGQudHJhbnNsYXRpb24sIG10eFdvcmxkLnRyYW5zbGF0aW9uKS5tYWduaXR1ZGU7XHJcbiAgICAgIGxldCBmYWRlRmFyOiBudW1iZXIgPSA0O1xyXG4gICAgICBsZXQgZmFkZU5lYXI6IG51bWJlciA9IDEuNTtcclxuICAgICAgaWYgKGRpc3RhbmNlID4gMCAmJiBkaXN0YW5jZSA8IGZhZGVGYXIpIHtcclxuICAgICAgICBkaXN0YW5jZSA9IChkaXN0YW5jZSAtIGZhZGVOZWFyKSAvIChmYWRlRmFyIC0gZmFkZU5lYXIpO1xyXG4gICAgICAgIGNvbG9yLmEgPSBDYWxjLmxlcnAoMCwgY29sb3IuYSwgZGlzdGFuY2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycyA9IEdpem1vcy5xdWFkLnVzZVJlbmRlckJ1ZmZlcnMoc2hhZGVyLCBtdHhXb3JsZCwgTWF0cml4NHg0LlBST0RVQ1QoR2l6bW9zLiNjYW1lcmEubXR4V29ybGRUb1ZpZXcsIG10eFdvcmxkKSwgR2l6bW9zLnBpY2tJZCk7XHJcbiAgICAgIF90ZXh0dXJlLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5VTklUKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uQ09MT1IuVU5JRk9STV0sIFRFWFRVUkVfTE9DQVRJT04uQ09MT1IuSU5ERVgpO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdHaXptb3Moc2hhZGVyLCBHaXptb3MuZHJhd0VsZW1lbnRzVHJpYW5sZ2VzLCByZW5kZXJCdWZmZXJzLm5JbmRpY2VzLCBjb2xvciwgX2FscGhhT2NjbHVkZWQpO1xyXG5cclxuICAgICAgUmVjeWNsZXIuc3RvcmVNdWx0aXBsZShtdHhXb3JsZCwgY29sb3IsIGJhY2ssIHVwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBidWZmZXJQb3NpdGlvbnMoX3NoYWRlcjogU2hhZGVySW50ZXJmYWNlLCBfYnVmZmVyOiBXZWJHTEJ1ZmZlcik6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCBfYnVmZmVyKTtcclxuICAgICAgbGV0IGF0dHJpYnV0ZTogbnVtYmVyID0gX3NoYWRlci5hdHRyaWJ1dGVzW1wiYV92Y3RQb3NpdGlvblwiXTtcclxuICAgICAgY3JjMy5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShhdHRyaWJ1dGUpO1xyXG4gICAgICBjcmMzLnZlcnRleEF0dHJpYlBvaW50ZXIoYXR0cmlidXRlLCAzLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZMT0FULCBmYWxzZSwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVmZmVyQ29sb3IoX3NoYWRlcjogU2hhZGVySW50ZXJmYWNlLCBfY29sb3I6IENvbG9yKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtNGZ2KF9zaGFkZXIudW5pZm9ybXNbXCJ1X3ZjdENvbG9yXCJdLCBfY29sb3IuZ2V0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGJ1ZmZlck1hdHJpeChfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9tdHhXb3JsZDogTWF0cml4NHg0KTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IG10eE1lc2hUb1ZpZXc6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKEdpem1vcy4jY2FtZXJhLm10eFdvcmxkVG9WaWV3LCBfbXR4V29ybGQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkudW5pZm9ybU1hdHJpeDRmdihfc2hhZGVyLnVuaWZvcm1zW1widV9tdHhNZXNoVG9WaWV3XCJdLCBmYWxzZSwgbXR4TWVzaFRvVmlldy5nZXQoKSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eE1lc2hUb1ZpZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGRyYXdHaXptb3MoX3NoYWRlcjogU2hhZGVySW50ZXJmYWNlLCBfZHJhdzogRnVuY3Rpb24sIF9jb3VudDogbnVtYmVyLCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IF9jb2xvci5jbG9uZTtcclxuICAgICAgR2l6bW9zLmJ1ZmZlckNvbG9yKF9zaGFkZXIsIGNvbG9yKTtcclxuXHJcbiAgICAgIC8vIHN0ZW5jaWwgc3R1ZmYgaXMgZm9yIHNlbWktdHJhbnNwYXJlbnQgZ2l6bW9zIHRvIGhhdmUgY29ycmVjdCBzZWxmIG9jY2x1c2lvblxyXG4gICAgICAvLyBmaXJzdCBkcmF3IHRoZSBnaXptbyBvcGFxdWUgd2l0aCBkZXB0aCB0ZXN0IGFuZCBzZXQgZHJhd24gcGl4ZWxzIHRvIDEgaW4gc3RlbmNpbCBidWZmZXJcclxuICAgICAgY3JjMy5jbGVhcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlNURU5DSUxfQlVGRkVSX0JJVCk7XHJcbiAgICAgIGNyYzMuc3RlbmNpbEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BTFdBWVMsIDEsIDB4RkYpO1xyXG4gICAgICBjcmMzLnN0ZW5jaWxPcChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LktFRVAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuS0VFUCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SRVBMQUNFKTtcclxuICAgICAgY3JjMy5lbmFibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TVEVOQ0lMX1RFU1QpO1xyXG4gICAgICBfZHJhdyhfY291bnQpO1xyXG5cclxuICAgICAgLy8gdGhlbiBkcmF3IHRoZSBnaXptbyBhZ2FpbiB3aXRoIHJlZHVjZWQgYWxwaGEgYW5kIHdpdGhvdXQgZGVwdGggdGVzdCB3aGVyZSBzdGVuY2lsIGJ1ZmZlciBpcyAwXHJcbiAgICAgIGNvbG9yLmEgKj0gX2FscGhhT2NjbHVkZWQ7XHJcbiAgICAgIEdpem1vcy5idWZmZXJDb2xvcihfc2hhZGVyLCBjb2xvcik7XHJcblxyXG4gICAgICBjcmMzLnN0ZW5jaWxGdW5jKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRVFVQUwsIDAsIDB4RkYpO1xyXG4gICAgICBjcmMzLnN0ZW5jaWxPcChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LktFRVAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuS0VFUCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5LRUVQKTtcclxuICAgICAgUmVuZGVyLnNldERlcHRoVGVzdChmYWxzZSk7XHJcbiAgICAgIF9kcmF3KF9jb3VudCk7XHJcbiAgICAgIFJlbmRlci5zZXREZXB0aFRlc3QodHJ1ZSk7XHJcbiAgICAgIGNyYzMuZGlzYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlNURU5DSUxfVEVTVCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZShjb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZHJhd0VsZW1lbnRzVHJpYW5sZ2VzKF9jb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS5kcmF3RWxlbWVudHMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5UUklBTkdMRVMsIF9jb3VudCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTlNJR05FRF9TSE9SVCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZHJhd0VsZW1lbnRzTGluZXMoX2NvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLmRyYXdFbGVtZW50cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVTLCBfY291bnQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfU0hPUlQsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGRyYXdBcnJheXMoX2NvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLmRyYXdBcnJheXMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FUywgMCwgX2NvdW50KTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgdHlwZSBNYXBMaWdodFR5cGVUb0xpZ2h0TGlzdCA9IE1hcDxUeXBlT2ZMaWdodCwgUmVjeWNhYmxlQXJyYXk8Q29tcG9uZW50TGlnaHQ+PjtcclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQcmVwYXJlT3B0aW9ucyB7XHJcbiAgICBpZ25vcmVQaHlzaWNzPzogYm9vbGVhbjtcclxuICAgIGdpem1vc0VuYWJsZWQ/OiBib29sZWFuO1xyXG4gICAgZ2l6bW9zRmlsdGVyPzogTWFwPHN0cmluZywgYm9vbGVhbj47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbWFpbiBpbnRlcmZhY2UgdG8gdGhlIHJlbmRlciBlbmdpbmUsIGhlcmUgV2ViR0wgKHNlZSBzdXBlcmNsYXNzIHtAbGluayBSZW5kZXJXZWJHTH0gYW5kIHRoZSBSZW5kZXJJbmplY3RvcnNcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVuZGVyIGV4dGVuZHMgUmVuZGVyV2ViR0wge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWN0Q2xpcDogUmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgtMSwgMSwgMiwgLTIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBwaWNrQnVmZmVyOiBJbnQzMkFycmF5OyAgIC8vIFRPRE86IHJlc2VhcmNoIGlmIHBpY2tpbmcgc2hvdWxkIGJlIG9wdGltaXplZCB1c2luZyByYWRpdXMgcGlja2luZyB0byBmaWx0ZXJcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbm9kZXNQaHlzaWNzOiBSZWN5Y2FibGVBcnJheTxOb2RlPiA9IG5ldyBSZWN5Y2FibGVBcnJheSgpO1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb21wb25lbnRzUGljazogUmVjeWNhYmxlQXJyYXk8Q29tcG9uZW50UGljaz4gPSBuZXcgUmVjeWNhYmxlQXJyYXkoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbGlnaHRzOiBNYXBMaWdodFR5cGVUb0xpZ2h0TGlzdCA9IG5ldyBNYXAoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZ2l6bW9zOiBSZWN5Y2FibGVBcnJheTxDb21wb25lbnQ+ID0gbmV3IFJlY3ljYWJsZUFycmF5KCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBub2Rlc1NpbXBsZTogUmVjeWNhYmxlQXJyYXk8Tm9kZT4gPSBuZXcgUmVjeWNhYmxlQXJyYXkoKTtcclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IG5vZGVzQWxwaGE6IFJlY3ljYWJsZUFycmF5PE5vZGU+ID0gbmV3IFJlY3ljYWJsZUFycmF5KCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjb21wb25lbnRzU2tlbGV0b246IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudFNrZWxldG9uPiA9IG5ldyBSZWN5Y2FibGVBcnJheSgpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGltZXN0YW1wVXBkYXRlOiBudW1iZXI7XHJcblxyXG4gICAgLy8jcmVnaW9uIFByZXBhcmVcclxuICAgIC8qKlxyXG4gICAgICogUmVjdXJzaXZlbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYnJhbmNoIHN0YXJ0aW5nIHdpdGggdGhlIG5vZGUgZ2l2ZW4sIHJlY2FsY3VsYXRlcyBhbGwgd29ybGQgdHJhbnNmb3JtcywgXHJcbiAgICAgKiBjb2xsZWN0cyBhbGwgbGlnaHRzIGFuZCBmZWVkcyBhbGwgc2hhZGVycyB1c2VkIGluIHRoZSBncmFwaCB3aXRoIHRoZXNlIGxpZ2h0cy4gU29ydHMgbm9kZXMgZm9yIGRpZmZlcmVudFxyXG4gICAgICogcmVuZGVyIHBhc3Nlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwcmVwYXJlKF9icmFuY2g6IE5vZGUsIF9vcHRpb25zOiBSZW5kZXJQcmVwYXJlT3B0aW9ucyA9IHt9LCBfbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpLCBfc2hhZGVyc1VzZWQ6IChTaGFkZXJJbnRlcmZhY2UpW10gPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIGxldCBmaXJzdExldmVsOiBib29sZWFuID0gKF9zaGFkZXJzVXNlZCA9PSBudWxsKTtcclxuICAgICAgaWYgKGZpcnN0TGV2ZWwpIHtcclxuICAgICAgICBfc2hhZGVyc1VzZWQgPSBbXTtcclxuICAgICAgICBSZW5kZXIudGltZXN0YW1wVXBkYXRlID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgICAgUmVuZGVyLm5vZGVzU2ltcGxlLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLm5vZGVzQWxwaGEucmVzZXQoKTtcclxuICAgICAgICBSZW5kZXIubm9kZXNQaHlzaWNzLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLmNvbXBvbmVudHNQaWNrLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLmNvbXBvbmVudHNTa2VsZXRvbi5yZXNldCgpO1xyXG4gICAgICAgIFJlbmRlci5saWdodHMuZm9yRWFjaChfYXJyYXkgPT4gX2FycmF5LnJlc2V0KCkpO1xyXG4gICAgICAgIGlmIChfb3B0aW9ucz8uZ2l6bW9zRW5hYmxlZClcclxuICAgICAgICAgIFJlbmRlci5naXptb3MucmVzZXQoKTtcclxuICAgICAgICBfYnJhbmNoLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULlJFTkRFUl9QUkVQQVJFX1NUQVJUKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghX2JyYW5jaC5pc0FjdGl2ZSlcclxuICAgICAgICByZXR1cm47IC8vIGRvbid0IGFkZCBicmFuY2ggdG8gcmVuZGVyIGxpc3QgaWYgbm90IGFjdGl2ZVxyXG5cclxuICAgICAgX2JyYW5jaC5uTm9kZXNJbkJyYW5jaCA9IDE7XHJcbiAgICAgIF9icmFuY2gucmFkaXVzID0gMDtcclxuXHJcbiAgICAgIF9icmFuY2guZGlzcGF0Y2hFdmVudFRvVGFyZ2V0T25seShuZXcgRXZlbnQoRVZFTlQuUkVOREVSX1BSRVBBUkUpKTtcclxuICAgICAgX2JyYW5jaC50aW1lc3RhbXBVcGRhdGUgPSBSZW5kZXIudGltZXN0YW1wVXBkYXRlO1xyXG5cclxuICAgICAgaWYgKF9icmFuY2guY21wVHJhbnNmb3JtICYmIF9icmFuY2guY21wVHJhbnNmb3JtLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgbGV0IG10eFdvcmxkQnJhbmNoOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVChfbXR4V29ybGQsIF9icmFuY2guY21wVHJhbnNmb3JtLm10eExvY2FsKTtcclxuICAgICAgICBfYnJhbmNoLm10eFdvcmxkLmNvcHkobXR4V29ybGRCcmFuY2gpO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFdvcmxkQnJhbmNoKTtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgX2JyYW5jaC5tdHhXb3JsZC5jb3B5KF9tdHhXb3JsZCk7IC8vIG92ZXJ3cml0ZSByZWFkb25seSBtdHhXb3JsZCBvZiB0aGUgY3VycmVudCBub2RlXHJcblxyXG4gICAgICBsZXQgY21wUmlnaWRib2R5OiBDb21wb25lbnRSaWdpZGJvZHkgPSBfYnJhbmNoLmdldENvbXBvbmVudChDb21wb25lbnRSaWdpZGJvZHkpO1xyXG4gICAgICBpZiAoY21wUmlnaWRib2R5ICYmIGNtcFJpZ2lkYm9keS5pc0FjdGl2ZSkgeyAvL1RPRE86IHN1cHBvcnQgZGUtL2FjdGl2YXRpb24gdGhyb3VnaG91dFxyXG4gICAgICAgIFJlbmRlci5ub2Rlc1BoeXNpY3MucHVzaChfYnJhbmNoKTsgLy8gYWRkIHRoaXMgbm9kZSB0byBwaHlzaWNzIGxpc3RcclxuICAgICAgICBpZiAoIV9vcHRpb25zPy5pZ25vcmVQaHlzaWNzKVxyXG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1CeVBoeXNpY3MoX2JyYW5jaCwgY21wUmlnaWRib2R5KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGNtcFBpY2s6IENvbXBvbmVudFBpY2sgPSBfYnJhbmNoLmdldENvbXBvbmVudChDb21wb25lbnRQaWNrKTtcclxuICAgICAgaWYgKGNtcFBpY2sgJiYgY21wUGljay5pc0FjdGl2ZSkge1xyXG4gICAgICAgIFJlbmRlci5jb21wb25lbnRzUGljay5wdXNoKGNtcFBpY2spOyAvLyBhZGQgdGhpcyBjb21wb25lbnQgdG8gcGljayBsaXN0XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjbXBMaWdodHM6IENvbXBvbmVudExpZ2h0W10gPSBfYnJhbmNoLmdldENvbXBvbmVudHMoQ29tcG9uZW50TGlnaHQpO1xyXG4gICAgICBSZW5kZXIuYWRkTGlnaHRzKGNtcExpZ2h0cyk7XHJcblxyXG4gICAgICBsZXQgY21wTWVzaDogQ29tcG9uZW50TWVzaCA9IF9icmFuY2guZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICBsZXQgY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsID0gX2JyYW5jaC5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpO1xyXG5cclxuICAgICAgaWYgKGNtcE1lc2ggJiYgY21wTWVzaC5pc0FjdGl2ZSAmJiBjbXBNYXRlcmlhbCAmJiBjbXBNYXRlcmlhbC5pc0FjdGl2ZSkge1xyXG4gICAgICAgIGxldCBtdHhXb3JsZE1lc2g6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKF9icmFuY2gubXR4V29ybGQsIGNtcE1lc2gubXR4UGl2b3QpO1xyXG4gICAgICAgIGNtcE1lc2gubXR4V29ybGQuY29weShtdHhXb3JsZE1lc2gpO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFdvcmxkTWVzaCk7IC8vIFRPRE86IGV4YW1pbmUsIHdoeSByZWN5Y2xpbmcgdGhpcyBjYXVzZXMgbWVzaGVzIHRvIGJlIG1pc3BsYWNlZC4uLlxyXG4gICAgICAgIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IGNtcE1hdGVyaWFsLm1hdGVyaWFsLmdldFNoYWRlcigpO1xyXG4gICAgICAgIGxldCBjbXBQYXJ0aWNsZVN5c3RlbTogQ29tcG9uZW50UGFydGljbGVTeXN0ZW0gPSBfYnJhbmNoLmdldENvbXBvbmVudChDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk7XHJcbiAgICAgICAgaWYgKGNtcFBhcnRpY2xlU3lzdGVtICYmIGNtcFBhcnRpY2xlU3lzdGVtLmlzQWN0aXZlICYmIGNtcFBhcnRpY2xlU3lzdGVtLnBhcnRpY2xlU3lzdGVtICE9IG51bGwpXHJcbiAgICAgICAgICBzaGFkZXIgPSBjbXBQYXJ0aWNsZVN5c3RlbS5wYXJ0aWNsZVN5c3RlbS5nZXRTaGFkZXJGcm9tKHNoYWRlcik7XHJcbiAgICAgICAgaWYgKF9zaGFkZXJzVXNlZC5pbmRleE9mKHNoYWRlcikgPCAwKVxyXG4gICAgICAgICAgX3NoYWRlcnNVc2VkLnB1c2goc2hhZGVyKTtcclxuICAgICAgICBfYnJhbmNoLnJhZGl1cyA9IGNtcE1lc2gucmFkaXVzO1xyXG4gICAgICAgIGlmIChjbXBNYXRlcmlhbC5zb3J0Rm9yQWxwaGEgfHwgX2JyYW5jaC5nZXRDb21wb25lbnQoQ29tcG9uZW50VGV4dCkpIC8vIGFsd2F5cyBzb3J0IHRleHQgZm9yIGFscGhhXHJcbiAgICAgICAgICBSZW5kZXIubm9kZXNBbHBoYS5wdXNoKF9icmFuY2gpOyAvLyBhZGQgdGhpcyBub2RlIHRvIHJlbmRlciBsaXN0XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgUmVuZGVyLm5vZGVzU2ltcGxlLnB1c2goX2JyYW5jaCk7IC8vIGFkZCB0aGlzIG5vZGUgdG8gcmVuZGVyIGxpc3RcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGNtcFNrZWxldG9uczogQ29tcG9uZW50U2tlbGV0b25bXSA9IF9icmFuY2guZ2V0Q29tcG9uZW50cyhDb21wb25lbnRTa2VsZXRvbik7XHJcbiAgICAgIGZvciAobGV0IGNtcFNrZWxldG9uIG9mIGNtcFNrZWxldG9ucylcclxuICAgICAgICBpZiAoY21wU2tlbGV0b24gJiYgY21wU2tlbGV0b24uaXNBY3RpdmUpXHJcbiAgICAgICAgICBSZW5kZXIuY29tcG9uZW50c1NrZWxldG9uLnB1c2goY21wU2tlbGV0b24pO1xyXG5cclxuICAgICAgaWYgKF9vcHRpb25zPy5naXptb3NFbmFibGVkICYmIF9vcHRpb25zPy5naXptb3NGaWx0ZXIpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBfYnJhbmNoLmdldEFsbENvbXBvbmVudHMoKSlcclxuICAgICAgICAgIGlmIChjb21wb25lbnQuaXNBY3RpdmUgJiYgX29wdGlvbnMuZ2l6bW9zRmlsdGVyLmdldChjb21wb25lbnQudHlwZSkpXHJcbiAgICAgICAgICAgIFJlbmRlci5naXptb3MucHVzaChjb21wb25lbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBfYnJhbmNoLmdldENoaWxkcmVuKCkpIHtcclxuICAgICAgICBSZW5kZXIucHJlcGFyZShjaGlsZCwgX29wdGlvbnMsIF9icmFuY2gubXR4V29ybGQsIF9zaGFkZXJzVXNlZCk7XHJcblxyXG4gICAgICAgIF9icmFuY2gubk5vZGVzSW5CcmFuY2ggKz0gY2hpbGQubk5vZGVzSW5CcmFuY2g7XHJcbiAgICAgICAgbGV0IGNtcE1lc2hDaGlsZDogQ29tcG9uZW50TWVzaCA9IGNoaWxkLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKTtcclxuICAgICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBjbXBNZXNoQ2hpbGQgPyBjbXBNZXNoQ2hpbGQubXR4V29ybGQudHJhbnNsYXRpb24gOiBjaGlsZC5tdHhXb3JsZC50cmFuc2xhdGlvbjtcclxuICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLmNsb25lO1xyXG4gICAgICAgIF9icmFuY2gucmFkaXVzID0gTWF0aC5tYXgoX2JyYW5jaC5yYWRpdXMsIHBvc2l0aW9uLmdldERpc3RhbmNlKF9icmFuY2gubXR4V29ybGQudHJhbnNsYXRpb24pICsgY2hpbGQucmFkaXVzKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShwb3NpdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmaXJzdExldmVsKSB7XHJcbiAgICAgICAgX2JyYW5jaC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRV9FTkQpKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNtcFNrZWxldG9uIG9mIFJlbmRlci5jb21wb25lbnRzU2tlbGV0b24pIHtcclxuICAgICAgICAgIGNtcFNrZWxldG9uLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgY21wU2tlbGV0b24udXBkYXRlUmVuZGVyQnVmZmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFJlbmRlci5idWZmZXJMaWdodHMoUmVuZGVyLmxpZ2h0cyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZExpZ2h0cyhfY21wTGlnaHRzOiBDb21wb25lbnRMaWdodFtdKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGNtcExpZ2h0IG9mIF9jbXBMaWdodHMpIHtcclxuICAgICAgICBpZiAoIWNtcExpZ2h0LmlzQWN0aXZlKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGxldCB0eXBlOiBUeXBlT2ZMaWdodCA9IGNtcExpZ2h0LmxpZ2h0LmdldFR5cGUoKTtcclxuICAgICAgICBsZXQgbGlnaHRzT2ZUeXBlOiBSZWN5Y2FibGVBcnJheTxDb21wb25lbnRMaWdodD4gPSBSZW5kZXIubGlnaHRzLmdldCh0eXBlKTtcclxuICAgICAgICBpZiAoIWxpZ2h0c09mVHlwZSkge1xyXG4gICAgICAgICAgbGlnaHRzT2ZUeXBlID0gbmV3IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PigpO1xyXG4gICAgICAgICAgUmVuZGVyLmxpZ2h0cy5zZXQodHlwZSwgbGlnaHRzT2ZUeXBlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGlnaHRzT2ZUeXBlLnB1c2goY21wTGlnaHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUGlja2luZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHdpdGggYSB7QGxpbmsgUGlja2VyfS1jYW1lcmEsIHRoaXMgbWV0aG9kIHJlbmRlcnMgb25lIHBpeGVsIHdpdGggcGlja2luZyBpbmZvcm1hdGlvbiBcclxuICAgICAqIGZvciBlYWNoIG5vZGUgaW4gdGhlIGxpbmUgb2Ygc2lnaHQgYW5kIHJldHVybiB0aGF0IGFzIGFuIHVuc29ydGVkIHtAbGluayBQaWNrfS1hcnJheVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tCcmFuY2goX25vZGVzOiBOb2RlW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSwgX3BpY2tHaXptb3M6IGJvb2xlYW4gPSBmYWxzZSwgX2dpem1vc0ZpbHRlcj86IE1hcDxzdHJpbmcsIGJvb2xlYW4+KTogUGlja1tdIHsgLy8gVE9ETzogc2VlIGlmIHRoaXJkIHBhcmFtZXRlciBfd29ybGQ/OiBNYXRyaXg0eDQgd291bGQgYmUgdXNlZnVsbFxyXG4gICAgICAvKipcclxuICAgICAgICogVE9ETzogbWF5YmUgbW92ZSB0aGlzIHdob2xlIGZ1bmN0aW9uIHRvIFJlbmRlcldlYkdMPyBcclxuICAgICAgICogSXQgc2VlbXMgdG8gbW9zdGx5IHJlbHkgb24gUmVuZGVyV2ViR0wgZS5nLjogxpJwaWNrZWQsIGNyZWF0ZVBpY2tUZXh0dXJlKCksIHNldEJsZW5kTW9kZSgpLCBwaWNrKCksIHBpY2tHaXptb3MoKSwgZ2V0UGlja3MoKSwgcmVzZXRGcmFtZWJ1ZmZlcigpXHJcbiAgICAgICAqIFRoZXkgb25seSBub3QgV2ViR0wgdGhpbmcgaXQgZG9lcyBpcyBmaWx0ZXJpbmcgdGhlIG5vZGVzIHRvIHBpY2ssIHdoaWNoIGNvdWxkIGJlIGRvbmUgaW4gcGljaygpIGl0c2VsZi4uLlxyXG4gICAgICAgKiAtPiBvciBtYWtlIHRoaXMgbWV0aG9kIG9ubHkgY29sbGVjdCB0aGUgbm9kZXMgYW5kIGdpem1vcyBmcm9tIGJyYW5jaCBhbmQgdGhlbiBwYXNzIHRoZW0gdG8gYW4gYXBwcm9wcmlhdGUgbWV0aG9kIGluIFJlbmRlcldlYkdMP1xyXG4gICAgICAgKiBcclxuICAgICAgICogQWxzbyB7QGxpbmsgUmVuZGVyLsaScGlja2VkfSBhbmQge0BsaW5rIFJlbmRlci5zaXplUGlja30gc2VlbSB0byBvbmx5IGV2ZXIgYmUgdXNlZCBpbiB0aGUgbWV0aG9kcyBjYWxsZWQgZnJvbSB0aGlzIG1ldGhvZC4gXHJcbiAgICAgICAqIHNpemVQaWNrIGdldHMgc2V0IGluIGNyZWF0ZVBpY2tUZXh0dXJlKCkgYW5kIHVzZWQgaW4gcGljaygpIHZpYSB0aGUgcHJvcGVydHkgYnV0IHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBnZXRQaWNrcygpLlxyXG4gICAgICAgKiDGknBpY2tlZCBpcyBvbmx5IHVzZWQgaW4gZ2V0UGlja3MoKSwgcGljaygpIGFuZCBwaWNrR2l6bW9zKCkgYW5kIG9ubHkgZXZlciBzZXQgdG8gYW4gZW1wdHkgYXJyYXkgaW4gdGhpcyBtZXRob2QuXHJcbiAgICAgICAqIC0+IGJvdGggY291bGQgYmUgbG9jYWwgdmFyaWFibGVzIGFuZCBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIHRoZSBtZXRob2RzIHRoYXQgbmVlZCB0aGVtLlxyXG4gICAgICAgKi8gXHJcbiAgICAgIFJlbmRlci7GknBpY2tlZCA9IFtdO1xyXG4gICAgICBsZXQgc2l6ZTogbnVtYmVyID0gTWF0aC5jZWlsKE1hdGguc3FydChfbm9kZXMubGVuZ3RoICsgUmVuZGVyLmdpem1vcy5sZW5ndGgpKTsgLy8gZ2l6bW9zLmxlbmd0aCBtaWdodCBiZSBiaWdnZXIgdGhhbiBuZWVkZWQuLi5cclxuICAgICAgUmVuZGVyLmNyZWF0ZVBpY2tUZXh0dXJlKHNpemUpO1xyXG4gICAgICBSZW5kZXIuc2V0QmxlbmRNb2RlKEJMRU5ELk9QQVFVRSk7XHJcblxyXG4gICAgICBsZXQgZ2l6bW9zOiBDb21wb25lbnRbXSA9IFtdO1xyXG5cclxuICAgICAgZm9yIChsZXQgbm9kZSBvZiBfbm9kZXMpIHtcclxuICAgICAgICBsZXQgY21wTWVzaDogQ29tcG9uZW50TWVzaCA9IG5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICAgIGxldCBjbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwgPSBub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCk7XHJcbiAgICAgICAgaWYgKGNtcE1lc2ggJiYgY21wTWVzaC5pc0FjdGl2ZSAmJiBjbXBNYXRlcmlhbCAmJiBjbXBNYXRlcmlhbC5pc0FjdGl2ZSlcclxuICAgICAgICAgIFJlbmRlci5waWNrKG5vZGUsIF9jbXBDYW1lcmEpO1xyXG5cclxuICAgICAgICBpZiAoX3BpY2tHaXptb3MgJiYgX2dpem1vc0ZpbHRlcikge1xyXG4gICAgICAgICAgZm9yIChsZXQgZ2l6bW8gb2Ygbm9kZS5nZXRBbGxDb21wb25lbnRzKCkpIHtcclxuICAgICAgICAgICAgaWYgKCFnaXptby5pc0FjdGl2ZSB8fCAhX2dpem1vc0ZpbHRlci5nZXQoZ2l6bW8udHlwZSkgfHwgIWdpem1vLmRyYXdHaXptb3MpXHJcbiAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgIFxyXG4gICAgICAgICAgICBnaXptb3MucHVzaChnaXptbyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoX3BpY2tHaXptb3MpXHJcbiAgICAgICAgUmVuZGVyLnBpY2tHaXptb3MoZ2l6bW9zLCBfY21wQ2FtZXJhKTtcclxuXHJcbiAgICAgIFJlbmRlci5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG5cclxuICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBSZW5kZXIuZ2V0UGlja3Moc2l6ZSwgX2NtcENhbWVyYSk7XHJcbiAgICAgIFJlbmRlci5yZXNldEZyYW1lYnVmZmVyKCk7XHJcbiAgICAgIHJldHVybiBwaWNrcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBEcmF3aW5nXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoZSBzY2VuZSBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBnaXZlbiBjYW1lcmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3KF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBub2RlIG9mIFJlbmRlci5ub2Rlc0FscGhhKVxyXG4gICAgICAgIFJlZmxlY3Quc2V0KG5vZGUsIFwiekNhbWVyYVwiLCBfY21wQ2FtZXJhLnBvaW50V29ybGRUb0NsaXAobm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCkubXR4V29ybGQudHJhbnNsYXRpb24pLnopO1xyXG5cclxuICAgICAgY29uc3Qgc29ydGVkOiBOb2RlW10gPSBSZW5kZXIubm9kZXNBbHBoYS5nZXRTb3J0ZWQoKF9hOiBOb2RlLCBfYjogTm9kZSkgPT4gUmVmbGVjdC5nZXQoX2IsIFwiekNhbWVyYVwiKSAtIFJlZmxlY3QuZ2V0KF9hLCBcInpDYW1lcmFcIikpO1xyXG5cclxuICAgICAgUmVuZGVyLmRyYXdOb2RlcyhSZW5kZXIubm9kZXNTaW1wbGUsIHNvcnRlZCwgX2NtcENhbWVyYSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUGh5c2ljc1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdHJhbnNmb3JtQnlQaHlzaWNzKF9ub2RlOiBOb2RlLCBfY21wUmlnaWRib2R5OiBDb21wb25lbnRSaWdpZGJvZHkpOiB2b2lkIHtcclxuICAgICAgaWYgKCFfY21wUmlnaWRib2R5LmlzSW5pdGlhbGl6ZWQpIC8vIHx8IFByb2plY3QubW9kZSA9PSBNT0RFLkVESVRPUilcclxuICAgICAgICBfY21wUmlnaWRib2R5LmluaXRpYWxpemUoKTtcclxuXHJcbiAgICAgIGlmICghUGh5c2ljcy5nZXRCb2R5TGlzdCgpLmxlbmd0aClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBpZiAoIV9ub2RlLm10eExvY2FsKSB7XHJcbiAgICAgICAgdGhyb3cgKG5ldyBFcnJvcihcIkNvbXBvbmVudFJpZ2lkYm9keSByZXF1aXJlcyBDb21wb25lbnRUcmFuc2Zvcm0gYXQgdGhlIHNhbWUgTm9kZVwiKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIF9jbXBSaWdpZGJvZHkuY2hlY2tDb2xsaXNpb25FdmVudHMoKTtcclxuXHJcbiAgICAgIGlmIChfY21wUmlnaWRib2R5LnR5cGVCb2R5ID09IEJPRFlfVFlQRS5LSU5FTUFUSUMgfHwgUHJvamVjdC5tb2RlID09IE1PREUuRURJVE9SKSB7IC8vQ2FzZSBvZiBLaW5lbWF0aWMgUmlnaWRib2R5XHJcbiAgICAgICAgbGV0IG10eFBpdm90V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKF9ub2RlLm10eFdvcmxkLCBfY21wUmlnaWRib2R5Lm10eFBpdm90VW5zY2FsZWQpO1xyXG4gICAgICAgIF9jbXBSaWdpZGJvZHkuc2V0UG9zaXRpb24obXR4UGl2b3RXb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgICAgX2NtcFJpZ2lkYm9keS5zZXRSb3RhdGlvbihtdHhQaXZvdFdvcmxkLnJvdGF0aW9uKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhQaXZvdFdvcmxkKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtdHhXb3JsZDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkNPTVBPU0lUSU9OKFxyXG4gICAgICAgIF9jbXBSaWdpZGJvZHkuZ2V0UG9zaXRpb24oKSwgX2NtcFJpZ2lkYm9keS5nZXRSb3RhdGlvbigpLCBudWxsKTtcclxuICAgICAgbXR4V29ybGQubXVsdGlwbHkoX2NtcFJpZ2lkYm9keS5tdHhQaXZvdEludmVyc2UpO1xyXG4gICAgICBfbm9kZS5tdHhXb3JsZC50cmFuc2xhdGlvbiA9IG10eFdvcmxkLnRyYW5zbGF0aW9uO1xyXG4gICAgICBfbm9kZS5tdHhXb3JsZC5yb3RhdGlvbiA9IG10eFdvcmxkLnJvdGF0aW9uO1xyXG4gICAgICBsZXQgbXR4TG9jYWw6IE1hdHJpeDR4NCA9IF9ub2RlLmdldFBhcmVudCgpID8gTWF0cml4NHg0LlJFTEFUSVZFKF9ub2RlLm10eFdvcmxkLCBfbm9kZS5nZXRQYXJlbnQoKS5tdHhXb3JsZCkgOiBfbm9kZS5tdHhXb3JsZDtcclxuICAgICAgX25vZGUubXR4TG9jYWwuY29weShtdHhMb2NhbCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFdvcmxkKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4TG9jYWwpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFJlbmRlckJ1ZmZlcnMge1xyXG4gICAgdmVydGljZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIGluZGljZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIHRleHR1cmVVVnM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIG5vcm1hbHM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIGNvbG9ycz86IFdlYkdMQnVmZmVyO1xyXG4gICAgYm9uZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIHRhbmdlbnRzPzogV2ViR0xCdWZmZXI7XHJcbiAgICB3ZWlnaHRzPzogV2ViR0xCdWZmZXI7XHJcbiAgICBuSW5kaWNlcz86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydGVkIGludG8gYSB7QGxpbmsgTWVzaH0sIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FsY3VsYXRlcyBhbmQgcmVwcmVzZW50cyB0aGUgbWVzaCBkYXRhIGluIHRoZSBmb3JtIG5lZWRlZCBieSB0aGUgcmVuZGVyIGVuZ2luZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJNZXNoIHtcclxuICAgIHB1YmxpYyBidWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gbnVsbDtcclxuICAgIHB1YmxpYyBtZXNoOiBNZXNoO1xyXG5cclxuICAgIC8qKiB2ZXJ0aWNlcyBvZiB0aGUgYWN0dWFsIHBvaW50IGNsb3VkLCBzb21lIHBvaW50cyBtaWdodCBiZSBpbiB0aGUgc2FtZSBsb2NhdGlvbiBpbiBvcmRlciB0byByZWZlciB0byBkaWZmZXJlbnQgdGV4ZWxzICovXHJcbiAgICAjdmVydGljZXM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiBpbmRpY2VzIHRvIGNyZWF0ZSBmYWNlcyBmcm9tIHRoZSB2ZXJ0aWNlcywgcm90YXRpb24gZGV0ZXJtaW5lcyBkaXJlY3Rpb24gb2YgZmFjZS1ub3JtYWwgKi9cclxuICAgICNpbmRpY2VzOiBVaW50MTZBcnJheTtcclxuICAgIC8qKiB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVydGljZXMgYnkgdGhlIHBvc2l0aW9uIGluIHRoZSBhcnJheSAqL1xyXG4gICAgI3RleHR1cmVVVnM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiB2ZXJ0ZXggbm9ybWFscyBmb3Igc21vb3RoIHNoYWRpbmcsIGludGVycG9sYXRlZCBiZXR3ZWVuIHZlcnRpY2VzIGR1cmluZyByZW5kZXJpbmcgKi9cclxuICAgICNub3JtYWxzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAvKiBjb2xvcnMgKi9cclxuICAgICNjb2xvcnM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiB2ZXJ0ZXggdGFuZ2VudHMgZm9yIG5vcm1hbCBtYXBwaW5nLCBiYXNlZCBvbiB0aGUgdmVydGV4IG5vcm1hbHMgYW5kIHRoZSBVViBjb29yZGluYXRlcyAqL1xyXG4gICAgI3RhbmdlbnRzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAvKiogYm9uZXMgKi9cclxuICAgICNib25lczogVWludDhBcnJheTtcclxuICAgICN3ZWlnaHRzOiBGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9tZXNoOiBNZXNoKSB7XHJcbiAgICAgIHRoaXMubWVzaCA9IF9tZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdmVydGljZXMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3ZlcnRpY2VzIHx8ICggLy8gcmV0dXJuIGNhY2hlIG9yIC4uLlxyXG4gICAgICAgIC8vIC4uLiBmbGF0dGVuIGFsbCB2ZXJ0ZXggcG9zaXRpb25zIGZyb20gY2xvdWQgaW50byBhIHR5cGVkIGFycmF5XHJcbiAgICAgICAgdGhpcy4jdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4OiBWZXJ0ZXgsIF9pbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gWy4uLnRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihfaW5kZXgpLmdldCgpXTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB2ZXJ0aWNlcyhfdmVydGljZXM6IEZsb2F0MzJBcnJheSkge1xyXG4gICAgICB0aGlzLiN2ZXJ0aWNlcyA9IF92ZXJ0aWNlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGluZGljZXMoKTogVWludDE2QXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaW5kaWNlcyB8fCAoIC8vIHJldHVybiBjYWNoZSBvciAuLi5cclxuICAgICAgICAvLyAuLi4gZmxhdHRlbiBhbGwgaW5kaWNlcyBmcm9tIHRoZSBmYWNlcyBpbnRvIGEgdHlwZWQgYXJyYXlcclxuICAgICAgICB0aGlzLiNpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KHRoaXMubWVzaC5mYWNlcy5mbGF0TWFwKChfZmFjZTogRmFjZSkgPT4gWy4uLl9mYWNlLmluZGljZXNdKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBpbmRpY2VzKF9pbmRpY2VzOiBVaW50MTZBcnJheSkge1xyXG4gICAgICB0aGlzLiNpbmRpY2VzID0gX2luZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBub3JtYWxzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIGlmICh0aGlzLiNub3JtYWxzID09IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGEgY2hlY2sgc2ltaWxpYXIgdG8gdGhlIG9uZSBmb3IgdGFuZ2VudHMgYmVsb3csIHRvIHNlZSBpZiBub3JtYWxzIGFyZSBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHZlcnRpY2VzXHJcblxyXG4gICAgICAgIC8vIHN1bSB1cCBhbGwgdW5zY2FsZWQgbm9ybWFscyBvZiBmYWNlcyBjb25uZWN0ZWQgdG8gb25lIHZlcnRleCwgd2VpZ2h0ZWQgYnkgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIHR3byBuZWlnaGJvdXIgdmVydGljZXMuLi5cclxuICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZm9yRWFjaChfdmVydGV4ID0+IF92ZXJ0ZXgubm9ybWFsLnNldCgwLCAwLCAwKSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGZhY2Ugb2YgdGhpcy5tZXNoLmZhY2VzKVxyXG4gICAgICAgICAgZmFjZS5pbmRpY2VzLmZvckVhY2goKF9pVmVydGV4LCBfaUZhY2VWZXJ0ZXgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tZXNoLnZlcnRpY2VzLm5vcm1hbChfaVZlcnRleCkuYWRkKFZlY3RvcjMuU0NBTEUoZmFjZS5ub3JtYWxVbnNjYWxlZCwgZmFjZS5hbmdsZXNbX2lGYWNlVmVydGV4XSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gLi4uIGFuZCBub3JtYWxpemUgdGhlbVxyXG4gICAgICAgIHRoaXMubWVzaC52ZXJ0aWNlcy5mb3JFYWNoKF92ZXJ0ZXggPT4ge1xyXG4gICAgICAgICAgLy8gc29tZSB2ZXJ0aWNlcyBtaWdodCBiZSB1bnVzZWQgYW5kIHlpZWxkIGEgemVyby1ub3JtYWwuLi5cclxuICAgICAgICAgIGlmIChfdmVydGV4Lm5vcm1hbC5tYWduaXR1ZGVTcXVhcmVkID4gMClcclxuICAgICAgICAgICAgX3ZlcnRleC5ub3JtYWwubm9ybWFsaXplKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuxpJub3JtYWxzVmVydGV4ID0gbmV3IEZsb2F0MzJBcnJheShub3JtYWxzVmVydGV4LmZsYXRNYXAoKF9ub3JtYWw6IFZlY3RvcjMpID0+IFsuLi5fbm9ybWFsLmdldCgpXSkpO1xyXG5cclxuICAgICAgICB0aGlzLiNub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShcclxuICAgICAgICAgIHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4LCBfaW5kZXgpID0+IFsuLi50aGlzLm1lc2gudmVydGljZXMubm9ybWFsKF9pbmRleCkuZ2V0KCldKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNub3JtYWxzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBub3JtYWxzKF9ub3JtYWxzOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgICAgdGhpcy4jbm9ybWFscyA9IF9ub3JtYWxzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGFuZ2VudHMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgaWYgKHRoaXMuI3RhbmdlbnRzID09IG51bGwpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVzaC52ZXJ0aWNlcy5zb21lKF92ZXJ0ZXggPT4gIV92ZXJ0ZXgudXYpKSB7IC8vIGFzc3VtZSBhbGwgdmVydGljZXMgaGF2ZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9yIG5vbmVcclxuICAgICAgICAgIHRoaXMuI3RhbmdlbnRzID0gbmV3IEZsb2F0MzJBcnJheSgpOyAvLyBubyB0ZXh0dXJlIGNvb3JkaW5hdGVzLCBubyB0YW5nZW50c1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuI3RhbmdlbnRzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVzaC52ZXJ0aWNlcy5zb21lKF92ZXJ0ZXggPT4gIV92ZXJ0ZXgudGFuZ2VudCkpIHsgLy8gYXNzdW1lIGFsbCB2ZXJ0aWNlcyBoYXZlIHRhbmdlbnRzIG9yIG5vbmVcclxuICAgICAgICAgIGNvbnN0IHRhbmdlbnRzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmxlbmd0aCk7XHJcbiAgICAgICAgICBjb25zdCBiaXRhbmdlbnRzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmxlbmd0aCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGFuZ2VudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGFuZ2VudHNbaV0gPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpXSA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRoaXMubWVzaC52ZXJ0aWNlcy5mb3JFYWNoKF92ZXJ0ZXggPT4gX3ZlcnRleC50YW5nZW50LnNldCgwLCAwLCAwKSk7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgZmFjZSBvZiB0aGlzLm1lc2guZmFjZXMpIHtcclxuICAgICAgICAgICAgbGV0IGkwOiBudW1iZXIgPSBmYWNlLmluZGljZXNbMF07XHJcbiAgICAgICAgICAgIGxldCBpMTogbnVtYmVyID0gZmFjZS5pbmRpY2VzWzFdO1xyXG4gICAgICAgICAgICBsZXQgaTI6IG51bWJlciA9IGZhY2UuaW5kaWNlc1syXTtcclxuXHJcbiAgICAgICAgICAgIC8vdmVydGljZXMgc3Vycm91bmRpbmcgb25lIHRyaWFuZ2xlXHJcbiAgICAgICAgICAgIGxldCB2MDogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMCk7XHJcbiAgICAgICAgICAgIGxldCB2MTogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMSk7XHJcbiAgICAgICAgICAgIGxldCB2MjogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMik7XHJcblxyXG4gICAgICAgICAgICAvL3RoZWlyIFVWc1xyXG4gICAgICAgICAgICBsZXQgdXYwOiBWZWN0b3IyID0gdGhpcy5tZXNoLnZlcnRpY2VzLnV2KGkwKTtcclxuICAgICAgICAgICAgbGV0IHV2MTogVmVjdG9yMiA9IHRoaXMubWVzaC52ZXJ0aWNlcy51dihpMSk7XHJcbiAgICAgICAgICAgIGxldCB1djI6IFZlY3RvcjIgPSB0aGlzLm1lc2gudmVydGljZXMudXYoaTIpO1xyXG5cclxuICAgICAgICAgICAgLy9XZSBjb21wdXRlIHRoZSBlZGdlcyBvZiB0aGUgdHJpYW5nbGUuLi5cclxuICAgICAgICAgICAgbGV0IGRlbHRhUG9zMDogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh2MSwgdjApO1xyXG4gICAgICAgICAgICBsZXQgZGVsdGFQb3MxOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHYyLCB2MCk7XHJcblxyXG4gICAgICAgICAgICAvLy4uLmFuZCB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlcyBpbiBVViBzcGFjZS4uLlxyXG4gICAgICAgICAgICBsZXQgZGVsdGFVVjA6IFZlY3RvcjIgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodXYxLCB1djApO1xyXG4gICAgICAgICAgICBsZXQgZGVsdGFVVjE6IFZlY3RvcjIgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodXYyLCB1djApO1xyXG5cclxuICAgICAgICAgICAgLy8uLi5hbmQgY29tcHV0ZSB0aGUgdGFuZ2VudFxyXG4gICAgICAgICAgICBsZXQgcjogbnVtYmVyID0gMSAvIFZlY3RvcjIuQ1JPU1MoZGVsdGFVVjAsIGRlbHRhVVYxKTtcclxuICAgICAgICAgICAgbGV0IGZhY2VUYW5nZW50OiBWZWN0b3IzID0gVmVjdG9yMy5TQ0FMRShWZWN0b3IzLkRJRkZFUkVOQ0UoVmVjdG9yMy5TQ0FMRShkZWx0YVBvczAsIGRlbHRhVVYxLnkpLCBWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMSwgZGVsdGFVVjAueSkpLCByKTtcclxuICAgICAgICAgICAgbGV0IGZhY2VCaXRhbmdlbnQ6IFZlY3RvcjMgPSBWZWN0b3IzLlNDQUxFKFZlY3RvcjMuRElGRkVSRU5DRShWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMSwgLWRlbHRhVVYwLngpLCBWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMCwgLWRlbHRhVVYxLngpKSwgcik7IC8vIGZvciB3aW5kaW5nIG9yZGVyIGNvdW50ZXIgY2xvY2t3aXNlXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0YW5nZW50c1tpMF0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZVRhbmdlbnQsIGZhY2UuYW5nbGVzWzBdKSk7XHJcbiAgICAgICAgICAgIHRhbmdlbnRzW2kxXS5hZGQoVmVjdG9yMy5TQ0FMRShmYWNlVGFuZ2VudCwgZmFjZS5hbmdsZXNbMV0pKTtcclxuICAgICAgICAgICAgdGFuZ2VudHNbaTJdLmFkZChWZWN0b3IzLlNDQUxFKGZhY2VUYW5nZW50LCBmYWNlLmFuZ2xlc1syXSkpO1xyXG5cclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMF0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMF0pKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMV0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMV0pKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMl0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMl0pKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZm9yRWFjaCgoX3ZlcnRleCwgX2luZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBub3JtYWw6IFZlY3RvcjMgPSB0aGlzLm1lc2gudmVydGljZXMubm9ybWFsKF9pbmRleCk7XHJcbiAgICAgICAgICAgIGxldCB0YW5nZW50OiBWZWN0b3IzID0gdGFuZ2VudHNbX2luZGV4XTtcclxuICAgICAgICAgICAgbGV0IGJpdGFuZ2VudDogVmVjdG9yMyA9IGJpdGFuZ2VudHNbX2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlb3J0aG9nb25hbGl6ZVxyXG4gICAgICAgICAgICB0YW5nZW50LmFkZChWZWN0b3IzLlNDQUxFKG5vcm1hbCwgLSBWZWN0b3IzLkRPVChub3JtYWwsIHRhbmdlbnQpKSk7XHJcbiAgICAgICAgICAgIGlmICh0YW5nZW50Lm1hZ25pdHVkZVNxdWFyZWQgPiAwKSAvLyBzb21lIHZlcnRpY2VzIG1pZ2h0IGJlIHVudXNlZCBhbmQgeWllbGQgYSB6ZXJvLXRhbmdlbnQuLi5cclxuICAgICAgICAgICAgICB0YW5nZW50Lm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGhhbmRlZG5lc3M6IG51bWJlciA9IChWZWN0b3IzLkRPVChWZWN0b3IzLkNST1NTKG5vcm1hbCwgdGFuZ2VudCksIGJpdGFuZ2VudCkgPCAwKSA/IC0xIDogMTtcclxuXHJcbiAgICAgICAgICAgIF92ZXJ0ZXgudGFuZ2VudCA9IG5ldyBWZWN0b3I0KHRhbmdlbnQueCwgdGFuZ2VudC55LCB0YW5nZW50LnosIGhhbmRlZG5lc3MpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiN0YW5nZW50cyA9IG5ldyBGbG9hdDMyQXJyYXkoXHJcbiAgICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZmxhdE1hcChfdmVydGV4ID0+IF92ZXJ0ZXgudGFuZ2VudC5nZXQoKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jdGFuZ2VudHM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRhbmdlbnRzKF90YW5nZW50czogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgIHRoaXMuI3RhbmdlbnRzID0gX3RhbmdlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4dHVyZVVWcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGV4dHVyZVVWcyB8fCAoIC8vIHJldHVybiBjYWNoZSBvciAuLi5cclxuICAgICAgICAvLyAuLi4gZmxhdHRlbiBhbGwgdXZzIGZyb20gdGhlIGNsb3VzIGludG8gYSB0eXBlZCBhcnJheVxyXG4gICAgICAgIHRoaXMuI3RleHR1cmVVVnMgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubWVzaC52ZXJ0aWNlc1xyXG4gICAgICAgICAgLmZpbHRlcihfdmVydGV4ID0+IF92ZXJ0ZXgudXYpXHJcbiAgICAgICAgICAuZmxhdE1hcCgoX3ZlcnRleDogVmVydGV4KSA9PiBbLi4uX3ZlcnRleC51di5nZXQoKV0pXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRleHR1cmVVVnMoX3RleHR1cmVVVnM6IEZsb2F0MzJBcnJheSkge1xyXG4gICAgICB0aGlzLiN0ZXh0dXJlVVZzID0gX3RleHR1cmVVVnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjb2xvcnMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NvbG9ycyB8fCAoXHJcbiAgICAgICAgdGhpcy4jY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLm1lc2gudmVydGljZXNcclxuICAgICAgICAgIC5maWx0ZXIoX3ZlcnRleCA9PiBfdmVydGV4LmNvbG9yKVxyXG4gICAgICAgICAgLmZsYXRNYXAoX3ZlcnRleCA9PiBbLi4uX3ZlcnRleC5jb2xvci5nZXQoKV0pXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGNvbG9ycyhfY29sb3JzOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgICAgdGhpcy4jY29sb3JzID0gX2NvbG9ycztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJvbmVzKCk6IFVpbnQ4QXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jYm9uZXMgfHwgKCAvLyByZXR1cm4gY2FjaGUgb3IgLi4uXHJcbiAgICAgICAgdGhpcy4jYm9uZXMgPSB0aGlzLm1lc2gudmVydGljZXMuc29tZShfdmVydGV4ID0+IF92ZXJ0ZXguYm9uZXMpID9cclxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4OiBWZXJ0ZXgsIF9pbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvbmVzOiBCb25lW10gPSB0aGlzLm1lc2gudmVydGljZXMuYm9uZXMoX2luZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIFtib25lcz8uWzBdPy5pbmRleCB8fCAwLCBib25lcz8uWzFdPy5pbmRleCB8fCAwLCBib25lcz8uWzJdPy5pbmRleCB8fCAwLCBib25lcz8uWzNdPy5pbmRleCB8fCAwXTtcclxuICAgICAgICAgIH0pKSA6XHJcbiAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYm9uZXMoX2lCb25lczogVWludDhBcnJheSkge1xyXG4gICAgICB0aGlzLiNib25lcyA9IF9pQm9uZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB3ZWlnaHRzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN3ZWlnaHRzIHx8ICggLy8gcmV0dXJuIGNhY2hlIG9yIC4uLlxyXG4gICAgICAgIHRoaXMuI3dlaWdodHMgPSB0aGlzLm1lc2gudmVydGljZXMuc29tZShfdmVydGV4ID0+IF92ZXJ0ZXguYm9uZXMpID9cclxuICAgICAgICAgIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmZsYXRNYXAoKF92ZXJ0ZXg6IFZlcnRleCwgX2luZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYm9uZXM6IEJvbmVbXSA9IHRoaXMubWVzaC52ZXJ0aWNlcy5ib25lcyhfaW5kZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gW2JvbmVzPy5bMF0/LndlaWdodCB8fCAwLCBib25lcz8uWzFdPy53ZWlnaHQgfHwgMCwgYm9uZXM/LlsyXT8ud2VpZ2h0IHx8IDAsIGJvbmVzPy5bM10/LndlaWdodCB8fCAwXTtcclxuICAgICAgICAgIH0pKSA6XHJcbiAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgd2VpZ2h0cyhfd2VpZ2h0czogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgIHRoaXMuI3dlaWdodHMgPSBfd2VpZ2h0cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGlzIHJlbmRlciBtZXNoIGFuZCBhbGwgaXRzIGJ1ZmZlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmJ1ZmZlcnMgPSBudWxsO1xyXG5cclxuICAgICAgdGhpcy4jdmVydGljZXMgPSBudWxsO1xyXG4gICAgICB0aGlzLiNpbmRpY2VzID0gbnVsbDtcclxuICAgICAgdGhpcy4jdGV4dHVyZVVWcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuI25vcm1hbHMgPSBudWxsO1xyXG4gICAgICB0aGlzLiNjb2xvcnMgPSBudWxsO1xyXG4gICAgICB0aGlzLiN0YW5nZW50cyA9IG51bGw7XHJcblxyXG4gICAgICB0aGlzLiNib25lcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuI3dlaWdodHMgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xzIHRoZSByZW5kZXJpbmcgb2YgYSBicmFuY2gsIHVzaW5nIHRoZSBnaXZlbiB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSxcclxuICAgKiBhbmQgdGhlIHByb3BhZ2F0aW9uIG9mIHRoZSByZW5kZXJlZCBpbWFnZSBmcm9tIHRoZSBvZmZzY3JlZW4gcmVuZGVyYnVmZmVyIHRvIHRoZSB0YXJnZXQgY2FudmFzXHJcbiAgICogdGhyb3VnaCBhIHNlcmllcyBvZiB7QGxpbmsgRnJhbWluZ30gb2JqZWN0cy4gVGhlIHN0YWdlcyBpbnZvbHZlZCBhcmUgaW4gb3JkZXIgb2YgcmVuZGVyaW5nXHJcbiAgICoge0BsaW5rIFJlbmRlcn0udmlld3BvcnQgLT4ge0BsaW5rIFZpZXdwb3J0fS5zb3VyY2UgLT4ge0BsaW5rIFZpZXdwb3J0fS5kZXN0aW5hdGlvbiAtPiBET00tQ2FudmFzIC0+IENsaWVudChDU1MpXHJcbiAgICogQGF1dGhvcnMgSmFzY2hhIEthcmFnw7ZsLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOS0yMDIyIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9WaWV3cG9ydFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBWaWV3cG9ydCBleHRlbmRzIEV2ZW50VGFyZ2V0VW5pZmllZCB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBmb2N1czogVmlld3BvcnQ7XHJcblxyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IFwiVmlld3BvcnRcIjsgLy8gVGhlIG5hbWUgdG8gY2FsbCB0aGlzIHZpZXdwb3J0IGJ5LlxyXG4gICAgcHVibGljIGNhbWVyYTogQ29tcG9uZW50Q2FtZXJhID0gbnVsbDsgLy8gVGhlIGNhbWVyYSByZXByZXNlbnRpbmcgdGhlIHZpZXcgcGFyYW1ldGVycyB0byByZW5kZXIgdGhlIGJyYW5jaC5cclxuICAgIHB1YmxpYyByZWN0U291cmNlOiBSZWN0YW5nbGU7XHJcbiAgICBwdWJsaWMgcmVjdERlc3RpbmF0aW9uOiBSZWN0YW5nbGU7XHJcblxyXG4gICAgLy8gVE9ETzogdmVyaWZ5IGlmIGNsaWVudCB0byBjYW52YXMgc2hvdWxkIGJlIGluIFZpZXdwb3J0IG9yIHNvbWV3aGVyZSBlbHNlIChXaW5kb3csIENvbnRhaW5lcj8pXHJcbiAgICAvLyBNdWx0aXBsZSB2aWV3cG9ydHMgdXNpbmcgdGhlIHNhbWUgY2FudmFzIHNob3VsZG4ndCBkaWZmZXIgaGVyZS4uLlxyXG4gICAgLy8gZGlmZmVyZW50IGZyYW1pbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCwgdGhpcyBpcyB0aGUgZGVmYXVsdFxyXG4gICAgcHVibGljIGZyYW1lQ2xpZW50VG9DYW52YXM6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG4gICAgcHVibGljIGZyYW1lQ2FudmFzVG9EZXN0aW5hdGlvbjogRnJhbWluZ0NvbXBsZXggPSBuZXcgRnJhbWluZ0NvbXBsZXgoKTtcclxuICAgIHB1YmxpYyBmcmFtZURlc3RpbmF0aW9uVG9Tb3VyY2U6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG4gICAgcHVibGljIGZyYW1lU291cmNlVG9SZW5kZXI6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG5cclxuICAgIHB1YmxpYyBhZGp1c3RpbmdGcmFtZXM6IGJvb2xlYW4gPSB0cnVlOyAvLyBUT0RPOiBtYXliZSBvbmx5IGFkanVzdCBmcmFtZXMgd2hlbiBhbnl0aGluZyBjaGFuZ2VzIGluc3RlYWQgb2YgZXZlcnkgZHJhd24gZnJhbWU/XHJcbiAgICBwdWJsaWMgYWRqdXN0aW5nQ2FtZXJhOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBwaHlzaWNzRGVidWdNb2RlOiBQSFlTSUNTX0RFQlVHTU9ERSA9IFBIWVNJQ1NfREVCVUdNT0RFLk5PTkU7XHJcblxyXG4gICAgcHVibGljIGdpem1vc0VuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBnaXptb3NTZWxlY3RlZDogTm9kZVtdO1xyXG4gICAgcHVibGljIGdpem1vc0ZpbHRlcjogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKENvbXBvbmVudC5zdWJjbGFzc2VzIC8vIFRPRE86IG1heWJlIG1ha2UgdGhpcyBsYXp5XHJcbiAgICAgIC5maWx0ZXIoKF9jbGFzczogdHlwZW9mIENvbXBvbmVudCkgPT4gKF9jbGFzcy5wcm90b3R5cGUpLmRyYXdHaXptb3MgfHwgKF9jbGFzcy5wcm90b3R5cGUpLmRyYXdHaXptb3NTZWxlY3RlZClcclxuICAgICAgLm1hcCgoX2NsYXNzOiB0eXBlb2YgQ29tcG9uZW50KSA9PiBbX2NsYXNzLm5hbWUsIHRydWVdKVxyXG4gICAgKTtcclxuXHJcbiAgICBwdWJsaWMgY29tcG9uZW50c1BpY2s6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudFBpY2s+ID0gbmV3IFJlY3ljYWJsZUFycmF5KCk7XHJcblxyXG4gICAgI2JyYW5jaDogTm9kZSA9IG51bGw7IC8vIFRoZSB0byByZW5kZXIgd2l0aCBhbGwgaXRzIGRlc2NlbmRhbnRzLlxyXG4gICAgI2NyYzI6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IG51bGw7XHJcbiAgICAjY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IG51bGw7XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyAjcmVnaW9uIEV2ZW50cyAocGFzc2luZyBmcm9tIGNhbnZhcyB0byB2aWV3cG9ydCBhbmQgZnJvbSB0aGVyZSBpbnRvIGJyYW5jaClcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmlld3BvcnQgY3VycmVudGx5IGhhcyBmb2N1cyBhbmQgdGh1cyByZWNlaXZlcyBrZXlib2FyZCBldmVudHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBoYXNGb2N1cygpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIChWaWV3cG9ydC5mb2N1cyA9PSB0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBkZXN0aW5hdGlvbiBjYW52YXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY2FudmFzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgMkQtY29udGV4dCBhdHRhY2hlZCB0byB0aGUgZGVzdGluYXRpb24gY2FudmFzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY29udGV4dCgpOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY3JjMjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbm5lY3RzIHRoZSB2aWV3cG9ydCB0byB0aGUgZ2l2ZW4gY2FudmFzIHRvIHJlbmRlciB0aGUgZ2l2ZW4gYnJhbmNoIHRvIHVzaW5nIHRoZSBnaXZlbiBjYW1lcmEtY29tcG9uZW50LCBhbmQgbmFtZXMgdGhlIHZpZXdwb3J0IGFzIGdpdmVuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZShfbmFtZTogc3RyaW5nLCBfYnJhbmNoOiBOb2RlLCBfY2FtZXJhOiBDb21wb25lbnRDYW1lcmEsIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmNhbWVyYSA9IF9jYW1lcmE7XHJcbiAgICAgIHRoaXMuI2NhbnZhcyA9IF9jYW52YXM7XHJcbiAgICAgIHRoaXMuI2NyYzIgPSBfY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgdGhpcy4jY2FudmFzLnRhYkluZGV4ID0gMDsgLy8gY2FuIGdldCBmb2N1cyBhbmQgcmVjZWl2ZSBrZXlib2FyZCBldmVudHNcclxuXHJcbiAgICAgIHRoaXMucmVjdFNvdXJjZSA9IFJlbmRlci5nZXRDYW52YXNSZWN0KCk7XHJcbiAgICAgIHRoaXMucmVjdERlc3RpbmF0aW9uID0gdGhpcy5nZXRDbGllbnRSZWN0YW5nbGUoKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0QnJhbmNoKF9icmFuY2gpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gY2FudmFzIGFzIGEgcmVjdGFuZ2xlLCB4IGFuZCB5IGFyZSBhbHdheXMgMCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENhbnZhc1JlY3RhbmdsZSgpOiBSZWN0YW5nbGUge1xyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVCgwLCAwLCB0aGlzLiNjYW52YXMud2lkdGgsIHRoaXMuI2NhbnZhcy5oZWlnaHQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgY2xpZW50IHJlY3RhbmdsZSB0aGUgY2FudmFzIGlzIGRpc3BsYXllZCBhbmQgZml0IGluLCB4IGFuZCB5IGFyZSBhbHdheXMgMCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENsaWVudFJlY3RhbmdsZSgpOiBSZWN0YW5nbGUge1xyXG4gICAgICAvLyBGVURHRSBkb2Vzbid0IGNhcmUgYWJvdXQgd2hlcmUgdGhlIGNsaWVudCByZWN0IGlzLCBvbmx5IGFib3V0IHRoZSBzaXplIG1hdHRlcnMuXHJcbiAgICAgIC8vIHJldHVybiBSZWN0YW5nbGUuR0VUKHRoaXMuY2FudmFzLm9mZnNldExlZnQsIHRoaXMuY2FudmFzLm9mZnNldFRvcCwgdGhpcy5jYW52YXMuY2xpZW50V2lkdGgsIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCk7XHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKDAsIDAsIHRoaXMuI2NhbnZhcy5jbGllbnRXaWR0aCwgdGhpcy4jY2FudmFzLmNsaWVudEhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGJyYW5jaCB0byBiZSBkcmF3biBpbiB0aGUgdmlld3BvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCcmFuY2goX2JyYW5jaDogTm9kZSk6IHZvaWQge1xyXG4gICAgICBpZiAoX2JyYW5jaCkge1xyXG4gICAgICAgIF9icmFuY2guYnJvYWRjYXN0RXZlbnQobmV3IEV2ZW50KEVWRU5ULkFUVEFDSF9CUkFOQ0gpKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLiNicmFuY2ggPSBfYnJhbmNoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIGJyYW5jaCB0aGlzIHZpZXdwb3J0IHJlbmRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJyYW5jaCgpOiBOb2RlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2JyYW5jaDtcclxuICAgIH1cclxuXHJcbiAgICAvLyAjcmVnaW9uIERyYXdpbmdcclxuICAgIC8qKlxyXG4gICAgICogRHJhdyB0aGlzIHZpZXdwb3J0IGRpc3BsYXlpbmcgaXRzIGJyYW5jaC4gQnkgZGVmYXVsdCwgdGhlIHRyYW5zZm9ybXMgaW4gdGhlIGJyYW5jaCBhcmUgcmVjYWxjdWxhdGVkIGZpcnN0LlxyXG4gICAgICogUGFzcyBgZmFsc2VgIGlmIGNhbGN1bGF0aW9uIHdhcyBhbHJlYWR5IGRvbmUgZm9yIHRoaXMgZnJhbWUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkcmF3KF9wcmVwYXJlQnJhbmNoOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnByZXBhcmUoX3ByZXBhcmVCcmFuY2gpO1xyXG5cclxuICAgICAgaWYgKHRoaXMucGh5c2ljc0RlYnVnTW9kZSAhPSBQSFlTSUNTX0RFQlVHTU9ERS5QSFlTSUNfT0JKRUNUU19PTkxZKSB7XHJcbiAgICAgICAgUmVuZGVyLmRyYXcodGhpcy5jYW1lcmEpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5naXptb3NFbmFibGVkKVxyXG4gICAgICAgICAgR2l6bW9zLmRyYXcodGhpcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnBoeXNpY3NEZWJ1Z01vZGUgIT0gUEhZU0lDU19ERUJVR01PREUuTk9ORSkge1xyXG4gICAgICAgIFBoeXNpY3MuZHJhdyh0aGlzLmNhbWVyYSwgdGhpcy5waHlzaWNzRGVidWdNb2RlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfRU5EKSk7XHJcblxyXG4gICAgICB0aGlzLiNjcmMyLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLiNjcmMyLmRyYXdJbWFnZShcclxuICAgICAgICBSZW5kZXIuZ2V0Q2FudmFzKCksXHJcbiAgICAgICAgdGhpcy5yZWN0U291cmNlLngsIHRoaXMucmVjdFNvdXJjZS55LCB0aGlzLnJlY3RTb3VyY2Uud2lkdGgsIHRoaXMucmVjdFNvdXJjZS5oZWlnaHQsXHJcbiAgICAgICAgdGhpcy5yZWN0RGVzdGluYXRpb24ueCwgdGhpcy5yZWN0RGVzdGluYXRpb24ueSwgdGhpcy5yZWN0RGVzdGluYXRpb24ud2lkdGgsIHRoaXMucmVjdERlc3RpbmF0aW9uLmhlaWdodFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBZGp1c3RzIGFsbCBmcmFtZXMgYW5kIHRoZSBjYW1lcmEgdG8gZml0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhbnZhcy4gUHJlcGFyZXMgdGhlIGJyYW5jaCBmb3IgcmVuZGVyaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBwcmVwYXJlKF9wcmVwYXJlQnJhbmNoOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMuI2JyYW5jaClcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGlmICghdGhpcy5jYW1lcmEuaXNBY3RpdmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHRoaXMuYWRqdXN0aW5nRnJhbWVzKVxyXG4gICAgICAgIHRoaXMuYWRqdXN0RnJhbWVzKCk7XHJcbiAgICAgIGlmICh0aGlzLmFkanVzdGluZ0NhbWVyYSlcclxuICAgICAgICB0aGlzLmFkanVzdENhbWVyYSgpO1xyXG4gICAgICBpZiAoX3ByZXBhcmVCcmFuY2gpXHJcbiAgICAgICAgdGhpcy5wcmVwYXJlQnJhbmNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVwYXJlcyBhbGwgbm9kZXMgaW4gdGhlIGJyYW5jaCBmb3IgcmVuZGVyaW5nIGJ5IHVwZGF0aW5nIHRoZWlyIHdvcmxkIHRyYW5zZm9ybXMgZXRjLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJlcGFyZUJyYW5jaCgpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFJvb3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICBpZiAodGhpcy4jYnJhbmNoLmdldFBhcmVudCgpKVxyXG4gICAgICAgIG10eFJvb3QgPSB0aGlzLiNicmFuY2guZ2V0UGFyZW50KCkubXR4V29ybGQ7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuUkVOREVSX1BSRVBBUkVfU1RBUlQpKTtcclxuICAgICAgUmVuZGVyLnByZXBhcmUodGhpcy4jYnJhbmNoLCB7IGdpem1vc0VuYWJsZWQ6IHRoaXMuZ2l6bW9zRW5hYmxlZCwgZ2l6bW9zRmlsdGVyOiB0aGlzLmdpem1vc0ZpbHRlciB9LCBtdHhSb290KTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRV9FTkQpKTtcclxuICAgICAgdGhpcy5jb21wb25lbnRzUGljayA9IFJlbmRlci5jb21wb25lbnRzUGljaztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGEgcGljayBvbiBhbGwge0BsaW5rIENvbXBvbmVudFBpY2t9cyBpbiB0aGUgYnJhbmNoIG9mIHRoaXMgdmlld3BvcnRcclxuICAgICAqIHVzaW5nIGEgcmF5IGZyb20gaXRzIGNhbWVyYSB0aHJvdWdoIHRoZSBjbGllbnQgY29vcmRpbmF0ZXMgZ2l2ZW4gaW4gdGhlIGV2ZW50LlxyXG4gICAgICogRGlzcGF0Y2hlcyB0aGUgZXZlbnQgdG8gYWxsIG5vZGVzIGhpdC4gIFxyXG4gICAgICogSWYge0BsaW5rIFBJQ0suQ0FNRVJBfSB3YXMgY2hvc2VuIGFzIHRoZSBtZXRob2QgdG8gcGljaywgYSBwaWNrIHByb3BlcnR5IGdldHMgYWRkZWQgdG8gdGhlIGV2ZW50LCBcclxuICAgICAqIHdoaWNoIGhvbGRzIHRoZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiwgYnV0IGlzIG92ZXJ3cml0dGVuIGZvciBlYWNoIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwYXRjaFBvaW50ZXJFdmVudChfZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgICBsZXQgcG9zQ2xpZW50OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoX2V2ZW50LmNsaWVudFgsIF9ldmVudC5jbGllbnRZKTtcclxuICAgICAgbGV0IHJheTogUmF5ID0gdGhpcy5nZXRSYXlGcm9tQ2xpZW50KHBvc0NsaWVudCk7XHJcbiAgICAgIC8vIGxldCBjYW1lcmFQaWNrczogUmVjeWNhYmxlQXJyYXk8Tm9kZT4gPSBSZWN5Y2xlci5nZXQoUmVjeWNhYmxlQXJyYXkpOyAvL1RPRE86IHRoaW5rIGFib3V0IG9wdGltaXphdGlvbiBsYXRlclxyXG4gICAgICBsZXQgY2FtZXJhUGlja3M6IE5vZGVbXSA9IFtdO1xyXG4gICAgICBsZXQgb3RoZXJQaWNrczogQ29tcG9uZW50UGlja1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGNtcFBpY2sgb2YgdGhpcy5jb21wb25lbnRzUGljaylcclxuICAgICAgICBpZiAoY21wUGljay5waWNrID09IFBJQ0suQ0FNRVJBKVxyXG4gICAgICAgICAgY2FtZXJhUGlja3MucHVzaChjbXBQaWNrLm5vZGUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIG90aGVyUGlja3MucHVzaChjbXBQaWNrKTtcclxuXHJcblxyXG4gICAgICBpZiAoY2FtZXJhUGlja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBQaWNrZXIucGlja0NhbWVyYShjYW1lcmFQaWNrcywgdGhpcy5jYW1lcmEsIHRoaXMucG9pbnRDbGllbnRUb1Byb2plY3Rpb24ocG9zQ2xpZW50KSwgdGhpcy5naXptb3NFbmFibGVkLCB0aGlzLmdpem1vc0ZpbHRlcik7XHJcbiAgICAgICAgZm9yIChsZXQgcGljayBvZiBwaWNrcykge1xyXG4gICAgICAgICAgUmVmbGVjdC5zZXQoX2V2ZW50LCBcInBpY2tcIiwgcGljayk7XHJcbiAgICAgICAgICBwaWNrLm5vZGUuZGlzcGF0Y2hFdmVudChfZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgY21wUGljayBvZiBvdGhlclBpY2tzKSB7XHJcbiAgICAgICAgY21wUGljay5waWNrQW5kRGlzcGF0Y2gocmF5LCBfZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3QgYWxsIGZyYW1lcyBpbnZvbHZlZCBpbiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MgZnJvbSB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBjbGllbnQgdXAgdG8gdGhlIHJlbmRlcmVyIGNhbnZhc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRqdXN0RnJhbWVzKCk6IHZvaWQge1xyXG4gICAgICAvLyBnZXQgdGhlIHJlY3RhbmdsZSBvZiB0aGUgY2FudmFzIGFyZWEgYXMgZGlzcGxheWVkIChjb25zaWRlciBjc3MpXHJcbiAgICAgIGxldCByZWN0Q2xpZW50OiBSZWN0YW5nbGUgPSB0aGlzLmdldENsaWVudFJlY3RhbmdsZSgpO1xyXG4gICAgICAvLyBhZGp1c3QgdGhlIGNhbnZhcyBzaXplIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZnJhbWluZyBhcHBsaWVkIHRvIGNsaWVudFxyXG4gICAgICBsZXQgcmVjdENhbnZhczogUmVjdGFuZ2xlID0gdGhpcy5mcmFtZUNsaWVudFRvQ2FudmFzLmdldFJlY3QocmVjdENsaWVudCk7XHJcbiAgICAgIHRoaXMuI2NhbnZhcy53aWR0aCA9IHJlY3RDYW52YXMud2lkdGg7XHJcbiAgICAgIHRoaXMuI2NhbnZhcy5oZWlnaHQgPSByZWN0Q2FudmFzLmhlaWdodDtcclxuXHJcbiAgICAgIGxldCByZWN0VGVtcDogUmVjdGFuZ2xlO1xyXG4gICAgICAvLyBhZGp1c3QgdGhlIGRlc3RpbmF0aW9uIGFyZWEgb24gdGhlIHRhcmdldC1jYW52YXMgdG8gcmVuZGVyIHRvIGJ5IGFwcGx5aW5nIHRoZSBmcmFtaW5nIHRvIGNhbnZhc1xyXG4gICAgICByZWN0VGVtcCA9IHRoaXMuZnJhbWVDYW52YXNUb0Rlc3RpbmF0aW9uLmdldFJlY3QocmVjdENhbnZhcyk7XHJcbiAgICAgIHRoaXMucmVjdERlc3RpbmF0aW9uLmNvcHkocmVjdFRlbXApO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyZWN0VGVtcCk7XHJcbiAgICAgIC8vIGFkanVzdCB0aGUgYXJlYSBvbiB0aGUgc291cmNlLWNhbnZhcyB0byByZW5kZXIgZnJvbSBieSBhcHBseWluZyB0aGUgZnJhbWluZyB0byBkZXN0aW5hdGlvbiBhcmVhXHJcbiAgICAgIHJlY3RUZW1wID0gdGhpcy5mcmFtZURlc3RpbmF0aW9uVG9Tb3VyY2UuZ2V0UmVjdCh0aGlzLnJlY3REZXN0aW5hdGlvbik7XHJcblxyXG4gICAgICB0aGlzLnJlY3RTb3VyY2UuY29weShyZWN0VGVtcCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RUZW1wKTtcclxuXHJcbiAgICAgIC8vIGhhdmluZyBhbiBvZmZzZXQgc291cmNlIGRvZXMgbWFrZSBzZW5zZSBvbmx5IHdoZW4gbXVsdGlwbGUgdmlld3BvcnRzIGRpc3BsYXkgcGFydHMgb2YgdGhlIHNhbWUgcmVuZGVyaW5nLiBGb3Igbm93OiBzaGlmdCBpdCB0byAwLDBcclxuICAgICAgdGhpcy5yZWN0U291cmNlLnggPSB0aGlzLnJlY3RTb3VyY2UueSA9IDA7XHJcbiAgICAgIC8vIHN0aWxsLCBhIHBhcnRpYWwgaW1hZ2Ugb2YgdGhlIHJlbmRlcmluZyBtYXkgYmUgcmV0cmlldmVkIGJ5IG1vdmluZyBhbmQgcmVzaXppbmcgdGhlIHJlbmRlciB2aWV3cG9ydC4gRm9yIG5vdywgaXQncyBhbHdheXMgYWRqdXN0ZWQgdG8gdGhlIGN1cnJlbnQgdmlld3BvcnRcclxuICAgICAgbGV0IHJlY3RSZW5kZXI6IFJlY3RhbmdsZSA9IHRoaXMuZnJhbWVTb3VyY2VUb1JlbmRlci5nZXRSZWN0KHRoaXMucmVjdFNvdXJjZSk7XHJcbiAgICAgIFJlbmRlci5zZXRSZW5kZXJSZWN0YW5nbGUocmVjdFJlbmRlcik7XHJcblxyXG4gICAgICBsZXQgcmVjdE9mZnNjcmVlbkNhbnZhczogUmVjdGFuZ2xlID0gUmVuZGVyLmdldENhbnZhc1JlY3QoKTsgLy8gdGhlcmUgYXJlIGZhciB0byBtYW55IHJlY3RhbmdsZXMgaW52b2x2ZWQgaGVyZS4uLlxyXG5cclxuICAgICAgLy8gbm8gbW9yZSB0cmFuc2Zvcm1hdGlvbiBhZnRlciB0aGlzIGZvciBub3csIG9mZnNjcmVlbiBjYW52YXMgYW5kIHJlbmRlci12aWV3cG9ydCBoYXZlIHRoZSBzYW1lIHNpemVcclxuICAgICAgUmVuZGVyLnNldENhbnZhc1NpemUocmVjdFJlbmRlci53aWR0aCwgcmVjdFJlbmRlci5oZWlnaHQpO1xyXG5cclxuICAgICAgaWYgKHJlY3RSZW5kZXIud2lkdGggIT0gcmVjdE9mZnNjcmVlbkNhbnZhcy53aWR0aCB8fCByZWN0UmVuZGVyLmhlaWdodCAhPSByZWN0T2Zmc2NyZWVuQ2FudmFzLmhlaWdodClcclxuICAgICAgICBSZW5kZXIuYWRqdXN0QXR0YWNobWVudHMoKTtcclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RDbGllbnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyZWN0Q2FudmFzKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUocmVjdFJlbmRlcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RPZmZzY3JlZW5DYW52YXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0IHRoZSBjYW1lcmEgcGFyYW1ldGVycyB0byBmaXQgdGhlIHJlbmRlcmluZyBpbnRvIHRoZSByZW5kZXIgdmlld3BvcnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkanVzdENhbWVyYSgpOiB2b2lkIHtcclxuICAgICAgbGV0IHJlY3Q6IFJlY3RhbmdsZSA9IFJlbmRlci5nZXRSZW5kZXJSZWN0YW5nbGUoKTtcclxuICAgICAgLy8gaWYgKHRoaXMuY2FtZXJhLmdldFByb2plY3Rpb24oKSA9PSBQUk9KRUNUSU9OLk9SVEhPR1JBUEhJQylcclxuICAgICAgLy8gICB0aGlzLmNhbWVyYS5wcm9qZWN0T3J0aG9ncmFwaGljKC1yZWN0LndpZHRoIC8gMjAsIHJlY3Qud2lkdGggLyAyMCwgcmVjdC5oZWlnaHQgLyAyMCwgLXJlY3QuaGVpZ2h0IC8gMjApO1xyXG4gICAgICAvLyBlbHNlXHJcbiAgICAgIHRoaXMuY2FtZXJhLnByb2plY3RDZW50cmFsKFxyXG4gICAgICAgIHJlY3Qud2lkdGggLyByZWN0LmhlaWdodCwgdGhpcy5jYW1lcmEuZ2V0RmllbGRPZlZpZXcoKSwgdGhpcy5jYW1lcmEuZ2V0RGlyZWN0aW9uKCksIHRoaXMuY2FtZXJhLmdldE5lYXIoKSwgdGhpcy5jYW1lcmEuZ2V0RmFyKClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jYW1lcmEucmVzZXRXb3JsZFRvVmlldygpO1xyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBQb2ludHNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBSYXl9IGluIHdvcmxkIGNvb3JkaW5hdGVzIGZyb20gdGhpcyBjYW1lcmEgdGhyb3VnaCB0aGUgcG9pbnQgZ2l2ZW4gaW4gY2xpZW50IHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSYXlGcm9tQ2xpZW50KF9wb2ludDogVmVjdG9yMik6IFJheSB7XHJcbiAgICAgIGxldCBwb3NQcm9qZWN0aW9uOiBWZWN0b3IyID0gdGhpcy5wb2ludENsaWVudFRvUHJvamVjdGlvbihfcG9pbnQpO1xyXG4gICAgICBsZXQgcmF5OiBSYXkgPSBuZXcgUmF5KG5ldyBWZWN0b3IzKC1wb3NQcm9qZWN0aW9uLngsIHBvc1Byb2plY3Rpb24ueSwgMSkpO1xyXG5cclxuICAgICAgLy8gcmF5LmRpcmVjdGlvbi5zY2FsZShjYW1lcmEuZGlzdGFuY2UpO1xyXG4gICAgICByYXkudHJhbnNmb3JtKHRoaXMuY2FtZXJhLm10eFBpdm90KTtcclxuICAgICAgbGV0IGNhbWVyYU5vZGU6IE5vZGUgPSB0aGlzLmNhbWVyYS5ub2RlO1xyXG4gICAgICBpZiAoY2FtZXJhTm9kZSlcclxuICAgICAgICByYXkudHJhbnNmb3JtKGNhbWVyYU5vZGUubXR4V29ybGQpO1xyXG5cclxuICAgICAgcmV0dXJuIHJheTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY2xpZW50IHJlY3RhbmdsZSBtYXRjaGluZyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgZ2l2ZW4gcG9pbnQgaW4gd29ybGQgc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50V29ybGRUb0NsaWVudChfcG9zaXRpb246IFZlY3RvcjMpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHByb2plY3Rpb246IFZlY3RvcjMgPSB0aGlzLmNhbWVyYS5wb2ludFdvcmxkVG9DbGlwKF9wb3NpdGlvbik7XHJcbiAgICAgIGxldCBwb3NDbGllbnQ6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpcFRvQ2xpZW50KHByb2plY3Rpb24udG9WZWN0b3IyKCkpO1xyXG4gICAgICByZXR1cm4gcG9zQ2xpZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBzb3VyY2UtcmVjdGFuZ2xlIG1hdGNoaW5nIHRoZSBnaXZlbiBwb2ludCBvbiB0aGUgY2xpZW50IHJlY3RhbmdsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRDbGllbnRUb1NvdXJjZShfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSB0aGlzLmZyYW1lQ2xpZW50VG9DYW52YXMuZ2V0UG9pbnQoX2NsaWVudCwgdGhpcy5nZXRDbGllbnRSZWN0YW5nbGUoKSk7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZnJhbWVDYW52YXNUb0Rlc3RpbmF0aW9uLmdldFBvaW50KHJlc3VsdCwgdGhpcy5nZXRDYW52YXNSZWN0YW5nbGUoKSk7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZnJhbWVEZXN0aW5hdGlvblRvU291cmNlLmdldFBvaW50KHJlc3VsdCwgdGhpcy5yZWN0U291cmNlKTtcclxuICAgICAgLy9UT0RPOiB3aGVuIFNvdXJjZSwgUmVuZGVyIGFuZCBSZW5kZXJWaWV3cG9ydCBkZXZpYXRlLCBjb250aW51ZSB0cmFuc2Zvcm1hdGlvbiBcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgcmVuZGVyLXJlY3RhbmdsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIHNvdXJjZSByZWN0YW5nbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50U291cmNlVG9SZW5kZXIoX3NvdXJjZTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcHJvamVjdGlvblJlY3RhbmdsZTogUmVjdGFuZ2xlID0gdGhpcy5jYW1lcmEuZ2V0UHJvamVjdGlvblJlY3RhbmdsZSgpO1xyXG4gICAgICBsZXQgcG9pbnQ6IFZlY3RvcjIgPSB0aGlzLmZyYW1lU291cmNlVG9SZW5kZXIuZ2V0UG9pbnQoX3NvdXJjZSwgcHJvamVjdGlvblJlY3RhbmdsZSk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHByb2plY3Rpb25SZWN0YW5nbGUudG9TdHJpbmcoKSk7XHJcbiAgICAgIHJldHVybiBwb2ludDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgcmVuZGVyLXJlY3RhbmdsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIGNsaWVudCByZWN0YW5nbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50Q2xpZW50VG9SZW5kZXIoX2NsaWVudDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcG9pbnQ6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpZW50VG9Tb3VyY2UoX2NsaWVudCk7XHJcbiAgICAgIHBvaW50ID0gdGhpcy5wb2ludFNvdXJjZVRvUmVuZGVyKHBvaW50KTtcclxuICAgICAgLy9UT0RPOiB3aGVuIFJlbmRlciBhbmQgUmVuZGVyVmlld3BvcnQgZGV2aWF0ZSwgY29udGludWUgdHJhbnNmb3JtYXRpb24gXHJcbiAgICAgIHJldHVybiBwb2ludDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiBhIHByb2plY3Rpb24gc3VyZmFjZSBpbiB0aGUgaHlwb3RoZXRpY2FsIGRpc3RhbmNlIG9mIDEgdG8gdGhlIGNhbWVyYSAgXHJcbiAgICAgKiBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIGNsaWVudCByZWN0YW5nbGVcclxuICAgICAqIFRPRE86IGV4YW1pbmUsIGlmIHRoaXMgc2hvdWxkIGJlIGEgY2FtZXJhLW1ldGhvZC4gQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBmb3IgY2VudHJhbC1wcm9qZWN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaWVudFRvUHJvamVjdGlvbihfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBwb3NSZW5kZXI6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpZW50VG9SZW5kZXIoX2NsaWVudCk7XHJcbiAgICAgIGxldCByZWN0UmVuZGVyOiBSZWN0YW5nbGUgPSB0aGlzLmZyYW1lU291cmNlVG9SZW5kZXIuZ2V0UmVjdCh0aGlzLnJlY3RTb3VyY2UpO1xyXG4gICAgICBsZXQgcmVjdFByb2plY3Rpb246IFJlY3RhbmdsZSA9IHRoaXMuY2FtZXJhLmdldFByb2plY3Rpb25SZWN0YW5nbGUoKTtcclxuXHJcbiAgICAgIGxldCBwb3NQcm9qZWN0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgcmVjdFByb2plY3Rpb24ud2lkdGggKiBwb3NSZW5kZXIueCAvIHJlY3RSZW5kZXIud2lkdGgsXHJcbiAgICAgICAgcmVjdFByb2plY3Rpb24uaGVpZ2h0ICogcG9zUmVuZGVyLnkgLyByZWN0UmVuZGVyLmhlaWdodFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcG9zUHJvamVjdGlvbi5zdWJ0cmFjdChuZXcgVmVjdG9yMihyZWN0UHJvamVjdGlvbi53aWR0aCAvIDIsIHJlY3RQcm9qZWN0aW9uLmhlaWdodCAvIDIpKTtcclxuICAgICAgcG9zUHJvamVjdGlvbi55ICo9IC0xO1xyXG5cclxuICAgICAgcmV0dXJuIHBvc1Byb2plY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcG9pbnQgaW4gdGhlIGNsaWVudCByZWN0YW5nbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IGluIG5vcm1lZCBjbGlwc3BhY2UgcmVjdGFuZ2xlLCBcclxuICAgICAqIHdoaWNoIHN0cmV0Y2hlcyBmcm9tIC0xIHRvIDEgaW4gYm90aCBkaW1lbnNpb25zLCB5IHBvaW50aW5nIHVwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaXBUb0NsaWVudChfbm9ybWVkOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIC8vIGxldCByZWN0Q2xpZW50OiBSZWN0YW5nbGUgPSB0aGlzLmdldENsaWVudFJlY3RhbmdsZSgpO1xyXG4gICAgICAvLyBsZXQgcmVzdWx0OiBWZWN0b3IyID0gVmVjdG9yMi5PTkUoMC41KTtcclxuICAgICAgLy8gcmVzdWx0LnggKj0gKF9ub3JtZWQueCArIDEpICogcmVjdENsaWVudC53aWR0aDtcclxuICAgICAgLy8gcmVzdWx0LnkgKj0gKDEgLSBfbm9ybWVkLnkpICogcmVjdENsaWVudC5oZWlnaHQ7XHJcbiAgICAgIC8vIHJlc3VsdC5hZGQocmVjdENsaWVudC5wb3NpdGlvbik7XHJcbiAgICAgIC8vVE9ETzogY2hlY2sgaWYgcmVjdERlc3RpbmF0aW9uIGNhbiBzYWZlbHkgKGFuZCBtb3JlIHBlcmZvbWFudCkgYmUgdXNlZCBpbnN0ZWFkIGdldENsaWVudFJlY3RhbmdsZVxyXG4gICAgICBsZXQgcG9pbnRDbGllbnQ6IFZlY3RvcjIgPSBSZW5kZXIucmVjdENsaXAucG9pbnRUb1JlY3QoX25vcm1lZCwgdGhpcy5yZWN0RGVzdGluYXRpb24pO1xyXG4gICAgICByZXR1cm4gcG9pbnRDbGllbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcG9pbnQgaW4gdGhlIGNsaWVudCByZWN0YW5nbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IGluIG5vcm1lZCBjbGlwc3BhY2UgcmVjdGFuZ2xlLCBcclxuICAgICAqIHdoaWNoIHN0cmV0Y2hlcyBmcm9tIC0xIHRvIDEgaW4gYm90aCBkaW1lbnNpb25zLCB5IHBvaW50aW5nIHVwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaXBUb0NhbnZhcyhfbm9ybWVkOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBwb2ludENhbnZhczogVmVjdG9yMiA9IFJlbmRlci5yZWN0Q2xpcC5wb2ludFRvUmVjdChfbm9ybWVkLCB0aGlzLmdldENhbnZhc1JlY3RhbmdsZSgpKTtcclxuICAgICAgcmV0dXJuIHBvaW50Q2FudmFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHBvaW50IGluIHRoZSBicm93c2VyIHBhZ2UgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IG9mIHRoZSB2aWV3cG9ydFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRDbGllbnRUb1NjcmVlbihfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBzY3JlZW46IFZlY3RvcjIgPSBuZXcgVmVjdG9yMih0aGlzLiNjYW52YXMub2Zmc2V0TGVmdCArIF9jbGllbnQueCwgdGhpcy4jY2FudmFzLm9mZnNldFRvcCArIF9jbGllbnQueSk7XHJcbiAgICAgIHJldHVybiBzY3JlZW47XHJcbiAgICB9XHJcbiAgICAvLyAjZW5kcmVnaW9uXHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERpZmZlcmVudCB4ciBzZXNzaW9uIG1vZGVzIGF2YWlsYWJsZS4gQ291bGQgYmUgZXhwYW5kIHdpdGggbW9yZSBtb2RlcyBpbiB0aGUgZnV0dXJlLlxyXG4gICAqIEBhdXRob3JzIFZhbGVudGluIFNjaG1pZGJlcmdlciwgSEZVLCAyMDIyIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gWFJfU0VTU0lPTl9NT0RFIHtcclxuICAgIElNTUVSU0lWRV9WUiA9IFwiaW1tZXJzaXZlLXZyXCJcclxuICAgIC8vSU1NRVJTSVZFX0FSID0gXCJpbW1lcnNpdmUtYXJcIixcclxuICAgIC8vSU5MSU5FID0gXCJpbmxpbmVcIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlmZmVyZW50IHJlZmVyZW5jZSB2ci1zcGFjZXMgYXZhaWxhYmxlLCBjcmVhdG9yIGhhcyB0byBjaGVjayBpZiB0aGUgc3BhY2UgaXMgc3VwcG9ydGVkIHdpdGggaXRzIGRldmljZS5cclxuICAgKiBDb3VsZCBiZSBleHBhbmQgd2l0aCBtb3JlIGF2YWlsYWJsZSBzcGFjZSB0eXBlcyBpbiB0aGUgZnV0dXJlLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIFhSX1JFRkVSRU5DRV9TUEFDRSB7XHJcbiAgICBWSUVXRVIgPSBcInZpZXdlclwiLFxyXG4gICAgTE9DQUwgPSBcImxvY2FsXCJcclxuICAgIC8vIExPQ0FMX0ZMT09SID0gXCJsb2NhbC1mbG9vclwiLFxyXG4gICAgLy8gQk9VTkRFRF9GTE9PUiA9IFwiYm91bmRlZC1mbG9vclwiLFxyXG4gICAgLy8gVU5CT1VOREVEID0gXCJ1bmJvdW5kZWRcIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogWFJWaWV3cG9ydCAod2ViWFIpLWV4dGVuc2lvbiBvZiBWaWV3cG9ydCwgdG8gZGlzcGxheWluZyBpdHMgYnJhbmNoIG9uIEhlYWQgTW91bnRlZCBhbmQgQVIgKG5vdCBpbXBsZW10ZWQgeWV0KSBEZXZpY2VzIFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBYUlZpZXdwb3J0IGV4dGVuZHMgVmlld3BvcnQge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgeHJWaWV3cG9ydEluc3RhbmNlOiBYUlZpZXdwb3J0ID0gbnVsbDtcclxuICAgIHB1YmxpYyB2ckRldmljZTogQ29tcG9uZW50VlJEZXZpY2UgPSBudWxsO1xyXG4gICAgcHVibGljIHNlc3Npb246IFhSU2Vzc2lvbiA9IG51bGw7XHJcbiAgICBwdWJsaWMgcmVmZXJlbmNlU3BhY2U6IFhSUmVmZXJlbmNlU3BhY2UgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VWUkNvbnRyb2xsZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBwcml2YXRlIHBvc2VNdHg6IE1hdHJpeDR4NCA9IG5ldyBNYXRyaXg0eDQoKTtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgWFJWaWV3cG9ydC54clZpZXdwb3J0SW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVG8gcmV0cmlldmUgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2Ugb2YgeHIgdmlld3BvcnQsIHJlYWRvbmx5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBkZWZhdWx0KCk6IFhSVmlld3BvcnQge1xyXG4gICAgICByZXR1cm4gdGhpcy54clZpZXdwb3J0SW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogQ29ubmVjdHMgdGhlIHZpZXdwb3J0IHRvIHRoZSBnaXZlbiBjYW52YXMgdG8gcmVuZGVyIHRoZSBnaXZlbiBicmFuY2ggdG8gdXNpbmcgdGhlIGdpdmVuIGNhbWVyYS1jb21wb25lbnQsIGFuZCBuYW1lcyB0aGUgdmlld3BvcnQgYXMgZ2l2ZW4uXHJcbiAgICAgICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZShfbmFtZTogc3RyaW5nLCBfYnJhbmNoOiBOb2RlLCBfY2FtZXJhWFI6IENvbXBvbmVudFZSRGV2aWNlIC8qIHwgQ29tcG9uZW50Q2FtZXJhQVIqLywgX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgc3VwZXIuaW5pdGlhbGl6ZShfbmFtZSwgX2JyYW5jaCwgX2NhbWVyYVhSLCBfY2FudmFzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBWUiBTZXNzaW9uIGlzIGluaXRpYWxpemVkIGhlcmUsIGFsc28gVlIgLSBDb250cm9sbGVyIGFyZSBpbml0aWFsaXplZCwgaWYgYm9vbGVhbiBpcyB0cnVlLlxyXG4gICAgICogQ3JlYXRvciBoYXMgdG8gY2FsbCBGcmFtZVJlcXVlc3RYUiBhZnRlciB0aGlzIE1ldGhvZCB0byBydW4gdGhlIHZpZXdwb3J0IGluIHZpcnR1YWwgcmVhbGl0eS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemVWUihfdnJTZXNzaW9uTW9kZTogWFJfU0VTU0lPTl9NT0RFID0gWFJfU0VTU0lPTl9NT0RFLklNTUVSU0lWRV9WUiwgX3ZyUmVmZXJlbmNlU3BhY2VUeXBlOiBYUl9SRUZFUkVOQ0VfU1BBQ0UgPSBYUl9SRUZFUkVOQ0VfU1BBQ0UuTE9DQUwsIF92ckNvbnRyb2xsZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgc2Vzc2lvbjogWFJTZXNzaW9uID0gYXdhaXQgbmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uKF92clNlc3Npb25Nb2RlKTtcclxuICAgICAgdGhpcy5yZWZlcmVuY2VTcGFjZSA9IGF3YWl0IHNlc3Npb24ucmVxdWVzdFJlZmVyZW5jZVNwYWNlKF92clJlZmVyZW5jZVNwYWNlVHlwZSk7XHJcbiAgICAgIGF3YWl0IFJlbmRlci5nZXRSZW5kZXJpbmdDb250ZXh0KCkubWFrZVhSQ29tcGF0aWJsZSgpO1xyXG4gICAgICBsZXQgbmF0aXZlU2NhbGVGYWN0b3I6IG51bWJlciA9IFhSV2ViR0xMYXllci5nZXROYXRpdmVGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yKHNlc3Npb24pO1xyXG4gICAgICAvL1RPRE86ICBGaWVsZCBvZiB2aWV3IGvDtm5udGUgYW4gZGVyIFN0ZWxsZSBub2NoIHZlcsOkbmRlcnQgd2VyZGVuLlxyXG4gICAgICBsZXQgYmFzZUxheWVyOiBYUldlYkdMTGF5ZXIgPSBuZXcgWFJXZWJHTExheWVyKHNlc3Npb24sIFJlbmRlci5nZXRSZW5kZXJpbmdDb250ZXh0KCksIHsgZnJhbWVidWZmZXJTY2FsZUZhY3RvcjogbmF0aXZlU2NhbGVGYWN0b3IgfSk7XHJcbiAgICAgIGF3YWl0IHNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoeyBiYXNlTGF5ZXI6IGJhc2VMYXllciB9KTtcclxuICAgICAgUmVuZGVyLnNldEZyYW1lYnVmZmVyVGFyZ2V0KGJhc2VMYXllci5mcmFtZWJ1ZmZlcik7XHJcbiAgICAgIFJlbmRlci5zZXRDYW52YXNTaXplKGJhc2VMYXllci5mcmFtZWJ1ZmZlcldpZHRoLCBiYXNlTGF5ZXIuZnJhbWVidWZmZXJIZWlnaHQpO1xyXG4gICAgICBSZW5kZXIuc2V0UmVuZGVyUmVjdGFuZ2xlKFJlY3RhbmdsZS5HRVQoMCwgMCwgYmFzZUxheWVyLmZyYW1lYnVmZmVyV2lkdGgsIGJhc2VMYXllci5mcmFtZWJ1ZmZlckhlaWdodCkpO1xyXG4gICAgICBSZW5kZXIuYWRqdXN0QXR0YWNobWVudHMoKTtcclxuICAgICAgdGhpcy5hZGp1c3RpbmdGcmFtZXMgPSBmYWxzZTsgLy8gd2ViIHhyIGhhbmRsZXMgdGhpcyBub3dcclxuICAgICAgdGhpcy52ckRldmljZSA9IDxDb21wb25lbnRWUkRldmljZT50aGlzLmNhbWVyYTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlU3BhY2UoKTtcclxuXHJcbiAgICAgIHRoaXMudXNlVlJDb250cm9sbGVyID0gX3ZyQ29udHJvbGxlcjtcclxuICAgICAgaWYgKF92ckNvbnRyb2xsZXIpIHtcclxuICAgICAgICB0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwuY21wVHJhbnNmb3JtID0gbmV3IENvbXBvbmVudFRyYW5zZm9ybSgpO1xyXG4gICAgICAgIHRoaXMudnJEZXZpY2UubGVmdENudHJsLmNtcFRyYW5zZm9ybSA9IG5ldyBDb21wb25lbnRUcmFuc2Zvcm0oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcclxuXHJcbiAgICAgIHRoaXMucHJlcGFyZUJyYW5jaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEFSIHNlc3Npb24gY291bGQgYmUgaW5pdGlhbGl6ZWQgaGVyZS4gVXAgdGlsbCBub3cgbm90IGltcGxlbWVudGVkLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemVBUihfYXJTZXNzaW9uTW9kZTogWFJfU0VTU0lPTl9NT0RFID0gbnVsbCwgX2FyUmVmZXJlbmNlU3BhY2VUeXBlOiBYUl9SRUZFUkVOQ0VfU1BBQ0UgPSBudWxsKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIERlYnVnLmVycm9yKFwiTk9UIElNUExFTUVOVEVEIFlFVCEgQ2hlY2sgb3V0IGluaXRpYWxpemVWUiFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSB4ciB2aWV3cG9ydCBkaXNwbGF5aW5nIGl0cyBicmFuY2guIEJ5IGRlZmF1bHQsIHRoZSB0cmFuc2Zvcm1zIGluIHRoZSBicmFuY2ggYXJlIHJlY2FsY3VsYXRlZCBmaXJzdC5cclxuICAgICAqIFBhc3MgYGZhbHNlYCBpZiBjYWxjdWxhdGlvbiB3YXMgYWxyZWFkeSBkb25lIGZvciB0aGlzIGZyYW1lIFxyXG4gICAgICogQ2FsbGVkIGZyb20gbG9vcCBtZXRob2Qge0BsaW5rIExvb3B9IGFnYWluIHdpdGggdGhlIHhyRnJhbWUgcGFyYW1ldGVyIGhhbmRvdmVyLCBhcyBzb29uIGFzIEZSQU1FX1JFUVVFU1RfWFIgaXMgY2FsbGVkIGZyb20gY3JlYXRvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRyYXcoX3ByZXBhcmVCcmFuY2g6IGJvb2xlYW4gPSB0cnVlLCBfeHJGcmFtZTogWFJGcmFtZSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLnNlc3Npb24pIHtcclxuICAgICAgICBzdXBlci5kcmF3KF9wcmVwYXJlQnJhbmNoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwb3NlOiBYUlZpZXdlclBvc2UgPSBfeHJGcmFtZT8uZ2V0Vmlld2VyUG9zZSh0aGlzLnJlZmVyZW5jZVNwYWNlKTtcclxuICAgICAgaWYgKCFwb3NlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMudnJEZXZpY2UubXR4TG9jYWwuc2V0KHBvc2UudHJhbnNmb3JtLm1hdHJpeCk7XHJcbiAgICAgIHRoaXMudnJEZXZpY2UubXR4TG9jYWwucm90YXRlWSgxODApOyAvLyByb3RhdGUgYmFjayBiZWNhdXNlIHRoZSBYUiBSaWcgaXMgbG9va2luZyBpbiB0aGUgZGlyZWN0aW9uIG9mIG5lZ2F0aXZlIHpcclxuICAgICAgc3VwZXIucHJlcGFyZShfcHJlcGFyZUJyYW5jaCk7XHJcblxyXG4gICAgICBsZXQgZ2xMYXllcjogWFJXZWJHTExheWVyID0gdGhpcy5zZXNzaW9uLnJlbmRlclN0YXRlLmJhc2VMYXllcjtcclxuICAgICAgZm9yIChsZXQgdmlldyBvZiBwb3NlLnZpZXdzKSB7XHJcbiAgICAgICAgbGV0IHZpZXdwb3J0OiBnbG9iYWxUaGlzLlhSVmlld3BvcnQgPSBnbExheWVyLmdldFZpZXdwb3J0KHZpZXcpO1xyXG4gICAgICAgIFJlbmRlci5zZXRWaWV3cG9ydCh2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTtcclxuICAgICAgICBSZW5kZXIuc2V0U2Npc3NvclRlc3QodHJ1ZSwgdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVzZVZSQ29udHJvbGxlcilcclxuICAgICAgICAgIHRoaXMuc2V0Q29udHJvbGxlckNvbmZpZ3MoX3hyRnJhbWUpO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnJlc2V0V29ybGRUb1ZpZXcoKTsgLy8gVE9ETzogZmluZCBhIGxlc3MgZXhwZW5zaXZlIHdheSB0byBkbyB0aGlzLCBtYXliZSB1c2UgdHdvIGNhbWVyYXNcclxuICAgICAgICB0aGlzLmNhbWVyYS5tdHhQcm9qZWN0aW9uLnNldCh2aWV3LnByb2plY3Rpb25NYXRyaXgpO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLm10eENhbWVyYUludmVyc2Uuc2V0KHZpZXcudHJhbnNmb3JtLmludmVyc2UubWF0cml4KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGh5c2ljc0RlYnVnTW9kZSAhPSBQSFlTSUNTX0RFQlVHTU9ERS5QSFlTSUNfT0JKRUNUU19PTkxZKVxyXG4gICAgICAgICAgUmVuZGVyLmRyYXcodGhpcy5jYW1lcmEpO1xyXG4gICAgICAgIGlmICh0aGlzLnBoeXNpY3NEZWJ1Z01vZGUgIT0gUEhZU0lDU19ERUJVR01PREUuTk9ORSkge1xyXG4gICAgICAgICAgUGh5c2ljcy5kcmF3KHRoaXMuY2FtZXJhLCB0aGlzLnBoeXNpY3NEZWJ1Z01vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVzZXQgZm9yIG90aGVyIHJlbmRlciBvcGVyYXRpb25zIGUuZy4gcGlja2luZ1xyXG4gICAgICBSZW5kZXIuc2V0U2Npc3NvclRlc3QoZmFsc2UpO1xyXG4gICAgICBSZW5kZXIuc2V0UmVuZGVyUmVjdGFuZ2xlKFJlbmRlci5nZXRSZW5kZXJSZWN0YW5nbGUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlIHRoZSByZWZlcmVuY2Ugc3BhY2UgdG8gc2V0IHRoZSBpbml0aWFsIHBvc2l0aW9uL29yaWVudGF0aW9uIG9mIHRoZSB2ciBkZXZpY2UgaW4gYWNjb3JkYW5jZSB0byB0aGUgbm9kZSB0aGUgdnIgZGV2aWNlIGlzIGF0dGFjaGVkIHRvLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRpYWxpemVSZWZlcmVuY2VTcGFjZSgpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSB0aGlzLnZyRGV2aWNlLm5vZGU/LmdldENvbXBvbmVudChDb21wb25lbnRWUkRldmljZSk/Lm10eFdvcmxkO1xyXG4gICAgICBpZiAoIW10eFdvcmxkKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIG10eFdvcmxkID0gbXR4V29ybGQuY2xvbmU7XHJcbiAgICAgIG10eFdvcmxkLnJvdGF0ZVkoMTgwKTsgLy8gcm90YXRlIGJlY2F1c2UgdGhlIFhSIFJpZyBpcyBsb29raW5nIGluIHRoZSBkaXJlY3Rpb24gb2YgbmVnYXRpdmUgelxyXG4gICAgICBsZXQgaW52TXR4VHJhbnNmb206IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFdvcmxkKTsgLy8gaW52ZXJzZSBiZWNhdXNlIHdlIGFyZSBtb3ZpbmcgdGhlIHJlZmVyZW5jZSBzcGFjZVxyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UgPSBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UuZ2V0T2Zmc2V0UmVmZXJlbmNlU3BhY2UobmV3IFhSUmlnaWRUcmFuc2Zvcm0oaW52TXR4VHJhbnNmb20udHJhbnNsYXRpb24sIGludk10eFRyYW5zZm9tLnF1YXRlcm5pb24pKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1NldHMgY29udHJvbGxlciBtYXRyaWNlcyBhbmQgdGh1bWJzdGlja3MgbW92ZW1lbnRzLlxyXG4gICAgcHJpdmF0ZSBzZXRDb250cm9sbGVyQ29uZmlncyhfeHJGcmFtZTogWFJGcmFtZSk6IHZvaWQge1xyXG4gICAgICBpZiAoX3hyRnJhbWUpIHtcclxuICAgICAgICBpZiAoWFJWaWV3cG9ydC5kZWZhdWx0LnNlc3Npb24uaW5wdXRTb3VyY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5zZXNzaW9uLmlucHV0U291cmNlcy5mb3JFYWNoKF9jb250cm9sbGVyID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250cm9sbGVyLmhhbmRlZG5lc3MpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgKFwicmlnaHRcIik6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudnJEZXZpY2UucmlnaHRDbnRybC5jbXBUcmFuc2Zvcm0ubXR4TG9jYWwuc2V0KF94ckZyYW1lLmdldFBvc2UoX2NvbnRyb2xsZXIudGFyZ2V0UmF5U3BhY2UsIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSkudHJhbnNmb3JtLm1hdHJpeCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52ckRldmljZS5yaWdodENudHJsLmdhbWVQYWQpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5yaWdodENudHJsLmdhbWVQYWQgPSBfY29udHJvbGxlci5nYW1lcGFkO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwudGh1bWJzdGlja1ggPSBfY29udHJvbGxlci5nYW1lcGFkLmF4ZXNbMl07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5yaWdodENudHJsLnRodW1ic3RpY2tZID0gX2NvbnRyb2xsZXIuZ2FtZXBhZC5heGVzWzNdO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAoXCJsZWZ0XCIpOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnZyRGV2aWNlLmxlZnRDbnRybC5jbXBUcmFuc2Zvcm0ubXR4TG9jYWwuc2V0KF94ckZyYW1lLmdldFBvc2UoX2NvbnRyb2xsZXIudGFyZ2V0UmF5U3BhY2UsIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSkudHJhbnNmb3JtLm1hdHJpeCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudnJEZXZpY2UubGVmdENudHJsLmdhbWVQYWQpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5sZWZ0Q250cmwuZ2FtZVBhZCA9IF9jb250cm9sbGVyLmdhbWVwYWQ7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudnJEZXZpY2UubGVmdENudHJsLnRodW1ic3RpY2tYID0gX2NvbnRyb2xsZXIuZ2FtZXBhZC5heGVzWzJdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudnJEZXZpY2UubGVmdENudHJsLnRodW1ic3RpY2tZID0gX2NvbnRyb2xsZXIuZ2FtZXBhZC5heGVzWzNdO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xyXG4gICAgICAgICAgICAgIERlYnVnLmluZm8oXCJJbnB1dCBTb3VyY2VzIEVycm9yOiBcIiArIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgaW50ZXJmYWNlIE1hcEZpbGVuYW1lVG9Db250ZW50IHtcclxuICAgIFtmaWxlbmFtZTogc3RyaW5nXTogc3RyaW5nO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGZpbGUgdHJhbnNmZXIgZnJvbSBhIEZVREdFLUJyb3dzZXJhcHAgdG8gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gd2l0aG91dCBhIGxvY2FsIHNlcnZlci4gIFxyXG4gICAqIFNhdmVzIHRvIHRoZSBkb3dubG9hZC1wYXRoIGdpdmVuIGJ5IHRoZSBicm93c2VyLCBsb2FkcyBmcm9tIHRoZSBwbGF5ZXIncyBjaG9pY2UuXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEZpbGVJb0Jyb3dzZXJMb2NhbCBleHRlbmRzIEV2ZW50VGFyZ2V0U3RhdGljIHtcclxuICAgIHByaXZhdGUgc3RhdGljIHNlbGVjdG9yOiBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgLy8gVE9ETzogcmVmYWN0b3IgdG8gYXN5bmMgZnVuY3Rpb24gdG8gYmUgaGFuZGxlZCB1c2luZyBwcm9taXNlLCBpbnN0ZWFkIG9mIHVzaW5nIGV2ZW50IHRhcmdldFxyXG4gICAgLyoqXHJcbiAgICAgKiBPcGVuIGZpbGUgc2VsZWN0IGRpYWxvZyB0byBsb2FkIGZpbGVzIGZyb20gbG9jYWwgZmlsZXN5c3RlbSBpbnRvIGJyb3dzZXIgYXBwbGljYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZChfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8TWFwRmlsZW5hbWVUb0NvbnRlbnQ+IHtcclxuICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IudHlwZSA9IFwiZmlsZVwiO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IubXVsdGlwbGUgPSBfbXVsdGlwbGU7XHJcbiAgICAgIEZpbGVJb0Jyb3dzZXJMb2NhbC5zZWxlY3Rvci5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBGaWxlSW9Ccm93c2VyTG9jYWwuaGFuZGxlRmlsZVNlbGVjdCk7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yKTtcclxuXHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxNYXBGaWxlbmFtZVRvQ29udGVudD4oX3Jlc29sdmUgPT4ge1xyXG4gICAgICAgIGZ1bmN0aW9uIGhuZExvYWRlZChfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgICBGaWxlSW9Ccm93c2VyTG9jYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5GSUxFX0xPQURFRCwgaG5kTG9hZGVkKTtcclxuICAgICAgICAgIF9yZXNvbHZlKCg8Q3VzdG9tRXZlbnQ+X2V2ZW50KS5kZXRhaWwubWFwRmlsZW5hbWVUb0NvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRklMRV9MT0FERUQsIGhuZExvYWRlZCk7XHJcbiAgICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yLmNsaWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHJlZmFjdG9yIHRvIGFzeW5jIGZ1bmN0aW9uIHRvIGJlIGhhbmRsZWQgdXNpbmcgcHJvbWlzZSwgaW5zdGVhZCBvZiB1c2luZyBldmVudCB0YXJnZXRcclxuICAgIC8qKlxyXG4gICAgICogT3BlbiBhIGZpbGUgZG93bmxvYWQgZGlhbG9nIHRvIHNhdmUgZmlsZXMgdG8gbG9jYWwgZmlsZXN5c3RlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzYXZlKF90b1NhdmU6IE1hcEZpbGVuYW1lVG9Db250ZW50LCBfdHlwZTogc3RyaW5nID0gXCJ0ZXh0L3BsYWluXCIpOiBQcm9taXNlPE1hcEZpbGVuYW1lVG9Db250ZW50PiB7XHJcbiAgICAgIGZvciAobGV0IGZpbGVuYW1lIGluIF90b1NhdmUpIHtcclxuICAgICAgICBsZXQgY29udGVudDogc3RyaW5nID0gX3RvU2F2ZVtmaWxlbmFtZV07XHJcbiAgICAgICAgbGV0IGJsb2I6IEJsb2IgPSBuZXcgQmxvYihbY29udGVudF0sIHsgdHlwZTogX3R5cGUgfSk7XHJcbiAgICAgICAgbGV0IHVybDogc3RyaW5nID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgLy8qLyB1c2luZyBhbmNob3IgZWxlbWVudCBmb3IgZG93bmxvYWRcclxuICAgICAgICBsZXQgZG93bmxvYWRlcjogSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICAgICAgZG93bmxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIGRvd25sb2FkZXIuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCB1cmwpO1xyXG4gICAgICAgIGRvd25sb2FkZXIuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgZmlsZW5hbWUpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRlcik7XHJcbiAgICAgICAgZG93bmxvYWRlci5jbGljaygpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZG93bmxvYWRlcik7XHJcbiAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPE1hcEZpbGVuYW1lVG9Db250ZW50PihfcmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgX3Jlc29sdmUoX3RvU2F2ZSk7XHJcbiAgICAgICAgLy8gZnVuY3Rpb24gaG5kU2F2ZWQoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8vICAgRmlsZUlvQnJvd3NlckxvY2FsLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuRklMRV9TQVZFRCwgaG5kU2F2ZWQpO1xyXG4gICAgICAgIC8vICAgX3Jlc29sdmUoKDxDdXN0b21FdmVudD5fZXZlbnQpLmRldGFpbCk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyBGaWxlSW9Ccm93c2VyTG9jYWwuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5GSUxFX1NBVkVELCBobmRTYXZlZCk7XHJcbiAgICAgICAgLy8gbGV0IGV2ZW50OiBDdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChFVkVOVC5GSUxFX1NBVkVELCB7IGRldGFpbDogeyBtYXBGaWxlbmFtZVRvQ29udGVudDogX3RvU2F2ZSB9IH0pO1xyXG4gICAgICAgIC8vIEZpbGVJb0Jyb3dzZXJMb2NhbC50YXJnZXRTdGF0aWMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZCB0aGUgdGhlIGZpbGVzIHJlZmVyZW5jZWQgaW4ge0BsaW5rIEZpbGVMaXN0fSBpbnRvIHRoZSBwcm92aWRlZCB7QGxpbmsgTWFwRmlsZW5hbWVUb0NvbnRlbnR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZEZpbGVzKF9maWxlTGlzdDogRmlsZUxpc3QsIF9sb2FkZWQ6IE1hcEZpbGVuYW1lVG9Db250ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGZvciAobGV0IGZpbGUgb2YgX2ZpbGVMaXN0KSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudDogc3RyaW5nID0gYXdhaXQgbmV3IFJlc3BvbnNlKGZpbGUpLnRleHQoKTtcclxuICAgICAgICBfbG9hZGVkW2ZpbGUubmFtZV0gPSBjb250ZW50O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgaGFuZGxlRmlsZVNlbGVjdChfZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIERlYnVnLmZ1ZGdlKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGFuZGxlRmlsZVNlbGVjdFwiKTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IpO1xyXG4gICAgICBsZXQgZmlsZUxpc3Q6IEZpbGVMaXN0ID0gKDxIVE1MSW5wdXRFbGVtZW50Pl9ldmVudC50YXJnZXQpLmZpbGVzO1xyXG4gICAgICBEZWJ1Zy5mdWRnZShmaWxlTGlzdCwgZmlsZUxpc3QubGVuZ3RoKTtcclxuICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCA9PSAwKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGxldCBsb2FkZWQ6IE1hcEZpbGVuYW1lVG9Db250ZW50ID0ge307XHJcbiAgICAgIGF3YWl0IEZpbGVJb0Jyb3dzZXJMb2NhbC5sb2FkRmlsZXMoZmlsZUxpc3QsIGxvYWRlZCk7XHJcblxyXG4gICAgICBsZXQgZXZlbnQ6IEN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEVWRU5ULkZJTEVfTE9BREVELCB7IGRldGFpbDogeyBtYXBGaWxlbmFtZVRvQ29udGVudDogbG9hZGVkIH0gfSk7XHJcbiAgICAgIEZpbGVJb0Jyb3dzZXJMb2NhbC50YXJnZXRTdGF0aWMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59ICIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIE11dGFibGUgYXJyYXkgb2Yge0BsaW5rIE11dGFibGV9cy4gVGhlIHtAbGluayBNdXRhdG9yfXMgb2YgdGhlIGVudHJpZXMgYXJlIGluY2x1ZGVkIGFzIGFycmF5IGluIHRoZSB7QGxpbmsgTXV0YXRvcn1cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE11dGFibGVBcnJheTxUIGV4dGVuZHMgTXV0YWJsZT4gZXh0ZW5kcyBBcnJheTxUPiB7XHJcbiAgICAjdHlwZTogbmV3ICgpID0+IFQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90eXBlOiBuZXcgKCkgPT4gVCwgLi4uX2FyZ3M6IFRbXSkge1xyXG4gICAgICBzdXBlciguLi5fYXJncyk7XHJcbiAgICAgIHRoaXMuI3R5cGUgPSBfdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHR5cGUoKTogbmV3ICgpID0+IFQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYXJyYW5nZSB0aGUgZW50cmllcyBvZiB0aGUgYXJyYXkgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBpbmRpY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFycmFuZ2UoX3NlcXVlbmNlOiBudW1iZXJbXSk6IHZvaWQge1xyXG4gICAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSB0aGlzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaW5kZXggb2YgX3NlcXVlbmNlKSB7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsOiBUID0gdGhpc1tpbmRleF07XHJcbiAgICAgICAgLy8gVE9ETzogb3B0aW1pemUsIGNvcHkgb25seSBkb3VibGUgZW50cmllc1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGxldCBjb3B5OiBUID0gbmV3IG9yaWdpbmFsLmNvbnN0cnVjdG9yKCk7XHJcbiAgICAgICAgY29weS5tdXRhdGUob3JpZ2luYWwuZ2V0TXV0YXRvcigpKTtcclxuICAgICAgICB0aGlzLnB1c2goY29weSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zcGxpY2UoMCwgbGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGlzIGFycmF5cyBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHR5cGVzIGFzIHN0cmluZy12YWx1ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGZvciAobGV0IGVudHJ5IGluIHRoaXMpXHJcbiAgICAgICAgdHlwZXNbZW50cnldID0gdGhpc1tlbnRyeV0uY29uc3RydWN0b3IubmFtZTtcclxuXHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCBlYWNoIGVsZW1lbnRzIG11dGF0b3IgYnkgaW52b2tpbmcge0BsaW5rIE11dGFibGUuZ2V0TXV0YXRvcn0gb24gdGhlbVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgcmV0dXJuIHRoaXMubWFwKChfdmFsdWUpID0+IF92YWx1ZS5nZXRNdXRhdG9yKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VlIHtAbGluayBNdXRhYmxlLmdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckZvclVzZXJJbnRlcmZhY2UoKTogTXV0YXRvciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11dGF0ZSBlYWNoIGVsZW1lbnQgb2YgdGhpcyBhcnJheSBieSBpbnZva2luZyB7QGxpbmsgTXV0YWJsZS5tdXRhdGV9IG9uIGl0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgZm9yIChsZXQgZW50cnkgaW4gdGhpcylcclxuICAgICAgICBhd2FpdCB0aGlzW2VudHJ5XS5tdXRhdGUoX211dGF0b3JbZW50cnldKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gbXV0YXRvciBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGVudHJ5IGluIHRoaXMpIHtcclxuICAgICAgICBsZXQgbXV0YXRvclZhbHVlOiBPYmplY3QgPSBfbXV0YXRvcltlbnRyeV07XHJcbiAgICAgICAgaWYgKCFtdXRhdG9yVmFsdWUpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICBpZiAodGhpc1tlbnRyeV0gaW5zdGFuY2VvZiBNdXRhYmxlKVxyXG4gICAgICAgICAgX211dGF0b3JbZW50cnldID0gdGhpc1tlbnRyeV0uZ2V0TXV0YXRvcigpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIF9tdXRhdG9yW2VudHJ5XSA9IHRoaXNbZW50cnldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGVudW0gTU9ERSB7XHJcbiAgICBFRElUT1IsIFJVTlRJTUVcclxuICB9XHJcblxyXG4gIGV4cG9ydCBlbnVtIFJFU09VUkNFX1NUQVRVUyB7XHJcbiAgICBQRU5ESU5HLCBSRUFEWSwgRVJST1JcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCBleHRlbmRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIHVybDogUmVxdWVzdEluZm87XHJcbiAgICBzdGF0dXM6IFJFU09VUkNFX1NUQVRVUztcclxuICAgIGxvYWQoKTogUHJvbWlzZTxTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsPjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlUmVzb3VyY2UgZXh0ZW5kcyBTZXJpYWxpemFibGUge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgaWRSZXNvdXJjZTogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZXMge1xyXG4gICAgW2lkUmVzb3VyY2U6IHN0cmluZ106IFNlcmlhbGl6YWJsZVJlc291cmNlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemF0aW9uT2ZSZXNvdXJjZXMge1xyXG4gICAgW2lkUmVzb3VyY2U6IHN0cmluZ106IFNlcmlhbGl6YXRpb247XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFNjcmlwdE5hbWVzcGFjZXMge1xyXG4gICAgW25hbWU6IHN0cmluZ106IE9iamVjdDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50U2NyaXB0cyB7XHJcbiAgICBbbmFtZXNwYWNlOiBzdHJpbmddOiBDb21wb25lbnRTY3JpcHRbXTtcclxuICB9XHJcblxyXG4gIGludGVyZmFjZSBHcmFwaEluc3RhbmNlc1RvUmVzeW5jIHtcclxuICAgIFtpZFJlc291cmNlOiBzdHJpbmddOiBHcmFwaEluc3RhbmNlW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGF0aWMgY2xhc3MgaGFuZGxpbmcgdGhlIHJlc291cmNlcyB1c2VkIHdpdGggdGhlIGN1cnJlbnQgRlVER0UtaW5zdGFuY2UuICBcclxuICAgKiBLZWVwcyBhIGxpc3Qgb2YgdGhlIHJlc291cmNlcyBhbmQgZ2VuZXJhdGVzIGlkcyB0byByZXRyaWV2ZSB0aGVtLiAgXHJcbiAgICogUmVzb3VyY2VzIGFyZSBvYmplY3RzIHJlZmVyZW5jZWQgbXVsdGlwbGUgdGltZXMgYnV0IHN1cHBvc2VkIHRvIGJlIHN0b3JlZCBvbmx5IG9uY2VcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgUHJvamVjdCBleHRlbmRzIEV2ZW50VGFyZ2V0U3RhdGljIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVzb3VyY2VzOiBSZXNvdXJjZXMgPSB7fTtcclxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbk9mUmVzb3VyY2VzID0ge307XHJcbiAgICBwdWJsaWMgc3RhdGljIHNjcmlwdE5hbWVzcGFjZXM6IFNjcmlwdE5hbWVzcGFjZXMgPSB7fTtcclxuICAgIHB1YmxpYyBzdGF0aWMgYmFzZVVSTDogVVJMID0gbmV3IFVSTChsb2NhdGlvbi50b1N0cmluZygpKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgbW9kZTogTU9ERSA9IE1PREUuUlVOVElNRTtcclxuICAgIHB1YmxpYyBzdGF0aWMgZ3JhcGhJbnN0YW5jZXNUb1Jlc3luYzogR3JhcGhJbnN0YW5jZXNUb1Jlc3luYyA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJzIHRoZSByZXNvdXJjZSBhbmQgZ2VuZXJhdGVzIGFuIGlkIGZvciBpdCBieSBkZWZhdWx0LiAgXHJcbiAgICAgKiBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBoYXMgYW4gaWQsIHRodXMgaGF2aW5nIGJlZW4gcmVnaXN0ZXJlZCwgaXRzIGRlbGV0ZWQgZnJvbSB0aGUgbGlzdCBhbmQgcmVnaXN0ZXJlZCBhbmV3LlxyXG4gICAgICogSXQncyBwb3NzaWJsZSB0byBwYXNzIGFuIGlkLCBidXQgc2hvdWxkIG5vdCBiZSBkb25lIGV4Y2VwdCBieSB0aGUgU2VyaWFsaXplci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWdpc3RlcihfcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlLCBfaWRSZXNvdXJjZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBpZiAoX3Jlc291cmNlLmlkUmVzb3VyY2UgJiYgX3Jlc291cmNlLmlkUmVzb3VyY2UgPT0gX2lkUmVzb3VyY2UpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKF9yZXNvdXJjZS5pZFJlc291cmNlKSAvLyBkZXJlZ2lzdGVyIHRoZSBvbGQgaWRcclxuICAgICAgICB0aGlzLmRlcmVnaXN0ZXIoX3Jlc291cmNlKTtcclxuXHJcbiAgICAgIGlmIChfaWRSZXNvdXJjZSkge1xyXG4gICAgICAgIF9yZXNvdXJjZS5pZFJlc291cmNlID0gX2lkUmVzb3VyY2U7XHJcbiAgICAgICAgdGhpcy5kZXJlZ2lzdGVyKF9yZXNvdXJjZSk7IC8vIGRlcmVnaXN0ZXIgdGhlIG5ldyBpZFxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIV9yZXNvdXJjZS5pZFJlc291cmNlKVxyXG4gICAgICAgIF9yZXNvdXJjZS5pZFJlc291cmNlID0gUHJvamVjdC5nZW5lcmF0ZUlkKF9yZXNvdXJjZSk7XHJcblxyXG4gICAgICBQcm9qZWN0LnJlc291cmNlc1tfcmVzb3VyY2UuaWRSZXNvdXJjZV0gPSBfcmVzb3VyY2U7XHJcblxyXG4gICAgICBpZiAoX3Jlc291cmNlIGluc3RhbmNlb2YgR3JhcGgpXHJcbiAgICAgICAgX3Jlc291cmNlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR1JBUEhfTVVUQVRFRCwgKF9ldmVudDogRXZlbnQpID0+IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuR1JBUEhfTVVUQVRFRCwgeyBkZXRhaWw6IF9yZXNvdXJjZSB9KSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgbGlzdCBvZiByZXNvdXJjZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVyZWdpc3RlcihfcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSAoUHJvamVjdC5yZXNvdXJjZXNbX3Jlc291cmNlLmlkUmVzb3VyY2VdKTtcclxuICAgICAgZGVsZXRlIChQcm9qZWN0LnNlcmlhbGl6YXRpb25bX3Jlc291cmNlLmlkUmVzb3VyY2VdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgbGlzdCBvZiByZXNvdXJjZXMgYW5kIHRoZWlyIHNlcmlhbGl6YXRpb24sIHRodXMgcmVtb3ZpbmcgYWxsIHJlc291cmNlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgUHJvamVjdC5yZXNvdXJjZXMgPSB7fTtcclxuICAgICAgUHJvamVjdC5zZXJpYWxpemF0aW9uID0ge307XHJcbiAgICAgIFByb2plY3QuY2xlYXJTY3JpcHROYW1lc3BhY2VzKCk7XHJcbiAgICAgIC8vIFByb2plY3Quc2NyaXB0TmFtZXNwYWNlcyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDxUIGV4dGVuZHMgQ29tcG9uZW50PihfY2xhc3M6IG5ldyAoKSA9PiBUKTogVFtdIHtcclxuICAgIC8vICAgcmV0dXJuIDxUW10+KHRoaXMuY29tcG9uZW50c1tfY2xhc3MubmFtZV0gfHwgW10pLnNsaWNlKDApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgcmVzb3VyY2VzIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZXNvdXJjZXNCeVR5cGU8VD4oX3R5cGU6IG5ldyAoX2FyZ3M6IEdlbmVyYWwpID0+IFQpOiBTZXJpYWxpemFibGVSZXNvdXJjZVtdIHtcclxuICAgICAgbGV0IGZvdW5kOiBTZXJpYWxpemFibGVSZXNvdXJjZVtdID0gW107XHJcbiAgICAgIGZvciAobGV0IHJlc291cmNlSWQgaW4gUHJvamVjdC5yZXNvdXJjZXMpIHtcclxuICAgICAgICBsZXQgcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlID0gUHJvamVjdC5yZXNvdXJjZXNbcmVzb3VyY2VJZF07XHJcbiAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgX3R5cGUpXHJcbiAgICAgICAgICBmb3VuZC5wdXNoKHJlc291cmNlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZm91bmQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCByZXNvdXJjZXMgd2l0aCB0aGUgcmVxdWVzdGVkIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVzb3VyY2VzQnlOYW1lKF9uYW1lOiBzdHJpbmcpOiBTZXJpYWxpemFibGVSZXNvdXJjZVtdIHtcclxuICAgICAgbGV0IGZvdW5kOiBTZXJpYWxpemFibGVSZXNvdXJjZVtdID0gW107XHJcbiAgICAgIGZvciAobGV0IHJlc291cmNlSWQgaW4gUHJvamVjdC5yZXNvdXJjZXMpIHtcclxuICAgICAgICBsZXQgcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlID0gUHJvamVjdC5yZXNvdXJjZXNbcmVzb3VyY2VJZF07XHJcbiAgICAgICAgaWYgKHJlc291cmNlLm5hbWUgPT0gX25hbWUpXHJcbiAgICAgICAgICBmb3VuZC5wdXNoKHJlc291cmNlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZm91bmQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGUgYSB1c2VyIHJlYWRhYmxlIGFuZCB1bmlxdWUgaWQgdXNpbmcgdGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLCB0aGUgZGF0ZSBhbmQgcmFuZG9tIG51bWJlcnNcclxuICAgICAqIEBwYXJhbSBfcmVzb3VyY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUlkKF9yZXNvdXJjZTogU2VyaWFsaXphYmxlUmVzb3VyY2UpOiBzdHJpbmcge1xyXG4gICAgICAvLyBUT0RPOiBidWlsZCBpZCBhbmQgaW50ZWdyYXRlIGluZm8gZnJvbSByZXNvdXJjZSwgbm90IGp1c3QgZGF0ZVxyXG4gICAgICBsZXQgaWRSZXNvdXJjZTogc3RyaW5nO1xyXG4gICAgICBkb1xyXG4gICAgICAgIGlkUmVzb3VyY2UgPSBfcmVzb3VyY2UuY29uc3RydWN0b3IubmFtZSArIFwifFwiICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpICsgXCJ8XCIgKyBNYXRoLnJhbmRvbSgpLnRvUHJlY2lzaW9uKDUpLnN1YnN0cigyLCA1KTtcclxuICAgICAgd2hpbGUgKFByb2plY3QucmVzb3VyY2VzW2lkUmVzb3VyY2VdKTtcclxuICAgICAgcmV0dXJuIGlkUmVzb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0cywgaWYgYW4gb2JqZWN0IGlzIGEge0BsaW5rIFNlcmlhbGl6YWJsZVJlc291cmNlfVxyXG4gICAgICogQHBhcmFtIF9vYmplY3QgVGhlIG9iamVjdCB0byBleGFtaW5lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNSZXNvdXJjZShfb2JqZWN0OiBTZXJpYWxpemFibGUpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIChSZWZsZWN0Lmhhcyhfb2JqZWN0LCBcImlkUmVzb3VyY2VcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSByZXNvdXJjZSBzdG9yZWQgd2l0aCB0aGUgZ2l2ZW4gaWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZXRSZXNvdXJjZShfaWRSZXNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxTZXJpYWxpemFibGVSZXNvdXJjZT4ge1xyXG4gICAgICBsZXQgcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlID0gUHJvamVjdC5yZXNvdXJjZXNbX2lkUmVzb3VyY2VdO1xyXG4gICAgICBpZiAoIXJlc291cmNlKSB7XHJcbiAgICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBQcm9qZWN0LnNlcmlhbGl6YXRpb25bX2lkUmVzb3VyY2VdO1xyXG4gICAgICAgIGlmICghc2VyaWFsaXphdGlvbikge1xyXG4gICAgICAgICAgRGVidWcuZXJyb3IoXCJSZXNvdXJjZSBub3QgZm91bmRcIiwgX2lkUmVzb3VyY2UpO1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc291cmNlID0gYXdhaXQgUHJvamVjdC5kZXNlcmlhbGl6ZVJlc291cmNlKHNlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJlZ2lzdGVycyBhIHJlc291cmNlIGZyb20gYSB7QGxpbmsgTm9kZX0sIGNvcHlpbmcgdGhlIGNvbXBsZXRlIGdyYXBoIHN0YXJ0aW5nIHdpdGggaXRcclxuICAgICAqIEBwYXJhbSBfbm9kZSBBIG5vZGUgdG8gY3JlYXRlIHRoZSByZXNvdXJjZSBmcm9tXHJcbiAgICAgKiBAcGFyYW0gX3JlcGxhY2VXaXRoSW5zdGFuY2UgaWYgdHJ1ZSAoZGVmYXVsdCksIHRoZSBub2RlIHVzZWQgYXMgb3JpZ2luIGlzIHJlcGxhY2VkIGJ5IGEge0BsaW5rIEdyYXBoSW5zdGFuY2V9IG9mIHRoZSB7QGxpbmsgR3JhcGh9IGNyZWF0ZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyByZWdpc3RlckFzR3JhcGgoX25vZGU6IE5vZGUsIF9yZXBsYWNlV2l0aEluc3RhbmNlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8R3JhcGg+IHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBfbm9kZS5zZXJpYWxpemUoKTtcclxuICAgICAgbGV0IGdyYXBoOiBHcmFwaCA9IG5ldyBHcmFwaChfbm9kZS5uYW1lKTtcclxuICAgICAgYXdhaXQgZ3JhcGguZGVzZXJpYWxpemUoc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIFByb2plY3QucmVnaXN0ZXIoZ3JhcGgpO1xyXG5cclxuICAgICAgaWYgKF9yZXBsYWNlV2l0aEluc3RhbmNlICYmIF9ub2RlLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgbGV0IGluc3RhbmNlOiBHcmFwaEluc3RhbmNlID0gYXdhaXQgUHJvamVjdC5jcmVhdGVHcmFwaEluc3RhbmNlKGdyYXBoKTtcclxuICAgICAgICBfbm9kZS5nZXRQYXJlbnQoKS5yZXBsYWNlQ2hpbGQoX25vZGUsIGluc3RhbmNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGdyYXBoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHtAbGluayBHcmFwaEluc3RhbmNlfSBvZiB0aGUgZ2l2ZW4ge0BsaW5rIEdyYXBofSBcclxuICAgICAqIGFuZCBjb25uZWN0cyBpdCB0byB0aGUgZ3JhcGggZm9yIHN5bmNocm9uaXNhdGlvbiBvZiBtdXRhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVHcmFwaEluc3RhbmNlKF9ncmFwaDogR3JhcGgpOiBQcm9taXNlPEdyYXBoSW5zdGFuY2U+IHtcclxuICAgICAgbGV0IGluc3RhbmNlOiBHcmFwaEluc3RhbmNlID0gbmV3IEdyYXBoSW5zdGFuY2UoX2dyYXBoKTsgLy8gVE9ETzogY2xlYW51cCBzaW5jZSBjcmVhdGlvbiBtb3ZlZCBoZXJlXHJcbiAgICAgIGF3YWl0IGluc3RhbmNlLmNvbm5lY3RUb0dyYXBoKCk7XHJcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIHRoZSBnaXZlbiB7QGxpbmsgR3JhcGhJbnN0YW5jZX0gdG8gYmUgcmVzeW5jZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWdpc3RlckdyYXBoSW5zdGFuY2VGb3JSZXN5bmMoX2luc3RhbmNlOiBHcmFwaEluc3RhbmNlKTogdm9pZCB7XHJcbiAgICAgIGxldCBpbnN0YW5jZXM6IEdyYXBoSW5zdGFuY2VbXSA9IFByb2plY3QuZ3JhcGhJbnN0YW5jZXNUb1Jlc3luY1tfaW5zdGFuY2UuaWRTb3VyY2VdIHx8IFtdO1xyXG4gICAgICBpbnN0YW5jZXMucHVzaChfaW5zdGFuY2UpO1xyXG4gICAgICBQcm9qZWN0LmdyYXBoSW5zdGFuY2VzVG9SZXN5bmNbX2luc3RhbmNlLmlkU291cmNlXSA9IGluc3RhbmNlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3luYyBhbGwge0BsaW5rIEdyYXBoSW5zdGFuY2V9IHJlZ2lzdGVyZWQgdG8gdGhlIGdpdmVuIHtAbGluayBHcmFwaH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyByZXN5bmNHcmFwaEluc3RhbmNlcyhfZ3JhcGg6IEdyYXBoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBpbnN0YW5jZXM6IEdyYXBoSW5zdGFuY2VbXSA9IFByb2plY3QuZ3JhcGhJbnN0YW5jZXNUb1Jlc3luY1tfZ3JhcGguaWRSZXNvdXJjZV07XHJcbiAgICAgIGlmICghaW5zdGFuY2VzKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgZm9yIChsZXQgaW5zdGFuY2Ugb2YgaW5zdGFuY2VzKVxyXG4gICAgICAgIGF3YWl0IGluc3RhbmNlLmNvbm5lY3RUb0dyYXBoKCk7XHJcbiAgICAgIGRlbGV0ZSAoUHJvamVjdC5ncmFwaEluc3RhbmNlc1RvUmVzeW5jW19ncmFwaC5pZFJlc291cmNlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIHRvIHRoZSBsaXN0IG9mIHNjcmlwdC1uYW1lc3BhY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyU2NyaXB0TmFtZXNwYWNlKF9uYW1lc3BhY2U6IE9iamVjdCk6IHZvaWQge1xyXG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gU2VyaWFsaXplci5yZWdpc3Rlck5hbWVzcGFjZShfbmFtZXNwYWNlKTtcclxuICAgICAgaWYgKCFQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXNbbmFtZV0pXHJcbiAgICAgICAgUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzW25hbWVdID0gX25hbWVzcGFjZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFyIHRoZSBsaXN0IG9mIHNjcmlwdC1uYW1lc3BhY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyU2NyaXB0TmFtZXNwYWNlcygpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXMpIHtcclxuICAgICAgICBSZWZsZWN0LnNldCh3aW5kb3csIG5hbWUsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzW25hbWVdID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGRlbGV0ZSBQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXNbbmFtZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbGxlY3RzIGFsbCB7QGxpbmsgQ29tcG9uZW50U2NyaXB0fXMgcmVnaXN0ZXJlZCBpbiB7QGxpbmsgUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzfSBhbmQgcmV0dXJucyB0aGVtLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvbXBvbmVudFNjcmlwdHMoKTogQ29tcG9uZW50U2NyaXB0cyB7XHJcbiAgICAgIGxldCBjb21wb21lbnRzOiBDb21wb25lbnRTY3JpcHRzID0ge307XHJcbiAgICAgIGZvciAobGV0IG5hbWVzcGFjZSBpbiBQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXMpIHtcclxuICAgICAgICBjb21wb21lbnRzW25hbWVzcGFjZV0gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIFByb2plY3Quc2NyaXB0TmFtZXNwYWNlc1tuYW1lc3BhY2VdKSB7XHJcbiAgICAgICAgICBsZXQgc2NyaXB0OiBDb21wb25lbnRTY3JpcHQgPSBSZWZsZWN0LmdldChQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXNbbmFtZXNwYWNlXSwgbmFtZSk7XHJcbiAgICAgICAgICAvLyBVc2luZyBPYmplY3QuY3JlYXRlIGRvZXNuJ3QgY2FsbCB0aGUgY29uc3RydWN0b3IsIGJ1dCBpbnN0YW5jZW9mIGNhbiBiZSB1c2VkLiBNb3JlIGVsZWdhbnQgdGhhbiB0aGUgbG9vcCBhYm92ZSwgdGhvdWdoIG1heWJlIG5vdCBhcyBwZXJmb3JtYW50LiBcclxuXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgbzogR2VuZXJhbCA9IE9iamVjdC5jcmVhdGUoc2NyaXB0KTtcclxuICAgICAgICAgICAgaWYgKG8ucHJvdG90eXBlIGluc3RhbmNlb2YgQ29tcG9uZW50U2NyaXB0KVxyXG4gICAgICAgICAgICAgIGNvbXBvbWVudHNbbmFtZXNwYWNlXS5wdXNoKHNjcmlwdCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChfZSkgeyAvKiAqLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjb21wb21lbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgYSBzY3JpcHQgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBpbnRlZ3JhdGVzIGl0IGludG8gYSB7QGxpbmsgSFRNTFNjcmlwdEVsZW1lbnR9IGluIHRoZSB7QGxpbmsgZG9jdW1lbnQuaGVhZH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBsb2FkU2NyaXB0KF91cmw6IFJlcXVlc3RJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBzY3JpcHQ6IEhUTUxTY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcclxuICAgICAgc2NyaXB0LnR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiO1xyXG4gICAgICAvLyBzY3JpcHQudHlwZSA9IFwibW9kdWxlXCI7XHJcbiAgICAgIHNjcmlwdC5hc3luYyA9IGZhbHNlO1xyXG4gICAgICAvLyBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgaGFuZGxlTG9hZGVkU2NyaXB0KVxyXG4gICAgICBsZXQgaGVhZDogSFRNTEhlYWRFbGVtZW50ID0gZG9jdW1lbnQuaGVhZDtcclxuICAgICAgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG4gICAgICBEZWJ1Zy5sb2coXCJMb2FkaW5nOiBcIiwgX3VybCk7XHJcblxyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IF9yZXNvbHZlKCkpO1xyXG4gICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgRGVidWcuZXJyb3IoXCJMb2FkaW5nIHNjcmlwdFwiLCBfdXJsKTtcclxuICAgICAgICAgIF9yZWplY3QoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzY3JpcHQuc3JjID0gX3VybC50b1N0cmluZygpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWQge0BsaW5rIFJlc291cmNlc30gZnJvbSB0aGUgZ2l2ZW4gdXJsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZFJlc291cmNlcyhfdXJsOiBSZXF1ZXN0SW5mbyk6IFByb21pc2U8UmVzb3VyY2VzPiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZSA9IGF3YWl0IGZldGNoKF91cmwpO1xyXG4gICAgICBjb25zdCByZXNvdXJjZUZpbGVDb250ZW50OiBzdHJpbmcgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XHJcblxyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IFNlcmlhbGl6ZXIucGFyc2UocmVzb3VyY2VGaWxlQ29udGVudCk7XHJcbiAgICAgIGxldCByZWNvbnN0cnVjdGlvbjogUmVzb3VyY2VzID0gYXdhaXQgUHJvamVjdC5kZXNlcmlhbGl6ZShzZXJpYWxpemF0aW9uKTtcclxuICAgICAgUHJvamVjdC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5SRVNPVVJDRVNfTE9BREVELCB7IGRldGFpbDogeyB1cmw6IF91cmwsIHJlc291cmNlczogcmVjb25zdHJ1Y3Rpb24gfSB9KSk7XHJcbiAgICAgIHJldHVybiByZWNvbnN0cnVjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWQgYWxsIHJlc291cmNlcyBmcm9tIHRoZSB7QGxpbmsgZG9jdW1lbnQuaGVhZH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBsb2FkUmVzb3VyY2VzRnJvbUhUTUwoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGNvbnN0IGhlYWQ6IEhUTUxIZWFkRWxlbWVudCA9IGRvY3VtZW50LmhlYWQ7XHJcbiAgICAgIGxldCBsaW5rczogTm9kZUxpc3RPZjxIVE1MTGlua0VsZW1lbnQ+ID0gaGVhZC5xdWVyeVNlbGVjdG9yQWxsKFwibGlua1t0eXBlPXJlc291cmNlc11cIik7XHJcbiAgICAgIGZvciAobGV0IGxpbmsgb2YgbGlua3MpIHtcclxuICAgICAgICBsZXQgdXJsOiBSZXF1ZXN0SW5mbyA9IGxpbmsuZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xyXG4gICAgICAgIGF3YWl0IFByb2plY3QubG9hZFJlc291cmNlcyh1cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemUgYWxsIHJlc291cmNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uT2ZSZXNvdXJjZXMge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbk9mUmVzb3VyY2VzID0ge307XHJcbiAgICAgIGZvciAobGV0IGlkUmVzb3VyY2UgaW4gUHJvamVjdC5yZXNvdXJjZXMpIHtcclxuICAgICAgICBsZXQgcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlID0gUHJvamVjdC5yZXNvdXJjZXNbaWRSZXNvdXJjZV07XHJcbiAgICAgICAgaWYgKGlkUmVzb3VyY2UgIT0gcmVzb3VyY2UuaWRSZXNvdXJjZSlcclxuICAgICAgICAgIERlYnVnLmVycm9yKFwiUmVzb3VyY2UtaWQgbWlzbWF0Y2hcIiwgcmVzb3VyY2UpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25baWRSZXNvdXJjZV0gPSBTZXJpYWxpemVyLnNlcmlhbGl6ZShyZXNvdXJjZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgcmVzb3VyY2VzIGZyb20gYSBzZXJpYWxpemF0aW9uLCBkZWxldGluZyBhbGwgcmVzb3VyY2VzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZFxyXG4gICAgICogQHBhcmFtIF9zZXJpYWxpemF0aW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uT2ZSZXNvdXJjZXMpOiBQcm9taXNlPFJlc291cmNlcz4ge1xyXG4gICAgICBQcm9qZWN0LnNlcmlhbGl6YXRpb24gPSBfc2VyaWFsaXphdGlvbjtcclxuICAgICAgUHJvamVjdC5yZXNvdXJjZXMgPSB7fTtcclxuICAgICAgZm9yIChsZXQgaWRSZXNvdXJjZSBpbiBfc2VyaWFsaXphdGlvbikge1xyXG4gICAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gX3NlcmlhbGl6YXRpb25baWRSZXNvdXJjZV07XHJcbiAgICAgICAgbGV0IHJlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSA9IGF3YWl0IFByb2plY3QuZGVzZXJpYWxpemVSZXNvdXJjZShzZXJpYWxpemF0aW9uKTtcclxuICAgICAgICBpZiAocmVzb3VyY2UpXHJcbiAgICAgICAgICBQcm9qZWN0LnJlc291cmNlc1tpZFJlc291cmNlXSA9IHJlc291cmNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBQcm9qZWN0LnJlc291cmNlcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBkZXNlcmlhbGl6ZVJlc291cmNlKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGVSZXNvdXJjZT4ge1xyXG4gICAgICByZXR1cm4gPFByb21pc2U8U2VyaWFsaXphYmxlUmVzb3VyY2U+PlNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGQlgge1xyXG4gIC8qKlxyXG4gICAqIFJlYWRlciB0byByZWFkIGRhdGEgZnJvbSBhbiBhcnJheSBidWZmZXIgbW9yZSBjb252ZW5pZW50bHkuXHJcbiAgICogSXQgc2F2ZXMgYSBjdXJyZW50IG9mZnNldCB3aGljaCBpcyB1cGRhdGVkIHdoZW4gZGF0YSBpcyByZWFkIGR1ZSB0byBpdHMgYnl0ZWxlbmd0aC5cclxuICAgKiBkZXNwaXRlIGdldFNlcXVlbmNlIGl0IGlzIG1vc3RseSBhIGNvcHkgb2YgdGhlIHJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL3BpY29kZTcvYmluYXJ5LXJlYWRlclxyXG4gICAqIEBhdXRob3IgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQnVmZmVyUmVhZGVyIHtcclxuICAgIHB1YmxpYyBvZmZzZXQ6IG51bWJlcjtcclxuICAgIHB1YmxpYyByZWFkb25seSB2aWV3OiBEYXRhVmlldztcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2J1ZmZlcjogQXJyYXlCdWZmZXIpIHtcclxuICAgICAgdGhpcy52aWV3ID0gbmV3IERhdGFWaWV3KF9idWZmZXIpO1xyXG4gICAgICB0aGlzLm9mZnNldCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYXIoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmdldFVpbnQ4KF9vZmZzZXQpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Qm9vbChfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRVaW50OChfb2Zmc2V0KSAhPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRVaW50OChfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDE7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0VWludDgoX29mZnNldCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFVpbnQzMihfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDQ7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0VWludDMyKF9vZmZzZXQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRVaW50NjQoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBiaWdpbnQge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyA4O1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldEJpZ1VpbnQ2NChfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SW50MTYoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyAyO1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldEludDE2KF9vZmZzZXQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbnQzMihfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDQ7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0SW50MzIoX29mZnNldCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEludDY0KF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogYmlnaW50IHtcclxuICAgICAgdGhpcy5vZmZzZXQgPSBfb2Zmc2V0ICsgODtcclxuICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRCaWdJbnQ2NChfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RmxvYXQzMihfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDQ7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQzMihfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RmxvYXQ2NChfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDg7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQ2NChfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U3RyaW5nKF9sZW5ndGg6IG51bWJlciwgX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi50aGlzLmdldFNlcXVlbmNlKHRoaXMuZ2V0VWludDgsIF9sZW5ndGgsIF9vZmZzZXQpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgKmdldFNlcXVlbmNlPFQgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KF9nZXR0ZXI6ICgpID0+IFQsIF9sZW5ndGg6IG51bWJlciwgX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBHZW5lcmF0b3I8VD4ge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQ7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB5aWVsZCBfZ2V0dGVyLmNhbGwodGhpcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRkJYIHtcclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgdG8gcmVwcmVzZW50IGZieCBmaWxlcyBjb250YWluaW5nIGl0cyBkb2N1bWVudHMsIGRlZmluaXRpb25zLCBvYmplY3RzIGFuZCBjb25uZWN0aW9ucy5cclxuICAgKiBJdHMgb2JqZWN0cyBhcmUgZGV2aWRlZCBpbiBhbGwgYW5kIHRoZSBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzLlxyXG4gICAqIEBhdXRob3IgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEZCWCB7XHJcbiAgICBkb2N1bWVudHM6IERvY3VtZW50W107XHJcbiAgICBkZWZpbml0aW9ucz86IERlZmluaXRpb25zO1xyXG4gICAgb2JqZWN0czoge1xyXG4gICAgICBhbGw6IE9iamVjdFtdO1xyXG4gICAgICBtb2RlbHM6IE1vZGVsW107XHJcbiAgICAgIGdlb21ldHJpZXM6IEdlb21ldHJ5W107XHJcbiAgICAgIHBvc2VzOiBPYmplY3RbXTtcclxuICAgICAgbWF0ZXJpYWxzOiBNYXRlcmlhbFtdO1xyXG4gICAgICB0ZXh0dXJlczogVGV4dHVyZVtdO1xyXG4gICAgICBhbmltU3RhY2tzOiBPYmplY3RbXTtcclxuICAgIH07XHJcbiAgICBjb25uZWN0aW9uczogQ29ubmVjdGlvbltdO1xyXG4gIH1cclxuXHJcbiAgaW50ZXJmYWNlIE9iamVjdEJhc2Uge1xyXG4gICAgdWlkOiBudW1iZXI7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICB0eXBlPzogc3RyaW5nO1xyXG4gICAgc3VidHlwZT86IHN0cmluZztcclxuICAgIGNoaWxkcmVuPzogT2JqZWN0W107XHJcbiAgICBwYXJlbnRzPzogT2JqZWN0W107XHJcblxyXG4gICAgbG9hZGVkOiBib29sZWFuO1xyXG4gICAgbG9hZDogKCkgPT4gT2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIHRvIHJlcHJlc2VudCBmYngtb2JqZWN0cy5cclxuICAgKiBBbGwgZmllbGRzIG90aGVyIHRoYW4gdWlkLCBuYW1lLCB0eXBlLCBzdWJ0eXBlLCBjaGlsZHJlbiBhbmQgcGFyZW50cyBhcmUgbG9hZGVkIHdpdGggdGhlIGxvYWQtbWV0aG9kLlxyXG4gICAqIEVhY2ggb2JqZWN0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhbiBleHBsaWNpdCBmYnggb2JqZWN0IHR5cGUgZGVmaW5lZCBpbiBGdWRnZUNvcmUuRkJYLiBFeHBsaWNpdCB0eXBlcyBoYXZlIGJlZW4gZGVmaW5lZFxyXG4gICAqIHdpdGggdGhlIGhlbHAgb2YgZm9sbG93aW5nIHJlZmVyZW5jZTpcclxuICAgKiBodHRwczovL2FyY2hpdmUuYmxlbmRlci5vcmcvd2lraS9pbmRleC5waHAvVXNlcjpNb250MjkvRm91bmRhdGlvbi9GQlhfRmlsZV9TdHJ1Y3R1cmUvI1NvbWVfU3BlY2lmaWNfUHJvcGVydHlfVHlwZXNcclxuICAgKiBAYXV0aG9yIE1hdHRoaWFzIFJvbWluZywgSEZVLCAyMDIzXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0IGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBbbmFtZTogc3RyaW5nXTogTm9kZVByb3BlcnR5IHwgeyBbbmFtZTogc3RyaW5nXTogTm9kZVByb3BlcnR5IH0gfCBQcm9wZXJ0eTcwIHwgT2JqZWN0IHwgT2JqZWN0W10gfCAoKCkgPT4gT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnQgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIFNvdXJjZU9iamVjdD86IHVuZGVmaW5lZDtcclxuICAgIEFjdGl2ZUFuaW1TdGFja05hbWU/OiBzdHJpbmc7XHJcbiAgICBSb290Tm9kZT86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTm9kZUF0dHJpYnV0ZSBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgVHlwZUZsYWdzPzogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBHZW9tZXRyeSBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgR2VvbWV0cnlWZXJzaW9uPzogbnVtYmVyO1xyXG4gICAgVmVydGljZXM/OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBQb2x5Z29uVmVydGV4SW5kZXg/OiBJbnQzMkFycmF5O1xyXG4gICAgTGF5ZXJFbGVtZW50Tm9ybWFsPzogTGF5ZXJFbGVtZW50Tm9ybWFsO1xyXG4gICAgTGF5ZXJFbGVtZW50VVY/OiBMYXllckVsZW1lbnRVVjsgLy8gfCBMYXllckVsZW1lbnRVVltdOyAvLyBUT0RPOiBtaWdodCBuZWVkIHRvIHJlYWRkIHRoaXNcclxuICAgIExheWVyRWxlbWVudE1hdGVyaWFsPzogTGF5ZXJFbGVtZW50TWF0ZXJpYWw7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIE1vZGVsIGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBWZXJzaW9uPzogbnVtYmVyO1xyXG4gICAgTGNsVHJhbnNsYXRpb24/OiBGdWRnZUNvcmUuVmVjdG9yMyB8IEFuaW1DdXJ2ZU5vZGU7XHJcbiAgICBMY2xSb3RhdGlvbj86IEZ1ZGdlQ29yZS5WZWN0b3IzIHwgQW5pbUN1cnZlTm9kZTtcclxuICAgIExjbFNjYWxpbmc/OiBGdWRnZUNvcmUuVmVjdG9yMyB8IEFuaW1DdXJ2ZU5vZGU7XHJcbiAgICBQcmVSb3RhdGlvbj86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgUG9zdFJvdGF0aW9uPzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBTY2FsaW5nT2Zmc2V0PzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBTY2FsaW5nUGl2b3Q/OiBGdWRnZUNvcmUuVmVjdG9yMztcclxuICAgIFJvdGF0aW9uT2Zmc2V0PzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBSb3RhdGlvblBpdm90PzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBJbmhlcml0VHlwZT86IG51bWJlcjtcclxuICAgIEV1bGVyT3JkZXI/OiBzdHJpbmc7XHJcbiAgICBjdXJyZW50VVZTZXQ/OiBzdHJpbmc7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsIGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBWZXJzaW9uPzogbnVtYmVyO1xyXG4gICAgU2hhZGluZ01vZGVsPzogc3RyaW5nO1xyXG5cclxuICAgIERpZmZ1c2U/OiBGdWRnZUNvcmUuVmVjdG9yMztcclxuICAgIERpZmZ1c2VDb2xvcj86IEZ1ZGdlQ29yZS5WZWN0b3IzIHwgVGV4dHVyZTtcclxuICAgIERpZmZ1c2VGYWN0b3I/OiBudW1iZXI7XHJcblxyXG4gICAgQW1iaWVudD86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgQW1iaWVudENvbG9yPzogRnVkZ2VDb3JlLlZlY3RvcjMgfCBUZXh0dXJlO1xyXG5cclxuICAgIFNoaW5pbmVzcz86IG51bWJlcjtcclxuICAgIFNoaW5pbmVzc0V4cG9uZW50PzogRnVkZ2VDb3JlLlZlY3RvcjMgfCBUZXh0dXJlO1xyXG5cclxuICAgIFNwZWN1bGFyPzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBTcGVjdWxhckNvbG9yPzogRnVkZ2VDb3JlLlZlY3RvcjMgfCBUZXh0dXJlO1xyXG4gICAgU3BlY3VsYXJGYWN0b3I/OiBudW1iZXI7XHJcblxyXG4gICAgUmVmbGVjdGl2aXR5PzogbnVtYmVyO1xyXG4gICAgUmVmbGVjdGlvbkZhY3Rvcj86IG51bWJlcjtcclxuXHJcbiAgICBPcGFjaXR5PzogbnVtYmVyO1xyXG4gICAgVHJhbnNwYXJlbmN5RmFjdG9yPzogbnVtYmVyO1xyXG5cclxuICAgIEVtaXNzaXZlPzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBOb3JtYWxNYXA/OiBUZXh0dXJlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBEZWZvcm1lciBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgVmVyc2lvbj86IG51bWJlcjtcclxuICAgIFNraW5uaW5nVHlwZT86IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU3ViRGVmb3JtZXIgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIFZlcnNpb24/OiBudW1iZXI7XHJcbiAgICBUcmFuc2Zvcm0/OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBUcmFuc2Zvcm1MaW5rPzogRmxvYXQzMkFycmF5O1xyXG4gICAgSW5kZXhlcz86IFVpbnQxNkFycmF5O1xyXG4gICAgV2VpZ2h0cz86IEZsb2F0MzJBcnJheTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGV4dHVyZSBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgRmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgICBSZWxhdGl2ZUZpbGVuYW1lPzogc3RyaW5nO1xyXG4gICAgTW9kZWxVVlNjYWxpbmc/OiBudW1iZXI7XHJcbiAgICBNb2RlbFVWVHJhbnNsYXRpb24/OiBudW1iZXI7XHJcbiAgICBVVlNldD86IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgVmlkZW8gZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIEZpbGVOYW1lPzogc3RyaW5nO1xyXG4gICAgUmVsYXRpdmVGaWxlbmFtZT86IHN0cmluZztcclxuICAgIFVzZU1pcE1hcD86IG51bWJlcjtcclxuICAgIENvbnRlbnQ/OiBVaW50OEFycmF5O1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltQ3VydmVOb2RlIGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBkWD86IG51bWJlciB8IEFuaW1DdXJ2ZTtcclxuICAgIGRZPzogbnVtYmVyIHwgQW5pbUN1cnZlO1xyXG4gICAgZFo/OiBudW1iZXIgfCBBbmltQ3VydmU7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1DdXJ2ZSBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgS2V5VmVyPzogbnVtYmVyO1xyXG4gICAgRGVmYXVsdD86IG51bWJlcjtcclxuICAgIEtleVRpbWU/OiBCaWdJbnQ2NEFycmF5O1xyXG4gICAgS2V5VmFsdWVGbG9hdD86IEZsb2F0MzJBcnJheTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJFbGVtZW50IHtcclxuICAgIE5hbWU6IHN0cmluZztcclxuICAgIFZlcnNpb246IG51bWJlcjtcclxuICAgIE1hcHBpbmdJbmZvcm1hdGlvblR5cGU6IHN0cmluZztcclxuICAgIFJlZmVyZW5jZUluZm9ybWF0aW9uVHlwZTogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBMYXllckVsZW1lbnROb3JtYWwgZXh0ZW5kcyBMYXllckVsZW1lbnQge1xyXG4gICAgTm9ybWFsczogRmxvYXQzMkFycmF5O1xyXG4gICAgTm9ybWFsc1c6IEZsb2F0MzJBcnJheTtcclxuICAgIE5vcm1hbHNJbmRleD86IFVpbnQxNkFycmF5OyAvLyBUT0RPOiBmaW5kIGFuIEZCWCBmaWxlIHdoaWNoIHVzZXMgbm9ybWFscyBpbmRleFxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBMYXllckVsZW1lbnRVViBleHRlbmRzIExheWVyRWxlbWVudCB7XHJcbiAgICBVVj86IEZsb2F0MzJBcnJheTtcclxuICAgIFVWSW5kZXg/OiBVaW50MTZBcnJheTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJFbGVtZW50TWF0ZXJpYWwgZXh0ZW5kcyBMYXllckVsZW1lbnQge1xyXG4gICAgTWF0ZXJpYWxzPzogbnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gTUFQUElOR19JTkZPUk1BVElPTl9UWVBFIHtcclxuICAgIEJZX1ZFUlRFWCwgQllfUE9MWUdPTiwgQllfUE9MWUdPTl9WRVJURVgsIEJZX0VER0UsIEFMTF9TQU1FXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBSRUZFUkVOQ0VfSU5GT1JNQVRJT05fVFlQRSB7XHJcbiAgICBESVJFQ1QsIElOREVYX1RPX0RJUkVDVFxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uIHtcclxuICAgIHBhcmVudFVJRDogbnVtYmVyO1xyXG4gICAgY2hpbGRVSUQ6IG51bWJlcjtcclxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBEZWZpbml0aW9ucyB7XHJcbiAgICB2ZXJzaW9uOiBudW1iZXI7XHJcbiAgICBvYmplY3RUeXBlczogT2JqZWN0VHlwZVtdO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBPYmplY3RUeXBlIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGNvdW50OiBudW1iZXI7XHJcbiAgICBwcm9wZXJ0eVRlbXBsYXRlOiBQcm9wZXJ0eVRlbXBsYXRlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eVRlbXBsYXRlIHtcclxuICAgIFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IFByb3BlcnR5NzA7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQXNzZXQgbG9hZGVyIGZvciBGaWxtYm94IGZpbGVzLlxyXG4gICAqIEBhdXRob3IgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRkJYTG9hZGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGxvYWRlcnM6IHsgW3VyaTogc3RyaW5nXTogRkJYTG9hZGVyIH07XHJcblxyXG4gICAgc3RhdGljICNkZWZhdWx0TWF0ZXJpYWw6IE1hdGVyaWFsO1xyXG4gICAgc3RhdGljICNkZWZhdWx0U2tpbk1hdGVyaWFsOiBNYXRlcmlhbDtcclxuXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmJ4OiBGQlguRkJYO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG5vZGVzOiBGQlguTm9kZVtdO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHVyaTogc3RyaW5nO1xyXG5cclxuICAgICNzY2VuZXM6IEdyYXBoW107XHJcbiAgICAjbm9kZXM6IE5vZGVbXTtcclxuICAgICNtZXNoZXM6IE1lc2hGQlhbXTtcclxuICAgICNtYXRlcmlhbHM6IE1hdGVyaWFsW107XHJcbiAgICAjc2tpbk1hdGVyaWFsczogTWF0ZXJpYWxbXSA9IFtdO1xyXG4gICAgI3RleHR1cmVzOiBUZXh0dXJlW107XHJcbiAgICAjc2tlbGV0b25zOiBDb21wb25lbnRTa2VsZXRvbltdO1xyXG4gICAgI2FuaW1hdGlvbnM6IEFuaW1hdGlvbltdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYnVmZmVyOiBBcnJheUJ1ZmZlciwgX3VyaTogc3RyaW5nKSB7XHJcbiAgICAgIHRoaXMudXJpID0gX3VyaTtcclxuICAgICAgdGhpcy5ub2RlcyA9IEZCWC5wYXJzZU5vZGVzRnJvbUJpbmFyeShfYnVmZmVyKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5ub2Rlcyk7XHJcbiAgICAgIHRoaXMuZmJ4ID0gRkJYLmxvYWRGcm9tTm9kZXModGhpcy5ub2Rlcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZmJ4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdE1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRNYXRlcmlhbCB8fCAodGhpcy4jZGVmYXVsdE1hdGVyaWFsID1cclxuICAgICAgICBuZXcgTWF0ZXJpYWwoXCJGQlhEZWZhdWx0TWF0ZXJpYWxcIiwgU2hhZGVyR291cmF1ZCwgbmV3IENvYXRSZW1pc3NpdmUoQ29sb3IuQ1NTKFwid2hpdGVcIikpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCBkZWZhdWx0U2tpbk1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgfHwgKHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgPVxyXG4gICAgICAgIG5ldyBNYXRlcmlhbChcIkZCWERlZmF1bHRTa2luTWF0ZXJpYWxcIiwgU2hhZGVyR291cmF1ZFNraW4sIG5ldyBDb2F0UmVtaXNzaXZlKENvbG9yLkNTUyhcIndoaXRlXCIpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIExPQUQoX3VyaTogc3RyaW5nKTogUHJvbWlzZTxGQlhMb2FkZXI+IHtcclxuICAgICAgaWYgKCF0aGlzLmxvYWRlcnMpXHJcbiAgICAgICAgdGhpcy5sb2FkZXJzID0ge307XHJcbiAgICAgIGlmICghdGhpcy5sb2FkZXJzW191cmldKSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goX3VyaSk7XHJcbiAgICAgICAgY29uc3QgYmluYXJ5OiBBcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkZXJzW191cmldID0gbmV3IEZCWExvYWRlcihiaW5hcnksIF91cmkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRlcnNbX3VyaV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFNjZW5lKF9pbmRleDogbnVtYmVyID0gMCk6IFByb21pc2U8R3JhcGg+IHtcclxuICAgICAgaWYgKCF0aGlzLiNzY2VuZXMpXHJcbiAgICAgICAgdGhpcy4jc2NlbmVzID0gW107XHJcbiAgICAgIGlmICghdGhpcy4jc2NlbmVzW19pbmRleF0pIHtcclxuICAgICAgICBjb25zdCBkb2N1bWVudEZCWDogRkJYLkRvY3VtZW50ID0gdGhpcy5mYnguZG9jdW1lbnRzW19pbmRleF0ubG9hZCgpO1xyXG4gICAgICAgIGNvbnN0IHNjZW5lOiBHcmFwaCA9IG5ldyBHcmFwaChkb2N1bWVudEZCWC5uYW1lKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkRkJYIG9mIGRvY3VtZW50RkJYLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICBpZiAoY2hpbGRGQlgudHlwZSA9PSBcIk1vZGVsXCIpIHtcclxuICAgICAgICAgICAgc2NlbmUuYWRkQ2hpbGQoYXdhaXQgdGhpcy5nZXROb2RlKHRoaXMuZmJ4Lm9iamVjdHMubW9kZWxzLmluZGV4T2YoY2hpbGRGQlgpKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5mYngub2JqZWN0cy5hbmltU3RhY2tzICYmIHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBhbmltYXRpb246IEFuaW1hdGlvbiA9IGF3YWl0IHRoaXMuZ2V0QW5pbWF0aW9uKGRvY3VtZW50RkJYLkFjdGl2ZUFuaW1TdGFja05hbWUubGVuZ3RoID4gMCA/XHJcbiAgICAgICAgICAgIHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5maW5kSW5kZXgoX2FuaW1TdGFjayA9PiBfYW5pbVN0YWNrLm5hbWUgPT0gZG9jdW1lbnRGQlguQWN0aXZlQW5pbVN0YWNrTmFtZSkgOiAwKTtcclxuICAgICAgICAgIGlmIChhbmltYXRpb24pXHJcbiAgICAgICAgICAgIHNjZW5lLmFkZENvbXBvbmVudChuZXcgQ29tcG9uZW50QW5pbWF0b3IoYW5pbWF0aW9uKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHNrZWxldG9uIG9mIHRoaXMuI3NrZWxldG9ucylcclxuICAgICAgICAgIHNjZW5lLmFkZENvbXBvbmVudChza2VsZXRvbik7XHJcblxyXG4gICAgICAgIFByb2plY3QucmVnaXN0ZXIoc2NlbmUpO1xyXG4gICAgICAgIHRoaXMuI3NjZW5lc1tfaW5kZXhdID0gc2NlbmU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI3NjZW5lc1tfaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXROb2RlKF9pbmRleDogbnVtYmVyKTogUHJvbWlzZTxOb2RlPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbm9kZXMpXHJcbiAgICAgICAgdGhpcy4jbm9kZXMgPSBbXTtcclxuICAgICAgaWYgKCF0aGlzLiNub2Rlc1tfaW5kZXhdKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIG5vZGUgd2l0aCB0cmFuc2Zvcm1cclxuICAgICAgICBjb25zdCBtb2RlbEZCWDogRkJYLk1vZGVsID0gdGhpcy5mYngub2JqZWN0cy5tb2RlbHNbX2luZGV4XS5sb2FkKCk7XHJcbiAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IG5ldyBOb2RlKG1vZGVsRkJYLm5hbWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVUcmFuc2Zvcm0obW9kZWxGQlgsIG5vZGUpO1xyXG4gICAgICAgIHRoaXMuI25vZGVzW19pbmRleF0gPSBub2RlO1xyXG5cclxuICAgICAgICAvLyBhdHRhY2ggY2hpbGRyZW4gYW5kIGNvbXBvbmVudHNcclxuICAgICAgICBpZiAobW9kZWxGQlguY2hpbGRyZW4pIGZvciAoY29uc3QgY2hpbGRGQlggb2YgbW9kZWxGQlguY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGlmIChjaGlsZEZCWC50eXBlID09IFwiTW9kZWxcIikge1xyXG4gICAgICAgICAgICBub2RlLmFkZENoaWxkKGF3YWl0IHRoaXMuZ2V0Tm9kZSh0aGlzLmZieC5vYmplY3RzLm1vZGVscy5pbmRleE9mKGNoaWxkRkJYKSkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGlsZEZCWC50eXBlID09IFwiR2VvbWV0cnlcIikge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNoOiBNZXNoRkJYID0gYXdhaXQgdGhpcy5nZXRNZXNoKHRoaXMuZmJ4Lm9iamVjdHMuZ2VvbWV0cmllcy5pbmRleE9mKGNoaWxkRkJYKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSBuZXcgQ29tcG9uZW50TWVzaChtZXNoKTtcclxuICAgICAgICAgICAgbm9kZS5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudE1hdGVyaWFsKEZCWExvYWRlci5kZWZhdWx0TWF0ZXJpYWwpKTtcclxuICAgICAgICAgICAgaWYgKG1lc2gucmVuZGVyTWVzaC5ib25lcykge1xyXG4gICAgICAgICAgICAgIGNtcE1lc2guc2tlbGV0b24gPSBhd2FpdCB0aGlzLmdldFNrZWxldG9uKGNoaWxkRkJYLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdKTtcclxuICAgICAgICAgICAgICAvLyBmb3IgKGNvbnN0IHN1YkRlZm9ybWVyRkJYIG9mIGNoaWxkRkJYLmNoaWxkcmVuWzBdLmNoaWxkcmVuIGFzIEZCWC5TdWJEZWZvcm1lcltdKSB7XHJcbiAgICAgICAgICAgICAgLy8gICBjb25zdCBib25lOiBOb2RlID0gY21wTWVzaC5za2VsZXRvbi5ib25lc1tzdWJEZWZvcm1lckZCWC5jaGlsZHJlblswXS5uYW1lXTtcclxuICAgICAgICAgICAgICAvLyAgIGJvbmUubXR4TG9jYWwuc2V0KHN1YkRlZm9ybWVyRkJYLlRyYW5zZm9ybUxpbmspO1xyXG4gICAgICAgICAgICAgIC8vICAgaWYgKGJvbmUuZ2V0UGFyZW50KCkpXHJcbiAgICAgICAgICAgICAgLy8gICAgIGJvbmUubXR4TG9jYWwubXVsdGlwbHkoYm9uZS5nZXRQYXJlbnQoKS5tdHhXb3JsZEludmVyc2UpO1xyXG4gICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICBub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCkubWF0ZXJpYWwgPSBGQlhMb2FkZXIuZGVmYXVsdFNraW5NYXRlcmlhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlLmFkZENvbXBvbmVudChjbXBNZXNoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRGQlgudHlwZSA9PSBcIk1hdGVyaWFsXCIpIHtcclxuICAgICAgICAgICAgLy8gVE9ETzogYWRkaXRpb25hbCBza2luIG1hdGVyaWFscyBnZXQgY3JlYXRlZCBoZXJlLCBjaGVjayBpZiB0aGUgb3JpZ2luYWwgbWF0ZXJpYWwgaXMgc3RpbGwgbmVlZGVkXHJcbiAgICAgICAgICAgIGNvbnN0IGlNYXRlcmlhbDogbnVtYmVyID0gdGhpcy5mYngub2JqZWN0cy5tYXRlcmlhbHMuaW5kZXhPZihjaGlsZEZCWCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IGF3YWl0IHRoaXMuZ2V0TWF0ZXJpYWwoaU1hdGVyaWFsKTtcclxuICAgICAgICAgICAgbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpLm1hdGVyaWFsID0gbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCkubWVzaC5yZW5kZXJNZXNoLmJvbmVzID9cclxuICAgICAgICAgICAgICB0aGlzLiNza2luTWF0ZXJpYWxzW2lNYXRlcmlhbF0gfHwgKHRoaXMuI3NraW5NYXRlcmlhbHNbaU1hdGVyaWFsXSA9IG5ldyBNYXRlcmlhbChcclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5nZXRTaGFkZXIoKSA9PSBTaGFkZXJQaG9uZyA/XHJcbiAgICAgICAgICAgICAgICAgIFNoYWRlclBob25nU2tpbiA6XHJcbiAgICAgICAgICAgICAgICAgIFNoYWRlclBob25nVGV4dHVyZWRTa2luLFxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuY29hdFxyXG4gICAgICAgICAgICAgICkpIDpcclxuICAgICAgICAgICAgICBtYXRlcmlhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGVzW19pbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPE1lc2hGQlg+IHtcclxuICAgICAgaWYgKCF0aGlzLiNtZXNoZXMpXHJcbiAgICAgICAgdGhpcy4jbWVzaGVzID0gW107XHJcbiAgICAgIGlmICghdGhpcy4jbWVzaGVzW19pbmRleF0pXHJcbiAgICAgICAgdGhpcy4jbWVzaGVzW19pbmRleF0gPSBhd2FpdCBuZXcgTWVzaEZCWCgpLmxvYWQodGhpcy51cmksIF9pbmRleCk7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtZXNoZXNbX2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0TWF0ZXJpYWwoX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPE1hdGVyaWFsPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbWF0ZXJpYWxzKVxyXG4gICAgICAgIHRoaXMuI21hdGVyaWFscyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI21hdGVyaWFsc1tfaW5kZXhdKSB7XHJcbiAgICAgICAgY29uc3QgbWF0ZXJpYWxGQlg6IEZCWC5NYXRlcmlhbCA9IHRoaXMuZmJ4Lm9iamVjdHMubWF0ZXJpYWxzW19pbmRleF0ubG9hZCgpO1xyXG4gICAgICAgIGlmICghKG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciBpbnN0YW5jZW9mIFZlY3RvcjMpKVxyXG4gICAgICAgICAgbWF0ZXJpYWxGQlguRGlmZnVzZUNvbG9yPy5jaGlsZHJlblswXS5sb2FkKCk7XHJcbiAgICAgICAgLy8gRkJYIHN1cHBvcnRzIGxhbWJlcnQgYW5kIHBob25nIHNoYWRpbmcsIGVpdGhlciB3YXkgZnVkZ2UgaGFzIG5vIGxhbWJlcnQgc2hhZGVyIHNvIHdlIGFsd2F5cyB1c2UgcGhvbmcuXHJcbiAgICAgICAgLy8gSW4gRGlmZnVzZUNvbG9yIHRoZSB0ZXh0dXJlIG9mIHRoZSBtYXRlcmlhbCBjb2xvciBpcyBzdG9yZWQsIGlmIGl0J3MgZGVmaW5lZCB3ZSB1c2UgYSB0ZXh0dXJlIHNoYWRlci5cclxuICAgICAgICAvLyBUT0RPOiBtYXRlcmlhbEZCWCBhbHNvIGNvbnRhaW5zIGFkZGl0aW9uYWwgdmFsdWVzIGxpa2Ugc2hpbmluZXNzIGFuZCByZWZsZWN0aXZpdHkgKGFuZCBvdGhlcnMpIHdoaWNoIGFyZSBub3Qgc3VwcHBvcnRlZC5cclxuICAgICAgICB0aGlzLiNtYXRlcmlhbHNbX2luZGV4XSA9IG5ldyBNYXRlcmlhbChcclxuICAgICAgICAgIG1hdGVyaWFsRkJYLm5hbWUsXHJcbiAgICAgICAgICBtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IgJiYgIShtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IgaW5zdGFuY2VvZiBWZWN0b3IzKSA/XHJcbiAgICAgICAgICAgIFNoYWRlclBob25nVGV4dHVyZWQgOlxyXG4gICAgICAgICAgICBTaGFkZXJQaG9uZyxcclxuICAgICAgICAgIG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciAmJiAhKG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciBpbnN0YW5jZW9mIFZlY3RvcjMpID9cclxuICAgICAgICAgICAgbmV3IENvYXRSZW1pc3NpdmVUZXh0dXJlZChcclxuICAgICAgICAgICAgICBuZXcgQ29sb3IoLi4ubWF0ZXJpYWxGQlguRGlmZnVzZS5nZXQoKSksXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKHRoaXMuZmJ4Lm9iamVjdHMudGV4dHVyZXMuaW5kZXhPZihtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IpKSxcclxuICAgICAgICAgICAgICBtYXRlcmlhbEZCWC5EaWZmdXNlRmFjdG9yID8/IDEsXHJcbiAgICAgICAgICAgICAgbWF0ZXJpYWxGQlguU3BlY3VsYXJGYWN0b3IgPz8gYXZlcmFnZShtYXRlcmlhbEZCWC5TcGVjdWxhcj8uZ2V0KCkpID8/IDBcclxuICAgICAgICAgICAgKSA6XHJcbiAgICAgICAgICAgIG5ldyBDb2F0UmVtaXNzaXZlKFxyXG4gICAgICAgICAgICAgIG5ldyBDb2xvciguLi4obWF0ZXJpYWxGQlguRGlmZnVzZUNvbG9yIGFzIFZlY3RvcjMgPz8gbWF0ZXJpYWxGQlguRGlmZnVzZSkuZ2V0KCkpLFxyXG4gICAgICAgICAgICAgIG1hdGVyaWFsRkJYLkRpZmZ1c2VGYWN0b3IgPz8gMSxcclxuICAgICAgICAgICAgICBtYXRlcmlhbEZCWC5TcGVjdWxhckZhY3RvciA/PyBhdmVyYWdlKG1hdGVyaWFsRkJYLlNwZWN1bGFyPy5nZXQoKSkgPz8gMFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jbWF0ZXJpYWxzW19pbmRleF07XHJcblxyXG4gICAgICBmdW5jdGlvbiBhdmVyYWdlKF9hcnJheTogRmxvYXQzMkFycmF5KTogbnVtYmVyIHsgLy8gVE9ETzogc3BlY3VsYXIgZmFjdG9yIHZlY3RvciAodG9nZXRoZXIgd2l0aCBzcGVjdWxhciBjb2xvciB0ZXh0dXJlKSBpcyBub3Qgc3VwcG9ydGVkIHNvIHdlIHVzZSB0aGUgYXZlcmFnZSBvZiB0aGUgdmVjdG9yIHRvIGFwcHJveGltYXRlIGEgc2luZ3VsYXIgc3BlY3VsYXIgZmFjdG9yLlxyXG4gICAgICAgIGlmIChfYXJyYXkpXHJcbiAgICAgICAgICByZXR1cm4gX2FycmF5LnJlZHVjZSgoX2EsIF9iKSA9PiBfYSArIF9iKSAvIF9hcnJheS5sZW5ndGg7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRUZXh0dXJlKF9pbmRleDogbnVtYmVyKTogUHJvbWlzZTxUZXh0dXJlPiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuI3RleHR1cmVzKVxyXG4gICAgICAgICAgdGhpcy4jdGV4dHVyZXMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy4jdGV4dHVyZXNbX2luZGV4XSlcclxuICAgICAgICAgIHJldHVybiBfcmVzb2x2ZSh0aGlzLiN0ZXh0dXJlc1tfaW5kZXhdKTtcclxuXHJcbiAgICAgICAgY29uc3QgdmlkZW9GQlg6IEZCWC5WaWRlbyA9IHRoaXMuZmJ4Lm9iamVjdHMudGV4dHVyZXNbX2luZGV4XS5jaGlsZHJlblswXTtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlOiBUZXh0dXJlSW1hZ2UgPSBuZXcgVGV4dHVyZUltYWdlKCk7XHJcbiAgICAgICAgdGV4dHVyZS5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICAgIHRleHR1cmUuaW1hZ2Uub25sb2FkID0gKCkgPT4gX3Jlc29sdmUodGV4dHVyZSk7XHJcbiAgICAgICAgdGV4dHVyZS5pbWFnZS5vbmVycm9yID0gX3JlamVjdDtcclxuICAgICAgICB0ZXh0dXJlLmltYWdlLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3ZpZGVvRkJYLkNvbnRlbnRdLCB7IHR5cGU6IFwiaW1hZ2UvcG5nXCIgfSkpO1xyXG4gICAgICAgIHRoaXMuI3RleHR1cmVzW19pbmRleF0gPSB0ZXh0dXJlO1xyXG4gICAgICAgIC8vIFRPRE86IGdldCBhbmQgc2V0IG1pcG1hcCBpbmZvcm1hdGlvbiA/Pz9cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvYmxlbTogbWVocmVyZSBEZWZvcm1lciB2ZXJ3ZWlzZW4gYXVmIGRhcyBzZWxiZSBTa2VsZXR0IGFiZXIgbnV0emVuIGRhYmVpIG5pY2h0IGltbWVyIGFsbGUgS25vY2hlblxyXG4gICAgLy8gPT4gUHJvYmxlbSBiZXN0ZWh0IGF1Y2ggaW0gR0xURkxvYWRlclxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWVmcyB0aGUgc2tlbGV0b24gY29udGFpbmluZyB0aGUgZ2l2ZW4gbGltYiBub2RlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2tlbGV0b24oX2ZieExpbWJOb2RlOiBGQlguTW9kZWwpOiBQcm9taXNlPENvbXBvbmVudFNrZWxldG9uPiB7XHJcbiAgICAgIGlmICghdGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgIHRoaXMuI3NrZWxldG9ucyA9IFtdO1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2tlbGV0b25zLmZpbmQoX3NrZWxldG9uID0+IF9mYnhMaW1iTm9kZS5uYW1lIGluIF9za2VsZXRvbi5ib25lcykgfHwgYXdhaXQgKGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBza2VsZXRvbjogQ29tcG9uZW50U2tlbGV0b24gPSBuZXcgQ29tcG9uZW50U2tlbGV0b24oKTsgLy8gbmV3IFNrZWxldG9uKGBTa2VsZXRvbiR7dGhpcy4jc2tlbGV0b25zLmxlbmd0aH1gKTtcclxuICAgICAgICBsZXQgcm9vdE5vZGU6IEZCWC5Nb2RlbCA9IF9mYnhMaW1iTm9kZTtcclxuICAgICAgICB3aGlsZSAocm9vdE5vZGUucGFyZW50cyAmJiByb290Tm9kZS5wYXJlbnRzLnNvbWUoX3BhcmVudCA9PiBfcGFyZW50LnN1YnR5cGUgPT0gXCJMaW1iTm9kZVwiKSlcclxuICAgICAgICAgIHJvb3ROb2RlID0gcm9vdE5vZGUucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC5zdWJ0eXBlID09IFwiTGltYk5vZGVcIik7XHJcbiAgICAgICAgY29uc3QgaVJvb3ROb2RlOiBudW1iZXIgPSB0aGlzLmZieC5vYmplY3RzLm1vZGVscy5maW5kSW5kZXgoX21vZGVsID0+IF9tb2RlbC5uYW1lID09IHJvb3ROb2RlLm5hbWUpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYXdhaXQgdGhpcy5nZXROb2RlKGlSb290Tm9kZSkpIHtcclxuICAgICAgICAgIC8vIFRPRE86IG1heWJlIG1vdmUgdGhpcyBpbnRvIHRoZSBjb21wb25lbnQsIGFzIHRoaXMgaXMgcHJvYmFibHkgbmVlZGVkIGluIGdsdGYgaW1wb3J0IGFzd2VsbFxyXG4gICAgICAgICAgaWYgKHRoaXMuZmJ4Lm9iamVjdHMubW9kZWxzW3RoaXMuI25vZGVzLmluZGV4T2Yobm9kZSldLnN1YnR5cGUgPT0gXCJMaW1iTm9kZVwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDogTm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhXb3JsZC5jb3B5KFxyXG4gICAgICAgICAgICAgICAgbm9kZS5jbXBUcmFuc2Zvcm0gP1xyXG4gICAgICAgICAgICAgICAgICBNYXRyaXg0eDQuUFJPRFVDVChwYXJlbnQubXR4V29ybGQsIG5vZGUubXR4TG9jYWwpIDpcclxuICAgICAgICAgICAgICAgICAgcGFyZW50Lm10eFdvcmxkXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgbm9kZS5tdHhXb3JsZEludmVyc2UuY29weShNYXRyaXg0eDQuSU5WRVJTRShub2RlLm10eFdvcmxkKSk7XHJcbiAgICAgICAgICAgIHNrZWxldG9uLmFkZEJvbmUobm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNza2VsZXRvbnMucHVzaChza2VsZXRvbik7XHJcbiAgICAgICAgcmV0dXJuIHNrZWxldG9uO1xyXG4gICAgICB9KSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRBbmltYXRpb24oX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPEFuaW1hdGlvbj4ge1xyXG4gICAgICBpZiAoIXRoaXMuI2FuaW1hdGlvbnMpXHJcbiAgICAgICAgdGhpcy4jYW5pbWF0aW9ucyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI2FuaW1hdGlvbnNbX2luZGV4XSkge1xyXG4gICAgICAgIGNvbnN0IGFuaW1TdGFjazogRkJYLk9iamVjdCA9IHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrc1tfaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IGFuaW1Ob2Rlc0ZCWDogRkJYLkFuaW1DdXJ2ZU5vZGVbXSA9IGFuaW1TdGFjay5jaGlsZHJlblswXS5jaGlsZHJlbjtcclxuXHJcbiAgICAgICAgbGV0IGZieEFuaW1Ob2RlR3JvdXBlZDogTWFwPEZCWC5Nb2RlbCwgRkJYLkFuaW1DdXJ2ZU5vZGVbXT4gPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBmYnhBbmltTm9kZSBvZiBhbmltTm9kZXNGQlgpIHtcclxuICAgICAgICAgIGNvbnN0IGtleTogRkJYLk1vZGVsID0gZmJ4QW5pbU5vZGUucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIik7XHJcbiAgICAgICAgICBpZiAoa2V5ID09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICBpZiAoIWZieEFuaW1Ob2RlR3JvdXBlZC5oYXMoa2V5KSlcclxuICAgICAgICAgICAgZmJ4QW5pbU5vZGVHcm91cGVkLnNldChrZXksIFtdKTtcclxuICAgICAgICAgIGZieEFuaW1Ob2RlR3JvdXBlZC5nZXQoa2V5KS5wdXNoKGZieEFuaW1Ob2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFuaW1hdGlvblN0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge307XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgW2ZieE1vZGVsLCBmYnhBbmltTm9kZXNdIG9mIGZieEFuaW1Ob2RlR3JvdXBlZCkge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IGFuaW1hdGlvblN0cnVjdHVyZTtcclxuXHJcbiAgICAgICAgICBsZXQgcGFyZW50OiBGQlguTW9kZWwgPSBmYnhNb2RlbC5wYXJlbnRzLmZpbmQoX3BhcmVudCA9PiBfcGFyZW50LnR5cGUgPT0gXCJNb2RlbFwiKTtcclxuICAgICAgICAgIGxldCBwYXRoOiBGQlguTW9kZWxbXSA9IFtdO1xyXG4gICAgICAgICAgcGF0aC5wdXNoKGZieE1vZGVsKTtcclxuICAgICAgICAgIHdoaWxlIChwYXJlbnQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHBhdGgucHVzaChwYXJlbnQpO1xyXG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZm9yIChjb25zdCBmYnhQYXRoTW9kZWwgb2YgcGF0aC5yZXZlcnNlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgIGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gPSB7fTtcclxuXHJcbiAgICAgICAgICAgIGlmICgoY3VycmVudFN0cnVjdHVyZS5jaGlsZHJlbiBhcyBBbmltYXRpb25TdHJ1Y3R1cmUpW2ZieFBhdGhNb2RlbC5uYW1lXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgKGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gYXMgQW5pbWF0aW9uU3RydWN0dXJlKVtmYnhQYXRoTW9kZWwubmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgY3VycmVudFN0cnVjdHVyZSA9IChjdXJyZW50U3RydWN0dXJlLmNoaWxkcmVuIGFzIEFuaW1hdGlvblN0cnVjdHVyZSlbZmJ4UGF0aE1vZGVsLm5hbWVdIGFzIEFuaW1hdGlvblN0cnVjdHVyZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChmYnhQYXRoTW9kZWwgPT0gZmJ4TW9kZWwpIHtcclxuICAgICAgICAgICAgICBjb25zdCBtdHhMb2NhbDogQW5pbWF0aW9uU2VxdWVuY2VNYXRyaXg0eDQgPSB7fTtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZieEFuaW1Ob2RlIG9mIGZieEFuaW1Ob2RlcylcclxuICAgICAgICAgICAgICAgIG10eExvY2FsW3tcclxuICAgICAgICAgICAgICAgICAgVDogXCJ0cmFuc2xhdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgICBSOiBcInJvdGF0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICAgIFM6IFwic2NhbGVcIlxyXG4gICAgICAgICAgICAgICAgfVtmYnhBbmltTm9kZS5uYW1lXV0gPSB0aGlzLmdldEFuaW1hdGlvblZlY3RvcjMoZmJ4QW5pbU5vZGUsIGZieFBhdGhNb2RlbCk7XHJcbiAgICAgICAgICAgICAgY3VycmVudFN0cnVjdHVyZS5jb21wb25lbnRzID0ge1xyXG4gICAgICAgICAgICAgICAgQ29tcG9uZW50VHJhbnNmb3JtOiBbXHJcbiAgICAgICAgICAgICAgICAgIHsgbXR4TG9jYWw6IG10eExvY2FsIH1cclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNhbmltYXRpb25zW19pbmRleF0gPSBuZXcgQW5pbWF0aW9uKGFuaW1TdGFjay5uYW1lLCBhbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLiNhbmltYXRpb25zW19pbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBmZXRjaGVkIGZyb20gdGhyZWUuanMsIGFkYXB0ZWQgdG8gRlVER0UgYW5kIG9wdGltaXplZFxyXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9ibG9iL2Rldi9leGFtcGxlcy9qc20vbG9hZGVycy9GQlhMb2FkZXIuanNcclxuICAgICAqIGxpbmUgMzk1MFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlVHJhbnNmb3JtKF9tb2RlbEZCWDogRkJYLk1vZGVsLCBfbm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBwYXJlbnRJbmRleDogbnVtYmVyID0gdGhpcy5mYngub2JqZWN0cy5tb2RlbHMuaW5kZXhPZihfbW9kZWxGQlgucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIikpO1xyXG4gICAgICBjb25zdCBwYXJlbnQ6IE5vZGUgPSBwYXJlbnRJbmRleCA+PSAwID8gYXdhaXQgdGhpcy5nZXROb2RlKHBhcmVudEluZGV4KSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGNvbnN0IG10eExvY2FsUm90YXRpb246IE1hdHJpeDR4NCA9IF9tb2RlbEZCWC5QcmVSb3RhdGlvbiB8fCBfbW9kZWxGQlguTGNsUm90YXRpb24gfHwgX21vZGVsRkJYLlBvc3RSb3RhdGlvbiA/XHJcbiAgICAgICAgTWF0cml4NHg0LklERU5USVRZKCkgOlxyXG4gICAgICAgIHVuZGVmaW5lZDtcclxuICAgICAgaWYgKF9tb2RlbEZCWC5QcmVSb3RhdGlvbikge1xyXG4gICAgICAgIG10eExvY2FsUm90YXRpb24ucm90YXRlKHRoaXMuZ2V0T3JkZXJlZChfbW9kZWxGQlguUHJlUm90YXRpb24sIF9tb2RlbEZCWCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChfbW9kZWxGQlguTGNsUm90YXRpb24pIHtcclxuICAgICAgICBtdHhMb2NhbFJvdGF0aW9uLnJvdGF0ZSh0aGlzLmdldE9yZGVyZWQodGhpcy5nZXRUcmFuc2Zvcm1WZWN0b3IoX21vZGVsRkJYLkxjbFJvdGF0aW9uLCBWZWN0b3IzLlpFUk8pLCBfbW9kZWxGQlgpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoX21vZGVsRkJYLlBvc3RSb3RhdGlvbikge1xyXG4gICAgICAgIGxldCBtdHhQb3N0Um90YXRpb25JbnZlcnNlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT04odGhpcy5nZXRPcmRlcmVkKF9tb2RlbEZCWC5Qb3N0Um90YXRpb24sIF9tb2RlbEZCWCkpO1xyXG4gICAgICAgIG10eFBvc3RSb3RhdGlvbkludmVyc2UgPSBNYXRyaXg0eDQuSU5WRVJTRShtdHhQb3N0Um90YXRpb25JbnZlcnNlKTtcclxuICAgICAgICBtdHhMb2NhbFJvdGF0aW9uLm11bHRpcGx5KG10eFBvc3RSb3RhdGlvbkludmVyc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtdHhMb2NhbFNjYWxpbmc6IE1hdHJpeDR4NCA9IF9tb2RlbEZCWC5MY2xTY2FsaW5nID9cclxuICAgICAgICBNYXRyaXg0eDQuU0NBTElORyh0aGlzLmdldFRyYW5zZm9ybVZlY3RvcihfbW9kZWxGQlguTGNsU2NhbGluZywgVmVjdG9yMy5PTkUpKSA6XHJcbiAgICAgICAgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgY29uc3QgbXR4UGFyZW50V29ybGRSb3RhdGlvbjogTWF0cml4NHg0ID0gcGFyZW50ID8gTWF0cml4NHg0LlJPVEFUSU9OKHBhcmVudC5tdHhXb3JsZC5yb3RhdGlvbikgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBjb25zdCBtdHhQYXJlbnRXb3JsZFNjYWxlOiBNYXRyaXg0eDQgPSBwYXJlbnQgPyAoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG10eFBhcmVudFdvcmxkU2NhbGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFBhcmVudFdvcmxkUm90YXRpb24pO1xyXG4gICAgICAgIG10eFBhcmVudFdvcmxkU2NhbGUudHJhbnNsYXRlKFZlY3RvcjMuU0NBTEUocGFyZW50Lm10eFdvcmxkLnRyYW5zbGF0aW9uLCAtMSkpO1xyXG4gICAgICAgIG10eFBhcmVudFdvcmxkU2NhbGUubXVsdGlwbHkocGFyZW50Lm10eFdvcmxkKTtcclxuICAgICAgICByZXR1cm4gbXR4UGFyZW50V29ybGRTY2FsZTtcclxuICAgICAgfSkoKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGNvbnN0IG10eFdvcmxkUm90YXRpb25TY2FsZTogTWF0cml4NHg0ID0gcGFyZW50IHx8IG10eExvY2FsUm90YXRpb24gfHwgbXR4TG9jYWxTY2FsaW5nID8gTWF0cml4NHg0LklERU5USVRZKCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChwYXJlbnQgfHwgbXR4TG9jYWxSb3RhdGlvbiB8fCBtdHhMb2NhbFNjYWxpbmcpIHtcclxuICAgICAgICBjb25zdCBpbmhlcml0VHlwZTogbnVtYmVyID0gX21vZGVsRkJYLkluaGVyaXRUeXBlIHx8IDA7XHJcbiAgICAgICAgaWYgKGluaGVyaXRUeXBlID09IDApIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFJvdGF0aW9uKTtcclxuICAgICAgICAgIGlmIChtdHhMb2NhbFJvdGF0aW9uKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcbiAgICAgICAgICBpZiAocGFyZW50KVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50V29ybGRTY2FsZSk7XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxTY2FsaW5nKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxTY2FsaW5nKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGluaGVyaXRUeXBlID09IDEpIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eFBhcmVudFdvcmxkUm90YXRpb24pO1xyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50V29ybGRTY2FsZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxSb3RhdGlvbilcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eExvY2FsUm90YXRpb24pO1xyXG4gICAgICAgICAgaWYgKG10eExvY2FsU2NhbGluZylcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eExvY2FsU2NhbGluZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFJvdGF0aW9uKTtcclxuICAgICAgICAgIGlmIChtdHhMb2NhbFJvdGF0aW9uKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcbiAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFNjYWxlKTtcclxuICAgICAgICAgICAgbGV0IG10eFBhcmVudExvY2FsU2NhbGluZ0ludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5TQ0FMSU5HKHBhcmVudC5tdHhMb2NhbC5zY2FsaW5nKTtcclxuICAgICAgICAgICAgbXR4UGFyZW50TG9jYWxTY2FsaW5nSW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFBhcmVudExvY2FsU2NhbGluZ0ludmVyc2UpO1xyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50TG9jYWxTY2FsaW5nSW52ZXJzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxTY2FsaW5nKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxTY2FsaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbG9jYWwgdHJhbnNmb3JtIG1hdHJpeFxyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjM7XHJcbiAgICAgIHRyYW5zbGF0aW9uID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguTGNsVHJhbnNsYXRpb24pXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKHRoaXMuZ2V0VHJhbnNmb3JtVmVjdG9yKF9tb2RlbEZCWC5MY2xUcmFuc2xhdGlvbiwgVmVjdG9yMy5aRVJPKSk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguUm90YXRpb25PZmZzZXQpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5Sb3RhdGlvbk9mZnNldCk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguUm90YXRpb25QaXZvdClcclxuICAgICAgICB0cmFuc2xhdGlvbi5hZGQoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpO1xyXG5cclxuICAgICAgY29uc3QgbXR4VHJhbnNmb3JtOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuVFJBTlNMQVRJT04odHJhbnNsYXRpb24pO1xyXG4gICAgICBpZiAobXR4TG9jYWxSb3RhdGlvbilcclxuICAgICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcblxyXG4gICAgICB0cmFuc2xhdGlvbiA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgICBpZiAoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uc3VidHJhY3QoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpO1xyXG4gICAgICBpZiAoX21vZGVsRkJYLlNjYWxpbmdPZmZzZXQpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5TY2FsaW5nT2Zmc2V0KTtcclxuICAgICAgaWYgKF9tb2RlbEZCWC5TY2FsaW5nUGl2b3QpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5TY2FsaW5nUGl2b3QpO1xyXG4gICAgICBtdHhUcmFuc2Zvcm0udHJhbnNsYXRlKHRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgIGlmIChtdHhMb2NhbFNjYWxpbmcpXHJcbiAgICAgICAgbXR4VHJhbnNmb3JtLm11bHRpcGx5KG10eExvY2FsU2NhbGluZyk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguU2NhbGluZ1Bpdm90KVxyXG4gICAgICAgIG10eFRyYW5zZm9ybS50cmFuc2xhdGUoVmVjdG9yMy5TQ0FMRShfbW9kZWxGQlguU2NhbGluZ1Bpdm90LCAtMSkpO1xyXG5cclxuICAgICAgY29uc3QgbXR4V29ybGRUcmFuc2xhdGlvbjogTWF0cml4NHg0ID0gcGFyZW50ID9cclxuICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04oTWF0cml4NHg0LlBST0RVQ1QoXHJcbiAgICAgICAgICBwYXJlbnQubXR4V29ybGQsXHJcbiAgICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04obXR4VHJhbnNmb3JtLnRyYW5zbGF0aW9uKVxyXG4gICAgICAgICkudHJhbnNsYXRpb24pIDpcclxuICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04obXR4VHJhbnNmb3JtLnRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgIG10eFRyYW5zZm9ybS5jb3B5KG10eFdvcmxkVHJhbnNsYXRpb24pO1xyXG4gICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkobXR4V29ybGRSb3RhdGlvblNjYWxlKTtcclxuICAgICAgX25vZGUubXR4V29ybGQuY29weShtdHhUcmFuc2Zvcm0pO1xyXG5cclxuICAgICAgaWYgKHBhcmVudClcclxuICAgICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkoTWF0cml4NHg0LklOVkVSU0UocGFyZW50Lm10eFdvcmxkKSwgdHJ1ZSk7XHJcbiAgICAgIF9ub2RlLmFkZENvbXBvbmVudChuZXcgQ29tcG9uZW50VHJhbnNmb3JtKG10eFRyYW5zZm9ybSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VHJhbnNmb3JtVmVjdG9yKF92ZWN0b3I6IFZlY3RvcjMgfCBGQlguQW5pbUN1cnZlTm9kZSwgX2RlZmF1bHQ6ICgpID0+IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBfdmVjdG9yID09IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICBfZGVmYXVsdCgpIDpcclxuICAgICAgICAgIF92ZWN0b3IgaW5zdGFuY2VvZiBWZWN0b3IzID9cclxuICAgICAgICAgICAgX3ZlY3RvciA6XHJcbiAgICAgICAgICAgIG5ldyBWZWN0b3IzKFxyXG4gICAgICAgICAgICAgIHR5cGVvZiAoX3ZlY3RvciA9IF92ZWN0b3IubG9hZCgpKS5kWCA9PSBcIm51bWJlclwiID9cclxuICAgICAgICAgICAgICAgIF92ZWN0b3IuZFggOlxyXG4gICAgICAgICAgICAgICAgKF92ZWN0b3IuZFgubG9hZCgpIGFzIEZCWC5BbmltQ3VydmUpLkRlZmF1bHQsXHJcbiAgICAgICAgICAgICAgdHlwZW9mIF92ZWN0b3IuZFkgPT0gXCJudW1iZXJcIiA/XHJcbiAgICAgICAgICAgICAgICBfdmVjdG9yLmRZIDpcclxuICAgICAgICAgICAgICAgIChfdmVjdG9yLmRZLmxvYWQoKSBhcyBGQlguQW5pbUN1cnZlKS5EZWZhdWx0LFxyXG4gICAgICAgICAgICAgIHR5cGVvZiBfdmVjdG9yLmRaID09IFwibnVtYmVyXCIgP1xyXG4gICAgICAgICAgICAgICAgX3ZlY3Rvci5kWiA6XHJcbiAgICAgICAgICAgICAgICAoX3ZlY3Rvci5kWi5sb2FkKCkgYXMgRkJYLkFuaW1DdXJ2ZSkuRGVmYXVsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRBbmltYXRpb25WZWN0b3IzKF9hbmltTm9kZTogRkJYLkFuaW1DdXJ2ZU5vZGUsIF90YXJnZXQ6IEZCWC5Nb2RlbCk6IEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvclNlcXVlbmNlOiBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjMgPSB7fTtcclxuICAgICAgZm9yIChjb25zdCB2YWx1ZU5hbWUgaW4gX2FuaW1Ob2RlKSBpZiAodmFsdWVOYW1lID09IFwiZFhcIiB8fCB2YWx1ZU5hbWUgPT0gXCJkWVwiIHx8IHZhbHVlTmFtZSA9PSBcImRaXCIpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZTogRkJYLkFuaW1DdXJ2ZSB8IG51bWJlciA9IF9hbmltTm9kZVt2YWx1ZU5hbWVdO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgY29uc3Qgc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmFsdWUuS2V5VGltZS5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHJlZmVyZW5jZSB0aW1lIGlzIGRlZmluZWQgYXMgYSBzaWduZWQgaW50NjQsIHVuaXQgYmVpbmcgMS80NjE4NjE1ODAwMCBzZWNvbmRzXHJcbiAgICAgICAgICAgIC8vIHJlZjogaHR0cHM6Ly9hcmNoaXZlLmJsZW5kZXIub3JnL3dpa2kvaW5kZXgucGhwL1VzZXI6TW9udDI5L0ZvdW5kYXRpb24vRkJYX0ZpbGVfU3RydWN0dXJlLyNTb21lX1NwZWNpZmljX1Byb3BlcnR5X1R5cGVzXHJcbiAgICAgICAgICAgIHNlcXVlbmNlLmFkZEtleShuZXcgQW5pbWF0aW9uS2V5KFxyXG4gICAgICAgICAgICAgIE51bWJlcigodmFsdWUuS2V5VGltZVtpXSAtIHZhbHVlLktleVRpbWUucmVkdWNlKChfbWluLCBfdikgPT4gX3YgPCBfbWluID8gX3YgOiBfbWluKSkgLyBCaWdJbnQoXCI0NjE4NjE1OFwiKSksXHJcbiAgICAgICAgICAgICAgdmFsdWUuS2V5VmFsdWVGbG9hdFtpXVxyXG4gICAgICAgICAgICApKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZlY3RvclNlcXVlbmNlW3ZhbHVlTmFtZVsxXS50b0xvd2VyQ2FzZSgpXSA9IHNlcXVlbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKF9hbmltTm9kZS5uYW1lID09IFwiUlwiICYmIChfdGFyZ2V0LlByZVJvdGF0aW9uIHx8IF90YXJnZXQuUG9zdFJvdGF0aW9uKSkge1xyXG4gICAgICAgIGxldCBwcmVSb3RvdGF0aW9uOiBNYXRyaXg0eDQ7XHJcbiAgICAgICAgaWYgKF90YXJnZXQuUHJlUm90YXRpb24pXHJcbiAgICAgICAgICBwcmVSb3RvdGF0aW9uID0gTWF0cml4NHg0LlJPVEFUSU9OKF90YXJnZXQuUHJlUm90YXRpb24pO1xyXG4gICAgICAgIGxldCBwb3N0Um90YXRpb246IE1hdHJpeDR4NDtcclxuICAgICAgICBpZiAoX3RhcmdldC5Qb3N0Um90YXRpb24pXHJcbiAgICAgICAgICBwb3N0Um90YXRpb24gPSBNYXRyaXg0eDQuUk9UQVRJT04oX3RhcmdldC5Qb3N0Um90YXRpb24pO1xyXG5cclxuICAgICAgICBbdmVjdG9yU2VxdWVuY2UueCwgdmVjdG9yU2VxdWVuY2UueSwgdmVjdG9yU2VxdWVuY2Uuel1cclxuICAgICAgICAgIC5mbGF0TWFwKF9zZXEgPT4gX3NlcT8uZ2V0S2V5cygpKVxyXG4gICAgICAgICAgLm1hcChfa2V5ID0+IF9rZXk/LnRpbWUpXHJcbiAgICAgICAgICAuc29ydCgoX3RpbWVBLCBfdGltZUIpID0+IF90aW1lQSAtIF90aW1lQikgLy8gc29ydCB0aW1lc1xyXG4gICAgICAgICAgLmZpbHRlcigoX3RpbWUsIF9pbmRleCwgX3RpbWVzKSA9PiBfdGltZSAhPSBfdGltZXNbX2luZGV4ICsgMV0pIC8vIHJlbW92ZSBkdXBsaWNhdGVzXHJcbiAgICAgICAgICAubWFwKF90aW1lID0+IHsgLy8gZmluZCBrZXlzIGZvciBhbGwgYXhlcyBhdCB0aW1lXHJcbiAgICAgICAgICAgIHJldHVybiB7IHg6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueCksIHk6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueSksIHo6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueikgfTtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZmluZEtleShfc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlKTogQW5pbWF0aW9uS2V5IHtcclxuICAgICAgICAgICAgICByZXR1cm4gX3NlcXVlbmNlPy5nZXRLZXlzKCkuZmluZChfa2V5ID0+IF9rZXkudGltZSA9PSBfdGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuZm9yRWFjaChfZnJhbWUgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdmN0RXVsZXJBbmdsZXM6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgICAgICAgIHZjdEV1bGVyQW5nbGVzLnNldChcclxuICAgICAgICAgICAgICBfZnJhbWUueD8udmFsdWUgPz8gMCxcclxuICAgICAgICAgICAgICBfZnJhbWUueT8udmFsdWUgPz8gMCxcclxuICAgICAgICAgICAgICBfZnJhbWUuej8udmFsdWUgPz8gMFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBtdHhSb3RhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OKHZjdEV1bGVyQW5nbGVzKTtcclxuICAgICAgICAgICAgaWYgKHByZVJvdG90YXRpb24pXHJcbiAgICAgICAgICAgICAgbXR4Um90YXRpb24ubXVsdGlwbHkocHJlUm90b3RhdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChwb3N0Um90YXRpb24pXHJcbiAgICAgICAgICAgICAgbXR4Um90YXRpb24ubXVsdGlwbHkocG9zdFJvdGF0aW9uKTtcclxuICAgICAgICAgICAgdmN0RXVsZXJBbmdsZXMgPSBtdHhSb3RhdGlvbi5yb3RhdGlvbjtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS54KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS54LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMueDtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS55KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS55LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMueTtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS56KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS56LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMuejtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdmVjdG9yU2VxdWVuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRPcmRlcmVkKF9yb3RhdGlvbjogVmVjdG9yMywgX21vZGVsRkJYOiBGQlguTW9kZWwpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKCFfbW9kZWxGQlguRXVsZXJPcmRlcilcclxuICAgICAgICByZXR1cm4gX3JvdGF0aW9uO1xyXG5cclxuICAgICAgY29uc3QgZGF0YTogRmxvYXQzMkFycmF5ID0gX3JvdGF0aW9uLmdldCgpO1xyXG4gICAgICBjb25zdCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWlwiKV0sXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWVwiKV0sXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWFwiKV1cclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZCWCB7XHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIHRvIHJlcHJlc2VudCBmYngtbm9kZXMgY29udGFpbmluZyBpdHMgbmFtZSwgY2hpbGRyZW4gYW5kIHByb3BlcnRpZXMuXHJcbiAgICogQ2hpbGRyZW4gYW5kIHByb3Blcml0ZXMgYXJlIGxhenkuXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBOb2RlIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBcclxuICAgIHByaXZhdGUgbG9hZFByb3BlcnRpZXM6ICgpID0+IE5vZGVQcm9wZXJ0eVtdO1xyXG4gICAgcHJpdmF0ZSBsb2FkQ2hpbGRyZW46ICgpID0+IE5vZGVbXTtcclxuICAgIFxyXG4gICAgI2NoaWxkcmVuOiBOb2RlW107XHJcbiAgICAjcHJvcGVydGllczogTm9kZVByb3BlcnR5W107XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcsIF9sb2FkUHJvcGVydGllczogKCkgPT4gTm9kZVByb3BlcnR5W10sIF9sb2FkQ2hpbGRyZW46ICgpID0+IE5vZGVbXSkge1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5sb2FkUHJvcGVydGllcyA9IF9sb2FkUHJvcGVydGllcztcclxuICAgICAgdGhpcy5sb2FkQ2hpbGRyZW4gPSBfbG9hZENoaWxkcmVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcHJvcGVydGllcygpOiBOb2RlUHJvcGVydHlbXSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNwcm9wZXJ0aWVzIHx8ICh0aGlzLiNwcm9wZXJ0aWVzID0gdGhpcy5sb2FkUHJvcGVydGllcygpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNoaWxkcmVuKCk6IE5vZGVbXSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNjaGlsZHJlbiB8fCAodGhpcy4jY2hpbGRyZW4gPSB0aGlzLmxvYWRDaGlsZHJlbigpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCB0eXBlIFByb3BlcnR5NzAgPSBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgRnVkZ2VDb3JlLlZlY3RvcjM7XHJcblxyXG4gIGV4cG9ydCB0eXBlIE5vZGVQcm9wZXJ0eSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBVaW50OEFycmF5IHwgVWludDE2QXJyYXkgfCBGbG9hdDMyQXJyYXk7XHJcblxyXG4gIGV4cG9ydCBlbnVtIEFSUkFZX0VOQ09ESU5HIHtcclxuICAgIFVOQ09NUFJFU1NFRCwgQ09NUFJFU1NFRFxyXG4gIH1cclxuICBcclxufSIsIm5hbWVzcGFjZSBGQlgge1xyXG4gIC8qKlxyXG4gICAqIExvYWRzIGFuIGZieCBmaWxlIGZyb20gaXRzIGZieC1ub2RlIGFycmF5IHdoaWNoIG1heSBiZSByZXRyaWV2ZWQgYnkgcGFyc2VOb2Rlc0Zyb21CaW5hcnkuXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBsb2FkRnJvbU5vZGVzKF9ub2RlczogTm9kZVtdKTogRkJYIHtcclxuICAgIGNvbnN0IGZieDogRkJYID0ge1xyXG4gICAgICBkb2N1bWVudHM6IHVuZGVmaW5lZCxcclxuICAgICAgb2JqZWN0czoge1xyXG4gICAgICAgIGFsbDogdW5kZWZpbmVkLFxyXG4gICAgICAgIG1vZGVsczogW10sXHJcbiAgICAgICAgZ2VvbWV0cmllczogW10sXHJcbiAgICAgICAgbWF0ZXJpYWxzOiBbXSxcclxuICAgICAgICBwb3NlczogW10sXHJcbiAgICAgICAgdGV4dHVyZXM6IFtdLFxyXG4gICAgICAgIGFuaW1TdGFja3M6IFtdXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbm5lY3Rpb25zOiB1bmRlZmluZWRcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIF9ub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5uYW1lID09IFwiRG9jdW1lbnRzXCIpXHJcbiAgICAgICAgZmJ4LmRvY3VtZW50cyA9IG5vZGUuY2hpbGRyZW5cclxuICAgICAgICAgIC5maWx0ZXIoX2RvY3VtZW50Tm9kZSA9PiBfZG9jdW1lbnROb2RlLm5hbWUgPT0gXCJEb2N1bWVudFwiKVxyXG4gICAgICAgICAgLm1hcChfZG9jdW1lbnROb2RlID0+IGdldERvY3VtZW50KF9kb2N1bWVudE5vZGUpKTtcclxuICAgICAgZWxzZSBpZiAobm9kZS5uYW1lID09IFwiT2JqZWN0c1wiKVxyXG4gICAgICAgIGZieC5vYmplY3RzLmFsbCA9IG5vZGUuY2hpbGRyZW4ubWFwKF9vYmplY3ROb2RlID0+IGdldE9iamVjdChfb2JqZWN0Tm9kZSwgZmJ4KSk7XHJcbiAgICAgIGVsc2UgaWYgKG5vZGUubmFtZSA9PSBcIkNvbm5lY3Rpb25zXCIpXHJcbiAgICAgICAgZmJ4LmNvbm5lY3Rpb25zID0gbm9kZS5jaGlsZHJlbi5tYXAoX2Nvbm5lY3Rpb25Ob2RlID0+IGdldENvbm5lY3Rpb24oX2Nvbm5lY3Rpb25Ob2RlKSk7XHJcbiAgICAgIGlmIChmYnguZG9jdW1lbnRzICYmIGZieC5vYmplY3RzLmFsbCAmJiBmYnguY29ubmVjdGlvbnMpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgZ3JvdXBPYmplY3RzKGZieCk7XHJcbiAgICBhcHBseUNvbm5lY3Rpb25zKGZieC5jb25uZWN0aW9ucywgZmJ4LmRvY3VtZW50cywgZmJ4Lm9iamVjdHMuYWxsKTtcclxuXHJcbiAgICByZXR1cm4gZmJ4O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoX25vZGU6IE5vZGUpOiBEb2N1bWVudCB7XHJcbiAgICBjb25zdCBkb2N1bWVudDogT2JqZWN0ID0ge1xyXG4gICAgICB1aWQ6IF9ub2RlLnByb3BlcnRpZXNbMF0gYXMgbnVtYmVyLFxyXG4gICAgICBuYW1lOiBfbm9kZS5wcm9wZXJ0aWVzWzJdIGFzIHN0cmluZyxcclxuICAgICAgbG9hZGVkOiBmYWxzZSxcclxuICAgICAgbG9hZDogKCkgPT4gbG9hZE9iamVjdFByb3BlcnRpZXMoX25vZGUsIGRvY3VtZW50KVxyXG4gICAgfTtcclxuICAgIHJldHVybiBkb2N1bWVudDtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldE9iamVjdChfbm9kZTogTm9kZSwgX2ZieDogRkJYKTogT2JqZWN0IHtcclxuICAgIGNvbnN0IG5hbWVBbmRUeXBlOiBzdHJpbmdbXSA9IChfbm9kZS5wcm9wZXJ0aWVzWzFdIGFzIHN0cmluZykuc3BsaXQoXCI6OlwiKTtcclxuICAgIGNvbnN0IG9iamVjdDogT2JqZWN0ID0ge1xyXG4gICAgICB1aWQ6IF9ub2RlLnByb3BlcnRpZXNbMF0gYXMgbnVtYmVyLFxyXG4gICAgICBuYW1lOiBuYW1lQW5kVHlwZVswXSxcclxuICAgICAgdHlwZTogbmFtZUFuZFR5cGVbMV0sXHJcbiAgICAgIHN1YnR5cGU6IF9ub2RlLnByb3BlcnRpZXNbMl0gYXMgc3RyaW5nLFxyXG4gICAgICBsb2FkZWQ6IGZhbHNlLFxyXG4gICAgICBsb2FkOiAoKSA9PiBsb2FkT2JqZWN0UHJvcGVydGllcyhfbm9kZSwgb2JqZWN0KVxyXG4gICAgfTtcclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBncm91cE9iamVjdHMoX2ZieDogRkJYKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBfZmJ4Lm9iamVjdHMuYWxsKSB7XHJcbiAgICAgIGlmIChvYmplY3QudHlwZSA9PSBcIk1vZGVsXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLm1vZGVscy5wdXNoKG9iamVjdCk7XHJcbiAgICAgIGVsc2UgaWYgKG9iamVjdC50eXBlID09IFwiR2VvbWV0cnlcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMuZ2VvbWV0cmllcy5wdXNoKG9iamVjdCk7XHJcbiAgICAgIGVsc2UgaWYgKG9iamVjdC50eXBlID09IFwiTWF0ZXJpYWxcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMubWF0ZXJpYWxzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJQb3NlXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLnBvc2VzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJUZXh0dXJlXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLnRleHR1cmVzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJBbmltU3RhY2tcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5wdXNoKG9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRDb25uZWN0aW9uKF9ub2RlOiBOb2RlKTogQ29ubmVjdGlvbiB7XHJcbiAgICBpZiAoIShfbm9kZS5wcm9wZXJ0aWVzWzBdID09IFwiT09cIiB8fCBfbm9kZS5wcm9wZXJ0aWVzWzBdID09IFwiT1BcIikpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBDb25uZWN0aW9uIHR5cGUgJHtfbm9kZS5wcm9wZXJ0aWVzWzBdfSBpcyBub3Qgc3VwcG9ydGVkYCk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY2hpbGRVSUQ6IF9ub2RlLnByb3BlcnRpZXNbMV0gYXMgbnVtYmVyLFxyXG4gICAgICBwYXJlbnRVSUQ6IF9ub2RlLnByb3BlcnRpZXNbMl0gYXMgbnVtYmVyLFxyXG4gICAgICBwcm9wZXJ0eU5hbWU6IF9ub2RlLnByb3BlcnRpZXNbMF0gPT0gXCJPUFwiID8gX25vZGUucHJvcGVydGllc1szXSBhcyBzdHJpbmcgOiBudWxsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYXBwbHlDb25uZWN0aW9ucyhfY29ubmVjdGlvbnM6IENvbm5lY3Rpb25bXSwgX2RvY3VtZW50czogRG9jdW1lbnRbXSwgX29iamVjdHM6IE9iamVjdFtdKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgX2Nvbm5lY3Rpb25zKSB7XHJcbiAgICAgIGxldCBwYXJlbnQ6IE9iamVjdCA9IF9kb2N1bWVudHMuZmluZChfZG9jdW1lbnQgPT4gX2RvY3VtZW50LmxvYWQoKS5Sb290Tm9kZSA9PSBjb25uZWN0aW9uLnBhcmVudFVJRCkgYXMgT2JqZWN0O1xyXG4gICAgICBsZXQgY2hpbGQ6IE9iamVjdDtcclxuICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgX29iamVjdHMpIHtcclxuICAgICAgICBpZiAocGFyZW50ID09IHVuZGVmaW5lZCAmJiBvYmplY3QudWlkID09IGNvbm5lY3Rpb24ucGFyZW50VUlEKVxyXG4gICAgICAgICAgcGFyZW50ID0gb2JqZWN0O1xyXG4gICAgICAgIGlmIChjaGlsZCA9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnVpZCA9PSBjb25uZWN0aW9uLmNoaWxkVUlEKVxyXG4gICAgICAgICAgY2hpbGQgPSBvYmplY3Q7XHJcbiAgICAgICAgaWYgKHBhcmVudCAhPSB1bmRlZmluZWQgJiYgY2hpbGQgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoaWxkKVxyXG4gICAgICAgIChjaGlsZC5wYXJlbnRzIHx8IChjaGlsZC5wYXJlbnRzID0gW10pKS5wdXNoKHBhcmVudCk7XHJcbiAgICAgIGlmIChjb25uZWN0aW9uLnByb3BlcnR5TmFtZSA9PSBudWxsKVxyXG4gICAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgKHBhcmVudC5jaGlsZHJlbiA9IFtdKSkucHVzaChjaGlsZCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICAocGFyZW50IGFzIE9iamVjdClbZm9ybWF0UHJvcGVydHlOYW1lKGNvbm5lY3Rpb24ucHJvcGVydHlOYW1lKV0gPSBjaGlsZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxvYWRPYmplY3RQcm9wZXJ0aWVzKF9ub2RlOiBOb2RlLCBfb2JqZWN0OiBPYmplY3QpOiBPYmplY3Qge1xyXG4gICAgaWYgKF9vYmplY3QubG9hZGVkKVxyXG4gICAgICByZXR1cm4gX29iamVjdDtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgX25vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgaWYgKGNoaWxkLm5hbWUgPT0gXCJQcm9wZXJ0aWVzNzBcIilcclxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5NzAgb2YgY2hpbGQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGZvcm1hdFByb3BlcnR5TmFtZShwcm9wZXJ0eTcwLnByb3BlcnRpZXNbMF0gYXMgc3RyaW5nKTtcclxuICAgICAgICAgIGlmICghX29iamVjdFtuYW1lXSlcclxuICAgICAgICAgICAgX29iamVjdFtuYW1lXSA9IGdldFByb3BlcnR5NzBWYWx1ZShwcm9wZXJ0eTcwKTtcclxuICAgICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGZvcm1hdFByb3BlcnR5TmFtZShjaGlsZC5uYW1lKTtcclxuICAgICAgICBpZiAoIV9vYmplY3RbbmFtZV0pXHJcbiAgICAgICAgICBfb2JqZWN0W25hbWVdID0gZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIF9vYmplY3QubG9hZGVkID0gdHJ1ZTtcclxuICAgIHJldHVybiBfb2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0UHJvcGVydHlWYWx1ZShfbm9kZTogTm9kZSk6IE5vZGVQcm9wZXJ0eSB8IE9iamVjdCB7XHJcbiAgICByZXR1cm4gX25vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMFxyXG4gICAgICA/IF9ub2RlLmNoaWxkcmVuLnJlZHVjZShcclxuICAgICAgICAoX3N1YlByb3BlcnRpZXMsIF9zdWJQcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gZm9ybWF0UHJvcGVydHlOYW1lKF9zdWJQcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgIGlmIChfc3ViUHJvcGVydGllc1tuYW1lXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIF9zdWJQcm9wZXJ0aWVzW25hbWVdID0gZ2V0UHJvcGVydHlWYWx1ZShfc3ViUHJvcGVydHkpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghKF9zdWJQcm9wZXJ0aWVzW25hbWVdIGluc3RhbmNlb2YgQXJyYXkpKVxyXG4gICAgICAgICAgICAgIF9zdWJQcm9wZXJ0aWVzW25hbWVdID0gW19zdWJQcm9wZXJ0aWVzW25hbWVdIGFzIE9iamVjdF07XHJcbiAgICAgICAgICAgIChfc3ViUHJvcGVydGllc1tuYW1lXSBhcyBPYmplY3RbXSkucHVzaChnZXRQcm9wZXJ0eVZhbHVlKF9zdWJQcm9wZXJ0eSkgYXMgT2JqZWN0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBfc3ViUHJvcGVydGllcztcclxuICAgICAgICB9LFxyXG4gICAgICAgIHt9IGFzIE9iamVjdFxyXG4gICAgICApXHJcbiAgICAgIDogX25vZGUucHJvcGVydGllc1swXTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldFByb3BlcnR5NzBWYWx1ZShfbm9kZTogTm9kZSk6IFByb3BlcnR5NzAge1xyXG4gICAgc3dpdGNoIChfbm9kZS5wcm9wZXJ0aWVzWzFdIGFzIHN0cmluZykge1xyXG4gICAgICBjYXNlIFwiYm9vbFwiOlxyXG4gICAgICAgIHJldHVybiBfbm9kZS5wcm9wZXJ0aWVzWzRdIGFzIGJvb2xlYW47XHJcblxyXG4gICAgICBjYXNlIFwiaW50XCI6XHJcbiAgICAgIGNhc2UgXCJlbnVtXCI6XHJcbiAgICAgIGNhc2UgXCJVTG9uZ0xvbmdcIjpcclxuICAgICAgY2FzZSBcImRvdWJsZVwiOlxyXG4gICAgICBjYXNlIFwiTnVtYmVyXCI6XHJcbiAgICAgIGNhc2UgXCJGaWVsZE9mVmlld1wiOlxyXG4gICAgICAgIHJldHVybiBfbm9kZS5wcm9wZXJ0aWVzWzRdIGFzIG51bWJlcjtcclxuXHJcbiAgICAgIGNhc2UgXCJDb2xvclwiOlxyXG4gICAgICBjYXNlIFwiQ29sb3JSR0JcIjpcclxuICAgICAgY2FzZSBcIlZlY3RvcjNEXCI6XHJcbiAgICAgIGNhc2UgXCJMY2wgVHJhbnNsYXRpb25cIjpcclxuICAgICAgY2FzZSBcIkxjbCBSb3RhdGlvblwiOlxyXG4gICAgICBjYXNlIFwiTGNsIFNjYWxpbmdcIjpcclxuICAgICAgICByZXR1cm4gbmV3IEZ1ZGdlQ29yZS5WZWN0b3IzKC4uLl9ub2RlLnByb3BlcnRpZXMuc2xpY2UoNCwgNykgYXMgbnVtYmVyW10pO1xyXG5cclxuICAgICAgY2FzZSBcIktTdHJpbmdcIjpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gX25vZGUucHJvcGVydGllc1s0XSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eU5hbWUoX25hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gX25hbWUucmVwbGFjZSgvW15hLXpBLVpdLywgXCJcIik7XHJcbiAgfVxyXG5cclxufSIsIm5hbWVzcGFjZSBGQlgge1xyXG4gIC8qKlxyXG4gICAqIFBhcnNlcyBmYngtbm9kZXMgYXJyYXkgZnJvbSBhIGJpbmFyeSBmYngtZmlsZS5cclxuICAgKiBkZXNwaXRlIHRoZSBsYXp5IG5vZGUgaW1wbGVtZW50YXRpb24gaXQgaXMgbW9zdGx5IGEgY29weSBvZiB0aGUgcmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20vcGljb2RlNy9mYngtcGFyc2VyXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBwYXJzZU5vZGVzRnJvbUJpbmFyeShfYnVmZmVyOiBBcnJheUJ1ZmZlcik6IE5vZGVbXSB7XHJcbiAgICBpZiAoX2J1ZmZlci5ieXRlTGVuZ3RoIDwgYmluYXJ5U3RhcnRDaGFycy5sZW5ndGgpXHJcbiAgICAgIHRocm93IFwiTm90IGEgYmluYXJ5IEZCWCBmaWxlXCI7XHJcblxyXG4gICAgY29uc3QgZGF0YTogQnVmZmVyUmVhZGVyID0gbmV3IEJ1ZmZlclJlYWRlcihfYnVmZmVyKTtcclxuICAgIGNvbnN0IGZpcnN0Q2hhcnM6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShkYXRhLmdldFNlcXVlbmNlKGRhdGEuZ2V0VWludDgsIGJpbmFyeVN0YXJ0Q2hhcnMubGVuZ3RoKSk7XHJcbiAgICBjb25zdCBtYXRjaGVzRkJYQmluYXJ5Rmlyc3RDaGFyczogYm9vbGVhblxyXG4gICAgICA9IGZpcnN0Q2hhcnMuZXZlcnkoKF92YWx1ZSwgX2luZGV4KSA9PiBfdmFsdWUgPT0gYmluYXJ5U3RhcnRDaGFyc1tfaW5kZXhdKTtcclxuICAgIGlmICghbWF0Y2hlc0ZCWEJpbmFyeUZpcnN0Q2hhcnMpXHJcbiAgICAgIHRocm93IFwiTm90IGEgYmluYXJ5IEZCWCBmaWxlXCI7XHJcblxyXG4gICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIGNvbnN0IG5vZGVBdHRyaWJ1dGVzQXNVSW50NjQ6IGJvb2xlYW4gPSB2ZXJzaW9uID49IDc1MDA7IC8vIFdhcnVtID49IDc1MDA/XHJcbiAgICBjb25zdCBub2RlczogTm9kZVtdID0gW107XHJcblxyXG4gICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IHJlYWROb2RlKGRhdGEsIG5vZGVBdHRyaWJ1dGVzQXNVSW50NjQpO1xyXG4gICAgICBpZiAobm9kZSA9PSBudWxsKSBicmVhaztcclxuICAgICAgbm9kZXMucHVzaChub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9kZXM7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkTm9kZShfZGF0YTogQnVmZmVyUmVhZGVyLCBfYXR0cmlidXRlc0FzVWludDY0OiBib29sZWFuKTogTm9kZSB7XHJcbiAgICBjb25zdCBlbmRPZmZzZXQ6IG51bWJlciA9IF9hdHRyaWJ1dGVzQXNVaW50NjQgPyBOdW1iZXIoX2RhdGEuZ2V0VWludDY0KCkpIDogX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBpZiAoZW5kT2Zmc2V0ID09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHByb3BlcnRpZXNMZW5ndGg6IG51bWJlciA9IF9hdHRyaWJ1dGVzQXNVaW50NjQgPyBOdW1iZXIoX2RhdGEuZ2V0VWludDY0KCkpIDogX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzQnl0ZUxlbmd0aDogbnVtYmVyID0gX2F0dHJpYnV0ZXNBc1VpbnQ2NCA/IE51bWJlcihfZGF0YS5nZXRVaW50NjQoKSkgOiBfZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIGNvbnN0IG5hbWVMZW5ndGg6IG51bWJlciA9IF9kYXRhLmdldFVpbnQ4KCk7XHJcbiAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBfZGF0YS5nZXRTdHJpbmcobmFtZUxlbmd0aCk7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzT2Zmc2V0OiBudW1iZXIgPSBfZGF0YS5vZmZzZXQ7XHJcbiAgICBjb25zdCBjaGlsZHJlbk9mZnNldDogbnVtYmVyID0gcHJvcGVydGllc09mZnNldCArIHByb3BlcnRpZXNCeXRlTGVuZ3RoO1xyXG5cclxuICAgIGNvbnN0IG5vZGU6IE5vZGUgPSBuZXcgTm9kZShcclxuICAgICAgbmFtZSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIF9kYXRhLm9mZnNldCA9IHByb3BlcnRpZXNPZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydGllczogTm9kZVByb3BlcnR5W10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpUHJvcGVydHk6IG51bWJlciA9IDA7IGlQcm9wZXJ0eSA8IHByb3BlcnRpZXNMZW5ndGg7IGlQcm9wZXJ0eSsrKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocmVhZFByb3BlcnR5KF9kYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgX2RhdGEub2Zmc2V0ID0gY2hpbGRyZW5PZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW46IE5vZGVbXSA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChlbmRPZmZzZXQgLSBfZGF0YS5vZmZzZXQgPiBudWxsQ291bnRBdE5vZGVFbmQpIHtcclxuICAgICAgICAgIGNvbnN0IGNoaWxkOiBGQlguTm9kZSA9IHJlYWROb2RlKF9kYXRhLCBfYXR0cmlidXRlc0FzVWludDY0KTtcclxuICAgICAgICAgIGlmIChjaGlsZCkgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBfZGF0YS5vZmZzZXQgPSBlbmRPZmZzZXQ7XHJcblxyXG4gICAgcmV0dXJuIG5vZGU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkUHJvcGVydHkoX2RhdGE6IEJ1ZmZlclJlYWRlcik6IEZCWC5Ob2RlUHJvcGVydHkge1xyXG4gICAgY29uc3QgdHlwZUNvZGU6IHN0cmluZyA9IF9kYXRhLmdldENoYXIoKTtcclxuXHJcbiAgICBjb25zdCB2YWx1ZTogRkJYLk5vZGVQcm9wZXJ0eSA9IHtcclxuICAgICAgQzogX2RhdGEuZ2V0Qm9vbCxcclxuICAgICAgWTogX2RhdGEuZ2V0SW50MTYsXHJcbiAgICAgIEk6IF9kYXRhLmdldEludDMyLFxyXG4gICAgICBMOiBfZGF0YS5nZXRJbnQ2NCxcclxuICAgICAgRjogX2RhdGEuZ2V0RmxvYXQzMixcclxuICAgICAgRDogX2RhdGEuZ2V0RmxvYXQ2NCxcclxuICAgICAgUzogKCkgPT4gX2RhdGEuZ2V0U3RyaW5nKF9kYXRhLmdldFVpbnQzMigpKS5yZXBsYWNlKFwiXFx4MDBcXHgwMVwiLCBcIjo6XCIpLFxyXG4gICAgICBzOiAoKSA9PiBfZGF0YS5nZXRTdHJpbmcoX2RhdGEuZ2V0VWludDMyKCkpLnJlcGxhY2UoXCJcXHgwMFxceDAxXCIsIFwiOjpcIiksXHJcbiAgICAgIFI6ICgpID0+IG5ldyBVaW50OEFycmF5KHJlYWRSYXcoX2RhdGEsIF9kYXRhLmdldFVpbnQ4KSksXHJcbiAgICAgIHI6ICgpID0+IG5ldyBVaW50OEFycmF5KHJlYWRBcnJheShfZGF0YSwgX2RhdGEuZ2V0VWludDgpKSxcclxuICAgICAgYjogKCkgPT4gbmV3IFVpbnQ4QXJyYXkocmVhZEFycmF5KF9kYXRhLCBfZGF0YS5nZXRVaW50OCkpLFxyXG4gICAgICBpOiAoKSA9PiBuZXcgSW50MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEludDMyKSksXHJcbiAgICAgIGw6ICgpID0+IG5ldyBCaWdJbnQ2NEFycmF5KHJlYWRBcnJheShfZGF0YSwgX2RhdGEuZ2V0SW50NjQpKSxcclxuICAgICAgZjogKCkgPT4gbmV3IEZsb2F0MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEZsb2F0MzIpKSxcclxuICAgICAgZDogKCkgPT4gbmV3IEZsb2F0MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEZsb2F0NjQpKVxyXG4gICAgfVt0eXBlQ29kZV0/LmNhbGwoX2RhdGEpO1xyXG5cclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxyXG4gICAgICBGdWRnZUNvcmUuRGVidWcud2FybihgVW5rbm93biBwcm9wZXJ0eSB0eXBlICR7dHlwZUNvZGUuY2hhckNvZGVBdCgwKX1gKTtcclxuXHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkQXJyYXk8VCBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oX2RhdGE6IEJ1ZmZlclJlYWRlciwgX2dldHRlcjogKCkgPT4gVCk6IEdlbmVyYXRvcjxUPiB7XHJcbiAgICBjb25zdCBsZW5ndGg6IG51bWJlciA9IF9kYXRhLmdldFVpbnQzMigpO1xyXG4gICAgY29uc3QgZW5jb2Rpbmc6IEZCWC5BUlJBWV9FTkNPRElORyA9IF9kYXRhLmdldFVpbnQzMigpO1xyXG4gICAgY29uc3QgYnl0ZUxlbmd0aDogbnVtYmVyID0gX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBjb25zdCBlbmRPZmZzZXQ6IG51bWJlciA9IF9kYXRhLm9mZnNldCArIGJ5dGVMZW5ndGg7XHJcblxyXG4gICAgY29uc3QgaXRlcmFibGU6IEdlbmVyYXRvcjxUPiA9IGVuY29kaW5nID09IEZCWC5BUlJBWV9FTkNPRElORy5DT01QUkVTU0VEID9cclxuICAgICAgKCgpID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheURhdGE6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShfZGF0YS52aWV3LmJ1ZmZlciwgX2RhdGEub2Zmc2V0LCBieXRlTGVuZ3RoKTtcclxuICAgICAgICBjb25zdCBpbmZsYXRlZERhdGE6IFVpbnQ4QXJyYXkgPSAoUmVmbGVjdC5nZXQoZ2xvYmFsVGhpcywgXCJwYWtvXCIpID8gcGFrby5pbmZsYXRlIDogZmZsYXRlLmluZmxhdGVTeW5jKShhcnJheURhdGEpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyUmVhZGVyKGluZmxhdGVkRGF0YS5idWZmZXIpLmdldFNlcXVlbmNlKF9nZXR0ZXIsIGxlbmd0aCk7XHJcbiAgICAgIH0pKCkgOlxyXG4gICAgICBfZGF0YS5nZXRTZXF1ZW5jZShfZ2V0dGVyLCBsZW5ndGgpO1xyXG5cclxuICAgIF9kYXRhLm9mZnNldCA9IGVuZE9mZnNldDtcclxuXHJcbiAgICByZXR1cm4gaXRlcmFibGU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkUmF3PFQgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KF9kYXRhOiBCdWZmZXJSZWFkZXIsIF9nZXR0ZXI6ICgpID0+IFQpOiBHZW5lcmF0b3I8VD4ge1xyXG4gICAgLy8gcmF3IGJpbmFyeSBkYXRhIG5lZWRzIHRvIGJlIGludGVycHJldGVkIGluIGEgc3BlY2lhbCB3YXkgc2VlOlxyXG4gICAgLy8gaHR0cHM6Ly9jb2RlLmJsZW5kZXIub3JnLzIwMTMvMDgvZmJ4LWJpbmFyeS1maWxlLWZvcm1hdC1zcGVjaWZpY2F0aW9uL1xyXG4gICAgY29uc3QgbGVuZ3RoOiBudW1iZXIgPSBfZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIHJldHVybiBfZGF0YS5nZXRTZXF1ZW5jZShfZ2V0dGVyLCBsZW5ndGgpOztcclxuICB9XHJcblxyXG4gIGNvbnN0IGJpbmFyeVN0YXJ0Q2hhcnM6IFVpbnQ4QXJyYXlcclxuICAgID0gVWludDhBcnJheS5mcm9tKFwiS2F5ZGFyYSBGQlggQmluYXJ5XFx4MjBcXHgyMFxceDAwXFx4MWFcXHgwMFwiLnNwbGl0KFwiXCIpLCBfdiA9PiBfdi5jaGFyQ29kZUF0KDApKTtcclxuXHJcbiAgY29uc3QgbnVsbENvdW50QXROb2RlRW5kOiBudW1iZXIgPSAxMztcclxuXHJcbn0iLCJuYW1lc3BhY2UgR0xURiB7XHJcbiAgZXhwb3J0IHR5cGUgR2xUZklkID0gbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIEFuIG9iamVjdCBwb2ludGluZyB0byBhIGJ1ZmZlciB2aWV3IGNvbnRhaW5pbmcgdGhlIGluZGljZXMgb2YgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy4gVGhlIG51bWJlciBvZiBpbmRpY2VzIGlzIGVxdWFsIHRvIGBhY2Nlc3Nvci5zcGFyc2UuY291bnRgLiBJbmRpY2VzICoqTVVTVCoqIHN0cmljdGx5IGluY3JlYXNlLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzb3JTcGFyc2VJbmRpY2VzIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBidWZmZXIgdmlldyB3aXRoIHNwYXJzZSBpbmRpY2VzLiBUaGUgcmVmZXJlbmNlZCBidWZmZXIgdmlldyAqKk1VU1QgTk9UKiogaGF2ZSBpdHMgYHRhcmdldGAgb3IgYGJ5dGVTdHJpZGVgIHByb3BlcnRpZXMgZGVmaW5lZC4gVGhlIGJ1ZmZlciB2aWV3IGFuZCB0aGUgb3B0aW9uYWwgYGJ5dGVPZmZzZXRgICoqTVVTVCoqIGJlIGFsaWduZWQgdG8gdGhlIGBjb21wb25lbnRUeXBlYCBieXRlIGxlbmd0aC5cclxuICAgICAqL1xyXG4gICAgXCJidWZmZXJWaWV3XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciB2aWV3IGluIGJ5dGVzLlxyXG4gICAgICovXHJcbiAgICBcImJ5dGVPZmZzZXRcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGljZXMgZGF0YSB0eXBlLlxyXG4gICAgICovXHJcbiAgICBcImNvbXBvbmVudFR5cGVcIjogQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURSB8IENPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUIHwgQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfSU5UO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpcyBlcXVhbCB0byBgYWNjZXNzb3Iuc3BhcnNlLmNvdW50YCB0aW1lcyBudW1iZXIgb2YgY29tcG9uZW50cy4gVGhlIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIGJhc2UgYWNjZXNzb3IuIFRoZSBlbGVtZW50cyBhcmUgdGlnaHRseSBwYWNrZWQuIERhdGEgKipNVVNUKiogYmUgYWxpZ25lZCBmb2xsb3dpbmcgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIGJhc2UgYWNjZXNzb3IuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NvclNwYXJzZVZhbHVlcyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgYnVmZmVyVmlldyB3aXRoIHNwYXJzZSB2YWx1ZXMuIFRoZSByZWZlcmVuY2VkIGJ1ZmZlciB2aWV3ICoqTVVTVCBOT1QqKiBoYXZlIGl0cyBgdGFyZ2V0YCBvciBgYnl0ZVN0cmlkZWAgcHJvcGVydGllcyBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdcIjogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyVmlldyBpbiBieXRlcy5cclxuICAgICAqL1xyXG4gICAgXCJieXRlT2Zmc2V0XCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTcGFyc2Ugc3RvcmFnZSBvZiBhY2Nlc3NvciB2YWx1ZXMgdGhhdCBkZXZpYXRlIGZyb20gdGhlaXIgaW5pdGlhbGl6YXRpb24gdmFsdWUuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NvclNwYXJzZSB7XHJcbiAgICAvKipcclxuICAgICAqIE51bWJlciBvZiBkZXZpYXRpbmcgYWNjZXNzb3IgdmFsdWVzIHN0b3JlZCBpbiB0aGUgc3BhcnNlIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBcImNvdW50XCI6IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiBkZXZpYXRpbmcgYWNjZXNzb3IgdmFsdWVzLiBUaGUgbnVtYmVyIG9mIGluZGljZXMgaXMgZXF1YWwgdG8gYGNvdW50YC4gSW5kaWNlcyAqKk1VU1QqKiBzdHJpY3RseSBpbmNyZWFzZS5cclxuICAgICAqL1xyXG4gICAgXCJpbmRpY2VzXCI6IEFjY2Vzc29yU3BhcnNlSW5kaWNlcztcclxuICAgIC8qKlxyXG4gICAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgXCJ2YWx1ZXNcIjogQWNjZXNzb3JTcGFyc2VWYWx1ZXM7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHR5cGVkIHZpZXcgaW50byBhIGJ1ZmZlciB2aWV3IHRoYXQgY29udGFpbnMgcmF3IGJpbmFyeSBkYXRhLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzb3Ige1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlclZpZXcuXHJcbiAgICAgKi9cclxuICAgIFwiYnVmZmVyVmlld1wiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIHZpZXcgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZU9mZnNldFwiPzogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YXR5cGUgb2YgdGhlIGFjY2Vzc29yJ3MgY29tcG9uZW50cy5cclxuICAgICAqL1xyXG4gICAgXCJjb21wb25lbnRUeXBlXCI6IENPTVBPTkVOVF9UWVBFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBpbnRlZ2VyIGRhdGEgdmFsdWVzIGFyZSBub3JtYWxpemVkIGJlZm9yZSB1c2FnZS5cclxuICAgICAqL1xyXG4gICAgXCJub3JtYWxpemVkXCI/OiBib29sZWFuO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhpcyBhY2Nlc3Nvci5cclxuICAgICAqL1xyXG4gICAgXCJjb3VudFwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFNwZWNpZmllcyBpZiB0aGUgYWNjZXNzb3IncyBlbGVtZW50cyBhcmUgc2NhbGFycywgdmVjdG9ycywgb3IgbWF0cmljZXMuXHJcbiAgICAgKi9cclxuICAgIFwidHlwZVwiOiBBQ0NFU1NPUl9UWVBFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNYXhpbXVtIHZhbHVlIG9mIGVhY2ggY29tcG9uZW50IGluIHRoaXMgYWNjZXNzb3IuXHJcbiAgICAgKi9cclxuICAgIFwibWF4XCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogTWluaW11bSB2YWx1ZSBvZiBlYWNoIGNvbXBvbmVudCBpbiB0aGlzIGFjY2Vzc29yLlxyXG4gICAgICovXHJcbiAgICBcIm1pblwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFNwYXJzZSBzdG9yYWdlIG9mIGVsZW1lbnRzIHRoYXQgZGV2aWF0ZSBmcm9tIHRoZWlyIGluaXRpYWxpemF0aW9uIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBcInNwYXJzZVwiPzogQWNjZXNzb3JTcGFyc2U7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjYWNjZXNzb3ItZGF0YS10eXBlc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIENPTVBPTkVOVF9UWVBFIHtcclxuICAgIEJZVEUgPSA1MTIwLFxyXG4gICAgVU5TSUdORURfQllURSA9IDUxMjEsXHJcbiAgICBTSE9SVCA9IDUxMjIsXHJcbiAgICBVTlNJR05FRF9TSE9SVCA9IDUxMjMsXHJcbiAgICBVTlNJR05FRF9JTlQgPSA1MTI1LFxyXG4gICAgRkxPQVQgPSA1MTI2XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBBQ0NFU1NPUl9UWVBFIHtcclxuICAgIFNDQUxBUiA9IFwiU0NBTEFSXCIsXHJcbiAgICBWRUMyID0gXCJWRUMyXCIsXHJcbiAgICBWRUMzID0gXCJWRUMzXCIsXHJcbiAgICBWRUM0ID0gXCJWRUM0XCIsXHJcbiAgICBNQVQyID0gXCJNQVQyXCIsXHJcbiAgICBNQVQzID0gXCJNQVQzXCIsXHJcbiAgICBNQVQ0ID0gXCJNQVQ0XCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBhbmltYXRlZCBwcm9wZXJ0eS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvbkNoYW5uZWxUYXJnZXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdG8gYW5pbWF0ZS4gV2hlbiB1bmRlZmluZWQsIHRoZSBhbmltYXRlZCBvYmplY3QgKipNQVkqKiBiZSBkZWZpbmVkIGJ5IGFuIGV4dGVuc2lvbi5cclxuICAgICAqL1xyXG4gICAgXCJub2RlXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBub2RlJ3MgVFJTIHByb3BlcnR5IHRvIGFuaW1hdGUsIG9yIHRoZSBgXCJ3ZWlnaHRzXCJgIG9mIHRoZSBNb3JwaCBUYXJnZXRzIGl0IGluc3RhbnRpYXRlcy4gRm9yIHRoZSBgXCJ0cmFuc2xhdGlvblwiYCBwcm9wZXJ0eSwgdGhlIHZhbHVlcyB0aGF0IGFyZSBwcm92aWRlZCBieSB0aGUgc2FtcGxlciBhcmUgdGhlIHRyYW5zbGF0aW9uIGFsb25nIHRoZSBYLCBZLCBhbmQgWiBheGVzLiBGb3IgdGhlIGBcInJvdGF0aW9uXCJgIHByb3BlcnR5LCB0aGUgdmFsdWVzIGFyZSBhIHF1YXRlcm5pb24gaW4gdGhlIG9yZGVyICh4LCB5LCB6LCB3KSwgd2hlcmUgdyBpcyB0aGUgc2NhbGFyLiBGb3IgdGhlIGBcInNjYWxlXCJgIHByb3BlcnR5LCB0aGUgdmFsdWVzIGFyZSB0aGUgc2NhbGluZyBmYWN0b3JzIGFsb25nIHRoZSBYLCBZLCBhbmQgWiBheGVzLlxyXG4gICAgICovXHJcbiAgICBcInBhdGhcIjogXCJ0cmFuc2xhdGlvblwiIHwgXCJyb3RhdGlvblwiIHwgXCJzY2FsZVwiIHwgXCJ3ZWlnaHRzXCI7IC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNhbmltYXRpb25zXHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBbiBhbmltYXRpb24gY2hhbm5lbCBjb21iaW5lcyBhbiBhbmltYXRpb24gc2FtcGxlciB3aXRoIGEgdGFyZ2V0IHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uQ2hhbm5lbCB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiBhIHNhbXBsZXIgaW4gdGhpcyBhbmltYXRpb24gdXNlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBmb3IgdGhlIHRhcmdldC5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyXCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGFuaW1hdGVkIHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBcInRhcmdldFwiOiBBbmltYXRpb25DaGFubmVsVGFyZ2V0O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gYW5pbWF0aW9uIHNhbXBsZXIgY29tYmluZXMgdGltZXN0YW1wcyB3aXRoIGEgc2VxdWVuY2Ugb2Ygb3V0cHV0IHZhbHVlcyBhbmQgZGVmaW5lcyBhbiBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvblNhbXBsZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgYW4gYWNjZXNzb3IgY29udGFpbmluZyBrZXlmcmFtZSB0aW1lc3RhbXBzLlxyXG4gICAgICovXHJcbiAgICBcImlucHV0XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJwb2xhdGlvbiBhbGdvcml0aG0uXHJcbiAgICAgKi9cclxuICAgIFwiaW50ZXJwb2xhdGlvblwiPzogXCJMSU5FQVJcIiB8IFwiU1RFUFwiIHwgXCJDVUJJQ1NQTElORVwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgYW4gYWNjZXNzb3IsIGNvbnRhaW5pbmcga2V5ZnJhbWUgb3V0cHV0IHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgXCJvdXRwdXRcIjogR2xUZklkO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBrZXlmcmFtZSBhbmltYXRpb24uXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb24ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBhbmltYXRpb24gY2hhbm5lbHMuIEFuIGFuaW1hdGlvbiBjaGFubmVsIGNvbWJpbmVzIGFuIGFuaW1hdGlvbiBzYW1wbGVyIHdpdGggYSB0YXJnZXQgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIERpZmZlcmVudCBjaGFubmVscyBvZiB0aGUgc2FtZSBhbmltYXRpb24gKipNVVNUIE5PVCoqIGhhdmUgdGhlIHNhbWUgdGFyZ2V0cy5cclxuICAgICAqL1xyXG4gICAgXCJjaGFubmVsc1wiOiBBbmltYXRpb25DaGFubmVsW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGFuaW1hdGlvbiBzYW1wbGVycy4gQW4gYW5pbWF0aW9uIHNhbXBsZXIgY29tYmluZXMgdGltZXN0YW1wcyB3aXRoIGEgc2VxdWVuY2Ugb2Ygb3V0cHV0IHZhbHVlcyBhbmQgZGVmaW5lcyBhbiBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyc1wiOiBBbmltYXRpb25TYW1wbGVyW107XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE1ldGFkYXRhIGFib3V0IHRoZSBnbFRGIGFzc2V0LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNzZXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNvcHlyaWdodCBtZXNzYWdlIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIGNyZWRpdCB0aGUgY29udGVudCBjcmVhdG9yLlxyXG4gICAgICovXHJcbiAgICBcImNvcHlyaWdodFwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUb29sIHRoYXQgZ2VuZXJhdGVkIHRoaXMgZ2xURiBtb2RlbC4gIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxyXG4gICAgICovXHJcbiAgICBcImdlbmVyYXRvclwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ2xURiB2ZXJzaW9uIGluIHRoZSBmb3JtIG9mIGA8bWFqb3I+LjxtaW5vcj5gIHRoYXQgdGhpcyBhc3NldCB0YXJnZXRzLlxyXG4gICAgICovXHJcbiAgICBcInZlcnNpb25cIjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWluaW11bSBnbFRGIHZlcnNpb24gaW4gdGhlIGZvcm0gb2YgYDxtYWpvcj4uPG1pbm9yPmAgdGhhdCB0aGlzIGFzc2V0IHRhcmdldHMuIFRoaXMgcHJvcGVydHkgKipNVVNUIE5PVCoqIGJlIGdyZWF0ZXIgdGhhbiB0aGUgYXNzZXQgdmVyc2lvbi5cclxuICAgICAqL1xyXG4gICAgXCJtaW5WZXJzaW9uXCI/OiBzdHJpbmc7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIGJ1ZmZlciBwb2ludHMgdG8gYmluYXJ5IGdlb21ldHJ5LCBhbmltYXRpb24sIG9yIHNraW5zLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIFVSSSAob3IgSVJJKSBvZiB0aGUgYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBcInVyaVwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZUxlbmd0aFwiOiBudW1iZXI7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgdmlldyBpbnRvIGEgYnVmZmVyIGdlbmVyYWxseSByZXByZXNlbnRpbmcgYSBzdWJzZXQgb2YgdGhlIGJ1ZmZlci5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEJ1ZmZlclZpZXcge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgXCJidWZmZXJcIjogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBpbiBieXRlcy5cclxuICAgICAqL1xyXG4gICAgXCJieXRlT2Zmc2V0XCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlclZpZXcgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZUxlbmd0aFwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzdHJpZGUsIGluIGJ5dGVzLlxyXG4gICAgICovXHJcbiAgICBcImJ5dGVTdHJpZGVcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhpbnQgcmVwcmVzZW50aW5nIHRoZSBpbnRlbmRlZCBHUFUgYnVmZmVyIHR5cGUgdG8gdXNlIHdpdGggdGhpcyBidWZmZXIgdmlldy5cclxuICAgICAqL1xyXG4gICAgXCJ0YXJnZXRcIj86IG51bWJlciB8IG51bWJlciB8IG51bWJlcjtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gb3J0aG9ncmFwaGljIGNhbWVyYSBjb250YWluaW5nIHByb3BlcnRpZXMgdG8gY3JlYXRlIGFuIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeC5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIENhbWVyYU9ydGhvZ3JhcGhpYyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCBob3Jpem9udGFsIG1hZ25pZmljYXRpb24gb2YgdGhlIHZpZXcuIFRoaXMgdmFsdWUgKipNVVNUIE5PVCoqIGJlIGVxdWFsIHRvIHplcm8uIFRoaXMgdmFsdWUgKipTSE9VTEQgTk9UKiogYmUgbmVnYXRpdmUuXHJcbiAgICAgKi9cclxuICAgIFwieG1hZ1wiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCB2ZXJ0aWNhbCBtYWduaWZpY2F0aW9uIG9mIHRoZSB2aWV3LiBUaGlzIHZhbHVlICoqTVVTVCBOT1QqKiBiZSBlcXVhbCB0byB6ZXJvLiBUaGlzIHZhbHVlICoqU0hPVUxEIE5PVCoqIGJlIG5lZ2F0aXZlLlxyXG4gICAgICovXHJcbiAgICBcInltYWdcIjogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgZGlzdGFuY2UgdG8gdGhlIGZhciBjbGlwcGluZyBwbGFuZS4gVGhpcyB2YWx1ZSAqKk1VU1QgTk9UKiogYmUgZXF1YWwgdG8gemVyby4gYHpmYXJgICoqTVVTVCoqIGJlIGdyZWF0ZXIgdGhhbiBgem5lYXJgLlxyXG4gICAgICovXHJcbiAgICBcInpmYXJcIjogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgZGlzdGFuY2UgdG8gdGhlIG5lYXIgY2xpcHBpbmcgcGxhbmUuXHJcbiAgICAgKi9cclxuICAgIFwiem5lYXJcIjogbnVtYmVyO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBwZXJzcGVjdGl2ZSBjYW1lcmEgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2FtZXJhUGVyc3BlY3RpdmUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgYXNwZWN0IHJhdGlvIG9mIHRoZSBmaWVsZCBvZiB2aWV3LlxyXG4gICAgICovXHJcbiAgICBcImFzcGVjdFJhdGlvXCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCB2ZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnMuIFRoaXMgdmFsdWUgKipTSE9VTEQqKiBiZSBsZXNzIHRoYW4gz4AuXHJcbiAgICAgKi9cclxuICAgIFwieWZvdlwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCBkaXN0YW5jZSB0byB0aGUgZmFyIGNsaXBwaW5nIHBsYW5lLlxyXG4gICAgICovXHJcbiAgICBcInpmYXJcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZsb2F0aW5nLXBvaW50IGRpc3RhbmNlIHRvIHRoZSBuZWFyIGNsaXBwaW5nIHBsYW5lLlxyXG4gICAgICovXHJcbiAgICBcInpuZWFyXCI6IG51bWJlcjtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgY2FtZXJhJ3MgcHJvamVjdGlvbi4gIEEgbm9kZSAqKk1BWSoqIHJlZmVyZW5jZSBhIGNhbWVyYSB0byBhcHBseSBhIHRyYW5zZm9ybSB0byBwbGFjZSB0aGUgY2FtZXJhIGluIHRoZSBzY2VuZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIENhbWVyYSB7XHJcbiAgICAvKipcclxuICAgICAqIEFuIG9ydGhvZ3JhcGhpYyBjYW1lcmEgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhbiBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXguIFRoaXMgcHJvcGVydHkgKipNVVNUIE5PVCoqIGJlIGRlZmluZWQgd2hlbiBgcGVyc3BlY3RpdmVgIGlzIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwib3J0aG9ncmFwaGljXCI/OiBDYW1lcmFPcnRob2dyYXBoaWM7XHJcbiAgICAvKipcclxuICAgICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBjcmVhdGUgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeC4gVGhpcyBwcm9wZXJ0eSAqKk1VU1QgTk9UKiogYmUgZGVmaW5lZCB3aGVuIGBvcnRob2dyYXBoaWNgIGlzIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwicGVyc3BlY3RpdmVcIj86IENhbWVyYVBlcnNwZWN0aXZlO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIGNhbWVyYSB1c2VzIGEgcGVyc3BlY3RpdmUgb3Igb3J0aG9ncmFwaGljIHByb2plY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIFwidHlwZVwiOiBhbnkgfCBhbnkgfCBzdHJpbmc7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEltYWdlIGRhdGEgdXNlZCB0byBjcmVhdGUgYSB0ZXh0dXJlLiBJbWFnZSAqKk1BWSoqIGJlIHJlZmVyZW5jZWQgYnkgYW4gVVJJIChvciBJUkkpIG9yIGEgYnVmZmVyIHZpZXcgaW5kZXguXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBJbWFnZSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBVUkkgKG9yIElSSSkgb2YgdGhlIGltYWdlLlxyXG4gICAgICovXHJcbiAgICBcInVyaVwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW1hZ2UncyBtZWRpYSB0eXBlLiBUaGlzIGZpZWxkICoqTVVTVCoqIGJlIGRlZmluZWQgd2hlbiBgYnVmZmVyVmlld2AgaXMgZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgXCJtaW1lVHlwZVwiPzogYW55IHwgYW55IHwgc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlclZpZXcgdGhhdCBjb250YWlucyB0aGUgaW1hZ2UuIFRoaXMgZmllbGQgKipNVVNUIE5PVCoqIGJlIGRlZmluZWQgd2hlbiBgdXJpYCBpcyBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdcIj86IEdsVGZJZDtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVmZXJlbmNlIHRvIGEgdGV4dHVyZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFRleHR1cmVJbmZvIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcImluZGV4XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNldCBpbmRleCBvZiB0ZXh0dXJlJ3MgVEVYQ09PUkQgYXR0cmlidXRlIHVzZWQgZm9yIHRleHR1cmUgY29vcmRpbmF0ZSBtYXBwaW5nLlxyXG4gICAgICovXHJcbiAgICBcInRleENvb3JkXCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHNldCBvZiBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBtZXRhbGxpYy1yb3VnaG5lc3MgbWF0ZXJpYWwgbW9kZWwgZnJvbSBQaHlzaWNhbGx5LUJhc2VkIFJlbmRlcmluZyAoUEJSKSBtZXRob2RvbG9neS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsUGJyTWV0YWxsaWNSb3VnaG5lc3Mge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmFjdG9ycyBmb3IgdGhlIGJhc2UgY29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcImJhc2VDb2xvckZhY3RvclwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBiYXNlIGNvbG9yIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwiYmFzZUNvbG9yVGV4dHVyZVwiPzogVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3IgZm9yIHRoZSBtZXRhbG5lc3Mgb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcIm1ldGFsbGljRmFjdG9yXCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3IgZm9yIHRoZSByb3VnaG5lc3Mgb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcInJvdWdobmVzc0ZhY3RvclwiPzogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWV0YWxsaWMtcm91Z2huZXNzIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwibWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlXCI/OiBUZXh0dXJlSW5mbztcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWF0ZXJpYWxOb3JtYWxUZXh0dXJlSW5mbyB7XHJcbiAgICBcImluZGV4XCI/OiBhbnk7XHJcbiAgICBcInRleENvb3JkXCI/OiBhbnk7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzY2FsYXIgcGFyYW1ldGVyIGFwcGxpZWQgdG8gZWFjaCBub3JtYWwgdmVjdG9yIG9mIHRoZSBub3JtYWwgdGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgXCJzY2FsZVwiPzogbnVtYmVyO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbE9jY2x1c2lvblRleHR1cmVJbmZvIHtcclxuICAgIFwiaW5kZXhcIj86IGFueTtcclxuICAgIFwidGV4Q29vcmRcIj86IGFueTtcclxuICAgIC8qKlxyXG4gICAgICogQSBzY2FsYXIgbXVsdGlwbGllciBjb250cm9sbGluZyB0aGUgYW1vdW50IG9mIG9jY2x1c2lvbiBhcHBsaWVkLlxyXG4gICAgICovXHJcbiAgICBcInN0cmVuZ3RoXCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUaGUgbWF0ZXJpYWwgYXBwZWFyYW5jZSBvZiBhIHByaW1pdGl2ZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsIHtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNldCBvZiBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBtZXRhbGxpYy1yb3VnaG5lc3MgbWF0ZXJpYWwgbW9kZWwgZnJvbSBQaHlzaWNhbGx5IEJhc2VkIFJlbmRlcmluZyAoUEJSKSBtZXRob2RvbG9neS4gV2hlbiB1bmRlZmluZWQsIGFsbCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgYHBick1ldGFsbGljUm91Z2huZXNzYCAqKk1VU1QqKiBhcHBseS5cclxuICAgICAqL1xyXG4gICAgXCJwYnJNZXRhbGxpY1JvdWdobmVzc1wiPzogTWF0ZXJpYWxQYnJNZXRhbGxpY1JvdWdobmVzcztcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRhbmdlbnQgc3BhY2Ugbm9ybWFsIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwibm9ybWFsVGV4dHVyZVwiPzogTWF0ZXJpYWxOb3JtYWxUZXh0dXJlSW5mbztcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9jY2x1c2lvbiB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcIm9jY2x1c2lvblRleHR1cmVcIj86IE1hdGVyaWFsT2NjbHVzaW9uVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBlbWlzc2l2ZSB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcImVtaXNzaXZlVGV4dHVyZVwiPzogVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3JzIGZvciB0aGUgZW1pc3NpdmUgY29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcImVtaXNzaXZlRmFjdG9yXCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIHJlbmRlcmluZyBtb2RlIG9mIHRoZSBtYXRlcmlhbC5cclxuICAgICAqL1xyXG4gICAgXCJhbHBoYU1vZGVcIj86IFwiT1BBUVVFXCIgfCBcIk1BU0tcIiB8IFwiQkxFTkRcIjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIGN1dG9mZiB2YWx1ZSBvZiB0aGUgbWF0ZXJpYWwuXHJcbiAgICAgKi9cclxuICAgIFwiYWxwaGFDdXRvZmZcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGRvdWJsZSBzaWRlZC5cclxuICAgICAqL1xyXG4gICAgXCJkb3VibGVTaWRlZFwiPzogYm9vbGVhbjtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdlb21ldHJ5IHRvIGJlIHJlbmRlcmVkIHdpdGggdGhlIGdpdmVuIG1hdGVyaWFsLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzaFByaW1pdGl2ZSB7XHJcbiAgICAvKipcclxuICAgICAqIEEgcGxhaW4gSlNPTiBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgbWVzaCBhdHRyaWJ1dGUgc2VtYW50aWMgYW5kIGVhY2ggdmFsdWUgaXMgdGhlIGluZGV4IG9mIHRoZSBhY2Nlc3NvciBjb250YWluaW5nIGF0dHJpYnV0ZSdzIGRhdGEuXHJcbiAgICAgKi9cclxuICAgIFwiYXR0cmlidXRlc1wiOiB7XHJcbiAgICAgIFtrOiBzdHJpbmddOiBHbFRmSWQ7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGFjY2Vzc29yIHRoYXQgY29udGFpbnMgdGhlIHZlcnRleCBpbmRpY2VzLlxyXG4gICAgICovXHJcbiAgICBcImluZGljZXNcIj86IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBtYXRlcmlhbCB0byBhcHBseSB0byB0aGlzIHByaW1pdGl2ZSB3aGVuIHJlbmRlcmluZy5cclxuICAgICAqL1xyXG4gICAgXCJtYXRlcmlhbFwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdG9wb2xvZ3kgdHlwZSBvZiBwcmltaXRpdmVzIHRvIHJlbmRlci5cclxuICAgICAqL1xyXG4gICAgXCJtb2RlXCI/OiBNRVNIX1BSSU1JVElWRV9NT0RFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBtb3JwaCB0YXJnZXRzLlxyXG4gICAgICovXHJcbiAgICBcInRhcmdldHNcIj86IHtcclxuICAgICAgW2s6IHN0cmluZ106IEdsVGZJZDtcclxuICAgIH1bXTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBNRVNIX1BSSU1JVElWRV9NT0RFIHtcclxuICAgIFBPSU5UUyxcclxuICAgIExJTkVTLFxyXG4gICAgTElORV9MT09QLFxyXG4gICAgTElORV9TVFJJUCxcclxuICAgIFRSSUFOR0xFUyxcclxuICAgIFRSSUFOR0xFX1NUUklQLFxyXG4gICAgVFJJQU5HTEVfRkFOXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHNldCBvZiBwcmltaXRpdmVzIHRvIGJlIHJlbmRlcmVkLiAgSXRzIGdsb2JhbCB0cmFuc2Zvcm0gaXMgZGVmaW5lZCBieSBhIG5vZGUgdGhhdCByZWZlcmVuY2VzIGl0LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzaCB7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHByaW1pdGl2ZXMsIGVhY2ggZGVmaW5pbmcgZ2VvbWV0cnkgdG8gYmUgcmVuZGVyZWQuXHJcbiAgICAgKi9cclxuICAgIFwicHJpbWl0aXZlc1wiOiBNZXNoUHJpbWl0aXZlW107XHJcbiAgICAvKipcclxuICAgICAqIEFycmF5IG9mIHdlaWdodHMgdG8gYmUgYXBwbGllZCB0byB0aGUgbW9ycGggdGFyZ2V0cy4gVGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqKk1VU1QqKiBtYXRjaCB0aGUgbnVtYmVyIG9mIG1vcnBoIHRhcmdldHMuXHJcbiAgICAgKi9cclxuICAgIFwid2VpZ2h0c1wiPzogbnVtYmVyW107XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgbm9kZSBpbiB0aGUgbm9kZSBoaWVyYXJjaHkuICBXaGVuIHRoZSBub2RlIGNvbnRhaW5zIGBza2luYCwgYWxsIGBtZXNoLnByaW1pdGl2ZXNgICoqTVVTVCoqIGNvbnRhaW4gYEpPSU5UU18wYCBhbmQgYFdFSUdIVFNfMGAgYXR0cmlidXRlcy4gIEEgbm9kZSAqKk1BWSoqIGhhdmUgZWl0aGVyIGEgYG1hdHJpeGAgb3IgYW55IGNvbWJpbmF0aW9uIG9mIGB0cmFuc2xhdGlvbmAvYHJvdGF0aW9uYC9gc2NhbGVgIChUUlMpIHByb3BlcnRpZXMuIFRSUyBwcm9wZXJ0aWVzIGFyZSBjb252ZXJ0ZWQgdG8gbWF0cmljZXMgYW5kIHBvc3RtdWx0aXBsaWVkIGluIHRoZSBgVCAqIFIgKiBTYCBvcmRlciB0byBjb21wb3NlIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXg7IGZpcnN0IHRoZSBzY2FsZSBpcyBhcHBsaWVkIHRvIHRoZSB2ZXJ0aWNlcywgdGhlbiB0aGUgcm90YXRpb24sIGFuZCB0aGVuIHRoZSB0cmFuc2xhdGlvbi4gSWYgbm9uZSBhcmUgcHJvdmlkZWQsIHRoZSB0cmFuc2Zvcm0gaXMgdGhlIGlkZW50aXR5LiBXaGVuIGEgbm9kZSBpcyB0YXJnZXRlZCBmb3IgYW5pbWF0aW9uIChyZWZlcmVuY2VkIGJ5IGFuIGFuaW1hdGlvbi5jaGFubmVsLnRhcmdldCksIGBtYXRyaXhgICoqTVVTVCBOT1QqKiBiZSBwcmVzZW50LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTm9kZSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2FtZXJhIHJlZmVyZW5jZWQgYnkgdGhpcyBub2RlLlxyXG4gICAgICovXHJcbiAgICBcImNhbWVyYVwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kaWNlcyBvZiB0aGlzIG5vZGUncyBjaGlsZHJlbi5cclxuICAgICAqL1xyXG4gICAgXCJjaGlsZHJlblwiPzogR2xUZklkW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgc2tpbiByZWZlcmVuY2VkIGJ5IHRoaXMgbm9kZS5cclxuICAgICAqL1xyXG4gICAgXCJza2luXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIEEgZmxvYXRpbmctcG9pbnQgNHg0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBzdG9yZWQgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1hdHJpeFwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgbWVzaCBpbiB0aGlzIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIFwibWVzaFwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9kZSdzIHVuaXQgcXVhdGVybmlvbiByb3RhdGlvbiBpbiB0aGUgb3JkZXIgKHgsIHksIHosIHcpLCB3aGVyZSB3IGlzIHRoZSBzY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIFwicm90YXRpb25cIj86IG51bWJlcltdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9kZSdzIG5vbi11bmlmb3JtIHNjYWxlLCBnaXZlbiBhcyB0aGUgc2NhbGluZyBmYWN0b3JzIGFsb25nIHRoZSB4LCB5LCBhbmQgeiBheGVzLlxyXG4gICAgICovXHJcbiAgICBcInNjYWxlXCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5vZGUncyB0cmFuc2xhdGlvbiBhbG9uZyB0aGUgeCwgeSwgYW5kIHogYXhlcy5cclxuICAgICAqL1xyXG4gICAgXCJ0cmFuc2xhdGlvblwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3ZWlnaHRzIG9mIHRoZSBpbnN0YW50aWF0ZWQgbW9ycGggdGFyZ2V0LiBUaGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICoqTVVTVCoqIG1hdGNoIHRoZSBudW1iZXIgb2YgbW9ycGggdGFyZ2V0cyBvZiB0aGUgcmVmZXJlbmNlZCBtZXNoLiBXaGVuIGRlZmluZWQsIGBtZXNoYCAqKk1VU1QqKiBhbHNvIGJlIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwid2VpZ2h0c1wiPzogbnVtYmVyW107XHJcbiAgICBcIm5hbWVcIj86IHN0cmluZztcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gcHJvcGVydHkgc2V0IGJ5IEZVREdFIGxvYWRlci4gTm90IHBhcnQgb2YgZ2xURiBzdGFuZGFyZCAyLjAuXHJcbiAgICAgKi9cclxuICAgIGlzQW5pbWF0ZWQ/OiBib29sZWFuO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gcHJvcGVydHkgc2V0IGJ5IEZVREdFIGxvYWRlci4gTm90IHBhcnQgb2YgZ2xURiBzdGFuZGFyZCAyLjAuXHJcbiAgICAgKi9cclxuICAgIHBhcmVudD86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogUGF0aCBmcm9tIHRoZSByb290IG5vZGUgdG8gdGhpcyBub2RlLlxyXG4gICAgICogQ3VzdG9tIHByb3BlcnR5IHNldCBieSBGVURHRSBsb2FkZXIuIE5vdCBwYXJ0IG9mIGdsVEYgc3RhbmRhcmQgMi4wLlxyXG4gICAgICovXHJcbiAgICBwYXRoPzogbnVtYmVyW107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgc2FtcGxlciBwcm9wZXJ0aWVzIGZvciBmaWx0ZXJpbmcgYW5kIHdyYXBwaW5nIG1vZGVzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2FtcGxlciB7XHJcbiAgICAvKipcclxuICAgICAqIE1hZ25pZmljYXRpb24gZmlsdGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1hZ0ZpbHRlclwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSXCJdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNaW5pZmljYXRpb24gZmlsdGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1pbkZpbHRlclwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RfTUlQTUFQX05FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSX01JUE1BUF9ORUFSRVNUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RfTUlQTUFQX0xJTkVBUlwiXSB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHRbXCJMSU5FQVJfTUlQTUFQX0xJTkVBUlwiXTtcclxuICAgIC8qKlxyXG4gICAgICogUyAoVSkgd3JhcHBpbmcgbW9kZS5cclxuICAgICAqL1xyXG4gICAgXCJ3cmFwU1wiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIkNMQU1QX1RPX0VER0VcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTUlSUk9SRURfUkVQRUFUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIlJFUEVBVFwiXTtcclxuICAgIC8qKlxyXG4gICAgICogVCAoVikgd3JhcHBpbmcgbW9kZS5cclxuICAgICAqL1xyXG4gICAgXCJ3cmFwVFwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIkNMQU1QX1RPX0VER0VcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTUlSUk9SRURfUkVQRUFUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIlJFUEVBVFwiXTtcclxuICAgIFwibmFtZVwiPzogc3RyaW5nO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIHJvb3Qgbm9kZXMgb2YgYSBzY2VuZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNjZW5lIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGljZXMgb2YgZWFjaCByb290IG5vZGUuXHJcbiAgICAgKi9cclxuICAgIFwibm9kZXNcIj86IEdsVGZJZFtdO1xyXG4gICAgXCJuYW1lXCI/OiBhbnk7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBKb2ludHMgYW5kIG1hdHJpY2VzIGRlZmluaW5nIGEgc2tpbi5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNraW4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGFjY2Vzc29yIGNvbnRhaW5pbmcgdGhlIGZsb2F0aW5nLXBvaW50IDR4NCBpbnZlcnNlLWJpbmQgbWF0cmljZXMuXHJcbiAgICAgKi9cclxuICAgIFwiaW52ZXJzZUJpbmRNYXRyaWNlc1wiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdXNlZCBhcyBhIHNrZWxldG9uIHJvb3QuXHJcbiAgICAgKi9cclxuICAgIFwic2tlbGV0b25cIj86IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNlcyBvZiBza2VsZXRvbiBub2RlcywgdXNlZCBhcyBqb2ludHMgaW4gdGhpcyBza2luLlxyXG4gICAgICovXHJcbiAgICBcImpvaW50c1wiOiBHbFRmSWRbXTtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSB0ZXh0dXJlIGFuZCBpdHMgc2FtcGxlci5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFRleHR1cmUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHNhbXBsZXIgdXNlZCBieSB0aGlzIHRleHR1cmUuIFdoZW4gdW5kZWZpbmVkLCBhIHNhbXBsZXIgd2l0aCByZXBlYXQgd3JhcHBpbmcgYW5kIGF1dG8gZmlsdGVyaW5nICoqU0hPVUxEKiogYmUgdXNlZC5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgdXNlZCBieSB0aGlzIHRleHR1cmUuIFdoZW4gdW5kZWZpbmVkLCBhbiBleHRlbnNpb24gb3Igb3RoZXIgbWVjaGFuaXNtICoqU0hPVUxEKiogc3VwcGx5IGFuIGFsdGVybmF0ZSB0ZXh0dXJlIHNvdXJjZSwgb3RoZXJ3aXNlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgXCJzb3VyY2VcIj86IEdsVGZJZDtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIHJvb3Qgb2JqZWN0IGZvciBhIGdsVEYgYXNzZXQuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBHbFRmIHtcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgZ2xURiBleHRlbnNpb25zIHVzZWQgaW4gdGhpcyBhc3NldC5cclxuICAgICAqL1xyXG4gICAgXCJleHRlbnNpb25zVXNlZFwiPzogc3RyaW5nW107XHJcbiAgICAvKipcclxuICAgICAqIE5hbWVzIG9mIGdsVEYgZXh0ZW5zaW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBsb2FkIHRoaXMgYXNzZXQuXHJcbiAgICAgKi9cclxuICAgIFwiZXh0ZW5zaW9uc1JlcXVpcmVkXCI/OiBzdHJpbmdbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzb3JzLlxyXG4gICAgICovXHJcbiAgICBcImFjY2Vzc29yc1wiPzogQWNjZXNzb3JbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Yga2V5ZnJhbWUgYW5pbWF0aW9ucy5cclxuICAgICAqL1xyXG4gICAgXCJhbmltYXRpb25zXCI/OiBBbmltYXRpb25bXTtcclxuICAgIC8qKlxyXG4gICAgICogTWV0YWRhdGEgYWJvdXQgdGhlIGdsVEYgYXNzZXQuXHJcbiAgICAgKi9cclxuICAgIFwiYXNzZXRcIjogQXNzZXQ7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGJ1ZmZlcnMuXHJcbiAgICAgKi9cclxuICAgIFwiYnVmZmVyc1wiPzogQnVmZmVyW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGJ1ZmZlclZpZXdzLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdzXCI/OiBCdWZmZXJWaWV3W107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGNhbWVyYXMuXHJcbiAgICAgKi9cclxuICAgIFwiY2FtZXJhc1wiPzogQ2FtZXJhW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGltYWdlcy5cclxuICAgICAqL1xyXG4gICAgXCJpbWFnZXNcIj86IEltYWdlW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIG1hdGVyaWFscy5cclxuICAgICAqL1xyXG4gICAgXCJtYXRlcmlhbHNcIj86IE1hdGVyaWFsW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIG1lc2hlcy5cclxuICAgICAqL1xyXG4gICAgXCJtZXNoZXNcIj86IE1lc2hbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Ygbm9kZXMuXHJcbiAgICAgKi9cclxuICAgIFwibm9kZXNcIj86IE5vZGVbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Ygc2FtcGxlcnMuXHJcbiAgICAgKi9cclxuICAgIFwic2FtcGxlcnNcIj86IFNhbXBsZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBkZWZhdWx0IHNjZW5lLlxyXG4gICAgICovXHJcbiAgICBcInNjZW5lXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHNjZW5lcy5cclxuICAgICAqL1xyXG4gICAgXCJzY2VuZXNcIj86IFNjZW5lW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHNraW5zLlxyXG4gICAgICovXHJcbiAgICBcInNraW5zXCI/OiBTa2luW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHRleHR1cmVzLlxyXG4gICAgICovXHJcbiAgICBcInRleHR1cmVzXCI/OiBUZXh0dXJlW107XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBc3NldCBsb2FkZXIgZm9yIGdsIFRyYW5zZmVyIEZvcm1hdCBmaWxlcy5cclxuICAgKiBAYXV0aG9ycyBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMiB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBHTFRGTG9hZGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGxvYWRlcnM6IHsgW3VybDogc3RyaW5nXTogR0xURkxvYWRlciB9O1xyXG5cclxuICAgIHN0YXRpYyAjZGVmYXVsdE1hdGVyaWFsOiBNYXRlcmlhbDtcclxuICAgIHN0YXRpYyAjZGVmYXVsdFNraW5NYXRlcmlhbDogTWF0ZXJpYWw7XHJcblxyXG4gICAgcmVhZG9ubHkgI3VybDogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgI2dsdGY6IEdMVEYuR2xUZjtcclxuXHJcbiAgICAjcmVzb3VyY2VzOiBSZXNvdXJjZXMgPSB7fTtcclxuXHJcbiAgICAjbm9kZXM6IE5vZGVbXSA9IFtdO1xyXG4gICAgI2NhbWVyYXM6IENvbXBvbmVudENhbWVyYVtdO1xyXG4gICAgI3NrZWxldG9uczogQ29tcG9uZW50U2tlbGV0b25bXTtcclxuXHJcbiAgICAjYnVmZmVyczogQXJyYXlCdWZmZXJbXTtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKF9nbHRmOiBHTFRGLkdsVGYsIF91cmw6IHN0cmluZywgX2J1ZmZlckNodW5rPzogQXJyYXlCdWZmZXIpIHtcclxuICAgICAgdGhpcy4jZ2x0ZiA9IF9nbHRmO1xyXG4gICAgICB0aGlzLiN1cmwgPSBfdXJsO1xyXG4gICAgICBpZiAoX2J1ZmZlckNodW5rKVxyXG4gICAgICAgIHRoaXMuI2J1ZmZlcnMgPSBbX2J1ZmZlckNodW5rXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdE1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgaWYgKCF0aGlzLiNkZWZhdWx0TWF0ZXJpYWwpIHtcclxuICAgICAgICB0aGlzLiNkZWZhdWx0TWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWwoXCJHTFRGRGVmYXVsdE1hdGVyaWFsXCIsIFNoYWRlclBob25nLCBuZXcgQ29hdFJlbWlzc2l2ZShDb2xvci5DU1MoXCJ3aGl0ZVwiKSwgMSwgMC41KSk7XHJcbiAgICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKHRoaXMuI2RlZmF1bHRNYXRlcmlhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRNYXRlcmlhbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdFNraW5NYXRlcmlhbCgpOiBNYXRlcmlhbCB7XHJcbiAgICAgIGlmICghdGhpcy4jZGVmYXVsdFNraW5NYXRlcmlhbCkge1xyXG4gICAgICAgIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWwoXCJHTFRGRGVmYXVsdFNraW5NYXRlcmlhbFwiLCBTaGFkZXJQaG9uZ1NraW4sIG5ldyBDb2F0UmVtaXNzaXZlKENvbG9yLkNTUyhcIndoaXRlXCIpLCAxLCAwLjUpKTtcclxuICAgICAgICBQcm9qZWN0LmRlcmVnaXN0ZXIodGhpcy4jZGVmYXVsdFNraW5NYXRlcmlhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIHRoZSBsb2FkaW5nIG9mIGFuIGV4dGVybmFsIHJlc291cmNlIGZyb20gYSBnbFRGIGZpbGUuIFVzZWQgYnkgdGhlIHtAbGluayBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsfUdMVEYgc3BlY2lhbGl6YXRpb25zIHRvIGxvYWQgdGhlbXNlbHZlcy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxvYWRSZXNvdXJjZTxUIGV4dGVuZHMgR3JhcGhHTFRGIHwgTWVzaEdMVEYgfCBNYXRlcmlhbEdMVEYgfCBBbmltYXRpb25HTFRGIHwgR3JhcGhJbnN0YW5jZT4oX3Jlc291cmNlOiBULCBfdXJsPzogUmVxdWVzdEluZm8pOiBQcm9taXNlPFQ+IHtcclxuICAgICAgY29uc3QgbG9hZGVyOiBHTFRGTG9hZGVyID0gYXdhaXQgR0xURkxvYWRlci5MT0FEKCgoPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWw+X3Jlc291cmNlKS51cmwgPz8gX3VybCkudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICBpZiAoIWxvYWRlcikge1xyXG4gICAgICAgIGlmICghKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKVxyXG4gICAgICAgICAgX3Jlc291cmNlLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5FUlJPUjtcclxuICAgICAgICByZXR1cm4gX3Jlc291cmNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG9hZGVkOiBUO1xyXG5cclxuICAgICAgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEdyYXBoKF9yZXNvdXJjZS5nZXQoKS5uYW1lLCBfcmVzb3VyY2UpO1xyXG4gICAgICBlbHNlIGlmIChfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEdMVEYpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEdyYXBoKF9yZXNvdXJjZS5uYW1lLCBfcmVzb3VyY2UpO1xyXG4gICAgICBlbHNlIGlmIChfcmVzb3VyY2UgaW5zdGFuY2VvZiBNZXNoR0xURilcclxuICAgICAgICBsb2FkZWQgPSBhd2FpdCBsb2FkZXIuZ2V0TWVzaChfcmVzb3VyY2UubmFtZSwgX3Jlc291cmNlLmlQcmltaXRpdmUsIF9yZXNvdXJjZSk7XHJcbiAgICAgIGVsc2UgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIE1hdGVyaWFsR0xURilcclxuICAgICAgICBsb2FkZWQgPSBhd2FpdCBsb2FkZXIuZ2V0TWF0ZXJpYWwoX3Jlc291cmNlLm5hbWUsIF9yZXNvdXJjZSk7XHJcbiAgICAgIGVsc2UgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEFuaW1hdGlvbkdMVEYpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEFuaW1hdGlvbihfcmVzb3VyY2UubmFtZSwgX3Jlc291cmNlKTtcclxuXHJcbiAgICAgIGlmICghbG9hZGVkKSB7XHJcbiAgICAgICAgRGVidWcuZXJyb3IoYCR7X3Jlc291cmNlLmNvbnN0cnVjdG9yLm5hbWV9IHwgJHtfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlID8gX3Jlc291cmNlLmlkU291cmNlIDogX3Jlc291cmNlLmlkUmVzb3VyY2V9OiBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZS5gKTtcclxuICAgICAgICBpZiAoIShfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlKSlcclxuICAgICAgICAgIF9yZXNvdXJjZS5zdGF0dXMgPSBSRVNPVVJDRV9TVEFUVVMuRVJST1I7XHJcblxyXG4gICAgICAgIHJldHVybiBfcmVzb3VyY2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghKGxvYWRlZCBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKSB7XHJcbiAgICAgICAgbG9hZGVkLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5SRUFEWTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgKGNhY2hlZCAmJiAhKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKSB7XHJcblxyXG4gICAgICAvLyAgIGlmICghUHJvamVjdC5yZXNvdXJjZXNbY2FjaGVkLmlkUmVzb3VyY2VdKVxyXG4gICAgICAvLyAgICAgY2FjaGVkLmlkUmVzb3VyY2UgPSBfcmVzb3VyY2UuaWRSZXNvdXJjZTsgLy8gY2hhbmdlIHRoZSBpZCBvZiB0aGUgY2FjaGVkIHJlc291cmNlIHRvIHRoZSBpZCBvZiB0aGUgcmVzb3VyY2UgdGhhdCByZXF1ZXN0ZWQgaXRcclxuXHJcbiAgICAgIC8vICAgaWYgKGNhY2hlZC5pZFJlc291cmNlICE9IF9yZXNvdXJjZS5pZFJlc291cmNlKSB7XHJcbiAgICAgIC8vICAgICAvLyB0d28gZGlmZmVyZW50IHJlc291cmNlcyBoYXZlIHJlcXVlc3RlZCB0aGUgc2FtZSBjYWNoZWQgcmVzb3VyY2VcclxuICAgICAgLy8gICAgIERlYnVnLmVycm9yKGAke19yZXNvdXJjZS5pZFJlc291cmNlfTogRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UuICR7X3Jlc291cmNlLnR5cGV9IHdpdGggbmFtZSAnJHtfcmVzb3VyY2UubmFtZX0nIGZyb20gJyR7bG9hZGVyLm5hbWV9JyBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBieSAnJHtjYWNoZWQuaWRSZXNvdXJjZX0nLiBQbGVhc2UgZGVsZXRlIHRoZSBkdXBsaWNhdGUgJyR7X3Jlc291cmNlLmlkUmVzb3VyY2V9JyBmcm9tIHRoZSBwcm9qZWN0LmApO1xyXG4gICAgICAvLyAgICAgcmV0dXJuIF9yZXNvdXJjZTtcclxuICAgICAgLy8gICB9XHJcblxyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICByZXR1cm4gbG9hZGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBHTFRGTG9hZGVyfSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHVybCBvciBudWxsIGlmIHRoZSB1cmwgY2FuJ3QgYmUgcmVzb2x2ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgTE9BRChfdXJsOiBzdHJpbmcsIF9yZWdpc3RlclJlc291cmNlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxHTFRGTG9hZGVyPiB7XHJcbiAgICAgIGlmICghdGhpcy5sb2FkZXJzKVxyXG4gICAgICAgIEdMVEZMb2FkZXIubG9hZGVycyA9IHt9O1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmxvYWRlcnNbX3VybF0pIHtcclxuICAgICAgICBsZXQgZ2x0ZjogR0xURi5HbFRmO1xyXG4gICAgICAgIGxldCBidWZmZXI6IEFycmF5QnVmZmVyO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChuZXcgVVJMKF91cmwsIFByb2plY3QuYmFzZVVSTCkpO1xyXG4gICAgICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbjogc3RyaW5nID0gX3VybC5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09IFwiZ2x0ZlwiKVxyXG4gICAgICAgICAgICBnbHRmID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09IFwiZ2xiXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVZpZXc6IERhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1hZ2ljOiBudW1iZXIgPSBkYXRhVmlldy5nZXRVaW50MzIoMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChtYWdpYyAhPT0gMHg0NjU0NkM2NylcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7R0xURkxvYWRlci5uYW1lfSB8ICR7X3VybH06IEludmFsaWQgbWFnaWMgbnVtYmVyIGluIEdMQiBmaWxlLmApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gZGF0YVZpZXcuZ2V0VWludDMyKDQsIHRydWUpO1xyXG4gICAgICAgICAgICBpZiAodmVyc2lvbiAhPSAyKVxyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVW5zdXBwb3J0ZWQgdmVyc2lvbiBpbiBHTEIgZmlsZS5gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGpzb25MZW5ndGg6IG51bWJlciA9IGRhdGFWaWV3LmdldFVpbnQzMigxMiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGpzb25Gb3JtYXQ6IG51bWJlciA9IGRhdGFWaWV3LmdldFVpbnQzMigxNiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoanNvbkZvcm1hdCAhPT0gMHg0RTRGNTM0QSlcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0LiBUaGUgZmlyc3QgY2h1bmsgb2YgdGhlIGZpbGUgaXMgbm90IGluIEpTT04gZm9ybWF0LicpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGVjb2RlcjogVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuICAgICAgICAgICAgY29uc3QganNvbkNodW5rOiBzdHJpbmcgPSBkZWNvZGVyLmRlY29kZShuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgMjAsIGpzb25MZW5ndGgpKTtcclxuICAgICAgICAgICAgZ2x0ZiA9IEpTT04ucGFyc2UoanNvbkNodW5rKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoID49IDIwICsganNvbkxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJpbmFyeUxlbmd0aDogbnVtYmVyID0gZGF0YVZpZXcuZ2V0VWludDMyKDIwICsganNvbkxlbmd0aCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgY29uc3QgYmluYXJ5Rm9ybWF0OiBudW1iZXIgPSBkYXRhVmlldy5nZXRVaW50MzIoMjQgKyBqc29uTGVuZ3RoLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGJpbmFyeUZvcm1hdCAhPT0gMHgwMDRFNDk0MilcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmb3JtYXQuIFRoZSBzZWNvbmQgY2h1bmsgb2YgdGhlIGZpbGUgaXMgbm90IGluIGJpbmFyeSBmb3JtYXQuJyk7XHJcblxyXG4gICAgICAgICAgICAgIGJ1ZmZlciA9IGFycmF5QnVmZmVyLnNsaWNlKDI4ICsganNvbkxlbmd0aCwgMjggKyBqc29uTGVuZ3RoICsgYmluYXJ5TGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XHJcbiAgICAgICAgICBEZWJ1Zy5lcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogRmFpbGVkIHRvIGxvYWQgZmlsZS4gJHtlcnJvcn1gKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgR0xURkxvYWRlci5jaGVja0NvbXBhdGliaWxpdHkoZ2x0ZiwgX3VybCk7XHJcbiAgICAgICAgR0xURkxvYWRlci5wcmVQcm9jZXNzKGdsdGYsIF91cmwpO1xyXG5cclxuICAgICAgICBHTFRGTG9hZGVyLmxvYWRlcnNbX3VybF0gPSBuZXcgR0xURkxvYWRlcihnbHRmLCBfdXJsLCBidWZmZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gR0xURkxvYWRlci5sb2FkZXJzW191cmxdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNoZWNrQ29tcGF0aWJpbGl0eShfZ2x0ZjogR0xURi5HbFRmLCBfdXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgaWYgKF9nbHRmLmFzc2V0LnZlcnNpb24gIT0gXCIyLjBcIilcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke0dMVEZMb2FkZXIubmFtZX0gfCAke191cmx9OiBUaGlzIGxvYWRlciB3YXMgZGV2ZWxvcGVkIGZvciBnbFRGIDIuMC4gSXQgbWF5IG5vdCB3b3JrIGFzIGludGVuZGVkIHdpdGggdmVyc2lvbiAke19nbHRmLmFzc2V0LnZlcnNpb259LmApO1xyXG4gICAgICBpZiAoX2dsdGYuYXNzZXQubWluVmVyc2lvbiAhPSB1bmRlZmluZWQgJiYgX2dsdGYuYXNzZXQubWluVmVyc2lvbiAhPSBcIjIuMFwiKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVGhpcyBsb2FkZXIgd2FzIGRldmVsb3BlZCBmb3IgZ2xURiAyLjAuIEl0IGRvZXMgbm90IHdvcmsgd2l0aCByZXF1aXJlZCBtaW4gdmVyc2lvbiAke19nbHRmLmFzc2V0Lm1pblZlcnNpb259LmApO1xyXG4gICAgICBpZiAoX2dsdGYuZXh0ZW5zaW9uc1VzZWQ/Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgRGVidWcud2FybihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVGhpcyBsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBnbFRGIGV4dGVuc2lvbnMuIEl0IG1heSBub3Qgd29yayBhcyBpbnRlbmRlZCB3aXRoIGV4dGVuc2lvbnMgJHtfZ2x0Zi5leHRlbnNpb25zVXNlZC50b1N0cmluZygpfS5gKTtcclxuICAgICAgaWYgKF9nbHRmLmV4dGVuc2lvbnNSZXF1aXJlZD8ubGVuZ3RoID4gMClcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7R0xURkxvYWRlci5uYW1lfSB8ICR7X3VybH06IFRoaXMgbG9hZGVyIGRvZXMgbm90IHN1cHBvcnQgZ2xURiBleHRlbnNpb25zLiBJdCBkb2VzIG5vdCB3b3JrIHdpdGggcmVxdWlyZWQgZXh0ZW5zaW9ucyAke19nbHRmLmV4dGVuc2lvbnNSZXF1aXJlZC50b1N0cmluZygpfS5gKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBwcmVQcm9jZXNzKF9nbHRmOiBHTFRGLkdsVGYsIF91cmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAvLyBhZGQgYSBuYW1lIHRvIGVhY2ggc2NlbmVcclxuICAgICAgaWYgKF9nbHRmLnNjZW5lcykge1xyXG4gICAgICAgIF9nbHRmLnNjZW5lID0gX2dsdGYuc2NlbmUgPz8gMDtcclxuICAgICAgICBhZGROYW1lcyhcIlNjZW5lXCIsIF9nbHRmLnNjZW5lcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfZ2x0Zi5ub2Rlcykge1xyXG4gICAgICAgIC8vIG1hcmsgYWxsIG5vZGVzIHRoYXQgYXJlIGFuaW1hdGVkXHJcbiAgICAgICAgX2dsdGYuYW5pbWF0aW9ucz8uZm9yRWFjaChfYW5pbWF0aW9uID0+IHtcclxuICAgICAgICAgIF9hbmltYXRpb24uY2hhbm5lbHMuZm9yRWFjaChfY2hhbm5lbCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlOb2RlOiBudW1iZXIgPSBfY2hhbm5lbC50YXJnZXQubm9kZTtcclxuICAgICAgICAgICAgaWYgKGlOb2RlICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICBfZ2x0Zi5ub2Rlc1tpTm9kZV0uaXNBbmltYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gbWFyayBwYXJlbnQgb2YgZWFjaCBub2RlXHJcbiAgICAgICAgX2dsdGYubm9kZXMuZm9yRWFjaCgoX25vZGUsIF9pTm9kZSkgPT4gX25vZGUuY2hpbGRyZW4/LmZvckVhY2goX2lDaGlsZCA9PiBfZ2x0Zi5ub2Rlc1tfaUNoaWxkXS5wYXJlbnQgPSBfaU5vZGUpKTtcclxuXHJcbiAgICAgICAgX2dsdGYubm9kZXMuZm9yRWFjaCgoX25vZGUsIF9pTm9kZSkgPT4ge1xyXG4gICAgICAgICAgLy8gYWRkIG5hbWVzIHRvIG5vZGVzIHRoYXQgZG9uJ3QgaGF2ZSBvbmVcclxuICAgICAgICAgIGlmIChfbm9kZS5uYW1lID09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgX25vZGUubmFtZSA9IGBOb2RlJHtfaU5vZGV9YDtcclxuXHJcbiAgICAgICAgICBpZiAoX25vZGUuaXNBbmltYXRlZCkge1xyXG4gICAgICAgICAgICAvLyBhZGQgcGF0aCB0byBlYWNoIGFuaW1hdGVkIG5vZGVcclxuICAgICAgICAgICAgbGV0IGlQYXJlbnQ6IG51bWJlciA9IF9ub2RlLnBhcmVudDtcclxuICAgICAgICAgICAgbGV0IHBhdGg6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgICAgIHBhdGgucHVzaChfaU5vZGUpO1xyXG4gICAgICAgICAgICB3aGlsZSAoaVBhcmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBwYXRoLnB1c2goaVBhcmVudCk7XHJcbiAgICAgICAgICAgICAgaVBhcmVudCA9IF9nbHRmLm5vZGVzW2lQYXJlbnRdLnBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfbm9kZS5wYXRoID0gcGF0aC5yZXZlcnNlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoX2dsdGYubWF0ZXJpYWxzKVxyXG4gICAgICAgIGFkZE5hbWVzKFwiTWF0ZXJpYWxcIiwgX2dsdGYubWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIGlmIChfZ2x0Zi5tZXNoZXMpXHJcbiAgICAgICAgYWRkTmFtZXMoXCJNZXNoXCIsIF9nbHRmLm1lc2hlcyk7XHJcblxyXG4gICAgICBpZiAoX2dsdGYuYW5pbWF0aW9ucylcclxuICAgICAgICBhZGROYW1lcyhcIkFuaW1hdGlvblwiLCBfZ2x0Zi5hbmltYXRpb25zKTtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGFkZE5hbWVzKF90ZW1wbGF0ZTogc3RyaW5nLCBfdGFyZ2V0OiB7IG5hbWU/OiBzdHJpbmcgfVtdKTogdm9pZCB7XHJcbiAgICAgICAgX3RhcmdldC5mb3JFYWNoKChfaXRlbSwgX2luZGV4KSA9PiB7XHJcbiAgICAgICAgICBpZiAoX2l0ZW0ubmFtZSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIF9pdGVtLm5hbWUgPSBgJHtfdGVtcGxhdGV9JHtfaW5kZXh9YDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZ2xURiBmaWxlIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdXJsLnNwbGl0KFwiXFxcXFwiKS5wb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgbmV3IGluc3RhbmNlcyBvZiBhbGwgcmVzb3VyY2VzIG9mIHRoZSBnaXZlbiB0eXBlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZFJlc291cmNlczxUIGV4dGVuZHMgU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbD4oX2NsYXNzOiBuZXcgKCkgPT4gVCk6IFByb21pc2U8VFtdPiB7XHJcbiAgICAgIGxldCByZXNvdXJjZXM6IFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWxbXSA9IFtdO1xyXG4gICAgICBzd2l0Y2ggKF9jbGFzcy5uYW1lKSB7XHJcbiAgICAgICAgY2FzZSBHcmFwaC5uYW1lOlxyXG4gICAgICAgICAgZm9yIChsZXQgaVNjZW5lOiBudW1iZXIgPSAwOyBpU2NlbmUgPCB0aGlzLiNnbHRmLnNjZW5lcz8ubGVuZ3RoOyBpU2NlbmUrKylcclxuICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRHcmFwaChpU2NlbmUsIG5ldyBHcmFwaEdMVEYoKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNZXNoLm5hbWU6XHJcbiAgICAgICAgICBmb3IgKGxldCBpTWVzaDogbnVtYmVyID0gMDsgaU1lc2ggPCB0aGlzLiNnbHRmLm1lc2hlcz8ubGVuZ3RoOyBpTWVzaCsrKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpUHJpbWl0aXZlOiBudW1iZXIgPSAwOyBpUHJpbWl0aXZlIDwgdGhpcy4jZ2x0Zi5tZXNoZXNbaU1lc2hdLnByaW1pdGl2ZXMubGVuZ3RoOyBpUHJpbWl0aXZlKyspXHJcbiAgICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRNZXNoKGlNZXNoLCBpUHJpbWl0aXZlLCBuZXcgTWVzaEdMVEYoKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNYXRlcmlhbC5uYW1lOlxyXG4gICAgICAgICAgZm9yIChsZXQgaU1hdGVyaWFsOiBudW1iZXIgPSAwOyBpTWF0ZXJpYWwgPCB0aGlzLiNnbHRmLm1hdGVyaWFscz8ubGVuZ3RoOyBpTWF0ZXJpYWwrKylcclxuICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRNYXRlcmlhbChpTWF0ZXJpYWwsIG5ldyBNYXRlcmlhbEdMVEYoXCJIaSA6KVwiKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBBbmltYXRpb24ubmFtZTpcclxuICAgICAgICAgIGZvciAobGV0IGlBbmltYXRpb246IG51bWJlciA9IDA7IGlBbmltYXRpb24gPCB0aGlzLiNnbHRmLmFuaW1hdGlvbnM/Lmxlbmd0aDsgaUFuaW1hdGlvbisrKVxyXG4gICAgICAgICAgICByZXNvdXJjZXMucHVzaChhd2FpdCB0aGlzLmdldEFuaW1hdGlvbihpQW5pbWF0aW9uLCBuZXcgQW5pbWF0aW9uR0xURigpKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcclxuICAgICAgICBpZiAoIVByb2plY3QucmVzb3VyY2VzW3Jlc291cmNlLmlkUmVzb3VyY2VdKVxyXG4gICAgICAgICAgUHJvamVjdC5yZWdpc3RlcihyZXNvdXJjZSk7XHJcblxyXG4gICAgICAgIHJlc291cmNlLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5SRUFEWTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDxUW10+cmVzb3VyY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBHcmFwaH0gZm9yIHRoZSBnaXZlbiBzY2VuZSBuYW1lIG9yIHRoZSBkZWZhdWx0IHNjZW5lIGlmIG5vIG5hbWUgaXMgZ2l2ZW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRHcmFwaChfbmFtZT86IHN0cmluZyk6IFByb21pc2U8R3JhcGg+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEdyYXBofSBmb3IgdGhlIGdpdmVuIHNjZW5lIGluZGV4IG9yIHRoZSBkZWZhdWx0IHNjZW5lIGlmIG5vIGluZGV4IGlzIGdpdmVuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0R3JhcGgoX2lTY2VuZT86IG51bWJlcik6IFByb21pc2U8R3JhcGg+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIHNjZW5lIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgR3JhcGh9LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRHcmFwaDxUIGV4dGVuZHMgTm9kZT4oX2lTY2VuZTogbnVtYmVyIHwgc3RyaW5nLCBfZ3JhcGg6IFQpOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldEdyYXBoKF9pU2NlbmU6IG51bWJlciB8IHN0cmluZyA9IHRoaXMuI2dsdGYuc2NlbmUsIF9ncmFwaD86IE5vZGUpOiBQcm9taXNlPE5vZGU+IHtcclxuICAgICAgX2lTY2VuZSA9IHRoaXMuZ2V0SW5kZXgoX2lTY2VuZSwgdGhpcy4jZ2x0Zi5zY2VuZXMpO1xyXG5cclxuICAgICAgaWYgKF9pU2NlbmUgPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7R3JhcGhHTFRGLm5hbWV9fCR7X2lTY2VuZX1gO1xyXG5cclxuICAgICAgaWYgKCFfZ3JhcGggJiYgdGhpcy4jcmVzb3VyY2VzW2lkXSlcclxuICAgICAgICByZXR1cm4gPE5vZGU+PHVua25vd24+dGhpcy4jcmVzb3VyY2VzW2lkXTtcclxuXHJcbiAgICAgIHRoaXMuI25vZGVzID0gW107XHJcbiAgICAgIHRoaXMuI2NhbWVyYXMgPSBbXTtcclxuICAgICAgdGhpcy4jc2tlbGV0b25zID0gW107XHJcblxyXG4gICAgICBjb25zdCBnbHRmU2NlbmU6IEdMVEYuU2NlbmUgPSB0aGlzLiNnbHRmLnNjZW5lc1tfaVNjZW5lXTtcclxuICAgICAgY29uc3QgZ3JhcGg6IE5vZGUgPSBfZ3JhcGggPz8gbmV3IEdyYXBoR0xURigpO1xyXG4gICAgICBncmFwaC5uYW1lID0gZ2x0ZlNjZW5lLm5hbWU7XHJcbiAgICAgIGlmIChncmFwaCBpbnN0YW5jZW9mIEdyYXBoR0xURilcclxuICAgICAgICBncmFwaC51cmwgPSB0aGlzLiN1cmw7XHJcbiAgICAgIGlmIChfZ3JhcGgpIHtcclxuICAgICAgICBfZ3JhcGgucmVtb3ZlQWxsQ2hpbGRyZW4oKTtcclxuICAgICAgICBfZ3JhcGgucmVtb3ZlQ29tcG9uZW50cyhDb21wb25lbnRTa2VsZXRvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgaU5vZGUgb2YgZ2x0ZlNjZW5lLm5vZGVzKVxyXG4gICAgICAgIGdyYXBoLmFkZENoaWxkKGF3YWl0IHRoaXMuZ2V0Tm9kZUJ5SW5kZXgoaU5vZGUpKTtcclxuXHJcbiAgICAgIC8vIGlmICh0aGlzLiNnbHRmLmFuaW1hdGlvbnM/Lmxlbmd0aCA+IDAgJiYgIWdyYXBoLmdldENvbXBvbmVudChDb21wb25lbnRBbmltYXRvcikpIHtcclxuICAgICAgLy8gICBsZXQgYW5pbWF0aW9uOiBBbmltYXRpb24gPSBhd2FpdCB0aGlzLmdldEFuaW1hdGlvbigwKTtcclxuICAgICAgLy8gICBQcm9qZWN0LnJlZ2lzdGVyKGFuaW1hdGlvbik7XHJcbiAgICAgIC8vICAgZ3JhcGguYWRkQ29tcG9uZW50KG5ldyBDb21wb25lbnRBbmltYXRvcihhbmltYXRpb24pKTtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgLy8gVE9ETzogbG9hZCBvbmx5IHNrZWxldG9ucyB3aGljaCBiZWxvbmcgdG8gdGhlIHNjZW5lPz8/XHJcbiAgICAgIC8vIGlmICh0aGlzLmdsdGYuc2tpbnM/Lmxlbmd0aCA+IDApXHJcbiAgICAgIC8vICAgZm9yIChsZXQgaVNraW46IG51bWJlciA9IDA7IGlTa2luIDwgdGhpcy5nbHRmLnNraW5zLmxlbmd0aDsgaVNraW4rKylcclxuICAgICAgLy8gICAgIHNjZW5lLmFkZENvbXBvbmVudChhd2FpdCB0aGlzLmdldFNrZWxldG9uQnlJbmRleChpU2tpbikpO1xyXG4gICAgICBpZiAodGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgIGZvciAoY29uc3Qgc2tlbGV0b24gb2YgdGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgICAgZ3JhcGguYWRkQ29tcG9uZW50KHNrZWxldG9uKTtcclxuXHJcbiAgICAgIGlmICghX2dyYXBoKVxyXG4gICAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSA8R3JhcGhHTFRGPmdyYXBoO1xyXG5cclxuICAgICAgcmV0dXJuIGdyYXBoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZmlyc3Qge0BsaW5rIE5vZGV9IHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXROb2RlKF9uYW1lOiBzdHJpbmcpOiBQcm9taXNlPE5vZGU+IHtcclxuICAgICAgY29uc3QgaU5vZGU6IG51bWJlciA9IHRoaXMuI2dsdGYubm9kZXMuZmluZEluZGV4KF9ub2RlID0+IF9ub2RlLm5hbWUgPT0gX25hbWUpO1xyXG4gICAgICBpZiAoaU5vZGUgPT0gLTEpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBDb3VsZG4ndCBmaW5kIG5hbWUgJyR7X25hbWV9JyBpbiBnbFRGIG5vZGVzLmApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROb2RlQnlJbmRleChpTm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTm9kZX0gZm9yIHRoZSBnaXZlbiBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE5vZGVCeUluZGV4KF9pTm9kZTogbnVtYmVyKTogUHJvbWlzZTxOb2RlPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbm9kZXNbX2lOb2RlXSkge1xyXG4gICAgICAgIGNvbnN0IGdsdGZOb2RlOiBHTFRGLk5vZGUgPSB0aGlzLiNnbHRmLm5vZGVzW19pTm9kZV07XHJcbiAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IG5ldyBOb2RlKGdsdGZOb2RlLm5hbWUpO1xyXG5cclxuICAgICAgICB0aGlzLiNub2Rlc1tfaU5vZGVdID0gbm9kZTtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKGdsdGZOb2RlLmNoaWxkcmVuKVxyXG4gICAgICAgICAgZm9yIChjb25zdCBpTm9kZSBvZiBnbHRmTm9kZS5jaGlsZHJlbilcclxuICAgICAgICAgICAgbm9kZS5hZGRDaGlsZChhd2FpdCB0aGlzLmdldE5vZGVCeUluZGV4KGlOb2RlKSk7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciB0cmFuc2Zvcm1hdGlvblxyXG4gICAgICAgIGlmIChnbHRmTm9kZS5tYXRyaXggfHwgZ2x0Zk5vZGUucm90YXRpb24gfHwgZ2x0Zk5vZGUuc2NhbGUgfHwgZ2x0Zk5vZGUudHJhbnNsYXRpb24gfHwgZ2x0Zk5vZGUuaXNBbmltYXRlZCkge1xyXG4gICAgICAgICAgbm9kZS5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudFRyYW5zZm9ybSgpKTtcclxuICAgICAgICAgIGlmIChnbHRmTm9kZS5tYXRyaXgpIHtcclxuICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5zZXQoZ2x0Zk5vZGUubWF0cml4KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChnbHRmTm9kZS50cmFuc2xhdGlvbikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG4gICAgICAgICAgICAgIHRyYW5zbGF0aW9uLnNldChnbHRmTm9kZS50cmFuc2xhdGlvblswXSwgZ2x0Zk5vZGUudHJhbnNsYXRpb25bMV0sIGdsdGZOb2RlLnRyYW5zbGF0aW9uWzJdKTtcclxuICAgICAgICAgICAgICBub2RlLm10eExvY2FsLnRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb247XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChnbHRmTm9kZS5yb3RhdGlvbikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJvdGF0aW9uOiBRdWF0ZXJuaW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICAgICAgICAgIHJvdGF0aW9uLnNldChnbHRmTm9kZS5yb3RhdGlvblswXSwgZ2x0Zk5vZGUucm90YXRpb25bMV0sIGdsdGZOb2RlLnJvdGF0aW9uWzJdLCBnbHRmTm9kZS5yb3RhdGlvblszXSk7XHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5yb3RhdGlvbiA9IHJvdGF0aW9uO1xyXG4gICAgICAgICAgICAgIFJlY3ljbGVyLnN0b3JlKHJvdGF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZ2x0Zk5vZGUuc2NhbGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCBzY2FsZTogVmVjdG9yMyA9IFJlY3ljbGVyLmdldChWZWN0b3IzKTtcclxuICAgICAgICAgICAgICBzY2FsZS5zZXQoZ2x0Zk5vZGUuc2NhbGVbMF0sIGdsdGZOb2RlLnNjYWxlWzFdLCBnbHRmTm9kZS5zY2FsZVsyXSk7XHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5zY2FsaW5nID0gc2NhbGU7XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUoc2NhbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjaGVjayBmb3IgY2FtZXJhXHJcbiAgICAgICAgaWYgKGdsdGZOb2RlLmNhbWVyYSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIG5vZGUuYWRkQ29tcG9uZW50KGF3YWl0IHRoaXMuZ2V0Q2FtZXJhQnlJbmRleChnbHRmTm9kZS5jYW1lcmEpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciBtZXNoIGFuZCBtYXRlcmlhbFxyXG4gICAgICAgIGlmIChnbHRmTm9kZS5tZXNoICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29uc3QgZ2x0Zk1lc2g6IEdMVEYuTWVzaCA9IHRoaXMuI2dsdGYubWVzaGVzPy5bZ2x0Zk5vZGUubWVzaF07XHJcbiAgICAgICAgICAvLyBUT0RPOiByZXZpZXcgdGhpc1xyXG4gICAgICAgICAgY29uc3Qgc3ViQ29tcG9uZW50czogW0NvbXBvbmVudE1lc2gsIENvbXBvbmVudE1hdGVyaWFsXVtdID0gW107XHJcbiAgICAgICAgICBmb3IgKGxldCBpUHJpbWl0aXZlOiBudW1iZXIgPSAwOyBpUHJpbWl0aXZlIDwgZ2x0Zk1lc2gucHJpbWl0aXZlcy5sZW5ndGg7IGlQcmltaXRpdmUrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjbXBNZXNoOiBDb21wb25lbnRNZXNoID0gbmV3IENvbXBvbmVudE1lc2goYXdhaXQgdGhpcy5nZXRNZXNoKGdsdGZOb2RlLm1lc2gsIGlQcmltaXRpdmUpKTtcclxuICAgICAgICAgICAgY29uc3QgaXNTa2luOiBib29sZWFuID0gZ2x0Zk5vZGUuc2tpbiAhPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNTa2luKVxyXG4gICAgICAgICAgICAgIGNtcE1lc2guc2tlbGV0b24gPSBhd2FpdCB0aGlzLmdldFNrZWxldG9uQnlJbmRleChnbHRmTm9kZS5za2luKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWw7XHJcbiAgICAgICAgICAgIGNvbnN0IGlNYXRlcmlhbDogbnVtYmVyID0gZ2x0Zk1lc2gucHJpbWl0aXZlcz8uW2lQcmltaXRpdmVdPy5tYXRlcmlhbDtcclxuICAgICAgICAgICAgaWYgKGlNYXRlcmlhbCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBjbXBNYXRlcmlhbCA9IG5ldyBDb21wb25lbnRNYXRlcmlhbChpc1NraW4gP1xyXG4gICAgICAgICAgICAgICAgR0xURkxvYWRlci5kZWZhdWx0U2tpbk1hdGVyaWFsIDpcclxuICAgICAgICAgICAgICAgIEdMVEZMb2FkZXIuZGVmYXVsdE1hdGVyaWFsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCBpc0ZsYXQ6IGJvb2xlYW4gPSBnbHRmTWVzaC5wcmltaXRpdmVzW2lQcmltaXRpdmVdLmF0dHJpYnV0ZXMuTk9STUFMID09IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICBjbXBNYXRlcmlhbCA9IG5ldyBDb21wb25lbnRNYXRlcmlhbChhd2FpdCB0aGlzLmdldE1hdGVyaWFsKGlNYXRlcmlhbCwgbnVsbCwgaXNTa2luLCBpc0ZsYXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gVE9ETzogbWF5YmUgdGhpcyBzaG91bGQgYmUgYSBmdWRnZSBtYXRlcmlhbCBwcm9wZXJ0eVxyXG4gICAgICAgICAgICAgIGNvbnN0IGdsdGZNYXRlcmlhbDogR0xURi5NYXRlcmlhbCA9IHRoaXMuI2dsdGYubWF0ZXJpYWxzW2lNYXRlcmlhbF07XHJcbiAgICAgICAgICAgICAgaWYgKGdsdGZNYXRlcmlhbCkgXHJcbiAgICAgICAgICAgICAgICBjbXBNYXRlcmlhbC5zb3J0Rm9yQWxwaGEgPSBnbHRmTWF0ZXJpYWwuYWxwaGFNb2RlID09IFwiQkxFTkRcIjtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc3ViQ29tcG9uZW50cy5wdXNoKFtjbXBNZXNoLCBjbXBNYXRlcmlhbF0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChzdWJDb21wb25lbnRzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIG5vZGUuYWRkQ29tcG9uZW50KHN1YkNvbXBvbmVudHNbMF1bMF0pO1xyXG4gICAgICAgICAgICBub2RlLmFkZENvbXBvbmVudChzdWJDb21wb25lbnRzWzBdWzFdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN1YkNvbXBvbmVudHMuZm9yRWFjaCgoW19jbXBNZXNoLCBfY21wTWF0ZXJpYWxdLCBfaSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5vZGVQYXJ0OiBOb2RlID0gbmV3IE5vZGUoYCR7bm9kZS5uYW1lfV9QcmltaXRpdmUke19pfWApO1xyXG4gICAgICAgICAgICAgIG5vZGVQYXJ0LmFkZENvbXBvbmVudChfY21wTWVzaCk7XHJcbiAgICAgICAgICAgICAgbm9kZVBhcnQuYWRkQ29tcG9uZW50KF9jbXBNYXRlcmlhbCk7XHJcbiAgICAgICAgICAgICAgbm9kZS5hZGRDaGlsZChub2RlUGFydCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGVzW19pTm9kZV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSB3aXRoIHRoZSBnaXZlbiBjYW1lcmEgbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldENhbWVyYShfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb21wb25lbnRDYW1lcmE+IHtcclxuICAgICAgY29uc3QgaUNhbWVyYTogbnVtYmVyID0gdGhpcy4jZ2x0Zi5jYW1lcmFzLmZpbmRJbmRleChfY2FtZXJhID0+IF9jYW1lcmEubmFtZSA9PSBfbmFtZSk7XHJcbiAgICAgIGlmIChpQ2FtZXJhID09IC0xKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBuYW1lICcke19uYW1lfScgaW4gZ2xURiBjYW1lcmFzLmApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRDYW1lcmFCeUluZGV4KGlDYW1lcmEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIENvbXBvbmVudENhbWVyYX0gZm9yIHRoZSBnaXZlbiBjYW1lcmEgaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRDYW1lcmFCeUluZGV4KF9pQ2FtZXJhOiBudW1iZXIpOiBQcm9taXNlPENvbXBvbmVudENhbWVyYT4ge1xyXG4gICAgICBpZiAoIXRoaXMuI2NhbWVyYXMpXHJcbiAgICAgICAgdGhpcy4jY2FtZXJhcyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI2NhbWVyYXNbX2lDYW1lcmFdKSB7XHJcbiAgICAgICAgY29uc3QgZ2x0ZkNhbWVyYTogR0xURi5DYW1lcmEgPSB0aGlzLiNnbHRmLmNhbWVyYXNbX2lDYW1lcmFdO1xyXG4gICAgICAgIGNvbnN0IGNhbWVyYTogQ29tcG9uZW50Q2FtZXJhID0gbmV3IENvbXBvbmVudENhbWVyYSgpO1xyXG5cclxuICAgICAgICBpZiAoZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZSlcclxuICAgICAgICAgIGNhbWVyYS5wcm9qZWN0Q2VudHJhbChcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZS5hc3BlY3RSYXRpbyxcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZS55Zm92ICogQ2FsYy5yYWQyZGVnLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLnBlcnNwZWN0aXZlLnpuZWFyLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLnBlcnNwZWN0aXZlLnpmYXJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgY2FtZXJhLnByb2plY3RPcnRob2dyYXBoaWMoXHJcbiAgICAgICAgICAgIC1nbHRmQ2FtZXJhLm9ydGhvZ3JhcGhpYy54bWFnLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLm9ydGhvZ3JhcGhpYy54bWFnLFxyXG4gICAgICAgICAgICAtZ2x0ZkNhbWVyYS5vcnRob2dyYXBoaWMueW1hZyxcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5vcnRob2dyYXBoaWMueW1hZ1xyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNhbWVyYTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jY2FtZXJhc1tfaUNhbWVyYV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgQW5pbWF0aW9ufSB3aXRoIHRoZSBnaXZlbiBhbmltYXRpb24gbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEFuaW1hdGlvbihfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxBbmltYXRpb24+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW5pbWF0aW9ufSBmb3IgdGhlIGdpdmVuIGFuaW1hdGlvbiBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEFuaW1hdGlvbihfaUFuaW1hdGlvbjogbnVtYmVyKTogUHJvbWlzZTxBbmltYXRpb24+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhbiBhbmltYXRpb24gZnJvbSB0aGUgZ2xURiBmaWxlIGludG8gdGhlIGdpdmVuIHtAbGluayBBbmltYXRpb259LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRBbmltYXRpb248VCBleHRlbmRzIEFuaW1hdGlvbj4oX2lBbmltYXRpb246IG51bWJlciB8IHN0cmluZywgX2FuaW1hdGlvbjogVCk6IFByb21pc2U8VD47XHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0QW5pbWF0aW9uKF9pQW5pbWF0aW9uOiBudW1iZXIgfCBzdHJpbmcsIF9hbmltYXRpb24/OiBBbmltYXRpb24pOiBQcm9taXNlPEFuaW1hdGlvbj4ge1xyXG4gICAgICBfaUFuaW1hdGlvbiA9IHRoaXMuZ2V0SW5kZXgoX2lBbmltYXRpb24sIHRoaXMuI2dsdGYuYW5pbWF0aW9ucyk7XHJcblxyXG4gICAgICBpZiAoX2lBbmltYXRpb24gPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7QW5pbWF0aW9uLm5hbWV9fCR7X2lBbmltYXRpb259YDtcclxuXHJcbiAgICAgIGlmICghX2FuaW1hdGlvbiAmJiB0aGlzLiNyZXNvdXJjZXNbaWRdKVxyXG4gICAgICAgIHJldHVybiA8QW5pbWF0aW9uPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICBjb25zdCBnbHRmQW5pbWF0aW9uOiBHTFRGLkFuaW1hdGlvbiA9IHRoaXMuI2dsdGYuYW5pbWF0aW9ucz8uW19pQW5pbWF0aW9uXTtcclxuXHJcbiAgICAgIGlmICghZ2x0ZkFuaW1hdGlvbilcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgYW5pbWF0aW9uIHdpdGggaW5kZXggJHtfaUFuaW1hdGlvbn0uYCk7XHJcblxyXG4gICAgICBjb25zdCBhbmltYXRpb25TdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICBmb3IgKGNvbnN0IGdsdGZDaGFubmVsIG9mIGdsdGZBbmltYXRpb24uY2hhbm5lbHMpIHtcclxuICAgICAgICBjb25zdCBnbHRmTm9kZTogR0xURi5Ob2RlID0gdGhpcy4jZ2x0Zi5ub2Rlc1tnbHRmQ2hhbm5lbC50YXJnZXQubm9kZV07XHJcbiAgICAgICAgaWYgKCFnbHRmTm9kZSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBsZXQgbm9kZTogR2VuZXJhbCA9IGFuaW1hdGlvblN0cnVjdHVyZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGlOb2RlIG9mIGdsdGZOb2RlLnBhdGgpIHtcclxuICAgICAgICAgIGNvbnN0IGNoaWxkTmFtZTogc3RyaW5nID0gdGhpcy4jZ2x0Zi5ub2Rlc1tpTm9kZV0ubmFtZTtcclxuICAgICAgICAgIC8vIG5vZGUuY2hpbGRyZW5bY2hpbGROYW1lXVxyXG4gICAgICAgICAgbm9kZSA9IChub2RlLmNoaWxkcmVuID8/PSB7fSlbY2hpbGROYW1lXSA/Pz0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBub2RlLmNvbXBvbmVudHMuQ29tcG9uZW50VHJhbnNmb3JtWzBdLm10eExvY2FsXHJcbiAgICAgICAgbGV0IG10eExvY2FsOiBBbmltYXRpb25TZXF1ZW5jZU1hdHJpeDR4NCA9IDxBbmltYXRpb25TZXF1ZW5jZU1hdHJpeDR4ND4oKCgobm9kZS5jb21wb25lbnRzID8/PSB7fSkuQ29tcG9uZW50VHJhbnNmb3JtID8/PSBbXSlbMF0gPz89IHt9KS5tdHhMb2NhbCA/Pz0ge30pO1xyXG4gICAgICAgIG10eExvY2FsW3RvSW50ZXJuVHJhbnNmb3JtYXRpb25bZ2x0ZkNoYW5uZWwudGFyZ2V0LnBhdGhdXSA9XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yKGdsdGZBbmltYXRpb24uc2FtcGxlcnNbZ2x0ZkNoYW5uZWwuc2FtcGxlcl0sIGdsdGZDaGFubmVsLnRhcmdldC5wYXRoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYW5pbWF0aW9uOiBBbmltYXRpb24gPSBfYW5pbWF0aW9uID8/IG5ldyBBbmltYXRpb25HTFRGKCk7XHJcbiAgICAgIGFuaW1hdGlvbi5hbmltYXRpb25TdHJ1Y3R1cmUgPSBhbmltYXRpb25TdHJ1Y3R1cmU7XHJcbiAgICAgIGFuaW1hdGlvbi5jbGVhckNhY2hlKCk7XHJcbiAgICAgIGFuaW1hdGlvbi5uYW1lID0gZ2x0ZkFuaW1hdGlvbi5uYW1lO1xyXG4gICAgICBhbmltYXRpb24uY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBBbmltYXRpb25HTFRGKVxyXG4gICAgICAgIGFuaW1hdGlvbi51cmwgPSB0aGlzLiN1cmw7XHJcbiAgICAgIGlmICghX2FuaW1hdGlvbikge1xyXG4gICAgICAgIFByb2plY3QuZGVyZWdpc3RlcihhbmltYXRpb24pO1xyXG4gICAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSBhbmltYXRpb247XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBhbmltYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgTWVzaEdMVEZ9IHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNZXNoKF9uYW1lOiBzdHJpbmcsIF9pUHJpbWl0aXZlPzogbnVtYmVyKTogUHJvbWlzZTxNZXNoPjtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIE1lc2hHTFRGfSBmb3IgdGhlIGdpdmVuIG1lc2ggaW5kZXggYW5kIHByaW1pdGl2ZSBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2lNZXNoOiBudW1iZXIsIF9pUHJpbWl0aXZlPzogbnVtYmVyKTogUHJvbWlzZTxNZXNoPjtcclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgYSBtZXNoIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgTWVzaH1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNZXNoPFQgZXh0ZW5kcyBNZXNoPihfaU1lc2g6IG51bWJlciB8IHN0cmluZywgX2lQcmltaXRpdmU6IG51bWJlciwgX21lc2g6IFQpOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2lNZXNoOiBudW1iZXIgfCBzdHJpbmcsIF9pUHJpbWl0aXZlOiBudW1iZXIgPSAwLCBfbWVzaD86IE1lc2gpOiBQcm9taXNlPE1lc2g+IHtcclxuICAgICAgX2lNZXNoID0gdGhpcy5nZXRJbmRleChfaU1lc2gsIHRoaXMuI2dsdGYubWVzaGVzKTtcclxuXHJcbiAgICAgIGlmIChfaU1lc2ggPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7TWVzaEdMVEYubmFtZX18JHtfaU1lc2h9fCR7X2lQcmltaXRpdmV9YDtcclxuXHJcbiAgICAgIGlmICghX21lc2ggJiYgdGhpcy4jcmVzb3VyY2VzW2lkXSlcclxuICAgICAgICByZXR1cm4gPE1lc2hHTFRGPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICBjb25zdCBnbHRmTWVzaDogR0xURi5NZXNoID0gdGhpcy4jZ2x0Zi5tZXNoZXNbX2lNZXNoXTtcclxuICAgICAgY29uc3QgZ2x0ZlByaW1pdGl2ZTogR0xURi5NZXNoUHJpbWl0aXZlID0gZ2x0Zk1lc2gucHJpbWl0aXZlc1tfaVByaW1pdGl2ZV07XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5pbmRpY2VzID09IHVuZGVmaW5lZClcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBNZXNoIHdpdGggaW5kZXggJHtfaU1lc2h9IHByaW1pdGl2ZSAke19pUHJpbWl0aXZlfSBoYXMgbm8gaW5kaWNlcy4gRlVER0UgZG9lcyBub3Qgc3VwcG9ydCBub24taW5kZXhlZCBtZXNoZXMuYCk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlBPU0lUSU9OID09IHVuZGVmaW5lZClcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBNZXNoIHdpdGggaW5kZXggJHtfaU1lc2h9IHByaW1pdGl2ZSAke19pUHJpbWl0aXZlfSBoYXMgbm8gcG9zaXRpb24gYXR0cmlidXRlLiBQcmltaXRpdmUgd2lsbCBiZSBpZ25vcmVkLmApO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUubW9kZSAhPSB1bmRlZmluZWQgJiYgZ2x0ZlByaW1pdGl2ZS5tb2RlICE9IEdMVEYuTUVTSF9QUklNSVRJVkVfTU9ERS5UUklBTkdMRVMpXHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogTWVzaCB3aXRoIGluZGV4ICR7X2lNZXNofSBwcmltaXRpdmUgJHtfaVByaW1pdGl2ZX0gaGFzIHRvcG9sb2d5IHR5cGUgbW9kZSAke0dMVEYuTUVTSF9QUklNSVRJVkVfTU9ERVtnbHRmUHJpbWl0aXZlLm1vZGVdfS4gRlVER0Ugb25seSBzdXBwb3J0cyAke0dMVEYuTUVTSF9QUklNSVRJVkVfTU9ERVs0XX0uYCk7XHJcblxyXG4gICAgICBjaGVja01heFN1cHBvcnQodGhpcywgXCJURVhDT09SRFwiLCAyKTtcclxuICAgICAgY2hlY2tNYXhTdXBwb3J0KHRoaXMsIFwiQ09MT1JcIiwgMSk7XHJcbiAgICAgIGNoZWNrTWF4U3VwcG9ydCh0aGlzLCBcIkpPSU5UU1wiLCAxKTtcclxuICAgICAgY2hlY2tNYXhTdXBwb3J0KHRoaXMsIFwiV0VJR0hUU1wiLCAxKTtcclxuXHJcbiAgICAgIGxldCB2ZXJ0aWNlczogRmxvYXQzMkFycmF5LCBpbmRpY2VzOiBVaW50MTZBcnJheTtcclxuICAgICAgbGV0IG5vcm1hbHM6IEZsb2F0MzJBcnJheSwgdGFuZ2VudHM6IEZsb2F0MzJBcnJheTtcclxuICAgICAgbGV0IGNvbG9yczogRmxvYXQzMkFycmF5LCB0ZXh0dXJlVVZzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAgIGxldCBib25lczogVWludDhBcnJheSwgd2VpZ2h0czogRmxvYXQzMkFycmF5O1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuaW5kaWNlcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpbmRpY2VzID0gYXdhaXQgdGhpcy5nZXRWZXJ0ZXhJbmRpY2VzKGdsdGZQcmltaXRpdmUuaW5kaWNlcyk7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICAgIGNvbnN0IHRlbXA6IG51bWJlciA9IGluZGljZXNbaSArIDJdO1xyXG4gICAgICAgICAgaW5kaWNlc1tpICsgMl0gPSBpbmRpY2VzW2kgKyAwXTtcclxuICAgICAgICAgIGluZGljZXNbaSArIDBdID0gaW5kaWNlc1tpICsgMV07XHJcbiAgICAgICAgICBpbmRpY2VzW2kgKyAxXSA9IHRlbXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IE1lc2ggd2l0aCBpbmRleCAke19pTWVzaH0gcHJpbWl0aXZlICR7X2lQcmltaXRpdmV9IGhhcyBubyBpbmRpY2VzLiBGVURHRSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1pbmRleGVkIG1lc2hlcy5gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5QT1NJVElPTiAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdmVydGljZXMgPSBhd2FpdCB0aGlzLmdldEZsb2F0MzJBcnJheShnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuUE9TSVRJT04pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogTWVzaCB3aXRoIGluZGV4ICR7X2lNZXNofSBwcmltaXRpdmUgJHtfaVByaW1pdGl2ZX0gaGFzIG5vIHBvc2l0aW9uIGF0dHJpYnV0ZS4gUHJpbWl0aXZlIHdpbGwgYmUgaWdub3JlZC5gKTtcclxuXHJcbiAgICAgIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuTk9STUFMICE9IHVuZGVmaW5lZClcclxuICAgICAgICBub3JtYWxzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLk5PUk1BTCk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRBTkdFTlQgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRhbmdlbnRzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRBTkdFTlQpO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5URVhDT09SRF8xICE9IHVuZGVmaW5lZClcclxuICAgICAgICB0ZXh0dXJlVVZzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRFWENPT1JEXzEpO1xyXG4gICAgICBlbHNlIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuVEVYQ09PUkRfMCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGV4dHVyZVVWcyA9IGF3YWl0IHRoaXMuZ2V0RmxvYXQzMkFycmF5KGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5URVhDT09SRF8wKTtcclxuXHJcbiAgICAgIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuQ09MT1JfMCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgY29sb3JzID0gYXdhaXQgdGhpcy5nZXRWZXJ0ZXhDb2xvcnMoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLkNPTE9SXzApO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5KT0lOVFNfMCAhPSB1bmRlZmluZWQgJiYgZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLldFSUdIVFNfMCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBib25lcyA9IGF3YWl0IHRoaXMuZ2V0Qm9uZUluZGljZXMoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLkpPSU5UU18wKTtcclxuICAgICAgICB3ZWlnaHRzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLldFSUdIVFNfMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG1lc2g6IE1lc2ggPSBfbWVzaCA/PyBuZXcgTWVzaEdMVEYoKTtcclxuICAgICAgbWVzaC5uYW1lID0gZ2x0Zk1lc2gubmFtZTtcclxuICAgICAgaWYgKG1lc2ggaW5zdGFuY2VvZiBNZXNoR0xURikge1xyXG4gICAgICAgIG1lc2guaVByaW1pdGl2ZSA9IF9pUHJpbWl0aXZlO1xyXG4gICAgICAgIG1lc2gudXJsID0gdGhpcy4jdXJsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChfbWVzaCkge1xyXG4gICAgICAgIF9tZXNoLmNsZWFyKCk7XHJcbiAgICAgICAgX21lc2guZmFjZXMgPSBbXTtcclxuICAgICAgICBfbWVzaC52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gQ3JlYXRlIG1lc2ggdmVydGljZXMgYW5kIGZhY2VzIHNvIHRoYXQgbm9ybWFscyBhbmQgdGFuZ2VudHMgY2FuIGJlIGNhbGN1bGF0ZWQgaWYgbWlzc2luZy4gSWYgdGhleSBhcmUgbm90IG1pc3NpbmcgdGhpcyBjb3VsZCBiZSBvbWl0dGVkLlxyXG4gICAgICBmb3IgKGxldCBpVmVjdG9yMjogbnVtYmVyID0gMCwgaVZlY3RvcjM6IG51bWJlciA9IDAsIGlWZWN0b3I0OiBudW1iZXIgPSAwOyBpVmVjdG9yMyA8IHZlcnRpY2VzPy5sZW5ndGg7IGlWZWN0b3IyICs9IDIsIGlWZWN0b3IzICs9IDMsIGlWZWN0b3I0ICs9IDQpIHtcclxuICAgICAgICBtZXNoLnZlcnRpY2VzLnB1c2goXHJcbiAgICAgICAgICBuZXcgVmVydGV4KFxyXG4gICAgICAgICAgICBuZXcgVmVjdG9yMyh2ZXJ0aWNlc1tpVmVjdG9yMyArIDBdLCB2ZXJ0aWNlc1tpVmVjdG9yMyArIDFdLCB2ZXJ0aWNlc1tpVmVjdG9yMyArIDJdKSxcclxuICAgICAgICAgICAgdGV4dHVyZVVWcyA/XHJcbiAgICAgICAgICAgICAgbmV3IFZlY3RvcjIodGV4dHVyZVVWc1tpVmVjdG9yMiArIDBdLCB0ZXh0dXJlVVZzW2lWZWN0b3IyICsgMV0pIDpcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIG5vcm1hbHMgP1xyXG4gICAgICAgICAgICAgIG5ldyBWZWN0b3IzKG5vcm1hbHNbaVZlY3RvcjMgKyAwXSwgbm9ybWFsc1tpVmVjdG9yMyArIDFdLCBub3JtYWxzW2lWZWN0b3IzICsgMl0pIDpcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRhbmdlbnRzID9cclxuICAgICAgICAgICAgICBuZXcgVmVjdG9yNCh0YW5nZW50c1tpVmVjdG9yNCArIDBdLCB0YW5nZW50c1tpVmVjdG9yNCArIDFdLCB0YW5nZW50c1tpVmVjdG9yNCArIDJdLCB0YW5nZW50c1tpVmVjdG9yNCArIDNdKSA6XHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBjb2xvcnMgP1xyXG4gICAgICAgICAgICAgIG5ldyBDb2xvcihjb2xvcnNbaVZlY3RvcjQgKyAwXSwgY29sb3JzW2lWZWN0b3I0ICsgMV0sIGNvbG9yc1tpVmVjdG9yNCArIDJdLCBjb2xvcnNbaVZlY3RvcjQgKyAzXSkgOlxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgYm9uZXMgJiYgd2VpZ2h0cyA/XHJcbiAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgeyBpbmRleDogYm9uZXNbaVZlY3RvcjQgKyAwXSwgd2VpZ2h0OiB3ZWlnaHRzW2lWZWN0b3I0ICsgMF0gfSxcclxuICAgICAgICAgICAgICAgIHsgaW5kZXg6IGJvbmVzW2lWZWN0b3I0ICsgMV0sIHdlaWdodDogd2VpZ2h0c1tpVmVjdG9yNCArIDFdIH0sXHJcbiAgICAgICAgICAgICAgICB7IGluZGV4OiBib25lc1tpVmVjdG9yNCArIDJdLCB3ZWlnaHQ6IHdlaWdodHNbaVZlY3RvcjQgKyAyXSB9LFxyXG4gICAgICAgICAgICAgICAgeyBpbmRleDogYm9uZXNbaVZlY3RvcjQgKyAzXSwgd2VpZ2h0OiB3ZWlnaHRzW2lWZWN0b3I0ICsgM10gfVxyXG4gICAgICAgICAgICAgIF0gOlxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGlGYWNlVmVydGV4SW5kZXg6IG51bWJlciA9IDA7IGlGYWNlVmVydGV4SW5kZXggPCBpbmRpY2VzPy5sZW5ndGg7IGlGYWNlVmVydGV4SW5kZXggKz0gMykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBtZXNoLmZhY2VzLnB1c2gobmV3IEZhY2UoXHJcbiAgICAgICAgICAgIG1lc2gudmVydGljZXMsXHJcbiAgICAgICAgICAgIGluZGljZXNbaUZhY2VWZXJ0ZXhJbmRleCArIDBdLFxyXG4gICAgICAgICAgICBpbmRpY2VzW2lGYWNlVmVydGV4SW5kZXggKyAxXSxcclxuICAgICAgICAgICAgaW5kaWNlc1tpRmFjZVZlcnRleEluZGV4ICsgMl1cclxuICAgICAgICAgICkpO1xyXG4gICAgICAgIH0gY2F0Y2ggKF9lOiB1bmtub3duKSB7XHJcbiAgICAgICAgICBEZWJ1Zy5mdWRnZShcIkZhY2UgZXhjbHVkZWRcIiwgKDxFcnJvcj5fZSkubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLnZlcnRpY2VzID0gdmVydGljZXM7XHJcbiAgICAgIG1lc2gucmVuZGVyTWVzaC5pbmRpY2VzID0gaW5kaWNlcztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLm5vcm1hbHMgPSBub3JtYWxzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2gudGFuZ2VudHMgPSB0YW5nZW50cztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLnRleHR1cmVVVnMgPSB0ZXh0dXJlVVZzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2guY29sb3JzID0gY29sb3JzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2guYm9uZXMgPSBib25lcztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLndlaWdodHMgPSB3ZWlnaHRzO1xyXG5cclxuICAgICAgaWYgKCFfbWVzaCkge1xyXG4gICAgICAgIFByb2plY3QuZGVyZWdpc3RlcihtZXNoKTtcclxuICAgICAgICAvLyBtZXNoLmlkUmVzb3VyY2UgPSBpZDtcclxuICAgICAgICB0aGlzLiNyZXNvdXJjZXNbaWRdID0gbWVzaDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG1lc2g7XHJcblxyXG4gICAgICBmdW5jdGlvbiBjaGVja01heFN1cHBvcnQoX2xvYWRlcjogR0xURkxvYWRlciwgX2NoZWNrOiBzdHJpbmcsIF9tYXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMpLmZpbHRlcigoX2tleTogc3RyaW5nKSA9PiBfa2V5LnN0YXJ0c1dpdGgoX2NoZWNrKSkubGVuZ3RoID4gX21heClcclxuICAgICAgICAgIERlYnVnLndhcm4oYCR7X2xvYWRlcn06IE1lc2ggd2l0aCBpbmRleCAke19pTWVzaH0gcHJpbWl0aXZlICR7X2lQcmltaXRpdmV9IGhhcyBtb3JlIHRoYW4gJHtfbWF4fSBzZXRzIG9mICcke19jaGVja30nIGFzc29jaWF0ZWQgd2l0aCBpdC4gRlVHREUgb25seSBzdXBwb3J0cyB1cCB0byAke19tYXh9ICR7X2NoZWNrfSBzZXRzIHBlciBwcmltaXRpdmUuYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHtAbGluayBNYXRlcmlhbEdMVEZ9IHdpdGggdGhlIGdpdmVuIG1hdGVyaWFsIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNYXRlcmlhbChfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxNYXRlcmlhbD47XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBNYXRlcmlhbH0gZm9yIHRoZSBnaXZlbiBtYXRlcmlhbCBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1hdGVyaWFsKF9pTWF0ZXJpYWw6IG51bWJlcik6IFByb21pc2U8TWF0ZXJpYWw+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIG1hdGVyaWFsIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgTWF0ZXJpYWx9LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNYXRlcmlhbDxUIGV4dGVuZHMgTWF0ZXJpYWw+KF9pTWF0ZXJpYWw6IG51bWJlciB8IHN0cmluZywgX21hdGVyaWFsPzogVCwgX3NraW4/OiBib29sZWFuLCBfZmxhdD86IGJvb2xlYW4pOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1hdGVyaWFsKF9pTWF0ZXJpYWw6IG51bWJlciB8IHN0cmluZywgX21hdGVyaWFsPzogTWF0ZXJpYWwsIF9za2luOiBib29sZWFuID0gZmFsc2UsIF9mbGF0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPE1hdGVyaWFsPiB7XHJcbiAgICAgIF9pTWF0ZXJpYWwgPSB0aGlzLmdldEluZGV4KF9pTWF0ZXJpYWwsIHRoaXMuI2dsdGYubWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIGlmIChfaU1hdGVyaWFsID09IC0xKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgY29uc3QgaWQ6IHN0cmluZyA9IGAke01hdGVyaWFsLm5hbWV9fCR7X2lNYXRlcmlhbH1gO1xyXG5cclxuICAgICAgaWYgKHRoaXMuI3Jlc291cmNlc1tpZF0gJiYgIV9tYXRlcmlhbClcclxuICAgICAgICByZXR1cm4gPE1hdGVyaWFsPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICAvLyBUT0RPOiBpbiB0aGUgZnV0dXJlIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSBzaGFkZXIgYmFzZWQgb24gdGhlIGdsVEYgbWF0ZXJpYWwgcHJvcGVydGllc1xyXG4gICAgICBjb25zdCBnbHRmTWF0ZXJpYWw6IEdMVEYuTWF0ZXJpYWwgPSB0aGlzLiNnbHRmLm1hdGVyaWFsc1tfaU1hdGVyaWFsXTtcclxuXHJcbiAgICAgIGlmICghZ2x0Zk1hdGVyaWFsKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBtYXRlcmlhbCB3aXRoIGluZGV4ICR7X2lNYXRlcmlhbH0uYCk7XHJcblxyXG4gICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3Igb3RoZXIgZ2xURiBtYXRlcmlhbCBwcm9wZXJ0aWVzOiBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjcmVmZXJlbmNlLW1hdGVyaWFsXHJcbiAgICAgIC8vIGUuZy4gb2NjbHVzaW9uIGFuZCBlbWlzc2l2ZSB0ZXh0dXJlczsgZG91YmxlU2lkZWRcclxuICAgICAgY29uc3QgZ2x0ZkJhc2VDb2xvckZhY3RvcjogbnVtYmVyW10gPSBnbHRmTWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3M/LmJhc2VDb2xvckZhY3RvciA/PyBbMSwgMSwgMSwgMV07XHJcbiAgICAgIGNvbnN0IGdsdGZNZXRhbGxpY0ZhY3RvcjogbnVtYmVyID0gZ2x0Zk1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzPy5tZXRhbGxpY0ZhY3RvciA/PyAxO1xyXG4gICAgICBjb25zdCBnbHRmUm91Z2huZXNzRmFjdG9yOiBudW1iZXIgPSBnbHRmTWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3M/LnJvdWdobmVzc0ZhY3RvciA/PyAxO1xyXG4gICAgICBjb25zdCBnbHRmRW1pc3NpdmVGYWN0b3I6IG51bWJlcltdID0gZ2x0Zk1hdGVyaWFsLmVtaXNzaXZlRmFjdG9yID8/IFswLCAwLCAwXTtcclxuXHJcbiAgICAgIC8vIGNvbnN0IGdsdGZNZXRhbGxpY1JvdWdobmVzc1RleHR1cmU6IEdMVEYuVGV4dHVyZUluZm8gPSBnbHRmTWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3M/Lm1ldGFsbGljUm91Z2huZXNzVGV4dHVyZTtcclxuICAgICAgLy8gaWYgKGdsdGZNZXRhbGxpY1JvdWdobmVzc1RleHR1cmUpIHtcclxuICAgICAgLy8gICAvLyBUT0RPOiBtYXliZSB0aHJvdyB0aGlzIG91dCBpZiBpdCBjb3N0cyB0b28gbXVjaCBwZXJmb3JtYW5jZSwgb3IgYWRkIHRoZSB0ZXh0dXJlIHRvIHRoZSBtYXRlcmlhbFxyXG4gICAgICAvLyAgIC8vIGF2ZXJhZ2UgbWV0YWxsaWMgYW5kIHJvdWdobmVzcyB2YWx1ZXNcclxuICAgICAgLy8gICBjb25zdCBtZXRhbGxpY1JvdWdobmVzc1RleHR1cmU6IFRleHR1cmVJbWFnZSA9IGF3YWl0IHRoaXMuZ2V0VGV4dHVyZShnbHRmTWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlLmluZGV4KSBhcyBUZXh0dXJlSW1hZ2U7XHJcbiAgICAgIC8vICAgbGV0IGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50ID0gbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlLmltYWdlO1xyXG4gICAgICAvLyAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgLy8gICBjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcclxuICAgICAgLy8gICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xyXG4gICAgICAvLyAgIGxldCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgIC8vICAgY3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7XHJcbiAgICAgIC8vICAgbGV0IGltYWdlRGF0YTogSW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0KTtcclxuICAgICAgLy8gICBsZXQgZGF0YTogVWludDhDbGFtcGVkQXJyYXkgPSBpbWFnZURhdGEuZGF0YTtcclxuXHJcbiAgICAgIC8vICAgbGV0IHN1bU1ldGFsbGljOiBudW1iZXIgPSAwO1xyXG4gICAgICAvLyAgIGxldCBzdW1Sb3VnaG5lc3M6IG51bWJlciA9IDA7XHJcbiAgICAgIC8vICAgZm9yIChsZXQgaVBpeGVsOiBudW1iZXIgPSAwOyBpUGl4ZWwgPCBkYXRhLmxlbmd0aDsgaVBpeGVsICs9IDQpIHtcclxuICAgICAgLy8gICAgIHN1bU1ldGFsbGljICs9IGRhdGFbaVBpeGVsICsgMl0gLyAyNTU7XHJcbiAgICAgIC8vICAgICBzdW1Sb3VnaG5lc3MgKz0gZGF0YVtpUGl4ZWwgKyAxXSAvIDI1NTtcclxuICAgICAgLy8gICB9XHJcblxyXG4gICAgICAvLyAgIGNvbnN0IGF2ZXJhZ2VNZXRhbGxpYzogbnVtYmVyID0gc3VtTWV0YWxsaWMgLyAoZGF0YS5sZW5ndGggLyA0KTtcclxuICAgICAgLy8gICBjb25zdCBhdmVyYWdlUm91Z2huZXNzOiBudW1iZXIgPSBzdW1Sb3VnaG5lc3MgLyAoZGF0YS5sZW5ndGggLyA0KTtcclxuXHJcbiAgICAgIC8vICAgZ2x0Zk1ldGFsbGljRmFjdG9yICo9IGF2ZXJhZ2VNZXRhbGxpYztcclxuICAgICAgLy8gICBnbHRmUm91Z2huZXNzRmFjdG9yICo9IGF2ZXJhZ2VSb3VnaG5lc3M7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGNvbnN0IGdsdGZCYXNlQ29sb3JUZXh0dXJlOiBHTFRGLlRleHR1cmVJbmZvID0gZ2x0Zk1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzPy5iYXNlQ29sb3JUZXh0dXJlO1xyXG4gICAgICBjb25zdCBnbHRmTm9ybWFsVGV4dHVyZTogR0xURi5NYXRlcmlhbE5vcm1hbFRleHR1cmVJbmZvID0gZ2x0Zk1hdGVyaWFsLm5vcm1hbFRleHR1cmU7XHJcblxyXG4gICAgICAvLyBUaGUgZGlmZnVzZSBjb250cmlidXRpb24gaW4gdGhlIFBob25nIHNoYWRpbmcgbW9kZWwuIFJlcHJlc2VudHMgaG93IG11Y2ggbGlnaHQgaXMgc2NhdHRlcmVkIGluIGRpZmZlcmVudCBkaXJlY3Rpb25zIGR1ZSB0byB0aGUgbWF0ZXJpYWwncyBzdXJmYWNlIHByb3BlcnRpZXMuXHJcbiAgICAgIGNvbnN0IGRpZmZ1c2U6IG51bWJlciA9IDE7XHJcbiAgICAgIC8vIFRoZSBzaGluaW5lc3Mgb2YgdGhlIG1hdGVyaWFsLiBJbmZsdWVuY2VzIHRoZSBzaGFycG5lc3Mgb3IgYnJvYWRuZXNzIG9mIHRoZSBzcGVjdWxhciBoaWdobGlnaHQuIEhpZ2hlciBzcGVjdWxhciB2YWx1ZXMgcmVzdWx0IGluIGEgc2hhcnBlciBhbmQgbW9yZSBjb25jZW50cmF0ZWQgc3BlY3VsYXIgaGlnaGxpZ2h0LlxyXG4gICAgICBjb25zdCBzcGVjdWxhcjogbnVtYmVyID0gMS44ICogKDEgLSBnbHRmUm91Z2huZXNzRmFjdG9yKSArIDAuNiAqIGdsdGZNZXRhbGxpY0ZhY3RvcjtcclxuICAgICAgLy8gVGhlIHN0cmVuZ3RoL2ludGVuc2l0eSBvZiB0aGUgc3BlY3VsYXIgcmVmbGVjdGlvblxyXG4gICAgICBjb25zdCBpbnRlbnNpdHk6IG51bWJlciA9IDAuNyAqICgxIC0gZ2x0ZlJvdWdobmVzc0ZhY3RvcikgKyBnbHRmTWV0YWxsaWNGYWN0b3I7XHJcbiAgICAgIC8vIEluZmx1ZW5jZXMgaG93IG11Y2ggdGhlIG1hdGVyaWFsJ3MgY29sb3IgYWZmZWN0cyB0aGUgc3BlY3VsYXIgcmVmbGVjdGlvbi4gV2hlbiBtZXRhbGxpYyBpcyBoaWdoZXIsIHRoZSBzcGVjdWxhciByZWZsZWN0aW9uIHRha2VzIG9uIHRoZSBjb2xvciBvZiB0aGUgbWF0ZXJpYWwsIGNyZWF0aW5nIGEgbWV0YWxsaWMgYXBwZWFyYW5jZS4gUmFuZ2UgZnJvbSAwLjAgdG8gMS4wLlxyXG4gICAgICBjb25zdCBtZXRhbGxpYzogbnVtYmVyID0gZ2x0Zk1ldGFsbGljRmFjdG9yO1xyXG5cclxuICAgICAgY29uc3QgaXNMaXQ6IGJvb2xlYW4gPSBnbHRmRW1pc3NpdmVGYWN0b3JbMF0gPT0gMSAmJiBnbHRmRW1pc3NpdmVGYWN0b3JbMV0gPT0gMSB8fCBnbHRmRW1pc3NpdmVGYWN0b3JbMl0gPT0gMTtcclxuICAgICAgY29uc3QgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKC4uLmdsdGZCYXNlQ29sb3JGYWN0b3IpO1xyXG4gICAgICBjb25zdCBjb2F0OiBDb2F0ID0gZ2x0ZkJhc2VDb2xvclRleHR1cmUgP1xyXG4gICAgICAgIGlzTGl0ID8gbmV3IENvYXRUZXh0dXJlZChjb2xvciwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZCYXNlQ29sb3JUZXh0dXJlLmluZGV4KSkgOlxyXG4gICAgICAgICAgZ2x0Zk5vcm1hbFRleHR1cmUgP1xyXG4gICAgICAgICAgICBuZXcgQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFscyhjb2xvciwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZCYXNlQ29sb3JUZXh0dXJlLmluZGV4KSwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZOb3JtYWxUZXh0dXJlLmluZGV4KSwgZGlmZnVzZSwgc3BlY3VsYXIsIGludGVuc2l0eSwgbWV0YWxsaWMpIDpcclxuICAgICAgICAgICAgbmV3IENvYXRSZW1pc3NpdmVUZXh0dXJlZChjb2xvciwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZCYXNlQ29sb3JUZXh0dXJlLmluZGV4KSwgZGlmZnVzZSwgc3BlY3VsYXIsIGludGVuc2l0eSwgbWV0YWxsaWMpIDpcclxuICAgICAgICBpc0xpdCA/IG5ldyBDb2F0Q29sb3JlZChjb2xvcikgOiBuZXcgQ29hdFJlbWlzc2l2ZShjb2xvciwgZGlmZnVzZSwgc3BlY3VsYXIsIGludGVuc2l0eSwgbWV0YWxsaWMpO1xyXG5cclxuICAgICAgbGV0IHNoYWRlcjogdHlwZW9mIFNoYWRlcjtcclxuICAgICAgaWYgKF9mbGF0KSB7IC8vIFRPRE86IG1ha2UgZmxhdCBhIGZsYWcgaW4gdGhlIG1hdGVyaWFsIHNvIHRoYXQgd2UgY2FuIGhhdmUgZmxhdCBtZXNoIHdpdGggcGhvbmcgc2hhZGluZyBncmFkaWVudHNcclxuICAgICAgICBzaGFkZXIgPSBnbHRmQmFzZUNvbG9yVGV4dHVyZSA/XHJcbiAgICAgICAgICAoX3NraW4gPyBTaGFkZXJGbGF0VGV4dHVyZWRTa2luIDogU2hhZGVyRmxhdFRleHR1cmVkKSA6XHJcbiAgICAgICAgICAoX3NraW4gPyBTaGFkZXJGbGF0U2tpbiA6IFNoYWRlckZsYXQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzTGl0KSB7XHJcbiAgICAgICAgc2hhZGVyID0gZ2x0ZkJhc2VDb2xvclRleHR1cmUgP1xyXG4gICAgICAgICAgKF9za2luID8gU2hhZGVyTGl0VGV4dHVyZWRTa2luIDogU2hhZGVyTGl0VGV4dHVyZWQpIDpcclxuICAgICAgICAgIChfc2tpbiA/IFNoYWRlckxpdFNraW4gOiBTaGFkZXJMaXQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNoYWRlciA9IGdsdGZCYXNlQ29sb3JUZXh0dXJlID9cclxuICAgICAgICAgIGdsdGZOb3JtYWxUZXh0dXJlID9cclxuICAgICAgICAgICAgKF9za2luID8gU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHNTa2luIDogU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHMpIDpcclxuICAgICAgICAgICAgKF9za2luID8gU2hhZGVyUGhvbmdUZXh0dXJlZFNraW4gOiBTaGFkZXJQaG9uZ1RleHR1cmVkKSA6XHJcbiAgICAgICAgICAoX3NraW4gPyBTaGFkZXJQaG9uZ1NraW4gOiBTaGFkZXJQaG9uZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IF9tYXRlcmlhbCA/PyBuZXcgTWF0ZXJpYWxHTFRGKGdsdGZNYXRlcmlhbC5uYW1lKTtcclxuICAgICAgbWF0ZXJpYWwubmFtZSA9IGdsdGZNYXRlcmlhbC5uYW1lO1xyXG4gICAgICBtYXRlcmlhbC5jb2F0ID0gY29hdDtcclxuICAgICAgaWYgKGdsdGZNYXRlcmlhbC5hbHBoYUNsaXAgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIG1hdGVyaWFsLmFscGhhQ2xpcCA9IGdsdGZNYXRlcmlhbC5hbHBoYUNsaXA7XHJcbiAgICAgIFJlZmxlY3Quc2V0KG1hdGVyaWFsLCBcInNoYWRlclR5cGVcIiwgc2hhZGVyKTtcclxuICAgICAgLy8gbWF0ZXJpYWwuc2V0U2hhZGVyKHNoYWRlcik7XHJcbiAgICAgIGlmIChtYXRlcmlhbCBpbnN0YW5jZW9mIE1hdGVyaWFsR0xURilcclxuICAgICAgICBtYXRlcmlhbC51cmwgPSB0aGlzLiN1cmw7XHJcblxyXG4gICAgICBpZiAoIV9tYXRlcmlhbCkge1xyXG4gICAgICAgIFByb2plY3QuZGVyZWdpc3RlcihtYXRlcmlhbCk7XHJcbiAgICAgICAgdGhpcy4jcmVzb3VyY2VzW2lkXSA9IG1hdGVyaWFsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbWF0ZXJpYWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGV4dHVyZX0gZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIGluZGV4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0VGV4dHVyZShfaVRleHR1cmU6IG51bWJlcik6IFByb21pc2U8VGV4dHVyZT4ge1xyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7VGV4dHVyZS5uYW1lfXwke19pVGV4dHVyZX1gO1xyXG5cclxuICAgICAgaWYgKHRoaXMuI3Jlc291cmNlc1tpZF0pXHJcbiAgICAgICAgcmV0dXJuIDxUZXh0dXJlPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICBjb25zdCBnbHRmVGV4dHVyZTogR0xURi5UZXh0dXJlID0gdGhpcy4jZ2x0Zi50ZXh0dXJlc1tfaVRleHR1cmVdO1xyXG4gICAgICBjb25zdCBnbHRmU2FtcGxlcjogR0xURi5TYW1wbGVyID0gdGhpcy4jZ2x0Zi5zYW1wbGVycz8uW2dsdGZUZXh0dXJlLnNhbXBsZXJdO1xyXG4gICAgICBjb25zdCBnbHRmSW1hZ2U6IEdMVEYuSW1hZ2UgPSB0aGlzLiNnbHRmLmltYWdlcz8uW2dsdGZUZXh0dXJlLnNvdXJjZV07XHJcblxyXG4gICAgICBpZiAoZ2x0ZkltYWdlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IFRleHR1cmUgd2l0aCBpbmRleCAke19pVGV4dHVyZX0gaGFzIG5vIGltYWdlLmApO1xyXG4gICAgICAgIHJldHVybiBUZXh0dXJlRGVmYXVsdC5jb2xvcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHVybDogc3RyaW5nID0gbmV3IFVSTChnbHRmSW1hZ2UudXJpLCBuZXcgVVJMKHRoaXMuI3VybCwgUHJvamVjdC5iYXNlVVJMKSkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgIGlmICghZ2x0ZkltYWdlLnVyaSAmJiBnbHRmSW1hZ2UuYnVmZmVyVmlldykge1xyXG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgZHVwbGljYXRlIGNvZGUgZnJvbSBnZXRCdWZmZXJEYXRhLCBtYXliZSByZWZhY3RvciBnZXRCdWZmZXJEYXRhIHRvIGhhbmRsZSBidWZmZXJWaWV3SW5kZXggaW5wdXRcclxuICAgICAgICBjb25zdCBnbHRmQnVmZmVyVmlldzogR0xURi5CdWZmZXJWaWV3ID0gdGhpcy4jZ2x0Zi5idWZmZXJWaWV3c1tnbHRmSW1hZ2UuYnVmZmVyVmlld107XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1ZmZlcjogQXJyYXlCdWZmZXIgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlcihnbHRmQnVmZmVyVmlldy5idWZmZXIpO1xyXG4gICAgICAgIGNvbnN0IGJ5dGVPZmZzZXQ6IG51bWJlciA9IGdsdGZCdWZmZXJWaWV3LmJ5dGVPZmZzZXQgfHwgMDtcclxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoOiBudW1iZXIgPSBnbHRmQnVmZmVyVmlldy5ieXRlTGVuZ3RoIHx8IDA7XHJcblxyXG4gICAgICAgIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoXHJcbiAgICAgICAgICBbbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoIC8gVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCldLFxyXG4gICAgICAgICAgeyB0eXBlOiBnbHRmSW1hZ2UubWltZVR5cGUgfVxyXG4gICAgICAgICkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB0ZXh0dXJlOiBUZXh0dXJlSW1hZ2UgPSBuZXcgVGV4dHVyZUltYWdlKCk7XHJcbiAgICAgIGF3YWl0IHRleHR1cmUubG9hZCh1cmwpO1xyXG5cclxuICAgICAgaWYgKGdsdGZTYW1wbGVyKSB7XHJcbiAgICAgICAgZ2x0ZlNhbXBsZXIubWFnRmlsdGVyID0gZ2x0ZlNhbXBsZXIubWFnRmlsdGVyID8/IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVDsgLy8gZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGdsdGZTYW1wbGVyLm1pbkZpbHRlciA9IGdsdGZTYW1wbGVyLm1pbkZpbHRlciA/PyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1Q7IC8vIGRlZmF1bHQgdmFsdWVcclxuXHJcbiAgICAgICAgaWYgKGdsdGZTYW1wbGVyLm1hZ0ZpbHRlciA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QgJiYgZ2x0ZlNhbXBsZXIubWluRmlsdGVyID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVClcclxuICAgICAgICAgIHRleHR1cmUubWlwbWFwID0gTUlQTUFQLkNSSVNQO1xyXG4gICAgICAgIGVsc2UgaWYgKGdsdGZTYW1wbGVyLm1hZ0ZpbHRlciA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QgJiYgZ2x0ZlNhbXBsZXIubWluRmlsdGVyID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVF9NSVBNQVBfTElORUFSKVxyXG4gICAgICAgICAgdGV4dHVyZS5taXBtYXAgPSBNSVBNQVAuTUVESVVNO1xyXG4gICAgICAgIGVsc2UgaWYgKGdsdGZTYW1wbGVyLm1hZ0ZpbHRlciA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUiAmJiBnbHRmU2FtcGxlci5taW5GaWx0ZXIgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FQVJfTUlQTUFQX0xJTkVBUilcclxuICAgICAgICAgIHRleHR1cmUubWlwbWFwID0gTUlQTUFQLkJMVVJSWTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBUZXh0dXJlIHdpdGggaW5kZXggJHtfaVRleHR1cmV9IGhhcyBhIG1hZ0ZpbHRlciBhbmQgbWluRmlsdGVyIG9mICcke2dldFdlYkdMUGFyYW1ldGVyTmFtZShnbHRmU2FtcGxlci5tYWdGaWx0ZXIpfScgYW5kICcke2dldFdlYkdMUGFyYW1ldGVyTmFtZShnbHRmU2FtcGxlci5taW5GaWx0ZXIpfScgcmVzcGVjdGl2ZWx5LiBGVURHRSBvbmx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOiBORUFSRVNUIGFuZCBORUFSRVNUIHwgTkVBUkVTVCBhbmQgTkVBUkVTVF9NSVBNQVBfTElORUFSIHwgTElORUFSIGFuZCBMSU5FQVJfTUlQTUFQX0xJTkVBUi5gKTtcclxuXHJcbiAgICAgICAgZ2x0ZlNhbXBsZXIud3JhcFMgPSBnbHRmU2FtcGxlci53cmFwUyA/PyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJFUEVBVDsgLy8gZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGdsdGZTYW1wbGVyLndyYXBUID0gZ2x0ZlNhbXBsZXIud3JhcFQgPz8gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SRVBFQVQ7IC8vIGRlZmF1bHQgdmFsdWVcclxuXHJcbiAgICAgICAgaWYgKGdsdGZTYW1wbGVyLndyYXBTID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVQRUFUICYmIGdsdGZTYW1wbGVyLndyYXBUID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVQRUFUKVxyXG4gICAgICAgICAgdGV4dHVyZS53cmFwID0gV1JBUC5SRVBFQVQ7XHJcbiAgICAgICAgZWxzZSBpZiAoZ2x0ZlNhbXBsZXIud3JhcFMgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFICYmIGdsdGZTYW1wbGVyLndyYXBUID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSlcclxuICAgICAgICAgIHRleHR1cmUud3JhcCA9IFdSQVAuQ0xBTVA7XHJcbiAgICAgICAgZWxzZSBpZiAoZ2x0ZlNhbXBsZXIud3JhcFMgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5NSVJST1JFRF9SRVBFQVQgJiYgZ2x0ZlNhbXBsZXIud3JhcFQgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5NSVJST1JFRF9SRVBFQVQpXHJcbiAgICAgICAgICB0ZXh0dXJlLndyYXAgPSBXUkFQLk1JUlJPUjtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBUZXh0dXJlIHdpdGggaW5kZXggJHtfaVRleHR1cmV9IGhhcyBhIHdyYXBTIGFuZCB3cmFwVCBvZiAnJHtnZXRXZWJHTFBhcmFtZXRlck5hbWUoZ2x0ZlNhbXBsZXIud3JhcFMpfScgYW5kICcke2dldFdlYkdMUGFyYW1ldGVyTmFtZShnbHRmU2FtcGxlci53cmFwVCl9JyByZXNwZWN0aXZlbHkuIEZVREdFIG9ubHkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb21iaW5hdGlvbnM6IFJFUEVBVCBhbmQgUkVQRUFUIHwgQ0xBTVBfVE9fRURHRSBhbmQgQ0xBTVBfVE9fRURHRSB8IE1JUlJPUkVEX1JFUEVBVCBhbmQgTUlSUk9SRURfUkVQRUFULmApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBQcm9qZWN0LmRlcmVnaXN0ZXIodGV4dHVyZSk7XHJcbiAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSB0ZXh0dXJlO1xyXG5cclxuICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFJldHVybnMgdGhlIGZpcnN0IHtAbGluayBDb21wb25lbnRTa2VsZXRvbn0gd2l0aCB0aGUgZ2l2ZW4gc2tlbGV0b24gbmFtZS5cclxuICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2tlbGV0b24oX25hbWU6IHN0cmluZyk6IFByb21pc2U8Q29tcG9uZW50U2tlbGV0b24+IHtcclxuICAgICAgY29uc3QgaVNrZWxldG9uOiBudW1iZXIgPSB0aGlzLiNnbHRmLnNraW5zLmZpbmRJbmRleChfc2tlbGV0b24gPT4gX3NrZWxldG9uLm5hbWUgPT0gX25hbWUpO1xyXG4gICAgICBpZiAoaVNrZWxldG9uID09IC0xKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBuYW1lICcke19uYW1lfScgaW4gZ2xURiBza2lucy5gKTtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U2tlbGV0b25CeUluZGV4KGlTa2VsZXRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29tcG9uZW50U2tlbGV0b259IGZvciB0aGUgZ2l2ZW4gc2tlbGV0b24gaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRTa2VsZXRvbkJ5SW5kZXgoX2lTa2VsZXRvbjogbnVtYmVyKTogUHJvbWlzZTxDb21wb25lbnRTa2VsZXRvbj4ge1xyXG4gICAgICBpZiAoIXRoaXMuI3NrZWxldG9ucylcclxuICAgICAgICB0aGlzLiNza2VsZXRvbnMgPSBbXTtcclxuICAgICAgaWYgKCF0aGlzLiNza2VsZXRvbnNbX2lTa2VsZXRvbl0pIHtcclxuICAgICAgICBjb25zdCBnbHRmU2tpbjogR0xURi5Ta2luID0gdGhpcy4jZ2x0Zi5za2luc1tfaVNrZWxldG9uXTtcclxuICAgICAgICBjb25zdCBib25lczogTm9kZVtdID0gW107XHJcblxyXG4gICAgICAgIC8vIGNvbnZlcnQgZmxvYXQgYXJyYXkgdG8gYXJyYXkgb2YgbWF0cmljZXMgYW5kIHJlZ2lzdGVyIGJvbmVzXHJcbiAgICAgICAgbGV0IG10eERhdGE6IEZsb2F0MzJBcnJheTtcclxuICAgICAgICBpZiAoZ2x0ZlNraW4uaW52ZXJzZUJpbmRNYXRyaWNlcyAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICBtdHhEYXRhID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlNraW4uaW52ZXJzZUJpbmRNYXRyaWNlcyk7XHJcbiAgICAgICAgY29uc3QgbXR4RGF0YVNwYW46IG51bWJlciA9IDE2OyAvLyBzaXplIG9mIG1hdHJpeFxyXG5cclxuICAgICAgICBjb25zdCBtdHhCaW5kSW52ZXJzZXM6IE1hdHJpeDR4NFtdID0gW107XHJcbiAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGpvaW50cyBhbmQgZ2V0IGNvcnJlc3BvbmRpbmcgbWF0cml4IGZyb20gZmxvYXQgYXJyYXlcclxuICAgICAgICBmb3IgKGxldCBpQm9uZTogbnVtYmVyID0gMDsgaUJvbmUgPCBnbHRmU2tpbi5qb2ludHMubGVuZ3RoOyBpQm9uZSsrKSB7XHJcbiAgICAgICAgICBsZXQgbXR4QmluZEludmVyc2U6IE1hdHJpeDR4NDtcclxuICAgICAgICAgIGlmIChtdHhEYXRhKSB7XHJcbiAgICAgICAgICAgIG10eEJpbmRJbnZlcnNlID0gbmV3IE1hdHJpeDR4NCgpO1xyXG4gICAgICAgICAgICBtdHhCaW5kSW52ZXJzZS5zZXQobXR4RGF0YS5zdWJhcnJheShpQm9uZSAqIG10eERhdGFTcGFuLCBpQm9uZSAqIG10eERhdGFTcGFuICsgbXR4RGF0YVNwYW4pKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBib25lcy5wdXNoKGF3YWl0IHRoaXMuZ2V0Tm9kZUJ5SW5kZXgoZ2x0ZlNraW4uam9pbnRzW2lCb25lXSkpO1xyXG4gICAgICAgICAgbXR4QmluZEludmVyc2VzLnB1c2gobXR4QmluZEludmVyc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy4jc2tlbGV0b25zW19pU2tlbGV0b25dID0gbmV3IENvbXBvbmVudFNrZWxldG9uKGJvbmVzLCBtdHhCaW5kSW52ZXJzZXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jc2tlbGV0b25zW19pU2tlbGV0b25dO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYCR7R0xURkxvYWRlci5uYW1lfSB8ICR7dGhpcy4jdXJsfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJbmRleChfbmFtZU9ySW5kZXg6IHN0cmluZyB8IG51bWJlciwgX2FycmF5OiB7IG5hbWU/OiBzdHJpbmcgfVtdKTogbnVtYmVyIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPVxyXG4gICAgICAgIHR5cGVvZiBfbmFtZU9ySW5kZXggPT0gXCJudW1iZXJcIiA/XHJcbiAgICAgICAgICBfbmFtZU9ySW5kZXggOlxyXG4gICAgICAgICAgX2FycmF5LmZpbmRJbmRleChfb2JqZWN0ID0+IF9vYmplY3QubmFtZSA9PSBfbmFtZU9ySW5kZXgpO1xyXG4gICAgICBpZiAoaW5kZXggPT0gLTEpIHtcclxuICAgICAgICBsZXQgYXJyYXlOYW1lOiBzdHJpbmcgPSBPYmplY3QuZW50cmllcyh0aGlzLiNnbHRmKS5maW5kKChbX2tleSwgX3ZhbHVlXSkgPT4gX3ZhbHVlID09IF9hcnJheSk/LlswXTtcclxuICAgICAgICBEZWJ1Zy5lcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBuYW1lICcke19uYW1lT3JJbmRleH0nIGluIGdsVEYgJHthcnJheU5hbWV9LmApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgVWludDhBcnJheX0gZm9yIHRoZSBnaXZlbiBhY2Nlc3NvciBpbmRleC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEJvbmVJbmRpY2VzKF9pQWNjZXNzb3I6IG51bWJlcik6IFByb21pc2U8VWludDhBcnJheT4ge1xyXG4gICAgICBjb25zdCBhcnJheTogVHlwZWRBcnJheSA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyRGF0YShfaUFjY2Vzc29yKTtcclxuICAgICAgY29uc3QgY29tcG9uZW50VHlwZTogR0xURi5DT01QT05FTlRfVFlQRSA9IHRoaXMuI2dsdGYuYWNjZXNzb3JzW19pQWNjZXNzb3JdPy5jb21wb25lbnRUeXBlO1xyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9CWVRFKVxyXG4gICAgICAgIHJldHVybiBhcnJheSBhcyBVaW50OEFycmF5O1xyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9TSE9SVCkge1xyXG4gICAgICAgIERlYnVnLmxvZyhgJHt0aGlzfTogQm9uZSBpbmRpY2VzIGFyZSBzdG9yZWQgYXMgJyR7R0xURi5DT01QT05FTlRfVFlQRVtHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUXX0nLiBGVURHRSB3aWxsIGNvbnZlcnQgdGhlbSB0byAnJHtHTFRGLkNPTVBPTkVOVF9UWVBFW0dMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURV19Jy4gRlVER0Ugb25seSBzdXBwb3J0cyBza2VsZXRvbnMgd2l0aCB1cCB0byAyNTYgYm9uZXMsIHNvIG1ha2Ugc3VyZSB5b3VyIHNrZWxldG9uIGhhcyBubyBtb3JlIHRoYW4gMjU2IGJvbmVzLmApO1xyXG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYXJyYXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IEludmFsaWQgY29tcG9uZW50IHR5cGUgJyR7R0xURi5DT01QT05FTlRfVFlQRVtjb21wb25lbnRUeXBlXX0nIGZvciBib25lIGluZGljZXMuIEV4cGVjdGVkICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9CWVRFXX0nIG9yICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9TSE9SVF19Jy5gKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgRmxvYXQzMkFycmF5fSBmb3IgdGhlIGdpdmVuIGFjY2Vzc29yIGluZGV4LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0RmxvYXQzMkFycmF5KF9pQWNjZXNzb3I6IG51bWJlcik6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XHJcbiAgICAgIGNvbnN0IGFycmF5OiBUeXBlZEFycmF5ID0gYXdhaXQgdGhpcy5nZXRCdWZmZXJEYXRhKF9pQWNjZXNzb3IpO1xyXG4gICAgICBjb25zdCBnbHRmQWNjZXNzb3I6IEdMVEYuQWNjZXNzb3IgPSB0aGlzLiNnbHRmLmFjY2Vzc29yc1tfaUFjY2Vzc29yXTtcclxuXHJcbiAgICAgIGlmIChnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZSA9PSBHTFRGLkNPTVBPTkVOVF9UWVBFLkZMT0FUKVxyXG4gICAgICAgIHJldHVybiBhcnJheSBhcyBGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLm5vcm1hbGl6ZWQpIHtcclxuICAgICAgICBzd2l0Y2ggKGdsdGZBY2Nlc3Nvci5jb21wb25lbnRUeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEdMVEYuQ09NUE9ORU5UX1RZUEUuQllURTpcclxuICAgICAgICAgICAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKGFycmF5LCBfdmFsdWUgPT4gTWF0aC5tYXgoX3ZhbHVlIC8gMTI3LCAtMSkpO1xyXG4gICAgICAgICAgY2FzZSBHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0JZVEU6XHJcbiAgICAgICAgICAgIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShhcnJheSwgX3ZhbHVlID0+IF92YWx1ZSAvIDI1NSk7XHJcbiAgICAgICAgICBjYXNlIEdMVEYuQ09NUE9ORU5UX1RZUEUuU0hPUlQ6XHJcbiAgICAgICAgICAgIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShhcnJheSwgX3ZhbHVlID0+IE1hdGgubWF4KF92YWx1ZSAvIDMyNzY3LCAtMSkpO1xyXG4gICAgICAgICAgY2FzZSBHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUOlxyXG4gICAgICAgICAgICByZXR1cm4gRmxvYXQzMkFycmF5LmZyb20oYXJyYXksIF92YWx1ZSA9PiBfdmFsdWUgLyA2NTUzNSk7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IEludmFsaWQgY29tcG9uZW50IHR5cGUgJyR7R0xURi5DT01QT05FTlRfVFlQRVtnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZV19JyBmb3Igbm9ybWFsaXplZCBhY2Nlc3Nvci5gKTtcclxuICAgICAgICAgIC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNfYWNjZXNzb3Jfbm9ybWFsaXplZFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgRGVidWcud2FybihgJHt0aGlzfTogRXhwZWN0ZWQgY29tcG9uZW50IHR5cGUgJyR7R0xURi5DT01QT05FTlRfVFlQRVtHTFRGLkNPTVBPTkVOVF9UWVBFLkZMT0FUXX0nIGJ1dCB3YXMgJyR7R0xURi5DT01QT05FTlRfVFlQRVtnbHRmQWNjZXNzb3I/LmNvbXBvbmVudFR5cGVdfScuYCk7XHJcbiAgICAgIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShhcnJheSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFVpbnQxNkFycmF5fSBmb3IgdGhlIGdpdmVuIGFjY2Vzc29yIGluZGV4LiBPbmx5IHVzZWQgdG8gZ2V0IHRoZSB2ZXJ0ZXggaW5kaWNlcy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldFZlcnRleEluZGljZXMoX2lBY2Nlc3NvcjogbnVtYmVyKTogUHJvbWlzZTxVaW50MTZBcnJheT4ge1xyXG4gICAgICBjb25zdCBhcnJheTogVHlwZWRBcnJheSA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyRGF0YShfaUFjY2Vzc29yKTtcclxuICAgICAgY29uc3QgZ2x0ZkFjY2Vzc29yOiBHTFRGLkFjY2Vzc29yID0gdGhpcy4jZ2x0Zi5hY2Nlc3NvcnNbX2lBY2Nlc3Nvcl07XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGUgPT0gR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9TSE9SVClcclxuICAgICAgICByZXR1cm4gYXJyYXkgYXMgVWludDE2QXJyYXk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLmNvdW50ID4gNjU1MzUgJiYgZ2x0ZkFjY2Vzc29yLnR5cGUgPT0gXCJTQ0FMQVJcIilcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IEZpbGUgaW5jbHVkZXMgYSBtZXNoIHdpdGggbW9yZSB0aGFuIDY1NTM1IHZlcnRpY2VzLiBGVURHRSBkb2VzIG5vdCBzdXBwb3J0IG1lc2hlcyB3aXRoIG1vcmUgdGhhbiA2NTUzNSB2ZXJ0aWNlcy5gKTtcclxuXHJcbiAgICAgIGlmIChnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZSA9PSBHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0JZVEUgfHwgZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGUgPT0gR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9JTlQpXHJcbiAgICAgICAgcmV0dXJuIFVpbnQxNkFycmF5LmZyb20oYXJyYXkpO1xyXG5cclxuICAgICAgRGVidWcud2FybihgJHt0aGlzfTogRXhwZWN0ZWQgYW4gdW5zaWduZWQgaW50ZWdlciBjb21wb25lbnQgdHlwZSBidXQgd2FzICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbdGhpcy4jZ2x0Zi5hY2Nlc3NvcnNbX2lBY2Nlc3Nvcl0/LmNvbXBvbmVudFR5cGVdfScuYCk7XHJcbiAgICAgIHJldHVybiBVaW50MTZBcnJheS5mcm9tKGFycmF5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBhIHtAbGluayBGbG9hdDMyQXJyYXl9IGZvciB0aGUgZ2l2ZW4gYWNjZXNzb3IgaW5kZXguIFRoZSBhcnJheSBjb250YWlucyB0aGUgdmVydGV4IGNvbG9ycyBpbiBSR0JBIGZvcm1hdC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldFZlcnRleENvbG9ycyhfaUFjY2Vzc29yOiBudW1iZXIpOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xyXG4gICAgICBjb25zdCBhcnJheTogRmxvYXQzMkFycmF5ID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoX2lBY2Nlc3Nvcik7XHJcbiAgICAgIGNvbnN0IGdsdGZBY2Nlc3NvcjogR0xURi5BY2Nlc3NvciA9IHRoaXMuI2dsdGYuYWNjZXNzb3JzW19pQWNjZXNzb3JdO1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci50eXBlID09IEdMVEYuQUNDRVNTT1JfVFlQRS5WRUMzKSB7XHJcbiAgICAgICAgY29uc3QgcmdiYUFycmF5OiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGFycmF5Lmxlbmd0aCAqIDQgLyAzKTtcclxuICAgICAgICBmb3IgKGxldCBpVmVjMzogbnVtYmVyID0gMCwgaVZlYzQ6IG51bWJlciA9IDA7IGlWZWMzIDwgYXJyYXkubGVuZ3RoOyBpVmVjMyArPSAzLCBpVmVjNCArPSA0KSB7XHJcbiAgICAgICAgICByZ2JhQXJyYXlbaVZlYzRdID0gYXJyYXlbaVZlYzNdO1xyXG4gICAgICAgICAgcmdiYUFycmF5W2lWZWM0ICsgMV0gPSBhcnJheVtpVmVjMyArIDFdO1xyXG4gICAgICAgICAgcmdiYUFycmF5W2lWZWM0ICsgMl0gPSBhcnJheVtpVmVjMyArIDJdO1xyXG4gICAgICAgICAgcmdiYUFycmF5W2lWZWM0ICsgM10gPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmdiYUFycmF5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCdWZmZXJEYXRhKF9pQWNjZXNzb3I6IG51bWJlcik6IFByb21pc2U8VHlwZWRBcnJheT4ge1xyXG4gICAgICBjb25zdCBnbHRmQWNjZXNzb3I6IEdMVEYuQWNjZXNzb3IgPSB0aGlzLiNnbHRmLmFjY2Vzc29yc1tfaUFjY2Vzc29yXTtcclxuICAgICAgaWYgKCFnbHRmQWNjZXNzb3IpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBDb3VsZG4ndCBmaW5kIGFjY2Vzc29yIHdpdGggaW5kZXggJHtfaUFjY2Vzc29yfS5gKTtcclxuXHJcbiAgICAgIGxldCBhcnJheTogVHlwZWRBcnJheTtcclxuICAgICAgY29uc3QgY29tcG9uZW50VHlwZTogR0xURi5DT01QT05FTlRfVFlQRSA9IGdsdGZBY2Nlc3Nvci5jb21wb25lbnRUeXBlO1xyXG4gICAgICBjb25zdCBhY2Nlc3NvclR5cGU6IEdMVEYuQUNDRVNTT1JfVFlQRSA9IGdsdGZBY2Nlc3Nvci50eXBlO1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci5idWZmZXJWaWV3ICE9IHVuZGVmaW5lZClcclxuICAgICAgICBhcnJheSA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyVmlld0RhdGEodGhpcy4jZ2x0Zi5idWZmZXJWaWV3c1tnbHRmQWNjZXNzb3IuYnVmZmVyVmlld10sIGdsdGZBY2Nlc3Nvci5ieXRlT2Zmc2V0LCBjb21wb25lbnRUeXBlLCBhY2Nlc3NvclR5cGUpO1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci5zcGFyc2UpIHtcclxuICAgICAgICBjb25zdCBnbHRmQnVmZmVyVmlld0luZGljZXM6IEdMVEYuQnVmZmVyVmlldyA9IHRoaXMuI2dsdGYuYnVmZmVyVmlld3NbZ2x0ZkFjY2Vzc29yLnNwYXJzZS5pbmRpY2VzLmJ1ZmZlclZpZXddO1xyXG4gICAgICAgIGNvbnN0IGdsdGZCdWZmZXJWaWV3VmFsdWVzOiBHTFRGLkJ1ZmZlclZpZXcgPSB0aGlzLiNnbHRmLmJ1ZmZlclZpZXdzW2dsdGZBY2Nlc3Nvci5zcGFyc2UudmFsdWVzLmJ1ZmZlclZpZXddO1xyXG5cclxuICAgICAgICBpZiAoIWdsdGZCdWZmZXJWaWV3SW5kaWNlcyB8fCAhZ2x0ZkJ1ZmZlclZpZXdWYWx1ZXMpXHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgYnVmZmVyIHZpZXdzIGZvciBzcGFyc2UgaW5kaWNlcyBvciB2YWx1ZXMgb2YgYWNjZXNzb3Igd2l0aCBpbmRleCAke19pQWNjZXNzb3J9LmApO1xyXG5cclxuICAgICAgICBjb25zdCBhcnJheUluZGljZXM6IFR5cGVkQXJyYXkgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlclZpZXdEYXRhKGdsdGZCdWZmZXJWaWV3SW5kaWNlcywgZ2x0ZkFjY2Vzc29yLnNwYXJzZS5pbmRpY2VzLmJ5dGVPZmZzZXQsIGdsdGZBY2Nlc3Nvci5zcGFyc2UuaW5kaWNlcy5jb21wb25lbnRUeXBlLCBHTFRGLkFDQ0VTU09SX1RZUEUuU0NBTEFSKTtcclxuICAgICAgICBjb25zdCBhcnJheVZhbHVlczogVHlwZWRBcnJheSA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyVmlld0RhdGEoZ2x0ZkJ1ZmZlclZpZXdWYWx1ZXMsIGdsdGZBY2Nlc3Nvci5zcGFyc2UudmFsdWVzLmJ5dGVPZmZzZXQsIGNvbXBvbmVudFR5cGUsIGFjY2Vzc29yVHlwZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFjY2Vzc29yVHlwZUxlbmd0aDogbnVtYmVyID0gdG9BY2Nlc3NvclR5cGVMZW5ndGhbZ2x0ZkFjY2Vzc29yLnR5cGVdO1xyXG4gICAgICAgIGlmIChnbHRmQWNjZXNzb3IuYnVmZmVyVmlldyA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICBhcnJheSA9IG5ldyB0b0FycmF5Q29uc3RydWN0b3JbZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGVdKGdsdGZBY2Nlc3Nvci5jb3VudCAqIGFjY2Vzc29yVHlwZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBnbHRmQWNjZXNzb3Iuc3BhcnNlLmNvdW50OyBpKyspIHtcclxuICAgICAgICAgIGFycmF5LnNldChhcnJheVZhbHVlcy5zbGljZShpICogYWNjZXNzb3JUeXBlTGVuZ3RoLCAoaSArIDEpICogYWNjZXNzb3JUeXBlTGVuZ3RoKSwgYXJyYXlJbmRpY2VzW2ldICogYWNjZXNzb3JUeXBlTGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1ZmZlclZpZXdEYXRhKF9idWZmZXJWaWV3OiBHTFRGLkJ1ZmZlclZpZXcsIF9ieXRlT2Zmc2V0OiBudW1iZXIsIF9jb21wb25lbnRUeXBlOiBHTFRGLkNPTVBPTkVOVF9UWVBFLCBfYWNjZXNzb3JUeXBlOiBHTFRGLkFDQ0VTU09SX1RZUEUpOiBQcm9taXNlPFR5cGVkQXJyYXk+IHtcclxuICAgICAgY29uc3QgYnVmZmVyOiBBcnJheUJ1ZmZlciA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyKF9idWZmZXJWaWV3LmJ1ZmZlcik7XHJcbiAgICAgIGNvbnN0IGJ5dGVPZmZzZXQ6IG51bWJlciA9IChfYnVmZmVyVmlldy5ieXRlT2Zmc2V0ID8/IDApICsgKF9ieXRlT2Zmc2V0ID8/IDApO1xyXG4gICAgICBjb25zdCBieXRlTGVuZ3RoOiBudW1iZXIgPSBfYnVmZmVyVmlldy5ieXRlTGVuZ3RoID8/IDA7XHJcbiAgICAgIGNvbnN0IGJ5dGVTdHJpZGU6IG51bWJlciA9IF9idWZmZXJWaWV3LmJ5dGVTdHJpZGU7XHJcblxyXG4gICAgICBjb25zdCBhcnJheUNvbnN0cnVjdG9yOiBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSB0b0FycmF5Q29uc3RydWN0b3JbX2NvbXBvbmVudFR5cGVdO1xyXG4gICAgICBjb25zdCBhcnJheTogVHlwZWRBcnJheSA9IG5ldyBhcnJheUNvbnN0cnVjdG9yKGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCAvIGFycmF5Q29uc3RydWN0b3IuQllURVNfUEVSX0VMRU1FTlQpO1xyXG5cclxuICAgICAgaWYgKGJ5dGVTdHJpZGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBjcmVhdGluZyBuZXcgYnVmZmVycyBtYXliZSByYXRoZXIgcGFzcyBzdHJpZGUgaW50byB0aGUgcmVuZGVyIG1lc2g/IGFuZCBzZXQgaXQgd2hlbiBkYXRhIGlzIHBhc3NlZCB0byB0aGUgZ3B1P1xyXG4gICAgICAgIGNvbnN0IG5Db21wb25lbnRzUGVyRWxlbWVudDogbnVtYmVyID0gdG9BY2Nlc3NvclR5cGVMZW5ndGhbX2FjY2Vzc29yVHlwZV07IC8vIGFtb3VudCBvZiBjb21wb25lbnRzIHBlciBlbGVtZW50IG9mIHRoZSBhY2Nlc3NvciB0eXBlLCBlLmcuIDMgZm9yIFZFQzNcclxuICAgICAgICBjb25zdCBuRWxlbWVudHM6IG51bWJlciA9IGJ5dGVMZW5ndGggLyBieXRlU3RyaWRlOyAvLyBhbW91bnQgb2YgZWxlbWVudHMsIGUuZy4gbipWRUMzIFxyXG4gICAgICAgIGNvbnN0IHN0cmlkZTogbnVtYmVyID0gYnl0ZVN0cmlkZSAvIGFycmF5Q29uc3RydWN0b3IuQllURVNfUEVSX0VMRU1FTlQ7XHJcbiAgICAgICAgY29uc3QgbmV3QXJyYXk6IFR5cGVkQXJyYXkgPSBuZXcgYXJyYXlDb25zdHJ1Y3RvcihuRWxlbWVudHMgKiBuQ29tcG9uZW50c1BlckVsZW1lbnQpO1xyXG4gICAgICAgIGZvciAobGV0IGlOZXdFbGVtZW50OiBudW1iZXIgPSAwOyBpTmV3RWxlbWVudCA8IG5FbGVtZW50czsgaU5ld0VsZW1lbnQrKykge1xyXG4gICAgICAgICAgY29uc3QgaUVsZW1lbnQ6IG51bWJlciA9IGlOZXdFbGVtZW50ICogc3RyaWRlO1xyXG4gICAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgbG9vcCBpcyBmYXN0ZXIgdGhhbiBzZXQgKyBzbGljZVxyXG4gICAgICAgICAgZm9yIChsZXQgaUNvbXBvbmVudDogbnVtYmVyID0gMDsgaUNvbXBvbmVudCA8IG5Db21wb25lbnRzUGVyRWxlbWVudDsgaUNvbXBvbmVudCsrKVxyXG4gICAgICAgICAgICBuZXdBcnJheVtpTmV3RWxlbWVudCAqIG5Db21wb25lbnRzUGVyRWxlbWVudCArIGlDb21wb25lbnRdID0gYXJyYXlbaUVsZW1lbnQgKyBpQ29tcG9uZW50XTtcclxuICAgICAgICAgIC8vIG5ld0FycmF5LnNldChhcnJheS5zbGljZShpRWxlbWVudCwgaUVsZW1lbnQgKyBuQ29tcG9uZW50c1BlckVsZW1lbnQpLCBpTmV3RWxlbWVudCAqIG5Db21wb25lbnRzUGVyRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1ZmZlcihfaUJ1ZmZlcjogbnVtYmVyKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xyXG4gICAgICBjb25zdCBnbHRmQnVmZmVyOiBHTFRGLkJ1ZmZlciA9IHRoaXMuI2dsdGYuYnVmZmVyc1tfaUJ1ZmZlcl07XHJcbiAgICAgIGlmICghZ2x0ZkJ1ZmZlcilcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgYnVmZmVyIHdpdGggaW5kZXggJHtfaUJ1ZmZlcn0uYCk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuI2J1ZmZlcnMpXHJcbiAgICAgICAgdGhpcy4jYnVmZmVycyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI2J1ZmZlcnNbX2lCdWZmZXJdKSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2gobmV3IFVSTChnbHRmQnVmZmVyLnVyaSwgbmV3IFVSTCh0aGlzLiN1cmwsIFByb2plY3QuYmFzZVVSTCkpKTtcclxuICAgICAgICB0aGlzLiNidWZmZXJzW19pQnVmZmVyXSA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNidWZmZXJzW19pQnVmZmVyXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yKF9zYW1wbGVyOiBHTFRGLkFuaW1hdGlvblNhbXBsZXIsIF90cmFuc2Zvcm1hdGlvblR5cGU6IEdMVEYuQW5pbWF0aW9uQ2hhbm5lbFRhcmdldFtcInBhdGhcIl0pOiBQcm9taXNlPEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yMyB8IEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yND4ge1xyXG4gICAgICBjb25zdCBpbnB1dDogRmxvYXQzMkFycmF5ID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoX3NhbXBsZXIuaW5wdXQpO1xyXG4gICAgICBjb25zdCBvdXRwdXQ6IEZsb2F0MzJBcnJheSA9IGF3YWl0IHRoaXMuZ2V0RmxvYXQzMkFycmF5KF9zYW1wbGVyLm91dHB1dCk7XHJcblxyXG4gICAgICBjb25zdCBtaWxsaXNQZXJTZWNvbmQ6IG51bWJlciA9IDEwMDA7XHJcbiAgICAgIGNvbnN0IGlzUm90YXRpb246IGJvb2xlYW4gPSBfdHJhbnNmb3JtYXRpb25UeXBlID09IFwicm90YXRpb25cIjtcclxuICAgICAgY29uc3QgdmVjdG9yTGVuZ3RoOiBudW1iZXIgPSBpc1JvdGF0aW9uID8gNCA6IDM7IC8vIHJvdGF0aW9uIGlzIHN0b3JlZCBhcyBxdWF0ZXJuaW9uXHJcbiAgICAgIGNvbnN0IGludGVycG9sYXRpb246IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OID0gdGhpcy50b0ludGVybkludGVycG9sYXRpb24oX3NhbXBsZXIuaW50ZXJwb2xhdGlvbik7XHJcbiAgICAgIGNvbnN0IGlzQ3ViaWM6IHRydWUgfCB1bmRlZmluZWQgPSBpbnRlcnBvbGF0aW9uID09IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkNVQklDID8gdHJ1ZSA6IHVuZGVmaW5lZDtcclxuICAgICAgY29uc3QgdmVjdG9yc1BlcklucHV0OiBudW1iZXIgPSBpc0N1YmljID8gMyA6IDE7IC8vIGN1YmljIGludGVycG9sYXRpb24gdXNlcyAzIHZhbHVlcyBwZXIgaW5wdXQ6IGluLXRhbmdlbnQsIHByb3BlcnR5IHZhbHVlIGFuZCBvdXQtdGFuZ2VudC4gaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI2ludGVycG9sYXRpb24tY3ViaWNcclxuXHJcbiAgICAgIC8vIHVzZWQgb25seSBmb3Igcm90YXRpb24gaW50ZXJwb2xhdGlvblxyXG4gICAgICBsZXQgbGFzdFJvdGF0aW9uOiBRdWF0ZXJuaW9uO1xyXG4gICAgICBsZXQgbmV4dFJvdGF0aW9uOiBRdWF0ZXJuaW9uO1xyXG5cclxuICAgICAgY29uc3Qgc2VxdWVuY2VzOiB7IHg6IEFuaW1hdGlvbktleVtdOyB5OiBBbmltYXRpb25LZXlbXTsgejogQW5pbWF0aW9uS2V5W107IHc/OiBBbmltYXRpb25LZXlbXSB9ID0geyB4OiBbXSwgeTogW10sIHo6IFtdIH07XHJcbiAgICAgIGlmIChpc1JvdGF0aW9uKSB7XHJcbiAgICAgICAgc2VxdWVuY2VzLncgPSBbXTtcclxuICAgICAgICBsYXN0Um90YXRpb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgICAgbmV4dFJvdGF0aW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBpSW5wdXQ6IG51bWJlciA9IDA7IGlJbnB1dCA8IGlucHV0Lmxlbmd0aDsgaUlucHV0KyspIHtcclxuICAgICAgICBjb25zdCBpT3V0cHV0OiBudW1iZXIgPSBpSW5wdXQgKiB2ZWN0b3JzUGVySW5wdXQgKiB2ZWN0b3JMZW5ndGggKyAoaXNDdWJpYyA/IHZlY3Rvckxlbmd0aCA6IDApO1xyXG4gICAgICAgIGNvbnN0IGlPdXRwdXRTbG9wZUluOiBudW1iZXIgPSBpT3V0cHV0IC0gdmVjdG9yTGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IGlPdXRwdXRTbG9wZU91dDogbnVtYmVyID0gaU91dHB1dCArIHZlY3Rvckxlbmd0aDtcclxuICAgICAgICBjb25zdCB0aW1lOiBudW1iZXIgPSBtaWxsaXNQZXJTZWNvbmQgKiBpbnB1dFtpSW5wdXRdO1xyXG5cclxuICAgICAgICBpZiAoaXNSb3RhdGlvbikge1xyXG4gICAgICAgICAgLy8gVGFrZSB0aGUgc2hvcnRlc3QgcGF0aCBiZXR3ZWVuIHR3byByb3RhdGlvbnMsIGkuZS4gaWYgdGhlIGRvdCBwcm9kdWN0IGlzIG5lZ2F0aXZlIHRoZW4gdGhlIG5leHQgcXVhdGVybmlvbiBuZWVkcyB0byBiZSBuZWdhdGVkLlxyXG4gICAgICAgICAgLy8gcSBhbmQgLXEgcmVwcmVzZW50IHRoZSBzYW1lIHJvdGF0aW9uIGJ1dCBpbnRlcnBvbGF0aW9uIHdpbGwgdGFrZSBlaXRoZXIgdGhlIGxvbmcgd2F5IG9yIHRoZSBzaG9ydCB3YXkgYXJvdW5kIHRoZSBzcGhlcmUgZGVwZW5kaW5nIG9uIHdoaWNoIHdlIHVzZS5cclxuICAgICAgICAgIG5leHRSb3RhdGlvbi5zZXQob3V0cHV0W2lPdXRwdXQgKyAwXSwgb3V0cHV0W2lPdXRwdXQgKyAxXSwgb3V0cHV0W2lPdXRwdXQgKyAyXSwgb3V0cHV0W2lPdXRwdXQgKyAzXSk7XHJcbiAgICAgICAgICBpZiAoUXVhdGVybmlvbi5ET1QobGFzdFJvdGF0aW9uLCBuZXh0Um90YXRpb24pIDwgMClcclxuICAgICAgICAgICAgbmV4dFJvdGF0aW9uLm5lZ2F0ZSgpO1xyXG4gICAgICAgICAgb3V0cHV0W2lPdXRwdXQgKyAwXSA9IG5leHRSb3RhdGlvbi54O1xyXG4gICAgICAgICAgb3V0cHV0W2lPdXRwdXQgKyAxXSA9IG5leHRSb3RhdGlvbi55O1xyXG4gICAgICAgICAgb3V0cHV0W2lPdXRwdXQgKyAyXSA9IG5leHRSb3RhdGlvbi56O1xyXG4gICAgICAgICAgb3V0cHV0W2lPdXRwdXQgKyAzXSA9IG5leHRSb3RhdGlvbi53O1xyXG4gICAgICAgICAgbGFzdFJvdGF0aW9uLnNldChuZXh0Um90YXRpb24ueCwgbmV4dFJvdGF0aW9uLnksIG5leHRSb3RhdGlvbi56LCBuZXh0Um90YXRpb24udyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXF1ZW5jZXMueC5wdXNoKG5ldyBBbmltYXRpb25LZXkodGltZSwgb3V0cHV0W2lPdXRwdXQgKyAwXSwgaW50ZXJwb2xhdGlvbiwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlSW4gKyAwXSAvIG1pbGxpc1BlclNlY29uZCwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlT3V0ICsgMF0gLyBtaWxsaXNQZXJTZWNvbmQpKTtcclxuICAgICAgICBzZXF1ZW5jZXMueS5wdXNoKG5ldyBBbmltYXRpb25LZXkodGltZSwgb3V0cHV0W2lPdXRwdXQgKyAxXSwgaW50ZXJwb2xhdGlvbiwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlSW4gKyAxXSAvIG1pbGxpc1BlclNlY29uZCwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlT3V0ICsgMV0gLyBtaWxsaXNQZXJTZWNvbmQpKTtcclxuICAgICAgICBzZXF1ZW5jZXMuei5wdXNoKG5ldyBBbmltYXRpb25LZXkodGltZSwgb3V0cHV0W2lPdXRwdXQgKyAyXSwgaW50ZXJwb2xhdGlvbiwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlSW4gKyAyXSAvIG1pbGxpc1BlclNlY29uZCwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlT3V0ICsgMl0gLyBtaWxsaXNQZXJTZWNvbmQpKTtcclxuICAgICAgICBpZiAoaXNSb3RhdGlvbilcclxuICAgICAgICAgIHNlcXVlbmNlcy53LnB1c2gobmV3IEFuaW1hdGlvbktleSh0aW1lLCBvdXRwdXRbaU91dHB1dCArIDNdLCBpbnRlcnBvbGF0aW9uLCBpc0N1YmljICYmIG91dHB1dFtpT3V0cHV0U2xvcGVJbiArIDNdIC8gbWlsbGlzUGVyU2Vjb25kLCBpc0N1YmljICYmIG91dHB1dFtpT3V0cHV0U2xvcGVPdXQgKyAzXSAvIG1pbGxpc1BlclNlY29uZCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNSb3RhdGlvbikge1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKGxhc3RSb3RhdGlvbik7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobmV4dFJvdGF0aW9uKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhzZXF1ZW5jZXMpLm1hcCgoW19rZXksIF92YWx1ZV0pID0+IFtfa2V5LCBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoX3ZhbHVlKV0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvSW50ZXJuSW50ZXJwb2xhdGlvbihfaW50ZXJwb2xhdGlvbjogR0xURi5BbmltYXRpb25TYW1wbGVyW1wiaW50ZXJwb2xhdGlvblwiXSk6IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OIHtcclxuICAgICAgc3dpdGNoIChfaW50ZXJwb2xhdGlvbikge1xyXG4gICAgICAgIGNhc2UgXCJMSU5FQVJcIjpcclxuICAgICAgICAgIHJldHVybiBBTklNQVRJT05fSU5URVJQT0xBVElPTi5MSU5FQVI7XHJcbiAgICAgICAgY2FzZSBcIlNURVBcIjpcclxuICAgICAgICAgIHJldHVybiBBTklNQVRJT05fSU5URVJQT0xBVElPTi5DT05TVEFOVDtcclxuICAgICAgICBjYXNlIFwiQ1VCSUNTUExJTkVcIjpcclxuICAgICAgICAgIHJldHVybiBBTklNQVRJT05fSU5URVJQT0xBVElPTi5DVUJJQztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKF9pbnRlcnBvbGF0aW9uICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogVW5rbm93biBpbnRlcnBvbGF0aW9uIHR5cGUgJHtfaW50ZXJwb2xhdGlvbn0uYCk7XHJcbiAgICAgICAgICByZXR1cm4gQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04uTElORUFSO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRXZWJHTFBhcmFtZXRlck5hbWUoX3ZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpLmZpbmQoX2tleSA9PiBSZWZsZWN0LmdldChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LCBfa2V5KSA9PSBfdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgdHlwZSBUeXBlZEFycmF5ID0gVWludDhBcnJheSB8IFVpbnQxNkFycmF5IHwgVWludDMyQXJyYXkgfCBJbnQ4QXJyYXkgfCBJbnQxNkFycmF5IHwgRmxvYXQzMkFycmF5O1xyXG4gIHR5cGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gVWludDhBcnJheUNvbnN0cnVjdG9yIHwgVWludDE2QXJyYXlDb25zdHJ1Y3RvciB8IFVpbnQzMkFycmF5Q29uc3RydWN0b3IgfCBJbnQ4QXJyYXlDb25zdHJ1Y3RvciB8IEludDE2QXJyYXlDb25zdHJ1Y3RvciB8IEZsb2F0MzJBcnJheUNvbnN0cnVjdG9yO1xyXG5cclxuICBjb25zdCB0b0ludGVyblRyYW5zZm9ybWF0aW9uOiBSZWNvcmQ8R0xURi5BbmltYXRpb25DaGFubmVsVGFyZ2V0W1wicGF0aFwiXSwgc3RyaW5nPiA9IHtcclxuICAgIFwidHJhbnNsYXRpb25cIjogXCJ0cmFuc2xhdGlvblwiLFxyXG4gICAgXCJyb3RhdGlvblwiOiBcInJvdGF0aW9uXCIsXHJcbiAgICBcInNjYWxlXCI6IFwic2NhbGluZ1wiLFxyXG4gICAgXCJ3ZWlnaHRzXCI6IFwid2VpZ2h0c1wiXHJcbiAgfTtcclxuXHJcbiAgLy8gbnVtYmVyIG9mIGNvbXBvbmVudHMgZGVmaW5lZCBieSAndHlwZSdcclxuICBjb25zdCB0b0FjY2Vzc29yVHlwZUxlbmd0aDogUmVjb3JkPEdMVEYuQUNDRVNTT1JfVFlQRSwgbnVtYmVyPiA9IHtcclxuICAgIFwiU0NBTEFSXCI6IDEsXHJcbiAgICBcIlZFQzJcIjogMixcclxuICAgIFwiVkVDM1wiOiAzLFxyXG4gICAgXCJWRUM0XCI6IDQsXHJcbiAgICBcIk1BVDJcIjogNCxcclxuICAgIFwiTUFUM1wiOiA5LFxyXG4gICAgXCJNQVQ0XCI6IDE2XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdG9BcnJheUNvbnN0cnVjdG9yOiBSZWNvcmQ8R0xURi5DT01QT05FTlRfVFlQRSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yPiA9IHtcclxuICAgIFtHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0JZVEVdOiBVaW50OEFycmF5LFxyXG4gICAgW0dMVEYuQ09NUE9ORU5UX1RZUEUuQllURV06IEludDhBcnJheSxcclxuICAgIFtHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUXTogVWludDE2QXJyYXksXHJcbiAgICBbR0xURi5DT01QT05FTlRfVFlQRS5TSE9SVF06IEludDE2QXJyYXksXHJcbiAgICBbR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9JTlRdOiBVaW50MzJBcnJheSxcclxuICAgIFtHTFRGLkNPTVBPTkVOVF9UWVBFLkZMT0FUXTogRmxvYXQzMkFycmF5XHJcbiAgfTtcclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xuICBleHBvcnQgbGV0IHNoYWRlclNvdXJjZXM6IHtbc291cmNlOiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJBbWJpZW50T2NjbHVzaW9uLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGFtYmllbnQgb2NjbHVzaW9uIGZvciBhIGdpdmVuIGZyYWdtZW50XHJcbiAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICogYWRhcHRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL3RzaGVyaWYvd2ViZ2wyZXhhbXBsZXMvYmxvYi9kYTExNTNhMTVlYmMwOWJiMTM0OThlNWY3MzJlZjIwMzY1MDc3NDBjL3NzYW8uaHRtbFxyXG4gKiBzZWUgaGVyZSBmb3IgYW4gaW4gZGVwdGggZXhwbGFuYXRpb246IFxyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbmNvbnN0IGZsb2F0IHNpbjQ1ID0gMC43MDcxMDc7IC8vIDQ1IGRlZ3JlZXMgaW4gcmFkaWFuc1xyXG5jb25zdCB2ZWMyIGtlcm5lbFs0XSA9IHZlYzJbNF0odmVjMigwLjAsIDEuMCksIHZlYzIoMS4wLCAwLjApLCB2ZWMyKDAuMCwgLTEuMCksIHZlYzIoLTEuMCwgMC4wKSk7XHJcblxyXG51bmlmb3JtIGZsb2F0IHVfZk5lYXI7XHJcbnVuaWZvcm0gZmxvYXQgdV9mRmFyO1xyXG51bmlmb3JtIGZsb2F0IHVfZlNhbXBsZVJhZGl1cztcclxudW5pZm9ybSBmbG9hdCB1X2ZCaWFzO1xyXG51bmlmb3JtIGZsb2F0IHVfZkF0dGVudWF0aW9uQ29uc3RhbnQ7XHJcbnVuaWZvcm0gZmxvYXQgdV9mQXR0ZW51YXRpb25MaW5lYXI7XHJcbnVuaWZvcm0gZmxvYXQgdV9mQXR0ZW51YXRpb25RdWFkcmF0aWM7XHJcbnVuaWZvcm0gdmVjMiB1X3ZjdFJlc29sdXRpb247XHJcbnVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTtcclxuLy8gdW5pZm9ybSBtYXQ0IHVfbXR4Vmlld1Byb2plY3Rpb25JbnZlcnNlO1xyXG5cclxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhQb3NpdGlvbjtcclxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhOb3JtYWw7XHJcbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Tm9pc2U7XHJcbi8vIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4RGVwdGg7XHJcblxyXG5pbiB2ZWMyIHZfdmN0VGV4dHVyZTtcclxub3V0IHZlYzQgdmN0RnJhZztcclxuXHJcbmxheW91dChzdGQxNDApIHVuaWZvcm0gRm9nIHtcclxuICBib29sIHVfYkZvZ0FjdGl2ZTtcclxuICBmbG9hdCB1X2ZGb2dOZWFyO1xyXG4gIGZsb2F0IHVfZkZvZ0ZhcjtcclxuICBmbG9hdCBwYWRpbmc7XHJcbiAgdmVjNCB1X3ZjdEZvZ0NvbG9yO1xyXG59O1xyXG5cclxuLy8gVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gZnJvbSB0aGUgZGVwdGggdGV4dHVyZSwgYnV0IG1vYmlsZSBkZXZpY2VzIHNlZW1zIHRvIGxhY2sgaW4gcHJlY2lzaW9uIHRvIGRvIHRoaXNcclxuLy8gdmVjMyBnZXRQb3NpdGlvbih2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbi8vICAgZmxvYXQgZkRlcHRoID0gdGV4dHVyZSh1X3RleERlcHRoLCBfdmN0VGV4dHVyZSkucjtcclxuLy8gICB2ZWM0IGNsaXBTcGFjZVBvc2l0aW9uID0gdmVjNChfdmN0VGV4dHVyZSAqIDIuMCAtIDEuMCwgZkRlcHRoICogMi4wIC0gMS4wLCAxLjApO1xyXG4vLyAgIHZlYzQgd29ybGRTcGFjZVBvc2l0aW9uID0gdV9tdHhWaWV3UHJvamVjdGlvbkludmVyc2UgKiBjbGlwU3BhY2VQb3NpdGlvbjtcclxuLy8gICByZXR1cm4gd29ybGRTcGFjZVBvc2l0aW9uLnh5eiAvIHdvcmxkU3BhY2VQb3NpdGlvbi53O1xyXG4vLyB9XHJcblxyXG5mbG9hdCBnZXRPY2NsdXNpb24odmVjMyBfdmN0UG9zaXRpb24sIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMiBfdmN0VGV4dHVyZSkge1xyXG4gIHZlYzMgdmN0T2NjbHVkZXIgPSB0ZXh0dXJlKHVfdGV4UG9zaXRpb24sIF92Y3RUZXh0dXJlKS54eXo7XHJcblxyXG4gIGlmICh2Y3RPY2NsdWRlci54ID09IDAuMCAmJiB2Y3RPY2NsdWRlci55ID09IDAuMCAmJiB2Y3RPY2NsdWRlci56ID09IDAuMCkgLy8gbm8gb2NjbHVkZXIgYXQgdGhpcyBwb3NpdGlvblxyXG4gICAgcmV0dXJuIDAuMDtcclxuXHJcbiAgdmVjMyB2Y3REaXN0YW5jZSA9IHZjdE9jY2x1ZGVyIC0gX3ZjdFBvc2l0aW9uO1xyXG4gIGZsb2F0IGZJbnRlbnNpdHkgPSBtYXgoZG90KF92Y3ROb3JtYWwsIG5vcm1hbGl6ZSh2Y3REaXN0YW5jZSkpIC0gdV9mQmlhcywgMC4wKTtcclxuXHJcbiAgZmxvYXQgZkRpc3RhbmNlID0gbGVuZ3RoKHZjdERpc3RhbmNlKTtcclxuICBmbG9hdCBmQXR0ZW51YXRpb24gPSAxLjAgLyAodV9mQXR0ZW51YXRpb25Db25zdGFudCArIHVfZkF0dGVudWF0aW9uTGluZWFyICogZkRpc3RhbmNlICsgdV9mQXR0ZW51YXRpb25RdWFkcmF0aWMgKiBmRGlzdGFuY2UgKiBmRGlzdGFuY2UpO1xyXG5cclxuICByZXR1cm4gZkludGVuc2l0eSAqIGZBdHRlbnVhdGlvbjtcclxufVxyXG5cclxuZmxvYXQgZ2V0Rm9nKHZlYzMgX3ZjdFBvc2l0aW9uKSB7XHJcbiAgZmxvYXQgZkRpc3RhbmNlID0gbGVuZ3RoKF92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTsgLy8gbWF5YmUgdXNlIHotZGVwdGggaW5zdGVhZCBvZiBldWNsaWRlYW4gZGVwdGhcclxuICBmbG9hdCBmRm9nID0gY2xhbXAoKGZEaXN0YW5jZSAtIHVfZkZvZ05lYXIpIC8gKHVfZkZvZ0ZhciAtIHVfZkZvZ05lYXIpLCAwLjAsIDEuMCk7XHJcbiAgZkZvZyA9IC1wb3coZkZvZywgMi4wKSArICgyLjAgKiBmRm9nKTsgLy8gbGV0cyBmb2cgYXBwZWFyIHF1aWNrZXIgYW5kIGZhbGwgb2ZmIHNsb3dlciByZXN1bHRzIGluIGEgbW9yZSBncmFkdWFsIGZhbGxvZmZcclxuICByZXR1cm4gZkZvZyAqIHVfdmN0Rm9nQ29sb3IuYTtcclxufVxyXG5cclxudm9pZCBtYWluKCkge1xyXG4gIHZlYzMgdmN0UG9zaXRpb24gPSB0ZXh0dXJlKHVfdGV4UG9zaXRpb24sIHZfdmN0VGV4dHVyZSkueHl6O1xyXG4gIHZlYzMgdmN0Tm9ybWFsID0gdGV4dHVyZSh1X3RleE5vcm1hbCwgdl92Y3RUZXh0dXJlKS54eXo7XHJcbiAgdmVjMiB2Y3RSYW5kb20gPSBub3JtYWxpemUodGV4dHVyZSh1X3RleE5vaXNlLCB2X3ZjdFRleHR1cmUpLnh5ICogMi4wIC0gMS4wKTtcclxuICBmbG9hdCBmRGVwdGggPSAobGVuZ3RoKHZjdFBvc2l0aW9uIC0gdV92Y3RDYW1lcmEpIC0gdV9mTmVhcikgLyAodV9mRmFyIC0gdV9mTmVhcik7IC8vIGxpbmVhciBldWNsaWRlYW4gZGVwdGggaW4gcmFuZ2UgWzAsMV0sIHdoZW4gY2hhbmdpbmcgdG8gdmlldyBzcGFjZSwgZG9uJ3Qgc3VidHJhY3QgY2FtZXJhIHBvc2l0aW9uXHJcbiAgZmxvYXQgZktlcm5lbFJhZGl1cyA9IHVfZlNhbXBsZVJhZGl1cyAqICgxLjAgLSBmRGVwdGgpO1xyXG5cclxuICBmbG9hdCBmT2NjbHVzaW9uID0gMC4wO1xyXG4gIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7XHJcbiAgICB2ZWMyIHZjdEsxID0gcmVmbGVjdChrZXJuZWxbaV0sIHZjdFJhbmRvbSk7XHJcbiAgICB2ZWMyIHZjdEsyID0gdmVjMih2Y3RLMS54ICogc2luNDUgLSB2Y3RLMS55ICogc2luNDUsIHZjdEsxLnggKiBzaW40NSArIHZjdEsxLnkgKiBzaW40NSk7XHJcblxyXG4gICAgdmN0SzEgLz0gdV92Y3RSZXNvbHV0aW9uO1xyXG4gICAgdmN0SzIgLz0gdV92Y3RSZXNvbHV0aW9uO1xyXG5cclxuICAgIHZjdEsxICo9IGZLZXJuZWxSYWRpdXM7XHJcbiAgICB2Y3RLMiAqPSBmS2VybmVsUmFkaXVzO1xyXG5cclxuICAgIGZPY2NsdXNpb24gKz0gZ2V0T2NjbHVzaW9uKHZjdFBvc2l0aW9uLCB2Y3ROb3JtYWwsIHZfdmN0VGV4dHVyZSArIHZjdEsxKTtcclxuICAgIGZPY2NsdXNpb24gKz0gZ2V0T2NjbHVzaW9uKHZjdFBvc2l0aW9uLCB2Y3ROb3JtYWwsIHZfdmN0VGV4dHVyZSArIHZjdEsyICogMC43NSk7XHJcbiAgICBmT2NjbHVzaW9uICs9IGdldE9jY2x1c2lvbih2Y3RQb3NpdGlvbiwgdmN0Tm9ybWFsLCB2X3ZjdFRleHR1cmUgKyB2Y3RLMSAqIDAuNSk7XHJcbiAgICBmT2NjbHVzaW9uICs9IGdldE9jY2x1c2lvbih2Y3RQb3NpdGlvbiwgdmN0Tm9ybWFsLCB2X3ZjdFRleHR1cmUgKyB2Y3RLMiAqIDAuMjUpO1xyXG4gIH1cclxuXHJcbiAgZk9jY2x1c2lvbiA9IGNsYW1wKGZPY2NsdXNpb24gLyAxNi4wLCAwLjAsIDEuMCk7XHJcblxyXG4gIGlmICh1X2JGb2dBY3RpdmUgJiYgZk9jY2x1c2lvbiA+IDAuMCkgLy8gY29ycmVjdCBvY2NsdXNpb24gYnkgZm9nIGZhY3RvclxyXG4gICAgZk9jY2x1c2lvbiA9IG1peChmT2NjbHVzaW9uLCAwLjAsIGdldEZvZyh2Y3RQb3NpdGlvbikpO1xyXG4gIFxyXG4gIHZjdEZyYWcucmdiID0gdmVjMyhmT2NjbHVzaW9uKTtcclxuICB2Y3RGcmFnLmEgPSAxLjA7XHJcbn1gO1xuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyQmxvb20uZnJhZ1wiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiAqIEV4dHJhY3RzIGNvbG9ycywgZG93bnNhbXBsZXMgYW5kIHVwc2FtcGxlcyBhIHRleHR1cmVcclxuICogQWRhcHRpb24gb2YgdGhlIFwiZHVhbCBmaWx0ZXJpbmcga2F3YXNlXCIgbWV0aG9kIGRlc2NyaWJlZCBpbiBTSUdHUkFQSCAyMDE1IGJ5IE1hcml1cyBCasO4cmdlXHJcbiAqIGh0dHBzOi8vY29tbXVuaXR5LmFybS5jb20vY2ZzLWZpbGUvX19rZXkvY29tbXVuaXR5c2VydmVyLWJsb2dzLWNvbXBvbmVudHMtd2VibG9nZmlsZXMvMDAtMDAtMDAtMjAtNjYvc2lnZ3JhcGgyMDE1XzJEMDBfbW1nXzJEMDBfbWFyaXVzXzJEMDBfbm90ZXMucGRmXHJcbiAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gKi9cclxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcbnByZWNpc2lvbiBoaWdocCBpbnQ7XHJcblxyXG51bmlmb3JtIGludCB1X2lNb2RlOyAvLyAwOiBleHRyYWN0LCAxOiBkb3duc2FtcGxlLCAyOiB1cHNhbXBsZSwgMzogYXBwbHlcclxudW5pZm9ybSBmbG9hdCB1X2ZUaHJlc2hvbGQ7XHJcbnVuaWZvcm0gZmxvYXQgdV9mSW50ZW5zaXR5O1xyXG51bmlmb3JtIGZsb2F0IHVfZkhpZ2hsaWdodERlc2F0dXJhdGlvbjtcclxudW5pZm9ybSB2ZWMyIHVfdmN0VGV4ZWw7XHJcblxyXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleFNvdXJjZTtcclxuXHJcbmluIHZlYzIgdl92Y3RUZXh0dXJlO1xyXG5vdXQgdmVjNCB2Y3RGcmFnO1xyXG5cclxuLy8gb2xkIGdhdXNzaWFuIGJsdXJcclxuLy8gZmxhdCBpbiB2ZWMyWzldIHZfdmN0T2Zmc2V0cztcclxuLy8gY29uc3QgZmxvYXQgZ2F1c3NpYW5LZXJuZWxbOV0gPSBmbG9hdFtdKDAuMDQ1LCAwLjEyMiwgMC4wNDUsIDAuMTIyLCAwLjMzMiwgMC4xMjIsIDAuMDQ1LCAwLjEyMiwgMC4wNDUpO1xyXG4vLyB2ZWM0IGRvd25zYW1wbGUodmVjMiBfdmN0VGV4dHVyZSkge1xyXG4vLyAgIHZlYzQgdmN0Q29sb3IgPSB2ZWM0KDAuMCk7XHJcbi8vICAgZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIFxyXG4vLyAgICAgdmN0Q29sb3IgKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgdl92Y3RUZXh0dXJlICsgdl92Y3RPZmZzZXRzW2ldKSAqIGdhdXNzaWFuS2VybmVsW2ldO1xyXG4vLyAgIHJldHVybiB2Y3RDb2xvcjtcclxuLy8gfVxyXG4vLyB2ZWM0IHVwc2FtcGxlKHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuLy8gICB2ZWM0IHZjdENvbG9yID0gdmVjNCgwLjApO1xyXG4vLyAgIGZvciAoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSBcclxuLy8gICAgIHZjdENvbG9yICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdl92Y3RPZmZzZXRzW2ldKSAqIGdhdXNzaWFuS2VybmVsW2ldO1xyXG4vLyAgIHJldHVybiB2Y3RDb2xvcjtcclxuLy8gfVxyXG5cclxuLy8gdmVjMyBleHRyYWN0KHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuLy8gICB2ZWMzIHZjdENvbG9yID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUpLnJnYjtcclxuLy8gICBpZihhbnkoZ3JlYXRlclRoYW4odmN0Q29sb3IsIHZlYzModV9mVGhyZXNob2xkKSkpKVxyXG4vLyAgICAgcmV0dXJuIHZjdENvbG9yO1xyXG4vLyAgIGRpc2NhcmQ7XHJcbi8vIH1cclxuXHJcbi8vIHZlYzMgZXh0cmFjdCh2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbi8vICAgdmVjMyB2Y3RDb2xvciA9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlKS5yZ2I7XHJcbi8vICAgZmxvYXQgbHVtaW5hbmNlID0gZG90KHZjdENvbG9yLCB2ZWMzKDAuMjk5LCAwLjU4NywgMC4xMTQpKTtcclxuLy8gICBpZihsdW1pbmFuY2UgPiB1X2ZUaHJlc2hvbGQpXHJcbi8vICAgICByZXR1cm4gdmN0Q29sb3I7XHJcbi8vICAgZGlzY2FyZDtcclxuLy8gfVxyXG5cclxuLy8gb2xkIGV4dHJhY3Rpb24gd2l0aCBhdmVyYWdlIGJyaWdodG5lc3NcclxudmVjMyBleHRyYWN0KHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuICB2ZWMzIHZjdENvbG9yID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUpLnJnYjtcclxuICBmbG9hdCBmVGhyZXNob2xkID0gdV9mVGhyZXNob2xkO1xyXG4gIGlmKGZUaHJlc2hvbGQgPj0gMS4wKVxyXG4gICAgZlRocmVzaG9sZCA9IDAuOTk5OTk5O1xyXG5cclxuICB2Y3RDb2xvciA9IHZjdENvbG9yIC0gZlRocmVzaG9sZDtcclxuICB2Y3RDb2xvciA9IHZjdENvbG9yIC8gKDEuMCAtIGZUaHJlc2hvbGQpOyAvLyBuZWdhdGl2ZSB2YWx1ZXMgbWlnaHQgcmVjZWl2ZSB2YWx1ZXMgYWJvdmUgMS4wLi4uXHJcbiAgXHJcbiAgZmxvYXQgYXZlcmFnZUJyaWdodG5lc3MgPSAoKCh2Y3RDb2xvci5yICsgdmN0Q29sb3IuZyArIHZjdENvbG9yLmIpIC8gMy4wKSAqIDAuMikgKyAwLjg7IC8vdGhlIGVmZmVjdCBpcyByZWR1Y2VkIGJ5IGZpcnN0IHNldHRpbmcgaXQgdG8gYSAwLjAtMC4yIHJhbmdlIGFuZCB0aGVuIGFkZGluZyAwLjhcclxuICB2Y3RDb2xvciA9IGNsYW1wKHZjdENvbG9yLCAwLjAsIDEuMCkgKiBjbGFtcChhdmVyYWdlQnJpZ2h0bmVzcywgMC4wLCAxLjApO1xyXG4gIHJldHVybiB2Y3RDb2xvcjtcclxufVxyXG5cclxudmVjNCBkb3duc2FtcGxlKHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuICB2ZWM0IHN1bSA9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlKSAqIDQuMDtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgLSB1X3ZjdFRleGVsLnh5KTtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB1X3ZjdFRleGVsLnh5KTtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKHVfdmN0VGV4ZWwueCwgLXVfdmN0VGV4ZWwueSkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSAtIHZlYzIodV92Y3RUZXhlbC54LCAtdV92Y3RUZXhlbC55KSk7XHJcblxyXG4gIHJldHVybiBzdW0gLyA4LjA7XHJcbn1cclxuXHJcbnZlYzQgdXBzYW1wbGUodmVjMiBfdmN0VGV4dHVyZSkge1xyXG4gIHZlYzQgc3VtID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKC11X3ZjdFRleGVsLnggKiAyLjAsIDAuMCkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIoLXVfdmN0VGV4ZWwueCwgdV92Y3RUZXhlbC55KSkgKiAyLjA7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMigwLjAsIHVfdmN0VGV4ZWwueSAqIDIuMCkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIodV92Y3RUZXhlbC54LCB1X3ZjdFRleGVsLnkpKSAqIDIuMDtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKHVfdmN0VGV4ZWwueCAqIDIuMCwgMC4wKSk7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMih1X3ZjdFRleGVsLngsIC11X3ZjdFRleGVsLnkpKSAqIDIuMDtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKDAuMCwgLXVfdmN0VGV4ZWwueSAqIDIuMCkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIoLXVfdmN0VGV4ZWwueCwgLXVfdmN0VGV4ZWwueSkpICogMi4wO1xyXG4gIHJldHVybiBzdW0gLyAxMi4wO1xyXG59XHJcblxyXG52ZWMzIGFwcGx5KHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuICB2ZWMzIHZjdEJsb29tID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUpLnJnYjtcclxuICBpZiAodmN0Qmxvb20uciA+PSAxLjAgfHwgdmN0Qmxvb20uZyA+PSAxLjAgfHwgdmN0Qmxvb20uYiA+PSAxLjApIC8vIG1heWJlIHVzZSB0aHJlc2hvbGQgaW5zdGVhZCBvZiAxLjA/XHJcbiAgICB2Y3RCbG9vbSA9IG1peCh2Y3RCbG9vbSwgdmVjMygxLjApLCB1X2ZIaWdobGlnaHREZXNhdHVyYXRpb24pO1xyXG4gIHZjdEJsb29tID0gY2xhbXAodmN0Qmxvb20gKiB1X2ZJbnRlbnNpdHksIDAuMCwgMS4wKTtcclxuICByZXR1cm4gdmN0Qmxvb207XHJcbn1cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICBzd2l0Y2godV9pTW9kZSkge1xyXG4gICAgY2FzZSAwOlxyXG4gICAgICB2Y3RGcmFnLnJnYiA9IGV4dHJhY3Qodl92Y3RUZXh0dXJlKTtcclxuICAgICAgdmN0RnJhZy5hID0gMS4wO1xyXG4gICAgICByZXR1cm47XHJcbiAgICBjYXNlIDE6XHJcbiAgICAgIHZjdEZyYWcgPSBkb3duc2FtcGxlKHZfdmN0VGV4dHVyZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIGNhc2UgMjpcclxuICAgICAgdmN0RnJhZyA9IHVwc2FtcGxlKHZfdmN0VGV4dHVyZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIGNhc2UgMzpcclxuICAgICAgdmN0RnJhZy5yZ2IgPSBhcHBseSh2X3ZjdFRleHR1cmUpO1xyXG4gICAgICB2Y3RGcmFnLmEgPSAxLjA7XHJcbiAgICAgIHJldHVybjtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHZjdEZyYWcgPSB0ZXh0dXJlKHVfdGV4U291cmNlLCB2X3ZjdFRleHR1cmUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgfVxyXG59YDtcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlckdpem1vLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIC4uLlxyXG4qIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbnVuaWZvcm0gdmVjNCB1X3ZjdENvbG9yO1xyXG5cclxub3V0IHZlYzQgdmN0RnJhZztcclxuXHJcbi8vIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4RGVwdGhTdGVuY2lsO1xyXG4jaWYgZGVmaW5lZChURVhUVVJFKVxyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Q29sb3I7XHJcbiAgaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcbiNlbmRpZlxyXG5cclxuLy8gLy8gNHg0IEJheWVyIG1hdHJpeCBmb3IgZGl0aGVyaW5nXHJcbi8vIGNvbnN0IGZsb2F0IG10eERpdGhlclsxNl0gPSBmbG9hdFtdKFxyXG4vLyAgIDEuMCAvIDE3LjAsICA5LjAgLyAxNy4wLCAgMy4wIC8gMTcuMCwgMTEuMCAvIDE3LjAsXHJcbi8vICAgMTMuMCAvIDE3LjAsICA1LjAgLyAxNy4wLCAxNS4wIC8gMTcuMCwgIDcuMCAvIDE3LjAsXHJcbi8vICAgNC4wIC8gMTcuMCwgMTIuMCAvIDE3LjAsICAyLjAgLyAxNy4wLCAxMC4wIC8gMTcuMCxcclxuLy8gICAxNi4wIC8gMTcuMCwgIDguMCAvIDE3LjAsIDE0LjAgLyAxNy4wLCAgNi4wIC8gMTcuMFxyXG4vLyApO1xyXG5cclxudm9pZCBtYWluKCkge1xyXG4gIHZjdEZyYWcgPSB1X3ZjdENvbG9yO1xyXG5cclxuICAjaWYgZGVmaW5lZChURVhUVVJFKVxyXG5cclxuICAgICAgdmN0RnJhZyAqPSB0ZXh0dXJlKHVfdGV4Q29sb3IsIHZfdmN0VGV4dHVyZSk7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAvLyBpbnQgeCA9IGludChnbF9GcmFnQ29vcmQueCkgJSA0O1xyXG4gIC8vIGludCB5ID0gaW50KGdsX0ZyYWdDb29yZC55KSAlIDQ7XHJcbiAgLy8gaW50IGluZGV4ID0geSAqIDQgKyB4O1xyXG4gIC8vIC8vIERpc2NhcmQgdGhlIGZyYWdtZW50IGlmIGl0cyBhbHBoYSBpcyBsZXNzIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIGRpdGhlcmluZyBtYXRyaXhcclxuICAvLyBpZiAodmN0RnJhZy5hIDwgbXR4RGl0aGVyW2luZGV4XSkgXHJcbiAgLy8gICBkaXNjYXJkO1xyXG5cclxuICAvLyAvLyBEaXNjYXJkIHRoZSBmcmFnbWVudCBpZiBpdHMgYWxwaGEgaXMgMFxyXG4gIC8vIGlmICh2Y3RGcmFnLmEgPT0gMC4wKVxyXG4gIC8vICAgZGlzY2FyZDtcclxuXHJcbiAgLy8gLy8gQ3JlYXRlIGEgY2hlY2tlcmJvYXJkIHBhdHRlcm4gZm9yIGFscGhhIHZhbHVlcyBsZXNzIHRoYW4gMC41XHJcbiAgLy8gZWxzZSBpZiAodmN0RnJhZy5hIDwgMC41ICYmICgoeCArIHkpICUgMiA9PSAwKSlcclxuICAvLyAgIGRpc2NhcmQ7XHJcblxyXG4gIC8vIHZjdEZyYWcuYSA9IDEuMDtcclxuXHJcbiAgaWYgKHZjdEZyYWcuYSA8IDAuMDEpXHJcbiAgICBkaXNjYXJkO1xyXG5cclxuICAvLyBwcmVtdWx0aXBseSBhbHBoYSBmb3IgYmxlbmRpbmdcclxuICB2Y3RGcmFnLnJnYiAqPSB2Y3RGcmFnLmE7XHJcbn1gO1xuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8udmVydFwiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogLi4uXHJcbiogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxuLy8gdW5pZm9ybSBtYXQ0IHVfbXR4Vmlld1Byb2plY3Rpb247XHJcbi8vIHVuaWZvcm0gbWF0NCB1X210eE1vZGVsO1xyXG51bmlmb3JtIG1hdDQgdV9tdHhNZXNoVG9WaWV3OyAvLyBtb2RlbC12aWV3LXByb2plY3Rpb24gbWF0cml4XHJcblxyXG5pbiB2ZWMzIGFfdmN0UG9zaXRpb247XHJcblxyXG4jaWYgZGVmaW5lZChURVhUVVJFKVxyXG5cclxuICBpbiB2ZWMyIGFfdmN0VGV4dHVyZTtcclxuICBvdXQgdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4jZW5kaWZcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICBnbF9Qb3NpdGlvbiA9IHVfbXR4TWVzaFRvVmlldyAqIHZlYzQoYV92Y3RQb3NpdGlvbiwgMS4wKTtcclxuXHJcbiAgI2lmIGRlZmluZWQoVEVYVFVSRSlcclxuXHJcbiAgICB2X3ZjdFRleHR1cmUgPSBhX3ZjdFRleHR1cmU7XHJcblxyXG4gICNlbmRpZlxyXG59YDtcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclBob25nLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIFBob25nIHNoYWRpbmdcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMiB8IFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuKi9cclxuXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSB2ZWM0IHVfdmN0Q29sb3I7XHJcbnVuaWZvcm0gZmxvYXQgdV9mRGlmZnVzZTtcclxudW5pZm9ybSBmbG9hdCB1X2ZTcGVjdWxhcjtcclxudW5pZm9ybSBmbG9hdCB1X2ZJbnRlbnNpdHk7XHJcbnVuaWZvcm0gZmxvYXQgdV9mTWV0YWxsaWM7XHJcbnVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTtcclxuXHJcbnVuaWZvcm0gYm9vbCB1X2JGb2c7XHJcbnVuaWZvcm0gdmVjNCB1X3ZjdEZvZ0NvbG9yO1xyXG51bmlmb3JtIGZsb2F0IHVfZkZvZ05lYXI7XHJcbnVuaWZvcm0gZmxvYXQgdV9mRm9nRmFyO1xyXG5cclxuaW4gdmVjNCB2X3ZjdENvbG9yO1xyXG5pbiB2ZWMzIHZfdmN0UG9zaXRpb247XHJcblxyXG5sYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgdmVjNCB2Y3RGcmFnO1xyXG5sYXlvdXQobG9jYXRpb24gPSAxKSBvdXQgdmVjNCB2Y3RGcmFnUG9zaXRpb247XHJcbmxheW91dChsb2NhdGlvbiA9IDIpIG91dCB2ZWM0IHZjdEZyYWdOb3JtYWw7XHJcblxyXG4jaWZkZWYgUEhPTkdcclxuXHJcbiAgaW4gdmVjMyB2X3ZjdE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIEZMQVRcclxuXHJcbiAgZmxhdCBpbiB2ZWMzIHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuI2VuZGlmXHJcblxyXG5zdHJ1Y3QgTGlnaHQge1xyXG4gIHZlYzQgdmN0Q29sb3I7XHJcbiAgbWF0NCBtdHhTaGFwZTtcclxuICBtYXQ0IG10eFNoYXBlSW52ZXJzZTtcclxufTtcclxuXHJcbmNvbnN0IHVpbnQgTUFYX0xJR0hUU19ESVJFQ1RJT05BTCA9IDE1dTtcclxuY29uc3QgdWludCBNQVhfTElHSFRTX1BPSU5UID0gMTAwdTtcclxuY29uc3QgdWludCBNQVhfTElHSFRTX1NQT1QgPSAxMDB1O1xyXG5cclxubGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBMaWdodHMge1xyXG4gIHVpbnQgdV9uTGlnaHRzRGlyZWN0aW9uYWw7XHJcbiAgdWludCB1X25MaWdodHNQb2ludDtcclxuICB1aW50IHVfbkxpZ2h0c1Nwb3Q7XHJcbiAgdWludCBwYWRkaW5nOyAvLyBBZGQgcGFkZGluZyB0byBhbGlnbiB0byAxNiBieXRlc1xyXG4gIExpZ2h0IHVfYW1iaWVudDtcclxuICBMaWdodCB1X2RpcmVjdGlvbmFsW01BWF9MSUdIVFNfRElSRUNUSU9OQUxdO1xyXG4gIExpZ2h0IHVfcG9pbnRbTUFYX0xJR0hUU19QT0lOVF07XHJcbiAgTGlnaHQgdV9zcG90W01BWF9MSUdIVFNfU1BPVF07XHJcbn07XHJcblxyXG4vLyBURVhUVVJFOiBpbnB1dCBVVnMgYW5kIHRleHR1cmVcclxuI2lmZGVmIFRFWFRVUkVcclxuXHJcbiAgaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhDb2xvcjtcclxuXHJcbiNlbmRpZlxyXG5cclxuLy8gTk9STUFMTUFQOiBpbnB1dCBVVnMgYW5kIHRleHR1cmVcclxuI2lmZGVmIE5PUk1BTE1BUFxyXG5cclxuICBpbiB2ZWMzIHZfdmN0VGFuZ2VudDtcclxuICBpbiB2ZWMzIHZfdmN0Qml0YW5nZW50O1xyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Tm9ybWFsO1xyXG5cclxuI2VuZGlmXHJcblxyXG4vLyBSZXR1cm5zIGEgdmVjdG9yIGZvciB2aXN1YWxpemluZyBvbiBtb2RlbC4gR3JlYXQgZm9yIGRlYnVnZ2luZ1xyXG52ZWM0IHNob3dWZWN0b3JBc0NvbG9yKHZlYzMgX3ZlY3RvciwgYm9vbCBfY2xhbXApIHtcclxuICBpZihfY2xhbXApIHtcclxuICAgIF92ZWN0b3IgKj0gMC41O1xyXG4gICAgX3ZlY3RvciArPSAwLjU7XHJcbiAgfVxyXG4gIHJldHVybiB2ZWM0KF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnosIDEpO1xyXG59XHJcblxyXG52b2lkIGlsbHVtaW5hdGVEaXJlY3RlZCh2ZWMzIF92Y3REaXJlY3Rpb24sIHZlYzMgX3ZjdFZpZXcsIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMyBfdmN0Q29sb3IsIGlub3V0IHZlYzMgX3ZjdERpZmZ1c2UsIGlub3V0IHZlYzMgX3ZjdFNwZWN1bGFyKSB7XHJcbiAgdmVjMyB2Y3REaXJlY3Rpb24gPSBub3JtYWxpemUoX3ZjdERpcmVjdGlvbik7XHJcbiAgZmxvYXQgZklsbHVtaW5hdGlvbiA9IC1kb3QoX3ZjdE5vcm1hbCwgdmN0RGlyZWN0aW9uKTtcclxuICBpZihmSWxsdW1pbmF0aW9uID4gMC4wKSB7XHJcbiAgICBfdmN0RGlmZnVzZSArPSB1X2ZEaWZmdXNlICogZklsbHVtaW5hdGlvbiAqIF92Y3RDb2xvcjtcclxuXHJcbiAgICBpZih1X2ZTcGVjdWxhciA8PSAwLjApXHJcbiAgICAgIHJldHVybjtcclxuICAgICAgXHJcbiAgICAvL0JMSU5OLVBob25nIFNoYWRpbmdcclxuICAgIHZlYzMgaGFsZndheURpciA9IG5vcm1hbGl6ZSgtdmN0RGlyZWN0aW9uIC0gX3ZjdFZpZXcpO1xyXG4gICAgZmxvYXQgZmFjdG9yID0gbWF4KGRvdCgtdmN0RGlyZWN0aW9uLCBfdmN0Tm9ybWFsKSwgMC4wKTsgLy9GYWN0b3IgZm9yIHNtb290aGluZyBvdXQgdHJhbnNpdGlvbiBmcm9tIHN1cmZhY2UgZmFjaW5nIHRoZSBsaWdodHNvdXJjZSB0byBzdXJmYWNlIGZhY2luZyBhd2F5IGZyb20gdGhlIGxpZ2h0c291cmNlXHJcbiAgICBmYWN0b3IgPSAxLjAgLSAocG93KGZhY3RvciAtIDEuMCwgOC4wKSk7ICAgICAgICAgICAgICAgICAvL1RoZSBmYWN0b3IgaXMgYWx0ZXJlZCBpbiBvcmRlciB0byBjbGVhcmx5IHNlZSB0aGUgc3BlY3VsYXIgaGlnaGxpZ2h0IGV2ZW4gYXQgc3RlZXAgYW5nbGVzLCB3aGlsZSBzdGlsbCBwcmV2ZW50aW5nIGFydGlmYWN0c1xyXG5cclxuICAgIF92Y3RTcGVjdWxhciArPSBwb3cobWF4KGRvdChfdmN0Tm9ybWFsLCBoYWxmd2F5RGlyKSwgMC4wKSwgZXhwMih1X2ZTcGVjdWxhciAqIDUuMCkpICogdV9mU3BlY3VsYXIgKiB1X2ZJbnRlbnNpdHkgKiBmYWN0b3IgKiBfdmN0Q29sb3I7XHJcbiAgfVxyXG59XHJcblxyXG5mbG9hdCBnZXRGb2codmVjMyBfdmN0UG9zaXRpb24pIHtcclxuICBmbG9hdCBmRGlzdGFuY2UgPSBsZW5ndGgoX3ZjdFBvc2l0aW9uIC0gdV92Y3RDYW1lcmEpOyAvLyBtYXliZSB1c2Ugei1kZXB0aCBpbnN0ZWFkIG9mIGV1Y2xpZGVhbiBkZXB0aFxyXG4gIGZsb2F0IGZGb2cgPSBjbGFtcCgoZkRpc3RhbmNlIC0gdV9mRm9nTmVhcikgLyAodV9mRm9nRmFyIC0gdV9mRm9nTmVhciksIDAuMCwgMS4wKTtcclxuICBmRm9nID0gLXBvdyhmRm9nLCAyLjApICsgKDIuMCAqIGZGb2cpOyAvLyBsZXRzIGZvZyBhcHBlYXIgcXVpY2tlciBhbmQgZmFsbCBvZmYgc2xvd2VyIHJlc3VsdHMgaW4gYSBtb3JlIGdyYWR1YWwgZmFsbG9mZlxyXG4gIHJldHVybiBmRm9nO1xyXG59XHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgI2lmIGRlZmluZWQoUEhPTkcpICYmICFkZWZpbmVkKEZMQVQpXHJcblxyXG4gICAgI2lmZGVmIE5PUk1BTE1BUFxyXG5cclxuICAgICAgbWF0MyBtdHhUQk4gPSBtYXQzKG5vcm1hbGl6ZSh2X3ZjdFRhbmdlbnQpLCBub3JtYWxpemUodl92Y3RCaXRhbmdlbnQpLCBub3JtYWxpemUodl92Y3ROb3JtYWwpKTtcclxuICAgICAgdmVjMyB2Y3ROb3JtYWwgPSB0ZXh0dXJlKHVfdGV4Tm9ybWFsLCB2X3ZjdFRleHR1cmUpLnh5eiAqIDIuMCAtIDEuMDtcclxuICAgICAgdmN0Tm9ybWFsID0gbm9ybWFsaXplKG10eFRCTiAqIHZjdE5vcm1hbCk7XHJcblxyXG4gICAgI2Vsc2VcclxuXHJcbiAgICAgIHZlYzMgdmN0Tm9ybWFsID0gbm9ybWFsaXplKHZfdmN0Tm9ybWFsKTtcclxuXHJcbiAgICAjZW5kaWZcclxuXHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodl92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTtcclxuICAgIHZlYzMgdmN0UG9zaXRpb24gPSB2X3ZjdFBvc2l0aW9uO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmZGVmIEZMQVRcclxuXHJcbiAgICB2ZWMzIHZjdEZkeCA9IGRGZHgodl92Y3RQb3NpdGlvbik7XHJcbiAgICB2ZWMzIHZjdEZkeSA9IGRGZHkodl92Y3RQb3NpdGlvbik7XHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IG5vcm1hbGl6ZShjcm9zcyh2Y3RGZHgsIHZjdEZkeSkpO1xyXG4gICAgdmVjMyB2Y3RWaWV3ID0gbm9ybWFsaXplKHZfdmN0UG9zaXRpb25GbGF0IC0gdV92Y3RDYW1lcmEpO1xyXG4gICAgdmVjMyB2Y3RQb3NpdGlvbiA9IHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgdmVjMyB2Y3REaWZmdXNlID0gdV9mRGlmZnVzZSAqIHVfYW1iaWVudC52Y3RDb2xvci5yZ2I7XHJcbiAgdmVjMyB2Y3RTcGVjdWxhciA9IHZlYzMoMCwgMCwgMCk7XHJcblxyXG4gIC8vIGNhbGN1bGF0ZSBkaXJlY3Rpb25hbCBsaWdodCBlZmZlY3RcclxuICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNEaXJlY3Rpb25hbDsgaSsrKSB7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IHZlYzModV9kaXJlY3Rpb25hbFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDEuMCwgMS4wKSk7XHJcbiAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfZGlyZWN0aW9uYWxbaV0udmN0Q29sb3IucmdiLCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgfVxyXG5cclxuICAvLyBjYWxjdWxhdGUgcG9pbnQgbGlnaHQgZWZmZWN0XHJcbiAgZm9yKHVpbnQgaSA9IDB1OyBpIDwgdV9uTGlnaHRzUG9pbnQ7IGkrKykge1xyXG4gICAgdmVjMyB2Y3RQb3NpdGlvbkxpZ2h0ID0gdmVjMyh1X3BvaW50W2ldLm10eFNoYXBlICogdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApKTtcclxuICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24gLSB2Y3RQb3NpdGlvbkxpZ2h0O1xyXG4gICAgZmxvYXQgZkludGVuc2l0eSA9IDEuMCAtIGxlbmd0aChtYXQzKHVfcG9pbnRbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIHZjdERpcmVjdGlvbik7XHJcbiAgICBpZihmSW50ZW5zaXR5IDwgMC4wKVxyXG4gICAgICBjb250aW51ZTtcclxuXHJcbiAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfcG9pbnRbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdmN0RGlmZnVzZSwgdmN0U3BlY3VsYXIpO1xyXG4gIH1cclxuXHJcbiAgLy8gY2FsY3VsYXRlIHNwb3QgbGlnaHQgZWZmZWN0XHJcbiAgZm9yKHVpbnQgaSA9IDB1OyBpIDwgdV9uTGlnaHRzU3BvdDsgaSsrKSB7XHJcbiAgICB2ZWMzIHZjdFBvc2l0aW9uTGlnaHQgPSB2ZWMzKHVfc3BvdFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IHZjdFBvc2l0aW9uIC0gdmN0UG9zaXRpb25MaWdodDtcclxuICAgIHZlYzMgdmN0RGlyZWN0aW9uSW52ZXJ0ZWQgPSBtYXQzKHVfc3BvdFtpXS5tdHhTaGFwZUludmVyc2UpICogdmN0RGlyZWN0aW9uO1xyXG4gICAgaWYodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiA8PSAwLjApXHJcbiAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgIGZsb2F0IGZJbnRlbnNpdHkgPSAxLjAgLSBtaW4oMS4wLCAyLjAgKiBsZW5ndGgodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueHkpIC8gdmN0RGlyZWN0aW9uSW52ZXJ0ZWQueik7ICAgIC8vQ29uZXNoYXBlIHRoYXQgaXMgYnJpZ2h0ZXN0IGluIHRoZSBjZW50ZXIuIFBvc3NpYmxlIFRPRE86IFwiVmFyaWFibGUgU3BvdGxpZ2h0c29mdG5lc3NcIlxyXG4gICAgZkludGVuc2l0eSAqPSAxLjAgLSBwb3codmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiwgMi4wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QcmV2ZW50cyBoYXJzaCBsaWdodGluZyBhcnRpZmFjdHMgYXQgYm91bmRhcnkgb2YgdGhlIGdpdmVuIHNwb3RsaWdodFxyXG4gICAgaWYoZkludGVuc2l0eSA8IDAuMClcclxuICAgICAgY29udGludWU7XHJcblxyXG4gICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3Nwb3RbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdmN0RGlmZnVzZSwgdmN0U3BlY3VsYXIpO1xyXG4gIH1cclxuXHJcbiAgdmN0RnJhZy5yZ2IgPSB2Y3REaWZmdXNlICsgdmN0U3BlY3VsYXIgKiB1X2ZNZXRhbGxpYztcclxuICB2Y3RGcmFnLmEgPSAxLjA7XHJcblxyXG4gICNpZmRlZiBURVhUVVJFXHJcblxyXG4gICAgdmVjNCB2Y3RDb2xvclRleHR1cmUgPSB0ZXh0dXJlKHVfdGV4Q29sb3IsIHZfdmN0VGV4dHVyZSk7XHJcbiAgICB2Y3RGcmFnICo9IHZjdENvbG9yVGV4dHVyZTtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gIHZjdEZyYWcgKj0gdV92Y3RDb2xvciAqIHZfdmN0Q29sb3I7XHJcbiAgdmN0RnJhZy5yZ2IgKz0gdmN0U3BlY3VsYXIgKiAoMS4wIC0gdV9mTWV0YWxsaWMpO1xyXG5cclxuICB2Y3RGcmFnUG9zaXRpb24gPSB2ZWM0KHZfdmN0UG9zaXRpb24sIDEuMCk7IC8vIGRvbid0IHVzZSBmbGF0IGhlcmUsIGJlY2F1c2Ugd2Ugd2FudCB0byBpbnRlcnBvbGF0ZSB0aGUgcG9zaXRpb25cclxuICB2Y3RGcmFnTm9ybWFsID0gdmVjNCh2Y3ROb3JtYWwsIDEuMCk7XHJcblxyXG4gIGlmICh1X2JGb2cpIFxyXG4gICAgdmN0RnJhZy5yZ2IgPSBtaXgodmN0RnJhZy5yZ2IsIHVfdmN0Rm9nQ29sb3IucmdiLCBnZXRGb2codmN0UG9zaXRpb24pICogdV92Y3RGb2dDb2xvci5hKTtcclxuXHJcbiAgdmN0RnJhZy5yZ2IgKj0gdmN0RnJhZy5hO1xyXG5cclxuICBpZih2Y3RGcmFnLmEgPCAwLjAxKVxyXG4gICAgZGlzY2FyZDtcclxufWA7XG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIFJlbmRlcnMgZm9yIFJheWNhc3RpbmdcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbnVuaWZvcm0gaW50IHVfaWQ7XHJcbnVuaWZvcm0gdmVjMiB1X3ZjdFNpemU7XHJcbnVuaWZvcm0gdmVjNCB1X3ZjdENvbG9yO1xyXG5vdXQgaXZlYzQgdmN0RnJhZztcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICAgIGludCBwaXhlbCA9IGludCh0cnVuYyhnbF9GcmFnQ29vcmQueCkgKyB1X3ZjdFNpemUueCAqIHRydW5jKGdsX0ZyYWdDb29yZC55KSk7XHJcblxyXG4gICAgaWYgKHBpeGVsICE9IHVfaWQpXHJcbiAgICAgIGRpc2NhcmQ7XHJcblxyXG4gICAgdWludCBpY29sb3IgPSB1aW50KHVfdmN0Q29sb3IuciAqIDI1NS4wKSA8PCAyNCB8IHVpbnQodV92Y3RDb2xvci5nICogMjU1LjApIDw8IDE2IHwgdWludCh1X3ZjdENvbG9yLmIgKiAyNTUuMCkgPDwgOCB8IHVpbnQodV92Y3RDb2xvci5hICogMjU1LjApO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICB2Y3RGcmFnID0gaXZlYzQoZmxvYXRCaXRzVG9JbnQoZ2xfRnJhZ0Nvb3JkLnopLCBpY29sb3IsIDAsIDApO1xyXG59YDtcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2sudmVydFwiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogUmVuZGVycyBmb3IgUmF5Y2FzdGluZ1xyXG4qIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiovXHJcbmluIHZlYzMgYV92Y3RQb3NpdGlvbjsgICAgICAgXHJcbnVuaWZvcm0gbWF0NCB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG52b2lkIG1haW4oKSB7ICAgXHJcbiAgICBnbF9Qb3NpdGlvbiA9IHVfbXR4TWVzaFRvVmlldyAqIHZlYzQoYV92Y3RQb3NpdGlvbiwgMS4wKTtcclxufWA7XG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrVGV4dHVyZWQuZnJhZ1wiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogUmVuZGVycyBmb3IgUmF5Y2FzdGluZ1xyXG4qIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSBpbnQgdV9pZDtcclxudW5pZm9ybSB2ZWMyIHVfdmN0U2l6ZTtcclxuaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcbnVuaWZvcm0gdmVjNCB1X3ZjdENvbG9yO1xyXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleENvbG9yO1xyXG5cclxub3V0IGl2ZWM0IHZjdEZyYWc7XHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgaW50IHBpeGVsID0gaW50KHRydW5jKGdsX0ZyYWdDb29yZC54KSArIHVfdmN0U2l6ZS54ICogdHJ1bmMoZ2xfRnJhZ0Nvb3JkLnkpKTtcclxuXHJcbiAgaWYgKHBpeGVsICE9IHVfaWQpXHJcbiAgICBkaXNjYXJkO1xyXG4gIFxyXG4gIHZlYzQgdmN0Q29sb3IgPSB1X3ZjdENvbG9yICogdGV4dHVyZSh1X3RleENvbG9yLCB2X3ZjdFRleHR1cmUpO1xyXG4gIHVpbnQgaWNvbG9yID0gdWludCh2Y3RDb2xvci5yICogMjU1LjApIDw8IDI0IHwgdWludCh2Y3RDb2xvci5nICogMjU1LjApIDw8IDE2IHwgdWludCh2Y3RDb2xvci5iICogMjU1LjApIDw8IDggfCB1aW50KHZjdENvbG9yLmEgKiAyNTUuMCk7XHJcbiAgXHJcbiAgdmN0RnJhZyA9IGl2ZWM0KGZsb2F0Qml0c1RvSW50KGdsX0ZyYWdDb29yZC56KSwgaWNvbG9yLCBmbG9hdEJpdHNUb0ludCh2X3ZjdFRleHR1cmUueCksIGZsb2F0Qml0c1RvSW50KHZfdmN0VGV4dHVyZS55KSk7XHJcbn1gO1xuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyUGlja1RleHR1cmVkLnZlcnRcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIFJlbmRlcnMgZm9yIFJheWNhc3RpbmdcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4qL1xyXG5pbiB2ZWMzIGFfdmN0UG9zaXRpb247ICAgICAgIFxyXG5pbiB2ZWMyIGFfdmN0VGV4dHVyZTtcclxudW5pZm9ybSBtYXQ0IHVfbXR4TWVzaFRvVmlldztcclxudW5pZm9ybSBtYXQzIHVfbXR4UGl2b3Q7XHJcblxyXG5vdXQgdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG52b2lkIG1haW4oKSB7ICAgXHJcbiAgZ2xfUG9zaXRpb24gPSB1X210eE1lc2hUb1ZpZXcgKiB2ZWM0KGFfdmN0UG9zaXRpb24sIDEuMCk7XHJcbiAgdl92Y3RUZXh0dXJlID0gKHVfbXR4UGl2b3QgKiB2ZWMzKGFfdmN0VGV4dHVyZSwgMS4wKSkueHk7XHJcbn1gO1xuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyU2NyZWVuLnZlcnRcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG4vKipcclxuICogQ3JlYXRlcyBhIGZ1bGxzY3JlZW4gdHJpYW5nbGUgd2hpY2ggY290YWlucyB0aGUgc2NyZWVuIHF1YWQgYW5kIHNldHMgdGhlIHRleHR1cmUgY29vcmRpbmF0ZXMgYWNjb3JkaW5nbHkuXHJcbiAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gKlxyXG4gKiAgMiAgMyAuXHJcbiAqICAgICAgIC4gIC5cclxuICogICAgICAgLiAgICAgLiAgXHJcbiAqICAgICAgIC4gICAgICAgIC5cclxuICogIDEgIDEgLi4uLi4uLi4uLiAgLlxyXG4gKiAgICAgICAuIHNjcmVlbiAuICAgICAuXHJcbiAqICAgICAgIC4gIHF1YWQgIC4gICAgICAgIC5cclxuICogIDAgLTEgLi4uLi4uLi4uLiAgLiAgLiAgLiAgLlxyXG4gKiAgICBwIC0xICAgICAgICAxICAgICAgICAgICAzXHJcbiAqICB0ICAgIDAgICAgICAgIDEgICAgICAgICAgIDJcclxuICogIFxyXG4gKiAgcCA9PSBwb3N0aW9uXHJcbiAqICB0ID09IHRleHR1cmUgY29vcmRpbmF0ZVxyXG4gKi9cclxuXHJcbnVuaWZvcm0gZmxvYXQgdV93aWR0aDtcclxudW5pZm9ybSBmbG9hdCB1X2hlaWdodDtcclxudW5pZm9ybSB2ZWMyIHVfdmN0UmVzb2x1dGlvbjtcclxuXHJcbm91dCB2ZWMyIHZfdmN0VGV4dHVyZTtcclxuXHJcbiNpZmRlZiBTQU1QTEVcclxuXHJcbiAgZmxhdCBvdXQgdmVjMls5XSB2X3ZjdE9mZnNldHM7XHJcblxyXG4jZW5kaWZcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICBmbG9hdCB4ID0gZmxvYXQoKGdsX1ZlcnRleElEICUgMikgKiA0KTsgLy8gMCwgNCwgMFxyXG4gIGZsb2F0IHkgPSBmbG9hdCgoZ2xfVmVydGV4SUQgLyAyKSAqIDQpOyAvLyAwLCAwLCA0XHJcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHggLSAxLjAsIHkgLSAxLjAsIDAuMCwgMS4wKTsgLy8gKC0xLCAtMSksICgzLCAtMSksICgtMSwgMylcclxuICB2X3ZjdFRleHR1cmUgPSB2ZWMyKHggLyAyLjAsIHkgLyAyLjApOyAgLy8gKDAsIDApLCAoMiwgMCksICgwLCAyKSAtPiBpbnRlcnBvbGF0aW9uIHdpbGwgeWllbGQgKDAsIDApLCAoMSwgMCksICgwLCAxKSBhcyB0aGUgcG9zaXRpb25zIGFyZSBkb3VibGUgdGhlIHNpemUgb2YgdGhlIHNjcmVlblxyXG5cclxuICAjaWZkZWYgU0FNUExFXHJcblxyXG4gICAgdmVjMiBvZmZzZXQgPSB2ZWMyKDEuMCAvIHVfdmN0UmVzb2x1dGlvbi54LCAxLjAgLyB1X3ZjdFJlc29sdXRpb24ueSk7XHJcbiAgICB2X3ZjdE9mZnNldHMgPSB2ZWMyW10oXHJcbiAgICAgIHZlYzIoLW9mZnNldC54LCBvZmZzZXQueSksICB2ZWMyKDAuMCwgb2Zmc2V0LnkpLCAgdmVjMihvZmZzZXQueCwgb2Zmc2V0LnkpLFxyXG4gICAgICB2ZWMyKC1vZmZzZXQueCwgMC4wKSwgICAgICAgdmVjMigwLjAsIDAuMCksICAgICAgIHZlYzIob2Zmc2V0LngsIDAuMCksXHJcbiAgICAgIHZlYzIoLW9mZnNldC54LCAtb2Zmc2V0LnkpLCB2ZWMyKDAuMCwgLW9mZnNldC55KSwgIHZlYzIob2Zmc2V0LngsIC1vZmZzZXQueSlcclxuICAgICk7XHJcblxyXG4gICNlbmRpZlxyXG59YDtcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclVuaXZlcnNhbC5mcmFnXCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuKiBVbml2ZXJzYWwgU2hhZGVyIGFzIGJhc2UgZm9yIG1hbnkgb3RoZXJzLiBDb250cm9sbGVkIGJ5IGNvbXBpbGVyIGRpcmVjdGl2ZXNcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMSB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbi8vIE1JTklNQUxcclxudW5pZm9ybSB2ZWM0IHVfdmN0Q29sb3I7XHJcbnVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTsgLy8gbmVlZGVkIGZvciBmb2dcclxudW5pZm9ybSBmbG9hdCB1X2ZBbHBoYUNsaXA7XHJcblxyXG5sYXlvdXQoc3RkMTQwKSB1bmlmb3JtIEZvZyB7XHJcbiAgYm9vbCB1X2JGb2dBY3RpdmU7XHJcbiAgZmxvYXQgdV9mRm9nTmVhcjtcclxuICBmbG9hdCB1X2ZGb2dGYXI7XHJcbiAgZmxvYXQgZm9nUGFkZGluZzsgLy8gYWRkIHBhZGRpbmcgdG8gYWxpZ24gdG8gMTYgYnl0ZXNcclxuICB2ZWM0IHVfdmN0Rm9nQ29sb3I7XHJcbn07XHJcblxyXG5pbiB2ZWMzIHZfdmN0UG9zaXRpb247XHJcbmluIHZlYzQgdl92Y3RDb2xvcjtcclxuXHJcbmxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0IHZjdEZyYWc7XHJcbmxheW91dChsb2NhdGlvbiA9IDEpIG91dCB2ZWM0IHZjdEZyYWdQb3NpdGlvbjsgLy8gVE9ETzogbWFrZSB0aGVzZSBvcHRpb25hbD9cclxubGF5b3V0KGxvY2F0aW9uID0gMikgb3V0IHZlYzQgdmN0RnJhZ05vcm1hbDtcclxuXHJcbiNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgaW4gdmVjMyB2X3ZjdE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoRkxBVClcclxuXHJcbiAgZmxhdCBpbiB2ZWMzIHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChHT1VSQVVEKVxyXG5cclxuICB1bmlmb3JtIGZsb2F0IHVfZk1ldGFsbGljO1xyXG4gIGluIHZlYzMgdl92Y3REaWZmdXNlO1xyXG4gIGluIHZlYzMgdl92Y3RTcGVjdWxhcjtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoVE9PTilcclxuXHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhUb29uO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChQSE9ORykgfHwgZGVmaW5lZChGTEFUKVxyXG5cclxuICB1bmlmb3JtIGZsb2F0IHVfZkRpZmZ1c2U7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZTcGVjdWxhcjtcclxuICB1bmlmb3JtIGZsb2F0IHVfZkludGVuc2l0eTtcclxuICB1bmlmb3JtIGZsb2F0IHVfZk1ldGFsbGljO1xyXG5cclxuICBzdHJ1Y3QgTGlnaHQge1xyXG4gICAgdmVjNCB2Y3RDb2xvcjtcclxuICAgIG1hdDQgbXR4U2hhcGU7XHJcbiAgICBtYXQ0IG10eFNoYXBlSW52ZXJzZTtcclxuICB9O1xyXG5cclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfRElSRUNUSU9OQUwgPSAxNXU7XHJcbiAgY29uc3QgdWludCBNQVhfTElHSFRTX1BPSU5UID0gMTAwdTtcclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfU1BPVCA9IDEwMHU7XHJcblxyXG4gIGxheW91dChzdGQxNDApIHVuaWZvcm0gTGlnaHRzIHtcclxuICAgIHVpbnQgdV9uTGlnaHRzRGlyZWN0aW9uYWw7XHJcbiAgICB1aW50IHVfbkxpZ2h0c1BvaW50O1xyXG4gICAgdWludCB1X25MaWdodHNTcG90O1xyXG4gICAgdWludCBsaWd0aHNQYWRkaW5nOyAvLyBBZGQgcGFkZGluZyB0byBhbGlnbiB0byAxNiBieXRlc1xyXG4gICAgTGlnaHQgdV9hbWJpZW50O1xyXG4gICAgTGlnaHQgdV9kaXJlY3Rpb25hbFtNQVhfTElHSFRTX0RJUkVDVElPTkFMXTtcclxuICAgIExpZ2h0IHVfcG9pbnRbTUFYX0xJR0hUU19QT0lOVF07XHJcbiAgICBMaWdodCB1X3Nwb3RbTUFYX0xJR0hUU19TUE9UXTtcclxuICB9O1xyXG5cclxuICB2b2lkIGlsbHVtaW5hdGVEaXJlY3RlZCh2ZWMzIF92Y3REaXJlY3Rpb24sIHZlYzMgX3ZjdFZpZXcsIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMyBfdmN0Q29sb3IsIGlub3V0IHZlYzMgX3ZjdERpZmZ1c2UsIGlub3V0IHZlYzMgX3ZjdFNwZWN1bGFyKSB7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IG5vcm1hbGl6ZShfdmN0RGlyZWN0aW9uKTtcclxuICAgIGZsb2F0IGZEaWZmdXNlID0gLWRvdChfdmN0Tm9ybWFsLCB2Y3REaXJlY3Rpb24pO1xyXG5cclxuICAgICNpZiBkZWZpbmVkKFRPT04pXHJcbiAgICAgIFxyXG4gICAgICBmRGlmZnVzZSA9IHRleHR1cmUodV90ZXhUb29uLCB2ZWMyKGZEaWZmdXNlLCAwKSkucjtcclxuXHJcbiAgICAjZW5kaWZcclxuXHJcbiAgICBpZihmRGlmZnVzZSA+IDAuMCkge1xyXG5cclxuICAgICAgX3ZjdERpZmZ1c2UgKz0gdV9mRGlmZnVzZSAqIGZEaWZmdXNlICogX3ZjdENvbG9yO1xyXG5cclxuICAgICAgaWYodV9mU3BlY3VsYXIgPD0gMC4wKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgLy9CTElOTi1QaG9uZyBTaGFkaW5nXHJcbiAgICAgIHZlYzMgaGFsZndheURpciA9IG5vcm1hbGl6ZSgtdmN0RGlyZWN0aW9uIC0gX3ZjdFZpZXcpO1xyXG4gICAgICBmbG9hdCBmYWN0b3IgPSBtYXgoZG90KC12Y3REaXJlY3Rpb24sIF92Y3ROb3JtYWwpLCAwLjApOyAvL0ZhY3RvciBmb3Igc21vb3RoaW5nIG91dCB0cmFuc2l0aW9uIGZyb20gc3VyZmFjZSBmYWNpbmcgdGhlIGxpZ2h0c291cmNlIHRvIHN1cmZhY2UgZmFjaW5nIGF3YXkgZnJvbSB0aGUgbGlnaHRzb3VyY2VcclxuICAgICAgZmFjdG9yID0gMS4wIC0gKHBvdyhmYWN0b3IgLSAxLjAsIDguMCkpOyAgICAgICAgICAgICAgICAgLy9UaGUgZmFjdG9yIGlzIGFsdGVyZWQgaW4gb3JkZXIgdG8gY2xlYXJseSBzZWUgdGhlIHNwZWN1bGFyIGhpZ2hsaWdodCBldmVuIGF0IHN0ZWVwIGFuZ2xlcywgd2hpbGUgc3RpbGwgcHJldmVudGluZyBhcnRpZmFjdHNcclxuXHJcbiAgICAgIGZsb2F0IGZTcGVjdWxhciA9IHBvdyhtYXgoZG90KF92Y3ROb3JtYWwsIGhhbGZ3YXlEaXIpLCAwLjApLCBleHAyKHVfZlNwZWN1bGFyICogNS4wKSkgKiBmYWN0b3I7IFxyXG5cclxuICAgICAgI2lmIGRlZmluZWQoVE9PTilcclxuICAgICAgICBcclxuICAgICAgICBmU3BlY3VsYXIgPSB0ZXh0dXJlKHVfdGV4VG9vbiwgdmVjMihmU3BlY3VsYXIsIDAuMCkpLmcgKiBmRGlmZnVzZTtcclxuXHJcbiAgICAgICNlbmRpZlxyXG5cclxuICAgICAgX3ZjdFNwZWN1bGFyICs9IGZTcGVjdWxhciAqIHVfZlNwZWN1bGFyICogdV9mSW50ZW5zaXR5ICogX3ZjdENvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoVEVYVFVSRSkgfHwgZGVmaW5lZChNQVRDQVApXHJcblxyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Q29sb3I7XHJcbiAgaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhOb3JtYWw7XHJcbiAgaW4gdmVjMyB2X3ZjdFRhbmdlbnQ7XHJcbiAgaW4gdmVjMyB2X3ZjdEJpdGFuZ2VudDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoUEFSVElDTEUpXHJcblxyXG4gIHVuaWZvcm0gaW50IHVfaUJsZW5kTW9kZTtcclxuXHJcbiNlbmRpZlxyXG5cclxuZmxvYXQgZ2V0Rm9nKHZlYzMgX3ZjdFBvc2l0aW9uKSB7XHJcbiAgZmxvYXQgZkRpc3RhbmNlID0gbGVuZ3RoKF92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTsgLy8gbWF5YmUgdXNlIHotZGVwdGggaW5zdGVhZCBvZiBldWNsaWRlYW4gZGVwdGhcclxuICBmbG9hdCBmRm9nID0gY2xhbXAoKGZEaXN0YW5jZSAtIHVfZkZvZ05lYXIpIC8gKHVfZkZvZ0ZhciAtIHVfZkZvZ05lYXIpLCAwLjAsIDEuMCk7XHJcbiAgZkZvZyA9IC1wb3coZkZvZywgMi4wKSArICgyLjAgKiBmRm9nKTsgLy8gbGV0cyBmb2cgYXBwZWFyIHF1aWNrZXIgYW5kIGZhbGwgb2ZmIHNsb3dlciByZXN1bHRzIGluIGEgbW9yZSBncmFkdWFsIGZhbGxvZmZcclxuICByZXR1cm4gZkZvZyAqIHVfdmN0Rm9nQ29sb3IuYTtcclxufVxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKVxyXG5cclxuICAgIHZlYzMgdmN0RmR4ID0gZEZkeCh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZlYzMgdmN0RmR5ID0gZEZkeSh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZlYzMgdmN0Tm9ybWFsID0gbm9ybWFsaXplKGNyb3NzKHZjdEZkeCwgdmN0RmR5KSk7XHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodl92Y3RQb3NpdGlvbkZsYXQgLSB1X3ZjdENhbWVyYSk7XHJcbiAgICB2ZWMzIHZjdFBvc2l0aW9uID0gdl92Y3RQb3NpdGlvbkZsYXQ7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgKGRlZmluZWQoUEhPTkcpIHx8IGRlZmluZWQoR09VUkFVRCkpICYmICFkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IG5vcm1hbGl6ZSh2X3ZjdE5vcm1hbCk7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodl92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTtcclxuICAgIHZlYzMgdmN0UG9zaXRpb24gPSB2X3ZjdFBvc2l0aW9uO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmIGRlZmluZWQoTk9STUFMTUFQKVxyXG5cclxuICAgIG1hdDMgbXR4VEJOID0gbWF0Myhub3JtYWxpemUodl92Y3RUYW5nZW50KSwgbm9ybWFsaXplKHZfdmN0Qml0YW5nZW50KSwgbm9ybWFsaXplKHZfdmN0Tm9ybWFsKSk7XHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IHRleHR1cmUodV90ZXhOb3JtYWwsIHZfdmN0VGV4dHVyZSkueHl6ICogMi4wIC0gMS4wO1xyXG4gICAgdmN0Tm9ybWFsID0gbm9ybWFsaXplKG10eFRCTiAqIHZjdE5vcm1hbCk7XHJcblxyXG4gICNlbmRpZlxyXG4gIFxyXG4gICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgdmVjMyB2Y3REaWZmdXNlID0gdV9mRGlmZnVzZSAqIHVfYW1iaWVudC52Y3RDb2xvci5yZ2I7XHJcbiAgICB2ZWMzIHZjdFNwZWN1bGFyID0gdmVjMygwLCAwLCAwKTtcclxuXHJcbiAgICAvLyBkaXJlY3Rpb25hbCBsaWdodHNcclxuICAgIGZvcih1aW50IGkgPSAwdTsgaSA8IHVfbkxpZ2h0c0RpcmVjdGlvbmFsOyBpKyspIHtcclxuICAgICAgdmVjMyB2Y3REaXJlY3Rpb24gPSB2ZWMzKHVfZGlyZWN0aW9uYWxbaV0ubXR4U2hhcGUgKiB2ZWM0KDAuMCwgMC4wLCAxLjAsIDEuMCkpO1xyXG4gICAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfZGlyZWN0aW9uYWxbaV0udmN0Q29sb3IucmdiLCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcG9pbnQgbGlnaHRzXHJcbiAgICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNQb2ludDsgaSsrKSB7XHJcbiAgICAgIHZlYzMgdmN0UG9zaXRpb25MaWdodCA9IHZlYzModV9wb2ludFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24gLSB2Y3RQb3NpdGlvbkxpZ2h0O1xyXG4gICAgICBmbG9hdCBmSW50ZW5zaXR5ID0gMS4wIC0gbGVuZ3RoKG1hdDModV9wb2ludFtpXS5tdHhTaGFwZUludmVyc2UpICogdmN0RGlyZWN0aW9uKTtcclxuICAgICAgaWYoZkludGVuc2l0eSA8IDAuMClcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGlsbHVtaW5hdGVEaXJlY3RlZCh2Y3REaXJlY3Rpb24sIHZjdFZpZXcsIHZjdE5vcm1hbCwgdV9wb2ludFtpXS52Y3RDb2xvci5yZ2IgKiBmSW50ZW5zaXR5LCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc3BvdCBsaWdodHNcclxuICAgIGZvcih1aW50IGkgPSAwdTsgaSA8IHVfbkxpZ2h0c1Nwb3Q7IGkrKykge1xyXG4gICAgICB2ZWMzIHZjdFBvc2l0aW9uTGlnaHQgPSB2ZWMzKHVfc3BvdFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24gLSB2Y3RQb3NpdGlvbkxpZ2h0O1xyXG4gICAgICB2ZWMzIHZjdERpcmVjdGlvbkludmVydGVkID0gbWF0Myh1X3Nwb3RbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIHZjdERpcmVjdGlvbjtcclxuICAgICAgaWYodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiA8PSAwLjApXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBmbG9hdCBmSW50ZW5zaXR5ID0gMS4wIC0gbWluKDEuMCwgMi4wICogbGVuZ3RoKHZjdERpcmVjdGlvbkludmVydGVkLnh5KSAvIHZjdERpcmVjdGlvbkludmVydGVkLnopOyAgICAvL0NvbmVzaGFwZSB0aGF0IGlzIGJyaWdodGVzdCBpbiB0aGUgY2VudGVyLiBQb3NzaWJsZSBUT0RPOiBcIlZhcmlhYmxlIFNwb3RsaWdodHNvZnRuZXNzXCJcclxuICAgICAgZkludGVuc2l0eSAqPSAxLjAgLSBwb3codmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiwgMi4wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QcmV2ZW50cyBoYXJzaCBsaWdodGluZyBhcnRpZmFjdHMgYXQgYm91bmRhcnkgb2YgdGhlIGdpdmVuIHNwb3RsaWdodFxyXG4gICAgICBpZihmSW50ZW5zaXR5IDwgMC4wKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3Nwb3RbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdmN0RGlmZnVzZSwgdmN0U3BlY3VsYXIpO1xyXG4gICAgfVxyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgdmVjNCB2Y3RDb2xvciA9IHVfdmN0Q29sb3IgKiB2X3ZjdENvbG9yO1xyXG4gIHZjdENvbG9yLnJnYiAqPSB2Y3RDb2xvci5hOyAvLyBwcmVtdWx0aXBseSBhbHBoYVxyXG5cclxuICAjaWYgZGVmaW5lZChHT1VSQVVEKVxyXG5cclxuICAgIHZlYzMgdmN0RGlmZnVzZSA9IHZfdmN0RGlmZnVzZTtcclxuICAgIHZlYzMgdmN0U3BlY3VsYXIgPSB2X3ZjdFNwZWN1bGFyO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmIGRlZmluZWQoRkxBVCkgfHwgZGVmaW5lZChHT1VSQVVEKSB8fCBkZWZpbmVkKFBIT05HKVxyXG5cclxuICAgIHZjdEZyYWcucmdiID0gdmN0RGlmZnVzZSArIHZjdFNwZWN1bGFyICogdV9mTWV0YWxsaWM7XHJcbiAgICB2Y3RGcmFnLmEgPSAxLjA7XHJcblxyXG4gICNlbHNlXHJcblxyXG4gICAgLy8gTUlOSU1BTDogc2V0IHRoZSBiYXNlIGNvbG9yXHJcbiAgICB2Y3RGcmFnID0gdmN0Q29sb3I7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChURVhUVVJFKSB8fCBkZWZpbmVkKE1BVENBUClcclxuICAgIFxyXG4gICAgLy8gVEVYVFVSRTogbXVsdGlwbHkgd2l0aCB0ZXhlbCBjb2xvclxyXG4gICAgdmVjNCB2Y3RDb2xvclRleHR1cmUgPSB0ZXh0dXJlKHVfdGV4Q29sb3IsIHZfdmN0VGV4dHVyZSk7IC8vIGhhcyBwcmVtdWx0aXBsaWVkIGFscGhhIGJ5IHdlYmdsXHJcbiAgICB2Y3RGcmFnICo9IHZjdENvbG9yVGV4dHVyZTtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgICB2Y3RGcmFnICo9IHZjdENvbG9yO1xyXG4gICAgdmN0RnJhZy5yZ2IgKz0gdmN0U3BlY3VsYXIgKiAoMS4wIC0gdV9mTWV0YWxsaWMpO1xyXG5cclxuICAgIHZjdEZyYWdQb3NpdGlvbiA9IHZlYzQodl92Y3RQb3NpdGlvbiwgMS4wKTtcclxuICAgIHZjdEZyYWdOb3JtYWwgPSB2ZWM0KHZjdE5vcm1hbCwgMS4wKTtcclxuICBcclxuICAjZW5kaWZcclxuXHJcbiAgI2lmICFkZWZpbmVkKFBIT05HKSAmJiAhZGVmaW5lZChGTEFUKSAmJiAhZGVmaW5lZChHT1VSQVVEKSAvLyBNSU5JTUFMXHJcblxyXG4gICAgdmN0RnJhZ1Bvc2l0aW9uID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApOyAvLyAoMCwgMCwgMCkgd2lsbCB0cmVhdCBvY2NsdWRlcnMgYXMgbm9uIGV4aXN0aW5nIGluIHNzYW9cclxuICAgIHZjdEZyYWdOb3JtYWwgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDEuMCk7IC8vICgwLCAwLCAwKSBub3JtYWwgd2lsbCB5aWVsZCBub3Qgb2NjbHVzaW9uIGluIHNzYW9cclxuICBcclxuICAjZW5kaWZcclxuXHJcbiAgLy8gZGlzY2FyZCBwaXhlbCBhbGx0b2dldGhlciB3aGVuIHRyYW5zcGFyZW50OiBkb24ndCBzaG93IGluIFotQnVmZmVyXHJcbiAgaWYodmN0RnJhZy5hIDwgdV9mQWxwaGFDbGlwKVxyXG4gICAgZGlzY2FyZDtcclxuXHJcbiAgaWYgKHVfYkZvZ0FjdGl2ZSkge1xyXG4gICAgZmxvYXQgZkZvZyA9IGdldEZvZyh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZjdEZyYWcucmdiIC89IHZjdEZyYWcuYTsgLy8gdW5wcmVtdWx0aXBseSBhbHBoYVxyXG4gICAgdmN0RnJhZy5yZ2IgPSBtaXgodmN0RnJhZy5yZ2IsIHVfdmN0Rm9nQ29sb3IucmdiLCBmRm9nKTtcclxuXHJcbiAgICAjaWYgZGVmaW5lZChQQVJUSUNMRSlcclxuXHJcbiAgICAgIGlmICh1X2lCbGVuZE1vZGUgPT0gMiB8fCB1X2lCbGVuZE1vZGUgPT0gMyB8fCB1X2lCbGVuZE1vZGUgPT0gNCkgIC8vIGZvciBibGVuZCBhZGRpdGl2ZSwgc3VidHJhY3RpdmUsIG1vZHVsYXRlXHJcbiAgICAgICAgdmN0RnJhZy5hID0gbWl4KHZjdEZyYWcuYSwgMC4wLCBmRm9nKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhZGUgb3V0IHBhcnRpY2xlIHdoZW4gaW4gZm9nIHRvIG1ha2UgaXQgZGlzYXBwZWFyIGNvbXBsZXRlbHlcclxuXHJcbiAgICAjZW5kaWZcclxuXHJcbiAgICB2Y3RGcmFnLnJnYiAqPSB2Y3RGcmFnLmE7IC8vIHByZW11bHRpcGx5IGFscGhhXHJcbiAgfVxyXG59YDtcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclVuaXZlcnNhbC52ZXJ0XCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuKiBVbml2ZXJzYWwgU2hhZGVyIGFzIGJhc2UgZm9yIG1hbnkgb3RoZXJzLiBDb250cm9sbGVkIGJ5IGNvbXBpbGVyIGRpcmVjdGl2ZXNcclxuKiBAYXV0aG9ycyAyMDIxLCBMdWlzIEtlY2ssIEhGVSwgMjAyMSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSBtYXQ0IHVfbXR4TWVzaFRvV29ybGQ7IC8vIG5lZWRlZCBmb3IgRk9HXHJcbnVuaWZvcm0gbWF0NCB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG5pbiB2ZWMzIGFfdmN0UG9zaXRpb247XHJcbmluIHZlYzQgYV92Y3RDb2xvcjsgLy8gVE9ETzogdGhpbmsgYWJvdXQgbWFraW5nIHZlcnRleCBjb2xvciBvcHRpb25hbFxyXG5cclxub3V0IHZlYzMgdl92Y3RQb3NpdGlvbjtcclxub3V0IHZlYzQgdl92Y3RDb2xvcjtcclxuXHJcbiNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORykgfHwgZGVmaW5lZChQQVJUSUNMRSkgfHwgZGVmaW5lZChNQVRDQVApXHJcblxyXG4gIHVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoRkxBVCkgfHwgZGVmaW5lZChHT1VSQVVEKSB8fCBkZWZpbmVkKFBIT05HKVxyXG5cclxuICB1bmlmb3JtIG1hdDQgdV9tdHhOb3JtYWxNZXNoVG9Xb3JsZDtcclxuXHJcbiAgaW4gdmVjMyBhX3ZjdE5vcm1hbDtcclxuICBvdXQgdmVjMyB2X3ZjdE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoRkxBVClcclxuXHJcbiAgZmxhdCBvdXQgdmVjMyB2X3ZjdFBvc2l0aW9uRmxhdDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoR09VUkFVRClcclxuXHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZEaWZmdXNlO1xyXG4gIHVuaWZvcm0gZmxvYXQgdV9mU3BlY3VsYXI7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZJbnRlbnNpdHk7XHJcblxyXG4gIG91dCB2ZWMzIHZfdmN0RGlmZnVzZTtcclxuICBvdXQgdmVjMyB2X3ZjdFNwZWN1bGFyO1xyXG5cclxuICBzdHJ1Y3QgTGlnaHQge1xyXG4gICAgdmVjNCB2Y3RDb2xvcjtcclxuICAgIG1hdDQgbXR4U2hhcGU7XHJcbiAgICBtYXQ0IG10eFNoYXBlSW52ZXJzZTtcclxuICB9O1xyXG5cclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfRElSRUNUSU9OQUwgPSAxNXU7XHJcbiAgY29uc3QgdWludCBNQVhfTElHSFRTX1BPSU5UID0gMTAwdTtcclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfU1BPVCA9IDEwMHU7XHJcblxyXG4gIGxheW91dChzdGQxNDApIHVuaWZvcm0gTGlnaHRzIHtcclxuICAgIHVpbnQgdV9uTGlnaHRzRGlyZWN0aW9uYWw7XHJcbiAgICB1aW50IHVfbkxpZ2h0c1BvaW50O1xyXG4gICAgdWludCB1X25MaWdodHNTcG90O1xyXG4gICAgdWludCBwYWRkaW5nOyAvLyBBZGQgcGFkZGluZyB0byBhbGlnbiB0byAxNiBieXRlc1xyXG4gICAgTGlnaHQgdV9hbWJpZW50O1xyXG4gICAgTGlnaHQgdV9kaXJlY3Rpb25hbFtNQVhfTElHSFRTX0RJUkVDVElPTkFMXTtcclxuICAgIExpZ2h0IHVfcG9pbnRbTUFYX0xJR0hUU19QT0lOVF07XHJcbiAgICBMaWdodCB1X3Nwb3RbTUFYX0xJR0hUU19TUE9UXTtcclxuICB9O1xyXG5cclxuICB2b2lkIGlsbHVtaW5hdGVEaXJlY3RlZCh2ZWMzIF92Y3REaXJlY3Rpb24sIHZlYzMgX3ZjdFZpZXcsIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMyBfdmN0Q29sb3IsIGlub3V0IHZlYzMgX3ZjdERpZmZ1c2UsIGlub3V0IHZlYzMgX3ZjdFNwZWN1bGFyKSB7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IG5vcm1hbGl6ZShfdmN0RGlyZWN0aW9uKTtcclxuICAgIGZsb2F0IGZJbGx1bWluYXRpb24gPSAtZG90KF92Y3ROb3JtYWwsIHZjdERpcmVjdGlvbik7XHJcbiAgICBpZihmSWxsdW1pbmF0aW9uID4gMC4wKSB7XHJcbiAgICAgIF92Y3REaWZmdXNlICs9IHVfZkRpZmZ1c2UgKiBmSWxsdW1pbmF0aW9uICogX3ZjdENvbG9yO1xyXG5cclxuICAgICAgaWYodV9mU3BlY3VsYXIgPD0gMC4wKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vQkxJTk5cclxuICAgICAgdmVjMyBoYWxmd2F5RGlyID0gbm9ybWFsaXplKC12Y3REaXJlY3Rpb24gLSBfdmN0Vmlldyk7XHJcbiAgICAgIGZsb2F0IGZhY3RvciA9IG1heChkb3QoLXZjdERpcmVjdGlvbiwgX3ZjdE5vcm1hbCksIDAuMCk7IC8vRmFjdG9yIGZvciBzbW9vdGhpbmcgb3V0IHRyYW5zaXRpb24gZnJvbSBzdXJmYWNlIGZhY2luZyB0aGUgbGlnaHRzb3VyY2UgdG8gc3VyZmFjZSBmYWNpbmcgYXdheSBmcm9tIHRoZSBsaWdodHNvdXJjZVxyXG4gICAgICBmYWN0b3IgPSAxLjAgLSAocG93KGZhY3RvciAtIDEuMCwgOC4wKSk7ICAgICAgICAgICAgICAgICAvL1RoZSBmYWN0b3IgaXMgYWx0ZXJlZCBpbiBvcmRlciB0byBjbGVhcmx5IHNlZSB0aGUgc3BlY3VsYXIgaGlnaGxpZ2h0IGV2ZW4gYXQgc3RlZXAgYW5nbGVzLCB3aGlsZSBzdGlsbCBwcmV2ZW50aW5nIGFydGlmYWN0c1xyXG5cclxuICAgICAgX3ZjdFNwZWN1bGFyICs9IHBvdyhtYXgoZG90KF92Y3ROb3JtYWwsIGhhbGZ3YXlEaXIpLCAwLjApLCBleHAyKHVfZlNwZWN1bGFyICogNS4wKSkgKiB1X2ZTcGVjdWxhciAqIHVfZkludGVuc2l0eSAqIGZhY3RvciAqIF92Y3RDb2xvcjtcclxuXHJcbiAgICAgIC8vUEhPTkcgKG9sZClcclxuICAgICAgLy8gdmVjMyB2Y3RSZWZsZWN0aW9uID0gbm9ybWFsaXplKHJlZmxlY3QoLXZjdERpcmVjdGlvbiwgX3ZjdE5vcm1hbCkpO1xyXG4gICAgICAvLyBmbG9hdCBmSGl0Q2FtZXJhID0gZG90KHZjdFJlZmxlY3Rpb24sIF92Y3RWaWV3KTtcclxuICAgICAgLy8gX3ZjdFNwZWN1bGFyICs9IHBvdyhtYXgoZkhpdENhbWVyYSwgMC4wKSwgdV9mU3BlY3VsYXIgKiAxMC4wKSAqIHVfZlNwZWN1bGFyICogX3ZjdENvbG9yOyAvLyAxMC4wID0gbWFnaWMgbnVtYmVyLCBsb29rcyBnb29kLi4uIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoVEVYVFVSRSkgfHwgZGVmaW5lZChOT1JNQUxNQVApXHJcblxyXG4gIHVuaWZvcm0gbWF0MyB1X210eFBpdm90O1xyXG5cclxuICBpbiB2ZWMyIGFfdmN0VGV4dHVyZTtcclxuICBvdXQgdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgaW4gdmVjNCBhX3ZjdFRhbmdlbnQ7XHJcbiAgb3V0IHZlYzMgdl92Y3RUYW5nZW50O1xyXG4gIG91dCB2ZWMzIHZfdmN0Qml0YW5nZW50O1xyXG5cclxuI2VuZGlmXHJcblxyXG4vLyBNQVRDQVA6IG9mZmVyIGJ1ZmZlcnMgZm9yIFVWcyBhbmQgcGl2b3QgbWF0cml4XHJcbiNpZiBkZWZpbmVkKE1BVENBUCkgLy8gTWF0Q2FwLXNoYWRlciBnZW5lcmF0ZXMgdGV4dHVyZSBjb29yZGluYXRlcyBmcm9tIHN1cmZhY2Ugbm9ybWFsc1xyXG4gIFxyXG4gIHVuaWZvcm0gbWF0NCB1X210eFdvcmxkVG9DYW1lcmE7XHJcbiAgdW5pZm9ybSBtYXQ0IHVfbXR4Tm9ybWFsTWVzaFRvV29ybGQ7XHJcblxyXG4gIGluIHZlYzMgYV92Y3ROb3JtYWw7XHJcbiAgb3V0IHZlYzIgdl92Y3RUZXh0dXJlO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChTS0lOKVxyXG5cclxuICAvLyBCb25lcyBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2Jsb2IvZGV2L3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9za2lubmluZ19wYXJzX3ZlcnRleC5nbHNsLmpzXHJcbiAgdW5pZm9ybSBtYXQ0IHVfbXR4V29ybGRUb1ZpZXc7XHJcbiAgaW4gdXZlYzQgYV92Y3RCb25lcztcclxuICBpbiB2ZWM0IGFfdmN0V2VpZ2h0cztcclxuXHJcbiAgY29uc3QgdWludCBNQVhfQk9ORVMgPSAyNTZ1OyAvLyBDQVVUSU9OOiB0aGlzIG51bWJlciBtdXN0IGJlIHRoZSBzYW1lIGFzIGluIFJlbmRlckluamVjdG9yU2tlbGV0b25JbnN0YW5jZSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBidWZmZXJzIGFyZSBjcmVhdGVkXHJcbiAgbGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBTa2luIHtcclxuICAgIG1hdDQgdV9tdHhCb25lc1tNQVhfQk9ORVNdO1xyXG4gIH07XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKFBBUlRJQ0xFKVxyXG5cclxuICB1bmlmb3JtIG1hdDQgdV9tdHhXb3JsZFRvVmlldztcclxuICB1bmlmb3JtIGZsb2F0IHVfZlBhcnRpY2xlU3lzdGVtRHVyYXRpb247XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZQYXJ0aWNsZVN5c3RlbVNpemU7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZQYXJ0aWNsZVN5c3RlbVRpbWU7XHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnM7XHJcbiAgdW5pZm9ybSBib29sIHVfYlBhcnRpY2xlU3lzdGVtRmFjZUNhbWVyYTtcclxuICB1bmlmb3JtIGJvb2wgdV9iUGFydGljbGVTeXN0ZW1SZXN0cmljdDtcclxuXHJcbiAgbWF0NCBsb29rQXQodmVjMyBfdmN0VHJhbnNsYXRpb24sIHZlYzMgX3ZjdFRhcmdldCkge1xyXG4gICAgdmVjMyB2Y3RVcCA9IHZlYzMoMC4wLCAxLjAsIDAuMCk7XHJcbiAgICB2ZWMzIHpBeGlzID0gbm9ybWFsaXplKF92Y3RUYXJnZXQgLSBfdmN0VHJhbnNsYXRpb24pO1xyXG4gICAgdmVjMyB4QXhpcyA9IG5vcm1hbGl6ZShjcm9zcyh2Y3RVcCwgekF4aXMpKTtcclxuICAgIHZlYzMgeUF4aXMgPSB1X2JQYXJ0aWNsZVN5c3RlbVJlc3RyaWN0ID8gdmN0VXAgOiBub3JtYWxpemUoY3Jvc3MoekF4aXMsIHhBeGlzKSk7XHJcbiAgICB6QXhpcyA9IHVfYlBhcnRpY2xlU3lzdGVtUmVzdHJpY3QgPyBub3JtYWxpemUoY3Jvc3MoeEF4aXMsIHZjdFVwKSkgOiB6QXhpcztcclxuXHJcbiAgICByZXR1cm4gbWF0NCh4QXhpcy54LCB4QXhpcy55LCB4QXhpcy56LCAwLjAsIHlBeGlzLngsIHlBeGlzLnksIHlBeGlzLnosIDAuMCwgekF4aXMueCwgekF4aXMueSwgekF4aXMueiwgMC4wLCBfdmN0VHJhbnNsYXRpb24ueCwgX3ZjdFRyYW5zbGF0aW9uLnksIF92Y3RUcmFuc2xhdGlvbi56LCAxLjApO1xyXG4gIH1cclxuXHJcbiAgZmxvYXQgZmV0Y2hSYW5kb21OdW1iZXIoaW50IF9pSW5kZXgsIGludCBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUsIGludCBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc0xlbmd0aCkge1xyXG4gICAgX2lJbmRleCA9IF9pSW5kZXggJSBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc0xlbmd0aDtcclxuICAgIHJldHVybiB0ZXhlbEZldGNoKHVfcGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzLCBpdmVjMihfaUluZGV4ICUgX2lQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNTaXplLCBfaUluZGV4IC8gX2lQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNTaXplKSwgMCkucjtcclxuICB9XHJcblxyXG4jZW5kaWZcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcbiAgdmVjNCB2Y3RQb3NpdGlvbiA9IHZlYzQoYV92Y3RQb3NpdGlvbiwgMS4wKTtcclxuICBtYXQ0IG10eE1lc2hUb1dvcmxkID0gdV9tdHhNZXNoVG9Xb3JsZDtcclxuICBtYXQ0IG10eE1lc2hUb1ZpZXcgPSB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG4gICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORykgLy8gb25seSB0aGVzZSB3b3JrIHdpdGggcGFydGljbGUgYW5kIHNraW5uaW5nXHJcblxyXG4gICAgbWF0NCBtdHhOb3JtYWxNZXNoVG9Xb3JsZCA9IHVfbXR4Tm9ybWFsTWVzaFRvV29ybGQ7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChQQVJUSUNMRSlcclxuICBcclxuICAgIGZsb2F0IGZQYXJ0aWNsZUlkID0gZmxvYXQoZ2xfSW5zdGFuY2VJRCk7XHJcbiAgICBpbnQgaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUgPSB0ZXh0dXJlU2l6ZSh1X3BhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVycywgMCkueDsgLy8gdGhlIGRpbWVuc2lvbiBvZiB0aGUgcXVhZHJhdGljIHRleHR1cmVcclxuICAgIGludCBpUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzTGVuZ3RoID0gaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUgKiBpUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzU2l6ZTsgLy8gdGhlIHRvdGFsIG51bWJlciBvZiB0ZXhlbHMgaW4gdGhlIHRleHR1cmVcclxuICAgIC8qJHZhcmlhYmxlcyovXHJcbiAgICAvKiRtdHhMb2NhbCovXHJcbiAgICAvKiRtdHhXb3JsZCovXHJcbiAgICBtdHhNZXNoVG9Xb3JsZCA9IC8qJG10eFdvcmxkKi8gbXR4TWVzaFRvV29ybGQgLyokbXR4TG9jYWwqLztcclxuICAgIGlmKHVfYlBhcnRpY2xlU3lzdGVtRmFjZUNhbWVyYSkgbXR4TWVzaFRvV29ybGQgPSBsb29rQXQodmVjMyhtdHhNZXNoVG9Xb3JsZFszXVswXSwgbXR4TWVzaFRvV29ybGRbM11bMV0sIG10eE1lc2hUb1dvcmxkWzNdWzJdKSwgdV92Y3RDYW1lcmEpICpcclxuICAgICAgbWF0NChsZW5ndGgodmVjMyhtdHhNZXNoVG9Xb3JsZFswXVswXSwgbXR4TWVzaFRvV29ybGRbMV1bMF0sIG10eE1lc2hUb1dvcmxkWzJdWzBdKSksIDAuMCwgMC4wLCAwLjAsIDAuMCwgbGVuZ3RoKHZlYzMobXR4TWVzaFRvV29ybGRbMF1bMV0sIG10eE1lc2hUb1dvcmxkWzFdWzFdLCBtdHhNZXNoVG9Xb3JsZFsyXVsxXSkpLCAwLjAsIDAuMCwgMC4wLCAwLjAsIGxlbmd0aCh2ZWMzKG10eE1lc2hUb1dvcmxkWzBdWzJdLCBtdHhNZXNoVG9Xb3JsZFsxXVsyXSwgbXR4TWVzaFRvV29ybGRbMl1bMl0pKSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjApO1xyXG4gICAgbXR4TWVzaFRvVmlldyA9IHVfbXR4V29ybGRUb1ZpZXcgKiBtdHhNZXNoVG9Xb3JsZDtcclxuXHJcbiAgICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgICBtdHhOb3JtYWxNZXNoVG9Xb3JsZCA9IHRyYW5zcG9zZShpbnZlcnNlKG10eE1lc2hUb1dvcmxkKSk7XHJcblxyXG4gICAgI2VuZGlmXHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChTS0lOKVxyXG5cclxuICAgIG10eE1lc2hUb1dvcmxkID0gYV92Y3RXZWlnaHRzLnggKiB1X210eEJvbmVzW2FfdmN0Qm9uZXMueF0gK1xyXG4gICAgICBhX3ZjdFdlaWdodHMueSAqIHVfbXR4Qm9uZXNbYV92Y3RCb25lcy55XSArXHJcbiAgICAgIGFfdmN0V2VpZ2h0cy56ICogdV9tdHhCb25lc1thX3ZjdEJvbmVzLnpdICtcclxuICAgICAgYV92Y3RXZWlnaHRzLncgKiB1X210eEJvbmVzW2FfdmN0Qm9uZXMud107XHJcblxyXG4gICAgbXR4TWVzaFRvVmlldyA9IHVfbXR4V29ybGRUb1ZpZXcgKiBtdHhNZXNoVG9Xb3JsZDtcclxuXHJcbiAgICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgICBtdHhOb3JtYWxNZXNoVG9Xb3JsZCA9IHRyYW5zcG9zZShpbnZlcnNlKG10eE1lc2hUb1dvcmxkKSk7XHJcblxyXG4gICAgI2VuZGlmXHJcblxyXG4gICNlbmRpZlxyXG5cclxuICBnbF9Qb3NpdGlvbiA9IG10eE1lc2hUb1ZpZXcgKiB2Y3RQb3NpdGlvbjsgXHJcbiAgdmN0UG9zaXRpb24gPSBtdHhNZXNoVG9Xb3JsZCAqIHZjdFBvc2l0aW9uO1xyXG5cclxuICB2X3ZjdENvbG9yID0gYV92Y3RDb2xvcjtcclxuICB2X3ZjdFBvc2l0aW9uID0gdmN0UG9zaXRpb24ueHl6O1xyXG5cclxuICAjaWYgZGVmaW5lZChQQVJUSUNMRV9DT0xPUilcclxuXHJcbiAgICB2X3ZjdENvbG9yICo9IC8qJGNvbG9yKi87XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKVxyXG5cclxuICAgIHZfdmN0UG9zaXRpb25GbGF0ID0gdl92Y3RQb3NpdGlvbjtcclxuICAgIFxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgdl92Y3ROb3JtYWwgPSBtYXQzKG10eE5vcm1hbE1lc2hUb1dvcmxkKSAqIGFfdmN0Tm9ybWFsOyAvLyB1bm5vcm1hbGl6ZWQgYXMgaXQgbXVzdCBiZSBub3JtYWxpemVkIGluIHRoZSBmcmFnbWVudCBzaGFkZXIgYW55d2F5XHJcblxyXG4gICNlbmRpZiBcclxuXHJcbiAgI2lmIGRlZmluZWQoTk9STUFMTUFQKVxyXG5cclxuICAgIHZfdmN0VGFuZ2VudCA9IG1hdDMobXR4Tm9ybWFsTWVzaFRvV29ybGQpICogYV92Y3RUYW5nZW50Lnh5ejtcclxuICAgIHZfdmN0Qml0YW5nZW50ID0gY3Jvc3Modl92Y3ROb3JtYWwsIHZfdmN0VGFuZ2VudCkgKiBhX3ZjdFRhbmdlbnQudztcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKEdPVVJBVUQpXHJcbiAgXHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodmN0UG9zaXRpb24ueHl6IC0gdV92Y3RDYW1lcmEpO1xyXG4gICAgdmVjMyB2Y3ROb3JtYWwgPSBub3JtYWxpemUodl92Y3ROb3JtYWwpO1xyXG4gICAgdl92Y3REaWZmdXNlID0gdV9mRGlmZnVzZSAqIHVfYW1iaWVudC52Y3RDb2xvci5yZ2I7XHJcbiAgICB2X3ZjdFNwZWN1bGFyID0gdmVjMygwLCAwLCAwKTtcclxuXHJcbiAgICAvLyBjYWxjdWxhdGUgZGlyZWN0aW9uYWwgbGlnaHQgZWZmZWN0XHJcbiAgICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNEaXJlY3Rpb25hbDsgaSArKykge1xyXG4gICAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IHZlYzModV9kaXJlY3Rpb25hbFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDEuMCwgMS4wKSk7XHJcbiAgICAgIGlsbHVtaW5hdGVEaXJlY3RlZCh2Y3REaXJlY3Rpb24sIHZjdFZpZXcsIHZjdE5vcm1hbCwgdV9kaXJlY3Rpb25hbFtpXS52Y3RDb2xvci5yZ2IsIHZfdmN0RGlmZnVzZSwgdl92Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsY3VsYXRlIHBvaW50IGxpZ2h0IGVmZmVjdFxyXG4gICAgZm9yKHVpbnQgaSA9IDB1O2kgPCB1X25MaWdodHNQb2ludDtpICsrKSB7XHJcbiAgICAgIHZlYzMgdmN0UG9zaXRpb25MaWdodCA9IHZlYzModV9wb2ludFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24ueHl6IC0gdmN0UG9zaXRpb25MaWdodDtcclxuICAgICAgZmxvYXQgZkludGVuc2l0eSA9IDEuMCAtIGxlbmd0aChtYXQzKHVfcG9pbnRbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIHZjdERpcmVjdGlvbik7XHJcbiAgICAgIGlmKGZJbnRlbnNpdHkgPCAwLjApIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3BvaW50W2ldLnZjdENvbG9yLnJnYiAqIGZJbnRlbnNpdHksIHZfdmN0RGlmZnVzZSwgdl92Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsY3VsYXRlIHNwb3QgbGlnaHQgZWZmZWN0XHJcbiAgICBmb3IodWludCBpID0gMHU7aSA8IHVfbkxpZ2h0c1Nwb3Q7aSArKykge1xyXG4gICAgICB2ZWMzIHZjdFBvc2l0aW9uTGlnaHQgPSB2ZWMzKHVfc3BvdFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24ueHl6IC0gdmN0UG9zaXRpb25MaWdodDtcclxuICAgICAgdmVjMyB2Y3REaXJlY3Rpb25JbnZlcnRlZCA9IG1hdDModV9zcG90W2ldLm10eFNoYXBlSW52ZXJzZSkgKiB2Y3REaXJlY3Rpb247XHJcbiAgICAgIGlmKHZjdERpcmVjdGlvbkludmVydGVkLnogPD0gMC4wKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGZsb2F0IGZJbnRlbnNpdHkgPSAxLjAgLSBtaW4oMS4wLCAyLjAgKiBsZW5ndGgodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueHkpIC8gdmN0RGlyZWN0aW9uSW52ZXJ0ZWQueik7ICAgIC8vQ29uZXNoYXBlIHRoYXQgaXMgYnJpZ2h0ZXN0IGluIHRoZSBjZW50ZXIuIFBvc3NpYmxlIFRPRE86IFwiVmFyaWFibGUgU3BvdGxpZ2h0c29mdG5lc3NcIlxyXG4gICAgICBmSW50ZW5zaXR5ICo9IDEuMCAtIHBvdyh2Y3REaXJlY3Rpb25JbnZlcnRlZC56LCAyLjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1ByZXZlbnRzIGhhcnNoIGxpZ2h0aW5nIGFydGlmYWN0cyBhdCBib3VuZGFyeSBvZiB0aGUgZ2l2ZW4gc3BvdGxpZ2h0XHJcbiAgICAgIGlmKGZJbnRlbnNpdHkgPCAwLjApIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3Nwb3RbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdl92Y3REaWZmdXNlLCB2X3ZjdFNwZWN1bGFyKTtcclxuICAgIH1cclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICAgLy8gVEVYVFVSRTogdHJhbnNmb3JtIFVWc1xyXG4gICNpZiBkZWZpbmVkKFRFWFRVUkUpIHx8IGRlZmluZWQoTk9STUFMTUFQKVxyXG5cclxuICAgIHZfdmN0VGV4dHVyZSA9IHZlYzIodV9tdHhQaXZvdCAqIHZlYzMoYV92Y3RUZXh0dXJlLCAxLjApKS54eTtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKE1BVENBUClcclxuXHJcbiAgICB2ZWM0IHZjdFZlcnRleEluQ2FtZXJhID0gbm9ybWFsaXplKHVfbXR4V29ybGRUb0NhbWVyYSAqIHZjdFBvc2l0aW9uKTtcclxuICAgIHZjdFZlcnRleEluQ2FtZXJhLnh5ICo9IC0gMS4wO1xyXG4gICAgbWF0NCBtdHhfUm90WCA9IG1hdDQoMSwgMCwgMCwgMCwgMCwgdmN0VmVydGV4SW5DYW1lcmEueiwgdmN0VmVydGV4SW5DYW1lcmEueSwgMCwgMCwgLSB2Y3RWZXJ0ZXhJbkNhbWVyYS55LCB2Y3RWZXJ0ZXhJbkNhbWVyYS56LCAwLCAwLCAwLCAwLCAxKTtcclxuICAgIG1hdDQgbXR4X1JvdFkgPSBtYXQ0KHZjdFZlcnRleEluQ2FtZXJhLnosIDAsIC0gdmN0VmVydGV4SW5DYW1lcmEueCwgMCwgMCwgMSwgMCwgMCwgdmN0VmVydGV4SW5DYW1lcmEueCwgMCwgdmN0VmVydGV4SW5DYW1lcmEueiwgMCwgMCwgMCwgMCwgMSk7XHJcblxyXG4gICAgdmVjMyB2Y3ROb3JtYWwgPSBtYXQzKHVfbXR4Tm9ybWFsTWVzaFRvV29ybGQpICogYV92Y3ROb3JtYWw7XHJcblxyXG4gICAgLy8gYWRkcyBjb3JyZWN0aW9uIGZvciB0aGluZ3MgYmVpbmcgZmFyIGFuZCB0byB0aGUgc2lkZSwgYnV0IGRpc3RvcnRpb24gZm9yIHRoaW5ncyBiZWluZyBjbG9zZVxyXG4gICAgdmN0Tm9ybWFsID0gbWF0MyhtdHhfUm90WCAqIG10eF9Sb3RZKSAqIHZjdE5vcm1hbDtcclxuXHJcbiAgICB2ZWMzIHZjdFJlZmxlY3Rpb24gPSBub3JtYWxpemUobWF0Myh1X210eFdvcmxkVG9DYW1lcmEpICogbm9ybWFsaXplKHZjdE5vcm1hbCkpO1xyXG4gICAgdmN0UmVmbGVjdGlvbi55ID0gLSB2Y3RSZWZsZWN0aW9uLnk7XHJcblxyXG4gICAgdl92Y3RUZXh0dXJlID0gMC41ICogdmN0UmVmbGVjdGlvbi54eSArIDAuNTtcclxuXHJcbiAgI2VuZGlmXHJcbn1gO1xuXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db2F0L0NvYXQudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgdG8gYWNjZXNzIGRhdGEgZnJvbSBhIFdlYkdsIHNoYWRlcnByb2dyYW0uIFxyXG4gICAqIFRoaXMgc2hvdWxkIGFsd2F5cyBtaXJyb3IgdGhlIChzdGF0aWMpIGludGVyZmFjZSBvZiB7QGxpbmsgU2hhZGVyfS4gSXQgZXhwb3NlcyB0aGUgc3RhdGljIG1lbWJlcnMgb2YgU2hhZGVyIGluIGFuIGluc3RhbmNlLWJhc2VkIHdheS4gZS5nLjpcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogbGV0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlO1xyXG4gICAqIGBgYFxyXG4gICAqIGNhbiB0YWtlIHZhbHVlcyBvZiB0eXBlIFxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiB0eXBlb2YgU2hhZGVyIHwgU2hhZGVySW50ZWZhY2VcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNoYWRlckludGVyZmFjZSB7XHJcbiAgICBkZWZpbmU6IHN0cmluZ1tdO1xyXG4gICAgcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xyXG4gICAgYXR0cmlidXRlczogeyBbbmFtZTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgICB1bmlmb3JtczogeyBbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb24gfTtcclxuICAgIC8qKiBSZXR1cm5zIHRoZSB2ZXJ0ZXggc2hhZGVyIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgZ2V0VmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZztcclxuICAgIC8qKiBSZXR1cm5zIHRoZSBmcmFnbWVudCBzaGFkZXIgc291cmNlIGNvZGUgZm9yIHRoZSByZW5kZXIgZW5naW5lICovXHJcbiAgICBnZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmc7XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IGRlY29yYXRvci4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS4gKi9cclxuICAgIGRlbGV0ZVByb2dyYW0odGhpczogU2hhZGVySW50ZXJmYWNlKTogdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgSW5qZWN0ZWQgYnkgZGVjb3JhdG9yLiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLiAqL1xyXG4gICAgdXNlUHJvZ3JhbSh0aGlzOiBTaGFkZXJJbnRlcmZhY2UpOiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCBJbmplY3RlZCBieSBkZWNvcmF0b3IuIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovXHJcbiAgICBjcmVhdGVQcm9ncmFtKHRoaXM6IFNoYWRlckludGVyZmFjZSk6IHZvaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGF0aWMgc3VwZXJjbGFzcyBmb3IgdGhlIHJlcHJlc2VudGF0aW9uIG9mIFdlYkdsIHNoYWRlcnByb2dyYW1zLiBcclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgLy8gVE9ETzogZGVmaW5lIGF0dHJpYnV0ZS91bmlmb3JtcyBhcyBsYXlvdXQgYW5kIHVzZSB0aG9zZSBjb25zaXN0ZW50bHkgaW4gc2hhZGVyc1xyXG4gIEBSZW5kZXJJbmplY3RvclNoYWRlci5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXIge1xyXG4gICAgLyoqIHJlZmVycyBiYWNrIHRvIHRoaXMgY2xhc3MgZnJvbSBhbnkgc3ViY2xhc3MgZS5nLiBpbiBvcmRlciB0byBmaW5kIGNvbXBhdGlibGUgb3RoZXIgcmVzb3VyY2VzKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYmFzZUNsYXNzOiB0eXBlb2YgU2hhZGVyID0gU2hhZGVyO1xyXG4gICAgLyoqIGxpc3Qgb2YgYWxsIHRoZSBzdWJjbGFzc2VzIGRlcml2ZWQgZnJvbSB0aGlzIGNsYXNzLCBpZiB0aGV5IHJlZ2lzdGVyZWQgcHJvcGVybHkqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdWJjbGFzc2VzOiB0eXBlb2YgU2hhZGVyW10gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW107XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIHZlcnRleFNoYWRlclNvdXJjZTogc3RyaW5nO1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBmcmFnbWVudFNoYWRlclNvdXJjZTogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xyXG4gICAgcHVibGljIHN0YXRpYyBhdHRyaWJ1dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfTtcclxuICAgIHB1YmxpYyBzdGF0aWMgdW5pZm9ybXM6IHsgW25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9uIH07XHJcblxyXG4gICAgLyoqIFRoZSB0eXBlIG9mIGNvYXQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoaXMgc2hhZGVyIHRvIGNyZWF0ZSBhIG1hdGVyaWFsICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdENvbG9yZWQ7IH1cclxuICAgIC8qKiBSZXR1cm5zIHRoZSB2ZXJ0ZXggc2hhZGVyIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyVW5pdmVyc2FsLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuICAgIC8qKiBSZXR1cm5zIHRoZSBmcmFnbWVudCBzaGFkZXIgc291cmNlIGNvZGUgZm9yIHRoZSByZW5kZXIgZW5naW5lICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclVuaXZlcnNhbC5mcmFnXCJdLCB0aGlzLmRlZmluZSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlcn0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGV0ZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlcn0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHVzZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlcn0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovIC8vIFRPRE86IG1heWJlIGRvbid0IGZsYWcgdGhpcyBhcyBpbnRlcm5hbCwgc28gc2hhZGVycyBjYW4gYmUgcHJlY29tcGlsZWQgaW4gZnV0dXJlIEZVREdFIGFwcHMuIE9yIGNyZWF0ZSBhbiBBUEkgdG8gcHJlY29tcGlsZSBzaGFkZXJzLCBsb2FkIHRleHR1cmVzIGV0Yy5cclxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJvZ3JhbSh0aGlzOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgZGVjb3JhdG9yICovIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YmNsYXNzOiB0eXBlb2YgU2hhZGVyKTogbnVtYmVyIHsgcmV0dXJuIFNoYWRlci5zdWJjbGFzc2VzLnB1c2goX3N1YmNsYXNzKSAtIDE7IH1cclxuXHJcbiAgICAvLyByZXBsYWNlIHRoZSBtYW5kYXRvcnkgaGVhZGVyIG9mIHRoZSBzaGFkZXIgd2l0aCBpdHNlbGYgcGx1cyB0aGUgZGVmaW5pdGlvbnMgZ2l2ZW5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5zZXJ0RGVmaW5lcyhfc2hhZGVyOiBzdHJpbmcsIF9kZWZpbmVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICAgIGlmICghX2RlZmluZXMpXHJcbiAgICAgICAgcmV0dXJuIF9zaGFkZXI7XHJcblxyXG4gICAgICBsZXQgY29kZTogc3RyaW5nID0gXCIjdmVyc2lvbiAzMDAgZXNcXG5cIjtcclxuICAgICAgZm9yIChsZXQgZGVmaW5lIG9mIF9kZWZpbmVzKVxyXG4gICAgICAgIGNvZGUgKz0gYCNkZWZpbmUgJHtkZWZpbmV9XFxuYDtcclxuXHJcbiAgICAgIHJldHVybiBfc2hhZGVyLnJlcGxhY2UoXCIjdmVyc2lvbiAzMDAgZXNcIiwgY29kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckFtYmllbnRPY2NsdXNpb24gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyU2NyZWVuLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlckFtYmllbnRPY2NsdXNpb24uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJCbG9vbSBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFZlcnRleFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnREZWZpbmVzKHNoYWRlclNvdXJjZXNbXCJTaGFkZXJTY3JlZW4udmVydFwiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyQmxvb20uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJGbGF0IGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJGbGF0KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiRkxBVFwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckZsYXRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJGbGF0U2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkZMQVRcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmU7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyRmxhdFRleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJGbGF0VGV4dHVyZWQpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJGTEFUXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyRmxhdFRleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyRmxhdFRleHR1cmVkU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkZMQVRcIixcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR2l6bW8gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8udmVydFwiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJHaXptb1RleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcIlRFWFRVUkVcIl07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8udmVydFwiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJHb3VyYXVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJHb3VyYXVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiR09VUkFVRFwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckdvdXJhdWRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJHb3VyYXVkU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkdPVVJBVURcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmU7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR291cmF1ZFRleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJHb3VyYXVkVGV4dHVyZWQpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJHT1VSQVVEXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR291cmF1ZFRleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyR291cmF1ZFRleHR1cmVkU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkdPVVJBVURcIixcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTGl0IGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJMaXQpO1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckxpdFNraW4gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlckxpdFNraW4pO1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTGl0VGV4dHVyZWQgZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlckxpdFRleHR1cmVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0VGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTGl0VGV4dHVyZWRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJMaXRUZXh0dXJlZFNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0VGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTWF0Q2FwIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJNYXRDYXApO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJNQVRDQVBcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRleHR1cmVkOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlclBob25nIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJQaG9uZyk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlBIT05HXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmU7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyUGhvbmdTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJQaG9uZ1NraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZTsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJQaG9uZ1RleHR1cmVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJURVhUVVJFXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmVUZXh0dXJlZDsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkTm9ybWFscyBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHMpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRFWFRVUkVcIixcclxuICAgICAgXCJOT1JNQUxNQVBcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFsczsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkTm9ybWFsc1NraW4gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlclBob25nVGV4dHVyZWROb3JtYWxzU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlBIT05HXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiLFxyXG4gICAgICBcIk5PUk1BTE1BUFwiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFsczsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyUGhvbmdUZXh0dXJlZFNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRFWFRVUkVcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmVUZXh0dXJlZDsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaWNrIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFZlcnRleFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnREZWZpbmVzKHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2suZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaWNrVGV4dHVyZWQgZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyUGlja1RleHR1cmVkLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2tUZXh0dXJlZC5mcmFnXCJdLCB0aGlzLmRlZmluZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlclRvb24gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlclRvb24pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRPT05cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRvb247IH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJUb29uU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyVG9vblNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRPT05cIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRUb29uOyB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyVG9vblRleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJUb29uVGV4dHVyZWQpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRPT05cIixcclxuICAgICAgXCJURVhUVVJFXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRUb29uVGV4dHVyZWQ7IH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJUb29uVGV4dHVyZWRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJUb29uVGV4dHVyZWRTa2luKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJUT09OXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRvb25UZXh0dXJlZDsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKiB7QGxpbmsgVGV4SW1hZ2VTb3VyY2V9IGlzIGEgdW5pb24gdHlwZSB3aGljaCBhcyBvZiBub3cgaW5jbHVkZXMge0BsaW5rIFZpZGVvRnJhbWV9LiBBbGwgb3RoZXIgcGFydHMgb2YgdGhpcyB1bmlvbiBoYXZlIGEgLndpZHRoIGFuZCAuaGVpZ2h0IHByb3BlcnR5IGJ1dCBWaWRlb0ZyYW1lIGRvZXMgbm90LiBBbmQgc2luY2Ugd2Ugb25seSBldmVyIHVzZSB7QGxpbmsgSFRNTEltYWdlRWxlbWVudH0gYW5kIHtAbGluayBPZmZzY3JlZW5DYW52YXN9IGN1cnJlbnRseSBWaWRlb0ZyYW1lIGNhbiBiZSBleGNsdWRlZCBmb3IgY29udmVuaWVuY2Ugb2YgYWNjZXNzaW5nIC53aWR0aCBhbmQgLmhlaWdodCAqL1xyXG4gIHR5cGUgSW1hZ2VTb3VyY2UgPSBFeGNsdWRlPFRleEltYWdlU291cmNlLCBWaWRlb0ZyYW1lPjtcclxuXHJcbiAgLyoqXHJcbiAgICogLSBDUklTUDogbm8gbWlwbWFwcGluZywgbWFnIGZpbHRlciBuZWFyZXN0LCBtaW4gZmlsdGVyIG5lYXJlc3RcclxuICAgKiAtIE1FRElVTTogbWlwbWFwcGluZywgbWFnIGZpbHRlciBuZWFyZXN0LCBtaW4gZmlsdGVyIG5lYXJlc3RfbWlwbWFwX2xpbmVhclxyXG4gICAqIC0gQkxVUlJZOiBtaXBtYXBwaW5nLCBtYWcgZmlsdGVyIGxpbmVhciwgbWluIGZpbHRlciBsaW5lYXJfbWlwbWFwX2xpbmVhclxyXG4gICAqIC0gU01PT1RIOiBubyBtaXBtYXBwaW5nLCBtYWcgZmlsdGVyIGxpbmVhciwgbWluIGZpbHRlciBsaW5lYXJcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBNSVBNQVAge1xyXG4gICAgQ1JJU1AsIE1FRElVTSwgQkxVUlJZLCBTTU9PVEhcclxuICB9XHJcblxyXG4gIGV4cG9ydCBlbnVtIFdSQVAge1xyXG4gICAgUkVQRUFULCBDTEFNUCwgTUlSUk9SXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIGRpZmZlcmVudCBraW5kcyBvZiB0ZXh0dXJlcy4gXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JUZXh0dXJlLmRlY29yYXRlXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRleHR1cmUgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlUmVzb3VyY2Uge1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICAgIHB1YmxpYyBpZFJlc291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlbmRlckRhdGE6IHVua25vd247XHJcblxyXG4gICAgcHJvdGVjdGVkIHRleHR1cmVEaXJ0eTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcm90ZWN0ZWQgbWlwbWFwRGlydHk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJvdGVjdGVkIHdyYXBEaXJ0eTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgI21pcG1hcDogTUlQTUFQID0gTUlQTUFQLkNSSVNQO1xyXG4gICAgI3dyYXA6IFdSQVAgPSBXUkFQLlJFUEVBVDtcclxuXHJcbiAgICAjaGFzVHJhbnNwYXJlbmN5OiBib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJUZXh0dXJlXCIpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBtaXBtYXAoX21pcG1hcDogTUlQTUFQKSB7XHJcbiAgICAgIHRoaXMuI21pcG1hcCA9IF9taXBtYXA7XHJcbiAgICAgIHRoaXMubWlwbWFwRGlydHkgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbWlwbWFwKCk6IE1JUE1BUCB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtaXBtYXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB3cmFwKF93cmFwOiBXUkFQKSB7XHJcbiAgICAgIHRoaXMuI3dyYXAgPSBfd3JhcDtcclxuICAgICAgdGhpcy53cmFwRGlydHkgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgd3JhcCgpOiBXUkFQIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3dyYXA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHR1cmUgaGFzIGFueSB0ZXhlbHMgd2l0aCBhbHBoYSA8IDEuIFxyXG4gICAgICog4pqg77iPIENBVVRJT046IEhhcyB0byBiZSByZWNvbXB1dGVkIHdoZW5ldmVyIHRoZSB0ZXh0dXJlL2ltYWdlIGRhdGEgY2hhbmdlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBoYXNUcmFuc3BhcmVuY3koKTogYm9vbGVhbiB7IC8vIE9ubHkgdGVzdGVkIGZvciB0ZXhJbWFnZVNvdXJjZSBvZiB0eXBlIEhUTUxJbWFnZUVsZW1lbnQgYW5kIEhUTUxDYW52YXNFbGVtZW50XHJcbiAgICAgIGlmICh0aGlzLiNoYXNUcmFuc3BhcmVuY3kgIT0gbnVsbClcclxuICAgICAgICByZXR1cm4gdGhpcy4jaGFzVHJhbnNwYXJlbmN5O1xyXG5cclxuICAgICAgbGV0IGltYWdlRGF0YTogSW1hZ2VEYXRhO1xyXG5cclxuICAgICAgaWYgKHRoaXMudGV4SW1hZ2VTb3VyY2UgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcclxuICAgICAgICBpbWFnZURhdGEgPSB0aGlzLnRleEltYWdlU291cmNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBjYW52YXMud2lkdGggPSB0aGlzLnRleEltYWdlU291cmNlLndpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLnRleEltYWdlU291cmNlLmhlaWdodDtcclxuICAgICAgICBjb25zdCBjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBjcmMyLmRyYXdJbWFnZSh0aGlzLnRleEltYWdlU291cmNlLCAwLCAwKTtcclxuICAgICAgICBpbWFnZURhdGEgPSBjcmMyLmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLnRleEltYWdlU291cmNlLndpZHRoLCB0aGlzLnRleEltYWdlU291cmNlLmhlaWdodCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkgKz0gNClcclxuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbaSArIDNdIDwgMjU1KVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuI2hhc1RyYW5zcGFyZW5jeSA9IHRydWU7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jaGFzVHJhbnNwYXJlbmN5ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNldCBoYXNUcmFuc3BhcmVuY3koX2hhc1RyYW5zcGFyZW5jeTogYm9vbGVhbikge1xyXG4gICAgICB0aGlzLiNoYXNUcmFuc3BhcmVuY3kgPSBfaGFzVHJhbnNwYXJlbmN5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW1hZ2Ugc291cmNlIG9mIHRoaXMgdGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic3RyYWN0IGdldCB0ZXhJbWFnZVNvdXJjZSgpOiBJbWFnZVNvdXJjZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBhbmQgYmluZHMgdGhlIHRleHR1cmUgaW4gV2ViR0wgZnJvbSB0aGUge0BsaW5rIHRleEltYWdlU291cmNlfS4gXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JUZXh0dXJlfS4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXNlUmVuZGVyRGF0YShfdGV4dHVyZVVuaXQ6IG51bWJlciA9IDApOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZXMgdGhlIHRleHR1cmUgaW4gV2ViR0wgZnJlZWluZyB0aGUgYWxsb2NhdGVkIGdwdSBtZW1vcnkuXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JUZXh0dXJlfS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVuZGVyRGF0YSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZnJlc2hlcyB0aGUgaW1hZ2UgZGF0YSBpbiB0aGUgcmVuZGVyIGVuZ2luZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudGV4dHVyZURpcnR5ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGlkUmVzb3VyY2U6IHRoaXMuaWRSZXNvdXJjZSxcclxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgbWlwbWFwOiBNSVBNQVBbdGhpcy4jbWlwbWFwXSxcclxuICAgICAgICB3cmFwOiBXUkFQW3RoaXMuI3dyYXBdXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgdGhpcy4jbWlwbWFwID0gPG51bWJlcj48dW5rbm93bj5NSVBNQVBbX3NlcmlhbGl6YXRpb24ubWlwbWFwXTtcclxuICAgICAgdGhpcy4jd3JhcCA9IDxudW1iZXI+PHVua25vd24+V1JBUFtfc2VyaWFsaXphdGlvbi53cmFwXTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoX2V4dGVuZGFibGU/OiBib29sZWFuKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgbXV0YXRvci5taXBtYXAgPSB0aGlzLiNtaXBtYXA7XHJcbiAgICAgIG11dGF0b3Iud3JhcCA9IHRoaXMuI3dyYXA7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy5taXBtYXApXHJcbiAgICAgICAgdHlwZXMubWlwbWFwID0gTUlQTUFQO1xyXG4gICAgICBpZiAodHlwZXMud3JhcClcclxuICAgICAgICB0eXBlcy53cmFwID0gV1JBUDtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5pZFJlc291cmNlO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IucmVuZGVyRGF0YTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnRleHR1cmVEaXJ0eTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLm1pcG1hcERpcnR5O1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubWlwbWFwR2VuZXJhdGVkO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iud3JhcERpcnR5O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGV4dHVyZSBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgaW1hZ2VcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZUltYWdlIGV4dGVuZHMgVGV4dHVyZSB7XHJcbiAgICBwdWJsaWMgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgPSBudWxsO1xyXG4gICAgcHVibGljIHVybDogUmVxdWVzdEluZm87XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF91cmw/OiBSZXF1ZXN0SW5mbykge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICBpZiAoX3VybCkge1xyXG4gICAgICAgIHRoaXMubG9hZChfdXJsKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBfdXJsLnRvU3RyaW5nKCkuc3BsaXQoXCIvXCIpLnBvcCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbWFnZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzeW5jaHJvbm91c2x5IGxvYWRzIHRoZSBpbWFnZSBmcm9tIHRoZSBnaXZlbiB1cmxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLmltYWdlID0gbmV3IEltYWdlKCk7XHJcblxyXG5cclxuICAgICAgLy8gY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgd2luZG93LmZldGNoKHRoaXMudXJsKTtcclxuICAgICAgLy8gY29uc3QgYmxvYjogQmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcclxuICAgICAgLy8gbGV0IG9iamVjdFVSTDogc3RyaW5nID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgLy8gdGhpcy5pbWFnZS5zcmMgPSBvYmplY3RVUkw7XHJcblxyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbWFnZS5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlckRhdGEgPSBudWxsOyAvLyByZWZyZXNoIHJlbmRlciBkYXRhIG9uIG5leHQgZHJhdyBjYWxsXHJcbiAgICAgICAgICB0aGlzLmhhc1RyYW5zcGFyZW5jeSA9IG51bGw7IC8vIHJlc2V0IHRyYW5zcGFyZW5jeSBjaGVja1xyXG4gICAgICAgICAgX3Jlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoKSA9PiBfcmVqZWN0KCkpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2Uuc3JjID0gbmV3IFVSTCh0aGlzLnVybC50b1N0cmluZygpLCBQcm9qZWN0LmJhc2VVUkwpLnRvU3RyaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB1cmw6IHRoaXMudXJsLFxyXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSwgLy8gc2VyaWFsaXplIGZvciBlZGl0b3Igdmlld3NcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZChfc2VyaWFsaXphdGlvbi51cmwpO1xyXG4gICAgICAvLyB0aGlzLnR5cGUgaXMgYW4gYWNjZXNzb3Igb2YgTXV0YWJsZSBkb2Vzbid0IG5lZWQgdG8gYmUgZGVzZXJpYWxpemVkXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAoX211dGF0b3IudXJsICYmIF9tdXRhdG9yLnVybCAhPSB0aGlzLnVybC50b1N0cmluZygpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZChfbXV0YXRvci51cmwpO1xyXG4gICAgICAvLyBleGNlcHQgdXJsIGZyb20gbXV0YXRvciBmb3IgZnVydGhlciBwcm9jZXNzaW5nXHJcbiAgICAgIGRlbGV0ZSAoX211dGF0b3IudXJsKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICAvLyBUT0RPOiBleGFtaW5lIG5lY2Vzc2l0eSB0byByZWNvbnN0cnVjdCwgaWYgbXV0YXRvciBpcyBrZXB0IGJ5IGNhbGxlclxyXG4gICAgICAvLyBfbXV0YXRvci51cmwgPSB0aGlzLnVybDsgXHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGEgY2FudmFzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRleHR1cmVCYXNlNjQgZXh0ZW5kcyBUZXh0dXJlIHtcclxuICAgIHB1YmxpYyBpbWFnZTogSFRNTEltYWdlRWxlbWVudCA9IG5ldyBJbWFnZSgpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nLCBfYmFzZTY0OiBzdHJpbmcsIF9taXBtYXA6IE1JUE1BUCA9IE1JUE1BUC5DUklTUCwgX3dyYXA6IFdSQVAgPSBXUkFQLlJFUEVBVCwgX3dpZHRoPzogbnVtYmVyLCBfaGVpZ2h0PzogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lKTtcclxuICAgICAgdGhpcy5pbWFnZS5zcmMgPSBfYmFzZTY0O1xyXG4gICAgICB0aGlzLm1pcG1hcCA9IF9taXBtYXA7XHJcbiAgICAgIHRoaXMud3JhcCA9IF93cmFwO1xyXG4gICAgICBpZiAoX3dpZHRoKVxyXG4gICAgICAgIHRoaXMuaW1hZ2Uud2lkdGggPSBfd2lkdGg7XHJcbiAgICAgIGlmIChfaGVpZ2h0KVxyXG4gICAgICAgIHRoaXMuaW1hZ2UuaGVpZ2h0ID0gX2hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRleEltYWdlU291cmNlKCk6IEltYWdlU291cmNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW1hZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGEgY2FudmFzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRleHR1cmVDYW52YXMgZXh0ZW5kcyBUZXh0dXJlIHtcclxuICAgIHB1YmxpYyBjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcsIF9jcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmNyYzIgPSBfY3JjMjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5jcmMyLmNhbnZhcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGEgdGV4dC4gVGV4dHVyZSB1cGF0ZXMgd2hlbiB0aGUgdGV4dCBvciBmb250IGNoYW5nZXMuIFRoZSB0ZXh0dXJlIGlzIHJlc2l6ZWQgdG8gZml0IHRoZSB0ZXh0LlxyXG4gICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUZXh0dXJlVGV4dCBleHRlbmRzIFRleHR1cmUge1xyXG4gICAgcHJvdGVjdGVkIGNyYzI6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuICAgICN0ZXh0OiBzdHJpbmc7XHJcbiAgICAjZm9udDogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nLCBfdGV4dDogc3RyaW5nID0gXCJUZXh0XCIsIF9mb250OiBzdHJpbmcgPSBcIjIwcHggbW9ub3NwYWNlXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmNyYzIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgdGhpcy50ZXh0ID0gX3RleHQ7XHJcbiAgICAgIHRoaXMuZm9udCA9IF9mb250O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdGV4dChfdGV4dDogc3RyaW5nKSB7XHJcbiAgICAgIHRoaXMuI3RleHQgPSBfdGV4dDtcclxuICAgICAgdGhpcy50ZXh0dXJlRGlydHkgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGZvbnQoX2ZvbnQ6IHN0cmluZykge1xyXG4gICAgICB0aGlzLiNmb250ID0gX2ZvbnQ7XHJcbiAgICAgIGRvY3VtZW50LmZvbnRzLmxvYWQodGhpcy4jZm9udClcclxuICAgICAgICAuY2F0Y2goKF9lcnJvcikgPT4gRGVidWcuZXJyb3IoYCR7VGV4dHVyZVRleHQubmFtZX06ICR7X2Vycm9yfWApKVxyXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMudGV4dHVyZURpcnR5ID0gdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBmb250KCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNmb250O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5jYW52YXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5jYW52YXMud2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLmhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGhhc1RyYW5zcGFyZW5jeSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgY2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3JjMi5jYW52YXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVzZVJlbmRlckRhdGEoX3RleHR1cmVVbml0PzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLnRleHR1cmVEaXJ0eSkge1xyXG4gICAgICAgIHRoaXMuY3JjMi5mb250ID0gdGhpcy5mb250O1xyXG5cclxuICAgICAgICBsZXQgbWV0cmljczogVGV4dE1ldHJpY3MgPSB0aGlzLmNyYzIubWVhc3VyZVRleHQodGhpcy50ZXh0KTtcclxuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IG1ldHJpY3Mud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gbWV0cmljcy5mb250Qm91bmRpbmdCb3hBc2NlbnQgKyBtZXRyaWNzLmZvbnRCb3VuZGluZ0JveERlc2NlbnQ7XHJcblxyXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gd2lkdGggKyB0aGlzLmNyYzIubWVhc3VyZVRleHQoXCIgIFwiKS53aWR0aDtcclxuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiAxLjE7IC8vIHBhZGRpbmcsIG90aGVyd2lzZSBvbiBzb21lIGdseXBocyBtaWdodCBnZXQgY3V0IG9mZlxyXG4gICAgICAgIGlmICh0aGlzLmNhbnZhcy53aWR0aCA9PSAwKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNyYzIuZm9udCA9IHRoaXMuZm9udDsgLy8gVE9ETzogd2FpdCBmb3IgZm9udCB0byBiZSBsb2FkZWQgdXNpbmcgZG9jdW1lbnQuZm9udHNcclxuICAgICAgICB0aGlzLmNyYzIudGV4dEFsaWduID0gXCJjZW50ZXJcIjtcclxuICAgICAgICB0aGlzLmNyYzIudGV4dEJhc2VsaW5lID0gXCJtaWRkbGVcIjtcclxuICAgICAgICB0aGlzLmNyYzIuZmlsbFN0eWxlID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgIHRoaXMuY3JjMi5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5jcmMyLmZpbGxUZXh0KHRoaXMuI3RleHQsIHRoaXMuY2FudmFzLndpZHRoIC8gMiwgdGhpcy5jYW52YXMuaGVpZ2h0IC8gMik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN1cGVyLnVzZVJlbmRlckRhdGEoX3RleHR1cmVVbml0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKCksXHJcbiAgICAgICAgdGV4dDogdGhpcy50ZXh0LFxyXG4gICAgICAgIGZvbnQ6IHRoaXMuZm9udFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgdGhpcy50ZXh0ID0gX3NlcmlhbGl6YXRpb24udGV4dDtcclxuICAgICAgdGhpcy5mb250ID0gX3NlcmlhbGl6YXRpb24uZm9udDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoX2V4dGVuZGFibGU/OiBib29sZWFuKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgbXV0YXRvci50ZXh0ID0gdGhpcy50ZXh0O1xyXG4gICAgICBtdXRhdG9yLmZvbnQgPSB0aGlzLmZvbnQ7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGV4dHVyZSBjcmVhdGVkIGZyb20gYSBGVURHRS1Ta2V0Y2hcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZVNrZXRjaCBleHRlbmRzIFRleHR1cmVDYW52YXMge1xyXG4gICAgcHVibGljIGdldCB0ZXhJbWFnZVNvdXJjZSgpOiBJbWFnZVNvdXJjZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBUZXh0dXJlIGNyZWF0ZWQgZnJvbSBhbiBIVE1MLXBhZ2VcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZUhUTUwgZXh0ZW5kcyBUZXh0dXJlQ2FudmFzIHtcclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZURlZmF1bHQgZXh0ZW5kcyBUZXh0dXJlQmFzZTY0IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgY29sb3I6IFRleHR1cmVCYXNlNjQgPSBuZXcgVGV4dHVyZURlZmF1bHQoXCJUZXh0dXJlRGVmYXVsdFwiLCBUZXh0dXJlRGVmYXVsdC5nZXRDb2xvcigpLCBNSVBNQVAuTUVESVVNKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgbm9ybWFsOiBUZXh0dXJlQmFzZTY0ID0gbmV3IFRleHR1cmVEZWZhdWx0KFwiVGV4dHVyZU5vcm1hbERlZmF1bHRcIiwgVGV4dHVyZURlZmF1bHQuZ2V0Tm9ybWFsKCksIE1JUE1BUC5NRURJVU0pO1xyXG4gICAgcHVibGljIHN0YXRpYyB0b29uOiBUZXh0dXJlQmFzZTY0ID0gbmV3IFRleHR1cmVEZWZhdWx0KFwiVGV4dHVyZVRvb25EZWZhdWx0XCIsIFRleHR1cmVEZWZhdWx0LmdldFRvb24oKSwgTUlQTUFQLlNNT09USCwgV1JBUC5DTEFNUCk7XHJcblxyXG4gICAgLy8gVE9ETzogbWF5YmUgbWFrZSB0aGVzZSBsYXp5XHJcbiAgICBwdWJsaWMgc3RhdGljIGljb25MaWdodDogVGV4dHVyZUJhc2U2NCA9IG5ldyBUZXh0dXJlRGVmYXVsdChcIkljb25EZWZhdWx0TGlnaHRcIiwgVGV4dHVyZURlZmF1bHQuZ2V0SWNvbkxpZ2h0KCksIE1JUE1BUC5CTFVSUlksIFdSQVAuQ0xBTVAsIDI1NiwgMjU2KTtcclxuICAgIHB1YmxpYyBzdGF0aWMgaWNvbkNhbWVyYTogVGV4dHVyZUJhc2U2NCA9IG5ldyBUZXh0dXJlRGVmYXVsdChcIkljb25EZWZhdWx0Q2FtZXJhXCIsIFRleHR1cmVEZWZhdWx0LmdldEljb25DYW1lcmEoKSwgTUlQTUFQLkJMVVJSWSwgV1JBUC5DTEFNUCwgMjU2LCAyNTYpO1xyXG4gICAgcHVibGljIHN0YXRpYyBpY29uQXVkaW86IFRleHR1cmVCYXNlNjQgPSBuZXcgVGV4dHVyZURlZmF1bHQoXCJJY29uRGVmYXVsdEF1ZGlvXCIsIFRleHR1cmVEZWZhdWx0LmdldEljb25BdWRpbygpLCBNSVBNQVAuQkxVUlJZLCBXUkFQLkNMQU1QLCAyNTYsIDI1Nik7XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIGljb25QYXJ0aWNsZXM6IFRleHR1cmVCYXNlNjQgPSBuZXcgVGV4dHVyZURlZmF1bHQoXCJJY29uRGVmYXVsdFBhcnRpY2xlXCIsIFRleHR1cmVEZWZhdWx0LmdldEljb25QYXJ0aWNsZXMoKSwgTUlQTUFQLkJMVVJSWSwgMjU2LCAyNTYpO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldENvbG9yKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBWkFBQUFHUUNBWUFBQUNBdnpiTUFBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4and2OFlRVUFBQUFKY0VoWmN3QUFEc01BQUE3REFjZHZxR1FBQURXTFNVUkJWSGhlN2QwSG5GVGx2Zi94SDl1WFpZR2w5eXJTUkpwRVVleFlzSkliYThSZTQ5OFdOY1pFYis0MWVwT0lzV3MwTml5eG0yZzBkdXdhZXdPN29xSkNBR25TdDdILzgzMDRCNGRsZHBrNVozYjN6TzduemV1ODVwd3pNOHZNczdQUGIzNVBPNjFxUEJaanJWcTE4dmZpS2ViRlIvbEZSUGxGUS9sRkUvZnl5L0Z2QVFCSUN3RUVBQkFLQVFRQUVBcDlJQkhSaGhvTjVSY041UmROU3lnLy9ZekN3a0pyM2JxMU8xNjllclhiTW9FQUVoRi93TkZRZnRGUWZ0RTA5L0xMemMyMUxsMjYyRTkrOGhNYlAzNjhWVmRYMit1dnYyN1RwMDkzUVNUcSt5ZUFSTVFmY0RTVVh6U1VYelROdGZ4eWNuS3NwS1RFQmcwYVpFY2VlYVFkZXVpaHRtTEZDdnZzczg5czNyeDU5dmpqajl2RER6OGNPUk9KSEVDcXFxcHM5dXpadG16Wk1sdTVjcVZMbGRxMWEyZDkrL1oxKzFIeEFZeUc4b3VHOG91Rzhvc21UUG5sNStkYjkrN2RiZmZkZDdkVFR6M1YxY1h2dnZ1dXZmenl5eTREa1ZXclZ0bU5OOTVvUzVZc2NjZGhoUTRnNWVYbDl1eXp6OXFNR1ROc3pabzEvdGtmS1FJcSt1Mjk5OTVXV2xycW4wMGZIOEJvS0w5b0tMOW9LTDlvMGlrL1BiWk5temEyeFJaYjJISEhIV2VUSjArMmhRc1gycE5QUG1tTEZ5LzJIN1hPZi83ekg3djExbHRkUFI1RnFBQ3lZTUVDdStlZWUxS0tYbXZYcnJYOTl0dlBSbzhlN1lKS3V2Z0FSa1A1UlJPVW56NjcraUtVbDVkbmxaV1Z0bno1OGxpOGRqNS8wVFNuOGxPVDFiNzc3bXNYWEhDQmRlN2MyVjU3N1RWNzg4MDNrNzdIYjcvOTF1NjQ0dzZycUtqd3o0U1RkZ0JSdHFIVUo0aG9DaENmZlBLSmZmWFZWNjQ5clgzNzlqWmd3QUMzQlpRdVRabzB5YmJiYmp1WFhxV0REMkEwbEY4MFFmbDE3TmpSampubUdPdlVxWk45ODgwMzlzQUREN2d2VWszOSt2bjhSZE9jeXE5cjE2NDJkZXBVMjNycnJlM1JSeDkxWDNKRWRiU2FzSXFMaTIzWXNHSHVYS1lDU05vcGdYcnZnK0NoL28vNzdydlB2Vmk5K0ovLy9PZDI5TkZIMjlDaFE5MExER2o0bU5JbEJabTQvOExRc3N5Y09kTTF4Yjc2NnF0Sm0ySkYyVWZQbmozdDE3Lyt0VTJZTU1GMjNYVlhPL2JZWTExUVFmTTFmLzU4dSttbW0xemZnZnA0NDA3MXNWNnpQc3RCOEZBOXJDLzhUejMxbE9zWHliUzBNcEFmZnZqQnJyNzY2dlVkTVVFZmlGS20vZmZmMzhyS3l0YW4rTXBHVlBqQlkvWEhxZXpqckxQT2NwM3NxZUliVERTVVgvMys4SWMvdU0rcjZFdlFUMy82VXpmc01TZzMzU3FBcUYzNW1XZWVzV3V2dmRhZGw0Y2Vlc2plZSs4OS82aHA4UG1McHI3eTA2aWxLNis4MGxYTTByOS9meHM1Y3FUN2dseFFVT0RPTmJSMHlpLzRvblBFRVVlNFk0MjBldWVkZDl4Z3BxT09Pc3AyM0hGSE53cExtaVFEK2VDRER6Ym94WC83N2JkZHhuSGdnUWRhbno1OXJHM2J0aTdiVUlEbzFxMmI2MEFQRkJVVjJYUFBQUmVMdEI5SVJuOVFMNzMwVXNvZGk3VTdKdEc4cUVONmwxMTI4WS9NdnY3NmEvdm5QLzlwZi83em4rM0JCeCswTDcvOE1sWjFtWnFxNXM2ZDZ6N0grcUtqWml2UisxRGdDeVlTWmxKYUFlU0xMNzd3OTh3Ky8veHo5OElVN2ZUTkxWbWtIREZpeEFZZDUzcTgzbFRVbm4rZ0lTakQxbEQwVkN1RjRNc1VtaS8xSjZoeldwK0pZRlBHcXFaUFZkU1hYbnFweTB3MTJpa085SmxVZHJGMDZkTDFuMk5OSm15b2pDbmxBS0lYODkxMzMvbEg1aUtkMm9QVnJwWVlKQktwT1V1akFRTHFnSHpycmJmcWJHc0dnRGhSM1RadTNMaU42cmlnY3RZWGpsZGVlY1Y5NDcvKyt1dnRqVGZlY0swelRTbDRiWTBoNVFDaWIyZEJXNkJvQ0srRzVxcG52ejdLVGdKcTJ2cjAwMC9KUUFCa0RUWC8xRmNwQi9lcEExdjlEbXJpdXZ2dXUrM2pqejl1OWxscXlnR2s5cHdQUlZrTjFkM1VzRndONncyb2owUkRJSU5PU3dDSU85Vmg2VXlHVmtCUkUvKzk5OTVyRjE5OGNTejdTeklsNVFCU095MVQ3NzBLVnUxcjlVa01NTnBYbEtidEdFQTI2ZDI3ZDUxTjlja29XS2hmV0YrV1AvendROWRmY3RWVlY3bEJHbXJOYVM1U0hzYXI0WW9hZ1JDNC9QTEwzV0pjMjI2N3JldnJxSXRXZm56aWlTZjhJN01ycnJqQ0RTM1RrTGhVMU82Y1YyZVFSbnpGeFdPUFBlYnZ4ZE5lZSszbDc4VlRVNVdmdnN6MDZ0WExUYndLTW1MTmFkS293ajMzM0hQOU9tNHFQMVVjbTIrK3VkMTIyMjF1R0h0QTQrczE4a1dkckUyRnoxODBxWmFmUnB4cUNHelVMQ0tvejNyMDZPRzZBRFE4dkw0MUE5TVp4bHNYRFV2WGNIWDFRUWZEempNMWpEZmxBS0lwOFltRnJYYStGMTU0d1VhTkdsVnZaRmF3ZU9TUlIveWpkWUZISFUzNmcweEY3UUpVbjhvdmZ2RUwvd2dJcDBPSERpNVk2RnRoRUVEVTVEQjgrSEFiUEhqd0JwbXpQb1A2STV3eVpZb2JkUk80NVpaYjNFQ1NWRC9MUUcyYTN2Q3JYLzJxempxMDJRU1Eyb0hnc3NzdWN6TWVOYW1tdmpkWk8vQmNjc2tsYm8wV1JkNVUxUDdaYWpaTG5GL1MxUFJ0TmM0U3M3ODRhcXJ5VTMvY2JydnQ1cjdRQkFGRTY3dHAzUC9Zc1dQWEQzdFUrZW1QV3hPMHpqMzNYSmRCQnpSUmRyUE5OblAzTlJVK2Y5R2tXbjZMRmkxeVEyTXpTYXZrYW9TWHZyVFVwZGtFRU0wNFYyZFFRRE0wbFlFb0VOVDNKaFZrTkkxZTFQZWhBS0kzb1c5NXFjaEVBVGFrRkl1dnlWQis5VXVjaWY3M3YvL2RyWlJ3MEVFSHJSOWRxUEpUUDUrYUcxUVpYblBOTmU2OHFBbHJ6cHc1L2xIVDRQTVhUYXJscCtaNjFWdGh5MXVmSWRWL1dxMWp6Smd4dHVXV1c3b3ZNWnVTaWZKcnlBQ1NjcTlRN1lrb210V29QN3hORldqaWtOMWdPWlBFNWdHZ0tTWDIzNmt2UTBQVkV6L1QrZ1BXOEhObEplbDBvcUo1MFVXWTFOK1ZqcUR5VngrSGdvYVdXRC90dE5OY3MyY3F3U01icFB3WFVYc1ltMmFWYThHdVRSVnE0aUprV3ZwQlAyZFRJN2VBeHBMWWdha0FvaEV5aWFNRTlZMVJGK1pSODFWY1podWpjZWxMaFFKSU90bUFIanR3NEVDM3pKUDZPRFNZb0NtYk9odEt5Z0VrY1Q2SDZQajc3Ny9mWUhKaE1vbnJCV2t1aVVhKzFEZHFDMmhNaVN2cXFqOURRU0x4TTYzbXJELzk2VTh1KzBoc3drWExvVGtkbTJwcENZS0xWdVpRc0ZEUU9PeXd3OXp5NmMzNUMzUEtBVVJ0d29tTGNhbWd0TFJKZlFGRVRWeGE4aVNnOW1JTndhVUpDM0doanN5QVB0TWFxcGs0NSttUGYveWphNFpWQjN2VTYwY2pPMmtxUXJMc0kyalNWTDJvenZDVFRqckpUampoQkxlL3FSVTZHb3RlZHpxWlU3cFNEaUFxck1TNUc1cUZycW42OWExcnBkbVhRUWVsYURWTGRSNXA2Qm9RQjFxbUlwRkd4R2craUJiTDB3U3dwNTkrZW4zd1VJZGpwa2ZpSU43MEpYbjI3Tm5yTTVDZ1FsWXJpaGFMMVdLeVo1OTl0cnRnWHVLeVRVMUJyMHRkQzVyMHFDL3F3YWFtczJSemxkU3ZyZnYwZUhXd2g1RnlBSkVoUTRiNGUrdUdRZW9DVVhVdEhLWUMxeUpqQWYwUzFMNDhmdno0MkVSblFKL2piYmJaeGo5YTkwVkovWGIvK01jLzNGVUhQL3JvSS9kWjFxSjV0OTkrZTFaY1dBaVpvZjVkamI1S3BDL1J1dGI0T2VlYzQyNTEzSkRmOE5PaFRFaVh0TDN6emp2ZG5LWmd1K0dHRzJ5SEhYYlk0SFVHQ1lFV2dOVGp6ei8vZkxmd2JicnZKYTBBb2prZmlmMFhta1NvSWJxMVUzdjl3V21KWXcwVkMyanVoeDZ2U1ZjMFlTRk9KazZjNkVaYUpjdW1WWWtvRzlId1hWM0xSa01pQXl6SjA3eHAzVDcxODJyU3FUNGp2L3psTCszd3d3OTNyU2h4ck1QVXNxTTZWdjNUR3E2clMyZG8vcDRtYm1zVkVWMTZQS0Jnb1N0cnFwVkkxM2xTUDgzSko1K2M5cW9LYVYyUlVQU0NGSldEU0tVbUtuVSticlhWVmk0Q3FxTmNMejV4NlhjZGF3eTlKaDhxNVV2blJjWWx1dGNsemVKcmRKUmZhblQxT2EyZ3FtOXNDZ3o2b3FTTVdYOTB3ZVZCZFU3emw5Uk1vTTkzVTg4QkVUNS8wZFJYZnJwUDlaa0NTRk5KcC94VXJ5b3Iwa1RyNE1xRDZkSThQV1hicVVvN2dJald2bGRrVHVYTmFRU0RMdjI1eHg1N3VGbS9hbTlMcDFDb0FLT2gvRktuSUtMaG1sbzlZZGFzV2E2NVNrdjJKTDVHcGY0cVU1MUxkMTVBUStEekYwMXpLejk5dVRuNDRJUGRhRmYxMmFYei9qUmlWczFkNlFnVlFOVHZvV3dpU08rU1VXZWovaEMxQ0prV1hOVGpOV3M5M1NGdGZBQ2pvZnpTcHlaWlpkWUtFSm9IRW1kOC9xSnBidVdueHlzVFVYTlc3VGxObTZLeVNMYzhRZ1VRMGJleko1OTgwaTBvcHpSUHpWZDY4Zm9XcDBpbUZGL1hSVC9ra0VQY29uVWF0UlZtL2djZndHZ292MmdvdjJnb3YyamlYbjZoQTRqb201cUNoWWJ6NmtxRFN2ODFMMFNUc3pSOFRCMDY2blRVU0pkZ3pIUzYrQUJHUS9sRlEvbEZRL2xGMDZ3RFNFRHB2dHJiRkR6MDQ5Uk1wVkVLV2lZaWFnSHdBWXlHOG91RzhvdUc4b3NtN3VXWGtRRFNrUGdBUmtQNVJVUDVSVVA1UlJQMzhndlhyZ1FBYVBFSUlBQ0FVQWdnQUlCUTFNQVc3MGJBZGE4UklZMGRPemJ1djk5WWUrdnR0LzA5aE5FcTVuME1jUmYzMGlNREFRQ0VRZ0FCQUlSQ0FBRUFoRUlBQVFDRVFnQUJBSVJDQUFFQWhKS1JBS0tyRE9wS1hWdHZ2YlYvQmdEUTNHVWtnT2h5b0FNSERneDlZWFlBUVBhaENRc0FFRXBHQWtqY1Y3UUVBR1FlR1FnQUlCUUNDQUFnRkFJSUFDQ1VqQWFRdUY4OUN3Q1FPV1FnQUlCUUNDQUFnRkF5RWtBWXhnc0FMUThaQ0FBZ0ZBSUlBQ0NVakFZUVJtRUJRTXRCQmdJQUNJVUFBZ0FJaFFBQ0FBZ2xJd0dFWWJ3QTBQS1FnUUFBUWlHQUFBQkN5V2dBWVJndkFMUWNaQ0FBZ0ZBSUlBQ0FVQWdnQUlCUU1oSkFHTVlMQUMwUEdRZ0FJQlFDQ0FBZ2xJd0dFSWJ4QWtETFFRWUNBQWlGQUFJQUNJVUFBZ0FJSlNNQmhHRzhBTkR5a0lFQUFFTEpVZllRZFpzMmJacjdZVWNkZFZUUys2TnNBTkJTYVdScm5MZU1aQ0Q2UVFDQWxvVW1MQUJBS0FRUUFFQW9HUTBnOUZrQVFNdEJCZ0lBQ0lVQUFnQUloUUFDQUFnbEl3R0VZYndBMFBLUWdRQUFRaUdBQUFCQ3lXZ0FZUmd2QUxRY1pDQUFnRkFJSUFDQVVBZ2dBSUJRTWhKQUdNWUxBQzBQR1FnQUlCUUNDQUFnbEl3R0VJYnhBa0RMUVFZQ0FBaUZBQUlBQ0lVQUFnQUlKU01CaEdHOEFORHlrSUVBQUVJaGdBQUFRc2xvQUdFWUx3QzBIR1FnQUlCUUNDQUFnRkF5RWtBWWhRVUFMUThaQ0FBZ0ZBSUlBQ0FVQWdnQUlKU01CaENHOFFKQXkwRUdBZ0FJaFFBQ0FBZ2xJd0dFWWJ3QTBQS1FnUUFBUWlHQUFBQkNJWUFBQUVMSmFBQmhHQzhBdEJ6cS9ZNWM2dzhiTnN3T091Z2crL0RERCszKysrLzN6MmFHRjVSMjluY1J3b2tubnZpY3Y0c1FidmpyRGY0ZXdxaHB4WmZLU0dKZWZEUmhBUUJDeVVnQUNacXVHTTRMQUMwSEdRZ0FJQlFDQ0FBZ0ZBSUlBQ0FVQWdnQUlCUUNDQUFnRkFJSUFDQ1VqQVFRaHZFQ1FNdERCZ0lBQ0lVQUFnQUloUUFDQUFpRkFBSUFDSVVBQWdBSWhRQUNBQWdsSXdHRVlid0EwUEtRZ1FBQVFpR0FBQUJDSVlBQUFFSWhnQUFBUWlHQUFBQkNJWUFBQUVMSlNBQmhHQzhBdER4a0lBQ0FVQWdnQUlCUUNDQUFnRkFJSUFDQVVBZ2dBSUJRTWhKQUdJVUZBQzBQR1FnQUlCUUNDQUFnRkFJSUFDQVVBZ2dBSUJRQ0NBQWdGQUlJQUNDVWpBUVFodkVDUU10REJnSUFDSVVBQWdBSWhRQUNBQWdsUi8wWFViZkhIMy9jL2JBOTk5d3o2ZjFSTmdCb3FkU3ZIT2VOREFRQUVBb0JCQUFRQ2dFRUFCQUtBUVFBRUFvQkJBQVFDZ0VFQUJCS1JnS0lobk1KdzI0Qm9PVWdBd0VBaEVJQUFRQ0VRZ0FCQUlSQ0FBRUFoRUlBQVFDRWtwRUF3aWdzQUdoNXlFQUFBS0VRUUFBQW9SQkFBQUNoRUVBQUFLRVFRQUFBb1JCQUFBQ2haQ1NBTUl3WEFGb2VNaEFBUUNnRUVBQkFLQVFRQUVBb0JCQUFRQ2dFRUFCQUtBUVFBRUFvR1FrZ0RPTUZnSmFIREFRQUVFcEdBa2h1YnE2N3JhNnVkcmNBZ09ZdjVRQ3lZc1VLdStPT08rekdHMiswZSs2NXg1WXZYKzdmVTc4MzNuakRwazJiWmpmZmZMTjkvUEhIL2xrQVFMWkxPWUFveTVnOWU3Yk5uVHZYUHYzMFU3dnd3Z3Z0ODg4L3Q3VnIxL3FQMkpneWttZWZmZGErK2VZYisrNjc3K3lxcTY3eTd3RUFaTHVVQTBoeGNiSDE3OS9mUHpKYnZYcTEzWC8vL1M0ekNRU2Q2WUV2dnZqQ3lzdkwzYjZDeWNNUFArejJBUURaTDYwK2tGR2pSdmw3WnAwNmRiTG5ubnV1M3Fhc21UTm4rbnRtWDM3NXBTMWJ0c3cvQWdCa3U3UUN5T0RCZzlkM21JdjJQL3ZzTTZ1cXF2TFAvRWpubElFRVB2cm9JeHMzYnB4L0JBRElkbWtGa0x5OFBCc3laSWgvdEM2Z1BQUE1NN1pxMVNyL3pJL1VQeEkwWDFWVVZMaGdNbW5TSkhjTUFNaCthUVVRR1RObWpMOW4xcUZEQjN2dHRkZldCNURFUHBBUFAvelEzelBYNlY1UVVHQVRKMDcwendBQXNsM2FBYVJmdjM1V1dGam9INW5ibnpWcmx1c2tWNUNReXNwSzE3UVZVRERaZnZ2dHJVZVBIdjRaQUVDMlN6dUE1T1RrMkpaYmJ1a2ZtV3ZTZXZIRkYxMmZoNXE0Uk1GRFFVUTBTa3ZEZVBmZWUyOHJMUzExNXdBQTJTL3RBQ0pqeDQ3MTk4emF0bTFyTTJiTWNQTkIyclJwNDg0bE5sK3A4N3lzck15MjIyNDdOeFFZQU5BOHFOTWlyUlVRMjdkdmI2ZWNjb29MSEVIZng1dHZ2bW05ZXZXeW5YYmF5WGJmZlhlNzdycnIxby9NdXVHR0cyeisvUG1obHptcHFhbTV3TjlGQ0Y3NS80Ky9peEJPUFBFRWZ3OWgxTlJzT0RjTTZZcjNBclZwWnlCcWtwbytmYm9OSHo3Y1AyTTJkT2hRTjB1OVQ1OCticjVIRUR5Ky8vNTdOM09kTmJJQW9QbEpPNEFvT0doWmtzUWxUTlIwdFdUSkVtdlhycDBiY1JYUVJNTGFzOU1CQU0xRHFENFF6U2gvNnFtbjNHejBRUGZ1M2UyRER6NndyNy8rMmgzcjJpRHFHd0VBTkUraEFvaWFzVFR5YXRDZ1FmNFpzODAzMzl5dHZCczBYNmxKYStuU3BWeGtDZ0NhcVZBQlJNMVhDeFlzc0lVTEY2NXZvbXJkdXJYbDUrZTdmVkUya3Jqc0NRQ2dlUWtWUUNSb3h1clpzNmQvWnQyS3ZhSXNSRU41eVQ0QW9Qa0tIVUEwaEZmTldJbXowZ09hU0tqbDN1dTdWZ2dBSUx1RkRpREtMdFRQY2RGRkY3bkZFb05nb2Y0UjlZVm94bm95ZFowSEFHU1h0Q2NTMXFaK2poRWpScmlBb2lHOGE5YXM4ZTlKVG85UFoxNkk5M09aU0JnQkV3bWpZU0poTkV3a2pLcVpUU1NzVGNGQW82MDBBMzJmZmZieHo5YU5TWVVBMER5a0ZFRFV6NkhPY2kxWDByVnIxL1dMSmdZVUZFcEtTdHhFd29DYXFyVGN1NTZqVlhnMVNnc0EwSHlrRkVCMFlhZzVjK2E0R2VoYTF5cVk2MUVmOVlrc1hyellQVWZMbVNTNzZCUUFJSHZSb3cwQUNDVWpBWVQ1SGdEUThwQ0JBQUJDSVlBQUFFSWhnQUFBUXNsb0FPSGFId0RRY3BDQkFBQkNJWUFBQUVMSlNBQmhHQzhBdER4a0lBQ0FVQWdnQUlCUUNDQUFnRkF5R2tBWXhnc0FMUWNaQ0FBZ0ZBSUlBQ0NVakFRUWh2RUNRTXREQmdJQUNJVUFBZ0FJaFFBQ0FBZ2xvd0dFWWJ3QTBIS1FnUUFBUWlHQUFBQkN5VWdBWVJndkFMUThaQ0FBZ0ZBSUlBQ0FVRExhaE1Vb0xBQm9PY2hBQUFDaDVDaDdpTHE5ODg0NzdvZU5IajA2NmYxUk5nQm9xZFNxRStlTkRBUUFFRXBHQW9naWtaQXhBRURMUVFZQ0FBaUZBQUlBQ0lVQUFnQUloUUFDQUFpRkFBSUFDSVVBQWdBSUpTTUJoR0c4QU5EeWtJRUFBRUloZ0FBQVFpR0FBQUJDSVlBQUFFSWhnQUFBUWlHQUFBQkN5VWdBWVJndkFMUThaQ0FBZ0ZBSUlBQ0FVQWdnQUlCUUNDQUFnRkFJSUFDQVVESVNRQmlGQlFBdER4a0lBQ0FVQWdnQUlCUUNDQUFnbEl6MmdRQUFXZzR5RUFCQUtBUVFBRUFvR1EwZ0RPTUZnSmFEREFRQUVBb0JCQUFRQ2dFRUFCQktSZ0lJdzNnQm9PVWhBd0VBaEVJQUFRQ0VrdEVBd2pCZUFHZzV5RUFBQUtFUVFBQUFvV1FrZ0RBS0N3QmFIdFg4a1RzdU9uYnNhS2VlZXFvdFdyVElycjc2YXY5c1p0VFUxTHpnN3lLRXQ5OStlMGQvRnlHTUhUdlczMXVuOXBlbDJ2MStUWDEvYmJVZlgxdERQeC9ORzAxWUFJQlFDQ0FBV2h4bFRtNWJ1M2I5UHRLWGtRQkM0UU9JTTlWUlZaV1Z0bURlZDNiam44Nnh2WVlVZUZ1KzdUWFV2L1cyc3cvYnlUNTY5MVdycUNpM3RWNWd3YWFSZ1FEMVVCOUE0aFo4V3cyMnByNGZkVk1RV0xKb2diM3k5RU4yMGo0amJkOHRpdTNJSGZ2WlA2WmQ1dDI3Y2RsOStOYkxkdFloMjl2K0kwcnNvSzI3MkQ5dnY4WVd6WjlyMWRWVi9pTlFHd0VFUUxPaG9QSDE1eC9hdlgrOTJBV0JuMi9id3k0NjVRRDc1b3VQL0Vla1p1V3lwWGI5LzUxaFUzYm9ZejhiMjlGdW52b2JtL1h4ZTE0d3FmWWZBY2xvRTVhK0lRRkFZMUkveGdkZTluRG5OUmZaejhhVTJTKzhiT1BXeTg1elFTQVR5bGV2dEFkdXZzUk9tYnlWKy9sL3UvcjM5c0diTC9uM3RteGtJQUN5UnRCMHQzWnR0YzE4ODBXYmR1bDV0dCtJRXZ2VllUdDVGZnYvMmhxdnNtOUk1V3RXZVlIcTkvYXJLVHZidnQ3L2UrYzFGOXBuTTk5eW1VOUxiRkpVeWhENVhaZVZsZG5wcDU5dWl4Y3Z0cXV1dXNvL214bmVMNFY1SUJFd0R5U2F1TThEMlpUYXo2OXRVeit2b1orZkt2MmM2cW9xbS8zRlJ6Yjl3ZHZ0eVFlbTJlcVZ5L3g3bTE1WnAyNjI2K1REYmU5RFQ3RE8zWHRiVGs1dTJyK3JiRVFHQWlDV2dxQXg1K3ZQN2RvTFRyVmpkeDlpcDB3ZWF3L2RkbVdzZ29jc1dUalBIcmpwRWp0NjEwRjIrcysyc1R1dnZjZ1dmei9QMWxaWFp5eUl4aEVCQkVDc3FLUDZoeVVMN2I0YnB0cnBCNHkzNC9ZWWFvL2VmYjB0bUR2YmYwUzhxYlA5enFzdnNDTjI2bWZuSHJXN1BmK3ZlMnpsOGgrYVpTQWhnQUNJaFZVcmx0a0xqOTFuWngyNmcwM1p2cmZyQ0ovMThidit2UTBuSjZlVjVlWGx1dmI4VEZMMk5QT05GMnpxMlllN3pPU0NYMHkyVDk5L3c4clhyUFlma2YxVVpwSERJbjBnOFVVZlNEUmJiYldWdjdkTzdXK1I2ZlpaTlBUOXRkVitmRzFOL1h6TnNWZ3c1eHU3NjlxTDdNMFhIbk9aUjBNb0xDaXdmbjE3MkU0VHhsbEpTWkU3cDVkZVhGeHNuVHVWV1Y1dXJwVlhWTmlzcjc2MUJ4NmFidk1YTEhLUHlUU1ZsL3BJZHZ1dm8yM1BnNDZ4amwxNmJMSU00MHl2dlA3ZmNBcmF0Mjl2WjV4eGhpMVpzc1N1dlBKSy8yeG1lQjlBQWtnRUJKQm9DQ0FOOC96S2luSTM5UGE2QzArM09iTS9kMzBGRGFWM3o2NzIyN09QZDRGaVU2OVgxSVEyNDhQUDdmSnI3N0NWS3hzdVc4Z3ZLTFMrZzRiYktmOTdyVzAyYkxUbDV1WDU5MlFQbXJBQU5DcjFaUnl6MjJENzdkRjcyTGRmZnRLZ3dTTS9QOC9PK2VVeDFxVnpoNVNDaCtSNjJjaW9FWVB0N0ZPUDlNODBEQVhSTHo1OHg4NDRjRnM3WXVmKzl2RjdyL24zWkE4Q0NJQkdOZlBaaDJ6TjkzUDhvNGJWeXZ0WFZWVzF5VXlxTmdXYkZTdFgrVWNOcmNiV0xKcG5qMTc1Ry84NGV4QkFnSHFvNGtuY1ZMRWtibkc3di9aVysvRzF0MlRQU2R5U1BTZHhTL2FjeEMyWlpRdm5XWTgyaGRhM3BNQ0tjMVBMQ3NLcXFLeTBzMzU3cWQxMjF5UDIzc3hQYmVrUHl6ZTVVS0plOThMRlMrM08reDcxenpRY3ZmOStKZm5XeXlzUFZjWjFsVmxjNmJjWCtSWFRCeEpmOUlGRXd3V2xvajAvbVFjdU9jdGV1dit2L3BIWm1xcHFXN2lteWxaVnAvK3p3aWd1S3JSUld3NjJ6cDA2V052U0Vpc295SGZuU2xvWHU4NXpCWnIzUC9qTWYzVERLTWxyWlowSzg2d3dMOWMvWTlacnlHZzc2OVlYTENjbmU3N1hrNEVBYUZSVmxSWCszanBGWGlXcWIrQjl2Vy9pcFY3RjJ0QldyeW0zVjkrWVlROC85cno5N2Q1SDdaWTdIckpyYjd6WHBsNTVxOTEyOXlNTkdqemE1dWRZdnpZRjFyT2tjSVBnSVRWYTlUZEVRRzVLQkJBQWphcTZzdExmMjVBcTFPNWV4ZHJmcTJBN0ZHeFl1V1l6aGNST2hiazJvTFRBdXJVdXNJTGM1Tld1Um4rRnllaWFVa1lEeUtiU1hTRGI2RE9kdU9rUFBIRnI2dnV6VWUwTXBMWjhyNEx0V0pSbkEwc0xyWXQzbTYwVUFyc1ZlKytqYmFHVkZlWlozaWFhcHJKeDJSTXlFQUNOcXJxcS9nQWlDcGE1T2Eyc3ZWZnhidVpWd0QxYjUxdCtsbncvTGZaZWQrL1dlVGJBZTkxdEMvSXN4dy8rbTFLelZzT1pDU0FBVUtkV3JkS3JkbFFCbCtUbldqOHZJMUgvUVp1OEhOY3NGQ2Q2UjJYNU9kYS90TUI2ZTYrek9EOHZwYUN4Z1N4c3dNbElBTW5XVkJwQTQ4dk56L2YzMHFNS1dmMEgzYjFzUkJWMXA0SmNhNFErOTNvVmVEVm85K0k4Ny9VVVd1ZldCWllmWVFSVnVvRTFEckx2RlFPTktMRy9RWnNxc2NTdHFlL2YxRmI3K2JXM1pNOUozSkk5SjNGTDlwekVMWm5jdkhBQkpLQ2ZxLzZFc3FJOGw1WDA5Z0pLNjF6di8vUHZiMmlxTk50NldaQTYrL3UyS2JUU2dqelgzQlpWSys5bjFGVm1jVVVBQWRDb29nYVFnQ3BiTlc4VjUrZGF6NUlDZi9SV1RvUDFsUlI1Rlh4WEwyZ3ArK21xUGhrdkc4cGtoYjh1QXlHQUFFQ2RrZ1dRYmoyNjJlbm5uVzdIbjM2Y2pkbDZ0QlVVRlBqM3BNWmxKVzcwVnI2WEZSUllMNitDYjVNWFBTdFJFMWw3THlpcDc2VzN0N1V0eVBXeWpjd0dqb0FMSU5rVlB6SWJRTEl0L1FMUStKTDFnUnh3K00rOElOTFZCbXcrd05zL3dNNmZlcDV0dit2Mi9yMnBjMW1KVjhHMzlyS1M3cTBMM055TExrVzVWcFRta2ltYThLY2dwTURSMlF0SzZudlJ6MjdJT3E2VkFoTVpDTkI4QkpWR3NHMnFENkN4Nzg5R3lUS1E3ajI3KzN2cnlqemZDektUZnJxbi9mellRLzJ6NmRQUFViYlF2akRmZXZ0TlhKclFwNDd2Wk5wNVFhTmJVWjV0NWsvNFV4QlNNTkxQaWFwenQ4NjI1K1E5WFlDc1N5YituOFpHQUFIUXFKSUZrRVVMTjc2QWt5clVMVVp2WVdQSGI3Z2VXUmd1S0hsWlJBY3ZtK2hYV21RRHZTRFJvempmdW5tYk91RVZOTHA2UWFOdFlWN0cxNkthZk1oa08rTzhNMnpIM1hhd1kwODl4cjJuWkZybDVHWmRFTWxJU1dYck55RUFqUzlaQVBsazVpZiszb1pVb1U3Y2ExZi9LSE9VbWJRcHlIVjlHdXFFYjRnRkRQUHk4dXlZVTQ2Mm4wd1k1LzM4ZFlGQi84OUJSeDdvN3F2TlhWQ3FKUVlRQUVoVnNnRHl6T1BQdXJXZ2ttbFgxczdhbExieGo3SkRVWEdSbmZrL3Y3UkJRd2R0bEZXb2VhNW4zNTcrVWFKMXpaVFpoQUFDMUtOMm40UCt3Qk8zdU4xZmU2djkrTnBic3Vja2JzbWVrN2dsZTA3aWxreE9rZ0JTdnFiYzNuemxyYVRQMGYvVHRuMWIveWc3SEhiOFlWYldvY3cvMnBEZTQvSWZsdnRIMlkwQUFxQlJGUlMxOXZjMjlNOTcvMm16WjgzZUtJam9lRldqWFIwd09tVkxBd2ZWM1ZtK2N2bEtXN3h3c1grVTNUTGFCNkp2Q2dCUW42S1NVbjl2WTMrOS9BYWIvdWgwVzdsaTVmcDZaZmFYMzlqU3hVdmRmallZc3NWZ042czhHVjBOOFpFSC91VWZaVDh5RUFDTnFxaWsvdWFvWng5L3ppNzY5Zi9aZjUvK08vdmRMLy9IL25yWmoxY3ZqRDB2Ym96NnlTai9ZR1BQUGZHOHpYaDdobitVL1FnZ1FEMFMyL3UxNlZ0eDR0YlU5MmVqMGxhcnJYMUJsYmRYLzdYSjFhbGVXWkg4NGxOeGxadVR1OEdjbG9CK1Y3Ty9uTzJ5cTQydHRUS3ZQSWEzTC9lUHN3Y0JCRUNqcWx3NjE2c3NLMjE0dXdvcnpNbSthMkRVcDNwdHRjMzVkcTUvdEM1d3FObnFxVWVldHVzdnJaMUoxVmhwWHJXTjlBTEhNSzg4Y2x0bFh6a1FRQUEwcXZKbDZ5WU50aStzc1RFZEsyeEFTWVhsdW15a0dRUVM3eTFvTU1DeUg1YTV3TEZ3L2tLYmR1MnQ5dnlUei9zUGtCb3I4Z0xuMExibE5xS3N3dHFrdCt4WHJCQkFBRFNxdFFtWHRGVmZjL2VTdGJaVnAzTHIwN3JTV2pXRFFMSm93U0s3NUhlWDJNWC9QZFV1dStoeSsrS1RML3g3YWl5LzFWb2JWRnBob3p0VVdJY2lOVkg2ZC9teXJWa3lKMmhMamJMTm1UUEgvYkFlUFhva3ZUL0tCalNsNERPWStGbFVYMFJ3MjlUM0I3U2Y3RmpQUzN4dTdlTkFRejAvbWJYVkcxL1NOcy83S3R1N1RiVnQxYkhjdWhWVmVZRms0LzhqbTFSVlZkdXlwY3U4QXROUmpaZGgxZGlBTmhVMjFudC9YWXJYV3JLSjd6VmV4dUkvWWIyZ0hPTzZaU1FEMFE4Q21pTjl0bFZoeHZVMkc2MnRxcnRqdkNEWGJHRGJLdThiK2hwcmw2ZU85dXdPSkRuZTYrL3RaVlpqTzY2eGJsN2d5SzJueGwxYldlNEhrZXhCRXhaUWoxUXE4YWE4RFRZZEo1Nkx5M0V5TlFsTldIVXB6ak1iWGxacG84dldXRWx1OW5XMGV5VmdYUXZYQlk3ZUpkV1c3d1ZHcjFqcVZiUFdlNTkxbEZsY0VVQ0FlZ1NWWVZ4dnM5SGE2dFNHNW5wdjBWcm5tNDNzVUdGanZJeEVIYzk1K1huV3FVc242OUNwZy8rb09OSHZvOGJhNTFmWk9DOXdLSk5TUnFYM2tZcWFtdXpLUGlTakFTUmJQOUJBWGVxcnZPTnlHK3pIOFRpWitwcXdrdEdQVVVhaUVWdG4vdW80Ty9OM3Y3U3ovL2NzTy9hMFk5TytjbUhEcWJFMmVkVzJkYWMxYmtodUtobEhiV3ErOGtyUFA4b09aQ0JBUFlKS01hNjMyV2h0MWFhYnNKSnBYZGJCeW5yMmNlOWQyMmFEQjlxdkx6ckhpbG9YK1k5b0NtdmRYSTZ4WG9ZMHNrT2xHd3pndmJSd2FtakNBcHFWVkNyeHByd05OaDBubm92TGNUS3BObUhWVnJscXBadGJrYWgxU1dzNzRvVEQvYVBHRkV3Q3JMQXRPMVJZMGNhWDkwaGJ0bldnQ3dFRXFFZFFHY2IxTmh1bDI0UVZxS29vdHprejN2S1BmdFM1WTZrTmJSZDB0amUwR211YlgyVmJ0bC9qQWtlYmdzejlEbHdBeWJMZktRRUVxRWNxbFhoVDN3YjdjVHhPcGlaa0JpSXpIcm5YbHMzL2Nha1FaU1R2UFhTWGRTaXNjWjN0dzd4QTBycUJBb21HRlk5b1gyNWJ0SyswMGdicGVzbStMd1FwQlpBMWE5Yll5cFVyL2FQd0ZpMWFWT2RWeDRBNENpckZ1TjVtbzV5ODhMV3Z2cVgvZTlyVk52L3pqNnhpeldwNysvNWJiZW0zWDduN3ZDS3hNaStRak5vZ2tFUXRJelZWcmNzNE5LeTRyWmR4NlA5cENMb21lb1A5OEFhU1VnQjU5dGxuN1lvcnJyQlhYbmxsb3piSVZLeGF0Y29lZXVnaHUrYWFhK3lUVDVKZit4aUlvMVFxOGFhOERUWWRKNTZMeTNFeU9mblJPcjJyeXRmWW0zZmRhRTlkL0Z1Yi84bE0vK3lQdlA5K2ZTQlJ4dEJtL1lURVZJUEp1c2UyZFlGRDYxVXA0OUI3VzNkdlE4bkp6WGRsbDAxU0NpQURCdzYwcXFvcW16NTl1Z3NrTDcvOHNxMVlzY0svZDkyM05LbjlnVkhHOGNRVFQ3am52UC8rKys1eC9mdjM5KzhGNGkrb0RPTjZtNDF5Q3hwbjFKUlhSQzVqMk5JTEFDUEx5cTE5ZnJXL1JFcGQ1ZWFWcTdkcEhzY283L0ZiTkZMZ0NMVEtWVTk4ZGdXUVZ0NkhjSk9mUW1VZGwxeHlpV3ZLa3VERDI2bFRKK3ZidDY4VkZSVzU3S1N3c05ER2p4OXZpeGN2dHErKytzcVdMMTl1T1RrNTd2bTYzV3l6emV6UVF3OTFQeU1OTC9pM0NPSHR0OS9lMGQ5RkNHUEhqdDJvMG83YnJXaGY0bnFjNk0yclRyQ3ZucnJaUDJvOGVpbHJxczNtcmM2MTc5ZmtXV1dOWHFNMkxYSllZNTJMcXF4YmNiVVZOVkZMVXJ2K0kyMjNLOTcwTWhIdkJmaUNjb3lybERJUVZmNWJicm1sNWZwdkxQaFFMRnk0ME41OTkxMTc5ZFZYM2JFQ3pJc3Z2bWd6Wjg1MHdVT0NKaS8xZll3Y09kTHRBOWxDZjhENnZNZjFOaHRGYmNJS3l5c3lOeUd4ZjJtMWplbFlic1BhbFZ2WG9rcDNxK04rYmFyZC9YcGNVOGoxeXFWVnNsVVdZeXpsVnp0cTFLaWtIZUFLRUVHUTBJZGErOGsrMk1wT0JnOGU3QjhCMmFHK3lqc090OEdtNDhSemNUbE9wckJ0UjMrdjZXakNuL3BKTm10YjVXNGpUUURNRk8vL1Y5bGxrNVFEU1BmdTNhMWp4L1IvOGZvUUtYTkp6R0NBYkJGVWhuRzl6VVlkTmgvbjd5RlI2ODU5L0wzc2tWYStOSHIwYVBmQlRZY2VUL01Wc2xVcWxYaFQzd2I3Y1R4T3B0dVkzYTNYOWdmNlI5bWhiYmVlMW52MDF0WjNxKzBzdHdIVzMyby9ZTFNOTysxRy95aDdwQlZBbEVYb3c1RU9QYjVkdTNiV3MyZFAvd3lRUFlKS01hNjMyU2duTjgvR24zTzNiWEg0UlY0QnAxVUZOYnFpMG5ZMjd1ZkgyNFRqejdTUit4MWlJL1krd0hiNmY3LzE3ODJNbnR2OXpIYjk4OHVXMzdyVVA1TTkwdnJ0bFphV3VtRzQrdkNtU2gzd1lUSVhJQTVTcWNTYjhqYllkSng0TGk3SGRkRmpoaDM4Rzl2cEQ4OVlibkZtSzg3ODRoSnJsWUhtY21VZE81M3lHK3M2YUppcnh3S0ZyVXN5RnZpR1Q3bkF0djMxM1kwMnREblQwaTRGQllPZzB6d1YraEFwY3dHeVVWQVp4dlUyMjNVWnNZUHRmZE5uMW1YVVJQOU1OTnNjL2d2YjQ1eUxiTkp2cDlyNG8wNnhqZ00yOSs5Smo1cXBmbkxZQ1paWFVPaWYrVkg1cXBWZXhaYitoT3BFdVVVbHR2UEZMOWp3UTg1Zk53TTlTNlVkUUlZT0hacldHdnk5ZXZXeXNySXkvd2pJTHFsVTRrMTlHK3pIOFRnVlJlMjYySTYvZjl6R25QSlgvMHc0SGZvTXNFNSt3RkRHMExIdlFOdG15a2xlRnZGYkt5aEpMOHZwUFhxOEZkYnhuTXJ5MWY1ZU9GMUdUclI5Yi8zR09nK2Y0Si9KWG1rSGtMeThQQnMrZkxqN0JlbURzaW5LV0lCc0ZWU0tjYjF0TGpUL1liTTlqN1A5N3BocmVjVnQvYlBwNlRseTQ5RmRLcWMySFR2YjFsTk9UUG1idmg0M2VPYzkzWE9US1M1dDUrK2xiOXdadDlpT0Z6NXVCVzNhKzJleVc2aUdQTTBKVVROV1hRVWNVSkFaTm15WWZ3UmtuMVFxOGFhOERUWWRKNTZMeTNHNmlzcTYydVM3RjlqUWc4L3pqdExyTjYxdmRGVGJyajFzMkc3NytVZjFLKzNhUFduVDFZL1M3ODh0N1RYRTlyMWpqdldmZUtRTGxzMUZxSGZTcDA4Zk43S3FQdm9RRFJreXhDMXpBbVNyb0RLTTYyMXpsSk9YYjF0TXVjQW0zZmlwRlhWSWZmVG0zSm52K25zYlUzbDE3TDlaU3BWM2FlZnU3dkhKVkphdnNWZHV2dHcvMnJSV3VmbXVvM3lQYTk2M292WmQvYlBOUjZnQW9zTFZ2STY2Q2xuMDRXYnVCN0pkZlpWM1hHNkQvVGdlaDZYbnR1azJ3UGErWlpZTm1IU2lmN1orUzc3NzJ0YldjN21JVkpkTFg3Rm92bnNQaWJTTS9QZGZmVzVQWC9MZnRtTGhBdjlzL1VwN0Q3VkpmLzNFaG5uWlZFNWVYcVR5aUt2UXVaU0NRKzFDVHFUTVE0c25BdGtzcUJUamV0dWM2VDNtZXRuSTJKT3Z0WWxYdkdHdHU5Vy9rbmZscWhYMjluM1Q2aXlYdk1KQ3kwbWhIK1NIT2QvWWR6UGVzdXFxU3ZlemxzejUxcDY1OHZmMit1MS84UUtVbG9hdm43S09RZnVmN21VZDczbEJzSjk3SDgxVlNxdngxdVhHRzIrMHVYTi92RHBZUUV1V2pCczN6dmJZWXcvL1RDU3N4aHNCcS9GR0UvZlZlQU02bHVCY1hJNHpxV1p0dGIxMzh6bjIrYit1TWE5Mjk4OXVyUHV3VVRaOHo4bHVFbUNpbFlzWDJndlhYV3hycXpZZEJFVExxK2NYRmxtRkY1aFMxVzdBS052NjdEdXNuWmQ5QkdVUlJTWitSa09LMUpzelpzd1lmMjlEV3JxRXVSOW9EdlFIck1vd3JyY3RpWnFnUmgzM1o1dDQ2V3ZXdHQ4Vy90bU4vZWVqOTJ6NkZiKzNMMTUrMXFvcjExMCtWMDFicy83OVhNckJRMnE4SUpWcThOQUt3eU9PL3BQdGZ1VmIxcjdQTVBmN2FRa2laU0RsNWVVMmRlclVqU1lXZHVqUXdVNDk5VlQvS0RJeWtBaklRS0xoZWlDWk9jNDBOU1Y5OXRBVk51TzI4N3lEdW9OQ2JrR2h0ZTNleThxWC8yQ3J2QXlrSVhRY3RwMXRmZVp0MW1ZVFRXeGhCT1VZVjVFeUVDM1Jyb21GaVc5UyszVmxKa0MyMGVkWmxXQmNiMXNxcmFjMStML09za2szZkd4bG00MzF6MjZzdXFMY2xzeWUxU0RCUTlkMjMrYWN1MnlYaTU5dmtPQ1JEU0lGRUttOXdLTDJSNHdZNFI4QjJTMVpwUjJuMjJEVGNlSzV1QnczSlAwL3BkMEcySzZYL3R1Mk9mY2UxM25kV0hwdGY1RHQrN2U1MW1lSGc3M1hFYmthelZxUjM3bEdXaVhPOVJnd1lJQzFiUnR1SmlrUU4wRmxHTmRick10RytrdzQwUGEvYTRIMTJla3c3MHpETmZ2a0ZaZmF4Q3Zmc3ZGZTVsSFloaVdhSWdjUXpUYlh6SFI5b0xVeDl3UE5TU3FWZUZQZkJ2dHhQRzVNQlNWdGJadXpiN2M5L2pMVDhrczcrR2N6UTgxVlkwNjV6aWJmL2IxMUdNanE0b0dNNUY3Qm5CQUZFODArQjVxTG9GS002eTAyMXE3UFVOdi96bmsyK0lCZnU0by9FcStjMnc4Y2EvdmZ2ZEFHN25HOG15V1BIMlVrZ0hUcjFzMjZkdTNxK2o3U1dha1hpTHRVS3ZHbXZBMDJIU2VlaTh0eFU5R0V3WkZIL2NIMjh3Skp4MkVUWENCSWx5NHh1OHNsTDl0dVY3eSs3aG9qSVg1R2N4ZHBHRzhpRGVuVlNyME5jTjF6aHZGR3dERGVhTGJhYXF2MUZXTmNiMFg3RXJmanVKajMzalAyOWpVbjJjcDVYL3BuNnBiWHVxMWJ2MnJ6ZlUveDNrL1RkcEFINVJsWEdTc2REZWx0Z09BQk5DbFZoUG9qanZOdHNCL0g0N2pvTm1wWG0zVDlSMTVnK0wzbEZyWHh6OWJpdmQ1K0U0KzIvZjgyendidmQ1cDMyTFRCSXh0UVFrQTlna294cnJkSW5mb3ZoaDl5bnJ2bXlLRDl6L0RQcnJQWjNpZmI1SHNXMlUvT3VNbE5Qa1JxTXRhRTFZQm93b3FBSnF4b1dBc3IybkdjVmE1ZWJuTmUvYWYxbW5DQTVjWDBtdVJCZWNZVkdRaFFELzBCcXpLTTZ5M0N5eTh1dFg2N1RJbHQ4TWdHQ20reC9oVEcvWTlFZjhoeFJ2bEZRL2xGUS9sRkUvZnlJd01CQUlSQ0FBR0FGa0RaeklvVks5eFduNHFLQ2x1NmRLbFZwYkQwUFUxWUVaRUNSMFA1UlVQNVJkT2N5dS94eHgrM045NTR3enAzN213bm4zeXlmM2Fkano3NnlKNTg4a2xidG15Wk85WWxOL2JaWngvcjMvL0hWWVJYclZwbC8vclh2K3lUVHo1eC82K21aV2lacWttVEp0VTVSWU1NQkFDeTNILys4eDk3ODgwM3JheXN6R1VRaVdiUG5tMFBQUENBOWUzYjEwNDg4VVE3L1BERDNhVHZ1KysrMjM3NDRRZi9VV2IzM1hlZmUreUJCeDVvSjUxMGtrMllNRUdqT0czNjlPbitJellXT1lBb01uWHMyTkg2OU9uak5yMEJBRURqVUxidzZLT1AyckJodzZ4WHIxNysyUis5K09LTDFxNWRPNXM4ZWJKYmRrb3Jwdi8wcHorMXlzcEtlK2VkZDl4anZ2NzZheGM4ZHQ5OWQzZU5KeTFOdGROT085bWdRWVBzcmJmZXFyTTVLM1FBVWVwWFVsSmlXMnl4aFoxenpqbDJ6ejMzMkoxMzNtbW5uSEtLUzQvaW5ob0NRSFB3L3Z2djI0SUZDMXpsWDV1dUZxdmdNSERnUUxmWWJVQ0JSSmZkK082Nzc5enhsMSt1VytKRkFTUFI1cHR2N29LSGZuNHlvUUtJMHA4ZVBYcTRpSGJERFRlNHRFalI3SU1QUG5BWnlISEhIZWNpSGdDZzRXZ05RalV4N2JERERrbXZ3NlFPY3dVUnRSTFZwcnA2NWNxVmJsOTlJOFhGeGRhNmRXdDNIQWhhbE9ycWVFOHJnQ2lDNlVYcWtyWG5uMysrWFhIRkZhN0RSbTFwenozM25NMmZQOSs5RUwycDZ1cHEvMWtBZ0lhZ2VsZnJFSTRmUDk0L3M2RWdRT2d4dGVtY09zNUZqNnZyTWJKNjlXcDNXMXZLQVVUQlEyblBsQ2xUYk5xMGFYYnd3UWZidSsrKzY1cXRGRGdTNlVVcGlBQUFHc2IzMzMvdk9zNzMzSFBQVFM1a3F5d2ttY1RuMWZlbFAvSW9MR1VlUng1NXBGMTQ0WVV1bU54MjIyMzI3My8vMi8ybjZzUlpzMmFOLzhoMW5UcnBERDhEQUtSSHczTFYyZDJtVFJzM0NrdWJNZ1hWeWRwWG5SdzBTU1hXendHZFV6KzJxUG1xcnNkSThMamFVZzRndWxDVXJuLys0WWNmMnIzMzNydCsrTmVpUll0Y0U1Yk9Bd0FheDd4NTgxeWdVRDkwc0gzeHhSZXV2MEw3cjczMm1nc2dHdEMwY09GQy8xbnI2QXUrenJWdjM5NGRLd2lwSHp1WUp4SlEvUzUxOVdtbkhFQVVpVFJKWmNhTUdlNVlUVlJQUC8yMC9lVXZmN0hseTVmYnR0dHU2ODREQUJxZTVtcWNkdHBwRzJ5REJ3KzIwdEpTdDY5NUhQbjUrZGF6WjA4WFdCS0g0czZhTmN0MU5XaVVsV2lPaUh6NjZhZnVWaFJrVk45MzZ0VEpqYXhOSnVVQW9zaWtvYnFhMGZqdHQ5KzZ3UEhLSzYrNFRwYmpqei9lWlNjQWdNYWhyRUdqcEJJM3RSU3BpMEg3R2kwcjIyKy92ZXNrRDFxS1huLzlkWHZ3d1FkZG43YW1ZWWdDaVk0MW91dlZWMTkxajlQRXdybHo1OXJFaVJQZFk1TFJaSTJVT3l1VUNnV3BUdEJKcnVGaEYxMTBrWFh2M3QxMXFvdkdGcXVQUkkrTEt1NTlLYzFwS1lTbVFQbEZRL2xGMDl6S1R3RkFsZjRSUnh6aG4xbEhVeXhlZXVrbDF5UlZWRlRrQW9ZQ1ErS3dYVFY5UGZYVVV5NWJVZDNkcFVzWEYzeUdEQm5pUDJKamFRV1FaUFNmcUdOZDBZc0FFaitVWHpTVVh6U1VYelJ4TDcrVW03QUFBRWhFQUFHQVprN05VcGRmZnJucmVsQldjOHN0dDJSazVDd0JCQUNhT1ExeVVqLzE4ODgvN3haUVZFZTdGbCtNaWdBQ0FDM0FYbnZ0WmUrOTk1NWIvbVMvL2ZiTFNQOFBBUVFBV2dBTjhkV21tZXJCRU4rb0NDQUEwQUpvaU82SUVTTnM1TWlSN3VxRm1VQUFBWUJtVHRjRTBleHpMZnUrODg0N3U2a1d1blJ0VkFRUUFHam10Qmp1VVVjZDVacXd0SHJJMFVjZjdTN0ZFUlVCQkFDYUFmVnRMRm15WlAwMVBoSnBMU3ZOT3RjeVZOcTBYbGF5aTB5Smxvbi82cXV2YlBIaXhmNlp1cWtiUHRKVVIyYWlNNU0xQ3Nvdkdzb3ZtdVpVZmxvbFhjMVNXZ2RMaXlrbTBxVTNOUG9xV0ZCUm1jZysrK3pqK2tRQ0NoajMzMysvVytVM29FdmhIbmpnZ1Vrdk5pVmtJQUNRNVRSUlVDdnA2Z3Q5N2FDakJYQzFjdm8yMjJ4ajU1NTdycDE2NnFudWt1UVBQZlRRK21YZWRjRXBMWlpiVVZIaExsSCttOS84eGwyeVhOZEtmK0tKSjl4amtrazdnR2dDU3JEcEtsVzZyU3VLYitwK0FFQTBhcnBTSlQ5dTNEZ1hRR3BUOXFIK2psMTIyY1ZsRW1yTzJuZmZmVjNRQ0ZxTlB2LzhjOWQwdGZ2dXU3dldKR1VvR3EybHlZWmEwbDJCSlptVUE0Z0NnZGFGSHpWcTFBYWJsZ05PMXBhbUsxZ05IejdjdlFpbFFYbytBQ0N6ZE9Fb1hZbFFvNnRxVTVQVm5EbHpYQjJjK0VWZVFVUVhrOUlGcVdUMjdObnUvbjc5K3JuandJQUJBMXlnVVhCSkp1VmFYYjM0eHg1N3JFdUZIbnZzc2ZYYlhYZmRaVHZ1dUtPTGdnRk5VaGs2ZEtqZGZ2dnQ5c2dqajdpclkya3FQVUVFQURKSDEybDY0WVVYM05Mc1dxYTlOaTNSTHNHVkJ4UHBuSzRUSW5xY090bHI5M1VFVnlJTUhsZGJXaG1Jc29yMzMzL2Zyci8rZXJkZGQ5MTE3c0pTMTF4enpmb3JGWXBTb0QzMjJNTzFzZDEwMDAzMjRvc3YycFFwVTF6UFB3QWdNL1NGWHMxV2FnMUtKcWo0azNXQzYycUZ5bHhFajFPelZXM0I4NExIMVpaeUFGR0VVc2J4OGNjZisyZlNvelFvdUFnVkFDQ2FiNzc1eHEyb08yblNwQTJhcHhJRnJUNkpsN01OcUxOZFFVVDB1TG9lSThIamFrczVnS2dUUlIwdUR6endnQzFZc01CbXpwenBqbFBkTklSTTExVUhBRVNucFVtNmR1MXFQL3p3Z3h0cHBVMzdxcXUxdjNUcDB2VlhIRXhXOXlxclVLdVNGQmNYSjMxTU1LZEVWNkpOUm1FcnJZSGFTblBVMXBadU5xRU1KTXk4RU1hUlIwUDVSVVA1UlVQNVJWTmYrVjEyMldXMmZQbHkvMmhqdSs2NnF4dTYrOGMvL3RIMVNSOXd3QUgrUGV2cTQ2bFRwN3JMMVdxNHJpNkYrOG9ycjdqNUk1cEhFdEJsY0o5OTlsazc4OHd6azNaQnBCMUFHaHNmd0dnb3YyZ292MmdvdjJqU0xiKy8vLzN2YmlMMzZhZWY3cDh4TjZsYmt3TjFMdWhvVjUvMWd3OCthSWNjY29nTkhqell6VHpYb0NjRm5Ra1RKcmpIYUdDVStyaVZuUngzM0hIdVhHME1pd0tBWmt6elA5U3NOVzNhTkpkbGFDWGVoeDkrMkEzdDNYenp6ZDFqTkh5M2YvLytycXRCOTcvODhzdDI4ODAzdXlZeERZaXFDeGxJUkh3RGpJYnlpNGJ5aTZhNWxkK3JyNzdxNW16b2dsR0oxT0d1Q1lXTEZpMXlXWWdDeDdiYmJ1c21ld2ZVeGFBbUs2M2FxMzJON3RwdXUrM2NsUXpyUWdDSmlEL2dhQ2kvYUNpL2FDaS9hR2pDQWdDRVFnQUJBSVJnOXY4QjRoTU9wSStYbHRzQUFBQUFTVVZPUks1Q1lJST1cIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXROb3JtYWwoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FJQUFBQ1FkMVBlQUFBRkRtbFVXSFJZVFV3NlkyOXRMbUZrYjJKbExuaHRjQUFBQUFBQVBEOTRjR0ZqYTJWMElHSmxaMmx1UFNMdnU3OGlJR2xrUFNKWE5VMHdUWEJEWldocFNIcHlaVk42VGxSamVtdGpPV1FpUHo0S1BIZzZlRzF3YldWMFlTQjRiV3h1Y3pwNFBTSmhaRzlpWlRwdWN6cHRaWFJoTHlJZ2VEcDRiWEIwYXowaVdFMVFJRU52Y21VZ05TNDFMakFpUGdvZ1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNEtJQ0E4Y21SbU9rUmxjMk55YVhCMGFXOXVJSEprWmpwaFltOTFkRDBpSWdvZ0lDQWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWdvZ0lDQWdlRzFzYm5NNmNHaHZkRzl6YUc5d1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM0JvYjNSdmMyaHZjQzh4TGpBdklnb2dJQ0FnZUcxc2JuTTZaWGhwWmowaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOWxlR2xtTHpFdU1DOGlDaUFnSUNCNGJXeHVjenAwYVdabVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM1JwWm1Zdk1TNHdMeUlLSUNBZ0lIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2Ylcwdklnb2dJQ0FnZUcxc2JuTTZjM1JGZG5ROUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlVWMlpXNTBJeUlLSUNBZ2VHMXdPa055WldGMFpVUmhkR1U5SWpJd01qTXRNRFV0TURaVU1qSTZNamc2TURZck1ESXdNQ0lLSUNBZ2VHMXdPazF2WkdsbWVVUmhkR1U5SWpJd01qTXRNRFV0TURaVU1qSTZNekE2TWpFck1ESTZNREFpQ2lBZ0lIaHRjRHBOWlhSaFpHRjBZVVJoZEdVOUlqSXdNak10TURVdE1EWlVNakk2TXpBNk1qRXJNREk2TURBaUNpQWdJSEJvYjNSdmMyaHZjRHBFWVhSbFEzSmxZWFJsWkQwaU1qQXlNeTB3TlMwd05sUXlNam95T0Rvd05pc3dNakF3SWdvZ0lDQndhRzkwYjNOb2IzQTZRMjlzYjNKTmIyUmxQU0l6SWdvZ0lDQndhRzkwYjNOb2IzQTZTVU5EVUhKdlptbHNaVDBpYzFKSFFpQkpSVU0yTVRrMk5pMHlMakVpQ2lBZ0lHVjRhV1k2VUdsNFpXeFlSR2x0Wlc1emFXOXVQU0l4SWdvZ0lDQmxlR2xtT2xCcGVHVnNXVVJwYldWdWMybHZiajBpTVNJS0lDQWdaWGhwWmpwRGIyeHZjbE53WVdObFBTSXhJZ29nSUNCMGFXWm1Pa2x0WVdkbFYybGtkR2c5SWpFaUNpQWdJSFJwWm1ZNlNXMWhaMlZNWlc1bmRHZzlJakVpQ2lBZ0lIUnBabVk2VW1WemIyeDFkR2x2YmxWdWFYUTlJaklpQ2lBZ0lIUnBabVk2V0ZKbGMyOXNkWFJwYjI0OUlqY3lMekVpQ2lBZ0lIUnBabVk2V1ZKbGMyOXNkWFJwYjI0OUlqY3lMekVpUGdvZ0lDQThlRzF3VFUwNlNHbHpkRzl5ZVQ0S0lDQWdJRHh5WkdZNlUyVnhQZ29nSUNBZ0lEeHlaR1k2YkdrS0lDQWdJQ0FnYzNSRmRuUTZZV04wYVc5dVBTSndjbTlrZFdObFpDSUtJQ0FnSUNBZ2MzUkZkblE2YzI5bWRIZGhjbVZCWjJWdWREMGlRV1ptYVc1cGRIa2dVR2h2ZEc4Z01pQXlMakF1TkNJS0lDQWdJQ0FnYzNSRmRuUTZkMmhsYmowaU1qQXlNeTB3TlMwd05sUXlNam96TURveU1Tc3dNam93TUNJdlBnb2dJQ0FnUEM5eVpHWTZVMlZ4UGdvZ0lDQThMM2h0Y0UxTk9raHBjM1J2Y25rK0NpQWdQQzl5WkdZNlJHVnpZM0pwY0hScGIyNCtDaUE4TDNKa1pqcFNSRVkrQ2p3dmVEcDRiWEJ0WlhSaFBnbzhQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCswSWdWeEFBQUFZQnBRME5RYzFKSFFpQkpSVU0yTVRrMk5pMHlMakVBQUNpUmRaSFBLMFJSRk1jL00zN21SNk5ZS0JZdkRhdWhRWW1OeGNpdndtS01NdGpNdlBtbDVvM1hlMi9TWkt0c0ZTVTJmaTM0QzlncWE2V0lsR3haRXh2MG5PZXBrY3k1blhzKzkzdnZPZDE3TG5naldWVXp5NE9nNVN3alBCcFNacU56U3RVakZWVFNSQXUrbUdycWs5TWpFVXJhMncwZUoxNTFPclZLbi92WGFoTkpVd1ZQdGZDZ3FodVc4Smp3eExLbE83d3AzS1JtWWduaFkrR0FJUmNVdm5iMHVNdFBEcWRkL25EWWlJU0h3TnNncktSL2Nmd1hxeGxERTVhWDQ5ZXllZlhuUHM1TDZwSzVtV21KYmVLdG1JUVpKWVRDT01NTTBVYzNBekwzMFVrUFhiS2lSSDd3TzMrS0pjbFZaZFlwWUxCSW1nd1dBVkh6VWowcE1TVjZVa2FXZ3RQL3YzMDFVNzA5YnZXNkVGUTgyUFpMTzFSdHdPZTZiYi92Mi9ibkFaVGR3MW11bUwrMEIvMnZvcThYTmY4dStGYmg1THlveGJmZ2RBMmE3L1NZRWZ1V3lzUzlxUlE4SDBGOUZCb3ZvV2JlN2RuUFBvZTNFRm1ScjdxQTdSM29rUE8raFM4MjRXZlFneEdDY2dBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBQXhKUkVGVUNKbGphR2o0RHdBRGd3SUFWYmpXUHdBQUFBQkpSVTVFcmtKZ2dnPT1cIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUb29uKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBUDhBQUFBQkNBWUFBQUFSa0hpakFBQUJoR2xEUTFCSlEwTWdjSEp2Wm1sc1pRQUFLSkY5a1QxSXcwQWN4Vi9UU290VUJPMGc0cENoT3RsRlJSeExGWXRnb2JRVlduVXd1ZlFMbWpRa0tTNk9nbXZCd1kvRnFvT0xzNjRPcm9JZytBSGk3T0NrNkNJbC9pOHB0SWp4NExnZjcrNDk3dDRCUXF2R1ZETVFCMVROTWpMSmhKZ3ZySXJCVndRUlFCZ2hERW5NMUZQWnhSdzh4OWM5Zkh5OWkvRXM3M04vamdHbGFETEFKeExIbVc1WXhCdkVzNXVXem5tZk9NSXFra0o4VGp4cDBBV0pIN2t1dS96R3VleXd3RE1qUmk0elR4d2hGc3M5TFBjd3F4Z3E4UXh4VkZFMXloZnlMaXVjdHppcnRRYnIzSk8vTUZ6VVZySmNwem1HSkphUVFob2laRFJRUlEwV1lyUnFwSmpJMEg3Q3d6L3ErTlBra3NsVkJTUEhBdXBRSVRsKzhELzQzYTFabXA1eWs4SUpvTy9GdGovR2dlQXUwRzdhOXZleGJiZFBBUDh6Y0tWMS9mVVdNUGRKZXJPclJZK0F3VzNnNHJxcnlYdkE1UTR3OHFSTGh1UklmcHBDcVFTOG45RTNGWURoVzZCL3plMnRzNC9UQnlCSFhTM2ZBQWVId0VTWnN0YzkzaDNxN2UzZk01MytmZ0E0T1hLUHQvN0svZ0FBQUFaaVMwZEVBUDhBQUFBQU15ZDg4d0FBQUFsd1NGbHpBQUF1SXdBQUxpTUJlS1UvZGdBQUFBZDBTVTFGQitnSEJBd2RKMWo5V0JzQUFBQVpkRVZZZEVOdmJXMWxiblFBUTNKbFlYUmxaQ0IzYVhSb0lFZEpUVkJYZ1E0WEFBQUFWVWxFUVZRb3oyTmtZR0Q0enpBS2hoNWdaV0JnNEdCZ1lPQkVvMkZzS0orWGs0RkJpcE9CUVpvRFFrdHhNakNJc0RFd1NIRkFNUmVFNXNWbURoY1dPMWdZR0JnWUdNbElOdmowTUk3d1pFaXMvNmtiaGdDMDRRai93Ny9IWmdBQUFBQkpSVTVFcmtKZ2dnPT1cIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRJY29uTGlnaHQoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0nbm8nJTNGJTNFJTNDc3ZnIHZpZXdCb3g9JzAgMCAxNiAxNicgdmVyc2lvbj0nMS4xJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGlkPSdMaWdodCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3N0eWxlJTNFIC5zJTdCZmlsbDolMjNmZmY7c3Ryb2tlOiUyMzAwMDtzdHJva2Utd2lkdGg6LjFweDslN0QgJTNDL3N0eWxlJTNFJTNDcmVjdCBjbGFzcz0ncycgeD0nMC4xNzAzOTI5MycgeT0nMTAuMDAyNDQ4JyB3aWR0aD0nMy45MDAwNTY4JyBoZWlnaHQ9JzAuOTAwMDk5MzQnIGlkPSdOTkUnIHRyYW5zZm9ybT0ncm90YXRlKC02Ny41KScgLyUzRSUzQ3JlY3QgeD0nOC44Mjk1MDc4JyB5PScxMC4wMDI0NDcnIHdpZHRoPSczLjkwMDA1NjgnIGhlaWdodD0nMC45MDAwOTkzNCcgaWQ9J0VORScgdHJhbnNmb3JtPSdyb3RhdGUoLTIyLjUpJyBjbGFzcz0ncycgLyUzRSUzQ3JlY3QgeD0nMTQuOTUyNDY5JyB5PSczLjg3OTU3MTcnIHdpZHRoPSczLjkwMDAxMzknIGhlaWdodD0nMC45MDAwOTk4NycgaWQ9J0VTRScgdHJhbnNmb3JtPSdyb3RhdGUoMjIuNSknIGNsYXNzPSdzJyAvJTNFJTNDcmVjdCB4PScxNC45NTI0NycgeT0nLTQuNzc5NTQyOScgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nU1NFJyB0cmFuc2Zvcm09J3JvdGF0ZSg2Ny41KScgY2xhc3M9J3MnIC8lM0UlM0NyZWN0IHg9Jy0xMi43Mjk1NjUnIHk9JzEwLjAwMjQ0Nycgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nU1NXJyB0cmFuc2Zvcm09J3JvdGF0ZSgtNjcuNSknIGNsYXNzPSdzJyAvJTNFJTNDcmVjdCB4PSctNC4wNzA0NDk4JyB5PScxMC4wMDI0NDcnIHdpZHRoPSczLjkwMDAxMzknIGhlaWdodD0nMC45MDAwOTk4NycgaWQ9J1dTVycgdHJhbnNmb3JtPSdyb3RhdGUoLTIyLjUpJyBjbGFzcz0ncycgLyUzRSUzQ3JlY3QgeD0nMi4wNTI0Njg1JyB5PSczLjg3OTU3MTcnIHdpZHRoPSczLjkwMDAxMzknIGhlaWdodD0nMC45MDAwOTk4NycgaWQ9J1dOVycgdHJhbnNmb3JtPSdyb3RhdGUoMjIuNSknIGNsYXNzPSdzJyAvJTNFJTNDcmVjdCB4PScyLjA1MjQ2ODUnIHk9Jy00Ljc3OTU0MjknIHdpZHRoPSczLjkwMDAxMzknIGhlaWdodD0nMC45MDAwOTk4NycgaWQ9J05OVycgdHJhbnNmb3JtPSdyb3RhdGUoNjcuNSknIGNsYXNzPSdzJyAvJTNFJTNDZWxsaXBzZSBpZD0nQ0VOVEVSJyBjeD0nOC4wMDAwODInIGN5PSc4LjAwMDI1NzUnIHJ4PSczLjQ1MDA4MjMnIHJ5PSczLjQ1MDI1NzMnIGNsYXNzPSdzJyAvJTNFJTNDL3N2ZyUzRVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldEljb25DYW1lcmEoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0nbm8nJTNGJTNFJTNDc3ZnIGlkPSdDYW1lcmEnIHZpZXdCb3g9JzAgMCAxNiAxNicgdmVyc2lvbj0nMS4xJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NzdHlsZSBpZD0nc3R5bGUxJyUzRS5zJTdCZmlsbDolMjNmZmY7c3Ryb2tlOiUyMzAwMDtzdHJva2Utd2lkdGg6LjFweDslN0QgJTNDL3N0eWxlJTNFJTNDcGF0aCBjbGFzcz0ncycgZD0nTSAxMy44NTczMjIsOC44NzU1Mjk3IEggMTIuNDEzNDI0IEwgMTIuNDEzLDYuNzg3IGggLTEuNDI1MzExIGMgMC4yMjcwMjYsLTAuNDQ5NDY5MyAwLjM2MzI0MywtMC45NDUzOTE5IDAuMzYzMjQzLC0xLjQ4ODUwMDggMCwtMS43OTc4Nzc1IC0xLjQwNzU3MjcsLTMuMjQ5Mjg5MyAtMy4xNTExNDY2LC0zLjI0OTI4OTMgLTEuNzQzNTc0NiwwIC0zLjE1MTE0NzksMS40NTE0MTE4IC0zLjE1MTE0NzksMy4yNDkyODkzIHYgMC4wMjgwOTMgQyA0LjU3NjQxOTQsNS4wMzYzMTE4IDQuMDMxNTUyNCw0Ljg1ODM5NjggMy40NTAzNjA2LDQuODU4Mzk2OCAxLjcwNjc4NjMsNC44Njc3NTY3IDAuMjk5MjEyOTgsNi4zMTkxNzIzIDAuMjk5MjEyOTgsOC4xMDc2ODYgYyAwLDEuNzg4NTEzNSAxLjY2NTM4NTgyLDMuMzExNzg5IDMuNDI0NTg1MTIsMy4yNDkyODkgTCAzLjczMiwxMy45NzYgaCA4LjY4MSB2IC0yLjExMzM2OCBoIDEuNDQ0MzIyIHonIGlkPSdwYXRoMScgLyUzRSUzQ3JlY3QgY2xhc3M9J3MnIHg9JzEyLjgwMzkxJyB5PSc4LjM5Nzk2ODMnIHdpZHRoPScyLjg5Njg3NjYnIGhlaWdodD0nMy44ODYwMzc2JyByeD0nMCcgcnk9JzAnIGlkPSdyZWN0MScgLyUzRSUzQy9zdmclM0UlMEFcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRJY29uQXVkaW8oKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0nbm8nJTNGJTNFJTNDc3ZnIGlkPSdBdWRpbycgdmlld0JveD0nMCAwIDE2IDE2JyB2ZXJzaW9uPScxLjEnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3N0eWxlJTNFLnMlN0JmaWxsOiUyM2ZmZjtzdHJva2U6JTIzMDAwO3N0cm9rZS13aWR0aDouMXB4OyU3RCAlM0Mvc3R5bGUlM0UlM0NwYXRoIGNsYXNzPSdzJyBkPSdNIDkuMTU2MzU4OCwxLjA4MDQwMDYgMy42NzI5MzQxLDQuNjQyMDE3IEggMC41NDM2NDk3MSB2IDYuNzg0MDMxIEggMy43NTkwNjEyIGwgNS4zOTcyOTc2LDMuNDkzNzc2IHonIGlkPSdwYXRoMScgLyUzRSUzQ3BhdGggY2xhc3M9J3MnIGQ9J20gMTMuMzQ3NTE4LDEzLjY3NjY0NSAtMC43NjUxNTcsLTAuNTYzNTY2IGMgNC4yMjc0ODUsLTUuNTYwNTI0MSAwLjIxMDQxOCwtOS44ODEyMDIgMC4wMzgyNSwtMTAuMDU5NjY0OCBsIDAuNjk4MjA0LC0wLjY0ODEwMTkgYyAwLjA0NzgyLDAuMDQ2OTY0IDQuNzUzNTMsNS4wNjI3MDc2IDAuMDM4MjUsMTEuMjcxMzMyNyB6JyBpZD0ncGF0aDInIC8lM0UlM0NwYXRoIGNsYXNzPSdzJyBkPSdtIDExLjMyMTg2OCwxMS43OTgwOSAtMC44MjI1NDEsLTAuNDc5MDMyIGMgMi4xNDI0MzQsLTMuNTc4NjQ3NCAwLjExNDc3MywtNi4zNTg5MSAwLjAyODY5LC02LjQ3MTYyMzIgbCAwLjc2NTE1NiwtMC41NjM1NjY2IGMgMC4xMDUyMDgsMC4xNDA4OTE1IDIuNTA1ODgzLDMuMzgxNDAwMSAwLjAyODY5LDcuNTA0ODI5OCB6JyBpZD0ncGF0aDMnIC8lM0UlM0Mvc3ZnJTNFJTBBXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgZ2V0SWNvblBhcnRpY2xlcygpOiBzdHJpbmcge1xyXG4gICAgLy8gICByZXR1cm4gXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyUzRiUzRSUzQ3N2ZyBpZD0nUGFydGlrZWxfVjInIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDE2LjI4IDE2LjUyJyUzRSUzQ2RlZnMlM0UlM0NzdHlsZSUzRS5jbHMtMSU3QmZpbGw6JTIzZmZmO3N0cm9rZTolMjMwMDA7c3Ryb2tlLW1pdGVybGltaXQ6MTUuMTI7c3Ryb2tlLXdpZHRoOi4yNXB4OyU3RCUzQy9zdHlsZSUzRSUzQy9kZWZzJTNFJTNDY2lyY2xlIGNsYXNzPSdjbHMtMScgY3g9JzQuNzInIGN5PSc1LjQ3JyByPScyLjUyJy8lM0UlM0NjaXJjbGUgY2xhc3M9J2Nscy0xJyBjeD0nMTEuMjYnIGN5PSc4LjI4JyByPScxLjc1Jy8lM0UlM0NjaXJjbGUgY2xhc3M9J2Nscy0xJyBjeD0nNS45NScgY3k9JzEyLjA1JyByPScxLjI5Jy8lM0UlM0Mvc3ZnJTNFXCI7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG59IiwiLy8gLzxyZWZlcmVuY2UgcGF0aD1cIi4uL0V2ZW50L0V2ZW50LnRzXCIvPlxyXG4vLyAvPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGltZS9UaW1lLnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHRoZSBtb2RlIGEgbG9vcCBydW5zIGluXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gTE9PUF9NT0RFIHtcclxuICAgIC8qKiBMb29wIGN5Y2xlcyBjb250cm9sbGVkIGJ5IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKi9cclxuICAgIEZSQU1FX1JFUVVFU1QgPSBcImZyYW1lUmVxdWVzdFwiLFxyXG4gICAgLyoqIExvb3AgY3ljbGVzIGNvbnRyb2xsZWQgYnkgeHJTZXNzaW9uLnJlcXVlc3RBbmltYXRpb25GcmFtZSAqL1xyXG4gICAgRlJBTUVfUkVRVUVTVF9YUiA9IFwiZnJhbWVSZXF1ZXN0WFJcIixcclxuICAgIC8qKiBMb29wIGN5Y2xlcyB3aXRoIHRoZSBnaXZlbiBmcmFtZXJhdGUgaW4ge0BsaW5rIFRpbWUuZ2FtZX0gKi9cclxuICAgIFRJTUVfR0FNRSA9IFwidGltZUdhbWVcIixcclxuICAgIC8qKiBMb29wIGN5Y2xlcyB3aXRoIHRoZSBnaXZlbiBmcmFtZXJhdGUgaW4gcmVhbHRpbWUsIGluZGVwZW5kZW50IG9mIHtAbGluayBUaW1lLmdhbWV9ICovXHJcbiAgICBUSU1FX1JFQUwgPSBcInRpbWVSZWFsXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvcmUgbG9vcCBvZiBhIEZVREdFIGFwcGxpY2F0aW9uLiBJbml0aWFsaXplcyBhdXRvbWF0aWNhbGx5IGFuZCBtdXN0IGJlIHN0YXJ0ZWQgZXhwbGljaXRseS5cclxuICAgKiBJdCB0aGVuIGZpcmVzIHtAbGluayBFVkVOVC5MT09QX0ZSQU1FfSB0byBhbGwgYWRkZWQgbGlzdGVuZXJzIGF0IGVhY2ggZnJhbWVcclxuICAgKiBcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIExvb3AgZXh0ZW5kcyBFdmVudFRhcmdldFN0YXRpYyB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVTdGFydEdhbWU6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVTdGFydFJlYWw6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVGcmFtZUdhbWU6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVGcmFtZVJlYWw6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVGcmFtZVN0YXJ0R2FtZTogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZUZyYW1lU3RhcnRSZWFsOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgxpJUaW1lTGFzdEZyYW1lR2FtZUF2ZzogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZUxhc3RGcmFtZVJlYWxBdmc6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGkkZyYW1lczogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIHJ1bm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgc3RhdGljIG1vZGU6IExPT1BfTU9ERSA9IExPT1BfTU9ERS5GUkFNRV9SRVFVRVNUO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaWRJbnRlcnZhbGw6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZFJlcXVlc3Q6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBmcHNEZXNpcmVkOiBudW1iZXIgPSAzMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGZyYW1lc1RvQXZlcmFnZTogbnVtYmVyID0gMzA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBzeW5jV2l0aEFuaW1hdGlvbkZyYW1lOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFRoZSBnYW1ldGltZSB0aGUgbG9vcCB3YXMgc3RhcnRlZCwgb3ZlcndyaXR0ZW4gYXQgZWFjaCBzdGFydCAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgdGltZVN0YXJ0R2FtZSgpOiBudW1iZXIgeyByZXR1cm4gTG9vcC7GklRpbWVTdGFydEdhbWU7IH1cclxuICAgIC8qKiBUaGUgcmVhbHRpbWUgdGhlIGxvb3Agd2FzIHN0YXJ0ZWQsIG92ZXJ3cml0dGVuIGF0IGVhY2ggc3RhcnQgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHRpbWVTdGFydFJlYWwoKTogbnVtYmVyIHsgcmV0dXJuIExvb3AuxpJUaW1lU3RhcnRSZWFsOyB9XHJcbiAgICAvKiogVGhlIGdhbWV0aW1lIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgbG9vcCBjeWNsZSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgdGltZUZyYW1lR2FtZSgpOiBudW1iZXIgeyByZXR1cm4gTG9vcC7GklRpbWVGcmFtZUdhbWU7IH1cclxuICAgIC8qKiBUaGUgcmVhbHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBsb29wIGN5Y2xlICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB0aW1lRnJhbWVSZWFsKCk6IG51bWJlciB7IHJldHVybiBMb29wLsaSVGltZUZyYW1lUmVhbDsgfVxyXG4gICAgLyoqIFRoZSBnYW1ldGltZSB0aGUgbGFzdCBsb29wIGN5Y2xlIHN0YXJ0ZWQqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgdGltZUZyYW1lU3RhcnRHYW1lKCk6IG51bWJlciB7IHJldHVybiBMb29wLsaSVGltZUZyYW1lU3RhcnRHYW1lOyB9XHJcbiAgICAvKiogVGhlIHJlYWx0aW1lIHRoZSBsYXN0IGxvb3AgY3ljbGUgc3RhcnRlZCovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB0aW1lRnJhbWVTdGFydFJlYWwoKTogbnVtYmVyIHsgcmV0dXJuIExvb3AuxpJUaW1lRnJhbWVTdGFydFJlYWw7IH1cclxuICAgIC8qKiBUaGUgYXZlcmFnZSBudW1iZXIgb2YgZnJhbWVzIHBlciBzZWNvbmQgaW4gZ2FtZXRpbWUgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGZwc0dhbWVBdmVyYWdlKCk6IG51bWJlciB7IHJldHVybiAxMDAwIC8gTG9vcC7GklRpbWVMYXN0RnJhbWVHYW1lQXZnOyB9XHJcbiAgICAvKiogVGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGZyYW1lcyBwZXIgc2Vjb25kIGluIHJlYWx0aW1lICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBmcHNSZWFsQXZlcmFnZSgpOiBudW1iZXIgeyByZXR1cm4gMTAwMCAvIExvb3AuxpJUaW1lTGFzdEZyYW1lUmVhbEF2ZzsgfVxyXG4gICAgLyoqIFRoZSBudW1iZXIgb2YgZnJhbWVzIHRyaWdnZXJlZCBzbyBmYXIgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGZyYW1lcygpOiBudW1iZXIgeyByZXR1cm4gTG9vcC7GkkZyYW1lczsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnRzIHRoZSBsb29wIHdpdGggdGhlIGdpdmVuIG1vZGUgYW5kIGZwcy4gIFxyXG4gICAgICogVGhlIGRlZmF1bHQgZm9yIF9tb2RlIGlzIEZSQU1FX1JFUVVFU1QsIHNlZSB7QGxpbmsgTE9PUF9NT0RFfSwgaG9va2luZyB0aGUgbG9vcCB0byB0aGUgYnJvd3NlcidzIGFuaW1hdGlvbiBmcmFtZS5cclxuICAgICAqIElzIG9ubHkgYXBwbGljYWJsZSBpbiBUSU1FLW1vZGVzLlxyXG4gICAgICogX3N5bmNXaXRoQW5pbWF0aW9uRnJhbWUgaXMgZXhwZXJpbWVudGFsIGFuZCBvbmx5IGFwcGxpY2FibGUgaW4gVElNRS1tb2RlcywgZGVmZXJyaW5nIHRoZSBsb29wLWN5Y2xlIHVudGlsIHRoZSBuZXh0IHBvc3NpYmxlIGFuaW1hdGlvbiBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzdGFydChfbW9kZTogTE9PUF9NT0RFID0gTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1QsIF9mcHM6IG51bWJlciA9IDYwLCBfc3luY1dpdGhBbmltYXRpb25GcmFtZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgIExvb3Auc3RvcCgpO1xyXG5cclxuICAgICAgTG9vcC7GklRpbWVTdGFydEdhbWUgPSBUaW1lLmdhbWUuZ2V0KCk7XHJcbiAgICAgIExvb3AuxpJUaW1lU3RhcnRSZWFsID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgIExvb3AuxpJUaW1lRnJhbWVTdGFydEdhbWUgPSBMb29wLsaSVGltZVN0YXJ0R2FtZTtcclxuICAgICAgTG9vcC7GklRpbWVGcmFtZVN0YXJ0UmVhbCA9IExvb3AuxpJUaW1lU3RhcnRSZWFsO1xyXG4gICAgICBMb29wLmZwc0Rlc2lyZWQgPSAoX21vZGUgPT0gTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1QpID8gNjAgOiBfZnBzO1xyXG4gICAgICBMb29wLmZyYW1lc1RvQXZlcmFnZSA9IExvb3AuZnBzRGVzaXJlZDtcclxuICAgICAgTG9vcC7GklRpbWVMYXN0RnJhbWVHYW1lQXZnID0gTG9vcC7GklRpbWVMYXN0RnJhbWVSZWFsQXZnID0gMTAwMCAvIExvb3AuZnBzRGVzaXJlZDtcclxuICAgICAgTG9vcC5tb2RlID0gX21vZGU7XHJcbiAgICAgIExvb3Auc3luY1dpdGhBbmltYXRpb25GcmFtZSA9IF9zeW5jV2l0aEFuaW1hdGlvbkZyYW1lO1xyXG5cclxuICAgICAgbGV0IGxvZzogc3RyaW5nID0gYExvb3Agc3RhcnRpbmcgaW4gbW9kZSAke0xvb3AubW9kZX1gO1xyXG4gICAgICBpZiAoTG9vcC5tb2RlICE9IExPT1BfTU9ERS5GUkFNRV9SRVFVRVNUKVxyXG4gICAgICAgIGxvZyArPSBgIHdpdGggYXR0ZW1wdGVkICR7X2Zwc30gZnBzYDtcclxuICAgICAgRGVidWcuZnVkZ2UobG9nKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoX21vZGUpIHtcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5GUkFNRV9SRVFVRVNUOlxyXG4gICAgICAgICAgTG9vcC5sb29wRnJhbWUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1RfWFI6XHJcbiAgICAgICAgICBMb29wLmxvb3BGcmFtZVhSKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5USU1FX1JFQUw6XHJcbiAgICAgICAgICBMb29wLmlkSW50ZXJ2YWxsID0gd2luZG93LnNldEludGVydmFsKExvb3AubG9vcFRpbWUsIDEwMDAgLyBMb29wLmZwc0Rlc2lyZWQpO1xyXG4gICAgICAgICAgTG9vcC5sb29wVGltZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBMT09QX01PREUuVElNRV9HQU1FOlxyXG4gICAgICAgICAgTG9vcC5pZEludGVydmFsbCA9IFRpbWUuZ2FtZS5zZXRUaW1lcigxMDAwIC8gTG9vcC5mcHNEZXNpcmVkLCAwLCBMb29wLmxvb3BUaW1lKTtcclxuICAgICAgICAgIExvb3AubG9vcFRpbWUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgTG9vcC5ydW5uaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIHRoZSBsb29wXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc3RvcCgpOiB2b2lkIHtcclxuICAgICAgaWYgKCFMb29wLnJ1bm5pbmcpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgc3dpdGNoIChMb29wLm1vZGUpIHtcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5GUkFNRV9SRVFVRVNUOlxyXG4gICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKExvb3AuaWRSZXF1ZXN0KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1RfWFI6XHJcbiAgICAgICAgICBYUlZpZXdwb3J0LmRlZmF1bHQuc2Vzc2lvbi5jYW5jZWxBbmltYXRpb25GcmFtZShMb29wLmlkUmVxdWVzdCk7XHJcbiAgICAgICAgICBYUlZpZXdwb3J0LmRlZmF1bHQuc2Vzc2lvbiA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5USU1FX1JFQUw6XHJcbiAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChMb29wLmlkSW50ZXJ2YWxsKTtcclxuICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShMb29wLmlkUmVxdWVzdCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5USU1FX0dBTUU6XHJcbiAgICAgICAgICBUaW1lLmdhbWUuZGVsZXRlVGltZXIoTG9vcC5pZEludGVydmFsbCk7XHJcbiAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoTG9vcC5pZFJlcXVlc3QpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBMb29wLnJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgRGVidWcuZnVkZ2UoXCJMb29wIHN0b3BwZWQhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGludWUgcnVubmluZyB0aGUgbG9vcFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbnRpbnVlKCk6IHZvaWQge1xyXG4gICAgICBpZiAoTG9vcC5ydW5uaW5nKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIExvb3Auc3RhcnQoTG9vcC5tb2RlLCBMb29wLmZwc0Rlc2lyZWQsIExvb3Auc3luY1dpdGhBbmltYXRpb25GcmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9vcCgpOiB2b2lkIHtcclxuICAgICAgbGV0IHRpbWU6IG51bWJlcjtcclxuICAgICAgdGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICBMb29wLsaSVGltZUZyYW1lUmVhbCA9IHRpbWUgLSBMb29wLsaSVGltZUZyYW1lU3RhcnRSZWFsO1xyXG4gICAgICBMb29wLsaSVGltZUZyYW1lU3RhcnRSZWFsID0gdGltZTtcclxuXHJcbiAgICAgIHRpbWUgPSBUaW1lLmdhbWUuZ2V0KCk7XHJcbiAgICAgIExvb3AuxpJUaW1lRnJhbWVHYW1lID0gdGltZSAtIExvb3AuxpJUaW1lRnJhbWVTdGFydEdhbWU7XHJcbiAgICAgIExvb3AuxpJUaW1lRnJhbWVTdGFydEdhbWUgPSB0aW1lO1xyXG5cclxuICAgICAgTG9vcC7GklRpbWVMYXN0RnJhbWVHYW1lQXZnID0gKChMb29wLmZyYW1lc1RvQXZlcmFnZSAtIDEpICogTG9vcC7GklRpbWVMYXN0RnJhbWVHYW1lQXZnICsgTG9vcC7GklRpbWVGcmFtZUdhbWUpIC8gTG9vcC5mcmFtZXNUb0F2ZXJhZ2U7XHJcbiAgICAgIExvb3AuxpJUaW1lTGFzdEZyYW1lUmVhbEF2ZyA9ICgoTG9vcC5mcmFtZXNUb0F2ZXJhZ2UgLSAxKSAqIExvb3AuxpJUaW1lTGFzdEZyYW1lUmVhbEF2ZyArIExvb3AuxpJUaW1lRnJhbWVSZWFsKSAvIExvb3AuZnJhbWVzVG9BdmVyYWdlO1xyXG5cclxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgTG9vcEV2ZW50IHdoaWNoIGNvbnZleXMgaW5mb3JtYXRpb24gc3VjaCBhcyB0aW1lRWxhcHNlZCBldGMuLi5cclxuICAgICAgTG9vcC7GkkZyYW1lcysrO1xyXG4gICAgICBsZXQgZXZlbnQ6IEV2ZW50ID0gbmV3IEV2ZW50KEVWRU5ULkxPT1BfRlJBTUUpO1xyXG4gICAgICBMb29wLnRhcmdldFN0YXRpYy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBsb29wRnJhbWUoKTogdm9pZCB7XHJcbiAgICAgIExvb3AubG9vcCgpO1xyXG4gICAgICBMb29wLmlkUmVxdWVzdCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoTG9vcC5sb29wRnJhbWUpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9vcEZyYW1lWFIoX3RpbWU6IG51bWJlciA9IG51bGwsIF94ckZyYW1lOiBYUkZyYW1lID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICBMb29wLmxvb3AoKTtcclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LmRyYXcodHJ1ZSwgX3hyRnJhbWUpO1xyXG4gICAgICBMb29wLmlkUmVxdWVzdCA9IFhSVmlld3BvcnQuZGVmYXVsdC5zZXNzaW9uLnJlcXVlc3RBbmltYXRpb25GcmFtZShMb29wLmxvb3BGcmFtZVhSKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgc3RhdGljIGxvb3BUaW1lKCk6IHZvaWQge1xyXG4gICAgICBpZiAoTG9vcC5zeW5jV2l0aEFuaW1hdGlvbkZyYW1lKVxyXG4gICAgICAgIExvb3AuaWRSZXF1ZXN0ID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShMb29wLmxvb3ApO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgTG9vcC5sb29wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGltZVVuaXRzIHtcclxuICAgIGhvdXJzPzogbnVtYmVyO1xyXG4gICAgbWludXRlcz86IG51bWJlcjtcclxuICAgIHNlY29uZHM/OiBudW1iZXI7XHJcbiAgICB0ZW50aHM/OiBudW1iZXI7XHJcbiAgICBodW5kcmVkcz86IG51bWJlcjtcclxuICAgIHRob3VzYW5kcz86IG51bWJlcjtcclxuICAgIGZyYWN0aW9uPzogbnVtYmVyO1xyXG4gICAgYXNIb3Vycz86IG51bWJlcjtcclxuICAgIGFzTWludXRlcz86IG51bWJlcjtcclxuICAgIGFzU2Vjb25kcz86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGltZXJzIGV4dGVuZHMgT2JqZWN0IHtcclxuICAgIFtpZDogbnVtYmVyXTogVGltZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBnZW5lcmF0ZSBhIHRpbWVzdGFtcCB0aGF0IGNvcnJlbGF0ZXMgd2l0aCB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgcHJvZ3JhbSBidXQgYWxsb3dzIGZvciByZXNldHRpbmcgYW5kIHNjYWxpbmcuICBcclxuICAgKiBTdXBwb3J0cyB7QGxpbmsgVGltZXJ9cyBzaW1pbGFyIHRvIHdpbmRvdy5zZXRJbnRlcnZhbCBidXQgd2l0aCByZXNwZWN0IHRvIHRoZSBzY2FsZWQgdGltZS5cclxuICAgKiBBbGwgdGltZSB2YWx1ZXMgYXJlIGdpdmVuIGluIG1pbGxpc2Vjb25kc1xyXG4gICAqIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRpbWUgZXh0ZW5kcyBFdmVudFRhcmdldFVuaWZpZWQge1xyXG4gICAgLyoqIFN0YW5kYXJkIGdhbWUgdGltZSBzdGFydGluZyBhdXRvbWF0aWNhbGx5IHdpdGggdGhlIGFwcGxpY2F0aW9uICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGdhbWU6IFRpbWUgPSBuZXcgVGltZSgpO1xyXG4gICAgcHJpdmF0ZSBzdGFydDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBzY2FsZTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBvZmZzZXQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgbGFzdENhbGxUb0VsYXBzZWQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgdGltZXJzOiBUaW1lcnMgPSB7fTtcclxuICAgIHByaXZhdGUgaWRUaW1lckFkZGVkTGFzdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgICAgdGhpcy5zY2FsZSA9IDEuMDtcclxuICAgICAgdGhpcy5vZmZzZXQgPSAwLjA7XHJcbiAgICAgIHRoaXMubGFzdENhbGxUb0VsYXBzZWQgPSAwLjA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHJlcHJlc2VudGlvbnMgb2YgdGhlIHRpbWUgZ2l2ZW4gaW4gbWlsbGlzZWNvbmRzIGluIHZhcmlvdXMgZm9ybWF0cyBkZWZpbmVkIGluIHtAbGluayBUaW1lVW5pdHN9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VW5pdHMoX21pbGxpc2Vjb25kczogbnVtYmVyKTogVGltZVVuaXRzIHtcclxuICAgICAgbGV0IHVuaXRzOiBUaW1lVW5pdHMgPSB7fTtcclxuXHJcbiAgICAgIHVuaXRzLmFzU2Vjb25kcyA9IF9taWxsaXNlY29uZHMgLyAxMDAwO1xyXG4gICAgICB1bml0cy5hc01pbnV0ZXMgPSB1bml0cy5hc1NlY29uZHMgLyA2MDtcclxuICAgICAgdW5pdHMuYXNIb3VycyA9IHVuaXRzLmFzTWludXRlcyAvIDYwO1xyXG5cclxuICAgICAgdW5pdHMuaG91cnMgPSBNYXRoLmZsb29yKHVuaXRzLmFzSG91cnMpO1xyXG4gICAgICB1bml0cy5taW51dGVzID0gTWF0aC5mbG9vcih1bml0cy5hc01pbnV0ZXMpICUgNjA7XHJcbiAgICAgIHVuaXRzLnNlY29uZHMgPSBNYXRoLmZsb29yKHVuaXRzLmFzU2Vjb25kcykgJSA2MDtcclxuXHJcbiAgICAgIHVuaXRzLmZyYWN0aW9uID0gX21pbGxpc2Vjb25kcyAlIDEwMDA7XHJcbiAgICAgIHVuaXRzLnRob3VzYW5kcyA9IF9taWxsaXNlY29uZHMgJSAxMDtcclxuICAgICAgdW5pdHMuaHVuZHJlZHMgPSBfbWlsbGlzZWNvbmRzICUgMTAwIC0gdW5pdHMudGhvdXNhbmRzO1xyXG4gICAgICB1bml0cy50ZW50aHMgPSB1bml0cy5mcmFjdGlvbiAtIHVuaXRzLmh1bmRyZWRzIC0gdW5pdHMudGhvdXNhbmRzO1xyXG5cclxuICAgICAgcmV0dXJuIHVuaXRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBHZXQvU2V0IHRpbWUgYW5kIHNjYWxpbmdcclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHNjYWxlZCB0aW1lc3RhbXAgb2YgdGhpcyBpbnN0YW5jZSBpbiBtaWxsaXNlY29uZHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5vZmZzZXQgKyB0aGlzLnNjYWxlICogKHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy5zdGFydCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZW1haW5pbmcgdGltZSB0byB0aGUgZ2l2ZW4gcG9pbnQgb2YgdGltZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVtYWluZGVyKF90bzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIF90byAtIHRoaXMuZ2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAoUmUtKSBTZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhpcyBpbnN0YW5jZVxyXG4gICAgICogQHBhcmFtIF90aW1lIFRoZSB0aW1lc3RhbXAgdG8gcmVwcmVzZW50IHRoZSBjdXJyZW50IHRpbWUgKGRlZmF1bHQgMC4wKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF90aW1lOiBudW1iZXIgPSAwKTogdm9pZCB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX3RpbWU7XHJcbiAgICAgIHRoaXMuc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgICAgdGhpcy5nZXRFbGFwc2VkU2luY2VQcmV2aW91c0NhbGwoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNjYWxpbmcgb2YgdGhpcyB0aW1lLCBhbGxvd2luZyBmb3Igc2xvd21vdGlvbiAoPDEpIG9yIGZhc3Rmb3J3YXJkICg+MSkgXHJcbiAgICAgKiBAcGFyYW0gX3NjYWxlIFRoZSBkZXNpcmVkIHNjYWxpbmcgKGRlZmF1bHQgMS4wKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0U2NhbGUoX3NjYWxlOiBudW1iZXIgPSAxLjApOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQodGhpcy5nZXQoKSk7XHJcbiAgICAgIHRoaXMuc2NhbGUgPSBfc2NhbGU7XHJcbiAgICAgIC8vVE9ETzogY2F0Y2ggc2NhbGU9MFxyXG4gICAgICB0aGlzLnJlc2NhbGVBbGxUaW1lcnMoKTtcclxuICAgICAgdGhpcy5nZXRFbGFwc2VkU2luY2VQcmV2aW91c0NhbGwoKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5USU1FX1NDQUxFRCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHNjYWxpbmcgb2YgdGhpcyB0aW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTY2FsZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5zY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgb2Zmc2V0IG9mIHRoaXMgdGltZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T2Zmc2V0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9mZnNldDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgc2NhbGVkIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoaXMgbWV0aG9kXHJcbiAgICAgKiBBdXRvbWF0aWNhbGx5IHJlc2V0IGF0IGV2ZXJ5IGNhbGwgdG8gc2V0KC4uLikgYW5kIHNldFNjYWxlKC4uLilcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEVsYXBzZWRTaW5jZVByZXZpb3VzQ2FsbCgpOiBudW1iZXIge1xyXG4gICAgICBsZXQgY3VycmVudDogbnVtYmVyID0gdGhpcy5nZXQoKTtcclxuICAgICAgbGV0IGVsYXBzZWQ6IG51bWJlciA9IGN1cnJlbnQgLSB0aGlzLmxhc3RDYWxsVG9FbGFwc2VkO1xyXG4gICAgICB0aGlzLmxhc3RDYWxsVG9FbGFwc2VkID0gY3VycmVudDtcclxuICAgICAgcmV0dXJuIGVsYXBzZWQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIFRpbWVyc1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZTx2b2lkPiB0byBiZSByZXNvbHZlZCBhZnRlciB0aGUgdGltZSBnaXZlbi4gVG8gYmUgdXNlZCB3aXRoIGFzeW5jL2F3YWl0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxheShfbGFwc2U6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoX3Jlc29sdmUgPT4gdGhpcy5zZXRUaW1lcihfbGFwc2UsIDEsICgpID0+IF9yZXNvbHZlKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiBleGFtaW5lIGlmIHdlYi13b3JrZXJzIHdvdWxkIGVuaGFuY2UgcGVyZm9ybWFuY2UgaGVyZSFcclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgYW5kIGRlbGV0ZXMgYWxsIHtAbGluayBUaW1lcn1zIGF0dGFjaGVkLiBTaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIFRpbWUtb2JqZWN0IGxlYXZlcyBzY29wZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJBbGxUaW1lcnMoKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGlkIGluIHRoaXMudGltZXJzKSB7XHJcbiAgICAgICAgdGhpcy5kZWxldGVUaW1lcihOdW1iZXIoaWQpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVsZXRlcyB7QGxpbmsgVGltZXJ9IGZvdW5kIHVzaW5nIHRoZSBpbnRlcm5hbCBpZCBvZiB0aGUgY29ubmVjdGVkIGludGVydmFsLW9iamVjdFxyXG4gICAgICogQHBhcmFtIF9pZCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZVRpbWVyQnlJdHNJbnRlcm5hbElkKF9pZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGlkIGluIHRoaXMudGltZXJzKSB7XHJcbiAgICAgICAgbGV0IHRpbWVyOiBUaW1lciA9IHRoaXMudGltZXJzW2lkXTtcclxuICAgICAgICBpZiAodGltZXIuaWQgPT0gX2lkKSB7XHJcbiAgICAgICAgICB0aW1lci5jbGVhcigpO1xyXG4gICAgICAgICAgZGVsZXRlIHRoaXMudGltZXJzW2lkXTtcclxuICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIGFuIGVhcmx5IG91dCBpcyBPSyBoZXJlLi4uIHNob3VsZCBiZSFcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc3RhbGxzIGEgdGltZXIgYXQgdGhpcyB0aW1lIG9iamVjdFxyXG4gICAgICogQHBhcmFtIF9sYXBzZSBUaGUgb2JqZWN0LXRpbWUgdG8gZWxhcHNlIGJldHdlZW4gdGhlIGNhbGxzIHRvIF9jYWxsYmFja1xyXG4gICAgICogQHBhcmFtIF9jb3VudCBUaGUgbnVtYmVyIG9mIGNhbGxzIGRlc2lyZWQsIDAgPSBJbmZpbml0ZVxyXG4gICAgICogQHBhcmFtIF9oYW5kbGVyIFRoZSBmdW5jdGlvbiB0byBjYWxsIGVhY2ggdGhlIGdpdmVuIGxhcHNlIGhhcyBlbGFwc2VkXHJcbiAgICAgKiBAcGFyYW0gX2FyZ3VtZW50cyBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byBjYWxsYmFjayBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0VGltZXIoX2xhcHNlOiBudW1iZXIsIF9jb3VudDogbnVtYmVyLCBfaGFuZGxlcjogVGltZXJIYW5kbGVyLCAuLi5fYXJndW1lbnRzOiBPYmplY3RbXSk6IG51bWJlciB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cclxuICAgICAgbmV3IFRpbWVyKHRoaXMsIF9sYXBzZSwgX2NvdW50LCBfaGFuZGxlciwgX2FyZ3VtZW50cyk7XHJcbiAgICAgIC8vdGhpcy5hZGRUaW1lcih0aW1lcik7XHJcbiAgICAgIHJldHVybiB0aGlzLmlkVGltZXJBZGRlZExhc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW50ZXJuYWxseSBieSB7QGxpbmsgVGltZX0gYW5kIHtAbGluayBUaW1lcn0gYW5kIG11c3Qgbm90IGJlIGNhbGxlZCBvdGhlcndpc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFRpbWVyKF90aW1lcjogVGltZXIpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLnRpbWVyc1srK3RoaXMuaWRUaW1lckFkZGVkTGFzdF0gPSBfdGltZXI7XHJcbiAgICAgIHJldHVybiB0aGlzLmlkVGltZXJBZGRlZExhc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIHRoZSB0aW1lciB3aXRoIHRoZSBpZCBnaXZlbiBieSB0aGlzIHRpbWUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVUaW1lcihfaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBsZXQgdGltZXI6IFRpbWVyID0gdGhpcy50aW1lcnNbX2lkXTtcclxuICAgICAgaWYgKCF0aW1lcilcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRpbWVyLmNsZWFyKCk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLnRpbWVyc1tfaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdGltZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgb3IgbnVsbCBpZiBub3QgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRUaW1lcihfaWQ6IG51bWJlcik6IFRpbWVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGltZXJzW19pZF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgbGlzdCBvZiB0aW1lcnMgY3VycmVudGx5IGluc3RhbGxlZCBvbiB0aGlzIHRpbWUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRUaW1lcnMoKTogVGltZXJzIHtcclxuICAgICAgbGV0IHJlc3VsdDogVGltZXJzID0ge307XHJcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJlc3VsdCwgdGhpcy50aW1lcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSB7QGxpbmsgVGltZXJzfSBpbnN0YWxsZWQgdG8gdGhpc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFzVGltZXJzKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gKE9iamVjdC5rZXlzKHRoaXMudGltZXJzKS5sZW5ndGggPiAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY3JlYXRlcyB7QGxpbmsgVGltZXJ9cyB3aGVuIHNjYWxpbmcgY2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlc2NhbGVBbGxUaW1lcnMoKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGlkIGluIHRoaXMudGltZXJzKSB7XHJcbiAgICAgICAgbGV0IHRpbWVyOiBUaW1lciA9IHRoaXMudGltZXJzW2lkXTtcclxuICAgICAgICB0aW1lci5jbGVhcigpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbWVyc1tpZF07XHJcbiAgICAgICAgaWYgKCF0aGlzLnNjYWxlKVxyXG4gICAgICAgICAgLy8gVGltZSBoYXMgc3RvcHBlZCwgbm8gbmVlZCB0byByZXBsYWNlIGNsZWFyZWQgdGltZXJzXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgLyogdGhpcy50aW1lcnNbaWRdID0gICovXHJcbiAgICAgICAgdGltZXIgPSB0aW1lci5pbnN0YWxsQ29weSgpOyAvLyB0aGUgdGltZXIgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGlzIHRpbWUgaW5zdGFuY2VcclxuICAgICAgICBkZWxldGUgdGhpcy50aW1lcnNbdGhpcy5pZFRpbWVyQWRkZWRMYXN0XTsgLy8gcmVtb3ZlIHRoZSBjb3B5IGFnYWluIC4uLlxyXG4gICAgICAgIHRoaXMudGltZXJzW2lkXSA9IHRpbWVyOyAvLyAuLi4gYW5kIHBsYWNlIGl0IGF0IHRoZSBpZCBvZiB0aGUgb3JpZ2luYWxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgdGhlIHNpZ25hdHVyZSBvZiBoYW5kbGVyIGZ1bmN0aW9ucyBmb3Ige0BsaW5rIEV2ZW50VGltZXJ9cywgdmVyeSBzaW1pbGFyIHRvIHVzdWFsIGV2ZW50IGhhbmRsZXJcclxuICAgKi9cclxuICBleHBvcnQgdHlwZSBUaW1lckhhbmRsZXIgPSAoX2V2ZW50OiBFdmVudFRpbWVyKSA9PiB2b2lkO1xyXG5cclxuICAvKipcclxuICAgKiBBIHtAbGluayBUaW1lcn0taW5zdGFuY2UgaW50ZXJuYWxseSB1c2VzIHdpbmRvdy5zZXRJbnRlcnZhbCB0byBjYWxsIGEgZ2l2ZW4gaGFuZGxlciB3aXRoIGEgZ2l2ZW4gZnJlcXVlbmN5IGEgZ2l2ZW4gbnVtYmVyIG9mIHRpbWVzLFxyXG4gICAqIHBhc3NpbmcgYW4ge0BsaW5rIEV2ZW50VGltZXJ9LWluc3RhbmNlIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhbmQgZ2l2ZW4gYXJndW1lbnRzLiBcclxuICAgKiBUaGUgZnJlcXVlbmN5IHNjYWxlcyB3aXRoIHRoZSB7QGxpbmsgVGltZX0taW5zdGFuY2UgdGhlIHtAbGluayBUaW1lcn0taW5zdGFuY2UgaXMgYXR0YWNoZWQgdG8uXHJcbiAgICogXHJcbiAgICogQGF1dGhvciBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUaW1lciB7XHJcbiAgICBwdWJsaWMgYWN0aXZlOiBib29sZWFuO1xyXG4gICAgcHVibGljIGNvdW50OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGhhbmRsZXI6IFRpbWVySGFuZGxlcjtcclxuICAgIHByaXZhdGUgdGltZTogVGltZTtcclxuICAgIHByaXZhdGUgZWxhcHNlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGV2ZW50OiBFdmVudFRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lb3V0UmVhbDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBpZFdpbmRvdzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBUaW1lcn0gaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0gX3RpbWUgVGhlIHtAbGluayBUaW1lfSBpbnN0YW5jZSwgdGhlIHRpbWVyIGF0dGFjaGVzIHRvXHJcbiAgICAgKiBAcGFyYW0gX2VsYXBzZSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZWxhcHNlLCB0byB0aGUgbmV4dCBjYWxsIG9mIF9oYW5kbGVyLCBtZWFzdXJlZCBpbiBfdGltZVxyXG4gICAgICogQHBhcmFtIF9jb3VudCBUaGUgZGVzaXJlZCBudW1iZXIgb2YgY2FsbHMgdG8gX2hhbmRsZXIsIFRpbWVyIGRlaW5zdGFsbHMgYXV0b21hdGljYWxseSBhZnRlciBsYXN0IGNhbGwuIFBhc3NpbmcgMCBpbnZva2VzIGluZmluaXRlIGNhbGxzXHJcbiAgICAgKiBAcGFyYW0gX2hhbmRsZXIgVGhlIHtAbGluayBUaW1lckhhbmRsZXJ9IGluc3RhbmNlIHRvIGNhbGxcclxuICAgICAqIEBwYXJhbSBfYXJndW1lbnRzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gX2hhbmRsZXJcclxuICAgICAqIFxyXG4gICAgICogVE9ETzogZm9yIHByb3BlciBoYW5kbGluZyBhbmQgZGVsZXRpb24sIHVzZSBUaW1lLnNldFRpbWVyIGluc3RlYWQgb2YgaW5zdGFudGlhdGluZyB0aW1lcnMgeW91cnNlbGYuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGltZTogVGltZSwgX2VsYXBzZTogbnVtYmVyLCBfY291bnQ6IG51bWJlciwgX2hhbmRsZXI6IFRpbWVySGFuZGxlciwgLi4uX2FyZ3VtZW50czogT2JqZWN0W10pIHtcclxuICAgICAgdGhpcy50aW1lID0gX3RpbWU7XHJcbiAgICAgIHRoaXMuZWxhcHNlID0gX2VsYXBzZTtcclxuICAgICAgdGhpcy5ldmVudCA9IG5ldyBFdmVudFRpbWVyKHRoaXMsIF9hcmd1bWVudHMpO1xyXG4gICAgICB0aGlzLmhhbmRsZXIgPSBfaGFuZGxlcjtcclxuICAgICAgdGhpcy5jb3VudCA9IF9jb3VudDtcclxuXHJcbiAgICAgIGxldCBzY2FsZTogbnVtYmVyID0gTWF0aC5hYnMoX3RpbWUuZ2V0U2NhbGUoKSk7XHJcblxyXG4gICAgICBpZiAoIXNjYWxlKSB7XHJcbiAgICAgICAgLy8gVGltZSBpcyBzdG9wcGVkLCB0aW1lciB3b24ndCBiZSBhY3RpdmVcclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy50aW1lb3V0UmVhbCA9IHRoaXMuZWxhcHNlIC8gc2NhbGU7XHJcblxyXG4gICAgICBsZXQgY2FsbGJhY2s6IEZ1bmN0aW9uID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5hY3RpdmUpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnQuY291bnQgPSB0aGlzLmNvdW50O1xyXG4gICAgICAgIHRoaXMuZXZlbnQubGFzdENhbGwgPSAodGhpcy5jb3VudCA9PSAxKTtcclxuICAgICAgICBfaGFuZGxlcih0aGlzLmV2ZW50KTtcclxuICAgICAgICB0aGlzLmV2ZW50LmZpcnN0Q2FsbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb3VudCA+IDApXHJcbiAgICAgICAgICBpZiAoLS10aGlzLmNvdW50ID09IDApXHJcbiAgICAgICAgICAgIF90aW1lLmRlbGV0ZVRpbWVyQnlJdHNJbnRlcm5hbElkKHRoaXMuaWRXaW5kb3cpO1xyXG5cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuaWRXaW5kb3cgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoY2FsbGJhY2ssIHRoaXMudGltZW91dFJlYWwsIF9hcmd1bWVudHMpO1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgIF90aW1lLmFkZFRpbWVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgd2luZG93LWlkIG9mIHRoZSB0aW1lciwgd2hpY2ggd2FzIHJldHVybmVkIGJ5IHNldEludGVydmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaWRXaW5kb3c7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB0aW1lLWludGVydmFsbCBmb3IgY2FsbHMgdG8gdGhlIGhhbmRsZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBsYXBzZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5lbGFwc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRhY2hlcyBhIGNvcHkgb2YgdGhpcyBhdCBpdHMgY3VycmVudCBzdGF0ZSB0byB0aGUgc2FtZSB7QGxpbmsgVGltZX0taW5zdGFuY2UuIFVzZWQgaW50ZXJuYWxseSB3aGVuIHJlc2NhbGluZyB7QGxpbmsgVGltZX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluc3RhbGxDb3B5KCk6IFRpbWVyIHtcclxuICAgICAgcmV0dXJuIG5ldyBUaW1lcih0aGlzLnRpbWUsIHRoaXMuZWxhcHNlLCB0aGlzLmNvdW50LCB0aGlzLmhhbmRsZXIsIHRoaXMuZXZlbnQuYXJndW1lbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgdGltZXIsIHJlbW92aW5nIGl0IGZyb20gdGhlIGludGVydmFsLXRpbWVycyBoYW5kbGVkIGJ5IHdpbmRvd1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgIC8vIGlmICh0aGlzLnR5cGUgPT0gVElNRVJfVFlQRS5USU1FT1VUKSB7XHJcbiAgICAgIC8vICAgICBpZiAodGhpcy5hY3RpdmUpXHJcbiAgICAgIC8vICAgICAgICAgLy8gc2F2ZSByZW1haW5pbmcgdGltZSB0byB0aW1lb3V0IGFzIG5ldyB0aW1lb3V0IGZvciByZXN0YXJ0XHJcbiAgICAgIC8vICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGhpcy50aW1lb3V0ICogKDEgLSAocGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLnN0YXJ0VGltZVJlYWwpIC8gdGhpcy50aW1lb3V0UmVhbCk7XHJcbiAgICAgIC8vICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuaWQpO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGVsc2VcclxuICAgICAgLy8gVE9ETzogcmV1c2luZyB0aW1lciBzdGFydHMgaW50ZXJ2YWwgYW5ldy4gU2hvdWxkIGJlIHJlbWFpbmluZyBpbnRlcnZhbCBhcyB0aW1lb3V0LCB0aGVuIHN0YXJ0aW5nIGludGVydmFsIGFuZXcgXHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuaWRXaW5kb3cpO1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVkZ2VDb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vU291cmNlL0NvcmUvRGVidWcvRGVidWdUYXJnZXQudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Z0ludGVyZmFjZXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Z0NvbnNvbGUudHMiLCIuLi9Tb3VyY2UvQ29yZS9EZWJ1Zy9EZWJ1Zy50cyIsIi4uL1NvdXJjZS9Db3JlL0V2ZW50L0V2ZW50LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9NdXRhYmxlLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9TZXJpYWxpemVyLnRzIiwiLi4vU291cmNlL0NvcmUvR3JhcGgvTm9kZS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnQudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZWN5Y2xlL1JlY3ljYWJsZUFycmF5LnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yU2hhZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yQ29hdC50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJJbmplY3Rvck1lc2gudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZW5kZXIvUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvUmVjeWNsZS9SZWN5Y2xlci50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvVmVjdG9yMi50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvUmVjdGFuZ2xlLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlcldlYkdMLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yVGV4dHVyZS50cyIsIi4uL1NvdXJjZS9Db3JlL1BoeXNpY3MvSGVscGVyc1BoeXNpY3MudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50LnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludEF4aWFsLnRzIiwiLi4vU291cmNlL0NvcmUvUmVmZXJlbmNlcy50cyIsIi4uL1NvdXJjZS9Db3JlL0FuaW1hdGlvbi9BbmltYXRpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uRnVuY3Rpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uR0xURi50cyIsIi4uL1NvdXJjZS9Db3JlL0FuaW1hdGlvbi9BbmltYXRpb25LZXkudHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uU2VxdWVuY2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uU3ByaXRlLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW8udHMiLCIuLi9Tb3VyY2UvQ29yZS9FdmVudC9FdmVudEF1ZGlvLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW9NYW5hZ2VyLnRzIiwiLi4vU291cmNlL0NvcmUvQXVkaW8vQXVkaW9Pc2NpbGxhdG9yLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudEFtYmllbnRPY2NsdXNpb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QW5pbWF0b3IudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QXVkaW8udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50QXVkaW9MaXN0ZW5lci50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRCbG9vbS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRDYW1lcmEudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50RmFjZUNhbWVyYS50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRGb2cudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50R3JhcGhGaWx0ZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9MaWdodC9MaWdodC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRMaWdodC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRNYXRlcmlhbC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRNZXNoLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvQ29tcG9uZW50L0NvbXBvbmVudFBpY2sudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50U2NyaXB0LnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b24udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50U2tlbGV0b24udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50VGV4dC50cyIsIi4uL1NvdXJjZS9Db3JlL0NvbXBvbmVudC9Db21wb25lbnRUcmFuc2Zvcm0udHMiLCIuLi9Tb3VyY2UvQ29yZS9Db21wb25lbnQvQ29tcG9uZW50VlJEZXZpY2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db250cm9sL0NvbnRyb2wudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db250cm9sL0F4aXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9Db250cm9sL0tleWJvYXJkLnRzIiwiLi4vU291cmNlL0NvcmUvRGVidWcvRGVidWdBbGVydC50cyIsIi4uL1NvdXJjZS9Db3JlL0RlYnVnL0RlYnVnRGlhbG9nLnRzIiwiLi4vU291cmNlL0NvcmUvRGVidWcvRGVidWdUZXh0QXJlYS50cyIsIi4uL1NvdXJjZS9Db3JlL0V2ZW50L0V2ZW50S2V5Ym9hcmQudHMiLCIuLi9Tb3VyY2UvQ29yZS9FdmVudC9FdmVudFRpbWVyLnRzIiwiLi4vU291cmNlL0NvcmUvRXZlbnQvRXZlbnRUb3VjaC50cyIsIi4uL1NvdXJjZS9Db3JlL0dyYXBoL0dyYXBoLnRzIiwiLi4vU291cmNlL0NvcmUvR3JhcGgvR3JhcGhHTFRGLnRzIiwiLi4vU291cmNlL0NvcmUvR3JhcGgvR3JhcGhJbnN0YW5jZS50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGVyaWFsL0NvYXQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0Q29sb3JlZC50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGVyaWFsL0NvYXRSZW1pc3NpdmUudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0VGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0UmVtaXNzaXZlVGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2F0UmVtaXNzaXZlVGV4dHVyZWROb3JtYWxzLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvQ29hdFRvb24udHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRlcmlhbC9Db2xvci50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGVyaWFsL01hdGVyaWFsLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0ZXJpYWwvTWF0ZXJpYWxHTFRGLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9DYWxjLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9GcmFtaW5nLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9HZW8yLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9HZW8zLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9MRklCNC50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvTWF0cml4M3gzLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9NYXRyaXg0eDQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL05vaXNlLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9Ob2lzZTIudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL05vaXNlMy50cyIsIi4uL1NvdXJjZS9Db3JlL01hdGgvTm9pc2U0LnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9RdWF0ZXJuaW9uLnRzIiwiLi4vU291cmNlL0NvcmUvTWF0aC9SYW5kb20udHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL1ZlY3RvcjMudHMiLCIuLi9Tb3VyY2UvQ29yZS9NYXRoL1ZlY3RvcjQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL0ZhY2UudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2gudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hDdWJlLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoUG9seWdvbi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaEV4dHJ1c2lvbi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaEZCWC50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaEZyb21EYXRhLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoR0xURi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaE9CSi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaFB5cmFtaWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL01lc2hRdWFkLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoVGVycmFpbi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaFJlbGllZi50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvTWVzaFJvdGF0aW9uLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoU3BoZXJlLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoU3ByaXRlLnRzIiwiLi4vU291cmNlL0NvcmUvTWVzaC9NZXNoVG9ydXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL1F1YWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9NZXNoL1ZlcnRleC50cyIsIi4uL1NvdXJjZS9Db3JlL01lc2gvVmVydGljZXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9QYXJ0aWNsZVN5c3RlbS9QYXJ0aWNsZVN5c3RlbS50cyIsIi4uL1NvdXJjZS9Db3JlL1BhcnRpY2xlU3lzdGVtL1NoYWRlclBhcnRpY2xlU3lzdGVtLnRzIiwiLi4vU291cmNlL0NvcmUvUGF0aGluZy9Db21wb25lbnRXYWxrZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9QYXRoaW5nL0NvbXBvbmVudFdheXBvaW50LnRzIiwiLi4vU291cmNlL0NvcmUvUGF0aGluZy9Db25uZWN0aW9uLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Db21wb25lbnRSaWdpZGJvZHkudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0RlYnVnUGh5c2ljc0RyYXcudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50Q3lsaW5kcmljYWwudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50UHJpc21hdGljLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludFJhZ2RvbGwudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50UmV2b2x1dGUudHMiLCIuLi9Tb3VyY2UvQ29yZS9QaHlzaWNzL0pvaW50U3BoZXJpY2FsLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9Kb2ludFVuaXZlcnNhbC50cyIsIi4uL1NvdXJjZS9Db3JlL1BoeXNpY3MvSm9pbnRXZWxkaW5nLnRzIiwiLi4vU291cmNlL0NvcmUvUGh5c2ljcy9QaHlzaWNzLnRzIiwiLi4vU291cmNlL0NvcmUvUmF5L0JveC50cyIsIi4uL1NvdXJjZS9Db3JlL1JheS9QaWNrLnRzIiwiLi4vU291cmNlL0NvcmUvUmF5L1BpY2tlci50cyIsIi4uL1NvdXJjZS9Db3JlL1JheS9SYXkudHMiLCIuLi9Tb3VyY2UvQ29yZS9SZW5kZXIvR2l6bW9zLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1JlbmRlci50cyIsIi4uL1NvdXJjZS9Db3JlL1JlbmRlci9SZW5kZXJNZXNoLnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1ZpZXdwb3J0LnRzIiwiLi4vU291cmNlL0NvcmUvUmVuZGVyL1hSVmlld3BvcnQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TZXJpYWxpemF0aW9uL0ZpbGVJb0Jyb3dzZXJMb2NhbC50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vTXV0YWJsZUFycmF5LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9Qcm9qZWN0LnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvQnVmZmVyUmVhZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYTG9hZGVyLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9GQlgvRkJYTm9kZS50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vRkJYL2xvYWRGcm9tTm9kZXMudHMiLCIuLi9Tb3VyY2UvQ29yZS9TZXJpYWxpemF0aW9uL0ZCWC9wYXJzZU5vZGVzRnJvbUJpbmFyeS50cyIsIi4uL1NvdXJjZS9Db3JlL1NlcmlhbGl6YXRpb24vR0xURi9HTFRGLnRzIiwiLi4vU291cmNlL0NvcmUvU2VyaWFsaXphdGlvbi9HTFRGL0dMVEZMb2FkZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvTWVyZ2VkU2hhZGVyU291cmNlcy50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXIudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyQW1iaWVudE9jY2x1c2lvbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJCbG9vbS50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJGbGF0LnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckZsYXRTa2luLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckZsYXRUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJGbGF0VGV4dHVyZWRTa2luLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckdpem1vLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlckdpem1vVGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyR291cmF1ZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJHb3VyYXVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJHb3VyYXVkVGV4dHVyZWQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyR291cmF1ZFRleHR1cmVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXQudHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyTGl0U2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXRUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJMaXRUZXh0dXJlZFNraW4udHMiLCIuLi9Tb3VyY2UvQ29yZS9TaGFkZXIvU2hhZGVyTWF0Q2FwLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaG9uZ1RleHR1cmVkLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nVGV4dHVyZWROb3JtYWxzLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBob25nVGV4dHVyZWROb3JtYWxzU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaG9uZ1RleHR1cmVkU2tpbi50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJQaWNrLnRzIiwiLi4vU291cmNlL0NvcmUvU2hhZGVyL1NoYWRlclBpY2tUZXh0dXJlZC50cyIsIi4uL1NvdXJjZS9Db3JlL1NoYWRlci9TaGFkZXJUb29uLnRzIiwiLi4vU291cmNlL0NvcmUvVGV4dHVyZS9UZXh0dXJlLnRzIiwiLi4vU291cmNlL0NvcmUvVGV4dHVyZS9UZXh0dXJlRGVmYXVsdC50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvTG9vcC50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvVGltZS50cyIsIi4uL1NvdXJjZS9Db3JlL1RpbWUvVGltZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQVUsU0FBUyxDQW9CbEI7QUFwQkQsV0FBVSxTQUFTO0lBQ2pCOztPQUVHO0lBQ0gsTUFBc0IsV0FBVztRQUcvQjs7V0FFRztRQUNJLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBZ0IsRUFBRSxHQUFHLEtBQWU7WUFDL0QsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsMkJBQTJCO1lBQ2xFLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSztnQkFDbkIsSUFBSSxHQUFHLFlBQVksTUFBTTtvQkFDdkIsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsK0JBQStCOztvQkFFNUUsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQywrQkFBK0I7WUFDakUsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO0tBQ0Y7SUFmcUIscUJBQVcsY0FlaEMsQ0FBQTtBQUNILENBQUMsRUFwQlMsU0FBUyxLQUFULFNBQVMsUUFvQmxCO0FDcEJELG9DQUFvQztBQUNwQyxJQUFVLFNBQVMsQ0FnQ2xCO0FBakNELG9DQUFvQztBQUNwQyxXQUFVLFNBQVM7SUFDakI7O09BRUc7SUFDSCxJQUFZLFlBZVg7SUFmRCxXQUFZLFlBQVk7UUFDdEIsK0NBQVcsQ0FBQTtRQUNYLCtDQUFXLENBQUE7UUFDWCw2Q0FBVSxDQUFBO1FBQ1YsK0NBQVcsQ0FBQTtRQUNYLGlEQUFZLENBQUE7UUFDWixrREFBWSxDQUFBO1FBQ1osbURBQWEsQ0FBQTtRQUNiLG1EQUFhLENBQUE7UUFDYixxRUFBc0IsQ0FBQTtRQUN0Qix5REFBZ0IsQ0FBQTtRQUNoQixxREFBYyxDQUFBO1FBQ2Qsd0RBQTRDLENBQUE7UUFDNUMscURBQWtELENBQUE7UUFDbEQsK0NBQXVCLENBQUE7SUFDekIsQ0FBQyxFQWZXLFlBQVksR0FBWixzQkFBWSxLQUFaLHNCQUFZLFFBZXZCO0lBRVksc0JBQVksR0FBaUM7UUFDeEQsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRztRQUN4QixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHO1FBQ3ZCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUc7UUFDeEIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRztRQUN6QixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJO1FBQzFCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUk7S0FDNUIsQ0FBQztBQUlKLENBQUMsRUFoQ1MsU0FBUyxLQUFULFNBQVMsUUFnQ2xCO0FDakNELHVDQUF1QztBQUN2QyxJQUFVLFNBQVMsQ0FnQ2xCO0FBakNELHVDQUF1QztBQUN2QyxXQUFVLFNBQVM7SUFDakI7O09BRUc7SUFDSCxNQUFhLFlBQWEsU0FBUSxVQUFBLFdBQVc7aUJBQzdCLGNBQVMsR0FBNkI7WUFDbEQsQ0FBQyxVQUFBLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNqQyxDQUFDLFVBQUEsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQy9CLENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDakMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSztZQUNuQyxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLFlBQVksQ0FBQyxLQUFLO1lBQ3hDLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUs7WUFDbkMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSztZQUNuQyxDQUFDLFVBQUEsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxjQUFjO1lBQ3JELENBQUMsVUFBQSxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDekMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxZQUFZLENBQUMsTUFBTTtTQUMzQyxDQUFDO1FBRUY7O1dBRUc7UUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQWdCLEVBQUUsR0FBRyxLQUFlO1lBQ3RELE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBQSxZQUFZLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFnQixFQUFFLEdBQUcsS0FBZTtZQUN2RCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLENBQUM7O0lBMUJVLHNCQUFZLGVBMkJ4QixDQUFBO0FBQ0gsQ0FBQyxFQWhDUyxTQUFTLEtBQVQsU0FBUyxRQWdDbEI7QUNqQ0QsdUNBQXVDO0FBQ3ZDLDBDQUEwQztBQUMxQyx1Q0FBdUM7QUFDdkMsSUFBVSxTQUFTLENBNktsQjtBQWhMRCx1Q0FBdUM7QUFDdkMsMENBQTBDO0FBQzFDLHVDQUF1QztBQUN2QyxXQUFVLFNBQVM7SUFDakI7Ozs7T0FJRztJQUNILE1BQWEsS0FBSztRQUNoQjs7V0FFRztpQkFDWSxjQUFTLEdBQW1ELEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVoRzs7V0FFRztRQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBb0IsRUFBRSxPQUFxQjtZQUNqRSxLQUFLLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTO2dCQUNoQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUUxQyxLQUFLLElBQUksTUFBTSxJQUFJLFVBQUEsWUFBWSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksTUFBTSxHQUFXLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO29CQUNmLE1BQU07Z0JBQ1IsSUFBSSxDQUFDLFVBQUEsWUFBWSxDQUFDLFFBQVEsRUFBRSxVQUFBLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBQSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdEYsMkJBQTJCO29CQUMzQixTQUFTO2dCQUNYLElBQUksT0FBTyxHQUFHLE1BQU07b0JBQ2xCLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDcEUsQ0FBQztRQUNILENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBb0I7WUFDMUMsSUFBSSxNQUFNLEdBQWlCLENBQUMsQ0FBQztZQUM3QixLQUFLLElBQUksTUFBTSxJQUFJLE9BQU8sQ0FBQyxTQUFTO2dCQUNsQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBb0IsRUFBRSxPQUFxQjtZQUNqRSxJQUFJLE9BQU8sR0FBaUIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRCxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFvQixFQUFFLE9BQXFCO1lBQ3BFLElBQUksT0FBTyxHQUFpQixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWlCLEVBQUUsR0FBRyxLQUFnQjtZQUN2RCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQUEsWUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUNEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFpQixFQUFFLEdBQUcsS0FBZ0I7WUFDdEQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFBLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBaUIsRUFBRSxHQUFHLEtBQWdCO1lBQ3ZELEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0Q7O1dBRUc7UUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQWlCLEVBQUUsR0FBRyxLQUFnQjtZQUN4RCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFpQixFQUFFLEdBQUcsS0FBZ0I7WUFDeEQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxLQUFLO1lBQ2pCLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0Q7O1dBRUc7UUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQWE7WUFDL0IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBYTtZQUN4QyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQUEsWUFBWSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFFBQVE7WUFDcEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFBLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBYTtZQUNoQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7O2dCQUUxQixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU1QixLQUFLLElBQUksS0FBSyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7Z0JBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU3RCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBaUIsRUFBRSxHQUFHLEtBQWdCO1lBQ3pELEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBQSxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQ7O1dBRUc7UUFDSyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQXFCLEVBQUUsUUFBaUIsRUFBRSxLQUFnQjtZQUNoRixJQUFJLE9BQU8sSUFBSSxVQUFBLFlBQVksQ0FBQyxHQUFHLElBQUksT0FBTyxJQUFJLFVBQUEsWUFBWSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksVUFBQSxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2pHLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxNQUFNLENBQUM7b0JBQ3RDLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUU7d0JBQ2hFLElBQUksUUFBUSxFQUFFLENBQUM7NEJBQ2IsSUFBSSxLQUFLLEdBQWEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDMUQsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixDQUFDO1lBQ1AsQ0FBQztZQUNELElBQUksU0FBUyxHQUE2QixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25FLEtBQUssSUFBSSxRQUFRLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDckMsSUFBSSxRQUFRO29CQUNWLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDM0IsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDOzt3QkFFN0IsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTNCLENBQUM7UUFDRDs7V0FFRztRQUNLLE1BQU0sQ0FBQyxZQUFZO1lBQ3pCLElBQUksTUFBTSxHQUFtRCxFQUFFLENBQUM7WUFDaEUsSUFBSSxPQUFPLEdBQW1CO2dCQUM1QixVQUFBLFlBQVksQ0FBQyxJQUFJLEVBQUUsVUFBQSxZQUFZLENBQUMsR0FBRyxFQUFFLFVBQUEsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFBLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBQSxZQUFZLENBQUMsS0FBSztnQkFDOUYsVUFBQSxZQUFZLENBQUMsS0FBSyxFQUFFLFVBQUEsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFBLFlBQVksQ0FBQyxjQUFjLEVBQUUsVUFBQSxZQUFZLENBQUMsUUFBUTtnQkFDMUYsVUFBQSxZQUFZLENBQUMsTUFBTTthQUNwQixDQUFDO1lBRUYsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPO2dCQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQUEsWUFBWSxFQUFFLFVBQUEsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU3RSxNQUFNLENBQUMsVUFBQSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUEsWUFBWSxDQUFDLENBQUM7WUFFakQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQzs7SUFyS1UsZUFBSyxRQXNLakIsQ0FBQTtBQUNILENBQUMsRUE3S1MsU0FBUyxLQUFULFNBQVMsUUE2S2xCO0FDaExELElBQVUsU0FBUyxDQTZJbEI7QUE3SUQsV0FBVSxTQUFTO0lBcUZqQiw2RkFBNkY7SUFDN0YsTUFBYSxrQkFBbUIsU0FBUSxXQUFXO1FBQ2pEOztXQUVHO1FBQ0ksZ0JBQWdCLENBQUMsS0FBYSxFQUFFLFFBQThCLEVBQUUsUUFBNEM7WUFDakgsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBc0MsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFFRDs7V0FFRztRQUNJLG1CQUFtQixDQUFDLEtBQWEsRUFBRSxRQUE4QixFQUFFLFFBQTRDO1lBQ3BILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQXNDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMzRixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxhQUFhLENBQUMsTUFBb0I7WUFDdkMsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7S0FDRjtJQXJCWSw0QkFBa0IscUJBcUI5QixDQUFBO0lBRUQ7O09BRUc7SUFDSCxNQUFhLGlCQUFrQixTQUFRLGtCQUFrQjtpQkFDdEMsaUJBQVksR0FBc0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBRTNFO1lBQ0UsS0FBSyxFQUFFLENBQUM7UUFDVixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLFFBQXVCO1lBQ25FLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQWEsRUFBRSxRQUF1QjtZQUN0RSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBYTtZQUN2QyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzs7SUEzQlUsMkJBQWlCLG9CQTRCN0IsQ0FBQTtBQUNILENBQUMsRUE3SVMsU0FBUyxLQUFULFNBQVMsUUE2SWxCO0FDN0lELElBQVUsU0FBUyxDQTZNbEI7QUE3TUQsV0FBVSxTQUFTO0lBbUJqQiw0RkFBNEY7SUFFNUY7O09BRUc7SUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxPQUFlO1FBQ25ELElBQUksT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUMxQixJQUFJLFVBQVUsR0FBaUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDaEcsS0FBSyxJQUFJLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEtBQUssR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNwRCxJQUFJLEtBQUssWUFBWSxRQUFRO2dCQUMzQixTQUFTO1lBQ1gsOERBQThEO1lBQzlELGNBQWM7WUFDZCxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBWmUsK0JBQXFCLHdCQVlwQyxDQUFBO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBc0IsT0FBUSxTQUFRLFVBQUEsa0JBQWtCO1FBQ3REOztXQUVHO1FBQ0gseURBQXlEO1FBQ3pELHFFQUFxRTtRQUNyRSwyRUFBMkU7UUFDM0UsNENBQTRDO1FBQzVDLFFBQVE7UUFDUixRQUFRO1FBQ1IsSUFBSTtRQUVHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFpQixFQUFFLEtBQWU7WUFDakUsSUFBSSxHQUFHLEdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksT0FBTyxHQUFZLEVBQUUsQ0FBQztZQUMxQixJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTLEVBQUUsa0VBQWtFO2dCQUNoRyxPQUFPLFFBQVEsQ0FBQztZQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4RixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0gsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUMvQixDQUFDO1FBQ0Q7Ozs7V0FJRztRQUNJLFVBQVUsQ0FBQyxjQUF1QixLQUFLO1lBQzVDLElBQUksT0FBTyxHQUFZLEVBQUUsQ0FBQztZQUUxQiwyQ0FBMkM7WUFDM0MsS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLEtBQUssWUFBWSxRQUFRO29CQUMzQixTQUFTO2dCQUNYLElBQUksS0FBSyxZQUFZLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDckksU0FBUztnQkFDWCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFFRCxJQUFJLENBQUMsV0FBVztnQkFDZCwyQ0FBMkM7Z0JBQzNDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyw2QkFBNkI7WUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU1QixvRUFBb0U7WUFDcEUsS0FBSyxJQUFJLFNBQVMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLEtBQUssWUFBWSxPQUFPO29CQUMxQixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLEtBQUssWUFBWSxVQUFBLFlBQVk7b0JBQy9CLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNwRSxDQUFDO1lBRUQsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLHNCQUFzQjtZQUMzQixPQUE0QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEQsQ0FBQztRQUNEOzs7V0FHRztRQUNJLDBCQUEwQjtZQUMvQixPQUFnQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEQsQ0FBQztRQUNEOzs7V0FHRztRQUNILHlEQUF5RDtRQUN6RCxxREFBcUQ7UUFDckQsSUFBSTtRQUNKOzs7V0FHRztRQUNJLHdCQUF3QixDQUFDLFFBQWlCO1lBQy9DLElBQUksS0FBSyxHQUEwQixFQUFFLENBQUM7WUFDdEMsS0FBSyxJQUFJLFNBQVMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDO2dCQUN4QixJQUFJLEtBQUssR0FBdUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTO29CQUNsQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRO3dCQUM1QixJQUFJLEdBQWEsSUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7eUJBQ2hELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLFVBQVU7d0JBQ25DLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7O3dCQUVyQixJQUFJLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDMUIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNEOzs7V0FHRztRQUNJLGFBQWEsQ0FBQyxRQUFpQjtZQUNwQyxLQUFLLElBQUksU0FBUyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixJQUFJLEtBQUssR0FBVyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksS0FBSyxZQUFZLE9BQU87b0JBQzFCLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7O29CQUV6QyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQWEsSUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO1FBQ0Q7Ozs7V0FJRztRQUNJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBaUIsRUFBRSxhQUF1QixJQUFJLEVBQUUsa0JBQTJCLElBQUk7WUFDakcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM1QyxJQUFJLGVBQWU7Z0JBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLDhCQUFlLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUVEOztXQUVHO1FBQ08sS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFpQixFQUFFLFVBQXFCO1lBQ2pFLElBQUksT0FBTyxHQUFZLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsVUFBVTtnQkFDYixPQUFPLEdBQUcsUUFBUSxDQUFDOztnQkFFbkIsS0FBSyxJQUFJLFNBQVMsSUFBSSxVQUFVLEVBQUUsc0NBQXNDO29CQUN0RSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxXQUFXO3dCQUM5QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRS9DLEtBQUssSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7b0JBQy9CLFNBQVM7Z0JBQ1gsSUFBSSxNQUFNLEdBQVcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2xELElBQUksS0FBSyxHQUFxQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pELElBQUksTUFBTSxZQUFZLFVBQUEsWUFBWSxJQUFJLE1BQU0sWUFBWSxPQUFPO29CQUM3RCxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzs7b0JBRXhDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztLQU1GO0lBL0pxQixpQkFBTyxVQStKNUIsQ0FBQTtBQUNILENBQUMsRUE3TVMsU0FBUyxLQUFULFNBQVMsUUE2TWxCO0FDN01ELElBQVUsU0FBUyxDQXNUbEI7QUF0VEQsV0FBVSxTQUFTO0lBMkJqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNILE1BQXNCLFVBQVU7UUFDOUIsMkdBQTJHO2lCQUM1RixlQUFVLEdBQXNCLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBRWxFOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQWtCO1lBQ2hELEtBQUssSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLFVBQVU7Z0JBQ3BDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVO29CQUMzQyxPQUFPLElBQUksQ0FBQztZQUVoQixJQUFJLElBQUksR0FBVyxVQUFVLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsSUFBSTtnQkFDUCxLQUFLLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDN0MsSUFBSSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztvQkFDakYsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDVCxJQUFJLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7d0JBQy9CLE1BQU07b0JBQ1IsQ0FBQztnQkFDSCxDQUFDO1lBRUgsSUFBSSxDQUFDLElBQUk7Z0JBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO1lBRWhHLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUdEOzs7O1dBSUc7UUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQXFCO1lBQzNDLElBQUksYUFBYSxHQUFrQixFQUFFLENBQUM7WUFDdEMsc0RBQXNEO1lBQ3RELGlFQUFpRTtZQUNqRSxJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxJQUFJO2dCQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxtRkFBbUYsQ0FBQyxDQUFDO1lBQzNLLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUMsT0FBTyxhQUFhLENBQUM7WUFDckIsOEJBQThCO1FBQ2hDLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUMzRCxJQUFJLFdBQXlCLENBQUM7WUFDOUIsSUFBSSxJQUFZLENBQUM7WUFDakIsSUFBSSxDQUFDO2dCQUNILHNFQUFzRTtnQkFDdEUsS0FBSyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQzVCLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQyxXQUFXLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUNsRSxPQUFPLFdBQVcsQ0FBQztnQkFDckIsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixJQUFJLE9BQU8sR0FBVyxzQkFBc0IsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxHQUFHLE1BQU0sQ0FBQztnQkFDbkksTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBeUIsS0FBa0IsRUFBRSxRQUF3QjtZQUMvRixJQUFJLGNBQWMsR0FBb0IsRUFBRSxDQUFDO1lBQ3pDLElBQUksSUFBSSxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxJQUFJO2dCQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLEtBQUssQ0FBQyxJQUFJLG1GQUFtRixDQUFDLENBQUM7WUFFN0osS0FBSyxJQUFJLE1BQU0sSUFBSSxRQUFRO2dCQUN6QixjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBRTFDLElBQUksYUFBYSxHQUFrQixFQUFFLENBQUM7WUFDdEMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUNyQyxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxjQUE2QjtZQUNoRSxJQUFJLGFBQWEsR0FBbUIsRUFBRSxDQUFDO1lBQ3ZDLElBQUksU0FBaUMsQ0FBQztZQUN0QyxJQUFJLGNBQWMsR0FBb0IsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQztnQkFDSCxzRUFBc0U7Z0JBQ3RFLEtBQUssSUFBSSxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ2hDLFNBQVMsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QyxjQUFjLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0QyxNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxNQUFNLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBRUQsS0FBSyxJQUFJLGFBQWEsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxZQUFZLEdBQWlCLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDOUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBRUQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVELDhIQUE4SDtRQUM5SDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWEsSUFBWSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFL0Q7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUE2QjtZQUNuRCxtRkFBbUY7WUFDbkYsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksTUFBTSxHQUFXLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBYTtZQUMvQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBYTtZQUNyQyxJQUFJLFdBQVcsR0FBMkIsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzRSxJQUFJLGNBQWMsR0FBaUIsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNyRCxPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO1FBRUQscUhBQXFIO1FBQ3JIOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBeUIsS0FBYTtZQUNoRSxJQUFJLFFBQVEsR0FBVyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxTQUFTLEdBQVcsVUFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsU0FBUztnQkFDWixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxLQUFLLHlEQUF5RCxDQUFDLENBQUM7WUFDaEksT0FBaUIsU0FBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRDs7O1dBR0c7UUFDSyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQXFCO1lBQzlDLElBQUksUUFBUSxHQUFXLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2hELG9EQUFvRDtZQUNwRCxLQUFLLElBQUksYUFBYSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxLQUFLLEdBQXNCLFVBQVUsQ0FBQyxVQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9FLElBQUksS0FBSyxJQUFJLE9BQU8sWUFBWSxLQUFLO29CQUNuQyxPQUFPLGFBQWEsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDO1lBQzFDLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7O1dBR0c7UUFDSyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQWE7WUFDdkMsSUFBSSxhQUFhLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDM0QsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsT0FBZTtZQUNoRSxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU87Z0JBQ3RCLElBQWMsT0FBUSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVU7b0JBQ3hDLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzs7SUFwTW1CLG9CQUFVLGFBcU0vQixDQUFBO0lBS0Q7Ozs7T0FJRztJQUNILFNBQWdCLGlDQUFpQyxDQUFrRCxLQUFZO1FBQzdHLE1BQWUsNEJBQTZCLFNBQVEsS0FBSztZQUF6RDs7Z0JBR1MsV0FBTSxHQUFvQixVQUFBLGVBQWUsQ0FBQyxPQUFPLENBQUM7WUFrQjNELENBQUM7WUFoQkM7O2VBRUc7WUFDSSxTQUFTLENBQUMsU0FBa0IsS0FBSztnQkFDdEMsTUFBTSxhQUFhLEdBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25ILGFBQWEsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7Z0JBQ3BELElBQUksQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQztnQkFDOUIsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN4QyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixDQUFDO1NBR0Y7UUFBQSxDQUFDO1FBRUYsSUFBSSxLQUFLLENBQUMsU0FBUyxZQUFZLFVBQUEsT0FBTyxFQUFFLENBQUM7WUFDdkM7OztlQUdHO1lBQ0gsU0FBUyx3Q0FBd0MsQ0FBb0UsS0FBWTtnQkFDL0gsTUFBZSxtQ0FBb0MsU0FBUSxLQUFLO29CQUN2RCxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWlCLEVBQUUsYUFBdUIsSUFBSSxFQUFFLGtCQUEyQixJQUFJO3dCQUNqRyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDaEQsSUFBSSxRQUFRLENBQUMsR0FBRyxJQUFJLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFNBQVM7NEJBQ3pELE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUN0QixDQUFDO29CQUVTLGFBQWEsQ0FBQyxRQUFpQjt3QkFDdkMsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDO29CQUN6QixDQUFDO2lCQUNGO2dCQUVELE9BQU8sbUNBQW1DLENBQUM7WUFDN0MsQ0FBQztZQUVELE9BQU8sd0NBQXdDLENBQThELDRCQUE0QixDQUFDLENBQUM7UUFDN0ksQ0FBQztRQUVELE9BQU8sNEJBQTRCLENBQUM7SUFDdEMsQ0FBQztJQWpEZSwyQ0FBaUMsb0NBaURoRCxDQUFBO0FBQ0gsQ0FBQyxFQXRUUyxTQUFTLEtBQVQsU0FBUyxRQXNUbEI7QUN0VEQsSUFBVSxTQUFTLENBdW5CbEI7QUF2bkJELFdBQVUsU0FBUztJQUtqQjs7OztPQUlHO0lBQ0gsTUFBYSxJQUFLLFNBQVEsVUFBQSxrQkFBa0I7UUFrQjFDLHVCQUF1QixDQUFTO1FBQ2hDLGdCQUFnQixDQUFZO1FBRTVCOztXQUVHO1FBQ0gsWUFBbUIsS0FBYTtZQUM5QixLQUFLLEVBQUUsQ0FBQztZQXZCTSxhQUFRLEdBQWMsVUFBQSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEQsb0JBQWUsR0FBVyxDQUFDLENBQUM7WUFDbkMscUZBQXFGO1lBQzlFLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1lBQ2xDLGlJQUFpSTtZQUMxSCxXQUFNLEdBQVcsQ0FBQyxDQUFDO1lBRWxCLFdBQU0sR0FBZ0IsSUFBSSxDQUFDLENBQUMsMkJBQTJCO1lBQ3ZELGFBQVEsR0FBVyxFQUFFLENBQUMsQ0FBQyw4Q0FBOEM7WUFDckUsZUFBVSxHQUF5QixFQUFFLENBQUM7WUFDOUMsbUhBQW1IO1lBQ25ILDRHQUE0RztZQUNwRyxjQUFTLEdBQTJCLEVBQUUsQ0FBQztZQUN2QyxhQUFRLEdBQTJCLEVBQUUsQ0FBQztZQUN0QyxXQUFNLEdBQVksSUFBSSxDQUFDO1lBc0wvQjs7O2VBR0c7WUFDSCw4REFBOEQ7WUFDOUMsZ0JBQVcsR0FBMkIsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQWpMbEUsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDcEIsQ0FBQztRQUVEOzs7OztXQUtHO1FBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUF1QixFQUFFLEdBQXFCO1lBQ3ZFLE1BQU0sSUFBSSxHQUFTLEtBQUssWUFBWSxVQUFBLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ25FLE1BQU0sRUFBRSxHQUFTLEdBQUcsWUFBWSxVQUFBLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzNELElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFO2dCQUNkLE9BQU8sSUFBSSxDQUFDO1lBRWQsdUNBQXVDO1lBQ3ZDLElBQUksUUFBUSxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxJQUFJLE1BQU0sR0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsSUFBSSxRQUFRLEdBQVMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sUUFBUSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDcEUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLENBQUM7WUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXpCLElBQUksQ0FBQyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDO1lBRWQsdUJBQXVCO1lBQ3ZCLElBQUksY0FBYyxHQUFhLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGlDQUFpQztZQUNqRyxJQUFJLGdCQUFnQixHQUFhLE1BQU07aUJBQ3BDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2lCQUNoRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEIsSUFBSSxLQUFLLFlBQVksVUFBQSxTQUFTO2dCQUM1QixjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLElBQUksR0FBRyxZQUFZLFVBQUEsU0FBUztnQkFDMUIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRWpHLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHVFQUF1RTtRQUNuSSxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsSUFBSSxDQUF1QixLQUF1QixFQUFFLEtBQWE7WUFDN0UsSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDYixPQUFVLEtBQUssQ0FBQztZQUVsQixJQUFJLElBQUksR0FBYSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksRUFBRSxHQUFZLEtBQUssQ0FBQztZQUV4QixPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRTtnQkFDdEIsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRXJDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELElBQVcsUUFBUTtZQUNqQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxZQUFZO1lBQ3JCLE9BQTJCLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBQSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVEOzs7V0FHRztRQUNILElBQVcsUUFBUTtZQUNqQixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxJQUFXLGVBQWU7WUFDeEIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLGVBQWU7Z0JBQ3RELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9CLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsU0FBUztZQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzlCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxDQUFFLFdBQVcsQ0FBQyxVQUFtQixLQUFLO1lBQzNDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksQ0FBQztnQkFDWCxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRO29CQUM3QixLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksUUFBUSxDQUFDLEdBQVk7WUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQywwQ0FBcUIsQ0FBQyw2Q0FBc0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQywwQ0FBcUIsQ0FBQyw2Q0FBc0IsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELG9CQUFvQjtRQUNwQjs7V0FFRztRQUNJLFNBQVM7WUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksV0FBVztZQUNoQixJQUFJLFFBQVEsR0FBUyxJQUFJLENBQUM7WUFDMUIsT0FBTyxRQUFRLENBQUMsU0FBUyxFQUFFO2dCQUN6QixRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFRDs7V0FFRztRQUNJLE9BQU87WUFDWixJQUFJLFFBQVEsR0FBUyxJQUFJLENBQUM7WUFDMUIsSUFBSSxJQUFJLEdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixPQUFPLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOztXQUVHO1FBQ0ksUUFBUSxDQUFDLE1BQWM7WUFDNUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFFRDs7V0FFRztRQUNJLFdBQVc7WUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxpQkFBaUIsQ0FBQyxLQUFhO1lBQ3BDLElBQUksS0FBSyxHQUFXLEVBQUUsQ0FBQztZQUN2QixLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFXLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7WUFDbkUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBbUJNLFFBQVEsQ0FBQyxNQUFZLEVBQUUsTUFBZTtZQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sSUFBSSxTQUFTO2dCQUN2RCxtQ0FBbUM7Z0JBQ25DLE9BQU87WUFFVCxJQUFJLFlBQVksR0FBWSxLQUFLLENBQUM7WUFDbEMsSUFBSSxhQUFhLEdBQVMsVUFBQSxZQUFZLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDckUsSUFBSSxRQUFRLEdBQVMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sUUFBUSxFQUFFLENBQUM7Z0JBQ2hCLFFBQVEsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QixZQUFZLEdBQUcsWUFBWSxJQUFJLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLFFBQVEsSUFBSSxNQUFNO29CQUNwQixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsd0ZBQXdGLENBQUMsQ0FBQyxDQUFDOztvQkFFNUcsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDL0IsQ0FBQztZQUVELElBQUksY0FBYyxHQUFTLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDekMsSUFBSSxjQUFjLElBQUksSUFBSSxJQUFJLE1BQU0sR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDckUsTUFBTSxFQUFFLENBQUM7WUFFWCxJQUFJLGNBQWM7Z0JBQ2hCLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNoRSxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNyQixNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyx5Q0FBcUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksWUFBWTtnQkFDZCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSywwREFBMEIsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRDs7V0FFRztRQUNJLFdBQVcsQ0FBQyxNQUFZO1lBQzdCLElBQUksS0FBSyxHQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0MsSUFBSSxLQUFLLEdBQUcsQ0FBQztnQkFDWCxPQUFPO1lBRVQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUsseUNBQXFCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2RSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyw4Q0FBdUIsQ0FBQyxDQUFDO1lBQ3hELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDakUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssNERBQTBCLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksaUJBQWlCO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO2dCQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxTQUFTLENBQUMsT0FBYTtZQUM1QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRDs7V0FFRztRQUNJLFlBQVksQ0FBQyxRQUFjLEVBQUUsS0FBVztZQUM3QyxJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLElBQUksS0FBSyxHQUFHLENBQUM7Z0JBQ1gsT0FBTyxLQUFLLENBQUM7WUFFZixJQUFJLGNBQWMsR0FBUyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0MsSUFBSSxjQUFjO2dCQUNoQixjQUFjLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXBDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzdCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBRXBCLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLHlDQUFxQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUNqRSxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSywwREFBMEIsQ0FBQyxDQUFDO1lBRTVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOztXQUVHO1FBQ0ksU0FBUyxDQUFDLGdCQUF3QjtZQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRDs7V0FFRztRQUNJLGNBQWMsQ0FBQyxTQUFlO1lBQ25DLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQztZQUN0QixPQUFPLElBQUksSUFBSSxJQUFJLElBQUksU0FBUztnQkFDOUIsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDckIsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxjQUFjLENBQUMsUUFBaUI7WUFDckMsSUFBSSxZQUFZLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzdCLEtBQUssTUFBTSxhQUFhLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNoRCxJQUFJLGdCQUFnQixHQUFnQixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsb0RBQW9EO29CQUN4SCxJQUFJLGVBQWUsR0FBYyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNwRSxJQUFJLGdCQUFnQixJQUFJLFNBQVMsSUFBSSxlQUFlLElBQUksU0FBUyxFQUFFLENBQUM7d0JBQ2xFLEtBQUssTUFBTSxDQUFDLElBQUksZUFBZSxFQUFFLENBQUM7NEJBQ2hDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUM5RCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLFVBQVUsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsS0FBSyxNQUFNLFNBQVMsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzFDLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7d0JBQzFELFNBQVMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUN6RCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELGFBQWE7UUFFYixxQkFBcUI7UUFDckI7O1dBRUc7UUFDSSxnQkFBZ0I7WUFDckIsSUFBSSxHQUFHLEdBQWdCLEVBQUUsQ0FBQztZQUMxQixLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRDs7V0FFRztRQUNJLGFBQWEsQ0FBc0IsTUFBbUI7WUFDM0QsT0FBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0Q7O1dBRUc7UUFDSSxZQUFZLENBQXNCLE1BQW1CO1lBQzFELElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xELElBQUksSUFBSTtnQkFDTixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxVQUFxQjtZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRDs7V0FFRztRQUNJLFlBQVksQ0FBQyxVQUFxQjtZQUN2QyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksSUFBSTtnQkFDekIsT0FBTztZQUNULElBQUksT0FBTyxHQUFnQixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RCxJQUFJLE9BQU8sS0FBSyxTQUFTO2dCQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM3QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLFdBQVc7Z0JBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxVQUFVLENBQUMsSUFBSSxzRUFBc0UsQ0FBQyxDQUFDOztnQkFFcEgsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUUzQixVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlCLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLDBDQUFxQixDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksV0FBVywyQ0FBc0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsbUNBQW1DO1FBQ25JLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxVQUFxQjtZQUNqQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRDs7V0FFRztRQUNJLGdCQUFnQixDQUFDLE1BQTJCO1lBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFFRDs7V0FFRztRQUNJLGVBQWUsQ0FBQyxVQUFxQjtZQUMxQyxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxnQkFBZ0IsR0FBZ0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JFLElBQUksT0FBTyxHQUFXLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxPQUFPLEdBQUcsQ0FBQztvQkFDYixPQUFPO2dCQUNULFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLGdEQUF3QixDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLFdBQVcsaURBQXlCLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHNDQUFzQztnQkFDdkksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEMsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsVUFBVSxtQkFBbUIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDNUYsQ0FBQztRQUNILENBQUM7UUFDRCxhQUFhO1FBRWIsd0JBQXdCO1FBQ2pCLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDcEIsQ0FBQztZQUVGLElBQUksVUFBVSxHQUFrQixFQUFFLENBQUM7WUFDbkMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLEtBQUssSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUM1QyxnREFBZ0Q7b0JBQ2hELFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELENBQUM7WUFDSCxDQUFDO1lBQ0QsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUV6QyxJQUFJLFFBQVEsR0FBb0IsRUFBRSxDQUFDO1lBQ25DLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUEsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBRXJDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLDhDQUF1QixDQUFDLENBQUM7WUFDckQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ2hDLGdEQUFnRDtZQUVoRCwrRUFBK0U7WUFDL0UsS0FBSyxJQUFJLElBQUksSUFBSSxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzNDLEtBQUssSUFBSSxtQkFBbUIsSUFBSSxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2hFLElBQUkscUJBQXFCLEdBQXlCLE1BQU0sVUFBQSxVQUFVLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQ3BHLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLGNBQWMsQ0FBQyxRQUFRO2dCQUN6QixLQUFLLElBQUksZUFBZSxJQUFJLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEQsSUFBSSxpQkFBaUIsR0FBZSxNQUFNLFVBQUEsVUFBVSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDbEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDO1lBRUgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssa0RBQXlCLENBQUMsQ0FBQztZQUN2RCxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDM0MsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssa0RBQXlCLENBQUMsQ0FBQztZQUU5RCx3Q0FBd0M7WUFDeEMsNkRBQTZEO1lBQzdELG1EQUFtRDtZQUNuRCx3RkFBd0Y7WUFDeEYsb0ZBQW9GO1lBQ3BGLG9GQUFvRjtZQUNwRixLQUFLO1lBQ0wsK0VBQStFO1lBQy9FLCtFQUErRTtZQUUvRSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxhQUFhO1FBRWI7O1dBRUc7UUFDSSxpQkFBaUIsQ0FBQyxRQUFjLElBQUksRUFBRSxTQUFpQixDQUFDO1lBQzdELHdDQUF3QztZQUN4QyxJQUFJLENBQUMsS0FBSztnQkFDUixLQUFLLEdBQUcsSUFBSSxDQUFDO1lBRWYsSUFBSSxNQUFNLEdBQVcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV4QyxJQUFJLE1BQU0sR0FBVyxNQUFNLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ3ZELEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLFVBQVU7Z0JBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDdkYsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3ZDLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxpQkFBaUI7UUFDakI7OztXQUdHO1FBQ0ksZ0JBQWdCLENBQUMsS0FBcUIsRUFBRSxRQUE4QixFQUFFLFdBQWtELEtBQUs7WUFDcEksSUFBSSxhQUFhLEdBQTJCLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN0RixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztnQkFDdkIsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM1QixhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRDs7V0FFRztRQUNJLG1CQUFtQixDQUFDLEtBQXFCLEVBQUUsUUFBOEIsRUFBRSxXQUFrRCxLQUFLO1lBQ3ZJLElBQUksZ0JBQWdCLEdBQTJCLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RyxJQUFJLGdCQUFnQjtnQkFDbEIsS0FBSyxJQUFJLENBQUMsR0FBVyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUMzRCxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVE7d0JBQ2pDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNEOzs7O1dBSUc7UUFDSSxhQUFhLENBQUMsTUFBYTtZQUNoQyxJQUFJLFNBQVMsR0FBVyxFQUFFLENBQUM7WUFDM0IsSUFBSSxRQUFRLEdBQVMsSUFBSSxDQUFDO1lBQzFCLHlCQUF5QjtZQUN6QixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLDRGQUE0RjtZQUM1RixPQUFPLFFBQVEsQ0FBQyxNQUFNO2dCQUNwQixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQU8sSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXRHLGdCQUFnQjtZQUNoQixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUM5RixLQUFLLElBQUksQ0FBQyxHQUFXLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdkQsSUFBSSxRQUFRLEdBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFFRCxlQUFlO1lBQ2YsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDeEYsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUNqQixPQUFPLElBQUksQ0FBQztZQUVkLGVBQWU7WUFDZixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUM3RixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLFFBQVEsR0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3BGLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLENBQUMsc0VBQXNFO1FBQ3JGLENBQUM7UUFDRDs7V0FFRztRQUNJLHlCQUF5QixDQUFDLE1BQWE7WUFDNUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDeEYsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsMkVBQTJFO1lBQ3BJLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNEOzs7V0FHRztRQUNJLGNBQWMsQ0FBQyxNQUFhO1lBQ2pDLG1DQUFtQztZQUNuQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUM5RixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRU8sdUJBQXVCLENBQUMsTUFBYTtZQUMzQyxxQkFBcUI7WUFDckIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRixJQUFJLFFBQVEsR0FBMkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hFLEtBQUssSUFBSSxPQUFPLElBQUksUUFBUTtnQkFDMUIsYUFBYTtnQkFDYixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIseUNBQXlDO1lBQ3pDLHdEQUF3RDtZQUN4RCx1QkFBdUI7WUFDdkIsTUFBTTtZQUVOLG9CQUFvQjtZQUNwQixLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDaEMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO1FBRU8sYUFBYSxDQUFDLFVBQWtDLEVBQUUsTUFBYTtZQUNyRSxJQUFJLFVBQVUsRUFBRSxNQUFNLEdBQUcsQ0FBQztnQkFDeEIsS0FBSyxJQUFJLE9BQU8sSUFBSSxVQUFVO29CQUM1QixhQUFhO29CQUNiLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixDQUFDO0tBRUY7SUE1bUJZLGNBQUksT0E0bUJoQixDQUFBO0FBQ0gsQ0FBQyxFQXZuQlMsU0FBUyxLQUFULFNBQVMsUUF1bkJsQjtBQ3ZuQkQsa0RBQWtEO0FBQ2xELCtDQUErQztBQUMvQyxJQUFVLFNBQVMsQ0FnSGxCO0FBbEhELGtEQUFrRDtBQUNsRCwrQ0FBK0M7QUFDL0MsV0FBVSxTQUFTO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFzQixTQUFVLFNBQVEsVUFBQSxPQUFPO1FBRzdDLGtHQUFrRztpQkFDM0UsY0FBUyxHQUFxQixTQUFTLEFBQTlCLENBQStCO1FBQy9ELHFGQUFxRjtpQkFDOUQsZUFBVSxHQUF1QixFQUFFLEFBQXpCLENBQTBCO1FBSTNELEtBQUssQ0FBcUI7UUFFMUI7WUFDRSxLQUFLLEVBQUUsQ0FBQztZQUxBLGNBQVMsR0FBWSxJQUFJLENBQUM7WUFDMUIsV0FBTSxHQUFZLElBQUksQ0FBQztZQUNqQyxVQUFLLEdBQWdCLElBQUksQ0FBQztZQUl4QixJQUFJLENBQUMsZ0JBQWdCLDhCQUFlLENBQUMsTUFBbUIsRUFBRSxFQUFFO2dCQUMxRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZix1RUFBdUU7b0JBQ3ZFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztvQkFDL0IsWUFBWTtvQkFDWixNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN2RixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVTLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUEyQixJQUFZLE9BQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUczSCxJQUFXLFFBQVE7WUFDakIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsV0FBVztZQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFFRDs7V0FFRztRQUNJLFFBQVEsQ0FBQyxHQUFZO1lBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsb0RBQTBCLENBQUMsdURBQTJCLENBQUMsQ0FBQyxDQUFDO1FBQzdGLENBQUM7UUFFRDs7V0FFRztRQUNJLFlBQVksQ0FBQyxVQUF1QjtZQUN6QyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksVUFBVTtnQkFDMUIsT0FBTztZQUNULElBQUksaUJBQWlCLEdBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN6QyxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxpQkFBaUI7b0JBQ25CLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLEtBQUs7b0JBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsQ0FBQztZQUFDLE9BQU8sTUFBTSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7UUFZRCxrQkFBa0I7UUFDWCxTQUFTO1lBQ2QsSUFBSSxhQUFhLEdBQWtCO2dCQUNqQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDcEIsQ0FBQztZQUNGLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFDTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBaUIsRUFBRSxhQUF1QixJQUFJLEVBQUUsa0JBQTJCLElBQUk7WUFDakcsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDMUQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFdBQVc7Z0JBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFUyxhQUFhLENBQUMsUUFBaUI7WUFDdkMsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQzFCLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUMzQixDQUFDOztJQXZHbUIsbUJBQVMsWUF5RzlCLENBQUE7QUFDSCxDQUFDLEVBaEhTLFNBQVMsS0FBVCxTQUFTLFFBZ0hsQjtBQ2xIRCxJQUFVLFNBQVMsQ0E4RWxCO0FBOUVELFdBQVUsU0FBUztJQUNqQjs7OztPQUlHO0lBQ0gsTUFBYSxjQUFjO1FBQ3pCLE9BQU8sR0FBVyxDQUFDLENBQUM7UUFDcEIsTUFBTSxHQUFhLElBQUksS0FBSyxFQUFLLENBQUM7UUFDbEMsc0JBQXNCO1FBRXRCLG9DQUFvQztRQUNwQyxrREFBa0Q7UUFDbEQsd0JBQXdCO1FBQ3hCLElBQUk7UUFFSixJQUFXLE1BQU07WUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksS0FBSztZQUNWLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFFRDs7V0FFRztRQUNJLE9BQU87WUFDWixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxJQUFJLENBQUMsTUFBUztZQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDbkMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7UUFFRDs7V0FFRztRQUNJLEdBQUc7WUFDUixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRDs7O1dBR0c7UUFDSCx3QkFBd0I7UUFDeEIsNkNBQTZDO1FBQzdDLHNCQUFzQjtRQUN0QiwwQ0FBMEM7UUFDMUMsTUFBTTtRQUNOLGdEQUFnRDtRQUNoRCx3Q0FBd0M7UUFDeEMsSUFBSTtRQUVHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtnQkFDM0MsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRDs7V0FFRztRQUNJLFNBQVMsQ0FBQyxLQUE2QjtZQUM1QyxJQUFJLE1BQU0sR0FBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGO0lBdkVZLHdCQUFjLGlCQXVFMUIsQ0FBQTtBQUNILENBQUMsRUE5RVMsU0FBUyxLQUFULFNBQVMsUUE4RWxCO0FDOUVELElBQVUsU0FBUyxDQXNCbEI7QUF0QkQsV0FBVSxTQUFTO0lBRWpCOzs7T0FHRztJQUNILE1BQWEsY0FBYztRQUV6Qjs7O1dBR0c7UUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQXNCLEVBQUUsU0FBZ0M7WUFDM0UsSUFBSSxTQUFTLEdBQWEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2YsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RSxDQUFDO1lBQ0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFDN0QsS0FBSyxFQUFFLFNBQVM7YUFDakIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGO0lBZlksd0JBQWMsaUJBZTFCLENBQUE7QUFDSCxDQUFDLEVBdEJTLFNBQVMsS0FBVCxTQUFTLFFBc0JsQjtBQ3RCRCxJQUFVLFNBQVMsQ0FzTGxCO0FBdExELFdBQVUsU0FBUztJQUVqQjs7O09BR0c7SUFDSCxNQUFhLG9CQUFvQjtRQUMvQjs7V0FFRztRQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBc0I7WUFDM0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFO2dCQUNoRCxLQUFLLEVBQUUsb0JBQW9CLENBQUMsVUFBVTthQUN2QyxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUU7Z0JBQ25ELEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxhQUFhO2FBQzFDLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRTtnQkFDbkQsS0FBSyxFQUFFLG9CQUFvQixDQUFDLGFBQWE7YUFDMUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFVBQVU7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO2dCQUNmLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUV2QixJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsYUFBYTtZQUN6QixJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDdkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFFUyxNQUFNLENBQUMsYUFBYTtZQUM1QixVQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELElBQUksSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JFLElBQUksT0FBTyxHQUFpQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFakQsSUFBSSxDQUFDO2dCQUNILElBQUksU0FBUyxHQUFnQixhQUFhLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQy9HLElBQUksV0FBVyxHQUFnQixhQUFhLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsc0JBQXNCLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRXJILElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBYyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxVQUFBLFdBQVcsQ0FBQyxNQUFNLENBQWMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFMUIsSUFBSSxLQUFLLEdBQVcsVUFBQSxXQUFXLENBQUMsTUFBTSxDQUFTLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNoRixJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztnQkFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsRUFBRSxDQUFDO2dCQUVqQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQ2pDLE1BQU0sVUFBVSxHQUFXLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsVUFBQSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN4RixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFBLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdFLENBQUM7Z0JBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNoRixJQUFJLENBQUMsVUFBQSxXQUFXLENBQUMsU0FBUzt3QkFDeEIsVUFBQSxXQUFXLENBQUMsU0FBUyxHQUFHLGVBQWUsRUFBRSxDQUFDO29CQUM1QyxJQUFJLENBQUMsVUFBQSxXQUFXLENBQUMsd0JBQXdCO3dCQUN2QyxVQUFBLFdBQVcsQ0FBQyx3QkFBd0IsR0FBRyw4QkFBOEIsRUFBRSxDQUFDO29CQUUxRSxvQ0FBb0M7b0JBQ3BDLE1BQU0sVUFBVSxHQUFXLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsVUFBQSxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMxRixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFBLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9FLENBQUM7Z0JBRUQsTUFBTSxVQUFVLEdBQVcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxVQUFBLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZGLElBQUksVUFBVSxJQUFJLHNCQUFzQixDQUFDLGFBQWE7b0JBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQUEsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU5RSxDQUFDO1lBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztnQkFDaEIsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQixRQUFRLENBQUM7WUFDWCxDQUFDO1lBRUQsU0FBUyxhQUFhLENBQUMsV0FBbUIsRUFBRSxXQUFtQjtnQkFDN0QsSUFBSSxXQUFXLEdBQWdCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLEtBQUssR0FBVyxVQUFBLFdBQVcsQ0FBQyxNQUFNLENBQVMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25GLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO29CQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUV6QixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO2dCQUNELG9DQUFvQztnQkFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztvQkFDakYsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUMxQyxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUNELE9BQU8sV0FBVyxDQUFDO1lBQ3JCLENBQUM7WUFFRCxTQUFTLGdCQUFnQjtnQkFDdkIsSUFBSSxrQkFBa0IsR0FBK0IsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLGNBQWMsR0FBVyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3pHLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDaEQsSUFBSSxhQUFhLEdBQW9CLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBa0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0csSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUNuQixNQUFNO29CQUNSLENBQUM7b0JBRUQsa0JBQWtCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUvRixDQUFDO2dCQUNELE9BQU8sa0JBQWtCLENBQUM7WUFDNUIsQ0FBQztZQUVELFNBQVMsY0FBYztnQkFDckIsSUFBSSxnQkFBZ0IsR0FBNkMsRUFBRSxDQUFDO2dCQUNwRSxJQUFJLFlBQVksR0FBVyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNyRyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQzlDLElBQUksSUFBSSxHQUFvQixVQUFBLFdBQVcsQ0FBQyxNQUFNLENBQWtCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbkcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNWLE1BQU07b0JBQ1IsQ0FBQztvQkFDRCxJQUFJLFFBQVEsR0FBeUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2pGLElBQUksUUFBUTt3QkFDVixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBQSxXQUFXLENBQUMsTUFBTSxDQUF1QixRQUFRLENBQUMsQ0FBQztnQkFDckYsQ0FBQztnQkFDRCxPQUFPLGdCQUFnQixDQUFDO1lBQzFCLENBQUM7WUFFRCxTQUFTLGVBQWU7Z0JBQ3RCLE1BQU0sVUFBVSxHQUFXLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsVUFBQSxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxRixNQUFNLFNBQVMsR0FBVyxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztnQkFFakgsTUFBTSxHQUFHLEdBQWdCLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JGLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFVBQUEsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBRS9GLE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQztZQUVELFNBQVMsOEJBQThCO2dCQUNyQyxNQUFNLGdCQUFnQixHQUFhO29CQUNqQyxzQkFBc0I7b0JBQ3RCLGdCQUFnQjtvQkFDaEIsZUFBZTtvQkFDZixvQkFBb0I7b0JBQ3BCLDJCQUEyQjtvQkFDM0IscUJBQXFCO29CQUNyQixvQkFBb0I7aUJBQ3JCLENBQUM7Z0JBRUYsTUFBTSxrQkFBa0IsR0FBdUIsSUFBSSxDQUFDLGlCQUFpQixDQUNuRSxPQUFPLEVBQ1AsZ0JBQWdCLENBQ2pCLENBQUM7Z0JBRUYsTUFBTSxrQkFBa0IsR0FBYSxJQUFJLENBQUMsaUJBQWlCLENBQ3pELE9BQU8sRUFDUCxrQkFBa0IsRUFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FDcEIsQ0FBQztnQkFFRixNQUFNLHVCQUF1QixHQUFnRCxFQUFFLENBQUM7Z0JBQ2hGLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBRXpHLE9BQU8sdUJBQXVCLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7S0FDRjtJQS9LWSw4QkFBb0IsdUJBK0toQyxDQUFBO0FBQ0gsQ0FBQyxFQXRMUyxTQUFTLEtBQVQsU0FBUyxRQXNMbEI7QUN0TEQsSUFBVSxTQUFTLENBNEVsQjtBQTVFRCxXQUFVLFNBQVM7SUFFakI7OztPQUdHO0lBQ0gsTUFBYSxrQkFBbUIsU0FBUSxVQUFBLGNBQWM7UUFDcEQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQXNCO1lBQzNDLFVBQUEsY0FBYyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRVMsTUFBTSxDQUFDLGlCQUFpQixDQUFvQixPQUFzQixFQUFFLFlBQStCO1lBQzNHLElBQUksT0FBTyxHQUF5QixPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25FLElBQUksS0FBSyxHQUFVLFVBQUEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0RSxVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDbkUsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFFUyxNQUFNLENBQUMsbUJBQW1CLENBQXNCLE9BQXNCLEVBQUUsWUFBK0I7WUFDL0csa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDdkUsSUFBSSxPQUE2QixDQUFDO1lBQ2xDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3pDLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUMsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwRSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxQyxVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzNDLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVTLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBcUIsT0FBc0IsRUFBRSxZQUErQjtZQUM3RyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUV2RSxJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBQSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBQSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBRVMsTUFBTSxDQUFDLDJCQUEyQixDQUE4QixPQUFzQixFQUFFLFlBQStCO1lBQy9ILGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBRXpFLElBQUksSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQUEsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFFUyxNQUFNLENBQUMsa0NBQWtDLENBQXFDLE9BQXNCLEVBQUUsWUFBK0I7WUFDN0ksa0JBQWtCLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFakYsSUFBSSxJQUFJLEdBQTJCLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBQSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQUEsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQUEsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25HLENBQUM7UUFFUyxNQUFNLENBQUMsY0FBYyxDQUFpQixPQUFzQixFQUFFLFlBQStCO1lBQ3JHLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBRXpFLElBQUksSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQUEsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFBLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFBLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRixDQUFDO1FBRVMsTUFBTSxDQUFDLHNCQUFzQixDQUFpQixPQUFzQixFQUFFLFlBQStCO1lBQzdHLGtCQUFrQixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBRWpGLElBQUksSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQUEsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFBLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFBLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRixDQUFDO0tBQ0Y7SUFyRVksNEJBQWtCLHFCQXFFOUIsQ0FBQTtBQUNILENBQUMsRUE1RVMsU0FBUyxLQUFULFNBQVMsUUE0RWxCO0FDNUVELElBQVUsU0FBUyxDQXFIbEI7QUFySEQsV0FBVSxTQUFTO0lBRWpCOzs7T0FHRztJQUNILE1BQWEsa0JBQWtCO1FBRTdCOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFzQjtZQUMzQyxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ2hFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxnQkFBZ0I7YUFDM0MsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFO2dCQUNoRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsZ0JBQWdCO2FBQzNDLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFBRTtnQkFDbkUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLG1CQUFtQjthQUM5QyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRVMsTUFBTSxDQUFDLGdCQUFnQjtZQUMvQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRztvQkFDeEIsUUFBUSxFQUFFLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7b0JBQ3JGLE9BQU8sRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7b0JBQzNGLE9BQU8sRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO29CQUNuRixVQUFVLEVBQUUsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztvQkFDekYsTUFBTSxFQUFFLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7b0JBQ2pGLFFBQVEsRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO29CQUNyRixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTTtpQkFDekMsQ0FBQztnQkFFRixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSztvQkFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFM0csSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87b0JBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakgsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFFL0IsU0FBUyxZQUFZLENBQUMsS0FBYSxFQUFFLE1BQStDO2dCQUNsRixNQUFNLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdkUsSUFBSSxNQUFNLEdBQWdCLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBYyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFFUyxNQUFNLENBQUMsZ0JBQWdCLENBQWEsT0FBc0IsRUFBRSxlQUEwQixFQUFFLGNBQXlCLEVBQUUsR0FBWTtZQUN2SSxJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLGFBQWEsR0FBa0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFM0QsSUFBSSxPQUE2QixDQUFDO1lBRWxDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFNUQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMvQyxJQUFJLE9BQU87Z0JBQ1QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFL0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUNyRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLElBQUksWUFBWSxHQUFjLFVBQUEsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDdEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUVELHFFQUFxRTtZQUNyRSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxJQUFJLE9BQU87Z0JBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFL0Isa0JBQWtCLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0Qsa0JBQWtCLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUQsa0JBQWtCLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEUsa0JBQWtCLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUQsa0JBQWtCLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFOUQsTUFBTSxLQUFLLEdBQVcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7WUFDRCxrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUU3RCxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVwRixPQUFPLGFBQWEsQ0FBQztZQUVyQixTQUFTLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxPQUFvQixFQUFFLEtBQWE7Z0JBQzVFLElBQUksU0FBUyxHQUFXLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xELElBQUksU0FBUyxJQUFJLFNBQVM7b0JBQ3hCLE9BQU87Z0JBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEYsQ0FBQztRQUNILENBQUM7UUFFUyxNQUFNLENBQUMsbUJBQW1CLENBQUMsY0FBNkI7WUFDaEUsSUFBSSxJQUFJLEdBQTJCLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDckUsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25FLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxZQUFZLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtvQkFDMUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0tBQ0Y7SUE5R1ksNEJBQWtCLHFCQThHOUIsQ0FBQTtBQUNILENBQUMsRUFySFMsU0FBUyxLQUFULFNBQVMsUUFxSGxCO0FDckhELElBQVUsU0FBUyxDQXNTbEI7QUF0U0QsV0FBVSxTQUFTO0lBRWpCLElBQWlCLFlBQVksQ0FvQzVCO0lBcENELFdBQWlCLFlBQVk7UUFFM0IsSUFBWSxRQVlYO1FBWkQsV0FBWSxRQUFRO1lBQ2xCLG1CQUFtQjtZQUNuQixpQ0FBcUIsQ0FBQTtZQUNyQix1Q0FBMkIsQ0FBQTtZQUMzQiw2Q0FBaUMsQ0FBQTtZQUNqQyxpQ0FBcUIsQ0FBQTtZQUNyQiw2QkFBaUIsQ0FBQTtZQUNqQiwyQkFBZSxDQUFBO1lBQ2YsdUNBQTJCLENBQUE7WUFDM0Isc0NBQTBCLENBQUE7WUFDMUIsNkJBQWlCLENBQUE7WUFDakIsd0NBQTRCLENBQUE7UUFDOUIsQ0FBQyxFQVpXLFFBQVEsR0FBUixxQkFBUSxLQUFSLHFCQUFRLFFBWW5CO1FBRVksd0NBQTJCLEdBQStDO1lBQ3JGLG9DQUFvQztZQUNwQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztTQUN4QyxDQUFDO1FBRVcsaUNBQW9CLEdBQThCO1lBQzdELGNBQWMsRUFBRSwyQkFBMkI7WUFDM0MsVUFBVSxFQUFFLHVCQUF1QjtZQUNuQyxVQUFVLEVBQUUsdUJBQXVCO1lBQ25DLFVBQVUsRUFBRSxhQUFhO1NBQzFCLENBQUM7SUFDSixDQUFDLEVBcENnQixZQUFZLEdBQVosc0JBQVksS0FBWixzQkFBWSxRQW9DNUI7SUFFRDs7OztPQUlHO0lBQ0gsTUFBYSxrQ0FBbUMsU0FBUSxVQUFBLG9CQUFvQjtpQkFDbkQsY0FBUyxHQUFpRDtZQUMvRSw4REFBOEQ7WUFDOUQsa0NBQWtDO1lBQ2xDLEtBQUs7WUFDTCxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxXQUFxQixFQUFFLEVBQUU7Z0JBQzFELE9BQU8sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBb0IsRUFBRSxNQUFjLEVBQUUsRUFBRSxDQUFDLEdBQUcsWUFBWSxNQUFNLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUM1RyxDQUFDO1lBQ0QsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBcUIsRUFBRSxFQUFFO2dCQUM3RCxPQUFPLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQW9CLEVBQUUsTUFBYyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFlBQVksTUFBTSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDNUcsQ0FBQztZQUNELENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLFdBQXFCLEVBQUUsRUFBRTtnQkFDaEUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFvQixFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsR0FBRyxZQUFZLE1BQU0sTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQzVHLENBQUM7WUFDRCxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxXQUFxQixFQUFFLEVBQUU7Z0JBQzFELE9BQU8sSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDbkQsQ0FBQztZQUNELENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQXFCLEVBQUUsRUFBRTtnQkFDeEQsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFvQixFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxZQUFZLEtBQUssTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ2hILENBQUM7WUFDRCxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxXQUFxQixFQUFFLEVBQUU7Z0JBQ3ZELE9BQU8sT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDckQsQ0FBQztZQUNELENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQXFCLEVBQUUsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLEdBQVcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsR0FBVyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxHQUFXLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLEdBQVcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsR0FBVyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUNoRixDQUFDO1lBQ0QsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBcUIsRUFBRSxFQUFFO2dCQUM3RCxJQUFJLENBQUMsR0FBVyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUN0QixDQUFDO1lBQ0QsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBcUIsRUFBRSxFQUFFO2dCQUN4RCxPQUFPLHlCQUF5QixXQUFXLENBQUMsQ0FBQyxDQUFDLDBFQUEwRSxDQUFDO1lBQzNILENBQUM7WUFDRCxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxXQUFxQixFQUFFLEVBQUU7Z0JBQzlELE9BQU8sSUFBSSxrQ0FBa0MsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNsSixDQUFDO1NBQ0YsQ0FBQztRQUVLLE1BQU0sQ0FBVSxRQUFRLENBQUMsWUFBc0I7WUFDcEQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLHVCQUF1QixFQUFFO2dCQUNyRSxLQUFLLEVBQUUsa0NBQWtDLENBQUMscUJBQXFCO2FBQ2hFLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSx5QkFBeUIsRUFBRTtnQkFDdkUsS0FBSyxFQUFFLGtDQUFrQyxDQUFDLHVCQUF1QjthQUNsRSxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQ7O1dBRUc7UUFDTyxNQUFNLENBQUMscUJBQXFCO1lBQ3BDLElBQUksSUFBSSxHQUF3QixJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzFDLElBQUksUUFBUSxHQUFrQyxJQUFJLEVBQUUsUUFBUSxDQUFDO1lBQzdELElBQUksUUFBUSxHQUFrQyxJQUFJLEVBQUUsUUFBUSxDQUFDO1lBRTdELElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxrQkFBa0I7aUJBQ3pDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSw0QkFBNEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7aUJBQ3ZILE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxrQ0FBa0MsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztpQkFDckgsT0FBTyxDQUFDLGVBQWUsRUFBRSxrQ0FBa0MsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ3ZHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDN0UsT0FBTyxDQUFDLGVBQWUsRUFBRSxrQ0FBa0MsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ3ZHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDN0UsVUFBVSxDQUFDLFlBQVksRUFBRSxrQ0FBa0MsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ08sTUFBTSxDQUFDLHVCQUF1QjtZQUN0QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsNEJBQTRCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQy9KLENBQUM7UUFFRCx5QkFBeUI7UUFFakIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQTRDLEVBQUUsY0FBb0Q7WUFDakksSUFBSSxDQUFDLFVBQVU7Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFFM0IsT0FBTyxVQUFVO2lCQUNkLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxrQ0FBa0MsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ3BLLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsU0FBUyxDQUFDLElBQUksTUFBTSxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUM7aUJBQ2pFLE1BQU0sQ0FBQyxDQUFDLFlBQW9CLEVBQUUsS0FBYSxFQUFFLEVBQUUsQ0FBQyxHQUFHLFlBQVksS0FBSyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRU8sTUFBTSxDQUFDLHVCQUF1QixDQUFDLGdCQUFpRCxFQUFFLGFBQWdDO1lBQ3hILElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUVqRSxJQUFJLGVBQWUsR0FBOEUsZ0JBQWdCO2lCQUM5RyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDLGNBQWMsS0FBSyxPQUFPLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzVFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQ0FBa0MsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQTZCLENBQUM7Z0JBRW5KLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQUM7WUFFTCxJQUFJLElBQUksR0FBVyxFQUFFLENBQUM7WUFDdEIsSUFBSSxJQUFJLGVBQWU7aUJBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBYyxFQUFFLEVBQUU7Z0JBQ3JELElBQUksUUFBUSxHQUFXLE1BQU0sR0FBRyxhQUFhLENBQUM7Z0JBQzlDLElBQUksZUFBZSxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNoQyxJQUFJLFNBQVMsR0FBK0IsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTSxNQUFNLFVBQUEsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUM5RixPQUFPLGtCQUFrQixRQUFRLE1BQU0sU0FBUyxDQUFDLEVBQUUsQ0FBQzsrQkFDakMsUUFBUSxNQUFNLFNBQVMsQ0FBQyxFQUFFLENBQUM7K0JBQzNCLFFBQVEsTUFBTSxTQUFTLENBQUMsRUFBRSxDQUFDOzJCQUMvQixRQUFRLG1CQUFtQixRQUFROzJCQUNuQyxRQUFRLG1CQUFtQixRQUFROzJCQUNuQyxRQUFRLG1CQUFtQixRQUFROzJCQUNuQyxRQUFRLG1CQUFtQixRQUFROzJCQUNuQyxRQUFRLG1CQUFtQixRQUFROzJCQUNuQyxRQUFRLG1CQUFtQixRQUFRLE1BQU0sQ0FBQztnQkFDM0QsQ0FBQzs7b0JBQ0MsT0FBTyxFQUFFLENBQUM7WUFDZCxDQUFDLENBQUM7aUJBQ0QsTUFBTSxDQUFDLENBQUMsZUFBdUIsRUFBRSxFQUFFLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQztpQkFDMUQsTUFBTSxDQUFDLENBQUMsWUFBb0IsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLEdBQUcsWUFBWSxLQUFLLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLElBQUksSUFBSSxJQUFJLENBQUM7WUFFYixJQUFJLElBQUksV0FBVyxhQUFhLEtBQUssQ0FBQztZQUN0QyxJQUFJLElBQUksZUFBZTtpQkFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFjLEVBQUUsRUFBRTtnQkFDckQsSUFBSSxRQUFRLEdBQVcsTUFBTSxHQUFHLGFBQWEsQ0FBQztnQkFDOUMsUUFBUSxlQUFlLEVBQUUsQ0FBQztvQkFDeEIsS0FBSyxXQUFXO3dCQUNkLE9BQU87Ozs7Z0JBSUwsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQztvQkFDN0IsS0FBSyxRQUFRO3dCQUNYLE9BQU87cUJBQ0EsUUFBUSxXQUFXLFFBQVEsVUFBVSxRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVE7cUJBQ25GLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLFVBQVUsUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVEsVUFBVSxRQUFRLFdBQVcsUUFBUTtxQkFDdk4sUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVEsVUFBVSxRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxVQUFVLFFBQVEsV0FBVyxRQUFROztnQkFFNU4sQ0FBQztvQkFDTCxLQUFLLE9BQU87d0JBQ1YsT0FBTztnQkFDTCxFQUFFO3FCQUNHLEVBQUU7MEJBQ0csRUFBRTs7Z0JBRVosQ0FBQztvQkFDTDt3QkFDRSxNQUFNLFlBQVksVUFBQSxjQUFjLENBQUMsSUFBSSxNQUFNLGVBQWUsMkJBQTJCLENBQUM7Z0JBQzFGLENBQUM7WUFDSCxDQUFDLENBQUM7aUJBQ0QsTUFBTSxDQUFDLENBQUMsWUFBb0IsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLEdBQUcsWUFBWSxRQUFRLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbkYsSUFBSSxJQUFJLEtBQUssQ0FBQztZQUVkLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVPLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBaUM7WUFDNUQsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFFdkIsSUFBSSxJQUFJLEdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzVELEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQ0FBa0MsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUN2RyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFZCxPQUFPLFFBQVEsSUFBSSxJQUFJLENBQUM7UUFDMUIsQ0FBQztRQUVPLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFvQztZQUNwRSxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxVQUFVLEdBQWEsRUFBRSxDQUFDO2dCQUM5QixLQUFLLElBQUksS0FBSyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDekMsVUFBVSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNoRixDQUFDO2dCQUNELE9BQU8sa0NBQWtDLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvRixDQUFDO1lBRUQsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE9BQU8sWUFBWSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSwwQkFBMEIsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2hILENBQUM7WUFFRCxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxLQUFLLEdBQVcsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDakQsT0FBTyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RELENBQUM7WUFFRCxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxJQUFJLEdBQVcsV0FBVyxDQUFDLElBQUk7cUJBQ2hDLFVBQVUsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztxQkFDbkksVUFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ2xFLElBQUksR0FBRyxrQ0FBa0MsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFakUsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxZQUFZLFVBQUEsY0FBYyxDQUFDLElBQUksMkRBQTJELENBQUM7UUFDbkcsQ0FBQztRQUVPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFnQyxFQUFFLFdBQXFCO1lBQ3JGLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsMkJBQTJCLENBQUMsU0FBUyxDQUFDO2dCQUMxRSxNQUFNLFlBQVksVUFBQSxjQUFjLENBQUMsSUFBSSxNQUFNLFNBQVMsb0JBQW9CLFlBQVksQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO1lBQzNJLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztnQkFDMUQsT0FBTyxrQ0FBa0MsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7O2dCQUU1RSxNQUFNLFlBQVksVUFBQSxjQUFjLENBQUMsSUFBSSxNQUFNLFNBQVMsdUJBQXVCLENBQUM7UUFDaEYsQ0FBQztRQUVPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFhO1lBQzNDLElBQUksYUFBYSxHQUFXLG9CQUFvQixDQUFDO1lBQ2pELElBQUksS0FBc0IsQ0FBQztZQUMzQixPQUFPLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxpQkFBaUIsR0FBYSxrQ0FBa0MsQ0FBQyxTQUFTLENBQXdCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0gsSUFBSSxDQUFDLGlCQUFpQjtvQkFDcEIsU0FBUztnQkFFWCxJQUFJLFlBQVksR0FBYSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksWUFBWSxHQUFXLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxrQkFBa0IsR0FBVyxhQUFhLENBQUMsU0FBUyxDQUFDO2dCQUN6RCxPQUFPLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsUUFBUSxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO3dCQUNsQyxLQUFLLEdBQUc7NEJBQ04sWUFBWSxFQUFFLENBQUM7NEJBQ2YsTUFBTTt3QkFDUixLQUFLLEdBQUc7NEJBQ04sWUFBWSxFQUFFLENBQUM7NEJBQ2YsTUFBTTt3QkFDUixLQUFLLEdBQUc7NEJBQ04sSUFBSSxZQUFZLElBQUksQ0FBQztnQ0FDbkIsWUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDOzRCQUN4QyxNQUFNO29CQUNWLENBQUM7b0JBQ0Qsa0JBQWtCLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQztnQkFFRCxJQUFJLElBQUksR0FDTixDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsWUFBWSxFQUFFLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBVyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFO29CQUN0SSxPQUFPLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxZQUFZLENBQUMsQ0FBQzt3QkFDZCxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbkYsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUVULGFBQWEsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztnQkFDdEMsS0FBSyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQ3pHLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7O0lBdFBVLDRDQUFrQyxxQ0F3UDlDLENBQUE7QUFDSCxDQUFDLEVBdFNTLFNBQVMsS0FBVCxTQUFTLFFBc1NsQjtBQ3RTRCxJQUFVLFNBQVMsQ0FvRWxCO0FBcEVELFdBQVUsU0FBUztJQUVqQjs7OztPQUlHO0lBQ0gsTUFBYSxxQ0FBcUM7UUFDaEQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQXNCO1lBQzNDLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBQzdELEtBQUssRUFBRSxxQ0FBcUMsQ0FBQyxhQUFhO2FBQzNELENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBRTtnQkFDaEUsS0FBSyxFQUFFLHFDQUFxQyxDQUFDLGdCQUFnQjthQUM5RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRVMsTUFBTSxDQUFDLGFBQWE7WUFDNUIsSUFBSSxJQUFJLEdBQTJCLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDckUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BCLGdCQUFnQjtnQkFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFBLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLDZIQUE2SDtnQkFDakwsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLE9BQU8sR0FBaUIsVUFBQSxNQUFNLENBQUMsTUFBTSxDQUFlLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFFN0QsSUFBSSxXQUFXLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUU5RSxvSUFBb0k7Z0JBQ3BJLElBQUksYUFBYSxHQUFhLEVBQUUsQ0FBQztnQkFDakMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFO29CQUN4RCxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUVwQyxJQUFJLENBQUM7b0JBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FDYixzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxFQUN4SixZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUNqQyxDQUFDO2dCQUNKLENBQUM7Z0JBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztvQkFDaEIsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QixDQUFDO2dCQUVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFM0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7Z0JBRTFCLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUUxRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7UUFFUyxNQUFNLENBQUMsZ0JBQWdCO1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFBRSxPQUFPO1lBRTdCLElBQUksSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUV6QixDQUFDO0tBQ0Y7SUE1RFksK0NBQXFDLHdDQTREakQsQ0FBQTtBQUNILENBQUMsRUFwRVMsU0FBUyxLQUFULFNBQVMsUUFvRWxCO0FDcEVELElBQVUsU0FBUyxDQXVHbEI7QUF2R0QsV0FBVSxTQUFTO0lBWWpCOzs7OztPQUtHO0lBQ0gsTUFBc0IsUUFBUTtpQkFDYixVQUFLLEdBQWlDLEVBQUUsQ0FBQztRQUV4RDs7OztXQUlHO1FBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBMEMsRUFBZTtZQUN4RSxJQUFJLEdBQUcsR0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzFCLElBQUksU0FBUyxHQUFhLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxRQUFRLEdBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNyQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7O2dCQUNDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBbUIsRUFBZTtZQUNuRCxPQUFVLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7UUFDdkQsQ0FBQztRQUVEOzs7OztXQUtHO1FBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBc0IsRUFBZTtZQUN2RCxJQUFJLENBQUksQ0FBQztZQUNULElBQUksR0FBRyxHQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSSxTQUFTLEdBQWEsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNiLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztZQUNELElBQUksUUFBUSxHQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBaUI7WUFDbkMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDN0MsaUJBQWlCO1lBQ2pCLElBQUksU0FBUyxHQUFhLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BELFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUIsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDaEMsZ0ZBQWdGO1lBQ2hGLHdCQUF3QjtRQUMxQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsVUFBb0I7WUFDakQsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVO2dCQUMvQixRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsSUFBSSxDQUFJLEVBQWU7WUFDbkMsSUFBSSxHQUFHLEdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQztZQUMxQixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsT0FBTztZQUNuQixRQUFRLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN0QixDQUFDOztJQW5GbUIsa0JBQVEsV0FvRjdCLENBQUE7QUFDSCxDQUFDLEVBdkdTLFNBQVMsS0FBVCxTQUFTLFFBdUdsQjtBQ3ZHRCxJQUFVLFNBQVMsQ0F3V2xCO0FBeFdELFdBQVUsU0FBUztJQUNqQjs7Ozs7OztPQU9HO0lBQ0gsTUFBYSxPQUFRLFNBQVEsVUFBQSxPQUFPO1FBSWxDLFlBQW1CLEtBQWEsQ0FBQyxFQUFFLEtBQWEsQ0FBQztZQUMvQyxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFFRCxnQkFBZ0I7UUFDaEI7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLElBQUk7WUFDaEIsTUFBTSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQWlCLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRDs7OztXQUlHO1FBQ0ksTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFpQixDQUFDO1lBQ2hDLE1BQU0sTUFBTSxHQUFZLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7Ozs7V0FJRztRQUNJLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBaUIsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFnQixFQUFFLGFBQXdCLEVBQUUsc0JBQStCLElBQUk7WUFDMUcsTUFBTSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxHQUFpQixhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FDUixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFDbkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQ3BDLENBQUM7WUFFRixJQUFJLG1CQUFtQjtnQkFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFeEMsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFnQixFQUFFLFVBQWtCLENBQUM7WUFDL0QsSUFBSSxnQkFBZ0IsR0FBVyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7WUFDeEQsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDO2dCQUN2QixNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksTUFBTSxHQUFZLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDcEQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFnQixFQUFFLE1BQWM7WUFDbEQsTUFBTSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztZQUNuRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBbUI7WUFDdEMsTUFBTSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELEtBQUssSUFBSSxNQUFNLElBQUksUUFBUTtnQkFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFpQixFQUFFLFdBQW9CO1lBQzlELE1BQU0sTUFBTSxHQUFZLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRSxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFXLEVBQUUsRUFBVztZQUMxQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFXLEVBQUUsRUFBVztZQUN4QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVEOzs7Ozs7OztXQVFHO1FBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFnQixFQUFFLGFBQXNCLEtBQUs7WUFDcEUsSUFBSSxNQUFNLEdBQVksVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLElBQUksVUFBVTtnQkFDWixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUVsQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFpQixDQUFDLEVBQUUsYUFBcUIsQ0FBQztZQUMxRCxJQUFJLE1BQU0sR0FBWSxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsSUFBSSxHQUFHLEdBQVMsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQUEsSUFBSSxDQUFDLENBQUM7WUFDckMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDNUIsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDakIsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxZQUFZO1FBRVosbUJBQW1CO1FBQ25COztXQUVHO1FBQ0gsSUFBVyxTQUFTO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLGdCQUFnQjtZQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsR0FBRztZQUNaLElBQUksR0FBRyxHQUFTLFVBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLElBQUksQ0FBQyxDQUFDO1lBQ25DLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUUvQixJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssQ0FBQztnQkFDckIsT0FBTyxHQUFHLENBQUM7WUFFYixHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZGLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxHQUFHLENBQUMsSUFBVTtZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxLQUFLO1lBQ2QsT0FBTyxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxZQUFZO1FBRVo7O1dBRUc7UUFDSSxJQUFJLENBQUMsU0FBa0I7WUFDNUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFTSxPQUFPO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxRQUFpQixFQUFFLGFBQXFCLE1BQU0sQ0FBQyxPQUFPO1lBQ2xFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzdELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzdELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOzs7V0FHRztRQUNJLEdBQUcsQ0FBQyxPQUFnQjtZQUN6QixJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOzs7V0FHRztRQUNJLFFBQVEsQ0FBQyxXQUFvQjtZQUNsQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOztXQUVHO1FBQ0ksS0FBSyxDQUFDLE9BQWU7WUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUM7WUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxTQUFTLENBQUMsVUFBa0IsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsS0FBYSxDQUFDLEVBQUUsS0FBYSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7V0FFRztRQUNJLEdBQUc7WUFDUixPQUFPLElBQUksWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksU0FBUyxDQUFDLGFBQXdCLEVBQUUsc0JBQStCLElBQUk7WUFDNUUsSUFBSSxXQUFXLEdBQVksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDNUYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2QixVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsUUFBaUI7WUFDMUIsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRDs7V0FFRztRQUNJLEdBQUcsQ0FBQyxRQUFpQjtZQUMxQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOztXQUVHO1FBQ0ksU0FBUyxDQUFDLEtBQWEsQ0FBQztZQUM3QixPQUFPLElBQUksVUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRDs7V0FFRztRQUNJLFFBQVE7WUFDYixJQUFJLE1BQU0sR0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDNUUsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLEdBQUcsQ0FBQyxTQUE2RTtZQUN0RixJQUFJLElBQUksR0FBWSxVQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckQsZ0hBQWdIO1lBQ2hILGFBQWEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUN4QyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQWtCLGNBQWMsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7O2dCQUNDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU0sVUFBVTtZQUNmLElBQUksT0FBTyxHQUFZO2dCQUNyQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDckIsQ0FBQztZQUNGLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFDUyxhQUFhLENBQUMsUUFBaUIsSUFBZ0IsQ0FBQztLQUUzRDtJQTlWWSxpQkFBTyxVQThWbkIsQ0FBQTtBQUNILENBQUMsRUF4V1MsU0FBUyxLQUFULFNBQVMsUUF3V2xCO0FDeFdELDZDQUE2QztBQUM3QyxpQ0FBaUM7QUFFakMsSUFBVSxTQUFTLENBcU5sQjtBQXhORCw2Q0FBNkM7QUFDN0MsaUNBQWlDO0FBRWpDLFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUNILElBQVksUUFVWDtJQVZELFdBQVksUUFBUTtRQUNsQiw2Q0FBYyxDQUFBO1FBQ2QsaURBQWdCLENBQUE7UUFDaEIsK0NBQWUsQ0FBQTtRQUNmLG9EQUFpQixDQUFBO1FBQ2pCLDRDQUFhLENBQUE7UUFDYixzREFBa0IsQ0FBQTtRQUNsQixvREFBaUIsQ0FBQTtRQUNqQix3REFBbUIsQ0FBQTtRQUNuQixzREFBa0IsQ0FBQTtJQUNwQixDQUFDLEVBVlcsUUFBUSxHQUFSLGtCQUFRLEtBQVIsa0JBQVEsUUFVbkI7SUFFRDs7O09BR0c7SUFDSCxNQUFhLFNBQVUsU0FBUSxVQUFBLE9BQU87UUFJcEMsWUFBbUIsS0FBYSxDQUFDLEVBQUUsS0FBYSxDQUFDLEVBQUUsU0FBaUIsQ0FBQyxFQUFFLFVBQWtCLENBQUMsRUFBRSxVQUFvQixRQUFRLENBQUMsT0FBTztZQUM5SCxLQUFLLEVBQUUsQ0FBQztZQUpILGFBQVEsR0FBWSxVQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztZQUMxQyxTQUFJLEdBQVksVUFBQSxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsT0FBTyxDQUFDLENBQUM7WUFJM0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQWEsQ0FBQyxFQUFFLEtBQWEsQ0FBQyxFQUFFLFNBQWlCLENBQUMsRUFBRSxVQUFrQixDQUFDLEVBQUUsVUFBb0IsUUFBUSxDQUFDLE9BQU87WUFDN0gsSUFBSSxJQUFJLEdBQWMsVUFBQSxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFXLENBQUM7WUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFXLENBQUM7WUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFXLEtBQUs7WUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFXLE1BQU07WUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsSUFBSTtZQUNiLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0Q7O1dBRUc7UUFDSCxJQUFXLEdBQUc7WUFDWixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNEOztXQUVHO1FBQ0gsSUFBVyxLQUFLO1lBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRDs7V0FFRztRQUNILElBQVcsTUFBTTtZQUNmLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsSUFBVyxDQUFDLENBQUMsRUFBVTtZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQVcsQ0FBQyxDQUFDLEVBQVU7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFXLEtBQUssQ0FBQyxNQUFjO1lBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBVyxNQUFNLENBQUMsT0FBZTtZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQVcsSUFBSSxDQUFDLE1BQWM7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFXLEdBQUcsQ0FBQyxNQUFjO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBVyxLQUFLLENBQUMsTUFBYztZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDekMsQ0FBQztRQUNELElBQVcsTUFBTSxDQUFDLE1BQWM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFXLEtBQUs7WUFDZCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFTSxPQUFPO1lBQ1osSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksSUFBSSxDQUFDLEtBQWdCO1lBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVEOztXQUVHO1FBQ0ksa0JBQWtCLENBQUMsS0FBYSxDQUFDLEVBQUUsS0FBYSxDQUFDLEVBQUUsU0FBaUIsQ0FBQyxFQUFFLFVBQWtCLENBQUMsRUFBRSxVQUFvQixRQUFRLENBQUMsT0FBTztZQUNySSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0IsUUFBUSxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssSUFBSTtvQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQUMsTUFBTTtnQkFDdkMsS0FBSyxJQUFJO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUFDLE1BQU07Z0JBQ3BELEtBQUssSUFBSTtvQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO29CQUFDLE1BQU07WUFDbEQsQ0FBQztZQUNELFFBQVEsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO2dCQUN2QixLQUFLLElBQUk7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUFDLE1BQU07Z0JBQ3ZDLEtBQUssSUFBSTtvQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztvQkFBQyxNQUFNO2dCQUNyRCxLQUFLLElBQUk7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztvQkFBQyxNQUFNO1lBQ25ELENBQUM7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxXQUFXLENBQUMsTUFBZSxFQUFFLE9BQWtCO1lBQ3BELElBQUksTUFBTSxHQUFZLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDbkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDdkMsTUFBTSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDekMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLFFBQVEsQ0FBQyxNQUFlO1lBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RyxDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksUUFBUSxDQUFDLEtBQWdCO1lBQzlCLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7V0FFRztRQUNJLGVBQWUsQ0FBQyxLQUFnQjtZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDO1lBRWQsSUFBSSxZQUFZLEdBQWMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM5QyxZQUFZLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakQsWUFBWSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBRTNFLE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRDs7T0FFRDtRQUNRLE1BQU0sQ0FBQyxLQUFnQjtZQUM1QixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzNDLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN2QyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU07Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRO1lBQ2IsSUFBSSxNQUFNLEdBQVcsd0JBQXdCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3RHLE1BQU0sSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekosT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVTLGFBQWEsQ0FBQyxRQUFpQixJQUFlLENBQUM7S0FDMUQ7SUFoTVksbUJBQVMsWUFnTXJCLENBQUE7QUFDSCxDQUFDLEVBck5TLFNBQVMsS0FBVCxTQUFTLFFBcU5sQjtBQ3hORCx3Q0FBd0M7QUFDeEMsOENBQThDO0FBQzlDLDRDQUE0QztBQUM1Qyw0Q0FBNEM7QUFDNUMsNERBQTREO0FBQzVELCtEQUErRDtBQUMvRCwyQ0FBMkM7QUFFM0MsSUFBVSxTQUFTLENBcXpCbEI7QUE3ekJELHdDQUF3QztBQUN4Qyw4Q0FBOEM7QUFDOUMsNENBQTRDO0FBQzVDLDRDQUE0QztBQUM1Qyw0REFBNEQ7QUFDNUQsK0RBQStEO0FBQy9ELDJDQUEyQztBQUUzQyxXQUFVLFNBQVM7SUFDakIsMkNBQTJDO0lBSTNDLElBQVksS0FFWDtJQUZELFdBQVksS0FBSztRQUNmLHFDQUFNLENBQUE7UUFBRSwrQ0FBVyxDQUFBO1FBQUUseUNBQVEsQ0FBQTtRQUFFLCtDQUFXLENBQUE7UUFBRSx5Q0FBUSxDQUFBO0lBQ3RELENBQUMsRUFGVyxLQUFLLEdBQUwsZUFBSyxLQUFMLGVBQUssUUFFaEI7SUFFRCw2RUFBNkU7SUFDaEUsd0JBQWMsR0FBRztRQUM1QixNQUFNLEVBQUU7WUFDTixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCxJQUFJLEVBQUU7WUFDSixJQUFJLEVBQUUsTUFBTTtZQUNaLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCxHQUFHLEVBQUU7WUFDSCxJQUFJLEVBQUUsS0FBSztZQUNYLE9BQU8sRUFBRSxDQUFDO1NBQ1g7S0FDRixDQUFDO0lBRVcsMEJBQWdCLEdBQUc7UUFDOUIsS0FBSyxFQUFFO1lBQ0wsT0FBTyxFQUFFLFlBQVk7WUFDckIsSUFBSSxFQUFFLHNCQUFzQixDQUFDLFFBQVE7WUFDckMsS0FBSyxFQUFFLENBQUMsQ0FBQyxpRUFBaUU7U0FDM0U7UUFDRCxNQUFNLEVBQUU7WUFDTixPQUFPLEVBQUUsYUFBYTtZQUN0QixJQUFJLEVBQUUsc0JBQXNCLENBQUMsUUFBUTtZQUNyQyxLQUFLLEVBQUUsQ0FBQztTQUNUO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsT0FBTyxFQUFFLCtCQUErQjtZQUN4QyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsUUFBUTtZQUNyQyxLQUFLLEVBQUUsQ0FBQztTQUNUO1FBQ0QsSUFBSSxFQUFFO1lBQ0osT0FBTyxFQUFFLFdBQVcsRUFBRSxzQ0FBc0M7WUFDNUQsSUFBSSxFQUFFLHNCQUFzQixDQUFDLFFBQVE7WUFDckMsS0FBSyxFQUFFLENBQUM7U0FDVDtRQUNELElBQUksRUFBRTtZQUNKLE9BQU8sRUFBRSxXQUFXO1lBQ3BCLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxRQUFRO1lBQ3JDLEtBQUssRUFBRSxDQUFDO1NBQ1Q7S0FDTyxDQUFDO0lBRVg7OztPQUdHO0lBQ0gsTUFBc0IsV0FBWSxTQUFRLFVBQUEsaUJBQWlCO2lCQUl4QyxTQUFJLEdBQTJCLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFHMUQsZUFBVSxHQUFjLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQWdCbkU7O1dBRUc7UUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQW9CLEVBQUUsTUFBZ0I7WUFDN0QsSUFBSSxXQUFXLEdBQVksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hFLE1BQU0sU0FBUyxHQUFZLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO1lBQ25HLElBQUksU0FBUztnQkFDWCxVQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMscUhBQXFILENBQUMsQ0FBQztZQUNySSxJQUFJLGlCQUFpQixHQUEyQjtnQkFDOUMsS0FBSyxFQUFFLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksS0FBSztnQkFDbEUsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLGtCQUFrQixFQUFFLEtBQUs7Z0JBQ3pCLE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQztZQUNGLFVBQUEsS0FBSyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3pELElBQUksTUFBTSxHQUFzQixRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pFLElBQUksSUFBNEIsQ0FBQztZQUNqQyxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FDdkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsRUFDOUMsbUNBQW1DLENBQ3BDLENBQUM7WUFDRixXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUN4Qix3Q0FBd0M7WUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFckQsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDcEMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFaEMsV0FBVyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBRTdELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOzs7O1VBSUU7UUFDSyxNQUFNLENBQUMsTUFBTSxDQUFJLE1BQWdCLEVBQUUsV0FBbUIsRUFBRTtZQUM3RCxJQUFJLE1BQU0sS0FBSyxJQUFJO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixRQUFRLGtCQUFrQixXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hILE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxTQUFTO1lBQ3JCLE9BQTBCLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsK0JBQStCO1FBQ3BGLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxtQkFBbUI7WUFDL0IsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzFCLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxhQUFhO1lBQ3pCLElBQUksTUFBTSxHQUF5QyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMzRSxPQUFPLFVBQUEsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBYyxFQUFFLE9BQWU7WUFDekQsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztZQUN2QyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQzNDLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBZ0I7WUFDL0MsV0FBVyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkYsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBYztZQUNoQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzVGLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixHQUFHLHNCQUFzQixDQUFDLGdCQUFnQixHQUFHLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDeEosQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxPQUF5QjtZQUMxRCxXQUFXLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztRQUNsQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsZ0JBQWdCO1lBQzVCLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGtCQUFrQjtZQUM5QixPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDaEMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFjO1lBQ3ZDLElBQUksS0FBSztnQkFDUCxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Z0JBRTNELFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBYyxFQUFFLEVBQVcsRUFBRSxFQUFXLEVBQUUsTUFBZSxFQUFFLE9BQWdCO1lBQ3RHLElBQUksS0FBSztnQkFDUCxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQzs7Z0JBRTdELFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxNQUFjLEVBQUUsT0FBZTtZQUMvRSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQVk7WUFDckMsc0hBQXNIO1lBQ3RILFFBQVEsS0FBSyxFQUFFLENBQUM7Z0JBQ2QsS0FBSyxLQUFLLENBQUMsTUFBTTtvQkFDZixXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDaEUsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNwRixNQUFNO2dCQUNSLEtBQUssS0FBSyxDQUFDLFdBQVc7b0JBQ3BCLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNoRSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDbkcsNEdBQTRHO29CQUM1RyxNQUFNO2dCQUNSLEtBQUssS0FBSyxDQUFDLFFBQVE7b0JBQ2pCLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNoRSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25GLGtHQUFrRztvQkFDbEcsTUFBTTtnQkFDUixLQUFLLEtBQUssQ0FBQyxXQUFXO29CQUNwQixXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUM3RSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25GLGtHQUFrRztvQkFDbEcsTUFBTTtnQkFDUixLQUFLLEtBQUssQ0FBQyxRQUFRLEVBQUUsMkdBQTJHO29CQUM5SCxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDaEUsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQzNHO29CQUNFLE1BQU07WUFDVixDQUFDO1FBQ0gsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFnQjtZQUMvQyxNQUFNLElBQUksR0FBMkIsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDdkUsTUFBTSxJQUFJLEdBQWlCLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzFELElBQUksUUFBUSxHQUFZLFVBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMscUJBQXFCO1lBQ2pDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxzQ0FBc0M7WUFFL0YsV0FBVyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFtQixXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUNqRyxXQUFXLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQW1CLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBQ2pHLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBRTdCLFdBQVcsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzRyxXQUFXLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDOUcsV0FBVyxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVHLFdBQVcsQ0FBQyxlQUFlLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNsSCxXQUFXLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFM0csV0FBVyxDQUFDLGVBQWUsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO2dCQUNqRSxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFdEgsU0FBUyxhQUFhLENBQUMsT0FBZSxFQUFFLEtBQWE7Z0JBQ25ELE1BQU0sSUFBSSxHQUEyQixXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUN0RCxNQUFNLE9BQU8sR0FBaUIsV0FBVyxDQUFDLE1BQU0sQ0FBZSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDckYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUMxRyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDMUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BHLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxpQkFBaUI7WUFDN0IsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sS0FBSyxHQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7WUFFL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUU5SyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0UsK0ZBQStGO1lBQy9GLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUV6SyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXpLLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxFQUFFLHNCQUFzQixDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXZNLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLHNCQUFzQixDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BLLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkssSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNySyxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLHNCQUFzQixDQUFDLHdCQUF3QixFQUFFLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xMLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRS9ELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLE9BQU8sR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDdkcsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hMLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBVyxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMzQyxNQUFNLFNBQVMsR0FBZSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV0RCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRCxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRCxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0csSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxpQkFBaUI7UUFDakI7O1dBRUc7UUFDTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBYTtZQUM5QyxzQkFBc0I7WUFDdEIsTUFBTSxhQUFhLEdBQWtCLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDckYsVUFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxnR0FBZ0c7WUFFM0ssQ0FBQztnQkFDQyxNQUFNLGNBQWMsR0FBVyxzQkFBc0IsQ0FBQyxPQUFPLENBQUM7Z0JBQzlELE1BQU0sTUFBTSxHQUFXLHNCQUFzQixDQUFDLFlBQVksQ0FBQztnQkFDM0QsTUFBTSxJQUFJLEdBQVcsc0JBQXNCLENBQUMsR0FBRyxDQUFDO2dCQUNoRCxVQUFBLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdEQsVUFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FDcEIsc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFBLE1BQU0sQ0FBQyxVQUFVLENBQ3ZHLENBQUM7Z0JBRUYsMENBQTBDO2dCQUMxQyxVQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkksVUFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxSSxVQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDNUksQ0FBQztZQUVELE1BQU0sV0FBVyxHQUFxQixVQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN0RSxVQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM3RSxNQUFNLGVBQWUsR0FBVyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQztZQUN6RSxVQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRTNJLFdBQVcsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQzdCLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFUyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWEsRUFBRSxVQUEyQjtZQUNsRSx3R0FBd0c7WUFDeEcsSUFBSSxJQUFJLEdBQWUsSUFBSSxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6RCxVQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRWxILElBQUksY0FBYyxHQUFjLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDN0UsSUFBSSxNQUFNLEdBQVcsRUFBRSxDQUFDO1lBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZELElBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDOUQsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLGtCQUFrQjtvQkFDbEMsU0FBUztnQkFDWCxJQUFJLElBQUksR0FBUyxVQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFBLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkcsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7Z0JBRXJDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1lBRWQsU0FBUyxxQkFBcUIsQ0FBQyxXQUF1QixFQUFFLE1BQWM7Z0JBQ3BFLElBQUksTUFBTSxHQUFnQixJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLEdBQWEsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsQ0FBQztZQUVELFNBQVMsbUJBQW1CLENBQUMsV0FBdUIsRUFBRSxNQUFjO2dCQUNsRSxJQUFJLE1BQU0sR0FBZ0IsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksSUFBSSxHQUFhLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxLQUFLLEdBQVUsVUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUMzSCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQ7Ozs7VUFJRTtRQUNRLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBVyxFQUFFLFVBQTJCO1lBQzVELElBQUksQ0FBQztnQkFDSCxJQUFJLE9BQU8sR0FBa0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFBLGFBQWEsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLFdBQVcsR0FBc0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFBLGlCQUFpQixDQUFDLENBQUM7Z0JBQzNFLElBQUksSUFBSSxHQUFTLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUMzQyxJQUFJLE1BQU0sR0FBb0IsSUFBSSxZQUFZLFVBQUEsWUFBWSxDQUFDLENBQUMsQ0FBQyxVQUFBLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxVQUFBLFVBQVUsQ0FBQztnQkFFN0YsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxhQUFhLEdBQWMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBRXhJLElBQUksbUJBQW1CLEdBQXlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzdFLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBRWhILElBQUksSUFBSSxHQUFTLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQzlCLElBQUksYUFBYSxHQUFrQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLFVBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkgsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUVsSSxJQUFJLElBQUksR0FBUyxJQUFJLFVBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQyxVQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixFQUFFO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFUyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQW9CLEVBQUUsVUFBMkI7WUFDM0UsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRXZFLHVGQUF1RjtZQUN2RixJQUFJLE1BQU0sR0FBb0IsVUFBQSxVQUFVLENBQUM7WUFDekMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDNUYsTUFBTSxHQUFHLFVBQUEsa0JBQWtCLENBQUM7WUFDNUIsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDNUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQUEsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxpRUFBaUU7WUFFMUosVUFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBQSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELFlBQVk7UUFFWjs7V0FFRztRQUNPLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBcUI7WUFDOUMsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRXZFLE1BQU0sSUFBSSxHQUFpQixJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBRUQsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFakcsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFVBQUEsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdHLENBQUM7UUFFRDs7V0FFRztRQUNPLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBZ0M7WUFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTO2dCQUN4QixPQUFPO1lBRVQsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUxRiwrQ0FBK0M7WUFDL0MsSUFBSSxTQUFTLEdBQW1DLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBQSxZQUFZLENBQUMsQ0FBQztZQUMxRSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLElBQUksTUFBTSxHQUFVLElBQUksVUFBQSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLEtBQUssSUFBSSxRQUFRLElBQUksU0FBUztvQkFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVuQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQy9CLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLDZEQUE2RDtnQkFDekgsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQy9CLENBQUM7WUFDSixDQUFDO1lBRUQsMERBQTBEO1lBQzFELHFHQUFxRztZQUNyRyxrQkFBa0IsQ0FBQyxVQUFBLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQzlFLGtCQUFrQixDQUFDLFVBQUEsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzVELGtCQUFrQixDQUFDLFVBQUEsU0FBUyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV6RCxTQUFTLGtCQUFrQixDQUFDLEtBQWtCLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQjtnQkFDbEYsTUFBTSxTQUFTLEdBQW1DLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXJFLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUM1QixXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFDL0IsV0FBVyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxFQUFFLGdFQUFnRTtnQkFDaEgsSUFBSSxVQUFVLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ3pDLENBQUM7Z0JBRUYsSUFBSSxDQUFDLFNBQVM7b0JBQ1osT0FBTztnQkFFVCxNQUFNLGFBQWEsR0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLHFEQUFxRDtnQkFDaEcsTUFBTSxVQUFVLEdBQWlCLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLENBQUM7Z0JBRXBGLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztnQkFDdkIsS0FBSyxJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDL0IsTUFBTSxlQUFlLEdBQVcsTUFBTSxHQUFHLGFBQWEsQ0FBQztvQkFFdkQsZUFBZTtvQkFDZixVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFFaEUsZUFBZTtvQkFDZixJQUFJLFFBQVEsR0FBYyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN2RixJQUFJLEtBQUssSUFBSSxVQUFBLGdCQUFnQixFQUFFLENBQUM7d0JBQzlCLElBQUksSUFBSSxHQUFZLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNuQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzt3QkFDNUIsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN2QixDQUFDO29CQUVELFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtvQkFFekUsc0JBQXNCO29CQUN0QixJQUFJLEtBQUssSUFBSSxVQUFBLGdCQUFnQixFQUFFLENBQUM7d0JBQzlCLElBQUksVUFBVSxHQUFjLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDeEQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLCtCQUErQjt3QkFDM0YsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUM3QixDQUFDO29CQUVELFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDekIsTUFBTSxFQUFFLENBQUM7Z0JBQ1gsQ0FBQztnQkFFRCxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQy9CLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLFVBQVUsY0FBYyxDQUFDLEVBQUUsdURBQXVEO2dCQUMxSCxVQUFVLENBQ1gsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQ7OztXQUdHO1FBQ08sTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUE0QixFQUFFLFdBQTJCLEVBQUUsVUFBMkI7WUFDL0csTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRXZFLE1BQU0sTUFBTSxHQUFpQixVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxVQUFBLFlBQVksQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sbUJBQW1CLEdBQThCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFVBQUEseUJBQXlCLENBQUMsQ0FBQztZQUNoSCxNQUFNLFFBQVEsR0FBbUIsVUFBVSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsVUFBQSxjQUFjLENBQUMsQ0FBQztZQUUvRSxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTlCLGVBQWU7WUFDZiwrRkFBK0Y7WUFDL0YsNEZBQTRGO1lBQzVGLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsdUVBQXVFO2dCQUN0SCxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDaEksQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUMzQyxDQUFDO1lBQ0YsV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFNUMsOENBQThDO1lBQzlDLEtBQUssSUFBSSxJQUFJLElBQUksWUFBWTtnQkFDM0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDekMsNkNBQTZDO1lBRTdDLHlCQUF5QjtZQUN6QixJQUFJLG1CQUFtQixFQUFFLFFBQVE7Z0JBQy9CLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUVwRSxhQUFhO1lBQ2IsSUFBSSxRQUFRLEVBQUUsUUFBUTtnQkFDcEIsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVsQyxrS0FBa0s7WUFDbEssSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFFN0QseUJBQXlCO1lBQ3pCLEtBQUssSUFBSSxJQUFJLElBQUksV0FBVztnQkFDMUIsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDekMsd0JBQXdCO1lBRXhCLDZCQUE2QjtZQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwTyxDQUFDO1FBRUQ7O1dBRUc7UUFDTyxNQUFNLENBQUMsb0JBQW9CLENBQUMsVUFBMkIsRUFBRSxvQkFBK0M7WUFDaEgsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZFLFVBQUEsc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFcEMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFBLHNCQUFzQixFQUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQzNILFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBQSxzQkFBc0IsRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN2SCxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQUEsc0JBQXNCLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFckgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQUEsc0JBQXNCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3BILElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2hILElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3RILElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQUEsc0JBQXNCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFdkcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEssV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hELFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRDs7V0FFRztRQUNPLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBeUI7WUFDbEQsTUFBTSxJQUFJLEdBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZFLFVBQUEsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRXpCLGlIQUFpSDtZQUNqSCxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5SyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFcEIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFBLFdBQVcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUMzRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQUEsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXhELGFBQWE7WUFDYixNQUFNLFVBQVUsR0FBVyxXQUFXLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxPQUFPLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMvRSxJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFM0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDOUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFbkMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUVwQixXQUFXLENBQUMsV0FBVyxDQUFDLFVBQUEsV0FBVyxFQUFFLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDekgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCO2dCQUNqRywwRUFBMEU7Z0JBRTFFLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFekMsV0FBVztZQUNYLEtBQUssSUFBSSxDQUFDLEdBQVcsVUFBVSxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2RyxJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFM0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xMLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFFM0QsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFBLFdBQVcsRUFBRSxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDckgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCO2dCQUNqRywwRUFBMEU7Z0JBRTFFLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFM0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwSyxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQUEsV0FBVyxFQUFFLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3JILElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBQSxXQUFXLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQUEsV0FBVyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ2xHLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUV4RCxXQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQ7O1VBRUU7UUFDUSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQVcsRUFBRSxVQUEyQjtZQUNoRSxJQUFJLE9BQU8sR0FBa0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFBLGFBQWEsQ0FBQyxDQUFDO1lBQy9ELElBQUksV0FBVyxHQUFzQixLQUFLLENBQUMsWUFBWSxDQUFDLFVBQUEsaUJBQWlCLENBQUMsQ0FBQztZQUMzRSxJQUFJLE9BQU8sR0FBa0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFBLGFBQWEsQ0FBQyxDQUFDO1lBQy9ELElBQUksSUFBSSxHQUFTLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQzNDLElBQUksaUJBQWlCLEdBQTRCLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBQSx1QkFBdUIsQ0FBQyxDQUFDO1lBQzdGLElBQUksYUFBYSxHQUFZLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztZQUM3RSxJQUFJLE1BQU0sR0FBb0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMvRCxJQUFJLGFBQWE7Z0JBQ2YsTUFBTSxHQUFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFbEUsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRXhDLElBQUksY0FBYyxHQUFjLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFFakQsSUFBSSxPQUFPLEVBQUUsUUFBUTtnQkFDbkIsY0FBYyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRXJFLElBQUksYUFBYSxHQUFjLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0ksSUFBSSxhQUFhLEdBQWtCLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUV4RyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUTtnQkFDNUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFM0MsSUFBSSxPQUFPLEdBQXlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbkUsSUFBSSxPQUFPO2dCQUNULFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRTlFLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDOUMsSUFBSSxPQUFPO2dCQUNULFdBQVcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFckYsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLGdIQUFnSDtnQkFDaEgsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7WUFFRCxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxQyxJQUFJLE9BQU87Z0JBQ1QsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEUsSUFBSSxhQUFhO2dCQUNmLFdBQVcsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQUEsbUJBQW1CLENBQUMsQ0FBQyxDQUFDOztnQkFFN0csV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RJLENBQUM7UUFFUyxNQUFNLENBQUMsYUFBYSxDQUFDLGtCQUEyQyxFQUFFLE9BQXdCLEVBQUUsY0FBNkIsRUFBRSxjQUFtQztZQUN0SyxNQUFNLElBQUksR0FBMkIsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFFdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3QyxXQUFXLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvRSxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUVuQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBQSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBQSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFckcsSUFBSSxVQUFVLEdBQVksY0FBYyxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDcEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLFVBQVUsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXpKLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUVPLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBVyxFQUFFLGVBQTBCLEVBQUUsZUFBMEIsRUFBRSxPQUFpQjtZQUNsSCw4RUFBOEU7WUFDOUUsSUFBSSxhQUFhLEdBQXdCLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBQSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2pGLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxhQUF3QixDQUFDLENBQUMsaUJBQWlCO2dCQUMvQyxhQUFhLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQztnQkFDdEMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkcsT0FBTyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFFRCxPQUFPLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBd0IsRUFBRSxRQUFzQixFQUFFLEtBQWEsRUFBRSxRQUFnQjtZQUMxRyxNQUFNLElBQUksR0FBMkIsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7O0lBMXZCbUIscUJBQVcsY0EydkJoQyxDQUFBO0FBQ0gsQ0FBQyxFQXJ6QlMsU0FBUyxLQUFULFNBQVMsUUFxekJsQjtBQzd6QkQsSUFBVSxTQUFTLENBZ0dsQjtBQWhHRCxXQUFVLFNBQVM7SUFFakI7OztPQUdHO0lBQ0gsTUFBYSxxQkFBc0IsU0FBUSxVQUFBLGNBQWM7UUFDaEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFzQjtZQUMzQyxVQUFBLGNBQWMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFO2dCQUNoRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsZ0JBQWdCO2FBQzlDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFUyxNQUFNLENBQUMsYUFBYSxDQUFnQixlQUF1QixzQkFBc0IsQ0FBQyxRQUFRO1lBQ2xHLElBQUksSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFBLFdBQVcsQ0FBQyxNQUFNLENBQWUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxrREFBa0Q7WUFFOUgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFckUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQztvQkFDSCxrREFBa0Q7b0JBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLElBQUksQ0FBQyxDQUFDO29CQUM1RCxJQUFJLENBQUMsVUFBVSxDQUNiLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxhQUFhLEVBQ3BJLElBQUksQ0FBQyxjQUFjLENBQ3BCLENBQUM7b0JBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBRTdELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO29CQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDNUIsQ0FBQztnQkFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO29CQUNoQixVQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JCLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNwQixLQUFLLFVBQUEsTUFBTSxDQUFDLEtBQUs7d0JBQ2YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ2pJLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNqSSxNQUFNO29CQUNSLEtBQUssVUFBQSxNQUFNLENBQUMsTUFBTTt3QkFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ2pJLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLHFCQUFxQixDQUFDLENBQUM7d0JBQy9JLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ3ZELE1BQU07b0JBQ1IsS0FBSyxVQUFBLE1BQU0sQ0FBQyxNQUFNO3dCQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDaEksSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsb0JBQW9CLENBQUMsQ0FBQzt3QkFDOUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDdkQsTUFBTTtvQkFDUixLQUFLLFVBQUEsTUFBTSxDQUFDLE1BQU07d0JBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNoSSxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEksQ0FBQztnQkFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMzQixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25CLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNsQixLQUFLLFVBQUEsSUFBSSxDQUFDLE1BQU07d0JBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUM1SCxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQzVILE1BQU07b0JBQ1IsS0FBSyxVQUFBLElBQUksQ0FBQyxLQUFLO3dCQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDbkksSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUNuSSxNQUFNO29CQUNSLEtBQUssVUFBQSxJQUFJLENBQUMsTUFBTTt3QkFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQ3JJLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsQ0FBQzt3QkFDckksTUFBTTtnQkFDVixDQUFDO2dCQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRVMsTUFBTSxDQUFDLGdCQUFnQjtZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQ2xCLE9BQU87WUFFVCxJQUFJLElBQUksR0FBMkIsVUFBQSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNyRSxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO0tBQ0Y7SUF6RlksK0JBQXFCLHdCQXlGakMsQ0FBQTtBQUNILENBQUMsRUFoR1MsU0FBUyxLQUFULFNBQVMsUUFnR2xCO0FDaEdELElBQVUsU0FBUyxDQXdPbEI7QUF4T0QsV0FBVSxTQUFTO0lBU2pCOztPQUVHO0lBQ0gsTUFBYSxZQUFhLFNBQVEsS0FBSztRQWtCckMsc0lBQXNJO1FBQ3RJLFlBQW1CLEtBQW9CLEVBQUUsYUFBaUMsRUFBRSxjQUFzQixFQUFFLGVBQXVCLEVBQUUsZ0JBQXdCLEVBQUUsa0JBQTJCLElBQUksRUFBRSxtQkFBNEIsSUFBSTtZQUN0TixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDYixJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztZQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLGNBQWMsQ0FBQztZQUNwQyxJQUFJLENBQUMsY0FBYyxHQUFHLGVBQWUsQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLGdCQUFnQixDQUFDO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLEdBQUcsZUFBZSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7UUFDMUMsQ0FBQztLQUNGO0lBNUJZLHNCQUFZLGVBNEJ4QixDQUFBO0lBRUQ7O01BRUU7SUFDRixJQUFZLGVBT1g7SUFQRCxXQUFZLGVBQWU7UUFDekIsMkRBQVcsQ0FBQTtRQUNYLDJEQUFXLENBQUE7UUFDWCwyREFBVyxDQUFBO1FBQ1gsMkRBQVcsQ0FBQTtRQUNYLDREQUFZLENBQUE7UUFDWiw0REFBWSxDQUFBO0lBQ2QsQ0FBQyxFQVBXLGVBQWUsR0FBZix5QkFBZSxLQUFmLHlCQUFlLFFBTzFCO0lBRUQ7O01BRUU7SUFDRixJQUFZLFNBT1g7SUFQRCxXQUFZLFNBQVM7UUFDbkIsMkhBQTJIO1FBQzNILCtDQUFPLENBQUE7UUFDUCxrSEFBa0g7UUFDbEgsNkNBQU0sQ0FBQTtRQUNOLG1IQUFtSDtRQUNuSCxtREFBUyxDQUFBLENBQUMsaUNBQWlDO0lBQzdDLENBQUMsRUFQVyxTQUFTLEdBQVQsbUJBQVMsS0FBVCxtQkFBUyxRQU9wQjtJQUVEOzs7Ozs7OztNQVFFO0lBQ0YsSUFBWSxhQVFYO0lBUkQsV0FBWSxhQUFhO1FBQ3ZCLGlEQUFJLENBQUE7UUFDSixxREFBTSxDQUFBO1FBQ04sdURBQU8sQ0FBQTtRQUNQLHlEQUFRLENBQUE7UUFDUixpREFBSSxDQUFBO1FBQ0osdURBQU8sQ0FBQTtRQUNQLHFEQUFNLENBQUE7SUFDUixDQUFDLEVBUlcsYUFBYSxHQUFiLHVCQUFhLEtBQWIsdUJBQWEsUUFReEI7SUFFRCxzSEFBc0g7SUFDdEgsSUFBWSxpQkFPWDtJQVBELFdBQVksaUJBQWlCO1FBQzNCLHlEQUFJLENBQUE7UUFDSixtRUFBUyxDQUFBO1FBQ1QsdUZBQW1CLENBQUE7UUFDbkIsNkVBQWMsQ0FBQTtRQUNkLGlFQUFRLENBQUE7UUFDUix1RkFBbUIsQ0FBQTtJQUNyQixDQUFDLEVBUFcsaUJBQWlCLEdBQWpCLDJCQUFpQixLQUFqQiwyQkFBaUIsUUFPNUI7SUFFRCx3REFBd0Q7SUFDeEQsTUFBYSxVQUFVO1FBU3JCO1lBTk8sYUFBUSxHQUFZLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRW5DLGNBQVMsR0FBWSxVQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxXQUFNLEdBQVksVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakMsY0FBUyxHQUFZLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBR3pDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQixDQUFDO1FBRU0sT0FBTztZQUNaLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QixDQUFDO0tBQ0Y7SUF0Qlksb0JBQVUsYUFzQnRCLENBQUE7SUFFRCxzRUFBc0U7SUFDdEUsTUFBYSxlQUFlO1FBRTFCLFlBQW1CLHNCQUE4QixFQUFFLHFCQUE2QjtZQUM5RSxJQUFJLE9BQU8sSUFBSSxJQUFJLFdBQVc7Z0JBQzVCLE9BQU87WUFDVCxJQUFJLENBQUMscUJBQXFCLEdBQUcsc0JBQXNCLENBQUM7WUFDcEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDO1FBQ3BELENBQUM7UUFFRCxnTkFBZ047UUFDaE4sSUFBVyxlQUFlO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQVcsZUFBZSxDQUFDLE1BQWU7WUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxnREFBZ0Q7UUFDaEQsSUFBVyx5QkFBeUI7WUFDbEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFXLHlCQUF5QixDQUFDLE1BQWM7WUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsR0FBRyxNQUFNLENBQUM7UUFDbEQsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxJQUFXLGdDQUFnQztZQUN6QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQVcsZ0NBQWdDLENBQUMsTUFBYztZQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQztRQUN6RCxDQUFDO1FBRUQsK0ZBQStGO1FBQy9GLElBQVcscUJBQXFCO1lBQzlCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBVyxxQkFBcUIsQ0FBQyxNQUFjO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFDO1FBQzlDLENBQUM7UUFFRCxnS0FBZ0s7UUFDaEssSUFBVyxzQkFBc0I7WUFDL0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFXLHNCQUFzQixDQUFDLFVBQWtCO1lBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO1FBQzdDLENBQUM7UUFFRCxzSkFBc0o7UUFDdEosSUFBVyxlQUFlO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQVcsZUFBZSxDQUFDLE1BQWM7WUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1FBQ3hDLENBQUM7UUFFRCx1RUFBdUU7UUFDdkUsSUFBVyxrQkFBa0I7WUFDM0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFXLGtCQUFrQixDQUFDLE1BQWM7WUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUM7UUFDM0MsQ0FBQztRQUVEOztVQUVFO1FBQ0YsSUFBVyxvQkFBb0I7WUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFXLG9CQUFvQixDQUFDLE1BQWM7WUFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUM7UUFDN0MsQ0FBQztRQUVELHlKQUF5SjtRQUN6SixJQUFXLHFCQUFxQjtZQUM5QixPQUF3QixJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFXLHFCQUFxQixDQUFDLE1BQXVCO1lBQ3RELElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFDO1FBQzlDLENBQUM7UUFFRCwrTkFBK047UUFDL04sSUFBVywyQkFBMkI7WUFDcEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFXLDJCQUEyQixDQUFDLE1BQWM7WUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsR0FBRyxNQUFNLENBQUM7UUFDekQsQ0FBQztRQUVEOzhOQUNzTjtRQUN0TixJQUFXLDBCQUEwQjtZQUNuQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsdUNBQXVDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQVcsMEJBQTBCLENBQUMsTUFBYztZQUNsRCxJQUFJLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxHQUFHLE1BQU0sQ0FBQztRQUNoRSxDQUFDO1FBRUQ7OztXQUdHO1FBQ0gsSUFBVyxnQkFBZ0I7WUFDekIsT0FBTyxVQUFBLE9BQU8sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBVyxnQkFBZ0IsQ0FBQyxNQUFjO1lBQ3hDLFVBQUEsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RSxVQUFBLE9BQU8sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekUsQ0FBQztLQUNGO0lBOUdZLHlCQUFlLGtCQThHM0IsQ0FBQTtBQUNILENBQUMsRUF4T1MsU0FBUyxLQUFULFNBQVMsUUF3T2xCO0FDeE9ELElBQVUsU0FBUyxDQTZTbEI7QUE3U0QsV0FBVSxTQUFTO0lBQ2pCOzs7Ozs7OztTQVFLO0lBQ0wsTUFBc0IsS0FBTSxTQUFRLFVBQUEsU0FBUztRQUMzQyxrR0FBa0c7aUJBQzNFLGNBQVMsR0FBaUIsS0FBSyxBQUF0QixDQUF1QjtRQUN2RCxxRkFBcUY7aUJBQzlELGVBQVUsR0FBbUIsRUFBRSxBQUFyQixDQUFzQjtRQUt2RCxhQUFhLENBQWE7UUFDMUIsV0FBVyxDQUFhO1FBQ3hCLFdBQVcsQ0FBcUI7UUFDaEMsU0FBUyxDQUFxQjtRQUU5QixVQUFVLENBQWtCO1FBQzVCLE9BQU8sQ0FBWTtRQUNuQixrQkFBa0IsQ0FBa0I7UUFFcEMsV0FBVyxDQUFhO1FBQ3hCLFlBQVksQ0FBYTtRQUV6QixtQkFBbUIsQ0FBUztRQUs1QiwyRUFBMkU7UUFDM0UsWUFBbUIsY0FBa0MsSUFBSSxFQUFFLFlBQWdDLElBQUk7WUFDN0YsS0FBSyxFQUFFLENBQUM7WUF0QlYseUZBQXlGO1lBQy9FLGNBQVMsR0FBWSxLQUFLLENBQUMsQ0FBQyw2Q0FBNkM7WUFFbkYsa0JBQWEsR0FBVyxDQUFDLENBQUM7WUFDMUIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7WUFJeEIsZUFBVSxHQUFZLEtBQUssQ0FBQztZQUU1Qix1QkFBa0IsR0FBWSxLQUFLLENBQUM7WUFFcEMsZ0JBQVcsR0FBVyxDQUFDLENBQUM7WUFDeEIsaUJBQVksR0FBVyxDQUFDLENBQUM7WUFxUGpCLGFBQVEsR0FBRyxDQUFDLE1BQWEsRUFBUSxFQUFFO2dCQUN6QyxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDcEI7d0JBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsaURBQXlCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDM0csSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUNuQixNQUFNO29CQUNSO3dCQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLGlEQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQzlHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDbkIsTUFBTTtnQkFDVixDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsZ0JBQVcsR0FBRyxHQUFZLEVBQUU7Z0JBQzFCLElBQUksT0FBTyxHQUFZO29CQUNyQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsbUJBQW1CO29CQUM1QyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsa0JBQWtCO29CQUMxQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVc7b0JBQzVCLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtpQkFDL0IsQ0FBQztnQkFDRixPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDLENBQUM7WUFFRixZQUFPLEdBQUcsQ0FBQyxRQUFpQixFQUFRLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDaEYsQ0FBQyxDQUFDO1lBcFFBLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1lBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1lBRTFCOzs7Y0FHRTtZQUNGLElBQUksQ0FBQyxnQkFBZ0IsMkNBQXNCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsZ0JBQWdCLGlEQUF5QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVTLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUF1QixJQUFZLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuSCxpSkFBaUo7UUFDakosSUFBVyxVQUFVO1lBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBVyxVQUFVLENBQUMsTUFBMEI7WUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztZQUMxQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFFRCxnRUFBZ0U7UUFDaEUsSUFBVyxRQUFRO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBVyxRQUFRLENBQUMsTUFBMEI7WUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsTUFBTTtZQUNmLE9BQU8sSUFBSSxVQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxJQUFXLE1BQU0sQ0FBQyxNQUFlO1lBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBRUQ7O1VBRUU7UUFDRixJQUFXLFdBQVc7WUFDcEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFXLFdBQVcsQ0FBQyxNQUFjO1lBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLFVBQVU7WUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFXLFVBQVUsQ0FBQyxNQUFjO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1lBQzFCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQ7Ozs7V0FJRztRQUNILElBQVcsaUJBQWlCO1lBQzFCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFXLGlCQUFpQixDQUFDLE1BQWU7WUFDMUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSTtnQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFFRDs7V0FFRztRQUNJLFlBQVksQ0FBQyxLQUFhO1lBQy9CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2dCQUNaLE9BQU87WUFFVCxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDO2dCQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDOztnQkFFakMsVUFBQSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLDhEQUE4RCxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25JLENBQUM7UUFFRDs7V0FFRztRQUNJLFdBQVcsQ0FBQyxLQUFXO1lBQzVCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtnQkFDdEIsT0FBTztZQUVULFVBQUEsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRXRGLElBQUksV0FBVyxHQUF1QixLQUFLLENBQUMsWUFBWSxDQUFDLFVBQUEsa0JBQWtCLENBQUMsQ0FBQztZQUM3RSxJQUFJLFFBQVEsR0FBdUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBQSxrQkFBa0IsQ0FBQyxDQUFDO1lBRTlFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDOUIsVUFBQSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLHdDQUF3QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbkksT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQztRQUM5QixDQUFDO1FBRUQsdUlBQXVJO1FBQ2hJLFdBQVc7WUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxPQUFPO1lBQ1osSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUM3QixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN2RCxJQUFJLElBQUksQ0FBQyxtQkFBbUI7d0JBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQzlDLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUM7UUFFRDs7O1dBR0c7UUFDSSxVQUFVO1lBQ2YsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBRUQ7OztVQUdFO1FBQ0ssWUFBWTtZQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQztRQUVNLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RELGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksVUFBQSxPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDN0IsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNyRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSxVQUFVO1lBQ2YsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUMzQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUMsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBaUIsRUFBRSxhQUF1QixJQUFJLEVBQUUsa0JBQTJCLElBQUk7WUFDakcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFdBQVc7Z0JBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxVQUFBLE9BQU8sQ0FBQyxHQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN2QixJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxXQUFXO2dCQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNyRCxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBSVMsYUFBYSxDQUFDLFFBQWlCO1lBQ3ZDLE9BQU8sUUFBUSxDQUFDLFlBQVksQ0FBQztZQUM3QixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDdEIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELDBGQUEwRjtRQUNoRixXQUFXO1lBQ25CLFVBQUEsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFUyxRQUFRO1lBQ2hCLFVBQUEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRVMsV0FBVztZQUNuQixVQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVTLGNBQWMsQ0FBQyxHQUFHLGFBQXVCO1lBQ2pELElBQUksYUFBYSxHQUFZLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyw4REFBOEQ7WUFDdEksSUFBSSxXQUFXLEdBQWMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFakosaUdBQWlHO1lBQ2pHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDMUgsQ0FBQztRQUVTLGNBQWM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFUyxpQkFBaUIsQ0FBQyxRQUFpQixFQUFFLE9BQWdCO1lBQzdELEtBQUssSUFBSSxHQUFHLElBQUksT0FBTztnQkFDckIsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQWVELFdBQVcsQ0FRVDtRQUVGLE9BQU8sQ0FFTDs7SUFqU2tCLGVBQUssUUFrUzFCLENBQUE7QUFDSCxDQUFDLEVBN1NTLFNBQVMsS0FBVCxTQUFTLFFBNlNsQjtBQzdTRCxJQUFVLFNBQVMsQ0FnS2xCO0FBaEtELFdBQVUsU0FBUztJQUNqQjs7O09BR0c7SUFDSCxNQUFzQixVQUFXLFNBQVEsVUFBQSxLQUFLO1FBRzVDLG9CQUFvQjtRQUNwQixTQUFTLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLFNBQVMsR0FBVyxDQUFDLEVBQUUsQ0FBQztRQUN4QixXQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLEtBQUssQ0FBWTtRQUNqQixnQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDN0IsY0FBYyxHQUFXLENBQUMsQ0FBQztRQUUzQixpSkFBaUo7UUFDakosWUFBbUIsY0FBa0MsSUFBSSxFQUFFLFlBQWdDLElBQUksRUFBRSxRQUFpQixJQUFJLFVBQUEsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsZUFBd0IsSUFBSSxVQUFBLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsTCxLQUFLLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVELG9FQUFvRTtRQUNwRTs7O1dBR0c7UUFDSCxJQUFXLElBQUk7WUFDYixPQUFPLElBQUksVUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBVyxJQUFJLENBQUMsTUFBZTtZQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxRQUFRO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO1FBRUQsSUFBVyxRQUFRLENBQUMsTUFBYztZQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUN4QixJQUFJLENBQUM7Z0JBQzRCLElBQUksQ0FBQyxLQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztZQUNqRixDQUFDO1lBQUMsT0FBTyxFQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsUUFBUTtZQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQVcsUUFBUSxDQUFDLE1BQWM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7WUFDeEIsSUFBSSxDQUFDO2dCQUM0QixJQUFJLENBQUMsS0FBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDakYsQ0FBQztZQUFDLE9BQU8sRUFBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLGFBQWE7WUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFXLGFBQWEsQ0FBQyxNQUFjO1lBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO1lBQzdCLElBQUksQ0FBQztnQkFDNEIsSUFBSSxDQUFDLEtBQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1lBQ3JGLENBQUM7WUFBQyxPQUFPLEVBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxVQUFVO1lBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBVyxVQUFVLENBQUMsTUFBYztZQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztZQUMxQixJQUFJLENBQUM7Z0JBQ21CLElBQUksQ0FBQyxLQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztZQUN4RSxDQUFDO1lBQUMsT0FBTyxFQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRDs7VUFFRTtRQUNGLElBQVcsZUFBZTtZQUN4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBVyxlQUFlLENBQUMsTUFBYztZQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDO1lBQy9CLElBQUksQ0FBQztnQkFDbUIsSUFBSSxDQUFDLEtBQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1lBQ3pFLENBQUM7WUFBQyxPQUFPLEVBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELFlBQVk7UUFFWix3QkFBd0I7UUFDakIsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEQsYUFBYSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNDLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sSUFBSSxVQUFBLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM3QixLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFpQixFQUFFLGFBQXVCLElBQUksRUFBRSxrQkFBMkIsSUFBSTtZQUNqRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBVztnQkFDeEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFVBQUEsT0FBTyxDQUFDLEdBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNyRCxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRU0sVUFBVTtZQUNmLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDM0MsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELFlBQVk7UUFFRixjQUFjO1lBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELFdBQVcsR0FBRyxHQUFZLEVBQUU7WUFDMUIsSUFBSSxPQUFPLEdBQVk7Z0JBQ3JCLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDbEMsZUFBZSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQ3RDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDeEIsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN4QixVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDN0IsQ0FBQztZQUNGLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQztRQUVGLE9BQU8sR0FBRyxDQUFDLFFBQWlCLEVBQVEsRUFBRTtZQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDeEcsQ0FBQyxDQUFDO0tBQ0g7SUExSnFCLG9CQUFVLGFBMEovQixDQUFBO0FBQ0gsQ0FBQyxFQWhLUyxTQUFTLEtBQVQsU0FBUyxRQWdLbEI7QUNoS0QsNENBQTRDO0FBQzVDLHNDQUFzQztBQUN0QyxxQ0FBcUM7QUFDckMsc0NBQXNDO0FBQ3RDLGdEQUFnRDtBQUNoRCxvREFBb0Q7QUFDcEQscUNBQXFDO0FBQ3JDLDhDQUE4QztBQUM5QyxpREFBaUQ7QUFDakQsNkNBQTZDO0FBQzdDLHVEQUF1RDtBQUN2RCxpREFBaUQ7QUFDakQsd0NBQXdDO0FBQ3hDLDZDQUE2QztBQUc3QyxrQkFBa0I7QUFDbEIsU0FBUyxRQUFRLENBQUMsTUFBYyxFQUFFLFFBQWdCO0lBQ2hELE9BQU8sT0FBTyxNQUFNLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUMxRCxDQUFDO0FDbkJELElBQVUsU0FBUyxDQTRpQmxCO0FBNWlCRCxXQUFVLFNBQVM7SUE2Q2pCOzs7T0FHRztJQUNILElBQUssd0JBU0o7SUFURCxXQUFLLHdCQUF3QjtRQUMzQixpQ0FBaUM7UUFDakMsMkVBQU0sQ0FBQTtRQUNOLHlCQUF5QjtRQUN6Qiw2RUFBTyxDQUFBO1FBQ1AsdUJBQXVCO1FBQ3ZCLCtFQUFRLENBQUE7UUFDUix3QkFBd0I7UUFDeEIsNkZBQWUsQ0FBQTtJQUNqQixDQUFDLEVBVEksd0JBQXdCLEtBQXhCLHdCQUF3QixRQVM1QjtJQUVEOzs7T0FHRztJQUNILElBQVksa0JBWVg7SUFaRCxXQUFZLGtCQUFrQjtRQUM1QixnRUFBZ0U7UUFDaEUsbUNBQWEsQ0FBQTtRQUNiLHlEQUF5RDtRQUN6RCw0Q0FBc0IsQ0FBQTtRQUN0QiwyREFBMkQ7UUFDM0QsdURBQWlDLENBQUE7UUFDakMsOENBQThDO1FBQzlDLGtEQUE0QixDQUFBO1FBQzVCLDJJQUEySTtRQUMzSSxtQ0FBYSxDQUFBO1FBQ2IsMENBQTBDO0lBQzVDLENBQUMsRUFaVyxrQkFBa0IsR0FBbEIsNEJBQWtCLEtBQWxCLDRCQUFrQixRQVk3QjtJQUVELElBQVksc0JBUVg7SUFSRCxXQUFZLHNCQUFzQjtRQUNoQyx1SUFBdUk7UUFDdkkseUdBQXlHO1FBQ3pHLGlEQUF1QixDQUFBO1FBQ3ZCLG9IQUFvSDtRQUNwSCwrQ0FBcUIsQ0FBQTtRQUNyQixvSkFBb0o7UUFDcEosMkNBQWlCLENBQUE7SUFDbkIsQ0FBQyxFQVJXLHNCQUFzQixHQUF0QixnQ0FBc0IsS0FBdEIsZ0NBQXNCLFFBUWpDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFhLFNBQVUsU0FBUSxVQUFBLE9BQU87UUFDcEMscUdBQXFHO1FBQ3JHLGtFQUFrRTtRQUNsRSx3RkFBd0Y7aUJBQ2pFLGVBQVUsR0FBdUIsRUFBRSxBQUF6QixDQUEwQjtpQkFDcEMsY0FBUyxHQUFXLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQUFBaEQsQ0FBaUQ7UUFZakYsNkJBQTZCLENBQThHO1FBRTNJLFlBQW1CLFFBQWdCLFNBQVMsQ0FBQyxJQUFJLEVBQUUsaUJBQXFDLEVBQUUsRUFBRSxPQUFlLEVBQUU7WUFDM0csS0FBSyxFQUFFLENBQUM7WUFkSCxlQUFVLEdBQVcsU0FBUyxDQUFDO1lBRS9CLGNBQVMsR0FBVyxDQUFDLENBQUM7WUFDdEIsV0FBTSxHQUFtQixFQUFFLENBQUMsQ0FBQyxnRkFBZ0Y7WUFHN0csV0FBTSxHQUEwQixFQUFFLENBQUM7WUFDaEMsb0JBQWUsR0FBVyxFQUFFLENBQUMsQ0FBQywyREFBMkQ7WUFFbkcsNkRBQTZEO1lBQ3JELG9CQUFlLEdBQXlELElBQUksR0FBRyxFQUFtRCxDQUFDO1lBQzNJLGtDQUE2QixHQUFzRCxJQUFJLEdBQUcsRUFBZ0QsQ0FBQztZQUl6SSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsY0FBYyxDQUFDO1lBQ3pDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3hGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLFVBQUEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRVMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQTJCLElBQVksT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNILElBQVcsU0FBUztZQUNsQixtQ0FBbUM7WUFDbkMsSUFBSSxFQUFFLEdBQWUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELElBQVcsR0FBRztZQUNaLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM5QixDQUFDO1FBRUQsSUFBVyxHQUFHLENBQUMsSUFBWTtZQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxVQUFVO1lBQ2YsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdDLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxRQUFRLENBQUMsS0FBYSxFQUFFLFVBQWtCLEVBQUUsYUFBcUM7WUFDdEYsSUFBSSxDQUFDLEdBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksa0JBQTRDLENBQUM7WUFFakQsSUFBSSxhQUFhLElBQUksc0JBQXNCLENBQUMsU0FBUztnQkFDbkQsa0JBQWtCLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUM7O2dCQUV6RyxrQkFBa0IsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQztZQUVySCxDQUFDLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JHLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxlQUFlLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxhQUFxQyxFQUFFLFVBQWtCO1lBQzFHLElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQztZQUM3QixJQUFJLFVBQVUsR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0QsSUFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNELElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUM3QixJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFFN0IsT0FBTyxVQUFVLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksYUFBYSxHQUEwQixJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUMvRixJQUFJLFVBQVUsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDN0IsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUMzRixJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUNYLENBQUM7Z0JBQ0QsVUFBVSxFQUFFLENBQUM7WUFDZixDQUFDO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxRQUFRLENBQUMsS0FBYSxFQUFFLEtBQWE7WUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksV0FBVyxDQUFDLEtBQWE7WUFDOUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUdEOztXQUVHO1FBQ0ksa0JBQWtCO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN2RCwwRkFBMEY7WUFDMUYsd0JBQXdCO1FBQzFCLENBQUM7UUFFRDs7V0FFRztRQUNJLFlBQVksQ0FBQyxLQUFhLEVBQUUsU0FBNkIsRUFBRSxZQUFvQixLQUFLO1lBQ3pGLFFBQVEsU0FBUyxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssa0JBQWtCLENBQUMsSUFBSTtvQkFDMUIscUNBQXFDO29CQUNyQyxPQUFPLFNBQVMsQ0FBQztnQkFDbkIsS0FBSyxrQkFBa0IsQ0FBQyxTQUFTO29CQUMvQixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUzt3QkFDekIsT0FBTyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFLLG9DQUFvQztnQkFDMUUsS0FBSyxrQkFBa0IsQ0FBQyxlQUFlO29CQUNyQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUzt3QkFDekIsa0NBQWtDO3dCQUNsQyxPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUssb0NBQW9DO1lBQzVFLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRDs7OztXQUlHO1FBQ0ksa0JBQWtCLENBQUMsS0FBYSxFQUFFLFNBQTZCO1lBQ3BFLFFBQVEsU0FBUyxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssa0JBQWtCLENBQUMsSUFBSTtvQkFDMUIsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsb0NBQW9DO2dCQUNwQywrREFBK0Q7Z0JBQy9ELGdCQUFnQjtnQkFDaEIsU0FBUztnQkFDVCxpQkFBaUI7Z0JBQ2pCLEtBQUssa0JBQWtCLENBQUMsWUFBWTtvQkFDbEMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDWixLQUFLLGtCQUFrQixDQUFDLFNBQVMsQ0FBQztnQkFDbEMsS0FBSyxrQkFBa0IsQ0FBQyxlQUFlO29CQUNyQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQzVCLE9BQU8sQ0FBQyxDQUFDO29CQUNYLENBQUM7Z0JBQ0g7b0JBQ0UsT0FBTyxDQUFDLENBQUM7WUFDYixDQUFDO1FBQ0gsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLENBQUMsR0FBa0I7Z0JBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLE1BQU0sRUFBRSxFQUFFO2dCQUNWLE1BQU0sRUFBRSxFQUFFO2dCQUNWLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDckMsMkJBQTJCO2FBQzVCLENBQUM7WUFDRixLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxDQUFDLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZGLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsVUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztZQUN0RCw0Q0FBNEM7WUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDakIsS0FBSyxJQUFJLElBQUksSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDakIsS0FBSyxJQUFJLElBQUksSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBbUQsQ0FBQztZQUVsRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsbUNBQW1DLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFNUcsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksR0FBRyxFQUFnRCxDQUFDO1lBRTdGLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELGlDQUFpQztRQUNqQyw2QkFBNkI7UUFDN0IsSUFBSTtRQUVNLGFBQWEsQ0FBQyxRQUFpQjtZQUN2QyxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDNUIsQ0FBQztRQUNEOzs7O1dBSUc7UUFDSyxpQ0FBaUMsQ0FBQyxVQUFrQjtZQUMxRCxJQUFJLGFBQWEsR0FBa0IsRUFBRSxDQUFDO1lBQ3RDLEtBQUssTUFBTSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksbUJBQW1CLEdBQXFCLFVBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxtQkFBbUIsWUFBWSxVQUFBLGlCQUFpQjtvQkFDbEQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDOztvQkFFMUQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFDRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBQ0Q7Ozs7V0FJRztRQUNLLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxjQUE2QjtZQUM3RSxJQUFJLFNBQVMsR0FBdUIsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssSUFBSSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQzdCLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQ3hDLElBQUksT0FBTyxHQUFzQixJQUFJLFVBQUEsaUJBQWlCLEVBQUUsQ0FBQztvQkFDekQsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFzQixDQUFDLE1BQU0sT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixDQUFDO3FCQUFNLENBQUM7b0JBQ04sU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLG1DQUFtQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxZQUFZO1FBRVo7O1dBRUc7UUFDSyxtQkFBbUIsQ0FBQyxVQUFrQixFQUFFLGFBQXFDO1lBQ25GLElBQUksYUFBYSxJQUFJLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuRCxJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDcEIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekUsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDcEIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDakYsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQ7O1dBRUc7UUFDSywyQkFBMkIsQ0FBQyxVQUE4QixFQUFFLEtBQWE7WUFDL0UsSUFBSSxVQUFVLEdBQVksRUFBRSxDQUFDO1lBQzdCLEtBQUssSUFBSSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLFVBQUEsaUJBQWlCLEVBQUUsQ0FBQztvQkFDL0MsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUF1QixVQUFVLENBQUMsQ0FBQyxDQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBcUIsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM3RixDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFFRDs7O1dBR0c7UUFDSyx3QkFBd0IsQ0FBQyxVQUE4QjtZQUM3RCxLQUFLLElBQUksQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxVQUFBLGlCQUFpQixFQUFFLENBQUM7b0JBQy9DLElBQUksUUFBUSxHQUF5QyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25FLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDeEIsSUFBSSxZQUFZLEdBQVcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFDckUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQzFELENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyx3QkFBd0IsQ0FBcUIsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSyw4QkFBOEIsQ0FBQyxLQUErQjtZQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxFQUFFLEdBQXVCLEVBQUUsQ0FBQztnQkFDaEMsUUFBUSxLQUFLLEVBQUUsQ0FBQztvQkFDZCxLQUFLLHdCQUF3QixDQUFDLE1BQU07d0JBQ2xDLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7d0JBQzdCLE1BQU07b0JBQ1IsS0FBSyx3QkFBd0IsQ0FBQyxPQUFPO3dCQUNuQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQzlHLE1BQU07b0JBQ1IsS0FBSyx3QkFBd0IsQ0FBQyxRQUFRO3dCQUNwQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQy9HLE1BQU07b0JBQ1IsS0FBSyx3QkFBd0IsQ0FBQyxlQUFlO3dCQUMzQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQzdKLE1BQU07b0JBQ1I7d0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRDs7OztXQUlHO1FBQ0ssd0JBQXdCLENBQUMsS0FBK0I7WUFDOUQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQixJQUFJLEVBQUUsR0FBMEIsRUFBRSxDQUFDO2dCQUNuQyxRQUFRLEtBQUssRUFBRSxDQUFDO29CQUNkLEtBQUssd0JBQXdCLENBQUMsTUFBTTt3QkFDbEMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7d0JBQ2pCLE1BQU07b0JBQ1IsS0FBSyx3QkFBd0IsQ0FBQyxPQUFPO3dCQUNuQyxFQUFFLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDckQsTUFBTTtvQkFDUixLQUFLLHdCQUF3QixDQUFDLFFBQVE7d0JBQ3BDLEVBQUUsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUN0RCxNQUFNO29CQUNSLEtBQUssd0JBQXdCLENBQUMsZUFBZTt3QkFDM0MsRUFBRSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzt3QkFDMUcsTUFBTTtvQkFDUjt3QkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDZCxDQUFDO2dCQUNELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQ7Ozs7O1dBS0c7UUFDSyxnQ0FBZ0MsQ0FBQyxhQUFpQyxFQUFFLGNBQXdCO1lBQ2xHLElBQUksWUFBWSxHQUF1QixFQUFFLENBQUM7WUFDMUMsS0FBSyxJQUFJLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksVUFBQSxpQkFBaUIsRUFBRSxDQUFDO29CQUNsRCxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBcUIsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNoSCxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRDs7OztXQUlHO1FBQ0ssd0JBQXdCLENBQUMsU0FBNEI7WUFDM0QsSUFBSSxHQUFHLEdBQXNCLElBQUksVUFBQSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3JELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xELElBQUksTUFBTSxHQUFpQixTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLEdBQUcsR0FBaUIsSUFBSSxVQUFBLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1SSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRDs7OztXQUlHO1FBQ0sseUJBQXlCLENBQUMsU0FBNEI7WUFDNUQsSUFBSSxHQUFHLEdBQXNCLElBQUksVUFBQSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3JELElBQUksU0FBUyxHQUFXLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3BELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxHQUFHLEdBQWlCLElBQUksVUFBQSxZQUFZLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBQSx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRDs7OztXQUlHO1FBQ0ssNkJBQTZCLENBQUMsT0FBOEI7WUFDbEUsSUFBSSxFQUFFLEdBQTBCLEVBQUUsQ0FBQztZQUNuQyxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUN6QixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVEOzs7O1dBSUc7UUFDSyw4QkFBOEIsQ0FBQyxPQUE4QjtZQUNuRSxJQUFJLEVBQUUsR0FBMEIsRUFBRSxDQUFDO1lBQ25DLElBQUksU0FBUyxHQUFXLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3BELEtBQUssSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ3pCLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVEOzs7Ozs7V0FNRztRQUNLLGtCQUFrQixDQUFDLGNBQXFDLEVBQUUsSUFBWSxFQUFFLElBQVk7WUFDMUYsSUFBSSxlQUFlLEdBQWEsRUFBRSxDQUFDO1lBQ25DLEtBQUssSUFBSSxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksSUFBSSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7b0JBQ2hFLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxlQUFlLENBQUM7UUFDekIsQ0FBQzs7SUE1Y1UsbUJBQVMsWUE2Y3JCLENBQUE7QUFDSCxDQUFDLEVBNWlCUyxTQUFTLEtBQVQsU0FBUyxRQTRpQmxCO0FDNWlCRCxJQUFVLFNBQVMsQ0FnRmxCO0FBaEZELFdBQVUsU0FBUztJQUNqQjs7Ozs7T0FLRztJQUNILE1BQWEsaUJBQWlCO1FBUTVCLFlBQW1CLE1BQW9CLEVBQUUsVUFBd0IsSUFBSTtZQVA3RCxNQUFDLEdBQVcsQ0FBQyxDQUFDO1lBQ2QsTUFBQyxHQUFXLENBQUMsQ0FBQztZQUNkLE1BQUMsR0FBVyxDQUFDLENBQUM7WUFDZCxNQUFDLEdBQVcsQ0FBQyxDQUFDO1lBS3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBVyxRQUFRLENBQUMsTUFBb0I7WUFDdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFXLFNBQVMsQ0FBQyxPQUFxQjtZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLGFBQWE7WUFDbEIsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEQsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxRQUFRLENBQUMsS0FBYTtZQUMzQixLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDekIsSUFBSSxLQUFLLEdBQVcsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLEtBQUssR0FBVyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRUQ7Ozs7V0FJRztRQUNJLFNBQVM7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEMsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxVQUFBLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNqRixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzdCLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxFQUFFLEdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFFcEQsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLFVBQUEsdUJBQXVCLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDckQsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzdCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDakcsQ0FBQztLQUNGO0lBeEVZLDJCQUFpQixvQkF3RTdCLENBQUE7QUFDSCxDQUFDLEVBaEZTLFNBQVMsS0FBVCxTQUFTLFFBZ0ZsQjtBQ2hGRCxJQUFVLFNBQVMsQ0FrQmxCO0FBbEJELFdBQVUsU0FBUztJQUNqQjs7O09BR0c7SUFDSCxNQUFhLGFBQWMsU0FBUSxVQUFBLGlDQUFpQyxDQUFDLFVBQUEsU0FBUyxDQUFDO1FBQ3RFLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBb0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFnQixJQUFJLENBQUMsSUFBSTtZQUN2RSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixPQUFPLFVBQUEsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRU0sU0FBUztZQUNkLE1BQU0sYUFBYSxHQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkQsYUFBYSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3pDLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7S0FDRjtJQVpZLHVCQUFhLGdCQVl6QixDQUFBO0FBQ0gsQ0FBQyxFQWxCUyxTQUFTLEtBQVQsU0FBUyxRQWtCbEI7QUNsQkQsSUFBVSxTQUFTLENBc0lsQjtBQXRJRCxXQUFVLFNBQVM7SUFFakIsSUFBWSx1QkFJWDtJQUpELFdBQVksdUJBQXVCO1FBQ2pDLDZFQUFRLENBQUE7UUFDUix5RUFBTSxDQUFBO1FBQ04sdUVBQUssQ0FBQTtJQUNQLENBQUMsRUFKVyx1QkFBdUIsR0FBdkIsaUNBQXVCLEtBQXZCLGlDQUF1QixRQUlsQztJQUNELGlFQUFpRTtJQUVqRTs7Ozs7O09BTUc7SUFDSCxNQUFhLFlBQWEsU0FBUSxVQUFBLE9BQU87UUFPdkMsS0FBSyxDQUFTO1FBQ2QsTUFBTSxDQUFTO1FBQ2YsY0FBYyxDQUEwQjtRQUV4QyxRQUFRLEdBQVcsQ0FBQyxDQUFDO1FBQ3JCLFNBQVMsR0FBVyxDQUFDLENBQUM7UUFFdEIsWUFBbUIsUUFBZ0IsQ0FBQyxFQUFFLFNBQWlCLENBQUMsRUFBRSxpQkFBMEMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLFdBQW1CLENBQUMsRUFBRSxZQUFvQixDQUFDO1lBQzVLLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFFM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFVBQUEsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRDs7Ozs7V0FLRztRQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBZ0IsRUFBRSxFQUFnQjtZQUN0RCxPQUFPLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFFRCxJQUFXLElBQUksQ0FBQyxLQUFhO1lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBVyxLQUFLO1lBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7UUFFRCxJQUFXLEtBQUssQ0FBQyxNQUFjO1lBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBVyxhQUFhO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM3QixDQUFDO1FBRUQsSUFBVyxhQUFhLENBQUMsY0FBdUM7WUFDOUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7WUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFFRCxJQUFXLE9BQU87WUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFXLE9BQU8sQ0FBQyxNQUFjO1lBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELElBQVcsUUFBUTtZQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQztRQUVELElBQVcsUUFBUSxDQUFDLE1BQWM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixFQUFFLENBQUM7WUFDdEMsYUFBYSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ2hDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxhQUFhLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDbEQsYUFBYSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3RDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN4QyxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQ25DLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQztZQUNuRCxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQ3pDLGlEQUFpRDtZQUNqRCwrRUFBK0U7WUFDL0Usd0NBQXdDO1lBQ3hDLFNBQVM7WUFDVCxxQ0FBcUM7WUFFckMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU0sVUFBVTtZQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFFUyxhQUFhLENBQUMsUUFBaUI7WUFDdkMsRUFBRTtRQUNKLENBQUM7S0FFRjtJQXJIWSxzQkFBWSxlQXFIeEIsQ0FBQTtBQUNILENBQUMsRUF0SVMsU0FBUyxLQUFULFNBQVMsUUFzSWxCO0FDdElELElBQVUsU0FBUyxDQXNLbEI7QUF0S0QsV0FBVSxTQUFTO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFhLGlCQUFrQixTQUFRLFVBQUEsT0FBTztRQUc1QyxZQUFtQixRQUF3QixFQUFFO1lBQzNDLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQVcsTUFBTTtZQUNmLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxRQUFRLENBQUMsS0FBYTtZQUMzQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUM7Z0JBQ3ZCLE9BQU8sU0FBUyxDQUFDLENBQUMsa0xBQWtMO1lBQ3RNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEtBQUs7Z0JBQ3JELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFHNUIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0RCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2hFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsRCxDQUFDO2dCQUNELGtDQUFrQztnQkFDbEMsK0JBQStCO1lBQ2pDLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQy9DLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsSUFBa0I7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBQSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUVEOzs7V0FHRztRQUNJLFNBQVMsQ0FBQyxJQUFrQixFQUFFLEtBQWMsRUFBRSxNQUFlO1lBQ2xFLElBQUksS0FBSyxJQUFJLElBQUk7Z0JBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxNQUFNLElBQUksSUFBSTtnQkFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBQSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUVEOzs7V0FHRztRQUNJLFNBQVMsQ0FBQyxJQUFrQjtZQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUMzQixPQUFPO2dCQUNULENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVEOztXQUVHO1FBQ0ksT0FBTyxDQUFDLEtBQWE7WUFDMUIsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSTtnQkFDdkIsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEtBQUs7b0JBQ25CLE9BQU8sR0FBRyxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7Ozs7V0FJRztRQUNJLGdCQUFnQixDQUFDLE1BQWM7WUFDcEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM3QyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxJQUFJLEVBQUUsR0FBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQ7Ozs7V0FJRztRQUNJLE1BQU0sQ0FBQyxNQUFjO1lBQzFCLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO2dCQUMxQyxPQUFPLElBQUksQ0FBQztZQUNkLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksT0FBTztZQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNuQixDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksQ0FBQyxHQUFrQjtnQkFDckIsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsaUJBQWlCLEVBQUUsSUFBSTthQUN4QixDQUFDO1lBQ0YsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUQsZ0ZBQWdGO2dCQUNoRixJQUFJLENBQUMsR0FBaUIsSUFBSSxVQUFBLFlBQVksRUFBRSxDQUFDO2dCQUN6QyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBRUQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ1MsYUFBYSxDQUFDLFFBQWlCLElBQWdCLENBQUM7UUFDMUQsWUFBWTtRQUVaOztXQUVHO1FBQ0ssbUJBQW1CO1lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsR0FBc0IsSUFBSSxVQUFBLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsaUtBQWlLO29CQUNqSyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztvQkFDNUIsTUFBTTtnQkFDUixDQUFDO2dCQUNELENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDbEMsQ0FBQztRQUNILENBQUM7S0FDRjtJQS9KWSwyQkFBaUIsb0JBK0o3QixDQUFBO0FBQ0gsQ0FBQyxFQXRLUyxTQUFTLEtBQVQsU0FBUyxRQXNLbEI7QUN0S0QsSUFBVSxTQUFTLENBMEpsQjtBQTFKRCxXQUFVLFNBQVM7SUFDakIsTUFBYSxlQUFnQixTQUFRLFVBQUEsU0FBUztpQkFDckIsY0FBUyxHQUFXLFVBQUEsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxBQUF0RCxDQUF1RDtRQVV2RixzQ0FBc0M7UUFDdEMsWUFBbUIsUUFBZ0IsaUJBQWlCO1lBQ2xELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBWGYsWUFBTyxHQUFZLFVBQUEsY0FBYyxDQUFDLEtBQUssQ0FBQztZQUV2QyxXQUFNLEdBQVcsRUFBRSxDQUFDO1lBQ3BCLGNBQVMsR0FBVyxDQUFDLENBQUM7WUFDdEIsVUFBSyxHQUFZLElBQUksVUFBQSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25DLFNBQUksR0FBWSxJQUFJLFVBQUEsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwQyxTQUFJLEdBQVksSUFBSSxVQUFBLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkMsU0FBSSxHQUFZLElBQUksVUFBQSxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBS3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzVILENBQUM7UUFFRDs7V0FFRztRQUNJLFVBQVUsQ0FBQyxRQUFpQjtZQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDdkMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFFBQWlCLEVBQUUsT0FBZSxFQUFFLFVBQWtCLEVBQUUsTUFBZSxFQUFFLEtBQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLGdCQUF3QjtZQUM3SixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1lBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7WUFFeEMsSUFBSSxLQUFLLEdBQVksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLElBQUksU0FBUyxHQUFjLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUUvQyxJQUFJLFlBQVksR0FBc0IsSUFBSSxVQUFBLGlCQUFpQixFQUFFLENBQUM7WUFDOUQsSUFBSSxZQUFZLEdBQXNCLElBQUksVUFBQSxpQkFBaUIsRUFBRSxDQUFDO1lBQzlELElBQUksTUFBTSxHQUFzQixJQUFJLFVBQUEsaUJBQWlCLEVBQUUsQ0FBQztZQUN4RCxJQUFJLE1BQU0sR0FBc0IsSUFBSSxVQUFBLGlCQUFpQixFQUFFLENBQUM7WUFDeEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQUEsWUFBWSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksVUFBQSxZQUFZLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTVDLEtBQUssSUFBSSxLQUFLLEdBQVcsQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQzFELElBQUksSUFBSSxHQUFXLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDdkQsSUFBSSxRQUFRLEdBQVksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtnQkFDM0gsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQUEsWUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQSxnQkFBZ0I7Z0JBQzVHLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFBLFlBQVksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUEsZ0JBQWdCO1lBQy9HLENBQUM7WUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUc7Z0JBQ3hCLFlBQVksRUFBRTtvQkFDWixtQkFBbUIsRUFBRSxDQUFDOzRCQUNwQixVQUFVLEVBQUU7Z0NBQ1YsYUFBYSxFQUFFO29DQUNiLENBQUMsRUFBRSxZQUFZO29DQUNmLENBQUMsRUFBRSxZQUFZO2lDQUNoQjtnQ0FDRCxTQUFTLEVBQUU7b0NBQ1QsQ0FBQyxFQUFFLE1BQU07b0NBQ1QsQ0FBQyxFQUFFLE1BQU07aUNBQ1Y7NkJBQ0Y7eUJBQ0YsQ0FBQztpQkFDSDthQUNGLENBQUM7WUFFRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRO1lBQ2IsT0FBTyxJQUFJLFVBQUEsT0FBTyxDQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FDakQsQ0FBQztRQUNKLENBQUM7UUFFRDs7V0FFRztRQUNJLFlBQVk7WUFDakIsSUFBSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO1lBQ3RCLElBQUksS0FBSyxHQUFXLENBQUMsQ0FBQztZQUN0QixJQUFJLFNBQVMsR0FBYyxFQUFFLENBQUM7WUFDOUIsS0FBSyxJQUFJLEtBQUssR0FBVyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDekQsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQUEsT0FBTyxDQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RCxDQUFDLENBQUM7Z0JBRUgsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUM1QixLQUFLLEdBQUcsQ0FBQyxDQUFDO29CQUNWLEtBQUssRUFBRSxDQUFDO2dCQUNWLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELGtCQUFrQjtRQUNYLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBaUIsRUFBRSxVQUFxQixFQUFFLGVBQXlCO1lBQ3JGLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzVILENBQUM7UUFFTSxTQUFTO1lBQ2QsSUFBSSxhQUFhLEdBQWtCLEVBQUUsQ0FBQztZQUN0QyxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDM0MsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3pDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDekMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztnQkFDaEQsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFhLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRXZFLElBQUksbUJBQW1CLEdBQXVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUN0RSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDLENBQUMsaUNBQWlDO1lBQy9ELHdEQUF3RDtZQUN4RCxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDLENBQUMsNkJBQTZCO1lBQzVFLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQWlCO1lBQ3hDLE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksRUFBRSxDQUFDLFNBQVM7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBWSxNQUFNLFVBQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7O2dCQUVoRSxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQUEsY0FBYyxDQUFDLEtBQUssQ0FBQztZQUV0QyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO2dCQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN0SCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxZQUFZO1FBRVo7O1dBRUc7UUFDSSxrQkFBa0I7WUFDdkIsSUFBSSxTQUFTLEdBQWMsSUFBSSxVQUFBLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbkcsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQzs7SUF2SlUseUJBQWUsa0JBd0ozQixDQUFBO0FBQ0gsQ0FBQyxFQTFKUyxTQUFTLEtBQVQsU0FBUyxRQTBKbEI7QUMxSkQsSUFBVSxTQUFTLENBMkVsQjtBQTNFRCxXQUFVLFNBQVM7SUFDakI7OztPQUdHO0lBQ0gsTUFBYSxLQUFNLFNBQVEsVUFBQSxPQUFPO1FBUWhDLFlBQW1CLElBQWtCO1lBQ25DLEtBQUssRUFBRSxDQUFDO1lBUkgsU0FBSSxHQUFXLE9BQU8sQ0FBQztZQUN2QixlQUFVLEdBQVcsU0FBUyxDQUFDO1lBQy9CLFdBQU0sR0FBZ0IsU0FBUyxDQUFDO1lBQ2hDLFNBQUksR0FBUSxTQUFTLENBQUM7WUFDckIsUUFBRyxHQUFnQixTQUFTLENBQUM7WUFDN0IsVUFBSyxHQUFZLEtBQUssQ0FBQztZQUk3QixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsVUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxJQUFXLE9BQU87WUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFFRDs7V0FFRztRQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBaUI7WUFDakMsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBQSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsTUFBTSxRQUFRLEdBQWEsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNwRSxNQUFNLFdBQVcsR0FBZ0IsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUQsSUFBSSxNQUFNLEdBQWdCLE1BQU0sVUFBQSxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxpQ0FBbUIsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxrQkFBa0I7UUFDWCxTQUFTO1lBQ2QsT0FBTztnQkFDTCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2FBQ2hCLENBQUM7UUFDSixDQUFDO1FBQ00sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxVQUFBLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztZQUNoQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWlCLEVBQUUsVUFBcUIsRUFBRSxlQUF5QjtZQUNyRixJQUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsOENBQThDO1lBQzlFLElBQUksUUFBUSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtnQkFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsaURBQWlEO1lBQ2pELE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3BELGlEQUFpRDtZQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVTLGFBQWEsQ0FBQyxRQUFpQjtZQUN2QywrQkFBK0I7WUFDL0IsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3hCLENBQUM7S0FFRjtJQXJFWSxlQUFLLFFBcUVqQixDQUFBO0FBQ0gsQ0FBQyxFQTNFUyxTQUFTLEtBQVQsU0FBUyxRQTJFbEI7QUUzRUQsNkNBQTZDO0FBQzdDLElBQVUsU0FBUyxDQXlFbEI7QUExRUQsNkNBQTZDO0FBQzdDLFdBQVUsU0FBUztJQUNqQjs7OztPQUlHO0lBQ0gsTUFBYSxZQUFhLFNBQVEsWUFBWTtRQUM1QyxvR0FBb0c7aUJBQzdFLFlBQU8sR0FBaUIsSUFBSSxZQUFZLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxBQUFwRixDQUFxRjtpQkFDcEcsZ0JBQVcsR0FBVSxJQUFJLEtBQUssNkNBQW9CLEFBQXZDLENBQXdDO1FBTWxFLFlBQW1CLGVBQXFDO1lBQ3RELEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUpqQixVQUFLLEdBQVMsSUFBSSxDQUFDO1lBQ25CLGdCQUFXLEdBQTJCLElBQUksQ0FBQztZQXNCbkQ7O2VBRUc7WUFDSSxhQUFRLEdBQUcsQ0FBQyxNQUFtQixFQUFRLEVBQUU7Z0JBQzlDLElBQUksSUFBSSxDQUFDLEtBQUs7b0JBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLDREQUEwQixDQUFDLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxNQUFNO29CQUNULE9BQU87Z0JBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSywwREFBMEIsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsQ0FBQztZQUVGOztlQUVHO1lBQ0ksd0JBQW1CLEdBQUcsR0FBUyxFQUFFO2dCQUN0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDcEIsQ0FBQyxDQUFDO1lBRUY7O2VBRUc7WUFDSSxlQUFVLEdBQUcsQ0FBQyxZQUEyQyxFQUFRLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDO1lBQ2xDLENBQUMsQ0FBQztZQUVGOztlQUVHO1lBQ0ksV0FBTSxHQUFHLEdBQVMsRUFBRTtnQkFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVM7b0JBQ3pCLE9BQU87Z0JBQ1QsNERBQTREO2dCQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3BELElBQUksSUFBSSxDQUFDLFdBQVc7b0JBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxDQUFDLENBQUM7WUF0REEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsTUFBTSxDQUFDLE1BQWM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNoQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLE1BQU07WUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM5QixDQUFDOztJQTNCVSxzQkFBWSxlQWtFeEIsQ0FBQTtBQUNILENBQUMsRUF6RVMsU0FBUyxLQUFULFNBQVMsUUF5RWxCO0FDMUVELHdCQUF3QjtBQUV4QixVQUFVO0FBQ1Ysc0RBQXNEO0FBQ3RELFVBQVU7QUFDVixxRkFBcUY7QUFFckYsVUFBVTtBQUNWLHNEQUFzRDtBQUN0RCw0REFBNEQ7QUFDNUQsd0RBQXdEO0FBQ3hELGtEQUFrRDtBQUNsRCw4Q0FBOEM7QUFDOUMsVUFBVTtBQUNWLGlDQUFpQztBQUNqQyw4QkFBOEI7QUFDOUIsNEJBQTRCO0FBQzVCLFFBQVE7QUFDUixVQUFVO0FBQ1YseURBQXlEO0FBQ3pELDJDQUEyQztBQUMzQyxVQUFVO0FBQ1YscUNBQXFDO0FBRXJDLG1EQUFtRDtBQUVuRCxxQ0FBcUM7QUFDckMsbURBQW1EO0FBQ25ELGdEQUFnRDtBQUVoRCx1Q0FBdUM7QUFDdkMsMENBQTBDO0FBRTFDLDBGQUEwRjtBQUMxRiwwRkFBMEY7QUFDMUYsOEVBQThFO0FBQzlFLHFEQUFxRDtBQUNyRCxxREFBcUQ7QUFDckQsbUVBQW1FO0FBQ25FLGdCQUFnQjtBQUNoQixxQkFBcUI7QUFDckIsOENBQThDO0FBQzlDLGlGQUFpRjtBQUNqRixvQkFBb0I7QUFDcEIseUJBQXlCO0FBQ3pCLDZGQUE2RjtBQUM3RixvQkFBb0I7QUFDcEIsZ0JBQWdCO0FBQ2hCLFlBQVk7QUFFWiw2RUFBNkU7QUFDN0UscURBQXFEO0FBQ3JELG1FQUFtRTtBQUNuRSxnQkFBZ0I7QUFDaEIscUJBQXFCO0FBQ3JCLDhDQUE4QztBQUM5QyxpRkFBaUY7QUFDakYsb0JBQW9CO0FBQ3BCLGdCQUFnQjtBQUNoQixZQUFZO0FBRVosd0RBQXdEO0FBQ3hELDBDQUEwQztBQUMxQyxZQUFZO0FBRVoseUhBQXlIO0FBQ3pILGdFQUFnRTtBQUNoRSw4Q0FBOEM7QUFDOUMsNENBQTRDO0FBRTVDLGdFQUFnRTtBQUNoRSw4Q0FBOEM7QUFDOUMsNENBQTRDO0FBRTVDLDZHQUE2RztBQUM3RyxZQUFZO0FBRVosNERBQTREO0FBQzVELDJDQUEyQztBQUMzQyxZQUFZO0FBRVosNENBQTRDO0FBQzVDLHFDQUFxQztBQUNyQyxZQUFZO0FBRVosb0VBQW9FO0FBQ3BFLHFEQUFxRDtBQUNyRCwrREFBK0Q7QUFDL0QsWUFBWTtBQUVaLCtDQUErQztBQUMvQywwQ0FBMEM7QUFDMUMsWUFBWTtBQUVaLHlGQUF5RjtBQUN6RiwyQ0FBMkM7QUFDM0MsMkhBQTJIO0FBQzNILFlBQVk7QUFFWiwwQ0FBMEM7QUFDMUMscUNBQXFDO0FBQ3JDLFlBQVk7QUFFWixvRUFBb0U7QUFDcEUsa0RBQWtEO0FBQ2xELHNEQUFzRDtBQUN0RCx5Q0FBeUM7QUFDekMsbUdBQW1HO0FBQ25HLHlIQUF5SDtBQUV6SCw0REFBNEQ7QUFDNUQsWUFBWTtBQUNaLFFBQVE7QUFDUixJQUFJO0FDakhKLElBQVUsU0FBUyxDQThDbEI7QUE5Q0QsV0FBVSxTQUFTO0lBQ2pCOzs7T0FHRztJQUNILE1BQWEseUJBQTBCLFNBQVEsVUFBQSxTQUFTO2lCQUMvQixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQVFqRyxZQUFtQixnQkFBd0IsRUFBRSxFQUFFLFFBQWdCLElBQUksRUFBRSx1QkFBK0IsR0FBRyxFQUFFLHFCQUE2QixDQUFDLEVBQUUsd0JBQWdDLENBQUM7WUFDeEssS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsb0JBQW9CLENBQUM7WUFDaEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDO1lBQzVDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztRQUNwRCxDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQjtnQkFDakMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtnQkFDN0MsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtnQkFDekMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjthQUNoRCxDQUFDO1lBQ0YsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFELE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQztZQUNoRCxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDaEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztZQUM5RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixDQUFDO1lBQzFELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxjQUFjLENBQUMsb0JBQW9CLENBQUM7WUFDaEUsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDOztJQXZDVSxtQ0FBeUIsNEJBd0NyQyxDQUFBO0FBQ0gsQ0FBQyxFQTlDUyxTQUFTLEtBQVQsU0FBUyxRQThDbEI7QUM5Q0Qsd0NBQXdDO0FBQ3hDLGtEQUFrRDtBQUVsRCxJQUFVLFNBQVMsQ0F5TWxCO0FBNU1ELHdDQUF3QztBQUN4QyxrREFBa0Q7QUFFbEQsV0FBVSxTQUFTO0lBRWpCOzs7T0FHRztJQUNILE1BQWEsaUJBQWtCLFNBQVEsVUFBQSxTQUFTO2lCQUN2QixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQUFBeEQsQ0FBeUQ7UUFRekYsTUFBTSxDQUFhO1FBQ25CLFVBQVUsQ0FBTztRQUNqQixTQUFTLENBQWE7UUFFdEIsWUFBbUIsVUFBc0IsRUFBRSxZQUFnQyxVQUFBLGtCQUFrQixDQUFDLElBQUksRUFBRSxnQkFBd0MsVUFBQSxzQkFBc0IsQ0FBQyxTQUFTO1lBQzFLLEtBQUssRUFBRSxDQUFDO1lBUkgsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1lBQ2xDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1lBRXhDLFdBQU0sR0FBVyxDQUFDLENBQUM7WUFFbkIsY0FBUyxHQUFXLENBQUMsQ0FBQztZQXFJdEIseUJBQXlCO1lBQ3pCOzs7O2VBSUc7WUFDSyx3QkFBbUIsR0FBRyxDQUFDLEVBQVMsRUFBRSxLQUFjLEVBQVcsRUFBRTtnQkFDbkUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxDQUFDO29CQUMvQixPQUFPLElBQUksQ0FBQztnQkFFZCxJQUFJLElBQUksR0FBVyxLQUFLLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN4RSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksVUFBQSxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDdkQsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEQsQ0FBQztnQkFDRCxJQUFJLFNBQVMsR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9FLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUV2RyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUN0QixJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO29CQUN2QyxJQUFJLE9BQU8sR0FBWSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDbkYsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3BDLENBQUM7b0JBQ0QsT0FBTyxPQUFPLENBQUM7Z0JBQ2pCLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUM7WUFZRjs7ZUFFRztZQUNLLGdCQUFXLEdBQUcsR0FBUyxFQUFFO2dCQUMvQixJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNuQyxJQUFJLElBQUksQ0FBQyxpQkFBaUI7b0JBQ3hCLFFBQVEsSUFBSSxVQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQztZQWpMQSxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztZQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztZQUU1QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksVUFBQSxJQUFJLEVBQUUsQ0FBQztZQUU3Qix1RUFBdUU7WUFDdkUsSUFBSSxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1lBRXJDLElBQUksQ0FBQyxnQkFBZ0IsaURBQXlCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsZ0JBQWdCLDJDQUFzQixHQUFHLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLHlDQUFxQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBVyxLQUFLLENBQUMsTUFBYztZQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUVELElBQVcsS0FBSztZQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0gsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQzFELENBQUM7UUFFRCxJQUFXLElBQUksQ0FBQyxLQUFhO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUVNLFFBQVEsQ0FBQyxHQUFZO1lBQzFCLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2dCQUNaLE9BQU87WUFFVCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLEtBQWE7WUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztZQUN6QyxJQUFJLE9BQU8sR0FBWSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxXQUFXLENBQUMsTUFBYztZQUMvQixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqRCxJQUFJLElBQUk7Z0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBRUQ7Ozs7V0FJRztRQUNJLGVBQWUsQ0FBQyxLQUFhO1lBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixFQUFFLENBQUM7WUFDdEMsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFELGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDdEQsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3ZDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUMvQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDakMsYUFBYSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUN6RCxhQUFhLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFFckQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFNBQVMsR0FBYyxNQUFNLFVBQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQztZQUNoRCxJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztZQUMxRCxJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQyxlQUFlLENBQUM7WUFFdEQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFpQixFQUFFLGFBQXVCLElBQUksRUFBRSxrQkFBMkIsSUFBSTtZQUNqRyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUMxRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFFTSx3QkFBd0IsQ0FBQyxRQUFpQjtZQUMvQyxJQUFJLEtBQUssR0FBMEIsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVFLElBQUksS0FBSyxDQUFDLFFBQVE7Z0JBQ2hCLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBQSxrQkFBa0IsQ0FBQztZQUN0QyxJQUFJLEtBQUssQ0FBQyxZQUFZO2dCQUNwQixLQUFLLENBQUMsWUFBWSxHQUFHLFVBQUEsc0JBQXNCLENBQUM7WUFDOUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsWUFBWTtRQUVKLGlCQUFpQixDQUFDLEdBQVk7WUFDcEMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFBLE9BQU8sQ0FBQyxJQUFJLElBQUksVUFBQSxJQUFJLENBQUMsTUFBTSxJQUFJLFVBQUEsT0FBTyxDQUFDLElBQUksSUFBSSxVQUFBLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hHLFVBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsdUNBQW9CLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsNkNBQXVCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzdFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixVQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLHVDQUFvQixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLDZDQUF1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNoRixDQUFDO1FBQ0gsQ0FBQztRQWdDRDs7O1dBR0c7UUFDSyxhQUFhLENBQUMsT0FBaUI7WUFDckMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDOztJQXRMVSwyQkFBaUIsb0JBa003QixDQUFBO0FBQ0gsQ0FBQyxFQXpNUyxTQUFTLEtBQVQsU0FBUyxRQXlNbEI7QUM1TUQsSUFBVSxTQUFTLENBZ1dsQjtBQWhXRCxXQUFVLFNBQVM7SUFFakIsSUFBWSxZQVNYO0lBVEQsV0FBWSxZQUFZO1FBQ3RCLG1EQUFtQyxDQUFBO1FBQ25DLG1EQUFtQyxDQUFBO1FBQ25DLGlEQUFpQyxDQUFBO1FBQ2pDLGdEQUFnQyxDQUFBO1FBQ2hDLDRDQUE0QixDQUFBO1FBQzVCLDhDQUE4QixDQUFBO1FBQzlCLDRDQUE0QixDQUFBO1FBQzVCLGdEQUFnQyxDQUFBO0lBQ2xDLENBQUMsRUFUVyxZQUFZLEdBQVosc0JBQVksS0FBWixzQkFBWSxRQVN2QjtJQUVELElBQVksZUFFWDtJQUZELFdBQVksZUFBZTtRQUN6Qix5REFBTSxDQUFBO1FBQUUseURBQU0sQ0FBQTtRQUFFLHFEQUFJLENBQUE7SUFDdEIsQ0FBQyxFQUZXLGVBQWUsR0FBZix5QkFBZSxLQUFmLHlCQUFlLFFBRTFCO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsTUFBYSxjQUFlLFNBQVEsVUFBQSxTQUFTO2lCQUNwQixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEFBQXJELENBQXNEO1FBY3RGLFlBQW1CLFNBQWdCLElBQUksRUFBRSxRQUFpQixLQUFLLEVBQUUsU0FBa0IsS0FBSyxFQUFFLGdCQUE4QixVQUFBLFlBQVksQ0FBQyxPQUFPO1lBQzFJLEtBQUssRUFBRSxDQUFDO1lBZFYseUZBQXlGO1lBQ2xGLGFBQVEsR0FBYyxVQUFBLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUV4QyxjQUFTLEdBQVksS0FBSyxDQUFDO1lBTzdCLFlBQU8sR0FBWSxLQUFLLENBQUM7WUFDekIsYUFBUSxHQUFZLEtBQUssQ0FBQztZQTRNbEMsWUFBWTtZQUdKLGtCQUFhLEdBQWtCLENBQUMsTUFBYSxFQUFFLEVBQUU7Z0JBQ3ZELFVBQUEsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzlELElBQUksSUFBSSxDQUFDLE9BQU87b0JBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQixDQUFDLENBQUM7WUFFTSxrQkFBYSxHQUFrQixDQUFDLE1BQWEsRUFBRSxFQUFFO2dCQUN2RCxpRUFBaUU7Z0JBQ2pFLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQztZQXNDRjs7O2VBR0c7WUFDSyxpQkFBWSxHQUFHLENBQUMsTUFBYSxFQUFRLEVBQUU7Z0JBQzdDLHFCQUFxQjtnQkFDckIsSUFBSSxNQUFNLENBQUMsSUFBSSw0Q0FBdUIsRUFBRSxDQUFDO29CQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQiwyREFBMkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsNkRBQTJCLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzdFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLDhDQUFxQixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNsRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZGLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQiwyREFBMkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDaEYsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsNkRBQTJCLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ2hGLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLDhDQUFxQixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNyRSxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDeEIsQ0FBQztnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixDQUFDLENBQUM7WUFFRjs7ZUFFRztZQUNLLGdCQUFXLEdBQUcsQ0FBQyxNQUFhLEVBQVEsRUFBRTtnQkFDNUMscUJBQXFCO2dCQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksNERBQTRCLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsQ0FBQyxDQUFDO1lBRUY7O2VBRUc7WUFDSyxXQUFNLEdBQUcsQ0FBQyxNQUFhLEVBQVEsRUFBRTtnQkFDdkMsSUFBSSxTQUFTLEdBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDekMsSUFBSSxJQUFJLENBQUMsSUFBSTtvQkFDWCxTQUFTLEdBQUcsVUFBQSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFbkUsbUNBQW1DO2dCQUNuQyxJQUFJLFFBQVEsR0FBWSxTQUFTLENBQUMsV0FBVyxDQUFDO2dCQUM5QyxJQUFJLE9BQU8sR0FBWSxVQUFBLE9BQU8sQ0FBQyxjQUFjLENBQUMsVUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFOUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFFekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFFM0MsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4Qix1RkFBdUY7Z0JBQ3ZGLElBQUksSUFBSSxDQUFDLElBQUk7b0JBQ1gsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQztZQS9TQSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRWpDLElBQUksQ0FBQyxnQkFBZ0IsMkNBQXNCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsZ0JBQWdCLGlEQUF5QixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFakUsSUFBSSxNQUFNO2dCQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUVELElBQVcsTUFBTSxDQUFDLE1BQWM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNoQyxDQUFDO1FBRUQsSUFBVyxNQUFNO1lBQ2YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDOUIsQ0FBQztRQUVELElBQVcsSUFBSSxDQUFDLEdBQVk7WUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxJQUFXLElBQUk7WUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFXLFlBQVksQ0FBQyxNQUFjO1lBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDMUMsQ0FBQztRQUVELElBQVcsWUFBWTtZQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUN4QyxDQUFDO1FBR0QsSUFBVyxTQUFTO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDO1FBRUQsSUFBVyxVQUFVO1lBQ25CLE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQVcsVUFBVTtZQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksUUFBUSxDQUFDLE1BQWE7WUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRO1lBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFFRDs7V0FFRztRQUNJLFNBQVMsQ0FBQyxTQUF1QixFQUFFLE1BQWM7WUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsb0RBQW9EO1FBQ3BEOztXQUVHO1FBQ0ksZ0JBQWdCLENBQUMsS0FBc0I7WUFDNUMsSUFBSSxJQUFJLEdBQWMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxJQUFJLE9BQU8sR0FBWSxVQUFBLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25ELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRDs7V0FFRztRQUNJLFlBQVksQ0FBQyxLQUFzQjtZQUN4QyxRQUFRLEtBQUssRUFBRSxDQUFDO2dCQUNkLEtBQUssZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDaEQsS0FBSyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNoRCxLQUFLLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7UUFFRDs7V0FFRztRQUNJLElBQUksQ0FBQyxHQUFZO1lBQ3RCLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixrQ0FBb0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNyRSxDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLGtDQUFvQixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEUsQ0FBQzs7Z0JBQ0MsSUFBSSxDQUFDO29CQUNILElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLENBQUM7Z0JBQUMsT0FBTyxNQUFlLEVBQUUsQ0FBQyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7WUFDeEYsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDckIsQ0FBQztRQUVEOzs7Ozs7Ozs7Ozs7OztXQWNHO1FBQ0ksZ0JBQWdCLENBQUMsTUFBaUIsRUFBRSxPQUFrQjtZQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0IsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRLENBQUMsR0FBWTtZQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxPQUFPLENBQUMsR0FBWTtZQUN6QixJQUFJLEdBQUc7Z0JBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Z0JBRTFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVNLFVBQVU7WUFDZixJQUFJLFFBQVEsR0FBYyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9FLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxVQUFBLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLElBQUksS0FBSyxHQUFVLFVBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9DLFVBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFBLGNBQWMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNELFVBQUEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUFBLENBQUM7UUFFRixrQkFBa0I7UUFDWCxTQUFTO1lBQ2QsSUFBSSxhQUFhLEdBQWtCLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyRCxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDO1lBQ2xELGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNyQyxhQUFhLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDL0IsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ25DLDhEQUE4RDtZQUM5RCxvQ0FBb0M7WUFDcEMsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUNNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksS0FBSyxHQUFpQixNQUFNLFVBQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSxVQUFVO1lBQ2YsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QyxJQUFJLEtBQUssR0FBWSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ25DLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLHFDQUFxQztZQUMzRCxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDekIsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMseUJBQXlCO1lBQ2hELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCwwREFBMEQ7UUFDMUQsa0NBQWtDO1FBQ2xDLHNDQUFzQztRQUN0QyxrQ0FBa0M7UUFDbEMsSUFBSTtRQUVNLGFBQWEsQ0FBQyxRQUFpQjtZQUN2QyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUMzQixDQUFDO1FBZU8sT0FBTyxDQUFDLGdCQUE4QixVQUFBLFlBQVksQ0FBQyxPQUFPO1lBQ2hFLElBQUksTUFBTSxHQUFZLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUVPLFlBQVksQ0FBQyxNQUFhLEVBQUUsS0FBYyxFQUFFLGdCQUF3QixHQUFHO1lBQzdFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDNUIsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVqQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3JDLENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUM7UUFDcEMsQ0FBQztRQUVPLGdCQUFnQjtZQUN0QixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7O0lBelFVLHdCQUFjLGlCQWlVMUIsQ0FBQTtBQUNILENBQUMsRUFoV1MsU0FBUyxLQUFULFNBQVMsUUFnV2xCO0FDaFdELElBQVUsU0FBUyxDQWdEbEI7QUFoREQsV0FBVSxTQUFTO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFhLHNCQUF1QixTQUFRLFVBQUEsU0FBUztRQUFyRDs7WUFFUyxhQUFRLEdBQWMsVUFBQSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUF1Q3BELENBQUM7aUJBeEN3QixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsQUFBN0QsQ0FBOEQ7UUFHOUY7O1dBRUc7UUFDSSxNQUFNLENBQUMsU0FBd0I7WUFDcEMsSUFBSSxTQUFTLEdBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxJQUFJO2dCQUNYLFNBQVMsR0FBRyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRW5FLG1DQUFtQztZQUNuQyxJQUFJLFFBQVEsR0FBWSxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQzlDLElBQUksT0FBTyxHQUFZLFVBQUEsT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlFLElBQUksRUFBRSxHQUFZLFVBQUEsT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEUsSUFBSSxTQUFTLENBQUMsU0FBUyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUV2QyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUVyQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdCLENBQUM7aUJBQU0sQ0FBQztnQkFDTiwyRUFBMkU7Z0JBQzNFLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlFLENBQUM7WUFFRCxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEIsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25CLElBQUksSUFBSSxDQUFDLElBQUk7Z0JBQ1gsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTVCLGtGQUFrRjtRQUNwRixDQUFDOztJQXhDVSxnQ0FBc0IseUJBeUNsQyxDQUFBO0FBQ0gsQ0FBQyxFQWhEUyxTQUFTLEtBQVQsU0FBUyxRQWdEbEI7QUNoREQsSUFBVSxTQUFTLENBbUVsQjtBQW5FRCxXQUFVLFNBQVM7SUFDakI7OztPQUdHO0lBQ0gsTUFBYSxjQUFlLFNBQVEsVUFBQSxTQUFTO2lCQUNwQixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFdEYsVUFBVSxDQUFTO1FBQ25CLFVBQVUsQ0FBUztRQUNuQixzQkFBc0IsQ0FBUztRQUUvQixZQUFtQixhQUFxQixJQUFJLEVBQUUsYUFBcUIsR0FBRyxFQUFFLHdCQUFnQyxHQUFHO1lBQ3pHLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDN0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHFCQUFxQixDQUFDO1FBQ3RELENBQUM7UUFFRCxJQUFXLFNBQVM7WUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFXLFNBQVMsQ0FBQyxNQUFjO1lBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELElBQVcsU0FBUztZQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQztRQUNELElBQVcsU0FBUyxDQUFDLE1BQWM7WUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsSUFBVyxxQkFBcUI7WUFDOUIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDckMsQ0FBQztRQUNELElBQVcscUJBQXFCLENBQUMsTUFBYztZQUM3QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsVUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMxQixvQkFBb0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCO2FBQ2xELENBQUM7WUFDRixhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUMzQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixDQUFDO1lBQ2xFLE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLFVBQVU7WUFDZixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkMsT0FBTyxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztZQUMzRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDOztJQTVEVSx3QkFBYyxpQkE2RDFCLENBQUE7QUFDSCxDQUFDLEVBbkVTLFNBQVMsS0FBVCxTQUFTLFFBbUVsQjtBQ25FRCxxQ0FBcUM7QUFDckMsSUFBVSxTQUFTLENBOFNsQjtBQS9TRCxxQ0FBcUM7QUFDckMsV0FBVSxTQUFTO0lBQ2pCLElBQVksYUFJWDtJQUpELFdBQVksYUFBYTtRQUN2QiwwQ0FBeUIsQ0FBQTtRQUN6QixzQ0FBcUIsQ0FBQTtRQUNyQixzQ0FBcUIsQ0FBQTtJQUN2QixDQUFDLEVBSlcsYUFBYSxHQUFiLHVCQUFhLEtBQWIsdUJBQWEsUUFJeEI7SUFDRDs7O09BR0c7SUFDSCxJQUFZLFVBS1g7SUFMRCxXQUFZLFVBQVU7UUFDcEIsaUNBQW1CLENBQUE7UUFDbkIsMkNBQTZCLENBQUE7UUFDN0IsbUNBQXFCLENBQUE7UUFDckIsK0JBQWlCLENBQUE7SUFDbkIsQ0FBQyxFQUxXLFVBQVUsR0FBVixvQkFBVSxLQUFWLG9CQUFVLFFBS3JCO0lBQ0Q7OztPQUdHO0lBQ0gsTUFBYSxlQUFnQixTQUFRLFVBQUEsU0FBUztRQUE5Qzs7WUFHUyxhQUFRLEdBQWMsVUFBQSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0Msa0JBQWEsR0FBVSxJQUFJLFVBQUEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsc0RBQXNEO1lBQzNHLHNJQUFzSTtZQUM5SCxlQUFVLEdBQWUsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxnQkFBVyxHQUFXLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QjtZQUN0RCxnQkFBVyxHQUFXLEdBQUcsQ0FBQztZQUMxQixjQUFTLEdBQWtCLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDbEQsU0FBSSxHQUFXLENBQUMsQ0FBQztZQUNqQixRQUFHLEdBQVcsSUFBSSxDQUFDO1lBQ25CLHNCQUFpQixHQUFZLElBQUksQ0FBQyxDQUFDLDRFQUE0RTtZQUt2SCxtQkFBYyxHQUFjLElBQUksVUFBQSxTQUFTLENBQUMsQ0FBQyxvR0FBb0c7WUF1US9JLFlBQVk7UUFDZCxDQUFDO2lCQXhSd0IsY0FBUyxHQUFXLFVBQUEsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxBQUF0RCxDQUF1RDtRQVl2Riw0RUFBNEU7UUFFNUUsZUFBZSxDQUFZO1FBQzNCLGlCQUFpQixDQUFZO1FBQzdCLGNBQWMsQ0FBNEIsQ0FBQyxvR0FBb0c7UUFFL0k7O1dBRUc7UUFDSCxJQUFXLFFBQVE7WUFDakIsSUFBSSxTQUFTLEdBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDL0MsSUFBSSxDQUFDO2dCQUNILFNBQVMsR0FBRyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixpRkFBaUY7Z0JBQ2pGLGtEQUFrRDtZQUNwRCxDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVEOzs7V0FHRztRQUNILElBQVcsY0FBYztZQUN2QixJQUFJLElBQUksQ0FBQyxlQUFlO2dCQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7WUFFOUIsbUZBQW1GO1lBQ25GLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBQSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckYsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzlCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsZ0JBQWdCO1lBQ3pCLElBQUksSUFBSSxDQUFDLGlCQUFpQjtnQkFDeEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFFaEMsbUZBQW1GO1lBQ25GLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hDLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsYUFBYTtZQUN0QixJQUFJLElBQUksQ0FBQyxjQUFjO2dCQUNyQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7WUFFN0IsbUZBQW1GO1lBQ25GLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxVQUFBLFNBQVMsQ0FBQztZQUNwQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDN0IsQ0FBQztRQUVEOztXQUVHO1FBQ0ksZ0JBQWdCO1lBQ3JCLElBQUksSUFBSSxDQUFDLGVBQWU7Z0JBQUUsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMvRCxJQUFJLElBQUksQ0FBQyxpQkFBaUI7Z0JBQUUsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksYUFBYTtZQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksb0JBQW9CO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hDLENBQUM7UUFFRDs7V0FFRztRQUNJLFNBQVM7WUFDZCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksY0FBYztZQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksWUFBWTtZQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksT0FBTztZQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNuQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNO1lBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2xCLENBQUM7UUFFRDs7Ozs7V0FLRztRQUNJLGNBQWMsQ0FBQyxVQUFrQixJQUFJLENBQUMsV0FBVyxFQUFFLGVBQXVCLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBNEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFnQixJQUFJLENBQUMsSUFBSSxFQUFFLE9BQWUsSUFBSSxDQUFDLEdBQUc7WUFDL0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBQSxTQUFTLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyw2QkFBNkI7UUFDM0ksQ0FBQztRQUVEOzs7Ozs7V0FNRztRQUNJLG1CQUFtQixDQUFDLFFBQWdCLENBQUMsVUFBQSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxTQUFpQixVQUFBLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLFVBQWtCLFVBQUEsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsT0FBZSxDQUFDLFVBQUEsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksR0FBRyxDQUFDO1lBQzdPLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQUEsU0FBUyxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtRQUNuSSxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxzQkFBc0I7WUFDM0IsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQywyRUFBMkU7WUFDNUksSUFBSSxhQUFhLEdBQVcsQ0FBQyxDQUFDO1lBQzlCLElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQztZQUU1QixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakQsYUFBYSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7Z0JBQ2hDLFdBQVcsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEQsV0FBVyxHQUFHLE1BQU0sQ0FBQztnQkFDckIsYUFBYSxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ2pELENBQUM7aUJBQU0sQ0FBQyxDQUFBLDBCQUEwQjtnQkFDaEMsYUFBYSxHQUFHLE1BQU0sQ0FBQztnQkFDdkIsV0FBVyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ2pELENBQUM7WUFFRCxPQUFPLFVBQUEsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsR0FBRyxDQUFDLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRDs7V0FFRztRQUNJLGdCQUFnQixDQUFDLGtCQUEyQjtZQUNqRCxJQUFJLE1BQWUsQ0FBQztZQUNwQixJQUFJLENBQUMsR0FBaUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsR0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFakgsTUFBTSxHQUFHLFVBQUEsT0FBTyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDekUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksZ0JBQWdCLENBQUMsaUJBQTBCO1lBQ2hELElBQUksY0FBYyxHQUFjLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLEdBQWlCLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMzQyxJQUFJLFFBQVEsR0FBWSxVQUFBLE9BQU8sQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hGLElBQUksQ0FBQyxHQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5RyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV0QixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQjtnQkFDakMsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUNuQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2dCQUN6QyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFO2dCQUNoQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRTthQUM1QyxDQUFDO1lBQ0YsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztZQUMxRCxJQUFJLENBQUMsVUFBVSxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUM7WUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUN6QyxJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDMUMsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDN0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDMUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEUsUUFBUSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssVUFBVSxDQUFDLFlBQVk7b0JBQzFCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsNkNBQTZDO29CQUN6RSxNQUFNO2dCQUNSLEtBQUssVUFBVSxDQUFDLE9BQU87b0JBQ3JCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEIsTUFBTTtZQUNWLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSx3QkFBd0IsQ0FBQyxRQUFpQjtZQUMvQyxJQUFJLEtBQUssR0FBMEIsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVFLElBQUksS0FBSyxDQUFDLFNBQVM7Z0JBQ2pCLEtBQUssQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO1lBQ2xDLElBQUksS0FBSyxDQUFDLFVBQVU7Z0JBQ2xCLEtBQUssQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQ2hDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBaUIsRUFBRSxhQUF1QixJQUFJLEVBQUUsa0JBQTJCLElBQUk7WUFDakcsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFFMUQsUUFBUSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssVUFBVSxDQUFDLE9BQU87b0JBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzdGLE1BQU07WUFDVixDQUFDO1FBQ0gsQ0FBQztRQUVNLFVBQVU7WUFDZixJQUFJLFFBQVEsR0FBYyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM5QyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksVUFBQSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLEtBQUssR0FBVSxVQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUMsVUFBQSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQUEsY0FBYyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUQsVUFBQSxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRU0sa0JBQWtCO1lBQ3ZCLFVBQUEsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDN0osQ0FBQztRQUFBLENBQUM7UUFFUSxhQUFhLENBQUMsUUFBaUI7WUFDdkMsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQzFCLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQzs7SUF2UlUseUJBQWUsa0JBeVIzQixDQUFBO0FBQ0gsQ0FBQyxFQTlTUyxTQUFTLEtBQVQsU0FBUyxRQThTbEI7QUMvU0QsSUFBVSxTQUFTLENBa0JsQjtBQWxCRCxXQUFVLFNBQVM7SUFDakI7Ozs7T0FJRztJQUNILE1BQWEsbUJBQW9CLFNBQVEsVUFBQSxTQUFTO2lCQUN6QixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQUFBMUQsQ0FBMkQ7UUFNM0Y7WUFDRSxLQUFLLEVBQUUsQ0FBQztZQUxILFlBQU8sR0FBWSxJQUFJLENBQUM7WUFDeEIsT0FBRSxHQUFZLFVBQUEsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixhQUFRLEdBQVksS0FBSyxDQUFDO1lBSS9CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUM7O0lBVlUsNkJBQW1CLHNCQVcvQixDQUFBO0FBQ0gsQ0FBQyxFQWxCUyxTQUFTLEtBQVQsU0FBUyxRQWtCbEI7QUNsQkQsSUFBVSxTQUFTLENBcUNsQjtBQXJDRCxXQUFVLFNBQVM7SUFDakI7OztPQUdHO0lBQ0gsTUFBYSxZQUFhLFNBQVEsVUFBQSxTQUFTO2lCQUNsQixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFLcEYsWUFBbUIsU0FBZ0IsSUFBSSxVQUFBLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFnQixDQUFDLEVBQUUsT0FBZSxFQUFFO1lBQzVGLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDbEIsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtnQkFDN0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRzthQUNkLENBQUM7WUFDRixhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDN0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDMUMsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDOztJQTlCVSxzQkFBWSxlQStCeEIsQ0FBQTtBQUNILENBQUMsRUFyQ1MsU0FBUyxLQUFULFNBQVMsUUFxQ2xCO0FDckNELElBQVUsU0FBUyxDQXdCbEI7QUF4QkQsV0FBVSxTQUFTO0lBQ2pCOzs7OztPQUtHO0lBQ0gsTUFBYSxvQkFBcUIsU0FBUSxVQUFBLFNBQVM7aUJBQzFCLGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRTVGO1lBQ0UsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO1FBRU0sU0FBUztZQUNkLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDOztJQWZVLDhCQUFvQix1QkFnQmhDLENBQUE7QUFDSCxDQUFDLEVBeEJTLFNBQVMsS0FBVCxTQUFTLFFBd0JsQjtBQ3hCRCxJQUFVLFNBQVMsQ0FrRmxCO0FBbEZELFdBQVUsU0FBUztJQUVqQjs7O09BR0c7SUFDSCxNQUFzQixLQUFNLFNBQVEsVUFBQSxPQUFPO1FBR3pDLFlBQW1CLFNBQWdCLElBQUksVUFBQSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDdEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksT0FBTztZQUNaLE9BQW9CLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDdkMsQ0FBQztRQUVNLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTthQUM5QixDQUFDO1lBQ0YsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRVMsYUFBYSxLQUFlLENBQUM7S0FDeEM7SUE1QnFCLGVBQUssUUE0QjFCLENBQUE7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBYSxZQUFhLFNBQVEsS0FBSztLQUN0QztJQURZLHNCQUFZLGVBQ3hCLENBQUE7SUFDRDs7Ozs7Ozs7T0FRRztJQUNILE1BQWEsZ0JBQWlCLFNBQVEsS0FBSztLQUMxQztJQURZLDBCQUFnQixtQkFDNUIsQ0FBQTtJQUNEOzs7Ozs7Ozs7O09BVUc7SUFDSCxNQUFhLFVBQVcsU0FBUSxLQUFLO0tBQ3BDO0lBRFksb0JBQVUsYUFDdEIsQ0FBQTtJQUNEOzs7Ozs7Ozs7T0FTRztJQUNILE1BQWEsU0FBVSxTQUFRLEtBQUs7S0FDbkM7SUFEWSxtQkFBUyxZQUNyQixDQUFBO0FBQ0gsQ0FBQyxFQWxGUyxTQUFTLEtBQVQsU0FBUyxRQWtGbEI7QUNsRkQsd0NBQXdDO0FBQ3hDLElBQVUsU0FBUyxDQXNIbEI7QUF2SEQsd0NBQXdDO0FBQ3hDLFdBQVUsU0FBUztJQUVqQjs7T0FFRztJQUNILHdEQUF3RDtJQUN4RCxJQUFZLFVBS1g7SUFMRCxXQUFZLFVBQVU7UUFDcEIsc0NBQXdCLENBQUE7UUFDeEIsOENBQWdDLENBQUE7UUFDaEMsa0NBQW9CLENBQUE7UUFDcEIsZ0NBQWtCLENBQUE7SUFDcEIsQ0FBQyxFQUxXLFVBQVUsR0FBVixvQkFBVSxLQUFWLG9CQUFVLFFBS3JCO0lBQ0Q7Ozs7UUFJSTtJQUNKLE1BQWEsY0FBZSxTQUFRLFVBQUEsU0FBUztpQkFDcEIsY0FBUyxHQUFXLFVBQUEsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxBQUFyRCxDQUFzRDtRQUt0Riw2SEFBNkg7UUFFN0gsWUFBbUIsU0FBZ0IsSUFBSSxVQUFBLFlBQVksRUFBRTtZQUNuRCxLQUFLLEVBQUUsQ0FBQztZQU5WLCtNQUErTTtZQUN4TSxhQUFRLEdBQWMsVUFBQSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0MsVUFBSyxHQUFVLElBQUksQ0FBQztZQUt6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUN0QixDQUFDO1FBRUQsd0NBQXdDO1FBQ3hDOztXQUVHO1FBQ0ksT0FBTyxDQUFrQixNQUFtQjtZQUNqRCxJQUFJLE1BQU0sR0FBWSxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSztnQkFDWixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUVuQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVNLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDaEMsS0FBSyxFQUFFLFVBQUEsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ3hDLENBQUM7WUFDRixhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFzQixVQUFBLFVBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLFVBQVU7WUFDZixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDekMsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVNLHdCQUF3QixDQUFDLFFBQWlCO1lBQy9DLElBQUksS0FBSyxHQUEwQixLQUFLLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUUsSUFBSSxLQUFLLENBQUMsSUFBSTtnQkFDWixLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWlCLEVBQUUsYUFBdUIsSUFBSSxFQUFFLGtCQUEyQixJQUFJO1lBQ2pHLElBQUksSUFBSSxHQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDakMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBVyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJO2dCQUN0RSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQUEsVUFBVSxDQUFDLGNBQWMsQ0FBUSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7WUFDbkUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3BELFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsc0JBQXNCO1FBQzlDLENBQUM7UUFFTSxVQUFVO1lBQ2YsSUFBSSxRQUFRLEdBQWMsVUFBQSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvRSxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksVUFBQSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxVQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBQSxjQUFjLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RFLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQUEsQ0FBQztRQUVLLGtCQUFrQjtZQUN2QixJQUFJLFFBQVEsR0FBYyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9FLElBQUksS0FBSyxHQUFVLFVBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV2QyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDN0IsS0FBSyxVQUFBLGdCQUFnQjtvQkFDbkIsTUFBTSxNQUFNLEdBQVcsR0FBRyxDQUFDO29CQUMzQixVQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUN2QyxNQUFNLEtBQUssR0FBYyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ25GLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzdDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN6RCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN2RCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDekQsVUFBQSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3pDLFVBQUEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO29CQUNqQyxNQUFNO2dCQUNSLEtBQUssVUFBQSxVQUFVO29CQUNiLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxVQUFBLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3JDLFVBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3ZDLE1BQU07Z0JBQ1IsS0FBSyxVQUFBLFNBQVM7b0JBQ1osVUFBQSxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDckMsTUFBTTtZQUNWLENBQUM7WUFFRCxVQUFBLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7O0lBbkdVLHdCQUFjLGlCQW9HMUIsQ0FBQTtBQUNILENBQUMsRUF0SFMsU0FBUyxLQUFULFNBQVMsUUFzSGxCO0FDdkhELElBQVUsU0FBUyxDQW9EbEI7QUFwREQsV0FBVSxTQUFTO0lBQ2pCOzs7T0FHRztJQUNILE1BQWEsaUJBQWtCLFNBQVEsVUFBQSxTQUFTO2lCQUN2QixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQUFBeEQsQ0FBeUQ7UUFPekYsMkNBQTJDO1FBRTNDLFlBQW1CLFlBQXNCLElBQUk7WUFDM0MsS0FBSyxFQUFFLENBQUM7WUFUSCxlQUFVLEdBQVUsVUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLGlCQUFZLEdBQVUsVUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLGFBQVEsR0FBYyxVQUFBLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUVsRCxtUEFBbVA7WUFDNU8saUJBQVksR0FBWSxLQUFLLENBQUMsQ0FBQyxvREFBb0Q7WUFLeEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDMUIsbUVBQW1FO1FBQ3JFLENBQUM7UUFHRCxrQkFBa0I7UUFDWCxTQUFTO1lBQ2QsSUFBSSxhQUFhLEdBQWtCO2dCQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQy9CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtnQkFDdkMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFO2dCQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2hDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFO2dCQUMzQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVO2FBQ3JDLENBQUM7WUFFRixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFhLE1BQU0sVUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvRSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3RCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7WUFDaEQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDOztJQXZDVSwyQkFBaUIsb0JBOEM3QixDQUFBO0FBQ0gsQ0FBQyxFQXBEUyxTQUFTLEtBQVQsU0FBUyxRQW9EbEI7QUNwREQsSUFBVSxTQUFTLENBZ0lsQjtBQWhJRCxXQUFVLFNBQVM7SUFDakI7OztPQUdHO0lBQ0gsTUFBYSxhQUFjLFNBQVEsVUFBQSxTQUFTO2lCQUNuQixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEFBQXBELENBQXFEO1FBTXJGLFlBQW1CLEtBQVksRUFBRSxTQUE2QjtZQUM1RCxLQUFLLEVBQUUsQ0FBQztZQU5ILGFBQVEsR0FBYyxVQUFBLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxhQUFRLEdBQWMsVUFBQSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFNekQsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQVcsTUFBTTtZQUNmLElBQUksT0FBTyxHQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQzdDLElBQUksS0FBSyxHQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNsQyxDQUFDO1FBRUQsTUFBTTtRQUNOLHFFQUFxRTtRQUNyRSx1Q0FBdUM7UUFDdkMsTUFBTTtRQUNOLHNEQUFzRDtRQUN0RCwwRkFBMEY7UUFDMUYsd0NBQXdDO1FBQ3hDLCtDQUErQztRQUUvQyx1SEFBdUg7UUFDdkgseURBQXlEO1FBRXpELDJGQUEyRjtRQUMzRiwrRkFBK0Y7UUFFL0YseUJBQXlCO1FBQ3pCLCtEQUErRDtRQUUvRCw0Q0FBNEM7UUFDNUMsbURBQW1EO1FBQ25ELHlCQUF5QjtRQUN6QixvQkFBb0I7UUFDcEIsNEhBQTRIO1FBQzVILGdIQUFnSDtRQUNoSCxPQUFPO1FBRVAsd0JBQXdCO1FBQ3hCLGtDQUFrQztRQUVsQyxtQkFBbUI7UUFDbkIsSUFBSTtRQUVKLHlGQUF5RjtRQUN6RixrQ0FBa0M7UUFDbEMsc0NBQXNDO1FBQ3RDLGFBQWE7UUFDYiw4RUFBOEU7UUFDOUUsNkVBQTZFO1FBQzdFLE9BQU87UUFDUCxnQkFBZ0I7UUFDaEIsSUFBSTtRQUVKLGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQTRCLENBQUM7WUFDakMsK0hBQStIO1lBQy9ILElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQzFDLElBQUksTUFBTTtnQkFDUixhQUFhLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O2dCQUVuQyxhQUFhLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBQSxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBRTVELElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQ2YsYUFBYSxDQUFDLFFBQVEsR0FBRyxVQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVsRSxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDaEQsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFELE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksSUFBVSxDQUFDO1lBQ2YsSUFBSSxjQUFjLENBQUMsTUFBTTtnQkFDdkIsSUFBSSxHQUFTLE1BQU0sVUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Z0JBRTlELElBQUksR0FBUyxNQUFNLFVBQUEsVUFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFFakIsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sbUJBQW1CLEdBQXlCLEdBQUcsRUFBRTtvQkFDckQsTUFBTSxvQkFBb0IsR0FBeUIsR0FBRyxFQUFFO3dCQUN0RCxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBc0IsQ0FBQzt3QkFDOUUsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIscURBQTJCLG9CQUFvQixDQUFDLENBQUM7d0JBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLHFEQUEyQixvQkFBb0IsQ0FBQyxDQUFDO3dCQUM5RSxJQUFJLENBQUMsbUJBQW1CLG1EQUEwQixtQkFBbUIsQ0FBQyxDQUFDO29CQUN6RSxDQUFDLENBQUM7b0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IscURBQTJCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNqRixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixxREFBMkIsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25GLENBQUMsQ0FBQztnQkFDRixJQUFJLENBQUMsZ0JBQWdCLG1EQUEwQixtQkFBbUIsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSwwQkFBMEI7WUFDL0IsSUFBSSxPQUFPLEdBQXFELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsRixrQkFBa0I7WUFDbEIseUJBQXlCO1lBQ3pCLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxZQUFZO1FBRUwsa0JBQWtCO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtnQkFDWixPQUFPO1lBQ1QsSUFBSSxLQUFLLEdBQVUsVUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLFVBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFELFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDOztJQXhIVSx1QkFBYSxnQkF5SHpCLENBQUE7QUFFSCxDQUFDLEVBaElTLFNBQVMsS0FBVCxTQUFTLFFBZ0lsQjtBQ2hJRCxJQUFVLFNBQVMsQ0E2TGxCO0FBN0xELFdBQVUsU0FBUzs7SUFFakIsSUFBWSx3QkFLWDtJQUxELFdBQVksd0JBQXdCO1FBQ2xDLHNFQUFzRTtRQUN0RSx1RUFBSSxDQUFBO1FBQ0osb0VBQW9FO1FBQ3BFLGlGQUFTLENBQUE7SUFDWCxDQUFDLEVBTFcsd0JBQXdCLEdBQXhCLGtDQUF3QixLQUF4QixrQ0FBd0IsUUFLbkM7SUFFRDs7Ozs7T0FLRztJQUVILElBQWEsdUJBQXVCLEdBQXBDLE1BQWEsdUJBQXdCLFNBQVEsVUFBQSxTQUFTOztpQkFDN0IsY0FBUyxHQUFXLFVBQUEsU0FBUyxDQUFDLGdCQUFnQixDQUFDLHlCQUF1QixDQUFDLEFBQTlELENBQStEO1FBVy9GLDhCQUE4QjtRQUM5QixLQUFLLENBQVM7UUFDZCxVQUFVLENBQWE7UUFDZCxLQUFLLENBQU87UUFFckIsWUFBbUIsa0JBQWtDLElBQUk7WUFDdkQsS0FBSyxFQUFFLENBQUM7WUFKVixlQUFVLEdBQVcsQ0FBQyxDQUFDO1lBNkh2QixZQUFZO1lBRUosYUFBUSxHQUFHLENBQUMsTUFBYSxFQUFRLEVBQUU7Z0JBQ3pDLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNwQixzREFBNkI7b0JBQzdCO3dCQUNFLFVBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsdUNBQW9CLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzt3QkFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsNkNBQXVCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDOUQsTUFBTTtvQkFDUjt3QkFDRSxVQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLHVDQUFvQixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLDZDQUF1QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3JFLENBQUM7WUFDSCxDQUFDLENBQUM7WUFFTSxXQUFNLEdBQUcsR0FBUyxFQUFFO2dCQUMxQixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVE7b0JBQzNCLFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUN0QixRQUFRO3dCQUNSLEtBQUssd0JBQXdCLENBQUMsSUFBSTs0QkFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7NEJBQ2QsTUFBTTt3QkFDUixLQUFLLHdCQUF3QixDQUFDLFNBQVM7NEJBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs0QkFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7NEJBQ25CLE1BQU07b0JBQ1YsQ0FBQztZQUNMLENBQUMsQ0FBQztZQUVNLG9CQUFlLEdBQUcsR0FBUyxFQUFFO2dCQUNuQyxJQUFJLFNBQVMsR0FBVyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsQ0FBQyxDQUFDO1lBeEpBLElBQUksQ0FBQyxjQUFjLEdBQUcsZUFBZSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBQSxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDO1lBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQUEsSUFBSSxFQUFFLENBQUM7WUFFeEIsSUFBSSxDQUFDLGdCQUFnQiwyQ0FBc0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxnQkFBZ0IsaURBQXlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsZ0JBQWdCLG1EQUEwQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsSUFBSSxDQUFDLEtBQWE7WUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUVELElBQVcsSUFBSTtZQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBVyxJQUFJLENBQUMsS0FBYTtZQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBRUQsSUFBVyxTQUFTO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN6QixDQUFDO1FBRUQsSUFBVyxTQUFTLENBQUMsTUFBYztZQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztZQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxhQUFhLEtBQTBDLENBQUM7UUFFL0Q7Ozs7V0FJRztRQUNJLGdCQUFnQixLQUEwQyxDQUFDO1FBRWxFLGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFO2dCQUMzQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLFVBQVU7Z0JBQ2pELFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2FBQ2hCLENBQUM7WUFFRixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRSxJQUFJLGNBQWMsQ0FBQyxnQkFBZ0I7Z0JBQUUsSUFBSSxDQUFDLGNBQWMsR0FBbUIsTUFBTSxVQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDdEksSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztZQUVoQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSxVQUFVLENBQUMsV0FBcUI7WUFDckMsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDekIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVNLDBCQUEwQjtZQUMvQixJQUFJLE9BQU8sR0FBcUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RixPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDOUIsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLDBCQUEwQixFQUFFLENBQUM7WUFDM0UsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVNLHNCQUFzQjtZQUMzQixJQUFJLE9BQU8sR0FBNkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQztZQUM5QixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDcEIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVNLHdCQUF3QixDQUFDLFFBQWlCO1lBQy9DLElBQUksS0FBSyxHQUEwQixLQUFLLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUUsSUFBSSxLQUFLLENBQUMsU0FBUztnQkFDakIsS0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFBLEtBQUssQ0FBQztZQUMxQixJQUFJLEtBQUssQ0FBQyxRQUFRO2dCQUNoQixLQUFLLENBQUMsUUFBUSxHQUFHLHdCQUF3QixDQUFDO1lBQzVDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVTLGFBQWEsQ0FBQyxRQUFpQjtZQUN2QyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sUUFBUSxDQUFDLHVCQUF1QixDQUFDO1lBQ3hDLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDOztJQTFJVSx1QkFBdUI7UUFEbkMsVUFBQSxxQ0FBcUMsQ0FBQyxRQUFRO09BQ2xDLHVCQUF1QixDQTRLbkM7SUE1S1ksaUNBQXVCLDBCQTRLbkMsQ0FBQTtBQUNILENBQUMsRUE3TFMsU0FBUyxLQUFULFNBQVMsUUE2TGxCO0FDN0xELElBQVUsU0FBUyxDQXNEbEI7QUF0REQsV0FBVSxTQUFTO0lBQ2pCLElBQVksSUFJWDtJQUpELFdBQVksSUFBSTtRQUNkLHlCQUFpQixDQUFBO1FBQ2pCLHlCQUFpQixDQUFBO1FBQ2pCLDJCQUFtQixDQUFBO0lBQ3JCLENBQUMsRUFKVyxJQUFJLEdBQUosY0FBSSxLQUFKLGNBQUksUUFJZjtJQUVEOzs7T0FHRztJQUNILE1BQWEsYUFBYyxTQUFRLFVBQUEsU0FBUztRQUE1Qzs7WUFFUyxTQUFJLEdBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQXdDbEMsQ0FBQztpQkF6Q3dCLGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQUFBcEQsQ0FBcUQ7UUFHckY7O1dBRUc7UUFDSSxlQUFlLENBQUMsSUFBUyxFQUFFLE1BQW9CO1lBQ3BELElBQUksT0FBTyxHQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFBLGFBQWEsQ0FBQyxDQUFDO1lBQ25FLElBQUksUUFBUSxHQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUVoRyxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEIsS0FBSyxJQUFJLENBQUMsTUFBTTtvQkFDZCxrRkFBa0Y7b0JBQ2xGLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2xDLENBQUM7b0JBQ0QsTUFBTTtnQkFDUixLQUFLLElBQUksQ0FBQyxPQUFPO29CQUNmLElBQUksT0FBTyxHQUFlLFVBQUEsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBQSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDbkksSUFBSSxPQUFPLENBQUMsR0FBRzt3QkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbEMsTUFBTTtnQkFDUixtQkFBbUI7WUFDckIsQ0FBQztRQUNILENBQUM7UUFFTSxTQUFTO1lBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSx3QkFBd0IsQ0FBQyxRQUFpQjtZQUMvQyxJQUFJLEtBQUssR0FBMEIsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVFLElBQUksS0FBSyxDQUFDLElBQUk7Z0JBQ1osS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDcEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDOztJQXpDVSx1QkFBYSxnQkEwQ3pCLENBQUE7QUFDSCxDQUFDLEVBdERTLFNBQVMsS0FBVCxTQUFTLFFBc0RsQjtBQ3RERCxJQUFVLFNBQVMsQ0F5QmxCO0FBekJELFdBQVUsU0FBUztJQUNqQjs7OztPQUlHO0lBQ0gsTUFBYSxlQUFnQixTQUFRLFVBQUEsU0FBUztRQUM1QyxxSUFBcUk7UUFDckksMkJBQTJCO2lCQUNKLGNBQVMsR0FBVyxVQUFBLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV2RjtZQUNFLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQztRQUVNLFNBQVM7WUFDZCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzs7SUFqQlUseUJBQWUsa0JBa0IzQixDQUFBO0FBQ0gsQ0FBQyxFQXpCUyxTQUFTLEtBQVQsU0FBUyxRQXlCbEI7QUN6QkQsSUFBVSxTQUFTLENBcURsQjtBQXJERCxXQUFVLFNBQVM7SUFFakI7OztPQUdHO0lBQ0gsTUFBYSwrQkFBK0I7UUFFbkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFzQjtZQUMzQyxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUU7Z0JBQy9ELEtBQUssRUFBRSwrQkFBK0IsQ0FBQyxlQUFlO2FBQ3ZELENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRTtnQkFDbEUsS0FBSyxFQUFFLCtCQUErQixDQUFDLGtCQUFrQjthQUMxRCxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUU7Z0JBQ2xFLEtBQUssRUFBRSwrQkFBK0IsQ0FBQyxrQkFBa0I7YUFDMUQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVTLE1BQU0sQ0FBQyxlQUFlLENBQTBCLE9BQXNCO1lBQzlFLE1BQU0sSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRXZFLElBQUksSUFBSSxDQUFDLFlBQVk7Z0JBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFVBQUEsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9HLENBQUM7UUFFUyxNQUFNLENBQUMsa0JBQWtCO1lBQ2pDLE1BQU0sSUFBSSxHQUEyQixVQUFBLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRXZFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sYUFBYSxHQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0dBQWdHO2dCQUU1SSxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQUEsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMxRSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0csQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2RSxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRTNDLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVTLE1BQU0sQ0FBQyxrQkFBa0I7WUFDakMsTUFBTSxJQUFJLEdBQTJCLFVBQUEsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFFdkUsSUFBSSxJQUFJLENBQUMsWUFBWTtnQkFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekMsQ0FBQztLQUNGO0lBOUNZLHlDQUErQixrQ0E4QzNDLENBQUE7QUFDSCxDQUFDLEVBckRTLFNBQVMsS0FBVCxTQUFTLFFBcURsQjtBQ3JERCxxRUFBcUU7QUFDckUsSUFBVSxTQUFTLENBdUhsQjtBQXhIRCxxRUFBcUU7QUFDckUsV0FBVSxTQUFTOztJQUVqQjs7O09BR0c7SUFFSCxJQUFhLGlCQUFpQix5QkFBOUIsTUFBYSxpQkFBa0IsU0FBUSxVQUFBLFNBQVM7UUFXOUMsWUFBbUIsU0FBaUIsRUFBRSxFQUFFLG1CQUFnQyxFQUFFO1lBQ3hFLEtBQUssRUFBRSxDQUFDO1lBTEEsY0FBUyxHQUFZLEtBQUssQ0FBQztZQUNyQyxxRkFBcUY7WUFDbEUsYUFBUSxHQUFnQixFQUFFLENBQUM7WUFJNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztZQUV4QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO2dCQUNoRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSTtvQkFDakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDcEUsQ0FBQztRQUVEOzs7O1dBSUc7UUFDSSxlQUFlLENBQUMsT0FBd0IsSUFBbUIsT0FBTyxJQUFJLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2hIOzs7O1dBSUc7UUFDSSxrQkFBa0IsS0FBb0IsT0FBTyxJQUFJLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQzNGOzs7O1dBSUc7UUFDSSxrQkFBa0IsS0FBMEMsQ0FBQztRQUVwRTs7V0FFRztRQUNJLE9BQU8sQ0FBQyxLQUFXLEVBQUUsa0JBQTZCLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSztZQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBVU0sT0FBTyxDQUFDLEtBQW9CO1lBQ2pDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVE7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFXLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7O2dCQUVsRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU07WUFDWCxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRO2dCQUNqQyxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBRXpCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLE9BQU8sR0FBYyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUVEOztXQUVHO1FBQ0ksU0FBUztZQUNkLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVNLFNBQVM7WUFDZCxNQUFNLGFBQWEsR0FBa0IsRUFBRSxDQUFDO1lBQ3hDLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxRCxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlFLGFBQWEsQ0FBQyxlQUFlLEdBQUcsVUFBQSxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQUEsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMzRixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUVoRSxNQUFNLG1CQUFtQixHQUF5QixHQUFHLEVBQUU7Z0JBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRTtvQkFDdEQsSUFBSSxJQUFJLEdBQVMsVUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQVMsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLElBQUk7d0JBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFVBQUEsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxtQkFBaUIsQ0FBQyxJQUFJLHlCQUF5QixLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUM5RyxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsbUJBQW1CLG1EQUEwQixtQkFBbUIsQ0FBQyxDQUFDO1lBQ3pFLENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxnQkFBZ0IsbURBQTBCLG1CQUFtQixDQUFDLENBQUM7WUFFcEUsSUFBSSxDQUFDLGVBQWUsR0FBZ0IsTUFBTSxVQUFBLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDdEcsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0tBQ0YsQ0FBQTtJQTlHWSxpQkFBaUI7UUFEN0IsVUFBQSwrQkFBK0IsQ0FBQyxRQUFRO09BQzVCLGlCQUFpQixDQThHN0I7SUE5R1ksMkJBQWlCLG9CQThHN0IsQ0FBQTtBQUVILENBQUMsRUF2SFMsU0FBUyxLQUFULFNBQVMsUUF1SGxCO0FDeEhELElBQVUsU0FBUyxDQXNGbEI7QUF0RkQsV0FBVSxTQUFTO0lBQ2pCOzs7Ozs7T0FNRztJQUNILE1BQWEsYUFBYyxTQUFRLFVBQUEsU0FBUztpQkFDbkIsY0FBUyxHQUFXLFVBQUEsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBVXJGLFlBQW1CLEtBQWMsRUFBRSxLQUFjO1lBQy9DLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFVBQUEsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBQSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQztRQUVNLFNBQVM7WUFDZCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLGFBQWEsQ0FBQyxlQUEwQixFQUFFLFVBQTJCO1lBQzFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQUEsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRXBDLElBQUksT0FBTyxHQUFZLFVBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxDQUFDO1lBRTdDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixJQUFJLEtBQWEsQ0FBQztnQkFDbEIsSUFBSSxJQUFJLEdBQWMsVUFBQSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDbEQsUUFBUSxVQUFVLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztvQkFDbEMsS0FBSyxVQUFBLGFBQWEsQ0FBQyxRQUFRO3dCQUN6QixLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO3dCQUNsRCxNQUFNO29CQUNSLEtBQUssVUFBQSxhQUFhLENBQUMsVUFBVTt3QkFDM0IsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzt3QkFDakQsTUFBTTtvQkFDUixLQUFLLFVBQUEsYUFBYSxDQUFDLFFBQVE7d0JBQ3pCLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUM1RSxNQUFNO2dCQUNWLENBQUM7Z0JBRUQsSUFBSSxRQUFRLEdBQVcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDaEcsS0FBSyxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUNoQyxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksYUFBYSxHQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4RixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBR0QsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDO1FBRU0sa0JBQWtCO1lBQ3ZCLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQUEsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQzdELElBQUksV0FBVyxHQUFzQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFBLGlCQUFpQixDQUFDLENBQUM7WUFDL0UsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLFdBQVcsSUFBSSxJQUFJO2dCQUNyQyxPQUFPO1lBRVQsVUFBQSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRVMsYUFBYSxDQUFDLFFBQWlCO1lBQ3ZDLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUIsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMvQixDQUFDOztJQTVFVSx1QkFBYSxnQkE2RXpCLENBQUE7QUFDSCxDQUFDLEVBdEZTLFNBQVMsS0FBVCxTQUFTLFFBc0ZsQjtBQ3RGRCxJQUFVLFNBQVMsQ0E4R2xCO0FBOUdELFdBQVUsU0FBUztJQUVqQixJQUFZLElBRVg7SUFGRCxXQUFZLElBQUk7UUFDZCwrQkFBSSxDQUFBO1FBQUUsbUNBQU0sQ0FBQTtRQUFFLGlDQUFLLENBQUE7UUFBRSwrQkFBSSxDQUFBO0lBQzNCLENBQUMsRUFGVyxJQUFJLEdBQUosY0FBSSxLQUFKLGNBQUksUUFFZjtJQUVEOzs7T0FHRztJQUNILE1BQWEsa0JBQW1CLFNBQVEsVUFBQSxTQUFTO2lCQUN4QixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUcxRixZQUFtQixXQUFzQixVQUFBLFNBQVMsQ0FBQyxRQUFRLEVBQUU7WUFDM0QsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUMzQixDQUFDO1FBRUQsa0RBQWtEO1FBQ2xEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxRQUFjLElBQUk7WUFDOUIsSUFBSSxTQUFTLEdBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN6QyxJQUFJLFNBQVMsR0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2hDLElBQUksU0FBUztnQkFDWCxTQUFTLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUVqQyxJQUFJLEtBQUs7Z0JBQ1AsU0FBUyxHQUFHLFVBQUEsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUV6RSxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUM1QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxTQUFTLENBQUMsYUFBd0IsRUFBRSxRQUFjLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBYyxJQUFJO1lBQ3BGLFFBQVEsS0FBSyxFQUFFLENBQUM7Z0JBQ2QsS0FBSyxJQUFJLENBQUMsSUFBSTtvQkFDWixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDdEMsTUFBTTtnQkFDUixLQUFLLElBQUksQ0FBQyxNQUFNO29CQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDNUMsTUFBTTtnQkFDUixLQUFLLElBQUksQ0FBQyxJQUFJO29CQUNaLElBQUksQ0FBQyxLQUFLO3dCQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztnQkFDL0QsS0FBSyxJQUFJLENBQUMsS0FBSztvQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBRTVDLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQzNCLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ1QsSUFBSSxPQUFrQixDQUFDO3dCQUN2QixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ3ZCLHFEQUFxRDs0QkFDckQsT0FBTyxHQUFHLFVBQUEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQzVCLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDMUIsQ0FBQzt3QkFFRCxJQUFJLE1BQU0sR0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ3BDLElBQUksTUFBTSxFQUFFLENBQUM7NEJBQ1gsa0NBQWtDOzRCQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDOzRCQUM5QixPQUFPLEdBQUcsVUFBQSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUN0RSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs0QkFDNUIsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUMxQixDQUFDO29CQUNILENBQUM7b0JBQ0QsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO1FBQ0QsWUFBWTtRQUVaLGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDaEMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUU7YUFDNUMsQ0FBQztZQUNGLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFDTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELDJDQUEyQztRQUMzQyxtQ0FBbUM7UUFDbkMsSUFBSTtRQUNKLGtDQUFrQztRQUNsQyxzQ0FBc0M7UUFDdEMsSUFBSTtRQUVKLDhFQUE4RTtRQUM5RSx3RkFBd0Y7UUFDeEYsb0JBQW9CO1FBQ3BCLElBQUk7UUFFTSxhQUFhLENBQUMsUUFBaUI7WUFDdkMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQzs7SUFqR1UsNEJBQWtCLHFCQW1HOUIsQ0FBQTtBQUNILENBQUMsRUE5R1MsU0FBUyxLQUFULFNBQVMsUUE4R2xCO0FDOUdELElBQVUsU0FBUyxDQXNHbEI7QUF0R0QsV0FBVSxTQUFTO0lBRWpCOztPQUVHO0lBQ0gsTUFBYSxZQUFZO1FBQXpCO1lBQ1MsaUJBQVksR0FBdUIsSUFBSSxDQUFDO1lBQ3hDLFlBQU8sR0FBWSxJQUFJLENBQUM7WUFDeEIsZ0JBQVcsR0FBVyxJQUFJLENBQUM7WUFDM0IsZ0JBQVcsR0FBVyxJQUFJLENBQUM7UUFDcEMsQ0FBQztLQUFBO0lBTFksc0JBQVksZUFLeEIsQ0FBQTtJQUVEOzs7T0FHRztJQUNILE1BQWEsaUJBQWtCLFNBQVEsVUFBQSxlQUFlO2lCQUM3QixjQUFTLEdBQVcsVUFBQSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQUFBeEQsQ0FBeUQ7UUFJekYsU0FBUyxDQUFZO1FBRXJCO1lBQ0UsS0FBSyxFQUFFLENBQUM7WUFOSCxlQUFVLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7WUFDOUMsY0FBUyxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1lBTWxELElBQUksQ0FBQyxnQkFBZ0IsMkNBQXNCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRDs7O1dBR0c7UUFDSCxJQUFXLFFBQVE7WUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsV0FBVyxDQUFDLFlBQXFCO1lBQzFDLElBQUksV0FBVyxHQUFZLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDOUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2pELFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLFVBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2pJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztZQUMxQyxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxRQUFRLENBQUMsU0FBa0I7WUFDcEMsSUFBSSxRQUFRLEdBQVksU0FBUyxDQUFDLEtBQUssQ0FBQztZQUN4QyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0MsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLElBQUksV0FBVyxHQUFlLElBQUksVUFBQSxVQUFVLEVBQUUsQ0FBQztZQUMvQyxXQUFXLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztZQUNuQyx3R0FBd0c7WUFDeEcsOEJBQThCO1lBQzlCLFVBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsVUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFVBQUEsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxVQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwTCwwQkFBMEI7WUFDMUIsVUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLElBQUksZ0JBQWdCLENBQUMsVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNqSixzQ0FBc0M7WUFDdEMsVUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLElBQUksZ0JBQWdCLENBQUMsVUFBQSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BMLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUNwQyxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVEOztXQUVHO1FBQ0ksU0FBUyxDQUFDLEdBQVk7WUFDM0IsSUFBSSxXQUFXLEdBQVksR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNyQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakQsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JCLFVBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsVUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDakksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxHQUFZO1lBQ3hCLElBQUksUUFBUSxHQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0MsSUFBSSxXQUFXLEdBQWUsSUFBSSxVQUFBLFVBQVUsRUFBRSxDQUFDO1lBQy9DLFdBQVcsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1lBQ25DLDBHQUEwRztZQUMxRyw4QkFBOEI7WUFDOUIsVUFBQSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLElBQUksZ0JBQWdCLENBQUMsVUFBQSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BMLDBCQUEwQjtZQUMxQixVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLFVBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2pKLHNDQUFzQztZQUN0QyxVQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLFVBQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEwsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0IsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFTywyQkFBMkI7WUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDOztJQXBGVSwyQkFBaUIsb0JBcUY3QixDQUFBO0FBQ0gsQ0FBQyxFQXRHUyxTQUFTLEtBQVQsU0FBUyxRQXNHbEI7QUN0R0QsSUFBVSxTQUFTLENBME1sQjtBQTFNRCxXQUFVLFNBQVM7SUFnQmpCOzs7Ozs7Ozs7O09BVUc7SUFDSCxNQUFhLE9BQVEsU0FBUSxXQUFXO1FBa0J0QyxZQUFtQixLQUFhLEVBQUUsVUFBa0IsQ0FBQyxFQUFFLHlDQUErQyxFQUFFLFNBQWlCLENBQUM7WUFDeEgsS0FBSyxFQUFFLENBQUM7WUFkQSx1QkFBa0IsR0FBVyxDQUFDLENBQUM7WUFDL0Isa0JBQWEsR0FBVyxDQUFDLENBQUM7WUFDMUIsZUFBVSxHQUFXLENBQUMsQ0FBQztZQUN2QixpQkFBWSxHQUFXLENBQUMsQ0FBQztZQUN6QixtQkFBYyxHQUFXLENBQUMsQ0FBQztZQUMzQix5QkFBb0IsR0FBVyxDQUFDLENBQUM7WUFDakMsV0FBTSxHQUFXLENBQUMsQ0FBQztZQUVuQixTQUFJLEdBQVMsVUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1lBQzNCLHdCQUFtQixHQUFXLENBQUMsQ0FBQztZQUNoQyxZQUFPLEdBQVcsU0FBUyxDQUFDO1lBa0k5QixtQkFBYyxHQUFHLENBQUMsYUFBa0MsRUFBUSxFQUFFO2dCQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07b0JBQ2QsT0FBTztnQkFFVCxJQUFJLEtBQUssR0FBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3BELElBQUksTUFBYyxDQUFDO2dCQUNuQixJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxRQUFRO29CQUNwQyxNQUFNLEdBQUcsYUFBYSxDQUFDOztvQkFFdkIsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxhQUFhLEdBQVksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUU3RCxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNWLEtBQUssQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO29CQUM3QixJQUFJLENBQUMsYUFBYTt3QkFDaEIsT0FBTztnQkFDWCxDQUFDO2dCQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO2dCQUU3QixJQUFJLEtBQUssR0FBZ0IsSUFBSSxXQUFXLHNDQUF1QjtvQkFDN0QsTUFBTSxFQUFFO3dCQUNOLE1BQU0sRUFBRSxNQUFNO3FCQUNmO2lCQUNGLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQztZQXpKQSxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFFRDs7V0FFRztRQUNJLFdBQVcsQ0FBQyxLQUFXO1lBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRLENBQUMsTUFBYztZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07Z0JBQ2QsT0FBTztZQUVULElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDekMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFM0MsSUFBSSxJQUFJLENBQUMsSUFBSSxxQ0FBNkIsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO2dCQUNuRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDeEIsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLG1DQUFxQixDQUFDLENBQUM7WUFDbkQsSUFBSSxJQUFJLENBQUMsSUFBSSxxQ0FBNkI7Z0JBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDOztnQkFFeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxLQUFLLENBQUMsTUFBYztZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksUUFBUSxDQUFDLEtBQWE7WUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQ7OztXQUdHO1FBQ0kscUJBQXFCLENBQUMsc0JBQThCLENBQUM7WUFDMUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFFRDs7V0FFRztRQUNJLFNBQVMsQ0FBQyxPQUFlO1lBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLENBQUM7UUFFRDs7V0FFRztRQUNJLFNBQVM7WUFDZCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBRUQ7O1dBRUc7UUFDTyxlQUFlO1lBQ3ZCLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztZQUN2QixJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFFM0MsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xCO29CQUNFLElBQUksV0FBVyxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQzFDLElBQUkscUJBQXFCLEdBQVcsV0FBVyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztvQkFDM0UsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBRXpCLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7NEJBQ2hELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxHQUFHLHFCQUFxQixDQUFDOzRCQUNyRSxNQUFNO3dCQUNSLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDOzRCQUNuRSxxQkFBcUIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDO3dCQUMvQyxDQUFDO29CQUNILENBQUM7b0JBQ0QsTUFBTSxJQUFJLEtBQUssR0FBRyxxQkFBcUIsQ0FBQztvQkFDeEMscUdBQXFHO29CQUNyRyxNQUFNO2dCQUNSLHVDQUErQjtnQkFDL0IsdUNBQStCO2dCQUMvQjtvQkFDRSxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNmLE1BQU07WUFDVixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNEOztXQUVHO1FBQ0ssZUFBZTtZQUNyQixJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLElBQUkscUJBQXFCLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7Z0JBQy9FLElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWM7b0JBQzdDLE9BQU8sSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLHFCQUFxQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDdkgsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzQixDQUFDO0tBOEJGO0lBOUtZLGlCQUFPLFVBOEtuQixDQUFBO0FBQ0gsQ0FBQyxFQTFNUyxTQUFTLEtBQVQsU0FBUyxRQTBNbEI7QUMxTUQsaUNBQWlDO0FBQ2pDLElBQVUsU0FBUyxDQTZGbEI7QUE5RkQsaUNBQWlDO0FBQ2pDLFdBQVUsU0FBUztJQUNqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDSCxNQUFhLElBQUssU0FBUSxVQUFBLE9BQU87UUFBakM7O1lBQ1UsYUFBUSxHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQzNDLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1lBaUR4QixtQkFBYyxHQUFrQixDQUFDLE1BQWEsRUFBUSxFQUFFO2dCQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07b0JBQ2QsT0FBTztnQkFFVCxJQUFJLE9BQU8sR0FBc0IsTUFBTSxDQUFDLE1BQU8sQ0FBQztnQkFDaEQsSUFBSSxLQUFLLEdBQWdCLElBQUksV0FBVyxzQ0FBdUI7b0JBQzdELE1BQU0sRUFBRTt3QkFDTixPQUFPLEVBQUUsT0FBTzt3QkFDaEIsS0FBSyxFQUFnQixNQUFPLENBQUMsTUFBTSxDQUFDLE1BQU07d0JBQzFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFO3FCQUN6QjtpQkFDRixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUM7WUFFTSxrQkFBYSxHQUFrQixDQUFDLE1BQWEsRUFBUSxFQUFFO2dCQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07b0JBQ2QsT0FBTztnQkFFVCxJQUFJLEtBQUssR0FBVSxJQUFJLEtBQUssb0NBQXNCLE1BQU0sQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQztRQUNKLENBQUM7UUFyRUM7O1dBRUc7UUFDSSxVQUFVLENBQUMsUUFBaUI7WUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMzQyxRQUFRLENBQUMsZ0JBQWdCLG9DQUFzQixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbkUsUUFBUSxDQUFDLGdCQUFnQixzQ0FBdUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRDs7V0FFRztRQUNJLFVBQVUsQ0FBQyxLQUFhO1lBQzdCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksYUFBYSxDQUFDLEtBQWE7WUFDaEMsSUFBSSxPQUFPLEdBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE9BQU8sQ0FBQyxtQkFBbUIsb0NBQXNCLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDckUsT0FBTyxDQUFDLG1CQUFtQixzQ0FBdUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUVEOztXQUVHO1FBQ0ksU0FBUztZQUNkLElBQUksUUFBUSxHQUFXLENBQUMsQ0FBQztZQUN6QixLQUFLLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFbEMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtvQkFDbkIsUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QyxDQUFDO1lBRUQsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVc7Z0JBQzlCLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7WUFFNUIsT0FBTyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0IsQ0FBQztLQXdCRjtJQXpFWSxjQUFJLE9BeUVoQixDQUFBO0FBQ0gsQ0FBQyxFQTdGUyxTQUFTLEtBQVQsU0FBUyxRQTZGbEI7QUM5RkQsSUFBVSxTQUFTLENBbUZsQjtBQW5GRCxXQUFVLFNBQVM7SUFLakI7O09BRUc7SUFDSCxNQUFzQixRQUFRO2lCQUNiLGdCQUFXLEdBQWUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQy9ELGtDQUFrQztRQUVsQzs7V0FFRztRQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBc0I7WUFDL0MsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDNUIsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFzQjtZQUNqRCxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7b0JBQzdCLE9BQU8sS0FBSyxDQUFDO1lBQ2pCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsVUFBVSxDQUFJLE9BQVUsRUFBRSxTQUFZLEVBQUUsS0FBc0IsRUFBRSxTQUFrQixLQUFLO1lBQ25HLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7Z0JBQ3pDLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hDLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQTBCLEVBQUUsU0FBMEI7WUFDNUUsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCw2QkFBNkI7UUFDN0Isc0VBQXNFO1FBQ3RFLDZCQUE2QjtRQUM3QixzREFBc0Q7UUFDdEQsTUFBTTtRQUVOLGlDQUFpQztRQUNqQyx1REFBdUQ7UUFDdkQsMENBQTBDO1FBQzFDLDJEQUEyRDtRQUMzRCxzREFBc0Q7UUFDdEQsMkRBQTJEO1FBQzNELHlDQUF5QztRQUN6Qyw4Q0FBOEM7UUFDOUMsTUFBTTtRQUNOLElBQUk7UUFFSSxNQUFNLENBQUMsVUFBVTtZQUN2QixJQUFJLEtBQUssR0FBZSxFQUFFLENBQUM7WUFDM0IsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNqRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFxQjtZQUNwRCxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQzs7SUF6RW1CLGtCQUFRLFdBMEU3QixDQUFBO0FBQ0gsQ0FBQyxFQW5GUyxTQUFTLEtBQVQsU0FBUyxRQW1GbEI7QUNuRkQsdUNBQXVDO0FBQ3ZDLElBQVUsU0FBUyxDQTBCbEI7QUEzQkQsdUNBQXVDO0FBQ3ZDLFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUNILE1BQWEsVUFBVyxTQUFRLFVBQUEsV0FBVztpQkFDM0IsY0FBUyxHQUE2QjtZQUNsRCxDQUFDLFVBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBQSxZQUFZLENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0UsQ0FBQyxVQUFBLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdFLENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxVQUFBLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRSxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBQSxZQUFZLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakYsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pGLENBQUMsVUFBQSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxVQUFBLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNwRixDQUFDO1FBRUY7O1dBRUc7UUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQWlCO1lBQzVDLElBQUksUUFBUSxHQUFhLFVBQVUsUUFBZ0IsRUFBRSxHQUFHLEtBQWU7Z0JBQ3JFLElBQUksSUFBSSxHQUFhLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxHQUFHLEdBQVcsU0FBUyxHQUFHLEdBQUcsR0FBRyxVQUFBLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDYixDQUFDLENBQUM7WUFDRixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDOztJQXBCVSxvQkFBVSxhQXFCdEIsQ0FBQTtBQUNILENBQUMsRUExQlMsU0FBUyxLQUFULFNBQVMsUUEwQmxCO0FDM0JELHVDQUF1QztBQUN2QyxJQUFVLFNBQVMsQ0FPbEI7QUFSRCx1Q0FBdUM7QUFDdkMsV0FBVSxTQUFTO0lBQ2pCOztPQUVHO0lBQ0gsTUFBYSxXQUFZLFNBQVEsVUFBQSxXQUFXO0tBRTNDO0lBRlkscUJBQVcsY0FFdkIsQ0FBQTtBQUNILENBQUMsRUFQUyxTQUFTLEtBQVQsU0FBUyxRQU9sQjtBQ1JELHVDQUF1QztBQUN2QyxJQUFVLFNBQVMsQ0FtRWxCO0FBcEVELHVDQUF1QztBQUN2QyxXQUFVLFNBQVM7SUFDakI7O09BRUc7SUFDSCxNQUFhLGFBQWMsU0FBUSxVQUFBLFdBQVc7aUJBQzlCLGFBQVEsR0FBd0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDbkUsZUFBVSxHQUFZLElBQUksQ0FBQztpQkFFM0IsY0FBUyxHQUE2QjtZQUNsRCxDQUFDLFVBQUEsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxjQUFjLENBQUMsVUFBQSxZQUFZLENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEYsQ0FBQyxVQUFBLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hGLENBQUMsVUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxDQUFDLGNBQWMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxVQUFBLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRixDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxjQUFjLENBQUMsVUFBQSxZQUFZLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEYsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BGLENBQUMsVUFBQSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxDQUFDLEtBQUs7WUFDekMsQ0FBQyxVQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLENBQUMsS0FBSztZQUN6QyxDQUFDLFVBQUEsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxLQUFLO1lBQ2xELENBQUMsVUFBQSxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsYUFBYSxDQUFDLFFBQVE7WUFDL0MsQ0FBQyxVQUFBLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLFVBQUEsWUFBWSxDQUFDLFVBQUEsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZGLENBQUM7aUJBQ2EsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUVyQzs7V0FFRztRQUNJLE1BQU0sQ0FBQyxLQUFLO1lBQ2pCLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN4QyxhQUFhLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQWE7WUFDL0IsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDbEMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNEOztXQUVHO1FBQ0ksTUFBTSxDQUFDLFFBQVE7WUFDcEIsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQWlCO1lBQzVDLElBQUksUUFBUSxHQUFhLFVBQVUsUUFBZ0IsRUFBRSxHQUFHLEtBQWU7Z0JBQ3JFLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxVQUFBLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckYsQ0FBQyxDQUFDO1lBQ0YsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVPLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBYztZQUMxQyxJQUFJLE1BQU0sR0FBVyxFQUFFLENBQUM7WUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUU7Z0JBQ3JDLE1BQU0sSUFBSSxJQUFJLENBQUM7WUFDakIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBYTtZQUNoQyxhQUFhLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQztZQUMvRyxJQUFJLGFBQWEsQ0FBQyxVQUFVO2dCQUMxQixhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzRSxDQUFDOztJQTdEVSx1QkFBYSxnQkE4RHpCLENBQUE7QUFDSCxDQUFDLEVBbkVTLFNBQVMsS0FBVCxTQUFTLFFBbUVsQjtBQ3BFRCxJQUFVLFNBQVMsQ0FnTmxCO0FBaE5ELFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUNILElBQVksYUE0S1g7SUE1S0QsV0FBWSxhQUFhO1FBQ3ZCLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsMkJBQVUsQ0FBQTtRQUNWLDJCQUFVLENBQUE7UUFDViwyQkFBVSxDQUFBO1FBQ1YsK0JBQWMsQ0FBQTtRQUNkLGdDQUFlLENBQUE7UUFDZiwrQkFBYyxDQUFBO1FBQ2QsK0JBQWMsQ0FBQTtRQUNkLGlDQUFnQixDQUFBO1FBQ2hCLGdDQUFlLENBQUE7UUFDZixnQ0FBZSxDQUFBO1FBQ2YsK0JBQWMsQ0FBQTtRQUNkLGlDQUFnQixDQUFBO1FBQ2hCLGlDQUFnQixDQUFBO1FBQ2hCLGdDQUFlLENBQUE7UUFDZixnQ0FBZSxDQUFBO1FBQ2YsZ0NBQWUsQ0FBQTtRQUNmLHdDQUF1QixDQUFBO1FBQ3ZCLGtDQUFpQixDQUFBO1FBQ2pCLDZDQUE0QixDQUFBO1FBQzVCLCtDQUE4QixDQUFBO1FBQzlCLGdDQUFlLENBQUE7UUFDZiwwQ0FBeUIsQ0FBQTtRQUN6Qix3Q0FBdUIsQ0FBQTtRQUN2QixnQ0FBZSxDQUFBO1FBQ2YseUNBQXdCLENBQUE7UUFDeEIseUNBQXdCLENBQUE7UUFDeEIsd0NBQXVCLENBQUE7UUFDdkIsZ0NBQWUsQ0FBQTtRQUNmLGtDQUFpQixDQUFBO1FBQ2pCLGdDQUFlLENBQUE7UUFDZiwyQ0FBMEIsQ0FBQTtRQUMxQixtREFBa0MsQ0FBQTtRQUNsQyxxQ0FBb0IsQ0FBQTtRQUNwQixnQ0FBZSxDQUFBO1FBQ2YsdUNBQXNCLENBQUE7UUFDdEIsMEJBQVMsQ0FBQTtRQUNULDBCQUFTLENBQUE7UUFDVCwwQkFBUyxDQUFBO1FBQ1QsMEJBQVMsQ0FBQTtRQUNULDBCQUFTLENBQUE7UUFDVCwwQkFBUyxDQUFBO1FBQ1QsMEJBQVMsQ0FBQTtRQUNULDBCQUFTLENBQUE7UUFDVCwwQkFBUyxDQUFBO1FBQ1QsNEJBQVcsQ0FBQTtRQUNYLGdDQUFlLENBQUE7UUFDZiwyQ0FBMEIsQ0FBQTtRQUMxQixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixtREFBa0MsQ0FBQTtRQUNsQyxvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQix5Q0FBd0IsQ0FBQTtRQUN4QixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixvQ0FBbUIsQ0FBQTtRQUNuQixpREFBZ0MsQ0FBQTtRQUNoQyw2Q0FBNEIsQ0FBQTtRQUM1QixrREFBaUMsQ0FBQTtRQUNqQyw0QkFBVyxDQUFBO1FBQ1gsNEJBQVcsQ0FBQTtRQUNYLDZDQUE0QixDQUFBO1FBQzVCLDRCQUFXLENBQUE7UUFDWCw0QkFBVyxDQUFBO1FBQ1gsNEJBQVcsQ0FBQTtRQUNYLDRCQUFXLENBQUE7UUFDWCw0QkFBVyxDQUFBO1FBQ1gsNEJBQVcsQ0FBQTtRQUNYLDRCQUFXLENBQUE7UUFDWCw0QkFBVyxDQUFBO1FBQ1gsNEJBQVcsQ0FBQTtRQUNYLDRCQUFXLENBQUE7UUFDWCw0QkFBVyxDQUFBO1FBQ1gsNEJBQVcsQ0FBQTtRQUNYLHVDQUFzQixDQUFBO1FBQ3RCLGdDQUFlLENBQUE7UUFDZixnQ0FBZSxDQUFBO1FBQ2YsbUNBQWtCLENBQUE7UUFDbEIsb0NBQW1CLENBQUE7UUFDbkIsMkNBQTBCLENBQUE7UUFDMUIscUNBQW9CLENBQUE7UUFDcEIsNkNBQTRCLENBQUE7UUFDNUIsOEJBQWEsQ0FBQTtRQUNiLGdDQUFlLENBQUE7UUFDZiw0REFBMkMsQ0FBQTtRQUMzQyw0QkFBVyxDQUFBO1FBQ1gsOEJBQWEsQ0FBQTtRQUNiLG9EQUFtQyxDQUFBO1FBQ25DLDZDQUE0QixDQUFBO1FBQzVCLDRDQUEyQixDQUFBO1FBQzNCLHNEQUFxQyxDQUFBO1FBQ3JDLDJDQUEwQixDQUFBO1FBQzFCLG9EQUFtQyxDQUFBO1FBQ25DLHlDQUF3QixDQUFBO1FBQ3hCLGdDQUFlLENBQUE7UUFDZixzREFBcUMsQ0FBQTtRQUNyQywyQ0FBMEIsQ0FBQTtRQUMxQixrREFBaUMsQ0FBQTtRQUNqQyx1Q0FBc0IsQ0FBQTtRQUN0Qiw2Q0FBNEIsQ0FBQTtRQUM1QiwrQ0FBOEIsQ0FBQTtRQUM5Qix1Q0FBc0IsQ0FBQTtRQUN0Qiw4QkFBYSxDQUFBO1FBQ2IscUNBQW9CLENBQUE7UUFDcEIsOEJBQWEsQ0FBQTtRQUNiLHFDQUFvQixDQUFBO1FBQ3BCLDJDQUEwQixDQUFBO1FBQzFCLHlDQUF3QixDQUFBO1FBQ3hCLHlDQUF3QixDQUFBO1FBQ3hCLDRCQUFXLENBQUE7UUFDWCxtQ0FBa0IsQ0FBQTtRQUNsQix1Q0FBc0IsQ0FBQTtRQUN0QixrQ0FBaUIsQ0FBQTtRQUNqQixrQ0FBaUIsQ0FBQTtRQUNqQix3Q0FBdUIsQ0FBQTtRQUN2QixtQ0FBa0IsQ0FBQTtRQUNsQix5Q0FBd0IsQ0FBQTtRQUN4QixxQ0FBb0IsQ0FBQTtRQUNwQiw2Q0FBNEIsQ0FBQTtRQUM1QixnQ0FBZSxDQUFBO1FBQ2YsaURBQWdDLENBQUE7UUFDaEMsdURBQXNDLENBQUE7UUFDdEMsbURBQWtDLENBQUE7UUFDbEMsNkNBQTRCLENBQUE7UUFDNUIsbURBQWtDLENBQUE7UUFDbEMsNkNBQTRCLENBQUE7UUFDNUIsMkNBQTBCLENBQUE7UUFDMUIsMkNBQTBCLENBQUE7UUFDMUIsMERBQXlDLENBQUE7UUFFekMseUJBQXlCO1FBQ3pCLDBCQUFTLENBQUE7UUFFVCxvQkFBb0I7UUFDcEIsZ0NBQWUsQ0FBQTtRQUNmLGdDQUFlLENBQUE7UUFDZixrQ0FBaUIsQ0FBQTtRQUNqQiw4QkFBYSxDQUFBO1FBQ2IsOEJBQWEsQ0FBQTtRQUNiLG1DQUFrQixDQUFBO1FBQ2xCLHdEQUF1QyxDQUFBO1FBQ3ZDLDBEQUF5QyxDQUFBO1FBRXpDLFNBQVM7UUFDVCxnQ0FBZSxDQUFBO0lBQ2pCLENBQUMsRUE1S1csYUFBYSxHQUFiLHVCQUFhLEtBQWIsdUJBQWEsUUE0S3hCO0lBRUQsSUFBWSxnQkFhWDtJQWJELFdBQVksZ0JBQWdCO1FBQzFCLDhCQUFtQixDQUFBO1FBQ25CLDhCQUFtQixDQUFBO1FBQ25CLHdDQUEyQixDQUFBO1FBQzNCLG9DQUF1QixDQUFBO1FBQ3ZCLDBDQUE4QixDQUFBO1FBQzlCLHNDQUE4QixDQUFBO1FBQzlCLHlDQUFrQyxDQUFBO1FBQ2xDLDRCQUE0QjtRQUM1QixvQ0FBdUIsQ0FBQTtRQUN2QixtQ0FBMkIsQ0FBQTtRQUMzQiwrQ0FBeUMsQ0FBQTtRQUN6QyxtQ0FBMkIsQ0FBQTtJQUM3QixDQUFDLEVBYlcsZ0JBQWdCLEdBQWhCLDBCQUFnQixLQUFoQiwwQkFBZ0IsUUFhM0I7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztBQUNMLENBQUMsRUFoTlMsU0FBUyxLQUFULFNBQVMsUUFnTmxCO0FDaE5ELElBQVUsU0FBUyxDQXFCbEI7QUFyQkQsV0FBVSxTQUFTO0lBSWpCOztPQUVHO0lBQ0gsTUFBYSxVQUFVO1FBUXJCLFlBQW1CLE1BQWEsRUFBRSxHQUFHLFVBQW9CO1lBUGxELFNBQUksd0NBQWlDO1lBR3JDLGNBQVMsR0FBWSxJQUFJLENBQUM7WUFDMUIsYUFBUSxHQUFZLEtBQUssQ0FBQztZQUkvQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO0tBQ0Y7SUFiWSxvQkFBVSxhQWF0QixDQUFBO0FBQ0gsQ0FBQyxFQXJCUyxTQUFTLEtBQVQsU0FBUyxRQXFCbEI7QUNyQkQsSUFBVSxTQUFTLENBc01sQjtBQXRNRCxXQUFVLFNBQVM7SUFDakI7O09BRUc7SUFDSCxJQUFZLFdBZVg7SUFmRCxXQUFZLFdBQVc7UUFDckIsaUdBQWlHO1FBQ2pHLGlDQUFrQixDQUFBO1FBQ2xCLGtGQUFrRjtRQUNsRiwrQkFBZ0IsQ0FBQTtRQUNoQix3SEFBd0g7UUFDeEgsbUNBQW9CLENBQUE7UUFDcEIsZ0dBQWdHO1FBQ2hHLGlDQUFrQixDQUFBO1FBQ2xCLHlFQUF5RTtRQUN6RSxxQ0FBc0IsQ0FBQTtRQUN0QixtR0FBbUc7UUFDbkcsbUNBQW9CLENBQUE7UUFDcEIsdUNBQXVDO1FBQ3ZDLHFDQUFzQixDQUFBO0lBQ3hCLENBQUMsRUFmVyxXQUFXLEdBQVgscUJBQVcsS0FBWCxxQkFBVyxRQWV0QjtJQWFEOzs7O09BSUc7SUFDSCxNQUFhLG9CQUFvQjtRQWdCL0IsWUFBbUIsT0FBb0IsRUFBRSxhQUFxQixDQUFDLEVBQUUsZUFBdUIsRUFBRSxFQUFFLGNBQXNCLEdBQUcsRUFBRSxhQUFxQixJQUFJO1lBZnpJLGFBQVEsR0FBWSxVQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxhQUFRLEdBQVksVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFJbEMsWUFBTyxHQUFZLFVBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLFVBQUssR0FBWSxLQUFLLENBQUM7WUFLdkIsU0FBSSxHQUFTLElBQUksVUFBQSxJQUFJLEVBQUUsQ0FBQztZQUN4QixrQkFBYSxHQUFXLENBQUMsQ0FBQztZQUMxQixtQkFBYyxHQUFXLENBQUMsQ0FBQztZQTJCM0IsYUFBUSxHQUFHLENBQUMsTUFBa0IsRUFBUSxFQUFFO2dCQUM5QyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksVUFBVSxHQUFVLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLElBQUksUUFBUSxHQUFZLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx3REFBd0Q7Z0JBQzFILElBQUksTUFBZSxDQUFDO2dCQUVwQixRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDcEIsS0FBSyxZQUFZO3dCQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO3dCQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUU1QixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDOzRCQUMvQixjQUFjOzRCQUNkLElBQUksS0FBSyxHQUFZLElBQUksVUFBQSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQ2pJLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQzt3QkFDdkMsQ0FBQzt3QkFFRCxJQUFJLFlBQVksR0FBaUIsQ0FBQyxXQUF1QixFQUFRLEVBQUU7NEJBQ2pFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDOzRCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FDdkIsSUFBSSxXQUFXLENBQW1CLFdBQVcsQ0FBQyxJQUFJLEVBQUU7Z0NBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRTs2QkFDdkUsQ0FBQyxDQUNILENBQUM7d0JBQ0osQ0FBQyxDQUFDO3dCQUVGLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7d0JBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxVQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO3dCQUN0RSxNQUFNO29CQUNSLEtBQUssVUFBVTt3QkFDYixJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO3dCQUV4QixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUM5Qix1QkFBdUI7NEJBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQzVCLE1BQU07d0JBQ1IsQ0FBQzt3QkFFRCxJQUFJLFdBQVcsR0FBaUIsQ0FBQyxXQUF1QixFQUFRLEVBQUU7NEJBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUN2QixJQUFJLFdBQVcsQ0FBbUIsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQ0FDakQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFOzZCQUN2RSxDQUFDLENBQ0gsQ0FBQzt3QkFDSixDQUFDLENBQUM7d0JBRUYsMkVBQTJFO3dCQUMzRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7NEJBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7NEJBQ3pCLDBCQUEwQjs0QkFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQ3ZCLElBQUksV0FBVyxDQUFtQixXQUFXLENBQUMsTUFBTSxFQUFFO2dDQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUU7NkJBQ3ZFLENBQUMsQ0FBQyxDQUFDO3dCQUNSLENBQUM7NkJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLOzRCQUNwQiwrREFBK0Q7NEJBQy9ELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxVQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO3dCQUUzRSxNQUFNO29CQUNSLEtBQUssV0FBVzt3QkFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFDbkMsTUFBTSxHQUFHLFVBQUEsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDekQsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsNENBQTRDO3dCQUNoRyxJQUFJLFFBQVEsR0FBWSxVQUFBLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQ3ZCLElBQUksV0FBVyxDQUFtQixXQUFXLENBQUMsSUFBSSxFQUFFOzRCQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO3lCQUMzRyxDQUFDLENBQUMsQ0FBQzt3QkFDTixvRUFBb0U7d0JBQ3BFLE1BQU0sR0FBRyxVQUFBLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDeEMsSUFBSSxRQUFRLEdBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDL0QsVUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDbEMsVUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUN2QixJQUFJLFdBQVcsQ0FBbUIsV0FBVyxDQUFDLEtBQUssRUFBRTtnQ0FDbkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFOzZCQUMvSCxDQUFDLENBQUMsQ0FBQzs0QkFDTixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQzt3QkFDM0IsQ0FBQzt3QkFDRCx3QkFBd0I7d0JBQ3hCLE1BQU07b0JBQ1I7d0JBQ0UsTUFBTTtnQkFDVixDQUFDO2dCQUVELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQztZQUVNLGdCQUFXLEdBQUcsQ0FBQyxNQUFrQixFQUFFLFNBQWtCLEVBQVEsRUFBRTtnQkFDckUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDO29CQUM1QixPQUFPO2dCQUVULElBQUksQ0FBQyxHQUFjLE1BQU0sQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksS0FBSyxHQUFZLElBQUksVUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzRixJQUFJLGFBQWEsR0FBVyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUM1QyxJQUFJLFVBQVUsR0FBVyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDNUQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjO29CQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FDdkIsSUFBSSxXQUFXLENBQW1CLFdBQVcsQ0FBQyxLQUFLLEVBQUU7d0JBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUU7cUJBQzlHLENBQUMsQ0FBQyxDQUFDO2dCQUNSLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQ3JDLENBQUMsQ0FBQztZQS9IQSxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztZQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztZQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFFRDs7V0FFRztRQUNJLFFBQVEsQ0FBQyxHQUFZO1lBQzFCLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQWlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQWlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQWlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDeEUsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBaUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFpQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQWlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBMkdPLFlBQVksQ0FBQyxTQUFrQjtZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRU8sbUJBQW1CLENBQUMsUUFBbUI7WUFDN0MsSUFBSSxPQUFPLEdBQVksVUFBQSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEMsS0FBSyxJQUFJLEtBQUssSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDN0IsQ0FBQztZQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0tBQ0Y7SUFoS1ksOEJBQW9CLHVCQWdLaEMsQ0FBQTtBQUNILENBQUMsRUF0TVMsU0FBUyxLQUFULFNBQVMsUUFzTWxCO0FDdE1ELElBQVUsU0FBUyxDQW9EbEI7QUFwREQsV0FBVSxTQUFTO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFhLEtBQU0sU0FBUSxVQUFBLElBQUk7UUFFN0IsNkJBQTZCO1FBRTdCLFlBQW1CLFFBQWdCLE9BQU87WUFDeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBSlIsZUFBVSxHQUFXLFNBQVMsQ0FBQztZQTRCOUIsY0FBUyxHQUFHLEtBQUssRUFBRSxNQUFtQixFQUFpQixFQUFFO2dCQUUvRCxzRUFBc0U7Z0JBQ3RFLGtEQUFrRDtnQkFDbEQseUJBQXlCO2dCQUN6QiwyRUFBMkU7Z0JBQzNFLGNBQWM7Z0JBRWQsMkNBQTJDO2dCQUMzQyx3QkFBd0I7Z0JBQ3hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO2dCQUNsRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyx5Q0FBcUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsMkNBQXNCLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BGLHdEQUF3RDtnQkFDeEQseUJBQXlCO1lBQzNCLENBQUMsQ0FBQztZQXRDQSxJQUFJLENBQUMsZ0JBQWdCLDhCQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUMvQixDQUFDO1FBRU0sU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckQsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQzNDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMvQixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEMsVUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsTUFBTSxVQUFBLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxvREFBMEIsQ0FBQyxDQUFDO1lBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FrQkY7SUE3Q1ksZUFBSyxRQTZDakIsQ0FBQTtBQUNILENBQUMsRUFwRFMsU0FBUyxLQUFULFNBQVMsUUFvRGxCO0FDcERELElBQVUsU0FBUyxDQW9CbEI7QUFwQkQsV0FBVSxTQUFTO0lBRWpCOzs7T0FHRztJQUNILE1BQWEsU0FBVSxTQUFRLFVBQUEsaUNBQWlDLENBQUMsVUFBQSxLQUFLLENBQUM7UUFDOUQsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFvQixJQUFJLENBQUMsR0FBRyxFQUFFLFFBQWdCLElBQUksQ0FBQyxJQUFJO1lBQ3ZFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLE9BQU8sVUFBQSxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFTSxTQUFTO1lBQ2QsTUFBTSxhQUFhLEdBQWtCLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0QsT0FBTyxhQUFhLENBQUMsVUFBVSxDQUFDLFVBQUEsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQzlCLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7S0FDRjtJQWJZLG1CQUFTLFlBYXJCLENBQUE7QUFDSCxDQUFDLEVBcEJTLFNBQVMsS0FBVCxTQUFTLFFBb0JsQjtBQ3BCRCxJQUFVLFNBQVMsQ0ErTmxCO0FBL05ELFdBQVUsU0FBUztJQUVqQixjQUFjO0lBQ2QsOENBQThDO0lBQzlDLElBQUk7SUFFSjs7Ozs7T0FLRztJQUNILE1BQWEsYUFBYyxTQUFRLFVBQUEsSUFBSTtRQUNyQyx3REFBd0Q7UUFDeEQsc0ZBQXNGO2lCQUN4RSxVQUFLLEdBQVcsQ0FBQyxBQUFaLENBQWE7UUFDaEMsU0FBUyxDQUFxQjtRQUM5Qiw0QkFBNEI7UUFDNUIsc0JBQXNCLENBQWlCO1FBRXZDOzs7O1dBSUc7UUFDSCxZQUFtQixNQUFjO1lBQy9CLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQVZ6QixjQUFTLEdBQVcsU0FBUyxDQUFDO1lBQzlCLDRCQUE0QjtZQUM1QiwyQkFBc0IsR0FBWSxJQUFJLENBQUM7WUFpSXZDOztlQUVHO1lBQ0sscUJBQWdCLEdBQUcsS0FBSyxFQUFFLE1BQW1CLEVBQWlCLEVBQUU7Z0JBQ3RFLG9KQUFvSjtnQkFDcEosa0NBQWtDO2dCQUNsQyxxREFBcUQ7Z0JBQ3JELDZCQUE2QjtnQkFDN0IsWUFBWTtnQkFDWixJQUFJO2dCQUVKLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDbkIsT0FBTztnQkFFVCxvR0FBb0c7Z0JBQ3BHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQVMsTUFBTSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssZ0RBQXdCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRSxDQUFDLENBQUM7WUFFRjs7ZUFFRztZQUNLLHdCQUFtQixHQUFHLEtBQUssRUFBRSxNQUFtQixFQUFpQixFQUFFO2dCQUN6RSxpSUFBaUk7Z0JBQ2pJLGtDQUFrQztnQkFDbEMscURBQXFEO2dCQUNyRCw2QkFBNkI7Z0JBQzdCLFlBQVk7Z0JBQ1osSUFBSTtnQkFFSix5RUFBeUU7Z0JBQ3pFLDJEQUEyRDtnQkFDM0QsWUFBWTtnQkFDWixJQUFJO2dCQUVKLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDbkIsT0FBTztnQkFFVCxnR0FBZ0c7Z0JBQ2hHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNsRixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyw4QkFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JGLENBQUMsQ0FBQztZQWpLQSxJQUFJLENBQUMsZ0JBQWdCLDhCQUFlLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBRTlELElBQUksQ0FBQyxNQUFNO2dCQUNULE9BQU87WUFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDckMsQ0FBQztRQUVELElBQVcsUUFBUTtZQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQztRQUVEOztXQUVHO1FBQ0ksS0FBSyxDQUFDLEtBQUs7WUFDaEIsSUFBSSxRQUFRLEdBQWlCLE1BQU0sVUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2RSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELHVGQUF1RjtRQUNoRixTQUFTO1lBQ2QsSUFBSSxNQUFNLEdBQXlCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBQSxvQkFBb0IsQ0FBQyxDQUFDO1lBQzNFLElBQUksYUFBYSxHQUFrQixFQUFFLENBQUM7WUFFdEMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsNkZBQTZGO2dCQUM1SCxhQUFhLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLEtBQUssR0FBVSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzlCLElBQUksS0FBSyxZQUFZLFVBQUEsU0FBUyxFQUFFLENBQUMsQ0FBQyw0RkFBNEY7b0JBQzVILE9BQU8sYUFBYSxDQUFDLFVBQVUsQ0FBQyxVQUFBLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN4RCxPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUM7b0JBQzlCLGFBQWEsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDaEMsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixhQUFhLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1lBQzdDLENBQUM7WUFJRCxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDeEMsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUM7WUFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLEtBQUssR0FBMEIsTUFBTSxVQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3RSxJQUFJLEtBQUssWUFBWSxVQUFBLFNBQVM7b0JBQzVCLE1BQU0sVUFBQSxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRTFELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGdEQUFnRDtnQkFFekYsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztZQUN0QyxDQUFDO1lBRUQsSUFBSSxLQUFLLEdBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzlCLElBQUksS0FBSztnQkFDUCxpR0FBaUc7Z0JBQ2pHLDJFQUEyRTtnQkFDM0UsU0FBUztnQkFDVCxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QjtZQUN4RCxJQUFJO2lCQUNDLENBQUM7Z0JBQ0osT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkUsVUFBQSxPQUFPLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVEOztXQUVHO1FBQ0ksS0FBSyxDQUFDLGNBQWM7WUFDekIsSUFBSSxLQUFLLEdBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzlCLElBQUksSUFBSSxDQUFDLHNCQUFzQjtnQkFDN0IsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRDs7V0FFRztRQUNJLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBYTtZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFFbkMsSUFBSSxZQUFZLEdBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JDLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLFlBQVk7Z0JBQ1osc0ZBQXNGO2dCQUN0RixZQUFZLENBQUMsbUJBQW1CLHlDQUFxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDNUUsWUFBWTtnQkFDWixxRkFBcUY7WUFDdkYsQ0FBQztZQUVELDRIQUE0SDtZQUM1SCxJQUFJLGFBQWEsR0FBa0IsVUFBQSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hFLHdDQUF3QztZQUN4QyxLQUFLLElBQUksSUFBSSxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLE1BQU07WUFDUixDQUFDO1lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRS9DLHlGQUF5RjtZQUN6RixNQUFNLENBQUMsZ0JBQWdCLHlDQUFxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNuRSxZQUFZO1lBQ1osZ0VBQWdFO1lBQ2hFLHVIQUF1SDtZQUV2SCxZQUFZO1lBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssb0RBQTBCLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHO1lBQ1IsT0FBYyxVQUFBLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUE2Q0Qsc0ZBQXNGO1FBQzlFLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBbUIsRUFBRSxPQUFhLEVBQUUsWUFBa0IsRUFBRSxLQUFhO1lBQ2pHLDBEQUEwRDtZQUcxRCxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSwrRUFBK0U7Z0JBQ3JHLElBQUksSUFBSSxZQUFZLGFBQWEsRUFBRSw2REFBNkQ7b0JBQzlGLElBQUksSUFBSSxJQUFJLElBQUk7d0JBQ2QsTUFBTTt5QkFDSCxDQUFDO3dCQUNKLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDLENBQUMsQ0FBQzt3QkFDbkQsT0FBTztvQkFDVCxDQUFDO1lBRUwsMkRBQTJEO1lBQzNELElBQUksS0FBSyxHQUFXLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBVyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxVQUFVLEdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtnQkFDekgsWUFBWSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7Z0JBQzdGLHNEQUFzRDtZQUN4RCxDQUFDO1lBRUQsd0RBQXdEO1lBQ3hELElBQUksU0FBUyxHQUFjLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUYsSUFBSSxTQUFTO2dCQUNYLE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVPLFVBQVU7WUFDaEIsSUFBSSxTQUFTLEdBQXlCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBQSxvQkFBb0IsQ0FBQyxDQUFDO1lBQzlFLE9BQU8sQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLENBQUM7O0lBak5VLHVCQUFhLGdCQWtOekIsQ0FBQTtBQUNILENBQUMsRUEvTlMsU0FBUyxLQUFULFNBQVMsUUErTmxCO0FDL05ELElBQVUsU0FBUyxDQThCbEI7QUE5QkQsV0FBVSxTQUFTO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFhLElBQUssU0FBUSxVQUFBLE9BQU87UUFDL0IsZ0NBQWdDO1FBQ2hDLG9GQUFvRjtRQUVwRjs7OztXQUlHO1FBQ0ksYUFBYSxDQUFDLE9BQXdCLEVBQUUsWUFBK0IsSUFBeUMsQ0FBQztRQUV4SCxrQkFBa0I7UUFDWCxTQUFTO1lBQ2QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ00sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFUyxhQUFhLENBQUMsUUFBaUI7WUFDdkMsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzdCLENBQUM7S0FFRjtJQXZCWSxjQUFJLE9BdUJoQixDQUFBO0FBQ0gsQ0FBQyxFQTlCUyxTQUFTLEtBQVQsU0FBUyxRQThCbEI7QUM5QkQsSUFBVSxTQUFTLENBMEJsQjtBQTFCRCxXQUFVLFNBQVM7SUFDakI7O09BRUc7SUFFSCxJQUFhLFdBQVcsR0FBeEIsTUFBYSxXQUFZLFNBQVEsVUFBQSxJQUFJO1FBR25DLFlBQW1CLFNBQWdCLElBQUksVUFBQSxLQUFLLEVBQUU7WUFDNUMsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUN0QixDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckQsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzdDLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFDTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN4QyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FFRixDQUFBO0lBcEJZLFdBQVc7UUFEdkIsVUFBQSxrQkFBa0IsQ0FBQyxRQUFRO09BQ2YsV0FBVyxDQW9CdkI7SUFwQlkscUJBQVcsY0FvQnZCLENBQUE7QUFDSCxDQUFDLEVBMUJTLFNBQVMsS0FBVCxTQUFTLFFBMEJsQjtBQzFCRCxJQUFVLFNBQVMsQ0EyRGxCO0FBM0RELFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUVILElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWMsU0FBUSxVQUFBLFdBQVc7UUFLNUMsU0FBUyxDQUFTO1FBRWxCLFlBQW1CLFNBQWdCLElBQUksVUFBQSxLQUFLLEVBQUUsRUFBRSxXQUFtQixDQUFDLEVBQUUsWUFBb0IsR0FBRyxFQUFFLGFBQXFCLEdBQUcsRUFBRSxZQUFvQixHQUFHO1lBQzlJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFXLFFBQVE7WUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxJQUFXLFFBQVEsQ0FBQyxNQUFjO1lBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0IsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JELGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNyQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDdkMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3pDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN2QyxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUM1RCxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN6RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTSxVQUFVO1lBQ2YsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDdkIsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ3hCLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUN6QixPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDL0IsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQyxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDakMsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztLQUVGLENBQUE7SUFyRFksYUFBYTtRQUR6QixVQUFBLGtCQUFrQixDQUFDLFFBQVE7T0FDZixhQUFhLENBcUR6QjtJQXJEWSx1QkFBYSxnQkFxRHpCLENBQUE7QUFDSCxDQUFDLEVBM0RTLFNBQVMsS0FBVCxTQUFTLFFBMkRsQjtBQzNERCxJQUFVLFNBQVMsQ0EyQmxCO0FBM0JELFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUVILElBQWEsWUFBWSxHQUF6QixNQUFhLFlBQWEsU0FBUSxVQUFBLFdBQVc7UUFHM0MsWUFBbUIsU0FBZ0IsSUFBSSxVQUFBLEtBQUssRUFBRSxFQUFFLFdBQW9CLFVBQUEsY0FBYyxDQUFDLEtBQUs7WUFDdEYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBSFQsWUFBTyxHQUFZLElBQUksQ0FBQztZQUk3QixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUMxQixDQUFDO1FBRUQsa0JBQWtCO1FBQ1gsU0FBUztZQUNkLElBQUksYUFBYSxHQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckQsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUNsRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBQ00sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEMsSUFBSSxjQUFjLENBQUMsU0FBUztnQkFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBWSxNQUFNLFVBQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0tBRUYsQ0FBQTtJQXJCWSxZQUFZO1FBRHhCLFVBQUEsa0JBQWtCLENBQUMsUUFBUTtPQUNmLFlBQVksQ0FxQnhCO0lBckJZLHNCQUFZLGVBcUJ4QixDQUFBO0FBQ0gsQ0FBQyxFQTNCUyxTQUFTLEtBQVQsU0FBUyxRQTJCbEI7QUMzQkQsc0NBQXNDO0FBRXRDLElBQVUsU0FBUyxDQTBEbEI7QUE1REQsc0NBQXNDO0FBRXRDLFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUVILElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXNCLFNBQVEsVUFBQSxZQUFZO1FBS3JELFNBQVMsQ0FBUztRQUVsQixZQUFtQixTQUFnQixJQUFJLFVBQUEsS0FBSyxFQUFFLEVBQUUsV0FBb0IsVUFBQSxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQW1CLENBQUMsRUFBRSxZQUFvQixHQUFHLEVBQUUsYUFBcUIsR0FBRyxFQUFFLFlBQW9CLEdBQUc7WUFDeEwsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztZQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBVyxRQUFRO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBVyxRQUFRLENBQUMsTUFBYztZQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxrQkFBa0I7UUFDWCxTQUFTO1lBQ2QsSUFBSSxhQUFhLEdBQWtCLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyRCxhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDckMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3ZDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN6QyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDdkMsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUNNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBNkI7WUFDcEQsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDNUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDekQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU0sVUFBVTtZQUNmLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3ZCLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUN4QixPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDekIsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNqQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkMsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2pDLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7S0FFRixDQUFBO0lBcERZLHFCQUFxQjtRQURqQyxVQUFBLGtCQUFrQixDQUFDLFFBQVE7T0FDZixxQkFBcUIsQ0FvRGpDO0lBcERZLCtCQUFxQix3QkFvRGpDLENBQUE7QUFDSCxDQUFDLEVBMURTLFNBQVMsS0FBVCxTQUFTLFFBMERsQjtBQzVERCxzQ0FBc0M7QUFFdEMsSUFBVSxTQUFTLENBMkJsQjtBQTdCRCxzQ0FBc0M7QUFFdEMsV0FBVSxTQUFTO0lBQ2pCOztPQUVHO0lBRUgsSUFBYSw0QkFBNEIsR0FBekMsTUFBYSw0QkFBNkIsU0FBUSxVQUFBLHFCQUFxQjtRQUdyRSxZQUFtQixTQUFnQixJQUFJLFVBQUEsS0FBSyxFQUFFLEVBQUUsV0FBb0IsVUFBQSxjQUFjLENBQUMsS0FBSyxFQUFFLGFBQXNCLFVBQUEsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFpQixFQUFFLFlBQW9CLFNBQVMsRUFBRSxhQUFxQixTQUFTLEVBQUUsWUFBb0IsU0FBUztZQUNwUCxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUgvRCxjQUFTLEdBQVksSUFBSSxDQUFDO1lBSS9CLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1FBQzlCLENBQUM7UUFFRCxrQkFBa0I7UUFDWCxTQUFTO1lBQ2QsSUFBSSxhQUFhLEdBQWtCLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyRCxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQ3RELE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFDTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN4QyxJQUFJLGNBQWMsQ0FBQyxXQUFXO2dCQUM1QixJQUFJLENBQUMsU0FBUyxHQUFZLE1BQU0sVUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FFRixDQUFBO0lBckJZLDRCQUE0QjtRQUR4QyxVQUFBLGtCQUFrQixDQUFDLFFBQVE7T0FDZiw0QkFBNEIsQ0FxQnhDO0lBckJZLHNDQUE0QiwrQkFxQnhDLENBQUE7QUFDSCxDQUFDLEVBM0JTLFNBQVMsS0FBVCxTQUFTLFFBMkJsQjtBQzdCRCxJQUFVLFNBQVMsQ0E0Q2xCO0FBNUNELFdBQVUsU0FBUztJQUVqQjs7T0FFRztJQUVILElBQWEsUUFBUSxHQUFyQixNQUFhLFFBQVMsU0FBUSxhQUFhLENBQUMsVUFBQSxhQUFhLENBQUM7UUFDeEQsWUFBbUIsU0FBZ0IsSUFBSSxVQUFBLEtBQUssRUFBRSxFQUFFLFdBQW9CLFVBQUEsY0FBYyxDQUFDLElBQUksRUFBRSxRQUFpQixFQUFFLFlBQW9CLEdBQUcsRUFBRSxVQUFtQixFQUFFLFNBQWtCO1lBQzFLLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7UUFDMUIsQ0FBQztLQUNGLENBQUE7SUFMWSxRQUFRO1FBRHBCLFVBQUEsa0JBQWtCLENBQUMsUUFBUTtPQUNmLFFBQVEsQ0FLcEI7SUFMWSxrQkFBUSxXQUtwQixDQUFBO0lBRUQ7O09BRUc7SUFFSCxJQUFhLGdCQUFnQixHQUE3QixNQUFhLGdCQUFpQixTQUFRLGFBQWEsQ0FBQyxVQUFBLHFCQUFxQixDQUFDO1FBQ3hFLFlBQW1CLFNBQWdCLElBQUksVUFBQSxLQUFLLEVBQUUsRUFBRSxXQUFvQixVQUFBLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBb0IsVUFBQSxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQWlCLEVBQUUsWUFBb0IsR0FBRyxFQUFFLFVBQW1CLEVBQUUsU0FBa0I7WUFDcE4sS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7UUFDMUIsQ0FBQztLQUNGLENBQUE7SUFMWSxnQkFBZ0I7UUFENUIsVUFBQSxrQkFBa0IsQ0FBQyxRQUFRO09BQ2YsZ0JBQWdCLENBSzVCO0lBTFksMEJBQWdCLG1CQUs1QixDQUFBO0lBRUQsU0FBUyxhQUFhLENBQXlELEtBQVk7UUFDekYsTUFBZSxRQUFTLFNBQVEsS0FBSztZQUc1QixTQUFTO2dCQUNkLElBQUksYUFBYSxHQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3JELGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ2xELE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO2dCQUNwRCxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksY0FBYyxDQUFDLFNBQVM7b0JBQzFCLElBQUksQ0FBQyxPQUFPLEdBQVksTUFBTSxVQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7U0FDRjtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDLEVBNUNTLFNBQVMsS0FBVCxTQUFTLFFBNENsQjtBQzVDRCxJQUFVLFNBQVMsQ0FzTmxCO0FBdE5ELFdBQVUsU0FBUztJQUNqQjs7T0FFRztJQUNILE1BQWEsS0FBTSxTQUFRLFVBQUEsT0FBTztRQUNoQyxzRUFBc0U7aUJBQ3ZELFNBQUksR0FBNkIsQ0FBQyxHQUFHLEVBQUU7WUFDcEQsTUFBTSxJQUFJLEdBQTZCLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkgsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFPTCxZQUFtQixLQUFhLENBQUMsRUFBRSxLQUFhLENBQUMsRUFBRSxLQUFhLENBQUMsRUFBRSxLQUFhLENBQUM7WUFDL0UsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBZ0I7WUFDNUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQ2hDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2xELENBQUM7UUFFRDs7O1dBR0c7UUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQWdCLEVBQUUsTUFBZTtZQUNqRCxPQUFPLFVBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBWSxFQUFFLEtBQVk7WUFDOUMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFXLEtBQUs7WUFDZCxPQUFPLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksSUFBSSxDQUFDLE1BQWE7WUFDdkIsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLE9BQU87WUFDWixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsUUFBZ0IsRUFBRSxNQUFlO1lBQzdDLE1BQU0sU0FBUyxHQUFzQixLQUFLLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFVTSxRQUFRLENBQUMsRUFBOEIsRUFBRSxFQUFXLEVBQUUsRUFBVyxFQUFFLEVBQVc7WUFDbkYsSUFBSSxFQUFFLFlBQVksaUJBQWlCO2dCQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBVU0sVUFBVSxDQUFDLEVBQXlCLEVBQUUsRUFBVyxFQUFFLEVBQVcsRUFBRSxFQUFXO1lBQ2hGLElBQUksRUFBRSxZQUFZLFlBQVk7Z0JBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUU1QyxJQUFJLENBQUMsR0FBRyxDQUNOLFVBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNwQixVQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDcEIsVUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3BCLFVBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNyQixDQUFDO1lBQ0osT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVTtZQUN2RCxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRDs7V0FFRztRQUNJLEdBQUc7WUFDUixPQUFPLElBQUksWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVEOztXQUVHO1FBQ0ksUUFBUTtZQUNiLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNO1lBQ1gsSUFBSSxLQUFLLEdBQXNCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxPQUFPLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2xFLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU07WUFDWCxJQUFJLEtBQUssR0FBc0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9DLElBQUksR0FBRyxHQUFXLEVBQUUsQ0FBQztZQUNyQixLQUFLLElBQUksSUFBSSxJQUFJLEtBQUs7Z0JBQ3BCLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsSUFBWTtZQUN4QixJQUFJLEtBQUssR0FBc0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9DLElBQUksT0FBTyxHQUFXLENBQUMsQ0FBQztZQUN4QixLQUFLLElBQUksSUFBSSxJQUFJLEtBQUs7Z0JBQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUEsQ0FBQztRQUMvQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsTUFBYTtZQUN0QixJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRLENBQUMsTUFBYTtZQUMzQixJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRO1lBQ2IsT0FBTyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDaEgsQ0FBQztRQUVELGtCQUFrQjtRQUNYLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RCxnSEFBZ0g7WUFDaEgsYUFBYSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQTZCO1lBQ3BELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUN4QyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFrQixjQUFjLENBQUMsQ0FBQztZQUNqRixDQUFDOztnQkFDQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVTLGFBQWEsQ0FBQyxRQUFpQixJQUFnQixDQUFDOztJQWhOL0MsZUFBSyxRQWlOakIsQ0FBQTtBQUNILENBQUMsRUF0TlMsU0FBUyxLQUFULFNBQVMsUUFzTmxCO0FDdE5ELElBQVUsU0FBUyxDQWdIbEI7QUFoSEQsV0FBVSxTQUFTO0lBRWpCOzs7T0FHRztJQUNILE1BQWEsUUFBUyxTQUFRLFVBQUEsT0FBTztRQVduQyxLQUFLLENBQU87UUFFWixZQUFtQixLQUFhLEVBQUUsT0FBdUIsRUFBRSxLQUFZO1lBQ3JFLEtBQUssRUFBRSxDQUFDO1lBWEgsZUFBVSxHQUFXLFNBQVMsQ0FBQztZQUV0Qzs7ZUFFRztZQUNJLGNBQVMsR0FBVyxJQUFJLENBQUM7WUFPOUIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7WUFDMUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLEtBQUs7b0JBQ1AsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7O29CQUVsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2hELENBQUM7WUFDRCxVQUFBLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxJQUFJO1lBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFDRDs7V0FFRztRQUNILElBQVcsSUFBSSxDQUFDLEtBQVc7WUFDekIsSUFBSSxJQUFJLENBQUMsVUFBVTtnQkFDakIsSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFO29CQUNoRCxJQUFJLEtBQUssWUFBWSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRTt3QkFDNUMsVUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7O3dCQUU1RCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUM7UUFFRDs7V0FFRztRQUNJLHdCQUF3QjtZQUM3QixJQUFJLElBQUksR0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7Ozs7V0FJRztRQUNJLFNBQVMsQ0FBQyxXQUEwQjtZQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztZQUM5QixJQUFJLElBQUksR0FBUyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNuQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxTQUFTO1lBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsOEtBQThLO1FBQ3ZLLFNBQVM7WUFDZCxJQUFJLGFBQWEsR0FBa0I7Z0JBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7Z0JBQzVCLElBQUksRUFBRSxVQUFBLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDdEMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzFCLENBQUM7WUFDRixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBQ00sS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUE2QjtZQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDaEMsVUFBQSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBYSxTQUFVLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlELElBQUksSUFBSSxHQUFlLE1BQU0sVUFBQSxVQUFVLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJLGNBQWMsQ0FBQyxTQUFTLElBQUksU0FBUztnQkFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQzVDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVNLFVBQVU7WUFDZixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN0QyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRVMsYUFBYSxDQUFDLFFBQWlCO1lBQ3ZDLDhCQUE4QjtRQUNoQyxDQUFDO0tBRUY7SUF6R1ksa0JBQVEsV0F5R3BCLENBQUE7QUFDSCxDQUFDLEVBaEhTLFNBQVMsS0FBVCxTQUFTLFFBZ0hsQjtBQ2hIRCxJQUFVLFNBQVMsQ0FhbEI7QUFiRCxXQUFVLFNBQVM7SUFFakI7OztPQUdHO0lBQ0gsTUFBYSxZQUFhLFNBQVEsVUFBQSxpQ0FBaUMsQ0FBQyxVQUFBLFFBQVEsQ0FBQztRQUNwRSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQW9CLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBZ0IsSUFBSSxDQUFDLElBQUk7WUFDdkUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsT0FBTyxVQUFBLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQztLQUNGO0lBTlksc0JBQVksZUFNeEIsQ0FBQTtBQUNILENBQUMsRUFiUyxTQUFTLEtBQVQsU0FBUyxRQWFsQjtBQ2JELElBQVUsU0FBUyxDQTBCbEI7QUExQkQsV0FBVSxTQUFTO0lBQ2pCOztPQUVHO0lBQ0gsTUFBc0IsSUFBSTtRQUN4Qix5RUFBeUU7aUJBQ2xELFlBQU8sR0FBVyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUN2RCx5RUFBeUU7aUJBQ2xELFlBQU8sR0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUUxRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUksTUFBUyxFQUFFLElBQU8sRUFBRSxJQUFPLEVBQUUsYUFBa0QsQ0FBQyxPQUFVLEVBQUUsT0FBVSxFQUFFLEVBQUUsR0FBRyxPQUFPLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzdKLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDMUMsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUMxQyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVTtZQUNuRCxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQzs7SUFwQm1CLGNBQUksT0FxQnpCLENBQUE7QUFDSCxDQUFDLEVBMUJTLFNBQVMsS0FBVCxTQUFTLFFBMEJsQjtBQzFCRCxJQUFVLFNBQVMsQ0EySmxCO0FBM0pELFdBQVUsU0FBUztJQVFqQjs7Ozs7T0FLRztJQUNILE1BQXNCLE9BQVEsU0FBUSxVQUFBLE9BQU87UUFDakMsYUFBYSxDQUFDLFFBQWlCLElBQWdCLENBQUM7S0FxQjNEO0lBdEJxQixpQkFBTyxVQXNCNUIsQ0FBQTtJQUVEOzs7T0FHRztJQUNILE1BQWEsWUFBYSxTQUFRLE9BQU87UUFJdkMsWUFBbUIsU0FBaUIsR0FBRyxFQUFFLFVBQWtCLEdBQUc7WUFDNUQsS0FBSyxFQUFFLENBQUM7WUFKSCxVQUFLLEdBQVcsR0FBRyxDQUFDO1lBQ3BCLFdBQU0sR0FBVyxHQUFHLENBQUM7WUFJMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVEOztXQUVHO1FBQ0ksT0FBTyxDQUFDLE1BQWMsRUFBRSxPQUFlO1lBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLENBQUM7UUFFTSxRQUFRLENBQUMsYUFBc0IsRUFBRSxVQUFxQjtZQUMzRCxJQUFJLE1BQU0sR0FBWSxJQUFJLFVBQUEsT0FBTyxDQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFDaEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQ25FLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRU0sZUFBZSxDQUFDLE1BQWUsRUFBRSxLQUFnQjtZQUN0RCxJQUFJLE1BQU0sR0FBWSxJQUFJLFVBQUEsT0FBTyxDQUMvQixNQUFNLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUM3QyxNQUFNLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUNoRCxDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVNLE9BQU8sQ0FBQyxVQUFxQjtZQUNsQyxPQUFPLFVBQUEsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELENBQUM7S0FDRjtJQXBDWSxzQkFBWSxlQW9DeEIsQ0FBQTtJQUNEOzs7T0FHRztJQUNILE1BQWEsYUFBYyxTQUFRLE9BQU87UUFBMUM7O1lBQ1MsY0FBUyxHQUFXLEdBQUcsQ0FBQztZQUN4QixlQUFVLEdBQVcsR0FBRyxDQUFDO1FBNkJsQyxDQUFDO1FBM0JDOztXQUVHO1FBQ0ksUUFBUSxDQUFDLFVBQWtCLEVBQUUsV0FBbUI7WUFDckQsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDaEMsQ0FBQztRQUVNLFFBQVEsQ0FBQyxhQUFzQixFQUFFLFVBQXFCO1lBQzNELElBQUksTUFBTSxHQUFZLElBQUksVUFBQSxPQUFPLENBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFDakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUNuRCxDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVNLGVBQWUsQ0FBQyxNQUFlLEVBQUUsS0FBZ0I7WUFDdEQsSUFBSSxNQUFNLEdBQVksSUFBSSxVQUFBLE9BQU8sQ0FDL0IsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQ25DLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUNyQyxDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVNLE9BQU8sQ0FBQyxVQUFxQjtZQUNsQyxPQUFPLFVBQUEsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRyxDQUFDO0tBQ0Y7SUEvQlksdUJBQWEsZ0JBK0J6QixDQUFBO0lBRUQ7OztPQUdHO0lBQ0gsTUFBYSxjQUFlLFNBQVEsT0FBTztRQUEzQzs7WUFDUyxXQUFNLEdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDMUQsWUFBTyxHQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBZ0NwRSxDQUFDO1FBOUJRLFFBQVEsQ0FBQyxhQUFzQixFQUFFLFVBQXFCO1lBQzNELElBQUksTUFBTSxHQUFZLElBQUksVUFBQSxPQUFPLENBQy9CLGFBQWEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFDekUsYUFBYSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUN6RSxDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNNLGVBQWUsQ0FBQyxNQUFlLEVBQUUsS0FBZ0I7WUFDdEQsSUFBSSxNQUFNLEdBQVksSUFBSSxVQUFBLE9BQU8sQ0FDL0IsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxFQUM3RCxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQzdELENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRU0sT0FBTyxDQUFDLFVBQXFCO1lBQ2xDLElBQUksQ0FBQyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDO1lBRWQsSUFBSSxJQUFJLEdBQVcsVUFBVSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzFGLElBQUksSUFBSSxHQUFXLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN6RixJQUFJLElBQUksR0FBVyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNsRyxJQUFJLElBQUksR0FBVyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUVyRyxPQUFPLFVBQUEsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFTSxVQUFVO1lBQ2YsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEQsQ0FBQztLQUNGO0lBbENZLHdCQUFjLGlCQWtDMUIsQ0FBQTtBQUNILENBQUMsRUEzSlMsU0FBUyxLQUFULFNBQVMsUUEySmxCO0FDM0pELElBQVUsU0FBUyxDQW1DbEI7QUFuQ0QsV0FBVSxTQUFTO0lBQ2pCOzs7Ozs7T0FNRztJQUNILE1BQWEsSUFBSTtRQUlmLFlBQW1CLFNBQWlCLENBQUMsRUFBRSxhQUFxQixDQUFDO1lBSHRELGNBQVMsR0FBVyxDQUFDLENBQUM7WUFDdEIsVUFBSyxHQUFXLENBQUMsQ0FBQztZQUd2QixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsU0FBaUIsQ0FBQyxFQUFFLGFBQXFCLENBQUM7WUFDbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDdEIsQ0FBQztRQUVNLE9BQU87WUFDWixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDYixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRO1lBQ2IsT0FBTyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RixDQUFDO0tBQ0Y7SUExQlksY0FBSSxPQTBCaEIsQ0FBQTtBQUNILENBQUMsRUFuQ1MsU0FBUyxLQUFULFNBQVMsUUFtQ2xCO0FDbkNELElBQVUsU0FBUyxDQXNDbEI7QUF0Q0QsV0FBVSxTQUFTO0lBQ2pCOzs7Ozs7O09BT0c7SUFDSCxNQUFhLElBQUk7UUFLZixZQUFtQixhQUFxQixDQUFDLEVBQUUsWUFBb0IsQ0FBQyxFQUFFLGFBQXFCLENBQUM7WUFKakYsY0FBUyxHQUFXLENBQUMsQ0FBQztZQUN0QixhQUFRLEdBQVcsQ0FBQyxDQUFDO1lBQ3JCLGNBQVMsR0FBVyxDQUFDLENBQUM7WUFHM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRDs7V0FFRztRQUNJLEdBQUcsQ0FBQyxhQUFxQixDQUFDLEVBQUUsWUFBb0IsQ0FBQyxFQUFFLGFBQXFCLENBQUM7WUFDOUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7UUFDOUIsQ0FBQztRQUVNLE9BQU87WUFDWixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDYixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRO1lBQ2IsT0FBTyxjQUFjLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxlQUFlLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvSSxDQUFDO0tBQ0Y7SUE1QlksY0FBSSxPQTRCaEIsQ0FBQTtBQUNILENBQUMsRUF0Q1MsU0FBUyxLQUFULFNBQVMsUUFzQ2xCO0FDdENELElBQVUsU0FBUyxDQTZGbEI7QUE3RkQsV0FBVSxTQUFTO0lBQ2pCLHNEQUFzRDtJQUN0RCw0Q0FBNEM7SUFDNUMsU0FBZ0IsSUFBSTtRQUNsQixJQUFJLENBQUMsR0FBVyxVQUFVLENBQUM7UUFFM0IsSUFBSSxJQUFJLEdBQWEsVUFBVSxLQUFzQjtZQUNuRCxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzlDLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsR0FBVyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7Z0JBQ3hDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNaLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDUCxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDWixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNQLENBQUMsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsT0FBTztZQUMvQixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLFFBQVE7UUFDckQsQ0FBQyxDQUFDO1FBRUYsNkJBQTZCO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQXBCZSxjQUFJLE9Bb0JuQixDQUFBO0lBR0Qsc0RBQXNEO0lBQ3RELFNBQWdCLEtBQUs7UUFDbkIsNEJBQTRCO1FBQzVCLCtEQUErRDtRQUMvRCxJQUFJLElBQUksR0FBYSxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0QsSUFBSSxFQUFFLEdBQVcsQ0FBQyxFQUNoQixFQUFFLEdBQVcsRUFBRSxFQUNmLEVBQUUsR0FBVyxHQUFHLEVBQ2hCLEVBQUUsR0FBVyxHQUFHLENBQUM7UUFFbkIsSUFBSSxDQUFDLEdBQWEsRUFBRSxDQUFDO1FBRXJCLElBQUksSUFBSSxHQUFhLElBQUksRUFBRSxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QixJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLFFBQVE7WUFDakQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxRQUFRO2dCQUNyRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNaLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksR0FBRyxJQUFJLENBQUM7UUFFWixJQUFJLE1BQU0sR0FBYTtZQUNyQixJQUFJLENBQVMsQ0FBQztZQUVkLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDcEIsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNwQixFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3BCLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFFcEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ1YsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNULENBQUM7WUFDRCxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ1YsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNULENBQUM7WUFDRCxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ1YsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNULENBQUM7WUFFRCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxDQUFDO1FBRUYsZ0NBQWdDO1FBQ2hDLGlEQUFpRDtRQUNqRCxLQUFLO1FBQ0wsMkJBQTJCO1FBQzNCLGdDQUFnQztRQUNoQyxzQkFBc0I7UUFFdEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQWpFZSxlQUFLLFFBaUVwQixDQUFBO0FBQ0gsQ0FBQyxFQTdGUyxTQUFTLEtBQVQsU0FBUyxRQTZGbEI7QUM3RkQsSUFBVSxTQUFTLENBNmRsQjtBQTdkRCxXQUFVLFNBQVM7SUFXakI7OztPQUdHO0lBQ0gsTUFBYSxTQUFVLFNBQVEsVUFBQSxPQUFPO1FBS3BDO1lBQ0UsS0FBSyxFQUFFLENBQUM7WUFMRixTQUFJLEdBQWlCLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCO1lBQ3BFLFlBQU8sR0FBWSxJQUFJLENBQUMsQ0FBQyw2SEFBNkg7WUFLNUosSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFHRCx3Q0FBd0M7UUFDeEMsc0JBQXNCO1FBQ2YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFjLEVBQUUsT0FBZTtZQUN0RCxJQUFJLFNBQVMsR0FBYyxJQUFJLFNBQVMsQ0FBQztZQUN6QyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDakIsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDaEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO2dCQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNULENBQUMsQ0FBQztZQUNILE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxRQUFRO1lBQ3BCLE1BQU0sU0FBUyxHQUFjLFVBQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQW1CO1lBQzNDLE1BQU0sU0FBUyxHQUFjLFVBQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2RCxTQUFTLENBQUMsR0FBRyxDQUFDO2dCQUNaLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDUCxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ1AsVUFBVSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDOUIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBdUI7WUFDNUMsTUFBTSxTQUFTLEdBQWMsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksY0FBYyxHQUFXLGVBQWUsR0FBRyxVQUFBLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDNUQsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMzQyxJQUFJLEdBQUcsR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzNDLFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ1osR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNYLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNaLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztZQUNILE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBZ0I7WUFDcEMsTUFBTSxTQUFTLEdBQWMsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ1osT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDZixDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNmLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztZQUNILE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxZQUFZO1FBRVo7O1dBRUc7UUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQW1CLEVBQUUsU0FBb0I7WUFDN0QsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksR0FBRyxHQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksR0FBRyxHQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksR0FBRyxHQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxTQUFTLEdBQWMsVUFBQSxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ1osR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQ2pDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDakMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQ2pDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDakMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQ2pDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRzthQUNsQyxDQUFDLENBQUM7WUFDSCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFlO1lBQ25DLElBQUksQ0FBQyxHQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2hDLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRS9CLElBQUksQ0FBQyxHQUFXLENBQUM7Z0JBQ2YsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7b0JBQzVCLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztvQkFDN0IsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVuQyxNQUFNLFNBQVMsR0FBYyxVQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkQsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDWixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFNO2dCQUNuQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFNO2dCQUNuQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFNO2dCQUNuQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFNO2dCQUNuQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFNO2dCQUNuQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFNO2dCQUNuQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFNO2dCQUNuQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFNO2dCQUNuQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FB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R0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixTQUFTLENBQUMsR0FBRyxDQUFDO2dCQUNaLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUM3QyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDN0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQzdDLEdB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LEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDN0IsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlCLElBQUksS0FBSyxHQUFXLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLEtBQUssR0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBRTlCLElBQUksRUFBRSxHQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQ3JELENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUV6QyxJQUFJLEVBQUUsR0FBVyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNyRCxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxFQUFFLEdBQVcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztnQkFDdEQsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksRUFBRSxHQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7Z0JBQ3RELENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztZQUUxQyxJQUFJLENBQUMsR0FBVyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFbEUsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDUCxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU07Z0JBQ2QsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNO2dCQUNkLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTTtnQkFDZCxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU07Z0JBQ2QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFTLE1BQU07Z0JBQ3BHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBUyxNQUFNO2dCQUNwRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQU8sTUFBTTtnQkFDcEcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFPLE1BQU07Z0JBQ3BHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRyxNQUFNO2dCQUNwRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUcsTUFBTTtnQkFDcEcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFHLE9BQU87Z0JBQ3JHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRyxPQUFPO2dCQUNyRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUcsT0FBTztnQkFDckcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFHLE9BQU87Z0JBQ3JHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRyxPQUFPO2dCQUNyRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcs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Q0FBQyxDQUFDO2dCQUVyRyx5REFBeUQ7Z0JBQ3pELE1BQU0sRUFBRSxHQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLENBQUM7b0JBQ3ZCLENBQUMsQ0FBQyxHQUFHO29CQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sRUFBRSxHQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLENBQUM7b0JBQ3ZCLENBQUMsQ0FBQyxHQUFHO29CQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sRUFBRSxHQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLENBQUM7b0JBQ3ZCLENBQUMsQ0FBQyxHQUFHO29CQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sRUFBRSxHQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxFQUFFLEdBQVcsRUFBRSxHQUFHLENBQUM7b0JBQ3ZCLENBQUMsQ0FBQyxHQUFHO29CQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBRTdELG1FQUFtRTtnQkFDbkUsa0RBQWtEO2dCQUNsRCxPQUFPLGlCQUFpQixHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDO1FBQ0osQ0FBQzs7SUE3RlUsZ0JBQU0sU0FrR2xCLENBQUE7QUFDSCxDQUFDLEVBakhTLFNBQVMsS0FBVCxTQUFTLFFBaUhsQjtBQ2pIRCxJQUFVLFNBQVMsQ0E4SmxCO0FBOUpELFdBQVUsU0FBUztJQUNqQixhQUFhO0lBQ2I7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFhLE1BQU8sU0FBUSxVQUFBLEtBQUs7aUJBQ2hCLFdBQU0sR0FBVyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxBQUF4QyxDQUF5QztpQkFDL0MsYUFBUSxHQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEFBQS9mLENBQWdnQjtRQUN2aEIsT0FBTyxD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QUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxHQUFHLENBQUMsUUFBaUI7WUFDMUIsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQ7O1dBRUc7UUFDSSxRQUFRO1lBQ2IsSUFBSSxNQUFNLEdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3RHLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRDs7O1dBR0c7UUFDSSxHQUFHLENBQUMsU0FBNkU7WUFDdEYsSUFBSSxJQUFJLEdBQVksVUFBQSxR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REFBZ0Q7WUFDaEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFdkQsSUFBSSxXQUFXLEdBQUcsQ0FBQyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsVUFBQSxLQUFLLENBQUMsSUFBSSxDQUFDLDBGQUEwRixDQUFDLENBQUM7Z0JBQ3ZHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUVELElBQUksS0FBSyxHQUFjLEVBQUUsQ0FBQztZQUMxQixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQUEsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENB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Q0FBQyxDQUFDO3dCQUNyRCxJQUFJLFFBQVEsR0FBWSxVQUFBLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUVyRCw0QkFBNEI7d0JBQzVCLElBQUksQ0FBQyxHQUFXLENBQUMsR0FBRyxVQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUN0RCxJQUFJLFdBQVcsR0FBWSxVQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBQSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQUEsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQUEsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzVJLElBQUksYUFBYSxHQUFZLFVBQUEsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFBLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBQSxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQ0FBc0M7d0JBRXZMLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0QsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3RCxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMs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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlNN0MsQ0FBQztJQUNELFVBQUEsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBc0I1QyxDQUFDO0lBQ0QsVUFBQSxhQUFhLENBQUMsaUJBQWlCLENBQUMsR0FBRyxRQUFRLENBQUM7Ozs7Ozs7Ozs7RUFVNUMsQ0FBQztJQUNELFVBQUEsYUFBYSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTBCcEQsQ0FBQztJQUNELFVBQUEsYUFBYSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7RUFlcEQsQ0FBQztJQUNELFVBQUEsYUFBYSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWtEOUMsQ0FBQztJQUNELFVBQUEsYUFBYSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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RSxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUVEOztXQUVHO1FBQ0gsSUFBVyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQVcsS0FBSztZQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO1FBRUQ7O1dBRUc7UUFDSSxXQUFXO1lBQ2hCLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFFRDs7V0FFRztRQUNJLEtBQUs7WUFDVix5Q0FBeUM7WUFDekMsdUJBQXVCO1lBQ3ZCLHVFQUF1RTtZQUN2RSwyR0FBMkc7WUFDM0csb0NBQW9DO1lBQ3BDLElBQUk7WUFDSixPQUFPO1lBQ1Asa0hBQWtIO1lBQ2xILE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLENBQUM7S0FDRjtJQTdGWSxlQUFLLFFBNkZqQixDQUFBO0FBQ0gsQ0FBQyxFQTNHUyxTQUFTLEtBQVQsU0FBUyxRQTJHbEIiLCJzb3VyY2VzQ29udGVudCI6WyJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBCYXNlIGNsYXNzIGZvciB0aGUgZGlmZmVyZW50IERlYnVnVGFyZ2V0cywgbWFpbmx5IGZvciB0ZWNobmljYWwgcHVycG9zZSBvZiBpbmhlcml0YW5jZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICBwdWJsaWMgZGVsZWdhdGVzOiBNYXBEZWJ1Z0ZpbHRlclRvRGVsZWdhdGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXJnZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgc3RyaW5nLCBzZXBhcmF0ZWQgYnkgJywgJ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG1lcmdlQXJndW1lbnRzKF9tZXNzYWdlOiBPYmplY3QsIC4uLl9hcmdzOiBPYmplY3RbXSk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBvdXQ6IHN0cmluZyA9IF9tZXNzYWdlLnRvU3RyaW5nKCk7IC8vSlNPTi5zdHJpbmdpZnkoX21lc3NhZ2UpO1xyXG4gICAgICBmb3IgKGxldCBhcmcgb2YgX2FyZ3MpXHJcbiAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIE51bWJlcilcclxuICAgICAgICAgIG91dCArPSBcIiwgXCIgKyBhcmcudG9QcmVjaXNpb24oMikudG9TdHJpbmcoKTsgLy9KU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIG91dCArPSBcIiwgXCIgKyBhcmcudG9TdHJpbmcoKTsgLy9KU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpO1xyXG4gICAgICByZXR1cm4gb3V0O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnQWxlcnQudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBmaWx0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gZGVidWcgYWN0aXZpdGllcywgbW9yZSB0byBjb21lXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gREVCVUdfRklMVEVSIHtcclxuICAgIE5PTkUgPSAweDAwLFxyXG4gICAgSU5GTyA9IDB4MDEsXHJcbiAgICBMT0cgPSAweDAyLFxyXG4gICAgV0FSTiA9IDB4MDQsXHJcbiAgICBFUlJPUiA9IDB4MDgsXHJcbiAgICBGVURHRSA9IDB4MTAsXHJcbiAgICBDTEVBUiA9IDB4MTAwLFxyXG4gICAgR1JPVVAgPSAweDEwMSxcclxuICAgIEdST1VQQ09MTEFQU0VEID0gMHgxMDIsXHJcbiAgICBHUk9VUEVORCA9IDB4MTA0LFxyXG4gICAgU09VUkNFID0gMHgyMDAsXHJcbiAgICBNRVNTQUdFUyA9IElORk8gfCBMT0cgfCBXQVJOIHwgRVJST1IgfCBGVURHRSxcclxuICAgIEZPUk1BVCA9IENMRUFSIHwgR1JPVVAgfCBHUk9VUENPTExBUFNFRCB8IEdST1VQRU5ELFxyXG4gICAgQUxMID0gTUVTU0FHRVMgfCBGT1JNQVRcclxuICB9XHJcblxyXG4gIGV4cG9ydCBjb25zdCBERUJVR19TWU1CT0w6IHsgW2ZpbHRlcjogbnVtYmVyXTogc3RyaW5nIH0gPSB7XHJcbiAgICBbREVCVUdfRklMVEVSLklORk9dOiBcIuKck1wiLFxyXG4gICAgW0RFQlVHX0ZJTFRFUi5MT0ddOiBcIuKcjlwiLFxyXG4gICAgW0RFQlVHX0ZJTFRFUi5XQVJOXTogXCLimqBcIixcclxuICAgIFtERUJVR19GSUxURVIuRVJST1JdOiBcIuKdjFwiLFxyXG4gICAgW0RFQlVHX0ZJTFRFUi5GVURHRV06IFwi8J+OslwiLFxyXG4gICAgW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdOiBcIvCflJdcIlxyXG4gIH07XHJcblxyXG4gIGV4cG9ydCB0eXBlIE1hcERlYnVnVGFyZ2V0VG9EZWxlZ2F0ZSA9IE1hcDxEZWJ1Z1RhcmdldCwgRnVuY3Rpb24+O1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWFwRGVidWdGaWx0ZXJUb0RlbGVnYXRlIHsgW2ZpbHRlcjogbnVtYmVyXTogRnVuY3Rpb24gfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z1RhcmdldC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogUm91dGluZyB0byB0aGUgc3RhbmRhcmQtY29uc29sZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBEZWJ1Z0NvbnNvbGUgZXh0ZW5kcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGVnYXRlczogTWFwRGVidWdGaWx0ZXJUb0RlbGVnYXRlID0ge1xyXG4gICAgICBbREVCVUdfRklMVEVSLklORk9dOiBjb25zb2xlLmluZm8sXHJcbiAgICAgIFtERUJVR19GSUxURVIuTE9HXTogY29uc29sZS5sb2csXHJcbiAgICAgIFtERUJVR19GSUxURVIuV0FSTl06IGNvbnNvbGUud2FybixcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5FUlJPUl06IGNvbnNvbGUuZXJyb3IsXHJcbiAgICAgIFtERUJVR19GSUxURVIuRlVER0VdOiBEZWJ1Z0NvbnNvbGUuZnVkZ2UsXHJcbiAgICAgIFtERUJVR19GSUxURVIuQ0xFQVJdOiBjb25zb2xlLmNsZWFyLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkdST1VQXTogY29uc29sZS5ncm91cCxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5HUk9VUENPTExBUFNFRF06IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQsXHJcbiAgICAgIFtERUJVR19GSUxURVIuR1JPVVBFTkRdOiBjb25zb2xlLmdyb3VwRW5kLFxyXG4gICAgICBbREVCVUdfRklMVEVSLlNPVVJDRV06IERlYnVnQ29uc29sZS5zb3VyY2VcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG91bGQgYmUgdXNlZCB0byBkaXNwbGF5IHVuY3JpdGljYWwgc3RhdGUgaW5mb3JtYXRpb24gb2YgRlVER0UsIG9ubHkgdmlzaWJsZSBpbiBicm93c2VyJ3MgdmVyYm9zZSBtb2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZnVkZ2UoX21lc3NhZ2U6IE9iamVjdCwgLi4uX2FyZ3M6IE9iamVjdFtdKTogdm9pZCB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5GVURHRV0sIF9tZXNzYWdlLCAuLi5fYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwbGF5cyBhbiBleHRyYSBsaW5lIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiB0aGUgZGVidWcgbWVzc2FnZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNvdXJjZShfbWVzc2FnZTogT2JqZWN0LCAuLi5fYXJnczogT2JqZWN0W10pOiB2b2lkIHtcclxuICAgICAgY29uc29sZS5sb2coREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdLCBfbWVzc2FnZSwgLi4uX2FyZ3MpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiRGVidWdUYXJnZXQudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z0ludGVyZmFjZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Z0NvbnNvbGUudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBEZWJ1Zy1DbGFzcyBvZmZlcnMgZnVuY3Rpb25zIGtub3duIGZyb20gdGhlIGNvbnNvbGUtb2JqZWN0IGFuZCBhZGRpdGlvbnMsIFxyXG4gICAqIHJvdXRpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHZhcmlvdXMge0BsaW5rIERlYnVnVGFyZ2V0fXMgdGhhdCBjYW4gYmUgZWFzaWx5IGRlZmluZWQgYnkgdGhlIGRldmVsb3BlcnMgYW5kIHJlZ2lzdGVyZCBieSB1c2Vyc1xyXG4gICAqIE92ZXJyaWRlIGZ1bmN0aW9ucyBpbiBzdWJjbGFzc2VzIG9mIHtAbGluayBEZWJ1Z1RhcmdldH0gYW5kIHJlZ2lzdGVyIHRoZW0gYXMgdGhlaXIgZGVsZWdhdGVzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIERlYnVnIHtcclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggc2V0IGZpbHRlciwgdGhpcyBhc3NvY2lhdGl2ZSBhcnJheSBrZWVwcyByZWZlcmVuY2VzIHRvIHRoZSByZWdpc3RlcmVkIGRlbGVnYXRlIGZ1bmN0aW9ucyBvZiB0aGUgY2hvc2VuIHtAbGluayBEZWJ1Z1RhcmdldH1zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGRlbGVnYXRlczogeyBbZmlsdGVyOiBudW1iZXJdOiBNYXBEZWJ1Z1RhcmdldFRvRGVsZWdhdGUgfSA9IERlYnVnLnNldHVwQ29uc29sZSgpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGUtIC8gQWN0aXZhdGUgYSBmaWx0ZXIgZm9yIHRoZSBnaXZlbiBEZWJ1Z1RhcmdldC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0RmlsdGVyKF90YXJnZXQ6IERlYnVnVGFyZ2V0LCBfZmlsdGVyOiBERUJVR19GSUxURVIpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgZmlsdGVyIGluIERlYnVnLmRlbGVnYXRlcylcclxuICAgICAgICBEZWJ1Zy5kZWxlZ2F0ZXNbZmlsdGVyXS5kZWxldGUoX3RhcmdldCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBmaWx0ZXIgaW4gREVCVUdfRklMVEVSKSB7XHJcbiAgICAgICAgbGV0IHBhcnNlZDogbnVtYmVyID0gcGFyc2VJbnQoZmlsdGVyKTtcclxuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGlmIChbREVCVUdfRklMVEVSLk1FU1NBR0VTLCBERUJVR19GSUxURVIuRk9STUFULCBERUJVR19GSUxURVIuQUxMXS5pbmRleE9mKHBhcnNlZCkgIT0gLTEpXHJcbiAgICAgICAgICAvLyBkb250IGRlbGVnYXRlIGNvbWJvcy4uLiBcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmIChfZmlsdGVyICYgcGFyc2VkKVxyXG4gICAgICAgICAgRGVidWcuZGVsZWdhdGVzW3BhcnNlZF0uc2V0KF90YXJnZXQsIF90YXJnZXQuZGVsZWdhdGVzW3BhcnNlZF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGZpbHRlcihzKSBmb3IgdGhlIGdpdmVuIERlYnVnVGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWx0ZXIoX3RhcmdldDogRGVidWdUYXJnZXQpOiBERUJVR19GSUxURVIge1xyXG4gICAgICBsZXQgcmVzdWx0OiBERUJVR19GSUxURVIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBmaWx0ZXIgaW4gX3RhcmdldC5kZWxlZ2F0ZXMpXHJcbiAgICAgICAgcmVzdWx0IHw9IHBhcnNlSW50KGZpbHRlcik7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBmaWx0ZXIgdG8gdGhlIGdpdmVuIERlYnVnVGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhZGRGaWx0ZXIoX3RhcmdldDogRGVidWdUYXJnZXQsIF9maWx0ZXI6IERFQlVHX0ZJTFRFUik6IHZvaWQge1xyXG4gICAgICBsZXQgY3VycmVudDogREVCVUdfRklMVEVSID0gRGVidWcuZ2V0RmlsdGVyKF90YXJnZXQpO1xyXG4gICAgICBEZWJ1Zy5zZXRGaWx0ZXIoX3RhcmdldCwgY3VycmVudCB8IF9maWx0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGEgZmlsdGVyIGZyb20gdGhlIGdpdmVuIERlYnVnVGFyZ2V0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUZpbHRlcihfdGFyZ2V0OiBEZWJ1Z1RhcmdldCwgX2ZpbHRlcjogREVCVUdfRklMVEVSKTogdm9pZCB7XHJcbiAgICAgIGxldCBjdXJyZW50OiBERUJVR19GSUxURVIgPSBEZWJ1Zy5nZXRGaWx0ZXIoX3RhcmdldCk7XHJcbiAgICAgIERlYnVnLnNldEZpbHRlcihfdGFyZ2V0LCBjdXJyZW50IF4gX2ZpbHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmZvKC4uLikgZGlzcGxheXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aXRoIGxvdyBwcmlvcml0eVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGluZm8oX21lc3NhZ2U6IHVua25vd24sIC4uLl9hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLklORk8sIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIGluZm9ybWF0aW9uIHdpdGggbWVkaXVtIHByaW9yaXR5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgbG9nKF9tZXNzYWdlOiB1bmtub3duLCAuLi5fYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmRlbGVnYXRlKERFQlVHX0ZJTFRFUi5MT0csIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IG5vbi1jb25mb3JtaXRpZXMgaW4gdXNhZ2UsIHdoaWNoIGlzIGVtcGhhc2l6ZWQgZS5nLiBieSBjb2xvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHdhcm4oX21lc3NhZ2U6IHVua25vd24sIC4uLl9hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLldBUk4sIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIGNyaXRpY2FsIGluZm9ybWF0aW9uIGFib3V0IGZhaWx1cmVzLCB3aGljaCBpcyBlbXBoYXNpemVkIGUuZy4gYnkgY29sb3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihfbWVzc2FnZTogdW5rbm93biwgLi4uX2FyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuRVJST1IsIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXlzIG1lc3NhZ2VzIGZyb20gRlVER0VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBmdWRnZShfbWVzc2FnZTogdW5rbm93biwgLi4uX2FyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICBEZWJ1Zy5kZWxlZ2F0ZShERUJVR19GSUxURVIuRlVER0UsIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgb3V0cHV0IGFuZCByZW1vdmVzIHByZXZpb3VzIG1lc3NhZ2VzIGlmIHBvc3NpYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmRlbGVnYXRlKERFQlVHX0ZJTFRFUi5DTEVBUiwgbnVsbCwgbnVsbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9wZW5zIGEgbmV3IGdyb3VwIGZvciBtZXNzYWdlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdyb3VwKF9uYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLkdST1VQLCBfbmFtZSwgbnVsbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9wZW5zIGEgbmV3IGdyb3VwIGZvciBtZXNzYWdlcyB0aGF0IGlzIGNvbGxhcHNlZCBhdCBmaXJzdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdyb3VwQ29sbGFwc2VkKF9uYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLkdST1VQQ09MTEFQU0VELCBfbmFtZSwgbnVsbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENsb3NlcyB0aGUgeW91bmdlc3QgZ3JvdXBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBncm91cEVuZCgpOiB2b2lkIHtcclxuICAgICAgRGVidWcuZGVsZWdhdGUoREVCVUdfRklMVEVSLkdST1VQRU5ELCBudWxsLCBudWxsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTG9nIGEgYnJhbmNoIG9mIHRoZSBub2RlIGhpZXJhcmNoeVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGJyYW5jaChfYnJhbmNoOiBOb2RlKTogdm9pZCB7XHJcbiAgICAgIGlmIChfYnJhbmNoLm5DaGlsZHJlbiA+IDApXHJcbiAgICAgICAgRGVidWcuZ3JvdXAoX2JyYW5jaC5uYW1lKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIERlYnVnLmZ1ZGdlKF9icmFuY2gubmFtZSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBfYnJhbmNoLmdldENoaWxkcmVuKCkpIERlYnVnLmJyYW5jaChjaGlsZCk7XHJcblxyXG4gICAgICBpZiAoX2JyYW5jaC5uQ2hpbGRyZW4gPiAwKVxyXG4gICAgICAgIERlYnVnLmdyb3VwRW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwbGF5cyBtZXNzYWdlcyBhYm91dCB0aGUgc291cmNlIG9mIHRoZSBkZWJ1ZyBjYWxsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc291cmNlKF9tZXNzYWdlOiB1bmtub3duLCAuLi5fYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgIERlYnVnLmRlbGVnYXRlKERFQlVHX0ZJTFRFUi5TT1VSQ0UsIF9tZXNzYWdlLCBfYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb29rdXAgYWxsIGRlbGVnYXRlcyByZWdpc3RlcmVkIHRvIHRoZSBmaWx0ZXIgYW5kIGNhbGwgdGhlbSB1c2luZyB0aGUgZ2l2ZW4gYXJndW1lbnRzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGRlbGVnYXRlKF9maWx0ZXI6IERFQlVHX0ZJTFRFUiwgX21lc3NhZ2U6IHVua25vd24sIF9hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgaWYgKF9maWx0ZXIgPT0gREVCVUdfRklMVEVSLkxPRyB8fCBfZmlsdGVyID09IERFQlVHX0ZJTFRFUi5XQVJOIHx8IF9maWx0ZXIgPT0gREVCVUdfRklMVEVSLkVSUk9SKSB7XHJcbiAgICAgICAgaWYgKERlYnVnLmRlbGVnYXRlc1tERUJVR19GSUxURVIuU09VUkNFXSlcclxuICAgICAgICAgIGZvciAobGV0IGRlbGVnYXRlIG9mIERlYnVnLmRlbGVnYXRlc1tERUJVR19GSUxURVIuU09VUkNFXS52YWx1ZXMoKSlcclxuICAgICAgICAgICAgaWYgKGRlbGVnYXRlKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRyYWNlOiBzdHJpbmdbXSA9IG5ldyBFcnJvcihcIlRlc3RcIikuc3RhY2suc3BsaXQoXCJcXG5cIik7XHJcbiAgICAgICAgICAgICAgZGVsZWdhdGUodHJhY2VbM10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGRlbGVnYXRlczogTWFwRGVidWdUYXJnZXRUb0RlbGVnYXRlID0gRGVidWcuZGVsZWdhdGVzW19maWx0ZXJdO1xyXG4gICAgICBmb3IgKGxldCBkZWxlZ2F0ZSBvZiBkZWxlZ2F0ZXMudmFsdWVzKCkpXHJcbiAgICAgICAgaWYgKGRlbGVnYXRlKVxyXG4gICAgICAgICAgaWYgKF9hcmdzICYmIF9hcmdzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIGRlbGVnYXRlKF9tZXNzYWdlLCAuLi5fYXJncyk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGRlbGVnYXRlKF9tZXNzYWdlKTtcclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHNldHVwIHJvdXRpbmcgdG8gc3RhbmRhcmQgY29uc29sZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBzZXR1cENvbnNvbGUoKToge30ge1xyXG4gICAgICBsZXQgcmVzdWx0OiB7IFtmaWx0ZXI6IG51bWJlcl06IE1hcERlYnVnVGFyZ2V0VG9EZWxlZ2F0ZSB9ID0ge307XHJcbiAgICAgIGxldCBmaWx0ZXJzOiBERUJVR19GSUxURVJbXSA9IFtcclxuICAgICAgICBERUJVR19GSUxURVIuSU5GTywgREVCVUdfRklMVEVSLkxPRywgREVCVUdfRklMVEVSLldBUk4sIERFQlVHX0ZJTFRFUi5FUlJPUiwgREVCVUdfRklMVEVSLkZVREdFLFxyXG4gICAgICAgIERFQlVHX0ZJTFRFUi5DTEVBUiwgREVCVUdfRklMVEVSLkdST1VQLCBERUJVR19GSUxURVIuR1JPVVBDT0xMQVBTRUQsIERFQlVHX0ZJTFRFUi5HUk9VUEVORCxcclxuICAgICAgICBERUJVR19GSUxURVIuU09VUkNFXHJcbiAgICAgIF07XHJcblxyXG4gICAgICBmb3IgKGxldCBmaWx0ZXIgb2YgZmlsdGVycylcclxuICAgICAgICByZXN1bHRbZmlsdGVyXSA9IG5ldyBNYXAoW1tEZWJ1Z0NvbnNvbGUsIERlYnVnQ29uc29sZS5kZWxlZ2F0ZXNbZmlsdGVyXV1dKTtcclxuXHJcbiAgICAgIHJlc3VsdFtERUJVR19GSUxURVIuU09VUkNFXS5kZWxldGUoRGVidWdDb25zb2xlKTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGludGVyZmFjZSBNYXBFdmVudFR5cGVUb0xpc3RlbmVyIHtcclxuICAgIFtldmVudFR5cGU6IHN0cmluZ106IEV2ZW50TGlzdGVuZXJVbmlmaWVkW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUeXBlcyBvZiBldmVudHMgc3BlY2lmaWMgdG8gRlVER0UsIGluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBET00vQnJvd3Nlci1UeXBlcyBhbmQgY3VzdG9tIHN0cmluZ3NcclxuICAgKi9cclxuICBleHBvcnQgY29uc3QgZW51bSBFVkVOVCB7XHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB0YXJnZXRzIHJlZ2lzdGVyZWQgYXQge0BsaW5rIExvb3B9LCB3aGVuIHJlcXVlc3RlZCBhbmltYXRpb24gZnJhbWUgc3RhcnRzICovXHJcbiAgICBMT09QX0ZSQU1FID0gXCJsb29wRnJhbWVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEge0BsaW5rIENvbXBvbmVudH0gd2hlbiBpdHMgYmVpbmcgYWRkZWQgdG8gYSB7QGxpbmsgTm9kZX0gKi9cclxuICAgIENPTVBPTkVOVF9BREQgPSBcImNvbXBvbmVudEFkZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgQ29tcG9uZW50fSB3aGVuIGl0cyBiZWluZyByZW1vdmVkIGZyb20gYSB7QGxpbmsgTm9kZX0gKi9cclxuICAgIENPTVBPTkVOVF9SRU1PVkUgPSBcImNvbXBvbmVudFJlbW92ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSB7QGxpbmsgQ29tcG9uZW50fSB3aGVuIGl0cyBiZWluZyBhY3RpdmF0ZWQgKi9cclxuICAgIENPTVBPTkVOVF9BQ1RJVkFURSA9IFwiY29tcG9uZW50QWN0aXZhdGVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEge0BsaW5rIENvbXBvbmVudH0gd2hlbiBpdHMgYmVpbmcgZGVhY3RpdmF0ZWQgKi9cclxuICAgIENPTVBPTkVOVF9ERUFDVElWQVRFID0gXCJjb21wb25lbnREZWFjdGl2YXRlXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIHtAbGluayBOb2RlfSwgaXQncyBzdWNjZXNzb3JzIGFuZCBhbmNlc3RvcnMgd2hlbiBpdHMgYmVpbmcgYWN0aXZhdGVkICovXHJcbiAgICBOT0RFX0FDVElWQVRFID0gXCJub2RlQWN0aXZhdGVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEge0BsaW5rIE5vZGV9LCBpdCdzIHN1Y2Nlc3NvcnMgYW5kIGFuY2VzdG9ycyB3aGVuIGl0cyBiZWluZyBkZWFjdGl2YXRlZCAqL1xyXG4gICAgTk9ERV9ERUFDVElWQVRFID0gXCJub2RlRGVhY3RpdmF0ZVwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8gYSBjaGlsZCB7QGxpbmsgTm9kZX0gYW5kIGl0cyBhbmNlc3RvcnMgYWZ0ZXIgaXQgd2FzIGFwcGVuZGVkIHRvIGEgcGFyZW50ICovXHJcbiAgICBDSElMRF9BUFBFTkQgPSBcImNoaWxkQXBwZW5kXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIGNoaWxkIHtAbGluayBOb2RlfSBhbmQgaXRzIGFuY2VzdG9ycyBqdXN0IGJlZm9yZSBpdHMgYmVpbmcgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgKi9cclxuICAgIENISUxEX1JFTU9WRSA9IFwiY2hpbGRSZW1vdmVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIGEge0BsaW5rIE11dGFibGV9IHdoZW4gaXQgbXV0YXRlcyAqL1xyXG4gICAgTVVUQVRFID0gXCJtdXRhdGVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIGJ5IGEge0BsaW5rIEdyYXBofSB3aGVuIGl0IG11dGF0ZXMsIHtAbGluayBHcmFwaEluc3RhbmNlfXMgY29ubmVjdGVkIHRvIHRoZSBncmFwaCBsaXN0ZW4gKi9cclxuICAgIE1VVEFURV9HUkFQSCA9IFwibXV0YXRlR3JhcGhcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIGJ5IGEge0BsaW5rIEdyYXBoSW5zdGFuY2V9IHdoZW4gaXQgcmVmbGVjdGVkIHRoZSBtdXRhdGlvbiBvZiB0aGUge0BsaW5rIEdyYXBofSBpdCdzIGNvbm5lY3RlZCB0byAqL1xyXG4gICAgTVVUQVRFX0lOU1RBTkNFID0gXCJtdXRhdGVHcmFwaERvbmVcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBWaWV3cG9ydH0gd2hlbiBpdCBnZXRzIHRoZSBmb2N1cyB0byByZWNlaXZlIGtleWJvYXJkIGlucHV0ICovXHJcbiAgICBGT0NVU19JTiA9IFwiZm9jdXNpblwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFZpZXdwb3J0fSB3aGVuIGl0IGxvc2VzIHRoZSBmb2N1cyB0byByZWNlaXZlIGtleWJvYXJkIGlucHV0ICovXHJcbiAgICBGT0NVU19PVVQgPSBcImZvY3Vzb3V0XCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgTm9kZX0gd2hlbiBpdCdzIGRvbmUgc2VyaWFsaXppbmcgKi9cclxuICAgIE5PREVfU0VSSUFMSVpFRCA9IFwibm9kZVNlcmlhbGl6ZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBOb2RlfSBhbmQgYWxsIGl0cyB7QGxpbmsgQ29tcG9uZW50fXMgd2hlbiBpdCdzIGRvbmUgZGVzZXJpYWxpemluZywgc28gYWxsIGNvbXBvbmVudHMsIGNoaWxkcmVuIGFuZCBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgKi9cclxuICAgIE5PREVfREVTRVJJQUxJWkVEID0gXCJub2RlRGVzZXJpYWxpemVkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgR3JhcGhJbnN0YW5jZX0gd2hlbiBpdCdzIGNvbnRlbnQgaXMgc2V0IGFjY29yZGluZyB0byBhIHNlcmlhbGl6YXRpb24gb2YgYSB7QGxpbmsgR3JhcGh9LiBCcm9hZGNhc3RlZCwgc28gbmVlZHMgdG8gYmUgY2F1Z2h0IGluIGNhcHR1cmUuICovXHJcbiAgICBHUkFQSF9JTlNUQU5USUFURUQgPSBcImdyYXBoSW5zdGFudGlhdGVkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byBhIHtAbGluayBHcmFwaH0gd2hlbiBpdCdzIGZpbmlzaGVkIGRlc2VyaWFsaXppbmcuIEJyb2FkY2FzdGVkLCBzbyBuZWVkcyB0byBiZSBjYXVnaHQgaW4gY2FwdHVyZS4gKi9cclxuICAgIEdSQVBIX0RFU0VSSUFMSVpFRCA9IFwiZ3JhcGhEZXNlcmlhbGl6ZWRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIGJ5IGEge0BsaW5rIEdyYXBofSB3aGVuIGl0IGFuZCBpdHMgY29ubmVjdGVkIGluc3RhbmNlcyBoYXZlIGZpbmlzaGVkIG11dGF0aW5nICAqL1xyXG4gICAgR1JBUEhfTVVUQVRFRCA9IFwiZ3JhcGhNdXRhdGVkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgVGltZX0gd2hlbiBpdCdzIHNjYWxpbmcgY2hhbmdlZCAgKi9cclxuICAgIFRJTUVfU0NBTEVEID0gXCJ0aW1lU2NhbGVkXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgRmlsZUlvQnJvd3NlckxvY2FsfSB3aGVuIGEgbGlzdCBvZiBmaWxlcyBoYXMgYmVlbiBsb2FkZWQgICovXHJcbiAgICBGSUxFX0xPQURFRCA9IFwiZmlsZUxvYWRlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIEZpbGVJb0Jyb3dzZXJMb2NhbH0gd2hlbiBhIGxpc3Qgb2YgZmlsZXMgaGFzIGJlZW4gc2F2ZWQgKi9cclxuICAgIEZJTEVfU0FWRUQgPSBcImZpbGVTYXZlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIE5vZGV9IHdoZW4gcmVjYWxjdWxhdGluZyB0cmFuc2Zvcm1zIGZvciByZW5kZXIgKi9cclxuICAgIFJFTkRFUl9QUkVQQVJFID0gXCJyZW5kZXJQcmVwYXJlXCIsXHJcbiAgICAvKiogZGlzcGF0Y2hlZCB0byB7QGxpbmsgVmlld3BvcnR9IGFuZCB7QGxpbmsgTm9kZX0gd2hlbiByZWNhbGN1bGF0aW9uIG9mIHRoZSBicmFuY2ggdG8gcmVuZGVyIHN0YXJ0cy4gKi9cclxuICAgIFJFTkRFUl9QUkVQQVJFX1NUQVJUID0gXCJyZW5kZXJQcmVwYXJlU3RhcnRcIixcclxuICAgIC8qKiBkaXNwYXRjaGVkIHRvIHtAbGluayBWaWV3cG9ydH0gYW5kIHtAbGluayBOb2RlfSB3aGVuIHJlY2FsY3VsYXRpb24gb2YgdGhlIGJyYW5jaCB0byByZW5kZXIgZW5kcy4gVGhlIGJyYW5jaCBkaXNwYXRjaGVzIGJlZm9yZSB0aGUgbGlnaHRzIGFyZSB0cmFuc21pdHRlZCB0byB0aGUgc2hhZGVycyAgKi9cclxuICAgIFJFTkRFUl9QUkVQQVJFX0VORCA9IFwicmVuZGVyUHJlcGFyZUVuZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFZpZXdwb3J0fSBhdCB0aGUgZW5kIG9mIGEgcmVuZGVyZWQgZnJhbWUgcmlnaHQgYmVmb3JlIGl0IGdldHMgZGlzcGxheWVkLiBBdCB0aGlzIHBvaW50IHtAbGluayBHaXptb3N9IGNhbiBzdGlsbCBiZSBkcmF3bi4gKi9cclxuICAgIFJFTkRFUl9FTkQgPSBcInJlbmRlckVuZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIEpvaW50fS1Db21wb25lbnRzIGluIG9yZGVyIHRvIGRpc2Nvbm5lY3QgKi9cclxuICAgIERJU0NPTk5FQ1RfSk9JTlQgPSBcImRpc2Nvbm5lY3RKb2ludFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIE5vZGV9IHdoZW4gaXQgZ2V0cyBhdHRhY2hlZCB0byBhIHZpZXdwb3J0IGZvciByZW5kZXJpbmcuIEJyb2FkY2FzdGVkLCBzbyBuZWVkcyB0byBiZSBjYXVnaHQgaW4gY2FwdHVyZS4gKi9cclxuICAgIEFUVEFDSF9CUkFOQ0ggPSBcImF0dGFjaEJyYW5jaFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIFByb2plY3R9IHdoZW4gaXQncyBkb25lIGxvYWRpbmcgcmVzb3VyY2VzIGZyb20gYSB1cmwgKi9cclxuICAgIFJFU09VUkNFU19MT0FERUQgPSBcInJlc291cmNlc0xvYWRlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIENvbXBvbmVudFdhbGtlcn0gYW5kIHtAbGluayBDb21wb25lbnRXYXlwb2ludH0gd2hlbiBhIHtAbGluayBDb21wb25lbnRXYWxrZXJ9IHJlYWNoZXMgYSB7QGxpbmsgV2F5cG9pbnR9IG9yIHtAbGluayBDb21wb25lbnRXYXlwb2ludH0gKi9cclxuICAgIFdBWVBPSU5UX1JFQUNIRUQgPSBcIndheXBvaW50UmVhY2hlZFwiLFxyXG4gICAgLyoqIGRpc3BhdGNoZWQgdG8ge0BsaW5rIENvbXBvbmVudFdhbGtlcn0gd2hlbiB0aGUgZmluYWwge0BsaW5rIFdheXBvaW50fSBpbiB0aGUgY3VycmVudCBwYXRoIGhhcyBiZWVuIHJlYWNoZWQgKi9cclxuICAgIFBBVEhJTkdfQ09OQ0xVREVEID0gXCJwYXRoaW5nQ29uY2x1ZGVkXCJcclxuICB9XHJcblxyXG4gIC8qKiBVbmlvbiB0eXBlIG9mIG90aGVyIGV2ZW50IHR5cGVzIHNlcnZpbmcgYXMgYW5ub3RhdGlvbiBmb3IgbGlzdGVuZXJzIGFuZCBoYW5kbGVycyAqL1xyXG4gIGV4cG9ydCB0eXBlIEV2ZW50VW5pZmllZCA9IEV2ZW50IHwgQ3VzdG9tRXZlbnQgfCBFdmVudFBoeXNpY3M7XHJcblxyXG4gIC8qKiBVbmlmaWVkIGxpc3RlbmVyIHR5cGUgZXh0ZW5kaW5nIEV2ZW50TGlzdGVuZXIgYW5kIEV2ZW50TGlzdGVuZXJPYmplY3QgZm9yIEN1c3RvbUV2ZW50IGFuZCBvdGhlcnMgKi9cclxuICBleHBvcnQgdHlwZSBFdmVudExpc3RlbmVyVW5pZmllZCA9XHJcbiAgICAoKF9ldmVudDogRXZlbnQpID0+IHZvaWQpIHxcclxuICAgICgoX2V2ZW50OiBDdXN0b21FdmVudCkgPT4gdm9pZCkgfFxyXG4gICAgKChfZXZlbnQ6IEV2ZW50UGh5c2ljcykgPT4gdm9pZCkgfFxyXG4gICAgKChfZXZlbnQ6IEV2ZW50VGltZXIpID0+IHZvaWQpIHxcclxuICAgIEV2ZW50TGlzdGVuZXIgfFxyXG4gICAgRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdDtcclxuXHJcbiAgLyoqIEV4dGVuZHMgRXZlbnRUYXJnZXQgdG8gd29yayB3aXRoIHtAbGluayBFdmVudExpc3RlbmVyVW5pZmllZH0gYW5kIHtAbGluayBFdmVudFVuaWZpZWR9ICovXHJcbiAgZXhwb3J0IGNsYXNzIEV2ZW50VGFyZ2V0VW5pZmllZCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcclxuICAgIC8qKlxyXG4gICAgICogU2VlIHtAbGluayBFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyfSBmb3IgcmVmZXJlbmNlLiBXb3JrcyB3aXRoIHtAbGluayBFdmVudExpc3RlbmVyVW5pZmllZH0gYW5kIHtAbGluayBFdmVudFVuaWZpZWR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKF90eXBlOiBzdHJpbmcsIF9oYW5kbGVyOiBFdmVudExpc3RlbmVyVW5pZmllZCwgX29wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkIHtcclxuICAgICAgc3VwZXIuYWRkRXZlbnRMaXN0ZW5lcihfdHlwZSwgPEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3Q+X2hhbmRsZXIsIF9vcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlZSB7QGxpbmsgRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcn0gZm9yIHJlZmVyZW5jZS4gV29ya3Mgd2l0aCB7QGxpbmsgRXZlbnRMaXN0ZW5lclVuaWZpZWR9IGFuZCB7QGxpbmsgRXZlbnRVbmlmaWVkfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihfdHlwZTogc3RyaW5nLCBfaGFuZGxlcjogRXZlbnRMaXN0ZW5lclVuaWZpZWQsIF9vcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoX3R5cGUsIDxFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0Pl9oYW5kbGVyLCBfb3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWUge0BsaW5rIEV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnR9IGZvciByZWZlcmVuY2UuIFdvcmtzIHdpdGggd2l0aCB7QGxpbmsgRXZlbnRVbmlmaWVkfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcGF0Y2hFdmVudChfZXZlbnQ6IEV2ZW50VW5pZmllZCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChfZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZSBjbGFzcyBmb3IgRXZlbnRUYXJnZXQgc2luZ2xldG9ucywgd2hpY2ggYXJlIGZpeGVkIGVudGl0aWVzIGluIHRoZSBzdHJ1Y3R1cmUgb2YgRlVER0UsIHN1Y2ggYXMgdGhlIGNvcmUgbG9vcCBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRXZlbnRUYXJnZXRTdGF0aWMgZXh0ZW5kcyBFdmVudFRhcmdldFVuaWZpZWQge1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB0YXJnZXRTdGF0aWM6IEV2ZW50VGFyZ2V0U3RhdGljID0gbmV3IEV2ZW50VGFyZ2V0U3RhdGljKCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHtAbGluayB0YXJnZXRTdGF0aWN9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZEV2ZW50TGlzdGVuZXIoX3R5cGU6IHN0cmluZywgX2hhbmRsZXI6IEV2ZW50TGlzdGVuZXIpOiB2b2lkIHtcclxuICAgICAgRXZlbnRUYXJnZXRTdGF0aWMudGFyZ2V0U3RhdGljLmFkZEV2ZW50TGlzdGVuZXIoX3R5cGUsIF9oYW5kbGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBmcm9tIHtAbGluayB0YXJnZXRTdGF0aWN9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoX3R5cGU6IHN0cmluZywgX2hhbmRsZXI6IEV2ZW50TGlzdGVuZXIpOiB2b2lkIHtcclxuICAgICAgRXZlbnRUYXJnZXRTdGF0aWMudGFyZ2V0U3RhdGljLnJlbW92ZUV2ZW50TGlzdGVuZXIoX3R5cGUsIF9oYW5kbGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BhdGNoIGFuIGV2ZW50IG9uIHtAbGluayB0YXJnZXRTdGF0aWN9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRpc3BhdGNoRXZlbnQoX2V2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICBFdmVudFRhcmdldFN0YXRpYy50YXJnZXRTdGF0aWMuZGlzcGF0Y2hFdmVudChfZXZlbnQpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgZGF0YXR5cGVzIG9mIHRoZSBhdHRyaWJ1dGVzIGEgbXV0YXRvciBhcyBzdHJpbmdzIFxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgIFthdHRyaWJ1dGU6IHN0cmluZ106IHN0cmluZyB8IE9iamVjdDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIGRlc2NyaWJpbmcgYSBtdXRhdG9yLCB3aGljaCBpcyBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIG5hbWVzIG9mIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBNdXRhdG9yIHtcclxuICAgIFthdHRyaWJ1dGU6IHN0cmluZ106IEdlbmVyYWw7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEludGVyZmFjZXMgZGVkaWNhdGVkIGZvciBlYWNoIHB1cnBvc2UuIEV4dHJhIGF0dHJpYnV0ZSBuZWNlc3NhcnkgZm9yIGNvbXBpbGV0aW1lIHR5cGUgY2hlY2tpbmcsIG5vdCBleGlzdGVudCBhdCBydW50aW1lXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBNdXRhdG9yRm9yQW5pbWF0aW9uIGV4dGVuZHMgTXV0YXRvciB7IHJlYWRvbmx5IGZvckFuaW1hdGlvbjogbnVsbCB9XHJcbiAgZXhwb3J0IGludGVyZmFjZSBNdXRhdG9yRm9yVXNlckludGVyZmFjZSBleHRlbmRzIE11dGF0b3IgeyByZWFkb25seSBmb3JVc2VySW50ZXJmYWNlOiBudWxsIH1cclxuICAvLyBleHBvcnQgaW50ZXJmYWNlIE11dGF0b3JGb3JDb21wb25lbnQgZXh0ZW5kcyBNdXRhdG9yIHsgcmVhZG9ubHkgZm9yVXNlckNvbXBvbmVudDogbnVsbDsgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsZWN0IGFwcGxpY2FibGUgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UgYW5kIGNvcGllcyBvZiB0aGVpciB2YWx1ZXMgaW4gYSBNdXRhdG9yLW9iamVjdFxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNdXRhdG9yT2ZBcmJpdHJhcnkoX29iamVjdDogT2JqZWN0KTogTXV0YXRvciB7XHJcbiAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHt9O1xyXG4gICAgbGV0IGF0dHJpYnV0ZXM6IChzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wpW10gPSBSZWZsZWN0Lm93bktleXMoUmVmbGVjdC5nZXRQcm90b3R5cGVPZihfb2JqZWN0KSk7XHJcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xyXG4gICAgICBsZXQgdmFsdWU6IE9iamVjdCA9IFJlZmxlY3QuZ2V0KF9vYmplY3QsIGF0dHJpYnV0ZSk7XHJcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAvLyBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGUpKVxyXG4gICAgICAvLyAgIGNvbnRpbnVlO1xyXG4gICAgICBtdXRhdG9yW2F0dHJpYnV0ZS50b1N0cmluZygpXSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXNlIGNsYXNzIGZvciBhbGwgdHlwZXMgYmVpbmcgbXV0YWJsZSB1c2luZyB7QGxpbmsgTXV0YXRvcn0tb2JqZWN0cywgdGh1cyBwcm92aWRpbmcgYW5kIHVzaW5nIGludGVyZmFjZXMgY3JlYXRlZCBhdCBydW50aW1lLiAgXHJcbiAgICogTXV0YWJsZXMgcHJvdmlkZSBhIHtAbGluayBNdXRhdG9yfSB0aGF0IGlzIGJ1aWxkIGJ5IGNvbGxlY3RpbmcgYWxsIG9iamVjdC1wcm9wZXJ0aWVzIHRoYXQgYXJlIGVpdGhlciBvZiBhIHByaW1pdGl2ZSB0eXBlIG9yIGFnYWluIE11dGFibGUuXHJcbiAgICogU3ViY2xhc3NlcyBjYW4gZWl0aGVyIHJlZHVjZSB0aGUgc3RhbmRhcmQge0BsaW5rIE11dGF0b3J9IGJ1aWx0IGJ5IHRoaXMgYmFzZSBjbGFzcyBieSBkZWxldGluZyBwcm9wZXJ0aWVzIG9yIGltcGxlbWVudCBhbiBpbmRpdmlkdWFsIGdldE11dGF0b3ItbWV0aG9kLlxyXG4gICAqIFRoZSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9mIHRoZSB7QGxpbmsgTXV0YXRvcn0gbXVzdCBtYXRjaCBwdWJsaWMgcHJvcGVydGllcyBvciBnZXR0ZXJzL3NldHRlcnMgb2YgdGhlIG9iamVjdC5cclxuICAgKiBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBpZ25vcmVkIGlmIG5vdCBoYW5kbGVkIGJ5IGFuIG92ZXJyaWRlIG9mIHRoZSBtdXRhdGUtbWV0aG9kIGluIHRoZSBzdWJjbGFzcyBhbmQgdGhyb3cgZXJyb3JzIGluIGFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHVzZXItaW50ZXJmYWNlIGZvciB0aGUgb2JqZWN0LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNdXRhYmxlIGV4dGVuZHMgRXZlbnRUYXJnZXRVbmlmaWVkIHtcclxuICAgIC8qKlxyXG4gICAgICogRGVjb3JhdG9yIGFsbG93cyB0byBhdHRhY2gge0BsaW5rIE11dGFibGV9IGZ1bmN0aW9uYWxpdHkgdG8gZXhpc3RpbmcgY2xhc3Nlcy4gXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgZGVjb3JhdGUoX2NvbnN0cnVjdG9yOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgLy8gICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJ1c2VSZW5kZXJEYXRhXCIsIHtcclxuICAgIC8vICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TXV0YXRvcih0aGlzOiBNdXRhYmxlRm9yVXNlckludGVyZmFjZSk6IE11dGF0b3Ige1xyXG4gICAgLy8gICAgICAgcmV0dXJuIGdldE11dGF0b3JPZkFyYml0cmFyeSh0aGlzKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TXV0YXRvckZyb21QYXRoKF9tdXRhdG9yOiBNdXRhdG9yLCBfcGF0aDogc3RyaW5nW10pOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IGtleTogc3RyaW5nID0gX3BhdGhbMF07XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge307XHJcbiAgICAgIGlmIChfbXV0YXRvcltrZXldID09IHVuZGVmaW5lZCkgLy8gaWYgdGhlIHBhdGggZGV2aWF0ZXMgZnJvbSBtdXRhdG9yIHN0cnVjdHVyZSwgcmV0dXJuIHRoZSBtdXRhdG9yXHJcbiAgICAgICAgcmV0dXJuIF9tdXRhdG9yO1xyXG4gICAgICBtdXRhdG9yW2tleV0gPSBfbXV0YXRvcltrZXldO1xyXG4gICAgICBpZiAoX3BhdGgubGVuZ3RoID4gMSlcclxuICAgICAgICBtdXRhdG9yW2tleV0gPSBNdXRhYmxlLmdldE11dGF0b3JGcm9tUGF0aChtdXRhdG9yW2tleV0sIF9wYXRoLnNsaWNlKDEsIF9wYXRoLmxlbmd0aCkpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgdHlwZSBvZiB0aGlzIG11dGFibGUgc3ViY2xhc3MgYXMgdGhlIG5hbWUgb2YgdGhlIHJ1bnRpbWUgY2xhc3NcclxuICAgICAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIHRoZSBtdXRhYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0IGFwcGxpY2FibGUgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UgYW5kIGNvcGllcyBvZiB0aGVpciB2YWx1ZXMgaW4gYSBNdXRhdG9yLW9iamVjdC5cclxuICAgICAqIEJ5IGRlZmF1bHQsIGEgbXV0YXRvciBjYW5ub3QgYmUgZXh0ZW5kZWQsIHNpbmNlIGV4dGVuc2lvbnMgYXJlIG5vdCBhdmFpbGFibGUgaW4gdGhlIG9iamVjdCB0aGUgbXV0YXRvciBiZWxvbmdzIHRvLlxyXG4gICAgICogQSBtdXRhdG9yIG1heSBiZSByZWR1Y2VkIGJ5IHRoZSBkZXNjZW5kYW50cyBvZiB7QGxpbmsgTXV0YWJsZX0gdG8gY29udGFpbiBvbmx5IHRoZSBwcm9wZXJ0aWVzIG5lZWRlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3IoX2V4dGVuZGFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHt9O1xyXG5cclxuICAgICAgLy8gY29sbGVjdCBwcmltaXRpdmUgYW5kIG11dGFibGUgYXR0cmlidXRlc1xyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gdGhpcykge1xyXG4gICAgICAgIGxldCB2YWx1ZTogT2JqZWN0ID0gdGhpc1thdHRyaWJ1dGVdO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmICEodmFsdWUgaW5zdGFuY2VvZiBNdXRhYmxlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTXV0YWJsZUFycmF5KSAmJiAhKHZhbHVlLmhhc093blByb3BlcnR5KFwiaWRSZXNvdXJjZVwiKSkpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICBtdXRhdG9yW2F0dHJpYnV0ZV0gPSB0aGlzW2F0dHJpYnV0ZV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghX2V4dGVuZGFibGUpXHJcbiAgICAgICAgLy8gbXV0YXRvciBjYW4gYmUgcmVkdWNlZCBidXQgbm90IGV4dGVuZGVkIVxyXG4gICAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhtdXRhdG9yKTtcclxuICAgICAgLy8gZGVsZXRlIHVud2FudGVkIGF0dHJpYnV0ZXNcclxuICAgICAgdGhpcy5yZWR1Y2VNdXRhdG9yKG11dGF0b3IpO1xyXG5cclxuICAgICAgLy8gcmVwbGFjZSByZWZlcmVuY2VzIHRvIG11dGFibGUgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbXV0YXRvcnNcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIG11dGF0b3IpIHtcclxuICAgICAgICBsZXQgdmFsdWU6IE9iamVjdCA9IG11dGF0b3JbYXR0cmlidXRlXTtcclxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNdXRhYmxlKVxyXG4gICAgICAgICAgbXV0YXRvclthdHRyaWJ1dGVdID0gdmFsdWUuZ2V0TXV0YXRvcigpO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGVBcnJheSlcclxuICAgICAgICAgIG11dGF0b3JbYXR0cmlidXRlXSA9IHZhbHVlLm1hcCgoX3ZhbHVlKSA9PiBfdmFsdWUuZ2V0TXV0YXRvcigpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZSBhbmQgdGhlaXIgdmFsdWVzIGFwcGxpY2FibGUgZm9yIGFuaW1hdGlvbi5cclxuICAgICAqIEJhc2ljIGZ1bmN0aW9uYWxpdHkgaXMgaWRlbnRpY2FsIHRvIHtAbGluayBnZXRNdXRhdG9yfSwgcmV0dXJuZWQgbXV0YXRvciBzaG91bGQgdGhlbiBiZSByZWR1Y2VkIGJ5IHRoZSBzdWJjbGFzc2VkIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yRm9yQW5pbWF0aW9uKCk6IE11dGF0b3JGb3JBbmltYXRpb24ge1xyXG4gICAgICByZXR1cm4gPE11dGF0b3JGb3JBbmltYXRpb24+dGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbGxlY3QgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlIGFuZCB0aGVpciB2YWx1ZXMgYXBwbGljYWJsZSBmb3IgdGhlIHVzZXIgaW50ZXJmYWNlLlxyXG4gICAgICogQmFzaWMgZnVuY3Rpb25hbGl0eSBpcyBpZGVudGljYWwgdG8ge0BsaW5rIGdldE11dGF0b3J9LCByZXR1cm5lZCBtdXRhdG9yIHNob3VsZCB0aGVuIGJlIHJlZHVjZWQgYnkgdGhlIHN1YmNsYXNzZWQgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlKCk6IE11dGF0b3JGb3JVc2VySW50ZXJmYWNlIHtcclxuICAgICAgcmV0dXJuIDxNdXRhdG9yRm9yVXNlckludGVyZmFjZT50aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29sbGVjdCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UgYW5kIHRoZWlyIHZhbHVlcyBhcHBsaWNhYmxlIGZvciBpbmRpdml1YWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBCYXNpYyBmdW5jdGlvbmFsaXR5IGlzIGlkZW50aWNhbCB0byB7QGxpbmsgZ2V0TXV0YXRvcn0sIHJldHVybmVkIG11dGF0b3Igc2hvdWxkIHRoZW4gYmUgcmVkdWNlZCBieSB0aGUgc3ViY2xhc3NlZCBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvckZvckNvbXBvbmVudCgpOiBNdXRhdG9yRm9yQ29tcG9uZW50IHtcclxuICAgIC8vICAgICByZXR1cm4gPE11dGF0b3JGb3JDb21wb25lbnQ+dGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAvLyB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGUgc2FtZSBhdHRyaWJ1dGVzIGFzIHRoZSBnaXZlbiBtdXRhdG9yLCBidXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB0eXBlcyBhcyBzdHJpbmctdmFsdWVzXHJcbiAgICAgKiBEb2VzIG5vdCByZWN1cnNlIGludG8gb2JqZWN0cyFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBfbXV0YXRvcikge1xyXG4gICAgICAgIGxldCB0eXBlOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgIGxldCB2YWx1ZTogbnVtYmVyIHwgYm9vbGVhbiB8IHN0cmluZyB8IG9iamVjdCA9IF9tdXRhdG9yW2F0dHJpYnV0ZV07XHJcbiAgICAgICAgaWYgKF9tdXRhdG9yW2F0dHJpYnV0ZV0gIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09IFwib2JqZWN0XCIpXHJcbiAgICAgICAgICAgIHR5cGUgPSAoPEdlbmVyYWw+dGhpcylbYXR0cmlidXRlXS5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgICAgICAgZWxzZSBpZiAodHlwZW9mICh2YWx1ZSkgPT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgICAgICB0eXBlID0gdmFsdWVbXCJuYW1lXCJdO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0eXBlID0gX211dGF0b3JbYXR0cmlidXRlXS5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgICAgIHR5cGVzW2F0dHJpYnV0ZV0gPSB0eXBlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBtdXRhdG9yIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW5zdGFuY2VcclxuICAgICAqIEBwYXJhbSBfbXV0YXRvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIF9tdXRhdG9yKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBPYmplY3QgPSBfbXV0YXRvclthdHRyaWJ1dGVdO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE11dGFibGUpXHJcbiAgICAgICAgICBfbXV0YXRvclthdHRyaWJ1dGVdID0gdmFsdWUuZ2V0TXV0YXRvcigpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIF9tdXRhdG9yW2F0dHJpYnV0ZV0gPSAoPEdlbmVyYWw+dGhpcylbYXR0cmlidXRlXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSBhY2NvcmRpbmcgdG8gdGhlIHN0YXRlIG9mIHRoZSBtdXRhdG9yLlxyXG4gICAgICogVGhlIG11dGF0aW9uIG1heSBiZSByZXN0cmljdGVkIHRvIGEgc3Vic2V0IG9mIHRoZSBtdXRhdG9yIGFuZCB0aGUgZXZlbnQgZGlzcGF0Y2hpbmcgc3VwcHJlc3NlZC5cclxuICAgICAqIFVzZXMgbXV0YXRlQmFzZSwgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBpbiBzdWJjbGFzc2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCB0aGlzLm11dGF0ZUJhc2UoX211dGF0b3IsIF9zZWxlY3Rpb24pO1xyXG4gICAgICBpZiAoX2Rpc3BhdGNoTXV0YXRlKVxyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuTVVUQVRFLCB7IGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBtdXRhdG9yOiBfbXV0YXRvciB9IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJhc2UgbWV0aG9kIGZvciBtdXRhdGlvbiwgYWx3YXlzIGF2YWlsYWJsZSB0byBzdWJjbGFzc2VzLiBEbyBub3Qgb3ZlcndyaXRlIGluIHN1YmNsYXNzZXMhXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhc3luYyBtdXRhdGVCYXNlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uPzogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7fTtcclxuICAgICAgaWYgKCFfc2VsZWN0aW9uKVxyXG4gICAgICAgIG11dGF0b3IgPSBfbXV0YXRvcjtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBfc2VsZWN0aW9uKSAvLyByZWR1Y2UgdGhlIG11dGF0b3IgdG8gdGhlIHNlbGVjdGlvblxyXG4gICAgICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3JbYXR0cmlidXRlXSkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgICAgIG11dGF0b3JbYXR0cmlidXRlXSA9IF9tdXRhdG9yW2F0dHJpYnV0ZV07XHJcblxyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gbXV0YXRvcikge1xyXG4gICAgICAgIGlmICghUmVmbGVjdC5oYXModGhpcywgYXR0cmlidXRlKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGxldCBtdXRhbnQ6IE9iamVjdCA9IFJlZmxlY3QuZ2V0KHRoaXMsIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBNdXRhdG9yID0gPE11dGF0b3I+bXV0YXRvclthdHRyaWJ1dGVdO1xyXG4gICAgICAgIGlmIChtdXRhbnQgaW5zdGFuY2VvZiBNdXRhYmxlQXJyYXkgfHwgbXV0YW50IGluc3RhbmNlb2YgTXV0YWJsZSlcclxuICAgICAgICAgIGF3YWl0IG11dGFudC5tdXRhdGUodmFsdWUsIG51bGwsIGZhbHNlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBSZWZsZWN0LnNldCh0aGlzLCBhdHRyaWJ1dGUsIHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWR1Y2VzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBnZW5lcmFsIG11dGF0b3IgYWNjb3JkaW5nIHRvIGRlc2lyZWQgb3B0aW9ucyBmb3IgbXV0YXRpb24uIFRvIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXNcclxuICAgICAqIEBwYXJhbSBfbXV0YXRvciBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkO1xyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGV4cG9ydCB0eXBlIEdlbmVyYWwgPSBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIG5lZWRlZCB0byByZWNyZWF0ZSBhbiBvYmplY3QgaWRlbnRpY2FsIHRvIHRoZSBvbmUgaXQgb3JpZ2luYXRlZCBmcm9tLiBcclxuICAgKiBBIHNlcmlhbGl6YXRpb24gaXMgdXNlZCB0byBjcmVhdGUgY29waWVzIG9mIGV4aXN0aW5nIG9iamVjdHMgYXQgcnVudGltZSBvciB0byBzdG9yZSBvYmplY3RzIGFzIHN0cmluZ3Mgb3IgcmVjcmVhdGUgdGhlbS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YXRpb24ge1xyXG4gICAgW3R5cGU6IHN0cmluZ106IEdlbmVyYWw7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZSB7XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgU2VyaWFsaXphdGlvbn0gb2YgdGhpcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uO1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNyZWF0ZXMgdGhpcyBpbnN0YW5jZSBvZiB7QGxpbmsgU2VyaWFsaXphYmxlfSB3aXRoIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgU2VyaWFsaXphdGlvbn0uXHJcbiAgICAgKi9cclxuICAgIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+O1xyXG4gIH1cclxuXHJcbiAgaW50ZXJmYWNlIE5hbWVzcGFjZVJlZ2lzdGVyIHtcclxuICAgIFtuYW1lOiBzdHJpbmddOiBPYmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIHRoZSBleHRlcm5hbCBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gb2Yge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cy4gVGhlIGludGVybmFsIHByb2Nlc3MgaXMgaGFuZGxlZCBieSB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLiAgXHJcbiAgICogQSB7QGxpbmsgU2VyaWFsaXphdGlvbn0gb2JqZWN0IGNhbiBiZSBjcmVhdGVkIGZyb20gYSB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3QgYW5kIGEgSlNPTi1TdHJpbmcgbWF5IGJlIGNyZWF0ZWQgZnJvbSB0aGF0LiAgXHJcbiAgICogVmljZSB2ZXJzYSwgYSBKU09OLVN0cmluZyBjYW4gYmUgcGFyc2VkIHRvIGEge0BsaW5rIFNlcmlhbGl6YXRpb259IHdoaWNoIGNhbiBiZSBkZXNlcmlhbGl6ZWQgdG8gYSB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3QuXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICBbU2VyaWFsaXphYmxlXSDihpIgKHNlcmlhbGl6ZSkg4oaSIFtTZXJpYWxpemF0aW9uXSDihpIgKHN0cmluZ2lmeSkg4oaSIFtTdHJpbmddIOKGkiAoc2F2ZSBvciBzZW5kKVxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkyAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpMgICAgICAgICAgICAgICAgICDihpMgICAgICAgICBcclxuICAgKiAgICAgICAgICAgICAgICBbU2VyaWFsaXphYmxlXSDihpAgKGRlc2VyaWFsaXplKSDihpAgW1NlcmlhbGl6YXRpb25dIOKGkCAocGFyc2UpIOKGkCAobG9hZCkg4oaQIFtNZWRpdW1dXHJcbiAgICogYGBgICAgICAgXHJcbiAgICogV2hpbGUgdGhlIGludGVybmFsIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBtZXRob2QxcyBvZiB0aGUgb2JqZWN0cyBjYXJlIG9mIHRoZSBzZWxlY3Rpb24gb2YgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHJlY3JlYXRlIHRoZSBvYmplY3QgYW5kIGl0cyBzdHJ1Y3R1cmUsICBcclxuICAgKiB0aGUge0BsaW5rIFNlcmlhbGl6ZXJ9IGtlZXBzIHRyYWNrIG9mIHRoZSBuYW1lc3BhY2VzIGFuZCBjbGFzc2VzIGluIG9yZGVyIHRvIHJlY3JlYXRlIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMuIFRoZSBnZW5lcmFsIHN0cnVjdHVyZSBvZiBhIHtAbGluayBTZXJpYWxpemF0aW9ufSBpcyBhcyBmb2xsb3dzICBcclxuICAgKiBgYGB0ZXh0XHJcbiAgICoge1xyXG4gICAqICAgICAgbmFtZXNwYWNlTmFtZS5jbGFzc05hbWU6IHtcclxuICAgKiAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5VmFsdWUsXHJcbiAgICogICAgICAgICAgLi4uLFxyXG4gICAqICAgICAgICAgIHByb3BlcnR5TmFtZU9mUmVmZXJlbmNlOiBTZXJpYWxpemF0aW9uT2ZUaGVSZWZlcmVuY2VkT2JqZWN0LFxyXG4gICAqICAgICAgICAgIC4uLixcclxuICAgKiAgICAgICAgICBjb25zdHJ1Y3Rvck5hbWVPZlN1cGVyY2xhc3M6IFNlcmlhbGl6YXRpb25PZlN1cGVyQ2xhc3NcclxuICAgKiAgICAgIH1cclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICogU2luY2UgdGhlIGluc3RhbmNlIG9mIHRoZSBzdXBlcmNsYXNzIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkLCBcclxuICAgKiB0aGUgU2VyaWFsaXphdGlvbk9mU3VwZXJDbGFzcyBvbWl0cyB0aGUgdGhlIG5hbWVzcGFjZU5hbWUuY2xhc3NOYW1lIGtleSBhbmQgY29uc2lzdHMgb25seSBvZiBpdHMgdmFsdWUuIFxyXG4gICAqIFRoZSBjb25zdHJ1Y3Rvck5hbWVPZlN1cGVyY2xhc3MgaXMgZ2l2ZW4gaW5zdGVhZCBhcyBhIHByb3BlcnR5IG5hbWUgaW4gdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlIHN1YmNsYXNzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTZXJpYWxpemVyIHtcclxuICAgIC8qKiBJbiBvcmRlciBmb3IgdGhlIFNlcmlhbGl6ZXIgdG8gY3JlYXRlIGNsYXNzIGluc3RhbmNlcywgaXQgbmVlZHMgYWNjZXNzIHRvIHRoZSBhcHByb3ByaWF0ZSBuYW1lc3BhY2VzICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBuYW1lc3BhY2VzOiBOYW1lc3BhY2VSZWdpc3RlciA9IHsgXCLGklwiOiBGdWRnZUNvcmUgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVycyBhIG5hbWVzcGFjZSB0byB0aGUge0BsaW5rIFNlcmlhbGl6ZXJ9LCB0byBlbmFibGUgYXV0b21hdGljIGluc3RhbnRpYXRpb24gb2YgY2xhc3NlcyBkZWZpbmVkIHdpdGhpblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyTmFtZXNwYWNlKF9uYW1lc3BhY2U6IE9iamVjdCk6IHN0cmluZyB7XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gU2VyaWFsaXplci5uYW1lc3BhY2VzKVxyXG4gICAgICAgIGlmIChTZXJpYWxpemVyLm5hbWVzcGFjZXNbbmFtZV0gPT0gX25hbWVzcGFjZSlcclxuICAgICAgICAgIHJldHVybiBuYW1lO1xyXG5cclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IFNlcmlhbGl6ZXIuZmluZE5hbWVzcGFjZUluKF9uYW1lc3BhY2UsIHdpbmRvdyk7XHJcbiAgICAgIGlmICghbmFtZSlcclxuICAgICAgICBmb3IgKGxldCBwYXJlbnROYW1lIGluIFNlcmlhbGl6ZXIubmFtZXNwYWNlcykge1xyXG4gICAgICAgICAgbmFtZSA9IFNlcmlhbGl6ZXIuZmluZE5hbWVzcGFjZUluKF9uYW1lc3BhY2UsIFNlcmlhbGl6ZXIubmFtZXNwYWNlc1twYXJlbnROYW1lXSk7XHJcbiAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICBuYW1lID0gcGFyZW50TmFtZSArIFwiLlwiICsgbmFtZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFuYW1lKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5hbWVzcGFjZSBub3QgZm91bmQuIE1heWJlIHBhcmVudCBuYW1lc3BhY2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmU/XCIpO1xyXG5cclxuICAgICAgU2VyaWFsaXplci5uYW1lc3BhY2VzW25hbWVdID0gX25hbWVzcGFjZTtcclxuICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGphdmFzY3JpcHQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXphYmxlIEZVREdFLW9iamVjdCBnaXZlbixcclxuICAgICAqIGluY2x1ZGluZyBhdHRhY2hlZCBjb21wb25lbnRzLCBjaGlsZHJlbiwgc3VwZXJjbGFzcy1vYmplY3RzIGFsbCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHJlY29uc3RydWN0aW9uXHJcbiAgICAgKiBAcGFyYW0gX29iamVjdCBBbiBvYmplY3QgdG8gc2VyaWFsaXplLCBpbXBsZW1lbnRpbmcgdGhlIHtAbGluayBTZXJpYWxpemFibGV9IGludGVyZmFjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShfb2JqZWN0OiBTZXJpYWxpemFibGUpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgLy8gVE9ETzogc2F2ZSB0aGUgbmFtZXNwYWNlIHdpdGggdGhlIGNvbnN0cnVjdG9ycyBuYW1lXHJcbiAgICAgIC8vIHNlcmlhbGl6YXRpb25bX29iamVjdC5jb25zdHJ1Y3Rvci5uYW1lXSA9IF9vYmplY3Quc2VyaWFsaXplKCk7XHJcbiAgICAgIGxldCBwYXRoOiBzdHJpbmcgPSB0aGlzLmdldEZ1bGxQYXRoKF9vYmplY3QpO1xyXG4gICAgICBpZiAoIXBhdGgpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOYW1lc3BhY2Ugb2Ygc2VyaWFsaXphYmxlIG9iamVjdCBvZiB0eXBlICR7X29iamVjdC5jb25zdHJ1Y3Rvci5uYW1lfSBub3QgZm91bmQuIE1heWJlIHRoZSBuYW1lc3BhY2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBvciB0aGUgY2xhc3Mgbm90IGV4cG9ydGVkP2ApO1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3BhdGhdID0gX29iamVjdC5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICAgIC8vIHJldHVybiBfb2JqZWN0LnNlcmlhbGl6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIEZVREdFLW9iamVjdCByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSB7QGxpbmsgU2VyaWFsaXphdGlvbn0gZ2l2ZW4sXHJcbiAgICAgKiBpbmNsdWRpbmcgYXR0YWNoZWQgY29tcG9uZW50cywgY2hpbGRyZW4sIHN1cGVyY2xhc3Mtb2JqZWN0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgbGV0IHJlY29uc3RydWN0OiBTZXJpYWxpemFibGU7XHJcbiAgICAgIGxldCBwYXRoOiBzdHJpbmc7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gbG9vcCBjb25zdHJ1Y3RlZCBzb2xlbHkgdG8gYWNjZXNzIHR5cGUtcHJvcGVydHkuIE9ubHkgb25lIGV4cGVjdGVkIVxyXG4gICAgICAgIGZvciAocGF0aCBpbiBfc2VyaWFsaXphdGlvbikge1xyXG4gICAgICAgICAgcmVjb25zdHJ1Y3QgPSBTZXJpYWxpemVyLnJlY29uc3RydWN0KHBhdGgpO1xyXG4gICAgICAgICAgcmVjb25zdHJ1Y3QgPSBhd2FpdCByZWNvbnN0cnVjdC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltwYXRoXSk7XHJcbiAgICAgICAgICByZXR1cm4gcmVjb25zdHJ1Y3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICBsZXQgbWVzc2FnZTogc3RyaW5nID0gYERlc2VyaWFsaXphdGlvbiBvZiAke3BhdGh9LCAke3JlY29uc3RydWN0ID8gUmVmbGVjdC5nZXQocmVjb25zdHJ1Y3QsIFwiaWRSZXNvdXJjZVwiKSA6IFwiXCJ9IGZhaWxlZDogYCArIF9lcnJvcjtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIEFycmF5IG9mIGphdmFzY3JpcHQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXphYmxlIEZVREdFLW9iamVjdHMgZ2l2ZW4gaW4gdGhlIGFycmF5LFxyXG4gICAgICogaW5jbHVkaW5nIGF0dGFjaGVkIGNvbXBvbmVudHMsIGNoaWxkcmVuLCBzdXBlcmNsYXNzLW9iamVjdHMgYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgcmVjb25zdHJ1Y3Rpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVBcnJheTxUIGV4dGVuZHMgU2VyaWFsaXphYmxlPihfdHlwZTogbmV3ICgpID0+IFQsIF9vYmplY3RzOiBTZXJpYWxpemFibGVbXSk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbnM6IFNlcmlhbGl6YXRpb25bXSA9IFtdO1xyXG4gICAgICBsZXQgcGF0aDogc3RyaW5nID0gdGhpcy5nZXRGdWxsUGF0aChuZXcgX3R5cGUoKSk7XHJcbiAgICAgIGlmICghcGF0aClcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5hbWVzcGFjZSBvZiBzZXJpYWxpemFibGUgb2JqZWN0IG9mIHR5cGUgJHtfdHlwZS5uYW1lfSBub3QgZm91bmQuIE1heWJlIHRoZSBuYW1lc3BhY2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBvciB0aGUgY2xhc3Mgbm90IGV4cG9ydGVkP2ApO1xyXG5cclxuICAgICAgZm9yIChsZXQgb2JqZWN0IG9mIF9vYmplY3RzKVxyXG4gICAgICAgIHNlcmlhbGl6YXRpb25zLnB1c2gob2JqZWN0LnNlcmlhbGl6ZSgpKTtcclxuXHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge307XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bcGF0aF0gPSBzZXJpYWxpemF0aW9ucztcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIEFycmF5IG9mIEZVREdFLW9iamVjdHMgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgYXJyYXkgb2Yge0BsaW5rIFNlcmlhbGl6YXRpb259cyBnaXZlbixcclxuICAgICAqIGluY2x1ZGluZyBhdHRhY2hlZCBjb21wb25lbnRzLCBjaGlsZHJlbiwgc3VwZXJjbGFzcy1vYmplY3RzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZGVzZXJpYWxpemVBcnJheShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlW10+IHtcclxuICAgICAgbGV0IHNlcmlhbGl6YWJsZXM6IFNlcmlhbGl6YWJsZVtdID0gW107XHJcbiAgICAgIGxldCBjb25zdHJ1Y3Q6IG5ldyAoKSA9PiBTZXJpYWxpemFibGU7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uczogU2VyaWFsaXphdGlvbltdID0gW107XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gbG9vcCBjb25zdHJ1Y3RlZCBzb2xlbHkgdG8gYWNjZXNzIHR5cGUtcHJvcGVydHkuIE9ubHkgb25lIGV4cGVjdGVkIVxyXG4gICAgICAgIGZvciAobGV0IHBhdGggaW4gX3NlcmlhbGl6YXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0cnVjdCA9IFNlcmlhbGl6ZXIuZ2V0Q29uc3RydWN0b3IocGF0aCk7XHJcbiAgICAgICAgICBzZXJpYWxpemF0aW9ucyA9IF9zZXJpYWxpemF0aW9uW3BhdGhdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZXNlcmlhbGl6YXRpb24gZmFpbGVkOiBcIiArIF9lcnJvcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IHNlcmlhbGl6YXRpb24gb2Ygc2VyaWFsaXphdGlvbnMpIHtcclxuICAgICAgICBsZXQgc2VyaWFsaXphYmxlOiBTZXJpYWxpemFibGUgPSBuZXcgY29uc3RydWN0KCk7XHJcbiAgICAgICAgYXdhaXQgc2VyaWFsaXphYmxlLmRlc2VyaWFsaXplKHNlcmlhbGl6YXRpb24pO1xyXG4gICAgICAgIHNlcmlhbGl6YWJsZXMucHVzaChzZXJpYWxpemFibGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gc2VyaWFsaXphYmxlcztcclxuICAgIH1cclxuXHJcbiAgICAvL1RPRE86IGltcGxlbWVudCBwcmV0dGlmaWVyIHRvIG1ha2UgSlNPTi1TdHJpbmdpZmljYXRpb24gb2Ygc2VyaWFsaXphdGlvbnMgbW9yZSByZWFkYWJsZSwgZS5nLiBwbGFjaW5nIHgsIHkgYW5kIHogaW4gb25lIGxpbmVcclxuICAgIC8qKlxyXG4gICAgICogUHJldHRpZnkgYSBKU09OLVN0cmluZywgdG8gbWFrZSBpdCBtb3JlIHJlYWRhYmxlLlxyXG4gICAgICogbm90IGltcGxlbWVudGVkIHlldFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHByZXR0aWZ5KF9qc29uOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gX2pzb247IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQsIGh1bWFuIHJlYWRhYmxlIEpTT04tU3RyaW5nLCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHtAbGluayBTZXJpYWxpemF0aW9ufSB0aGF0IG1heSBoYXZlIGJlZW4gY3JlYXRlZCBieSB7QGxpbmsgU2VyaWFsaXplcn0uc2VyaWFsaXplXHJcbiAgICAgKiBAcGFyYW0gX3NlcmlhbGl6YXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzdHJpbmdpZnkoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBzdHJpbmcge1xyXG4gICAgICAvLyBhZGp1c3RtZW50cyB0byBzZXJpYWxpemF0aW9uIGNhbiBiZSBtYWRlIGhlcmUgYmVmb3JlIHN0cmluZ2lmaWNhdGlvbiwgaWYgZGVzaXJlZFxyXG4gICAgICBsZXQganNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoX3NlcmlhbGl6YXRpb24sIG51bGwsIDIpO1xyXG4gICAgICBsZXQgcHJldHR5OiBzdHJpbmcgPSBTZXJpYWxpemVyLnByZXR0aWZ5KGpzb24pO1xyXG4gICAgICByZXR1cm4gcHJldHR5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBTZXJpYWxpemF0aW9ufSBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIEpTT04tU3RyaW5nLiBSZXN1bHQgbWF5IGJlIHBhc3NlZCB0byB7QGxpbmsgU2VyaWFsaXplci5kZXNlcmlhbGl6ZX1cclxuICAgICAqIEBwYXJhbSBfanNvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZShfanNvbjogc3RyaW5nKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKF9qc29uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IG9mIHRoZSBjbGFzcyBkZWZpbmVkIHdpdGggdGhlIGZ1bGwgcGF0aCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZU5hbWUocykgYW5kIHRoZSBjbGFzc05hbWUgc2VwZXJhdGVkIGJ5IGRvdHMoLikgXHJcbiAgICAgKiBAcGFyYW0gX3BhdGggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVjb25zdHJ1Y3QoX3BhdGg6IHN0cmluZyk6IFNlcmlhbGl6YWJsZSB7XHJcbiAgICAgIGxldCBjb25zdHJ1Y3RvcjogbmV3ICgpID0+IFNlcmlhbGl6YWJsZSA9IFNlcmlhbGl6ZXIuZ2V0Q29uc3RydWN0b3IoX3BhdGgpO1xyXG4gICAgICBsZXQgcmVjb25zdHJ1Y3Rpb246IFNlcmlhbGl6YWJsZSA9IG5ldyBjb25zdHJ1Y3RvcigpO1xyXG4gICAgICByZXR1cm4gcmVjb25zdHJ1Y3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBnZXRDb25zdHJ1Y3RvcjxUIGV4dGVuZHMgU2VyaWFsaXphYmxlPihfdHlwZTogc3RyaW5nLCBfbmFtZXNwYWNlOiBPYmplY3QgPSBGdWRnZUNvcmUpOiBuZXcgKCkgPT4gVCB7XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNvbnN0cnVjdG9yIGZyb20gdGhlIGdpdmVuIHBhdGggdG8gYSBjbGFzc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnN0cnVjdG9yPFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KF9wYXRoOiBzdHJpbmcpOiBuZXcgKCkgPT4gVCB7XHJcbiAgICAgIGxldCB0eXBlTmFtZTogc3RyaW5nID0gX3BhdGguc3Vic3RyaW5nKF9wYXRoLmxhc3RJbmRleE9mKFwiLlwiKSArIDEpO1xyXG4gICAgICBsZXQgbmFtZXNwYWNlOiBPYmplY3QgPSBTZXJpYWxpemVyLmdldE5hbWVzcGFjZShfcGF0aCk7XHJcbiAgICAgIGlmICghbmFtZXNwYWNlKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uc3RydWN0b3Igb2Ygc2VyaWFsaXphYmxlIG9iamVjdCBvZiB0eXBlICR7X3BhdGh9IG5vdCBmb3VuZC4gTWF5YmUgdGhlIG5hbWVzcGFjZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkP2ApO1xyXG4gICAgICByZXR1cm4gKDxHZW5lcmFsPm5hbWVzcGFjZSlbdHlwZU5hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0LCBpZiBmb3VuZCBpbiB0aGUgcmVnaXN0ZXJlZCBuYW1lc3BhY2VzXHJcbiAgICAgKiBAcGFyYW0gX29iamVjdCBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RnVsbFBhdGgoX29iamVjdDogU2VyaWFsaXphYmxlKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHR5cGVOYW1lOiBzdHJpbmcgPSBfb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICAgIC8vIERlYnVnLmxvZyhcIlNlYXJjaGluZyBuYW1lc3BhY2Ugb2Y6IFwiICsgdHlwZU5hbWUpO1xyXG4gICAgICBmb3IgKGxldCBuYW1lc3BhY2VOYW1lIGluIFNlcmlhbGl6ZXIubmFtZXNwYWNlcykge1xyXG4gICAgICAgIGxldCBmb3VuZDogR2VuZXJhbCA9ICg8R2VuZXJhbD5TZXJpYWxpemVyLm5hbWVzcGFjZXMpW25hbWVzcGFjZU5hbWVdW3R5cGVOYW1lXTtcclxuICAgICAgICBpZiAoZm91bmQgJiYgX29iamVjdCBpbnN0YW5jZW9mIGZvdW5kKVxyXG4gICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZU5hbWUgKyBcIi5cIiArIHR5cGVOYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlLW9iamVjdCBkZWZpbmVkIHdpdGhpbiB0aGUgZnVsbCBwYXRoLCBpZiByZWdpc3RlcmVkXHJcbiAgICAgKiBAcGFyYW0gX3BhdGhcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0TmFtZXNwYWNlKF9wYXRoOiBzdHJpbmcpOiBPYmplY3Qge1xyXG4gICAgICBsZXQgbmFtZXNwYWNlTmFtZTogc3RyaW5nID0gX3BhdGguc3Vic3RyKDAsIF9wYXRoLmxhc3RJbmRleE9mKFwiLlwiKSk7XHJcbiAgICAgIHJldHVybiBTZXJpYWxpemVyLm5hbWVzcGFjZXNbbmFtZXNwYWNlTmFtZV0gfHwgRnVkZ2VDb3JlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgdGhlIG5hbWVzcGFjZS1vYmplY3QgaW4gcHJvcGVydGllcyBvZiB0aGUgcGFyZW50LW9iamVjdCAoZS5nLiB3aW5kb3cpLCBpZiBwcmVzZW50XHJcbiAgICAgKiBAcGFyYW0gX25hbWVzcGFjZSBcclxuICAgICAqIEBwYXJhbSBfcGFyZW50IFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kTmFtZXNwYWNlSW4oX25hbWVzcGFjZTogT2JqZWN0LCBfcGFyZW50OiBPYmplY3QpOiBzdHJpbmcge1xyXG4gICAgICBmb3IgKGxldCBwcm9wIGluIF9wYXJlbnQpXHJcbiAgICAgICAgaWYgKCg8R2VuZXJhbD5fcGFyZW50KVtwcm9wXSA9PSBfbmFtZXNwYWNlKVxyXG4gICAgICAgICAgcmV0dXJuIHByb3A7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHR5cGUgQ29uc3RydWN0b3I8VD4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IEdlbmVyYWxbXSkgPT4gVDtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyAoYWJzdHJhY3QpIGNsYXNzIGltcGxlbWVudGluZyB7QGxpbmsgU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbH0gZnJvbSBhbnkgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBTZXJpYWxpemFibGVSZXNvdXJjZX0gYnkgbWl4aW5nIGluIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGxvYWQgdGhlIHJlc291cmNlIGZyb20gYW4gZXh0ZXJuYWwgc291cmNlLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBtaXhpblNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWw8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxTZXJpYWxpemFibGVSZXNvdXJjZT4+KF9iYXNlOiBUQmFzZSkgeyAvKiBlc2xpbnQtZGlzYWJsZS1saW5lICovIC8vZGlzYWJsZSBlc2xpbnQgYmVjYXVzZSBvbmx5IHR5cGUgaW5mZXJlbmNlIHNlZW1zIHRvIGJlIGFibGUgdG8gaGFuZGxlIG1peGluIGFic3RyYWN0IGNsYXNzZXMgY29ycmVjdGx5XHJcbiAgICBhYnN0cmFjdCBjbGFzcyBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsIGV4dGVuZHMgX2Jhc2UgaW1wbGVtZW50cyBGdWRnZUNvcmUuU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCB7XHJcbiAgICAgIHB1YmxpYyB1cmw6IFJlcXVlc3RJbmZvO1xyXG5cclxuICAgICAgcHVibGljIHN0YXR1czogUkVTT1VSQ0VfU1RBVFVTID0gUkVTT1VSQ0VfU1RBVFVTLlBFTkRJTkc7XHJcblxyXG4gICAgICAvKipcclxuICAgICAgICogUmV0dXJucyBhIHtAbGluayBTZXJpYWxpemF0aW9ufSBvZiB0aGlzIHJlc291cmNlLiBCeSBkZWZhdWx0IG9ubHkgdGhlIGRhdGEgbmVlZGVkIHRvIGxvYWQgaXQgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlIGlzIHNlcmlhbGl6ZWQgKFwidXJsXCIsIFwibmFtZVwiLCBcImlkUmVzb3VyY2VcIikuIFNldCBfc3VwZXIgdG8gdHJ1ZSB0byBzZXJpYWxpemUgYWxsIGRhdGEuXHJcbiAgICAgICAqL1xyXG4gICAgICBwdWJsaWMgc2VyaWFsaXplKF9zdXBlcjogYm9vbGVhbiA9IGZhbHNlKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IF9zdXBlciA/IHN1cGVyLnNlcmlhbGl6ZSgpIDogeyBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsIG5hbWU6IHRoaXMubmFtZSB9O1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb24udXJsID0gdGhpcy51cmwudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgICB0aGlzLnVybCA9IF9zZXJpYWxpemF0aW9uLnVybDtcclxuICAgICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwdWJsaWMgYWJzdHJhY3QgbG9hZCgpOiBQcm9taXNlPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWw+O1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoX2Jhc2UucHJvdG90eXBlIGluc3RhbmNlb2YgTXV0YWJsZSkge1xyXG4gICAgICAvKipcclxuICAgICAgICogTWl4aW4gdGhlIHtAbGluayBNdXRhYmxlfSBmdW5jdGlvbmFsaXR5IGludG8gdGhlIGNsYXNzXHJcbiAgICAgICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAgICAgKi9cclxuICAgICAgZnVuY3Rpb24gbWl4aW5NdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwgJiBNdXRhYmxlPj4oX2Jhc2U6IFRCYXNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuICAgICAgICBhYnN0cmFjdCBjbGFzcyBNdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCBleHRlbmRzIF9iYXNlIHtcclxuICAgICAgICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKF9tdXRhdG9yLnVybCAhPSB1bmRlZmluZWQgfHwgX211dGF0b3IubmFtZSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgICAgICAgZGVsZXRlIF9tdXRhdG9yLnN0YXR1cztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBNdXRhYmxlU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG1peGluTXV0YWJsZVNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwoPFRCYXNlICYgQ29uc3RydWN0b3I8U2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCAmIE11dGFibGU+PlNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsO1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWFwQ2xhc3NUb0NvbXBvbmVudHMge1xyXG4gICAgW2NsYXNzTmFtZTogc3RyaW5nXTogQ29tcG9uZW50W107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgc2NlbmV0cmVlLlxyXG4gICAqIEBhdXRob3JzIEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0dyYXBoXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE5vZGUgZXh0ZW5kcyBFdmVudFRhcmdldFVuaWZpZWQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZzsgLy8gVGhlIG5hbWUgdG8gY2FsbCB0aGlzIG5vZGUgYnkuXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgcHVibGljIHRpbWVzdGFtcFVwZGF0ZTogbnVtYmVyID0gMDtcclxuICAgIC8qKiBUaGUgbnVtYmVyIG9mIG5vZGVzIG9mIHRoZSB3aG9sZSBicmFuY2ggaW5jbHVkaW5nIHRoaXMgbm9kZSBhbmQgYWxsIHN1Y2Nlc3NvcnMgKi9cclxuICAgIHB1YmxpYyBuTm9kZXNJbkJyYW5jaDogbnVtYmVyID0gMDtcclxuICAgIC8qKiBUaGUgcmFkaXVzIG9mIHRoZSBib3VuZGluZyBzcGhlcmUgaW4gd29ybGQgZGltZW5zaW9ucyBlbmNsb3NpbmcgdGhlIGdlb21ldHJ5IG9mIHRoaXMgbm9kZSBhbmQgYWxsIHN1Y2Nlc3NvcnMgaW4gdGhlIGJyYW5jaCAqL1xyXG4gICAgcHVibGljIHJhZGl1czogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIHBhcmVudDogTm9kZSB8IG51bGwgPSBudWxsOyAvLyBUaGUgcGFyZW50IG9mIHRoaXMgbm9kZS5cclxuICAgIHByaXZhdGUgY2hpbGRyZW46IE5vZGVbXSA9IFtdOyAvLyBhcnJheSBvZiBjaGlsZCBub2RlcyBhcHBlbmRlZCB0byB0aGlzIG5vZGUuXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudHM6IE1hcENsYXNzVG9Db21wb25lbnRzID0ge307XHJcbiAgICAvLyBwcml2YXRlIHRhZ3M6IHN0cmluZ1tdID0gW107IC8vIE5hbWVzIG9mIHRhZ3MgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhpcyBub2RlLiAoVE9ETzogQXMgb2YgeWV0IG5vIGZ1bmN0aW9uYWxpdHkpXHJcbiAgICAvLyBwcml2YXRlIGxheWVyczogc3RyaW5nW10gPSBbXTsgLy8gTmFtZXMgb2YgdGhlIGxheWVycyB0aGlzIG5vZGUgaXMgb24uIChUT0RPOiBBcyBvZiB5ZXQgbm8gZnVuY3Rpb25hbGl0eSlcclxuICAgIHByaXZhdGUgbGlzdGVuZXJzOiBNYXBFdmVudFR5cGVUb0xpc3RlbmVyID0ge307XHJcbiAgICBwcml2YXRlIGNhcHR1cmVzOiBNYXBFdmVudFR5cGVUb0xpc3RlbmVyID0ge307XHJcbiAgICBwcml2YXRlIGFjdGl2ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgI210eFdvcmxkSW52ZXJzZVVwZGF0ZWQ6IG51bWJlcjtcclxuICAgICNtdHhXb3JsZEludmVyc2U6IE1hdHJpeDR4NDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgbm9kZSB3aXRoIGEgbmFtZSBhbmQgaW5pdGlhbGl6ZXMgYWxsIGF0dHJpYnV0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIG11dGF0b3ItbGlrZSBwYXRoIHN0cmluZyB0byBnZXQgZnJvbSBvbmUgbm9kZSB0byBhbm90aGVyIG9yIG51bGwgaWYgbm8gcGF0aCBpcyBmb3VuZCBlLmcuOlxyXG4gICAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAgICogXCJub2RlL3BhcmVudC9jaGlsZHJlbi8xL2NvbXBvbmVudHMvQ29tcG9uZW50U2tlbGV0b24vMFwiXHJcbiAgICAgKiBgYGBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQQVRIX0ZST01fVE8oX2Zyb206IE5vZGUgfCBDb21wb25lbnQsIF90bzogTm9kZSB8IENvbXBvbmVudCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICBjb25zdCBmcm9tOiBOb2RlID0gX2Zyb20gaW5zdGFuY2VvZiBDb21wb25lbnQgPyBfZnJvbS5ub2RlIDogX2Zyb207XHJcbiAgICAgIGNvbnN0IHRvOiBOb2RlID0gX3RvIGluc3RhbmNlb2YgQ29tcG9uZW50ID8gX3RvLm5vZGUgOiBfdG87XHJcbiAgICAgIGlmICghZnJvbSB8fCAhdG8pXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAvLyBmaW5kIHBhdGhzIHRvIGxvd2VzdCBjb21tb24gYW5jZXN0b3JcclxuICAgICAgbGV0IHBhdGhGcm9tOiBOb2RlW10gPSBmcm9tLmdldFBhdGgoKTtcclxuICAgICAgbGV0IHBhdGhUbzogTm9kZVtdID0gdG8uZ2V0UGF0aCgpO1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSBudWxsO1xyXG4gICAgICB3aGlsZSAocGF0aEZyb20ubGVuZ3RoICYmIHBhdGhUby5sZW5ndGggJiYgcGF0aEZyb21bMF0gPT0gcGF0aFRvWzBdKSB7XHJcbiAgICAgICAgYW5jZXN0b3IgPSBwYXRoRnJvbS5zaGlmdCgpO1xyXG4gICAgICAgIHBhdGhUby5zaGlmdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHBhdGhUby51bnNoaWZ0KGFuY2VzdG9yKTtcclxuXHJcbiAgICAgIGlmICghYW5jZXN0b3IpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgcmVsYXRpdmUgcGF0aFxyXG4gICAgICBsZXQgcGF0aFRvQW5jZXN0b3I6IHN0cmluZ1tdID0gcGF0aEZyb20ubWFwKF9ub2RlID0+IFwicGFyZW50XCIpOyAvLyBUT0RPOiB1c2UgXCJrZXlvZiBOb2RlXCIgYXMgdHlwZVxyXG4gICAgICBsZXQgcGF0aEZyb21BbmNlc3Rvcjogc3RyaW5nW10gPSBwYXRoVG9cclxuICAgICAgICAuZmxhdE1hcCgoX25vZGUsIF9pbmRleCwgX2FycmF5KSA9PiBbXCJjaGlsZHJlblwiLCBfbm9kZS5maW5kQ2hpbGQoX2FycmF5W19pbmRleCArIDFdKS50b1N0cmluZygpXSlcclxuICAgICAgICAuc2xpY2UoMCwgLTIpO1xyXG5cclxuICAgICAgaWYgKF9mcm9tIGluc3RhbmNlb2YgQ29tcG9uZW50KVxyXG4gICAgICAgIHBhdGhUb0FuY2VzdG9yLnVuc2hpZnQoXCJub2RlXCIpO1xyXG4gICAgICBpZiAoX3RvIGluc3RhbmNlb2YgQ29tcG9uZW50KVxyXG4gICAgICAgIHBhdGhGcm9tQW5jZXN0b3IucHVzaChcImNvbXBvbmVudHNcIiwgX3RvLnR5cGUsIHRvLmNvbXBvbmVudHNbX3RvLnR5cGVdLmluZGV4T2YoX3RvKS50b1N0cmluZygpKTtcclxuXHJcbiAgICAgIHJldHVybiBwYXRoVG9BbmNlc3Rvci5jb25jYXQocGF0aEZyb21BbmNlc3Rvcikuam9pbihcIi9cIik7IC8vIFRPRE86IG9yIG1heWJlIHZhbGlkYXRlIHRoaXMgc3RyaW5nIHdpdGggbm9kZSBhbmQgY29tcG9uZW50IG9iamVjdHM/XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBOb2RlfSBvciB7QGxpbmsgQ29tcG9uZW50fSBmb3VuZCBhdCB0aGUgZ2l2ZW4gcGF0aCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBub2RlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBGSU5EPFQgPSBOb2RlIHwgQ29tcG9uZW50PihfZnJvbTogTm9kZSB8IENvbXBvbmVudCwgX3BhdGg6IHN0cmluZyk6IFQge1xyXG4gICAgICBpZiAoX3BhdGggPT0gXCJcIilcclxuICAgICAgICByZXR1cm4gPFQ+X2Zyb207XHJcblxyXG4gICAgICBsZXQgcGF0aDogc3RyaW5nW10gPSBfcGF0aC5zcGxpdChcIi9cIik7XHJcbiAgICAgIGxldCB0bzogR2VuZXJhbCA9IF9mcm9tO1xyXG5cclxuICAgICAgd2hpbGUgKHBhdGgubGVuZ3RoICYmIHRvKVxyXG4gICAgICAgIHRvID0gUmVmbGVjdC5nZXQodG8sIHBhdGguc2hpZnQoKSk7XHJcblxyXG4gICAgICByZXR1cm4gdG87XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvcnRjdXQgdG8gcmV0cmlldmUgdGhpcyBub2RlcyB7QGxpbmsgQ29tcG9uZW50VHJhbnNmb3JtfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNtcFRyYW5zZm9ybSgpOiBDb21wb25lbnRUcmFuc2Zvcm0ge1xyXG4gICAgICByZXR1cm4gPENvbXBvbmVudFRyYW5zZm9ybT50aGlzLmdldENvbXBvbmVudHMoQ29tcG9uZW50VHJhbnNmb3JtKT8uWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvcnRjdXQgdG8gcmV0cmlldmUgdGhlIGxvY2FsIHtAbGluayBNYXRyaXg0eDR9IGF0dGFjaGVkIHRvIHRoaXMgbm9kZXMge0BsaW5rIENvbXBvbmVudFRyYW5zZm9ybX0gIFxyXG4gICAgICogRmFpbHMgaWYgbm8ge0BsaW5rIENvbXBvbmVudFRyYW5zZm9ybX0gaXMgYXR0YWNoZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhMb2NhbCgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gdGhpcy5jbXBUcmFuc2Zvcm0/Lm10eExvY2FsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbXR4V29ybGRJbnZlcnNlKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhXb3JsZEludmVyc2VVcGRhdGVkICE9IHRoaXMudGltZXN0YW1wVXBkYXRlKVxyXG4gICAgICAgIHRoaXMuI210eFdvcmxkSW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4V29ybGQpO1xyXG5cclxuICAgICAgdGhpcy4jbXR4V29ybGRJbnZlcnNlVXBkYXRlZCA9IHRoaXMudGltZXN0YW1wVXBkYXRlO1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4V29ybGRJbnZlcnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGF0dGFjaGVkIHRvIHRoaXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBuQ2hpbGRyZW4oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdG9yIHlpZWxkaW5nIHRoZSBub2RlIGFuZCBhbGwgZGVjZW5kYW50cyBpbiB0aGUgZ3JhcGggYmVsb3cgZm9yIGl0ZXJhdGlvblxyXG4gICAgICogSW5hY3RpdmUgbm9kZXMgYW5kIHRoZWlyIGRlc2NlbmRhbnRzIGNhbiBiZSBmaWx0ZXJlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgKiBnZXRJdGVyYXRvcihfYWN0aXZlOiBib29sZWFuID0gZmFsc2UpOiBJdGVyYWJsZUl0ZXJhdG9yPE5vZGU+IHtcclxuICAgICAgaWYgKCFfYWN0aXZlIHx8IHRoaXMuaXNBY3RpdmUpIHtcclxuICAgICAgICB5aWVsZCB0aGlzO1xyXG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXHJcbiAgICAgICAgICB5aWVsZCogY2hpbGQuZ2V0SXRlcmF0b3IoX2FjdGl2ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGlzIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgaW4gdGhlIGdyYXBoIGJlbG93XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPE5vZGU+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlcmF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlLSAvIEFjdGl2YXRlIHRoaXMgbm9kZS4gSW5hY3RpdmUgbm9kZXMgd2lsbCBub3QgYmUgcHJvY2Vzc2VkIGJ5IHRoZSByZW5kZXJlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICB0aGlzLmFjdGl2ZSA9IF9vbjtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChfb24gPyBFVkVOVC5OT0RFX0FDVElWQVRFIDogRVZFTlQuTk9ERV9ERUFDVElWQVRFLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICB0aGlzLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChfb24gPyBFVkVOVC5OT0RFX0FDVElWQVRFIDogRVZFTlQuTk9ERV9ERUFDVElWQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gI3JlZ2lvbiBTY2VuZXRyZWVcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGlzIG5vZGVzIHBhcmVudCBub2RlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYXJlbnQoKTogTm9kZSB8IG51bGwge1xyXG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFjZXMgYmFjayB0aGUgYW5jZXN0b3JzIG9mIHRoaXMgbm9kZSBhbmQgcmV0dXJucyB0aGUgZmlyc3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFuY2VzdG9yKCk6IE5vZGUgfCBudWxsIHtcclxuICAgICAgbGV0IGFuY2VzdG9yOiBOb2RlID0gdGhpcztcclxuICAgICAgd2hpbGUgKGFuY2VzdG9yLmdldFBhcmVudCgpKVxyXG4gICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50KCk7XHJcbiAgICAgIHJldHVybiBhbmNlc3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNlcyB0aGUgaGllcmFyY2h5IHVwd2FyZHMgdG8gdGhlIGZpcnN0IGFuY2VzdG9yIGFuZCByZXR1cm5zIHRoZSBwYXRoIHRocm91Z2ggdGhlIGdyYXBoIHRvIHRoaXMgbm9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UGF0aCgpOiBOb2RlW10ge1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSB0aGlzO1xyXG4gICAgICBsZXQgcGF0aDogTm9kZVtdID0gW3RoaXNdO1xyXG4gICAgICB3aGlsZSAoYW5jZXN0b3IuZ2V0UGFyZW50KCkpXHJcbiAgICAgICAgcGF0aC51bnNoaWZ0KGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50KCkpO1xyXG4gICAgICByZXR1cm4gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgY2hpbGQgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDaGlsZChfaW5kZXg6IG51bWJlcik6IE5vZGUge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltfaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNsb25lIG9mIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDaGlsZHJlbigpOiBOb2RlW10ge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5zbGljZSgwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVmZXJlbmNlcyB0byBjaGlsZG5vZGVzIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q2hpbGRyZW5CeU5hbWUoX25hbWU6IHN0cmluZyk6IE5vZGVbXSB7XHJcbiAgICAgIGxldCBmb3VuZDogTm9kZVtdID0gW107XHJcbiAgICAgIGZvdW5kID0gdGhpcy5jaGlsZHJlbi5maWx0ZXIoKF9ub2RlOiBOb2RlKSA9PiBfbm9kZS5uYW1lID09IF9uYW1lKTtcclxuICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2ltcGx5IGNhbGxzIHtAbGluayBhZGRDaGlsZH0uIFRoaXMgcmVmZXJlbmNlIGlzIGhlcmUgc29sZWx5IGJlY2F1c2UgYXBwZW5kQ2hpbGQgaXMgdGhlIGVxdWl2YWxlbnQgbWV0aG9kIGluIERPTS5cclxuICAgICAqIFNlZSBhbmQgcHJlZmVyYWJseSB1c2Uge0BsaW5rIGFkZENoaWxkfVxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGFwcGVuZENoaWxkOiAoX2NoaWxkOiBOb2RlKSA9PiB2b2lkID0gdGhpcy5hZGRDaGlsZDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoZSBnaXZlbiByZWZlcmVuY2UgdG8gYSBub2RlIHRvIHRoZSBsaXN0IG9mIGNoaWxkcmVuLCBpZiBub3QgYWxyZWFkeSBpblxyXG4gICAgICogQHRocm93cyBFcnJvciB3aGVuIHRyeWluZyB0byBhZGQgYW4gYW5jZXN0b3Igb2YgdGhpcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZENoaWxkKF9jaGlsZDogTm9kZSk6IHZvaWQ7XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHJlZmVyZW5jZSB0byBhIG5vZGUgdG8gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gYXQgdGhlIGdpdmVuIGluZGV4LiBJZiBpdCBpcyBhbHJlYWR5IGEgY2hpbGQsIGl0IGlzIG1vdmVkIHRvIHRoZSBuZXcgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDaGlsZChfY2hpbGQ6IE5vZGUsIF9pbmRleDogbnVtYmVyKTogdm9pZDtcclxuICAgIHB1YmxpYyBhZGRDaGlsZChfY2hpbGQ6IE5vZGUsIF9pbmRleD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBpZiAodGhpcy5jaGlsZHJlbi5pbmNsdWRlcyhfY2hpbGQpICYmIF9pbmRleCA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgLy8gX25vZGUgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIHRoaXNcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgaW5BdWRpb0dyYXBoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBncmFwaExpc3RlbmVkOiBOb2RlID0gQXVkaW9NYW5hZ2VyLmRlZmF1bHQuZ2V0R3JhcGhMaXN0ZW5pbmdUbygpO1xyXG4gICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSB0aGlzO1xyXG4gICAgICB3aGlsZSAoYW5jZXN0b3IpIHtcclxuICAgICAgICBhbmNlc3Rvci50aW1lc3RhbXBVcGRhdGUgPSAwO1xyXG4gICAgICAgIGluQXVkaW9HcmFwaCA9IGluQXVkaW9HcmFwaCB8fCAoYW5jZXN0b3IgPT0gZ3JhcGhMaXN0ZW5lZCk7XHJcbiAgICAgICAgaWYgKGFuY2VzdG9yID09IF9jaGlsZClcclxuICAgICAgICAgIHRocm93IChuZXcgRXJyb3IoXCJDeWNsaWMgcmVmZXJlbmNlIHByb2hpYml0ZWQgaW4gbm9kZSBoaWVyYXJjaHksIGFuY2VzdG9ycyBtdXN0IG5vdCBiZSBhZGRlZCBhcyBjaGlsZHJlblwiKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwcmV2aW91c1BhcmVudDogTm9kZSA9IF9jaGlsZC5wYXJlbnQ7XHJcbiAgICAgIGlmIChwcmV2aW91c1BhcmVudCA9PSB0aGlzICYmIF9pbmRleCA+IHByZXZpb3VzUGFyZW50LmZpbmRDaGlsZChfY2hpbGQpKVxyXG4gICAgICAgIF9pbmRleC0tO1xyXG5cclxuICAgICAgaWYgKHByZXZpb3VzUGFyZW50KVxyXG4gICAgICAgIHByZXZpb3VzUGFyZW50LnJlbW92ZUNoaWxkKF9jaGlsZCk7XHJcblxyXG4gICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShfaW5kZXggPz8gdGhpcy5jaGlsZHJlbi5sZW5ndGgsIDAsIF9jaGlsZCk7XHJcbiAgICAgIF9jaGlsZC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICBfY2hpbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuQ0hJTERfQVBQRU5ELCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICBpZiAoaW5BdWRpb0dyYXBoKVxyXG4gICAgICAgIF9jaGlsZC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5EKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGdpdmUgbm9kZSBmcm9tIHRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDaGlsZChfY2hpbGQ6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSB0aGlzLmZpbmRDaGlsZChfY2hpbGQpO1xyXG4gICAgICBpZiAoZm91bmQgPCAwKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIF9jaGlsZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5DSElMRF9SRU1PVkUsIHsgYnViYmxlczogdHJ1ZSB9KSk7XHJcbiAgICAgIF9jaGlsZC5icm9hZGNhc3RFdmVudChuZXcgRXZlbnQoRVZFTlQuTk9ERV9ERUFDVElWQVRFKSk7XHJcbiAgICAgIGlmICh0aGlzLmlzRGVzY2VuZGFudE9mKEF1ZGlvTWFuYWdlci5kZWZhdWx0LmdldEdyYXBoTGlzdGVuaW5nVG8oKSkpXHJcbiAgICAgICAgX2NoaWxkLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVF9BVURJTy5DSElMRF9SRU1PVkUpKTtcclxuICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoZm91bmQsIDEpO1xyXG4gICAgICBfY2hpbGQucGFyZW50ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUFsbENoaWxkcmVuKCk6IHZvaWQge1xyXG4gICAgICB3aGlsZSAodGhpcy5jaGlsZHJlbi5sZW5ndGgpXHJcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmNoaWxkcmVuWzBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9yIC0xIGlmIG5vdCBmb3VuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZENoaWxkKF9zZWFyY2g6IE5vZGUpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5pbmRleE9mKF9zZWFyY2gpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgYSBjaGlsZCBub2RlIHdpdGggYW5vdGhlciwgcHJlc2VydmluZyB0aGUgcG9zaXRpb24gaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlcGxhY2VDaGlsZChfcmVwbGFjZTogTm9kZSwgX3dpdGg6IE5vZGUpOiBib29sZWFuIHtcclxuICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSB0aGlzLmZpbmRDaGlsZChfcmVwbGFjZSk7XHJcbiAgICAgIGlmIChmb3VuZCA8IDApXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgbGV0IHByZXZpb3VzUGFyZW50OiBOb2RlID0gX3dpdGguZ2V0UGFyZW50KCk7XHJcbiAgICAgIGlmIChwcmV2aW91c1BhcmVudClcclxuICAgICAgICBwcmV2aW91c1BhcmVudC5yZW1vdmVDaGlsZChfd2l0aCk7XHJcblxyXG4gICAgICBfcmVwbGFjZS5wYXJlbnQgPSBudWxsO1xyXG4gICAgICB0aGlzLmNoaWxkcmVuW2ZvdW5kXSA9IF93aXRoO1xyXG4gICAgICBfd2l0aC5wYXJlbnQgPSB0aGlzO1xyXG5cclxuICAgICAgX3dpdGguZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuQ0hJTERfQVBQRU5ELCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICBpZiAodGhpcy5pc0Rlc2NlbmRhbnRPZihBdWRpb01hbmFnZXIuZGVmYXVsdC5nZXRHcmFwaExpc3RlbmluZ1RvKCkpKVxyXG4gICAgICAgIF93aXRoLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVF9BVURJTy5DSElMRF9BUFBFTkQpKTtcclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0aW1lc3RhbXAgbWF0Y2hlcyB0aGUgbGFzdCB1cGRhdGUgdGltZXN0YW1wIHRoaXMgbm9kZSB1bmRlcndlbnQsIGVsc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzVXBkYXRlZChfdGltZXN0YW1wVXBkYXRlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuICh0aGlzLnRpbWVzdGFtcFVwZGF0ZSA9PSBfdGltZXN0YW1wVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgZ2l2ZW4gbm9kZSwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgZWxzZSBmYWxzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNEZXNjZW5kYW50T2YoX2FuY2VzdG9yOiBOb2RlKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBub2RlOiBOb2RlID0gdGhpcztcclxuICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPSBfYW5jZXN0b3IpXHJcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50O1xyXG4gICAgICByZXR1cm4gKG5vZGUgIT0gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIGEgTXV0YXRvciBmcm9tIHtAbGluayBBbmltYXRpb259IHRvIGFsbCBpdHMgY29tcG9uZW50cyBhbmQgdHJhbnNmZXJzIGl0IHRvIGl0cyBjaGlsZHJlbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFwcGx5QW5pbWF0aW9uKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGlmIChcImNvbXBvbmVudHNcIiBpbiBfbXV0YXRvcikge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50VHlwZSBpbiBfbXV0YXRvci5jb21wb25lbnRzKSB7XHJcbiAgICAgICAgICBsZXQgY29tcG9uZW50c09mVHlwZTogQ29tcG9uZW50W10gPSB0aGlzLmNvbXBvbmVudHNbY29tcG9uZW50VHlwZV07IC8vIFRPRE86IGFkZCBlcnJvcnMgaWYgbm9kZSBkb2Vzbid0IGNvbnRhaW4gcHJvcGVydHlcclxuICAgICAgICAgIGxldCBtdXRhdG9yc0ZvclR5cGU6IE11dGF0b3JbXSA9IF9tdXRhdG9yLmNvbXBvbmVudHNbY29tcG9uZW50VHlwZV07XHJcbiAgICAgICAgICBpZiAoY29tcG9uZW50c09mVHlwZSAhPSB1bmRlZmluZWQgJiYgbXV0YXRvcnNGb3JUeXBlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gbXV0YXRvcnNGb3JUeXBlKSB7XHJcbiAgICAgICAgICAgICAgY29tcG9uZW50c09mVHlwZVtpXS5tdXRhdGUobXV0YXRvcnNGb3JUeXBlW2ldLCBudWxsLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFwiY2hpbGRyZW5cIiBpbiBfbXV0YXRvcikge1xyXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGROYW1lIGluIF9tdXRhdG9yLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiB0aGlzLmdldENoaWxkcmVuQnlOYW1lKGNoaWxkTmFtZSkpIHtcclxuICAgICAgICAgICAgY2hpbGROb2RlLmFwcGx5QW5pbWF0aW9uKF9tdXRhdG9yLmNoaWxkcmVuW2NoaWxkTmFtZV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vICNyZWdpb24gQ29tcG9uZW50c1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY29tcG9uZW50cyBhdHRhY2hlZCB0byB0aGlzIG5vZGUsIGluZGVwZW5kZW50IG9mIHR5cGUuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QWxsQ29tcG9uZW50cygpOiBDb21wb25lbnRbXSB7XHJcbiAgICAgIGxldCBhbGw6IENvbXBvbmVudFtdID0gW107XHJcbiAgICAgIGZvciAobGV0IHR5cGUgaW4gdGhpcy5jb21wb25lbnRzKSB7XHJcbiAgICAgICAgYWxsID0gYWxsLmNvbmNhdCh0aGlzLmNvbXBvbmVudHNbdHlwZV0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhbGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhlIGxpc3Qgb2YgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gY2xhc3MgYXR0YWNoZWQgdG8gdGhpcyBub2RlLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbXBvbmVudHM8VCBleHRlbmRzIENvbXBvbmVudD4oX2NsYXNzOiBuZXcgKCkgPT4gVCk6IFRbXSB7XHJcbiAgICAgIHJldHVybiA8VFtdPih0aGlzLmNvbXBvbmVudHNbX2NsYXNzLm5hbWVdIHx8IFtdKS5zbGljZSgwKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZmlyc3QgY29tcG9udGVudCBmb3VuZCBvZiB0aGUgZ2l2ZW4gY2xhc3MgYXR0YWNoZWQgdGhpcyBub2RlIG9yIG51bGwsIGlmIGxpc3QgaXMgZW1wdHkgb3IgZG9lc24ndCBleGlzdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50PFQgZXh0ZW5kcyBDb21wb25lbnQ+KF9jbGFzczogbmV3ICgpID0+IFQpOiBUIHtcclxuICAgICAgbGV0IGxpc3Q6IFRbXSA9IDxUW10+dGhpcy5jb21wb25lbnRzW19jbGFzcy5uYW1lXTtcclxuICAgICAgaWYgKGxpc3QpXHJcbiAgICAgICAgcmV0dXJuIGxpc3RbMF07XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0YWNoIHRoZSBnaXZlbiBjb21wb25lbnQgdG8gdGhpcyBub2RlLiBJZGVudGljYWwgdG8ge0BsaW5rIGFkZENvbXBvbmVudH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGF0dGFjaChfY29tcG9uZW50OiBDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgdGhpcy5hZGRDb21wb25lbnQoX2NvbXBvbmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRhY2ggdGhlIGdpdmVuIGNvbXBvbmVudCB0byB0aGlzIG5vZGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZENvbXBvbmVudChfY29tcG9uZW50OiBDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgaWYgKF9jb21wb25lbnQubm9kZSA9PSB0aGlzKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgbGV0IGNtcExpc3Q6IENvbXBvbmVudFtdID0gdGhpcy5jb21wb25lbnRzW19jb21wb25lbnQudHlwZV07XHJcbiAgICAgIGlmIChjbXBMaXN0ID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRzW19jb21wb25lbnQudHlwZV0gPSBbX2NvbXBvbmVudF07XHJcbiAgICAgIGVsc2UgaWYgKGNtcExpc3QubGVuZ3RoICYmIF9jb21wb25lbnQuaXNTaW5nbGV0b24pXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgJHtfY29tcG9uZW50LnR5cGV9IGlzIG1hcmtlZCBzaW5nbGV0b24gYW5kIGNhbid0IGJlIGF0dGFjaGVkLCBubyBtb3JlIHRoYW4gb25lIGFsbG93ZWRgKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGNtcExpc3QucHVzaChfY29tcG9uZW50KTtcclxuXHJcbiAgICAgIF9jb21wb25lbnQuYXR0YWNoVG9Ob2RlKHRoaXMpO1xyXG4gICAgICBfY29tcG9uZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULkNPTVBPTkVOVF9BREQpKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50VG9UYXJnZXRPbmx5KG5ldyBDdXN0b21FdmVudChFVkVOVC5DT01QT05FTlRfQURELCB7IGRldGFpbDogX2NvbXBvbmVudCB9KSk7IC8vIFRPRE86IHNlZSBpZiB0aGlzIGlzIGJlIGZlYXNhYmxlXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRhY2ggdGhlIGdpdmVuIGNvbXBvbmVudCBmcm9tIHRoaXMgbm9kZS4gSWRlbnRpY2FsIHRvIHtAbGluayByZW1vdmVDb21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZXRhY2goX2NvbXBvbmVudDogQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KF9jb21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbGwgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gY2xhc3MgYXR0YWNoZWQgdG8gdGhpcyBub2RlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlQ29tcG9uZW50cyhfY2xhc3M6IG5ldyAoKSA9PiBDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nZXRDb21wb25lbnRzKF9jbGFzcykuZm9yRWFjaChfY29tcG9uZW50ID0+IHRoaXMucmVtb3ZlQ29tcG9uZW50KF9jb21wb25lbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb21wb25lbnQgZnJvbSB0aGUgbm9kZSwgaWYgaXQgd2FzIGF0dGFjaGVkLCBhbmQgc2V0cyBpdHMgcGFyZW50IHRvIG51bGwuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlQ29tcG9uZW50KF9jb21wb25lbnQ6IENvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBjb21wb25lbnRzT2ZUeXBlOiBDb21wb25lbnRbXSA9IHRoaXMuY29tcG9uZW50c1tfY29tcG9uZW50LnR5cGVdO1xyXG4gICAgICAgIGxldCBmb3VuZEF0OiBudW1iZXIgPSBjb21wb25lbnRzT2ZUeXBlLmluZGV4T2YoX2NvbXBvbmVudCk7XHJcbiAgICAgICAgaWYgKGZvdW5kQXQgPCAwKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIF9jb21wb25lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSkpO1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudFRvVGFyZ2V0T25seShuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgeyBkZXRhaWw6IF9jb21wb25lbnQgfSkpOyAvLyBUT0RPOiBzZWUgaWYgdGhpcyB3b3VsZCBiZSBmZWFzYWJsZVxyXG4gICAgICAgIGNvbXBvbmVudHNPZlR5cGUuc3BsaWNlKGZvdW5kQXQsIDEpO1xyXG4gICAgICAgIF9jb21wb25lbnQuYXR0YWNoVG9Ob2RlKG51bGwpO1xyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZW1vdmUgY29tcG9uZW50ICcke19jb21wb25lbnR9J2luIG5vZGUgbmFtZWQgJyR7dGhpcy5uYW1lfSdgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vICNyZWdpb24gU2VyaWFsaXphdGlvblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGFjdGl2ZTogdGhpcy5hY3RpdmVcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGxldCBjb21wb25lbnRzOiBTZXJpYWxpemF0aW9uID0ge307XHJcbiAgICAgIGZvciAobGV0IHR5cGUgaW4gdGhpcy5jb21wb25lbnRzKSB7XHJcbiAgICAgICAgY29tcG9uZW50c1t0eXBlXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHNbdHlwZV0pIHtcclxuICAgICAgICAgIC8vIGNvbXBvbmVudHNbdHlwZV0ucHVzaChjb21wb25lbnQuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgICAgY29tcG9uZW50c1t0eXBlXS5wdXNoKFNlcmlhbGl6ZXIuc2VyaWFsaXplKGNvbXBvbmVudCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzZXJpYWxpemF0aW9uW1wiY29tcG9uZW50c1wiXSA9IGNvbXBvbmVudHM7XHJcblxyXG4gICAgICBsZXQgY2hpbGRyZW46IFNlcmlhbGl6YXRpb25bXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChTZXJpYWxpemVyLnNlcmlhbGl6ZShjaGlsZCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bXCJjaGlsZHJlblwiXSA9IGNoaWxkcmVuO1xyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5OT0RFX1NFUklBTElaRUQpKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgLy8gdGhpcy5wYXJlbnQgPSBpcyBzZXQgd2hlbiB0aGUgbm9kZXMgYXJlIGFkZGVkXHJcblxyXG4gICAgICAvLyBkZXNlcmlhbGl6ZSBjb21wb25lbnRzIGZpcnN0IHNvIHNjcmlwdHMgY2FuIHJlYWN0IHRvIGNoaWxkcmVuIGJlaW5nIGFwcGVuZGVkXHJcbiAgICAgIGZvciAobGV0IHR5cGUgaW4gX3NlcmlhbGl6YXRpb24uY29tcG9uZW50cykge1xyXG4gICAgICAgIGZvciAobGV0IHNlcmlhbGl6ZWRDb21wb25lbnQgb2YgX3NlcmlhbGl6YXRpb24uY29tcG9uZW50c1t0eXBlXSkge1xyXG4gICAgICAgICAgbGV0IGRlc2VyaWFsaXplZENvbXBvbmVudDogQ29tcG9uZW50ID0gPENvbXBvbmVudD5hd2FpdCBTZXJpYWxpemVyLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWRDb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQoZGVzZXJpYWxpemVkQ29tcG9uZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5jaGlsZHJlbilcclxuICAgICAgICBmb3IgKGxldCBzZXJpYWxpemVkQ2hpbGQgb2YgX3NlcmlhbGl6YXRpb24uY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGxldCBkZXNlcmlhbGl6ZWRDaGlsZDogTm9kZSA9IDxOb2RlPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoc2VyaWFsaXplZENoaWxkKTtcclxuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZGVzZXJpYWxpemVkQ2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQpKTtcclxuICAgICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0QWxsQ29tcG9uZW50cygpKVxyXG4gICAgICAgIGNvbXBvbmVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5OT0RFX0RFU0VSSUFMSVpFRCkpO1xyXG5cclxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgaWYgdGhpcyBpcyBhIGdvb2QgaWRlYVxyXG4gICAgICAvLyBjb25zdCBobmRHcmFwaERlc2VyaWFsaXplZDogRXZlbnRMaXN0ZW5lclVuaWZpZWQgPSAoKSA9PiB7XHJcbiAgICAgIC8vICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0QWxsQ29tcG9uZW50cygpKVxyXG4gICAgICAvLyAgICAgY29tcG9uZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgeyBidWJibGVzOiBmYWxzZSB9KSk7XHJcbiAgICAgIC8vICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAvLyAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HUkFQSF9JTlNUQU5USUFURUQsIGhuZEdyYXBoRGVzZXJpYWxpemVkLCB0cnVlKTtcclxuICAgICAgLy8gfTtcclxuICAgICAgLy8gdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAvLyB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR1JBUEhfSU5TVEFOVElBVEVELCBobmRHcmFwaERlc2VyaWFsaXplZCwgdHJ1ZSk7XHJcblxyXG4gICAgICB0aGlzLmFjdGl2YXRlKF9zZXJpYWxpemF0aW9uLmFjdGl2ZSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHN0cmluZyBhcyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9IaWVyYXJjaHlTdHJpbmcoX25vZGU6IE5vZGUgPSBudWxsLCBfbGV2ZWw6IG51bWJlciA9IDApOiBzdHJpbmcge1xyXG4gICAgICAvLyBUT0RPOiByZWZhY3RvciBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5XHJcbiAgICAgIGlmICghX25vZGUpXHJcbiAgICAgICAgX25vZGUgPSB0aGlzO1xyXG5cclxuICAgICAgbGV0IHByZWZpeDogc3RyaW5nID0gXCIrXCIucmVwZWF0KF9sZXZlbCk7XHJcblxyXG4gICAgICBsZXQgb3V0cHV0OiBzdHJpbmcgPSBwcmVmaXggKyBcIiBcIiArIF9ub2RlLm5hbWUgKyBcIiB8IFwiO1xyXG4gICAgICBmb3IgKGxldCB0eXBlIGluIF9ub2RlLmNvbXBvbmVudHMpXHJcbiAgICAgICAgb3V0cHV0ICs9IF9ub2RlLmNvbXBvbmVudHNbdHlwZV0ubGVuZ3RoICsgXCIgXCIgKyB0eXBlLnNwbGl0KFwiQ29tcG9uZW50XCIpLnBvcCgpICsgXCIsIFwiO1xyXG4gICAgICBvdXRwdXQgPSBvdXRwdXQuc2xpY2UoMCwgLTIpICsgXCI8L2JyPlwiO1xyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBfbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgIG91dHB1dCArPSB0aGlzLnRvSGllcmFyY2h5U3RyaW5nKGNoaWxkLCBfbGV2ZWwgKyAxKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vICNyZWdpb24gRXZlbnRzXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUuIFRoZSBnaXZlbiBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBtYXRjaGluZyBldmVudCBpcyBwYXNzZWQgdG8gdGhlIG5vZGUuXHJcbiAgICAgKiBEZXZpYXRpbmcgZnJvbSB0aGUgc3RhbmRhcmQgRXZlbnRUYXJnZXQsIGhlcmUgdGhlIF9oYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiBhbmQgX2NhcHR1cmUgaXMgdGhlIG9ubHkgb3B0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihfdHlwZTogRVZFTlQgfCBzdHJpbmcsIF9oYW5kbGVyOiBFdmVudExpc3RlbmVyVW5pZmllZCwgX2NhcHR1cmU6IGJvb2xlYW4gLyp8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKi8gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICBsZXQgbGlzdExpc3RlbmVyczogTWFwRXZlbnRUeXBlVG9MaXN0ZW5lciA9IF9jYXB0dXJlID8gdGhpcy5jYXB0dXJlcyA6IHRoaXMubGlzdGVuZXJzO1xyXG4gICAgICBpZiAoIWxpc3RMaXN0ZW5lcnNbX3R5cGVdKVxyXG4gICAgICAgIGxpc3RMaXN0ZW5lcnNbX3R5cGVdID0gW107XHJcbiAgICAgIGxpc3RMaXN0ZW5lcnNbX3R5cGVdLnB1c2goX2hhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIG5vZGUuIFRoZSBzaWduYXR1cmUgbXVzdCBtYXRjaCB0aGUgb25lIHVzZWQgd2l0aCBhZGRFdmVudExpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKF90eXBlOiBFVkVOVCB8IHN0cmluZywgX2hhbmRsZXI6IEV2ZW50TGlzdGVuZXJVbmlmaWVkLCBfY2FwdHVyZTogYm9vbGVhbiAvKnwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMqLyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgIGxldCBsaXN0ZW5lcnNGb3JUeXBlOiBFdmVudExpc3RlbmVyVW5pZmllZFtdID0gX2NhcHR1cmUgPyB0aGlzLmNhcHR1cmVzW190eXBlXSA6IHRoaXMubGlzdGVuZXJzW190eXBlXTtcclxuICAgICAgaWYgKGxpc3RlbmVyc0ZvclR5cGUpXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gbGlzdGVuZXJzRm9yVHlwZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcclxuICAgICAgICAgIGlmIChsaXN0ZW5lcnNGb3JUeXBlW2ldID09IF9oYW5kbGVyKVxyXG4gICAgICAgICAgICBsaXN0ZW5lcnNGb3JUeXBlLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGF0Y2hlcyBhIHN5bnRoZXRpYyBldmVudCB0byB0YXJnZXQuIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgdHJ1ZSAoc3RhbmRhcmQ6IHJldHVybiB0cnVlIG9ubHkgaWYgZWl0aGVyIGV2ZW50J3MgY2FuY2VsYWJsZSBhdHRyaWJ1dGUgdmFsdWUgaXMgZmFsc2Ugb3IgaXRzIHByZXZlbnREZWZhdWx0KCkgbWV0aG9kIHdhcyBub3QgaW52b2tlZClcclxuICAgICAqIFRoZSBldmVudCB0cmF2ZWxzIGludG8gdGhlIGhpZXJhcmNoeSB0byB0aGlzIG5vZGUgZGlzcGF0Y2hpbmcgdGhlIGV2ZW50LCBpbnZva2luZyBtYXRjaGluZyBoYW5kbGVycyBvZiB0aGUgbm9kZXMgYW5jZXN0b3JzIGxpc3RlbmluZyB0byB0aGUgY2FwdHVyZSBwaGFzZSwgXHJcbiAgICAgKiB0aGFuIHRoZSBtYXRjaGluZyBoYW5kbGVyIG9mIHRoZSB0YXJnZXQgbm9kZSBpbiB0aGUgdGFyZ2V0IHBoYXNlLCBhbmQgYmFjayBvdXQgb2YgdGhlIGhpZXJhcmNoeSBpbiB0aGUgYnViYmxpbmcgcGhhc2UsIGludm9raW5nIGFwcHJvcHJpYXRlIGhhbmRsZXJzIG9mIHRoZSBhbnZlc3RvcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQoX2V2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgYW5jZXN0b3JzOiBOb2RlW10gPSBbXTtcclxuICAgICAgbGV0IHVwY29taW5nOiBOb2RlID0gdGhpcztcclxuICAgICAgLy8gb3ZlcndyaXRlIGV2ZW50IHRhcmdldFxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcInRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgUmVmbGVjdCBpbnN0ZWFkIG9mIE9iamVjdCB0aHJvdWdob3V0LiBTZWUgYWxzbyBSZW5kZXIgYW5kIE11dGFibGUuLi5cclxuICAgICAgd2hpbGUgKHVwY29taW5nLnBhcmVudClcclxuICAgICAgICBhbmNlc3RvcnMucHVzaCh1cGNvbWluZyA9IHVwY29taW5nLnBhcmVudCk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwicGF0aFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbmV3IEFycmF5PE5vZGU+KHRoaXMsIC4uLmFuY2VzdG9ycykgfSk7XHJcblxyXG4gICAgICAvLyBjYXB0dXJlIHBoYXNlXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiZXZlbnRQaGFzZVwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogRXZlbnQuQ0FQVFVSSU5HX1BIQVNFIH0pO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBhbmNlc3RvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBsZXQgYW5jZXN0b3I6IE5vZGUgPSBhbmNlc3RvcnNbaV07XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJjdXJyZW50VGFyZ2V0XCIsIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBhbmNlc3RvciB9KTtcclxuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcnMoYW5jZXN0b3IuY2FwdHVyZXNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0YXJnZXQgcGhhc2VcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJldmVudFBoYXNlXCIsIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBFdmVudC5BVF9UQVJHRVQgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzKHRoaXMuY2FwdHVyZXNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG4gICAgICB0aGlzLmNhbGxMaXN0ZW5lcnModGhpcy5saXN0ZW5lcnNbX2V2ZW50LnR5cGVdLCBfZXZlbnQpO1xyXG5cclxuICAgICAgaWYgKCFfZXZlbnQuYnViYmxlcylcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIGJ1YmJsZSBwaGFzZVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImV2ZW50UGhhc2VcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IEV2ZW50LkJVQkJMSU5HX1BIQVNFIH0pO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGFuY2VzdG9yOiBOb2RlID0gYW5jZXN0b3JzW2ldO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogYW5jZXN0b3IgfSk7XHJcbiAgICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzKGFuY2VzdG9yLmxpc3RlbmVyc1tfZXZlbnQudHlwZV0sIF9ldmVudCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7IC8vVE9ETzogcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSwgc2VlIGRvY3VtZW50YXRpb24gb2YgZGlzcGF0Y2ggZXZlbnRcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGF0Y2hlcyBhIHN5bnRoZXRpYyBldmVudCB0byB0YXJnZXQgd2l0aG91dCB0cmF2ZWxsaW5nIHRocm91Z2ggdGhlIGdyYXBoIGhpZXJhcmNoeSBuZWl0aGVyIGR1cmluZyBjYXB0dXJlIG5vciBidWJibGluZyBwaGFzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcGF0Y2hFdmVudFRvVGFyZ2V0T25seShfZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiZXZlbnRQaGFzZVwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogRXZlbnQuQVRfVEFSR0VUIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImN1cnJlbnRUYXJnZXRcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMgfSk7XHJcbiAgICAgIHRoaXMuY2FsbExpc3RlbmVycyh0aGlzLmxpc3RlbmVyc1tfZXZlbnQudHlwZV0sIF9ldmVudCk7IC8vIFRPRE86IGV4YW1pbmUgaWYgdGhpcyBzaG91bGQgZ28gdG8gdGhlIGNhcHR1cmVzIGluc3RlYWQgb2YgdGhlIGxpc3RlbmVyc1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQnJvYWRjYXN0cyBhIHN5bnRoZXRpYyBldmVudCB0byB0aGlzIG5vZGUgYW5kIGZyb20gdGhlcmUgdG8gYWxsIG5vZGVzIGRlZXBlciBpbiB0aGUgaGllcmFyY2h5LFxyXG4gICAgICogaW52b2tpbmcgbWF0Y2hpbmcgaGFuZGxlcnMgb2YgdGhlIG5vZGVzIGxpc3RlbmluZyB0byB0aGUgY2FwdHVyZSBwaGFzZS4gV2F0Y2ggcGVyZm9ybWFuY2Ugd2hlbiB0aGVyZSBhcmUgbWFueSBub2RlcyBpbnZvbHZlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYnJvYWRjYXN0RXZlbnQoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAvLyBvdmVyd3JpdGUgZXZlbnQgdGFyZ2V0IGFuZCBwaGFzZVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V2ZW50LCBcImV2ZW50UGhhc2VcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IEV2ZW50LkNBUFRVUklOR19QSEFTRSB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9ldmVudCwgXCJ0YXJnZXRcIiwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHRoaXMgfSk7XHJcbiAgICAgIHRoaXMuYnJvYWRjYXN0RXZlbnRSZWN1cnNpdmUoX2V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJyb2FkY2FzdEV2ZW50UmVjdXJzaXZlKF9ldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgLy8gY2FwdHVyZSBwaGFzZSBvbmx5XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXZlbnQsIFwiY3VycmVudFRhcmdldFwiLCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdGhpcyB9KTtcclxuICAgICAgbGV0IGNhcHR1cmVzOiBFdmVudExpc3RlbmVyVW5pZmllZFtdID0gdGhpcy5jYXB0dXJlc1tfZXZlbnQudHlwZV0gfHwgW107XHJcbiAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgY2FwdHVyZXMpXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGhhbmRsZXIoX2V2ZW50KTtcclxuICAgICAgLy8gYXBwZWFycyB0byBiZSBzbG93ZXIsIGFzdG9uaXNoaW5nbHkuLi5cclxuICAgICAgLy8gY2FwdHVyZXMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgLy8gICAgIGhhbmRsZXIoX2V2ZW50KTtcclxuICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAvLyBzYW1lIGZvciBjaGlsZHJlblxyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY2hpbGQuYnJvYWRjYXN0RXZlbnRSZWN1cnNpdmUoX2V2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsbExpc3RlbmVycyhfbGlzdGVuZXJzOiBFdmVudExpc3RlbmVyVW5pZmllZFtdLCBfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIGlmIChfbGlzdGVuZXJzPy5sZW5ndGggPiAwKVxyXG4gICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgX2xpc3RlbmVycylcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIGhhbmRsZXIoX2V2ZW50KTtcclxuICAgIH1cclxuICAgIC8vICNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RyYW5zZmVyL1NlcmlhbGl6ZXIudHNcIi8+XHJcbi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVHJhbnNmZXIvTXV0YWJsZS50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqIFxyXG4gICAqIFN1cGVyY2xhc3MgZm9yIGFsbCB7QGxpbmsgQ29tcG9uZW50fXMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8ge0BsaW5rIE5vZGV9cy5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMCB8IEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5ICBcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHtcclxuICAgIC8qKiBzdWJjbGFzc2VzIGdldCBhIGlTdWJjbGFzcyBudW1iZXIgZm9yIGlkZW50aWZpY2F0aW9uICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyO1xyXG4gICAgLyoqIHJlZmVycyBiYWNrIHRvIHRoaXMgY2xhc3MgZnJvbSBhbnkgc3ViY2xhc3MgZS5nLiBpbiBvcmRlciB0byBmaW5kIGNvbXBhdGlibGUgb3RoZXIgcmVzb3VyY2VzKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYmFzZUNsYXNzOiB0eXBlb2YgQ29tcG9uZW50ID0gQ29tcG9uZW50O1xyXG4gICAgLyoqIGxpc3Qgb2YgYWxsIHRoZSBzdWJjbGFzc2VzIGRlcml2ZWQgZnJvbSB0aGlzIGNsYXNzLCBpZiB0aGV5IHJlZ2lzdGVyZWQgcHJvcGVybHkqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdWJjbGFzc2VzOiB0eXBlb2YgQ29tcG9uZW50W10gPSBbXTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgc2luZ2xldG9uOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByb3RlY3RlZCBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgI25vZGU6IE5vZGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5NVVRBVEUsIChfZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuI25vZGUpIHtcclxuICAgICAgICAgIC8vIFRPRE86IGZpbmQgdGhlIG51bWJlciBvZiB0aGUgY29tcG9uZW50IGluIHRoZSBhcnJheSBpZiBub3Qgc2luZ2xldG9uXHJcbiAgICAgICAgICBfZXZlbnQuZGV0YWlsLmNvbXBvbmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgIF9ldmVudC5kZXRhaWwuY29tcG9uZW50SW5kZXggPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50cyh0aGlzLmNvbnN0cnVjdG9yKS5pbmRleE9mKHRoaXMpO1xyXG4gICAgICAgICAgdGhpcy4jbm9kZS5kaXNwYXRjaEV2ZW50KF9ldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YmNsYXNzOiB0eXBlb2YgQ29tcG9uZW50KTogbnVtYmVyIHsgcmV0dXJuIENvbXBvbmVudC5zdWJjbGFzc2VzLnB1c2goX3N1YmNsYXNzKSAtIDE7IH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXMgdHJ1ZSwgd2hlbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGNsYXNzIGNhbiBiZSBhdHRhY2hlZCB0byBhIG5vZGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc1NpbmdsZXRvbigpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBub2RlLCB0aGlzIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgYXR0YWNoZWQgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBub2RlKCk6IE5vZGUgfCBudWxsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZS0gLyBBY3RpdmF0ZSB0aGlzIGNvbXBvbmVudC4gSW5hY3RpdmUgY29tcG9uZW50cyB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgYnkgdGhlIHJlbmRlcmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWN0aXZhdGUoX29uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYWN0aXZlID0gX29uO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KF9vbiA/IEVWRU5ULkNPTVBPTkVOVF9BQ1RJVkFURSA6IEVWRU5ULkNPTVBPTkVOVF9ERUFDVElWQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmllcyB0byBhdHRhY2ggdGhlIGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gbm9kZSwgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgbm9kZSBpdCB3YXMgYXR0YWNoZWQgdG8gaWYgYXBwbGljYWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXR0YWNoVG9Ob2RlKF9jb250YWluZXI6IE5vZGUgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLiNub2RlID09IF9jb250YWluZXIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBsZXQgcHJldmlvdXNDb250YWluZXI6IE5vZGUgPSB0aGlzLiNub2RlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChwcmV2aW91c0NvbnRhaW5lcilcclxuICAgICAgICAgIHByZXZpb3VzQ29udGFpbmVyLnJlbW92ZUNvbXBvbmVudCh0aGlzKTtcclxuICAgICAgICB0aGlzLiNub2RlID0gX2NvbnRhaW5lcjtcclxuICAgICAgICBpZiAodGhpcy4jbm9kZSlcclxuICAgICAgICAgIHRoaXMuI25vZGUuYWRkQ29tcG9uZW50KHRoaXMpO1xyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICB0aGlzLiNub2RlID0gcHJldmlvdXNDb250YWluZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRlIHRoaXMgdG8gZHJhdyB2aXN1YWwgYWlkcyBmb3IgdGhpcyBjb21wb25lbnQgaW5zaWRlIHRoZSBlZGl0b3JzIHJlbmRlciB2aWV3LiBVc2Uge0BsaW5rIEdpem1vc30gaW5zaWRlIHRoZSBvdmVycmlkZSB0byBkcmF3IHN0dWZmLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcz8oKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlZSB7QGxpbmsgZHJhd0dpem1vc30uIE9ubHkgZGlzcGxheWVkIHdoaWxlIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zU2VsZWN0ZWQ/KCk6IHZvaWQ7XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBhY3RpdmU6IHRoaXMuYWN0aXZlXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5hY3RpdmF0ZShfc2VyaWFsaXphdGlvbi5hY3RpdmUpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5hY3RpdmUpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYWN0aXZhdGUoX211dGF0b3IuYWN0aXZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2luZ2xldG9uO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubXR4V29ybGQ7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBXcmFwcyBhIHJlZ3VsYXIgSmF2YXNjcmlwdCBBcnJheSBhbmQgb2ZmZXJzIHZlcnkgbGltaXRlZCBmdW5jdGlvbmFsaXR5IGdlYXJlZCBzb2xlbHkgdG93YXJkcyBhdm9pZGluZyBnYXJiYWdlIGNvbGxldGlvbi5cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9SZWN5Y2xlclxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZWN5Y2FibGVBcnJheTxUPiB7XHJcbiAgICAjbGVuZ3RoOiBudW1iZXIgPSAwO1xyXG4gICAgI2FycmF5OiBBcnJheTxUPiA9IG5ldyBBcnJheTxUPigpO1xyXG4gICAgLy8gI3R5cGU6IG5ldyAoKSA9PiBUO1xyXG5cclxuICAgIC8vIC8vdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxyXG4gICAgLy8gY29uc3RydWN0b3IoX3R5cGU6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpIHtcclxuICAgIC8vICAgdGhpcy4jdHlwZSA9IF90eXBlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNsZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2aXJ0dWFsIGxlbmd0aCBvZiB0aGUgYXJyYXkgdG8gemVybyBidXQga2VlcHMgdGhlIGVudHJpZXMgYmV5b25kLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI2xlbmd0aCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWN5Y2xlIHRoaXMgYXJyYXlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGVuZHMgYSBuZXcgZW50cnkgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXksIGFuZCByZXR1cm5zIHRoZSBuZXcgbGVuZ3RoIG9mIHRoZSBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHB1c2goX2VudHJ5OiBUKTogbnVtYmVyIHtcclxuICAgICAgdGhpcy4jYXJyYXlbdGhpcy4jbGVuZ3RoXSA9IF9lbnRyeTtcclxuICAgICAgdGhpcy4jbGVuZ3RoKys7XHJcbiAgICAgIHJldHVybiB0aGlzLiNsZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBsYXN0IGVudHJ5IGZyb20gdGhlIGFycmF5IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9wKCk6IFQge1xyXG4gICAgICB0aGlzLiNsZW5ndGgtLTtcclxuICAgICAgcmV0dXJuIHRoaXMuI2FycmF5W3RoaXMuI2xlbmd0aF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWN5Y2xlcyB0aGUgb2JqZWN0IGZvbGxvd2luZyB0aGUgbGFzdCBpbiB0aGUgYXJyYXkgYW5kIGluY3JlYXNlcyB0aGUgYXJyYXkgbGVuZ3RoXHJcbiAgICAgKiBJdCBtdXN0IGJlIGFzc3VyZWQsIHRoYXQgbm9uZSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgYXJyYXkgaXMgc3RpbGwgaW4gYW55IHVzZSBvZiBhbnkga2luZCFcclxuICAgICAqL1xyXG4gICAgLy8gcHVibGljIHJlY3ljbGUoKTogVCB7XHJcbiAgICAvLyAgIGlmICh0aGlzLiNsZW5ndGggPCB0aGlzLiNhcnJheS5sZW5ndGgpIHtcclxuICAgIC8vICAgICB0aGlzLiNsZW5ndGgrKztcclxuICAgIC8vICAgICByZXR1cm4gdGhpcy4jYXJyYXlbdGhpcy4jbGVuZ3RoKytdO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHRoaXMuI2FycmF5LnB1c2goUmVjeWNsZXIuZ2V0KHRoaXMuI3R5cGUpKTtcclxuICAgIC8vICAgcmV0dXJuIHRoaXMuI2FycmF5W3RoaXMuI2xlbmd0aCsrXTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy4jbGVuZ3RoOyBpKyspXHJcbiAgICAgICAgeWllbGQgdGhpcy4jYXJyYXlbaV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgYXJyYXkgc29ydGVkIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29tcGFyZSBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U29ydGVkKF9zb3J0OiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKTogVFtdIHtcclxuICAgICAgbGV0IHNvcnRlZDogVFtdID0gdGhpcy4jYXJyYXkuc2xpY2UoMCwgdGhpcy4jbGVuZ3RoKTtcclxuICAgICAgc29ydGVkLnNvcnQoX3NvcnQpO1xyXG4gICAgICByZXR1cm4gc29ydGVkO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEJhc2VjbGFzcyBmb3Ige0BsaW5rIFJlbmRlckluamVjdG9yQ29hdH0gYW5kIHtAbGluayBSZW5kZXJJbmplY3RvclRleHR1cmV9XHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdHMgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIHdpdGggdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGdpdmVuIGluamVjdG9yLiBOYW1lIG9mIHRoZSBjb25zdHJ1Y3RvciBhbmQgdGhlIG5hbWUgb2YgdGhlIGluamVjdG9yIG1ldGhvZCBtdXN0IG1hdGNoLlxyXG4gICAgICogVXNlZCBpbiBzdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaW5qZWN0KF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24sIF9pbmplY3RvcjogdHlwZW9mIFJlbmRlckluamVjdG9yKTogdm9pZCB7XHJcbiAgICAgIGxldCBpbmplY3Rpb246IEZ1bmN0aW9uID0gUmVmbGVjdC5nZXQoX2luamVjdG9yLCBcImluamVjdFwiICsgX2NvbnN0cnVjdG9yLm5hbWUpO1xyXG4gICAgICBpZiAoIWluamVjdGlvbikge1xyXG4gICAgICAgIERlYnVnLmVycm9yKFwiTm8gaW5qZWN0aW9uIGRlY29yYXRvciBkZWZpbmVkIGZvciBcIiArIF9jb25zdHJ1Y3Rvci5uYW1lKTtcclxuICAgICAgfVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJ1c2VSZW5kZXJEYXRhXCIsIHtcclxuICAgICAgICB2YWx1ZTogaW5qZWN0aW9uXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBHaXZlcyBXZWJHTCBCdWZmZXIgdGhlIGRhdGEgZnJvbSB0aGUge0BsaW5rIFNoYWRlcn1cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVuZGVySW5qZWN0b3JTaGFkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGdpdmVuIHtAbGluayBTaGFkZXJ9LXN1YmNsYXNzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVjb3JhdGUoX2NvbnN0cnVjdG9yOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLCBcInVzZVByb2dyYW1cIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclNoYWRlci51c2VQcm9ncmFtXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLCBcImRlbGV0ZVByb2dyYW1cIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclNoYWRlci5kZWxldGVQcm9ncmFtXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLCBcImNyZWF0ZVByb2dyYW1cIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclNoYWRlci5jcmVhdGVQcm9ncmFtXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoaXMgcHJvZ3JhbSB0byB1c2UgYXMgdGhlIGFjdGl2ZSBwcm9ncmFtIGluIFdlYkdMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgdXNlUHJvZ3JhbSh0aGlzOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5wcm9ncmFtKVxyXG4gICAgICAgIHRoaXMuY3JlYXRlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNyYzMudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVsZXRlcyB0aGlzIHByb2dyYW0gZnJvbSBXZWJHTCwgY2xlYXJpbmcgdGhlIHVzZWQgbWVtb3J5IG9uIHRoZSBHUFUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVsZXRlUHJvZ3JhbSh0aGlzOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBpZiAodGhpcy5wcm9ncmFtKSB7XHJcbiAgICAgICAgY3JjMy5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuYXR0cmlidXRlcztcclxuICAgICAgICBkZWxldGUgdGhpcy51bmlmb3JtcztcclxuICAgICAgICBkZWxldGUgdGhpcy5wcm9ncmFtO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBjcmVhdGVQcm9ncmFtKHRoaXM6IHR5cGVvZiBTaGFkZXIpOiB2b2lkIHtcclxuICAgICAgRGVidWcuZnVkZ2UoXCJDcmVhdGUgc2hhZGVyIHByb2dyYW1cIiwgdGhpcy5uYW1lKTtcclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGxldCBwcm9ncmFtOiBXZWJHTFByb2dyYW0gPSBjcmMzLmNyZWF0ZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHNoZFZlcnRleDogV2ViR0xTaGFkZXIgPSBjb21waWxlU2hhZGVyKHRoaXMuZ2V0VmVydGV4U2hhZGVyU291cmNlKCksIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVkVSVEVYX1NIQURFUik7XHJcbiAgICAgICAgbGV0IHNoZEZyYWdtZW50OiBXZWJHTFNoYWRlciA9IGNvbXBpbGVTaGFkZXIodGhpcy5nZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQUdNRU5UX1NIQURFUik7XHJcblxyXG4gICAgICAgIGNyYzMuYXR0YWNoU2hhZGVyKHByb2dyYW0sIFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTFNoYWRlcj4oc2hkVmVydGV4KSk7XHJcbiAgICAgICAgY3JjMy5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMU2hhZGVyPihzaGRGcmFnbWVudCkpO1xyXG4gICAgICAgIGNyYzMubGlua1Byb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvcjogc3RyaW5nID0gUmVuZGVyV2ViR0wuYXNzZXJ0PHN0cmluZz4oY3JjMy5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSk7XHJcbiAgICAgICAgaWYgKGVycm9yICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBsaW5raW5nIFNoYWRlcjogXCIgKyBlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGRldGVjdEF0dHJpYnV0ZXMoKTtcclxuICAgICAgICB0aGlzLnVuaWZvcm1zID0gZGV0ZWN0VW5pZm9ybXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGVmaW5lLmluY2x1ZGVzKFwiU0tJTlwiKSkge1xyXG4gICAgICAgICAgY29uc3QgYmxvY2tJbmRleDogbnVtYmVyID0gY3JjMy5nZXRVbmlmb3JtQmxvY2tJbmRleChwcm9ncmFtLCBVTklGT1JNX0JMT0NLUy5TS0lOLk5BTUUpO1xyXG4gICAgICAgICAgY3JjMy51bmlmb3JtQmxvY2tCaW5kaW5nKHByb2dyYW0sIGJsb2NrSW5kZXgsIFVOSUZPUk1fQkxPQ0tTLlNLSU4uQklORElORyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kZWZpbmUuZmluZChfZGVmaW5lID0+IFtcIkZMQVRcIiwgXCJHT1VSQVVEXCIsIFwiUEhPTkdcIl0uaW5jbHVkZXMoX2RlZmluZSkpKSB7XHJcbiAgICAgICAgICBpZiAoIVJlbmRlcldlYkdMLnVib0xpZ2h0cylcclxuICAgICAgICAgICAgUmVuZGVyV2ViR0wudWJvTGlnaHRzID0gY3JlYXRlVUJPTGlnaHRzKCk7XHJcbiAgICAgICAgICBpZiAoIVJlbmRlcldlYkdMLnVib0xpZ2h0c1ZhcmlhYmxlT2Zmc2V0cylcclxuICAgICAgICAgICAgUmVuZGVyV2ViR0wudWJvTGlnaHRzVmFyaWFibGVPZmZzZXRzID0gZGV0ZWN0VUJPTGlnaHRzVmFyaWFibGVPZmZzZXRzKCk7XHJcblxyXG4gICAgICAgICAgLy8gYmluZCBsaWdodHMgVUJPIHRvIHNoYWRlciBwcm9ncmFtXHJcbiAgICAgICAgICBjb25zdCBibG9ja0luZGV4OiBudW1iZXIgPSBjcmMzLmdldFVuaWZvcm1CbG9ja0luZGV4KHByb2dyYW0sIFVOSUZPUk1fQkxPQ0tTLkxJR0hUUy5OQU1FKTtcclxuICAgICAgICAgIGNyYzMudW5pZm9ybUJsb2NrQmluZGluZyhwcm9ncmFtLCBibG9ja0luZGV4LCBVTklGT1JNX0JMT0NLUy5MSUdIVFMuQklORElORyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBibG9ja0luZGV4OiBudW1iZXIgPSBjcmMzLmdldFVuaWZvcm1CbG9ja0luZGV4KHByb2dyYW0sIFVOSUZPUk1fQkxPQ0tTLkZPRy5OQU1FKTtcclxuICAgICAgICBpZiAoYmxvY2tJbmRleCAhPSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LklOVkFMSURfSU5ERVgpXHJcbiAgICAgICAgICBjcmMzLnVuaWZvcm1CbG9ja0JpbmRpbmcocHJvZ3JhbSwgYmxvY2tJbmRleCwgVU5JRk9STV9CTE9DS1MuRk9HLkJJTkRJTkcpO1xyXG5cclxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XHJcbiAgICAgICAgRGVidWcuZXJyb3IoX2Vycm9yKTtcclxuICAgICAgICBkZWJ1Z2dlcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgZnVuY3Rpb24gY29tcGlsZVNoYWRlcihfc2hhZGVyQ29kZTogc3RyaW5nLCBfc2hhZGVyVHlwZTogR0xlbnVtKTogV2ViR0xTaGFkZXIgfCBudWxsIHtcclxuICAgICAgICBsZXQgd2ViR0xTaGFkZXI6IFdlYkdMU2hhZGVyID0gY3JjMy5jcmVhdGVTaGFkZXIoX3NoYWRlclR5cGUpO1xyXG4gICAgICAgIGNyYzMuc2hhZGVyU291cmNlKHdlYkdMU2hhZGVyLCBfc2hhZGVyQ29kZSk7XHJcbiAgICAgICAgY3JjMy5jb21waWxlU2hhZGVyKHdlYkdMU2hhZGVyKTtcclxuICAgICAgICBsZXQgZXJyb3I6IHN0cmluZyA9IFJlbmRlcldlYkdMLmFzc2VydDxzdHJpbmc+KGNyYzMuZ2V0U2hhZGVySW5mb0xvZyh3ZWJHTFNoYWRlcikpO1xyXG4gICAgICAgIGlmIChlcnJvciAhPT0gXCJcIikge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coX3NoYWRlckNvZGUpO1xyXG5cclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGNvbXBpbGluZyBzaGFkZXI6IFwiICsgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDaGVjayBmb3IgYW55IGNvbXBpbGF0aW9uIGVycm9ycy5cclxuICAgICAgICBpZiAoIWNyYzMuZ2V0U2hhZGVyUGFyYW1ldGVyKHdlYkdMU2hhZGVyLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTVBJTEVfU1RBVFVTKSkge1xyXG4gICAgICAgICAgYWxlcnQoY3JjMy5nZXRTaGFkZXJJbmZvTG9nKHdlYkdMU2hhZGVyKSk7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHdlYkdMU2hhZGVyO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBkZXRlY3RBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IG51bWJlciB9IHtcclxuICAgICAgICBsZXQgZGV0ZWN0ZWRBdHRyaWJ1dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGVDb3VudDogbnVtYmVyID0gY3JjMy5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQUNUSVZFX0FUVFJJQlVURVMpO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhdHRyaWJ1dGVDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgYXR0cmlidXRlSW5mbzogV2ViR0xBY3RpdmVJbmZvID0gUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMQWN0aXZlSW5mbz4oY3JjMy5nZXRBY3RpdmVBdHRyaWIocHJvZ3JhbSwgaSkpO1xyXG4gICAgICAgICAgaWYgKCFhdHRyaWJ1dGVJbmZvKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGRldGVjdGVkQXR0cmlidXRlc1thdHRyaWJ1dGVJbmZvLm5hbWVdID0gY3JjMy5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGVJbmZvLm5hbWUpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRldGVjdGVkQXR0cmlidXRlcztcclxuICAgICAgfVxyXG5cclxuICAgICAgZnVuY3Rpb24gZGV0ZWN0VW5pZm9ybXMoKTogeyBbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb24gfSB7XHJcbiAgICAgICAgbGV0IGRldGVjdGVkVW5pZm9ybXM6IHsgW25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9uIH0gPSB7fTtcclxuICAgICAgICBsZXQgdW5pZm9ybUNvdW50OiBudW1iZXIgPSBjcmMzLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BQ1RJVkVfVU5JRk9STVMpO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB1bmlmb3JtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGluZm86IFdlYkdMQWN0aXZlSW5mbyA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTEFjdGl2ZUluZm8+KGNyYzMuZ2V0QWN0aXZlVW5pZm9ybShwcm9ncmFtLCBpKSk7XHJcbiAgICAgICAgICBpZiAoIWluZm8pIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gY3JjMy5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgaW5mby5uYW1lKTtcclxuICAgICAgICAgIGlmIChsb2NhdGlvbilcclxuICAgICAgICAgICAgZGV0ZWN0ZWRVbmlmb3Jtc1tpbmZvLm5hbWVdID0gUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMVW5pZm9ybUxvY2F0aW9uPihsb2NhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkZXRlY3RlZFVuaWZvcm1zO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBjcmVhdGVVQk9MaWdodHMoKTogV2ViR0xCdWZmZXIge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrSW5kZXg6IG51bWJlciA9IGNyYzMuZ2V0VW5pZm9ybUJsb2NrSW5kZXgocHJvZ3JhbSwgVU5JRk9STV9CTE9DS1MuTElHSFRTLk5BTUUpO1xyXG4gICAgICAgIGNvbnN0IGJsb2NrU2l6ZTogbnVtYmVyID0gY3JjMy5nZXRBY3RpdmVVbmlmb3JtQmxvY2tQYXJhbWV0ZXIocHJvZ3JhbSwgYmxvY2tJbmRleCwgY3JjMy5VTklGT1JNX0JMT0NLX0RBVEFfU0laRSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHVibzogV2ViR0xCdWZmZXIgPSBSZW5kZXJXZWJHTC5hc3NlcnQoY3JjMy5jcmVhdGVCdWZmZXIoKSk7XHJcbiAgICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIHVibyk7XHJcbiAgICAgICAgY3JjMy5idWZmZXJEYXRhKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIGJsb2NrU2l6ZSwgY3JjMy5EWU5BTUlDX0RSQVcpO1xyXG4gICAgICAgIGNyYzMuYmluZEJ1ZmZlckJhc2UoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgVU5JRk9STV9CTE9DS1MuTElHSFRTLkJJTkRJTkcsIHVibyk7XHJcblxyXG4gICAgICAgIHJldHVybiB1Ym87XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGRldGVjdFVCT0xpZ2h0c1ZhcmlhYmxlT2Zmc2V0cygpOiB0eXBlb2YgUmVuZGVyV2ViR0wudWJvTGlnaHRzVmFyaWFibGVPZmZzZXRzIHtcclxuICAgICAgICBjb25zdCB1Ym9WYXJpYWJsZU5hbWVzOiBzdHJpbmdbXSA9IFtcclxuICAgICAgICAgIFwidV9uTGlnaHRzRGlyZWN0aW9uYWxcIixcclxuICAgICAgICAgIFwidV9uTGlnaHRzUG9pbnRcIixcclxuICAgICAgICAgIFwidV9uTGlnaHRzU3BvdFwiLFxyXG4gICAgICAgICAgXCJ1X2FtYmllbnQudmN0Q29sb3JcIixcclxuICAgICAgICAgIFwidV9kaXJlY3Rpb25hbFswXS52Y3RDb2xvclwiLFxyXG4gICAgICAgICAgXCJ1X3BvaW50WzBdLnZjdENvbG9yXCIsXHJcbiAgICAgICAgICBcInVfc3BvdFswXS52Y3RDb2xvclwiXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3QgdWJvVmFyaWFibGVJbmRpY2VzOiBudW1iZXJbXSA9IDxudW1iZXJbXT5jcmMzLmdldFVuaWZvcm1JbmRpY2VzKFxyXG4gICAgICAgICAgcHJvZ3JhbSxcclxuICAgICAgICAgIHVib1ZhcmlhYmxlTmFtZXNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCB1Ym9WYXJpYWJsZU9mZnNldHM6IG51bWJlcltdID0gY3JjMy5nZXRBY3RpdmVVbmlmb3JtcyhcclxuICAgICAgICAgIHByb2dyYW0sXHJcbiAgICAgICAgICB1Ym9WYXJpYWJsZUluZGljZXMsXHJcbiAgICAgICAgICBjcmMzLlVOSUZPUk1fT0ZGU0VUXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgdWJvVmFyaWFibGVOYW1lVG9PZmZzZXQ6IHR5cGVvZiBSZW5kZXJXZWJHTC51Ym9MaWdodHNWYXJpYWJsZU9mZnNldHMgPSB7fTtcclxuICAgICAgICB1Ym9WYXJpYWJsZU5hbWVzLmZvckVhY2goKF9uYW1lLCBfaW5kZXgpID0+IHVib1ZhcmlhYmxlTmFtZVRvT2Zmc2V0W19uYW1lXSA9IHVib1ZhcmlhYmxlT2Zmc2V0c1tfaW5kZXhdKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHVib1ZhcmlhYmxlTmFtZVRvT2Zmc2V0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdpdmVzIFdlYkdMIEJ1ZmZlciB0aGUgZGF0YSBmcm9tIHRoZSB7QGxpbmsgQ29hdH1cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVuZGVySW5qZWN0b3JDb2F0IGV4dGVuZHMgUmVuZGVySW5qZWN0b3Ige1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGdpdmVuIHtAbGluayBDb2F0fS1zdWJjbGFzc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgUmVuZGVySW5qZWN0b3IuaW5qZWN0KF9jb25zdHJ1Y3RvciwgUmVuZGVySW5qZWN0b3JDb2F0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdENvYXRDb2xvcmVkKHRoaXM6IENvYXRDb2xvcmVkLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsKTogdm9pZCB7XHJcbiAgICAgIGxldCB1bmlmb3JtOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X3ZjdENvbG9yXCJdO1xyXG4gICAgICBsZXQgY29sb3I6IENvbG9yID0gQ29sb3IuUFJPRFVDVCh0aGlzLmNvbG9yLCBfY21wTWF0ZXJpYWwuY2xyUHJpbWFyeSk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtNGZ2KHVuaWZvcm0sIGNvbG9yLmdldCgpKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoY29sb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdFJlbWlzc2l2ZSh0aGlzOiBDb2F0UmVtaXNzaXZlLCBfc2hhZGVyOiB0eXBlb2YgU2hhZGVyLCBfY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlckluamVjdG9yQ29hdC5pbmplY3RDb2F0Q29sb3JlZC5jYWxsKHRoaXMsIF9zaGFkZXIsIF9jbXBNYXRlcmlhbCk7XHJcbiAgICAgIGxldCB1bmlmb3JtOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X2ZEaWZmdXNlXCJdO1xyXG4gICAgICBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkudW5pZm9ybTFmKHVuaWZvcm0sIHRoaXMuZGlmZnVzZSk7XHJcbiAgICAgIHVuaWZvcm0gPSBfc2hhZGVyLnVuaWZvcm1zW1widV9mTWV0YWxsaWNcIl07XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtMWYodW5pZm9ybSwgdGhpcy5tZXRhbGxpYyk7XHJcbiAgICAgIHVuaWZvcm0gPSBfc2hhZGVyLnVuaWZvcm1zW1widV9mU3BlY3VsYXJcIl07XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtMWYodW5pZm9ybSwgdGhpcy5zcGVjdWxhcik7XHJcbiAgICAgIHVuaWZvcm0gPSBfc2hhZGVyLnVuaWZvcm1zW1widV9mSW50ZW5zaXR5XCJdO1xyXG4gICAgICBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkudW5pZm9ybTFmKHVuaWZvcm0sIHRoaXMuaW50ZW5zaXR5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdENvYXRUZXh0dXJlZCh0aGlzOiBDb2F0VGV4dHVyZWQsIF9zaGFkZXI6IHR5cGVvZiBTaGFkZXIsIF9jbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwpOiB2b2lkIHtcclxuICAgICAgUmVuZGVySW5qZWN0b3JDb2F0LmluamVjdENvYXRDb2xvcmVkLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICB0aGlzLnRleHR1cmUudXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uQ09MT1IuVU5JRk9STV0sIFRFWFRVUkVfTE9DQVRJT04uQ09MT1IuSU5ERVgpO1xyXG4gICAgICBjcmMzLnVuaWZvcm1NYXRyaXgzZnYoX3NoYWRlci51bmlmb3Jtc1tcInVfbXR4UGl2b3RcIl0sIGZhbHNlLCBfY21wTWF0ZXJpYWwubXR4UGl2b3QuZ2V0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5qZWN0Q29hdFJlbWlzc2l2ZVRleHR1cmVkKHRoaXM6IENvYXRSZW1pc3NpdmVUZXh0dXJlZCwgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3RvckNvYXQuaW5qZWN0Q29hdFJlbWlzc2l2ZS5jYWxsKHRoaXMsIF9zaGFkZXIsIF9jbXBNYXRlcmlhbCk7XHJcblxyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgdGhpcy50ZXh0dXJlLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5VTklUKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoX3NoYWRlci51bmlmb3Jtc1tURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSUZPUk1dLCBURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLklOREVYKTtcclxuICAgICAgY3JjMy51bmlmb3JtTWF0cml4M2Z2KF9zaGFkZXIudW5pZm9ybXNbXCJ1X210eFBpdm90XCJdLCBmYWxzZSwgX2NtcE1hdGVyaWFsLm10eFBpdm90LmdldCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdENvYXRSZW1pc3NpdmVUZXh0dXJlZE5vcm1hbHModGhpczogQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFscywgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3RvckNvYXQuaW5qZWN0Q29hdFJlbWlzc2l2ZVRleHR1cmVkLmNhbGwodGhpcywgX3NoYWRlciwgX2NtcE1hdGVyaWFsKTtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICB0aGlzLm5vcm1hbE1hcC51c2VSZW5kZXJEYXRhKFRFWFRVUkVfTE9DQVRJT04uTk9STUFMLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uTk9STUFMLlVOSUZPUk1dLCBURVhUVVJFX0xPQ0FUSU9OLk5PUk1BTC5JTkRFWCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBpbmplY3RDb2F0VG9vbih0aGlzOiBDb2F0VG9vbiwgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJJbmplY3RvckNvYXQuaW5qZWN0Q29hdFJlbWlzc2l2ZS5jYWxsKHRoaXMsIF9zaGFkZXIsIF9jbXBNYXRlcmlhbCk7XHJcblxyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgdGhpcy50ZXhUb29uLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5UT09OLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uVE9PTi5VTklGT1JNXSwgVEVYVFVSRV9MT0NBVElPTi5UT09OLklOREVYKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdENvYXRUb29uVGV4dHVyZWQodGhpczogQ29hdFRvb24sIF9zaGFkZXI6IHR5cGVvZiBTaGFkZXIsIF9jbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwpOiB2b2lkIHtcclxuICAgICAgUmVuZGVySW5qZWN0b3JDb2F0LmluamVjdENvYXRSZW1pc3NpdmVUZXh0dXJlZC5jYWxsKHRoaXMsIF9zaGFkZXIsIF9jbXBNYXRlcmlhbCk7XHJcblxyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgdGhpcy50ZXhUb29uLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5UT09OLlVOSVQpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uVE9PTi5VTklGT1JNXSwgVEVYVFVSRV9MT0NBVElPTi5UT09OLklOREVYKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQnVmZmVycyB0aGUgZGF0YSBmcm9tIHRoZSB7QGxpbmsgTWVzaH0gaW50byBhIFdlYkdMIEJ1ZmZlclxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3Rvck1lc2gge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNsYXNzIGludG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBnaXZlbiB7QGxpbmsgTWVzaH0tc3ViY2xhc3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVzZVJlbmRlckJ1ZmZlcnNcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3Rvck1lc2gudXNlUmVuZGVyQnVmZmVyc1xyXG4gICAgICB9KTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiZ2V0UmVuZGVyQnVmZmVyc1wiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yTWVzaC5nZXRSZW5kZXJCdWZmZXJzXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJkZWxldGVSZW5kZXJCdWZmZXJzXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JNZXNoLmRlbGV0ZVJlbmRlckJ1ZmZlcnNcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBnZXRSZW5kZXJCdWZmZXJzKHRoaXM6IE1lc2gpOiBSZW5kZXJCdWZmZXJzIHtcclxuICAgICAgaWYgKHRoaXMucmVuZGVyTWVzaC5idWZmZXJzID09IG51bGwpIHtcclxuICAgICAgICB0aGlzLnJlbmRlck1lc2guYnVmZmVycyA9IHtcclxuICAgICAgICAgIHZlcnRpY2VzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC52ZXJ0aWNlcyksXHJcbiAgICAgICAgICBpbmRpY2VzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5yZW5kZXJNZXNoLmluZGljZXMpLFxyXG4gICAgICAgICAgbm9ybWFsczogY3JlYXRlQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCB0aGlzLnJlbmRlck1lc2gubm9ybWFscyksXHJcbiAgICAgICAgICB0ZXh0dXJlVVZzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC50ZXh0dXJlVVZzKSxcclxuICAgICAgICAgIGNvbG9yczogY3JlYXRlQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCB0aGlzLnJlbmRlck1lc2guY29sb3JzKSxcclxuICAgICAgICAgIHRhbmdlbnRzOiBjcmVhdGVCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIHRoaXMucmVuZGVyTWVzaC50YW5nZW50cyksXHJcbiAgICAgICAgICBuSW5kaWNlczogdGhpcy5yZW5kZXJNZXNoLmluZGljZXMubGVuZ3RoXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyTWVzaC5ib25lcylcclxuICAgICAgICAgIHRoaXMucmVuZGVyTWVzaC5idWZmZXJzLmJvbmVzID0gY3JlYXRlQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCB0aGlzLnJlbmRlck1lc2guYm9uZXMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJNZXNoLndlaWdodHMpXHJcbiAgICAgICAgICB0aGlzLnJlbmRlck1lc2guYnVmZmVycy53ZWlnaHRzID0gY3JlYXRlQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCB0aGlzLnJlbmRlck1lc2gud2VpZ2h0cyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlck1lc2guYnVmZmVycztcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihfdHlwZTogR0xlbnVtLCBfYXJyYXk6IEZsb2F0MzJBcnJheSB8IFVpbnQxNkFycmF5IHwgVWludDhBcnJheSk6IFdlYkdMQnVmZmVyIHtcclxuICAgICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICAgIGxldCBidWZmZXI6IFdlYkdMQnVmZmVyID0gUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMQnVmZmVyPihjcmMzLmNyZWF0ZUJ1ZmZlcigpKTtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoX3R5cGUsIGJ1ZmZlcik7XHJcbiAgICAgICAgY3JjMy5idWZmZXJEYXRhKF90eXBlLCBfYXJyYXksIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU1RBVElDX0RSQVcpO1xyXG4gICAgICAgIHJldHVybiBidWZmZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHVzZVJlbmRlckJ1ZmZlcnModGhpczogTWVzaCwgX3NoYWRlcjogdHlwZW9mIFNoYWRlciwgX210eE1lc2hUb1dvcmxkOiBNYXRyaXg0eDQsIF9tdHhNZXNoVG9WaWV3OiBNYXRyaXg0eDQsIF9pZD86IG51bWJlcik6IFJlbmRlckJ1ZmZlcnMge1xyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgbGV0IHJlbmRlckJ1ZmZlcnM6IFJlbmRlckJ1ZmZlcnMgPSB0aGlzLmdldFJlbmRlckJ1ZmZlcnMoKTtcclxuXHJcbiAgICAgIGxldCB1bmlmb3JtOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcclxuXHJcbiAgICAgIHVuaWZvcm0gPSBfc2hhZGVyLnVuaWZvcm1zW1widV9tdHhNZXNoVG9WaWV3XCJdO1xyXG4gICAgICBjcmMzLnVuaWZvcm1NYXRyaXg0ZnYodW5pZm9ybSwgZmFsc2UsIF9tdHhNZXNoVG9WaWV3LmdldCgpKTtcclxuXHJcbiAgICAgIHVuaWZvcm0gPSBfc2hhZGVyLnVuaWZvcm1zW1widV9tdHhNZXNoVG9Xb3JsZFwiXTtcclxuICAgICAgaWYgKHVuaWZvcm0pXHJcbiAgICAgICAgY3JjMy51bmlmb3JtTWF0cml4NGZ2KHVuaWZvcm0sIGZhbHNlLCBfbXR4TWVzaFRvV29ybGQuZ2V0KCkpO1xyXG5cclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X210eE5vcm1hbE1lc2hUb1dvcmxkXCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSkge1xyXG4gICAgICAgIGxldCBub3JtYWxNYXRyaXg6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5UUkFOU1BPU0UoTWF0cml4NHg0LklOVkVSU0UoX210eE1lc2hUb1dvcmxkKSk7XHJcbiAgICAgICAgY3JjMy51bmlmb3JtTWF0cml4NGZ2KHVuaWZvcm0sIGZhbHNlLCBub3JtYWxNYXRyaXguZ2V0KCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBmZWVkIGluIGFuIGlkIG9mIHRoZSBub2RlIGlmIHNoYWRlciBhY2NlcHRzIHVfaWQuIFVzZWQgZm9yIHBpY2tpbmdcclxuICAgICAgdW5pZm9ybSA9IF9zaGFkZXIudW5pZm9ybXNbXCJ1X2lkXCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSlcclxuICAgICAgICBjcmMzLnVuaWZvcm0xaSh1bmlmb3JtLCBfaWQpO1xyXG5cclxuICAgICAgc2V0QXR0cmlidXRlQnVmZmVyKFwiYV92Y3RQb3NpdGlvblwiLCByZW5kZXJCdWZmZXJzLnZlcnRpY2VzLCAzKTtcclxuICAgICAgc2V0QXR0cmlidXRlQnVmZmVyKFwiYV92Y3RDb2xvclwiLCByZW5kZXJCdWZmZXJzLmNvbG9ycywgNCk7XHJcbiAgICAgIHNldEF0dHJpYnV0ZUJ1ZmZlcihcImFfdmN0VGV4dHVyZVwiLCByZW5kZXJCdWZmZXJzLnRleHR1cmVVVnMsIDIpO1xyXG4gICAgICBzZXRBdHRyaWJ1dGVCdWZmZXIoXCJhX3ZjdE5vcm1hbFwiLCByZW5kZXJCdWZmZXJzLm5vcm1hbHMsIDMpO1xyXG4gICAgICBzZXRBdHRyaWJ1dGVCdWZmZXIoXCJhX3ZjdFRhbmdlbnRcIiwgcmVuZGVyQnVmZmVycy50YW5nZW50cywgNCk7XHJcblxyXG4gICAgICBjb25zdCBhQm9uZTogbnVtYmVyID0gX3NoYWRlci5hdHRyaWJ1dGVzW1wiYV92Y3RCb25lc1wiXTtcclxuICAgICAgaWYgKGFCb25lKSB7XHJcbiAgICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCByZW5kZXJCdWZmZXJzLmJvbmVzKTtcclxuICAgICAgICBjcmMzLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGFCb25lKTtcclxuICAgICAgICBjcmMzLnZlcnRleEF0dHJpYklQb2ludGVyKGFCb25lLCA0LCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX0JZVEUsIDAsIDApO1xyXG4gICAgICB9XHJcbiAgICAgIHNldEF0dHJpYnV0ZUJ1ZmZlcihcImFfdmN0V2VpZ2h0c1wiLCByZW5kZXJCdWZmZXJzLndlaWdodHMsIDQpO1xyXG5cclxuICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHJlbmRlckJ1ZmZlcnMuaW5kaWNlcyk7XHJcblxyXG4gICAgICByZXR1cm4gcmVuZGVyQnVmZmVycztcclxuXHJcbiAgICAgIGZ1bmN0aW9uIHNldEF0dHJpYnV0ZUJ1ZmZlcihfbmFtZTogc3RyaW5nLCBfYnVmZmVyOiBXZWJHTEJ1ZmZlciwgX3NpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGU6IG51bWJlciA9IF9zaGFkZXIuYXR0cmlidXRlc1tfbmFtZV07XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCBfYnVmZmVyKTtcclxuICAgICAgICBjcmMzLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgY3JjMy52ZXJ0ZXhBdHRyaWJQb2ludGVyKGF0dHJpYnV0ZSwgX3NpemUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRkxPQVQsIGZhbHNlLCAwLCAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZGVsZXRlUmVuZGVyQnVmZmVycyhfcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycyk6IHZvaWQge1xyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgaWYgKF9yZW5kZXJCdWZmZXJzKSB7XHJcbiAgICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCBudWxsKTtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbnVsbCk7XHJcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhfcmVuZGVyQnVmZmVycykuZmlsdGVyKF9idWZmZXIgPT4gX2J1ZmZlciBpbnN0YW5jZW9mIFdlYkdMQnVmZmVyKS5mb3JFYWNoKChfYnVmZmVyLCBfaW5kZXgpID0+IHtcclxuICAgICAgICAgIGNyYzMuZGVsZXRlQnVmZmVyKF9idWZmZXIpO1xyXG4gICAgICAgICAgY3JjMy5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoX2luZGV4KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgbmFtZXNwYWNlIFBhcnRpY2xlRGF0YSB7XHJcblxyXG4gICAgZXhwb3J0IGVudW0gRlVOQ1RJT04ge1xyXG4gICAgICAvLyBWQUxVRSA9IFwidmFsdWVcIixcclxuICAgICAgQURESVRJT04gPSBcImFkZGl0aW9uXCIsXHJcbiAgICAgIFNVQlRSQUNUSU9OID0gXCJzdWJ0cmFjdGlvblwiLFxyXG4gICAgICBNVUxUSVBMSUNBVElPTiA9IFwibXVsdGlwbGljYXRpb25cIixcclxuICAgICAgRElWSVNJT04gPSBcImRpdmlzaW9uXCIsXHJcbiAgICAgIE1PRFVMTyA9IFwibW9kdWxvXCIsXHJcbiAgICAgIFBPV0VSID0gXCJwb3dlclwiLFxyXG4gICAgICBQT0xZTk9NSUFMMyA9IFwicG9seW5vbWlhbDNcIixcclxuICAgICAgU1FVQVJFX1JPT1QgPSBcInNxdWFyZVJvb3RcIixcclxuICAgICAgUkFORE9NID0gXCJyYW5kb21cIixcclxuICAgICAgUkFORE9NX1JBTkdFID0gXCJyYW5kb21SYW5nZVwiXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNvbnN0IEZVTkNUSU9OX01JTklNVU1fUEFSQU1FVEVSUzogeyBba2V5IGluIFBhcnRpY2xlRGF0YS5GVU5DVElPTl06IG51bWJlciB9ID0ge1xyXG4gICAgICAvLyBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlZBTFVFXTogMSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5BRERJVElPTl06IDIsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uU1VCVFJBQ1RJT05dOiAyLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLk1VTFRJUExJQ0FUSU9OXTogMixcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5ESVZJU0lPTl06IDIsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uTU9EVUxPXTogMixcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5QT1dFUl06IDIsXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uUE9MWU5PTUlBTDNdOiA1LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlNRVUFSRV9ST09UXTogMSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5SQU5ET01dOiAxLFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlJBTkRPTV9SQU5HRV06IDNcclxuICAgIH07XHJcblxyXG4gICAgZXhwb3J0IGNvbnN0IFBSRURFRklORURfVkFSSUFCTEVTOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgICBzeXN0ZW1EdXJhdGlvbjogXCJ1X2ZQYXJ0aWNsZVN5c3RlbUR1cmF0aW9uXCIsXHJcbiAgICAgIHN5c3RlbVNpemU6IFwidV9mUGFydGljbGVTeXN0ZW1TaXplXCIsXHJcbiAgICAgIHN5c3RlbVRpbWU6IFwidV9mUGFydGljbGVTeXN0ZW1UaW1lXCIsXHJcbiAgICAgIHBhcnRpY2xlSWQ6IFwiZlBhcnRpY2xlSWRcIlxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXBpbGVzIHBhcnRpY2xlIHN5c3RlbSBzaGFkZXJzICh7QGxpbmsgU2hhZGVyUGFydGljbGVTeXN0ZW19KSBmcm9tIHNoYWRlciB1bml2ZXJzYWwgZGVyaXZhdGVzIGZvciBXZWJHTFxyXG4gICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyMlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtIGV4dGVuZHMgUmVuZGVySW5qZWN0b3JTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBGVU5DVElPTlM6IHsgW2tleSBpbiBQYXJ0aWNsZURhdGEuRlVOQ1RJT05dOiBGdW5jdGlvbiB9ID0ge1xyXG4gICAgICAvLyBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlZBTFVFXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAvLyAgIHJldHVybiBgKCR7X3BhcmFtZXRlcnNbMF19KWA7XHJcbiAgICAgIC8vIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uQURESVRJT05dOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGAoJHtfcGFyYW1ldGVycy5yZWR1Y2UoKF9hY2N1bXVsYXRvcjogc3RyaW5nLCBfdmFsdWU6IHN0cmluZykgPT4gYCR7X2FjY3VtdWxhdG9yfSArICR7X3ZhbHVlfWApfSlgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlNVQlRSQUNUSU9OXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBgKCR7X3BhcmFtZXRlcnMucmVkdWNlKChfYWNjdW11bGF0b3I6IHN0cmluZywgX3ZhbHVlOiBzdHJpbmcpID0+IGAke19hY2N1bXVsYXRvcn0gLSAke192YWx1ZX1gKX0pYDtcclxuICAgICAgfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5NVUxUSVBMSUNBVElPTl06IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICByZXR1cm4gYCgke19wYXJhbWV0ZXJzLnJlZHVjZSgoX2FjY3VtdWxhdG9yOiBzdHJpbmcsIF92YWx1ZTogc3RyaW5nKSA9PiBgJHtfYWNjdW11bGF0b3J9ICogJHtfdmFsdWV9YCl9KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uRElWSVNJT05dOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGAoJHtfcGFyYW1ldGVyc1swXX0gLyAke19wYXJhbWV0ZXJzWzFdfSlgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLk1PRFVMT106IChfcGFyYW1ldGVyczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICByZXR1cm4gYCgke19wYXJhbWV0ZXJzLnJlZHVjZSgoX2FjY3VtdWxhdG9yOiBzdHJpbmcsIF92YWx1ZTogc3RyaW5nKSA9PiBgbW9kKCR7X2FjY3VtdWxhdG9yfSwgJHtfdmFsdWV9KWApfSlgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlBPV0VSXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBgcG93KCR7X3BhcmFtZXRlcnNbMF19LCAke19wYXJhbWV0ZXJzWzFdfSlgO1xyXG4gICAgICB9LFxyXG4gICAgICBbUGFydGljbGVEYXRhLkZVTkNUSU9OLlBPTFlOT01JQUwzXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIGxldCB4OiBzdHJpbmcgPSBfcGFyYW1ldGVyc1swXTtcclxuICAgICAgICBsZXQgYTogc3RyaW5nID0gX3BhcmFtZXRlcnNbMV07XHJcbiAgICAgICAgbGV0IGI6IHN0cmluZyA9IF9wYXJhbWV0ZXJzWzJdO1xyXG4gICAgICAgIGxldCBjOiBzdHJpbmcgPSBfcGFyYW1ldGVyc1szXTtcclxuICAgICAgICBsZXQgZDogc3RyaW5nID0gX3BhcmFtZXRlcnNbNF07XHJcbiAgICAgICAgcmV0dXJuIGAoJHthfSAqIHBvdygke3h9LCAzLjApICsgJHtifSAqIHBvdygke3h9LCAyLjApICsgJHtjfSAqICR7eH0gKyAke2R9KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uU1FVQVJFX1JPT1RdOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgbGV0IHg6IHN0cmluZyA9IF9wYXJhbWV0ZXJzWzBdO1xyXG4gICAgICAgIHJldHVybiBgc3FydCgke3h9KWA7XHJcbiAgICAgIH0sXHJcbiAgICAgIFtQYXJ0aWNsZURhdGEuRlVOQ1RJT04uUkFORE9NXTogKF9wYXJhbWV0ZXJzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBgZmV0Y2hSYW5kb21OdW1iZXIoaW50KCR7X3BhcmFtZXRlcnNbMF19KSwgaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUsIGlQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNMZW5ndGgpYDtcclxuICAgICAgfSxcclxuICAgICAgW1BhcnRpY2xlRGF0YS5GVU5DVElPTi5SQU5ET01fUkFOR0VdOiAoX3BhcmFtZXRlcnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGAoJHtSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLkZVTkNUSU9OU1tcInJhbmRvbVwiXShfcGFyYW1ldGVycyl9ICogKCR7X3BhcmFtZXRlcnNbMl19IC0gJHtfcGFyYW1ldGVyc1sxXX0pICsgJHtfcGFyYW1ldGVyc1sxXX0pYDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgc3VwZXIuZGVjb3JhdGUoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcImdldFZlcnRleFNoYWRlclNvdXJjZVwiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uZ2V0VmVydGV4U2hhZGVyU291cmNlXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJnZXRGcmFnbWVudFNoYWRlclNvdXJjZVwiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2VcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgdmVydGV4IHNoYWRlciBvZiB0aGUge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtfSBmcm9tIHRoZSBzZXQge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtLmRhdGF9IGFuZCB0aGUgb3JpZ2luYWwge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtLnZlcnRleFNoYWRlclNvdXJjZX0uXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0VmVydGV4U2hhZGVyU291cmNlKHRoaXM6IFNoYWRlclBhcnRpY2xlU3lzdGVtKTogc3RyaW5nIHtcclxuICAgICAgbGV0IGRhdGE6IFBhcnRpY2xlRGF0YS5TeXN0ZW0gPSB0aGlzLmRhdGE7XHJcbiAgICAgIGxldCBtdHhMb2NhbDogUGFydGljbGVEYXRhLlRyYW5zZm9ybWF0aW9uW10gPSBkYXRhPy5tdHhMb2NhbDtcclxuICAgICAgbGV0IG10eFdvcmxkOiBQYXJ0aWNsZURhdGEuVHJhbnNmb3JtYXRpb25bXSA9IGRhdGE/Lm10eFdvcmxkO1xyXG5cclxuICAgICAgbGV0IHNvdXJjZTogc3RyaW5nID0gdGhpcy52ZXJ0ZXhTaGFkZXJTb3VyY2VcclxuICAgICAgICAucmVwbGFjZShcIiN2ZXJzaW9uIDMwMCBlc1wiLCBgI3ZlcnNpb24gMzAwIGVzXFxuI2RlZmluZSAke3RoaXMuZGVmaW5lWzBdfSR7ZGF0YS5jb2xvciA/IFwiXFxuI2RlZmluZSBQQVJUSUNMRV9DT0xPUlwiIDogXCJcIn1gKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokdmFyaWFibGVzKi9cIiwgUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZVZhcmlhYmxlcyhkYXRhPy52YXJpYWJsZXMsIGRhdGE/LnZhcmlhYmxlTmFtZXMpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4TG9jYWwqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlVHJhbnNmb3JtYXRpb25zKG10eExvY2FsLCBcIkxvY2FsXCIpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4TG9jYWwqL1wiLCBtdHhMb2NhbCAmJiBtdHhMb2NhbC5sZW5ndGggPiAwID8gXCIqIG10eExvY2FsXCIgOiBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4V29ybGQqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlVHJhbnNmb3JtYXRpb25zKG10eFdvcmxkLCBcIldvcmxkXCIpKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiLyokbXR4V29ybGQqL1wiLCBtdHhXb3JsZCAmJiBtdHhXb3JsZC5sZW5ndGggPiAwID8gXCJtdHhXb3JsZCAqXCIgOiBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlQWxsKFwiLyokY29sb3IqL1wiLCBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlQ29sb3IoZGF0YT8uY29sb3IpKTtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBmcmFnbWVudCBzaGFkZXIgb2YgdGhlIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbX0gZnJvbSB0aGUgc2V0IHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS5kYXRhfSBhbmQgdGhlIG9yaWdpbmFsIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbS5mcmFnbWVudFNoYWRlclNvdXJjZX0uXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UodGhpczogU2hhZGVyUGFydGljbGVTeXN0ZW0pOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5mcmFnbWVudFNoYWRlclNvdXJjZS5yZXBsYWNlKFwiI3ZlcnNpb24gMzAwIGVzXCIsIGAjdmVyc2lvbiAzMDAgZXNcXG4jZGVmaW5lICR7dGhpcy5kZWZpbmVbMF19JHt0aGlzLmRhdGEuY29sb3IgPyBcIlxcbiNkZWZpbmUgUEFSVElDTEVfQ09MT1JcIiA6IFwiXCJ9YClcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gY29kZSBnZW5lcmF0aW9uXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVWYXJpYWJsZXMoX3ZhcmlhYmxlczogUGFydGljbGVEYXRhLlN5c3RlbVtcInZhcmlhYmxlc1wiXSwgX3ZhcmlhYmxlTmFtZXM6IFBhcnRpY2xlRGF0YS5TeXN0ZW1bXCJ2YXJpYWJsZU5hbWVzXCJdKTogc3RyaW5nIHtcclxuICAgICAgaWYgKCFfdmFyaWFibGVzKSByZXR1cm4gXCJcIjtcclxuXHJcbiAgICAgIHJldHVybiBfdmFyaWFibGVzXHJcbiAgICAgICAgLm1hcCgoX3ZhcmlhYmxlLCBfaW5kZXgpID0+ICh7IG5hbWU6IFwiZlBhcnRpY2xlU3lzdGVtVmFyaWFibGVfXCIgKyBfdmFyaWFibGVOYW1lc1tfaW5kZXhdLCB2YWx1ZTogUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUV4cHJlc3Npb24oX3ZhcmlhYmxlKSB9KSlcclxuICAgICAgICAubWFwKF92YXJpYWJsZSA9PiBgZmxvYXQgJHtfdmFyaWFibGUubmFtZX0gPSAke192YXJpYWJsZS52YWx1ZX07YClcclxuICAgICAgICAucmVkdWNlKChfYWNjdW11bGF0b3I6IHN0cmluZywgX2NvZGU6IHN0cmluZykgPT4gYCR7X2FjY3VtdWxhdG9yfVxcbiR7X2NvZGV9YCwgXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVUcmFuc2Zvcm1hdGlvbnMoX3RyYW5zZm9ybWF0aW9uczogUGFydGljbGVEYXRhLlN5c3RlbVtcIm10eExvY2FsXCJdLCBfbG9jYWxPcldvcmxkOiBcIkxvY2FsXCIgfCBcIldvcmxkXCIpOiBzdHJpbmcge1xyXG4gICAgICBpZiAoIV90cmFuc2Zvcm1hdGlvbnMgfHwgX3RyYW5zZm9ybWF0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIFwiXCI7XHJcblxyXG4gICAgICBsZXQgdHJhbnNmb3JtYXRpb25zOiBbUGFydGljbGVEYXRhLlRyYW5zZm9ybWF0aW9uW1widHJhbnNmb3JtYXRpb25cIl0sIHN0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBfdHJhbnNmb3JtYXRpb25zXHJcbiAgICAgICAgLm1hcChfZGF0YSA9PiB7XHJcbiAgICAgICAgICBsZXQgaXNTY2FsZTogYm9vbGVhbiA9IF9kYXRhLnRyYW5zZm9ybWF0aW9uID09PSBcInNjYWxlXCI7XHJcbiAgICAgICAgICBsZXQgW3gsIHksIHpdID0gW19kYXRhLnBhcmFtZXRlcnNbMF0sIF9kYXRhLnBhcmFtZXRlcnNbMV0sIF9kYXRhLnBhcmFtZXRlcnNbMl1dXHJcbiAgICAgICAgICAgIC5tYXAoKF92YWx1ZSkgPT4gX3ZhbHVlID8gUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUV4cHJlc3Npb24oX3ZhbHVlKSA6IChpc1NjYWxlID8gXCIxLjBcIiA6IFwiMC4wXCIpKSBhcyBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XHJcblxyXG4gICAgICAgICAgcmV0dXJuIFtfZGF0YS50cmFuc2Zvcm1hdGlvbiwgeCwgeSwgel07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBsZXQgY29kZTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgY29kZSArPSB0cmFuc2Zvcm1hdGlvbnNcclxuICAgICAgICAubWFwKChbX3RyYW5zZm9ybWF0aW9uLCBfeCwgX3ksIF96XSwgX2luZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGxldCByb3RhdGVJZDogc3RyaW5nID0gX2luZGV4ICsgX2xvY2FsT3JXb3JsZDtcclxuICAgICAgICAgIGlmIChfdHJhbnNmb3JtYXRpb24gPT0gXCJyb3RhdGVcIikge1xyXG4gICAgICAgICAgICBsZXQgdG9SYWRpYW5zOiAoX3ZhbHVlOiBzdHJpbmcpID0+IHN0cmluZyA9IChfdmFsdWU6IHN0cmluZykgPT4gYCR7X3ZhbHVlfSAqICR7Q2FsYy5kZWcycmFkfWA7XHJcbiAgICAgICAgICAgIHJldHVybiBgZmxvYXQgZlhSYWRpYW5zJHtyb3RhdGVJZH0gPSAke3RvUmFkaWFucyhfeCl9O1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZZUmFkaWFucyR7cm90YXRlSWR9ID0gJHt0b1JhZGlhbnMoX3kpfTtcclxuICAgICAgICAgICAgICBmbG9hdCBmWlJhZGlhbnMke3JvdGF0ZUlkfSA9ICR7dG9SYWRpYW5zKF96KX07XHJcbiAgICAgICAgICAgICAgZmxvYXQgZlNpblgke3JvdGF0ZUlkfSA9IHNpbihmWFJhZGlhbnMke3JvdGF0ZUlkfSk7XHJcbiAgICAgICAgICAgICAgZmxvYXQgZkNvc1gke3JvdGF0ZUlkfSA9IGNvcyhmWFJhZGlhbnMke3JvdGF0ZUlkfSk7IFxyXG4gICAgICAgICAgICAgIGZsb2F0IGZTaW5ZJHtyb3RhdGVJZH0gPSBzaW4oZllSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZDb3NZJHtyb3RhdGVJZH0gPSBjb3MoZllSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZTaW5aJHtyb3RhdGVJZH0gPSBzaW4oZlpSYWRpYW5zJHtyb3RhdGVJZH0pO1xyXG4gICAgICAgICAgICAgIGZsb2F0IGZDb3NaJHtyb3RhdGVJZH0gPSBjb3MoZlpSYWRpYW5zJHtyb3RhdGVJZH0pO1xcbmA7XHJcbiAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmlsdGVyKChfdHJhbnNmb3JtYXRpb246IHN0cmluZykgPT4gX3RyYW5zZm9ybWF0aW9uICE9IFwiXCIpXHJcbiAgICAgICAgLnJlZHVjZSgoX2FjY3VtdWxhdG9yOiBzdHJpbmcsIF9jb2RlOiBzdHJpbmcpID0+IGAke19hY2N1bXVsYXRvcn1cXG4ke19jb2RlfWAsIFwiXCIpO1xyXG4gICAgICBjb2RlICs9IFwiXFxuXCI7XHJcblxyXG4gICAgICBjb2RlICs9IGBtYXQ0IG10eCR7X2xvY2FsT3JXb3JsZH0gPSBgO1xyXG4gICAgICBjb2RlICs9IHRyYW5zZm9ybWF0aW9uc1xyXG4gICAgICAgIC5tYXAoKFtfdHJhbnNmb3JtYXRpb24sIF94LCBfeSwgX3pdLCBfaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgbGV0IHJvdGF0ZUlkOiBzdHJpbmcgPSBfaW5kZXggKyBfbG9jYWxPcldvcmxkO1xyXG4gICAgICAgICAgc3dpdGNoIChfdHJhbnNmb3JtYXRpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBcInRyYW5zbGF0ZVwiOlxyXG4gICAgICAgICAgICAgIHJldHVybiBgbWF0NChcclxuICAgICAgICAgICAgICAxLjAsIDAuMCwgMC4wLCAwLjAsXHJcbiAgICAgICAgICAgICAgMC4wLCAxLjAsIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAxLjAsIDAuMCxcclxuICAgICAgICAgICAgICAke194fSwgJHtfeX0sICR7X3p9LCAxLjApYDtcclxuICAgICAgICAgICAgY2FzZSBcInJvdGF0ZVwiOlxyXG4gICAgICAgICAgICAgIHJldHVybiBgbWF0NChcclxuICAgICAgICAgICAgICBmQ29zWiR7cm90YXRlSWR9ICogZkNvc1kke3JvdGF0ZUlkfSwgZlNpbloke3JvdGF0ZUlkfSAqIGZDb3NZJHtyb3RhdGVJZH0sIC1mU2luWSR7cm90YXRlSWR9LCAwLjAsXHJcbiAgICAgICAgICAgICAgZkNvc1oke3JvdGF0ZUlkfSAqIGZTaW5ZJHtyb3RhdGVJZH0gKiBmU2luWCR7cm90YXRlSWR9IC0gZlNpbloke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0sIGZTaW5aJHtyb3RhdGVJZH0gKiBmU2luWSR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSArIGZDb3NaJHtyb3RhdGVJZH0gKiBmQ29zWCR7cm90YXRlSWR9LCBmQ29zWSR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSwgMC4wLFxyXG4gICAgICAgICAgICAgIGZDb3NaJHtyb3RhdGVJZH0gKiBmU2luWSR7cm90YXRlSWR9ICogZkNvc1gke3JvdGF0ZUlkfSArIGZTaW5aJHtyb3RhdGVJZH0gKiBmU2luWCR7cm90YXRlSWR9LCBmU2luWiR7cm90YXRlSWR9ICogZlNpblkke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0gLSBmQ29zWiR7cm90YXRlSWR9ICogZlNpblgke3JvdGF0ZUlkfSwgZkNvc1kke3JvdGF0ZUlkfSAqIGZDb3NYJHtyb3RhdGVJZH0sIDAuMCxcclxuICAgICAgICAgICAgICAwLjAsIDAuMCwgMC4wLCAxLjBcclxuICAgICAgICAgICAgICApYDtcclxuICAgICAgICAgICAgY2FzZSBcInNjYWxlXCI6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGBtYXQ0KFxyXG4gICAgICAgICAgICAgICR7X3h9LCAwLjAsIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgJHtfeX0sIDAuMCwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAke196fSwgMC4wLFxyXG4gICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDEuMFxyXG4gICAgICAgICAgICAgIClgO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X3RyYW5zZm9ybWF0aW9ufVwiIGlzIG5vdCBhIHRyYW5zZm9ybWF0aW9uYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5yZWR1Y2UoKF9hY2N1bXVsYXRvcjogc3RyaW5nLCBfY29kZTogc3RyaW5nKSA9PiBgJHtfYWNjdW11bGF0b3J9ICogXFxuJHtfY29kZX1gKTtcclxuICAgICAgY29kZSArPSBcIjtcXG5cIjtcclxuXHJcbiAgICAgIHJldHVybiBjb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlQ29sb3IoX2NvbG9yOiBQYXJ0aWNsZURhdGEuRXhwcmVzc2lvbltdKTogc3RyaW5nIHtcclxuICAgICAgaWYgKCFfY29sb3IpIHJldHVybiBcIlwiO1xyXG5cclxuICAgICAgbGV0IHJnYmE6IHN0cmluZyA9IFtfY29sb3JbMF0sIF9jb2xvclsxXSwgX2NvbG9yWzJdLCBfY29sb3JbM11dXHJcbiAgICAgICAgLm1hcCgoX3ZhbHVlKTogc3RyaW5nID0+IF92YWx1ZSA/IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uZ2VuZXJhdGVFeHByZXNzaW9uKF92YWx1ZSkgOiBcIjEuMFwiKVxyXG4gICAgICAgIC5qb2luKFwiLCBcIik7XHJcblxyXG4gICAgICByZXR1cm4gYHZlYzQoJHtyZ2JhfSk7YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUV4cHJlc3Npb24oX2V4cHJlc3Npb246IFBhcnRpY2xlRGF0YS5FeHByZXNzaW9uKTogc3RyaW5nIHtcclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc0Z1bmN0aW9uKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCBwYXJhbWV0ZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHBhcmFtIG9mIF9leHByZXNzaW9uLnBhcmFtZXRlcnMpIHtcclxuICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLmdlbmVyYXRlRXhwcmVzc2lvbihwYXJhbSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5nZW5lcmF0ZUZ1bmN0aW9uKF9leHByZXNzaW9uLmZ1bmN0aW9uLCBwYXJhbWV0ZXJzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc1ZhcmlhYmxlKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIHJldHVybiBQYXJ0aWNsZURhdGEuUFJFREVGSU5FRF9WQVJJQUJMRVNbX2V4cHJlc3Npb24udmFsdWVdIHx8IFwiZlBhcnRpY2xlU3lzdGVtVmFyaWFibGVfXCIgKyBfZXhwcmVzc2lvbi52YWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFBhcnRpY2xlRGF0YS5pc0NvbnN0YW50KF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCB2YWx1ZTogc3RyaW5nID0gX2V4cHJlc3Npb24udmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm4gYCR7dmFsdWV9JHt2YWx1ZS5pbmNsdWRlcyhcIi5cIikgPyBcIlwiIDogXCIuMFwifWA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChQYXJ0aWNsZURhdGEuaXNDb2RlKF9leHByZXNzaW9uKSkge1xyXG4gICAgICAgIGxldCBjb2RlOiBzdHJpbmcgPSBfZXhwcmVzc2lvbi5jb2RlXHJcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxiW2EtekEtel0rXFx3Kig/IVxcKClcXGIvZywgKF9tYXRjaCkgPT4gUGFydGljbGVEYXRhLlBSRURFRklORURfVkFSSUFCTEVTW19tYXRjaF0gfHwgXCJmUGFydGljbGVTeXN0ZW1WYXJpYWJsZV9cIiArIF9tYXRjaClcclxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8oPzwhXFwuKVxcYlxcZCtcXGIoPyFcXC4pL2csIChfbWF0Y2gpID0+IF9tYXRjaCArIFwiLjBcIik7XHJcbiAgICAgICAgY29kZSA9IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0ucmVwbGFjZUZ1bmN0aW9ucyhjb2RlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBpbnZhbGlkIG5vZGUgc3RydWN0dXJlIGluIHBhcnRpY2xlIHN5c3RlbSBzZXJpYWxpemF0aW9uYDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUZ1bmN0aW9uKF9mdW5jdGlvbjogUGFydGljbGVEYXRhLkZVTkNUSU9OLCBfcGFyYW1ldGVyczogc3RyaW5nW10pOiBzdHJpbmcge1xyXG4gICAgICBpZiAoX3BhcmFtZXRlcnMubGVuZ3RoIDwgUGFydGljbGVEYXRhLkZVTkNUSU9OX01JTklNVU1fUEFSQU1FVEVSU1tfZnVuY3Rpb25dKVxyXG4gICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X2Z1bmN0aW9ufVwiIG5lZWRzIGF0IGxlYXN0ICR7UGFydGljbGVEYXRhLkZVTkNUSU9OX01JTklNVU1fUEFSQU1FVEVSU1tfZnVuY3Rpb25dfSBwYXJhbWV0ZXJzYDtcclxuICAgICAgaWYgKE9iamVjdC52YWx1ZXMoUGFydGljbGVEYXRhLkZVTkNUSU9OKS5pbmNsdWRlcyhfZnVuY3Rpb24pKVxyXG4gICAgICAgIHJldHVybiBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLkZVTkNUSU9OU1tfZnVuY3Rpb25dKF9wYXJhbWV0ZXJzKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGBFcnJvciBpbiAke1BhcnRpY2xlU3lzdGVtLm5hbWV9OiBcIiR7X2Z1bmN0aW9ufVwiIGlzIG5vdCBhbiBvcGVyYXRpb25gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlcGxhY2VGdW5jdGlvbnMoX2NvZGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBmdW5jdGlvblJlZ2V4OiBSZWdFeHAgPSAvXFxiW2EtekEtel9dK1xcdypcXCgvZztcclxuICAgICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXk7XHJcbiAgICAgIHdoaWxlICgobWF0Y2ggPSBmdW5jdGlvblJlZ2V4LmV4ZWMoX2NvZGUpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGZ1bmN0aW9uR2VuZXJhdG9yOiBGdW5jdGlvbiA9IFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW0uRlVOQ1RJT05TWzxQYXJ0aWNsZURhdGEuRlVOQ1RJT04+bWF0Y2hbMF0uc2xpY2UoMCwgLTEpXTtcclxuICAgICAgICBpZiAoIWZ1bmN0aW9uR2VuZXJhdG9yKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGxldCBjb21tYUluZGljZXM6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgbGV0IG9wZW5CcmFja2V0czogbnVtYmVyID0gMTtcclxuICAgICAgICBsZXQgYXJndW1lbnRzTGFzdEluZGV4OiBudW1iZXIgPSBmdW5jdGlvblJlZ2V4Lmxhc3RJbmRleDtcclxuICAgICAgICB3aGlsZSAob3BlbkJyYWNrZXRzID4gMCkge1xyXG4gICAgICAgICAgc3dpdGNoIChfY29kZVthcmd1bWVudHNMYXN0SW5kZXhdKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCIoXCI6XHJcbiAgICAgICAgICAgICAgb3BlbkJyYWNrZXRzKys7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCIpXCI6XHJcbiAgICAgICAgICAgICAgb3BlbkJyYWNrZXRzLS07XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCIsXCI6XHJcbiAgICAgICAgICAgICAgaWYgKG9wZW5CcmFja2V0cyA9PSAxKVxyXG4gICAgICAgICAgICAgICAgY29tbWFJbmRpY2VzLnB1c2goYXJndW1lbnRzTGFzdEluZGV4KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFyZ3VtZW50c0xhc3RJbmRleCsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGFyZ3M6IHN0cmluZ1tdID1cclxuICAgICAgICAgIFtmdW5jdGlvblJlZ2V4Lmxhc3RJbmRleCAtIDEsIC4uLmNvbW1hSW5kaWNlcywgYXJndW1lbnRzTGFzdEluZGV4IC0gMV0ucmVkdWNlPHN0cmluZ1tdPigoX2FjY3VtdWxhdG9yLCBfcG9zaXRpb24sIF9pbmRleCwgX3Bvc2l0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gX2luZGV4ID09IF9wb3NpdGlvbnMubGVuZ3RoIC0gMSA/XHJcbiAgICAgICAgICAgICAgX2FjY3VtdWxhdG9yIDpcclxuICAgICAgICAgICAgICBfYWNjdW11bGF0b3IuY29uY2F0KF9jb2RlLnNsaWNlKF9wb3NpdGlvbiArIDEsIF9wb3NpdGlvbnNbX2luZGV4ICsgMV0pLnRyaW0oKSk7XHJcbiAgICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uUmVnZXgubGFzdEluZGV4ID0gbWF0Y2guaW5kZXg7XHJcbiAgICAgICAgX2NvZGUgPSBgJHtfY29kZS5zbGljZSgwLCBtYXRjaC5pbmRleCl9KCR7ZnVuY3Rpb25HZW5lcmF0b3IoYXJncyl9KSR7X2NvZGUuc2xpY2UoYXJndW1lbnRzTGFzdEluZGV4KX1gO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfY29kZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCdWZmZXJzIHRoZSByYW5kb20gbnVtYmVyIGRhdGEgZm9yIHRoZSBwYXJ0aWNsZSBzeXN0ZW0gKHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX0pIGludG8gYSBXZWJHTCBUZXh0dXJlXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVzZVJlbmRlckRhdGFcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnVzZVJlbmRlckRhdGFcclxuICAgICAgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcImRlbGV0ZVJlbmRlckRhdGFcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLmRlbGV0ZVJlbmRlckRhdGFcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB1c2VSZW5kZXJEYXRhKHRoaXM6IENvbXBvbmVudFBhcnRpY2xlU3lzdGVtKTogdm9pZCB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBpZiAodGhpcy5yZW5kZXJEYXRhKSB7XHJcbiAgICAgICAgLy8gYnVmZmVycyBleGlzdFxyXG4gICAgICAgIGNyYzMuYWN0aXZlVGV4dHVyZShURVhUVVJFX0xPQ0FUSU9OLlBBUlRJQ0xFLlVOSVQpOyAvLyBBVFRFTlRJT04hOiBjaGFuZ2luZyB0aGlzIGlkIHJlcXVpcmVzIGNoYW5naW5nIG9mIGNvcnJlc3BvbmRpbmcgaWQgaW4gcGFydGljbGUgcmVuZGVyIG1ldGhvZCwgdXNlIGN0cmwgKyBzaGlmdCArIGYgc2VhcmNoIVxyXG4gICAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCB0aGlzLnJlbmRlckRhdGEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmU6IFdlYkdMVGV4dHVyZSA9IFJlbmRlci5hc3NlcnQ8V2ViR0xUZXh0dXJlPihjcmMzLmNyZWF0ZVRleHR1cmUoKSk7XHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIHRleHR1cmUpO1xyXG5cclxuICAgICAgICBsZXQgdGV4dHVyZVNpemU6IG51bWJlciA9IE1hdGguY2VpbChNYXRoLnNxcnQodGhpcy5zaXplKSk7XHJcbiAgICAgICAgdGV4dHVyZVNpemUgPSBNYXRoLm1pbih0ZXh0dXJlU2l6ZSwgY3JjMy5nZXRQYXJhbWV0ZXIoY3JjMy5NQVhfVEVYVFVSRV9TSVpFKSk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IHVzZSBpbnRlcm5hbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciwgYWRkaXRpb25hbGx5IG1heWJlIHVzZSBhIHNlZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byByZWNyZWF0ZSB0aGUgc2FtZSByYW5kb20gbnVtYmVyc1xyXG4gICAgICAgIGxldCByYW5kb21OdW1iZXJzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0ZXh0dXJlU2l6ZSAqIHRleHR1cmVTaXplOyBpKyspXHJcbiAgICAgICAgICByYW5kb21OdW1iZXJzLnB1c2goTWF0aC5yYW5kb20oKSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjcmMzLnRleEltYWdlMkQoXHJcbiAgICAgICAgICAgIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SMzJGLCB0ZXh0dXJlU2l6ZSwgdGV4dHVyZVNpemUsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZMT0FULFxyXG4gICAgICAgICAgICBGbG9hdDMyQXJyYXkuZnJvbShyYW5kb21OdW1iZXJzKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICAgIERlYnVnLmVycm9yKF9lcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoY3JjMy5URVhUVVJFXzJELCBjcmMzLlRFWFRVUkVfTUlOX0ZJTFRFUiwgY3JjMy5ORUFSRVNUKTtcclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoY3JjMy5URVhUVVJFXzJELCBjcmMzLlRFWFRVUkVfTUFHX0ZJTFRFUiwgY3JjMy5ORUFSRVNUKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJEYXRhID0gdGV4dHVyZTtcclxuXHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIG51bGwpO1xyXG5cclxuICAgICAgICB0aGlzLnVzZVJlbmRlckRhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZGVsZXRlUmVuZGVyRGF0YSh0aGlzOiBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMucmVuZGVyRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBudWxsKTtcclxuICAgICAgY3JjMy5kZWxldGVUZXh0dXJlKHRoaXMucmVuZGVyRGF0YSk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLnJlbmRlckRhdGE7XHJcbiAgICAgIFxyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgb2JqZWN0cyB0aGF0IGNhbiBiZSByZWN5Y2xlZCwgaS5lLiB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gYnkgcmV1c2luZyB0aGUgb2JqZWN0IGluc3RlYWQgb2YgcmVwbGFjaW5nIGl0IHdpdGggYSBuZXcgb25lLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgUmVjeWNhYmxlIHtcclxuICAgIC8qKlxyXG4gICAgICogUmVjeWNsZXMgdGhlIG9iamVjdCBmb3IgdGhlIG5leHQgcmV1c2UgYnkgc2V0dGluZyBpdHMgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHN0YXRlcy5cclxuICAgICAqL1xyXG4gICAgcmVjeWNsZSgpOiB2b2lkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS2VlcHMgYSBkZXBvdCBvZiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBmb3IgcmV1c2UsIHNvcnRlZCBieSB0eXBlLiAgXHJcbiAgICogVXNpbmcge0BsaW5rIFJlY3ljbGVyfSByZWR1Y2VzIGxvYWQgb24gdGhlIGNhcmJhZ2UgY29sbGVjdG9yIGFuZCB0aHVzIHN1cHBvcnRzIHNtb290aCBwZXJmb3JtYW5jZS5cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9SZWN5Y2xlclxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWN5Y2xlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBkZXBvdDogeyBbdHlwZTogc3RyaW5nXTogT2JqZWN0W10gfSA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2hlcyBhbiBvYmplY3Qgb2YgdGhlIHJlcXVlc3RlZCB0eXBlIGZyb20gdGhlIGRlcG90LCBjYWxscyBpdHMgcmVjeWNsZS1tZXRob2QgYW5kIHJldHVybnMgaXQuXHJcbiAgICAgKiBJZiB0aGUgZGVwb3QgZm9yIHRoYXQgdHlwZSBpcyBlbXB0eSBpdCByZXR1cm5zIGEgbmV3IG9iamVjdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUuXHJcbiAgICAgKiBAcGFyYW0gX3QgVGhlIGNsYXNzIGlkZW50aWZpZXIgb2YgdGhlIGRlc2lyZWQgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBSZWN5Y2FibGUgfCBSZWN5Y2FibGVBcnJheTxUPj4oX3Q6IG5ldyAoKSA9PiBUKTogVCB7XHJcbiAgICAgIGxldCBrZXk6IHN0cmluZyA9IF90Lm5hbWU7XHJcbiAgICAgIGxldCBpbnN0YW5jZXM6IE9iamVjdFtdID0gUmVjeWNsZXIuZGVwb3Rba2V5XTtcclxuICAgICAgaWYgKGluc3RhbmNlcyAmJiBpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBpbnN0YW5jZTogVCA9IDxUPmluc3RhbmNlcy5wb3AoKTtcclxuICAgICAgICBpbnN0YW5jZS5yZWN5Y2xlKCk7XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICByZXR1cm4gbmV3IF90KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGZXRjaGVzIGFuIG9iamVjdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgZnJvbSB0aGUgZGVwb3QgYW5kIHJldHVybnMgaXQuIOKaoO+4jyoqRE9FUyBOT1QqKiBjYWxsIGl0cyByZWN5Y2xlLW1ldGhvZC5cclxuICAgICAqIEZhc3RlciB0aGFuIHtAbGluayBSZWN5Y2xlci5nZXR9LCBidXQgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXV0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJldXNlPFQgZXh0ZW5kcyBPYmplY3Q+KF90OiBuZXcgKCkgPT4gVCk6IFQge1xyXG4gICAgICByZXR1cm4gPFQ+UmVjeWNsZXIuZGVwb3RbX3QubmFtZV0/LnBvcCgpID8/IG5ldyBfdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb2YgdGhlIHJlcXVlc3RlZCB0eXBlIGluIHRoZSBkZXBvdCwgYnV0IGRvZXMgbm90IHJlbW92ZSBpdCB0aGVyZS4gXHJcbiAgICAgKiBJZiBubyBvYmplY3Qgb2YgdGhlIHJlcXVlc3RlZCB0eXBlIHdhcyBpbiB0aGUgZGVwb3QsIG9uZSBpcyBjcmVhdGVkLCBzdG9yZWQgYW5kIGJvcnJvd2VkLlxyXG4gICAgICogRm9yIHNob3J0IHRlcm0gdXNhZ2Ugb2Ygb2JqZWN0cyBpbiBhIGxvY2FsIHNjb3BlLCB3aGVuIHRoZXJlIHdpbGwgYmUgbm8gb3RoZXIgY2FsbCB0byB7QGxpbmsgUmVjeWNsZXIuZ2V0fSwge0BsaW5rIFJlY3ljbGVyLnJldXNlfSBvciB7QGxpbmsgUmVjeWNsZXIuYm9ycm93fSFcclxuICAgICAqIEBwYXJhbSBfdCBUaGUgY2xhc3MgaWRlbnRpZmllciBvZiB0aGUgZGVzaXJlZCBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBib3Jyb3c8VCBleHRlbmRzIFJlY3ljYWJsZT4oX3Q6IG5ldyAoKSA9PiBUKTogVCB7XHJcbiAgICAgIGxldCB0OiBUO1xyXG4gICAgICBsZXQga2V5OiBzdHJpbmcgPSBfdC5uYW1lO1xyXG4gICAgICBsZXQgaW5zdGFuY2VzOiBPYmplY3RbXSA9IFJlY3ljbGVyLmRlcG90W2tleV07XHJcbiAgICAgIGlmICghaW5zdGFuY2VzIHx8IGluc3RhbmNlcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIHQgPSBuZXcgX3QoKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZSh0KTtcclxuICAgICAgICByZXR1cm4gdDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgaW5zdGFuY2U6IFQgPSA8VD5pbnN0YW5jZXNbMF07XHJcbiAgICAgIGluc3RhbmNlLnJlY3ljbGUoKTtcclxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcmVzIHRoZSBvYmplY3QgaW4gdGhlIGRlcG90IGZvciBsYXRlciByZWN5Y2xpbmcuIFVzZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgdGhyb3dpbmcgaW4gb2JqZWN0cyB0aGF0IGFyZSBhYm91dCB0byBsb29zZSBzY29wZSBhbmQgYXJlIG5vdCByZWZlcmVuY2VkIGJ5IGFueSBvdGhlclxyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0b3JlKF9pbnN0YW5jZTogT2JqZWN0KTogdm9pZCB7XHJcbiAgICAgIGxldCBrZXk6IHN0cmluZyA9IF9pbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgICAvL0RlYnVnLmxvZyhrZXkpO1xyXG4gICAgICBsZXQgaW5zdGFuY2VzOiBPYmplY3RbXSA9IFJlY3ljbGVyLmRlcG90W2tleV0gfHwgW107XHJcbiAgICAgIGluc3RhbmNlcy5wdXNoKF9pbnN0YW5jZSk7XHJcbiAgICAgIFJlY3ljbGVyLmRlcG90W2tleV0gPSBpbnN0YW5jZXM7XHJcbiAgICAgIC8vIERlYnVnLmxvZyhgT2JqZWN0TWFuYWdlci5kZXBvdFske2tleX1dOiAke09iamVjdE1hbmFnZXIuZGVwb3Rba2V5XS5sZW5ndGh9YCk7XHJcbiAgICAgIC8vRGVidWcubG9nKHRoaXMuZGVwb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcmVzIHRoZSBwcm92aWRlZCBvYmplY3RzIHVzaW5nIHRoZSB7QGxpbmsgUmVjeWNsZXIuc3RvcmV9IG1ldGhvZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0b3JlTXVsdGlwbGUoLi4uX2luc3RhbmNlczogT2JqZWN0W10pOiB2b2lkIHsgLy8gVE9ETzogbWF5YmUgbWFrZSB0aGlzIHRoZSBkZWZhdWx0IHN0b3JlIG1ldGhvZFxyXG4gICAgICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIF9pbnN0YW5jZXMpXHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUoaW5zdGFuY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1wdHlzIHRoZSBkZXBvdCBvZiBhIGdpdmVuIHR5cGUsIGxlYXZpbmcgdGhlIG9iamVjdHMgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gTWF5IHJlc3VsdCBpbiBhIHNob3J0IHN0YWxsIHdoZW4gbWFueSBvYmplY3RzIHdlcmUgaW5cclxuICAgICAqIEBwYXJhbSBfdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGR1bXA8VD4oX3Q6IG5ldyAoKSA9PiBUKTogdm9pZCB7XHJcbiAgICAgIGxldCBrZXk6IHN0cmluZyA9IF90Lm5hbWU7XHJcbiAgICAgIFJlY3ljbGVyLmRlcG90W2tleV0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtcHR5cyBhbGwgZGVwb3RzLCBsZWF2aW5nIGFsbCBvYmplY3RzIHRvIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gTWF5IHJlc3VsdCBpbiBhIHNob3J0IHN0YWxsIHdoZW4gbWFueSBvYmplY3RzIHdlcmUgaW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkdW1wQWxsKCk6IHZvaWQge1xyXG4gICAgICBSZWN5Y2xlci5kZXBvdCA9IHt9O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyBhbmQgbWFuaXB1bGF0ZXMgYSB0d29kaW1lbnNpb25hbCB2ZWN0b3IgY29tcHJpc2VkIG9mIHRoZSBjb21wb25lbnRzIHggYW5kIHlcclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgICAgICAreVxyXG4gICAqICAgICAgICAgICAgIHxfXyAreFxyXG4gICAqIGBgYFxyXG4gICAqIEBhdXRob3JzIEx1a2FzIFNjaGV1ZXJsZSwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVjdG9yMiBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xyXG4gICAgcHVibGljIHk6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2V0KF94LCBfeSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFN0YXRpY1xyXG4gICAgLyoqIFxyXG4gICAgICogQSBzaG9ydGhhbmQgZm9yIHdyaXRpbmcgYG5ldyBWZWN0b3IyKDAsIDApYC5cclxuICAgICAqIEByZXR1cm5zIEEgbmV3IHZlY3RvciB3aXRoIHRoZSB2YWx1ZXMgKDAsIDApXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgWkVSTygpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoMCwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQSBzaG9ydGhhbmQgZm9yIHdyaXRpbmcgYG5ldyBWZWN0b3IyKF9zY2FsZSwgX3NjYWxlKWAuXHJcbiAgICAgKiBAcGFyYW0gX3NjYWxlIHRoZSBzY2FsZSBvZiB0aGUgdmVjdG9yLiBEZWZhdWx0OiAxXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgT05FKF9zY2FsZTogbnVtYmVyID0gMSk6IFZlY3RvcjIge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjIgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgdmVjdG9yLnNldChfc2NhbGUsIF9zY2FsZSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQSBzaG9ydGhhbmQgZm9yIHdyaXRpbmcgYG5ldyBWZWN0b3IyKHgsIDApYC5cclxuICAgICAqIEBwYXJhbSBfc2NhbGUgVGhlIG51bWJlciB0byB3cml0ZSBpbiB0aGUgeCBjb29yZGluYXRlLiBEZWZhdWx0OiAxXHJcbiAgICAgKiBAcmV0dXJucyBBIG5ldyB2ZWN0b3Igd2l0aCB0aGUgdmFsdWVzIChfc2NhbGUsIDApXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgWChfc2NhbGU6IG51bWJlciA9IDEpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoX3NjYWxlLCAwKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBBIHNob3J0aGFuZCBmb3Igd3JpdGluZyBgbmV3IFZlY3RvcjIoMCwgeSlgLlxyXG4gICAgICogQHBhcmFtIF9zY2FsZSBUaGUgbnVtYmVyIHRvIHdyaXRlIGluIHRoZSB5IGNvb3JkaW5hdGUuIERlZmF1bHQ6IDFcclxuICAgICAqIEByZXR1cm5zIEEgbmV3IHZlY3RvciB3aXRoIHRoZSB2YWx1ZXMgKDAsIF9zY2FsZSlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBZKF9zY2FsZTogbnVtYmVyID0gMSk6IFZlY3RvcjIge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjIgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgdmVjdG9yLnNldCgwLCBfc2NhbGUpO1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciB0aHJvdWdoIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBnaXZlbiB2ZWN0b3IgYnkgdGhlIGdpdmVuIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFRSQU5TRk9STUFUSU9OKF92ZWN0b3I6IFZlY3RvcjIsIF9tdHhUcmFuc2Zvcm06IE1hdHJpeDN4MywgX2luY2x1ZGVUcmFuc2xhdGlvbjogYm9vbGVhbiA9IHRydWUpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIGxldCBtOiBGbG9hdDMyQXJyYXkgPSBfbXR4VHJhbnNmb3JtLmdldCgpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KFxyXG4gICAgICAgIG1bMF0gKiBfdmVjdG9yLnggKyBtWzNdICogX3ZlY3Rvci55LFxyXG4gICAgICAgIG1bMV0gKiBfdmVjdG9yLnggKyBtWzRdICogX3ZlY3Rvci55XHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoX2luY2x1ZGVUcmFuc2xhdGlvbilcclxuICAgICAgICB2ZWN0b3IuYWRkKF9tdHhUcmFuc2Zvcm0udHJhbnNsYXRpb24pO1xyXG5cclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB2ZWN0b3Igd2hpY2ggaXMgYSBjb3B5IG9mIHRoZSBnaXZlbiB2ZWN0b3Igc2NhbGVkIHRvIHRoZSBnaXZlbiBsZW5ndGguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTk9STUFMSVpBVElPTihfdmVjdG9yOiBWZWN0b3IyLCBfbGVuZ3RoOiBudW1iZXIgPSAxKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBtYWduaXR1ZGVTcXVhcmVkOiBudW1iZXIgPSBfdmVjdG9yLm1hZ25pdHVkZVNxdWFyZWQ7XHJcbiAgICAgIGlmIChtYWduaXR1ZGVTcXVhcmVkID09IDApXHJcbiAgICAgICAgdGhyb3cgKG5ldyBSYW5nZUVycm9yKFwiSW1wb3NzaWJsZSBub3JtYWxpemF0aW9uXCIpKTtcclxuICAgICAgbGV0IHZlY3RvcjogVmVjdG9yMiA9IF92ZWN0b3IuY2xvbmU7XHJcbiAgICAgIHZlY3Rvci5zY2FsZShfbGVuZ3RoIC8gTWF0aC5zcXJ0KG1hZ25pdHVkZVNxdWFyZWQpKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBuZXcgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gdmVjdG9yIHNjYWxlZCBieSB0aGUgZ2l2ZW4gc2NhbGluZyBmYWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTQ0FMRShfdmVjdG9yOiBWZWN0b3IyLCBfc2NhbGU6IG51bWJlcik6IFZlY3RvcjIge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjIgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgdmVjdG9yLnNldChfdmVjdG9yLnggKiBfc2NhbGUsIF92ZWN0b3IueSAqIF9zY2FsZSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgdmVjdG9yIGF0dGFpbmVkIGJ5IGFkZGl0aW9uIG9mIGFsbCBnaXZlbiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNVTSguLi5fdmVjdG9yczogVmVjdG9yMltdKTogVmVjdG9yMiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICBmb3IgKGxldCB2ZWN0b3Igb2YgX3ZlY3RvcnMpXHJcbiAgICAgICAgcmVzdWx0LnNldChyZXN1bHQueCArIHZlY3Rvci54LCByZXN1bHQueSArIHZlY3Rvci55KTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgc3VidHJhY3Rpb24gb2YgdHdvIHZlY3RvcnMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgRElGRkVSRU5DRShfbWludWVuZDogVmVjdG9yMiwgX3N1YnRyYWhlbmQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoX21pbnVlbmQueCAtIF9zdWJ0cmFoZW5kLngsIF9taW51ZW5kLnkgLSBfc3VidHJhaGVuZC55KTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIFZlY3RvcnMuIER1ZSB0byB0aGVtIGJlaW5nIG9ubHkgMiBEaW1lbnNpb25hbCwgdGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBudW1iZXIsXHJcbiAgICAgKiB3aGljaCBpbXBsaWNpdGx5IGlzIG9uIHRoZSBaIGF4aXMuIEl0IGlzIGFsc28gdGhlIHNpZ25lZCBtYWduaXR1ZGUgb2YgdGhlIHJlc3VsdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDUk9TUyhfYTogVmVjdG9yMiwgX2I6IFZlY3RvcjIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX2EueCAqIF9iLnkgLSBfYS55ICogX2IueDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIHRoZSBkb3Rwcm9kdWN0IG9mIDIgdmVjdG9ycy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBET1QoX2E6IFZlY3RvcjIsIF9iOiBWZWN0b3IyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIF9hLnggKiBfYi54ICsgX2EueSAqIF9iLnk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBvcnRob2dvbmFsIHZlY3RvciB0byB0aGUgZ2l2ZW4gdmVjdG9yLiBSb3RhdGVzIGNvdW50ZXJjbG9ja3dpc2UgYnkgZGVmYXVsdC5cclxuICAgICAqIGBgYHRleHRcclxuICAgICAqIOKGkSA9PiDihpAgPT4g4oaTID0+IOKGkiA9PiDihpFcclxuICAgICAqIGBgYFxyXG4gICAgICogQHBhcmFtIF92ZWN0b3IgVmVjdG9yIHRvIGdldCB0aGUgb3J0aG9nb25hbCBlcXVpdmFsZW50IG9mXHJcbiAgICAgKiBAcGFyYW0gX2Nsb2Nrd2lzZSBTaG91bGQgdGhlIHJvdGF0aW9uIGJlIGNsb2Nrd2lzZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGNvdW50ZXJjbG9ja3dpc2U/IGRlZmF1bHQ6IGZhbHNlXHJcbiAgICAgKiBAcmV0dXJucyBBIFZlY3RvciB0aGF0IGlzIG9ydGhvZ29uYWwgdG8gYW5kIGhhcyB0aGUgc2FtZSBtYWduaXR1ZGUgYXMgdGhlIGdpdmVuIFZlY3Rvci4gIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE9SVEhPR09OQUwoX3ZlY3RvcjogVmVjdG9yMiwgX2Nsb2Nrd2lzZTogYm9vbGVhbiA9IGZhbHNlKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IyKTtcclxuICAgICAgaWYgKF9jbG9ja3dpc2UpXHJcbiAgICAgICAgcmVzdWx0LnNldChfdmVjdG9yLnksIC1fdmVjdG9yLngpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmVzdWx0LnNldCgtX3ZlY3Rvci55LCBfdmVjdG9yLngpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGNhcnRlc2lhbiB2ZWN0b3IgZnJvbSBwb2xhciBjb29yZGluYXRlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEdFTyhfYW5nbGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHZlY3RvcjogVmVjdG9yMiA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpO1xyXG4gICAgICBsZXQgZ2VvOiBHZW8yID0gUmVjeWNsZXIucmV1c2UoR2VvMik7XHJcbiAgICAgIGdlby5zZXQoX2FuZ2xlLCBfbWFnbml0dWRlKTtcclxuICAgICAgdmVjdG9yLmdlbyA9IGdlbztcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoZ2VvKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBBY2Nlc3NvcnNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYWduaXR1ZGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGguaHlwb3QodGhpcy54LCB0aGlzLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc3F1YXJlIG9mIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZlY3RvciB3aXRob3V0IGNhbGN1bGF0aW5nIGEgc3F1YXJlIHJvb3QuIEZhc3RlciBmb3Igc2ltcGxlIHByb3hpbWl0eSBldmFsdWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1hZ25pdHVkZVNxdWFyZWQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIFZlY3RvcjIuRE9UKHRoaXMsIHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHBvbGFyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZ2VvKCk6IEdlbzIge1xyXG4gICAgICBsZXQgZ2VvOiBHZW8yID0gUmVjeWNsZXIuZ2V0KEdlbzIpO1xyXG4gICAgICBnZW8ubWFnbml0dWRlID0gdGhpcy5tYWduaXR1ZGU7XHJcblxyXG4gICAgICBpZiAoZ2VvLm1hZ25pdHVkZSA9PT0gMClcclxuICAgICAgICByZXR1cm4gZ2VvO1xyXG5cclxuICAgICAgZ2VvLmFuZ2xlID0gMTgwICogTWF0aC5hdGFuMih0aGlzLnkgLyBnZW8ubWFnbml0dWRlLCB0aGlzLnggLyBnZW8ubWFnbml0dWRlKSAvIE1hdGguUEk7XHJcbiAgICAgIHJldHVybiBnZW87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3QgdGhlIGNhcnRlc2lhbiB2YWx1ZXMgb2YgdGhpcyB2ZWN0b3IgdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBhcyBwb2xhciBjb29yZGluYXRlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IGdlbyhfZ2VvOiBHZW8yKSB7XHJcbiAgICAgIHRoaXMuc2V0KF9nZW8ubWFnbml0dWRlLCAwKTtcclxuICAgICAgdGhpcy50cmFuc2Zvcm0oTWF0cml4M3gzLlJPVEFUSU9OKF9nZW8uYW5nbGUpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjbG9uZSBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjbG9uZSgpOiBWZWN0b3IyIHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKFZlY3RvcjIpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGUgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGludG8gdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXQoX29yaWdpbmFsLngsIF9vcmlnaW5hbC55KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvb3JkaW5hdGVzIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiB2ZWN0b3IgYXJlIHRvIGJlIGNvbnNpZGVyZWQgaWRlbnRpY2FsIHdpdGhpbiB0aGUgZ2l2ZW4gdG9sZXJhbmNlXHJcbiAgICAgKiBUT0RPOiBleGFtaW5lLCBpZiB0b2xlcmFuY2UgYXMgY3JpdGVyaXVtIGZvciB0aGUgZGlmZmVyZW5jZSBpcyBhcHByb3ByaWF0ZSB3aXRoIHZlcnkgbGFyZ2UgY29vcmRpbmF0ZSB2YWx1ZXMgb3IgaWYgX3RvbGVyYW5jZSBzaG91bGQgYmUgbXVsdGlwbGllZCBieSBjb29yZGluYXRlIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBlcXVhbHMoX2NvbXBhcmU6IFZlY3RvcjIsIF90b2xlcmFuY2U6IG51bWJlciA9IE51bWJlci5FUFNJTE9OKTogYm9vbGVhbiB7XHJcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLnggLSBfY29tcGFyZS54KSA+IF90b2xlcmFuY2UpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKE1hdGguYWJzKHRoaXMueSAtIF9jb21wYXJlLnkpID4gX3RvbGVyYW5jZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGUgZXhlY3V0aW5nIHZlY3RvciwgY2hhbmdpbmcgdGhlIGV4ZWN1dG9yLlxyXG4gICAgICogQHBhcmFtIF9hZGRlbmQgVGhlIHZlY3RvciB0byBhZGQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGQoX2FkZGVuZDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICB0aGlzLnggKz0gX2FkZGVuZC54O1xyXG4gICAgICB0aGlzLnkgKz0gX2FkZGVuZC55O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gdmVjdG9yIGZyb20gdGhlIGV4ZWN1dGluZyB2ZWN0b3IsIGNoYW5naW5nIHRoZSBleGVjdXRvci5cclxuICAgICAqIEBwYXJhbSBfc3VidHJhaGVuZCBUaGUgdmVjdG9yIHRvIHN1YnRyYWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3VidHJhY3QoX3N1YnRyYWhlbmQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuICAgICAgdGhpcy54IC09IF9zdWJ0cmFoZW5kLng7XHJcbiAgICAgIHRoaXMueSAtPSBfc3VidHJhaGVuZC55O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlcyB0aGUgVmVjdG9yIGJ5IHRoZSBnaXZlbiBfc2NhbGFyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX3NjYWxhcjogbnVtYmVyKTogVmVjdG9yMiB7XHJcbiAgICAgIHRoaXMueCAqPSBfc2NhbGFyO1xyXG4gICAgICB0aGlzLnkgKj0gX3NjYWxhcjtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemVzIHRoaXMgdG8gdGhlIGdpdmVuIGxlbmd0aCwgMSBieSBkZWZhdWx0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBub3JtYWxpemUoX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb3B5KFZlY3RvcjIuTk9STUFMSVpBVElPTih0aGlzLCBfbGVuZ3RoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCk6IFZlY3RvcjIge1xyXG4gICAgICB0aGlzLnggPSBfeDtcclxuICAgICAgdGhpcy55ID0gX3k7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbdGhpcy54LCB0aGlzLnldKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhpcyB2ZWN0b3IgYnkgdGhlIGdpdmVuIG1hdHJpeCwgaW5jbHVkaW5nIG9yIGV4bHVkaW5nIHRoZSB0cmFuc2xhdGlvbi5cclxuICAgICAqIEluY2x1ZGluZyBpcyB0aGUgZGVmYXVsdCwgZXhjbHVkaW5nIHdpbGwgb25seSByb3RhdGUgYW5kIHNjYWxlIHRoaXMgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNmb3JtKF9tdHhUcmFuc2Zvcm06IE1hdHJpeDN4MywgX2luY2x1ZGVUcmFuc2xhdGlvbjogYm9vbGVhbiA9IHRydWUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHRyYW5zZm9ybWVkOiBWZWN0b3IyID0gVmVjdG9yMi5UUkFOU0ZPUk1BVElPTih0aGlzLCBfbXR4VHJhbnNmb3JtLCBfaW5jbHVkZVRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5jb3B5KHRyYW5zZm9ybWVkKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNmb3JtZWQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciBlYWNoIGRpbWVuc2lvbiwgbW92ZXMgdGhlIGNvbXBvbmVudCB0byB0aGUgbWluaW11bSBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtaW4oX2NvbXBhcmU6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuICAgICAgdGhpcy54ID0gTWF0aC5taW4odGhpcy54LCBfY29tcGFyZS54KTtcclxuICAgICAgdGhpcy55ID0gTWF0aC5taW4odGhpcy55LCBfY29tcGFyZS55KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZvciBlYWNoIGRpbWVuc2lvbiwgbW92ZXMgdGhlIGNvbXBvbmVudCB0byB0aGUgbWF4aW11bSBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYXgoX2NvbXBhcmU6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuICAgICAgdGhpcy54ID0gTWF0aC5tYXgodGhpcy54LCBfY29tcGFyZS54KTtcclxuICAgICAgdGhpcy55ID0gTWF0aC5tYXgodGhpcy55LCBfY29tcGFyZS55KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgei1jb21wb25lbnQgb2YgdGhlIGdpdmVuIG1hZ25pdHVkZSAoZGVmYXVsdD0wKSB0byB0aGUgdmVjdG9yIGFuZCByZXR1cm5zIGEgbmV3IFZlY3RvcjNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvVmVjdG9yMyhfejogbnVtYmVyID0gMCk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy54LCB0aGlzLnksIF96KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBgKCR7dGhpcy54LnRvUHJlY2lzaW9uKDUpfSwgJHt0aGlzLnkudG9QcmVjaXNpb24oNSl9KWA7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VzIHRoZSBzdGFuZGFyZCBhcnJheS5tYXAgZnVuY3Rpb25hbGl0eSB0byBwZXJmb3JtIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiBhbGwgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvclxyXG4gICAgICogYW5kIHJldHVybiBhIG5ldyB2ZWN0b3Igd2l0aCB0aGUgcmVzdWx0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWFwKF9mdW5jdGlvbjogKHZhbHVlOiBudW1iZXIsIGluZGV4OiBudW1iZXIsIGFycmF5OiBBcnJheUxpa2U8bnVtYmVyPikgPT4gbnVtYmVyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBjb3B5OiBWZWN0b3IyID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgICBjb3B5LnNldCguLi5bdGhpcy54LCB0aGlzLnldLm1hcChfZnVuY3Rpb24pKTtcclxuICAgICAgcmV0dXJuIGNvcHk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuZ2V0TXV0YXRvcigpO1xyXG4gICAgICAvLyBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGB7IFwiclwiOiAke3RoaXMucn0sIFwiZ1wiOiAke3RoaXMuZ30sIFwiYlwiOiAke3RoaXMuYn0sIFwiYVwiOiAke3RoaXMuYX19YDsgfTtcclxuICAgICAgc2VyaWFsaXphdGlvbi50b0pTT04gPSAoKSA9PiB7IHJldHVybiBgWyR7dGhpcy54fSwgJHt0aGlzLnl9XWA7IH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8VmVjdG9yMj4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfc2VyaWFsaXphdGlvbikgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIFt0aGlzLngsIHRoaXMueV0gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICB4OiB0aGlzLngsIHk6IHRoaXMueVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyoqICovIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIi4uL1JlY3ljbGUvUmVjeWNsZXIudHNcIi8+XHJcbi8vLzxyZWZlcmVuY2UgcGF0aD1cIlZlY3RvcjIudHNcIi8+XHJcblxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBEZWZpbmVzIHRoZSBvcmlnaW4gb2YgYSByZWN0YW5nbGVcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBPUklHSU4yRCB7XHJcbiAgICBUT1BMRUZUID0gMHgwMCxcclxuICAgIFRPUENFTlRFUiA9IDB4MDEsXHJcbiAgICBUT1BSSUdIVCA9IDB4MDIsXHJcbiAgICBDRU5URVJMRUZUID0gMHgxMCxcclxuICAgIENFTlRFUiA9IDB4MTEsXHJcbiAgICBDRU5URVJSSUdIVCA9IDB4MTIsXHJcbiAgICBCT1RUT01MRUZUID0gMHgyMCxcclxuICAgIEJPVFRPTUNFTlRFUiA9IDB4MjEsXHJcbiAgICBCT1RUT01SSUdIVCA9IDB4MjJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgYSByZWN0YW5nbGUgd2l0aCBwb3NpdGlvbiBhbmQgc2l6ZSBhbmQgYWRkIGNvbWZvcnRhYmxlIG1ldGhvZHMgdG8gaXRcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJlY3RhbmdsZSBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIHBvc2l0aW9uOiBWZWN0b3IyID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgcHVibGljIHNpemU6IFZlY3RvcjIgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMik7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3dpZHRoOiBudW1iZXIgPSAxLCBfaGVpZ2h0OiBudW1iZXIgPSAxLCBfb3JpZ2luOiBPUklHSU4yRCA9IE9SSUdJTjJELlRPUExFRlQpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zZXRQb3NpdGlvbkFuZFNpemUoX3gsIF95LCBfd2lkdGgsIF9oZWlnaHQsIF9vcmlnaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG5ldyByZWN0YW5nbGUgY3JlYXRlZCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgR0VUKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3dpZHRoOiBudW1iZXIgPSAxLCBfaGVpZ2h0OiBudW1iZXIgPSAxLCBfb3JpZ2luOiBPUklHSU4yRCA9IE9SSUdJTjJELlRPUExFRlQpOiBSZWN0YW5nbGUge1xyXG4gICAgICBsZXQgcmVjdDogUmVjdGFuZ2xlID0gUmVjeWNsZXIuZ2V0KFJlY3RhbmdsZSk7XHJcbiAgICAgIHJlY3Quc2V0UG9zaXRpb25BbmRTaXplKF94LCBfeSwgX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgICAgcmV0dXJuIHJlY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB4KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLng7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHkoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2l6ZS54O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2l6ZS55O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBsZWZ0bW9zdCBleHBhbnNpb24sIHJlc3BlY3RpbmcgYWxzbyBuZWdhdGl2ZSB2YWx1ZXMgb2Ygd2lkdGhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBsZWZ0KCk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0aGlzLnNpemUueCA+IDApXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDtcclxuICAgICAgcmV0dXJuICh0aGlzLnBvc2l0aW9uLnggKyB0aGlzLnNpemUueCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgdG9wbW9zdCBleHBhbnNpb24sIHJlc3BlY3RpbmcgYWxzbyBuZWdhdGl2ZSB2YWx1ZXMgb2YgaGVpZ2h0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdG9wKCk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0aGlzLnNpemUueSA+IDApXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgICAgcmV0dXJuICh0aGlzLnBvc2l0aW9uLnkgKyB0aGlzLnNpemUueSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgcmlnaHRtb3N0IGV4cGFuc2lvbiwgcmVzcGVjdGluZyBhbHNvIG5lZ2F0aXZlIHZhbHVlcyBvZiB3aWR0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJpZ2h0KCk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0aGlzLnNpemUueCA+IDApXHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnBvc2l0aW9uLnggKyB0aGlzLnNpemUueCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLng7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgbG93ZXN0IGV4cGFuc2lvbiwgcmVzcGVjdGluZyBhbHNvIG5lZ2F0aXZlIHZhbHVlcyBvZiBoZWlnaHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBib3R0b20oKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMuc2l6ZS55ID4gMClcclxuICAgICAgICByZXR1cm4gKHRoaXMucG9zaXRpb24ueSArIHRoaXMuc2l6ZS55KTtcclxuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHgoX3g6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnBvc2l0aW9uLnggPSBfeDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgeShfeTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb24ueSA9IF95O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB3aWR0aChfd2lkdGg6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNpemUueCA9IF93aWR0aDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgaGVpZ2h0KF9oZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNpemUueSA9IF9oZWlnaHQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGxlZnQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5zaXplLnggPSB0aGlzLnJpZ2h0IC0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLnBvc2l0aW9uLnggPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRvcChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNpemUueSA9IHRoaXMuYm90dG9tIC0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLnBvc2l0aW9uLnkgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJpZ2h0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuc2l6ZS54ID0gdGhpcy5wb3NpdGlvbi54ICsgX3ZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBib3R0b20oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5zaXplLnkgPSB0aGlzLnBvc2l0aW9uLnkgKyBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjbG9uZSgpOiBSZWN0YW5nbGUge1xyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVCh0aGlzLngsIHRoaXMueSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldFBvc2l0aW9uQW5kU2l6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoaXMgcmVjdGFuZ2xlIHRvIHRoZSB2YWx1ZXMgZ2l2ZW4gYnkgdGhlIHJlY3RhbmdsZSBwcm92aWRlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29weShfcmVjdDogUmVjdGFuZ2xlKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0UG9zaXRpb25BbmRTaXplKF9yZWN0LngsIF9yZWN0LnksIF9yZWN0LndpZHRoLCBfcmVjdC5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcG9zaXRpb24gYW5kIHNpemUgb2YgdGhlIHJlY3RhbmdsZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHBhcmFtZXRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFBvc2l0aW9uQW5kU2l6ZShfeDogbnVtYmVyID0gMCwgX3k6IG51bWJlciA9IDAsIF93aWR0aDogbnVtYmVyID0gMSwgX2hlaWdodDogbnVtYmVyID0gMSwgX29yaWdpbjogT1JJR0lOMkQgPSBPUklHSU4yRC5UT1BMRUZUKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2l6ZS5zZXQoX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgICAgc3dpdGNoIChfb3JpZ2luICYgMHgwMykge1xyXG4gICAgICAgIGNhc2UgMHgwMDogdGhpcy5wb3NpdGlvbi54ID0gX3g7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMHgwMTogdGhpcy5wb3NpdGlvbi54ID0gX3ggLSBfd2lkdGggLyAyOyBicmVhaztcclxuICAgICAgICBjYXNlIDB4MDI6IHRoaXMucG9zaXRpb24ueCA9IF94IC0gX3dpZHRoOyBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBzd2l0Y2ggKF9vcmlnaW4gJiAweDMwKSB7XHJcbiAgICAgICAgY2FzZSAweDAwOiB0aGlzLnBvc2l0aW9uLnkgPSBfeTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAweDEwOiB0aGlzLnBvc2l0aW9uLnkgPSBfeSAtIF9oZWlnaHQgLyAyOyBicmVhaztcclxuICAgICAgICBjYXNlIDB4MjA6IHRoaXMucG9zaXRpb24ueSA9IF95IC0gX2hlaWdodDsgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHBvaW50IGZyb20gdGhpcyByZWN0YW5nbGVzIHNwYWNlIHRvIHRoZSB0YXJnZXQgcmVjdGFuZ2xlcyBzcGFjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRUb1JlY3QoX3BvaW50OiBWZWN0b3IyLCBfdGFyZ2V0OiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IF9wb2ludC5jbG9uZTtcclxuICAgICAgcmVzdWx0LnN1YnRyYWN0KHRoaXMucG9zaXRpb24pO1xyXG4gICAgICByZXN1bHQueCAqPSBfdGFyZ2V0LndpZHRoIC8gdGhpcy53aWR0aDtcclxuICAgICAgcmVzdWx0LnkgKj0gX3RhcmdldC5oZWlnaHQgLyB0aGlzLmhlaWdodDtcclxuICAgICAgcmVzdWx0LmFkZChfdGFyZ2V0LnBvc2l0aW9uKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcG9pbnQgaXMgaW5zaWRlIG9mIHRoaXMgcmVjdGFuZ2xlIG9yIG9uIHRoZSBib3JkZXJcclxuICAgICAqIEBwYXJhbSBfcG9pbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzSW5zaWRlKF9wb2ludDogVmVjdG9yMik6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gKF9wb2ludC54ID49IHRoaXMubGVmdCAmJiBfcG9pbnQueCA8PSB0aGlzLnJpZ2h0ICYmIF9wb2ludC55ID49IHRoaXMudG9wICYmIF9wb2ludC55IDw9IHRoaXMuYm90dG9tKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlY3RhbmdsZSBjb2xsaWRlcyB3aXRoIHRoZSByZWN0YW5nbGUgZ2l2ZW5cclxuICAgICAqIEBwYXJhbSBfcmVjdCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbGxpZGVzKF9yZWN0OiBSZWN0YW5nbGUpOiBib29sZWFuIHtcclxuICAgICAgaWYgKHRoaXMubGVmdCA+IF9yZWN0LnJpZ2h0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnJpZ2h0IDwgX3JlY3QubGVmdCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy50b3AgPiBfcmVjdC5ib3R0b20pIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuYm90dG9tIDwgX3JlY3QudG9wKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmVjdGFuZ2xlIGNyZWF0ZWQgYnkgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlIG9yIG51bGwsIGlmIHRoZXkgZG9uJ3QgY29sbGlkZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0SW50ZXJzZWN0aW9uKF9yZWN0OiBSZWN0YW5nbGUpOiBSZWN0YW5nbGUge1xyXG4gICAgICBpZiAoIXRoaXMuY29sbGlkZXMoX3JlY3QpKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IGludGVyc2VjdGlvbjogUmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgpO1xyXG4gICAgICBpbnRlcnNlY3Rpb24ueCA9IE1hdGgubWF4KHRoaXMubGVmdCwgX3JlY3QubGVmdCk7XHJcbiAgICAgIGludGVyc2VjdGlvbi55ID0gTWF0aC5tYXgodGhpcy50b3AsIF9yZWN0LnRvcCk7XHJcbiAgICAgIGludGVyc2VjdGlvbi53aWR0aCA9IE1hdGgubWluKHRoaXMucmlnaHQsIF9yZWN0LnJpZ2h0KSAtIGludGVyc2VjdGlvbi54O1xyXG4gICAgICBpbnRlcnNlY3Rpb24uaGVpZ2h0ID0gTWF0aC5taW4odGhpcy5ib3R0b20sIF9yZWN0LmJvdHRvbSkgLSBpbnRlcnNlY3Rpb24ueTtcclxuXHJcbiAgICAgIHJldHVybiBpbnRlcnNlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAqIFJldHVybnMgdGhlIHJlY3RhbmdsZSBjcmVhdGVkIGJ5IHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBhbmQgdGhlIGdpdmVuIHJlY3RhbmdsZSBvciBudWxsLCBpZiB0aGV5IGRvbid0IGNvbGxpZGVcclxuICovXHJcbiAgICBwdWJsaWMgY292ZXJzKF9yZWN0OiBSZWN0YW5nbGUpOiBib29sZWFuIHtcclxuICAgICAgaWYgKHRoaXMubGVmdCA+IF9yZWN0LmxlZnQpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMucmlnaHQgPCBfcmVjdC5yaWdodCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy50b3AgPiBfcmVjdC50b3ApIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuYm90dG9tIDwgX3JlY3QuYm90dG9tKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJlY3RhbmdsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHJlc3VsdDogc3RyaW5nID0gYMaSLlJlY3RhbmdsZShwb3NpdGlvbjoke3RoaXMucG9zaXRpb24udG9TdHJpbmcoKX0sIHNpemU6JHt0aGlzLnNpemUudG9TdHJpbmcoKX1gO1xyXG4gICAgICByZXN1bHQgKz0gYCwgbGVmdDoke3RoaXMubGVmdC50b1ByZWNpc2lvbig1KX0sIHRvcDoke3RoaXMudG9wLnRvUHJlY2lzaW9uKDUpfSwgcmlnaHQ6JHt0aGlzLnJpZ2h0LnRvUHJlY2lzaW9uKDUpfSwgYm90dG9tOiR7dGhpcy5ib3R0b20udG9QcmVjaXNpb24oNSl9YDtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qICovIH1cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCJSZW5kZXJJbmplY3Rvci50c1wiLz5cclxuLy8vPHJlZmVyZW5jZSBwYXRoPVwiUmVuZGVySW5qZWN0b3JTaGFkZXIudHNcIi8+XHJcbi8vLzxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlckluamVjdG9yQ29hdC50c1wiLz5cclxuLy8vPHJlZmVyZW5jZSBwYXRoPVwiUmVuZGVySW5qZWN0b3JNZXNoLnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCJSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtLnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCJSZW5kZXJJbmplY3RvckNvbXBvbmVudFBhcnRpY2xlU3lzdGVtLnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCIuLi9NYXRoL1JlY3RhbmdsZS50c1wiLz5cclxuXHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8vIGV4cG9ydCBkZWNsYXJlIGxldCBmdWRnZUNvbmZpZzogR2VuZXJhbDtcclxuXHJcbiAgZXhwb3J0IHR5cGUgUmVuZGVyVGV4dHVyZSA9IFdlYkdMVGV4dHVyZTtcclxuXHJcbiAgZXhwb3J0IGVudW0gQkxFTkQge1xyXG4gICAgT1BBUVVFLCBUUkFOU1BBUkVOVCwgQURESVRJVkUsIFNVQlRSQUNUSVZFLCBNT0RVTEFURVxyXG4gIH1cclxuXHJcbiAgLy8gd2Ugd2FudCB0eXBlIGluZmVyZW5jZSBoZXJlIHNvIHdlIGNhbiB1c2UgdnMgY29kZSB0byBzZWFyY2ggZm9yIHJlZmVyZW5jZXNcclxuICBleHBvcnQgY29uc3QgVU5JRk9STV9CTE9DS1MgPSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuICAgIExJR0hUUzoge1xyXG4gICAgICBOQU1FOiBcIkxpZ2h0c1wiLFxyXG4gICAgICBCSU5ESU5HOiAwXHJcbiAgICB9LFxyXG4gICAgU0tJTjoge1xyXG4gICAgICBOQU1FOiBcIlNraW5cIixcclxuICAgICAgQklORElORzogMVxyXG4gICAgfSxcclxuICAgIEZPRzoge1xyXG4gICAgICBOQU1FOiBcIkZvZ1wiLFxyXG4gICAgICBCSU5ESU5HOiAyXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgZXhwb3J0IGNvbnN0IFRFWFRVUkVfTE9DQVRJT04gPSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuICAgIENPTE9SOiB7XHJcbiAgICAgIFVOSUZPUk06IFwidV90ZXhDb2xvclwiLFxyXG4gICAgICBVTklUOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwLFxyXG4gICAgICBJTkRFWDogMCAvLyBjb3VsZCBjb21wdXRlIHRoZXNlIGJ5IFVOSVQgLSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwIFxyXG4gICAgfSxcclxuICAgIE5PUk1BTDoge1xyXG4gICAgICBVTklGT1JNOiBcInVfdGV4Tm9ybWFsXCIsXHJcbiAgICAgIFVOSVQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTEsXHJcbiAgICAgIElOREVYOiAxXHJcbiAgICB9LFxyXG4gICAgUEFSVElDTEU6IHtcclxuICAgICAgVU5JRk9STTogXCJ1X3BhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1wiLFxyXG4gICAgICBVTklUOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUyLFxyXG4gICAgICBJTkRFWDogMlxyXG4gICAgfSxcclxuICAgIFRFWFQ6IHtcclxuICAgICAgVU5JRk9STTogXCJ1X3RleFRleHRcIiwgLy8gVE9ETzogYWRkIHRleHQgdW5pZm9ybSB0byBzaGFkZXIuLi5cclxuICAgICAgVU5JVDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMyxcclxuICAgICAgSU5ERVg6IDNcclxuICAgIH0sXHJcbiAgICBUT09OOiB7XHJcbiAgICAgIFVOSUZPUk06IFwidV90ZXhUb29uXCIsXHJcbiAgICAgIFVOSVQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTQsXHJcbiAgICAgIElOREVYOiA0XHJcbiAgICB9XHJcbiAgfSBhcyBjb25zdDtcclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZSBjbGFzcyBmb3IgUmVuZGVyTWFuYWdlciwgaGFuZGxpbmcgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHJlbmRlcmluZyBzeXN0ZW0sIGluIHRoaXMgY2FzZSBXZWJHTC5cclxuICAgKiBNZXRob2RzIGFuZCBhdHRyaWJ1dGVzIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHksIG9ubHkgdGhyb3VnaCB7QGxpbmsgUmVuZGVyfVxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJXZWJHTCBleHRlbmRzIEV2ZW50VGFyZ2V0U3RhdGljIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgdWJvTGlnaHRzOiBXZWJHTEJ1ZmZlcjtcclxuICAgIHB1YmxpYyBzdGF0aWMgdWJvTGlnaHRzVmFyaWFibGVPZmZzZXRzOiB7IFtfbmFtZTogc3RyaW5nXTogbnVtYmVyIH07IC8vIE1hcHMgdGhlIG5hbWVzIG9mIHRoZSB2YXJpYWJsZXMgaW5zaWRlIHRoZSBMaWdodHMgdW5pZm9ybSBibG9jayB0byB0aGVpciByZXNwZWN0aXZlIGJ5dGUgb2Zmc2V0XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuaW5pdGlhbGl6ZSgpO1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyDGknBpY2tlZDogUGlja1tdO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlY3RSZW5kZXI6IFJlY3RhbmdsZSA9IFJlbmRlcldlYkdMLmdldENhbnZhc1JlY3QoKTtcclxuICAgIHByaXZhdGUgc3RhdGljIHNpemVQaWNrOiBudW1iZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmJvTWFpbjogV2ViR0xGcmFtZWJ1ZmZlcjsgLy8gdXNlZCBmb3IgZm9yd2FyZCByZW5kZXJpbmcgcGFzc2VzLCBlLmcuIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgb2JqZWN0c1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmJvUG9zdDogV2ViR0xGcmFtZWJ1ZmZlcjsgLy8gdXNlZCBmb3IgcG9zdC1wcm9jZXNzaW5nIGVmZmVjdHMsIGF0dGFjaG1lbnRzIGdldCBzd2FwcGVkIGZvciBkaWZmZXJlbnQgZWZmZWN0c1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmJvVGFyZ2V0OiBXZWJHTEZyYW1lYnVmZmVyOyAvLyB1c2VkIHRvIHJlbmRlciB0aGUgZmluYWwgaW1hZ2UgdG8sIHVzdWFsbHkgXCJudWxsXCIgdG8gcmVuZGVyIHRvIHRoZSBjYW52YXMgZGVmYXVsdCBmcmFtZWJ1ZmZlci4gVXNlZCBieSBYUiB0byByZW5kZXIgdG8gdGhlIFhSV2ViR0xMYXllciBmcmFtZWJ1ZmZlci5cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyB0ZXhDb2xvcjogV2ViR0xUZXh0dXJlOyAvLyBzdG9yZXMgdGhlIGNvbG9yIG9mIGVhY2ggcGl4ZWwgcmVuZGVyZWRcclxuICAgIHByaXZhdGUgc3RhdGljIHRleFBvc2l0aW9uOiBXZWJHTFRleHR1cmU7IC8vIHN0b3JlcyB0aGUgcG9zaXRpb24gb2YgZWFjaCBwaXhlbCBpbiB3b3JsZCBzcGFjZVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4Tm9ybWFsOiBXZWJHTFRleHR1cmU7IC8vIHN0b3JlcyB0aGUgbm9ybWFsIG9mIGVhY2ggcGl4ZWwgaW4gd29ybGQgc3BhY2VcclxuICAgIHByaXZhdGUgc3RhdGljIHRleE5vaXNlOiBXZWJHTFRleHR1cmU7IC8vIHN0b3JlcyByYW5kb20gdmFsdWVzIGZvciBlYWNoIHBpeGVsLCB1c2VkIGZvciBhbWJpZW50IG9jY2x1c2lvblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4RGVwdGhTdGVuY2lsOiBXZWJHTFRleHR1cmU7IC8vIHN0b3JlcyB0aGUgZGVwdGggb2YgZWFjaCBwaXhlbCwgY3VycmVudGx5IHVudXNlZFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4Qmxvb21TYW1wbGVzOiBXZWJHTFRleHR1cmVbXTsgLy8gc3RvcmVzIGRvd24gYW5kIHVwc2FtcGxlZCB2ZXJzaW9ucyBvZiB0aGUgY29sb3IgdGV4dHVyZSwgdXNlZCBmb3IgYmxvb21cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyB1Ym9Gb2c6IFdlYkdMQnVmZmVyOyAvLyBzdG9yZXMgdGhlIGZvZyBwYXJhbWV0ZXJzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBvZmZzY3JlZW4tY2FudmFzLCByZW5kZXJpbmdjb250ZXh0IGFuZCBoYXJkd2FyZSB2aWV3cG9ydC4gQ2FsbCBvbmNlIGJlZm9yZSBjcmVhdGluZyBhbnkgcmVzb3VyY2VzIGxpa2UgbWVzaGVzIG9yIHNoYWRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplKF9hbnRpYWxpYXM/OiBib29sZWFuLCBfYWxwaGE/OiBib29sZWFuKTogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB7XHJcbiAgICAgIGxldCBmdWRnZUNvbmZpZzogR2VuZXJhbCA9IFJlZmxlY3QuZ2V0KGdsb2JhbFRoaXMsIFwiZnVkZ2VDb25maWdcIikgfHwge307XHJcbiAgICAgIGNvbnN0IGFudGlhbGlhczogYm9vbGVhbiA9IChfYW50aWFsaWFzICE9IHVuZGVmaW5lZCkgPyBfYW50aWFsaWFzIDogZnVkZ2VDb25maWcuYW50aWFsaWFzIHx8IGZhbHNlO1xyXG4gICAgICBpZiAoYW50aWFsaWFzKVxyXG4gICAgICAgIERlYnVnLmVycm9yKFwiVGhlIGRlZmF1bHQgYW50aWFsaWFzaW5nIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgcG9zdC1wcm9jZXNzaW5nIGVmZmVjdHMgYW5kIHdpbGwgdGhlcmVmb3JlIGJlIGRpc2FibGVkLlwiKTtcclxuICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzOiBXZWJHTENvbnRleHRBdHRyaWJ1dGVzID0geyAvLyBUT0RPOiBcclxuICAgICAgICBhbHBoYTogKF9hbHBoYSAhPSB1bmRlZmluZWQpID8gX2FscGhhIDogZnVkZ2VDb25maWcuYWxwaGEgfHwgZmFsc2UsXHJcbiAgICAgICAgYW50aWFsaWFzOiBmYWxzZSxcclxuICAgICAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IGZhbHNlLFxyXG4gICAgICAgIHN0ZW5jaWw6IHRydWVcclxuICAgICAgfTtcclxuICAgICAgRGVidWcuZnVkZ2UoXCJJbml0aWFsaXplIFJlbmRlcldlYkdMXCIsIGNvbnRleHRBdHRyaWJ1dGVzKTtcclxuICAgICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICBsZXQgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuICAgICAgY3JjMyA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTDJSZW5kZXJpbmdDb250ZXh0PihcclxuICAgICAgICBjYW52YXMuZ2V0Q29udGV4dChcIndlYmdsMlwiLCBjb250ZXh0QXR0cmlidXRlcyksXHJcbiAgICAgICAgXCJXZWJHTC1jb250ZXh0IGNvdWxkbid0IGJlIGNyZWF0ZWRcIlxyXG4gICAgICApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzID0gY3JjMztcclxuICAgICAgLy8gRW5hYmxlIGJhY2tmYWNlLSBhbmQgekJ1ZmZlci1jdWxsaW5nLlxyXG4gICAgICBjcmMzLmVuYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNVTExfRkFDRSk7XHJcbiAgICAgIGNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfVEVTVCk7XHJcbiAgICAgIGNyYzMuZW5hYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQkxFTkQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyID0gUmVuZGVyV2ViR0wuZ2V0Q2FudmFzUmVjdCgpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuaW5pdGlhbGl6ZUF0dGFjaG1lbnRzKCk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmFkanVzdEF0dGFjaG1lbnRzKCk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC51Ym9Gb2cgPSBSZW5kZXJXZWJHTC5hc3NlcnQoY3JjMy5jcmVhdGVCdWZmZXIoKSk7XHJcblxyXG4gICAgICByZXR1cm4gY3JjMztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2hlY2tzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIHRocm93cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgV2ViR0wtZXJyb3Jjb2RlIGlmIHRoZSB2YWx1ZSBpcyBudWxsXHJcbiAgICAqIEBwYXJhbSBfdmFsdWUgIHZhbHVlIHRvIGNoZWNrIGFnYWluc3QgbnVsbFxyXG4gICAgKiBAcGFyYW0gX21lc3NhZ2UgIG9wdGlvbmFsLCBhZGRpdGlvbmFsIG1lc3NhZ2UgZm9yIHRoZSBleGNlcHRpb25cclxuICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzc2VydDxUPihfdmFsdWU6IFQgfCBudWxsLCBfbWVzc2FnZTogc3RyaW5nID0gXCJcIik6IFQge1xyXG4gICAgICBpZiAoX3ZhbHVlID09PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXJ0aW9uIGZhaWxlZC4gJHtfbWVzc2FnZX0sIFdlYkdMLUVycm9yOiAke1JlbmRlcldlYkdMLmNyYzMgPyBSZW5kZXJXZWJHTC5jcmMzLmdldEVycm9yKCkgOiBcIlwifWApO1xyXG4gICAgICByZXR1cm4gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBvZmZzY3JlZW4tY2FudmFzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHtcclxuICAgICAgcmV0dXJuIDxIVE1MQ2FudmFzRWxlbWVudD5SZW5kZXJXZWJHTC5jcmMzLmNhbnZhczsgLy8gVE9ETzogZW5hYmxlIE9mZnNjcmVlbkNhbnZhc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJpbmcgY29udGV4dFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFJlbmRlcmluZ0NvbnRleHQoKTogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB7XHJcbiAgICAgIHJldHVybiBSZW5kZXJXZWJHTC5jcmMzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgcmVjdGFuZ2xlIGRlc2NyaWJpbmcgdGhlIHNpemUgb2YgdGhlIG9mZnNjcmVlbi1jYW52YXMuIHgseSBhcmUgMCBhdCBhbGwgdGltZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q2FudmFzUmVjdCgpOiBSZWN0YW5nbGUge1xyXG4gICAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IDxIVE1MQ2FudmFzRWxlbWVudD5SZW5kZXJXZWJHTC5jcmMzLmNhbnZhcztcclxuICAgICAgcmV0dXJuIFJlY3RhbmdsZS5HRVQoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2l6ZSBvZiB0aGUgb2Zmc2NyZWVuLWNhbnZhcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXRDYW52YXNTaXplKF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5jYW52YXMud2lkdGggPSBfd2lkdGg7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuY2FudmFzLmhlaWdodCA9IF9oZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGFyZWEgb24gdGhlIG9mZnNjcmVlbi1jYW52YXMgdG8gcmVuZGVyIHRoZSBjYW1lcmEgaW1hZ2UgdG8uXHJcbiAgICAgKiBAcGFyYW0gX3JlY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXRSZW5kZXJSZWN0YW5nbGUoX3JlY3Q6IFJlY3RhbmdsZSk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyLnNldFBvc2l0aW9uQW5kU2l6ZShfcmVjdC54LCBfcmVjdC55LCBfcmVjdC53aWR0aCwgX3JlY3QuaGVpZ2h0KTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy52aWV3cG9ydChfcmVjdC54LCBfcmVjdC55LCBfcmVjdC53aWR0aCwgX3JlY3QuaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFyIHRoZSBvZmZzY3JlZW4gcmVuZGVyYnVmZmVyIHdpdGggdGhlIGdpdmVuIHtAbGluayBDb2xvcn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGVhcihfY29sb3I/OiBDb2xvcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmNsZWFyQ29sb3IoX2NvbG9yPy5yID8/IDAsIF9jb2xvcj8uZyA/PyAwLCBfY29sb3I/LmIgPz8gMCwgX2NvbG9yPy5hID8/IDEpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmNsZWFyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQlVGRkVSX0JJVCB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfQlVGRkVSX0JJVCB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU1RFTkNJTF9CVUZGRVJfQklUKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZmluYWwgZnJhbWVidWZmZXIgdG8gcmVuZGVyIHRvLiBJZiBudWxsLCB0aGUgY2FudmFzIGRlZmF1bHQgZnJhbWVidWZmZXIgaXMgdXNlZC5cclxuICAgICAqIFVzZWQgYnkgWFIgdG8gcmVuZGVyIHRvIHRoZSBYUldlYkdMTGF5ZXIgZnJhbWVidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0RnJhbWVidWZmZXJUYXJnZXQoX2J1ZmZlcjogV2ViR0xGcmFtZWJ1ZmZlcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5mYm9UYXJnZXQgPSBfYnVmZmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXQgdGhlIGZyYW1lYnVmZmVyIHRvIHRoZSBtYWluIGNvbG9yIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZXNldEZyYW1lYnVmZmVyKCk6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBhcmVhIG9uIHRoZSBvZmZzY3JlZW4tY2FudmFzIHRoZSBjYW1lcmEgaW1hZ2UgZ2V0cyByZW5kZXJlZCB0by5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZW5kZXJSZWN0YW5nbGUoKTogUmVjdGFuZ2xlIHtcclxuICAgICAgcmV0dXJuIFJlbmRlcldlYkdMLnJlY3RSZW5kZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGUgLyBEaXNhYmxlIFdlYkdMcyBkZXB0aCB0ZXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldERlcHRoVGVzdChfdGVzdDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBpZiAoX3Rlc3QpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5lbmFibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9URVNUKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuZGlzYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIX1RFU1QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlIC8gRGlzYWJsZSBXZWJHTHMgc2Npc3NvciB0ZXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldFNjaXNzb3JUZXN0KF90ZXN0OiBib29sZWFuLCBfeD86IG51bWJlciwgX3k/OiBudW1iZXIsIF93aWR0aD86IG51bWJlciwgX2hlaWdodD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBpZiAoX3Rlc3QpXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5lbmFibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TQ0lTU09SX1RFU1QpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5kaXNhYmxlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU0NJU1NPUl9URVNUKTtcclxuICAgICAgUmVuZGVyV2ViR0wuY3JjMy5zY2lzc29yKF94LCBfeSwgX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBXZWJHTHMgdmlld3BvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Vmlld3BvcnQoX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3dpZHRoOiBudW1iZXIsIF9oZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLnZpZXdwb3J0KF94LCBfeSwgX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYmxlbmQgbW9kZSB0byByZW5kZXIgd2l0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldEJsZW5kTW9kZShfbW9kZTogQkxFTkQpOiB2b2lkIHtcclxuICAgICAgLy8g4pqg77iPIENBVVRJT046IGFsbCBibGVuZGluZyBpcyBkb25lIHdpdGggcHJlbXVsdGlwbGllZCBhbHBoYSBpbiB0aGUgc2hhZGVyLCBzbyB0aGUgYmxlbmQgZnVuY3Rpb25zIGFyZSBzZXQgYWNjb3JkaW5nbHlcclxuICAgICAgc3dpdGNoIChfbW9kZSkge1xyXG4gICAgICAgIGNhc2UgQkxFTkQuT1BBUVVFOlxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEVxdWF0aW9uKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlVOQ19BREQpO1xyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuWkVSTyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJMRU5ELlRSQU5TUEFSRU5UOlxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEVxdWF0aW9uKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlVOQ19BREQpO1xyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuT05FX01JTlVTX1NSQ19BTFBIQSk7XHJcbiAgICAgICAgICAvLyBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlNSQ19BTFBIQSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQkxFTkQuQURESVRJVkU6XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX0FERCk7XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk9ORSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUpO1xyXG4gICAgICAgICAgLy8gUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TUkNfQUxQSEEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRFNUX0FMUEhBKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQkxFTkQuU1VCVFJBQ1RJVkU6XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1QpO1xyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5ibGVuZEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkUsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuT05FKTtcclxuICAgICAgICAgIC8vIFJlbmRlcldlYkdMLmNyYzMuYmxlbmRGdW5jKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuU1JDX0FMUEhBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRTVF9BTFBIQSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJMRU5ELk1PRFVMQVRFOiAvLyBjb2xvciBnZXRzIG11bHRpcGxpZWQsIHRyaWVkIHRvIGNvcHkgdW5pdHlzIFwiUGFydGljbGUgU2hhZGVyOiBCbGVuZGluZyBPcHRpb246IFJlbmRlcmluZyBNb2RlOiBNb2R1bGF0ZVwiXHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRXF1YXRpb24oV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GVU5DX0FERCk7XHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLmJsZW5kRnVuYyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRTVF9DT0xPUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWQgdGhlICh3b3JsZCkgcG9zaXRpb24gZnJvbSB0aGUgcGl4ZWwgYXQgdGhlIGdpdmVuIHBvaW50IG9uIHRoZSByZW5kZXItcmVjdGFuZ2xlIChvcmlnaW4gdG9wIGxlZnQpLlxyXG4gICAgICog4pqg77iPIENBVVRJT046IEN1cnJlbnRseSBvbmx5IHdvcmtzIHdoZW4gYW1iaWVudCBvY2NsdXNpb24gaXMgYWN0aXZlIGR1ZSB0byB3cml0aW5nIHRvIHRoZSBwb3NpdGlvbiB0ZXh0dXJlIGJlaW5nIGRpc2FibGVkIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwb2ludFJlbmRlclRvV29ybGQoX3JlbmRlcjogVmVjdG9yMik6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjb25zdCBkYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgICAgY3JjMy5yZWFkQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDEpO1xyXG4gICAgICBjcmMzLnJlYWRQaXhlbHMoX3JlbmRlci54LCBSZW5kZXJXZWJHTC5yZWN0UmVuZGVyLmhlaWdodCAtIF9yZW5kZXIueSwgMSwgMSwgY3JjMy5SR0JBLCBjcmMzLkZMT0FULCBkYXRhKTtcclxuICAgICAgY3JjMy5yZWFkQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDApO1xyXG4gICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHBvc2l0aW9uLnNldChkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdKTtcclxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZXMgZGlmZmVyZW50IGZyYW1lYnVmZmVycyBhc3dlbGwgYXMgdGV4dHVyZSBhdHRhY2htZW50cyB0byB1c2UgYXMgcmVuZGVyIHRhcmdldHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplQXR0YWNobWVudHMoKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNyYzMuZ2V0RXh0ZW5zaW9uKFwiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdFwiKTsgLy8gVE9ETzogZGlzYWJsZSBzc2FvIGlmIG5vdCBzdXBwb3J0ZWRcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLmZib01haW4gPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xGcmFtZWJ1ZmZlcj4oUmVuZGVyV2ViR0wuY3JjMy5jcmVhdGVGcmFtZWJ1ZmZlcigpKTtcclxuICAgICAgUmVuZGVyV2ViR0wuZmJvUG9zdCA9IFJlbmRlcldlYkdMLmFzc2VydDxXZWJHTEZyYW1lYnVmZmVyPihSZW5kZXJXZWJHTC5jcmMzLmNyZWF0ZUZyYW1lYnVmZmVyKCkpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5mYm9UYXJnZXQgPSBudWxsO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wudGV4Q29sb3IgPSBjcmVhdGVUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgUmVuZGVyV2ViR0wudGV4UG9zaXRpb24gPSBjcmVhdGVUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgUmVuZGVyV2ViR0wudGV4Tm9ybWFsID0gY3JlYXRlVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgIFJlbmRlcldlYkdMLnRleERlcHRoU3RlbmNpbCA9IGNyZWF0ZVRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNMQU1QX1RPX0VER0UpO1xyXG4gICAgICBSZW5kZXJXZWJHTC50ZXhOb2lzZSA9IGNyZWF0ZVRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNMQU1QX1RPX0VER0UpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzID0gbmV3IEFycmF5KDYpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1tpXSA9IGNyZWF0ZVRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FQVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcblxyXG4gICAgICBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKF9maWx0ZXI6IG51bWJlciwgX3dyYXA6IG51bWJlcik6IFdlYkdMVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmNyYzM7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZTogV2ViR0xUZXh0dXJlID0gUmVuZGVyV2ViR0wuYXNzZXJ0PFdlYkdMVGV4dHVyZT4oY3JjMy5jcmVhdGVUZXh0dXJlKCkpO1xyXG4gICAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfTUlOX0ZJTFRFUiwgX2ZpbHRlcik7XHJcbiAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01BR19GSUxURVIsIF9maWx0ZXIpO1xyXG4gICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1MsIF93cmFwKTtcclxuICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfV1JBUF9ULCBfd3JhcCk7XHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIG51bGwpO1xyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3RzIHRoZSBzaXplIG9mIHRoZSBkaWZmZXJlbnQgdGV4dHVyZSBhdHRhY2htZW50cyAocmVuZGVyIHRhcmdldHMpIHRvIHRoZSBjYW52YXMgc2l6ZVxyXG4gICAgICog4pqg77iPIENBVVRJT046IEV4cGVuc2l2ZSBvcGVyYXRpb24sIHVzZSBvbmx5IHdoZW4gY2FudmFzIHNpemUgY2hhbmdlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkanVzdEF0dGFjaG1lbnRzKCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gY3JjMy5jYW52YXMud2lkdGggfHwgMTtcclxuICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBjcmMzLmNhbnZhcy5oZWlnaHQgfHwgMTtcclxuXHJcbiAgICAgIGNyYzMuYWN0aXZlVGV4dHVyZShjcmMzLlRFWFRVUkUwKTtcclxuXHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhDb2xvcik7XHJcbiAgICAgIGNyYzMudGV4SW1hZ2UyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQSwgd2lkdGgsIGhlaWdodCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX0JZVEUsIG51bGwpO1xyXG5cclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleFBvc2l0aW9uKTtcclxuICAgICAgLy8gSW4gdmlldyBzcGFjZSAxNkYgd291bGQgYmUgcHJlY2lzZSBlbm91Z2guLi4gYnV0IHdlIHdhbnQgdG8gdXNlIHdvcmxkIHNwYWNlIGZvciBjYWxjdWxhdGlvbnNcclxuICAgICAgY3JjMy50ZXhJbWFnZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBMzJGLCB3aWR0aCwgaGVpZ2h0LCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRkxPQVQsIG51bGwpO1xyXG5cclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleE5vcm1hbCk7XHJcbiAgICAgIGNyYzMudGV4SW1hZ2UyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQTE2Riwgd2lkdGgsIGhlaWdodCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZMT0FULCBudWxsKTtcclxuXHJcbiAgICAgIGNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhEZXB0aFN0ZW5jaWwpO1xyXG4gICAgICBjcmMzLnRleEltYWdlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRFUFRIMjRfU1RFTkNJTDgsIHdpZHRoLCBoZWlnaHQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfU1RFTkNJTCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTlNJR05FRF9JTlRfMjRfOCwgbnVsbCk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9NYWluKTtcclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleENvbG9yLCAwKTtcclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQxLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleFBvc2l0aW9uLCAwKTtcclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQyLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleE5vcm1hbCwgMCk7XHJcbiAgICAgIGNyYzMuZnJhbWVidWZmZXJUZXh0dXJlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgUmVuZGVyV2ViR0wudGV4RGVwdGhTdGVuY2lsLCAwKTtcclxuICAgICAgY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgbnVsbCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwLCBkaXZpc29yOiBudW1iZXIgPSAxOyBpIDwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzLmxlbmd0aDsgaSsrLCBkaXZpc29yICo9IDIpIHtcclxuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IE1hdGgubWF4KE1hdGgucm91bmQoY3JjMy5jYW52YXMud2lkdGggLyBkaXZpc29yKSwgMSk7XHJcbiAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gTWF0aC5tYXgoTWF0aC5yb3VuZChjcmMzLmNhbnZhcy5oZWlnaHQgLyBkaXZpc29yKSwgMSk7XHJcbiAgICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1tpXSk7XHJcbiAgICAgICAgY3JjMy50ZXhJbWFnZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkEsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfQllURSwgbnVsbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5WYWx1ZXM6IG51bWJlciA9IHdpZHRoICogaGVpZ2h0ICogNDtcclxuICAgICAgY29uc3Qgbm9pc2VEYXRhOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoblZhbHVlcyk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgblZhbHVlczsgaSArPSA0KSB7XHJcbiAgICAgICAgbm9pc2VEYXRhW2ldID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KTtcclxuICAgICAgICBub2lzZURhdGFbaSArIDFdID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KTtcclxuICAgICAgICBub2lzZURhdGFbaSArIDJdID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KTtcclxuICAgICAgICBub2lzZURhdGFbaSArIDNdID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShjcmMzLlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleE5vaXNlKTtcclxuICAgICAgY3JjMy50ZXhJbWFnZTJEKGNyYzMuVEVYVFVSRV8yRCwgMCwgY3JjMy5SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBjcmMzLlJHQkEsIGNyYzMuVU5TSUdORURfQllURSwgbm9pc2VEYXRhKTtcclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShjcmMzLlRFWFRVUkVfMkQsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBQaWNraW5nXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSB0ZXh0dXJlIGJ1ZmZlciB0byBiZSB1c2VkIGFzIHBpY2stYnVmZmVyXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgY3JlYXRlUGlja1RleHR1cmUoX3NpemU6IG51bWJlcik6IFJlbmRlclRleHR1cmUge1xyXG4gICAgICAvLyBjcmVhdGUgdG8gcmVuZGVyIHRvXHJcbiAgICAgIGNvbnN0IHRhcmdldFRleHR1cmU6IFJlbmRlclRleHR1cmUgPSBSZW5kZXJXZWJHTC5hc3NlcnQoUmVuZGVyLmNyYzMuY3JlYXRlVGV4dHVyZSgpKTtcclxuICAgICAgUmVuZGVyLmNyYzMuYmluZFRleHR1cmUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCB0YXJnZXRUZXh0dXJlKTsgLy8gVE9ETzogY2hlY2sgaWYgc3VwZXJjbGFzcyAoUmVuZGVyV2ViR0wpIHNob3VsZCByZWZlciBkb3dud2FyZHMgdG8gc3ViY2xhc3MgKFJlbmRlcikgbGlrZSB0aGlzXHJcblxyXG4gICAgICB7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxGb3JtYXQ6IG51bWJlciA9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQTMySTtcclxuICAgICAgICBjb25zdCBmb3JtYXQ6IG51bWJlciA9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQV9JTlRFR0VSO1xyXG4gICAgICAgIGNvbnN0IHR5cGU6IG51bWJlciA9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuSU5UO1xyXG4gICAgICAgIFJlbmRlci5waWNrQnVmZmVyID0gbmV3IEludDMyQXJyYXkoX3NpemUgKiBfc2l6ZSAqIDQpO1xyXG4gICAgICAgIFJlbmRlci5jcmMzLnRleEltYWdlMkQoXHJcbiAgICAgICAgICBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIGludGVybmFsRm9ybWF0LCBfc2l6ZSwgX3NpemUsIDAsIGZvcm1hdCwgdHlwZSwgUmVuZGVyLnBpY2tCdWZmZXJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBzZXQgdGhlIGZpbHRlcmluZyBzbyB3ZSBkb24ndCBuZWVkIG1pcHNcclxuICAgICAgICBSZW5kZXIuY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX01JTl9GSUxURVIsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTElORUFSKTtcclxuICAgICAgICBSZW5kZXIuY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfUywgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgICBSZW5kZXIuY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZnJhbWVidWZmZXI6IFdlYkdMRnJhbWVidWZmZXIgPSBSZW5kZXIuY3JjMy5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG4gICAgICBSZW5kZXIuY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpO1xyXG4gICAgICBjb25zdCBhdHRhY2htZW50UG9pbnQ6IG51bWJlciA9IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDA7XHJcbiAgICAgIFJlbmRlci5jcmMzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnRQb2ludCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCB0YXJnZXRUZXh0dXJlLCAwKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLnNpemVQaWNrID0gX3NpemU7XHJcbiAgICAgIHJldHVybiB0YXJnZXRUZXh0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0UGlja3MoX3NpemU6IG51bWJlciwgX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhKTogUGlja1tdIHtcclxuICAgICAgLy8gZXZhbHVhdGUgdGV4dHVyZSBieSByZWFkaW5nIHBpeGVscyBhbmQgZXh0cmFjdCwgY29udmVydCBhbmQgc3RvcmUgdGhlIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggbWVzaCBoaXRcclxuICAgICAgbGV0IGRhdGE6IEludDMyQXJyYXkgPSBuZXcgSW50MzJBcnJheShfc2l6ZSAqIF9zaXplICogNCk7XHJcbiAgICAgIFJlbmRlci5jcmMzLnJlYWRQaXhlbHMoMCwgMCwgX3NpemUsIF9zaXplLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJHQkFfSU5URUdFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5JTlQsIGRhdGEpO1xyXG5cclxuICAgICAgbGV0IG10eFZpZXdUb1dvcmxkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSU5WRVJTRShfY21wQ2FtZXJhLm10eFdvcmxkVG9WaWV3KTtcclxuICAgICAgbGV0IHBpY2tlZDogUGlja1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBSZW5kZXIuxpJwaWNrZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgekJ1ZmZlcjogbnVtYmVyID0gZGF0YVs0ICogaSArIDBdICsgZGF0YVs0ICogaSArIDFdIC8gMjU2O1xyXG4gICAgICAgIGlmICh6QnVmZmVyID09IDApIC8vIGRpc2NhcmQgbWlzc2VzIFxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgbGV0IHBpY2s6IFBpY2sgPSBSZW5kZXIuxpJwaWNrZWRbaV07XHJcbiAgICAgICAgcGljay56QnVmZmVyID0gY29udmVydEludDMydG9GbG9hdDMyKGRhdGEsIDQgKiBpICsgMCkgKiAyIC0gMTtcclxuICAgICAgICBwaWNrLmNvbG9yID0gY29udmVydEludDMydG9Db2xvcihkYXRhLCA0ICogaSArIDEpO1xyXG4gICAgICAgIHBpY2sudGV4dHVyZVVWID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgICAgIHBpY2sudGV4dHVyZVVWLnNldChjb252ZXJ0SW50MzJ0b0Zsb2F0MzIoZGF0YSwgNCAqIGkgKyAyKSwgY29udmVydEludDMydG9GbG9hdDMyKGRhdGEsIDQgKiBpICsgMykpO1xyXG4gICAgICAgIHBpY2subXR4Vmlld1RvV29ybGQgPSBtdHhWaWV3VG9Xb3JsZDtcclxuXHJcbiAgICAgICAgcGlja2VkLnB1c2gocGljayk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBwaWNrZWQ7XHJcblxyXG4gICAgICBmdW5jdGlvbiBjb252ZXJ0SW50MzJ0b0Zsb2F0MzIoX2ludDMyQXJyYXk6IEludDMyQXJyYXksIF9pbmRleDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgYnVmZmVyOiBBcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig0KTtcclxuICAgICAgICBsZXQgdmlldzogRGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcclxuICAgICAgICB2aWV3LnNldEludDMyKDAsIF9pbnQzMkFycmF5W19pbmRleF0pO1xyXG4gICAgICAgIHJldHVybiB2aWV3LmdldEZsb2F0MzIoMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGNvbnZlcnRJbnQzMnRvQ29sb3IoX2ludDMyQXJyYXk6IEludDMyQXJyYXksIF9pbmRleDogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICAgIGxldCBidWZmZXI6IEFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDQpO1xyXG4gICAgICAgIGxldCB2aWV3OiBEYXRhVmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xyXG4gICAgICAgIHZpZXcuc2V0SW50MzIoMCwgX2ludDMyQXJyYXlbX2luZGV4XSk7XHJcbiAgICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IENvbG9yLkNTUyhgcmdiKCR7dmlldy5nZXRVaW50OCgwKX0sICR7dmlldy5nZXRVaW50OCgxKX0sICR7dmlldy5nZXRVaW50OCgyKX0pYCwgdmlldy5nZXRVaW50OCgzKSAvIDI1NSk7XHJcbiAgICAgICAgcmV0dXJuIGNvbG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFRoZSByZW5kZXIgZnVuY3Rpb24gZm9yIHBpY2tpbmcgYSBzaW5nbGUgbm9kZS4gXHJcbiAgICAqIEEgY2FtZXJhcHJvamVjdGlvbiB3aXRoIGV4dHJlbWVseSBuYXJyb3cgZm9jdXMgaXMgdXNlZCwgc28gZWFjaCBwaXhlbCBvZiB0aGUgYnVmZmVyIHdvdWxkIGhvbGQgdGhlIHNhbWUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbm9kZSwgIFxyXG4gICAgKiBidXQgdGhlIGZyYWdtZW50IHNoYWRlciByZW5kZXJzIG9ubHkgMSBwaXhlbCBmb3IgZWFjaCBub2RlIGludG8gdGhlIHJlbmRlciBidWZmZXIsIDFzdCBub2RlIHRvIDFzdCBwaXhlbCwgMm5kIG5vZGUgdG8gc2Vjb25kIHBpeGVsIGV0Yy5cclxuICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHBpY2soX25vZGU6IE5vZGUsIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IHZvaWQgeyAvLyBjcmVhdGUgVGV4dHVyZSB0byByZW5kZXIgdG8sIGludC1yZ2JhXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCk7XHJcbiAgICAgICAgbGV0IGNtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCA9IF9ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCk7XHJcbiAgICAgICAgbGV0IGNvYXQ6IENvYXQgPSBjbXBNYXRlcmlhbC5tYXRlcmlhbC5jb2F0O1xyXG4gICAgICAgIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IGNvYXQgaW5zdGFuY2VvZiBDb2F0VGV4dHVyZWQgPyBTaGFkZXJQaWNrVGV4dHVyZWQgOiBTaGFkZXJQaWNrO1xyXG5cclxuICAgICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG4gICAgICAgIGNvYXQudXNlUmVuZGVyRGF0YShzaGFkZXIsIGNtcE1hdGVyaWFsKTtcclxuICAgICAgICBsZXQgbXR4TWVzaFRvVmlldzogTWF0cml4NHg0ID0gdGhpcy5jYWxjTWVzaFRvVmlldyhfbm9kZSwgY21wTWVzaC5tdHhXb3JsZCwgX2NtcENhbWVyYS5tdHhXb3JsZFRvVmlldywgX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcblxyXG4gICAgICAgIGxldCBzaXplVW5pZm9ybUxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiA9IHNoYWRlci51bmlmb3Jtc1tcInVfdmN0U2l6ZVwiXTtcclxuICAgICAgICBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkudW5pZm9ybTJmdihzaXplVW5pZm9ybUxvY2F0aW9uLCBbUmVuZGVyV2ViR0wuc2l6ZVBpY2ssIFJlbmRlcldlYkdMLnNpemVQaWNrXSk7XHJcblxyXG4gICAgICAgIGxldCBtZXNoOiBNZXNoID0gY21wTWVzaC5tZXNoO1xyXG4gICAgICAgIGxldCByZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gbWVzaC51c2VSZW5kZXJCdWZmZXJzKHNoYWRlciwgX25vZGUubXR4V29ybGQsIG10eE1lc2hUb1ZpZXcsIFJlbmRlci7GknBpY2tlZC5sZW5ndGgpO1xyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuZHJhd0VsZW1lbnRzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCByZW5kZXJCdWZmZXJzLm5JbmRpY2VzLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX1NIT1JULCAwKTtcclxuXHJcbiAgICAgICAgbGV0IHBpY2s6IFBpY2sgPSBuZXcgUGljayhfbm9kZSk7XHJcbiAgICAgICAgUmVuZGVyLsaScGlja2VkLnB1c2gocGljayk7XHJcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgIC8vXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHBpY2tHaXptb3MoX2dpem1vczogQ29tcG9uZW50W10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgLy8gYnVmZmVyIHRoZXNlIGludG8gYm90aCBzaGFkZXJzIGFzIHdlIGRvbid0IGtub3cgd2hpY2ggb25lIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGdpem1vXHJcbiAgICAgIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IFNoYWRlclBpY2s7XHJcbiAgICAgIHNoYWRlci51c2VQcm9ncmFtKCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTJmdihzaGFkZXIudW5pZm9ybXNbXCJ1X3ZjdFNpemVcIl0sIFtSZW5kZXJXZWJHTC5zaXplUGljaywgUmVuZGVyV2ViR0wuc2l6ZVBpY2tdKTtcclxuICAgICAgc2hhZGVyID0gU2hhZGVyUGlja1RleHR1cmVkO1xyXG4gICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0yZnYoc2hhZGVyLnVuaWZvcm1zW1widV92Y3RTaXplXCJdLCBbUmVuZGVyV2ViR0wuc2l6ZVBpY2ssIFJlbmRlcldlYkdMLnNpemVQaWNrXSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybU1hdHJpeDNmdihzaGFkZXIudW5pZm9ybXNbXCJ1X210eFBpdm90XCJdLCBmYWxzZSwgTWF0cml4M3gzLklERU5USVRZKCkuZ2V0KCkpOyAvLyBvbmx5IG5lZWRlZCBmb3IgdGV4dHVyZWQgcGljayBzaGFkZXIsIGJ1dCBnaXptb3MgaGF2ZSBubyBwaXZvdFxyXG5cclxuICAgICAgR2l6bW9zLnBpY2soX2dpem1vcywgX2NtcENhbWVyYSwgUmVuZGVyLsaScGlja2VkKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVmZmVyIHRoZSBmb2cgcGFyYW1ldGVycyBpbnRvIHRoZSBmb2cgdWJvXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgYnVmZmVyRm9nKF9jbXBGb2c6IENvbXBvbmVudEZvZyk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgY29uc3QgZGF0YTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSg4KTtcclxuXHJcbiAgICAgIGRhdGFbMF0gPSBfY21wRm9nPy5pc0FjdGl2ZSA/IDEgOiAwO1xyXG4gICAgICBpZiAoX2NtcEZvZykge1xyXG4gICAgICAgIGRhdGFbMV0gPSBfY21wRm9nLm5lYXI7XHJcbiAgICAgICAgZGF0YVsyXSA9IF9jbXBGb2cuZmFyO1xyXG4gICAgICAgIGRhdGEuc2V0KF9jbXBGb2cuY29sb3IuZ2V0KCksIDQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBidWZmZXIgZGF0YSB0byBib3VuZCBidWZmZXJcclxuICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5JRk9STV9CVUZGRVIsIFJlbmRlcldlYkdMLnVib0ZvZyk7XHJcbiAgICAgIGNyYzMuYnVmZmVyRGF0YShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBkYXRhLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlNUQVRJQ19EUkFXKTtcclxuXHJcbiAgICAgIC8vIGJpbmQgYnVmZmVyIHRvIGJpbmRpbmcgcG9pbnRcclxuICAgICAgY3JjMy5iaW5kQnVmZmVyQmFzZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBVTklGT1JNX0JMT0NLUy5GT0cuQklORElORywgUmVuZGVyV2ViR0wudWJvRm9nKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1ZmZlciB0aGUgZGF0YSBmcm9tIHRoZSBsaWdodHMgaW4gdGhlIHNjZW5lZ3JhcGggaW50byB0aGUgbGlnaHRzIHVib1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGJ1ZmZlckxpZ2h0cyhfbGlnaHRzOiBNYXBMaWdodFR5cGVUb0xpZ2h0TGlzdCk6IHZvaWQge1xyXG4gICAgICBpZiAoIVJlbmRlcldlYkdMLnVib0xpZ2h0cylcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5jcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgUmVuZGVyV2ViR0wudWJvTGlnaHRzKTtcclxuXHJcbiAgICAgIC8vIGZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhbWJpZW50IGxpZ2h0IGNvbG9yXHJcbiAgICAgIGxldCBjbXBMaWdodHM6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PiA9IF9saWdodHMuZ2V0KExpZ2h0QW1iaWVudCk7XHJcbiAgICAgIGlmIChjbXBMaWdodHMpIHtcclxuICAgICAgICBsZXQgY2xyU3VtOiBDb2xvciA9IG5ldyBDb2xvcigwLCAwLCAwLCAwKTtcclxuICAgICAgICBmb3IgKGxldCBjbXBMaWdodCBvZiBjbXBMaWdodHMpXHJcbiAgICAgICAgICBjbHJTdW0uYWRkKGNtcExpZ2h0LmxpZ2h0LmNvbG9yKTtcclxuXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5idWZmZXJTdWJEYXRhKFxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5VTklGT1JNX0JVRkZFUixcclxuICAgICAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0c1ZhcmlhYmxlT2Zmc2V0c1tcInVfYW1iaWVudC52Y3RDb2xvclwiXSwgLy8gYnl0ZSBvZmZzZXQgb2YgdGhlIHN0cnVjdCBMaWdodCBcInVfYW1iaWVudFwiIGluc2lkZSB0aGUgdWJvXHJcbiAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KGNsclN1bS5nZXQoKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBmaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgbGlnaHQgZGF0YSBmb3IgZWFjaCBsaWdodCB0eXBlXHJcbiAgICAgIC8vIHdlIGFyZSBjdXJyZW50bHkgZG9pbmcgYSBtYXhpbXVtIG9mIDQgY3JjMy5idWZmZXJTdWJEYXRhKCkgY2FsbHMsIGJ1dCB3ZSBjb3VsZCBkbyB0aGlzIGluIG9uZSBjYWxsXHJcbiAgICAgIGJ1ZmZlckxpZ2h0c09mVHlwZShMaWdodERpcmVjdGlvbmFsLCBcInVfbkxpZ2h0c0RpcmVjdGlvbmFsXCIsIFwidV9kaXJlY3Rpb25hbFwiKTtcclxuICAgICAgYnVmZmVyTGlnaHRzT2ZUeXBlKExpZ2h0UG9pbnQsIFwidV9uTGlnaHRzUG9pbnRcIiwgXCJ1X3BvaW50XCIpO1xyXG4gICAgICBidWZmZXJMaWdodHNPZlR5cGUoTGlnaHRTcG90LCBcInVfbkxpZ2h0c1Nwb3RcIiwgXCJ1X3Nwb3RcIik7XHJcblxyXG4gICAgICBmdW5jdGlvbiBidWZmZXJMaWdodHNPZlR5cGUoX3R5cGU6IFR5cGVPZkxpZ2h0LCBfdW5pTmFtZTogc3RyaW5nLCBfdW5pU3RydWN0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjbXBMaWdodHM6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PiA9IF9saWdodHMuZ2V0KF90eXBlKTtcclxuXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5idWZmZXJTdWJEYXRhKFxyXG4gICAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy5VTklGT1JNX0JVRkZFUixcclxuICAgICAgICAgIFJlbmRlcldlYkdMLnVib0xpZ2h0c1ZhcmlhYmxlT2Zmc2V0c1tfdW5pTmFtZV0sIC8vIGJ5dGUgb2Zmc2V0IG9mIHRoZSB1aW50IFwidV9uTGlnaHRzRGlyZWN0aW9uYWxcIiBpbnNpZGUgdGhlIHVib1xyXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoW2NtcExpZ2h0cz8ubGVuZ3RoID8/IDBdKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmICghY21wTGlnaHRzKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBsaWdodERhdGFTaXplOiBudW1iZXIgPSA0ICsgMTYgKyAxNjsgLy8gdmN0Q29sb3IgKyBtdHhTaGFwZSArIG10eFNoYXBlSW52ZXJzZSwgYXMgZmxvYXQzMnNcclxuICAgICAgICBjb25zdCBsaWdodHNEYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGNtcExpZ2h0cy5sZW5ndGggKiBsaWdodERhdGFTaXplKTtcclxuXHJcbiAgICAgICAgbGV0IGlMaWdodDogbnVtYmVyID0gMDtcclxuICAgICAgICBmb3IgKGxldCBjbXBMaWdodCBvZiBjbXBMaWdodHMpIHtcclxuICAgICAgICAgIGNvbnN0IGxpZ2h0RGF0YU9mZnNldDogbnVtYmVyID0gaUxpZ2h0ICogbGlnaHREYXRhU2l6ZTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgdmN0Q29sb3JcclxuICAgICAgICAgIGxpZ2h0c0RhdGEuc2V0KGNtcExpZ2h0LmxpZ2h0LmNvbG9yLmdldCgpLCBsaWdodERhdGFPZmZzZXQgKyAwKTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgbXR4U2hhcGVcclxuICAgICAgICAgIGxldCBtdHhUb3RhbDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QoY21wTGlnaHQubm9kZS5tdHhXb3JsZCwgY21wTGlnaHQubXR4UGl2b3QpO1xyXG4gICAgICAgICAgaWYgKF90eXBlID09IExpZ2h0RGlyZWN0aW9uYWwpIHtcclxuICAgICAgICAgICAgbGV0IHplcm86IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgICAgICAgICAgbXR4VG90YWwudHJhbnNsYXRpb24gPSB6ZXJvO1xyXG4gICAgICAgICAgICBSZWN5Y2xlci5zdG9yZSh6ZXJvKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsaWdodHNEYXRhLnNldChtdHhUb3RhbC5nZXQoKSwgbGlnaHREYXRhT2Zmc2V0ICsgNCk7IC8vIG9mZnNldCArIHZjdENvbG9yXHJcblxyXG4gICAgICAgICAgLy8gc2V0IG10eFNoYXBlSW52ZXJzZVxyXG4gICAgICAgICAgaWYgKF90eXBlICE9IExpZ2h0RGlyZWN0aW9uYWwpIHtcclxuICAgICAgICAgICAgbGV0IG10eEludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFRvdGFsKTtcclxuICAgICAgICAgICAgbGlnaHRzRGF0YS5zZXQobXR4SW52ZXJzZS5nZXQoKSwgbGlnaHREYXRhT2Zmc2V0ICsgNCArIDE2KTsgLy8gb2Zmc2V0ICsgdmN0Q29sb3IgKyBtdHhTaGFwZVxyXG4gICAgICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhJbnZlcnNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhUb3RhbCk7XHJcbiAgICAgICAgICBpTGlnaHQrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuYnVmZmVyU3ViRGF0YShcclxuICAgICAgICAgIFJlbmRlcldlYkdMLmNyYzMuVU5JRk9STV9CVUZGRVIsXHJcbiAgICAgICAgICBSZW5kZXJXZWJHTC51Ym9MaWdodHNWYXJpYWJsZU9mZnNldHNbYCR7X3VuaVN0cnVjdH1bMF0udmN0Q29sb3JgXSwgLy8gYnl0ZSBvZmZzZXQgb2YgdGhlIHN0cnVjdCBMaWdodCBhcnJheSBpbnNpZGUgdGhlIHVib1xyXG4gICAgICAgICAgbGlnaHRzRGF0YVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoZSBnaXZlbiBub2RlcyB1c2luZyB0aGUgZ2l2ZW4gY2FtZXJhIGFuZCB0aGUgcG9zdCBwcm9jZXNzIGNvbXBvbmVudHMgYXR0YWNoZWQgdG8gdGhlIHNhbWUgbm9kZSBhcyB0aGUgY2FtZXJhXHJcbiAgICAgKiBUaGUgb3BhcXVlIG5vZGVzIGFyZSBkcmF3biBmaXJzdCwgdGhlbiBzc2FvIGlzIGFwcGxpZWQsIHRoZW4gYmxvb20gaXMgYXBwbGllZCwgdGhlbiBub2RlcyBhbHBoYSAoc29ydEZvckFscGhhKSBhcmUgZHJhd24uXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZHJhd05vZGVzKF9ub2Rlc09wYXF1ZTogSXRlcmFibGU8Tm9kZT4sIF9ub2Rlc0FscGhhOiBJdGVyYWJsZTxOb2RlPiwgX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcblxyXG4gICAgICBjb25zdCBjbXBGb2c6IENvbXBvbmVudEZvZyA9IF9jbXBDYW1lcmEubm9kZT8uZ2V0Q29tcG9uZW50KENvbXBvbmVudEZvZyk7XHJcbiAgICAgIGNvbnN0IGNtcEFtYmllbnRPY2NsdXNpb246IENvbXBvbmVudEFtYmllbnRPY2NsdXNpb24gPSBfY21wQ2FtZXJhLm5vZGU/LmdldENvbXBvbmVudChDb21wb25lbnRBbWJpZW50T2NjbHVzaW9uKTtcclxuICAgICAgY29uc3QgY21wQmxvb206IENvbXBvbmVudEJsb29tID0gX2NtcENhbWVyYS5ub2RlPy5nZXRDb21wb25lbnQoQ29tcG9uZW50Qmxvb20pO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuYnVmZmVyRm9nKGNtcEZvZyk7XHJcblxyXG4gICAgICAvLyBvcGFxdWUgcGFzcyBcclxuICAgICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgZGlzYWJsaW5nIGJsZW5kaW5nIGZvciBhbGwgb3BhcXVlIG9iamVjdHMsIHRoaXMgbWlnaHQgaW1wcm92ZSBwZXJmb3JtYW5jZSBcclxuICAgICAgLy8gYXMgb3RoZXJ3aXNlIHRoZSAzIGNvbG9yIGF0dGFjaG1lbnRzIChjb2xvciwgcG9zaXRpb24gYW5kIG5vcm1hbHMpIGFsbCBuZWVkIHRvIGJlIGJsZW5kZWRcclxuICAgICAgY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvTWFpbik7XHJcbiAgICAgIGNyYzMuZHJhd0J1ZmZlcnMoY21wQW1iaWVudE9jY2x1c2lvbj8uaXNBY3RpdmUgPyAvLyBvbmx5IHVzZSBwb3NpdGlvbiBhbmQgbm9ybWFsIHRleHR1cmVzIGlmIGFtYmllbnQgb2NjbHVzaW9uIGlzIGFjdGl2ZVxyXG4gICAgICAgIFtXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQxLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQyXSA6XHJcbiAgICAgICAgW1dlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDBdXHJcbiAgICAgICk7XHJcbiAgICAgIFJlbmRlcldlYkdMLmNsZWFyKF9jbXBDYW1lcmEuY2xyQmFja2dyb3VuZCk7XHJcblxyXG4gICAgICAvLyBjcmMzLmRpc2FibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5CTEVORCk7XHJcbiAgICAgIGZvciAobGV0IG5vZGUgb2YgX25vZGVzT3BhcXVlKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmRyYXdOb2RlKG5vZGUsIF9jbXBDYW1lcmEpO1xyXG4gICAgICAvLyBjcmMzLmVuYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkJMRU5EKTtcclxuXHJcbiAgICAgIC8vIGFtYmllbnQgb2NjbHVzaW9uIHBhc3NcclxuICAgICAgaWYgKGNtcEFtYmllbnRPY2NsdXNpb24/LmlzQWN0aXZlKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmRyYXdBbWJpZW50T2NjbHVzaW9uKF9jbXBDYW1lcmEsIGNtcEFtYmllbnRPY2NsdXNpb24pO1xyXG5cclxuICAgICAgLy8gYmxvb20gcGFzc1xyXG4gICAgICBpZiAoY21wQmxvb20/LmlzQWN0aXZlKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmRyYXdCbG9vbShjbXBCbG9vbSk7XHJcblxyXG4gICAgICAvLyB0cmFuc3BhcmVudCBwYXNzIFRPRE86IHRoaW5rIGFib3V0IGRpc2FibGluZyBkZXB0aCB3cml0ZSBmb3IgYWxsIHRyYW5zcGFyZW50IG9iamVjdHMgLT4gdGhpcyBtaWdodCBtYWtlIGRlcHRoIG1hc2sgb3B0aW9uIGluIGNvbXBvbmVudCBwYXJ0aWNsZSBzeXN0ZW0gb2Jzb2xldGVcclxuICAgICAgY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvTWFpbik7XHJcbiAgICAgIGNyYzMuZHJhd0J1ZmZlcnMoW1dlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQVRUQUNITUVOVDBdKTtcclxuXHJcbiAgICAgIC8vIGNyYzMuZGVwdGhNYXNrKGZhbHNlKTtcclxuICAgICAgZm9yIChsZXQgbm9kZSBvZiBfbm9kZXNBbHBoYSlcclxuICAgICAgICBSZW5kZXJXZWJHTC5kcmF3Tm9kZShub2RlLCBfY21wQ2FtZXJhKTtcclxuICAgICAgLy8gY3JjMy5kZXB0aE1hc2sodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBjb3B5IGZyYW1lYnVmZmVyIHRvIGNhbnZhc1xyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJFQURfRlJBTUVCVUZGRVIsIFJlbmRlcldlYkdMLmZib01haW4pO1xyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRSQVdfRlJBTUVCVUZGRVIsIFJlbmRlcldlYkdMLmZib1RhcmdldCk7XHJcbiAgICAgIGNyYzMuYmxpdEZyYW1lYnVmZmVyKDAsIDAsIGNyYzMuY2FudmFzLndpZHRoLCBjcmMzLmNhbnZhcy5oZWlnaHQsIDAsIDAsIGNyYzMuY2FudmFzLndpZHRoLCBjcmMzLmNhbnZhcy5oZWlnaHQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ09MT1JfQlVGRkVSX0JJVCB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuREVQVEhfQlVGRkVSX0JJVCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoZSBvY2NsdXNpb24gb3ZlciB0aGUgY29sb3ItYnVmZmVyLCB1c2luZyB0aGUgZ2l2ZW4gYW1iaWVudC1vY2NsdXNpb24tY29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZHJhd0FtYmllbnRPY2NsdXNpb24oX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhLCBfY21wQW1iaWVudE9jY2x1c2lvbjogQ29tcG9uZW50QW1iaWVudE9jY2x1c2lvbik6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBTaGFkZXJBbWJpZW50T2NjbHVzaW9uLnVzZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLmJpbmRUZXh0dXJlKFNoYWRlckFtYmllbnRPY2NsdXNpb24sIFJlbmRlcldlYkdMLnRleFBvc2l0aW9uLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwLCBcInVfdGV4UG9zaXRpb25cIik7XHJcbiAgICAgIFJlbmRlcldlYkdMLmJpbmRUZXh0dXJlKFNoYWRlckFtYmllbnRPY2NsdXNpb24sIFJlbmRlcldlYkdMLnRleE5vcm1hbCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMSwgXCJ1X3RleE5vcm1hbFwiKTtcclxuICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQW1iaWVudE9jY2x1c2lvbiwgUmVuZGVyV2ViR0wudGV4Tm9pc2UsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTIsIFwidV90ZXhOb2lzZVwiKTtcclxuXHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZOZWFyXCJdLCBfY21wQ2FtZXJhLmdldE5lYXIoKSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZGYXJcIl0sIF9jbXBDYW1lcmEuZ2V0RmFyKCkpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihTaGFkZXJBbWJpZW50T2NjbHVzaW9uLnVuaWZvcm1zW1widV9mQmlhc1wiXSwgX2NtcEFtYmllbnRPY2NsdXNpb24uYmlhcyk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZTYW1wbGVSYWRpdXNcIl0sIF9jbXBBbWJpZW50T2NjbHVzaW9uLnNhbXBsZVJhZGl1cyk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZBdHRlbnVhdGlvbkNvbnN0YW50XCJdLCBfY21wQW1iaWVudE9jY2x1c2lvbi5hdHRlbnVhdGlvbkNvbnN0YW50KTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQW1iaWVudE9jY2x1c2lvbi51bmlmb3Jtc1tcInVfZkF0dGVudWF0aW9uTGluZWFyXCJdLCBfY21wQW1iaWVudE9jY2x1c2lvbi5hdHRlbnVhdGlvbkxpbmVhcik7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X2ZBdHRlbnVhdGlvblF1YWRyYXRpY1wiXSwgX2NtcEFtYmllbnRPY2NsdXNpb24uYXR0ZW51YXRpb25RdWFkcmF0aWMpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0yZihTaGFkZXJBbWJpZW50T2NjbHVzaW9uLnVuaWZvcm1zW1widV92Y3RSZXNvbHV0aW9uXCJdLCBSZW5kZXJXZWJHTC5nZXRDYW52YXMoKS53aWR0aCwgUmVuZGVyV2ViR0wuZ2V0Q2FudmFzKCkuaGVpZ2h0KTtcclxuICAgICAgY3JjMy51bmlmb3JtM2Z2KFNoYWRlckFtYmllbnRPY2NsdXNpb24udW5pZm9ybXNbXCJ1X3ZjdENhbWVyYVwiXSwgX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbi5nZXQoKSk7XHJcblxyXG4gICAgICBjcmMzLmJpbmRGcmFtZWJ1ZmZlcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBSZW5kZXJXZWJHTC5mYm9Qb3N0KTtcclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleENvbG9yLCAwKTtcclxuICAgICAgUmVuZGVyV2ViR0wuc2V0QmxlbmRNb2RlKEJMRU5ELlNVQlRSQUNUSVZFKTtcclxuICAgICAgY3JjMy5kcmF3QXJyYXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCAwLCAzKTtcclxuICAgICAgUmVuZGVyV2ViR0wuc2V0QmxlbmRNb2RlKEJMRU5ELlRSQU5TUEFSRU5UKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoZSBibG9vbS1lZmZlY3Qgb3ZlciB0aGUgY29sb3ItYnVmZmVyLCB1c2luZyB0aGUgZ2l2ZW4gYmxvb20tY29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZHJhd0Jsb29tKF9jbXBCbG9vbTogQ29tcG9uZW50Qmxvb20pOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgU2hhZGVyQmxvb20udXNlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgLy8gZXh0cmFjdCBicmlnaHQgY29sb3JzLCBjb3VsZCBtb3ZlIHRoaXMgdG8gbWFpbiByZW5kZXIgcGFzcyBzbyB0aGF0IGluZGl2aWR1YWwgb2JqZWN0cyBjYW4gYmUgZXhlbXB0IGZyb20gYmxvb21cclxuICAgICAgY3JjMy5iaW5kRnJhbWVidWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgUmVuZGVyV2ViR0wuZmJvUG9zdCk7XHJcbiAgICAgIGNyYzMuZnJhbWVidWZmZXJUZXh0dXJlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9BVFRBQ0hNRU5UMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXNbMF0sIDApO1xyXG4gICAgICBSZW5kZXJXZWJHTC5jbGVhcigpO1xyXG5cclxuICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQmxvb20sIFJlbmRlcldlYkdMLnRleENvbG9yLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwLCBcInVfdGV4U291cmNlXCIpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfZlRocmVzaG9sZFwiXSwgX2NtcEJsb29tLnRocmVzaG9sZCk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV9pTW9kZVwiXSwgMCk7XHJcbiAgICAgIGNyYzMuZHJhd0FycmF5cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgMCwgMyk7XHJcblxyXG4gICAgICAvLyBkb3duc2FtcGxlXHJcbiAgICAgIGNvbnN0IGl0ZXJhdGlvbnM6IG51bWJlciA9IFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlcy5sZW5ndGg7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDEsIGRpdmlzb3I6IG51bWJlciA9IDI7IGkgPCBpdGVyYXRpb25zOyBpKyssIGRpdmlzb3IgKj0gMikge1xyXG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gTWF0aC5tYXgoTWF0aC5yb3VuZChjcmMzLmNhbnZhcy53aWR0aCAvIGRpdmlzb3IpLCAxKTtcclxuICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXIgPSBNYXRoLm1heChNYXRoLnJvdW5kKGNyYzMuY2FudmFzLmhlaWdodCAvIGRpdmlzb3IpLCAxKTtcclxuXHJcbiAgICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1tpXSwgMCk7XHJcbiAgICAgICAgY3JjMy52aWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQmxvb20sIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1tpIC0gMV0sIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRTAsIFwidV90ZXhTb3VyY2VcIik7XHJcbiAgICAgICAgY3JjMy51bmlmb3JtMWkoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X2lNb2RlXCJdLCAxKTtcclxuICAgICAgICBjcmMzLnVuaWZvcm0yZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfdmN0VGV4ZWxcIl0sIDAuNSAvIHdpZHRoLCAwLjUgLyBoZWlnaHQpOyAvLyBoYWxmIHRleGVsIHNpemVcclxuICAgICAgICAvLyBjcmMzLnVuaWZvcm0yZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfdmN0UmVzb2x1dGlvblwiXSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGNyYzMuZHJhd0FycmF5cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgMCwgMyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLnNldEJsZW5kTW9kZShCTEVORC5BRERJVElWRSk7XHJcblxyXG4gICAgICAvLyB1cHNhbXBsZVxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBpdGVyYXRpb25zIC0gMSwgZGl2aXNvcjogbnVtYmVyID0gMiAqKiAoaXRlcmF0aW9ucyAtIDIpOyBpID4gMDsgaS0tLCBkaXZpc29yIC89IDIpIHtcclxuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IE1hdGgubWF4KE1hdGgucm91bmQoY3JjMy5jYW52YXMud2lkdGggLyBkaXZpc29yKSwgMSk7XHJcbiAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gTWF0aC5tYXgoTWF0aC5yb3VuZChjcmMzLmNhbnZhcy5oZWlnaHQgLyBkaXZpc29yKSwgMSk7XHJcblxyXG4gICAgICAgIGNyYzMuZnJhbWVidWZmZXJUZXh0dXJlMkQoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5GUkFNRUJVRkZFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DT0xPUl9BVFRBQ0hNRU5UMCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBSZW5kZXJXZWJHTC50ZXhCbG9vbVNhbXBsZXNbaSAtIDFdLCAwKTtcclxuICAgICAgICBjcmMzLnZpZXdwb3J0KDAsIDAsIE1hdGgucm91bmQod2lkdGgpLCBNYXRoLnJvdW5kKGhlaWdodCkpO1xyXG5cclxuICAgICAgICBSZW5kZXJXZWJHTC5iaW5kVGV4dHVyZShTaGFkZXJCbG9vbSwgUmVuZGVyV2ViR0wudGV4Qmxvb21TYW1wbGVzW2ldLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwLCBcInVfdGV4U291cmNlXCIpO1xyXG4gICAgICAgIGNyYzMudW5pZm9ybTFpKFNoYWRlckJsb29tLnVuaWZvcm1zW1widV9pTW9kZVwiXSwgMik7XHJcbiAgICAgICAgY3JjMy51bmlmb3JtMmYoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X3ZjdFRleGVsXCJdLCAwLjUgLyB3aWR0aCwgMC41IC8gaGVpZ2h0KTsgLy8gaGFsZiB0ZXhlbCBzaXplXHJcbiAgICAgICAgLy8gY3JjMy51bmlmb3JtMmYoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X3ZjdFJlc29sdXRpb25cIl0sIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICBjcmMzLmRyYXdBcnJheXMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5UUklBTkdMRVMsIDAsIDMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjcmMzLnZpZXdwb3J0KDAsIDAsIGNyYzMuY2FudmFzLndpZHRoLCBjcmMzLmNhbnZhcy5oZWlnaHQpO1xyXG5cclxuICAgICAgY3JjMy5mcmFtZWJ1ZmZlclRleHR1cmUyRChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZSQU1FQlVGRkVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkNPTE9SX0FUVEFDSE1FTlQwLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFJlbmRlcldlYkdMLnRleENvbG9yLCAwKTtcclxuICAgICAgUmVuZGVyV2ViR0wuYmluZFRleHR1cmUoU2hhZGVyQmxvb20sIFJlbmRlcldlYkdMLnRleEJsb29tU2FtcGxlc1swXSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMCwgXCJ1X3RleFNvdXJjZVwiKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X2lNb2RlXCJdLCAzKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoU2hhZGVyQmxvb20udW5pZm9ybXNbXCJ1X2ZJbnRlbnNpdHlcIl0sIF9jbXBCbG9vbS5pbnRlbnNpdHkpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xZihTaGFkZXJCbG9vbS51bmlmb3Jtc1tcInVfZkhpZ2hsaWdodERlc2F0dXJhdGlvblwiXSwgX2NtcEJsb29tLmhpZ2hsaWdodERlc2F0dXJhdGlvbik7XHJcbiAgICAgIGNyYzMuZHJhd0FycmF5cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgMCwgMyk7XHJcblxyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBhIG1lc2ggYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBpbmZvcyBhbmQgdGhlIGNvbXBsZXRlIHByb2plY3Rpb24gbWF0cml4XHJcbiAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkcmF3Tm9kZShfbm9kZTogTm9kZSwgX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhKTogdm9pZCB7XHJcbiAgICAgIGxldCBjbXBNZXNoOiBDb21wb25lbnRNZXNoID0gX25vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICBsZXQgY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsID0gX25vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1hdGVyaWFsKTtcclxuICAgICAgbGV0IGNtcFRleHQ6IENvbXBvbmVudFRleHQgPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50VGV4dCk7XHJcbiAgICAgIGxldCBjb2F0OiBDb2F0ID0gY21wTWF0ZXJpYWwubWF0ZXJpYWwuY29hdDtcclxuICAgICAgbGV0IGNtcFBhcnRpY2xlU3lzdGVtOiBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSA9IF9ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk7XHJcbiAgICAgIGxldCBkcmF3UGFydGljbGVzOiBib29sZWFuID0gY21wUGFydGljbGVTeXN0ZW0gJiYgY21wUGFydGljbGVTeXN0ZW0uaXNBY3RpdmU7XHJcbiAgICAgIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IGNtcE1hdGVyaWFsLm1hdGVyaWFsLmdldFNoYWRlcigpO1xyXG4gICAgICBpZiAoZHJhd1BhcnRpY2xlcylcclxuICAgICAgICBzaGFkZXIgPSBjbXBQYXJ0aWNsZVN5c3RlbS5wYXJ0aWNsZVN5c3RlbS5nZXRTaGFkZXJGcm9tKHNoYWRlcik7XHJcblxyXG4gICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG4gICAgICBjb2F0LnVzZVJlbmRlckRhdGEoc2hhZGVyLCBjbXBNYXRlcmlhbCk7XHJcblxyXG4gICAgICBsZXQgbXR4TWVzaFRvV29ybGQ6IE1hdHJpeDR4NCA9IGNtcE1lc2gubXR4V29ybGQ7XHJcblxyXG4gICAgICBpZiAoY21wVGV4dD8uaXNBY3RpdmUpXHJcbiAgICAgICAgbXR4TWVzaFRvV29ybGQgPSBjbXBUZXh0LnVzZVJlbmRlckRhdGEobXR4TWVzaFRvV29ybGQsIF9jbXBDYW1lcmEpO1xyXG5cclxuICAgICAgbGV0IG10eE1lc2hUb1ZpZXc6IE1hdHJpeDR4NCA9IFJlbmRlcldlYkdMLmNhbGNNZXNoVG9WaWV3KF9ub2RlLCBtdHhNZXNoVG9Xb3JsZCwgX2NtcENhbWVyYS5tdHhXb3JsZFRvVmlldywgX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgIGxldCByZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gY21wTWVzaC5tZXNoLnVzZVJlbmRlckJ1ZmZlcnMoc2hhZGVyLCBtdHhNZXNoVG9Xb3JsZCwgbXR4TWVzaFRvVmlldyk7XHJcblxyXG4gICAgICBpZiAoY21wTWVzaC5za2VsZXRvbj8uaXNBY3RpdmUpXHJcbiAgICAgICAgY21wTWVzaC5za2VsZXRvbi51c2VSZW5kZXJCdWZmZXIoc2hhZGVyKTtcclxuXHJcbiAgICAgIGxldCB1bmlmb3JtOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiA9IHNoYWRlci51bmlmb3Jtc1tcInVfdmN0Q2FtZXJhXCJdO1xyXG4gICAgICBpZiAodW5pZm9ybSlcclxuICAgICAgICBSZW5kZXJXZWJHTC5jcmMzLnVuaWZvcm0zZnYodW5pZm9ybSwgX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbi5nZXQoKSk7XHJcblxyXG4gICAgICB1bmlmb3JtID0gc2hhZGVyLnVuaWZvcm1zW1widV9tdHhXb3JsZFRvVmlld1wiXTtcclxuICAgICAgaWYgKHVuaWZvcm0pXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy51bmlmb3JtTWF0cml4NGZ2KHVuaWZvcm0sIGZhbHNlLCBfY21wQ2FtZXJhLm10eFdvcmxkVG9WaWV3LmdldCgpKTtcclxuXHJcbiAgICAgIHVuaWZvcm0gPSBzaGFkZXIudW5pZm9ybXNbXCJ1X210eFdvcmxkVG9DYW1lcmFcIl07XHJcbiAgICAgIGlmICh1bmlmb3JtKSB7XHJcbiAgICAgICAgLy8gbGV0IG10eFdvcmxkVG9DYW1lcmE6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNJT04oX2NtcENhbWVyYS5tdHhXb3JsZCk7IC8vIHRvZG86IG9wdGltaXplL3N0b3JlIGluIGNhbWVyYVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMudW5pZm9ybU1hdHJpeDRmdih1bmlmb3JtLCBmYWxzZSwgX2NtcENhbWVyYS5tdHhDYW1lcmFJbnZlcnNlLmdldCgpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdW5pZm9ybSA9IHNoYWRlci51bmlmb3Jtc1tcInVfZkFscGhhQ2xpcFwiXTtcclxuICAgICAgaWYgKHVuaWZvcm0pXHJcbiAgICAgICAgUmVuZGVyV2ViR0wuY3JjMy51bmlmb3JtMWYodW5pZm9ybSwgY21wTWF0ZXJpYWwubWF0ZXJpYWwuYWxwaGFDbGlwKTtcclxuXHJcbiAgICAgIGlmIChkcmF3UGFydGljbGVzKVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmRyYXdQYXJ0aWNsZXMoY21wUGFydGljbGVTeXN0ZW0sIHNoYWRlciwgcmVuZGVyQnVmZmVycywgX25vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudEZhY2VDYW1lcmEpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIFJlbmRlcldlYkdMLmNyYzMuZHJhd0VsZW1lbnRzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVFJJQU5HTEVTLCByZW5kZXJCdWZmZXJzLm5JbmRpY2VzLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX1NIT1JULCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGRyYXdQYXJ0aWNsZXMoX2NtcFBhcnRpY2xlU3lzdGVtOiBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSwgX3NoYWRlcjogU2hhZGVySW50ZXJmYWNlLCBfcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycywgX2NtcEZhY2VDYW1lcmE6IENvbXBvbmVudEZhY2VDYW1lcmEpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGNyYzMuZGVwdGhNYXNrKF9jbXBQYXJ0aWNsZVN5c3RlbS5kZXB0aE1hc2spO1xyXG4gICAgICBSZW5kZXJXZWJHTC5zZXRCbGVuZE1vZGUoX2NtcFBhcnRpY2xlU3lzdGVtLmJsZW5kTW9kZSk7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFpKF9zaGFkZXIudW5pZm9ybXNbXCJ1X2lCbGVuZE1vZGVcIl0sIF9jbXBQYXJ0aWNsZVN5c3RlbS5ibGVuZE1vZGUpO1xyXG4gICAgICBfY21wUGFydGljbGVTeXN0ZW0udXNlUmVuZGVyRGF0YSgpO1xyXG5cclxuICAgICAgY3JjMy51bmlmb3JtMWYoX3NoYWRlci51bmlmb3Jtc1tcInVfZlBhcnRpY2xlU3lzdGVtRHVyYXRpb25cIl0sIF9jbXBQYXJ0aWNsZVN5c3RlbS5kdXJhdGlvbik7XHJcbiAgICAgIGNyYzMudW5pZm9ybTFmKF9zaGFkZXIudW5pZm9ybXNbXCJ1X2ZQYXJ0aWNsZVN5c3RlbVNpemVcIl0sIF9jbXBQYXJ0aWNsZVN5c3RlbS5zaXplKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWYoX3NoYWRlci51bmlmb3Jtc1tcInVfZlBhcnRpY2xlU3lzdGVtVGltZVwiXSwgX2NtcFBhcnRpY2xlU3lzdGVtLnRpbWUpO1xyXG4gICAgICBjcmMzLnVuaWZvcm0xaShfc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uUEFSVElDTEUuVU5JRk9STV0sIFRFWFRVUkVfTE9DQVRJT04uUEFSVElDTEUuSU5ERVgpO1xyXG5cclxuICAgICAgbGV0IGZhY2VDYW1lcmE6IGJvb2xlYW4gPSBfY21wRmFjZUNhbWVyYSAmJiBfY21wRmFjZUNhbWVyYS5pc0FjdGl2ZTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoX3NoYWRlci51bmlmb3Jtc1tcInVfYlBhcnRpY2xlU3lzdGVtRmFjZUNhbWVyYVwiXSwgZmFjZUNhbWVyYSA/IDEgOiAwKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoX3NoYWRlci51bmlmb3Jtc1tcInVfYlBhcnRpY2xlU3lzdGVtUmVzdHJpY3RcIl0sIGZhY2VDYW1lcmEgJiYgX2NtcEZhY2VDYW1lcmEucmVzdHJpY3QgPyAxIDogMCk7XHJcblxyXG4gICAgICBjcmMzLmRyYXdFbGVtZW50c0luc3RhbmNlZChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRSSUFOR0xFUywgX3JlbmRlckJ1ZmZlcnMubkluZGljZXMsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfU0hPUlQsIDAsIF9jbXBQYXJ0aWNsZVN5c3RlbS5zaXplKTtcclxuXHJcbiAgICAgIFJlbmRlcldlYkdMLnNldEJsZW5kTW9kZShCTEVORC5UUkFOU1BBUkVOVCk7XHJcbiAgICAgIGNyYzMuZGVwdGhNYXNrKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNhbGNNZXNoVG9WaWV3KF9ub2RlOiBOb2RlLCBfbXR4TWVzaFRvV29ybGQ6IE1hdHJpeDR4NCwgX210eFdvcmxkVG9WaWV3OiBNYXRyaXg0eDQsIF90YXJnZXQ/OiBWZWN0b3IzKTogTWF0cml4NHg0IHtcclxuICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBhIFJlbmRlciBmdW5jdGlvbiBhcyBpdCBkb2VzIG5vdCBkbyBhbnl0aGluZyB3aXRoIFdlYkdMXHJcbiAgICAgIGxldCBjbXBGYWNlQ2FtZXJhOiBDb21wb25lbnRGYWNlQ2FtZXJhID0gX25vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudEZhY2VDYW1lcmEpO1xyXG4gICAgICBpZiAoY21wRmFjZUNhbWVyYSAmJiBjbXBGYWNlQ2FtZXJhLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgbGV0IG10eE1lc2hUb1ZpZXc6IE1hdHJpeDR4NDsgLy8gbWVzaCB0byB3b3JsZD9cclxuICAgICAgICBtdHhNZXNoVG9WaWV3ID0gX210eE1lc2hUb1dvcmxkLmNsb25lO1xyXG4gICAgICAgIG10eE1lc2hUb1ZpZXcubG9va0F0KF90YXJnZXQsIGNtcEZhY2VDYW1lcmEudXBMb2NhbCA/IG51bGwgOiBjbXBGYWNlQ2FtZXJhLnVwLCBjbXBGYWNlQ2FtZXJhLnJlc3RyaWN0KTtcclxuICAgICAgICByZXR1cm4gTWF0cml4NHg0LlBST0RVQ1QoX210eFdvcmxkVG9WaWV3LCBtdHhNZXNoVG9WaWV3KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIE1hdHJpeDR4NC5QUk9EVUNUKF9tdHhXb3JsZFRvVmlldywgX210eE1lc2hUb1dvcmxkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBiaW5kVGV4dHVyZShfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF90ZXh0dXJlOiBXZWJHTFRleHR1cmUsIF91bml0OiBudW1iZXIsIF91bmlmb3JtOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgY3JjMy5hY3RpdmVUZXh0dXJlKF91bml0KTtcclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIF90ZXh0dXJlKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoX3NoYWRlci51bmlmb3Jtc1tfdW5pZm9ybV0sIF91bml0IC0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFMCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdpdmVzIFdlYkdMIEJ1ZmZlciB0aGUgZGF0YSBmcm9tIHRoZSB7QGxpbmsgVGV4dHVyZX1cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUmVuZGVySW5qZWN0b3JUZXh0dXJlIGV4dGVuZHMgUmVuZGVySW5qZWN0b3Ige1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWNvcmF0ZShfY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlckluamVjdG9yLmluamVjdChfY29uc3RydWN0b3IsIFJlbmRlckluamVjdG9yVGV4dHVyZSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcImRlbGV0ZVJlbmRlckRhdGFcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvclRleHR1cmUuZGVsZXRlUmVuZGVyRGF0YVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGluamVjdFRleHR1cmUodGhpczogVGV4dHVyZSwgX3RleHR1cmVVbml0OiBudW1iZXIgPSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkUwKTogdm9pZCB7XHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBpZiAoIXRoaXMucmVuZGVyRGF0YSlcclxuICAgICAgICB0aGlzLnJlbmRlckRhdGEgPSBSZW5kZXJXZWJHTC5hc3NlcnQ8V2ViR0xUZXh0dXJlPihjcmMzLmNyZWF0ZVRleHR1cmUoKSk7IC8vIFRPRE86IGNoZWNrIGlmIGFsbCBXZWJHTC1DcmVhdGlvbnMgYXJlIGFzc2VydGVkXHJcblxyXG4gICAgICBjcmMzLmFjdGl2ZVRleHR1cmUoX3RleHR1cmVVbml0KTtcclxuICAgICAgY3JjMy5iaW5kVGV4dHVyZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIHRoaXMucmVuZGVyRGF0YSk7XHJcblxyXG4gICAgICBpZiAodGhpcy50ZXh0dXJlRGlydHkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gQWx3YXlzIHByZW11bHRpcGx5IGFscGhhIHdoaWxlIGxvYWRpbmcgdGV4dHVyZXNcclxuICAgICAgICAgIGNyYzMucGl4ZWxTdG9yZWkoY3JjMy5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRydWUpO1xyXG4gICAgICAgICAgY3JjMy50ZXhJbWFnZTJEKFxyXG4gICAgICAgICAgICBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIDAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkdCQSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SR0JBLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOU0lHTkVEX0JZVEUsXHJcbiAgICAgICAgICAgIHRoaXMudGV4SW1hZ2VTb3VyY2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBjcmMzLnBpeGVsU3RvcmVpKGNyYzMuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5taXBtYXBEaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnRleHR1cmVEaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xyXG4gICAgICAgICAgRGVidWcuZXJyb3IoX2Vycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLm1pcG1hcERpcnR5KSB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLm1pcG1hcCkge1xyXG4gICAgICAgICAgY2FzZSBNSVBNQVAuQ1JJU1A6XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NQUdfRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QpO1xyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfTUlOX0ZJTFRFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIE1JUE1BUC5NRURJVU06XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NQUdfRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QpO1xyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfTUlOX0ZJTFRFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5ORUFSRVNUX01JUE1BUF9MSU5FQVIpO1xyXG4gICAgICAgICAgICBjcmMzLmdlbmVyYXRlTWlwbWFwKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBNSVBNQVAuQkxVUlJZOlxyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfTUFHX0ZJTFRFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FQVIpO1xyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfTUlOX0ZJTFRFUiwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FQVJfTUlQTUFQX0xJTkVBUik7XHJcbiAgICAgICAgICAgIGNyYzMuZ2VuZXJhdGVNaXBtYXAoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJEKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIE1JUE1BUC5TTU9PVEg6XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NQUdfRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUik7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9NSU5fRklMVEVSLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1pcG1hcERpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLndyYXBEaXJ0eSkge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy53cmFwKSB7XHJcbiAgICAgICAgICBjYXNlIFdSQVAuUkVQRUFUOlxyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfV1JBUF9TLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJFUEVBVCk7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVQRUFUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFdSQVAuQ0xBTVA6XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1MsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgICAgICAgIGNyYzMudGV4UGFyYW1ldGVyaShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfMkQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV9XUkFQX1QsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBXUkFQLk1JUlJPUjpcclxuICAgICAgICAgICAgY3JjMy50ZXhQYXJhbWV0ZXJpKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFX1dSQVBfUywgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5NSVJST1JFRF9SRVBFQVQpO1xyXG4gICAgICAgICAgICBjcmMzLnRleFBhcmFtZXRlcmkoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5URVhUVVJFXzJELCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlRFWFRVUkVfV1JBUF9ULCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk1JUlJPUkVEX1JFUEVBVCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy53cmFwRGlydHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgZGVsZXRlUmVuZGVyRGF0YSh0aGlzOiBUZXh0dXJlKTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5yZW5kZXJEYXRhKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGxldCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG4gICAgICBjcmMzLmJpbmRUZXh0dXJlKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVEVYVFVSRV8yRCwgbnVsbCk7XHJcbiAgICAgIGNyYzMuZGVsZXRlVGV4dHVyZSh0aGlzLnJlbmRlckRhdGEpO1xyXG4gICAgICB0aGlzLnJlbmRlckRhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLnRleHR1cmVEaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMubWlwbWFwRGlydHkgPSB0cnVlO1xyXG4gICAgICB0aGlzLndyYXBEaXJ0eSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIGV4cG9ydCBjb25zdCBlbnVtIEVWRU5UX1BIWVNJQ1Mge1xyXG4gICAgVFJJR0dFUl9FTlRFUiA9IFwiVHJpZ2dlckVudGVyZWRDb2xsaXNpb25cIixcclxuICAgIFRSSUdHRVJfRVhJVCA9IFwiVHJpZ2dlckxlZnRDb2xsaXNpb25cIixcclxuICAgIENPTExJU0lPTl9FTlRFUiA9IFwiQ29sbGlkZXJFbnRlcmVkQ29sbGlzaW9uXCIsXHJcbiAgICBDT0xMSVNJT05fRVhJVCA9IFwiQ29sbGlkZXJMZWZ0Q29sbGlzaW9uXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNwZWNpYWwgdHlwZSBvZiB7QGxpbmsgRXZlbnR9IGZvciBwaHlzaWNzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBFdmVudFBoeXNpY3MgZXh0ZW5kcyBFdmVudCB7XHJcbiAgICAvKipcclxuICAgICAqIENvbXBvbmVudFJpZ2lkYm9keSB0aGF0IGNvbGxpZGVkIHdpdGggdGhpcyBDb21wb25lbnRSaWdpZGJvZHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNtcFJpZ2lkYm9keTogQ29tcG9uZW50UmlnaWRib2R5O1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9ybWFsIGltcHVsc2UgYmV0d2VlbiB0aGUgdHdvIGNvbGxpZGluZyBvYmplY3RzLiBOb3JtYWwgcmVwcmVzZW50cyB0aGUgZGVmYXVsdCBpbXB1bHNlLlxyXG4gICAgICogSW1wdWxzZSBpcyBvbmx5IGhhcHBlbmluZyBvbiBDT0xMSVNJT05fRU5URVIsIHNvIHRoZXJlIGlzIG5vIGltcHVsc2Ugb24gZXhpdCBub3Igb24gdHJpZ2dlcnMuXHJcbiAgICAgKiBVc2UgdGhlIHZlbG9jaXR5IG9mIHRoZSBjbXBSaWdpZGJvZHkgdG8gZGV0ZXJtaW5lIHRoZSBpbnRlbnNpdHkgb2YgdGhlIEVWRU5UIGluc3RlYWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBub3JtYWxJbXB1bHNlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgdGFuZ2VudEltcHVsc2U6IG51bWJlcjtcclxuICAgIHB1YmxpYyBiaW5vbWFsSW1wdWxzZTogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBwb2ludCB3aGVyZSB0aGUgY29sbGlzaW9uL3RyaWdnZXJpbmcgaW5pdGlhbGx5IGhhcHBlbmVkLiBUaGUgY29sbGlzaW9uIHBvaW50IGV4aXN0cyBvbmx5IG9uIENPTExJU0lPTl9FTlRFUiAvIFRSSUdHRVJfRU5URVIuICovXHJcbiAgICBwdWJsaWMgY29sbGlzaW9uUG9pbnQ6IFZlY3RvcjM7XHJcbiAgICAvKiogVGhlIG5vcm1hbCB2ZWN0b3Igb2YgdGhlIGNvbGxpc2lvbi4gT25seSBleGlzdGluZyBvbiBDT0xMSVNJT05fRU5URVIgKi9cclxuICAgIHB1YmxpYyBjb2xsaXNpb25Ob3JtYWw6IFZlY3RvcjM7XHJcblxyXG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgZXZlbnQgY3VzdG9taXplZCBmb3IgcGh5c2ljcy4gSG9sZGluZyBpbmZvcm1hdGlvbnMgYWJvdXQgaW1wdWxzZXMuIENvbGxpc2lvbiBwb2ludCBhbmQgdGhlIGJvZHkgdGhhdCBpcyBjb2xsaWRpbmcgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdHlwZTogRVZFTlRfUEhZU0lDUywgX2hpdFJpZ2lkYm9keTogQ29tcG9uZW50UmlnaWRib2R5LCBfbm9ybWFsSW1wdWxzZTogbnVtYmVyLCBfdGFuZ2VudEltcHVsc2U6IG51bWJlciwgX2Jpbm9ybWFsSW1wdWxzZTogbnVtYmVyLCBfY29sbGlzaW9uUG9pbnQ6IFZlY3RvcjMgPSBudWxsLCBfY29sbGlzaW9uTm9ybWFsOiBWZWN0b3IzID0gbnVsbCkge1xyXG4gICAgICBzdXBlcihfdHlwZSk7XHJcbiAgICAgIHRoaXMuY21wUmlnaWRib2R5ID0gX2hpdFJpZ2lkYm9keTtcclxuICAgICAgdGhpcy5ub3JtYWxJbXB1bHNlID0gX25vcm1hbEltcHVsc2U7XHJcbiAgICAgIHRoaXMudGFuZ2VudEltcHVsc2UgPSBfdGFuZ2VudEltcHVsc2U7XHJcbiAgICAgIHRoaXMuYmlub21hbEltcHVsc2UgPSBfYmlub3JtYWxJbXB1bHNlO1xyXG4gICAgICB0aGlzLmNvbGxpc2lvblBvaW50ID0gX2NvbGxpc2lvblBvaW50O1xyXG4gICAgICB0aGlzLmNvbGxpc2lvbk5vcm1hbCA9IF9jb2xsaXNpb25Ob3JtYWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEdyb3VwcyB0byBwbGFjZSBhIG5vZGUgaW4sIG5vdCBldmVyeSBncm91cCBzaG91bGQgY29sbGlkZSB3aXRoIGV2ZXJ5IGdyb3VwLiBVc2UgYSBNYXNrIGluIHRvIGV4Y2x1ZGUgY29sbGlzaW9uc1xyXG4gICovXHJcbiAgZXhwb3J0IGVudW0gQ09MTElTSU9OX0dST1VQIHsgLy9UT0RPIEdpdmUgYSBwb3NzaWJsaXRoeSB0byBzZXQgd2hpY2ggbGF5ZXIgY29sbGlkZXMgd2l0aCB3aGljaCwgQ29sbGlzaW9uTWF0cml4P1xyXG4gICAgREVGQVVMVCA9IDEsXHJcbiAgICBHUk9VUF8xID0gMixcclxuICAgIEdST1VQXzIgPSA0LFxyXG4gICAgR1JPVVBfMyA9IDgsXHJcbiAgICBHUk9VUF80ID0gMTYsXHJcbiAgICBHUk9VUF81ID0gMzJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgcmlnaWRib2R5IHdoaWNoIGRldGVybWluZXMgdGhlIHdheSBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgcGh5c2ljYWwgYW5kIHRoZSB2aXN1YWwgd29ybGRcclxuICAqL1xyXG4gIGV4cG9ydCBlbnVtIEJPRFlfVFlQRSB7XHJcbiAgICAvKiogVGhlIGJvZHkgaWdub3JlcyB0aGUgaGllcmFyY2h5IG9mIHRoZSByZW5kZXIgZ3JhcGgsIGlzIGNvbXBsZXRlbHkgY29udHJvbGxlZCAgYnkgcGh5c2ljcyBhbmQgdGFrZXMgaXRzIG5vZGUgd2l0aCBpdCAgKi9cclxuICAgIERZTkFNSUMsIC8vID0gT0lNTy5SaWdpZEJvZHlUeXBlLkRZTkFNSUMsXHJcbiAgICAvKiogVGhlIGJvZHkgaWdub3JlcyB0aGUgaGllcmFyY2h5IG9mIHRoZSByZW5kZXIgZ3JhcGgsIGlzIGNvbXBsZXRlbHkgaW1tb3ZlYmxlIGFuZCBrZWVwcyBpdHMgbm9kZSBmcm9tIG1vdmluZyAgKi9cclxuICAgIFNUQVRJQywgLy8gPSBPSU1PLlJpZ2lkQm9keVR5cGUuU1RBVElDLFxyXG4gICAgLyoqIFRoZSBib2R5IGlzIGNvbnRyb2xsZWQgYnkgaXRzIG5vZGUgYW5kIG1vdmVzIHdpdGggaXQsIHdoaWxlIGl0IGltcGFjdHMgdGhlIHBoeXNpY2FsIHdvcmxkIGUuZy4gYnkgY29sbGlzaW9ucyAqL1xyXG4gICAgS0lORU1BVElDIC8vID0gT0lNTy5SaWdpZEJvZHlUeXBlLktJTkVNQVRJQ1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBEaWZmZXJlbnQgdHlwZXMgb2YgY29sbGlkZXIgc2hhcGVzLCB3aXRoIGRpZmZlcmVudCBvcHRpb25zIGluIHNjYWxpbmcgQk9YID0gVmVjdG9yMyhsZW5ndGgsIGhlaWdodCwgZGVwdGgpLFxyXG4gICogU1BIRVJFID0gVmVjdG9yMyhkaWFtZXRlciwgeCwgeCksIENBUFNVTEUgPSBWZWN0b3IzKGRpYW1ldGVyLCBoZWlnaHQsIHgpLCBDWUxJTkRFUiA9IFZlY3RvcjMoZGlhbWV0ZXIsIGhlaWdodCwgeCksXHJcbiAgKiBDT05FID0gVmVjdG9yKGRpYW1ldGVyLCBoZWlnaHQsIHgpLCBQWVJBTUlEID0gVmVjdG9yMyhsZW5ndGgsIGhlaWdodCwgZGVwdGgpOyB4ID09IHVudXNlZC5cclxuICAqIENPTlZFWCA9IENvbXBvbmVudE1lc2ggbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGluIHRoZSBSQiBQcm9wZXJ0eSBjb252ZXhNZXNoLCB0aGUgcG9pbnRzIG9mIHRoYXQgY29tcG9uZW50IGFyZSB1c2VkIHRvIGNyZWF0ZSBhIGNvbGxpZGVyIHRoYXQgbWF0Y2hlcyxcclxuICAqIHRoZSBjbG9zZXN0IHBvc3NpYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoYXQgZm9ybSwgaW4gZm9ybSBvZiBhIGh1bGwuIENvbnZleCBpcyBleHBlcmltZW50YWwgYW5kIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgYmVoYXZpb3VyIHdoZW4gdmVydGljZXNcclxuICAqIGFyZSB0b28gY2xvc2UgdG8gb25lIGFub3RoZXIgYW5kIHRoZSBnaXZlbiB2ZXJ0aWNlcyBkbyBub3QgZm9ybSBhIGluIGl0c2VsZiBjbG9zZWQgc2hhcGUgYW5kIGhhdmluZyBhIGdlbnVzIG9mIDAgKG5vIGhvbGVzKS4gVmVydGljZXMgaW4gdGhlIENvbXBvbmVudE1lc2ggY2FuIGJlIHNjYWxlZCBkaWZmZXJlbnRseSBcclxuICAqIGZvciB0ZXh0dXJpbmcvbm9ybWFsIG9yIG90aGVyIHJlYXNvbnMsIHNvIHRoZSBjb2xsaWRlciBtaWdodCBiZSBvZmYgY29tcGFyZWQgdG8gdGhlIHZpc3VhbCBzaGFwZSwgdGhpcyBjYW4gYmUgY29ycmVjdGVkIGJ5IGNoYW5naW5nIHRoZSBwaXZvdCBzY2FsZSBvZiB0aGUgQ29tcG9uZW50UmlnaWRib2R5LiAgXHJcbiAgKi9cclxuICBleHBvcnQgZW51bSBDT0xMSURFUl9UWVBFIHtcclxuICAgIENVQkUsXHJcbiAgICBTUEhFUkUsXHJcbiAgICBDQVBTVUxFLFxyXG4gICAgQ1lMSU5ERVIsXHJcbiAgICBDT05FLFxyXG4gICAgUFlSQU1JRCxcclxuICAgIENPTlZFWFxyXG4gIH1cclxuXHJcbiAgLyoqIERpc3BsYXlpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGRlYnVnIGluZm9ybWF0aW9uIGFib3V0IGRpZmZlcmVudCBwaHlzaWMgZmVhdHVyZXMuIERlZmF1bHQgPSBKT0lOVFNfQU5EX0NPTExJREVSLiAqL1xyXG4gIGV4cG9ydCBlbnVtIFBIWVNJQ1NfREVCVUdNT0RFIHtcclxuICAgIE5PTkUsXHJcbiAgICBDT0xMSURFUlMsXHJcbiAgICBKT0lOVFNfQU5EX0NPTExJREVSLFxyXG4gICAgQk9VTkRJTkdfQk9YRVMsXHJcbiAgICBDT05UQUNUUyxcclxuICAgIFBIWVNJQ19PQkpFQ1RTX09OTFlcclxuICB9XHJcblxyXG4gIC8qKiBJbmZvIGFib3V0IFJheWNhc3RzIHNob3QgZnJvbSB0aGUgcGh5c2ljcyBzeXN0ZW0uICovXHJcbiAgZXhwb3J0IGNsYXNzIFJheUhpdEluZm8gaW1wbGVtZW50cyBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIGhpdDogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBoaXREaXN0YW5jZTogbnVtYmVyO1xyXG4gICAgcHVibGljIGhpdFBvaW50OiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICBwdWJsaWMgcmlnaWRib2R5Q29tcG9uZW50OiBDb21wb25lbnRSaWdpZGJvZHk7XHJcbiAgICBwdWJsaWMgaGl0Tm9ybWFsOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICBwdWJsaWMgcmF5RW5kOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICBwdWJsaWMgcmF5T3JpZ2luOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICB0aGlzLnJlY3ljbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5oaXQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5oaXREaXN0YW5jZSA9IDA7XHJcbiAgICAgIHRoaXMuaGl0UG9pbnQucmVjeWNsZSgpO1xyXG4gICAgICB0aGlzLnJpZ2lkYm9keUNvbXBvbmVudCA9IG51bGw7XHJcbiAgICAgIHRoaXMuaGl0Tm9ybWFsLnJlY3ljbGUoKTtcclxuICAgICAgdGhpcy5yYXlPcmlnaW4ucmVjeWNsZSgpO1xyXG4gICAgICB0aGlzLnJheUVuZC5yZWN5Y2xlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogR2VuZXJhbCBzZXR0aW5ncyBmb3IgdGhlIHBoeXNpYyBzaW11bGF0aW9uIGFuZCB0aGUgZGVidWcgb2YgaXQuICovXHJcbiAgZXhwb3J0IGNsYXNzIFBoeXNpY3NTZXR0aW5ncyB7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9kZWZhdWx0Q29sbGlzaW9uR3JvdXA6IG51bWJlciwgX2RlZmF1bHRDb2xsaXNpb25NYXNrOiBudW1iZXIpIHtcclxuICAgICAgaWYgKHR5cGVvZiBPSU1PID09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB0aGlzLmRlZmF1bHRDb2xsaXNpb25Hcm91cCA9IF9kZWZhdWx0Q29sbGlzaW9uR3JvdXA7XHJcbiAgICAgIHRoaXMuZGVmYXVsdENvbGxpc2lvbk1hc2sgPSBfZGVmYXVsdENvbGxpc2lvbk1hc2s7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENoYW5nZSBpZiByaWdpZGJvZGllcyBhcmUgYWJsZSB0byBzbGVlcCAoZG9uJ3QgYmUgY29uc2lkZXJlZCBpbiBwaHlzaWNhbCBjYWxjdWxhdGlvbnMpIHdoZW4gdGhlaXIgbW92ZW1lbnQgaXMgYmVsb3cgYSB0aHJlc2hvbGQuIERlYWN0aXZhdGlvbiBpcyBkZWNyZWFzaW5nIHBlcmZvcm1hbmNlIGZvciBtaW5vciBhZHZhbnRhZ2UgaW4gcHJlY2lzaW9uLiAqL1xyXG4gICAgcHVibGljIGdldCBkaXNhYmxlU2xlZXBpbmcoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuZGlzYWJsZVNsZWVwaW5nO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkaXNhYmxlU2xlZXBpbmcoX3ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5kaXNhYmxlU2xlZXBpbmcgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKiogU2xlZXBpbmcgVGhyZXNob2xkIGZvciBNb3ZlbWVudCBWZWxvY3RpeS4gKi9cclxuICAgIHB1YmxpYyBnZXQgc2xlZXBpbmdWZWxvY2l0eVRocmVzaG9sZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLnNsZWVwaW5nVmVsb2NpdHlUaHJlc2hvbGQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNsZWVwaW5nVmVsb2NpdHlUaHJlc2hvbGQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLnNsZWVwaW5nVmVsb2NpdHlUaHJlc2hvbGQgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNsZWVwaW5nIFRocmVzaG9sZCBmb3IgUm90YXRpb24gVmVsb2NpdHkuICovXHJcbiAgICBwdWJsaWMgZ2V0IHNsZWVwaW5nQW5ndWxhclZlbG9jaXR5VGhyZXNob2xkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuc2xlZXBpbmdBbmd1bGFyVmVsb2NpdHlUaHJlc2hvbGQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNsZWVwaW5nQW5ndWxhclZlbG9jaXR5VGhyZXNob2xkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5zbGVlcGluZ0FuZ3VsYXJWZWxvY2l0eVRocmVzaG9sZCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhyZXNob2xkIGhvdyBsb25nIHRoZSBSaWdpZGJvZHkgbXVzdCBiZSBiZWxvdy9hYm92ZSB0aGUgdGhyZXNob2xkIHRvIGNvdW50IGFzIHNsZWVwaW5nLiAqL1xyXG4gICAgcHVibGljIGdldCBzbGVlcGluZ1RpbWVUaHJlc2hvbGQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5zbGVlcGluZ1RpbWVUaHJlc2hvbGQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNsZWVwaW5nVGltZVRocmVzaG9sZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuc2xlZXBpbmdUaW1lVGhyZXNob2xkID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFcnJvciB0aHJlc2hvbGQuIERlZmF1bHQgaXMgMC4wNS4gVGhlIGhpZ2hlciB0aGUgbW9yZSBsaWtlbHkgY29sbGlzaW9ucyBnZXQgZGV0ZWN0ZWQgYmVmb3JlIGFjdHVhbCBpbXBhY3QgYXQgaGlnaCBzcGVlZHMgYnV0IGl0J3MgdmlzdWFsbHkgbGVzcyBhY2N1cmF0ZS4gKi9cclxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdENvbGxpc2lvbk1hcmdpbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLmRlZmF1bHRHSktNYXJnaW47XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGRlZmF1bHRDb2xsaXNpb25NYXJnaW4oX3RoaWNrbmVzczogbnVtYmVyKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5kZWZhdWx0R0pLTWFyZ2luID0gX3RoaWNrbmVzcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGRlZmF1bHQgYXBwbGllZCBmcmljdGlvbiBiZXR3ZWVuIHR3byByaWdpZGJvZGllcyB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlLiBIb3cgbXVjaCB2ZWxvY2l0eSBpcyBzbG93ZWQgZG93biB3aGVuIG1vdmluZyBhY2Nyb3NzIHRoaXMgc3VyZmFjZS4gKi9cclxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdEZyaWN0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBPSU1PLlNldHRpbmcuZGVmYXVsdEZyaWN0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkZWZhdWx0RnJpY3Rpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRGcmljdGlvbiA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQm91bmNpbmVzcyBvZiByaWdpZGJvZGllcy4gSG93IG11Y2ggb2YgdGhlIGltcGFjdCBpcyByZXN0aXR1dGVkLiAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0UmVzdGl0dXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5kZWZhdWx0UmVzdGl0dXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGRlZmF1bHRSZXN0aXR1dGlvbihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBPSU1PLlNldHRpbmcuZGVmYXVsdFJlc3RpdHV0aW9uID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHcm91cHMgdGhlIGRlZmF1bHQgcmlnaWRib2R5IHdpbGwgY29sbGlkZSB3aXRoLiBTZXQgaXQgbGlrZTogKFBIWVNJQ1NfR1JPVVAuREVGQVVMVCB8IFBIWVNJQ1NfR1JPVVAuR1JPVVBfMSB8IFBIWVNJQ1NfR1JPVVAuR1JPVVBfMiB8IFBIWVNJQ1NfR1JPVVAuR1JPVVBfMykgXHJcbiAgICAgKiB0byBjb2xsaWRlIHdpdGggbXVsdGlwbGUgZ3JvdXBzLiBEZWZhdWx0IGlzIGNvbGxpc2lvbiB3aXRoIGV2ZXJ5dGhpbmcgYnV0IHRyaWdnZXJzLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdENvbGxpc2lvbk1hc2soKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5kZWZhdWx0Q29sbGlzaW9uTWFzaztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdENvbGxpc2lvbk1hc2soX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRDb2xsaXNpb25NYXNrID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgZ3JvdXAgdGhhdCB0aGlzIHJpZ2lkYm9keSBiZWxvbmdzIHRvLiBEZWZhdWx0IGlzIHRoZSBERUZBVUxUIEdyb3VwIHdoaWNoIG1lYW5zIGl0cyBqdXN0IGEgbm9ybWFsIFJpZ2lkYm9keSBub3QgYSB0cmlnZ2VyIG5vciBhbnl0aGluZyBzcGVjaWFsLiAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q29sbGlzaW9uR3JvdXAoKTogQ09MTElTSU9OX0dST1VQIHtcclxuICAgICAgcmV0dXJuIDxDT0xMSVNJT05fR1JPVVA+T0lNTy5TZXR0aW5nLmRlZmF1bHRDb2xsaXNpb25Hcm91cDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdENvbGxpc2lvbkdyb3VwKF92YWx1ZTogQ09MTElTSU9OX0dST1VQKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5kZWZhdWx0Q29sbGlzaW9uR3JvdXAgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENoYW5nZSB0aGUgdHlwZSBvZiBqb2ludCBzb2x2ZXIgYWxnb3JpdGhtLiBEZWZhdWx0IEl0ZXJhdGl2ZSA9PSAwLCBpcyBmYXN0ZXIgYnV0IGxlc3Mgc3RhYmxlLiBEaXJlY3QgPT0gMSwgc2xvdyBidXQgbW9yZSBzdGFibGUsIHJlY29tbWVuZGVkIGZvciBjb21wbGV4IGpvaW50IHdvcmsuIENoYW5nZSB0aGlzIHNldHRpbmcgb25seSBhdCB0aGUgc3RhcnQgb2YgeW91ciBnYW1lLiAqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q29uc3RyYWludFNvbHZlclR5cGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE9JTU8uU2V0dGluZy5kZWZhdWx0Sm9pbnRDb25zdHJhaW50U29sdmVyVHlwZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdENvbnN0cmFpbnRTb2x2ZXJUeXBlKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIE9JTU8uU2V0dGluZy5kZWZhdWx0Sm9pbnRDb25zdHJhaW50U29sdmVyVHlwZSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGNvcnJlY3Rpb24gYWxnb3JpdGhtIHVzZWQgdG8gY29ycmVjdCBwaHlzaWNzIGNhbGN1bGF0aW9ucy4gQ2hhbmdlIHRoaXMgb25seSBhdCB0aGUgYmVnaW5uaW5nIG9mIHlvdXIgZ2FtZS4gRWFjaCBoYXMgZGlmZmVyZW50IGFwcHJvYWNoZXMsIHNvIGlmIHlvdSBoYXZlIHByb2JsZW1zIHRlc3QgYW5vdGhlclxyXG4gICAgICogIERlZmF1bHQgMCA9IEJhdW1nYXJ0ZSAoZmFzdCBidXQgbGVzcyBjb3JyZWN0IGluZHVjZXMgc29tZSBlbmVyZ3kgZXJyb3JzKSwgMSA9IFNwbGl0LUltcHVsc2UgKGZhc3QgYW5kIG5vIGVuZ2VyeSBlcnJvcnMsIGJ1dCBtb3JlIGluYWNjdXJhdGUgZm9yIGpvaW50cyksIDIgPSBOb24tbGluZWFyIEdhdXNzIFNlaWRlbCAoc2xvd2VzdCBidXQgbW9zdCBhY2N1cmF0ZSkqL1xyXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q29ycmVjdGlvbkFsZ29yaXRobSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gT0lNTy5TZXR0aW5nLmRlZmF1bHRKb2ludFBvc2l0aW9uQ29ycmVjdGlvbkFsZ29yaXRobTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGVmYXVsdENvcnJlY3Rpb25BbGdvcml0aG0oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgT0lNTy5TZXR0aW5nLmRlZmF1bHRKb2ludFBvc2l0aW9uQ29ycmVjdGlvbkFsZ29yaXRobSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIHByZWNpc2lvbiBvZiB0aGUgc2ltdWxhdGlvbiBpbiBmb3JtIG9mIG51bWJlciBvZiBpdGVyYXRpb25zIHRoZSBzaW11bGF0aW9ucyBydW5zIHRocm91Z2ggdW50aWwgaXQgYWNjZXB0cyB0aGUgcmVzdWx0LlxyXG4gICAgICogIDEwIERlZmF1bHQgLSBIaWdoZXIgbWVhbnMgbW9yZSBwcmVjaXNpb24gYnV0IHJlc3VsdHMgaW4gYSBwZXJmb3JtYW5jZSBkZWNyZWFzZS4gVGhpcyBoZWxwcyBlc3BlY2lhbGx5IHdpdGggam9pbnRzLFxyXG4gICAgICogYnV0IGFsc28gdGhlIGdlbmVyYWwgc3RhYmlsaXR5IG9mIHRoZSBzaW11bGF0aW9uIGR1ZSB0byBzaW11bGF0aW9uIHN0ZXBzIGJlaW5nIHJlY2hlY2tlZCBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgYmVpbmcgc2V0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNvbHZlckl0ZXJhdGlvbnMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIFBoeXNpY3MuYWN0aXZlSW5zdGFuY2UuZ2V0T2ltb1dvcmxkKCkuZ2V0TnVtUG9zaXRpb25JdGVyYXRpb25zKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNvbHZlckl0ZXJhdGlvbnMoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgUGh5c2ljcy5hY3RpdmVJbnN0YW5jZS5nZXRPaW1vV29ybGQoKS5zZXROdW1Qb3NpdGlvbkl0ZXJhdGlvbnMoX3ZhbHVlKTtcclxuICAgICAgUGh5c2ljcy5hY3RpdmVJbnN0YW5jZS5nZXRPaW1vV29ybGQoKS5zZXROdW1WZWxvY2l0eUl0ZXJhdGlvbnMoX3ZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgICAqIEFjdHMgYXMgdGhlIHBoeXNpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byB7QGxpbmsgTm9kZX0ncy5cclxuICAgICAqIFRoZSB0eXBlIG9mIGNvbm5jZXRpb24gaXMgZGVmaW5lZCBieSB0aGUgc3ViY2xhc3NlcyBsaWtlIHByaXNtYXRpYyBqb2ludCwgY3lsaW5kZXIgam9pbnQgZXRjLlxyXG4gICAgICogQSBSaWdpZGJvZHkgb24gdGhlIHtAbGluayBOb2RlfSB0aGF0IHRoaXMgY29tcG9uZW50IGlzIGFkZGVkIHRvIGlzIG5lZWRlZC4gU2V0dGluZyB0aGUgY29ubmVjdGVkUmlnaWRib2R5IGFuZFxyXG4gICAgICogaW5pdGlhbGl6aW5nIHRoZSBjb25uZWN0aW9uIGNyZWF0ZXMgYSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdGhlbS4gVGhpcyBkaWZmZXJzIGZyb20gYSBjb25uZWN0aW9uIHRocm91Z2ggaGllcmFyY2h5XHJcbiAgICAgKiBpbiB0aGUgbm9kZSBzdHJ1Y3R1cmUgb2YgZnVkZ2UuIEpvaW50cyBjYW4gaGF2ZSBkaWZmZXJlbnQgRE9GJ3MgKERlZ3JlZXMgT2YgRnJlZWRvbSksIDEgQXhpcyB0aGF0IGNhbiBlaXRoZXIgdHdpc3Qgb3Igc3dpbmcgaXMgYSBkZWdyZWUgb2YgZnJlZWRvbS5cclxuICAgICAqIEEgam9pbnQgdHlwaWNhbGx5IGNvbnNpc3RzIG9mIGEgbW90b3IgdGhhdCBsaW1pdHMgbW92ZW1lbnQvcm90YXRpb24gb3IgaXMgYWN0aXZseSB0cnlpbmcgdG8gbW92ZSB0byBhIGxpbWl0LiBBbmQgYSBzcHJpbmcgd2hpY2ggZGVmaW5lcyB0aGUgcmlnaWRpdHkuXHJcbiAgICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSAyMDIwXHJcbiAgICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgSm9pbnQgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgLyoqIHJlZmVycyBiYWNrIHRvIHRoaXMgY2xhc3MgZnJvbSBhbnkgc3ViY2xhc3MgZS5nLiBpbiBvcmRlciB0byBmaW5kIGNvbXBhdGlibGUgb3RoZXIgcmVzb3VyY2VzKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYmFzZUNsYXNzOiB0eXBlb2YgSm9pbnQgPSBKb2ludDtcclxuICAgIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIEpvaW50W10gPSBbXTtcclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50Sm9pbnQpO1xyXG4gICAgcHJvdGVjdGVkIHNpbmdsZXRvbjogYm9vbGVhbiA9IGZhbHNlOyAvL011bHRpcGxlIGpvaW50cyBjYW4gYmUgYXR0YWNoZWQgdG8gb25lIE5vZGVcclxuXHJcbiAgICAjaWRCb2R5QW5jaG9yOiBudW1iZXIgPSAwO1xyXG4gICAgI2lkQm9keVRpZWQ6IG51bWJlciA9IDA7XHJcbiAgICAjYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5O1xyXG4gICAgI2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHk7XHJcblxyXG4gICAgI2Nvbm5lY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgI2FuY2hvcjogT0lNTy5WZWMzO1xyXG4gICAgI2ludGVybmFsQ29sbGlzaW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgI2JyZWFrRm9yY2U6IG51bWJlciA9IDA7XHJcbiAgICAjYnJlYWtUb3JxdWU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI25hbWVDaGlsZFRvQ29ubmVjdDogc3RyaW5nO1xyXG5cclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBqb2ludDogT0lNTy5Kb2ludDtcclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBjb25maWc6IE9JTU8uSm9pbnRDb25maWc7XHJcblxyXG4gICAgLyoqIENyZWF0ZSBhIGpvaW50IGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgdHdvIGdpdmVuIFJpZ2lkYm9keUNvbXBvbmVudHMuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmJvZHlBbmNob3IgPSBfYm9keUFuY2hvcjtcclxuICAgICAgdGhpcy5ib2R5VGllZCA9IF9ib2R5VGllZDtcclxuXHJcbiAgICAgIC8qXHJcbiAgICAgICAgVGVsbCB0aGUgcGh5c2ljcyB0aGF0IHRoZXJlIGlzIGEgbmV3IGpvaW50IGFuZCBvbiB0aGUgcGh5c2ljcyBzdGFydCB0aGUgYWN0dWFsIGpvaW50IGlzIGZpcnN0IGNyZWF0ZWQuIFZhbHVlcyBjYW4gYmUgc2V0IGJ1dCB0aGVcclxuICAgICAgICBhY3R1YWwgY29uc3RyYWludCBhaW4ndCBleGlzdGVudCB1bnRpbCB0aGUgZ2FtZSBzdGFydHNcclxuICAgICAgKi9cclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9BREQsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgdGhpcy5obmRFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWdpc3RlclN1YmNsYXNzKF9zdWJjbGFzczogdHlwZW9mIEpvaW50KTogbnVtYmVyIHsgcmV0dXJuIEpvaW50LnN1YmNsYXNzZXMucHVzaChfc3ViY2xhc3MpIC0gMTsgfVxyXG5cclxuICAgIC8qKiBHZXQvU2V0IHRoZSBmaXJzdCBDb21wb25lbnRSaWdpZGJvZHkgb2YgdGhpcyBjb25uZWN0aW9uLiBJdCBzaG91bGQgYWx3YXlzIGJlIHRoZSBvbmUgdGhhdCB0aGlzIGNvbXBvbmVudCBpcyBhdHRhY2hlZCB0b28gaW4gdGhlIHNjZW5lVHJlZS4gKi9cclxuICAgIHB1YmxpYyBnZXQgYm9keUFuY2hvcigpOiBDb21wb25lbnRSaWdpZGJvZHkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jYm9keUFuY2hvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGJvZHlBbmNob3IoX2NtcFJCOiBDb21wb25lbnRSaWdpZGJvZHkpIHtcclxuICAgICAgdGhpcy4jaWRCb2R5QW5jaG9yID0gX2NtcFJCICE9IG51bGwgPyBfY21wUkIuaWQgOiAtMTtcclxuICAgICAgdGhpcy4jYm9keUFuY2hvciA9IF9jbXBSQjtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0L1NldCB0aGUgc2Vjb25kIENvbXBvbmVudFJpZ2lkYm9keSBvZiB0aGlzIGNvbm5lY3Rpb24uICovXHJcbiAgICBwdWJsaWMgZ2V0IGJvZHlUaWVkKCk6IENvbXBvbmVudFJpZ2lkYm9keSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNib2R5VGllZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYm9keVRpZWQoX2NtcFJCOiBDb21wb25lbnRSaWdpZGJvZHkpIHtcclxuICAgICAgdGhpcy4jaWRCb2R5VGllZCA9IF9jbXBSQiAhPSBudWxsID8gX2NtcFJCLmlkIDogLTE7XHJcbiAgICAgIHRoaXMuI2JvZHlUaWVkID0gX2NtcFJCO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGV4YWN0IHBvc2l0aW9uIHdoZXJlIHRoZSB0d28ge0BsaW5rIE5vZGV9cyBhcmUgY29ubmVjdGVkLiBXaGVuIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdGhlIGpvaW50IG5lZWRzIHRvIGJlIHJlY29ubmVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGFuY2hvcigpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRoaXMuI2FuY2hvci54LCB0aGlzLiNhbmNob3IueSwgdGhpcy4jYW5jaG9yLnopO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBhbmNob3IoX3ZhbHVlOiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMuI2FuY2hvciA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZvcmNlIG5lZWRlZCB0byBicmVhayB0aGUgSk9JTlQsIHdoaWxlIHJvdGF0aW5nLCBpbiBOZXd0b24uIDAgZXF1YWxzIHVuYnJlYWthYmxlIChkZWZhdWx0KSBcclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGJyZWFrVG9ycXVlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNicmVha1RvcnF1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYnJlYWtUb3JxdWUoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jYnJlYWtUb3JxdWUgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuc2V0QnJlYWtUb3JxdWUodGhpcy4jYnJlYWtUb3JxdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFtb3VudCBvZiBmb3JjZSBuZWVkZWQgdG8gYnJlYWsgdGhlIEpPSU5ULCBpbiBOZXd0b24uIDAgZXF1YWxzIHVuYnJlYWthYmxlIChkZWZhdWx0KSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBicmVha0ZvcmNlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNicmVha0ZvcmNlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBicmVha0ZvcmNlKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI2JyZWFrRm9yY2UgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuc2V0QnJlYWtGb3JjZSh0aGlzLiNicmVha0ZvcmNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBJZiB0aGUgdHdvIGNvbm5lY3RlZCBSaWdpZEJvZGllcyBjb2xsaWRlIHdpdGggZWF0aCBvdGhlci4gKERlZmF1bHQgPSBmYWxzZSlcclxuICAgICAgKiBPbiBhIHdlbGRpbmcgam9pbnQgdGhlIGNvbm5lY3RlZCBib2RpZXMgc2hvdWxkIG5vdCBiZSBjb2xsaWRpbmcgd2l0aCBlYWNoIG90aGVyLFxyXG4gICAgICAqIGZvciBiZXN0IHJlc3VsdHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpbnRlcm5hbENvbGxpc2lvbigpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2ludGVybmFsQ29sbGlzaW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBpbnRlcm5hbENvbGxpc2lvbihfdmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgdGhpcy4jaW50ZXJuYWxDb2xsaXNpb24gPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuc2V0QWxsb3dDb2xsaXNpb24odGhpcy4jaW50ZXJuYWxDb2xsaXNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29ubmVjdCBhIGNoaWxkIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0byB0aGUgam9pbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25uZWN0Q2hpbGQoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNuYW1lQ2hpbGRUb0Nvbm5lY3QgPSBfbmFtZTtcclxuICAgICAgaWYgKCF0aGlzLm5vZGUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IGNoaWxkcmVuOiBOb2RlW10gPSB0aGlzLm5vZGUuZ2V0Q2hpbGRyZW5CeU5hbWUoX25hbWUpO1xyXG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEpXHJcbiAgICAgICAgdGhpcy5jb25uZWN0Tm9kZShjaGlsZHJlbi5wb3AoKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gYXQgJHt0aGlzLm5vZGUubmFtZX0gZmFpbHMgdG8gY29ubmVjdCBjaGlsZCB3aXRoIG5vbiBleGlzdGVudCBvciBhbWJpZ291cyBuYW1lICR7X25hbWV9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0IHRoZSBnaXZlbiBub2RlIHRvIHRoZSBqb2ludC4gVGllaW5nIGl0cyByaWdpZGJvZHkgdG8gdGhlIG5vZGVzIHJpZ2lkYm9keSB0aGlzIGNvbXBvbmVudCBpcyBhdHRhY2hlZCB0by5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbm5lY3ROb2RlKF9ub2RlOiBOb2RlKTogdm9pZCB7XHJcbiAgICAgIGlmICghX25vZGUgfHwgIXRoaXMubm9kZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBEZWJ1Zy5mdWRnZShgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IGNvbm5lY3RlZCAke3RoaXMubm9kZS5uYW1lfSBhbmQgJHtfbm9kZS5uYW1lfWApO1xyXG5cclxuICAgICAgbGV0IGNvbm5lY3RCb2R5OiBDb21wb25lbnRSaWdpZGJvZHkgPSBfbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50UmlnaWRib2R5KTtcclxuICAgICAgbGV0IHRoaXNCb2R5OiBDb21wb25lbnRSaWdpZGJvZHkgPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudFJpZ2lkYm9keSk7XHJcblxyXG4gICAgICBpZiAoIWNvbm5lY3RCb2R5IHx8ICF0aGlzQm9keSkge1xyXG4gICAgICAgIERlYnVnLndhcm4oYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBhdCAke3RoaXMubm9kZS5uYW1lfSBmYWlscyBkdWUgdG8gbWlzc2luZyByaWdpZGJvZGllcyBvbiAke3RoaXMubm9kZS5uYW1lfSBvciAke19ub2RlLm5hbWV9YCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmJvZHlBbmNob3IgPSB0aGlzQm9keTtcclxuICAgICAgdGhpcy5ib2R5VGllZCA9IGNvbm5lY3RCb2R5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDaGVjayBpZiBjb25uZWN0aW9uIGlzIGRpcnR5LCBzbyB3aGVuIGVpdGhlciByYiBpcyBjaGFuZ2VkIGRpc2Nvbm5lY3QgYW5kIHJlY29ubmVjdC4gSW50ZXJuYWxseSB1c2VkIG5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLiAqL1xyXG4gICAgcHVibGljIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6aW5nIGFuZCBjb25uZWN0aW5nIHRoZSB0d28gcmlnaWRib2RpZXMgd2l0aCB0aGUgY29uZmlndXJlZCBqb2ludCBwcm9wZXJ0aWVzXHJcbiAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSB0aGUgcGh5c2ljcyBzeXN0ZW0uIE5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuI2Nvbm5lY3RlZCA9PSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0aGlzLiNpZEJvZHlBbmNob3IgPT0gLTEgfHwgdGhpcy4jaWRCb2R5VGllZCA9PSAtMSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuI25hbWVDaGlsZFRvQ29ubmVjdClcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0Q2hpbGQodGhpcy4jbmFtZUNoaWxkVG9Db25uZWN0KTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29uc3RydWN0Sm9pbnQoKTtcclxuICAgICAgICB0aGlzLiNjb25uZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYWRkSm9pbnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzY29ubmVjdGluZyB0aGUgdHdvIHJpZ2lkYm9kaWVzIGFuZCByZW1vdmluZyB0aGVtIGZyb20gdGhlIHBoeXNpY3Mgc3lzdGVtLFxyXG4gICAgICogaXMgYXV0b21hdGljYWxseSBjYWxsZWQgYnkgdGhlIHBoeXNpY3Mgc3lzdGVtLiBObyB1c2VyIGludGVyYWN0aW9uIG5lZWRlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLiNjb25uZWN0ZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSm9pbnQoKTtcclxuICAgICAgICB0aGlzLiNjb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgSm9pbnQgdXNlZCBieSB0aGUgcGh5c2ljcyBlbmdpbmUuIFVzZWQgaW50ZXJuYWxseSBubyB1c2VyIGludGVyYWN0aW9uIG5lZWRlZC5cclxuICAgICAqIE9ubHkgdG8gYmUgdXNlZCB3aGVuIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBub3QgYWRkZWQgd2l0aGluIEZVREdFIGlzIG5lZWRlZC5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T2ltb0pvaW50KCk6IE9JTU8uSm9pbnQge1xyXG4gICAgICByZXR1cm4gdGhpcy5qb2ludDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuI2dldE11dGF0b3IoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5hbmNob3IgPSB0aGlzLmFuY2hvci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLmFuY2hvciA9IGF3YWl0IG5ldyBWZWN0b3IzKCkuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYW5jaG9yKTtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICB0aGlzLmNvbm5lY3RDaGlsZChfc2VyaWFsaXphdGlvbi5uYW1lQ2hpbGRUb0Nvbm5lY3QpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKHRydWUpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKG11dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIG11dGF0b3IuYW5jaG9yID0gdGhpcy5hbmNob3IuZ2V0TXV0YXRvcigpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYW5jaG9yKSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICB0aGlzLmFuY2hvciA9IG5ldyBWZWN0b3IzKC4uLjxudW1iZXJbXT4oT2JqZWN0LnZhbHVlcyhfbXV0YXRvci5hbmNob3IpKSk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5hbmNob3I7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLm5hbWVDaGlsZFRvQ29ubmVjdCkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5jb25uZWN0Q2hpbGQoX211dGF0b3IubmFtZUNoaWxkVG9Db25uZWN0KTtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9tdXRhdG9yKTtcclxuICAgICAgdGhpcy5kZWxldGVGcm9tTXV0YXRvcihfbXV0YXRvciwgdGhpcy4jZ2V0TXV0YXRvcigpKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNwcmluZ0RhbXBlcjtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLmpvaW50O1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubW90b3I7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUZWxsIHRoZSBGdWRnZVBoeXNpY3Mgc3lzdGVtIHRoYXQgdGhpcyBqb2ludCBuZWVkcyB0byBiZSBoYW5kbGVkIGluIHRoZSBuZXh0IGZyYW1lLiAqL1xyXG4gICAgcHJvdGVjdGVkIGRpcnR5U3RhdHVzKCk6IHZvaWQge1xyXG4gICAgICBQaHlzaWNzLmNoYW5nZUpvaW50U3RhdHVzKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhZGRKb2ludCgpOiB2b2lkIHtcclxuICAgICAgUGh5c2ljcy5hZGRKb2ludCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVtb3ZlSm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIFBoeXNpY3MucmVtb3ZlSm9pbnQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEpvaW50KC4uLl9jb25maWdQYXJhbXM6IE9iamVjdFtdKTogdm9pZCB7XHJcbiAgICAgIGxldCBwb3NCb2R5QW5jaG9yOiBWZWN0b3IzID0gdGhpcy5ib2R5QW5jaG9yLm5vZGUubXR4V29ybGQudHJhbnNsYXRpb247IC8vU2V0dGluZyB0aGUgYW5jaG9yIHBvc2l0aW9uIGxvY2FsbHkgZnJvbSB0aGUgZmlyc3QgcmlnaWRib2R5XHJcbiAgICAgIGxldCB3b3JsZEFuY2hvcjogT0lNTy5WZWMzID0gbmV3IE9JTU8uVmVjMyhwb3NCb2R5QW5jaG9yLnggKyB0aGlzLiNhbmNob3IueCwgcG9zQm9keUFuY2hvci55ICsgdGhpcy4jYW5jaG9yLnksIHBvc0JvZHlBbmNob3IueiArIHRoaXMuI2FuY2hvci56KTtcclxuXHJcbiAgICAgIC8vIEB0cy1pZ25vcmUgICAgLy8gdW5mb3J0dW5hdGVseSwgbWV0aG9kIGluaXQgaXMgbm90IGEgbWVtYmVyIG9mIHRoZSBiYXNlIGNsYXNzIE9JTU8uSm9pbnRDb25maWdcclxuICAgICAgdGhpcy5jb25maWcuaW5pdCh0aGlzLiNib2R5QW5jaG9yLmdldE9pbW9SaWdpZGJvZHkoKSwgdGhpcy4jYm9keVRpZWQuZ2V0T2ltb1JpZ2lkYm9keSgpLCB3b3JsZEFuY2hvciwgLi4uX2NvbmZpZ1BhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbmZpZ3VyZUpvaW50KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmpvaW50LnNldEJyZWFrRm9yY2UodGhpcy5icmVha0ZvcmNlKTtcclxuICAgICAgdGhpcy5qb2ludC5zZXRCcmVha1RvcnF1ZSh0aGlzLmJyZWFrVG9ycXVlKTtcclxuICAgICAgdGhpcy5qb2ludC5zZXRBbGxvd0NvbGxpc2lvbih0aGlzLiNpbnRlcm5hbENvbGxpc2lvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRlbGV0ZUZyb21NdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yLCBfZGVsZXRlOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGtleSBpbiBfZGVsZXRlKVxyXG4gICAgICAgIGRlbGV0ZSBfbXV0YXRvcltrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaG5kRXZlbnQgPSAoX2V2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgICBzd2l0Y2ggKF9ldmVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBFVkVOVC5DT01QT05FTlRfQUREOlxyXG4gICAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRElTQ09OTkVDVF9KT0lOVCwgKCkgPT4geyB0aGlzLmRpc2Nvbm5lY3QoKTsgdGhpcy5kaXJ0eVN0YXR1cygpOyB9LCB0cnVlKTtcclxuICAgICAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX1JFTU9WRTpcclxuICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkRJU0NPTk5FQ1RfSk9JTlQsICgpID0+IHsgdGhpcy5kaXNjb25uZWN0KCk7IHRoaXMuZGlydHlTdGF0dXMoKTsgfSwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUpvaW50KCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAjZ2V0TXV0YXRvciA9ICgpOiBNdXRhdG9yID0+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgbmFtZUNoaWxkVG9Db25uZWN0OiB0aGlzLiNuYW1lQ2hpbGRUb0Nvbm5lY3QsXHJcbiAgICAgICAgaW50ZXJuYWxDb2xsaXNpb246IHRoaXMuI2ludGVybmFsQ29sbGlzaW9uLFxyXG4gICAgICAgIGJyZWFrRm9yY2U6IHRoaXMuI2JyZWFrRm9yY2UsXHJcbiAgICAgICAgYnJlYWtUb3JxdWU6IHRoaXMuI2JyZWFrVG9ycXVlXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfTtcclxuXHJcbiAgICAjbXV0YXRlID0gKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCA9PiB7XHJcbiAgICAgIHRoaXMubXV0YXRlQmFzZShfbXV0YXRvciwgW1wiaW50ZXJuYWxDb2xsaXNpb25cIiwgXCJicmVha0ZvcmNlXCIsIFwiYnJlYWtUb3JxdWVcIl0pO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgICAqIEJhc2UgY2xhc3MgZm9yIGpvaW50cyBvcGVyYXRpbmcgd2l0aCBleGFjdGx5IG9uZSBheGlzXHJcbiAgICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIEpvaW50QXhpYWwgZXh0ZW5kcyBKb2ludCB7XHJcbiAgICBwcm90ZWN0ZWQgc3ByaW5nRGFtcGVyOiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuICAgIFxyXG4gICAgLy9JbnRlcm5hbCBWYXJpYWJsZXNcclxuICAgICNtYXhNb3RvcjogbnVtYmVyID0gMTA7XHJcbiAgICAjbWluTW90b3I6IG51bWJlciA9IC0xMDtcclxuICAgICNtb3RvclNwZWVkOiBudW1iZXIgPSAwO1xyXG4gICAgI2F4aXM6IE9JTU8uVmVjMztcclxuICAgICNzcHJpbmdGcmVxdWVuY3k6IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRGFtcGluZzogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvKiogQ3JlYXRpbmcgYSBjeWxpbmRyaWNhbCBqb2ludCBiZXR3ZWVuIHR3byBDb21wb25lbnRSaWdpZGJvZGllcyBtb3Zpbmcgb24gb25lIGF4aXMgYW5kIHJvdGF0aW5nIGFyb3VuZCBhbm90aGVyIGJvdW5kIG9uIGEgbG9jYWwgYW5jaG9ycG9pbnQuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2F4aXM6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAxLCAwKSwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCk7XHJcbiAgICAgIHRoaXMuYXhpcyA9IF9heGlzO1xyXG4gICAgICB0aGlzLmFuY2hvciA9IF9sb2NhbEFuY2hvcjtcclxuICAgICAgdGhpcy5taW5Nb3RvciA9IC0xMDtcclxuICAgICAgdGhpcy5tYXhNb3RvciA9IDEwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBHZXQvU2V0IHRyYW5zZm9yIG9mIGZ1ZGdlIHByb3BlcnRpZXMgdG8gdGhlIHBoeXNpY3MgZW5naW5lXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBheGlzIGNvbm5lY3RpbmcgdGhlIHRoZSB0d28ge0BsaW5rIE5vZGV9cyBlLmcuIFZlY3RvcjMoMCwxLDApIHRvIGhhdmUgYSB1cHdhcmQgY29ubmVjdGlvbi5cclxuICAgICAqICBXaGVuIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdGhlIGpvaW50IG5lZWRzIHRvIGJlIHJlY29ubmVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGF4aXMoKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLiNheGlzLngsIHRoaXMuI2F4aXMueSwgdGhpcy4jYXhpcy56KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYXhpcyhfdmFsdWU6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy4jYXhpcyA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heE1vdG9yKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtYXhNb3RvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG1heE1vdG9yKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21heE1vdG9yID0gX3ZhbHVlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgICg8T0lNTy5QcmlzbWF0aWNKb2ludD48dW5rbm93bj50aGlzLmpvaW50KS5nZXRMaW1pdE1vdG9yKCkudXBwZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHsgLyogKi8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBMb3dlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1pbk1vdG9yKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtaW5Nb3RvcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWluTW90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWluTW90b3IgPSBfdmFsdWU7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgKDxPSU1PLlByaXNtYXRpY0pvaW50Pjx1bmtub3duPnRoaXMuam9pbnQpLmdldExpbWl0TW90b3IoKS5sb3dlckxpbWl0ID0gX3ZhbHVlO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikgeyAvKiAqLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGFtcGluZyBvZiB0aGUgc3ByaW5nLiAxIGVxdWFscyBjb21wbGV0bHkgZGFtcGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0RhbXBpbmcoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0RhbXBpbmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0RhbXBpbmcoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGluZyA9IF92YWx1ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAoPE9JTU8uUHJpc21hdGljSm9pbnQ+PHVua25vd24+dGhpcy5qb2ludCkuZ2V0U3ByaW5nRGFtcGVyKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikgeyAvKiAqLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIHRhcmdldCBzcGVlZCBvZiB0aGUgbW90b3IgaW4gbS9zLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1vdG9yU3BlZWQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21vdG9yU3BlZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBtb3RvclNwZWVkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21vdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgKDxPSU1PLlByaXNtYXRpY0pvaW50PnRoaXMuam9pbnQpLmdldExpbWl0TW90b3IoKS5tb3RvclNwZWVkID0gX3ZhbHVlO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikgeyAvKiAqLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gVGhlIHNtYWxsZXIgdGhlIHZhbHVlIHRoZSBsZXNzIHJlc3RyaWN0aXZlIGlzIHRoZSBzcHJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdGcmVxdWVuY3koKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRnJlcXVlbmN5KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAoPE9JTU8uUHJpc21hdGljSm9pbnQ+dGhpcy5qb2ludCkuZ2V0U3ByaW5nRGFtcGVyKCkuZnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgICB9IGNhdGNoIChfZTogdW5rbm93bikgeyAvKiAqLyB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmdcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy4jZ2V0TXV0YXRvcigpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmF4aXMgPSB0aGlzLmF4aXMuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5heGlzID0gYXdhaXQgbmV3IFZlY3RvcjMoKS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5heGlzKTtcclxuICAgICAgdGhpcy4jbXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYXhpcykgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5heGlzID0gbmV3IFZlY3RvcjMoLi4uPG51bWJlcltdPihPYmplY3QudmFsdWVzKF9tdXRhdG9yLmF4aXMpKSk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5heGlzO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX211dGF0b3IpO1xyXG4gICAgICB0aGlzLmRlbGV0ZUZyb21NdXRhdG9yKF9tdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBtdXRhdG9yLmF4aXMgPSB0aGlzLmF4aXMuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKG11dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc3ByaW5nRGFtcGVyID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeSwgdGhpcy4jc3ByaW5nRGFtcGluZyk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KHRoaXMuI2F4aXMpO1xyXG4gICAgfVxyXG5cclxuICAgICNnZXRNdXRhdG9yID0gKCk6IE11dGF0b3IgPT4ge1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICBzcHJpbmdEYW1waW5nOiB0aGlzLiNzcHJpbmdEYW1waW5nLFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeTogdGhpcy4jc3ByaW5nRnJlcXVlbmN5LFxyXG4gICAgICAgIG1heE1vdG9yOiB0aGlzLiNtYXhNb3RvcixcclxuICAgICAgICBtaW5Nb3RvcjogdGhpcy4jbWluTW90b3IsXHJcbiAgICAgICAgbW90b3JTcGVlZDogdGhpcy4jbW90b3JTcGVlZFxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH07XHJcblxyXG4gICAgI211dGF0ZSA9IChfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgPT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZUJhc2UoX211dGF0b3IsIFtcInNwcmluZ0RhbXBpbmdcIiwgXCJzcHJpbmdGcmVxdWVuY3lcIiwgXCJtYXhNb3RvclwiLCBcIm1pbk1vdG9yXCIsIFwibW90b3JTcGVlZFwiXSk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEZWJ1Zy9EZWJ1Z1RhcmdldC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnL0RlYnVnLnRzXCIvPlxyXG4vLyAvIDxyZWZlcmVuY2UgcGF0aD1cIlRpbWUvVGltZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkV2ZW50L0V2ZW50LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiU2VyaWFsaXphdGlvbi9NdXRhYmxlLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiU2VyaWFsaXphdGlvbi9TZXJpYWxpemVyLnRzXCIvPiBcclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkdyYXBoL05vZGUudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDb21wb25lbnQvQ29tcG9uZW50LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUmVjeWNsZS9SZWN5Y2FibGVBcnJheS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlci9SZW5kZXJXZWJHTC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJlbmRlci9SZW5kZXJJbmplY3RvclRleHR1cmUudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJQaHlzaWNzL0hlbHBlcnNQaHlzaWNzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUGh5c2ljcy9Kb2ludC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlBoeXNpY3MvSm9pbnRBeGlhbC50c1wiLz5cclxuXHJcblxyXG4vL2dsb2JhbCBmdW5jdGlvbnNcclxuZnVuY3Rpb24gaWZOdW1iZXIoX2NoZWNrOiBudW1iZXIsIF9kZWZhdWx0OiBudW1iZXIpOiBudW1iZXIge1xyXG4gIHJldHVybiB0eXBlb2YgX2NoZWNrID09IFwidW5kZWZpbmVkXCIgPyBfZGVmYXVsdCA6IF9jaGVjaztcclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBbmltYXRpb25TdHJ1Y3R1cmUgdGhhdCB0aGUgQW5pbWF0aW9uIHVzZXMgdG8gbWFwIHRoZSBTZXF1ZW5jZXMgdG8gdGhlIEF0dHJpYnV0ZXMuXHJcbiAgICogQnVpbHQgb3V0IG9mIGEge0BsaW5rIE5vZGV9J3Mgc2VyaWFsc2F0aW9uLCBpdCBzd2FwcyB0aGUgdmFsdWVzIHdpdGgge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXMuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb25TdHJ1Y3R1cmUge1xyXG4gICAgW2F0dHJpYnV0ZTogc3RyaW5nXTogQW5pbWF0aW9uU3RydWN0dXJlW10gfCBBbmltYXRpb25TdHJ1Y3R1cmUgfCBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3IzIGV4dGVuZHMgQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgIHg/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHk/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHo/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3I0IGV4dGVuZHMgQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgIHg/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHk/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHo/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICAgIHc/OiBBbmltYXRpb25TZXF1ZW5jZTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2VxdWVuY2VNYXRyaXg0eDQgZXh0ZW5kcyBBbmltYXRpb25TdHJ1Y3R1cmUge1xyXG4gICAgcm90YXRpb24/OiBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjMgfCBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjQ7XHJcbiAgICBzY2FsZT86IEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yMztcclxuICAgIHRyYW5zbGF0aW9uPzogQW5pbWF0aW9uU2VxdWVuY2VWZWN0b3IzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBbiBhc3NvY2lhdGl2ZSBhcnJheSBtYXBwaW5nIG5hbWVzIG9mIGxhYmxlcyB0byB0aW1lc3RhbXBzLlxyXG4gICogTGFiZWxzIG5lZWQgdG8gYmUgdW5pcXVlIHBlciBBbmltYXRpb24uXHJcbiAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvbkxhYmVsIHtcclxuICAgIFtuYW1lOiBzdHJpbmddOiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IEFuaW1hdGlvbiBFdmVudCBUcmlnZ2Vyc1xyXG4gICogQGF1dGhvciBMdWthcyBTY2hldWVybGUsIEhGVSwgMjAxOVxyXG4gICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb25FdmVudFRyaWdnZXIge1xyXG4gICAgW25hbWU6IHN0cmluZ106IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVybmFsbHkgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHZhcmlvdXMgZ2VuZXJhdGVkIHN0cnVjdHVyZXMgYW5kIGV2ZW50cy5cclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZW51bSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUge1xyXG4gICAgLyoqRGVmYXVsdDogZm9yd2FyZCwgY29udGlub3VzICovXHJcbiAgICBOT1JNQUwsXHJcbiAgICAvKipiYWNrd2FyZCwgY29udGlub3VzICovXHJcbiAgICBSRVZFUlNFLFxyXG4gICAgLyoqZm9yd2FyZCwgcmFzdGVyZWQgKi9cclxuICAgIFJBU1RFUkVELFxyXG4gICAgLyoqYmFja3dhcmQsIHJhc3RlcmVkICovXHJcbiAgICBSQVNURVJFRFJFVkVSU0VcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGRpZmZlcmVudCBwbGF5bW9kZXMgdGhlIGFuaW1hdGlvbiB1c2VzIHRvIHBsYXkgYmFjayBpdHMgYW5pbWF0aW9uLlxyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBBTklNQVRJT05fUExBWU1PREUge1xyXG4gICAgLyoqUGxheXMgYW5pbWF0aW9uIGluIGEgbG9vcDogaXQgcmVzdGFydHMgb25jZSBpdCBoaXQgdGhlIGVuZC4qL1xyXG4gICAgTE9PUCA9IFwibG9vcFwiLFxyXG4gICAgLyoqUGxheXMgYW5pbWF0aW9uIG9uY2UgYW5kIHN0b3BzIGF0IHRoZSBsYXN0IGtleS9mcmFtZSovXHJcbiAgICBQTEFZX09OQ0UgPSBcInBsYXlPbmNlXCIsXHJcbiAgICAvKipQbGF5cyBhbmltYXRpb24gb25jZSBhbmQgc3RvcHMgb24gdGhlIGZpcnN0IGtleS9mcmFtZSAqL1xyXG4gICAgUExBWV9PTkNFX1JFU0VUID0gXCJwbGF5T25jZVJlc2V0XCIsXHJcbiAgICAvKipQbGF5cyBhbmltYXRpb24gbGlrZSBMT09QLCBidXQgYmFja3dhcmRzLiovXHJcbiAgICBSRVZFUlNFX0xPT1AgPSBcInJldmVyc2VMb29wXCIsXHJcbiAgICAvKipDYXVzZXMgdGhlIGFuaW1hdGlvbiBub3QgdG8gcGxheSBhdCBhbGwuIFVzZWZ1bCBmb3IganVtcGluZyB0byB2YXJpb3VzIHBvc2l0aW9ucyBpbiB0aGUgYW5pbWF0aW9uIHdpdGhvdXQgcHJvY2VlZGluZyBpbiB0aGUgYW5pbWF0aW9uLiovXHJcbiAgICBTVE9QID0gXCJzdG9wXCJcclxuICAgIC8vVE9ETzogYWRkIGFuIElOSEVSSVQgYW5kIGEgUElOR1BPTkcgbW9kZVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gQU5JTUFUSU9OX1FVQU5USVpBVElPTiB7XHJcbiAgICAvL1RPRE86IGFkZCBhbiBpbi1kZXB0aCBkZXNjcmlwdGlvbiBvZiB3aGF0IGhhcHBlbnMgdG8gdGhlIGFuaW1hdGlvbiAoYW5kIGV2ZW50cykgZGVwZW5kaW5nIG9uIHRoZSBxdWFudGl6YXRpb24uIFVzZSBHcmFwaHMgdG8gZXhwbGFpbi5cclxuICAgIC8qKkNhbGN1bGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBhbmltYXRpb24gYXQgdGhlIGV4YWN0IHBvc2l0aW9uIG9mIHRpbWUuIElnbm9yZXMgRlBTIHZhbHVlIG9mIGFuaW1hdGlvbi4qL1xyXG4gICAgQ09OVElOT1VTID0gXCJjb250aW5vdXNcIixcclxuICAgIC8qKkxpbWl0cyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIHN0YXRlIG9mIHRoZSBhbmltYXRpb24gdG8gdGhlIEZQUyB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uLiBTa2lwcyBmcmFtZXMgaWYgbmVlZGVkLiovXHJcbiAgICBESVNDUkVURSA9IFwiZGlzY3JldGVcIixcclxuICAgIC8qKiBBZHZhbmNlcyB0aGUgdGltZSBlYWNoIGZyYW1lIGFjY29yZGluZyB0byB0aGUgRlBTIHZhbHVlIG9mIHRoZSBhbmltYXRpb24sIGlnbm9yaW5nIHRoZSBhY3R1YWwgZHVyYXRpb24gb2YgdGhlIGZyYW1lcy4gRG9lc24ndCBza2lwIGFueSBmcmFtZXMuKi9cclxuICAgIEZSQU1FUyA9IFwiZnJhbWVzXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlc2NyaWJlcyBhbmQgY29udHJvbHMgYW5kIGFuaW1hdGlvbiBieSB5aWVsZGluZyBtdXRhdG9ycyBcclxuICAgKiBhY2NvcmRpbmcgdG8gdGhlIHN0b3JlZCB7QGxpbmsgQW5pbWF0aW9uU3RydWN0dXJlfSBhbmQge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXNcclxuICAgKiBBcHBsaWVkIHRvIGEge0BsaW5rIE5vZGV9IGRpcmVjdGx5IHZpYSBzY3JpcHQgb3Ige0BsaW5rIENvbXBvbmVudEFuaW1hdG9yfS5cclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMTAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQW5pbWF0aW9uIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIC8vIC8qKiByZWZlcnMgYmFjayB0byB0aGlzIGNsYXNzIGZyb20gYW55IHN1YmNsYXNzIGUuZy4gaW4gb3JkZXIgdG8gZmluZCBjb21wYXRpYmxlIG90aGVyIHJlc291cmNlcyovXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJhc2VDbGFzczogdHlwZW9mIEFuaW1hdGlvbiA9IEFuaW1hdGlvbjtcclxuICAgIC8vIC8qKiBsaXN0IG9mIGFsbCB0aGUgc3ViY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcywgaWYgdGhleSByZWdpc3RlcmVkIHByb3Blcmx5Ki9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ViY2xhc3NlczogdHlwZW9mIEFuaW1hdGlvbltdID0gW107XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQW5pbWF0aW9uLnJlZ2lzdGVyU3ViY2xhc3MoQW5pbWF0aW9uKTtcclxuICAgIHB1YmxpYyBpZFJlc291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xyXG4gICAgcHVibGljIHRvdGFsVGltZTogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsYWJlbHM6IEFuaW1hdGlvbkxhYmVsID0ge307IC8vIGEgbGFiZWwgbWFya3MgYSBzcGVjaWZpYyB0aW1lIHRvIGNvbnZlbmllbnRseSBqdW1wIHRvIHVzaW5nIGEgdGV4dCBpZGVudGlmaWVyXHJcbiAgICAvLyBzdGVwc1BlclNlY29uZDogbnVtYmVyID0gMTA7XHJcbiAgICBwdWJsaWMgYW5pbWF0aW9uU3RydWN0dXJlOiBBbmltYXRpb25TdHJ1Y3R1cmU7IC8vIFRPRE86IGlmIHNldCB0aGUgY2FjaGUgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgKGFuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQpXHJcbiAgICBwdWJsaWMgZXZlbnRzOiBBbmltYXRpb25FdmVudFRyaWdnZXIgPSB7fTtcclxuICAgIHByb3RlY3RlZCBmcmFtZXNQZXJTZWNvbmQ6IG51bWJlciA9IDYwOyAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBhbmQgaXRzIGFjY2Vzc29ycyB0byAjZnJhbWVzUGVyU2Vjb25kP1xyXG5cclxuICAgIC8vIHByb2Nlc3NlZCBldmVudGxpc3QgYW5kIGFuaW1hdGlvbiBzdHJ1Y3V0cmVzIGZvciBwbGF5YmFjay5cclxuICAgIHByaXZhdGUgZXZlbnRzUHJvY2Vzc2VkOiBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25FdmVudFRyaWdnZXI+ID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcj4oKTtcclxuICAgICNhbmltYXRpb25TdHJ1Y3R1cmVzUHJvY2Vzc2VkOiBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25TdHJ1Y3R1cmU+ID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvblN0cnVjdHVyZT4oKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IEFuaW1hdGlvbi5uYW1lLCBfYW5pbVN0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge30sIF9mcHM6IG51bWJlciA9IDYwKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IF9hbmltU3RydWN0dXJlO1xyXG4gICAgICB0aGlzLiNhbmltYXRpb25TdHJ1Y3R1cmVzUHJvY2Vzc2VkLnNldChBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuTk9STUFMLCBfYW5pbVN0cnVjdHVyZSk7XHJcbiAgICAgIHRoaXMuZnJhbWVzUGVyU2Vjb25kID0gX2ZwcztcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbFRpbWUoKTtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YkNsYXNzOiB0eXBlb2YgQW5pbWF0aW9uKTogbnVtYmVyIHsgcmV0dXJuIEFuaW1hdGlvbi5zdWJjbGFzc2VzLnB1c2goX3N1YkNsYXNzKSAtIDE7IH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGdldExhYmVscygpOiBFbnVtZXJhdG9yIHtcclxuICAgICAgLy9UT0RPOiB0aGlzIGFjdHVhbGx5IG5lZWRzIHRlc3RpbmdcclxuICAgICAgbGV0IGVuOiBFbnVtZXJhdG9yID0gbmV3IEVudW1lcmF0b3IodGhpcy5sYWJlbHMpO1xyXG4gICAgICByZXR1cm4gZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBmcHMoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZnJhbWVzUGVyU2Vjb25kO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZnBzKF9mcHM6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmZyYW1lc1BlclNlY29uZCA9IF9mcHM7XHJcbiAgICAgIHRoaXMuZXZlbnRzUHJvY2Vzc2VkLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXIgdGhpcyBhbmltYXRpb25zIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZC5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIGEge0BsaW5rIE11dGF0b3J9IHdpdGggdGhlIGluZm9ybWF0aW9uIHRvIGFwcGx5IHRvIHRoZSB7QGxpbmsgTm9kZX0gdG8gYW5pbWF0ZVxyXG4gICAgICogaW4gdGhlIHN0YXRlIHRoZSBhbmltYXRpb24gaXMgaW4gYXQgdGhlIGdpdmVuIHRpbWUsIGRpcmVjdGlvbiBhbmQgcXVhbnRpemF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdGF0ZShfdGltZTogbnVtYmVyLCBfZGlyZWN0aW9uOiBudW1iZXIsIF9xdWFudGl6YXRpb246IEFOSU1BVElPTl9RVUFOVElaQVRJT04pOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG06IE11dGF0b3IgPSB7fTtcclxuICAgICAgbGV0IGFuaW1hdGlvblN0cnVjdHVyZTogQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFO1xyXG5cclxuICAgICAgaWYgKF9xdWFudGl6YXRpb24gPT0gQU5JTUFUSU9OX1FVQU5USVpBVElPTi5DT05USU5PVVMpXHJcbiAgICAgICAgYW5pbWF0aW9uU3RydWN0dXJlID0gX2RpcmVjdGlvbiA8IDAgPyBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRSA6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUw7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhbmltYXRpb25TdHJ1Y3R1cmUgPSBfZGlyZWN0aW9uIDwgMCA/IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0UgOiBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkFTVEVSRUQ7XHJcblxyXG4gICAgICBtID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvck11dGF0b3IodGhpcy5nZXRQcm9jZXNzZWRBbmltYXRpb25TdHJ1Y3R1cmUoYW5pbWF0aW9uU3RydWN0dXJlKSwgX3RpbWUpO1xyXG4gICAgICByZXR1cm4gbTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgZXZlbnRzIHRoZSB7QGxpbmsgQ29tcG9uZW50QW5pbWF0b3J9IG5lZWRzIHRvIGZpcmUgYmV0d2VlbiBfbWluIGFuZCBfbWF4IGlucHV0IHZhbHVlcy5cclxuICAgICAqIEBwYXJhbSBfZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdGhlIGFuaW1hdGlvbiBpcyBzdXBwb3NlZCB0byBydW4gaW4uID4wID09IGZvcndhcmQsIDAgPT0gc3RvcCwgPDAgPT0gYmFja3dhcmRzXHJcbiAgICAgKiBAcmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5ncyB3aXRoIHRoZSBuYW1lcyBvZiB0aGUgY3VzdG9tIGV2ZW50cyB0byBmaXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RXZlbnRzVG9GaXJlKF9taW46IG51bWJlciwgX21heDogbnVtYmVyLCBfcXVhbnRpemF0aW9uOiBBTklNQVRJT05fUVVBTlRJWkFUSU9OLCBfZGlyZWN0aW9uOiBudW1iZXIpOiBzdHJpbmdbXSB7XHJcbiAgICAgIGxldCBldmVudExpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGxldCBtaW5TZWN0aW9uOiBudW1iZXIgPSBNYXRoLmZsb29yKF9taW4gLyB0aGlzLnRvdGFsVGltZSk7XHJcbiAgICAgIGxldCBtYXhTZWN0aW9uOiBudW1iZXIgPSBNYXRoLmZsb29yKF9tYXggLyB0aGlzLnRvdGFsVGltZSk7XHJcbiAgICAgIF9taW4gPSBfbWluICUgdGhpcy50b3RhbFRpbWU7XHJcbiAgICAgIF9tYXggPSBfbWF4ICUgdGhpcy50b3RhbFRpbWU7XHJcblxyXG4gICAgICB3aGlsZSAobWluU2VjdGlvbiA8PSBtYXhTZWN0aW9uKSB7XHJcbiAgICAgICAgbGV0IGV2ZW50VHJpZ2dlcnM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciA9IHRoaXMuZ2V0Q29ycmVjdEV2ZW50TGlzdChfZGlyZWN0aW9uLCBfcXVhbnRpemF0aW9uKTtcclxuICAgICAgICBpZiAobWluU2VjdGlvbiA9PSBtYXhTZWN0aW9uKSB7XHJcbiAgICAgICAgICBldmVudExpc3QgPSBldmVudExpc3QuY29uY2F0KHRoaXMuY2hlY2tFdmVudHNCZXR3ZWVuKGV2ZW50VHJpZ2dlcnMsIF9taW4sIF9tYXgpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZXZlbnRMaXN0ID0gZXZlbnRMaXN0LmNvbmNhdCh0aGlzLmNoZWNrRXZlbnRzQmV0d2VlbihldmVudFRyaWdnZXJzLCBfbWluLCB0aGlzLnRvdGFsVGltZSkpO1xyXG4gICAgICAgICAgX21pbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1pblNlY3Rpb24rKztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGV2ZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gRXZlbnQgdG8gdGhlIExpc3Qgb2YgZXZlbnRzLlxyXG4gICAgICogQHBhcmFtIF9uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudCAobmVlZHMgdG8gYmUgdW5pcXVlIHBlciBBbmltYXRpb24pLlxyXG4gICAgICogQHBhcmFtIF90aW1lIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGV2ZW50IChpbiBtaWxsaXNlY29uZHMpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0RXZlbnQoX25hbWU6IHN0cmluZywgX3RpbWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLmV2ZW50c1tfbmFtZV0gPSBfdGltZTtcclxuICAgICAgdGhpcy5ldmVudHNQcm9jZXNzZWQuY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgbGlzdCBvZiBldmVudHMuXHJcbiAgICAgKiBAcGFyYW0gX25hbWUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVtb3ZlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlRXZlbnQoX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBkZWxldGUgdGhpcy5ldmVudHNbX25hbWVdO1xyXG4gICAgICB0aGlzLmV2ZW50c1Byb2Nlc3NlZC5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIChSZS0pQ2FsY3VsYXRlIHRoZSB0b3RhbCB0aW1lIG9mIHRoZSBBbmltYXRpb24uIENhbGN1bGF0aW9uLWhlYXZ5LCB1c2Ugb25seSBpZiBhY3R1YWxseSBuZWVkZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWxjdWxhdGVUb3RhbFRpbWUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudG90YWxUaW1lID0gMDtcclxuICAgICAgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclRpbWUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICAvLyBpZiAodGhpcy50b3RhbFRpbWUgPT0gMCkgLy8gYW5pbWF0aW9ucyB3aXRoIG9uZSBrZXlmcmFtZSBuZWVkIGEgdG90YWwgdGltZSAhPSAwIHRvIHdvcmtcclxuICAgICAgLy8gICB0aGlzLnRvdGFsVGltZSA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHRvIHVzZSBmb3IgYW5pbWF0aW9uIHNhbXBsaW5nIHdoZW4gYXBwbHlpbmcgYSBwbGF5bW9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TW9kYWxUaW1lKF90aW1lOiBudW1iZXIsIF9wbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFLCBfdGltZVN0b3A6IG51bWJlciA9IF90aW1lKTogbnVtYmVyIHtcclxuICAgICAgc3dpdGNoIChfcGxheW1vZGUpIHtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5TVE9QOlxyXG4gICAgICAgICAgLy8gcmV0dXJuIHRoaXMubG9jYWxUaW1lLmdldE9mZnNldCgpO1xyXG4gICAgICAgICAgcmV0dXJuIF90aW1lU3RvcDtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0U6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvdGFsVGltZSAtIDAuMDE7ICAgICAvL1RPRE86IHRoaXMgbWlnaHQgY2F1c2Ugc29tZSBpc3N1ZXNcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0VfUkVTRVQ6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpXHJcbiAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBfdGltZVN0b3AgaW5zdGVhZD9cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxUaW1lICsgMC4wMTsgICAgIC8vVE9ETzogdGhpcyBtaWdodCBjYXVzZSBzb21lIGlzc3Vlc1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfdGltZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIGRpcmVjdGlvbiB0aGUgYW5pbWF0aW9uIHNob3VsZCBjdXJyZW50bHkgYmUgcGxheWluZyBpbi5cclxuICAgICAqIEBwYXJhbSBfdGltZSB0aGUgdGltZSBhdCB3aGljaCB0byBjYWxjdWxhdGUgdGhlIGRpcmVjdGlvblxyXG4gICAgICogQHJldHVybnMgMSBpZiBmb3J3YXJkLCAwIGlmIHN0b3AsIC0xIGlmIGJhY2t3YXJkc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2FsY3VsYXRlRGlyZWN0aW9uKF90aW1lOiBudW1iZXIsIF9wbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFKTogbnVtYmVyIHtcclxuICAgICAgc3dpdGNoIChfcGxheW1vZGUpIHtcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5TVE9QOlxyXG4gICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgLy8gY2FzZSBBTklNQVRJT05fUExBWU1PREUuUElOR1BPTkc6XHJcbiAgICAgICAgLy8gICBpZiAoTWF0aC5mbG9vcihfdGltZSAvIHRoaXMuYW5pbWF0aW9uLnRvdGFsVGltZSkgJSAyID09IDApXHJcbiAgICAgICAgLy8gICAgIHJldHVybiAxO1xyXG4gICAgICAgIC8vICAgZWxzZVxyXG4gICAgICAgIC8vICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgY2FzZSBBTklNQVRJT05fUExBWU1PREUuUkVWRVJTRV9MT09QOlxyXG4gICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIGNhc2UgQU5JTUFUSU9OX1BMQVlNT0RFLlBMQVlfT05DRTpcclxuICAgICAgICBjYXNlIEFOSU1BVElPTl9QTEFZTU9ERS5QTEFZX09OQ0VfUkVTRVQ6XHJcbiAgICAgICAgICBpZiAoX3RpbWUgPj0gdGhpcy50b3RhbFRpbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIHRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgczogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGxhYmVsczoge30sXHJcbiAgICAgICAgZXZlbnRzOiB7fSxcclxuICAgICAgICBmcmFtZXNQZXJTZWNvbmQ6IHRoaXMuZnJhbWVzUGVyU2Vjb25kXHJcbiAgICAgICAgLy8gc3BzOiB0aGlzLnN0ZXBzUGVyU2Vjb25kXHJcbiAgICAgIH07XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5sYWJlbHMpIHtcclxuICAgICAgICBzLmxhYmVsc1tuYW1lXSA9IHRoaXMubGFiZWxzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5ldmVudHMpIHtcclxuICAgICAgICBzLmV2ZW50c1tuYW1lXSA9IHRoaXMuZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHMuYW5pbWF0aW9uU3RydWN0dXJlID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclNlcmlhbGl6YXRpb24odGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICByZXR1cm4gcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfc2VyaWFsaXphdGlvbi5uYW1lO1xyXG4gICAgICB0aGlzLmZyYW1lc1BlclNlY29uZCA9IF9zZXJpYWxpemF0aW9uLmZyYW1lc1BlclNlY29uZDtcclxuICAgICAgLy8gdGhpcy5zdGVwc1BlclNlY29uZCA9IF9zZXJpYWxpemF0aW9uLnNwcztcclxuICAgICAgdGhpcy5sYWJlbHMgPSB7fTtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBfc2VyaWFsaXphdGlvbi5sYWJlbHMpIHtcclxuICAgICAgICB0aGlzLmxhYmVsc1tuYW1lXSA9IF9zZXJpYWxpemF0aW9uLmxhYmVsc1tuYW1lXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmV2ZW50cyA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuYW1lIGluIF9zZXJpYWxpemF0aW9uLmV2ZW50cykge1xyXG4gICAgICAgIHRoaXMuZXZlbnRzW25hbWVdID0gX3NlcmlhbGl6YXRpb24uZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZXZlbnRzUHJvY2Vzc2VkID0gbmV3IE1hcDxBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUsIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcj4oKTtcclxuXHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlID0gYXdhaXQgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvckRlc2VyaWFsaXphdGlvbihfc2VyaWFsaXphdGlvbi5hbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG5cclxuICAgICAgdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZCA9IG5ldyBNYXA8QU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLCBBbmltYXRpb25TdHJ1Y3R1cmU+KCk7XHJcblxyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsVGltZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgIC8vICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnRvdGFsVGltZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIGFuIEFuaW1hdGlvblN0cnVjdHVyZSBhbmQgcmV0dXJucyB0aGUgU2VyaWFsaXphdGlvbiBvZiBzYWlkIFN0cnVjdHVyZS5cclxuICAgICAqIEBwYXJhbSBfc3RydWN0dXJlIFRoZSBBbmltYXRpb24gU3RydWN0dXJlIGF0IHRoZSBjdXJyZW50IGxldmVsIHRvIHRyYW5zZm9ybSBpbnRvIHRoZSBTZXJpYWxpemF0aW9uLlxyXG4gICAgICogQHJldHVybnMgdGhlIGZpbGxlZCBTZXJpYWxpemF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYXZlcnNlU3RydWN0dXJlRm9yU2VyaWFsaXphdGlvbihfc3RydWN0dXJlOiBPYmplY3QpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBfc3RydWN0dXJlKSB7XHJcbiAgICAgICAgbGV0IHN0cnVjdHVyZU9yU2VxdWVuY2U6IE9iamVjdCA9ICg8R2VuZXJhbD5fc3RydWN0dXJlKVtwcm9wZXJ0eV07XHJcbiAgICAgICAgaWYgKHN0cnVjdHVyZU9yU2VxdWVuY2UgaW5zdGFuY2VvZiBBbmltYXRpb25TZXF1ZW5jZSlcclxuICAgICAgICAgIHNlcmlhbGl6YXRpb25bcHJvcGVydHldID0gc3RydWN0dXJlT3JTZXF1ZW5jZS5zZXJpYWxpemUoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBzZXJpYWxpemF0aW9uW3Byb3BlcnR5XSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JTZXJpYWxpemF0aW9uKHN0cnVjdHVyZU9yU2VxdWVuY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmF2ZXJzZXMgYSBTZXJpYWxpemF0aW9uIHRvIGNyZWF0ZSBhIG5ldyBBbmltYXRpb25TdHJ1Y3R1cmUuXHJcbiAgICAgKiBAcGFyYW0gX3NlcmlhbGl6YXRpb24gVGhlIHNlcmlhbGl6YXRpb24gdG8gdHJhbnNmZXIgaW50byBhbiBBbmltYXRpb25TdHJ1Y3R1cmVcclxuICAgICAqIEByZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIEFuaW1hdGlvblN0cnVjdHVyZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyB0cmF2ZXJzZVN0cnVjdHVyZUZvckRlc2VyaWFsaXphdGlvbihfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8QW5pbWF0aW9uU3RydWN0dXJlPiB7XHJcbiAgICAgIGxldCBzdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zZXJpYWxpemF0aW9uKSB7XHJcbiAgICAgICAgaWYgKF9zZXJpYWxpemF0aW9uW25dLmFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBsZXQgYW5pbVNlcTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgICAgIHN0cnVjdHVyZVtuXSA9IDxBbmltYXRpb25TZXF1ZW5jZT4oYXdhaXQgYW5pbVNlcS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltuXSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzdHJ1Y3R1cmVbbl0gPSBhd2FpdCB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yRGVzZXJpYWxpemF0aW9uKF9zZXJpYWxpemF0aW9uW25dKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHN0cnVjdHVyZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnRzIHRvIGJlIHVzZWQgd2l0aCB0aGVzZSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRDb3JyZWN0RXZlbnRMaXN0KF9kaXJlY3Rpb246IG51bWJlciwgX3F1YW50aXphdGlvbjogQU5JTUFUSU9OX1FVQU5USVpBVElPTik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGlmIChfcXVhbnRpemF0aW9uICE9IEFOSU1BVElPTl9RVUFOVElaQVRJT04uRlJBTUVTKSB7XHJcbiAgICAgICAgaWYgKF9kaXJlY3Rpb24gPj0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJFVkVSU0UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoX2RpcmVjdGlvbiA+PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJBU1RFUkVEKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIGFuIHtAbGluayBBbmltYXRpb25TdHJ1Y3R1cmV9IGFuZCByZXR1cm5zIGEge0BsaW5rIE11dGF0b3J9IGRlc2NyaWJpbmcgdGhlIHN0YXRlIGF0IHRoZSBnaXZlbiB0aW1lXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhdmVyc2VTdHJ1Y3R1cmVGb3JNdXRhdG9yKF9zdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSwgX3RpbWU6IG51bWJlcik6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbmV3TXV0YXRvcjogTXV0YXRvciA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zdHJ1Y3R1cmUpIHtcclxuICAgICAgICBpZiAoX3N0cnVjdHVyZVtuXSBpbnN0YW5jZW9mIEFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBuZXdNdXRhdG9yW25dID0gKDxBbmltYXRpb25TZXF1ZW5jZT5fc3RydWN0dXJlW25dKS5ldmFsdWF0ZShfdGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ld011dGF0b3Jbbl0gPSB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yTXV0YXRvcig8QW5pbWF0aW9uU3RydWN0dXJlPl9zdHJ1Y3R1cmVbbl0sIF90aW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBuZXdNdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhdmVyc2VzIHRoZSBjdXJyZW50IEFuaW1hdGlvblN0cmN1dHVyZSB0byBmaW5kIHRoZSB0b3RhbFRpbWUgb2YgdGhpcyBhbmltYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gX3N0cnVjdHVyZSBUaGUgc3RydWN0dXJlIHRvIHRyYXZlcnNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhdmVyc2VTdHJ1Y3R1cmVGb3JUaW1lKF9zdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBuIGluIF9zdHJ1Y3R1cmUpIHtcclxuICAgICAgICBpZiAoX3N0cnVjdHVyZVtuXSBpbnN0YW5jZW9mIEFuaW1hdGlvblNlcXVlbmNlKSB7XHJcbiAgICAgICAgICBsZXQgc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlID0gPEFuaW1hdGlvblNlcXVlbmNlPl9zdHJ1Y3R1cmVbbl07XHJcbiAgICAgICAgICBpZiAoc2VxdWVuY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgc2VxdWVuY2VUaW1lOiBudW1iZXIgPSBzZXF1ZW5jZS5nZXRLZXkoc2VxdWVuY2UubGVuZ3RoIC0gMSkudGltZTtcclxuICAgICAgICAgICAgdGhpcy50b3RhbFRpbWUgPSBNYXRoLm1heChzZXF1ZW5jZVRpbWUsIHRoaXMudG90YWxUaW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvclRpbWUoPEFuaW1hdGlvblN0cnVjdHVyZT5fc3RydWN0dXJlW25dKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgdGhlIGV4aXN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIHtAbGluayBBbmltYXRpb25TdHJjdXR1cmV9IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIF90eXBlIHRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3R1cmUgdG8gZ2V0XHJcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVxdWVzdGVkIFtbQGxpbmsgQW5pbWF0aW9uU3RydWN0dXJlXV1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRBbmltYXRpb25TdHJ1Y3R1cmUoX3R5cGU6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRSk6IEFuaW1hdGlvblN0cnVjdHVyZSB7XHJcbiAgICAgIGlmICghdGhpcy4jYW5pbWF0aW9uU3RydWN0dXJlc1Byb2Nlc3NlZC5oYXMoX3R5cGUpKSB7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbFRpbWUoKTtcclxuICAgICAgICBsZXQgYWU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICAgIHN3aXRjaCAoX3R5cGUpIHtcclxuICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLk5PUk1BTDpcclxuICAgICAgICAgICAgYWUgPSB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SRVZFUlNFOlxyXG4gICAgICAgICAgICBhZSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JOZXdTdHJ1Y3R1cmUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUsIHRoaXMuY2FsY3VsYXRlUmV2ZXJzZVNlcXVlbmNlLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUUlVDVFVSRV9UWVBFLlJBU1RFUkVEOlxyXG4gICAgICAgICAgICBhZSA9IHRoaXMudHJhdmVyc2VTdHJ1Y3R1cmVGb3JOZXdTdHJ1Y3R1cmUodGhpcy5hbmltYXRpb25TdHJ1Y3R1cmUsIHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRTZXF1ZW5jZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRFJFVkVSU0U6XHJcbiAgICAgICAgICAgIGFlID0gdGhpcy50cmF2ZXJzZVN0cnVjdHVyZUZvck5ld1N0cnVjdHVyZSh0aGlzLmdldFByb2Nlc3NlZEFuaW1hdGlvblN0cnVjdHVyZShBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRSksIHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRTZXF1ZW5jZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuI2FuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQuc2V0KF90eXBlLCBhZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2FuaW1hdGlvblN0cnVjdHVyZXNQcm9jZXNzZWQuZ2V0KF90eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgdGhlIGV4aXN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIHtAbGluayBBbmltYXRpb25FdmVudFRyaWdnZXJ9IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIF90eXBlIFRoZSB0eXBlIG9mIEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB0byBnZXRcclxuICAgICAqIEByZXR1cm5zIHRoZSByZXF1ZXN0ZWQge0BsaW5rIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcn1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRFdmVudFRyaWdnZXIoX3R5cGU6IEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRSk6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGlmICghdGhpcy5ldmVudHNQcm9jZXNzZWQuaGFzKF90eXBlKSkge1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICAgICAgbGV0IGV2OiBBbmltYXRpb25FdmVudFRyaWdnZXIgPSB7fTtcclxuICAgICAgICBzd2l0Y2ggKF90eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5OT1JNQUw6XHJcbiAgICAgICAgICAgIGV2ID0gdGhpcy5ldmVudHM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkVWRVJTRTpcclxuICAgICAgICAgICAgZXYgPSB0aGlzLmNhbGN1bGF0ZVJldmVyc2VFdmVudFRyaWdnZXJzKHRoaXMuZXZlbnRzKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SQVNURVJFRDpcclxuICAgICAgICAgICAgZXYgPSB0aGlzLmNhbGN1bGF0ZVJhc3RlcmVkRXZlbnRUcmlnZ2Vycyh0aGlzLmV2ZW50cyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RSVUNUVVJFX1RZUEUuUkFTVEVSRURSRVZFUlNFOlxyXG4gICAgICAgICAgICBldiA9IHRoaXMuY2FsY3VsYXRlUmFzdGVyZWRFdmVudFRyaWdnZXJzKHRoaXMuZ2V0UHJvY2Vzc2VkRXZlbnRUcmlnZ2VyKEFOSU1BVElPTl9TVFJVQ1RVUkVfVFlQRS5SRVZFUlNFKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50c1Byb2Nlc3NlZC5zZXQoX3R5cGUsIGV2KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5ldmVudHNQcm9jZXNzZWQuZ2V0KF90eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYXZlcnNlcyBhbiBleGlzdGluZyBzdHJ1Y3R1cmUgdG8gYXBwbHkgYSByZWNhbGN1bGF0aW9uIGZ1bmN0aW9uIHRvIHRoZSBBbmltYXRpb25TdHJ1Y3R1cmUgdG8gc3RvcmUgaW4gYSBuZXcgU3RydWN0dXJlLlxyXG4gICAgICogQHBhcmFtIF9vbGRTdHJ1Y3R1cmUgVGhlIG9sZCBzdHJ1Y3R1cmUgdG8gdHJhdmVyc2VcclxuICAgICAqIEBwYXJhbSBfZnVuY3Rpb25Ub1VzZSBUaGUgZnVuY3Rpb24gdG8gdXNlIHRvIHJlY2FsY3VsYXRlZCB0aGUgc3RydWN0dXJlLlxyXG4gICAgICogQHJldHVybnMgQSBuZXcgQW5pbWF0aW9uIFN0cnVjdHVyZSB3aXRoIHRoZSByZWNhbHVsYXRlZCBBbmltYXRpb24gU2VxdWVuY2VzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyYXZlcnNlU3RydWN0dXJlRm9yTmV3U3RydWN0dXJlKF9vbGRTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSwgX2Z1bmN0aW9uVG9Vc2U6IEZ1bmN0aW9uKTogQW5pbWF0aW9uU3RydWN0dXJlIHtcclxuICAgICAgbGV0IG5ld1N0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge307XHJcbiAgICAgIGZvciAobGV0IG4gaW4gX29sZFN0cnVjdHVyZSkge1xyXG4gICAgICAgIGlmIChfb2xkU3RydWN0dXJlW25dIGluc3RhbmNlb2YgQW5pbWF0aW9uU2VxdWVuY2UpIHtcclxuICAgICAgICAgIG5ld1N0cnVjdHVyZVtuXSA9IF9mdW5jdGlvblRvVXNlKF9vbGRTdHJ1Y3R1cmVbbl0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXdTdHJ1Y3R1cmVbbl0gPSB0aGlzLnRyYXZlcnNlU3RydWN0dXJlRm9yTmV3U3RydWN0dXJlKDxBbmltYXRpb25TdHJ1Y3R1cmU+X29sZFN0cnVjdHVyZVtuXSwgX2Z1bmN0aW9uVG9Vc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3U3RydWN0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHJldmVyc2VkIEFuaW1hdGlvbiBTZXF1ZW5jZSBvdXQgb2YgYSBnaXZlbiBTZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfc2VxdWVuY2UgVGhlIHNlcXVlbmNlIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IHNlcXVlbmNlIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgVGhlIHJldmVyc2VkIFNlcXVlbmNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUmV2ZXJzZVNlcXVlbmNlKF9zZXF1ZW5jZTogQW5pbWF0aW9uU2VxdWVuY2UpOiBBbmltYXRpb25TZXF1ZW5jZSB7XHJcbiAgICAgIGxldCBzZXE6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfc2VxdWVuY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgb2xkS2V5OiBBbmltYXRpb25LZXkgPSBfc2VxdWVuY2UuZ2V0S2V5KGkpO1xyXG4gICAgICAgIGxldCBrZXk6IEFuaW1hdGlvbktleSA9IG5ldyBBbmltYXRpb25LZXkodGhpcy50b3RhbFRpbWUgLSBvbGRLZXkudGltZSwgb2xkS2V5LnZhbHVlLCBvbGRLZXkuaW50ZXJwb2xhdGlvbiwgb2xkS2V5LnNsb3BlT3V0LCBvbGRLZXkuc2xvcGVJbik7XHJcbiAgICAgICAgc2VxLmFkZEtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgcmFzdGVyZWQge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfSBvdXQgb2YgYSBnaXZlbiBzZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfc2VxdWVuY2UgVGhlIHNlcXVlbmNlIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IHNlcXVlbmNlIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgdGhlIHJhc3RlcmVkIHNlcXVlbmNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJhc3RlcmVkU2VxdWVuY2UoX3NlcXVlbmNlOiBBbmltYXRpb25TZXF1ZW5jZSk6IEFuaW1hdGlvblNlcXVlbmNlIHtcclxuICAgICAgbGV0IHNlcTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgbGV0IGZyYW1lVGltZTogbnVtYmVyID0gMTAwMCAvIHRoaXMuZnJhbWVzUGVyU2Vjb25kO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy50b3RhbFRpbWU7IGkgKz0gZnJhbWVUaW1lKSB7XHJcbiAgICAgICAgbGV0IGtleTogQW5pbWF0aW9uS2V5ID0gbmV3IEFuaW1hdGlvbktleShpLCBfc2VxdWVuY2UuZXZhbHVhdGUoaSksIEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkNPTlNUQU5ULCAwLCAwKTtcclxuICAgICAgICBzZXEuYWRkS2V5KGtleSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHNlcTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmV2ZXJzZWQge0BsaW5rIEFuaW1hdGlvbkV2ZW50VHJpZ2dlcn0gb2JqZWN0IGJhc2VkIG9uIHRoZSBnaXZlbiBvbmUuICBcclxuICAgICAqIEBwYXJhbSBfZXZlbnRzIHRoZSBldmVudCBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSBuZXcgb25lIG91dCBvZlxyXG4gICAgICogQHJldHVybnMgdGhlIHJldmVyc2VkIGV2ZW50IG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJldmVyc2VFdmVudFRyaWdnZXJzKF9ldmVudHM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlcik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGxldCBhZTogQW5pbWF0aW9uRXZlbnRUcmlnZ2VyID0ge307XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gX2V2ZW50cykge1xyXG4gICAgICAgIGFlW25hbWVdID0gdGhpcy50b3RhbFRpbWUgLSBfZXZlbnRzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSByYXN0ZXJlZCB7QGxpbmsgQW5pbWF0aW9uRXZlbnRUcmlnZ2VyfSBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIG9uZS4gIFxyXG4gICAgICogQHBhcmFtIF9ldmVudHMgdGhlIGV2ZW50IG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIG5ldyBvbmUgb3V0IG9mXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgcmFzdGVyZWQgZXZlbnQgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUmFzdGVyZWRFdmVudFRyaWdnZXJzKF9ldmVudHM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlcik6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciB7XHJcbiAgICAgIGxldCBhZTogQW5pbWF0aW9uRXZlbnRUcmlnZ2VyID0ge307XHJcbiAgICAgIGxldCBmcmFtZVRpbWU6IG51bWJlciA9IDEwMDAgLyB0aGlzLmZyYW1lc1BlclNlY29uZDtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBfZXZlbnRzKSB7XHJcbiAgICAgICAgYWVbbmFtZV0gPSBfZXZlbnRzW25hbWVdIC0gKF9ldmVudHNbbmFtZV0gJSBmcmFtZVRpbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB3aGljaCBldmVudHMgbGF5IGJldHdlZW4gdHdvIGdpdmVuIHRpbWVzIGFuZCByZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgb25lcyB0aGF0IGRvLlxyXG4gICAgICogQHBhcmFtIF9ldmVudFRyaWdnZXJzIFRoZSBldmVudCBvYmplY3QgdG8gY2hlY2sgdGhlIGV2ZW50cyBpbnNpZGUgb2ZcclxuICAgICAqIEBwYXJhbSBfbWluIHRoZSBtaW5pbXVtIG9mIHRoZSByYW5nZSB0byBjaGVjayBiZXR3ZWVuIChpbmNsdXNpdmUpXHJcbiAgICAgKiBAcGFyYW0gX21heCB0aGUgbWF4aW11bSBvZiB0aGUgcmFuZ2UgdG8gY2hlY2sgYmV0d2VlbiAoZXhjbHVzaXZlKVxyXG4gICAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIG5hbWVzIG9mIHRoZSBldmVudHMgaW4gdGhlIGdpdmVuIHJhbmdlLiBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja0V2ZW50c0JldHdlZW4oX2V2ZW50VHJpZ2dlcnM6IEFuaW1hdGlvbkV2ZW50VHJpZ2dlciwgX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIpOiBzdHJpbmdbXSB7XHJcbiAgICAgIGxldCBldmVudHNUb1RyaWdnZXI6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gX2V2ZW50VHJpZ2dlcnMpIHtcclxuICAgICAgICBpZiAoX21pbiA8PSBfZXZlbnRUcmlnZ2Vyc1tuYW1lXSAmJiBfZXZlbnRUcmlnZ2Vyc1tuYW1lXSA8IF9tYXgpIHtcclxuICAgICAgICAgIGV2ZW50c1RvVHJpZ2dlci5wdXNoKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZXZlbnRzVG9UcmlnZ2VyO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyBiZXR3ZWVuIHtAbGluayBBbmltYXRpb25LZXl9cy5cclxuICAgKiBSZXByZXNlbnRlZCBpbnRlcm5hbGx5IGJ5IGEgY3ViaWMgZnVuY3Rpb24gKGBmKHgpID0gYXjCsyArIGJ4wrIgKyBjeCArIGRgKS4gXHJcbiAgICogT25seSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgd2hlbiB0aGUga2V5cyBjaGFuZ2UsIHNvIGF0IHJ1bnRpbWUgaXQgc2hvdWxkIG9ubHkgYmUgY2FsY3VsYXRlZCBvbmNlLlxyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQW5pbWF0aW9uRnVuY3Rpb24ge1xyXG4gICAgcHJpdmF0ZSBhOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBiOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBjOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBkOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBrZXlJbjogQW5pbWF0aW9uS2V5O1xyXG4gICAgcHJpdmF0ZSBrZXlPdXQ6IEFuaW1hdGlvbktleTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2tleUluOiBBbmltYXRpb25LZXksIF9rZXlPdXQ6IEFuaW1hdGlvbktleSA9IG51bGwpIHtcclxuICAgICAgdGhpcy5rZXlJbiA9IF9rZXlJbjtcclxuICAgICAgdGhpcy5rZXlPdXQgPSBfa2V5T3V0O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2V0S2V5SW4oX2tleUluOiBBbmltYXRpb25LZXkpIHtcclxuICAgICAgdGhpcy5rZXlJbiA9IF9rZXlJbjtcclxuICAgICAgdGhpcy5jYWxjdWxhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNldEtleU91dChfa2V5T3V0OiBBbmltYXRpb25LZXkpIHtcclxuICAgICAgdGhpcy5rZXlPdXQgPSBfa2V5T3V0O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHZhbHVlcyBvZiB0aGlzIGN1YmljIGZ1bmN0aW9uLiBgZih4KSA9IGF4wrMgKyBieMKyICsgY3ggKyBkYFxyXG4gICAgICogVXNlZCBieSBlZGl0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IHsgYTogbnVtYmVyOyBiOiBudW1iZXI7IGM6IG51bWJlcjsgZDogbnVtYmVyIH0ge1xyXG4gICAgICByZXR1cm4geyBhOiB0aGlzLmEsIGI6IHRoaXMuYiwgYzogdGhpcy5jLCBkOiB0aGlzLmQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBhdCB0aGUgZ2l2ZW4gdGltZS5cclxuICAgICAqIEBwYXJhbSBfdGltZSB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0byBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gaW4gbWlsbGlzZWNvbmRzLiBXaWxsIGJlIGNvcnJlY3RlZCBmb3Igb2Zmc2V0IGludGVybmFsbHkuXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIHRpbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGV2YWx1YXRlKF90aW1lOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICBfdGltZSAtPSB0aGlzLmtleUluLnRpbWU7XHJcbiAgICAgIGxldCB0aW1lMjogbnVtYmVyID0gX3RpbWUgKiBfdGltZTtcclxuICAgICAgbGV0IHRpbWUzOiBudW1iZXIgPSB0aW1lMiAqIF90aW1lO1xyXG4gICAgICByZXR1cm4gdGhpcy5hICogdGltZTMgKyB0aGlzLmIgKiB0aW1lMiArIHRoaXMuYyAqIF90aW1lICsgdGhpcy5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogKFJlLSlDYWxjdWxhdGVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjdWJpYyBmdW5jdGlvbi5cclxuICAgICAqIFNlZSBodHRwczovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzMxNzM0NjkvY2FsY3VsYXRlLWN1YmljLWVxdWF0aW9uLWZyb20tdHdvLXBvaW50cy1hbmQtdHdvLXNsb3Blcy12YXJpYWJseVxyXG4gICAgICogYW5kIGh0dHBzOi8vamlya2FkZWxsb3JvLmdpdGh1Yi5pby9GVURHRS9Eb2N1bWVudGF0aW9uL0xvZ3MvMTkwNDEwX05vdGl6ZW5fTFNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNhbGN1bGF0ZSgpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLmtleUluKSB7XHJcbiAgICAgICAgdGhpcy5kID0gdGhpcy5jID0gdGhpcy5iID0gdGhpcy5hID0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmtleU91dCB8fCB0aGlzLmtleUluLmludGVycG9sYXRpb24gPT0gQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04uQ09OU1RBTlQpIHtcclxuICAgICAgICB0aGlzLmQgPSB0aGlzLmtleUluLnZhbHVlO1xyXG4gICAgICAgIHRoaXMuYyA9IHRoaXMuYiA9IHRoaXMuYSA9IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgeDE6IG51bWJlciA9IHRoaXMua2V5T3V0LnRpbWUgLSB0aGlzLmtleUluLnRpbWU7XHJcblxyXG4gICAgICB0aGlzLmQgPSB0aGlzLmtleUluLnZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5rZXlJbi5pbnRlcnBvbGF0aW9uID09IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkxJTkVBUikge1xyXG4gICAgICAgIHRoaXMuYyA9ICh0aGlzLmtleU91dC52YWx1ZSAtIHRoaXMua2V5SW4udmFsdWUpIC8geDE7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmMgPSB0aGlzLmtleUluLnNsb3BlT3V0O1xyXG4gICAgICB0aGlzLmEgPSAoLXgxICogKHRoaXMua2V5SW4uc2xvcGVPdXQgKyB0aGlzLmtleU91dC5zbG9wZUluKSAtIDIgKiB0aGlzLmtleUluLnZhbHVlICsgMiAqIHRoaXMua2V5T3V0LnZhbHVlKSAvIC1NYXRoLnBvdyh4MSwgMyk7XHJcbiAgICAgIHRoaXMuYiA9ICh0aGlzLmtleU91dC5zbG9wZUluIC0gdGhpcy5rZXlJbi5zbG9wZU91dCAtIDMgKiB0aGlzLmEgKiBNYXRoLnBvdyh4MSwgMikpIC8gKDIgKiB4MSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQW4ge0BsaW5rIEFuaW1hdGlvbn0gbG9hZGVkIGZyb20gYSBnbFRGLUZpbGUuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBBbmltYXRpb25HTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKEFuaW1hdGlvbikge1xyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8gPSB0aGlzLnVybCwgX25hbWU6IHN0cmluZyA9IHRoaXMubmFtZSk6IFByb21pc2U8QW5pbWF0aW9uR0xURj4ge1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICByZXR1cm4gR0xURkxvYWRlci5sb2FkUmVzb3VyY2UodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmZyYW1lc1BlclNlY29uZCA9IHRoaXMuZnBzO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBcclxuICBleHBvcnQgZW51bSBBTklNQVRJT05fSU5URVJQT0xBVElPTiB7XHJcbiAgICBDT05TVEFOVCxcclxuICAgIExJTkVBUixcclxuICAgIENVQklDXHJcbiAgfVxyXG4gIC8vIHR5cGUgQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiA9IFwiY29uc3RhbnRcIiB8IFwibGluZWFyXCIgfCBcImN1YmljXCI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGNvbnRpbm91cyBwb2ludHMgaW4gdGltZSB0aGVpciBhY2NvbXBhbnlpbmcgdmFsdWVzIGFzIHdlbGwgYXMgdGhlaXIgc2xvcGVzLiBcclxuICAgKiBBbHNvIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgQW5pbWF0aW9uRnVuY3Rpb259cyB0aGF0IGNvbWUgaW4gYW5kIG91dCBvZiB0aGUgc2lkZXMuIFxyXG4gICAqIFRoZSB7QGxpbmsgQW5pbWF0aW9uRnVuY3Rpb259cyBhcmUgaGFuZGxlZCBieSB0aGUge0BsaW5rIEFuaW1hdGlvblNlcXVlbmNlfXMuXHJcbiAgICogSWYgdGhlIHByb3BlcnR5IGNvbnN0YW50IGlzIHRydWUsIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgYW5kIHdpbCBub3QgYmUgaW50ZXJwb2xhdGVkIGJldHdlZW4gdGhpcyBhbmQgdGhlIG5leHQga2V5IGluIGEgc2VxdWVuY2VcclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEFuaW1hdGlvbktleSBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgLy8gVE9ETzogY2hlY2sgaWYgZnVuY3Rpb25JbiBjYW4gYmUgcmVtb3ZlZFxyXG4gICAgLyoqRG9uJ3QgbW9kaWZ5IHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiovXHJcbiAgICBwdWJsaWMgZnVuY3Rpb25JbjogQW5pbWF0aW9uRnVuY3Rpb247XHJcbiAgICAvKipEb24ndCBtb2RpZnkgdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuKi9cclxuICAgIHB1YmxpYyBmdW5jdGlvbk91dDogQW5pbWF0aW9uRnVuY3Rpb247XHJcblxyXG4gICAgI3RpbWU6IG51bWJlcjtcclxuICAgICN2YWx1ZTogbnVtYmVyO1xyXG4gICAgI2ludGVycG9sYXRpb246IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OO1xyXG5cclxuICAgICNzbG9wZUluOiBudW1iZXIgPSAwO1xyXG4gICAgI3Nsb3BlT3V0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGltZTogbnVtYmVyID0gMCwgX3ZhbHVlOiBudW1iZXIgPSAwLCBfaW50ZXJwb2xhdGlvbjogQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04gPSBBTklNQVRJT05fSU5URVJQT0xBVElPTi5DVUJJQywgX3Nsb3BlSW46IG51bWJlciA9IDAsIF9zbG9wZU91dDogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLiN0aW1lID0gX3RpbWU7XHJcbiAgICAgIHRoaXMuI3ZhbHVlID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLiNpbnRlcnBvbGF0aW9uID0gX2ludGVycG9sYXRpb247XHJcbiAgICAgIHRoaXMuI3Nsb3BlSW4gPSBfc2xvcGVJbjtcclxuICAgICAgdGhpcy4jc2xvcGVPdXQgPSBfc2xvcGVPdXQ7XHJcblxyXG4gICAgICB0aGlzLmZ1bmN0aW9uT3V0ID0gbmV3IEFuaW1hdGlvbkZ1bmN0aW9uKHRoaXMsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhdGljIGNvbXBhcmF0aW9uIGZ1bmN0aW9uIHRvIHVzZSBpbiBhbiBhcnJheSBzb3J0IGZ1bmN0aW9uIHRvIHNvcnQgdGhlIGtleXMgYnkgdGhlaXIgdGltZS5cclxuICAgICAqIEBwYXJhbSBfYSB0aGUgYW5pbWF0aW9uIGtleSB0byBjaGVja1xyXG4gICAgICogQHBhcmFtIF9iIHRoZSBhbmltYXRpb24ga2V5IHRvIGNoZWNrIGFnYWluc3RcclxuICAgICAqIEByZXR1cm5zID4wIGlmIGE+YiwgMCBpZiBhPWIsIDwwIGlmIGE8YlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmUoX2E6IEFuaW1hdGlvbktleSwgX2I6IEFuaW1hdGlvbktleSk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBfYS50aW1lIC0gX2IudGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0aW1lKF90aW1lOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jdGltZSA9IF90aW1lO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICAgIHRoaXMuZnVuY3Rpb25PdXQuY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB2YWx1ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiN2YWx1ZSA9IF92YWx1ZTtcclxuICAgICAgdGhpcy5mdW5jdGlvbkluLmNhbGN1bGF0ZSgpO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uT3V0LmNhbGN1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaW50ZXJwb2xhdGlvbigpOiBBTklNQVRJT05fSU5URVJQT0xBVElPTiB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNpbnRlcnBvbGF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgaW50ZXJwb2xhdGlvbihfaW50ZXJwb2xhdGlvbjogQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04pIHtcclxuICAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IF9pbnRlcnBvbGF0aW9uO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICAgIHRoaXMuZnVuY3Rpb25PdXQuY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzbG9wZUluKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzbG9wZUluO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2xvcGVJbihfc2xvcGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzbG9wZUluID0gX3Nsb3BlO1xyXG4gICAgICB0aGlzLmZ1bmN0aW9uSW4uY2FsY3VsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzbG9wZU91dCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2xvcGVPdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzbG9wZU91dChfc2xvcGU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzbG9wZU91dCA9IF9zbG9wZTtcclxuICAgICAgdGhpcy5mdW5jdGlvbk91dC5jYWxjdWxhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge307XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udGltZSA9IHRoaXMuI3RpbWU7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udmFsdWUgPSB0aGlzLiN2YWx1ZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pbnRlcnBvbGF0aW9uID0gdGhpcy4jaW50ZXJwb2xhdGlvbjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zbG9wZUluID0gdGhpcy4jc2xvcGVJbjtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zbG9wZU91dCA9IHRoaXMuI3Nsb3BlT3V0O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLiN0aW1lID0gX3NlcmlhbGl6YXRpb24udGltZTtcclxuICAgICAgdGhpcy4jdmFsdWUgPSBfc2VyaWFsaXphdGlvbi52YWx1ZTtcclxuICAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IF9zZXJpYWxpemF0aW9uLmludGVycG9sYXRpb247XHJcbiAgICAgIHRoaXMuI3Nsb3BlSW4gPSBfc2VyaWFsaXphdGlvbi5zbG9wZUluO1xyXG4gICAgICB0aGlzLiNzbG9wZU91dCA9IF9zZXJpYWxpemF0aW9uLnNsb3BlT3V0O1xyXG4gICAgICAvLyBpZiAoX3NlcmlhbGl6YXRpb24uaW50ZXJwb2xhdGlvbiA9PSB1bmRlZmluZWQpXHJcbiAgICAgIC8vICAgaWYgKF9zZXJpYWxpemF0aW9uLmNvbnN0YW50KSAvLyBUT0RPOiByZW1vdmUgdGhpcyB3aGVuIGNvbnN0YW50IGlzIHJlbW92ZWRcclxuICAgICAgLy8gICAgIHRoaXMuI2ludGVycG9sYXRpb24gPSBcImNvbnN0YW50XCI7XHJcbiAgICAgIC8vICAgZWxzZVxyXG4gICAgICAvLyAgICAgdGhpcy4jaW50ZXJwb2xhdGlvbiA9IFwiY3ViaWNcIjtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICAvL1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBzZXF1ZW5jZSBvZiB7QGxpbmsgQW5pbWF0aW9uS2V5fXMgdGhhdCBpcyBtYXBwZWQgdG8gYW4gYXR0cmlidXRlIG9mIGEge0BsaW5rIE5vZGV9IG9yIGl0cyB7QGxpbmsgQ29tcG9uZW50fXMgaW5zaWRlIHRoZSB7QGxpbmsgQW5pbWF0aW9ufS5cclxuICAgKiBQcm92aWRlcyBmdW5jdGlvbnMgdG8gbW9kaWZ5IHNhaWQga2V5c1xyXG4gICAqIEBhdXRob3JzIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5IHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcXVlbmNlIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7XHJcbiAgICBwcml2YXRlIGtleXM6IEFuaW1hdGlvbktleVtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihfa2V5czogQW5pbWF0aW9uS2V5W10gPSBbXSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmtleXMgPSBfa2V5cztcclxuICAgICAgdGhpcy5yZWdlbmVyYXRlRnVuY3Rpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMua2V5cy5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmFsdWF0ZXMgdGhlIHNlcXVlbmNlIGF0IHRoZSBnaXZlbiBwb2ludCBpbiB0aW1lLlxyXG4gICAgICogQHBhcmFtIF90aW1lIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBzZXF1ZW5jZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNlcXVlbmNlIGF0IHRoZSBnaXZlbiB0aW1lLiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGtleXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBldmFsdWF0ZShfdGltZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgaWYgKHRoaXMua2V5cy5sZW5ndGggPT0gMClcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvL1RPRE86IHNob3VsZG4ndCByZXR1cm4gMCBidXQgc29tZXRoaW5nIGluZGljYXRpbmcgbm8gY2hhbmdlLCBsaWtlIG51bGwuIHByb2JhYmx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgaW4gTm9kZSBhcyB3ZWxsIHRvIGlnbm9yZSBub24tbnVtZXJpYyB2YWx1ZXMgaW4gdGhlIGFwcGx5QW5pbWF0aW9uIGZ1bmN0aW9uXHJcbiAgICAgIGlmICh0aGlzLmtleXMubGVuZ3RoID09IDEgfHwgdGhpcy5rZXlzWzBdLnRpbWUgPj0gX3RpbWUpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5c1swXS52YWx1ZTtcclxuXHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmtleXNbaV0udGltZSA8PSBfdGltZSAmJiBfdGltZSA8IHRoaXMua2V5c1tpICsgMV0udGltZSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMua2V5c1tpXS5mdW5jdGlvbk91dC5ldmFsdWF0ZShfdGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmICh0aGlzLmtleXNbaV0udGltZSA9PSBfdGltZSlcclxuICAgICAgICAvLyAgIHJldHVybiB0aGlzLmtleXNbaV0udmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMua2V5c1t0aGlzLmtleXMubGVuZ3RoIC0gMV0udmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGtleSB0byB0aGUgc2VxdWVuY2UuXHJcbiAgICAgKiBAcGFyYW0gX2tleSB0aGUga2V5IHRvIGFkZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkS2V5KF9rZXk6IEFuaW1hdGlvbktleSk6IHZvaWQge1xyXG4gICAgICB0aGlzLmtleXMucHVzaChfa2V5KTtcclxuICAgICAgdGhpcy5rZXlzLnNvcnQoQW5pbWF0aW9uS2V5LmNvbXBhcmUpO1xyXG4gICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vZGlmeXMgYSBnaXZlbiBrZXkgaW4gdGhlIHNlcXVlbmNlLlxyXG4gICAgICogQHBhcmFtIF9rZXkgdGhlIGtleSB0byBhZGRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vZGlmeUtleShfa2V5OiBBbmltYXRpb25LZXksIF90aW1lPzogbnVtYmVyLCBfdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgaWYgKF90aW1lICE9IG51bGwpXHJcbiAgICAgICAgX2tleS50aW1lID0gX3RpbWU7XHJcbiAgICAgIGlmIChfdmFsdWUgIT0gbnVsbClcclxuICAgICAgICBfa2V5LnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLmtleXMuc29ydChBbmltYXRpb25LZXkuY29tcGFyZSk7XHJcbiAgICAgIHRoaXMucmVnZW5lcmF0ZUZ1bmN0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGdpdmVuIGtleSBmcm9tIHRoZSBzZXF1ZW5jZS5cclxuICAgICAqIEBwYXJhbSBfa2V5IHRoZSBrZXkgdG8gcmVtb3ZlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVLZXkoX2tleTogQW5pbWF0aW9uS2V5KTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5rZXlzW2ldID09IF9rZXkpIHtcclxuICAgICAgICAgIHRoaXMua2V5cy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgYSBrZXkgaW4gdGhlIHNlcXVlbmNlIGV4YWN0bHkgbWF0Y2hpbmcgdGhlIGdpdmVuIHRpbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5kS2V5KF90aW1lOiBudW1iZXIpOiBBbmltYXRpb25LZXkge1xyXG4gICAgICBmb3IgKGxldCBrZXkgb2YgdGhpcy5rZXlzKVxyXG4gICAgICAgIGlmIChrZXkudGltZSA9PSBfdGltZSlcclxuICAgICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgQW5pbWF0aW9uIEtleSBhdCB0aGUgZ2l2ZW4gaW5kZXggZnJvbSB0aGUga2V5cy5cclxuICAgICAqIEBwYXJhbSBfaW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggYXQgd2hpY2ggdG8gcmVtb3ZlIHRoZSBrZXlcclxuICAgICAqIEByZXR1cm5zIHRoZSByZW1vdmVkIEFuaW1hdGlvbktleSBpZiBzdWNjZXNzZnVsLCBudWxsIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUtleUF0SW5kZXgoX2luZGV4OiBudW1iZXIpOiBBbmltYXRpb25LZXkge1xyXG4gICAgICBpZiAoX2luZGV4IDwgMCB8fCBfaW5kZXggPj0gdGhpcy5rZXlzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhazogQW5pbWF0aW9uS2V5ID0gdGhpcy5rZXlzW19pbmRleF07XHJcbiAgICAgIHRoaXMua2V5cy5zcGxpY2UoX2luZGV4LCAxKTtcclxuICAgICAgdGhpcy5yZWdlbmVyYXRlRnVuY3Rpb25zKCk7XHJcbiAgICAgIHJldHVybiBhaztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSBrZXkgZnJvbSB0aGUgc2VxdWVuY2UgYXQgdGhlIGRlc2lyZWQgaW5kZXguXHJcbiAgICAgKiBAcGFyYW0gX2luZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IGF0IHdoaWNoIHRvIGdldCB0aGUga2V5XHJcbiAgICAgKiBAcmV0dXJucyB0aGUgQW5pbWF0aW9uS2V5IGF0IHRoZSBpbmRleCBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0S2V5KF9pbmRleDogbnVtYmVyKTogQW5pbWF0aW9uS2V5IHtcclxuICAgICAgaWYgKF9pbmRleCA8IDAgfHwgX2luZGV4ID49IHRoaXMua2V5cy5sZW5ndGgpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIHJldHVybiB0aGlzLmtleXNbX2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhpcyBzZXF1ZW5jZSdzIGtleXMuIFRoaXMgaXMgbm90IGEgY29weSwgYnV0IHRoZSBhY3R1YWwgYXJyYXkgdXNlZCBpbnRlcm5hbGx5LiBIYW5kbGUgd2l0aCBjYXJlIVxyXG4gICAgICogVXNlZCBieSBFZGl0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXlzKCk6IEFuaW1hdGlvbktleVtdIHtcclxuICAgICAgcmV0dXJuIHRoaXMua2V5cztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGtleXM6IFtdLFxyXG4gICAgICAgIGFuaW1hdGlvblNlcXVlbmNlOiB0cnVlXHJcbiAgICAgIH07XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzLmtleXNbaV0gPSB0aGlzLmtleXNbaV0uc2VyaWFsaXplKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IF9zZXJpYWxpemF0aW9uLmtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyB0aGlzLmtleXMucHVzaCg8QW5pbWF0aW9uS2V5PlNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ua2V5c1tpXSkpO1xyXG4gICAgICAgIGxldCBrOiBBbmltYXRpb25LZXkgPSBuZXcgQW5pbWF0aW9uS2V5KCk7XHJcbiAgICAgICAgYXdhaXQgay5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5rZXlzW2ldKTtcclxuICAgICAgICB0aGlzLmtleXNbaV0gPSBrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJlZ2VuZXJhdGVGdW5jdGlvbnMoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgeyAvKiAqLyB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdGhhdCAocmUtKWdlbmVyYXRlcyBhbGwgZnVuY3Rpb25zIGluIHRoZSBzZXF1ZW5jZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWdlbmVyYXRlRnVuY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGY6IEFuaW1hdGlvbkZ1bmN0aW9uID0gbmV3IEFuaW1hdGlvbkZ1bmN0aW9uKHRoaXMua2V5c1tpXSk7XHJcbiAgICAgICAgdGhpcy5rZXlzW2ldLmZ1bmN0aW9uT3V0ID0gZjtcclxuICAgICAgICBpZiAoaSA9PSB0aGlzLmtleXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgLy9UT0RPOiBjaGVjayBpZiB0aGlzIGlzIGV2ZW4gdXNlZnVsLiBNYXliZSB1cGRhdGUgdGhlIHJ1bmNvbmRpdGlvbiB0byBsZW5ndGggLSAxIGluc3RlYWQuIE1pZ2h0IGJlIHJlZHVuZGFudCBpZiBmdW5jdGlvbkluIGlzIHJlbW92ZWQsIHNlZSBUT0RPIGluIEFuaW1hdGlvbktleS5cclxuICAgICAgICAgIGYuc2V0S2V5T3V0ID0gdGhpcy5rZXlzWzBdO1xyXG4gICAgICAgICAgdGhpcy5rZXlzWzBdLmZ1bmN0aW9uSW4gPSBmO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGYuc2V0S2V5T3V0ID0gdGhpcy5rZXlzW2kgKyAxXTtcclxuICAgICAgICB0aGlzLmtleXNbaSArIDFdLmZ1bmN0aW9uSW4gPSBmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNwcml0ZSBleHRlbmRzIEFuaW1hdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQW5pbWF0aW9uLnJlZ2lzdGVyU3ViY2xhc3MoQW5pbWF0aW9uU3ByaXRlKTtcclxuICAgIHB1YmxpYyB0ZXh0dXJlOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQuY29sb3I7XHJcbiAgICBwcml2YXRlIGlkVGV4dHVyZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBmcmFtZXM6IG51bWJlciA9IDI1O1xyXG4gICAgcHJpdmF0ZSB3cmFwQWZ0ZXI6IG51bWJlciA9IDU7XHJcbiAgICBwcml2YXRlIHN0YXJ0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMCwgMCk7XHJcbiAgICBwcml2YXRlIHNpemU6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMig4MCwgODApO1xyXG4gICAgcHJpdmF0ZSBuZXh0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoODAsIDApO1xyXG4gICAgcHJpdmF0ZSB3cmFwOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMCwgODApO1xyXG5cclxuICAgIC8vIFRPRE86IGZwcyBzaG91bGQgYmUgYSBwYXJhbWV0ZXIgdG9vXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiQW5pbWF0aW9uU3ByaXRlXCIpIHsgLy99LCBfZnBzOiBudW1iZXIgPSAxNSkge1xyXG4gICAgICBzdXBlcihfbmFtZSwge30sIDEpO1xyXG4gICAgICB0aGlzLmZyYW1lc1BlclNlY29uZCA9IHRoaXMuZnJhbWVzO1xyXG4gICAgICB0aGlzLmNyZWF0ZSh0aGlzLnRleHR1cmUsIHRoaXMuZnJhbWVzLCB0aGlzLndyYXBBZnRlciwgdGhpcy5zdGFydCwgdGhpcy5zaXplLCB0aGlzLm5leHQsIHRoaXMud3JhcCwgdGhpcy5mcmFtZXNQZXJTZWNvbmQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGV4dHVyZSB0byBiZSB1c2VkIGFzIHRoZSBzcHJpdGVzaGVldFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0VGV4dHVyZShfdGV4dHVyZTogVGV4dHVyZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnRleHR1cmUgPSBfdGV4dHVyZTtcclxuICAgICAgdGhpcy5pZFRleHR1cmUgPSBfdGV4dHVyZS5pZFJlc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGlzIGFuaW1hdGlvbiBzcHJpdGUgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGUoX3RleHR1cmU6IFRleHR1cmUsIF9mcmFtZXM6IG51bWJlciwgX3dyYXBBZnRlcjogbnVtYmVyLCBfc3RhcnQ6IFZlY3RvcjIsIF9zaXplOiBWZWN0b3IyLCBfbmV4dDogVmVjdG9yMiwgX3dyYXA6IFZlY3RvcjIsIF9mcmFtZXNQZXJTZWNvbmQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldFRleHR1cmUoX3RleHR1cmUpO1xyXG4gICAgICB0aGlzLmZyYW1lcyA9IF9mcmFtZXM7XHJcbiAgICAgIHRoaXMud3JhcEFmdGVyID0gX3dyYXBBZnRlcjtcclxuICAgICAgdGhpcy5zdGFydCA9IF9zdGFydDtcclxuICAgICAgdGhpcy5zaXplID0gX3NpemU7XHJcbiAgICAgIHRoaXMubmV4dCA9IF9uZXh0O1xyXG4gICAgICB0aGlzLndyYXAgPSBfd3JhcDtcclxuICAgICAgdGhpcy5mcmFtZXNQZXJTZWNvbmQgPSBfZnJhbWVzUGVyU2Vjb25kO1xyXG5cclxuICAgICAgbGV0IHNjYWxlOiBWZWN0b3IyID0gdGhpcy5nZXRTY2FsZSgpO1xyXG4gICAgICBsZXQgcG9zaXRpb25zOiBWZWN0b3IyW10gPSB0aGlzLmdldFBvc2l0aW9ucygpO1xyXG5cclxuICAgICAgbGV0IHhUcmFuc2xhdGlvbjogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgbGV0IHlUcmFuc2xhdGlvbjogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgbGV0IHhTY2FsZTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgbGV0IHlTY2FsZTogQW5pbWF0aW9uU2VxdWVuY2UgPSBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoKTtcclxuICAgICAgeFNjYWxlLmFkZEtleShuZXcgQW5pbWF0aW9uS2V5KDAsIHNjYWxlLngpKTtcclxuICAgICAgeVNjYWxlLmFkZEtleShuZXcgQW5pbWF0aW9uS2V5KDAsIHNjYWxlLnkpKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGZyYW1lOiBudW1iZXIgPSAwOyBmcmFtZSA8PSB0aGlzLmZyYW1lczsgZnJhbWUrKykge1xyXG4gICAgICAgIGxldCB0aW1lOiBudW1iZXIgPSAxMDAwICogZnJhbWUgLyB0aGlzLmZyYW1lc1BlclNlY29uZDtcclxuICAgICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjIgPSBwb3NpdGlvbnNbTWF0aC5taW4oZnJhbWUsIHRoaXMuZnJhbWVzIC0gMSldOyAvL3JlcGVhdCB0aGUgbGFzdCBrZXkgdG8gZ2l2ZSB0aGUgbGFzdCBmcmFtZSBzb21lIHRpbWVcclxuICAgICAgICB4VHJhbnNsYXRpb24uYWRkS2V5KG5ldyBBbmltYXRpb25LZXkodGltZSwgcG9zaXRpb24ueCAvIHRoaXMudGV4dHVyZS50ZXhJbWFnZVNvdXJjZS53aWR0aCkpOy8vLCAwLCAwLCB0cnVlKSlcclxuICAgICAgICB5VHJhbnNsYXRpb24uYWRkS2V5KG5ldyBBbmltYXRpb25LZXkodGltZSwgcG9zaXRpb24ueSAvIHRoaXMudGV4dHVyZS50ZXhJbWFnZVNvdXJjZS5oZWlnaHQpKTsvLywgMCwgMCwgdHJ1ZSkpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlID0ge1xyXG4gICAgICAgIFwiY29tcG9uZW50c1wiOiB7XHJcbiAgICAgICAgICBcIkNvbXBvbmVudE1hdGVyaWFsXCI6IFt7XHJcbiAgICAgICAgICAgIFwibXR4UGl2b3RcIjoge1xyXG4gICAgICAgICAgICAgIFwidHJhbnNsYXRpb25cIjoge1xyXG4gICAgICAgICAgICAgICAgeDogeFRyYW5zbGF0aW9uLFxyXG4gICAgICAgICAgICAgICAgeTogeVRyYW5zbGF0aW9uXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBcInNjYWxpbmdcIjoge1xyXG4gICAgICAgICAgICAgICAgeDogeFNjYWxlLFxyXG4gICAgICAgICAgICAgICAgeTogeVNjYWxlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzY2FsZSBvZiB0aGUgc3ByaXRlc2hlZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNjYWxlKCk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgdGhpcy5zaXplLnggLyB0aGlzLnRleHR1cmUudGV4SW1hZ2VTb3VyY2Uud2lkdGgsXHJcbiAgICAgICAgdGhpcy5zaXplLnkgLyB0aGlzLnRleHR1cmUudGV4SW1hZ2VTb3VyY2UuaGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbnMgb2YgdGhlIHNwcml0ZXNoZWV0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQb3NpdGlvbnMoKTogVmVjdG9yMltdIHtcclxuICAgICAgbGV0IGlOZXh0OiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgaVdyYXA6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBwb3NpdGlvbnM6IFZlY3RvcjJbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBmcmFtZTogbnVtYmVyID0gMDsgZnJhbWUgPCB0aGlzLmZyYW1lczsgZnJhbWUrKykge1xyXG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgdGhpcy5zdGFydC54ICsgaU5leHQgKiB0aGlzLm5leHQueCArIGlXcmFwICogdGhpcy53cmFwLngsXHJcbiAgICAgICAgICB0aGlzLnN0YXJ0LnkgKyBpTmV4dCAqIHRoaXMubmV4dC55ICsgaVdyYXAgKiB0aGlzLndyYXAueVxyXG4gICAgICAgICkpO1xyXG5cclxuICAgICAgICBpTmV4dCsrO1xyXG4gICAgICAgIGlmIChpTmV4dCA+PSB0aGlzLndyYXBBZnRlcikge1xyXG4gICAgICAgICAgaU5leHQgPSAwO1xyXG4gICAgICAgICAgaVdyYXArKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBvc2l0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gdHJhbnNmZXJcclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb24/OiBzdHJpbmdbXSwgX2Rpc3BhdGNoTXV0YXRlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMudGV4dHVyZSwgdGhpcy5mcmFtZXMsIHRoaXMud3JhcEFmdGVyLCB0aGlzLnN0YXJ0LCB0aGlzLnNpemUsIHRoaXMubmV4dCwgdGhpcy53cmFwLCB0aGlzLmZyYW1lc1BlclNlY29uZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pZFJlc291cmNlID0gdGhpcy5pZFJlc291cmNlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkVGV4dHVyZSA9IHRoaXMuaWRUZXh0dXJlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmZyYW1lcyA9IHRoaXMuZnJhbWVzO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLndyYXBBZnRlciA9IHRoaXMud3JhcEFmdGVyO1xyXG4gICAgICBmb3IgKGxldCBuYW1lIG9mIFtcInN0YXJ0XCIsIFwic2l6ZVwiLCBcIm5leHRcIiwgXCJ3cmFwXCJdKVxyXG4gICAgICAgIHNlcmlhbGl6YXRpb25bbmFtZV0gPSAoPFZlY3RvcjI+UmVmbGVjdC5nZXQodGhpcywgbmFtZSkpLnNlcmlhbGl6ZSgpO1xyXG5cclxuICAgICAgbGV0IGFuaW1hdGlvbnNTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IHt9OyAvLyBubyBuZWVkIHRvIHNlcmlhbGl6ZSBzdHJ1Y3R1cmVcclxuICAgICAgLy8gbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICB0aGlzLmFuaW1hdGlvblN0cnVjdHVyZSA9IGFuaW1hdGlvbnNTdHJ1Y3R1cmU7IC8vIHJlc3RvcmUgZXhpc3RlbnQgc3RydWN0dXJlXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfczogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgaWYgKF9zLmlkVGV4dHVyZSlcclxuICAgICAgICB0aGlzLnRleHR1cmUgPSA8VGV4dHVyZT5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKF9zLmlkVGV4dHVyZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC5jb2xvcjtcclxuXHJcbiAgICAgIGZvciAobGV0IG5hbWUgb2YgW1wic3RhcnRcIiwgXCJzaXplXCIsIFwibmV4dFwiLCBcIndyYXBcIl0pXHJcbiAgICAgICAgKDxWZWN0b3IyPlJlZmxlY3QuZ2V0KHRoaXMsIG5hbWUpKS5kZXNlcmlhbGl6ZShfc1tuYW1lXSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMudGV4dHVyZSwgX3MuZnJhbWVzLCBfcy53cmFwQWZ0ZXIsIHRoaXMuc3RhcnQsIHRoaXMuc2l6ZSwgdGhpcy5uZXh0LCB0aGlzLndyYXAsIHRoaXMuZnJhbWVzUGVyU2Vjb25kKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIHRoZSB7QGxpbmsgQW5pbWF0aW9uU3ByaXRlfSBpbnRvIGFuIHtAbGluayBBbmltYXRpb259XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb252ZXJ0VG9BbmltYXRpb24oKTogQW5pbWF0aW9uIHtcclxuICAgICAgbGV0IGFuaW1hdGlvbjogQW5pbWF0aW9uID0gbmV3IEFuaW1hdGlvbih0aGlzLm5hbWUsIHRoaXMuYW5pbWF0aW9uU3RydWN0dXJlLCB0aGlzLmZyYW1lc1BlclNlY29uZCk7XHJcbiAgICAgIHJldHVybiBhbmltYXRpb247XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRXh0ZW5zaW9uIG9mIEF1ZGlvQnVmZmVyIHdpdGggYSBsb2FkIG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBidWZmZXIgaW4gdGhlIHtAbGluayBBdWRpb01hbmFnZXJ9LmRlZmF1bHQgdG8gYmUgdXNlZCB3aXRoIHtAbGluayBDb21wb25lbnRBdWRpb31cclxuICAgKiBAYXV0aG9ycyBUaG9tYXMgRG9ybmVyLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBBdWRpbyBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGVSZXNvdXJjZSB7XHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJBdWRpb1wiO1xyXG4gICAgcHVibGljIGlkUmVzb3VyY2U6IHN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgIHB1YmxpYyBidWZmZXI6IEF1ZGlvQnVmZmVyID0gdW5kZWZpbmVkO1xyXG4gICAgcHVibGljIHBhdGg6IFVSTCA9IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgdXJsOiBSZXF1ZXN0SW5mbyA9IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgcmVhZHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3VybD86IFJlcXVlc3RJbmZvKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIGlmIChfdXJsKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkKF91cmwpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IF91cmwudG9TdHJpbmcoKS5zcGxpdChcIi9cIikucG9wKCk7XHJcbiAgICAgIH1cclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXN5bmNocm9ub3VzbHkgbG9hZHMgdGhlIGF1ZGlvIChtcDMpIGZyb20gdGhlIGdpdmVuIHVybFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBEZWJ1Zy5mdWRnZShcIkF1ZGlvTG9hZFwiLCBfdXJsKTtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucGF0aCA9IG5ldyBVUkwodGhpcy51cmwudG9TdHJpbmcoKSwgUHJvamVjdC5iYXNlVVJMKTtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgd2luZG93LmZldGNoKHRoaXMucGF0aC50b1N0cmluZygpKTtcclxuICAgICAgY29uc3QgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuICAgICAgbGV0IGJ1ZmZlcjogQXVkaW9CdWZmZXIgPSBhd2FpdCBBdWRpb01hbmFnZXIuZGVmYXVsdC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlCdWZmZXIpO1xyXG4gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcclxuICAgICAgdGhpcy5yZWFkeSA9IHRydWU7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlRfQVVESU8uUkVBRFkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdXJsOiB0aGlzLnVybCxcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkKF9zZXJpYWxpemF0aW9uLnVybCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9zZXJpYWxpemF0aW9uLm5hbWU7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb24/OiBzdHJpbmdbXSwgX2Rpc3BhdGNoTXV0YXRlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgdXJsOiBzdHJpbmcgPSBfbXV0YXRvci51cmw7IC8vIHNhdmUgdXJsIGZvciByZWNvbnN0cnVjdGlvbiBhZnRlciBleGNsdXNpb25cclxuICAgICAgaWYgKF9tdXRhdG9yLnVybCAhPSB0aGlzLnVybC50b1N0cmluZygpKVxyXG4gICAgICAgIHRoaXMubG9hZChfbXV0YXRvci51cmwpO1xyXG4gICAgICAvLyBleGNlcHQgdXJsIGZyb20gbXV0YXRvciBmb3IgZnVydGhlciBwcm9jZXNzaW5nXHJcbiAgICAgIGRlbGV0ZSAoX211dGF0b3IudXJsKTtcclxuICAgICAgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICAvLyByZWNvbnN0cnVjdCwgZm9yIG11dGF0b3IgbWF5IGJlIGtlcHQgYnkgY2FsbGVyXHJcbiAgICAgIFJlZmxlY3Quc2V0KF9tdXRhdG9yLCBcInVybFwiLCB1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIC8vIGRlbGV0ZSBfbXV0YXRvci5pZFJlc291cmNlOyBcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlYWR5O1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGNvbnN0IGVudW0gRVZFTlRfQVVESU8ge1xyXG4gICAgLyoqIGJyb2FkY2FzdCB0byBhIHtAbGluayBOb2RlfSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBpbiB0aGUgZ3JhcGggYWZ0ZXIgaXQgd2FzIGFwcGVuZGVkIHRvIGEgcGFyZW50ICovXHJcbiAgICBDSElMRF9BUFBFTkQgPSBcImNoaWxkQXBwZW5kVG9BdWRpb0dyYXBoXCIsXHJcbiAgICAvKiogYnJvYWRjYXN0IHRvIGEge0BsaW5rIE5vZGV9IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGluIHRoZSBncmFwaCBqdXN0IGJlZm9yZSBpdHMgYmVpbmcgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgKi9cclxuICAgIENISUxEX1JFTU9WRSA9IFwiY2hpbGRSZW1vdmVGcm9tQXVkaW9HcmFwaFwiLFxyXG4gICAgLyoqIGJyb2FkY2FzdCB0byBhIHtAbGluayBOb2RlfSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBpbiB0aGUgZ3JhcGggdG8gdXBkYXRlIHRoZSBwYW5uZXJzIGluIEF1ZGlvQ29tcG9uZW50cyAqL1xyXG4gICAgVVBEQVRFID0gXCJ1cGRhdGVBdWRpb0dyYXBoXCIsXHJcbiAgICAvKiogZmlyZWQgd2hlbiB0aGUgYXVkaW8gZmlsZSB3YXMgbG9hZGVkIGFuZCBpcyByZWFkeSBmb3IgcGxheWluZyAqL1xyXG4gICAgUkVBRFkgPSBcInJlYWR5XCIsXHJcbiAgICAvKiogZmlyZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBhdWRpbyBpcyByZWFjaGVkIHdoaWxlIHBsYXlpbmcgKi9cclxuICAgIEVOREVEID0gXCJlbmRlZFwiXHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiLi4vRXZlbnQvRXZlbnRBdWRpby50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRXh0ZW5kcyB0aGUgc3RhbmRhcmQgQXVkaW9Db250ZXh0IGZvciBpbnRlZ3JhdGlvbiB3aXRoIEZVREdFLWdyYXBocy5cclxuICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBvYmplY3QgYXQgc3RhcnR1cCB0byBiZSBhZGRyZXNzZWQgYXMgQXVkaW9NYW5hZ2VyIGRlZmF1bHQuXHJcbiAgICogT3RoZXIgb2JqZWN0cyBvZiB0aGlzIGNsYXNzIG1heSBiZSBjcmVhdGUgZm9yIHNwZWNpYWwgcHVycG9zZXMuXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEF1ZGlvTWFuYWdlciBleHRlbmRzIEF1ZGlvQ29udGV4dCB7XHJcbiAgICAvKiogVGhlIGRlZmF1bHQgY29udGV4dCB0aGF0IG1heSBiZSB1c2VkIHRocm91Z2hvdXQgdGhlIHByb2plY3Qgd2l0aG91dCB0aGUgbmVlZCB0byBjcmVhdGUgb3RoZXJzICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHQ6IEF1ZGlvTWFuYWdlciA9IG5ldyBBdWRpb01hbmFnZXIoeyBsYXRlbmN5SGludDogXCJpbnRlcmFjdGl2ZVwiLCBzYW1wbGVSYXRlOiA0NDEwMCB9KTtcclxuICAgIHByaXZhdGUgc3RhdGljIGV2ZW50VXBkYXRlOiBFdmVudCA9IG5ldyBFdmVudChFVkVOVF9BVURJTy5VUERBVEUpO1xyXG4gICAgLyoqIFRoZSBtYXN0ZXIgdm9sdW1lIGFsbCBBdWRpb05vZGVzIGluIHRoZSBjb250ZXh0IHNob3VsZCBhdHRhY2ggdG8gKi9cclxuICAgIHB1YmxpYyByZWFkb25seSBnYWluOiBHYWluTm9kZTtcclxuICAgIHByaXZhdGUgZ3JhcGg6IE5vZGUgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBjbXBMaXN0ZW5lcjogQ29tcG9uZW50QXVkaW9MaXN0ZW5lciA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb250ZXh0T3B0aW9ucz86IEF1ZGlvQ29udGV4dE9wdGlvbnMpIHtcclxuICAgICAgc3VwZXIoX2NvbnRleHRPcHRpb25zKTtcclxuICAgICAgdGhpcy5nYWluID0gdGhpcy5jcmVhdGVHYWluKCk7XHJcbiAgICAgIHRoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuZGVzdGluYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBtYXN0ZXIgdm9sdW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgdm9sdW1lKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuZ2Fpbi5nYWluLnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtYXN0ZXIgdm9sdW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZXMgRlVER0UtZ3JhcGggdG8gbGlzdGVuIHRvLiBFYWNoIHtAbGluayBDb21wb25lbnRBdWRpb30gaW4gdGhlIGdyYXBoIHdpbGwgY29ubmVjdCB0byB0aGlzIGNvbnRleHRzIG1hc3RlciBnYWluLCBhbGwgb3RoZXJzIGRpc2Nvbm5lY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsaXN0ZW5UbyA9IChfZ3JhcGg6IE5vZGUgfCBudWxsKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmdyYXBoKVxyXG4gICAgICAgIHRoaXMuZ3JhcGguYnJvYWRjYXN0RXZlbnQobmV3IEV2ZW50KEVWRU5UX0FVRElPLkNISUxEX1JFTU9WRSkpO1xyXG4gICAgICBpZiAoIV9ncmFwaClcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRoaXMuZ3JhcGggPSBfZ3JhcGg7XHJcbiAgICAgIHRoaXMuZ3JhcGguYnJvYWRjYXN0RXZlbnQobmV3IEV2ZW50KEVWRU5UX0FVRElPLkNISUxEX0FQUEVORCkpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBGVURHRS1ncmFwaCBjdXJyZW50bHkgbGlzdGVuaW5nIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRHcmFwaExpc3RlbmluZ1RvID0gKCk6IE5vZGUgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncmFwaDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHtAbGluayBDb21wb25lbnRBdWRpb0xpc3RlbmVyfSB0aGF0IHNlcnZlcyB0aGUgc3BhdGlhbCBsb2NhdGlvbiBhbmQgb3JpZW50YXRpb24gZm9yIHRoaXMgY29udGV4dHMgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxpc3RlbldpdGggPSAoX2NtcExpc3RlbmVyOiBDb21wb25lbnRBdWRpb0xpc3RlbmVyIHwgbnVsbCk6IHZvaWQgPT4ge1xyXG4gICAgICB0aGlzLmNtcExpc3RlbmVyID0gX2NtcExpc3RlbmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNwYXRpYWwgc2V0dGluZ3Mgb2YgdGhlIEF1ZGlvTm9kZXMgZWZmZWN0ZWQgaW4gdGhlIGN1cnJlbnQgRlVER0UtZ3JhcGhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZSA9ICgpOiB2b2lkID0+IHtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUgIT0gXCJydW5uaW5nXCIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICAvLyB0aGlzLmdyYXBoLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVF9BVURJTy5VUERBVEUpKTtcclxuICAgICAgdGhpcy5ncmFwaC5icm9hZGNhc3RFdmVudChBdWRpb01hbmFnZXIuZXZlbnRVcGRhdGUpO1xyXG4gICAgICBpZiAodGhpcy5jbXBMaXN0ZW5lcilcclxuICAgICAgICB0aGlzLmNtcExpc3RlbmVyLnVwZGF0ZSh0aGlzLmxpc3RlbmVyKTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwiLy8gbmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgICBcclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogRW51bWVyYXRvciBmb3IgYWxsIHBvc3NpYmxlIE9zY2lsbGF0b3IgVHlwZXNcclxuLy8gICAgICAqL1xyXG4vLyAgICAgdHlwZSBPU0NJTExBVE9SX1RZUEUgPSBcInNpbmVcIiB8IFwic3F1YXJlXCIgfCBcInNhd3Rvb3RoXCIgfCBcInRyaWFuZ2xlXCIgfCBcImN1c3RvbVwiO1xyXG5cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogSW50ZXJmYWNlIHRvIGNyZWF0ZSBDdXN0b20gT3NjaWxsYXRvciBUeXBlcy5cclxuLy8gICAgICAqIFN0YXJ0LS9FbmRwb2ludCBvZiBhIGN1c3R1bSBjdXJ2ZSBlLmcuIHNpbmUgY3VydmUuXHJcbi8vICAgICAgKiBCb3RoIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBpbmJldHdlZW4gLTEgYW5kIDEuXHJcbi8vICAgICAgKiBAcGFyYW0gc3RhcnRwb2ludCBzdGFydHBvaW50IG9mIGEgY3VydmUgXHJcbi8vICAgICAgKiBAcGFyYW0gZW5kcG9pbnQgRW5kcG9pbnQgb2YgYSBjdXJ2ZSBcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaW50ZXJmYWNlIE9zY2lsbGF0b3JXYXZlIHtcclxuLy8gICAgICAgICBzdGFydHBvaW50OiBudW1iZXI7XHJcbi8vICAgICAgICAgZW5kcG9pbnQ6IG51bWJlcjtcclxuLy8gICAgIH1cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogQWRkIGFuIHtAbGluayBBdWRpb0ZpbHRlcn0gdG8gYW4ge0BsaW5rIEF1ZGlvXV1cclxuLy8gICAgICAqIEBhdXRob3JzIFRob21hcyBEb3JuZXIsIEhGVSwgMjAxOVxyXG4vLyAgICAgICovXHJcbi8vICAgICBleHBvcnQgY2xhc3MgQXVkaW9Pc2NpbGxhdG9yIHtcclxuXHJcbi8vICAgICAgICAgcHVibGljIGF1ZGlvT3NjaWxsYXRvcjogT3NjaWxsYXRvck5vZGU7IFxyXG5cclxuLy8gICAgICAgICBwcml2YXRlIGZyZXF1ZW5jeTogbnVtYmVyO1xyXG4vLyAgICAgICAgIHByaXZhdGUgb3NjaWxsYXRvclR5cGU6IE9TQ0lMTEFUT1JfVFlQRTtcclxuLy8gICAgICAgICBwcml2YXRlIG9zY2lsbGF0b3JXYXZlOiBQZXJpb2RpY1dhdmU7XHJcblxyXG4vLyAgICAgICAgIHByaXZhdGUgbG9jYWxHYWluOiBHYWluTm9kZTtcclxuLy8gICAgICAgICBwcml2YXRlIGxvY2FsR2FpblZhbHVlOiBudW1iZXI7XHJcblxyXG4vLyAgICAgICAgIGNvbnN0cnVjdG9yKF9hdWRpb1NldHRpbmdzOiBBdWRpb1NldHRpbmdzLCBfb3NjaWxsYXRvclR5cGU/OiBPU0NJTExBVE9SX1RZUEUpIHtcclxuLy8gICAgICAgICAgICAgdGhpcy5hdWRpb09zY2lsbGF0b3IgPSBfYXVkaW9TZXR0aW5ncy5nZXRBdWRpb0NvbnRleHQoKS5jcmVhdGVPc2NpbGxhdG9yKCk7XHJcbi8vICAgICAgICAgICAgIHRoaXMubG9jYWxHYWluID0gX2F1ZGlvU2V0dGluZ3MuZ2V0QXVkaW9Db250ZXh0KCkuY3JlYXRlR2FpbigpO1xyXG4vLyAgICAgICAgICAgICB0aGlzLm9zY2lsbGF0b3JUeXBlID0gX29zY2lsbGF0b3JUeXBlO1xyXG4vLyAgICAgICAgICAgICBpZiAodGhpcy5vc2NpbGxhdG9yVHlwZSAhPSBcImN1c3RvbVwiKSB7XHJcbi8vICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvci50eXBlID0gdGhpcy5vc2NpbGxhdG9yVHlwZTtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICBlbHNlIHtcclxuLy8gICAgICAgICAgICAgICAgIGlmICghdGhpcy5vc2NpbGxhdG9yV2F2ZSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9Pc2NpbGxhdG9yLnNldFBlcmlvZGljV2F2ZSh0aGlzLm9zY2lsbGF0b3JXYXZlKTtcclxuLy8gICAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRlIGEgQ3VzdG9tIFBlcmlvZGljIFdhdmUgZmlyc3QgdG8gdXNlIEN1c3RvbSBUeXBlXCIpO1xyXG4vLyAgICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgc2V0T3NjaWxsYXRvclR5cGUoX29zY2lsbGF0b3JUeXBlOiBPU0NJTExBVE9SX1RZUEUpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgaWYgKHRoaXMub3NjaWxsYXRvclR5cGUgIT0gXCJjdXN0b21cIikge1xyXG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hdWRpb09zY2lsbGF0b3IudHlwZSA9IHRoaXMub3NjaWxsYXRvclR5cGU7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgZWxzZSB7XHJcbi8vICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3NjaWxsYXRvcldhdmUpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvci5zZXRQZXJpb2RpY1dhdmUodGhpcy5vc2NpbGxhdG9yV2F2ZSk7XHJcbi8vICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBnZXRPc2NpbGxhdG9yVHlwZSgpOiBPU0NJTExBVE9SX1RZUEUge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gdGhpcy5vc2NpbGxhdG9yVHlwZTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBjcmVhdGVQZXJpb2RpY1dhdmUoX2F1ZGlvU2V0dGluZ3M6IEF1ZGlvU2V0dGluZ3MsIF9yZWFsOiBPc2NpbGxhdG9yV2F2ZSwgX2ltYWc6IE9zY2lsbGF0b3JXYXZlKTogdm9pZCB7XHJcbi8vICAgICAgICAgICAgIGxldCB3YXZlUmVhbDogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgyKTtcclxuLy8gICAgICAgICAgICAgd2F2ZVJlYWxbMF0gPSBfcmVhbC5zdGFydHBvaW50O1xyXG4vLyAgICAgICAgICAgICB3YXZlUmVhbFsxXSA9IF9yZWFsLmVuZHBvaW50O1xyXG5cclxuLy8gICAgICAgICAgICAgbGV0IHdhdmVJbWFnOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDIpO1xyXG4vLyAgICAgICAgICAgICB3YXZlSW1hZ1swXSA9IF9pbWFnLnN0YXJ0cG9pbnQ7XHJcbi8vICAgICAgICAgICAgIHdhdmVJbWFnWzFdID0gX2ltYWcuZW5kcG9pbnQ7XHJcblxyXG4vLyAgICAgICAgICAgICB0aGlzLm9zY2lsbGF0b3JXYXZlID0gX2F1ZGlvU2V0dGluZ3MuZ2V0QXVkaW9Db250ZXh0KCkuY3JlYXRlUGVyaW9kaWNXYXZlKHdhdmVSZWFsLCB3YXZlSW1hZyk7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgc2V0TG9jYWxHYWluKF9sb2NhbEdhaW46IEdhaW5Ob2RlKTogdm9pZCB7XHJcbi8vICAgICAgICAgICAgIHRoaXMubG9jYWxHYWluID0gX2xvY2FsR2FpbjtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBnZXRMb2NhbEdhaW4oKTogR2Fpbk5vZGUge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbEdhaW47XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgc2V0TG9jYWxHYWluVmFsdWUoX2xvY2FsR2FpblZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgdGhpcy5sb2NhbEdhaW5WYWx1ZSA9IF9sb2NhbEdhaW5WYWx1ZTtcclxuLy8gICAgICAgICAgICAgdGhpcy5sb2NhbEdhaW4uZ2Fpbi52YWx1ZSA9IHRoaXMubG9jYWxHYWluVmFsdWU7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgZ2V0TG9jYWxHYWluVmFsdWUoKTogbnVtYmVyIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxHYWluVmFsdWU7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBwdWJsaWMgc2V0RnJlcXVlbmN5KF9hdWRpb1NldHRpbmdzOiBBdWRpb1NldHRpbmdzLCBfZnJlcXVlbmN5OiBudW1iZXIpOiB2b2lkIHtcclxuLy8gICAgICAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBfZnJlcXVlbmN5O1xyXG4vLyAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvci5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUodGhpcy5mcmVxdWVuY3ksIF9hdWRpb1NldHRpbmdzLmdldEF1ZGlvQ29udGV4dCgpLmN1cnJlbnRUaW1lKTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHB1YmxpYyBnZXRGcmVxdWVuY3koKTogbnVtYmVyIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJlcXVlbmN5O1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcHVibGljIGNyZWF0ZVNuYXJlKF9hdWRpb1NldHRpbmdzOiBBdWRpb1NldHRpbmdzKTogdm9pZCB7XHJcbi8vICAgICAgICAgICAgIHRoaXMuc2V0T3NjaWxsYXRvclR5cGUoXCJ0cmlhbmdsZVwiKTtcclxuLy8gICAgICAgICAgICAgdGhpcy5zZXRGcmVxdWVuY3koX2F1ZGlvU2V0dGluZ3MsIDEwMCk7XHJcbi8vICAgICAgICAgICAgIHRoaXMuc2V0TG9jYWxHYWluVmFsdWUoMCk7XHJcbi8vICAgICAgICAgICAgIHRoaXMubG9jYWxHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUoMCwgX2F1ZGlvU2V0dGluZ3MuZ2V0QXVkaW9Db250ZXh0KCkuY3VycmVudFRpbWUpO1xyXG4vLyAgICAgICAgICAgICB0aGlzLmxvY2FsR2Fpbi5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMSwgX2F1ZGlvU2V0dGluZ3MuZ2V0QXVkaW9Db250ZXh0KCkuY3VycmVudFRpbWUgKyAuMSk7XHJcblxyXG4vLyAgICAgICAgICAgICB0aGlzLmF1ZGlvT3NjaWxsYXRvci5jb25uZWN0KHRoaXMubG9jYWxHYWluKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vIH0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBdHRhY2hlZCB0byBhIHtAbGluayBOb2RlfSB3aXRoIGFuIGF0dGFjaGVkIHtAbGluayBDb21wb25lbnRDYW1lcmF9IHRoaXMgY2F1c2VzIHRoZSByZW5kZXJlZCBpbWFnZSB0byByZWNlaXZlIGFuIGFtYmllbnQgb2NjbHVzaW9uIGVmZmVjdC5cclxuICAgKiBAYXV0aG9ycyBSb2xhbmQgSGVlciwgSEZVLCAyMDIzIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEFtYmllbnRPY2NsdXNpb24gZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEFtYmllbnRPY2NsdXNpb24pO1xyXG5cclxuICAgIHB1YmxpYyBzYW1wbGVSYWRpdXM6IG51bWJlcjtcclxuICAgIHB1YmxpYyBiaWFzOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYXR0ZW51YXRpb25Db25zdGFudDogbnVtYmVyO1xyXG4gICAgcHVibGljIGF0dGVudWF0aW9uTGluZWFyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYXR0ZW51YXRpb25RdWFkcmF0aWM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3NhbXBsZVJhZGl1czogbnVtYmVyID0gMTYsIF9iaWFzOiBudW1iZXIgPSAwLjA3LCBfYXR0ZW51YXRpb25Db25zdGFudDogbnVtYmVyID0gMi41LCBfYXR0ZW51YXRpb25MaW5lYXI6IG51bWJlciA9IDEsIF9hdHRlbnVhdGlvblF1YWRyYXRpYzogbnVtYmVyID0gMSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNhbXBsZVJhZGl1cyA9IF9zYW1wbGVSYWRpdXM7XHJcbiAgICAgIHRoaXMuYmlhcyA9IF9iaWFzO1xyXG4gICAgICB0aGlzLmF0dGVudWF0aW9uQ29uc3RhbnQgPSBfYXR0ZW51YXRpb25Db25zdGFudDtcclxuICAgICAgdGhpcy5hdHRlbnVhdGlvbkxpbmVhciA9IF9hdHRlbnVhdGlvbkxpbmVhcjtcclxuICAgICAgdGhpcy5hdHRlbnVhdGlvblF1YWRyYXRpYyA9IF9hdHRlbnVhdGlvblF1YWRyYXRpYztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHNhbXBsZVJhZGl1czogdGhpcy5zYW1wbGVSYWRpdXMsXHJcbiAgICAgICAgYmlhczogdGhpcy5iaWFzLFxyXG4gICAgICAgIGF0dGVudWF0aW9uQ29uc3RhbnQ6IHRoaXMuYXR0ZW51YXRpb25Db25zdGFudCxcclxuICAgICAgICBhdHRlbnVhdGlvbkxpbmVhcjogdGhpcy5hdHRlbnVhdGlvbkxpbmVhcixcclxuICAgICAgICBhdHRlbnVhdGlvblF1YWRyYXRpYzogdGhpcy5hdHRlbnVhdGlvblF1YWRyYXRpY1xyXG4gICAgICB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuc2FtcGxlUmFkaXVzID0gX3NlcmlhbGl6YXRpb24uc2FtcGxlUmFkaXVzO1xyXG4gICAgICB0aGlzLmJpYXMgPSBfc2VyaWFsaXphdGlvbi5iaWFzO1xyXG4gICAgICB0aGlzLmF0dGVudWF0aW9uQ29uc3RhbnQgPSBfc2VyaWFsaXphdGlvbi5hdHRlbnVhdGlvbkNvbnN0YW50O1xyXG4gICAgICB0aGlzLmF0dGVudWF0aW9uTGluZWFyID0gX3NlcmlhbGl6YXRpb24uYXR0ZW51YXRpb25MaW5lYXI7XHJcbiAgICAgIHRoaXMuYXR0ZW51YXRpb25RdWFkcmF0aWMgPSBfc2VyaWFsaXphdGlvbi5hdHRlbnVhdGlvblF1YWRyYXRpYztcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RpbWUvTG9vcC50c1wiLz5cclxuLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BbmltYXRpb24vQW5pbWF0aW9uLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIGFuIHtAbGluayBBbmltYXRpb259IGFuZCBjb250cm9scyBpdC4gQ29udHJvbHMgcXVhbnRpemF0aW9uIGFuZCBwbGF5bW9kZSBhcyB3ZWxsIGFzIHNwZWVkLlxyXG4gICAqIEBhdXRob3JzIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50QW5pbWF0b3IgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEFuaW1hdG9yKTtcclxuICAgIC8vVE9ETzogYWRkIGZ1bmN0aW9uYWxpdHkgdG8gYmxlbmQgZnJvbSBvbmUgYW5pbWF0aW9uIHRvIGFub3RoZXIuXHJcbiAgICBwdWJsaWMgYW5pbWF0aW9uOiBBbmltYXRpb247XHJcbiAgICBwdWJsaWMgcGxheW1vZGU6IEFOSU1BVElPTl9QTEFZTU9ERTtcclxuICAgIHB1YmxpYyBxdWFudGl6YXRpb246IEFOSU1BVElPTl9RVUFOVElaQVRJT047XHJcbiAgICBwdWJsaWMgc2NhbGVXaXRoR2FtZVRpbWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIGFuaW1hdGVJbkVkaXRvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICNzY2FsZTogbnVtYmVyID0gMTtcclxuICAgICN0aW1lTG9jYWw6IFRpbWU7XHJcbiAgICAjcHJldmlvdXM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9hbmltYXRpb24/OiBBbmltYXRpb24sIF9wbGF5bW9kZTogQU5JTUFUSU9OX1BMQVlNT0RFID0gQU5JTUFUSU9OX1BMQVlNT0RFLkxPT1AsIF9xdWFudGl6YXRpb246IEFOSU1BVElPTl9RVUFOVElaQVRJT04gPSBBTklNQVRJT05fUVVBTlRJWkFUSU9OLkNPTlRJTk9VUykge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnBsYXltb2RlID0gX3BsYXltb2RlO1xyXG4gICAgICB0aGlzLnF1YW50aXphdGlvbiA9IF9xdWFudGl6YXRpb247XHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uID0gX2FuaW1hdGlvbjtcclxuXHJcbiAgICAgIHRoaXMuI3RpbWVMb2NhbCA9IG5ldyBUaW1lKCk7XHJcblxyXG4gICAgICAvL1RPRE86IHVwZGF0ZSBhbmltYXRpb24gdG90YWwgdGltZSB3aGVuIGxvYWRpbmcgYSBkaWZmZXJlbnQgYW5pbWF0aW9uP1xyXG4gICAgICB0aGlzLmFuaW1hdGlvbj8uY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcblxyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgKCkgPT4gdGhpcy5hY3RpdmF0ZShmYWxzZSkpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNISUxEX1JFTU9WRSwgKCkgPT4gdGhpcy5hY3RpdmF0ZShmYWxzZSkpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZhdGUodHJ1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2NhbGUoX3NjYWxlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc2NhbGUgPSBfc2NhbGU7XHJcbiAgICAgIHRoaXMudXBkYXRlU2NhbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNjYWxlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIHRoZSBjdXJyZW50IHNhbXBsZSB0aW1lIG9mIHRoZSBhbmltYXRpb24gIFxyXG4gICAgICogLSBzZXQ6IGp1bXAgdG8gYSBjZXJ0YWluIHNhbXBsZSB0aW1lIGluIHRoZSBhbmltYXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0aW1lKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0aW1lTG9jYWwuZ2V0KCkgJSB0aGlzLmFuaW1hdGlvbi50b3RhbFRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0aW1lKF90aW1lOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5qdW1wVG8oX3RpbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhY3RpdmF0ZShfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgc3VwZXIuYWN0aXZhdGUoX29uKTtcclxuICAgICAgaWYgKCF0aGlzLm5vZGUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5hY3RpdmF0ZUxpc3RlbmVycyhfb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSnVtcHMgdG8gYSBjZXJ0YWluIHRpbWUgaW4gdGhlIGFuaW1hdGlvbiB0byBwbGF5IGZyb20gdGhlcmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBqdW1wVG8oX3RpbWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLiN0aW1lTG9jYWwuc2V0KF90aW1lKTtcclxuICAgICAgdGhpcy4jcHJldmlvdXMgPSBfdGltZTtcclxuICAgICAgX3RpbWUgPSBfdGltZSAlIHRoaXMuYW5pbWF0aW9uLnRvdGFsVGltZTtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB0aGlzLmFuaW1hdGlvbi5nZXRTdGF0ZShfdGltZSwgdGhpcy5hbmltYXRpb24uY2FsY3VsYXRlRGlyZWN0aW9uKF90aW1lLCB0aGlzLnBsYXltb2RlKSwgdGhpcy5xdWFudGl6YXRpb24pO1xyXG4gICAgICB0aGlzLm5vZGUuYXBwbHlBbmltYXRpb24obXV0YXRvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBKdW1wcyB0byBhIGNlcnRhaW4gbGFiZWwgaW4gdGhlIGFuaW1hdGlvbiBpZiBkZWZpbmVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBqdW1wVG9MYWJlbChfbGFiZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBsZXQgdGltZTogbnVtYmVyID0gdGhpcy5hbmltYXRpb24ubGFiZWxzW19sYWJlbF07XHJcbiAgICAgIGlmICh0aW1lKVxyXG4gICAgICAgIHRoaXMuanVtcFRvKHRpbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yY2VzIGFuIHVwZGF0ZSBvZiB0aGUgYW5pbWF0aW9uIGZyb20gb3V0c2lkZS4gVXNlZCBpbiB0aGUgVmlld0FuaW1hdGlvbi4gU2hvdWxkbid0IGJlIHVzZWQgZHVyaW5nIHRoZSBnYW1lLlxyXG4gICAgICogQHBhcmFtIF90aW1lIHRoZSAodW5zY2FsZWQpIHRpbWUgdG8gdXBkYXRlIHRoZSBhbmltYXRpb24gd2l0aC5cclxuICAgICAqIEByZXR1cm5zIHRoZSBNdXRhdG9yIGZvciBBbmltYXRpb24uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQW5pbWF0aW9uKF90aW1lOiBudW1iZXIpOiBNdXRhdG9yIHtcclxuICAgICAgdGhpcy4jcHJldmlvdXMgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUFuaW1hdGlvbkxvb3AobnVsbCwgX3RpbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiB0cmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkQW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb24uaWRSZXNvdXJjZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5wbGF5bW9kZSA9IHRoaXMucGxheW1vZGU7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24ucXVhbnRpemF0aW9uID0gdGhpcy5xdWFudGl6YXRpb247XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc2NhbGUgPSB0aGlzLnNjYWxlO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNjYWxlV2l0aEdhbWVUaW1lID0gdGhpcy5zY2FsZVdpdGhHYW1lVGltZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5hbmltYXRlSW5FZGl0b3IgPSB0aGlzLmFuaW1hdGVJbkVkaXRvcjtcclxuXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgdGhpcy5hbmltYXRpb24gPSA8QW5pbWF0aW9uPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRBbmltYXRpb24pO1xyXG4gICAgICB0aGlzLnBsYXltb2RlID0gX3NlcmlhbGl6YXRpb24ucGxheW1vZGU7XHJcbiAgICAgIHRoaXMucXVhbnRpemF0aW9uID0gX3NlcmlhbGl6YXRpb24ucXVhbnRpemF0aW9uO1xyXG4gICAgICB0aGlzLnNjYWxlID0gX3NlcmlhbGl6YXRpb24uc2NhbGU7XHJcbiAgICAgIHRoaXMuc2NhbGVXaXRoR2FtZVRpbWUgPSBfc2VyaWFsaXphdGlvbi5zY2FsZVdpdGhHYW1lVGltZTtcclxuICAgICAgdGhpcy5hbmltYXRlSW5FZGl0b3IgPSBfc2VyaWFsaXphdGlvbi5hbmltYXRlSW5FZGl0b3I7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5hbmltYXRlSW5FZGl0b3IpICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBbmltYXRpb24oMCk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUxpc3RlbmVycyh0aGlzLmFjdGl2ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yOiBNdXRhdG9yKTogTXV0YXRvckF0dHJpYnV0ZVR5cGVzIHtcclxuICAgICAgbGV0IHR5cGVzOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMgPSBzdXBlci5nZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3IpO1xyXG4gICAgICBpZiAodHlwZXMucGxheW1vZGUpXHJcbiAgICAgICAgdHlwZXMucGxheW1vZGUgPSBBTklNQVRJT05fUExBWU1PREU7XHJcbiAgICAgIGlmICh0eXBlcy5xdWFudGl6YXRpb24pXHJcbiAgICAgICAgdHlwZXMucXVhbnRpemF0aW9uID0gQU5JTUFUSU9OX1FVQU5USVpBVElPTjtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZUxpc3RlbmVycyhfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgaWYgKF9vbiAmJiAoUHJvamVjdC5tb2RlICE9IE1PREUuRURJVE9SIHx8IFByb2plY3QubW9kZSA9PSBNT0RFLkVESVRPUiAmJiB0aGlzLmFuaW1hdGVJbkVkaXRvcikpIHtcclxuICAgICAgICBUaW1lLmdhbWUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5USU1FX1NDQUxFRCwgdGhpcy51cGRhdGVTY2FsZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUkVOREVSX1BSRVBBUkUsIHRoaXMudXBkYXRlQW5pbWF0aW9uTG9vcCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgVGltZS5nYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVElNRV9TQ0FMRUQsIHRoaXMudXBkYXRlU2NhbGUpO1xyXG4gICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlJFTkRFUl9QUkVQQVJFLCB0aGlzLnVwZGF0ZUFuaW1hdGlvbkxvb3ApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIHVwZGF0ZUFuaW1hdGlvblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBBbmltYXRpb24uXHJcbiAgICAgKiBVc2VzIHRoZSBidWlsdC1pbiB0aW1lIHVubGVzcyBhIGRpZmZlcmVudCB0aW1lIGlzIHNwZWNpZmllZC5cclxuICAgICAqIE1heSBhbHNvIGJlIGNhbGxlZCBmcm9tIHVwZGF0ZUFuaW1hdGlvbigpLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZUFuaW1hdGlvbkxvb3AgPSAoX2U6IEV2ZW50LCBfdGltZT86IG51bWJlcik6IE11dGF0b3IgPT4ge1xyXG4gICAgICBpZiAodGhpcy5hbmltYXRpb24udG90YWxUaW1lID09IDApIFxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IHRpbWU6IG51bWJlciA9IF90aW1lIHx8IF90aW1lID09PSAwID8gX3RpbWUgOiB0aGlzLiN0aW1lTG9jYWwuZ2V0KCk7XHJcbiAgICAgIGlmICh0aGlzLnF1YW50aXphdGlvbiA9PSBBTklNQVRJT05fUVVBTlRJWkFUSU9OLkZSQU1FUykge1xyXG4gICAgICAgIHRpbWUgPSB0aGlzLiNwcmV2aW91cyArICgxMDAwIC8gdGhpcy5hbmltYXRpb24uZnBzKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgZGlyZWN0aW9uOiBudW1iZXIgPSB0aGlzLmFuaW1hdGlvbi5jYWxjdWxhdGVEaXJlY3Rpb24odGltZSwgdGhpcy5wbGF5bW9kZSk7XHJcbiAgICAgIHRpbWUgPSB0aGlzLmFuaW1hdGlvbi5nZXRNb2RhbFRpbWUodGltZSwgdGhpcy5wbGF5bW9kZSwgdGhpcy4jdGltZUxvY2FsLmdldE9mZnNldCgpKTtcclxuICAgICAgdGhpcy5leGVjdXRlRXZlbnRzKHRoaXMuYW5pbWF0aW9uLmdldEV2ZW50c1RvRmlyZSh0aGlzLiNwcmV2aW91cywgdGltZSwgdGhpcy5xdWFudGl6YXRpb24sIGRpcmVjdGlvbikpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuI3ByZXZpb3VzICE9IHRpbWUpIHtcclxuICAgICAgICB0aGlzLiNwcmV2aW91cyA9IHRpbWU7XHJcbiAgICAgICAgdGltZSA9IHRpbWUgJSB0aGlzLmFuaW1hdGlvbi50b3RhbFRpbWU7XHJcbiAgICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB0aGlzLmFuaW1hdGlvbi5nZXRTdGF0ZSh0aW1lLCBkaXJlY3Rpb24sIHRoaXMucXVhbnRpemF0aW9uKTtcclxuICAgICAgICBpZiAodGhpcy5ub2RlKSB7XHJcbiAgICAgICAgICB0aGlzLm5vZGUuYXBwbHlBbmltYXRpb24obXV0YXRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpcmVzIGFsbCBjdXN0b20gZXZlbnRzIHRoZSBBbmltYXRpb24gc2hvdWxkIGhhdmUgZmlyZWQgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgZnJhbWUuXHJcbiAgICAgKiBAcGFyYW0gX2V2ZW50cyBhIGxpc3Qgb2YgbmFtZXMgb2YgY3VzdG9tIGV2ZW50cyB0byBmaXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXhlY3V0ZUV2ZW50cyhfZXZlbnRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgX2V2ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoX2V2ZW50c1tpXSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzY2FsZSBvZiB0aGUgYW5pbWF0aW9uIGlmIHRoZSB1c2VyIGNoYW5nZXMgaXQgb3IgaWYgdGhlIGdsb2JhbCBnYW1lIHRpbWVyIGNoYW5nZWQgaXRzIHNjYWxlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVNjYWxlID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICBsZXQgbmV3U2NhbGU6IG51bWJlciA9IHRoaXMuI3NjYWxlO1xyXG4gICAgICBpZiAodGhpcy5zY2FsZVdpdGhHYW1lVGltZSlcclxuICAgICAgICBuZXdTY2FsZSAqPSBUaW1lLmdhbWUuZ2V0U2NhbGUoKTtcclxuICAgICAgdGhpcy4jdGltZUxvY2FsLnNldFNjYWxlKG5ld1NjYWxlKTtcclxuICAgIH07XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGVudW0gQVVESU9fUEFOTkVSIHtcclxuICAgIENPTkVfSU5ORVJfQU5HTEUgPSBcImNvbmVJbm5lckFuZ2xlXCIsXHJcbiAgICBDT05FX09VVEVSX0FOR0xFID0gXCJjb25lT3V0ZXJBbmdsZVwiLFxyXG4gICAgQ09ORV9PVVRFUl9HQUlOID0gXCJjb25lT3V0ZXJHYWluXCIsXHJcbiAgICBESVNUQU5DRV9NT0RFTCA9IFwiZGlzdGFuY2VNb2RlbFwiLFxyXG4gICAgTUFYX0RJU1RBTkNFID0gXCJtYXhEaXN0YW5jZVwiLFxyXG4gICAgUEFOTklOR19NT0RFTCA9IFwicGFubmluZ01vZGVsXCIsXHJcbiAgICBSRUZfRElTVEFOQ0UgPSBcInJlZkRpc3RhbmNlXCIsXHJcbiAgICBST0xMT0ZGX0ZBQ1RPUiA9IFwicm9sbG9mZkZhY3RvclwiXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBBVURJT19OT0RFX1RZUEUge1xyXG4gICAgU09VUkNFLCBQQU5ORVIsIEdBSU5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkcyBhIG1pbmltYWwgYXVkaW8gZ3JhcGggKGJ5IGRlZmF1bHQgaW4ge0BsaW5rIEF1ZGlvTWFuYWdlcn0uZGVmYXVsdCkgYW5kIHN5bmNocm9uaXplcyBpdCB3aXRoIHRoZSBjb250YWluaW5nIHtAbGluayBOb2RlfVxyXG4gICAqIGBgYHRleHRcclxuICAgKiDilIwgQXVkaW9NYW5hZ2VyKC5kZWZhdWx0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcclxuICAgKiDilIIg4pSMIENvbXBvbmVudEF1ZGlvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICDilIJcclxuICAgKiDilIIg4pSCICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQIOKUgiAgXHJcbiAgICog4pSCIOKUgiAgICDilIJzb3VyY2XilIIg4oaSIOKUgnBhbm5lcuKUgiDihpIg4pSCIGdhaW4g4pSCIOKGkiDilIIgZ2FpbiDilIIg4pSCXHJcbiAgICog4pSCIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilIDilJgg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUmCDilIIgIFxyXG4gICAqIOKUgiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICAgICAgICAg4pSCXHJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXHJcbiAgICogYGBgXHJcbiAgICogQGF1dGhvcnMgVGhvbWFzIERvcm5lciwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50QXVkaW8gZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEF1ZGlvKTtcclxuICAgIC8qKiBwbGFjZXMgYW5kIGRpcmVjdHMgdGhlIHBhbm5lciByZWxhdGl2ZSB0byB0aGUgd29ybGQgdHJhbnNmb3JtIG9mIHRoZSB7QGxpbmsgTm9kZX0gICovXHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG5cclxuICAgIHByb3RlY3RlZCBzaW5nbGV0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIGF1ZGlvOiBBdWRpbztcclxuICAgIHByaXZhdGUgZ2FpbjogR2Fpbk5vZGU7XHJcbiAgICBwcml2YXRlIHBhbm5lcjogUGFubmVyTm9kZTtcclxuICAgIHByaXZhdGUgc291cmNlOiBBdWRpb0J1ZmZlclNvdXJjZU5vZGU7XHJcbiAgICBwcml2YXRlIGF1ZGlvTWFuYWdlcjogQXVkaW9NYW5hZ2VyO1xyXG4gICAgcHJpdmF0ZSBwbGF5aW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9hdWRpbzogQXVkaW8gPSBudWxsLCBfbG9vcDogYm9vbGVhbiA9IGZhbHNlLCBfc3RhcnQ6IGJvb2xlYW4gPSBmYWxzZSwgX2F1ZGlvTWFuYWdlcjogQXVkaW9NYW5hZ2VyID0gQXVkaW9NYW5hZ2VyLmRlZmF1bHQpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5pbnN0YWxsKF9hdWRpb01hbmFnZXIpO1xyXG4gICAgICB0aGlzLmNyZWF0ZVNvdXJjZShfYXVkaW8sIF9sb29wKTtcclxuXHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLmhhbmRsZUF0dGFjaCk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCB0aGlzLmhhbmRsZUF0dGFjaCk7XHJcblxyXG4gICAgICBpZiAoX3N0YXJ0KVxyXG4gICAgICAgIHRoaXMucGxheShfc3RhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdm9sdW1lKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuZ2Fpbi5nYWluLnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGxvb3AoX29uOiBib29sZWFuKSB7XHJcbiAgICAgIHRoaXMuc291cmNlLmxvb3AgPSBfb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBsb29wKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2UubG9vcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHBsYXliYWNrUmF0ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUudmFsdWUgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBwbGF5YmFja1JhdGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS52YWx1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldCBpc1BsYXlpbmcoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBsYXlpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc0F0dGFjaGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5ub2RlICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc0xpc3RlbmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGdpdmVuIHtAbGluayBBdWRpb30gYXMgdGhlIGF1ZGlvIHNvdXJjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QXVkaW8oX2F1ZGlvOiBBdWRpbyk6IHZvaWQge1xyXG4gICAgICB0aGlzLmNyZWF0ZVNvdXJjZShfYXVkaW8sIHRoaXMuc291cmNlLmxvb3ApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEF1ZGlvfSBjdXJyZW50bHkgdXNlZCBhcyBhdWRpbyBzb3VyY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEF1ZGlvKCk6IEF1ZGlvIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXVkaW87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHByb3BlcnR5IG9mIHRoZSBwYW5uZXIgdG8gdGhlIGdpdmVuIHZhbHVlLiBVc2UgdG8gbWFuaXB1bGF0ZSByYW5nZSBhbmQgcm9sbG9mZiBldGMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRQYW5uZXIoX3Byb3BlcnR5OiBBVURJT19QQU5ORVIsIF92YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIFJlZmxlY3Quc2V0KHRoaXMucGFubmVyLCBfcHJvcGVydHksIF92YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogbWF5IGJlIHVzZWQgZm9yIHNlcmlhbGl6YXRpb24gb2YgQXVkaW9Ob2Rlc1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBtdXRhdG9yIGZvciB0aGUgc3BlY2lmaWVkIEF1ZGlvTm9kZSBvZiB0aGUgc3RhbmRhcmQgZ3JhcGhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3JPZk5vZGUoX3R5cGU6IEFVRElPX05PREVfVFlQRSk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbm9kZTogQXVkaW9Ob2RlID0gdGhpcy5nZXRBdWRpb05vZGUoX3R5cGUpO1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IGdldE11dGF0b3JPZkFyYml0cmFyeShub2RlKTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgQXVkaW9Ob2RlIG9mIHRoZSBzdGFuZGFyZCBncmFwaCBmb3IgZnVydGhlciBtYW5pcHVsYXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEF1ZGlvTm9kZShfdHlwZTogQVVESU9fTk9ERV9UWVBFKTogQXVkaW9Ob2RlIHtcclxuICAgICAgc3dpdGNoIChfdHlwZSkge1xyXG4gICAgICAgIGNhc2UgQVVESU9fTk9ERV9UWVBFLlNPVVJDRTogcmV0dXJuIHRoaXMuc291cmNlO1xyXG4gICAgICAgIGNhc2UgQVVESU9fTk9ERV9UWVBFLlBBTk5FUjogcmV0dXJuIHRoaXMucGFubmVyO1xyXG4gICAgICAgIGNhc2UgQVVESU9fTk9ERV9UWVBFLkdBSU46IHJldHVybiB0aGlzLmdhaW47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0IG9yIHN0b3AgcGxheWluZyB0aGUgYXVkaW9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHBsYXkoX29uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgIGlmIChfb24pIHtcclxuICAgICAgICBpZiAodGhpcy5hdWRpby5pc1JlYWR5KSB7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNvdXJjZSh0aGlzLmF1ZGlvLCB0aGlzLnNvdXJjZS5sb29wLCB0aGlzLnBsYXliYWNrUmF0ZSk7XHJcbiAgICAgICAgICB0aGlzLnNvdXJjZS5zdGFydCgwLCAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hdWRpby5hZGRFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLlJFQURZLCB0aGlzLmhuZEF1ZGlvUmVhZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNvdXJjZS5hZGRFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLkVOREVELCB0aGlzLmhuZEF1ZGlvRW5kZWQpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5zb3VyY2Uuc3RvcCgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKF9lcnJvcjogdW5rbm93bikgeyAvKiBjYXRjaCBleGNlcHRpb24gd2hlbiBzb3VyY2UgaGFzbid0IGJlZW4gc3RhcnRlZC4uLiAqLyB9XHJcbiAgICAgIHRoaXMucGxheWluZyA9IF9vbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc2VydHMgQXVkaW9Ob2RlcyBiZXR3ZWVuIHRoZSBwYW5uZXIgYW5kIHRoZSBsb2NhbCBnYWluIG9mIHRoaXMge0BsaW5rIENvbXBvbmVudEF1ZGlvfVxyXG4gICAgICogX2lucHV0IGFuZCBfb3V0cHV0IG1heSBiZSB0aGUgc2FtZSBBdWRpb05vZGUsIGlmIHRoZXJlIGlzIG9ubHkgb25lIHRvIGluc2VydCxcclxuICAgICAqIG9yIG1heSBoYXZlIG11bHRpcGxlIEF1ZGlvTm9kZSBiZXR3ZWVuIHRoZW0gdG8gY3JlYXRlIGFuIGVmZmVjdC1ncmFwaC5cXFxyXG4gICAgICogTm90ZSB0aGF0IHtAbGluayBDb21wb25lbnRBdWRpb30gZG9lcyBub3Qga2VlcCB0cmFjayBvZiBpbnNlcnRlZCBBdWRpb05vZGVzIVxyXG4gICAgICogYGBgdGV4dFxyXG4gICAgICog4pSMIEF1ZGlvTWFuYWdlciguZGVmYXVsdCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXHJcbiAgICAgKiDilIIg4pSMIENvbXBvbmVudEF1ZGlvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICDilIJcclxuICAgICAqIOKUgiDilIIgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQIOKUgiAgXHJcbiAgICAgKiDilIIg4pSCICAgIOKUgnNvdXJjZeKUgiDihpIg4pSCcGFubmVy4pSCIOKGkiDilIJfaW5wdXTilIIg4oaSIC4uLiAg4oaSIOKUgl9vdXRwdXTilIIg4oaSIOKUgiBnYWluIOKUgiDihpIg4pSCIGdhaW4g4pSCIOKUglxyXG4gICAgICog4pSCIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilIDilJggICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUgiDilJTilIDilIDilIDilIDilIDilIDilJgg4pSCICBcclxuICAgICAqIOKUgiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICAgICAgICAg4pSCXHJcbiAgICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcclxuICAgICAqIGBgYFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5zZXJ0QXVkaW9Ob2RlcyhfaW5wdXQ6IEF1ZGlvTm9kZSwgX291dHB1dDogQXVkaW9Ob2RlKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucGFubmVyLmRpc2Nvbm5lY3QoMCk7XHJcbiAgICAgIGlmICghX2lucHV0ICYmICFfb3V0cHV0KSB7XHJcbiAgICAgICAgdGhpcy5wYW5uZXIuY29ubmVjdCh0aGlzLmdhaW4pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBhbm5lci5jb25uZWN0KF9pbnB1dCk7XHJcbiAgICAgIF9vdXRwdXQuY29ubmVjdCh0aGlzLmdhaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0aXZhdGUgb3ZlcnJpZGUuIENvbm5lY3RzIG9yIGRpc2Nvbm5lY3RzIEF1ZGlvTm9kZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBzdXBlci5hY3RpdmF0ZShfb24pO1xyXG4gICAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbm5lY3RzIHRoaXMgY29tcG9uZW50cyBnYWluLW5vZGUgdG8gdGhlIGdhaW4gbm9kZSBvZiB0aGUgQXVkaW9NYW5hZ2VyIHRoaXMgY29tcG9uZW50IHJ1bnMgb24uXHJcbiAgICAgKiBPbmx5IGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIGNvbXBvbmVudCBpcyBub3QgYXR0YWNoZWQgdG8gYSB7QGxpbmsgTm9kZX0gYnV0IG5lZWRzIHRvIGJlIGhlYXJkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29ubmVjdChfb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgaWYgKF9vbilcclxuICAgICAgICB0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmF1ZGlvTWFuYWdlci5nYWluKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuYXVkaW9NYW5hZ2VyLmdhaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4U2hhcGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMubm9kZS5tdHhXb3JsZCwgdGhpcy5tdHhQaXZvdCk7XHJcbiAgICAgIG10eFNoYXBlLnNjYWxpbmcgPSBuZXcgVmVjdG9yMygwLjUsIDAuNSwgMC41KTtcclxuICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IENvbG9yLkNTUyhcImNvcm5mbG93ZXJibHVlXCIpO1xyXG4gICAgICBHaXptb3MuZHJhd0ljb24oVGV4dHVyZURlZmF1bHQuaWNvbkF1ZGlvLCBtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKG10eFNoYXBlLCBjb2xvcik7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pZFJlc291cmNlID0gdGhpcy5hdWRpbz8uaWRSZXNvdXJjZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5wbGF5aW5nID0gdGhpcy5wbGF5aW5nO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmxvb3AgPSB0aGlzLmxvb3A7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udm9sdW1lID0gdGhpcy52b2x1bWU7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZ2V0TXV0YXRvck9mTm9kZShBVURJT19OT0RFX1RZUEUuUEFOTkVSKSk7XHJcbiAgICAgIC8vIFRPRE86IHNlcmlhbGl6ZSBwYW5uZXIgcGFyYW1ldGVyc1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgbGV0IGF1ZGlvOiBBdWRpbyA9IDxBdWRpbz5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICB0aGlzLmNyZWF0ZVNvdXJjZShhdWRpbywgX3NlcmlhbGl6YXRpb24ubG9vcCk7XHJcbiAgICAgIHRoaXMudm9sdW1lID0gX3NlcmlhbGl6YXRpb24udm9sdW1lO1xyXG4gICAgICB0aGlzLnBsYXkoX3NlcmlhbGl6YXRpb24ucGxheWluZyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIGxldCBhdWRpbzogTXV0YXRvciA9IG11dGF0b3IuYXVkaW87XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLmF1ZGlvOyAvLyBqdXN0IHRvIHJlYXJyYW5nZSBpbiBpbnRlcmZhY2VzLi4uXHJcbiAgICAgIG11dGF0b3IubG9vcCA9IHRoaXMubG9vcDtcclxuICAgICAgbXV0YXRvci52b2x1bWUgPSB0aGlzLnZvbHVtZTtcclxuICAgICAgbXV0YXRvci5hdWRpbyA9IGF1ZGlvOyAvLy4uLiBzbyBhdWRpbyBjb21lcyBsYXN0XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yKTtcclxuICAgIC8vICAgLy8gdGhpcy52b2x1bWUgPSBfbXV0YXRvci52b2x1bWU7XHJcbiAgICAvLyAgIC8vIHRoaXMubG9vcCA9IF9tdXRhdG9yLmxvb3A7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgc3VwZXIucmVkdWNlTXV0YXRvcihfbXV0YXRvcik7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5saXN0ZW5lZDtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICBwcml2YXRlIGhuZEF1ZGlvUmVhZHk6IEV2ZW50TGlzdGVuZXIgPSAoX2V2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICBEZWJ1Zy5mdWRnZShcIkF1ZGlvIHN0YXJ0XCIsIFJlZmxlY3QuZ2V0KF9ldmVudC50YXJnZXQsIFwidXJsXCIpKTtcclxuICAgICAgaWYgKHRoaXMucGxheWluZylcclxuICAgICAgICB0aGlzLnBsYXkodHJ1ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgaG5kQXVkaW9FbmRlZDogRXZlbnRMaXN0ZW5lciA9IChfZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIERlYnVnLmZ1ZGdlKFwiQXVkaW8gZW5kZWRcIiwgUmVmbGVjdC5nZXQoX2V2ZW50LnRhcmdldCwgXCJ1cmxcIikpO1xyXG4gICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBpbnN0YWxsKF9hdWRpb01hbmFnZXI6IEF1ZGlvTWFuYWdlciA9IEF1ZGlvTWFuYWdlci5kZWZhdWx0KTogdm9pZCB7XHJcbiAgICAgIGxldCBhY3RpdmU6IGJvb2xlYW4gPSB0aGlzLmlzQWN0aXZlO1xyXG4gICAgICB0aGlzLmFjdGl2YXRlKGZhbHNlKTtcclxuICAgICAgdGhpcy5hdWRpb01hbmFnZXIgPSBfYXVkaW9NYW5hZ2VyO1xyXG4gICAgICB0aGlzLnBhbm5lciA9IF9hdWRpb01hbmFnZXIuY3JlYXRlUGFubmVyKCk7XHJcbiAgICAgIHRoaXMuZ2FpbiA9IF9hdWRpb01hbmFnZXIuY3JlYXRlR2FpbigpO1xyXG4gICAgICB0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbik7XHJcbiAgICAgIHRoaXMuZ2Fpbi5jb25uZWN0KF9hdWRpb01hbmFnZXIuZ2Fpbik7XHJcbiAgICAgIHRoaXMuYWN0aXZhdGUoYWN0aXZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVNvdXJjZShfYXVkaW86IEF1ZGlvLCBfbG9vcDogYm9vbGVhbiwgX3BsYXliYWNrUmF0ZTogbnVtYmVyID0gMS4wKTogdm9pZCB7XHJcbiAgICAgIGlmICh0aGlzLnNvdXJjZSkge1xyXG4gICAgICAgIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB0aGlzLnNvdXJjZS5idWZmZXIgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc291cmNlID0gdGhpcy5hdWRpb01hbmFnZXIuY3JlYXRlQnVmZmVyU291cmNlKCk7XHJcbiAgICAgIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5wYW5uZXIpO1xyXG5cclxuICAgICAgaWYgKF9hdWRpbykge1xyXG4gICAgICAgIHRoaXMuYXVkaW8gPSBfYXVkaW87XHJcbiAgICAgICAgdGhpcy5zb3VyY2UuYnVmZmVyID0gX2F1ZGlvLmJ1ZmZlcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zb3VyY2UubG9vcCA9IF9sb29wO1xyXG4gICAgICB0aGlzLnBsYXliYWNrUmF0ZSA9IF9wbGF5YmFja1JhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDb25uZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCh0aGlzLmlzQWN0aXZlICYmIHRoaXMuaXNBdHRhY2hlZCAmJiB0aGlzLmxpc3RlbmVkKTtcclxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XHJcbiAgICAgICAgLy8gbm9wXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBBdXRvbWF0aWNhbGx5IGNvbm5lY3RzL2Rpc2Nvbm5lY3RzIEF1ZGlvTm9kZXMgd2hlbiBhZGRpbmcvcmVtb3ZpbmcgdGhpcyBjb21wb25lbnQgdG8vZnJvbSBhIG5vZGUuIFxyXG4gICAgICogVGhlcmVmb3JlIHVudXNlZCBBdWRpb05vZGVzIG1heSBiZSBnYXJiYWdlIGNvbGxlY3RlZCB3aGVuIGFuIHVudXNlZCBjb21wb25lbnQgaXMgY29sbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQXR0YWNoID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgLy8gRGVidWcubG9nKF9ldmVudCk7XHJcbiAgICAgIGlmIChfZXZlbnQudHlwZSA9PSBFVkVOVC5DT01QT05FTlRfQUREKSB7XHJcbiAgICAgICAgdGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5ELCB0aGlzLmhhbmRsZUdyYXBoLCB0cnVlKTtcclxuICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5DSElMRF9SRU1PVkUsIHRoaXMuaGFuZGxlR3JhcGgsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLlVQREFURSwgdGhpcy51cGRhdGUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZWQgPSB0aGlzLm5vZGUuaXNEZXNjZW5kYW50T2YoQXVkaW9NYW5hZ2VyLmRlZmF1bHQuZ2V0R3JhcGhMaXN0ZW5pbmdUbygpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVF9BVURJTy5DSElMRF9BUFBFTkQsIHRoaXMuaGFuZGxlR3JhcGgsIHRydWUpO1xyXG4gICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UX0FVRElPLkNISUxEX1JFTU9WRSwgdGhpcy5oYW5kbGVHcmFwaCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlRfQVVESU8uVVBEQVRFLCB0aGlzLnVwZGF0ZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBkYXRlQ29ubmVjdGlvbigpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBBdXRvbWF0aWNhbGx5IGNvbm5lY3RzL2Rpc2Nvbm5lY3RzIEF1ZGlvTm9kZXMgd2hlbiBhcHBlbmRpbmcvcmVtb3ZpbmcgdGhlIEZVREdFLWdyYXBoIHRoZSBjb21wb25lbnQgaXMgaW4uIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUdyYXBoID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgLy8gRGVidWcubG9nKF9ldmVudCk7XHJcbiAgICAgIHRoaXMubGlzdGVuZWQgPSAoX2V2ZW50LnR5cGUgPT0gRVZFTlRfQVVESU8uQ0hJTERfQVBQRU5EKTtcclxuICAgICAgdGhpcy51cGRhdGVDb25uZWN0aW9uKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBcclxuICAgICAqIFVwZGF0ZXMgdGhlIHBhbm5lciBub2RlLCBpdHMgcG9zaXRpb24gYW5kIGRpcmVjdGlvbiwgdXNpbmcgdGhlIHdvcmxkbWF0cml4IG9mIHRoZSBjb250YWluZXIgYW5kIHRoZSBwaXZvdCBvZiB0aGlzIGNvbXBvbmVudC4gXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gdGhpcy5tdHhQaXZvdDtcclxuICAgICAgaWYgKHRoaXMubm9kZSlcclxuICAgICAgICBtdHhSZXN1bHQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG5cclxuICAgICAgLy8gRGVidWcubG9nKG10eFJlc3VsdC50b1N0cmluZygpKTtcclxuICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IzID0gbXR4UmVzdWx0LnRyYW5zbGF0aW9uO1xyXG4gICAgICBsZXQgZm9yd2FyZDogVmVjdG9yMyA9IFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oVmVjdG9yMy5aKDEpLCBtdHhSZXN1bHQsIGZhbHNlKTtcclxuXHJcbiAgICAgIHRoaXMucGFubmVyLnBvc2l0aW9uWC52YWx1ZSA9IHBvc2l0aW9uLng7XHJcbiAgICAgIHRoaXMucGFubmVyLnBvc2l0aW9uWS52YWx1ZSA9IHBvc2l0aW9uLnk7XHJcbiAgICAgIHRoaXMucGFubmVyLnBvc2l0aW9uWi52YWx1ZSA9IHBvc2l0aW9uLno7XHJcblxyXG4gICAgICB0aGlzLnBhbm5lci5vcmllbnRhdGlvblgudmFsdWUgPSBmb3J3YXJkLng7XHJcbiAgICAgIHRoaXMucGFubmVyLm9yaWVudGF0aW9uWS52YWx1ZSA9IGZvcndhcmQueTtcclxuICAgICAgdGhpcy5wYW5uZXIub3JpZW50YXRpb25aLnZhbHVlID0gZm9yd2FyZC56O1xyXG5cclxuICAgICAgUmVjeWNsZXIuc3RvcmUoZm9yd2FyZCk7XHJcbiAgICAgIC8vIFRPRE86IGV4YW1pbmUgd2h5IHRoZSBmb2xsb3dpbmcgcHJvZHVjZXMgZXJyb25lb3VzIHJlc3VsdHMsIHNlZSB0ZXN0IFwiU3BhdGlhbCBBdWRpb1wiXHJcbiAgICAgIGlmICh0aGlzLm5vZGUpXHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogU2VydmVzIHRvIHNldCB0aGUgc3BhdGlhbCBsb2NhdGlvbiBhbmQgb3JpZW50YXRpb24gb2YgQXVkaW9MaXN0ZW5lcnMgcmVsYXRpdmUgdG8gdGhlXHJcbiAgICogd29ybGQgdHJhbnNmb3JtIG9mIHRoZSB7QGxpbmsgTm9kZX0gaXQgaXMgYXR0YWNoZWQgdG8uXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50QXVkaW9MaXN0ZW5lciBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50QXVkaW9MaXN0ZW5lcik7XHJcbiAgICBwdWJsaWMgbXR4UGl2b3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgcG9zaXRpb24gYW5kIG9yaWVudGF0aW9uIG9mIHRoZSBnaXZlbiBBdWRpb0xpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGUoX2xpc3RlbmVyOiBBdWRpb0xpc3RlbmVyKTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4UGl2b3Q7XHJcbiAgICAgIGlmICh0aGlzLm5vZGUpXHJcbiAgICAgICAgbXR4UmVzdWx0ID0gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5ub2RlLm10eFdvcmxkLCB0aGlzLm10eFBpdm90KTtcclxuXHJcbiAgICAgIC8vIERlYnVnLmxvZyhtdHhSZXN1bHQudG9TdHJpbmcoKSk7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IG10eFJlc3VsdC50cmFuc2xhdGlvbjtcclxuICAgICAgbGV0IGZvcndhcmQ6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKFZlY3RvcjMuWigxKSwgbXR4UmVzdWx0LCBmYWxzZSk7XHJcbiAgICAgIGxldCB1cDogVmVjdG9yMyA9IFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oVmVjdG9yMy5ZKCksIG10eFJlc3VsdCwgZmFsc2UpO1xyXG4gICAgICBpZiAoX2xpc3RlbmVyLnBvc2l0aW9uWCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBfbGlzdGVuZXIucG9zaXRpb25YLnZhbHVlID0gcG9zaXRpb24ueDtcclxuICAgICAgICBfbGlzdGVuZXIucG9zaXRpb25ZLnZhbHVlID0gcG9zaXRpb24ueTtcclxuICAgICAgICBfbGlzdGVuZXIucG9zaXRpb25aLnZhbHVlID0gcG9zaXRpb24uejtcclxuXHJcbiAgICAgICAgX2xpc3RlbmVyLmZvcndhcmRYLnZhbHVlID0gZm9yd2FyZC54O1xyXG4gICAgICAgIF9saXN0ZW5lci5mb3J3YXJkWS52YWx1ZSA9IGZvcndhcmQueTtcclxuICAgICAgICBfbGlzdGVuZXIuZm9yd2FyZFoudmFsdWUgPSBmb3J3YXJkLno7XHJcblxyXG4gICAgICAgIF9saXN0ZW5lci51cFgudmFsdWUgPSB1cC54O1xyXG4gICAgICAgIF9saXN0ZW5lci51cFkudmFsdWUgPSB1cC55O1xyXG4gICAgICAgIF9saXN0ZW5lci51cFoudmFsdWUgPSB1cC56O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEZpcmVmb3ggc3RpbGwgdXNlcyBkZXByZWNhdGVkIG1ldGhvZHMuIFRPRE86IGRlbGV0ZSBhcyBzb29uIGFzIHBvc3NpYmxlIVxyXG4gICAgICAgIF9saXN0ZW5lci5zZXRQb3NpdGlvbihwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KTtcclxuICAgICAgICBfbGlzdGVuZXIuc2V0T3JpZW50YXRpb24oZm9yd2FyZC54LCBmb3J3YXJkLnksIGZvcndhcmQueiwgdXAueCwgdXAueSwgdXAueik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKGZvcndhcmQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh1cCk7XHJcbiAgICAgIGlmICh0aGlzLm5vZGUpXHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuXHJcbiAgICAgIC8vIERlYnVnLmxvZyhtdHhSZXN1bHQudHJhbnNsYXRpb24udG9TdHJpbmcoKSwgZm9yd2FyZC50b1N0cmluZygpLCB1cC50b1N0cmluZygpKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQXR0YWNoZWQgdG8gYSB7QGxpbmsgTm9kZX0gd2l0aCBhbiBhdHRhY2hlZCB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSB0aGlzIGNhdXNlcyB0aGUgcmVuZGVyZWQgaW1hZ2UgdG8gcmVjZWl2ZSBhIGJsb29tLWVmZmVjdC5cclxuICAgKiBAYXV0aG9ycyBSb2xhbmQgSGVlciwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEJsb29tIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRCbG9vbSk7XHJcbiAgICBcclxuICAgICN0aHJlc2hvbGQ6IG51bWJlcjtcclxuICAgICNpbnRlbnNpdHk6IG51bWJlcjtcclxuICAgICNoaWdobGlnaHREZXNhdHVyYXRpb246IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3RocmVzaG9sZDogbnVtYmVyID0gMC45NSwgX2ludGVuc2l0eTogbnVtYmVyID0gMS4wLCBfZGVzYXR1cmF0ZUhpZ2hsaWdodHM6IG51bWJlciA9IDAuNSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLiN0aHJlc2hvbGQgPSBfdGhyZXNob2xkO1xyXG4gICAgICB0aGlzLiNpbnRlbnNpdHkgPSBfaW50ZW5zaXR5O1xyXG4gICAgICB0aGlzLiNoaWdobGlnaHREZXNhdHVyYXRpb24gPSBfZGVzYXR1cmF0ZUhpZ2hsaWdodHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0aHJlc2hvbGQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3RocmVzaG9sZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGhyZXNob2xkKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3RocmVzaG9sZCA9IENhbGMuY2xhbXAoX3ZhbHVlLCAwLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGludGVuc2l0eSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaW50ZW5zaXR5O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBpbnRlbnNpdHkoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jaW50ZW5zaXR5ID0gTWF0aC5tYXgoMCwgX3ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGhpZ2hsaWdodERlc2F0dXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaGlnaGxpZ2h0RGVzYXR1cmF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBoaWdobGlnaHREZXNhdHVyYXRpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jaGlnaGxpZ2h0RGVzYXR1cmF0aW9uID0gQ2FsYy5jbGFtcChfdmFsdWUsIDAsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgdGhyZXNob2xkOiB0aGlzLiN0aHJlc2hvbGQsXHJcbiAgICAgICAgaW50ZW5zaXR5OiB0aGlzLiNpbnRlbnNpdHksXHJcbiAgICAgICAgZGVzYXR1cmF0ZUhpZ2hsaWdodHM6IHRoaXMuI2hpZ2hsaWdodERlc2F0dXJhdGlvbixcclxuICAgICAgfTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLiN0aHJlc2hvbGQgPSBfc2VyaWFsaXphdGlvbi50aHJlc2hvbGQ7XHJcbiAgICAgIHRoaXMuI2ludGVuc2l0eSA9IF9zZXJpYWxpemF0aW9uLmludGVuc2l0eTtcclxuICAgICAgdGhpcy4jaGlnaGxpZ2h0RGVzYXR1cmF0aW9uID0gX3NlcmlhbGl6YXRpb24uZGVzYXR1cmF0ZUhpZ2hsaWdodHM7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgbXV0YXRvci50aHJlc2hvbGQgPSB0aGlzLnRocmVzaG9sZDtcclxuICAgICAgbXV0YXRvci5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5oaWdobGlnaHREZXNhdHVyYXRpb24gPSB0aGlzLmhpZ2hsaWdodERlc2F0dXJhdGlvbjtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCJDb21wb25lbnQudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBlbnVtIEZJRUxEX09GX1ZJRVcge1xyXG4gICAgSE9SSVpPTlRBTCA9IFwiaG9yaXpvbnRhbFwiLFxyXG4gICAgVkVSVElDQUwgPSBcInZlcnRpY2FsXCIsXHJcbiAgICBESUFHT05BTCA9IFwiZGlhZ29uYWxcIlxyXG4gIH1cclxuICAvKipcclxuICAgKiBEZWZpbmVzIGlkZW50aWZpZXJzIGZvciB0aGUgdmFyaW91cyBwcm9qZWN0aW9ucyBhIGNhbWVyYSBjYW4gcHJvdmlkZS4gIFxyXG4gICAqIFRPRE86IGNoYW5nZSBiYWNrIHRvIG51bWJlciBlbnVtIGlmIHN0cmluZ3Mgbm90IG5lZWRlZFxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIFBST0pFQ1RJT04ge1xyXG4gICAgQ0VOVFJBTCA9IFwiY2VudHJhbFwiLFxyXG4gICAgT1JUSE9HUkFQSElDID0gXCJvcnRob2dyYXBoaWNcIixcclxuICAgIERJTUVUUklDID0gXCJkaW1ldHJpY1wiLFxyXG4gICAgU1RFUkVPID0gXCJzdGVyZW9cIlxyXG4gIH1cclxuICAvKipcclxuICAgKiBUaGUgY2FtZXJhIGNvbXBvbmVudCBob2xkcyB0aGUgcHJvamVjdGlvbi1tYXRyaXggYW5kIG90aGVyIGRhdGEgbmVlZGVkIHRvIHJlbmRlciBhIHNjZW5lIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBub2RlIGl0IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAqIEBhdXRob3JzIEphc2NoYSBLYXJhZ8O2bCwgSEZVLCAyMDE5IHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50Q2FtZXJhIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRDYW1lcmEpO1xyXG5cclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcbiAgICBwdWJsaWMgY2xyQmFja2dyb3VuZDogQ29sb3IgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMSk7IC8vIFRoZSBjb2xvciBvZiB0aGUgYmFja2dyb3VuZCB0aGUgY2FtZXJhIHdpbGwgcmVuZGVyLlxyXG4gICAgLy9wcml2YXRlIG9ydGhvZ3JhcGhpYzogYm9vbGVhbiA9IGZhbHNlOyAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGltYWdlIHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBwZXJzcGVjdGl2ZSBvciBvcnRob2dyYXBoaWMgcHJvamVjdGlvbi5cclxuICAgIHByaXZhdGUgcHJvamVjdGlvbjogUFJPSkVDVElPTiA9IFBST0pFQ1RJT04uQ0VOVFJBTDtcclxuICAgIHByaXZhdGUgZmllbGRPZlZpZXc6IG51bWJlciA9IDQ1OyAvLyBUaGUgY2FtZXJhJ3Mgc2Vuc29yYW5nbGUuXHJcbiAgICBwcml2YXRlIGFzcGVjdFJhdGlvOiBudW1iZXIgPSAxLjA7XHJcbiAgICBwcml2YXRlIGRpcmVjdGlvbjogRklFTERfT0ZfVklFVyA9IEZJRUxEX09GX1ZJRVcuRElBR09OQUw7XHJcbiAgICBwcml2YXRlIG5lYXI6IG51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIGZhcjogbnVtYmVyID0gMjAwMDtcclxuICAgIHByaXZhdGUgYmFja2dyb3VuZEVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlOyAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBiYWNrZ3JvdW5kIG9mIHRoaXMgY2FtZXJhIHdpbGwgYmUgcmVuZGVyZWQuXHJcbiAgICAvLyBUT0RPOiBleGFtaW5lLCBpZiBiYWNrZ3JvdW5kIHNob3VsZCBiZSBhbiBhdHRyaWJ1dGUgb2YgQ2FtZXJhIG9yIFZpZXdwb3J0XHJcblxyXG4gICAgI210eFdvcmxkVG9WaWV3OiBNYXRyaXg0eDQ7XHJcbiAgICAjbXR4Q2FtZXJhSW52ZXJzZTogTWF0cml4NHg0O1xyXG4gICAgI210eFByb2plY3Rpb246IE1hdHJpeDR4NCA9IG5ldyBNYXRyaXg0eDQ7IC8vIFRoZSBtYXRyaXggdG8gbXVsdGlwbHkgZWFjaCBzY2VuZSBvYmplY3RzIHRyYW5zZm9ybWF0aW9uIGJ5LCB0byBkZXRlcm1pbmUgd2hlcmUgaXQgd2lsbCBiZSBkcmF3bi5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMgd29ybGR0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaS5lLiB0aGUgdHJhbnNmb3JtYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGdyYXBoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbXR4V29ybGQoKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG10eENhbWVyYTogTWF0cml4NHg0ID0gdGhpcy5tdHhQaXZvdC5jbG9uZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBtdHhDYW1lcmEgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcclxuICAgICAgICAvLyBubyBjb250YWluZXIgbm9kZSBvciBubyB3b3JsZCB0cmFuc2Zvcm1hdGlvbiBmb3VuZCAtPiBjb250aW51ZSB3aXRoIHBpdm90IG9ubHlcclxuICAgICAgICAvLyBUT0RPOiBtYXliZSB1c2UgaWYgKCkgdGhlbiBpbnN0ZWFkIG9mIHRyeSBjYXRjaFxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBtdHhDYW1lcmE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0aGUgd29ybGR0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgY2FtZXJhIGNvbnRhaW5lciwgdGhlIHBpdm90IG9mIHRoaXMgY2FtZXJhIGFuZCB0aGUgaW52ZXJzaW9uIG9mIHRoZSBwcm9qZWN0aW9uIG1hdHJpeFxyXG4gICAgICogeWllbGRpbmcgdGhlIHdvcmxkc3BhY2UgdG8gdmlld3NwYWNlIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG10eFdvcmxkVG9WaWV3KCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhXb3JsZFRvVmlldylcclxuICAgICAgICByZXR1cm4gdGhpcy4jbXR4V29ybGRUb1ZpZXc7XHJcblxyXG4gICAgICAvL1RPRE86IG9wdGltaXplLCBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIGlmIG5laXRoZXIgbXR4V29ybGQgbm9yIHBpdm90IGhhdmUgY2hhbmdlZFxyXG4gICAgICB0aGlzLiNtdHhXb3JsZFRvVmlldyA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMuI210eFByb2plY3Rpb24sIHRoaXMubXR4Q2FtZXJhSW52ZXJzZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtdHhXb3JsZFRvVmlldztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGludmVyc2lvbiBvZiB0aGlzIGNhbWVyYXMgd29ybGR0cmFuc2Zvcm1hdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG10eENhbWVyYUludmVyc2UoKTogTWF0cml4NHg0IHtcclxuICAgICAgaWYgKHRoaXMuI210eENhbWVyYUludmVyc2UpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI210eENhbWVyYUludmVyc2U7XHJcblxyXG4gICAgICAvL1RPRE86IG9wdGltaXplLCBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIGlmIG5laXRoZXIgbXR4V29ybGQgbm9yIHBpdm90IGhhdmUgY2hhbmdlZFxyXG4gICAgICB0aGlzLiNtdHhDYW1lcmFJbnZlcnNlID0gTWF0cml4NHg0LklOVkVSU0UodGhpcy5tdHhXb3JsZCk7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtdHhDYW1lcmFJbnZlcnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcHJvamVjdGlvbm1hdHJpeCBvZiB0aGlzIGNhbWVyYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG10eFByb2plY3Rpb24oKTogTWF0cml4NHg0IHtcclxuICAgICAgaWYgKHRoaXMuI210eFByb2plY3Rpb24pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI210eFByb2plY3Rpb247XHJcblxyXG4gICAgICAvL1RPRE86IG9wdGltaXplLCBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIGlmIG5laXRoZXIgbXR4V29ybGQgbm9yIHBpdm90IGhhdmUgY2hhbmdlZFxyXG4gICAgICB0aGlzLiNtdHhQcm9qZWN0aW9uID0gbmV3IE1hdHJpeDR4NDtcclxuICAgICAgcmV0dXJuIHRoaXMuI210eFByb2plY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhpcyBjYW1lcmFzIHtAbGluayBtdHhXb3JsZFRvVmlld30gYW5kIHtAbGluayBtdHhDYW1lcmFJbnZlcnNlfSBtYXRyaWNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXRXb3JsZFRvVmlldygpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuI210eFdvcmxkVG9WaWV3KSBSZWN5Y2xlci5zdG9yZSh0aGlzLiNtdHhXb3JsZFRvVmlldyk7XHJcbiAgICAgIGlmICh0aGlzLiNtdHhDYW1lcmFJbnZlcnNlKSBSZWN5Y2xlci5zdG9yZSh0aGlzLiNtdHhDYW1lcmFJbnZlcnNlKTtcclxuICAgICAgdGhpcy4jbXR4V29ybGRUb1ZpZXcgPSBudWxsO1xyXG4gICAgICB0aGlzLiNtdHhDYW1lcmFJbnZlcnNlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMge0BsaW5rIFBST0pFQ1RJT059IG1vZGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFByb2plY3Rpb24oKTogUFJPSkVDVElPTiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGJhY2tncm91bmQgb2YgdGhlIGNhbWVyYSBzaG91bGQgYmUgcmVuZGVyZWQsIGZhbHNlIGlmIG5vdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QmFja2dyb3VuZEVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmJhY2tncm91bmRFbmFibGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY2FtZXJhcyBhc3BlY3QgcmF0aW9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFzcGVjdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5hc3BlY3RSYXRpbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMgZmllbGQgb2YgdmlldyBpbiBkZWdyZWVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGaWVsZE9mVmlldygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5maWVsZE9mVmlldztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNhbWVyYXMgZGlyZWN0aW9uIGkuZS4gdGhlIHBsYW5lIG9uIHdoaWNoIHRoZSBmaWVsZE9mVmlldy1BbmdsZSBpcyBnaXZlblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGlyZWN0aW9uKCk6IEZJRUxEX09GX1ZJRVcge1xyXG4gICAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjYW1lcmFzIG5lYXIgdmFsdWUgaS5lLiB0aGUgbWluaW11bSBkaXN0YW5jZSB0byByZW5kZXIgb2JqZWN0cyBhdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TmVhcigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5uZWFyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY2FtZXJhcyBmYXIgdmFsdWUgaS5lLiB0aGUgbWF4aW11bSBkaXN0YW5jZSB0byByZW5kZXIgb2JqZWN0cyBhdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RmFyKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZhcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY2FtZXJhIHRvIHBlcnNwZWN0aXZlIHByb2plY3Rpb24uIFRoZSB3b3JsZCBvcmlnaW4gaXMgaW4gdGhlIGNlbnRlciBvZiB0aGUgY2FudmFzZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSBfYXNwZWN0IFRoZSBhc3BlY3QgcmF0aW8gYmV0d2VlbiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHByb2plY3Rpb25zcGFjZS4oRGVmYXVsdCA9IGNhbnZhcy5jbGllbnRXaWR0aCAvIGNhbnZhcy5DbGllbnRIZWlnaHQpXHJcbiAgICAgKiBAcGFyYW0gX2ZpZWxkT2ZWaWV3IFRoZSBmaWVsZCBvZiB2aWV3IGluIERlZ3JlZXMuIChEZWZhdWx0ID0gNDUpXHJcbiAgICAgKiBAcGFyYW0gX2RpcmVjdGlvbiBUaGUgcGxhbmUgb24gd2hpY2ggdGhlIGZpZWxkT2ZWaWV3LUFuZ2xlIGlzIGdpdmVuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvamVjdENlbnRyYWwoX2FzcGVjdDogbnVtYmVyID0gdGhpcy5hc3BlY3RSYXRpbywgX2ZpZWxkT2ZWaWV3OiBudW1iZXIgPSB0aGlzLmZpZWxkT2ZWaWV3LCBfZGlyZWN0aW9uOiBGSUVMRF9PRl9WSUVXID0gdGhpcy5kaXJlY3Rpb24sIF9uZWFyOiBudW1iZXIgPSB0aGlzLm5lYXIsIF9mYXI6IG51bWJlciA9IHRoaXMuZmFyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYXNwZWN0UmF0aW8gPSBfYXNwZWN0O1xyXG4gICAgICB0aGlzLmZpZWxkT2ZWaWV3ID0gX2ZpZWxkT2ZWaWV3O1xyXG4gICAgICB0aGlzLmRpcmVjdGlvbiA9IF9kaXJlY3Rpb247XHJcbiAgICAgIHRoaXMucHJvamVjdGlvbiA9IFBST0pFQ1RJT04uQ0VOVFJBTDtcclxuICAgICAgdGhpcy5uZWFyID0gX25lYXI7XHJcbiAgICAgIHRoaXMuZmFyID0gX2ZhcjtcclxuICAgICAgdGhpcy4jbXR4UHJvamVjdGlvbiA9IE1hdHJpeDR4NC5QUk9KRUNUSU9OX0NFTlRSQUwoX2FzcGVjdCwgdGhpcy5maWVsZE9mVmlldywgX25lYXIsIF9mYXIsIHRoaXMuZGlyZWN0aW9uKTsgLy8gVE9ETzogcmVtb3ZlIG1hZ2ljIG51bWJlcnNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY2FtZXJhIHRvIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uLiBEZWZhdWx0IHZhbHVlcyBhcmUgZGVyaXZlZCB0aGUgY2FudmFzIGNsaWVudCBkaW1lbnNpb25zXHJcbiAgICAgKiBAcGFyYW0gX2xlZnQgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIGxlZnQgYm9yZGVyLiAgICBcclxuICAgICAqIEBwYXJhbSBfcmlnaHQgVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIHJpZ2h0IGJvcmRlci4gIFxyXG4gICAgICogQHBhcmFtIF9ib3R0b20gVGhlIHBvc2l0aW9udmFsdWUgb2YgdGhlIHByb2plY3Rpb25zcGFjZSdzIGJvdHRvbSBib3JkZXIuXHJcbiAgICAgKiBAcGFyYW0gX3RvcCBUaGUgcG9zaXRpb252YWx1ZSBvZiB0aGUgcHJvamVjdGlvbnNwYWNlJ3MgdG9wIGJvcmRlci4gICAgICBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb2plY3RPcnRob2dyYXBoaWMoX2xlZnQ6IG51bWJlciA9IC1SZW5kZXIuZ2V0Q2FudmFzKCkuY2xpZW50V2lkdGggLyAyLCBfcmlnaHQ6IG51bWJlciA9IFJlbmRlci5nZXRDYW52YXMoKS5jbGllbnRXaWR0aCAvIDIsIF9ib3R0b206IG51bWJlciA9IFJlbmRlci5nZXRDYW52YXMoKS5jbGllbnRIZWlnaHQgLyAyLCBfdG9wOiBudW1iZXIgPSAtUmVuZGVyLmdldENhbnZhcygpLmNsaWVudEhlaWdodCAvIDIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5wcm9qZWN0aW9uID0gUFJPSkVDVElPTi5PUlRIT0dSQVBISUM7XHJcbiAgICAgIHRoaXMuI210eFByb2plY3Rpb24gPSBNYXRyaXg0eDQuUFJPSkVDVElPTl9PUlRIT0dSQVBISUMoX2xlZnQsIF9yaWdodCwgX2JvdHRvbSwgX3RvcCwgNDAwLCAtNDAwKTsgLy8gVE9ETzogZXhhbWluZSBtYWdpYyBudW1iZXJzIVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBjYWxjdWxhdGVkIGRpbWVuc2lvbiBvZiBhIHByb2plY3Rpb24gc3VyZmFjZSBpbiB0aGUgaHlwb3RoZXRpY2FsIGRpc3RhbmNlIG9mIDEgdG8gdGhlIGNhbWVyYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UHJvamVjdGlvblJlY3RhbmdsZSgpOiBSZWN0YW5nbGUge1xyXG4gICAgICBsZXQgdGFuRm92OiBudW1iZXIgPSBNYXRoLnRhbihNYXRoLlBJICogdGhpcy5maWVsZE9mVmlldyAvIDM2MCk7IC8vIEhhbGYgb2YgdGhlIGFuZ2xlLCB0byBjYWxjdWxhdGUgZGltZW5zaW9uIGZyb20gdGhlIGNlbnRlciAtPiByaWdodCBhbmdsZVxyXG4gICAgICBsZXQgdGFuSG9yaXpvbnRhbDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHRhblZlcnRpY2FsOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09IEZJRUxEX09GX1ZJRVcuRElBR09OQUwpIHtcclxuICAgICAgICBsZXQgYXNwZWN0OiBudW1iZXIgPSBNYXRoLnNxcnQodGhpcy5hc3BlY3RSYXRpbyk7XHJcbiAgICAgICAgdGFuSG9yaXpvbnRhbCA9IHRhbkZvdiAqIGFzcGVjdDtcclxuICAgICAgICB0YW5WZXJ0aWNhbCA9IHRhbkZvdiAvIGFzcGVjdDtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpcmVjdGlvbiA9PSBGSUVMRF9PRl9WSUVXLlZFUlRJQ0FMKSB7XHJcbiAgICAgICAgdGFuVmVydGljYWwgPSB0YW5Gb3Y7XHJcbiAgICAgICAgdGFuSG9yaXpvbnRhbCA9IHRhblZlcnRpY2FsICogdGhpcy5hc3BlY3RSYXRpbztcclxuICAgICAgfSBlbHNlIHsvL0ZPVl9ESVJFQ1RJT04uSE9SSVpPTlRBTFxyXG4gICAgICAgIHRhbkhvcml6b250YWwgPSB0YW5Gb3Y7XHJcbiAgICAgICAgdGFuVmVydGljYWwgPSB0YW5Ib3Jpem9udGFsIC8gdGhpcy5hc3BlY3RSYXRpbztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIFJlY3RhbmdsZS5HRVQoMCwgMCwgdGFuSG9yaXpvbnRhbCAqIDIsIHRhblZlcnRpY2FsICogMik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBwb2ludCBmcm9tIHdvcmxkIHNwYWNlIHRvIGNsaXAgc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50V29ybGRUb0NsaXAoX3BvaW50SW5Xb3JsZFNwYWNlOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjM7XHJcbiAgICAgIGxldCBtOiBGbG9hdDMyQXJyYXkgPSB0aGlzLm10eFdvcmxkVG9WaWV3LmdldCgpO1xyXG4gICAgICBsZXQgdzogbnVtYmVyID0gbVszXSAqIF9wb2ludEluV29ybGRTcGFjZS54ICsgbVs3XSAqIF9wb2ludEluV29ybGRTcGFjZS55ICsgbVsxMV0gKiBfcG9pbnRJbldvcmxkU3BhY2UueiArIG1bMTVdO1xyXG5cclxuICAgICAgcmVzdWx0ID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9pbnRJbldvcmxkU3BhY2UsIHRoaXMubXR4V29ybGRUb1ZpZXcpO1xyXG4gICAgICByZXN1bHQuc2NhbGUoMSAvIHcpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gcG9pbnQgZnJvbSBjbGlwIHNwYWNlIHRvIHdvcmxkIHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaXBUb1dvcmxkKF9wb2ludEluQ2xpcFNwYWNlOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBtdHhWaWV3VG9Xb3JsZDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklOVkVSU0UodGhpcy5tdHhXb3JsZFRvVmlldyk7XHJcbiAgICAgIGxldCBtOiBGbG9hdDMyQXJyYXkgPSBtdHhWaWV3VG9Xb3JsZC5nZXQoKTtcclxuICAgICAgbGV0IHJheVdvcmxkOiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfcG9pbnRJbkNsaXBTcGFjZSwgbXR4Vmlld1RvV29ybGQsIHRydWUpO1xyXG4gICAgICBsZXQgdzogbnVtYmVyID0gbVszXSAqIF9wb2ludEluQ2xpcFNwYWNlLnggKyBtWzddICogX3BvaW50SW5DbGlwU3BhY2UueSArIG1bMTFdICogX3BvaW50SW5DbGlwU3BhY2UueiArIG1bMTVdO1xyXG4gICAgICByYXlXb3JsZC5zY2FsZSgxIC8gdyk7XHJcblxyXG4gICAgICByZXR1cm4gcmF5V29ybGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuY2xyQmFja2dyb3VuZCxcclxuICAgICAgICBiYWNrZ3JvdW5kRW5hYmxlZDogdGhpcy5iYWNrZ3JvdW5kRW5hYmxlZCxcclxuICAgICAgICBwcm9qZWN0aW9uOiB0aGlzLnByb2plY3Rpb24sXHJcbiAgICAgICAgZmllbGRPZlZpZXc6IHRoaXMuZmllbGRPZlZpZXcsXHJcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbixcclxuICAgICAgICBuZWFyOiB0aGlzLm5lYXIsXHJcbiAgICAgICAgZmFyOiB0aGlzLmZhcixcclxuICAgICAgICBhc3BlY3Q6IHRoaXMuYXNwZWN0UmF0aW8sXHJcbiAgICAgICAgcGl2b3Q6IHRoaXMubXR4UGl2b3Quc2VyaWFsaXplKCksXHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmNsckJhY2tncm91bmQuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYmFja2dyb3VuZENvbG9yKTtcclxuICAgICAgdGhpcy5iYWNrZ3JvdW5kRW5hYmxlZCA9IF9zZXJpYWxpemF0aW9uLmJhY2tncm91bmRFbmFibGVkO1xyXG4gICAgICB0aGlzLnByb2plY3Rpb24gPSBfc2VyaWFsaXphdGlvbi5wcm9qZWN0aW9uO1xyXG4gICAgICB0aGlzLmZpZWxkT2ZWaWV3ID0gX3NlcmlhbGl6YXRpb24uZmllbGRPZlZpZXc7XHJcbiAgICAgIHRoaXMuYXNwZWN0UmF0aW8gPSBfc2VyaWFsaXphdGlvbi5hc3BlY3Q7XHJcbiAgICAgIHRoaXMuZGlyZWN0aW9uID0gX3NlcmlhbGl6YXRpb24uZGlyZWN0aW9uO1xyXG4gICAgICB0aGlzLm5lYXIgPSBfc2VyaWFsaXphdGlvbi5uZWFyID8/IHRoaXMubmVhcjtcclxuICAgICAgdGhpcy5mYXIgPSBfc2VyaWFsaXphdGlvbi5mYXIgPz8gdGhpcy5mYXI7XHJcbiAgICAgIGF3YWl0IHRoaXMubXR4UGl2b3QuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ucGl2b3QpO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5wcm9qZWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBQUk9KRUNUSU9OLk9SVEhPR1JBUEhJQzpcclxuICAgICAgICAgIHRoaXMucHJvamVjdE9ydGhvZ3JhcGhpYygpOyAvLyBUT0RPOiBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIHBhcmFtZXRlcnNcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUFJPSkVDVElPTi5DRU5UUkFMOlxyXG4gICAgICAgICAgdGhpcy5wcm9qZWN0Q2VudHJhbCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0gc3VwZXIuZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yKTtcclxuICAgICAgaWYgKHR5cGVzLmRpcmVjdGlvbilcclxuICAgICAgICB0eXBlcy5kaXJlY3Rpb24gPSBGSUVMRF9PRl9WSUVXO1xyXG4gICAgICBpZiAodHlwZXMucHJvamVjdGlvbilcclxuICAgICAgICB0eXBlcy5wcm9qZWN0aW9uID0gUFJPSkVDVElPTjtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMucHJvamVjdGlvbikge1xyXG4gICAgICAgIGNhc2UgUFJPSkVDVElPTi5DRU5UUkFMOlxyXG4gICAgICAgICAgdGhpcy5wcm9qZWN0Q2VudHJhbCh0aGlzLmFzcGVjdFJhdGlvLCB0aGlzLmZpZWxkT2ZWaWV3LCB0aGlzLmRpcmVjdGlvbiwgdGhpcy5uZWFyLCB0aGlzLmZhcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IHRoaXMubXR4V29ybGQuY2xvbmU7XHJcbiAgICAgIG10eFdvcmxkLnNjYWxpbmcgPSBuZXcgVmVjdG9yMygwLjUsIDAuNSwgMC41KTtcclxuICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IENvbG9yLkNTUyhcImxpZ2h0Z3JleVwiKTtcclxuICAgICAgR2l6bW9zLmRyYXdJY29uKFRleHR1cmVEZWZhdWx0Lmljb25DYW1lcmEsIG10eFdvcmxkLCBjb2xvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUobXR4V29ybGQsIGNvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd1dpcmVGcnVzdHVtKHRoaXMuZ2V0QXNwZWN0KCksIHRoaXMuZ2V0RmllbGRPZlZpZXcoKSwgdGhpcy5nZXROZWFyKCksIHRoaXMuZ2V0RmFyKCksIHRoaXMuZ2V0RGlyZWN0aW9uKCksIHRoaXMubXR4V29ybGQsIENvbG9yLkNTUyhcImxpZ2h0Z3JleVwiKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci50cmFuc2Zvcm07XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogTWFrZXMgdGhlIG5vZGUgZmFjZSB0aGUgY2FtZXJhIHdoZW4gcmVuZGVyaW5nLCByZXNwZWN0aW5nIHJlc3RyaWN0aW9ucyBmb3Igcm90YXRpb24gYXJvdW5kIHNwZWNpZmljIGF4aXNcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEZhY2VDYW1lcmEgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEZhY2VDYW1lcmEpO1xyXG5cclxuICAgIHB1YmxpYyB1cExvY2FsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyB1cDogVmVjdG9yMyA9IFZlY3RvcjMuWSgxKTtcclxuICAgIHB1YmxpYyByZXN0cmljdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIGEge0BsaW5rIE1hdGVyaWFsfSB0byB0aGUgbm9kZVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5IC0gMjAyMVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRGb2cgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudEZvZyk7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG4gICAgcHVibGljIG5lYXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBmYXI6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKSwgX25lYXI6IG51bWJlciA9IDEsIF9mYXI6IG51bWJlciA9IDUwKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuY29sb3IgPSBfY29sb3I7XHJcbiAgICAgIHRoaXMubmVhciA9IF9uZWFyO1xyXG4gICAgICB0aGlzLmZhciA9IF9mYXI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBjb2xvcjogdGhpcy5jb2xvci5zZXJpYWxpemUoKSxcclxuICAgICAgICBuZWFyOiB0aGlzLm5lYXIsXHJcbiAgICAgICAgZmFyOiB0aGlzLmZhclxyXG4gICAgICB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29sb3IuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uY29sb3IpO1xyXG4gICAgICB0aGlzLm5lYXIgPSBfc2VyaWFsaXphdGlvbi5uZWFyID8/IHRoaXMubmVhcjtcclxuICAgICAgdGhpcy5mYXIgPSBfc2VyaWFsaXphdGlvbi5mYXIgPz8gdGhpcy5mYXI7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRmlsdGVycyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBhIGdyYXBoIGluc3RhbmNlIGFuZCB0aGUgZ3JhcGggaXQgaXMgY29ubmVjdGVkIHRvLiBJZiBhY3RpdmUsIG5vIHN5bmNocm9uaXphdGlvbiBvY2N1cnMuXHJcbiAgICogTWF5YmUgbW9yZSBmaW5lZ3JhaW5lZCBpbiB0aGUgZnV0dXJlLi4uXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjJcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRHcmFwaEZpbHRlciBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50R3JhcGhGaWx0ZXIpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCB0eXBlIFR5cGVPZkxpZ2h0ID0gbmV3ICgpID0+IExpZ2h0O1xyXG4gIC8qKlxyXG4gICAqIEJhc2VjbGFzcyBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIGxpZ2h0cy4gXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgTGlnaHQgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHtcclxuICAgIHB1YmxpYyBjb2xvcjogQ29sb3I7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSkpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5jb2xvciA9IF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBUeXBlT2ZMaWdodH0gb2YgdGhpcyBsaWdodC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFR5cGUoKTogVHlwZU9mTGlnaHQge1xyXG4gICAgICByZXR1cm4gPFR5cGVPZkxpZ2h0PnRoaXMuY29uc3RydWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgY29sb3I6IHRoaXMuY29sb3Iuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgdGhpcy5jb2xvci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5jb2xvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKCk6IHZvaWQgey8qKi8gfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW1iaWVudCBsaWdodCwgY29taW5nIGZyb20gYWxsIGRpcmVjdGlvbnMsIGlsbHVtaW5hdGluZyBldmVyeXRoaW5nIHdpdGggaXRzIGNvbG9yIGluZGVwZW5kZW50IG9mIHBvc2l0aW9uIGFuZCBvcmllbnRhdGlvbiAobGlrZSBhIGZvZ2d5IGRheSBvciBpbiB0aGUgc2hhZGVzKSAgXHJcbiAgICogQXR0YWNoZWQgdG8gYSBub2RlIGJ5IHtAbGluayBDb21wb25lbnRMaWdodH0sIHRoZSBwaXZvdCBtYXRyaXggaXMgaWdub3JlZC5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogfiB+IH4gIFxyXG4gICAqICB+IH4gfiAgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIExpZ2h0QW1iaWVudCBleHRlbmRzIExpZ2h0IHtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRGlyZWN0aW9uYWwgbGlnaHQsIGlsbHVtaW5hdGluZyBldmVyeXRoaW5nIGZyb20gYSBzcGVjaWZpZWQgZGlyZWN0aW9uIHdpdGggaXRzIGNvbG9yIChsaWtlIHN0YW5kaW5nIGluIGJyaWdodCBzdW5saWdodCkgIFxyXG4gICAqIEF0dGFjaGVkIHRvIGEgbm9kZSBieSB7QGxpbmsgQ29tcG9uZW50TGlnaHR9LCB0aGUgcGl2b3QgbWF0cml4IHNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBsaWdodCBvbmx5LlxyXG4gICAqIGBgYHRleHRcclxuICAgKiAtLS0+ICBcclxuICAgKiAtLS0+ICBcclxuICAgKiAtLS0+ICBcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTGlnaHREaXJlY3Rpb25hbCBleHRlbmRzIExpZ2h0IHtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogT21uaWRpcmVjdGlvbmFsIGxpZ2h0IGVtaXR0aW5nIGZyb20gaXRzIHBvc2l0aW9uLCBpbGx1bWluYXRpbmcgb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlaXIgcG9zaXRpb24gYW5kIGRpc3RhbmNlIHdpdGggaXRzIGNvbG9yIChsaWtlIGEgY29sb3JlZCBsaWdodCBidWxiKSAgXHJcbiAgICogQXR0YWNoZWQgdG8gYSBub2RlIGJ5IHtAbGluayBDb21wb25lbnRMaWdodH0sIHRoZSBwaXZvdCBtYXRyaXggc3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGlnaHQsIGl0J3Mgc2hhcGUgYW5kIHJvdGF0aW9uLiBcclxuICAgKiBTbyB3aXRoIHVuZXZlbiBzY2FsaW5nLCBvdGhlciBzaGFwZXMgdGhhbiBhIHBlcmZlY3Qgc3BoZXJlLCBzdWNoIGFzIGFuIG92YWwgb3IgYSBkaXNjLCBhcmUgcG9zc2libGUsIHdoaWNoIGNyZWF0ZXMgYSB2aXNpYmxlIGVmZmVjdCBvZiB0aGUgcm90YXRpb24gdG9vLiBcclxuICAgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodCBkcm9wcyBsaW5lYXJseSBmcm9tIDEgaW4gdGhlIGNlbnRlciB0byAwIGF0IHRoZSBwZXJpbWV0ZXIgb2YgdGhlIHNoYXBlLlxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgIC5cXHwvLlxyXG4gICAqICAgICAgICAtLSBvIC0tXHJcbiAgICogICAgICAgICDCtC98XFxgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIExpZ2h0UG9pbnQgZXh0ZW5kcyBMaWdodCB7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNwb3QgbGlnaHQgZW1pdHRpbmcgd2l0aGluIGEgc3BlY2lmaWVkIGFuZ2xlIGZyb20gaXRzIHBvc2l0aW9uLCBpbGx1bWluYXRpbmcgb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlaXIgcG9zaXRpb24gYW5kIGRpc3RhbmNlIHdpdGggaXRzIGNvbG9yICBcclxuICAgKiBBdHRhY2hlZCB0byBhIG5vZGUgYnkge0BsaW5rIENvbXBvbmVudExpZ2h0fSwgdGhlIHBpdm90IG1hdHJpeCBzcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsaWdodCwgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIHNpemUgYW5kIGFuZ2xlcyBvZiB0aGUgY29uZS5cclxuICAgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodCBkcm9wcyBsaW5lYXJseSBmcm9tIDEgaW4gdGhlIGNlbnRlciB0byAwIGF0IHRoZSBvdXRlciBsaW1pdHMgb2YgdGhlIGNvbmUuXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAgIG8gIFxyXG4gICAqICAgICAgICAgL3xcXCAgXHJcbiAgICogICAgICAgIC8gfCBcXCBcclxuICAgKiBgYGAgICBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTGlnaHRTcG90IGV4dGVuZHMgTGlnaHQge1xyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIi4uL0xpZ2h0L0xpZ2h0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyBpZGVudGlmaWVycyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgbGlnaHQgdGhpcyBjb21wb25lbnQgY2FuIHByb3ZpZGUuICBcclxuICAgKi9cclxuICAvLyBleHBvcnQgbGV0IExJR0hUX1RZUEU6IHsgW3R5cGU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gIGV4cG9ydCBlbnVtIExJR0hUX1RZUEUge1xyXG4gICAgQU1CSUVOVCA9IFwiTGlnaHRBbWJpZW50XCIsXHJcbiAgICBESVJFQ1RJT05BTCA9IFwiTGlnaHREaXJlY3Rpb25hbFwiLFxyXG4gICAgUE9JTlQgPSBcIkxpZ2h0UG9pbnRcIixcclxuICAgIFNQT1QgPSBcIkxpZ2h0U3BvdFwiXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAgKiBBdHRhY2hlcyBhIHtAbGluayBMaWdodH0gdG8gdGhlIG5vZGVcclxuICAgICogVGhlIHBpdm90IG1hdHJpeCBoYXMgZGlmZmVyZW50IGVmZmVjdHMgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZSB7QGxpbmsgTGlnaHR9LiBTZWUgdGhlcmUgZm9yIGRldGFpbHMuXHJcbiAgICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRMaWdodCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50TGlnaHQpO1xyXG5cclxuICAgIC8vIHByaXZhdGUgc3RhdGljIGNvbnN0cnVjdG9yczogeyBbdHlwZTogc3RyaW5nXTogR2VuZXJhbCB9ID0geyBbTElHSFRfVFlQRS5BTUJJRU5UXTogTGlnaHRBbWJpZW50LCBbTElHSFRfVFlQRS5ESVJFQ1RJT05BTF06IExpZ2h0RGlyZWN0aW9uYWwsIFtMSUdIVF9UWVBFLlBPSU5UXTogTGlnaHRQb2ludCwgW0xJR0hUX1RZUEUuU1BPVF06IExpZ2h0U3BvdCB9O1xyXG4gICAgcHVibGljIG10eFBpdm90OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgIHB1YmxpYyBsaWdodDogTGlnaHQgPSBudWxsO1xyXG4gICAgLy9UT0RPOiBzaW5jZSB0aGVyZSBpcyBhbG1vc3Qgbm8gZnVuY3Rpb25hbGl0eSBsZWZ0IGluIExpZ2h0LCBlbGltaW5hdGUgaXQgYW5kIHB1dCBhbGwgaW4gdGhlIGNvbXBvbmVudCBhcyB3aXRoIHRoZSBjYW1lcmEuLi5cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2xpZ2h0OiBMaWdodCA9IG5ldyBMaWdodEFtYmllbnQoKSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNpbmdsZXRvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxpZ2h0ID0gX2xpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHVzZSBUeXBlT2ZMaWdodCBhcyByZXR1cm4gdHlwZT9cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0eXBlIG9mIHtAbGluayBMaWdodH0gdXNlZCBieSB0aGlzIGNvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFR5cGU8VCBleHRlbmRzIExpZ2h0PihfY2xhc3M6IG5ldyAoKSA9PiBUKTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHJPbGQ6IE11dGF0b3IgPSB7fTtcclxuICAgICAgaWYgKHRoaXMubGlnaHQpXHJcbiAgICAgICAgbXRyT2xkID0gdGhpcy5saWdodC5nZXRNdXRhdG9yKCk7XHJcblxyXG4gICAgICB0aGlzLmxpZ2h0ID0gbmV3IF9jbGFzcygpO1xyXG4gICAgICB0aGlzLmxpZ2h0Lm11dGF0ZShtdHJPbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHBpdm90OiB0aGlzLm10eFBpdm90LnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIGxpZ2h0OiBTZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLmxpZ2h0KVxyXG4gICAgICB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgYXdhaXQgdGhpcy5tdHhQaXZvdC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5waXZvdCk7XHJcbiAgICAgIHRoaXMubGlnaHQgPSBhd2FpdCA8UHJvbWlzZTxMaWdodD4+U2VyaWFsaXplci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5saWdodCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IudHlwZSA9IHRoaXMubGlnaHQuZ2V0VHlwZSgpLm5hbWU7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy50eXBlKVxyXG4gICAgICAgIHR5cGVzLnR5cGUgPSBMSUdIVF9UWVBFO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCB0eXBlOiBzdHJpbmcgPSBfbXV0YXRvci50eXBlO1xyXG4gICAgICBpZiAodHlwZW9mICh0eXBlKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlICE9IHRoaXMubGlnaHQuY29uc3RydWN0b3IubmFtZSlcclxuICAgICAgICB0aGlzLnNldFR5cGUoU2VyaWFsaXplci5nZXRDb25zdHJ1Y3RvcjxMaWdodD4odHlwZSkpO1xyXG4gICAgICBkZWxldGUgKF9tdXRhdG9yLnR5cGUpOyAvLyBleGNsdWRlIGxpZ2h0IHR5cGUgZnJvbSBmdXJ0aGVyIG11dGF0aW9uXHJcbiAgICAgIHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgX211dGF0b3IudHlwZSA9IHR5cGU7IC8vIHJlY29uc3RydWN0IG11dGF0b3JcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vcygpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFNoYXBlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm5vZGUubXR4V29ybGQsIHRoaXMubXR4UGl2b3QpO1xyXG4gICAgICBtdHhTaGFwZS5zY2FsaW5nID0gbmV3IFZlY3RvcjMoMC41LCAwLjUsIDAuNSk7XHJcbiAgICAgIEdpem1vcy5kcmF3SWNvbihUZXh0dXJlRGVmYXVsdC5pY29uTGlnaHQsIG10eFNoYXBlLCB0aGlzLmxpZ2h0LmNvbG9yKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4U2hhcGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgZHJhd0dpem1vc1NlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgICBsZXQgbXR4U2hhcGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMubm9kZS5tdHhXb3JsZCwgdGhpcy5tdHhQaXZvdCk7XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBDb2xvci5DU1MoXCJ5ZWxsb3dcIik7XHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMubGlnaHQuZ2V0VHlwZSgpKSB7XHJcbiAgICAgICAgY2FzZSBMaWdodERpcmVjdGlvbmFsOlxyXG4gICAgICAgICAgY29uc3QgcmFkaXVzOiBudW1iZXIgPSAwLjU7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd1dpcmVDaXJjbGUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgICAgICAgIGNvbnN0IGxpbmVzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkoMTApLmZpbGwobnVsbCkubWFwKCgpID0+IFJlY3ljbGVyLmdldChWZWN0b3IzKSk7XHJcbiAgICAgICAgICBsaW5lc1swXS5zZXQoMCwgMCwgMCk7IGxpbmVzWzFdLnNldCgwLCAwLCAxKTtcclxuICAgICAgICAgIGxpbmVzWzJdLnNldCgwLCByYWRpdXMsIDApOyBsaW5lc1szXS5zZXQoMCwgcmFkaXVzLCAxKTtcclxuICAgICAgICAgIGxpbmVzWzZdLnNldCgwLCAtcmFkaXVzLCAwKTsgbGluZXNbN10uc2V0KDAsIC1yYWRpdXMsIDEpO1xyXG4gICAgICAgICAgbGluZXNbNF0uc2V0KHJhZGl1cywgMCwgMCk7IGxpbmVzWzVdLnNldChyYWRpdXMsIDAsIDEpO1xyXG4gICAgICAgICAgbGluZXNbOF0uc2V0KC1yYWRpdXMsIDAsIDApOyBsaW5lc1s5XS5zZXQoLXJhZGl1cywgMCwgMSk7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd0xpbmVzKGxpbmVzLCBtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgICAgICAgUmVjeWNsZXIuc3RvcmVNdWx0aXBsZSguLi5saW5lcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExpZ2h0UG9pbnQ6XHJcbiAgICAgICAgICBtdHhTaGFwZS5zY2FsZShuZXcgVmVjdG9yMygyLCAyLCAyKSk7XHJcbiAgICAgICAgICBHaXptb3MuZHJhd1dpcmVTcGhlcmUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTGlnaHRTcG90OlxyXG4gICAgICAgICAgR2l6bW9zLmRyYXdXaXJlQ29uZShtdHhTaGFwZSwgY29sb3IpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlTXVsdGlwbGUobXR4U2hhcGUsIGNvbG9yKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHtAbGluayBNYXRlcmlhbH0gdG8gdGhlIG5vZGVcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOSAtIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50TWF0ZXJpYWwgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudE1hdGVyaWFsKTtcclxuICAgIHB1YmxpYyBjbHJQcmltYXJ5OiBDb2xvciA9IENvbG9yLkNTUyhcIndoaXRlXCIpO1xyXG4gICAgcHVibGljIGNsclNlY29uZGFyeTogQ29sb3IgPSBDb2xvci5DU1MoXCJ3aGl0ZVwiKTtcclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4M3gzID0gTWF0cml4M3gzLklERU5USVRZKCk7XHJcbiAgICBwdWJsaWMgbWF0ZXJpYWw6IE1hdGVyaWFsO1xyXG4gICAgLyoqIFN1cHBvcnQgc29ydGluZyBvZiBvYmplY3RzIHdpdGggdHJhbnNwYXJlbmN5IHdoZW4gcmVuZGVyaW5nLCByZW5kZXIgb2JqZWN0cyBpbiB0aGUgYmFjayBmaXJzdC4gV2hlbiB0aGlzIGNvbXBvbmVudCBpcyB1c2VkIGFzIGEgcGFydCBvZiBhIHtAbGluayBQYXJ0aWNsZVN5c3RlbX0sIHRyeSBlbmFibGluZyB0aGlzIHdoZW4gZGlzYWJsaW5nIHtAbGluayBDb21wb25lbnRQYXJ0aWNsZVN5c3RlbS5kZXB0aE1hc2t9ICovXHJcbiAgICBwdWJsaWMgc29ydEZvckFscGhhOiBib29sZWFuID0gZmFsc2U7IC8vIFRPRE86IG1heWJlIG1ha2UgdGhpcyBhIHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbD9cclxuICAgIC8vIHB1YmxpYyBtdXRhdG9yQ29hdDogTXV0YXRvckZvckNvbXBvbmVudDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX21hdGVyaWFsOiBNYXRlcmlhbCA9IG51bGwpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5tYXRlcmlhbCA9IF9tYXRlcmlhbDtcclxuICAgICAgLy8gdGhpcy5tdXRhdG9yQ29hdCA9IF9tYXRlcmlhbC5nZXRDb2F0KCkuZ2V0TXV0YXRvckZvckNvbXBvbmVudCgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIHNvcnRGb3JBbHBoYTogdGhpcy5zb3J0Rm9yQWxwaGEsXHJcbiAgICAgICAgY2xyUHJpbWFyeTogdGhpcy5jbHJQcmltYXJ5LnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIGNsclNlY29uZGFyeTogdGhpcy5jbHJTZWNvbmRhcnkuc2VyaWFsaXplKCksXHJcbiAgICAgICAgcGl2b3Q6IHRoaXMubXR4UGl2b3Quc2VyaWFsaXplKCksXHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKSxcclxuICAgICAgICBpZE1hdGVyaWFsOiB0aGlzLm1hdGVyaWFsLmlkUmVzb3VyY2VcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMubWF0ZXJpYWwgPSA8TWF0ZXJpYWw+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZE1hdGVyaWFsKTtcclxuICAgICAgYXdhaXQgdGhpcy5jbHJQcmltYXJ5LmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmNsclByaW1hcnkpO1xyXG4gICAgICBhd2FpdCB0aGlzLmNsclNlY29uZGFyeS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5jbHJTZWNvbmRhcnkpO1xyXG4gICAgICB0aGlzLnNvcnRGb3JBbHBoYSA9IF9zZXJpYWxpemF0aW9uLnNvcnRGb3JBbHBoYTtcclxuICAgICAgYXdhaXQgdGhpcy5tdHhQaXZvdC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5waXZvdCk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIGdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlKCk6IE11dGF0b3JGb3JVc2VySW50ZXJmYWNlIHtcclxuICAgIC8vICAgbGV0IG11dGF0b3JDb2F0OiBNdXRhdG9yRm9yQ29tcG9uZW50ID0gdGhpcy5tYXRlcmlhbC5nZXRDb2F0KCkuZ2V0TXV0YXRvckZvckNvbXBvbmVudCgpO1xyXG4gICAgLy8gICByZXR1cm4gPE11dGF0b3JGb3JVc2VySW50ZXJmYWNlPjx1bmtub3duPm11dGF0b3JDb2F0O1xyXG4gICAgLy8gfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQXR0YWNoZXMgYSB7QGxpbmsgTWVzaH0gdG8gdGhlIG5vZGVcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRNZXNoIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRNZXNoKTtcclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgcHVibGljIG1lc2g6IE1lc2g7XHJcbiAgICBwdWJsaWMgc2tlbGV0b246IENvbXBvbmVudFNrZWxldG9uO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbWVzaD86IE1lc2gsIF9za2VsZXRvbj86IENvbXBvbmVudFNrZWxldG9uKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubWVzaCA9IF9tZXNoO1xyXG4gICAgICB0aGlzLnNrZWxldG9uID0gX3NrZWxldG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcmFkaXVzKCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5tdHhXb3JsZC5zY2FsaW5nO1xyXG4gICAgICBsZXQgc2NhbGU6IG51bWJlciA9IE1hdGgubWF4KE1hdGguYWJzKHNjYWxpbmcueCksIE1hdGguYWJzKHNjYWxpbmcueSksIE1hdGguYWJzKHNjYWxpbmcueikpO1xyXG4gICAgICByZXR1cm4gdGhpcy5tZXNoLnJhZGl1cyAqIHNjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC8qKlxyXG4gICAgLy8gICogQ2FsY3VsYXRlcyB0aGUgcG9zaXRpb24gb2YgYSB2ZXJ0ZXggdHJhbnNmb3JtZWQgYnkgdGhlIHNrZWxldG9uXHJcbiAgICAvLyAgKiBAcGFyYW0gX2luZGV4IGluZGV4IG9mIHRoZSB2ZXJ0ZXhcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIGdldFZlcnRleFBvc2l0aW9uKF9pbmRleDogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAvLyAgIC8vIGV4dHJhY3QgdGhlIHZlcnRleCBkYXRhICh2ZXJ0aWNlczogM0QgdmVjdG9ycywgYm9uZSBpbmRpY2VzICYgd2VpZ2h0czogNEQgdmVjdG9ycylcclxuICAgIC8vICAgY29uc3QgaVZlcnRleDogbnVtYmVyID0gX2luZGV4ICogMztcclxuICAgIC8vICAgY29uc3QgaUJvbmVJbmZsdWVuY2U6IG51bWJlciA9IF9pbmRleCAqIDQ7XHJcblxyXG4gICAgLy8gICBjb25zdCB2ZXJ0ZXg6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMyguLi5SZWZsZWN0LmdldCh0aGlzLm1lc2gsIFwicmVuZGVyTWVzaFwiKS52ZXJ0aWNlcy5zbGljZShpVmVydGV4LCBpVmVydGV4ICsgMykpO1xyXG4gICAgLy8gICBpZiAoISh0aGlzLm1lc2ggaW5zdGFuY2VvZiBNZXNoU2tpbikpIHJldHVybiB2ZXJ0ZXg7XHJcblxyXG4gICAgLy8gICBjb25zdCBpQm9uZXM6IFVpbnQ4QXJyYXkgPSB0aGlzLm1lc2guaUJvbmVzLnNsaWNlKGlCb25lSW5mbHVlbmNlLCBpQm9uZUluZmx1ZW5jZSArIDQpO1xyXG4gICAgLy8gICBjb25zdCB3ZWlnaHRzOiBGbG9hdDMyQXJyYXkgPSB0aGlzLm1lc2gud2VpZ2h0cy5zbGljZShpQm9uZUluZmx1ZW5jZSwgaUJvbmVJbmZsdWVuY2UgKyA0KTtcclxuXHJcbiAgICAvLyAgIC8vIGdldCBib25lIG1hdHJpY2VzXHJcbiAgICAvLyAgIGNvbnN0IG10eEJvbmVzOiBBcnJheTxNYXRyaXg0eDQ+ID0gdGhpcy5za2VsZXRvbi5tdHhCb25lcztcclxuXHJcbiAgICAvLyAgIC8vIHNraW4gbWF0cml4IFMgPSBzdW1faT0xXm17d19pICogQl9pfVxyXG4gICAgLy8gICBjb25zdCBza2luTWF0cml4OiBNYXRyaXg0eDQgPSBuZXcgTWF0cml4NHg0KCk7XHJcbiAgICAvLyAgIHNraW5NYXRyaXguc2V0KEFycmF5XHJcbiAgICAvLyAgICAgLmZyb20oaUJvbmVzKVxyXG4gICAgLy8gICAgIC5tYXAoKGlCb25lLCBpV2VpZ2h0KSA9PiBtdHhCb25lc1tpQm9uZV0uZ2V0KCkubWFwKHZhbHVlID0+IHZhbHVlICogd2VpZ2h0c1tpV2VpZ2h0XSkpIC8vIGFwcGx5IHdlaWdodCBvbiBlYWNoIG1hdHJpeFxyXG4gICAgLy8gICAgIC5yZWR1Y2UoKG10eFN1bSwgbXR4Qm9uZSkgPT4gbXR4U3VtLm1hcCgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSArIG10eEJvbmVbaW5kZXhdKSkgLy8gc3VtIHVwIHRoZSBtYXRyaWNlc1xyXG4gICAgLy8gICApO1xyXG5cclxuICAgIC8vICAgLy8gdHJhbnNmb3JtIHZlcnRleFxyXG4gICAgLy8gICB2ZXJ0ZXgudHJhbnNmb3JtKHNraW5NYXRyaXgpO1xyXG5cclxuICAgIC8vICAgcmV0dXJuIHZlcnRleDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBUT0RPOiByZW1vdmUgb3IgdGhpbmsgaWYgdGhlIHRyYW5zZm9ybWVkIGJvdW5kaW5nIGJveCBpcyBvZiB2YWx1ZSBvciBjYW4gYmUgbWFkZSB0byBiZVxyXG4gICAgLy8gcHVibGljIGdldCBib3VuZGluZ0JveCgpOiBCb3gge1xyXG4gICAgLy8gICBsZXQgYm94OiBCb3ggPSBSZWN5Y2xlci5nZXQoQm94KTtcclxuICAgIC8vICAgYm94LnNldChcclxuICAgIC8vICAgICBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKHRoaXMubWVzaC5ib3VuZGluZ0JveC5taW4sIHRoaXMubXR4V29ybGQsIHRydWUpLFxyXG4gICAgLy8gICAgIFZlY3RvcjMuVFJBTlNGT1JNQVRJT04odGhpcy5tZXNoLmJvdW5kaW5nQm94Lm1heCwgdGhpcy5tdHhXb3JsZCwgdHJ1ZSlcclxuICAgIC8vICAgKTtcclxuICAgIC8vICAgcmV0dXJuIGJveDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uO1xyXG4gICAgICAvKiBhdCB0aGlzIHBvaW50IG9mIHRpbWUsIHNlcmlhbGl6YXRpb24gYXMgcmVzb3VyY2UgYW5kIGFzIGlubGluZSBvYmplY3QgaXMgcG9zc2libGUuIFRPRE86IGNoZWNrIGlmIGlubGluZSBiZWNvbWVzIG9ic29sZXRlICovXHJcbiAgICAgIGxldCBpZE1lc2g6IHN0cmluZyA9IHRoaXMubWVzaC5pZFJlc291cmNlO1xyXG4gICAgICBpZiAoaWRNZXNoKVxyXG4gICAgICAgIHNlcmlhbGl6YXRpb24gPSB7IGlkTWVzaDogaWRNZXNoIH07XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzZXJpYWxpemF0aW9uID0geyBtZXNoOiBTZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLm1lc2gpIH07XHJcblxyXG4gICAgICBpZiAodGhpcy5za2VsZXRvbilcclxuICAgICAgICBzZXJpYWxpemF0aW9uLnNrZWxldG9uID0gTm9kZS5QQVRIX0ZST01fVE8odGhpcywgdGhpcy5za2VsZXRvbik7XHJcblxyXG4gICAgICBzZXJpYWxpemF0aW9uLnBpdm90ID0gdGhpcy5tdHhQaXZvdC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBsZXQgbWVzaDogTWVzaDtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmlkTWVzaClcclxuICAgICAgICBtZXNoID0gPE1lc2g+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZE1lc2gpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgbWVzaCA9IDxNZXNoPmF3YWl0IFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ubWVzaCk7XHJcbiAgICAgIHRoaXMubWVzaCA9IG1lc2g7XHJcblxyXG4gICAgICBpZiAoX3NlcmlhbGl6YXRpb24uc2tlbGV0b24pIHtcclxuICAgICAgICBjb25zdCBobmROb2RlRGVzZXJpYWxpemVkOiBFdmVudExpc3RlbmVyVW5pZmllZCA9ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGhuZEdyYXBoRGVzZXJpYWxpemVkOiBFdmVudExpc3RlbmVyVW5pZmllZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5za2VsZXRvbiA9IE5vZGUuRklORCh0aGlzLCBfc2VyaWFsaXphdGlvbi5za2VsZXRvbikgYXMgQ29tcG9uZW50U2tlbGV0b247XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0RFU0VSSUFMSVpFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQpO1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HUkFQSF9JTlNUQU5USUFURUQsIGhuZEdyYXBoRGVzZXJpYWxpemVkKTtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5HUkFQSF9ERVNFUklBTElaRUQsIGhuZEdyYXBoRGVzZXJpYWxpemVkLCB0cnVlKTtcclxuICAgICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdSQVBIX0lOU1RBTlRJQVRFRCwgaG5kR3JhcGhEZXNlcmlhbGl6ZWQsIHRydWUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVTRVJJQUxJWkVELCBobmROb2RlRGVzZXJpYWxpemVkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgdGhpcy5tdHhQaXZvdC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5waXZvdCk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlKCk6IE11dGF0b3JGb3JVc2VySW50ZXJmYWNlIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3JGb3JVc2VySW50ZXJmYWNlID0gPE11dGF0b3JGb3JVc2VySW50ZXJmYWNlPnRoaXMuZ2V0TXV0YXRvcigpO1xyXG4gICAgICAvLyBpZiAoIXRoaXMubWVzaClcclxuICAgICAgLy8gICBtdXRhdG9yLm1lc2ggPSBNZXNoO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zU2VsZWN0ZWQoKTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5tZXNoKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IENvbG9yLkNTUyhcInNhbG1vblwiKTtcclxuICAgICAgR2l6bW9zLmRyYXdXaXJlTWVzaCh0aGlzLm1lc2gsIHRoaXMubXR4V29ybGQsIGNvbG9yLCAwLjEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShjb2xvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGVudW0gUEFSVElDTEVfU1lTVEVNX1BMQVlNT0RFIHtcclxuICAgIC8qKlBsYXlzIHBhcnRpY2xlIHN5c3RlbSBpbiBhIGxvb3A6IGl0IHJlc3RhcnRzIG9uY2UgaXQgaGl0IHRoZSBlbmQuKi9cclxuICAgIExPT1AsXHJcbiAgICAvKipQbGF5cyBwYXJ0aWNsZSBzeXN0ZW0gb25jZSBhbmQgc3RvcHMgYXQgdGhlIGxhc3QgcG9pbnQgaW4gdGltZS4qL1xyXG4gICAgUExBWV9PTkNFXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHtAbGluayBQYXJ0aWNsZVN5c3RlbX0gdG8gdGhlIG5vZGUuIFxyXG4gICAqIFdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIENvbXBvbmVudE1lc2h9IGFuZCB7QGxpbmsgQ29tcG9uZW50TWF0ZXJpYWx9IHRvIGNyZWF0ZSBhIHNoYWRlciBwYXJ0aWNsZSBzeXN0ZW0uXHJcbiAgICogQWRkaXRpb25hbGx5IGEge0BsaW5rIENvbXBvbmVudEZhY2VDYW1lcmF9IGNhbiBiZSBhdHRhY2hlZCB0byBtYWtlIHRoZSBwYXJ0aWNsZXMgZmFjZSB0aGUgY2FtZXJhLlxyXG4gICAqIEBhdXRob3IgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yQ29tcG9uZW50UGFydGljbGVTeXN0ZW0uZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50UGFydGljbGVTeXN0ZW0gZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudFBhcnRpY2xlU3lzdGVtKTtcclxuICAgIHB1YmxpYyBwYXJ0aWNsZVN5c3RlbTogUGFydGljbGVTeXN0ZW07XHJcbiAgICAvKiogV2hlbiBkaXNhYmxlZCB0cnkgZW5hYmxpbmcge0BsaW5rIENvbXBvbmVudE1hdGVyaWFsLnNvcnRGb3JBbHBoYX0gKi9cclxuICAgIHB1YmxpYyBkZXB0aE1hc2s6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgYmxlbmRNb2RlOiBCTEVORDtcclxuICAgIHB1YmxpYyBwbGF5TW9kZTogUEFSVElDTEVfU1lTVEVNX1BMQVlNT0RFO1xyXG4gICAgcHVibGljIGR1cmF0aW9uOiBudW1iZXI7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCBBIHRleHR1cmUgZmlsZWQgd2l0aCByYW5kb20gbnVtYmVycy4gVXNlZCBieSB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgcHJvdGVjdGVkIHJlbmRlckRhdGE6IHVua25vd247XHJcblxyXG4gICAgLyoqIFRoZSBudW1iZXIgb2YgcGFydGljbGVzICovXHJcbiAgICAjc2l6ZTogbnVtYmVyO1xyXG4gICAgI3RpbWVTY2FsZTogbnVtYmVyID0gMTtcclxuICAgIHJlYWRvbmx5ICN0aW1lOiBUaW1lO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcGFydGljbGVTeXN0ZW06IFBhcnRpY2xlU3lzdGVtID0gbnVsbCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnBhcnRpY2xlU3lzdGVtID0gX3BhcnRpY2xlU3lzdGVtO1xyXG4gICAgICB0aGlzLmRlcHRoTWFzayA9IHRydWU7XHJcbiAgICAgIHRoaXMuYmxlbmRNb2RlID0gQkxFTkQuQURESVRJVkU7XHJcbiAgICAgIHRoaXMucGxheU1vZGUgPSBQQVJUSUNMRV9TWVNURU1fUExBWU1PREUuTE9PUDtcclxuICAgICAgdGhpcy5kdXJhdGlvbiA9IDEwMDA7XHJcbiAgICAgIHRoaXMuc2l6ZSA9IDEwO1xyXG4gICAgICB0aGlzLiN0aW1lID0gbmV3IFRpbWUoKTtcclxuXHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLmhuZEV2ZW50KTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBudW1iZXIgb2YgcGFydGljbGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIHBhcnRpY2xlcy4gQ2F1dGlvbjogU2V0dGluZyB0aGlzIHdpbGwgcmVpbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVycyBhcnJheSh0ZXh0dXJlKSB1c2VkIGluIHRoZSBzaGFkZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgc2l6ZShfc2l6ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NpemUgPSBfc2l6ZTtcclxuICAgICAgdGhpcy5kZWxldGVSZW5kZXJEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0aW1lKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0aW1lLmdldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdGltZShfdGltZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3RpbWUuc2V0KF90aW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWVTY2FsZSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGltZVNjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdGltZVNjYWxlKF9zY2FsZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3RpbWVTY2FsZSA9IF9zY2FsZTtcclxuICAgICAgdGhpcy51cGRhdGVUaW1lU2NhbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBHZW5lcmF0ZXMgYW5kIGJpbmRzIHRoZSByYW5kb20gbnVtYmVycyB0ZXh0dXJlIGluIFdlYkdMXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWwgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1c2VSZW5kZXJEYXRhKCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIERlbGV0ZXMgdGhlIHJhbmRvbSBudW1iZXJzIHRleHR1cmUgaW4gV2ViR0wgZnJlZWluZyB0aGUgYWxsb2NhdGVkIGdwdSBtZW1vcnkuXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JDb21wb25lbnRQYXJ0aWNsZVN5c3RlbX0uIFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVSZW5kZXJEYXRhKCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG5cclxuICAgIC8vI3JlZ2lvbiB0cmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKSxcclxuICAgICAgICBpZFBhcnRpY2xlU3lzdGVtOiB0aGlzLnBhcnRpY2xlU3lzdGVtPy5pZFJlc291cmNlLFxyXG4gICAgICAgIGRlcHRoTWFzazogdGhpcy5kZXB0aE1hc2ssXHJcbiAgICAgICAgYmxlbmRNb2RlOiB0aGlzLmJsZW5kTW9kZSxcclxuICAgICAgICBwbGF5TW9kZTogdGhpcy5wbGF5TW9kZSxcclxuICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcclxuICAgICAgICBzaXplOiB0aGlzLnNpemVcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmlkUGFydGljbGVTeXN0ZW0pIHRoaXMucGFydGljbGVTeXN0ZW0gPSA8UGFydGljbGVTeXN0ZW0+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZFBhcnRpY2xlU3lzdGVtKTtcclxuICAgICAgdGhpcy5kZXB0aE1hc2sgPSBfc2VyaWFsaXphdGlvbi5kZXB0aE1hc2s7XHJcbiAgICAgIHRoaXMuYmxlbmRNb2RlID0gX3NlcmlhbGl6YXRpb24uYmxlbmRNb2RlO1xyXG4gICAgICB0aGlzLnBsYXlNb2RlID0gX3NlcmlhbGl6YXRpb24ucGxheU1vZGU7XHJcbiAgICAgIHRoaXMuZHVyYXRpb24gPSBfc2VyaWFsaXphdGlvbi5kdXJhdGlvbjtcclxuICAgICAgdGhpcy5zaXplID0gX3NlcmlhbGl6YXRpb24uc2l6ZTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKF9leHRlbmRhYmxlPzogYm9vbGVhbik6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3Iuc2l6ZSA9IHRoaXMuc2l6ZTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlKCk6IE11dGF0b3JGb3JVc2VySW50ZXJmYWNlIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3JGb3JVc2VySW50ZXJmYWNlID0gPE11dGF0b3JGb3JVc2VySW50ZXJmYWNlPnRoaXMuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgZGVsZXRlIG11dGF0b3IucGFydGljbGVTeXN0ZW07XHJcbiAgICAgIG11dGF0b3IucGFydGljbGVTeXN0ZW0gPSB0aGlzLnBhcnRpY2xlU3lzdGVtPy5nZXRNdXRhdG9yRm9yVXNlckludGVyZmFjZSgpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckZvckFuaW1hdGlvbigpOiBNdXRhdG9yRm9yQW5pbWF0aW9uIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3JGb3JBbmltYXRpb24gPSA8TXV0YXRvckZvckFuaW1hdGlvbj50aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgZGVsZXRlIG11dGF0b3IucGFydGljbGVTeXN0ZW07XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLnNpemU7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy5ibGVuZE1vZGUpXHJcbiAgICAgICAgdHlwZXMuYmxlbmRNb2RlID0gQkxFTkQ7XHJcbiAgICAgIGlmICh0eXBlcy5wbGF5TW9kZSlcclxuICAgICAgICB0eXBlcy5wbGF5TW9kZSA9IFBBUlRJQ0xFX1NZU1RFTV9QTEFZTU9ERTtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IucmFuZG9tTnVtYmVyc1JlbmRlckRhdGE7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci50aW1lO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgcHJpdmF0ZSBobmRFdmVudCA9IChfZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIHN3aXRjaCAoX2V2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlIEVWRU5ULk5PREVfREVTRVJJQUxJWkVEOlxyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX0FERDpcclxuICAgICAgICAgIFRpbWUuZ2FtZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRJTUVfU0NBTEVELCB0aGlzLnVwZGF0ZVRpbWVTY2FsZSk7XHJcbiAgICAgICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRU5ERVJfUFJFUEFSRSwgdGhpcy51cGRhdGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBFVkVOVC5DT01QT05FTlRfUkVNT1ZFOlxyXG4gICAgICAgICAgVGltZS5nYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVElNRV9TQ0FMRUQsIHRoaXMudXBkYXRlVGltZVNjYWxlKTtcclxuICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlJFTkRFUl9QUkVQQVJFLCB0aGlzLnVwZGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnRpbWUgPiB0aGlzLmR1cmF0aW9uKVxyXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGF5TW9kZSkge1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGNhc2UgUEFSVElDTEVfU1lTVEVNX1BMQVlNT0RFLkxPT1A6XHJcbiAgICAgICAgICAgIHRoaXMudGltZSA9IDA7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBQQVJUSUNMRV9TWVNURU1fUExBWU1PREUuUExBWV9PTkNFOlxyXG4gICAgICAgICAgICB0aGlzLnRpbWUgPSB0aGlzLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVTY2FsZSA9IDA7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVUaW1lU2NhbGUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgIGxldCB0aW1lU2NhbGU6IG51bWJlciA9IHRoaXMuI3RpbWVTY2FsZSAqIFRpbWUuZ2FtZS5nZXRTY2FsZSgpO1xyXG4gICAgICB0aGlzLiN0aW1lLnNldFNjYWxlKHRpbWVTY2FsZSk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBlbnVtIFBJQ0sge1xyXG4gICAgUkFESVVTID0gXCJyYWRpdXNcIixcclxuICAgIENBTUVSQSA9IFwiY2FtZXJhXCIsXHJcbiAgICBQSFlTSUNTID0gXCJwaHlzaWNzXCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIHBpY2tpbmcgZnVuY3Rpb25hbGl0eSB0byB0aGUgbm9kZVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFBpY2sgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudFBpY2spO1xyXG4gICAgcHVibGljIHBpY2s6IFBJQ0sgPSBQSUNLLlJBRElVUztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpY2tzIHRoZSBub2RlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ge0BsaW5rIFJheX0gYW5kIGludm9rZXMgZXZlbnRzIGFjY29yZGluZ2x5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrQW5kRGlzcGF0Y2goX3JheTogUmF5LCBfZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgICBsZXQgY21wTWVzaDogQ29tcG9uZW50TWVzaCA9IHRoaXMubm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCk7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IGNtcE1lc2ggPyBjbXBNZXNoLm10eFdvcmxkLnRyYW5zbGF0aW9uIDogdGhpcy5ub2RlLm10eFdvcmxkLnRyYW5zbGF0aW9uO1xyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLnBpY2spIHtcclxuICAgICAgICBjYXNlIFBJQ0suUkFESVVTOlxyXG4gICAgICAgICAgLy8gVE9ETzogc2hvdWxkIG9ubHkgYmUgbm9kZS5yYWRpdXMuIEFkanVzdG1lbnQgbmVlZGVkLCBpZiBtZXNoIHdhcyB0cmFuc2Zvcm1lZC4uLlxyXG4gICAgICAgICAgaWYgKF9yYXkuZ2V0RGlzdGFuY2UocG9zaXRpb24pLm1hZ25pdHVkZSA8IHRoaXMubm9kZS5yYWRpdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLmRpc3BhdGNoRXZlbnQoX2V2ZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSy5QSFlTSUNTOlxyXG4gICAgICAgICAgbGV0IGhpdEluZm86IFJheUhpdEluZm8gPSBQaHlzaWNzLnJheWNhc3QoX3JheS5vcmlnaW4sIF9yYXkuZGlyZWN0aW9uLCBWZWN0b3IzLkRJRkZFUkVOQ0UocG9zaXRpb24sIF9yYXkub3JpZ2luKS5tYWduaXR1ZGVTcXVhcmVkKTtcclxuICAgICAgICAgIGlmIChoaXRJbmZvLmhpdClcclxuICAgICAgICAgICAgdGhpcy5ub2RlLmRpc3BhdGNoRXZlbnQoX2V2ZW50KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vVE9ETzogUElDSy5DQU1FUkFcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy5waWNrKVxyXG4gICAgICAgIHR5cGVzLnBpY2sgPSBQSUNLO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQmFzZSBjbGFzcyBmb3Igc2NyaXB0cyB0aGUgdXNlciB3cml0ZXNcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ocy1mdXJ0d2FuZ2VuL0ZVREdFL3dpa2kvQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFNjcmlwdCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICAvLyByZWdpc3RlcmluZyB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSwgb25seSBpdHMgc3ViY2xhc3Nlcy4gT3IgdGhpcyBjb21wb25lbnQgbXVzdCByZWZlciB0byBzY3JpcHRzIHRvIGJlIGF0dGFjaGVkIHRvIHRoaXMgY29tcG9uZW50XHJcbiAgICAvLyBUT0RPOiByZXRoaW5rICYgcmVmYWN0b3JcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRTY3JpcHQpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zaW5nbGV0b24gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQnVmZmVycyB0aGUgYm9uZSBkYXRhIGZyb20gdGhlIHtAbGluayBDb21wb25lbnRTa2VsZXRvbn0gaW50byBhIFdlYkdMIEJ1ZmZlclxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9uIHtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlY29yYXRlKF9jb25zdHJ1Y3RvcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwidXNlUmVuZGVyQnVmZmVyXCIsIHtcclxuICAgICAgICB2YWx1ZTogUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbi51c2VSZW5kZXJCdWZmZXJcclxuICAgICAgfSk7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY29uc3RydWN0b3IucHJvdG90eXBlLCBcInVwZGF0ZVJlbmRlckJ1ZmZlclwiLCB7XHJcbiAgICAgICAgdmFsdWU6IFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b24udXBkYXRlUmVuZGVyQnVmZmVyXHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJkZWxldGVSZW5kZXJCdWZmZXJcIiwge1xyXG4gICAgICAgIHZhbHVlOiBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9uLmRlbGV0ZVJlbmRlckJ1ZmZlclxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHVzZVJlbmRlckJ1ZmZlcih0aGlzOiBDb21wb25lbnRTa2VsZXRvbiwgX3NoYWRlcjogdHlwZW9mIFNoYWRlcik6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMucmVuZGVyQnVmZmVyKVxyXG4gICAgICAgIGNyYzMuYmluZEJ1ZmZlckJhc2UoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgVU5JRk9STV9CTE9DS1MuU0tJTi5CSU5ESU5HLCB0aGlzLnJlbmRlckJ1ZmZlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB1cGRhdGVSZW5kZXJCdWZmZXIodGhpczogQ29tcG9uZW50U2tlbGV0b24pOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5yZW5kZXJCdWZmZXIpIHtcclxuICAgICAgICBjb25zdCBib25lc0J5dGVTaXplOiBudW1iZXIgPSAyNTYgKiAxNiAqIDQ7IC8vIENBVVRJT046IHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBzaGFkZXIgc291cmNlIGNvZGUgd2hlcmUgMjU2IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBib25lc1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlckJ1ZmZlciA9IFJlbmRlcldlYkdMLmFzc2VydChjcmMzLmNyZWF0ZUJ1ZmZlcigpKTtcclxuICAgICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgdGhpcy5yZW5kZXJCdWZmZXIpO1xyXG4gICAgICAgIGNyYzMuYnVmZmVyRGF0YShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlVOSUZPUk1fQlVGRkVSLCBib25lc0J5dGVTaXplLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRZTkFNSUNfRFJBVyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRhdGE6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5tdHhCb25lcy5sZW5ndGggKiAxNik7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm10eEJvbmVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGRhdGEuc2V0KHRoaXMubXR4Qm9uZXNbaV0uZ2V0KCksIGkgKiAxNik7XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgdGhpcy5yZW5kZXJCdWZmZXIpO1xyXG4gICAgICBjcmMzLmJ1ZmZlclN1YkRhdGEoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTklGT1JNX0JVRkZFUiwgMCwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBkZWxldGVSZW5kZXJCdWZmZXIodGhpczogQ29tcG9uZW50U2tlbGV0b24pOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnJlbmRlckJ1ZmZlcilcclxuICAgICAgICBjcmMzLmRlbGV0ZUJ1ZmZlcih0aGlzLnJlbmRlckJ1ZmZlcik7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiLi8uLi9SZW5kZXIvUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbi50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvbGRzIGFuIGFycmF5IG9mIGJvbmVzICh7QGxpbmsgTm9kZX1zIHdpdGhpbiBhIHtAbGluayBHcmFwaH0pLiBSZWZlcmVuY2VkIGZyb20gYSB7QGxpbmsgQ29tcG9uZW50TWVzaH0gaXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBNZXNofSBhbmQgZW5hYmxlIHNraW5uaW5nIGZvciB0aGUgbWVzaC5cclxuICAgKiBAYXV0aG9ycyBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMi0yMDIzIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b24uZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50U2tlbGV0b24gZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgLyoqIFRoZSBib25lcyB1c2VkIGZvciBza2lubmluZyAqL1xyXG4gICAgcHVibGljIGJvbmVzOiBOb2RlW107XHJcbiAgICAvKiogV2hlbiBhcHBsaWVkIHRvIHZlcnRpY2VzLCBpdCBtb3ZlcyB0aGVtIGZyb20gb2JqZWN0L21vZGVsIHNwYWNlIHRvIGJvbmUtbG9jYWwgc3BhY2UgYXMgaWYgdGhlIGJvbmUgd2VyZSBhdCBpdHMgaW5pdGlhbCBwb3NlICovXHJcbiAgICBwdWJsaWMgbXR4QmluZEludmVyc2VzOiBNYXRyaXg0eDRbXTsgLy8gVE9ETzogdGhpbmsgYWJvdXQgc2VyaWFsaXppbmcgdGhpcyBzZXBhcmF0ZWx5IHRvIG1ha2UgaXQgc2hhcmVhYmxlIGJldHdlZW4gc2tlbGV0b24gc2VyaWFsaXphdGlvbnNcclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyQnVmZmVyOiB1bmtub3duO1xyXG4gICAgcHJvdGVjdGVkIHNpbmdsZXRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIENvbnRhaW5zIHRoZSBib25lIHRyYW5zZm9ybWF0aW9ucyBhcHBsaWNhYmxlIHRvIHRoZSB2ZXJ0aWNlcyBvZiBhIHtAbGluayBNZXNofSAqL1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG10eEJvbmVzOiBNYXRyaXg0eDRbXSA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9uZXM6IE5vZGVbXSA9IFtdLCBfbXR4Qm9uZUludmVyc2VzOiBNYXRyaXg0eDRbXSA9IFtdKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuYm9uZXMgPSBfYm9uZXM7XHJcbiAgICAgIHRoaXMubXR4QmluZEludmVyc2VzID0gX210eEJvbmVJbnZlcnNlcztcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmJvbmVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGlmICh0aGlzLm10eEJpbmRJbnZlcnNlc1tpXSA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5tdHhCaW5kSW52ZXJzZXNbaV0gPSB0aGlzLmJvbmVzW2ldLm10eFdvcmxkSW52ZXJzZS5jbG9uZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvckNvbXBvbmVudFNrZWxldG9ufS5cclxuICAgICAqIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVzZVJlbmRlckJ1ZmZlcihfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UpOiBSZW5kZXJCdWZmZXJzIHsgcmV0dXJuIG51bGw7IC8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JDb21wb25lbnRTa2VsZXRvbn0uXHJcbiAgICAgKiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVSZW5kZXJCdWZmZXIoKTogUmVuZGVyQnVmZmVycyB7IHJldHVybiBudWxsOyAvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yQ29tcG9uZW50U2tlbGV0b259LlxyXG4gICAgICogVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVuZGVyQnVmZmVyKCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5vZGUgYXMgYSBib25lIHdpdGggaXRzIGJpbmQgaW52ZXJzZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZEJvbmUoX2JvbmU6IE5vZGUsIF9tdHhCaW5kSW52ZXJzZTogTWF0cml4NHg0ID0gX2JvbmUubXR4V29ybGRJbnZlcnNlLmNsb25lKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYm9uZXMucHVzaChfYm9uZSk7XHJcbiAgICAgIHRoaXMubXR4QmluZEludmVyc2VzLnB1c2goX210eEJpbmRJbnZlcnNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJvbmUgaW4gdGhlIGJvbmVzIGFycmF5IHdoaWNoIGhhcyB0aGUgZ2l2ZW4gbmFtZSwgYW5kIC0xIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluZGV4T2YoX25hbWU6IHN0cmluZyk6IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgZ2l2ZW4gYm9uZSBub2RlIGluIHRoZSBib25lIGFycmF5LCBvciAtMSBpZiBpdCBpcyBub3QgcHJlc2VudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluZGV4T2YoX25vZGU6IE5vZGUpOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgaW5kZXhPZihfbmFtZTogc3RyaW5nIHwgTm9kZSk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9uYW1lKSA9PSBcInN0cmluZ1wiKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmJvbmVzLmZpbmRJbmRleCgoX2JvbmU6IE5vZGUpID0+IF9ib25lLm5hbWUgPT0gX25hbWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9uZXMuaW5kZXhPZihfbmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBib25lIG1hdHJpY2VzIHRvIGJlIHVzZWQgYnkgdGhlIHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlKCk6IHZvaWQge1xyXG4gICAgICBmb3IgKGNvbnN0IG10eEJvbmUgb2YgdGhpcy5tdHhCb25lcylcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhCb25lKTtcclxuICAgICAgdGhpcy5tdHhCb25lcy5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYm9uZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgbXR4Qm9uZTogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QodGhpcy5ib25lc1tpXS5tdHhXb3JsZCwgdGhpcy5tdHhCaW5kSW52ZXJzZXNbaV0pO1xyXG4gICAgICAgIHRoaXMubXR4Qm9uZXMucHVzaChtdHhCb25lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBwb3NlIG9mIHRoaXMgc2tlbGV0b24gdG8gdGhlIGRlZmF1bHQgcG9zZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXRQb3NlKCk6IHZvaWQgeyAvLyBUT0RPOiB0ZXN0IHRoaXNcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYm9uZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgdGhpcy5ib25lc1tpXS5tdHhMb2NhbC5jb3B5KE1hdHJpeDR4NC5JTlZFUlNFKHRoaXMubXR4QmluZEludmVyc2VzW2ldKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHt9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uYm9uZXMgPSB0aGlzLmJvbmVzLm1hcChfYm9uZSA9PiBOb2RlLlBBVEhfRlJPTV9UTyh0aGlzLCBfYm9uZSkpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLm10eEJpbmRJbnZlcnNlcyA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplQXJyYXkoTWF0cml4NHg0LCB0aGlzLm10eEJpbmRJbnZlcnNlcyk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8Q29tcG9uZW50U2tlbGV0b24+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG5cclxuICAgICAgY29uc3QgaG5kTm9kZURlc2VyaWFsaXplZDogRXZlbnRMaXN0ZW5lclVuaWZpZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ib25lcyA9IF9zZXJpYWxpemF0aW9uLmJvbmVzLm1hcCgoX3BhdGg6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgbGV0IGJvbmU6IE5vZGUgPSBOb2RlLkZJTkQodGhpcywgX3BhdGgpIGFzIE5vZGU7XHJcbiAgICAgICAgICBpZiAoIWJvbmUpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtOb2RlLm5hbWV9IFwiJHt0aGlzLm5vZGUubmFtZX1cIiAke0NvbXBvbmVudFNrZWxldG9uLm5hbWV9OiBDb3VsZCBub3QgZmluZCBib25lICR7X3BhdGh9YCk7XHJcbiAgICAgICAgICByZXR1cm4gYm9uZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIGhuZE5vZGVEZXNlcmlhbGl6ZWQpO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIGhuZE5vZGVEZXNlcmlhbGl6ZWQpO1xyXG5cclxuICAgICAgdGhpcy5tdHhCaW5kSW52ZXJzZXMgPSA8TWF0cml4NHg0W10+YXdhaXQgU2VyaWFsaXplci5kZXNlcmlhbGl6ZUFycmF5KF9zZXJpYWxpemF0aW9uLm10eEJpbmRJbnZlcnNlcyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhIHtAbGluayBUZXh0dXJlVGV4dH0gdG8gdGhlIG5vZGUuIFxyXG4gICAqIFdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIENvbXBvbmVudE1lc2h9IGFuZCB7QGxpbmsgQ29tcG9uZW50TWF0ZXJpYWx9IHRvIGNyZWF0ZSBhIHRleHQgbm9kZS5cclxuICAgKiBBICd0ZXh0dXJlZCcge0BsaW5rIE1hdGVyaWFsfSAoZS5nLiB7QGxpbmsgU2hhZGVyTGl0VGV4dHVyZWR9KSBtdXN0IGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgdGV4dCBwcm9wZXJseS4gSWRlYWxseSBhIHtAbGluayBNZXNoUXVhZH0gc2hvdWxkIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSB0ZXh0IG9udG8uXHJcbiAgICogQWRkaXRpb25hbGx5IGEge0BsaW5rIENvbXBvbmVudEZhY2VDYW1lcmF9IGNhbiBiZSBhdHRhY2hlZCB0byBtYWtlIHRoZSB0ZXh0IGZhY2UgdGhlIGNhbWVyYS5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50VGV4dCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50VGV4dCk7XHJcblxyXG4gICAgcHVibGljIHJlYWRvbmx5IHRleHR1cmU6IFRleHR1cmVUZXh0O1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG10eFdvcmxkOiBNYXRyaXg0eDQ7XHJcblxyXG4gICAgLyoqIC0gb246IFRoZSB0ZXh0cyBzaXplIGlzIGZpeGVkIHRvIG1hdGNoIHRoZSBzZXQgZm9udCBzaXplXHJcbiAgICAgKiAgLSBvZmY6IFRoZSBmb250IHNpemUgaXMgc3RyZXRjaGVkIHRvIG1hdGNoIHRoZSBhdHRhY2hlZCBtZXNoZXMgc2l6ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZml4ZWRTaXplOiBib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGV4dD86IHN0cmluZywgX2ZvbnQ/OiBzdHJpbmcpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmVUZXh0KENvbXBvbmVudFRleHQubmFtZSwgX3RleHQsIF9mb250KTtcclxuICAgICAgdGhpcy5tdHhXb3JsZCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICB0aGlzLmZpeGVkU2l6ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1c2VSZW5kZXJEYXRhKF9tdHhNZXNoVG9Xb3JsZDogTWF0cml4NHg0LCBfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEpOiBNYXRyaXg0eDQge1xyXG4gICAgICB0aGlzLnRleHR1cmUudXNlUmVuZGVyRGF0YShURVhUVVJFX0xPQ0FUSU9OLkNPTE9SLlVOSVQpO1xyXG4gICAgICB0aGlzLm10eFdvcmxkLmNvcHkoX210eE1lc2hUb1dvcmxkKTtcclxuXHJcbiAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZml4ZWRTaXplKSB7XHJcbiAgICAgICAgbGV0IHNjYWxlOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IHJlY3Q6IFJlY3RhbmdsZSA9IFJlbmRlci5nZXRSZW5kZXJSZWN0YW5nbGUoKTtcclxuICAgICAgICBzd2l0Y2ggKF9jbXBDYW1lcmEuZ2V0RGlyZWN0aW9uKCkpIHtcclxuICAgICAgICAgIGNhc2UgRklFTERfT0ZfVklFVy5WRVJUSUNBTDpcclxuICAgICAgICAgICAgc2NhbGUgPSAxIC8gcmVjdC5oZWlnaHQgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEZJRUxEX09GX1ZJRVcuSE9SSVpPTlRBTDpcclxuICAgICAgICAgICAgc2NhbGUgPSAxIC8gcmVjdC53aWR0aCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgRklFTERfT0ZfVklFVy5ESUFHT05BTDpcclxuICAgICAgICAgICAgc2NhbGUgPSAxIC8gTWF0aC5zcXJ0KChyZWN0LndpZHRoICogcmVjdC5oZWlnaHQpICogd2luZG93LmRldmljZVBpeGVsUmF0aW8pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkaXN0YW5jZTogbnVtYmVyID0gX2NtcENhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbi5nZXREaXN0YW5jZShfbXR4TWVzaFRvV29ybGQudHJhbnNsYXRpb24pO1xyXG4gICAgICAgIHNjYWxlID0gc2NhbGUgKiBkaXN0YW5jZTtcclxuICAgICAgICBzY2FsaW5nLnNldCh0aGlzLnRleHR1cmUud2lkdGggKiBzY2FsZSwgdGhpcy50ZXh0dXJlLmhlaWdodCAqIHNjYWxlLCAxKTtcclxuICAgICAgICB0aGlzLm10eFdvcmxkLnNjYWxpbmcgPSBzY2FsaW5nO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKGRpc3RhbmNlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcGl4ZWxzVG9Vbml0czogbnVtYmVyID0gMSAvIHRoaXMudGV4dHVyZS5oZWlnaHQ7XHJcbiAgICAgICAgc2NhbGluZy5zZXQodGhpcy50ZXh0dXJlLndpZHRoICogcGl4ZWxzVG9Vbml0cywgdGhpcy50ZXh0dXJlLmhlaWdodCAqIHBpeGVsc1RvVW5pdHMsIDEpO1xyXG4gICAgICAgIHRoaXMubXR4V29ybGQuc2NhbGUoc2NhbGluZyk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZShzY2FsaW5nKTtcclxuICAgICAgcmV0dXJuIHRoaXMubXR4V29ybGQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRyYXdHaXptb3NTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgICAgbGV0IG1lc2g6IE1lc2ggPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpPy5tZXNoO1xyXG4gICAgICBsZXQgY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsID0gdGhpcy5ub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCk7XHJcbiAgICAgIGlmIChtZXNoID09IG51bGwgfHwgY21wTWF0ZXJpYWwgPT0gbnVsbClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBHaXptb3MuZHJhd1dpcmVNZXNoKG1lc2gsIHRoaXMubXR4V29ybGQsIGNtcE1hdGVyaWFsLmNsclByaW1hcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IudGV4dHVyZS5uYW1lO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgZW51bSBCQVNFIHtcclxuICAgIFNFTEYsIFBBUkVOVCwgV09STEQsIE5PREVcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIGEgdHJhbnNmb3JtLXtAbGluayBNYXRyaXg0eDR9IHRvIHRoZSBub2RlLCBtb3ZpbmcsIHNjYWxpbmcgYW5kIHJvdGF0aW5nIGl0IGluIHNwYWNlIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50VHJhbnNmb3JtIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRUcmFuc2Zvcm0pO1xyXG4gICAgcHVibGljIG10eExvY2FsOiBNYXRyaXg0eDQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9tdHhJbml0OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLm10eExvY2FsID0gX210eEluaXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZm9ybWF0aW9ucyByZXNwZWN0aW5nIHRoZSBoaWVyYXJjaHlcclxuICAgIC8qKlxyXG4gICAgICogcmVjYWxjdWxhdGVzIHRoaXMgbG9jYWwgbWF0cml4IHRvIHlpZWxkIHRoZSBpZGVudGljYWwgd29ybGQgbWF0cml4IGJhc2VkIG9uIHRoZSBnaXZlbiBub2RlLlxyXG4gICAgICogVXNlIHJlYmFzZSBiZWZvcmUgYXBwZW5kaW5nIHRoZSBjb250YWluZXIgb2YgdGhpcyBjb21wb25lbnQgdG8gYW5vdGhlciBub2RlIHdoaWxlIHByZXNlcnZpbmcgaXRzIHRyYW5zZm9ybWF0aW9uIGluIHRoZSB3b3JsZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYmFzZShfbm9kZTogTm9kZSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gdGhpcy5tdHhMb2NhbDtcclxuICAgICAgbGV0IGNvbnRhaW5lcjogTm9kZSA9IHRoaXMubm9kZTtcclxuICAgICAgaWYgKGNvbnRhaW5lcilcclxuICAgICAgICBtdHhSZXN1bHQgPSBjb250YWluZXIubXR4V29ybGQ7XHJcblxyXG4gICAgICBpZiAoX25vZGUpXHJcbiAgICAgICAgbXR4UmVzdWx0ID0gTWF0cml4NHg0LlJFTEFUSVZFKG10eFJlc3VsdCwgbnVsbCwgX25vZGUubXR4V29ybGRJbnZlcnNlKTtcclxuXHJcbiAgICAgIHRoaXMubXR4TG9jYWwgPSBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIHRoZSBnaXZlbiB0cmFuc2Zvcm1hdGlvbiByZWxhdGl2ZSB0byB0aGUgc2VsZWN0ZWQgYmFzZSAoU0VMRiwgUEFSRU5ULCBXT1JMRCkgb3IgYSBwYXJ0aWN1bGFyIG90aGVyIG5vZGUgKE5PREUpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2Zvcm0oX210eFRyYW5zZm9ybTogTWF0cml4NHg0LCBfYmFzZTogQkFTRSA9IEJBU0UuU0VMRiwgX25vZGU6IE5vZGUgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIHN3aXRjaCAoX2Jhc2UpIHtcclxuICAgICAgICBjYXNlIEJBU0UuU0VMRjpcclxuICAgICAgICAgIHRoaXMubXR4TG9jYWwubXVsdGlwbHkoX210eFRyYW5zZm9ybSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJBU0UuUEFSRU5UOlxyXG4gICAgICAgICAgdGhpcy5tdHhMb2NhbC5tdWx0aXBseShfbXR4VHJhbnNmb3JtLCB0cnVlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQkFTRS5OT0RFOlxyXG4gICAgICAgICAgaWYgKCFfbm9kZSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQkFTRS5OT0RFIHJlcXVpcmVzIGEgbm9kZSBnaXZlbiBhcyBiYXNlXCIpO1xyXG4gICAgICAgIGNhc2UgQkFTRS5XT1JMRDpcclxuICAgICAgICAgIHRoaXMucmViYXNlKF9ub2RlKTtcclxuICAgICAgICAgIHRoaXMubXR4TG9jYWwubXVsdGlwbHkoX210eFRyYW5zZm9ybSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgbGV0IG5vZGU6IE5vZGUgPSB0aGlzLm5vZGU7XHJcbiAgICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgICBsZXQgbXR4VGVtcDogTWF0cml4NHg0O1xyXG4gICAgICAgICAgICBpZiAoX2Jhc2UgPT0gQkFTRS5OT0RFKSB7XHJcbiAgICAgICAgICAgICAgLy8gZml4IG10eFdvcmxkIG9mIGNvbnRhaW5lciBmb3Igc3Vic2VxdWVudCByZWJhc2luZyBcclxuICAgICAgICAgICAgICBtdHhUZW1wID0gTWF0cml4NHg0LlBST0RVQ1QoX25vZGUubXR4V29ybGQsIG5vZGUubXR4TG9jYWwpO1xyXG4gICAgICAgICAgICAgIG5vZGUubXR4V29ybGQuY29weShtdHhUZW1wKTtcclxuICAgICAgICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhUZW1wKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHBhcmVudDogTm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgICAvLyBmaXggbXR4TG9jYWwgZm9yIGN1cnJlbnQgcGFyZW50XHJcbiAgICAgICAgICAgICAgdGhpcy5yZWJhc2Uobm9kZS5nZXRQYXJlbnQoKSk7XHJcbiAgICAgICAgICAgICAgbXR4VGVtcCA9IE1hdHJpeDR4NC5QUk9EVUNUKG5vZGUuZ2V0UGFyZW50KCkubXR4V29ybGQsIG5vZGUubXR4TG9jYWwpO1xyXG4gICAgICAgICAgICAgIG5vZGUubXR4V29ybGQuY29weShtdHhUZW1wKTtcclxuICAgICAgICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhUZW1wKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgbG9jYWw6IHRoaXMubXR4TG9jYWwuc2VyaWFsaXplKCksXHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgYXdhaXQgdGhpcy5tdHhMb2NhbC5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5sb2NhbCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLmxvY2FsLm11dGF0ZShfbXV0YXRvcik7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHsgXHJcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMubG9jYWwuZ2V0TXV0YXRvcigpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgLy8gICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0gdGhpcy5sb2NhbC5nZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3IpO1xyXG4gICAgLy8gICAgIHJldHVybiB0eXBlcztcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iud29ybGQ7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBEZXNjcmliZXMgYSBWUiBDb250cm9sbGVyIGFuZCBpdHMgY2FwYWJpbGl0aWVzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBWUkNvbnRyb2xsZXIge1xyXG4gICAgcHVibGljIGNtcFRyYW5zZm9ybTogQ29tcG9uZW50VHJhbnNmb3JtID0gbnVsbDtcclxuICAgIHB1YmxpYyBnYW1lUGFkOiBHYW1lcGFkID0gbnVsbDtcclxuICAgIHB1YmxpYyB0aHVtYnN0aWNrWDogbnVtYmVyID0gbnVsbDtcclxuICAgIHB1YmxpYyB0aHVtYnN0aWNrWTogbnVtYmVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZSIENvbXBvbmVudCBDbGFzcywgZm9yIFNlc3Npb24gTWFuYWdlbWVudCwgQ29udHJvbGxlciBNYW5hZ2VtZW50IGFuZCBSZWZlcmVuY2UgU3BhY2UgTWFuYWdlbWVudC4gXHJcbiAgICogQGF1dGhvciBWYWxlbnRpbiBTY2htaWRiZXJnZXIsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRWUkRldmljZSBleHRlbmRzIENvbXBvbmVudENhbWVyYSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gQ29tcG9uZW50LnJlZ2lzdGVyU3ViY2xhc3MoQ29tcG9uZW50VlJEZXZpY2UpO1xyXG4gICAgcHVibGljIHJpZ2h0Q250cmw6IFZSQ29udHJvbGxlciA9IG5ldyBWUkNvbnRyb2xsZXIoKTtcclxuICAgIHB1YmxpYyBsZWZ0Q250cmw6IFZSQ29udHJvbGxlciA9IG5ldyBWUkNvbnRyb2xsZXIoKTtcclxuXHJcbiAgICAjbXR4TG9jYWw6IE1hdHJpeDR4NDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLmdldE10eExvY2FsRnJvbUNtcFRyYW5zZm9ybSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgbWF0cml4IG9mIHRoZSB2ciAtIGRldmljZS5cclxuICAgICAqIENyZWF0b3JzIHNob3VsZCB1c2UgdGhpcyBmb3IgcmVhZG9ubHkgcHVycG9zZXMuICBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtdHhMb2NhbCgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4TG9jYWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgVmVjdG9yMyBhcyBQb3NpdGlvbiBvZiB0aGUgcmVmZXJlbmNlIHNwYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHRyYW5zbGF0aW9uKF90cmFuc2xhdGlvbjogVmVjdG9yMykge1xyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSBfdHJhbnNsYXRpb24uY2xvbmU7XHJcbiAgICAgIHRyYW5zbGF0aW9uLnN1YnRyYWN0KHRoaXMuI210eExvY2FsLnRyYW5zbGF0aW9uKTtcclxuICAgICAgdHJhbnNsYXRpb24ubmVnYXRlKCk7XHJcbiAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSA9IFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZS5nZXRPZmZzZXRSZWZlcmVuY2VTcGFjZShuZXcgWFJSaWdpZFRyYW5zZm9ybSh0cmFuc2xhdGlvbikpO1xyXG4gICAgICB0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbiA9IF90cmFuc2xhdGlvbjtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBWZWN0b3IzIFJvdGF0aW9uIG9mIHRoZSByZWZlcmVuY2Ugc3BhY2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgcm90YXRpb24oX3JvdGF0aW9uOiBWZWN0b3IzKSB7XHJcbiAgICAgIGxldCByb3RhdGlvbjogVmVjdG9yMyA9IF9yb3RhdGlvbi5jbG9uZTsgXHJcbiAgICAgIHJvdGF0aW9uLnN1YnRyYWN0KHRoaXMuI210eExvY2FsLnJvdGF0aW9uKTtcclxuICAgICAgcm90YXRpb24ubmVnYXRlKCk7XHJcbiAgICAgIGxldCBvcmllbnRhdGlvbjogUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcbiAgICAgIG9yaWVudGF0aW9uLmV1bGVyQW5nbGVzID0gcm90YXRpb247XHJcbiAgICAgIC8vIFJvdGF0aW9uIG5lZWRzIHRvIGJlIHNldCBpbiB0aGUgT3JpZ2luICgwLDAsMCksIG90aGVyd2lzZSB0aGUgWFItUmlnIGdldHMgcm90YXRlZCBhcm91bmQgdGhlIG9yaWdpbi4gXHJcbiAgICAgIC8vIHNldCB4ciAtIHJpZyBiYWNrIHRvIG9yaWdpblxyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UgPSBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UuZ2V0T2Zmc2V0UmVmZXJlbmNlU3BhY2UobmV3IFhSUmlnaWRUcmFuc2Zvcm0oVmVjdG9yMy5ESUZGRVJFTkNFKHRoaXMuI210eExvY2FsLnRyYW5zbGF0aW9uLCBWZWN0b3IzLlpFUk8oKSkpKTtcclxuICAgICAgLy8gcm90YXRlIHhyIHJpZyBpbiBvcmlnaW5cclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuWkVSTygpLCBvcmllbnRhdGlvbikpO1xyXG4gICAgICAvLyBzZXQgeHIgLSByaWcgYmFjayB0byBsYXN0IHBvc2l0aW9uIFxyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UgPSBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UuZ2V0T2Zmc2V0UmVmZXJlbmNlU3BhY2UobmV3IFhSUmlnaWRUcmFuc2Zvcm0oVmVjdG9yMy5ESUZGRVJFTkNFKFZlY3RvcjMuWkVSTygpLCB0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbikpKTtcclxuICAgICAgdGhpcy4jbXR4TG9jYWwucm90YXRpb24gPSBfcm90YXRpb247XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJvdGF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBWZWN0b3IzIGluIFBvc2l0aW9uIG9mIHRoZSByZWZlcmVuY2Ugc3BhY2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGUoX2J5OiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIGxldCB0cmFuc2xhdGlvbjogVmVjdG9yMyA9IF9ieS5jbG9uZTtcclxuICAgICAgdHJhbnNsYXRpb24udHJhbnNmb3JtKHRoaXMuI210eExvY2FsLnF1YXRlcm5pb24pO1xyXG4gICAgICB0cmFuc2xhdGlvbi5uZWdhdGUoKTtcclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKHRyYW5zbGF0aW9uKSk7XHJcbiAgICAgIHRoaXMuI210eExvY2FsLnRyYW5zbGF0ZShfYnkpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh0cmFuc2xhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgVmVjdG9yMyBpbiBSb3RhdGlvbiBvZiB0aGUgcmVmZXJlbmNlIHNwYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlKF9ieTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgcm90YXRpb246IFZlY3RvcjMgPSBfYnkuY2xvbmUubmVnYXRlKCk7IFxyXG4gICAgICBsZXQgb3JpZW50YXRpb246IFF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xyXG4gICAgICBvcmllbnRhdGlvbi5ldWxlckFuZ2xlcyA9IHJvdGF0aW9uO1xyXG4gICAgICAvLyBSb3RhdGlvbiBuZWVkcyB0byBiZSBhZGRlZCBpbiB0aGUgT3JpZ2luICgwLDAsMCksIG90aGVyd2lzZSB0aGUgWFItUmlnIGdldHMgcm90YXRlZCBhcm91bmQgdGhlIG9yaWdpbi4gXHJcbiAgICAgIC8vIHNldCB4ciAtIHJpZyBiYWNrIHRvIG9yaWdpblxyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UgPSBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UuZ2V0T2Zmc2V0UmVmZXJlbmNlU3BhY2UobmV3IFhSUmlnaWRUcmFuc2Zvcm0oVmVjdG9yMy5ESUZGRVJFTkNFKHRoaXMuI210eExvY2FsLnRyYW5zbGF0aW9uLCBWZWN0b3IzLlpFUk8oKSkpKTtcclxuICAgICAgLy8gcm90YXRlIHhyIHJpZyBpbiBvcmlnaW5cclxuICAgICAgWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlID0gWFJWaWV3cG9ydC5kZWZhdWx0LnJlZmVyZW5jZVNwYWNlLmdldE9mZnNldFJlZmVyZW5jZVNwYWNlKG5ldyBYUlJpZ2lkVHJhbnNmb3JtKFZlY3RvcjMuWkVSTygpLCBvcmllbnRhdGlvbikpO1xyXG4gICAgICAvLyBzZXQgeHIgLSByaWcgYmFjayB0byBsYXN0IHBvc2l0aW9uIFxyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UgPSBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UuZ2V0T2Zmc2V0UmVmZXJlbmNlU3BhY2UobmV3IFhSUmlnaWRUcmFuc2Zvcm0oVmVjdG9yMy5ESUZGRVJFTkNFKFZlY3RvcjMuWkVSTygpLCB0aGlzLiNtdHhMb2NhbC50cmFuc2xhdGlvbikpKTtcclxuICAgICAgdGhpcy4jbXR4TG9jYWwucm90YXRlKF9ieSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJvdGF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE10eExvY2FsRnJvbUNtcFRyYW5zZm9ybSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jbXR4TG9jYWwgPSB0aGlzLm5vZGUubXR4TG9jYWw7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGNvbnN0IGVudW0gRVZFTlRfQ09OVFJPTCB7XHJcbiAgICBJTlBVVCA9IFwiaW5wdXRcIixcclxuICAgIE9VVFBVVCA9IFwib3V0cHV0XCJcclxuICB9XHJcblxyXG4gIGV4cG9ydCBjb25zdCBlbnVtIENPTlRST0xfVFlQRSB7XHJcbiAgICAvKiogVGhlIG91dHB1dCBzaW1wbHkgZm9sbG93cyB0aGUgc2NhbGVkIGFuZCBkZWxheWVkIGlucHV0ICovXHJcbiAgICBQUk9QT1JUSU9OQUwsXHJcbiAgICAvKiogVGhlIG91dHB1dCB2YWx1ZSBjaGFuZ2VzIG92ZXIgdGltZSB3aXRoIGEgcmF0ZSBnaXZlbiBieSB0aGUgc2NhbGVkIGFuZCBkZWxheWVkIGlucHV0ICovXHJcbiAgICBJTlRFR1JBTCxcclxuICAgIC8qKiBUaGUgb3V0cHV0IHZhbHVlIHJlYWN0cyB0byBjaGFuZ2VzIG9mIHRoZSBzY2FsZWQgaW5wdXQgYW5kIGRyb3BzIHRvIDAgd2l0aCBnaXZlbiBkZWxheSwgaWYgaW5wdXQgcmVtYWlucyBjb25zdGFudCAqL1xyXG4gICAgRElGRkVSRU5USUFMXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcm9jZXNzZXMgaW5wdXQgc2lnbmFscyBvZiB0eXBlIG51bWJlciBhbmQgZ2VuZXJhdGVzIGFuIG91dHB1dCBzaWduYWwgb2YgdGhlIHNhbWUgdHlwZSB1c2luZyBcclxuICAgKiBwcm9wb3J0aW9uYWwsIGludGVncmFsIG9yIGRpZmZlcmVudGlhbCBtYXBwaW5nLCBhbiBhbXBsaWZpY2F0aW9uIGZhY3RvciBhbmQgYSBsaW5lYXIgZGFtcGVuaW5nL2RlbGF5XHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXHJcbiAgICogICAgICAgICDilIIgICDilIzilIDilIDilIDilIDilIDilIDilIDilJAgICDilIzilIDilIDilIDilIDilIDilJAgICAgICBwYXNzIHRocm91Z2ggKFByb3BvcnRpb25hbCkgICAgICDilIJcclxuICAgKiBJbnB1dCDihpIg4pSCIOKGkiDilIJhbXBsaWZ54pSCIOKGkiDilIJkZWxheeKUgiDihpIg4pqfIHN1bSB1cCBvdmVyIHRpbWUgKEludGVncmFsKSDimp4g4oaSIOKUgiDihpIgT3V0cHV0XHJcbiAgICogICAgICAgICDilIIgICDilJTilIDilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilJggICAgICBwYXNzIGNoYW5nZSAgKERpZmZlcmVudGlhbCkgICAgICDilIJcclxuICAgKiAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCBcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29udHJvbCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcclxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBDT05UUk9MX1RZUEU7XHJcbiAgICBwdWJsaWMgYWN0aXZlOiBib29sZWFuO1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcclxuXHJcbiAgICBwcm90ZWN0ZWQgcmF0ZURpc3BhdGNoT3V0cHV0OiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIHZhbHVlUHJldmlvdXM6IG51bWJlciA9IDA7XHJcbiAgICBwcm90ZWN0ZWQgb3V0cHV0QmFzZTogbnVtYmVyID0gMDtcclxuICAgIHByb3RlY3RlZCBvdXRwdXRUYXJnZXQ6IG51bWJlciA9IDA7XHJcbiAgICBwcm90ZWN0ZWQgb3V0cHV0UHJldmlvdXM6IG51bWJlciA9IDA7XHJcbiAgICBwcm90ZWN0ZWQgb3V0cHV0VGFyZ2V0UHJldmlvdXM6IG51bWJlciA9IDA7XHJcbiAgICBwcm90ZWN0ZWQgZmFjdG9yOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHByb3RlY3RlZCB0aW1lOiBUaW1lID0gVGltZS5nYW1lO1xyXG4gICAgcHJvdGVjdGVkIHRpbWVWYWx1ZURlbGF5OiBudW1iZXIgPSAwO1xyXG4gICAgcHJvdGVjdGVkIHRpbWVPdXRwdXRUYXJnZXRTZXQ6IG51bWJlciA9IDA7XHJcbiAgICBwcm90ZWN0ZWQgaWRUaW1lcjogbnVtYmVyID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nLCBfZmFjdG9yOiBudW1iZXIgPSAxLCBfdHlwZTogQ09OVFJPTF9UWVBFID0gQ09OVFJPTF9UWVBFLlBST1BPUlRJT05BTCwgX2RlbGF5OiBudW1iZXIgPSAwKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuZmFjdG9yID0gX2ZhY3RvcjtcclxuICAgICAgdGhpcy50eXBlID0gX3R5cGU7XHJcbiAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICAgIHRoaXMuc2V0RGVsYXkoX2RlbGF5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdGltZS1vYmplY3QgdG8gYmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBvdXRwdXQgaW4ge0BsaW5rIENPTlRST0xfVFlQRS5JTlRFR1JBTH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFRpbWViYXNlKF90aW1lOiBUaW1lKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudGltZSA9IF90aW1lO1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZU91dHB1dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmVlZCBhbiBpbnB1dCB2YWx1ZSBpbnRvIHRoaXMgY29udHJvbCBhbmQgZmlyZSB0aGUgZXZlbnRzIHtAbGluayBFVkVOVF9DT05UUk9MLklOUFVUfSBhbmQge0BsaW5rIEVWRU5UX0NPTlRST0wuT1VUUFVUfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0SW5wdXQoX2lucHV0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLm91dHB1dEJhc2UgPSB0aGlzLmNhbGN1bGF0ZU91dHB1dCgpO1xyXG4gICAgICB0aGlzLnZhbHVlUHJldmlvdXMgPSB0aGlzLmdldFZhbHVlRGVsYXllZCgpO1xyXG4gICAgICB0aGlzLm91dHB1dFRhcmdldCA9IHRoaXMuZmFjdG9yICogX2lucHV0O1xyXG4gICAgICB0aGlzLnRpbWVPdXRwdXRUYXJnZXRTZXQgPSB0aGlzLnRpbWUuZ2V0KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy50eXBlID09IENPTlRST0xfVFlQRS5ESUZGRVJFTlRJQUwpIHtcclxuICAgICAgICB0aGlzLnZhbHVlUHJldmlvdXMgPSB0aGlzLm91dHB1dFRhcmdldCAtIHRoaXMub3V0cHV0VGFyZ2V0UHJldmlvdXM7XHJcbiAgICAgICAgdGhpcy5vdXRwdXRUYXJnZXRQcmV2aW91cyA9IHRoaXMub3V0cHV0VGFyZ2V0O1xyXG4gICAgICAgIHRoaXMub3V0cHV0VGFyZ2V0ID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVF9DT05UUk9MLklOUFVUKSk7XHJcbiAgICAgIGlmICh0aGlzLnR5cGUgPT0gQ09OVFJPTF9UWVBFLkRJRkZFUkVOVElBTClcclxuICAgICAgICB0aGlzLmRpc3BhdGNoT3V0cHV0KHRoaXMudmFsdWVQcmV2aW91cyk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLmRpc3BhdGNoT3V0cHV0KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVE9ETzogZGVzY3JpYmUhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwdWxzZShfaW5wdXQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldElucHV0KF9pbnB1dCk7XHJcbiAgICAgIHRoaXMuc2V0SW5wdXQoMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHRpbWUgdG8gdGFrZSBmb3IgdGhlIGludGVybmFsIGxpbmVhciBkYW1wZW5pbmcgdW50aWwgdGhlIGZpbmFsIG91cHV0IHZhbHVlIGlzIHJlYWNoZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldERlbGF5KF90aW1lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy50aW1lVmFsdWVEZWxheSA9IE1hdGgubWF4KDAsIF90aW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIG91dHB1dC1ldmVudHMgdG8gZGlzcGF0Y2ggcGVyIHNlY29uZC4gXHJcbiAgICAgKiBBdCB0aGUgZGVmYXVsdCBvZiAwLCB0aGUgY29udHJvbCBvdXRwdXQgbXVzdCBiZSBwb2xsZWQgYW5kIHdpbGwgb25seSBhY3RpdmVseSBkaXNwYXRjaGVkIG9uY2UgZWFjaCB0aW1lIGlucHV0IG9jY3VycyBhbmQgdGhlIG91dHB1dCBjaGFuZ2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0UmF0ZURpc3BhdGNoT3V0cHV0KF9yYXRlRGlzcGF0Y2hPdXRwdXQ6IG51bWJlciA9IDApOiB2b2lkIHtcclxuICAgICAgdGhpcy5yYXRlRGlzcGF0Y2hPdXRwdXQgPSBfcmF0ZURpc3BhdGNoT3V0cHV0O1xyXG4gICAgICB0aGlzLnRpbWUuZGVsZXRlVGltZXIodGhpcy5pZFRpbWVyKTtcclxuICAgICAgdGhpcy5pZFRpbWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICBpZiAodGhpcy5yYXRlRGlzcGF0Y2hPdXRwdXQpXHJcbiAgICAgICAgdGhpcy5pZFRpbWVyID0gdGhpcy50aW1lLnNldFRpbWVyKDEwMDAgLyB0aGlzLnJhdGVEaXNwYXRjaE91dHB1dCwgMCwgdGhpcy5kaXNwYXRjaE91dHB1dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGZhY3RvciB0byBtdWx0aXBseSB0aGUgaW5wdXQgdmFsdWUgZ2l2ZW4gd2l0aCB7QGxpbmsgc2V0SW5wdXR9IHdpdGhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEZhY3RvcihfZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5mYWN0b3IgPSBfZmFjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBvdXRwdXQgb2YgdGhpcyBjb250cm9sXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPdXRwdXQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlT3V0cHV0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBvdXRwdXQgb2YgdGhpcyBjb250cm9sXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVPdXRwdXQoKTogbnVtYmVyIHtcclxuICAgICAgbGV0IG91dHB1dDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHZhbHVlOiBudW1iZXIgPSB0aGlzLmdldFZhbHVlRGVsYXllZCgpO1xyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcclxuICAgICAgICBjYXNlIENPTlRST0xfVFlQRS5JTlRFR1JBTDpcclxuICAgICAgICAgIGxldCB0aW1lQ3VycmVudDogbnVtYmVyID0gdGhpcy50aW1lLmdldCgpO1xyXG4gICAgICAgICAgbGV0IHRpbWVFbGFwc2VkU2luY2VJbnB1dDogbnVtYmVyID0gdGltZUN1cnJlbnQgLSB0aGlzLnRpbWVPdXRwdXRUYXJnZXRTZXQ7XHJcbiAgICAgICAgICBvdXRwdXQgPSB0aGlzLm91dHB1dEJhc2U7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMudGltZVZhbHVlRGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lRWxhcHNlZFNpbmNlSW5wdXQgPCB0aGlzLnRpbWVWYWx1ZURlbGF5KSB7XHJcbiAgICAgICAgICAgICAgb3V0cHV0ICs9IDAuNSAqICh0aGlzLnZhbHVlUHJldmlvdXMgKyB2YWx1ZSkgKiB0aW1lRWxhcHNlZFNpbmNlSW5wdXQ7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgb3V0cHV0ICs9IDAuNSAqICh0aGlzLnZhbHVlUHJldmlvdXMgKyB2YWx1ZSkgKiB0aGlzLnRpbWVWYWx1ZURlbGF5O1xyXG4gICAgICAgICAgICAgIHRpbWVFbGFwc2VkU2luY2VJbnB1dCAtPSB0aGlzLnRpbWVWYWx1ZURlbGF5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBvdXRwdXQgKz0gdmFsdWUgKiB0aW1lRWxhcHNlZFNpbmNlSW5wdXQ7XHJcbiAgICAgICAgICAvLyB2YWx1ZSArPSAwLjUgKiAodGhpcy5pbnB1dFByZXZpb3VzIC0gaW5wdXQpICogdGhpcy50aW1lSW5wdXREZWxheSArIGlucHV0ICogdGltZUVsYXBzZWRTaW5jZUlucHV0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDT05UUk9MX1RZUEUuRElGRkVSRU5USUFMOlxyXG4gICAgICAgIGNhc2UgQ09OVFJPTF9UWVBFLlBST1BPUlRJT05BTDpcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgb3V0cHV0ID0gdmFsdWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBjYWxjdWxhdGVzIHRoZSBvdXRwdXQgY29uc2lkZXJpbmcgdGhlIHRpbWUgb2YgdGhlIGRlbGF5XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0VmFsdWVEZWxheWVkKCk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0aGlzLnRpbWVWYWx1ZURlbGF5ID4gMCkge1xyXG4gICAgICAgIGxldCB0aW1lRWxhcHNlZFNpbmNlSW5wdXQ6IG51bWJlciA9IHRoaXMudGltZS5nZXQoKSAtIHRoaXMudGltZU91dHB1dFRhcmdldFNldDtcclxuICAgICAgICBpZiAodGltZUVsYXBzZWRTaW5jZUlucHV0IDwgdGhpcy50aW1lVmFsdWVEZWxheSlcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlUHJldmlvdXMgKyAodGhpcy5vdXRwdXRUYXJnZXQgLSB0aGlzLnZhbHVlUHJldmlvdXMpICogdGltZUVsYXBzZWRTaW5jZUlucHV0IC8gdGhpcy50aW1lVmFsdWVEZWxheTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5vdXRwdXRUYXJnZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkaXNwYXRjaE91dHB1dCA9IChfZXZlbnRPclZhbHVlOiBFdmVudFRpbWVyIHwgbnVtYmVyKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5hY3RpdmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IHRpbWVyOiBUaW1lciA9IHRoaXMudGltZS5nZXRUaW1lcih0aGlzLmlkVGltZXIpO1xyXG4gICAgICBsZXQgb3V0cHV0OiBudW1iZXI7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9ldmVudE9yVmFsdWUpID09IFwibnVtYmVyXCIpXHJcbiAgICAgICAgb3V0cHV0ID0gX2V2ZW50T3JWYWx1ZTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIG91dHB1dCA9IHRoaXMuY2FsY3VsYXRlT3V0cHV0KCk7XHJcbiAgICAgIGxldCBvdXRwdXRDaGFuZ2VkOiBib29sZWFuID0gKG91dHB1dCAhPSB0aGlzLm91dHB1dFByZXZpb3VzKTtcclxuXHJcbiAgICAgIGlmICh0aW1lcikge1xyXG4gICAgICAgIHRpbWVyLmFjdGl2ZSA9IG91dHB1dENoYW5nZWQ7XHJcbiAgICAgICAgaWYgKCFvdXRwdXRDaGFuZ2VkKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm91dHB1dFByZXZpb3VzID0gb3V0cHV0O1xyXG5cclxuICAgICAgbGV0IGV2ZW50OiBDdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChFVkVOVF9DT05UUk9MLk9VVFBVVCwge1xyXG4gICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgb3V0cHV0OiBvdXRwdXRcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwiLy8vPHJlZmVyZW5jZSBwYXRoPVwiQ29udHJvbC50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBtdWx0aXBsZSBjb250cm9scyBhcyBpbnB1dHMgYW5kIGNyZWF0ZXMgYW4gb3V0cHV0IGZyb20gdGhhdC5cclxuICAgKiBBcyBhIHN1YmNsYXNzIG9mIHtAbGluayBDb250cm9sfSwgYXhpcyBjYWxjdWxhdGVzIHRoZSBvdXB1dCBzdW1taW5nIHVwIHRoZSBpbnB1dHMgYW5kIHByb2Nlc3NpbmcgdGhlIHJlc3VsdCB1c2luZyBpdHMgb3duIHNldHRpbmdzLiAgXHJcbiAgICogRGlzcGF0Y2hlcyB7QGxpbmsgRVZFTlRfQ09OVFJPTC5PVVRQVVR9IGFuZCB7QGxpbmsgRVZFTlRfQ09OVFJPTC5JTlBVVH0gd2hlbiBvbmUgb2YgdGhlIGNvbnRyb2xzIGRpc3BhdGNoZXMgdGhlbS5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxyXG4gICAqICAgICAgICAgICDilIIg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXHJcbiAgICogICBJbnB1dCDihpIg4pSCIOKUgmNvbnRyb2zilIJcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXHJcbiAgICogICAgICAgICAgIOKUgiDilJTilIDilIDilIDilIDilIDilIDilIDilJggXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXHJcbiAgICogICAgICAgICAgIOKUgiDilIzilIDilIDilIDilIDilIDilIDilIDilJAgIFxc4pSM4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSCXHJcbiAgICogICBJbnB1dCDihpIg4pSCIOKUgmNvbnRyb2zilIItLS3ilIJzdW3ilIIg4oaSIOKUgmludGVybmFsIGNvbnRyb2wg4pSCIOKGkiDilIIg4oaSIE91dHB1dFxyXG4gICAqICAgICAgICAgICDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAv4pSU4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSCXHJcbiAgICogICAgICAgICAgIOKUgiDilIzilIDilIDilIDilIDilIDilIDilIDilJAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcclxuICAgKiAgIElucHV0IOKGkiDilIIg4pSCY29udHJvbOKUgi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxyXG4gICAqICAgICAgICAgICDilIIg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXHJcbiAgICogICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEF4aXMgZXh0ZW5kcyBDb250cm9sIHtcclxuICAgIHByaXZhdGUgY29udHJvbHM6IE1hcDxzdHJpbmcsIENvbnRyb2w+ID0gbmV3IE1hcCgpO1xyXG4gICAgcHJpdmF0ZSBzdW1QcmV2aW91czogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCB0aGUgY29udHJvbCBnaXZlbiB0byB0aGUgbGlzdCBvZiBjb250cm9scyBmZWVkaW5nIGludG8gdGhpcyBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDb250cm9sKF9jb250cm9sOiBDb250cm9sKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuY29udHJvbHMuc2V0KF9jb250cm9sLm5hbWUsIF9jb250cm9sKTtcclxuICAgICAgX2NvbnRyb2wuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVF9DT05UUk9MLklOUFVULCB0aGlzLmhuZElucHV0RXZlbnQpO1xyXG4gICAgICBfY29udHJvbC5hZGRFdmVudExpc3RlbmVyKEVWRU5UX0NPTlRST0wuT1VUUFVULCB0aGlzLmhuZE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29udHJvbChfbmFtZTogc3RyaW5nKTogQ29udHJvbCB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLmdldChfbmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUNvbnRyb2woX25hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBsZXQgY29udHJvbDogQ29udHJvbCA9IHRoaXMuZ2V0Q29udHJvbChfbmFtZSk7XHJcbiAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgY29udHJvbC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UX0NPTlRST0wuSU5QVVQsIHRoaXMuaG5kSW5wdXRFdmVudCk7XHJcbiAgICAgICAgY29udHJvbC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5UX0NPTlRST0wuT1VUUFVULCB0aGlzLmhuZE91dHB1dEV2ZW50KTtcclxuICAgICAgICB0aGlzLmNvbnRyb2xzLmRlbGV0ZShfbmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgYXhpcyBhZnRlciBzdW1taW5nIHVwIGFsbCBpbnB1dHMgYW5kIHByb2Nlc3NpbmcgdGhlIHN1bSBhY2NvcmRpbmcgdG8gdGhlIGF4aXMnIHNldHRpbmdzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPdXRwdXQoKTogbnVtYmVyIHtcclxuICAgICAgbGV0IHN1bUlucHV0OiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBjb250cm9sIG9mIHRoaXMuY29udHJvbHMpIHtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2xbMV0uYWN0aXZlKVxyXG4gICAgICAgICAgc3VtSW5wdXQgKz0gY29udHJvbFsxXS5nZXRPdXRwdXQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHN1bUlucHV0ICE9IHRoaXMuc3VtUHJldmlvdXMpXHJcbiAgICAgICAgc3VwZXIuc2V0SW5wdXQoc3VtSW5wdXQpO1xyXG5cclxuICAgICAgdGhpcy5zdW1QcmV2aW91cyA9IHN1bUlucHV0O1xyXG5cclxuICAgICAgcmV0dXJuIHN1cGVyLmdldE91dHB1dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaG5kT3V0cHV0RXZlbnQ6IEV2ZW50TGlzdGVuZXIgPSAoX2V2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuYWN0aXZlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGxldCBjb250cm9sOiBDb250cm9sID0gKDxDb250cm9sPl9ldmVudC50YXJnZXQpO1xyXG4gICAgICBsZXQgZXZlbnQ6IEN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEVWRU5UX0NPTlRST0wuT1VUUFVULCB7XHJcbiAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICBjb250cm9sOiBjb250cm9sLFxyXG4gICAgICAgICAgaW5wdXQ6ICg8Q3VzdG9tRXZlbnQ+X2V2ZW50KS5kZXRhaWwub3V0cHV0LFxyXG4gICAgICAgICAgb3V0cHV0OiB0aGlzLmdldE91dHB1dCgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBobmRJbnB1dEV2ZW50OiBFdmVudExpc3RlbmVyID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgZXZlbnQ6IEV2ZW50ID0gbmV3IEV2ZW50KEVWRU5UX0NPTlRST0wuSU5QVVQsIF9ldmVudCk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGludGVyZmFjZSBLZXlQcmVzc2VkIHtcclxuICAgIFtjb2RlOiBzdHJpbmddOiBib29sZWFuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGVjdHMgdGhlIGtleXMgcHJlc3NlZCBvbiB0aGUga2V5Ym9hcmQgYW5kIHN0b3JlcyB0aGVpciBzdGF0dXMuIFxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBLZXlib2FyZCB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBrZXlzUHJlc3NlZDogS2V5UHJlc3NlZCA9IEtleWJvYXJkLmluaXRpYWxpemUoKTtcclxuICAgIC8vIHByaXZhdGUgc3RhdGljIGNvZGVfZW46IE9iamVjdDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBvbmUgb2YgdGhlIGdpdmVuIGtleXMgaXMgaXMgY3VycmVudGx5IGJlaW5nIHByZXNzZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNQcmVzc2VkT25lKF9rZXlzOiBLRVlCT0FSRF9DT0RFW10pOiBib29sZWFuIHtcclxuICAgICAgZm9yIChsZXQgY29kZSBvZiBfa2V5cykge1xyXG4gICAgICAgIGlmIChLZXlib2FyZC5rZXlzUHJlc3NlZFtjb2RlXSlcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgb2YgdGhlIGdpdmVuIGtleXMgYXJlIGN1cnJlbnRseSBiZWluZyBwcmVzc2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNQcmVzc2VkQ29tYm8oX2tleXM6IEtFWUJPQVJEX0NPREVbXSk6IGJvb2xlYW4ge1xyXG4gICAgICBmb3IgKGxldCBjb2RlIG9mIF9rZXlzKSB7XHJcbiAgICAgICAgaWYgKCFLZXlib2FyZC5rZXlzUHJlc3NlZFtjb2RlXSlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGdpdmVuIGFzIF9hY3RpdmUgaWYgb25lIG9yLCB3aGVuIF9jb21ibyBpcyB0cnVlLCBhbGwgb2YgdGhlIGdpdmVuIGtleXMgYXJlIHByZXNzZWQuXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBnaXZlbiBhcyBfaW5hY3RpdmUgaWYgbm90LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG1hcFRvVmFsdWU8VD4oX2FjdGl2ZTogVCwgX2luYWN0aXZlOiBULCBfa2V5czogS0VZQk9BUkRfQ09ERVtdLCBfY29tYm86IGJvb2xlYW4gPSBmYWxzZSk6IFQge1xyXG4gICAgICBpZiAoIV9jb21ibyAmJiBLZXlib2FyZC5pc1ByZXNzZWRPbmUoX2tleXMpKVxyXG4gICAgICAgIHJldHVybiBfYWN0aXZlO1xyXG4gICAgICBpZiAoS2V5Ym9hcmQuaXNQcmVzc2VkQ29tYm8oX2tleXMpKVxyXG4gICAgICAgIHJldHVybiBfYWN0aXZlO1xyXG4gICAgICByZXR1cm4gX2luYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGJhbGFuY2VkIHRlcm5hcnkgdmFsdWUgKGVpdGhlciAtMSwgMCBvciAxKSBcclxuICAgICAqIGFjY29yZGluZyB0byB0aGUgbWF0Y2ggb2YgdGhlIGtleXMgY3VycmVudGx5IGJlaW5nIHByZXNzZWQgYW5kIHRoZSBsaXN0cyBvZiBrZXlzIGdpdmVuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG1hcFRvVHJpdChfcG9zaXRpdmU6IEtFWUJPQVJEX0NPREVbXSwgX25lZ2F0aXZlOiBLRVlCT0FSRF9DT0RFW10pOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gS2V5Ym9hcmQubWFwVG9WYWx1ZSgtMSwgMCwgX25lZ2F0aXZlKSArIEtleWJvYXJkLm1hcFRvVmFsdWUoMSwgMCwgX3Bvc2l0aXZlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIGxvY2FsZShfa2V5Ym9hcmQ6IE9iamVjdCk6IHZvaWQge1xyXG4gICAgLy8gICBpZiAoIUtleWJvYXJkLmNvZGVfZW4pIHtcclxuICAgIC8vICAgICAvLyBzYXZlIG9yaWdpbmFsIGtleWJvYXJkIGNvZGVzIHRvIGJlIGFibGUgdG8gc3dpdGNoIGJhY2sgbGF0ZXJcclxuICAgIC8vICAgICBLZXlib2FyZC5jb2RlX2VuID0ge307XHJcbiAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihLZXlib2FyZC5jb2RlX2VuLCBLRVlCT0FSRF9DT0RFKTtcclxuICAgIC8vICAgfVxyXG5cclxuICAgIC8vICAgZm9yIChsZXQga2V5IGluIF9rZXlib2FyZCkge1xyXG4gICAgLy8gICAgIGxldCB2YWx1ZTogc3RyaW5nID0gUmVmbGVjdC5nZXQoX2tleWJvYXJkLCBrZXkpO1xyXG4gICAgLy8gICAgIGZvciAobGV0IG9yaWdpbmFsIGluIEtFWUJPQVJEX0NPREUpXHJcbiAgICAvLyAgICAgICBpZiAoUmVmbGVjdC5nZXQoS0VZQk9BUkRfQ09ERSwgb3JpZ2luYWwpID09IHZhbHVlKVxyXG4gICAgLy8gICAgICAgICAvLyByZW1vdmUgb3JpZ2luYWwga2V5IHRoZSB5aWVsZHMgdGhlIHZhbHVlXHJcbiAgICAvLyAgICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoS0VZQk9BUkRfQ09ERSwgb3JpZ2luYWwpO1xyXG4gICAgLy8gICAgIC8vIGFkZCBuZXcga2V5IHRvIHlpZWxkIHRoYXQgdmFsdWVcclxuICAgIC8vICAgICBSZWZsZWN0LnNldChLRVlCT0FSRF9DT0RFLCBrZXksIHZhbHVlKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluaXRpYWxpemUoKTogS2V5UHJlc3NlZCB7XHJcbiAgICAgIGxldCBzdG9yZTogS2V5UHJlc3NlZCA9IHt9O1xyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBLZXlib2FyZC5obmRLZXlJbnRlcmFjdGlvbik7XHJcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCBLZXlib2FyZC5obmRLZXlJbnRlcmFjdGlvbik7XHJcbiAgICAgIHJldHVybiBzdG9yZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBobmRLZXlJbnRlcmFjdGlvbihfZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgS2V5Ym9hcmQua2V5c1ByZXNzZWRbX2V2ZW50LmNvZGVdID0gKF9ldmVudC50eXBlID09IFwia2V5ZG93blwiKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnVGFyZ2V0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSb3V0aW5nIHRvIHRoZSBhbGVydCBib3hcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRGVidWdBbGVydCBleHRlbmRzIERlYnVnVGFyZ2V0IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVsZWdhdGVzOiBNYXBEZWJ1Z0ZpbHRlclRvRGVsZWdhdGUgPSB7XHJcbiAgICAgIFtERUJVR19GSUxURVIuSU5GT106IERlYnVnQWxlcnQuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5JTkZPXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuTE9HXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLkxPR10pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLldBUk5dOiBEZWJ1Z0FsZXJ0LmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuV0FSTl0pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkVSUk9SXTogRGVidWdBbGVydC5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLkVSUk9SXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuRlVER0VdOiBEZWJ1Z0FsZXJ0LmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuRlVER0VdKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdOiBEZWJ1Z0FsZXJ0LmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuU09VUkNFXSlcclxuICAgIH07XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogUmV0dXJucyBhIGRlbGVnYXRlLWZ1bmN0aW9uIGV4cGVjdGluZyBhIG1lc3NhZ2UgdG8gbG9nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZURlbGVnYXRlKF9oZWFkbGluZTogc3RyaW5nKTogRnVuY3Rpb24ge1xyXG4gICAgICBsZXQgZGVsZWdhdGU6IEZ1bmN0aW9uID0gZnVuY3Rpb24gKF9tZXNzYWdlOiBPYmplY3QsIC4uLl9hcmdzOiBPYmplY3RbXSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBhcmdzOiBzdHJpbmdbXSA9IF9hcmdzLm1hcChfYXJnID0+IF9hcmcudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgbGV0IG91dDogc3RyaW5nID0gX2hlYWRsaW5lICsgXCIgXCIgKyBEZWJ1Z1RhcmdldC5tZXJnZUFyZ3VtZW50cyhfbWVzc2FnZSwgYXJncyk7XHJcbiAgICAgICAgYWxlcnQob3V0KTtcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIGRlbGVnYXRlO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIi8vIC8gPHJlZmVyZW5jZSBwYXRoPVwiRGVidWdUYXJnZXQudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFJvdXRpbmcgdG8gYSBIVE1MRGlhbG9nRWxlbWVudFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBEZWJ1Z0RpYWxvZyBleHRlbmRzIERlYnVnVGFyZ2V0IHtcclxuICAgIC8vIFRPRE86IGNoZWNrb3V0IEhUTUxEaWFsb2dFbGVtZW50OyAhISFcclxuICB9XHJcbn0iLCIvLyAvIDxyZWZlcmVuY2UgcGF0aD1cIkRlYnVnVGFyZ2V0LnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSb3V0ZSB0byBhbiBIVE1MVGV4dEFyZWEsIG1heSBiZSBvYnNvbGV0ZSB3aGVuIHVzaW5nIEhUTUxEaWFsb2dFbGVtZW50XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIERlYnVnVGV4dEFyZWEgZXh0ZW5kcyBEZWJ1Z1RhcmdldCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHRleHRBcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBhdXRvU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGVnYXRlczogTWFwRGVidWdGaWx0ZXJUb0RlbGVnYXRlID0ge1xyXG4gICAgICBbREVCVUdfRklMVEVSLklORk9dOiBEZWJ1Z1RleHRBcmVhLmNyZWF0ZURlbGVnYXRlKERFQlVHX1NZTUJPTFtERUJVR19GSUxURVIuSU5GT10pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkxPR106IERlYnVnVGV4dEFyZWEuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5MT0ddKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5XQVJOXTogRGVidWdUZXh0QXJlYS5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLldBUk5dKSxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5FUlJPUl06IERlYnVnVGV4dEFyZWEuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5FUlJPUl0pLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkZVREdFXTogRGVidWdUZXh0QXJlYS5jcmVhdGVEZWxlZ2F0ZShERUJVR19TWU1CT0xbREVCVUdfRklMVEVSLkZVREdFXSksXHJcbiAgICAgIFtERUJVR19GSUxURVIuQ0xFQVJdOiBEZWJ1Z1RleHRBcmVhLmNsZWFyLFxyXG4gICAgICBbREVCVUdfRklMVEVSLkdST1VQXTogRGVidWdUZXh0QXJlYS5ncm91cCxcclxuICAgICAgW0RFQlVHX0ZJTFRFUi5HUk9VUENPTExBUFNFRF06IERlYnVnVGV4dEFyZWEuZ3JvdXAsXHJcbiAgICAgIFtERUJVR19GSUxURVIuR1JPVVBFTkRdOiBEZWJ1Z1RleHRBcmVhLmdyb3VwRW5kLFxyXG4gICAgICBbREVCVUdfRklMVEVSLlNPVVJDRV06IERlYnVnVGV4dEFyZWEuY3JlYXRlRGVsZWdhdGUoREVCVUdfU1lNQk9MW0RFQlVHX0ZJTFRFUi5TT1VSQ0VdKVxyXG4gICAgfTtcclxuICAgIHByaXZhdGUgc3RhdGljIGdyb3Vwczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgdGV4dCBhcmVhIGFuZCB0aGUgZ3JvdXBzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgIERlYnVnVGV4dEFyZWEudGV4dEFyZWEudGV4dENvbnRlbnQgPSBcIlwiO1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLmdyb3VwcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmVnaW5zIGEgbmV3IGdyb3VwIHdpdGggdGhlIGdpdmVuIG5hbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBncm91cChfbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIERlYnVnVGV4dEFyZWEucHJpbnQoXCLilrwgXCIgKyBfbmFtZSk7XHJcbiAgICAgIERlYnVnVGV4dEFyZWEuZ3JvdXBzLnB1c2goX25hbWUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmRzIHRoZSBsYXN0IGdyb3VwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXBFbmQoKTogdm9pZCB7XHJcbiAgICAgIERlYnVnVGV4dEFyZWEuZ3JvdXBzLnBvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGRlbGVnYXRlLWZ1bmN0aW9uIGV4cGVjdGluZyBhIG1lc3NhZ2UgdG8gbG9nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZURlbGVnYXRlKF9oZWFkbGluZTogc3RyaW5nKTogRnVuY3Rpb24ge1xyXG4gICAgICBsZXQgZGVsZWdhdGU6IEZ1bmN0aW9uID0gZnVuY3Rpb24gKF9tZXNzYWdlOiBPYmplY3QsIC4uLl9hcmdzOiBPYmplY3RbXSk6IHZvaWQge1xyXG4gICAgICAgIERlYnVnVGV4dEFyZWEucHJpbnQoX2hlYWRsaW5lICsgXCIgXCIgKyBEZWJ1Z1RhcmdldC5tZXJnZUFyZ3VtZW50cyhfbWVzc2FnZSwgX2FyZ3MpKTtcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIGRlbGVnYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldEluZGVudGF0aW9uKF9sZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHJlc3VsdDogc3RyaW5nID0gXCJcIjtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IF9sZXZlbDsgaSsrKVxyXG4gICAgICAgIHJlc3VsdCArPSBcInwgXCI7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcHJpbnQoX3RleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBEZWJ1Z1RleHRBcmVhLnRleHRBcmVhLnRleHRDb250ZW50ICs9IERlYnVnVGV4dEFyZWEuZ2V0SW5kZW50YXRpb24oRGVidWdUZXh0QXJlYS5ncm91cHMubGVuZ3RoKSArIF90ZXh0ICsgXCJcXG5cIjtcclxuICAgICAgaWYgKERlYnVnVGV4dEFyZWEuYXV0b1Njcm9sbClcclxuICAgICAgICBEZWJ1Z1RleHRBcmVhLnRleHRBcmVhLnNjcm9sbFRvcCA9IERlYnVnVGV4dEFyZWEudGV4dEFyZWEuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBjb2RlcyBzZW50IGZyb20gYSBzdGFuZGFyZCBlbmdsaXNoIGtleWJvYXJkIGxheW91dFxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIEtFWUJPQVJEX0NPREUge1xyXG4gICAgQSA9IFwiS2V5QVwiLFxyXG4gICAgQiA9IFwiS2V5QlwiLFxyXG4gICAgQyA9IFwiS2V5Q1wiLFxyXG4gICAgRCA9IFwiS2V5RFwiLFxyXG4gICAgRSA9IFwiS2V5RVwiLFxyXG4gICAgRiA9IFwiS2V5RlwiLFxyXG4gICAgRyA9IFwiS2V5R1wiLFxyXG4gICAgSCA9IFwiS2V5SFwiLFxyXG4gICAgSSA9IFwiS2V5SVwiLFxyXG4gICAgSiA9IFwiS2V5SlwiLFxyXG4gICAgSyA9IFwiS2V5S1wiLFxyXG4gICAgTCA9IFwiS2V5TFwiLFxyXG4gICAgTSA9IFwiS2V5TVwiLFxyXG4gICAgTiA9IFwiS2V5TlwiLFxyXG4gICAgTyA9IFwiS2V5T1wiLFxyXG4gICAgUCA9IFwiS2V5UFwiLFxyXG4gICAgUSA9IFwiS2V5UVwiLFxyXG4gICAgUiA9IFwiS2V5UlwiLFxyXG4gICAgUyA9IFwiS2V5U1wiLFxyXG4gICAgVCA9IFwiS2V5VFwiLFxyXG4gICAgVSA9IFwiS2V5VVwiLFxyXG4gICAgViA9IFwiS2V5VlwiLFxyXG4gICAgVyA9IFwiS2V5V1wiLFxyXG4gICAgWCA9IFwiS2V5WFwiLFxyXG4gICAgWSA9IFwiS2V5WVwiLFxyXG4gICAgWiA9IFwiS2V5WlwiLFxyXG4gICAgRVNDID0gXCJFc2NhcGVcIixcclxuICAgIFpFUk8gPSBcIkRpZ2l0MFwiLFxyXG4gICAgT05FID0gXCJEaWdpdDFcIixcclxuICAgIFRXTyA9IFwiRGlnaXQyXCIsXHJcbiAgICBUSFJFRSA9IFwiRGlnaXQzXCIsXHJcbiAgICBGT1VSID0gXCJEaWdpdDRcIixcclxuICAgIEZJVkUgPSBcIkRpZ2l0NVwiLFxyXG4gICAgU0lYID0gXCJEaWdpdDZcIixcclxuICAgIFNFVkVOID0gXCJEaWdpdDdcIixcclxuICAgIEVJR0hUID0gXCJEaWdpdDhcIixcclxuICAgIE5JTkUgPSBcIkRpZ2l0OVwiLFxyXG4gICAgTUlOVVMgPSBcIk1pbnVzXCIsXHJcbiAgICBFUVVBTCA9IFwiRXF1YWxcIixcclxuICAgIEJBQ0tTUEFDRSA9IFwiQmFja3NwYWNlXCIsXHJcbiAgICBUQUJVTEFUT1IgPSBcIlRhYlwiLFxyXG4gICAgQlJBQ0tFVF9MRUZUID0gXCJCcmFja2V0TGVmdFwiLFxyXG4gICAgQlJBQ0tFVF9SSUdIVCA9IFwiQnJhY2tldFJpZ2h0XCIsXHJcbiAgICBFTlRFUiA9IFwiRW50ZXJcIixcclxuICAgIENUUkxfTEVGVCA9IFwiQ29udHJvbExlZnRcIixcclxuICAgIFNFTUlDT0xPTiA9IFwiU2VtaWNvbG9uXCIsXHJcbiAgICBRVU9URSA9IFwiUXVvdGVcIixcclxuICAgIEJBQ0tfUVVPVEUgPSBcIkJhY2txdW90ZVwiLFxyXG4gICAgU0hJRlRfTEVGVCA9IFwiU2hpZnRMZWZ0XCIsXHJcbiAgICBCQUNLU0xBU0ggPSBcIkJhY2tzbGFzaFwiLFxyXG4gICAgQ09NTUEgPSBcIkNvbW1hXCIsXHJcbiAgICBQRVJJT0QgPSBcIlBlcmlvZFwiLFxyXG4gICAgU0xBU0ggPSBcIlNsYXNoXCIsXHJcbiAgICBTSElGVF9SSUdIVCA9IFwiU2hpZnRSaWdodFwiLFxyXG4gICAgTlVNUEFEX01VTFRJUExZID0gXCJOdW1wYWRNdWx0aXBseVwiLFxyXG4gICAgQUxUX0xFRlQgPSBcIkFsdExlZnRcIixcclxuICAgIFNQQUNFID0gXCJTcGFjZVwiLFxyXG4gICAgQ0FQU19MT0NLID0gXCJDYXBzTG9ja1wiLFxyXG4gICAgRjEgPSBcIkYxXCIsXHJcbiAgICBGMiA9IFwiRjJcIixcclxuICAgIEYzID0gXCJGM1wiLFxyXG4gICAgRjQgPSBcIkY0XCIsXHJcbiAgICBGNSA9IFwiRjVcIixcclxuICAgIEY2ID0gXCJGNlwiLFxyXG4gICAgRjcgPSBcIkY3XCIsXHJcbiAgICBGOCA9IFwiRjhcIixcclxuICAgIEY5ID0gXCJGOVwiLFxyXG4gICAgRjEwID0gXCJGMTBcIixcclxuICAgIFBBVVNFID0gXCJQYXVzZVwiLFxyXG4gICAgU0NST0xMX0xPQ0sgPSBcIlNjcm9sbExvY2tcIixcclxuICAgIE5VTVBBRDcgPSBcIk51bXBhZDdcIixcclxuICAgIE5VTVBBRDggPSBcIk51bXBhZDhcIixcclxuICAgIE5VTVBBRDkgPSBcIk51bXBhZDlcIixcclxuICAgIE5VTVBBRF9TVUJUUkFDVCA9IFwiTnVtcGFkU3VidHJhY3RcIixcclxuICAgIE5VTVBBRDQgPSBcIk51bXBhZDRcIixcclxuICAgIE5VTVBBRDUgPSBcIk51bXBhZDVcIixcclxuICAgIE5VTVBBRDYgPSBcIk51bXBhZDZcIixcclxuICAgIE5VTVBBRF9BREQgPSBcIk51bXBhZEFkZFwiLFxyXG4gICAgTlVNUEFEMSA9IFwiTnVtcGFkMVwiLFxyXG4gICAgTlVNUEFEMiA9IFwiTnVtcGFkMlwiLFxyXG4gICAgTlVNUEFEMyA9IFwiTnVtcGFkM1wiLFxyXG4gICAgTlVNUEFEMCA9IFwiTnVtcGFkMFwiLFxyXG4gICAgTlVNUEFEX0RFQ0lNQUwgPSBcIk51bXBhZERlY2ltYWxcIixcclxuICAgIFBSSU5UX1NDUkVFTiA9IFwiUHJpbnRTY3JlZW5cIixcclxuICAgIElOVExfQkFDS19TTEFTSCA9IFwiSW50bEJhY2tTbGFzaFwiLFxyXG4gICAgRjExID0gXCJGMTFcIixcclxuICAgIEYxMiA9IFwiRjEyXCIsXHJcbiAgICBOVU1QQURfRVFVQUwgPSBcIk51bXBhZEVxdWFsXCIsXHJcbiAgICBGMTMgPSBcIkYxM1wiLFxyXG4gICAgRjE0ID0gXCJGMTRcIixcclxuICAgIEYxNSA9IFwiRjE1XCIsXHJcbiAgICBGMTYgPSBcIkYxNlwiLFxyXG4gICAgRjE3ID0gXCJGMTdcIixcclxuICAgIEYxOCA9IFwiRjE4XCIsXHJcbiAgICBGMTkgPSBcIkYxOVwiLFxyXG4gICAgRjIwID0gXCJGMjBcIixcclxuICAgIEYyMSA9IFwiRjIxXCIsXHJcbiAgICBGMjIgPSBcIkYyMlwiLFxyXG4gICAgRjIzID0gXCJGMjNcIixcclxuICAgIEYyNCA9IFwiRjI0XCIsXHJcbiAgICBLQU5BX01PREUgPSBcIkthbmFNb2RlXCIsXHJcbiAgICBMQU5HMiA9IFwiTGFuZzJcIixcclxuICAgIExBTkcxID0gXCJMYW5nMVwiLFxyXG4gICAgSU5UTF9STyA9IFwiSW50bFJvXCIsXHJcbiAgICBDT05WRVJUID0gXCJDb252ZXJ0XCIsXHJcbiAgICBOT05fQ09OVkVSVCA9IFwiTm9uQ29udmVydFwiLFxyXG4gICAgSU5UTF9ZRU4gPSBcIkludGxZZW5cIixcclxuICAgIE5VTVBBRF9DT01NQSA9IFwiTnVtcGFkQ29tbWFcIixcclxuICAgIFVORE8gPSBcIlVuZG9cIixcclxuICAgIFBBU1RFID0gXCJQYXN0ZVwiLFxyXG4gICAgTUVESUFfVFJBQ0tfUFJFVklPVVMgPSBcIk1lZGlhVHJhY2tQcmV2aW91c1wiLFxyXG4gICAgQ1VUID0gXCJDdXRcIixcclxuICAgIENPUFkgPSBcIkNvcHlcIixcclxuICAgIE1FRElBX1RSQUNLX05FWFQgPSBcIk1lZGlhVHJhY2tOZXh0XCIsXHJcbiAgICBOVU1QQURfRU5URVIgPSBcIk51bXBhZEVudGVyXCIsXHJcbiAgICBDVFJMX1JJR0hUID0gXCJDb250cm9sUmlnaHRcIixcclxuICAgIEFVRElPX1ZPTFVNRV9NVVRFID0gXCJBdWRpb1ZvbHVtZU11dGVcIixcclxuICAgIExBVU5DSF9BUFAyID0gXCJMYXVuY2hBcHAyXCIsXHJcbiAgICBNRURJQV9QTEFZX1BBVVNFID0gXCJNZWRpYVBsYXlQYXVzZVwiLFxyXG4gICAgTUVESUFfU1RPUCA9IFwiTWVkaWFTdG9wXCIsXHJcbiAgICBFSkVDVCA9IFwiRWplY3RcIixcclxuICAgIEFVRElPX1ZPTFVNRV9ET1dOID0gXCJBdWRpb1ZvbHVtZURvd25cIixcclxuICAgIFZPTFVNRV9ET1dOID0gXCJWb2x1bWVEb3duXCIsXHJcbiAgICBBVURJT19WT0xVTUVfVVAgPSBcIkF1ZGlvVm9sdW1lVXBcIixcclxuICAgIFZPTFVNRV9VUCA9IFwiVm9sdW1lVXBcIixcclxuICAgIEJST1dTRVJfSE9NRSA9IFwiQnJvd3NlckhvbWVcIixcclxuICAgIE5VTVBBRF9ESVZJREUgPSBcIk51bXBhZERpdmlkZVwiLFxyXG4gICAgQUxUX1JJR0hUID0gXCJBbHRSaWdodFwiLFxyXG4gICAgSEVMUCA9IFwiSGVscFwiLFxyXG4gICAgTlVNX0xPQ0sgPSBcIk51bUxvY2tcIixcclxuICAgIEhPTUUgPSBcIkhvbWVcIixcclxuICAgIEFSUk9XX1VQID0gXCJBcnJvd1VwXCIsXHJcbiAgICBBUlJPV19SSUdIVCA9IFwiQXJyb3dSaWdodFwiLFxyXG4gICAgQVJST1dfRE9XTiA9IFwiQXJyb3dEb3duXCIsXHJcbiAgICBBUlJPV19MRUZUID0gXCJBcnJvd0xlZnRcIixcclxuICAgIEVORCA9IFwiRW5kXCIsXHJcbiAgICBQQUdFX1VQID0gXCJQYWdlVXBcIixcclxuICAgIFBBR0VfRE9XTiA9IFwiUGFnZURvd25cIixcclxuICAgIElOU0VSVCA9IFwiSW5zZXJ0XCIsXHJcbiAgICBERUxFVEUgPSBcIkRlbGV0ZVwiLFxyXG4gICAgTUVUQV9MRUZUID0gXCJNZXRhX0xlZnRcIixcclxuICAgIE9TX0xFRlQgPSBcIk9TTGVmdFwiLFxyXG4gICAgTUVUQV9SSUdIVCA9IFwiTWV0YVJpZ2h0XCIsXHJcbiAgICBPU19SSUdIVCA9IFwiT1NSaWdodFwiLFxyXG4gICAgQ09OVEVYVF9NRU5VID0gXCJDb250ZXh0TWVudVwiLFxyXG4gICAgUE9XRVIgPSBcIlBvd2VyXCIsXHJcbiAgICBCUk9XU0VSX1NFQVJDSCA9IFwiQnJvd3NlclNlYXJjaFwiLFxyXG4gICAgQlJPV1NFUl9GQVZPUklURVMgPSBcIkJyb3dzZXJGYXZvcml0ZXNcIixcclxuICAgIEJST1dTRVJfUkVGUkVTSCA9IFwiQnJvd3NlclJlZnJlc2hcIixcclxuICAgIEJST1dTRVJfU1RPUCA9IFwiQnJvd3NlclN0b3BcIixcclxuICAgIEJST1dTRVJfRk9SV0FSRCA9IFwiQnJvd3NlckZvcndhcmRcIixcclxuICAgIEJST1dTRVJfQkFDSyA9IFwiQnJvd3NlckJhY2tcIixcclxuICAgIExBVU5DSF9BUFAxID0gXCJMYXVuY2hBcHAxXCIsXHJcbiAgICBMQVVOQ0hfTUFJTCA9IFwiTGF1bmNoTWFpbFwiLFxyXG4gICAgTEFVTkNIX01FRElBX1BMQVlFUiA9IFwiTGF1bmNoTWVkaWFQbGF5ZXJcIixcclxuXHJcbiAgICAvL21hYyBicmluZ3MgdGhpcyBidXR0dG9uXHJcbiAgICBGTiA9IFwiRm5cIiwgLy9ubyBldmVudCBmaXJlZCBhY3R1YWxseVxyXG5cclxuICAgIC8vTGludXggYnJpbmdzIHRoZXNlXHJcbiAgICBBR0FJTiA9IFwiQWdhaW5cIixcclxuICAgIFBST1BTID0gXCJQcm9wc1wiLFxyXG4gICAgU0VMRUNUID0gXCJTZWxlY3RcIixcclxuICAgIE9QRU4gPSBcIk9wZW5cIixcclxuICAgIEZJTkQgPSBcIkZpbmRcIixcclxuICAgIFdBS0VfVVAgPSBcIldha2VVcFwiLFxyXG4gICAgTlVNUEFEX1BBUkVOVF9MRUZUID0gXCJOdW1wYWRQYXJlbnRMZWZ0XCIsXHJcbiAgICBOVU1QQURfUEFSRU5UX1JJR0hUID0gXCJOdW1wYWRQYXJlbnRSaWdodFwiLFxyXG5cclxuICAgIC8vYW5kcm9pZFxyXG4gICAgU0xFRVAgPSBcIlNsZWVwXCJcclxuICB9XHJcblxyXG4gIGV4cG9ydCBlbnVtIEtFWUJPQVJEX0NPREVfREUge1xyXG4gICAgWiA9IEtFWUJPQVJEX0NPREUuWSxcclxuICAgIFkgPSBLRVlCT0FSRF9DT0RFLlosXHJcbiAgICDDliA9IEtFWUJPQVJEX0NPREUuU0VNSUNPTE9OLFxyXG4gICAgw4QgPSBLRVlCT0FSRF9DT0RFLlFVT1RFLFxyXG4gICAgw5wgPSBLRVlCT0FSRF9DT0RFLkJSQUNLRVRfTEVGVCxcclxuICAgIEhBU0ggPSBLRVlCT0FSRF9DT0RFLkJBQ0tTTEFTSCxcclxuICAgIFBMVVMgPSBLRVlCT0FSRF9DT0RFLkJSQUNLRVRfUklHSFQsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgXHJcbiAgICDDnyA9IEtFWUJPQVJEX0NPREUuTUlOVVMsXHJcbiAgICBBQ1VURSA9IEtFWUJPQVJEX0NPREUuRVFVQUwsXHJcbiAgICBMRVNTX1RIQU4gPSBLRVlCT0FSRF9DT0RFLklOVExfQkFDS19TTEFTSCxcclxuICAgIE1JTlVTID0gS0VZQk9BUkRfQ09ERS5TTEFTSFxyXG4gIH1cclxuXHJcbiAgLyogXHJcbiAgRmlyZWZveCBjYW4ndCBtYWtlIHVzZSBvZiB0aG9zZSBidXR0b25zIGFuZCBDb21iaW5hdGlvbnM6XHJcbiAgU0lOR0VMRV9CVVRUT05TOlxyXG4gICBEcnVjayxcclxuICBDT01CSU5BVElPTlM6XHJcbiAgIFNoaWZ0ICsgRjEwLCBTaGlmdCArIE51bXBhZDUsXHJcbiAgIENUUkwgKyBxLCBDVFJMICsgRjQsXHJcbiAgIEFMVCArIEYxLCBBTFQgKyBGMiwgQUxUICsgRjMsIEFMVCArIEY3LCBBTFQgKyBGOCwgQUxUICsgRjEwXHJcbiAgT3BlcmEgd29uJ3QgZG8gZ29vZCB3aXRoIHRoZXNlIEJ1dHRvbnMgYW5kIGNvbWJpbmF0aW9uczpcclxuICBTSU5HTEVfQlVUVE9OUzpcclxuICAgRmxvYXQzMkFycmF5LCBGMTEsIEFMVCxcclxuICBDT01CSU5BVElPTlM6XHJcbiAgIENUUkwgKyBxLCBDVFJMICsgdCwgQ1RSTCArIGgsIENUUkwgKyBnLCBDVFJMICsgbiwgQ1RSTCArIGYgXHJcbiAgIEFMVCArIEYxLCBBTFQgKyBGMiwgQUxUICsgRjQsIEFMVCArIEY1LCBBTFQgKyBGNiwgQUxUICsgRjcsIEFMVCArIEY4LCBBTFQgKyBGMTBcclxuICAgKi9cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBjb25zdCBlbnVtIEVWRU5UX1RJTUVSIHtcclxuICAgIENBTEwgPSBcIsaSbGFwc2VcIlxyXG4gIH1cclxuICAvKipcclxuICAgKiBBbiBldmVudCB0aGF0IHJlcHJlc2VudHMgYSBjYWxsIGZyb20gYSB7QGxpbmsgVGltZXJ9XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEV2ZW50VGltZXIge1xyXG4gICAgcHVibGljIHR5cGU6IEVWRU5UX1RJTUVSID0gRVZFTlRfVElNRVIuQ0FMTDtcclxuICAgIHB1YmxpYyB0YXJnZXQ6IFRpbWVyO1xyXG4gICAgcHVibGljIGFyZ3VtZW50czogT2JqZWN0W107XHJcbiAgICBwdWJsaWMgZmlyc3RDYWxsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBsYXN0Q2FsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNvdW50OiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90aW1lcjogVGltZXIsIC4uLl9hcmd1bWVudHM6IE9iamVjdFtdKSB7XHJcbiAgICAgIHRoaXMudGFyZ2V0ID0gX3RpbWVyO1xyXG4gICAgICB0aGlzLmFyZ3VtZW50cyA9IF9hcmd1bWVudHM7XHJcbiAgICAgIHRoaXMuZmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBDdXN0b20gdG91Y2ggZXZlbnRzXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gRVZFTlRfVE9VQ0gge1xyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCBpbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgdG91Y2htb3ZlLCBkZXRhaWxzIG9mZnNldCB0byBzdGFydGluZyB0b3VjaCAqL1xyXG4gICAgTU9WRSA9IFwidG91Y2hNb3ZlXCIsXHJcbiAgICAvKiogY3VzdG9tIGV2ZW50IGZpcmVkIHdoZW4gdGhlIHRvdWNoZXMgaGF2ZW4ndCBtb3ZlZCBvdXRzaWRlIG9mIHRoZSB0YXAgcmFkaXVzICovXHJcbiAgICBUQVAgPSBcInRvdWNoVGFwXCIsXHJcbiAgICAvKiogY3VzdG9tIGV2ZW50IGZpcmVkIHdoZW4gdGhlIHRvdWNoZXMgaGF2ZSBtb3ZlZCBvdXRzaWRlIG9mIHRoZSBub3RjaCByYWRpdXMsIGRldGFpbHMgb2Zmc2V0IGFuZCBjYXJkaW5hbCBkaXJlY3Rpb24gKi9cclxuICAgIE5PVENIID0gXCJ0b3VjaE5vdGNoXCIsXHJcbiAgICAvKiogY3VzdG9tIGV2ZW50IGZpcmVkIHdoZW4gdGhlIHRvdWNoZXMgaGF2ZW4ndCBtb3ZlZCBvdXRzaWRlIG9mIHRoZSB0YXAgcmFkaXVzIGZvciBzb21lIHRpbWUgKi9cclxuICAgIExPTkcgPSBcInRvdWNoTG9uZ1wiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHR3byB0YXBzIHdlcmUgZGV0ZWN0ZWQgaW4gc2hvcnQgc3VjY2Vzc2lvbiAqL1xyXG4gICAgRE9VQkxFID0gXCJ0b3VjaERvdWJsZVwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBmaXJlZCB3aGVuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBvbmx5IHR3byB0b3VjaGVzIGNoYW5nZXMgYmV5b25kIGEgdG9sZXJhbmNlICovXHJcbiAgICBQSU5DSCA9IFwidG91Y2hQaW5jaFwiLFxyXG4gICAgLyoqIGN1c3RvbSBldmVudCBub3QgaW1wbGVtZW50ZWQgeWV0ICovXHJcbiAgICBST1RBVEUgPSBcInRvdWNoUm90YXRlXCJcclxuICB9XHJcblxyXG4gIC8qKiBEZXRhaWxzIGZvciBDdXN0b21Ub3VjaEV2ZW50cywgdXNlIGFzIGdlbmVyaWMgQ3VzdG9tRXZlbnQ8RXZlbnRUb3VjaERldGFpbD4gKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEV2ZW50VG91Y2hEZXRhaWwge1xyXG4gICAgcG9zaXRpb246IFZlY3RvcjI7XHJcbiAgICB0b3VjaGVzOiBUb3VjaExpc3Q7XHJcbiAgICBvZmZzZXQ/OiBWZWN0b3IyO1xyXG4gICAgbW92ZW1lbnQ/OiBWZWN0b3IyO1xyXG4gICAgY2FyZGluYWw/OiBWZWN0b3IyO1xyXG4gICAgcGluY2g/OiBWZWN0b3IyO1xyXG4gICAgcGluY2hEZWx0YT86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc3BhdGNoZXMgQ3VzdG9tVG91Y2hFdmVudHMgdG8gdGhlIEV2ZW50VGFyZ2V0IGdpdmVuIHdpdGggdGhlIGNvbnN0cnVjdG9yLlxyXG4gICAqIFdoZW4gdXNpbmcgdG91Y2ggZXZlbnRzLCBtYWtlIHN1cmUgdG8gc2V0IGB0b3VjaC1hY3Rpb246IG5vbmVgIGluIENTUyBcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRvdWNoRXZlbnREaXNwYXRjaGVyIHtcclxuICAgIHB1YmxpYyBwb3NTdGFydDogVmVjdG9yMiA9IFZlY3RvcjIuWkVSTygpO1xyXG4gICAgcHVibGljIHBvc05vdGNoOiBWZWN0b3IyID0gVmVjdG9yMi5aRVJPKCk7XHJcbiAgICBwdWJsaWMgcmFkaXVzVGFwOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgcmFkaXVzTm90Y2g6IG51bWJlcjtcclxuICAgIHByaXZhdGUgdGFyZ2V0OiBFdmVudFRhcmdldDtcclxuICAgIHByaXZhdGUgcG9zUHJldjogVmVjdG9yMiA9IFZlY3RvcjIuWkVSTygpO1xyXG4gICAgcHJpdmF0ZSBtb3ZlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSB0aW1lckRvdWJsZTogVGltZXI7XHJcbiAgICBwcml2YXRlIHRpbWVyTG9uZzogVGltZXI7XHJcbiAgICBwcml2YXRlIHRpbWVEb3VibGU6IG51bWJlcjtcclxuICAgIHByaXZhdGUgdGltZUxvbmc6IG51bWJlcjtcclxuICAgIHByaXZhdGUgdGltZTogVGltZSA9IG5ldyBUaW1lKCk7XHJcbiAgICBwcml2YXRlIHBpbmNoRGlzdGFuY2U6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHBpbmNoVG9sZXJhbmNlOiBudW1iZXIgPSAxO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfdGFyZ2V0OiBFdmVudFRhcmdldCwgX3JhZGl1c1RhcDogbnVtYmVyID0gNSwgX3JhZGl1c05vdGNoOiBudW1iZXIgPSA1MCwgX3RpbWVEb3VibGU6IG51bWJlciA9IDIwMCwgX3RpbWVyTG9uZzogbnVtYmVyID0gMTAwMCkge1xyXG4gICAgICB0aGlzLnRhcmdldCA9IF90YXJnZXQ7XHJcbiAgICAgIHRoaXMucmFkaXVzVGFwID0gX3JhZGl1c1RhcDtcclxuICAgICAgdGhpcy5yYWRpdXNOb3RjaCA9IF9yYWRpdXNOb3RjaDtcclxuICAgICAgdGhpcy50aW1lRG91YmxlID0gX3RpbWVEb3VibGU7XHJcbiAgICAgIHRoaXMudGltZUxvbmcgPSBfdGltZXJMb25nO1xyXG4gICAgICB0aGlzLmFjdGl2YXRlKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGUtL0FjdGl2YXRlcyB0aGUgZGlzcGF0Y2ggb2YgQ3VzdG9tVG91Y2hFdmVudHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICBpZiAoX29uKSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgPEV2ZW50TGlzdGVuZXI+dGhpcy5obmRFdmVudCk7XHJcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIDxFdmVudExpc3RlbmVyPnRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgPEV2ZW50TGlzdGVuZXI+dGhpcy5obmRFdmVudCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCA8RXZlbnRMaXN0ZW5lcj50aGlzLmhuZEV2ZW50KTtcclxuICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIDxFdmVudExpc3RlbmVyPnRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICB0aGlzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIDxFdmVudExpc3RlbmVyPnRoaXMuaG5kRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaG5kRXZlbnQgPSAoX2V2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIF9ldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBsZXQgdG91Y2hGaXJzdDogVG91Y2ggPSBfZXZlbnQudG91Y2hlc1swXTtcclxuICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IyID0gdGhpcy5jYWxjQXZlcmFnZVBvc2l0aW9uKF9ldmVudC50b3VjaGVzKTsgLy9uZXcgVmVjdG9yMih0b3VjaEZpcnN0Py5jbGllbnRYLCB0b3VjaEZpcnN0Py5jbGllbnRZKTtcclxuICAgICAgbGV0IG9mZnNldDogVmVjdG9yMjtcclxuXHJcbiAgICAgIHN3aXRjaCAoX2V2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlIFwidG91Y2hzdGFydFwiOlxyXG4gICAgICAgICAgdGhpcy5tb3ZlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zdGFydEdlc3R1cmUocG9zaXRpb24pO1xyXG5cclxuICAgICAgICAgIGlmIChfZXZlbnQudG91Y2hlcy5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICAvLyByZXNldCBwaW5jaFxyXG4gICAgICAgICAgICBsZXQgcGluY2g6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMihfZXZlbnQudG91Y2hlc1sxXS5jbGllbnRYIC0gdG91Y2hGaXJzdC5jbGllbnRYLCBfZXZlbnQudG91Y2hlc1sxXS5jbGllbnRZIC0gdG91Y2hGaXJzdC5jbGllbnRZKTtcclxuICAgICAgICAgICAgdGhpcy5waW5jaERpc3RhbmNlID0gcGluY2gubWFnbml0dWRlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBkaXNwYXRjaExvbmc6IFRpbWVySGFuZGxlciA9IChfZXZlbnRUaW1lcjogRXZlbnRUaW1lcik6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy50YXJnZXQuZGlzcGF0Y2hFdmVudChcclxuICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8RXZlbnRUb3VjaERldGFpbD4oRVZFTlRfVE9VQ0guTE9ORywge1xyXG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiB7IHBvc2l0aW9uOiBwb3NpdGlvbiwgdG91Y2hlczogX2V2ZW50LnRvdWNoZXMgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRoaXMudGltZXJMb25nPy5jbGVhcigpO1xyXG4gICAgICAgICAgdGhpcy50aW1lckxvbmcgPSBuZXcgVGltZXIodGhpcy50aW1lLCB0aGlzLnRpbWVMb25nLCAxLCBkaXNwYXRjaExvbmcpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInRvdWNoZW5kXCI6XHJcbiAgICAgICAgICB0aGlzLnRpbWVyTG9uZz8uY2xlYXIoKTtcclxuXHJcbiAgICAgICAgICBpZiAoX2V2ZW50LnRvdWNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBzdGlsbCB0b3VjaGVzIGFjdGl2ZVxyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0R2VzdHVyZShwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBkaXNwYXRjaFRhcDogVGltZXJIYW5kbGVyID0gKF9ldmVudFRpbWVyOiBFdmVudFRpbWVyKTogdm9pZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+KEVWRU5UX1RPVUNILlRBUCwge1xyXG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiB7IHBvc2l0aW9uOiBwb3NpdGlvbiwgdG91Y2hlczogX2V2ZW50LnRvdWNoZXMgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIHdhcyBhIHRhcCBiZWZvcmUgYW5kIHRpbWVyIGlzIHN0aWxsIHJ1bm5pbmcgLT4gZG91YmxlIHRhcFxyXG4gICAgICAgICAgaWYgKHRoaXMudGltZXJEb3VibGU/LmFjdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVyRG91YmxlLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMudGltZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+KEVWRU5UX1RPVUNILkRPVUJMRSwge1xyXG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwgZGV0YWlsOiB7IHBvc2l0aW9uOiBwb3NpdGlvbiwgdG91Y2hlczogX2V2ZW50LnRvdWNoZXMgfVxyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubW92ZWQpXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIHdhcyBtb3ZlbWVudCwgb3RoZXJ3aXNlIHNldCB0aW1lciB0byBmaXJlIHRhcFxyXG4gICAgICAgICAgICB0aGlzLnRpbWVyRG91YmxlID0gbmV3IFRpbWVyKHRoaXMudGltZSwgdGhpcy50aW1lRG91YmxlLCAxLCBkaXNwYXRjaFRhcCk7XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInRvdWNobW92ZVwiOlxyXG4gICAgICAgICAgdGhpcy5kZXRlY3RQaW5jaChfZXZlbnQsIHBvc2l0aW9uKTtcclxuICAgICAgICAgIG9mZnNldCA9IFZlY3RvcjIuRElGRkVSRU5DRSh0aGlzLnBvc1ByZXYsIHRoaXMucG9zU3RhcnQpO1xyXG4gICAgICAgICAgdGhpcy5tb3ZlZCB8fD0gKG9mZnNldC5tYWduaXR1ZGUgPCB0aGlzLnJhZGl1c1RhcCk7IC8vIHJlbWVtYmVyIHRoYXQgdG91Y2ggbW92ZWQgb3ZlciB0YXAgcmFkaXVzXHJcbiAgICAgICAgICBsZXQgbW92ZW1lbnQ6IFZlY3RvcjIgPSBWZWN0b3IyLkRJRkZFUkVOQ0UocG9zaXRpb24sIHRoaXMucG9zUHJldik7XHJcbiAgICAgICAgICB0aGlzLnRhcmdldC5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8RXZlbnRUb3VjaERldGFpbD4oRVZFTlRfVE9VQ0guTU9WRSwge1xyXG4gICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBwb3NpdGlvbjogcG9zaXRpb24sIHRvdWNoZXM6IF9ldmVudC50b3VjaGVzLCBvZmZzZXQ6IG9mZnNldCwgbW92ZW1lbnQ6IG1vdmVtZW50IH1cclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgLy8gZmlyZSBub3RjaCB3aGVuIHRvdWNoZXMgbW92ZWQgb3V0IG9mIG5vdGNoIHJhZGl1cyBhbmQgcmVzZXQgbm90Y2hcclxuICAgICAgICAgIG9mZnNldCA9IFZlY3RvcjIuRElGRkVSRU5DRShwb3NpdGlvbiwgdGhpcy5wb3NOb3RjaCk7XHJcbiAgICAgICAgICBpZiAob2Zmc2V0Lm1hZ25pdHVkZSA+IHRoaXMucmFkaXVzTm90Y2gpIHtcclxuICAgICAgICAgICAgbGV0IGNhcmRpbmFsOiBWZWN0b3IyID0gTWF0aC5hYnMob2Zmc2V0LngpID4gTWF0aC5hYnMob2Zmc2V0LnkpID9cclxuICAgICAgICAgICAgICBWZWN0b3IyLlgob2Zmc2V0LnggPCAwID8gLTEgOiAxKSA6XHJcbiAgICAgICAgICAgICAgVmVjdG9yMi5ZKG9mZnNldC55IDwgMCA/IC0xIDogMSk7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PEV2ZW50VG91Y2hEZXRhaWw+KEVWRU5UX1RPVUNILk5PVENILCB7XHJcbiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLCBkZXRhaWw6IHsgcG9zaXRpb246IHBvc2l0aW9uLCB0b3VjaGVzOiBfZXZlbnQudG91Y2hlcywgb2Zmc2V0OiBvZmZzZXQsIGNhcmRpbmFsOiBjYXJkaW5hbCwgbW92ZW1lbnQ6IG1vdmVtZW50IH1cclxuICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIHRoaXMucG9zTm90Y2ggPSBwb3NpdGlvbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vVE9ETzogcGluY2gsIHJvdGF0ZS4uLlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnBvc1ByZXYuc2V0KHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIGRldGVjdFBpbmNoID0gKF9ldmVudDogVG91Y2hFdmVudCwgX3Bvc2l0aW9uOiBWZWN0b3IyKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmIChfZXZlbnQudG91Y2hlcy5sZW5ndGggIT0gMilcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBsZXQgdDogVG91Y2hMaXN0ID0gX2V2ZW50LnRvdWNoZXM7XHJcbiAgICAgIGxldCBwaW5jaDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKHRbMV0uY2xpZW50WCAtIHRbMF0uY2xpZW50WCwgdFsxXS5jbGllbnRZIC0gdFswXS5jbGllbnRZKTtcclxuICAgICAgbGV0IHBpbmNoRGlzdGFuY2U6IG51bWJlciA9IHBpbmNoLm1hZ25pdHVkZTtcclxuICAgICAgbGV0IHBpbmNoRGVsdGE6IG51bWJlciA9IHBpbmNoRGlzdGFuY2UgLSB0aGlzLnBpbmNoRGlzdGFuY2U7XHJcbiAgICAgIGlmIChNYXRoLmFicyhwaW5jaERlbHRhKSA+IHRoaXMucGluY2hUb2xlcmFuY2UpXHJcbiAgICAgICAgdGhpcy50YXJnZXQuZGlzcGF0Y2hFdmVudChcclxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudDxFdmVudFRvdWNoRGV0YWlsPihFVkVOVF9UT1VDSC5QSU5DSCwge1xyXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLCBkZXRhaWw6IHsgcG9zaXRpb246IF9wb3NpdGlvbiwgdG91Y2hlczogX2V2ZW50LnRvdWNoZXMsIHBpbmNoOiBwaW5jaCwgcGluY2hEZWx0YTogcGluY2hEZWx0YSB9XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgIHRoaXMucGluY2hEaXN0YW5jZSA9IHBpbmNoRGlzdGFuY2U7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgc3RhcnRHZXN0dXJlKF9wb3NpdGlvbjogVmVjdG9yMik6IHZvaWQge1xyXG4gICAgICB0aGlzLnBvc05vdGNoLnNldChfcG9zaXRpb24ueCwgX3Bvc2l0aW9uLnkpO1xyXG4gICAgICB0aGlzLnBvc1N0YXJ0LnNldChfcG9zaXRpb24ueCwgX3Bvc2l0aW9uLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY0F2ZXJhZ2VQb3NpdGlvbihfdG91Y2hlczogVG91Y2hMaXN0KTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBhdmVyYWdlOiBWZWN0b3IyID0gVmVjdG9yMi5aRVJPKCk7XHJcbiAgICAgIGZvciAobGV0IHRvdWNoIG9mIF90b3VjaGVzKSB7XHJcbiAgICAgICAgYXZlcmFnZS54ICs9IHRvdWNoLmNsaWVudFg7XHJcbiAgICAgICAgYXZlcmFnZS55ICs9IHRvdWNoLmNsaWVudFk7XHJcbiAgICAgIH1cclxuICAgICAgYXZlcmFnZS5zY2FsZSgxIC8gX3RvdWNoZXMubGVuZ3RoKTtcclxuICAgICAgcmV0dXJuIGF2ZXJhZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBIG5vZGUgbWFuYWdlZCBieSB7QGxpbmsgUHJvamVjdH0gdGhhdCBmdW5jdGlvbnMgYXMgYSB0ZW1wbGF0ZSBmb3Ige0BsaW5rIEdyYXBoSW5zdGFuY2V9cyBcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9SZXNvdXJjZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBHcmFwaCBleHRlbmRzIE5vZGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGVSZXNvdXJjZSB7XHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gI3N5bmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiR3JhcGhcIikge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5NVVRBVEUsIHRoaXMuaG5kTXV0YXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UgPSB0aGlzLmlkUmVzb3VyY2U7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udHlwZSA9IHRoaXMudHlwZTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMsIF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2UpO1xyXG4gICAgICBhd2FpdCBQcm9qZWN0LnJlc3luY0dyYXBoSW5zdGFuY2VzKHRoaXMpO1xyXG4gICAgICB0aGlzLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVC5HUkFQSF9ERVNFUklBTElaRUQpKTtcclxuICAgICAgY29uc29sZS5sb2coXCJEZXNlcmlhbGl6ZWRcIiwgdGhpcy5uYW1lKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBobmRNdXRhdGUgPSBhc3luYyAoX2V2ZW50OiBDdXN0b21FdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG5cclxuICAgICAgLy8gVE9ETzogaWYgcGF0aCBjb250YWlucyBhIGdyYXBoIGluc3RhbmNlIGJlbG93IHRoaXMsIGRvbid0IGRpc3BhdGNoIVxyXG4gICAgICAvLyBsZXQgcGF0aDogTm9kZVtdID0gUmVmbGVjdC5nZXQoX2V2ZW50LCBcInBhdGhcIik7XHJcbiAgICAgIC8vIGZvciAobGV0IG5vZGUgb2YgcGF0aClcclxuICAgICAgLy8gICBpZiAobm9kZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UgJiYgbm9kZS5pZFNvdXJjZSAhPSB0aGlzLmlkUmVzb3VyY2UpXHJcbiAgICAgIC8vICAgICByZXR1cm47XHJcblxyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkdyYXBoIG11dGF0ZXNcIiwgdGhpcy5uYW1lKTtcclxuICAgICAgLy8gdGhpcy4jc3luY2luZyA9IHRydWU7XHJcbiAgICAgIF9ldmVudC5kZXRhaWwucGF0aCA9IFJlZmxlY3QuZ2V0KF9ldmVudCwgXCJwYXRoXCIpOyAvLyBzYXZlIHBhdGggdG8gdGFyZ2V0IGluIGRldGFpbFxyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEVWRU5ULk1VVEFURV9HUkFQSCwgeyBkZXRhaWw6IF9ldmVudC5kZXRhaWwgfSkpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEVWRU5ULkdSQVBIX01VVEFURUQsIHsgZGV0YWlsOiBfZXZlbnQuZGV0YWlsIH0pKTtcclxuICAgICAgLy8gdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5NVVRBVEVfSU5TVEFOQ0UpKTtcclxuICAgICAgLy8gdGhpcy4jc3luY2luZyA9IGZhbHNlO1xyXG4gICAgfTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgR3JhcGh9IGxvYWRlZCBmcm9tIGEgZ2xURi1GaWxlLlxyXG4gICAqIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBHcmFwaEdMVEYgZXh0ZW5kcyBtaXhpblNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwoR3JhcGgpIHtcclxuICAgIHB1YmxpYyBhc3luYyBsb2FkKF91cmw6IFJlcXVlc3RJbmZvID0gdGhpcy51cmwsIF9uYW1lOiBzdHJpbmcgPSB0aGlzLm5hbWUpOiBQcm9taXNlPEdyYXBoR0xURj4ge1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICByZXR1cm4gR0xURkxvYWRlci5sb2FkUmVzb3VyY2UodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSh0cnVlKTtcclxuICAgICAgZGVsZXRlIHNlcmlhbGl6YXRpb24uY29tcG9uZW50c1tDb21wb25lbnRTa2VsZXRvbi5uYW1lXTtcclxuICAgICAgZGVsZXRlIHNlcmlhbGl6YXRpb24uY2hpbGRyZW47XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvLyBlbnVtIFNZTkMge1xyXG4gIC8vICAgUkVBRFksIEdSQVBIX1NZTkNFRCwgR1JBUEhfRE9ORSwgSU5TVEFOQ0VcclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuIGluc3RhbmNlIG9mIGEge0BsaW5rIEdyYXBofS4gIFxyXG4gICAqIFRoaXMgbm9kZSBrZWVwcyBhIHJlZmVyZW5jZSB0byBpdHMgcmVzb3VyY2UgYW4gY2FuIHRodXMgb3B0aW1pemUgc2VyaWFsaXphdGlvblxyXG4gICAqIEBhdXRob3IgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL1Jlc291cmNlXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEdyYXBoSW5zdGFuY2UgZXh0ZW5kcyBOb2RlIHtcclxuICAgIC8qKiBpZCBvZiB0aGUgcmVzb3VyY2UgdGhhdCBpbnN0YW5jZSB3YXMgY3JlYXRlZCBmcm9tICovXHJcbiAgICAvLyBUT0RPOiBleGFtaW5lLCBpZiB0aGlzIHNob3VsZCBiZSBhIGRpcmVjdCByZWZlcmVuY2UgdG8gdGhlIEdyYXBoLCBpbnN0ZWFkIG9mIHRoZSBpZFxyXG4gICAgcHVibGljIHN0YXRpYyBjb3VudDogbnVtYmVyID0gMDtcclxuICAgICNpZFNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gI3N5bmM6IFNZTkMgPSBTWU5DLlJFQURZO1xyXG4gICAgI2Rlc2VyaWFsaXplRnJvbVNvdXJjZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGFsb25lIHdpbGwgbm90IGNyZWF0ZSBhIHJlY29uc3RydWN0aW9uLCBidXQgb25seSBzYXZlIHRoZSBpZC5cclxuICAgICAqIFRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZ3JhcGgsIGNhbGwgcmVzZXQgb24gdGhpcyBvciBzZXQgd2l0aCBhIGdyYXBoIGFzIHBhcmFtZXRlci5cclxuICAgICAqIFByZWZlciBQcm9qZWN0LmNyZWF0ZUdyYXBoSW5zdGFuY2UoX2dyYXBoKS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ncmFwaD86IEdyYXBoKSB7XHJcbiAgICAgIHN1cGVyKFwiR3JhcGhJbnN0YW5jZVwiKTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk1VVEFURSwgdGhpcy5obmRNdXRhdGlvbkluc3RhbmNlKTtcclxuXHJcbiAgICAgIGlmICghX2dyYXBoKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgdGhpcy4jaWRTb3VyY2UgPSBfZ3JhcGguaWRSZXNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlkU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNpZFNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY3JlYXRlIHRoaXMgbm9kZSBmcm9tIHRoZSB7QGxpbmsgR3JhcGh9IHJlZmVyZW5jZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgcmVzb3VyY2U6IEdyYXBoID0gPEdyYXBoPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UodGhpcy4jaWRTb3VyY2UpO1xyXG4gICAgICBhd2FpdCB0aGlzLnNldChyZXNvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9UT0RPOiBvcHRpbWl6ZSB1c2luZyB0aGUgcmVmZXJlbmNlZCBHcmFwaCwgc2VyaWFsaXplL2Rlc2VyaWFsaXplIG9ubHkgdGhlIGRpZmZlcmVuY2VzXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgZmlsdGVyOiBDb21wb25lbnRHcmFwaEZpbHRlciA9IHRoaXMuZ2V0Q29tcG9uZW50KENvbXBvbmVudEdyYXBoRmlsdGVyKTtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7fTtcclxuXHJcbiAgICAgIGlmIChmaWx0ZXIgJiYgZmlsdGVyLmlzQWN0aXZlKSB7IC8vIGlmIGdyYXBoIHN5bmNocm9uaXNhdGlvbiBpcyB1bmZpbHRlcmVkLCBrbm93aW5nIHRoZSBzb3VyY2UgaXMgc3VmZmljaWVudCBmb3Igc2VyaWFsaXphdGlvblxyXG4gICAgICAgIHNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgICBsZXQgZ3JhcGg6IEdyYXBoID0gdGhpcy5nZXQoKTtcclxuICAgICAgICBpZiAoZ3JhcGggaW5zdGFuY2VvZiBHcmFwaEdMVEYpIHsgLy8gbGlrZSBmb3IgdGhlIEdyYXBoR0xURjogY2hpbGRyZW4gYW5kIGNvbXBvbmVudHMgbG9hZGVkIGZyb20gZ2x0ZiBtdXN0IG5ldmVyIGJlIHNlcmlhbGl6ZWRcclxuICAgICAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLmNvbXBvbmVudHNbQ29tcG9uZW50U2tlbGV0b24ubmFtZV07XHJcbiAgICAgICAgICBkZWxldGUgc2VyaWFsaXphdGlvbi5jaGlsZHJlbjtcclxuICAgICAgICAgIHNlcmlhbGl6YXRpb24udXJsID0gZ3JhcGgudXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplRnJvbVNvdXJjZSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgc2VyaWFsaXphdGlvbi5pZFNvdXJjZSA9IHRoaXMuI2lkU291cmNlO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLiNpZFNvdXJjZSA9IF9zZXJpYWxpemF0aW9uLmlkU291cmNlID8/IF9zZXJpYWxpemF0aW9uLmlkUmVzb3VyY2U7XHJcbiAgICAgIGlmICghX3NlcmlhbGl6YXRpb24uZGVzZXJpYWxpemVGcm9tU291cmNlKSB7XHJcbiAgICAgICAgbGV0IGdyYXBoOiBHcmFwaCA9IDxHcmFwaD48dW5rbm93bj5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKHRoaXMuI2lkU291cmNlKTtcclxuICAgICAgICBpZiAoZ3JhcGggaW5zdGFuY2VvZiBHcmFwaEdMVEYpXHJcbiAgICAgICAgICBhd2FpdCBHTFRGTG9hZGVyLmxvYWRSZXNvdXJjZSh0aGlzLCBfc2VyaWFsaXphdGlvbi51cmwpO1xyXG5cclxuICAgICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7IC8vIGluc3RhbmNlIGlzIGRlc2VyaWFsaXplZCBmcm9tIGluZGl2aWR1YWwgZGF0YVxyXG5cclxuICAgICAgICB0aGlzLiNkZXNlcmlhbGl6ZUZyb21Tb3VyY2UgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGdyYXBoOiBHcmFwaCA9IHRoaXMuZ2V0KCk7XHJcbiAgICAgIGlmIChncmFwaClcclxuICAgICAgICAvLyBpZiAoX3NlcmlhbGl6YXRpb24uZGVzZXJpYWxpemVGcm9tU291cmNlKSAvLyBubyBjb21wb25lbnRzLT4gYXNzdW1lIHN5bmNocm9uaXplZCBHcmFwaEluc3RhbmNlXHJcbiAgICAgICAgLy8gICBhd2FpdCB0aGlzLnNldChncmFwaCk7IC8vIHJlY3JlYXRlIGNvbXBsZXRlIGluc3RhbmNlIGZyb20gc291cmNlIGdyYXBoXHJcbiAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0VG9HcmFwaCgpOyAvLyBvdGhlcndpc2UganVzdCBjb25uZWN0XHJcbiAgICAgIC8vIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJSZWdpc3RlciBmb3IgcmVzeW5jXCIsIF9zZXJpYWxpemF0aW9uLm5hbWUsIHRoaXMubmFtZSk7XHJcbiAgICAgICAgUHJvamVjdC5yZWdpc3RlckdyYXBoSW5zdGFuY2VGb3JSZXN5bmModGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0cyB0aGlzIGdyYXBoIGluc3RhbmNlIHRvIHRoZSBncmFwaCByZWZlcmVuY2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgY29ubmVjdFRvR3JhcGgoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBncmFwaDogR3JhcGggPSB0aGlzLmdldCgpO1xyXG4gICAgICBpZiAodGhpcy4jZGVzZXJpYWxpemVGcm9tU291cmNlKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0KGdyYXBoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGlzIG5vZGUgdG8gYmUgYSByZWNyZWF0aW9uIG9mIHRoZSB7QGxpbmsgR3JhcGh9IGdpdmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBzZXQoX2dyYXBoOiBHcmFwaCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICB0aGlzLiNpZFNvdXJjZSA9IF9ncmFwaC5pZFJlc291cmNlO1xyXG5cclxuICAgICAgbGV0IGN1cnJlbnRHcmFwaDogR3JhcGggPSB0aGlzLmdldCgpO1xyXG4gICAgICBpZiAoY3VycmVudEdyYXBoKSB7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJCZWZvcmUgUmVtb3ZlXCIsIGN1cnJlbnRHcmFwaC5uYW1lLCB0aGlzLm5hbWUsIGN1cnJlbnRHcmFwaC5saXN0ZW5lcnMpO1xyXG4gICAgICAgIGN1cnJlbnRHcmFwaC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk1VVEFURV9HUkFQSCwgdGhpcy5obmRNdXRhdGlvbkdyYXBoKTtcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFmdGVyIFJlbW92ZVwiLCBjdXJyZW50R3JhcGgubmFtZSwgdGhpcy5uYW1lLCBjdXJyZW50R3JhcGgubGlzdGVuZXJzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVE9ETzogZXhhbWluZSwgaWYgdGhlIHNlcmlhbGl6YXRpb24gc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgR3JhcGggZm9yIG9wdGltaXphdGlvbiA8LSBhbHNvIHVzZWZ1bCBmb3Igc3luYyB3aXRoIGluc3RhbmNlc1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplKF9ncmFwaCk7XHJcbiAgICAgIC8vU2VyaWFsaXplci5kZXNlcmlhbGl6ZShzZXJpYWxpemF0aW9uKTtcclxuICAgICAgZm9yIChsZXQgcGF0aCBpbiBzZXJpYWxpemF0aW9uKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kZXNlcmlhbGl6ZShzZXJpYWxpemF0aW9uW3BhdGhdKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc29sZS5sb2codGhpcy5uYW1lICsgR3JhcGhJbnN0YW5jZS5jb3VudCsrKTtcclxuXHJcbiAgICAgIC8vIGdyYXBoLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTVVUQVRFLCAoX2V2ZW50OiBDdXN0b21FdmVudCkgPT4gdGhpcy5obmRNdXRhdGlvbiwgdHJ1ZSk7XHJcbiAgICAgIF9ncmFwaC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk1VVEFURV9HUkFQSCwgdGhpcy5obmRNdXRhdGlvbkdyYXBoKTtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiQWRkXCIsIF9ncmFwaC5uYW1lLCB0aGlzLm5hbWUsIF9ncmFwaC5saXN0ZW5lcnMpO1xyXG4gICAgICAvLyBncmFwaC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk1VVEFURV9HUkFQSF9ET05FLCAoKSA9PiB7IGNvbnNvbGUubG9nKFwiRG9uZVwiLCB0aGlzLm5hbWUpOyAvKiB0aGlzLiNzeW5jID0gdHJ1ZTsgKi8gfSk7XHJcblxyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgY29uc29sZS5sb2coX2dyYXBoPy5saXN0ZW5lcnMpO1xyXG4gICAgICB0aGlzLmJyb2FkY2FzdEV2ZW50KG5ldyBFdmVudChFVkVOVC5HUkFQSF9JTlNUQU5USUFURUQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBncmFwaCB0aGlzIGluc3RhbmNlcyByZWZlcnMgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBHcmFwaCB7XHJcbiAgICAgIHJldHVybiA8R3JhcGg+UHJvamVjdC5yZXNvdXJjZXNbdGhpcy4jaWRTb3VyY2VdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU291cmNlIGdyYXBoIG11dGF0ZWQsIHJlZmxlY3QgbXV0YXRpb24gaW4gdGhpcyBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhuZE11dGF0aW9uR3JhcGggPSBhc3luYyAoX2V2ZW50OiBDdXN0b21FdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlJlZmxlY3QgR3JhcGgtTXV0YXRpb24gdG8gSW5zdGFuY2VcIiwgU1lOQ1t0aGlzLiNzeW5jXSwgKDxHcmFwaD5fZXZlbnQuY3VycmVudFRhcmdldCkubmFtZSwgdGhpcy5nZXRQYXRoKCkubWFwKF9ub2RlID0+IF9ub2RlLm5hbWUpKTtcclxuICAgICAgLy8gaWYgKHRoaXMuI3N5bmMgIT0gU1lOQy5SRUFEWSkge1xyXG4gICAgICAvLyAgIC8vIGNvbnNvbGUubG9nKFwiU3luYyBhYm9ydGVkLCBzd2l0Y2ggdG8gcmVhZHlcIik7XHJcbiAgICAgIC8vICAgdGhpcy4jc3luYyA9IFNZTkMuUkVBRFk7XHJcbiAgICAgIC8vICAgcmV0dXJuO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0ZpbHRlcmVkKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gdGhpcy4jc3luYyA9IFNZTkMuR1JBUEhfU1lOQ0VEOyAvLyBkbyBub3Qgc3luYyBhZ2Fpbiwgc2luY2UgbXV0YXRpb24gaXMgYWxyZWFkeSBhIHN5bmNocm9uaXphdGlvblxyXG4gICAgICBhd2FpdCB0aGlzLnJlZmxlY3RNdXRhdGlvbihfZXZlbnQsIDxHcmFwaD5fZXZlbnQuY3VycmVudFRhcmdldCwgdGhpcywgX2V2ZW50LmRldGFpbC5wYXRoKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5NVVRBVEVfSU5TVEFOQ0UsIHsgYnViYmxlczogdHJ1ZSB9KSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpbnN0YW5jZSBtdXRhdGVkLCByZWZsZWN0IG11dGF0aW9uIGluIHNvdXJjZSBncmFwaFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhuZE11dGF0aW9uSW5zdGFuY2UgPSBhc3luYyAoX2V2ZW50OiBDdXN0b21FdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlJlZmxlY3QgSW5zdGFuY2UtTXV0YXRpb24gdG8gR3JhcGhcIiwgU1lOQ1t0aGlzLiNzeW5jXSwgdGhpcy5nZXRQYXRoKCkubWFwKF9ub2RlID0+IF9ub2RlLm5hbWUpLCB0aGlzLmdldCgpLm5hbWUpO1xyXG4gICAgICAvLyBpZiAodGhpcy4jc3luYyAhPSBTWU5DLlJFQURZKSB7XHJcbiAgICAgIC8vICAgLy8gY29uc29sZS5sb2coXCJTeW5jIGFib3J0ZWQsIHN3aXRjaCB0byByZWFkeVwiKTtcclxuICAgICAgLy8gICB0aGlzLiNzeW5jID0gU1lOQy5SRUFEWTtcclxuICAgICAgLy8gICByZXR1cm47XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIC8vIGlmIChfZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgR3JhcGhJbnN0YW5jZSAmJiBfZXZlbnQudGFyZ2V0ICE9IHRoaXMpIHtcclxuICAgICAgLy8gICAvLyBjb25zb2xlLmxvZyhcIlN5bmMgYWJvcnRlZCwgdGFyZ2V0IGFscmVhZHkgc3luY2VkXCIpO1xyXG4gICAgICAvLyAgIHJldHVybjtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCgpKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vIHRoaXMuI3N5bmMgPSBTWU5DLklOU1RBTkNFOyAvLyBkbyBub3Qgc3luYyBhZ2Fpbiwgc2luY2UgbXV0YXRpb24gaXMgYWxyZWFkeSBhIHN5bmNocm9uaXphdGlvblxyXG4gICAgICBhd2FpdCB0aGlzLnJlZmxlY3RNdXRhdGlvbihfZXZlbnQsIHRoaXMsIHRoaXMuZ2V0KCksIFJlZmxlY3QuZ2V0KF9ldmVudCwgXCJwYXRoXCIpKTtcclxuICAgICAgdGhpcy5nZXQoKS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5NVVRBVEUsIHsgZGV0YWlsOiBfZXZlbnQuZGV0YWlsIH0pKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gcmVmbGVjdCBtdXRhdGlvbiBmcm9tIGEgc291cmNlIGdyYXBoIG9yIGluc3RhbmNlIHRvIGEgZGVzdGluYXRpb24gaW5zdGFuY2Ugb3IgZ3JhcGhcclxuICAgIHByaXZhdGUgYXN5bmMgcmVmbGVjdE11dGF0aW9uKF9ldmVudDogQ3VzdG9tRXZlbnQsIF9zb3VyY2U6IE5vZGUsIF9kZXN0aW5hdGlvbjogTm9kZSwgX3BhdGg6IE5vZGVbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlJlZmxlY3QgbXV0YXRpb25cIiwgX3NvdXJjZSwgX2Rlc3RpbmF0aW9uKTtcclxuXHJcblxyXG4gICAgICBmb3IgKGxldCBub2RlIG9mIF9wYXRoKSAvLyBpdGVyYXRlIHVwIHRoZSBldmVudCBwYXRoLCB3aGljaCBtYXkgY29udGFpbiByZWd1bGFyIE5vZGVzIG9yIEdyYXBoSW5zdGFuY2VzXHJcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlKSAvLyB1bnRpbCB0aGlzIEdyYXBoSW5zdGFuY2UgaXMgZm91bmQgKG9yIG5vIEdyYXBoSW5zdGFuY2UuLi4pXHJcbiAgICAgICAgICBpZiAobm9kZSA9PSB0aGlzKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN5bmMgYWJvcnRlZCwgdGFyZ2V0IGFscmVhZHkgc3luY2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgaW4gdGhlIGRlc3RpbmF0aW9uIGhpZXJhcmNoeVxyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IF9wYXRoLmluZGV4T2YoX3NvdXJjZSk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBsZXQgY2hpbGRJbmRleDogbnVtYmVyID0gX3BhdGhbaV0uZ2V0UGFyZW50KCkuZmluZENoaWxkKF9wYXRoW2ldKTsgLy8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgY2hpbGRub2RlIGluIHRoZSBvcmlnaW5hbCBwYXRoXHJcbiAgICAgICAgX2Rlc3RpbmF0aW9uID0gX2Rlc3RpbmF0aW9uLmdldENoaWxkKGNoaWxkSW5kZXgpOyAvLyBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgY2hpbGQgaW4gdGhpcyBwYXRoXHJcbiAgICAgICAgLy8gVE9ETzogcmVzcGVjdCBpbmRleCBmb3Igbm9uLXNpbmdsZXRvbiBjb21wb25lbnRzLi4uXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIG11dGF0ZSB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnQgaW4gdGhlIGRlc3RpbmF0aW9uXHJcbiAgICAgIGxldCBjbXBNdXRhdGU6IENvbXBvbmVudCA9IF9kZXN0aW5hdGlvbi5nZXRDb21wb25lbnQoX2V2ZW50LmRldGFpbC5jb21wb25lbnQuY29uc3RydWN0b3IpO1xyXG4gICAgICBpZiAoY21wTXV0YXRlKVxyXG4gICAgICAgIGF3YWl0IGNtcE11dGF0ZS5tdXRhdGUoX2V2ZW50LmRldGFpbC5tdXRhdG9yLCBudWxsLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0ZpbHRlcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgY21wRmlsdGVyOiBDb21wb25lbnRHcmFwaEZpbHRlciA9IHRoaXMuZ2V0Q29tcG9uZW50KENvbXBvbmVudEdyYXBoRmlsdGVyKTtcclxuICAgICAgcmV0dXJuIChjbXBGaWx0ZXIgJiYgY21wRmlsdGVyLmlzQWN0aXZlKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBIb2xkcyBkYXRhIHRvIGZlZWQgaW50byBhIHtAbGluayBTaGFkZXJ9IHRvIGRlc2NyaWJlIHRoZSBzdXJmYWNlIG9mIHtAbGluayBNZXNofS4gIFxyXG4gICAqIHtAbGluayBNYXRlcmlhbH1zIHJlZmVyZW5jZSB7QGxpbmsgQ29hdH0gYW5kIHtAbGluayBTaGFkZXJ9LiAgIFxyXG4gICAqIFRoZSBtZXRob2QgdXNlUmVuZGVyRGF0YSB3aWxsIGJlIGluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3Rvcn0gYXQgcnVudGltZSwgZXh0ZW5kaW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3MgdG8gZGVhbCB3aXRoIHRoZSByZW5kZXJlci5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29hdCBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUge1xyXG4gICAgLy8gcHVibGljIG5hbWU6IHN0cmluZyA9IFwiQ29hdFwiO1xyXG4gICAgLy8gcHJvdGVjdGVkIHJlbmRlckRhdGE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9OyAvLyB0aGlzIHdhc24ndCB1c2VkIGFueXdoZXJlLi4uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSByZW5kZXItcGFyYW1ldGVycyBmcm9tIHRoaXMgYW5kIHRoZSBnaXZlbiBtYXRlcmlhbCBpbnNpZGUgdGhlIGdpdmVuIHNoYWRlci5cclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvckNvYXR9LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1c2VSZW5kZXJEYXRhKF9zaGFkZXI6IFNoYWRlckludGVyZmFjZSwgX2NtcE1hdGVyaWFsOiBDb21wb25lbnRNYXRlcmlhbCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlbmRlckRhdGE7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBUaGUgc2ltcGxlc3Qge0BsaW5rIENvYXR9IHByb3ZpZGluZyBqdXN0IGEgY29sb3JcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRDb2xvcmVkIGV4dGVuZHMgQ29hdCB7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKCkpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5jb2xvciA9IF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uY29sb3IgPSB0aGlzLmNvbG9yLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgYXdhaXQgdGhpcy5jb2xvci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5jb2xvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgY29sb3IgYW5kIHBhcmFtZXRlcnMgZm9yIHRoZSBwaG9uZyBzaGFkaW5nIG1vZGVsLlxyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvYXQuZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29hdFJlbWlzc2l2ZSBleHRlbmRzIENvYXRDb2xvcmVkIHtcclxuICAgIHB1YmxpYyBkaWZmdXNlOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgc3BlY3VsYXI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBpbnRlbnNpdHk6IG51bWJlcjtcclxuXHJcbiAgICAjbWV0YWxsaWM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfZGlmZnVzZTogbnVtYmVyID0gMSwgX3NwZWN1bGFyOiBudW1iZXIgPSAwLjUsIF9pbnRlbnNpdHk6IG51bWJlciA9IDAuNywgX21ldGFsbGljOiBudW1iZXIgPSAwLjApIHtcclxuICAgICAgc3VwZXIoX2NvbG9yKTtcclxuICAgICAgdGhpcy5kaWZmdXNlID0gX2RpZmZ1c2U7XHJcbiAgICAgIHRoaXMuc3BlY3VsYXIgPSBfc3BlY3VsYXI7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX2ludGVuc2l0eTtcclxuICAgICAgdGhpcy5tZXRhbGxpYyA9IF9tZXRhbGxpYztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG1ldGFsbGljKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtZXRhbGxpYztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWV0YWxsaWMoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWV0YWxsaWMgPSBDYWxjLmNsYW1wKF92YWx1ZSwgMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmRpZmZ1c2UgPSB0aGlzLmRpZmZ1c2U7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc3BlY3VsYXIgPSB0aGlzLnNwZWN1bGFyO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLm1ldGFsbGljID0gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB0aGlzLmRpZmZ1c2UgPSBfc2VyaWFsaXphdGlvbi5kaWZmdXNlO1xyXG4gICAgICB0aGlzLnNwZWN1bGFyID0gX3NlcmlhbGl6YXRpb24uc3BlY3VsYXI7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX3NlcmlhbGl6YXRpb24uaW50ZW5zaXR5ID8/IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICB0aGlzLm1ldGFsbGljID0gX3NlcmlhbGl6YXRpb24ubWV0YWxsaWMgPz8gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgZGVsZXRlIG11dGF0b3IuZGlmZnVzZTtcclxuICAgICAgZGVsZXRlIG11dGF0b3Iuc3BlY3VsYXI7XHJcbiAgICAgIGRlbGV0ZSBtdXRhdG9yLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5kaWZmdXNlID0gdGhpcy5kaWZmdXNlO1xyXG4gICAgICBtdXRhdG9yLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhcjtcclxuICAgICAgbXV0YXRvci5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuICAgICAgbXV0YXRvci5tZXRhbGxpYyA9IHRoaXMubWV0YWxsaWM7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgdGV4dHVyZSBhbmQgYWRkaXRpb25hbCBkYXRhIGZvciB0ZXh0dXJpbmdcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRUZXh0dXJlZCBleHRlbmRzIENvYXRDb2xvcmVkIHtcclxuICAgIHB1YmxpYyB0ZXh0dXJlOiBUZXh0dXJlID0gbnVsbDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfdGV4dHVyZTogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LmNvbG9yKSB7XHJcbiAgICAgIHN1cGVyKF9jb2xvcik7XHJcbiAgICAgIHRoaXMudGV4dHVyZSA9IF90ZXh0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pZFRleHR1cmUgPSB0aGlzLnRleHR1cmUuaWRSZXNvdXJjZTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZFRleHR1cmUpXHJcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gPFRleHR1cmU+YXdhaXQgUHJvamVjdC5nZXRSZXNvdXJjZShfc2VyaWFsaXphdGlvbi5pZFRleHR1cmUpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIkNvYXRUZXh0dXJlZC50c1wiLz5cclxuXHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIENvYXR9IHByb3ZpZGluZyBhIHRleHR1cmUgYW5kIGFkZGl0aW9uYWwgZGF0YSBmb3IgdGV4dHVyaW5nXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yQ29hdC5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBjbGFzcyBDb2F0UmVtaXNzaXZlVGV4dHVyZWQgZXh0ZW5kcyBDb2F0VGV4dHVyZWQge1xyXG4gICAgcHVibGljIGRpZmZ1c2U6IG51bWJlcjtcclxuICAgIHB1YmxpYyBzcGVjdWxhcjogbnVtYmVyO1xyXG4gICAgcHVibGljIGludGVuc2l0eTogbnVtYmVyO1xyXG5cclxuICAgICNtZXRhbGxpYzogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfY29sb3I6IENvbG9yID0gbmV3IENvbG9yKCksIF90ZXh0dXJlOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQuY29sb3IsIF9kaWZmdXNlOiBudW1iZXIgPSAxLCBfc3BlY3VsYXI6IG51bWJlciA9IDAuNSwgX2ludGVuc2l0eTogbnVtYmVyID0gMC43LCBfbWV0YWxsaWM6IG51bWJlciA9IDAuMCkge1xyXG4gICAgICBzdXBlcihfY29sb3IsIF90ZXh0dXJlKTtcclxuICAgICAgdGhpcy5kaWZmdXNlID0gX2RpZmZ1c2U7XHJcbiAgICAgIHRoaXMuc3BlY3VsYXIgPSBfc3BlY3VsYXI7XHJcbiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gX2ludGVuc2l0eTtcclxuICAgICAgdGhpcy5tZXRhbGxpYyA9IF9tZXRhbGxpYztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG1ldGFsbGljKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtZXRhbGxpYztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWV0YWxsaWMoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWV0YWxsaWMgPSBDYWxjLmNsYW1wKF92YWx1ZSwgMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmRpZmZ1c2UgPSB0aGlzLmRpZmZ1c2U7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc3BlY3VsYXIgPSB0aGlzLnNwZWN1bGFyO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLm1ldGFsbGljID0gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHRoaXMuZGlmZnVzZSA9IF9zZXJpYWxpemF0aW9uLmRpZmZ1c2U7XHJcbiAgICAgIHRoaXMuc3BlY3VsYXIgPSBfc2VyaWFsaXphdGlvbi5zcGVjdWxhcjtcclxuICAgICAgdGhpcy5pbnRlbnNpdHkgPSBfc2VyaWFsaXphdGlvbi5pbnRlbnNpdHkgPz8gdGhpcy5pbnRlbnNpdHk7XHJcbiAgICAgIHRoaXMubWV0YWxsaWMgPSBfc2VyaWFsaXphdGlvbi5tZXRhbGxpYyA/PyB0aGlzLm1ldGFsbGljO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKHRydWUpO1xyXG4gICAgICBkZWxldGUgbXV0YXRvci5kaWZmdXNlO1xyXG4gICAgICBkZWxldGUgbXV0YXRvci5zcGVjdWxhcjtcclxuICAgICAgZGVsZXRlIG11dGF0b3IuaW50ZW5zaXR5O1xyXG4gICAgICBtdXRhdG9yLmRpZmZ1c2UgPSB0aGlzLmRpZmZ1c2U7XHJcbiAgICAgIG11dGF0b3Iuc3BlY3VsYXIgPSB0aGlzLnNwZWN1bGFyO1xyXG4gICAgICBtdXRhdG9yLmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xyXG4gICAgICBtdXRhdG9yLm1ldGFsbGljID0gdGhpcy5tZXRhbGxpYztcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCJDb2F0VGV4dHVyZWQudHNcIi8+XHJcblxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBIHtAbGluayBDb2F0fSBwcm92aWRpbmcgYSB0ZXh0dXJlIGFuZCBhZGRpdGlvbmFsIGRhdGEgZm9yIHRleHR1cmluZ1xyXG4gICAqL1xyXG4gIEBSZW5kZXJJbmplY3RvckNvYXQuZGVjb3JhdGVcclxuICBleHBvcnQgY2xhc3MgQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFscyBleHRlbmRzIENvYXRSZW1pc3NpdmVUZXh0dXJlZCB7XHJcbiAgICBwdWJsaWMgbm9ybWFsTWFwOiBUZXh0dXJlID0gbnVsbDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigpLCBfdGV4dHVyZTogVGV4dHVyZSA9IFRleHR1cmVEZWZhdWx0LmNvbG9yLCBfbm9ybWFsTWFwOiBUZXh0dXJlID0gVGV4dHVyZURlZmF1bHQubm9ybWFsLCBfZGlmZnVzZT86IG51bWJlciwgX3NwZWN1bGFyOiBudW1iZXIgPSB1bmRlZmluZWQsIF9pbnRlbnNpdHk6IG51bWJlciA9IHVuZGVmaW5lZCwgX21ldGFsbGljOiBudW1iZXIgPSB1bmRlZmluZWQpIHtcclxuICAgICAgc3VwZXIoX2NvbG9yLCBfdGV4dHVyZSwgX2RpZmZ1c2UsIF9zcGVjdWxhciwgX2ludGVuc2l0eSwgX21ldGFsbGljKTtcclxuICAgICAgdGhpcy5ub3JtYWxNYXAgPSBfbm9ybWFsTWFwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pZE5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFwLmlkUmVzb3VyY2U7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBpZiAoX3NlcmlhbGl6YXRpb24uaWROb3JtYWxNYXApXHJcbiAgICAgICAgdGhpcy5ub3JtYWxNYXAgPSA8VGV4dHVyZT5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKF9zZXJpYWxpemF0aW9uLmlkTm9ybWFsTWFwKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgY29sb3IgYW5kIHBhcmFtZXRlcnMgZm9yIHRoZSB0b29uIHNoYWRpbmcgbW9kZWwuXHJcbiAgICovXHJcbiAgQFJlbmRlckluamVjdG9yQ29hdC5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBjbGFzcyBDb2F0VG9vbiBleHRlbmRzIG1peGluQ29hdFRvb24oQ29hdFJlbWlzc2l2ZSkge1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoKSwgX3RleFRvb246IFRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC50b29uLCBfZGlmZnVzZT86IG51bWJlciwgX3NwZWN1bGFyOiBudW1iZXIgPSAxLjIsIF9pbnRlbnNpdHk/OiBudW1iZXIsIF9tZXRhbGxpYz86IG51bWJlcikge1xyXG4gICAgICBzdXBlcihfY29sb3IsIF9kaWZmdXNlLCBfc3BlY3VsYXIsIF9pbnRlbnNpdHksIF9tZXRhbGxpYyk7XHJcbiAgICAgIHRoaXMudGV4VG9vbiA9IF90ZXhUb29uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgQ29hdH0gcHJvdmlkaW5nIGEgdGV4dHVyZSwgYSBjb2xvciBhbmQgcGFyYW1ldGVycyBmb3IgdGhlIHRvb24gc2hhZGluZyBtb2RlbC5cclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JDb2F0LmRlY29yYXRlXHJcbiAgZXhwb3J0IGNsYXNzIENvYXRUb29uVGV4dHVyZWQgZXh0ZW5kcyBtaXhpbkNvYXRUb29uKENvYXRSZW1pc3NpdmVUZXh0dXJlZCkge1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9jb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoKSwgX3RleHR1cmU6IFRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC5jb2xvciwgX3RleFRvb246IFRleHR1cmUgPSBUZXh0dXJlRGVmYXVsdC50b29uLCBfZGlmZnVzZT86IG51bWJlciwgX3NwZWN1bGFyOiBudW1iZXIgPSAxLjIsIF9pbnRlbnNpdHk/OiBudW1iZXIsIF9tZXRhbGxpYz86IG51bWJlcikge1xyXG4gICAgICBzdXBlcihfY29sb3IsIF90ZXh0dXJlLCBfZGlmZnVzZSwgX3NwZWN1bGFyLCBfaW50ZW5zaXR5LCBfbWV0YWxsaWMpO1xyXG4gICAgICB0aGlzLnRleFRvb24gPSBfdGV4VG9vbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIG1peGluQ29hdFRvb248VEJhc2UgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IEdlbmVyYWxbXSkgPT4gU2VyaWFsaXphYmxlPihfYmFzZTogVEJhc2UpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxyXG4gICAgYWJzdHJhY3QgY2xhc3MgQ29hdFRvb24gZXh0ZW5kcyBfYmFzZSB7XHJcbiAgICAgIHB1YmxpYyB0ZXhUb29uOiBUZXh0dXJlO1xyXG5cclxuICAgICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb24uaWRUZXhUb29uID0gdGhpcy50ZXhUb29uLmlkUmVzb3VyY2U7XHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZFRleFRvb24pXHJcbiAgICAgICAgICB0aGlzLnRleFRvb24gPSA8VGV4dHVyZT5hd2FpdCBQcm9qZWN0LmdldFJlc291cmNlKF9zZXJpYWxpemF0aW9uLmlkVGV4VG9vbik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gQ29hdFRvb247XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgYSBjb2xvciBhcyB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIDAgdG8gMSBmb3IgdGhlIGZvdXIgY2hhbm5lbHMgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEgKGZvciBvcGFjaXR5KVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb2xvciBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICAvLyBjcmMyIG9ubHkgdXNlZCBmb3IgY29udmVydGluZyBjb2xvcnMgZnJvbSBzdHJpbmdzIHByZWRlZmluZWQgYnkgQ1NTXHJcbiAgICBwcml2YXRlIHN0YXRpYyBjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSAoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjcmMyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLmdldENvbnRleHQoXCIyZFwiLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcclxuICAgICAgY3JjMi5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcImNvcHlcIjtcclxuICAgICAgcmV0dXJuIGNyYzI7XHJcbiAgICB9KSgpO1xyXG5cclxuICAgIHB1YmxpYyByOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZzogbnVtYmVyO1xyXG4gICAgcHVibGljIGI6IG51bWJlcjtcclxuICAgIHB1YmxpYyBhOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9yOiBudW1iZXIgPSAxLCBfZzogbnVtYmVyID0gMSwgX2I6IG51bWJlciA9IDEsIF9hOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2V0Q2xhbXBlZChfciwgX2csIF9iLCBfYSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fSB3aXRoIHRoZSA4LWJpdCBjb2xvciBjaGFubmVscyBpbiB0aGUgb3JkZXIgUkdCQS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRCeXRlc0Zyb21DU1MoX2tleXdvcmQ6IHN0cmluZyk6IFVpbnQ4Q2xhbXBlZEFycmF5IHtcclxuICAgICAgQ29sb3IuY3JjMi5maWxsU3R5bGUgPSBfa2V5d29yZDtcclxuICAgICAgQ29sb3IuY3JjMi5maWxsUmVjdCgwLCAwLCAxLCAxKTtcclxuICAgICAgcmV0dXJuIENvbG9yLmNyYzIuZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBDb2xvcn0gb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gY3NzIGNvbG9yIGtleXdvcmQuIFxyXG4gICAgICogUGFzc2luZyBhbiBfYWxwaGEgdmFsdWUgd2lsbCBvdmVycmlkZSB0aGUgYWxwaGEgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBrZXl3b3JkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENTUyhfa2V5d29yZDogc3RyaW5nLCBfYWxwaGE/OiBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5nZXQoQ29sb3IpLnNldENTUyhfa2V5d29yZCwgX2FscGhhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXRydW5zIHRoZSBwcm9kdWN0IG9mIHR3byBjb2xvcnMuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0RVQ1QoX2NsckE6IENvbG9yLCBfY2xyQjogQ29sb3IpOiBDb2xvciB7XHJcbiAgICAgIHJldHVybiBfY2xyQS5jbG9uZS5tdWx0aXBseShfY2xyQik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBjb2xvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjbG9uZSgpOiBDb2xvciB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5yZXVzZShDb2xvcikuY29weSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGUgY29sb3IgY2hhbm5lbHMgb2YgdGhlIGdpdmVuIGNvbG9yIGludG8gdGhpcyBjb2xvciBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX2NvbG9yOiBDb2xvcik6IENvbG9yIHtcclxuICAgICAgdGhpcy5yID0gX2NvbG9yLnI7XHJcbiAgICAgIHRoaXMuZyA9IF9jb2xvci5nO1xyXG4gICAgICB0aGlzLmIgPSBfY29sb3IuYjtcclxuICAgICAgdGhpcy5hID0gX2NvbG9yLmE7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnIgPSAxOyB0aGlzLmcgPSAxOyB0aGlzLmIgPSAxOyB0aGlzLmEgPSAxO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGNvbG9yIGZyb20gdGhlIGdpdmVuIGNzcyBjb2xvciBrZXl3b3JkLiBPcHRpbmFsbHkgc2V0cyB0aGUgYWxwaGEgdmFsdWUgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Q1NTKF9rZXl3b3JkOiBzdHJpbmcsIF9hbHBoYT86IG51bWJlcik6IENvbG9yIHtcclxuICAgICAgY29uc3QgYnl0ZXNSR0JBOiBVaW50OENsYW1wZWRBcnJheSA9IENvbG9yLmdldEJ5dGVzRnJvbUNTUyhfa2V5d29yZCk7XHJcbiAgICAgIHRoaXMuc2V0Qnl0ZXMoYnl0ZXNSR0JBWzBdLCBieXRlc1JHQkFbMV0sIGJ5dGVzUkdCQVsyXSwgYnl0ZXNSR0JBWzNdKTtcclxuICAgICAgdGhpcy5hID0gX2FscGhhID8/IHRoaXMuYTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSB0aGUgZ2l2ZW4gOC1iaXQgdmFsdWVzIGZvciB0aGUgY29sb3IgY2hhbm5lbHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCeXRlcyhfcjogbnVtYmVyLCBfZzogbnVtYmVyLCBfYjogbnVtYmVyLCBfYTogbnVtYmVyKTogQ29sb3I7XHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBjb2xvciBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgVWludDhDbGFtcGVkQXJyYXl9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Qnl0ZXMoX3JnYmE6IFVpbnQ4Q2xhbXBlZEFycmF5KTogQ29sb3I7XHJcbiAgICBwdWJsaWMgc2V0Qnl0ZXMoX3I6IG51bWJlciB8IFVpbnQ4Q2xhbXBlZEFycmF5LCBfZz86IG51bWJlciwgX2I/OiBudW1iZXIsIF9hPzogbnVtYmVyKTogQ29sb3Ige1xyXG4gICAgICBpZiAoX3IgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlcclxuICAgICAgICB0aGlzLnNldEJ5dGVzKF9yWzBdLCBfclsxXSwgX3JbMl0sIF9yWzNdKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuc2V0Q2xhbXBlZChfciAvIDI1NSwgX2cgLyAyNTUsIF9iIC8gMjU1LCBfYSAvIDI1NSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29sb3IgY2hhbm5lbHMgb2YgdGhpcyBjb2xvciBhbmQgY2xhbXBzIHRoZW0gYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Q2xhbXBlZChfcjogbnVtYmVyLCBfZzogbnVtYmVyLCBfYjogbnVtYmVyLCBfYTogbnVtYmVyKTogQ29sb3I7XHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBjb2xvciBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgRmxvYXQzMkFycmF5fSB3aGlsZSBjbGFtcGluZyB0aGUgdmFsdWVzIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldENsYW1wZWQoX3JnYmE6IEZsb2F0MzJBcnJheSk6IENvbG9yO1xyXG4gICAgcHVibGljIHNldENsYW1wZWQoX3I6IG51bWJlciB8IEZsb2F0MzJBcnJheSwgX2c/OiBudW1iZXIsIF9iPzogbnVtYmVyLCBfYT86IG51bWJlcik6IENvbG9yIHtcclxuICAgICAgaWYgKF9yIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KVxyXG4gICAgICAgIHRoaXMuc2V0Q2xhbXBlZChfclswXSwgX3JbMV0sIF9yWzJdLCBfclszXSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnNldChcclxuICAgICAgICAgIENhbGMuY2xhbXAoX3IsIDAsIDEpLFxyXG4gICAgICAgICAgQ2FsYy5jbGFtcChfZywgMCwgMSksXHJcbiAgICAgICAgICBDYWxjLmNsYW1wKF9iLCAwLCAxKSxcclxuICAgICAgICAgIENhbGMuY2xhbXAoX2EsIDAsIDEpXHJcbiAgICAgICAgKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2xvciBjaGFubmVscyBvZiB0aGlzIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF9yOiBudW1iZXIsIF9nOiBudW1iZXIsIF9iOiBudW1iZXIsIF9hOiBudW1iZXIpOiBDb2xvciB7XHJcbiAgICAgIHRoaXMuciA9IF9yOyB0aGlzLmcgPSBfZzsgdGhpcy5iID0gX2I7IHRoaXMuYSA9IF9hO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGNvbG9yIGNoYW5uZWxzIG9mIHRoaXMgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoW3RoaXMuciwgdGhpcy5nLCB0aGlzLmIsIHRoaXMuYV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBVaW50OENsYW1wZWRBcnJheX0gb2YgdGhlIGNvbG9yIGNoYW5uZWxzIG9mIHRoaXMgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCeXRlcygpOiBVaW50OENsYW1wZWRBcnJheSB7XHJcbiAgICAgIHJldHVybiBuZXcgVWludDhDbGFtcGVkQXJyYXkoW3RoaXMuciAqIDI1NSwgdGhpcy5nICogMjU1LCB0aGlzLmIgKiAyNTUsIHRoaXMuYSAqIDI1NV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY3NzIGNvbG9yIGtleXdvcmQgcmVwcmVzZW50aW5nIHRoaXMgY29sb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDU1MoKTogc3RyaW5nIHtcclxuICAgICAgbGV0IGJ5dGVzOiBVaW50OENsYW1wZWRBcnJheSA9IHRoaXMuZ2V0Qnl0ZXMoKTtcclxuICAgICAgcmV0dXJuIGBSR0JBKCR7Ynl0ZXNbMF19LCAke2J5dGVzWzFdfSwgJHtieXRlc1syXX0sICR7dGhpcy5hfSlgO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0SGV4KCk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBieXRlczogVWludDhDbGFtcGVkQXJyYXkgPSB0aGlzLmdldEJ5dGVzKCk7XHJcbiAgICAgIGxldCBoZXg6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGZvciAobGV0IGJ5dGUgb2YgYnl0ZXMpXHJcbiAgICAgICAgaGV4ICs9IGJ5dGUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcclxuICAgICAgcmV0dXJuIGhleDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBjb2xvciBmcm9tIHRoZSBnaXZlbiBoZXggc3RyaW5nIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0SGV4KF9oZXg6IHN0cmluZyk6IENvbG9yIHtcclxuICAgICAgbGV0IGJ5dGVzOiBVaW50OENsYW1wZWRBcnJheSA9IHRoaXMuZ2V0Qnl0ZXMoKTtcclxuICAgICAgbGV0IGNoYW5uZWw6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAobGV0IGJ5dGUgaW4gYnl0ZXMpXHJcbiAgICAgICAgYnl0ZXNbYnl0ZV0gPSBwYXJzZUludChfaGV4LnN1YnN0cihjaGFubmVsKysgKiAyLCAyKSwgMTYpO1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXRCeXRlcyhieXRlcyk7O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGUgZ2l2ZW4gY29sb3IgdG8gdGhpcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfY29sb3I6IENvbG9yKTogQ29sb3Ige1xyXG4gICAgICB0aGlzLnIgKz0gX2NvbG9yLnI7XHJcbiAgICAgIHRoaXMuZyArPSBfY29sb3IuZztcclxuICAgICAgdGhpcy5iICs9IF9jb2xvci5iO1xyXG4gICAgICB0aGlzLmEgKz0gX2NvbG9yLmE7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbGllcyB0aGlzIHdpdGggdGhlIGdpdmVuIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbHkoX2NvbG9yOiBDb2xvcik6IENvbG9yIHtcclxuICAgICAgdGhpcy5yICo9IF9jb2xvci5yO1xyXG4gICAgICB0aGlzLmcgKj0gX2NvbG9yLmc7XHJcbiAgICAgIHRoaXMuYiAqPSBfY29sb3IuYjtcclxuICAgICAgdGhpcy5hICo9IF9jb2xvci5hO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sb3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgKHI6ICR7dGhpcy5yLnRvRml4ZWQoMyl9LCBnOiAke3RoaXMuZy50b0ZpeGVkKDMpfSwgYjogJHt0aGlzLmIudG9GaXhlZCgzKX0sIGE6ICR7dGhpcy5hLnRvRml4ZWQoMyl9KWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgLy8gc2VyaWFsaXphdGlvbi50b0pTT04gPSAoKSA9PiB7IHJldHVybiBgeyBcInJcIjogJHt0aGlzLnJ9LCBcImdcIjogJHt0aGlzLmd9LCBcImJcIjogJHt0aGlzLmJ9LCBcImFcIjogJHt0aGlzLmF9fWA7IH07XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYFske3RoaXMucn0sICR7dGhpcy5nfSwgJHt0aGlzLmJ9LCAke3RoaXMuYX1dYDsgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX3NlcmlhbGl6YXRpb24pID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBbdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiwgdGhpcy5hXSA9IEpTT04ucGFyc2UoPHN0cmluZz48dW5rbm93bj5fc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHRoaXMubXV0YXRlKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsvKiogKi8gfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIG1hdGVyaWFscy4gQ29tYmluZXMgYSB7QGxpbmsgU2hhZGVyfSB3aXRoIGEgY29tcGF0aWJsZSB7QGxpbmsgQ29hdH1cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNYXRlcmlhbCBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGVSZXNvdXJjZSB7XHJcbiAgICAvKiogVGhlIG5hbWUgdG8gY2FsbCB0aGUgTWF0ZXJpYWwgYnkuICovXHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xyXG4gICAgcHVibGljIGlkUmVzb3VyY2U6IHN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGlwcGluZyB0aHJlc2hvbGQgZm9yIGFscGhhIHZhbHVlcywgZXZlcnkgcGl4ZWwgd2l0aCBhbHBoYSA8IGFscGhhQ2xpcCB3aWxsIGJlIGRpc2NhcmRlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFscGhhQ2xpcDogbnVtYmVyID0gMC4wMTtcclxuXHJcbiAgICBwcml2YXRlIHNoYWRlclR5cGU6IHR5cGVvZiBTaGFkZXI7IC8vIFRoZSBzaGFkZXIgcHJvZ3JhbSB1c2VkIGJ5IHRoaXMgQmFzZU1hdGVyaWFsXHJcbiAgICAjY29hdDogQ29hdDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZywgX3NoYWRlcj86IHR5cGVvZiBTaGFkZXIsIF9jb2F0PzogQ29hdCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5zaGFkZXJUeXBlID0gX3NoYWRlcjtcclxuICAgICAgaWYgKF9zaGFkZXIpIHtcclxuICAgICAgICBpZiAoX2NvYXQpXHJcbiAgICAgICAgICB0aGlzLmNvYXQgPSBfY29hdDtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLmNvYXQgPSB0aGlzLmNyZWF0ZUNvYXRNYXRjaGluZ1NoYWRlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIFByb2plY3QucmVnaXN0ZXIodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgcmVmZXJlbmNlZCB7QGxpbmsgQ29hdH0gaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjb2F0KCk6IENvYXQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY29hdDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTWFrZXMgdGhpcyBtYXRlcmlhbCByZWZlcmVuY2UgdGhlIGdpdmVuIHtAbGluayBDb2F0fSBpZiBpdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlZmVyZW5jZWQge0BsaW5rIFNoYWRlcn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBjb2F0KF9jb2F0OiBDb2F0KSB7XHJcbiAgICAgIGlmICh0aGlzLnNoYWRlclR5cGUpXHJcbiAgICAgICAgaWYgKF9jb2F0LmNvbnN0cnVjdG9yICE9IHRoaXMuc2hhZGVyVHlwZS5nZXRDb2F0KCkpXHJcbiAgICAgICAgICBpZiAoX2NvYXQgaW5zdGFuY2VvZiB0aGlzLnNoYWRlclR5cGUuZ2V0Q29hdCgpKVxyXG4gICAgICAgICAgICBEZWJ1Zy5mdWRnZShcIkNvYXQgaXMgZXh0ZW5zaW9uIG9mIENvYXQgcmVxdWlyZWQgYnkgc2hhZGVyXCIpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyAobmV3IEVycm9yKFwiU2hhZGVyIGFuZCBjb2F0IGRvbid0IG1hdGNoXCIpKTtcclxuICAgICAgdGhpcy4jY29hdCA9IF9jb2F0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29hdH0gaW5zdGFuY2UgdGhhdCBpcyB2YWxpZCBmb3IgdGhlIHtAbGluayBTaGFkZXJ9IHJlZmVyZW5jZWQgYnkgdGhpcyBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlQ29hdE1hdGNoaW5nU2hhZGVyKCk6IENvYXQge1xyXG4gICAgICBsZXQgY29hdDogQ29hdCA9IG5ldyAodGhpcy5zaGFkZXJUeXBlLmdldENvYXQoKSkoKTtcclxuICAgICAgcmV0dXJuIGNvYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2VzIHRoZSBtYXRlcmlhbHMgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiB7QGxpbmsgU2hhZGVyfSwgY3JlYXRlcyBhbmQgcmVmZXJlbmNlcyBhIG5ldyB7QGxpbmsgQ29hdH0gaW5zdGFuY2UgIFxyXG4gICAgICogYW5kIG11dGF0ZXMgdGhlIG5ldyBjb2F0IHRvIHByZXNlcnZlIG1hdGNoaW5nIHByb3BlcnRpZXMuXHJcbiAgICAgKiBAcGFyYW0gX3NoYWRlclR5cGUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTaGFkZXIoX3NoYWRlclR5cGU6IHR5cGVvZiBTaGFkZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zaGFkZXJUeXBlID0gX3NoYWRlclR5cGU7XHJcbiAgICAgIGxldCBjb2F0OiBDb2F0ID0gdGhpcy5jcmVhdGVDb2F0TWF0Y2hpbmdTaGFkZXIoKTtcclxuICAgICAgY29hdC5tdXRhdGUodGhpcy4jY29hdD8uZ2V0TXV0YXRvcigpKTtcclxuICAgICAgdGhpcy5jb2F0ID0gY29hdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBTaGFkZXJ9IHJlZmVyZW5jZWQgYnkgdGhpcyBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U2hhZGVyKCk6IHR5cGVvZiBTaGFkZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5zaGFkZXJUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgLy8gVE9ETzogdGhpcyB0eXBlIG9mIHNlcmlhbGl6YXRpb24gd2FzIGltcGxlbWVudGVkIGZvciBpbXBsaWNpdCBNYXRlcmlhbCBjcmVhdGUuIENoZWNrIGlmIG9ic29sZXRlIHdoZW4gb25seSBvbmUgbWF0ZXJpYWwgY2xhc3MgZXhpc3RzIGFuZC9vciBtYXRlcmlhbHMgYXJlIHN0b3JlZCBzZXBhcmF0ZWx5XHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgaWRSZXNvdXJjZTogdGhpcy5pZFJlc291cmNlLFxyXG4gICAgICAgIHNoYWRlcjogdGhpcy5zaGFkZXJUeXBlLm5hbWUsXHJcbiAgICAgICAgY29hdDogU2VyaWFsaXplci5zZXJpYWxpemUodGhpcy4jY29hdCksXHJcbiAgICAgICAgYWxwaGFDbGlwOiB0aGlzLmFscGhhQ2xpcFxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9zZXJpYWxpemF0aW9uLm5hbWU7XHJcbiAgICAgIFByb2plY3QucmVnaXN0ZXIodGhpcywgX3NlcmlhbGl6YXRpb24uaWRSZXNvdXJjZSk7XHJcbiAgICAgIHRoaXMuc2hhZGVyVHlwZSA9ICg8R2VuZXJhbD5GdWRnZUNvcmUpW19zZXJpYWxpemF0aW9uLnNoYWRlcl07XHJcbiAgICAgIGxldCBjb2F0OiBDb2F0ID0gPENvYXQ+YXdhaXQgU2VyaWFsaXplci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5jb2F0KTtcclxuICAgICAgdGhpcy5jb2F0ID0gY29hdDtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLmFscGhhQ2xpcCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy5hbHBoYUNsaXAgPSBfc2VyaWFsaXphdGlvbi5hbHBoYUNsaXA7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IuY29hdCA9IHRoaXMuY29hdC5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIC8vIGRlbGV0ZSBfbXV0YXRvci5pZFJlc291cmNlO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIE1hdGVyaWFsfSBsb2FkZWQgZnJvbSBhIGdsVEYtRmlsZS5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWF0ZXJpYWxHTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKE1hdGVyaWFsKSB7XHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsLCBfbmFtZTogc3RyaW5nID0gdGhpcy5uYW1lKTogUHJvbWlzZTxNYXRlcmlhbEdMVEY+IHtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgcmV0dXJuIEdMVEZMb2FkZXIubG9hZFJlc291cmNlKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEFic3RyYWN0IGNsYXNzIHN1cHBvcnRpbmcgdmFyaW91cyBhcml0aG1ldGljYWwgaGVscGVyIGZ1bmN0aW9uc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDYWxjIHtcclxuICAgIC8qKiBmYWN0b3IgbXVsdGlwbGllZCB3aXRoIGFuZ2xlIGluIGRlZ3JlZXMgeWllbGRzIHRoZSBhbmdsZSBpbiByYWRpYW4gKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVnMnJhZDogbnVtYmVyID0gTWF0aC5QSSAvIDE4MDtcclxuICAgIC8qKiBmYWN0b3IgbXVsdGlwbGllZCB3aXRoIGFuZ2xlIGluIHJhZGlhbiB5aWVsZHMgdGhlIGFuZ2xlIGluIGRlZ3JlZXMgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcmFkMmRlZzogbnVtYmVyID0gMSAvIENhbGMuZGVnMnJhZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgb25lIG9mIHRoZSB2YWx1ZXMgcGFzc2VkIGluLCBlaXRoZXIgX3ZhbHVlIGlmIHdpdGhpbiBfbWluIGFuZCBfbWF4IG9yIHRoZSBib3VuZGFyeSBiZWluZyBleGNlZWRlZCBieSBfdmFsdWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGFtcDxUPihfdmFsdWU6IFQsIF9taW46IFQsIF9tYXg6IFQsIF9pc1NtYWxsZXI6IChfdmFsdWUxOiBULCBfdmFsdWUyOiBUKSA9PiBib29sZWFuID0gKF92YWx1ZTE6IFQsIF92YWx1ZTI6IFQpID0+IHsgcmV0dXJuIF92YWx1ZTEgPCBfdmFsdWUyOyB9KTogVCB7XHJcbiAgICAgIGlmIChfaXNTbWFsbGVyKF92YWx1ZSwgX21pbikpIHJldHVybiBfbWluO1xyXG4gICAgICBpZiAoX2lzU21hbGxlcihfbWF4LCBfdmFsdWUpKSByZXR1cm4gX21heDtcclxuICAgICAgcmV0dXJuIF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZhbHVlcyAoX2EsIF9iKSBmb3IgdGhlIGdpdmVuIGludGVycG9sYXRpb24gZmFjdG9yIChfZikuIGYgaXMgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgbGVycChfYTogbnVtYmVyLCBfYjogbnVtYmVyLCBfZjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIF9hICsgKF9iIC0gX2EpICogQ2FsYy5jbGFtcChfZiwgMCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGludGVyZmFjZSBCb3JkZXIge1xyXG4gICAgbGVmdDogbnVtYmVyO1xyXG4gICAgdG9wOiBudW1iZXI7XHJcbiAgICByaWdodDogbnVtYmVyO1xyXG4gICAgYm90dG9tOiBudW1iZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGcmFtaW5nIGRlc2NyaWJlcyBob3cgdG8gbWFwIGEgcmVjdGFuZ2xlIGludG8gYSBnaXZlbiBmcmFtZVxyXG4gICAqIGFuZCBob3cgcG9pbnRzIGluIHRoZSBmcmFtZSBjb3JyZXNwb25kIHRvIHBvaW50cyBpbiB0aGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBhbmQgdmljZSB2ZXJzYVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5ICBcclxuICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vaHMtZnVydHdhbmdlbi9GVURHRS93aWtpL0ZyYW1pbmdcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgRnJhbWluZyBleHRlbmRzIE11dGFibGUge1xyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsvKiogKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBhIHBvaW50IGluIHRoZSBnaXZlbiBmcmFtZSBhY2NvcmRpbmcgdG8gdGhpcyBmcmFtaW5nXHJcbiAgICAgKiBAcGFyYW0gX3BvaW50SW5GcmFtZSBUaGUgcG9pbnQgaW4gdGhlIGZyYW1lIGdpdmVuXHJcbiAgICAgKiBAcGFyYW0gX3JlY3RGcmFtZSBUaGUgZnJhbWUgdGhlIHBvaW50IGlzIHJlbGF0aXZlIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRQb2ludChfcG9pbnRJbkZyYW1lOiBWZWN0b3IyLCBfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBWZWN0b3IyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBhIHBvaW50IGluIGEgZ2l2ZW4gcmVjdGFuZ2xlIGJhY2sgdG8gYSBjYWxjdWxhdGVkIGZyYW1lIG9mIG9yaWdpblxyXG4gICAgICogQHBhcmFtIF9wb2ludCBUaGUgcG9pbnQgaW4gdGhlIHJlY3RhbmdsZVxyXG4gICAgICogQHBhcmFtIF9yZWN0IFRoZSByZWN0YW5nbGUgdGhlIHBvaW50IGlzIHJlbGF0aXZlIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRQb2ludEludmVyc2UoX3BvaW50OiBWZWN0b3IyLCBfcmVjdDogUmVjdGFuZ2xlKTogVmVjdG9yMjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgcmVjdGFuZ2xlIGFzIHRoZSBmcmFtZSBhbmQgY3JlYXRlcyBhIG5ldyByZWN0YW5nbGUgYWNjb3JkaW5nIHRvIHRoZSBmcmFtaW5nXHJcbiAgICAgKiBAcGFyYW0gX3JlY3RGcmFtZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0UmVjdChfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBSZWN0YW5nbGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBoYXMgYSBmaXhlZCB3aWR0aCBhbmQgaGVpZ2h0IGFuZCBkaXNwbGF5IHNob3VsZCBzY2FsZSB0byBmaXQgdGhlIGZyYW1lXHJcbiAgICogUG9pbnRzIGFyZSBzY2FsZWQgaW4gdGhlIHNhbWUgcmF0aW9cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRnJhbWluZ0ZpeGVkIGV4dGVuZHMgRnJhbWluZyB7XHJcbiAgICBwdWJsaWMgd2lkdGg6IG51bWJlciA9IDMwMDtcclxuICAgIHB1YmxpYyBoZWlnaHQ6IG51bWJlciA9IDE1MDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3dpZHRoOiBudW1iZXIgPSAzMDAsIF9oZWlnaHQ6IG51bWJlciA9IDE1MCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldFNpemUoX3dpZHRoLCBfaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBmcmFtaW5nIHRvIHRoZSBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTaXplKF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy53aWR0aCA9IF93aWR0aDtcclxuICAgICAgdGhpcy5oZWlnaHQgPSBfaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQb2ludChfcG9pbnRJbkZyYW1lOiBWZWN0b3IyLCBfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIHRoaXMud2lkdGggKiAoX3BvaW50SW5GcmFtZS54IC0gX3JlY3RGcmFtZS54KSAvIF9yZWN0RnJhbWUud2lkdGgsXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgKiAoX3BvaW50SW5GcmFtZS55IC0gX3JlY3RGcmFtZS55KSAvIF9yZWN0RnJhbWUuaGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFBvaW50SW52ZXJzZShfcG9pbnQ6IFZlY3RvcjIsIF9yZWN0OiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIF9wb2ludC54ICogX3JlY3Qud2lkdGggLyB0aGlzLndpZHRoICsgX3JlY3QueCxcclxuICAgICAgICBfcG9pbnQueSAqIF9yZWN0LmhlaWdodCAvIHRoaXMuaGVpZ2h0ICsgX3JlY3QueVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSZWN0KF9yZWN0RnJhbWU6IFJlY3RhbmdsZSk6IFJlY3RhbmdsZSB7XHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogV2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBhcmUgZnJhY3Rpb25zIG9mIHRob3NlIG9mIHRoZSBmcmFtZSwgc2NhbGVkIGJ5IG5vcm1lZCB2YWx1ZXMgbm9ybVdpZHRoIGFuZCBub3JtSGVpZ2h0LlxyXG4gICAqIERpc3BsYXkgc2hvdWxkIHNjYWxlIHRvIGZpdCB0aGUgZnJhbWUgYW5kIHBvaW50cyBhcmUgc2NhbGVkIGluIHRoZSBzYW1lIHJhdGlvXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEZyYW1pbmdTY2FsZWQgZXh0ZW5kcyBGcmFtaW5nIHtcclxuICAgIHB1YmxpYyBub3JtV2lkdGg6IG51bWJlciA9IDEuMDtcclxuICAgIHB1YmxpYyBub3JtSGVpZ2h0OiBudW1iZXIgPSAxLjA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgZnJhbWluZyB0byB0aGUgZ2l2ZW4gbm9ybWVkIHdpZHRoIGFuZCBoZWlnaHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFNjYWxlKF9ub3JtV2lkdGg6IG51bWJlciwgX25vcm1IZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICB0aGlzLm5vcm1XaWR0aCA9IF9ub3JtV2lkdGg7XHJcbiAgICAgIHRoaXMubm9ybUhlaWdodCA9IF9ub3JtSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQb2ludChfcG9pbnRJbkZyYW1lOiBWZWN0b3IyLCBfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIHRoaXMubm9ybVdpZHRoICogKF9wb2ludEluRnJhbWUueCAtIF9yZWN0RnJhbWUueCksXHJcbiAgICAgICAgdGhpcy5ub3JtSGVpZ2h0ICogKF9wb2ludEluRnJhbWUueSAtIF9yZWN0RnJhbWUueSlcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UG9pbnRJbnZlcnNlKF9wb2ludDogVmVjdG9yMiwgX3JlY3Q6IFJlY3RhbmdsZSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgX3BvaW50LnggLyB0aGlzLm5vcm1XaWR0aCArIF9yZWN0LngsXHJcbiAgICAgICAgX3BvaW50LnkgLyB0aGlzLm5vcm1IZWlnaHQgKyBfcmVjdC55XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJlY3QoX3JlY3RGcmFtZTogUmVjdGFuZ2xlKTogUmVjdGFuZ2xlIHtcclxuICAgICAgcmV0dXJuIFJlY3RhbmdsZS5HRVQoMCwgMCwgdGhpcy5ub3JtV2lkdGggKiBfcmVjdEZyYW1lLndpZHRoLCB0aGlzLm5vcm1IZWlnaHQgKiBfcmVjdEZyYW1lLmhlaWdodCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBmaXRzIGludG8gYSBtYXJnaW4gZ2l2ZW4gYXMgZnJhY3Rpb25zIG9mIHRoZSBzaXplIG9mIHRoZSBmcmFtZSBnaXZlbiBieSBub3JtQW5jaG9yXHJcbiAgICogcGx1cyBhbiBhYnNvbHV0ZSBwYWRkaW5nIGdpdmVuIGJ5IHBpeGVsQm9yZGVyLiBEaXNwbGF5IHNob3VsZCBmaXQgaW50byB0aGlzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBGcmFtaW5nQ29tcGxleCBleHRlbmRzIEZyYW1pbmcge1xyXG4gICAgcHVibGljIG1hcmdpbjogQm9yZGVyID0geyBsZWZ0OiAwLCB0b3A6IDAsIHJpZ2h0OiAwLCBib3R0b206IDAgfTtcclxuICAgIHB1YmxpYyBwYWRkaW5nOiBCb3JkZXIgPSB7IGxlZnQ6IDAsIHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCB9O1xyXG5cclxuICAgIHB1YmxpYyBnZXRQb2ludChfcG9pbnRJbkZyYW1lOiBWZWN0b3IyLCBfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHJlc3VsdDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgIF9wb2ludEluRnJhbWUueCAtIHRoaXMucGFkZGluZy5sZWZ0IC0gdGhpcy5tYXJnaW4ubGVmdCAqIF9yZWN0RnJhbWUud2lkdGgsXHJcbiAgICAgICAgX3BvaW50SW5GcmFtZS55IC0gdGhpcy5wYWRkaW5nLnRvcCAtIHRoaXMubWFyZ2luLnRvcCAqIF9yZWN0RnJhbWUuaGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0UG9pbnRJbnZlcnNlKF9wb2ludDogVmVjdG9yMiwgX3JlY3Q6IFJlY3RhbmdsZSk6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgX3BvaW50LnggKyB0aGlzLnBhZGRpbmcubGVmdCArIHRoaXMubWFyZ2luLmxlZnQgKiBfcmVjdC53aWR0aCxcclxuICAgICAgICBfcG9pbnQueSArIHRoaXMucGFkZGluZy50b3AgKyB0aGlzLm1hcmdpbi50b3AgKiBfcmVjdC5oZWlnaHRcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmVjdChfcmVjdEZyYW1lOiBSZWN0YW5nbGUpOiBSZWN0YW5nbGUge1xyXG4gICAgICBpZiAoIV9yZWN0RnJhbWUpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBsZXQgbWluWDogbnVtYmVyID0gX3JlY3RGcmFtZS54ICsgdGhpcy5tYXJnaW4ubGVmdCAqIF9yZWN0RnJhbWUud2lkdGggKyB0aGlzLnBhZGRpbmcubGVmdDtcclxuICAgICAgbGV0IG1pblk6IG51bWJlciA9IF9yZWN0RnJhbWUueSArIHRoaXMubWFyZ2luLnRvcCAqIF9yZWN0RnJhbWUuaGVpZ2h0ICsgdGhpcy5wYWRkaW5nLnRvcDtcclxuICAgICAgbGV0IG1heFg6IG51bWJlciA9IF9yZWN0RnJhbWUueCArICgxIC0gdGhpcy5tYXJnaW4ucmlnaHQpICogX3JlY3RGcmFtZS53aWR0aCAtIHRoaXMucGFkZGluZy5yaWdodDtcclxuICAgICAgbGV0IG1heFk6IG51bWJlciA9IF9yZWN0RnJhbWUueSArICgxIC0gdGhpcy5tYXJnaW4uYm90dG9tKSAqIF9yZWN0RnJhbWUuaGVpZ2h0IC0gdGhpcy5wYWRkaW5nLmJvdHRvbTtcclxuXHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKG1pblgsIG1pblksIG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIHJldHVybiB7IG1hcmdpbjogdGhpcy5tYXJnaW4sIHBhZGRpbmc6IHRoaXMucGFkZGluZyB9O1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yMiBhcyBwb2xhciBjb29yZGluYXRlcyBcclxuICAgKiBgYGB0ZXh0XHJcbiAgICogIOKGlS0gYW5nbGUgKEFuZ2xlIHRvIHRoZSB4LWF4aXMpXHJcbiAgICogIC3ihpIgTWFnbml0dWRlIChEaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIpICBcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgR2VvMiBpbXBsZW1lbnRzIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgbWFnbml0dWRlOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGFuZ2xlOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYW5nbGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpIHtcclxuICAgICAgdGhpcy5zZXQoX2FuZ2xlLCBfbWFnbml0dWRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGlzIGluc3RhbmNlIGF0IG9uY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldChfYW5nbGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpOiB2b2lkIHtcclxuICAgICAgdGhpcy5tYWduaXR1ZGUgPSBfbWFnbml0dWRlO1xyXG4gICAgICB0aGlzLmFuZ2xlID0gX2FuZ2xlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHByZXR0eSBzdHJpbmcgcmVwcmVzZW50YXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgYW5nbGU6ICR7dGhpcy5hbmdsZS50b1ByZWNpc2lvbig1KX0sICBtYWduaXR1ZGU6ICR7dGhpcy5tYWduaXR1ZGUudG9QcmVjaXNpb24oNSl9YDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBSZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvcjMgYXMgZ2VvZ3JhcGhpYyBjb29yZGluYXRlcyBhcyBzZWVuIG9uIGEgZ2xvYmVcclxuICAgKiBgYGB0ZXh0XHJcbiAgICog4oaQfOKGkiBMb25naXR1ZGUgKEFuZ2xlIHRvIHRoZSB6LWF4aXMpIFxyXG4gICAqICDihpUtIExhdGl0dWRlIChBbmdsZSB0byB0aGUgZXF1YXRvcilcclxuICAgKiAgLeKGkiBNYWduaXR1ZGUgKERpc3RhbmNlIGZyb20gdGhlIGNlbnRlcikgIFxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBHZW8zIGltcGxlbWVudHMgUmVjeWNhYmxlIHtcclxuICAgIHB1YmxpYyBtYWduaXR1ZGU6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbGF0aXR1ZGU6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbG9uZ2l0dWRlOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbG9uZ2l0dWRlOiBudW1iZXIgPSAwLCBfbGF0aXR1ZGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpIHtcclxuICAgICAgdGhpcy5zZXQoX2xvbmdpdHVkZSwgX2xhdGl0dWRlLCBfbWFnbml0dWRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGlzIGluc3RhbmNlIGF0IG9uY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldChfbG9uZ2l0dWRlOiBudW1iZXIgPSAwLCBfbGF0aXR1ZGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpOiB2b2lkIHtcclxuICAgICAgdGhpcy5tYWduaXR1ZGUgPSBfbWFnbml0dWRlO1xyXG4gICAgICB0aGlzLmxhdGl0dWRlID0gX2xhdGl0dWRlO1xyXG4gICAgICB0aGlzLmxvbmdpdHVkZSA9IF9sb25naXR1ZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcHJldHR5IHN0cmluZyByZXByZXNlbnRhdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGBsb25naXR1ZGU6ICR7dGhpcy5sb25naXR1ZGUudG9QcmVjaXNpb24oNSl9LCBsYXRpdHVkZTogJHt0aGlzLmxhdGl0dWRlLnRvUHJlY2lzaW9uKDUpfSwgbWFnbml0dWRlOiAke3RoaXMubWFnbml0dWRlLnRvUHJlY2lzaW9uKDUpfWA7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLy8gRnJvbSBodHRwOi8vYmFhZ29lLmNvbS9lbi9SYW5kb21NdXNpbmdzL2phdmFzY3JpcHQvXHJcbiAgLy8gSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5jb20+LCAyMDEwXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIE1hc2goKTogRnVuY3Rpb24ge1xyXG4gICAgbGV0IG46IG51bWJlciA9IDB4ZWZjODI0OWQ7XHJcblxyXG4gICAgbGV0IG1hc2g6IEZ1bmN0aW9uID0gZnVuY3Rpb24gKF9kYXRhOiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICBfZGF0YSA9IF9kYXRhLnRvU3RyaW5nKCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG4gKz0gX2RhdGEuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBsZXQgaDogbnVtYmVyID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XHJcbiAgICAgICAgbiA9IGggPj4+IDA7XHJcbiAgICAgICAgaCAtPSBuO1xyXG4gICAgICAgIGggKj0gbjtcclxuICAgICAgICBuID0gaCA+Pj4gMDtcclxuICAgICAgICBoIC09IG47XHJcbiAgICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKG4gPj4+IDApICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcclxuICAgIH07XHJcblxyXG4gICAgLy8gbWFzaC52ZXJzaW9uID0gJ01hc2ggMC45JztcclxuICAgIHJldHVybiBtYXNoO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEZyb20gaHR0cDovL2JhYWdvZS5jb20vZW4vUmFuZG9tTXVzaW5ncy9qYXZhc2NyaXB0L1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBMRklCNCgpOiBGdW5jdGlvbiB7XHJcbiAgICAvLyBHZW9yZ2UgTWFyc2FnbGlhJ3MgTEZJQjQsXHJcbiAgICAvL2h0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9zY2kuY3J5cHQvbXNnL2ViNGRkZGU3ODJiMTcwNTFcclxuICAgIGxldCBhcmdzOiBudW1iZXJbXSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XHJcbiAgICBsZXQgazA6IG51bWJlciA9IDAsXHJcbiAgICAgIGsxOiBudW1iZXIgPSA1OCxcclxuICAgICAgazI6IG51bWJlciA9IDExOSxcclxuICAgICAgazM6IG51bWJlciA9IDE3ODtcclxuXHJcbiAgICBsZXQgczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICBsZXQgbWFzaDogRnVuY3Rpb24gPSBNYXNoKCk7XHJcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcclxuICAgICAgYXJncyA9IFsrbmV3IERhdGUoKV07XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgMjU2OyBqKyspIHtcclxuICAgICAgc1tqXSA9IG1hc2goXCIgXCIpO1xyXG4gICAgICBzW2pdIC09IG1hc2goXCIgXCIpICogNC43NjgzNzE1ODIwMzEyNWUtNzsgLy8gMl4tMjFcclxuICAgICAgaWYgKHNbal0gPCAwKSB7XHJcbiAgICAgICAgc1tqXSArPSAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgMjU2OyBqKyspIHtcclxuICAgICAgICBzW2pdIC09IG1hc2goYXJnc1tpXSk7XHJcbiAgICAgICAgc1tqXSAtPSBtYXNoKGFyZ3NbaV0pICogNC43NjgzNzE1ODIwMzEyNWUtNzsgLy8gMl4tMjFcclxuICAgICAgICBpZiAoc1tqXSA8IDApIHtcclxuICAgICAgICAgIHNbal0gKz0gMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIG1hc2ggPSBudWxsO1xyXG5cclxuICAgIGxldCByYW5kb206IEZ1bmN0aW9uID0gZnVuY3Rpb24gKCk6IG51bWJlciB7XHJcbiAgICAgIGxldCB4OiBudW1iZXI7XHJcblxyXG4gICAgICBrMCA9IChrMCArIDEpICYgMjU1O1xyXG4gICAgICBrMSA9IChrMSArIDEpICYgMjU1O1xyXG4gICAgICBrMiA9IChrMiArIDEpICYgMjU1O1xyXG4gICAgICBrMyA9IChrMyArIDEpICYgMjU1O1xyXG5cclxuICAgICAgeCA9IHNbazBdIC0gc1trMV07XHJcbiAgICAgIGlmICh4IDwgMCkge1xyXG4gICAgICAgIHggKz0gMTtcclxuICAgICAgfVxyXG4gICAgICB4IC09IHNbazJdO1xyXG4gICAgICBpZiAoeCA8IDApIHtcclxuICAgICAgICB4ICs9IDE7XHJcbiAgICAgIH1cclxuICAgICAgeCAtPSBzW2szXTtcclxuICAgICAgaWYgKHggPCAwKSB7XHJcbiAgICAgICAgeCArPSAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gc1trMF0gPSB4O1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyByYW5kb20udWludDMyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gICByZXR1cm4gcmFuZG9tKCkgKiAweDEwMDAwMDAwMCA+Pj4gMDsgLy8gMl4zMlxyXG4gICAgLy8gfTtcclxuICAgIC8vIHJhbmRvbS5mcmFjdDUzID0gcmFuZG9tO1xyXG4gICAgLy8gcmFuZG9tLnZlcnNpb24gPSBcIkxGSUI0IDAuOVwiO1xyXG4gICAgLy8gcmFuZG9tLmFyZ3MgPSBhcmdzO1xyXG5cclxuICAgIHJldHVybiByYW5kb207XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgdGhlIG1hdHJpeCBhcyB0cmFuc2xhdGlvbiwgcm90YXRpb24gYW5kIHNjYWxpbmcge0BsaW5rIFZlY3RvcjJ9LCBiZWluZyBjYWxjdWxhdGVkIGZyb20gdGhlIG1hdHJpeFxyXG4gICAqL1xyXG4gIGludGVyZmFjZSBWZWN0b3JSZXByZXNlbnRhdGlvbiB7XHJcbiAgICB0cmFuc2xhdGlvbjogVmVjdG9yMjtcclxuICAgIHJvdGF0aW9uOiBudW1iZXI7XHJcbiAgICBzY2FsaW5nOiBWZWN0b3IyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2ltcGxlIGNsYXNzIGZvciAzeDMgbWF0cml4IG9wZXJhdGlvbnNcclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIwXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1hdHJpeDN4MyBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwcml2YXRlIGRhdGE6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7IC8vIFRoZSBkYXRhIG9mIHRoZSBtYXRyaXguXHJcbiAgICBwcml2YXRlIG11dGF0b3I6IE11dGF0b3IgPSBudWxsOyAvLyBwcmVwYXJlZCBmb3Igb3B0aW1pemF0aW9uLCBrZWVwIG11dGF0b3IgdG8gcmVkdWNlIHJlZHVuZGFudCBjYWxjdWxhdGlvbiBhbmQgZm9yIGNvbXBhcmlzb24uIFNldCB0byBudWxsIHdoZW4gZGF0YSBjaGFuZ2VzIVxyXG4gICAgcHJpdmF0ZSB2ZWN0b3JzOiBWZWN0b3JSZXByZXNlbnRhdGlvbjsgLy8gdmVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWF0cml4XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnJlY3ljbGUoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9UT0RPOiBmaWd1cmUgb3V0IHdoYXQgdGhpcyBpcyB1c2VkIGZvclxyXG4gICAgLyoqIFRPRE86IGRlc2NyaWJlISAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9KRUNUSU9OKF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBuZXcgTWF0cml4M3gzO1xyXG4gICAgICBtdHhSZXN1bHQuZGF0YS5zZXQoW1xyXG4gICAgICAgIDIgLyBfd2lkdGgsIDAsIDAsXHJcbiAgICAgICAgMCwgLTIgLyBfaGVpZ2h0LCAwLFxyXG4gICAgICAgIC0xLCAxLCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgYSBuZXcgaWRlbnRpdHkgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIElERU5USVRZKCk6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4M3gzID0gUmVjeWNsZXIuZ2V0KE1hdHJpeDN4Myk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgdHJhbnNsYXRlcyBjb29yZGluYXRlcyBhbG9uZyB0aGUgeC0gYW5kIHktYXhpcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBWZWN0b3IyfS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU0xBVElPTihfdHJhbnNsYXRlOiBWZWN0b3IyKTogTWF0cml4M3gzIHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXgzeDMpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICAxLCAwLCAwLFxyXG4gICAgICAgIDAsIDEsIDAsXHJcbiAgICAgICAgX3RyYW5zbGF0ZS54LCBfdHJhbnNsYXRlLnksIDFcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgcm90YXRlcyBjb29yZGluYXRlcyBvbiB0aGUgei1heGlzIHdoZW4gbXVsdGlwbGllZCBieS5cclxuICAgICAqIEBwYXJhbSBfYW5nbGVJbkRlZ3JlZXMgVGhlIHZhbHVlIG9mIHRoZSByb3RhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBST1RBVElPTihfYW5nbGVJbkRlZ3JlZXM6IG51bWJlcik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4M3gzID0gUmVjeWNsZXIucmV1c2UoTWF0cml4M3gzKTtcclxuICAgICAgbGV0IGFuZ2xlSW5SYWRpYW5zOiBudW1iZXIgPSBfYW5nbGVJbkRlZ3JlZXMgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIGxldCBzaW46IG51bWJlciA9IE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbGV0IGNvczogbnVtYmVyID0gTWF0aC5jb3MoYW5nbGVJblJhZGlhbnMpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBjb3MsIHNpbiwgMCxcclxuICAgICAgICAtc2luLCBjb3MsIDAsXHJcbiAgICAgICAgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCBzY2FsZXMgY29vcmRpbmF0ZXMgYWxvbmcgdGhlIHgtIGFuZCB5LWF4aXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGxpbmsgVmVjdG9yMn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTQ0FMSU5HKF9zY2FsYXI6IFZlY3RvcjIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDN4Myk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIF9zY2FsYXIueCwgMCwgMCxcclxuICAgICAgICAwLCBfc2NhbGFyLnksIDAsXHJcbiAgICAgICAgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdHdvIHBhc3NlZCBtYXRyaWNlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQUk9EVUNUKF9tdHhMZWZ0OiBNYXRyaXgzeDMsIF9tdHhSaWdodDogTWF0cml4M3gzKTogTWF0cml4M3gzIHtcclxuICAgICAgbGV0IGEwMDogbnVtYmVyID0gX210eExlZnQuZGF0YVswICogMyArIDBdO1xyXG4gICAgICBsZXQgYTAxOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzAgKiAzICsgMV07XHJcbiAgICAgIGxldCBhMDI6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMCAqIDMgKyAyXTtcclxuICAgICAgbGV0IGExMDogbnVtYmVyID0gX210eExlZnQuZGF0YVsxICogMyArIDBdO1xyXG4gICAgICBsZXQgYTExOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzEgKiAzICsgMV07XHJcbiAgICAgIGxldCBhMTI6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMSAqIDMgKyAyXTtcclxuICAgICAgbGV0IGEyMDogbnVtYmVyID0gX210eExlZnQuZGF0YVsyICogMyArIDBdO1xyXG4gICAgICBsZXQgYTIxOiBudW1iZXIgPSBfbXR4TGVmdC5kYXRhWzIgKiAzICsgMV07XHJcbiAgICAgIGxldCBhMjI6IG51bWJlciA9IF9tdHhMZWZ0LmRhdGFbMiAqIDMgKyAyXTtcclxuICAgICAgbGV0IGIwMDogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMCAqIDMgKyAwXTtcclxuICAgICAgbGV0IGIwMTogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMCAqIDMgKyAxXTtcclxuICAgICAgbGV0IGIwMjogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMCAqIDMgKyAyXTtcclxuICAgICAgbGV0IGIxMDogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMSAqIDMgKyAwXTtcclxuICAgICAgbGV0IGIxMTogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMSAqIDMgKyAxXTtcclxuICAgICAgbGV0IGIxMjogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMSAqIDMgKyAyXTtcclxuICAgICAgbGV0IGIyMDogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMiAqIDMgKyAwXTtcclxuICAgICAgbGV0IGIyMTogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMiAqIDMgKyAxXTtcclxuICAgICAgbGV0IGIyMjogbnVtYmVyID0gX210eFJpZ2h0LmRhdGFbMiAqIDMgKyAyXTtcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4M3gzID0gUmVjeWNsZXIucmV1c2UoTWF0cml4M3gzKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwLFxyXG4gICAgICAgIGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMSxcclxuICAgICAgICBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjIsXHJcbiAgICAgICAgYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwLFxyXG4gICAgICAgIGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMSxcclxuICAgICAgICBiMTAgKiBhMDIgKyBiMTEgKiBhMTIgKyBiMTIgKiBhMjIsXHJcbiAgICAgICAgYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwLFxyXG4gICAgICAgIGIyMCAqIGEwMSArIGIyMSAqIGExMSArIGIyMiAqIGEyMSxcclxuICAgICAgICBiMjAgKiBhMDIgKyBiMjEgKiBhMTIgKyBiMjIgKiBhMjJcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgaW52ZXJzZSBvZiBhIHBhc3NlZCBtYXRyaXguXHJcbiAgICAgKiBAcGFyYW0gX210eCBUaGUgbWF0cml4IHRvIGNvbXB1dGUgdGhlIGludmVyc2Ugb2YuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSU5WRVJTRShfbXR4OiBNYXRyaXgzeDMpOiBNYXRyaXgzeDMge1xyXG4gICAgICBsZXQgbTogRmxvYXQzMkFycmF5ID0gX210eC5kYXRhO1xyXG4gICAgICBsZXQgbTAwOiBudW1iZXIgPSBtWzAgKiAzICsgMF07XHJcbiAgICAgIGxldCBtMDE6IG51bWJlciA9IG1bMCAqIDMgKyAxXTtcclxuICAgICAgbGV0IG0wMjogbnVtYmVyID0gbVswICogMyArIDJdO1xyXG4gICAgICBsZXQgbTEwOiBudW1iZXIgPSBtWzEgKiAzICsgMF07XHJcbiAgICAgIGxldCBtMTE6IG51bWJlciA9IG1bMSAqIDMgKyAxXTtcclxuICAgICAgbGV0IG0xMjogbnVtYmVyID0gbVsxICogMyArIDJdO1xyXG4gICAgICBsZXQgbTIwOiBudW1iZXIgPSBtWzIgKiAzICsgMF07XHJcbiAgICAgIGxldCBtMjE6IG51bWJlciA9IG1bMiAqIDMgKyAxXTtcclxuICAgICAgbGV0IG0yMjogbnVtYmVyID0gbVsyICogMyArIDJdO1xyXG5cclxuICAgICAgbGV0IGQ6IG51bWJlciA9IDEgL1xyXG4gICAgICAgIChtMDAgKiAobTExICogbTIyIC0gbTIxICogbTEyKSAtXHJcbiAgICAgICAgICBtMDEgKiAobTEwICogbTIyIC0gbTEyICogbTIwKSArXHJcbiAgICAgICAgICBtMDIgKiAobTEwICogbTIxIC0gbTExICogbTIwKSk7XHJcblxyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDN4Myk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIGQgKiAobTExICogbTIyIC0gbTIxICogbTEyKSwgLy8gWzBdXHJcbiAgICAgICAgZCAqIChtMDIgKiBtMjEgLSBtMDEgKiBtMjIpLCAvLyBbMV1cclxuICAgICAgICBkICogKG0wMSAqIG0xMiAtIG0wMiAqIG0xMSksIC8vIFsyXVxyXG4gICAgICAgIGQgKiAobTEyICogbTIwIC0gbTEwICogbTIyKSwgLy8gWzNdXHJcbiAgICAgICAgZCAqIChtMDAgKiBtMjIgLSBtMDIgKiBtMjApLCAvLyBbNF1cclxuICAgICAgICBkICogKG0xMCAqIG0wMiAtIG0wMCAqIG0xMiksIC8vIFs1XVxyXG4gICAgICAgIGQgKiAobTEwICogbTIxIC0gbTIwICogbTExKSwgLy8gWzZdXHJcbiAgICAgICAgZCAqIChtMjAgKiBtMDEgLSBtMDAgKiBtMjEpLCAvLyBbN11cclxuICAgICAgICBkICogKG0wMCAqIG0xMSAtIG0xMCAqIG0wMSkgLy8gWzhdXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gYSB2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zbGF0aW9uIHtAbGluayBWZWN0b3IyfS4gIFxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSwgc2luY2UgdGhlIHZlY3RvciBpcyBnb2luZyB0byBiZSByZXVzZWQgYnkgUmVjeWNsZXIuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeCBpZ25vcmluZyBpdHMgcm90YXRpb24gYW5kIHNjYWxpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0cmFuc2xhdGlvbigpOiBWZWN0b3IyIHtcclxuICAgICAgaWYgKCF0aGlzLnZlY3RvcnMudHJhbnNsYXRpb24pXHJcbiAgICAgICAgdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uID0gbmV3IFZlY3RvcjIodGhpcy5kYXRhWzZdLCB0aGlzLmRhdGFbN10pO1xyXG4gICAgICByZXR1cm4gdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uOyAvLyAuY2xvbmU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRyYW5zbGF0aW9uKF90cmFuc2xhdGlvbjogVmVjdG9yMikge1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KF90cmFuc2xhdGlvbi5nZXQoKSwgNik7XHJcbiAgICAgIC8vIG5vIGZ1bGwgY2FjaGUgcmVzZXQgcmVxdWlyZWRcclxuICAgICAgdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uID0gX3RyYW5zbGF0aW9uO1xyXG4gICAgICB0aGlzLm11dGF0b3IgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiBhIGNvcHkgb2YgdGhlIGNhbGN1bGF0ZWQgcm90YXRpb24ge0BsaW5rIFZlY3RvcjJ9ICAgXHJcbiAgICAgKiAtIHNldDogZWZmZWN0IHRoZSBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByb3RhdGlvbigpOiBudW1iZXIge1xyXG4gICAgICBpZiAoIXRoaXMudmVjdG9ycy5yb3RhdGlvbilcclxuICAgICAgICB0aGlzLnZlY3RvcnMucm90YXRpb24gPSB0aGlzLmdldEV1bGVyQW5nbGUoKTtcclxuICAgICAgcmV0dXJuIHRoaXMudmVjdG9ycy5yb3RhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcm90YXRpb24oX3JvdGF0aW9uOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy5tdXRhdGUoeyBcInJvdGF0aW9uXCI6IF9yb3RhdGlvbiB9KTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogLSBnZXQ6IHJldHVybiBhIHZlY3RvciByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NhbGUge0BsaW5rIFZlY3RvcjN9LiAgXHJcbiAgICAgKiAqKkNhdXRpb24hKiogRG8gbm90IG1hbmlwdWxhdGUgcmVzdWx0LCBpbnN0ZWFkIGNyZWF0ZSBhIGNsb25lISAgICBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNjYWxpbmcoKTogVmVjdG9yMiB7XHJcbiAgICAgIGlmICghdGhpcy52ZWN0b3JzLnNjYWxpbmcpXHJcbiAgICAgICAgdGhpcy52ZWN0b3JzLnNjYWxpbmcgPSBuZXcgVmVjdG9yMihcclxuICAgICAgICAgIE1hdGguaHlwb3QodGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0pICogKHRoaXMuZGF0YVswXSA8IDAgPyAtMSA6IDEpLFxyXG4gICAgICAgICAgTWF0aC5oeXBvdCh0aGlzLmRhdGFbM10sIHRoaXMuZGF0YVs0XSkgKiAodGhpcy5kYXRhWzRdIDwgMCA/IC0xIDogMSlcclxuICAgICAgICApO1xyXG4gICAgICByZXR1cm4gdGhpcy52ZWN0b3JzLnNjYWxpbmc7IC8vIC5jbG9uZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2NhbGluZyhfc2NhbGluZzogVmVjdG9yMikge1xyXG4gICAgICB0aGlzLm11dGF0ZSh7IFwic2NhbGluZ1wiOiBfc2NhbGluZyB9KTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogTWF0cml4M3gzIHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKE1hdHJpeDN4MykuY29weSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgbWF0cml4IHRvIHRoZSBpZGVudGl0eS1tYXRyaXggYW5kIGNsZWFycyBjYWNoZS4gVXNlZCBieSB0aGUgcmVjeWNsZXIgdG8gcmVzZXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldChbXHJcbiAgICAgICAgMSwgMCwgMCxcclxuICAgICAgICAwLCAxLCAwLFxyXG4gICAgICAgIDAsIDAsIDFcclxuICAgICAgXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhlIG1hdHJpeCB0byB0aGUgaWRlbnRpdHktbWF0cml4IGFuZCBjbGVhcnMgY2FjaGUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5yZWN5Y2xlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zbGF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSB0cmFuc2xhdGlvbiBieSB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjJ9IHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlKF9ieTogVmVjdG9yMik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4M3gzID0gTWF0cml4M3gzLlBST0RVQ1QodGhpcywgTWF0cml4M3gzLlRSQU5TTEFUSU9OKF9ieSkpO1xyXG4gICAgICAvLyBUT0RPOiBwb3NzaWJsZSBvcHRpbWl6YXRpb24sIHRyYW5zbGF0aW9uIG1heSBhbHRlciBtdXRhdG9yIGluc3RlYWQgb2YgZGVsZXRpbmcgaXQuXHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYWxvbmcgdGhlIHgtYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZVgoX3g6IG51bWJlcik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIHRoaXMuZGF0YVs2XSArPSBfeDtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgICAgdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYWxvbmcgdGhlIHktYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZVkoX3k6IG51bWJlcik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIHRoaXMuZGF0YVs3XSArPSBfeTtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgICAgdGhpcy52ZWN0b3JzLnRyYW5zbGF0aW9uID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUm90YXRpb25cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHJvdGF0aW9uIGFyb3VuZCB0aGUgei1BeGlzIHRvIHRoaXMgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3RhdGUoX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IE1hdHJpeDN4My5QUk9EVUNUKHRoaXMsIE1hdHJpeDN4My5ST1RBVElPTihfYW5nbGVJbkRlZ3JlZXMpKTtcclxuICAgICAgdGhpcy5zZXQobXR4UmVzdWx0LmRhdGEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSZXN1bHQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTY2FsaW5nXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBzY2FsaW5nIGJ5IHRoZSBnaXZlbiB7QGxpbmsgVmVjdG9yMn0gdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZShfYnk6IFZlY3RvcjIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IE1hdHJpeDN4My5QUk9EVUNUKHRoaXMsIE1hdHJpeDN4My5TQ0FMSU5HKF9ieSkpO1xyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHgtQXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWChfYnk6IG51bWJlcik6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjIgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMik7XHJcbiAgICAgIHZlY3Rvci5zZXQoX2J5LCAxKTtcclxuICAgICAgdGhpcy5zY2FsZSh2ZWN0b3IpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh2ZWN0b3IpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBzY2FsaW5nIGFsb25nIHRoZSB5LUF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZVkoX2J5OiBudW1iZXIpOiBNYXRyaXgzeDMge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IyID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDEsIF9ieSk7XHJcbiAgICAgIHRoaXMuc2NhbGUodmVjdG9yKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodmVjdG9yKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmb3JtYXRpb25cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhpcyBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShfbXR4UmlnaHQ6IE1hdHJpeDN4Myk6IE1hdHJpeDN4MyB7XHJcbiAgICAgIGxldCBtdHhSZXN1bHQ6IE1hdHJpeDN4MyA9IE1hdHJpeDN4My5QUk9EVUNUKHRoaXMsIF9tdHhSaWdodCk7XHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgZXVsZXItYW5nbGVzIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCByb3RhdGlvbiBvZiB0aGlzIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RXVsZXJBbmdsZSgpOiBudW1iZXIge1xyXG4gICAgICBsZXQgc2NhbGluZzogVmVjdG9yMiA9IHRoaXMuc2NhbGluZztcclxuXHJcbiAgICAgIGxldCBzMDogbnVtYmVyID0gdGhpcy5kYXRhWzBdIC8gc2NhbGluZy54O1xyXG4gICAgICBsZXQgczE6IG51bWJlciA9IHRoaXMuZGF0YVsxXSAvIHNjYWxpbmcueDtcclxuICAgICAgbGV0IHMzOiBudW1iZXIgPSB0aGlzLmRhdGFbM10gLyBzY2FsaW5nLnk7XHJcbiAgICAgIGxldCBzNDogbnVtYmVyID0gdGhpcy5kYXRhWzRdIC8gc2NhbGluZy55O1xyXG5cclxuICAgICAgbGV0IHhTa2V3OiBudW1iZXIgPSBNYXRoLmF0YW4yKC1zMywgczQpO1xyXG4gICAgICBsZXQgeVNrZXc6IG51bWJlciA9IE1hdGguYXRhbjIoczAsIHMxKTtcclxuXHJcbiAgICAgIGxldCBzeTogbnVtYmVyID0gTWF0aC5oeXBvdChzMCwgczEpOyAvLyBwcm9iYWJseSAyLiBwYXJhbSBzaG91bGQgYmUgdGhpcy5kYXRhWzRdIC8gc2NhbGluZy55XHJcbiAgICAgIGxldCByb3RhdGlvbjogbnVtYmVyO1xyXG5cclxuICAgICAgaWYgKCEoc3kgPiAxZS02KSlcclxuICAgICAgICByb3RhdGlvbiA9IHlTa2V3O1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcm90YXRpb24gPSB4U2tldztcclxuXHJcbiAgICAgIHJvdGF0aW9uICo9IENhbGMucmFkMmRlZztcclxuXHJcbiAgICAgIHJldHVybiByb3RhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4IHRvIHRoZSBnaXZlbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldChfYXJyYXk6IEFycmF5TGlrZTxudW1iZXI+KTogTWF0cml4M3gzIHtcclxuICAgICAgdGhpcy5kYXRhLnNldChfYXJyYXkpO1xyXG4gICAgICB0aGlzLnJlc2V0Q2FjaGUoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3BpZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBtYXRyaXggaW50byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBNYXRyaXgzeDMpOiBNYXRyaXgzeDMge1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KF9vcmlnaW5hbC5kYXRhKTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7IC8vIFRPRE86IGZvciBub3cgcmVzZXQgdGhlIGNhY2hlLCBhcyBpIGhhdmUgbm8gaWRlYSBob3cgdGhlIGNhY2hpbmcgd29ya3MgZm9yIG1hdHJpeDN4My5cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGDGki5NYXRyaXgzeDModHJhbnNsYXRpb246ICR7dGhpcy50cmFuc2xhdGlvbi50b1N0cmluZygpfSwgcm90YXRpb246ICR7dGhpcy5yb3RhdGlvbi50b1N0cmluZygpfSwgc2NhbGluZzogJHt0aGlzLnNjYWxpbmcudG9TdHJpbmcoKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgb2YgdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICAvLyB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IHRoaXMudHJhbnNsYXRpb24uc2VyaWFsaXplKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sXHJcbiAgICAgICAgc2NhbGluZzogdGhpcy5zY2FsaW5nLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IGF3YWl0IHRoaXMudHJhbnNsYXRpb24uZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24udHJhbnNsYXRpb24pLFxyXG4gICAgICAgIHJvdGF0aW9uOiBfc2VyaWFsaXphdGlvbi5yb3RhdGlvbixcclxuICAgICAgICBzY2FsaW5nOiBhd2FpdCB0aGlzLnNjYWxpbmcuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uc2NhbGluZylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5tdXRhdGUobXV0YXRvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBpZiAodGhpcy5tdXRhdG9yKVxyXG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0b3I7XHJcblxyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICB0cmFuc2xhdGlvbjogdGhpcy50cmFuc2xhdGlvbi5nZXRNdXRhdG9yKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sXHJcbiAgICAgICAgc2NhbGluZzogdGhpcy5zY2FsaW5nLmdldE11dGF0b3IoKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gY2FjaGUgbXV0YXRvclxyXG4gICAgICB0aGlzLm11dGF0b3IgPSBtdXRhdG9yO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBvbGRUcmFuc2xhdGlvbjogVmVjdG9yMiA9IHRoaXMudHJhbnNsYXRpb247XHJcbiAgICAgIGxldCBvbGRSb3RhdGlvbjogbnVtYmVyID0gdGhpcy5yb3RhdGlvbjtcclxuICAgICAgbGV0IG9sZFNjYWxpbmc6IFZlY3RvcjIgPSB0aGlzLnNjYWxpbmc7XHJcbiAgICAgIGxldCBuZXdUcmFuc2xhdGlvbjogVmVjdG9yMiA9IDxWZWN0b3IyPl9tdXRhdG9yW1widHJhbnNsYXRpb25cIl07XHJcbiAgICAgIGxldCBuZXdSb3RhdGlvbjogbnVtYmVyID0gPG51bWJlcj5fbXV0YXRvcltcInJvdGF0aW9uXCJdO1xyXG4gICAgICBsZXQgbmV3U2NhbGluZzogVmVjdG9yMiA9IDxWZWN0b3IyPl9tdXRhdG9yW1wic2NhbGluZ1wiXTtcclxuICAgICAgbGV0IHZlY3RvcnM6IFZlY3RvclJlcHJlc2VudGF0aW9uID0geyB0cmFuc2xhdGlvbjogb2xkVHJhbnNsYXRpb24sIHJvdGF0aW9uOiBvbGRSb3RhdGlvbiwgc2NhbGluZzogb2xkU2NhbGluZyB9O1xyXG4gICAgICBpZiAobmV3VHJhbnNsYXRpb24pIHtcclxuICAgICAgICB2ZWN0b3JzLnRyYW5zbGF0aW9uID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICBuZXdUcmFuc2xhdGlvbi54ICE9IHVuZGVmaW5lZCA/IG5ld1RyYW5zbGF0aW9uLnggOiBvbGRUcmFuc2xhdGlvbi54LFxyXG4gICAgICAgICAgbmV3VHJhbnNsYXRpb24ueSAhPSB1bmRlZmluZWQgPyBuZXdUcmFuc2xhdGlvbi55IDogb2xkVHJhbnNsYXRpb24ueVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZlY3RvcnMucm90YXRpb24gPSAobmV3Um90YXRpb24gPT0gdW5kZWZpbmVkKSA/IG9sZFJvdGF0aW9uIDogbmV3Um90YXRpb247XHJcblxyXG4gICAgICBpZiAobmV3U2NhbGluZykge1xyXG4gICAgICAgIHZlY3RvcnMuc2NhbGluZyA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgbmV3U2NhbGluZy54ICE9IHVuZGVmaW5lZCA/IG5ld1NjYWxpbmcueCA6IG9sZFNjYWxpbmcueCxcclxuICAgICAgICAgIG5ld1NjYWxpbmcueSAhPSB1bmRlZmluZWQgPyBuZXdTY2FsaW5nLnkgOiBvbGRTY2FsaW5nLnlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBUT0RPOiBwb3NzaWJsZSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gd2hlbiBvbmx5IG9uZSBvciB0d28gY29tcG9uZW50cyBjaGFuZ2UsIHRoZW4gdXNlIG9sZCBtYXRyaXggaW5zdGVhZCBvZiBJREVOVElUWSBhbmQgdHJhbnNmb3JtIGJ5IGRpZmZlcmVuY2VzL3F1b3RpZW50c1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXgzeDMgPSBNYXRyaXgzeDMuSURFTlRJVFkoKTtcclxuICAgICAgaWYgKHZlY3RvcnMudHJhbnNsYXRpb24pXHJcbiAgICAgICAgbXR4UmVzdWx0LnRyYW5zbGF0ZSh2ZWN0b3JzLnRyYW5zbGF0aW9uKTtcclxuICAgICAgaWYgKHZlY3RvcnMucm90YXRpb24pIHtcclxuICAgICAgICBtdHhSZXN1bHQucm90YXRlKHZlY3RvcnMucm90YXRpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh2ZWN0b3JzLnNjYWxpbmcpXHJcbiAgICAgICAgbXR4UmVzdWx0LnNjYWxlKHZlY3RvcnMuc2NhbGluZyk7XHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuXHJcbiAgICAgIHRoaXMudmVjdG9ycyA9IHZlY3RvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGlmIChfbXV0YXRvci50cmFuc2xhdGlvbikgdHlwZXMudHJhbnNsYXRpb24gPSBcIlZlY3RvcjJcIjtcclxuICAgICAgaWYgKF9tdXRhdG9yLnJvdGF0aW9uICE9IHVuZGVmaW5lZCkgdHlwZXMucm90YXRpb24gPSBcIm51bWJlclwiO1xyXG4gICAgICBpZiAoX211dGF0b3Iuc2NhbGluZykgdHlwZXMuc2NhbGluZyA9IFwiVmVjdG9yMlwiO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldENhY2hlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnZlY3RvcnMgPSB7IHRyYW5zbGF0aW9uOiBudWxsLCByb3RhdGlvbjogbnVsbCwgc2NhbGluZzogbnVsbCB9O1xyXG4gICAgICB0aGlzLm11dGF0b3IgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyBhIDR4NCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYW5kIHByb3ZpZGVzIG9wZXJhdGlvbnMgZm9yIGl0LlxyXG4gICAqIGBgYHRleHRcclxuICAgKiBbIDAsIDEsIDIsIDMgXSDihpAgcm93IHZlY3RvciB4XHJcbiAgICogWyA0LCA1LCA2LCA3IF0g4oaQIHJvdyB2ZWN0b3IgeVxyXG4gICAqIFsgOCwgOSwxMCwxMSBdIOKGkCByb3cgdmVjdG9yIHpcclxuICAgKiBbMTIsMTMsMTQsMTUgXSDihpAgdHJhbnNsYXRpb25cclxuICAgKiAgICAgICAgICAgIOKGkSAgaG9tb2dlbmVvdXMgY29sdW1uXHJcbiAgICogYGBgXHJcbiAgICogQGF1dGhvcnMgSmFzY2hhIEthcmFnw7ZsLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOSB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNYXRyaXg0eDQgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgcHJpdmF0ZSBkYXRhOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTsgLy8gVGhlIGRhdGEgb2YgdGhlIG1hdHJpeC5cclxuICAgIHByaXZhdGUgbXV0YXRvcjogTXV0YXRvciA9IG51bGw7IC8vIHByZXBhcmVkIGZvciBvcHRpbWl6YXRpb24sIGtlZXAgbXV0YXRvciB0byByZWR1Y2UgcmVkdW5kYW50IGNhbGN1bGF0aW9uIGFuZCBmb3IgY29tcGFyaXNvbi4gU2V0IHRvIG51bGwgd2hlbiBkYXRhIGNoYW5nZXMhXHJcblxyXG4gICAgcmVhZG9ubHkgI3RyYW5zbGF0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICByZWFkb25seSAjc2NhbGluZzogVmVjdG9yMyA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgcmVhZG9ubHkgI3JvdGF0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5PTkUoKTtcclxuICAgIHJlYWRvbmx5ICNxdWF0ZXJuaW9uOiBRdWF0ZXJuaW9uID0gUXVhdGVybmlvbi5JREVOVElUWSgpO1xyXG5cclxuICAgICN0cmFuc2xhdGlvbkRpcnR5OiBib29sZWFuO1xyXG4gICAgI3NjYWxpbmdEaXJ0eTogYm9vbGVhbjtcclxuICAgICNyb3RhdGlvbkRpcnR5OiBib29sZWFuO1xyXG4gICAgI3F1YXRlcm5pb25EaXJ0eTogYm9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMucmVjeWNsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBTVEFUSUNTXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIGEgbmV3IGlkZW50aXR5IG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIElERU5USVRZKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIuZ2V0KE1hdHJpeDR4NCk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wb3NlcyBhIG5ldyBtYXRyaXggYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiwgcm90YXRpb24gYW5kIHNjYWxpbmcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgQ09NUE9TSVRJT04oX3RyYW5zbGF0aW9uPzogVmVjdG9yMywgX3JvdGF0aW9uPzogVmVjdG9yMyB8IFF1YXRlcm5pb24sIF9zY2FsaW5nPzogVmVjdG9yMyk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCByZXN1bHQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICByZXN1bHQubXV0YXRlKHsgXCJ0cmFuc2xhdGlvblwiOiBfdHJhbnNsYXRpb24sIFwicm90YXRpb25cIjogX3JvdGF0aW9uLCBcInNjYWxpbmdcIjogX3NjYWxpbmcgfSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0d28gcGFzc2VkIG1hdHJpY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0RVQ1QoX210eExlZnQ6IE1hdHJpeDR4NCwgX210eFJpZ2h0OiBNYXRyaXg0eDQpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgYTogRmxvYXQzMkFycmF5ID0gX210eExlZnQuZGF0YTtcclxuICAgICAgbGV0IGI6IEZsb2F0MzJBcnJheSA9IF9tdHhSaWdodC5kYXRhO1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIGxldCBhMDA6IG51bWJlciA9IGFbMCAqIDQgKyAwXTtcclxuICAgICAgbGV0IGEwMTogbnVtYmVyID0gYVswICogNCArIDFdO1xyXG4gICAgICBsZXQgYTAyOiBudW1iZXIgPSBhWzAgKiA0ICsgMl07XHJcbiAgICAgIGxldCBhMDM6IG51bWJlciA9IGFbMCAqIDQgKyAzXTtcclxuICAgICAgbGV0IGExMDogbnVtYmVyID0gYVsxICogNCArIDBdO1xyXG4gICAgICBsZXQgYTExOiBudW1iZXIgPSBhWzEgKiA0ICsgMV07XHJcbiAgICAgIGxldCBhMTI6IG51bWJlciA9IGFbMSAqIDQgKyAyXTtcclxuICAgICAgbGV0IGExMzogbnVtYmVyID0gYVsxICogNCArIDNdO1xyXG4gICAgICBsZXQgYTIwOiBudW1iZXIgPSBhWzIgKiA0ICsgMF07XHJcbiAgICAgIGxldCBhMjE6IG51bWJlciA9IGFbMiAqIDQgKyAxXTtcclxuICAgICAgbGV0IGEyMjogbnVtYmVyID0gYVsyICogNCArIDJdO1xyXG4gICAgICBsZXQgYTIzOiBudW1iZXIgPSBhWzIgKiA0ICsgM107XHJcbiAgICAgIGxldCBhMzA6IG51bWJlciA9IGFbMyAqIDQgKyAwXTtcclxuICAgICAgbGV0IGEzMTogbnVtYmVyID0gYVszICogNCArIDFdO1xyXG4gICAgICBsZXQgYTMyOiBudW1iZXIgPSBhWzMgKiA0ICsgMl07XHJcbiAgICAgIGxldCBhMzM6IG51bWJlciA9IGFbMyAqIDQgKyAzXTtcclxuICAgICAgbGV0IGIwMDogbnVtYmVyID0gYlswICogNCArIDBdO1xyXG4gICAgICBsZXQgYjAxOiBudW1iZXIgPSBiWzAgKiA0ICsgMV07XHJcbiAgICAgIGxldCBiMDI6IG51bWJlciA9IGJbMCAqIDQgKyAyXTtcclxuICAgICAgbGV0IGIwMzogbnVtYmVyID0gYlswICogNCArIDNdO1xyXG4gICAgICBsZXQgYjEwOiBudW1iZXIgPSBiWzEgKiA0ICsgMF07XHJcbiAgICAgIGxldCBiMTE6IG51bWJlciA9IGJbMSAqIDQgKyAxXTtcclxuICAgICAgbGV0IGIxMjogbnVtYmVyID0gYlsxICogNCArIDJdO1xyXG4gICAgICBsZXQgYjEzOiBudW1iZXIgPSBiWzEgKiA0ICsgM107XHJcbiAgICAgIGxldCBiMjA6IG51bWJlciA9IGJbMiAqIDQgKyAwXTtcclxuICAgICAgbGV0IGIyMTogbnVtYmVyID0gYlsyICogNCArIDFdO1xyXG4gICAgICBsZXQgYjIyOiBudW1iZXIgPSBiWzIgKiA0ICsgMl07XHJcbiAgICAgIGxldCBiMjM6IG51bWJlciA9IGJbMiAqIDQgKyAzXTtcclxuICAgICAgbGV0IGIzMDogbnVtYmVyID0gYlszICogNCArIDBdO1xyXG4gICAgICBsZXQgYjMxOiBudW1iZXIgPSBiWzMgKiA0ICsgMV07XHJcbiAgICAgIGxldCBiMzI6IG51bWJlciA9IGJbMyAqIDQgKyAyXTtcclxuICAgICAgbGV0IGIzMzogbnVtYmVyID0gYlszICogNCArIDNdO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICBiMDAgKiBhMDAgKyBiMDEgKiBhMTAgKyBiMDIgKiBhMjAgKyBiMDMgKiBhMzAsXHJcbiAgICAgICAgYjAwICogYTAxICsgYjAxICogYTExICsgYjAyICogYTIxICsgYjAzICogYTMxLFxyXG4gICAgICAgIGIwMCAqIGEwMiArIGIwMSAqIGExMiArIGIwMiAqIGEyMiArIGIwMyAqIGEzMixcclxuICAgICAgICBiMDAgKiBhMDMgKyBiMDEgKiBhMTMgKyBiMDIgKiBhMjMgKyBiMDMgKiBhMzMsXHJcbiAgICAgICAgYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwICsgYjEzICogYTMwLFxyXG4gICAgICAgIGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMSArIGIxMyAqIGEzMSxcclxuICAgICAgICBiMTAgKiBhMDIgKyBiMTEgKiBhMTIgKyBiMTIgKiBhMjIgKyBiMTMgKiBhMzIsXHJcbiAgICAgICAgYjEwICogYTAzICsgYjExICogYTEzICsgYjEyICogYTIzICsgYjEzICogYTMzLFxyXG4gICAgICAgIGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGIyMiAqIGEyMCArIGIyMyAqIGEzMCxcclxuICAgICAgICBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjEgKyBiMjMgKiBhMzEsXHJcbiAgICAgICAgYjIwICogYTAyICsgYjIxICogYTEyICsgYjIyICogYTIyICsgYjIzICogYTMyLFxyXG4gICAgICAgIGIyMCAqIGEwMyArIGIyMSAqIGExMyArIGIyMiAqIGEyMyArIGIyMyAqIGEzMyxcclxuICAgICAgICBiMzAgKiBhMDAgKyBiMzEgKiBhMTAgKyBiMzIgKiBhMjAgKyBiMzMgKiBhMzAsXHJcbiAgICAgICAgYjMwICogYTAxICsgYjMxICogYTExICsgYjMyICogYTIxICsgYjMzICogYTMxLFxyXG4gICAgICAgIGIzMCAqIGEwMiArIGIzMSAqIGExMiArIGIzMiAqIGEyMiArIGIzMyAqIGEzMixcclxuICAgICAgICBiMzAgKiBhMDMgKyBiMzEgKiBhMTMgKyBiMzIgKiBhMjMgKyBiMzMgKiBhMzNcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgdHJhbnNwb3NlIG9mIGEgcGFzc2VkIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU1BPU0UoX210eDogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIF9tdHguY2xvbmUudHJhbnNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgaW52ZXJzZSBvZiBhIHBhc3NlZCBtYXRyaXguXHJcbiAgICAgKiBAcGFyYW0gX210eCBUaGUgbWF0cml4IHRvIGNvbXB1dGUgdGhlIGludmVyc2Ugb2YuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSU5WRVJTRShfbXR4OiBNYXRyaXg0eDQpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gX210eC5jbG9uZS5pbnZlcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgbWF0cml4IHdpdGggdGhlIGdpdmVuIHRyYW5zbGF0aW9uLCBpdHMgei1heGlzIHBvaW50aW5nIGRpcmVjdGx5IGF0IHRoZSBnaXZlbiB0YXJnZXQsXHJcbiAgICAgKiBhbmQgYSBtaW5pbWFsIGFuZ2xlIGJldHdlZW4gaXRzIHktYXhpcyBhbmQgdGhlIGdpdmVuIHVwLXtAbGluayBWZWN0b3IzfSwgcmVzcGV0aXZlbHkgY2FsY3VsYXRpbmcgeWF3IGFuZCBwaXRjaC5cclxuICAgICAqIFRoZSBwaXRjaCBtYXkgYmUgcmVzdHJpY3RlZCB0byB0aGUgdXAtdmVjdG9yIHRvIG9ubHkgY2FsY3VsYXRlIHlhdy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBMT09LX0FUKF90cmFuc2xhdGlvbjogVmVjdG9yMywgX3RhcmdldDogVmVjdG9yMywgX3VwOiBWZWN0b3IzID0gVmVjdG9yMy5ZKCksIF9yZXN0cmljdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IHpBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF90YXJnZXQsIF90cmFuc2xhdGlvbik7XHJcbiAgICAgIHpBeGlzLm5vcm1hbGl6ZSgpO1xyXG4gICAgICBsZXQgdmN0Q3Jvc3M6IFZlY3RvcjMgPSBWZWN0b3IzLkNST1NTKF91cCwgekF4aXMpO1xyXG4gICAgICBpZiAodmN0Q3Jvc3MubWFnbml0dWRlU3F1YXJlZCA9PSAwKSAvLyBleHBlcmltZW50YWwgd29ya2Fyb3VuZDogaWYgeiBhbmQgdXAgaXMgcGFyYWxsZWwsIHRoZXJlIGlzIG5vIHVwIHRvIHJlbWFpbi4uLlxyXG4gICAgICAgIHZjdENyb3NzLnggPSAwLjAwMTsgLy8gc28gdGlsdCBhIGxpdHRsZVxyXG4gICAgICBsZXQgeEF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04odmN0Q3Jvc3MpO1xyXG4gICAgICBsZXQgeUF4aXM6IFZlY3RvcjMgPSBfcmVzdHJpY3QgPyBfdXAgOiBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyh6QXhpcywgeEF4aXMpKTtcclxuICAgICAgekF4aXMgPSBfcmVzdHJpY3QgPyBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyh4QXhpcywgX3VwKSkgOiB6QXhpcztcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICB4QXhpcy54LCB4QXhpcy55LCB4QXhpcy56LCAwLFxyXG4gICAgICAgIHlBeGlzLngsIHlBeGlzLnksIHlBeGlzLnosIDAsXHJcbiAgICAgICAgekF4aXMueCwgekF4aXMueSwgekF4aXMueiwgMCxcclxuICAgICAgICBfdHJhbnNsYXRpb24ueCxcclxuICAgICAgICBfdHJhbnNsYXRpb24ueSxcclxuICAgICAgICBfdHJhbnNsYXRpb24ueixcclxuICAgICAgICAxXHJcbiAgICAgIF0pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKHpBeGlzLCB4QXhpcywgeUF4aXMsIHZjdENyb3NzKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgbWF0cml4IHdpdGggdGhlIGdpdmVuIHRyYW5zbGF0aW9uLCBpdHMgei1heGlzIHBvaW50aW5nIGRpcmVjdGx5IGluIHRoZSBnaXZlbiBkaXJlY3Rpb24sXHJcbiAgICAgKiBhbmQgYSBtaW5pbWFsIGFuZ2xlIGJldHdlZW4gaXRzIHktYXhpcyBhbmQgdGhlIGdpdmVuIHVwLXtAbGluayBWZWN0b3IzfS4gSWRlYWxseSB1cCBzaG91bGQgYmUgcGVycGVuZGljdWxhciB0byB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIExPT0tfSU4oX3RyYW5zbGF0aW9uOiBWZWN0b3IzLCBfZGlyZWN0aW9uOiBWZWN0b3IzLCBfdXA6IFZlY3RvcjMgPSBWZWN0b3IzLlkoKSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB6QXhpczogVmVjdG9yMyA9IFZlY3RvcjMuTk9STUFMSVpBVElPTihfZGlyZWN0aW9uKTtcclxuICAgICAgbGV0IHhBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5OT1JNQUxJWkFUSU9OKFZlY3RvcjMuQ1JPU1MoX3VwLCB6QXhpcykpO1xyXG4gICAgICBsZXQgeUF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyh6QXhpcywgeEF4aXMpKTtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICB4QXhpcy54LCB4QXhpcy55LCB4QXhpcy56LCAwLFxyXG4gICAgICAgIHlBeGlzLngsIHlBeGlzLnksIHlBeGlzLnosIDAsXHJcbiAgICAgICAgekF4aXMueCwgekF4aXMueSwgekF4aXMueiwgMCxcclxuICAgICAgICBfdHJhbnNsYXRpb24ueCwgX3RyYW5zbGF0aW9uLnksIF90cmFuc2xhdGlvbi56LCAxXHJcbiAgICAgIF0pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKHpBeGlzLCB4QXhpcywgeUF4aXMpO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24sIGl0cyB5LWF4aXMgbWF0Y2hpbmcgdGhlIGdpdmVuIHVwLXtAbGluayBWZWN0b3IzfVxyXG4gICAgICogYW5kIGl0cyB6LWF4aXMgZmFjaW5nIHRvd2FyZHMgdGhlIGdpdmVuIHRhcmdldCBhdCBhIG1pbmltYWwgYW5nbGUsIHJlc3BldGl2ZWx5IGNhbGN1bGF0aW5nIHlhdyBvbmx5LlxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIFNIT1dfVE8oX3RyYW5zbGF0aW9uOiBWZWN0b3IzLCBfdGFyZ2V0OiBWZWN0b3IzLCBfdXA6IFZlY3RvcjMgPSBWZWN0b3IzLlkoKSk6IE1hdHJpeDR4NCB7XHJcbiAgICAvLyAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIuZ2V0KE1hdHJpeDR4NCk7XHJcbiAgICAvLyAgIGxldCB6QXhpczogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShfdGFyZ2V0LCBfdHJhbnNsYXRpb24pO1xyXG4gICAgLy8gICB6QXhpcy5ub3JtYWxpemUoKTtcclxuICAgIC8vICAgbGV0IHhBeGlzOiBWZWN0b3IzID0gVmVjdG9yMy5OT1JNQUxJWkFUSU9OKFZlY3RvcjMuQ1JPU1MoX3VwLCB6QXhpcykpO1xyXG4gICAgLy8gICAvLyBsZXQgeUF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyh6QXhpcywgeEF4aXMpKTtcclxuICAgIC8vICAgekF4aXMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04oVmVjdG9yMy5DUk9TUyh4QXhpcywgX3VwKSk7XHJcbiAgICAvLyAgIG10eFJlc3VsdC5kYXRhLnNldChcclxuICAgIC8vICAgICBbXHJcbiAgICAvLyAgICAgICB4QXhpcy54LCB4QXhpcy55LCB4QXhpcy56LCAwLFxyXG4gICAgLy8gICAgICAgX3VwLngsIF91cC55LCBfdXAueiwgMCxcclxuICAgIC8vICAgICAgIHpBeGlzLngsIHpBeGlzLnksIHpBeGlzLnosIDAsXHJcbiAgICAvLyAgICAgICBfdHJhbnNsYXRpb24ueCxcclxuICAgIC8vICAgICAgIF90cmFuc2xhdGlvbi55LFxyXG4gICAgLy8gICAgICAgX3RyYW5zbGF0aW9uLnosXHJcbiAgICAvLyAgICAgICAxXHJcbiAgICAvLyAgICAgXSk7XHJcbiAgICAvLyAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgdHJhbnNsYXRlcyBjb29yZGluYXRlcyBhbG9uZyB0aGUgeC0sIHktIGFuZCB6LWF4aXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGxpbmsgVmVjdG9yM30uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgVFJBTlNMQVRJT04oX3RyYW5zbGF0ZTogVmVjdG9yMyk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIucmV1c2UoTWF0cml4NHg0KTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgMSwgMCwgMCwgMCxcclxuICAgICAgICAwLCAxLCAwLCAwLFxyXG4gICAgICAgIDAsIDAsIDEsIDAsXHJcbiAgICAgICAgX3RyYW5zbGF0ZS54LCBfdHJhbnNsYXRlLnksIF90cmFuc2xhdGUueiwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIG9uIHRoZSB4LWF4aXMgd2hlbiBtdWx0aXBsaWVkIGJ5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJPVEFUSU9OX1goX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIpOiBNYXRyaXg0eDQge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCk7XHJcbiAgICAgIGxldCBhbmdsZUluUmFkaWFuczogbnVtYmVyID0gX2FuZ2xlSW5EZWdyZWVzICogQ2FsYy5kZWcycmFkO1xyXG4gICAgICBsZXQgc2luOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIGxldCBjb3M6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgMSwgMCwgMCwgMCxcclxuICAgICAgICAwLCBjb3MsIHNpbiwgMCxcclxuICAgICAgICAwLCAtc2luLCBjb3MsIDAsXHJcbiAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBtYXRyaXggdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIG9uIHRoZSB5LWF4aXMgd2hlbiBtdWx0aXBsaWVkIGJ5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJPVEFUSU9OX1koX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBsZXQgYW5nbGVJblJhZGlhbnM6IG51bWJlciA9IF9hbmdsZUluRGVncmVlcyAqIENhbGMuZGVnMnJhZDtcclxuICAgICAgbGV0IHNpbjogbnVtYmVyID0gTWF0aC5zaW4oYW5nbGVJblJhZGlhbnMpO1xyXG4gICAgICBsZXQgY29zOiBudW1iZXIgPSBNYXRoLmNvcyhhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIGNvcywgMCwgLXNpbiwgMCxcclxuICAgICAgICAwLCAxLCAwLCAwLFxyXG4gICAgICAgIHNpbiwgMCwgY29zLCAwLFxyXG4gICAgICAgIDAsIDAsIDAsIDFcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgcm90YXRlcyBjb29yZGluYXRlcyBvbiB0aGUgei1heGlzIHdoZW4gbXVsdGlwbGllZCBieS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBST1RBVElPTl9aKF9hbmdsZUluRGVncmVlczogbnVtYmVyKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBsZXQgYW5nbGVJblJhZGlhbnM6IG51bWJlciA9IF9hbmdsZUluRGVncmVlcyAqIENhbGMuZGVnMnJhZDtcclxuICAgICAgbGV0IHNpbjogbnVtYmVyID0gTWF0aC5zaW4oYW5nbGVJblJhZGlhbnMpO1xyXG4gICAgICBsZXQgY29zOiBudW1iZXIgPSBNYXRoLmNvcyhhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgIG10eFJlc3VsdC5zZXQoW1xyXG4gICAgICAgIGNvcywgc2luLCAwLCAwLFxyXG4gICAgICAgIC1zaW4sIGNvcywgMCwgMCxcclxuICAgICAgICAwLCAwLCAxLCAwLFxyXG4gICAgICAgIDAsIDAsIDAsIDFcclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgcm90YXRlcyBjb29yZGluYXRlcyB3aGVuIG11bHRpcGxpZWQgYnksIHVzaW5nIHRoZSByb3RhdGlvbiBldWxlciBhbmdsZXMgb3IgdW5pdCBxdWF0ZXJuaW9uIGdpdmVuLlxyXG4gICAgICogUm90YXRpb24gb2NjdXJzIGFyb3VuZCB0aGUgYXhpcyBpbiB0aGUgb3JkZXIgWi1ZLVggLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJPVEFUSU9OKF9yb3RhdGlvbjogVmVjdG9yMyB8IFF1YXRlcm5pb24pOiBNYXRyaXg0eDQge1xyXG4gICAgICBjb25zdCBtdHhSZXN1bHQ6IE1hdHJpeDR4NCA9IFJlY3ljbGVyLmdldChNYXRyaXg0eDQpO1xyXG4gICAgICBNYXRyaXg0eDQuc2V0Um90YXRpb24obXR4UmVzdWx0LmRhdGEsIF9yb3RhdGlvbik7XHJcbiAgICAgIHJldHVybiBtdHhSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgc2NhbGVzIGNvb3JkaW5hdGVzIGFsb25nIHRoZSB4LSwgeS0gYW5kIHotYXhpcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBWZWN0b3IzfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNDQUxJTkcoX3NjYWxhcjogVmVjdG9yMyk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIucmV1c2UoTWF0cml4NHg0KTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgX3NjYWxhci54LCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIF9zY2FsYXIueSwgMCwgMCxcclxuICAgICAgICAwLCAwLCBfc2NhbGFyLnosIDAsXHJcbiAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbWF0cml4IHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBiYXNlLlxyXG4gICAgICogSWYga25vd24sIHBhc3MgdGhlIGludmVyc2Ugb2YgdGhlIGJhc2UgdG8gYXZvaWQgdW5uZWNjZXNhcnkgY2FsY3VsYXRpb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUkVMQVRJVkUoX210eDogTWF0cml4NHg0LCBfbXR4QmFzZTogTWF0cml4NHg0LCBfbXR4SW52ZXJzZT86IE1hdHJpeDR4NCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGlmIChfbXR4SW52ZXJzZSlcclxuICAgICAgICByZXR1cm4gTWF0cml4NHg0LlBST0RVQ1QoX210eEludmVyc2UsIF9tdHgpO1xyXG5cclxuICAgICAgbGV0IG10eEludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKF9tdHhCYXNlKTtcclxuICAgICAgbGV0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LlBST0RVQ1QobXR4SW52ZXJzZSwgX210eCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eEludmVyc2UpO1xyXG4gICAgICByZXR1cm4gbXR4UmVzdWx0O1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFBST0pFQ1RJT05TXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgbWF0cml4IHRoYXQgYXBwbGllcyBwZXJzcGVjdGl2ZSB0byBhbiBvYmplY3QsIGlmIGl0cyB0cmFuc2Zvcm0gaXMgbXVsdGlwbGllZCBieSBpdC5cclxuICAgICAqIEBwYXJhbSBfYXNwZWN0IFRoZSBhc3BlY3QgcmF0aW8gYmV0d2VlbiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHByb2plY3Rpb25zcGFjZS4oRGVmYXVsdCA9IGNhbnZhcy5jbGllbnRXaWR0aCAvIGNhbnZhcy5DbGllbnRIZWlnaHQpXHJcbiAgICAgKiBAcGFyYW0gX2ZpZWxkT2ZWaWV3SW5EZWdyZWVzIFRoZSBmaWVsZCBvZiB2aWV3IGluIERlZ3JlZXMuIChEZWZhdWx0ID0gNDUpXHJcbiAgICAgKiBAcGFyYW0gX25lYXIgVGhlIG5lYXIgY2xpcHNwYWNlIGJvcmRlciBvbiB0aGUgei1heGlzLlxyXG4gICAgICogQHBhcmFtIF9mYXIgVGhlIGZhciBjbGlwc3BhY2UgYm9yZGVyIG9uIHRoZSB6LWF4aXMuXHJcbiAgICAgKiBAcGFyYW0gX2RpcmVjdGlvbiBUaGUgcGxhbmUgb24gd2hpY2ggdGhlIGZpZWxkT2ZWaWV3LUFuZ2xlIGlzIGdpdmVuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0pFQ1RJT05fQ0VOVFJBTChfYXNwZWN0OiBudW1iZXIsIF9maWVsZE9mVmlld0luRGVncmVlczogbnVtYmVyLCBfbmVhcjogbnVtYmVyLCBfZmFyOiBudW1iZXIsIF9kaXJlY3Rpb246IEZJRUxEX09GX1ZJRVcpOiBNYXRyaXg0eDQge1xyXG4gICAgICAvL1RPRE86IGNhbWVyYSBsb29rcyBkb3duIG5lZ2F0aXZlIHotZGlyZWN0aW9uLCBzaG91bGQgYmUgcG9zaXRpdmVcclxuICAgICAgbGV0IGZpZWxkT2ZWaWV3SW5SYWRpYW5zOiBudW1iZXIgPSBfZmllbGRPZlZpZXdJbkRlZ3JlZXMgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIGxldCBmOiBudW1iZXIgPSBNYXRoLnRhbigwLjUgKiAoTWF0aC5QSSAtIGZpZWxkT2ZWaWV3SW5SYWRpYW5zKSk7XHJcbiAgICAgIGxldCByYW5nZUludjogbnVtYmVyID0gMS4wIC8gKF9uZWFyIC0gX2Zhcik7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gUmVjeWNsZXIucmV1c2UoTWF0cml4NHg0KTtcclxuICAgICAgbXR4UmVzdWx0LnNldChbXHJcbiAgICAgICAgZiwgMCwgMCwgMCxcclxuICAgICAgICAwLCBmLCAwLCAwLFxyXG4gICAgICAgIDAsIDAsIChfbmVhciArIF9mYXIpICogcmFuZ2VJbnYsIC0xLFxyXG4gICAgICAgIDAsIDAsIF9uZWFyICogX2ZhciAqIHJhbmdlSW52ICogMiwgMFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIGlmIChfZGlyZWN0aW9uID09IEZJRUxEX09GX1ZJRVcuRElBR09OQUwpIHtcclxuICAgICAgICBfYXNwZWN0ID0gTWF0aC5zcXJ0KF9hc3BlY3QpO1xyXG4gICAgICAgIG10eFJlc3VsdC5kYXRhWzBdID0gZiAvIF9hc3BlY3Q7XHJcbiAgICAgICAgbXR4UmVzdWx0LmRhdGFbNV0gPSBmICogX2FzcGVjdDtcclxuICAgICAgfSBlbHNlIGlmIChfZGlyZWN0aW9uID09IEZJRUxEX09GX1ZJRVcuVkVSVElDQUwpXHJcbiAgICAgICAgbXR4UmVzdWx0LmRhdGFbMF0gPSBmIC8gX2FzcGVjdDtcclxuICAgICAgZWxzZSAvL0ZPVl9ESVJFQ1RJT04uSE9SSVpPTlRBTFxyXG4gICAgICAgIG10eFJlc3VsdC5kYXRhWzVdID0gZiAqIF9hc3BlY3Q7XHJcblxyXG4gICAgICAvLyBIQUNLOiBtYXRyaXggc2hvdWxkIGxvb2sgaW4gcG9zaXRpdmUgei1kaXJlY3Rpb24sIHByZWZlcmFibHkgdGhlIG1hdHJpeCBzaG91bGQgYmUgY2FsY3VsYXRlZCBsaWtlIHRoYXQgcmlnaHQgYXdheVxyXG4gICAgICBtdHhSZXN1bHQucm90YXRlWSgxODApO1xyXG5cclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgbWF0cml4IHRoYXQgYXBwbGllcyBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiB0byBhbiBvYmplY3QsIGlmIGl0cyB0cmFuc2Zvcm0gaXMgbXVsdGlwbGllZCBieSBpdC5cclxuICAgICAqIEBwYXJhbSBfbGVmdCBUaGUgcG9zaXRpb252YWx1ZSBvZiB0aGUgcHJvamVjdGlvbnNwYWNlJ3MgbGVmdCBib3JkZXIuXHJcbiAgICAgKiBAcGFyYW0gX3JpZ2h0IFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyByaWdodCBib3JkZXIuXHJcbiAgICAgKiBAcGFyYW0gX2JvdHRvbSBUaGUgcG9zaXRpb252YWx1ZSBvZiB0aGUgcHJvamVjdGlvbnNwYWNlJ3MgYm90dG9tIGJvcmRlci5cclxuICAgICAqIEBwYXJhbSBfdG9wIFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyB0b3AgYm9yZGVyLlxyXG4gICAgICogQHBhcmFtIF9uZWFyIFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBuZWFyIGJvcmRlci5cclxuICAgICAqIEBwYXJhbSBfZmFyIFRoZSBwb3NpdGlvbnZhbHVlIG9mIHRoZSBwcm9qZWN0aW9uc3BhY2UncyBmYXIgYm9yZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJPSkVDVElPTl9PUlRIT0dSQVBISUMoX2xlZnQ6IG51bWJlciwgX3JpZ2h0OiBudW1iZXIsIF9ib3R0b206IG51bWJlciwgX3RvcDogbnVtYmVyLCBfbmVhcjogbnVtYmVyID0gLTQwMCwgX2ZhcjogbnVtYmVyID0gNDAwKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBSZWN5Y2xlci5yZXVzZShNYXRyaXg0eDQpO1xyXG4gICAgICBtdHhSZXN1bHQuc2V0KFtcclxuICAgICAgICAyIC8gKF9yaWdodCAtIF9sZWZ0KSwgMCwgMCwgMCxcclxuICAgICAgICAwLCAtMiAvIChfdG9wIC0gX2JvdHRvbSksIDAsIDAsXHJcbiAgICAgICAgMCwgMCwgMiAvIChfZmFyIC0gX25lYXIpLCAwLFxyXG4gICAgICAgIChfbGVmdCArIF9yaWdodCkgLyAoX2xlZnQgLSBfcmlnaHQpLFxyXG4gICAgICAgIChfYm90dG9tICsgX3RvcCkgLyAoX2JvdHRvbSAtIF90b3ApLFxyXG4gICAgICAgIChfbmVhciArIF9mYXIpIC8gKF9uZWFyIC0gX2ZhciksXHJcbiAgICAgICAgMVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIG10eFJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgcm90YXRpb24gcGFydCBvZiB0aGUgZ2l2ZW4gbWF0cml4ZXMgZGF0YSBhcnJheSB0byB0aGUgZ2l2ZW4gcm90YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIHNldFJvdGF0aW9uKF9tOiBGbG9hdDMyQXJyYXksIF9yb3RhdGlvbjogVmVjdG9yMyB8IFF1YXRlcm5pb24pOiB2b2lkIHtcclxuICAgICAgaWYgKF9yb3RhdGlvbiBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcclxuICAgICAgICBjb25zdCBhbmdsZXNSYWQ6IFZlY3RvcjMgPSBWZWN0b3IzLlNDQUxFKF9yb3RhdGlvbiwgQ2FsYy5kZWcycmFkKTtcclxuICAgICAgICBjb25zdCBzaW5YOiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZXNSYWQueCk7XHJcbiAgICAgICAgY29uc3QgY29zWDogbnVtYmVyID0gTWF0aC5jb3MoYW5nbGVzUmFkLngpO1xyXG4gICAgICAgIGNvbnN0IHNpblk6IG51bWJlciA9IE1hdGguc2luKGFuZ2xlc1JhZC55KTtcclxuICAgICAgICBjb25zdCBjb3NZOiBudW1iZXIgPSBNYXRoLmNvcyhhbmdsZXNSYWQueSk7XHJcbiAgICAgICAgY29uc3Qgc2luWjogbnVtYmVyID0gTWF0aC5zaW4oYW5nbGVzUmFkLnopO1xyXG4gICAgICAgIGNvbnN0IGNvc1o6IG51bWJlciA9IE1hdGguY29zKGFuZ2xlc1JhZC56KTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShhbmdsZXNSYWQpO1xyXG5cclxuICAgICAgICBfbVswXSA9IGNvc1ogKiBjb3NZOyAvKiovICAgICAgICAgICAgICAgICBfbVsxXSA9IHNpblogKiBjb3NZOyAvKiovICAgICAgICAgICAgICAgICBfbVsyXSA9IC1zaW5ZO1xyXG4gICAgICAgIF9tWzRdID0gY29zWiAqIHNpblkgKiBzaW5YIC0gc2luWiAqIGNvc1g7IF9tWzVdID0gc2luWiAqIHNpblkgKiBzaW5YICsgY29zWiAqIGNvc1g7IF9tWzZdID0gY29zWSAqIHNpblg7XHJcbiAgICAgICAgX21bOF0gPSBjb3NaICogc2luWSAqIGNvc1ggKyBzaW5aICogc2luWDsgX21bOV0gPSBzaW5aICogc2luWSAqIGNvc1ggLSBjb3NaICogc2luWDsgX21bMTBdID0gY29zWSAqIGNvc1g7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgcm90YXRpb25Ob3JtYWxpemVkOiBRdWF0ZXJuaW9uID0gUXVhdGVybmlvbi5OT1JNQUxJWkFUSU9OKF9yb3RhdGlvbik7XHJcbiAgICAgICAgY29uc3QgeDogbnVtYmVyID0gcm90YXRpb25Ob3JtYWxpemVkLngsIHk6IG51bWJlciA9IHJvdGF0aW9uTm9ybWFsaXplZC55LCB6OiBudW1iZXIgPSByb3RhdGlvbk5vcm1hbGl6ZWQueiwgdzogbnVtYmVyID0gcm90YXRpb25Ob3JtYWxpemVkLnc7XHJcbiAgICAgICAgY29uc3QgeHg6IG51bWJlciA9IHggKiB4LCB4eTogbnVtYmVyID0geCAqIHksIHh6OiBudW1iZXIgPSB4ICogeiwgeHc6IG51bWJlciA9IHggKiB3O1xyXG4gICAgICAgIGNvbnN0IHl5OiBudW1iZXIgPSB5ICogeSwgeXo6IG51bWJlciA9IHkgKiB6LCB5dzogbnVtYmVyID0geSAqIHc7XHJcbiAgICAgICAgY29uc3Qgeno6IG51bWJlciA9IHogKiB6LCB6dzogbnVtYmVyID0geiAqIHc7XHJcbiAgICAgICAgY29uc3Qgd3c6IG51bWJlciA9IHcgKiB3O1xyXG5cclxuICAgICAgICBfbVswXSA9IHd3ICsgeHggLSB5eSAtIHp6OyBfbVsxXSA9IDIgKiAoeHkgKyB6dyk7LyoqLyBfbVsyXSA9IDIgKiAoeHogLSB5dyk7XHJcbiAgICAgICAgX21bNF0gPSAyICogKHh5IC0gencpOy8qKi8gX21bNV0gPSB3dyAtIHh4ICsgeXkgLSB6ejsgX21bNl0gPSAyICogKHl6ICsgeHcpO1xyXG4gICAgICAgIF9tWzhdID0gMiAqICh4eiArIHl3KTsvKiovIF9tWzldID0gMiAqICh5eiAtIHh3KTsvKiovIF9tWzEwXSA9IHd3IC0geHggLSB5eSArIHp6O1xyXG5cclxuICAgICAgICAvLyBfbVswXSA9IDEgLSAyICogKHl5ICsgenopOyBfbVsxXSA9IDIgKiAoeHkgKyB6dyk7LyoqLyBfbVsyXSA9IDIgKiAoeHogLSB5dyk7XHJcbiAgICAgICAgLy8gX21bNF0gPSAyICogKHh5IC0gencpOy8qKi8gX21bNV0gPSAxIC0gMiAqICh4eCArIHp6KTsgX21bNl0gPSAyICogKHl6ICsgeHcpO1xyXG4gICAgICAgIC8vIF9tWzhdID0gMiAqICh4eiArIHl3KTsvKiovIF9tWzldID0gMiAqICh5eiAtIHh3KTsvKiovIF9tWzEwXSA9IDEgLSAyICogKHh4ICsgeXkpO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKHJvdGF0aW9uTm9ybWFsaXplZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiAgQWNjZXNzb3JzXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIGEgdmVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2xhdGlvbiB7QGxpbmsgVmVjdG9yM30uICBcclxuICAgICAqICoqQ2F1dGlvbiEqKiBVc2UgaW1tZWRpYXRlbHkgYW5kIHJlYWRvbmx5LCBzaW5jZSB0aGUgdmVjdG9yIGlzIGdvaW5nIHRvIGJlIHJldXNlZCBpbnRlcm5hbGx5LiBDcmVhdGUgYSBjbG9uZSB0byBrZWVwIGxvbmdlciBhbmQgbWFuaXB1bGF0ZS4gXHJcbiAgICAgKiAtIHNldDogZWZmZWN0IHRoZSBtYXRyaXggaWdub3JpbmcgaXRzIHJvdGF0aW9uIGFuZCBzY2FsaW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdHJhbnNsYXRpb24oKTogVmVjdG9yMyB7XHJcbiAgICAgIGlmICh0aGlzLiN0cmFuc2xhdGlvbkRpcnR5KSB7XHJcbiAgICAgICAgdGhpcy4jdHJhbnNsYXRpb24uc2V0KHRoaXMuZGF0YVsxMl0sIHRoaXMuZGF0YVsxM10sIHRoaXMuZGF0YVsxNF0pO1xyXG4gICAgICAgIHRoaXMuI3RyYW5zbGF0aW9uRGlydHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jdHJhbnNsYXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRyYW5zbGF0aW9uKF90cmFuc2xhdGlvbjogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLm11dGF0ZSh7IFwidHJhbnNsYXRpb25cIjogX3RyYW5zbGF0aW9uIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIC0gZ2V0OiByZXR1cm4gYSB2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJvdGF0aW9uIHtAbGluayBWZWN0b3IzfS4gIFxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSBhbmQgcmVhZG9ubHksIHNpbmNlIHRoZSB2ZWN0b3IgaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGludGVybmFsbHkuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdGF0aW9uKCk6IFZlY3RvcjMge1xyXG4gICAgICBpZiAodGhpcy4jcm90YXRpb25EaXJ0eSkge1xyXG4gICAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5zY2FsaW5nO1xyXG5cclxuICAgICAgICBsZXQgczA6IG51bWJlciA9IHRoaXMuZGF0YVswXSAvIHNjYWxpbmcueDtcclxuICAgICAgICBsZXQgczE6IG51bWJlciA9IHRoaXMuZGF0YVsxXSAvIHNjYWxpbmcueDtcclxuICAgICAgICBsZXQgczI6IG51bWJlciA9IHRoaXMuZGF0YVsyXSAvIHNjYWxpbmcueDtcclxuICAgICAgICBsZXQgczY6IG51bWJlciA9IHRoaXMuZGF0YVs2XSAvIHNjYWxpbmcueTtcclxuICAgICAgICBsZXQgczEwOiBudW1iZXIgPSB0aGlzLmRhdGFbMTBdIC8gc2NhbGluZy56O1xyXG5cclxuICAgICAgICBsZXQgc3k6IG51bWJlciA9IE1hdGguaHlwb3QoczAsIHMxKTsgLy8gcHJvYmFibHkgMi4gcGFyYW0gc2hvdWxkIGJlIHRoaXMuZGF0YVs0XSAvIHNjYWxpbmcueVxyXG5cclxuICAgICAgICBsZXQgc2luZ3VsYXI6IGJvb2xlYW4gPSBzeSA8IDFlLTY7IC8vIElmXHJcblxyXG4gICAgICAgIGxldCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB6MTogbnVtYmVyO1xyXG4gICAgICAgIGxldCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCB6MjogbnVtYmVyO1xyXG5cclxuICAgICAgICBpZiAoIXNpbmd1bGFyKSB7XHJcbiAgICAgICAgICB4MSA9IE1hdGguYXRhbjIoczYsIHMxMCk7XHJcbiAgICAgICAgICB5MSA9IE1hdGguYXRhbjIoLXMyLCBzeSk7XHJcbiAgICAgICAgICB6MSA9IE1hdGguYXRhbjIoczEsIHMwKTtcclxuXHJcbiAgICAgICAgICB4MiA9IE1hdGguYXRhbjIoLXM2LCAtczEwKTtcclxuICAgICAgICAgIHkyID0gTWF0aC5hdGFuMigtczIsIC1zeSk7XHJcbiAgICAgICAgICB6MiA9IE1hdGguYXRhbjIoLXMxLCAtczApO1xyXG5cclxuICAgICAgICAgIGlmIChNYXRoLmFicyh4MikgKyBNYXRoLmFicyh5MikgKyBNYXRoLmFicyh6MikgPCBNYXRoLmFicyh4MSkgKyBNYXRoLmFicyh5MSkgKyBNYXRoLmFicyh6MSkpIHtcclxuICAgICAgICAgICAgeDEgPSB4MjtcclxuICAgICAgICAgICAgeTEgPSB5MjtcclxuICAgICAgICAgICAgejEgPSB6MjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgeDEgPSBNYXRoLmF0YW4yKC10aGlzLmRhdGFbOV0gLyBzY2FsaW5nLnosIHRoaXMuZGF0YVs1XSAvIHNjYWxpbmcueSk7XHJcbiAgICAgICAgICB5MSA9IE1hdGguYXRhbjIoLXRoaXMuZGF0YVsyXSAvIHNjYWxpbmcueCwgc3kpO1xyXG4gICAgICAgICAgejEgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy4jcm90YXRpb24uc2V0KHgxLCB5MSwgejEpO1xyXG4gICAgICAgIHRoaXMuI3JvdGF0aW9uLnNjYWxlKENhbGMucmFkMmRlZyk7XHJcbiAgICAgICAgdGhpcy4jcm90YXRpb25EaXJ0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jcm90YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdGF0aW9uKF9yb3RhdGlvbjogUXVhdGVybmlvbiB8IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy5tdXRhdGUoeyBcInJvdGF0aW9uXCI6IF9yb3RhdGlvbiB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIGEgdmVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2FsaW5nIHtAbGluayBWZWN0b3IzfS4gIFxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSBhbmQgcmVhZG9ubHksIHNpbmNlIHRoZSB2ZWN0b3IgaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGludGVybmFsbHkuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNjYWxpbmcoKTogVmVjdG9yMyB7XHJcbiAgICAgIGlmICh0aGlzLiNzY2FsaW5nRGlydHkpIHtcclxuICAgICAgICB0aGlzLiNzY2FsaW5nLnNldChcclxuICAgICAgICAgIE1hdGguaHlwb3QodGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0sIHRoaXMuZGF0YVsyXSksIC8vKiAodGhpcy5kYXRhWzBdIDwgMCA/IC0xIDogMSksXHJcbiAgICAgICAgICBNYXRoLmh5cG90KHRoaXMuZGF0YVs0XSwgdGhpcy5kYXRhWzVdLCB0aGlzLmRhdGFbNl0pLCAvLyogKHRoaXMuZGF0YVs1XSA8IDAgPyAtMSA6IDEpLFxyXG4gICAgICAgICAgTWF0aC5oeXBvdCh0aGlzLmRhdGFbOF0sIHRoaXMuZGF0YVs5XSwgdGhpcy5kYXRhWzEwXSkgLy8gKiAodGhpcy5kYXRhWzEwXSA8IDAgPyAtMSA6IDEpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLiNzY2FsaW5nRGlydHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jc2NhbGluZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2NhbGluZyhfc2NhbGluZzogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLm11dGF0ZSh7IFwic2NhbGluZ1wiOiBfc2NhbGluZyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiAtIGdldDogcmV0dXJuIGEgdW5pdCBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyB0aGUgcm90YXRpb24gb2YgdGhpcyBtYXRyaXguXHJcbiAgICAgKiAqKkNhdXRpb24hKiogVXNlIGltbWVkaWF0ZWx5IGFuZCByZWFkb25seSwgc2luY2UgdGhlIHF1YXRlcm5pb24gaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGludGVybmFsbHkuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBlZmZlY3QgdGhlIG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHF1YXRlcm5pb24oKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGlmICh0aGlzLiNxdWF0ZXJuaW9uRGlydHkpIHtcclxuICAgICAgICB0aGlzLiNxdWF0ZXJuaW9uLmV1bGVyQW5nbGVzID0gdGhpcy5yb3RhdGlvbjtcclxuICAgICAgICB0aGlzLiNxdWF0ZXJuaW9uRGlydHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI3F1YXRlcm5pb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHF1YXRlcm5pb24oX3F1YXRlcm5pb246IFF1YXRlcm5pb24pIHtcclxuICAgICAgdGhpcy5tdXRhdGUoeyBcInJvdGF0aW9uXCI6IF9xdWF0ZXJuaW9uIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCBjYXJkaW5hbCB4LWF4aXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcmlnaHQoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByaWdodDogVmVjdG9yMyA9IHRoaXMuZ2V0WCgpO1xyXG4gICAgICByaWdodC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHJpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCBjYXJkaW5hbCB5LWF4aXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdXAoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB1cDogVmVjdG9yMyA9IHRoaXMuZ2V0WSgpO1xyXG4gICAgICB1cC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHVwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCBjYXJkaW5hbCB6LWF4aXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZm9yd2FyZCgpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGZvcndhcmQ6IFZlY3RvcjMgPSB0aGlzLmdldFooKTtcclxuICAgICAgZm9yd2FyZC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIGZvcndhcmQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogTWF0cml4NHg0IHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKE1hdHJpeDR4NCkuY29weSh0aGlzKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBtYXRyaXggdG8gdGhlIGlkZW50aXR5LW1hdHJpeCBhbmQgY2xlYXJzIGNhY2hlLiBVc2VkIGJ5IHRoZSByZWN5Y2xlciB0byByZXNldC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0KFtcclxuICAgICAgICAxLCAwLCAwLCAwLFxyXG4gICAgICAgIDAsIDEsIDAsIDAsXHJcbiAgICAgICAgMCwgMCwgMSwgMCxcclxuICAgICAgICAwLCAwLCAwLCAxXHJcbiAgICAgIF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBtYXRyaXggdG8gdGhlIGlkZW50aXR5LW1hdHJpeCBhbmQgY2xlYXJzIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMucmVjeWNsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNwb3NlIHRoaXMgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc3Bvc2UoKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IHRoaXMuZGF0YTtcclxuICAgICAgdGhpcy5zZXQoW1xyXG4gICAgICAgIG1bMF0sIG1bNF0sIG1bOF0sIG1bMTJdLFxyXG4gICAgICAgIG1bMV0sIG1bNV0sIG1bOV0sIG1bMTNdLFxyXG4gICAgICAgIG1bMl0sIG1bNl0sIG1bMTBdLCBtWzE0XSxcclxuICAgICAgICBtWzNdLCBtWzddLCBtWzExXSwgbVsxNV1cclxuICAgICAgXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52ZXJ0IHRoaXMgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnZlcnQoKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IHRoaXMuZGF0YTtcclxuICAgICAgbGV0IG0wMDogbnVtYmVyID0gbVswICogNCArIDBdO1xyXG4gICAgICBsZXQgbTAxOiBudW1iZXIgPSBtWzAgKiA0ICsgMV07XHJcbiAgICAgIGxldCBtMDI6IG51bWJlciA9IG1bMCAqIDQgKyAyXTtcclxuICAgICAgbGV0IG0wMzogbnVtYmVyID0gbVswICogNCArIDNdO1xyXG4gICAgICBsZXQgbTEwOiBudW1iZXIgPSBtWzEgKiA0ICsgMF07XHJcbiAgICAgIGxldCBtMTE6IG51bWJlciA9IG1bMSAqIDQgKyAxXTtcclxuICAgICAgbGV0IG0xMjogbnVtYmVyID0gbVsxICogNCArIDJdO1xyXG4gICAgICBsZXQgbTEzOiBudW1iZXIgPSBtWzEgKiA0ICsgM107XHJcbiAgICAgIGxldCBtMjA6IG51bWJlciA9IG1bMiAqIDQgKyAwXTtcclxuICAgICAgbGV0IG0yMTogbnVtYmVyID0gbVsyICogNCArIDFdO1xyXG4gICAgICBsZXQgbTIyOiBudW1iZXIgPSBtWzIgKiA0ICsgMl07XHJcbiAgICAgIGxldCBtMjM6IG51bWJlciA9IG1bMiAqIDQgKyAzXTtcclxuICAgICAgbGV0IG0zMDogbnVtYmVyID0gbVszICogNCArIDBdO1xyXG4gICAgICBsZXQgbTMxOiBudW1iZXIgPSBtWzMgKiA0ICsgMV07XHJcbiAgICAgIGxldCBtMzI6IG51bWJlciA9IG1bMyAqIDQgKyAyXTtcclxuICAgICAgbGV0IG0zMzogbnVtYmVyID0gbVszICogNCArIDNdO1xyXG4gICAgICBsZXQgdG1wMDogbnVtYmVyID0gbTIyICogbTMzO1xyXG4gICAgICBsZXQgdG1wMTogbnVtYmVyID0gbTMyICogbTIzO1xyXG4gICAgICBsZXQgdG1wMjogbnVtYmVyID0gbTEyICogbTMzO1xyXG4gICAgICBsZXQgdG1wMzogbnVtYmVyID0gbTMyICogbTEzO1xyXG4gICAgICBsZXQgdG1wNDogbnVtYmVyID0gbTEyICogbTIzO1xyXG4gICAgICBsZXQgdG1wNTogbnVtYmVyID0gbTIyICogbTEzO1xyXG4gICAgICBsZXQgdG1wNjogbnVtYmVyID0gbTAyICogbTMzO1xyXG4gICAgICBsZXQgdG1wNzogbnVtYmVyID0gbTMyICogbTAzO1xyXG4gICAgICBsZXQgdG1wODogbnVtYmVyID0gbTAyICogbTIzO1xyXG4gICAgICBsZXQgdG1wOTogbnVtYmVyID0gbTIyICogbTAzO1xyXG4gICAgICBsZXQgdG1wMTA6IG51bWJlciA9IG0wMiAqIG0xMztcclxuICAgICAgbGV0IHRtcDExOiBudW1iZXIgPSBtMTIgKiBtMDM7XHJcbiAgICAgIGxldCB0bXAxMjogbnVtYmVyID0gbTIwICogbTMxO1xyXG4gICAgICBsZXQgdG1wMTM6IG51bWJlciA9IG0zMCAqIG0yMTtcclxuICAgICAgbGV0IHRtcDE0OiBudW1iZXIgPSBtMTAgKiBtMzE7XHJcbiAgICAgIGxldCB0bXAxNTogbnVtYmVyID0gbTMwICogbTExO1xyXG4gICAgICBsZXQgdG1wMTY6IG51bWJlciA9IG0xMCAqIG0yMTtcclxuICAgICAgbGV0IHRtcDE3OiBudW1iZXIgPSBtMjAgKiBtMTE7XHJcbiAgICAgIGxldCB0bXAxODogbnVtYmVyID0gbTAwICogbTMxO1xyXG4gICAgICBsZXQgdG1wMTk6IG51bWJlciA9IG0zMCAqIG0wMTtcclxuICAgICAgbGV0IHRtcDIwOiBudW1iZXIgPSBtMDAgKiBtMjE7XHJcbiAgICAgIGxldCB0bXAyMTogbnVtYmVyID0gbTIwICogbTAxO1xyXG4gICAgICBsZXQgdG1wMjI6IG51bWJlciA9IG0wMCAqIG0xMTtcclxuICAgICAgbGV0IHRtcDIzOiBudW1iZXIgPSBtMTAgKiBtMDE7XHJcblxyXG4gICAgICBsZXQgdDA6IG51bWJlciA9ICh0bXAwICogbTExICsgdG1wMyAqIG0yMSArIHRtcDQgKiBtMzEpIC1cclxuICAgICAgICAodG1wMSAqIG0xMSArIHRtcDIgKiBtMjEgKyB0bXA1ICogbTMxKTtcclxuXHJcbiAgICAgIGxldCB0MTogbnVtYmVyID0gKHRtcDEgKiBtMDEgKyB0bXA2ICogbTIxICsgdG1wOSAqIG0zMSkgLVxyXG4gICAgICAgICh0bXAwICogbTAxICsgdG1wNyAqIG0yMSArIHRtcDggKiBtMzEpO1xyXG4gICAgICBsZXQgdDI6IG51bWJlciA9ICh0bXAyICogbTAxICsgdG1wNyAqIG0xMSArIHRtcDEwICogbTMxKSAtXHJcbiAgICAgICAgKHRtcDMgKiBtMDEgKyB0bXA2ICogbTExICsgdG1wMTEgKiBtMzEpO1xyXG4gICAgICBsZXQgdDM6IG51bWJlciA9ICh0bXA1ICogbTAxICsgdG1wOCAqIG0xMSArIHRtcDExICogbTIxKSAtXHJcbiAgICAgICAgKHRtcDQgKiBtMDEgKyB0bXA5ICogbTExICsgdG1wMTAgKiBtMjEpO1xyXG5cclxuICAgICAgbGV0IGQ6IG51bWJlciA9IDEuMCAvIChtMDAgKiB0MCArIG0xMCAqIHQxICsgbTIwICogdDIgKyBtMzAgKiB0Myk7XHJcblxyXG4gICAgICB0aGlzLnNldChbXHJcbiAgICAgICAgZCAqIHQwLCAvLyBbMF1cclxuICAgICAgICBkICogdDEsIC8vIFsxXVxyXG4gICAgICAgIGQgKiB0MiwgLy8gWzJdXHJcbiAgICAgICAgZCAqIHQzLCAvLyBbM11cclxuICAgICAgICBkICogKCh0bXAxICogbTEwICsgdG1wMiAqIG0yMCArIHRtcDUgKiBtMzApIC0gKHRtcDAgKiBtMTAgKyB0bXAzICogbTIwICsgdG1wNCAqIG0zMCkpLCAgICAgICAgLy8gWzRdXHJcbiAgICAgICAgZCAqICgodG1wMCAqIG0wMCArIHRtcDcgKiBtMjAgKyB0bXA4ICogbTMwKSAtICh0bXAxICogbTAwICsgdG1wNiAqIG0yMCArIHRtcDkgKiBtMzApKSwgICAgICAgIC8vIFs1XVxyXG4gICAgICAgIGQgKiAoKHRtcDMgKiBtMDAgKyB0bXA2ICogbTEwICsgdG1wMTEgKiBtMzApIC0gKHRtcDIgKiBtMDAgKyB0bXA3ICogbTEwICsgdG1wMTAgKiBtMzApKSwgICAgICAvLyBbNl1cclxuICAgICAgICBkICogKCh0bXA0ICogbTAwICsgdG1wOSAqIG0xMCArIHRtcDEwICogbTIwKSAtICh0bXA1ICogbTAwICsgdG1wOCAqIG0xMCArIHRtcDExICogbTIwKSksICAgICAgLy8gWzddXHJcbiAgICAgICAgZCAqICgodG1wMTIgKiBtMTMgKyB0bXAxNSAqIG0yMyArIHRtcDE2ICogbTMzKSAtICh0bXAxMyAqIG0xMyArIHRtcDE0ICogbTIzICsgdG1wMTcgKiBtMzMpKSwgIC8vIFs4XVxyXG4gICAgICAgIGQgKiAoKHRtcDEzICogbTAzICsgdG1wMTggKiBtMjMgKyB0bXAyMSAqIG0zMykgLSAodG1wMTIgKiBtMDMgKyB0bXAxOSAqIG0yMyArIHRtcDIwICogbTMzKSksICAvLyBbOV1cclxuICAgICAgICBkICogKCh0bXAxNCAqIG0wMyArIHRtcDE5ICogbTEzICsgdG1wMjIgKiBtMzMpIC0gKHRtcDE1ICogbTAzICsgdG1wMTggKiBtMTMgKyB0bXAyMyAqIG0zMykpLCAgLy8gWzEwXVxyXG4gICAgICAgIGQgKiAoKHRtcDE3ICogbTAzICsgdG1wMjAgKiBtMTMgKyB0bXAyMyAqIG0yMykgLSAodG1wMTYgKiBtMDMgKyB0bXAyMSAqIG0xMyArIHRtcDIyICogbTIzKSksICAvLyBbMTFdXHJcbiAgICAgICAgZCAqICgodG1wMTQgKiBtMjIgKyB0bXAxNyAqIG0zMiArIHRtcDEzICogbTEyKSAtICh0bXAxNiAqIG0zMiArIHRtcDEyICogbTEyICsgdG1wMTUgKiBtMjIpKSwgIC8vIFsxMl1cclxuICAgICAgICBkICogKCh0bXAyMCAqIG0zMiArIHRtcDEyICogbTAyICsgdG1wMTkgKiBtMjIpIC0gKHRtcDE4ICogbTIyICsgdG1wMjEgKiBtMzIgKyB0bXAxMyAqIG0wMikpLCAgLy8gWzEzXVxyXG4gICAgICAgIGQgKiAoKHRtcDE4ICogbTEyICsgdG1wMjMgKiBtMzIgKyB0bXAxNSAqIG0wMikgLSAodG1wMjIgKiBtMzIgKyB0bXAxNCAqIG0wMiArIHRtcDE5ICogbTEyKSksICAvLyBbMTRdXHJcbiAgICAgICAgZCAqICgodG1wMjIgKiBtMjIgKyB0bXAxNiAqIG0wMiArIHRtcDIxICogbTEyKSAtICh0bXAyMCAqIG0xMiArIHRtcDIzICogbTIyICsgdG1wMTcgKiBtMDIpKSAgLy8gWzE1XVxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zbGF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSB0cmFuc2xhdGlvbiBieSB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjN9IHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICogSWYgX2xvY2FsIGlzIHRydWUsIHRoZSB0cmFuc2xhdGlvbiBvY2N1cnMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHJvdGF0aW9uIGFuZCBzY2FsaW5nIG9mIHRoaXMgbWF0cml4LFxyXG4gICAgICogb3RoZXJ3aXNlLCBpdCBvY2N1cnMgYWNjb3JkaW5nIHRvIHRoZSBwYXJlbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGUoX2J5OiBWZWN0b3IzLCBfbG9jYWw6IGJvb2xlYW4gPSB0cnVlKTogTWF0cml4NHg0IHtcclxuICAgICAgaWYgKF9sb2NhbCkge1xyXG4gICAgICAgIGxldCBtdHhUcmFuc2xhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlRSQU5TTEFUSU9OKF9ieSk7XHJcbiAgICAgICAgdGhpcy5tdWx0aXBseShtdHhUcmFuc2xhdGlvbik7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobXR4VHJhbnNsYXRpb24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGF0YVsxMl0gKz0gX2J5Lng7XHJcbiAgICAgICAgdGhpcy5kYXRhWzEzXSArPSBfYnkueTtcclxuICAgICAgICB0aGlzLmRhdGFbMTRdICs9IF9ieS56O1xyXG4gICAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy4jdHJhbnNsYXRpb25EaXJ0eSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvbnN0IG1hdHJpeDogTWF0cml4NHg0ID0gTWF0cml4NHg0Lk1VTFRJUExJQ0FUSU9OKHRoaXMsIE1hdHJpeDR4NC5UUkFOU0xBVElPTihfYnkpKTtcclxuICAgICAgLy8gLy8gVE9ETzogcG9zc2libGUgb3B0aW1pemF0aW9uLCB0cmFuc2xhdGlvbiBtYXkgYWx0ZXIgbXV0YXRvciBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0LlxyXG4gICAgICAvLyB0aGlzLnNldChtYXRyaXgpO1xyXG4gICAgICAvLyBSZWN5Y2xlci5zdG9yZShtYXRyaXgpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSB0cmFuc2xhdGlvbiBhbG9uZyB0aGUgeC1heGlzIHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlWChfeDogbnVtYmVyLCBfbG9jYWw6IGJvb2xlYW4gPSB0cnVlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5YKF94KTtcclxuICAgICAgdGhpcy50cmFuc2xhdGUodHJhbnNsYXRpb24sIF9sb2NhbCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHRyYW5zbGF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgdHJhbnNsYXRpb24gYWxvbmcgdGhlIHktYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZVkoX3k6IG51bWJlciwgX2xvY2FsOiBib29sZWFuID0gdHJ1ZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB0cmFuc2xhdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuWShfeSk7XHJcbiAgICAgIHRoaXMudHJhbnNsYXRlKHRyYW5zbGF0aW9uLCBfbG9jYWwpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh0cmFuc2xhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHRyYW5zbGF0aW9uIGFsb25nIHRoZSB6LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2xhdGVaKF96OiBudW1iZXIsIF9sb2NhbDogYm9vbGVhbiA9IHRydWUpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSBWZWN0b3IzLlooX3opO1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZSh0cmFuc2xhdGlvbiwgX2xvY2FsKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBSb3RhdGlvblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIHRoaXMgbWF0cml4IGJ5IGdpdmVuIHtAbGluayBWZWN0b3IzfSBpbiB0aGUgb3JkZXIgWiwgWSwgWC4gUmlnaHQgaGFuZCByb3RhdGlvbiBpcyB1c2VkLCB0aHVtYiBwb2ludHMgaW4gYXhpcyBkaXJlY3Rpb24sIGZpbmdlcnMgY3VybGluZyBpbmRpY2F0ZSByb3RhdGlvblxyXG4gICAgICogVGhlIHJvdGF0aW9uIGlzIGFwcGVuZGVkIHRvIGFscmVhZHkgYXBwbGllZCB0cmFuc2Zvcm1zLCB0aHVzIG11bHRpcGxpZWQgZnJvbSB0aGUgcmlnaHQuIFNldCBfZnJvbUxlZnQgdG8gdHJ1ZSB0byBzd2l0Y2ggYW5kIHB1dCBpdCBpbiBmcm9udC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJvdGF0ZShfYnk6IFZlY3RvcjMsIF9mcm9tTGVmdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG10eFJvdGF0aW9uOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT04oX2J5KTtcclxuICAgICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgX2Zyb21MZWZ0KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4Um90YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSByb3RhdGlvbiBhcm91bmQgdGhlIHgtYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJvdGF0ZVgoX2FuZ2xlSW5EZWdyZWVzOiBudW1iZXIsIF9mcm9tTGVmdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgbGV0IG10eFJvdGF0aW9uOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT05fWChfYW5nbGVJbkRlZ3JlZXMpO1xyXG4gICAgICB0aGlzLm11bHRpcGx5KG10eFJvdGF0aW9uLCBfZnJvbUxlZnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSb3RhdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHJvdGF0aW9uIGFyb3VuZCB0aGUgeS1heGlzIHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm90YXRlWShfYW5nbGVJbkRlZ3JlZXM6IG51bWJlciwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBNYXRyaXg0eDQge1xyXG4gICAgICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5ST1RBVElPTl9ZKF9hbmdsZUluRGVncmVlcyk7XHJcbiAgICAgIHRoaXMubXVsdGlwbHkobXR4Um90YXRpb24sIF9mcm9tTGVmdCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJvdGF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgcm90YXRpb24gYXJvdW5kIHRoZSB6LWF4aXMgdG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3RhdGVaKF9hbmdsZUluRGVncmVlczogbnVtYmVyLCBfZnJvbUxlZnQ6IGJvb2xlYW4gPSBmYWxzZSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCBtdHhSb3RhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OX1ooX2FuZ2xlSW5EZWdyZWVzKTtcclxuICAgICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgX2Zyb21MZWZ0KTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4Um90YXRpb24pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdHMgdGhlIHJvdGF0aW9uIG9mIHRoaXMgbWF0cml4IHRvIHBvaW50IHRoZSB6LWF4aXMgZGlyZWN0bHkgYXQgdGhlIGdpdmVuIHRhcmdldCBhbmQgdGlsdHMgaXQgdG8gYWNjb3JkIHdpdGggdGhlIGdpdmVuIHVwLXtAbGluayBWZWN0b3IzfSxcclxuICAgICAqIHJlc3BlY3RpdmVseSBjYWxjdWxhdGluZyB5YXcgYW5kIHBpdGNoLiBJZiBubyB1cC17QGxpbmsgVmVjdG9yM30gaXMgZ2l2ZW4sIHRoZSBwcmV2aW91cyB1cC17QGxpbmsgVmVjdG9yM30gaXMgdXNlZC4gXHJcbiAgICAgKiBUaGUgcGl0Y2ggbWF5IGJlIHJlc3RyaWN0ZWQgdG8gdGhlIHVwLXZlY3RvciB0byBvbmx5IGNhbGN1bGF0ZSB5YXcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb29rQXQoX3RhcmdldDogVmVjdG9yMywgX3VwPzogVmVjdG9yMywgX3Jlc3RyaWN0OiBib29sZWFuID0gZmFsc2UpOiBNYXRyaXg0eDQge1xyXG4gICAgICBfdXAgPSBfdXAgPyBWZWN0b3IzLk5PUk1BTElaQVRJT04oX3VwKSA6IFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLnVwKTtcclxuXHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfQVQodGhpcy50cmFuc2xhdGlvbiwgX3RhcmdldCwgX3VwLCBfcmVzdHJpY3QpO1xyXG4gICAgICBtdHhSZXN1bHQuc2NhbGUodGhpcy5zY2FsaW5nKTtcclxuICAgICAgdGhpcy5zZXQobXR4UmVzdWx0LmRhdGEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhSZXN1bHQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdHMgdGhlIHJvdGF0aW9uIG9mIHRoaXMgbWF0cml4IHRvIGFsaWduIHRoZSB6LWF4aXMgd2l0aCB0aGUgZ2l2ZW4gZGlyZWN0aW9uIGFuZCB0aWx0cyBpdCB0byBhY2NvcmQgd2l0aCB0aGUgZ2l2ZW4gdXAte0BsaW5rIFZlY3RvcjN9LlxyXG4gICAgICogVXAgc2hvdWxkIGJlIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGdpdmVuIGRpcmVjdGlvbi4gSWYgbm8gdXAtdmVjdG9yIGlzIHByb3ZpZGVkLCAoMCwgMSwgMCkgaXMgdXNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvb2tJbihfZGlyZWN0aW9uOiBWZWN0b3IzLCBfdXA6IFZlY3RvcjMgPSBWZWN0b3IzLlkoKSk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGNvbnN0IG10eFJlc3VsdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkxPT0tfSU4odGhpcy50cmFuc2xhdGlvbiwgX2RpcmVjdGlvbiwgX3VwKTtcclxuICAgICAgbXR4UmVzdWx0LnNjYWxlKHRoaXMuc2NhbGluZyk7XHJcbiAgICAgIHRoaXMuc2V0KG10eFJlc3VsdC5kYXRhKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4UmVzdWx0KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTYW1lIGFzIHtAbGluayBNYXRyaXg0eDQubG9va0F0fSwgYnV0IG9wdGltaXplZCBhbmQgbmVlZHMgdGVzdGluZ1xyXG4gICAgICovXHJcbiAgICAvLyBUT0RPOiB0ZXN0aW5nIGxvb2thdCB0aGF0IHJlYWxseSBqdXN0IHJvdGF0ZXMgdGhlIG1hdHJpeCByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmVcclxuICAgIC8vIHB1YmxpYyBsb29rQXRSb3RhdGUoX3RhcmdldDogVmVjdG9yMywgX3VwPzogVmVjdG9yMywgX3ByZXNlcnZlU2NhbGluZzogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIC8vICAgaWYgKCFfdXApXHJcbiAgICAvLyAgICAgX3VwID0gdGhpcy5nZXRZKCk7XHJcblxyXG4gICAgLy8gICBsZXQgc2NhbGluZzogVmVjdG9yMyA9IHRoaXMuc2NhbGluZztcclxuICAgIC8vICAgbGV0IGRpZmZlcmVuY2U6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX3RhcmdldCwgdGhpcy50cmFuc2xhdGlvbik7XHJcbiAgICAvLyAgIGRpZmZlcmVuY2Uubm9ybWFsaXplKCk7XHJcbiAgICAvLyAgIGxldCBjb3M6IG51bWJlciA9IFZlY3RvcjMuRE9UKFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLmdldFooKSksIGRpZmZlcmVuY2UpO1xyXG4gICAgLy8gICBsZXQgc2luOiBudW1iZXIgPSBWZWN0b3IzLkRPVChWZWN0b3IzLk5PUk1BTElaQVRJT04odGhpcy5nZXRYKCkpLCBkaWZmZXJlbmNlKTtcclxuICAgIC8vICAgLy8gY29uc29sZS5sb2coc2luLCBjb3MpO1xyXG4gICAgLy8gICBsZXQgbXR4Um90YXRpb246IE1hdHJpeDR4NCA9IFJlY3ljbGVyLmdldChNYXRyaXg0eDQpO1xyXG4gICAgLy8gICBtdHhSb3RhdGlvbi5kYXRhLnNldChbXHJcbiAgICAvLyAgICAgY29zLCAwLCAtc2luLCAwLFxyXG4gICAgLy8gICAgIDAsIDEsIDAsIDAsXHJcbiAgICAvLyAgICAgc2luLCAwLCBjb3MsIDAsXHJcbiAgICAvLyAgICAgMCwgMCwgMCwgMVxyXG4gICAgLy8gICBdKTtcclxuICAgIC8vICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgZmFsc2UpO1xyXG5cclxuICAgIC8vICAgY29zID0gVmVjdG9yMy5ET1QoVmVjdG9yMy5OT1JNQUxJWkFUSU9OKHRoaXMuZ2V0WigpKSwgZGlmZmVyZW5jZSk7XHJcbiAgICAvLyAgIHNpbiA9IC1WZWN0b3IzLkRPVChWZWN0b3IzLk5PUk1BTElaQVRJT04odGhpcy5nZXRZKCkpLCBkaWZmZXJlbmNlKTtcclxuICAgIC8vICAgLy8gY29uc29sZS5sb2coc2luLCBjb3MpO1xyXG4gICAgLy8gICBtdHhSb3RhdGlvbi5kYXRhLnNldChbXHJcbiAgICAvLyAgICAgMSwgMCwgMCwgMCxcclxuICAgIC8vICAgICAwLCBjb3MsIHNpbiwgMCxcclxuICAgIC8vICAgICAwLCAtc2luLCBjb3MsIDAsXHJcbiAgICAvLyAgICAgMCwgMCwgMCwgMVxyXG4gICAgLy8gICBdKTtcclxuICAgIC8vICAgdGhpcy5tdWx0aXBseShtdHhSb3RhdGlvbiwgZmFsc2UpO1xyXG4gICAgLy8gICB0aGlzLnNjYWxpbmcgPSBzY2FsaW5nO1xyXG4gICAgLy8gICBSZWN5Y2xlci5zdG9yZShtdHhSb3RhdGlvbik7XHJcbiAgICAvLyB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2NhbGluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgc2NhbGluZyBieSB0aGUgZ2l2ZW4ge0BsaW5rIFZlY3RvcjN9IHRvIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX2J5OiBWZWN0b3IzKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4U2NhbGluZzogTWF0cml4NHg0ID0gTWF0cml4NHg0LlNDQUxJTkcoX2J5KTtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLCBtdHhTY2FsaW5nKTtcclxuICAgICAgdGhpcy5zZXQobXR4UmVzdWx0LmRhdGEpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKG10eFNjYWxpbmcsIG10eFJlc3VsdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHgtYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWChfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfYnksIDEsIDEpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHktYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWShfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldCgxLCBfYnksIDEpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNjYWxpbmcgYWxvbmcgdGhlIHotYXhpcyB0byB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjYWxlWihfYnk6IG51bWJlcik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldCgxLCAxLCBfYnkpO1xyXG4gICAgICB0aGlzLnNjYWxlKHZlY3Rvcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHZlY3Rvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZm9ybWF0aW9uXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShfbWF0cml4OiBNYXRyaXg0eDQsIF9mcm9tTGVmdDogYm9vbGVhbiA9IGZhbHNlKTogTWF0cml4NHg0IHtcclxuICAgICAgY29uc3QgbXR4UmVzdWx0OiBNYXRyaXg0eDQgPSBfZnJvbUxlZnQgPyBNYXRyaXg0eDQuUFJPRFVDVChfbWF0cml4LCB0aGlzKSA6IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMsIF9tYXRyaXgpO1xyXG4gICAgICB0aGlzLnNldChtdHhSZXN1bHQuZGF0YSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFJlc3VsdCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICAvLyBwdWJsaWMgZ2V0RXVsZXJBbmdsZXNOZXcoKTogVmVjdG9yMyB7XHJcbiAgICAvLyAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5zY2FsaW5nO1xyXG5cclxuICAgIC8vICAgbGV0IHRoZXRhWDogbnVtYmVyLCB0aGV0YVk6IG51bWJlciwgdGhldGFaOiBudW1iZXI7XHJcbiAgICAvLyAgIGxldCByMDI6IG51bWJlciA9IHRoaXMuZGF0YVsyXSAvIHNjYWxpbmcuejtcclxuICAgIC8vICAgbGV0IHIxMTogbnVtYmVyID0gdGhpcy5kYXRhWzVdIC8gc2NhbGluZy55O1xyXG5cclxuICAgIC8vICAgaWYgKHIwMiA8IDEpIHtcclxuICAgIC8vICAgICBpZiAocjAyID4gLTEpIHtcclxuICAgIC8vICAgICAgIHRoZXRhWSA9IE1hdGguYXNpbigtcjAyKTtcclxuICAgIC8vICAgICAgIHRoZXRhWiA9IE1hdGguYXRhbjIodGhpcy5kYXRhWzFdIC8gc2NhbGluZy55LCB0aGlzLmRhdGFbMF0gLyBzY2FsaW5nLngpO1xyXG4gICAgLy8gICAgICAgdGhldGFYID0gTWF0aC5hdGFuMih0aGlzLmRhdGFbOV0gLyBzY2FsaW5nLnosIHRoaXMuZGF0YVsxMF0gLyBzY2FsaW5nLnopO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBlbHNlIHtcclxuICAgIC8vICAgICAgIHRoZXRhWSA9IE1hdGguUEkgLyAyO1xyXG4gICAgLy8gICAgICAgdGhldGFaID0gLU1hdGguYXRhbjIodGhpcy5kYXRhWzZdIC8gc2NhbGluZy55LCByMTEpO1xyXG4gICAgLy8gICAgICAgdGhldGFYID0gMDtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgZWxzZSB7XHJcbiAgICAvLyAgICAgdGhldGFZID0gLU1hdGguUEkgLyAyO1xyXG4gICAgLy8gICAgIHRoZXRhWiA9IE1hdGguYXRhbjIoLXRoaXMuZGF0YVs2XSAvIHNjYWxpbmcueSwgcjExKTtcclxuICAgIC8vICAgICB0aGV0YVggPSAwO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHRoaXMuI2V1bGVyQW5nbGVzLnNldCgtdGhldGFYLCB0aGV0YVksIHRoZXRhWik7XHJcbiAgICAvLyAgIHRoaXMuI2V1bGVyQW5nbGVzLnNjYWxlKE1hdGhlbWF0aWMucmFkMmRlZyk7XHJcblxyXG4gICAgLy8gICByZXR1cm4gdGhpcy4jZXVsZXJBbmdsZXM7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGlzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX2FycmF5OiBBcnJheUxpa2U8bnVtYmVyPik6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoX2FycmF5KTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gbWF0cml4IGludG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogTWF0cml4NHg0KTogTWF0cml4NHg0IHtcclxuICAgICAgdGhpcy5kYXRhLnNldChfb3JpZ2luYWwuZGF0YSk7XHJcbiAgICAgIHRoaXMuI3RyYW5zbGF0aW9uRGlydHkgPSBfb3JpZ2luYWwuI3RyYW5zbGF0aW9uRGlydHk7XHJcbiAgICAgIHRoaXMuI3JvdGF0aW9uRGlydHkgPSBfb3JpZ2luYWwuI3JvdGF0aW9uRGlydHk7XHJcbiAgICAgIHRoaXMuI3NjYWxpbmdEaXJ0eSA9IF9vcmlnaW5hbC4jc2NhbGluZ0RpcnR5O1xyXG4gICAgICB0aGlzLiNxdWF0ZXJuaW9uRGlydHkgPSBfb3JpZ2luYWwuI3F1YXRlcm5pb25EaXJ0eTtcclxuICAgICAgaWYgKCF0aGlzLiN0cmFuc2xhdGlvbkRpcnR5KVxyXG4gICAgICAgIHRoaXMuI3RyYW5zbGF0aW9uLmNvcHkoX29yaWdpbmFsLiN0cmFuc2xhdGlvbik7XHJcbiAgICAgIGlmICghdGhpcy4jcm90YXRpb25EaXJ0eSlcclxuICAgICAgICB0aGlzLiNyb3RhdGlvbi5jb3B5KF9vcmlnaW5hbC4jcm90YXRpb24pO1xyXG4gICAgICBpZiAoIXRoaXMuI3NjYWxpbmdEaXJ0eSlcclxuICAgICAgICB0aGlzLiNzY2FsaW5nLmNvcHkoX29yaWdpbmFsLiNzY2FsaW5nKTtcclxuICAgICAgaWYgKCF0aGlzLiNxdWF0ZXJuaW9uRGlydHkpXHJcbiAgICAgICAgdGhpcy4jcXVhdGVybmlvbi5jb3B5KF9vcmlnaW5hbC4jcXVhdGVybmlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgxpIuTWF0cml4NHg0KHRyYW5zbGF0aW9uOiAke3RoaXMudHJhbnNsYXRpb24udG9TdHJpbmcoKX0sIHJvdGF0aW9uOiAke3RoaXMucm90YXRpb24udG9TdHJpbmcoKX0sIHNjYWxpbmc6ICR7dGhpcy5zY2FsaW5nLnRvU3RyaW5nKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIC8vIFRPRE86IG9wdGltaXphdGlvbiwgaXQgc2hvdWxkbid0IGFsd2F5cyByZXR1cm4gYSBjb3B5LCBzaW5jZSB0aGlzIGJsb2F0cyBtZW1vcnlcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB4LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFgoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0sIHRoaXMuZGF0YVsyXSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB5LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFkoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzRdLCB0aGlzLmRhdGFbNV0sIHRoaXMuZGF0YVs2XSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBjYXJkaW5hbCB6LWF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFooKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQodGhpcy5kYXRhWzhdLCB0aGlzLmRhdGFbOV0sIHRoaXMuZGF0YVsxMF0pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3dhcHMgdGhlIHR3byBjYXJkaW5hbCBheGlzIGFuZCByZXZlcnNlcyB0aGUgdGhpcmQsIGVmZmVjdGl2ZWx5IHJvdGF0aW5nIHRoZSB0cmFuc2Zvcm0gMTgwIGRlZ3JlZXMgYXJvdW5kIG9uZSBhbmQgOTAgZGVncmVlcyBhcm91bmQgYSBzZWNvbmQgYXhpc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3dhcFhZKCk6IHZvaWQge1xyXG4gICAgICBsZXQgdGVtcDogbnVtYmVyW10gPSBbdGhpcy5kYXRhWzBdLCB0aGlzLmRhdGFbMV0sIHRoaXMuZGF0YVsyXV07IC8vIHN0b3JlIHgtYXhpc1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KFt0aGlzLmRhdGFbNF0sIHRoaXMuZGF0YVs1XSwgdGhpcy5kYXRhWzZdXSwgMCk7IC8vIG92ZXJ3cml0ZSB4LWF4aXMgd2l0aCB5LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldCh0ZW1wLCA0KTsgLy8gb3ZlcndyaXRlIFkgd2l0aCB0ZW1wXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoWy10aGlzLmRhdGFbOF0sIC10aGlzLmRhdGFbOV0sIC10aGlzLmRhdGFbMTBdXSwgOCk7IC8vIHJldmVyc2Ugei1heGlzXHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTd2FwcyB0aGUgdHdvIGNhcmRpbmFsIGF4aXMgYW5kIHJldmVyc2VzIHRoZSB0aGlyZCwgZWZmZWN0aXZlbHkgcm90YXRpbmcgdGhlIHRyYW5zZm9ybSAxODAgZGVncmVlcyBhcm91bmQgb25lIGFuZCA5MCBkZWdyZWVzIGFyb3VuZCBhIHNlY29uZCBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzd2FwWFooKTogdm9pZCB7XHJcbiAgICAgIGxldCB0ZW1wOiBudW1iZXJbXSA9IFt0aGlzLmRhdGFbMF0sIHRoaXMuZGF0YVsxXSwgdGhpcy5kYXRhWzJdXTsgLy8gc3RvcmUgeC1heGlzXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoW3RoaXMuZGF0YVs4XSwgdGhpcy5kYXRhWzldLCB0aGlzLmRhdGFbMTBdXSwgMCk7IC8vIG92ZXJ3cml0ZSB4LWF4aXMgd2l0aCB6LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldCh0ZW1wLCA4KTsgLy8gb3ZlcndyaXRlIFogd2l0aCB0ZW1wXHJcbiAgICAgIHRoaXMuZGF0YS5zZXQoWy10aGlzLmRhdGFbNF0sIC10aGlzLmRhdGFbNV0sIC10aGlzLmRhdGFbNl1dLCA0KTsgLy8gcmV2ZXJzZSB5LWF4aXNcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN3YXBzIHRoZSB0d28gY2FyZGluYWwgYXhpcyBhbmQgcmV2ZXJzZXMgdGhlIHRoaXJkLCBlZmZlY3RpdmVseSByb3RhdGluZyB0aGUgdHJhbnNmb3JtIDE4MCBkZWdyZWVzIGFyb3VuZCBvbmUgYW5kIDkwIGRlZ3JlZXMgYXJvdW5kIGEgc2Vjb25kIGF4aXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN3YXBZWigpOiB2b2lkIHtcclxuICAgICAgbGV0IHRlbXA6IG51bWJlcltdID0gW3RoaXMuZGF0YVs0XSwgdGhpcy5kYXRhWzVdLCB0aGlzLmRhdGFbNl1dOyAvLyBzdG9yZSB5LWF4aXNcclxuICAgICAgdGhpcy5kYXRhLnNldChbdGhpcy5kYXRhWzhdLCB0aGlzLmRhdGFbOV0sIHRoaXMuZGF0YVsxMF1dLCA0KTsgLy8gb3ZlcndyaXRlIHktYXhpcyB3aXRoIHotYXhpc1xyXG4gICAgICB0aGlzLmRhdGEuc2V0KHRlbXAsIDgpOyAvLyBvdmVyd3JpdGUgWiB3aXRoIHRlbXBcclxuICAgICAgdGhpcy5kYXRhLnNldChbLXRoaXMuZGF0YVswXSwgLXRoaXMuZGF0YVsxXSwgLXRoaXMuZGF0YVsyXV0sIDApOyAvLyByZXZlcnNlIHgtYXhpc1xyXG4gICAgICB0aGlzLnJlc2V0Q2FjaGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRyYW5sYXRpb24gZnJvbSB0aGlzIG1hdHJpeCB0byB0aGUgdGFyZ2V0IG1hdHJpeFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VHJhbnNsYXRpb25UbyhfbXR4VGFyZ2V0OiBNYXRyaXg0eDQpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGRpZmZlcmVuY2U6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIGRpZmZlcmVuY2Uuc2V0KF9tdHhUYXJnZXQuZGF0YVsxMl0gLSB0aGlzLmRhdGFbMTJdLCBfbXR4VGFyZ2V0LmRhdGFbMTNdIC0gdGhpcy5kYXRhWzEzXSwgX210eFRhcmdldC5kYXRhWzE0XSAtIHRoaXMuZGF0YVsxNF0pO1xyXG4gICAgICByZXR1cm4gZGlmZmVyZW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICAvLyB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IHRoaXMudHJhbnNsYXRpb24uc2VyaWFsaXplKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24uc2VyaWFsaXplKCksXHJcbiAgICAgICAgc2NhbGluZzogdGhpcy5zY2FsaW5nLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgdHJhbnNsYXRpb246IGF3YWl0IHRoaXMudHJhbnNsYXRpb24uZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24udHJhbnNsYXRpb24pLFxyXG4gICAgICAgIHJvdGF0aW9uOiBhd2FpdCB0aGlzLnJvdGF0aW9uLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLnJvdGF0aW9uKSxcclxuICAgICAgICBzY2FsaW5nOiBhd2FpdCB0aGlzLnNjYWxpbmcuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uc2NhbGluZylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5tdXRhdGUobXV0YXRvcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBpZiAodGhpcy5tdXRhdG9yKVxyXG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0b3I7XHJcblxyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICB0cmFuc2xhdGlvbjogdGhpcy50cmFuc2xhdGlvbi5nZXRNdXRhdG9yKCksXHJcbiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24uZ2V0TXV0YXRvcigpLFxyXG4gICAgICAgIHNjYWxpbmc6IHRoaXMuc2NhbGluZy5nZXRNdXRhdG9yKClcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGNhY2hlIG11dGF0b3JcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvcjtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBtOiBGbG9hdDMyQXJyYXkgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICBpZiAoX211dGF0b3IudHJhbnNsYXRpb24pIHtcclxuICAgICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjMgPSB0aGlzLnRyYW5zbGF0aW9uO1xyXG4gICAgICAgIHRyYW5zbGF0aW9uLm11dGF0ZShfbXV0YXRvci50cmFuc2xhdGlvbik7XHJcbiAgICAgICAgbVsxMl0gPSB0cmFuc2xhdGlvbi54OyBtWzEzXSA9IHRyYW5zbGF0aW9uLnk7IG1bMTRdID0gdHJhbnNsYXRpb24uejtcclxuICAgICAgICB0aGlzLiN0cmFuc2xhdGlvbkRpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfbXV0YXRvci5yb3RhdGlvbiB8fCBfbXV0YXRvci5zY2FsaW5nKSB7XHJcbiAgICAgICAgLy8gVE9ETzogbWFrZSBmdWxsIHZlY3RvciBhbmQgcXVhdGVybmlvbiBtdXRhdG9ycyBtYW5kYXRvcnk/XHJcblxyXG4gICAgICAgIGxldCByb3RhdGlvbjogVmVjdG9yMyB8IFF1YXRlcm5pb24gPSBfbXV0YXRvci5yb3RhdGlvbj8udyAhPSB1bmRlZmluZWQgP1xyXG4gICAgICAgICAgdGhpcy4jcXVhdGVybmlvbiA6IC8vIHVzaW5nIHRoaXMuI3F1YXRlcm5pb24gYXNzdW1lcyB3ZSBnZXQgYSBmdWxsIHF1YXRlcm5pb24gbXV0YXRvciB3aXRoIHgsIHksIHogYW5kIHcgc2V0IHNvIHdlIG5ldmVyIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHF1YXRlcm5pb24gaGVyZS4gVGhpcyBtaWdodCBjYXVzZSB0cm91YmxlIGlmIHdlIGV2ZXIgd2FudCB0byBtdXRhdGUgb25seSBhIHBhcnQgb2YgYSBxdWF0ZXJuaW9uLi4uXHJcbiAgICAgICAgICBpc0Z1bGxWZWN0b3JNdXRhdG9yKF9tdXRhdG9yLnJvdGF0aW9uKSA/IHRoaXMuI3JvdGF0aW9uIDogdGhpcy5yb3RhdGlvbjsgLy8gaGFjayB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWNhbGN1bGF0aW9uIG9mIHJvdGF0aW9uIGFuZCBzY2FsaW5nLiBUaGlzIHJlY2FsY3VsYXRpb24gaXMgdW5uZWNlc3Nhcnkgd2hlbiB3ZSBnZXQgYSBmdWxsIG11dGF0b3IgaS5lLiB3aXRoIHgsIHkgYW5kIHogc2V0XHJcblxyXG4gICAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gaXNGdWxsVmVjdG9yTXV0YXRvcihfbXV0YXRvci5zY2FsaW5nKSA/IHRoaXMuI3NjYWxpbmcgOiB0aGlzLnNjYWxpbmc7XHJcblxyXG4gICAgICAgIGlmIChfbXV0YXRvci5yb3RhdGlvbilcclxuICAgICAgICAgIHJvdGF0aW9uLm11dGF0ZShfbXV0YXRvci5yb3RhdGlvbik7XHJcblxyXG4gICAgICAgIGlmIChfbXV0YXRvci5zY2FsaW5nKVxyXG4gICAgICAgICAgc2NhbGluZy5tdXRhdGUoX211dGF0b3Iuc2NhbGluZyk7XHJcblxyXG4gICAgICAgIE1hdHJpeDR4NC5zZXRSb3RhdGlvbihtLCByb3RhdGlvbik7XHJcbiAgICAgICAgY29uc3QgaXNFdWxlclJvdGF0aW9uOiBib29sZWFuID0gcm90YXRpb24gaW5zdGFuY2VvZiBWZWN0b3IzO1xyXG4gICAgICAgIHRoaXMuI3JvdGF0aW9uRGlydHkgPSAhaXNFdWxlclJvdGF0aW9uO1xyXG4gICAgICAgIHRoaXMuI3F1YXRlcm5pb25EaXJ0eSA9IGlzRXVsZXJSb3RhdGlvbjtcclxuXHJcbiAgICAgICAgY29uc3Qgc3g6IG51bWJlciA9IHNjYWxpbmcueCwgc3k6IG51bWJlciA9IHNjYWxpbmcueSwgc3o6IG51bWJlciA9IHNjYWxpbmcuejtcclxuICAgICAgICBtWzBdICo9IHN4OyBtWzFdICo9IHN4OyBtWzJdICo9IHN4O1xyXG4gICAgICAgIG1bNF0gKj0gc3k7IG1bNV0gKj0gc3k7IG1bNl0gKj0gc3k7XHJcbiAgICAgICAgbVs4XSAqPSBzejsgbVs5XSAqPSBzejsgbVsxMF0gKj0gc3o7XHJcbiAgICAgICAgdGhpcy4jc2NhbGluZ0RpcnR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcblxyXG4gICAgICBmdW5jdGlvbiBpc0Z1bGxWZWN0b3JNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIF9tdXRhdG9yICYmIF9tdXRhdG9yLnggIT0gdW5kZWZpbmVkICYmIF9tdXRhdG9yLnkgIT0gdW5kZWZpbmVkICYmIF9tdXRhdG9yLnogIT0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGlmIChfbXV0YXRvci50cmFuc2xhdGlvbikgdHlwZXMudHJhbnNsYXRpb24gPSBcIlZlY3RvcjNcIjtcclxuICAgICAgaWYgKF9tdXRhdG9yLnJvdGF0aW9uKSB0eXBlcy5yb3RhdGlvbiA9IFwiVmVjdG9yM1wiO1xyXG4gICAgICBpZiAoX211dGF0b3Iuc2NhbGluZykgdHlwZXMuc2NhbGluZyA9IFwiVmVjdG9yM1wiO1xyXG4gICAgICByZXR1cm4gdHlwZXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldENhY2hlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLiN0cmFuc2xhdGlvbkRpcnR5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy4jcm90YXRpb25EaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMuI3F1YXRlcm5pb25EaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMuI3NjYWxpbmdEaXJ0eSA9IHRydWU7XHJcbiAgICAgIHRoaXMubXV0YXRvciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIE5vaXNlMiwgTm9pc2UzIGFuZCBOb2lzZTRcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICovXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5vaXNlIHtcclxuICAgIHByb3RlY3RlZCBwZXJtOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoNTEyKTtcclxuICAgIHByb3RlY3RlZCBwZXJtTW9kMTI6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSg1MTIpO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb20gdmFsdWUgYmV0d2VlbiAtMSBhbmQgMSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcG9zaXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic3RyYWN0IHNhbXBsZTogKC4uLl9hcmdzOiBudW1iZXJbXSkgPT4gbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIGNvbnN0IHA6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgyNTYpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMjU2OyBpKyspXHJcbiAgICAgICAgcFtpXSA9IGk7XHJcblxyXG4gICAgICBsZXQgbjogbnVtYmVyO1xyXG4gICAgICBsZXQgcTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAyNTU7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgICBuID0gTWF0aC5mbG9vcigoaSArIDEpICogX3JhbmRvbSgpKTtcclxuICAgICAgICBxID0gcFtpXTtcclxuICAgICAgICBwW2ldID0gcFtuXTtcclxuICAgICAgICBwW25dID0gcTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDUxMjsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5wZXJtW2ldID0gcFtpICYgMjU1XTtcclxuICAgICAgICB0aGlzLnBlcm1Nb2QxMltpXSA9IHRoaXMucGVybVtpXSAlIDEyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCIuL05vaXNlLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICogZG9uZSBieSBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqXHJcbiAgICogQmFzZWQgb24gZXhhbXBsZSBjb2RlIGJ5IFN0ZWZhbiBHdXN0YXZzb24gKHN0ZWd1QGl0bi5saXUuc2UpLlxyXG4gICAqIE9wdGltaXNhdGlvbnMgYnkgUGV0ZXIgRWFzdG1hbiAocGVhc3RtYW5AZHJpenpsZS5zdGFuZm9yZC5lZHUpLlxyXG4gICAqIEJldHRlciByYW5rIG9yZGVyaW5nIG1ldGhvZCBieSBTdGVmYW4gR3VzdGF2c29uIGluIDIwMTIuXHJcbiAgICpcclxuICAgKiBUaGlzIGNvZGUgd2FzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSBpdHMgb3JpZ2luYWwgYXV0aG9yLFxyXG4gICAqIFN0ZWZhbiBHdXN0YXZzb24uIFlvdSBtYXkgdXNlIGl0IGFzIHlvdSBzZWUgZml0LCBidXRcclxuICAgKiBhdHRyaWJ1dGlvbiBpcyBhcHByZWNpYXRlZC5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTm9pc2UyIGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAoMy4wIC0gTWF0aC5zcXJ0KDMuMCkpIC8gNi4wO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JhZGllbnQ6IG51bWJlcltdW10gPSBbWzEsIDFdLCBbLTEsIDFdLCBbMSwgLTFdLCBbLTEsIC0xXSwgWzEsIDBdLCBbLTEsIDBdLCBbMSwgMF0sIFstMSwgMF0sIFswLCAxXSwgWzAsIC0xXSwgWzAsIDFdLCBbMCwgLTFdXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIpID0+IHtcclxuICAgICAgICAvLyBTa2V3IHRoZSBpbnB1dCBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggc2ltcGxleCBjZWxsIHdlJ3JlIGluXHJcbiAgICAgICAgY29uc3QgczogbnVtYmVyID0gKF94ICsgX3kpICogMC41ICogKE1hdGguc3FydCgzLjApIC0gMS4wKTsgLy8gSGFpcnkgZmFjdG9yIGZvciAyRFxyXG4gICAgICAgIGNvbnN0IGk6IG51bWJlciA9IE1hdGguZmxvb3IoX3ggKyBzKTtcclxuICAgICAgICBjb25zdCBqOiBudW1iZXIgPSBNYXRoLmZsb29yKF95ICsgcyk7XHJcbiAgICAgICAgY29uc3QgdDogbnVtYmVyID0gKGkgKyBqKSAqIE5vaXNlMi5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgWDA6IG51bWJlciA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSkgc3BhY2VcclxuICAgICAgICBjb25zdCBZMDogbnVtYmVyID0gaiAtIHQ7XHJcbiAgICAgICAgY29uc3QgeDA6IG51bWJlciA9IF94IC0gWDA7IC8vIFRoZSB4LHkgZGlzdGFuY2VzIGZyb20gdGhlIGNlbGwgb3JpZ2luXHJcbiAgICAgICAgY29uc3QgeTA6IG51bWJlciA9IF95IC0gWTA7XHJcblxyXG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBzaW1wbGV4IHdlIGFyZSBpbi5cclxuICAgICAgICBjb25zdCBpMTogbnVtYmVyID0geDAgPiB5MCA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGoxOiBudW1iZXIgPSB4MCA+IHkwID8gMCA6IDE7XHJcblxyXG4gICAgICAgIC8vIE9mZnNldDpudW1iZXJzIGZvciBjb3JuZXJzXHJcbiAgICAgICAgY29uc3QgeDE6IG51bWJlciA9IHgwIC0gaTEgKyBOb2lzZTIub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHkxOiBudW1iZXIgPSB5MCAtIGoxICsgTm9pc2UyLm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MjogbnVtYmVyID0geDAgLSAxLjAgKyAyLjAgKiBOb2lzZTIub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHkyOiBudW1iZXIgPSB5MCAtIDEuMCArIDIuMCAqIE5vaXNlMi5vZmZzZXQ7XHJcblxyXG4gICAgICAgIC8vIFdvcmsgb3V0IHRoZSBoYXNoZWQgZ3JhZGllbnQgaW5kaWNlcyBvZiB0aGUgdGhyZWUgc2ltcGxleCBjb3JuZXJzXHJcbiAgICAgICAgY29uc3QgaWk6IG51bWJlciA9IGkgJiAyNTU7XHJcbiAgICAgICAgY29uc3Qgamo6IG51bWJlciA9IGogJiAyNTU7XHJcbiAgICAgICAgY29uc3QgZzA6IG51bWJlcltdID0gTm9pc2UyLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgdGhpcy5wZXJtW2pqXV1dO1xyXG4gICAgICAgIGNvbnN0IGcxOiBudW1iZXJbXSA9IE5vaXNlMi5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIGkxICsgdGhpcy5wZXJtW2pqICsgajFdXV07XHJcbiAgICAgICAgY29uc3QgZzI6IG51bWJlcltdID0gTm9pc2UyLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgMSArIHRoaXMucGVybVtqaiArIDFdXV07XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgY29udHJpYnV0aW9uIGZyb20gdGhlIHRocmVlIGNvcm5lcnNcclxuICAgICAgICBjb25zdCB0MDogbnVtYmVyID0gMC41IC0geDAgKiB4MCAtIHkwICogeTA7XHJcbiAgICAgICAgY29uc3QgbjA6IG51bWJlciA9IHQwIDwgMCA/IDAuMCA6IE1hdGgucG93KHQwLCA0KSAqIChnMFswXSAqIHgwICsgZzBbMV0gKiB5MCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHQxOiBudW1iZXIgPSAwLjUgLSB4MSAqIHgxIC0geTEgKiB5MTtcclxuICAgICAgICBjb25zdCBuMTogbnVtYmVyID0gdDEgPCAwID8gMC4wIDogTWF0aC5wb3codDEsIDQpICogKGcxWzBdICogeDEgKyBnMVsxXSAqIHkxKTtcclxuXHJcbiAgICAgICAgY29uc3QgdDI6IG51bWJlciA9IDAuNSAtIHgyICogeDIgLSB5MiAqIHkyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDAgPyAwLjAgOiBNYXRoLnBvdyh0MiwgNCkgKiAoZzJbMF0gKiB4MiArIGcyWzFdICogeTIpO1xyXG5cclxuICAgICAgICAvLyBBZGQgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggY29ybmVyIHRvIGdldCB0aGUgZmluYWwgbm9pc2UgdmFsdWUuXHJcbiAgICAgICAgLy8gVGhlIHJlc3VsdCBpcyBzY2FsZWQgdG8gcmV0dXJuIHZhbHVlcyBpbiB0aGUgaW50ZXJ2YWwgWy0xLCAxXVxyXG4gICAgICAgIHJldHVybiA3MC4xNDgwNTc3MDY1Mzk1MiAqIChuMCArIG4xICsgbjIpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzYW1wbGUgPSAoX3g6IG51bWJlciwgX3k6IG51bWJlcik6IG51bWJlciA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzYW1wbGUoX3gsIF95KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogVGhpcyBpcyBhbiBhZGFwdGlvbiBvZiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9mYXN0LXNpbXBsZXgtbm9pc2VcclxuICAgKiBkb25lIGJ5IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICpcclxuICAgKiBCYXNlZCBvbiBleGFtcGxlIGNvZGUgYnkgU3RlZmFuIEd1c3RhdnNvbiAoc3RlZ3VAaXRuLmxpdS5zZSkuXHJcbiAgICogT3B0aW1pc2F0aW9ucyBieSBQZXRlciBFYXN0bWFuIChwZWFzdG1hbkBkcml6emxlLnN0YW5mb3JkLmVkdSkuXHJcbiAgICogQmV0dGVyIHJhbmsgb3JkZXJpbmcgbWV0aG9kIGJ5IFN0ZWZhbiBHdXN0YXZzb24gaW4gMjAxMi5cclxuICAgKlxyXG4gICAqIFRoaXMgY29kZSB3YXMgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IGl0cyBvcmlnaW5hbCBhdXRob3IsXHJcbiAgICogU3RlZmFuIEd1c3RhdnNvbi4gWW91IG1heSB1c2UgaXQgYXMgeW91IHNlZSBmaXQsIGJ1dFxyXG4gICAqIGF0dHJpYnV0aW9uIGlzIGFwcHJlY2lhdGVkLlxyXG4gICAqL1xyXG4gIC8vIFRPRE86IFRlc3RcclxuICBleHBvcnQgY2xhc3MgTm9pc2UzIGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAxLjAgLyA2LjA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBncmFkaWVudDogbnVtYmVyW11bXSA9IFtbMSwgMSwgMF0sIFstMSwgMSwgMF0sIFsxLCAtMSwgMF0sIFstMSwgLTEsIDBdLCBbMSwgMCwgMV0sIFstMSwgMCwgMV0sIFsxLCAwLCAtMV0sIFstMSwgMCwgLTFdLCBbMCwgMSwgMV0sIFswLCAtMSwgLTFdLCBbMCwgMSwgLTFdLCBbMCwgLTEsIC0xXVxyXG4gICAgXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIpID0+IHtcclxuICAgICAgICAvLyBTa2V3IHRoZSBpbnB1dCBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggc2ltcGxleCBjZWxsIHdlJ3JlIGluXHJcbiAgICAgICAgY29uc3QgczogbnVtYmVyID0gKF94ICsgX3kgKyBfeikgLyAzLjA7IC8vIFZlcnkgbmljZSBhbmQgc2ltcGxlIHNrZXcgZmFjdG9yIGZvciAzRFxyXG4gICAgICAgIGNvbnN0IGk6IG51bWJlciA9IE1hdGguZmxvb3IoX3ggKyBzKTtcclxuICAgICAgICBjb25zdCBqOiBudW1iZXIgPSBNYXRoLmZsb29yKF95ICsgcyk7XHJcbiAgICAgICAgY29uc3QgazogbnVtYmVyID0gTWF0aC5mbG9vcihfeiArIHMpO1xyXG4gICAgICAgIGNvbnN0IHQ6IG51bWJlciA9IChpICsgaiArIGspICogTm9pc2UzLm9mZnNldDtcclxuICAgICAgICBjb25zdCBYMDogbnVtYmVyID0gaSAtIHQ7IC8vIFVuc2tldyB0aGUgY2VsbCBvcmlnaW4gYmFjayB0byAoeCx5LHopIHNwYWNlXHJcbiAgICAgICAgY29uc3QgWTA6IG51bWJlciA9IGogLSB0O1xyXG4gICAgICAgIGNvbnN0IFowOiBudW1iZXIgPSBrIC0gdDtcclxuICAgICAgICBjb25zdCB4MDogbnVtYmVyID0gX3ggLSBYMDsgLy8gVGhlIHgseSx6IGRpc3RhbmNlcyBmcm9tIHRoZSBjZWxsIG9yaWdpblxyXG4gICAgICAgIGNvbnN0IHkwOiBudW1iZXIgPSBfeSAtIFkwO1xyXG4gICAgICAgIGNvbnN0IHowOiBudW1iZXIgPSBfeiAtIFowO1xyXG5cclxuICAgICAgICAvLyBEZXRlcmluZSB3aGljaCBzaW1wbGV4IHdlIGFyZSBpblxyXG4gICAgICAgIGxldCBpMTogbnVtYmVyLCBqMTogbnVtYmVyLCBrMTogbnVtYmVyIC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgb2Ygc2ltcGxleCBpbiAoaSxqLGspIGNvb3Jkc1xyXG4gICAgICAgICAgO1xyXG4gICAgICAgIGxldCBpMjogbnVtYmVyLCBqMjogbnVtYmVyLCBrMjogbnVtYmVyIC8vIE9mZnNldHMgZm9yIHRoaXJkIGNvcm5lciBvZiBzaW1wbGV4IGluIChpLGosaykgY29vcmRzXHJcbiAgICAgICAgICA7XHJcbiAgICAgICAgaWYgKHgwID49IHkwKSB7XHJcbiAgICAgICAgICBpZiAoeTAgPj0gejApIHtcclxuICAgICAgICAgICAgaTEgPSBpMiA9IGoyID0gMTtcclxuICAgICAgICAgICAgajEgPSBrMSA9IGsyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoeDAgPj0gejApIHtcclxuICAgICAgICAgICAgaTEgPSBpMiA9IGsyID0gMTtcclxuICAgICAgICAgICAgajEgPSBrMSA9IGoyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGsxID0gaTIgPSBrMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gajEgPSBqMiA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh5MCA8IHowKSB7XHJcbiAgICAgICAgICAgIGsxID0gajIgPSBrMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gajEgPSBpMiA9IDA7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHgwIDwgejApIHtcclxuICAgICAgICAgICAgajEgPSBqMiA9IGsyID0gMTtcclxuICAgICAgICAgICAgaTEgPSBrMSA9IGkyID0gMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGoxID0gaTIgPSBqMiA9IDE7XHJcbiAgICAgICAgICAgIGkxID0gazEgPSBrMiA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB4MTogbnVtYmVyID0geDAgLSBpMSArIE5vaXNlMy5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5MTogbnVtYmVyID0geTAgLSBqMSArIE5vaXNlMy5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejE6IG51bWJlciA9IHowIC0gazEgKyBOb2lzZTMub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHgyOiBudW1iZXIgPSB4MCAtIGkyICsgMi4wICogTm9pc2UzLm9mZnNldDsgLy8gT2Zmc2V0cyBmb3IgdGhpcmQgY29ybmVyIGluICh4LHkseikgY29vcmRzXHJcbiAgICAgICAgY29uc3QgeTI6IG51bWJlciA9IHkwIC0gajIgKyAyLjAgKiBOb2lzZTMub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHoyOiBudW1iZXIgPSB6MCAtIGsyICsgMi4wICogTm9pc2UzLm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MzogbnVtYmVyID0geDAgLSAxLjAgKyAzLjAgKiBOb2lzZTMub2Zmc2V0OyAvLyBPZmZzZXRzIGZvciBsYXN0IGNvcm5lciBpbiAoeCx5LHopIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkzOiBudW1iZXIgPSB5MCAtIDEuMCArIDMuMCAqIE5vaXNlMy5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejM6IG51bWJlciA9IHowIC0gMS4wICsgMy4wICogTm9pc2UzLm9mZnNldDtcclxuXHJcbiAgICAgICAgLy8gV29yayA6bnVtYmVydXQgdGhlIGhhc2hlZCBncmFkaWVudCBpbmRpY2VzIG9mIHRoZSBmb3VyIHNpbXBsZXggY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IGlpOiBudW1iZXIgPSBpICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGpqOiBudW1iZXIgPSBqICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGtrOiBudW1iZXIgPSBrICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGcwOiBudW1iZXJbXSA9IE5vaXNlMy5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIHRoaXMucGVybVtqaiArIHRoaXMucGVybVtra11dXV07XHJcbiAgICAgICAgY29uc3QgZzE6IG51bWJlcltdID0gTm9pc2UzLmdyYWRpZW50W3RoaXMucGVybU1vZDEyW2lpICsgaTEgKyB0aGlzLnBlcm1bamogKyBqMSArIHRoaXMucGVybVtrayArIGsxXV1dXTtcclxuICAgICAgICBjb25zdCBnMjogbnVtYmVyW10gPSBOb2lzZTMuZ3JhZGllbnRbdGhpcy5wZXJtTW9kMTJbaWkgKyBpMiArIHRoaXMucGVybVtqaiArIGoyICsgdGhpcy5wZXJtW2trICsgazJdXV1dO1xyXG4gICAgICAgIGNvbnN0IGczOiBudW1iZXJbXSA9IE5vaXNlMy5ncmFkaWVudFt0aGlzLnBlcm1Nb2QxMltpaSArIDEgKyB0aGlzLnBlcm1bamogKyAxICsgdGhpcy5wZXJtW2trICsgMV1dXV07XHJcblxyXG4gICAgICAgIC8vIENhbGN1Om51bWJlcmF0ZSB0aGUgY29udHJpYnV0aW9uIGZyb20gdGhlIGZvdXIgY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IHQwOiBudW1iZXIgPSAwLjUgLSB4MCAqIHgwIC0geTAgKiB5MCAtIHowICogejA7XHJcbiAgICAgICAgY29uc3QgbjA6IG51bWJlciA9IHQwIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDAsIDQpICogKGcwWzBdICogeDAgKyBnMFsxXSAqIHkwICsgZzBbMl0gKiB6MCk7XHJcbiAgICAgICAgY29uc3QgdDE6IG51bWJlciA9IDAuNSAtIHgxICogeDEgLSB5MSAqIHkxIC0gejEgKiB6MTtcclxuICAgICAgICBjb25zdCBuMTogbnVtYmVyID0gdDEgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MSwgNCkgKiAoZzFbMF0gKiB4MSArIGcxWzFdICogeTEgKyBnMVsyXSAqIHoxKTtcclxuICAgICAgICBjb25zdCB0MjogbnVtYmVyID0gMC41IC0geDIgKiB4MiAtIHkyICogeTIgLSB6MiAqIHoyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDBcclxuICAgICAgICAgID8gMC4wXHJcbiAgICAgICAgICA6IE1hdGgucG93KHQyLCA0KSAqIChnMlswXSAqIHgyICsgZzJbMV0gKiB5MiArIGcyWzJdICogejIpO1xyXG4gICAgICAgIGNvbnN0IHQzOiBudW1iZXIgPSAwLjUgLSB4MyAqIHgzIC0geTMgKiB5MyAtIHozICogejM7XHJcbiAgICAgICAgY29uc3QgbjM6IG51bWJlciA9IHQzIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDMsIDQpICogKGczWzBdICogeDMgKyBnM1sxXSAqIHkzICsgZzNbMl0gKiB6Myk7XHJcblxyXG4gICAgICAgIC8vIEFkZCBjb250cmlidXRpb25zIGZyb20gZWFjaCBjb3JuZXIgdG8gZ2V0IHRoZSBmaW5hbCBub2lzZSB2YWx1ZS5cclxuICAgICAgICAvLyBUaGUgcmVzdWx0IGlzIHNjYWxlZCB0byBzdGF5IGp1c3QgaW5zaWRlIFstMSwxXVxyXG4gICAgICAgIHJldHVybiA5NC42ODQ5MzE1MDY4MTk3MiAqIChuMCArIG4xICsgbjIgKyBuMyk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNhbXBsZSA9IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NhbXBsZShfeCwgX3ksIF96KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLy8gVE9ETzogVGVzdFxyXG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgYW4gYWRhcHRpb24gb2YgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZmFzdC1zaW1wbGV4LW5vaXNlXHJcbiAgICogZG9uZSBieSBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAqXHJcbiAgICogQmFzZWQgb24gZXhhbXBsZSBjb2RlIGJ5IFN0ZWZhbiBHdXN0YXZzb24gKHN0ZWd1QGl0bi5saXUuc2UpLlxyXG4gICAqIE9wdGltaXNhdGlvbnMgYnkgUGV0ZXIgRWFzdG1hbiAocGVhc3RtYW5AZHJpenpsZS5zdGFuZm9yZC5lZHUpLlxyXG4gICAqIEJldHRlciByYW5rIG9yZGVyaW5nIG1ldGhvZCBieSBTdGVmYW4gR3VzdGF2c29uIGluIDIwMTIuXHJcbiAgICpcclxuICAgKiBUaGlzIGNvZGUgd2FzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSBpdHMgb3JpZ2luYWwgYXV0aG9yLFxyXG4gICAqIFN0ZWZhbiBHdXN0YXZzb24uIFlvdSBtYXkgdXNlIGl0IGFzIHlvdSBzZWUgZml0LCBidXRcclxuICAgKiBhdHRyaWJ1dGlvbiBpcyBhcHByZWNpYXRlZC5cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTm9pc2U0IGV4dGVuZHMgTm9pc2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2Zmc2V0OiBudW1iZXIgPSAoNS4wIC0gTWF0aC5zcXJ0KDUuMCkpIC8gMjAuMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGdyYWRpZW50OiBudW1iZXJbXVtdID0gW1swLCAxLCAxLCAxXSwgWzAsIDEsIDEsIC0xXSwgWzAsIDEsIC0xLCAxXSwgWzAsIDEsIC0xLCAtMV0sIFswLCAtMSwgMSwgMV0sIFswLCAtMSwgMSwgLTFdLCBbMCwgLTEsIC0xLCAxXSwgWzAsIC0xLCAtMSwgLTFdLCBbMSwgMCwgMSwgMV0sIFsxLCAwLCAxLCAtMV0sIFsxLCAwLCAtMSwgMV0sIFsxLCAwLCAtMSwgLTFdLCBbLTEsIDAsIDEsIDFdLCBbLTEsIDAsIDEsIC0xXSwgWy0xLCAwLCAtMSwgMV0sIFstMSwgMCwgLTEsIC0xXSwgWzEsIDEsIDAsIDFdLCBbMSwgMSwgMCwgLTFdLCBbMSwgLTEsIDAsIDFdLCBbMSwgLTEsIDAsIC0xXSwgWy0xLCAxLCAwLCAxXSwgWy0xLCAxLCAwLCAtMV0sIFstMSwgLTEsIDAsIDFdLCBbLTEsIC0xLCAwLCAtMV0sIFsxLCAxLCAxLCAwXSwgWzEsIDEsIC0xLCAwXSwgWzEsIC0xLCAxLCAwXSwgWzEsIC0xLCAtMSwgMF0sIFstMSwgMSwgMSwgMF0sIFstMSwgMSwgLTEsIDBdLCBbLTEsIC0xLCAxLCAwXSwgWy0xLCAtMSwgLTEsIDBdXTtcclxuICAgICNzYW1wbGU6IChfeDogbnVtYmVyLCBfeTogbnVtYmVyLCBfejogbnVtYmVyLCBfdzogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmFuZG9tOiBGdW5jdGlvbiA9IE1hdGgucmFuZG9tKSB7XHJcbiAgICAgIHN1cGVyKF9yYW5kb20pO1xyXG5cclxuICAgICAgdGhpcy4jc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gICAgICAgIC8vIFNrZXcgdGhlICh4LHkseix3KSBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggY2VsbCBvZiAyNCBzaW1wbGljZXMgd2UncmUgaW5cclxuICAgICAgICBjb25zdCBzOiBudW1iZXIgPSAoX3ggKyBfeSArIF96ICsgX3cpICogKE1hdGguc3FydCg1LjApIC0gMS4wKSAvIDQuMDsgLy8gRmFjdG9yIGZvciA0RCBza2V3aW5nXHJcbiAgICAgICAgY29uc3QgaTogbnVtYmVyID0gTWF0aC5mbG9vcihfeCArIHMpO1xyXG4gICAgICAgIGNvbnN0IGo6IG51bWJlciA9IE1hdGguZmxvb3IoX3kgKyBzKTtcclxuICAgICAgICBjb25zdCBrOiBudW1iZXIgPSBNYXRoLmZsb29yKF96ICsgcyk7XHJcbiAgICAgICAgY29uc3QgbDogbnVtYmVyID0gTWF0aC5mbG9vcihfdyArIHMpO1xyXG4gICAgICAgIGNvbnN0IHQ6IG51bWJlciA9IChpICsgaiArIGsgKyBsKSAqIE5vaXNlNC5vZmZzZXQ7IC8vIEZhY3RvciBmb3IgNEQgdW5za2V3aW5nXHJcbiAgICAgICAgY29uc3QgWDA6IG51bWJlciA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSx6LHcpIHNwYWNlXHJcbiAgICAgICAgY29uc3QgWTA6IG51bWJlciA9IGogLSB0O1xyXG4gICAgICAgIGNvbnN0IFowOiBudW1iZXIgPSBrIC0gdDtcclxuICAgICAgICBjb25zdCBXMDogbnVtYmVyID0gbCAtIHQ7XHJcbiAgICAgICAgY29uc3QgeDA6IG51bWJlciA9IF94IC0gWDA7IC8vIFRoZSB4LHkseix3IGRpc3RhbmNlcyBmcm9tIHRoZSBjZWxsIG9yaWdpblxyXG4gICAgICAgIGNvbnN0IHkwOiBudW1iZXIgPSBfeSAtIFkwO1xyXG4gICAgICAgIGNvbnN0IHowOiBudW1iZXIgPSBfeiAtIFowO1xyXG4gICAgICAgIGNvbnN0IHcwOiBudW1iZXIgPSBfdyAtIFcwO1xyXG5cclxuICAgICAgICAvLyBUbyBmaW5kIG91dCB3aGljaCBvZiB0aGUgMjQgcG9zc2libGUgc2ltcGxpY2VzIHdlJ3JlIGluLCB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGVcclxuICAgICAgICAvLyBtYWduaXR1ZGUgb3JkZXJpbmcgb2YgeDAsIHkwLCB6MCBhbmQgdzAuIFNpeCBwYWlyLXdpc2UgY29tcGFyaXNvbnMgYXJlIHBlcmZvcm1lZCBiZXR3ZWVuXHJcbiAgICAgICAgLy8gZWFjaCBwb3NzaWJsZSBwYWlyIG9mIHRoZSBmb3VyIGNvb3JkaW5hdGVzLCBhbmQgdGhlIHJlc3VsdHMgYXJlIHVzZWQgdG8gcmFuayB0aGUgbnVtYmVycy5cclxuICAgICAgICBsZXQgcmFua3g6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbGV0IHJhbmt5OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxldCByYW5rejogbnVtYmVyID0gMDtcclxuICAgICAgICBsZXQgcmFua3c6IG51bWJlciA9IDA7XHJcbiAgICAgICAgaWYgKHgwID4geTApIHJhbmt4Kys7XHJcbiAgICAgICAgZWxzZSByYW5reSsrO1xyXG4gICAgICAgIGlmICh4MCA+IHowKSByYW5reCsrO1xyXG4gICAgICAgIGVsc2UgcmFua3orKztcclxuICAgICAgICBpZiAoeDAgPiB3MCkgcmFua3grKztcclxuICAgICAgICBlbHNlIHJhbmt3Kys7XHJcbiAgICAgICAgaWYgKHkwID4gejApIHJhbmt5Kys7XHJcbiAgICAgICAgZWxzZSByYW5reisrO1xyXG4gICAgICAgIGlmICh5MCA+IHcwKSByYW5reSsrO1xyXG4gICAgICAgIGVsc2UgcmFua3crKztcclxuICAgICAgICBpZiAoejAgPiB3MCkgcmFua3orKztcclxuICAgICAgICBlbHNlIHJhbmt3Kys7XHJcblxyXG4gICAgICAgIC8vIHNpbXBsZXhbY10gaXMgYSA0LXZlY3RvciB3aXRoIHRoZSBudW1iZXJzIDAsIDEsIDIgYW5kIDMgaW4gc29tZSBvcmRlci5cclxuICAgICAgICAvLyBNYW55IHZhbHVlcyBvZiBjIHdpbGwgbmV2ZXIgb2NjdXIsIHNpbmNlIGUuZy4geD55Pno+dyBtYWtlcyB4PHosIHk8dyBhbmQgeDx3XHJcbiAgICAgICAgLy8gaW1wb3NzaWJsZS4gT25seSB0aGUgMjQgaW5kaWNlcyB3aGljaCBoYXZlIG5vbi16ZXJvIGVudHJpZXMgbWFrZSBhbnkgc2Vuc2UuXHJcbiAgICAgICAgLy8gV2UgdXNlIGEgdGhyZXNob2xkaW5nIHRvIHNldCB0aGUgY29vcmRpbmF0ZXMgaW4gdHVybiBmcm9tIHRoZSBsYXJnZXN0IG1hZ25pdHVkZS5cclxuICAgICAgICAvLyBSYW5rIDMgZGVub3RlcyB0aGUgbGFyZ2VzdCBjb29yZGluYXRlLlxyXG4gICAgICAgIGNvbnN0IGkxOiBudW1iZXIgPSByYW5reCA+PSAzID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgajE6IG51bWJlciA9IHJhbmt5ID49IDMgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBrMTogbnVtYmVyID0gcmFua3ogPj0gMyA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGwxOiBudW1iZXIgPSByYW5rdyA+PSAzID8gMSA6IDA7XHJcbiAgICAgICAgLy8gUmFuayA6IDIgZGVub3RlcyB0aGUgc2Vjb25kIGxhcmdlc3QgY29vcmRpbmF0ZS5cclxuICAgICAgICBjb25zdCBpMjogbnVtYmVyID0gcmFua3ggPj0gMiA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGoyOiBudW1iZXIgPSByYW5reSA+PSAyID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgazI6IG51bWJlciA9IHJhbmt6ID49IDIgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBsMjogbnVtYmVyID0gcmFua3cgPj0gMiA/IDEgOiAwO1xyXG4gICAgICAgIC8vIFJhbmsgOiAxIGRlbm90ZXMgdGhlIHNlY29uZCBzbWFsbGVzdCBjb29yZGluYXRlLlxyXG4gICAgICAgIGNvbnN0IGkzOiBudW1iZXIgPSByYW5reCA+PSAxID8gMSA6IDA7XHJcbiAgICAgICAgY29uc3QgajM6IG51bWJlciA9IHJhbmt5ID49IDEgPyAxIDogMDtcclxuICAgICAgICBjb25zdCBrMzogbnVtYmVyID0gcmFua3ogPj0gMSA/IDEgOiAwO1xyXG4gICAgICAgIGNvbnN0IGwzOiBudW1iZXIgPSByYW5rdyA+PSAxID8gMSA6IDA7XHJcblxyXG4gICAgICAgIC8vIFRoZSBmaWZ0aCBjb3JuZXIgaGFzIGFsbCBjb29yZGluYXRlIG9mZnNldHMgPSAxLCBzbyBubyBuZWVkIHRvIGNvbXB1dGUgdGhhdC5cclxuICAgICAgICBjb25zdCB4MTogbnVtYmVyID0geDAgLSBpMSArIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkxOiBudW1iZXIgPSB5MCAtIGoxICsgTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB6MTogbnVtYmVyID0gejAgLSBrMSArIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzE6IG51bWJlciA9IHcwIC0gbDEgKyBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHgyOiBudW1iZXIgPSB4MCAtIGkyICsgMi4wICogTm9pc2U0Lm9mZnNldDsgLy8gT2Zmc2V0cyBmb3IgdGhpcmQgY29ybmVyIGluICh4LHkseix3KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5MjogbnVtYmVyID0geTAgLSBqMiArIDIuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgejI6IG51bWJlciA9IHowIC0gazIgKyAyLjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHcyOiBudW1iZXIgPSB3MCAtIGwyICsgMi4wICogTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB4MzogbnVtYmVyID0geDAgLSBpMyArIDMuMCAqIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIGZvdXJ0aCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3Jkc1xyXG4gICAgICAgIGNvbnN0IHkzOiBudW1iZXIgPSB5MCAtIGozICsgMy4wICogTm9pc2U0Lm9mZnNldDtcclxuICAgICAgICBjb25zdCB6MzogbnVtYmVyID0gejAgLSBrMyArIDMuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzM6IG51bWJlciA9IHcwIC0gbDMgKyAzLjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHg0OiBudW1iZXIgPSB4MCAtIDEuMCArIDQuMCAqIE5vaXNlNC5vZmZzZXQ7IC8vIE9mZnNldHMgZm9yIGxhc3QgY29ybmVyIGluICh4LHkseix3KSBjb29yZHNcclxuICAgICAgICBjb25zdCB5NDogbnVtYmVyID0geTAgLSAxLjAgKyA0LjAgKiBOb2lzZTQub2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHo0OiBudW1iZXIgPSB6MCAtIDEuMCArIDQuMCAqIE5vaXNlNC5vZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgdzQ6IG51bWJlciA9IHcwIC0gMS4wICsgNC4wICogTm9pc2U0Lm9mZnNldDtcclxuXHJcbiAgICAgICAgLy8gV29yayBvdXQgdGhlIGhhc2hlZCBncmFkaWVudCBpbmRpY2VzIG9mIHRoZSBmaXZlIHNpbXBsZXggY29ybmVyc1xyXG4gICAgICAgIGNvbnN0IGlpOiBudW1iZXIgPSBpICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGpqOiBudW1iZXIgPSBqICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGtrOiBudW1iZXIgPSBrICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGxsOiBudW1iZXIgPSBsICYgMjU1O1xyXG4gICAgICAgIGNvbnN0IGcwOiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtpaSArIHRoaXMucGVybVtqaiArIHRoaXMucGVybVtrayArIHRoaXMucGVybVtsbF1dXV0gJVxyXG4gICAgICAgICAgMzJcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IGcxOiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtcclxuICAgICAgICAgICAgaWkgKyBpMSArIHRoaXMucGVybVtqaiArIGoxICsgdGhpcy5wZXJtW2trICsgazEgKyB0aGlzLnBlcm1bbGwgKyBsMV1dXVxyXG4gICAgICAgICAgXSAlIDMyXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCBnMjogbnVtYmVyW10gPSBOb2lzZTQuZ3JhZGllbnRbXHJcbiAgICAgICAgICB0aGlzLnBlcm1bXHJcbiAgICAgICAgICAgIGlpICsgaTIgKyB0aGlzLnBlcm1bamogKyBqMiArIHRoaXMucGVybVtrayArIGsyICsgdGhpcy5wZXJtW2xsICsgbDJdXV1cclxuICAgICAgICAgIF0gJSAzMlxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgZzM6IG51bWJlcltdID0gTm9pc2U0LmdyYWRpZW50W1xyXG4gICAgICAgICAgdGhpcy5wZXJtW1xyXG4gICAgICAgICAgICBpaSArIGkzICsgdGhpcy5wZXJtW2pqICsgajMgKyB0aGlzLnBlcm1ba2sgKyBrMyArIHRoaXMucGVybVtsbCArIGwzXV1dXHJcbiAgICAgICAgICBdICUgMzJcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IGc0OiBudW1iZXJbXSA9IE5vaXNlNC5ncmFkaWVudFtcclxuICAgICAgICAgIHRoaXMucGVybVtcclxuICAgICAgICAgICAgaWkgKyAxICsgdGhpcy5wZXJtW2pqICsgMSArIHRoaXMucGVybVtrayArIDEgKyB0aGlzLnBlcm1bbGwgKyAxXV1dXHJcbiAgICAgICAgICBdICUgMzJcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmaXZlIGNvcm5lcnNcclxuICAgICAgICBjb25zdCB0MDogbnVtYmVyID0gMC41IC0geDAgKiB4MCAtIHkwICogeTAgLSB6MCAqIHowIC0gdzAgKiB3MDtcclxuICAgICAgICBjb25zdCBuMDogbnVtYmVyID0gdDAgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MCwgNCkgKiAoZzBbMF0gKiB4MCArIGcwWzFdICogeTAgKyBnMFsyXSAqIHowICsgZzBbM10gKiB3MCk7XHJcbiAgICAgICAgY29uc3QgdDE6IG51bWJlciA9IDAuNSAtIHgxICogeDEgLSB5MSAqIHkxIC0gejEgKiB6MSAtIHcxICogdzE7XHJcbiAgICAgICAgY29uc3QgbjE6IG51bWJlciA9IHQxIDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDEsIDQpICogKGcxWzBdICogeDEgKyBnMVsxXSAqIHkxICsgZzFbMl0gKiB6MSArIGcxWzNdICogdzEpO1xyXG4gICAgICAgIGNvbnN0IHQyOiBudW1iZXIgPSAwLjUgLSB4MiAqIHgyIC0geTIgKiB5MiAtIHoyICogejIgLSB3MiAqIHcyO1xyXG4gICAgICAgIGNvbnN0IG4yOiBudW1iZXIgPSB0MiA8IDBcclxuICAgICAgICAgID8gMC4wXHJcbiAgICAgICAgICA6IE1hdGgucG93KHQyLCA0KSAqIChnMlswXSAqIHgyICsgZzJbMV0gKiB5MiArIGcyWzJdICogejIgKyBnMlszXSAqIHcyKTtcclxuICAgICAgICBjb25zdCB0MzogbnVtYmVyID0gMC41IC0geDMgKiB4MyAtIHkzICogeTMgLSB6MyAqIHozIC0gdzMgKiB3MztcclxuICAgICAgICBjb25zdCBuMzogbnVtYmVyID0gdDMgPCAwXHJcbiAgICAgICAgICA/IDAuMFxyXG4gICAgICAgICAgOiBNYXRoLnBvdyh0MywgNCkgKiAoZzNbMF0gKiB4MyArIGczWzFdICogeTMgKyBnM1syXSAqIHozICsgZzNbM10gKiB3Myk7XHJcbiAgICAgICAgY29uc3QgdDQ6IG51bWJlciA9IDAuNSAtIHg0ICogeDQgLSB5NCAqIHk0IC0gejQgKiB6NCAtIHc0ICogdzQ7XHJcbiAgICAgICAgY29uc3QgbjQ6IG51bWJlciA9IHQ0IDwgMFxyXG4gICAgICAgICAgPyAwLjBcclxuICAgICAgICAgIDogTWF0aC5wb3codDQsIDQpICogKGc0WzBdICogeDQgKyBnNFsxXSAqIHk0ICsgZzRbMl0gKiB6NCArIGc0WzNdICogdzQpO1xyXG5cclxuICAgICAgICAvLyBTdW0gdXAgYW5kIHNjYWxlIHRoZSByZXN1bHQgdG8gY292ZXIgdGhlIHJhbmdlIFstMSwxXVxyXG4gICAgICAgIHJldHVybiA3Mi4zNzg1NTc2NTE1MzY2NSAqIChuMCArIG4xICsgbjIgKyBuMyArIG40KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2FtcGxlID0gKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2FtcGxlKF94LCBfeSwgX3osIF93KTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAqIFN0b3JpbmcgYW5kIG1hbmlwdWxhdGluZyByb3RhdGlvbnMgaW4gdGhlIGZvcm0gb2YgcXVhdGVybmlvbnMuXHJcbiAgICAqIENvbnN0cnVjdGVkIG91dCBvZiB0aGUgNCBjb21wb25lbnRzOiAoeCwgeSwgeiwgdykuIE1hdGhlbWF0aWNhbCBub3RhdGlvbjogdyArIHhpICsgeWogKyB6ay5cclxuICAgICogQSBRdWF0ZXJuaW9uIGNhbiBiZSBkZXNjcmliZWQgd2l0aCBhbiBheGlzIGFuZCBhbmdsZTogKHgsIHksIHopID0gc2luKGFuZ2xlLzIpKmF4aXM7IHcgPSBjb3MoYW5nbGUvMikuXHJcbiAgICAqIHJvbGw6IHgsIHBpdGNoOiB5LCB5YXc6IHouIE5vdGUgdGhhdCBvcGVyYXRpb25zIGFyZSBhZGFwdGVkIHRvIHdvcmsgd2l0aCB2ZWN0b3JzIHdoZXJlIHkgaXMgdXAgYW5kIHogaXMgZm9yd2FyZC5cclxuICAgICogQGF1dGhvcnMgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjMgfCBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFF1YXRlcm5pb24gZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIHg6IG51bWJlcjtcclxuICAgIHB1YmxpYyB5OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgejogbnVtYmVyO1xyXG4gICAgcHVibGljIHc6IG51bWJlcjtcclxuICAgIHByaXZhdGUgbXV0YXRvcjogTXV0YXRvciA9IG51bGw7IC8vIHByZXBhcmVkIGZvciBvcHRpbWl6YXRpb24sIGtlZXAgbXV0YXRvciB0byByZWR1Y2UgcmVkdW5kYW50IGNhbGN1bGF0aW9uIGFuZCBmb3IgY29tcGFyaXNvbi4gU2V0IHRvIG51bGwgd2hlbiBkYXRhIGNoYW5nZXMhXHJcblxyXG4gICAgcmVhZG9ubHkgI2V1bGVyQW5nbGVzOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCk7IC8vIGV1bGVyIGFuZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcXVhdGVybmlvbiBpbiBkZWdyZWVzLlxyXG4gICAgI2V1bGVyQW5nbGVzRGlydHk6IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3o6IG51bWJlciA9IDAsIF93OiBudW1iZXIgPSAxKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMuc2V0KF94LCBfeSwgX3osIF93KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gU1RBVElDU1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBhIG5ldyBpZGVudGl0eSBxdWF0ZXJuaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSURFTlRJVFkoKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBxdWF0ZXJuaW9uIHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gcXVhdGVybmlvbiBzY2FsZWQgdG8gbGVuZ3RoIDEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTk9STUFMSVpBVElPTihfcTogUXVhdGVybmlvbik6IFF1YXRlcm5pb24ge1xyXG4gICAgICByZXR1cm4gX3EuY2xvbmUubm9ybWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcXVhdGVybmlvbiB0aGF0IHJvdGF0ZXMgY29vcmRpbmF0ZXMgd2hlbiBtdWx0aXBsaWVkIGJ5LCB1c2luZyB0aGUgYW5nbGVzIGdpdmVuLlxyXG4gICAgICogUm90YXRpb24gb2NjdXJzIGFyb3VuZCB0aGUgYXhpcyBpbiB0aGUgb3JkZXIgWi1ZLVguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUk9UQVRJT04oX2V1bGVyQW5nbGVzOiBWZWN0b3IzKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogUXVhdGVybmlvbiA9IFJlY3ljbGVyLmdldChRdWF0ZXJuaW9uKTtcclxuICAgICAgcmVzdWx0LmV1bGVyQW5nbGVzID0gX2V1bGVyQW5nbGVzO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHF1YXRlcm5pb24gdGhhdCByb3RhdGVzIGNvb3JkaW5hdGVzIHdoZW4gbXVsdGlwbGllZCBieSwgdXNpbmcgdGhlIGF4aXMgYW5kIGFuZ2xlIGdpdmVuLlxyXG4gICAgICog4pqg77iPIFVOVEVTVEVEIVxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIFJPVEFUSU9OKF9heGlzOiBWZWN0b3IzLCBfYW5nbGU6IG51bWJlcik6IFF1YXRlcm5pb24ge1xyXG4gICAgLy8gICBjb25zdCByZXN1bHQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcblxyXG4gICAgLy8gICAvLyBOb3JtYWxpemUgdGhlIGF4aXNcclxuICAgIC8vICAgY29uc3QgYXhpczogVmVjdG9yMyA9IF9heGlzLmNsb25lO1xyXG4gICAgLy8gICBheGlzLm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgIC8vICAgLy8gQ2FsY3VsYXRlIHRoZSBxdWF0ZXJuaW9uIGNvbXBvbmVudHNcclxuICAgIC8vICAgY29uc3QgaGFsZkFuZ2xlOiBudW1iZXIgPSBfYW5nbGUgLyAyO1xyXG4gICAgLy8gICBjb25zdCBzOiBudW1iZXIgPSBNYXRoLnNpbihoYWxmQW5nbGUpO1xyXG4gICAgLy8gICByZXN1bHQueCA9IGF4aXMueCAqIHM7XHJcbiAgICAvLyAgIHJlc3VsdC55ID0gYXhpcy55ICogcztcclxuICAgIC8vICAgcmVzdWx0LnogPSBheGlzLnogKiBzO1xyXG4gICAgLy8gICByZXN1bHQudyA9IE1hdGguY29zKGhhbGZBbmdsZSk7XHJcblxyXG4gICAgLy8gICBSZWN5Y2xlci5zdG9yZShheGlzKTtcclxuXHJcbiAgICAvLyAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0d28gcGFzc2VkIHF1YXRlcm5pb25zLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBST0RVQ1QoX3FMZWZ0OiBRdWF0ZXJuaW9uLCBfcVJpZ2h0OiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIHJldHVybiBfcUxlZnQuY2xvbmUubXVsdGlwbHkoX3FSaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgaW52ZXJzZSBvZiBhIHBhc3NlZCBxdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIElOVkVSU0UoX3E6IFF1YXRlcm5pb24pOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgcmV0dXJuIF9xLmNsb25lLmludmVydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGNvbmp1Z2F0ZSBvZiBhIHBhc3NlZCBxdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENPTkpVR0FUSU9OKF9xOiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIHJldHVybiBfcS5jbG9uZS5jb25qdWdhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBxdWF0ZXJuaW9ucy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBET1QoX3ExOiBRdWF0ZXJuaW9uLCBfcTI6IFF1YXRlcm5pb24pOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX3ExLnggKiBfcTIueCArIF9xMS55ICogX3EyLnkgKyBfcTEueiAqIF9xMi56ICsgX3ExLncgKiBfcTIudztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdGVybmlvbnMgYmFzZWQgb24gdGhlIGdpdmVuIF9mYWN0b3IuIFdoZW4gX2ZhY3RvciBpcyAwIHRoZSByZXN1bHQgaXMgX2Zyb20sIHdoZW4gX2ZhY3RvciBpcyAxIHRoZSByZXN1bHQgaXMgX3RvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIExFUlAoX2Zyb206IFF1YXRlcm5pb24sIF90bzogUXVhdGVybmlvbiwgX2ZhY3RvcjogbnVtYmVyKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgKF9mcm9tLnggKiAoMSAtIF9mYWN0b3IpICsgX3RvLnggKiBfZmFjdG9yKSxcclxuICAgICAgICAoX2Zyb20ueSAqICgxIC0gX2ZhY3RvcikgKyBfdG8ueSAqIF9mYWN0b3IpLFxyXG4gICAgICAgIChfZnJvbS56ICogKDEgLSBfZmFjdG9yKSArIF90by56ICogX2ZhY3RvciksXHJcbiAgICAgICAgKF9mcm9tLncgKiAoMSAtIF9mYWN0b3IpICsgX3RvLncgKiBfZmFjdG9yKVxyXG4gICAgICApO1xyXG4gICAgICByZXN1bHQubm9ybWFsaXplKCk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdGVybmlvbnMgYmFzZWQgb24gdGhlIGdpdmVuIF9mYWN0b3IuIFdoZW4gX2ZhY3RvciBpcyAwIHRoZSByZXN1bHQgaXMgX2Zyb20sIHdoZW4gX2ZhY3RvciBpcyAxIHRoZSByZXN1bHQgaXMgX3RvLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTTEVSUChfZnJvbTogUXVhdGVybmlvbiwgX3RvOiBRdWF0ZXJuaW9uLCBfZmFjdG9yOiBudW1iZXIpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgLy8gRnJvbTogaHR0cHM6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvc2xlcnAvXHJcbiAgICAgIGxldCBjb3NIYWxmVGhldGE6IG51bWJlciA9IF9mcm9tLncgKiBfdG8udyArIF9mcm9tLnggKiBfdG8ueCArIF9mcm9tLnkgKiBfdG8ueSArIF9mcm9tLnogKiBfdG8uejtcclxuICAgICAgaWYgKE1hdGguYWJzKGNvc0hhbGZUaGV0YSkgPj0gMSlcclxuICAgICAgICByZXR1cm4gX2Zyb207XHJcbiAgICAgIGxldCBoYWxmVGhldGE6IG51bWJlciA9IE1hdGguYWNvcyhjb3NIYWxmVGhldGEpO1xyXG4gICAgICBsZXQgc2luSGFsZlRoZXRhOiBudW1iZXIgPSBNYXRoLnNxcnQoMSAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YSk7XHJcbiAgICAgIGlmIChNYXRoLmFicyhzaW5IYWxmVGhldGEpIDwgMC4wMDEpIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBRdWF0ZXJuaW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICAoX2Zyb20ueCAqIDAuNSArIF90by54ICogMC41KSxcclxuICAgICAgICAgIChfZnJvbS55ICogMC41ICsgX3RvLnkgKiAwLjUpLFxyXG4gICAgICAgICAgKF9mcm9tLnogKiAwLjUgKyBfdG8ueiAqIDAuNSksXHJcbiAgICAgICAgICAoX2Zyb20udyAqIDAuNSArIF90by53ICogMC41KVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgcmF0aW9BOiBudW1iZXIgPSBNYXRoLnNpbigoMSAtIF9mYWN0b3IpICogaGFsZlRoZXRhKSAvIHNpbkhhbGZUaGV0YTtcclxuICAgICAgbGV0IHJhdGlvQjogbnVtYmVyID0gTWF0aC5zaW4oX2ZhY3RvciAqIGhhbGZUaGV0YSkgLyBzaW5IYWxmVGhldGE7XHJcbiAgICAgIGxldCByZXN1bHQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgKF9mcm9tLnggKiByYXRpb0EgKyBfdG8ueCAqIHJhdGlvQiksXHJcbiAgICAgICAgKF9mcm9tLnkgKiByYXRpb0EgKyBfdG8ueSAqIHJhdGlvQiksXHJcbiAgICAgICAgKF9mcm9tLnogKiByYXRpb0EgKyBfdG8ueiAqIHJhdGlvQiksXHJcbiAgICAgICAgKF9mcm9tLncgKiByYXRpb0EgKyBfdG8udyAqIHJhdGlvQilcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNsb25lKCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICBsZXQgcmVzdWx0OiBRdWF0ZXJuaW9uID0gUmVjeWNsZXIucmV1c2UoUXVhdGVybmlvbik7XHJcbiAgICAgIHJlc3VsdC5jb3B5KHRoaXMpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogLSBnZXQ6IHJldHVybiB0aGUgZXVsZXIgYW5nbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJvdGF0aW9uIGluIGRlZ3JlZXMuIFxyXG4gICAgICogKipDYXV0aW9uISoqIFVzZSBpbW1lZGlhdGVseSBhbmQgcmVhZG9ubHksIHNpbmNlIHRoZSB2ZWN0b3IgaXMgZ29pbmcgdG8gYmUgcmV1c2VkIGludGVybmFsbHkuIENyZWF0ZSBhIGNsb25lIHRvIGtlZXAgbG9uZ2VyIGFuZCBtYW5pcHVsYXRlLiBcclxuICAgICAqIC0gc2V0OiBzZXQgdGhlIGV1bGVyIGFuZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByb3RhdGlvbiBpbiBkZWdyZWVzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGV1bGVyQW5nbGVzKCk6IFZlY3RvcjMge1xyXG4gICAgICBpZiAodGhpcy4jZXVsZXJBbmdsZXNEaXJ0eSkge1xyXG4gICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzRGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMueCA9PSAwICYmIHRoaXMueSA9PSAwICYmIHRoaXMueiA9PSAwICYmIHRoaXMudyA9PSAxKSB7XHJcbiAgICAgICAgICB0aGlzLiNldWxlckFuZ2xlcy5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy4jZXVsZXJBbmdsZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByb2xsICh4LWF4aXMgcm90YXRpb24pXHJcbiAgICAgICAgbGV0IHNpbnJjb3NwOiBudW1iZXIgPSAyICogKHRoaXMudyAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueik7XHJcbiAgICAgICAgbGV0IGNvc3Jjb3NwOiBudW1iZXIgPSAxIC0gMiAqICh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xyXG4gICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnggPSBNYXRoLmF0YW4yKHNpbnJjb3NwLCBjb3NyY29zcCk7XHJcblxyXG4gICAgICAgIC8vIHBpdGNoICh5LWF4aXMgcm90YXRpb24pXHJcbiAgICAgICAgbGV0IHNpbnA6IG51bWJlciA9IDIgKiAodGhpcy53ICogdGhpcy55IC0gdGhpcy56ICogdGhpcy54KTtcclxuICAgICAgICBpZiAoTWF0aC5hYnMoc2lucCkgPj0gMSlcclxuICAgICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnkgPSBzaW5wIDwgMCA/IC1NYXRoLmFicyhNYXRoLlBJIC8gMikgOiBNYXRoLmFicyhNYXRoLlBJIC8gMik7IC8vIHVzZSA5MCBkZWdyZWVzIGlmIG91dCBvZiByYW5nZVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuI2V1bGVyQW5nbGVzLnkgPSBNYXRoLmFzaW4oc2lucCk7XHJcblxyXG4gICAgICAgIC8vIHlhdyAoei1heGlzIHJvdGF0aW9uKVxyXG4gICAgICAgIGxldCBzaW55Y29zcDogbnVtYmVyID0gMiAqICh0aGlzLncgKiB0aGlzLnogKyB0aGlzLnggKiB0aGlzLnkpO1xyXG4gICAgICAgIGxldCBjb3N5Y29zcDogbnVtYmVyID0gMSAtIDIgKiAodGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56KTtcclxuICAgICAgICB0aGlzLiNldWxlckFuZ2xlcy56ID0gTWF0aC5hdGFuMihzaW55Y29zcCwgY29zeWNvc3ApO1xyXG5cclxuICAgICAgICB0aGlzLiNldWxlckFuZ2xlcy5zY2FsZShDYWxjLnJhZDJkZWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jZXVsZXJBbmdsZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBldWxlckFuZ2xlcyhfZXVsZXJBbmdsZXM6IFZlY3RvcjMpIHtcclxuICAgICAgY29uc3QgaGFsZkFuZ2xlc0luUmFkaWFuczogVmVjdG9yMyA9IFZlY3RvcjMuU0NBTEUoX2V1bGVyQW5nbGVzLCBDYWxjLmRlZzJyYWQgLyAyKTtcclxuICAgICAgY29uc3QgY29zWDogbnVtYmVyID0gTWF0aC5jb3MoaGFsZkFuZ2xlc0luUmFkaWFucy54KTtcclxuICAgICAgY29uc3QgY29zWTogbnVtYmVyID0gTWF0aC5jb3MoaGFsZkFuZ2xlc0luUmFkaWFucy55KTtcclxuICAgICAgY29uc3QgY29zWjogbnVtYmVyID0gTWF0aC5jb3MoaGFsZkFuZ2xlc0luUmFkaWFucy56KTtcclxuICAgICAgY29uc3Qgc2luWDogbnVtYmVyID0gTWF0aC5zaW4oaGFsZkFuZ2xlc0luUmFkaWFucy54KTtcclxuICAgICAgY29uc3Qgc2luWTogbnVtYmVyID0gTWF0aC5zaW4oaGFsZkFuZ2xlc0luUmFkaWFucy55KTtcclxuICAgICAgY29uc3Qgc2luWjogbnVtYmVyID0gTWF0aC5zaW4oaGFsZkFuZ2xlc0luUmFkaWFucy56KTtcclxuXHJcbiAgICAgIHRoaXMuc2V0KFxyXG4gICAgICAgIHNpblggKiBjb3NZICogY29zWiAtIGNvc1ggKiBzaW5ZICogc2luWixcclxuICAgICAgICBjb3NYICogc2luWSAqIGNvc1ogKyBzaW5YICogY29zWSAqIHNpblosXHJcbiAgICAgICAgY29zWCAqIGNvc1kgKiBzaW5aIC0gc2luWCAqIHNpblkgKiBjb3NaLFxyXG4gICAgICAgIGNvc1ggKiBjb3NZICogY29zWiArIHNpblggKiBzaW5ZICogc2luWlxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy4jZXVsZXJBbmdsZXMuY29weShfZXVsZXJBbmdsZXMpO1xyXG4gICAgICB0aGlzLiNldWxlckFuZ2xlc0RpcnR5ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemVzIHRoaXMgcXVhdGVybmlvbiB0byBhIGxlbmd0aCBvZiAxIChhIHVuaXQgcXVhdGVybmlvbikgbWFraW5nIGl0IGEgdmFsaWQgcm90YXRpb24gcmVwcmVzZW50YXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5vcm1hbGl6ZSgpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgbGV0IGxlbmd0aDogbnVtYmVyID0gTWF0aC5zcXJ0KHRoaXMueCAqKiAyICsgdGhpcy55ICoqIDIgKyB0aGlzLnogKiogMiArIHRoaXMudyAqKiAyKTtcclxuICAgICAgdGhpcy54IC89IGxlbmd0aDtcclxuICAgICAgdGhpcy55IC89IGxlbmd0aDtcclxuICAgICAgdGhpcy56IC89IGxlbmd0aDtcclxuICAgICAgdGhpcy53IC89IGxlbmd0aDtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVnYXRlIHRoaXMgcXVhdGVybmlvbiBhbmQgcmV0dXJucyBpdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCk6IFF1YXRlcm5pb24ge1xyXG4gICAgICB0aGlzLnggKj0gLTE7XHJcbiAgICAgIHRoaXMueSAqPSAtMTtcclxuICAgICAgdGhpcy56ICo9IC0xO1xyXG4gICAgICB0aGlzLncgKj0gLTE7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgcXVhdGVybmlvbiB0byB0aGUgaWRlbnRpdHktcXVhdGVybmlvbiBhbmQgY2xlYXJzIGNhY2hlLiBVc2VkIGJ5IHRoZSByZWN5Y2xlciB0byByZXNldC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0KDAsIDAsIDAsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52ZXJ0IHRoaXMgcXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGludmVydCgpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgLy8gcXVhdGVybmlvbiBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcclxuICAgICAgcmV0dXJuIHRoaXMuY29uanVnYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25qdWdhdGVzIHRoaXMgcXVhdGVybmlvbiBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbmp1Z2F0ZSgpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgdGhpcy54ICo9IC0xO1xyXG4gICAgICB0aGlzLnkgKj0gLTE7XHJcbiAgICAgIHRoaXMueiAqPSAtMTtcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhpcyBxdWF0ZXJuaW9uIHdpdGggdGhlIGdpdmVuIHF1YXRlcm5pb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIG11bHRpcGx5KF9vdGhlcjogUXVhdGVybmlvbiwgX2Zyb21MZWZ0OiBib29sZWFuID0gZmFsc2UpOiBRdWF0ZXJuaW9uIHtcclxuICAgICAgY29uc3QgYTogUXVhdGVybmlvbiA9IF9mcm9tTGVmdCA/IF9vdGhlciA6IHRoaXM7XHJcbiAgICAgIGNvbnN0IGI6IFF1YXRlcm5pb24gPSBfZnJvbUxlZnQgPyB0aGlzIDogX290aGVyO1xyXG4gICAgICAvLyBmcm9tOiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXHJcbiAgICAgIGNvbnN0IGF4OiBudW1iZXIgPSBhLng7XHJcbiAgICAgIGNvbnN0IGF5OiBudW1iZXIgPSBhLnk7XHJcbiAgICAgIGNvbnN0IGF6OiBudW1iZXIgPSBhLno7XHJcbiAgICAgIGNvbnN0IGF3OiBudW1iZXIgPSBhLnc7XHJcbiAgICAgIGNvbnN0IGJ4OiBudW1iZXIgPSBiLng7XHJcbiAgICAgIGNvbnN0IGJ5OiBudW1iZXIgPSBiLnk7XHJcbiAgICAgIGNvbnN0IGJ6OiBudW1iZXIgPSBiLno7XHJcbiAgICAgIGNvbnN0IGJ3OiBudW1iZXIgPSBiLnc7XHJcblxyXG4gICAgICB0aGlzLnNldChcclxuICAgICAgICBheCAqIGJ3ICsgYXkgKiBieiAtIGF6ICogYnkgKyBhdyAqIGJ4LFxyXG4gICAgICAgIC1heCAqIGJ6ICsgYXkgKiBidyArIGF6ICogYnggKyBhdyAqIGJ5LFxyXG4gICAgICAgIGF4ICogYnkgLSBheSAqIGJ4ICsgYXogKiBidyArIGF3ICogYnosXHJcbiAgICAgICAgLWF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBieiArIGF3ICogYndcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3o6IG51bWJlciwgX3c6IG51bWJlcik6IFF1YXRlcm5pb24ge1xyXG4gICAgICB0aGlzLnggPSBfeDsgdGhpcy55ID0gX3k7IHRoaXMueiA9IF96OyB0aGlzLncgPSBfdztcclxuICAgICAgdGhpcy5yZXNldENhY2hlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcXVhdGVybmlvbiBpbnRvIHRoaXMgcXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBRdWF0ZXJuaW9uKTogUXVhdGVybmlvbiB7XHJcbiAgICAgIHRoaXMueCA9IF9vcmlnaW5hbC54OyB0aGlzLnkgPSBfb3JpZ2luYWwueTsgdGhpcy56ID0gX29yaWdpbmFsLno7IHRoaXMudyA9IF9vcmlnaW5hbC53O1xyXG4gICAgICB0aGlzLiNldWxlckFuZ2xlc0RpcnR5ID0gX29yaWdpbmFsLiNldWxlckFuZ2xlc0RpcnR5O1xyXG4gICAgICBpZiAoIXRoaXMuI2V1bGVyQW5nbGVzRGlydHkpXHJcbiAgICAgICAgdGhpcy4jZXVsZXJBbmdsZXMuY29weShfb3JpZ2luYWwuI2V1bGVyQW5nbGVzKTtcclxuICAgICAgdGhpcy5tdXRhdG9yID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHF1YXRlcm5pb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgxpIuUXVhdGVybmlvbih4OiAke3RoaXMueH0sIHk6ICR7dGhpcy55fSwgejogJHt0aGlzLnp9LCB3OiAke3RoaXMud30pYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjdXJyZW50bHkgcXVhdGVybmlvbnMgYXJlIG5ldmVyIHNlcmlhbGl6ZWQsIHNvIHRoaXMgaXMgbm90IG5lZWRlZC4gQnV0IG1heWJlIGl0IHdpbGwgYmUgaW4gdGhlIGZ1dHVyZS5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYFske3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9LCAke3RoaXMud31dYDsgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxRdWF0ZXJuaW9uPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9zZXJpYWxpemF0aW9uKSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgW3RoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMud10gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBpZiAoIXRoaXMubXV0YXRvcilcclxuICAgICAgICB0aGlzLm11dGF0b3IgPSB7IHg6IHRoaXMueCwgeTogdGhpcy55LCB6OiB0aGlzLnosIHc6IHRoaXMudyB9O1xyXG4gICAgICByZXR1cm4gdGhpcy5tdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy54ID0gX211dGF0b3IueCA/PyB0aGlzLng7XHJcbiAgICAgIHRoaXMueSA9IF9tdXRhdG9yLnkgPz8gdGhpcy55O1xyXG4gICAgICB0aGlzLnogPSBfbXV0YXRvci56ID8/IHRoaXMuejtcclxuICAgICAgdGhpcy53ID0gX211dGF0b3IudyA/PyB0aGlzLnc7XHJcbiAgICAgIHRoaXMucmVzZXRDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7LyoqICovIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0Q2FjaGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI2V1bGVyQW5nbGVzRGlydHkgPSB0cnVlO1xyXG4gICAgICB0aGlzLm11dGF0b3IgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENsYXNzIGZvciBjcmVhdGluZyByYW5kb20gdmFsdWVzLCBzdXBwb3J0aW5nIEphdmFzY3JpcHQncyBNYXRoLnJhbmRvbSBhbmQgYSBkZXRlcm1pbmlzdGlnIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoUFJORykgXHJcbiAgICogdGhhdCBjYW4gYmUgZmVkIHdpdGggYSBzZWVkIGFuZCB0aGVuIHJldHVybnMgYSByZXByb2R1Y2FibGUgc2V0IG9mIHJhbmRvbSBudW1iZXJzIChpZiB0aGUgcHJlY2lzaW9uIG9mIEphdmFzY3JpcHQgYWxsb3dzKSBcclxuICAgKiBcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJhbmRvbSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHQ6IFJhbmRvbSA9IG5ldyBSYW5kb20oKTtcclxuICAgIHByaXZhdGUgZ2VuZXJhdGU6IEZ1bmN0aW9uID0gTWF0aC5yYW5kb207XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJhbmRvbX0uIFxyXG4gICAgICogSWYgYSBzZWVkIGlzIGdpdmVuLCBMRklCNCBpcyB1c2VkIGFzIGdlbmVyYXRvciwgcmVwcm9kdWNpbmcgYSBzZXJpZXMgb2YgbnVtYmVycyBmcm9tIHRoYXQgc2VlZC5cclxuICAgICAqIElmIGEgZnVuY3Rpb24gcHJvZHVjaW5nIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUgdXNlZCBhcyBnZW5lcmF0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihfc2VlZE9yRnVuY3Rpb24/OiBudW1iZXIgfCBGdW5jdGlvbikge1xyXG4gICAgICBpZiAoX3NlZWRPckZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pXHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZSA9IF9zZWVkT3JGdW5jdGlvbjtcclxuICAgICAgZWxzZSBpZiAoX3NlZWRPckZ1bmN0aW9uID09IHVuZGVmaW5lZClcclxuICAgICAgICB0aGlzLmdlbmVyYXRlID0gTWF0aC5yYW5kb207XHJcbiAgICAgIGVsc2VcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLmdlbmVyYXRlID0gbmV3IExGSUI0KF9zZWVkT3JGdW5jdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbm9ybWVkIHJhbmRvbSBudW1iZXIsIHRodXMgaW4gdGhlIHJhbmdlIG9mIFswLCAxW1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Tm9ybSgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIG9mIGdpdmVuIFtfbWluLCBfbWF4W1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmFuZ2UoX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX21pbiArIHRoaXMuZ2VuZXJhdGUoKSAqIChfbWF4IC0gX21pbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgbnVtYmVyIGluIHRoZSByYW5nZSBvZiBnaXZlbiBmbG9vcmVkIFtfbWluLCBfbWF4W1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmFuZ2VGbG9vcmVkKF9taW46IG51bWJlciwgX21heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5nZXRSYW5nZShfbWluLCBfbWF4KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgb3IgZmFsc2UgcmFuZG9tbHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJvb2xlYW4oKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKCkgPCAwLjU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIC0xIG9yIDEgcmFuZG9tbHlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNpZ24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbigpID8gMSA6IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIGluZGV4IGludG8gdGhlIGdpdmVuIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRJbmRleDxUPihfYXJyYXk6IEFycmF5PFQ+KTogbnVtYmVyIHtcclxuICAgICAgaWYgKF9hcnJheS5sZW5ndGggPiAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJhbmdlRmxvb3JlZCgwLCBfYXJyYXkubGVuZ3RoKTtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRFbGVtZW50PFQ+KF9hcnJheTogQXJyYXk8VD4pOiBUIHtcclxuICAgICAgaWYgKF9hcnJheS5sZW5ndGggPiAwKVxyXG4gICAgICAgIHJldHVybiBfYXJyYXlbdGhpcy5nZXRJbmRleChfYXJyYXkpXTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgcmFuZG9tbHkgc2VsZWN0ZWQgZWxlbWVudCBmcm9tIHRoZSBnaXZlbiBhcnJheSBhbmQgcmV0dXJucyBpdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3BsaWNlPFQ+KF9hcnJheTogQXJyYXk8VD4pOiBUIHtcclxuICAgICAgcmV0dXJuIF9hcnJheS5zcGxpY2UodGhpcy5nZXRJbmRleChfYXJyYXkpLCAxKVswXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb21seSBzZWxlY3RlZCBrZXkgZnJvbSB0aGUgZ2l2ZW4gTWFwLWluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXk8VCwgVT4oX21hcDogTWFwPFQsIFU+KTogVCB7XHJcbiAgICAgIGxldCBrZXlzOiBHZW5lcmFsID0gQXJyYXkuZnJvbShfbWFwLmtleXMoKSk7XHJcbiAgICAgIHJldHVybiBrZXlzW3RoaXMuZ2V0SW5kZXgoa2V5cyldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbWx5IHNlbGVjdGVkIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eU5hbWU8VD4oX29iamVjdDogVCk6IGtleW9mIFQge1xyXG4gICAgICBsZXQga2V5czogc3RyaW5nW10gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhfb2JqZWN0KTtcclxuICAgICAgcmV0dXJuIDxrZXlvZiBUPmtleXNbdGhpcy5nZXRJbmRleChrZXlzKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tbHkgc2VsZWN0ZWQgc3ltYm9sIGZyb20gdGhlIGdpdmVuIG9iamVjdCwgaWYgc3ltYm9scyBhcmUgdXNlZCBhcyBrZXlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eVN5bWJvbDxUPihfb2JqZWN0OiBUKTogc3ltYm9sIHtcclxuICAgICAgbGV0IGtleXM6IHN5bWJvbFtdID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhfb2JqZWN0KTtcclxuICAgICAgcmV0dXJuIGtleXNbdGhpcy5nZXRJbmRleChrZXlzKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIHRocmVlLWRpbWVuc2lvbmFsIHZlY3RvciBpbiB0aGUgbGltaXRzIG9mIHRoZSBib3ggZGVmaW5lZCBieSB0aGUgdmVjdG9ycyBnaXZlbiBhcyBbX2Nvcm5lcjAsIF9jb3JuZXIxW1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmVjdG9yMyhfY29ybmVyMDogVmVjdG9yMywgX2Nvcm5lcjE6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueCwgX2Nvcm5lcjEueCksIHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueSwgX2Nvcm5lcjEueSksIHRoaXMuZ2V0UmFuZ2UoX2Nvcm5lcjAueiwgX2Nvcm5lcjEueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSB0d28tZGltZW5zaW9uYWwgdmVjdG9yIGluIHRoZSBsaW1pdHMgb2YgdGhlIHJlY3RhbmdsZSBkZWZpbmVkIGJ5IHRoZSB2ZWN0b3JzIGdpdmVuIGFzIFtfY29ybmVyMCwgX2Nvcm5lcjFbXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWZWN0b3IyKF9jb3JuZXIwOiBWZWN0b3IyLCBfY29ybmVyMTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy5nZXRSYW5nZShfY29ybmVyMC54LCBfY29ybmVyMS54KSwgdGhpcy5nZXRSYW5nZShfY29ybmVyMC55LCBfY29ybmVyMS55KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFuZGFyZCB7QGxpbmsgUmFuZG9tfS1pbnN0YW5jZSB1c2luZyBNYXRoLnJhbmRvbSgpLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjb25zdCByYW5kb206IFJhbmRvbSA9IG5ldyBSYW5kb20oKTtcclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyBhbmQgbWFuaXB1bGF0ZXMgYSB0aHJlZWRpbWVuc2lvbmFsIHZlY3RvciBjb21wcmlzZWQgb2YgdGhlIGNvbXBvbmVudHMgeCwgeSBhbmQgelxyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgICAgICt5XHJcbiAgICogICAgICAgICAgICAgfF9fICt4XHJcbiAgICogICAgICAgICAgICAvXHJcbiAgICogICAgICAgICAgK3ogICBcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5LTIwMjIgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVjdG9yMyBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xyXG4gICAgcHVibGljIHk6IG51bWJlcjtcclxuICAgIHB1YmxpYyB6OiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF94OiBudW1iZXIgPSAwLCBfeTogbnVtYmVyID0gMCwgX3o6IG51bWJlciA9IDApIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zZXQoX3gsIF95LCBfeik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFN0YXRpY1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB4LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFgoX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KF9zY2FsZSwgMCwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB5LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFkoX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDAsIF9zY2FsZSwgMCk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIGdpdmVuIGxlbmd0aCBwb2ludGluZyBpbiB6LWRpcmVjdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFooX3NjYWxlOiBudW1iZXIgPSAxKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICB2ZWN0b3Iuc2V0KDAsIDAsIF9zY2FsZSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdmVjdG9yIHdpdGggdGhlIHZhbHVlIDAgb24gZWFjaCBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgWkVSTygpOiBWZWN0b3IzIHtcclxuICAgICAgY29uc3QgdmVjdG9yOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHZlY3Rvci5zZXQoMCwgMCwgMCk7IC8vIHNob3VsZCBiZSBzZXQgdG8gMCBieSByZWN5Y2xlciBhbHJlYWR5P1xyXG4gICAgICByZXR1cm4gdmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciBvZiB0aGUgZ2l2ZW4gc2l6ZSBvbiBlYWNoIG9mIHRoZSB0aHJlZSBheGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgT05FKF9zY2FsZTogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfc2NhbGUsIF9zY2FsZSwgX3NjYWxlKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB2ZWN0b3IgdGhyb3VnaCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGJ5IHRoZSBnaXZlbiBtYXRyaXggb3Igcm90YXRpb24gcXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBUUkFOU0ZPUk1BVElPTihfdmVjdG9yOiBWZWN0b3IzLCBfdHJhbnNmb3JtOiBNYXRyaXg0eDQgfCBRdWF0ZXJuaW9uLCBfaW5jbHVkZVRyYW5zbGF0aW9uOiBib29sZWFuID0gdHJ1ZSk6IFZlY3RvcjMge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuXHJcbiAgICAgIGlmIChfdHJhbnNmb3JtIGluc3RhbmNlb2YgTWF0cml4NHg0KSB7XHJcbiAgICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IF90cmFuc2Zvcm0uZ2V0KCk7XHJcblxyXG4gICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICBtWzBdICogX3ZlY3Rvci54ICsgbVs0XSAqIF92ZWN0b3IueSArIG1bOF0gKiBfdmVjdG9yLnosXHJcbiAgICAgICAgICBtWzFdICogX3ZlY3Rvci54ICsgbVs1XSAqIF92ZWN0b3IueSArIG1bOV0gKiBfdmVjdG9yLnosXHJcbiAgICAgICAgICBtWzJdICogX3ZlY3Rvci54ICsgbVs2XSAqIF92ZWN0b3IueSArIG1bMTBdICogX3ZlY3Rvci56XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKF9pbmNsdWRlVHJhbnNsYXRpb24pXHJcbiAgICAgICAgICByZXN1bHQuYWRkKF90cmFuc2Zvcm0udHJhbnNsYXRpb24pO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBGcm9tOiBodHRwczovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy90cmFuc2Zvcm1zL2luZGV4Lmh0bVxyXG4gICAgICAgIC8vIHJlc3VsdCA9IHEgKiBxdWF0ZXJuaW9uKHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnosIDApICogY29uaihxKVxyXG5cclxuICAgICAgICAvLyBxICogcXVhdGVybmlvbih2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56LCAwKSAuLi5cclxuICAgICAgICBjb25zdCBxeDogbnVtYmVyID0gX3RyYW5zZm9ybS53ICogX3ZlY3Rvci54ICsgX3RyYW5zZm9ybS55ICogX3ZlY3Rvci56IC0gX3RyYW5zZm9ybS56ICogX3ZlY3Rvci55O1xyXG4gICAgICAgIGNvbnN0IHF5OiBudW1iZXIgPSBfdHJhbnNmb3JtLncgKiBfdmVjdG9yLnkgKyBfdHJhbnNmb3JtLnogKiBfdmVjdG9yLnggLSBfdHJhbnNmb3JtLnggKiBfdmVjdG9yLno7XHJcbiAgICAgICAgY29uc3QgcXo6IG51bWJlciA9IF90cmFuc2Zvcm0udyAqIF92ZWN0b3IueiArIF90cmFuc2Zvcm0ueCAqIF92ZWN0b3IueSAtIF90cmFuc2Zvcm0ueSAqIF92ZWN0b3IueDtcclxuICAgICAgICBjb25zdCBxdzogbnVtYmVyID0gLV90cmFuc2Zvcm0ueCAqIF92ZWN0b3IueCAtIF90cmFuc2Zvcm0ueSAqIF92ZWN0b3IueSAtIF90cmFuc2Zvcm0ueiAqIF92ZWN0b3IuejtcclxuXHJcbiAgICAgICAgLy8gLi4uICogY29uaihxKVxyXG4gICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICBxeCAqIF90cmFuc2Zvcm0udyArIHF3ICogLSBfdHJhbnNmb3JtLnggKyBxeSAqIC0gX3RyYW5zZm9ybS56IC0gcXogKiAtIF90cmFuc2Zvcm0ueSxcclxuICAgICAgICAgIHF5ICogX3RyYW5zZm9ybS53ICsgcXcgKiAtIF90cmFuc2Zvcm0ueSArIHF6ICogLSBfdHJhbnNmb3JtLnggLSBxeCAqIC0gX3RyYW5zZm9ybS56LFxyXG4gICAgICAgICAgcXogKiBfdHJhbnNmb3JtLncgKyBxdyAqIC0gX3RyYW5zZm9ybS56ICsgcXggKiAtIF90cmFuc2Zvcm0ueSAtIHF5ICogLSBfdHJhbnNmb3JtLnhcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHZlY3RvciB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgdG8gdGhlIGdpdmVuIGxlbmd0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE5PUk1BTElaQVRJT04oX3ZlY3RvcjogVmVjdG9yMywgX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgbWFnbml0dWRlU3F1YXJlZDogbnVtYmVyID0gX3ZlY3Rvci5tYWduaXR1ZGVTcXVhcmVkO1xyXG4gICAgICBpZiAobWFnbml0dWRlU3F1YXJlZCA9PSAwKVxyXG4gICAgICAgIHRocm93IChuZXcgUmFuZ2VFcnJvcihcIkltcG9zc2libGUgbm9ybWFsaXphdGlvblwiKSk7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBfdmVjdG9yLmNsb25lO1xyXG4gICAgICB2ZWN0b3Iuc2NhbGUoX2xlbmd0aCAvIE1hdGguc3FydChtYWduaXR1ZGVTcXVhcmVkKSk7XHJcbiAgICAgIHJldHVybiB2ZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgdmVjdG9yIGF0dGFpbmVkIGJ5IGFkZGl0aW9uIG9mIGFsbCBnaXZlbiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNVTSguLi5fdmVjdG9yczogVmVjdG9yM1tdKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgZm9yIChsZXQgdmVjdG9yIG9mIF92ZWN0b3JzKVxyXG4gICAgICAgIHJlc3VsdC5zZXQocmVzdWx0LnggKyB2ZWN0b3IueCwgcmVzdWx0LnkgKyB2ZWN0b3IueSwgcmVzdWx0LnogKyB2ZWN0b3Iueik7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHN1YnRyYWN0aW9uIG9mIHR3byB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIERJRkZFUkVOQ0UoX21pbnVlbmQ6IFZlY3RvcjMsIF9zdWJ0cmFoZW5kOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfbWludWVuZC54IC0gX3N1YnRyYWhlbmQueCwgX21pbnVlbmQueSAtIF9zdWJ0cmFoZW5kLnksIF9taW51ZW5kLnogLSBfc3VidHJhaGVuZC56KTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBuZXcgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gdmVjdG9yIHNjYWxlZCBieSB0aGUgZ2l2ZW4gc2NhbGluZyBmYWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTQ0FMRShfdmVjdG9yOiBWZWN0b3IzLCBfc2NhbGluZzogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBzY2FsZWQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgc2NhbGVkLnNldChfdmVjdG9yLnggKiBfc2NhbGluZywgX3ZlY3Rvci55ICogX3NjYWxpbmcsIF92ZWN0b3IueiAqIF9zY2FsaW5nKTtcclxuICAgICAgcmV0dXJuIHNjYWxlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVzIHRoZSBjcm9zc3Byb2R1Y3Qgb2YgMiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENST1NTKF9hOiBWZWN0b3IzLCBfYjogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdmVjdG9yOiBWZWN0b3IzID0gUmVjeWNsZXIucmV1c2UoVmVjdG9yMyk7XHJcbiAgICAgIHZlY3Rvci5zZXQoXHJcbiAgICAgICAgX2EueSAqIF9iLnogLSBfYS56ICogX2IueSxcclxuICAgICAgICBfYS56ICogX2IueCAtIF9hLnggKiBfYi56LFxyXG4gICAgICAgIF9hLnggKiBfYi55IC0gX2EueSAqIF9iLnhcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZXMgdGhlIGRvdHByb2R1Y3Qgb2YgMiB2ZWN0b3JzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIERPVChfYTogVmVjdG9yMywgX2I6IFZlY3RvcjMpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX2EueCAqIF9iLnggKyBfYS55ICogX2IueSArIF9hLnogKiBfYi56OztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHJlZmxlY3Rpb24gb2YgdGhlIGluY29taW5nIHZlY3RvciBhdCB0aGUgZ2l2ZW4gbm9ybWFsIHZlY3Rvci4gVGhlIGxlbmd0aCBvZiBub3JtYWwgc2hvdWxkIGJlIDEuXHJcbiAgICAgKiAgICAgX19fX19fX19fX19fX19fX19fXHJcbiAgICAgKiAgICAgICAgICAgL3xcXFxyXG4gICAgICogaW5jb21pbmcgLyB8IFxcIHJlZmxlY3Rpb25cclxuICAgICAqICAgICAgICAgLyAgfCAgXFwgICBcclxuICAgICAqICAgICAgICAgIG5vcm1hbFxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUkVGTEVDVElPTihfaW5jb21pbmc6IFZlY3RvcjMsIF9ub3JtYWw6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGRvdDogbnVtYmVyID0gLVZlY3RvcjMuRE9UKF9pbmNvbWluZywgX25vcm1hbCk7XHJcbiAgICAgIGxldCByZWZsZWN0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5TVU0oX2luY29taW5nLCBWZWN0b3IzLlNDQUxFKF9ub3JtYWwsIDIgKiBkb3QpKTtcclxuICAgICAgcmV0dXJuIHJlZmxlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXZpZGVzIHRoZSBkaXZpZGVuZCBieSB0aGUgZGl2aXNvciBjb21wb25lbnQgYnkgY29tcG9uZW50IGFuZCByZXR1cm5zIHRoZSByZXN1bHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSQVRJTyhfZGl2aWRlbmQ6IFZlY3RvcjMsIF9kaXZpc29yOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZWN0b3I6IFZlY3RvcjMgPSBSZWN5Y2xlci5yZXVzZShWZWN0b3IzKTtcclxuICAgICAgdmVjdG9yLnNldChfZGl2aWRlbmQueCAvIF9kaXZpc29yLngsIF9kaXZpZGVuZC55IC8gX2Rpdmlzb3IueSwgX2RpdmlkZW5kLnogLyBfZGl2aXNvci56KTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBjYXJ0ZXNpYW4gdmVjdG9yIGZyb20gZ2VvZ3JhcGhpYyBjb29yZGluYXRlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEdFTyhfbG9uZ2l0dWRlOiBudW1iZXIgPSAwLCBfbGF0aXR1ZGU6IG51bWJlciA9IDAsIF9tYWduaXR1ZGU6IG51bWJlciA9IDEpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHZlY3RvcjogVmVjdG9yMyA9IFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpO1xyXG4gICAgICBsZXQgZ2VvOiBHZW8zID0gUmVjeWNsZXIucmV1c2UoR2VvMyk7XHJcbiAgICAgIGdlby5zZXQoX2xvbmdpdHVkZSwgX2xhdGl0dWRlLCBfbWFnbml0dWRlKTtcclxuICAgICAgdmVjdG9yLmdlbyA9IGdlbztcclxuICAgICAgUmVjeWNsZXIuc3RvcmUoZ2VvKTtcclxuICAgICAgcmV0dXJuIHZlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgYW5nbGUgaW4gZGVncmVlcyBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gdmVjdG9yc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEFOR0xFKF9mcm9tOiBWZWN0b3IzLCBfdG86IFZlY3RvcjMpOiBudW1iZXIge1xyXG4gICAgICBsZXQgYW5nbGU6IG51bWJlciA9IE1hdGguYWNvcyhWZWN0b3IzLkRPVChfZnJvbSwgX3RvKSAvIChfZnJvbS5tYWduaXR1ZGUgKiBfdG8ubWFnbml0dWRlKSk7XHJcbiAgICAgIHJldHVybiBhbmdsZSAqIENhbGMucmFkMmRlZztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBBY2Nlc3NvcnNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtYWduaXR1ZGUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGguaHlwb3QodGhpcy54LCB0aGlzLnksIHRoaXMueik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzcXVhcmUgb2YgdGhlIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yIHdpdGhvdXQgY2FsY3VsYXRpbmcgYSBzcXVhcmUgcm9vdC4gRmFzdGVyIGZvciBzaW1wbGUgcHJveGltaXR5IGV2YWx1YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlU3F1YXJlZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gVmVjdG9yMy5ET1QodGhpcywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIGdldDogcmV0dXJucyBhIGdlb2dyYXBoaWMgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2ZWN0b3IgIFxyXG4gICAgICogLSBzZXQ6IGFkanVzdCB0aGUgY2FydGVzaWFuIHZhbHVlcyBvZiB0aGlzIHZlY3RvciB0byByZXByZXNlbnQgdGhlIGdpdmVuIGFzIGdlb2dyYXBoaWMgY29vcmRpbmF0ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBnZW8oX2dlbzogR2VvMykge1xyXG4gICAgICB0aGlzLnNldCgwLCAwLCBfZ2VvLm1hZ25pdHVkZSk7XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtKE1hdHJpeDR4NC5ST1RBVElPTl9YKC1fZ2VvLmxhdGl0dWRlKSk7XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtKE1hdHJpeDR4NC5ST1RBVElPTl9ZKF9nZW8ubG9uZ2l0dWRlKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGdlbygpOiBHZW8zIHtcclxuICAgICAgbGV0IGdlbzogR2VvMyA9IFJlY3ljbGVyLmdldChHZW8zKTtcclxuICAgICAgZ2VvLm1hZ25pdHVkZSA9IHRoaXMubWFnbml0dWRlO1xyXG5cclxuICAgICAgaWYgKGdlby5tYWduaXR1ZGUgPT09IDApXHJcbiAgICAgICAgcmV0dXJuIGdlbztcclxuXHJcbiAgICAgIGdlby5sb25naXR1ZGUgPSAxODAgKiBNYXRoLmF0YW4yKHRoaXMueCAvIGdlby5tYWduaXR1ZGUsIHRoaXMueiAvIGdlby5tYWduaXR1ZGUpIC8gTWF0aC5QSTtcclxuICAgICAgZ2VvLmxhdGl0dWRlID0gMTgwICogTWF0aC5hc2luKHRoaXMueSAvIGdlby5tYWduaXR1ZGUpIC8gTWF0aC5QSTtcclxuICAgICAgcmV0dXJuIGdlbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjbG9uZSBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjbG9uZSgpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIFJlY3ljbGVyLnJldXNlKFZlY3RvcjMpLmNvcHkodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGUgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4gdmVjdG9yIGludG8gdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3B5KF9vcmlnaW5hbDogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXQoX29yaWdpbmFsLngsIF9vcmlnaW5hbC55LCBfb3JpZ2luYWwueik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY3ljbGUoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0KDAsIDAsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb29yZGluYXRlcyBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yIGFyZSB0byBiZSBjb25zaWRlcmVkIGlkZW50aWNhbCB3aXRoaW4gdGhlIGdpdmVuIHRvbGVyYW5jZVxyXG4gICAgICogVE9ETzogZXhhbWluZSwgaWYgdG9sZXJhbmNlIGFzIGNyaXRlcml1bSBmb3IgdGhlIGRpZmZlcmVuY2UgaXMgYXBwcm9wcmlhdGUgd2l0aCB2ZXJ5IGxhcmdlIGNvb3JkaW5hdGUgdmFsdWVzIG9yIGlmIF90b2xlcmFuY2Ugc2hvdWxkIGJlIG11bHRpcGxpZWQgYnkgY29vcmRpbmF0ZSB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXF1YWxzKF9jb21wYXJlOiBWZWN0b3IzLCBfdG9sZXJhbmNlOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTik6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAoTWF0aC5hYnModGhpcy54IC0gX2NvbXBhcmUueCkgPiBfdG9sZXJhbmNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLnkgLSBfY29tcGFyZS55KSA+IF90b2xlcmFuY2UpIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKE1hdGguYWJzKHRoaXMueiAtIF9jb21wYXJlLnopID4gX3RvbGVyYW5jZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9zaXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgaXMgd2l0aGluIGEgY3ViZSB3aXRoIHRoZSBvcHBvc2l0ZSBjb3JuZXJzIDEgYW5kIDJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzSW5zaWRlQ3ViZShfY29ybmVyMTogVmVjdG9yMywgX2Nvcm5lcjI6IFZlY3RvcjMpOiBib29sZWFuIHtcclxuICAgICAgbGV0IGRpYWdvbmFsOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF9jb3JuZXIyLCBfY29ybmVyMSk7XHJcbiAgICAgIGxldCByZWxhdGl2ZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLCBfY29ybmVyMSk7XHJcbiAgICAgIGxldCByYXRpbzogVmVjdG9yMyA9IFZlY3RvcjMuUkFUSU8ocmVsYXRpdmUsIGRpYWdvbmFsKTtcclxuICAgICAgaWYgKHJhdGlvLnggPiAxIHx8IHJhdGlvLnggPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHJhdGlvLnkgPiAxIHx8IHJhdGlvLnkgPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgaWYgKHJhdGlvLnogPiAxIHx8IHJhdGlvLnogPCAwKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBvc2l0aW9uIGRlc2NyaWJlZCBieSB0aGlzIGlzIHdpdGhpbiBhIHNwaGVyZSB3aXRoIHRoZSBnaXZlbiBjZW50ZXIgYW5kIHJhZGl1c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJbnNpZGVTcGhlcmUoX2NlbnRlcjogVmVjdG9yMywgX3JhZGl1czogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBkaWZmZXJlbmNlOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHRoaXMsIF9jZW50ZXIpO1xyXG4gICAgICByZXR1cm4gZGlmZmVyZW5jZS5tYWduaXR1ZGVTcXVhcmVkIDwgKF9yYWRpdXMgKiBfcmFkaXVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfYWRkZW5kOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIHRoaXMueCArPSBfYWRkZW5kLng7XHJcbiAgICAgIHRoaXMueSArPSBfYWRkZW5kLnk7XHJcbiAgICAgIHRoaXMueiArPSBfYWRkZW5kLno7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN1YnRyYWN0KF9zdWJ0cmFoZW5kOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIHRoaXMueCAtPSBfc3VidHJhaGVuZC54O1xyXG4gICAgICB0aGlzLnkgLT0gX3N1YnRyYWhlbmQueTtcclxuICAgICAgdGhpcy56IC09IF9zdWJ0cmFoZW5kLno7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbGVzIHRoaXMgdmVjdG9yIGJ5IHRoZSBnaXZlbiBzY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY2FsZShfc2NhbGFyOiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgdGhpcy54ICo9IF9zY2FsYXI7XHJcbiAgICAgIHRoaXMueSAqPSBfc2NhbGFyO1xyXG4gICAgICB0aGlzLnogKj0gX3NjYWxhcjtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemVzIHRoaXMgdG8gdGhlIGdpdmVuIGxlbmd0aCwgMSBieSBkZWZhdWx0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBub3JtYWxpemUoX2xlbmd0aDogbnVtYmVyID0gMSk6IFZlY3RvcjMge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb3B5KFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLCBfbGVuZ3RoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGVzIHRoaXMgdmVjdG9yIGJ5IGZsaXBwaW5nIHRoZSBzaWducyBvZiBpdHMgY29tcG9uZW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSAtdGhpcy54O1xyXG4gICAgICB0aGlzLnkgPSAtdGhpcy55O1xyXG4gICAgICB0aGlzLnogPSAtdGhpcy56O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYW5kIHJldHVybnMgaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3g6IG51bWJlciA9IDAsIF95OiBudW1iZXIgPSAwLCBfejogbnVtYmVyID0gMCk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSBfeDtcclxuICAgICAgdGhpcy55ID0gX3k7XHJcbiAgICAgIHRoaXMueiA9IF96O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoW3RoaXMueCwgdGhpcy55LCB0aGlzLnpdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhpcyB2ZWN0b3IgYnkgdGhlIGdpdmVuIG1hdHJpeCBvciByb3RhdGlvbiBxdWF0ZXJuaW9uLiBcclxuICAgICAqIEluY2x1ZGluZyBvciBleGx1ZGluZyB0aGUgdHJhbnNsYXRpb24gaWYgYSBtYXRyaXggaXMgcGFzc2VkLlxyXG4gICAgICogSW5jbHVkaW5nIGlzIHRoZSBkZWZhdWx0LCBleGNsdWRpbmcgd2lsbCBvbmx5IHJvdGF0ZSBhbmQgc2NhbGUgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmFuc2Zvcm0oX3RyYW5zZm9ybTogTWF0cml4NHg0IHwgUXVhdGVybmlvbiwgX2luY2x1ZGVUcmFuc2xhdGlvbjogYm9vbGVhbiA9IHRydWUpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHRyYW5zZm9ybWVkOiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTih0aGlzLCBfdHJhbnNmb3JtLCBfaW5jbHVkZVRyYW5zbGF0aW9uKTtcclxuICAgICAgdGhpcy5jb3B5KHRyYW5zZm9ybWVkKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNmb3JtZWQpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyb3BzIHRoZSB6LWNvbXBvbmVudCBhbmQgcmV0dXJucyBhIFZlY3RvcjIgY29uc2lzdGluZyBvZiB0aGUgeC0gYW5kIHktY29tcG9uZW50c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9WZWN0b3IyKCk6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy54LCB0aGlzLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVmbGVjdHMgdGhpcyB2ZWN0b3IgYXQgYSBnaXZlbiBub3JtYWwuIFNlZSB7QGxpbmsgVmVjdG9yMy5SRUZMRUNUSU9OfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVmbGVjdChfbm9ybWFsOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHJlZmxlY3RlZDogVmVjdG9yMyA9IFZlY3RvcjMuUkVGTEVDVElPTih0aGlzLCBfbm9ybWFsKTtcclxuICAgICAgdGhpcy5zZXQocmVmbGVjdGVkLngsIHJlZmxlY3RlZC55LCByZWZsZWN0ZWQueik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlZmxlY3RlZCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2h1ZmZsZXMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNodWZmbGUoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBhOiBudW1iZXJbXSA9IFt0aGlzLngsIHRoaXMueSwgdGhpcy56XTtcclxuICAgICAgdGhpcy5zZXQoUmFuZG9tLmRlZmF1bHQuc3BsaWNlKGEpLCBSYW5kb20uZGVmYXVsdC5zcGxpY2UoYSksIGFbMF0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGJld3R3ZWVuIHRoaXMgdmVjdG9yIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREaXN0YW5jZShfdG86IFZlY3RvcjMpOiBudW1iZXIge1xyXG4gICAgICBsZXQgZGlmZmVyZW5jZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh0aGlzLCBfdG8pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShkaWZmZXJlbmNlKTtcclxuICAgICAgcmV0dXJuIGRpZmZlcmVuY2UubWFnbml0dWRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggZGltZW5zaW9uLCBtb3ZlcyB0aGUgY29tcG9uZW50IHRvIHRoZSBtaW5pbXVtIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1pbihfY29tcGFyZTogVmVjdG9yMyk6IFZlY3RvcjMge1xyXG4gICAgICB0aGlzLnggPSBNYXRoLm1pbih0aGlzLngsIF9jb21wYXJlLngpO1xyXG4gICAgICB0aGlzLnkgPSBNYXRoLm1pbih0aGlzLnksIF9jb21wYXJlLnkpO1xyXG4gICAgICB0aGlzLnogPSBNYXRoLm1pbih0aGlzLnosIF9jb21wYXJlLnopO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciBlYWNoIGRpbWVuc2lvbiwgbW92ZXMgdGhlIGNvbXBvbmVudCB0byB0aGUgbWF4aW11bSBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYXgoX2NvbXBhcmU6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgdGhpcy54ID0gTWF0aC5tYXgodGhpcy54LCBfY29tcGFyZS54KTtcclxuICAgICAgdGhpcy55ID0gTWF0aC5tYXgodGhpcy55LCBfY29tcGFyZS55KTtcclxuICAgICAgdGhpcy56ID0gTWF0aC5tYXgodGhpcy56LCBfY29tcGFyZS56KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZlY3RvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHJlc3VsdDogc3RyaW5nID0gYCgke3RoaXMueC50b1ByZWNpc2lvbig1KX0sICR7dGhpcy55LnRvUHJlY2lzaW9uKDUpfSwgJHt0aGlzLnoudG9QcmVjaXNpb24oNSl9KWA7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VzIHRoZSBzdGFuZGFyZCBhcnJheS5tYXAgZnVuY3Rpb25hbGl0eSB0byBwZXJmb3JtIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiBhbGwgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvclxyXG4gICAgICogYW5kIHJldHVybiBhIG5ldyB2ZWN0b3Igd2l0aCB0aGUgcmVzdWx0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWFwKF9mdW5jdGlvbjogKHZhbHVlOiBudW1iZXIsIGluZGV4OiBudW1iZXIsIGFycmF5OiBBcnJheUxpa2U8bnVtYmVyPikgPT4gbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBjb3B5OiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG4gICAgICBjb3B5LnNldCguLi5bdGhpcy54LCB0aGlzLnksIHRoaXMuel0ubWFwKF9mdW5jdGlvbikpO1xyXG4gICAgICByZXR1cm4gY29weTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24udG9KU09OID0gKCkgPT4geyByZXR1cm4gYHsgXCJyXCI6ICR7dGhpcy5yfSwgXCJnXCI6ICR7dGhpcy5nfSwgXCJiXCI6ICR7dGhpcy5ifSwgXCJhXCI6ICR7dGhpcy5hfX1gOyB9O1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnRvSlNPTiA9ICgpID0+IHsgcmV0dXJuIGBbJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fV1gOyB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFZlY3RvcjM+IHtcclxuICAgICAgaWYgKHR5cGVvZiAoX3NlcmlhbGl6YXRpb24pID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBbdGhpcy54LCB0aGlzLnksIHRoaXMuel0gPSBKU09OLnBhcnNlKDxzdHJpbmc+PHVua25vd24+X3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0aGlzLm11dGF0ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKF9tdXRhdG9yLnggIT09IHVuZGVmaW5lZClcclxuICAgICAgICB0aGlzLnggPSBfbXV0YXRvci54O1xyXG4gICAgICBpZiAoX211dGF0b3IueSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRoaXMueSA9IF9tdXRhdG9yLnk7XHJcbiAgICAgIGlmIChfbXV0YXRvci56ICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhpcy56ID0gX211dGF0b3IuejtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7IHg6IHRoaXMueCwgeTogdGhpcy55LCB6OiB0aGlzLnogfTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQgey8qKiAqLyB9XHJcbiAgICAvLyNlbmRyZWdpb24gVHJhbnNmZXJcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBTdG9yZXMgYW5kIG1hbmlwdWxhdGVzIGEgZm91cmRpbWVuc2lvbmFsIHZlY3RvciBjb21wcmlzZWQgb2YgdGhlIGNvbXBvbmVudHMgeCwgeSwgeiBhbmQgdy5cclxuICAgKiBAYXV0aG9ycyBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVjdG9yNCBleHRlbmRzIE11dGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFJlY3ljYWJsZSB7XHJcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xyXG4gICAgcHVibGljIHk6IG51bWJlcjtcclxuICAgIHB1YmxpYyB6OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgdzogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfeDogbnVtYmVyID0gMCwgX3k6IG51bWJlciA9IDAsIF96OiBudW1iZXIgPSAwLCBfdzogbnVtYmVyID0gMCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLnNldChfeCwgX3ksIF96LCBfdyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFnbml0dWRlIChsZW5ndGgpIG9mIHRoZSB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiBNYXRoLmh5cG90KHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc3F1YXJlZCBtYWduaXR1ZGUgKGxlbmd0aCkgb2YgdGhlIHZlY3Rvci4gRmFzdGVyIGZvciBzaW1wbGUgcHJveGltaXR5IGV2YWx1YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWFnbml0dWRlU3F1YXJlZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5kb3QodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2xvbmUoKTogVmVjdG9yNCB7XHJcbiAgICAgIHJldHVybiBSZWN5Y2xlci5yZXVzZShWZWN0b3I0KS5jb3B5KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBjb21wb25lbnRzIG9mIHRoZSBnaXZlbiB2ZWN0b3IgaW50byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcHkoX29yaWdpbmFsOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNldChfb3JpZ2luYWwueCwgX29yaWdpbmFsLnksIF9vcmlnaW5hbC56LCBfb3JpZ2luYWwudyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0KF94OiBudW1iZXIsIF95OiBudW1iZXIsIF96OiBudW1iZXIsIF93OiBudW1iZXIpOiBWZWN0b3I0IHtcclxuICAgICAgdGhpcy54ID0gX3g7IHRoaXMueSA9IF95OyB0aGlzLnogPSBfejsgdGhpcy53ID0gX3c7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgIHJldHVybiBbdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZChfYWRkZW5kOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCArPSBfYWRkZW5kLng7IHRoaXMueSArPSBfYWRkZW5kLnk7IHRoaXMueiArPSBfYWRkZW5kLno7IHRoaXMudyArPSBfYWRkZW5kLnc7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN1YnRyYWN0KF9zdWJ0cmFoZW5kOiBWZWN0b3I0KTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCAtPSBfc3VidHJhaGVuZC54OyB0aGlzLnkgLT0gX3N1YnRyYWhlbmQueTsgdGhpcy56IC09IF9zdWJ0cmFoZW5kLno7IHRoaXMudyAtPSBfc3VidHJhaGVuZC53O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlcyB0aGlzIHZlY3RvciBieSB0aGUgZ2l2ZW4gc2NhbGFyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2NhbGUoX3NjYWxhcjogbnVtYmVyKTogVmVjdG9yNCB7XHJcbiAgICAgIHRoaXMueCAqPSBfc2NhbGFyOyB0aGlzLnkgKj0gX3NjYWxhcjsgdGhpcy56ICo9IF9zY2FsYXI7IHRoaXMudyAqPSBfc2NhbGFyO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgdGhpcyB2ZWN0b3IgdG8gdGhlIGdpdmVuIGxlbmd0aCwgMSBieSBkZWZhdWx0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbm9ybWFsaXplKF9sZW5ndGg6IG51bWJlciA9IDEpOiBWZWN0b3I0IHtcclxuICAgICAgbGV0IG1hZ25pdHVkZVNxdWFyZWQ6IG51bWJlciA9IHRoaXMubWFnbml0dWRlU3F1YXJlZDtcclxuICAgICAgaWYgKG1hZ25pdHVkZVNxdWFyZWQgPT0gMClcclxuICAgICAgICB0aHJvdyAobmV3IFJhbmdlRXJyb3IoXCJJbXBvc3NpYmxlIG5vcm1hbGl6YXRpb25cIikpO1xyXG4gICAgICB0aGlzLnNjYWxlKF9sZW5ndGggLyBNYXRoLnNxcnQobWFnbml0dWRlU3F1YXJlZCkpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoaXMgaW5zdGFuY2UgYW5kIGFub3RoZXIgdmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZG90KF9vdGhlcjogVmVjdG9yNCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLnggKiBfb3RoZXIueCArIHRoaXMueSAqIF9vdGhlci55ICsgdGhpcy56ICogX290aGVyLnogKyB0aGlzLncgKiBfb3RoZXIudztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjeWNsZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgcmV0dXJuIHsgdG9KU09OOiAoKSA9PiBgWyR7dGhpcy54fSwgJHt0aGlzLnl9LCAke3RoaXMuen0sICR7dGhpcy53fV1gIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxWZWN0b3I0PiB7XHJcbiAgICAgIFt0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLnddID0gSlNPTi5wYXJzZSg8c3RyaW5nPjx1bmtub3duPl9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHsgLyoqICovIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRGVzY3JpYmVzIGEgZmFjZSBvZiBhIHtAbGluayBNZXNofSBieSByZWZlcmVuY2luZyB0aHJlZSB7QGxpbmsgVmVydGljZXN9IHdpdGggdGhlaXIgaW5kaXplc1xyXG4gICAqIGFuZCBjYWxjdWxhdGVzIGZhY2Ugbm9ybWFscy5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBGYWNlIHtcclxuICAgIHB1YmxpYyBpbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgcHVibGljIGFuZ2xlczogbnVtYmVyW10gPSBbXTtcclxuICAgIHB1YmxpYyBub3JtYWxVbnNjYWxlZDogVmVjdG9yMztcclxuICAgIHB1YmxpYyBub3JtYWw6IFZlY3RvcjM7XHJcbiAgICBwcml2YXRlIHZlcnRpY2VzOiBWZXJ0aWNlcztcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3ZlcnRpY2VzOiBWZXJ0aWNlcywgX2luZGV4MDogbnVtYmVyLCBfaW5kZXgxOiBudW1iZXIsIF9pbmRleDI6IG51bWJlcikge1xyXG4gICAgICB0aGlzLmluZGljZXMgPSBbX2luZGV4MCwgX2luZGV4MSwgX2luZGV4Ml07XHJcbiAgICAgIHRoaXMudmVydGljZXMgPSBfdmVydGljZXM7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlTm9ybWFscygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIHZlcnRleCByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBpbmRleFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UG9zaXRpb24oX2luZGV4OiBudW1iZXIpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmVydGljZXMucG9zaXRpb24odGhpcy5pbmRpY2VzW19pbmRleF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogbXVzdCBiZSBjb3BsYW5hclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJbnNpZGUoX3BvaW50OiBWZWN0b3IzKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBkaWZmczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGluZGV4IG9mIHRoaXMuaW5kaWNlcykge1xyXG4gICAgICAgIGxldCBkaWZmOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHRoaXMudmVydGljZXMucG9zaXRpb24oaW5kZXgpLCBfcG9pbnQpO1xyXG4gICAgICAgIGRpZmZzLnB1c2goZGlmZik7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG4wOiBWZWN0b3IzID0gVmVjdG9yMy5DUk9TUyhkaWZmc1sxXSwgZGlmZnNbMF0pO1xyXG4gICAgICBsZXQgbjE6IFZlY3RvcjMgPSBWZWN0b3IzLkNST1NTKGRpZmZzWzJdLCBkaWZmc1sxXSk7XHJcbiAgICAgIGxldCBuMjogVmVjdG9yMyA9IFZlY3RvcjMuQ1JPU1MoZGlmZnNbMF0sIGRpZmZzWzJdKTtcclxuXHJcbiAgICAgIGxldCBkb3QxOiBudW1iZXIgPSBWZWN0b3IzLkRPVChuMCwgbjEpO1xyXG4gICAgICBsZXQgZG90MjogbnVtYmVyID0gVmVjdG9yMy5ET1QobjAsIG4yKTtcclxuXHJcbiAgICAgIHJldHVybiAhKGRvdDEgPCAwIHx8IGRvdDIgPCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZU5vcm1hbHMoKTogdm9pZCB7XHJcbiAgICAgIGxldCB0cmlnb246IFZlY3RvcjNbXSA9IHRoaXMuaW5kaWNlcy5tYXAoKF9pbmRleDogbnVtYmVyKSA9PiB0aGlzLnZlcnRpY2VzLnBvc2l0aW9uKF9pbmRleCkpO1xyXG4gICAgICBsZXQgdjE6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzFdLCB0cmlnb25bMF0pO1xyXG4gICAgICBsZXQgdjI6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzJdLCB0cmlnb25bMF0pO1xyXG4gICAgICB0aGlzLm5vcm1hbFVuc2NhbGVkID0gVmVjdG9yMy5DUk9TUyh2MSwgdjIpO1xyXG4gICAgICB0aGlzLm5vcm1hbCA9IFZlY3RvcjMuTk9STUFMSVpBVElPTih0aGlzLm5vcm1hbFVuc2NhbGVkKTtcclxuICAgICAgdGhpcy5hbmdsZXMucHVzaChcclxuICAgICAgICBWZWN0b3IzLkFOR0xFKHYxLCB2MiksXHJcbiAgICAgICAgVmVjdG9yMy5BTkdMRShWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzJdLCB0cmlnb25bMV0pLCBWZWN0b3IzLkRJRkZFUkVOQ0UodHJpZ29uWzBdLCB0cmlnb25bMV0pKSxcclxuICAgICAgICBWZWN0b3IzLkFOR0xFKFZlY3RvcjMuRElGRkVSRU5DRSh0cmlnb25bMF0sIHRyaWdvblsyXSksIFZlY3RvcjMuRElGRkVSRU5DRSh0cmlnb25bMV0sIHRyaWdvblsyXSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG1lc2hlcy4gXHJcbiAgICogTWVzaGVzIHByb3ZpZGUgaW5kZXhlZCB2ZXJ0aWNlcywgdGhlIG9yZGVyIG9mIGluZGljZXMgdG8gY3JlYXRlIHRyaWdvbnMgYW5kIG5vcm1hbHMsIGFuZCB0ZXh0dXJlIGNvb3JkaW5hdGVzXHJcbiAgICogXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTkvMjJcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JNZXNoLmRlY29yYXRlXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lc2ggZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlUmVzb3VyY2Uge1xyXG4gICAgLyoqIHJlZmVycyBiYWNrIHRvIHRoaXMgY2xhc3MgZnJvbSBhbnkgc3ViY2xhc3MgZS5nLiBpbiBvcmRlciB0byBmaW5kIGNvbXBhdGlibGUgb3RoZXIgcmVzb3VyY2VzKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYmFzZUNsYXNzOiB0eXBlb2YgTWVzaCA9IE1lc2g7XHJcbiAgICAvKiogbGlzdCBvZiBhbGwgdGhlIHN1YmNsYXNzZXMgZGVyaXZlZCBmcm9tIHRoaXMgY2xhc3MsIGlmIHRoZXkgcmVnaXN0ZXJlZCBwcm9wZXJseSovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN1YmNsYXNzZXM6IHR5cGVvZiBNZXNoW10gPSBbXTtcclxuXHJcbiAgICAvLyBUT0RPOiByZW5hbWUgdmVydGljZXMgdG8gdmVydGljZXNTbW9vdGggb3IganVzdCBjbG91ZCwgYW5kIGNsb3VkIHRvIHZlcnRpY2VzXHJcblxyXG4gICAgcHVibGljIGlkUmVzb3VyY2U6IHN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIk1lc2hcIjtcclxuICAgIC8vIGJhc2Ugc3RydWN0dXJlIGZvciBtZXNoZXMgaW4gRlVER0VcclxuICAgIHB1YmxpYyB2ZXJ0aWNlczogVmVydGljZXMgPSBuZXcgVmVydGljZXMoKTtcclxuICAgIHB1YmxpYyBmYWNlczogRmFjZVtdID0gW107XHJcblxyXG4gICAgLy8gcHVibGljIHJlbmRlckJ1ZmZlcnM6IFJlbmRlckJ1ZmZlcnM7IC8qIGRlZmluZWQgYnkgUmVuZGVySW5qZWN0b3IqL1xyXG5cclxuICAgIC8qKiBib3VuZGluZyBib3ggQUFCQiAqL1xyXG4gICAgcHJvdGVjdGVkIMaSYm94OiBCb3g7XHJcbiAgICAvLyBUT0RPOiBleHBsb3JlIG1hdGhlbWF0aWNzIGZvciBlYXN5IHRyYW5zZm9ybWF0aW9ucyBvZiByYWRpdXMgXHJcbiAgICAvKiogYm91bmRpbmcgcmFkaXVzICovXHJcbiAgICBwcm90ZWN0ZWQgxpJyYWRpdXM6IG51bWJlcjtcclxuXHJcbiAgICAjcmVuZGVyTWVzaDogUmVuZGVyTWVzaDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFwiKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgIFByb2plY3QucmVnaXN0ZXIodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWdpc3RlclN1YmNsYXNzKF9zdWJDbGFzczogdHlwZW9mIE1lc2gpOiBudW1iZXIgeyByZXR1cm4gTWVzaC5zdWJjbGFzc2VzLnB1c2goX3N1YkNsYXNzKSAtIDE7IH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHJlbmRlck1lc2goKTogUmVuZGVyTWVzaCB7XHJcbiAgICAgIGlmICh0aGlzLiNyZW5kZXJNZXNoID09IG51bGwpXHJcbiAgICAgICAgdGhpcy4jcmVuZGVyTWVzaCA9IG5ldyBSZW5kZXJNZXNoKHRoaXMpO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI3JlbmRlck1lc2g7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBib3VuZGluZ0JveCgpOiBCb3gge1xyXG4gICAgICBpZiAodGhpcy7GkmJveCA9PSBudWxsKVxyXG4gICAgICAgIHRoaXMuxpJib3ggPSB0aGlzLmNyZWF0ZUJvdW5kaW5nQm94KCk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy7GkmJveDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgcmFkaXVzKCk6IG51bWJlciB7XHJcbiAgICAgIGlmICh0aGlzLsaScmFkaXVzID09IG51bGwpXHJcbiAgICAgICAgdGhpcy7GknJhZGl1cyA9IHRoaXMuY3JlYXRlUmFkaXVzKCk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy7GknJhZGl1cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3Rvck1lc2h9LlxyXG4gICAgICogVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXNlUmVuZGVyQnVmZmVycyhfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9tdHhNZXNoVG9Xb3JsZDogTWF0cml4NHg0LCBfbXR4TWVzaFRvVmlldzogTWF0cml4NHg0LCBfaWQ/OiBudW1iZXIpOiBSZW5kZXJCdWZmZXJzIHsgcmV0dXJuIG51bGw7IC8qIGluamVjdGVkIGJ5IFJlbmRlckluamVjdG9yKi8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JNZXNofS5cclxuICAgICAqIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlbmRlckJ1ZmZlcnMoKTogUmVuZGVyQnVmZmVycyB7IHJldHVybiBudWxsOyAvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yTWVzaH0uXHJcbiAgICAgKiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVSZW5kZXJCdWZmZXJzKF9yZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgUmVuZGVySW5qZWN0b3IqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGJvdW5kcyBvZiB0aGlzIG1lc2ggYXN3ZWxsIGFzIHRoZSBidWZmZXJzIG9mIHRoZSBhc3NvY2lhdGVkIHtAbGluayBSZW5kZXJNZXNofS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLsaSYm94ID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLsaScmFkaXVzID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgdGhpcy5kZWxldGVSZW5kZXJCdWZmZXJzKHRoaXMucmVuZGVyTWVzaC5idWZmZXJzKTtcclxuICAgICAgdGhpcy5yZW5kZXJNZXNoLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICAvLyBTZXJpYWxpemUvRGVzZXJpYWxpemUgZm9yIGFsbCBtZXNoZXMgdGhhdCBjYWxjdWxhdGUgd2l0aG91dCBwYXJhbWV0ZXJzXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBpZFJlc291cmNlOiB0aGlzLmlkUmVzb3VyY2UsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSAvLyBzdG9yZSBmb3IgZWRpdG9yIHZpZXdcclxuICAgICAgfTsgLy8gbm8gZGF0YSBuZWVkZWQgLi4uXHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgLy8gdHlwZSBpcyBhbiBhY2Nlc3NvciBhbmQgbXVzdCBub3QgYmUgZGVzZXJpYWxpemVkXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIC8vIFRPRE86IHNvIG11Y2ggdG8gZGVsZXRlLi4uIHJhdGhlciBqdXN0IGdhdGhlciB3aGF0IHRvIG11dGF0ZVxyXG4gICAgICBkZWxldGUgX211dGF0b3IuxpJib3g7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci7GknJhZGl1cztcclxuXHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5yZW5kZXJCdWZmZXJzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVSYWRpdXMoKTogbnVtYmVyIHtcclxuICAgICAgLy9UT0RPOiByYWRpdXMgYW5kIGJvdW5kaW5nIGJveCBjb3VsZCBiZSBjcmVhdGVkIG9uIGNvbnN0cnVjdGlvbiBvZiB2ZXJ0ZXgtYXJyYXlcclxuICAgICAgbGV0IHJhZGl1czogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICByYWRpdXMgPSBNYXRoLm1heChyYWRpdXMsIHRoaXMudmVydGljZXMucG9zaXRpb24oaSkubWFnbml0dWRlU3F1YXJlZCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE1hdGguc3FydChyYWRpdXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVCb3VuZGluZ0JveCgpOiBCb3gge1xyXG4gICAgICBsZXQgYm94OiBCb3ggPSBSZWN5Y2xlci5nZXQoQm94KTtcclxuICAgICAgYm94LnNldCgpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBwb2ludDogVmVjdG9yMyA9IHRoaXMudmVydGljZXMucG9zaXRpb24oaSk7XHJcbiAgICAgICAgYm94LmV4cGFuZChwb2ludCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGJveDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIHNpbXBsZSBjdWJlIHdpdGggZWRnZXMgb2YgbGVuZ3RoIDEsIGVhY2ggZmFjZSBjb25zaXN0aW5nIG9mIHR3byB0cmlnb25zXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICgxMikgNF9fX183ICAoMTEpXHJcbiAgICogICAgICAgKDgpIDAvX18zL3wgKDEwKVxyXG4gICAqICAgICAgICgxNSkgfHw1X3x8NiAoMTQpXHJcbiAgICogICAgICAgKDkpIDF8L18yfC8gKDEzKVxyXG4gICAqIGBgYFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hDdWJlIGV4dGVuZHMgTWVzaCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hDdWJlKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaEN1YmVcIikge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcblxyXG4gICAgICAvLyBubyBzaGFyZWQgdmVydGljZXMsIGNvcm5lcnMgbmVlZCB0aHJlZSBub3JtYWxzIGZvciBQaG9uZyBhbmQgR291cmF1ZFxyXG4gICAgICB0aGlzLnZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKFxyXG4gICAgICAgIC8vIGZyb250IHZlcnRpY2VzXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygtMC41LCAwLjUsIDAuNSksIG5ldyBWZWN0b3IyKDAsIDApKSwgLy8gMFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoLTAuNSwgLTAuNSwgMC41KSwgbmV3IFZlY3RvcjIoMCwgMSkpLCAvLyAxXHJcbiAgICAgICAgbmV3IFZlcnRleChuZXcgVmVjdG9yMygwLjUsIC0wLjUsIDAuNSksIG5ldyBWZWN0b3IyKDEsIDEpKSwgLy8gMlxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC41LCAwLjUsIDAuNSksIG5ldyBWZWN0b3IyKDEsIDApKSAvLzNcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIGdlbmVyYXRlIHZlcnRpY2VzIG9uIHNpZGVzXHJcbiAgICAgIGZvciAobGV0IGFuZ2xlOiBudW1iZXIgPSA5MDsgYW5nbGUgPCAzNjA7IGFuZ2xlICs9IDkwKSB7XHJcbiAgICAgICAgbGV0IHRyYW5zZm9ybTogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OKFZlY3RvcjMuWShhbmdsZSkpO1xyXG4gICAgICAgIGxldCBzaWRlOiBWZXJ0ZXhbXSA9IHRoaXMudmVydGljZXMuc2xpY2UoMCwgNCkubWFwKChfdjogVmVydGV4KSA9PlxyXG4gICAgICAgICAgbmV3IFZlcnRleChWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF92LnBvc2l0aW9uLCB0cmFuc2Zvcm0pLCBfdi51dikpO1xyXG4gICAgICAgIHRoaXMudmVydGljZXMucHVzaCguLi5zaWRlKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBmb3IgdG9wIGFuZCBib3R0b21cclxuICAgICAgZm9yIChsZXQgYW5nbGU6IG51bWJlciA9IDkwOyBhbmdsZSA8IDM2MDsgYW5nbGUgKz0gMTgwKSB7XHJcbiAgICAgICAgbGV0IHRyYW5zZm9ybTogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OKFZlY3RvcjMuWChhbmdsZSkpO1xyXG4gICAgICAgIGxldCBzaWRlOiBWZXJ0ZXhbXSA9IHRoaXMudmVydGljZXMuc2xpY2UoMCwgNCkubWFwKChfdjogVmVydGV4KSA9PlxyXG4gICAgICAgICAgbmV3IFZlcnRleChWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF92LnBvc2l0aW9uLCB0cmFuc2Zvcm0pLCBfdi51dikpO1xyXG4gICAgICAgIHRoaXMudmVydGljZXMucHVzaCguLi5zaWRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5mYWNlcyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMjQ7IGkgKz0gNClcclxuICAgICAgICAvLyBnZW5lcmF0ZSBmYWNlc1xyXG4gICAgICAgIHRoaXMuZmFjZXMucHVzaCguLi5uZXcgUXVhZCh0aGlzLnZlcnRpY2VzLCBpICsgMCwgaSArIDEsIGkgKyAyLCBpICsgMykuZmFjZXMpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgZmxhdCBwb2x5Z29uLiBBbGwgdHJpZ29ucyBzaGFyZSB2ZXJ0ZXggMCwgc28gY2FyZWZ1bCBkZXNpZ24gaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGNvbmNhdmUgcG9seWdvbnMuIFxyXG4gICAqIFZlcnRleCAwIGlzIGFsc28gYXNzb2NpYXRlZCB3aXRoIHRoZSBmYWNlIG5vcm1hbC5cclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgICAgICAgMCBcclxuICAgKiAgICAgICAgICAgMeKVsXzilbIgIDQgLi4uXHJcbiAgICogICAgICAgICAgICDilbJ8X+KVsuKVsSBcclxuICAgKiAgICAgICAgICAgIDIgICAzXHJcbiAgICogYGBgXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEtMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUG9seWdvbiBleHRlbmRzIE1lc2gge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoUG9seWdvbik7XHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHNoYXBlRGVmYXVsdDogVmVjdG9yMltdID0gWyAvLyB0cmlnb24gaXMgdGhlIG1pbmltYWwgc2hhcGVcclxuICAgICAgbmV3IFZlY3RvcjIoLTEsIC0xKSxcclxuICAgICAgbmV3IFZlY3RvcjIoMSwgLTEpLFxyXG4gICAgICBuZXcgVmVjdG9yMigwLCAxKVxyXG4gICAgXTtcclxuICAgIHByb3RlY3RlZCBzaGFwZTogTXV0YWJsZUFycmF5PFZlY3RvcjI+ID0gbmV3IE11dGFibGVBcnJheTxWZWN0b3IyPihWZWN0b3IyKTtcclxuICAgIHByb3RlY3RlZCBmaXRUZXh0dXJlOiBib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoUG9seWdvblwiLCBfc2hhcGU6IFZlY3RvcjJbXSA9IE1lc2hQb2x5Z29uLnNoYXBlRGVmYXVsdCwgX2ZpdFRleHR1cmU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lKTtcclxuICAgICAgdGhpcy5jcmVhdGUoX3NoYXBlLCBfZml0VGV4dHVyZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldCBtaW5WZXJ0aWNlcygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gMztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSB0aGlzIG1lc2ggZnJvbSB0aGUgZ2l2ZW4gdmVydGljZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGUoX3NoYXBlOiBWZWN0b3IyW10gPSBbXSwgX2ZpdFRleHR1cmU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2hhcGUgPSA8TXV0YWJsZUFycmF5PFZlY3RvcjI+Pk11dGFibGVBcnJheS5mcm9tKF9zaGFwZS5tYXAoX3ZlcnRleCA9PiBfdmVydGV4LmNsb25lKSk7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgdGhpcy5maXRUZXh0dXJlID0gX2ZpdFRleHR1cmU7XHJcblxyXG4gICAgICBpZiAoX3NoYXBlLmxlbmd0aCA8IHRoaXMubWluVmVydGljZXMpIHtcclxuICAgICAgICBEZWJ1Zy53YXJuKGBBdCBsZWFzdCAke3RoaXMubWluVmVydGljZXN9IHZlcnRpY2VzIG5lZWRlZCB0byBjb25zdHJ1Y3QgTWVzaFBvbHlnb24sIGRlZmF1bHQgdHJpZ29uIHVzZWRgKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZShNZXNoUG9seWdvbi5zaGFwZURlZmF1bHQsIHRydWUpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHNoYXBlOiBWZWN0b3IyW10gPSBfc2hhcGU7XHJcblxyXG4gICAgICBsZXQgbWluOiBWZWN0b3IyID0gVmVjdG9yMi5aRVJPKCk7XHJcbiAgICAgIGxldCBtYXg6IFZlY3RvcjIgPSBWZWN0b3IyLlpFUk8oKTtcclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICBmb3IgKGxldCB2ZXJ0ZXggb2Ygc2hhcGUpIHtcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2gobmV3IFZlcnRleCh2ZXJ0ZXgudG9WZWN0b3IzKCkpKTtcclxuXHJcbiAgICAgICAgbWluLnggPSBNYXRoLm1pbihtaW4ueCwgdmVydGV4LngpO1xyXG4gICAgICAgIG1heC54ID0gTWF0aC5tYXgobWF4LngsIHZlcnRleC54KTtcclxuICAgICAgICBtaW4ueSA9IE1hdGgubWluKG1pbi55LCB2ZXJ0ZXgueSk7XHJcbiAgICAgICAgbWF4LnkgPSBNYXRoLm1heChtYXgueSwgdmVydGV4LnkpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBzaXplOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIobWF4LnggLSBtaW4ueCwgbWF4LnkgLSBtaW4ueSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5maXRUZXh0dXJlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdGV4dHVyZVVWOiBWZWN0b3IyID0gVmVjdG9yMi5ESUZGRVJFTkNFKHNoYXBlW2ldLCBtaW4pO1xyXG4gICAgICAgICAgdGhpcy52ZXJ0aWNlc1tpXS51diA9IG5ldyBWZWN0b3IyKHRleHR1cmVVVi54IC8gc2l6ZS54LCAxIC0gdGV4dHVyZVVWLnkgLyBzaXplLnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBfc2hhcGUuZm9yRWFjaCgoX3ZlcnRleCwgX2kpID0+IHRoaXMudmVydGljZXNbX2ldLnV2ID0gbmV3IFZlY3RvcjIoX3ZlcnRleC54LCAtX3ZlcnRleC55KSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZmFjZXMgPSBbXTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMjsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKHRoaXMudmVydGljZXMsIGkgLSAxLCBpLCAwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNoYXBlID0gU2VyaWFsaXplci5zZXJpYWxpemVBcnJheShWZWN0b3IyLCB0aGlzLnNoYXBlKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5maXRUZXh0dXJlID0gdGhpcy5maXRUZXh0dXJlO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgbGV0IHZlY3RvcnM6IFZlY3RvcjJbXSA9IDxWZWN0b3IyW10+YXdhaXQgU2VyaWFsaXplci5kZXNlcmlhbGl6ZUFycmF5KF9zZXJpYWxpemF0aW9uLnNoYXBlKTtcclxuICAgICAgdGhpcy5jcmVhdGUodmVjdG9ycywgX3NlcmlhbGl6YXRpb24uZml0VGV4dHVyZSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMuc2hhcGUsIHRoaXMuZml0VGV4dHVyZSk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTVVUQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgc3VwZXIucmVkdWNlTXV0YXRvcihfbXV0YXRvcik7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCJNZXNoUG9seWdvbi50c1wiLz5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGFuIGV4dHJ1c2lvbiBvZiBhIHBvbHlnb24gYnkgYSBzZXJpZXMgb2YgdHJhbnNmb3JtYXRpb25zXHJcbiAgICogYGBgdGV4dCAgXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgX19fX1xyXG4gICAqIFBvbHlnb24gICAgICAgICBfX19f4pWx4pWyICAg4pWyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICogVHJhbnNmb3JtIDAgIOKGkiDilbEg4pWyX1/ilbJf4pWyX19f4pWyIOKGkCBUcmFuc2Zvcm0gMiAgICAgICAgICB6IF9f4pSCXHJcbiAgICogKGJhc2UpICAgICAgICAg4pWyX+KVsV9f4pWxIOKVsSAgIOKVsSAgIChsaWQpICAgICAgICAgICAgICAgICAgICAg4pWyICAgICAgIFxyXG4gICAqICAgICBUcmFuc2Zvcm0gMSAg4oaSICDilbLilbFfX1/ilbEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFxyXG4gICAqIGBgYFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaEV4dHJ1c2lvbiBleHRlbmRzIE1lc2hQb2x5Z29uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaEV4dHJ1c2lvbik7XHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIG10eERlZmF1bHRzOiBNYXRyaXg0eDRbXSA9IFsgLy8gb2Zmc2V0IG9mICswLjV6IGFuZCAtMC41eiBhcyBkZWZhdWx0XHJcbiAgICAgIE1hdHJpeDR4NC5UUkFOU0xBVElPTihWZWN0b3IzLlooMC41KSksXHJcbiAgICAgIE1hdHJpeDR4NC5UUkFOU0xBVElPTihWZWN0b3IzLlooLTAuNSkpXHJcbiAgICBdO1xyXG4gICAgcHJpdmF0ZSBtdHhUcmFuc2Zvcm1zOiBNdXRhYmxlQXJyYXk8TWF0cml4NHg0PiA9IG5ldyBNdXRhYmxlQXJyYXkoTWF0cml4NHg0KTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaEV4dHJ1c2lvblwiLCBfdmVydGljZXM6IFZlY3RvcjJbXSA9IE1lc2hQb2x5Z29uLnNoYXBlRGVmYXVsdCwgX210eFRyYW5zZm9ybXM6IE1hdHJpeDR4NFtdID0gTWVzaEV4dHJ1c2lvbi5tdHhEZWZhdWx0cywgX2ZpdFRleHR1cmU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lLCBfdmVydGljZXMsIF9maXRUZXh0dXJlKTtcclxuICAgICAgdGhpcy5leHRydWRlKF9tdHhUcmFuc2Zvcm1zKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJNdXRhdG9yXCIsIHRoaXMuZ2V0TXV0YXRvcigpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udHJhbnNmb3JtcyA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplQXJyYXkoTWF0cml4NHg0LCB0aGlzLm10eFRyYW5zZm9ybXMpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGxldCBtdHhUcmFuc2Zvcm1zOiBNYXRyaXg0eDRbXTtcclxuICAgICAgaWYgKF9zZXJpYWxpemF0aW9uLnRyYW5zZm9ybXMpXHJcbiAgICAgICAgbXR4VHJhbnNmb3JtcyA9IDxNYXRyaXg0eDRbXT5hd2FpdCBTZXJpYWxpemVyLmRlc2VyaWFsaXplQXJyYXkoX3NlcmlhbGl6YXRpb24udHJhbnNmb3Jtcyk7XHJcbiAgICAgIHRoaXMuZXh0cnVkZShtdHhUcmFuc2Zvcm1zKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgdGhpcy5leHRydWRlKHRoaXMubXR4VHJhbnNmb3Jtcyk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTVVUQVRFKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgc3VwZXIucmVkdWNlTXV0YXRvcihfbXV0YXRvcik7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcml2YXRlIGV4dHJ1ZGUoX210eFRyYW5zZm9ybXM6IE1hdHJpeDR4NFtdID0gTWVzaEV4dHJ1c2lvbi5tdHhEZWZhdWx0cyk6IHZvaWQge1xyXG4gICAgICB0aGlzLm10eFRyYW5zZm9ybXMgPSA8TXV0YWJsZUFycmF5PE1hdHJpeDR4ND4+TXV0YWJsZUFycmF5LmZyb20oPE11dGFibGVBcnJheTxNYXRyaXg0eDQ+Pl9tdHhUcmFuc2Zvcm1zKTtcclxuICAgICAgbGV0IG5UcmFuc2Zvcm1zOiBudW1iZXIgPSBfbXR4VHJhbnNmb3Jtcy5sZW5ndGg7XHJcbiAgICAgIGxldCBuVmVydGljZXNTaGFwZTogbnVtYmVyID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgbmV3IHZlcnRleCBjbG91ZCwgY3VycmVudCBjbG91ZCBob2xkcyBNZXNoUG9seWdvblxyXG4gICAgICBsZXQgdmVydGljZXM6IFZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKCk7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgYmFzZSBieSB0cmFuc2Zvcm1hdGlvbiBvZiBwb2x5Z29uIHdpdGggZmlyc3QgdHJhbnNmb3JtXHJcbiAgICAgIGxldCBiYXNlOiBWZXJ0ZXhbXSA9IHRoaXMudmVydGljZXMubWFwKChfdjogVmVydGV4KSA9PiBuZXcgVmVydGV4KFZlY3RvcjMuVFJBTlNGT1JNQVRJT04oX3YucG9zaXRpb24sIF9tdHhUcmFuc2Zvcm1zWzBdLCB0cnVlKSwgX3YudXYpKTtcclxuICAgICAgdmVydGljZXMucHVzaCguLi5iYXNlKTtcclxuICAgICAgLy8gY3JlYXRlIGxpZCBieSB0cmFuc2Zvcm1hdGlvbiBvZiBwb2x5Z29uIHdpdGggbGFzdCB0cmFuc2Zvcm1cclxuICAgICAgbGV0IGxpZDogVmVydGV4W10gPSB0aGlzLnZlcnRpY2VzLm1hcCgoX3Y6IFZlcnRleCkgPT4gbmV3IFZlcnRleChWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF92LnBvc2l0aW9uLCBfbXR4VHJhbnNmb3Jtc1tuVHJhbnNmb3JtcyAtIDFdLCB0cnVlKSwgX3YudXYpKTtcclxuICAgICAgdmVydGljZXMucHVzaCguLi5saWQpO1xyXG5cclxuICAgICAgLy8gcmVjcmVhdGUgYmFzZSBmYWNlcyB0byByZWNhbGN1bGF0ZSBub3JtYWxzXHJcbiAgICAgIHRoaXMuZmFjZXMgPSB0aGlzLmZhY2VzLm1hcCgoX2ZhY2U6IEZhY2UpID0+IG5ldyBGYWNlKHZlcnRpY2VzLCBfZmFjZS5pbmRpY2VzWzBdLCBfZmFjZS5pbmRpY2VzWzFdLCBfZmFjZS5pbmRpY2VzWzJdKSk7XHJcbiAgICAgIC8vIGNyZWF0ZSB0aGUgbGlkIGZhY2VzIHVzaW5nIHRoZSBpbmRpY2VzIG9mIHRoZSBiYXNlIGZhY2VzLCBidXQgd2l0aCBhbiBpbmRleCBvZmZzZXQgYW5kIHJldmVyc2Ugb3JkZXIgb2YgaW5kaWNlc1xyXG4gICAgICB0aGlzLmZhY2VzLnB1c2goLi4udGhpcy5mYWNlcy5tYXAoX2ZhY2UgPT5cclxuICAgICAgICBuZXcgRmFjZSh2ZXJ0aWNlcywgX2ZhY2UuaW5kaWNlc1syXSArIG5WZXJ0aWNlc1NoYXBlLCBfZmFjZS5pbmRpY2VzWzFdICsgblZlcnRpY2VzU2hhcGUsIF9mYWNlLmluZGljZXNbMF0gKyBuVmVydGljZXNTaGFwZSlcclxuICAgICAgKSk7XHJcblxyXG4gICAgICBmb3IgKGxldCB0OiBudW1iZXIgPSAwOyB0IDwgblRyYW5zZm9ybXM7IHQrKykge1xyXG4gICAgICAgIGxldCBtdHhUcmFuc2Zvcm06IE1hdHJpeDR4NCA9IF9tdHhUcmFuc2Zvcm1zW3RdO1xyXG4gICAgICAgIGxldCByZWZlclRvQ2xvc2U6IG51bWJlciA9IHZlcnRpY2VzLmxlbmd0aDtcclxuICAgICAgICBsZXQgd3JhcDogVmVydGV4W10gPSB0aGlzLnZlcnRpY2VzLm1hcCgoX3Y6IFZlcnRleCwgX2k6IG51bWJlcikgPT5cclxuICAgICAgICAgIG5ldyBWZXJ0ZXgoVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihfdi5wb3NpdGlvbiwgbXR4VHJhbnNmb3JtLCB0cnVlKSwgbmV3IFZlY3RvcjIoX2kgLyBuVmVydGljZXNTaGFwZSwgdCAvIG5UcmFuc2Zvcm1zKSlcclxuICAgICAgICApO1xyXG4gICAgICAgIHZlcnRpY2VzLnB1c2goLi4ud3JhcCk7XHJcbiAgICAgICAgdmVydGljZXMucHVzaChuZXcgVmVydGV4KHJlZmVyVG9DbG9zZSwgbmV3IFZlY3RvcjIoMSwgdCAvIG5UcmFuc2Zvcm1zKSkpO1xyXG4gICAgICAgIC8vIGlmIChpID4gMCAmJiBpIDwgblRyYW5zZm9ybXMgLSAxKVxyXG4gICAgICAgIC8vICAgdmVydGljZXMucHVzaCguLi53cmFwLm1hcCgoX3ZlY3RvcjogVmVjdG9yMykgPT4gX3ZlY3Rvci5jbG9uZSkpOyA8LSBubyBzbGljaW5nIGZvciBmbGF0IHNoYWRpbmcgeWV0Li4uXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNyZWF0ZSBpbmRpemVzIGZvciB3cmFwcGVyXHJcbiAgICAgIGZvciAobGV0IHQ6IG51bWJlciA9IDA7IHQgPCBuVHJhbnNmb3JtcyAtIDE7IHQrKylcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgblZlcnRpY2VzU2hhcGU7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGluZGV4OiBudW1iZXIgPVxyXG4gICAgICAgICAgICArIDIgKiBuVmVydGljZXNTaGFwZSAvLyBiYXNlICYgbGlkIGFyZSBvZmZzZXRzIFxyXG4gICAgICAgICAgICArIHQgKiAoblZlcnRpY2VzU2hhcGUgKyAxKSAvLyBvZmZzZXQgZm9yIGVhY2ggdHJhbnNmb3JtYXRpb25cclxuICAgICAgICAgICAgKyBpO1xyXG4gICAgICAgICAgbGV0IHF1YWQ6IFF1YWQgPSBuZXcgUXVhZCh2ZXJ0aWNlcywgaW5kZXgsIGluZGV4ICsgblZlcnRpY2VzU2hhcGUgKyAxLCBpbmRleCArIG5WZXJ0aWNlc1NoYXBlICsgMiwgaW5kZXggKyAxLCBRVUFEU1BMSVQuQVRfMCk7XHJcbiAgICAgICAgICB0aGlzLmZhY2VzLnB1c2goLi4ucXVhZC5mYWNlcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHByaXZhdGUgY2FsY3VsYXRlUG9seWdvbkxlbmd0aHMoKTogbnVtYmVyW10ge1xyXG4gICAgLy8gICBsZXQgcmVzdWx0OiBudW1iZXJbXSA9IFtdO1xyXG4gICAgLy8gICBsZXQgZmlyc3Q6IFZlY3RvcjM7XHJcbiAgICAvLyAgIGxldCBwcmV2OiBWZWN0b3IzO1xyXG4gICAgLy8gICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgLy8gICAgIGxldCBjdXJyZW50OiBWZWN0b3IzID0gbmV3IFZlY3RvcjModGhpcy52ZXJ0aWNlc1tpXSwgdGhpcy52ZXJ0aWNlc1tpICsgMV0sIHRoaXMudmVydGljZXNbaSArIDJdKTtcclxuICAgIC8vICAgICBpZiAocHJldilcclxuICAgIC8vICAgICAgIHJlc3VsdC5wdXNoKFZlY3RvcjMuRElGRkVSRU5DRShjdXJyZW50LCBwcmV2KS5tYWduaXR1ZGUpO1xyXG4gICAgLy8gICAgIGVsc2VcclxuICAgIC8vICAgICAgIGZpcnN0ID0gY3VycmVudDtcclxuICAgIC8vICAgICBwcmV2ID0gY3VycmVudDtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICByZXN1bHQucHVzaChWZWN0b3IzLkRJRkZFUkVOQ0UoZmlyc3QsIHByZXYpLm1hZ25pdHVkZSk7XHJcbiAgICAvLyAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgbWVzaCBsb2FkZWQgZnJvbSBhbiBGQlgtRmlsZS5cclxuICAgKiBAYXV0aG9ycyBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoRkJYIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKE1lc2gpIHtcclxuICAgIC8vIHB1YmxpYyB1cmw6IFJlcXVlc3RJbmZvO1xyXG4gICAgcHVibGljIGlNZXNoOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsLCBfaU1lc2g6IG51bWJlciA9IHRoaXMuaU1lc2gpOiBQcm9taXNlPE1lc2hGQlg+IHtcclxuICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMuaU1lc2ggPSBfaU1lc2g7XHJcbiAgICAgIGNvbnN0IGxvYWRlcjogRkJYTG9hZGVyID0gYXdhaXQgRkJYTG9hZGVyLkxPQUQodGhpcy51cmwudG9TdHJpbmcoKSk7XHJcbiAgICAgIGNvbnN0IGdlb21ldHJ5RkJYOiBGQlguR2VvbWV0cnkgPSAoXHJcbiAgICAgICAgbG9hZGVyLmZieC5vYmplY3RzLmdlb21ldHJpZXNbX2lNZXNoXSB8fFxyXG4gICAgICAgIGxvYWRlci5mYngub2JqZWN0cy5nZW9tZXRyaWVzLmZpbmQoX29iamVjdCA9PiBfb2JqZWN0Lm5hbWUgPT0gdGhpcy5uYW1lKSB8fFxyXG4gICAgICAgIGxvYWRlci5mYngub2JqZWN0cy5tb2RlbHMuZmluZChfb2JqZWN0ID0+IF9vYmplY3QubmFtZSA9PSB0aGlzLm5hbWUgJiYgX29iamVjdC5zdWJ0eXBlID09IFwiTWVzaFwiKS5jaGlsZHJlblswXVxyXG4gICAgICApLmxvYWQoKTtcclxuICAgICAgaWYgKGdlb21ldHJ5RkJYKVxyXG4gICAgICAgIHRoaXMubmFtZSA9IGdlb21ldHJ5RkJYLm5hbWUubGVuZ3RoID4gMCA/IGdlb21ldHJ5RkJYLm5hbWUgOiBnZW9tZXRyeUZCWC5wYXJlbnRzWzBdLm5hbWU7XHJcblxyXG4gICAgICBsZXQgcG9zaXRpb25zOiBWZWN0b3IzW10gPSBbXTtcclxuICAgICAgbGV0IHZlcnRleEJ1ZmZlcjogRmxvYXQzMkFycmF5ID0gZ2VvbWV0cnlGQlguVmVydGljZXM7XHJcbiAgICAgIGZvciAobGV0IGlWZXJ0ZXg6IG51bWJlciA9IDA7IGlWZXJ0ZXggPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpVmVydGV4ICs9IDMpIHtcclxuICAgICAgICBwb3NpdGlvbnMucHVzaChuZXcgVmVjdG9yMyh2ZXJ0ZXhCdWZmZXJbaVZlcnRleCArIDBdLCB2ZXJ0ZXhCdWZmZXJbaVZlcnRleCArIDFdLCB2ZXJ0ZXhCdWZmZXJbaVZlcnRleCArIDJdKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCB1dnM6IFZlY3RvcjJbXSA9IFtdO1xyXG4gICAgICBpZiAoZ2VvbWV0cnlGQlguTGF5ZXJFbGVtZW50VVYpIHtcclxuICAgICAgICBsZXQgdXZCdWZmZXI6IEZsb2F0MzJBcnJheSA9IGdlb21ldHJ5RkJYLkxheWVyRWxlbWVudFVWLlVWO1xyXG4gICAgICAgIGZvciAobGV0IGl1djogbnVtYmVyID0gMDsgaXV2IDwgdXZCdWZmZXIubGVuZ3RoOyBpdXYgKz0gMikge1xyXG4gICAgICAgICAgdXZzLnB1c2gobmV3IFZlY3RvcjIodXZCdWZmZXJbaXV2XSwgMSAtIHV2QnVmZmVyW2l1diArIDFdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbm9ybWFsczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGlmIChnZW9tZXRyeUZCWC5MYXllckVsZW1lbnROb3JtYWwpIHtcclxuICAgICAgICBsZXQgbm9ybWFsQnVmZmVyOiBGbG9hdDMyQXJyYXkgPSBnZW9tZXRyeUZCWC5MYXllckVsZW1lbnROb3JtYWwuTm9ybWFscztcclxuICAgICAgICBmb3IgKGxldCBpTm9ybWFsOiBudW1iZXIgPSAwOyBpTm9ybWFsIDwgbm9ybWFsQnVmZmVyLmxlbmd0aDsgaU5vcm1hbCArPSAzKSB7XHJcbiAgICAgICAgICBub3JtYWxzLnB1c2gobmV3IFZlY3RvcjMobm9ybWFsQnVmZmVyW2lOb3JtYWxdLCBub3JtYWxCdWZmZXJbaU5vcm1hbCArIDFdLCBub3JtYWxCdWZmZXJbaU5vcm1hbCArIDJdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbWFwVmVydGV4VG9JbmRleDogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICAgICAgbGV0IG5ld1ZlcnRleEluZGljZXM6IG51bWJlcltdW10gPSBbXTtcclxuICAgICAgbGV0IGlQb2x5Z29uOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgaXNFbmRPZlBvbHlnb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgbGV0IHBvbHlnb246IG51bWJlcltdID0gW107XHJcblxyXG4gICAgICBnZW9tZXRyeUZCWC5Qb2x5Z29uVmVydGV4SW5kZXguZm9yRWFjaCgoX2lWZXJ0ZXgsIF9pUG9seWdvblZlcnRleCkgPT4ge1xyXG4gICAgICAgIGlmIChfaVZlcnRleCA8IDApIHtcclxuICAgICAgICAgIF9pVmVydGV4ID0gX2lWZXJ0ZXggXiAtIDE7XHJcbiAgICAgICAgICBpc0VuZE9mUG9seWdvbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBwb3NpdGlvbnNbX2lWZXJ0ZXhdO1xyXG4gICAgICAgIGxldCB1djogVmVjdG9yMiA9IHV2c1t0aGlzLmdldERhdGFJbmRleChnZW9tZXRyeUZCWC5MYXllckVsZW1lbnRVViwgX2lWZXJ0ZXgsIGlQb2x5Z29uLCBfaVBvbHlnb25WZXJ0ZXgpXTtcclxuXHJcbiAgICAgICAgbGV0IHZlcnRleEtleTogc3RyaW5nID0gcG9zaXRpb24udG9TdHJpbmcoKSArIHV2LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaWYgKCFtYXBWZXJ0ZXhUb0luZGV4Lmhhcyh2ZXJ0ZXhLZXkpKSB7XHJcbiAgICAgICAgICBsZXQgbm9ybWFsOiBWZWN0b3IzID0gbm9ybWFsc1t0aGlzLmdldERhdGFJbmRleChnZW9tZXRyeUZCWC5MYXllckVsZW1lbnROb3JtYWwsIF9pVmVydGV4LCBpUG9seWdvbiwgX2lQb2x5Z29uVmVydGV4KV07XHJcblxyXG4gICAgICAgICAgdGhpcy52ZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgocG9zaXRpb24sIHV2LCBub3JtYWwpKTtcclxuICAgICAgICAgIG1hcFZlcnRleFRvSW5kZXguc2V0KHZlcnRleEtleSwgdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSAxKTtcclxuICAgICAgICAgIGlmICghbmV3VmVydGV4SW5kaWNlc1tfaVZlcnRleF0pXHJcbiAgICAgICAgICAgIG5ld1ZlcnRleEluZGljZXNbX2lWZXJ0ZXhdID0gW107XHJcbiAgICAgICAgICBuZXdWZXJ0ZXhJbmRpY2VzW19pVmVydGV4XS5wdXNoKHRoaXMudmVydGljZXMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBvbHlnb24ucHVzaChtYXBWZXJ0ZXhUb0luZGV4LmdldCh2ZXJ0ZXhLZXkpKTtcclxuXHJcbiAgICAgICAgaWYgKGlzRW5kT2ZQb2x5Z29uKSB7XHJcbiAgICAgICAgICBpZiAocG9seWdvbi5sZW5ndGggPT0gMykge1xyXG4gICAgICAgICAgICB0aGlzLmZhY2VzLnB1c2gobmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgcG9seWdvblswXSwgcG9seWdvblsxXSwgcG9seWdvblsyXSkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChwb2x5Z29uLmxlbmd0aCA9PSA0KSB7XHJcbiAgICAgICAgICAgIGxldCBxdWFkOiBRdWFkID0gbmV3IFF1YWQodGhpcy52ZXJ0aWNlcywgcG9seWdvblswXSwgcG9seWdvblsxXSwgcG9seWdvblsyXSwgcG9seWdvblszXSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmFjZXMucHVzaCguLi5xdWFkLmZhY2VzKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDI7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgIHRoaXMuZmFjZXMucHVzaChuZXcgRmFjZSh0aGlzLnZlcnRpY2VzLCBwb2x5Z29uWzBdLCBwb2x5Z29uW2kgLSAxXSwgcG9seWdvbltpIC0gMF0pKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGAke01lc2hMb2FkZXJGQlgubmFtZX06IFBvbHlnb25zIHdpdGggbW9yZSB0aGFuIDQgdmVydGljZXMgYXJlIG5vdCBzdXBwb3J0ZWQuYCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBwb2x5Z29uID0gW107XHJcbiAgICAgICAgICBpc0VuZE9mUG9seWdvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgaVBvbHlnb24rKztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGdlb21ldHJ5RkJYLmNoaWxkcmVuPy5bMF0udHlwZSA9PSBcIkRlZm9ybWVyXCIpIHtcclxuICAgICAgICBjb25zdCBmYnhEZWZvcm1lcjogRkJYLkRlZm9ybWVyID0gZ2VvbWV0cnlGQlguY2hpbGRyZW5bMF07XHJcbiAgICAgICAgY29uc3Qgc2tlbGV0b246IENvbXBvbmVudFNrZWxldG9uID0gYXdhaXQgbG9hZGVyLmdldFNrZWxldG9uKGZieERlZm9ybWVyLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdKTsgLy8gRGVmb3JtZXIuU3ViRGVmb3JtZXIuTGltYk5vZGVcclxuICAgICAgICB0aGlzLmNyZWF0ZUJvbmVzKGZieERlZm9ybWVyLCBza2VsZXRvbiwgdGhpcy52ZXJ0aWNlcywgbmV3VmVydGV4SW5kaWNlcyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmlNZXNoID0gdGhpcy5pTWVzaDtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5pTWVzaCA9IF9zZXJpYWxpemF0aW9uLmlNZXNoO1xyXG4gICAgICByZXR1cm4gc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RGF0YUluZGV4KF9sYXllckVsZW1lbnQ6IEZCWC5MYXllckVsZW1lbnRVViB8IEZCWC5MYXllckVsZW1lbnROb3JtYWwsIF9pVmVydGV4OiBudW1iZXIsIF9pUG9seWdvbjogbnVtYmVyLCBfaVBvbHlnb25WZXJ0ZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID1cclxuICAgICAgICBfbGF5ZXJFbGVtZW50Lk1hcHBpbmdJbmZvcm1hdGlvblR5cGUgPT0gXCJCeVZlcnRleFwiID9cclxuICAgICAgICAgIF9pVmVydGV4IDpcclxuICAgICAgICAgIF9sYXllckVsZW1lbnQuTWFwcGluZ0luZm9ybWF0aW9uVHlwZSA9PSBcIkJ5UG9seWdvblwiID9cclxuICAgICAgICAgICAgX2lQb2x5Z29uIDpcclxuICAgICAgICAgICAgX2lQb2x5Z29uVmVydGV4O1xyXG5cclxuICAgICAgaWYgKF9sYXllckVsZW1lbnQuUmVmZXJlbmNlSW5mb3JtYXRpb25UeXBlID09PSAnSW5kZXhUb0RpcmVjdCcpIHtcclxuICAgICAgICBsZXQgaW5kaWNlczogVWludDE2QXJyYXkgPSAoX2xheWVyRWxlbWVudCBhcyBGQlguTGF5ZXJFbGVtZW50VVYpLlVWSW5kZXggfHwgKF9sYXllckVsZW1lbnQgYXMgRkJYLkxheWVyRWxlbWVudE5vcm1hbCkuTm9ybWFsc0luZGV4O1xyXG4gICAgICAgIGluZGV4ID0gaW5kaWNlc1tpbmRleF07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUJvbmVzKF9kZWZvcm1lckZCWDogRkJYLkRlZm9ybWVyLCBfc2tlbGV0b246IENvbXBvbmVudFNrZWxldG9uLCBfdmVydGljZXM6IFZlcnRpY2VzLCBfbmV3VmVydGV4SW5kaWNlcz86IG51bWJlcltdW10pOiB2b2lkIHtcclxuICAgICAgZm9yIChjb25zdCBmYnhTdWJEZWZvcm1lciBvZiBfZGVmb3JtZXJGQlguY2hpbGRyZW4gYXMgRkJYLlN1YkRlZm9ybWVyW10pIHtcclxuICAgICAgICBmYnhTdWJEZWZvcm1lci5sb2FkKCk7XHJcbiAgICAgICAgaWYgKGZieFN1YkRlZm9ybWVyLkluZGV4ZXMpXHJcbiAgICAgICAgICBmb3IgKGxldCBpQm9uZUluZmx1ZW5jZTogbnVtYmVyID0gMDsgaUJvbmVJbmZsdWVuY2UgPCBmYnhTdWJEZWZvcm1lci5JbmRleGVzLmxlbmd0aDsgaUJvbmVJbmZsdWVuY2UrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpVmVydGV4OiBudW1iZXIgPSBmYnhTdWJEZWZvcm1lci5JbmRleGVzW2lCb25lSW5mbHVlbmNlXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpVmVydGV4TmV3IG9mIF9uZXdWZXJ0ZXhJbmRpY2VzID8gX25ld1ZlcnRleEluZGljZXNbaVZlcnRleF0gOiBbaVZlcnRleF0pIHtcclxuICAgICAgICAgICAgICAoX3ZlcnRpY2VzW2lWZXJ0ZXhOZXddLmJvbmVzIHx8IChfdmVydGljZXNbaVZlcnRleE5ld10uYm9uZXMgPSBbXSkpLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgaW5kZXg6IF9za2VsZXRvbi5pbmRleE9mKGZieFN1YkRlZm9ybWVyLmNoaWxkcmVuWzBdLm5hbWUpLFxyXG4gICAgICAgICAgICAgICAgd2VpZ2h0OiBmYnhTdWJEZWZvcm1lci5XZWlnaHRzW2lCb25lSW5mbHVlbmNlXSB8fCAxXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKiBBbGxvd3MgdG8gY3JlYXRlIGN1c3RvbSBtZXNoZXMgZnJvbSBnaXZlbiBEYXRhICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hGcm9tRGF0YSBleHRlbmRzIE1lc2gge1xyXG4gICAgcHJvdGVjdGVkIHZlcnRpY2VzVG9TZXQ6IEZsb2F0MzJBcnJheTtcclxuICAgIHByb3RlY3RlZCB0ZXh0dXJlVVZzVG9TZXQ6IEZsb2F0MzJBcnJheTtcclxuICAgIHByb3RlY3RlZCBpbmRpY2VzVG9TZXQ6IFVpbnQxNkFycmF5O1xyXG4gICAgcHJvdGVjdGVkIGZhY2VOb3JtYWxzVG9TZXQ6IEZsb2F0MzJBcnJheTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3ZlcnRpY2VzOiBGbG9hdDMyQXJyYXksIF90ZXh0dXJlVVZzOiBGbG9hdDMyQXJyYXksIF9pbmRpY2VzOiBVaW50MTZBcnJheSwgX2ZhY2VOb3JtYWxzOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy52ZXJ0aWNlc1RvU2V0ID0gX3ZlcnRpY2VzO1xyXG4gICAgICB0aGlzLnRleHR1cmVVVnNUb1NldCA9IF90ZXh0dXJlVVZzO1xyXG4gICAgICB0aGlzLmluZGljZXNUb1NldCA9IF9pbmRpY2VzO1xyXG4gICAgICB0aGlzLmZhY2VOb3JtYWxzVG9TZXQgPSBfZmFjZU5vcm1hbHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVZlcnRpY2VzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZlcnRpY2VzVG9TZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVRleHR1cmVVVnMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZVVWc1RvU2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJbmRpY2VzKCk6IFVpbnQxNkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5kaWNlc1RvU2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVGbGF0Tm9ybWFscygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy5mYWNlTm9ybWFsc1RvU2V0O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQSB7QGxpbmsgTWVzaH0gbG9hZGVkIGZyb20gYSBnbFRGLUZpbGUuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hHTFRGIGV4dGVuZHMgbWl4aW5TZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsKE1lc2gpIHtcclxuICAgIHB1YmxpYyBpUHJpbWl0aXZlOiBudW1iZXI7IC8vIG1vc3QgbGlrZWx5IHdpbGwgbm90IHN0YXkgY29uc2lzdGVudCB3aXRoIHRoZSBnbFRGIGZpbGUuLi5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZChfdXJsOiBSZXF1ZXN0SW5mbyA9IHRoaXMudXJsLCBfbmFtZTogc3RyaW5nID0gdGhpcy5uYW1lLCBfaVByaW1pdGl2ZTogbnVtYmVyID0gdGhpcy5pUHJpbWl0aXZlKTogUHJvbWlzZTxNZXNoR0xURj4ge1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmlQcmltaXRpdmUgPSBfaVByaW1pdGl2ZTtcclxuICAgICAgcmV0dXJuIEdMVEZMb2FkZXIubG9hZFJlc291cmNlKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5pUHJpbWl0aXZlID0gdGhpcy5pUHJpbWl0aXZlO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLmlQcmltaXRpdmUgPSBfc2VyaWFsaXphdGlvbi5pUHJpbWl0aXZlO1xyXG4gICAgICByZXR1cm4gc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEEgbWVzaCBsb2FkZWQgZnJvbSBhbiBPQkotZmlsZS5cclxuICAgKiBTaW1wbGUgV2F2ZWZyb250IE9CSiBpbXBvcnQuIFRha2VzIGEgd2F2ZWZyb250IG9iaiBzdHJpbmcuIFRvIExvYWQgZnJvbSBhIGZpbGUgdXJsLCB1c2UgdGhlXHJcbiAgICogc3RhdGljIExPQUQgTWV0aG9kLiBDdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIHRyaWFuZ3VsYXRlZCBNZXNoZXNcclxuICAgKiAoYWN0aXZhdGUgJ0dlb21lbnRyeSDihpIgVHJpYW5ndWxhdGUgRmFjZXMnIGluIEJsZW5kZXJzIG9iaiBleHBvcnRlcilcclxuICAgKiBAdG9kbyBMb2FkIE1hdGVyaWFscywgU3VwcG9ydCBRdWFkc1xyXG4gICAqIEBhdXRob3JzIFNpbW9uIFN0b3JsLVNjaHVsa2UgMjAyMSB8IEx1aXMgS2VjaywgSEZVLCAyMDIxIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEtMjAyMiB8IE1hdHRoaWFzIFJvbWluZywgSEZVLCAyMDIzIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hPQkogZXh0ZW5kcyBtaXhpblNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWwoTWVzaCkge1xyXG5cclxuICAgIHB1YmxpYyBhc3luYyBsb2FkKF91cmw6IFJlcXVlc3RJbmZvID0gdGhpcy51cmwpOiBQcm9taXNlPE1lc2hPQko+IHtcclxuICAgICAgY29uc3QgdXJsOiBzdHJpbmcgPSBuZXcgVVJMKF91cmwudG9TdHJpbmcoKSwgUHJvamVjdC5iYXNlVVJMKS50b1N0cmluZygpO1xyXG4gICAgICBjb25zdCBkYXRhOiBzdHJpbmcgPSBhd2FpdCAoYXdhaXQgZmV0Y2godXJsKSkudGV4dCgpO1xyXG4gICAgICB0aGlzLm5hbWUgPSB1cmwuc3BsaXQoXCIvXCIpLnBvcCgpO1xyXG4gICAgICB0aGlzLnVybCA9IF91cmw7XHJcblxyXG4gICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBkYXRhLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgY29uc3QgcG9zaXRpb25zOiBWZWN0b3IzW10gPSBbXTtcclxuICAgICAgY29uc3QgdXZzOiBWZWN0b3IyW10gPSBbXTtcclxuICAgICAgY29uc3Qgbm9ybWFsczogVmVjdG9yM1tdID0gW107XHJcbiAgICAgIGNvbnN0IG5vcm1zOiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgICAgY29uc3QgdmVydGljZXM6IFZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKCk7XHJcbiAgICAgIGNvbnN0IGZhY2VzOiBGYWNlW10gPSBbXTtcclxuICAgICAgY29uc3QgbWFwUG9zaXRpb25VVk5vcm1hbFRvSW5kZXg6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICAgICAgY29uc3QgbWFwUG9zaXRpb25Ob3JtYWxUb0luZGV4OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcblxyXG4gICAgICAvLyBUT0RPOiB0aGluayBhYm91dCBjcmVhdGluZyB0aGUgbmVlZGVkIGJ1ZmZlcnMgZm9yIHJlbmRlcm1lc2ggaGVyZSBhbHJlYWR5Li4uXHJcbiAgICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBsaW5lLnRyaW0oKS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgc3dpdGNoIChwYXJ0cy5zaGlmdCgpKSB7XHJcbiAgICAgICAgICBjYXNlIFwidlwiOiAvL1ZlcnRleCAtIGV4YW1wbGU6IHYgMC43MCAtMC40NSAtMC41MiAgICAgICAgIFxyXG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChuZXcgVmVjdG9yMyguLi5wYXJ0cy5tYXAoX3ZhbHVlID0+ICtfdmFsdWUpKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcInZuXCI6IC8vTm9ybWFsIC0gZXhhbXBsZTogdm4gMC4wMCAwLjAwIDEuMDBcclxuICAgICAgICAgICAgbm9ybWFscy5wdXNoKG5ldyBWZWN0b3IzKC4uLnBhcnRzLm1hcChfdmFsdWUgPT4gK192YWx1ZSkpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwidnRcIjogLy9UZXhjb29yZCAtIGV4YW1wbGU6IHZ0IDAuNTQ1NDU0IDAuNDcyMzgyXHJcbiAgICAgICAgICAgIHV2cy5wdXNoKG5ldyBWZWN0b3IyKC4uLnBhcnRzLm1hcCgoX3ZhbHVlLCBfaW5kZXgpID0+ICtfdmFsdWUgKiAoX2luZGV4ID09IDEgPyAtMSA6IDEpKSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJmXCI6IC8qRmFjZSBJbmRpY2VzIC0gZXhhbXBsZTogZiAxLzEvMSAyLzIvMSAzLzMvMSAtLT4gdmVydGV4MS90ZXhjb29yZDEvbm9ybWFsMSB2ZXJ0ZXgyL3RleGNvb3JkMi9ub3JtYWwyIHZlcnRleDMvdGV4Y29vcmQzL25vcm1hbDMqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGtleTogc3RyaW5nID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgICAgbGV0IGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSBtYXBQb3NpdGlvblVWTm9ybWFsVG9JbmRleFtrZXldO1xyXG4gICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IHZlcnRpY2VzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRleEluZm86IHN0cmluZ1tdID0gcGFydHNbaV0uc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uOiBWZWN0b3IzID0gcG9zaXRpb25zWyt2ZXJ0ZXhJbmZvWzBdIC0gMV07IC8vIG9iaiB1c2VzIDEtYmFzZWQgaW5kaWNlc1xyXG4gICAgICAgICAgICAgICAgbGV0IHV2OiBWZWN0b3IyID0gdXZzWyt2ZXJ0ZXhJbmZvWzFdIC0gMV0gPz8gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5vcm1hbDogVmVjdG9yMyA9IG5vcm1hbHNbK3ZlcnRleEluZm9bMl0gLSAxXSA/PyB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbClcclxuICAgICAgICAgICAgICAgICAgbm9ybXMucHVzaChub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56KTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQga2V5UG9zTm9ybTogc3RyaW5nID0gYCR7dmVydGV4SW5mb1swXX0vJHt2ZXJ0ZXhJbmZvWzJdfWA7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgobWFwUG9zaXRpb25Ob3JtYWxUb0luZGV4W2tleVBvc05vcm1dID8/IHBvc2l0aW9uLCB1diwgbm9ybWFsKSk7XHJcbiAgICAgICAgICAgICAgICBtYXBQb3NpdGlvblVWTm9ybWFsVG9JbmRleFtrZXldID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFwUG9zaXRpb25Ob3JtYWxUb0luZGV4W2tleVBvc05vcm1dID09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgICAgbWFwUG9zaXRpb25Ob3JtYWxUb0luZGV4W2tleVBvc05vcm1dID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGluZGljZXMucHVzaChpbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBmYWNlcy5wdXNoKG5ldyBGYWNlKHZlcnRpY2VzLCBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMl0sIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSwgaW5kaWNlc1tpbmRpY2VzLmxlbmd0aCAtIDNdKSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKF9lOiB1bmtub3duKSB7XHJcbiAgICAgICAgICAgICAgRGVidWcuZnVkZ2UoXCJGYWNlIGV4Y2x1ZGVkXCIsICg8RXJyb3I+X2UpLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICB0aGlzLnZlcnRpY2VzID0gdmVydGljZXM7XHJcbiAgICAgIHRoaXMuZmFjZXMgPSBmYWNlcztcclxuICAgICAgaWYgKG5vcm1zLmxlbmd0aCA+IDApIC8vIFRPRE86IHJlbmRlcm1lc2ggc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIHVuZGVmaW5lZCBub3JtYWxzIGNvcnJlY3RseSwgaS5lLiBjYWxjdWxhdGUgdGhlbSBvbmx5IGlmIHRoZXkgYXJlIG5vdCBwcmVzZW50IGluIHRoZSB2ZXJ0aWNlc1xyXG4gICAgICAgIHRoaXMucmVuZGVyTWVzaC5ub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShub3Jtcyk7XHJcbiAgICAgIC8vIF9tZXNoLnJlbmRlck1lc2guaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShpbmRpY2VzKTsgLy8gZG9lbnMndCBzZWVtIHRvIGFmZmVjdCBzY2VuZSBsb2FkaW5nIHRpbWUuLi5cclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgc2ltcGxlIHB5cmFtaWQgd2l0aCBlZGdlcyBhdCB0aGUgYmFzZSBvZiBsZW5ndGggMSBhbmQgYSBoZWlnaHQgb2YgMS4gVGhlIHNpZGVzIGNvbnNpc3Rpbmcgb2Ygb25lLCB0aGUgYmFzZSBvZiB0d28gdHJpZ29uc1xyXG4gICAqIGBgYHRleHRcclxuICAgKiAgICAgICAgICAgICAgIDRcclxuICAgKiAgICAgICAgICAgICAgL1xcYC5cclxuICAgKiAgICAgICAgICAgIDMvX19cXF9cXCAyXHJcbiAgICogICAgICAgICAgIDAvX19fX1xcLzFcclxuICAgKiBgYGBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUHlyYW1pZCBleHRlbmRzIE1lc2gge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoUHlyYW1pZCk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hQeXJhbWlkXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICAvLyB0aGlzLmNyZWF0ZSgpO1xyXG5cclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcyhcclxuICAgICAgICAvLyBncm91bmQgdmVydGljZXNcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKC0wLjUsIDAuMCwgMC41KSwgbmV3IFZlY3RvcjIoMCwgMSkpLFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC41LCAwLjAsIDAuNSksIG5ldyBWZWN0b3IyKDEsIDEpKSxcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuNSwgMC4wLCAtMC41KSwgbmV3IFZlY3RvcjIoMSwgMCkpLFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoLTAuNSwgMC4wLCAtMC41KSwgbmV3IFZlY3RvcjIoMCwgMCkpLFxyXG4gICAgICAgIC8vIHRpcCAodmVydGV4ICM0KVxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoMC4wLCAxLjAsIDAuMCksIG5ldyBWZWN0b3IyKDAuNSwgMC41KSksXHJcbiAgICAgICAgLy8gZmxvb3IgYWdhaW4gZm9yIGRvd25zaWRlIHRleHR1cmVcclxuICAgICAgICBuZXcgVmVydGV4KDAsIG5ldyBWZWN0b3IyKDAsIDApKSxcclxuICAgICAgICBuZXcgVmVydGV4KDEsIG5ldyBWZWN0b3IyKDEsIDApKSxcclxuICAgICAgICBuZXcgVmVydGV4KDIsIG5ldyBWZWN0b3IyKDEsIDEpKSxcclxuICAgICAgICBuZXcgVmVydGV4KDMsIG5ldyBWZWN0b3IyKDAsIDEpKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmZhY2VzID0gW1xyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDQsIDAsIDEpLFxyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDQsIDEsIDIpLFxyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDQsIDIsIDMpLFxyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDQsIDMsIDApLFxyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDUgKyAwLCA1ICsgMiwgNSArIDEpLFxyXG4gICAgICAgIG5ldyBGYWNlKHRoaXMudmVydGljZXMsIDUgKyAwLCA1ICsgMywgNSArIDIpXHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgYSBzaW1wbGUgcXVhZCB3aXRoIGVkZ2VzIG9mIGxlbmd0aCAxLCB0aGUgZmFjZSBjb25zaXN0aW5nIG9mIHR3byB0cmlnb25zXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAwIF9fIDNcclxuICAgKiAgICAgICAgIHxfXFx8XHJcbiAgICogICAgICAgIDEgICAgMiAgICAgICAgICAgICBcclxuICAgKiBgYGAgXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTktMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUXVhZCBleHRlbmRzIE1lc2hQb2x5Z29uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFF1YWQpO1xyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBzaGFwZTogVmVjdG9yMltdID0gW1xyXG4gICAgICBuZXcgVmVjdG9yMigtMC41LCAwLjUpLCBuZXcgVmVjdG9yMigtMC41LCAtMC41KSwgbmV3IFZlY3RvcjIoMC41LCAtMC41KSwgbmV3IFZlY3RvcjIoMC41LCAwLjUpXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoUXVhZFwiKSB7XHJcbiAgICAgIHN1cGVyKF9uYW1lLCBNZXNoUXVhZC5zaGFwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLy8gZmxhdCBlcXVhbHMgc21vb3RoXHJcbiAgICAvLyBwdWJsaWMgZ2V0IHZlcnRpY2VzRmxhdCgpOiBGbG9hdDMyQXJyYXkgeyByZXR1cm4gdGhpcy52ZXJ0aWNlczsgfVxyXG4gICAgLy8gcHVibGljIGdldCBpbmRpY2VzRmxhdCgpOiBVaW50MTZBcnJheSB7IHJldHVybiB0aGlzLmluZGljZXM7IH1cclxuICAgIC8vIHB1YmxpYyBnZXQgbm9ybWFsc0ZsYXQoKTogRmxvYXQzMkFycmF5IHsgcmV0dXJuIHRoaXMubm9ybWFsc1ZlcnRleDsgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2dlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIHRoaXMuY3JlYXRlKE1lc2hRdWFkLnNoYXBlLCB0cnVlKTsgLy8gdGhpcyBzZWVtcyB0byBiZSBkaXNwYXRjaGVkIGRvdWJsZWQgd2hpbGUgZGVzZXJpYWxpemluZyB0aGUgcmVzb3VyY2VzXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgc3VwZXIucmVkdWNlTXV0YXRvcihfbXV0YXRvcik7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zaGFwZTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLmZpdFRleHR1cmU7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKiBcclxuICAgKiBUaGlzIGZ1bmN0aW9uIHR5cGUgdGFrZXMgeCBhbmQgeiBhcyBQYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGEgbnVtYmVyIGJldHdlZW4gLTEgYW5kIDEgdG8gYmUgdXNlZCBhcyBhIGhlaWdodG1hcC4gXHJcbiAgICogeCAqIHogKiAyIHJlcHJlc2VudCB0aGUgYW1vdXQgb2YgZmFjZXMgd2hpY2ggYXJlIGNyZWF0ZWQuIEFzIGEgcmVzdWx0IHlvdSBnZXQgMSB2ZXJ0ZXggbW9yZSBpbiBlYWNoIGRpcmVjdGlvbiAoeCBhbmQgeiBheGlzKVxyXG4gICAqIFRoZSB5LWNvbXBvbmVudCBvZiB0aGUgcmVzdWx0aW5nIG1lc2ggbWF5IGJlIG1vdmVkIHRvIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIGEgbWF4aW11bSBoZWlnaHQuXHJcbiAgICogQGF1dGhvcnMgU2ltb24gU3RvcmwtU2NodWxrZSwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEtMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCB0eXBlIEhlaWdodE1hcEZ1bmN0aW9uID0gKHg6IG51bWJlciwgejogbnVtYmVyKSA9PiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJ0aWNhbCBwcm9qZWN0aW9uIG9mIGEgZ2l2ZW4gcG9zaXRpb24gb250byB0aGUgdGVycmFpblxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUZXJyYWluSW5mbyB7XHJcbiAgICAvKiogdGhlIHBvc2l0aW9uIG9mIHRoZSBwb2ludCB2ZXJ0aWNhbGx5IHByb2plY3RlZCBvbiB0aGUgdGVycmFpbiBpbiB3b3JsZCBjb29yZGluYXRlcyAqL1xyXG4gICAgcHVibGljIHBvc2l0aW9uOiBWZWN0b3IzO1xyXG4gICAgLyoqIHRoZSBub3JtYWwgb2YgdGhlIGZhY2Ugb2YgdGhlIHRlcnJhaW4gdW5kZXIgdGhlIHBvaW50IGluIHdvcmxkIGNvb3JkaW5hdGVzICovXHJcbiAgICBwdWJsaWMgbm9ybWFsOiBWZWN0b3IzO1xyXG4gICAgLyoqIHZlcnRpY2FsIGRpc3RhbmNlIG9mIHRoZSBwb2ludCB0byB0aGUgdGVycmFpbiwgbmVnYXRpdmUgaWYgYmVsb3cgKi9cclxuICAgIHB1YmxpYyBkaXN0YW5jZTogbnVtYmVyO1xyXG4gICAgLyoqIHRoZSBwb3NpdGlvbiBpbiBmYWNlIGNvb3JkaW5hdGVzICovXHJcbiAgICBwdWJsaWMgcG9zaXRpb25GYWNlOiBWZWN0b3IzO1xyXG4gICAgLyoqIHRoZSBpbmRleCBvZiB0aGUgZmFjZSB0aGUgcG9zaXRpb24gaXMgaW5zaWRlICovXHJcbiAgICBwdWJsaWMgaW5kZXg6IG51bWJlcjtcclxuICAgIC8qKiB0aGUgZ3JpZCBjb29yZGluYXRlcyBvZiB0aGUgcXVhZCB0aGUgZmFjZSBiZWxvbmdzIHRvICovXHJcbiAgICBwdWJsaWMgZ3JpZDogVmVjdG9yMjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgdGVycmFpbiBzcHJlYWRzIG91dCBpbiB0aGUgeC16LXBsYW5lLCB5IGlzIHRoZSBoZWlnaHQgZGVyaXZlZCBmcm9tIHRoZSBoZWlnaHRtYXAgZnVuY3Rpb24uIFxyXG4gICAqIFRoZSB0ZXJyYWluIGlzIGFsd2F5cyAxIGluIHNpemUgaW4gYWxsIGRpbWVuc2lvbnMsIGZpdHRpbmcgaW50byB0aGUgdW5pdC1jdWJlLiBcclxuICAgKiBSZXNvbHV0aW9uIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBxdWFkcyBpbiB4IGFuZCB6IGRpbWVuc2lvbiwgc2NhbGUgdGhlIGZhY3RvciBhcHBsaWVkIHRvIHRoZSB4LHotY29vcmRpbmF0ZXMgcGFzc2VkIHRvIHRoZSBoZWlnaHRtYXAgZnVuY3Rpb24uXHJcbiAgICogU3RhbmRhcmQgZnVuY3Rpb24gaXMgdGhlIHNpbXBsZXggbm9pc2UgaW1wbGVtZW50ZWQgd2l0aCBGVURHRSwgYnV0IGFub3RoZXIgZnVuY3Rpb24gY2FuIGJlIGdpdmVuLlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxLTIwMjIgfCBTaW1vbiBTdG9ybC1TY2h1bGtlLCBIRlUsIDIwMjAgfCBNb3JpdHogQmVhdWdyYW5kLCBIRlUsIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTWVzaFRlcnJhaW4gZXh0ZW5kcyBNZXNoIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFRlcnJhaW4pO1xyXG4gICAgcHJvdGVjdGVkIHJlc29sdXRpb246IFZlY3RvcjI7XHJcbiAgICBwcm90ZWN0ZWQgc2NhbGU6IFZlY3RvcjI7XHJcbiAgICBwcm90ZWN0ZWQgc2VlZDogbnVtYmVyO1xyXG4gICAgcHJvdGVjdGVkIGhlaWdodE1hcEZ1bmN0aW9uOiBIZWlnaHRNYXBGdW5jdGlvbiA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hUZXJyYWluXCIsIF9yZXNvbHV0aW9uOiBWZWN0b3IyID0gVmVjdG9yMi5PTkUoMiksIF9zY2FsZUlucHV0OiBWZWN0b3IyID0gVmVjdG9yMi5PTkUoKSwgX2Z1bmN0aW9uT3JTZWVkOiBIZWlnaHRNYXBGdW5jdGlvbiB8IG51bWJlciA9IDApIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZShfcmVzb2x1dGlvbiwgX3NjYWxlSW5wdXQsIF9mdW5jdGlvbk9yU2VlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgdGhpcyBtZXNoIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZShfcmVzb2x1dGlvbjogVmVjdG9yMiA9IFZlY3RvcjIuT05FKDIpLCBfc2NhbGVJbnB1dDogVmVjdG9yMiA9IFZlY3RvcjIuT05FKCksIF9mdW5jdGlvbk9yU2VlZDogSGVpZ2h0TWFwRnVuY3Rpb24gfCBudW1iZXIgPSAwKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgdGhpcy5zZWVkID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLnJlc29sdXRpb24gPSBuZXcgVmVjdG9yMihNYXRoLnJvdW5kKF9yZXNvbHV0aW9uLngpLCBNYXRoLnJvdW5kKF9yZXNvbHV0aW9uLnkpKTtcclxuICAgICAgdGhpcy5zY2FsZSA9IF9zY2FsZUlucHV0LmNsb25lO1xyXG5cclxuICAgICAgaWYgKF9mdW5jdGlvbk9yU2VlZCBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxyXG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwRnVuY3Rpb24gPSBfZnVuY3Rpb25PclNlZWQ7XHJcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiAoX2Z1bmN0aW9uT3JTZWVkKSA9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgdGhpcy5zZWVkID0gX2Z1bmN0aW9uT3JTZWVkO1xyXG4gICAgICAgIGxldCBwcm5nOiBSYW5kb20gPSBuZXcgUmFuZG9tKHRoaXMuc2VlZCk7XHJcbiAgICAgICAgdGhpcy5oZWlnaHRNYXBGdW5jdGlvbiA9IG5ldyBOb2lzZTIoKCkgPT4gcHJuZy5nZXROb3JtKCkpLnNhbXBsZTsgLy8gVE9ETyBjYWxsIFBSTkdcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgdGhpcy5oZWlnaHRNYXBGdW5jdGlvbiA9IG5ldyBOb2lzZTIoKS5zYW1wbGU7XHJcblxyXG4gICAgICB0aGlzLnZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKCk7XHJcbiAgICAgIC8vSXRlcmF0ZSBvdmVyIGVhY2ggY2VsbCB0byBnZW5lcmF0ZSBncmlkIG9mIHZlcnRpY2VzXHJcbiAgICAgIGZvciAobGV0IHo6IG51bWJlciA9IDA7IHogPD0gdGhpcy5yZXNvbHV0aW9uLnk7IHorKykge1xyXG4gICAgICAgIGZvciAobGV0IHg6IG51bWJlciA9IDA7IHggPD0gdGhpcy5yZXNvbHV0aW9uLng7IHgrKykge1xyXG4gICAgICAgICAgbGV0IHhOb3JtOiBudW1iZXIgPSB4IC8gdGhpcy5yZXNvbHV0aW9uLng7XHJcbiAgICAgICAgICBsZXQgek5vcm06IG51bWJlciA9IHogLyB0aGlzLnJlc29sdXRpb24ueTtcclxuICAgICAgICAgIHRoaXMudmVydGljZXMucHVzaChuZXcgVmVydGV4KFxyXG4gICAgICAgICAgICBuZXcgVmVjdG9yMyh4Tm9ybSAtIDAuNSwgdGhpcy5oZWlnaHRNYXBGdW5jdGlvbih4Tm9ybSAqIHRoaXMuc2NhbGUueCwgek5vcm0gKiB0aGlzLnNjYWxlLnkpLCB6Tm9ybSAtIDAuNSksXHJcbiAgICAgICAgICAgIG5ldyBWZWN0b3IyKHhOb3JtLCB6Tm9ybSlcclxuICAgICAgICAgICkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHF1YWRzOiBRdWFkW10gPSBbXTtcclxuICAgICAgbGV0IHNwbGl0OiBRVUFEU1BMSVQgPSBRVUFEU1BMSVQuQVRfMDtcclxuICAgICAgZm9yIChsZXQgejogbnVtYmVyID0gMDsgeiA8IHRoaXMucmVzb2x1dGlvbi55OyB6KyspIHtcclxuICAgICAgICBmb3IgKGxldCB4OiBudW1iZXIgPSAwOyB4IDwgdGhpcy5yZXNvbHV0aW9uLng7IHgrKykge1xyXG4gICAgICAgICAgcXVhZHMucHVzaChuZXcgUXVhZChcclxuICAgICAgICAgICAgdGhpcy52ZXJ0aWNlcyxcclxuICAgICAgICAgICAgKHggKyAwKSArICh6ICsgMCkgKiAodGhpcy5yZXNvbHV0aW9uLnggKyAxKSxcclxuICAgICAgICAgICAgKHggKyAwKSArICh6ICsgMSkgKiAodGhpcy5yZXNvbHV0aW9uLnggKyAxKSxcclxuICAgICAgICAgICAgKHggKyAxKSArICh6ICsgMSkgKiAodGhpcy5yZXNvbHV0aW9uLnggKyAxKSxcclxuICAgICAgICAgICAgKHggKyAxKSArICh6ICsgMCkgKiAodGhpcy5yZXNvbHV0aW9uLnggKyAxKSxcclxuICAgICAgICAgICAgc3BsaXRcclxuICAgICAgICAgICkpO1xyXG4gICAgICAgICAgc3BsaXQgPSAoc3BsaXQgPT0gUVVBRFNQTElULkFUXzApID8gUVVBRFNQTElULkFUXzEgOiBRVUFEU1BMSVQuQVRfMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucmVzb2x1dGlvbi54ICUgMiA9PSAwKSAvLyByZXZlcnNlIGxhc3Qgc3BsaXQgY2hhbmdlIGlmIHgtcmVzb2x1dGlvbiBpcyBldmVuXHJcbiAgICAgICAgICBzcGxpdCA9IChzcGxpdCA9PSBRVUFEU1BMSVQuQVRfMCkgPyBRVUFEU1BMSVQuQVRfMSA6IFFVQURTUExJVC5BVF8wO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZmFjZXMgPSBxdWFkcy5mbGF0TWFwKChfcXVhZDogUXVhZCkgPT4gX3F1YWQuZmFjZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVydGljYWwgcHJvamVjdGlvbiBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24gb250byB0aGUgdGVycmFpbi5cclxuICAgICAqIFBhc3MgdGhlIG92ZXJhbGwgd29ybGQgdHJhbnNmb3JtYXRpb24gb2YgdGhlIHRlcnJhaW4gaWYgdGhlIHBvc2l0aW9uIGlzIGdpdmVuIGluIHdvcmxkIGNvb3JkaW5hdGVzLlxyXG4gICAgICogSWYgYXQgaGFuZCwgcGFzcyB0aGUgaW52ZXJzZSB0b28gdG8gYXZvaWQgdW5uZWNlc3NhcnkgY2FsY3VsYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRUZXJyYWluSW5mbyhfcG9zaXRpb246IFZlY3RvcjMsIF9tdHhXb3JsZDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCksIF9tdHhJbnZlcnNlPzogTWF0cml4NHg0KTogVGVycmFpbkluZm8ge1xyXG4gICAgICBpZiAoIV9tdHhJbnZlcnNlKVxyXG4gICAgICAgIF9tdHhJbnZlcnNlID0gTWF0cml4NHg0LklOVkVSU0UoX210eFdvcmxkKTtcclxuXHJcbiAgICAgIGxldCB0ZXJyYWluSW5mbzogVGVycmFpbkluZm8gPSBuZXcgVGVycmFpbkluZm87XHJcblxyXG4gICAgICBsZXQgcG9zTG9jYWw6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF9wb3NpdGlvbiwgX210eEludmVyc2UsIHRydWUpO1xyXG5cclxuXHJcbiAgICAgIGxldCB6OiBudW1iZXIgPSBNYXRoLmZsb29yKChwb3NMb2NhbC56ICsgMC41KSAqIHRoaXMucmVzb2x1dGlvbi55KTtcclxuICAgICAgbGV0IHg6IG51bWJlciA9IE1hdGguZmxvb3IoKHBvc0xvY2FsLnggKyAwLjUpICogdGhpcy5yZXNvbHV0aW9uLngpO1xyXG4gICAgICBpZiAoeiA8IDAgfHwgeiA+IHRoaXMucmVzb2x1dGlvbi55IC0gMSB8fCB4IDwgMCB8fCB4ID4gdGhpcy5yZXNvbHV0aW9uLnggLSAxKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSAoeiAqIHRoaXMucmVzb2x1dGlvbi54ICsgeCkgKiAyO1xyXG4gICAgICBsZXQgZmFjZTogRmFjZSA9IHRoaXMuZmFjZXNbaW5kZXhdO1xyXG5cclxuICAgICAgbGV0IHJheTogUmF5ID0gbmV3IFJheShWZWN0b3IzLlkoKSwgcG9zTG9jYWwpO1xyXG4gICAgICBsZXQgcG9pbnQ6IFZlY3RvcjMgPSByYXkuaW50ZXJzZWN0RmFjZVBsYW5lKGZhY2UpO1xyXG4gICAgICBpZiAoIWZhY2UuaXNJbnNpZGUocG9pbnQpKSB7XHJcbiAgICAgICAgaW5kZXgrKztcclxuICAgICAgICBmYWNlID0gdGhpcy5mYWNlc1tpbmRleF07XHJcbiAgICAgICAgcG9pbnQgPSByYXkuaW50ZXJzZWN0RmFjZVBsYW5lKGZhY2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0ZXJyYWluSW5mby5pbmRleCA9IGluZGV4O1xyXG4gICAgICB0ZXJyYWluSW5mby5wb3NpdGlvbkZhY2UgPSBwb2ludDtcclxuICAgICAgdGVycmFpbkluZm8ucG9zaXRpb24gPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKHBvaW50LCBfbXR4V29ybGQsIHRydWUpO1xyXG4gICAgICB0ZXJyYWluSW5mby5ub3JtYWwgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKGZhY2Uubm9ybWFsLCBNYXRyaXg0eDQuVFJBTlNQT1NFKF9tdHhJbnZlcnNlKSwgZmFsc2UpO1xyXG4gICAgICB0ZXJyYWluSW5mby5kaXN0YW5jZSA9IF9wb3NpdGlvbi55IC0gdGVycmFpbkluZm8ucG9zaXRpb24ueTtcclxuICAgICAgdGVycmFpbkluZm8uZ3JpZCA9IHRoaXMuZ2V0R3JpZEZyb21GYWNlSW5kZXgoaW5kZXgpO1xyXG4gICAgICByZXR1cm4gdGVycmFpbkluZm87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBncmlkIGNvb3JkaW5hdGVzIG9mIHRoZSBxdWFkIHRoZSBnaXZlbiBmYWNlIGJlbG9uZ3MgdG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRHcmlkRnJvbUZhY2VJbmRleChfaW5kZXg6IG51bWJlcik6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IyID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjIpO1xyXG4gICAgICBsZXQgaVF1YWQ6IG51bWJlciA9IE1hdGguZmxvb3IoX2luZGV4IC8gMik7XHJcbiAgICAgIHJlc3VsdC5zZXQoaVF1YWQgJSB0aGlzLnJlc29sdXRpb24ueSwgTWF0aC5mbG9vcihpUXVhZCAvIHRoaXMucmVzb2x1dGlvbi54KSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSB0d28gZmFjZXMgZm9ybWluZyB0aGUgcXVhZCB0aGUgZ2l2ZW4gZ3JpZCBwb3NpdGlvbiBiZWxvbmdzIHRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RmFjZUluZGljZXNGcm9tR3JpZChfZ3JpZDogVmVjdG9yMik6IG51bWJlcltdIHtcclxuICAgICAgbGV0IGlRdWFkOiBudW1iZXIgPSBfZ3JpZC55ICogMiAqIHRoaXMucmVzb2x1dGlvbi54ICsgX2dyaWQueCAqIDI7XHJcbiAgICAgIHJldHVybiBbaVF1YWQsIGlRdWFkICsgMV07XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNlZWQgPSB0aGlzLnNlZWQ7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24uc2NhbGUgPSB0aGlzLnNjYWxlLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnJlc29sdXRpb24gPSB0aGlzLnJlc29sdXRpb24uc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlc29sdXRpb24uZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ucmVzb2x1dGlvbik7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2NhbGUuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uc2NhbGUpO1xyXG4gICAgICB0aGlzLnNlZWQgPSBfc2VyaWFsaXphdGlvbi5zZWVkO1xyXG4gICAgICB0aGlzLmNyZWF0ZSh0aGlzLnJlc29sdXRpb24sIHRoaXMuc2NhbGUsIHRoaXMuc2VlZCk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlKHRoaXMucmVzb2x1dGlvbiwgdGhpcy5zY2FsZSwgdGhpcy5zZWVkKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxufSIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIk1lc2hUZXJyYWluLnRzXCIvPlxyXG5uYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgYSBwbGFuYXIgR3JpZCBhbmQgYXBwbGllcyBhIEhlaWdodG1hcC1GdW5jdGlvbiB0byBpdC5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMSB8IE1vcml0eiBCZWF1Z3JhbmQsIEhGVSwgMjAyMFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUmVsaWVmIGV4dGVuZHMgTWVzaFRlcnJhaW4ge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoUmVsaWVmKTtcclxuICAgIHByaXZhdGUgdGV4dHVyZTogVGV4dHVyZUltYWdlID0gbnVsbDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFJlbGllZlwiLCBfdGV4dHVyZTogVGV4dHVyZUltYWdlID0gbnVsbCkge1xyXG4gICAgICBzdXBlcihfbmFtZSwgVmVjdG9yMi5PTkUoMiksIHVuZGVmaW5lZCwgKF94OiBudW1iZXIsIF96OiBudW1iZXIpID0+IDApO1xyXG4gICAgICB0aGlzLnNldFRleHR1cmUoX3RleHR1cmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUhlaWdodE1hcEZ1bmN0aW9uKF90ZXh0dXJlOiBUZXh0dXJlSW1hZ2UpOiBIZWlnaHRNYXBGdW5jdGlvbiB7XHJcbiAgICAgIGxldCBhcnJheTogVWludDhDbGFtcGVkQXJyYXkgPSBNZXNoUmVsaWVmLnRleHR1cmVUb0NsYW1wZWRBcnJheShfdGV4dHVyZSk7XHJcbiAgICAgIGxldCBoZWlnaHRNYXBGdW5jdGlvbjogSGVpZ2h0TWFwRnVuY3Rpb24gPSAoX3g6IG51bWJlciwgX3o6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGxldCBwaXhlbDogbnVtYmVyID0gTWF0aC5yb3VuZChfeiAqIF90ZXh0dXJlLmltYWdlLndpZHRoICsgX3gpO1xyXG4gICAgICAgIHJldHVybiBhcnJheVtwaXhlbCAqIDRdIC8gMjU1O1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gaGVpZ2h0TWFwRnVuY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGV4dHVyZVRvQ2xhbXBlZEFycmF5KF90ZXh0dXJlOiBUZXh0dXJlSW1hZ2UpOiBVaW50OENsYW1wZWRBcnJheSB7XHJcbiAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgY2FudmFzLndpZHRoID0gX3RleHR1cmUuaW1hZ2Uud2lkdGg7XHJcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBfdGV4dHVyZS5pbWFnZS5oZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgY3JjOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICBjcmMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgIGNyYy5kcmF3SW1hZ2UoX3RleHR1cmUuaW1hZ2UsIDAsIDApO1xyXG5cclxuICAgICAgcmV0dXJuIGNyYy5nZXRJbWFnZURhdGEoMCwgMCwgX3RleHR1cmUuaW1hZ2Uud2lkdGgsIF90ZXh0dXJlLmltYWdlLmhlaWdodCkuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRleHR1cmUgdG8gYmUgdXNlZCBhcyBoZWlnaHRtYXBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFRleHR1cmUoX3RleHR1cmU6IFRleHR1cmVJbWFnZSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgaWYgKCFfdGV4dHVyZSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRoaXMudGV4dHVyZSA9IF90ZXh0dXJlO1xyXG4gICAgICBsZXQgcmVzb2x1dGlvbjogVmVjdG9yMiA9IF90ZXh0dXJlID8gbmV3IFZlY3RvcjIoX3RleHR1cmUuaW1hZ2Uud2lkdGggLSAxLCBfdGV4dHVyZS5pbWFnZS5oZWlnaHQgLSAxKSA6IHVuZGVmaW5lZDtcclxuICAgICAgc3VwZXIuY3JlYXRlKHJlc29sdXRpb24sIHJlc29sdXRpb24sIE1lc2hSZWxpZWYuY3JlYXRlSGVpZ2h0TWFwRnVuY3Rpb24oX3RleHR1cmUpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLnNlZWQ7XHJcbiAgICAgIGRlbGV0ZSBzZXJpYWxpemF0aW9uLnNjYWxlO1xyXG4gICAgICBkZWxldGUgc2VyaWFsaXphdGlvbi5yZXNvbHV0aW9uO1xyXG5cclxuICAgICAgaWYgKHRoaXMudGV4dHVyZSlcclxuICAgICAgICBzZXJpYWxpemF0aW9uLmlkVGV4dHVyZSA9IHRoaXMudGV4dHVyZS5pZFJlc291cmNlO1xyXG5cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIGlmIChfc2VyaWFsaXphdGlvbi5pZFRleHR1cmUpIHtcclxuICAgICAgICB0aGlzLnRleHR1cmUgPSA8VGV4dHVyZUltYWdlPmF3YWl0IFByb2plY3QuZ2V0UmVzb3VyY2UoX3NlcmlhbGl6YXRpb24uaWRUZXh0dXJlKTtcclxuICAgICAgICB0aGlzLnNldFRleHR1cmUodGhpcy50ZXh0dXJlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLnRleHR1cmUpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZShfbXV0YXRvci50ZXh0dXJlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNlZWQ7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zY2FsZTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnJlc29sdXRpb247XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICB9XHJcbn0iLCIvLyAvPHJlZmVyZW5jZSBwYXRoPVwiTWVzaFBvbHlnb24udHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyBhIHJvdGF0aW9uIG9mIGEgcG9seWdvbiBhcm91bmQgdGhlIHktYXhpc1xyXG4gICAqIGBgYHRleHQgICAgICAgXHJcbiAgICogICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICogICAgICAgICAgICAgICAgICBfICDihpEgMF8xXHJcbiAgICogICAgICAgICAgICAgICAgIOKUgiAgIOKUguKGkngg4pSCMiAgICAgICAgIFxyXG4gICAqICAgICAgICAgICAgICAgICAg4pWyICDilIIgIOKVsTMgICAgICAgICBcclxuICAgKiAgICAgICAgICAgICAgICAgIOKVsSAg4pSCICDilbIgICBcclxuICAgKiAgICAgICAgICAgICAgICAg4pWxX19f4pSCX19f4pWyNCBcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICA1XHJcbiAgICogYGBgXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjEtMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoUm90YXRpb24gZXh0ZW5kcyBNZXNoIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBNZXNoLnJlZ2lzdGVyU3ViY2xhc3MoTWVzaFJvdGF0aW9uKTtcclxuICAgIHByb3RlY3RlZCBzdGF0aWMgdmVydGljZXNEZWZhdWx0OiBWZWN0b3IyW10gPSBbIC8vIGxpbmUgaXMgdGhlIG1pbmltYWwgc2hhcGVcclxuICAgICAgbmV3IFZlY3RvcjIoMC41LCAwLjUpLFxyXG4gICAgICBuZXcgVmVjdG9yMigwLjUsIC0wLjUpXHJcbiAgICBdO1xyXG4gICAgcHJvdGVjdGVkIHNoYXBlOiBNdXRhYmxlQXJyYXk8VmVjdG9yMj4gPSBuZXcgTXV0YWJsZUFycmF5PFZlY3RvcjI+KFZlY3RvcjIpO1xyXG4gICAgcHJvdGVjdGVkIGxvbmdpdHVkZXM6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiTWVzaFJvdGF0aW9uXCIsIF9zaGFwZTogVmVjdG9yMltdID0gTWVzaFJvdGF0aW9uLnZlcnRpY2VzRGVmYXVsdCwgX2xvbmdpdHVkZXM6IG51bWJlciA9IDMpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLnJvdGF0ZShfc2hhcGUsIF9sb25naXR1ZGVzKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJNdXRhdG9yXCIsIHRoaXMuZ2V0TXV0YXRvcigpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IG1pblZlcnRpY2VzKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiAyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zaGFwZSA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplQXJyYXkoVmVjdG9yMiwgdGhpcy5zaGFwZSk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb24ubG9uZ2l0dWRlcyA9IHRoaXMubG9uZ2l0dWRlcztcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBsZXQgc2hhcGU6IFZlY3RvcjJbXSA9IDxWZWN0b3IyW10+YXdhaXQgU2VyaWFsaXplci5kZXNlcmlhbGl6ZUFycmF5KF9zZXJpYWxpemF0aW9uLnNoYXBlKTtcclxuICAgICAgdGhpcy5sb25naXR1ZGVzID0gX3NlcmlhbGl6YXRpb24ubG9uZ2l0dWRlcztcclxuICAgICAgdGhpcy5yb3RhdGUoc2hhcGUsIHRoaXMubG9uZ2l0dWRlcyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIHRoaXMucm90YXRlKHRoaXMuc2hhcGUsIHRoaXMubG9uZ2l0dWRlcyk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuTVVUQVRFKSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgcm90YXRlKF9zaGFwZTogVmVjdG9yMltdLCBfbG9uZ2l0dWRlczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgdGhpcy5zaGFwZSA9IDxNdXRhYmxlQXJyYXk8VmVjdG9yMj4+TXV0YWJsZUFycmF5LmZyb20oX3NoYXBlLm1hcChfdmVydGV4ID0+IF92ZXJ0ZXguY2xvbmUpKTtcclxuICAgICAgdGhpcy5sb25naXR1ZGVzID0gTWF0aC5yb3VuZChfbG9uZ2l0dWRlcyk7XHJcbiAgICAgIGxldCBhbmdsZTogbnVtYmVyID0gMzYwIC8gdGhpcy5sb25naXR1ZGVzO1xyXG4gICAgICBsZXQgbXR4Um90YXRlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT05fWShhbmdsZSk7XHJcbiAgICAgIC8vIGNvcHkgb3JpZ2luYWwgcG9seWdvbiBhcyBWZWN0b3IzIGFycmF5XHJcbiAgICAgIGxldCBwb2x5Z29uOiBWZWN0b3IzW10gPSBbXTtcclxuICAgICAgbGV0IGRpc3RhbmNlczogbnVtYmVyW10gPSBbMF07XHJcbiAgICAgIGxldCB0b3RhbDogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuc2hhcGUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwb2x5Z29uLnB1c2godGhpcy5zaGFwZVtpXS50b1ZlY3RvcjMoKSk7XHJcbiAgICAgICAgaWYgKGkgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgZGlzdGFuY2U6IG51bWJlciA9IFZlY3RvcjIuRElGRkVSRU5DRSh0aGlzLnNoYXBlW2ldLCB0aGlzLnNoYXBlW2kgLSAxXSkubWFnbml0dWRlO1xyXG4gICAgICAgICAgdG90YWwgKz0gZGlzdGFuY2U7XHJcbiAgICAgICAgICBkaXN0YW5jZXMucHVzaCh0b3RhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGRpc3RhbmNlcy5mb3JFYWNoKChfZW50cnksIF9pbmRleCkgPT4geyBkaXN0YW5jZXNbX2luZGV4XSA9IF9lbnRyeSAvIHRvdGFsOyB9KTtcclxuXHJcbiAgICAgIGxldCBuVmVydGljZXNQb2x5Z29uOiBudW1iZXIgPSBwb2x5Z29uLmxlbmd0aDtcclxuXHJcbiAgICAgIGxldCBjbG91ZDogVmVydGljZXMgPSBuZXcgVmVydGljZXMoKTtcclxuICAgICAgZm9yIChsZXQgbG9uZ2l0dWRlOiBudW1iZXIgPSAwOyBsb25naXR1ZGUgPD0gdGhpcy5sb25naXR1ZGVzOyBsb25naXR1ZGUrKykge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBuVmVydGljZXNQb2x5Z29uOyBpKyspIHtcclxuICAgICAgICAgIGxldCB1djogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKGxvbmdpdHVkZSAvIHRoaXMubG9uZ2l0dWRlcywgZGlzdGFuY2VzW2ldKTtcclxuICAgICAgICAgIC8vIFRPRE86IGxhc3Qgc2VjdG9yIHNob3VsZCBvbmx5IGJlIHJlZmVyZW5jZXMgdG8gdGhlIGZpcnN0IG1lcmlkaWFuXHJcbiAgICAgICAgICBpZiAobG9uZ2l0dWRlID09IHRoaXMubG9uZ2l0dWRlcylcclxuICAgICAgICAgICAgY2xvdWQucHVzaChuZXcgVmVydGV4KGksIHV2KSk7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGxvbmdpdHVkZSA+IDAgJiYgdGhpcy5zaGFwZVtpXS54ID09IDApIC8vIHVzZSBhIHNpbmdsZSB2ZXJ0ZXggd2hlbiBpdCdzIG9uIHRoZSByb3RhdGlvbiBheGlzXHJcbiAgICAgICAgICAgICAgY2xvdWQucHVzaChuZXcgVmVydGV4KGksIHV2KSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBjbG91ZC5wdXNoKG5ldyBWZXJ0ZXgocG9seWdvbltpXS5jbG9uZSwgdXYpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcG9seWdvbi5mb3JFYWNoKChfdmVjdG9yOiBWZWN0b3IzKSA9PiBfdmVjdG9yLnRyYW5zZm9ybShtdHhSb3RhdGUpKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIC8vIGNvcHkgaW5kaWNlcyB0byBuZXcgaW5kZXggYXJyYXlcclxuICAgICAgbGV0IGZhY2VzOiBGYWNlW10gPSBbXTtcclxuXHJcbiAgICAgIGZvciAobGV0IGxvbmdpdHVkZTogbnVtYmVyID0gMDsgbG9uZ2l0dWRlIDwgdGhpcy5sb25naXR1ZGVzOyBsb25naXR1ZGUrKykge1xyXG4gICAgICAgIGZvciAobGV0IGxhdGl0dWRlOiBudW1iZXIgPSAwOyBsYXRpdHVkZSA8IG5WZXJ0aWNlc1BvbHlnb24gLSAxOyBsYXRpdHVkZSsrKSB7XHJcbiAgICAgICAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGxvbmdpdHVkZSAqIG5WZXJ0aWNlc1BvbHlnb24gKyBsYXRpdHVkZTtcclxuICAgICAgICAgIGxldCBxdWFkOiBRdWFkID0gbmV3IFF1YWQoY2xvdWQsIHN0YXJ0ICsgMSwgc3RhcnQgKyAxICsgblZlcnRpY2VzUG9seWdvbiwgc3RhcnQgKyBuVmVydGljZXNQb2x5Z29uLCBzdGFydCk7XHJcbiAgICAgICAgICBmYWNlcy5wdXNoKC4uLnF1YWQuZmFjZXMpO1xyXG4gICAgICAgICAgLy8gVE9ETzogY2F0Y2ggaW52YWxpZCBmYWNlcyByaWdodCBoZXJlLi4uXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnZlcnRpY2VzID0gY2xvdWQ7XHJcbiAgICAgIHRoaXMuZmFjZXMgPSBmYWNlcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIFVWIFNwaGVyZSB3aXRoIGEgZ2l2ZW4gbnVtYmVyIG9mIHNlY3RvcnMgYW5kIHN0YWNrcyAoY2xhbXBlZCBhdCAxMjgqMTI4KVxyXG4gICAqIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGh0dHA6Ly93d3cuc29uZ2hvLmNhL29wZW5nbC9nbF9zcGhlcmUuaHRtbFxyXG4gICAqIEBhdXRob3JzIFNpbW9uIFN0b3JsLVNjaHVsa2UsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIwXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hTcGhlcmUgZXh0ZW5kcyBNZXNoUm90YXRpb24ge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IE1lc2gucmVnaXN0ZXJTdWJjbGFzcyhNZXNoU3BoZXJlKTtcclxuICAgIHByaXZhdGUgbGF0aXR1ZGVzOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hTcGhlcmVcIiwgX2xvbmdpdHVkZXM6IG51bWJlciA9IDgsIF9sYXRpdHVkZXM6IG51bWJlciA9IDgpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZShfbG9uZ2l0dWRlcywgX2xhdGl0dWRlcyk7IC8vIFRPRE86IHdoZW4gZGVzZXJpYWxpemVkIHRoaXMgY2F1c2VzIHRoaXMgY2F1c2VzIHRoZSBtZXNoIHRvIGJlIGNyZWF0ZWQgdHdpY2VcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSB0aGlzIHNwaGVyZSB3aXRoIGEgZ2l2ZW4gbnVtYmVyIG9mIGxvbmdpdHVkZXMgYW5kIGxhdGl0dWRlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlKF9sb25naXR1ZGVzOiBudW1iZXIgPSAzLCBfbGF0aXR1ZGVzOiBudW1iZXIgPSAyKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgLy9DbGFtcCByZXNvbHV0aW9uIHRvIHByZXZlbnQgcGVyZm9ybWFuY2UgaXNzdWVzXHJcbiAgICAgIHRoaXMubG9uZ2l0dWRlcyA9IE1hdGgubWluKE1hdGgucm91bmQoX2xvbmdpdHVkZXMpLCAxMjgpO1xyXG4gICAgICB0aGlzLmxhdGl0dWRlcyA9IE1hdGgubWluKE1hdGgucm91bmQoX2xhdGl0dWRlcyksIDEyOCk7XHJcblxyXG4gICAgICBpZiAoX2xvbmdpdHVkZXMgPCAzIHx8IF9sYXRpdHVkZXMgPCAyKSB7XHJcbiAgICAgICAgRGVidWcud2FybihcIlVWIFNwaGVyZSBtdXN0IGhhdmUgYXQgbGVhc3QgMyBsb25naXR1ZGVzIGFuZCAyIGxhdGl0dWRlcyB0byBmb3JtIGEgMy1kaW1lbnNpb25hbCBzaGFwZS5cIik7XHJcbiAgICAgICAgdGhpcy5sb25naXR1ZGVzID0gTWF0aC5tYXgoMywgX2xvbmdpdHVkZXMpO1xyXG4gICAgICAgIHRoaXMubGF0aXR1ZGVzID0gTWF0aC5tYXgoMiwgX2xhdGl0dWRlcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzaGFwZTogVmVjdG9yMltdID0gW107XHJcbiAgICAgIGxldCBzdGVwOiBudW1iZXIgPSBNYXRoLlBJIC8gdGhpcy5sYXRpdHVkZXM7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPD0gdGhpcy5sYXRpdHVkZXM7ICsraSkge1xyXG4gICAgICAgIGxldCBhbmdsZTogbnVtYmVyID0gTWF0aC5QSSAvIDIgLSBpICogc3RlcDtcclxuICAgICAgICBsZXQgeDogbnVtYmVyID0gTWF0aC5jb3MoYW5nbGUpO1xyXG4gICAgICAgIGxldCB5OiBudW1iZXIgPSBNYXRoLnNpbihhbmdsZSk7XHJcblxyXG4gICAgICAgIHNoYXBlLnB1c2gobmV3IFZlY3RvcjIoeCAvIDIsIHkgLyAyKSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGxhY2UgZmlyc3QgYW5kIGxhc3QgdmVydGV4IGV4YWN0bHkgb24gcm90YXRpb24gYXhpc1xyXG4gICAgICBzaGFwZVswXS54ID0gMDtcclxuICAgICAgc2hhcGVbc2hhcGUubGVuZ3RoIC0gMV0ueCA9IDA7XHJcblxyXG4gICAgICBzdXBlci5yb3RhdGUoc2hhcGUsIF9sb25naXR1ZGVzKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBkZWxldGUgc2VyaWFsaXphdGlvbi5zaGFwZTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5sYXRpdHVkZXMgPSB0aGlzLmxhdGl0dWRlcztcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICB0aGlzLmNyZWF0ZShfc2VyaWFsaXphdGlvbi5sb25naXR1ZGVzLCBfc2VyaWFsaXphdGlvbi5sYXRpdHVkZXMpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZSh0aGlzLmxvbmdpdHVkZXMsIHRoaXMubGF0aXR1ZGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNoYXBlO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgdHdvIHF1YWRzIHBsYWNlZCBiYWNrIHRvIGJhY2ssIHRoZSBvbmUgZmFjaW5nIGluIG5lZ2F0aXZlIFotZGlyZWN0aW9uIGlzIHRleHR1cmVkIHJldmVyc2VkXHJcbiAgICogYGBgdGV4dFxyXG4gICAqICAgICAgICAwIF9fIDNcclxuICAgKiAgICAgICAgIHxfX3xcclxuICAgKiAgICAgICAgMSAgICAyICAgICAgICAgICAgIFxyXG4gICAqIGBgYCBcclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBNZXNoU3ByaXRlIGV4dGVuZHMgTWVzaCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hTcHJpdGUpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbmFtZTogc3RyaW5nID0gXCJNZXNoU3ByaXRlXCIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLnZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoLTAuNSwgMC41LCAwKSwgbmV3IFZlY3RvcjIoMCwgMCkpLFxyXG4gICAgICAgIG5ldyBWZXJ0ZXgobmV3IFZlY3RvcjMoLTAuNSwgLTAuNSwgMCksIG5ldyBWZWN0b3IyKDAsIDEpKSxcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuNSwgLTAuNSwgMCksIG5ldyBWZWN0b3IyKDEsIDEpKSxcclxuICAgICAgICBuZXcgVmVydGV4KG5ldyBWZWN0b3IzKDAuNSwgMC41LCAwKSwgbmV3IFZlY3RvcjIoMSwgMCkpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZmFjZXMgPSBbXHJcbiAgICAgICAgbmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgMSwgMiwgMCksXHJcbiAgICAgICAgbmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgMiwgMywgMCksXHJcbiAgICAgICAgbmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgMCwgMywgMSksXHJcbiAgICAgICAgbmV3IEZhY2UodGhpcy52ZXJ0aWNlcywgMywgMiwgMSlcclxuICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmbGF0IGlzIHN0YW5kYXJkIGhlcmUgLy8gVE9ETzogaXMgdGhpcyBzdGlsbCBuZWVkZWQ/XHJcbiAgICBwdWJsaWMgZ2V0IHZlcnRpY2VzRmxhdCgpOiBGbG9hdDMyQXJyYXkgeyByZXR1cm4gdGhpcy5yZW5kZXJNZXNoLnZlcnRpY2VzOyB9XHJcbiAgICBwdWJsaWMgZ2V0IGluZGljZXNGbGF0KCk6IFVpbnQxNkFycmF5IHsgcmV0dXJuIHRoaXMucmVuZGVyTWVzaC5pbmRpY2VzOyB9XHJcblxyXG4gICAgLy8gaW5zdGVhZCwgc21vb3RoIHNoYWRpbmcgd291bGQgbmVlZCBleHRyYSBhdHRlbnRpb24gYnV0IGlzIG5vdCByZWxldmFudC4uLlxyXG5cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIFRvcnVzIHdpdGggYSBnaXZlbiB0aGlja25lc3MgYW5kIHRoZSBudW1iZXIgb2YgbWFqb3ItIGFuZCBtaW5vciBzZWdtZW50c1xyXG4gICAqIEBhdXRob3JzIFNpbW9uIFN0b3JsLVNjaHVsa2UsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIwXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE1lc2hUb3J1cyBleHRlbmRzIE1lc2hSb3RhdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gTWVzaC5yZWdpc3RlclN1YmNsYXNzKE1lc2hUb3J1cyk7XHJcbiAgICBwcml2YXRlIHNpemU6IG51bWJlciA9IDAuMjU7XHJcbiAgICBwcml2YXRlIGxhdGl0dWRlczogbnVtYmVyID0gMTI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcgPSBcIk1lc2hUb3J1c1wiLCBfc2l6ZTogbnVtYmVyID0gMC4yNSwgX2xvbmdpdHVkZXM6IG51bWJlciA9IDgsIF9sYXRpdHVkZXM6IG51bWJlciA9IDYpIHtcclxuICAgICAgc3VwZXIoX25hbWUsIE1lc2hUb3J1cy5nZXRTaGFwZShfc2l6ZSwgTWF0aC5tYXgoMywgX2xhdGl0dWRlcykpLCBfbG9uZ2l0dWRlcyk7XHJcbiAgICAgIHRoaXMuc2l6ZSA9IF9zaXplO1xyXG4gICAgICB0aGlzLmxvbmdpdHVkZXMgPSBfbG9uZ2l0dWRlcztcclxuICAgICAgdGhpcy5sYXRpdHVkZXMgPSBNYXRoLm1heCgzLCBfbGF0aXR1ZGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRTaGFwZShfc2l6ZTogbnVtYmVyLCBfbGF0aXR1ZGVzOiBudW1iZXIpOiBWZWN0b3IyW10ge1xyXG4gICAgICBsZXQgc2hhcGU6IFZlY3RvcjJbXSA9IFtdO1xyXG4gICAgICBsZXQgcmFkaXVzOiBudW1iZXIgPSBfc2l6ZSAvIDI7XHJcbiAgICAgIGxldCBjZW50ZXI6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMigwLjI1ICsgcmFkaXVzLCAwKTtcclxuICAgICAgZm9yIChsZXQgbGF0aXR1ZGU6IG51bWJlciA9IDA7IGxhdGl0dWRlIDw9IF9sYXRpdHVkZXM7IGxhdGl0dWRlKyspIHtcclxuICAgICAgICBsZXQgYW5nbGU6IG51bWJlciA9IDIgKiBNYXRoLlBJICogbGF0aXR1ZGUgLyBfbGF0aXR1ZGVzO1xyXG4gICAgICAgIHNoYXBlLnB1c2goVmVjdG9yMi5TVU0oY2VudGVyLCBuZXcgVmVjdG9yMihyYWRpdXMgKiAtTWF0aC5jb3MoYW5nbGUpLCByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSkpKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHNoYXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIHRoaXMgdG9ydXMgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVyc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlKF9zaXplOiBudW1iZXIgPSAwLjI1LCBfbG9uZ2l0dWRlczogbnVtYmVyID0gOCwgX2xhdGl0dWRlczogbnVtYmVyID0gNik6IHZvaWQge1xyXG4gICAgICB0aGlzLnNpemUgPSBfc2l6ZTtcclxuICAgICAgdGhpcy5sYXRpdHVkZXMgPSBNYXRoLm1heCgzLCBfbGF0aXR1ZGVzKTtcclxuICAgICAgc3VwZXIucm90YXRlKE1lc2hUb3J1cy5nZXRTaGFwZShfc2l6ZSwgX2xhdGl0dWRlcyksIF9sb25naXR1ZGVzKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmxhdGl0dWRlcyA9IHRoaXMubGF0aXR1ZGVzO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnNpemUgPSB0aGlzLnNpemU7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uKTtcclxuICAgICAgdGhpcy5jcmVhdGUoX3NlcmlhbGl6YXRpb24uc2l6ZSwgX3NlcmlhbGl6YXRpb24ubG9uZ2l0dWRlcywgX3NlcmlhbGl6YXRpb24ubGF0aXR1ZGVzKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgICAgdGhpcy5jcmVhdGUodGhpcy5zaXplLCB0aGlzLmxvbmdpdHVkZXMsIHRoaXMubGF0aXR1ZGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVkdWNlTXV0YXRvcihfbXV0YXRvcjogTXV0YXRvcik6IHZvaWQge1xyXG4gICAgICBzdXBlci5yZWR1Y2VNdXRhdG9yKF9tdXRhdG9yKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNoYXBlO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGVudW0gUVVBRFNQTElUIHtcclxuICAgIFBMQU5BUiwgQVRfMCwgQVRfMVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBzdXJmYWNlIGNyZWF0ZWQgd2l0aCBmb3VyIHZlcnRpY2VzIHdoaWNoIGltbWVkaWF0ZWx5IGNyZWF0ZXMgbm9uZSwgb25lIG9yIHR3byB7QGxpbmsgRmFjZX1zIGRlcGVuZGluZyBvbiB2ZXJ0aWNlcyBhdCBpZGVudGljYWwgcG9zaXRpb25zLlxyXG4gICAqIGBgYHRleHRcclxuICAgKiBRVUFEU1BMSVQ6ICBQTEFOQVIgICAgICAgICAgICAgICAgICBBVF8wICAgICAgICAgICAgICAgICAgICAgQVRfMVxyXG4gICAqICAgICAgICAgICAgIDAgXyAzICAgICAgICAgICAgICAgICAgIDAgXyAzICAgICAgICAgICAgICAgICAgICAwIF8gMyAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgKiAgICAgICAgICAgICAgfFxcfCAgICAgICAgICAgICAgICAgICAgIHxcXHwgICAgICAgICAgICAgICAgICAgICAgfC98ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAqICAgICAgICAgICAgIDEg4oC+IDIgICAgICAgICAgICAgICAgICAgMSDigL4gMiAgICAgICAgICAgICAgICAgICAgMSDigL4gMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAqICBzaGFyZWQgbGFzdCB2ZXJ0ZXggMiAgICAgIGxhc3QgdmVydGljZXMgMiArIDMgICAgICBsYXN0IHZlcnRpY2VzIDMgKyAwIFxyXG4gICAqICAgICAgXHJcbiAgICogYGBgIFxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFF1YWQge1xyXG4gICAgcHVibGljIGZhY2VzOiBGYWNlW107XHJcbiAgICAjc3BsaXQ6IFFVQURTUExJVDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3ZlcnRpY2VzOiBWZXJ0aWNlcywgX2luZGV4MDogbnVtYmVyLCBfaW5kZXgxOiBudW1iZXIsIF9pbmRleDI6IG51bWJlciwgX2luZGV4MzogbnVtYmVyLCBfc3BsaXQ6IFFVQURTUExJVCA9IFFVQURTUExJVC5QTEFOQVIpIHtcclxuICAgICAgdGhpcy5mYWNlcyA9IFtdO1xyXG4gICAgICB0aGlzLiNzcGxpdCA9IF9zcGxpdDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoX3NwbGl0ICE9IFFVQURTUExJVC5BVF8xKVxyXG4gICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKF92ZXJ0aWNlcywgX2luZGV4MCwgX2luZGV4MSwgX2luZGV4MikpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuZmFjZXMucHVzaChuZXcgRmFjZShfdmVydGljZXMsIF9pbmRleDEsIF9pbmRleDIsIF9pbmRleDMpKTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHtcclxuICAgICAgICBEZWJ1Zy5mdWRnZShcIkZhY2UgZXhjbHVkZWRcIiwgKDxFcnJvcj5fZSkubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoX3NwbGl0ID09IFFVQURTUExJVC5QTEFOQVIpXHJcbiAgICAgICAgICB0aGlzLmZhY2VzLnB1c2gobmV3IEZhY2UoX3ZlcnRpY2VzLCBfaW5kZXgzLCBfaW5kZXgwLCBfaW5kZXgyKSk7XHJcbiAgICAgICAgZWxzZSBpZiAoX3NwbGl0ID09IFFVQURTUExJVC5BVF8wKVxyXG4gICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKG5ldyBGYWNlKF92ZXJ0aWNlcywgX2luZGV4MCwgX2luZGV4MiwgX2luZGV4MykpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuZmFjZXMucHVzaChuZXcgRmFjZShfdmVydGljZXMsIF9pbmRleDEsIF9pbmRleDMsIF9pbmRleDApKTtcclxuICAgICAgfSBjYXRjaCAoX2U6IHVua25vd24pIHtcclxuICAgICAgICBEZWJ1Zy5mdWRnZShcIkZhY2UgZXhjbHVkZWRcIiwgKDxFcnJvcj5fZSkubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNwbGl0KCk6IFFVQURTUExJVCB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcGxpdDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBCb25lIHtcclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICB3ZWlnaHQ6IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8vIFRPRE86IHRoZSByZWZlciB0byAgZGVzY3JpcHRpb24gaXMgbm8gbG9uZ2VyIGNvcnJlY3QgYXMgcmVmZXIgdG8gYWxzbyB3b3JrcyBmb3IgYm9uZSBpbmRpY2VzXHJcbiAgLyoqXHJcbiAgICogUmVwcmVzZW50cyBhIHZlcnRleCBvZiBhIG1lc2ggd2l0aCBleHRlbmRlZCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSB1diBjb29yZGluYXRlcyBhbmQgdGhlIHZlcnRleCBub3JtYWwuXHJcbiAgICogSXQgbWF5IHJlZmVyIHRvIGFub3RoZXIgdmVydGV4IHZpYSBhbiBpbmRleCBpbnRvIHNvbWUgYXJyYXksIGluIHdoaWNoIGNhc2UgdGhlIHBvc2l0aW9uIGFuZCB0aGUgbm9ybWFsIGFyZSBzdG9yZWQgdGhlcmUuXHJcbiAgICogVGhpcyB3YXksIHZlcnRleCBwb3NpdGlvbiBhbmQgbm9ybWFsIGlzIGEgMToxIGFzc29jaWF0aW9uLCB2ZXJ0ZXggdG8gdGV4dHVyZSBjb29yZGluYXRlcyBhIDE6biBhc3NvY2lhdGlvbi5cclxuICAgKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMlxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBWZXJ0ZXgge1xyXG4gICAgcHVibGljIHBvc2l0aW9uOiBWZWN0b3IzO1xyXG4gICAgcHVibGljIHV2OiBWZWN0b3IyIHwgbnVsbDtcclxuICAgIHB1YmxpYyBub3JtYWw6IFZlY3RvcjM7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG4gICAgcHVibGljIHRhbmdlbnQ6IFZlY3RvcjQgfCBudWxsO1xyXG4gICAgcHVibGljIHJlZmVyVG86IG51bWJlcjtcclxuICAgIHB1YmxpYyBib25lczogQm9uZVtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwcmVzZW50cyBhIHZlcnRleCBvZiBhIG1lc2ggd2l0aCBleHRlbmRlZCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSB1diBjb29yZGluYXRlcyB0aGUgdmVydGV4IG5vcm1hbCBhbmQgaXRzIHRhbmdlbnRzLlxyXG4gICAgICogSXQgbWF5IHJlZmVyIHRvIGFub3RoZXIgdmVydGV4IHZpYSBhbiBpbmRleCBpbnRvIHNvbWUgYXJyYXksIGluIHdoaWNoIGNhc2UgdGhlIHBvc2l0aW9uIGFuZCB0aGUgbm9ybWFsIGFyZSBzdG9yZWQgdGhlcmUuXHJcbiAgICAgKiBUaGlzIHdheSwgdmVydGV4IHBvc2l0aW9uIGFuZCBub3JtYWwgaXMgYSAxOjEgYXNzb2NpYXRpb24sIHZlcnRleCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVzIGEgMTpuIGFzc29jaWF0aW9uLlxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcG9zaXRpb25PckluZGV4OiBWZWN0b3IzIHwgbnVtYmVyLCBfdXY6IFZlY3RvcjIgPSBudWxsLCBfbm9ybWFsOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCksIF90YW5nZW50OiBWZWN0b3I0ID0gbnVsbCwgX2NvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKSwgX2JvbmVzOiBCb25lW10gPSBudWxsKSB7XHJcbiAgICAgIGlmIChfcG9zaXRpb25PckluZGV4IGluc3RhbmNlb2YgVmVjdG9yMylcclxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gX3Bvc2l0aW9uT3JJbmRleDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMucmVmZXJUbyA9IF9wb3NpdGlvbk9ySW5kZXg7XHJcblxyXG4gICAgICB0aGlzLnV2ID0gX3V2O1xyXG4gICAgICB0aGlzLm5vcm1hbCA9IF9ub3JtYWw7XHJcbiAgICAgIHRoaXMudGFuZ2VudCA9IF90YW5nZW50O1xyXG4gICAgICB0aGlzLmNvbG9yID0gX2NvbG9yO1xyXG4gICAgICB0aGlzLmJvbmVzID0gX2JvbmVzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEFycmF5IHdpdGggZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSB0byBzZXJ2ZSBhcyBhIHtAbGluayBWZXJ0ZXh9LWNsb3VkLiBcclxuICAgKiBBY2Nlc3NvcnMgeWllbGQgcG9zaXRpb24gb3Igbm9ybWFsIGFsc28gZm9yIHZlcnRpY2VzIHJlZmVyZW5jaW5nIG90aGVyIHZlcnRpY2VzXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjJcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVmVydGljZXMgZXh0ZW5kcyBBcnJheTxWZXJ0ZXg+IHtcclxuICAgIC8vIFRPRE86IHRoaXMgY2xhc3MgbWF5IGJlY29tZSBtb3JlIHBvd2VyZnVsIGJ5IGhpZGluZyB0aGUgYXJyYXkgYW5kIGFkZCBtb3JlIHNlcnZpY2UgbWV0aG9kcyBsaWtlIGNhbGN1bGF0aW5nIGJvdW5kaW5nIGJveCwgcmFkaXVzIGV0Yy5cclxuICAgIC8vIHNlZSBpZiBhIHByb3h5IG9mIHRoZSBhcnJheSBpbnRlcmZhY2luZyBbXSB3b3VsZCBkbyBhIGdvb2Qgam9iIC0+IHRlc3RlZDogcHJveHkgaXMgYWJvdXQgMjAgdGltZXMgc2xvd2VyIVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc3Vic2V0IG9mIHZlcnRpY2VzIHRoYXQgZG8gbm90IHJlZmVyIHRvIG90aGVyIHZlcnRpY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgb3JpZ2luYWxzKCk6IEFycmF5PFZlcnRleD4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoX3ZlcnRleCA9PiBfdmVydGV4LnJlZmVyVG8gPT0gdW5kZWZpbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgdGhlIHBvc2l0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVydGV4IGFkZHJlc3NlZCwgcmVzb2x2aW5nIHJlZmVyZW5jZXMgYmV0d2VlbiB2ZXJ0aWNlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvc2l0aW9uKF9pbmRleDogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZXJ0ZXg6IFZlcnRleCA9IHRoaXNbX2luZGV4XTtcclxuICAgICAgcmV0dXJuICh2ZXJ0ZXgucmVmZXJUbyA9PSB1bmRlZmluZWQpID8gdmVydGV4LnBvc2l0aW9uIDogdGhpc1t2ZXJ0ZXgucmVmZXJUb10ucG9zaXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIHRoZSBub3JtYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkLCByZXNvbHZpbmcgcmVmZXJlbmNlcyBiZXR3ZWVuIHZlcnRpY2VzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbm9ybWFsKF9pbmRleDogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZXJ0ZXg6IFZlcnRleCA9IHRoaXNbX2luZGV4XTtcclxuICAgICAgcmV0dXJuICh2ZXJ0ZXgucmVmZXJUbyA9PSB1bmRlZmluZWQpID8gdmVydGV4Lm5vcm1hbCA6IHRoaXNbdmVydGV4LnJlZmVyVG9dLm5vcm1hbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgdGhlIHRhbmdlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0YW5nZW50KF9pbmRleDogbnVtYmVyKTogVmVjdG9yNCB7XHJcbiAgICAgIHJldHVybiB0aGlzW19pbmRleF0udGFuZ2VudDsgLy8gdGFuZ2VudHMgY2FuIG5vdCBiZSBzaGFyZWQgYXMgdGhleSBhcmUgZGVwZW5kZW50IG9uIHRoZSB1di1jb29yZGluYXRlc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0aGUgdXYtY29vcmRpbmF0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1dihfaW5kZXg6IG51bWJlcik6IFZlY3RvcjIge1xyXG4gICAgICByZXR1cm4gdGhpc1tfaW5kZXhdLnV2O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0aGUgY29sb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJ0ZXggYWRkcmVzc2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2xvcihfaW5kZXg6IG51bWJlcik6IENvbG9yIHtcclxuICAgICAgcmV0dXJuIHRoaXNbX2luZGV4XS5jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgdGhlIGJvbmVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVydGV4IGFkZHJlc3NlZCwgcmVzb2x2aW5nIHJlZmVyZW5jZXMgYmV0d2VlbiB2ZXJ0aWNlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJvbmVzKF9pbmRleDogbnVtYmVyKTogQm9uZVtdIHtcclxuICAgICAgbGV0IHZlcnRleDogVmVydGV4ID0gdGhpc1tfaW5kZXhdO1xyXG4gICAgICByZXR1cm4gKHZlcnRleC5yZWZlclRvID09IHVuZGVmaW5lZCkgPyB2ZXJ0ZXguYm9uZXMgOiB0aGlzW3ZlcnRleC5yZWZlclRvXS5ib25lcztcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG5hbWVzYXBjZSBmb3IgaGFuZGxpbmcgdGhlIHBhcnRpY2xlIGRhdGFcclxuICAgKi9cclxuICBleHBvcnQgbmFtZXNwYWNlIFBhcnRpY2xlRGF0YSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGEgcGFydGljbGUgc3lzdGVtLiBEZXNjcmliZXMgdGhlIHBhcnRpY2xlIGJlaGF2aW9yIGFuZCBhcHBlYXJhbmNlLlxyXG4gICAgICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFN5c3RlbSB7XHJcbiAgICAgIHZhcmlhYmxlTmFtZXM/OiBzdHJpbmdbXTtcclxuICAgICAgdmFyaWFibGVzPzogRXhwcmVzc2lvbltdOyAvL3sgW25hbWU6IHN0cmluZ106IEV4cHJlc3Npb24gfTtcclxuICAgICAgY29sb3I/OiBFeHByZXNzaW9uW107XHJcbiAgICAgIG10eExvY2FsPzogVHJhbnNmb3JtYXRpb25bXTtcclxuICAgICAgbXR4V29ybGQ/OiBUcmFuc2Zvcm1hdGlvbltdO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCB0eXBlIFJlY3Vyc2l2ZSA9IFN5c3RlbSB8IEV4cHJlc3Npb25bXSB8IFRyYW5zZm9ybWF0aW9uW10gfCBUcmFuc2Zvcm1hdGlvbiB8IEV4cHJlc3Npb247XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgRXhwcmVzc2lvbiA9IEZ1bmN0aW9uIHwgVmFyaWFibGUgfCBDb25zdGFudCB8IENvZGU7XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XHJcbiAgICAgIGZ1bmN0aW9uOiBGVU5DVElPTjtcclxuICAgICAgcGFyYW1ldGVyczogRXhwcmVzc2lvbltdO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGUge1xyXG4gICAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29uc3RhbnQge1xyXG4gICAgICB2YWx1ZTogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZSB7XHJcbiAgICAgIGNvZGU6IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHtcclxuICAgICAgdHJhbnNmb3JtYXRpb246IFwidHJhbnNsYXRlXCIgfCBcInJvdGF0ZVwiIHwgXCJzY2FsZVwiO1xyXG4gICAgICBwYXJhbWV0ZXJzOiBFeHByZXNzaW9uW107XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgRXhwcmVzc2lvbn1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihfZGF0YTogUmVjdXJzaXZlKTogX2RhdGEgaXMgRXhwcmVzc2lvbiB7XHJcbiAgICAgIHJldHVybiBpc0Z1bmN0aW9uKF9kYXRhKSB8fCBpc1ZhcmlhYmxlKF9kYXRhKSB8fCBpc0NvbnN0YW50KF9kYXRhKSB8fCBpc0NvZGUoX2RhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhIGlzIGEge0BsaW5rIEZ1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihfZGF0YTogUmVjdXJzaXZlKTogX2RhdGEgaXMgRnVuY3Rpb24ge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIF9kYXRhID09IFwib2JqZWN0XCIgJiYgXCJmdW5jdGlvblwiIGluIF9kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhIGlzIGEge0BsaW5rIFZhcmlhYmxlfVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNWYXJpYWJsZShfZGF0YTogUmVjdXJzaXZlKTogX2RhdGEgaXMgVmFyaWFibGUge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIF9kYXRhID09IFwib2JqZWN0XCIgJiYgXCJ2YWx1ZVwiIGluIF9kYXRhICYmIHR5cGVvZiBfZGF0YS52YWx1ZSA9PSBcInN0cmluZ1wiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhIGlzIGEge0BsaW5rIENvbnN0YW50fVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDb25zdGFudChfZGF0YTogUmVjdXJzaXZlKTogX2RhdGEgaXMgQ29uc3RhbnQge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIF9kYXRhID09IFwib2JqZWN0XCIgJiYgXCJ2YWx1ZVwiIGluIF9kYXRhICYmIHR5cGVvZiBfZGF0YS52YWx1ZSA9PSBcIm51bWJlclwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhIGlzIGEge0BsaW5rIENvZGV9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvZGUoX2RhdGE6IFJlY3Vyc2l2ZSk6IF9kYXRhIGlzIENvZGUge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIF9kYXRhID09IFwib2JqZWN0XCIgJiYgXCJjb2RlXCIgaW4gX2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGEgaXMgYSB7QGxpbmsgVHJhbnNmb3JtYXRpb259XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zZm9ybWF0aW9uKF9kYXRhOiBSZWN1cnNpdmUpOiBfZGF0YSBpcyBUcmFuc2Zvcm1hdGlvbiB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgX2RhdGEgPT0gXCJvYmplY3RcIiAmJiBcInRyYW5zZm9ybWF0aW9uXCIgaW4gX2RhdGE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIb2xkcyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbXV0YXRlIHRoZSBwYXJ0aWNsZXMgb2YgYSBwYXJ0aWNsZSBzeXN0ZW0uXHJcbiAgICogQSBmdWxsIHBhcnRpY2xlIHN5c3RlbSBpcyBjb21wb3NlZCBieSBhdHRhY2hpbmcgYSB7QGxpbmsgQ29tcG9uZW50UGFydGljbGVTeXN0ZW19LCB7QGxpbmsgQ29tcG9uZW50TWVzaH0gYW5kIHtAbGluayBDb21wb25lbnRNYXRlcmlhbH0gdG8gdGhlIHNhbWUge0BsaW5rIE5vZGV9LiBcclxuICAgKiBBZGRpdGlvbmFsbHkgYSB7QGxpbmsgQ29tcG9uZW50RmFjZUNhbWVyYX0gY2FuIGJlIGF0dGFjaGVkIHRvIG1ha2UgdGhlIHBhcnRpY2xlcyBmYWNlIHRoZSBjYW1lcmEuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIyXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBhcnRpY2xlU3lzdGVtIGV4dGVuZHMgTXV0YWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaWRSZXNvdXJjZTogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICNkYXRhOiBQYXJ0aWNsZURhdGEuU3lzdGVtO1xyXG4gICAgLyoqIE1hcCBvZiBzaGFkZXIgdW5pdmVyc2FsIGRlcml2YXRlcyB0byBjb3JyZXNwb25kaW5nIGNvbXB1dGVkIHtAbGluayBTaGFkZXJQYXJ0aWNsZVN5c3RlbX0uIFxyXG4gICAgICogVGhpcyB3YXkgZWFjaCBwYXJ0aWNsZSBzeXN0ZW0gcmVzb3VyY2UgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBtdWx0aXBsZSBzaGFkZXIgdW5pdmVyc2FsIGRlcml2YXRlcyAqL1xyXG4gICAgI3NoYWRlclRvU2hhZGVyUGFydGljbGVTeXN0ZW06IE1hcDxTaGFkZXJJbnRlcmZhY2UsIFNoYWRlclBhcnRpY2xlU3lzdGVtPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFBhcnRpY2xlU3lzdGVtLm5hbWUsIF9kYXRhOiBQYXJ0aWNsZURhdGEuU3lzdGVtID0ge30pIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5uYW1lID0gX25hbWU7XHJcbiAgICAgIHRoaXMuZGF0YSA9IF9kYXRhO1xyXG5cclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogUGFydGljbGVEYXRhLlN5c3RlbSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZGF0YShfZGF0YTogUGFydGljbGVEYXRhLlN5c3RlbSkge1xyXG4gICAgICB0aGlzLiNkYXRhID0gX2RhdGE7XHJcbiAgICAgIHRoaXMuI3NoYWRlclRvU2hhZGVyUGFydGljbGVTeXN0ZW0uZm9yRWFjaChfc2hhZGVyID0+IF9zaGFkZXIuZGVsZXRlUHJvZ3JhbSgpKTtcclxuICAgICAgdGhpcy4jc2hhZGVyVG9TaGFkZXJQYXJ0aWNsZVN5c3RlbS5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNvcnJlc3BvbmRpbmcge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtfSBmb3IgdGhlIGdpdmVuIHNoYWRlciB1bml2ZXJzYWwgZGVyaXZhdGUuXHJcbiAgICAgKiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtIHRvIHJlbmRlciB0aGUgcGFydGljbGUgc3lzdGVtLlxyXG4gICAgICogQHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIFNoYWRlclBhcnRpY2xlU3lzdGVtfVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTaGFkZXJGcm9tKF9zb3VyY2U6IFNoYWRlckludGVyZmFjZSk6IFNoYWRlclBhcnRpY2xlU3lzdGVtIHtcclxuICAgICAgaWYgKCF0aGlzLiNzaGFkZXJUb1NoYWRlclBhcnRpY2xlU3lzdGVtLmhhcyhfc291cmNlKSkge1xyXG4gICAgICAgIGxldCBwYXJ0aWNsZVNoYWRlcjogU2hhZGVyUGFydGljbGVTeXN0ZW0gPSBuZXcgU2hhZGVyUGFydGljbGVTeXN0ZW0oKTtcclxuICAgICAgICBwYXJ0aWNsZVNoYWRlci5kYXRhID0gdGhpcy5kYXRhO1xyXG4gICAgICAgIHBhcnRpY2xlU2hhZGVyLmRlZmluZSA9IFsuLi5wYXJ0aWNsZVNoYWRlci5kZWZpbmUsIC4uLl9zb3VyY2UuZGVmaW5lXTtcclxuICAgICAgICBwYXJ0aWNsZVNoYWRlci52ZXJ0ZXhTaGFkZXJTb3VyY2UgPSBfc291cmNlLmdldFZlcnRleFNoYWRlclNvdXJjZSgpO1xyXG4gICAgICAgIHBhcnRpY2xlU2hhZGVyLmZyYWdtZW50U2hhZGVyU291cmNlID0gX3NvdXJjZS5nZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpO1xyXG4gICAgICAgIHRoaXMuI3NoYWRlclRvU2hhZGVyUGFydGljbGVTeXN0ZW0uc2V0KF9zb3VyY2UsIHBhcnRpY2xlU2hhZGVyKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI3NoYWRlclRvU2hhZGVyUGFydGljbGVTeXN0ZW0uZ2V0KF9zb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBUcmFuc2ZlclxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgaWRSZXNvdXJjZTogdGhpcy5pZFJlc291cmNlLFxyXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICBkYXRhOiB0aGlzLmRhdGFcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgdGhpcy5kYXRhID0gX3NlcmlhbGl6YXRpb24uZGF0YTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlKCk6IE11dGF0b3JGb3JVc2VySW50ZXJmYWNlIHtcclxuICAgICAgcmV0dXJuIDxNdXRhdG9yRm9yVXNlckludGVyZmFjZT5zdXBlci5nZXRNdXRhdG9yKCk7IC8vIHJlbW92ZSBkYXRhIGZyb20gbXV0YXRvclxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcbiAgICAgIG11dGF0b3IuZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlZHVjZU11dGF0b3IoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkIHtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLmNhY2hlZE11dGF0b3JzO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iuc2hhZGVyTWFwO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgV2ViR0wgc2hhZGVycHJvZ3JhbSBmb3IgYSBwYXJ0aWNsZSBzeXN0ZW0uIE1hbmFnZWQgYnkgYSB7QGxpbmsgUGFydGljbGVTeXN0ZW19LiBJdCB1c2VzIHtAbGluayBQYXJ0aWNsZVN5c3RlbS5kYXRhfSB0byBnZW5lcmF0ZSBhbmQgaW5qZWN0IGNvZGUgaW50byBhIHNoYWRlciB1bml2ZXJzYWwgZGVyaXZhdGUgKEdMU0wpIHRodXMgY3JlYXRpbmcgYSBzaGFkZXIgcGFydGljbGUgc3lzdGVtIGZyb20gYSBzdXBwbGllZCB7QGxpbmsgU2hhZGVyfXMgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgc291cmNlIGNvZGUuXHJcbiAgICogQGF1dGhvciBKb25hcyBQbG90emt5LCBIRlUsIDIwMjJcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbS5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBjbGFzcyBTaGFkZXJQYXJ0aWNsZVN5c3RlbSBpbXBsZW1lbnRzIFNoYWRlckludGVyZmFjZSB7XHJcbiAgICBwdWJsaWMgZGF0YTogUGFydGljbGVEYXRhLlN5c3RlbTtcclxuICAgIHB1YmxpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1wiUEFSVElDTEVcIl07XHJcbiAgICBwdWJsaWMgdmVydGV4U2hhZGVyU291cmNlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZnJhZ21lbnRTaGFkZXJTb3VyY2U6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xyXG4gICAgcHVibGljIGF0dHJpYnV0ZXM6IHsgW25hbWU6IHN0cmluZ106IG51bWJlciB9O1xyXG4gICAgcHVibGljIHVuaWZvcm1zOiB7IFtuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHsgcmV0dXJuIFwiXCI7IC8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbX0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7IHJldHVybiBcIlwiOyAvKiBpbmplY3RlZCBieSBkZWNvcmF0b3IgKi8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5qZWN0ZWQgYnkge0BsaW5rIFJlbmRlckluamVjdG9yU2hhZGVyUGFydGljbGVTeXN0ZW19LiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVQcm9ncmFtKCk6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JTaGFkZXJQYXJ0aWNsZVN5c3RlbX0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVzZVByb2dyYW0oKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgZGVjb3JhdG9yICovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlclBhcnRpY2xlU3lzdGVtfS4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlUHJvZ3JhbSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBkZWNvcmF0b3IgKi8gfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgdGhpcyBub2RlIHRvIGFjY2VzcyB0aGUgd2F5cG9pbnQgZ3JpZCBlc3RhYmxpc2hlZCB0aHJvdWdoIHtAbGluayBDb21wb25lbnRXYXlwb2ludH1zIGFuZCB0aGVpciB7QGxpbmsgQ29ubmVjdGlvbn1zLFxyXG4gICAqIGZpbmQgYSBwYXRoIHRocm91Z2ggdGhlbSBhbmQgZXZlbiB3YWxrIGRvd24gdGhlIHBhdGguXHJcbiAgICogQGF1dGhvciBMdWthcyBTY2hldWVybGUsIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRXYWxrZXIgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IENvbXBvbmVudC5yZWdpc3RlclN1YmNsYXNzKENvbXBvbmVudFdhbGtlcik7XHJcbiAgICAvKiogVGhlIHNwZWVkIHRoZSB3YWxrZXIgc2hvdWxkIG1vdmUgd2l0aC4gQ29ycmVzcG9uZHMgdG8gdW5pdHMvcy4gKi9cclxuICAgIHB1YmxpYyBzcGVlZDogbnVtYmVyID0gMTtcclxuICAgIC8qKiBJZiB0cnVlLCBtb3ZlIHRoZSBub2RlIHRoaXMgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvIHRocm91Z2ggZm9yY2VzIGluc3RlYWQgb2YgZGlyZWN0bHkgdGhyb3VnaCB0aGUgdHJhbnNmb3JtLiBSZXF1aXJlcyBhIFtbQ29tcG9uZW50UmlnaWRib2R5XV0gaWYgdHJ1ZS4gKi9cclxuICAgIC8vIHB1YmxpYyBtb3ZlVGhyb3VnaFBoeXNpY3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKioga2VlcHMgdGhlIGRhdGEgbmVlZGVkIGZvciB0aGUgY3VycmVudCB3YWxrICovXHJcbiAgICAjd2Fsa0RhdGE6IFdhbGtEYXRhID0geyBwYXRoOiBbXSwgdG90YWxQcm9ncmVzczogLTEgfTtcclxuICAgIC8qKiBrZWVwcyB0aGUgcHJvbWlzZSB0byByZXNvbHZlIHdoZW4gdGhlIHdhbGtlciBoYXMgcmVhY2hlZCB0aGUgZ29hbCAqL1xyXG4gICAgI3Byb21pc2VSZXNvbHZlck9uV2Fsa0ZpbmlzaGVkOiAoKSA9PiB2b2lkO1xyXG4gICAgLyoqIHN0YXR1cyBvZiB3aGV0aGVyIGl0IHNob3VsZCByb3RhdGUgdGhlIHdhbGtlciB0byB0aGUgd2Fsa2luZyBkaXJlY3Rpb24gKi9cclxuICAgICNyb3RhdGVJbldhbGtEaXJlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgaWYgKFByb2plY3QubW9kZSA9PSBNT0RFLkVESVRPUilcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLiNoYW5kbGVBdHRhY2guYmluZCh0aGlzKSk7XHJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfUkVNT1ZFLCB0aGlzLiNoYW5kbGVEZXRhY2guYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKSxcclxuICAgICAgICBzcGVlZDogdGhpcy5zcGVlZFxyXG4gICAgICAgIC8vIG1vdmVUaHJvdWdoUGh5c2ljczogdGhpcy5tb3ZlVGhyb3VnaFBoeXNpY3MsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLnNwZWVkID0gX3NlcmlhbGl6YXRpb24uc3BlZWQ7XHJcbiAgICAgIC8vIHRoaXMubW92ZVRocm91Z2hQaHlzaWNzID0gX3NlcmlhbGl6YXRpb24ubW92ZVRocm91Z2hQaHlzaWNzO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsZXBvcnRzIChtb3ZlcyBpbnN0YW50bHkpIHRvIHRoZSBfdGFyZ2V0IFdheXBvaW50LlxyXG4gICAgICogQHBhcmFtIF90YXJnZXRcclxuICAgICAqIEByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbW92ZVRvKF90YXJnZXQ6IFdheXBvaW50KTogUHJvbWlzZTx2b2lkPjtcclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIHdhbGtlciBmcm9tIHRoZSBfc3RhcnQgdG8gdGhlIF9lbmQgV2F5cG9pbnQuXHJcbiAgICAgKiBUZWxlcG9ydHMgKG1vdmVzIGluc3RhbnRseSkgdG8gdGhlIF9zdGFydCBwb2ludCwgdGhlbiBtb3ZlcyB0aHJvdWdoIHRoZSB3YXlwb2ludCBjb25uZWN0aW9ucyB0byB0aGUgX2VuZCBwb2ludC5cclxuICAgICAqIEBwYXJhbSBfc3RhcnQgXHJcbiAgICAgKiBAcGFyYW0gX2VuZFxyXG4gICAgICogQHBhcmFtIF9yb3RhdGUgUm90YXRlcyB0aGUgd2Fsa2VyIHRvIGxvb2sgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgd2F5cG9pbnRcclxuICAgICAqIEByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIF9lbmQgcG9pbnQgaXMgcmVhY2hlZC4gUmVqZWN0cyBpZiBfZW5kIGNhbid0IGJlIHJlYWNoZWQgKG5vIHBhdGggZm91bmQpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbW92ZVRvKF9zdGFydDogV2F5cG9pbnQsIF9lbmQ6IFdheXBvaW50LCBfcm90YXRlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD47XHJcbiAgICBwdWJsaWMgYXN5bmMgbW92ZVRvKF9zdGFydDogV2F5cG9pbnQsIF9lbmQ/OiBXYXlwb2ludCwgX3JvdGF0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICghX3N0YXJ0KSByZXR1cm47XHJcbiAgICAgIGxldCB0cmFuc2xhdGU6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX3N0YXJ0Lm10eFdvcmxkLnRyYW5zbGF0aW9uLCB0aGlzLm5vZGUubXR4V29ybGQudHJhbnNsYXRpb24pO1xyXG4gICAgICB0aGlzLm5vZGUubXR4TG9jYWwudHJhbnNsYXRlKHRyYW5zbGF0ZSk7XHJcbiAgICAgIGlmICghX2VuZCB8fCBfc3RhcnQgPT09IF9lbmQpIHtcclxuICAgICAgICB0aGlzLiN3YWxrRGF0YSA9IHsgcGF0aDogW10sIHRvdGFsUHJvZ3Jlc3M6IC0xIH07XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuI3JvdGF0ZUluV2Fsa0RpcmVjdGlvbiA9IF9yb3RhdGU7XHJcblxyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgbGV0IHBhdGg6IFBhdGhpbmdOb2RlW10gfCBudWxsID0gdGhpcy5nZXRQYXRoKF9zdGFydCwgX2VuZCk7XHJcbiAgICAgICAgaWYgKCFwYXRoIHx8IHBhdGgubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBfcmVqZWN0KCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuI3dhbGtEYXRhID0geyBwYXRoLCB0b3RhbFByb2dyZXNzOiAwIH07XHJcbiAgICAgICAgdGhpcy4jcHJvbWlzZVJlc29sdmVyT25XYWxrRmluaXNoZWQgPSBfcmVzb2x2ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuI3JvdGF0ZUluV2Fsa0RpcmVjdGlvbiAmJiB0aGlzLiN3YWxrRGF0YS5wYXRoLmxlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdGF0ZVRvd2FyZHModGhpcy4jd2Fsa0RhdGEucGF0aFswXS53YXlwb2ludCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGFrZXMgY2FyZSBvZiB0aGUgbW92aW5nIGFsZ29yaXRobSBieSBjYWxjdWxhdGluZyB0aGUgbmV4dCBzdGVwIGFuZCBtb3ZpbmcgYWxvbmcgdGhpcyBzdGVwICovXHJcbiAgICBwcm90ZWN0ZWQgbW92aW5nKCk6IHZvaWQge1xyXG4gICAgICAvLyBhcmUgd2UgY3VycmVudGx5IG1vdmluZz9cclxuICAgICAgaWYgKHRoaXMuI3dhbGtEYXRhLnRvdGFsUHJvZ3Jlc3MgPCAwIHx8IHRoaXMuI3dhbGtEYXRhLnBhdGgubGVuZ3RoID09IDApIHJldHVybjtcclxuICAgICAgLy8gZG8gd2UgaGF2ZSBhIGN1cnJlbnQgcGF0aCB3ZSBjYW4gZm9sbG93XHJcbiAgICAgIGxldCBjdXJyZW50UGF0aDogUGF0aGluZ05vZGUgPSB0aGlzLiN3YWxrRGF0YS5wYXRoW3RoaXMuI3dhbGtEYXRhLnRvdGFsUHJvZ3Jlc3NdO1xyXG4gICAgICBpZiAoIWN1cnJlbnRQYXRoKSByZXR1cm47XHJcblxyXG4gICAgICAvLyBob3cgYmlnIG9mIGEgc3RlcCBhcmUgd2UgdGFraW5nIHRoaXMgZnJhbWU/XHJcbiAgICAgIGxldCBkZWx0YTogbnVtYmVyID0gdGhpcy5zcGVlZCAqIGN1cnJlbnRQYXRoLnByZXZpb3VzQ29ubmVjdGlvbi5zcGVlZE1vZGlmaWVyICogTG9vcC50aW1lRnJhbWVHYW1lIC8gMTAwMDtcclxuICAgICAgLy8gaG93IGZhciBhd2F5IGFyZSB3ZSBmcm9tIHRoZSBuZXh0IHdheXBvaW50P1xyXG4gICAgICBsZXQgc3RlcDogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShcclxuICAgICAgICBjdXJyZW50UGF0aC53YXlwb2ludC5tdHhXb3JsZC50cmFuc2xhdGlvbixcclxuICAgICAgICB0aGlzLm5vZGUubXR4V29ybGQudHJhbnNsYXRpb25cclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIGxldCBzdGVwUm90YXRpb246IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5DT05TVFJVQ1RJT04oc3RlcCk7XHJcbiAgICAgIC8vIHN0ZXBSb3RhdGlvbi5yb3RhdGUodGhpcy5ub2RlLm10eFdvcmxkLnJvdGF0aW9uKTtcclxuICAgICAgLy8gc3RlcCA9IHN0ZXBSb3RhdGlvbi50cmFuc2xhdGlvbjtcclxuXHJcbiAgICAgIGxldCBzY2FsZTogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShcclxuICAgICAgICBjdXJyZW50UGF0aC53YXlwb2ludC5tdHhXb3JsZC5zY2FsaW5nLFxyXG4gICAgICAgIHRoaXMubm9kZS5tdHhXb3JsZC5zY2FsaW5nXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoZGVsdGEgKiBkZWx0YSA8IHN0ZXAubWFnbml0dWRlU3F1YXJlZCkgeyAvLyB3b24ndCByZWFjaCBuZXh0IHdheXBvaW50IHlldC4gVXNpbmcgc3F1YXJlcyBiZWNhdXNlIHRoYXQncyBmYXN0ZXIgdG8gY29tcHV0ZSB0aGFuIHNxcnRcclxuICAgICAgICBzdGVwLm5vcm1hbGl6ZShkZWx0YSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLm10eExvY2FsLnRyYW5zbGF0ZShzdGVwLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHNjYWxlLm1hZ25pdHVkZVNxdWFyZWQgPiAwKSB7XHJcbiAgICAgICAgICBzY2FsZS5ub3JtYWxpemUoZGVsdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vZGUubXR4TG9jYWwuc2NhbGluZyA9IFZlY3RvcjMuU1VNKHNjYWxlLCB0aGlzLm5vZGUubXR4TG9jYWwuc2NhbGluZyk7XHJcbiAgICAgICAgLy8gdGhpcy5ub2RlLm10eExvY2FsLnNjYWxlKFZlY3RvcjMuU1VNKHNjYWxlLCB0aGlzLm5vZGUubXR4TG9jYWwuc2NhbGluZykpO1xyXG4gICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IG1vdmVtZW50IHRocm91Z2ggcGh5c2ljc1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICAvLyByZWFjaGVkIG5leHQgcG9pbnRcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5XQVlQT0lOVF9SRUFDSEVELCB7IGJ1YmJsZXM6IHRydWUsIGRldGFpbDogY3VycmVudFBhdGgud2F5cG9pbnQgfSkpO1xyXG4gICAgICAoPENvbXBvbmVudFdheXBvaW50PmN1cnJlbnRQYXRoLndheXBvaW50KS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5XQVlQT0lOVF9SRUFDSEVELCB7IGJ1YmJsZXM6IHRydWUsIGRldGFpbDogdGhpcyB9KSk7XHJcbiAgICAgIFxyXG4gICAgICBsZXQgdHJhbnNsYXRlOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKGN1cnJlbnRQYXRoLndheXBvaW50Lm10eFdvcmxkLnRyYW5zbGF0aW9uLCB0aGlzLm5vZGUubXR4V29ybGQudHJhbnNsYXRpb24pO1xyXG4gICAgICB0aGlzLm5vZGUubXR4TG9jYWwudHJhbnNsYXRlKHRyYW5zbGF0ZSwgZmFsc2UpO1xyXG4gICAgICB0aGlzLm5vZGUubXR4TG9jYWwuc2NhbGluZyA9IGN1cnJlbnRQYXRoLndheXBvaW50Lm10eFdvcmxkLnNjYWxpbmc7XHJcbiAgICAgIHRoaXMuI3dhbGtEYXRhLnRvdGFsUHJvZ3Jlc3MrKztcclxuXHJcbiAgICAgIC8vIHJlYWNoZWQgZmluYWwgcG9pbnQsIGZpbmlzaGVkIHdhbGtpbmdcclxuICAgICAgaWYgKHRoaXMuI3dhbGtEYXRhLnRvdGFsUHJvZ3Jlc3MgPj0gdGhpcy4jd2Fsa0RhdGEucGF0aC5sZW5ndGgpIHtcclxuICAgICAgICBpZiAodGhpcy4jcHJvbWlzZVJlc29sdmVyT25XYWxrRmluaXNoZWQpIHRoaXMuI3Byb21pc2VSZXNvbHZlck9uV2Fsa0ZpbmlzaGVkKCk7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5QQVRISU5HX0NPTkNMVURFRCwgeyBidWJibGVzOiB0cnVlLCBkZXRhaWw6IGN1cnJlbnRQYXRoLndheXBvaW50IH0pKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNob3VsZCB3ZSByb3RhdGUgd2Fsa2VyP1xyXG4gICAgICBpZiAodGhpcy4jcm90YXRlSW5XYWxrRGlyZWN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5yb3RhdGVUb3dhcmRzKHRoaXMuI3dhbGtEYXRhLnBhdGhbdGhpcy4jd2Fsa0RhdGEudG90YWxQcm9ncmVzc10ud2F5cG9pbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIGZpbmQgdGhlIHBhdGggYmV0d2VlbiB0d28gZ2l2ZW4gd2F5cG9pbnRzICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UGF0aChfc3RhcnQ6IFdheXBvaW50LCBfZW5kOiBXYXlwb2ludCk6IFBhdGhpbmdOb2RlW10ge1xyXG4gICAgICAvLyBUT0RPOiB1c2UgYSBtb3JlIGVmZmljaWVudCBhbGdvcml0aG0gbGlrZSBBKiBpbnN0ZWFkIG9mIERpamtzdHJhXHJcbiAgICAgIC8vIHNldHVwIHRoZSBncmFwaCBvZiBwYXRocyBiYXNlZCBvbiB0aGUgc3RhcnQgbm9kZVxyXG4gICAgICBsZXQgdW52aXNpdGVkTm9kZXM6IFBhdGhpbmdOb2RlW10gPSBbXTtcclxuICAgICAgbGV0IHByb2Nlc3NlZFdheXBvaW50czogV2F5cG9pbnRbXSA9IFtfc3RhcnRdO1xyXG4gICAgICBsZXQgd2F5cG9pbnRzVG9TZWFyY2hUaHJvdWdoOiBXYXlwb2ludFtdID0gW19zdGFydF07XHJcbiAgICAgIGRvIHtcclxuICAgICAgICBsZXQgd2F5cG9pbnQ6IFdheXBvaW50ID0gd2F5cG9pbnRzVG9TZWFyY2hUaHJvdWdoLnBvcCgpO1xyXG4gICAgICAgIGZvciAobGV0IGNvbm5lY3Rpb24gb2Ygd2F5cG9pbnQuY29ubmVjdGlvbnMpIHtcclxuICAgICAgICAgIGlmICghcHJvY2Vzc2VkV2F5cG9pbnRzLmluY2x1ZGVzKGNvbm5lY3Rpb24uZW5kKSAmJiBjb25uZWN0aW9uLnN0YXJ0LmlzQWN0aXZlICYmIGNvbm5lY3Rpb24uZW5kLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHdheXBvaW50c1RvU2VhcmNoVGhyb3VnaC5wdXNoKGNvbm5lY3Rpb24uZW5kKTtcclxuICAgICAgICAgICAgcHJvY2Vzc2VkV2F5cG9pbnRzLnB1c2goY29ubmVjdGlvbi5lbmQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB1bnZpc2l0ZWROb2Rlcy5wdXNoKHsgd2F5cG9pbnQsIGRpc3RhbmNlOiB3YXlwb2ludCA9PT0gX3N0YXJ0ID8gMCA6IEluZmluaXR5LCBwcmV2aW91czogbnVsbCwgcHJldmlvdXNDb25uZWN0aW9uOiBudWxsIH0pO1xyXG4gICAgICB9IHdoaWxlICh3YXlwb2ludHNUb1NlYXJjaFRocm91Z2gubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAvLyBkbyB0aGUgZGlqa3N0cmFcclxuICAgICAgd2hpbGUgKHVudmlzaXRlZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1bnZpc2l0ZWROb2Rlcy5zb3J0KChfYTogUGF0aGluZ05vZGUsIF9iOiBQYXRoaW5nTm9kZSkgPT4gX2EuZGlzdGFuY2UgLSBfYi5kaXN0YW5jZSk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlOiBQYXRoaW5nTm9kZSA9IHVudmlzaXRlZE5vZGVzLnNoaWZ0KCk7XHJcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlLndheXBvaW50ID09PSBfZW5kKSByZXR1cm4gdGhpcy5wYXRoaW5nTm9kZVRvUGF0aChjdXJyZW50Tm9kZSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGNvbiBvZiBjdXJyZW50Tm9kZS53YXlwb2ludC5jb25uZWN0aW9ucykge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGlvblVzYWJsZShjb24pKSBjb250aW51ZTtcclxuICAgICAgICAgIGxldCBlbmROb2RlOiBQYXRoaW5nTm9kZSA9IHVudmlzaXRlZE5vZGVzLmZpbmQoX24gPT4gX24ud2F5cG9pbnQgPT09IGNvbi5lbmQpO1xyXG4gICAgICAgICAgaWYgKCFlbmROb2RlKSBjb250aW51ZTtcclxuICAgICAgICAgIGxldCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY3VycmVudE5vZGUuZGlzdGFuY2UgKyB0aGlzLmNhbGN1bGF0ZUNvbm5lY3Rpb25Db3N0KGNvbik7XHJcbiAgICAgICAgICBpZiAobmV3RGlzdGFuY2UgPj0gZW5kTm9kZS5kaXN0YW5jZSkgY29udGludWU7XHJcbiAgICAgICAgICBlbmROb2RlLmRpc3RhbmNlID0gbmV3RGlzdGFuY2U7XHJcbiAgICAgICAgICBlbmROb2RlLnByZXZpb3VzID0gY3VycmVudE5vZGU7XHJcbiAgICAgICAgICBlbmROb2RlLnByZXZpb3VzQ29ubmVjdGlvbiA9IGNvbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgYSBjb25uZWN0aW9uIGlzIHVzYWJsZSBieSB0aGlzIHNwZWNpZmljIHdhbGtlci5cclxuICAgICAqICoqQWx3YXlzIHJldHVybnMgdHJ1ZSwgdW5sZXNzIG92ZXJ3cml0dGVuIGluIGEgY3VzdG9tIFdhbGtlciBzdWJjbGFzcy4qKlxyXG4gICAgICogQ2FuIGJlIHVzZWQgdG8gaW5mbHVlbmNlIHRoZSBwYXRoZmluZGluZyBhbGdvcml0aG0gZm9yIGN1c3RvbSB3YXlwb2ludCAvIGNvbm5lY3Rpb24gc3lzdGVtcy5cclxuICAgICAqIEBwYXJhbSBfY29ubmVjdGlvbiBBIGNvbm5lY3Rpb24gdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgdXNhYmxlIGJ5IHRoaXMgd2Fsa2VyLCBmYWxzZSBpZiBub3RcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGlzQ29ubmVjdGlvblVzYWJsZShfY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIG5ldyBkaXN0YW5jZSBiYXNlZCBvbiBhIGNvbm5lY3Rpb24uXHJcbiAgICAgKiAqKkFsd2F5cyByZXR1cm5zIHRoZSBwbGFpbiBjb25uZWN0aW9ucyBjb3N0IHVubGVzcyBvdmVyd3JpdHRlbiBpbiBhIGN1c3RvbSB3YWxrZXIgc3ViY2xhc3MuKipcclxuICAgICAqIENhbiBiZSB1c2VkIHRvIGluZmx1ZW5jZSB0aGUgcGF0aGZpbmRpbmcgYWxnb3JpdGhtIGZvciBjdXN0b20gd2F5cG9pbnQgLyBjb25uZWN0aW9uIHN5c3RlbXMuXHJcbiAgICAgKiBAcGFyYW0gX2Nvbm5lY3Rpb24gQSBjb25uZWN0aW9uIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgYW1vdW50IG9mIGNvc3QgYSBjb25uZWN0aW9uIGVuY3VycyB0byB0aGUgY3VycmVudCB3YWxrZXIgb3IgMCBpZiBjb3N0IGlzIG5lZ2F0aXZlLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlQ29ubmVjdGlvbkNvc3QoX2Nvbm5lY3Rpb246IENvbm5lY3Rpb24pOiBudW1iZXIge1xyXG4gICAgICBpZiAoX2Nvbm5lY3Rpb24uY29zdCA+PSAwKVxyXG4gICAgICAgIHJldHVybiBfY29ubmVjdGlvbi5jb3N0O1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBhdGhpbmdOb2RlVG9QYXRoKF9ub2RlOiBQYXRoaW5nTm9kZSk6IFBhdGhpbmdOb2RlW10ge1xyXG4gICAgICBsZXQgcGF0aDogUGF0aGluZ05vZGVbXSA9IFtdO1xyXG4gICAgICBpZiAoIV9ub2RlKSByZXR1cm4gcGF0aDtcclxuICAgICAgZG8ge1xyXG4gICAgICAgIHBhdGgucHVzaChfbm9kZSk7XHJcbiAgICAgICAgX25vZGUgPSBfbm9kZS5wcmV2aW91cztcclxuICAgICAgfSB3aGlsZSAoX25vZGU/LnByZXZpb3VzKTtcclxuICAgICAgcmV0dXJuIHBhdGgucmV2ZXJzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcm90YXRlVG93YXJkcyhfd2F5cG9pbnQ6IFdheXBvaW50KTogdm9pZCB7XHJcbiAgICAgIGxldCBtdHhMb29rOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuTE9PS19BVCh0aGlzLm5vZGUubXR4V29ybGQudHJhbnNsYXRpb24sIF93YXlwb2ludC5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgIHRoaXMubm9kZS5tdHhMb2NhbC5yb3RhdGlvbiA9IG10eExvb2sucm90YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgI2hhbmRsZUF0dGFjaCgpOiB2b2lkIHtcclxuICAgICAgTG9vcC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkxPT1BfRlJBTUUsIHRoaXMubW92aW5nLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgICNoYW5kbGVEZXRhY2goKTogdm9pZCB7XHJcbiAgICAgIExvb3AucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5MT09QX0ZSQU1FLCB0aGlzLm1vdmluZy5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBbiBpbnRlcm5hbCBpbnRlcmZhY2UgdG8gbWFuYWdlIHBhdGhpbmcgZGF0YSBpbnNpZGUgdGhlIFdhbGtlclxyXG4gICAqL1xyXG4gIGludGVyZmFjZSBQYXRoaW5nTm9kZSB7XHJcbiAgICB3YXlwb2ludDogV2F5cG9pbnQ7XHJcbiAgICBkaXN0YW5jZTogbnVtYmVyO1xyXG4gICAgcHJldmlvdXM6IFBhdGhpbmdOb2RlO1xyXG4gICAgcHJldmlvdXNDb25uZWN0aW9uOiBDb25uZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW4gaW50ZXJuYWwgaW50ZXJmYWNlIHRvIG1hbmFnZSB0aGUgZGF0YSBvZiB0aGUgY3VycmVudGx5IHdhbGtlZCBwYXRoXHJcbiAgICovXHJcbiAgaW50ZXJmYWNlIFdhbGtEYXRhIHtcclxuICAgIHBhdGg6IFBhdGhpbmdOb2RlW107XHJcbiAgICB0b3RhbFByb2dyZXNzOiBudW1iZXI7XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIFVuaWZpZXMgV2F5cG9pbnRzIG9mIHRoZSBwYXRoaW5nIGFsZ29yaXRobXNcclxuICAgKiBAYXV0aG9yIEx1a2FzIFNjaGV1ZXJsZSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBXYXlwb2ludCB7XHJcbiAgICBjb25uZWN0aW9uczogQ29ubmVjdGlvbltdO1xyXG4gICAgbXR4TG9jYWw6IE1hdHJpeDR4NDtcclxuICAgIG10eFdvcmxkOiBNYXRyaXg0eDQ7XHJcbiAgICBpc0FjdGl2ZTogYm9vbGVhbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgYSBwb3NpdGlvbiB0aGF0IGEge0BsaW5rIENvbXBvbmVudFdhbGtlcn0gY2FuIHVzZSBhcyBhIHRhcmdldCBwb2ludC5cclxuICAgKiBJbXBsZW1lbnRzIHtAbGluayBXYXlwb2ludH0uXHJcbiAgICogUmVnaXN0ZXJzIGl0c2VsZiB0byBhIHN0YXRpYyBsaXN0IG9mIGFsbCBhdmFpbGFibGUgd2F5cG9pbnRzXHJcbiAgICogQGF1dGhvciBMdWthcyBTY2hldWVybGUsIEhGVSwgMjAyNFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBDb21wb25lbnRXYXlwb2ludCBleHRlbmRzIENvbXBvbmVudCBpbXBsZW1lbnRzIFdheXBvaW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyh0aGlzKTtcclxuICAgIHN0YXRpYyByZWFkb25seSAjd2F5cG9pbnRzOiBDb21wb25lbnRXYXlwb2ludFtdID0gW107XHJcblxyXG4gICAgcHVibGljIG10eExvY2FsOiBNYXRyaXg0eDQ7XHJcblxyXG4gICAgI2Nvbm5lY3Rpb25zOiBDb25uZWN0aW9uW107XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9tdHhJbml0OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKSwgX2Nvbm5lY3Rpb25zOiBDb25uZWN0aW9uW10gPSBbXSkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLiNjb25uZWN0aW9ucyA9IF9jb25uZWN0aW9ucztcclxuICAgICAgdGhpcy5tdHhMb2NhbCA9IF9tdHhJbml0O1xyXG4gICAgICB0aGlzLnNpbmdsZXRvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKFByb2plY3QubW9kZSA9PSBNT0RFLkVESVRPUilcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0FERCwgdGhpcy4jaGFuZGxlQXR0YWNoLmJpbmQodGhpcykpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgdGhpcy4jaGFuZGxlRGV0YWNoLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBbGwgdGhlIHdheXBvaW50cyB0aGF0IGFyZSBjdXJyZW50bHkgbG9hZGVkIGluIHRoZSBzY2VuZS4gKipEbyBub3QgZWRpdCwgdHJlYXQgYXMgcmVhZG9ubHkhKiogKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHdheXBvaW50cygpOiBDb21wb25lbnRXYXlwb2ludFtdIHtcclxuICAgICAgcmV0dXJuIENvbXBvbmVudFdheXBvaW50LiN3YXlwb2ludHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNob3J0aGFuZCB0byBjcmVhdGUgYSBjb25uZWN0aW9uIGJldHdlZW4gdHdvIHtAbGluayBDb21wb25lbnRXYXlwb2ludH1zXHJcbiAgICAgKiBAcGFyYW0gX3N0YXJ0IFRoZSB7QGxpbmsgQ29tcG9uZW50V2F5cG9pbnR9IGZyb20gd2hpY2ggdG8gc3RhcnQgdGhlIGNvbm5lY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0gX2VuZCBUaGUge0BsaW5rIENvbXBvbmVudFdheXBvaW50fSB0byB3aGljaCB0aGUgY29ubmVjdGlvbiBsZWFkcy5cclxuICAgICAqIEBwYXJhbSBfY29zdCBUaGUgY29zdCBvZiB0aGUgY29ubmVjdGlvbi4gVGhlIGhpZ2hlciB0aGUgdmFsdWUsIHRoZSBsZXNzIGxpa2VseSBpdCBpcyB0byBiZSB0YWtlbi4gQ2Fubm90IGJlIG5lZ2F0aXZlLlxyXG4gICAgICogQHBhcmFtIF9zcGVlZE1vZGlmaWVyIEhvdyBmYXN0IHRoZSBjb25uZWN0aW9uIGNhbiBiZSB3YWxrZWQgb24uIERlZmF1bHRzIHRvIDFcclxuICAgICAqIEBwYXJhbSBfYm90aFdheXMgSWYgdHJ1ZSwgY3JlYXRlcyBhIGNvbm5lY3Rpb24gaW4gYm90aCBkaXJlY3Rpb25zLiBEZWZhdWx0OiBmYWxzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZENvbm5lY3Rpb24oX3N0YXJ0OiBDb21wb25lbnRXYXlwb2ludCwgX2VuZDogQ29tcG9uZW50V2F5cG9pbnQsIF9jb3N0OiBudW1iZXIsIF9zcGVlZE1vZGlmaWVyOiBudW1iZXIgPSAxLCBfYm90aFdheXM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICBfc3RhcnQuYWRkQ29ubmVjdGlvbih7IGNvc3Q6IF9jb3N0LCBlbmQ6IF9lbmQsIHN0YXJ0OiBfc3RhcnQsIHNwZWVkTW9kaWZpZXI6IF9zcGVlZE1vZGlmaWVyIH0pO1xyXG4gICAgICBpZiAoX2JvdGhXYXlzKVxyXG4gICAgICAgIF9lbmQuYWRkQ29ubmVjdGlvbih7IGNvc3Q6IF9jb3N0LCBlbmQ6IF9zdGFydCwgc3RhcnQ6IF9lbmQsIHNwZWVkTW9kaWZpZXI6IF9zcGVlZE1vZGlmaWVyIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25zKCk6IENvbm5lY3Rpb25bXSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIGN1cnJlbnQgd29ybGQgcG9zaXRpb24gb2YgdGhlIFdheXBvaW50LiBSZXR1cm5zIGEgbmV3IE1hdHJpeCB3aXRob3V0IGNvbm5lY3Rpb24gdG8gdGhlIFdheXBvaW50ICovXHJcbiAgICBwdWJsaWMgZ2V0IG10eFdvcmxkKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHJldHVybiBNYXRyaXg0eDQuUFJPRFVDVCh0aGlzLm10eExvY2FsLCB0aGlzLm5vZGUubXR4V29ybGQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBZGRzIGEgbmV3IHtAbGluayBDb25uZWN0aW9ufSB0byB0aGlzIHdheXBvaW50ICovXHJcbiAgICBwdWJsaWMgYWRkQ29ubmVjdGlvbihfY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xyXG4gICAgICB0aGlzLiNjb25uZWN0aW9ucy5wdXNoKF9jb25uZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmVtb3ZlcyBhIHtAbGluayBDb25uZWN0aW9ufSBmcm9tIHRoaXMgd2F5cG9pbnQgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDb25uZWN0aW9uKF9jb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gdGhpcy4jY29ubmVjdGlvbnMuaW5kZXhPZihfY29ubmVjdGlvbik7XHJcbiAgICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcclxuICAgICAgdGhpcy4jY29ubmVjdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpLFxyXG4gICAgICAgIG1hdHJpeDogdGhpcy5tdHhMb2NhbC5zZXJpYWxpemUoKSxcclxuICAgICAgICBjb25uZWN0aW9uczogdGhpcy4jY29ubmVjdGlvbnMubWFwKF9jb24gPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbm5lY3Rpb246IFNlcmlhbGl6ZWRDb25uZWN0aW9uID0geyBjb3N0OiBfY29uLmNvc3QsIGVuZDogX2Nvbi5lbmQsIHNwZWVkTW9kaWZpZXI6IF9jb24uc3BlZWRNb2RpZmllciB9O1xyXG4gICAgICAgICAgaWYgKGNvbm5lY3Rpb24uZW5kIGluc3RhbmNlb2YgQ29tcG9uZW50V2F5cG9pbnQpIHtcclxuICAgICAgICAgICAgY29ubmVjdGlvbi5lbmQgPSBOb2RlLlBBVEhfRlJPTV9UTyh0aGlzLCBjb25uZWN0aW9uLmVuZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcclxuICAgICAgICB9KVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLm10eExvY2FsLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLm1hdHJpeCk7XHJcbiAgICAgIGNvbnN0IGhuZE5vZGVEZXNlcmlhbGl6ZWQ6IEV2ZW50TGlzdGVuZXJVbmlmaWVkID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb25zID0gX3NlcmlhbGl6YXRpb24uY29ubmVjdGlvbnMubWFwKChfY29uOiBTZXJpYWxpemVkQ29ubmVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbm5lY3Rpb246IENvbm5lY3Rpb24gPSB7IGNvc3Q6IF9jb24uY29zdCwgZW5kOiB0aGlzLnNlcmlhbGl6ZWRXYXlwb2ludFRvV2F5cG9pbnQoX2Nvbi5lbmQpLCBzcGVlZE1vZGlmaWVyOiBfY29uLnNwZWVkTW9kaWZpZXIsIHN0YXJ0OiB0aGlzIH07XHJcbiAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIGhuZE5vZGVEZXNlcmlhbGl6ZWQpO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuTk9ERV9ERVNFUklBTElaRUQsIGhuZE5vZGVEZXNlcmlhbGl6ZWQpO1xyXG4gICAgICBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkcmF3R2l6bW9zKCk6IHZvaWQge1xyXG4gICAgICBsZXQgc2NhbGVWZWN0b3I6IFZlY3RvcjMgPSBWZWN0b3IzLlNDQUxFKFZlY3RvcjMuT05FKCksIDAuMSk7XHJcbiAgICAgIGxldCBtdHg6IE1hdHJpeDR4NCA9IHRoaXMubXR4V29ybGQ7XHJcbiAgICAgIEdpem1vcy5kcmF3U3BoZXJlKE1hdHJpeDR4NC5DT01QT1NJVElPTihtdHgudHJhbnNsYXRpb24sIFZlY3RvcjMuWkVSTygpLCBzY2FsZVZlY3RvciksIENvbG9yLkNTUyhcIm9yYW5nZVwiKSk7XHJcbiAgICAgIC8vIHJldHVybjtcclxuICAgICAgbGV0IGxpbmVzOiBWZWN0b3IzW10gPSBbXTtcclxuICAgICAgZm9yIChsZXQgY29ubmVjdGlvbiBvZiB0aGlzLmNvbm5lY3Rpb25zKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIHN0YXJ0IGFuZCBlbmQgcG9pbnQgYXJlIG9uIHRoZSBzYW1lIHBvaW50LCBkb24ndCBkcmF3IGxpbmUuXHJcbiAgICAgICAgbGV0IHRtcE10eDogTWF0cml4NHg0ID0gY29ubmVjdGlvbi5lbmQubXR4V29ybGQuY2xvbmU7XHJcbiAgICAgICAgbGV0IGRpcmVjdGlvblZlY3RvcjogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRShtdHgudHJhbnNsYXRpb24sIHRtcE10eC50cmFuc2xhdGlvbik7XHJcbiAgICAgICAgaWYgKGRpcmVjdGlvblZlY3Rvci5tYWduaXR1ZGVTcXVhcmVkID09PSAwKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgLy8gaWYgb25lIG9mIHRoZSB3YXlwb2ludHMgaXMgaW5hY3RpdmUsIGRvbid0IGRyYXcgZ2l6bW9zXHJcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmVuZC5pc0FjdGl2ZSB8fCAhY29ubmVjdGlvbi5zdGFydC5pc0FjdGl2ZSkgY29udGludWU7XHJcblxyXG4gICAgICAgIC8vIGFjdHVhbCBsaW5lXHJcbiAgICAgICAgbGluZXMucHVzaChtdHgudHJhbnNsYXRpb24pO1xyXG4gICAgICAgIGxpbmVzLnB1c2godG1wTXR4LnRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgICAgLy8gYXJyb3cgaGVhZHNcclxuICAgICAgICBsZXQgZGlyZWN0aW9uTXR4OiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuTE9PS19JTih0bXBNdHgudHJhbnNsYXRpb24sIGRpcmVjdGlvblZlY3Rvcik7XHJcbiAgICAgICAgZGlyZWN0aW9uTXR4LnNjYWxlKHNjYWxlVmVjdG9yKTtcclxuICAgICAgICBHaXptb3MuZHJhd1dpcmVDb25lKGRpcmVjdGlvbk10eCwgQ29sb3IuQ1NTKFwib3JhbmdlXCIpKTtcclxuICAgICAgfVxyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKGxpbmVzLCBNYXRyaXg0eDQuSURFTlRJVFkoKSwgQ29sb3IuQ1NTKFwib3JhbmdlXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQW4gaW50ZXJuYWwgZnVuY3Rpb24gdG8gaGVscCB0aGUgZGVzZXJpYWxpemF6dGlvbiBwcm9jZXNzLiAqL1xyXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVkV2F5cG9pbnRUb1dheXBvaW50KF9wb2ludDogc3RyaW5nIHwgV2F5cG9pbnQpOiBXYXlwb2ludCB7XHJcbiAgICAgIGlmICh0eXBlb2YgX3BvaW50ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gX3BvaW50O1xyXG4gICAgICByZXR1cm4gTm9kZS5GSU5EKHRoaXMsIF9wb2ludCkgYXMgQ29tcG9uZW50V2F5cG9pbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgI2hhbmRsZUF0dGFjaCgpOiB2b2lkIHtcclxuICAgICAgQ29tcG9uZW50V2F5cG9pbnQuI3dheXBvaW50cy5wdXNoKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgICNoYW5kbGVEZXRhY2goKTogdm9pZCB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gQ29tcG9uZW50V2F5cG9pbnQuI3dheXBvaW50cy5pbmRleE9mKHRoaXMpO1xyXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgIENvbXBvbmVudFdheXBvaW50LiN3YXlwb2ludHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIERlZmluZXMgYSBDb25uZWN0aW9uIGluIHRoZSB3YXkgaXQncyBzZXJpYWxpemVkIGluIHJlc291cmNlcyBAaW50ZXJuYWwgKi9cclxuICBpbnRlcmZhY2UgU2VyaWFsaXplZENvbm5lY3Rpb24ge1xyXG4gICAgZW5kOiBXYXlwb2ludCB8IHN0cmluZztcclxuICAgIGNvc3Q6IG51bWJlcjtcclxuICAgIHNwZWVkTW9kaWZpZXI6IG51bWJlcjtcclxuICB9XHJcbn1cclxuIiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQSBkaXJlY3RlZCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIHdheXBvaW50c1xyXG4gICAqIEBhdXRob3IgTHVrYXMgU2NoZXVlcmxlLCBIRlUsIDIwMjRcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb24ge1xyXG4gICAgLyoqIFRoZSBzdGFydCAvIG9yaWdpbiB3YXlwb2ludCBvZiB0aGlzIGNvbm5lY3Rpb24uICovXHJcbiAgICBzdGFydDogV2F5cG9pbnQ7XHJcbiAgICAvKiogVGhlIGVuZCAvIHRhcmdldCB3YXlwb2ludCBvZiB0aGlzIGNvbm5lY3Rpb24uICovXHJcbiAgICBlbmQ6IFdheXBvaW50O1xyXG4gICAgLyoqIFRoZSBjb3N0IG9mIHRoZSBjb25uZWN0aW9uLCB0aGUgaGlnaGVyIHRoZSBsZXNzIGxpa2VseSB0byBiZSB0YWtlbi4gQ2Fubm90IGJlIG5lZ2F0aXZlLiAqL1xyXG4gICAgY29zdDogbnVtYmVyO1xyXG4gICAgLyoqIE1vZGlmaWVzIHRoZSBzcGVlZCB0aGF0IGEgd2Fsa2VyIGNhbiB3YWxrIHBhc3QgdGhpcyBjb25uZWN0aW9uIGJ5IG11bHRpcGx5aW5nIHRoZSBzcGVlZCB3aXRoIHRoaXMgdmFsdWUuIE5lZWRzIHRvIGJlID4wICovXHJcbiAgICBzcGVlZE1vZGlmaWVyOiBudW1iZXI7XHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgYXV0b21hdGljIGFkanVzdG1lbnQgb2YgdGhlIGNvbGxpZGVyXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gQk9EWV9JTklUIHtcclxuICAgIC8qKiBDb2xsaWRlciB1c2VzIHRoZSBwaXZvdCBvZiB0aGUgbWVzaCBmb3IgaW5pdGlsaWFsaXphdGlvbiAqL1xyXG4gICAgVE9fTUVTSCxcclxuICAgIC8qKiBDb2xsaWRlciB1c2VzIHRoZSB0cmFuc2Zvcm0gb2YgdGhlIG5vZGUgZm9yIGluaXRpbGlhbGl6YXRpb24gKi9cclxuICAgIFRPX05PREUsXHJcbiAgICAvKiogQ29sbGlkZXIgdXNlcyBpdHMgb3duIHBpdm90IGZvciBpbml0aWxpYWxpemF0aW9uICovXHJcbiAgICBUT19QSVZPVFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWN0cyBhcyB0aGUgcGh5c2ljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBOb2RlfSBpdCdzIGF0dGFjaGVkIHRvLlxyXG4gICAqIEl0J3MgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgRlVER0UgcmVuZGVyZWQgd29ybGQgYW5kIHRoZSBQaHlzaWNzIHdvcmxkLlxyXG4gICAqIEZvciB0aGUgcGh5c2ljcyB0byBjb3JyZWN0bHkgZ2V0IHRoZSB0cmFuc2Zvcm1hdGlvbnMgcm90YXRpb25zIG5lZWQgdG8gYmUgYXBwbGllZCB3aXRoIGZyb20gbGVmdCA9IHRydWUuXHJcbiAgICogT3Igcm90YXRpb25zIG5lZWQgdG8gaGFwcGVuIGJlZm9yZSBzY2FsaW5nLlxyXG4gICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQ29tcG9uZW50UmlnaWRib2R5IGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBDb21wb25lbnQucmVnaXN0ZXJTdWJjbGFzcyhDb21wb25lbnRSaWdpZGJvZHkpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWFwQm9keVR5cGU6IHsgW3R5cGU6IG51bWJlcl06IG51bWJlciB9ID0gKHR5cGVvZiBPSU1PID09IFwidW5kZWZpbmVkXCIpID9cclxuICAgICAge1xyXG4gICAgICAgIFtCT0RZX1RZUEUuRFlOQU1JQ106IEJPRFlfVFlQRS5EWU5BTUlDLCBbQk9EWV9UWVBFLlNUQVRJQ106IEJPRFlfVFlQRS5TVEFUSUMsIFtCT0RZX1RZUEUuS0lORU1BVElDXTogQk9EWV9UWVBFLktJTkVNQVRJQ1xyXG4gICAgICB9IDoge1xyXG4gICAgICAgIFtCT0RZX1RZUEUuRFlOQU1JQ106IE9JTU8uUmlnaWRCb2R5VHlwZS5EWU5BTUlDLCBbQk9EWV9UWVBFLlNUQVRJQ106IE9JTU8uUmlnaWRCb2R5VHlwZS5TVEFUSUMsIFtCT0RZX1RZUEUuS0lORU1BVElDXTogT0lNTy5SaWdpZEJvZHlUeXBlLktJTkVNQVRJQ1xyXG4gICAgICB9O1xyXG5cclxuICAgIC8qKiBUcmFuc2Zvcm1hdGlvbiBvZiB0aGUgY29sbGlkZXIgcmVsYXRpdmUgdG8gdGhlIG5vZGUncyB0cmFuc2Zvcm0uIE9uY2Ugc2V0IG1vc3RseSByZW1haW5zIGNvbnN0YW50LiBcclxuICAgICAqIElmIGFsdGVyZWQsIHtAbGluayBpc0luaXRpYWxpemVkfSBtdXN0IGJlIHJlc2V0IHRvIGZhbHNlIHRvIHJlY3JlYXRlIHRoZSBjb2xsaWRlciBpbiB0aGUgbmV4dCB7QGxpbmsgUmVuZGVyLnByZXBhcmV9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdHhQaXZvdDogTWF0cml4NHg0ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogVmVydGljZXMgdGhhdCBidWlsZCBhIGNvbnZleCBtZXNoIChmb3JtIHRoYXQgaXMgaW4gaXRzZWxmIGNsb3NlZCkuIE5lZWRzIHRvIHNldCBpbiB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSByYiBpZiBub25lIG9mIHRoZSBzdGFuZGFyZCBjb2xsaWRlcnMgaXMgdXNlZC4gXHJcbiAgICAgKiBVbnRlc3RlZCBhbmQgbm90IHlldCBmdWxseSBzdXBwb3J0ZWQgYnkgc2VyaWFsaXphdGlvbiBhbmQgbXV0YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb252ZXhNZXNoOiBGbG9hdDMyQXJyYXkgPSBudWxsO1xyXG5cclxuICAgIC8qKiBDb2xsaXNpb25zIHdpdGggcmlnaWRib2RpZXMgaGFwcGVuaW5nIHRvIHRoaXMgYm9keSwgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBjdXN0b20gb25Db2xsaXNpb25TdGF5IGZ1bmN0aW9uYWxpdHkuICovXHJcbiAgICBwdWJsaWMgY29sbGlzaW9uczogQ29tcG9uZW50UmlnaWRib2R5W10gPSBuZXcgQXJyYXkoKTtcclxuICAgIC8qKiBUcmlnZ2VycyB0aGF0IGFyZSBjdXJyZW50bHkgdHJpZ2dlcmluZyB0aGlzIGJvZHkgKi9cclxuICAgIHB1YmxpYyB0cmlnZ2VyaW5nczogQ29tcG9uZW50UmlnaWRib2R5W10gPSBuZXcgQXJyYXkoKTtcclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBUaGUgZ3JvdXBzIHRoaXMgb2JqZWN0IGNvbGxpZGVzIHdpdGguIEdyb3VwcyBtdXN0IGJlIHdyaXRlbiBpbiBmb3JtIG9mXHJcbiAgICAgKiAgZS5nLiBjb2xsaXNpb25NYXNrID0ge0BsaW5rIENPTExJU0lPTl9HUk9VUC5ERUZBVUxUfSB8IHtAbGluayBDT0xMSVNJT05fR1JPVVB9Li4uLiBhbmQgc28gb24gdG8gY29sbGlkZSB3aXRoIG11bHRpcGxlIGdyb3Vwcy4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2xsaXNpb25NYXNrOiBudW1iZXI7XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQXV0b21hdGljIGFkanVzdG1lbnQgb2YgdGhlIHBpdm90IHdoZW4ge0BsaW5rIFJlbmRlci5wcmVwYXJlfSBpcyBjYWxsZWQgYWNjb3JkaW5nIHRvIHtAbGluayBCT0RZX0lOSVR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0aWFsaXphdGlvbjogQk9EWV9JTklUID0gQk9EWV9JTklULlRPX1BJVk9UO1xyXG4gICAgLyoqIE1hcmtzIGlmIGNvbGxpZGVyIHdhcyBpbml0aWFsaXplZC4gUmVzZXQgdG8gZmFsc2UgdG8gaW5pdGlhbGl6ZSBhZ2FpbiBlLmcuIGFmdGVyIG1hbmlwdWxhdGlvbiBvZiBtdHhQaXZvdCAqL1xyXG4gICAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSUQgdG8gcmVmZXJlbmNlIHRoaXMgc3BlY2lmaWMgQ29tcG9uZW50UmlnaWRib2R5ICovXHJcbiAgICAjaWQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy9Qcml2YXRlIGluZm9ybWF0aW9ucyAtIE1vc3RseSBPaW1vUGh5c2ljcyB2YXJpYWJsZXMgdGhhdCBzaG91bGQgbm90IGJlIGV4cG9zZWQgdG8gdGhlIEZVREdFIFVzZXIgYW5kIG1hbmlwdWxhdGVkIGJ5IHRoZW1cclxuICAgICNjb2xsaWRlcjogT0lNTy5TaGFwZTtcclxuICAgICNjb2xsaWRlckluZm86IE9JTU8uU2hhcGVDb25maWc7XHJcbiAgICAjY29sbGlzaW9uR3JvdXA6IENPTExJU0lPTl9HUk9VUCA9IENPTExJU0lPTl9HUk9VUC5ERUZBVUxUO1xyXG4gICAgI3R5cGVDb2xsaWRlcjogQ09MTElERVJfVFlQRSA9IENPTExJREVSX1RZUEUuQ1VCRTtcclxuXHJcbiAgICAjcmlnaWRib2R5OiBPSU1PLlJpZ2lkQm9keTtcclxuICAgICNyaWdpZGJvZHlJbmZvOiBPSU1PLlJpZ2lkQm9keUNvbmZpZyA9IG5ldyBPSU1PLlJpZ2lkQm9keUNvbmZpZygpO1xyXG4gICAgI3R5cGVCb2R5OiBCT0RZX1RZUEUgPSBCT0RZX1RZUEUuRFlOQU1JQztcclxuXHJcbiAgICAjbWFzc0RhdGE6IE9JTU8uTWFzc0RhdGEgPSBuZXcgT0lNTy5NYXNzRGF0YSgpO1xyXG4gICAgI3Jlc3RpdHV0aW9uOiBudW1iZXI7XHJcbiAgICAjZnJpY3Rpb246IG51bWJlcjtcclxuICAgICNkYW1waW5nTGluZWFyOiBudW1iZXIgPSAwLjE7XHJcbiAgICAjZGFtcGluZ0FuZ3VsYXI6IG51bWJlciA9IDAuMTtcclxuICAgICNlZmZlY3RSb3RhdGlvbjogVmVjdG9yMyA9IFZlY3RvcjMuT05FKCk7XHJcbiAgICAjZWZmZWN0R3Jhdml0eTogbnVtYmVyID0gMTtcclxuICAgICNpc1RyaWdnZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICNtdHhQaXZvdFVuc2NhbGVkOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSURFTlRJVFkoKTtcclxuICAgICNtdHhQaXZvdEludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG5cclxuICAgICNjYWxsYmFja3M6IE9JTU8uQ29udGFjdENhbGxiYWNrOyAvL0NhbGxiYWNrIE1ldGhvZHMgd2hlbiB3aXRoaW4gdGhlIG9pbW9TeXN0ZW0gYSBldmVudCBpcyBoYXBwZW5pbmdcclxuXHJcbiAgICAvLyAjcGh5c2ljczogUGh5c2ljczsgLy9UT0RPOiBrZWVwIGEgcG9pbnRlciB0byB0aGUgcGh5c2ljcyBpbnN0YW5jZSB1c2VkIGJ5IHRoaXMgY29tcG9uZW50XHJcblxyXG4gICAgLyoqIENyZWF0aW5nIGEgbmV3IHJpZ2lkYm9keSB3aXRoIGEgd2VpZ2h0IGluIGtnLCBhIHBoeXNpY3MgdHlwZSAoZGVmYXVsdCA9IGR5bmFtaWMpLCBhIGNvbGxpZGVyIHR5cGUgd2hhdCBwaHlzaWNhbCBmb3JtIGhhcyB0aGUgY29sbGlkZXIsIHRvIHdoYXQgZ3JvdXAgZG9lcyBpdCBiZWxvbmcsIGlzIHRoZXJlIGEgdHJhbnNmb3JtIE1hdHJpeCB0aGF0IHNob3VsZCBiZSB1c2VkLCBhbmQgaXMgdGhlIGNvbGxpZGVyIGRlZmluZWQgYXMgYSBncm91cCBvZiBwb2ludHMgdGhhdCByZXByZXNlbnQgYSBjb252ZXggbWVzaC4gKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfbWFzczogbnVtYmVyID0gMSwgX3R5cGU6IEJPRFlfVFlQRSA9IEJPRFlfVFlQRS5EWU5BTUlDLCBfY29sbGlkZXJUeXBlOiBDT0xMSURFUl9UWVBFID0gQ09MTElERVJfVFlQRS5DVUJFLCBfZ3JvdXA6IENPTExJU0lPTl9HUk9VUCA9IFBoeXNpY3Muc2V0dGluZ3MuZGVmYXVsdENvbGxpc2lvbkdyb3VwLCBfbXR4VHJhbnNmb3JtOiBNYXRyaXg0eDQgPSBudWxsLCBfY29udmV4TWVzaDogRmxvYXQzMkFycmF5ID0gbnVsbCkge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICB0aGlzLmNyZWF0ZShfbWFzcywgX3R5cGUsIF9jb2xsaWRlclR5cGUsIF9ncm91cCwgX210eFRyYW5zZm9ybSwgX2NvbnZleE1lc2gpO1xyXG5cclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9BREQsIHRoaXMuaG5kRXZlbnQpO1xyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX1JFTU9WRSwgdGhpcy5obmRFdmVudCk7XHJcbiAgICAgIC8vIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5OT0RFX0RFU0VSSUFMSVpFRCwgdGhpcy5obmRFdmVudCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gQWNjZXNzb3JzXHJcbiAgICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNpZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVXNlZCBmb3IgY2FsY3VsYXRpb24gb2YgdGhlIGdlb21ldHJpY2FsIHJlbGF0aW9uc2hpcCBvZiBub2RlIGFuZCBjb2xsaWRlciBieSB7QGxpbmsgUmVuZGVyfSovXHJcbiAgICBwdWJsaWMgZ2V0IG10eFBpdm90SW52ZXJzZSgpOiBNYXRyaXg0eDQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbXR4UGl2b3RJbnZlcnNlO1xyXG4gICAgfVxyXG4gICAgLyoqIFVzZWQgZm9yIGNhbGN1bGF0aW9uIG9mIHRoZSBnZW9tZXRyaWNhbCByZWxhdGlvbnNoaXAgb2Ygbm9kZSBhbmQgY29sbGlkZXIgYnkge0BsaW5rIFJlbmRlcn0qL1xyXG4gICAgcHVibGljIGdldCBtdHhQaXZvdFVuc2NhbGVkKCk6IE1hdHJpeDR4NCB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtdHhQaXZvdFVuc2NhbGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXRyaWV2ZSB0aGUgYm9keSB0eXBlLiBTZWUge0BsaW5rIEJPRFlfVFlQRX0gKi9cclxuICAgIHB1YmxpYyBnZXQgdHlwZUJvZHkoKTogQk9EWV9UWVBFIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3R5cGVCb2R5O1xyXG4gICAgfVxyXG4gICAgLyoqIFNldCB0aGUgYm9keSB0eXBlLiBTZWUge0BsaW5rIEJPRFlfVFlQRX0gKi9cclxuICAgIHB1YmxpYyBzZXQgdHlwZUJvZHkoX3ZhbHVlOiBCT0RZX1RZUEUpIHtcclxuICAgICAgdGhpcy4jdHlwZUJvZHkgPSBfdmFsdWU7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRUeXBlKENvbXBvbmVudFJpZ2lkYm9keS5tYXBCb2R5VHlwZVt0aGlzLiN0eXBlQm9keV0pO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TWFzc0RhdGEodGhpcy4jbWFzc0RhdGEpOyAvL2hhdmUgdG8gcmVzZXQgbWFzcyBhZnRlciBjaGFuZ2luZyB0aGUgdHlwZSwgc2luY2UgT2ltbyBpcyBoYW5kbGluZyBtYXNzIGludGVybmFsbHkgd3Jvbmcgd2hlbiBzd2l0Y2hpbmcgdHlwZXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIHNoYXBlIHRoYXQgcmVwcmVzZW50cyB0aGUge0BsaW5rIE5vZGV9IGluIHRoZSBwaHlzaWNhbCB3b3JsZC4gRGVmYXVsdCBpcyBhIEN1YmUuICovXHJcbiAgICBwdWJsaWMgZ2V0IHR5cGVDb2xsaWRlcigpOiBDT0xMSURFUl9UWVBFIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3R5cGVDb2xsaWRlcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdHlwZUNvbGxpZGVyKF92YWx1ZTogQ09MTElERVJfVFlQRSkge1xyXG4gICAgICBpZiAoX3ZhbHVlICE9IHRoaXMuI3R5cGVDb2xsaWRlciAmJiB0aGlzLiNyaWdpZGJvZHkgIT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuI3R5cGVDb2xsaWRlciA9IF92YWx1ZTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgY29sbGlzaW9uIGdyb3VwIHRoaXMge0BsaW5rIE5vZGV9IGJlbG9uZ3MgdG8gaXQncyB0aGUgZGVmYXVsdCBncm91cCBub3JtYWxseSB3aGljaCBtZWFucyBpdCBwaHlzaWNhbGx5IGNvbGxpZGVzIHdpdGggZXZlcnkgZ3JvdXAgYmVzaWRlcyB0cmlnZ2VyLiAqL1xyXG4gICAgcHVibGljIGdldCBjb2xsaXNpb25Hcm91cCgpOiBDT0xMSVNJT05fR1JPVVAge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY29sbGlzaW9uR3JvdXA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGNvbGxpc2lvbkdyb3VwKF92YWx1ZTogQ09MTElTSU9OX0dST1VQKSB7XHJcbiAgICAgIHRoaXMuI2NvbGxpc2lvbkdyb3VwID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy4jcmlnaWRib2R5ICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpLnNldENvbGxpc2lvbkdyb3VwKHRoaXMuI2NvbGxpc2lvbkdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogTWFya2luZyB0aGUgQm9keSBhcyBhIHRyaWdnZXIgdGhlcmVmb3JlIG5vdCBpbmZsdWVuY2luZyB0aGUgY29sbGlzaW9uIHN5c3RlbSBidXQgb25seSBzZW5kaW5nIHRyaWdnZXJFdmVudHMgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNUcmlnZ2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaXNUcmlnZ2VyO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBpc1RyaWdnZXIoX3ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgIHRoaXMuI2lzVHJpZ2dlciA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuZ2V0T2ltb1JpZ2lkYm9keSgpICE9IG51bGwpIHtcclxuICAgICAgICB0aGlzLmdldE9pbW9SaWdpZGJvZHkoKS5faXNUcmlnZ2VyID0gdGhpcy4jaXNUcmlnZ2VyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwaHlzaWNhbCB3ZWlnaHQgb2YgdGhlIHtAbGluayBOb2RlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1hc3MoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JpZ2lkYm9keS5nZXRNYXNzKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNldHRpbmcgdGhlIHBoeXNpY2FsIHdlaWdodCBvZiB0aGUge0BsaW5rIE5vZGV9IGluIGtnXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgbWFzcyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtYXNzRGF0YS5tYXNzID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5ub2RlICE9IG51bGwpXHJcbiAgICAgICAgaWYgKHRoaXMuI3JpZ2lkYm9keSAhPSBudWxsKVxyXG4gICAgICAgICAgdGhpcy4jcmlnaWRib2R5LnNldE1hc3NEYXRhKHRoaXMuI21hc3NEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRHJhZyBvZiBsaW5lYXIgbW92ZW1lbnQuIEEgQm9keSBkb2VzIHNsb3cgZG93biBldmVuIG9uIGEgc3VyZmFjZSB3aXRob3V0IGZyaWN0aW9uLiAqL1xyXG4gICAgcHVibGljIGdldCBkYW1wVHJhbnNsYXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JpZ2lkYm9keS5nZXRMaW5lYXJEYW1waW5nKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGRhbXBUcmFuc2xhdGlvbihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNkYW1waW5nTGluZWFyID0gX3ZhbHVlO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TGluZWFyRGFtcGluZyhfdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBEcmFnIG9mIHJvdGF0aW9uLiAqL1xyXG4gICAgcHVibGljIGdldCBkYW1wUm90YXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JpZ2lkYm9keS5nZXRBbmd1bGFyRGFtcGluZygpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBkYW1wUm90YXRpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jZGFtcGluZ0FuZ3VsYXIgPSBfdmFsdWU7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRBbmd1bGFyRGFtcGluZyhfdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgZmFjdG9yIHRoaXMgcmlnaWRib2R5IHJlYWN0cyByb3RhdGlvbnMgdGhhdCBoYXBwZW4gaW4gdGhlIHBoeXNpY2FsIHdvcmxkLiAwIHRvIGxvY2sgcm90YXRpb24gdGhpcyBheGlzLiAqL1xyXG4gICAgcHVibGljIGdldCBlZmZlY3RSb3RhdGlvbigpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2VmZmVjdFJvdGF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBlZmZlY3RSb3RhdGlvbihfZWZmZWN0OiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMuI2VmZmVjdFJvdGF0aW9uID0gX2VmZmVjdDtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldFJvdGF0aW9uRmFjdG9yKG5ldyBPSU1PLlZlYzModGhpcy4jZWZmZWN0Um90YXRpb24ueCwgdGhpcy4jZWZmZWN0Um90YXRpb24ueSwgdGhpcy4jZWZmZWN0Um90YXRpb24ueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgZmFjdG9yIHRoaXMgcmlnaWRib2R5IHJlYWN0cyB0byB3b3JsZCBncmF2aXR5LiBEZWZhdWx0ID0gMSBlLmcuIDEqOS44MSBtL3MuICovXHJcbiAgICBwdWJsaWMgZ2V0IGVmZmVjdEdyYXZpdHkoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2VmZmVjdEdyYXZpdHk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGVmZmVjdEdyYXZpdHkoX2VmZmVjdDogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI2VmZmVjdEdyYXZpdHkgPSBfZWZmZWN0O1xyXG4gICAgICBpZiAodGhpcy4jcmlnaWRib2R5ICE9IG51bGwpIHRoaXMuI3JpZ2lkYm9keS5zZXRHcmF2aXR5U2NhbGUodGhpcy4jZWZmZWN0R3Jhdml0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGZyaWN0aW9uIG9mIHRoZSByaWdpZGJvZHksIHdoaWNoIGlzIHRoZSBmYWN0b3Igb2Ygc2xpZGluZyByZXNpc3RhbmNlIG9mIHRoaXMgcmlnaWRib2R5IG9uIHN1cmZhY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZnJpY3Rpb24oKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2ZyaWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBmcmljdGlvbiBvZiB0aGUgcmlnaWRib2R5LCB3aGljaCBpcyB0aGUgZmFjdG9yIG9mICBzbGlkaW5nIHJlc2lzdGFuY2Ugb2YgdGhpcyByaWdpZGJvZHkgb24gc3VyZmFjZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBmcmljdGlvbihfZnJpY3Rpb246IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNmcmljdGlvbiA9IF9mcmljdGlvbjtcclxuICAgICAgaWYgKHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKSAhPSBudWxsKVxyXG4gICAgICAgIHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKS5zZXRGcmljdGlvbih0aGlzLiNmcmljdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHJlc3RpdHV0aW9uIG9mIHRoZSByaWdpZGJvZHksIHdoaWNoIGlzIHRoZSBmYWN0b3Igb2YgYm91bmNpbmVzcyBvZiB0aGlzIHJpZ2lkYm9keSBvbiBzdXJmYWNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJlc3RpdHV0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyZXN0aXR1dGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgcmVzdGl0dXRpb24gb2YgdGhlIHJpZ2lkYm9keSwgd2hpY2ggaXMgdGhlIGZhY3RvciBvZiBib3VuY2luZXNzIG9mIHRoaXMgcmlnaWRib2R5IG9uIHN1cmZhY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgcmVzdGl0dXRpb24oX3Jlc3RpdHV0aW9uOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcmVzdGl0dXRpb24gPSBfcmVzdGl0dXRpb247XHJcbiAgICAgIGlmICh0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkgIT0gbnVsbClcclxuICAgICAgICB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuc2V0UmVzdGl0dXRpb24odGhpcy4jcmVzdGl0dXRpb24pO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmb3JtYXRpb25cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmlnaWRib2R5IGluIHRoZSBmb3JtIHRoZSBwaHlzaWNzIGVuZ2luZSBpcyB1c2luZyBpdCwgc2hvdWxkIG5vdCBiZSB1c2VkIHVubGVzcyBhIGZ1bmN0aW9uYWxpdHlcclxuICAgICAqIGlzIG5vdCBwcm92aWRlZCB0aHJvdWdoIHRoZSBGVURHRSBJbnRlZ3JhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE9pbW9SaWdpZGJvZHkoKTogT0lNTy5SaWdpZEJvZHkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jcmlnaWRib2R5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSb3RhdGluZyB0aGUgcmlnaWRib2R5IHRoZXJlZm9yZSBjaGFuZ2luZyBpdCdzIHJvdGF0aW9uIG92ZXIgdGltZSBkaXJlY3RseSBpbiBwaHlzaWNzLiBUaGlzIHdheSBwaHlzaWNzIGlzIGNoYW5naW5nIGluc3RlYWQgb2YgdHJhbnNmb3JtLiBcclxuICAgICAqICBCdXQgeW91IGFyZSBhYmxlIHRvIGluY3JlbWVudGFsIGNoYW5naW5nIGl0IGluc3RlYWQgb2YgYSBkaXJlY3Qgcm90YXRpb24uICBBbHRob3VnaCBpdCdzIGFsd2F5cyBwcmVmZXJlZCB0byB1c2UgZm9yY2VzIGluIHBoeXNpY3MuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3RhdGVCb2R5KF9yb3RhdGlvbkNoYW5nZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkucm90YXRlWHl6KG5ldyBPSU1PLlZlYzMoX3JvdGF0aW9uQ2hhbmdlLnggKiBDYWxjLmRlZzJyYWQsIF9yb3RhdGlvbkNoYW5nZS55ICogQ2FsYy5kZWcycmFkLCBfcm90YXRpb25DaGFuZ2UueiAqIENhbGMuZGVnMnJhZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUcmFuc2xhdGluZyB0aGUgcmlnaWRib2R5IHRoZXJlZm9yZSBjaGFuZ2luZyBpdCdzIHBsYWNlIG92ZXIgdGltZSBkaXJlY3RseSBpbiBwaHlzaWNzLiBUaGlzIHdheSBwaHlzaWNzIGlzIGNoYW5naW5nIGluc3RlYWQgb2YgdHJhbnNmb3JtLiBcclxuICAgICAqICBCdXQgeW91IGFyZSBhYmxlIHRvIGluY3JlbWVudGFsbHkgY2hhbmdpbmcgaXQgaW5zdGVhZCBvZiBhIGRpcmVjdCBwb3NpdGlvbi4gQWx0aG91Z2ggaXQncyBhbHdheXMgcHJlZmVyZWQgdG8gdXNlIGZvcmNlcyBpbiBwaHlzaWNzLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZUJvZHkoX3RyYW5zbGF0aW9uQ2hhbmdlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS50cmFuc2xhdGUobmV3IE9JTU8uVmVjMyhfdHJhbnNsYXRpb25DaGFuZ2UueCwgX3RyYW5zbGF0aW9uQ2hhbmdlLnksIF90cmFuc2xhdGlvbkNoYW5nZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgUE9TSVRJT04gb2YgdGhlIHtAbGluayBOb2RlfSBpbiB0aGUgcGh5c2ljYWwgc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFBvc2l0aW9uKCk6IFZlY3RvcjMge1xyXG4gICAgICBsZXQgdG1wUG9zOiBPSU1PLlZlYzMgPSB0aGlzLiNyaWdpZGJvZHkuZ2V0UG9zaXRpb24oKTtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRtcFBvcy54LCB0bXBQb3MueSwgdG1wUG9zLnopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBQT1NJVElPTiBvZiB0aGUge0BsaW5rIE5vZGV9IGluIHRoZSBwaHlzaWNhbCBzcGFjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0UG9zaXRpb24oX3ZhbHVlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRQb3NpdGlvbihuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgY3VycmVudCBST1RBVElPTiBvZiB0aGUge0BsaW5rIE5vZGV9IGluIHRoZSBwaHlzaWNhbCBzcGFjZS4gTm90ZSB0aGlzIHJhbmdlIGZyb20gLXBpIHRvIHBpLCBzbyAtOTAgdG8gOTAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSb3RhdGlvbigpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uOiBPSU1PLlF1YXQgPSB0aGlzLiNyaWdpZGJvZHkuZ2V0T3JpZW50YXRpb24oKTtcclxuICAgICAgbGV0IHRtcFF1YXQ6IFF1YXRlcm5pb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgIHRtcFF1YXQuc2V0KG9yaWVudGF0aW9uLngsIG9yaWVudGF0aW9uLnksIG9yaWVudGF0aW9uLnosIG9yaWVudGF0aW9uLncpO1xyXG4gICAgICBsZXQgZXVsZXJBbmdsZXM6IFZlY3RvcjMgPSB0bXBRdWF0LmV1bGVyQW5nbGVzLmNsb25lO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZSh0bXBRdWF0KTtcclxuICAgICAgcmV0dXJuIGV1bGVyQW5nbGVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBST1RBVElPTiBvZiB0aGUge0BsaW5rIE5vZGV9IGluIHRoZSBwaHlzaWNhbCBzcGFjZSwgaW4gZGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Um90YXRpb24oX3ZhbHVlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIGxldCBxdWF0OiBPSU1PLlF1YXQgPSBuZXcgT0lNTy5RdWF0KCk7XHJcbiAgICAgIGxldCBtdHhSb3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICBtdHhSb3Qucm90YXRlKG5ldyBWZWN0b3IzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopKTtcclxuICAgICAgbGV0IGFycmF5OiBGbG9hdDMyQXJyYXkgPSBtdHhSb3QuZ2V0KCk7XHJcbiAgICAgIGxldCByb3Q6IE9JTU8uTWF0MyA9IG5ldyBPSU1PLk1hdDMoYXJyYXlbMF0sIGFycmF5WzRdLCBhcnJheVs4XSwgYXJyYXlbMV0sIGFycmF5WzVdLCBhcnJheVs5XSwgYXJyYXlbMl0sIGFycmF5WzZdLCBhcnJheVsxMF0pO1xyXG4gICAgICBxdWF0LmZyb21NYXQzKHJvdCk7XHJcbiAgICAgIC8vIHF1YXQubm9ybWFsaXplKCk7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRPcmllbnRhdGlvbihxdWF0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSBjdXJyZW50IFNDQUxJTkcgaW4gdGhlIHBoeXNpY2FsIHNwYWNlLiAqL1xyXG4gICAgcHVibGljIGdldFNjYWxpbmcoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gdGhpcy5ub2RlLm10eFdvcmxkLnNjYWxpbmcuY2xvbmU7XHJcbiAgICAgIHNjYWxpbmcueCAqPSB0aGlzLm10eFBpdm90LnNjYWxpbmcueDtcclxuICAgICAgc2NhbGluZy55ICo9IHRoaXMubXR4UGl2b3Quc2NhbGluZy55O1xyXG4gICAgICBzY2FsaW5nLnogKj0gdGhpcy5tdHhQaXZvdC5zY2FsaW5nLno7XHJcbiAgICAgIHJldHVybiBzY2FsaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTY2FsaW5nIHJlcXVpcmVzIHRoZSBjb2xsaWRlciB0byBiZSBjb21wbGV0ZWx5IHJlY3JlYXRlZCBhbmV3ICovXHJcbiAgICBwdWJsaWMgc2V0U2NhbGluZyhfdmFsdWU6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgLy8gbGV0IHNjYWxpbmc6IFZlY3RvcjMgPSBfdmFsdWUuY2xvbmU7ICAgXHJcbiAgICAgIHRoaXMuY3JlYXRlQ29sbGlkZXIobmV3IE9JTU8uVmVjMyhfdmFsdWUueCAvIDIsIF92YWx1ZS55IC8gMiwgX3ZhbHVlLnogLyAyKSwgdGhpcy4jdHlwZUNvbGxpZGVyKTsgLy9yZWNyZWF0ZSB0aGUgY29sbGlkZXJcclxuICAgICAgdGhpcy4jY29sbGlkZXIgPSBuZXcgT0lNTy5TaGFwZSh0aGlzLiNjb2xsaWRlckluZm8pO1xyXG4gICAgICBsZXQgb2xkQ29sbGlkZXI6IE9JTU8uU2hhcGUgPSB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCk7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5hZGRTaGFwZSh0aGlzLiNjb2xsaWRlcik7IC8vYWRkIG5ldyBjb2xsaWRlciwgYmVmb3JlIHJlbW92aW5nIHRoZSBvbGQsIHNvIHRoZSByYiBpcyBuZXZlciBhY3RpdmUgd2l0aCAwIGNvbGxpZGVyc1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkucmVtb3ZlU2hhcGUob2xkQ29sbGlkZXIpOyAvL3JlbW92ZSB0aGUgb2xkIGNvbGxpZGVyXHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnVzZXJEYXRhID0gdGhpczsgLy9yZXNldCB0aGUgZXh0cmEgaW5mb3JtYXRpb24gc28gdGhhdCB0aGlzIGNvbGxpZGVyIGtub3dzIHRvIHdoaWNoIEZVREdFIENvbXBvbmVudCBpdCdzIGNvbm5lY3RlZFxyXG4gICAgICB0aGlzLiNjb2xsaWRlci5zZXRDb2xsaXNpb25Hcm91cCh0aGlzLmNvbGxpc2lvbkdyb3VwKTtcclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0Q29sbGlzaW9uTWFzayh0aGlzLmNvbGxpc2lvbk1hc2spO1xyXG5cclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0UmVzdGl0dXRpb24odGhpcy4jcmVzdGl0dXRpb24pO1xyXG4gICAgICB0aGlzLiNjb2xsaWRlci5zZXRGcmljdGlvbih0aGlzLiNmcmljdGlvbik7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnNldENvbnRhY3RDYWxsYmFjayh0aGlzLiNjYWxsYmFja3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZXMgdGhlIHJpZ2lkYm9keSBhY2NvcmRpbmcgdG8gaXRzIGluaXRpYWxpemF0aW9uIHNldHRpbmcgdG8gbWF0Y2ggdGhlIG1lc2gsIHRoZSBub2RlIG9yIGl0cyBvd24gcGl2b3QgbWF0cml4XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMubm9kZSkgLy8gZGVsYXkgaW5pdGlhbGl6YXRpb24gdW50aWwgdGhpcyByaWdpZGJvZHkgaXMgYXR0YWNoZWQgdG8gYSBub2RlXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBzd2l0Y2ggKE51bWJlcih0aGlzLmluaXRpYWxpemF0aW9uKSkge1xyXG4gICAgICAgIGNhc2UgQk9EWV9JTklULlRPX05PREU6XHJcbiAgICAgICAgICB0aGlzLm10eFBpdm90ID0gTWF0cml4NHg0LklERU5USVRZKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJPRFlfSU5JVC5UT19NRVNIOlxyXG4gICAgICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICAgICAgaWYgKGNtcE1lc2gpXHJcbiAgICAgICAgICAgIHRoaXMubXR4UGl2b3QgPSBjbXBNZXNoLm10eFBpdm90LmNsb25lO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBCT0RZX0lOSVQuVE9fUElWT1Q6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBsZXQgbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKHRoaXMubm9kZS5tdHhXb3JsZCwgdGhpcy5tdHhQaXZvdCk7XHJcblxyXG4gICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBtdHhXb3JsZC50cmFuc2xhdGlvbjsgLy9BZGRpbmcgdGhlIG9mZnNldHMgZnJvbSB0aGUgcGl2b3RcclxuICAgICAgbGV0IHJvdGF0aW9uOiBWZWN0b3IzID0gbXR4V29ybGQucm90YXRpb247XHJcbiAgICAgIGxldCBzY2FsaW5nOiBWZWN0b3IzID0gbXR4V29ybGQuc2NhbGluZztcclxuICAgICAgLy9zY2FsaW5nIHJlcXVpcmVzIGNvbGxpZGVyIHRvIGJlIHJlY3JlYXRlZFxyXG4gICAgICB0aGlzLnNldFNjYWxpbmcoc2NhbGluZyk7XHJcblxyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TWFzc0RhdGEodGhpcy4jbWFzc0RhdGEpO1xyXG4gICAgICB0aGlzLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsgLy9zZXQgdGhlIGFjdHVhbCBuZXcgcm90YXRpb24vcG9zaXRpb24gZm9yIHRoaXMgUmIgYWdhaW4gc2luY2UgaXQncyBub3cgdXBkYXRlZFxyXG4gICAgICB0aGlzLnNldFJvdGF0aW9uKHJvdGF0aW9uKTtcclxuXHJcbiAgICAgIGxldCBzY2FsaW5nSW52ZXJzZTogVmVjdG9yMyA9IHRoaXMubm9kZS5tdHhXb3JsZC5zY2FsaW5nLm1hcChfaSA9PiAxIC8gX2kpO1xyXG4gICAgICB0aGlzLiNtdHhQaXZvdFVuc2NhbGVkID0gTWF0cml4NHg0LkNPTVBPU0lUSU9OKHRoaXMubXR4UGl2b3QudHJhbnNsYXRpb24sIHRoaXMubXR4UGl2b3Qucm90YXRpb24sIHNjYWxpbmdJbnZlcnNlKTtcclxuICAgICAgdGhpcy4jbXR4UGl2b3RJbnZlcnNlID0gTWF0cml4NHg0LklOVkVSU0UodGhpcy4jbXR4UGl2b3RVbnNjYWxlZCk7XHJcblxyXG4gICAgICB0aGlzLmFkZFJpZ2lkYm9keVRvV29ybGQoKTtcclxuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBWZWxvY2l0eSBhbmQgRm9yY2VzXHJcbiAgICAvKipcclxuICAgICogR2V0IHRoZSBjdXJyZW50IFZFTE9DSVRZIG9mIHRoZSB7QGxpbmsgTm9kZX1cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmVsb2NpdHkoKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB2ZWxvY2l0eTogT0lNTy5WZWMzID0gdGhpcy4jcmlnaWRib2R5LmdldExpbmVhclZlbG9jaXR5KCk7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IFZFTE9DSVRZIG9mIHRoZSB7QGxpbmsgTm9kZX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFZlbG9jaXR5KF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgdmVsb2NpdHk6IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRMaW5lYXJWZWxvY2l0eSh2ZWxvY2l0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgQU5HVUxBUiAtIFZFTE9DSVRZIG9mIHRoZSB7QGxpbmsgTm9kZX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFuZ3VsYXJWZWxvY2l0eSgpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHZlbG9jaXR5OiBPSU1PLlZlYzMgPSB0aGlzLiNyaWdpZGJvZHkuZ2V0QW5ndWxhclZlbG9jaXR5KCk7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IEFOR1VMQVIgLSBWRUxPQ0lUWSBvZiB0aGUge0BsaW5rIE5vZGV9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRBbmd1bGFyVmVsb2NpdHkoX3ZhbHVlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIGxldCB2ZWxvY2l0eTogT0lNTy5WZWMzID0gbmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LnNldEFuZ3VsYXJWZWxvY2l0eSh2ZWxvY2l0eSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBcHBsaWVzIGEgY29udGlub3VzIEZPUkNFIGF0IHRoZSBjZW50ZXIgb2YgdGhlIFJJR0lEQk9EWSBpbiB0aGUgdGhyZWUgZGltZW5zaW9ucy4gQ29uc2lkZXJpbmcgdGhlIHJpZ2lkYm9keSdzIE1BU1MuXHJcbiAgICAqIFRoZSBmb3JjZSBpcyBtZWFzdXJlZCBpbiBuZXd0b24sIDFrZyBuZWVkcyBhYm91dCAxMCBOZXd0b24gdG8gZmlnaHQgYWdhaW5zdCBncmF2aXR5LlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhcHBseUZvcmNlKF9mb3JjZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYXBwbHlGb3JjZVRvQ2VudGVyKG5ldyBPSU1PLlZlYzMoX2ZvcmNlLngsIF9mb3JjZS55LCBfZm9yY2UueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBcHBsaWVzIGEgY29udGlub3VzIEZPUkNFIGF0IGEgc3BlY2lmaWMgcG9pbnQgaW4gdGhlIHdvcmxkIHRvIHRoZSBSSUdJREJPRFkgaW4gdGhlIHRocmVlIGRpbWVuc2lvbnMuIENvbnNpZGVyaW5nIHRoZSByaWdpZGJvZHkncyBNQVNTXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGFwcGx5Rm9yY2VBdFBvaW50KF9mb3JjZTogVmVjdG9yMywgX3dvcmxkUG9pbnQ6IFZlY3RvcjMpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFwcGx5Rm9yY2UobmV3IE9JTU8uVmVjMyhfZm9yY2UueCwgX2ZvcmNlLnksIF9mb3JjZS56KSwgbmV3IE9JTU8uVmVjMyhfd29ybGRQb2ludC54LCBfd29ybGRQb2ludC55LCBfd29ybGRQb2ludC56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwcGxpZXMgYSBjb250aW5vdXMgUk9UQVRJT05BTCBGT1JDRSAoVG9ycXVlKSB0byB0aGUgUklHSURCT0RZIGluIHRoZSB0aHJlZSBkaW1lbnNpb25zLiBDb25zaWRlcmluZyB0aGUgcmlnaWRib2R5J3MgTUFTU1xyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhcHBseVRvcnF1ZShfcm90YXRpb25hbEZvcmNlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5hcHBseVRvcnF1ZShuZXcgT0lNTy5WZWMzKF9yb3RhdGlvbmFsRm9yY2UueCwgX3JvdGF0aW9uYWxGb3JjZS55LCBfcm90YXRpb25hbEZvcmNlLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXBwbGllcyBhIGluc3RhbnQgRk9SQ0UgYXQgYSBwb2ludC9yaWdpZGJvZHljZW50ZXIgdG8gdGhlIFJJR0lEQk9EWSBpbiB0aGUgdGhyZWUgZGltZW5zaW9ucy4gQ29uc2lkZXJpbmcgdGhlIHJpZ2lkYm9kJ3MgTUFTU1xyXG4gICAgKiBJbmZsdWVuY2luZyB0aGUgYW5ndWxhciBzcGVlZCBhbmQgdGhlIGxpbmVhciBzcGVlZC4gXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGFwcGx5SW1wdWxzZUF0UG9pbnQoX2ltcHVsc2U6IFZlY3RvcjMsIF93b3JsZFBvaW50OiBWZWN0b3IzID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICBfd29ybGRQb2ludCA9IF93b3JsZFBvaW50ICE9IG51bGwgPyBfd29ybGRQb2ludCA6IHRoaXMuZ2V0UG9zaXRpb24oKTtcclxuICAgICAgdGhpcy4jcmlnaWRib2R5LmFwcGx5SW1wdWxzZShuZXcgT0lNTy5WZWMzKF9pbXB1bHNlLngsIF9pbXB1bHNlLnksIF9pbXB1bHNlLnopLCBuZXcgT0lNTy5WZWMzKF93b3JsZFBvaW50LngsIF93b3JsZFBvaW50LnksIF93b3JsZFBvaW50LnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXBwbGllcyBhIGluc3RhbnQgRk9SQ0UgdG8gdGhlIFJJR0lEQk9EWSBpbiB0aGUgdGhyZWUgZGltZW5zaW9ucy4gQ29uc2lkZXJpbmcgdGhlIHJpZ2lkYm9keSdzIE1BU1NcclxuICAgICogT25seSBpbmZsdWVuY2luZyBpdCdzIHNwZWVkIG5vdCByb3RhdGlvbi5cclxuICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHlMaW5lYXJJbXB1bHNlKF9pbXB1bHNlOiBWZWN0b3IzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5hcHBseUxpbmVhckltcHVsc2UobmV3IE9JTU8uVmVjMyhfaW1wdWxzZS54LCBfaW1wdWxzZS55LCBfaW1wdWxzZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIGEgaW5zdGFudCBST1RBVElPTkFMLUZPUkNFIHRvIHRoZSBSSUdJREJPRFkgaW4gdGhlIHRocmVlIGRpbWVuc2lvbnMuIENvbnNpZGVyaW5nIHRoZSByaWdpZGJvZHkncyBNQVNTXHJcbiAgICAgKiBPbmx5IGluZmx1ZW5jaW5nIGl0J3Mgcm90YXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcHBseUFuZ3VsYXJJbXB1bHNlKF9yb3RhdGlvbmFsSW1wdWxzZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYXBwbHlBbmd1bGFySW1wdWxzZShuZXcgT0lNTy5WZWMzKF9yb3RhdGlvbmFsSW1wdWxzZS54LCBfcm90YXRpb25hbEltcHVsc2UueSwgX3JvdGF0aW9uYWxJbXB1bHNlLnopKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoYW5naW5nIHRoZSBWRUxPQ0lUWSBvZiB0aGUgUklHSURCT0RZLiBPbmx5IGluZmx1ZW5jaW5nIHRoZSBsaW5lYXIgc3BlZWQgbm90IGFuZ3VsYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFZlbG9jaXR5KF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYWRkTGluZWFyVmVsb2NpdHkobmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2luZyB0aGUgVkVMT0NJVFkgb2YgdGhlIFJJR0lEQk9EWS4gT25seSBpbmZsdWVuY2luZyB0aGUgYW5ndWxhciBzcGVlZCBub3QgdGhlIGxpbmVhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkQW5ndWxhclZlbG9jaXR5KF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYWRkQW5ndWxhclZlbG9jaXR5KG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGUtIC8gQWN0aXZhdGUgdGhlIHJpZ2lkYm9kaWVzIGF1dG8tc2xlZXBpbmcgZnVuY3Rpb24uXHJcbiAgICAgKiBJZiBhY3RpdmF0ZWQgdGhlIHJpZ2lkYm9keSB3aWxsIGF1dG9tYXRpY2FsbHkgc2xlZXAgd2hlbiBuZWVkZWQsIGluY3JlYXNpbmcgcGVyZm9ybWFuY2UuXHJcbiAgICAgKiBJZiBkZWFjdGl2YXRlZCB0aGUgcmlnaWRib2R5IGdldHMgc3RvcHBlZCBmcm9tIHNsZWVwaW5nIHdoZW4gbW92ZW1lbnQgaXMgdG9vIG1pbmltYWwuIERlY3JlYXNpbmcgcGVyZm9ybWFuY2UsIGZvciByYXJlbHkgbW9yZSBwcmVjaXNlIHBoeXNpY3MgcmVzdWx0cyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlQXV0b1NsZWVwKF9vbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0QXV0b1NsZWVwKF9vbik7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gQ29sbGlzaW9uXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENoZWNraW5nIGZvciBDb2xsaXNpb24gd2l0aCBvdGhlciBDb2xsaWRlcnMgYW5kIGRpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sbGlkZXIuXHJcbiAgICAvLyAgKiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBpbiB0aGUgUmVuZGVyTWFuYWdlciwgbm8gaW50ZXJhY3Rpb24gbmVlZGVkLlxyXG4gICAgLy8gICovXHJcbiAgICAvLyBwdWJsaWMgY2hlY2tDb2xsaXNpb25FdmVudHMoKTogdm9pZCB7XHJcbiAgICAvLyAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSAvLyBjaGVjayBjb2xsaXNpb25zIG9ubHkgaWYgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkXHJcbiAgICAvLyAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vICAgbGV0IGNvbnRhY3RMaW5rOiBPSU1PLkNvbnRhY3RMaW5rID0gdGhpcy4jcmlnaWRib2R5LmdldENvbnRhY3RMaW5rTGlzdCgpOyAvLyBhbGwgcGh5c2ljYWwgY29udGFjdHMgYmV0d2VlbiBjb2xsaWRpbmcgYm9kaWVzIG9uIHRoaXMgcmJcclxuICAgIC8vICAgd2hpbGUgKGNvbnRhY3RMaW5rICE9IG51bGwpIHtcclxuICAgIC8vICAgICBsZXQgb3RoZXI6IENvbXBvbmVudFJpZ2lkYm9keSA9IGNvbnRhY3RMaW5rLmdldE90aGVyKCkudXNlckRhdGE7IC8vIGdldCB0aGUgb3RoZXIgY29tcG9uZW50IHJpZ2lkYm9keSBpbnZvbHZlZCBpbiB0aGUgY29sbGlzaW9uXHJcbiAgICAvLyAgICAgaWYgKCFvdGhlci5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAvLyAgICAgICBjb250YWN0TGluayA9IGNvbnRhY3RMaW5rLmdldE5leHQoKTtcclxuICAgIC8vICAgICAgIGNvbnRpbnVlO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgbGV0IGNvbnRhY3Q6IE9JTU8uQ29udGFjdCA9IGNvbnRhY3RMaW5rLmdldENvbnRhY3QoKTtcclxuICAgIC8vICAgICBsZXQgd2FzVG91Y2hpbmc6IGJvb2xlYW4gPSB0aGlzLmNvbGxpc2lvbnMuaW5jbHVkZXMob3RoZXIpO1xyXG4gICAgLy8gICAgIGxldCBpc1RvdWNoaW5nOiBib29sZWFuID0gY29udGFjdC5pc1RvdWNoaW5nKCk7XHJcblxyXG4gICAgLy8gICAgIGlmICghd2FzVG91Y2hpbmcgJiYgaXNUb3VjaGluZykgeyAvLyBFTlRFUlxyXG4gICAgLy8gICAgICAgbGV0IG1hbmlmb2xkOiBPSU1PLk1hbmlmb2xkID0gY29udGFjdC5nZXRNYW5pZm9sZCgpO1xyXG4gICAgLy8gICAgICAgbGV0IHBvaW50czogT0lNTy5NYW5pZm9sZFBvaW50W10gPSBtYW5pZm9sZC5nZXRQb2ludHMoKTsgLy8gQWxsIHBvaW50cyBpbiB0aGUgY29sbGlzaW9uIHdoZXJlIHRoZSB0d28gYm9kaWVzIGFyZSB0b3VjaGluZywgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgaW1wYWN0XHJcbiAgICAvLyAgICAgICBsZXQgbm9ybWFsSW1wdWxzZTogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICAgIGxldCBiaW5vcm1hbEltcHVsc2U6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgICBsZXQgdGFuZ2VudEltcHVsc2U6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgICBmb3IgKGxldCBtYW5pZm9sZFBvaW50IG9mIHBvaW50cykgeyAvLyBUaGUgaW1wYWN0IG9mIHRoZSBjb2xsaXNpb24gaW52b2x2aW5nIGFsbCB0b3VjaGluZyBwb2ludHNcclxuICAgIC8vICAgICAgICAgbm9ybWFsSW1wdWxzZSArPSBtYW5pZm9sZFBvaW50LmdldE5vcm1hbEltcHVsc2UoKTtcclxuICAgIC8vICAgICAgICAgYmlub3JtYWxJbXB1bHNlICs9IG1hbmlmb2xkUG9pbnQuZ2V0Qmlub3JtYWxJbXB1bHNlKCk7XHJcbiAgICAvLyAgICAgICAgIHRhbmdlbnRJbXB1bHNlICs9IG1hbmlmb2xkUG9pbnQuZ2V0VGFuZ2VudEltcHVsc2UoKTtcclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICAgIGxldCBub3JtYWw6IE9JTU8uVmVjMyA9IG1hbmlmb2xkLmdldE5vcm1hbCgpO1xyXG4gICAgLy8gICAgICAgbGV0IGNvbGxpc2lvbk5vcm1hbDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnopO1xyXG4gICAgLy8gICAgICAgbGV0IGNvbGxpc2lvbkNlbnRlclBvaW50OiBWZWN0b3IzID0gdGhpcy5jb2xsaXNpb25DZW50ZXJQb2ludChwb2ludHMsIG1hbmlmb2xkLmdldE51bVBvaW50cygpKTtcclxuICAgIC8vICAgICAgIHRoaXMuY29sbGlzaW9ucy5wdXNoKG90aGVyKTtcclxuICAgIC8vICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuQ09MTElTSU9OX0VOVEVSLCBvdGhlciwgbm9ybWFsSW1wdWxzZSwgdGFuZ2VudEltcHVsc2UsIGJpbm9ybWFsSW1wdWxzZSwgY29sbGlzaW9uQ2VudGVyUG9pbnQsIGNvbGxpc2lvbk5vcm1hbCkpOyAvLyBTZW5kaW5nIHRoZSBnaXZlbiBldmVudFxyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAod2FzVG91Y2hpbmcgJiYgIWlzVG91Y2hpbmcpIHsgLy8gRVhJVFxyXG4gICAgLy8gICAgICAgdGhpcy5jb2xsaXNpb25zLnNwbGljZSh0aGlzLmNvbGxpc2lvbnMuaW5kZXhPZihvdGhlciksIDEpO1xyXG4gICAgLy8gICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudFBoeXNpY3MoRVZFTlRfUEhZU0lDUy5DT0xMSVNJT05fRVhJVCwgb3RoZXIsIDAsIDAsIDApKTtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGNvbnRhY3RMaW5rID0gY29udGFjdExpbmsuZ2V0TmV4dCgpOyAvLyBTdGFydCB0aGUgc2FtZSByb3V0aW5lIHdpdGggdGhlIG5leHQgY29sbGlzaW9uIGluIHRoZSBsaXN0XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlbmRzIGEgcmF5IHRocm91Z2ggdGhpcyBzcGVjaWZpYyBib2R5IGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSB3b3JsZCBhbmQgY2hlY2tzIGlmIHRoaXMgYm9keSB3YXMgaGl0IGJ5IHRoZSByYXksXHJcbiAgICAgKiByZXR1cm5pbmcgaW5mbyBhYm91dCB0aGUgaGl0LiBQcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFuZCBpbmZvcm1hdGlvbiBhIHJlZ3VsYXIgcmF5Y2FzdCBkb2VzIGJ1dCB0aGUgcmF5IGlzIG9ubHkgdGVzdGluZyBhZ2FpbnN0IHRoaXMgc3BlY2lmaWMgYm9keS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJheWNhc3RUaGlzQm9keShfb3JpZ2luOiBWZWN0b3IzLCBfZGlyZWN0aW9uOiBWZWN0b3IzLCBfbGVuZ3RoOiBudW1iZXIsIF9kZWJ1Z0RyYXc6IGJvb2xlYW4gPSBmYWxzZSk6IFJheUhpdEluZm8ge1xyXG4gICAgICBsZXQgaGl0SW5mbzogUmF5SGl0SW5mbyA9IG5ldyBSYXlIaXRJbmZvKCk7XHJcbiAgICAgIGxldCBnZW9tZXRyeTogT0lNTy5HZW9tZXRyeSA9IHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKS5nZXRHZW9tZXRyeSgpO1xyXG4gICAgICBsZXQgdHJhbnNmb3JtOiBPSU1PLlRyYW5zZm9ybSA9IHRoaXMuI3JpZ2lkYm9keS5nZXRUcmFuc2Zvcm0oKTtcclxuICAgICAgbGV0IHNjYWxlZERpcmVjdGlvbjogVmVjdG9yMyA9IF9kaXJlY3Rpb24uY2xvbmU7XHJcbiAgICAgIHNjYWxlZERpcmVjdGlvbi5zY2FsZShfbGVuZ3RoKTtcclxuICAgICAgbGV0IGVuZHBvaW50OiBWZWN0b3IzID0gVmVjdG9yMy5TVU0oc2NhbGVkRGlyZWN0aW9uLCBfb3JpZ2luLmNsb25lKTtcclxuICAgICAgbGV0IG9pbW9SYXk6IE9JTU8uUmF5Q2FzdEhpdCA9IG5ldyBPSU1PLlJheUNhc3RIaXQoKTtcclxuICAgICAgbGV0IGhpdDogYm9vbGVhbiA9IGdlb21ldHJ5LnJheUNhc3QobmV3IE9JTU8uVmVjMyhfb3JpZ2luLngsIF9vcmlnaW4ueSwgX29yaWdpbi56KSwgbmV3IE9JTU8uVmVjMyhlbmRwb2ludC54LCBlbmRwb2ludC55LCBlbmRwb2ludC56KSwgdHJhbnNmb3JtLCBvaW1vUmF5KTsgLy90aGUgYWN0dWFsIE9pbW9QaHlzaWNzIFJheWNhc3RcclxuICAgICAgaWYgKGhpdCkgeyAgLy9JZiBoaXQgcmV0dXJuIGEgYnVuY2ggb2YgaW5mb3JtYXRpb25zIGFib3V0IHRoZSBoaXRcclxuICAgICAgICBoaXRJbmZvLmhpdCA9IHRydWU7XHJcbiAgICAgICAgaGl0SW5mby5oaXRQb2ludCA9IG5ldyBWZWN0b3IzKG9pbW9SYXkucG9zaXRpb24ueCwgb2ltb1JheS5wb3NpdGlvbi55LCBvaW1vUmF5LnBvc2l0aW9uLnopO1xyXG4gICAgICAgIGhpdEluZm8uaGl0Tm9ybWFsID0gbmV3IFZlY3RvcjMob2ltb1JheS5ub3JtYWwueCwgb2ltb1JheS5ub3JtYWwueSwgb2ltb1JheS5ub3JtYWwueik7XHJcbiAgICAgICAgbGV0IGR4OiBudW1iZXIgPSBfb3JpZ2luLnggLSBoaXRJbmZvLmhpdFBvaW50Lng7ICAvL2NhbGN1bGF0ZSBoaXQgZGlzdGFuY2VcclxuICAgICAgICBsZXQgZHk6IG51bWJlciA9IF9vcmlnaW4ueSAtIGhpdEluZm8uaGl0UG9pbnQueTtcclxuICAgICAgICBsZXQgZHo6IG51bWJlciA9IF9vcmlnaW4ueiAtIGhpdEluZm8uaGl0UG9pbnQuejtcclxuICAgICAgICBoaXRJbmZvLmhpdERpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkeik7XHJcbiAgICAgICAgaGl0SW5mby5yaWdpZGJvZHlDb21wb25lbnQgPSB0aGlzO1xyXG4gICAgICAgIGhpdEluZm8ucmF5T3JpZ2luID0gX29yaWdpbjtcclxuICAgICAgICBoaXRJbmZvLnJheUVuZCA9IGVuZHBvaW50O1xyXG4gICAgICB9IGVsc2UgeyAvL09ubHkgdGVsbCB0aGUgb3JpZ2luLCBhbmQgdGhlIGhpdCBwb2ludCBpcyB0aGUgZW5kIG9mIHRoZSByYXkuXHJcbiAgICAgICAgaGl0SW5mby5yYXlPcmlnaW4gPSBfb3JpZ2luO1xyXG4gICAgICAgIGhpdEluZm8uaGl0UG9pbnQgPSBuZXcgVmVjdG9yMyhlbmRwb2ludC54LCBlbmRwb2ludC55LCBlbmRwb2ludC56KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoX2RlYnVnRHJhdykge1xyXG4gICAgICAgIFBoeXNpY3MuZGVidWdEcmF3LmRlYnVnUmF5KGhpdEluZm8ucmF5T3JpZ2luLCBoaXRJbmZvLmhpdFBvaW50LCBuZXcgQ29sb3IoMCwgMSwgMCwgMSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBoaXRJbmZvO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZyAtIFNvbWUgcHJvcGVydGllcyBtaWdodCBiZSBtaXNzaW5nLCBlLmcuIGNvbnZleE1lc2ggKEZsb2F0MzJBcnJheSlcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy5nZXRNdXRhdG9yKCk7XHJcblxyXG4gICAgICBkZWxldGUgc2VyaWFsaXphdGlvbi5tdHhQaXZvdDtcclxuICAgICAgZGVsZXRlIHNlcmlhbGl6YXRpb24uYWN0aXZlO1xyXG5cclxuICAgICAgc2VyaWFsaXphdGlvbi50eXBlQm9keSA9IEJPRFlfVFlQRVt0aGlzLiN0eXBlQm9keV07XHJcbiAgICAgIHNlcmlhbGl6YXRpb24udHlwZUNvbGxpZGVyID0gQ09MTElERVJfVFlQRVt0aGlzLiN0eXBlQ29sbGlkZXJdO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmluaXRpYWxpemF0aW9uID0gQk9EWV9JTklUW3RoaXMuaW5pdGlhbGl6YXRpb25dO1xyXG5cclxuICAgICAgc2VyaWFsaXphdGlvbi5pZCA9IHRoaXMuI2lkO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLnBpdm90ID0gdGhpcy5tdHhQaXZvdC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHRoaXMubXR4UGl2b3QuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24ucGl2b3QpO1xyXG4gICAgICB0aGlzLiNpZCA9IF9zZXJpYWxpemF0aW9uLmlkO1xyXG4gICAgICB0aGlzLm1hc3MgPSBpZk51bWJlcihfc2VyaWFsaXphdGlvbi5tYXNzLCB0aGlzLm1hc3MpO1xyXG4gICAgICB0aGlzLmRhbXBUcmFuc2xhdGlvbiA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLmRhbXBUcmFuc2xhdGlvbiwgdGhpcy5kYW1wVHJhbnNsYXRpb24pO1xyXG4gICAgICB0aGlzLmRhbXBSb3RhdGlvbiA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLmRhbXBSb3RhdGlvbiwgdGhpcy5kYW1wUm90YXRpb24pO1xyXG4gICAgICB0aGlzLmNvbGxpc2lvbkdyb3VwID0gaWZOdW1iZXIoX3NlcmlhbGl6YXRpb24uY29sbGlzaW9uR3JvdXAsIHRoaXMuY29sbGlzaW9uR3JvdXApO1xyXG4gICAgICB0aGlzLmVmZmVjdFJvdGF0aW9uID0gX3NlcmlhbGl6YXRpb24uZWZmZWN0Um90YXRpb24gfHwgdGhpcy5lZmZlY3RSb3RhdGlvbjtcclxuICAgICAgdGhpcy5lZmZlY3RHcmF2aXR5ID0gaWZOdW1iZXIoX3NlcmlhbGl6YXRpb24uZWZmZWN0R3Jhdml0eSwgdGhpcy5lZmZlY3RHcmF2aXR5KTtcclxuICAgICAgdGhpcy5mcmljdGlvbiA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLmZyaWN0aW9uLCB0aGlzLmZyaWN0aW9uKTtcclxuICAgICAgdGhpcy5yZXN0aXR1dGlvbiA9IGlmTnVtYmVyKF9zZXJpYWxpemF0aW9uLnJlc3RpdHV0aW9uLCB0aGlzLnJlc3RpdHV0aW9uKTtcclxuICAgICAgdGhpcy5pc1RyaWdnZXIgPSBfc2VyaWFsaXphdGlvbi5pc1RyaWdnZXIgfHwgdGhpcy5pc1RyaWdnZXI7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb24gPSBfc2VyaWFsaXphdGlvbi5pbml0aWFsaXphdGlvbjtcclxuXHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb24gPSA8bnVtYmVyPjx1bmtub3duPkJPRFlfSU5JVFtfc2VyaWFsaXphdGlvbi5pbml0aWFsaXphdGlvbl07XHJcbiAgICAgIHRoaXMudHlwZUJvZHkgPSA8bnVtYmVyPjx1bmtub3duPkJPRFlfVFlQRVtfc2VyaWFsaXphdGlvbi50eXBlQm9keV07XHJcbiAgICAgIHRoaXMudHlwZUNvbGxpZGVyID0gPG51bWJlcj48dW5rbm93bj5DT0xMSURFUl9UWVBFW19zZXJpYWxpemF0aW9uLnR5cGVDb2xsaWRlcl07XHJcbiAgICAgIC8vIHRoaXMuY3JlYXRlKHRoaXMubWFzcywgdGhpcy4jdHlwZUJvZHksIHRoaXMuI3R5cGVDb2xsaWRlciwgdGhpcy5jb2xsaXNpb25Hcm91cCwgbnVsbCwgdGhpcy5jb252ZXhNZXNoKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENoYW5nZSBwcm9wZXJ0aWVzIGJ5IGFuIGFzc29jaWF0aXZlIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgaWYgKF9tdXRhdG9yLnR5cGVCb2R5ICE9IHVuZGVmaW5lZClcclxuICAgICAgICBfbXV0YXRvci50eXBlQm9keSA9IHBhcnNlSW50KF9tdXRhdG9yLnR5cGVCb2R5KTtcclxuICAgICAgaWYgKF9tdXRhdG9yLnR5cGVDb2xsaWRlciAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgX211dGF0b3IudHlwZUNvbGxpZGVyID0gcGFyc2VJbnQoX211dGF0b3IudHlwZUNvbGxpZGVyKTtcclxuICAgICAgaWYgKF9tdXRhdG9yLmluaXRpYWxpemF0aW9uICE9IHVuZGVmaW5lZClcclxuICAgICAgICBfbXV0YXRvci5pbml0aWFsaXphdGlvbiA9IHBhcnNlSW50KF9tdXRhdG9yLmluaXRpYWxpemF0aW9uKTtcclxuICAgICAgYXdhaXQgc3VwZXIubXV0YXRlKF9tdXRhdG9yLCBfc2VsZWN0aW9uLCBfZGlzcGF0Y2hNdXRhdGUpO1xyXG4gICAgICBpZiAoX211dGF0b3IuaW5pdGlhbGl6YXRpb24gIT0gdW5kZWZpbmVkICYmIHRoaXMuaXNBY3RpdmUpXHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgIC8vIFRPRE86IHNlZSBpZiB0aGlzIGFsdGVybmF0aXZlIHNob3VsZCBiZSwgYXQgbGVhc3QgcGFydGlhbGx5LCBkb25lIHdpdGggbXV0YXRlU2VsZWN0aW9uXHJcbiAgICAgIC8vIGxldCBjYWxsSWZFeGlzdDogRnVuY3Rpb24gPSAoX2tleTogc3RyaW5nLCBfc2V0dGVyOiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICAvLyAgIGlmIChfbXV0YXRvcltfa2V5XSlcclxuICAgICAgLy8gICAgIF9zZXR0ZXIoX211dGF0b3JbX2tleV0pO1xyXG4gICAgICAvLyB9O1xyXG5cclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJmcmljdGlvblwiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMuZnJpY3Rpb24gPSBfdmFsdWUpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcInJlc3RpdHV0aW9uXCIsIChfdmFsdWU6IG51bWJlcikgPT4gdGhpcy5yZXN0aXR1dGlvbiA9IF92YWx1ZSk7XHJcbiAgICAgIC8vIGNhbGxJZkV4aXN0KFwibWFzc1wiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMubWFzcyA9IF92YWx1ZSk7XHJcbiAgICAgIC8vIGNhbGxJZkV4aXN0KFwiZGFtcFRyYW5zbGF0aW9uXCIsIChfdmFsdWU6IG51bWJlcikgPT4gdGhpcy5kYW1wVHJhbnNsYXRpb24gPSBfdmFsdWUpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcImRhbXBSb3RhdGlvblwiLCAoX3ZhbHVlOiBudW1iZXIpID0+IHRoaXMuZGFtcFJvdGF0aW9uID0gX3ZhbHVlKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJlZmZlY3RHcmF2aXR5XCIsIChfdmFsdWU6IG51bWJlcikgPT4gdGhpcy5lZmZlY3RHcmF2aXR5ID0gX3ZhbHVlKTtcclxuICAgICAgLy8gY2FsbElmRXhpc3QoXCJjb2xsaXNpb25Hcm91cFwiLCAoX3ZhbHVlOiBDT0xMSVNJT05fR1JPVVApID0+IHRoaXMuY29sbGlzaW9uR3JvdXAgPSBfdmFsdWUpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcInR5cGVCb2R5XCIsIChfdmFsdWU6IHN0cmluZykgPT4gdGhpcy50eXBlQm9keSA9IHBhcnNlSW50KF92YWx1ZSkpO1xyXG4gICAgICAvLyBjYWxsSWZFeGlzdChcInR5cGVDb2xsaWRlclwiLCAoX3ZhbHVlOiBzdHJpbmcpID0+IHRoaXMudHlwZUNvbGxpZGVyID0gcGFyc2VJbnQoX3ZhbHVlKSk7XHJcblxyXG4gICAgICAvLyB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULk1VVEFURSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IodHJ1ZSk7XHJcblxyXG4gICAgICBtdXRhdG9yLmZyaWN0aW9uID0gdGhpcy5mcmljdGlvbjtcclxuICAgICAgbXV0YXRvci5yZXN0aXR1dGlvbiA9IHRoaXMucmVzdGl0dXRpb247XHJcbiAgICAgIG11dGF0b3IubWFzcyA9IHRoaXMubWFzcztcclxuICAgICAgbXV0YXRvci5kYW1wVHJhbnNsYXRpb24gPSB0aGlzLmRhbXBUcmFuc2xhdGlvbjtcclxuICAgICAgbXV0YXRvci5kYW1wUm90YXRpb24gPSB0aGlzLmRhbXBSb3RhdGlvbjtcclxuICAgICAgbXV0YXRvci5lZmZlY3RHcmF2aXR5ID0gdGhpcy5lZmZlY3RHcmF2aXR5O1xyXG4gICAgICBtdXRhdG9yLnR5cGVCb2R5ID0gdGhpcy4jdHlwZUJvZHk7XHJcbiAgICAgIG11dGF0b3IudHlwZUNvbGxpZGVyID0gdGhpcy4jdHlwZUNvbGxpZGVyO1xyXG4gICAgICBtdXRhdG9yLmlzVHJpZ2dlciA9IHRoaXMuI2lzVHJpZ2dlcjtcclxuXHJcbiAgICAgIC8vIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhtdXRhdG9yKTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0gc3VwZXIuZ2V0TXV0YXRvckF0dHJpYnV0ZVR5cGVzKF9tdXRhdG9yKTtcclxuICAgICAgaWYgKHR5cGVzLnR5cGVCb2R5KVxyXG4gICAgICAgIHR5cGVzLnR5cGVCb2R5ID0gQk9EWV9UWVBFO1xyXG4gICAgICBpZiAodHlwZXMudHlwZUNvbGxpZGVyKVxyXG4gICAgICAgIHR5cGVzLnR5cGVDb2xsaWRlciA9IENPTExJREVSX1RZUEU7XHJcbiAgICAgIGlmICh0eXBlcy5pbml0aWFsaXphdGlvbilcclxuICAgICAgICB0eXBlcy5pbml0aWFsaXphdGlvbiA9IEJPRFlfSU5JVDtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIHN1cGVyLnJlZHVjZU11dGF0b3IoX211dGF0b3IpO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuY29udmV4TWVzaDsgLy9Db252ZXggTWVzaCBjYW4ndCBiZSBzaG93biBpbiB0aGUgZWRpdG9yIGJlY2F1c2UgZmxvYXQzMkFycmF5IGlzIG5vdCBhIHZpYWJsZSBtdXRhdG9yXHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5jb2xsaXNpb25NYXNrO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IuaXNJbml0aWFsaXplZDtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vIEFjdGl2YXRlIHRoZSBmdW5jdGlvbnMgb2YgdGhpcyBjb21wb25lbnQgYXMgcmVzcG9uc2UgdG8gZXZlbnRzXHJcbiAgICBwcml2YXRlIGhuZEV2ZW50ID0gKF9ldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgc3dpdGNoIChfZXZlbnQudHlwZSkge1xyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX0FERDpcclxuICAgICAgICAgIC8vIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQUNUSVZBVEUsIHRoaXMuYWRkUmlnaWRib2R5VG9Xb3JsZCk7XHJcbiAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ09NUE9ORU5UX0RFQUNUSVZBVEUsIHRoaXMucmVtb3ZlUmlnaWRib2R5RnJvbVdvcmxkKTtcclxuICAgICAgICAgIC8vIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfQUNUSVZBVEUsIHRoaXMuYWRkUmlnaWRib2R5VG9Xb3JsZCwgdHJ1ZSk7IC8vIHVzZSBjYXB0dXJlIHRvIHJlYWN0IHRvIGJyb2FkY2FzdCFcclxuICAgICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVBQ1RJVkFURSwgdGhpcy5yZW1vdmVSaWdpZGJvZHlGcm9tV29ybGQsIHRydWUpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLm5vZGUuY21wVHJhbnNmb3JtKVxyXG4gICAgICAgICAgICBEZWJ1Zy53YXJuKFwiQ29tcG9uZW50UmlnaWRib2R5IGF0dGFjaGVkIHRvIG5vZGUgbWlzc2luZyBDb21wb25lbnRUcmFuc2Zvcm1cIiwgdGhpcy5ub2RlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRVZFTlQuQ09NUE9ORU5UX1JFTU9WRTpcclxuICAgICAgICAgIC8vIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5DT01QT05FTlRfQURELCB0aGlzLmFkZFJpZ2lkYm9keVRvV29ybGQpO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNPTVBPTkVOVF9SRU1PVkUsIHRoaXMucmVtb3ZlUmlnaWRib2R5RnJvbVdvcmxkKTtcclxuICAgICAgICAgIC8vIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfQUNUSVZBVEUsIHRoaXMuYWRkUmlnaWRib2R5VG9Xb3JsZCwgdHJ1ZSk7IC8vIHVzZSBjYXB0dXJlIHRvIHJlYWN0IHRvIGJyb2FkY2FzdCFcclxuICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk5PREVfREVBQ1RJVkFURSwgdGhpcy5yZW1vdmVSaWdpZGJvZHlGcm9tV29ybGQsIHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVSaWdpZGJvZHlGcm9tV29ybGQoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRVZFTlQuTk9ERV9ERVNFUklBTElaRUQ6XHJcbiAgICAgICAgICBpZiAoIXRoaXMubm9kZS5jbXBUcmFuc2Zvcm0pXHJcbiAgICAgICAgICAgIERlYnVnLmVycm9yKFwiQ29tcG9uZW50UmlnaWRib2R5IGF0dGFjaGVkIHRvIG5vZGUgbWlzc2luZyBDb21wb25lbnRUcmFuc2Zvcm1cIiwgdGhpcy5ub2RlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vI3JlZ2lvbiBDcmVhdGlvblxyXG4gICAgcHJpdmF0ZSBjcmVhdGUoX21hc3M6IG51bWJlciA9IDEsIF90eXBlOiBCT0RZX1RZUEUgPSBCT0RZX1RZUEUuRFlOQU1JQywgX2NvbGxpZGVyVHlwZTogQ09MTElERVJfVFlQRSA9IENPTExJREVSX1RZUEUuQ1VCRSwgX2dyb3VwOiBDT0xMSVNJT05fR1JPVVAgPSBQaHlzaWNzLnNldHRpbmdzLmRlZmF1bHRDb2xsaXNpb25Hcm91cCwgX210eFRyYW5zZm9ybTogTWF0cml4NHg0ID0gbnVsbCwgX2NvbnZleE1lc2g6IEZsb2F0MzJBcnJheSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgLy9TZXR0aW5nIHVwIGFsbCBpbmNvbWluZyB2YWx1ZXMgdG8gYmUgaW50ZXJuYWwgdmFsdWVzXHJcbiAgICAgIHRoaXMuY29udmV4TWVzaCA9IF9jb252ZXhNZXNoO1xyXG4gICAgICB0aGlzLiN0eXBlQm9keSA9IF90eXBlO1xyXG4gICAgICB0aGlzLiNjb2xsaXNpb25Hcm91cCA9IF9ncm91cDtcclxuICAgICAgdGhpcy4jdHlwZUNvbGxpZGVyID0gX2NvbGxpZGVyVHlwZTtcclxuICAgICAgdGhpcy5tYXNzID0gX21hc3M7XHJcbiAgICAgIHRoaXMuI3Jlc3RpdHV0aW9uID0gUGh5c2ljcy5zZXR0aW5ncy5kZWZhdWx0UmVzdGl0dXRpb247XHJcbiAgICAgIHRoaXMuI2ZyaWN0aW9uID0gUGh5c2ljcy5zZXR0aW5ncy5kZWZhdWx0RnJpY3Rpb247XHJcbiAgICAgIHRoaXMuY29sbGlzaW9uTWFzayA9IFBoeXNpY3Muc2V0dGluZ3MuZGVmYXVsdENvbGxpc2lvbk1hc2s7XHJcbiAgICAgIC8vQ3JlYXRlIHRoZSBhY3R1YWwgcmlnaWRib2R5IGluIHRoZSBPaW1vUGh5c2ljcyBTcGFjZVxyXG4gICAgICB0aGlzLmNyZWF0ZVJpZ2lkYm9keShfbWFzcywgX3R5cGUsIHRoaXMuI3R5cGVDb2xsaWRlciwgX210eFRyYW5zZm9ybSwgdGhpcy4jY29sbGlzaW9uR3JvdXApO1xyXG4gICAgICB0aGlzLiNpZCA9IFBoeXNpY3MuZGlzdHJpYnV0ZUJvZHlJRCgpO1xyXG5cclxuICAgICAgLy8gRXZlbnQgQ2FsbGJhY2tzIGRpcmVjdGx5IGZyb20gT0lNTyBQaHlzaWNzXHJcbiAgICAgIHRoaXMuI2NhbGxiYWNrcyA9IG5ldyBPSU1PLkNvbnRhY3RDYWxsYmFjaygpOyAvL2ZlaG1cclxuICAgICAgdGhpcy4jY2FsbGJhY2tzLmJlZ2luVHJpZ2dlckNvbnRhY3QgPSB0aGlzLnRyaWdnZXJFbnRlcjtcclxuICAgICAgdGhpcy4jY2FsbGJhY2tzLmVuZFRyaWdnZXJDb250YWN0ID0gdGhpcy50cmlnZ2VyRXhpdDtcclxuICAgICAgdGhpcy4jY2FsbGJhY2tzLnBvc3RTb2x2ZSA9IHRoaXMuY29sbGlzaW9uRW50ZXI7IC8vIHVzZSBwb3N0U29sdmUgZm9yIGNvbGxpc2lvbkVudGVyIHRvIGdldCB0aGUgaW1wdWxzZVxyXG4gICAgICB0aGlzLiNjYWxsYmFja3MuZW5kQ29udGFjdCA9IHRoaXMuY29sbGlzaW9uRXhpdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ3JlYXRlcyB0aGUgYWN0dWFsIE9pbW9QaHlzaWNzIFJpZ2lkYm9keSBvdXQgb2YgaW5mb3JtYXRpb25zIHRoZSBGVURHRSBDb21wb25lbnQgaGFzLiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVSaWdpZGJvZHkoX21hc3M6IG51bWJlciwgX3R5cGU6IEJPRFlfVFlQRSwgX2NvbGxpZGVyVHlwZTogQ09MTElERVJfVFlQRSwgX210eFRyYW5zZm9ybTogTWF0cml4NHg0LCBfY29sbGlzaW9uR3JvdXA6IENPTExJU0lPTl9HUk9VUCA9IENPTExJU0lPTl9HUk9VUC5ERUZBVUxUKTogdm9pZCB7XHJcbiAgICAgIGxldCBvaW1vVHlwZTogbnVtYmVyOyAvL05lZWQgdGhlIGNvbnZlcnNpb24gZnJvbSBzaW1wbGUgZW51bSB0byBudW1iZXIgYmVjYXVzZSBpZiBlbnVtIGlzIGRlZmluZWQgYXMgT2ltby5SaWdpZHlCb2R5VHlwZSB5b3UgaGF2ZSB0byBpbmNsdWRlIE9pbW8gdG8gdXNlIEZVREdFIGF0IGFsbFxyXG4gICAgICBzd2l0Y2ggKF90eXBlKSB7XHJcbiAgICAgICAgY2FzZSBCT0RZX1RZUEUuRFlOQU1JQzpcclxuICAgICAgICAgIG9pbW9UeXBlID0gT0lNTy5SaWdpZEJvZHlUeXBlLkRZTkFNSUM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJPRFlfVFlQRS5TVEFUSUM6XHJcbiAgICAgICAgICBvaW1vVHlwZSA9IE9JTU8uUmlnaWRCb2R5VHlwZS5TVEFUSUM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEJPRFlfVFlQRS5LSU5FTUFUSUM6XHJcbiAgICAgICAgICBvaW1vVHlwZSA9IE9JTU8uUmlnaWRCb2R5VHlwZS5LSU5FTUFUSUM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgb2ltb1R5cGUgPSBPSU1PLlJpZ2lkQm9keVR5cGUuRFlOQU1JQztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZW1vdmUgYWxsIHByZXZpb3VzIHNoYXBlcyBmcm9tIHdvcmxkLiBOZWNlc3Nhcnk/XHJcbiAgICAgIC8vIHdoaWxlICh0aGlzLiNyaWdpZGJvZHkgJiYgdGhpcy4jcmlnaWRib2R5LmdldFNoYXBlTGlzdCgpICE9IG51bGwpXHJcbiAgICAgIC8vICAgdGhpcy4jcmlnaWRib2R5LnJlbW92ZVNoYXBlKHRoaXMuI3JpZ2lkYm9keS5nZXRTaGFwZUxpc3QoKSk7XHJcblxyXG4gICAgICBsZXQgdG1wVHJhbnNmb3JtOiBNYXRyaXg0eDQgPSBfbXR4VHJhbnNmb3JtID09IG51bGwgPyBzdXBlci5ub2RlICE9IG51bGwgPyBzdXBlci5ub2RlLm10eFdvcmxkIDogTWF0cml4NHg0LklERU5USVRZKCkgOiBfbXR4VHJhbnNmb3JtOyAvL0dldCB0cmFuc2Zvcm0gaW5mb3JtYXRpb25zIGZyb20gdGhlIHdvcmxkLCBzaW5jZSBwaHlzaWNzIGRvZXMgbm90IGNhcmUgYWJvdXQgaGllcmFyY2h5XHJcbiAgICAgIC8vQ29udmVydCBpbmZvcm1hdGlvbnMgZnJvbSBGVURHRSB0byBPaW1vUGh5c2ljcyBhbmQgY3JlYXRpbmcgYSBjb2xsaWRlciB3aXRoIGl0LCB3aGlsZSBhbHNvIGFkZGluZyBhIHBpdm90IHRvIGRlcml2YXRlIGZyb20gdGhlIHRyYW5zZm9ybSBpbmZvcm1hdGlvbnMgaWYgbmVlZGVkXHJcbiAgICAgIGxldCBzY2FsZTogT0lNTy5WZWMzID0gbmV3IE9JTU8uVmVjMygodG1wVHJhbnNmb3JtLnNjYWxpbmcueCAqIHRoaXMubXR4UGl2b3Quc2NhbGluZy54KSAvIDIsICh0bXBUcmFuc2Zvcm0uc2NhbGluZy55ICogdGhpcy5tdHhQaXZvdC5zY2FsaW5nLnkpIC8gMiwgKHRtcFRyYW5zZm9ybS5zY2FsaW5nLnogKiB0aGlzLm10eFBpdm90LnNjYWxpbmcueikgLyAyKTtcclxuICAgICAgbGV0IHBvc2l0aW9uOiBPSU1PLlZlYzMgPSBuZXcgT0lNTy5WZWMzKHRtcFRyYW5zZm9ybS50cmFuc2xhdGlvbi54ICsgdGhpcy5tdHhQaXZvdC50cmFuc2xhdGlvbi54LCB0bXBUcmFuc2Zvcm0udHJhbnNsYXRpb24ueSArIHRoaXMubXR4UGl2b3QudHJhbnNsYXRpb24ueSwgdG1wVHJhbnNmb3JtLnRyYW5zbGF0aW9uLnogKyB0aGlzLm10eFBpdm90LnRyYW5zbGF0aW9uLnopO1xyXG4gICAgICBsZXQgcm90YXRpb246IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzModG1wVHJhbnNmb3JtLnJvdGF0aW9uLnggKyB0aGlzLm10eFBpdm90LnJvdGF0aW9uLngsIHRtcFRyYW5zZm9ybS5yb3RhdGlvbi55ICsgdGhpcy5tdHhQaXZvdC5yb3RhdGlvbi55LCB0bXBUcmFuc2Zvcm0ucm90YXRpb24ueiArIHRoaXMubXR4UGl2b3Qucm90YXRpb24ueik7XHJcbiAgICAgIHRoaXMuY3JlYXRlQ29sbGlkZXIoc2NhbGUsIF9jb2xsaWRlclR5cGUpO1xyXG4gICAgICAvL1NldHRpbmcgaW5mb3JtYXRpb25zIGFib3V0IG1hc3MsIHBvc2l0aW9uL3JvdGF0aW9uIGFuZCBwaHlzaWNhbCByZWFjdGlvbiB0eXBlXHJcbiAgICAgIHRoaXMuI21hc3NEYXRhLm1hc3MgPSBfbWFzczsgLy9fdHlwZSAhPSBQSFlTSUNTX1RZUEUuU1RBVElDID8gX21hc3MgOiAwOyAvL0lmIGEgb2JqZWN0IGlzIHN0YXRpYyBpdCBhY3RzIGFzIGlmIGl0IGhhcyBubyBtYXNzXHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keUluZm8udHlwZSA9IG9pbW9UeXBlO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHlJbmZvLnBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keUluZm8ucm90YXRpb24uZnJvbUV1bGVyWHl6KG5ldyBPSU1PLlZlYzMocm90YXRpb24ueCwgcm90YXRpb24ueSwgcm90YXRpb24ueikpOyAvL0NvbnZlcnQgZXVsZXJBbmdsZXMgaW4gZGVncmVlIHRvIHRoZSBpbnRlcm5hbGx5IHVzZWQgcXVhdGVybmlvbnNcclxuICAgICAgLy9DcmVhdGluZyB0aGUgYWN0dWFsIHJpZ2lkYm9keSBhbmQgaXQncyBjb2xsaWRlclxyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkgPSBuZXcgT0lNTy5SaWdpZEJvZHkodGhpcy4jcmlnaWRib2R5SW5mbyk7XHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyID0gbmV3IE9JTU8uU2hhcGUodGhpcy4jY29sbGlkZXJJbmZvKTtcclxuICAgICAgLy9GaWxsaW5nIHRoZSBhZGRpdGlvbmFsIHNldHRpbmdzIGFuZCBpbmZvcm1hdGlvbnMgdGhlIHJpZ2lkYm9keSBuZWVkcy4gV2hvIGlzIGNvbGxpZGluZywgaG93IGlzIHRoZSBjb2xsaXNpb24gaGFuZGxlZCAoZGFtcGluZywgaW5mbHVlbmNlIGZhY3RvcnMpXHJcbiAgICAgIHRoaXMuI2NvbGxpZGVyLnVzZXJEYXRhID0gdGhpcztcclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0Q29sbGlzaW9uR3JvdXAoX2NvbGxpc2lvbkdyb3VwKTtcclxuICAgICAgdGhpcy4jY29sbGlkZXIuc2V0Q29sbGlzaW9uTWFzayh0aGlzLmNvbGxpc2lvbk1hc2spO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuYWRkU2hhcGUodGhpcy4jY29sbGlkZXIpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0TWFzc0RhdGEodGhpcy4jbWFzc0RhdGEpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuc2V0UmVzdGl0dXRpb24odGhpcy4jcmVzdGl0dXRpb24pO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuc2V0RnJpY3Rpb24odGhpcy4jZnJpY3Rpb24pO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuZ2V0U2hhcGVMaXN0KCkuc2V0Q29udGFjdENhbGxiYWNrKHRoaXMuI2NhbGxiYWNrcyk7XHJcbiAgICAgIHRoaXMuI3JpZ2lkYm9keS5zZXRMaW5lYXJEYW1waW5nKHRoaXMuI2RhbXBpbmdMaW5lYXIpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0QW5ndWxhckRhbXBpbmcodGhpcy4jZGFtcGluZ0FuZ3VsYXIpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0R3Jhdml0eVNjYWxlKHRoaXMuI2VmZmVjdEdyYXZpdHkpO1xyXG4gICAgICB0aGlzLiNyaWdpZGJvZHkuc2V0Um90YXRpb25GYWN0b3IobmV3IE9JTU8uVmVjMyh0aGlzLiNlZmZlY3RSb3RhdGlvbi54LCB0aGlzLiNlZmZlY3RSb3RhdGlvbi55LCB0aGlzLiNlZmZlY3RSb3RhdGlvbi56KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENyZWF0ZXMgYSBjb2xsaWRlciBhIHNoYXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0IGluIHRoZSBwaHlzaWNhbCB3b3JsZC4gICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNvbGxpZGVyKF9zY2FsZTogT0lNTy5WZWMzLCBfY29sbGlkZXJUeXBlOiBDT0xMSURFUl9UWVBFKTogdm9pZCB7XHJcbiAgICAgIGxldCBzaGFwZUNvbmY6IE9JTU8uU2hhcGVDb25maWcgPSBuZXcgT0lNTy5TaGFwZUNvbmZpZygpOyAvL0NvbGxpZGVyIHdpdGggZ2VvbWV0cnkgYW5kIGluZm9zIGxpa2UgZnJpY3Rpb24vcmVzdGl0dXRpb24gYW5kIG1vcmVcclxuICAgICAgbGV0IGdlb21ldHJ5OiBPSU1PLkdlb21ldHJ5O1xyXG4gICAgICBpZiAodGhpcy50eXBlQ29sbGlkZXIgIT0gX2NvbGxpZGVyVHlwZSkgLy9JZiB0aGUgY29sbGlkZXIgdHlwZSB3YXMgY2hhbmdlZCBzZXQgdGhlIGludGVybmFsIG9uZSBuZXcsIGVsc2UgZG9uJ3Qgc28gdGhlcmUgaXMgbm90IGluZmluaXRlIHNldCBjYWxsc1xyXG4gICAgICAgIHRoaXMudHlwZUNvbGxpZGVyID0gX2NvbGxpZGVyVHlwZTtcclxuICAgICAgc3dpdGNoIChfY29sbGlkZXJUeXBlKSB7ICAvL0NyZWF0ZSBhIGRpZmZlcmVudCBPaW1vUGh5c2ljcyBnZW9tZXRyeSBiYXNlZCBvbiB0aGUgZ2l2ZW4gdHlwZS4gVGhhdCBpcyBvbmx5IHRoZSBtYXRoZW1hdGljYWwgc2hhcGUgb2YgdGhlIGNvbGxpZGVyXHJcbiAgICAgICAgY2FzZSBDT0xMSURFUl9UWVBFLkNVQkU6XHJcbiAgICAgICAgICBnZW9tZXRyeSA9IG5ldyBPSU1PLkJveEdlb21ldHJ5KF9zY2FsZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuU1BIRVJFOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgT0lNTy5TcGhlcmVHZW9tZXRyeShfc2NhbGUueCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuQ0FQU1VMRTpcclxuICAgICAgICAgIGdlb21ldHJ5ID0gbmV3IE9JTU8uQ2Fwc3VsZUdlb21ldHJ5KF9zY2FsZS54LCBfc2NhbGUueSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENPTExJREVSX1RZUEUuQ1lMSU5ERVI6XHJcbiAgICAgICAgICBnZW9tZXRyeSA9IG5ldyBPSU1PLkN5bGluZGVyR2VvbWV0cnkoX3NjYWxlLngsIF9zY2FsZS55KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ09MTElERVJfVFlQRS5DT05FOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgT0lNTy5Db25lR2VvbWV0cnkoX3NjYWxlLngsIF9zY2FsZS55KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ09MTElERVJfVFlQRS5QWVJBTUlEOlxyXG4gICAgICAgICAgZ2VvbWV0cnkgPSB0aGlzLmNyZWF0ZUNvbnZleEdlb21ldHJ5Q29sbGlkZXIodGhpcy5jcmVhdGVQeXJhbWlkVmVydGljZXMoKSwgX3NjYWxlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ09MTElERVJfVFlQRS5DT05WRVg6XHJcbiAgICAgICAgICBnZW9tZXRyeSA9IHRoaXMuY3JlYXRlQ29udmV4R2VvbWV0cnlDb2xsaWRlcih0aGlzLmNvbnZleE1lc2gsIF9zY2FsZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBzaGFwZUNvbmYuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcclxuICAgICAgdGhpcy4jY29sbGlkZXJJbmZvID0gc2hhcGVDb25mOyAvL3RoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGFkZCBhbiBhY3R1YWwgY29sbGlkZXIgdG8gdGhlIHJpZ2lkYm9keSBpbiBjcmVhdGVSaWdpZGJvZHlcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ3JlYXRpbmcgYSBzaGFwZSB0aGF0IHJlcHJlc2VudHMgYSBpbiBpdHNlbGYgY2xvc2VkIGZvcm0sIG91dCBvZiB0aGUgZ2l2ZW4gdmVydGljZXMuICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNvbnZleEdlb21ldHJ5Q29sbGlkZXIoX3ZlcnRpY2VzOiBGbG9hdDMyQXJyYXksIF9zY2FsZTogT0lNTy5WZWMzKTogT0lNTy5Db252ZXhIdWxsR2VvbWV0cnkge1xyXG4gICAgICBsZXQgdmVydGljZXNBc1ZlYzM6IE9JTU8uVmVjM1tdID0gbmV3IEFycmF5KCk7IC8vQ29udmVydCBGVURHRSBWZWN0b3IzIHRvIE9pbW9WZWMzXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfdmVydGljZXMubGVuZ3RoOyBpICs9IDMpIHsgLy8zIFZhbHVlcyBmb3Igb25lIHBvaW50XHJcbiAgICAgICAgdmVydGljZXNBc1ZlYzMucHVzaChuZXcgT0lNTy5WZWMzKF92ZXJ0aWNlc1tpXSAqIF9zY2FsZS54LCBfdmVydGljZXNbaSArIDFdICogX3NjYWxlLnksIF92ZXJ0aWNlc1tpICsgMl0gKiBfc2NhbGUueikpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBuZXcgT0lNTy5Db252ZXhIdWxsR2VvbWV0cnkodmVydGljZXNBc1ZlYzMpOyAvL1RlbGwgT2ltb1BoeXNpY3MgdG8gY3JlYXRlIGEgaHVsbCB0aGF0IGludm9sdmVzIGFsbCBwb2ludHMgYnV0IGNsb3NlIGl0IG9mLiBBIGNvbnZleCBzaGFwZSBjYW4gbm90IGhhdmUgYSBob2xlIGluIGl0LlxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB2ZXJ0aWNlcyB0aGF0IGNvbnN0cnVjdCBhIHB5cmFtaWQuIFRoZSB2ZXJ0aWNlcyBvZiB0aGUgaW1wbGVtZW50ZWQgcHlyYW1pZCBtZXNoIGNhbiBiZSB1c2VkIHRvby4gQnV0IHRoZXkgYXJlIGhhbGZlZCBhbmQgZG91YmxlIHNpZGVkLCBzbyBpdCdzIG1vcmUgcGVyZm9ybWFudCB0byB1c2UgdGhpcy4gKi9cclxuICAgIHByaXZhdGUgY3JlYXRlUHlyYW1pZFZlcnRpY2VzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIGxldCB2ZXJ0aWNlczogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgICAgLyowKi8tMSwgMCwgMSwgLyoxKi8gMSwgMCwgMSwgIC8qMiovIDEsIDAsIC0xLCAvKjMqLyAtMSwgMCwgLTEsXHJcbiAgICAgICAgLyo0Ki8gMCwgMiwgMFxyXG4gICAgICBdKTtcclxuICAgICAgcmV0dXJuIHZlcnRpY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBZGRpbmcgdGhpcyBDb21wb25lbnRSaWdpZGJvZHkgdG8gdGhlIFBoeXNpc2NzLndvcmxkIGdpdmluZyB0aGUgb2ltb1BoeXNpY3Mgc3lzdGVtIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgKi9cclxuICAgIHByaXZhdGUgYWRkUmlnaWRib2R5VG9Xb3JsZCA9ICgpOiB2b2lkID0+IHtcclxuICAgICAgaWYgKCF0aGlzLiNyaWdpZGJvZHkuX3dvcmxkKVxyXG4gICAgICAgIFBoeXNpY3MuYWRkUmlnaWRib2R5KHRoaXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKiogUmVtb3ZpbmcgdGhpcyBDb21wb25lbnRSaWdpZGJvZHkgZnJvbSB0aGUgUGh5c2lzY3Mud29ybGQgdGFraW5nIHRoZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgb2ltb1BoeXNpY3Mgc3lzdGVtICovXHJcbiAgICBwcml2YXRlIHJlbW92ZVJpZ2lkYm9keUZyb21Xb3JsZCA9ICgpOiB2b2lkID0+IHtcclxuICAgICAgUGh5c2ljcy5yZW1vdmVSaWdpZGJvZHkodGhpcyk7XHJcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLy8jcmVnaW9uIHByaXZhdGUgRVZFTlQgZnVuY3Rpb25zXHJcbiAgICAvL0NhbGN1bGF0aW5nIHRoZSBjZW50ZXIgb2YgYSBjb2xsaXNpb24gYXMgYSBzaW5ndWxhciBwb2ludCAtIGluIGNhc2UgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwb2ludCAtIGJ5IGdldHRpbmcgdGhlIGdlb21ldHJpY2FsIGNlbnRlciBvZiBhbGwgY29sbGlkaW5nIHBvaW50c1xyXG4gICAgcHJpdmF0ZSBjb2xsaXNpb25DZW50ZXJQb2ludChfY29sUG9pbnRzOiBPSU1PLk1hbmlmb2xkUG9pbnRbXSwgX251bVBvaW50czogbnVtYmVyKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCB0b3RhbFBvaW50czogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHRvdGFsWDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHRvdGFsWTogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IHRvdGFsWjogbnVtYmVyID0gMDtcclxuICAgICAgX2NvbFBvaW50cy5mb3JFYWNoKChfdmFsdWU6IE9JTU8uTWFuaWZvbGRQb2ludCk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGlmICh0b3RhbFBvaW50cyA8IF9udW1Qb2ludHMpIHtcclxuICAgICAgICAgIHRvdGFsUG9pbnRzKys7XHJcbiAgICAgICAgICB0b3RhbFggKz0gX3ZhbHVlLmdldFBvc2l0aW9uMigpLng7XHJcbiAgICAgICAgICB0b3RhbFkgKz0gX3ZhbHVlLmdldFBvc2l0aW9uMigpLnk7XHJcbiAgICAgICAgICB0b3RhbFogKz0gX3ZhbHVlLmdldFBvc2l0aW9uMigpLno7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRvdGFsWCAvIF9udW1Qb2ludHMsIHRvdGFsWSAvIF9udW1Qb2ludHMsIHRvdGFsWiAvIF9udW1Qb2ludHMpOztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByaXZhdGUgY29sbGlzaW9uRW50ZXIoX2NvbnRhY3Q6IE9JTU8uQ29udGFjdCk6IHZvaWQge1xyXG4gICAgICBsZXQgYm9keUE6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9jb250YWN0LmdldFNoYXBlMSgpPy51c2VyRGF0YTtcclxuICAgICAgbGV0IGJvZHlCOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTIoKT8udXNlckRhdGE7XHJcblxyXG4gICAgICBpZiAoIWJvZHlBIHx8ICFib2R5QiB8fCBib2R5QS5jb2xsaXNpb25zLmluY2x1ZGVzKGJvZHlCKSkgLy8gYWxyZWFkeSBlbnRlcmVkXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgYm9keUEuY29sbGlzaW9ucy5wdXNoKGJvZHlCKTtcclxuICAgICAgYm9keUIuY29sbGlzaW9ucy5wdXNoKGJvZHlBKTtcclxuXHJcbiAgICAgIC8vIFRPRE86IG1heWJlIHJhdGhlciBleHBvc2UgdGhlIG1hbmlmb2xkIHRvIHRoZSBldmVudCBvciBzb21ldGhpbmdcclxuICAgICAgbGV0IG1hbmlmb2xkOiBPSU1PLk1hbmlmb2xkID0gX2NvbnRhY3QuZ2V0TWFuaWZvbGQoKTtcclxuICAgICAgbGV0IHBvaW50czogT0lNTy5NYW5pZm9sZFBvaW50W10gPSBtYW5pZm9sZC5nZXRQb2ludHMoKTsgLy8gQWxsIHBvaW50cyBpbiB0aGUgY29sbGlzaW9uIHdoZXJlIHRoZSB0d28gYm9kaWVzIGFyZSB0b3VjaGluZywgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgaW1wYWN0XHJcbiAgICAgIGxldCBub3JtYWxJbXB1bHNlOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgdGFuZ2VudEltcHVsc2U6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBiaW5vcm1hbEltcHVsc2U6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAobGV0IG1hbmlmb2xkUG9pbnQgb2YgcG9pbnRzKSB7IC8vIFRoZSBpbXBhY3Qgb2YgdGhlIGNvbGxpc2lvbiBpbnZvbHZpbmcgYWxsIHRvdWNoaW5nIHBvaW50c1xyXG4gICAgICAgIG5vcm1hbEltcHVsc2UgKz0gbWFuaWZvbGRQb2ludC5nZXROb3JtYWxJbXB1bHNlKCk7XHJcbiAgICAgICAgdGFuZ2VudEltcHVsc2UgKz0gbWFuaWZvbGRQb2ludC5nZXRUYW5nZW50SW1wdWxzZSgpO1xyXG4gICAgICAgIGJpbm9ybWFsSW1wdWxzZSArPSBtYW5pZm9sZFBvaW50LmdldEJpbm9ybWFsSW1wdWxzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBub3JtYWw6IE9JTU8uVmVjMyA9IG1hbmlmb2xkLmdldE5vcm1hbCgpO1xyXG4gICAgICBsZXQgY29sbGlzaW9uTm9ybWFsOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMobm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueik7XHJcbiAgICAgIGxldCBjb2xsaXNpb25DZW50ZXJQb2ludDogVmVjdG9yMyA9IGJvZHlBLmNvbGxpc2lvbkNlbnRlclBvaW50KHBvaW50cywgbWFuaWZvbGQuZ2V0TnVtUG9pbnRzKCkpO1xyXG4gICAgICBib2R5QS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudFBoeXNpY3MoRVZFTlRfUEhZU0lDUy5DT0xMSVNJT05fRU5URVIsIGJvZHlCLCBub3JtYWxJbXB1bHNlLCB0YW5nZW50SW1wdWxzZSwgYmlub3JtYWxJbXB1bHNlLCBjb2xsaXNpb25DZW50ZXJQb2ludCwgY29sbGlzaW9uTm9ybWFsKSk7XHJcbiAgICAgIGJvZHlCLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLkNPTExJU0lPTl9FTlRFUiwgYm9keUEsIG5vcm1hbEltcHVsc2UsIHRhbmdlbnRJbXB1bHNlLCBiaW5vcm1hbEltcHVsc2UsIGNvbGxpc2lvbkNlbnRlclBvaW50LCBjb2xsaXNpb25Ob3JtYWwpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbGxpc2lvbkV4aXQoX2NvbnRhY3Q6IE9JTU8uQ29udGFjdCk6IHZvaWQge1xyXG4gICAgICBsZXQgYm9keUE6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9jb250YWN0LmdldFNoYXBlMSgpPy51c2VyRGF0YTtcclxuICAgICAgbGV0IGJvZHlCOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTIoKT8udXNlckRhdGE7XHJcblxyXG4gICAgICBpZiAoIWJvZHlBIHx8ICFib2R5QiB8fCAhYm9keUEuY29sbGlzaW9ucy5pbmNsdWRlcyhib2R5QikpIC8vIGFscmVhZHkgZXhpdGVkXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgYm9keUEuY29sbGlzaW9ucy5zcGxpY2UoYm9keUEuY29sbGlzaW9ucy5pbmRleE9mKGJvZHlCKSwgMSk7XHJcbiAgICAgIGJvZHlCLmNvbGxpc2lvbnMuc3BsaWNlKGJvZHlCLmNvbGxpc2lvbnMuaW5kZXhPZihib2R5QSksIDEpO1xyXG5cclxuICAgICAgYm9keUEuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuQ09MTElTSU9OX0VYSVQsIGJvZHlCLCAwLCAwLCAwKSk7XHJcbiAgICAgIGJvZHlCLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLkNPTExJU0lPTl9FWElULCBib2R5QSwgMCwgMCwgMCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBUcmlnZ2VyIEVudGVyaW5nRXZlbnQgQ2FsbGJhY2ssIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5IE9JTU8gUGh5c2ljcyB3aXRoaW4gdGhlaXIgY2FsY3VsYXRpb25zLlxyXG4gICAgKiBTaW5jZSB0aGUgZXZlbnQgZG9lcyBub3Qga25vdyB3aGljaCBib2R5IGlzIHRoZSB0cmlnZ2VyIGluaWF0b3IsIHRoZSBldmVudCBjYW4gYmUgbGlzdGVuZWQgdG9cclxuICAgICogb24gZWl0aGVyIHRoZSB0cmlnZ2VyIG9yIHRoZSB0cmlnZ2VyZWQuIChUaGlzIGlzIG9ubHkgcG9zc2libGUgd2l0aCB0aGUgRlVER0UgT0lNTyBGb3JrISlcclxuICAgICovXHJcbiAgICBwcml2YXRlIHRyaWdnZXJFbnRlcihfY29udGFjdDogT0lNTy5Db250YWN0KTogdm9pZCB7XHJcbiAgICAgIGxldCBib2R5QTogQ29tcG9uZW50UmlnaWRib2R5ID0gX2NvbnRhY3QuZ2V0U2hhcGUxKCk/LnVzZXJEYXRhO1xyXG4gICAgICBsZXQgYm9keUI6IENvbXBvbmVudFJpZ2lkYm9keSA9IF9jb250YWN0LmdldFNoYXBlMigpPy51c2VyRGF0YTtcclxuXHJcbiAgICAgIGlmICghYm9keUEgfHwgIWJvZHlCIHx8IGJvZHlBLnRyaWdnZXJpbmdzLmluY2x1ZGVzKGJvZHlCKSkgLy8gYWxyZWFkeSBlbnRlcmVkXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgYm9keUEudHJpZ2dlcmluZ3MucHVzaChib2R5Qik7XHJcbiAgICAgIGJvZHlCLnRyaWdnZXJpbmdzLnB1c2goYm9keUEpO1xyXG5cclxuICAgICAgbGV0IG1hbmlmb2xkOiBPSU1PLk1hbmlmb2xkID0gX2NvbnRhY3QuZ2V0TWFuaWZvbGQoKTtcclxuICAgICAgbGV0IHBvaW50czogT0lNTy5NYW5pZm9sZFBvaW50W10gPSBtYW5pZm9sZC5nZXRQb2ludHMoKTsgXHJcbiAgICAgIGxldCBub3JtYWw6IE9JTU8uVmVjMyA9IG1hbmlmb2xkLmdldE5vcm1hbCgpO1xyXG4gICAgICBsZXQgY29sbGlzaW9uTm9ybWFsOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMobm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueik7XHJcbiAgICAgIGxldCBjb2xsaXNpb25DZW50ZXJQb2ludDogVmVjdG9yMyA9IGJvZHlBLmNvbGxpc2lvbkNlbnRlclBvaW50KHBvaW50cywgbWFuaWZvbGQuZ2V0TnVtUG9pbnRzKCkpO1xyXG5cclxuICAgICAgYm9keUEuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuVFJJR0dFUl9FTlRFUiwgYm9keUIsIDAsIDAsIDAsIGNvbGxpc2lvbkNlbnRlclBvaW50LCBjb2xsaXNpb25Ob3JtYWwpKTtcclxuICAgICAgYm9keUIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuVFJJR0dFUl9FTlRFUiwgYm9keUEsIDAsIDAsIDAsIGNvbGxpc2lvbkNlbnRlclBvaW50LCBjb2xsaXNpb25Ob3JtYWwpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogVHJpZ2dlciBMZWF2aW5nRXZlbnQgQ2FsbGJhY2ssIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5IE9JTU8gUGh5c2ljcyB3aXRoaW4gdGhlaXIgY2FsY3VsYXRpb25zLlxyXG4gICAgKiBTaW5jZSB0aGUgZXZlbnQgZG9lcyBub3Qga25vdyB3aGljaCBib2R5IGlzIHRoZSB0cmlnZ2VyIGluaWF0b3IsIHRoZSBldmVudCBjYW4gYmUgbGlzdGVuZWQgdG9cclxuICAgICogb24gZWl0aGVyIHRoZSB0cmlnZ2VyIG9yIHRoZSB0cmlnZ2VyZWQuIChUaGlzIGlzIG9ubHkgcG9zc2libGUgd2l0aCB0aGUgRlVER0UgT0lNTyBGb3JrISlcclxuICAgICovXHJcbiAgICBwcml2YXRlIHRyaWdnZXJFeGl0KF9jb250YWN0OiBPSU1PLkNvbnRhY3QpOiB2b2lkIHtcclxuICAgICAgbGV0IGJvZHlBOiBDb21wb25lbnRSaWdpZGJvZHkgPSBfY29udGFjdC5nZXRTaGFwZTEoKT8udXNlckRhdGE7XHJcbiAgICAgIGxldCBib2R5QjogQ29tcG9uZW50UmlnaWRib2R5ID0gX2NvbnRhY3QuZ2V0U2hhcGUyKCk/LnVzZXJEYXRhO1xyXG5cclxuICAgICAgaWYgKCFib2R5QSB8fCAhYm9keUIgfHwgIWJvZHlBLnRyaWdnZXJpbmdzLmluY2x1ZGVzKGJvZHlCKSkgLy8gYWxyZWFkeSBleGl0ZWRcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBib2R5QS50cmlnZ2VyaW5ncy5zcGxpY2UoYm9keUEuY29sbGlzaW9ucy5pbmRleE9mKGJvZHlCKSwgMSk7XHJcbiAgICAgIGJvZHlCLnRyaWdnZXJpbmdzLnNwbGljZShib2R5Qi5jb2xsaXNpb25zLmluZGV4T2YoYm9keUEpLCAxKTtcclxuXHJcbiAgICAgIGJvZHlBLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50UGh5c2ljcyhFVkVOVF9QSFlTSUNTLlRSSUdHRVJfRVhJVCwgYm9keUIsIDAsIDAsIDApKTtcclxuICAgICAgYm9keUIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRQaHlzaWNzKEVWRU5UX1BIWVNJQ1MuVFJJR0dFUl9FWElULCBib2R5QSwgMCwgMCwgMCkpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKiBJbnRlcm5hbCBjbGFzcyBmb3IgaG9sZGluZyBkYXRhIGFib3V0IHBoeXNpY3MgZGVidWcgdmVydGljZXMuKi9cclxuICBleHBvcnQgY2xhc3MgUGh5c2ljc0RlYnVnVmVydGV4QnVmZmVyIHtcclxuICAgIHB1YmxpYyBnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuICAgIHB1YmxpYyBudW1WZXJ0aWNlczogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBhdHRyaWJzOiBBcnJheTxQaHlzaWNzRGVidWdWZXJ0ZXhBdHRyaWJ1dGU+O1xyXG4gICAgcHVibGljIGluZGljZXM6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgb2Zmc2V0czogQXJyYXk8bnVtYmVyPjtcclxuICAgIHB1YmxpYyBzdHJpZGU6IG51bWJlcjtcclxuICAgIHB1YmxpYyBidWZmZXI6IFdlYkdMQnVmZmVyO1xyXG4gICAgcHVibGljIGRhdGFMZW5ndGg6IG51bWJlcjtcclxuXHJcbiAgICAvKiogU2V0dXAgdGhlIHJlbmRlcmluZyBjb250ZXh0IGZvciB0aGlzIGJ1ZmZlciBhbmQgY3JlYXRlIHRoZSBhY3R1YWwgYnVmZmVyIGZvciB0aGlzIGNvbnRleHQuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3JlbmRlcmluZ0NvbnRleHQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpIHtcclxuICAgICAgdGhpcy5nbCA9IF9yZW5kZXJpbmdDb250ZXh0O1xyXG4gICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZpbGwgdGhlIGJvdW5kIGJ1ZmZlciB3aXRoIGRhdGEuIFVzZWQgYXQgYnVmZmVyIGluaXRpYWxpemF0aW9uICovXHJcbiAgICBwdWJsaWMgc2V0RGF0YShfYXJyYXk6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuYXR0cmlicyA9PSBudWxsKSB0aHJvdyBcInNldCBhdHRyaWJ1dGVzIGZpcnN0XCI7XHJcbiAgICAgIHRoaXMubnVtVmVydGljZXMgPSBfYXJyYXkubGVuZ3RoIC8gKHRoaXMuc3RyaWRlIC8gNCk7XHJcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy5idWZmZXIpO1xyXG4gICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoX2FycmF5KSwgdGhpcy5nbC5EWU5BTUlDX0RSQVcpO1xyXG4gICAgICAvL25vdCBuZWNlc3NhcnkgYW4gaW4gd2ViZ2wyIGFueW1vcmUgdG8gcmViaW5kIHRoZSBzYW1lIGxhc3QgYnVmZmVyICh3aGljaCBpcyBhY2hpZXZlZCBieSBnaXZpbmcgYSBudWxsIGJ1ZmZlciksIGFmdGVyIGJ1ZmZlciBpcyBjaGFuZ2VkLiBSZW1vdmVkIGl0IG9uIGFsbCBvdGhlciBvY2Nhc2lvbnNcclxuICAgICAgLy8gdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBudWxsKTsgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNldCBTaGFkZXIgQXR0cmlidXRlcyBpbmZvcm1hdGlvbnMgYnkgZ2V0dGluZyB0aGVpciBwb3NpdGlvbiBpbiB0aGUgc2hhZGVyLCBzZXR0aW5nIHRoZSBvZmZzZXQsIHN0cmlkZSBhbmQgc2l6ZS4gRm9yIGxhdGVyIHVzZSBpbiB0aGUgYmluZGluZyBwcm9jZXNzICovXHJcbiAgICBwdWJsaWMgc2V0QXR0cmlicyhfYXR0cmliczogQXJyYXk8UGh5c2ljc0RlYnVnVmVydGV4QXR0cmlidXRlPik6IHZvaWQge1xyXG4gICAgICB0aGlzLmF0dHJpYnMgPSBfYXR0cmlicztcclxuICAgICAgdGhpcy5vZmZzZXRzID0gW107XHJcbiAgICAgIHRoaXMuc3RyaWRlID0gMDtcclxuICAgICAgbGV0IG46IG51bWJlciA9IF9hdHRyaWJzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIHRoaXMub2Zmc2V0cy5wdXNoKHRoaXMuc3RyaWRlKTtcclxuICAgICAgICB0aGlzLnN0cmlkZSArPSBfYXR0cmlic1tpXS5mbG9hdDMyQ291bnQgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIDMyYml0IGZsb2F0IEJ5dGVzIGFyZSBhIGNvbnN0YW50IG9mIDRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIHNoYWRlciAqL1xyXG4gICAgcHVibGljIGxvYWRBdHRyaWJJbmRpY2VzKF9wcm9ncmFtOiBQaHlzaWNzRGVidWdTaGFkZXIpOiB2b2lkIHtcclxuICAgICAgdGhpcy5pbmRpY2VzID0gX3Byb2dyYW0uZ2V0QXR0cmliSW5kaWNlcyh0aGlzLmF0dHJpYnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFbmFibGUgYSBhdHRyaWJ1dGUgaW4gYSBzaGFkZXIgZm9yIHRoaXMgY29udGV4dCwgKi9cclxuICAgIHB1YmxpYyBiaW5kQXR0cmlicygpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuaW5kaWNlcyA9PSBudWxsKSB0aHJvdyBcImluZGljZXMgYXJlIG5vdCBsb2FkZWRcIjtcclxuICAgICAgbGV0IG46IG51bWJlciA9IHRoaXMuYXR0cmlicy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy5idWZmZXIpOyAvL21ha2luZyB0aGUgYnVmZmVyIG9mIHRoaXMgY2xhc3MgdGhlIGN1cnJlbnQgYnVmZmVyXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICB0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRoaXMuaW5kaWNlc1tpXSk7IC8vZW5hYmxlIHRoZSBBdHRyaWJ1dGVcclxuICAgICAgICB0aGlzLmdsLnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5pbmRpY2VzW2ldLCB0aGlzLmF0dHJpYnNbaV0uZmxvYXQzMkNvdW50LCB0aGlzLmdsLkZMT0FULCBmYWxzZSwgdGhpcy5zdHJpZGUsIHRoaXMub2Zmc2V0c1tpXSk7IC8vY3JlYXRlcyBhIHBvaW50ZXIgYW5kIHN0cnVjdHVyZSBmb3IgdGhpcyBhdHRyaWJ1dGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIGNsYXNzIGZvciBob2xkaW5nIGRhdGEgYWJvdXQgUGh5c2ljc0RlYnVnVmVydGV4QnVmZmVycyAqL1xyXG4gIGV4cG9ydCBjbGFzcyBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlciB7XHJcbiAgICBwdWJsaWMgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XHJcbiAgICBwdWJsaWMgYnVmZmVyOiBXZWJHTEJ1ZmZlcjtcclxuICAgIHB1YmxpYyBjb3VudDogbnVtYmVyO1xyXG5cclxuICAgIC8qKiBTZXR1cCB0aGUgcmVuZGVyaW5nIGNvbnRleHQgZm9yIHRoaXMgYnVmZmVyIGFuZCBjcmVhdGUgdGhlIGFjdHVhbCBidWZmZXIgZm9yIHRoaXMgY29udGV4dC4gKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfcmVuZGVyaW5nQ29udGV4dDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCkge1xyXG4gICAgICB0aGlzLmdsID0gX3JlbmRlcmluZ0NvbnRleHQ7XHJcbiAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRmlsbCB0aGUgYm91bmQgYnVmZmVyIHdpdGggZGF0YSBhbW91bnQuIFVzZWQgYXQgYnVmZmVyIGluaXRpYWxpemF0aW9uICovXHJcbiAgICBwdWJsaWMgc2V0RGF0YShfYXJyYXk6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcclxuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuYnVmZmVyKTtcclxuICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG5ldyBJbnQxNkFycmF5KF9hcnJheSksIHRoaXMuZ2wuRFlOQU1JQ19EUkFXKTtcclxuICAgICAgdGhpcy5jb3VudCA9IF9hcnJheS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBhY3R1YWwgRHJhd0NhbGwgZm9yIHBoeXNpY3NEZWJ1Z0RyYXcgQnVmZmVycy4gVGhpcyBpcyB3aGVyZSB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGVidWcgaXMgYWN0dWFsbHkgZHJhd24uICovXHJcbiAgICBwdWJsaWMgZHJhdyhfbW9kZTogbnVtYmVyID0gdGhpcy5nbC5UUklBTkdMRVMsIF9jb3VudDogbnVtYmVyID0gLTEpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuYnVmZmVyKTtcclxuICAgICAgdGhpcy5nbC5kcmF3RWxlbWVudHMoX21vZGUsIF9jb3VudCA+PSAwID8gX2NvdW50IDogdGhpcy5jb3VudCwgdGhpcy5nbC5VTlNJR05FRF9TSE9SVCwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogSW50ZXJuYWwgY2xhc3MgZm9yIG1hbmFnaW5nIGRhdGEgYWJvdXQgd2ViR0wgQXR0cmlidXRlcyAqL1xyXG4gIGV4cG9ydCBjbGFzcyBQaHlzaWNzRGVidWdWZXJ0ZXhBdHRyaWJ1dGUge1xyXG4gICAgcHVibGljIGZsb2F0MzJDb3VudDogbnVtYmVyO1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2Zsb2F0MzJDb3VudDogbnVtYmVyLCBfbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmZsb2F0MzJDb3VudCA9IF9mbG9hdDMyQ291bnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogSW50ZXJuYWwgY2xhc3MgZm9yIFNoYWRlcnMgdXNlZCBvbmx5IGJ5IHRoZSBwaHlzaWNzIGRlYnVnRHJhdyAqL1xyXG4gIGV4cG9ydCBjbGFzcyBQaHlzaWNzRGVidWdTaGFkZXIge1xyXG4gICAgcHVibGljIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xyXG4gICAgcHVibGljIHByb2dyYW06IFdlYkdMUHJvZ3JhbTtcclxuICAgIHB1YmxpYyB2ZXJ0ZXhTaGFkZXI6IFdlYkdMU2hhZGVyO1xyXG4gICAgcHVibGljIGZyYWdtZW50U2hhZGVyOiBXZWJHTFNoYWRlcjtcclxuICAgIHB1YmxpYyB1bmlmb3JtTG9jYXRpb25NYXA6IE1hcDxzdHJpbmcsIFdlYkdMVW5pZm9ybUxvY2F0aW9uPjtcclxuXHJcbiAgICAvKiogSW50cm9kdWNlIHRoZSBGVURHRSBSZW5kZXJpbmcgQ29udGV4dCB0byB0aGlzIGNsYXNzLCBjcmVhdGluZyBhIHByb2dyYW0gYW5kIHZlcnRleC9mcmFnbWVudCBzaGFkZXIgaW4gdGhpcyBjb250ZXh0ICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX3JlbmRlcmluZ0NvbnRleHQ6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpIHtcclxuICAgICAgdGhpcy5nbCA9IF9yZW5kZXJpbmdDb250ZXh0O1xyXG4gICAgICB0aGlzLnByb2dyYW0gPSB0aGlzLmdsLmNyZWF0ZVByb2dyYW0oKTtcclxuICAgICAgdGhpcy52ZXJ0ZXhTaGFkZXIgPSB0aGlzLmdsLmNyZWF0ZVNoYWRlcih0aGlzLmdsLlZFUlRFWF9TSEFERVIpO1xyXG4gICAgICB0aGlzLmZyYWdtZW50U2hhZGVyID0gdGhpcy5nbC5jcmVhdGVTaGFkZXIodGhpcy5nbC5GUkFHTUVOVF9TSEFERVIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUYWtlIGdsc2wgc2hhZGVycyBhcyBzdHJpbmdzIGFuZCBjb21waWxlIHRoZW0sIGF0dGFjaGluZyB0aGUgY29tcGlsZWQgc2hhZGVycyB0byBhIHByb2dyYW0gdGhhdHMgdXNlZCBieSB0aGlzIHJlbmRlcmluZyBjb250ZXh0LiAqL1xyXG4gICAgcHVibGljIGNvbXBpbGUoX3ZlcnRleFNvdXJjZTogc3RyaW5nLCBfZnJhZ21lbnRTb3VyY2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICB0aGlzLnVuaWZvcm1Mb2NhdGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBXZWJHTFVuaWZvcm1Mb2NhdGlvbj4oKTtcclxuICAgICAgdGhpcy5jb21waWxlU2hhZGVyKHRoaXMudmVydGV4U2hhZGVyLCBfdmVydGV4U291cmNlKTtcclxuICAgICAgdGhpcy5jb21waWxlU2hhZGVyKHRoaXMuZnJhZ21lbnRTaGFkZXIsIF9mcmFnbWVudFNvdXJjZSk7XHJcbiAgICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHRoaXMucHJvZ3JhbSwgdGhpcy52ZXJ0ZXhTaGFkZXIpO1xyXG4gICAgICB0aGlzLmdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHRoaXMuZnJhZ21lbnRTaGFkZXIpO1xyXG4gICAgICB0aGlzLmdsLmxpbmtQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICAgIGlmICghdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSwgdGhpcy5nbC5MSU5LX1NUQVRVUykpIHsgIC8vbWFrZSBzdXJlIHRoZSBsaW5raW5nIHdvcmtlZCwgc28gdGhlIHByb2dyYW0gaXMgdmFsaWQsIGFuZCBzaGFkZXJzIGFyZSB3b3JraW5nXHJcbiAgICAgICAgRGVidWcubG9nKHRoaXMuZ2wuZ2V0UHJvZ3JhbUluZm9Mb2codGhpcy5wcm9ncmFtKSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5nbC52YWxpZGF0ZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcclxuICAgICAgaWYgKCF0aGlzLmdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLCB0aGlzLmdsLlZBTElEQVRFX1NUQVRVUykpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRVJST1IgdmFsaWRhdGluZyBwcm9ncmFtIVwiLCB0aGlzLmdsLmdldFByb2dyYW1JbmZvTG9nKHRoaXMucHJvZ3JhbSkpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgaW5kZXggb2YgYSBhdHRyaWJ1dGUgaW4gYSBzaGFkZXIgaW4gdGhpcyBwcm9ncmFtICovXHJcbiAgICBwdWJsaWMgZ2V0QXR0cmliSW5kZXgoX25hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgX25hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgdGhlIGxvY2F0aW9uIG9mIGEgdW5pZm9ybSBpbiBhIHNoYWRlciBpbiB0aGlzIHByb2dyYW0gKi9cclxuICAgIHB1YmxpYyBnZXRVbmlmb3JtTG9jYXRpb24oX25hbWU6IHN0cmluZyk6IFdlYkdMVW5pZm9ybUxvY2F0aW9uIHtcclxuICAgICAgaWYgKHRoaXMudW5pZm9ybUxvY2F0aW9uTWFwLmhhcyhfbmFtZSkpIHJldHVybiB0aGlzLnVuaWZvcm1Mb2NhdGlvbk1hcC5nZXQoX25hbWUpO1xyXG4gICAgICBsZXQgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCBfbmFtZSk7XHJcbiAgICAgIHRoaXMudW5pZm9ybUxvY2F0aW9uTWFwLnNldChfbmFtZSwgbG9jYXRpb24pO1xyXG4gICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdldCBhbGwgaW5kaWNlcyBmb3IgZXZlcnkgYXR0cmlidXRlIGluIHRoZSBzaGFkZXJzIG9mIHRoaXMgcHJvZ3JhbSAqL1xyXG4gICAgcHVibGljIGdldEF0dHJpYkluZGljZXMoX2F0dHJpYnM6IEFycmF5PFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZT4pOiBBcnJheTxudW1iZXI+IHtcclxuICAgICAgbGV0IGluZGljZXM6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuICAgICAgX2F0dHJpYnMuZm9yRWFjaChfdmFsdWUgPT4ge1xyXG4gICAgICAgIGluZGljZXMucHVzaCh0aGlzLmdldEF0dHJpYkluZGV4KF92YWx1ZS5uYW1lKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gaW5kaWNlcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGVsbCB0aGUgRlVER0UgUmVuZGVyaW5nIENvbnRleHQgdG8gdXNlIHRoaXMgcHJvZ3JhbSB0byBkcmF3LiAqL1xyXG4gICAgcHVibGljIHVzZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvbXBpbGUgYSBzaGFkZXIgb3V0IG9mIGEgc3RyaW5nIGFuZCB2YWxpZGF0ZSBpdC4gKi9cclxuICAgIHB1YmxpYyBjb21waWxlU2hhZGVyKF9zaGFkZXI6IFdlYkdMU2hhZGVyLCBfc291cmNlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nbC5zaGFkZXJTb3VyY2UoX3NoYWRlciwgX3NvdXJjZSk7XHJcbiAgICAgIHRoaXMuZ2wuY29tcGlsZVNoYWRlcihfc2hhZGVyKTtcclxuICAgICAgaWYgKCF0aGlzLmdsLmdldFNoYWRlclBhcmFtZXRlcihfc2hhZGVyLCB0aGlzLmdsLkNPTVBJTEVfU1RBVFVTKSkge1xyXG4gICAgICAgIERlYnVnLmxvZyh0aGlzLmdsLmdldFNoYWRlckluZm9Mb2coX3NoYWRlcikpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogSW50ZXJuYWwgQ2xhc3MgdXNlZCB0byBkcmF3IGRlYnVnSW5mb3JtYXRpb25zIGFib3V0IHRoZSBwaHlzaWNzIHNpbXVsYXRpb24gb250byB0aGUgcmVuZGVyQ29udGV4dC4gTm8gdXNlciBpbnRlcmFjdGlvbiBuZWVkZWQuIFxyXG4gICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVIDIwMjAgLy9CYXNlZCBvbiBPaW1vUGh5c2ljcyBIYXhlIERlYnVnRHJhd0RlbW8gXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBoeXNpY3NEZWJ1Z0RyYXcgZXh0ZW5kcyBSZW5kZXJXZWJHTCB7XHJcbiAgICBwdWJsaWMgb2ltb0RlYnVnRHJhdzogT0lNTy5EZWJ1Z0RyYXc7IC8vdGhlIG9yaWdpbmFsIHBoeXNpY3MgZW5naW5lIGRlYnVnRHJhdyBjbGFzcyByZWNlaXZpbmcgY2FsbHMgZnJvbSB0aGUgb2ltb1BoeXNpY3MuV29ybGQsIGFuZCBwcm92aWRpbmcgaW5mb3JtYXRpb25zIGluIGZvcm0gb2YgcG9pbnRzL2xpbmVzL3RyaWFuZ2xlcyB3aGF0IHRoZSBwaHlzaWNzIHdvcmxkIGxvb2tzIGxpa2VcclxuICAgIHB1YmxpYyBzdHlsZTogT0lNTy5EZWJ1Z0RyYXdTdHlsZTsgLy9jb2xvcnMgb2YgdGhlIGRlYnVnIGluZm9ybWF0aW9ucywgdW5jaGFuZ2VkIGluIEZVREdFIGludGVncmF0aW9uLCBiYXNpY2FsbHkgY29sb3JpbmcgdGhpbmdzIGxpa2Ugc2xlZXBpbmcvYWN0aXZlIHJiJ3MgZGlmZmVyZW50bHksIGpvaW50cyB3aGl0ZSBhbmQgc3VjaC4gTm8gbmVlZCB0byBoYXZlIHVzZXJzIGNoYW5nZSBhbnl0aGluZy5cclxuICAgIHB1YmxpYyBnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuXHJcbiAgICBwdWJsaWMgcHJvZ3JhbTogV2ViR0xQcm9ncmFtOyAvL3Byb2dyYW0gdGhhdCBpcyB1c2VkIGluIHRoZSBGVURHRSByZW5kZXJpbmcgY29udGV4dCBjb250YWluaW5nIHNoYWRlcnMgYW5kIHVzZSBpbmZvcm1hdGlvbnMgZm9yIHRoZSBjb250ZXh0IHRvIGtub3cgaG93IHRvIGRyYXdcclxuICAgIHB1YmxpYyBzaGFkZXI6IFBoeXNpY3NEZWJ1Z1NoYWRlcjtcclxuXHJcbiAgICAvL0J1ZmZlcnMgZm9yIHBvaW50cy9saW5lcy90cmlhbmdsZXMuIEluZGV4IEJ1ZmZlciBmb3IgdGhlIGFtb3VudCBvZiBkcmF3Q2FsbHMgYW5kIFZlcnRleCBCdWZmZXIgZm9yIHRoZSBpbmZvcm1hdGlvbnNcclxuICAgIHB1YmxpYyBwb2ludFZCTzogUGh5c2ljc0RlYnVnVmVydGV4QnVmZmVyO1xyXG4gICAgcHVibGljIHBvaW50SUJPOiBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcjtcclxuXHJcbiAgICBwdWJsaWMgbGluZVZCTzogUGh5c2ljc0RlYnVnVmVydGV4QnVmZmVyO1xyXG4gICAgcHVibGljIGxpbmVJQk86IFBoeXNpY3NEZWJ1Z0luZGV4QnVmZmVyO1xyXG5cclxuICAgIHB1YmxpYyB0cmlWQk86IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcjtcclxuICAgIHB1YmxpYyB0cmlJQk86IFBoeXNpY3NEZWJ1Z0luZGV4QnVmZmVyO1xyXG5cclxuICAgIHB1YmxpYyBwb2ludERhdGE6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgcG9pbnRJYm9EYXRhOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIG51bVBvaW50RGF0YTogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBsaW5lRGF0YTogQXJyYXk8bnVtYmVyPjtcclxuICAgIHB1YmxpYyBsaW5lSWJvRGF0YTogQXJyYXk8bnVtYmVyPjtcclxuICAgIHB1YmxpYyBudW1MaW5lRGF0YTogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyB0cmlEYXRhOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIHRyaUlib0RhdGE6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgbnVtVHJpRGF0YTogbnVtYmVyO1xyXG5cclxuICAgIC8qKiBDcmVhdGluZyB0aGUgZGVidWcgZm9yIHBoeXNpY3MgaW4gRlVER0UuIFRlbGwgaXQgdG8gZHJhdyBvbmx5IHdpcmVmcmFtZSBvYmplY3RzLCBzaW5jZSBGVURHRSBpcyBoYW5kbGluZyByZW5kZXJpbmcgb2YgdGhlIG9iamVjdHMgYmVzaWRlcyBwaHlzaWNzLiBcclxuICAgICAqIE92ZXJyaWRlIE9pbW9QaHlzaWNzIEZ1bmN0aW9ucyB3aXRoIG93biByZW5kZXJpbmcuIEluaXRpYWxpemUgYnVmZmVycyBhbmQgY29ubmVjdCB0aGVtIHdpdGggdGhlIGNvbnRleHQgZm9yIGxhdGVyIHVzZS4gKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgIHRoaXMuc3R5bGUgPSBuZXcgT0lNTy5EZWJ1Z0RyYXdTdHlsZSgpO1xyXG4gICAgICB0aGlzLm9pbW9EZWJ1Z0RyYXcgPSBuZXcgT0lNTy5EZWJ1Z0RyYXcoKTtcclxuICAgICAgdGhpcy5vaW1vRGVidWdEcmF3LndpcmVmcmFtZSA9IHRydWU7IC8vVHJpYW5nbGUgUmVuZGVyaW5nIGlzIGhhbmRsZWQgYnkgRlVER0Ugc28sIG9ubHkgdGhlIHBoeXNpY3MgbGluZXMvcG9pbnRzIG5lZWQgdG8gYmUgcmVuZGVyZWQsIGFsdGhvdWdoIHRyaWFuZ2xlIGlzIHN0aWxsIGltcGxlbWVudGVkXHJcblxyXG4gICAgICB0aGlzLmdsID0gUmVuZGVyV2ViR0wuY3JjMztcclxuICAgICAgdGhpcy5pbml0aWFsaXplT3ZlcnJpZGUoKTtcclxuICAgICAgdGhpcy5zaGFkZXIgPSBuZXcgUGh5c2ljc0RlYnVnU2hhZGVyKHRoaXMuZ2wpO1xyXG4gICAgICB0aGlzLnNoYWRlci5jb21waWxlKHRoaXMudmVydGV4U2hhZGVyU291cmNlKCksIHRoaXMuZnJhZ21lbnRTaGFkZXJTb3VyY2UoKSk7XHJcblxyXG4gICAgICB0aGlzLmluaXRpYWxpemVCdWZmZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJlY2VpdmUgdGhlIGN1cnJlbnQgRGVidWdNb2RlIGZyb20gdGhlIHBoeXNpY3Mgc2V0dGluZ3MgYW5kIHNldCB0aGUgT2ltb1BoeXNpY3MuRGVidWdEcmF3IGJvb2xlYW5zIHRvIHNob3cgb25seSBjZXJ0YWluIGluZm9ybWF0aW9ucy5cclxuICAgICAqIE5lZWRlZCBzaW5jZSBzb21lIGRlYnVnIGluZm9ybWF0aW9ucyBleGNsdWRlIG90aGVycywgYW5kIGNhbid0IGJlIGRyYXduIGF0IHRoZSBzYW1lIHRpbWUsIGJ5IE9pbW9QaHlzaWNzLiBBbmQgZm9yIHVzZXJzIGl0IHByb3ZpZGVzIG1vcmUgcmVhZGFiaWxpdHlcclxuICAgICAqIHRvIGRlYnVnIG9ubHkgd2hhdCB0aGV5IG5lZWQgYW5kIGlzIGNvbW1vbmx5IGRlYnVnZ2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0RGVidWdNb2RlKF9tb2RlOiBQSFlTSUNTX0RFQlVHTU9ERSA9IFBIWVNJQ1NfREVCVUdNT0RFLk5PTkUpOiB2b2lkIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXHJcbiAgICAgIGxldCBkcmF3ID0geyBkcmF3QWFiYnM6IGZhbHNlLCBkcmF3QmFzZXM6IGZhbHNlLCBkcmF3QnZoOiBmYWxzZSwgZHJhd0NvbnRhY3RCYXNlczogZmFsc2UsIGRyYXdDb250YWN0czogZmFsc2UsIGRyYXdKb2ludExpbWl0czogZmFsc2UsIGRyYXdKb2ludHM6IGZhbHNlLCBkcmF3UGFpcnM6IGZhbHNlLCBkcmF3U2hhcGVzOiBmYWxzZSB9O1xyXG5cclxuICAgICAgc3dpdGNoIChfbW9kZSkge1xyXG4gICAgICAgIGNhc2UgUEhZU0lDU19ERUJVR01PREUuQ09MTElERVJTOiAvL0NvbGxpZGVycyBhbmQgQmFzZXNcclxuICAgICAgICAgIGRyYXcuZHJhd0Jhc2VzID0gZHJhdy5kcmF3U2hhcGVzID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUEhZU0lDU19ERUJVR01PREUuSk9JTlRTX0FORF9DT0xMSURFUjogLy9Db2xsaWRlcnMgYW5kIGpvaW50c1xyXG4gICAgICAgICAgZHJhdy5kcmF3Sm9pbnRzID0gZHJhdy5kcmF3Sm9pbnRMaW1pdHMgPSBkcmF3LmRyYXdTaGFwZXMgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSFlTSUNTX0RFQlVHTU9ERS5QSFlTSUNfT0JKRUNUU19PTkxZOiAvL1BoeXNpY3MgT2JqZWN0cyBvbmx5LCBzaG93cyBzYW1lIGFzIENvbGxpZGVyIC8gSm9pbnRzIGJ1dCBhbHNvIGhpZGluZyBldmVyeSBvdGhlciBmdWRnZSBvYmplY3RcclxuICAgICAgICAgIGRyYXcuZHJhd0Jhc2VzID0gZHJhdy5kcmF3Sm9pbnRMaW1pdHMgPSBkcmF3LmRyYXdKb2ludHMgPSBkcmF3LmRyYXdTaGFwZXMgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSFlTSUNTX0RFQlVHTU9ERS5DT05UQUNUUzogLy9Db250YWN0c1xyXG4gICAgICAgICAgZHJhdy5kcmF3QmFzZXMgPSBkcmF3LmRyYXdDb250YWN0QmFzZXMgPSBkcmF3LmRyYXdDb250YWN0cyA9IGRyYXcuZHJhd1BhaXJzID0gZHJhdy5kcmF3U2hhcGVzID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUEhZU0lDU19ERUJVR01PREUuQk9VTkRJTkdfQk9YRVM6IC8vQm91bmRpbmcgQm94IC8gQnJvYWRwaGFzZSBCdmggLyBCYXNlc1xyXG4gICAgICAgICAgZHJhdy5kcmF3QWFiYnMgPSBkcmF3LmRyYXdCYXNlcyA9IGRyYXcuZHJhd0J2aCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMub2ltb0RlYnVnRHJhdywgZHJhdyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENyZWF0aW5nIHRoZSBlbXB0eSByZW5kZXIgYnVmZmVycy4gRGVmaW5pbmcgdGhlIGF0dHJpYnV0ZXMgdXNlZCBpbiBzaGFkZXJzLlxyXG4gICAgICogTmVlZHMgdG8gY3JlYXRlIGVtcHR5IGJ1ZmZlcnMgdG8gYWxyZWFkeSBoYXZlIHRoZW0gcmVhZHkgdG8gZHJhdyBsYXRlciBvbiwgbGlua2luZyBpcyBvbmx5IHBvc3NpYmxlIHdpdGggZXhpc3RpbmcgYnVmZmVycy4gKi9cclxuICAgIHB1YmxpYyBpbml0aWFsaXplQnVmZmVycygpOiB2b2lkIHtcclxuICAgICAgbGV0IGF0dHJpYnM6IEFycmF5PFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZT4gPSBbXHJcbiAgICAgICAgbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEF0dHJpYnV0ZSgzLCBcImFQb3NpdGlvblwiKSxcclxuICAgICAgICBuZXcgUGh5c2ljc0RlYnVnVmVydGV4QXR0cmlidXRlKDMsIFwiYU5vcm1hbFwiKSxcclxuICAgICAgICBuZXcgUGh5c2ljc0RlYnVnVmVydGV4QXR0cmlidXRlKDMsIFwiYUNvbG9yXCIpXHJcbiAgICAgIF07XHJcblxyXG4gICAgICB0aGlzLnBvaW50VkJPID0gbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy5wb2ludElCTyA9IG5ldyBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy5wb2ludFZCTy5zZXRBdHRyaWJzKGF0dHJpYnMpO1xyXG4gICAgICB0aGlzLnBvaW50VkJPLmxvYWRBdHRyaWJJbmRpY2VzKHRoaXMuc2hhZGVyKTtcclxuICAgICAgdGhpcy5saW5lVkJPID0gbmV3IFBoeXNpY3NEZWJ1Z1ZlcnRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy5saW5lSUJPID0gbmV3IFBoeXNpY3NEZWJ1Z0luZGV4QnVmZmVyKHRoaXMuZ2wpO1xyXG4gICAgICB0aGlzLmxpbmVWQk8uc2V0QXR0cmlicyhhdHRyaWJzKTtcclxuICAgICAgdGhpcy5saW5lVkJPLmxvYWRBdHRyaWJJbmRpY2VzKHRoaXMuc2hhZGVyKTtcclxuICAgICAgdGhpcy50cmlWQk8gPSBuZXcgUGh5c2ljc0RlYnVnVmVydGV4QnVmZmVyKHRoaXMuZ2wpO1xyXG4gICAgICB0aGlzLnRyaUlCTyA9IG5ldyBQaHlzaWNzRGVidWdJbmRleEJ1ZmZlcih0aGlzLmdsKTtcclxuICAgICAgdGhpcy50cmlWQk8uc2V0QXR0cmlicyhhdHRyaWJzKTtcclxuICAgICAgdGhpcy50cmlWQk8ubG9hZEF0dHJpYkluZGljZXModGhpcy5zaGFkZXIpO1xyXG5cclxuICAgICAgdGhpcy5jbGVhckJ1ZmZlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQmVmb3JlIE9pbW9QaHlzaWNzLndvcmxkIGlzIGZpbGxpbmcgdGhlIGRlYnVnLiBNYWtlIHN1cmUgdGhlIGJ1ZmZlcnMgYXJlIHJlc2V0LiBBbHNvIHJlY2VpdmluZyB0aGUgZGVidWdNb2RlIGZyb20gc2V0dGluZ3MgYW5kIHVwZGF0aW5nIHRoZSBjdXJyZW50IHByb2plY3Rpb24gZm9yIHRoZSB2ZXJ0ZXhTaGFkZXIuICovXHJcbiAgICBwdWJsaWMgY2xlYXJCdWZmZXJzKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmdsLmxpbmVXaWR0aCgyLjApOyAvL0RvZXMgbm90IGFmZmVjdCBhbnl0aGluZyBiZWNhdXNlIGxpbmVXaWR0aCBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgYnkgTWljcm9zb2Z0IEVkZ2UgYW5kIEZVREdFIGlzIG9wdGltaXplZCBmb3IgQ2hyb21lXHJcblxyXG4gICAgICB0aGlzLnBvaW50RGF0YSA9IFtdOyAvL1Jlc2V0dGluZyB0aGUgZGF0YSB0byBiZSBmaWxsZWQgYWdhaW5cclxuICAgICAgdGhpcy5saW5lRGF0YSA9IFtdO1xyXG4gICAgICB0aGlzLnRyaURhdGEgPSBbXTtcclxuXHJcbiAgICAgIHRoaXMubnVtUG9pbnREYXRhID0gMDsgLy9SZXNldHRpbmcgdGhlIGFtb3VudCBvZiBkYXRhIGNhbGxzXHJcbiAgICAgIHRoaXMubnVtTGluZURhdGEgPSAwO1xyXG4gICAgICB0aGlzLm51bVRyaURhdGEgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBZnRlciBPaW1vUGh5c2ljcy53b3JsZCBmaWxsZWQgdGhlIGRlYnVnLiBSZW5kZXJpbmcgY2FsbHMuIFNldHRpbmcgdGhpcyBwcm9ncmFtIHRvIGJlIHVzZWQgYnkgdGhlIEZVREdFIHJlbmRlcmluZyBjb250ZXh0LiBBbmQgZHJhdyBlYWNoIHVwZGF0ZWQgYnVmZmVyIGFuZCByZXNldHRpbmcgdGhlbS4gKi9cclxuICAgIHB1YmxpYyBkcmF3QnVmZmVycygpOiB2b2lkIHtcclxuICAgICAgdGhpcy5zaGFkZXIudXNlKCk7XHJcbiAgICAgIGxldCBwcm9qZWN0aW9uOiBGbG9hdDMyQXJyYXkgPSBQaHlzaWNzLm1haW5DYW0ubXR4V29ybGRUb1ZpZXcuZ2V0KCk7XHJcbiAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLnNoYWRlci5nZXRVbmlmb3JtTG9jYXRpb24oXCJ1X210eE1lc2hUb1ZpZXdcIiksIGZhbHNlLCBwcm9qZWN0aW9uKTtcclxuXHJcblxyXG4gICAgICBpZiAodGhpcy5udW1Qb2ludERhdGEgPiAwKSB7XHJcbiAgICAgICAgdGhpcy5wb2ludElib0RhdGEgPSBbXTsgIC8vQnVmZmVyIHNpemUgbWF0Y2hpbmcgdG8gd2hhdHMgbmVlZGVkXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMubnVtUG9pbnREYXRhOyBpKyspIHtcclxuICAgICAgICAgIHRoaXMucG9pbnRJYm9EYXRhLnB1c2goaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9pbnRJQk8uc2V0RGF0YSh0aGlzLnBvaW50SWJvRGF0YSk7IC8vU2V0IEluZGV4IGJ1ZmZlciB0byBjb3JyZWN0IHNpemVcclxuICAgICAgICB0aGlzLnBvaW50VkJPLnNldERhdGEodGhpcy5wb2ludERhdGEpOyAvL1NldCBWZXJ0ZXggQnVmZmVyIHRvIGN1cnJlbnQgRGF0YVxyXG4gICAgICAgIHRoaXMucG9pbnRWQk8uYmluZEF0dHJpYnMoKTtcclxuICAgICAgICB0aGlzLnBvaW50SUJPLmRyYXcodGhpcy5nbC5QT0lOVFMsIHRoaXMubnVtUG9pbnREYXRhKTsgLy9UaGUgYWN0dWFsIGRyYXcgY2FsbCBmb3IgZWFjaCBpbmRleCBpbiBpYm9cclxuICAgICAgICB0aGlzLm51bVBvaW50RGF0YSA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubnVtTGluZURhdGEgPiAwKSB7XHJcbiAgICAgICAgdGhpcy5saW5lSWJvRGF0YSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bUxpbmVEYXRhOyBpKyspIHtcclxuICAgICAgICAgIHRoaXMubGluZUlib0RhdGEucHVzaChpICogMik7XHJcbiAgICAgICAgICB0aGlzLmxpbmVJYm9EYXRhLnB1c2goaSAqIDIgKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saW5lSUJPLnNldERhdGEodGhpcy5saW5lSWJvRGF0YSk7XHJcbiAgICAgICAgdGhpcy5saW5lVkJPLnNldERhdGEodGhpcy5saW5lRGF0YSk7XHJcbiAgICAgICAgdGhpcy5saW5lVkJPLmJpbmRBdHRyaWJzKCk7XHJcbiAgICAgICAgdGhpcy5saW5lSUJPLmRyYXcodGhpcy5nbC5MSU5FUywgdGhpcy5udW1MaW5lRGF0YSAqIDIpO1xyXG4gICAgICAgIHRoaXMubnVtTGluZURhdGEgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm51bVRyaURhdGEgPiAwKSB7XHJcbiAgICAgICAgdGhpcy50cmlJYm9EYXRhID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMubnVtVHJpRGF0YTsgaSsrKSB7XHJcbiAgICAgICAgICB0aGlzLnRyaUlib0RhdGEucHVzaChpICogMyk7XHJcbiAgICAgICAgICB0aGlzLnRyaUlib0RhdGEucHVzaChpICogMyArIDEpO1xyXG4gICAgICAgICAgdGhpcy50cmlJYm9EYXRhLnB1c2goaSAqIDMgKyAyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50cmlJQk8uc2V0RGF0YSh0aGlzLnRyaUlib0RhdGEpO1xyXG4gICAgICAgIHRoaXMudHJpVkJPLnNldERhdGEodGhpcy50cmlEYXRhKTtcclxuICAgICAgICB0aGlzLnRyaVZCTy5iaW5kQXR0cmlicygpO1xyXG4gICAgICAgIHRoaXMudHJpSUJPLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsIHRoaXMubnVtVHJpRGF0YSAqIDMpO1xyXG4gICAgICAgIHRoaXMubnVtVHJpRGF0YSA9IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogRHJhd2luZyB0aGUgcmF5IGludG8gdGhlIGRlYnVnRHJhdyBDYWxsLiBCeSB1c2luZyB0aGUgb3ZlcndyaXR0ZW4gbGluZSByZW5kZXJpbmcgZnVuY3Rpb25zIGFuZCBkcmF3aW5nIGEgcG9pbnQgKHBvaW50U2l6ZSBkZWZpbmVkIGluIHRoZSBzaGFkZXIpIGF0IHRoZSBlbmQgb2YgdGhlIHJheS4gKi9cclxuICAgIHB1YmxpYyBkZWJ1Z1JheShfb3JpZ2luOiBWZWN0b3IzLCBfZW5kOiBWZWN0b3IzLCBfY29sb3I6IENvbG9yKTogdm9pZCB7XHJcbiAgICAgIHRoaXMub2ltb0RlYnVnRHJhdy5saW5lKG5ldyBPSU1PLlZlYzMoX29yaWdpbi54LCBfb3JpZ2luLnksIF9vcmlnaW4ueiksIG5ldyBPSU1PLlZlYzMoX2VuZC54LCBfZW5kLnksIF9lbmQueiksIG5ldyBPSU1PLlZlYzMoX2NvbG9yLnIsIF9jb2xvci5nLCBfY29sb3IuYikpO1xyXG4gICAgICB0aGlzLm9pbW9EZWJ1Z0RyYXcucG9pbnQobmV3IE9JTU8uVmVjMyhfZW5kLngsIF9lbmQueSwgX2VuZC56KSwgbmV3IE9JTU8uVmVjMyhfY29sb3IuciwgX2NvbG9yLmcsIF9jb2xvci5iKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE92ZXJyaWRpbmcgdGhlIGV4aXN0aW5nIGZ1bmN0aW9ucyBmcm9tIE9pbW9QaHlzaWNzLkRlYnVnRHJhdyB3aXRob3V0IGFjdHVhbGx5IGluaGVyaXQgZnJvbSB0aGUgY2xhc3MsIHRvIGF2b2lkIGNvbXBpbGVyIHByb2JsZW1zLiBcclxuICAgICAqIE92ZXJyaWRpbmcgdGhlbSB0byByZWNlaXZlIGRlYnVnSW5mb3JtYXRpb25zIGluIHRoZSBmb3JtYXQgdGhlIHBoeXNpYyBlbmdpbmUgcHJvdmlkZXMgdGhlbSBidXQgaGFuZGxpbmcgdGhlIHJlbmRlcmluZyBpbiB0aGUgZnVkZ2UgY29udGV4dC4gKi9cclxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZU92ZXJyaWRlKCk6IHZvaWQge1xyXG4gICAgICAvL092ZXJyaWRlIHBvaW50L2xpbmUvdHJpYW5nbGUgZnVuY3Rpb25zIG9mIE9pbW9QaHlzaWNzIHdoaWNoIGFyZSB1c2VkIHRvIGRyYXcgd2lyZWZyYW1lcyBvZiBvYmplY3RzLCBsaW5lcyBvZiByYXljYXN0cyBvciB0cmlhbmdsZXMgd2hlbiB0aGUgb2JqZWN0cyBhcmUgcmVuZGVyZWQgYnkgdGhlIHBoeXNpY3Mgbm90IEZVREdFICh1bnVzZWQpXHJcblxyXG4gICAgICBPSU1PLkRlYnVnRHJhdy5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiAoX3Y6IE9JTU8uVmVjMywgX2NvbG9yOiBPSU1PLlZlYzMpOiB2b2lkIHtcclxuICAgICAgICBsZXQgZGVidWdXcmFwcGVyOiBQaHlzaWNzRGVidWdEcmF3ID0gUGh5c2ljcy5kZWJ1Z0RyYXc7IC8vR2V0IHRoZSBjdXN0b20gcGh5c2ljcyBkZWJ1ZyBjbGFzcyB0byBoYXZlIGFjY2VzcyB0byB0aGUgZGF0YS5cclxuICAgICAgICBpZiAoUGh5c2ljcy5tYWluQ2FtICE9IG51bGwpIHsgLy9vbmx5IGFjdCB3aGVuIHRoZXJlIGlzIGEgY2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nXHJcbiAgICAgICAgICBsZXQgZGF0YTogQXJyYXk8TnVtYmVyPiA9IGRlYnVnV3JhcHBlci5wb2ludERhdGE7IC8vZ2V0IHRoZSBhbHJlYWR5IHdyaXR0ZW4gYnVmZmVyIGluZm9ybWF0aW9uc1xyXG4gICAgICAgICAgZGF0YS5wdXNoKF92LngsIF92LnksIF92LnopOyAvL0Nvb3JkaW5hdGVzIG9mIHRoZSBwb2ludFxyXG4gICAgICAgICAgZGF0YS5wdXNoKDAsIDAsIDApOyAvL1BvaW50IE5vcm1hbHMgLSBFbXB0eSBzaW5jZSBpdCdzIG5vdCBhIHBvbHlnb25cclxuICAgICAgICAgIGRhdGEucHVzaChfY29sb3IueCwgX2NvbG9yLnksIF9jb2xvci56KTsgLy9Db2xvciBvZiB0aGUgcG9pbnRcclxuICAgICAgICAgIGRlYnVnV3JhcHBlci5udW1Qb2ludERhdGErKztcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBPSU1PLkRlYnVnRHJhdy5wcm90b3R5cGUubGluZSA9IGZ1bmN0aW9uIChfdjE6IE9JTU8uVmVjMywgX3YyOiBPSU1PLlZlYzMsIF9jb2xvcjogT0lNTy5WZWMzKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGRlYnVnV3JhcHBlcjogUGh5c2ljc0RlYnVnRHJhdyA9IFBoeXNpY3MuZGVidWdEcmF3O1xyXG4gICAgICAgIGlmIChQaHlzaWNzLm1haW5DYW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IGRhdGE6IEFycmF5PG51bWJlcj4gPSBkZWJ1Z1dyYXBwZXIubGluZURhdGE7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX3YxLngsIF92MS55LCBfdjEueik7IC8vUG9pbnQgMSBDb29yZGluYXRlc1xyXG4gICAgICAgICAgZGF0YS5wdXNoKDAsIDAsIDApOyAvL1AxIE5vcm1hbHMgLSBFbXB0eSBzaW5jZSBpdCdzIG5vdCBhIHBvbHlnb25cclxuICAgICAgICAgIGRhdGEucHVzaChfY29sb3IueCwgX2NvbG9yLnksIF9jb2xvci56KTsgLy9QMSBDb2xvclxyXG4gICAgICAgICAgZGF0YS5wdXNoKF92Mi54LCBfdjIueSwgX3YyLnopOyAvL1BvaW50IDIgQ29vcmRpbmF0ZXNcclxuICAgICAgICAgIGRhdGEucHVzaCgwLCAwLCAwKTtcclxuICAgICAgICAgIGRhdGEucHVzaChfY29sb3IueCwgX2NvbG9yLnksIF9jb2xvci56KTtcclxuICAgICAgICAgIGRlYnVnV3JhcHBlci5udW1MaW5lRGF0YSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIE9JTU8uRGVidWdEcmF3LnByb3RvdHlwZS50cmlhbmdsZSA9IGZ1bmN0aW9uIChfdjE6IE9JTU8uVmVjMywgX3YyOiBPSU1PLlZlYzMsIF92MzogT0lNTy5WZWMzLCBfbjE6IE9JTU8uVmVjMywgX24yOiBPSU1PLlZlYzMsIF9uMzogT0lNTy5WZWMzLCBfY29sb3I6IE9JTU8uVmVjMyk6IHZvaWQge1xyXG4gICAgICAgIGxldCBkZWJ1Z1dyYXBwZXI6IFBoeXNpY3NEZWJ1Z0RyYXcgPSBQaHlzaWNzLmRlYnVnRHJhdztcclxuICAgICAgICBpZiAoUGh5c2ljcy5tYWluQ2FtICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBkYXRhOiBBcnJheTxudW1iZXI+ID0gZGVidWdXcmFwcGVyLnRyaURhdGE7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX3YxLngsIF92MS55LCBfdjEueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX24xLngsIF9uMS55LCBfbjEueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX3YyLngsIF92Mi55LCBfdjIueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX24yLngsIF9uMi55LCBfbjIueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX3YzLngsIF92My55LCBfdjMueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX24zLngsIF9uMy55LCBfbjMueik7XHJcbiAgICAgICAgICBkYXRhLnB1c2goX2NvbG9yLngsIF9jb2xvci55LCBfY29sb3Iueik7XHJcbiAgICAgICAgICBkZWJ1Z1dyYXBwZXIubnVtVHJpRGF0YSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIHNvdXJjZSBjb2RlIChzdHJpbmcpIG9mIHRoZSBpbiBwaHlzaWNzRGVidWcgdXNlZCB2ZXJ5IHNpbXBsZSB2ZXJ0ZXhTaGFkZXIuXHJcbiAgICAgKiAgSGFuZGxpbmcgdGhlIHByb2plY3Rpb24gKHdoaWNoIGluY2x1ZGVzLCB2aWV3L3dvcmxkW2lzIGFsd2F5cyBpZGVudGl0eSBpbiB0aGlzIGNhc2VdL3Byb2plY3Rpb24gaW4gRlVER0UpLiBJbmNyZWFzaW5nIHRoZSBzaXplIG9mIHNpbmdsZSBwb2ludHMgZHJhd24uXHJcbiAgICAgKiAgQW5kIHRyYW5zZmVyIHBvc2l0aW9uIGNvbG9yIHRvIHRoZSBmcmFnbWVudFNoYWRlci4gKi9cclxuICAgIHByaXZhdGUgdmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBgXHJcblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5cdFx0XHRhdHRyaWJ1dGUgdmVjMyBhUG9zaXRpb247XHJcblx0XHRcdGF0dHJpYnV0ZSB2ZWMzIGFDb2xvcjtcclxuXHRcdFx0YXR0cmlidXRlIHZlYzMgYU5vcm1hbDtcclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZQb3NpdGlvbjtcclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2Q29sb3I7XHJcblx0XHRcdHVuaWZvcm0gbWF0NCB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG5cdFx0XHR2b2lkIG1haW4oKSB7XHJcblx0XHRcdFx0dlBvc2l0aW9uID0gYVBvc2l0aW9uO1xyXG5cdFx0XHRcdHZDb2xvciA9IGFDb2xvcjtcclxuXHRcdFx0XHR2Tm9ybWFsID0gYU5vcm1hbDtcclxuXHRcdFx0XHRnbF9Qb3NpdGlvbiA9IHVfbXR4TWVzaFRvVmlldyAqIHZlYzQoYVBvc2l0aW9uLDEuMCk7XHJcblx0XHRcdFx0Z2xfUG9pbnRTaXplID0gNi4wO1xyXG5cdFx0XHR9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIHNvdXJjZSBjb2RlIChzdHJpbmcpIG9mIHRoZSBpbiBwaHlzaWNzRGVidWcgdXNlZCBzdXBlciBzaW1wbGUgZnJhZ21lbnRTaGFkZXIuIFVubGl0IC0gb25seSBjb2xvcml6aW5nIHRoZSBkcmF3biBwaXhlbHMsIG5vcm1hbHMvcG9zaXRpb24gYXJlIGdpdmVuIHRvIG1ha2UgaXQgZXhwYW5kYWJsZSAqL1xyXG4gICAgcHJpdmF0ZSBmcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYFxyXG4gICAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZQb3NpdGlvbjtcclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2Q29sb3I7XHJcblxyXG5cdFx0XHR2b2lkIG1haW4oKSB7XHJcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCh2Q29sb3IsIDEuMCk7XHJcblx0XHRcdH1gO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBBIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gYm9kaWVzIHdpdGggYSBkZWZpbmVkIGF4ZSBvZiB0cmFuc2xhdGlvbiBhbmQgcm90YXRpb24uIFR3byBEZWdyZWVzIG9mIEZyZWVkb20gaW4gdGhlIGRlZmluZWQgYXhpcy5cclxuICAgKiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC4gQSBtb3RvciBjYW4gYmUgZGVmaW5lZCBmb3Igcm90YXRpb24gYW5kIHRyYW5zbGF0aW9uLCBhbG9uZyB3aXRoIHNwcmluZyBzZXR0aW5ncy5cclxuICAgKiBcclxuICAgKiBgYGB0ZXh0XHJcbiAgICogICAgICAgICAgSm9pbnRIb2xkZXIgLSBib2R5QW5jaG9yXHJcbiAgICogICAgICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkFxyXG4gICAqICAgICAgICAgICAgICAgICAgICDilIIgICDilIJcclxuICAgKiAgICAgICAgICAgPOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgiAgIOKUguKUgOKUgOKUgOKUgOKUgOKUgD4gdGllZCBib2R5LCBzbGlkaW5nIG9uIGF4aXMgPSAxc3QgZGVncmVlIG9mIGZyZWVkb21cclxuICAgKiAgICAgICAgICAgICAgICAgICAg4pSCICAg4pSCICAgICAgICByb3RhdGluZyBhcm91bmQgYXhpcyA9IDJuZCBkZWdyZWUgb2YgZnJlZWRvbSBcclxuICAgKiAgICAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSYXHJcbiAgICogYGBgICBcclxuICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50Q3lsaW5kcmljYWwgZXh0ZW5kcyBKb2ludEF4aWFsIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50Q3lsaW5kcmljYWwpO1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2ludDogT0lNTy5DeWxpbmRyaWNhbEpvaW50O1xyXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogT0lNTy5DeWxpbmRyaWNhbEpvaW50Q29uZmlnID0gbmV3IE9JTU8uQ3lsaW5kcmljYWxKb2ludENvbmZpZygpO1xyXG4gICAgcHJvdGVjdGVkIG1vdG9yOiBPSU1PLlRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yO1xyXG5cclxuICAgICNzcHJpbmdEYW1waW5nUm90YXRpb246IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRnJlcXVlbmN5Um90YXRpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgI21vdG9yRm9yY2U6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI21heFJvdG9yOiBudW1iZXIgPSAzNjA7XHJcbiAgICAjbWluUm90b3I6IG51bWJlciA9IDA7XHJcbiAgICAjcm90b3JUb3JxdWU6IG51bWJlciA9IDA7XHJcbiAgICAjcm90b3JTcGVlZDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjcm90b3I6IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3I7XHJcbiAgICAjcm90b3JTcHJpbmdEYW1wZXI6IE9JTU8uU3ByaW5nRGFtcGVyO1xyXG5cclxuICAgIC8qKiBDcmVhdGluZyBhIGN5bGluZHJpY2FsIGpvaW50IGJldHdlZW4gdHdvIENvbXBvbmVudFJpZ2lkYm9kaWVzIG1vdmluZyBvbiBvbmUgYXhpcyBhbmQgcm90YXRpbmcgYXJvdW5kIGFub3RoZXIgYm91bmQgb24gYSBsb2NhbCBhbmNob3Jwb2ludC4gKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYXhpczogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDEsIDApLCBfbG9jYWxBbmNob3I6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAwLCAwKSkge1xyXG4gICAgICBzdXBlcihfYm9keUFuY2hvciwgX2JvZHlUaWVkLCBfYXhpcywgX2xvY2FsQW5jaG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHN1cGVyLnNwcmluZ0RhbXBpbmcgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHJhbnNsYXRpb25hbFNwcmluZ0RhbXBlcigpLmRhbXBpbmdSYXRpbyA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHNwcmluZyBpbiBIei4gQXQgMCB0aGUgc3ByaW5nIGlzIHJpZ2lkLCBlcXVhbHMgbm8gc3ByaW5nLiBUaGUgc21hbGxlciB0aGUgdmFsdWUgdGhlIGxlc3MgcmVzdHJpY3RpdmUgaXMgdGhlIHNwcmluZy5cclxuICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBzdXBlci5zcHJpbmdGcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHJhbnNsYXRpb25hbFNwcmluZ0RhbXBlcigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC4gSW5mbHVlbmNpbmcgVE9SUVVFIC8gUk9UQVRJT05cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0RhbXBpbmdSb3RhdGlvbigpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRGFtcGluZ1JvdGF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nUm90YXRpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGluZ1JvdGF0aW9uID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFJvdGF0aW9uYWxTcHJpbmdEYW1wZXIoKS5kYW1waW5nUmF0aW8gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gSW5mbHVlbmNpbmcgVE9SUVVFIC8gUk9UQVRJT05cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0ZyZXF1ZW5jeVJvdGF0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdGcmVxdWVuY3lSb3RhdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRnJlcXVlbmN5Um90YXRpb24oX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRnJlcXVlbmN5Um90YXRpb24gPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0Um90YXRpb25hbFNwcmluZ0RhbXBlcigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMtQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heFJvdG9yKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtYXhSb3RvcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWF4Um90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWF4Um90b3IgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0Um90YXRpb25hbExpbWl0TW90b3IoKS51cHBlckxpbWl0ID0gX3ZhbHVlICogQ2FsYy5kZWcycmFkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIExvd2VyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMgQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1pblJvdG9yKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtaW5Sb3RvcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWluUm90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWluUm90b3IgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0Um90YXRpb25hbExpbWl0TW90b3IoKS5sb3dlckxpbWl0ID0gX3ZhbHVlICogQ2FsYy5kZWcycmFkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIHRhcmdldCByb3RhdGlvbmFsIHNwZWVkIG9mIHRoZSBtb3RvciBpbiBtL3MuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yU3BlZWQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JvdG9yU3BlZWQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdG9yU3BlZWQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRSb3RhdGlvbmFsTGltaXRNb3RvcigpLm1vdG9yU3BlZWQgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgbWF4aW11bSBtb3RvciB0b3JxdWUgaW4gTmV3dG9uLiBmb3JjZSA8PSAwIGVxdWFscyBkaXNhYmxlZC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90b3JUb3JxdWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JvdG9yVG9ycXVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCByb3RvclRvcnF1ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNyb3RvclRvcnF1ZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRSb3RhdGlvbmFsTGltaXRNb3RvcigpLm1vdG9yVG9ycXVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBVcHBlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBtYXhNb3RvcihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBzdXBlci5tYXhNb3RvciA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbClcclxuICAgICAgICB0aGlzLmpvaW50LmdldFRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yKCkudXBwZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBMb3dlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBtaW5Nb3RvcihfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICBzdXBlci5taW5Nb3RvciA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbClcclxuICAgICAgICB0aGlzLmpvaW50LmdldFRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yKCkubG93ZXJMaW1pdCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG1vdG9yU3BlZWQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbClcclxuICAgICAgICB0aGlzLmpvaW50LmdldFRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yKCkubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBtYXhpbXVtIG1vdG9yIGZvcmNlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1vdG9yRm9yY2UoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21vdG9yRm9yY2U7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1vdG9yRm9yY2UoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbW90b3JGb3JjZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRUcmFuc2xhdGlvbmFsTGltaXRNb3RvcigpLm1vdG9yRm9yY2UgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuI2dldE11dGF0b3IoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX211dGF0b3IpO1xyXG4gICAgICB0aGlzLmRlbGV0ZUZyb21NdXRhdG9yKF9tdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKG11dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0Sm9pbnQoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuI3JvdG9yU3ByaW5nRGFtcGVyID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuc3ByaW5nRnJlcXVlbmN5Um90YXRpb24sIHRoaXMuc3ByaW5nRGFtcGluZ1JvdGF0aW9uKTtcclxuXHJcbiAgICAgIHRoaXMubW90b3IgPSBuZXcgT0lNTy5UcmFuc2xhdGlvbmFsTGltaXRNb3RvcigpLnNldExpbWl0cyhzdXBlci5taW5Nb3Rvciwgc3VwZXIubWF4TW90b3IpO1xyXG4gICAgICB0aGlzLm1vdG9yLnNldE1vdG9yKHN1cGVyLm1vdG9yU3BlZWQsIHRoaXMubW90b3JGb3JjZSk7XHJcbiAgICAgIHRoaXMuI3JvdG9yID0gbmV3IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHModGhpcy5taW5Sb3RvciAqIENhbGMuZGVnMnJhZCwgdGhpcy5tYXhSb3RvciAqIENhbGMuZGVnMnJhZCk7XHJcbiAgICAgIHRoaXMuI3JvdG9yLnNldE1vdG9yKHRoaXMucm90b3JTcGVlZCwgdGhpcy5yb3RvclRvcnF1ZSk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZyA9IG5ldyBPSU1PLkN5bGluZHJpY2FsSm9pbnRDb25maWcoKTtcclxuICAgICAgc3VwZXIuY29uc3RydWN0Sm9pbnQoKTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnLnRyYW5zbGF0aW9uYWxTcHJpbmdEYW1wZXIgPSB0aGlzLnNwcmluZ0RhbXBlcjtcclxuICAgICAgdGhpcy5jb25maWcudHJhbnNsYXRpb25hbExpbWl0TW90b3IgPSB0aGlzLm1vdG9yO1xyXG4gICAgICB0aGlzLmNvbmZpZy5yb3RhdGlvbmFsTGltaXRNb3RvciA9IHRoaXMuI3JvdG9yO1xyXG4gICAgICB0aGlzLmNvbmZpZy5yb3RhdGlvbmFsU3ByaW5nRGFtcGVyID0gdGhpcy4jcm90b3JTcHJpbmdEYW1wZXI7XHJcblxyXG4gICAgICB0aGlzLmpvaW50ID0gbmV3IE9JTU8uQ3lsaW5kcmljYWxKb2ludCh0aGlzLmNvbmZpZyk7XHJcbiAgICAgIHRoaXMuY29uZmlndXJlSm9pbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAjZ2V0TXV0YXRvciA9ICgpOiBNdXRhdG9yID0+IHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSB7XHJcbiAgICAgICAgbW90b3JGb3JjZTogdGhpcy5tb3RvckZvcmNlLFxyXG4gICAgICAgIHNwcmluZ0RhbXBpbmdSb3RhdGlvbjogdGhpcy5zcHJpbmdEYW1waW5nUm90YXRpb24sXHJcbiAgICAgICAgc3ByaW5nRnJlcXVlbmN5Um90YXRpb246IHRoaXMuc3ByaW5nRnJlcXVlbmN5Um90YXRpb24sXHJcbiAgICAgICAgbWF4Um90b3I6IHRoaXMubWF4Um90b3IsXHJcbiAgICAgICAgbWluUm90b3I6IHRoaXMubWluUm90b3IsXHJcbiAgICAgICAgcm90b3JUb3JxdWU6IHRoaXMucm90b3JUb3JxdWUsXHJcbiAgICAgICAgcm90b3JTcGVlZDogdGhpcy5yb3RvclNwZWVkXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfTtcclxuXHJcbiAgICAjbXV0YXRlID0gKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCA9PiB7XHJcbiAgICAgIHRoaXMubXV0YXRlQmFzZShfbXV0YXRvciwgW1wibW90b3JGb3JjZVwiLCBcInJvdG9yVG9ycXVlXCIsIFwicm90b3JTcGVlZFwiLCBcIm1heFJvdG9yXCIsIFwibWluUm90b3JcIiwgXCJzcHJpbmdEYW1waW5nUm90YXRpb25cIiwgXCJzcHJpbmdGcmVxdWVuY3lSb3RhdGlvblwiLCBcInNwcmluZ0ZyZXF1ZW5jeVwiXSk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIGEgZGVmaW5lZCBheGUgbW92ZW1lbnQuXHJcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHNsaWRpbmcgam9pbnQgYWxvbmcgb25lIGF4aXMuIFR3byBSaWdpZEJvZGllcyBuZWVkIHRvIGJlIGRlZmluZWQgdG8gdXNlIGl0LlxyXG4gICAgICogQSBtb3RvciBjYW4gYmUgZGVmaW5lZCB0byBtb3ZlIHRoZSBjb25uZWN0ZWQgYWxvbmcgdGhlIGRlZmluZWQgYXhpcy4gR3JlYXQgdG8gY29uc3RydWN0IHN0YW5kYXJkIHNwcmluZ3Mgb3IgcGh5c2ljYWwgc2xpZGVycy5cclxuICAgICAqIFxyXG4gICAgICogYGBgdGV4dFxyXG4gICAgICogICAgICAgICAgSm9pbnRIb2xkZXIgLSBib2R5QW5jaG9yXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4pSM4pSA4pSA4pSA4pSQXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4pSCICAg4pSCXHJcbiAgICAgKiAgICAgICAgICAgPOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgiAgIOKUguKUgOKUgOKUgOKUgOKUgOKUgD4gdGllZCBib2R5LCBzbGlkaW5nIG9uIG9uZSBBeGlzLCAxIERlZ3JlZSBvZiBGcmVlZG9tXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4pSCICAg4pSCXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSYXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVLCAyMDIwIHwgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBKb2ludFByaXNtYXRpYyBleHRlbmRzIEpvaW50QXhpYWwge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IEpvaW50LnJlZ2lzdGVyU3ViY2xhc3MoSm9pbnRQcmlzbWF0aWMpO1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2ludDogT0lNTy5QcmlzbWF0aWNKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uUHJpc21hdGljSm9pbnRDb25maWcgPSBuZXcgT0lNTy5QcmlzbWF0aWNKb2ludENvbmZpZygpO1xyXG4gICAgcHJvdGVjdGVkIG1vdG9yOiBPSU1PLlRyYW5zbGF0aW9uYWxMaW1pdE1vdG9yO1xyXG4gICAgLy9JbnRlcm5hbGx5IHVzZWQgdmFyaWFibGVzIC0gSm9pbnQgUHJvcGVydGllcyB0aGF0IGFyZSB1c2VkIGV2ZW4gd2hlbiBubyBhY3R1YWwgam9pbnQgaXMgY3VycmVudGx5IGV4aXN0ZW50XHJcblxyXG4gICAgI21vdG9yRm9yY2U6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqIENyZWF0aW5nIGEgcHJpc21hdGljIGpvaW50IGJldHdlZW4gdHdvIENvbXBvbmVudFJpZ2lkYm9kaWVzIG9ubHkgbW92aW5nIG9uIG9uZSBheGlzIGJvdW5kIG9uIGEgbG9jYWwgYW5jaG9ycG9pbnQuICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2F4aXM6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAxLCAwKSwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCwgX2F4aXMsIF9sb2NhbEFuY2hvcik7XHJcblxyXG4gICAgICB0aGlzLm1heE1vdG9yID0gMTA7XHJcbiAgICAgIHRoaXMubWluTW90b3IgPSAtMTA7XHJcbiAgICB9XHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIG1heGltdW0gbW90b3IgZm9yY2UgaW4gTmV3dG9uLiBmb3JjZSA8PSAwIGVxdWFscyBkaXNhYmxlZC4gVGhpcyBpcyB0aGUgZm9yY2UgdGhhdCB0aGUgbW90b3IgaXMgdXNpbmcgdG8gaG9sZCB0aGUgcG9zaXRpb24sIG9yIHJlYWNoIGl0IGlmIGEgbW90b3JTcGVlZCBpcyBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1vdG9yRm9yY2UoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21vdG9yRm9yY2U7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1vdG9yRm9yY2UoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbW90b3JGb3JjZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yKCkubW90b3JGb3JjZSA9IF92YWx1ZTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZ1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgbW90b3JGb3JjZTogdGhpcy5tb3RvckZvcmNlLFxyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tb3RvckZvcmNlID0gX3NlcmlhbGl6YXRpb24ubW90b3JGb3JjZTtcclxuICAgICAgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKCk7XHJcbiAgICAgIG11dGF0b3IubW90b3JGb3JjZSA9IHRoaXMubW90b3JGb3JjZTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLm1vdG9yRm9yY2UpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMubW90b3JGb3JjZSA9IF9tdXRhdG9yLm1vdG9yRm9yY2U7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5tb3RvckZvcmNlO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvKiogQWN0dWFsIGNyZWF0aW9uIG9mIGEgam9pbnQgaW4gdGhlIE9pbW9QaHlzaWNzIHN5c3RlbSAqL1xyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEpvaW50KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLm1vdG9yID0gbmV3IE9JTU8uVHJhbnNsYXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHModGhpcy5taW5Nb3RvciwgdGhpcy5tYXhNb3Rvcik7IC8vQ3JlYXRlIG1vdG9yIHNldHRpbmdzLCB0byBob2xkIHBvc2l0aW9ucywgc2V0IGNvbnN0cmFpbnQgbWluL21heFxyXG4gICAgICB0aGlzLm1vdG9yLnNldE1vdG9yKHRoaXMubW90b3JTcGVlZCwgdGhpcy5tb3RvckZvcmNlKTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IE9JTU8uUHJpc21hdGljSm9pbnRDb25maWcoKTsgLy9DcmVhdGUgYSBzcGVjaWZpYyBjb25maWcgZm9yIHRoaXMgam9pbnQgdHlwZSB0aGF0IGlzIGNhbGN1bGF0aW5nIHRoZSBsb2NhbCBheGlzIGZvciBib3RoIGJvZGllc1xyXG4gICAgICBzdXBlci5jb25zdHJ1Y3RKb2ludCgpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcuc3ByaW5nRGFtcGVyID0gdGhpcy5zcHJpbmdEYW1wZXI7IC8vVGVsbGluZyB0aGUgY29uZmlnIHRvIHVzZSB0aGUgbW90b3Ivc3ByaW5nIG9mIHRoZSBGVURHRSBDb21wb25lbnRcclxuICAgICAgdGhpcy5jb25maWcubGltaXRNb3RvciA9IHRoaXMubW90b3I7XHJcblxyXG4gICAgICB0aGlzLmpvaW50ID0gbmV3IE9JTU8uUHJpc21hdGljSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyZUpvaW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAqIEEgcGh5c2ljYWwgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBib2RpZXMsIGRlc2lnbmVkIHRvIHNpbXVsYXRlIGJlaGF2aW91ciB3aXRoaW4gYSByZWFsIGJvZHkuIEl0IGhhcyB0d28gYXhpcywgYSBzd2luZyBhbmQgdHdpc3QgYXhpcywgYW5kIGFsc28gdGhlIHBlcnBlbmRpY3VsYXIgYXhpcywgXHJcbiAgICAqIHNpbWlsYXIgdG8gYSBTcGhlcmljYWwgam9pbnQsIGJ1dCBtb3JlIHJlc3RyaWN0aXZlIGluIGl0J3MgYW5nbGVzIGFuZCBvbmx5IHR3byBkZWdyZWVzIG9mIGZyZWVkb20uIFR3byBSaWdpZEJvZGllcyBuZWVkIHRvIGJlIGRlZmluZWQgdG8gdXNlIGl0LiBNb3N0bHkgdXNlZCB0byBjcmVhdGUgaHVtYW5saWtlIGpvaW50cyB0aGF0IGJlaGF2ZSBsaWtlIGEgXHJcbiAgICAqIGxpZmVsZXNzIGJvZHkuXHJcbiAgICAqIGBgYHRleHQgICAgICAgIFxyXG4gICAgKiAgICAgICAgICAgICAgICAgIFxyXG4gICAgKiAgICAgICAgICAgICAgICAgICAgICBhbmNob3IgLSBpdCBjYW4gdHdpc3Qgb24gb25lIGF4aXMgYW5kIHN3aW5nIG9uIGFub3RoZXJcclxuICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXHJcbiAgICAqICAgICAgICAgeiAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkCDilIIg4pSM4pSA4pSA4pSA4pSQXHJcbiAgICAqICAgICAgICAg4oaRICAgICAgICAgICAg4pSCICAg4pSCIOKGkyDilIIgICDilIIgICAgICAgIGUuZy4geiA9IFR3aXN0QXhpcywgaXQgY2FuIHJvdGF0ZSBpbi1pdHNlbGYgYXJvdW5kIHRoaXMgYXhpcyBcclxuICAgICogICAgLXgg4oaQ4pSA4pS84pSA4oaSIHggICAgICAgIOKUgiAgIOKUgiB4IOKUgiAgIOKUgiAgICAgICAgZS5nLiB4ID0gU3dpbmdBeGlzLCBpdCBjYW4gcm90YXRlIGFuY2hvcmVkIGFyb3VuZCB0aGUgYmFzZSBvbiB0aGlzIGF4aXMgICBcclxuICAgICogICAgICAgICDihpMgICAgICAgICAgICDilIIgICDilIIgICDilIIgICDilIIgICAgICAgICAgIFxyXG4gICAgKiAgICAgICAgLXogICAgICAgICAgICDilJTilIDilIDilIDilJggICDilJTilIDilIDilIDilJggICAgICAgICBlLmcuIHlvdSBjYW4gdHdpc3QgdGhlIGxlZyBpbi1pdHNlbGYgdG8gYSBjZXJ0YWluIGRlZ3JlZSxcclxuICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBhbHNvIHJvdGF0ZSBpdCBmb3J3YXJkL2JhY2t3YXJkL2xlZnQvcmlnaHQgdG8gYSBjZXJ0YWluIGRlZ3JlZVxyXG4gICAgKiAgICAgICAgICAgICAgICBib2R5QW5jaG9yICAgICAgICAgIGJvZHlUaWVkXHJcbiAgICAqICAgICAgICAgICAgICAoZS5nLiBwZWx2aXMpICAgICAgICAgKGUuZy4gdXBwZXItbGVnKVxyXG4gICAgKiBcclxuICAgICogYGBgXHJcbiAgICAqIFR3aXN0IGVxdWFscyBhIHJvdGF0aW9uIGFyb3VuZCBhIHBvaW50IHdpdGhvdXQgbW92aW5nIG9uIGFuIGF4aXMuXHJcbiAgICAqIFN3aW5nIGVxdWFscyBhIHJvdGF0aW9uIG9uIGEgcG9pbnQgd2l0aCBhIG1vdmluZyBsb2NhbCBheGlzLlxyXG4gICAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAgKi9cclxuICBleHBvcnQgY2xhc3MgSm9pbnRSYWdkb2xsIGV4dGVuZHMgSm9pbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IEpvaW50LnJlZ2lzdGVyU3ViY2xhc3MoSm9pbnRSYWdkb2xsKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uUmFnZG9sbEpvaW50O1xyXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogT0lNTy5SYWdkb2xsSm9pbnRDb25maWcgPSBuZXcgT0lNTy5SYWdkb2xsSm9pbnRDb25maWcoKTtcclxuXHJcbiAgICAjc3ByaW5nRGFtcGluZ1R3aXN0OiBudW1iZXIgPSAwO1xyXG4gICAgI3NwcmluZ0ZyZXF1ZW5jeVR3aXN0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNzcHJpbmdEYW1waW5nU3dpbmc6IG51bWJlciA9IDA7XHJcbiAgICAjc3ByaW5nRnJlcXVlbmN5U3dpbmc6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI21heE1vdG9yVHdpc3Q6IG51bWJlciA9IDM2MDtcclxuICAgICNtaW5Nb3RvclR3aXN0OiBudW1iZXIgPSAwO1xyXG4gICAgI21vdG9yVG9ycXVlVHdpc3Q6IG51bWJlciA9IDA7XHJcbiAgICAjbW90b3JTcGVlZFR3aXN0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtb3RvclR3aXN0OiBPSU1PLlJvdGF0aW9uYWxMaW1pdE1vdG9yO1xyXG4gICAgI3NwcmluZ0RhbXBlclR3aXN0OiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuICAgICNzcHJpbmdEYW1wZXJTd2luZzogT0lNTy5TcHJpbmdEYW1wZXI7XHJcbiAgICAjYXhpc0ZpcnN0OiBPSU1PLlZlYzM7XHJcbiAgICAjYXhpc1NlY29uZDogT0lNTy5WZWMzO1xyXG5cclxuICAgICNtYXhBbmdsZUZpcnN0OiBudW1iZXIgPSAwO1xyXG4gICAgI21heEFuZ2xlU2Vjb25kOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYXhpc0ZpcnN0OiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMSwgMCwgMCksIF9heGlzU2Vjb25kOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMSksIF9sb2NhbEFuY2hvcjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApKSB7XHJcbiAgICAgIHN1cGVyKF9ib2R5QW5jaG9yLCBfYm9keVRpZWQpO1xyXG4gICAgICB0aGlzLmF4aXNGaXJzdCA9IF9heGlzRmlyc3Q7XHJcbiAgICAgIHRoaXMuYXhpc1NlY29uZCA9IF9heGlzU2Vjb25kO1xyXG4gICAgICB0aGlzLmFuY2hvciA9IF9sb2NhbEFuY2hvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXhpcyBjb25uZWN0aW5nIHRoZSB0aGUgdHdvIHtAbGluayBOb2RlfXMgZS5nLiBWZWN0b3IzKDAsMSwwKSB0byBoYXZlIGEgdXB3YXJkIGNvbm5lY3Rpb24uXHJcbiAgICAgKiAgV2hlbiBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uIHRoZSBqb2ludCBuZWVkcyB0byBiZSByZWNvbm5lY3RlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBheGlzRmlyc3QoKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLiNheGlzRmlyc3QueCwgdGhpcy4jYXhpc0ZpcnN0LnksIHRoaXMuI2F4aXNGaXJzdC56KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYXhpc0ZpcnN0KF92YWx1ZTogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLiNheGlzRmlyc3QgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBUaGUgYXhpcyBjb25uZWN0aW5nIHRoZSB0aGUgdHdvIHtAbGluayBOb2RlfXMgZS5nLiBWZWN0b3IzKDAsMSwwKSB0byBoYXZlIGEgdXB3YXJkIGNvbm5lY3Rpb24uXHJcbiAgICAqICBXaGVuIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdGhlIGpvaW50IG5lZWRzIHRvIGJlIHJlY29ubmVjdGVkLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXhpc1NlY29uZCgpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRoaXMuI2F4aXNTZWNvbmQueCwgdGhpcy4jYXhpc1NlY29uZC55LCB0aGlzLiNheGlzU2Vjb25kLnopO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBheGlzU2Vjb25kKF92YWx1ZTogVmVjdG9yMykge1xyXG4gICAgICB0aGlzLiNheGlzU2Vjb25kID0gbmV3IE9JTU8uVmVjMyhfdmFsdWUueCwgX3ZhbHVlLnksIF92YWx1ZS56KTtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIGFuZ2xlIG9mIHJvdGF0aW9uIGFsb25nIHRoZSBmaXJzdCBheGlzLiBWYWx1ZSBuZWVkcyB0byBiZSBwb3NpdGl2ZS4gQ2hhbmdlcyBkbyByZWJ1aWxkIHRoZSBqb2ludFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heEFuZ2xlRmlyc3RBeGlzKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtYXhBbmdsZUZpcnN0ICogQ2FsYy5yYWQyZGVnO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtYXhBbmdsZUZpcnN0QXhpcyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtYXhBbmdsZUZpcnN0ID0gX3ZhbHVlICogQ2FsYy5kZWcycmFkO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5kaXJ0eVN0YXR1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1heGltdW0gYW5nbGUgb2Ygcm90YXRpb24gYWxvbmcgdGhlIHNlY29uZCBheGlzLiBWYWx1ZSBuZWVkcyB0byBiZSBwb3NpdGl2ZS4gQ2hhbmdlcyBkbyByZWJ1aWxkIHRoZSBqb2ludFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heEFuZ2xlU2Vjb25kQXhpcygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4QW5nbGVTZWNvbmQgKiBDYWxjLnJhZDJkZWc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1heEFuZ2xlU2Vjb25kQXhpcyhfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtYXhBbmdsZVNlY29uZCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuZGlydHlTdGF0dXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYW1waW5nIG9mIHRoZSBzcHJpbmcuIDEgZXF1YWxzIGNvbXBsZXRseSBkYW1wZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRGFtcGluZ1R3aXN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdEYW1waW5nVHdpc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0RhbXBpbmdUd2lzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdEYW1waW5nVHdpc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHdpc3RTcHJpbmdEYW1wZXIoKS5kYW1waW5nUmF0aW8gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gVGhlIHNtYWxsZXIgdGhlIHZhbHVlIHRoZSBsZXNzIHJlc3RyaWN0aXZlIGlzIHRoZSBzcHJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdGcmVxdWVuY3lUd2lzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5VHdpc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeVR3aXN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVR3aXN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFR3aXN0U3ByaW5nRGFtcGVyKCkuZnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nU3dpbmcoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0RhbXBpbmdTd2luZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRGFtcGluZ1N3aW5nKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmdTd2luZyA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRTd2luZ1NwcmluZ0RhbXBlcigpLmRhbXBpbmdSYXRpbyA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHNwcmluZyBpbiBIei4gQXQgMCB0aGUgc3ByaW5nIGlzIHJpZ2lkLCBlcXVhbHMgbm8gc3ByaW5nLiBUaGUgc21hbGxlciB0aGUgdmFsdWUgdGhlIGxlc3MgcmVzdHJpY3RpdmUgaXMgdGhlIHNwcmluZy5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0ZyZXF1ZW5jeVN3aW5nKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdGcmVxdWVuY3lTd2luZztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc3ByaW5nRnJlcXVlbmN5U3dpbmcoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRnJlcXVlbmN5U3dpbmcgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3dpbmdTcHJpbmdEYW1wZXIoKS5mcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMtQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heE1vdG9yVHdpc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21heE1vdG9yVHdpc3QgKiBDYWxjLnJhZDJkZWc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1heE1vdG9yVHdpc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgX3ZhbHVlICo9IENhbGMuZGVnMnJhZDtcclxuICAgICAgdGhpcy4jbWF4TW90b3JUd2lzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRUd2lzdExpbWl0TW90b3IoKS51cHBlckxpbWl0ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIExvd2VyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMgQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1pbk1vdG9yVHdpc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21pbk1vdG9yVHdpc3QgKiBDYWxjLnJhZDJkZWc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1pbk1vdG9yVHdpc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgX3ZhbHVlICo9IENhbGMuZGVnMnJhZDtcclxuICAgICAgdGhpcy4jbWluTW90b3JUd2lzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRUd2lzdExpbWl0TW90b3IoKS5sb3dlckxpbWl0ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSB0YXJnZXQgcm90YXRpb25hbCBzcGVlZCBvZiB0aGUgbW90b3IgaW4gbS9zLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtb3RvclNwZWVkVHdpc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21vdG9yU3BlZWRUd2lzdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbW90b3JTcGVlZFR3aXN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21vdG9yU3BlZWRUd2lzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRUd2lzdExpbWl0TW90b3IoKS5tb3RvclNwZWVkID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBtYXhpbXVtIG1vdG9yIHRvcnF1ZSBpbiBOZXd0b24uIGZvcmNlIDw9IDAgZXF1YWxzIGRpc2FibGVkLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtb3RvclRvcnF1ZVR3aXN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtb3RvclRvcnF1ZVR3aXN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtb3RvclRvcnF1ZVR3aXN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21vdG9yVG9ycXVlVHdpc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0VHdpc3RMaW1pdE1vdG9yKCkubW90b3JUb3JxdWUgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogSWYgdGhlIHR3byBjb25uZWN0ZWQgUmlnaWRCb2RpZXMgY29sbGlkZSB3aXRoIGVhdGggb3RoZXIuIChEZWZhdWx0ID0gZmFsc2UpXHJcbiAgICAgKi9cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmdcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gdGhpcy4jZ2V0TXV0YXRvcigpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmF4aXNGaXJzdCA9IHRoaXMuYXhpc0ZpcnN0LnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uLmF4aXNTZWNvbmQgPSB0aGlzLmF4aXNTZWNvbmQuc2VyaWFsaXplKCk7XHJcbiAgICAgIHNlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0gPSBzdXBlci5zZXJpYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgdGhpcy5heGlzRmlyc3QuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24uYXhpc0ZpcnN0KTtcclxuICAgICAgYXdhaXQgdGhpcy5heGlzU2Vjb25kLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmF4aXNTZWNvbmQpO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5heGlzRmlyc3QpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYXhpc0ZpcnN0ID0gbmV3IFZlY3RvcjMoLi4uPG51bWJlcltdPihPYmplY3QudmFsdWVzKF9tdXRhdG9yLmF4aXNGaXJzdCkpKTtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYXhpc1NlY29uZCkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5heGlzU2Vjb25kID0gbmV3IFZlY3RvcjMoLi4uPG51bWJlcltdPihPYmplY3QudmFsdWVzKF9tdXRhdG9yLmF4aXNTZWNvbmQpKSk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5heGlzRmlyc3Q7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5heGlzU2Vjb25kO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX211dGF0b3IpO1xyXG4gICAgICB0aGlzLmRlbGV0ZUZyb21NdXRhdG9yKF9tdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKG11dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIG11dGF0b3IuYXhpc0ZpcnN0ID0gdGhpcy5heGlzRmlyc3QuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBtdXRhdG9yLmF4aXNTZWNvbmQgPSB0aGlzLmF4aXNTZWNvbmQuZ2V0TXV0YXRvcigpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGVyVHdpc3QgPSBuZXcgT0lNTy5TcHJpbmdEYW1wZXIoKS5zZXRTcHJpbmcodGhpcy5zcHJpbmdGcmVxdWVuY3lUd2lzdCwgdGhpcy5zcHJpbmdEYW1waW5nVHdpc3QpO1xyXG4gICAgICB0aGlzLiNzcHJpbmdEYW1wZXJTd2luZyA9IG5ldyBPSU1PLlNwcmluZ0RhbXBlcigpLnNldFNwcmluZyh0aGlzLnNwcmluZ0ZyZXF1ZW5jeVN3aW5nLCB0aGlzLnNwcmluZ0RhbXBpbmdTd2luZyk7XHJcblxyXG4gICAgICB0aGlzLiNtb3RvclR3aXN0ID0gbmV3IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHModGhpcy5taW5Nb3RvclR3aXN0LCB0aGlzLm1heE1vdG9yVHdpc3QpO1xyXG4gICAgICB0aGlzLiNtb3RvclR3aXN0LnNldE1vdG9yKHRoaXMubW90b3JTcGVlZFR3aXN0LCB0aGlzLm1vdG9yVG9ycXVlVHdpc3QpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgT0lNTy5SYWdkb2xsSm9pbnRDb25maWcoKTtcclxuICAgICAgc3VwZXIuY29uc3RydWN0Sm9pbnQodGhpcy5heGlzRmlyc3QsIHRoaXMuYXhpc1NlY29uZCk7XHJcbiAgICAgIHRoaXMuY29uZmlnLnN3aW5nU3ByaW5nRGFtcGVyID0gdGhpcy4jc3ByaW5nRGFtcGVyU3dpbmc7XHJcbiAgICAgIHRoaXMuY29uZmlnLnR3aXN0U3ByaW5nRGFtcGVyID0gdGhpcy4jc3ByaW5nRGFtcGVyVHdpc3Q7XHJcbiAgICAgIHRoaXMuY29uZmlnLnR3aXN0TGltaXRNb3RvciA9IHRoaXMuI21vdG9yVHdpc3Q7XHJcbiAgICAgIHRoaXMuY29uZmlnLm1heFN3aW5nQW5nbGUxID0gdGhpcy4jbWF4QW5nbGVGaXJzdDtcclxuICAgICAgdGhpcy5jb25maWcubWF4U3dpbmdBbmdsZTIgPSB0aGlzLiNtYXhBbmdsZVNlY29uZDtcclxuXHJcbiAgICAgIHRoaXMuam9pbnQgPSBuZXcgT0lNTy5SYWdkb2xsSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICBzdXBlci5jb25maWd1cmVKb2ludCgpO1xyXG4gICAgfVxyXG5cclxuICAgICNnZXRNdXRhdG9yID0gKCk6IE11dGF0b3IgPT4ge1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHtcclxuICAgICAgICBtYXhBbmdsZUZpcnN0OiB0aGlzLiNtYXhBbmdsZUZpcnN0LFxyXG4gICAgICAgIG1heEFuZ2xlU2Vjb25kOiB0aGlzLiNtYXhBbmdsZVNlY29uZCxcclxuICAgICAgICBzcHJpbmdEYW1waW5nVHdpc3Q6IHRoaXMuc3ByaW5nRGFtcGluZ1R3aXN0LFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeVR3aXN0OiB0aGlzLnNwcmluZ0ZyZXF1ZW5jeVR3aXN0LFxyXG4gICAgICAgIHNwcmluZ0RhbXBpbmdTd2luZzogdGhpcy5zcHJpbmdEYW1waW5nU3dpbmcsXHJcbiAgICAgICAgc3ByaW5nRnJlcXVlbmN5U3dpbmc6IHRoaXMuc3ByaW5nRnJlcXVlbmN5U3dpbmcsXHJcbiAgICAgICAgbWF4TW90b3JUd2lzdDogdGhpcy4jbWF4TW90b3JUd2lzdCxcclxuICAgICAgICBtaW5Nb3RvclR3aXN0OiB0aGlzLiNtaW5Nb3RvclR3aXN0LFxyXG4gICAgICAgIG1vdG9yU3BlZWRUd2lzdDogdGhpcy5tb3RvclNwZWVkVHdpc3QsXHJcbiAgICAgICAgbW90b3JUb3JxdWVUd2lzdDogdGhpcy5tb3RvclRvcnF1ZVR3aXN0XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfTtcclxuXHJcbiAgICAjbXV0YXRlID0gKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2YgKF9tdXRhdG9yLm1heEFuZ2xlRmlyc3QpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuI21heEFuZ2xlRmlyc3QgPSBfbXV0YXRvci5tYXhBbmdsZUZpcnN0O1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5tYXhBbmdsZVNlY29uZCkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy4jbWF4QW5nbGVTZWNvbmQgPSBfbXV0YXRvci5tYXhBbmdsZVNlY29uZDtcclxuICAgICAgdGhpcy5tdXRhdGVCYXNlKF9tdXRhdG9yLCBbXHJcbiAgICAgICAgXCJzcHJpbmdEYW1waW5nVHdpc3RcIiwgXCJzcHJpbmdGcmVxdWVuY3lUd2lzdFwiLCBcInNwcmluZ0RhbXBpbmdTd2luZ1wiLCBcInNwcmluZ0ZyZXF1ZW5jeVN3aW5nXCIsIFwibWF4TW90b3JUd2lzdFwiLCBcIm1pbk1vdG9yVHdpc3RcIiwgXCJtb3RvclNwZWVkVHdpc3RcIiwgXCJtb3RvclRvcnF1ZVR3aXN0XCJcclxuICAgICAgXSk7XHJcbiAgICB9O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAgICogQSBwaHlzaWNhbCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIGJvZGllcyB3aXRoIGEgZGVmaW5lZCBheGUgb2Ygcm90YXRpb24uIEFsc28ga25vd24gYXMgSElOR0Ugam9pbnQuXHJcbiAgICAgKiBUd28gUmlnaWRCb2RpZXMgbmVlZCB0byBiZSBkZWZpbmVkIHRvIHVzZSBpdC4gQSBtb3RvciBjYW4gYmUgZGVmaW5lZCB0byByb3RhdGUgdGhlIGNvbm5lY3RlZCBhbG9uZyB0aGUgZGVmaW5lZCBheGlzLlxyXG4gICAgICogXHJcbiAgICAgKiBgYGB0ZXh0ICAgICAgICBcclxuICAgICAqICAgICAgICAgICAgICAgICAgcm90YXRpb24gYXhpcywgMXN0IERlZ3JlZSBvZiBmcmVlZG9tXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAg4oaRXHJcbiAgICAgKiAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkOKUguKUjOKUgOKUgOKUgOKUgOKUkCAgICAgXHJcbiAgICAgKiAgICAgICAgICAgICAgIOKUgiAgIOKUguKUguKUgiAgICDilIIgIFxyXG4gICAgICogICAgICAgICAgICAgICDilIIgICDilILilILilIIgICAg4pSCIFxyXG4gICAgICogICAgICAgICAgICAgICDilIIgICDilILilILilIIgICAg4pSCIFxyXG4gICAgICogICAgICAgICAgICAgICDilJTilIDilIDilIDilJjilILilJTilIDilIDilIDilIDilJhcclxuICAgICAqICAgICAgICAgICAgICAgICAgICDilIIgICBcclxuICAgICAqICAgICAgYm9keUFuY2hvciAgICAgICAgIGJvZHlUaWVkXHJcbiAgICAgKiAgIChlLmcuIERvb3JoaW5nZSkgICAgICAgKGUuZy4gRG9vcilcclxuICAgICAqIGBgYFxyXG4gICAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50UmV2b2x1dGUgZXh0ZW5kcyBKb2ludEF4aWFsIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBKb2ludC5yZWdpc3RlclN1YmNsYXNzKEpvaW50UmV2b2x1dGUpO1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2ludDogT0lNTy5SZXZvbHV0ZUpvaW50O1xyXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogT0lNTy5SZXZvbHV0ZUpvaW50Q29uZmlnID0gbmV3IE9JTU8uUmV2b2x1dGVKb2ludENvbmZpZygpO1xyXG5cclxuICAgICNtb3RvclRvcnF1ZTogbnVtYmVyID0gMDtcclxuICAgICNyb3RvcjogT0lNTy5Sb3RhdGlvbmFsTGltaXRNb3RvcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2F4aXM6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAxLCAwKSwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCwgX2F4aXMsIF9sb2NhbEFuY2hvcik7XHJcblxyXG4gICAgICB0aGlzLm1heE1vdG9yID0gMzYwO1xyXG4gICAgICB0aGlzLm1pbk1vdG9yID0gMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgVXBwZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gQXhpcy1BbmdsZSBtZWFzdXJlZCBpbiBEZWdyZWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgbWF4TW90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIubWF4TW90b3IgPSBfdmFsdWU7XHJcbiAgICAgIF92YWx1ZSAqPSBDYWxjLmRlZzJyYWQ7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50KVxyXG4gICAgICAgIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcigpLnVwcGVyTGltaXQgPSBfdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgTG93ZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gQXhpcyBBbmdsZSBtZWFzdXJlZCBpbiBEZWdyZWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgbWluTW90b3IoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIubWluTW90b3IgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50KVxyXG4gICAgICAgIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcigpLmxvd2VyTGltaXQgPSBfdmFsdWUgKiBDYWxjLmRlZzJyYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogVGhlIG1heGltdW0gbW90b3IgZm9yY2UgaW4gTmV3dG9uLiBmb3JjZSA8PSAwIGVxdWFscyBkaXNhYmxlZC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbW90b3JUb3JxdWUoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI21vdG9yVG9ycXVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBtb3RvclRvcnF1ZShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtb3RvclRvcnF1ZSA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yKCkubW90b3JUb3JxdWUgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogSWYgdGhlIHR3byBjb25uZWN0ZWQgUmlnaWRCb2RpZXMgY29sbGlkZSB3aXRoIGVhdGggb3RoZXIuIChEZWZhdWx0ID0gZmFsc2UpXHJcbiAgICAgKi9cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gU2F2aW5nL0xvYWRpbmdcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIG1vdG9yVG9ycXVlOiB0aGlzLm1vdG9yVG9ycXVlLFxyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgdGhpcy5tb3RvclRvcnF1ZSA9IF9zZXJpYWxpemF0aW9uLm1vdG9yVG9ycXVlO1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgbXV0YXRvci5tb3RvclRvcnF1ZSA9IHRoaXMubW90b3JUb3JxdWU7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5tb3RvclRvcnF1ZSkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5tb3RvclRvcnF1ZSA9IF9tdXRhdG9yLm1vdG9yVG9ycXVlO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubW90b3JUb3JxdWU7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jcm90b3IgPSBuZXcgT0lNTy5Sb3RhdGlvbmFsTGltaXRNb3RvcigpLnNldExpbWl0cyhzdXBlci5taW5Nb3RvciAqIENhbGMuZGVnMnJhZCwgc3VwZXIubWF4TW90b3IgKiBDYWxjLmRlZzJyYWQpO1xyXG4gICAgICB0aGlzLiNyb3Rvci5zZXRNb3Rvcih0aGlzLm1vdG9yU3BlZWQsIHRoaXMubW90b3JUb3JxdWUpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgT0lNTy5SZXZvbHV0ZUpvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KCk7XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZy5zcHJpbmdEYW1wZXIgPSB0aGlzLnNwcmluZ0RhbXBlcjtcclxuICAgICAgdGhpcy5jb25maWcubGltaXRNb3RvciA9IHRoaXMuI3JvdG9yO1xyXG5cclxuICAgICAgdGhpcy5qb2ludCA9IG5ldyBPSU1PLlJldm9sdXRlSm9pbnQodGhpcy5jb25maWcpO1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyZUpvaW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAgKiBBIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gYm9kaWVzIHdpdGggdGhyZWUgRGVncmVlcyBvZiBGcmVlZG9tLCBhbHNvIGtub3duIGFzIGJhbGwgYW5kIHNvY2tldCBqb2ludC4gVHdvIGJvZGllcyBjb25uZWN0ZWQgYXQgdGhlaXIgYW5jaG9yIGJ1dCBmcmVlIHRvIHJvdGF0ZS5cclxuICAgICAqIFVzZWQgZm9yIHRoaW5ncyBsaWtlIHRoZSBjb25uZWN0aW9uIG9mIGJvbmVzIGluIHRoZSBodW1hbiBzaG91bGRlciAoaWYgc2ltcGxpZmllZCwgZWxzZSBiZXR0ZXIgdXNlIEpvaW50UmFnZG9sbCkuIFR3byBSaWdpZEJvZGllcyBuZWVkIHRvIGJlIGRlZmluZWQgdG8gdXNlIGl0LiBPbmx5IHNwcmluZyBzZXR0aW5ncyBjYW4gYmUgZGVmaW5lZC5cclxuICAgICAqIDMgRGVncmVlcyBhcmUgc3dpbmcgaG9yaXpvbnRhbCwgc3dpbmcgdmVydGljYWwgYW5kIHR3aXN0LlxyXG4gICAgICogXHJcbiAgICAgKiBgYGB0ZXh0XHJcbiAgICAgKiAgICAgICAgICAgICAgSm9pbnRIb2xkZXJcclxuICAgICAqICAgICAgICAgeiAgICAgIGJvZHlBbmNob3IgKGUuZy4gSHVtYW4tU2hvdWxkZXIpICAgICBcclxuICAgICAqICAgICAgeSAg4oaRICAgICAgICAgIFxyXG4gICAgICogICAgICAgIFxcfCAgICAgICAgICDilIDilIDilIAo4peP4pSA4pSA4pSAXHJcbiAgICAgKiAgLXggPC0tLXwtLS0+IHggICAgICAgICAgIGJvZHlUaWVkICAgICAgICBcclxuICAgICAqICAgICAgICAgfFxcICAgICAgICAgICAgICAgIChlLmcuIFVwcGVyLUFybSkgXHJcbiAgICAgKiAgICAgICAgIOKGkyAteSAgICAgICBcclxuICAgICAqICAgICAgICAteiAgICAgICAgICBcclxuICAgICAqIGBgYFxyXG4gICAgICogQGF1dGhvciBNYXJrbyBGZWhyZW5iYWNoLCBIRlUsIDIwMjAgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMVxyXG4gICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEpvaW50U3BoZXJpY2FsIGV4dGVuZHMgSm9pbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IEpvaW50LnJlZ2lzdGVyU3ViY2xhc3MoSm9pbnRTcGhlcmljYWwpO1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2ludDogT0lNTy5TcGhlcmljYWxKb2ludDtcclxuICAgIHByb3RlY3RlZCBjb25maWc6IE9JTU8uU3BoZXJpY2FsSm9pbnRDb25maWcgPSBuZXcgT0lNTy5TcGhlcmljYWxKb2ludENvbmZpZygpO1xyXG5cclxuICAgICNzcHJpbmdEYW1waW5nOiBudW1iZXIgPSAwO1xyXG4gICAgI3NwcmluZ0ZyZXF1ZW5jeTogbnVtYmVyID0gMDtcclxuICAgICNzcHJpbmdEYW1wZXI6IE9JTU8uU3ByaW5nRGFtcGVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYm9keUFuY2hvcjogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2JvZHlUaWVkOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfbG9jYWxBbmNob3I6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAwLCAwKSkge1xyXG4gICAgICBzdXBlcihfYm9keUFuY2hvciwgX2JvZHlUaWVkKTtcclxuICAgICAgdGhpcy5hbmNob3IgPSBuZXcgVmVjdG9yMyhfbG9jYWxBbmNob3IueCwgX2xvY2FsQW5jaG9yLnksIF9sb2NhbEFuY2hvci56KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gR2V0L1NldCB0cmFuc2ZvciBvZiBmdWRnZSBwcm9wZXJ0aWVzIHRvIHRoZSBwaHlzaWNzIGVuZ2luZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhbXBpbmcgb2YgdGhlIHNwcmluZy4gMSBlcXVhbHMgY29tcGxldGx5IGRhbXBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdEYW1waW5nKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdEYW1waW5nO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0RhbXBpbmcgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3ByaW5nRGFtcGVyKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIFRoZSBzbWFsbGVyIHRoZSB2YWx1ZSB0aGUgbGVzcyByZXN0cmljdGl2ZSBpcyB0aGUgc3ByaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRnJlcXVlbmN5KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdGcmVxdWVuY3k7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeShfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdGcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3ByaW5nRGFtcGVyKCkuZnJlcXVlbmN5ID0gX3ZhbHVlO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHtcclxuICAgICAgICBzcHJpbmdEYW1waW5nOiB0aGlzLnNwcmluZ0RhbXBpbmcsXHJcbiAgICAgICAgc3ByaW5nRnJlcXVlbmN5OiB0aGlzLnNwcmluZ0ZyZXF1ZW5jeSxcclxuICAgICAgICBbc3VwZXIuY29uc3RydWN0b3IubmFtZV06IHN1cGVyLnNlcmlhbGl6ZSgpXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuc3ByaW5nRGFtcGluZyA9IF9zZXJpYWxpemF0aW9uLnNwcmluZ0RhbXBpbmc7XHJcbiAgICAgIHRoaXMuc3ByaW5nRnJlcXVlbmN5ID0gX3NlcmlhbGl6YXRpb24uc3ByaW5nRnJlcXVlbmN5O1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yKCk6IE11dGF0b3Ige1xyXG4gICAgICBsZXQgbXV0YXRvcjogTXV0YXRvciA9IHN1cGVyLmdldE11dGF0b3IoKTtcclxuICAgICAgbXV0YXRvci5zcHJpbmdEYW1waW5nID0gdGhpcy5zcHJpbmdEYW1waW5nO1xyXG4gICAgICBtdXRhdG9yLnNwcmluZ0ZyZXF1ZW5jeSA9IHRoaXMuc3ByaW5nRnJlcXVlbmN5O1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgbXV0YXRlKF9tdXRhdG9yOiBNdXRhdG9yLCBfc2VsZWN0aW9uOiBzdHJpbmdbXSA9IG51bGwsIF9kaXNwYXRjaE11dGF0ZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy5tdXRhdGVCYXNlKF9tdXRhdG9yLCBbXCJzcHJpbmdEYW1waW5nXCIsIFwic3ByaW5nRnJlcXVlbmN5XCJdKTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnNwcmluZ0RhbXBpbmc7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5zcHJpbmdGcmVxdWVuY3k7XHJcbiAgICAgIGF3YWl0IHN1cGVyLm11dGF0ZShfbXV0YXRvciwgX3NlbGVjdGlvbiwgX2Rpc3BhdGNoTXV0YXRlKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGVyID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuc3ByaW5nRnJlcXVlbmN5LCB0aGlzLnNwcmluZ0RhbXBpbmcpO1xyXG4gICAgICB0aGlzLmNvbmZpZyA9IG5ldyBPSU1PLlNwaGVyaWNhbEpvaW50Q29uZmlnKCk7XHJcbiAgICAgIHN1cGVyLmNvbnN0cnVjdEpvaW50KCk7XHJcbiAgICAgIHRoaXMuY29uZmlnLnNwcmluZ0RhbXBlciA9IHRoaXMuI3NwcmluZ0RhbXBlcjtcclxuXHJcbiAgICAgIHRoaXMuam9pbnQgPSBuZXcgT0lNTy5TcGhlcmljYWxKb2ludCh0aGlzLmNvbmZpZyk7XHJcbiAgICAgIHN1cGVyLmNvbmZpZ3VyZUpvaW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAgKiBBIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gYm9kaWVzIHdpdGggdHdvIGRlZmluZWQgYXhpcyAobm9ybWFsbHkgZS5nLiAoMCwwLDEpIGFuZCByb3RhdGlvbigxLDAsMCkpLCB0aGV5IHNoYXJlIHRoZSBzYW1lIGFuY2hvciBhbmQgaGF2ZSBmcmVlIHJvdGF0aW9uLCBidXQgdHJhbnNmZXIgdGhlIHR3aXN0LlxyXG4gICAgICogSW4gcmVhbGl0eSB1c2VkIGluIGNhcnMgdG8gdHJhbnNmZXIgdGhlIG1vcmUgc3RhYmxlIHN0YXRpb25hcnkgZm9yY2Ugb24gdGhlIHZlbG9jaXR5IGF4aXMgdG8gdGhlIGJ1bXBpbmcsIGRhbXBlZCBtb3Zpbmcgd2hlZWwuIFR3byBSaWdpZEJvZGllcyBuZWVkIHRvIGJlIGRlZmluZWQgdG8gdXNlIGl0LlxyXG4gICAgICogVGhlIHR3byBtb3RvcnMgY2FuIGJlIGRlZmluZWQgZm9yIHRoZSB0d28gcm90YXRpb24gYXhpcywgYWxvbmcgd2l0aCBzcHJpbmdzLiBcclxuICAgICAqIGBgYHRleHQgICAgICAgIFxyXG4gICAgICogICAgICAgICAgICAgICAgICBcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuY2hvciAtIHR3aXN0IGlzIHRyYW5zZmVyZWQgYmV0d2VlbiBib2RpZXNcclxuICAgICAqICAgICAgICAgeiAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiAgICAgICAgIOKGkSAgICAgICAgICAgIC0tLS0tICB8ICAtLS0tLS0tLS0tLS1cclxuICAgICAqICAgICAgICAgfCAgICAgICAgICAgfCAgICAgfCDihpMgfCAgICAgICAgICAgIHwgXHJcbiAgICAgKiAgLXggPC0tLXwtLS0+IHggICAgIHwgICAgIHwgeCB8ICAgICAgICAgICAgfCAgICAgICAgICAgZS5nLiB3aGVlbCBjYW4gc3RpbGwgdHVybiB1cC9kb3duLCBcclxuICAgICAqICAgICAgICAgfCAgICAgICAgICAgfCAgICAgfCAgIHwgICAgICAgICAgICB8ICAgICAgICAgICBsZWZ0IHJpZ2h0IGJ1dCB0cmFuc2ZlcmluZyBpdCdzIHJvdGF0aW9uIG9uIHRvIHRoZSB3aGVlbC1heGlzLlxyXG4gICAgICogICAgICAgICDihpMgICAgICAgICAgICAtLS0tLSAgICAgLS0tLS0tLS0tLS0tXHJcbiAgICAgKiAgICAgICAgLXogICAgXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgYXR0YWNoZWRSQiAgICAgICAgICBjb25uZWN0ZWRSQlxyXG4gICAgICogICAgICAgICAgICAgICAgKGUuZy4gd2hlZWwpICAgICAgIChlLmcuIHdoZWVsLWF4aXMpXHJcbiAgICAgKiBgYGBcclxuICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICAgKi9cclxuICBleHBvcnQgY2xhc3MgSm9pbnRVbml2ZXJzYWwgZXh0ZW5kcyBKb2ludCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gSm9pbnQucmVnaXN0ZXJTdWJjbGFzcyhKb2ludFVuaXZlcnNhbCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGpvaW50OiBPSU1PLlVuaXZlcnNhbEpvaW50O1xyXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogT0lNTy5Vbml2ZXJzYWxKb2ludENvbmZpZyA9IG5ldyBPSU1PLlVuaXZlcnNhbEpvaW50Q29uZmlnKCk7XHJcblxyXG4gICAgI3NwcmluZ0RhbXBpbmdGaXJzdDogbnVtYmVyID0gMDtcclxuICAgICNzcHJpbmdGcmVxdWVuY3lGaXJzdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAjc3ByaW5nRGFtcGluZ1NlY29uZDogbnVtYmVyID0gMDtcclxuICAgICNzcHJpbmdGcmVxdWVuY3lTZWNvbmQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI21heFJvdG9yRmlyc3Q6IG51bWJlciA9IDM2MDtcclxuICAgICNtaW5Sb3RvckZpcnN0OiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yVG9ycXVlRmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgICAjcm90b3JTcGVlZEZpcnN0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICNtYXhSb3RvclNlY29uZDogbnVtYmVyID0gMzYwO1xyXG4gICAgI21pblJvdG9yU2Vjb25kOiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yVG9ycXVlU2Vjb25kOiBudW1iZXIgPSAwO1xyXG4gICAgI3JvdG9yU3BlZWRTZWNvbmQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgI21vdG9yRmlyc3Q6IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3I7XHJcbiAgICAjbW90b3JTZWNvbmQ6IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3I7XHJcbiAgICAjYXhpc1NwcmluZ0RhbXBlckZpcnN0OiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuICAgICNheGlzU3ByaW5nRGFtcGVyU2Vjb25kOiBPSU1PLlNwcmluZ0RhbXBlcjtcclxuICAgICNheGlzRmlyc3Q6IE9JTU8uVmVjMztcclxuICAgICNheGlzU2Vjb25kOiBPSU1PLlZlYzM7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ib2R5QW5jaG9yOiBDb21wb25lbnRSaWdpZGJvZHkgPSBudWxsLCBfYm9keVRpZWQ6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9heGlzRmlyc3Q6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygxLCAwLCAwKSwgX2F4aXNTZWNvbmQ6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAwLCAxKSwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCk7XHJcbiAgICAgIHRoaXMuYXhpc0ZpcnN0ID0gX2F4aXNGaXJzdDtcclxuICAgICAgdGhpcy5heGlzU2Vjb25kID0gX2F4aXNTZWNvbmQ7XHJcbiAgICAgIHRoaXMuYW5jaG9yID0gX2xvY2FsQW5jaG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBHZXQvU2V0IHRyYW5zZm9yIG9mIGZ1ZGdlIHByb3BlcnRpZXMgdG8gdGhlIHBoeXNpY3MgZW5naW5lXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBheGlzIGNvbm5lY3RpbmcgdGhlIHRoZSB0d28ge0BsaW5rIE5vZGV9cyBlLmcuIFZlY3RvcjMoMCwxLDApIHRvIGhhdmUgYSB1cHdhcmQgY29ubmVjdGlvbi5cclxuICAgICAqICBXaGVuIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdGhlIGpvaW50IG5lZWRzIHRvIGJlIHJlY29ubmVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGF4aXNGaXJzdCgpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHRoaXMuI2F4aXNGaXJzdC54LCB0aGlzLiNheGlzRmlyc3QueSwgdGhpcy4jYXhpc0ZpcnN0LnopO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBheGlzRmlyc3QoX3ZhbHVlOiBWZWN0b3IzKSB7XHJcbiAgICAgIHRoaXMuI2F4aXNGaXJzdCA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICogVGhlIGF4aXMgY29ubmVjdGluZyB0aGUgdGhlIHR3byB7QGxpbmsgTm9kZX1zIGUuZy4gVmVjdG9yMygwLDEsMCkgdG8gaGF2ZSBhIHVwd2FyZCBjb25uZWN0aW9uLlxyXG4gICAgKiAgV2hlbiBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uIHRoZSBqb2ludCBuZWVkcyB0byBiZSByZWNvbm5lY3RlZC5cclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGF4aXNTZWNvbmQoKTogVmVjdG9yMyB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh0aGlzLiNheGlzU2Vjb25kLngsIHRoaXMuI2F4aXNTZWNvbmQueSwgdGhpcy4jYXhpc1NlY29uZC56KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYXhpc1NlY29uZChfdmFsdWU6IFZlY3RvcjMpIHtcclxuICAgICAgdGhpcy4jYXhpc1NlY29uZCA9IG5ldyBPSU1PLlZlYzMoX3ZhbHVlLngsIF92YWx1ZS55LCBfdmFsdWUueik7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmRpcnR5U3RhdHVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGFtcGluZyBvZiB0aGUgc3ByaW5nLiAxIGVxdWFscyBjb21wbGV0bHkgZGFtcGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0RhbXBpbmdGaXJzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRGFtcGluZ0ZpcnN0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzcHJpbmdEYW1waW5nRmlyc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGluZ0ZpcnN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFNwcmluZ0RhbXBlcjEoKS5kYW1waW5nUmF0aW8gPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBzcHJpbmcgaW4gSHouIEF0IDAgdGhlIHNwcmluZyBpcyByaWdpZCwgZXF1YWxzIG5vIHNwcmluZy4gVGhlIHNtYWxsZXIgdGhlIHZhbHVlIHRoZSBsZXNzIHJlc3RyaWN0aXZlIGlzIHRoZSBzcHJpbmcuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldCBzcHJpbmdGcmVxdWVuY3lGaXJzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jc3ByaW5nRnJlcXVlbmN5Rmlyc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeUZpcnN0KF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeUZpcnN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldFNwcmluZ0RhbXBlcjEoKS5mcmVxdWVuY3kgPSBfdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGFtcGluZyBvZiB0aGUgc3ByaW5nLiAxIGVxdWFscyBjb21wbGV0bHkgZGFtcGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNwcmluZ0RhbXBpbmdTZWNvbmQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3NwcmluZ0RhbXBpbmdTZWNvbmQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0RhbXBpbmdTZWNvbmQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jc3ByaW5nRGFtcGluZ1NlY29uZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRTcHJpbmdEYW1wZXIyKCkuZGFtcGluZ1JhdGlvID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3ByaW5nIGluIEh6LiBBdCAwIHRoZSBzcHJpbmcgaXMgcmlnaWQsIGVxdWFscyBubyBzcHJpbmcuIFRoZSBzbWFsbGVyIHRoZSB2YWx1ZSB0aGUgbGVzcyByZXN0cmljdGl2ZSBpcyB0aGUgc3ByaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc3ByaW5nRnJlcXVlbmN5U2Vjb25kKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNzcHJpbmdGcmVxdWVuY3lTZWNvbmQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNwcmluZ0ZyZXF1ZW5jeVNlY29uZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNzcHJpbmdGcmVxdWVuY3lTZWNvbmQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0U3ByaW5nRGFtcGVyMigpLmZyZXF1ZW5jeSA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgVXBwZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gQXhpcy1BbmdsZSBtZWFzdXJlZCBpbiBEZWdyZWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWF4Um90b3JGaXJzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWF4Um90b3JGaXJzdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWF4Um90b3JGaXJzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtYXhSb3RvckZpcnN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IxKCkudXBwZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgTG93ZXIgTGltaXQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGF4aXMgb2YgdGhpcyBqb2ludC4gVGhlIGxpbWl0ZXIgaXMgZGlzYWJsZSBpZiBsb3dlckxpbWl0ID4gdXBwZXJMaW1pdC4gQXhpcyBBbmdsZSBtZWFzdXJlZCBpbiBEZWdyZWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbWluUm90b3JGaXJzdCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWluUm90b3JGaXJzdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWluUm90b3JGaXJzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNtaW5Sb3RvckZpcnN0ID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IxKCkubG93ZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgdGFyZ2V0IHJvdGF0aW9uYWwgc3BlZWQgb2YgdGhlIG1vdG9yIGluIG0vcy4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90b3JTcGVlZEZpcnN0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNyb3RvclNwZWVkRmlyc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdG9yU3BlZWRGaXJzdChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNyb3RvclNwZWVkRmlyc3QgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcjEoKS5tb3RvclNwZWVkID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1heGltdW0gbW90b3IgdG9ycXVlIGluIE5ld3Rvbi4gZm9yY2UgPD0gMCBlcXVhbHMgZGlzYWJsZWQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJvdG9yVG9ycXVlRmlyc3QoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JvdG9yVG9ycXVlRmlyc3Q7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJvdG9yVG9ycXVlRmlyc3QoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jcm90b3JUb3JxdWVGaXJzdCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMSgpLm1vdG9yVG9ycXVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFVwcGVyIExpbWl0IG9mIG1vdmVtZW50IGFsb25nIHRoZSBheGlzIG9mIHRoaXMgam9pbnQuIFRoZSBsaW1pdGVyIGlzIGRpc2FibGUgaWYgbG93ZXJMaW1pdCA+IHVwcGVyTGltaXQuIEF4aXMtQW5nbGUgbWVhc3VyZWQgaW4gRGVncmVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG1heFJvdG9yU2Vjb25kKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtYXhSb3RvclNlY29uZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgbWF4Um90b3JTZWNvbmQoX3ZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgdGhpcy4jbWF4Um90b3JTZWNvbmQgPSBfdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmpvaW50ICE9IG51bGwpIHRoaXMuam9pbnQuZ2V0TGltaXRNb3RvcjIoKS51cHBlckxpbWl0ID0gX3ZhbHVlICogQ2FsYy5kZWcycmFkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIFRoZSBMb3dlciBMaW1pdCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgYXhpcyBvZiB0aGlzIGpvaW50LiBUaGUgbGltaXRlciBpcyBkaXNhYmxlIGlmIGxvd2VyTGltaXQgPiB1cHBlckxpbWl0LiBBeGlzIEFuZ2xlIG1lYXN1cmVkIGluIERlZ3JlZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBtaW5Sb3RvclNlY29uZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWluUm90b3JTZWNvbmQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG1pblJvdG9yU2Vjb25kKF92YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuI21pblJvdG9yU2Vjb25kID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IyKCkubG93ZXJMaW1pdCA9IF92YWx1ZSAqIENhbGMuZGVnMnJhZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgdGFyZ2V0IHJvdGF0aW9uYWwgc3BlZWQgb2YgdGhlIG1vdG9yIGluIG0vcy4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90b3JTcGVlZFNlY29uZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy4jcm90b3JTcGVlZFNlY29uZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgcm90b3JTcGVlZFNlY29uZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNyb3RvclNwZWVkU2Vjb25kID0gX3ZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5qb2ludCAhPSBudWxsKSB0aGlzLmpvaW50LmdldExpbWl0TW90b3IyKCkubW90b3JTcGVlZCA9IF92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBUaGUgbWF4aW11bSBtb3RvciB0b3JxdWUgaW4gTmV3dG9uLiBmb3JjZSA8PSAwIGVxdWFscyBkaXNhYmxlZC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcm90b3JUb3JxdWVTZWNvbmQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3JvdG9yVG9ycXVlU2Vjb25kO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCByb3RvclRvcnF1ZVNlY29uZChfdmFsdWU6IG51bWJlcikge1xyXG4gICAgICB0aGlzLiNyb3RvclRvcnF1ZVNlY29uZCA9IF92YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuam9pbnQgIT0gbnVsbCkgdGhpcy5qb2ludC5nZXRMaW1pdE1vdG9yMigpLm1vdG9yVG9ycXVlID0gX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAqIElmIHRoZSB0d28gY29ubmVjdGVkIFJpZ2lkQm9kaWVzIGNvbGxpZGUgd2l0aCBlYXRoIG90aGVyLiAoRGVmYXVsdCA9IGZhbHNlKVxyXG4gICAgICovXHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFNhdmluZy9Mb2FkaW5nXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IHRoaXMuI2dldE11dGF0b3IoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5maXJzdEF4aXMgPSB0aGlzLmF4aXNGaXJzdC5zZXJpYWxpemUoKTtcclxuICAgICAgc2VyaWFsaXphdGlvbi5zZWNvbmRBeGlzID0gdGhpcy5heGlzU2Vjb25kLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBzZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdID0gc3VwZXIuc2VyaWFsaXplKCk7XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIHRoaXMuYXhpc0ZpcnN0ID0gYXdhaXQgbmV3IFZlY3RvcjMoKS5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbi5heGlzRmlyc3QpO1xyXG4gICAgICB0aGlzLmF4aXNTZWNvbmQgPSBhd2FpdCBuZXcgVmVjdG9yMygpLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uLmF4aXNTZWNvbmQpO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IsIF9zZWxlY3Rpb246IHN0cmluZ1tdID0gbnVsbCwgX2Rpc3BhdGNoTXV0YXRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAodHlwZW9mIChfbXV0YXRvci5heGlzRmlyc3QpICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgIHRoaXMuYXhpc0ZpcnN0ID0gbmV3IFZlY3RvcjMoLi4uPG51bWJlcltdPihPYmplY3QudmFsdWVzKF9tdXRhdG9yLmF4aXNGaXJzdCkpKTtcclxuICAgICAgaWYgKHR5cGVvZiAoX211dGF0b3IuYXhpc1NlY29uZCkgIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgdGhpcy5heGlzU2Vjb25kID0gbmV3IFZlY3RvcjMoLi4uPG51bWJlcltdPihPYmplY3QudmFsdWVzKF9tdXRhdG9yLmF4aXNTZWNvbmQpKSk7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5heGlzRmlyc3Q7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5heGlzU2Vjb25kO1xyXG4gICAgICB0aGlzLiNtdXRhdGUoX211dGF0b3IpO1xyXG4gICAgICB0aGlzLmRlbGV0ZUZyb21NdXRhdG9yKF9tdXRhdG9yLCB0aGlzLiNnZXRNdXRhdG9yKCkpO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKG11dGF0b3IsIHRoaXMuI2dldE11dGF0b3IoKSk7XHJcbiAgICAgIG11dGF0b3IuYXhpc0ZpcnN0ID0gdGhpcy5heGlzRmlyc3QuZ2V0TXV0YXRvcigpO1xyXG4gICAgICBtdXRhdG9yLmF4aXNTZWNvbmQgPSB0aGlzLmF4aXNTZWNvbmQuZ2V0TXV0YXRvcigpO1xyXG4gICAgICByZXR1cm4gbXV0YXRvcjtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy4jYXhpc1NwcmluZ0RhbXBlckZpcnN0ID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeUZpcnN0LCB0aGlzLiNzcHJpbmdEYW1waW5nRmlyc3QpO1xyXG4gICAgICB0aGlzLiNheGlzU3ByaW5nRGFtcGVyU2Vjb25kID0gbmV3IE9JTU8uU3ByaW5nRGFtcGVyKCkuc2V0U3ByaW5nKHRoaXMuI3NwcmluZ0ZyZXF1ZW5jeVNlY29uZCwgdGhpcy4jc3ByaW5nRGFtcGluZ1NlY29uZCk7XHJcblxyXG4gICAgICB0aGlzLiNtb3RvckZpcnN0ID0gbmV3IE9JTU8uUm90YXRpb25hbExpbWl0TW90b3IoKS5zZXRMaW1pdHModGhpcy4jbWluUm90b3JGaXJzdCAqIENhbGMuZGVnMnJhZCwgdGhpcy4jbWF4Um90b3JGaXJzdCAqIENhbGMuZGVnMnJhZCk7XHJcbiAgICAgIHRoaXMuI21vdG9yRmlyc3Quc2V0TW90b3IodGhpcy4jcm90b3JTcGVlZEZpcnN0LCB0aGlzLiNyb3RvclRvcnF1ZUZpcnN0KTtcclxuICAgICAgdGhpcy4jbW90b3JTZWNvbmQgPSBuZXcgT0lNTy5Sb3RhdGlvbmFsTGltaXRNb3RvcigpLnNldExpbWl0cyh0aGlzLiNtaW5Sb3RvckZpcnN0ICogQ2FsYy5kZWcycmFkLCB0aGlzLiNtYXhSb3RvckZpcnN0ICogQ2FsYy5kZWcycmFkKTtcclxuICAgICAgdGhpcy4jbW90b3JTZWNvbmQuc2V0TW90b3IodGhpcy4jcm90b3JTcGVlZEZpcnN0LCB0aGlzLiNyb3RvclRvcnF1ZUZpcnN0KTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IE9JTU8uVW5pdmVyc2FsSm9pbnRDb25maWcoKTtcclxuICAgICAgc3VwZXIuY29uc3RydWN0Sm9pbnQodGhpcy4jYXhpc0ZpcnN0LCB0aGlzLiNheGlzU2Vjb25kKTtcclxuICAgICAgdGhpcy5jb25maWcubGltaXRNb3RvcjEgPSB0aGlzLiNtb3RvckZpcnN0O1xyXG4gICAgICB0aGlzLmNvbmZpZy5saW1pdE1vdG9yMiA9IHRoaXMuI21vdG9yU2Vjb25kO1xyXG4gICAgICB0aGlzLmNvbmZpZy5zcHJpbmdEYW1wZXIxID0gdGhpcy4jYXhpc1NwcmluZ0RhbXBlckZpcnN0O1xyXG4gICAgICB0aGlzLmNvbmZpZy5zcHJpbmdEYW1wZXIyID0gdGhpcy4jYXhpc1NwcmluZ0RhbXBlclNlY29uZDtcclxuXHJcbiAgICAgIHRoaXMuam9pbnQgPSBuZXcgT0lNTy5Vbml2ZXJzYWxKb2ludCh0aGlzLmNvbmZpZyk7XHJcbiAgICAgIHN1cGVyLmNvbmZpZ3VyZUpvaW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgI2dldE11dGF0b3IgPSAoKTogTXV0YXRvciA9PiB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0ge1xyXG4gICAgICAgIHNwcmluZ0RhbXBpbmdGaXJzdDogdGhpcy4jc3ByaW5nRGFtcGluZ0ZpcnN0LFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeUZpcnN0OiB0aGlzLiNzcHJpbmdGcmVxdWVuY3lGaXJzdCxcclxuICAgICAgICBzcHJpbmdEYW1waW5nU2Vjb25kOiB0aGlzLiNzcHJpbmdEYW1waW5nU2Vjb25kLFxyXG4gICAgICAgIHNwcmluZ0ZyZXF1ZW5jeVNlY29uZDogdGhpcy4jc3ByaW5nRnJlcXVlbmN5U2Vjb25kLFxyXG4gICAgICAgIG1heFJvdG9yRmlyc3Q6IHRoaXMuI21heFJvdG9yRmlyc3QsXHJcbiAgICAgICAgbWluUm90b3JGaXJzdDogdGhpcy4jbWluUm90b3JGaXJzdCxcclxuICAgICAgICByb3RvclNwZWVkRmlyc3Q6IHRoaXMuI3JvdG9yU3BlZWRGaXJzdCxcclxuICAgICAgICByb3RvclRvcnF1ZUZpcnN0OiB0aGlzLiNyb3RvclRvcnF1ZUZpcnN0LFxyXG4gICAgICAgIG1heFJvdG9yU2Vjb25kOiB0aGlzLiNtYXhSb3RvclNlY29uZCxcclxuICAgICAgICBtaW5Sb3RvclNlY29uZDogdGhpcy4jbWluUm90b3JTZWNvbmQsXHJcbiAgICAgICAgcm90b3JTcGVlZFNlY29uZDogdGhpcy4jcm90b3JTcGVlZFNlY29uZCxcclxuICAgICAgICByb3RvclRvcnF1ZVNlY29uZDogdGhpcy4jcm90b3JUb3JxdWVTZWNvbmRcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9O1xyXG5cclxuICAgICNtdXRhdGUgPSAoX211dGF0b3I6IE11dGF0b3IpOiB2b2lkID0+IHtcclxuICAgICAgdGhpcy5tdXRhdGVCYXNlKF9tdXRhdG9yLCBbXHJcbiAgICAgICAgXCJzcHJpbmdEYW1waW5nRmlyc3RcIiwgXCJzcHJpbmdGcmVxdWVuY3lGaXJzdFwiLCBcInNwcmluZ0RhbXBpbmdTZWNvbmRcIiwgXCJzcHJpbmdGcmVxdWVuY3lTZWNvbmRcIixcclxuICAgICAgICBcIm1heFJvdG9yRmlyc3RcIiwgXCJtaW5Sb3RvckZpcnN0XCIsIFwicm90b3JTcGVlZEZpcnN0XCIsIFwicm90b3JUb3JxdWVGaXJzdFwiLFxyXG4gICAgICAgIFwibWF4Um90b3JTZWNvbmRcIiwgXCJtaW5Sb3RvclNlY29uZFwiLCBcInJvdG9yU3BlZWRTZWNvbmRcIiwgXCIucm90b3JUb3JxdWVTZWNvbmRcIl1cclxuICAgICAgKTtcclxuICAgIH07XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAgKiBBIHBoeXNpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gYm9kaWVzIHdpdGggbm8gbW92ZW1lbnQuIFxyXG4gICAgICogQmVzdCB3YXkgdG8gc2ltdWxhdGUgY29udmV4IG9iamVjdHMgbGlrZSBhIGNoYWlyIHNlYXQgY29ubmVjdGVkIHRvIGNoYWlyIGxlZ3MuXHJcbiAgICAgKiBUaGUgYWN0dWFsIGFuY2hvciBwb2ludCBkb2VzIG5vdCBtYXR0ZXIgdGhhdCBtdWNoLCBvbmx5IGluIHZlcnkgc3BlY2lmaWMgZWRnZSBjYXNlcy5cclxuICAgICAqIEJlY2F1c2Ugd2VsZGluZyBtZWFucyB0aGV5IHNpbXBseSBkbyBub3QgZGlzY29ubmVjdC4gKHVubGVzcyB5b3UgYWRkIEJyZWFrYWJpbGl0eSlcclxuICAgKiBAYXV0aG9yIE1hcmtvIEZlaHJlbmJhY2gsIEhGVSwgMjAyMCB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICAgKi9cclxuICBleHBvcnQgY2xhc3MgSm9pbnRXZWxkaW5nIGV4dGVuZHMgSm9pbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IEpvaW50LnJlZ2lzdGVyU3ViY2xhc3MoSm9pbnRXZWxkaW5nKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9pbnQ6IE9JTU8uR2VuZXJpY0pvaW50O1xyXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogT0lNTy5HZW5lcmljSm9pbnRDb25maWcgPSBuZXcgT0lNTy5HZW5lcmljSm9pbnRDb25maWcoKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2JvZHlBbmNob3I6IENvbXBvbmVudFJpZ2lkYm9keSA9IG51bGwsIF9ib2R5VGllZDogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbCwgX2xvY2FsQW5jaG9yOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCkpIHtcclxuICAgICAgc3VwZXIoX2JvZHlBbmNob3IsIF9ib2R5VGllZCk7XHJcblxyXG4gICAgICB0aGlzLmFuY2hvciA9IG5ldyBWZWN0b3IzKF9sb2NhbEFuY2hvci54LCBfbG9jYWxBbmNob3IueSwgX2xvY2FsQW5jaG9yLnopO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAgIC8vI3JlZ2lvbiBTYXZpbmcvTG9hZGluZ1xyXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uIHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSB7XHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2VyaWFsaXphdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24pOiBQcm9taXNlPFNlcmlhbGl6YWJsZT4ge1xyXG4gICAgICBzdXBlci5kZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbltzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RKb2ludCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgT0lNTy5HZW5lcmljSm9pbnRDb25maWcoKTtcclxuICAgICAgc3VwZXIuY29uc3RydWN0Sm9pbnQobmV3IE9JTU8uTWF0MygpLCBuZXcgT0lNTy5NYXQzKCkpO1xyXG5cclxuICAgICAgdGhpcy5qb2ludCA9IG5ldyBPSU1PLkdlbmVyaWNKb2ludCh0aGlzLmNvbmZpZyk7XHJcbiAgICAgIHRoaXMuam9pbnQuc2V0QWxsb3dDb2xsaXNpb24odGhpcy5pbnRlcm5hbENvbGxpc2lvbik7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0Rpc3RyaWJ1dGlvbi9PaW1vUGh5c2ljcy5kLnRzXCIvPlxyXG5cclxubmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICAqIE1hbmFnZXMgdGhlIE9JTU8gcGh5c2ljcyBlbmdpbmUgZm9yIEZVREdFLiBNdWx0aXBsZSBpbnN0YW5jZXMgbWF5IGJlIGNyZWF0ZWQsIG9uZSBpcyBhY3RpdmUgYXQgYSB0aW1lLlxyXG4gICAgKiBBbGwgbWV0aG9kcyBhcmUgc3RhdGljIGFuZCB1c2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW5zdGFuY2UuIEF0IHN0YXJ0dXAsIGEgZGVmYXVsdCBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCBiZWNvbWUgdGhlIGFjdGl2ZSBpbnN0YW5jZVxyXG4gICAgKiBBdHRhY2hpbmcgYSB7QGxpbmsgQ29tcG9uZW50UmlnaWRib2R5fSB0byBhIHtAbGluayBOb2RlfSBwbGFjZXMgYSBwaHlzaWNzIGNvbGxpZGVyIGluIHRoZSBwaHlzaWNzIGluc3RhbmNlIGFjdGl2ZSBhdCB0aGF0IHRpbWUuXHJcbiAgICAqIEBhdXRob3IgTWFya28gRmVocmVuYmFjaCwgSEZVIDIwMjBcclxuICAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBoeXNpY3Mge1xyXG4gICAgLyoqIFRoZSBTRVRUSU5HUyB0aGF0IGFwcGx5IHRvIHRoZSBwaHlzaWNhbCB3b3JsZC4gUmFuZ2luZyBmcm9tIHRoaW5ncyBsaWtlIHNsZWVwaW5nLCBjb2xsaXNpb25TaGFwZVRoaWNrbmVzcyBhbmQgb3RoZXJzICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldHRpbmdzOiBQaHlzaWNzU2V0dGluZ3MgPSBuZXcgUGh5c2ljc1NldHRpbmdzKENPTExJU0lPTl9HUk9VUC5ERUZBVUxULCAoQ09MTElTSU9OX0dST1VQLkRFRkFVTFQgfCBDT0xMSVNJT05fR1JPVVAuR1JPVVBfMSB8IENPTExJU0lPTl9HUk9VUC5HUk9VUF8yIHwgQ09MTElTSU9OX0dST1VQLkdST1VQXzMgfCBDT0xMSVNJT05fR1JPVVAuR1JPVVBfNCkpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgxpJhY3RpdmU6IFBoeXNpY3MgPSBuZXcgUGh5c2ljcygpO1xyXG5cclxuICAgIHByaXZhdGUgb2ltb1dvcmxkOiBPSU1PLldvcmxkO1xyXG4gICAgcHJpdmF0ZSBib2R5TGlzdDogQ29tcG9uZW50UmlnaWRib2R5W10gPSBuZXcgQXJyYXkoKTtcclxuICAgIHByaXZhdGUgam9pbnRMaXN0OiBKb2ludFtdID0gbmV3IEFycmF5KCk7XHJcblxyXG4gICAgLyoqIFRoZSByZW5kZXJpbmcgb2YgcGh5c2ljYWwgZGVidWcgaW5mb3JtYXRpb25zLiBVc2VkIGludGVybmFsbHkgbm8gaW50ZXJhY3Rpb24gbmVlZGVkLiovXHJcbiAgICAjZGVidWdEcmF3OiBQaHlzaWNzRGVidWdEcmF3O1xyXG4gICAgLyoqIFRoZSBjYW1lcmEvdmlld3BvcnQgdGhlIHBoeXNpY3MgYXJlIGRlYnVnZ2VkIHRvLiBVc2VkIGludGVybmFsbHkgbm8gaW50ZXJhY3Rpb24gbmVlZGVkLiAqL1xyXG4gICAgI21haW5DYW06IENvbXBvbmVudENhbWVyYTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgT0lNTyA9PSBcInVuZGVmaW5lZFwiKSB7Ly8gQ2hlY2sgaWYgT0lNTyBOYW1lc3BhY2Ugd2FzIGxvYWRlZCwgZWxzZSBkbyBub3QgdXNlIGFueSBwaHlzaWNzLiBDaGVjayBpcyBuZWVkZWQgdG8gZW5zdXJlIEZVREdFIGNhbiBiZSB1c2VkIHdpdGhvdXQgUGh5c2ljc1xyXG4gICAgICAgIERlYnVnLmVycm9yKFwiT0lNTyBwaHlzaWNzIGVuZ2luZSBub3QgY29ubmVjdGVkIVwiKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm9pbW9Xb3JsZCA9IG5ldyBPSU1PLldvcmxkKCk7XHJcbiAgICAgIHRoaXMuI2RlYnVnRHJhdyA9IG5ldyBQaHlzaWNzRGVidWdEcmF3KCk7ICAvL0NyZWF0ZSBhIEZVREdFIFBoeXNpY3MgZGVidWdnaW5nIGhhbmRsaW5nIG9iamVjdFxyXG4gICAgICB0aGlzLm9pbW9Xb3JsZC5zZXREZWJ1Z0RyYXcodGhpcy4jZGVidWdEcmF3Lm9pbW9EZWJ1Z0RyYXcpOyAvL1RlbGwgT2ltb1BoeXNpY3Mgd2hlcmUgdG8gZGVidWcgdG8gYW5kIGhvdyBpdCB3aWxsIGJlIGhhbmRsZWRcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lIHRoZSBjdXJyZW50bHkgYWN0aXZlIFBoeXNpY3MgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXQgYWN0aXZlSW5zdGFuY2UoX3BoeXNpY3M6IFBoeXNpY3MpIHtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZSA9IF9waHlzaWNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgUGh5c2ljcyBpbnN0YW5jZSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgYWN0aXZlSW5zdGFuY2UoKTogUGh5c2ljcyB7XHJcbiAgICAgIHJldHVybiBQaHlzaWNzLsaSYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGRlYnVnRHJhdygpOiBQaHlzaWNzRGVidWdEcmF3IHtcclxuICAgICAgcmV0dXJuIFBoeXNpY3MuxpJhY3RpdmUuI2RlYnVnRHJhdztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IG1haW5DYW0oKTogQ29tcG9uZW50Q2FtZXJhIHtcclxuICAgICAgcmV0dXJuIFBoeXNpY3MuxpJhY3RpdmUuI21haW5DYW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENhc3QgYSBSQVkgaW50byB0aGUgcGh5c2ljYWwgd29ybGQgZnJvbSBhIG9yaWdpbiBwb2ludCBpbiBhIGNlcnRhaW4gZGlyZWN0aW9uLiBSZWNlaXZpbmcgaW5mb3JtYXRpb25zIGFib3V0IHRoZSBoaXQgb2JqZWN0IGFuZCB0aGVcclxuICAgICogaGl0IHBvaW50LiBEbyBub3Qgc3BlY2lmeSBhIF9ncm91cCB0byByYXljYXN0IHRoZSB3aG9sZSB3b3JsZCwgZWxzZSBvbmx5IGJvZGllcyB3aXRoaW4gdGhlIHNwZWNpZmljIGdyb3VwIGNhbiBiZSBoaXQuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByYXljYXN0KF9vcmlnaW46IFZlY3RvcjMsIF9kaXJlY3Rpb246IFZlY3RvcjMsIF9sZW5ndGg6IG51bWJlciA9IDEsIF9kZWJ1Z0RyYXc6IGJvb2xlYW4gPSBmYWxzZSwgX2dyb3VwOiBDT0xMSVNJT05fR1JPVVAgPSBDT0xMSVNJT05fR1JPVVAuREVGQVVMVCk6IFJheUhpdEluZm8ge1xyXG4gICAgICBsZXQgaGl0SW5mbzogUmF5SGl0SW5mbyA9IG5ldyBSYXlIaXRJbmZvKCk7XHJcbiAgICAgIGxldCByYXk6IE9JTU8uUmF5Q2FzdENsb3Nlc3QgPSBuZXcgT0lNTy5SYXlDYXN0Q2xvc2VzdCgpO1xyXG4gICAgICBsZXQgYmVnaW46IE9JTU8uVmVjMyA9IG5ldyBPSU1PLlZlYzMoX29yaWdpbi54LCBfb3JpZ2luLnksIF9vcmlnaW4ueik7XHJcbiAgICAgIGxldCBlbmQ6IE9JTU8uVmVjMyA9IHRoaXMuZ2V0UmF5RW5kUG9pbnQoYmVnaW4sIG5ldyBWZWN0b3IzKF9kaXJlY3Rpb24ueCwgX2RpcmVjdGlvbi55LCBfZGlyZWN0aW9uLnopLCBfbGVuZ3RoKTtcclxuICAgICAgcmF5LmNsZWFyKCk7XHJcbiAgICAgIGlmIChfZ3JvdXAgPT0gQ09MTElTSU9OX0dST1VQLkRFRkFVTFQpIHsgLy9DYXNlIDE6IFJheWNhc3RpbmcgdGhlIHdob2xlIHdvcmxkLCBub3JtYWwgbW9kZVxyXG4gICAgICAgIFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkLnJheUNhc3QoYmVnaW4sIGVuZCwgcmF5KTtcclxuICAgICAgfSBlbHNlIHsgLy9DYXNlMjogUmF5Y2FzdGluZyBvbiBlYWNoIGJvZHkgaW4gYSBzcGVjaWZpYyBncm91cFxyXG4gICAgICAgIGxldCBhbGxIaXRzOiBSYXlIaXRJbmZvW10gPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLmJvZHlMaXN0LmZvckVhY2goZnVuY3Rpb24gKF92YWx1ZTogQ29tcG9uZW50UmlnaWRib2R5KTogdm9pZCB7XHJcbiAgICAgICAgICBpZiAoX3ZhbHVlLmNvbGxpc2lvbkdyb3VwID09IF9ncm91cCkge1xyXG4gICAgICAgICAgICBoaXRJbmZvID0gX3ZhbHVlLnJheWNhc3RUaGlzQm9keShfb3JpZ2luLCBfZGlyZWN0aW9uLCBfbGVuZ3RoKTtcclxuICAgICAgICAgICAgaWYgKGhpdEluZm8uaGl0ID09IHRydWUpIHsgLy9FdmVyeSBoaXQgaXMgY291bGQgcG90ZW50aWFsbHkgYmUgdGhlIGNsb3Nlc3RcclxuICAgICAgICAgICAgICBhbGxIaXRzLnB1c2goaGl0SW5mbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBhbGxIaXRzLmZvckVhY2goZnVuY3Rpb24gKF92YWx1ZTogUmF5SGl0SW5mbyk6IHZvaWQgeyAvL2dldCB0aGUgY2xvc2VzdCBoaXRJbmZvXHJcbiAgICAgICAgICBpZiAoX3ZhbHVlLmhpdERpc3RhbmNlIDwgaGl0SW5mby5oaXREaXN0YW5jZSB8fCBoaXRJbmZvLmhpdCA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBoaXRJbmZvID0gX3ZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyYXkuaGl0KSB7IC8vRmlsbCBpbiBpbmZvcm1hdGlvbnMgb24gdGhlIGhpdFxyXG4gICAgICAgIGhpdEluZm8uaGl0ID0gdHJ1ZTtcclxuICAgICAgICBoaXRJbmZvLmhpdFBvaW50ID0gbmV3IFZlY3RvcjMocmF5LnBvc2l0aW9uLngsIHJheS5wb3NpdGlvbi55LCByYXkucG9zaXRpb24ueik7XHJcbiAgICAgICAgaGl0SW5mby5oaXROb3JtYWwgPSBuZXcgVmVjdG9yMyhyYXkubm9ybWFsLngsIHJheS5ub3JtYWwueSwgcmF5Lm5vcm1hbC56KTtcclxuICAgICAgICBoaXRJbmZvLmhpdERpc3RhbmNlID0gdGhpcy5nZXRSYXlEaXN0YW5jZShfb3JpZ2luLCBoaXRJbmZvLmhpdFBvaW50KTtcclxuICAgICAgICBoaXRJbmZvLnJpZ2lkYm9keUNvbXBvbmVudCA9IHJheS5zaGFwZS51c2VyRGF0YTtcclxuICAgICAgICBoaXRJbmZvLnJheUVuZCA9IG5ldyBWZWN0b3IzKGVuZC54LCBlbmQueSwgZW5kLnopO1xyXG4gICAgICAgIGhpdEluZm8ucmF5T3JpZ2luID0gX29yaWdpbjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBoaXRJbmZvLnJheU9yaWdpbiA9IF9vcmlnaW47XHJcbiAgICAgICAgaGl0SW5mby5oaXRQb2ludCA9IG5ldyBWZWN0b3IzKGVuZC54LCBlbmQueSwgZW5kLnopO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChfZGVidWdEcmF3KSB7IC8vSGFuZGxlIGRlYnVnZ2luZ1xyXG4gICAgICAgIFBoeXNpY3MuxpJhY3RpdmUuI2RlYnVnRHJhdy5kZWJ1Z1JheShoaXRJbmZvLnJheU9yaWdpbiwgaGl0SW5mby5oaXRQb2ludCwgbmV3IENvbG9yKDAsIDEsIDAsIDEpKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaGl0SW5mbztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFNpbXVsYXRlcyB0aGUgcGh5c2ljYWwgd29ybGQuIF9kZWx0YVRpbWUgaXMgdGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gcGh5c2ljYWwgc3RlcHMgaW4gc2Vjb25kcy4gRGVmYXVsdCBpcyB7QGxpbmsgTG9vcC50aW1lRnJhbWVHYW1lfSAvIDEwMDAgdG8gcnVuIGluIHN5bmMgd2l0aCB0aGUge0BsaW5rIExvb3B9LlxyXG4gICAgKiBUaGUgbWF4aW11bSB2YWx1ZSBpcyAxLzMwIG9mIGEgc2Vjb25kLCB0byBoYXZlIG1vcmUgY29uc2lzdGVudCBmcmFtZSBjYWxjdWxhdGlvbnMuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzaW11bGF0ZShfZGVsdGFUaW1lOiBudW1iZXIgPSBMb29wLnRpbWVGcmFtZUdhbWUgLyAxMDAwKTogdm9pZCB7XHJcbiAgICAgIGlmIChQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdC5sZW5ndGggPiAwKVxyXG4gICAgICAgIFBoeXNpY3MuY29ubmVjdEpvaW50cygpOyAvLyBDb25uZWN0IGpvaW50cyBpZiBhbnl0aGluZyBoYXMgaGFwcGVuZWQgYmV0d2VlbiB0aGUgbGFzdCBjYWxsIHRvIGFueSBvZiB0aGUgdHdvIHBhaXJlZCByaWdpZGJvZGllc1xyXG4gICAgICBpZiAoX2RlbHRhVGltZSA9PSAwKSAvLyBObyB0aW1lIHBhc3NlZCwgbm8gbmVlZCB0byB1cGRhdGUgdGhlIHBoeXNpY3Mgd29ybGRcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBfZGVsdGFUaW1lID0gX2RlbHRhVGltZSA+IDEgLyAzMCA/IDEgLyAzMCA6IF9kZWx0YVRpbWU7IC8vIElmIGluc3RlYWQgb2YgYSBmaXhlZCByYXRlIHRoZSBnYW1lIGZyYW1lcmF0ZSBpcyB1c2VkLCBtYWtlIHN1cmUgaXJyZWd1bGFyIHRpbWluZ3MgYXJlIGZpeGVkIHRvIDMwZnBzXHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkLnN0ZXAoX2RlbHRhVGltZSk7ICAvLyBVcGRhdGUgdGhlIHNpbXVsYXRpb24gYnkgdGhlIGdpdmVuIGRlbHRhVGltZVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW5zdGFuY2UgdXNpbmcgdGhlIHtAbGluayBDb21wb25lbnRDYW1lcmF9IGdpdmVuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhdyhfY21wQ2FtZXJhOiBDb21wb25lbnRDYW1lcmEsIF9tb2RlPzogUEhZU0lDU19ERUJVR01PREUpOiB2b2lkIHtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS4jZGVidWdEcmF3LnNldERlYnVnTW9kZShfbW9kZSk7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuI21haW5DYW0gPSBfY21wQ2FtZXJhO1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5kZWJ1Z0RyYXcoKTsgLy9GaWxsaW5nIHRoZSBwaHlzaWNzIHdvcmxkIGRlYnVnIGluZm9ybWF0aW9ucyBpbnRvIHRoZSBkZWJ1ZyByZW5kZXJpbmcgaGFuZGxlclxyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLiNkZWJ1Z0RyYXcuZHJhd0J1ZmZlcnMoKTtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS4jZGVidWdEcmF3LmNsZWFyQnVmZmVycygpOyAgLy9VcGRhdGVzIGluZm8gYWJvdXQgdGhlIGN1cnJlbnQgcHJvamVjdGlvbiwgcmVzZXR0aW5nIHRoZSBwb2ludHMvbGluZXMvdHJpYW5nbGVzIHRoYXQgbmVlZCB0byBiZSBkcmF3biBmcm9tIGRlYnVnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogQWRqdXN0cyB0aGUgdHJhbnNmb3JtcyBvZiB0aGUge0BsaW5rIENvbXBvbmVudFJpZ2lkYm9keX1zIGluIHRoZSBnaXZlbiBicmFuY2ggdG8gbWF0Y2ggdGhlaXIgbm9kZXMgb3IgbWVzaGVzXHJcbiAgICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkanVzdFRyYW5zZm9ybXMoX2JyYW5jaDogTm9kZSwgX3RvTWVzaDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlci5wcmVwYXJlKF9icmFuY2gsIHsgaWdub3JlUGh5c2ljczogdHJ1ZSB9KTtcclxuICAgICAgZm9yIChsZXQgbm9kZSBvZiBSZW5kZXIubm9kZXNQaHlzaWNzKVxyXG4gICAgICAgIG5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudFJpZ2lkYm9keSkuaW5pdGlhbGl6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBHZXQgdGhlIGFwcGxpZWQgZ3Jhdml0YXRpb25hbCBmb3JjZSBvZiB0aGUgYWN0aXZlIGluc3RhbmNlLiBEZWZhdWx0IGVhcnRoIGdyYXZpdHkgPSA5LjgxIG0vc1xyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0R3Jhdml0eSgpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IHRtcFZlYzogT0lNTy5WZWMzID0gUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuZ2V0R3Jhdml0eSgpO1xyXG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModG1wVmVjLngsIHRtcFZlYy55LCB0bXBWZWMueik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFNldCB0aGUgYXBwbGllZCBncmF2aXRhdGlvbmFsIGZvcmNlIG9mIHRoZSBhY3RpdmUgaW5zdGFuY2UuIERlZmF1bHQgZWFydGggZ3Jhdml0eSA9IDkuODEgbS9zXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXRHcmF2aXR5KF92YWx1ZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICBsZXQgdG1wVmVjOiBPSU1PLlZlYzMgPSBuZXcgT0lNTy5WZWMzKF92YWx1ZS54LCBfdmFsdWUueSwgX3ZhbHVlLnopO1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5zZXRHcmF2aXR5KHRtcFZlYyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFkZCBhIG5ldyBPSU1PIFJpZ2lkYm9keSB0byB0aGUgYWN0aXZlIGluc3RhbmNlLCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgYSBGVURHRSBSaWdpZGJvZHkgQ29tcG9uZW50LlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYWRkUmlnaWRib2R5KF9jbXBSQjogQ29tcG9uZW50UmlnaWRib2R5KTogdm9pZCB7XHJcbiAgICAgIFBoeXNpY3MuxpJhY3RpdmUuYm9keUxpc3QucHVzaChfY21wUkIpO1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5hZGRSaWdpZEJvZHkoX2NtcFJCLmdldE9pbW9SaWdpZGJvZHkoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFJlbW92ZSB0aGUgT0lNTyBSaWdpZGJvZHkgdG8gdGhlIGFjdGl2ZSBpbnN0YW5jZSwgaGFwcGVucyBhdXRvbWF0aWNhbGx5IHdoZW4gcmVtb3ZpbmcgYSBGVURHRSBSaWdpZGJvZHkgQ29tcG9uZW50XHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVSaWdpZGJvZHkoX2NtcFJCOiBDb21wb25lbnRSaWdpZGJvZHkpOiB2b2lkIHtcclxuICAgICAgLy8gVE9ETzogdHdvIGxpc3RzIGFyZSBiZWluZyBtYW5hZ2VkLCBpbmZvIG1pZ2h0IGRldmlhdGUuIENsZWFudXAhXHJcbiAgICAgIGxldCBvaW1vUmlnaWRCb2R5OiBPSU1PLlJpZ2lkQm9keSA9IF9jbXBSQi5nZXRPaW1vUmlnaWRib2R5KCk7XHJcbiAgICAgIGlmIChvaW1vUmlnaWRCb2R5Ll93b3JsZClcclxuICAgICAgICBvaW1vUmlnaWRCb2R5Ll93b3JsZC5yZW1vdmVSaWdpZEJvZHkob2ltb1JpZ2lkQm9keSk7XHJcbiAgICAgIC8vIHdoYXQgaWYgdGhlIHJpZ2lkYm9keXMgb2ltby13b3JsZCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGFjdGl2ZSBpbnN0YW5jZT9cclxuICAgICAgbGV0IGlkOiBudW1iZXIgPSBQaHlzaWNzLsaSYWN0aXZlLmJvZHlMaXN0LmluZGV4T2YoX2NtcFJCKTtcclxuICAgICAgaWYgKGlkID4gLTEpXHJcbiAgICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5ib2R5TGlzdC5zcGxpY2UoaWQsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBZGQgYSBuZXcgT0lNTyBKb2ludC9Db25zdHJhaW50IHRvIHRoZSBhY3RpdmUgaW5zdGFuY2UsIGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIGFkZGluZyBhIEZVREdFIEpvaW50IENvbXBvbmVudFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYWRkSm9pbnQoX2NtcEpvaW50OiBKb2ludCk6IHZvaWQge1xyXG4gICAgICBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZC5hZGRKb2ludChfY21wSm9pbnQuZ2V0T2ltb0pvaW50KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDYWxsZWQgaW50ZXJuYWxseSB0byBpbmZvcm0gdGhlIHBoeXNpY3Mgc3lzdGVtIHRoYXQgYSBqb2ludCBoYXMgYSBjaGFuZ2Ugb2YgY29yZSBwcm9wZXJ0aWVzIGFuZCBuZWVkcyB0byBiZSByZWNyZWF0ZWQuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjaGFuZ2VKb2ludFN0YXR1cyhfY21wSm9pbnQ6IEpvaW50KTogdm9pZCB7XHJcbiAgICAgIGlmIChQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdC5pbmRleE9mKF9jbXBKb2ludCkgPCAwKVxyXG4gICAgICAgIFBoeXNpY3MuxpJhY3RpdmUuam9pbnRMaXN0LnB1c2goX2NtcEpvaW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAgKiBSZW1vdmUgdGhlIE9JTU8gSm9pbnQvQ29uc3RyYWludCB0byB0aGUgYWN0aXZlIGluc3RhbmNlLCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiByZW1vdmluZyBhIEZVREdFIEpvaW50IENvbXBvbmVudFxyXG4gICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVKb2ludChfY21wSm9pbnQ6IEpvaW50KTogdm9pZCB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQucmVtb3ZlSm9pbnQoX2NtcEpvaW50LmdldE9pbW9Kb2ludCgpKTtcclxuICAgICAgfSBjYXRjaCAoX2Vycm9yOiB1bmtub3duKSB7XHJcbiAgICAgICAgRGVidWcuZnVkZ2UoX2Vycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXR1cm5zIGFsbCB0aGUgQ29tcG9uZW50UmlnaWRib2RpZXMgdGhhdCBhcmUga25vd24gdG8gdGhlIGFjdGl2ZSBpbnN0YW5jZS4gKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Qm9keUxpc3QoKTogQ29tcG9uZW50UmlnaWRib2R5W10ge1xyXG4gICAgICByZXR1cm4gUGh5c2ljcy7GkmFjdGl2ZS5ib2R5TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2l2aW5nIGEgQ29tcG9uZW50UmlnaWRib2R5IGEgc3BlY2lmaWMgaWRlbnRpZmljYXRpb24gbnVtYmVyIHNvIGl0IGNhbiBiZSByZWZlcmVuY2VkIGluIHRoZSBsb2FkaW5nIHByb2Nlc3MuIEFuZCByZW1vdmVkIHJiJ3MgY2FuIHJlY2VpdmUgYSBuZXcgaWQuICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRpc3RyaWJ1dGVCb2R5SUQoKTogbnVtYmVyIHtcclxuICAgICAgbGV0IGZyZWVJZDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGZyZWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5ib2R5TGlzdC5mb3JFYWNoKChfdmFsdWU6IENvbXBvbmVudFJpZ2lkYm9keSk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGlmIChfdmFsdWUuaWQgIT0gZnJlZUlkKSB7XHJcbiAgICAgICAgICBmcmVlID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZnJlZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWZyZWUpIHtcclxuICAgICAgICAgIGZyZWVJZCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gZnJlZUlkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIENvbm5lY3QgYWxsIGpvaW50cyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHlldC4gVXNlZCBpbnRlcm5hbGx5IG5vIHVzZXIgaW50ZXJhY3Rpb24gbmVlZGVkLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgY2FsbGVkIGFuZCBuZWVkZWQgdG8gbWFrZSBzdXJlIGpvaW50cyBjb25uZWN0L2Rpc2Nvbm5lY3RcclxuICAgICAqIGlmIGFueSBvZiB0aGUgdHdvIHBhaXJlZCBDb21wb25lbnRSaWdpZGJvZGllcyBjaGFuZ2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY29ubmVjdEpvaW50cygpOiB2b2lkIHsgLy9UcnkgdG8gY29ubmVjdCBkaXJ0eSBqb2ludHMgdW50aWwgdGhleSBhcmUgY29ubmVjdGVkXHJcbiAgICAgIGxldCBqb2ludHNUb0Nvbm5lY3Q6IEpvaW50W10gPSBQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdDtcclxuICAgICAgUGh5c2ljcy7GkmFjdGl2ZS5qb2ludExpc3QgPSBbXTtcclxuICAgICAgam9pbnRzVG9Db25uZWN0LmZvckVhY2goKF9qb2ludDogSm9pbnQpOiB2b2lkID0+IHtcclxuICAgICAgICBpZiAoX2pvaW50LmlzQ29ubmVjdGVkKCkgPT0gZmFsc2UpXHJcbiAgICAgICAgICBpZiAoX2pvaW50LmlzQWN0aXZlKVxyXG4gICAgICAgICAgICBfam9pbnQuY29ubmVjdCgpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdC5wdXNoKF9qb2ludCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZW1vdmUgYWxsIG9pbW8gam9pbnRzIGFuZCByaWdpZGJvZGllcywgc28gdGhhdCB0aGV5IGNhbiBiZSByZXVzZWQgaW4gYW5vdGhlciB3b3JsZCAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYW51cCgpOiB2b2lkIHtcclxuICAgICAgbGV0IG9pbW9Xb3JsZDogT0lNTy5Xb3JsZCA9IFBoeXNpY3MuxpJhY3RpdmUub2ltb1dvcmxkO1xyXG4gICAgICBpZiAob2ltb1dvcmxkICE9IG51bGwpIHtcclxuICAgICAgICAvL1Jlc2V0dGluZyB0aGUgd29ybGQgc28gYSBuZXcgd29ybGQgY2FuIGJlIGNyZWF0ZWQsIGZpeCBmb3IgcmUtb3BlbmluZyBhIHByb2plY3QgaW4gZWRpdG9yLCBtYWtpbmcgc3VyZSB0aGVyZSBhcmUgbm8gb2xkIHRoaW5ncyBjYWxjdWxhdGVkXHJcbiAgICAgICAgbGV0IGpvaW50c1dvcmxkOiBudW1iZXIgPSBvaW1vV29ybGQuZ2V0TnVtSm9pbnRzKCk7XHJcbiAgICAgICAgbGV0IGJvZGllc1dvcmxkOiBudW1iZXIgPSBvaW1vV29ybGQuZ2V0TnVtUmlnaWRCb2RpZXMoKTtcclxuICAgICAgICBmb3IgKGxldCBib2R5IG9mIFBoeXNpY3MuxpJhY3RpdmUuYm9keUxpc3QpXHJcbiAgICAgICAgICBib2R5LmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICBQaHlzaWNzLsaSYWN0aXZlLmpvaW50TGlzdCA9IG5ldyBBcnJheSgpOyAvLyBUT0RPOiBzZWUgaWYgaXQgd291bGQgYmUgc21hcnRlciwgZG8gdXNlIHRoZXNlIGFycmF5cy4gRGVmaW5pdGVseSBtb3JlIGludHVpdGl2ZS4uLlxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBqb2ludHNXb3JsZDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgb2ltb0pvaW50OiBPSU1PLkpvaW50ID0gUGh5c2ljcy7GkmFjdGl2ZS5vaW1vV29ybGQuZ2V0Sm9pbnRMaXN0KCk7XHJcbiAgICAgICAgICBvaW1vV29ybGQucmVtb3ZlSm9pbnQob2ltb0pvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGJvZGllc1dvcmxkOyBpKyspIHtcclxuICAgICAgICAgIGxldCBvaW1vQm9keTogT0lNTy5SaWdpZEJvZHkgPSBvaW1vV29ybGQuZ2V0UmlnaWRCb2R5TGlzdCgpO1xyXG4gICAgICAgICAgb2ltb1dvcmxkLnJlbW92ZVJpZ2lkQm9keShvaW1vQm9keSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLyoqIFJldHVybnMgdGhlIENvbXBvbmVudFJpZ2lkYm9keSB3aXRoIHRoZSBnaXZlbiBpZC4gVXNlZCBpbnRlcm5hbGx5IHRvIHJlY29ubmVjdCBqb2ludHMgb24gbG9hZGluZyBpbiB0aGUgZWRpdG9yLiAqL1xyXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgZ2V0Qm9keUJ5SUQoX2lkOiBudW1iZXIpOiBDb21wb25lbnRSaWdpZGJvZHkge1xyXG4gICAgLy8gICBsZXQgYm9keTogQ29tcG9uZW50UmlnaWRib2R5ID0gbnVsbDtcclxuICAgIC8vICAgUGh5c2ljcy4jYWN0aXZlUGh5c2ljcy5ib2R5TGlzdC5mb3JFYWNoKCh2YWx1ZTogQ29tcG9uZW50UmlnaWRib2R5KTogdm9pZCA9PiB7XHJcbiAgICAvLyAgICAgaWYgKHZhbHVlLmlkID09IF9pZCkge1xyXG4gICAgLy8gICAgICAgYm9keSA9IHZhbHVlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyAgIHJldHVybiBib2R5O1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGVuZHBvaW50IG9mIG1hdGhlbWF0aWNhbCByYXkuIEJ5IGFkZGluZyB0aGUgbXVsdGlwbGllZCBkaXJlY3Rpb24gdG8gdGhlIG9yaWdpbi4gXHJcbiAgICAgICAqIFVzZWQgYmVjYXVzZSBPaW1vUGh5c2ljcyBkZWZpbmVzIHJheSBieSBzdGFydC9lbmQuIEJ1dCBHYW1lRW5naW5lcyBjb21tb25seSB1c2Ugb3JpZ2luL2RpcmVjdGlvbi5cclxuICAgICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRSYXlFbmRQb2ludChfc3RhcnQ6IE9JTU8uVmVjMywgX2RpcmVjdGlvbjogVmVjdG9yMywgX2xlbmd0aDogbnVtYmVyKTogT0lNTy5WZWMzIHtcclxuICAgICAgbGV0IG9yaWdpbjogVmVjdG9yMyA9IFJlY3ljbGVyLmdldChWZWN0b3IzKTtcclxuICAgICAgb3JpZ2luLnNldChfc3RhcnQueCwgX3N0YXJ0LnksIF9zdGFydC56KTtcclxuICAgICAgbGV0IHNjYWxlZERpcmVjdGlvbjogVmVjdG9yMyA9IF9kaXJlY3Rpb24uY2xvbmU7XHJcbiAgICAgIHNjYWxlZERpcmVjdGlvbi5zY2FsZShfbGVuZ3RoKTtcclxuICAgICAgbGV0IGVuZHBvaW50OiBWZWN0b3IzID0gVmVjdG9yMy5TVU0oc2NhbGVkRGlyZWN0aW9uLCBvcmlnaW4pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShzY2FsZWREaXJlY3Rpb24pO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShlbmRwb2ludCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG9yaWdpbik7XHJcbiAgICAgIHJldHVybiBuZXcgT0lNTy5WZWMzKGVuZHBvaW50LngsIGVuZHBvaW50LnksIGVuZHBvaW50LnopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBnZXQgdGhlIGRpc3RhbmNlIGluIHdoaWNoIGEgcmF5IGhpdCBieSBzdWJ0cmFjdGluZyBwb2ludHMgZnJvbSBlYWNoIG90aGVyIGFuZCBnZXQgdGhlIHNxdWFyZSByb290IG9mIHRoZSBzcXVhcmVkIHByb2R1Y3Qgb2YgZWFjaCBjb21wb25lbnQuICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRSYXlEaXN0YW5jZShfb3JpZ2luOiBWZWN0b3IzLCBfaGl0UG9pbnQ6IFZlY3RvcjMpOiBudW1iZXIge1xyXG4gICAgICBsZXQgZHg6IG51bWJlciA9IF9vcmlnaW4ueCAtIF9oaXRQb2ludC54O1xyXG4gICAgICBsZXQgZHk6IG51bWJlciA9IF9vcmlnaW4ueSAtIF9oaXRQb2ludC55O1xyXG4gICAgICBsZXQgZHo6IG51bWJlciA9IF9vcmlnaW4ueiAtIF9oaXRQb2ludC56O1xyXG4gICAgICByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkeik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJldHVybnMgdGhlIGFjdHVhbCB1c2VkIHdvcmxkIG9mIHRoZSBPSU1PIHBoeXNpY3MgZW5naW5lLiBObyB1c2VyIGludGVyYWN0aW9uIG5lZWRlZCAtIE9ubHkgZm9yIGFkdmFuY2VkIHVzZXJzIHRoYXQgbmVlZCB0byBhY2Nlc3MgaXQgZGlyZWN0bHkgKi9cclxuICAgIHB1YmxpYyBnZXRPaW1vV29ybGQoKTogT0lNTy5Xb3JsZCB7XHJcbiAgICAgIHJldHVybiBQaHlzaWNzLsaSYWN0aXZlLm9pbW9Xb3JsZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyAvKiogVXBkYXRlcyBhbGwge0BsaW5rIFJpZ2lkYm9kaWVzfSBrbm93biB0byB0aGUgUGh5c2ljcy53b3JsZCB0byBtYXRjaCB0aGVpciBjb250YWluZXJzIG9yIG1lc2hlcyB0cmFuc2Zvcm1hdGlvbnMgKi9cclxuICAgIC8vIHByaXZhdGUgdXBkYXRlV29ybGRGcm9tV29ybGRNYXRyaXgoX3RvTWVzaDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAvLyAgIGZvciAobGV0IGJvZHkgb2YgdGhpcy5ib2R5TGlzdClcclxuICAgIC8vICAgICBib2R5LnVwZGF0ZUZyb21Xb3JsZChfdG9NZXNoKTtcclxuICAgIC8vIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBEZWZpbmVzIGEgdGhyZWVkaW1lbnNpb25hbCBib3ggYnkgdHdvIGNvcm5lci1wb2ludHMsIG9uZSB3aXRoIG1pbmltYWwgdmFsdWVzIGFuZCBvbmUgd2l0aCBtYXhpbXVtIHZhbHVlc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBCb3ggaW1wbGVtZW50cyBSZWN5Y2FibGUge1xyXG4gICAgcHVibGljIG1pbjogVmVjdG9yMztcclxuICAgIHB1YmxpYyBtYXg6IFZlY3RvcjM7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9taW46IFZlY3RvcjMgPSBWZWN0b3IzLk9ORShJbmZpbml0eSksIF9tYXg6IFZlY3RvcjMgPSBWZWN0b3IzLk9ORSgtSW5maW5pdHkpKSB7XHJcbiAgICAgIHRoaXMuc2V0KF9taW4sIF9tYXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lIHRoZSBjb3JuZXJzIG9mIHRoaXMgYm94LCBzdGFuZGFyZCB2YWx1ZXMgYXJlIEluZmluaXR5IGZvciBtaW4sIGFuZCAtSW5maW5pdHkgZm9yIG1heCwgXHJcbiAgICAgKiBjcmVhdGluZyBhbiBpbXBvc3NpYmxlIGludmVydGVkIGJveCB0aGF0IGNhbiBub3QgY29udGFpbiBhbnkgcG9pbnRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX21pbjogVmVjdG9yMyA9IFZlY3RvcjMuT05FKEluZmluaXR5KSwgX21heDogVmVjdG9yMyA9IFZlY3RvcjMuT05FKC1JbmZpbml0eSkpOiB2b2lkIHtcclxuICAgICAgdGhpcy5taW4gPSBfbWluO1xyXG4gICAgICB0aGlzLm1heCA9IF9tYXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFeHBhbmQgdGhlIGJveCBpZiBuZWNlc3NhcnkgdG8gaW5jbHVkZSB0aGUgZ2l2ZW4gcG9pbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGV4cGFuZChfaW5jbHVkZTogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgICB0aGlzLm1pbi5taW4oX2luY2x1ZGUpO1xyXG4gICAgICB0aGlzLm1heC5tYXgoX2luY2x1ZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWN5Y2xlKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLm1pbi5zZXQoSW5maW5pdHksIEluZmluaXR5LCBJbmZpbml0eSk7XHJcbiAgICAgIHRoaXMubWF4LnNldCgtSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5KTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBTdG9yZXMgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkge0BsaW5rIFJlbmRlcn0tcGlja2luZyBlLmcuIHVzaW5nIHtAbGluayBQaWNrZXJ9IGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBmdXJ0aGVyIGNhbGN1bGF0aW9uIG9mIHBvc2l0aW9ucyBhbmQgbm9ybWFscyBldGMuXHJcbiAgICogXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMjFcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgUGljayB7XHJcbiAgICBwdWJsaWMgbm9kZTogTm9kZTtcclxuICAgIHB1YmxpYyB6QnVmZmVyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgY29sb3I6IENvbG9yO1xyXG4gICAgcHVibGljIHRleHR1cmVVVjogVmVjdG9yMjtcclxuICAgIHB1YmxpYyBnaXptbz86IENvbXBvbmVudDtcclxuICAgICNtdHhWaWV3VG9Xb3JsZDogTWF0cml4NHg0O1xyXG4gICAgI3Bvc1dvcmxkOiBWZWN0b3IzO1xyXG4gICAgI3Bvc01lc2g6IFZlY3RvcjM7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9ub2RlOiBOb2RlKSB7XHJcbiAgICAgIHRoaXMubm9kZSA9IF9ub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWNjZXNzb3IgdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSB3b3JsZCBwb3NpdGlvbiBvZiBpbnRlcnNlY3Rpb24gb2Yge0BsaW5rIFJheX0gYW5kIHtAbGluayBNZXNofSBvbmx5IHdoZW4gdXNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwb3NXb3JsZCgpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKHRoaXMuI3Bvc1dvcmxkKVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNwb3NXb3JsZDtcclxuICAgICAgbGV0IHBvaW50SW5DbGlwU3BhY2U6IFZlY3RvcjMgPSBWZWN0b3IzLloodGhpcy56QnVmZmVyKTtcclxuICAgICAgbGV0IG06IEZsb2F0MzJBcnJheSA9IHRoaXMuI210eFZpZXdUb1dvcmxkLmdldCgpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IzID0gVmVjdG9yMy5UUkFOU0ZPUk1BVElPTihwb2ludEluQ2xpcFNwYWNlLCB0aGlzLiNtdHhWaWV3VG9Xb3JsZCwgdHJ1ZSk7XHJcbiAgICAgIGxldCB3OiBudW1iZXIgPSBtWzNdICogcG9pbnRJbkNsaXBTcGFjZS54ICsgbVs3XSAqIHBvaW50SW5DbGlwU3BhY2UueSArIG1bMTFdICogcG9pbnRJbkNsaXBTcGFjZS56ICsgbVsxNV07XHJcbiAgICAgIHJlc3VsdC5zY2FsZSgxIC8gdyk7XHJcblxyXG4gICAgICB0aGlzLiNwb3NXb3JsZCA9IHJlc3VsdDtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjY2Vzc29yIHRvIGNhbGN1bGF0ZSBhbmQgc3RvcmUgcG9zaXRpb24gaW4gbWVzaC1zcGFjZSBvZiBpbnRlcnNlY3Rpb24gb2Yge0BsaW5rIFJheX0gYW5kIHtAbGluayBNZXNofSBvbmx5IHdoZW4gdXNlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwb3NNZXNoKCk6IFZlY3RvcjMge1xyXG4gICAgICBpZiAodGhpcy4jcG9zTWVzaClcclxuICAgICAgICByZXR1cm4gdGhpcy4jcG9zTWVzaDtcclxuICAgICAgbGV0IG10eFdvcmxkVG9NZXNoOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuSU5WRVJTRSh0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpLm10eFdvcmxkKTtcclxuICAgICAgbGV0IHBvc01lc2g6IFZlY3RvcjMgPSBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKHRoaXMucG9zV29ybGQsIG10eFdvcmxkVG9NZXNoKTtcclxuICAgICAgdGhpcy4jcG9zTWVzaCA9IHBvc01lc2g7XHJcbiAgICAgIHJldHVybiBwb3NNZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWNjZXNzb3IgdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgZmFjZSBub3JtYWwgaW4gd29ybGQtc3BhY2UgYXQgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB7QGxpbmsgUmF5fSBhbmQge0BsaW5rIE1lc2h9IG9ubHkgd2hlbiB1c2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IG5vcm1hbCgpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBWZWN0b3IzO1xyXG5cclxuICAgICAgZm9yIChsZXQgZmFjZSBvZiBjbXBNZXNoLm1lc2guZmFjZXMpIHtcclxuICAgICAgICBpZiAoZmFjZS5pc0luc2lkZSh0aGlzLnBvc01lc2gpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBmYWNlLm5vcm1hbC5jbG9uZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmVzdWx0LnRyYW5zZm9ybShjbXBNZXNoLm10eFdvcmxkLCBmYWxzZSk7XHJcbiAgICAgIHJlc3VsdC5ub3JtYWxpemUoKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBzb2xlbHkgYnkgdGhlIHJlbmRlcmVyIHRvIGVuYWJsZSBjYWxjdWxhdGlvbiBvZiB0aGUgd29ybGQgY29vcmRpbmF0ZXMgb2YgdGhpcyB7QGxpbmsgUGlja31cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBtdHhWaWV3VG9Xb3JsZChfbXR4Vmlld1RvV29ybGQ6IE1hdHJpeDR4NCkge1xyXG4gICAgICB0aGlzLiNtdHhWaWV3VG9Xb3JsZCA9IF9tdHhWaWV3VG9Xb3JsZDtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICAvKipcclxuICAgKiBQcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgcGlja2luZyB1c2luZyB7QGxpbmsgUmVuZGVyfVxyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFBpY2tlciB7XHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgcmF5IHBsdXMgbWluIGFuZCBtYXggdmFsdWVzIGZvciB0aGUgbmVhciBhbmQgZmFyIHBsYW5lcyB0byBjb25zdHJ1Y3QgdGhlIHBpY2tlci1jYW1lcmEsXHJcbiAgICAgKiB0aGVuIHJlbmRlcnMgdGhlIHBpY2stdGV4dHVyZSBhbmQgcmV0dXJucyBhbiB1bnNvcnRlZCB7QGxpbmsgUGlja30tYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGl0cyBvZiB0aGUgcmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tSYXkoX25vZGVzOiBOb2RlW10sIF9yYXk6IFJheSwgX21pbjogbnVtYmVyLCBfbWF4OiBudW1iZXIsIF9waWNrR2l6bW9zOiBib29sZWFuID0gZmFsc2UsIF9naXptb3NGaWx0ZXI/OiBNYXA8c3RyaW5nLCBib29sZWFuPik6IFBpY2tbXSB7XHJcbiAgICAgIGxldCBjbXBDYW1lcmFQaWNrOiBDb21wb25lbnRDYW1lcmEgPSBuZXcgQ29tcG9uZW50Q2FtZXJhKCk7XHJcbiAgICAgIGNtcENhbWVyYVBpY2subXR4UGl2b3QudHJhbnNsYXRpb24gPSBfcmF5Lm9yaWdpbjtcclxuICAgICAgY21wQ2FtZXJhUGljay5tdHhQaXZvdC5sb29rQXQoVmVjdG9yMy5TVU0oX3JheS5vcmlnaW4sIF9yYXkuZGlyZWN0aW9uKSk7XHJcbiAgICAgIGNtcENhbWVyYVBpY2sucHJvamVjdENlbnRyYWwoMSwgMC4wMDEsIEZJRUxEX09GX1ZJRVcuRElBR09OQUwsIF9taW4sIF9tYXgpO1xyXG5cclxuICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBSZW5kZXIucGlja0JyYW5jaChfbm9kZXMsIGNtcENhbWVyYVBpY2ssIF9waWNrR2l6bW9zLCBfZ2l6bW9zRmlsdGVyKTtcclxuICAgICAgcmV0dXJuIHBpY2tzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBjYW1lcmEgYW5kIGEgcG9pbnQgb24gaXRzIHZpcnR1YWwgbm9ybWVkIHByb2plY3Rpb24gcGxhbmUgKGRpc3RhbmNlIDEpIHRvIGNvbnN0cnVjdCB0aGUgcGlja2VyLWNhbWVyYSxcclxuICAgICAqIHRoZW4gcmVuZGVycyB0aGUgcGljay10ZXh0dXJlIGFuZCByZXR1cm5zIGFuIHVuc29ydGVkIHtAbGluayBQaWNrfS1hcnJheSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBoaXRzIG9mIHRoZSByYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcGlja0NhbWVyYShfbm9kZXM6IE5vZGVbXSwgX2NtcENhbWVyYTogQ29tcG9uZW50Q2FtZXJhLCBfcG9zUHJvamVjdGlvbjogVmVjdG9yMiwgX3BpY2tHaXptb3M6IGJvb2xlYW4gPSBmYWxzZSwgX2dpem1vc0ZpbHRlcj86IE1hcDxzdHJpbmcsIGJvb2xlYW4+KTogUGlja1tdIHtcclxuICAgICAgbGV0IHJheTogUmF5ID0gbmV3IFJheShuZXcgVmVjdG9yMygtX3Bvc1Byb2plY3Rpb24ueCwgX3Bvc1Byb2plY3Rpb24ueSwgMSkpO1xyXG4gICAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSByYXkuZGlyZWN0aW9uLm1hZ25pdHVkZTtcclxuXHJcbiAgICAgIGlmIChfY21wQ2FtZXJhLm5vZGUpIHtcclxuICAgICAgICBsZXQgbXR4Q2FtZXJhOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVChfY21wQ2FtZXJhLm5vZGUubXR4V29ybGQsIF9jbXBDYW1lcmEubXR4UGl2b3QpO1xyXG4gICAgICAgIHJheS50cmFuc2Zvcm0obXR4Q2FtZXJhKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhDYW1lcmEpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICByYXkudHJhbnNmb3JtKF9jbXBDYW1lcmEubXR4UGl2b3QpO1xyXG5cclxuICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBQaWNrZXIucGlja1JheShfbm9kZXMsIHJheSwgbGVuZ3RoICogX2NtcENhbWVyYS5nZXROZWFyKCksIGxlbmd0aCAqIF9jbXBDYW1lcmEuZ2V0RmFyKCksIF9waWNrR2l6bW9zLCBfZ2l6bW9zRmlsdGVyKTtcclxuICAgICAgcmV0dXJuIHBpY2tzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgdGhlIGNhbWVyYSBvZiB0aGUgZ2l2ZW4gdmlld3BvcnQgYW5kIGEgcG9pbnQgdGhlIGNsaWVudCBzdXJmYWNlIHRvIGNvbnN0cnVjdCB0aGUgcGlja2VyLWNhbWVyYSxcclxuICAgICAqIHRoZW4gcmVuZGVycyB0aGUgcGljay10ZXh0dXJlIGFuZCByZXR1cm5zIGFuIHVuc29ydGVkIHtAbGluayBQaWNrfS1hcnJheSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBoaXRzIG9mIHRoZSByYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcGlja1ZpZXdwb3J0KF92aWV3cG9ydDogVmlld3BvcnQsIF9wb3NDbGllbnQ6IFZlY3RvcjIpOiBQaWNrW10ge1xyXG4gICAgICBsZXQgcG9zUHJvamVjdGlvbjogVmVjdG9yMiA9IF92aWV3cG9ydC5wb2ludENsaWVudFRvUHJvamVjdGlvbihfcG9zQ2xpZW50KTtcclxuICAgICAgbGV0IG5vZGVzOiBOb2RlW10gPSBBcnJheS5mcm9tKF92aWV3cG9ydC5nZXRCcmFuY2goKS5nZXRJdGVyYXRvcih0cnVlKSk7XHJcbiAgICAgIGxldCBwaWNrczogUGlja1tdID0gUGlja2VyLnBpY2tDYW1lcmEobm9kZXMsIF92aWV3cG9ydC5jYW1lcmEsIHBvc1Byb2plY3Rpb24sIF92aWV3cG9ydC5naXptb3NFbmFibGVkLCBfdmlld3BvcnQuZ2l6bW9zRmlsdGVyKTtcclxuICAgICAgcmV0dXJuIHBpY2tzO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERlZmluZWQgYnkgYW4gb3JpZ2luIGFuZCBhIGRpcmVjdGlvbiBvZiB0eXBlIHtAbGluayBQaWNrfSwgcmF5cyBhcmUgdXNlZCB0byBjYWxjdWxhdGUgcGlja2luZyBhbmQgaW50ZXJzZWN0aW9uc1xyXG4gICAqIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFJheSB7XHJcbiAgICBwdWJsaWMgb3JpZ2luOiBWZWN0b3IzO1xyXG4gICAgcHVibGljIGRpcmVjdGlvbjogVmVjdG9yMztcclxuICAgIC8qKiBUT0RPOiBzdXBwb3J0IGxlbmd0aCAqL1xyXG4gICAgcHVibGljIGxlbmd0aDogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfZGlyZWN0aW9uOiBWZWN0b3IzID0gVmVjdG9yMy5aKDEpLCBfb3JpZ2luOiBWZWN0b3IzID0gVmVjdG9yMy5aRVJPKCksIF9sZW5ndGg6IG51bWJlciA9IDEpIHtcclxuICAgICAgdGhpcy5vcmlnaW4gPSBfb3JpZ2luO1xyXG4gICAgICB0aGlzLmRpcmVjdGlvbiA9IF9kaXJlY3Rpb247XHJcbiAgICAgIHRoaXMubGVuZ3RoID0gX2xlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB0aGlzIHJheSB3aXRoIGEgcGxhbmUgZGVmaW5lZCBieSBcclxuICAgICAqIHRoZSBnaXZlbiBwb2ludCBvZiBvcmlnaW4gYW5kIHRoZSBwbGFuZXMgbm9ybWFsLiBBbGwgdmFsdWVzIGFuZCBjYWxjdWxhdGlvbnNcclxuICAgICAqIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZSBzeXN0ZW0sIHByZWZlcmFibHkgdGhlIHdvcmxkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnRlcnNlY3RQbGFuZShfb3JpZ2luOiBWZWN0b3IzLCBfbm9ybWFsOiBWZWN0b3IzKTogVmVjdG9yMyB7XHJcbiAgICAgIGxldCBkaWZmZXJlbmNlOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF9vcmlnaW4sIHRoaXMub3JpZ2luKTtcclxuICAgICAgbGV0IGZhY3RvcjogbnVtYmVyID0gVmVjdG9yMy5ET1QoZGlmZmVyZW5jZSwgX25vcm1hbCkgLyBWZWN0b3IzLkRPVCh0aGlzLmRpcmVjdGlvbiwgX25vcm1hbCk7XHJcbiAgICAgIGxldCBpbnRlcnNlY3Q6IFZlY3RvcjMgPSBWZWN0b3IzLlNVTSh0aGlzLm9yaWdpbiwgVmVjdG9yMy5TQ0FMRSh0aGlzLmRpcmVjdGlvbiwgZmFjdG9yKSk7XHJcbiAgICAgIHJldHVybiBpbnRlcnNlY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwb2ludCBvZiBpbnRlcnNlY3Rpb24gb2YgdGhpcyByYXkgd2l0aCBhIHBsYW5lIGRlZmluZWQgYnkgdGhlIGZhY2UuIFxyXG4gICAgICogQWxsIHZhbHVlcyBhbmQgY2FsY3VsYXRpb25zIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZSBzeXN0ZW0sIHByZWZlcmFibHkgdGhlIHdvcmxkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnRlcnNlY3RGYWNlUGxhbmUoX2ZhY2U6IEZhY2UpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJzZWN0UGxhbmUoX2ZhY2UuZ2V0UG9zaXRpb24oMCksIF9mYWNlLm5vcm1hbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzaG9ydGVzdCBkaXN0YW5jZSBmcm9tIHRoZSByYXkgdG8gdGhlIGdpdmVuIHRhcmdldCBwb2ludC5cclxuICAgICAqIEFsbCB2YWx1ZXMgYW5kIGNhbGN1bGF0aW9ucyBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoZSBzYW1lIGNvb3JkaW5hdGUgc3lzdGVtLCBwcmVmZXJhYmx5IHRoZSB3b3JsZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERpc3RhbmNlKF90YXJnZXQ6IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgbGV0IG9yaWdpblRvVGFyZ2V0OiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKF90YXJnZXQsIHRoaXMub3JpZ2luKTtcclxuICAgICAgbGV0IHJheVNlY3Rpb246IFZlY3RvcjMgPSBWZWN0b3IzLk5PUk1BTElaQVRJT04odGhpcy5kaXJlY3Rpb24sIDEpO1xyXG4gICAgICBsZXQgcHJvamVjdGVkTGVuZ3RoOiBudW1iZXIgPSBWZWN0b3IzLkRPVChvcmlnaW5Ub1RhcmdldCwgcmF5U2VjdGlvbik7XHJcbiAgICAgIHJheVNlY3Rpb24uc2NhbGUocHJvamVjdGVkTGVuZ3RoKTtcclxuICAgICAgcmF5U2VjdGlvbi5hZGQodGhpcy5vcmlnaW4pO1xyXG4gICAgICBsZXQgZGlzdGFuY2U6IFZlY3RvcjMgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoX3RhcmdldCwgcmF5U2VjdGlvbik7XHJcbiAgICAgIHJldHVybiBkaXN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybSB0aGUgcmF5IGJ5IHRoZSBnaXZlbiBtYXRyaXhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zZm9ybShfbXR4VHJhbnNmb3JtOiBNYXRyaXg0eDQpOiB2b2lkIHtcclxuICAgICAgdGhpcy5vcmlnaW4udHJhbnNmb3JtKF9tdHhUcmFuc2Zvcm0pO1xyXG4gICAgICB0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm0oX210eFRyYW5zZm9ybSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJlYWRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJheVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIGBvcmlnaW46ICR7dGhpcy5vcmlnaW4udG9TdHJpbmcoKX0sIGRpcmVjdGlvbjogJHt0aGlzLmRpcmVjdGlvbi50b1N0cmluZygpfSwgbGVuZ3RoOiAke3RoaXMubGVuZ3RoLnRvUHJlY2lzaW9uKDUpfWA7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBnaXptb3MgZHJhd2luZyBpbnRlcmZhY2UuIHtAbGluayBDb21wb25lbnR9cyBjYW4gdXNlIHRoaXMgdG8gZHJhdyB2aXN1YWwgYWlkcyBpbnNpZGUge0BsaW5rIENvbXBvbmVudC5kcmF3R2l6bW9zfSBhbmQge0BsaW5rIENvbXBvbmVudC5kcmF3R2l6bW9zU2VsZWN0ZWR9LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBHaXptb3Mge1xyXG4gICAgLyoqIFxyXG4gICAgICogVGhlIGRlZmF1bHQgb3BhY2l0eSBvZiBvY2NsdWRlZCBnaXptbyBwYXJ0cy4gVXNlIHRoaXMgdG8gY29udHJvbCB0aGUgdmlzaWJpbGl0eSBvZiBnaXptb3MgYmVoaW5kIG9iamVjdHMuXHJcbiAgICAgKiBTZXQgdG8gMCB0byBtYWtlIG9jY2x1ZGVkIGdpem1vIHBhcnRzIGRpc2FwcGVhci4gU2V0IHRvIDEgdG8gbWFrZSBvY2NsdWRlZCBnaXptbyBwYXJ0cyBmdWxseSB2aXNpYmxlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBhbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSAwLjM7IC8vIGN1cnJlbnRseSBnaXptb3MgY2FuIGFsd2F5cyBiZSBwaWNrZWQgZXZlbiBpZiB0aGlzIGlzIHNldCB0byAwLi4uXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGlja0lkOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwb3NJY29uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7IC8vIGNhY2hlIHRoZSBwb3NpdGlvbnMgb2YgaWNvbnMgdG8gYXZvaWQgZHJhd2luZyB0aGVtIHdpdGhpbiBlYWNoIG90aGVyXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYXJyYXlCdWZmZXI6IFdlYkdMQnVmZmVyID0gUmVuZGVyV2ViR0wuYXNzZXJ0KFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS5jcmVhdGVCdWZmZXIoKSk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbmRleEJ1ZmZlcjogV2ViR0xCdWZmZXIgPSBSZW5kZXJXZWJHTC5hc3NlcnQoUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLmNyZWF0ZUJ1ZmZlcigpKTtcclxuXHJcbiAgICBzdGF0aWMgI2NhbWVyYTogQ29tcG9uZW50Q2FtZXJhOyAvLyBUT0RPOiBtYXliZSByYXRoZXIgcGFzcyB0aGUgY2FtZXJhIGludG8gdGhlIGRyYXdHaXptb3MgbWV0aG9kcyBvbiBjb21wb25lbnRzP1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNhbWVyYSB3aGljaCBpcyBjdXJyZW50bHkgdXNlZCB0byBkcmF3IGdpem1vcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgY2FtZXJhKCk6IENvbXBvbmVudENhbWVyYSB7XHJcbiAgICAgIHJldHVybiBHaXptb3MuI2NhbWVyYTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgcXVhZCgpOiBNZXNoUXVhZCB7XHJcbiAgICAgIGxldCBxdWFkOiBNZXNoUXVhZCA9IG5ldyBNZXNoUXVhZChcIkdpem1vUXVhZFwiKTtcclxuICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKHF1YWQpO1xyXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KEdpem1vcywgXCJxdWFkXCIsIHsgdmFsdWU6IHF1YWQgfSk7XHJcbiAgICAgIHJldHVybiBHaXptb3MucXVhZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgY3ViZSgpOiBNZXNoQ3ViZSB7XHJcbiAgICAgIGxldCBjdWJlOiBNZXNoQ3ViZSA9IG5ldyBNZXNoQ3ViZShcIkdpem1vQ3ViZVwiKTtcclxuICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKGN1YmUpO1xyXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KEdpem1vcywgXCJjdWJlXCIsIHsgdmFsdWU6IGN1YmUgfSk7XHJcbiAgICAgIHJldHVybiBHaXptb3MuY3ViZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgc3BoZXJlKCk6IE1lc2hTcGhlcmUge1xyXG4gICAgICBsZXQgc3BoZXJlOiBNZXNoU3BoZXJlID0gbmV3IE1lc2hTcGhlcmUoXCJHaXptb1NwaGVyZVwiLCA2LCA2KTtcclxuICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKHNwaGVyZSk7XHJcbiAgICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoR2l6bW9zLCBcInNwaGVyZVwiLCB7IHZhbHVlOiBzcGhlcmUgfSk7XHJcbiAgICAgIHJldHVybiBHaXptb3Muc3BoZXJlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHRoaW5rIGFib3V0IGRyYXdpbmcgdGhlc2Ugb24gdGhlIGZseSBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlbS4gVGhlbiB3ZSBjb3VsZCBhY2NlcHQgYSBwb3NpdGlvbiwgcmFkaXVzIGV0Yy4gcGFyYW1ldGVyIGFuZCBkcmF3IHRoZW0gaW5kZXBlbmRlbnQgZnJvbSB0aGUgbXR4V29ybGRcclxuICAgIHByaXZhdGUgc3RhdGljIGdldCB3aXJlQ2lyY2xlKCk6IFZlY3RvcjNbXSB7XHJcbiAgICAgIGNvbnN0IHJhZGl1czogbnVtYmVyID0gMC41O1xyXG4gICAgICBjb25zdCBzZWdtZW50czogbnVtYmVyID0gNDU7XHJcbiAgICAgIGNvbnN0IGNpcmNsZTogVmVjdG9yM1tdID0gbmV3IEFycmF5KHNlZ21lbnRzKS5maWxsKG51bGwpLm1hcCgoKSA9PiBSZWN5Y2xlci5nZXQoVmVjdG9yMykpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc2VnbWVudHM7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGFuZ2xlOiBudW1iZXIgPSAoaSAvIHNlZ21lbnRzKSAqIDIgKiBNYXRoLlBJO1xyXG4gICAgICAgIGNvbnN0IHg6IG51bWJlciA9IHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKTtcclxuICAgICAgICBjb25zdCB5OiBudW1iZXIgPSByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSk7XHJcbiAgICAgICAgY2lyY2xlW2ldLnNldCh4LCB5LCAwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbGluZXM6IFZlY3RvcjNbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc2VnbWVudHM7IGkrKylcclxuICAgICAgICBsaW5lcy5wdXNoKGNpcmNsZVtpXSwgY2lyY2xlWyhpICsgMSkgJSBzZWdtZW50c10pO1xyXG5cclxuICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShHaXptb3MsIFwid2lyZUNpcmNsZVwiLCB7IHZhbHVlOiBsaW5lcyB9KTtcclxuICAgICAgcmV0dXJuIEdpem1vcy53aXJlQ2lyY2xlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCB3aXJlU3BoZXJlKCk6IFZlY3RvcjNbXSB7XHJcbiAgICAgIGxldCBsaW5lczogVmVjdG9yM1tdID0gR2l6bW9zLndpcmVDaXJjbGUuY29uY2F0KCk7XHJcbiAgICAgIGxldCBtdHhSb3RhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OX1goOTApO1xyXG4gICAgICBsaW5lcy5wdXNoKC4uLkdpem1vcy53aXJlQ2lyY2xlLm1hcCgoX3BvaW50OiBWZWN0b3IzKSA9PiBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF9wb2ludCwgbXR4Um90YXRpb24pKSk7XHJcbiAgICAgIG10eFJvdGF0aW9uLnJvdGF0ZVkoOTApO1xyXG4gICAgICBsaW5lcy5wdXNoKC4uLkdpem1vcy53aXJlQ2lyY2xlLm1hcCgoX3BvaW50OiBWZWN0b3IzKSA9PiBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF9wb2ludCwgbXR4Um90YXRpb24pKSk7XHJcblxyXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KEdpem1vcywgXCJ3aXJlU3BoZXJlXCIsIHsgdmFsdWU6IGxpbmVzIH0pO1xyXG4gICAgICByZXR1cm4gR2l6bW9zLndpcmVTcGhlcmU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0IHdpcmVDb25lKCk6IFZlY3RvcjNbXSB7XHJcbiAgICAgIGNvbnN0IHJhZGl1czogbnVtYmVyID0gMC41O1xyXG4gICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IDE7XHJcbiAgICAgIGNvbnN0IGFwZXg6IFZlY3RvcjMgPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgICAgY29uc3QgcXVhZDogVmVjdG9yM1tdID0gW1xyXG4gICAgICAgIG5ldyBWZWN0b3IzKHJhZGl1cywgMCwgaGVpZ2h0KSxcclxuICAgICAgICBuZXcgVmVjdG9yMygtcmFkaXVzLCAwLCBoZWlnaHQpLFxyXG4gICAgICAgIG5ldyBWZWN0b3IzKDAsIHJhZGl1cywgaGVpZ2h0KSxcclxuICAgICAgICBuZXcgVmVjdG9yMygwLCAtcmFkaXVzLCBoZWlnaHQpXHJcbiAgICAgIF07XHJcblxyXG4gICAgICBsZXQgbGluZXM6IFZlY3RvcjNbXSA9IEdpem1vcy53aXJlQ2lyY2xlLm1hcCgoX3BvaW50OiBWZWN0b3IzKSA9PiBWZWN0b3IzLlRSQU5TRk9STUFUSU9OKF9wb2ludCwgTWF0cml4NHg0LlRSQU5TTEFUSU9OKFZlY3RvcjMuWigxKSkpKTtcclxuXHJcbiAgICAgIGxpbmVzLnB1c2goLi4uW2FwZXgsIHF1YWRbMF0sIGFwZXgsIHF1YWRbMV0sIGFwZXgsIHF1YWRbMl0sIGFwZXgsIHF1YWRbM11dKTtcclxuXHJcbiAgICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoR2l6bW9zLCBcIndpcmVDb25lXCIsIHsgdmFsdWU6IGxpbmVzIH0pO1xyXG4gICAgICByZXR1cm4gR2l6bW9zLndpcmVDb25lO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCB3aXJlQ3ViZSgpOiBWZWN0b3IzW10ge1xyXG4gICAgICBjb25zdCBoYWxmU2l6ZTogbnVtYmVyID0gMC41O1xyXG4gICAgICBjb25zdCBjdWJlOiBWZWN0b3IzW10gPSBbXHJcbiAgICAgICAgbmV3IFZlY3RvcjMoaGFsZlNpemUsIGhhbGZTaXplLCBoYWxmU2l6ZSksIG5ldyBWZWN0b3IzKC1oYWxmU2l6ZSwgaGFsZlNpemUsIGhhbGZTaXplKSxcclxuICAgICAgICBuZXcgVmVjdG9yMygtaGFsZlNpemUsIC1oYWxmU2l6ZSwgaGFsZlNpemUpLCBuZXcgVmVjdG9yMyhoYWxmU2l6ZSwgLWhhbGZTaXplLCBoYWxmU2l6ZSksXHJcbiAgICAgICAgbmV3IFZlY3RvcjMoaGFsZlNpemUsIGhhbGZTaXplLCAtaGFsZlNpemUpLCBuZXcgVmVjdG9yMygtaGFsZlNpemUsIGhhbGZTaXplLCAtaGFsZlNpemUpLFxyXG4gICAgICAgIG5ldyBWZWN0b3IzKC1oYWxmU2l6ZSwgLWhhbGZTaXplLCAtaGFsZlNpemUpLCBuZXcgVmVjdG9yMyhoYWxmU2l6ZSwgLWhhbGZTaXplLCAtaGFsZlNpemUpXHJcbiAgICAgIF07XHJcblxyXG4gICAgICBjb25zdCBsaW5lczogVmVjdG9yM1tdID0gW1xyXG4gICAgICAgIGN1YmVbMF0sIGN1YmVbMV0sIGN1YmVbMV0sIGN1YmVbMl0sIGN1YmVbMl0sIGN1YmVbM10sIGN1YmVbM10sIGN1YmVbMF0sXHJcbiAgICAgICAgY3ViZVs0XSwgY3ViZVs1XSwgY3ViZVs1XSwgY3ViZVs2XSwgY3ViZVs2XSwgY3ViZVs3XSwgY3ViZVs3XSwgY3ViZVs0XSxcclxuICAgICAgICBjdWJlWzBdLCBjdWJlWzRdLCBjdWJlWzFdLCBjdWJlWzVdLCBjdWJlWzJdLCBjdWJlWzZdLCBjdWJlWzNdLCBjdWJlWzddXHJcbiAgICAgIF07XHJcblxyXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KEdpem1vcywgXCJ3aXJlQ3ViZVwiLCB7IHZhbHVlOiBsaW5lcyB9KTtcclxuICAgICAgcmV0dXJuIEdpem1vcy53aXJlQ3ViZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFyZSB3ZSBjdXJyZW50bHkgcmVuZGVyaW5nIGZvciBwaWNraW5nP1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgcGlja2luZygpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGlja0lkICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyB0aGUgc2NlbmUncyBnaXptb3MgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgZ2l2ZW4gdmlld3BvcnRzIGNhbWVyYS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXcoX3ZpZXdwb3J0OiBWaWV3cG9ydCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuI2NhbWVyYSA9IF92aWV3cG9ydC5jYW1lcmE7XHJcbiAgICAgIEdpem1vcy5wb3NJY29ucy5jbGVhcigpO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBnaXptbyBvZiBSZW5kZXIuZ2l6bW9zKVxyXG4gICAgICAgIFJlZmxlY3Quc2V0KGdpem1vLm5vZGUsIFwiekNhbWVyYVwiLCBfdmlld3BvcnQuY2FtZXJhLnBvaW50V29ybGRUb0NsaXAoZ2l6bW8ubm9kZS5tdHhXb3JsZC50cmFuc2xhdGlvbikueik7XHJcblxyXG4gICAgICBjb25zdCBzb3J0ZWQ6IENvbXBvbmVudFtdID0gUmVuZGVyLmdpem1vcy5nZXRTb3J0ZWQoKF9hLCBfYikgPT4gUmVmbGVjdC5nZXQoX2Iubm9kZSwgXCJ6Q2FtZXJhXCIpIC0gUmVmbGVjdC5nZXQoX2Eubm9kZSwgXCJ6Q2FtZXJhXCIpKTtcclxuICAgICAgZm9yIChjb25zdCBnaXptbyBvZiBzb3J0ZWQpIHtcclxuICAgICAgICBnaXptby5kcmF3R2l6bW9zPy4oKTtcclxuICAgICAgICBpZiAoX3ZpZXdwb3J0Lmdpem1vc1NlbGVjdGVkPy5pbmNsdWRlcyhnaXptby5ub2RlKSlcclxuICAgICAgICAgIGdpem1vLmRyYXdHaXptb3NTZWxlY3RlZD8uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2soX2dpem1vczogQ29tcG9uZW50W10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSwgX3BpY2tlZDogUGlja1tdKTogdm9pZCB7XHJcbiAgICAgIEdpem1vcy4jY2FtZXJhID0gX2NtcENhbWVyYTtcclxuICAgICAgR2l6bW9zLnBvc0ljb25zLmNsZWFyKCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBnaXptbyBvZiBfZ2l6bW9zKSB7XHJcbiAgICAgICAgR2l6bW9zLnBpY2tJZCA9IF9waWNrZWQubGVuZ3RoO1xyXG4gICAgICAgIGdpem1vLmRyYXdHaXptb3MoKTtcclxuICAgICAgICBsZXQgcGljazogUGljayA9IG5ldyBQaWNrKGdpem1vLm5vZGUpO1xyXG4gICAgICAgIHBpY2suZ2l6bW8gPSBnaXptbztcclxuICAgICAgICBfcGlja2VkLnB1c2gocGljayk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEdpem1vcy5waWNrSWQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSBjYW1lcmEgZnJ1c3R1bSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFRoZSBmcnVzdHVtIGlzIG9yaWVudGVkIGFsb25nIHRoZSB6LWF4aXMsIHdpdGggdGhlIHRpcCBvZiB0aGUgdHJ1bmNhdGVkIHB5cmFtaWQgYXQgdGhlIG9yaWdpbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3V2lyZUZydXN0dW0oX2FzcGVjdDogbnVtYmVyLCBfZm92OiBudW1iZXIsIF9uZWFyOiBudW1iZXIsIF9mYXI6IG51bWJlciwgX2RpcmVjdGlvbjogRklFTERfT0ZfVklFVywgX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBmOiBudW1iZXIgPSBNYXRoLnRhbihDYWxjLmRlZzJyYWQgKiBfZm92IC8gMik7XHJcblxyXG4gICAgICBsZXQgc2NhbGVYOiBudW1iZXIgPSBmO1xyXG4gICAgICBsZXQgc2NhbGVZOiBudW1iZXIgPSBmO1xyXG5cclxuICAgICAgc3dpdGNoIChfZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkhPUklaT05UQUw6XHJcbiAgICAgICAgICBzY2FsZVkgPSBmIC8gX2FzcGVjdDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRklFTERfT0ZfVklFVy5WRVJUSUNBTDpcclxuICAgICAgICAgIHNjYWxlWCA9IGYgKiBfYXNwZWN0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBGSUVMRF9PRl9WSUVXLkRJQUdPTkFMOlxyXG4gICAgICAgICAgY29uc3QgZGlhZ29uYWxBc3BlY3Q6IG51bWJlciA9IE1hdGguc3FydChfYXNwZWN0KTtcclxuICAgICAgICAgIHNjYWxlWCA9IGYgKiBkaWFnb25hbEFzcGVjdDtcclxuICAgICAgICAgIHNjYWxlWSA9IGYgLyBkaWFnb25hbEFzcGVjdDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBuZWFyWDogbnVtYmVyID0gX25lYXIgKiBzY2FsZVg7XHJcbiAgICAgIGNvbnN0IG5lYXJZOiBudW1iZXIgPSBfbmVhciAqIHNjYWxlWTtcclxuICAgICAgY29uc3QgZmFyWDogbnVtYmVyID0gX2ZhciAqIHNjYWxlWDtcclxuICAgICAgY29uc3QgZmFyWTogbnVtYmVyID0gX2ZhciAqIHNjYWxlWTtcclxuXHJcbiAgICAgIGNvbnN0IGZydXN0dW06IFZlY3RvcjNbXSA9IG5ldyBBcnJheSg4KS5maWxsKG51bGwpLm1hcCgoKSA9PiBSZWN5Y2xlci5nZXQoVmVjdG9yMykpO1xyXG5cclxuICAgICAgZnJ1c3R1bVswXS5zZXQoLW5lYXJYLCBuZWFyWSwgX25lYXIpO1xyXG4gICAgICBmcnVzdHVtWzFdLnNldChuZWFyWCwgbmVhclksIF9uZWFyKTtcclxuICAgICAgZnJ1c3R1bVsyXS5zZXQobmVhclgsIC1uZWFyWSwgX25lYXIpO1xyXG4gICAgICBmcnVzdHVtWzNdLnNldCgtbmVhclgsIC1uZWFyWSwgX25lYXIpO1xyXG5cclxuICAgICAgZnJ1c3R1bVs0XS5zZXQoLWZhclgsIGZhclksIF9mYXIpO1xyXG4gICAgICBmcnVzdHVtWzVdLnNldChmYXJYLCBmYXJZLCBfZmFyKTtcclxuICAgICAgZnJ1c3R1bVs2XS5zZXQoZmFyWCwgLWZhclksIF9mYXIpO1xyXG4gICAgICBmcnVzdHVtWzddLnNldCgtZmFyWCwgLWZhclksIF9mYXIpO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdMaW5lcyhbXHJcbiAgICAgICAgZnJ1c3R1bVswXSwgZnJ1c3R1bVsxXSwgZnJ1c3R1bVsxXSwgZnJ1c3R1bVsyXSwgZnJ1c3R1bVsyXSwgZnJ1c3R1bVszXSwgZnJ1c3R1bVszXSwgZnJ1c3R1bVswXSwgLy8gbmVhciBwbGFuZVxyXG4gICAgICAgIGZydXN0dW1bNF0sIGZydXN0dW1bNV0sIGZydXN0dW1bNV0sIGZydXN0dW1bNl0sIGZydXN0dW1bNl0sIGZydXN0dW1bN10sIGZydXN0dW1bN10sIGZydXN0dW1bNF0sIC8vIGZhciBwbGFuZVxyXG4gICAgICAgIGZydXN0dW1bMF0sIGZydXN0dW1bNF0sIGZydXN0dW1bMV0sIGZydXN0dW1bNV0sIGZydXN0dW1bMl0sIGZydXN0dW1bNl0sIGZydXN0dW1bM10sIGZydXN0dW1bN10gIC8vIHNpZGVzXHJcbiAgICAgIF0sIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZU11bHRpcGxlKC4uLmZydXN0dW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSB3aXJlZnJhbWUgY3ViZS4gVGhlIGN1YmUgaGFzIGEgc2lkZS1sZW5ndGggb2YgMSBhbmQgaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBvcmlnaW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVDdWJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdMaW5lcyhHaXptb3Mud2lyZUN1YmUsIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgYSB3aXJlZnJhbWUgc3BoZXJlLiBUaGUgc3BoZXJlIGhhcyBhIGRpYW1ldGVyIG9mIDEgYW5kIGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgb3JpZ2luLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdXaXJlU3BoZXJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBfbXR4V29ybGQuY2xvbmU7XHJcblxyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlU3BoZXJlLCBtdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICAgIG10eFdvcmxkLmxvb2tBdChHaXptb3MuI2NhbWVyYS5tdHhXb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgIEdpem1vcy5kcmF3V2lyZUNpcmNsZShtdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZShtdHhXb3JsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIGNvbmUgd2l0aCBhIGhlaWdodCBhbmQgZGlhbWV0ZXIgb2YgMS4gVGhlIGNvbmUgaXMgb3JpZW50ZWQgYWxvbmcgdGhlIHotYXhpcyB3aXRoIHRoZSB0aXAgYXQgdGhlIG9yaWdpbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3V2lyZUNvbmUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlQ29uZSwgX210eFdvcmxkLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgY2lyY2xlIHdpdGggYSBkaWFtZXRlciBvZiAxLiBUaGUgY2lyY2xlIGxpZXMgaW4gdGhlIHgteSBwbGFuZSwgd2l0aCBpdHMgY2VudGVyIGF0IHRoZSBvcmlnaW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVDaXJjbGUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd0xpbmVzKEdpem1vcy53aXJlQ2lyY2xlLCBfbXR4V29ybGQsIF9jb2xvciwgX2FscGhhT2NjbHVkZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgbGluZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgdGhlIGdpdmVuIHZlcnRpY2VzLiBcclxuICAgICAqIFZlcnRpY2VzIGFyZSBwYWlyZWQgc2VxdWVudGlhbGx5LCBzbyBmb3IgZXhhbXBsZSwgbGluZXMgd2lsbCBiZSBkcmF3biBiZXR3ZWVuIHZlcnRpY2VzIDAgYW5kIDEsIDIgYW5kIDMsIDQgYW5kIDUsIGV0Yy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3TGluZXMoX3ZlcnRpY2VzOiBWZWN0b3IzW10sIF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgY29uc3Qgc2hhZGVyOiB0eXBlb2YgU2hhZGVyID0gU2hhZGVyR2l6bW87XHJcbiAgICAgIHNoYWRlci51c2VQcm9ncmFtKCk7XHJcblxyXG4gICAgICBjb25zdCBsaW5lRGF0YTogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShfdmVydGljZXMubGVuZ3RoICogMyk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfdmVydGljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBwb2ludDogVmVjdG9yMyA9IF92ZXJ0aWNlc1tpXTtcclxuICAgICAgICBsaW5lRGF0YS5zZXQocG9pbnQuZ2V0KCksIGkgKiAzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgR2l6bW9zLmJ1ZmZlclBvc2l0aW9ucyhzaGFkZXIsIEdpem1vcy5hcnJheUJ1ZmZlcik7XHJcbiAgICAgIEdpem1vcy5idWZmZXJNYXRyaXgoc2hhZGVyLCBfbXR4V29ybGQpO1xyXG4gICAgICBjcmMzLmJ1ZmZlckRhdGEoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BUlJBWV9CVUZGRVIsIGxpbmVEYXRhLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkRZTkFNSUNfRFJBVyk7XHJcblxyXG4gICAgICBHaXptb3MuZHJhd0dpem1vcyhzaGFkZXIsIEdpem1vcy5kcmF3QXJyYXlzLCBfdmVydGljZXMubGVuZ3RoLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgd2lyZWZyYW1lIG1lc2guXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd1dpcmVNZXNoKF9tZXNoOiBNZXNoLCBfbXR4V29ybGQ6IE1hdHJpeDR4NCwgX2NvbG9yOiBDb2xvciwgX2FscGhhT2NjbHVkZWQ6IG51bWJlciA9IEdpem1vcy5hbHBoYU9jY2x1ZGVkKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IGNyYzM6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgPSBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCk7XHJcbiAgICAgIGNvbnN0IHNoYWRlcjogdHlwZW9mIFNoYWRlciA9IFNoYWRlckdpem1vO1xyXG4gICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgY29uc3QgcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycyA9IF9tZXNoLmdldFJlbmRlckJ1ZmZlcnMoKTtcclxuICAgICAgY29uc3QgcmVuZGVyTWVzaDogUmVuZGVyTWVzaCA9IF9tZXNoLnJlbmRlck1lc2g7IC8vIFRPRE86IGRvbid0IGJyZWFjaCBlbmNhcHN1bGF0aW9uIGhlcmUuLi5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJlbmRlck1lc2guaW5kaWNlcy5sZW5ndGg7IGkgKz0gMykgeyAvLyBUT0RPOiB0aGluayBhYm91dCBjYWNoaW5nIHRoaXMgaW4gdGhlIG1lc2hcclxuICAgICAgICBjb25zdCBhOiBudW1iZXIgPSByZW5kZXJNZXNoLmluZGljZXNbaV07XHJcbiAgICAgICAgY29uc3QgYjogbnVtYmVyID0gcmVuZGVyTWVzaC5pbmRpY2VzW2kgKyAxXTtcclxuICAgICAgICBjb25zdCBjOiBudW1iZXIgPSByZW5kZXJNZXNoLmluZGljZXNbaSArIDJdO1xyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIGxpbmUgc2VnbWVudHMgZm9yIHRoZSB0cmlhbmdsZSB0byB0aGUgbGluZSBpbmRpY2VzXHJcbiAgICAgICAgaW5kaWNlcy5wdXNoKGEsIGIsIGIsIGMsIGMsIGEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjcmMzLmJpbmRCdWZmZXIoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgR2l6bW9zLmluZGV4QnVmZmVyKTtcclxuICAgICAgY3JjMy5idWZmZXJEYXRhKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG5ldyBVaW50MTZBcnJheShpbmRpY2VzKSwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5EWU5BTUlDX0RSQVcpO1xyXG5cclxuICAgICAgR2l6bW9zLmJ1ZmZlclBvc2l0aW9ucyhzaGFkZXIsIHJlbmRlckJ1ZmZlcnMudmVydGljZXMpO1xyXG4gICAgICBHaXptb3MuYnVmZmVyTWF0cml4KHNoYWRlciwgX210eFdvcmxkKTtcclxuXHJcbiAgICAgIEdpem1vcy5kcmF3R2l6bW9zKHNoYWRlciwgR2l6bW9zLmRyYXdFbGVtZW50c0xpbmVzLCBpbmRpY2VzLmxlbmd0aCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIHNvbGlkIGN1YmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd0N1YmUoX210eFdvcmxkOiBNYXRyaXg0eDQsIF9jb2xvcjogQ29sb3IsIF9hbHBoYU9jY2x1ZGVkOiBudW1iZXIgPSBHaXptb3MuYWxwaGFPY2NsdWRlZCk6IHZvaWQge1xyXG4gICAgICBHaXptb3MuZHJhd01lc2goR2l6bW9zLmN1YmUsIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIHNvbGlkIHNwaGVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3U3BoZXJlKF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgR2l6bW9zLmRyYXdNZXNoKEdpem1vcy5zcGhlcmUsIF9tdHhXb3JsZCwgX2NvbG9yLCBfYWxwaGFPY2NsdWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIHNvbGlkIG1lc2guXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZHJhd01lc2goX21lc2g6IE1lc2gsIF9tdHhXb3JsZDogTWF0cml4NHg0LCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgY29uc3Qgc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UgPSBHaXptb3MucGlja2luZyA/IFNoYWRlclBpY2sgOiBTaGFkZXJHaXptbztcclxuICAgICAgc2hhZGVyLnVzZVByb2dyYW0oKTtcclxuXHJcbiAgICAgIGxldCByZW5kZXJCdWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gX21lc2gudXNlUmVuZGVyQnVmZmVycyhzaGFkZXIsIF9tdHhXb3JsZCwgTWF0cml4NHg0LlBST0RVQ1QoR2l6bW9zLiNjYW1lcmEubXR4V29ybGRUb1ZpZXcsIF9tdHhXb3JsZCksIEdpem1vcy5waWNrSWQpO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdHaXptb3Moc2hhZGVyLCBHaXptb3MuZHJhd0VsZW1lbnRzVHJpYW5sZ2VzLCByZW5kZXJCdWZmZXJzLm5JbmRpY2VzLCBfY29sb3IsIF9hbHBoYU9jY2x1ZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGFuIGljb24gZnJvbSBhIHtAbGluayBUZXh0dXJlfSBvbiBhIHtAbGluayBNZXNoUXVhZH0uIFRoZSBpY29uIGlzIGFmZmVjdGVkIGJ5IHRoZSBnaXZlbiB0cmFuc2Zvcm0gYW5kIGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRyYXdJY29uKF90ZXh0dXJlOiBUZXh0dXJlLCBfbXR4V29ybGQ6IE1hdHJpeDR4NCwgX2NvbG9yOiBDb2xvciwgX2FscGhhT2NjbHVkZWQ6IG51bWJlciA9IEdpem1vcy5hbHBoYU9jY2x1ZGVkKTogdm9pZCB7XHJcbiAgICAgIGxldCBwb3NpdGlvbjogc3RyaW5nID0gX210eFdvcmxkLnRyYW5zbGF0aW9uLnRvU3RyaW5nKCk7XHJcbiAgICAgIGlmIChHaXptb3MucG9zSWNvbnMuaGFzKHBvc2l0aW9uKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIEdpem1vcy5wb3NJY29ucy5hZGQocG9zaXRpb24pO1xyXG5cclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuXHJcbiAgICAgIGNvbnN0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlID0gR2l6bW9zLnBpY2tpbmcgPyBTaGFkZXJQaWNrVGV4dHVyZWQgOiBTaGFkZXJHaXptb1RleHR1cmVkO1xyXG4gICAgICBzaGFkZXIudXNlUHJvZ3JhbSgpO1xyXG5cclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSBfbXR4V29ybGQuY2xvbmU7XHJcbiAgICAgIGxldCBjb2xvcjogQ29sb3IgPSBfY29sb3IuY2xvbmU7XHJcblxyXG4gICAgICBsZXQgYmFjazogVmVjdG9yMyA9IEdpem1vcy4jY2FtZXJhLm10eFdvcmxkLmZvcndhcmQubmVnYXRlKCk7XHJcbiAgICAgIGxldCB1cDogVmVjdG9yMyA9IEdpem1vcy4jY2FtZXJhLm10eFdvcmxkLnVwO1xyXG4gICAgICBtdHhXb3JsZC5sb29rSW4oYmFjaywgdXApO1xyXG5cclxuICAgICAgbGV0IGRpc3RhbmNlOiBudW1iZXIgPSBWZWN0b3IzLkRJRkZFUkVOQ0UoR2l6bW9zLiNjYW1lcmEubXR4V29ybGQudHJhbnNsYXRpb24sIG10eFdvcmxkLnRyYW5zbGF0aW9uKS5tYWduaXR1ZGU7XHJcbiAgICAgIGxldCBmYWRlRmFyOiBudW1iZXIgPSA0O1xyXG4gICAgICBsZXQgZmFkZU5lYXI6IG51bWJlciA9IDEuNTtcclxuICAgICAgaWYgKGRpc3RhbmNlID4gMCAmJiBkaXN0YW5jZSA8IGZhZGVGYXIpIHtcclxuICAgICAgICBkaXN0YW5jZSA9IChkaXN0YW5jZSAtIGZhZGVOZWFyKSAvIChmYWRlRmFyIC0gZmFkZU5lYXIpO1xyXG4gICAgICAgIGNvbG9yLmEgPSBDYWxjLmxlcnAoMCwgY29sb3IuYSwgZGlzdGFuY2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcmVuZGVyQnVmZmVyczogUmVuZGVyQnVmZmVycyA9IEdpem1vcy5xdWFkLnVzZVJlbmRlckJ1ZmZlcnMoc2hhZGVyLCBtdHhXb3JsZCwgTWF0cml4NHg0LlBST0RVQ1QoR2l6bW9zLiNjYW1lcmEubXR4V29ybGRUb1ZpZXcsIG10eFdvcmxkKSwgR2l6bW9zLnBpY2tJZCk7XHJcbiAgICAgIF90ZXh0dXJlLnVzZVJlbmRlckRhdGEoVEVYVFVSRV9MT0NBVElPTi5DT0xPUi5VTklUKTtcclxuICAgICAgY3JjMy51bmlmb3JtMWkoc2hhZGVyLnVuaWZvcm1zW1RFWFRVUkVfTE9DQVRJT04uQ09MT1IuVU5JRk9STV0sIFRFWFRVUkVfTE9DQVRJT04uQ09MT1IuSU5ERVgpO1xyXG5cclxuICAgICAgR2l6bW9zLmRyYXdHaXptb3Moc2hhZGVyLCBHaXptb3MuZHJhd0VsZW1lbnRzVHJpYW5sZ2VzLCByZW5kZXJCdWZmZXJzLm5JbmRpY2VzLCBjb2xvciwgX2FscGhhT2NjbHVkZWQpO1xyXG5cclxuICAgICAgUmVjeWNsZXIuc3RvcmVNdWx0aXBsZShtdHhXb3JsZCwgY29sb3IsIGJhY2ssIHVwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBidWZmZXJQb3NpdGlvbnMoX3NoYWRlcjogU2hhZGVySW50ZXJmYWNlLCBfYnVmZmVyOiBXZWJHTEJ1ZmZlcik6IHZvaWQge1xyXG4gICAgICBjb25zdCBjcmMzOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ID0gUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpO1xyXG5cclxuICAgICAgY3JjMy5iaW5kQnVmZmVyKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQVJSQVlfQlVGRkVSLCBfYnVmZmVyKTtcclxuICAgICAgbGV0IGF0dHJpYnV0ZTogbnVtYmVyID0gX3NoYWRlci5hdHRyaWJ1dGVzW1wiYV92Y3RQb3NpdGlvblwiXTtcclxuICAgICAgY3JjMy5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShhdHRyaWJ1dGUpO1xyXG4gICAgICBjcmMzLnZlcnRleEF0dHJpYlBvaW50ZXIoYXR0cmlidXRlLCAzLCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkZMT0FULCBmYWxzZSwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVmZmVyQ29sb3IoX3NoYWRlcjogU2hhZGVySW50ZXJmYWNlLCBfY29sb3I6IENvbG9yKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS51bmlmb3JtNGZ2KF9zaGFkZXIudW5pZm9ybXNbXCJ1X3ZjdENvbG9yXCJdLCBfY29sb3IuZ2V0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGJ1ZmZlck1hdHJpeChfc2hhZGVyOiBTaGFkZXJJbnRlcmZhY2UsIF9tdHhXb3JsZDogTWF0cml4NHg0KTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IG10eE1lc2hUb1ZpZXc6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKEdpem1vcy4jY2FtZXJhLm10eFdvcmxkVG9WaWV3LCBfbXR4V29ybGQpO1xyXG4gICAgICBSZW5kZXJXZWJHTC5nZXRSZW5kZXJpbmdDb250ZXh0KCkudW5pZm9ybU1hdHJpeDRmdihfc2hhZGVyLnVuaWZvcm1zW1widV9tdHhNZXNoVG9WaWV3XCJdLCBmYWxzZSwgbXR4TWVzaFRvVmlldy5nZXQoKSk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eE1lc2hUb1ZpZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGRyYXdHaXptb3MoX3NoYWRlcjogU2hhZGVySW50ZXJmYWNlLCBfZHJhdzogRnVuY3Rpb24sIF9jb3VudDogbnVtYmVyLCBfY29sb3I6IENvbG9yLCBfYWxwaGFPY2NsdWRlZDogbnVtYmVyID0gR2l6bW9zLmFscGhhT2NjbHVkZWQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgY3JjMzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCA9IFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKTtcclxuICAgICAgbGV0IGNvbG9yOiBDb2xvciA9IF9jb2xvci5jbG9uZTtcclxuICAgICAgR2l6bW9zLmJ1ZmZlckNvbG9yKF9zaGFkZXIsIGNvbG9yKTtcclxuXHJcbiAgICAgIC8vIHN0ZW5jaWwgc3R1ZmYgaXMgZm9yIHNlbWktdHJhbnNwYXJlbnQgZ2l6bW9zIHRvIGhhdmUgY29ycmVjdCBzZWxmIG9jY2x1c2lvblxyXG4gICAgICAvLyBmaXJzdCBkcmF3IHRoZSBnaXptbyBvcGFxdWUgd2l0aCBkZXB0aCB0ZXN0IGFuZCBzZXQgZHJhd24gcGl4ZWxzIHRvIDEgaW4gc3RlbmNpbCBidWZmZXJcclxuICAgICAgY3JjMy5jbGVhcihXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlNURU5DSUxfQlVGRkVSX0JJVCk7XHJcbiAgICAgIGNyYzMuc3RlbmNpbEZ1bmMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5BTFdBWVMsIDEsIDB4RkYpO1xyXG4gICAgICBjcmMzLnN0ZW5jaWxPcChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LktFRVAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuS0VFUCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SRVBMQUNFKTtcclxuICAgICAgY3JjMy5lbmFibGUoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5TVEVOQ0lMX1RFU1QpO1xyXG4gICAgICBfZHJhdyhfY291bnQpO1xyXG5cclxuICAgICAgLy8gdGhlbiBkcmF3IHRoZSBnaXptbyBhZ2FpbiB3aXRoIHJlZHVjZWQgYWxwaGEgYW5kIHdpdGhvdXQgZGVwdGggdGVzdCB3aGVyZSBzdGVuY2lsIGJ1ZmZlciBpcyAwXHJcbiAgICAgIGNvbG9yLmEgKj0gX2FscGhhT2NjbHVkZWQ7XHJcbiAgICAgIEdpem1vcy5idWZmZXJDb2xvcihfc2hhZGVyLCBjb2xvcik7XHJcblxyXG4gICAgICBjcmMzLnN0ZW5jaWxGdW5jKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuRVFVQUwsIDAsIDB4RkYpO1xyXG4gICAgICBjcmMzLnN0ZW5jaWxPcChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LktFRVAsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuS0VFUCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5LRUVQKTtcclxuICAgICAgUmVuZGVyLnNldERlcHRoVGVzdChmYWxzZSk7XHJcbiAgICAgIF9kcmF3KF9jb3VudCk7XHJcbiAgICAgIFJlbmRlci5zZXREZXB0aFRlc3QodHJ1ZSk7XHJcbiAgICAgIGNyYzMuZGlzYWJsZShXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlNURU5DSUxfVEVTVCk7XHJcblxyXG4gICAgICBSZWN5Y2xlci5zdG9yZShjb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZHJhd0VsZW1lbnRzVHJpYW5sZ2VzKF9jb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIFJlbmRlcldlYkdMLmdldFJlbmRlcmluZ0NvbnRleHQoKS5kcmF3RWxlbWVudHMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5UUklBTkdMRVMsIF9jb3VudCwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5VTlNJR05FRF9TSE9SVCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZHJhd0VsZW1lbnRzTGluZXMoX2NvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLmRyYXdFbGVtZW50cyhXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVTLCBfY291bnQsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuVU5TSUdORURfU0hPUlQsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGRyYXdBcnJheXMoX2NvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgUmVuZGVyV2ViR0wuZ2V0UmVuZGVyaW5nQ29udGV4dCgpLmRyYXdBcnJheXMoV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FUywgMCwgX2NvdW50KTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgdHlwZSBNYXBMaWdodFR5cGVUb0xpZ2h0TGlzdCA9IE1hcDxUeXBlT2ZMaWdodCwgUmVjeWNhYmxlQXJyYXk8Q29tcG9uZW50TGlnaHQ+PjtcclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQcmVwYXJlT3B0aW9ucyB7XHJcbiAgICBpZ25vcmVQaHlzaWNzPzogYm9vbGVhbjtcclxuICAgIGdpem1vc0VuYWJsZWQ/OiBib29sZWFuO1xyXG4gICAgZ2l6bW9zRmlsdGVyPzogTWFwPHN0cmluZywgYm9vbGVhbj47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbWFpbiBpbnRlcmZhY2UgdG8gdGhlIHJlbmRlciBlbmdpbmUsIGhlcmUgV2ViR0wgKHNlZSBzdXBlcmNsYXNzIHtAbGluayBSZW5kZXJXZWJHTH0gYW5kIHRoZSBSZW5kZXJJbmplY3RvcnNcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVuZGVyIGV4dGVuZHMgUmVuZGVyV2ViR0wge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWN0Q2xpcDogUmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgtMSwgMSwgMiwgLTIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBwaWNrQnVmZmVyOiBJbnQzMkFycmF5OyAgIC8vIFRPRE86IHJlc2VhcmNoIGlmIHBpY2tpbmcgc2hvdWxkIGJlIG9wdGltaXplZCB1c2luZyByYWRpdXMgcGlja2luZyB0byBmaWx0ZXJcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbm9kZXNQaHlzaWNzOiBSZWN5Y2FibGVBcnJheTxOb2RlPiA9IG5ldyBSZWN5Y2FibGVBcnJheSgpO1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb21wb25lbnRzUGljazogUmVjeWNhYmxlQXJyYXk8Q29tcG9uZW50UGljaz4gPSBuZXcgUmVjeWNhYmxlQXJyYXkoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbGlnaHRzOiBNYXBMaWdodFR5cGVUb0xpZ2h0TGlzdCA9IG5ldyBNYXAoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZ2l6bW9zOiBSZWN5Y2FibGVBcnJheTxDb21wb25lbnQ+ID0gbmV3IFJlY3ljYWJsZUFycmF5KCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBub2Rlc1NpbXBsZTogUmVjeWNhYmxlQXJyYXk8Tm9kZT4gPSBuZXcgUmVjeWNhYmxlQXJyYXkoKTtcclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IG5vZGVzQWxwaGE6IFJlY3ljYWJsZUFycmF5PE5vZGU+ID0gbmV3IFJlY3ljYWJsZUFycmF5KCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjb21wb25lbnRzU2tlbGV0b246IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudFNrZWxldG9uPiA9IG5ldyBSZWN5Y2FibGVBcnJheSgpO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGltZXN0YW1wVXBkYXRlOiBudW1iZXI7XHJcblxyXG4gICAgLy8jcmVnaW9uIFByZXBhcmVcclxuICAgIC8qKlxyXG4gICAgICogUmVjdXJzaXZlbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYnJhbmNoIHN0YXJ0aW5nIHdpdGggdGhlIG5vZGUgZ2l2ZW4sIHJlY2FsY3VsYXRlcyBhbGwgd29ybGQgdHJhbnNmb3JtcywgXHJcbiAgICAgKiBjb2xsZWN0cyBhbGwgbGlnaHRzIGFuZCBmZWVkcyBhbGwgc2hhZGVycyB1c2VkIGluIHRoZSBncmFwaCB3aXRoIHRoZXNlIGxpZ2h0cy4gU29ydHMgbm9kZXMgZm9yIGRpZmZlcmVudFxyXG4gICAgICogcmVuZGVyIHBhc3Nlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBwcmVwYXJlKF9icmFuY2g6IE5vZGUsIF9vcHRpb25zOiBSZW5kZXJQcmVwYXJlT3B0aW9ucyA9IHt9LCBfbXR4V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpLCBfc2hhZGVyc1VzZWQ6IChTaGFkZXJJbnRlcmZhY2UpW10gPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIGxldCBmaXJzdExldmVsOiBib29sZWFuID0gKF9zaGFkZXJzVXNlZCA9PSBudWxsKTtcclxuICAgICAgaWYgKGZpcnN0TGV2ZWwpIHtcclxuICAgICAgICBfc2hhZGVyc1VzZWQgPSBbXTtcclxuICAgICAgICBSZW5kZXIudGltZXN0YW1wVXBkYXRlID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgICAgUmVuZGVyLm5vZGVzU2ltcGxlLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLm5vZGVzQWxwaGEucmVzZXQoKTtcclxuICAgICAgICBSZW5kZXIubm9kZXNQaHlzaWNzLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLmNvbXBvbmVudHNQaWNrLnJlc2V0KCk7XHJcbiAgICAgICAgUmVuZGVyLmNvbXBvbmVudHNTa2VsZXRvbi5yZXNldCgpO1xyXG4gICAgICAgIFJlbmRlci5saWdodHMuZm9yRWFjaChfYXJyYXkgPT4gX2FycmF5LnJlc2V0KCkpO1xyXG4gICAgICAgIGlmIChfb3B0aW9ucz8uZ2l6bW9zRW5hYmxlZClcclxuICAgICAgICAgIFJlbmRlci5naXptb3MucmVzZXQoKTtcclxuICAgICAgICBfYnJhbmNoLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULlJFTkRFUl9QUkVQQVJFX1NUQVJUKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghX2JyYW5jaC5pc0FjdGl2ZSlcclxuICAgICAgICByZXR1cm47IC8vIGRvbid0IGFkZCBicmFuY2ggdG8gcmVuZGVyIGxpc3QgaWYgbm90IGFjdGl2ZVxyXG5cclxuICAgICAgX2JyYW5jaC5uTm9kZXNJbkJyYW5jaCA9IDE7XHJcbiAgICAgIF9icmFuY2gucmFkaXVzID0gMDtcclxuXHJcbiAgICAgIF9icmFuY2guZGlzcGF0Y2hFdmVudFRvVGFyZ2V0T25seShuZXcgRXZlbnQoRVZFTlQuUkVOREVSX1BSRVBBUkUpKTtcclxuICAgICAgX2JyYW5jaC50aW1lc3RhbXBVcGRhdGUgPSBSZW5kZXIudGltZXN0YW1wVXBkYXRlO1xyXG5cclxuICAgICAgaWYgKF9icmFuY2guY21wVHJhbnNmb3JtICYmIF9icmFuY2guY21wVHJhbnNmb3JtLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgbGV0IG10eFdvcmxkQnJhbmNoOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUFJPRFVDVChfbXR4V29ybGQsIF9icmFuY2guY21wVHJhbnNmb3JtLm10eExvY2FsKTtcclxuICAgICAgICBfYnJhbmNoLm10eFdvcmxkLmNvcHkobXR4V29ybGRCcmFuY2gpO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFdvcmxkQnJhbmNoKTtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgX2JyYW5jaC5tdHhXb3JsZC5jb3B5KF9tdHhXb3JsZCk7IC8vIG92ZXJ3cml0ZSByZWFkb25seSBtdHhXb3JsZCBvZiB0aGUgY3VycmVudCBub2RlXHJcblxyXG4gICAgICBsZXQgY21wUmlnaWRib2R5OiBDb21wb25lbnRSaWdpZGJvZHkgPSBfYnJhbmNoLmdldENvbXBvbmVudChDb21wb25lbnRSaWdpZGJvZHkpO1xyXG4gICAgICBpZiAoY21wUmlnaWRib2R5ICYmIGNtcFJpZ2lkYm9keS5pc0FjdGl2ZSkgeyAvL1RPRE86IHN1cHBvcnQgZGUtL2FjdGl2YXRpb24gdGhyb3VnaG91dFxyXG4gICAgICAgIFJlbmRlci5ub2Rlc1BoeXNpY3MucHVzaChfYnJhbmNoKTsgLy8gYWRkIHRoaXMgbm9kZSB0byBwaHlzaWNzIGxpc3RcclxuICAgICAgICBpZiAoIV9vcHRpb25zPy5pZ25vcmVQaHlzaWNzKVxyXG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1CeVBoeXNpY3MoX2JyYW5jaCwgY21wUmlnaWRib2R5KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGNtcFBpY2s6IENvbXBvbmVudFBpY2sgPSBfYnJhbmNoLmdldENvbXBvbmVudChDb21wb25lbnRQaWNrKTtcclxuICAgICAgaWYgKGNtcFBpY2sgJiYgY21wUGljay5pc0FjdGl2ZSkge1xyXG4gICAgICAgIFJlbmRlci5jb21wb25lbnRzUGljay5wdXNoKGNtcFBpY2spOyAvLyBhZGQgdGhpcyBjb21wb25lbnQgdG8gcGljayBsaXN0XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjbXBMaWdodHM6IENvbXBvbmVudExpZ2h0W10gPSBfYnJhbmNoLmdldENvbXBvbmVudHMoQ29tcG9uZW50TGlnaHQpO1xyXG4gICAgICBSZW5kZXIuYWRkTGlnaHRzKGNtcExpZ2h0cyk7XHJcblxyXG4gICAgICBsZXQgY21wTWVzaDogQ29tcG9uZW50TWVzaCA9IF9icmFuY2guZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICBsZXQgY21wTWF0ZXJpYWw6IENvbXBvbmVudE1hdGVyaWFsID0gX2JyYW5jaC5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpO1xyXG5cclxuICAgICAgaWYgKGNtcE1lc2ggJiYgY21wTWVzaC5pc0FjdGl2ZSAmJiBjbXBNYXRlcmlhbCAmJiBjbXBNYXRlcmlhbC5pc0FjdGl2ZSkge1xyXG4gICAgICAgIGxldCBtdHhXb3JsZE1lc2g6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKF9icmFuY2gubXR4V29ybGQsIGNtcE1lc2gubXR4UGl2b3QpO1xyXG4gICAgICAgIGNtcE1lc2gubXR4V29ybGQuY29weShtdHhXb3JsZE1lc2gpO1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFdvcmxkTWVzaCk7IC8vIFRPRE86IGV4YW1pbmUsIHdoeSByZWN5Y2xpbmcgdGhpcyBjYXVzZXMgbWVzaGVzIHRvIGJlIG1pc3BsYWNlZC4uLlxyXG4gICAgICAgIGxldCBzaGFkZXI6IFNoYWRlckludGVyZmFjZSA9IGNtcE1hdGVyaWFsLm1hdGVyaWFsLmdldFNoYWRlcigpO1xyXG4gICAgICAgIGxldCBjbXBQYXJ0aWNsZVN5c3RlbTogQ29tcG9uZW50UGFydGljbGVTeXN0ZW0gPSBfYnJhbmNoLmdldENvbXBvbmVudChDb21wb25lbnRQYXJ0aWNsZVN5c3RlbSk7XHJcbiAgICAgICAgaWYgKGNtcFBhcnRpY2xlU3lzdGVtICYmIGNtcFBhcnRpY2xlU3lzdGVtLmlzQWN0aXZlICYmIGNtcFBhcnRpY2xlU3lzdGVtLnBhcnRpY2xlU3lzdGVtICE9IG51bGwpXHJcbiAgICAgICAgICBzaGFkZXIgPSBjbXBQYXJ0aWNsZVN5c3RlbS5wYXJ0aWNsZVN5c3RlbS5nZXRTaGFkZXJGcm9tKHNoYWRlcik7XHJcbiAgICAgICAgaWYgKF9zaGFkZXJzVXNlZC5pbmRleE9mKHNoYWRlcikgPCAwKVxyXG4gICAgICAgICAgX3NoYWRlcnNVc2VkLnB1c2goc2hhZGVyKTtcclxuICAgICAgICBfYnJhbmNoLnJhZGl1cyA9IGNtcE1lc2gucmFkaXVzO1xyXG4gICAgICAgIGlmIChjbXBNYXRlcmlhbC5zb3J0Rm9yQWxwaGEgfHwgX2JyYW5jaC5nZXRDb21wb25lbnQoQ29tcG9uZW50VGV4dCkpIC8vIGFsd2F5cyBzb3J0IHRleHQgZm9yIGFscGhhXHJcbiAgICAgICAgICBSZW5kZXIubm9kZXNBbHBoYS5wdXNoKF9icmFuY2gpOyAvLyBhZGQgdGhpcyBub2RlIHRvIHJlbmRlciBsaXN0XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgUmVuZGVyLm5vZGVzU2ltcGxlLnB1c2goX2JyYW5jaCk7IC8vIGFkZCB0aGlzIG5vZGUgdG8gcmVuZGVyIGxpc3RcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGNtcFNrZWxldG9uczogQ29tcG9uZW50U2tlbGV0b25bXSA9IF9icmFuY2guZ2V0Q29tcG9uZW50cyhDb21wb25lbnRTa2VsZXRvbik7XHJcbiAgICAgIGZvciAobGV0IGNtcFNrZWxldG9uIG9mIGNtcFNrZWxldG9ucylcclxuICAgICAgICBpZiAoY21wU2tlbGV0b24gJiYgY21wU2tlbGV0b24uaXNBY3RpdmUpXHJcbiAgICAgICAgICBSZW5kZXIuY29tcG9uZW50c1NrZWxldG9uLnB1c2goY21wU2tlbGV0b24pO1xyXG5cclxuICAgICAgaWYgKF9vcHRpb25zPy5naXptb3NFbmFibGVkICYmIF9vcHRpb25zPy5naXptb3NGaWx0ZXIpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBfYnJhbmNoLmdldEFsbENvbXBvbmVudHMoKSlcclxuICAgICAgICAgIGlmIChjb21wb25lbnQuaXNBY3RpdmUgJiYgX29wdGlvbnMuZ2l6bW9zRmlsdGVyLmdldChjb21wb25lbnQudHlwZSkpXHJcbiAgICAgICAgICAgIFJlbmRlci5naXptb3MucHVzaChjb21wb25lbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBfYnJhbmNoLmdldENoaWxkcmVuKCkpIHtcclxuICAgICAgICBSZW5kZXIucHJlcGFyZShjaGlsZCwgX29wdGlvbnMsIF9icmFuY2gubXR4V29ybGQsIF9zaGFkZXJzVXNlZCk7XHJcblxyXG4gICAgICAgIF9icmFuY2gubk5vZGVzSW5CcmFuY2ggKz0gY2hpbGQubk5vZGVzSW5CcmFuY2g7XHJcbiAgICAgICAgbGV0IGNtcE1lc2hDaGlsZDogQ29tcG9uZW50TWVzaCA9IGNoaWxkLmdldENvbXBvbmVudChDb21wb25lbnRNZXNoKTtcclxuICAgICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBjbXBNZXNoQ2hpbGQgPyBjbXBNZXNoQ2hpbGQubXR4V29ybGQudHJhbnNsYXRpb24gOiBjaGlsZC5tdHhXb3JsZC50cmFuc2xhdGlvbjtcclxuICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLmNsb25lO1xyXG4gICAgICAgIF9icmFuY2gucmFkaXVzID0gTWF0aC5tYXgoX2JyYW5jaC5yYWRpdXMsIHBvc2l0aW9uLmdldERpc3RhbmNlKF9icmFuY2gubXR4V29ybGQudHJhbnNsYXRpb24pICsgY2hpbGQucmFkaXVzKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShwb3NpdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmaXJzdExldmVsKSB7XHJcbiAgICAgICAgX2JyYW5jaC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRV9FTkQpKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNtcFNrZWxldG9uIG9mIFJlbmRlci5jb21wb25lbnRzU2tlbGV0b24pIHtcclxuICAgICAgICAgIGNtcFNrZWxldG9uLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgY21wU2tlbGV0b24udXBkYXRlUmVuZGVyQnVmZmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFJlbmRlci5idWZmZXJMaWdodHMoUmVuZGVyLmxpZ2h0cyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZExpZ2h0cyhfY21wTGlnaHRzOiBDb21wb25lbnRMaWdodFtdKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGNtcExpZ2h0IG9mIF9jbXBMaWdodHMpIHtcclxuICAgICAgICBpZiAoIWNtcExpZ2h0LmlzQWN0aXZlKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGxldCB0eXBlOiBUeXBlT2ZMaWdodCA9IGNtcExpZ2h0LmxpZ2h0LmdldFR5cGUoKTtcclxuICAgICAgICBsZXQgbGlnaHRzT2ZUeXBlOiBSZWN5Y2FibGVBcnJheTxDb21wb25lbnRMaWdodD4gPSBSZW5kZXIubGlnaHRzLmdldCh0eXBlKTtcclxuICAgICAgICBpZiAoIWxpZ2h0c09mVHlwZSkge1xyXG4gICAgICAgICAgbGlnaHRzT2ZUeXBlID0gbmV3IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudExpZ2h0PigpO1xyXG4gICAgICAgICAgUmVuZGVyLmxpZ2h0cy5zZXQodHlwZSwgbGlnaHRzT2ZUeXBlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGlnaHRzT2ZUeXBlLnB1c2goY21wTGlnaHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUGlja2luZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHdpdGggYSB7QGxpbmsgUGlja2VyfS1jYW1lcmEsIHRoaXMgbWV0aG9kIHJlbmRlcnMgb25lIHBpeGVsIHdpdGggcGlja2luZyBpbmZvcm1hdGlvbiBcclxuICAgICAqIGZvciBlYWNoIG5vZGUgaW4gdGhlIGxpbmUgb2Ygc2lnaHQgYW5kIHJldHVybiB0aGF0IGFzIGFuIHVuc29ydGVkIHtAbGluayBQaWNrfS1hcnJheVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHBpY2tCcmFuY2goX25vZGVzOiBOb2RlW10sIF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSwgX3BpY2tHaXptb3M6IGJvb2xlYW4gPSBmYWxzZSwgX2dpem1vc0ZpbHRlcj86IE1hcDxzdHJpbmcsIGJvb2xlYW4+KTogUGlja1tdIHsgLy8gVE9ETzogc2VlIGlmIHRoaXJkIHBhcmFtZXRlciBfd29ybGQ/OiBNYXRyaXg0eDQgd291bGQgYmUgdXNlZnVsbFxyXG4gICAgICAvKipcclxuICAgICAgICogVE9ETzogbWF5YmUgbW92ZSB0aGlzIHdob2xlIGZ1bmN0aW9uIHRvIFJlbmRlcldlYkdMPyBcclxuICAgICAgICogSXQgc2VlbXMgdG8gbW9zdGx5IHJlbHkgb24gUmVuZGVyV2ViR0wgZS5nLjogxpJwaWNrZWQsIGNyZWF0ZVBpY2tUZXh0dXJlKCksIHNldEJsZW5kTW9kZSgpLCBwaWNrKCksIHBpY2tHaXptb3MoKSwgZ2V0UGlja3MoKSwgcmVzZXRGcmFtZWJ1ZmZlcigpXHJcbiAgICAgICAqIFRoZXkgb25seSBub3QgV2ViR0wgdGhpbmcgaXQgZG9lcyBpcyBmaWx0ZXJpbmcgdGhlIG5vZGVzIHRvIHBpY2ssIHdoaWNoIGNvdWxkIGJlIGRvbmUgaW4gcGljaygpIGl0c2VsZi4uLlxyXG4gICAgICAgKiAtPiBvciBtYWtlIHRoaXMgbWV0aG9kIG9ubHkgY29sbGVjdCB0aGUgbm9kZXMgYW5kIGdpem1vcyBmcm9tIGJyYW5jaCBhbmQgdGhlbiBwYXNzIHRoZW0gdG8gYW4gYXBwcm9wcmlhdGUgbWV0aG9kIGluIFJlbmRlcldlYkdMP1xyXG4gICAgICAgKiBcclxuICAgICAgICogQWxzbyB7QGxpbmsgUmVuZGVyLsaScGlja2VkfSBhbmQge0BsaW5rIFJlbmRlci5zaXplUGlja30gc2VlbSB0byBvbmx5IGV2ZXIgYmUgdXNlZCBpbiB0aGUgbWV0aG9kcyBjYWxsZWQgZnJvbSB0aGlzIG1ldGhvZC4gXHJcbiAgICAgICAqIHNpemVQaWNrIGdldHMgc2V0IGluIGNyZWF0ZVBpY2tUZXh0dXJlKCkgYW5kIHVzZWQgaW4gcGljaygpIHZpYSB0aGUgcHJvcGVydHkgYnV0IHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBnZXRQaWNrcygpLlxyXG4gICAgICAgKiDGknBpY2tlZCBpcyBvbmx5IHVzZWQgaW4gZ2V0UGlja3MoKSwgcGljaygpIGFuZCBwaWNrR2l6bW9zKCkgYW5kIG9ubHkgZXZlciBzZXQgdG8gYW4gZW1wdHkgYXJyYXkgaW4gdGhpcyBtZXRob2QuXHJcbiAgICAgICAqIC0+IGJvdGggY291bGQgYmUgbG9jYWwgdmFyaWFibGVzIGFuZCBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIHRoZSBtZXRob2RzIHRoYXQgbmVlZCB0aGVtLlxyXG4gICAgICAgKi8gXHJcbiAgICAgIFJlbmRlci7GknBpY2tlZCA9IFtdO1xyXG4gICAgICBsZXQgc2l6ZTogbnVtYmVyID0gTWF0aC5jZWlsKE1hdGguc3FydChfbm9kZXMubGVuZ3RoICsgUmVuZGVyLmdpem1vcy5sZW5ndGgpKTsgLy8gZ2l6bW9zLmxlbmd0aCBtaWdodCBiZSBiaWdnZXIgdGhhbiBuZWVkZWQuLi5cclxuICAgICAgUmVuZGVyLmNyZWF0ZVBpY2tUZXh0dXJlKHNpemUpO1xyXG4gICAgICBSZW5kZXIuc2V0QmxlbmRNb2RlKEJMRU5ELk9QQVFVRSk7XHJcblxyXG4gICAgICBsZXQgZ2l6bW9zOiBDb21wb25lbnRbXSA9IFtdO1xyXG5cclxuICAgICAgZm9yIChsZXQgbm9kZSBvZiBfbm9kZXMpIHtcclxuICAgICAgICBsZXQgY21wTWVzaDogQ29tcG9uZW50TWVzaCA9IG5vZGUuZ2V0Q29tcG9uZW50KENvbXBvbmVudE1lc2gpO1xyXG4gICAgICAgIGxldCBjbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWwgPSBub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCk7XHJcbiAgICAgICAgaWYgKGNtcE1lc2ggJiYgY21wTWVzaC5pc0FjdGl2ZSAmJiBjbXBNYXRlcmlhbCAmJiBjbXBNYXRlcmlhbC5pc0FjdGl2ZSlcclxuICAgICAgICAgIFJlbmRlci5waWNrKG5vZGUsIF9jbXBDYW1lcmEpO1xyXG5cclxuICAgICAgICBpZiAoX3BpY2tHaXptb3MgJiYgX2dpem1vc0ZpbHRlcikge1xyXG4gICAgICAgICAgZm9yIChsZXQgZ2l6bW8gb2Ygbm9kZS5nZXRBbGxDb21wb25lbnRzKCkpIHtcclxuICAgICAgICAgICAgaWYgKCFnaXptby5pc0FjdGl2ZSB8fCAhX2dpem1vc0ZpbHRlci5nZXQoZ2l6bW8udHlwZSkgfHwgIWdpem1vLmRyYXdHaXptb3MpXHJcbiAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgIFxyXG4gICAgICAgICAgICBnaXptb3MucHVzaChnaXptbyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoX3BpY2tHaXptb3MpXHJcbiAgICAgICAgUmVuZGVyLnBpY2tHaXptb3MoZ2l6bW9zLCBfY21wQ2FtZXJhKTtcclxuXHJcbiAgICAgIFJlbmRlci5zZXRCbGVuZE1vZGUoQkxFTkQuVFJBTlNQQVJFTlQpO1xyXG5cclxuICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBSZW5kZXIuZ2V0UGlja3Moc2l6ZSwgX2NtcENhbWVyYSk7XHJcbiAgICAgIFJlbmRlci5yZXNldEZyYW1lYnVmZmVyKCk7XHJcbiAgICAgIHJldHVybiBwaWNrcztcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBEcmF3aW5nXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoZSBzY2VuZSBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBnaXZlbiBjYW1lcmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBkcmF3KF9jbXBDYW1lcmE6IENvbXBvbmVudENhbWVyYSk6IHZvaWQge1xyXG4gICAgICBmb3IgKGxldCBub2RlIG9mIFJlbmRlci5ub2Rlc0FscGhhKVxyXG4gICAgICAgIFJlZmxlY3Quc2V0KG5vZGUsIFwiekNhbWVyYVwiLCBfY21wQ2FtZXJhLnBvaW50V29ybGRUb0NsaXAobm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCkubXR4V29ybGQudHJhbnNsYXRpb24pLnopO1xyXG5cclxuICAgICAgY29uc3Qgc29ydGVkOiBOb2RlW10gPSBSZW5kZXIubm9kZXNBbHBoYS5nZXRTb3J0ZWQoKF9hOiBOb2RlLCBfYjogTm9kZSkgPT4gUmVmbGVjdC5nZXQoX2IsIFwiekNhbWVyYVwiKSAtIFJlZmxlY3QuZ2V0KF9hLCBcInpDYW1lcmFcIikpO1xyXG5cclxuICAgICAgUmVuZGVyLmRyYXdOb2RlcyhSZW5kZXIubm9kZXNTaW1wbGUsIHNvcnRlZCwgX2NtcENhbWVyYSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gUGh5c2ljc1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdHJhbnNmb3JtQnlQaHlzaWNzKF9ub2RlOiBOb2RlLCBfY21wUmlnaWRib2R5OiBDb21wb25lbnRSaWdpZGJvZHkpOiB2b2lkIHtcclxuICAgICAgaWYgKCFfY21wUmlnaWRib2R5LmlzSW5pdGlhbGl6ZWQpIC8vIHx8IFByb2plY3QubW9kZSA9PSBNT0RFLkVESVRPUilcclxuICAgICAgICBfY21wUmlnaWRib2R5LmluaXRpYWxpemUoKTtcclxuXHJcbiAgICAgIGlmICghUGh5c2ljcy5nZXRCb2R5TGlzdCgpLmxlbmd0aClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBpZiAoIV9ub2RlLm10eExvY2FsKSB7XHJcbiAgICAgICAgdGhyb3cgKG5ldyBFcnJvcihcIkNvbXBvbmVudFJpZ2lkYm9keSByZXF1aXJlcyBDb21wb25lbnRUcmFuc2Zvcm0gYXQgdGhlIHNhbWUgTm9kZVwiKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIF9jbXBSaWdpZGJvZHkuY2hlY2tDb2xsaXNpb25FdmVudHMoKTtcclxuXHJcbiAgICAgIGlmIChfY21wUmlnaWRib2R5LnR5cGVCb2R5ID09IEJPRFlfVFlQRS5LSU5FTUFUSUMgfHwgUHJvamVjdC5tb2RlID09IE1PREUuRURJVE9SKSB7IC8vQ2FzZSBvZiBLaW5lbWF0aWMgUmlnaWRib2R5XHJcbiAgICAgICAgbGV0IG10eFBpdm90V29ybGQ6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5QUk9EVUNUKF9ub2RlLm10eFdvcmxkLCBfY21wUmlnaWRib2R5Lm10eFBpdm90VW5zY2FsZWQpO1xyXG4gICAgICAgIF9jbXBSaWdpZGJvZHkuc2V0UG9zaXRpb24obXR4UGl2b3RXb3JsZC50cmFuc2xhdGlvbik7XHJcbiAgICAgICAgX2NtcFJpZ2lkYm9keS5zZXRSb3RhdGlvbihtdHhQaXZvdFdvcmxkLnJvdGF0aW9uKTtcclxuICAgICAgICBSZWN5Y2xlci5zdG9yZShtdHhQaXZvdFdvcmxkKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtdHhXb3JsZDogTWF0cml4NHg0ID0gTWF0cml4NHg0LkNPTVBPU0lUSU9OKFxyXG4gICAgICAgIF9jbXBSaWdpZGJvZHkuZ2V0UG9zaXRpb24oKSwgX2NtcFJpZ2lkYm9keS5nZXRSb3RhdGlvbigpLCBudWxsKTtcclxuICAgICAgbXR4V29ybGQubXVsdGlwbHkoX2NtcFJpZ2lkYm9keS5tdHhQaXZvdEludmVyc2UpO1xyXG4gICAgICBfbm9kZS5tdHhXb3JsZC50cmFuc2xhdGlvbiA9IG10eFdvcmxkLnRyYW5zbGF0aW9uO1xyXG4gICAgICBfbm9kZS5tdHhXb3JsZC5yb3RhdGlvbiA9IG10eFdvcmxkLnJvdGF0aW9uO1xyXG4gICAgICBsZXQgbXR4TG9jYWw6IE1hdHJpeDR4NCA9IF9ub2RlLmdldFBhcmVudCgpID8gTWF0cml4NHg0LlJFTEFUSVZFKF9ub2RlLm10eFdvcmxkLCBfbm9kZS5nZXRQYXJlbnQoKS5tdHhXb3JsZCkgOiBfbm9kZS5tdHhXb3JsZDtcclxuICAgICAgX25vZGUubXR4TG9jYWwuY29weShtdHhMb2NhbCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKG10eFdvcmxkKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUobXR4TG9jYWwpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFJlbmRlckJ1ZmZlcnMge1xyXG4gICAgdmVydGljZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIGluZGljZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIHRleHR1cmVVVnM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIG5vcm1hbHM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIGNvbG9ycz86IFdlYkdMQnVmZmVyO1xyXG4gICAgYm9uZXM/OiBXZWJHTEJ1ZmZlcjtcclxuICAgIHRhbmdlbnRzPzogV2ViR0xCdWZmZXI7XHJcbiAgICB3ZWlnaHRzPzogV2ViR0xCdWZmZXI7XHJcbiAgICBuSW5kaWNlcz86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydGVkIGludG8gYSB7QGxpbmsgTWVzaH0sIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FsY3VsYXRlcyBhbmQgcmVwcmVzZW50cyB0aGUgbWVzaCBkYXRhIGluIHRoZSBmb3JtIG5lZWRlZCBieSB0aGUgcmVuZGVyIGVuZ2luZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBSZW5kZXJNZXNoIHtcclxuICAgIHB1YmxpYyBidWZmZXJzOiBSZW5kZXJCdWZmZXJzID0gbnVsbDtcclxuICAgIHB1YmxpYyBtZXNoOiBNZXNoO1xyXG5cclxuICAgIC8qKiB2ZXJ0aWNlcyBvZiB0aGUgYWN0dWFsIHBvaW50IGNsb3VkLCBzb21lIHBvaW50cyBtaWdodCBiZSBpbiB0aGUgc2FtZSBsb2NhdGlvbiBpbiBvcmRlciB0byByZWZlciB0byBkaWZmZXJlbnQgdGV4ZWxzICovXHJcbiAgICAjdmVydGljZXM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiBpbmRpY2VzIHRvIGNyZWF0ZSBmYWNlcyBmcm9tIHRoZSB2ZXJ0aWNlcywgcm90YXRpb24gZGV0ZXJtaW5lcyBkaXJlY3Rpb24gb2YgZmFjZS1ub3JtYWwgKi9cclxuICAgICNpbmRpY2VzOiBVaW50MTZBcnJheTtcclxuICAgIC8qKiB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVydGljZXMgYnkgdGhlIHBvc2l0aW9uIGluIHRoZSBhcnJheSAqL1xyXG4gICAgI3RleHR1cmVVVnM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiB2ZXJ0ZXggbm9ybWFscyBmb3Igc21vb3RoIHNoYWRpbmcsIGludGVycG9sYXRlZCBiZXR3ZWVuIHZlcnRpY2VzIGR1cmluZyByZW5kZXJpbmcgKi9cclxuICAgICNub3JtYWxzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAvKiBjb2xvcnMgKi9cclxuICAgICNjb2xvcnM6IEZsb2F0MzJBcnJheTtcclxuICAgIC8qKiB2ZXJ0ZXggdGFuZ2VudHMgZm9yIG5vcm1hbCBtYXBwaW5nLCBiYXNlZCBvbiB0aGUgdmVydGV4IG5vcm1hbHMgYW5kIHRoZSBVViBjb29yZGluYXRlcyAqL1xyXG4gICAgI3RhbmdlbnRzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAvKiogYm9uZXMgKi9cclxuICAgICNib25lczogVWludDhBcnJheTtcclxuICAgICN3ZWlnaHRzOiBGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9tZXNoOiBNZXNoKSB7XHJcbiAgICAgIHRoaXMubWVzaCA9IF9tZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdmVydGljZXMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI3ZlcnRpY2VzIHx8ICggLy8gcmV0dXJuIGNhY2hlIG9yIC4uLlxyXG4gICAgICAgIC8vIC4uLiBmbGF0dGVuIGFsbCB2ZXJ0ZXggcG9zaXRpb25zIGZyb20gY2xvdWQgaW50byBhIHR5cGVkIGFycmF5XHJcbiAgICAgICAgdGhpcy4jdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4OiBWZXJ0ZXgsIF9pbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gWy4uLnRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihfaW5kZXgpLmdldCgpXTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB2ZXJ0aWNlcyhfdmVydGljZXM6IEZsb2F0MzJBcnJheSkge1xyXG4gICAgICB0aGlzLiN2ZXJ0aWNlcyA9IF92ZXJ0aWNlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGluZGljZXMoKTogVWludDE2QXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaW5kaWNlcyB8fCAoIC8vIHJldHVybiBjYWNoZSBvciAuLi5cclxuICAgICAgICAvLyAuLi4gZmxhdHRlbiBhbGwgaW5kaWNlcyBmcm9tIHRoZSBmYWNlcyBpbnRvIGEgdHlwZWQgYXJyYXlcclxuICAgICAgICB0aGlzLiNpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KHRoaXMubWVzaC5mYWNlcy5mbGF0TWFwKChfZmFjZTogRmFjZSkgPT4gWy4uLl9mYWNlLmluZGljZXNdKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBpbmRpY2VzKF9pbmRpY2VzOiBVaW50MTZBcnJheSkge1xyXG4gICAgICB0aGlzLiNpbmRpY2VzID0gX2luZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBub3JtYWxzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIGlmICh0aGlzLiNub3JtYWxzID09IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGEgY2hlY2sgc2ltaWxpYXIgdG8gdGhlIG9uZSBmb3IgdGFuZ2VudHMgYmVsb3csIHRvIHNlZSBpZiBub3JtYWxzIGFyZSBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHZlcnRpY2VzXHJcblxyXG4gICAgICAgIC8vIHN1bSB1cCBhbGwgdW5zY2FsZWQgbm9ybWFscyBvZiBmYWNlcyBjb25uZWN0ZWQgdG8gb25lIHZlcnRleCwgd2VpZ2h0ZWQgYnkgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIHR3byBuZWlnaGJvdXIgdmVydGljZXMuLi5cclxuICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZm9yRWFjaChfdmVydGV4ID0+IF92ZXJ0ZXgubm9ybWFsLnNldCgwLCAwLCAwKSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGZhY2Ugb2YgdGhpcy5tZXNoLmZhY2VzKVxyXG4gICAgICAgICAgZmFjZS5pbmRpY2VzLmZvckVhY2goKF9pVmVydGV4LCBfaUZhY2VWZXJ0ZXgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tZXNoLnZlcnRpY2VzLm5vcm1hbChfaVZlcnRleCkuYWRkKFZlY3RvcjMuU0NBTEUoZmFjZS5ub3JtYWxVbnNjYWxlZCwgZmFjZS5hbmdsZXNbX2lGYWNlVmVydGV4XSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gLi4uIGFuZCBub3JtYWxpemUgdGhlbVxyXG4gICAgICAgIHRoaXMubWVzaC52ZXJ0aWNlcy5mb3JFYWNoKF92ZXJ0ZXggPT4ge1xyXG4gICAgICAgICAgLy8gc29tZSB2ZXJ0aWNlcyBtaWdodCBiZSB1bnVzZWQgYW5kIHlpZWxkIGEgemVyby1ub3JtYWwuLi5cclxuICAgICAgICAgIGlmIChfdmVydGV4Lm5vcm1hbC5tYWduaXR1ZGVTcXVhcmVkID4gMClcclxuICAgICAgICAgICAgX3ZlcnRleC5ub3JtYWwubm9ybWFsaXplKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuxpJub3JtYWxzVmVydGV4ID0gbmV3IEZsb2F0MzJBcnJheShub3JtYWxzVmVydGV4LmZsYXRNYXAoKF9ub3JtYWw6IFZlY3RvcjMpID0+IFsuLi5fbm9ybWFsLmdldCgpXSkpO1xyXG5cclxuICAgICAgICB0aGlzLiNub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShcclxuICAgICAgICAgIHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4LCBfaW5kZXgpID0+IFsuLi50aGlzLm1lc2gudmVydGljZXMubm9ybWFsKF9pbmRleCkuZ2V0KCldKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNub3JtYWxzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBub3JtYWxzKF9ub3JtYWxzOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgICAgdGhpcy4jbm9ybWFscyA9IF9ub3JtYWxzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGFuZ2VudHMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgaWYgKHRoaXMuI3RhbmdlbnRzID09IG51bGwpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVzaC52ZXJ0aWNlcy5zb21lKF92ZXJ0ZXggPT4gIV92ZXJ0ZXgudXYpKSB7IC8vIGFzc3VtZSBhbGwgdmVydGljZXMgaGF2ZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9yIG5vbmVcclxuICAgICAgICAgIHRoaXMuI3RhbmdlbnRzID0gbmV3IEZsb2F0MzJBcnJheSgpOyAvLyBubyB0ZXh0dXJlIGNvb3JkaW5hdGVzLCBubyB0YW5nZW50c1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuI3RhbmdlbnRzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVzaC52ZXJ0aWNlcy5zb21lKF92ZXJ0ZXggPT4gIV92ZXJ0ZXgudGFuZ2VudCkpIHsgLy8gYXNzdW1lIGFsbCB2ZXJ0aWNlcyBoYXZlIHRhbmdlbnRzIG9yIG5vbmVcclxuICAgICAgICAgIGNvbnN0IHRhbmdlbnRzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmxlbmd0aCk7XHJcbiAgICAgICAgICBjb25zdCBiaXRhbmdlbnRzOiBWZWN0b3IzW10gPSBuZXcgQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmxlbmd0aCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGFuZ2VudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGFuZ2VudHNbaV0gPSBWZWN0b3IzLlpFUk8oKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpXSA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRoaXMubWVzaC52ZXJ0aWNlcy5mb3JFYWNoKF92ZXJ0ZXggPT4gX3ZlcnRleC50YW5nZW50LnNldCgwLCAwLCAwKSk7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgZmFjZSBvZiB0aGlzLm1lc2guZmFjZXMpIHtcclxuICAgICAgICAgICAgbGV0IGkwOiBudW1iZXIgPSBmYWNlLmluZGljZXNbMF07XHJcbiAgICAgICAgICAgIGxldCBpMTogbnVtYmVyID0gZmFjZS5pbmRpY2VzWzFdO1xyXG4gICAgICAgICAgICBsZXQgaTI6IG51bWJlciA9IGZhY2UuaW5kaWNlc1syXTtcclxuXHJcbiAgICAgICAgICAgIC8vdmVydGljZXMgc3Vycm91bmRpbmcgb25lIHRyaWFuZ2xlXHJcbiAgICAgICAgICAgIGxldCB2MDogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMCk7XHJcbiAgICAgICAgICAgIGxldCB2MTogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMSk7XHJcbiAgICAgICAgICAgIGxldCB2MjogVmVjdG9yMyA9IHRoaXMubWVzaC52ZXJ0aWNlcy5wb3NpdGlvbihpMik7XHJcblxyXG4gICAgICAgICAgICAvL3RoZWlyIFVWc1xyXG4gICAgICAgICAgICBsZXQgdXYwOiBWZWN0b3IyID0gdGhpcy5tZXNoLnZlcnRpY2VzLnV2KGkwKTtcclxuICAgICAgICAgICAgbGV0IHV2MTogVmVjdG9yMiA9IHRoaXMubWVzaC52ZXJ0aWNlcy51dihpMSk7XHJcbiAgICAgICAgICAgIGxldCB1djI6IFZlY3RvcjIgPSB0aGlzLm1lc2gudmVydGljZXMudXYoaTIpO1xyXG5cclxuICAgICAgICAgICAgLy9XZSBjb21wdXRlIHRoZSBlZGdlcyBvZiB0aGUgdHJpYW5nbGUuLi5cclxuICAgICAgICAgICAgbGV0IGRlbHRhUG9zMDogVmVjdG9yMyA9IFZlY3RvcjMuRElGRkVSRU5DRSh2MSwgdjApO1xyXG4gICAgICAgICAgICBsZXQgZGVsdGFQb3MxOiBWZWN0b3IzID0gVmVjdG9yMy5ESUZGRVJFTkNFKHYyLCB2MCk7XHJcblxyXG4gICAgICAgICAgICAvLy4uLmFuZCB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlcyBpbiBVViBzcGFjZS4uLlxyXG4gICAgICAgICAgICBsZXQgZGVsdGFVVjA6IFZlY3RvcjIgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodXYxLCB1djApO1xyXG4gICAgICAgICAgICBsZXQgZGVsdGFVVjE6IFZlY3RvcjIgPSBWZWN0b3IyLkRJRkZFUkVOQ0UodXYyLCB1djApO1xyXG5cclxuICAgICAgICAgICAgLy8uLi5hbmQgY29tcHV0ZSB0aGUgdGFuZ2VudFxyXG4gICAgICAgICAgICBsZXQgcjogbnVtYmVyID0gMSAvIFZlY3RvcjIuQ1JPU1MoZGVsdGFVVjAsIGRlbHRhVVYxKTtcclxuICAgICAgICAgICAgbGV0IGZhY2VUYW5nZW50OiBWZWN0b3IzID0gVmVjdG9yMy5TQ0FMRShWZWN0b3IzLkRJRkZFUkVOQ0UoVmVjdG9yMy5TQ0FMRShkZWx0YVBvczAsIGRlbHRhVVYxLnkpLCBWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMSwgZGVsdGFVVjAueSkpLCByKTtcclxuICAgICAgICAgICAgbGV0IGZhY2VCaXRhbmdlbnQ6IFZlY3RvcjMgPSBWZWN0b3IzLlNDQUxFKFZlY3RvcjMuRElGRkVSRU5DRShWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMSwgLWRlbHRhVVYwLngpLCBWZWN0b3IzLlNDQUxFKGRlbHRhUG9zMCwgLWRlbHRhVVYxLngpKSwgcik7IC8vIGZvciB3aW5kaW5nIG9yZGVyIGNvdW50ZXIgY2xvY2t3aXNlXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0YW5nZW50c1tpMF0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZVRhbmdlbnQsIGZhY2UuYW5nbGVzWzBdKSk7XHJcbiAgICAgICAgICAgIHRhbmdlbnRzW2kxXS5hZGQoVmVjdG9yMy5TQ0FMRShmYWNlVGFuZ2VudCwgZmFjZS5hbmdsZXNbMV0pKTtcclxuICAgICAgICAgICAgdGFuZ2VudHNbaTJdLmFkZChWZWN0b3IzLlNDQUxFKGZhY2VUYW5nZW50LCBmYWNlLmFuZ2xlc1syXSkpO1xyXG5cclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMF0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMF0pKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMV0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMV0pKTtcclxuICAgICAgICAgICAgYml0YW5nZW50c1tpMl0uYWRkKFZlY3RvcjMuU0NBTEUoZmFjZUJpdGFuZ2VudCwgZmFjZS5hbmdsZXNbMl0pKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZm9yRWFjaCgoX3ZlcnRleCwgX2luZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBub3JtYWw6IFZlY3RvcjMgPSB0aGlzLm1lc2gudmVydGljZXMubm9ybWFsKF9pbmRleCk7XHJcbiAgICAgICAgICAgIGxldCB0YW5nZW50OiBWZWN0b3IzID0gdGFuZ2VudHNbX2luZGV4XTtcclxuICAgICAgICAgICAgbGV0IGJpdGFuZ2VudDogVmVjdG9yMyA9IGJpdGFuZ2VudHNbX2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlb3J0aG9nb25hbGl6ZVxyXG4gICAgICAgICAgICB0YW5nZW50LmFkZChWZWN0b3IzLlNDQUxFKG5vcm1hbCwgLSBWZWN0b3IzLkRPVChub3JtYWwsIHRhbmdlbnQpKSk7XHJcbiAgICAgICAgICAgIGlmICh0YW5nZW50Lm1hZ25pdHVkZVNxdWFyZWQgPiAwKSAvLyBzb21lIHZlcnRpY2VzIG1pZ2h0IGJlIHVudXNlZCBhbmQgeWllbGQgYSB6ZXJvLXRhbmdlbnQuLi5cclxuICAgICAgICAgICAgICB0YW5nZW50Lm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGhhbmRlZG5lc3M6IG51bWJlciA9IChWZWN0b3IzLkRPVChWZWN0b3IzLkNST1NTKG5vcm1hbCwgdGFuZ2VudCksIGJpdGFuZ2VudCkgPCAwKSA/IC0xIDogMTtcclxuXHJcbiAgICAgICAgICAgIF92ZXJ0ZXgudGFuZ2VudCA9IG5ldyBWZWN0b3I0KHRhbmdlbnQueCwgdGFuZ2VudC55LCB0YW5nZW50LnosIGhhbmRlZG5lc3MpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiN0YW5nZW50cyA9IG5ldyBGbG9hdDMyQXJyYXkoXHJcbiAgICAgICAgICB0aGlzLm1lc2gudmVydGljZXMuZmxhdE1hcChfdmVydGV4ID0+IF92ZXJ0ZXgudGFuZ2VudC5nZXQoKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jdGFuZ2VudHM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRhbmdlbnRzKF90YW5nZW50czogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgIHRoaXMuI3RhbmdlbnRzID0gX3RhbmdlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4dHVyZVVWcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdGV4dHVyZVVWcyB8fCAoIC8vIHJldHVybiBjYWNoZSBvciAuLi5cclxuICAgICAgICAvLyAuLi4gZmxhdHRlbiBhbGwgdXZzIGZyb20gdGhlIGNsb3VzIGludG8gYSB0eXBlZCBhcnJheVxyXG4gICAgICAgIHRoaXMuI3RleHR1cmVVVnMgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubWVzaC52ZXJ0aWNlc1xyXG4gICAgICAgICAgLmZpbHRlcihfdmVydGV4ID0+IF92ZXJ0ZXgudXYpXHJcbiAgICAgICAgICAuZmxhdE1hcCgoX3ZlcnRleDogVmVydGV4KSA9PiBbLi4uX3ZlcnRleC51di5nZXQoKV0pXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRleHR1cmVVVnMoX3RleHR1cmVVVnM6IEZsb2F0MzJBcnJheSkge1xyXG4gICAgICB0aGlzLiN0ZXh0dXJlVVZzID0gX3RleHR1cmVVVnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjb2xvcnMoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2NvbG9ycyB8fCAoXHJcbiAgICAgICAgdGhpcy4jY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLm1lc2gudmVydGljZXNcclxuICAgICAgICAgIC5maWx0ZXIoX3ZlcnRleCA9PiBfdmVydGV4LmNvbG9yKVxyXG4gICAgICAgICAgLmZsYXRNYXAoX3ZlcnRleCA9PiBbLi4uX3ZlcnRleC5jb2xvci5nZXQoKV0pXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGNvbG9ycyhfY29sb3JzOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgICAgdGhpcy4jY29sb3JzID0gX2NvbG9ycztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJvbmVzKCk6IFVpbnQ4QXJyYXkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jYm9uZXMgfHwgKCAvLyByZXR1cm4gY2FjaGUgb3IgLi4uXHJcbiAgICAgICAgdGhpcy4jYm9uZXMgPSB0aGlzLm1lc2gudmVydGljZXMuc29tZShfdmVydGV4ID0+IF92ZXJ0ZXguYm9uZXMpID9cclxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KHRoaXMubWVzaC52ZXJ0aWNlcy5mbGF0TWFwKChfdmVydGV4OiBWZXJ0ZXgsIF9pbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvbmVzOiBCb25lW10gPSB0aGlzLm1lc2gudmVydGljZXMuYm9uZXMoX2luZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIFtib25lcz8uWzBdPy5pbmRleCB8fCAwLCBib25lcz8uWzFdPy5pbmRleCB8fCAwLCBib25lcz8uWzJdPy5pbmRleCB8fCAwLCBib25lcz8uWzNdPy5pbmRleCB8fCAwXTtcclxuICAgICAgICAgIH0pKSA6XHJcbiAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgYm9uZXMoX2lCb25lczogVWludDhBcnJheSkge1xyXG4gICAgICB0aGlzLiNib25lcyA9IF9pQm9uZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB3ZWlnaHRzKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN3ZWlnaHRzIHx8ICggLy8gcmV0dXJuIGNhY2hlIG9yIC4uLlxyXG4gICAgICAgIHRoaXMuI3dlaWdodHMgPSB0aGlzLm1lc2gudmVydGljZXMuc29tZShfdmVydGV4ID0+IF92ZXJ0ZXguYm9uZXMpID9cclxuICAgICAgICAgIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5tZXNoLnZlcnRpY2VzLmZsYXRNYXAoKF92ZXJ0ZXg6IFZlcnRleCwgX2luZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYm9uZXM6IEJvbmVbXSA9IHRoaXMubWVzaC52ZXJ0aWNlcy5ib25lcyhfaW5kZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gW2JvbmVzPy5bMF0/LndlaWdodCB8fCAwLCBib25lcz8uWzFdPy53ZWlnaHQgfHwgMCwgYm9uZXM/LlsyXT8ud2VpZ2h0IHx8IDAsIGJvbmVzPy5bM10/LndlaWdodCB8fCAwXTtcclxuICAgICAgICAgIH0pKSA6XHJcbiAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgd2VpZ2h0cyhfd2VpZ2h0czogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgIHRoaXMuI3dlaWdodHMgPSBfd2VpZ2h0cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGlzIHJlbmRlciBtZXNoIGFuZCBhbGwgaXRzIGJ1ZmZlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmJ1ZmZlcnMgPSBudWxsO1xyXG5cclxuICAgICAgdGhpcy4jdmVydGljZXMgPSBudWxsO1xyXG4gICAgICB0aGlzLiNpbmRpY2VzID0gbnVsbDtcclxuICAgICAgdGhpcy4jdGV4dHVyZVVWcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuI25vcm1hbHMgPSBudWxsO1xyXG4gICAgICB0aGlzLiNjb2xvcnMgPSBudWxsO1xyXG4gICAgICB0aGlzLiN0YW5nZW50cyA9IG51bGw7XHJcblxyXG4gICAgICB0aGlzLiNib25lcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuI3dlaWdodHMgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xzIHRoZSByZW5kZXJpbmcgb2YgYSBicmFuY2gsIHVzaW5nIHRoZSBnaXZlbiB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSxcclxuICAgKiBhbmQgdGhlIHByb3BhZ2F0aW9uIG9mIHRoZSByZW5kZXJlZCBpbWFnZSBmcm9tIHRoZSBvZmZzY3JlZW4gcmVuZGVyYnVmZmVyIHRvIHRoZSB0YXJnZXQgY2FudmFzXHJcbiAgICogdGhyb3VnaCBhIHNlcmllcyBvZiB7QGxpbmsgRnJhbWluZ30gb2JqZWN0cy4gVGhlIHN0YWdlcyBpbnZvbHZlZCBhcmUgaW4gb3JkZXIgb2YgcmVuZGVyaW5nXHJcbiAgICoge0BsaW5rIFJlbmRlcn0udmlld3BvcnQgLT4ge0BsaW5rIFZpZXdwb3J0fS5zb3VyY2UgLT4ge0BsaW5rIFZpZXdwb3J0fS5kZXN0aW5hdGlvbiAtPiBET00tQ2FudmFzIC0+IENsaWVudChDU1MpXHJcbiAgICogQGF1dGhvcnMgSmFzY2hhIEthcmFnw7ZsLCBIRlUsIDIwMTkgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOS0yMDIyIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2hzLWZ1cnR3YW5nZW4vRlVER0Uvd2lraS9WaWV3cG9ydFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBWaWV3cG9ydCBleHRlbmRzIEV2ZW50VGFyZ2V0VW5pZmllZCB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBmb2N1czogVmlld3BvcnQ7XHJcblxyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IFwiVmlld3BvcnRcIjsgLy8gVGhlIG5hbWUgdG8gY2FsbCB0aGlzIHZpZXdwb3J0IGJ5LlxyXG4gICAgcHVibGljIGNhbWVyYTogQ29tcG9uZW50Q2FtZXJhID0gbnVsbDsgLy8gVGhlIGNhbWVyYSByZXByZXNlbnRpbmcgdGhlIHZpZXcgcGFyYW1ldGVycyB0byByZW5kZXIgdGhlIGJyYW5jaC5cclxuICAgIHB1YmxpYyByZWN0U291cmNlOiBSZWN0YW5nbGU7XHJcbiAgICBwdWJsaWMgcmVjdERlc3RpbmF0aW9uOiBSZWN0YW5nbGU7XHJcblxyXG4gICAgLy8gVE9ETzogdmVyaWZ5IGlmIGNsaWVudCB0byBjYW52YXMgc2hvdWxkIGJlIGluIFZpZXdwb3J0IG9yIHNvbWV3aGVyZSBlbHNlIChXaW5kb3csIENvbnRhaW5lcj8pXHJcbiAgICAvLyBNdWx0aXBsZSB2aWV3cG9ydHMgdXNpbmcgdGhlIHNhbWUgY2FudmFzIHNob3VsZG4ndCBkaWZmZXIgaGVyZS4uLlxyXG4gICAgLy8gZGlmZmVyZW50IGZyYW1pbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCwgdGhpcyBpcyB0aGUgZGVmYXVsdFxyXG4gICAgcHVibGljIGZyYW1lQ2xpZW50VG9DYW52YXM6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG4gICAgcHVibGljIGZyYW1lQ2FudmFzVG9EZXN0aW5hdGlvbjogRnJhbWluZ0NvbXBsZXggPSBuZXcgRnJhbWluZ0NvbXBsZXgoKTtcclxuICAgIHB1YmxpYyBmcmFtZURlc3RpbmF0aW9uVG9Tb3VyY2U6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG4gICAgcHVibGljIGZyYW1lU291cmNlVG9SZW5kZXI6IEZyYW1pbmdTY2FsZWQgPSBuZXcgRnJhbWluZ1NjYWxlZCgpO1xyXG5cclxuICAgIHB1YmxpYyBhZGp1c3RpbmdGcmFtZXM6IGJvb2xlYW4gPSB0cnVlOyAvLyBUT0RPOiBtYXliZSBvbmx5IGFkanVzdCBmcmFtZXMgd2hlbiBhbnl0aGluZyBjaGFuZ2VzIGluc3RlYWQgb2YgZXZlcnkgZHJhd24gZnJhbWU/XHJcbiAgICBwdWJsaWMgYWRqdXN0aW5nQ2FtZXJhOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBwaHlzaWNzRGVidWdNb2RlOiBQSFlTSUNTX0RFQlVHTU9ERSA9IFBIWVNJQ1NfREVCVUdNT0RFLk5PTkU7XHJcblxyXG4gICAgcHVibGljIGdpem1vc0VuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBnaXptb3NTZWxlY3RlZDogTm9kZVtdO1xyXG4gICAgcHVibGljIGdpem1vc0ZpbHRlcjogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKENvbXBvbmVudC5zdWJjbGFzc2VzIC8vIFRPRE86IG1heWJlIG1ha2UgdGhpcyBsYXp5XHJcbiAgICAgIC5maWx0ZXIoKF9jbGFzczogdHlwZW9mIENvbXBvbmVudCkgPT4gKF9jbGFzcy5wcm90b3R5cGUpLmRyYXdHaXptb3MgfHwgKF9jbGFzcy5wcm90b3R5cGUpLmRyYXdHaXptb3NTZWxlY3RlZClcclxuICAgICAgLm1hcCgoX2NsYXNzOiB0eXBlb2YgQ29tcG9uZW50KSA9PiBbX2NsYXNzLm5hbWUsIHRydWVdKVxyXG4gICAgKTtcclxuXHJcbiAgICBwdWJsaWMgY29tcG9uZW50c1BpY2s6IFJlY3ljYWJsZUFycmF5PENvbXBvbmVudFBpY2s+ID0gbmV3IFJlY3ljYWJsZUFycmF5KCk7XHJcblxyXG4gICAgI2JyYW5jaDogTm9kZSA9IG51bGw7IC8vIFRoZSB0byByZW5kZXIgd2l0aCBhbGwgaXRzIGRlc2NlbmRhbnRzLlxyXG4gICAgI2NyYzI6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IG51bGw7XHJcbiAgICAjY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IG51bGw7XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyAjcmVnaW9uIEV2ZW50cyAocGFzc2luZyBmcm9tIGNhbnZhcyB0byB2aWV3cG9ydCBhbmQgZnJvbSB0aGVyZSBpbnRvIGJyYW5jaClcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmlld3BvcnQgY3VycmVudGx5IGhhcyBmb2N1cyBhbmQgdGh1cyByZWNlaXZlcyBrZXlib2FyZCBldmVudHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBoYXNGb2N1cygpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIChWaWV3cG9ydC5mb2N1cyA9PSB0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBkZXN0aW5hdGlvbiBjYW52YXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY2FudmFzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgMkQtY29udGV4dCBhdHRhY2hlZCB0byB0aGUgZGVzdGluYXRpb24gY2FudmFzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY29udGV4dCgpOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY3JjMjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbm5lY3RzIHRoZSB2aWV3cG9ydCB0byB0aGUgZ2l2ZW4gY2FudmFzIHRvIHJlbmRlciB0aGUgZ2l2ZW4gYnJhbmNoIHRvIHVzaW5nIHRoZSBnaXZlbiBjYW1lcmEtY29tcG9uZW50LCBhbmQgbmFtZXMgdGhlIHZpZXdwb3J0IGFzIGdpdmVuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZShfbmFtZTogc3RyaW5nLCBfYnJhbmNoOiBOb2RlLCBfY2FtZXJhOiBDb21wb25lbnRDYW1lcmEsIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgICB0aGlzLmNhbWVyYSA9IF9jYW1lcmE7XHJcbiAgICAgIHRoaXMuI2NhbnZhcyA9IF9jYW52YXM7XHJcbiAgICAgIHRoaXMuI2NyYzIgPSBfY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgdGhpcy4jY2FudmFzLnRhYkluZGV4ID0gMDsgLy8gY2FuIGdldCBmb2N1cyBhbmQgcmVjZWl2ZSBrZXlib2FyZCBldmVudHNcclxuXHJcbiAgICAgIHRoaXMucmVjdFNvdXJjZSA9IFJlbmRlci5nZXRDYW52YXNSZWN0KCk7XHJcbiAgICAgIHRoaXMucmVjdERlc3RpbmF0aW9uID0gdGhpcy5nZXRDbGllbnRSZWN0YW5nbGUoKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0QnJhbmNoKF9icmFuY2gpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gY2FudmFzIGFzIGEgcmVjdGFuZ2xlLCB4IGFuZCB5IGFyZSBhbHdheXMgMCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENhbnZhc1JlY3RhbmdsZSgpOiBSZWN0YW5nbGUge1xyXG4gICAgICByZXR1cm4gUmVjdGFuZ2xlLkdFVCgwLCAwLCB0aGlzLiNjYW52YXMud2lkdGgsIHRoaXMuI2NhbnZhcy5oZWlnaHQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgY2xpZW50IHJlY3RhbmdsZSB0aGUgY2FudmFzIGlzIGRpc3BsYXllZCBhbmQgZml0IGluLCB4IGFuZCB5IGFyZSBhbHdheXMgMCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENsaWVudFJlY3RhbmdsZSgpOiBSZWN0YW5nbGUge1xyXG4gICAgICAvLyBGVURHRSBkb2Vzbid0IGNhcmUgYWJvdXQgd2hlcmUgdGhlIGNsaWVudCByZWN0IGlzLCBvbmx5IGFib3V0IHRoZSBzaXplIG1hdHRlcnMuXHJcbiAgICAgIC8vIHJldHVybiBSZWN0YW5nbGUuR0VUKHRoaXMuY2FudmFzLm9mZnNldExlZnQsIHRoaXMuY2FudmFzLm9mZnNldFRvcCwgdGhpcy5jYW52YXMuY2xpZW50V2lkdGgsIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCk7XHJcbiAgICAgIHJldHVybiBSZWN0YW5nbGUuR0VUKDAsIDAsIHRoaXMuI2NhbnZhcy5jbGllbnRXaWR0aCwgdGhpcy4jY2FudmFzLmNsaWVudEhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGJyYW5jaCB0byBiZSBkcmF3biBpbiB0aGUgdmlld3BvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCcmFuY2goX2JyYW5jaDogTm9kZSk6IHZvaWQge1xyXG4gICAgICBpZiAoX2JyYW5jaCkge1xyXG4gICAgICAgIF9icmFuY2guYnJvYWRjYXN0RXZlbnQobmV3IEV2ZW50KEVWRU5ULkFUVEFDSF9CUkFOQ0gpKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLiNicmFuY2ggPSBfYnJhbmNoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIGJyYW5jaCB0aGlzIHZpZXdwb3J0IHJlbmRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJyYW5jaCgpOiBOb2RlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2JyYW5jaDtcclxuICAgIH1cclxuXHJcbiAgICAvLyAjcmVnaW9uIERyYXdpbmdcclxuICAgIC8qKlxyXG4gICAgICogRHJhdyB0aGlzIHZpZXdwb3J0IGRpc3BsYXlpbmcgaXRzIGJyYW5jaC4gQnkgZGVmYXVsdCwgdGhlIHRyYW5zZm9ybXMgaW4gdGhlIGJyYW5jaCBhcmUgcmVjYWxjdWxhdGVkIGZpcnN0LlxyXG4gICAgICogUGFzcyBgZmFsc2VgIGlmIGNhbGN1bGF0aW9uIHdhcyBhbHJlYWR5IGRvbmUgZm9yIHRoaXMgZnJhbWUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkcmF3KF9wcmVwYXJlQnJhbmNoOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICB0aGlzLnByZXBhcmUoX3ByZXBhcmVCcmFuY2gpO1xyXG5cclxuICAgICAgaWYgKHRoaXMucGh5c2ljc0RlYnVnTW9kZSAhPSBQSFlTSUNTX0RFQlVHTU9ERS5QSFlTSUNfT0JKRUNUU19PTkxZKSB7XHJcbiAgICAgICAgUmVuZGVyLmRyYXcodGhpcy5jYW1lcmEpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5naXptb3NFbmFibGVkKVxyXG4gICAgICAgICAgR2l6bW9zLmRyYXcodGhpcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnBoeXNpY3NEZWJ1Z01vZGUgIT0gUEhZU0lDU19ERUJVR01PREUuTk9ORSkge1xyXG4gICAgICAgIFBoeXNpY3MuZHJhdyh0aGlzLmNhbWVyYSwgdGhpcy5waHlzaWNzRGVidWdNb2RlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfRU5EKSk7XHJcblxyXG4gICAgICB0aGlzLiNjcmMyLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLiNjcmMyLmRyYXdJbWFnZShcclxuICAgICAgICBSZW5kZXIuZ2V0Q2FudmFzKCksXHJcbiAgICAgICAgdGhpcy5yZWN0U291cmNlLngsIHRoaXMucmVjdFNvdXJjZS55LCB0aGlzLnJlY3RTb3VyY2Uud2lkdGgsIHRoaXMucmVjdFNvdXJjZS5oZWlnaHQsXHJcbiAgICAgICAgdGhpcy5yZWN0RGVzdGluYXRpb24ueCwgdGhpcy5yZWN0RGVzdGluYXRpb24ueSwgdGhpcy5yZWN0RGVzdGluYXRpb24ud2lkdGgsIHRoaXMucmVjdERlc3RpbmF0aW9uLmhlaWdodFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBZGp1c3RzIGFsbCBmcmFtZXMgYW5kIHRoZSBjYW1lcmEgdG8gZml0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhbnZhcy4gUHJlcGFyZXMgdGhlIGJyYW5jaCBmb3IgcmVuZGVyaW5nLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBwcmVwYXJlKF9wcmVwYXJlQnJhbmNoOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICBpZiAoIXRoaXMuI2JyYW5jaClcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGlmICghdGhpcy5jYW1lcmEuaXNBY3RpdmUpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHRoaXMuYWRqdXN0aW5nRnJhbWVzKVxyXG4gICAgICAgIHRoaXMuYWRqdXN0RnJhbWVzKCk7XHJcbiAgICAgIGlmICh0aGlzLmFkanVzdGluZ0NhbWVyYSlcclxuICAgICAgICB0aGlzLmFkanVzdENhbWVyYSgpO1xyXG4gICAgICBpZiAoX3ByZXBhcmVCcmFuY2gpXHJcbiAgICAgICAgdGhpcy5wcmVwYXJlQnJhbmNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVwYXJlcyBhbGwgbm9kZXMgaW4gdGhlIGJyYW5jaCBmb3IgcmVuZGVyaW5nIGJ5IHVwZGF0aW5nIHRoZWlyIHdvcmxkIHRyYW5zZm9ybXMgZXRjLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJlcGFyZUJyYW5jaCgpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFJvb3Q6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JREVOVElUWSgpO1xyXG4gICAgICBpZiAodGhpcy4jYnJhbmNoLmdldFBhcmVudCgpKVxyXG4gICAgICAgIG10eFJvb3QgPSB0aGlzLiNicmFuY2guZ2V0UGFyZW50KCkubXR4V29ybGQ7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoRVZFTlQuUkVOREVSX1BSRVBBUkVfU1RBUlQpKTtcclxuICAgICAgUmVuZGVyLnByZXBhcmUodGhpcy4jYnJhbmNoLCB7IGdpem1vc0VuYWJsZWQ6IHRoaXMuZ2l6bW9zRW5hYmxlZCwgZ2l6bW9zRmlsdGVyOiB0aGlzLmdpem1vc0ZpbHRlciB9LCBtdHhSb290KTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFVkVOVC5SRU5ERVJfUFJFUEFSRV9FTkQpKTtcclxuICAgICAgdGhpcy5jb21wb25lbnRzUGljayA9IFJlbmRlci5jb21wb25lbnRzUGljaztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGEgcGljayBvbiBhbGwge0BsaW5rIENvbXBvbmVudFBpY2t9cyBpbiB0aGUgYnJhbmNoIG9mIHRoaXMgdmlld3BvcnRcclxuICAgICAqIHVzaW5nIGEgcmF5IGZyb20gaXRzIGNhbWVyYSB0aHJvdWdoIHRoZSBjbGllbnQgY29vcmRpbmF0ZXMgZ2l2ZW4gaW4gdGhlIGV2ZW50LlxyXG4gICAgICogRGlzcGF0Y2hlcyB0aGUgZXZlbnQgdG8gYWxsIG5vZGVzIGhpdC4gIFxyXG4gICAgICogSWYge0BsaW5rIFBJQ0suQ0FNRVJBfSB3YXMgY2hvc2VuIGFzIHRoZSBtZXRob2QgdG8gcGljaywgYSBwaWNrIHByb3BlcnR5IGdldHMgYWRkZWQgdG8gdGhlIGV2ZW50LCBcclxuICAgICAqIHdoaWNoIGhvbGRzIHRoZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiwgYnV0IGlzIG92ZXJ3cml0dGVuIGZvciBlYWNoIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwYXRjaFBvaW50ZXJFdmVudChfZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgICBsZXQgcG9zQ2xpZW50OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoX2V2ZW50LmNsaWVudFgsIF9ldmVudC5jbGllbnRZKTtcclxuICAgICAgbGV0IHJheTogUmF5ID0gdGhpcy5nZXRSYXlGcm9tQ2xpZW50KHBvc0NsaWVudCk7XHJcbiAgICAgIC8vIGxldCBjYW1lcmFQaWNrczogUmVjeWNhYmxlQXJyYXk8Tm9kZT4gPSBSZWN5Y2xlci5nZXQoUmVjeWNhYmxlQXJyYXkpOyAvL1RPRE86IHRoaW5rIGFib3V0IG9wdGltaXphdGlvbiBsYXRlclxyXG4gICAgICBsZXQgY2FtZXJhUGlja3M6IE5vZGVbXSA9IFtdO1xyXG4gICAgICBsZXQgb3RoZXJQaWNrczogQ29tcG9uZW50UGlja1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGNtcFBpY2sgb2YgdGhpcy5jb21wb25lbnRzUGljaylcclxuICAgICAgICBpZiAoY21wUGljay5waWNrID09IFBJQ0suQ0FNRVJBKVxyXG4gICAgICAgICAgY2FtZXJhUGlja3MucHVzaChjbXBQaWNrLm5vZGUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIG90aGVyUGlja3MucHVzaChjbXBQaWNrKTtcclxuXHJcblxyXG4gICAgICBpZiAoY2FtZXJhUGlja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHBpY2tzOiBQaWNrW10gPSBQaWNrZXIucGlja0NhbWVyYShjYW1lcmFQaWNrcywgdGhpcy5jYW1lcmEsIHRoaXMucG9pbnRDbGllbnRUb1Byb2plY3Rpb24ocG9zQ2xpZW50KSwgdGhpcy5naXptb3NFbmFibGVkLCB0aGlzLmdpem1vc0ZpbHRlcik7XHJcbiAgICAgICAgZm9yIChsZXQgcGljayBvZiBwaWNrcykge1xyXG4gICAgICAgICAgUmVmbGVjdC5zZXQoX2V2ZW50LCBcInBpY2tcIiwgcGljayk7XHJcbiAgICAgICAgICBwaWNrLm5vZGUuZGlzcGF0Y2hFdmVudChfZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgY21wUGljayBvZiBvdGhlclBpY2tzKSB7XHJcbiAgICAgICAgY21wUGljay5waWNrQW5kRGlzcGF0Y2gocmF5LCBfZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3QgYWxsIGZyYW1lcyBpbnZvbHZlZCBpbiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MgZnJvbSB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBjbGllbnQgdXAgdG8gdGhlIHJlbmRlcmVyIGNhbnZhc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRqdXN0RnJhbWVzKCk6IHZvaWQge1xyXG4gICAgICAvLyBnZXQgdGhlIHJlY3RhbmdsZSBvZiB0aGUgY2FudmFzIGFyZWEgYXMgZGlzcGxheWVkIChjb25zaWRlciBjc3MpXHJcbiAgICAgIGxldCByZWN0Q2xpZW50OiBSZWN0YW5nbGUgPSB0aGlzLmdldENsaWVudFJlY3RhbmdsZSgpO1xyXG4gICAgICAvLyBhZGp1c3QgdGhlIGNhbnZhcyBzaXplIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZnJhbWluZyBhcHBsaWVkIHRvIGNsaWVudFxyXG4gICAgICBsZXQgcmVjdENhbnZhczogUmVjdGFuZ2xlID0gdGhpcy5mcmFtZUNsaWVudFRvQ2FudmFzLmdldFJlY3QocmVjdENsaWVudCk7XHJcbiAgICAgIHRoaXMuI2NhbnZhcy53aWR0aCA9IHJlY3RDYW52YXMud2lkdGg7XHJcbiAgICAgIHRoaXMuI2NhbnZhcy5oZWlnaHQgPSByZWN0Q2FudmFzLmhlaWdodDtcclxuXHJcbiAgICAgIGxldCByZWN0VGVtcDogUmVjdGFuZ2xlO1xyXG4gICAgICAvLyBhZGp1c3QgdGhlIGRlc3RpbmF0aW9uIGFyZWEgb24gdGhlIHRhcmdldC1jYW52YXMgdG8gcmVuZGVyIHRvIGJ5IGFwcGx5aW5nIHRoZSBmcmFtaW5nIHRvIGNhbnZhc1xyXG4gICAgICByZWN0VGVtcCA9IHRoaXMuZnJhbWVDYW52YXNUb0Rlc3RpbmF0aW9uLmdldFJlY3QocmVjdENhbnZhcyk7XHJcbiAgICAgIHRoaXMucmVjdERlc3RpbmF0aW9uLmNvcHkocmVjdFRlbXApO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyZWN0VGVtcCk7XHJcbiAgICAgIC8vIGFkanVzdCB0aGUgYXJlYSBvbiB0aGUgc291cmNlLWNhbnZhcyB0byByZW5kZXIgZnJvbSBieSBhcHBseWluZyB0aGUgZnJhbWluZyB0byBkZXN0aW5hdGlvbiBhcmVhXHJcbiAgICAgIHJlY3RUZW1wID0gdGhpcy5mcmFtZURlc3RpbmF0aW9uVG9Tb3VyY2UuZ2V0UmVjdCh0aGlzLnJlY3REZXN0aW5hdGlvbik7XHJcblxyXG4gICAgICB0aGlzLnJlY3RTb3VyY2UuY29weShyZWN0VGVtcCk7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RUZW1wKTtcclxuXHJcbiAgICAgIC8vIGhhdmluZyBhbiBvZmZzZXQgc291cmNlIGRvZXMgbWFrZSBzZW5zZSBvbmx5IHdoZW4gbXVsdGlwbGUgdmlld3BvcnRzIGRpc3BsYXkgcGFydHMgb2YgdGhlIHNhbWUgcmVuZGVyaW5nLiBGb3Igbm93OiBzaGlmdCBpdCB0byAwLDBcclxuICAgICAgdGhpcy5yZWN0U291cmNlLnggPSB0aGlzLnJlY3RTb3VyY2UueSA9IDA7XHJcbiAgICAgIC8vIHN0aWxsLCBhIHBhcnRpYWwgaW1hZ2Ugb2YgdGhlIHJlbmRlcmluZyBtYXkgYmUgcmV0cmlldmVkIGJ5IG1vdmluZyBhbmQgcmVzaXppbmcgdGhlIHJlbmRlciB2aWV3cG9ydC4gRm9yIG5vdywgaXQncyBhbHdheXMgYWRqdXN0ZWQgdG8gdGhlIGN1cnJlbnQgdmlld3BvcnRcclxuICAgICAgbGV0IHJlY3RSZW5kZXI6IFJlY3RhbmdsZSA9IHRoaXMuZnJhbWVTb3VyY2VUb1JlbmRlci5nZXRSZWN0KHRoaXMucmVjdFNvdXJjZSk7XHJcbiAgICAgIFJlbmRlci5zZXRSZW5kZXJSZWN0YW5nbGUocmVjdFJlbmRlcik7XHJcblxyXG4gICAgICBsZXQgcmVjdE9mZnNjcmVlbkNhbnZhczogUmVjdGFuZ2xlID0gUmVuZGVyLmdldENhbnZhc1JlY3QoKTsgLy8gdGhlcmUgYXJlIGZhciB0byBtYW55IHJlY3RhbmdsZXMgaW52b2x2ZWQgaGVyZS4uLlxyXG5cclxuICAgICAgLy8gbm8gbW9yZSB0cmFuc2Zvcm1hdGlvbiBhZnRlciB0aGlzIGZvciBub3csIG9mZnNjcmVlbiBjYW52YXMgYW5kIHJlbmRlci12aWV3cG9ydCBoYXZlIHRoZSBzYW1lIHNpemVcclxuICAgICAgUmVuZGVyLnNldENhbnZhc1NpemUocmVjdFJlbmRlci53aWR0aCwgcmVjdFJlbmRlci5oZWlnaHQpO1xyXG5cclxuICAgICAgaWYgKHJlY3RSZW5kZXIud2lkdGggIT0gcmVjdE9mZnNjcmVlbkNhbnZhcy53aWR0aCB8fCByZWN0UmVuZGVyLmhlaWdodCAhPSByZWN0T2Zmc2NyZWVuQ2FudmFzLmhlaWdodClcclxuICAgICAgICBSZW5kZXIuYWRqdXN0QXR0YWNobWVudHMoKTtcclxuXHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RDbGllbnQpO1xyXG4gICAgICBSZWN5Y2xlci5zdG9yZShyZWN0Q2FudmFzKTtcclxuICAgICAgUmVjeWNsZXIuc3RvcmUocmVjdFJlbmRlcik7XHJcbiAgICAgIFJlY3ljbGVyLnN0b3JlKHJlY3RPZmZzY3JlZW5DYW52YXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0IHRoZSBjYW1lcmEgcGFyYW1ldGVycyB0byBmaXQgdGhlIHJlbmRlcmluZyBpbnRvIHRoZSByZW5kZXIgdmlld3BvcnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkanVzdENhbWVyYSgpOiB2b2lkIHtcclxuICAgICAgbGV0IHJlY3Q6IFJlY3RhbmdsZSA9IFJlbmRlci5nZXRSZW5kZXJSZWN0YW5nbGUoKTtcclxuICAgICAgLy8gaWYgKHRoaXMuY2FtZXJhLmdldFByb2plY3Rpb24oKSA9PSBQUk9KRUNUSU9OLk9SVEhPR1JBUEhJQylcclxuICAgICAgLy8gICB0aGlzLmNhbWVyYS5wcm9qZWN0T3J0aG9ncmFwaGljKC1yZWN0LndpZHRoIC8gMjAsIHJlY3Qud2lkdGggLyAyMCwgcmVjdC5oZWlnaHQgLyAyMCwgLXJlY3QuaGVpZ2h0IC8gMjApO1xyXG4gICAgICAvLyBlbHNlXHJcbiAgICAgIHRoaXMuY2FtZXJhLnByb2plY3RDZW50cmFsKFxyXG4gICAgICAgIHJlY3Qud2lkdGggLyByZWN0LmhlaWdodCwgdGhpcy5jYW1lcmEuZ2V0RmllbGRPZlZpZXcoKSwgdGhpcy5jYW1lcmEuZ2V0RGlyZWN0aW9uKCksIHRoaXMuY2FtZXJhLmdldE5lYXIoKSwgdGhpcy5jYW1lcmEuZ2V0RmFyKClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jYW1lcmEucmVzZXRXb3JsZFRvVmlldygpO1xyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBQb2ludHNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBSYXl9IGluIHdvcmxkIGNvb3JkaW5hdGVzIGZyb20gdGhpcyBjYW1lcmEgdGhyb3VnaCB0aGUgcG9pbnQgZ2l2ZW4gaW4gY2xpZW50IHNwYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSYXlGcm9tQ2xpZW50KF9wb2ludDogVmVjdG9yMik6IFJheSB7XHJcbiAgICAgIGxldCBwb3NQcm9qZWN0aW9uOiBWZWN0b3IyID0gdGhpcy5wb2ludENsaWVudFRvUHJvamVjdGlvbihfcG9pbnQpO1xyXG4gICAgICBsZXQgcmF5OiBSYXkgPSBuZXcgUmF5KG5ldyBWZWN0b3IzKC1wb3NQcm9qZWN0aW9uLngsIHBvc1Byb2plY3Rpb24ueSwgMSkpO1xyXG5cclxuICAgICAgLy8gcmF5LmRpcmVjdGlvbi5zY2FsZShjYW1lcmEuZGlzdGFuY2UpO1xyXG4gICAgICByYXkudHJhbnNmb3JtKHRoaXMuY2FtZXJhLm10eFBpdm90KTtcclxuICAgICAgbGV0IGNhbWVyYU5vZGU6IE5vZGUgPSB0aGlzLmNhbWVyYS5ub2RlO1xyXG4gICAgICBpZiAoY2FtZXJhTm9kZSlcclxuICAgICAgICByYXkudHJhbnNmb3JtKGNhbWVyYU5vZGUubXR4V29ybGQpO1xyXG5cclxuICAgICAgcmV0dXJuIHJheTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY2xpZW50IHJlY3RhbmdsZSBtYXRjaGluZyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgZ2l2ZW4gcG9pbnQgaW4gd29ybGQgc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50V29ybGRUb0NsaWVudChfcG9zaXRpb246IFZlY3RvcjMpOiBWZWN0b3IyIHtcclxuICAgICAgbGV0IHByb2plY3Rpb246IFZlY3RvcjMgPSB0aGlzLmNhbWVyYS5wb2ludFdvcmxkVG9DbGlwKF9wb3NpdGlvbik7XHJcbiAgICAgIGxldCBwb3NDbGllbnQ6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpcFRvQ2xpZW50KHByb2plY3Rpb24udG9WZWN0b3IyKCkpO1xyXG4gICAgICByZXR1cm4gcG9zQ2xpZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBzb3VyY2UtcmVjdGFuZ2xlIG1hdGNoaW5nIHRoZSBnaXZlbiBwb2ludCBvbiB0aGUgY2xpZW50IHJlY3RhbmdsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRDbGllbnRUb1NvdXJjZShfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCByZXN1bHQ6IFZlY3RvcjIgPSB0aGlzLmZyYW1lQ2xpZW50VG9DYW52YXMuZ2V0UG9pbnQoX2NsaWVudCwgdGhpcy5nZXRDbGllbnRSZWN0YW5nbGUoKSk7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZnJhbWVDYW52YXNUb0Rlc3RpbmF0aW9uLmdldFBvaW50KHJlc3VsdCwgdGhpcy5nZXRDYW52YXNSZWN0YW5nbGUoKSk7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZnJhbWVEZXN0aW5hdGlvblRvU291cmNlLmdldFBvaW50KHJlc3VsdCwgdGhpcy5yZWN0U291cmNlKTtcclxuICAgICAgLy9UT0RPOiB3aGVuIFNvdXJjZSwgUmVuZGVyIGFuZCBSZW5kZXJWaWV3cG9ydCBkZXZpYXRlLCBjb250aW51ZSB0cmFuc2Zvcm1hdGlvbiBcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgcmVuZGVyLXJlY3RhbmdsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIHNvdXJjZSByZWN0YW5nbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50U291cmNlVG9SZW5kZXIoX3NvdXJjZTogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcHJvamVjdGlvblJlY3RhbmdsZTogUmVjdGFuZ2xlID0gdGhpcy5jYW1lcmEuZ2V0UHJvamVjdGlvblJlY3RhbmdsZSgpO1xyXG4gICAgICBsZXQgcG9pbnQ6IFZlY3RvcjIgPSB0aGlzLmZyYW1lU291cmNlVG9SZW5kZXIuZ2V0UG9pbnQoX3NvdXJjZSwgcHJvamVjdGlvblJlY3RhbmdsZSk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHByb2plY3Rpb25SZWN0YW5nbGUudG9TdHJpbmcoKSk7XHJcbiAgICAgIHJldHVybiBwb2ludDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgcmVuZGVyLXJlY3RhbmdsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIGNsaWVudCByZWN0YW5nbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvaW50Q2xpZW50VG9SZW5kZXIoX2NsaWVudDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICBsZXQgcG9pbnQ6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpZW50VG9Tb3VyY2UoX2NsaWVudCk7XHJcbiAgICAgIHBvaW50ID0gdGhpcy5wb2ludFNvdXJjZVRvUmVuZGVyKHBvaW50KTtcclxuICAgICAgLy9UT0RPOiB3aGVuIFJlbmRlciBhbmQgUmVuZGVyVmlld3BvcnQgZGV2aWF0ZSwgY29udGludWUgdHJhbnNmb3JtYXRpb24gXHJcbiAgICAgIHJldHVybiBwb2ludDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwb2ludCBvbiBhIHByb2plY3Rpb24gc3VyZmFjZSBpbiB0aGUgaHlwb3RoZXRpY2FsIGRpc3RhbmNlIG9mIDEgdG8gdGhlIGNhbWVyYSAgXHJcbiAgICAgKiBtYXRjaGluZyB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlIGNsaWVudCByZWN0YW5nbGVcclxuICAgICAqIFRPRE86IGV4YW1pbmUsIGlmIHRoaXMgc2hvdWxkIGJlIGEgY2FtZXJhLW1ldGhvZC4gQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBmb3IgY2VudHJhbC1wcm9qZWN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaWVudFRvUHJvamVjdGlvbihfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBwb3NSZW5kZXI6IFZlY3RvcjIgPSB0aGlzLnBvaW50Q2xpZW50VG9SZW5kZXIoX2NsaWVudCk7XHJcbiAgICAgIGxldCByZWN0UmVuZGVyOiBSZWN0YW5nbGUgPSB0aGlzLmZyYW1lU291cmNlVG9SZW5kZXIuZ2V0UmVjdCh0aGlzLnJlY3RTb3VyY2UpO1xyXG4gICAgICBsZXQgcmVjdFByb2plY3Rpb246IFJlY3RhbmdsZSA9IHRoaXMuY2FtZXJhLmdldFByb2plY3Rpb25SZWN0YW5nbGUoKTtcclxuXHJcbiAgICAgIGxldCBwb3NQcm9qZWN0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgcmVjdFByb2plY3Rpb24ud2lkdGggKiBwb3NSZW5kZXIueCAvIHJlY3RSZW5kZXIud2lkdGgsXHJcbiAgICAgICAgcmVjdFByb2plY3Rpb24uaGVpZ2h0ICogcG9zUmVuZGVyLnkgLyByZWN0UmVuZGVyLmhlaWdodFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcG9zUHJvamVjdGlvbi5zdWJ0cmFjdChuZXcgVmVjdG9yMihyZWN0UHJvamVjdGlvbi53aWR0aCAvIDIsIHJlY3RQcm9qZWN0aW9uLmhlaWdodCAvIDIpKTtcclxuICAgICAgcG9zUHJvamVjdGlvbi55ICo9IC0xO1xyXG5cclxuICAgICAgcmV0dXJuIHBvc1Byb2plY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcG9pbnQgaW4gdGhlIGNsaWVudCByZWN0YW5nbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IGluIG5vcm1lZCBjbGlwc3BhY2UgcmVjdGFuZ2xlLCBcclxuICAgICAqIHdoaWNoIHN0cmV0Y2hlcyBmcm9tIC0xIHRvIDEgaW4gYm90aCBkaW1lbnNpb25zLCB5IHBvaW50aW5nIHVwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaXBUb0NsaWVudChfbm9ybWVkOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIC8vIGxldCByZWN0Q2xpZW50OiBSZWN0YW5nbGUgPSB0aGlzLmdldENsaWVudFJlY3RhbmdsZSgpO1xyXG4gICAgICAvLyBsZXQgcmVzdWx0OiBWZWN0b3IyID0gVmVjdG9yMi5PTkUoMC41KTtcclxuICAgICAgLy8gcmVzdWx0LnggKj0gKF9ub3JtZWQueCArIDEpICogcmVjdENsaWVudC53aWR0aDtcclxuICAgICAgLy8gcmVzdWx0LnkgKj0gKDEgLSBfbm9ybWVkLnkpICogcmVjdENsaWVudC5oZWlnaHQ7XHJcbiAgICAgIC8vIHJlc3VsdC5hZGQocmVjdENsaWVudC5wb3NpdGlvbik7XHJcbiAgICAgIC8vVE9ETzogY2hlY2sgaWYgcmVjdERlc3RpbmF0aW9uIGNhbiBzYWZlbHkgKGFuZCBtb3JlIHBlcmZvbWFudCkgYmUgdXNlZCBpbnN0ZWFkIGdldENsaWVudFJlY3RhbmdsZVxyXG4gICAgICBsZXQgcG9pbnRDbGllbnQ6IFZlY3RvcjIgPSBSZW5kZXIucmVjdENsaXAucG9pbnRUb1JlY3QoX25vcm1lZCwgdGhpcy5yZWN0RGVzdGluYXRpb24pO1xyXG4gICAgICByZXR1cm4gcG9pbnRDbGllbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcG9pbnQgaW4gdGhlIGNsaWVudCByZWN0YW5nbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IGluIG5vcm1lZCBjbGlwc3BhY2UgcmVjdGFuZ2xlLCBcclxuICAgICAqIHdoaWNoIHN0cmV0Y2hlcyBmcm9tIC0xIHRvIDEgaW4gYm90aCBkaW1lbnNpb25zLCB5IHBvaW50aW5nIHVwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb2ludENsaXBUb0NhbnZhcyhfbm9ybWVkOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBwb2ludENhbnZhczogVmVjdG9yMiA9IFJlbmRlci5yZWN0Q2xpcC5wb2ludFRvUmVjdChfbm9ybWVkLCB0aGlzLmdldENhbnZhc1JlY3RhbmdsZSgpKTtcclxuICAgICAgcmV0dXJuIHBvaW50Q2FudmFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHBvaW50IGluIHRoZSBicm93c2VyIHBhZ2UgbWF0Y2hpbmcgdGhlIGdpdmVuIHBvaW50IG9mIHRoZSB2aWV3cG9ydFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9pbnRDbGllbnRUb1NjcmVlbihfY2xpZW50OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgIGxldCBzY3JlZW46IFZlY3RvcjIgPSBuZXcgVmVjdG9yMih0aGlzLiNjYW52YXMub2Zmc2V0TGVmdCArIF9jbGllbnQueCwgdGhpcy4jY2FudmFzLm9mZnNldFRvcCArIF9jbGllbnQueSk7XHJcbiAgICAgIHJldHVybiBzY3JlZW47XHJcbiAgICB9XHJcbiAgICAvLyAjZW5kcmVnaW9uXHJcbiAgfVxyXG59XHJcbiIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERpZmZlcmVudCB4ciBzZXNzaW9uIG1vZGVzIGF2YWlsYWJsZS4gQ291bGQgYmUgZXhwYW5kIHdpdGggbW9yZSBtb2RlcyBpbiB0aGUgZnV0dXJlLlxyXG4gICAqIEBhdXRob3JzIFZhbGVudGluIFNjaG1pZGJlcmdlciwgSEZVLCAyMDIyIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiAgICovXHJcbiAgZXhwb3J0IGVudW0gWFJfU0VTU0lPTl9NT0RFIHtcclxuICAgIElNTUVSU0lWRV9WUiA9IFwiaW1tZXJzaXZlLXZyXCJcclxuICAgIC8vSU1NRVJTSVZFX0FSID0gXCJpbW1lcnNpdmUtYXJcIixcclxuICAgIC8vSU5MSU5FID0gXCJpbmxpbmVcIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlmZmVyZW50IHJlZmVyZW5jZSB2ci1zcGFjZXMgYXZhaWxhYmxlLCBjcmVhdG9yIGhhcyB0byBjaGVjayBpZiB0aGUgc3BhY2UgaXMgc3VwcG9ydGVkIHdpdGggaXRzIGRldmljZS5cclxuICAgKiBDb3VsZCBiZSBleHBhbmQgd2l0aCBtb3JlIGF2YWlsYWJsZSBzcGFjZSB0eXBlcyBpbiB0aGUgZnV0dXJlLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIFhSX1JFRkVSRU5DRV9TUEFDRSB7XHJcbiAgICBWSUVXRVIgPSBcInZpZXdlclwiLFxyXG4gICAgTE9DQUwgPSBcImxvY2FsXCJcclxuICAgIC8vIExPQ0FMX0ZMT09SID0gXCJsb2NhbC1mbG9vclwiLFxyXG4gICAgLy8gQk9VTkRFRF9GTE9PUiA9IFwiYm91bmRlZC1mbG9vclwiLFxyXG4gICAgLy8gVU5CT1VOREVEID0gXCJ1bmJvdW5kZWRcIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogWFJWaWV3cG9ydCAod2ViWFIpLWV4dGVuc2lvbiBvZiBWaWV3cG9ydCwgdG8gZGlzcGxheWluZyBpdHMgYnJhbmNoIG9uIEhlYWQgTW91bnRlZCBhbmQgQVIgKG5vdCBpbXBsZW10ZWQgeWV0KSBEZXZpY2VzIFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBYUlZpZXdwb3J0IGV4dGVuZHMgVmlld3BvcnQge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgeHJWaWV3cG9ydEluc3RhbmNlOiBYUlZpZXdwb3J0ID0gbnVsbDtcclxuICAgIHB1YmxpYyB2ckRldmljZTogQ29tcG9uZW50VlJEZXZpY2UgPSBudWxsO1xyXG4gICAgcHVibGljIHNlc3Npb246IFhSU2Vzc2lvbiA9IG51bGw7XHJcbiAgICBwdWJsaWMgcmVmZXJlbmNlU3BhY2U6IFhSUmVmZXJlbmNlU3BhY2UgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VWUkNvbnRyb2xsZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBwcml2YXRlIHBvc2VNdHg6IE1hdHJpeDR4NCA9IG5ldyBNYXRyaXg0eDQoKTtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgWFJWaWV3cG9ydC54clZpZXdwb3J0SW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVG8gcmV0cmlldmUgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2Ugb2YgeHIgdmlld3BvcnQsIHJlYWRvbmx5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBkZWZhdWx0KCk6IFhSVmlld3BvcnQge1xyXG4gICAgICByZXR1cm4gdGhpcy54clZpZXdwb3J0SW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogQ29ubmVjdHMgdGhlIHZpZXdwb3J0IHRvIHRoZSBnaXZlbiBjYW52YXMgdG8gcmVuZGVyIHRoZSBnaXZlbiBicmFuY2ggdG8gdXNpbmcgdGhlIGdpdmVuIGNhbWVyYS1jb21wb25lbnQsIGFuZCBuYW1lcyB0aGUgdmlld3BvcnQgYXMgZ2l2ZW4uXHJcbiAgICAgICovXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZShfbmFtZTogc3RyaW5nLCBfYnJhbmNoOiBOb2RlLCBfY2FtZXJhWFI6IENvbXBvbmVudFZSRGV2aWNlIC8qIHwgQ29tcG9uZW50Q2FtZXJhQVIqLywgX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgc3VwZXIuaW5pdGlhbGl6ZShfbmFtZSwgX2JyYW5jaCwgX2NhbWVyYVhSLCBfY2FudmFzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBWUiBTZXNzaW9uIGlzIGluaXRpYWxpemVkIGhlcmUsIGFsc28gVlIgLSBDb250cm9sbGVyIGFyZSBpbml0aWFsaXplZCwgaWYgYm9vbGVhbiBpcyB0cnVlLlxyXG4gICAgICogQ3JlYXRvciBoYXMgdG8gY2FsbCBGcmFtZVJlcXVlc3RYUiBhZnRlciB0aGlzIE1ldGhvZCB0byBydW4gdGhlIHZpZXdwb3J0IGluIHZpcnR1YWwgcmVhbGl0eS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemVWUihfdnJTZXNzaW9uTW9kZTogWFJfU0VTU0lPTl9NT0RFID0gWFJfU0VTU0lPTl9NT0RFLklNTUVSU0lWRV9WUiwgX3ZyUmVmZXJlbmNlU3BhY2VUeXBlOiBYUl9SRUZFUkVOQ0VfU1BBQ0UgPSBYUl9SRUZFUkVOQ0VfU1BBQ0UuTE9DQUwsIF92ckNvbnRyb2xsZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgc2Vzc2lvbjogWFJTZXNzaW9uID0gYXdhaXQgbmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uKF92clNlc3Npb25Nb2RlKTtcclxuICAgICAgdGhpcy5yZWZlcmVuY2VTcGFjZSA9IGF3YWl0IHNlc3Npb24ucmVxdWVzdFJlZmVyZW5jZVNwYWNlKF92clJlZmVyZW5jZVNwYWNlVHlwZSk7XHJcbiAgICAgIGF3YWl0IFJlbmRlci5nZXRSZW5kZXJpbmdDb250ZXh0KCkubWFrZVhSQ29tcGF0aWJsZSgpO1xyXG4gICAgICBsZXQgbmF0aXZlU2NhbGVGYWN0b3I6IG51bWJlciA9IFhSV2ViR0xMYXllci5nZXROYXRpdmVGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yKHNlc3Npb24pO1xyXG4gICAgICAvL1RPRE86ICBGaWVsZCBvZiB2aWV3IGvDtm5udGUgYW4gZGVyIFN0ZWxsZSBub2NoIHZlcsOkbmRlcnQgd2VyZGVuLlxyXG4gICAgICBsZXQgYmFzZUxheWVyOiBYUldlYkdMTGF5ZXIgPSBuZXcgWFJXZWJHTExheWVyKHNlc3Npb24sIFJlbmRlci5nZXRSZW5kZXJpbmdDb250ZXh0KCksIHsgZnJhbWVidWZmZXJTY2FsZUZhY3RvcjogbmF0aXZlU2NhbGVGYWN0b3IgfSk7XHJcbiAgICAgIGF3YWl0IHNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoeyBiYXNlTGF5ZXI6IGJhc2VMYXllciB9KTtcclxuICAgICAgUmVuZGVyLnNldEZyYW1lYnVmZmVyVGFyZ2V0KGJhc2VMYXllci5mcmFtZWJ1ZmZlcik7XHJcbiAgICAgIFJlbmRlci5zZXRDYW52YXNTaXplKGJhc2VMYXllci5mcmFtZWJ1ZmZlcldpZHRoLCBiYXNlTGF5ZXIuZnJhbWVidWZmZXJIZWlnaHQpO1xyXG4gICAgICBSZW5kZXIuc2V0UmVuZGVyUmVjdGFuZ2xlKFJlY3RhbmdsZS5HRVQoMCwgMCwgYmFzZUxheWVyLmZyYW1lYnVmZmVyV2lkdGgsIGJhc2VMYXllci5mcmFtZWJ1ZmZlckhlaWdodCkpO1xyXG4gICAgICBSZW5kZXIuYWRqdXN0QXR0YWNobWVudHMoKTtcclxuICAgICAgdGhpcy5hZGp1c3RpbmdGcmFtZXMgPSBmYWxzZTsgLy8gd2ViIHhyIGhhbmRsZXMgdGhpcyBub3dcclxuICAgICAgdGhpcy52ckRldmljZSA9IDxDb21wb25lbnRWUkRldmljZT50aGlzLmNhbWVyYTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlU3BhY2UoKTtcclxuXHJcbiAgICAgIHRoaXMudXNlVlJDb250cm9sbGVyID0gX3ZyQ29udHJvbGxlcjtcclxuICAgICAgaWYgKF92ckNvbnRyb2xsZXIpIHtcclxuICAgICAgICB0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwuY21wVHJhbnNmb3JtID0gbmV3IENvbXBvbmVudFRyYW5zZm9ybSgpO1xyXG4gICAgICAgIHRoaXMudnJEZXZpY2UubGVmdENudHJsLmNtcFRyYW5zZm9ybSA9IG5ldyBDb21wb25lbnRUcmFuc2Zvcm0oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcclxuXHJcbiAgICAgIHRoaXMucHJlcGFyZUJyYW5jaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEFSIHNlc3Npb24gY291bGQgYmUgaW5pdGlhbGl6ZWQgaGVyZS4gVXAgdGlsbCBub3cgbm90IGltcGxlbWVudGVkLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemVBUihfYXJTZXNzaW9uTW9kZTogWFJfU0VTU0lPTl9NT0RFID0gbnVsbCwgX2FyUmVmZXJlbmNlU3BhY2VUeXBlOiBYUl9SRUZFUkVOQ0VfU1BBQ0UgPSBudWxsKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIERlYnVnLmVycm9yKFwiTk9UIElNUExFTUVOVEVEIFlFVCEgQ2hlY2sgb3V0IGluaXRpYWxpemVWUiFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSB4ciB2aWV3cG9ydCBkaXNwbGF5aW5nIGl0cyBicmFuY2guIEJ5IGRlZmF1bHQsIHRoZSB0cmFuc2Zvcm1zIGluIHRoZSBicmFuY2ggYXJlIHJlY2FsY3VsYXRlZCBmaXJzdC5cclxuICAgICAqIFBhc3MgYGZhbHNlYCBpZiBjYWxjdWxhdGlvbiB3YXMgYWxyZWFkeSBkb25lIGZvciB0aGlzIGZyYW1lIFxyXG4gICAgICogQ2FsbGVkIGZyb20gbG9vcCBtZXRob2Qge0BsaW5rIExvb3B9IGFnYWluIHdpdGggdGhlIHhyRnJhbWUgcGFyYW1ldGVyIGhhbmRvdmVyLCBhcyBzb29uIGFzIEZSQU1FX1JFUVVFU1RfWFIgaXMgY2FsbGVkIGZyb20gY3JlYXRvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRyYXcoX3ByZXBhcmVCcmFuY2g6IGJvb2xlYW4gPSB0cnVlLCBfeHJGcmFtZTogWFJGcmFtZSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgaWYgKCF0aGlzLnNlc3Npb24pIHtcclxuICAgICAgICBzdXBlci5kcmF3KF9wcmVwYXJlQnJhbmNoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwb3NlOiBYUlZpZXdlclBvc2UgPSBfeHJGcmFtZT8uZ2V0Vmlld2VyUG9zZSh0aGlzLnJlZmVyZW5jZVNwYWNlKTtcclxuICAgICAgaWYgKCFwb3NlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMudnJEZXZpY2UubXR4TG9jYWwuc2V0KHBvc2UudHJhbnNmb3JtLm1hdHJpeCk7XHJcbiAgICAgIHRoaXMudnJEZXZpY2UubXR4TG9jYWwucm90YXRlWSgxODApOyAvLyByb3RhdGUgYmFjayBiZWNhdXNlIHRoZSBYUiBSaWcgaXMgbG9va2luZyBpbiB0aGUgZGlyZWN0aW9uIG9mIG5lZ2F0aXZlIHpcclxuICAgICAgc3VwZXIucHJlcGFyZShfcHJlcGFyZUJyYW5jaCk7XHJcblxyXG4gICAgICBsZXQgZ2xMYXllcjogWFJXZWJHTExheWVyID0gdGhpcy5zZXNzaW9uLnJlbmRlclN0YXRlLmJhc2VMYXllcjtcclxuICAgICAgZm9yIChsZXQgdmlldyBvZiBwb3NlLnZpZXdzKSB7XHJcbiAgICAgICAgbGV0IHZpZXdwb3J0OiBnbG9iYWxUaGlzLlhSVmlld3BvcnQgPSBnbExheWVyLmdldFZpZXdwb3J0KHZpZXcpO1xyXG4gICAgICAgIFJlbmRlci5zZXRWaWV3cG9ydCh2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTtcclxuICAgICAgICBSZW5kZXIuc2V0U2Npc3NvclRlc3QodHJ1ZSwgdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVzZVZSQ29udHJvbGxlcilcclxuICAgICAgICAgIHRoaXMuc2V0Q29udHJvbGxlckNvbmZpZ3MoX3hyRnJhbWUpO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnJlc2V0V29ybGRUb1ZpZXcoKTsgLy8gVE9ETzogZmluZCBhIGxlc3MgZXhwZW5zaXZlIHdheSB0byBkbyB0aGlzLCBtYXliZSB1c2UgdHdvIGNhbWVyYXNcclxuICAgICAgICB0aGlzLmNhbWVyYS5tdHhQcm9qZWN0aW9uLnNldCh2aWV3LnByb2plY3Rpb25NYXRyaXgpO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLm10eENhbWVyYUludmVyc2Uuc2V0KHZpZXcudHJhbnNmb3JtLmludmVyc2UubWF0cml4KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGh5c2ljc0RlYnVnTW9kZSAhPSBQSFlTSUNTX0RFQlVHTU9ERS5QSFlTSUNfT0JKRUNUU19PTkxZKVxyXG4gICAgICAgICAgUmVuZGVyLmRyYXcodGhpcy5jYW1lcmEpO1xyXG4gICAgICAgIGlmICh0aGlzLnBoeXNpY3NEZWJ1Z01vZGUgIT0gUEhZU0lDU19ERUJVR01PREUuTk9ORSkge1xyXG4gICAgICAgICAgUGh5c2ljcy5kcmF3KHRoaXMuY2FtZXJhLCB0aGlzLnBoeXNpY3NEZWJ1Z01vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVzZXQgZm9yIG90aGVyIHJlbmRlciBvcGVyYXRpb25zIGUuZy4gcGlja2luZ1xyXG4gICAgICBSZW5kZXIuc2V0U2Npc3NvclRlc3QoZmFsc2UpO1xyXG4gICAgICBSZW5kZXIuc2V0UmVuZGVyUmVjdGFuZ2xlKFJlbmRlci5nZXRSZW5kZXJSZWN0YW5nbGUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlIHRoZSByZWZlcmVuY2Ugc3BhY2UgdG8gc2V0IHRoZSBpbml0aWFsIHBvc2l0aW9uL29yaWVudGF0aW9uIG9mIHRoZSB2ciBkZXZpY2UgaW4gYWNjb3JkYW5jZSB0byB0aGUgbm9kZSB0aGUgdnIgZGV2aWNlIGlzIGF0dGFjaGVkIHRvLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRpYWxpemVSZWZlcmVuY2VTcGFjZSgpOiB2b2lkIHtcclxuICAgICAgbGV0IG10eFdvcmxkOiBNYXRyaXg0eDQgPSB0aGlzLnZyRGV2aWNlLm5vZGU/LmdldENvbXBvbmVudChDb21wb25lbnRWUkRldmljZSk/Lm10eFdvcmxkO1xyXG4gICAgICBpZiAoIW10eFdvcmxkKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIG10eFdvcmxkID0gbXR4V29ybGQuY2xvbmU7XHJcbiAgICAgIG10eFdvcmxkLnJvdGF0ZVkoMTgwKTsgLy8gcm90YXRlIGJlY2F1c2UgdGhlIFhSIFJpZyBpcyBsb29raW5nIGluIHRoZSBkaXJlY3Rpb24gb2YgbmVnYXRpdmUgelxyXG4gICAgICBsZXQgaW52TXR4VHJhbnNmb206IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFdvcmxkKTsgLy8gaW52ZXJzZSBiZWNhdXNlIHdlIGFyZSBtb3ZpbmcgdGhlIHJlZmVyZW5jZSBzcGFjZVxyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UgPSBYUlZpZXdwb3J0LmRlZmF1bHQucmVmZXJlbmNlU3BhY2UuZ2V0T2Zmc2V0UmVmZXJlbmNlU3BhY2UobmV3IFhSUmlnaWRUcmFuc2Zvcm0oaW52TXR4VHJhbnNmb20udHJhbnNsYXRpb24sIGludk10eFRyYW5zZm9tLnF1YXRlcm5pb24pKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1NldHMgY29udHJvbGxlciBtYXRyaWNlcyBhbmQgdGh1bWJzdGlja3MgbW92ZW1lbnRzLlxyXG4gICAgcHJpdmF0ZSBzZXRDb250cm9sbGVyQ29uZmlncyhfeHJGcmFtZTogWFJGcmFtZSk6IHZvaWQge1xyXG4gICAgICBpZiAoX3hyRnJhbWUpIHtcclxuICAgICAgICBpZiAoWFJWaWV3cG9ydC5kZWZhdWx0LnNlc3Npb24uaW5wdXRTb3VyY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5zZXNzaW9uLmlucHV0U291cmNlcy5mb3JFYWNoKF9jb250cm9sbGVyID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250cm9sbGVyLmhhbmRlZG5lc3MpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgKFwicmlnaHRcIik6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudnJEZXZpY2UucmlnaHRDbnRybC5jbXBUcmFuc2Zvcm0ubXR4TG9jYWwuc2V0KF94ckZyYW1lLmdldFBvc2UoX2NvbnRyb2xsZXIudGFyZ2V0UmF5U3BhY2UsIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSkudHJhbnNmb3JtLm1hdHJpeCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52ckRldmljZS5yaWdodENudHJsLmdhbWVQYWQpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5yaWdodENudHJsLmdhbWVQYWQgPSBfY29udHJvbGxlci5nYW1lcGFkO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZyRGV2aWNlLnJpZ2h0Q250cmwudGh1bWJzdGlja1ggPSBfY29udHJvbGxlci5nYW1lcGFkLmF4ZXNbMl07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5yaWdodENudHJsLnRodW1ic3RpY2tZID0gX2NvbnRyb2xsZXIuZ2FtZXBhZC5heGVzWzNdO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAoXCJsZWZ0XCIpOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnZyRGV2aWNlLmxlZnRDbnRybC5jbXBUcmFuc2Zvcm0ubXR4TG9jYWwuc2V0KF94ckZyYW1lLmdldFBvc2UoX2NvbnRyb2xsZXIudGFyZ2V0UmF5U3BhY2UsIFhSVmlld3BvcnQuZGVmYXVsdC5yZWZlcmVuY2VTcGFjZSkudHJhbnNmb3JtLm1hdHJpeCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudnJEZXZpY2UubGVmdENudHJsLmdhbWVQYWQpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ckRldmljZS5sZWZ0Q250cmwuZ2FtZVBhZCA9IF9jb250cm9sbGVyLmdhbWVwYWQ7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudnJEZXZpY2UubGVmdENudHJsLnRodW1ic3RpY2tYID0gX2NvbnRyb2xsZXIuZ2FtZXBhZC5heGVzWzJdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudnJEZXZpY2UubGVmdENudHJsLnRodW1ic3RpY2tZID0gX2NvbnRyb2xsZXIuZ2FtZXBhZC5heGVzWzNdO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xyXG4gICAgICAgICAgICAgIERlYnVnLmluZm8oXCJJbnB1dCBTb3VyY2VzIEVycm9yOiBcIiArIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgaW50ZXJmYWNlIE1hcEZpbGVuYW1lVG9Db250ZW50IHtcclxuICAgIFtmaWxlbmFtZTogc3RyaW5nXTogc3RyaW5nO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGZpbGUgdHJhbnNmZXIgZnJvbSBhIEZVREdFLUJyb3dzZXJhcHAgdG8gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gd2l0aG91dCBhIGxvY2FsIHNlcnZlci4gIFxyXG4gICAqIFNhdmVzIHRvIHRoZSBkb3dubG9hZC1wYXRoIGdpdmVuIGJ5IHRoZSBicm93c2VyLCBsb2FkcyBmcm9tIHRoZSBwbGF5ZXIncyBjaG9pY2UuXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIEZpbGVJb0Jyb3dzZXJMb2NhbCBleHRlbmRzIEV2ZW50VGFyZ2V0U3RhdGljIHtcclxuICAgIHByaXZhdGUgc3RhdGljIHNlbGVjdG9yOiBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgLy8gVE9ETzogcmVmYWN0b3IgdG8gYXN5bmMgZnVuY3Rpb24gdG8gYmUgaGFuZGxlZCB1c2luZyBwcm9taXNlLCBpbnN0ZWFkIG9mIHVzaW5nIGV2ZW50IHRhcmdldFxyXG4gICAgLyoqXHJcbiAgICAgKiBPcGVuIGZpbGUgc2VsZWN0IGRpYWxvZyB0byBsb2FkIGZpbGVzIGZyb20gbG9jYWwgZmlsZXN5c3RlbSBpbnRvIGJyb3dzZXIgYXBwbGljYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZChfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8TWFwRmlsZW5hbWVUb0NvbnRlbnQ+IHtcclxuICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IudHlwZSA9IFwiZmlsZVwiO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IubXVsdGlwbGUgPSBfbXVsdGlwbGU7XHJcbiAgICAgIEZpbGVJb0Jyb3dzZXJMb2NhbC5zZWxlY3Rvci5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICBGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBGaWxlSW9Ccm93c2VyTG9jYWwuaGFuZGxlRmlsZVNlbGVjdCk7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yKTtcclxuXHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxNYXBGaWxlbmFtZVRvQ29udGVudD4oX3Jlc29sdmUgPT4ge1xyXG4gICAgICAgIGZ1bmN0aW9uIGhuZExvYWRlZChfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgICBGaWxlSW9Ccm93c2VyTG9jYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5GSUxFX0xPQURFRCwgaG5kTG9hZGVkKTtcclxuICAgICAgICAgIF9yZXNvbHZlKCg8Q3VzdG9tRXZlbnQ+X2V2ZW50KS5kZXRhaWwubWFwRmlsZW5hbWVUb0NvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRklMRV9MT0FERUQsIGhuZExvYWRlZCk7XHJcbiAgICAgICAgRmlsZUlvQnJvd3NlckxvY2FsLnNlbGVjdG9yLmNsaWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHJlZmFjdG9yIHRvIGFzeW5jIGZ1bmN0aW9uIHRvIGJlIGhhbmRsZWQgdXNpbmcgcHJvbWlzZSwgaW5zdGVhZCBvZiB1c2luZyBldmVudCB0YXJnZXRcclxuICAgIC8qKlxyXG4gICAgICogT3BlbiBhIGZpbGUgZG93bmxvYWQgZGlhbG9nIHRvIHNhdmUgZmlsZXMgdG8gbG9jYWwgZmlsZXN5c3RlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzYXZlKF90b1NhdmU6IE1hcEZpbGVuYW1lVG9Db250ZW50LCBfdHlwZTogc3RyaW5nID0gXCJ0ZXh0L3BsYWluXCIpOiBQcm9taXNlPE1hcEZpbGVuYW1lVG9Db250ZW50PiB7XHJcbiAgICAgIGZvciAobGV0IGZpbGVuYW1lIGluIF90b1NhdmUpIHtcclxuICAgICAgICBsZXQgY29udGVudDogc3RyaW5nID0gX3RvU2F2ZVtmaWxlbmFtZV07XHJcbiAgICAgICAgbGV0IGJsb2I6IEJsb2IgPSBuZXcgQmxvYihbY29udGVudF0sIHsgdHlwZTogX3R5cGUgfSk7XHJcbiAgICAgICAgbGV0IHVybDogc3RyaW5nID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgLy8qLyB1c2luZyBhbmNob3IgZWxlbWVudCBmb3IgZG93bmxvYWRcclxuICAgICAgICBsZXQgZG93bmxvYWRlcjogSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICAgICAgZG93bmxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIGRvd25sb2FkZXIuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCB1cmwpO1xyXG4gICAgICAgIGRvd25sb2FkZXIuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgZmlsZW5hbWUpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRlcik7XHJcbiAgICAgICAgZG93bmxvYWRlci5jbGljaygpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZG93bmxvYWRlcik7XHJcbiAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPE1hcEZpbGVuYW1lVG9Db250ZW50PihfcmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgX3Jlc29sdmUoX3RvU2F2ZSk7XHJcbiAgICAgICAgLy8gZnVuY3Rpb24gaG5kU2F2ZWQoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8vICAgRmlsZUlvQnJvd3NlckxvY2FsLnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuRklMRV9TQVZFRCwgaG5kU2F2ZWQpO1xyXG4gICAgICAgIC8vICAgX3Jlc29sdmUoKDxDdXN0b21FdmVudD5fZXZlbnQpLmRldGFpbCk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyBGaWxlSW9Ccm93c2VyTG9jYWwuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5GSUxFX1NBVkVELCBobmRTYXZlZCk7XHJcbiAgICAgICAgLy8gbGV0IGV2ZW50OiBDdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChFVkVOVC5GSUxFX1NBVkVELCB7IGRldGFpbDogeyBtYXBGaWxlbmFtZVRvQ29udGVudDogX3RvU2F2ZSB9IH0pO1xyXG4gICAgICAgIC8vIEZpbGVJb0Jyb3dzZXJMb2NhbC50YXJnZXRTdGF0aWMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZCB0aGUgdGhlIGZpbGVzIHJlZmVyZW5jZWQgaW4ge0BsaW5rIEZpbGVMaXN0fSBpbnRvIHRoZSBwcm92aWRlZCB7QGxpbmsgTWFwRmlsZW5hbWVUb0NvbnRlbnR9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZEZpbGVzKF9maWxlTGlzdDogRmlsZUxpc3QsIF9sb2FkZWQ6IE1hcEZpbGVuYW1lVG9Db250ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGZvciAobGV0IGZpbGUgb2YgX2ZpbGVMaXN0KSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudDogc3RyaW5nID0gYXdhaXQgbmV3IFJlc3BvbnNlKGZpbGUpLnRleHQoKTtcclxuICAgICAgICBfbG9hZGVkW2ZpbGUubmFtZV0gPSBjb250ZW50O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgaGFuZGxlRmlsZVNlbGVjdChfZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIERlYnVnLmZ1ZGdlKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGFuZGxlRmlsZVNlbGVjdFwiKTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGaWxlSW9Ccm93c2VyTG9jYWwuc2VsZWN0b3IpO1xyXG4gICAgICBsZXQgZmlsZUxpc3Q6IEZpbGVMaXN0ID0gKDxIVE1MSW5wdXRFbGVtZW50Pl9ldmVudC50YXJnZXQpLmZpbGVzO1xyXG4gICAgICBEZWJ1Zy5mdWRnZShmaWxlTGlzdCwgZmlsZUxpc3QubGVuZ3RoKTtcclxuICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCA9PSAwKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGxldCBsb2FkZWQ6IE1hcEZpbGVuYW1lVG9Db250ZW50ID0ge307XHJcbiAgICAgIGF3YWl0IEZpbGVJb0Jyb3dzZXJMb2NhbC5sb2FkRmlsZXMoZmlsZUxpc3QsIGxvYWRlZCk7XHJcblxyXG4gICAgICBsZXQgZXZlbnQ6IEN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEVWRU5ULkZJTEVfTE9BREVELCB7IGRldGFpbDogeyBtYXBGaWxlbmFtZVRvQ29udGVudDogbG9hZGVkIH0gfSk7XHJcbiAgICAgIEZpbGVJb0Jyb3dzZXJMb2NhbC50YXJnZXRTdGF0aWMuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59ICIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIE11dGFibGUgYXJyYXkgb2Yge0BsaW5rIE11dGFibGV9cy4gVGhlIHtAbGluayBNdXRhdG9yfXMgb2YgdGhlIGVudHJpZXMgYXJlIGluY2x1ZGVkIGFzIGFycmF5IGluIHRoZSB7QGxpbmsgTXV0YXRvcn1cclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxXHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIE11dGFibGVBcnJheTxUIGV4dGVuZHMgTXV0YWJsZT4gZXh0ZW5kcyBBcnJheTxUPiB7XHJcbiAgICAjdHlwZTogbmV3ICgpID0+IFQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90eXBlOiBuZXcgKCkgPT4gVCwgLi4uX2FyZ3M6IFRbXSkge1xyXG4gICAgICBzdXBlciguLi5fYXJncyk7XHJcbiAgICAgIHRoaXMuI3R5cGUgPSBfdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHR5cGUoKTogbmV3ICgpID0+IFQge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYXJyYW5nZSB0aGUgZW50cmllcyBvZiB0aGUgYXJyYXkgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBpbmRpY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFycmFuZ2UoX3NlcXVlbmNlOiBudW1iZXJbXSk6IHZvaWQge1xyXG4gICAgICBsZXQgbGVuZ3RoOiBudW1iZXIgPSB0aGlzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaW5kZXggb2YgX3NlcXVlbmNlKSB7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsOiBUID0gdGhpc1tpbmRleF07XHJcbiAgICAgICAgLy8gVE9ETzogb3B0aW1pemUsIGNvcHkgb25seSBkb3VibGUgZW50cmllc1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGxldCBjb3B5OiBUID0gbmV3IG9yaWdpbmFsLmNvbnN0cnVjdG9yKCk7XHJcbiAgICAgICAgY29weS5tdXRhdGUob3JpZ2luYWwuZ2V0TXV0YXRvcigpKTtcclxuICAgICAgICB0aGlzLnB1c2goY29weSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zcGxpY2UoMCwgbGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCB0aGlzIGFycmF5cyBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHR5cGVzIGFzIHN0cmluZy12YWx1ZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcjogTXV0YXRvcik6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyB7XHJcbiAgICAgIGxldCB0eXBlczogTXV0YXRvckF0dHJpYnV0ZVR5cGVzID0ge307XHJcbiAgICAgIGZvciAobGV0IGVudHJ5IGluIHRoaXMpXHJcbiAgICAgICAgdHlwZXNbZW50cnldID0gdGhpc1tlbnRyeV0uY29uc3RydWN0b3IubmFtZTtcclxuXHJcbiAgICAgIHJldHVybiB0eXBlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCBlYWNoIGVsZW1lbnRzIG11dGF0b3IgYnkgaW52b2tpbmcge0BsaW5rIE11dGFibGUuZ2V0TXV0YXRvcn0gb24gdGhlbVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcigpOiBNdXRhdG9yIHtcclxuICAgICAgcmV0dXJuIHRoaXMubWFwKChfdmFsdWUpID0+IF92YWx1ZS5nZXRNdXRhdG9yKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VlIHtAbGluayBNdXRhYmxlLmdldE11dGF0b3JGb3JVc2VySW50ZXJmYWNlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvckZvclVzZXJJbnRlcmZhY2UoKTogTXV0YXRvciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE11dGF0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11dGF0ZSBlYWNoIGVsZW1lbnQgb2YgdGhpcyBhcnJheSBieSBpbnZva2luZyB7QGxpbmsgTXV0YWJsZS5tdXRhdGV9IG9uIGl0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtdXRhdGUoX211dGF0b3I6IE11dGF0b3IpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgZm9yIChsZXQgZW50cnkgaW4gdGhpcylcclxuICAgICAgICBhd2FpdCB0aGlzW2VudHJ5XS5tdXRhdGUoX211dGF0b3JbZW50cnldKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gbXV0YXRvciBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGZvciAobGV0IGVudHJ5IGluIHRoaXMpIHtcclxuICAgICAgICBsZXQgbXV0YXRvclZhbHVlOiBPYmplY3QgPSBfbXV0YXRvcltlbnRyeV07XHJcbiAgICAgICAgaWYgKCFtdXRhdG9yVmFsdWUpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICBpZiAodGhpc1tlbnRyeV0gaW5zdGFuY2VvZiBNdXRhYmxlKVxyXG4gICAgICAgICAgX211dGF0b3JbZW50cnldID0gdGhpc1tlbnRyeV0uZ2V0TXV0YXRvcigpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIF9tdXRhdG9yW2VudHJ5XSA9IHRoaXNbZW50cnldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGVudW0gTU9ERSB7XHJcbiAgICBFRElUT1IsIFJVTlRJTUVcclxuICB9XHJcblxyXG4gIGV4cG9ydCBlbnVtIFJFU09VUkNFX1NUQVRVUyB7XHJcbiAgICBQRU5ESU5HLCBSRUFEWSwgRVJST1JcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbCBleHRlbmRzIFNlcmlhbGl6YWJsZVJlc291cmNlIHtcclxuICAgIHVybDogUmVxdWVzdEluZm87XHJcbiAgICBzdGF0dXM6IFJFU09VUkNFX1NUQVRVUztcclxuICAgIGxvYWQoKTogUHJvbWlzZTxTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsPjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlUmVzb3VyY2UgZXh0ZW5kcyBTZXJpYWxpemFibGUge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgaWRSZXNvdXJjZTogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZXMge1xyXG4gICAgW2lkUmVzb3VyY2U6IHN0cmluZ106IFNlcmlhbGl6YWJsZVJlc291cmNlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemF0aW9uT2ZSZXNvdXJjZXMge1xyXG4gICAgW2lkUmVzb3VyY2U6IHN0cmluZ106IFNlcmlhbGl6YXRpb247XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIFNjcmlwdE5hbWVzcGFjZXMge1xyXG4gICAgW25hbWU6IHN0cmluZ106IE9iamVjdDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50U2NyaXB0cyB7XHJcbiAgICBbbmFtZXNwYWNlOiBzdHJpbmddOiBDb21wb25lbnRTY3JpcHRbXTtcclxuICB9XHJcblxyXG4gIGludGVyZmFjZSBHcmFwaEluc3RhbmNlc1RvUmVzeW5jIHtcclxuICAgIFtpZFJlc291cmNlOiBzdHJpbmddOiBHcmFwaEluc3RhbmNlW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGF0aWMgY2xhc3MgaGFuZGxpbmcgdGhlIHJlc291cmNlcyB1c2VkIHdpdGggdGhlIGN1cnJlbnQgRlVER0UtaW5zdGFuY2UuICBcclxuICAgKiBLZWVwcyBhIGxpc3Qgb2YgdGhlIHJlc291cmNlcyBhbmQgZ2VuZXJhdGVzIGlkcyB0byByZXRyaWV2ZSB0aGVtLiAgXHJcbiAgICogUmVzb3VyY2VzIGFyZSBvYmplY3RzIHJlZmVyZW5jZWQgbXVsdGlwbGUgdGltZXMgYnV0IHN1cHBvc2VkIHRvIGJlIHN0b3JlZCBvbmx5IG9uY2VcclxuICAgKi9cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgUHJvamVjdCBleHRlbmRzIEV2ZW50VGFyZ2V0U3RhdGljIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVzb3VyY2VzOiBSZXNvdXJjZXMgPSB7fTtcclxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbk9mUmVzb3VyY2VzID0ge307XHJcbiAgICBwdWJsaWMgc3RhdGljIHNjcmlwdE5hbWVzcGFjZXM6IFNjcmlwdE5hbWVzcGFjZXMgPSB7fTtcclxuICAgIHB1YmxpYyBzdGF0aWMgYmFzZVVSTDogVVJMID0gbmV3IFVSTChsb2NhdGlvbi50b1N0cmluZygpKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgbW9kZTogTU9ERSA9IE1PREUuUlVOVElNRTtcclxuICAgIHB1YmxpYyBzdGF0aWMgZ3JhcGhJbnN0YW5jZXNUb1Jlc3luYzogR3JhcGhJbnN0YW5jZXNUb1Jlc3luYyA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJzIHRoZSByZXNvdXJjZSBhbmQgZ2VuZXJhdGVzIGFuIGlkIGZvciBpdCBieSBkZWZhdWx0LiAgXHJcbiAgICAgKiBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBoYXMgYW4gaWQsIHRodXMgaGF2aW5nIGJlZW4gcmVnaXN0ZXJlZCwgaXRzIGRlbGV0ZWQgZnJvbSB0aGUgbGlzdCBhbmQgcmVnaXN0ZXJlZCBhbmV3LlxyXG4gICAgICogSXQncyBwb3NzaWJsZSB0byBwYXNzIGFuIGlkLCBidXQgc2hvdWxkIG5vdCBiZSBkb25lIGV4Y2VwdCBieSB0aGUgU2VyaWFsaXplci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWdpc3RlcihfcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlLCBfaWRSZXNvdXJjZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBpZiAoX3Jlc291cmNlLmlkUmVzb3VyY2UgJiYgX3Jlc291cmNlLmlkUmVzb3VyY2UgPT0gX2lkUmVzb3VyY2UpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKF9yZXNvdXJjZS5pZFJlc291cmNlKSAvLyBkZXJlZ2lzdGVyIHRoZSBvbGQgaWRcclxuICAgICAgICB0aGlzLmRlcmVnaXN0ZXIoX3Jlc291cmNlKTtcclxuXHJcbiAgICAgIGlmIChfaWRSZXNvdXJjZSkge1xyXG4gICAgICAgIF9yZXNvdXJjZS5pZFJlc291cmNlID0gX2lkUmVzb3VyY2U7XHJcbiAgICAgICAgdGhpcy5kZXJlZ2lzdGVyKF9yZXNvdXJjZSk7IC8vIGRlcmVnaXN0ZXIgdGhlIG5ldyBpZFxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIV9yZXNvdXJjZS5pZFJlc291cmNlKVxyXG4gICAgICAgIF9yZXNvdXJjZS5pZFJlc291cmNlID0gUHJvamVjdC5nZW5lcmF0ZUlkKF9yZXNvdXJjZSk7XHJcblxyXG4gICAgICBQcm9qZWN0LnJlc291cmNlc1tfcmVzb3VyY2UuaWRSZXNvdXJjZV0gPSBfcmVzb3VyY2U7XHJcblxyXG4gICAgICBpZiAoX3Jlc291cmNlIGluc3RhbmNlb2YgR3JhcGgpXHJcbiAgICAgICAgX3Jlc291cmNlLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR1JBUEhfTVVUQVRFRCwgKF9ldmVudDogRXZlbnQpID0+IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoRVZFTlQuR1JBUEhfTVVUQVRFRCwgeyBkZXRhaWw6IF9yZXNvdXJjZSB9KSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgbGlzdCBvZiByZXNvdXJjZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVyZWdpc3RlcihfcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSAoUHJvamVjdC5yZXNvdXJjZXNbX3Jlc291cmNlLmlkUmVzb3VyY2VdKTtcclxuICAgICAgZGVsZXRlIChQcm9qZWN0LnNlcmlhbGl6YXRpb25bX3Jlc291cmNlLmlkUmVzb3VyY2VdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgbGlzdCBvZiByZXNvdXJjZXMgYW5kIHRoZWlyIHNlcmlhbGl6YXRpb24sIHRodXMgcmVtb3ZpbmcgYWxsIHJlc291cmNlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgUHJvamVjdC5yZXNvdXJjZXMgPSB7fTtcclxuICAgICAgUHJvamVjdC5zZXJpYWxpemF0aW9uID0ge307XHJcbiAgICAgIFByb2plY3QuY2xlYXJTY3JpcHROYW1lc3BhY2VzKCk7XHJcbiAgICAgIC8vIFByb2plY3Quc2NyaXB0TmFtZXNwYWNlcyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDxUIGV4dGVuZHMgQ29tcG9uZW50PihfY2xhc3M6IG5ldyAoKSA9PiBUKTogVFtdIHtcclxuICAgIC8vICAgcmV0dXJuIDxUW10+KHRoaXMuY29tcG9uZW50c1tfY2xhc3MubmFtZV0gfHwgW10pLnNsaWNlKDApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgcmVzb3VyY2VzIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZXNvdXJjZXNCeVR5cGU8VD4oX3R5cGU6IG5ldyAoX2FyZ3M6IEdlbmVyYWwpID0+IFQpOiBTZXJpYWxpemFibGVSZXNvdXJjZVtdIHtcclxuICAgICAgbGV0IGZvdW5kOiBTZXJpYWxpemFibGVSZXNvdXJjZVtdID0gW107XHJcbiAgICAgIGZvciAobGV0IHJlc291cmNlSWQgaW4gUHJvamVjdC5yZXNvdXJjZXMpIHtcclxuICAgICAgICBsZXQgcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlID0gUHJvamVjdC5yZXNvdXJjZXNbcmVzb3VyY2VJZF07XHJcbiAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgX3R5cGUpXHJcbiAgICAgICAgICBmb3VuZC5wdXNoKHJlc291cmNlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZm91bmQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCByZXNvdXJjZXMgd2l0aCB0aGUgcmVxdWVzdGVkIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVzb3VyY2VzQnlOYW1lKF9uYW1lOiBzdHJpbmcpOiBTZXJpYWxpemFibGVSZXNvdXJjZVtdIHtcclxuICAgICAgbGV0IGZvdW5kOiBTZXJpYWxpemFibGVSZXNvdXJjZVtdID0gW107XHJcbiAgICAgIGZvciAobGV0IHJlc291cmNlSWQgaW4gUHJvamVjdC5yZXNvdXJjZXMpIHtcclxuICAgICAgICBsZXQgcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlID0gUHJvamVjdC5yZXNvdXJjZXNbcmVzb3VyY2VJZF07XHJcbiAgICAgICAgaWYgKHJlc291cmNlLm5hbWUgPT0gX25hbWUpXHJcbiAgICAgICAgICBmb3VuZC5wdXNoKHJlc291cmNlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZm91bmQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGUgYSB1c2VyIHJlYWRhYmxlIGFuZCB1bmlxdWUgaWQgdXNpbmcgdGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLCB0aGUgZGF0ZSBhbmQgcmFuZG9tIG51bWJlcnNcclxuICAgICAqIEBwYXJhbSBfcmVzb3VyY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUlkKF9yZXNvdXJjZTogU2VyaWFsaXphYmxlUmVzb3VyY2UpOiBzdHJpbmcge1xyXG4gICAgICAvLyBUT0RPOiBidWlsZCBpZCBhbmQgaW50ZWdyYXRlIGluZm8gZnJvbSByZXNvdXJjZSwgbm90IGp1c3QgZGF0ZVxyXG4gICAgICBsZXQgaWRSZXNvdXJjZTogc3RyaW5nO1xyXG4gICAgICBkb1xyXG4gICAgICAgIGlkUmVzb3VyY2UgPSBfcmVzb3VyY2UuY29uc3RydWN0b3IubmFtZSArIFwifFwiICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpICsgXCJ8XCIgKyBNYXRoLnJhbmRvbSgpLnRvUHJlY2lzaW9uKDUpLnN1YnN0cigyLCA1KTtcclxuICAgICAgd2hpbGUgKFByb2plY3QucmVzb3VyY2VzW2lkUmVzb3VyY2VdKTtcclxuICAgICAgcmV0dXJuIGlkUmVzb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0cywgaWYgYW4gb2JqZWN0IGlzIGEge0BsaW5rIFNlcmlhbGl6YWJsZVJlc291cmNlfVxyXG4gICAgICogQHBhcmFtIF9vYmplY3QgVGhlIG9iamVjdCB0byBleGFtaW5lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNSZXNvdXJjZShfb2JqZWN0OiBTZXJpYWxpemFibGUpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIChSZWZsZWN0Lmhhcyhfb2JqZWN0LCBcImlkUmVzb3VyY2VcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSByZXNvdXJjZSBzdG9yZWQgd2l0aCB0aGUgZ2l2ZW4gaWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZXRSZXNvdXJjZShfaWRSZXNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxTZXJpYWxpemFibGVSZXNvdXJjZT4ge1xyXG4gICAgICBsZXQgcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlID0gUHJvamVjdC5yZXNvdXJjZXNbX2lkUmVzb3VyY2VdO1xyXG4gICAgICBpZiAoIXJlc291cmNlKSB7XHJcbiAgICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBQcm9qZWN0LnNlcmlhbGl6YXRpb25bX2lkUmVzb3VyY2VdO1xyXG4gICAgICAgIGlmICghc2VyaWFsaXphdGlvbikge1xyXG4gICAgICAgICAgRGVidWcuZXJyb3IoXCJSZXNvdXJjZSBub3QgZm91bmRcIiwgX2lkUmVzb3VyY2UpO1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc291cmNlID0gYXdhaXQgUHJvamVjdC5kZXNlcmlhbGl6ZVJlc291cmNlKHNlcmlhbGl6YXRpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJlZ2lzdGVycyBhIHJlc291cmNlIGZyb20gYSB7QGxpbmsgTm9kZX0sIGNvcHlpbmcgdGhlIGNvbXBsZXRlIGdyYXBoIHN0YXJ0aW5nIHdpdGggaXRcclxuICAgICAqIEBwYXJhbSBfbm9kZSBBIG5vZGUgdG8gY3JlYXRlIHRoZSByZXNvdXJjZSBmcm9tXHJcbiAgICAgKiBAcGFyYW0gX3JlcGxhY2VXaXRoSW5zdGFuY2UgaWYgdHJ1ZSAoZGVmYXVsdCksIHRoZSBub2RlIHVzZWQgYXMgb3JpZ2luIGlzIHJlcGxhY2VkIGJ5IGEge0BsaW5rIEdyYXBoSW5zdGFuY2V9IG9mIHRoZSB7QGxpbmsgR3JhcGh9IGNyZWF0ZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyByZWdpc3RlckFzR3JhcGgoX25vZGU6IE5vZGUsIF9yZXBsYWNlV2l0aEluc3RhbmNlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8R3JhcGg+IHtcclxuICAgICAgbGV0IHNlcmlhbGl6YXRpb246IFNlcmlhbGl6YXRpb24gPSBfbm9kZS5zZXJpYWxpemUoKTtcclxuICAgICAgbGV0IGdyYXBoOiBHcmFwaCA9IG5ldyBHcmFwaChfbm9kZS5uYW1lKTtcclxuICAgICAgYXdhaXQgZ3JhcGguZGVzZXJpYWxpemUoc2VyaWFsaXphdGlvbik7XHJcbiAgICAgIFByb2plY3QucmVnaXN0ZXIoZ3JhcGgpO1xyXG5cclxuICAgICAgaWYgKF9yZXBsYWNlV2l0aEluc3RhbmNlICYmIF9ub2RlLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgbGV0IGluc3RhbmNlOiBHcmFwaEluc3RhbmNlID0gYXdhaXQgUHJvamVjdC5jcmVhdGVHcmFwaEluc3RhbmNlKGdyYXBoKTtcclxuICAgICAgICBfbm9kZS5nZXRQYXJlbnQoKS5yZXBsYWNlQ2hpbGQoX25vZGUsIGluc3RhbmNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGdyYXBoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHtAbGluayBHcmFwaEluc3RhbmNlfSBvZiB0aGUgZ2l2ZW4ge0BsaW5rIEdyYXBofSBcclxuICAgICAqIGFuZCBjb25uZWN0cyBpdCB0byB0aGUgZ3JhcGggZm9yIHN5bmNocm9uaXNhdGlvbiBvZiBtdXRhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVHcmFwaEluc3RhbmNlKF9ncmFwaDogR3JhcGgpOiBQcm9taXNlPEdyYXBoSW5zdGFuY2U+IHtcclxuICAgICAgbGV0IGluc3RhbmNlOiBHcmFwaEluc3RhbmNlID0gbmV3IEdyYXBoSW5zdGFuY2UoX2dyYXBoKTsgLy8gVE9ETzogY2xlYW51cCBzaW5jZSBjcmVhdGlvbiBtb3ZlZCBoZXJlXHJcbiAgICAgIGF3YWl0IGluc3RhbmNlLmNvbm5lY3RUb0dyYXBoKCk7XHJcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIHRoZSBnaXZlbiB7QGxpbmsgR3JhcGhJbnN0YW5jZX0gdG8gYmUgcmVzeW5jZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWdpc3RlckdyYXBoSW5zdGFuY2VGb3JSZXN5bmMoX2luc3RhbmNlOiBHcmFwaEluc3RhbmNlKTogdm9pZCB7XHJcbiAgICAgIGxldCBpbnN0YW5jZXM6IEdyYXBoSW5zdGFuY2VbXSA9IFByb2plY3QuZ3JhcGhJbnN0YW5jZXNUb1Jlc3luY1tfaW5zdGFuY2UuaWRTb3VyY2VdIHx8IFtdO1xyXG4gICAgICBpbnN0YW5jZXMucHVzaChfaW5zdGFuY2UpO1xyXG4gICAgICBQcm9qZWN0LmdyYXBoSW5zdGFuY2VzVG9SZXN5bmNbX2luc3RhbmNlLmlkU291cmNlXSA9IGluc3RhbmNlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3luYyBhbGwge0BsaW5rIEdyYXBoSW5zdGFuY2V9IHJlZ2lzdGVyZWQgdG8gdGhlIGdpdmVuIHtAbGluayBHcmFwaH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyByZXN5bmNHcmFwaEluc3RhbmNlcyhfZ3JhcGg6IEdyYXBoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBpbnN0YW5jZXM6IEdyYXBoSW5zdGFuY2VbXSA9IFByb2plY3QuZ3JhcGhJbnN0YW5jZXNUb1Jlc3luY1tfZ3JhcGguaWRSZXNvdXJjZV07XHJcbiAgICAgIGlmICghaW5zdGFuY2VzKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgZm9yIChsZXQgaW5zdGFuY2Ugb2YgaW5zdGFuY2VzKVxyXG4gICAgICAgIGF3YWl0IGluc3RhbmNlLmNvbm5lY3RUb0dyYXBoKCk7XHJcbiAgICAgIGRlbGV0ZSAoUHJvamVjdC5ncmFwaEluc3RhbmNlc1RvUmVzeW5jW19ncmFwaC5pZFJlc291cmNlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIHRvIHRoZSBsaXN0IG9mIHNjcmlwdC1uYW1lc3BhY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyU2NyaXB0TmFtZXNwYWNlKF9uYW1lc3BhY2U6IE9iamVjdCk6IHZvaWQge1xyXG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gU2VyaWFsaXplci5yZWdpc3Rlck5hbWVzcGFjZShfbmFtZXNwYWNlKTtcclxuICAgICAgaWYgKCFQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXNbbmFtZV0pXHJcbiAgICAgICAgUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzW25hbWVdID0gX25hbWVzcGFjZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFyIHRoZSBsaXN0IG9mIHNjcmlwdC1uYW1lc3BhY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyU2NyaXB0TmFtZXNwYWNlcygpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXMpIHtcclxuICAgICAgICBSZWZsZWN0LnNldCh3aW5kb3csIG5hbWUsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzW25hbWVdID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGRlbGV0ZSBQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXNbbmFtZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbGxlY3RzIGFsbCB7QGxpbmsgQ29tcG9uZW50U2NyaXB0fXMgcmVnaXN0ZXJlZCBpbiB7QGxpbmsgUHJvamVjdC5zY3JpcHROYW1lc3BhY2VzfSBhbmQgcmV0dXJucyB0aGVtLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvbXBvbmVudFNjcmlwdHMoKTogQ29tcG9uZW50U2NyaXB0cyB7XHJcbiAgICAgIGxldCBjb21wb21lbnRzOiBDb21wb25lbnRTY3JpcHRzID0ge307XHJcbiAgICAgIGZvciAobGV0IG5hbWVzcGFjZSBpbiBQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXMpIHtcclxuICAgICAgICBjb21wb21lbnRzW25hbWVzcGFjZV0gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIFByb2plY3Quc2NyaXB0TmFtZXNwYWNlc1tuYW1lc3BhY2VdKSB7XHJcbiAgICAgICAgICBsZXQgc2NyaXB0OiBDb21wb25lbnRTY3JpcHQgPSBSZWZsZWN0LmdldChQcm9qZWN0LnNjcmlwdE5hbWVzcGFjZXNbbmFtZXNwYWNlXSwgbmFtZSk7XHJcbiAgICAgICAgICAvLyBVc2luZyBPYmplY3QuY3JlYXRlIGRvZXNuJ3QgY2FsbCB0aGUgY29uc3RydWN0b3IsIGJ1dCBpbnN0YW5jZW9mIGNhbiBiZSB1c2VkLiBNb3JlIGVsZWdhbnQgdGhhbiB0aGUgbG9vcCBhYm92ZSwgdGhvdWdoIG1heWJlIG5vdCBhcyBwZXJmb3JtYW50LiBcclxuXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgbzogR2VuZXJhbCA9IE9iamVjdC5jcmVhdGUoc2NyaXB0KTtcclxuICAgICAgICAgICAgaWYgKG8ucHJvdG90eXBlIGluc3RhbmNlb2YgQ29tcG9uZW50U2NyaXB0KVxyXG4gICAgICAgICAgICAgIGNvbXBvbWVudHNbbmFtZXNwYWNlXS5wdXNoKHNjcmlwdCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChfZSkgeyAvKiAqLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjb21wb21lbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgYSBzY3JpcHQgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBpbnRlZ3JhdGVzIGl0IGludG8gYSB7QGxpbmsgSFRNTFNjcmlwdEVsZW1lbnR9IGluIHRoZSB7QGxpbmsgZG9jdW1lbnQuaGVhZH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBsb2FkU2NyaXB0KF91cmw6IFJlcXVlc3RJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBzY3JpcHQ6IEhUTUxTY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcclxuICAgICAgc2NyaXB0LnR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiO1xyXG4gICAgICAvLyBzY3JpcHQudHlwZSA9IFwibW9kdWxlXCI7XHJcbiAgICAgIHNjcmlwdC5hc3luYyA9IGZhbHNlO1xyXG4gICAgICAvLyBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgaGFuZGxlTG9hZGVkU2NyaXB0KVxyXG4gICAgICBsZXQgaGVhZDogSFRNTEhlYWRFbGVtZW50ID0gZG9jdW1lbnQuaGVhZDtcclxuICAgICAgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG4gICAgICBEZWJ1Zy5sb2coXCJMb2FkaW5nOiBcIiwgX3VybCk7XHJcblxyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IF9yZXNvbHZlKCkpO1xyXG4gICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgRGVidWcuZXJyb3IoXCJMb2FkaW5nIHNjcmlwdFwiLCBfdXJsKTtcclxuICAgICAgICAgIF9yZWplY3QoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzY3JpcHQuc3JjID0gX3VybC50b1N0cmluZygpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWQge0BsaW5rIFJlc291cmNlc30gZnJvbSB0aGUgZ2l2ZW4gdXJsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZFJlc291cmNlcyhfdXJsOiBSZXF1ZXN0SW5mbyk6IFByb21pc2U8UmVzb3VyY2VzPiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZSA9IGF3YWl0IGZldGNoKF91cmwpO1xyXG4gICAgICBjb25zdCByZXNvdXJjZUZpbGVDb250ZW50OiBzdHJpbmcgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XHJcblxyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbiA9IFNlcmlhbGl6ZXIucGFyc2UocmVzb3VyY2VGaWxlQ29udGVudCk7XHJcbiAgICAgIGxldCByZWNvbnN0cnVjdGlvbjogUmVzb3VyY2VzID0gYXdhaXQgUHJvamVjdC5kZXNlcmlhbGl6ZShzZXJpYWxpemF0aW9uKTtcclxuICAgICAgUHJvamVjdC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChFVkVOVC5SRVNPVVJDRVNfTE9BREVELCB7IGRldGFpbDogeyB1cmw6IF91cmwsIHJlc291cmNlczogcmVjb25zdHJ1Y3Rpb24gfSB9KSk7XHJcbiAgICAgIHJldHVybiByZWNvbnN0cnVjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWQgYWxsIHJlc291cmNlcyBmcm9tIHRoZSB7QGxpbmsgZG9jdW1lbnQuaGVhZH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBsb2FkUmVzb3VyY2VzRnJvbUhUTUwoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGNvbnN0IGhlYWQ6IEhUTUxIZWFkRWxlbWVudCA9IGRvY3VtZW50LmhlYWQ7XHJcbiAgICAgIGxldCBsaW5rczogTm9kZUxpc3RPZjxIVE1MTGlua0VsZW1lbnQ+ID0gaGVhZC5xdWVyeVNlbGVjdG9yQWxsKFwibGlua1t0eXBlPXJlc291cmNlc11cIik7XHJcbiAgICAgIGZvciAobGV0IGxpbmsgb2YgbGlua3MpIHtcclxuICAgICAgICBsZXQgdXJsOiBSZXF1ZXN0SW5mbyA9IGxpbmsuZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xyXG4gICAgICAgIGF3YWl0IFByb2plY3QubG9hZFJlc291cmNlcyh1cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemUgYWxsIHJlc291cmNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemF0aW9uT2ZSZXNvdXJjZXMge1xyXG4gICAgICBsZXQgc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbk9mUmVzb3VyY2VzID0ge307XHJcbiAgICAgIGZvciAobGV0IGlkUmVzb3VyY2UgaW4gUHJvamVjdC5yZXNvdXJjZXMpIHtcclxuICAgICAgICBsZXQgcmVzb3VyY2U6IFNlcmlhbGl6YWJsZVJlc291cmNlID0gUHJvamVjdC5yZXNvdXJjZXNbaWRSZXNvdXJjZV07XHJcbiAgICAgICAgaWYgKGlkUmVzb3VyY2UgIT0gcmVzb3VyY2UuaWRSZXNvdXJjZSlcclxuICAgICAgICAgIERlYnVnLmVycm9yKFwiUmVzb3VyY2UtaWQgbWlzbWF0Y2hcIiwgcmVzb3VyY2UpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25baWRSZXNvdXJjZV0gPSBTZXJpYWxpemVyLnNlcmlhbGl6ZShyZXNvdXJjZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgcmVzb3VyY2VzIGZyb20gYSBzZXJpYWxpemF0aW9uLCBkZWxldGluZyBhbGwgcmVzb3VyY2VzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZFxyXG4gICAgICogQHBhcmFtIF9zZXJpYWxpemF0aW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uT2ZSZXNvdXJjZXMpOiBQcm9taXNlPFJlc291cmNlcz4ge1xyXG4gICAgICBQcm9qZWN0LnNlcmlhbGl6YXRpb24gPSBfc2VyaWFsaXphdGlvbjtcclxuICAgICAgUHJvamVjdC5yZXNvdXJjZXMgPSB7fTtcclxuICAgICAgZm9yIChsZXQgaWRSZXNvdXJjZSBpbiBfc2VyaWFsaXphdGlvbikge1xyXG4gICAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0gX3NlcmlhbGl6YXRpb25baWRSZXNvdXJjZV07XHJcbiAgICAgICAgbGV0IHJlc291cmNlOiBTZXJpYWxpemFibGVSZXNvdXJjZSA9IGF3YWl0IFByb2plY3QuZGVzZXJpYWxpemVSZXNvdXJjZShzZXJpYWxpemF0aW9uKTtcclxuICAgICAgICBpZiAocmVzb3VyY2UpXHJcbiAgICAgICAgICBQcm9qZWN0LnJlc291cmNlc1tpZFJlc291cmNlXSA9IHJlc291cmNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBQcm9qZWN0LnJlc291cmNlcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBkZXNlcmlhbGl6ZVJlc291cmNlKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGVSZXNvdXJjZT4ge1xyXG4gICAgICByZXR1cm4gPFByb21pc2U8U2VyaWFsaXphYmxlUmVzb3VyY2U+PlNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGQlgge1xyXG4gIC8qKlxyXG4gICAqIFJlYWRlciB0byByZWFkIGRhdGEgZnJvbSBhbiBhcnJheSBidWZmZXIgbW9yZSBjb252ZW5pZW50bHkuXHJcbiAgICogSXQgc2F2ZXMgYSBjdXJyZW50IG9mZnNldCB3aGljaCBpcyB1cGRhdGVkIHdoZW4gZGF0YSBpcyByZWFkIGR1ZSB0byBpdHMgYnl0ZWxlbmd0aC5cclxuICAgKiBkZXNwaXRlIGdldFNlcXVlbmNlIGl0IGlzIG1vc3RseSBhIGNvcHkgb2YgdGhlIHJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL3BpY29kZTcvYmluYXJ5LXJlYWRlclxyXG4gICAqIEBhdXRob3IgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgQnVmZmVyUmVhZGVyIHtcclxuICAgIHB1YmxpYyBvZmZzZXQ6IG51bWJlcjtcclxuICAgIHB1YmxpYyByZWFkb25seSB2aWV3OiBEYXRhVmlldztcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX2J1ZmZlcjogQXJyYXlCdWZmZXIpIHtcclxuICAgICAgdGhpcy52aWV3ID0gbmV3IERhdGFWaWV3KF9idWZmZXIpO1xyXG4gICAgICB0aGlzLm9mZnNldCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYXIoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmdldFVpbnQ4KF9vZmZzZXQpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Qm9vbChfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRVaW50OChfb2Zmc2V0KSAhPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRVaW50OChfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDE7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0VWludDgoX29mZnNldCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFVpbnQzMihfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDQ7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0VWludDMyKF9vZmZzZXQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRVaW50NjQoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBiaWdpbnQge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyA4O1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldEJpZ1VpbnQ2NChfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SW50MTYoX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBudW1iZXIge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQgKyAyO1xyXG4gICAgICByZXR1cm4gdGhpcy52aWV3LmdldEludDE2KF9vZmZzZXQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbnQzMihfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDQ7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0SW50MzIoX29mZnNldCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEludDY0KF9vZmZzZXQ6IG51bWJlciA9IHRoaXMub2Zmc2V0KTogYmlnaW50IHtcclxuICAgICAgdGhpcy5vZmZzZXQgPSBfb2Zmc2V0ICsgODtcclxuICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRCaWdJbnQ2NChfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RmxvYXQzMihfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDQ7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQzMihfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RmxvYXQ2NChfb2Zmc2V0OiBudW1iZXIgPSB0aGlzLm9mZnNldCk6IG51bWJlciB7XHJcbiAgICAgIHRoaXMub2Zmc2V0ID0gX29mZnNldCArIDg7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQ2NChfb2Zmc2V0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U3RyaW5nKF9sZW5ndGg6IG51bWJlciwgX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi50aGlzLmdldFNlcXVlbmNlKHRoaXMuZ2V0VWludDgsIF9sZW5ndGgsIF9vZmZzZXQpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgKmdldFNlcXVlbmNlPFQgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KF9nZXR0ZXI6ICgpID0+IFQsIF9sZW5ndGg6IG51bWJlciwgX29mZnNldDogbnVtYmVyID0gdGhpcy5vZmZzZXQpOiBHZW5lcmF0b3I8VD4ge1xyXG4gICAgICB0aGlzLm9mZnNldCA9IF9vZmZzZXQ7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBfbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB5aWVsZCBfZ2V0dGVyLmNhbGwodGhpcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRkJYIHtcclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgdG8gcmVwcmVzZW50IGZieCBmaWxlcyBjb250YWluaW5nIGl0cyBkb2N1bWVudHMsIGRlZmluaXRpb25zLCBvYmplY3RzIGFuZCBjb25uZWN0aW9ucy5cclxuICAgKiBJdHMgb2JqZWN0cyBhcmUgZGV2aWRlZCBpbiBhbGwgYW5kIHRoZSBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzLlxyXG4gICAqIEBhdXRob3IgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEZCWCB7XHJcbiAgICBkb2N1bWVudHM6IERvY3VtZW50W107XHJcbiAgICBkZWZpbml0aW9ucz86IERlZmluaXRpb25zO1xyXG4gICAgb2JqZWN0czoge1xyXG4gICAgICBhbGw6IE9iamVjdFtdO1xyXG4gICAgICBtb2RlbHM6IE1vZGVsW107XHJcbiAgICAgIGdlb21ldHJpZXM6IEdlb21ldHJ5W107XHJcbiAgICAgIHBvc2VzOiBPYmplY3RbXTtcclxuICAgICAgbWF0ZXJpYWxzOiBNYXRlcmlhbFtdO1xyXG4gICAgICB0ZXh0dXJlczogVGV4dHVyZVtdO1xyXG4gICAgICBhbmltU3RhY2tzOiBPYmplY3RbXTtcclxuICAgIH07XHJcbiAgICBjb25uZWN0aW9uczogQ29ubmVjdGlvbltdO1xyXG4gIH1cclxuXHJcbiAgaW50ZXJmYWNlIE9iamVjdEJhc2Uge1xyXG4gICAgdWlkOiBudW1iZXI7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICB0eXBlPzogc3RyaW5nO1xyXG4gICAgc3VidHlwZT86IHN0cmluZztcclxuICAgIGNoaWxkcmVuPzogT2JqZWN0W107XHJcbiAgICBwYXJlbnRzPzogT2JqZWN0W107XHJcblxyXG4gICAgbG9hZGVkOiBib29sZWFuO1xyXG4gICAgbG9hZDogKCkgPT4gT2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIHRvIHJlcHJlc2VudCBmYngtb2JqZWN0cy5cclxuICAgKiBBbGwgZmllbGRzIG90aGVyIHRoYW4gdWlkLCBuYW1lLCB0eXBlLCBzdWJ0eXBlLCBjaGlsZHJlbiBhbmQgcGFyZW50cyBhcmUgbG9hZGVkIHdpdGggdGhlIGxvYWQtbWV0aG9kLlxyXG4gICAqIEVhY2ggb2JqZWN0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhbiBleHBsaWNpdCBmYnggb2JqZWN0IHR5cGUgZGVmaW5lZCBpbiBGdWRnZUNvcmUuRkJYLiBFeHBsaWNpdCB0eXBlcyBoYXZlIGJlZW4gZGVmaW5lZFxyXG4gICAqIHdpdGggdGhlIGhlbHAgb2YgZm9sbG93aW5nIHJlZmVyZW5jZTpcclxuICAgKiBodHRwczovL2FyY2hpdmUuYmxlbmRlci5vcmcvd2lraS9pbmRleC5waHAvVXNlcjpNb250MjkvRm91bmRhdGlvbi9GQlhfRmlsZV9TdHJ1Y3R1cmUvI1NvbWVfU3BlY2lmaWNfUHJvcGVydHlfVHlwZXNcclxuICAgKiBAYXV0aG9yIE1hdHRoaWFzIFJvbWluZywgSEZVLCAyMDIzXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0IGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBbbmFtZTogc3RyaW5nXTogTm9kZVByb3BlcnR5IHwgeyBbbmFtZTogc3RyaW5nXTogTm9kZVByb3BlcnR5IH0gfCBQcm9wZXJ0eTcwIHwgT2JqZWN0IHwgT2JqZWN0W10gfCAoKCkgPT4gT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnQgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIFNvdXJjZU9iamVjdD86IHVuZGVmaW5lZDtcclxuICAgIEFjdGl2ZUFuaW1TdGFja05hbWU/OiBzdHJpbmc7XHJcbiAgICBSb290Tm9kZT86IG51bWJlcjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTm9kZUF0dHJpYnV0ZSBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgVHlwZUZsYWdzPzogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBHZW9tZXRyeSBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgR2VvbWV0cnlWZXJzaW9uPzogbnVtYmVyO1xyXG4gICAgVmVydGljZXM/OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBQb2x5Z29uVmVydGV4SW5kZXg/OiBJbnQzMkFycmF5O1xyXG4gICAgTGF5ZXJFbGVtZW50Tm9ybWFsPzogTGF5ZXJFbGVtZW50Tm9ybWFsO1xyXG4gICAgTGF5ZXJFbGVtZW50VVY/OiBMYXllckVsZW1lbnRVVjsgLy8gfCBMYXllckVsZW1lbnRVVltdOyAvLyBUT0RPOiBtaWdodCBuZWVkIHRvIHJlYWRkIHRoaXNcclxuICAgIExheWVyRWxlbWVudE1hdGVyaWFsPzogTGF5ZXJFbGVtZW50TWF0ZXJpYWw7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIE1vZGVsIGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBWZXJzaW9uPzogbnVtYmVyO1xyXG4gICAgTGNsVHJhbnNsYXRpb24/OiBGdWRnZUNvcmUuVmVjdG9yMyB8IEFuaW1DdXJ2ZU5vZGU7XHJcbiAgICBMY2xSb3RhdGlvbj86IEZ1ZGdlQ29yZS5WZWN0b3IzIHwgQW5pbUN1cnZlTm9kZTtcclxuICAgIExjbFNjYWxpbmc/OiBGdWRnZUNvcmUuVmVjdG9yMyB8IEFuaW1DdXJ2ZU5vZGU7XHJcbiAgICBQcmVSb3RhdGlvbj86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgUG9zdFJvdGF0aW9uPzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBTY2FsaW5nT2Zmc2V0PzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBTY2FsaW5nUGl2b3Q/OiBGdWRnZUNvcmUuVmVjdG9yMztcclxuICAgIFJvdGF0aW9uT2Zmc2V0PzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBSb3RhdGlvblBpdm90PzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBJbmhlcml0VHlwZT86IG51bWJlcjtcclxuICAgIEV1bGVyT3JkZXI/OiBzdHJpbmc7XHJcbiAgICBjdXJyZW50VVZTZXQ/OiBzdHJpbmc7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsIGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBWZXJzaW9uPzogbnVtYmVyO1xyXG4gICAgU2hhZGluZ01vZGVsPzogc3RyaW5nO1xyXG5cclxuICAgIERpZmZ1c2U/OiBGdWRnZUNvcmUuVmVjdG9yMztcclxuICAgIERpZmZ1c2VDb2xvcj86IEZ1ZGdlQ29yZS5WZWN0b3IzIHwgVGV4dHVyZTtcclxuICAgIERpZmZ1c2VGYWN0b3I/OiBudW1iZXI7XHJcblxyXG4gICAgQW1iaWVudD86IEZ1ZGdlQ29yZS5WZWN0b3IzO1xyXG4gICAgQW1iaWVudENvbG9yPzogRnVkZ2VDb3JlLlZlY3RvcjMgfCBUZXh0dXJlO1xyXG5cclxuICAgIFNoaW5pbmVzcz86IG51bWJlcjtcclxuICAgIFNoaW5pbmVzc0V4cG9uZW50PzogRnVkZ2VDb3JlLlZlY3RvcjMgfCBUZXh0dXJlO1xyXG5cclxuICAgIFNwZWN1bGFyPzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBTcGVjdWxhckNvbG9yPzogRnVkZ2VDb3JlLlZlY3RvcjMgfCBUZXh0dXJlO1xyXG4gICAgU3BlY3VsYXJGYWN0b3I/OiBudW1iZXI7XHJcblxyXG4gICAgUmVmbGVjdGl2aXR5PzogbnVtYmVyO1xyXG4gICAgUmVmbGVjdGlvbkZhY3Rvcj86IG51bWJlcjtcclxuXHJcbiAgICBPcGFjaXR5PzogbnVtYmVyO1xyXG4gICAgVHJhbnNwYXJlbmN5RmFjdG9yPzogbnVtYmVyO1xyXG5cclxuICAgIEVtaXNzaXZlPzogRnVkZ2VDb3JlLlZlY3RvcjM7XHJcbiAgICBOb3JtYWxNYXA/OiBUZXh0dXJlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBEZWZvcm1lciBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgVmVyc2lvbj86IG51bWJlcjtcclxuICAgIFNraW5uaW5nVHlwZT86IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU3ViRGVmb3JtZXIgZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIFZlcnNpb24/OiBudW1iZXI7XHJcbiAgICBUcmFuc2Zvcm0/OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBUcmFuc2Zvcm1MaW5rPzogRmxvYXQzMkFycmF5O1xyXG4gICAgSW5kZXhlcz86IFVpbnQxNkFycmF5O1xyXG4gICAgV2VpZ2h0cz86IEZsb2F0MzJBcnJheTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGV4dHVyZSBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgRmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgICBSZWxhdGl2ZUZpbGVuYW1lPzogc3RyaW5nO1xyXG4gICAgTW9kZWxVVlNjYWxpbmc/OiBudW1iZXI7XHJcbiAgICBNb2RlbFVWVHJhbnNsYXRpb24/OiBudW1iZXI7XHJcbiAgICBVVlNldD86IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgVmlkZW8gZXh0ZW5kcyBPYmplY3RCYXNlIHtcclxuICAgIEZpbGVOYW1lPzogc3RyaW5nO1xyXG4gICAgUmVsYXRpdmVGaWxlbmFtZT86IHN0cmluZztcclxuICAgIFVzZU1pcE1hcD86IG51bWJlcjtcclxuICAgIENvbnRlbnQ/OiBVaW50OEFycmF5O1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltQ3VydmVOb2RlIGV4dGVuZHMgT2JqZWN0QmFzZSB7XHJcbiAgICBkWD86IG51bWJlciB8IEFuaW1DdXJ2ZTtcclxuICAgIGRZPzogbnVtYmVyIHwgQW5pbUN1cnZlO1xyXG4gICAgZFo/OiBudW1iZXIgfCBBbmltQ3VydmU7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1DdXJ2ZSBleHRlbmRzIE9iamVjdEJhc2Uge1xyXG4gICAgS2V5VmVyPzogbnVtYmVyO1xyXG4gICAgRGVmYXVsdD86IG51bWJlcjtcclxuICAgIEtleVRpbWU/OiBCaWdJbnQ2NEFycmF5O1xyXG4gICAgS2V5VmFsdWVGbG9hdD86IEZsb2F0MzJBcnJheTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJFbGVtZW50IHtcclxuICAgIE5hbWU6IHN0cmluZztcclxuICAgIFZlcnNpb246IG51bWJlcjtcclxuICAgIE1hcHBpbmdJbmZvcm1hdGlvblR5cGU6IHN0cmluZztcclxuICAgIFJlZmVyZW5jZUluZm9ybWF0aW9uVHlwZTogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBMYXllckVsZW1lbnROb3JtYWwgZXh0ZW5kcyBMYXllckVsZW1lbnQge1xyXG4gICAgTm9ybWFsczogRmxvYXQzMkFycmF5O1xyXG4gICAgTm9ybWFsc1c6IEZsb2F0MzJBcnJheTtcclxuICAgIE5vcm1hbHNJbmRleD86IFVpbnQxNkFycmF5OyAvLyBUT0RPOiBmaW5kIGFuIEZCWCBmaWxlIHdoaWNoIHVzZXMgbm9ybWFscyBpbmRleFxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBMYXllckVsZW1lbnRVViBleHRlbmRzIExheWVyRWxlbWVudCB7XHJcbiAgICBVVj86IEZsb2F0MzJBcnJheTtcclxuICAgIFVWSW5kZXg/OiBVaW50MTZBcnJheTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJFbGVtZW50TWF0ZXJpYWwgZXh0ZW5kcyBMYXllckVsZW1lbnQge1xyXG4gICAgTWF0ZXJpYWxzPzogbnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gTUFQUElOR19JTkZPUk1BVElPTl9UWVBFIHtcclxuICAgIEJZX1ZFUlRFWCwgQllfUE9MWUdPTiwgQllfUE9MWUdPTl9WRVJURVgsIEJZX0VER0UsIEFMTF9TQU1FXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBSRUZFUkVOQ0VfSU5GT1JNQVRJT05fVFlQRSB7XHJcbiAgICBESVJFQ1QsIElOREVYX1RPX0RJUkVDVFxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uIHtcclxuICAgIHBhcmVudFVJRDogbnVtYmVyO1xyXG4gICAgY2hpbGRVSUQ6IG51bWJlcjtcclxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBEZWZpbml0aW9ucyB7XHJcbiAgICB2ZXJzaW9uOiBudW1iZXI7XHJcbiAgICBvYmplY3RUeXBlczogT2JqZWN0VHlwZVtdO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBPYmplY3RUeXBlIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGNvdW50OiBudW1iZXI7XHJcbiAgICBwcm9wZXJ0eVRlbXBsYXRlOiBQcm9wZXJ0eVRlbXBsYXRlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eVRlbXBsYXRlIHtcclxuICAgIFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IFByb3BlcnR5NzA7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogQXNzZXQgbG9hZGVyIGZvciBGaWxtYm94IGZpbGVzLlxyXG4gICAqIEBhdXRob3IgTWF0dGhpYXMgUm9taW5nLCBIRlUsIDIwMjNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgRkJYTG9hZGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGxvYWRlcnM6IHsgW3VyaTogc3RyaW5nXTogRkJYTG9hZGVyIH07XHJcblxyXG4gICAgc3RhdGljICNkZWZhdWx0TWF0ZXJpYWw6IE1hdGVyaWFsO1xyXG4gICAgc3RhdGljICNkZWZhdWx0U2tpbk1hdGVyaWFsOiBNYXRlcmlhbDtcclxuXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmJ4OiBGQlguRkJYO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG5vZGVzOiBGQlguTm9kZVtdO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHVyaTogc3RyaW5nO1xyXG5cclxuICAgICNzY2VuZXM6IEdyYXBoW107XHJcbiAgICAjbm9kZXM6IE5vZGVbXTtcclxuICAgICNtZXNoZXM6IE1lc2hGQlhbXTtcclxuICAgICNtYXRlcmlhbHM6IE1hdGVyaWFsW107XHJcbiAgICAjc2tpbk1hdGVyaWFsczogTWF0ZXJpYWxbXSA9IFtdO1xyXG4gICAgI3RleHR1cmVzOiBUZXh0dXJlW107XHJcbiAgICAjc2tlbGV0b25zOiBDb21wb25lbnRTa2VsZXRvbltdO1xyXG4gICAgI2FuaW1hdGlvbnM6IEFuaW1hdGlvbltdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihfYnVmZmVyOiBBcnJheUJ1ZmZlciwgX3VyaTogc3RyaW5nKSB7XHJcbiAgICAgIHRoaXMudXJpID0gX3VyaTtcclxuICAgICAgdGhpcy5ub2RlcyA9IEZCWC5wYXJzZU5vZGVzRnJvbUJpbmFyeShfYnVmZmVyKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5ub2Rlcyk7XHJcbiAgICAgIHRoaXMuZmJ4ID0gRkJYLmxvYWRGcm9tTm9kZXModGhpcy5ub2Rlcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZmJ4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdE1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRNYXRlcmlhbCB8fCAodGhpcy4jZGVmYXVsdE1hdGVyaWFsID1cclxuICAgICAgICBuZXcgTWF0ZXJpYWwoXCJGQlhEZWZhdWx0TWF0ZXJpYWxcIiwgU2hhZGVyR291cmF1ZCwgbmV3IENvYXRSZW1pc3NpdmUoQ29sb3IuQ1NTKFwid2hpdGVcIikpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCBkZWZhdWx0U2tpbk1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgfHwgKHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgPVxyXG4gICAgICAgIG5ldyBNYXRlcmlhbChcIkZCWERlZmF1bHRTa2luTWF0ZXJpYWxcIiwgU2hhZGVyR291cmF1ZFNraW4sIG5ldyBDb2F0UmVtaXNzaXZlKENvbG9yLkNTUyhcIndoaXRlXCIpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIExPQUQoX3VyaTogc3RyaW5nKTogUHJvbWlzZTxGQlhMb2FkZXI+IHtcclxuICAgICAgaWYgKCF0aGlzLmxvYWRlcnMpXHJcbiAgICAgICAgdGhpcy5sb2FkZXJzID0ge307XHJcbiAgICAgIGlmICghdGhpcy5sb2FkZXJzW191cmldKSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goX3VyaSk7XHJcbiAgICAgICAgY29uc3QgYmluYXJ5OiBBcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkZXJzW191cmldID0gbmV3IEZCWExvYWRlcihiaW5hcnksIF91cmkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRlcnNbX3VyaV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFNjZW5lKF9pbmRleDogbnVtYmVyID0gMCk6IFByb21pc2U8R3JhcGg+IHtcclxuICAgICAgaWYgKCF0aGlzLiNzY2VuZXMpXHJcbiAgICAgICAgdGhpcy4jc2NlbmVzID0gW107XHJcbiAgICAgIGlmICghdGhpcy4jc2NlbmVzW19pbmRleF0pIHtcclxuICAgICAgICBjb25zdCBkb2N1bWVudEZCWDogRkJYLkRvY3VtZW50ID0gdGhpcy5mYnguZG9jdW1lbnRzW19pbmRleF0ubG9hZCgpO1xyXG4gICAgICAgIGNvbnN0IHNjZW5lOiBHcmFwaCA9IG5ldyBHcmFwaChkb2N1bWVudEZCWC5uYW1lKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkRkJYIG9mIGRvY3VtZW50RkJYLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICBpZiAoY2hpbGRGQlgudHlwZSA9PSBcIk1vZGVsXCIpIHtcclxuICAgICAgICAgICAgc2NlbmUuYWRkQ2hpbGQoYXdhaXQgdGhpcy5nZXROb2RlKHRoaXMuZmJ4Lm9iamVjdHMubW9kZWxzLmluZGV4T2YoY2hpbGRGQlgpKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5mYngub2JqZWN0cy5hbmltU3RhY2tzICYmIHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBhbmltYXRpb246IEFuaW1hdGlvbiA9IGF3YWl0IHRoaXMuZ2V0QW5pbWF0aW9uKGRvY3VtZW50RkJYLkFjdGl2ZUFuaW1TdGFja05hbWUubGVuZ3RoID4gMCA/XHJcbiAgICAgICAgICAgIHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5maW5kSW5kZXgoX2FuaW1TdGFjayA9PiBfYW5pbVN0YWNrLm5hbWUgPT0gZG9jdW1lbnRGQlguQWN0aXZlQW5pbVN0YWNrTmFtZSkgOiAwKTtcclxuICAgICAgICAgIGlmIChhbmltYXRpb24pXHJcbiAgICAgICAgICAgIHNjZW5lLmFkZENvbXBvbmVudChuZXcgQ29tcG9uZW50QW5pbWF0b3IoYW5pbWF0aW9uKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHNrZWxldG9uIG9mIHRoaXMuI3NrZWxldG9ucylcclxuICAgICAgICAgIHNjZW5lLmFkZENvbXBvbmVudChza2VsZXRvbik7XHJcblxyXG4gICAgICAgIFByb2plY3QucmVnaXN0ZXIoc2NlbmUpO1xyXG4gICAgICAgIHRoaXMuI3NjZW5lc1tfaW5kZXhdID0gc2NlbmU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI3NjZW5lc1tfaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXROb2RlKF9pbmRleDogbnVtYmVyKTogUHJvbWlzZTxOb2RlPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbm9kZXMpXHJcbiAgICAgICAgdGhpcy4jbm9kZXMgPSBbXTtcclxuICAgICAgaWYgKCF0aGlzLiNub2Rlc1tfaW5kZXhdKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIG5vZGUgd2l0aCB0cmFuc2Zvcm1cclxuICAgICAgICBjb25zdCBtb2RlbEZCWDogRkJYLk1vZGVsID0gdGhpcy5mYngub2JqZWN0cy5tb2RlbHNbX2luZGV4XS5sb2FkKCk7XHJcbiAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IG5ldyBOb2RlKG1vZGVsRkJYLm5hbWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVUcmFuc2Zvcm0obW9kZWxGQlgsIG5vZGUpO1xyXG4gICAgICAgIHRoaXMuI25vZGVzW19pbmRleF0gPSBub2RlO1xyXG5cclxuICAgICAgICAvLyBhdHRhY2ggY2hpbGRyZW4gYW5kIGNvbXBvbmVudHNcclxuICAgICAgICBpZiAobW9kZWxGQlguY2hpbGRyZW4pIGZvciAoY29uc3QgY2hpbGRGQlggb2YgbW9kZWxGQlguY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGlmIChjaGlsZEZCWC50eXBlID09IFwiTW9kZWxcIikge1xyXG4gICAgICAgICAgICBub2RlLmFkZENoaWxkKGF3YWl0IHRoaXMuZ2V0Tm9kZSh0aGlzLmZieC5vYmplY3RzLm1vZGVscy5pbmRleE9mKGNoaWxkRkJYKSkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGlsZEZCWC50eXBlID09IFwiR2VvbWV0cnlcIikge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNoOiBNZXNoRkJYID0gYXdhaXQgdGhpcy5nZXRNZXNoKHRoaXMuZmJ4Lm9iamVjdHMuZ2VvbWV0cmllcy5pbmRleE9mKGNoaWxkRkJYKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNtcE1lc2g6IENvbXBvbmVudE1lc2ggPSBuZXcgQ29tcG9uZW50TWVzaChtZXNoKTtcclxuICAgICAgICAgICAgbm9kZS5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudE1hdGVyaWFsKEZCWExvYWRlci5kZWZhdWx0TWF0ZXJpYWwpKTtcclxuICAgICAgICAgICAgaWYgKG1lc2gucmVuZGVyTWVzaC5ib25lcykge1xyXG4gICAgICAgICAgICAgIGNtcE1lc2guc2tlbGV0b24gPSBhd2FpdCB0aGlzLmdldFNrZWxldG9uKGNoaWxkRkJYLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdKTtcclxuICAgICAgICAgICAgICAvLyBmb3IgKGNvbnN0IHN1YkRlZm9ybWVyRkJYIG9mIGNoaWxkRkJYLmNoaWxkcmVuWzBdLmNoaWxkcmVuIGFzIEZCWC5TdWJEZWZvcm1lcltdKSB7XHJcbiAgICAgICAgICAgICAgLy8gICBjb25zdCBib25lOiBOb2RlID0gY21wTWVzaC5za2VsZXRvbi5ib25lc1tzdWJEZWZvcm1lckZCWC5jaGlsZHJlblswXS5uYW1lXTtcclxuICAgICAgICAgICAgICAvLyAgIGJvbmUubXR4TG9jYWwuc2V0KHN1YkRlZm9ybWVyRkJYLlRyYW5zZm9ybUxpbmspO1xyXG4gICAgICAgICAgICAgIC8vICAgaWYgKGJvbmUuZ2V0UGFyZW50KCkpXHJcbiAgICAgICAgICAgICAgLy8gICAgIGJvbmUubXR4TG9jYWwubXVsdGlwbHkoYm9uZS5nZXRQYXJlbnQoKS5tdHhXb3JsZEludmVyc2UpO1xyXG4gICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICBub2RlLmdldENvbXBvbmVudChDb21wb25lbnRNYXRlcmlhbCkubWF0ZXJpYWwgPSBGQlhMb2FkZXIuZGVmYXVsdFNraW5NYXRlcmlhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlLmFkZENvbXBvbmVudChjbXBNZXNoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRGQlgudHlwZSA9PSBcIk1hdGVyaWFsXCIpIHtcclxuICAgICAgICAgICAgLy8gVE9ETzogYWRkaXRpb25hbCBza2luIG1hdGVyaWFscyBnZXQgY3JlYXRlZCBoZXJlLCBjaGVjayBpZiB0aGUgb3JpZ2luYWwgbWF0ZXJpYWwgaXMgc3RpbGwgbmVlZGVkXHJcbiAgICAgICAgICAgIGNvbnN0IGlNYXRlcmlhbDogbnVtYmVyID0gdGhpcy5mYngub2JqZWN0cy5tYXRlcmlhbHMuaW5kZXhPZihjaGlsZEZCWCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IGF3YWl0IHRoaXMuZ2V0TWF0ZXJpYWwoaU1hdGVyaWFsKTtcclxuICAgICAgICAgICAgbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWF0ZXJpYWwpLm1hdGVyaWFsID0gbm9kZS5nZXRDb21wb25lbnQoQ29tcG9uZW50TWVzaCkubWVzaC5yZW5kZXJNZXNoLmJvbmVzID9cclxuICAgICAgICAgICAgICB0aGlzLiNza2luTWF0ZXJpYWxzW2lNYXRlcmlhbF0gfHwgKHRoaXMuI3NraW5NYXRlcmlhbHNbaU1hdGVyaWFsXSA9IG5ldyBNYXRlcmlhbChcclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5nZXRTaGFkZXIoKSA9PSBTaGFkZXJQaG9uZyA/XHJcbiAgICAgICAgICAgICAgICAgIFNoYWRlclBob25nU2tpbiA6XHJcbiAgICAgICAgICAgICAgICAgIFNoYWRlclBob25nVGV4dHVyZWRTa2luLFxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuY29hdFxyXG4gICAgICAgICAgICAgICkpIDpcclxuICAgICAgICAgICAgICBtYXRlcmlhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGVzW19pbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPE1lc2hGQlg+IHtcclxuICAgICAgaWYgKCF0aGlzLiNtZXNoZXMpXHJcbiAgICAgICAgdGhpcy4jbWVzaGVzID0gW107XHJcbiAgICAgIGlmICghdGhpcy4jbWVzaGVzW19pbmRleF0pXHJcbiAgICAgICAgdGhpcy4jbWVzaGVzW19pbmRleF0gPSBhd2FpdCBuZXcgTWVzaEZCWCgpLmxvYWQodGhpcy51cmksIF9pbmRleCk7XHJcbiAgICAgIHJldHVybiB0aGlzLiNtZXNoZXNbX2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0TWF0ZXJpYWwoX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPE1hdGVyaWFsPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbWF0ZXJpYWxzKVxyXG4gICAgICAgIHRoaXMuI21hdGVyaWFscyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI21hdGVyaWFsc1tfaW5kZXhdKSB7XHJcbiAgICAgICAgY29uc3QgbWF0ZXJpYWxGQlg6IEZCWC5NYXRlcmlhbCA9IHRoaXMuZmJ4Lm9iamVjdHMubWF0ZXJpYWxzW19pbmRleF0ubG9hZCgpO1xyXG4gICAgICAgIGlmICghKG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciBpbnN0YW5jZW9mIFZlY3RvcjMpKVxyXG4gICAgICAgICAgbWF0ZXJpYWxGQlguRGlmZnVzZUNvbG9yPy5jaGlsZHJlblswXS5sb2FkKCk7XHJcbiAgICAgICAgLy8gRkJYIHN1cHBvcnRzIGxhbWJlcnQgYW5kIHBob25nIHNoYWRpbmcsIGVpdGhlciB3YXkgZnVkZ2UgaGFzIG5vIGxhbWJlcnQgc2hhZGVyIHNvIHdlIGFsd2F5cyB1c2UgcGhvbmcuXHJcbiAgICAgICAgLy8gSW4gRGlmZnVzZUNvbG9yIHRoZSB0ZXh0dXJlIG9mIHRoZSBtYXRlcmlhbCBjb2xvciBpcyBzdG9yZWQsIGlmIGl0J3MgZGVmaW5lZCB3ZSB1c2UgYSB0ZXh0dXJlIHNoYWRlci5cclxuICAgICAgICAvLyBUT0RPOiBtYXRlcmlhbEZCWCBhbHNvIGNvbnRhaW5zIGFkZGl0aW9uYWwgdmFsdWVzIGxpa2Ugc2hpbmluZXNzIGFuZCByZWZsZWN0aXZpdHkgKGFuZCBvdGhlcnMpIHdoaWNoIGFyZSBub3Qgc3VwcHBvcnRlZC5cclxuICAgICAgICB0aGlzLiNtYXRlcmlhbHNbX2luZGV4XSA9IG5ldyBNYXRlcmlhbChcclxuICAgICAgICAgIG1hdGVyaWFsRkJYLm5hbWUsXHJcbiAgICAgICAgICBtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IgJiYgIShtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IgaW5zdGFuY2VvZiBWZWN0b3IzKSA/XHJcbiAgICAgICAgICAgIFNoYWRlclBob25nVGV4dHVyZWQgOlxyXG4gICAgICAgICAgICBTaGFkZXJQaG9uZyxcclxuICAgICAgICAgIG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciAmJiAhKG1hdGVyaWFsRkJYLkRpZmZ1c2VDb2xvciBpbnN0YW5jZW9mIFZlY3RvcjMpID9cclxuICAgICAgICAgICAgbmV3IENvYXRSZW1pc3NpdmVUZXh0dXJlZChcclxuICAgICAgICAgICAgICBuZXcgQ29sb3IoLi4ubWF0ZXJpYWxGQlguRGlmZnVzZS5nZXQoKSksXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKHRoaXMuZmJ4Lm9iamVjdHMudGV4dHVyZXMuaW5kZXhPZihtYXRlcmlhbEZCWC5EaWZmdXNlQ29sb3IpKSxcclxuICAgICAgICAgICAgICBtYXRlcmlhbEZCWC5EaWZmdXNlRmFjdG9yID8/IDEsXHJcbiAgICAgICAgICAgICAgbWF0ZXJpYWxGQlguU3BlY3VsYXJGYWN0b3IgPz8gYXZlcmFnZShtYXRlcmlhbEZCWC5TcGVjdWxhcj8uZ2V0KCkpID8/IDBcclxuICAgICAgICAgICAgKSA6XHJcbiAgICAgICAgICAgIG5ldyBDb2F0UmVtaXNzaXZlKFxyXG4gICAgICAgICAgICAgIG5ldyBDb2xvciguLi4obWF0ZXJpYWxGQlguRGlmZnVzZUNvbG9yIGFzIFZlY3RvcjMgPz8gbWF0ZXJpYWxGQlguRGlmZnVzZSkuZ2V0KCkpLFxyXG4gICAgICAgICAgICAgIG1hdGVyaWFsRkJYLkRpZmZ1c2VGYWN0b3IgPz8gMSxcclxuICAgICAgICAgICAgICBtYXRlcmlhbEZCWC5TcGVjdWxhckZhY3RvciA/PyBhdmVyYWdlKG1hdGVyaWFsRkJYLlNwZWN1bGFyPy5nZXQoKSkgPz8gMFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jbWF0ZXJpYWxzW19pbmRleF07XHJcblxyXG4gICAgICBmdW5jdGlvbiBhdmVyYWdlKF9hcnJheTogRmxvYXQzMkFycmF5KTogbnVtYmVyIHsgLy8gVE9ETzogc3BlY3VsYXIgZmFjdG9yIHZlY3RvciAodG9nZXRoZXIgd2l0aCBzcGVjdWxhciBjb2xvciB0ZXh0dXJlKSBpcyBub3Qgc3VwcG9ydGVkIHNvIHdlIHVzZSB0aGUgYXZlcmFnZSBvZiB0aGUgdmVjdG9yIHRvIGFwcHJveGltYXRlIGEgc2luZ3VsYXIgc3BlY3VsYXIgZmFjdG9yLlxyXG4gICAgICAgIGlmIChfYXJyYXkpXHJcbiAgICAgICAgICByZXR1cm4gX2FycmF5LnJlZHVjZSgoX2EsIF9iKSA9PiBfYSArIF9iKSAvIF9hcnJheS5sZW5ndGg7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRUZXh0dXJlKF9pbmRleDogbnVtYmVyKTogUHJvbWlzZTxUZXh0dXJlPiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuI3RleHR1cmVzKVxyXG4gICAgICAgICAgdGhpcy4jdGV4dHVyZXMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy4jdGV4dHVyZXNbX2luZGV4XSlcclxuICAgICAgICAgIHJldHVybiBfcmVzb2x2ZSh0aGlzLiN0ZXh0dXJlc1tfaW5kZXhdKTtcclxuXHJcbiAgICAgICAgY29uc3QgdmlkZW9GQlg6IEZCWC5WaWRlbyA9IHRoaXMuZmJ4Lm9iamVjdHMudGV4dHVyZXNbX2luZGV4XS5jaGlsZHJlblswXTtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlOiBUZXh0dXJlSW1hZ2UgPSBuZXcgVGV4dHVyZUltYWdlKCk7XHJcbiAgICAgICAgdGV4dHVyZS5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICAgIHRleHR1cmUuaW1hZ2Uub25sb2FkID0gKCkgPT4gX3Jlc29sdmUodGV4dHVyZSk7XHJcbiAgICAgICAgdGV4dHVyZS5pbWFnZS5vbmVycm9yID0gX3JlamVjdDtcclxuICAgICAgICB0ZXh0dXJlLmltYWdlLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3ZpZGVvRkJYLkNvbnRlbnRdLCB7IHR5cGU6IFwiaW1hZ2UvcG5nXCIgfSkpO1xyXG4gICAgICAgIHRoaXMuI3RleHR1cmVzW19pbmRleF0gPSB0ZXh0dXJlO1xyXG4gICAgICAgIC8vIFRPRE86IGdldCBhbmQgc2V0IG1pcG1hcCBpbmZvcm1hdGlvbiA/Pz9cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvYmxlbTogbWVocmVyZSBEZWZvcm1lciB2ZXJ3ZWlzZW4gYXVmIGRhcyBzZWxiZSBTa2VsZXR0IGFiZXIgbnV0emVuIGRhYmVpIG5pY2h0IGltbWVyIGFsbGUgS25vY2hlblxyXG4gICAgLy8gPT4gUHJvYmxlbSBiZXN0ZWh0IGF1Y2ggaW0gR0xURkxvYWRlclxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWVmcyB0aGUgc2tlbGV0b24gY29udGFpbmluZyB0aGUgZ2l2ZW4gbGltYiBub2RlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2tlbGV0b24oX2ZieExpbWJOb2RlOiBGQlguTW9kZWwpOiBQcm9taXNlPENvbXBvbmVudFNrZWxldG9uPiB7XHJcbiAgICAgIGlmICghdGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgIHRoaXMuI3NrZWxldG9ucyA9IFtdO1xyXG4gICAgICByZXR1cm4gdGhpcy4jc2tlbGV0b25zLmZpbmQoX3NrZWxldG9uID0+IF9mYnhMaW1iTm9kZS5uYW1lIGluIF9za2VsZXRvbi5ib25lcykgfHwgYXdhaXQgKGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBza2VsZXRvbjogQ29tcG9uZW50U2tlbGV0b24gPSBuZXcgQ29tcG9uZW50U2tlbGV0b24oKTsgLy8gbmV3IFNrZWxldG9uKGBTa2VsZXRvbiR7dGhpcy4jc2tlbGV0b25zLmxlbmd0aH1gKTtcclxuICAgICAgICBsZXQgcm9vdE5vZGU6IEZCWC5Nb2RlbCA9IF9mYnhMaW1iTm9kZTtcclxuICAgICAgICB3aGlsZSAocm9vdE5vZGUucGFyZW50cyAmJiByb290Tm9kZS5wYXJlbnRzLnNvbWUoX3BhcmVudCA9PiBfcGFyZW50LnN1YnR5cGUgPT0gXCJMaW1iTm9kZVwiKSlcclxuICAgICAgICAgIHJvb3ROb2RlID0gcm9vdE5vZGUucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC5zdWJ0eXBlID09IFwiTGltYk5vZGVcIik7XHJcbiAgICAgICAgY29uc3QgaVJvb3ROb2RlOiBudW1iZXIgPSB0aGlzLmZieC5vYmplY3RzLm1vZGVscy5maW5kSW5kZXgoX21vZGVsID0+IF9tb2RlbC5uYW1lID09IHJvb3ROb2RlLm5hbWUpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYXdhaXQgdGhpcy5nZXROb2RlKGlSb290Tm9kZSkpIHtcclxuICAgICAgICAgIC8vIFRPRE86IG1heWJlIG1vdmUgdGhpcyBpbnRvIHRoZSBjb21wb25lbnQsIGFzIHRoaXMgaXMgcHJvYmFibHkgbmVlZGVkIGluIGdsdGYgaW1wb3J0IGFzd2VsbFxyXG4gICAgICAgICAgaWYgKHRoaXMuZmJ4Lm9iamVjdHMubW9kZWxzW3RoaXMuI25vZGVzLmluZGV4T2Yobm9kZSldLnN1YnR5cGUgPT0gXCJMaW1iTm9kZVwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDogTm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhXb3JsZC5jb3B5KFxyXG4gICAgICAgICAgICAgICAgbm9kZS5jbXBUcmFuc2Zvcm0gP1xyXG4gICAgICAgICAgICAgICAgICBNYXRyaXg0eDQuUFJPRFVDVChwYXJlbnQubXR4V29ybGQsIG5vZGUubXR4TG9jYWwpIDpcclxuICAgICAgICAgICAgICAgICAgcGFyZW50Lm10eFdvcmxkXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgbm9kZS5tdHhXb3JsZEludmVyc2UuY29weShNYXRyaXg0eDQuSU5WRVJTRShub2RlLm10eFdvcmxkKSk7XHJcbiAgICAgICAgICAgIHNrZWxldG9uLmFkZEJvbmUobm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNza2VsZXRvbnMucHVzaChza2VsZXRvbik7XHJcbiAgICAgICAgcmV0dXJuIHNrZWxldG9uO1xyXG4gICAgICB9KSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRBbmltYXRpb24oX2luZGV4OiBudW1iZXIpOiBQcm9taXNlPEFuaW1hdGlvbj4ge1xyXG4gICAgICBpZiAoIXRoaXMuI2FuaW1hdGlvbnMpXHJcbiAgICAgICAgdGhpcy4jYW5pbWF0aW9ucyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI2FuaW1hdGlvbnNbX2luZGV4XSkge1xyXG4gICAgICAgIGNvbnN0IGFuaW1TdGFjazogRkJYLk9iamVjdCA9IHRoaXMuZmJ4Lm9iamVjdHMuYW5pbVN0YWNrc1tfaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IGFuaW1Ob2Rlc0ZCWDogRkJYLkFuaW1DdXJ2ZU5vZGVbXSA9IGFuaW1TdGFjay5jaGlsZHJlblswXS5jaGlsZHJlbjtcclxuXHJcbiAgICAgICAgbGV0IGZieEFuaW1Ob2RlR3JvdXBlZDogTWFwPEZCWC5Nb2RlbCwgRkJYLkFuaW1DdXJ2ZU5vZGVbXT4gPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBmYnhBbmltTm9kZSBvZiBhbmltTm9kZXNGQlgpIHtcclxuICAgICAgICAgIGNvbnN0IGtleTogRkJYLk1vZGVsID0gZmJ4QW5pbU5vZGUucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIik7XHJcbiAgICAgICAgICBpZiAoa2V5ID09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICBpZiAoIWZieEFuaW1Ob2RlR3JvdXBlZC5oYXMoa2V5KSlcclxuICAgICAgICAgICAgZmJ4QW5pbU5vZGVHcm91cGVkLnNldChrZXksIFtdKTtcclxuICAgICAgICAgIGZieEFuaW1Ob2RlR3JvdXBlZC5nZXQoa2V5KS5wdXNoKGZieEFuaW1Ob2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFuaW1hdGlvblN0cnVjdHVyZTogQW5pbWF0aW9uU3RydWN0dXJlID0ge307XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgW2ZieE1vZGVsLCBmYnhBbmltTm9kZXNdIG9mIGZieEFuaW1Ob2RlR3JvdXBlZCkge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRTdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IGFuaW1hdGlvblN0cnVjdHVyZTtcclxuXHJcbiAgICAgICAgICBsZXQgcGFyZW50OiBGQlguTW9kZWwgPSBmYnhNb2RlbC5wYXJlbnRzLmZpbmQoX3BhcmVudCA9PiBfcGFyZW50LnR5cGUgPT0gXCJNb2RlbFwiKTtcclxuICAgICAgICAgIGxldCBwYXRoOiBGQlguTW9kZWxbXSA9IFtdO1xyXG4gICAgICAgICAgcGF0aC5wdXNoKGZieE1vZGVsKTtcclxuICAgICAgICAgIHdoaWxlIChwYXJlbnQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHBhdGgucHVzaChwYXJlbnQpO1xyXG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZm9yIChjb25zdCBmYnhQYXRoTW9kZWwgb2YgcGF0aC5yZXZlcnNlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgIGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gPSB7fTtcclxuXHJcbiAgICAgICAgICAgIGlmICgoY3VycmVudFN0cnVjdHVyZS5jaGlsZHJlbiBhcyBBbmltYXRpb25TdHJ1Y3R1cmUpW2ZieFBhdGhNb2RlbC5uYW1lXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgKGN1cnJlbnRTdHJ1Y3R1cmUuY2hpbGRyZW4gYXMgQW5pbWF0aW9uU3RydWN0dXJlKVtmYnhQYXRoTW9kZWwubmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgY3VycmVudFN0cnVjdHVyZSA9IChjdXJyZW50U3RydWN0dXJlLmNoaWxkcmVuIGFzIEFuaW1hdGlvblN0cnVjdHVyZSlbZmJ4UGF0aE1vZGVsLm5hbWVdIGFzIEFuaW1hdGlvblN0cnVjdHVyZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChmYnhQYXRoTW9kZWwgPT0gZmJ4TW9kZWwpIHtcclxuICAgICAgICAgICAgICBjb25zdCBtdHhMb2NhbDogQW5pbWF0aW9uU2VxdWVuY2VNYXRyaXg0eDQgPSB7fTtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZieEFuaW1Ob2RlIG9mIGZieEFuaW1Ob2RlcylcclxuICAgICAgICAgICAgICAgIG10eExvY2FsW3tcclxuICAgICAgICAgICAgICAgICAgVDogXCJ0cmFuc2xhdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgICBSOiBcInJvdGF0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICAgIFM6IFwic2NhbGVcIlxyXG4gICAgICAgICAgICAgICAgfVtmYnhBbmltTm9kZS5uYW1lXV0gPSB0aGlzLmdldEFuaW1hdGlvblZlY3RvcjMoZmJ4QW5pbU5vZGUsIGZieFBhdGhNb2RlbCk7XHJcbiAgICAgICAgICAgICAgY3VycmVudFN0cnVjdHVyZS5jb21wb25lbnRzID0ge1xyXG4gICAgICAgICAgICAgICAgQ29tcG9uZW50VHJhbnNmb3JtOiBbXHJcbiAgICAgICAgICAgICAgICAgIHsgbXR4TG9jYWw6IG10eExvY2FsIH1cclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiNhbmltYXRpb25zW19pbmRleF0gPSBuZXcgQW5pbWF0aW9uKGFuaW1TdGFjay5uYW1lLCBhbmltYXRpb25TdHJ1Y3R1cmUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLiNhbmltYXRpb25zW19pbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBmZXRjaGVkIGZyb20gdGhyZWUuanMsIGFkYXB0ZWQgdG8gRlVER0UgYW5kIG9wdGltaXplZFxyXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9ibG9iL2Rldi9leGFtcGxlcy9qc20vbG9hZGVycy9GQlhMb2FkZXIuanNcclxuICAgICAqIGxpbmUgMzk1MFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlVHJhbnNmb3JtKF9tb2RlbEZCWDogRkJYLk1vZGVsLCBfbm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBwYXJlbnRJbmRleDogbnVtYmVyID0gdGhpcy5mYngub2JqZWN0cy5tb2RlbHMuaW5kZXhPZihfbW9kZWxGQlgucGFyZW50cy5maW5kKF9wYXJlbnQgPT4gX3BhcmVudC50eXBlID09IFwiTW9kZWxcIikpO1xyXG4gICAgICBjb25zdCBwYXJlbnQ6IE5vZGUgPSBwYXJlbnRJbmRleCA+PSAwID8gYXdhaXQgdGhpcy5nZXROb2RlKHBhcmVudEluZGV4KSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGNvbnN0IG10eExvY2FsUm90YXRpb246IE1hdHJpeDR4NCA9IF9tb2RlbEZCWC5QcmVSb3RhdGlvbiB8fCBfbW9kZWxGQlguTGNsUm90YXRpb24gfHwgX21vZGVsRkJYLlBvc3RSb3RhdGlvbiA/XHJcbiAgICAgICAgTWF0cml4NHg0LklERU5USVRZKCkgOlxyXG4gICAgICAgIHVuZGVmaW5lZDtcclxuICAgICAgaWYgKF9tb2RlbEZCWC5QcmVSb3RhdGlvbikge1xyXG4gICAgICAgIG10eExvY2FsUm90YXRpb24ucm90YXRlKHRoaXMuZ2V0T3JkZXJlZChfbW9kZWxGQlguUHJlUm90YXRpb24sIF9tb2RlbEZCWCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChfbW9kZWxGQlguTGNsUm90YXRpb24pIHtcclxuICAgICAgICBtdHhMb2NhbFJvdGF0aW9uLnJvdGF0ZSh0aGlzLmdldE9yZGVyZWQodGhpcy5nZXRUcmFuc2Zvcm1WZWN0b3IoX21vZGVsRkJYLkxjbFJvdGF0aW9uLCBWZWN0b3IzLlpFUk8pLCBfbW9kZWxGQlgpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoX21vZGVsRkJYLlBvc3RSb3RhdGlvbikge1xyXG4gICAgICAgIGxldCBtdHhQb3N0Um90YXRpb25JbnZlcnNlOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuUk9UQVRJT04odGhpcy5nZXRPcmRlcmVkKF9tb2RlbEZCWC5Qb3N0Um90YXRpb24sIF9tb2RlbEZCWCkpO1xyXG4gICAgICAgIG10eFBvc3RSb3RhdGlvbkludmVyc2UgPSBNYXRyaXg0eDQuSU5WRVJTRShtdHhQb3N0Um90YXRpb25JbnZlcnNlKTtcclxuICAgICAgICBtdHhMb2NhbFJvdGF0aW9uLm11bHRpcGx5KG10eFBvc3RSb3RhdGlvbkludmVyc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtdHhMb2NhbFNjYWxpbmc6IE1hdHJpeDR4NCA9IF9tb2RlbEZCWC5MY2xTY2FsaW5nID9cclxuICAgICAgICBNYXRyaXg0eDQuU0NBTElORyh0aGlzLmdldFRyYW5zZm9ybVZlY3RvcihfbW9kZWxGQlguTGNsU2NhbGluZywgVmVjdG9yMy5PTkUpKSA6XHJcbiAgICAgICAgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgY29uc3QgbXR4UGFyZW50V29ybGRSb3RhdGlvbjogTWF0cml4NHg0ID0gcGFyZW50ID8gTWF0cml4NHg0LlJPVEFUSU9OKHBhcmVudC5tdHhXb3JsZC5yb3RhdGlvbikgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBjb25zdCBtdHhQYXJlbnRXb3JsZFNjYWxlOiBNYXRyaXg0eDQgPSBwYXJlbnQgPyAoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG10eFBhcmVudFdvcmxkU2NhbGU6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFBhcmVudFdvcmxkUm90YXRpb24pO1xyXG4gICAgICAgIG10eFBhcmVudFdvcmxkU2NhbGUudHJhbnNsYXRlKFZlY3RvcjMuU0NBTEUocGFyZW50Lm10eFdvcmxkLnRyYW5zbGF0aW9uLCAtMSkpO1xyXG4gICAgICAgIG10eFBhcmVudFdvcmxkU2NhbGUubXVsdGlwbHkocGFyZW50Lm10eFdvcmxkKTtcclxuICAgICAgICByZXR1cm4gbXR4UGFyZW50V29ybGRTY2FsZTtcclxuICAgICAgfSkoKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGNvbnN0IG10eFdvcmxkUm90YXRpb25TY2FsZTogTWF0cml4NHg0ID0gcGFyZW50IHx8IG10eExvY2FsUm90YXRpb24gfHwgbXR4TG9jYWxTY2FsaW5nID8gTWF0cml4NHg0LklERU5USVRZKCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChwYXJlbnQgfHwgbXR4TG9jYWxSb3RhdGlvbiB8fCBtdHhMb2NhbFNjYWxpbmcpIHtcclxuICAgICAgICBjb25zdCBpbmhlcml0VHlwZTogbnVtYmVyID0gX21vZGVsRkJYLkluaGVyaXRUeXBlIHx8IDA7XHJcbiAgICAgICAgaWYgKGluaGVyaXRUeXBlID09IDApIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFJvdGF0aW9uKTtcclxuICAgICAgICAgIGlmIChtdHhMb2NhbFJvdGF0aW9uKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcbiAgICAgICAgICBpZiAocGFyZW50KVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50V29ybGRTY2FsZSk7XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxTY2FsaW5nKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxTY2FsaW5nKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGluaGVyaXRUeXBlID09IDEpIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eFBhcmVudFdvcmxkUm90YXRpb24pO1xyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50V29ybGRTY2FsZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxSb3RhdGlvbilcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eExvY2FsUm90YXRpb24pO1xyXG4gICAgICAgICAgaWYgKG10eExvY2FsU2NhbGluZylcclxuICAgICAgICAgICAgbXR4V29ybGRSb3RhdGlvblNjYWxlLm11bHRpcGx5KG10eExvY2FsU2NhbGluZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFJvdGF0aW9uKTtcclxuICAgICAgICAgIGlmIChtdHhMb2NhbFJvdGF0aW9uKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcbiAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIG10eFdvcmxkUm90YXRpb25TY2FsZS5tdWx0aXBseShtdHhQYXJlbnRXb3JsZFNjYWxlKTtcclxuICAgICAgICAgICAgbGV0IG10eFBhcmVudExvY2FsU2NhbGluZ0ludmVyc2U6IE1hdHJpeDR4NCA9IE1hdHJpeDR4NC5TQ0FMSU5HKHBhcmVudC5tdHhMb2NhbC5zY2FsaW5nKTtcclxuICAgICAgICAgICAgbXR4UGFyZW50TG9jYWxTY2FsaW5nSW52ZXJzZSA9IE1hdHJpeDR4NC5JTlZFUlNFKG10eFBhcmVudExvY2FsU2NhbGluZ0ludmVyc2UpO1xyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4UGFyZW50TG9jYWxTY2FsaW5nSW52ZXJzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobXR4TG9jYWxTY2FsaW5nKVxyXG4gICAgICAgICAgICBtdHhXb3JsZFJvdGF0aW9uU2NhbGUubXVsdGlwbHkobXR4TG9jYWxTY2FsaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbG9jYWwgdHJhbnNmb3JtIG1hdHJpeFxyXG4gICAgICBsZXQgdHJhbnNsYXRpb246IFZlY3RvcjM7XHJcbiAgICAgIHRyYW5zbGF0aW9uID0gVmVjdG9yMy5aRVJPKCk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguTGNsVHJhbnNsYXRpb24pXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKHRoaXMuZ2V0VHJhbnNmb3JtVmVjdG9yKF9tb2RlbEZCWC5MY2xUcmFuc2xhdGlvbiwgVmVjdG9yMy5aRVJPKSk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguUm90YXRpb25PZmZzZXQpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5Sb3RhdGlvbk9mZnNldCk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguUm90YXRpb25QaXZvdClcclxuICAgICAgICB0cmFuc2xhdGlvbi5hZGQoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpO1xyXG5cclxuICAgICAgY29uc3QgbXR4VHJhbnNmb3JtOiBNYXRyaXg0eDQgPSBNYXRyaXg0eDQuVFJBTlNMQVRJT04odHJhbnNsYXRpb24pO1xyXG4gICAgICBpZiAobXR4TG9jYWxSb3RhdGlvbilcclxuICAgICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkobXR4TG9jYWxSb3RhdGlvbik7XHJcblxyXG4gICAgICB0cmFuc2xhdGlvbiA9IFZlY3RvcjMuWkVSTygpO1xyXG4gICAgICBpZiAoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uc3VidHJhY3QoX21vZGVsRkJYLlJvdGF0aW9uUGl2b3QpO1xyXG4gICAgICBpZiAoX21vZGVsRkJYLlNjYWxpbmdPZmZzZXQpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5TY2FsaW5nT2Zmc2V0KTtcclxuICAgICAgaWYgKF9tb2RlbEZCWC5TY2FsaW5nUGl2b3QpXHJcbiAgICAgICAgdHJhbnNsYXRpb24uYWRkKF9tb2RlbEZCWC5TY2FsaW5nUGl2b3QpO1xyXG4gICAgICBtdHhUcmFuc2Zvcm0udHJhbnNsYXRlKHRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgIGlmIChtdHhMb2NhbFNjYWxpbmcpXHJcbiAgICAgICAgbXR4VHJhbnNmb3JtLm11bHRpcGx5KG10eExvY2FsU2NhbGluZyk7XHJcbiAgICAgIGlmIChfbW9kZWxGQlguU2NhbGluZ1Bpdm90KVxyXG4gICAgICAgIG10eFRyYW5zZm9ybS50cmFuc2xhdGUoVmVjdG9yMy5TQ0FMRShfbW9kZWxGQlguU2NhbGluZ1Bpdm90LCAtMSkpO1xyXG5cclxuICAgICAgY29uc3QgbXR4V29ybGRUcmFuc2xhdGlvbjogTWF0cml4NHg0ID0gcGFyZW50ID9cclxuICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04oTWF0cml4NHg0LlBST0RVQ1QoXHJcbiAgICAgICAgICBwYXJlbnQubXR4V29ybGQsXHJcbiAgICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04obXR4VHJhbnNmb3JtLnRyYW5zbGF0aW9uKVxyXG4gICAgICAgICkudHJhbnNsYXRpb24pIDpcclxuICAgICAgICBNYXRyaXg0eDQuVFJBTlNMQVRJT04obXR4VHJhbnNmb3JtLnRyYW5zbGF0aW9uKTtcclxuXHJcbiAgICAgIG10eFRyYW5zZm9ybS5jb3B5KG10eFdvcmxkVHJhbnNsYXRpb24pO1xyXG4gICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkobXR4V29ybGRSb3RhdGlvblNjYWxlKTtcclxuICAgICAgX25vZGUubXR4V29ybGQuY29weShtdHhUcmFuc2Zvcm0pO1xyXG5cclxuICAgICAgaWYgKHBhcmVudClcclxuICAgICAgICBtdHhUcmFuc2Zvcm0ubXVsdGlwbHkoTWF0cml4NHg0LklOVkVSU0UocGFyZW50Lm10eFdvcmxkKSwgdHJ1ZSk7XHJcbiAgICAgIF9ub2RlLmFkZENvbXBvbmVudChuZXcgQ29tcG9uZW50VHJhbnNmb3JtKG10eFRyYW5zZm9ybSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VHJhbnNmb3JtVmVjdG9yKF92ZWN0b3I6IFZlY3RvcjMgfCBGQlguQW5pbUN1cnZlTm9kZSwgX2RlZmF1bHQ6ICgpID0+IFZlY3RvcjMpOiBWZWN0b3IzIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBfdmVjdG9yID09IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICBfZGVmYXVsdCgpIDpcclxuICAgICAgICAgIF92ZWN0b3IgaW5zdGFuY2VvZiBWZWN0b3IzID9cclxuICAgICAgICAgICAgX3ZlY3RvciA6XHJcbiAgICAgICAgICAgIG5ldyBWZWN0b3IzKFxyXG4gICAgICAgICAgICAgIHR5cGVvZiAoX3ZlY3RvciA9IF92ZWN0b3IubG9hZCgpKS5kWCA9PSBcIm51bWJlclwiID9cclxuICAgICAgICAgICAgICAgIF92ZWN0b3IuZFggOlxyXG4gICAgICAgICAgICAgICAgKF92ZWN0b3IuZFgubG9hZCgpIGFzIEZCWC5BbmltQ3VydmUpLkRlZmF1bHQsXHJcbiAgICAgICAgICAgICAgdHlwZW9mIF92ZWN0b3IuZFkgPT0gXCJudW1iZXJcIiA/XHJcbiAgICAgICAgICAgICAgICBfdmVjdG9yLmRZIDpcclxuICAgICAgICAgICAgICAgIChfdmVjdG9yLmRZLmxvYWQoKSBhcyBGQlguQW5pbUN1cnZlKS5EZWZhdWx0LFxyXG4gICAgICAgICAgICAgIHR5cGVvZiBfdmVjdG9yLmRaID09IFwibnVtYmVyXCIgP1xyXG4gICAgICAgICAgICAgICAgX3ZlY3Rvci5kWiA6XHJcbiAgICAgICAgICAgICAgICAoX3ZlY3Rvci5kWi5sb2FkKCkgYXMgRkJYLkFuaW1DdXJ2ZSkuRGVmYXVsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRBbmltYXRpb25WZWN0b3IzKF9hbmltTm9kZTogRkJYLkFuaW1DdXJ2ZU5vZGUsIF90YXJnZXQ6IEZCWC5Nb2RlbCk6IEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yMyB7XHJcbiAgICAgIGNvbnN0IHZlY3RvclNlcXVlbmNlOiBBbmltYXRpb25TZXF1ZW5jZVZlY3RvcjMgPSB7fTtcclxuICAgICAgZm9yIChjb25zdCB2YWx1ZU5hbWUgaW4gX2FuaW1Ob2RlKSBpZiAodmFsdWVOYW1lID09IFwiZFhcIiB8fCB2YWx1ZU5hbWUgPT0gXCJkWVwiIHx8IHZhbHVlTmFtZSA9PSBcImRaXCIpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZTogRkJYLkFuaW1DdXJ2ZSB8IG51bWJlciA9IF9hbmltTm9kZVt2YWx1ZU5hbWVdO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgY29uc3Qgc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlID0gbmV3IEFuaW1hdGlvblNlcXVlbmNlKCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmFsdWUuS2V5VGltZS5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHJlZmVyZW5jZSB0aW1lIGlzIGRlZmluZWQgYXMgYSBzaWduZWQgaW50NjQsIHVuaXQgYmVpbmcgMS80NjE4NjE1ODAwMCBzZWNvbmRzXHJcbiAgICAgICAgICAgIC8vIHJlZjogaHR0cHM6Ly9hcmNoaXZlLmJsZW5kZXIub3JnL3dpa2kvaW5kZXgucGhwL1VzZXI6TW9udDI5L0ZvdW5kYXRpb24vRkJYX0ZpbGVfU3RydWN0dXJlLyNTb21lX1NwZWNpZmljX1Byb3BlcnR5X1R5cGVzXHJcbiAgICAgICAgICAgIHNlcXVlbmNlLmFkZEtleShuZXcgQW5pbWF0aW9uS2V5KFxyXG4gICAgICAgICAgICAgIE51bWJlcigodmFsdWUuS2V5VGltZVtpXSAtIHZhbHVlLktleVRpbWUucmVkdWNlKChfbWluLCBfdikgPT4gX3YgPCBfbWluID8gX3YgOiBfbWluKSkgLyBCaWdJbnQoXCI0NjE4NjE1OFwiKSksXHJcbiAgICAgICAgICAgICAgdmFsdWUuS2V5VmFsdWVGbG9hdFtpXVxyXG4gICAgICAgICAgICApKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZlY3RvclNlcXVlbmNlW3ZhbHVlTmFtZVsxXS50b0xvd2VyQ2FzZSgpXSA9IHNlcXVlbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKF9hbmltTm9kZS5uYW1lID09IFwiUlwiICYmIChfdGFyZ2V0LlByZVJvdGF0aW9uIHx8IF90YXJnZXQuUG9zdFJvdGF0aW9uKSkge1xyXG4gICAgICAgIGxldCBwcmVSb3RvdGF0aW9uOiBNYXRyaXg0eDQ7XHJcbiAgICAgICAgaWYgKF90YXJnZXQuUHJlUm90YXRpb24pXHJcbiAgICAgICAgICBwcmVSb3RvdGF0aW9uID0gTWF0cml4NHg0LlJPVEFUSU9OKF90YXJnZXQuUHJlUm90YXRpb24pO1xyXG4gICAgICAgIGxldCBwb3N0Um90YXRpb246IE1hdHJpeDR4NDtcclxuICAgICAgICBpZiAoX3RhcmdldC5Qb3N0Um90YXRpb24pXHJcbiAgICAgICAgICBwb3N0Um90YXRpb24gPSBNYXRyaXg0eDQuUk9UQVRJT04oX3RhcmdldC5Qb3N0Um90YXRpb24pO1xyXG5cclxuICAgICAgICBbdmVjdG9yU2VxdWVuY2UueCwgdmVjdG9yU2VxdWVuY2UueSwgdmVjdG9yU2VxdWVuY2Uuel1cclxuICAgICAgICAgIC5mbGF0TWFwKF9zZXEgPT4gX3NlcT8uZ2V0S2V5cygpKVxyXG4gICAgICAgICAgLm1hcChfa2V5ID0+IF9rZXk/LnRpbWUpXHJcbiAgICAgICAgICAuc29ydCgoX3RpbWVBLCBfdGltZUIpID0+IF90aW1lQSAtIF90aW1lQikgLy8gc29ydCB0aW1lc1xyXG4gICAgICAgICAgLmZpbHRlcigoX3RpbWUsIF9pbmRleCwgX3RpbWVzKSA9PiBfdGltZSAhPSBfdGltZXNbX2luZGV4ICsgMV0pIC8vIHJlbW92ZSBkdXBsaWNhdGVzXHJcbiAgICAgICAgICAubWFwKF90aW1lID0+IHsgLy8gZmluZCBrZXlzIGZvciBhbGwgYXhlcyBhdCB0aW1lXHJcbiAgICAgICAgICAgIHJldHVybiB7IHg6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueCksIHk6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueSksIHo6IGZpbmRLZXkodmVjdG9yU2VxdWVuY2UueikgfTtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZmluZEtleShfc2VxdWVuY2U6IEFuaW1hdGlvblNlcXVlbmNlKTogQW5pbWF0aW9uS2V5IHtcclxuICAgICAgICAgICAgICByZXR1cm4gX3NlcXVlbmNlPy5nZXRLZXlzKCkuZmluZChfa2V5ID0+IF9rZXkudGltZSA9PSBfdGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuZm9yRWFjaChfZnJhbWUgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdmN0RXVsZXJBbmdsZXM6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgICAgICAgIHZjdEV1bGVyQW5nbGVzLnNldChcclxuICAgICAgICAgICAgICBfZnJhbWUueD8udmFsdWUgPz8gMCxcclxuICAgICAgICAgICAgICBfZnJhbWUueT8udmFsdWUgPz8gMCxcclxuICAgICAgICAgICAgICBfZnJhbWUuej8udmFsdWUgPz8gMFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBtdHhSb3RhdGlvbjogTWF0cml4NHg0ID0gTWF0cml4NHg0LlJPVEFUSU9OKHZjdEV1bGVyQW5nbGVzKTtcclxuICAgICAgICAgICAgaWYgKHByZVJvdG90YXRpb24pXHJcbiAgICAgICAgICAgICAgbXR4Um90YXRpb24ubXVsdGlwbHkocHJlUm90b3RhdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChwb3N0Um90YXRpb24pXHJcbiAgICAgICAgICAgICAgbXR4Um90YXRpb24ubXVsdGlwbHkocG9zdFJvdGF0aW9uKTtcclxuICAgICAgICAgICAgdmN0RXVsZXJBbmdsZXMgPSBtdHhSb3RhdGlvbi5yb3RhdGlvbjtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS54KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS54LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMueDtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS55KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS55LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMueTtcclxuICAgICAgICAgICAgaWYgKF9mcmFtZS56KVxyXG4gICAgICAgICAgICAgIF9mcmFtZS56LnZhbHVlID0gdmN0RXVsZXJBbmdsZXMuejtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdmVjdG9yU2VxdWVuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRPcmRlcmVkKF9yb3RhdGlvbjogVmVjdG9yMywgX21vZGVsRkJYOiBGQlguTW9kZWwpOiBWZWN0b3IzIHtcclxuICAgICAgaWYgKCFfbW9kZWxGQlguRXVsZXJPcmRlcilcclxuICAgICAgICByZXR1cm4gX3JvdGF0aW9uO1xyXG5cclxuICAgICAgY29uc3QgZGF0YTogRmxvYXQzMkFycmF5ID0gX3JvdGF0aW9uLmdldCgpO1xyXG4gICAgICBjb25zdCByZXN1bHQ6IFZlY3RvcjMgPSBSZWN5Y2xlci5nZXQoVmVjdG9yMyk7XHJcbiAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWlwiKV0sXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWVwiKV0sXHJcbiAgICAgICAgZGF0YVtfbW9kZWxGQlguRXVsZXJPcmRlci5pbmRleE9mKFwiWFwiKV1cclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZCWCB7XHJcbiAgLyoqXHJcbiAgICogSW50ZXJmYWNlIHRvIHJlcHJlc2VudCBmYngtbm9kZXMgY29udGFpbmluZyBpdHMgbmFtZSwgY2hpbGRyZW4gYW5kIHByb3BlcnRpZXMuXHJcbiAgICogQ2hpbGRyZW4gYW5kIHByb3Blcml0ZXMgYXJlIGxhenkuXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBOb2RlIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBcclxuICAgIHByaXZhdGUgbG9hZFByb3BlcnRpZXM6ICgpID0+IE5vZGVQcm9wZXJ0eVtdO1xyXG4gICAgcHJpdmF0ZSBsb2FkQ2hpbGRyZW46ICgpID0+IE5vZGVbXTtcclxuICAgIFxyXG4gICAgI2NoaWxkcmVuOiBOb2RlW107XHJcbiAgICAjcHJvcGVydGllczogTm9kZVByb3BlcnR5W107XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcsIF9sb2FkUHJvcGVydGllczogKCkgPT4gTm9kZVByb3BlcnR5W10sIF9sb2FkQ2hpbGRyZW46ICgpID0+IE5vZGVbXSkge1xyXG4gICAgICB0aGlzLm5hbWUgPSBfbmFtZTtcclxuICAgICAgdGhpcy5sb2FkUHJvcGVydGllcyA9IF9sb2FkUHJvcGVydGllcztcclxuICAgICAgdGhpcy5sb2FkQ2hpbGRyZW4gPSBfbG9hZENoaWxkcmVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcHJvcGVydGllcygpOiBOb2RlUHJvcGVydHlbXSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNwcm9wZXJ0aWVzIHx8ICh0aGlzLiNwcm9wZXJ0aWVzID0gdGhpcy5sb2FkUHJvcGVydGllcygpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNoaWxkcmVuKCk6IE5vZGVbXSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNjaGlsZHJlbiB8fCAodGhpcy4jY2hpbGRyZW4gPSB0aGlzLmxvYWRDaGlsZHJlbigpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCB0eXBlIFByb3BlcnR5NzAgPSBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgRnVkZ2VDb3JlLlZlY3RvcjM7XHJcblxyXG4gIGV4cG9ydCB0eXBlIE5vZGVQcm9wZXJ0eSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBVaW50OEFycmF5IHwgVWludDE2QXJyYXkgfCBGbG9hdDMyQXJyYXk7XHJcblxyXG4gIGV4cG9ydCBlbnVtIEFSUkFZX0VOQ09ESU5HIHtcclxuICAgIFVOQ09NUFJFU1NFRCwgQ09NUFJFU1NFRFxyXG4gIH1cclxuICBcclxufSIsIm5hbWVzcGFjZSBGQlgge1xyXG4gIC8qKlxyXG4gICAqIExvYWRzIGFuIGZieCBmaWxlIGZyb20gaXRzIGZieC1ub2RlIGFycmF5IHdoaWNoIG1heSBiZSByZXRyaWV2ZWQgYnkgcGFyc2VOb2Rlc0Zyb21CaW5hcnkuXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBsb2FkRnJvbU5vZGVzKF9ub2RlczogTm9kZVtdKTogRkJYIHtcclxuICAgIGNvbnN0IGZieDogRkJYID0ge1xyXG4gICAgICBkb2N1bWVudHM6IHVuZGVmaW5lZCxcclxuICAgICAgb2JqZWN0czoge1xyXG4gICAgICAgIGFsbDogdW5kZWZpbmVkLFxyXG4gICAgICAgIG1vZGVsczogW10sXHJcbiAgICAgICAgZ2VvbWV0cmllczogW10sXHJcbiAgICAgICAgbWF0ZXJpYWxzOiBbXSxcclxuICAgICAgICBwb3NlczogW10sXHJcbiAgICAgICAgdGV4dHVyZXM6IFtdLFxyXG4gICAgICAgIGFuaW1TdGFja3M6IFtdXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbm5lY3Rpb25zOiB1bmRlZmluZWRcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIF9ub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5uYW1lID09IFwiRG9jdW1lbnRzXCIpXHJcbiAgICAgICAgZmJ4LmRvY3VtZW50cyA9IG5vZGUuY2hpbGRyZW5cclxuICAgICAgICAgIC5maWx0ZXIoX2RvY3VtZW50Tm9kZSA9PiBfZG9jdW1lbnROb2RlLm5hbWUgPT0gXCJEb2N1bWVudFwiKVxyXG4gICAgICAgICAgLm1hcChfZG9jdW1lbnROb2RlID0+IGdldERvY3VtZW50KF9kb2N1bWVudE5vZGUpKTtcclxuICAgICAgZWxzZSBpZiAobm9kZS5uYW1lID09IFwiT2JqZWN0c1wiKVxyXG4gICAgICAgIGZieC5vYmplY3RzLmFsbCA9IG5vZGUuY2hpbGRyZW4ubWFwKF9vYmplY3ROb2RlID0+IGdldE9iamVjdChfb2JqZWN0Tm9kZSwgZmJ4KSk7XHJcbiAgICAgIGVsc2UgaWYgKG5vZGUubmFtZSA9PSBcIkNvbm5lY3Rpb25zXCIpXHJcbiAgICAgICAgZmJ4LmNvbm5lY3Rpb25zID0gbm9kZS5jaGlsZHJlbi5tYXAoX2Nvbm5lY3Rpb25Ob2RlID0+IGdldENvbm5lY3Rpb24oX2Nvbm5lY3Rpb25Ob2RlKSk7XHJcbiAgICAgIGlmIChmYnguZG9jdW1lbnRzICYmIGZieC5vYmplY3RzLmFsbCAmJiBmYnguY29ubmVjdGlvbnMpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgZ3JvdXBPYmplY3RzKGZieCk7XHJcbiAgICBhcHBseUNvbm5lY3Rpb25zKGZieC5jb25uZWN0aW9ucywgZmJ4LmRvY3VtZW50cywgZmJ4Lm9iamVjdHMuYWxsKTtcclxuXHJcbiAgICByZXR1cm4gZmJ4O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoX25vZGU6IE5vZGUpOiBEb2N1bWVudCB7XHJcbiAgICBjb25zdCBkb2N1bWVudDogT2JqZWN0ID0ge1xyXG4gICAgICB1aWQ6IF9ub2RlLnByb3BlcnRpZXNbMF0gYXMgbnVtYmVyLFxyXG4gICAgICBuYW1lOiBfbm9kZS5wcm9wZXJ0aWVzWzJdIGFzIHN0cmluZyxcclxuICAgICAgbG9hZGVkOiBmYWxzZSxcclxuICAgICAgbG9hZDogKCkgPT4gbG9hZE9iamVjdFByb3BlcnRpZXMoX25vZGUsIGRvY3VtZW50KVxyXG4gICAgfTtcclxuICAgIHJldHVybiBkb2N1bWVudDtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldE9iamVjdChfbm9kZTogTm9kZSwgX2ZieDogRkJYKTogT2JqZWN0IHtcclxuICAgIGNvbnN0IG5hbWVBbmRUeXBlOiBzdHJpbmdbXSA9IChfbm9kZS5wcm9wZXJ0aWVzWzFdIGFzIHN0cmluZykuc3BsaXQoXCI6OlwiKTtcclxuICAgIGNvbnN0IG9iamVjdDogT2JqZWN0ID0ge1xyXG4gICAgICB1aWQ6IF9ub2RlLnByb3BlcnRpZXNbMF0gYXMgbnVtYmVyLFxyXG4gICAgICBuYW1lOiBuYW1lQW5kVHlwZVswXSxcclxuICAgICAgdHlwZTogbmFtZUFuZFR5cGVbMV0sXHJcbiAgICAgIHN1YnR5cGU6IF9ub2RlLnByb3BlcnRpZXNbMl0gYXMgc3RyaW5nLFxyXG4gICAgICBsb2FkZWQ6IGZhbHNlLFxyXG4gICAgICBsb2FkOiAoKSA9PiBsb2FkT2JqZWN0UHJvcGVydGllcyhfbm9kZSwgb2JqZWN0KVxyXG4gICAgfTtcclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBncm91cE9iamVjdHMoX2ZieDogRkJYKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBfZmJ4Lm9iamVjdHMuYWxsKSB7XHJcbiAgICAgIGlmIChvYmplY3QudHlwZSA9PSBcIk1vZGVsXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLm1vZGVscy5wdXNoKG9iamVjdCk7XHJcbiAgICAgIGVsc2UgaWYgKG9iamVjdC50eXBlID09IFwiR2VvbWV0cnlcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMuZ2VvbWV0cmllcy5wdXNoKG9iamVjdCk7XHJcbiAgICAgIGVsc2UgaWYgKG9iamVjdC50eXBlID09IFwiTWF0ZXJpYWxcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMubWF0ZXJpYWxzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJQb3NlXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLnBvc2VzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJUZXh0dXJlXCIpXHJcbiAgICAgICAgX2ZieC5vYmplY3RzLnRleHR1cmVzLnB1c2gob2JqZWN0KTtcclxuICAgICAgZWxzZSBpZiAob2JqZWN0LnR5cGUgPT0gXCJBbmltU3RhY2tcIilcclxuICAgICAgICBfZmJ4Lm9iamVjdHMuYW5pbVN0YWNrcy5wdXNoKG9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRDb25uZWN0aW9uKF9ub2RlOiBOb2RlKTogQ29ubmVjdGlvbiB7XHJcbiAgICBpZiAoIShfbm9kZS5wcm9wZXJ0aWVzWzBdID09IFwiT09cIiB8fCBfbm9kZS5wcm9wZXJ0aWVzWzBdID09IFwiT1BcIikpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBDb25uZWN0aW9uIHR5cGUgJHtfbm9kZS5wcm9wZXJ0aWVzWzBdfSBpcyBub3Qgc3VwcG9ydGVkYCk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY2hpbGRVSUQ6IF9ub2RlLnByb3BlcnRpZXNbMV0gYXMgbnVtYmVyLFxyXG4gICAgICBwYXJlbnRVSUQ6IF9ub2RlLnByb3BlcnRpZXNbMl0gYXMgbnVtYmVyLFxyXG4gICAgICBwcm9wZXJ0eU5hbWU6IF9ub2RlLnByb3BlcnRpZXNbMF0gPT0gXCJPUFwiID8gX25vZGUucHJvcGVydGllc1szXSBhcyBzdHJpbmcgOiBudWxsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gYXBwbHlDb25uZWN0aW9ucyhfY29ubmVjdGlvbnM6IENvbm5lY3Rpb25bXSwgX2RvY3VtZW50czogRG9jdW1lbnRbXSwgX29iamVjdHM6IE9iamVjdFtdKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgX2Nvbm5lY3Rpb25zKSB7XHJcbiAgICAgIGxldCBwYXJlbnQ6IE9iamVjdCA9IF9kb2N1bWVudHMuZmluZChfZG9jdW1lbnQgPT4gX2RvY3VtZW50LmxvYWQoKS5Sb290Tm9kZSA9PSBjb25uZWN0aW9uLnBhcmVudFVJRCkgYXMgT2JqZWN0O1xyXG4gICAgICBsZXQgY2hpbGQ6IE9iamVjdDtcclxuICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgX29iamVjdHMpIHtcclxuICAgICAgICBpZiAocGFyZW50ID09IHVuZGVmaW5lZCAmJiBvYmplY3QudWlkID09IGNvbm5lY3Rpb24ucGFyZW50VUlEKVxyXG4gICAgICAgICAgcGFyZW50ID0gb2JqZWN0O1xyXG4gICAgICAgIGlmIChjaGlsZCA9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnVpZCA9PSBjb25uZWN0aW9uLmNoaWxkVUlEKVxyXG4gICAgICAgICAgY2hpbGQgPSBvYmplY3Q7XHJcbiAgICAgICAgaWYgKHBhcmVudCAhPSB1bmRlZmluZWQgJiYgY2hpbGQgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoaWxkKVxyXG4gICAgICAgIChjaGlsZC5wYXJlbnRzIHx8IChjaGlsZC5wYXJlbnRzID0gW10pKS5wdXNoKHBhcmVudCk7XHJcbiAgICAgIGlmIChjb25uZWN0aW9uLnByb3BlcnR5TmFtZSA9PSBudWxsKVxyXG4gICAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgKHBhcmVudC5jaGlsZHJlbiA9IFtdKSkucHVzaChjaGlsZCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICAocGFyZW50IGFzIE9iamVjdClbZm9ybWF0UHJvcGVydHlOYW1lKGNvbm5lY3Rpb24ucHJvcGVydHlOYW1lKV0gPSBjaGlsZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxvYWRPYmplY3RQcm9wZXJ0aWVzKF9ub2RlOiBOb2RlLCBfb2JqZWN0OiBPYmplY3QpOiBPYmplY3Qge1xyXG4gICAgaWYgKF9vYmplY3QubG9hZGVkKVxyXG4gICAgICByZXR1cm4gX29iamVjdDtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgX25vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgaWYgKGNoaWxkLm5hbWUgPT0gXCJQcm9wZXJ0aWVzNzBcIilcclxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5NzAgb2YgY2hpbGQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGZvcm1hdFByb3BlcnR5TmFtZShwcm9wZXJ0eTcwLnByb3BlcnRpZXNbMF0gYXMgc3RyaW5nKTtcclxuICAgICAgICAgIGlmICghX29iamVjdFtuYW1lXSlcclxuICAgICAgICAgICAgX29iamVjdFtuYW1lXSA9IGdldFByb3BlcnR5NzBWYWx1ZShwcm9wZXJ0eTcwKTtcclxuICAgICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGZvcm1hdFByb3BlcnR5TmFtZShjaGlsZC5uYW1lKTtcclxuICAgICAgICBpZiAoIV9vYmplY3RbbmFtZV0pXHJcbiAgICAgICAgICBfb2JqZWN0W25hbWVdID0gZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIF9vYmplY3QubG9hZGVkID0gdHJ1ZTtcclxuICAgIHJldHVybiBfb2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0UHJvcGVydHlWYWx1ZShfbm9kZTogTm9kZSk6IE5vZGVQcm9wZXJ0eSB8IE9iamVjdCB7XHJcbiAgICByZXR1cm4gX25vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMFxyXG4gICAgICA/IF9ub2RlLmNoaWxkcmVuLnJlZHVjZShcclxuICAgICAgICAoX3N1YlByb3BlcnRpZXMsIF9zdWJQcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gZm9ybWF0UHJvcGVydHlOYW1lKF9zdWJQcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgIGlmIChfc3ViUHJvcGVydGllc1tuYW1lXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIF9zdWJQcm9wZXJ0aWVzW25hbWVdID0gZ2V0UHJvcGVydHlWYWx1ZShfc3ViUHJvcGVydHkpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghKF9zdWJQcm9wZXJ0aWVzW25hbWVdIGluc3RhbmNlb2YgQXJyYXkpKVxyXG4gICAgICAgICAgICAgIF9zdWJQcm9wZXJ0aWVzW25hbWVdID0gW19zdWJQcm9wZXJ0aWVzW25hbWVdIGFzIE9iamVjdF07XHJcbiAgICAgICAgICAgIChfc3ViUHJvcGVydGllc1tuYW1lXSBhcyBPYmplY3RbXSkucHVzaChnZXRQcm9wZXJ0eVZhbHVlKF9zdWJQcm9wZXJ0eSkgYXMgT2JqZWN0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBfc3ViUHJvcGVydGllcztcclxuICAgICAgICB9LFxyXG4gICAgICAgIHt9IGFzIE9iamVjdFxyXG4gICAgICApXHJcbiAgICAgIDogX25vZGUucHJvcGVydGllc1swXTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldFByb3BlcnR5NzBWYWx1ZShfbm9kZTogTm9kZSk6IFByb3BlcnR5NzAge1xyXG4gICAgc3dpdGNoIChfbm9kZS5wcm9wZXJ0aWVzWzFdIGFzIHN0cmluZykge1xyXG4gICAgICBjYXNlIFwiYm9vbFwiOlxyXG4gICAgICAgIHJldHVybiBfbm9kZS5wcm9wZXJ0aWVzWzRdIGFzIGJvb2xlYW47XHJcblxyXG4gICAgICBjYXNlIFwiaW50XCI6XHJcbiAgICAgIGNhc2UgXCJlbnVtXCI6XHJcbiAgICAgIGNhc2UgXCJVTG9uZ0xvbmdcIjpcclxuICAgICAgY2FzZSBcImRvdWJsZVwiOlxyXG4gICAgICBjYXNlIFwiTnVtYmVyXCI6XHJcbiAgICAgIGNhc2UgXCJGaWVsZE9mVmlld1wiOlxyXG4gICAgICAgIHJldHVybiBfbm9kZS5wcm9wZXJ0aWVzWzRdIGFzIG51bWJlcjtcclxuXHJcbiAgICAgIGNhc2UgXCJDb2xvclwiOlxyXG4gICAgICBjYXNlIFwiQ29sb3JSR0JcIjpcclxuICAgICAgY2FzZSBcIlZlY3RvcjNEXCI6XHJcbiAgICAgIGNhc2UgXCJMY2wgVHJhbnNsYXRpb25cIjpcclxuICAgICAgY2FzZSBcIkxjbCBSb3RhdGlvblwiOlxyXG4gICAgICBjYXNlIFwiTGNsIFNjYWxpbmdcIjpcclxuICAgICAgICByZXR1cm4gbmV3IEZ1ZGdlQ29yZS5WZWN0b3IzKC4uLl9ub2RlLnByb3BlcnRpZXMuc2xpY2UoNCwgNykgYXMgbnVtYmVyW10pO1xyXG5cclxuICAgICAgY2FzZSBcIktTdHJpbmdcIjpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gX25vZGUucHJvcGVydGllc1s0XSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eU5hbWUoX25hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gX25hbWUucmVwbGFjZSgvW15hLXpBLVpdLywgXCJcIik7XHJcbiAgfVxyXG5cclxufSIsIm5hbWVzcGFjZSBGQlgge1xyXG4gIC8qKlxyXG4gICAqIFBhcnNlcyBmYngtbm9kZXMgYXJyYXkgZnJvbSBhIGJpbmFyeSBmYngtZmlsZS5cclxuICAgKiBkZXNwaXRlIHRoZSBsYXp5IG5vZGUgaW1wbGVtZW50YXRpb24gaXQgaXMgbW9zdGx5IGEgY29weSBvZiB0aGUgcmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20vcGljb2RlNy9mYngtcGFyc2VyXHJcbiAgICogQGF1dGhvciBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBwYXJzZU5vZGVzRnJvbUJpbmFyeShfYnVmZmVyOiBBcnJheUJ1ZmZlcik6IE5vZGVbXSB7XHJcbiAgICBpZiAoX2J1ZmZlci5ieXRlTGVuZ3RoIDwgYmluYXJ5U3RhcnRDaGFycy5sZW5ndGgpXHJcbiAgICAgIHRocm93IFwiTm90IGEgYmluYXJ5IEZCWCBmaWxlXCI7XHJcblxyXG4gICAgY29uc3QgZGF0YTogQnVmZmVyUmVhZGVyID0gbmV3IEJ1ZmZlclJlYWRlcihfYnVmZmVyKTtcclxuICAgIGNvbnN0IGZpcnN0Q2hhcnM6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShkYXRhLmdldFNlcXVlbmNlKGRhdGEuZ2V0VWludDgsIGJpbmFyeVN0YXJ0Q2hhcnMubGVuZ3RoKSk7XHJcbiAgICBjb25zdCBtYXRjaGVzRkJYQmluYXJ5Rmlyc3RDaGFyczogYm9vbGVhblxyXG4gICAgICA9IGZpcnN0Q2hhcnMuZXZlcnkoKF92YWx1ZSwgX2luZGV4KSA9PiBfdmFsdWUgPT0gYmluYXJ5U3RhcnRDaGFyc1tfaW5kZXhdKTtcclxuICAgIGlmICghbWF0Y2hlc0ZCWEJpbmFyeUZpcnN0Q2hhcnMpXHJcbiAgICAgIHRocm93IFwiTm90IGEgYmluYXJ5IEZCWCBmaWxlXCI7XHJcblxyXG4gICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIGNvbnN0IG5vZGVBdHRyaWJ1dGVzQXNVSW50NjQ6IGJvb2xlYW4gPSB2ZXJzaW9uID49IDc1MDA7IC8vIFdhcnVtID49IDc1MDA/XHJcbiAgICBjb25zdCBub2RlczogTm9kZVtdID0gW107XHJcblxyXG4gICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IHJlYWROb2RlKGRhdGEsIG5vZGVBdHRyaWJ1dGVzQXNVSW50NjQpO1xyXG4gICAgICBpZiAobm9kZSA9PSBudWxsKSBicmVhaztcclxuICAgICAgbm9kZXMucHVzaChub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9kZXM7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkTm9kZShfZGF0YTogQnVmZmVyUmVhZGVyLCBfYXR0cmlidXRlc0FzVWludDY0OiBib29sZWFuKTogTm9kZSB7XHJcbiAgICBjb25zdCBlbmRPZmZzZXQ6IG51bWJlciA9IF9hdHRyaWJ1dGVzQXNVaW50NjQgPyBOdW1iZXIoX2RhdGEuZ2V0VWludDY0KCkpIDogX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBpZiAoZW5kT2Zmc2V0ID09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHByb3BlcnRpZXNMZW5ndGg6IG51bWJlciA9IF9hdHRyaWJ1dGVzQXNVaW50NjQgPyBOdW1iZXIoX2RhdGEuZ2V0VWludDY0KCkpIDogX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzQnl0ZUxlbmd0aDogbnVtYmVyID0gX2F0dHJpYnV0ZXNBc1VpbnQ2NCA/IE51bWJlcihfZGF0YS5nZXRVaW50NjQoKSkgOiBfZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIGNvbnN0IG5hbWVMZW5ndGg6IG51bWJlciA9IF9kYXRhLmdldFVpbnQ4KCk7XHJcbiAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBfZGF0YS5nZXRTdHJpbmcobmFtZUxlbmd0aCk7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzT2Zmc2V0OiBudW1iZXIgPSBfZGF0YS5vZmZzZXQ7XHJcbiAgICBjb25zdCBjaGlsZHJlbk9mZnNldDogbnVtYmVyID0gcHJvcGVydGllc09mZnNldCArIHByb3BlcnRpZXNCeXRlTGVuZ3RoO1xyXG5cclxuICAgIGNvbnN0IG5vZGU6IE5vZGUgPSBuZXcgTm9kZShcclxuICAgICAgbmFtZSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIF9kYXRhLm9mZnNldCA9IHByb3BlcnRpZXNPZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydGllczogTm9kZVByb3BlcnR5W10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpUHJvcGVydHk6IG51bWJlciA9IDA7IGlQcm9wZXJ0eSA8IHByb3BlcnRpZXNMZW5ndGg7IGlQcm9wZXJ0eSsrKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocmVhZFByb3BlcnR5KF9kYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgX2RhdGEub2Zmc2V0ID0gY2hpbGRyZW5PZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW46IE5vZGVbXSA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChlbmRPZmZzZXQgLSBfZGF0YS5vZmZzZXQgPiBudWxsQ291bnRBdE5vZGVFbmQpIHtcclxuICAgICAgICAgIGNvbnN0IGNoaWxkOiBGQlguTm9kZSA9IHJlYWROb2RlKF9kYXRhLCBfYXR0cmlidXRlc0FzVWludDY0KTtcclxuICAgICAgICAgIGlmIChjaGlsZCkgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBfZGF0YS5vZmZzZXQgPSBlbmRPZmZzZXQ7XHJcblxyXG4gICAgcmV0dXJuIG5vZGU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkUHJvcGVydHkoX2RhdGE6IEJ1ZmZlclJlYWRlcik6IEZCWC5Ob2RlUHJvcGVydHkge1xyXG4gICAgY29uc3QgdHlwZUNvZGU6IHN0cmluZyA9IF9kYXRhLmdldENoYXIoKTtcclxuXHJcbiAgICBjb25zdCB2YWx1ZTogRkJYLk5vZGVQcm9wZXJ0eSA9IHtcclxuICAgICAgQzogX2RhdGEuZ2V0Qm9vbCxcclxuICAgICAgWTogX2RhdGEuZ2V0SW50MTYsXHJcbiAgICAgIEk6IF9kYXRhLmdldEludDMyLFxyXG4gICAgICBMOiBfZGF0YS5nZXRJbnQ2NCxcclxuICAgICAgRjogX2RhdGEuZ2V0RmxvYXQzMixcclxuICAgICAgRDogX2RhdGEuZ2V0RmxvYXQ2NCxcclxuICAgICAgUzogKCkgPT4gX2RhdGEuZ2V0U3RyaW5nKF9kYXRhLmdldFVpbnQzMigpKS5yZXBsYWNlKFwiXFx4MDBcXHgwMVwiLCBcIjo6XCIpLFxyXG4gICAgICBzOiAoKSA9PiBfZGF0YS5nZXRTdHJpbmcoX2RhdGEuZ2V0VWludDMyKCkpLnJlcGxhY2UoXCJcXHgwMFxceDAxXCIsIFwiOjpcIiksXHJcbiAgICAgIFI6ICgpID0+IG5ldyBVaW50OEFycmF5KHJlYWRSYXcoX2RhdGEsIF9kYXRhLmdldFVpbnQ4KSksXHJcbiAgICAgIHI6ICgpID0+IG5ldyBVaW50OEFycmF5KHJlYWRBcnJheShfZGF0YSwgX2RhdGEuZ2V0VWludDgpKSxcclxuICAgICAgYjogKCkgPT4gbmV3IFVpbnQ4QXJyYXkocmVhZEFycmF5KF9kYXRhLCBfZGF0YS5nZXRVaW50OCkpLFxyXG4gICAgICBpOiAoKSA9PiBuZXcgSW50MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEludDMyKSksXHJcbiAgICAgIGw6ICgpID0+IG5ldyBCaWdJbnQ2NEFycmF5KHJlYWRBcnJheShfZGF0YSwgX2RhdGEuZ2V0SW50NjQpKSxcclxuICAgICAgZjogKCkgPT4gbmV3IEZsb2F0MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEZsb2F0MzIpKSxcclxuICAgICAgZDogKCkgPT4gbmV3IEZsb2F0MzJBcnJheShyZWFkQXJyYXkoX2RhdGEsIF9kYXRhLmdldEZsb2F0NjQpKVxyXG4gICAgfVt0eXBlQ29kZV0/LmNhbGwoX2RhdGEpO1xyXG5cclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxyXG4gICAgICBGdWRnZUNvcmUuRGVidWcud2FybihgVW5rbm93biBwcm9wZXJ0eSB0eXBlICR7dHlwZUNvZGUuY2hhckNvZGVBdCgwKX1gKTtcclxuXHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkQXJyYXk8VCBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oX2RhdGE6IEJ1ZmZlclJlYWRlciwgX2dldHRlcjogKCkgPT4gVCk6IEdlbmVyYXRvcjxUPiB7XHJcbiAgICBjb25zdCBsZW5ndGg6IG51bWJlciA9IF9kYXRhLmdldFVpbnQzMigpO1xyXG4gICAgY29uc3QgZW5jb2Rpbmc6IEZCWC5BUlJBWV9FTkNPRElORyA9IF9kYXRhLmdldFVpbnQzMigpO1xyXG4gICAgY29uc3QgYnl0ZUxlbmd0aDogbnVtYmVyID0gX2RhdGEuZ2V0VWludDMyKCk7XHJcbiAgICBjb25zdCBlbmRPZmZzZXQ6IG51bWJlciA9IF9kYXRhLm9mZnNldCArIGJ5dGVMZW5ndGg7XHJcblxyXG4gICAgY29uc3QgaXRlcmFibGU6IEdlbmVyYXRvcjxUPiA9IGVuY29kaW5nID09IEZCWC5BUlJBWV9FTkNPRElORy5DT01QUkVTU0VEID9cclxuICAgICAgKCgpID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheURhdGE6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShfZGF0YS52aWV3LmJ1ZmZlciwgX2RhdGEub2Zmc2V0LCBieXRlTGVuZ3RoKTtcclxuICAgICAgICBjb25zdCBpbmZsYXRlZERhdGE6IFVpbnQ4QXJyYXkgPSAoUmVmbGVjdC5nZXQoZ2xvYmFsVGhpcywgXCJwYWtvXCIpID8gcGFrby5pbmZsYXRlIDogZmZsYXRlLmluZmxhdGVTeW5jKShhcnJheURhdGEpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyUmVhZGVyKGluZmxhdGVkRGF0YS5idWZmZXIpLmdldFNlcXVlbmNlKF9nZXR0ZXIsIGxlbmd0aCk7XHJcbiAgICAgIH0pKCkgOlxyXG4gICAgICBfZGF0YS5nZXRTZXF1ZW5jZShfZ2V0dGVyLCBsZW5ndGgpO1xyXG5cclxuICAgIF9kYXRhLm9mZnNldCA9IGVuZE9mZnNldDtcclxuXHJcbiAgICByZXR1cm4gaXRlcmFibGU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWFkUmF3PFQgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KF9kYXRhOiBCdWZmZXJSZWFkZXIsIF9nZXR0ZXI6ICgpID0+IFQpOiBHZW5lcmF0b3I8VD4ge1xyXG4gICAgLy8gcmF3IGJpbmFyeSBkYXRhIG5lZWRzIHRvIGJlIGludGVycHJldGVkIGluIGEgc3BlY2lhbCB3YXkgc2VlOlxyXG4gICAgLy8gaHR0cHM6Ly9jb2RlLmJsZW5kZXIub3JnLzIwMTMvMDgvZmJ4LWJpbmFyeS1maWxlLWZvcm1hdC1zcGVjaWZpY2F0aW9uL1xyXG4gICAgY29uc3QgbGVuZ3RoOiBudW1iZXIgPSBfZGF0YS5nZXRVaW50MzIoKTtcclxuICAgIHJldHVybiBfZGF0YS5nZXRTZXF1ZW5jZShfZ2V0dGVyLCBsZW5ndGgpOztcclxuICB9XHJcblxyXG4gIGNvbnN0IGJpbmFyeVN0YXJ0Q2hhcnM6IFVpbnQ4QXJyYXlcclxuICAgID0gVWludDhBcnJheS5mcm9tKFwiS2F5ZGFyYSBGQlggQmluYXJ5XFx4MjBcXHgyMFxceDAwXFx4MWFcXHgwMFwiLnNwbGl0KFwiXCIpLCBfdiA9PiBfdi5jaGFyQ29kZUF0KDApKTtcclxuXHJcbiAgY29uc3QgbnVsbENvdW50QXROb2RlRW5kOiBudW1iZXIgPSAxMztcclxuXHJcbn0iLCJuYW1lc3BhY2UgR0xURiB7XHJcbiAgZXhwb3J0IHR5cGUgR2xUZklkID0gbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIEFuIG9iamVjdCBwb2ludGluZyB0byBhIGJ1ZmZlciB2aWV3IGNvbnRhaW5pbmcgdGhlIGluZGljZXMgb2YgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy4gVGhlIG51bWJlciBvZiBpbmRpY2VzIGlzIGVxdWFsIHRvIGBhY2Nlc3Nvci5zcGFyc2UuY291bnRgLiBJbmRpY2VzICoqTVVTVCoqIHN0cmljdGx5IGluY3JlYXNlLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzb3JTcGFyc2VJbmRpY2VzIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBidWZmZXIgdmlldyB3aXRoIHNwYXJzZSBpbmRpY2VzLiBUaGUgcmVmZXJlbmNlZCBidWZmZXIgdmlldyAqKk1VU1QgTk9UKiogaGF2ZSBpdHMgYHRhcmdldGAgb3IgYGJ5dGVTdHJpZGVgIHByb3BlcnRpZXMgZGVmaW5lZC4gVGhlIGJ1ZmZlciB2aWV3IGFuZCB0aGUgb3B0aW9uYWwgYGJ5dGVPZmZzZXRgICoqTVVTVCoqIGJlIGFsaWduZWQgdG8gdGhlIGBjb21wb25lbnRUeXBlYCBieXRlIGxlbmd0aC5cclxuICAgICAqL1xyXG4gICAgXCJidWZmZXJWaWV3XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciB2aWV3IGluIGJ5dGVzLlxyXG4gICAgICovXHJcbiAgICBcImJ5dGVPZmZzZXRcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGljZXMgZGF0YSB0eXBlLlxyXG4gICAgICovXHJcbiAgICBcImNvbXBvbmVudFR5cGVcIjogQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURSB8IENPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUIHwgQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfSU5UO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpcyBlcXVhbCB0byBgYWNjZXNzb3Iuc3BhcnNlLmNvdW50YCB0aW1lcyBudW1iZXIgb2YgY29tcG9uZW50cy4gVGhlIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIGJhc2UgYWNjZXNzb3IuIFRoZSBlbGVtZW50cyBhcmUgdGlnaHRseSBwYWNrZWQuIERhdGEgKipNVVNUKiogYmUgYWxpZ25lZCBmb2xsb3dpbmcgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIGJhc2UgYWNjZXNzb3IuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NvclNwYXJzZVZhbHVlcyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgYnVmZmVyVmlldyB3aXRoIHNwYXJzZSB2YWx1ZXMuIFRoZSByZWZlcmVuY2VkIGJ1ZmZlciB2aWV3ICoqTVVTVCBOT1QqKiBoYXZlIGl0cyBgdGFyZ2V0YCBvciBgYnl0ZVN0cmlkZWAgcHJvcGVydGllcyBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdcIjogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyVmlldyBpbiBieXRlcy5cclxuICAgICAqL1xyXG4gICAgXCJieXRlT2Zmc2V0XCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTcGFyc2Ugc3RvcmFnZSBvZiBhY2Nlc3NvciB2YWx1ZXMgdGhhdCBkZXZpYXRlIGZyb20gdGhlaXIgaW5pdGlhbGl6YXRpb24gdmFsdWUuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NvclNwYXJzZSB7XHJcbiAgICAvKipcclxuICAgICAqIE51bWJlciBvZiBkZXZpYXRpbmcgYWNjZXNzb3IgdmFsdWVzIHN0b3JlZCBpbiB0aGUgc3BhcnNlIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBcImNvdW50XCI6IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiBkZXZpYXRpbmcgYWNjZXNzb3IgdmFsdWVzLiBUaGUgbnVtYmVyIG9mIGluZGljZXMgaXMgZXF1YWwgdG8gYGNvdW50YC4gSW5kaWNlcyAqKk1VU1QqKiBzdHJpY3RseSBpbmNyZWFzZS5cclxuICAgICAqL1xyXG4gICAgXCJpbmRpY2VzXCI6IEFjY2Vzc29yU3BhcnNlSW5kaWNlcztcclxuICAgIC8qKlxyXG4gICAgICogQW4gb2JqZWN0IHBvaW50aW5nIHRvIGEgYnVmZmVyIHZpZXcgY29udGFpbmluZyB0aGUgZGV2aWF0aW5nIGFjY2Vzc29yIHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgXCJ2YWx1ZXNcIjogQWNjZXNzb3JTcGFyc2VWYWx1ZXM7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHR5cGVkIHZpZXcgaW50byBhIGJ1ZmZlciB2aWV3IHRoYXQgY29udGFpbnMgcmF3IGJpbmFyeSBkYXRhLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzb3Ige1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlclZpZXcuXHJcbiAgICAgKi9cclxuICAgIFwiYnVmZmVyVmlld1wiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIHZpZXcgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZU9mZnNldFwiPzogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YXR5cGUgb2YgdGhlIGFjY2Vzc29yJ3MgY29tcG9uZW50cy5cclxuICAgICAqL1xyXG4gICAgXCJjb21wb25lbnRUeXBlXCI6IENPTVBPTkVOVF9UWVBFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBpbnRlZ2VyIGRhdGEgdmFsdWVzIGFyZSBub3JtYWxpemVkIGJlZm9yZSB1c2FnZS5cclxuICAgICAqL1xyXG4gICAgXCJub3JtYWxpemVkXCI/OiBib29sZWFuO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhpcyBhY2Nlc3Nvci5cclxuICAgICAqL1xyXG4gICAgXCJjb3VudFwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFNwZWNpZmllcyBpZiB0aGUgYWNjZXNzb3IncyBlbGVtZW50cyBhcmUgc2NhbGFycywgdmVjdG9ycywgb3IgbWF0cmljZXMuXHJcbiAgICAgKi9cclxuICAgIFwidHlwZVwiOiBBQ0NFU1NPUl9UWVBFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNYXhpbXVtIHZhbHVlIG9mIGVhY2ggY29tcG9uZW50IGluIHRoaXMgYWNjZXNzb3IuXHJcbiAgICAgKi9cclxuICAgIFwibWF4XCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogTWluaW11bSB2YWx1ZSBvZiBlYWNoIGNvbXBvbmVudCBpbiB0aGlzIGFjY2Vzc29yLlxyXG4gICAgICovXHJcbiAgICBcIm1pblwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFNwYXJzZSBzdG9yYWdlIG9mIGVsZW1lbnRzIHRoYXQgZGV2aWF0ZSBmcm9tIHRoZWlyIGluaXRpYWxpemF0aW9uIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBcInNwYXJzZVwiPzogQWNjZXNzb3JTcGFyc2U7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjYWNjZXNzb3ItZGF0YS10eXBlc1xyXG4gICAqL1xyXG4gIGV4cG9ydCBlbnVtIENPTVBPTkVOVF9UWVBFIHtcclxuICAgIEJZVEUgPSA1MTIwLFxyXG4gICAgVU5TSUdORURfQllURSA9IDUxMjEsXHJcbiAgICBTSE9SVCA9IDUxMjIsXHJcbiAgICBVTlNJR05FRF9TSE9SVCA9IDUxMjMsXHJcbiAgICBVTlNJR05FRF9JTlQgPSA1MTI1LFxyXG4gICAgRkxPQVQgPSA1MTI2XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBBQ0NFU1NPUl9UWVBFIHtcclxuICAgIFNDQUxBUiA9IFwiU0NBTEFSXCIsXHJcbiAgICBWRUMyID0gXCJWRUMyXCIsXHJcbiAgICBWRUMzID0gXCJWRUMzXCIsXHJcbiAgICBWRUM0ID0gXCJWRUM0XCIsXHJcbiAgICBNQVQyID0gXCJNQVQyXCIsXHJcbiAgICBNQVQzID0gXCJNQVQzXCIsXHJcbiAgICBNQVQ0ID0gXCJNQVQ0XCJcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBhbmltYXRlZCBwcm9wZXJ0eS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvbkNoYW5uZWxUYXJnZXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdG8gYW5pbWF0ZS4gV2hlbiB1bmRlZmluZWQsIHRoZSBhbmltYXRlZCBvYmplY3QgKipNQVkqKiBiZSBkZWZpbmVkIGJ5IGFuIGV4dGVuc2lvbi5cclxuICAgICAqL1xyXG4gICAgXCJub2RlXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBub2RlJ3MgVFJTIHByb3BlcnR5IHRvIGFuaW1hdGUsIG9yIHRoZSBgXCJ3ZWlnaHRzXCJgIG9mIHRoZSBNb3JwaCBUYXJnZXRzIGl0IGluc3RhbnRpYXRlcy4gRm9yIHRoZSBgXCJ0cmFuc2xhdGlvblwiYCBwcm9wZXJ0eSwgdGhlIHZhbHVlcyB0aGF0IGFyZSBwcm92aWRlZCBieSB0aGUgc2FtcGxlciBhcmUgdGhlIHRyYW5zbGF0aW9uIGFsb25nIHRoZSBYLCBZLCBhbmQgWiBheGVzLiBGb3IgdGhlIGBcInJvdGF0aW9uXCJgIHByb3BlcnR5LCB0aGUgdmFsdWVzIGFyZSBhIHF1YXRlcm5pb24gaW4gdGhlIG9yZGVyICh4LCB5LCB6LCB3KSwgd2hlcmUgdyBpcyB0aGUgc2NhbGFyLiBGb3IgdGhlIGBcInNjYWxlXCJgIHByb3BlcnR5LCB0aGUgdmFsdWVzIGFyZSB0aGUgc2NhbGluZyBmYWN0b3JzIGFsb25nIHRoZSBYLCBZLCBhbmQgWiBheGVzLlxyXG4gICAgICovXHJcbiAgICBcInBhdGhcIjogXCJ0cmFuc2xhdGlvblwiIHwgXCJyb3RhdGlvblwiIHwgXCJzY2FsZVwiIHwgXCJ3ZWlnaHRzXCI7IC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNhbmltYXRpb25zXHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBbiBhbmltYXRpb24gY2hhbm5lbCBjb21iaW5lcyBhbiBhbmltYXRpb24gc2FtcGxlciB3aXRoIGEgdGFyZ2V0IHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uQ2hhbm5lbCB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiBhIHNhbXBsZXIgaW4gdGhpcyBhbmltYXRpb24gdXNlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBmb3IgdGhlIHRhcmdldC5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyXCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGFuaW1hdGVkIHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBcInRhcmdldFwiOiBBbmltYXRpb25DaGFubmVsVGFyZ2V0O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gYW5pbWF0aW9uIHNhbXBsZXIgY29tYmluZXMgdGltZXN0YW1wcyB3aXRoIGEgc2VxdWVuY2Ugb2Ygb3V0cHV0IHZhbHVlcyBhbmQgZGVmaW5lcyBhbiBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvblNhbXBsZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgYW4gYWNjZXNzb3IgY29udGFpbmluZyBrZXlmcmFtZSB0aW1lc3RhbXBzLlxyXG4gICAgICovXHJcbiAgICBcImlucHV0XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJwb2xhdGlvbiBhbGdvcml0aG0uXHJcbiAgICAgKi9cclxuICAgIFwiaW50ZXJwb2xhdGlvblwiPzogXCJMSU5FQVJcIiB8IFwiU1RFUFwiIHwgXCJDVUJJQ1NQTElORVwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgYW4gYWNjZXNzb3IsIGNvbnRhaW5pbmcga2V5ZnJhbWUgb3V0cHV0IHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgXCJvdXRwdXRcIjogR2xUZklkO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBrZXlmcmFtZSBhbmltYXRpb24uXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb24ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBhbmltYXRpb24gY2hhbm5lbHMuIEFuIGFuaW1hdGlvbiBjaGFubmVsIGNvbWJpbmVzIGFuIGFuaW1hdGlvbiBzYW1wbGVyIHdpdGggYSB0YXJnZXQgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIERpZmZlcmVudCBjaGFubmVscyBvZiB0aGUgc2FtZSBhbmltYXRpb24gKipNVVNUIE5PVCoqIGhhdmUgdGhlIHNhbWUgdGFyZ2V0cy5cclxuICAgICAqL1xyXG4gICAgXCJjaGFubmVsc1wiOiBBbmltYXRpb25DaGFubmVsW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGFuaW1hdGlvbiBzYW1wbGVycy4gQW4gYW5pbWF0aW9uIHNhbXBsZXIgY29tYmluZXMgdGltZXN0YW1wcyB3aXRoIGEgc2VxdWVuY2Ugb2Ygb3V0cHV0IHZhbHVlcyBhbmQgZGVmaW5lcyBhbiBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyc1wiOiBBbmltYXRpb25TYW1wbGVyW107XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE1ldGFkYXRhIGFib3V0IHRoZSBnbFRGIGFzc2V0LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNzZXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNvcHlyaWdodCBtZXNzYWdlIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIGNyZWRpdCB0aGUgY29udGVudCBjcmVhdG9yLlxyXG4gICAgICovXHJcbiAgICBcImNvcHlyaWdodFwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUb29sIHRoYXQgZ2VuZXJhdGVkIHRoaXMgZ2xURiBtb2RlbC4gIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxyXG4gICAgICovXHJcbiAgICBcImdlbmVyYXRvclwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ2xURiB2ZXJzaW9uIGluIHRoZSBmb3JtIG9mIGA8bWFqb3I+LjxtaW5vcj5gIHRoYXQgdGhpcyBhc3NldCB0YXJnZXRzLlxyXG4gICAgICovXHJcbiAgICBcInZlcnNpb25cIjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWluaW11bSBnbFRGIHZlcnNpb24gaW4gdGhlIGZvcm0gb2YgYDxtYWpvcj4uPG1pbm9yPmAgdGhhdCB0aGlzIGFzc2V0IHRhcmdldHMuIFRoaXMgcHJvcGVydHkgKipNVVNUIE5PVCoqIGJlIGdyZWF0ZXIgdGhhbiB0aGUgYXNzZXQgdmVyc2lvbi5cclxuICAgICAqL1xyXG4gICAgXCJtaW5WZXJzaW9uXCI/OiBzdHJpbmc7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIGJ1ZmZlciBwb2ludHMgdG8gYmluYXJ5IGdlb21ldHJ5LCBhbmltYXRpb24sIG9yIHNraW5zLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIFVSSSAob3IgSVJJKSBvZiB0aGUgYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBcInVyaVwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZUxlbmd0aFwiOiBudW1iZXI7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgdmlldyBpbnRvIGEgYnVmZmVyIGdlbmVyYWxseSByZXByZXNlbnRpbmcgYSBzdWJzZXQgb2YgdGhlIGJ1ZmZlci5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIEJ1ZmZlclZpZXcge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgXCJidWZmZXJcIjogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBpbiBieXRlcy5cclxuICAgICAqL1xyXG4gICAgXCJieXRlT2Zmc2V0XCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlclZpZXcgaW4gYnl0ZXMuXHJcbiAgICAgKi9cclxuICAgIFwiYnl0ZUxlbmd0aFwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzdHJpZGUsIGluIGJ5dGVzLlxyXG4gICAgICovXHJcbiAgICBcImJ5dGVTdHJpZGVcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhpbnQgcmVwcmVzZW50aW5nIHRoZSBpbnRlbmRlZCBHUFUgYnVmZmVyIHR5cGUgdG8gdXNlIHdpdGggdGhpcyBidWZmZXIgdmlldy5cclxuICAgICAqL1xyXG4gICAgXCJ0YXJnZXRcIj86IG51bWJlciB8IG51bWJlciB8IG51bWJlcjtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW4gb3J0aG9ncmFwaGljIGNhbWVyYSBjb250YWluaW5nIHByb3BlcnRpZXMgdG8gY3JlYXRlIGFuIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeC5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIENhbWVyYU9ydGhvZ3JhcGhpYyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCBob3Jpem9udGFsIG1hZ25pZmljYXRpb24gb2YgdGhlIHZpZXcuIFRoaXMgdmFsdWUgKipNVVNUIE5PVCoqIGJlIGVxdWFsIHRvIHplcm8uIFRoaXMgdmFsdWUgKipTSE9VTEQgTk9UKiogYmUgbmVnYXRpdmUuXHJcbiAgICAgKi9cclxuICAgIFwieG1hZ1wiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCB2ZXJ0aWNhbCBtYWduaWZpY2F0aW9uIG9mIHRoZSB2aWV3LiBUaGlzIHZhbHVlICoqTVVTVCBOT1QqKiBiZSBlcXVhbCB0byB6ZXJvLiBUaGlzIHZhbHVlICoqU0hPVUxEIE5PVCoqIGJlIG5lZ2F0aXZlLlxyXG4gICAgICovXHJcbiAgICBcInltYWdcIjogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgZGlzdGFuY2UgdG8gdGhlIGZhciBjbGlwcGluZyBwbGFuZS4gVGhpcyB2YWx1ZSAqKk1VU1QgTk9UKiogYmUgZXF1YWwgdG8gemVyby4gYHpmYXJgICoqTVVTVCoqIGJlIGdyZWF0ZXIgdGhhbiBgem5lYXJgLlxyXG4gICAgICovXHJcbiAgICBcInpmYXJcIjogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgZGlzdGFuY2UgdG8gdGhlIG5lYXIgY2xpcHBpbmcgcGxhbmUuXHJcbiAgICAgKi9cclxuICAgIFwiem5lYXJcIjogbnVtYmVyO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBwZXJzcGVjdGl2ZSBjYW1lcmEgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2FtZXJhUGVyc3BlY3RpdmUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmxvYXRpbmctcG9pbnQgYXNwZWN0IHJhdGlvIG9mIHRoZSBmaWVsZCBvZiB2aWV3LlxyXG4gICAgICovXHJcbiAgICBcImFzcGVjdFJhdGlvXCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCB2ZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnMuIFRoaXMgdmFsdWUgKipTSE9VTEQqKiBiZSBsZXNzIHRoYW4gz4AuXHJcbiAgICAgKi9cclxuICAgIFwieWZvdlwiOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmbG9hdGluZy1wb2ludCBkaXN0YW5jZSB0byB0aGUgZmFyIGNsaXBwaW5nIHBsYW5lLlxyXG4gICAgICovXHJcbiAgICBcInpmYXJcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZsb2F0aW5nLXBvaW50IGRpc3RhbmNlIHRvIHRoZSBuZWFyIGNsaXBwaW5nIHBsYW5lLlxyXG4gICAgICovXHJcbiAgICBcInpuZWFyXCI6IG51bWJlcjtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgY2FtZXJhJ3MgcHJvamVjdGlvbi4gIEEgbm9kZSAqKk1BWSoqIHJlZmVyZW5jZSBhIGNhbWVyYSB0byBhcHBseSBhIHRyYW5zZm9ybSB0byBwbGFjZSB0aGUgY2FtZXJhIGluIHRoZSBzY2VuZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIENhbWVyYSB7XHJcbiAgICAvKipcclxuICAgICAqIEFuIG9ydGhvZ3JhcGhpYyBjYW1lcmEgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhbiBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXguIFRoaXMgcHJvcGVydHkgKipNVVNUIE5PVCoqIGJlIGRlZmluZWQgd2hlbiBgcGVyc3BlY3RpdmVgIGlzIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwib3J0aG9ncmFwaGljXCI/OiBDYW1lcmFPcnRob2dyYXBoaWM7XHJcbiAgICAvKipcclxuICAgICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBjcmVhdGUgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeC4gVGhpcyBwcm9wZXJ0eSAqKk1VU1QgTk9UKiogYmUgZGVmaW5lZCB3aGVuIGBvcnRob2dyYXBoaWNgIGlzIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwicGVyc3BlY3RpdmVcIj86IENhbWVyYVBlcnNwZWN0aXZlO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIGNhbWVyYSB1c2VzIGEgcGVyc3BlY3RpdmUgb3Igb3J0aG9ncmFwaGljIHByb2plY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIFwidHlwZVwiOiBhbnkgfCBhbnkgfCBzdHJpbmc7XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEltYWdlIGRhdGEgdXNlZCB0byBjcmVhdGUgYSB0ZXh0dXJlLiBJbWFnZSAqKk1BWSoqIGJlIHJlZmVyZW5jZWQgYnkgYW4gVVJJIChvciBJUkkpIG9yIGEgYnVmZmVyIHZpZXcgaW5kZXguXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBJbWFnZSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBVUkkgKG9yIElSSSkgb2YgdGhlIGltYWdlLlxyXG4gICAgICovXHJcbiAgICBcInVyaVwiPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW1hZ2UncyBtZWRpYSB0eXBlLiBUaGlzIGZpZWxkICoqTVVTVCoqIGJlIGRlZmluZWQgd2hlbiBgYnVmZmVyVmlld2AgaXMgZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgXCJtaW1lVHlwZVwiPzogYW55IHwgYW55IHwgc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGJ1ZmZlclZpZXcgdGhhdCBjb250YWlucyB0aGUgaW1hZ2UuIFRoaXMgZmllbGQgKipNVVNUIE5PVCoqIGJlIGRlZmluZWQgd2hlbiBgdXJpYCBpcyBkZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdcIj86IEdsVGZJZDtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVmZXJlbmNlIHRvIGEgdGV4dHVyZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFRleHR1cmVJbmZvIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcImluZGV4XCI6IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNldCBpbmRleCBvZiB0ZXh0dXJlJ3MgVEVYQ09PUkQgYXR0cmlidXRlIHVzZWQgZm9yIHRleHR1cmUgY29vcmRpbmF0ZSBtYXBwaW5nLlxyXG4gICAgICovXHJcbiAgICBcInRleENvb3JkXCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHNldCBvZiBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBtZXRhbGxpYy1yb3VnaG5lc3MgbWF0ZXJpYWwgbW9kZWwgZnJvbSBQaHlzaWNhbGx5LUJhc2VkIFJlbmRlcmluZyAoUEJSKSBtZXRob2RvbG9neS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsUGJyTWV0YWxsaWNSb3VnaG5lc3Mge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmFjdG9ycyBmb3IgdGhlIGJhc2UgY29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcImJhc2VDb2xvckZhY3RvclwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBiYXNlIGNvbG9yIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwiYmFzZUNvbG9yVGV4dHVyZVwiPzogVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3IgZm9yIHRoZSBtZXRhbG5lc3Mgb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcIm1ldGFsbGljRmFjdG9yXCI/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3IgZm9yIHRoZSByb3VnaG5lc3Mgb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcInJvdWdobmVzc0ZhY3RvclwiPzogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWV0YWxsaWMtcm91Z2huZXNzIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwibWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlXCI/OiBUZXh0dXJlSW5mbztcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWF0ZXJpYWxOb3JtYWxUZXh0dXJlSW5mbyB7XHJcbiAgICBcImluZGV4XCI/OiBhbnk7XHJcbiAgICBcInRleENvb3JkXCI/OiBhbnk7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzY2FsYXIgcGFyYW1ldGVyIGFwcGxpZWQgdG8gZWFjaCBub3JtYWwgdmVjdG9yIG9mIHRoZSBub3JtYWwgdGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgXCJzY2FsZVwiPzogbnVtYmVyO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbE9jY2x1c2lvblRleHR1cmVJbmZvIHtcclxuICAgIFwiaW5kZXhcIj86IGFueTtcclxuICAgIFwidGV4Q29vcmRcIj86IGFueTtcclxuICAgIC8qKlxyXG4gICAgICogQSBzY2FsYXIgbXVsdGlwbGllciBjb250cm9sbGluZyB0aGUgYW1vdW50IG9mIG9jY2x1c2lvbiBhcHBsaWVkLlxyXG4gICAgICovXHJcbiAgICBcInN0cmVuZ3RoXCI/OiBudW1iZXI7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUaGUgbWF0ZXJpYWwgYXBwZWFyYW5jZSBvZiBhIHByaW1pdGl2ZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsIHtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNldCBvZiBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBtZXRhbGxpYy1yb3VnaG5lc3MgbWF0ZXJpYWwgbW9kZWwgZnJvbSBQaHlzaWNhbGx5IEJhc2VkIFJlbmRlcmluZyAoUEJSKSBtZXRob2RvbG9neS4gV2hlbiB1bmRlZmluZWQsIGFsbCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgYHBick1ldGFsbGljUm91Z2huZXNzYCAqKk1VU1QqKiBhcHBseS5cclxuICAgICAqL1xyXG4gICAgXCJwYnJNZXRhbGxpY1JvdWdobmVzc1wiPzogTWF0ZXJpYWxQYnJNZXRhbGxpY1JvdWdobmVzcztcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRhbmdlbnQgc3BhY2Ugbm9ybWFsIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIFwibm9ybWFsVGV4dHVyZVwiPzogTWF0ZXJpYWxOb3JtYWxUZXh0dXJlSW5mbztcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9jY2x1c2lvbiB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcIm9jY2x1c2lvblRleHR1cmVcIj86IE1hdGVyaWFsT2NjbHVzaW9uVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBlbWlzc2l2ZSB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBcImVtaXNzaXZlVGV4dHVyZVwiPzogVGV4dHVyZUluZm87XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmYWN0b3JzIGZvciB0aGUgZW1pc3NpdmUgY29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG4gICAgICovXHJcbiAgICBcImVtaXNzaXZlRmFjdG9yXCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIHJlbmRlcmluZyBtb2RlIG9mIHRoZSBtYXRlcmlhbC5cclxuICAgICAqL1xyXG4gICAgXCJhbHBoYU1vZGVcIj86IFwiT1BBUVVFXCIgfCBcIk1BU0tcIiB8IFwiQkxFTkRcIjtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIGN1dG9mZiB2YWx1ZSBvZiB0aGUgbWF0ZXJpYWwuXHJcbiAgICAgKi9cclxuICAgIFwiYWxwaGFDdXRvZmZcIj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGRvdWJsZSBzaWRlZC5cclxuICAgICAqL1xyXG4gICAgXCJkb3VibGVTaWRlZFwiPzogYm9vbGVhbjtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdlb21ldHJ5IHRvIGJlIHJlbmRlcmVkIHdpdGggdGhlIGdpdmVuIG1hdGVyaWFsLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzaFByaW1pdGl2ZSB7XHJcbiAgICAvKipcclxuICAgICAqIEEgcGxhaW4gSlNPTiBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgbWVzaCBhdHRyaWJ1dGUgc2VtYW50aWMgYW5kIGVhY2ggdmFsdWUgaXMgdGhlIGluZGV4IG9mIHRoZSBhY2Nlc3NvciBjb250YWluaW5nIGF0dHJpYnV0ZSdzIGRhdGEuXHJcbiAgICAgKi9cclxuICAgIFwiYXR0cmlidXRlc1wiOiB7XHJcbiAgICAgIFtrOiBzdHJpbmddOiBHbFRmSWQ7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGFjY2Vzc29yIHRoYXQgY29udGFpbnMgdGhlIHZlcnRleCBpbmRpY2VzLlxyXG4gICAgICovXHJcbiAgICBcImluZGljZXNcIj86IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBtYXRlcmlhbCB0byBhcHBseSB0byB0aGlzIHByaW1pdGl2ZSB3aGVuIHJlbmRlcmluZy5cclxuICAgICAqL1xyXG4gICAgXCJtYXRlcmlhbFwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdG9wb2xvZ3kgdHlwZSBvZiBwcmltaXRpdmVzIHRvIHJlbmRlci5cclxuICAgICAqL1xyXG4gICAgXCJtb2RlXCI/OiBNRVNIX1BSSU1JVElWRV9NT0RFO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBtb3JwaCB0YXJnZXRzLlxyXG4gICAgICovXHJcbiAgICBcInRhcmdldHNcIj86IHtcclxuICAgICAgW2s6IHN0cmluZ106IEdsVGZJZDtcclxuICAgIH1bXTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBNRVNIX1BSSU1JVElWRV9NT0RFIHtcclxuICAgIFBPSU5UUyxcclxuICAgIExJTkVTLFxyXG4gICAgTElORV9MT09QLFxyXG4gICAgTElORV9TVFJJUCxcclxuICAgIFRSSUFOR0xFUyxcclxuICAgIFRSSUFOR0xFX1NUUklQLFxyXG4gICAgVFJJQU5HTEVfRkFOXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHNldCBvZiBwcmltaXRpdmVzIHRvIGJlIHJlbmRlcmVkLiAgSXRzIGdsb2JhbCB0cmFuc2Zvcm0gaXMgZGVmaW5lZCBieSBhIG5vZGUgdGhhdCByZWZlcmVuY2VzIGl0LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzaCB7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHByaW1pdGl2ZXMsIGVhY2ggZGVmaW5pbmcgZ2VvbWV0cnkgdG8gYmUgcmVuZGVyZWQuXHJcbiAgICAgKi9cclxuICAgIFwicHJpbWl0aXZlc1wiOiBNZXNoUHJpbWl0aXZlW107XHJcbiAgICAvKipcclxuICAgICAqIEFycmF5IG9mIHdlaWdodHMgdG8gYmUgYXBwbGllZCB0byB0aGUgbW9ycGggdGFyZ2V0cy4gVGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqKk1VU1QqKiBtYXRjaCB0aGUgbnVtYmVyIG9mIG1vcnBoIHRhcmdldHMuXHJcbiAgICAgKi9cclxuICAgIFwid2VpZ2h0c1wiPzogbnVtYmVyW107XHJcbiAgICBcIm5hbWVcIj86IGFueTtcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgbm9kZSBpbiB0aGUgbm9kZSBoaWVyYXJjaHkuICBXaGVuIHRoZSBub2RlIGNvbnRhaW5zIGBza2luYCwgYWxsIGBtZXNoLnByaW1pdGl2ZXNgICoqTVVTVCoqIGNvbnRhaW4gYEpPSU5UU18wYCBhbmQgYFdFSUdIVFNfMGAgYXR0cmlidXRlcy4gIEEgbm9kZSAqKk1BWSoqIGhhdmUgZWl0aGVyIGEgYG1hdHJpeGAgb3IgYW55IGNvbWJpbmF0aW9uIG9mIGB0cmFuc2xhdGlvbmAvYHJvdGF0aW9uYC9gc2NhbGVgIChUUlMpIHByb3BlcnRpZXMuIFRSUyBwcm9wZXJ0aWVzIGFyZSBjb252ZXJ0ZWQgdG8gbWF0cmljZXMgYW5kIHBvc3RtdWx0aXBsaWVkIGluIHRoZSBgVCAqIFIgKiBTYCBvcmRlciB0byBjb21wb3NlIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXg7IGZpcnN0IHRoZSBzY2FsZSBpcyBhcHBsaWVkIHRvIHRoZSB2ZXJ0aWNlcywgdGhlbiB0aGUgcm90YXRpb24sIGFuZCB0aGVuIHRoZSB0cmFuc2xhdGlvbi4gSWYgbm9uZSBhcmUgcHJvdmlkZWQsIHRoZSB0cmFuc2Zvcm0gaXMgdGhlIGlkZW50aXR5LiBXaGVuIGEgbm9kZSBpcyB0YXJnZXRlZCBmb3IgYW5pbWF0aW9uIChyZWZlcmVuY2VkIGJ5IGFuIGFuaW1hdGlvbi5jaGFubmVsLnRhcmdldCksIGBtYXRyaXhgICoqTVVTVCBOT1QqKiBiZSBwcmVzZW50LlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgTm9kZSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2FtZXJhIHJlZmVyZW5jZWQgYnkgdGhpcyBub2RlLlxyXG4gICAgICovXHJcbiAgICBcImNhbWVyYVwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kaWNlcyBvZiB0aGlzIG5vZGUncyBjaGlsZHJlbi5cclxuICAgICAqL1xyXG4gICAgXCJjaGlsZHJlblwiPzogR2xUZklkW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgc2tpbiByZWZlcmVuY2VkIGJ5IHRoaXMgbm9kZS5cclxuICAgICAqL1xyXG4gICAgXCJza2luXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIEEgZmxvYXRpbmctcG9pbnQgNHg0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBzdG9yZWQgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1hdHJpeFwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgbWVzaCBpbiB0aGlzIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIFwibWVzaFwiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9kZSdzIHVuaXQgcXVhdGVybmlvbiByb3RhdGlvbiBpbiB0aGUgb3JkZXIgKHgsIHksIHosIHcpLCB3aGVyZSB3IGlzIHRoZSBzY2FsYXIuXHJcbiAgICAgKi9cclxuICAgIFwicm90YXRpb25cIj86IG51bWJlcltdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9kZSdzIG5vbi11bmlmb3JtIHNjYWxlLCBnaXZlbiBhcyB0aGUgc2NhbGluZyBmYWN0b3JzIGFsb25nIHRoZSB4LCB5LCBhbmQgeiBheGVzLlxyXG4gICAgICovXHJcbiAgICBcInNjYWxlXCI/OiBudW1iZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5vZGUncyB0cmFuc2xhdGlvbiBhbG9uZyB0aGUgeCwgeSwgYW5kIHogYXhlcy5cclxuICAgICAqL1xyXG4gICAgXCJ0cmFuc2xhdGlvblwiPzogbnVtYmVyW107XHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3ZWlnaHRzIG9mIHRoZSBpbnN0YW50aWF0ZWQgbW9ycGggdGFyZ2V0LiBUaGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICoqTVVTVCoqIG1hdGNoIHRoZSBudW1iZXIgb2YgbW9ycGggdGFyZ2V0cyBvZiB0aGUgcmVmZXJlbmNlZCBtZXNoLiBXaGVuIGRlZmluZWQsIGBtZXNoYCAqKk1VU1QqKiBhbHNvIGJlIGRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIFwid2VpZ2h0c1wiPzogbnVtYmVyW107XHJcbiAgICBcIm5hbWVcIj86IHN0cmluZztcclxuICAgIFwiZXh0ZW5zaW9uc1wiPzogYW55O1xyXG4gICAgXCJleHRyYXNcIj86IGFueTtcclxuICAgIFtrOiBzdHJpbmddOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gcHJvcGVydHkgc2V0IGJ5IEZVREdFIGxvYWRlci4gTm90IHBhcnQgb2YgZ2xURiBzdGFuZGFyZCAyLjAuXHJcbiAgICAgKi9cclxuICAgIGlzQW5pbWF0ZWQ/OiBib29sZWFuO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gcHJvcGVydHkgc2V0IGJ5IEZVREdFIGxvYWRlci4gTm90IHBhcnQgb2YgZ2xURiBzdGFuZGFyZCAyLjAuXHJcbiAgICAgKi9cclxuICAgIHBhcmVudD86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogUGF0aCBmcm9tIHRoZSByb290IG5vZGUgdG8gdGhpcyBub2RlLlxyXG4gICAgICogQ3VzdG9tIHByb3BlcnR5IHNldCBieSBGVURHRSBsb2FkZXIuIE5vdCBwYXJ0IG9mIGdsVEYgc3RhbmRhcmQgMi4wLlxyXG4gICAgICovXHJcbiAgICBwYXRoPzogbnVtYmVyW107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgc2FtcGxlciBwcm9wZXJ0aWVzIGZvciBmaWx0ZXJpbmcgYW5kIHdyYXBwaW5nIG1vZGVzLlxyXG4gICAqL1xyXG4gIGV4cG9ydCBpbnRlcmZhY2UgU2FtcGxlciB7XHJcbiAgICAvKipcclxuICAgICAqIE1hZ25pZmljYXRpb24gZmlsdGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1hZ0ZpbHRlclwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSXCJdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNaW5pZmljYXRpb24gZmlsdGVyLlxyXG4gICAgICovXHJcbiAgICBcIm1pbkZpbHRlclwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RfTUlQTUFQX05FQVJFU1RcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTElORUFSX01JUE1BUF9ORUFSRVNUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIk5FQVJFU1RfTUlQTUFQX0xJTkVBUlwiXSB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHRbXCJMSU5FQVJfTUlQTUFQX0xJTkVBUlwiXTtcclxuICAgIC8qKlxyXG4gICAgICogUyAoVSkgd3JhcHBpbmcgbW9kZS5cclxuICAgICAqL1xyXG4gICAgXCJ3cmFwU1wiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIkNMQU1QX1RPX0VER0VcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTUlSUk9SRURfUkVQRUFUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIlJFUEVBVFwiXTtcclxuICAgIC8qKlxyXG4gICAgICogVCAoVikgd3JhcHBpbmcgbW9kZS5cclxuICAgICAqL1xyXG4gICAgXCJ3cmFwVFwiPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIkNMQU1QX1RPX0VER0VcIl0gfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0W1wiTUlSUk9SRURfUkVQRUFUXCJdIHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dFtcIlJFUEVBVFwiXTtcclxuICAgIFwibmFtZVwiPzogc3RyaW5nO1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIHJvb3Qgbm9kZXMgb2YgYSBzY2VuZS5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNjZW5lIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGljZXMgb2YgZWFjaCByb290IG5vZGUuXHJcbiAgICAgKi9cclxuICAgIFwibm9kZXNcIj86IEdsVGZJZFtdO1xyXG4gICAgXCJuYW1lXCI/OiBhbnk7XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBKb2ludHMgYW5kIG1hdHJpY2VzIGRlZmluaW5nIGEgc2tpbi5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNraW4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGFjY2Vzc29yIGNvbnRhaW5pbmcgdGhlIGZsb2F0aW5nLXBvaW50IDR4NCBpbnZlcnNlLWJpbmQgbWF0cmljZXMuXHJcbiAgICAgKi9cclxuICAgIFwiaW52ZXJzZUJpbmRNYXRyaWNlc1wiPzogR2xUZklkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdXNlZCBhcyBhIHNrZWxldG9uIHJvb3QuXHJcbiAgICAgKi9cclxuICAgIFwic2tlbGV0b25cIj86IEdsVGZJZDtcclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNlcyBvZiBza2VsZXRvbiBub2RlcywgdXNlZCBhcyBqb2ludHMgaW4gdGhpcyBza2luLlxyXG4gICAgICovXHJcbiAgICBcImpvaW50c1wiOiBHbFRmSWRbXTtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSB0ZXh0dXJlIGFuZCBpdHMgc2FtcGxlci5cclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFRleHR1cmUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHNhbXBsZXIgdXNlZCBieSB0aGlzIHRleHR1cmUuIFdoZW4gdW5kZWZpbmVkLCBhIHNhbXBsZXIgd2l0aCByZXBlYXQgd3JhcHBpbmcgYW5kIGF1dG8gZmlsdGVyaW5nICoqU0hPVUxEKiogYmUgdXNlZC5cclxuICAgICAqL1xyXG4gICAgXCJzYW1wbGVyXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgdXNlZCBieSB0aGlzIHRleHR1cmUuIFdoZW4gdW5kZWZpbmVkLCBhbiBleHRlbnNpb24gb3Igb3RoZXIgbWVjaGFuaXNtICoqU0hPVUxEKiogc3VwcGx5IGFuIGFsdGVybmF0ZSB0ZXh0dXJlIHNvdXJjZSwgb3RoZXJ3aXNlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgXCJzb3VyY2VcIj86IEdsVGZJZDtcclxuICAgIFwibmFtZVwiPzogYW55O1xyXG4gICAgXCJleHRlbnNpb25zXCI/OiBhbnk7XHJcbiAgICBcImV4dHJhc1wiPzogYW55O1xyXG4gICAgW2s6IHN0cmluZ106IGFueTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIHJvb3Qgb2JqZWN0IGZvciBhIGdsVEYgYXNzZXQuXHJcbiAgICovXHJcbiAgZXhwb3J0IGludGVyZmFjZSBHbFRmIHtcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgZ2xURiBleHRlbnNpb25zIHVzZWQgaW4gdGhpcyBhc3NldC5cclxuICAgICAqL1xyXG4gICAgXCJleHRlbnNpb25zVXNlZFwiPzogc3RyaW5nW107XHJcbiAgICAvKipcclxuICAgICAqIE5hbWVzIG9mIGdsVEYgZXh0ZW5zaW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBsb2FkIHRoaXMgYXNzZXQuXHJcbiAgICAgKi9cclxuICAgIFwiZXh0ZW5zaW9uc1JlcXVpcmVkXCI/OiBzdHJpbmdbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzb3JzLlxyXG4gICAgICovXHJcbiAgICBcImFjY2Vzc29yc1wiPzogQWNjZXNzb3JbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Yga2V5ZnJhbWUgYW5pbWF0aW9ucy5cclxuICAgICAqL1xyXG4gICAgXCJhbmltYXRpb25zXCI/OiBBbmltYXRpb25bXTtcclxuICAgIC8qKlxyXG4gICAgICogTWV0YWRhdGEgYWJvdXQgdGhlIGdsVEYgYXNzZXQuXHJcbiAgICAgKi9cclxuICAgIFwiYXNzZXRcIjogQXNzZXQ7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGJ1ZmZlcnMuXHJcbiAgICAgKi9cclxuICAgIFwiYnVmZmVyc1wiPzogQnVmZmVyW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGJ1ZmZlclZpZXdzLlxyXG4gICAgICovXHJcbiAgICBcImJ1ZmZlclZpZXdzXCI/OiBCdWZmZXJWaWV3W107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGNhbWVyYXMuXHJcbiAgICAgKi9cclxuICAgIFwiY2FtZXJhc1wiPzogQ2FtZXJhW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGltYWdlcy5cclxuICAgICAqL1xyXG4gICAgXCJpbWFnZXNcIj86IEltYWdlW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIG1hdGVyaWFscy5cclxuICAgICAqL1xyXG4gICAgXCJtYXRlcmlhbHNcIj86IE1hdGVyaWFsW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIG1lc2hlcy5cclxuICAgICAqL1xyXG4gICAgXCJtZXNoZXNcIj86IE1lc2hbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Ygbm9kZXMuXHJcbiAgICAgKi9cclxuICAgIFwibm9kZXNcIj86IE5vZGVbXTtcclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2Ygc2FtcGxlcnMuXHJcbiAgICAgKi9cclxuICAgIFwic2FtcGxlcnNcIj86IFNhbXBsZXJbXTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBkZWZhdWx0IHNjZW5lLlxyXG4gICAgICovXHJcbiAgICBcInNjZW5lXCI/OiBHbFRmSWQ7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHNjZW5lcy5cclxuICAgICAqL1xyXG4gICAgXCJzY2VuZXNcIj86IFNjZW5lW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHNraW5zLlxyXG4gICAgICovXHJcbiAgICBcInNraW5zXCI/OiBTa2luW107XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIHRleHR1cmVzLlxyXG4gICAgICovXHJcbiAgICBcInRleHR1cmVzXCI/OiBUZXh0dXJlW107XHJcbiAgICBcImV4dGVuc2lvbnNcIj86IGFueTtcclxuICAgIFwiZXh0cmFzXCI/OiBhbnk7XHJcbiAgICBbazogc3RyaW5nXTogYW55O1xyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBBc3NldCBsb2FkZXIgZm9yIGdsIFRyYW5zZmVyIEZvcm1hdCBmaWxlcy5cclxuICAgKiBAYXV0aG9ycyBNYXR0aGlhcyBSb21pbmcsIEhGVSwgMjAyMiB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBHTFRGTG9hZGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGxvYWRlcnM6IHsgW3VybDogc3RyaW5nXTogR0xURkxvYWRlciB9O1xyXG5cclxuICAgIHN0YXRpYyAjZGVmYXVsdE1hdGVyaWFsOiBNYXRlcmlhbDtcclxuICAgIHN0YXRpYyAjZGVmYXVsdFNraW5NYXRlcmlhbDogTWF0ZXJpYWw7XHJcblxyXG4gICAgcmVhZG9ubHkgI3VybDogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgI2dsdGY6IEdMVEYuR2xUZjtcclxuXHJcbiAgICAjcmVzb3VyY2VzOiBSZXNvdXJjZXMgPSB7fTtcclxuXHJcbiAgICAjbm9kZXM6IE5vZGVbXSA9IFtdO1xyXG4gICAgI2NhbWVyYXM6IENvbXBvbmVudENhbWVyYVtdO1xyXG4gICAgI3NrZWxldG9uczogQ29tcG9uZW50U2tlbGV0b25bXTtcclxuXHJcbiAgICAjYnVmZmVyczogQXJyYXlCdWZmZXJbXTtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKF9nbHRmOiBHTFRGLkdsVGYsIF91cmw6IHN0cmluZywgX2J1ZmZlckNodW5rPzogQXJyYXlCdWZmZXIpIHtcclxuICAgICAgdGhpcy4jZ2x0ZiA9IF9nbHRmO1xyXG4gICAgICB0aGlzLiN1cmwgPSBfdXJsO1xyXG4gICAgICBpZiAoX2J1ZmZlckNodW5rKVxyXG4gICAgICAgIHRoaXMuI2J1ZmZlcnMgPSBbX2J1ZmZlckNodW5rXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdE1hdGVyaWFsKCk6IE1hdGVyaWFsIHtcclxuICAgICAgaWYgKCF0aGlzLiNkZWZhdWx0TWF0ZXJpYWwpIHtcclxuICAgICAgICB0aGlzLiNkZWZhdWx0TWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWwoXCJHTFRGRGVmYXVsdE1hdGVyaWFsXCIsIFNoYWRlclBob25nLCBuZXcgQ29hdFJlbWlzc2l2ZShDb2xvci5DU1MoXCJ3aGl0ZVwiKSwgMSwgMC41KSk7XHJcbiAgICAgICAgUHJvamVjdC5kZXJlZ2lzdGVyKHRoaXMuI2RlZmF1bHRNYXRlcmlhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRNYXRlcmlhbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgZGVmYXVsdFNraW5NYXRlcmlhbCgpOiBNYXRlcmlhbCB7XHJcbiAgICAgIGlmICghdGhpcy4jZGVmYXVsdFNraW5NYXRlcmlhbCkge1xyXG4gICAgICAgIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWwoXCJHTFRGRGVmYXVsdFNraW5NYXRlcmlhbFwiLCBTaGFkZXJQaG9uZ1NraW4sIG5ldyBDb2F0UmVtaXNzaXZlKENvbG9yLkNTUyhcIndoaXRlXCIpLCAxLCAwLjUpKTtcclxuICAgICAgICBQcm9qZWN0LmRlcmVnaXN0ZXIodGhpcy4jZGVmYXVsdFNraW5NYXRlcmlhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHRTa2luTWF0ZXJpYWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIHRoZSBsb2FkaW5nIG9mIGFuIGV4dGVybmFsIHJlc291cmNlIGZyb20gYSBnbFRGIGZpbGUuIFVzZWQgYnkgdGhlIHtAbGluayBTZXJpYWxpemFibGVSZXNvdXJjZUV4dGVybmFsfUdMVEYgc3BlY2lhbGl6YXRpb25zIHRvIGxvYWQgdGhlbXNlbHZlcy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxvYWRSZXNvdXJjZTxUIGV4dGVuZHMgR3JhcGhHTFRGIHwgTWVzaEdMVEYgfCBNYXRlcmlhbEdMVEYgfCBBbmltYXRpb25HTFRGIHwgR3JhcGhJbnN0YW5jZT4oX3Jlc291cmNlOiBULCBfdXJsPzogUmVxdWVzdEluZm8pOiBQcm9taXNlPFQ+IHtcclxuICAgICAgY29uc3QgbG9hZGVyOiBHTFRGTG9hZGVyID0gYXdhaXQgR0xURkxvYWRlci5MT0FEKCgoPFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWw+X3Jlc291cmNlKS51cmwgPz8gX3VybCkudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICBpZiAoIWxvYWRlcikge1xyXG4gICAgICAgIGlmICghKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKVxyXG4gICAgICAgICAgX3Jlc291cmNlLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5FUlJPUjtcclxuICAgICAgICByZXR1cm4gX3Jlc291cmNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG9hZGVkOiBUO1xyXG5cclxuICAgICAgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEdyYXBoKF9yZXNvdXJjZS5nZXQoKS5uYW1lLCBfcmVzb3VyY2UpO1xyXG4gICAgICBlbHNlIGlmIChfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEdMVEYpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEdyYXBoKF9yZXNvdXJjZS5uYW1lLCBfcmVzb3VyY2UpO1xyXG4gICAgICBlbHNlIGlmIChfcmVzb3VyY2UgaW5zdGFuY2VvZiBNZXNoR0xURilcclxuICAgICAgICBsb2FkZWQgPSBhd2FpdCBsb2FkZXIuZ2V0TWVzaChfcmVzb3VyY2UubmFtZSwgX3Jlc291cmNlLmlQcmltaXRpdmUsIF9yZXNvdXJjZSk7XHJcbiAgICAgIGVsc2UgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIE1hdGVyaWFsR0xURilcclxuICAgICAgICBsb2FkZWQgPSBhd2FpdCBsb2FkZXIuZ2V0TWF0ZXJpYWwoX3Jlc291cmNlLm5hbWUsIF9yZXNvdXJjZSk7XHJcbiAgICAgIGVsc2UgaWYgKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEFuaW1hdGlvbkdMVEYpXHJcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmdldEFuaW1hdGlvbihfcmVzb3VyY2UubmFtZSwgX3Jlc291cmNlKTtcclxuXHJcbiAgICAgIGlmICghbG9hZGVkKSB7XHJcbiAgICAgICAgRGVidWcuZXJyb3IoYCR7X3Jlc291cmNlLmNvbnN0cnVjdG9yLm5hbWV9IHwgJHtfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlID8gX3Jlc291cmNlLmlkU291cmNlIDogX3Jlc291cmNlLmlkUmVzb3VyY2V9OiBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZS5gKTtcclxuICAgICAgICBpZiAoIShfcmVzb3VyY2UgaW5zdGFuY2VvZiBHcmFwaEluc3RhbmNlKSlcclxuICAgICAgICAgIF9yZXNvdXJjZS5zdGF0dXMgPSBSRVNPVVJDRV9TVEFUVVMuRVJST1I7XHJcblxyXG4gICAgICAgIHJldHVybiBfcmVzb3VyY2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghKGxvYWRlZCBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKSB7XHJcbiAgICAgICAgbG9hZGVkLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5SRUFEWTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgKGNhY2hlZCAmJiAhKF9yZXNvdXJjZSBpbnN0YW5jZW9mIEdyYXBoSW5zdGFuY2UpKSB7XHJcblxyXG4gICAgICAvLyAgIGlmICghUHJvamVjdC5yZXNvdXJjZXNbY2FjaGVkLmlkUmVzb3VyY2VdKVxyXG4gICAgICAvLyAgICAgY2FjaGVkLmlkUmVzb3VyY2UgPSBfcmVzb3VyY2UuaWRSZXNvdXJjZTsgLy8gY2hhbmdlIHRoZSBpZCBvZiB0aGUgY2FjaGVkIHJlc291cmNlIHRvIHRoZSBpZCBvZiB0aGUgcmVzb3VyY2UgdGhhdCByZXF1ZXN0ZWQgaXRcclxuXHJcbiAgICAgIC8vICAgaWYgKGNhY2hlZC5pZFJlc291cmNlICE9IF9yZXNvdXJjZS5pZFJlc291cmNlKSB7XHJcbiAgICAgIC8vICAgICAvLyB0d28gZGlmZmVyZW50IHJlc291cmNlcyBoYXZlIHJlcXVlc3RlZCB0aGUgc2FtZSBjYWNoZWQgcmVzb3VyY2VcclxuICAgICAgLy8gICAgIERlYnVnLmVycm9yKGAke19yZXNvdXJjZS5pZFJlc291cmNlfTogRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UuICR7X3Jlc291cmNlLnR5cGV9IHdpdGggbmFtZSAnJHtfcmVzb3VyY2UubmFtZX0nIGZyb20gJyR7bG9hZGVyLm5hbWV9JyBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBieSAnJHtjYWNoZWQuaWRSZXNvdXJjZX0nLiBQbGVhc2UgZGVsZXRlIHRoZSBkdXBsaWNhdGUgJyR7X3Jlc291cmNlLmlkUmVzb3VyY2V9JyBmcm9tIHRoZSBwcm9qZWN0LmApO1xyXG4gICAgICAvLyAgICAgcmV0dXJuIF9yZXNvdXJjZTtcclxuICAgICAgLy8gICB9XHJcblxyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICByZXR1cm4gbG9hZGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBHTFRGTG9hZGVyfSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHVybCBvciBudWxsIGlmIHRoZSB1cmwgY2FuJ3QgYmUgcmVzb2x2ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgTE9BRChfdXJsOiBzdHJpbmcsIF9yZWdpc3RlclJlc291cmNlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxHTFRGTG9hZGVyPiB7XHJcbiAgICAgIGlmICghdGhpcy5sb2FkZXJzKVxyXG4gICAgICAgIEdMVEZMb2FkZXIubG9hZGVycyA9IHt9O1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmxvYWRlcnNbX3VybF0pIHtcclxuICAgICAgICBsZXQgZ2x0ZjogR0xURi5HbFRmO1xyXG4gICAgICAgIGxldCBidWZmZXI6IEFycmF5QnVmZmVyO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChuZXcgVVJMKF91cmwsIFByb2plY3QuYmFzZVVSTCkpO1xyXG4gICAgICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbjogc3RyaW5nID0gX3VybC5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09IFwiZ2x0ZlwiKVxyXG4gICAgICAgICAgICBnbHRmID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09IFwiZ2xiXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVZpZXc6IERhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1hZ2ljOiBudW1iZXIgPSBkYXRhVmlldy5nZXRVaW50MzIoMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChtYWdpYyAhPT0gMHg0NjU0NkM2NylcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7R0xURkxvYWRlci5uYW1lfSB8ICR7X3VybH06IEludmFsaWQgbWFnaWMgbnVtYmVyIGluIEdMQiBmaWxlLmApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gZGF0YVZpZXcuZ2V0VWludDMyKDQsIHRydWUpO1xyXG4gICAgICAgICAgICBpZiAodmVyc2lvbiAhPSAyKVxyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVW5zdXBwb3J0ZWQgdmVyc2lvbiBpbiBHTEIgZmlsZS5gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGpzb25MZW5ndGg6IG51bWJlciA9IGRhdGFWaWV3LmdldFVpbnQzMigxMiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGpzb25Gb3JtYXQ6IG51bWJlciA9IGRhdGFWaWV3LmdldFVpbnQzMigxNiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoanNvbkZvcm1hdCAhPT0gMHg0RTRGNTM0QSlcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0LiBUaGUgZmlyc3QgY2h1bmsgb2YgdGhlIGZpbGUgaXMgbm90IGluIEpTT04gZm9ybWF0LicpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGVjb2RlcjogVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuICAgICAgICAgICAgY29uc3QganNvbkNodW5rOiBzdHJpbmcgPSBkZWNvZGVyLmRlY29kZShuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgMjAsIGpzb25MZW5ndGgpKTtcclxuICAgICAgICAgICAgZ2x0ZiA9IEpTT04ucGFyc2UoanNvbkNodW5rKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoID49IDIwICsganNvbkxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJpbmFyeUxlbmd0aDogbnVtYmVyID0gZGF0YVZpZXcuZ2V0VWludDMyKDIwICsganNvbkxlbmd0aCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgY29uc3QgYmluYXJ5Rm9ybWF0OiBudW1iZXIgPSBkYXRhVmlldy5nZXRVaW50MzIoMjQgKyBqc29uTGVuZ3RoLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGJpbmFyeUZvcm1hdCAhPT0gMHgwMDRFNDk0MilcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmb3JtYXQuIFRoZSBzZWNvbmQgY2h1bmsgb2YgdGhlIGZpbGUgaXMgbm90IGluIGJpbmFyeSBmb3JtYXQuJyk7XHJcblxyXG4gICAgICAgICAgICAgIGJ1ZmZlciA9IGFycmF5QnVmZmVyLnNsaWNlKDI4ICsganNvbkxlbmd0aCwgMjggKyBqc29uTGVuZ3RoICsgYmluYXJ5TGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XHJcbiAgICAgICAgICBEZWJ1Zy5lcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogRmFpbGVkIHRvIGxvYWQgZmlsZS4gJHtlcnJvcn1gKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgR0xURkxvYWRlci5jaGVja0NvbXBhdGliaWxpdHkoZ2x0ZiwgX3VybCk7XHJcbiAgICAgICAgR0xURkxvYWRlci5wcmVQcm9jZXNzKGdsdGYsIF91cmwpO1xyXG5cclxuICAgICAgICBHTFRGTG9hZGVyLmxvYWRlcnNbX3VybF0gPSBuZXcgR0xURkxvYWRlcihnbHRmLCBfdXJsLCBidWZmZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gR0xURkxvYWRlci5sb2FkZXJzW191cmxdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNoZWNrQ29tcGF0aWJpbGl0eShfZ2x0ZjogR0xURi5HbFRmLCBfdXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgaWYgKF9nbHRmLmFzc2V0LnZlcnNpb24gIT0gXCIyLjBcIilcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke0dMVEZMb2FkZXIubmFtZX0gfCAke191cmx9OiBUaGlzIGxvYWRlciB3YXMgZGV2ZWxvcGVkIGZvciBnbFRGIDIuMC4gSXQgbWF5IG5vdCB3b3JrIGFzIGludGVuZGVkIHdpdGggdmVyc2lvbiAke19nbHRmLmFzc2V0LnZlcnNpb259LmApO1xyXG4gICAgICBpZiAoX2dsdGYuYXNzZXQubWluVmVyc2lvbiAhPSB1bmRlZmluZWQgJiYgX2dsdGYuYXNzZXQubWluVmVyc2lvbiAhPSBcIjIuMFwiKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVGhpcyBsb2FkZXIgd2FzIGRldmVsb3BlZCBmb3IgZ2xURiAyLjAuIEl0IGRvZXMgbm90IHdvcmsgd2l0aCByZXF1aXJlZCBtaW4gdmVyc2lvbiAke19nbHRmLmFzc2V0Lm1pblZlcnNpb259LmApO1xyXG4gICAgICBpZiAoX2dsdGYuZXh0ZW5zaW9uc1VzZWQ/Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgRGVidWcud2FybihgJHtHTFRGTG9hZGVyLm5hbWV9IHwgJHtfdXJsfTogVGhpcyBsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBnbFRGIGV4dGVuc2lvbnMuIEl0IG1heSBub3Qgd29yayBhcyBpbnRlbmRlZCB3aXRoIGV4dGVuc2lvbnMgJHtfZ2x0Zi5leHRlbnNpb25zVXNlZC50b1N0cmluZygpfS5gKTtcclxuICAgICAgaWYgKF9nbHRmLmV4dGVuc2lvbnNSZXF1aXJlZD8ubGVuZ3RoID4gMClcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7R0xURkxvYWRlci5uYW1lfSB8ICR7X3VybH06IFRoaXMgbG9hZGVyIGRvZXMgbm90IHN1cHBvcnQgZ2xURiBleHRlbnNpb25zLiBJdCBkb2VzIG5vdCB3b3JrIHdpdGggcmVxdWlyZWQgZXh0ZW5zaW9ucyAke19nbHRmLmV4dGVuc2lvbnNSZXF1aXJlZC50b1N0cmluZygpfS5gKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBwcmVQcm9jZXNzKF9nbHRmOiBHTFRGLkdsVGYsIF91cmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAvLyBhZGQgYSBuYW1lIHRvIGVhY2ggc2NlbmVcclxuICAgICAgaWYgKF9nbHRmLnNjZW5lcykge1xyXG4gICAgICAgIF9nbHRmLnNjZW5lID0gX2dsdGYuc2NlbmUgPz8gMDtcclxuICAgICAgICBhZGROYW1lcyhcIlNjZW5lXCIsIF9nbHRmLnNjZW5lcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfZ2x0Zi5ub2Rlcykge1xyXG4gICAgICAgIC8vIG1hcmsgYWxsIG5vZGVzIHRoYXQgYXJlIGFuaW1hdGVkXHJcbiAgICAgICAgX2dsdGYuYW5pbWF0aW9ucz8uZm9yRWFjaChfYW5pbWF0aW9uID0+IHtcclxuICAgICAgICAgIF9hbmltYXRpb24uY2hhbm5lbHMuZm9yRWFjaChfY2hhbm5lbCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlOb2RlOiBudW1iZXIgPSBfY2hhbm5lbC50YXJnZXQubm9kZTtcclxuICAgICAgICAgICAgaWYgKGlOb2RlICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICBfZ2x0Zi5ub2Rlc1tpTm9kZV0uaXNBbmltYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gbWFyayBwYXJlbnQgb2YgZWFjaCBub2RlXHJcbiAgICAgICAgX2dsdGYubm9kZXMuZm9yRWFjaCgoX25vZGUsIF9pTm9kZSkgPT4gX25vZGUuY2hpbGRyZW4/LmZvckVhY2goX2lDaGlsZCA9PiBfZ2x0Zi5ub2Rlc1tfaUNoaWxkXS5wYXJlbnQgPSBfaU5vZGUpKTtcclxuXHJcbiAgICAgICAgX2dsdGYubm9kZXMuZm9yRWFjaCgoX25vZGUsIF9pTm9kZSkgPT4ge1xyXG4gICAgICAgICAgLy8gYWRkIG5hbWVzIHRvIG5vZGVzIHRoYXQgZG9uJ3QgaGF2ZSBvbmVcclxuICAgICAgICAgIGlmIChfbm9kZS5uYW1lID09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgX25vZGUubmFtZSA9IGBOb2RlJHtfaU5vZGV9YDtcclxuXHJcbiAgICAgICAgICBpZiAoX25vZGUuaXNBbmltYXRlZCkge1xyXG4gICAgICAgICAgICAvLyBhZGQgcGF0aCB0byBlYWNoIGFuaW1hdGVkIG5vZGVcclxuICAgICAgICAgICAgbGV0IGlQYXJlbnQ6IG51bWJlciA9IF9ub2RlLnBhcmVudDtcclxuICAgICAgICAgICAgbGV0IHBhdGg6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgICAgIHBhdGgucHVzaChfaU5vZGUpO1xyXG4gICAgICAgICAgICB3aGlsZSAoaVBhcmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBwYXRoLnB1c2goaVBhcmVudCk7XHJcbiAgICAgICAgICAgICAgaVBhcmVudCA9IF9nbHRmLm5vZGVzW2lQYXJlbnRdLnBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfbm9kZS5wYXRoID0gcGF0aC5yZXZlcnNlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoX2dsdGYubWF0ZXJpYWxzKVxyXG4gICAgICAgIGFkZE5hbWVzKFwiTWF0ZXJpYWxcIiwgX2dsdGYubWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIGlmIChfZ2x0Zi5tZXNoZXMpXHJcbiAgICAgICAgYWRkTmFtZXMoXCJNZXNoXCIsIF9nbHRmLm1lc2hlcyk7XHJcblxyXG4gICAgICBpZiAoX2dsdGYuYW5pbWF0aW9ucylcclxuICAgICAgICBhZGROYW1lcyhcIkFuaW1hdGlvblwiLCBfZ2x0Zi5hbmltYXRpb25zKTtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGFkZE5hbWVzKF90ZW1wbGF0ZTogc3RyaW5nLCBfdGFyZ2V0OiB7IG5hbWU/OiBzdHJpbmcgfVtdKTogdm9pZCB7XHJcbiAgICAgICAgX3RhcmdldC5mb3JFYWNoKChfaXRlbSwgX2luZGV4KSA9PiB7XHJcbiAgICAgICAgICBpZiAoX2l0ZW0ubmFtZSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIF9pdGVtLm5hbWUgPSBgJHtfdGVtcGxhdGV9JHtfaW5kZXh9YDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZ2xURiBmaWxlIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy4jdXJsLnNwbGl0KFwiXFxcXFwiKS5wb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgbmV3IGluc3RhbmNlcyBvZiBhbGwgcmVzb3VyY2VzIG9mIHRoZSBnaXZlbiB0eXBlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbG9hZFJlc291cmNlczxUIGV4dGVuZHMgU2VyaWFsaXphYmxlUmVzb3VyY2VFeHRlcm5hbD4oX2NsYXNzOiBuZXcgKCkgPT4gVCk6IFByb21pc2U8VFtdPiB7XHJcbiAgICAgIGxldCByZXNvdXJjZXM6IFNlcmlhbGl6YWJsZVJlc291cmNlRXh0ZXJuYWxbXSA9IFtdO1xyXG4gICAgICBzd2l0Y2ggKF9jbGFzcy5uYW1lKSB7XHJcbiAgICAgICAgY2FzZSBHcmFwaC5uYW1lOlxyXG4gICAgICAgICAgZm9yIChsZXQgaVNjZW5lOiBudW1iZXIgPSAwOyBpU2NlbmUgPCB0aGlzLiNnbHRmLnNjZW5lcz8ubGVuZ3RoOyBpU2NlbmUrKylcclxuICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRHcmFwaChpU2NlbmUsIG5ldyBHcmFwaEdMVEYoKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNZXNoLm5hbWU6XHJcbiAgICAgICAgICBmb3IgKGxldCBpTWVzaDogbnVtYmVyID0gMDsgaU1lc2ggPCB0aGlzLiNnbHRmLm1lc2hlcz8ubGVuZ3RoOyBpTWVzaCsrKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpUHJpbWl0aXZlOiBudW1iZXIgPSAwOyBpUHJpbWl0aXZlIDwgdGhpcy4jZ2x0Zi5tZXNoZXNbaU1lc2hdLnByaW1pdGl2ZXMubGVuZ3RoOyBpUHJpbWl0aXZlKyspXHJcbiAgICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRNZXNoKGlNZXNoLCBpUHJpbWl0aXZlLCBuZXcgTWVzaEdMVEYoKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNYXRlcmlhbC5uYW1lOlxyXG4gICAgICAgICAgZm9yIChsZXQgaU1hdGVyaWFsOiBudW1iZXIgPSAwOyBpTWF0ZXJpYWwgPCB0aGlzLiNnbHRmLm1hdGVyaWFscz8ubGVuZ3RoOyBpTWF0ZXJpYWwrKylcclxuICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2goYXdhaXQgdGhpcy5nZXRNYXRlcmlhbChpTWF0ZXJpYWwsIG5ldyBNYXRlcmlhbEdMVEYoXCJIaSA6KVwiKSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBBbmltYXRpb24ubmFtZTpcclxuICAgICAgICAgIGZvciAobGV0IGlBbmltYXRpb246IG51bWJlciA9IDA7IGlBbmltYXRpb24gPCB0aGlzLiNnbHRmLmFuaW1hdGlvbnM/Lmxlbmd0aDsgaUFuaW1hdGlvbisrKVxyXG4gICAgICAgICAgICByZXNvdXJjZXMucHVzaChhd2FpdCB0aGlzLmdldEFuaW1hdGlvbihpQW5pbWF0aW9uLCBuZXcgQW5pbWF0aW9uR0xURigpKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcclxuICAgICAgICBpZiAoIVByb2plY3QucmVzb3VyY2VzW3Jlc291cmNlLmlkUmVzb3VyY2VdKVxyXG4gICAgICAgICAgUHJvamVjdC5yZWdpc3RlcihyZXNvdXJjZSk7XHJcblxyXG4gICAgICAgIHJlc291cmNlLnN0YXR1cyA9IFJFU09VUkNFX1NUQVRVUy5SRUFEWTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIDxUW10+cmVzb3VyY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBHcmFwaH0gZm9yIHRoZSBnaXZlbiBzY2VuZSBuYW1lIG9yIHRoZSBkZWZhdWx0IHNjZW5lIGlmIG5vIG5hbWUgaXMgZ2l2ZW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRHcmFwaChfbmFtZT86IHN0cmluZyk6IFByb21pc2U8R3JhcGg+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEdyYXBofSBmb3IgdGhlIGdpdmVuIHNjZW5lIGluZGV4IG9yIHRoZSBkZWZhdWx0IHNjZW5lIGlmIG5vIGluZGV4IGlzIGdpdmVuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0R3JhcGgoX2lTY2VuZT86IG51bWJlcik6IFByb21pc2U8R3JhcGg+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIHNjZW5lIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgR3JhcGh9LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRHcmFwaDxUIGV4dGVuZHMgTm9kZT4oX2lTY2VuZTogbnVtYmVyIHwgc3RyaW5nLCBfZ3JhcGg6IFQpOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldEdyYXBoKF9pU2NlbmU6IG51bWJlciB8IHN0cmluZyA9IHRoaXMuI2dsdGYuc2NlbmUsIF9ncmFwaD86IE5vZGUpOiBQcm9taXNlPE5vZGU+IHtcclxuICAgICAgX2lTY2VuZSA9IHRoaXMuZ2V0SW5kZXgoX2lTY2VuZSwgdGhpcy4jZ2x0Zi5zY2VuZXMpO1xyXG5cclxuICAgICAgaWYgKF9pU2NlbmUgPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7R3JhcGhHTFRGLm5hbWV9fCR7X2lTY2VuZX1gO1xyXG5cclxuICAgICAgaWYgKCFfZ3JhcGggJiYgdGhpcy4jcmVzb3VyY2VzW2lkXSlcclxuICAgICAgICByZXR1cm4gPE5vZGU+PHVua25vd24+dGhpcy4jcmVzb3VyY2VzW2lkXTtcclxuXHJcbiAgICAgIHRoaXMuI25vZGVzID0gW107XHJcbiAgICAgIHRoaXMuI2NhbWVyYXMgPSBbXTtcclxuICAgICAgdGhpcy4jc2tlbGV0b25zID0gW107XHJcblxyXG4gICAgICBjb25zdCBnbHRmU2NlbmU6IEdMVEYuU2NlbmUgPSB0aGlzLiNnbHRmLnNjZW5lc1tfaVNjZW5lXTtcclxuICAgICAgY29uc3QgZ3JhcGg6IE5vZGUgPSBfZ3JhcGggPz8gbmV3IEdyYXBoR0xURigpO1xyXG4gICAgICBncmFwaC5uYW1lID0gZ2x0ZlNjZW5lLm5hbWU7XHJcbiAgICAgIGlmIChncmFwaCBpbnN0YW5jZW9mIEdyYXBoR0xURilcclxuICAgICAgICBncmFwaC51cmwgPSB0aGlzLiN1cmw7XHJcbiAgICAgIGlmIChfZ3JhcGgpIHtcclxuICAgICAgICBfZ3JhcGgucmVtb3ZlQWxsQ2hpbGRyZW4oKTtcclxuICAgICAgICBfZ3JhcGgucmVtb3ZlQ29tcG9uZW50cyhDb21wb25lbnRTa2VsZXRvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgaU5vZGUgb2YgZ2x0ZlNjZW5lLm5vZGVzKVxyXG4gICAgICAgIGdyYXBoLmFkZENoaWxkKGF3YWl0IHRoaXMuZ2V0Tm9kZUJ5SW5kZXgoaU5vZGUpKTtcclxuXHJcbiAgICAgIC8vIGlmICh0aGlzLiNnbHRmLmFuaW1hdGlvbnM/Lmxlbmd0aCA+IDAgJiYgIWdyYXBoLmdldENvbXBvbmVudChDb21wb25lbnRBbmltYXRvcikpIHtcclxuICAgICAgLy8gICBsZXQgYW5pbWF0aW9uOiBBbmltYXRpb24gPSBhd2FpdCB0aGlzLmdldEFuaW1hdGlvbigwKTtcclxuICAgICAgLy8gICBQcm9qZWN0LnJlZ2lzdGVyKGFuaW1hdGlvbik7XHJcbiAgICAgIC8vICAgZ3JhcGguYWRkQ29tcG9uZW50KG5ldyBDb21wb25lbnRBbmltYXRvcihhbmltYXRpb24pKTtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgLy8gVE9ETzogbG9hZCBvbmx5IHNrZWxldG9ucyB3aGljaCBiZWxvbmcgdG8gdGhlIHNjZW5lPz8/XHJcbiAgICAgIC8vIGlmICh0aGlzLmdsdGYuc2tpbnM/Lmxlbmd0aCA+IDApXHJcbiAgICAgIC8vICAgZm9yIChsZXQgaVNraW46IG51bWJlciA9IDA7IGlTa2luIDwgdGhpcy5nbHRmLnNraW5zLmxlbmd0aDsgaVNraW4rKylcclxuICAgICAgLy8gICAgIHNjZW5lLmFkZENvbXBvbmVudChhd2FpdCB0aGlzLmdldFNrZWxldG9uQnlJbmRleChpU2tpbikpO1xyXG4gICAgICBpZiAodGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgIGZvciAoY29uc3Qgc2tlbGV0b24gb2YgdGhpcy4jc2tlbGV0b25zKVxyXG4gICAgICAgICAgZ3JhcGguYWRkQ29tcG9uZW50KHNrZWxldG9uKTtcclxuXHJcbiAgICAgIGlmICghX2dyYXBoKVxyXG4gICAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSA8R3JhcGhHTFRGPmdyYXBoO1xyXG5cclxuICAgICAgcmV0dXJuIGdyYXBoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZmlyc3Qge0BsaW5rIE5vZGV9IHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXROb2RlKF9uYW1lOiBzdHJpbmcpOiBQcm9taXNlPE5vZGU+IHtcclxuICAgICAgY29uc3QgaU5vZGU6IG51bWJlciA9IHRoaXMuI2dsdGYubm9kZXMuZmluZEluZGV4KF9ub2RlID0+IF9ub2RlLm5hbWUgPT0gX25hbWUpO1xyXG4gICAgICBpZiAoaU5vZGUgPT0gLTEpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBDb3VsZG4ndCBmaW5kIG5hbWUgJyR7X25hbWV9JyBpbiBnbFRGIG5vZGVzLmApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROb2RlQnlJbmRleChpTm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTm9kZX0gZm9yIHRoZSBnaXZlbiBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE5vZGVCeUluZGV4KF9pTm9kZTogbnVtYmVyKTogUHJvbWlzZTxOb2RlPiB7XHJcbiAgICAgIGlmICghdGhpcy4jbm9kZXNbX2lOb2RlXSkge1xyXG4gICAgICAgIGNvbnN0IGdsdGZOb2RlOiBHTFRGLk5vZGUgPSB0aGlzLiNnbHRmLm5vZGVzW19pTm9kZV07XHJcbiAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IG5ldyBOb2RlKGdsdGZOb2RlLm5hbWUpO1xyXG5cclxuICAgICAgICB0aGlzLiNub2Rlc1tfaU5vZGVdID0gbm9kZTtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKGdsdGZOb2RlLmNoaWxkcmVuKVxyXG4gICAgICAgICAgZm9yIChjb25zdCBpTm9kZSBvZiBnbHRmTm9kZS5jaGlsZHJlbilcclxuICAgICAgICAgICAgbm9kZS5hZGRDaGlsZChhd2FpdCB0aGlzLmdldE5vZGVCeUluZGV4KGlOb2RlKSk7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciB0cmFuc2Zvcm1hdGlvblxyXG4gICAgICAgIGlmIChnbHRmTm9kZS5tYXRyaXggfHwgZ2x0Zk5vZGUucm90YXRpb24gfHwgZ2x0Zk5vZGUuc2NhbGUgfHwgZ2x0Zk5vZGUudHJhbnNsYXRpb24gfHwgZ2x0Zk5vZGUuaXNBbmltYXRlZCkge1xyXG4gICAgICAgICAgbm9kZS5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudFRyYW5zZm9ybSgpKTtcclxuICAgICAgICAgIGlmIChnbHRmTm9kZS5tYXRyaXgpIHtcclxuICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5zZXQoZ2x0Zk5vZGUubWF0cml4KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChnbHRmTm9kZS50cmFuc2xhdGlvbikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uOiBWZWN0b3IzID0gUmVjeWNsZXIuZ2V0KFZlY3RvcjMpO1xyXG4gICAgICAgICAgICAgIHRyYW5zbGF0aW9uLnNldChnbHRmTm9kZS50cmFuc2xhdGlvblswXSwgZ2x0Zk5vZGUudHJhbnNsYXRpb25bMV0sIGdsdGZOb2RlLnRyYW5zbGF0aW9uWzJdKTtcclxuICAgICAgICAgICAgICBub2RlLm10eExvY2FsLnRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb247XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUodHJhbnNsYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChnbHRmTm9kZS5yb3RhdGlvbikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJvdGF0aW9uOiBRdWF0ZXJuaW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICAgICAgICAgIHJvdGF0aW9uLnNldChnbHRmTm9kZS5yb3RhdGlvblswXSwgZ2x0Zk5vZGUucm90YXRpb25bMV0sIGdsdGZOb2RlLnJvdGF0aW9uWzJdLCBnbHRmTm9kZS5yb3RhdGlvblszXSk7XHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5yb3RhdGlvbiA9IHJvdGF0aW9uO1xyXG4gICAgICAgICAgICAgIFJlY3ljbGVyLnN0b3JlKHJvdGF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZ2x0Zk5vZGUuc2NhbGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCBzY2FsZTogVmVjdG9yMyA9IFJlY3ljbGVyLmdldChWZWN0b3IzKTtcclxuICAgICAgICAgICAgICBzY2FsZS5zZXQoZ2x0Zk5vZGUuc2NhbGVbMF0sIGdsdGZOb2RlLnNjYWxlWzFdLCBnbHRmTm9kZS5zY2FsZVsyXSk7XHJcbiAgICAgICAgICAgICAgbm9kZS5tdHhMb2NhbC5zY2FsaW5nID0gc2NhbGU7XHJcbiAgICAgICAgICAgICAgUmVjeWNsZXIuc3RvcmUoc2NhbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjaGVjayBmb3IgY2FtZXJhXHJcbiAgICAgICAgaWYgKGdsdGZOb2RlLmNhbWVyYSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIG5vZGUuYWRkQ29tcG9uZW50KGF3YWl0IHRoaXMuZ2V0Q2FtZXJhQnlJbmRleChnbHRmTm9kZS5jYW1lcmEpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciBtZXNoIGFuZCBtYXRlcmlhbFxyXG4gICAgICAgIGlmIChnbHRmTm9kZS5tZXNoICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29uc3QgZ2x0Zk1lc2g6IEdMVEYuTWVzaCA9IHRoaXMuI2dsdGYubWVzaGVzPy5bZ2x0Zk5vZGUubWVzaF07XHJcbiAgICAgICAgICAvLyBUT0RPOiByZXZpZXcgdGhpc1xyXG4gICAgICAgICAgY29uc3Qgc3ViQ29tcG9uZW50czogW0NvbXBvbmVudE1lc2gsIENvbXBvbmVudE1hdGVyaWFsXVtdID0gW107XHJcbiAgICAgICAgICBmb3IgKGxldCBpUHJpbWl0aXZlOiBudW1iZXIgPSAwOyBpUHJpbWl0aXZlIDwgZ2x0Zk1lc2gucHJpbWl0aXZlcy5sZW5ndGg7IGlQcmltaXRpdmUrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjbXBNZXNoOiBDb21wb25lbnRNZXNoID0gbmV3IENvbXBvbmVudE1lc2goYXdhaXQgdGhpcy5nZXRNZXNoKGdsdGZOb2RlLm1lc2gsIGlQcmltaXRpdmUpKTtcclxuICAgICAgICAgICAgY29uc3QgaXNTa2luOiBib29sZWFuID0gZ2x0Zk5vZGUuc2tpbiAhPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNTa2luKVxyXG4gICAgICAgICAgICAgIGNtcE1lc2guc2tlbGV0b24gPSBhd2FpdCB0aGlzLmdldFNrZWxldG9uQnlJbmRleChnbHRmTm9kZS5za2luKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjbXBNYXRlcmlhbDogQ29tcG9uZW50TWF0ZXJpYWw7XHJcbiAgICAgICAgICAgIGNvbnN0IGlNYXRlcmlhbDogbnVtYmVyID0gZ2x0Zk1lc2gucHJpbWl0aXZlcz8uW2lQcmltaXRpdmVdPy5tYXRlcmlhbDtcclxuICAgICAgICAgICAgaWYgKGlNYXRlcmlhbCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBjbXBNYXRlcmlhbCA9IG5ldyBDb21wb25lbnRNYXRlcmlhbChpc1NraW4gP1xyXG4gICAgICAgICAgICAgICAgR0xURkxvYWRlci5kZWZhdWx0U2tpbk1hdGVyaWFsIDpcclxuICAgICAgICAgICAgICAgIEdMVEZMb2FkZXIuZGVmYXVsdE1hdGVyaWFsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCBpc0ZsYXQ6IGJvb2xlYW4gPSBnbHRmTWVzaC5wcmltaXRpdmVzW2lQcmltaXRpdmVdLmF0dHJpYnV0ZXMuTk9STUFMID09IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICBjbXBNYXRlcmlhbCA9IG5ldyBDb21wb25lbnRNYXRlcmlhbChhd2FpdCB0aGlzLmdldE1hdGVyaWFsKGlNYXRlcmlhbCwgbnVsbCwgaXNTa2luLCBpc0ZsYXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gVE9ETzogbWF5YmUgdGhpcyBzaG91bGQgYmUgYSBmdWRnZSBtYXRlcmlhbCBwcm9wZXJ0eVxyXG4gICAgICAgICAgICAgIGNvbnN0IGdsdGZNYXRlcmlhbDogR0xURi5NYXRlcmlhbCA9IHRoaXMuI2dsdGYubWF0ZXJpYWxzW2lNYXRlcmlhbF07XHJcbiAgICAgICAgICAgICAgaWYgKGdsdGZNYXRlcmlhbCkgXHJcbiAgICAgICAgICAgICAgICBjbXBNYXRlcmlhbC5zb3J0Rm9yQWxwaGEgPSBnbHRmTWF0ZXJpYWwuYWxwaGFNb2RlID09IFwiQkxFTkRcIjtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc3ViQ29tcG9uZW50cy5wdXNoKFtjbXBNZXNoLCBjbXBNYXRlcmlhbF0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChzdWJDb21wb25lbnRzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIG5vZGUuYWRkQ29tcG9uZW50KHN1YkNvbXBvbmVudHNbMF1bMF0pO1xyXG4gICAgICAgICAgICBub2RlLmFkZENvbXBvbmVudChzdWJDb21wb25lbnRzWzBdWzFdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN1YkNvbXBvbmVudHMuZm9yRWFjaCgoW19jbXBNZXNoLCBfY21wTWF0ZXJpYWxdLCBfaSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5vZGVQYXJ0OiBOb2RlID0gbmV3IE5vZGUoYCR7bm9kZS5uYW1lfV9QcmltaXRpdmUke19pfWApO1xyXG4gICAgICAgICAgICAgIG5vZGVQYXJ0LmFkZENvbXBvbmVudChfY21wTWVzaCk7XHJcbiAgICAgICAgICAgICAgbm9kZVBhcnQuYWRkQ29tcG9uZW50KF9jbXBNYXRlcmlhbCk7XHJcbiAgICAgICAgICAgICAgbm9kZS5hZGRDaGlsZChub2RlUGFydCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuI25vZGVzW19pTm9kZV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgQ29tcG9uZW50Q2FtZXJhfSB3aXRoIHRoZSBnaXZlbiBjYW1lcmEgbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldENhbWVyYShfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb21wb25lbnRDYW1lcmE+IHtcclxuICAgICAgY29uc3QgaUNhbWVyYTogbnVtYmVyID0gdGhpcy4jZ2x0Zi5jYW1lcmFzLmZpbmRJbmRleChfY2FtZXJhID0+IF9jYW1lcmEubmFtZSA9PSBfbmFtZSk7XHJcbiAgICAgIGlmIChpQ2FtZXJhID09IC0xKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBuYW1lICcke19uYW1lfScgaW4gZ2xURiBjYW1lcmFzLmApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRDYW1lcmFCeUluZGV4KGlDYW1lcmEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIENvbXBvbmVudENhbWVyYX0gZm9yIHRoZSBnaXZlbiBjYW1lcmEgaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRDYW1lcmFCeUluZGV4KF9pQ2FtZXJhOiBudW1iZXIpOiBQcm9taXNlPENvbXBvbmVudENhbWVyYT4ge1xyXG4gICAgICBpZiAoIXRoaXMuI2NhbWVyYXMpXHJcbiAgICAgICAgdGhpcy4jY2FtZXJhcyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI2NhbWVyYXNbX2lDYW1lcmFdKSB7XHJcbiAgICAgICAgY29uc3QgZ2x0ZkNhbWVyYTogR0xURi5DYW1lcmEgPSB0aGlzLiNnbHRmLmNhbWVyYXNbX2lDYW1lcmFdO1xyXG4gICAgICAgIGNvbnN0IGNhbWVyYTogQ29tcG9uZW50Q2FtZXJhID0gbmV3IENvbXBvbmVudENhbWVyYSgpO1xyXG5cclxuICAgICAgICBpZiAoZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZSlcclxuICAgICAgICAgIGNhbWVyYS5wcm9qZWN0Q2VudHJhbChcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZS5hc3BlY3RSYXRpbyxcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5wZXJzcGVjdGl2ZS55Zm92ICogQ2FsYy5yYWQyZGVnLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLnBlcnNwZWN0aXZlLnpuZWFyLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLnBlcnNwZWN0aXZlLnpmYXJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgY2FtZXJhLnByb2plY3RPcnRob2dyYXBoaWMoXHJcbiAgICAgICAgICAgIC1nbHRmQ2FtZXJhLm9ydGhvZ3JhcGhpYy54bWFnLFxyXG4gICAgICAgICAgICBnbHRmQ2FtZXJhLm9ydGhvZ3JhcGhpYy54bWFnLFxyXG4gICAgICAgICAgICAtZ2x0ZkNhbWVyYS5vcnRob2dyYXBoaWMueW1hZyxcclxuICAgICAgICAgICAgZ2x0ZkNhbWVyYS5vcnRob2dyYXBoaWMueW1hZ1xyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNhbWVyYTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy4jY2FtZXJhc1tfaUNhbWVyYV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgQW5pbWF0aW9ufSB3aXRoIHRoZSBnaXZlbiBhbmltYXRpb24gbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEFuaW1hdGlvbihfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxBbmltYXRpb24+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW5pbWF0aW9ufSBmb3IgdGhlIGdpdmVuIGFuaW1hdGlvbiBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEFuaW1hdGlvbihfaUFuaW1hdGlvbjogbnVtYmVyKTogUHJvbWlzZTxBbmltYXRpb24+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhbiBhbmltYXRpb24gZnJvbSB0aGUgZ2xURiBmaWxlIGludG8gdGhlIGdpdmVuIHtAbGluayBBbmltYXRpb259LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRBbmltYXRpb248VCBleHRlbmRzIEFuaW1hdGlvbj4oX2lBbmltYXRpb246IG51bWJlciB8IHN0cmluZywgX2FuaW1hdGlvbjogVCk6IFByb21pc2U8VD47XHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0QW5pbWF0aW9uKF9pQW5pbWF0aW9uOiBudW1iZXIgfCBzdHJpbmcsIF9hbmltYXRpb24/OiBBbmltYXRpb24pOiBQcm9taXNlPEFuaW1hdGlvbj4ge1xyXG4gICAgICBfaUFuaW1hdGlvbiA9IHRoaXMuZ2V0SW5kZXgoX2lBbmltYXRpb24sIHRoaXMuI2dsdGYuYW5pbWF0aW9ucyk7XHJcblxyXG4gICAgICBpZiAoX2lBbmltYXRpb24gPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7QW5pbWF0aW9uLm5hbWV9fCR7X2lBbmltYXRpb259YDtcclxuXHJcbiAgICAgIGlmICghX2FuaW1hdGlvbiAmJiB0aGlzLiNyZXNvdXJjZXNbaWRdKVxyXG4gICAgICAgIHJldHVybiA8QW5pbWF0aW9uPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICBjb25zdCBnbHRmQW5pbWF0aW9uOiBHTFRGLkFuaW1hdGlvbiA9IHRoaXMuI2dsdGYuYW5pbWF0aW9ucz8uW19pQW5pbWF0aW9uXTtcclxuXHJcbiAgICAgIGlmICghZ2x0ZkFuaW1hdGlvbilcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgYW5pbWF0aW9uIHdpdGggaW5kZXggJHtfaUFuaW1hdGlvbn0uYCk7XHJcblxyXG4gICAgICBjb25zdCBhbmltYXRpb25TdHJ1Y3R1cmU6IEFuaW1hdGlvblN0cnVjdHVyZSA9IHt9O1xyXG4gICAgICBmb3IgKGNvbnN0IGdsdGZDaGFubmVsIG9mIGdsdGZBbmltYXRpb24uY2hhbm5lbHMpIHtcclxuICAgICAgICBjb25zdCBnbHRmTm9kZTogR0xURi5Ob2RlID0gdGhpcy4jZ2x0Zi5ub2Rlc1tnbHRmQ2hhbm5lbC50YXJnZXQubm9kZV07XHJcbiAgICAgICAgaWYgKCFnbHRmTm9kZSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBsZXQgbm9kZTogR2VuZXJhbCA9IGFuaW1hdGlvblN0cnVjdHVyZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGlOb2RlIG9mIGdsdGZOb2RlLnBhdGgpIHtcclxuICAgICAgICAgIGNvbnN0IGNoaWxkTmFtZTogc3RyaW5nID0gdGhpcy4jZ2x0Zi5ub2Rlc1tpTm9kZV0ubmFtZTtcclxuICAgICAgICAgIC8vIG5vZGUuY2hpbGRyZW5bY2hpbGROYW1lXVxyXG4gICAgICAgICAgbm9kZSA9IChub2RlLmNoaWxkcmVuID8/PSB7fSlbY2hpbGROYW1lXSA/Pz0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBub2RlLmNvbXBvbmVudHMuQ29tcG9uZW50VHJhbnNmb3JtWzBdLm10eExvY2FsXHJcbiAgICAgICAgbGV0IG10eExvY2FsOiBBbmltYXRpb25TZXF1ZW5jZU1hdHJpeDR4NCA9IDxBbmltYXRpb25TZXF1ZW5jZU1hdHJpeDR4ND4oKCgobm9kZS5jb21wb25lbnRzID8/PSB7fSkuQ29tcG9uZW50VHJhbnNmb3JtID8/PSBbXSlbMF0gPz89IHt9KS5tdHhMb2NhbCA/Pz0ge30pO1xyXG4gICAgICAgIG10eExvY2FsW3RvSW50ZXJuVHJhbnNmb3JtYXRpb25bZ2x0ZkNoYW5uZWwudGFyZ2V0LnBhdGhdXSA9XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yKGdsdGZBbmltYXRpb24uc2FtcGxlcnNbZ2x0ZkNoYW5uZWwuc2FtcGxlcl0sIGdsdGZDaGFubmVsLnRhcmdldC5wYXRoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYW5pbWF0aW9uOiBBbmltYXRpb24gPSBfYW5pbWF0aW9uID8/IG5ldyBBbmltYXRpb25HTFRGKCk7XHJcbiAgICAgIGFuaW1hdGlvbi5hbmltYXRpb25TdHJ1Y3R1cmUgPSBhbmltYXRpb25TdHJ1Y3R1cmU7XHJcbiAgICAgIGFuaW1hdGlvbi5jbGVhckNhY2hlKCk7XHJcbiAgICAgIGFuaW1hdGlvbi5uYW1lID0gZ2x0ZkFuaW1hdGlvbi5uYW1lO1xyXG4gICAgICBhbmltYXRpb24uY2FsY3VsYXRlVG90YWxUaW1lKCk7XHJcbiAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBBbmltYXRpb25HTFRGKVxyXG4gICAgICAgIGFuaW1hdGlvbi51cmwgPSB0aGlzLiN1cmw7XHJcbiAgICAgIGlmICghX2FuaW1hdGlvbikge1xyXG4gICAgICAgIFByb2plY3QuZGVyZWdpc3RlcihhbmltYXRpb24pO1xyXG4gICAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSBhbmltYXRpb247XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBhbmltYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgTWVzaEdMVEZ9IHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNZXNoKF9uYW1lOiBzdHJpbmcsIF9pUHJpbWl0aXZlPzogbnVtYmVyKTogUHJvbWlzZTxNZXNoPjtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIE1lc2hHTFRGfSBmb3IgdGhlIGdpdmVuIG1lc2ggaW5kZXggYW5kIHByaW1pdGl2ZSBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2lNZXNoOiBudW1iZXIsIF9pUHJpbWl0aXZlPzogbnVtYmVyKTogUHJvbWlzZTxNZXNoPjtcclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgYSBtZXNoIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgTWVzaH1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNZXNoPFQgZXh0ZW5kcyBNZXNoPihfaU1lc2g6IG51bWJlciB8IHN0cmluZywgX2lQcmltaXRpdmU6IG51bWJlciwgX21lc2g6IFQpOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1lc2goX2lNZXNoOiBudW1iZXIgfCBzdHJpbmcsIF9pUHJpbWl0aXZlOiBudW1iZXIgPSAwLCBfbWVzaD86IE1lc2gpOiBQcm9taXNlPE1lc2g+IHtcclxuICAgICAgX2lNZXNoID0gdGhpcy5nZXRJbmRleChfaU1lc2gsIHRoaXMuI2dsdGYubWVzaGVzKTtcclxuXHJcbiAgICAgIGlmIChfaU1lc2ggPT0gLTEpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7TWVzaEdMVEYubmFtZX18JHtfaU1lc2h9fCR7X2lQcmltaXRpdmV9YDtcclxuXHJcbiAgICAgIGlmICghX21lc2ggJiYgdGhpcy4jcmVzb3VyY2VzW2lkXSlcclxuICAgICAgICByZXR1cm4gPE1lc2hHTFRGPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICBjb25zdCBnbHRmTWVzaDogR0xURi5NZXNoID0gdGhpcy4jZ2x0Zi5tZXNoZXNbX2lNZXNoXTtcclxuICAgICAgY29uc3QgZ2x0ZlByaW1pdGl2ZTogR0xURi5NZXNoUHJpbWl0aXZlID0gZ2x0Zk1lc2gucHJpbWl0aXZlc1tfaVByaW1pdGl2ZV07XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5pbmRpY2VzID09IHVuZGVmaW5lZClcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBNZXNoIHdpdGggaW5kZXggJHtfaU1lc2h9IHByaW1pdGl2ZSAke19pUHJpbWl0aXZlfSBoYXMgbm8gaW5kaWNlcy4gRlVER0UgZG9lcyBub3Qgc3VwcG9ydCBub24taW5kZXhlZCBtZXNoZXMuYCk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlBPU0lUSU9OID09IHVuZGVmaW5lZClcclxuICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBNZXNoIHdpdGggaW5kZXggJHtfaU1lc2h9IHByaW1pdGl2ZSAke19pUHJpbWl0aXZlfSBoYXMgbm8gcG9zaXRpb24gYXR0cmlidXRlLiBQcmltaXRpdmUgd2lsbCBiZSBpZ25vcmVkLmApO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUubW9kZSAhPSB1bmRlZmluZWQgJiYgZ2x0ZlByaW1pdGl2ZS5tb2RlICE9IEdMVEYuTUVTSF9QUklNSVRJVkVfTU9ERS5UUklBTkdMRVMpXHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogTWVzaCB3aXRoIGluZGV4ICR7X2lNZXNofSBwcmltaXRpdmUgJHtfaVByaW1pdGl2ZX0gaGFzIHRvcG9sb2d5IHR5cGUgbW9kZSAke0dMVEYuTUVTSF9QUklNSVRJVkVfTU9ERVtnbHRmUHJpbWl0aXZlLm1vZGVdfS4gRlVER0Ugb25seSBzdXBwb3J0cyAke0dMVEYuTUVTSF9QUklNSVRJVkVfTU9ERVs0XX0uYCk7XHJcblxyXG4gICAgICBjaGVja01heFN1cHBvcnQodGhpcywgXCJURVhDT09SRFwiLCAyKTtcclxuICAgICAgY2hlY2tNYXhTdXBwb3J0KHRoaXMsIFwiQ09MT1JcIiwgMSk7XHJcbiAgICAgIGNoZWNrTWF4U3VwcG9ydCh0aGlzLCBcIkpPSU5UU1wiLCAxKTtcclxuICAgICAgY2hlY2tNYXhTdXBwb3J0KHRoaXMsIFwiV0VJR0hUU1wiLCAxKTtcclxuXHJcbiAgICAgIGxldCB2ZXJ0aWNlczogRmxvYXQzMkFycmF5LCBpbmRpY2VzOiBVaW50MTZBcnJheTtcclxuICAgICAgbGV0IG5vcm1hbHM6IEZsb2F0MzJBcnJheSwgdGFuZ2VudHM6IEZsb2F0MzJBcnJheTtcclxuICAgICAgbGV0IGNvbG9yczogRmxvYXQzMkFycmF5LCB0ZXh0dXJlVVZzOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAgIGxldCBib25lczogVWludDhBcnJheSwgd2VpZ2h0czogRmxvYXQzMkFycmF5O1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuaW5kaWNlcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpbmRpY2VzID0gYXdhaXQgdGhpcy5nZXRWZXJ0ZXhJbmRpY2VzKGdsdGZQcmltaXRpdmUuaW5kaWNlcyk7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICAgIGNvbnN0IHRlbXA6IG51bWJlciA9IGluZGljZXNbaSArIDJdO1xyXG4gICAgICAgICAgaW5kaWNlc1tpICsgMl0gPSBpbmRpY2VzW2kgKyAwXTtcclxuICAgICAgICAgIGluZGljZXNbaSArIDBdID0gaW5kaWNlc1tpICsgMV07XHJcbiAgICAgICAgICBpbmRpY2VzW2kgKyAxXSA9IHRlbXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IE1lc2ggd2l0aCBpbmRleCAke19pTWVzaH0gcHJpbWl0aXZlICR7X2lQcmltaXRpdmV9IGhhcyBubyBpbmRpY2VzLiBGVURHRSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1pbmRleGVkIG1lc2hlcy5gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5QT1NJVElPTiAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdmVydGljZXMgPSBhd2FpdCB0aGlzLmdldEZsb2F0MzJBcnJheShnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuUE9TSVRJT04pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogTWVzaCB3aXRoIGluZGV4ICR7X2lNZXNofSBwcmltaXRpdmUgJHtfaVByaW1pdGl2ZX0gaGFzIG5vIHBvc2l0aW9uIGF0dHJpYnV0ZS4gUHJpbWl0aXZlIHdpbGwgYmUgaWdub3JlZC5gKTtcclxuXHJcbiAgICAgIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuTk9STUFMICE9IHVuZGVmaW5lZClcclxuICAgICAgICBub3JtYWxzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLk5PUk1BTCk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRBTkdFTlQgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHRhbmdlbnRzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRBTkdFTlQpO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5URVhDT09SRF8xICE9IHVuZGVmaW5lZClcclxuICAgICAgICB0ZXh0dXJlVVZzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLlRFWENPT1JEXzEpO1xyXG4gICAgICBlbHNlIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuVEVYQ09PUkRfMCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGV4dHVyZVVWcyA9IGF3YWl0IHRoaXMuZ2V0RmxvYXQzMkFycmF5KGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5URVhDT09SRF8wKTtcclxuXHJcbiAgICAgIGlmIChnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMuQ09MT1JfMCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgY29sb3JzID0gYXdhaXQgdGhpcy5nZXRWZXJ0ZXhDb2xvcnMoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLkNPTE9SXzApO1xyXG5cclxuICAgICAgaWYgKGdsdGZQcmltaXRpdmUuYXR0cmlidXRlcy5KT0lOVFNfMCAhPSB1bmRlZmluZWQgJiYgZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLldFSUdIVFNfMCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBib25lcyA9IGF3YWl0IHRoaXMuZ2V0Qm9uZUluZGljZXMoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLkpPSU5UU18wKTtcclxuICAgICAgICB3ZWlnaHRzID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlByaW1pdGl2ZS5hdHRyaWJ1dGVzLldFSUdIVFNfMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG1lc2g6IE1lc2ggPSBfbWVzaCA/PyBuZXcgTWVzaEdMVEYoKTtcclxuICAgICAgbWVzaC5uYW1lID0gZ2x0Zk1lc2gubmFtZTtcclxuICAgICAgaWYgKG1lc2ggaW5zdGFuY2VvZiBNZXNoR0xURikge1xyXG4gICAgICAgIG1lc2guaVByaW1pdGl2ZSA9IF9pUHJpbWl0aXZlO1xyXG4gICAgICAgIG1lc2gudXJsID0gdGhpcy4jdXJsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChfbWVzaCkge1xyXG4gICAgICAgIF9tZXNoLmNsZWFyKCk7XHJcbiAgICAgICAgX21lc2guZmFjZXMgPSBbXTtcclxuICAgICAgICBfbWVzaC52ZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gQ3JlYXRlIG1lc2ggdmVydGljZXMgYW5kIGZhY2VzIHNvIHRoYXQgbm9ybWFscyBhbmQgdGFuZ2VudHMgY2FuIGJlIGNhbGN1bGF0ZWQgaWYgbWlzc2luZy4gSWYgdGhleSBhcmUgbm90IG1pc3NpbmcgdGhpcyBjb3VsZCBiZSBvbWl0dGVkLlxyXG4gICAgICBmb3IgKGxldCBpVmVjdG9yMjogbnVtYmVyID0gMCwgaVZlY3RvcjM6IG51bWJlciA9IDAsIGlWZWN0b3I0OiBudW1iZXIgPSAwOyBpVmVjdG9yMyA8IHZlcnRpY2VzPy5sZW5ndGg7IGlWZWN0b3IyICs9IDIsIGlWZWN0b3IzICs9IDMsIGlWZWN0b3I0ICs9IDQpIHtcclxuICAgICAgICBtZXNoLnZlcnRpY2VzLnB1c2goXHJcbiAgICAgICAgICBuZXcgVmVydGV4KFxyXG4gICAgICAgICAgICBuZXcgVmVjdG9yMyh2ZXJ0aWNlc1tpVmVjdG9yMyArIDBdLCB2ZXJ0aWNlc1tpVmVjdG9yMyArIDFdLCB2ZXJ0aWNlc1tpVmVjdG9yMyArIDJdKSxcclxuICAgICAgICAgICAgdGV4dHVyZVVWcyA/XHJcbiAgICAgICAgICAgICAgbmV3IFZlY3RvcjIodGV4dHVyZVVWc1tpVmVjdG9yMiArIDBdLCB0ZXh0dXJlVVZzW2lWZWN0b3IyICsgMV0pIDpcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIG5vcm1hbHMgP1xyXG4gICAgICAgICAgICAgIG5ldyBWZWN0b3IzKG5vcm1hbHNbaVZlY3RvcjMgKyAwXSwgbm9ybWFsc1tpVmVjdG9yMyArIDFdLCBub3JtYWxzW2lWZWN0b3IzICsgMl0pIDpcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRhbmdlbnRzID9cclxuICAgICAgICAgICAgICBuZXcgVmVjdG9yNCh0YW5nZW50c1tpVmVjdG9yNCArIDBdLCB0YW5nZW50c1tpVmVjdG9yNCArIDFdLCB0YW5nZW50c1tpVmVjdG9yNCArIDJdLCB0YW5nZW50c1tpVmVjdG9yNCArIDNdKSA6XHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBjb2xvcnMgP1xyXG4gICAgICAgICAgICAgIG5ldyBDb2xvcihjb2xvcnNbaVZlY3RvcjQgKyAwXSwgY29sb3JzW2lWZWN0b3I0ICsgMV0sIGNvbG9yc1tpVmVjdG9yNCArIDJdLCBjb2xvcnNbaVZlY3RvcjQgKyAzXSkgOlxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgYm9uZXMgJiYgd2VpZ2h0cyA/XHJcbiAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgeyBpbmRleDogYm9uZXNbaVZlY3RvcjQgKyAwXSwgd2VpZ2h0OiB3ZWlnaHRzW2lWZWN0b3I0ICsgMF0gfSxcclxuICAgICAgICAgICAgICAgIHsgaW5kZXg6IGJvbmVzW2lWZWN0b3I0ICsgMV0sIHdlaWdodDogd2VpZ2h0c1tpVmVjdG9yNCArIDFdIH0sXHJcbiAgICAgICAgICAgICAgICB7IGluZGV4OiBib25lc1tpVmVjdG9yNCArIDJdLCB3ZWlnaHQ6IHdlaWdodHNbaVZlY3RvcjQgKyAyXSB9LFxyXG4gICAgICAgICAgICAgICAgeyBpbmRleDogYm9uZXNbaVZlY3RvcjQgKyAzXSwgd2VpZ2h0OiB3ZWlnaHRzW2lWZWN0b3I0ICsgM10gfVxyXG4gICAgICAgICAgICAgIF0gOlxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGlGYWNlVmVydGV4SW5kZXg6IG51bWJlciA9IDA7IGlGYWNlVmVydGV4SW5kZXggPCBpbmRpY2VzPy5sZW5ndGg7IGlGYWNlVmVydGV4SW5kZXggKz0gMykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBtZXNoLmZhY2VzLnB1c2gobmV3IEZhY2UoXHJcbiAgICAgICAgICAgIG1lc2gudmVydGljZXMsXHJcbiAgICAgICAgICAgIGluZGljZXNbaUZhY2VWZXJ0ZXhJbmRleCArIDBdLFxyXG4gICAgICAgICAgICBpbmRpY2VzW2lGYWNlVmVydGV4SW5kZXggKyAxXSxcclxuICAgICAgICAgICAgaW5kaWNlc1tpRmFjZVZlcnRleEluZGV4ICsgMl1cclxuICAgICAgICAgICkpO1xyXG4gICAgICAgIH0gY2F0Y2ggKF9lOiB1bmtub3duKSB7XHJcbiAgICAgICAgICBEZWJ1Zy5mdWRnZShcIkZhY2UgZXhjbHVkZWRcIiwgKDxFcnJvcj5fZSkubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLnZlcnRpY2VzID0gdmVydGljZXM7XHJcbiAgICAgIG1lc2gucmVuZGVyTWVzaC5pbmRpY2VzID0gaW5kaWNlcztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLm5vcm1hbHMgPSBub3JtYWxzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2gudGFuZ2VudHMgPSB0YW5nZW50cztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLnRleHR1cmVVVnMgPSB0ZXh0dXJlVVZzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2guY29sb3JzID0gY29sb3JzO1xyXG4gICAgICBtZXNoLnJlbmRlck1lc2guYm9uZXMgPSBib25lcztcclxuICAgICAgbWVzaC5yZW5kZXJNZXNoLndlaWdodHMgPSB3ZWlnaHRzO1xyXG5cclxuICAgICAgaWYgKCFfbWVzaCkge1xyXG4gICAgICAgIFByb2plY3QuZGVyZWdpc3RlcihtZXNoKTtcclxuICAgICAgICAvLyBtZXNoLmlkUmVzb3VyY2UgPSBpZDtcclxuICAgICAgICB0aGlzLiNyZXNvdXJjZXNbaWRdID0gbWVzaDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG1lc2g7XHJcblxyXG4gICAgICBmdW5jdGlvbiBjaGVja01heFN1cHBvcnQoX2xvYWRlcjogR0xURkxvYWRlciwgX2NoZWNrOiBzdHJpbmcsIF9tYXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhnbHRmUHJpbWl0aXZlLmF0dHJpYnV0ZXMpLmZpbHRlcigoX2tleTogc3RyaW5nKSA9PiBfa2V5LnN0YXJ0c1dpdGgoX2NoZWNrKSkubGVuZ3RoID4gX21heClcclxuICAgICAgICAgIERlYnVnLndhcm4oYCR7X2xvYWRlcn06IE1lc2ggd2l0aCBpbmRleCAke19pTWVzaH0gcHJpbWl0aXZlICR7X2lQcmltaXRpdmV9IGhhcyBtb3JlIHRoYW4gJHtfbWF4fSBzZXRzIG9mICcke19jaGVja30nIGFzc29jaWF0ZWQgd2l0aCBpdC4gRlVHREUgb25seSBzdXBwb3J0cyB1cCB0byAke19tYXh9ICR7X2NoZWNrfSBzZXRzIHBlciBwcmltaXRpdmUuYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHtAbGluayBNYXRlcmlhbEdMVEZ9IHdpdGggdGhlIGdpdmVuIG1hdGVyaWFsIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNYXRlcmlhbChfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxNYXRlcmlhbD47XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBNYXRlcmlhbH0gZm9yIHRoZSBnaXZlbiBtYXRlcmlhbCBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1hdGVyaWFsKF9pTWF0ZXJpYWw6IG51bWJlcik6IFByb21pc2U8TWF0ZXJpYWw+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIG1hdGVyaWFsIGZyb20gdGhlIGdsVEYgZmlsZSBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgTWF0ZXJpYWx9LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRNYXRlcmlhbDxUIGV4dGVuZHMgTWF0ZXJpYWw+KF9pTWF0ZXJpYWw6IG51bWJlciB8IHN0cmluZywgX21hdGVyaWFsPzogVCwgX3NraW4/OiBib29sZWFuLCBfZmxhdD86IGJvb2xlYW4pOiBQcm9taXNlPFQ+O1xyXG4gICAgcHVibGljIGFzeW5jIGdldE1hdGVyaWFsKF9pTWF0ZXJpYWw6IG51bWJlciB8IHN0cmluZywgX21hdGVyaWFsPzogTWF0ZXJpYWwsIF9za2luOiBib29sZWFuID0gZmFsc2UsIF9mbGF0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPE1hdGVyaWFsPiB7XHJcbiAgICAgIF9pTWF0ZXJpYWwgPSB0aGlzLmdldEluZGV4KF9pTWF0ZXJpYWwsIHRoaXMuI2dsdGYubWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIGlmIChfaU1hdGVyaWFsID09IC0xKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgY29uc3QgaWQ6IHN0cmluZyA9IGAke01hdGVyaWFsLm5hbWV9fCR7X2lNYXRlcmlhbH1gO1xyXG5cclxuICAgICAgaWYgKHRoaXMuI3Jlc291cmNlc1tpZF0gJiYgIV9tYXRlcmlhbClcclxuICAgICAgICByZXR1cm4gPE1hdGVyaWFsPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICAvLyBUT0RPOiBpbiB0aGUgZnV0dXJlIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSBzaGFkZXIgYmFzZWQgb24gdGhlIGdsVEYgbWF0ZXJpYWwgcHJvcGVydGllc1xyXG4gICAgICBjb25zdCBnbHRmTWF0ZXJpYWw6IEdMVEYuTWF0ZXJpYWwgPSB0aGlzLiNnbHRmLm1hdGVyaWFsc1tfaU1hdGVyaWFsXTtcclxuXHJcbiAgICAgIGlmICghZ2x0Zk1hdGVyaWFsKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBtYXRlcmlhbCB3aXRoIGluZGV4ICR7X2lNYXRlcmlhbH0uYCk7XHJcblxyXG4gICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3Igb3RoZXIgZ2xURiBtYXRlcmlhbCBwcm9wZXJ0aWVzOiBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjcmVmZXJlbmNlLW1hdGVyaWFsXHJcbiAgICAgIC8vIGUuZy4gb2NjbHVzaW9uIGFuZCBlbWlzc2l2ZSB0ZXh0dXJlczsgZG91YmxlU2lkZWRcclxuICAgICAgY29uc3QgZ2x0ZkJhc2VDb2xvckZhY3RvcjogbnVtYmVyW10gPSBnbHRmTWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3M/LmJhc2VDb2xvckZhY3RvciA/PyBbMSwgMSwgMSwgMV07XHJcbiAgICAgIGNvbnN0IGdsdGZNZXRhbGxpY0ZhY3RvcjogbnVtYmVyID0gZ2x0Zk1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzPy5tZXRhbGxpY0ZhY3RvciA/PyAxO1xyXG4gICAgICBjb25zdCBnbHRmUm91Z2huZXNzRmFjdG9yOiBudW1iZXIgPSBnbHRmTWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3M/LnJvdWdobmVzc0ZhY3RvciA/PyAxO1xyXG4gICAgICBjb25zdCBnbHRmRW1pc3NpdmVGYWN0b3I6IG51bWJlcltdID0gZ2x0Zk1hdGVyaWFsLmVtaXNzaXZlRmFjdG9yID8/IFswLCAwLCAwXTtcclxuXHJcbiAgICAgIC8vIGNvbnN0IGdsdGZNZXRhbGxpY1JvdWdobmVzc1RleHR1cmU6IEdMVEYuVGV4dHVyZUluZm8gPSBnbHRmTWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3M/Lm1ldGFsbGljUm91Z2huZXNzVGV4dHVyZTtcclxuICAgICAgLy8gaWYgKGdsdGZNZXRhbGxpY1JvdWdobmVzc1RleHR1cmUpIHtcclxuICAgICAgLy8gICAvLyBUT0RPOiBtYXliZSB0aHJvdyB0aGlzIG91dCBpZiBpdCBjb3N0cyB0b28gbXVjaCBwZXJmb3JtYW5jZSwgb3IgYWRkIHRoZSB0ZXh0dXJlIHRvIHRoZSBtYXRlcmlhbFxyXG4gICAgICAvLyAgIC8vIGF2ZXJhZ2UgbWV0YWxsaWMgYW5kIHJvdWdobmVzcyB2YWx1ZXNcclxuICAgICAgLy8gICBjb25zdCBtZXRhbGxpY1JvdWdobmVzc1RleHR1cmU6IFRleHR1cmVJbWFnZSA9IGF3YWl0IHRoaXMuZ2V0VGV4dHVyZShnbHRmTWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlLmluZGV4KSBhcyBUZXh0dXJlSW1hZ2U7XHJcbiAgICAgIC8vICAgbGV0IGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50ID0gbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlLmltYWdlO1xyXG4gICAgICAvLyAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgLy8gICBjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcclxuICAgICAgLy8gICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xyXG4gICAgICAvLyAgIGxldCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgIC8vICAgY3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7XHJcbiAgICAgIC8vICAgbGV0IGltYWdlRGF0YTogSW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0KTtcclxuICAgICAgLy8gICBsZXQgZGF0YTogVWludDhDbGFtcGVkQXJyYXkgPSBpbWFnZURhdGEuZGF0YTtcclxuXHJcbiAgICAgIC8vICAgbGV0IHN1bU1ldGFsbGljOiBudW1iZXIgPSAwO1xyXG4gICAgICAvLyAgIGxldCBzdW1Sb3VnaG5lc3M6IG51bWJlciA9IDA7XHJcbiAgICAgIC8vICAgZm9yIChsZXQgaVBpeGVsOiBudW1iZXIgPSAwOyBpUGl4ZWwgPCBkYXRhLmxlbmd0aDsgaVBpeGVsICs9IDQpIHtcclxuICAgICAgLy8gICAgIHN1bU1ldGFsbGljICs9IGRhdGFbaVBpeGVsICsgMl0gLyAyNTU7XHJcbiAgICAgIC8vICAgICBzdW1Sb3VnaG5lc3MgKz0gZGF0YVtpUGl4ZWwgKyAxXSAvIDI1NTtcclxuICAgICAgLy8gICB9XHJcblxyXG4gICAgICAvLyAgIGNvbnN0IGF2ZXJhZ2VNZXRhbGxpYzogbnVtYmVyID0gc3VtTWV0YWxsaWMgLyAoZGF0YS5sZW5ndGggLyA0KTtcclxuICAgICAgLy8gICBjb25zdCBhdmVyYWdlUm91Z2huZXNzOiBudW1iZXIgPSBzdW1Sb3VnaG5lc3MgLyAoZGF0YS5sZW5ndGggLyA0KTtcclxuXHJcbiAgICAgIC8vICAgZ2x0Zk1ldGFsbGljRmFjdG9yICo9IGF2ZXJhZ2VNZXRhbGxpYztcclxuICAgICAgLy8gICBnbHRmUm91Z2huZXNzRmFjdG9yICo9IGF2ZXJhZ2VSb3VnaG5lc3M7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGNvbnN0IGdsdGZCYXNlQ29sb3JUZXh0dXJlOiBHTFRGLlRleHR1cmVJbmZvID0gZ2x0Zk1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzPy5iYXNlQ29sb3JUZXh0dXJlO1xyXG4gICAgICBjb25zdCBnbHRmTm9ybWFsVGV4dHVyZTogR0xURi5NYXRlcmlhbE5vcm1hbFRleHR1cmVJbmZvID0gZ2x0Zk1hdGVyaWFsLm5vcm1hbFRleHR1cmU7XHJcblxyXG4gICAgICAvLyBUaGUgZGlmZnVzZSBjb250cmlidXRpb24gaW4gdGhlIFBob25nIHNoYWRpbmcgbW9kZWwuIFJlcHJlc2VudHMgaG93IG11Y2ggbGlnaHQgaXMgc2NhdHRlcmVkIGluIGRpZmZlcmVudCBkaXJlY3Rpb25zIGR1ZSB0byB0aGUgbWF0ZXJpYWwncyBzdXJmYWNlIHByb3BlcnRpZXMuXHJcbiAgICAgIGNvbnN0IGRpZmZ1c2U6IG51bWJlciA9IDE7XHJcbiAgICAgIC8vIFRoZSBzaGluaW5lc3Mgb2YgdGhlIG1hdGVyaWFsLiBJbmZsdWVuY2VzIHRoZSBzaGFycG5lc3Mgb3IgYnJvYWRuZXNzIG9mIHRoZSBzcGVjdWxhciBoaWdobGlnaHQuIEhpZ2hlciBzcGVjdWxhciB2YWx1ZXMgcmVzdWx0IGluIGEgc2hhcnBlciBhbmQgbW9yZSBjb25jZW50cmF0ZWQgc3BlY3VsYXIgaGlnaGxpZ2h0LlxyXG4gICAgICBjb25zdCBzcGVjdWxhcjogbnVtYmVyID0gMS44ICogKDEgLSBnbHRmUm91Z2huZXNzRmFjdG9yKSArIDAuNiAqIGdsdGZNZXRhbGxpY0ZhY3RvcjtcclxuICAgICAgLy8gVGhlIHN0cmVuZ3RoL2ludGVuc2l0eSBvZiB0aGUgc3BlY3VsYXIgcmVmbGVjdGlvblxyXG4gICAgICBjb25zdCBpbnRlbnNpdHk6IG51bWJlciA9IDAuNyAqICgxIC0gZ2x0ZlJvdWdobmVzc0ZhY3RvcikgKyBnbHRmTWV0YWxsaWNGYWN0b3I7XHJcbiAgICAgIC8vIEluZmx1ZW5jZXMgaG93IG11Y2ggdGhlIG1hdGVyaWFsJ3MgY29sb3IgYWZmZWN0cyB0aGUgc3BlY3VsYXIgcmVmbGVjdGlvbi4gV2hlbiBtZXRhbGxpYyBpcyBoaWdoZXIsIHRoZSBzcGVjdWxhciByZWZsZWN0aW9uIHRha2VzIG9uIHRoZSBjb2xvciBvZiB0aGUgbWF0ZXJpYWwsIGNyZWF0aW5nIGEgbWV0YWxsaWMgYXBwZWFyYW5jZS4gUmFuZ2UgZnJvbSAwLjAgdG8gMS4wLlxyXG4gICAgICBjb25zdCBtZXRhbGxpYzogbnVtYmVyID0gZ2x0Zk1ldGFsbGljRmFjdG9yO1xyXG5cclxuICAgICAgY29uc3QgaXNMaXQ6IGJvb2xlYW4gPSBnbHRmRW1pc3NpdmVGYWN0b3JbMF0gPT0gMSAmJiBnbHRmRW1pc3NpdmVGYWN0b3JbMV0gPT0gMSB8fCBnbHRmRW1pc3NpdmVGYWN0b3JbMl0gPT0gMTtcclxuICAgICAgY29uc3QgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKC4uLmdsdGZCYXNlQ29sb3JGYWN0b3IpO1xyXG4gICAgICBjb25zdCBjb2F0OiBDb2F0ID0gZ2x0ZkJhc2VDb2xvclRleHR1cmUgP1xyXG4gICAgICAgIGlzTGl0ID8gbmV3IENvYXRUZXh0dXJlZChjb2xvciwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZCYXNlQ29sb3JUZXh0dXJlLmluZGV4KSkgOlxyXG4gICAgICAgICAgZ2x0Zk5vcm1hbFRleHR1cmUgP1xyXG4gICAgICAgICAgICBuZXcgQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFscyhjb2xvciwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZCYXNlQ29sb3JUZXh0dXJlLmluZGV4KSwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZOb3JtYWxUZXh0dXJlLmluZGV4KSwgZGlmZnVzZSwgc3BlY3VsYXIsIGludGVuc2l0eSwgbWV0YWxsaWMpIDpcclxuICAgICAgICAgICAgbmV3IENvYXRSZW1pc3NpdmVUZXh0dXJlZChjb2xvciwgYXdhaXQgdGhpcy5nZXRUZXh0dXJlKGdsdGZCYXNlQ29sb3JUZXh0dXJlLmluZGV4KSwgZGlmZnVzZSwgc3BlY3VsYXIsIGludGVuc2l0eSwgbWV0YWxsaWMpIDpcclxuICAgICAgICBpc0xpdCA/IG5ldyBDb2F0Q29sb3JlZChjb2xvcikgOiBuZXcgQ29hdFJlbWlzc2l2ZShjb2xvciwgZGlmZnVzZSwgc3BlY3VsYXIsIGludGVuc2l0eSwgbWV0YWxsaWMpO1xyXG5cclxuICAgICAgbGV0IHNoYWRlcjogdHlwZW9mIFNoYWRlcjtcclxuICAgICAgaWYgKF9mbGF0KSB7IC8vIFRPRE86IG1ha2UgZmxhdCBhIGZsYWcgaW4gdGhlIG1hdGVyaWFsIHNvIHRoYXQgd2UgY2FuIGhhdmUgZmxhdCBtZXNoIHdpdGggcGhvbmcgc2hhZGluZyBncmFkaWVudHNcclxuICAgICAgICBzaGFkZXIgPSBnbHRmQmFzZUNvbG9yVGV4dHVyZSA/XHJcbiAgICAgICAgICAoX3NraW4gPyBTaGFkZXJGbGF0VGV4dHVyZWRTa2luIDogU2hhZGVyRmxhdFRleHR1cmVkKSA6XHJcbiAgICAgICAgICAoX3NraW4gPyBTaGFkZXJGbGF0U2tpbiA6IFNoYWRlckZsYXQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzTGl0KSB7XHJcbiAgICAgICAgc2hhZGVyID0gZ2x0ZkJhc2VDb2xvclRleHR1cmUgP1xyXG4gICAgICAgICAgKF9za2luID8gU2hhZGVyTGl0VGV4dHVyZWRTa2luIDogU2hhZGVyTGl0VGV4dHVyZWQpIDpcclxuICAgICAgICAgIChfc2tpbiA/IFNoYWRlckxpdFNraW4gOiBTaGFkZXJMaXQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNoYWRlciA9IGdsdGZCYXNlQ29sb3JUZXh0dXJlID9cclxuICAgICAgICAgIGdsdGZOb3JtYWxUZXh0dXJlID9cclxuICAgICAgICAgICAgKF9za2luID8gU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHNTa2luIDogU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHMpIDpcclxuICAgICAgICAgICAgKF9za2luID8gU2hhZGVyUGhvbmdUZXh0dXJlZFNraW4gOiBTaGFkZXJQaG9uZ1RleHR1cmVkKSA6XHJcbiAgICAgICAgICAoX3NraW4gPyBTaGFkZXJQaG9uZ1NraW4gOiBTaGFkZXJQaG9uZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IF9tYXRlcmlhbCA/PyBuZXcgTWF0ZXJpYWxHTFRGKGdsdGZNYXRlcmlhbC5uYW1lKTtcclxuICAgICAgbWF0ZXJpYWwubmFtZSA9IGdsdGZNYXRlcmlhbC5uYW1lO1xyXG4gICAgICBtYXRlcmlhbC5jb2F0ID0gY29hdDtcclxuICAgICAgaWYgKGdsdGZNYXRlcmlhbC5hbHBoYUNsaXAgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIG1hdGVyaWFsLmFscGhhQ2xpcCA9IGdsdGZNYXRlcmlhbC5hbHBoYUNsaXA7XHJcbiAgICAgIFJlZmxlY3Quc2V0KG1hdGVyaWFsLCBcInNoYWRlclR5cGVcIiwgc2hhZGVyKTtcclxuICAgICAgLy8gbWF0ZXJpYWwuc2V0U2hhZGVyKHNoYWRlcik7XHJcbiAgICAgIGlmIChtYXRlcmlhbCBpbnN0YW5jZW9mIE1hdGVyaWFsR0xURilcclxuICAgICAgICBtYXRlcmlhbC51cmwgPSB0aGlzLiN1cmw7XHJcblxyXG4gICAgICBpZiAoIV9tYXRlcmlhbCkge1xyXG4gICAgICAgIFByb2plY3QuZGVyZWdpc3RlcihtYXRlcmlhbCk7XHJcbiAgICAgICAgdGhpcy4jcmVzb3VyY2VzW2lkXSA9IG1hdGVyaWFsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbWF0ZXJpYWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGV4dHVyZX0gZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIGluZGV4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0VGV4dHVyZShfaVRleHR1cmU6IG51bWJlcik6IFByb21pc2U8VGV4dHVyZT4ge1xyXG4gICAgICBjb25zdCBpZDogc3RyaW5nID0gYCR7VGV4dHVyZS5uYW1lfXwke19pVGV4dHVyZX1gO1xyXG5cclxuICAgICAgaWYgKHRoaXMuI3Jlc291cmNlc1tpZF0pXHJcbiAgICAgICAgcmV0dXJuIDxUZXh0dXJlPnRoaXMuI3Jlc291cmNlc1tpZF07XHJcblxyXG4gICAgICBjb25zdCBnbHRmVGV4dHVyZTogR0xURi5UZXh0dXJlID0gdGhpcy4jZ2x0Zi50ZXh0dXJlc1tfaVRleHR1cmVdO1xyXG4gICAgICBjb25zdCBnbHRmU2FtcGxlcjogR0xURi5TYW1wbGVyID0gdGhpcy4jZ2x0Zi5zYW1wbGVycz8uW2dsdGZUZXh0dXJlLnNhbXBsZXJdO1xyXG4gICAgICBjb25zdCBnbHRmSW1hZ2U6IEdMVEYuSW1hZ2UgPSB0aGlzLiNnbHRmLmltYWdlcz8uW2dsdGZUZXh0dXJlLnNvdXJjZV07XHJcblxyXG4gICAgICBpZiAoZ2x0ZkltYWdlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIERlYnVnLndhcm4oYCR7dGhpc306IFRleHR1cmUgd2l0aCBpbmRleCAke19pVGV4dHVyZX0gaGFzIG5vIGltYWdlLmApO1xyXG4gICAgICAgIHJldHVybiBUZXh0dXJlRGVmYXVsdC5jb2xvcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHVybDogc3RyaW5nID0gbmV3IFVSTChnbHRmSW1hZ2UudXJpLCBuZXcgVVJMKHRoaXMuI3VybCwgUHJvamVjdC5iYXNlVVJMKSkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgIGlmICghZ2x0ZkltYWdlLnVyaSAmJiBnbHRmSW1hZ2UuYnVmZmVyVmlldykge1xyXG4gICAgICAgIC8vIFRPRE86IHRoaXMgaXMgZHVwbGljYXRlIGNvZGUgZnJvbSBnZXRCdWZmZXJEYXRhLCBtYXliZSByZWZhY3RvciBnZXRCdWZmZXJEYXRhIHRvIGhhbmRsZSBidWZmZXJWaWV3SW5kZXggaW5wdXRcclxuICAgICAgICBjb25zdCBnbHRmQnVmZmVyVmlldzogR0xURi5CdWZmZXJWaWV3ID0gdGhpcy4jZ2x0Zi5idWZmZXJWaWV3c1tnbHRmSW1hZ2UuYnVmZmVyVmlld107XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1ZmZlcjogQXJyYXlCdWZmZXIgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlcihnbHRmQnVmZmVyVmlldy5idWZmZXIpO1xyXG4gICAgICAgIGNvbnN0IGJ5dGVPZmZzZXQ6IG51bWJlciA9IGdsdGZCdWZmZXJWaWV3LmJ5dGVPZmZzZXQgfHwgMDtcclxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoOiBudW1iZXIgPSBnbHRmQnVmZmVyVmlldy5ieXRlTGVuZ3RoIHx8IDA7XHJcblxyXG4gICAgICAgIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoXHJcbiAgICAgICAgICBbbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoIC8gVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCldLFxyXG4gICAgICAgICAgeyB0eXBlOiBnbHRmSW1hZ2UubWltZVR5cGUgfVxyXG4gICAgICAgICkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB0ZXh0dXJlOiBUZXh0dXJlSW1hZ2UgPSBuZXcgVGV4dHVyZUltYWdlKCk7XHJcbiAgICAgIGF3YWl0IHRleHR1cmUubG9hZCh1cmwpO1xyXG5cclxuICAgICAgaWYgKGdsdGZTYW1wbGVyKSB7XHJcbiAgICAgICAgZ2x0ZlNhbXBsZXIubWFnRmlsdGVyID0gZ2x0ZlNhbXBsZXIubWFnRmlsdGVyID8/IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVDsgLy8gZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGdsdGZTYW1wbGVyLm1pbkZpbHRlciA9IGdsdGZTYW1wbGVyLm1pbkZpbHRlciA/PyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1Q7IC8vIGRlZmF1bHQgdmFsdWVcclxuXHJcbiAgICAgICAgaWYgKGdsdGZTYW1wbGVyLm1hZ0ZpbHRlciA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QgJiYgZ2x0ZlNhbXBsZXIubWluRmlsdGVyID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVClcclxuICAgICAgICAgIHRleHR1cmUubWlwbWFwID0gTUlQTUFQLkNSSVNQO1xyXG4gICAgICAgIGVsc2UgaWYgKGdsdGZTYW1wbGVyLm1hZ0ZpbHRlciA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0Lk5FQVJFU1QgJiYgZ2x0ZlNhbXBsZXIubWluRmlsdGVyID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuTkVBUkVTVF9NSVBNQVBfTElORUFSKVxyXG4gICAgICAgICAgdGV4dHVyZS5taXBtYXAgPSBNSVBNQVAuTUVESVVNO1xyXG4gICAgICAgIGVsc2UgaWYgKGdsdGZTYW1wbGVyLm1hZ0ZpbHRlciA9PSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LkxJTkVBUiAmJiBnbHRmU2FtcGxlci5taW5GaWx0ZXIgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5MSU5FQVJfTUlQTUFQX0xJTkVBUilcclxuICAgICAgICAgIHRleHR1cmUubWlwbWFwID0gTUlQTUFQLkJMVVJSWTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBUZXh0dXJlIHdpdGggaW5kZXggJHtfaVRleHR1cmV9IGhhcyBhIG1hZ0ZpbHRlciBhbmQgbWluRmlsdGVyIG9mICcke2dldFdlYkdMUGFyYW1ldGVyTmFtZShnbHRmU2FtcGxlci5tYWdGaWx0ZXIpfScgYW5kICcke2dldFdlYkdMUGFyYW1ldGVyTmFtZShnbHRmU2FtcGxlci5taW5GaWx0ZXIpfScgcmVzcGVjdGl2ZWx5LiBGVURHRSBvbmx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOiBORUFSRVNUIGFuZCBORUFSRVNUIHwgTkVBUkVTVCBhbmQgTkVBUkVTVF9NSVBNQVBfTElORUFSIHwgTElORUFSIGFuZCBMSU5FQVJfTUlQTUFQX0xJTkVBUi5gKTtcclxuXHJcbiAgICAgICAgZ2x0ZlNhbXBsZXIud3JhcFMgPSBnbHRmU2FtcGxlci53cmFwUyA/PyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LlJFUEVBVDsgLy8gZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGdsdGZTYW1wbGVyLndyYXBUID0gZ2x0ZlNhbXBsZXIud3JhcFQgPz8gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5SRVBFQVQ7IC8vIGRlZmF1bHQgdmFsdWVcclxuXHJcbiAgICAgICAgaWYgKGdsdGZTYW1wbGVyLndyYXBTID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVQRUFUICYmIGdsdGZTYW1wbGVyLndyYXBUID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuUkVQRUFUKVxyXG4gICAgICAgICAgdGV4dHVyZS53cmFwID0gV1JBUC5SRVBFQVQ7XHJcbiAgICAgICAgZWxzZSBpZiAoZ2x0ZlNhbXBsZXIud3JhcFMgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5DTEFNUF9UT19FREdFICYmIGdsdGZTYW1wbGVyLndyYXBUID09IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQuQ0xBTVBfVE9fRURHRSlcclxuICAgICAgICAgIHRleHR1cmUud3JhcCA9IFdSQVAuQ0xBTVA7XHJcbiAgICAgICAgZWxzZSBpZiAoZ2x0ZlNhbXBsZXIud3JhcFMgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5NSVJST1JFRF9SRVBFQVQgJiYgZ2x0ZlNhbXBsZXIud3JhcFQgPT0gV2ViR0wyUmVuZGVyaW5nQ29udGV4dC5NSVJST1JFRF9SRVBFQVQpXHJcbiAgICAgICAgICB0ZXh0dXJlLndyYXAgPSBXUkFQLk1JUlJPUjtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBEZWJ1Zy53YXJuKGAke3RoaXN9OiBUZXh0dXJlIHdpdGggaW5kZXggJHtfaVRleHR1cmV9IGhhcyBhIHdyYXBTIGFuZCB3cmFwVCBvZiAnJHtnZXRXZWJHTFBhcmFtZXRlck5hbWUoZ2x0ZlNhbXBsZXIud3JhcFMpfScgYW5kICcke2dldFdlYkdMUGFyYW1ldGVyTmFtZShnbHRmU2FtcGxlci53cmFwVCl9JyByZXNwZWN0aXZlbHkuIEZVREdFIG9ubHkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb21iaW5hdGlvbnM6IFJFUEVBVCBhbmQgUkVQRUFUIHwgQ0xBTVBfVE9fRURHRSBhbmQgQ0xBTVBfVE9fRURHRSB8IE1JUlJPUkVEX1JFUEVBVCBhbmQgTUlSUk9SRURfUkVQRUFULmApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBQcm9qZWN0LmRlcmVnaXN0ZXIodGV4dHVyZSk7XHJcbiAgICAgIHRoaXMuI3Jlc291cmNlc1tpZF0gPSB0ZXh0dXJlO1xyXG5cclxuICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFJldHVybnMgdGhlIGZpcnN0IHtAbGluayBDb21wb25lbnRTa2VsZXRvbn0gd2l0aCB0aGUgZ2l2ZW4gc2tlbGV0b24gbmFtZS5cclxuICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2tlbGV0b24oX25hbWU6IHN0cmluZyk6IFByb21pc2U8Q29tcG9uZW50U2tlbGV0b24+IHtcclxuICAgICAgY29uc3QgaVNrZWxldG9uOiBudW1iZXIgPSB0aGlzLiNnbHRmLnNraW5zLmZpbmRJbmRleChfc2tlbGV0b24gPT4gX3NrZWxldG9uLm5hbWUgPT0gX25hbWUpO1xyXG4gICAgICBpZiAoaVNrZWxldG9uID09IC0xKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBuYW1lICcke19uYW1lfScgaW4gZ2xURiBza2lucy5gKTtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U2tlbGV0b25CeUluZGV4KGlTa2VsZXRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29tcG9uZW50U2tlbGV0b259IGZvciB0aGUgZ2l2ZW4gc2tlbGV0b24gaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBnZXRTa2VsZXRvbkJ5SW5kZXgoX2lTa2VsZXRvbjogbnVtYmVyKTogUHJvbWlzZTxDb21wb25lbnRTa2VsZXRvbj4ge1xyXG4gICAgICBpZiAoIXRoaXMuI3NrZWxldG9ucylcclxuICAgICAgICB0aGlzLiNza2VsZXRvbnMgPSBbXTtcclxuICAgICAgaWYgKCF0aGlzLiNza2VsZXRvbnNbX2lTa2VsZXRvbl0pIHtcclxuICAgICAgICBjb25zdCBnbHRmU2tpbjogR0xURi5Ta2luID0gdGhpcy4jZ2x0Zi5za2luc1tfaVNrZWxldG9uXTtcclxuICAgICAgICBjb25zdCBib25lczogTm9kZVtdID0gW107XHJcblxyXG4gICAgICAgIC8vIGNvbnZlcnQgZmxvYXQgYXJyYXkgdG8gYXJyYXkgb2YgbWF0cmljZXMgYW5kIHJlZ2lzdGVyIGJvbmVzXHJcbiAgICAgICAgbGV0IG10eERhdGE6IEZsb2F0MzJBcnJheTtcclxuICAgICAgICBpZiAoZ2x0ZlNraW4uaW52ZXJzZUJpbmRNYXRyaWNlcyAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICBtdHhEYXRhID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoZ2x0ZlNraW4uaW52ZXJzZUJpbmRNYXRyaWNlcyk7XHJcbiAgICAgICAgY29uc3QgbXR4RGF0YVNwYW46IG51bWJlciA9IDE2OyAvLyBzaXplIG9mIG1hdHJpeFxyXG5cclxuICAgICAgICBjb25zdCBtdHhCaW5kSW52ZXJzZXM6IE1hdHJpeDR4NFtdID0gW107XHJcbiAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGpvaW50cyBhbmQgZ2V0IGNvcnJlc3BvbmRpbmcgbWF0cml4IGZyb20gZmxvYXQgYXJyYXlcclxuICAgICAgICBmb3IgKGxldCBpQm9uZTogbnVtYmVyID0gMDsgaUJvbmUgPCBnbHRmU2tpbi5qb2ludHMubGVuZ3RoOyBpQm9uZSsrKSB7XHJcbiAgICAgICAgICBsZXQgbXR4QmluZEludmVyc2U6IE1hdHJpeDR4NDtcclxuICAgICAgICAgIGlmIChtdHhEYXRhKSB7XHJcbiAgICAgICAgICAgIG10eEJpbmRJbnZlcnNlID0gbmV3IE1hdHJpeDR4NCgpO1xyXG4gICAgICAgICAgICBtdHhCaW5kSW52ZXJzZS5zZXQobXR4RGF0YS5zdWJhcnJheShpQm9uZSAqIG10eERhdGFTcGFuLCBpQm9uZSAqIG10eERhdGFTcGFuICsgbXR4RGF0YVNwYW4pKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBib25lcy5wdXNoKGF3YWl0IHRoaXMuZ2V0Tm9kZUJ5SW5kZXgoZ2x0ZlNraW4uam9pbnRzW2lCb25lXSkpO1xyXG4gICAgICAgICAgbXR4QmluZEludmVyc2VzLnB1c2gobXR4QmluZEludmVyc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy4jc2tlbGV0b25zW19pU2tlbGV0b25dID0gbmV3IENvbXBvbmVudFNrZWxldG9uKGJvbmVzLCBtdHhCaW5kSW52ZXJzZXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy4jc2tlbGV0b25zW19pU2tlbGV0b25dO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gYCR7R0xURkxvYWRlci5uYW1lfSB8ICR7dGhpcy4jdXJsfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJbmRleChfbmFtZU9ySW5kZXg6IHN0cmluZyB8IG51bWJlciwgX2FycmF5OiB7IG5hbWU/OiBzdHJpbmcgfVtdKTogbnVtYmVyIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPVxyXG4gICAgICAgIHR5cGVvZiBfbmFtZU9ySW5kZXggPT0gXCJudW1iZXJcIiA/XHJcbiAgICAgICAgICBfbmFtZU9ySW5kZXggOlxyXG4gICAgICAgICAgX2FycmF5LmZpbmRJbmRleChfb2JqZWN0ID0+IF9vYmplY3QubmFtZSA9PSBfbmFtZU9ySW5kZXgpO1xyXG4gICAgICBpZiAoaW5kZXggPT0gLTEpIHtcclxuICAgICAgICBsZXQgYXJyYXlOYW1lOiBzdHJpbmcgPSBPYmplY3QuZW50cmllcyh0aGlzLiNnbHRmKS5maW5kKChbX2tleSwgX3ZhbHVlXSkgPT4gX3ZhbHVlID09IF9hcnJheSk/LlswXTtcclxuICAgICAgICBEZWJ1Zy5lcnJvcihgJHt0aGlzfTogQ291bGRuJ3QgZmluZCBuYW1lICcke19uYW1lT3JJbmRleH0nIGluIGdsVEYgJHthcnJheU5hbWV9LmApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgVWludDhBcnJheX0gZm9yIHRoZSBnaXZlbiBhY2Nlc3NvciBpbmRleC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEJvbmVJbmRpY2VzKF9pQWNjZXNzb3I6IG51bWJlcik6IFByb21pc2U8VWludDhBcnJheT4ge1xyXG4gICAgICBjb25zdCBhcnJheTogVHlwZWRBcnJheSA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyRGF0YShfaUFjY2Vzc29yKTtcclxuICAgICAgY29uc3QgY29tcG9uZW50VHlwZTogR0xURi5DT01QT05FTlRfVFlQRSA9IHRoaXMuI2dsdGYuYWNjZXNzb3JzW19pQWNjZXNzb3JdPy5jb21wb25lbnRUeXBlO1xyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9CWVRFKVxyXG4gICAgICAgIHJldHVybiBhcnJheSBhcyBVaW50OEFycmF5O1xyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9TSE9SVCkge1xyXG4gICAgICAgIERlYnVnLmxvZyhgJHt0aGlzfTogQm9uZSBpbmRpY2VzIGFyZSBzdG9yZWQgYXMgJyR7R0xURi5DT01QT05FTlRfVFlQRVtHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUXX0nLiBGVURHRSB3aWxsIGNvbnZlcnQgdGhlbSB0byAnJHtHTFRGLkNPTVBPTkVOVF9UWVBFW0dMVEYuQ09NUE9ORU5UX1RZUEUuVU5TSUdORURfQllURV19Jy4gRlVER0Ugb25seSBzdXBwb3J0cyBza2VsZXRvbnMgd2l0aCB1cCB0byAyNTYgYm9uZXMsIHNvIG1ha2Ugc3VyZSB5b3VyIHNrZWxldG9uIGhhcyBubyBtb3JlIHRoYW4gMjU2IGJvbmVzLmApO1xyXG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYXJyYXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IEludmFsaWQgY29tcG9uZW50IHR5cGUgJyR7R0xURi5DT01QT05FTlRfVFlQRVtjb21wb25lbnRUeXBlXX0nIGZvciBib25lIGluZGljZXMuIEV4cGVjdGVkICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9CWVRFXX0nIG9yICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9TSE9SVF19Jy5gKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgRmxvYXQzMkFycmF5fSBmb3IgdGhlIGdpdmVuIGFjY2Vzc29yIGluZGV4LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0RmxvYXQzMkFycmF5KF9pQWNjZXNzb3I6IG51bWJlcik6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XHJcbiAgICAgIGNvbnN0IGFycmF5OiBUeXBlZEFycmF5ID0gYXdhaXQgdGhpcy5nZXRCdWZmZXJEYXRhKF9pQWNjZXNzb3IpO1xyXG4gICAgICBjb25zdCBnbHRmQWNjZXNzb3I6IEdMVEYuQWNjZXNzb3IgPSB0aGlzLiNnbHRmLmFjY2Vzc29yc1tfaUFjY2Vzc29yXTtcclxuXHJcbiAgICAgIGlmIChnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZSA9PSBHTFRGLkNPTVBPTkVOVF9UWVBFLkZMT0FUKVxyXG4gICAgICAgIHJldHVybiBhcnJheSBhcyBGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLm5vcm1hbGl6ZWQpIHtcclxuICAgICAgICBzd2l0Y2ggKGdsdGZBY2Nlc3Nvci5jb21wb25lbnRUeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEdMVEYuQ09NUE9ORU5UX1RZUEUuQllURTpcclxuICAgICAgICAgICAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKGFycmF5LCBfdmFsdWUgPT4gTWF0aC5tYXgoX3ZhbHVlIC8gMTI3LCAtMSkpO1xyXG4gICAgICAgICAgY2FzZSBHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0JZVEU6XHJcbiAgICAgICAgICAgIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShhcnJheSwgX3ZhbHVlID0+IF92YWx1ZSAvIDI1NSk7XHJcbiAgICAgICAgICBjYXNlIEdMVEYuQ09NUE9ORU5UX1RZUEUuU0hPUlQ6XHJcbiAgICAgICAgICAgIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShhcnJheSwgX3ZhbHVlID0+IE1hdGgubWF4KF92YWx1ZSAvIDMyNzY3LCAtMSkpO1xyXG4gICAgICAgICAgY2FzZSBHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUOlxyXG4gICAgICAgICAgICByZXR1cm4gRmxvYXQzMkFycmF5LmZyb20oYXJyYXksIF92YWx1ZSA9PiBfdmFsdWUgLyA2NTUzNSk7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IEludmFsaWQgY29tcG9uZW50IHR5cGUgJyR7R0xURi5DT01QT05FTlRfVFlQRVtnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZV19JyBmb3Igbm9ybWFsaXplZCBhY2Nlc3Nvci5gKTtcclxuICAgICAgICAgIC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNfYWNjZXNzb3Jfbm9ybWFsaXplZFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgRGVidWcud2FybihgJHt0aGlzfTogRXhwZWN0ZWQgY29tcG9uZW50IHR5cGUgJyR7R0xURi5DT01QT05FTlRfVFlQRVtHTFRGLkNPTVBPTkVOVF9UWVBFLkZMT0FUXX0nIGJ1dCB3YXMgJyR7R0xURi5DT01QT05FTlRfVFlQRVtnbHRmQWNjZXNzb3I/LmNvbXBvbmVudFR5cGVdfScuYCk7XHJcbiAgICAgIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShhcnJheSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFVpbnQxNkFycmF5fSBmb3IgdGhlIGdpdmVuIGFjY2Vzc29yIGluZGV4LiBPbmx5IHVzZWQgdG8gZ2V0IHRoZSB2ZXJ0ZXggaW5kaWNlcy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldFZlcnRleEluZGljZXMoX2lBY2Nlc3NvcjogbnVtYmVyKTogUHJvbWlzZTxVaW50MTZBcnJheT4ge1xyXG4gICAgICBjb25zdCBhcnJheTogVHlwZWRBcnJheSA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyRGF0YShfaUFjY2Vzc29yKTtcclxuICAgICAgY29uc3QgZ2x0ZkFjY2Vzc29yOiBHTFRGLkFjY2Vzc29yID0gdGhpcy4jZ2x0Zi5hY2Nlc3NvcnNbX2lBY2Nlc3Nvcl07XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGUgPT0gR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9TSE9SVClcclxuICAgICAgICByZXR1cm4gYXJyYXkgYXMgVWludDE2QXJyYXk7XHJcblxyXG4gICAgICBpZiAoZ2x0ZkFjY2Vzc29yLmNvdW50ID4gNjU1MzUgJiYgZ2x0ZkFjY2Vzc29yLnR5cGUgPT0gXCJTQ0FMQVJcIilcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IEZpbGUgaW5jbHVkZXMgYSBtZXNoIHdpdGggbW9yZSB0aGFuIDY1NTM1IHZlcnRpY2VzLiBGVURHRSBkb2VzIG5vdCBzdXBwb3J0IG1lc2hlcyB3aXRoIG1vcmUgdGhhbiA2NTUzNSB2ZXJ0aWNlcy5gKTtcclxuXHJcbiAgICAgIGlmIChnbHRmQWNjZXNzb3IuY29tcG9uZW50VHlwZSA9PSBHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0JZVEUgfHwgZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGUgPT0gR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9JTlQpXHJcbiAgICAgICAgcmV0dXJuIFVpbnQxNkFycmF5LmZyb20oYXJyYXkpO1xyXG5cclxuICAgICAgRGVidWcud2FybihgJHt0aGlzfTogRXhwZWN0ZWQgYW4gdW5zaWduZWQgaW50ZWdlciBjb21wb25lbnQgdHlwZSBidXQgd2FzICcke0dMVEYuQ09NUE9ORU5UX1RZUEVbdGhpcy4jZ2x0Zi5hY2Nlc3NvcnNbX2lBY2Nlc3Nvcl0/LmNvbXBvbmVudFR5cGVdfScuYCk7XHJcbiAgICAgIHJldHVybiBVaW50MTZBcnJheS5mcm9tKGFycmF5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBhIHtAbGluayBGbG9hdDMyQXJyYXl9IGZvciB0aGUgZ2l2ZW4gYWNjZXNzb3IgaW5kZXguIFRoZSBhcnJheSBjb250YWlucyB0aGUgdmVydGV4IGNvbG9ycyBpbiBSR0JBIGZvcm1hdC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldFZlcnRleENvbG9ycyhfaUFjY2Vzc29yOiBudW1iZXIpOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xyXG4gICAgICBjb25zdCBhcnJheTogRmxvYXQzMkFycmF5ID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoX2lBY2Nlc3Nvcik7XHJcbiAgICAgIGNvbnN0IGdsdGZBY2Nlc3NvcjogR0xURi5BY2Nlc3NvciA9IHRoaXMuI2dsdGYuYWNjZXNzb3JzW19pQWNjZXNzb3JdO1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci50eXBlID09IEdMVEYuQUNDRVNTT1JfVFlQRS5WRUMzKSB7XHJcbiAgICAgICAgY29uc3QgcmdiYUFycmF5OiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGFycmF5Lmxlbmd0aCAqIDQgLyAzKTtcclxuICAgICAgICBmb3IgKGxldCBpVmVjMzogbnVtYmVyID0gMCwgaVZlYzQ6IG51bWJlciA9IDA7IGlWZWMzIDwgYXJyYXkubGVuZ3RoOyBpVmVjMyArPSAzLCBpVmVjNCArPSA0KSB7XHJcbiAgICAgICAgICByZ2JhQXJyYXlbaVZlYzRdID0gYXJyYXlbaVZlYzNdO1xyXG4gICAgICAgICAgcmdiYUFycmF5W2lWZWM0ICsgMV0gPSBhcnJheVtpVmVjMyArIDFdO1xyXG4gICAgICAgICAgcmdiYUFycmF5W2lWZWM0ICsgMl0gPSBhcnJheVtpVmVjMyArIDJdO1xyXG4gICAgICAgICAgcmdiYUFycmF5W2lWZWM0ICsgM10gPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmdiYUFycmF5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCdWZmZXJEYXRhKF9pQWNjZXNzb3I6IG51bWJlcik6IFByb21pc2U8VHlwZWRBcnJheT4ge1xyXG4gICAgICBjb25zdCBnbHRmQWNjZXNzb3I6IEdMVEYuQWNjZXNzb3IgPSB0aGlzLiNnbHRmLmFjY2Vzc29yc1tfaUFjY2Vzc29yXTtcclxuICAgICAgaWYgKCFnbHRmQWNjZXNzb3IpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9OiBDb3VsZG4ndCBmaW5kIGFjY2Vzc29yIHdpdGggaW5kZXggJHtfaUFjY2Vzc29yfS5gKTtcclxuXHJcbiAgICAgIGxldCBhcnJheTogVHlwZWRBcnJheTtcclxuICAgICAgY29uc3QgY29tcG9uZW50VHlwZTogR0xURi5DT01QT05FTlRfVFlQRSA9IGdsdGZBY2Nlc3Nvci5jb21wb25lbnRUeXBlO1xyXG4gICAgICBjb25zdCBhY2Nlc3NvclR5cGU6IEdMVEYuQUNDRVNTT1JfVFlQRSA9IGdsdGZBY2Nlc3Nvci50eXBlO1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci5idWZmZXJWaWV3ICE9IHVuZGVmaW5lZClcclxuICAgICAgICBhcnJheSA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyVmlld0RhdGEodGhpcy4jZ2x0Zi5idWZmZXJWaWV3c1tnbHRmQWNjZXNzb3IuYnVmZmVyVmlld10sIGdsdGZBY2Nlc3Nvci5ieXRlT2Zmc2V0LCBjb21wb25lbnRUeXBlLCBhY2Nlc3NvclR5cGUpO1xyXG5cclxuICAgICAgaWYgKGdsdGZBY2Nlc3Nvci5zcGFyc2UpIHtcclxuICAgICAgICBjb25zdCBnbHRmQnVmZmVyVmlld0luZGljZXM6IEdMVEYuQnVmZmVyVmlldyA9IHRoaXMuI2dsdGYuYnVmZmVyVmlld3NbZ2x0ZkFjY2Vzc29yLnNwYXJzZS5pbmRpY2VzLmJ1ZmZlclZpZXddO1xyXG4gICAgICAgIGNvbnN0IGdsdGZCdWZmZXJWaWV3VmFsdWVzOiBHTFRGLkJ1ZmZlclZpZXcgPSB0aGlzLiNnbHRmLmJ1ZmZlclZpZXdzW2dsdGZBY2Nlc3Nvci5zcGFyc2UudmFsdWVzLmJ1ZmZlclZpZXddO1xyXG5cclxuICAgICAgICBpZiAoIWdsdGZCdWZmZXJWaWV3SW5kaWNlcyB8fCAhZ2x0ZkJ1ZmZlclZpZXdWYWx1ZXMpXHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgYnVmZmVyIHZpZXdzIGZvciBzcGFyc2UgaW5kaWNlcyBvciB2YWx1ZXMgb2YgYWNjZXNzb3Igd2l0aCBpbmRleCAke19pQWNjZXNzb3J9LmApO1xyXG5cclxuICAgICAgICBjb25zdCBhcnJheUluZGljZXM6IFR5cGVkQXJyYXkgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlclZpZXdEYXRhKGdsdGZCdWZmZXJWaWV3SW5kaWNlcywgZ2x0ZkFjY2Vzc29yLnNwYXJzZS5pbmRpY2VzLmJ5dGVPZmZzZXQsIGdsdGZBY2Nlc3Nvci5zcGFyc2UuaW5kaWNlcy5jb21wb25lbnRUeXBlLCBHTFRGLkFDQ0VTU09SX1RZUEUuU0NBTEFSKTtcclxuICAgICAgICBjb25zdCBhcnJheVZhbHVlczogVHlwZWRBcnJheSA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyVmlld0RhdGEoZ2x0ZkJ1ZmZlclZpZXdWYWx1ZXMsIGdsdGZBY2Nlc3Nvci5zcGFyc2UudmFsdWVzLmJ5dGVPZmZzZXQsIGNvbXBvbmVudFR5cGUsIGFjY2Vzc29yVHlwZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFjY2Vzc29yVHlwZUxlbmd0aDogbnVtYmVyID0gdG9BY2Nlc3NvclR5cGVMZW5ndGhbZ2x0ZkFjY2Vzc29yLnR5cGVdO1xyXG4gICAgICAgIGlmIChnbHRmQWNjZXNzb3IuYnVmZmVyVmlldyA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICBhcnJheSA9IG5ldyB0b0FycmF5Q29uc3RydWN0b3JbZ2x0ZkFjY2Vzc29yLmNvbXBvbmVudFR5cGVdKGdsdGZBY2Nlc3Nvci5jb3VudCAqIGFjY2Vzc29yVHlwZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBnbHRmQWNjZXNzb3Iuc3BhcnNlLmNvdW50OyBpKyspIHtcclxuICAgICAgICAgIGFycmF5LnNldChhcnJheVZhbHVlcy5zbGljZShpICogYWNjZXNzb3JUeXBlTGVuZ3RoLCAoaSArIDEpICogYWNjZXNzb3JUeXBlTGVuZ3RoKSwgYXJyYXlJbmRpY2VzW2ldICogYWNjZXNzb3JUeXBlTGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1ZmZlclZpZXdEYXRhKF9idWZmZXJWaWV3OiBHTFRGLkJ1ZmZlclZpZXcsIF9ieXRlT2Zmc2V0OiBudW1iZXIsIF9jb21wb25lbnRUeXBlOiBHTFRGLkNPTVBPTkVOVF9UWVBFLCBfYWNjZXNzb3JUeXBlOiBHTFRGLkFDQ0VTU09SX1RZUEUpOiBQcm9taXNlPFR5cGVkQXJyYXk+IHtcclxuICAgICAgY29uc3QgYnVmZmVyOiBBcnJheUJ1ZmZlciA9IGF3YWl0IHRoaXMuZ2V0QnVmZmVyKF9idWZmZXJWaWV3LmJ1ZmZlcik7XHJcbiAgICAgIGNvbnN0IGJ5dGVPZmZzZXQ6IG51bWJlciA9IChfYnVmZmVyVmlldy5ieXRlT2Zmc2V0ID8/IDApICsgKF9ieXRlT2Zmc2V0ID8/IDApO1xyXG4gICAgICBjb25zdCBieXRlTGVuZ3RoOiBudW1iZXIgPSBfYnVmZmVyVmlldy5ieXRlTGVuZ3RoID8/IDA7XHJcbiAgICAgIGNvbnN0IGJ5dGVTdHJpZGU6IG51bWJlciA9IF9idWZmZXJWaWV3LmJ5dGVTdHJpZGU7XHJcblxyXG4gICAgICBjb25zdCBhcnJheUNvbnN0cnVjdG9yOiBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSB0b0FycmF5Q29uc3RydWN0b3JbX2NvbXBvbmVudFR5cGVdO1xyXG4gICAgICBjb25zdCBhcnJheTogVHlwZWRBcnJheSA9IG5ldyBhcnJheUNvbnN0cnVjdG9yKGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCAvIGFycmF5Q29uc3RydWN0b3IuQllURVNfUEVSX0VMRU1FTlQpO1xyXG5cclxuICAgICAgaWYgKGJ5dGVTdHJpZGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBjcmVhdGluZyBuZXcgYnVmZmVycyBtYXliZSByYXRoZXIgcGFzcyBzdHJpZGUgaW50byB0aGUgcmVuZGVyIG1lc2g/IGFuZCBzZXQgaXQgd2hlbiBkYXRhIGlzIHBhc3NlZCB0byB0aGUgZ3B1P1xyXG4gICAgICAgIGNvbnN0IG5Db21wb25lbnRzUGVyRWxlbWVudDogbnVtYmVyID0gdG9BY2Nlc3NvclR5cGVMZW5ndGhbX2FjY2Vzc29yVHlwZV07IC8vIGFtb3VudCBvZiBjb21wb25lbnRzIHBlciBlbGVtZW50IG9mIHRoZSBhY2Nlc3NvciB0eXBlLCBlLmcuIDMgZm9yIFZFQzNcclxuICAgICAgICBjb25zdCBuRWxlbWVudHM6IG51bWJlciA9IGJ5dGVMZW5ndGggLyBieXRlU3RyaWRlOyAvLyBhbW91bnQgb2YgZWxlbWVudHMsIGUuZy4gbipWRUMzIFxyXG4gICAgICAgIGNvbnN0IHN0cmlkZTogbnVtYmVyID0gYnl0ZVN0cmlkZSAvIGFycmF5Q29uc3RydWN0b3IuQllURVNfUEVSX0VMRU1FTlQ7XHJcbiAgICAgICAgY29uc3QgbmV3QXJyYXk6IFR5cGVkQXJyYXkgPSBuZXcgYXJyYXlDb25zdHJ1Y3RvcihuRWxlbWVudHMgKiBuQ29tcG9uZW50c1BlckVsZW1lbnQpO1xyXG4gICAgICAgIGZvciAobGV0IGlOZXdFbGVtZW50OiBudW1iZXIgPSAwOyBpTmV3RWxlbWVudCA8IG5FbGVtZW50czsgaU5ld0VsZW1lbnQrKykge1xyXG4gICAgICAgICAgY29uc3QgaUVsZW1lbnQ6IG51bWJlciA9IGlOZXdFbGVtZW50ICogc3RyaWRlO1xyXG4gICAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgbG9vcCBpcyBmYXN0ZXIgdGhhbiBzZXQgKyBzbGljZVxyXG4gICAgICAgICAgZm9yIChsZXQgaUNvbXBvbmVudDogbnVtYmVyID0gMDsgaUNvbXBvbmVudCA8IG5Db21wb25lbnRzUGVyRWxlbWVudDsgaUNvbXBvbmVudCsrKVxyXG4gICAgICAgICAgICBuZXdBcnJheVtpTmV3RWxlbWVudCAqIG5Db21wb25lbnRzUGVyRWxlbWVudCArIGlDb21wb25lbnRdID0gYXJyYXlbaUVsZW1lbnQgKyBpQ29tcG9uZW50XTtcclxuICAgICAgICAgIC8vIG5ld0FycmF5LnNldChhcnJheS5zbGljZShpRWxlbWVudCwgaUVsZW1lbnQgKyBuQ29tcG9uZW50c1BlckVsZW1lbnQpLCBpTmV3RWxlbWVudCAqIG5Db21wb25lbnRzUGVyRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1ZmZlcihfaUJ1ZmZlcjogbnVtYmVyKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xyXG4gICAgICBjb25zdCBnbHRmQnVmZmVyOiBHTFRGLkJ1ZmZlciA9IHRoaXMuI2dsdGYuYnVmZmVyc1tfaUJ1ZmZlcl07XHJcbiAgICAgIGlmICghZ2x0ZkJ1ZmZlcilcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpc306IENvdWxkbid0IGZpbmQgYnVmZmVyIHdpdGggaW5kZXggJHtfaUJ1ZmZlcn0uYCk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuI2J1ZmZlcnMpXHJcbiAgICAgICAgdGhpcy4jYnVmZmVycyA9IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuI2J1ZmZlcnNbX2lCdWZmZXJdKSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2gobmV3IFVSTChnbHRmQnVmZmVyLnVyaSwgbmV3IFVSTCh0aGlzLiN1cmwsIFByb2plY3QuYmFzZVVSTCkpKTtcclxuICAgICAgICB0aGlzLiNidWZmZXJzW19pQnVmZmVyXSA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLiNidWZmZXJzW19pQnVmZmVyXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yKF9zYW1wbGVyOiBHTFRGLkFuaW1hdGlvblNhbXBsZXIsIF90cmFuc2Zvcm1hdGlvblR5cGU6IEdMVEYuQW5pbWF0aW9uQ2hhbm5lbFRhcmdldFtcInBhdGhcIl0pOiBQcm9taXNlPEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yMyB8IEFuaW1hdGlvblNlcXVlbmNlVmVjdG9yND4ge1xyXG4gICAgICBjb25zdCBpbnB1dDogRmxvYXQzMkFycmF5ID0gYXdhaXQgdGhpcy5nZXRGbG9hdDMyQXJyYXkoX3NhbXBsZXIuaW5wdXQpO1xyXG4gICAgICBjb25zdCBvdXRwdXQ6IEZsb2F0MzJBcnJheSA9IGF3YWl0IHRoaXMuZ2V0RmxvYXQzMkFycmF5KF9zYW1wbGVyLm91dHB1dCk7XHJcblxyXG4gICAgICBjb25zdCBtaWxsaXNQZXJTZWNvbmQ6IG51bWJlciA9IDEwMDA7XHJcbiAgICAgIGNvbnN0IGlzUm90YXRpb246IGJvb2xlYW4gPSBfdHJhbnNmb3JtYXRpb25UeXBlID09IFwicm90YXRpb25cIjtcclxuICAgICAgY29uc3QgdmVjdG9yTGVuZ3RoOiBudW1iZXIgPSBpc1JvdGF0aW9uID8gNCA6IDM7IC8vIHJvdGF0aW9uIGlzIHN0b3JlZCBhcyBxdWF0ZXJuaW9uXHJcbiAgICAgIGNvbnN0IGludGVycG9sYXRpb246IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OID0gdGhpcy50b0ludGVybkludGVycG9sYXRpb24oX3NhbXBsZXIuaW50ZXJwb2xhdGlvbik7XHJcbiAgICAgIGNvbnN0IGlzQ3ViaWM6IHRydWUgfCB1bmRlZmluZWQgPSBpbnRlcnBvbGF0aW9uID09IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OLkNVQklDID8gdHJ1ZSA6IHVuZGVmaW5lZDtcclxuICAgICAgY29uc3QgdmVjdG9yc1BlcklucHV0OiBudW1iZXIgPSBpc0N1YmljID8gMyA6IDE7IC8vIGN1YmljIGludGVycG9sYXRpb24gdXNlcyAzIHZhbHVlcyBwZXIgaW5wdXQ6IGluLXRhbmdlbnQsIHByb3BlcnR5IHZhbHVlIGFuZCBvdXQtdGFuZ2VudC4gaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI2ludGVycG9sYXRpb24tY3ViaWNcclxuXHJcbiAgICAgIC8vIHVzZWQgb25seSBmb3Igcm90YXRpb24gaW50ZXJwb2xhdGlvblxyXG4gICAgICBsZXQgbGFzdFJvdGF0aW9uOiBRdWF0ZXJuaW9uO1xyXG4gICAgICBsZXQgbmV4dFJvdGF0aW9uOiBRdWF0ZXJuaW9uO1xyXG5cclxuICAgICAgY29uc3Qgc2VxdWVuY2VzOiB7IHg6IEFuaW1hdGlvbktleVtdOyB5OiBBbmltYXRpb25LZXlbXTsgejogQW5pbWF0aW9uS2V5W107IHc/OiBBbmltYXRpb25LZXlbXSB9ID0geyB4OiBbXSwgeTogW10sIHo6IFtdIH07XHJcbiAgICAgIGlmIChpc1JvdGF0aW9uKSB7XHJcbiAgICAgICAgc2VxdWVuY2VzLncgPSBbXTtcclxuICAgICAgICBsYXN0Um90YXRpb24gPSBSZWN5Y2xlci5nZXQoUXVhdGVybmlvbik7XHJcbiAgICAgICAgbmV4dFJvdGF0aW9uID0gUmVjeWNsZXIuZ2V0KFF1YXRlcm5pb24pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBpSW5wdXQ6IG51bWJlciA9IDA7IGlJbnB1dCA8IGlucHV0Lmxlbmd0aDsgaUlucHV0KyspIHtcclxuICAgICAgICBjb25zdCBpT3V0cHV0OiBudW1iZXIgPSBpSW5wdXQgKiB2ZWN0b3JzUGVySW5wdXQgKiB2ZWN0b3JMZW5ndGggKyAoaXNDdWJpYyA/IHZlY3Rvckxlbmd0aCA6IDApO1xyXG4gICAgICAgIGNvbnN0IGlPdXRwdXRTbG9wZUluOiBudW1iZXIgPSBpT3V0cHV0IC0gdmVjdG9yTGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IGlPdXRwdXRTbG9wZU91dDogbnVtYmVyID0gaU91dHB1dCArIHZlY3Rvckxlbmd0aDtcclxuICAgICAgICBjb25zdCB0aW1lOiBudW1iZXIgPSBtaWxsaXNQZXJTZWNvbmQgKiBpbnB1dFtpSW5wdXRdO1xyXG5cclxuICAgICAgICBpZiAoaXNSb3RhdGlvbikge1xyXG4gICAgICAgICAgLy8gVGFrZSB0aGUgc2hvcnRlc3QgcGF0aCBiZXR3ZWVuIHR3byByb3RhdGlvbnMsIGkuZS4gaWYgdGhlIGRvdCBwcm9kdWN0IGlzIG5lZ2F0aXZlIHRoZW4gdGhlIG5leHQgcXVhdGVybmlvbiBuZWVkcyB0byBiZSBuZWdhdGVkLlxyXG4gICAgICAgICAgLy8gcSBhbmQgLXEgcmVwcmVzZW50IHRoZSBzYW1lIHJvdGF0aW9uIGJ1dCBpbnRlcnBvbGF0aW9uIHdpbGwgdGFrZSBlaXRoZXIgdGhlIGxvbmcgd2F5IG9yIHRoZSBzaG9ydCB3YXkgYXJvdW5kIHRoZSBzcGhlcmUgZGVwZW5kaW5nIG9uIHdoaWNoIHdlIHVzZS5cclxuICAgICAgICAgIG5leHRSb3RhdGlvbi5zZXQob3V0cHV0W2lPdXRwdXQgKyAwXSwgb3V0cHV0W2lPdXRwdXQgKyAxXSwgb3V0cHV0W2lPdXRwdXQgKyAyXSwgb3V0cHV0W2lPdXRwdXQgKyAzXSk7XHJcbiAgICAgICAgICBpZiAoUXVhdGVybmlvbi5ET1QobGFzdFJvdGF0aW9uLCBuZXh0Um90YXRpb24pIDwgMClcclxuICAgICAgICAgICAgbmV4dFJvdGF0aW9uLm5lZ2F0ZSgpO1xyXG4gICAgICAgICAgb3V0cHV0W2lPdXRwdXQgKyAwXSA9IG5leHRSb3RhdGlvbi54O1xyXG4gICAgICAgICAgb3V0cHV0W2lPdXRwdXQgKyAxXSA9IG5leHRSb3RhdGlvbi55O1xyXG4gICAgICAgICAgb3V0cHV0W2lPdXRwdXQgKyAyXSA9IG5leHRSb3RhdGlvbi56O1xyXG4gICAgICAgICAgb3V0cHV0W2lPdXRwdXQgKyAzXSA9IG5leHRSb3RhdGlvbi53O1xyXG4gICAgICAgICAgbGFzdFJvdGF0aW9uLnNldChuZXh0Um90YXRpb24ueCwgbmV4dFJvdGF0aW9uLnksIG5leHRSb3RhdGlvbi56LCBuZXh0Um90YXRpb24udyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXF1ZW5jZXMueC5wdXNoKG5ldyBBbmltYXRpb25LZXkodGltZSwgb3V0cHV0W2lPdXRwdXQgKyAwXSwgaW50ZXJwb2xhdGlvbiwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlSW4gKyAwXSAvIG1pbGxpc1BlclNlY29uZCwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlT3V0ICsgMF0gLyBtaWxsaXNQZXJTZWNvbmQpKTtcclxuICAgICAgICBzZXF1ZW5jZXMueS5wdXNoKG5ldyBBbmltYXRpb25LZXkodGltZSwgb3V0cHV0W2lPdXRwdXQgKyAxXSwgaW50ZXJwb2xhdGlvbiwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlSW4gKyAxXSAvIG1pbGxpc1BlclNlY29uZCwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlT3V0ICsgMV0gLyBtaWxsaXNQZXJTZWNvbmQpKTtcclxuICAgICAgICBzZXF1ZW5jZXMuei5wdXNoKG5ldyBBbmltYXRpb25LZXkodGltZSwgb3V0cHV0W2lPdXRwdXQgKyAyXSwgaW50ZXJwb2xhdGlvbiwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlSW4gKyAyXSAvIG1pbGxpc1BlclNlY29uZCwgaXNDdWJpYyAmJiBvdXRwdXRbaU91dHB1dFNsb3BlT3V0ICsgMl0gLyBtaWxsaXNQZXJTZWNvbmQpKTtcclxuICAgICAgICBpZiAoaXNSb3RhdGlvbilcclxuICAgICAgICAgIHNlcXVlbmNlcy53LnB1c2gobmV3IEFuaW1hdGlvbktleSh0aW1lLCBvdXRwdXRbaU91dHB1dCArIDNdLCBpbnRlcnBvbGF0aW9uLCBpc0N1YmljICYmIG91dHB1dFtpT3V0cHV0U2xvcGVJbiArIDNdIC8gbWlsbGlzUGVyU2Vjb25kLCBpc0N1YmljICYmIG91dHB1dFtpT3V0cHV0U2xvcGVPdXQgKyAzXSAvIG1pbGxpc1BlclNlY29uZCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNSb3RhdGlvbikge1xyXG4gICAgICAgIFJlY3ljbGVyLnN0b3JlKGxhc3RSb3RhdGlvbik7XHJcbiAgICAgICAgUmVjeWNsZXIuc3RvcmUobmV4dFJvdGF0aW9uKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhzZXF1ZW5jZXMpLm1hcCgoW19rZXksIF92YWx1ZV0pID0+IFtfa2V5LCBuZXcgQW5pbWF0aW9uU2VxdWVuY2UoX3ZhbHVlKV0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvSW50ZXJuSW50ZXJwb2xhdGlvbihfaW50ZXJwb2xhdGlvbjogR0xURi5BbmltYXRpb25TYW1wbGVyW1wiaW50ZXJwb2xhdGlvblwiXSk6IEFOSU1BVElPTl9JTlRFUlBPTEFUSU9OIHtcclxuICAgICAgc3dpdGNoIChfaW50ZXJwb2xhdGlvbikge1xyXG4gICAgICAgIGNhc2UgXCJMSU5FQVJcIjpcclxuICAgICAgICAgIHJldHVybiBBTklNQVRJT05fSU5URVJQT0xBVElPTi5MSU5FQVI7XHJcbiAgICAgICAgY2FzZSBcIlNURVBcIjpcclxuICAgICAgICAgIHJldHVybiBBTklNQVRJT05fSU5URVJQT0xBVElPTi5DT05TVEFOVDtcclxuICAgICAgICBjYXNlIFwiQ1VCSUNTUExJTkVcIjpcclxuICAgICAgICAgIHJldHVybiBBTklNQVRJT05fSU5URVJQT0xBVElPTi5DVUJJQztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKF9pbnRlcnBvbGF0aW9uICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgRGVidWcud2FybihgJHt0aGlzfTogVW5rbm93biBpbnRlcnBvbGF0aW9uIHR5cGUgJHtfaW50ZXJwb2xhdGlvbn0uYCk7XHJcbiAgICAgICAgICByZXR1cm4gQU5JTUFUSU9OX0lOVEVSUE9MQVRJT04uTElORUFSO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRXZWJHTFBhcmFtZXRlck5hbWUoX3ZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpLmZpbmQoX2tleSA9PiBSZWZsZWN0LmdldChXZWJHTDJSZW5kZXJpbmdDb250ZXh0LCBfa2V5KSA9PSBfdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgdHlwZSBUeXBlZEFycmF5ID0gVWludDhBcnJheSB8IFVpbnQxNkFycmF5IHwgVWludDMyQXJyYXkgfCBJbnQ4QXJyYXkgfCBJbnQxNkFycmF5IHwgRmxvYXQzMkFycmF5O1xyXG4gIHR5cGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gVWludDhBcnJheUNvbnN0cnVjdG9yIHwgVWludDE2QXJyYXlDb25zdHJ1Y3RvciB8IFVpbnQzMkFycmF5Q29uc3RydWN0b3IgfCBJbnQ4QXJyYXlDb25zdHJ1Y3RvciB8IEludDE2QXJyYXlDb25zdHJ1Y3RvciB8IEZsb2F0MzJBcnJheUNvbnN0cnVjdG9yO1xyXG5cclxuICBjb25zdCB0b0ludGVyblRyYW5zZm9ybWF0aW9uOiBSZWNvcmQ8R0xURi5BbmltYXRpb25DaGFubmVsVGFyZ2V0W1wicGF0aFwiXSwgc3RyaW5nPiA9IHtcclxuICAgIFwidHJhbnNsYXRpb25cIjogXCJ0cmFuc2xhdGlvblwiLFxyXG4gICAgXCJyb3RhdGlvblwiOiBcInJvdGF0aW9uXCIsXHJcbiAgICBcInNjYWxlXCI6IFwic2NhbGluZ1wiLFxyXG4gICAgXCJ3ZWlnaHRzXCI6IFwid2VpZ2h0c1wiXHJcbiAgfTtcclxuXHJcbiAgLy8gbnVtYmVyIG9mIGNvbXBvbmVudHMgZGVmaW5lZCBieSAndHlwZSdcclxuICBjb25zdCB0b0FjY2Vzc29yVHlwZUxlbmd0aDogUmVjb3JkPEdMVEYuQUNDRVNTT1JfVFlQRSwgbnVtYmVyPiA9IHtcclxuICAgIFwiU0NBTEFSXCI6IDEsXHJcbiAgICBcIlZFQzJcIjogMixcclxuICAgIFwiVkVDM1wiOiAzLFxyXG4gICAgXCJWRUM0XCI6IDQsXHJcbiAgICBcIk1BVDJcIjogNCxcclxuICAgIFwiTUFUM1wiOiA5LFxyXG4gICAgXCJNQVQ0XCI6IDE2XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdG9BcnJheUNvbnN0cnVjdG9yOiBSZWNvcmQ8R0xURi5DT01QT05FTlRfVFlQRSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yPiA9IHtcclxuICAgIFtHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX0JZVEVdOiBVaW50OEFycmF5LFxyXG4gICAgW0dMVEYuQ09NUE9ORU5UX1RZUEUuQllURV06IEludDhBcnJheSxcclxuICAgIFtHTFRGLkNPTVBPTkVOVF9UWVBFLlVOU0lHTkVEX1NIT1JUXTogVWludDE2QXJyYXksXHJcbiAgICBbR0xURi5DT01QT05FTlRfVFlQRS5TSE9SVF06IEludDE2QXJyYXksXHJcbiAgICBbR0xURi5DT01QT05FTlRfVFlQRS5VTlNJR05FRF9JTlRdOiBVaW50MzJBcnJheSxcclxuICAgIFtHTFRGLkNPTVBPTkVOVF9UWVBFLkZMT0FUXTogRmxvYXQzMkFycmF5XHJcbiAgfTtcclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xuICBleHBvcnQgbGV0IHNoYWRlclNvdXJjZXM6IHtbc291cmNlOiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJBbWJpZW50T2NjbHVzaW9uLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGFtYmllbnQgb2NjbHVzaW9uIGZvciBhIGdpdmVuIGZyYWdtZW50XHJcbiAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuICogYWRhcHRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL3RzaGVyaWYvd2ViZ2wyZXhhbXBsZXMvYmxvYi9kYTExNTNhMTVlYmMwOWJiMTM0OThlNWY3MzJlZjIwMzY1MDc3NDBjL3NzYW8uaHRtbFxyXG4gKiBzZWUgaGVyZSBmb3IgYW4gaW4gZGVwdGggZXhwbGFuYXRpb246IFxyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbmNvbnN0IGZsb2F0IHNpbjQ1ID0gMC43MDcxMDc7IC8vIDQ1IGRlZ3JlZXMgaW4gcmFkaWFuc1xyXG5jb25zdCB2ZWMyIGtlcm5lbFs0XSA9IHZlYzJbNF0odmVjMigwLjAsIDEuMCksIHZlYzIoMS4wLCAwLjApLCB2ZWMyKDAuMCwgLTEuMCksIHZlYzIoLTEuMCwgMC4wKSk7XHJcblxyXG51bmlmb3JtIGZsb2F0IHVfZk5lYXI7XHJcbnVuaWZvcm0gZmxvYXQgdV9mRmFyO1xyXG51bmlmb3JtIGZsb2F0IHVfZlNhbXBsZVJhZGl1cztcclxudW5pZm9ybSBmbG9hdCB1X2ZCaWFzO1xyXG51bmlmb3JtIGZsb2F0IHVfZkF0dGVudWF0aW9uQ29uc3RhbnQ7XHJcbnVuaWZvcm0gZmxvYXQgdV9mQXR0ZW51YXRpb25MaW5lYXI7XHJcbnVuaWZvcm0gZmxvYXQgdV9mQXR0ZW51YXRpb25RdWFkcmF0aWM7XHJcbnVuaWZvcm0gdmVjMiB1X3ZjdFJlc29sdXRpb247XHJcbnVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTtcclxuLy8gdW5pZm9ybSBtYXQ0IHVfbXR4Vmlld1Byb2plY3Rpb25JbnZlcnNlO1xyXG5cclxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhQb3NpdGlvbjtcclxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhOb3JtYWw7XHJcbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Tm9pc2U7XHJcbi8vIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4RGVwdGg7XHJcblxyXG5pbiB2ZWMyIHZfdmN0VGV4dHVyZTtcclxub3V0IHZlYzQgdmN0RnJhZztcclxuXHJcbmxheW91dChzdGQxNDApIHVuaWZvcm0gRm9nIHtcclxuICBib29sIHVfYkZvZ0FjdGl2ZTtcclxuICBmbG9hdCB1X2ZGb2dOZWFyO1xyXG4gIGZsb2F0IHVfZkZvZ0ZhcjtcclxuICBmbG9hdCBwYWRpbmc7XHJcbiAgdmVjNCB1X3ZjdEZvZ0NvbG9yO1xyXG59O1xyXG5cclxuLy8gVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gZnJvbSB0aGUgZGVwdGggdGV4dHVyZSwgYnV0IG1vYmlsZSBkZXZpY2VzIHNlZW1zIHRvIGxhY2sgaW4gcHJlY2lzaW9uIHRvIGRvIHRoaXNcclxuLy8gdmVjMyBnZXRQb3NpdGlvbih2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbi8vICAgZmxvYXQgZkRlcHRoID0gdGV4dHVyZSh1X3RleERlcHRoLCBfdmN0VGV4dHVyZSkucjtcclxuLy8gICB2ZWM0IGNsaXBTcGFjZVBvc2l0aW9uID0gdmVjNChfdmN0VGV4dHVyZSAqIDIuMCAtIDEuMCwgZkRlcHRoICogMi4wIC0gMS4wLCAxLjApO1xyXG4vLyAgIHZlYzQgd29ybGRTcGFjZVBvc2l0aW9uID0gdV9tdHhWaWV3UHJvamVjdGlvbkludmVyc2UgKiBjbGlwU3BhY2VQb3NpdGlvbjtcclxuLy8gICByZXR1cm4gd29ybGRTcGFjZVBvc2l0aW9uLnh5eiAvIHdvcmxkU3BhY2VQb3NpdGlvbi53O1xyXG4vLyB9XHJcblxyXG5mbG9hdCBnZXRPY2NsdXNpb24odmVjMyBfdmN0UG9zaXRpb24sIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMiBfdmN0VGV4dHVyZSkge1xyXG4gIHZlYzMgdmN0T2NjbHVkZXIgPSB0ZXh0dXJlKHVfdGV4UG9zaXRpb24sIF92Y3RUZXh0dXJlKS54eXo7XHJcblxyXG4gIGlmICh2Y3RPY2NsdWRlci54ID09IDAuMCAmJiB2Y3RPY2NsdWRlci55ID09IDAuMCAmJiB2Y3RPY2NsdWRlci56ID09IDAuMCkgLy8gbm8gb2NjbHVkZXIgYXQgdGhpcyBwb3NpdGlvblxyXG4gICAgcmV0dXJuIDAuMDtcclxuXHJcbiAgdmVjMyB2Y3REaXN0YW5jZSA9IHZjdE9jY2x1ZGVyIC0gX3ZjdFBvc2l0aW9uO1xyXG4gIGZsb2F0IGZJbnRlbnNpdHkgPSBtYXgoZG90KF92Y3ROb3JtYWwsIG5vcm1hbGl6ZSh2Y3REaXN0YW5jZSkpIC0gdV9mQmlhcywgMC4wKTtcclxuXHJcbiAgZmxvYXQgZkRpc3RhbmNlID0gbGVuZ3RoKHZjdERpc3RhbmNlKTtcclxuICBmbG9hdCBmQXR0ZW51YXRpb24gPSAxLjAgLyAodV9mQXR0ZW51YXRpb25Db25zdGFudCArIHVfZkF0dGVudWF0aW9uTGluZWFyICogZkRpc3RhbmNlICsgdV9mQXR0ZW51YXRpb25RdWFkcmF0aWMgKiBmRGlzdGFuY2UgKiBmRGlzdGFuY2UpO1xyXG5cclxuICByZXR1cm4gZkludGVuc2l0eSAqIGZBdHRlbnVhdGlvbjtcclxufVxyXG5cclxuZmxvYXQgZ2V0Rm9nKHZlYzMgX3ZjdFBvc2l0aW9uKSB7XHJcbiAgZmxvYXQgZkRpc3RhbmNlID0gbGVuZ3RoKF92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTsgLy8gbWF5YmUgdXNlIHotZGVwdGggaW5zdGVhZCBvZiBldWNsaWRlYW4gZGVwdGhcclxuICBmbG9hdCBmRm9nID0gY2xhbXAoKGZEaXN0YW5jZSAtIHVfZkZvZ05lYXIpIC8gKHVfZkZvZ0ZhciAtIHVfZkZvZ05lYXIpLCAwLjAsIDEuMCk7XHJcbiAgZkZvZyA9IC1wb3coZkZvZywgMi4wKSArICgyLjAgKiBmRm9nKTsgLy8gbGV0cyBmb2cgYXBwZWFyIHF1aWNrZXIgYW5kIGZhbGwgb2ZmIHNsb3dlciByZXN1bHRzIGluIGEgbW9yZSBncmFkdWFsIGZhbGxvZmZcclxuICByZXR1cm4gZkZvZyAqIHVfdmN0Rm9nQ29sb3IuYTtcclxufVxyXG5cclxudm9pZCBtYWluKCkge1xyXG4gIHZlYzMgdmN0UG9zaXRpb24gPSB0ZXh0dXJlKHVfdGV4UG9zaXRpb24sIHZfdmN0VGV4dHVyZSkueHl6O1xyXG4gIHZlYzMgdmN0Tm9ybWFsID0gdGV4dHVyZSh1X3RleE5vcm1hbCwgdl92Y3RUZXh0dXJlKS54eXo7XHJcbiAgdmVjMiB2Y3RSYW5kb20gPSBub3JtYWxpemUodGV4dHVyZSh1X3RleE5vaXNlLCB2X3ZjdFRleHR1cmUpLnh5ICogMi4wIC0gMS4wKTtcclxuICBmbG9hdCBmRGVwdGggPSAobGVuZ3RoKHZjdFBvc2l0aW9uIC0gdV92Y3RDYW1lcmEpIC0gdV9mTmVhcikgLyAodV9mRmFyIC0gdV9mTmVhcik7IC8vIGxpbmVhciBldWNsaWRlYW4gZGVwdGggaW4gcmFuZ2UgWzAsMV0sIHdoZW4gY2hhbmdpbmcgdG8gdmlldyBzcGFjZSwgZG9uJ3Qgc3VidHJhY3QgY2FtZXJhIHBvc2l0aW9uXHJcbiAgZmxvYXQgZktlcm5lbFJhZGl1cyA9IHVfZlNhbXBsZVJhZGl1cyAqICgxLjAgLSBmRGVwdGgpO1xyXG5cclxuICBmbG9hdCBmT2NjbHVzaW9uID0gMC4wO1xyXG4gIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7XHJcbiAgICB2ZWMyIHZjdEsxID0gcmVmbGVjdChrZXJuZWxbaV0sIHZjdFJhbmRvbSk7XHJcbiAgICB2ZWMyIHZjdEsyID0gdmVjMih2Y3RLMS54ICogc2luNDUgLSB2Y3RLMS55ICogc2luNDUsIHZjdEsxLnggKiBzaW40NSArIHZjdEsxLnkgKiBzaW40NSk7XHJcblxyXG4gICAgdmN0SzEgLz0gdV92Y3RSZXNvbHV0aW9uO1xyXG4gICAgdmN0SzIgLz0gdV92Y3RSZXNvbHV0aW9uO1xyXG5cclxuICAgIHZjdEsxICo9IGZLZXJuZWxSYWRpdXM7XHJcbiAgICB2Y3RLMiAqPSBmS2VybmVsUmFkaXVzO1xyXG5cclxuICAgIGZPY2NsdXNpb24gKz0gZ2V0T2NjbHVzaW9uKHZjdFBvc2l0aW9uLCB2Y3ROb3JtYWwsIHZfdmN0VGV4dHVyZSArIHZjdEsxKTtcclxuICAgIGZPY2NsdXNpb24gKz0gZ2V0T2NjbHVzaW9uKHZjdFBvc2l0aW9uLCB2Y3ROb3JtYWwsIHZfdmN0VGV4dHVyZSArIHZjdEsyICogMC43NSk7XHJcbiAgICBmT2NjbHVzaW9uICs9IGdldE9jY2x1c2lvbih2Y3RQb3NpdGlvbiwgdmN0Tm9ybWFsLCB2X3ZjdFRleHR1cmUgKyB2Y3RLMSAqIDAuNSk7XHJcbiAgICBmT2NjbHVzaW9uICs9IGdldE9jY2x1c2lvbih2Y3RQb3NpdGlvbiwgdmN0Tm9ybWFsLCB2X3ZjdFRleHR1cmUgKyB2Y3RLMiAqIDAuMjUpO1xyXG4gIH1cclxuXHJcbiAgZk9jY2x1c2lvbiA9IGNsYW1wKGZPY2NsdXNpb24gLyAxNi4wLCAwLjAsIDEuMCk7XHJcblxyXG4gIGlmICh1X2JGb2dBY3RpdmUgJiYgZk9jY2x1c2lvbiA+IDAuMCkgLy8gY29ycmVjdCBvY2NsdXNpb24gYnkgZm9nIGZhY3RvclxyXG4gICAgZk9jY2x1c2lvbiA9IG1peChmT2NjbHVzaW9uLCAwLjAsIGdldEZvZyh2Y3RQb3NpdGlvbikpO1xyXG4gIFxyXG4gIHZjdEZyYWcucmdiID0gdmVjMyhmT2NjbHVzaW9uKTtcclxuICB2Y3RGcmFnLmEgPSAxLjA7XHJcbn1gO1xuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyQmxvb20uZnJhZ1wiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiAqIEV4dHJhY3RzIGNvbG9ycywgZG93bnNhbXBsZXMgYW5kIHVwc2FtcGxlcyBhIHRleHR1cmVcclxuICogQWRhcHRpb24gb2YgdGhlIFwiZHVhbCBmaWx0ZXJpbmcga2F3YXNlXCIgbWV0aG9kIGRlc2NyaWJlZCBpbiBTSUdHUkFQSCAyMDE1IGJ5IE1hcml1cyBCasO4cmdlXHJcbiAqIGh0dHBzOi8vY29tbXVuaXR5LmFybS5jb20vY2ZzLWZpbGUvX19rZXkvY29tbXVuaXR5c2VydmVyLWJsb2dzLWNvbXBvbmVudHMtd2VibG9nZmlsZXMvMDAtMDAtMDAtMjAtNjYvc2lnZ3JhcGgyMDE1XzJEMDBfbW1nXzJEMDBfbWFyaXVzXzJEMDBfbm90ZXMucGRmXHJcbiAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gKi9cclxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcbnByZWNpc2lvbiBoaWdocCBpbnQ7XHJcblxyXG51bmlmb3JtIGludCB1X2lNb2RlOyAvLyAwOiBleHRyYWN0LCAxOiBkb3duc2FtcGxlLCAyOiB1cHNhbXBsZSwgMzogYXBwbHlcclxudW5pZm9ybSBmbG9hdCB1X2ZUaHJlc2hvbGQ7XHJcbnVuaWZvcm0gZmxvYXQgdV9mSW50ZW5zaXR5O1xyXG51bmlmb3JtIGZsb2F0IHVfZkhpZ2hsaWdodERlc2F0dXJhdGlvbjtcclxudW5pZm9ybSB2ZWMyIHVfdmN0VGV4ZWw7XHJcblxyXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleFNvdXJjZTtcclxuXHJcbmluIHZlYzIgdl92Y3RUZXh0dXJlO1xyXG5vdXQgdmVjNCB2Y3RGcmFnO1xyXG5cclxuLy8gb2xkIGdhdXNzaWFuIGJsdXJcclxuLy8gZmxhdCBpbiB2ZWMyWzldIHZfdmN0T2Zmc2V0cztcclxuLy8gY29uc3QgZmxvYXQgZ2F1c3NpYW5LZXJuZWxbOV0gPSBmbG9hdFtdKDAuMDQ1LCAwLjEyMiwgMC4wNDUsIDAuMTIyLCAwLjMzMiwgMC4xMjIsIDAuMDQ1LCAwLjEyMiwgMC4wNDUpO1xyXG4vLyB2ZWM0IGRvd25zYW1wbGUodmVjMiBfdmN0VGV4dHVyZSkge1xyXG4vLyAgIHZlYzQgdmN0Q29sb3IgPSB2ZWM0KDAuMCk7XHJcbi8vICAgZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIFxyXG4vLyAgICAgdmN0Q29sb3IgKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgdl92Y3RUZXh0dXJlICsgdl92Y3RPZmZzZXRzW2ldKSAqIGdhdXNzaWFuS2VybmVsW2ldO1xyXG4vLyAgIHJldHVybiB2Y3RDb2xvcjtcclxuLy8gfVxyXG4vLyB2ZWM0IHVwc2FtcGxlKHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuLy8gICB2ZWM0IHZjdENvbG9yID0gdmVjNCgwLjApO1xyXG4vLyAgIGZvciAoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSBcclxuLy8gICAgIHZjdENvbG9yICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdl92Y3RPZmZzZXRzW2ldKSAqIGdhdXNzaWFuS2VybmVsW2ldO1xyXG4vLyAgIHJldHVybiB2Y3RDb2xvcjtcclxuLy8gfVxyXG5cclxuLy8gdmVjMyBleHRyYWN0KHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuLy8gICB2ZWMzIHZjdENvbG9yID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUpLnJnYjtcclxuLy8gICBpZihhbnkoZ3JlYXRlclRoYW4odmN0Q29sb3IsIHZlYzModV9mVGhyZXNob2xkKSkpKVxyXG4vLyAgICAgcmV0dXJuIHZjdENvbG9yO1xyXG4vLyAgIGRpc2NhcmQ7XHJcbi8vIH1cclxuXHJcbi8vIHZlYzMgZXh0cmFjdCh2ZWMyIF92Y3RUZXh0dXJlKSB7XHJcbi8vICAgdmVjMyB2Y3RDb2xvciA9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlKS5yZ2I7XHJcbi8vICAgZmxvYXQgbHVtaW5hbmNlID0gZG90KHZjdENvbG9yLCB2ZWMzKDAuMjk5LCAwLjU4NywgMC4xMTQpKTtcclxuLy8gICBpZihsdW1pbmFuY2UgPiB1X2ZUaHJlc2hvbGQpXHJcbi8vICAgICByZXR1cm4gdmN0Q29sb3I7XHJcbi8vICAgZGlzY2FyZDtcclxuLy8gfVxyXG5cclxuLy8gb2xkIGV4dHJhY3Rpb24gd2l0aCBhdmVyYWdlIGJyaWdodG5lc3NcclxudmVjMyBleHRyYWN0KHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuICB2ZWMzIHZjdENvbG9yID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUpLnJnYjtcclxuICBmbG9hdCBmVGhyZXNob2xkID0gdV9mVGhyZXNob2xkO1xyXG4gIGlmKGZUaHJlc2hvbGQgPj0gMS4wKVxyXG4gICAgZlRocmVzaG9sZCA9IDAuOTk5OTk5O1xyXG5cclxuICB2Y3RDb2xvciA9IHZjdENvbG9yIC0gZlRocmVzaG9sZDtcclxuICB2Y3RDb2xvciA9IHZjdENvbG9yIC8gKDEuMCAtIGZUaHJlc2hvbGQpOyAvLyBuZWdhdGl2ZSB2YWx1ZXMgbWlnaHQgcmVjZWl2ZSB2YWx1ZXMgYWJvdmUgMS4wLi4uXHJcbiAgXHJcbiAgZmxvYXQgYXZlcmFnZUJyaWdodG5lc3MgPSAoKCh2Y3RDb2xvci5yICsgdmN0Q29sb3IuZyArIHZjdENvbG9yLmIpIC8gMy4wKSAqIDAuMikgKyAwLjg7IC8vdGhlIGVmZmVjdCBpcyByZWR1Y2VkIGJ5IGZpcnN0IHNldHRpbmcgaXQgdG8gYSAwLjAtMC4yIHJhbmdlIGFuZCB0aGVuIGFkZGluZyAwLjhcclxuICB2Y3RDb2xvciA9IGNsYW1wKHZjdENvbG9yLCAwLjAsIDEuMCkgKiBjbGFtcChhdmVyYWdlQnJpZ2h0bmVzcywgMC4wLCAxLjApO1xyXG4gIHJldHVybiB2Y3RDb2xvcjtcclxufVxyXG5cclxudmVjNCBkb3duc2FtcGxlKHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuICB2ZWM0IHN1bSA9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlKSAqIDQuMDtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgLSB1X3ZjdFRleGVsLnh5KTtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB1X3ZjdFRleGVsLnh5KTtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKHVfdmN0VGV4ZWwueCwgLXVfdmN0VGV4ZWwueSkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSAtIHZlYzIodV92Y3RUZXhlbC54LCAtdV92Y3RUZXhlbC55KSk7XHJcblxyXG4gIHJldHVybiBzdW0gLyA4LjA7XHJcbn1cclxuXHJcbnZlYzQgdXBzYW1wbGUodmVjMiBfdmN0VGV4dHVyZSkge1xyXG4gIHZlYzQgc3VtID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKC11X3ZjdFRleGVsLnggKiAyLjAsIDAuMCkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIoLXVfdmN0VGV4ZWwueCwgdV92Y3RUZXhlbC55KSkgKiAyLjA7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMigwLjAsIHVfdmN0VGV4ZWwueSAqIDIuMCkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIodV92Y3RUZXhlbC54LCB1X3ZjdFRleGVsLnkpKSAqIDIuMDtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKHVfdmN0VGV4ZWwueCAqIDIuMCwgMC4wKSk7XHJcbiAgc3VtICs9IHRleHR1cmUodV90ZXhTb3VyY2UsIF92Y3RUZXh0dXJlICsgdmVjMih1X3ZjdFRleGVsLngsIC11X3ZjdFRleGVsLnkpKSAqIDIuMDtcclxuICBzdW0gKz0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUgKyB2ZWMyKDAuMCwgLXVfdmN0VGV4ZWwueSAqIDIuMCkpO1xyXG4gIHN1bSArPSB0ZXh0dXJlKHVfdGV4U291cmNlLCBfdmN0VGV4dHVyZSArIHZlYzIoLXVfdmN0VGV4ZWwueCwgLXVfdmN0VGV4ZWwueSkpICogMi4wO1xyXG4gIHJldHVybiBzdW0gLyAxMi4wO1xyXG59XHJcblxyXG52ZWMzIGFwcGx5KHZlYzIgX3ZjdFRleHR1cmUpIHtcclxuICB2ZWMzIHZjdEJsb29tID0gdGV4dHVyZSh1X3RleFNvdXJjZSwgX3ZjdFRleHR1cmUpLnJnYjtcclxuICBpZiAodmN0Qmxvb20uciA+PSAxLjAgfHwgdmN0Qmxvb20uZyA+PSAxLjAgfHwgdmN0Qmxvb20uYiA+PSAxLjApIC8vIG1heWJlIHVzZSB0aHJlc2hvbGQgaW5zdGVhZCBvZiAxLjA/XHJcbiAgICB2Y3RCbG9vbSA9IG1peCh2Y3RCbG9vbSwgdmVjMygxLjApLCB1X2ZIaWdobGlnaHREZXNhdHVyYXRpb24pO1xyXG4gIHZjdEJsb29tID0gY2xhbXAodmN0Qmxvb20gKiB1X2ZJbnRlbnNpdHksIDAuMCwgMS4wKTtcclxuICByZXR1cm4gdmN0Qmxvb207XHJcbn1cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICBzd2l0Y2godV9pTW9kZSkge1xyXG4gICAgY2FzZSAwOlxyXG4gICAgICB2Y3RGcmFnLnJnYiA9IGV4dHJhY3Qodl92Y3RUZXh0dXJlKTtcclxuICAgICAgdmN0RnJhZy5hID0gMS4wO1xyXG4gICAgICByZXR1cm47XHJcbiAgICBjYXNlIDE6XHJcbiAgICAgIHZjdEZyYWcgPSBkb3duc2FtcGxlKHZfdmN0VGV4dHVyZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIGNhc2UgMjpcclxuICAgICAgdmN0RnJhZyA9IHVwc2FtcGxlKHZfdmN0VGV4dHVyZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIGNhc2UgMzpcclxuICAgICAgdmN0RnJhZy5yZ2IgPSBhcHBseSh2X3ZjdFRleHR1cmUpO1xyXG4gICAgICB2Y3RGcmFnLmEgPSAxLjA7XHJcbiAgICAgIHJldHVybjtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHZjdEZyYWcgPSB0ZXh0dXJlKHVfdGV4U291cmNlLCB2X3ZjdFRleHR1cmUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgfVxyXG59YDtcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlckdpem1vLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIC4uLlxyXG4qIEBhdXRob3JzIEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbnVuaWZvcm0gdmVjNCB1X3ZjdENvbG9yO1xyXG5cclxub3V0IHZlYzQgdmN0RnJhZztcclxuXHJcbi8vIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4RGVwdGhTdGVuY2lsO1xyXG4jaWYgZGVmaW5lZChURVhUVVJFKVxyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Q29sb3I7XHJcbiAgaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcbiNlbmRpZlxyXG5cclxuLy8gLy8gNHg0IEJheWVyIG1hdHJpeCBmb3IgZGl0aGVyaW5nXHJcbi8vIGNvbnN0IGZsb2F0IG10eERpdGhlclsxNl0gPSBmbG9hdFtdKFxyXG4vLyAgIDEuMCAvIDE3LjAsICA5LjAgLyAxNy4wLCAgMy4wIC8gMTcuMCwgMTEuMCAvIDE3LjAsXHJcbi8vICAgMTMuMCAvIDE3LjAsICA1LjAgLyAxNy4wLCAxNS4wIC8gMTcuMCwgIDcuMCAvIDE3LjAsXHJcbi8vICAgNC4wIC8gMTcuMCwgMTIuMCAvIDE3LjAsICAyLjAgLyAxNy4wLCAxMC4wIC8gMTcuMCxcclxuLy8gICAxNi4wIC8gMTcuMCwgIDguMCAvIDE3LjAsIDE0LjAgLyAxNy4wLCAgNi4wIC8gMTcuMFxyXG4vLyApO1xyXG5cclxudm9pZCBtYWluKCkge1xyXG4gIHZjdEZyYWcgPSB1X3ZjdENvbG9yO1xyXG5cclxuICAjaWYgZGVmaW5lZChURVhUVVJFKVxyXG5cclxuICAgICAgdmN0RnJhZyAqPSB0ZXh0dXJlKHVfdGV4Q29sb3IsIHZfdmN0VGV4dHVyZSk7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAvLyBpbnQgeCA9IGludChnbF9GcmFnQ29vcmQueCkgJSA0O1xyXG4gIC8vIGludCB5ID0gaW50KGdsX0ZyYWdDb29yZC55KSAlIDQ7XHJcbiAgLy8gaW50IGluZGV4ID0geSAqIDQgKyB4O1xyXG4gIC8vIC8vIERpc2NhcmQgdGhlIGZyYWdtZW50IGlmIGl0cyBhbHBoYSBpcyBsZXNzIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIGRpdGhlcmluZyBtYXRyaXhcclxuICAvLyBpZiAodmN0RnJhZy5hIDwgbXR4RGl0aGVyW2luZGV4XSkgXHJcbiAgLy8gICBkaXNjYXJkO1xyXG5cclxuICAvLyAvLyBEaXNjYXJkIHRoZSBmcmFnbWVudCBpZiBpdHMgYWxwaGEgaXMgMFxyXG4gIC8vIGlmICh2Y3RGcmFnLmEgPT0gMC4wKVxyXG4gIC8vICAgZGlzY2FyZDtcclxuXHJcbiAgLy8gLy8gQ3JlYXRlIGEgY2hlY2tlcmJvYXJkIHBhdHRlcm4gZm9yIGFscGhhIHZhbHVlcyBsZXNzIHRoYW4gMC41XHJcbiAgLy8gZWxzZSBpZiAodmN0RnJhZy5hIDwgMC41ICYmICgoeCArIHkpICUgMiA9PSAwKSlcclxuICAvLyAgIGRpc2NhcmQ7XHJcblxyXG4gIC8vIHZjdEZyYWcuYSA9IDEuMDtcclxuXHJcbiAgaWYgKHZjdEZyYWcuYSA8IDAuMDEpXHJcbiAgICBkaXNjYXJkO1xyXG5cclxuICAvLyBwcmVtdWx0aXBseSBhbHBoYSBmb3IgYmxlbmRpbmdcclxuICB2Y3RGcmFnLnJnYiAqPSB2Y3RGcmFnLmE7XHJcbn1gO1xuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8udmVydFwiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogLi4uXHJcbiogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxuLy8gdW5pZm9ybSBtYXQ0IHVfbXR4Vmlld1Byb2plY3Rpb247XHJcbi8vIHVuaWZvcm0gbWF0NCB1X210eE1vZGVsO1xyXG51bmlmb3JtIG1hdDQgdV9tdHhNZXNoVG9WaWV3OyAvLyBtb2RlbC12aWV3LXByb2plY3Rpb24gbWF0cml4XHJcblxyXG5pbiB2ZWMzIGFfdmN0UG9zaXRpb247XHJcblxyXG4jaWYgZGVmaW5lZChURVhUVVJFKVxyXG5cclxuICBpbiB2ZWMyIGFfdmN0VGV4dHVyZTtcclxuICBvdXQgdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4jZW5kaWZcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICBnbF9Qb3NpdGlvbiA9IHVfbXR4TWVzaFRvVmlldyAqIHZlYzQoYV92Y3RQb3NpdGlvbiwgMS4wKTtcclxuXHJcbiAgI2lmIGRlZmluZWQoVEVYVFVSRSlcclxuXHJcbiAgICB2X3ZjdFRleHR1cmUgPSBhX3ZjdFRleHR1cmU7XHJcblxyXG4gICNlbmRpZlxyXG59YDtcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclBob25nLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIFBob25nIHNoYWRpbmdcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMiB8IFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKb25hcyBQbG90emt5LCBIRlUsIDIwMjNcclxuKi9cclxuXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSB2ZWM0IHVfdmN0Q29sb3I7XHJcbnVuaWZvcm0gZmxvYXQgdV9mRGlmZnVzZTtcclxudW5pZm9ybSBmbG9hdCB1X2ZTcGVjdWxhcjtcclxudW5pZm9ybSBmbG9hdCB1X2ZJbnRlbnNpdHk7XHJcbnVuaWZvcm0gZmxvYXQgdV9mTWV0YWxsaWM7XHJcbnVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTtcclxuXHJcbnVuaWZvcm0gYm9vbCB1X2JGb2c7XHJcbnVuaWZvcm0gdmVjNCB1X3ZjdEZvZ0NvbG9yO1xyXG51bmlmb3JtIGZsb2F0IHVfZkZvZ05lYXI7XHJcbnVuaWZvcm0gZmxvYXQgdV9mRm9nRmFyO1xyXG5cclxuaW4gdmVjNCB2X3ZjdENvbG9yO1xyXG5pbiB2ZWMzIHZfdmN0UG9zaXRpb247XHJcblxyXG5sYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgdmVjNCB2Y3RGcmFnO1xyXG5sYXlvdXQobG9jYXRpb24gPSAxKSBvdXQgdmVjNCB2Y3RGcmFnUG9zaXRpb247XHJcbmxheW91dChsb2NhdGlvbiA9IDIpIG91dCB2ZWM0IHZjdEZyYWdOb3JtYWw7XHJcblxyXG4jaWZkZWYgUEhPTkdcclxuXHJcbiAgaW4gdmVjMyB2X3ZjdE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIEZMQVRcclxuXHJcbiAgZmxhdCBpbiB2ZWMzIHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuI2VuZGlmXHJcblxyXG5zdHJ1Y3QgTGlnaHQge1xyXG4gIHZlYzQgdmN0Q29sb3I7XHJcbiAgbWF0NCBtdHhTaGFwZTtcclxuICBtYXQ0IG10eFNoYXBlSW52ZXJzZTtcclxufTtcclxuXHJcbmNvbnN0IHVpbnQgTUFYX0xJR0hUU19ESVJFQ1RJT05BTCA9IDE1dTtcclxuY29uc3QgdWludCBNQVhfTElHSFRTX1BPSU5UID0gMTAwdTtcclxuY29uc3QgdWludCBNQVhfTElHSFRTX1NQT1QgPSAxMDB1O1xyXG5cclxubGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBMaWdodHMge1xyXG4gIHVpbnQgdV9uTGlnaHRzRGlyZWN0aW9uYWw7XHJcbiAgdWludCB1X25MaWdodHNQb2ludDtcclxuICB1aW50IHVfbkxpZ2h0c1Nwb3Q7XHJcbiAgdWludCBwYWRkaW5nOyAvLyBBZGQgcGFkZGluZyB0byBhbGlnbiB0byAxNiBieXRlc1xyXG4gIExpZ2h0IHVfYW1iaWVudDtcclxuICBMaWdodCB1X2RpcmVjdGlvbmFsW01BWF9MSUdIVFNfRElSRUNUSU9OQUxdO1xyXG4gIExpZ2h0IHVfcG9pbnRbTUFYX0xJR0hUU19QT0lOVF07XHJcbiAgTGlnaHQgdV9zcG90W01BWF9MSUdIVFNfU1BPVF07XHJcbn07XHJcblxyXG4vLyBURVhUVVJFOiBpbnB1dCBVVnMgYW5kIHRleHR1cmVcclxuI2lmZGVmIFRFWFRVUkVcclxuXHJcbiAgaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhDb2xvcjtcclxuXHJcbiNlbmRpZlxyXG5cclxuLy8gTk9STUFMTUFQOiBpbnB1dCBVVnMgYW5kIHRleHR1cmVcclxuI2lmZGVmIE5PUk1BTE1BUFxyXG5cclxuICBpbiB2ZWMzIHZfdmN0VGFuZ2VudDtcclxuICBpbiB2ZWMzIHZfdmN0Qml0YW5nZW50O1xyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Tm9ybWFsO1xyXG5cclxuI2VuZGlmXHJcblxyXG4vLyBSZXR1cm5zIGEgdmVjdG9yIGZvciB2aXN1YWxpemluZyBvbiBtb2RlbC4gR3JlYXQgZm9yIGRlYnVnZ2luZ1xyXG52ZWM0IHNob3dWZWN0b3JBc0NvbG9yKHZlYzMgX3ZlY3RvciwgYm9vbCBfY2xhbXApIHtcclxuICBpZihfY2xhbXApIHtcclxuICAgIF92ZWN0b3IgKj0gMC41O1xyXG4gICAgX3ZlY3RvciArPSAwLjU7XHJcbiAgfVxyXG4gIHJldHVybiB2ZWM0KF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnosIDEpO1xyXG59XHJcblxyXG52b2lkIGlsbHVtaW5hdGVEaXJlY3RlZCh2ZWMzIF92Y3REaXJlY3Rpb24sIHZlYzMgX3ZjdFZpZXcsIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMyBfdmN0Q29sb3IsIGlub3V0IHZlYzMgX3ZjdERpZmZ1c2UsIGlub3V0IHZlYzMgX3ZjdFNwZWN1bGFyKSB7XHJcbiAgdmVjMyB2Y3REaXJlY3Rpb24gPSBub3JtYWxpemUoX3ZjdERpcmVjdGlvbik7XHJcbiAgZmxvYXQgZklsbHVtaW5hdGlvbiA9IC1kb3QoX3ZjdE5vcm1hbCwgdmN0RGlyZWN0aW9uKTtcclxuICBpZihmSWxsdW1pbmF0aW9uID4gMC4wKSB7XHJcbiAgICBfdmN0RGlmZnVzZSArPSB1X2ZEaWZmdXNlICogZklsbHVtaW5hdGlvbiAqIF92Y3RDb2xvcjtcclxuXHJcbiAgICBpZih1X2ZTcGVjdWxhciA8PSAwLjApXHJcbiAgICAgIHJldHVybjtcclxuICAgICAgXHJcbiAgICAvL0JMSU5OLVBob25nIFNoYWRpbmdcclxuICAgIHZlYzMgaGFsZndheURpciA9IG5vcm1hbGl6ZSgtdmN0RGlyZWN0aW9uIC0gX3ZjdFZpZXcpO1xyXG4gICAgZmxvYXQgZmFjdG9yID0gbWF4KGRvdCgtdmN0RGlyZWN0aW9uLCBfdmN0Tm9ybWFsKSwgMC4wKTsgLy9GYWN0b3IgZm9yIHNtb290aGluZyBvdXQgdHJhbnNpdGlvbiBmcm9tIHN1cmZhY2UgZmFjaW5nIHRoZSBsaWdodHNvdXJjZSB0byBzdXJmYWNlIGZhY2luZyBhd2F5IGZyb20gdGhlIGxpZ2h0c291cmNlXHJcbiAgICBmYWN0b3IgPSAxLjAgLSAocG93KGZhY3RvciAtIDEuMCwgOC4wKSk7ICAgICAgICAgICAgICAgICAvL1RoZSBmYWN0b3IgaXMgYWx0ZXJlZCBpbiBvcmRlciB0byBjbGVhcmx5IHNlZSB0aGUgc3BlY3VsYXIgaGlnaGxpZ2h0IGV2ZW4gYXQgc3RlZXAgYW5nbGVzLCB3aGlsZSBzdGlsbCBwcmV2ZW50aW5nIGFydGlmYWN0c1xyXG5cclxuICAgIF92Y3RTcGVjdWxhciArPSBwb3cobWF4KGRvdChfdmN0Tm9ybWFsLCBoYWxmd2F5RGlyKSwgMC4wKSwgZXhwMih1X2ZTcGVjdWxhciAqIDUuMCkpICogdV9mU3BlY3VsYXIgKiB1X2ZJbnRlbnNpdHkgKiBmYWN0b3IgKiBfdmN0Q29sb3I7XHJcbiAgfVxyXG59XHJcblxyXG5mbG9hdCBnZXRGb2codmVjMyBfdmN0UG9zaXRpb24pIHtcclxuICBmbG9hdCBmRGlzdGFuY2UgPSBsZW5ndGgoX3ZjdFBvc2l0aW9uIC0gdV92Y3RDYW1lcmEpOyAvLyBtYXliZSB1c2Ugei1kZXB0aCBpbnN0ZWFkIG9mIGV1Y2xpZGVhbiBkZXB0aFxyXG4gIGZsb2F0IGZGb2cgPSBjbGFtcCgoZkRpc3RhbmNlIC0gdV9mRm9nTmVhcikgLyAodV9mRm9nRmFyIC0gdV9mRm9nTmVhciksIDAuMCwgMS4wKTtcclxuICBmRm9nID0gLXBvdyhmRm9nLCAyLjApICsgKDIuMCAqIGZGb2cpOyAvLyBsZXRzIGZvZyBhcHBlYXIgcXVpY2tlciBhbmQgZmFsbCBvZmYgc2xvd2VyIHJlc3VsdHMgaW4gYSBtb3JlIGdyYWR1YWwgZmFsbG9mZlxyXG4gIHJldHVybiBmRm9nO1xyXG59XHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgI2lmIGRlZmluZWQoUEhPTkcpICYmICFkZWZpbmVkKEZMQVQpXHJcblxyXG4gICAgI2lmZGVmIE5PUk1BTE1BUFxyXG5cclxuICAgICAgbWF0MyBtdHhUQk4gPSBtYXQzKG5vcm1hbGl6ZSh2X3ZjdFRhbmdlbnQpLCBub3JtYWxpemUodl92Y3RCaXRhbmdlbnQpLCBub3JtYWxpemUodl92Y3ROb3JtYWwpKTtcclxuICAgICAgdmVjMyB2Y3ROb3JtYWwgPSB0ZXh0dXJlKHVfdGV4Tm9ybWFsLCB2X3ZjdFRleHR1cmUpLnh5eiAqIDIuMCAtIDEuMDtcclxuICAgICAgdmN0Tm9ybWFsID0gbm9ybWFsaXplKG10eFRCTiAqIHZjdE5vcm1hbCk7XHJcblxyXG4gICAgI2Vsc2VcclxuXHJcbiAgICAgIHZlYzMgdmN0Tm9ybWFsID0gbm9ybWFsaXplKHZfdmN0Tm9ybWFsKTtcclxuXHJcbiAgICAjZW5kaWZcclxuXHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodl92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTtcclxuICAgIHZlYzMgdmN0UG9zaXRpb24gPSB2X3ZjdFBvc2l0aW9uO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmZGVmIEZMQVRcclxuXHJcbiAgICB2ZWMzIHZjdEZkeCA9IGRGZHgodl92Y3RQb3NpdGlvbik7XHJcbiAgICB2ZWMzIHZjdEZkeSA9IGRGZHkodl92Y3RQb3NpdGlvbik7XHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IG5vcm1hbGl6ZShjcm9zcyh2Y3RGZHgsIHZjdEZkeSkpO1xyXG4gICAgdmVjMyB2Y3RWaWV3ID0gbm9ybWFsaXplKHZfdmN0UG9zaXRpb25GbGF0IC0gdV92Y3RDYW1lcmEpO1xyXG4gICAgdmVjMyB2Y3RQb3NpdGlvbiA9IHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgdmVjMyB2Y3REaWZmdXNlID0gdV9mRGlmZnVzZSAqIHVfYW1iaWVudC52Y3RDb2xvci5yZ2I7XHJcbiAgdmVjMyB2Y3RTcGVjdWxhciA9IHZlYzMoMCwgMCwgMCk7XHJcblxyXG4gIC8vIGNhbGN1bGF0ZSBkaXJlY3Rpb25hbCBsaWdodCBlZmZlY3RcclxuICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNEaXJlY3Rpb25hbDsgaSsrKSB7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IHZlYzModV9kaXJlY3Rpb25hbFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDEuMCwgMS4wKSk7XHJcbiAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfZGlyZWN0aW9uYWxbaV0udmN0Q29sb3IucmdiLCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgfVxyXG5cclxuICAvLyBjYWxjdWxhdGUgcG9pbnQgbGlnaHQgZWZmZWN0XHJcbiAgZm9yKHVpbnQgaSA9IDB1OyBpIDwgdV9uTGlnaHRzUG9pbnQ7IGkrKykge1xyXG4gICAgdmVjMyB2Y3RQb3NpdGlvbkxpZ2h0ID0gdmVjMyh1X3BvaW50W2ldLm10eFNoYXBlICogdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApKTtcclxuICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24gLSB2Y3RQb3NpdGlvbkxpZ2h0O1xyXG4gICAgZmxvYXQgZkludGVuc2l0eSA9IDEuMCAtIGxlbmd0aChtYXQzKHVfcG9pbnRbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIHZjdERpcmVjdGlvbik7XHJcbiAgICBpZihmSW50ZW5zaXR5IDwgMC4wKVxyXG4gICAgICBjb250aW51ZTtcclxuXHJcbiAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfcG9pbnRbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdmN0RGlmZnVzZSwgdmN0U3BlY3VsYXIpO1xyXG4gIH1cclxuXHJcbiAgLy8gY2FsY3VsYXRlIHNwb3QgbGlnaHQgZWZmZWN0XHJcbiAgZm9yKHVpbnQgaSA9IDB1OyBpIDwgdV9uTGlnaHRzU3BvdDsgaSsrKSB7XHJcbiAgICB2ZWMzIHZjdFBvc2l0aW9uTGlnaHQgPSB2ZWMzKHVfc3BvdFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IHZjdFBvc2l0aW9uIC0gdmN0UG9zaXRpb25MaWdodDtcclxuICAgIHZlYzMgdmN0RGlyZWN0aW9uSW52ZXJ0ZWQgPSBtYXQzKHVfc3BvdFtpXS5tdHhTaGFwZUludmVyc2UpICogdmN0RGlyZWN0aW9uO1xyXG4gICAgaWYodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiA8PSAwLjApXHJcbiAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgIGZsb2F0IGZJbnRlbnNpdHkgPSAxLjAgLSBtaW4oMS4wLCAyLjAgKiBsZW5ndGgodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueHkpIC8gdmN0RGlyZWN0aW9uSW52ZXJ0ZWQueik7ICAgIC8vQ29uZXNoYXBlIHRoYXQgaXMgYnJpZ2h0ZXN0IGluIHRoZSBjZW50ZXIuIFBvc3NpYmxlIFRPRE86IFwiVmFyaWFibGUgU3BvdGxpZ2h0c29mdG5lc3NcIlxyXG4gICAgZkludGVuc2l0eSAqPSAxLjAgLSBwb3codmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiwgMi4wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QcmV2ZW50cyBoYXJzaCBsaWdodGluZyBhcnRpZmFjdHMgYXQgYm91bmRhcnkgb2YgdGhlIGdpdmVuIHNwb3RsaWdodFxyXG4gICAgaWYoZkludGVuc2l0eSA8IDAuMClcclxuICAgICAgY29udGludWU7XHJcblxyXG4gICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3Nwb3RbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdmN0RGlmZnVzZSwgdmN0U3BlY3VsYXIpO1xyXG4gIH1cclxuXHJcbiAgdmN0RnJhZy5yZ2IgPSB2Y3REaWZmdXNlICsgdmN0U3BlY3VsYXIgKiB1X2ZNZXRhbGxpYztcclxuICB2Y3RGcmFnLmEgPSAxLjA7XHJcblxyXG4gICNpZmRlZiBURVhUVVJFXHJcblxyXG4gICAgdmVjNCB2Y3RDb2xvclRleHR1cmUgPSB0ZXh0dXJlKHVfdGV4Q29sb3IsIHZfdmN0VGV4dHVyZSk7XHJcbiAgICB2Y3RGcmFnICo9IHZjdENvbG9yVGV4dHVyZTtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gIHZjdEZyYWcgKj0gdV92Y3RDb2xvciAqIHZfdmN0Q29sb3I7XHJcbiAgdmN0RnJhZy5yZ2IgKz0gdmN0U3BlY3VsYXIgKiAoMS4wIC0gdV9mTWV0YWxsaWMpO1xyXG5cclxuICB2Y3RGcmFnUG9zaXRpb24gPSB2ZWM0KHZfdmN0UG9zaXRpb24sIDEuMCk7IC8vIGRvbid0IHVzZSBmbGF0IGhlcmUsIGJlY2F1c2Ugd2Ugd2FudCB0byBpbnRlcnBvbGF0ZSB0aGUgcG9zaXRpb25cclxuICB2Y3RGcmFnTm9ybWFsID0gdmVjNCh2Y3ROb3JtYWwsIDEuMCk7XHJcblxyXG4gIGlmICh1X2JGb2cpIFxyXG4gICAgdmN0RnJhZy5yZ2IgPSBtaXgodmN0RnJhZy5yZ2IsIHVfdmN0Rm9nQ29sb3IucmdiLCBnZXRGb2codmN0UG9zaXRpb24pICogdV92Y3RGb2dDb2xvci5hKTtcclxuXHJcbiAgdmN0RnJhZy5yZ2IgKj0gdmN0RnJhZy5hO1xyXG5cclxuICBpZih2Y3RGcmFnLmEgPCAwLjAxKVxyXG4gICAgZGlzY2FyZDtcclxufWA7XG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrLmZyYWdcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIFJlbmRlcnMgZm9yIFJheWNhc3RpbmdcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbnVuaWZvcm0gaW50IHVfaWQ7XHJcbnVuaWZvcm0gdmVjMiB1X3ZjdFNpemU7XHJcbnVuaWZvcm0gdmVjNCB1X3ZjdENvbG9yO1xyXG5vdXQgaXZlYzQgdmN0RnJhZztcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICAgIGludCBwaXhlbCA9IGludCh0cnVuYyhnbF9GcmFnQ29vcmQueCkgKyB1X3ZjdFNpemUueCAqIHRydW5jKGdsX0ZyYWdDb29yZC55KSk7XHJcblxyXG4gICAgaWYgKHBpeGVsICE9IHVfaWQpXHJcbiAgICAgIGRpc2NhcmQ7XHJcblxyXG4gICAgdWludCBpY29sb3IgPSB1aW50KHVfdmN0Q29sb3IuciAqIDI1NS4wKSA8PCAyNCB8IHVpbnQodV92Y3RDb2xvci5nICogMjU1LjApIDw8IDE2IHwgdWludCh1X3ZjdENvbG9yLmIgKiAyNTUuMCkgPDwgOCB8IHVpbnQodV92Y3RDb2xvci5hICogMjU1LjApO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICB2Y3RGcmFnID0gaXZlYzQoZmxvYXRCaXRzVG9JbnQoZ2xfRnJhZ0Nvb3JkLnopLCBpY29sb3IsIDAsIDApO1xyXG59YDtcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2sudmVydFwiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogUmVuZGVycyBmb3IgUmF5Y2FzdGluZ1xyXG4qIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiovXHJcbmluIHZlYzMgYV92Y3RQb3NpdGlvbjsgICAgICAgXHJcbnVuaWZvcm0gbWF0NCB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG52b2lkIG1haW4oKSB7ICAgXHJcbiAgICBnbF9Qb3NpdGlvbiA9IHVfbXR4TWVzaFRvVmlldyAqIHZlYzQoYV92Y3RQb3NpdGlvbiwgMS4wKTtcclxufWA7XG4gIHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrVGV4dHVyZWQuZnJhZ1wiXSA9IC8qZ2xzbCovIGAjdmVyc2lvbiAzMDAgZXNcclxuLyoqXHJcbiogUmVuZGVycyBmb3IgUmF5Y2FzdGluZ1xyXG4qIEBhdXRob3JzIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSBpbnQgdV9pZDtcclxudW5pZm9ybSB2ZWMyIHVfdmN0U2l6ZTtcclxuaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcbnVuaWZvcm0gdmVjNCB1X3ZjdENvbG9yO1xyXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleENvbG9yO1xyXG5cclxub3V0IGl2ZWM0IHZjdEZyYWc7XHJcblxyXG52b2lkIG1haW4oKSB7XHJcbiAgaW50IHBpeGVsID0gaW50KHRydW5jKGdsX0ZyYWdDb29yZC54KSArIHVfdmN0U2l6ZS54ICogdHJ1bmMoZ2xfRnJhZ0Nvb3JkLnkpKTtcclxuXHJcbiAgaWYgKHBpeGVsICE9IHVfaWQpXHJcbiAgICBkaXNjYXJkO1xyXG4gIFxyXG4gIHZlYzQgdmN0Q29sb3IgPSB1X3ZjdENvbG9yICogdGV4dHVyZSh1X3RleENvbG9yLCB2X3ZjdFRleHR1cmUpO1xyXG4gIHVpbnQgaWNvbG9yID0gdWludCh2Y3RDb2xvci5yICogMjU1LjApIDw8IDI0IHwgdWludCh2Y3RDb2xvci5nICogMjU1LjApIDw8IDE2IHwgdWludCh2Y3RDb2xvci5iICogMjU1LjApIDw8IDggfCB1aW50KHZjdENvbG9yLmEgKiAyNTUuMCk7XHJcbiAgXHJcbiAgdmN0RnJhZyA9IGl2ZWM0KGZsb2F0Qml0c1RvSW50KGdsX0ZyYWdDb29yZC56KSwgaWNvbG9yLCBmbG9hdEJpdHNUb0ludCh2X3ZjdFRleHR1cmUueCksIGZsb2F0Qml0c1RvSW50KHZfdmN0VGV4dHVyZS55KSk7XHJcbn1gO1xuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyUGlja1RleHR1cmVkLnZlcnRcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbi8qKlxyXG4qIFJlbmRlcnMgZm9yIFJheWNhc3RpbmdcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAxOVxyXG4qL1xyXG5pbiB2ZWMzIGFfdmN0UG9zaXRpb247ICAgICAgIFxyXG5pbiB2ZWMyIGFfdmN0VGV4dHVyZTtcclxudW5pZm9ybSBtYXQ0IHVfbXR4TWVzaFRvVmlldztcclxudW5pZm9ybSBtYXQzIHVfbXR4UGl2b3Q7XHJcblxyXG5vdXQgdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG52b2lkIG1haW4oKSB7ICAgXHJcbiAgZ2xfUG9zaXRpb24gPSB1X210eE1lc2hUb1ZpZXcgKiB2ZWM0KGFfdmN0UG9zaXRpb24sIDEuMCk7XHJcbiAgdl92Y3RUZXh0dXJlID0gKHVfbXR4UGl2b3QgKiB2ZWMzKGFfdmN0VGV4dHVyZSwgMS4wKSkueHk7XHJcbn1gO1xuICBzaGFkZXJTb3VyY2VzW1wiU2hhZGVyU2NyZWVuLnZlcnRcIl0gPSAvKmdsc2wqLyBgI3ZlcnNpb24gMzAwIGVzXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG4vKipcclxuICogQ3JlYXRlcyBhIGZ1bGxzY3JlZW4gdHJpYW5nbGUgd2hpY2ggY290YWlucyB0aGUgc2NyZWVuIHF1YWQgYW5kIHNldHMgdGhlIHRleHR1cmUgY29vcmRpbmF0ZXMgYWNjb3JkaW5nbHkuXHJcbiAqIEBhdXRob3JzIFJvbGFuZCBIZWVyLCBIRlUsIDIwMjMgfCBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMyB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4gKlxyXG4gKiAgMiAgMyAuXHJcbiAqICAgICAgIC4gIC5cclxuICogICAgICAgLiAgICAgLiAgXHJcbiAqICAgICAgIC4gICAgICAgIC5cclxuICogIDEgIDEgLi4uLi4uLi4uLiAgLlxyXG4gKiAgICAgICAuIHNjcmVlbiAuICAgICAuXHJcbiAqICAgICAgIC4gIHF1YWQgIC4gICAgICAgIC5cclxuICogIDAgLTEgLi4uLi4uLi4uLiAgLiAgLiAgLiAgLlxyXG4gKiAgICBwIC0xICAgICAgICAxICAgICAgICAgICAzXHJcbiAqICB0ICAgIDAgICAgICAgIDEgICAgICAgICAgIDJcclxuICogIFxyXG4gKiAgcCA9PSBwb3N0aW9uXHJcbiAqICB0ID09IHRleHR1cmUgY29vcmRpbmF0ZVxyXG4gKi9cclxuXHJcbnVuaWZvcm0gZmxvYXQgdV93aWR0aDtcclxudW5pZm9ybSBmbG9hdCB1X2hlaWdodDtcclxudW5pZm9ybSB2ZWMyIHVfdmN0UmVzb2x1dGlvbjtcclxuXHJcbm91dCB2ZWMyIHZfdmN0VGV4dHVyZTtcclxuXHJcbiNpZmRlZiBTQU1QTEVcclxuXHJcbiAgZmxhdCBvdXQgdmVjMls5XSB2X3ZjdE9mZnNldHM7XHJcblxyXG4jZW5kaWZcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuICBmbG9hdCB4ID0gZmxvYXQoKGdsX1ZlcnRleElEICUgMikgKiA0KTsgLy8gMCwgNCwgMFxyXG4gIGZsb2F0IHkgPSBmbG9hdCgoZ2xfVmVydGV4SUQgLyAyKSAqIDQpOyAvLyAwLCAwLCA0XHJcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHggLSAxLjAsIHkgLSAxLjAsIDAuMCwgMS4wKTsgLy8gKC0xLCAtMSksICgzLCAtMSksICgtMSwgMylcclxuICB2X3ZjdFRleHR1cmUgPSB2ZWMyKHggLyAyLjAsIHkgLyAyLjApOyAgLy8gKDAsIDApLCAoMiwgMCksICgwLCAyKSAtPiBpbnRlcnBvbGF0aW9uIHdpbGwgeWllbGQgKDAsIDApLCAoMSwgMCksICgwLCAxKSBhcyB0aGUgcG9zaXRpb25zIGFyZSBkb3VibGUgdGhlIHNpemUgb2YgdGhlIHNjcmVlblxyXG5cclxuICAjaWZkZWYgU0FNUExFXHJcblxyXG4gICAgdmVjMiBvZmZzZXQgPSB2ZWMyKDEuMCAvIHVfdmN0UmVzb2x1dGlvbi54LCAxLjAgLyB1X3ZjdFJlc29sdXRpb24ueSk7XHJcbiAgICB2X3ZjdE9mZnNldHMgPSB2ZWMyW10oXHJcbiAgICAgIHZlYzIoLW9mZnNldC54LCBvZmZzZXQueSksICB2ZWMyKDAuMCwgb2Zmc2V0LnkpLCAgdmVjMihvZmZzZXQueCwgb2Zmc2V0LnkpLFxyXG4gICAgICB2ZWMyKC1vZmZzZXQueCwgMC4wKSwgICAgICAgdmVjMigwLjAsIDAuMCksICAgICAgIHZlYzIob2Zmc2V0LngsIDAuMCksXHJcbiAgICAgIHZlYzIoLW9mZnNldC54LCAtb2Zmc2V0LnkpLCB2ZWMyKDAuMCwgLW9mZnNldC55KSwgIHZlYzIob2Zmc2V0LngsIC1vZmZzZXQueSlcclxuICAgICk7XHJcblxyXG4gICNlbmRpZlxyXG59YDtcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclVuaXZlcnNhbC5mcmFnXCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuKiBVbml2ZXJzYWwgU2hhZGVyIGFzIGJhc2UgZm9yIG1hbnkgb3RoZXJzLiBDb250cm9sbGVkIGJ5IGNvbXBpbGVyIGRpcmVjdGl2ZXNcclxuKiBAYXV0aG9ycyBKaXJrYSBEZWxsJ09yby1GcmllZGwsIEhGVSwgMjAyMSB8IEpvbmFzIFBsb3R6a3ksIEhGVSwgMjAyM1xyXG4qL1xyXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxucHJlY2lzaW9uIGhpZ2hwIGludDtcclxuXHJcbi8vIE1JTklNQUxcclxudW5pZm9ybSB2ZWM0IHVfdmN0Q29sb3I7XHJcbnVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTsgLy8gbmVlZGVkIGZvciBmb2dcclxudW5pZm9ybSBmbG9hdCB1X2ZBbHBoYUNsaXA7XHJcblxyXG5sYXlvdXQoc3RkMTQwKSB1bmlmb3JtIEZvZyB7XHJcbiAgYm9vbCB1X2JGb2dBY3RpdmU7XHJcbiAgZmxvYXQgdV9mRm9nTmVhcjtcclxuICBmbG9hdCB1X2ZGb2dGYXI7XHJcbiAgZmxvYXQgZm9nUGFkZGluZzsgLy8gYWRkIHBhZGRpbmcgdG8gYWxpZ24gdG8gMTYgYnl0ZXNcclxuICB2ZWM0IHVfdmN0Rm9nQ29sb3I7XHJcbn07XHJcblxyXG5pbiB2ZWMzIHZfdmN0UG9zaXRpb247XHJcbmluIHZlYzQgdl92Y3RDb2xvcjtcclxuXHJcbmxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0IHZjdEZyYWc7XHJcbmxheW91dChsb2NhdGlvbiA9IDEpIG91dCB2ZWM0IHZjdEZyYWdQb3NpdGlvbjsgLy8gVE9ETzogbWFrZSB0aGVzZSBvcHRpb25hbD9cclxubGF5b3V0KGxvY2F0aW9uID0gMikgb3V0IHZlYzQgdmN0RnJhZ05vcm1hbDtcclxuXHJcbiNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgaW4gdmVjMyB2X3ZjdE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoRkxBVClcclxuXHJcbiAgZmxhdCBpbiB2ZWMzIHZfdmN0UG9zaXRpb25GbGF0O1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChHT1VSQVVEKVxyXG5cclxuICB1bmlmb3JtIGZsb2F0IHVfZk1ldGFsbGljO1xyXG4gIGluIHZlYzMgdl92Y3REaWZmdXNlO1xyXG4gIGluIHZlYzMgdl92Y3RTcGVjdWxhcjtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoVE9PTilcclxuXHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhUb29uO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChQSE9ORykgfHwgZGVmaW5lZChGTEFUKVxyXG5cclxuICB1bmlmb3JtIGZsb2F0IHVfZkRpZmZ1c2U7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZTcGVjdWxhcjtcclxuICB1bmlmb3JtIGZsb2F0IHVfZkludGVuc2l0eTtcclxuICB1bmlmb3JtIGZsb2F0IHVfZk1ldGFsbGljO1xyXG5cclxuICBzdHJ1Y3QgTGlnaHQge1xyXG4gICAgdmVjNCB2Y3RDb2xvcjtcclxuICAgIG1hdDQgbXR4U2hhcGU7XHJcbiAgICBtYXQ0IG10eFNoYXBlSW52ZXJzZTtcclxuICB9O1xyXG5cclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfRElSRUNUSU9OQUwgPSAxNXU7XHJcbiAgY29uc3QgdWludCBNQVhfTElHSFRTX1BPSU5UID0gMTAwdTtcclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfU1BPVCA9IDEwMHU7XHJcblxyXG4gIGxheW91dChzdGQxNDApIHVuaWZvcm0gTGlnaHRzIHtcclxuICAgIHVpbnQgdV9uTGlnaHRzRGlyZWN0aW9uYWw7XHJcbiAgICB1aW50IHVfbkxpZ2h0c1BvaW50O1xyXG4gICAgdWludCB1X25MaWdodHNTcG90O1xyXG4gICAgdWludCBsaWd0aHNQYWRkaW5nOyAvLyBBZGQgcGFkZGluZyB0byBhbGlnbiB0byAxNiBieXRlc1xyXG4gICAgTGlnaHQgdV9hbWJpZW50O1xyXG4gICAgTGlnaHQgdV9kaXJlY3Rpb25hbFtNQVhfTElHSFRTX0RJUkVDVElPTkFMXTtcclxuICAgIExpZ2h0IHVfcG9pbnRbTUFYX0xJR0hUU19QT0lOVF07XHJcbiAgICBMaWdodCB1X3Nwb3RbTUFYX0xJR0hUU19TUE9UXTtcclxuICB9O1xyXG5cclxuICB2b2lkIGlsbHVtaW5hdGVEaXJlY3RlZCh2ZWMzIF92Y3REaXJlY3Rpb24sIHZlYzMgX3ZjdFZpZXcsIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMyBfdmN0Q29sb3IsIGlub3V0IHZlYzMgX3ZjdERpZmZ1c2UsIGlub3V0IHZlYzMgX3ZjdFNwZWN1bGFyKSB7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IG5vcm1hbGl6ZShfdmN0RGlyZWN0aW9uKTtcclxuICAgIGZsb2F0IGZEaWZmdXNlID0gLWRvdChfdmN0Tm9ybWFsLCB2Y3REaXJlY3Rpb24pO1xyXG5cclxuICAgICNpZiBkZWZpbmVkKFRPT04pXHJcbiAgICAgIFxyXG4gICAgICBmRGlmZnVzZSA9IHRleHR1cmUodV90ZXhUb29uLCB2ZWMyKGZEaWZmdXNlLCAwKSkucjtcclxuXHJcbiAgICAjZW5kaWZcclxuXHJcbiAgICBpZihmRGlmZnVzZSA+IDAuMCkge1xyXG5cclxuICAgICAgX3ZjdERpZmZ1c2UgKz0gdV9mRGlmZnVzZSAqIGZEaWZmdXNlICogX3ZjdENvbG9yO1xyXG5cclxuICAgICAgaWYodV9mU3BlY3VsYXIgPD0gMC4wKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgLy9CTElOTi1QaG9uZyBTaGFkaW5nXHJcbiAgICAgIHZlYzMgaGFsZndheURpciA9IG5vcm1hbGl6ZSgtdmN0RGlyZWN0aW9uIC0gX3ZjdFZpZXcpO1xyXG4gICAgICBmbG9hdCBmYWN0b3IgPSBtYXgoZG90KC12Y3REaXJlY3Rpb24sIF92Y3ROb3JtYWwpLCAwLjApOyAvL0ZhY3RvciBmb3Igc21vb3RoaW5nIG91dCB0cmFuc2l0aW9uIGZyb20gc3VyZmFjZSBmYWNpbmcgdGhlIGxpZ2h0c291cmNlIHRvIHN1cmZhY2UgZmFjaW5nIGF3YXkgZnJvbSB0aGUgbGlnaHRzb3VyY2VcclxuICAgICAgZmFjdG9yID0gMS4wIC0gKHBvdyhmYWN0b3IgLSAxLjAsIDguMCkpOyAgICAgICAgICAgICAgICAgLy9UaGUgZmFjdG9yIGlzIGFsdGVyZWQgaW4gb3JkZXIgdG8gY2xlYXJseSBzZWUgdGhlIHNwZWN1bGFyIGhpZ2hsaWdodCBldmVuIGF0IHN0ZWVwIGFuZ2xlcywgd2hpbGUgc3RpbGwgcHJldmVudGluZyBhcnRpZmFjdHNcclxuXHJcbiAgICAgIGZsb2F0IGZTcGVjdWxhciA9IHBvdyhtYXgoZG90KF92Y3ROb3JtYWwsIGhhbGZ3YXlEaXIpLCAwLjApLCBleHAyKHVfZlNwZWN1bGFyICogNS4wKSkgKiBmYWN0b3I7IFxyXG5cclxuICAgICAgI2lmIGRlZmluZWQoVE9PTilcclxuICAgICAgICBcclxuICAgICAgICBmU3BlY3VsYXIgPSB0ZXh0dXJlKHVfdGV4VG9vbiwgdmVjMihmU3BlY3VsYXIsIDAuMCkpLmcgKiBmRGlmZnVzZTtcclxuXHJcbiAgICAgICNlbmRpZlxyXG5cclxuICAgICAgX3ZjdFNwZWN1bGFyICs9IGZTcGVjdWxhciAqIHVfZlNwZWN1bGFyICogdV9mSW50ZW5zaXR5ICogX3ZjdENvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoVEVYVFVSRSkgfHwgZGVmaW5lZChNQVRDQVApXHJcblxyXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4Q29sb3I7XHJcbiAgaW4gdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhOb3JtYWw7XHJcbiAgaW4gdmVjMyB2X3ZjdFRhbmdlbnQ7XHJcbiAgaW4gdmVjMyB2X3ZjdEJpdGFuZ2VudDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoUEFSVElDTEUpXHJcblxyXG4gIHVuaWZvcm0gaW50IHVfaUJsZW5kTW9kZTtcclxuXHJcbiNlbmRpZlxyXG5cclxuZmxvYXQgZ2V0Rm9nKHZlYzMgX3ZjdFBvc2l0aW9uKSB7XHJcbiAgZmxvYXQgZkRpc3RhbmNlID0gbGVuZ3RoKF92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTsgLy8gbWF5YmUgdXNlIHotZGVwdGggaW5zdGVhZCBvZiBldWNsaWRlYW4gZGVwdGhcclxuICBmbG9hdCBmRm9nID0gY2xhbXAoKGZEaXN0YW5jZSAtIHVfZkZvZ05lYXIpIC8gKHVfZkZvZ0ZhciAtIHVfZkZvZ05lYXIpLCAwLjAsIDEuMCk7XHJcbiAgZkZvZyA9IC1wb3coZkZvZywgMi4wKSArICgyLjAgKiBmRm9nKTsgLy8gbGV0cyBmb2cgYXBwZWFyIHF1aWNrZXIgYW5kIGZhbGwgb2ZmIHNsb3dlciByZXN1bHRzIGluIGEgbW9yZSBncmFkdWFsIGZhbGxvZmZcclxuICByZXR1cm4gZkZvZyAqIHVfdmN0Rm9nQ29sb3IuYTtcclxufVxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKVxyXG5cclxuICAgIHZlYzMgdmN0RmR4ID0gZEZkeCh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZlYzMgdmN0RmR5ID0gZEZkeSh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZlYzMgdmN0Tm9ybWFsID0gbm9ybWFsaXplKGNyb3NzKHZjdEZkeCwgdmN0RmR5KSk7XHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodl92Y3RQb3NpdGlvbkZsYXQgLSB1X3ZjdENhbWVyYSk7XHJcbiAgICB2ZWMzIHZjdFBvc2l0aW9uID0gdl92Y3RQb3NpdGlvbkZsYXQ7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgKGRlZmluZWQoUEhPTkcpIHx8IGRlZmluZWQoR09VUkFVRCkpICYmICFkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IG5vcm1hbGl6ZSh2X3ZjdE5vcm1hbCk7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodl92Y3RQb3NpdGlvbiAtIHVfdmN0Q2FtZXJhKTtcclxuICAgIHZlYzMgdmN0UG9zaXRpb24gPSB2X3ZjdFBvc2l0aW9uO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmIGRlZmluZWQoTk9STUFMTUFQKVxyXG5cclxuICAgIG1hdDMgbXR4VEJOID0gbWF0Myhub3JtYWxpemUodl92Y3RUYW5nZW50KSwgbm9ybWFsaXplKHZfdmN0Qml0YW5nZW50KSwgbm9ybWFsaXplKHZfdmN0Tm9ybWFsKSk7XHJcbiAgICB2ZWMzIHZjdE5vcm1hbCA9IHRleHR1cmUodV90ZXhOb3JtYWwsIHZfdmN0VGV4dHVyZSkueHl6ICogMi4wIC0gMS4wO1xyXG4gICAgdmN0Tm9ybWFsID0gbm9ybWFsaXplKG10eFRCTiAqIHZjdE5vcm1hbCk7XHJcblxyXG4gICNlbmRpZlxyXG4gIFxyXG4gICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgdmVjMyB2Y3REaWZmdXNlID0gdV9mRGlmZnVzZSAqIHVfYW1iaWVudC52Y3RDb2xvci5yZ2I7XHJcbiAgICB2ZWMzIHZjdFNwZWN1bGFyID0gdmVjMygwLCAwLCAwKTtcclxuXHJcbiAgICAvLyBkaXJlY3Rpb25hbCBsaWdodHNcclxuICAgIGZvcih1aW50IGkgPSAwdTsgaSA8IHVfbkxpZ2h0c0RpcmVjdGlvbmFsOyBpKyspIHtcclxuICAgICAgdmVjMyB2Y3REaXJlY3Rpb24gPSB2ZWMzKHVfZGlyZWN0aW9uYWxbaV0ubXR4U2hhcGUgKiB2ZWM0KDAuMCwgMC4wLCAxLjAsIDEuMCkpO1xyXG4gICAgICBpbGx1bWluYXRlRGlyZWN0ZWQodmN0RGlyZWN0aW9uLCB2Y3RWaWV3LCB2Y3ROb3JtYWwsIHVfZGlyZWN0aW9uYWxbaV0udmN0Q29sb3IucmdiLCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcG9pbnQgbGlnaHRzXHJcbiAgICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNQb2ludDsgaSsrKSB7XHJcbiAgICAgIHZlYzMgdmN0UG9zaXRpb25MaWdodCA9IHZlYzModV9wb2ludFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24gLSB2Y3RQb3NpdGlvbkxpZ2h0O1xyXG4gICAgICBmbG9hdCBmSW50ZW5zaXR5ID0gMS4wIC0gbGVuZ3RoKG1hdDModV9wb2ludFtpXS5tdHhTaGFwZUludmVyc2UpICogdmN0RGlyZWN0aW9uKTtcclxuICAgICAgaWYoZkludGVuc2l0eSA8IDAuMClcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGlsbHVtaW5hdGVEaXJlY3RlZCh2Y3REaXJlY3Rpb24sIHZjdFZpZXcsIHZjdE5vcm1hbCwgdV9wb2ludFtpXS52Y3RDb2xvci5yZ2IgKiBmSW50ZW5zaXR5LCB2Y3REaWZmdXNlLCB2Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc3BvdCBsaWdodHNcclxuICAgIGZvcih1aW50IGkgPSAwdTsgaSA8IHVfbkxpZ2h0c1Nwb3Q7IGkrKykge1xyXG4gICAgICB2ZWMzIHZjdFBvc2l0aW9uTGlnaHQgPSB2ZWMzKHVfc3BvdFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24gLSB2Y3RQb3NpdGlvbkxpZ2h0O1xyXG4gICAgICB2ZWMzIHZjdERpcmVjdGlvbkludmVydGVkID0gbWF0Myh1X3Nwb3RbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIHZjdERpcmVjdGlvbjtcclxuICAgICAgaWYodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiA8PSAwLjApXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBmbG9hdCBmSW50ZW5zaXR5ID0gMS4wIC0gbWluKDEuMCwgMi4wICogbGVuZ3RoKHZjdERpcmVjdGlvbkludmVydGVkLnh5KSAvIHZjdERpcmVjdGlvbkludmVydGVkLnopOyAgICAvL0NvbmVzaGFwZSB0aGF0IGlzIGJyaWdodGVzdCBpbiB0aGUgY2VudGVyLiBQb3NzaWJsZSBUT0RPOiBcIlZhcmlhYmxlIFNwb3RsaWdodHNvZnRuZXNzXCJcclxuICAgICAgZkludGVuc2l0eSAqPSAxLjAgLSBwb3codmN0RGlyZWN0aW9uSW52ZXJ0ZWQueiwgMi4wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QcmV2ZW50cyBoYXJzaCBsaWdodGluZyBhcnRpZmFjdHMgYXQgYm91bmRhcnkgb2YgdGhlIGdpdmVuIHNwb3RsaWdodFxyXG4gICAgICBpZihmSW50ZW5zaXR5IDwgMC4wKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3Nwb3RbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdmN0RGlmZnVzZSwgdmN0U3BlY3VsYXIpO1xyXG4gICAgfVxyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgdmVjNCB2Y3RDb2xvciA9IHVfdmN0Q29sb3IgKiB2X3ZjdENvbG9yO1xyXG4gIHZjdENvbG9yLnJnYiAqPSB2Y3RDb2xvci5hOyAvLyBwcmVtdWx0aXBseSBhbHBoYVxyXG5cclxuICAjaWYgZGVmaW5lZChHT1VSQVVEKVxyXG5cclxuICAgIHZlYzMgdmN0RGlmZnVzZSA9IHZfdmN0RGlmZnVzZTtcclxuICAgIHZlYzMgdmN0U3BlY3VsYXIgPSB2X3ZjdFNwZWN1bGFyO1xyXG5cclxuICAjZW5kaWZcclxuXHJcbiAgI2lmIGRlZmluZWQoRkxBVCkgfHwgZGVmaW5lZChHT1VSQVVEKSB8fCBkZWZpbmVkKFBIT05HKVxyXG5cclxuICAgIHZjdEZyYWcucmdiID0gdmN0RGlmZnVzZSArIHZjdFNwZWN1bGFyICogdV9mTWV0YWxsaWM7XHJcbiAgICB2Y3RGcmFnLmEgPSAxLjA7XHJcblxyXG4gICNlbHNlXHJcblxyXG4gICAgLy8gTUlOSU1BTDogc2V0IHRoZSBiYXNlIGNvbG9yXHJcbiAgICB2Y3RGcmFnID0gdmN0Q29sb3I7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChURVhUVVJFKSB8fCBkZWZpbmVkKE1BVENBUClcclxuICAgIFxyXG4gICAgLy8gVEVYVFVSRTogbXVsdGlwbHkgd2l0aCB0ZXhlbCBjb2xvclxyXG4gICAgdmVjNCB2Y3RDb2xvclRleHR1cmUgPSB0ZXh0dXJlKHVfdGV4Q29sb3IsIHZfdmN0VGV4dHVyZSk7IC8vIGhhcyBwcmVtdWx0aXBsaWVkIGFscGhhIGJ5IHdlYmdsXHJcbiAgICB2Y3RGcmFnICo9IHZjdENvbG9yVGV4dHVyZTtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORylcclxuXHJcbiAgICB2Y3RGcmFnICo9IHZjdENvbG9yO1xyXG4gICAgdmN0RnJhZy5yZ2IgKz0gdmN0U3BlY3VsYXIgKiAoMS4wIC0gdV9mTWV0YWxsaWMpO1xyXG5cclxuICAgIHZjdEZyYWdQb3NpdGlvbiA9IHZlYzQodl92Y3RQb3NpdGlvbiwgMS4wKTtcclxuICAgIHZjdEZyYWdOb3JtYWwgPSB2ZWM0KHZjdE5vcm1hbCwgMS4wKTtcclxuICBcclxuICAjZW5kaWZcclxuXHJcbiAgI2lmICFkZWZpbmVkKFBIT05HKSAmJiAhZGVmaW5lZChGTEFUKSAmJiAhZGVmaW5lZChHT1VSQVVEKSAvLyBNSU5JTUFMXHJcblxyXG4gICAgdmN0RnJhZ1Bvc2l0aW9uID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApOyAvLyAoMCwgMCwgMCkgd2lsbCB0cmVhdCBvY2NsdWRlcnMgYXMgbm9uIGV4aXN0aW5nIGluIHNzYW9cclxuICAgIHZjdEZyYWdOb3JtYWwgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDEuMCk7IC8vICgwLCAwLCAwKSBub3JtYWwgd2lsbCB5aWVsZCBub3Qgb2NjbHVzaW9uIGluIHNzYW9cclxuICBcclxuICAjZW5kaWZcclxuXHJcbiAgLy8gZGlzY2FyZCBwaXhlbCBhbGx0b2dldGhlciB3aGVuIHRyYW5zcGFyZW50OiBkb24ndCBzaG93IGluIFotQnVmZmVyXHJcbiAgaWYodmN0RnJhZy5hIDwgdV9mQWxwaGFDbGlwKVxyXG4gICAgZGlzY2FyZDtcclxuXHJcbiAgaWYgKHVfYkZvZ0FjdGl2ZSkge1xyXG4gICAgZmxvYXQgZkZvZyA9IGdldEZvZyh2X3ZjdFBvc2l0aW9uKTtcclxuICAgIHZjdEZyYWcucmdiIC89IHZjdEZyYWcuYTsgLy8gdW5wcmVtdWx0aXBseSBhbHBoYVxyXG4gICAgdmN0RnJhZy5yZ2IgPSBtaXgodmN0RnJhZy5yZ2IsIHVfdmN0Rm9nQ29sb3IucmdiLCBmRm9nKTtcclxuXHJcbiAgICAjaWYgZGVmaW5lZChQQVJUSUNMRSlcclxuXHJcbiAgICAgIGlmICh1X2lCbGVuZE1vZGUgPT0gMiB8fCB1X2lCbGVuZE1vZGUgPT0gMyB8fCB1X2lCbGVuZE1vZGUgPT0gNCkgIC8vIGZvciBibGVuZCBhZGRpdGl2ZSwgc3VidHJhY3RpdmUsIG1vZHVsYXRlXHJcbiAgICAgICAgdmN0RnJhZy5hID0gbWl4KHZjdEZyYWcuYSwgMC4wLCBmRm9nKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhZGUgb3V0IHBhcnRpY2xlIHdoZW4gaW4gZm9nIHRvIG1ha2UgaXQgZGlzYXBwZWFyIGNvbXBsZXRlbHlcclxuXHJcbiAgICAjZW5kaWZcclxuXHJcbiAgICB2Y3RGcmFnLnJnYiAqPSB2Y3RGcmFnLmE7IC8vIHByZW11bHRpcGx5IGFscGhhXHJcbiAgfVxyXG59YDtcbiAgc2hhZGVyU291cmNlc1tcIlNoYWRlclVuaXZlcnNhbC52ZXJ0XCJdID0gLypnbHNsKi8gYCN2ZXJzaW9uIDMwMCBlc1xyXG4vKipcclxuKiBVbml2ZXJzYWwgU2hhZGVyIGFzIGJhc2UgZm9yIG1hbnkgb3RoZXJzLiBDb250cm9sbGVkIGJ5IGNvbXBpbGVyIGRpcmVjdGl2ZXNcclxuKiBAYXV0aG9ycyAyMDIxLCBMdWlzIEtlY2ssIEhGVSwgMjAyMSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDIxIHwgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDIzXHJcbiovXHJcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5wcmVjaXNpb24gaGlnaHAgaW50O1xyXG5cclxudW5pZm9ybSBtYXQ0IHVfbXR4TWVzaFRvV29ybGQ7IC8vIG5lZWRlZCBmb3IgRk9HXHJcbnVuaWZvcm0gbWF0NCB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG5pbiB2ZWMzIGFfdmN0UG9zaXRpb247XHJcbmluIHZlYzQgYV92Y3RDb2xvcjsgLy8gVE9ETzogdGhpbmsgYWJvdXQgbWFraW5nIHZlcnRleCBjb2xvciBvcHRpb25hbFxyXG5cclxub3V0IHZlYzMgdl92Y3RQb3NpdGlvbjtcclxub3V0IHZlYzQgdl92Y3RDb2xvcjtcclxuXHJcbiNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORykgfHwgZGVmaW5lZChQQVJUSUNMRSkgfHwgZGVmaW5lZChNQVRDQVApXHJcblxyXG4gIHVuaWZvcm0gdmVjMyB1X3ZjdENhbWVyYTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoRkxBVCkgfHwgZGVmaW5lZChHT1VSQVVEKSB8fCBkZWZpbmVkKFBIT05HKVxyXG5cclxuICB1bmlmb3JtIG1hdDQgdV9tdHhOb3JtYWxNZXNoVG9Xb3JsZDtcclxuXHJcbiAgaW4gdmVjMyBhX3ZjdE5vcm1hbDtcclxuICBvdXQgdmVjMyB2X3ZjdE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoRkxBVClcclxuXHJcbiAgZmxhdCBvdXQgdmVjMyB2X3ZjdFBvc2l0aW9uRmxhdDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoR09VUkFVRClcclxuXHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZEaWZmdXNlO1xyXG4gIHVuaWZvcm0gZmxvYXQgdV9mU3BlY3VsYXI7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZJbnRlbnNpdHk7XHJcblxyXG4gIG91dCB2ZWMzIHZfdmN0RGlmZnVzZTtcclxuICBvdXQgdmVjMyB2X3ZjdFNwZWN1bGFyO1xyXG5cclxuICBzdHJ1Y3QgTGlnaHQge1xyXG4gICAgdmVjNCB2Y3RDb2xvcjtcclxuICAgIG1hdDQgbXR4U2hhcGU7XHJcbiAgICBtYXQ0IG10eFNoYXBlSW52ZXJzZTtcclxuICB9O1xyXG5cclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfRElSRUNUSU9OQUwgPSAxNXU7XHJcbiAgY29uc3QgdWludCBNQVhfTElHSFRTX1BPSU5UID0gMTAwdTtcclxuICBjb25zdCB1aW50IE1BWF9MSUdIVFNfU1BPVCA9IDEwMHU7XHJcblxyXG4gIGxheW91dChzdGQxNDApIHVuaWZvcm0gTGlnaHRzIHtcclxuICAgIHVpbnQgdV9uTGlnaHRzRGlyZWN0aW9uYWw7XHJcbiAgICB1aW50IHVfbkxpZ2h0c1BvaW50O1xyXG4gICAgdWludCB1X25MaWdodHNTcG90O1xyXG4gICAgdWludCBwYWRkaW5nOyAvLyBBZGQgcGFkZGluZyB0byBhbGlnbiB0byAxNiBieXRlc1xyXG4gICAgTGlnaHQgdV9hbWJpZW50O1xyXG4gICAgTGlnaHQgdV9kaXJlY3Rpb25hbFtNQVhfTElHSFRTX0RJUkVDVElPTkFMXTtcclxuICAgIExpZ2h0IHVfcG9pbnRbTUFYX0xJR0hUU19QT0lOVF07XHJcbiAgICBMaWdodCB1X3Nwb3RbTUFYX0xJR0hUU19TUE9UXTtcclxuICB9O1xyXG5cclxuICB2b2lkIGlsbHVtaW5hdGVEaXJlY3RlZCh2ZWMzIF92Y3REaXJlY3Rpb24sIHZlYzMgX3ZjdFZpZXcsIHZlYzMgX3ZjdE5vcm1hbCwgdmVjMyBfdmN0Q29sb3IsIGlub3V0IHZlYzMgX3ZjdERpZmZ1c2UsIGlub3V0IHZlYzMgX3ZjdFNwZWN1bGFyKSB7XHJcbiAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IG5vcm1hbGl6ZShfdmN0RGlyZWN0aW9uKTtcclxuICAgIGZsb2F0IGZJbGx1bWluYXRpb24gPSAtZG90KF92Y3ROb3JtYWwsIHZjdERpcmVjdGlvbik7XHJcbiAgICBpZihmSWxsdW1pbmF0aW9uID4gMC4wKSB7XHJcbiAgICAgIF92Y3REaWZmdXNlICs9IHVfZkRpZmZ1c2UgKiBmSWxsdW1pbmF0aW9uICogX3ZjdENvbG9yO1xyXG5cclxuICAgICAgaWYodV9mU3BlY3VsYXIgPD0gMC4wKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vQkxJTk5cclxuICAgICAgdmVjMyBoYWxmd2F5RGlyID0gbm9ybWFsaXplKC12Y3REaXJlY3Rpb24gLSBfdmN0Vmlldyk7XHJcbiAgICAgIGZsb2F0IGZhY3RvciA9IG1heChkb3QoLXZjdERpcmVjdGlvbiwgX3ZjdE5vcm1hbCksIDAuMCk7IC8vRmFjdG9yIGZvciBzbW9vdGhpbmcgb3V0IHRyYW5zaXRpb24gZnJvbSBzdXJmYWNlIGZhY2luZyB0aGUgbGlnaHRzb3VyY2UgdG8gc3VyZmFjZSBmYWNpbmcgYXdheSBmcm9tIHRoZSBsaWdodHNvdXJjZVxyXG4gICAgICBmYWN0b3IgPSAxLjAgLSAocG93KGZhY3RvciAtIDEuMCwgOC4wKSk7ICAgICAgICAgICAgICAgICAvL1RoZSBmYWN0b3IgaXMgYWx0ZXJlZCBpbiBvcmRlciB0byBjbGVhcmx5IHNlZSB0aGUgc3BlY3VsYXIgaGlnaGxpZ2h0IGV2ZW4gYXQgc3RlZXAgYW5nbGVzLCB3aGlsZSBzdGlsbCBwcmV2ZW50aW5nIGFydGlmYWN0c1xyXG5cclxuICAgICAgX3ZjdFNwZWN1bGFyICs9IHBvdyhtYXgoZG90KF92Y3ROb3JtYWwsIGhhbGZ3YXlEaXIpLCAwLjApLCBleHAyKHVfZlNwZWN1bGFyICogNS4wKSkgKiB1X2ZTcGVjdWxhciAqIHVfZkludGVuc2l0eSAqIGZhY3RvciAqIF92Y3RDb2xvcjtcclxuXHJcbiAgICAgIC8vUEhPTkcgKG9sZClcclxuICAgICAgLy8gdmVjMyB2Y3RSZWZsZWN0aW9uID0gbm9ybWFsaXplKHJlZmxlY3QoLXZjdERpcmVjdGlvbiwgX3ZjdE5vcm1hbCkpO1xyXG4gICAgICAvLyBmbG9hdCBmSGl0Q2FtZXJhID0gZG90KHZjdFJlZmxlY3Rpb24sIF92Y3RWaWV3KTtcclxuICAgICAgLy8gX3ZjdFNwZWN1bGFyICs9IHBvdyhtYXgoZkhpdENhbWVyYSwgMC4wKSwgdV9mU3BlY3VsYXIgKiAxMC4wKSAqIHVfZlNwZWN1bGFyICogX3ZjdENvbG9yOyAvLyAxMC4wID0gbWFnaWMgbnVtYmVyLCBsb29rcyBnb29kLi4uIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoVEVYVFVSRSkgfHwgZGVmaW5lZChOT1JNQUxNQVApXHJcblxyXG4gIHVuaWZvcm0gbWF0MyB1X210eFBpdm90O1xyXG5cclxuICBpbiB2ZWMyIGFfdmN0VGV4dHVyZTtcclxuICBvdXQgdmVjMiB2X3ZjdFRleHR1cmU7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKE5PUk1BTE1BUClcclxuXHJcbiAgaW4gdmVjNCBhX3ZjdFRhbmdlbnQ7XHJcbiAgb3V0IHZlYzMgdl92Y3RUYW5nZW50O1xyXG4gIG91dCB2ZWMzIHZfdmN0Qml0YW5nZW50O1xyXG5cclxuI2VuZGlmXHJcblxyXG4vLyBNQVRDQVA6IG9mZmVyIGJ1ZmZlcnMgZm9yIFVWcyBhbmQgcGl2b3QgbWF0cml4XHJcbiNpZiBkZWZpbmVkKE1BVENBUCkgLy8gTWF0Q2FwLXNoYWRlciBnZW5lcmF0ZXMgdGV4dHVyZSBjb29yZGluYXRlcyBmcm9tIHN1cmZhY2Ugbm9ybWFsc1xyXG4gIFxyXG4gIHVuaWZvcm0gbWF0NCB1X210eFdvcmxkVG9DYW1lcmE7XHJcbiAgdW5pZm9ybSBtYXQ0IHVfbXR4Tm9ybWFsTWVzaFRvV29ybGQ7XHJcblxyXG4gIGluIHZlYzMgYV92Y3ROb3JtYWw7XHJcbiAgb3V0IHZlYzIgdl92Y3RUZXh0dXJlO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZChTS0lOKVxyXG5cclxuICAvLyBCb25lcyBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2Jsb2IvZGV2L3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9za2lubmluZ19wYXJzX3ZlcnRleC5nbHNsLmpzXHJcbiAgdW5pZm9ybSBtYXQ0IHVfbXR4V29ybGRUb1ZpZXc7XHJcbiAgaW4gdXZlYzQgYV92Y3RCb25lcztcclxuICBpbiB2ZWM0IGFfdmN0V2VpZ2h0cztcclxuXHJcbiAgY29uc3QgdWludCBNQVhfQk9ORVMgPSAyNTZ1OyAvLyBDQVVUSU9OOiB0aGlzIG51bWJlciBtdXN0IGJlIHRoZSBzYW1lIGFzIGluIFJlbmRlckluamVjdG9yU2tlbGV0b25JbnN0YW5jZSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBidWZmZXJzIGFyZSBjcmVhdGVkXHJcbiAgbGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBTa2luIHtcclxuICAgIG1hdDQgdV9tdHhCb25lc1tNQVhfQk9ORVNdO1xyXG4gIH07XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKFBBUlRJQ0xFKVxyXG5cclxuICB1bmlmb3JtIG1hdDQgdV9tdHhXb3JsZFRvVmlldztcclxuICB1bmlmb3JtIGZsb2F0IHVfZlBhcnRpY2xlU3lzdGVtRHVyYXRpb247XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZQYXJ0aWNsZVN5c3RlbVNpemU7XHJcbiAgdW5pZm9ybSBmbG9hdCB1X2ZQYXJ0aWNsZVN5c3RlbVRpbWU7XHJcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnM7XHJcbiAgdW5pZm9ybSBib29sIHVfYlBhcnRpY2xlU3lzdGVtRmFjZUNhbWVyYTtcclxuICB1bmlmb3JtIGJvb2wgdV9iUGFydGljbGVTeXN0ZW1SZXN0cmljdDtcclxuXHJcbiAgbWF0NCBsb29rQXQodmVjMyBfdmN0VHJhbnNsYXRpb24sIHZlYzMgX3ZjdFRhcmdldCkge1xyXG4gICAgdmVjMyB2Y3RVcCA9IHZlYzMoMC4wLCAxLjAsIDAuMCk7XHJcbiAgICB2ZWMzIHpBeGlzID0gbm9ybWFsaXplKF92Y3RUYXJnZXQgLSBfdmN0VHJhbnNsYXRpb24pO1xyXG4gICAgdmVjMyB4QXhpcyA9IG5vcm1hbGl6ZShjcm9zcyh2Y3RVcCwgekF4aXMpKTtcclxuICAgIHZlYzMgeUF4aXMgPSB1X2JQYXJ0aWNsZVN5c3RlbVJlc3RyaWN0ID8gdmN0VXAgOiBub3JtYWxpemUoY3Jvc3MoekF4aXMsIHhBeGlzKSk7XHJcbiAgICB6QXhpcyA9IHVfYlBhcnRpY2xlU3lzdGVtUmVzdHJpY3QgPyBub3JtYWxpemUoY3Jvc3MoeEF4aXMsIHZjdFVwKSkgOiB6QXhpcztcclxuXHJcbiAgICByZXR1cm4gbWF0NCh4QXhpcy54LCB4QXhpcy55LCB4QXhpcy56LCAwLjAsIHlBeGlzLngsIHlBeGlzLnksIHlBeGlzLnosIDAuMCwgekF4aXMueCwgekF4aXMueSwgekF4aXMueiwgMC4wLCBfdmN0VHJhbnNsYXRpb24ueCwgX3ZjdFRyYW5zbGF0aW9uLnksIF92Y3RUcmFuc2xhdGlvbi56LCAxLjApO1xyXG4gIH1cclxuXHJcbiAgZmxvYXQgZmV0Y2hSYW5kb21OdW1iZXIoaW50IF9pSW5kZXgsIGludCBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUsIGludCBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc0xlbmd0aCkge1xyXG4gICAgX2lJbmRleCA9IF9pSW5kZXggJSBfaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc0xlbmd0aDtcclxuICAgIHJldHVybiB0ZXhlbEZldGNoKHVfcGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzLCBpdmVjMihfaUluZGV4ICUgX2lQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNTaXplLCBfaUluZGV4IC8gX2lQYXJ0aWNsZVN5c3RlbVJhbmRvbU51bWJlcnNTaXplKSwgMCkucjtcclxuICB9XHJcblxyXG4jZW5kaWZcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcbiAgdmVjNCB2Y3RQb3NpdGlvbiA9IHZlYzQoYV92Y3RQb3NpdGlvbiwgMS4wKTtcclxuICBtYXQ0IG10eE1lc2hUb1dvcmxkID0gdV9tdHhNZXNoVG9Xb3JsZDtcclxuICBtYXQ0IG10eE1lc2hUb1ZpZXcgPSB1X210eE1lc2hUb1ZpZXc7XHJcblxyXG4gICNpZiBkZWZpbmVkKEZMQVQpIHx8IGRlZmluZWQoR09VUkFVRCkgfHwgZGVmaW5lZChQSE9ORykgLy8gb25seSB0aGVzZSB3b3JrIHdpdGggcGFydGljbGUgYW5kIHNraW5uaW5nXHJcblxyXG4gICAgbWF0NCBtdHhOb3JtYWxNZXNoVG9Xb3JsZCA9IHVfbXR4Tm9ybWFsTWVzaFRvV29ybGQ7XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChQQVJUSUNMRSlcclxuICBcclxuICAgIGZsb2F0IGZQYXJ0aWNsZUlkID0gZmxvYXQoZ2xfSW5zdGFuY2VJRCk7XHJcbiAgICBpbnQgaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUgPSB0ZXh0dXJlU2l6ZSh1X3BhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVycywgMCkueDsgLy8gdGhlIGRpbWVuc2lvbiBvZiB0aGUgcXVhZHJhdGljIHRleHR1cmVcclxuICAgIGludCBpUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzTGVuZ3RoID0gaVBhcnRpY2xlU3lzdGVtUmFuZG9tTnVtYmVyc1NpemUgKiBpUGFydGljbGVTeXN0ZW1SYW5kb21OdW1iZXJzU2l6ZTsgLy8gdGhlIHRvdGFsIG51bWJlciBvZiB0ZXhlbHMgaW4gdGhlIHRleHR1cmVcclxuICAgIC8qJHZhcmlhYmxlcyovXHJcbiAgICAvKiRtdHhMb2NhbCovXHJcbiAgICAvKiRtdHhXb3JsZCovXHJcbiAgICBtdHhNZXNoVG9Xb3JsZCA9IC8qJG10eFdvcmxkKi8gbXR4TWVzaFRvV29ybGQgLyokbXR4TG9jYWwqLztcclxuICAgIGlmKHVfYlBhcnRpY2xlU3lzdGVtRmFjZUNhbWVyYSkgbXR4TWVzaFRvV29ybGQgPSBsb29rQXQodmVjMyhtdHhNZXNoVG9Xb3JsZFszXVswXSwgbXR4TWVzaFRvV29ybGRbM11bMV0sIG10eE1lc2hUb1dvcmxkWzNdWzJdKSwgdV92Y3RDYW1lcmEpICpcclxuICAgICAgbWF0NChsZW5ndGgodmVjMyhtdHhNZXNoVG9Xb3JsZFswXVswXSwgbXR4TWVzaFRvV29ybGRbMV1bMF0sIG10eE1lc2hUb1dvcmxkWzJdWzBdKSksIDAuMCwgMC4wLCAwLjAsIDAuMCwgbGVuZ3RoKHZlYzMobXR4TWVzaFRvV29ybGRbMF1bMV0sIG10eE1lc2hUb1dvcmxkWzFdWzFdLCBtdHhNZXNoVG9Xb3JsZFsyXVsxXSkpLCAwLjAsIDAuMCwgMC4wLCAwLjAsIGxlbmd0aCh2ZWMzKG10eE1lc2hUb1dvcmxkWzBdWzJdLCBtdHhNZXNoVG9Xb3JsZFsxXVsyXSwgbXR4TWVzaFRvV29ybGRbMl1bMl0pKSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjApO1xyXG4gICAgbXR4TWVzaFRvVmlldyA9IHVfbXR4V29ybGRUb1ZpZXcgKiBtdHhNZXNoVG9Xb3JsZDtcclxuXHJcbiAgICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgICBtdHhOb3JtYWxNZXNoVG9Xb3JsZCA9IHRyYW5zcG9zZShpbnZlcnNlKG10eE1lc2hUb1dvcmxkKSk7XHJcblxyXG4gICAgI2VuZGlmXHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChTS0lOKVxyXG5cclxuICAgIG10eE1lc2hUb1dvcmxkID0gYV92Y3RXZWlnaHRzLnggKiB1X210eEJvbmVzW2FfdmN0Qm9uZXMueF0gK1xyXG4gICAgICBhX3ZjdFdlaWdodHMueSAqIHVfbXR4Qm9uZXNbYV92Y3RCb25lcy55XSArXHJcbiAgICAgIGFfdmN0V2VpZ2h0cy56ICogdV9tdHhCb25lc1thX3ZjdEJvbmVzLnpdICtcclxuICAgICAgYV92Y3RXZWlnaHRzLncgKiB1X210eEJvbmVzW2FfdmN0Qm9uZXMud107XHJcblxyXG4gICAgbXR4TWVzaFRvVmlldyA9IHVfbXR4V29ybGRUb1ZpZXcgKiBtdHhNZXNoVG9Xb3JsZDtcclxuXHJcbiAgICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgICBtdHhOb3JtYWxNZXNoVG9Xb3JsZCA9IHRyYW5zcG9zZShpbnZlcnNlKG10eE1lc2hUb1dvcmxkKSk7XHJcblxyXG4gICAgI2VuZGlmXHJcblxyXG4gICNlbmRpZlxyXG5cclxuICBnbF9Qb3NpdGlvbiA9IG10eE1lc2hUb1ZpZXcgKiB2Y3RQb3NpdGlvbjsgXHJcbiAgdmN0UG9zaXRpb24gPSBtdHhNZXNoVG9Xb3JsZCAqIHZjdFBvc2l0aW9uO1xyXG5cclxuICB2X3ZjdENvbG9yID0gYV92Y3RDb2xvcjtcclxuICB2X3ZjdFBvc2l0aW9uID0gdmN0UG9zaXRpb24ueHl6O1xyXG5cclxuICAjaWYgZGVmaW5lZChQQVJUSUNMRV9DT0xPUilcclxuXHJcbiAgICB2X3ZjdENvbG9yICo9IC8qJGNvbG9yKi87XHJcblxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKVxyXG5cclxuICAgIHZfdmN0UG9zaXRpb25GbGF0ID0gdl92Y3RQb3NpdGlvbjtcclxuICAgIFxyXG4gICNlbmRpZlxyXG5cclxuICAjaWYgZGVmaW5lZChGTEFUKSB8fCBkZWZpbmVkKEdPVVJBVUQpIHx8IGRlZmluZWQoUEhPTkcpXHJcblxyXG4gICAgdl92Y3ROb3JtYWwgPSBtYXQzKG10eE5vcm1hbE1lc2hUb1dvcmxkKSAqIGFfdmN0Tm9ybWFsOyAvLyB1bm5vcm1hbGl6ZWQgYXMgaXQgbXVzdCBiZSBub3JtYWxpemVkIGluIHRoZSBmcmFnbWVudCBzaGFkZXIgYW55d2F5XHJcblxyXG4gICNlbmRpZiBcclxuXHJcbiAgI2lmIGRlZmluZWQoTk9STUFMTUFQKVxyXG5cclxuICAgIHZfdmN0VGFuZ2VudCA9IG1hdDMobXR4Tm9ybWFsTWVzaFRvV29ybGQpICogYV92Y3RUYW5nZW50Lnh5ejtcclxuICAgIHZfdmN0Qml0YW5nZW50ID0gY3Jvc3Modl92Y3ROb3JtYWwsIHZfdmN0VGFuZ2VudCkgKiBhX3ZjdFRhbmdlbnQudztcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKEdPVVJBVUQpXHJcbiAgXHJcbiAgICB2ZWMzIHZjdFZpZXcgPSBub3JtYWxpemUodmN0UG9zaXRpb24ueHl6IC0gdV92Y3RDYW1lcmEpO1xyXG4gICAgdmVjMyB2Y3ROb3JtYWwgPSBub3JtYWxpemUodl92Y3ROb3JtYWwpO1xyXG4gICAgdl92Y3REaWZmdXNlID0gdV9mRGlmZnVzZSAqIHVfYW1iaWVudC52Y3RDb2xvci5yZ2I7XHJcbiAgICB2X3ZjdFNwZWN1bGFyID0gdmVjMygwLCAwLCAwKTtcclxuXHJcbiAgICAvLyBjYWxjdWxhdGUgZGlyZWN0aW9uYWwgbGlnaHQgZWZmZWN0XHJcbiAgICBmb3IodWludCBpID0gMHU7IGkgPCB1X25MaWdodHNEaXJlY3Rpb25hbDsgaSArKykge1xyXG4gICAgICB2ZWMzIHZjdERpcmVjdGlvbiA9IHZlYzModV9kaXJlY3Rpb25hbFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDEuMCwgMS4wKSk7XHJcbiAgICAgIGlsbHVtaW5hdGVEaXJlY3RlZCh2Y3REaXJlY3Rpb24sIHZjdFZpZXcsIHZjdE5vcm1hbCwgdV9kaXJlY3Rpb25hbFtpXS52Y3RDb2xvci5yZ2IsIHZfdmN0RGlmZnVzZSwgdl92Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsY3VsYXRlIHBvaW50IGxpZ2h0IGVmZmVjdFxyXG4gICAgZm9yKHVpbnQgaSA9IDB1O2kgPCB1X25MaWdodHNQb2ludDtpICsrKSB7XHJcbiAgICAgIHZlYzMgdmN0UG9zaXRpb25MaWdodCA9IHZlYzModV9wb2ludFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24ueHl6IC0gdmN0UG9zaXRpb25MaWdodDtcclxuICAgICAgZmxvYXQgZkludGVuc2l0eSA9IDEuMCAtIGxlbmd0aChtYXQzKHVfcG9pbnRbaV0ubXR4U2hhcGVJbnZlcnNlKSAqIHZjdERpcmVjdGlvbik7XHJcbiAgICAgIGlmKGZJbnRlbnNpdHkgPCAwLjApIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3BvaW50W2ldLnZjdENvbG9yLnJnYiAqIGZJbnRlbnNpdHksIHZfdmN0RGlmZnVzZSwgdl92Y3RTcGVjdWxhcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsY3VsYXRlIHNwb3QgbGlnaHQgZWZmZWN0XHJcbiAgICBmb3IodWludCBpID0gMHU7aSA8IHVfbkxpZ2h0c1Nwb3Q7aSArKykge1xyXG4gICAgICB2ZWMzIHZjdFBvc2l0aW9uTGlnaHQgPSB2ZWMzKHVfc3BvdFtpXS5tdHhTaGFwZSAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSk7XHJcbiAgICAgIHZlYzMgdmN0RGlyZWN0aW9uID0gdmN0UG9zaXRpb24ueHl6IC0gdmN0UG9zaXRpb25MaWdodDtcclxuICAgICAgdmVjMyB2Y3REaXJlY3Rpb25JbnZlcnRlZCA9IG1hdDModV9zcG90W2ldLm10eFNoYXBlSW52ZXJzZSkgKiB2Y3REaXJlY3Rpb247XHJcbiAgICAgIGlmKHZjdERpcmVjdGlvbkludmVydGVkLnogPD0gMC4wKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGZsb2F0IGZJbnRlbnNpdHkgPSAxLjAgLSBtaW4oMS4wLCAyLjAgKiBsZW5ndGgodmN0RGlyZWN0aW9uSW52ZXJ0ZWQueHkpIC8gdmN0RGlyZWN0aW9uSW52ZXJ0ZWQueik7ICAgIC8vQ29uZXNoYXBlIHRoYXQgaXMgYnJpZ2h0ZXN0IGluIHRoZSBjZW50ZXIuIFBvc3NpYmxlIFRPRE86IFwiVmFyaWFibGUgU3BvdGxpZ2h0c29mdG5lc3NcIlxyXG4gICAgICBmSW50ZW5zaXR5ICo9IDEuMCAtIHBvdyh2Y3REaXJlY3Rpb25JbnZlcnRlZC56LCAyLjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1ByZXZlbnRzIGhhcnNoIGxpZ2h0aW5nIGFydGlmYWN0cyBhdCBib3VuZGFyeSBvZiB0aGUgZ2l2ZW4gc3BvdGxpZ2h0XHJcbiAgICAgIGlmKGZJbnRlbnNpdHkgPCAwLjApIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWxsdW1pbmF0ZURpcmVjdGVkKHZjdERpcmVjdGlvbiwgdmN0VmlldywgdmN0Tm9ybWFsLCB1X3Nwb3RbaV0udmN0Q29sb3IucmdiICogZkludGVuc2l0eSwgdl92Y3REaWZmdXNlLCB2X3ZjdFNwZWN1bGFyKTtcclxuICAgIH1cclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICAgLy8gVEVYVFVSRTogdHJhbnNmb3JtIFVWc1xyXG4gICNpZiBkZWZpbmVkKFRFWFRVUkUpIHx8IGRlZmluZWQoTk9STUFMTUFQKVxyXG5cclxuICAgIHZfdmN0VGV4dHVyZSA9IHZlYzIodV9tdHhQaXZvdCAqIHZlYzMoYV92Y3RUZXh0dXJlLCAxLjApKS54eTtcclxuXHJcbiAgI2VuZGlmXHJcblxyXG4gICNpZiBkZWZpbmVkKE1BVENBUClcclxuXHJcbiAgICB2ZWM0IHZjdFZlcnRleEluQ2FtZXJhID0gbm9ybWFsaXplKHVfbXR4V29ybGRUb0NhbWVyYSAqIHZjdFBvc2l0aW9uKTtcclxuICAgIHZjdFZlcnRleEluQ2FtZXJhLnh5ICo9IC0gMS4wO1xyXG4gICAgbWF0NCBtdHhfUm90WCA9IG1hdDQoMSwgMCwgMCwgMCwgMCwgdmN0VmVydGV4SW5DYW1lcmEueiwgdmN0VmVydGV4SW5DYW1lcmEueSwgMCwgMCwgLSB2Y3RWZXJ0ZXhJbkNhbWVyYS55LCB2Y3RWZXJ0ZXhJbkNhbWVyYS56LCAwLCAwLCAwLCAwLCAxKTtcclxuICAgIG1hdDQgbXR4X1JvdFkgPSBtYXQ0KHZjdFZlcnRleEluQ2FtZXJhLnosIDAsIC0gdmN0VmVydGV4SW5DYW1lcmEueCwgMCwgMCwgMSwgMCwgMCwgdmN0VmVydGV4SW5DYW1lcmEueCwgMCwgdmN0VmVydGV4SW5DYW1lcmEueiwgMCwgMCwgMCwgMCwgMSk7XHJcblxyXG4gICAgdmVjMyB2Y3ROb3JtYWwgPSBtYXQzKHVfbXR4Tm9ybWFsTWVzaFRvV29ybGQpICogYV92Y3ROb3JtYWw7XHJcblxyXG4gICAgLy8gYWRkcyBjb3JyZWN0aW9uIGZvciB0aGluZ3MgYmVpbmcgZmFyIGFuZCB0byB0aGUgc2lkZSwgYnV0IGRpc3RvcnRpb24gZm9yIHRoaW5ncyBiZWluZyBjbG9zZVxyXG4gICAgdmN0Tm9ybWFsID0gbWF0MyhtdHhfUm90WCAqIG10eF9Sb3RZKSAqIHZjdE5vcm1hbDtcclxuXHJcbiAgICB2ZWMzIHZjdFJlZmxlY3Rpb24gPSBub3JtYWxpemUobWF0Myh1X210eFdvcmxkVG9DYW1lcmEpICogbm9ybWFsaXplKHZjdE5vcm1hbCkpO1xyXG4gICAgdmN0UmVmbGVjdGlvbi55ID0gLSB2Y3RSZWZsZWN0aW9uLnk7XHJcblxyXG4gICAgdl92Y3RUZXh0dXJlID0gMC41ICogdmN0UmVmbGVjdGlvbi54eSArIDAuNTtcclxuXHJcbiAgI2VuZGlmXHJcbn1gO1xuXG59IiwiLy8gLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db2F0L0NvYXQudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG5cclxuICAvKipcclxuICAgKiBJbnRlcmZhY2UgdG8gYWNjZXNzIGRhdGEgZnJvbSBhIFdlYkdsIHNoYWRlcnByb2dyYW0uIFxyXG4gICAqIFRoaXMgc2hvdWxkIGFsd2F5cyBtaXJyb3IgdGhlIChzdGF0aWMpIGludGVyZmFjZSBvZiB7QGxpbmsgU2hhZGVyfS4gSXQgZXhwb3NlcyB0aGUgc3RhdGljIG1lbWJlcnMgb2YgU2hhZGVyIGluIGFuIGluc3RhbmNlLWJhc2VkIHdheS4gZS5nLjpcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogbGV0IHNoYWRlcjogU2hhZGVySW50ZXJmYWNlO1xyXG4gICAqIGBgYFxyXG4gICAqIGNhbiB0YWtlIHZhbHVlcyBvZiB0eXBlIFxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiB0eXBlb2YgU2hhZGVyIHwgU2hhZGVySW50ZWZhY2VcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBleHBvcnQgaW50ZXJmYWNlIFNoYWRlckludGVyZmFjZSB7XHJcbiAgICBkZWZpbmU6IHN0cmluZ1tdO1xyXG4gICAgcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xyXG4gICAgYXR0cmlidXRlczogeyBbbmFtZTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgICB1bmlmb3JtczogeyBbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb24gfTtcclxuICAgIC8qKiBSZXR1cm5zIHRoZSB2ZXJ0ZXggc2hhZGVyIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgZ2V0VmVydGV4U2hhZGVyU291cmNlKCk6IHN0cmluZztcclxuICAgIC8qKiBSZXR1cm5zIHRoZSBmcmFnbWVudCBzaGFkZXIgc291cmNlIGNvZGUgZm9yIHRoZSByZW5kZXIgZW5naW5lICovXHJcbiAgICBnZXRGcmFnbWVudFNoYWRlclNvdXJjZSgpOiBzdHJpbmc7XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IGRlY29yYXRvci4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS4gKi9cclxuICAgIGRlbGV0ZVByb2dyYW0odGhpczogU2hhZGVySW50ZXJmYWNlKTogdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgSW5qZWN0ZWQgYnkgZGVjb3JhdG9yLiBVc2VkIGJ5IHRoZSByZW5kZXIgc3lzdGVtLiAqL1xyXG4gICAgdXNlUHJvZ3JhbSh0aGlzOiBTaGFkZXJJbnRlcmZhY2UpOiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCBJbmplY3RlZCBieSBkZWNvcmF0b3IuIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovXHJcbiAgICBjcmVhdGVQcm9ncmFtKHRoaXM6IFNoYWRlckludGVyZmFjZSk6IHZvaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGF0aWMgc3VwZXJjbGFzcyBmb3IgdGhlIHJlcHJlc2VudGF0aW9uIG9mIFdlYkdsIHNoYWRlcnByb2dyYW1zLiBcclxuICAgKiBAYXV0aG9ycyBKYXNjaGEgS2FyYWfDtmwsIEhGVSwgMjAxOSB8IEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgLy8gVE9ETzogZGVmaW5lIGF0dHJpYnV0ZS91bmlmb3JtcyBhcyBsYXlvdXQgYW5kIHVzZSB0aG9zZSBjb25zaXN0ZW50bHkgaW4gc2hhZGVyc1xyXG4gIEBSZW5kZXJJbmplY3RvclNoYWRlci5kZWNvcmF0ZVxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXIge1xyXG4gICAgLyoqIHJlZmVycyBiYWNrIHRvIHRoaXMgY2xhc3MgZnJvbSBhbnkgc3ViY2xhc3MgZS5nLiBpbiBvcmRlciB0byBmaW5kIGNvbXBhdGlibGUgb3RoZXIgcmVzb3VyY2VzKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYmFzZUNsYXNzOiB0eXBlb2YgU2hhZGVyID0gU2hhZGVyO1xyXG4gICAgLyoqIGxpc3Qgb2YgYWxsIHRoZSBzdWJjbGFzc2VzIGRlcml2ZWQgZnJvbSB0aGlzIGNsYXNzLCBpZiB0aGV5IHJlZ2lzdGVyZWQgcHJvcGVybHkqL1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdWJjbGFzc2VzOiB0eXBlb2YgU2hhZGVyW10gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW107XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIHZlcnRleFNoYWRlclNvdXJjZTogc3RyaW5nO1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBmcmFnbWVudFNoYWRlclNvdXJjZTogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xyXG4gICAgcHVibGljIHN0YXRpYyBhdHRyaWJ1dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfTtcclxuICAgIHB1YmxpYyBzdGF0aWMgdW5pZm9ybXM6IHsgW25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9uIH07XHJcblxyXG4gICAgLyoqIFRoZSB0eXBlIG9mIGNvYXQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoaXMgc2hhZGVyIHRvIGNyZWF0ZSBhIG1hdGVyaWFsICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdENvbG9yZWQ7IH1cclxuICAgIC8qKiBSZXR1cm5zIHRoZSB2ZXJ0ZXggc2hhZGVyIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVuZGVyIGVuZ2luZSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyVW5pdmVyc2FsLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuICAgIC8qKiBSZXR1cm5zIHRoZSBmcmFnbWVudCBzaGFkZXIgc291cmNlIGNvZGUgZm9yIHRoZSByZW5kZXIgZW5naW5lICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclVuaXZlcnNhbC5mcmFnXCJdLCB0aGlzLmRlZmluZSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlcn0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlbGV0ZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlcn0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHVzZVByb2dyYW0odGhpczogdHlwZW9mIFNoYWRlcik6IHZvaWQgey8qIGluamVjdGVkIGJ5IGRlY29yYXRvciAqLyB9XHJcbiAgICAvKiogQGludGVybmFsIEluamVjdGVkIGJ5IHtAbGluayBSZW5kZXJJbmplY3RvclNoYWRlcn0uIFVzZWQgYnkgdGhlIHJlbmRlciBzeXN0ZW0uICovIC8vIFRPRE86IG1heWJlIGRvbid0IGZsYWcgdGhpcyBhcyBpbnRlcm5hbCwgc28gc2hhZGVycyBjYW4gYmUgcHJlY29tcGlsZWQgaW4gZnV0dXJlIEZVREdFIGFwcHMuIE9yIGNyZWF0ZSBhbiBBUEkgdG8gcHJlY29tcGlsZSBzaGFkZXJzLCBsb2FkIHRleHR1cmVzIGV0Yy5cclxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJvZ3JhbSh0aGlzOiB0eXBlb2YgU2hhZGVyKTogdm9pZCB7LyogaW5qZWN0ZWQgYnkgZGVjb3JhdG9yICovIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoX3N1YmNsYXNzOiB0eXBlb2YgU2hhZGVyKTogbnVtYmVyIHsgcmV0dXJuIFNoYWRlci5zdWJjbGFzc2VzLnB1c2goX3N1YmNsYXNzKSAtIDE7IH1cclxuXHJcbiAgICAvLyByZXBsYWNlIHRoZSBtYW5kYXRvcnkgaGVhZGVyIG9mIHRoZSBzaGFkZXIgd2l0aCBpdHNlbGYgcGx1cyB0aGUgZGVmaW5pdGlvbnMgZ2l2ZW5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgaW5zZXJ0RGVmaW5lcyhfc2hhZGVyOiBzdHJpbmcsIF9kZWZpbmVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICAgIGlmICghX2RlZmluZXMpXHJcbiAgICAgICAgcmV0dXJuIF9zaGFkZXI7XHJcblxyXG4gICAgICBsZXQgY29kZTogc3RyaW5nID0gXCIjdmVyc2lvbiAzMDAgZXNcXG5cIjtcclxuICAgICAgZm9yIChsZXQgZGVmaW5lIG9mIF9kZWZpbmVzKVxyXG4gICAgICAgIGNvZGUgKz0gYCNkZWZpbmUgJHtkZWZpbmV9XFxuYDtcclxuXHJcbiAgICAgIHJldHVybiBfc2hhZGVyLnJlcGxhY2UoXCIjdmVyc2lvbiAzMDAgZXNcIiwgY29kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckFtYmllbnRPY2NsdXNpb24gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyU2NyZWVuLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlckFtYmllbnRPY2NsdXNpb24uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJCbG9vbSBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFZlcnRleFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnREZWZpbmVzKHNoYWRlclNvdXJjZXNbXCJTaGFkZXJTY3JlZW4udmVydFwiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyQmxvb20uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJGbGF0IGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJGbGF0KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiRkxBVFwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckZsYXRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJGbGF0U2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkZMQVRcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmU7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyRmxhdFRleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJGbGF0VGV4dHVyZWQpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJGTEFUXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyRmxhdFRleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyRmxhdFRleHR1cmVkU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkZMQVRcIixcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR2l6bW8gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8udmVydFwiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJHaXptb1RleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcIlRFWFRVUkVcIl07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8udmVydFwiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RnJhZ21lbnRTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyR2l6bW8uZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJHb3VyYXVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJHb3VyYXVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiR09VUkFVRFwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckdvdXJhdWRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJHb3VyYXVkU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkdPVVJBVURcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmU7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR291cmF1ZFRleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJHb3VyYXVkVGV4dHVyZWQpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJHT1VSQVVEXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyR291cmF1ZFRleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyR291cmF1ZFRleHR1cmVkU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIkdPVVJBVURcIixcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0UmVtaXNzaXZlVGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTGl0IGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJMaXQpO1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlckxpdFNraW4gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlckxpdFNraW4pO1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTGl0VGV4dHVyZWQgZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlckxpdFRleHR1cmVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiVEVYVFVSRVwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0VGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTGl0VGV4dHVyZWRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJMaXRUZXh0dXJlZFNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJURVhUVVJFXCIsXHJcbiAgICAgIFwiU0tJTlwiXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29hdCgpOiB0eXBlb2YgQ29hdCB7IHJldHVybiBDb2F0VGV4dHVyZWQ7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyTWF0Q2FwIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJNYXRDYXApO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJNQVRDQVBcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRleHR1cmVkOyB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlclBob25nIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJQaG9uZyk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlBIT05HXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmU7IH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyUGhvbmdTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJQaG9uZ1NraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZTsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJQaG9uZ1RleHR1cmVkKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJURVhUVVJFXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmVUZXh0dXJlZDsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkTm9ybWFscyBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyUGhvbmdUZXh0dXJlZE5vcm1hbHMpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRFWFRVUkVcIixcclxuICAgICAgXCJOT1JNQUxNQVBcIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFsczsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkTm9ybWFsc1NraW4gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlclBob25nVGV4dHVyZWROb3JtYWxzU2tpbik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlBIT05HXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiLFxyXG4gICAgICBcIk5PUk1BTE1BUFwiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFJlbWlzc2l2ZVRleHR1cmVkTm9ybWFsczsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaG9uZ1RleHR1cmVkU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyUGhvbmdUZXh0dXJlZFNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRFWFRVUkVcIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRSZW1pc3NpdmVUZXh0dXJlZDsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaWNrIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFZlcnRleFNoYWRlclNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnREZWZpbmVzKHNoYWRlclNvdXJjZXNbXCJTaGFkZXJQaWNrLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2suZnJhZ1wiXSwgdGhpcy5kZWZpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJQaWNrVGV4dHVyZWQgZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWZXJ0ZXhTaGFkZXJTb3VyY2UoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGVmaW5lcyhzaGFkZXJTb3VyY2VzW1wiU2hhZGVyUGlja1RleHR1cmVkLnZlcnRcIl0sIHRoaXMuZGVmaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYWdtZW50U2hhZGVyU291cmNlKCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydERlZmluZXMoc2hhZGVyU291cmNlc1tcIlNoYWRlclBpY2tUZXh0dXJlZC5mcmFnXCJdLCB0aGlzLmRlZmluZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYWRlclRvb24gZXh0ZW5kcyBTaGFkZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpU3ViY2xhc3M6IG51bWJlciA9IFNoYWRlci5yZWdpc3RlclN1YmNsYXNzKFNoYWRlclRvb24pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRPT05cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRvb247IH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJUb29uU2tpbiBleHRlbmRzIFNoYWRlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlTdWJjbGFzczogbnVtYmVyID0gU2hhZGVyLnJlZ2lzdGVyU3ViY2xhc3MoU2hhZGVyVG9vblNraW4pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRPT05cIixcclxuICAgICAgXCJTS0lOXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRUb29uOyB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgU2hhZGVyVG9vblRleHR1cmVkIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJUb29uVGV4dHVyZWQpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJQSE9OR1wiLFxyXG4gICAgICBcIlRPT05cIixcclxuICAgICAgXCJURVhUVVJFXCJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2F0KCk6IHR5cGVvZiBDb2F0IHsgcmV0dXJuIENvYXRUb29uVGV4dHVyZWQ7IH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaGFkZXJUb29uVGV4dHVyZWRTa2luIGV4dGVuZHMgU2hhZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaVN1YmNsYXNzOiBudW1iZXIgPSBTaGFkZXIucmVnaXN0ZXJTdWJjbGFzcyhTaGFkZXJUb29uVGV4dHVyZWRTa2luKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZTogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiUEhPTkdcIixcclxuICAgICAgXCJUT09OXCIsXHJcbiAgICAgIFwiVEVYVFVSRVwiLFxyXG4gICAgICBcIlNLSU5cIlxyXG4gICAgXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvYXQoKTogdHlwZW9mIENvYXQgeyByZXR1cm4gQ29hdFRvb25UZXh0dXJlZDsgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKiB7QGxpbmsgVGV4SW1hZ2VTb3VyY2V9IGlzIGEgdW5pb24gdHlwZSB3aGljaCBhcyBvZiBub3cgaW5jbHVkZXMge0BsaW5rIFZpZGVvRnJhbWV9LiBBbGwgb3RoZXIgcGFydHMgb2YgdGhpcyB1bmlvbiBoYXZlIGEgLndpZHRoIGFuZCAuaGVpZ2h0IHByb3BlcnR5IGJ1dCBWaWRlb0ZyYW1lIGRvZXMgbm90LiBBbmQgc2luY2Ugd2Ugb25seSBldmVyIHVzZSB7QGxpbmsgSFRNTEltYWdlRWxlbWVudH0gYW5kIHtAbGluayBPZmZzY3JlZW5DYW52YXN9IGN1cnJlbnRseSBWaWRlb0ZyYW1lIGNhbiBiZSBleGNsdWRlZCBmb3IgY29udmVuaWVuY2Ugb2YgYWNjZXNzaW5nIC53aWR0aCBhbmQgLmhlaWdodCAqL1xyXG4gIHR5cGUgSW1hZ2VTb3VyY2UgPSBFeGNsdWRlPFRleEltYWdlU291cmNlLCBWaWRlb0ZyYW1lPjtcclxuXHJcbiAgLyoqXHJcbiAgICogLSBDUklTUDogbm8gbWlwbWFwcGluZywgbWFnIGZpbHRlciBuZWFyZXN0LCBtaW4gZmlsdGVyIG5lYXJlc3RcclxuICAgKiAtIE1FRElVTTogbWlwbWFwcGluZywgbWFnIGZpbHRlciBuZWFyZXN0LCBtaW4gZmlsdGVyIG5lYXJlc3RfbWlwbWFwX2xpbmVhclxyXG4gICAqIC0gQkxVUlJZOiBtaXBtYXBwaW5nLCBtYWcgZmlsdGVyIGxpbmVhciwgbWluIGZpbHRlciBsaW5lYXJfbWlwbWFwX2xpbmVhclxyXG4gICAqIC0gU01PT1RIOiBubyBtaXBtYXBwaW5nLCBtYWcgZmlsdGVyIGxpbmVhciwgbWluIGZpbHRlciBsaW5lYXJcclxuICAgKi9cclxuICBleHBvcnQgZW51bSBNSVBNQVAge1xyXG4gICAgQ1JJU1AsIE1FRElVTSwgQkxVUlJZLCBTTU9PVEhcclxuICB9XHJcblxyXG4gIGV4cG9ydCBlbnVtIFdSQVAge1xyXG4gICAgUkVQRUFULCBDTEFNUCwgTUlSUk9SXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXNlY2xhc3MgZm9yIGRpZmZlcmVudCBraW5kcyBvZiB0ZXh0dXJlcy4gXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBAUmVuZGVySW5qZWN0b3JUZXh0dXJlLmRlY29yYXRlXHJcbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRleHR1cmUgZXh0ZW5kcyBNdXRhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlUmVzb3VyY2Uge1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICAgIHB1YmxpYyBpZFJlc291cmNlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlbmRlckRhdGE6IHVua25vd247XHJcblxyXG4gICAgcHJvdGVjdGVkIHRleHR1cmVEaXJ0eTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcm90ZWN0ZWQgbWlwbWFwRGlydHk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJvdGVjdGVkIHdyYXBEaXJ0eTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgI21pcG1hcDogTUlQTUFQID0gTUlQTUFQLkNSSVNQO1xyXG4gICAgI3dyYXA6IFdSQVAgPSBXUkFQLlJFUEVBVDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZyA9IFwiVGV4dHVyZVwiKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgIHRoaXMubmFtZSA9IF9uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgbWlwbWFwKF9taXBtYXA6IE1JUE1BUCkge1xyXG4gICAgICB0aGlzLiNtaXBtYXAgPSBfbWlwbWFwO1xyXG4gICAgICB0aGlzLm1pcG1hcERpcnR5ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG1pcG1hcCgpOiBNSVBNQVAge1xyXG4gICAgICByZXR1cm4gdGhpcy4jbWlwbWFwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgd3JhcChfd3JhcDogV1JBUCkge1xyXG4gICAgICB0aGlzLiN3cmFwID0gX3dyYXA7XHJcbiAgICAgIHRoaXMud3JhcERpcnR5ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHdyYXAoKTogV1JBUCB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN3cmFwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW1hZ2Ugc291cmNlIG9mIHRoaXMgdGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic3RyYWN0IGdldCB0ZXhJbWFnZVNvdXJjZSgpOiBJbWFnZVNvdXJjZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBhbmQgYmluZHMgdGhlIHRleHR1cmUgaW4gV2ViR0wgZnJvbSB0aGUge0BsaW5rIHRleEltYWdlU291cmNlfS4gXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JUZXh0dXJlfS4gVXNlZCBieSB0aGUgcmVuZGVyIHN5c3RlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXNlUmVuZGVyRGF0YShfdGV4dHVyZVVuaXQ6IG51bWJlciA9IDApOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZXMgdGhlIHRleHR1cmUgaW4gV2ViR0wgZnJlZWluZyB0aGUgYWxsb2NhdGVkIGdwdSBtZW1vcnkuXHJcbiAgICAgKiBJbmplY3RlZCBieSB7QGxpbmsgUmVuZGVySW5qZWN0b3JUZXh0dXJlfS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVuZGVyRGF0YSgpOiB2b2lkIHsvKiBpbmplY3RlZCBieSBSZW5kZXJJbmplY3RvciovIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZnJlc2hlcyB0aGUgaW1hZ2UgZGF0YSBpbiB0aGUgcmVuZGVyIGVuZ2luZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudGV4dHVyZURpcnR5ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gVHJhbnNmZXJcclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIGxldCBzZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uID0ge1xyXG4gICAgICAgIGlkUmVzb3VyY2U6IHRoaXMuaWRSZXNvdXJjZSxcclxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgbWlwbWFwOiBNSVBNQVBbdGhpcy4jbWlwbWFwXSxcclxuICAgICAgICB3cmFwOiBXUkFQW3RoaXMuI3dyYXBdXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgUHJvamVjdC5yZWdpc3Rlcih0aGlzLCBfc2VyaWFsaXphdGlvbi5pZFJlc291cmNlKTtcclxuICAgICAgdGhpcy5uYW1lID0gX3NlcmlhbGl6YXRpb24ubmFtZTtcclxuICAgICAgdGhpcy4jbWlwbWFwID0gPG51bWJlcj48dW5rbm93bj5NSVBNQVBbX3NlcmlhbGl6YXRpb24ubWlwbWFwXTtcclxuICAgICAgdGhpcy4jd3JhcCA9IDxudW1iZXI+PHVua25vd24+V1JBUFtfc2VyaWFsaXphdGlvbi53cmFwXTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE11dGF0b3IoX2V4dGVuZGFibGU/OiBib29sZWFuKTogTXV0YXRvciB7XHJcbiAgICAgIGxldCBtdXRhdG9yOiBNdXRhdG9yID0gc3VwZXIuZ2V0TXV0YXRvcih0cnVlKTtcclxuICAgICAgbXV0YXRvci5taXBtYXAgPSB0aGlzLiNtaXBtYXA7XHJcbiAgICAgIG11dGF0b3Iud3JhcCA9IHRoaXMuI3dyYXA7XHJcbiAgICAgIHJldHVybiBtdXRhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNdXRhdG9yQXR0cmlidXRlVHlwZXMoX211dGF0b3I6IE11dGF0b3IpOiBNdXRhdG9yQXR0cmlidXRlVHlwZXMge1xyXG4gICAgICBsZXQgdHlwZXM6IE11dGF0b3JBdHRyaWJ1dGVUeXBlcyA9IHN1cGVyLmdldE11dGF0b3JBdHRyaWJ1dGVUeXBlcyhfbXV0YXRvcik7XHJcbiAgICAgIGlmICh0eXBlcy5taXBtYXApXHJcbiAgICAgICAgdHlwZXMubWlwbWFwID0gTUlQTUFQO1xyXG4gICAgICBpZiAodHlwZXMud3JhcClcclxuICAgICAgICB0eXBlcy53cmFwID0gV1JBUDtcclxuICAgICAgcmV0dXJuIHR5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZWR1Y2VNdXRhdG9yKF9tdXRhdG9yOiBNdXRhdG9yKTogdm9pZCB7XHJcbiAgICAgIGRlbGV0ZSBfbXV0YXRvci5pZFJlc291cmNlO1xyXG4gICAgICBkZWxldGUgX211dGF0b3IucmVuZGVyRGF0YTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLnRleHR1cmVEaXJ0eTtcclxuICAgICAgZGVsZXRlIF9tdXRhdG9yLm1pcG1hcERpcnR5O1xyXG4gICAgICBkZWxldGUgX211dGF0b3IubWlwbWFwR2VuZXJhdGVkO1xyXG4gICAgICBkZWxldGUgX211dGF0b3Iud3JhcERpcnR5O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGV4dHVyZSBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgaW1hZ2VcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZUltYWdlIGV4dGVuZHMgVGV4dHVyZSB7XHJcbiAgICBwdWJsaWMgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgPSBudWxsO1xyXG4gICAgcHVibGljIHVybDogUmVxdWVzdEluZm87XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF91cmw/OiBSZXF1ZXN0SW5mbykge1xyXG4gICAgICBzdXBlcigpO1xyXG4gICAgICBpZiAoX3VybCkge1xyXG4gICAgICAgIHRoaXMubG9hZChfdXJsKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBfdXJsLnRvU3RyaW5nKCkuc3BsaXQoXCIvXCIpLnBvcCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBQcm9qZWN0LnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbWFnZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzeW5jaHJvbm91c2x5IGxvYWRzIHRoZSBpbWFnZSBmcm9tIHRoZSBnaXZlbiB1cmxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGxvYWQoX3VybDogUmVxdWVzdEluZm8pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgdGhpcy51cmwgPSBfdXJsO1xyXG4gICAgICB0aGlzLmltYWdlID0gbmV3IEltYWdlKCk7XHJcblxyXG5cclxuICAgICAgLy8gY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgd2luZG93LmZldGNoKHRoaXMudXJsKTtcclxuICAgICAgLy8gY29uc3QgYmxvYjogQmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcclxuICAgICAgLy8gbGV0IG9iamVjdFVSTDogc3RyaW5nID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgLy8gdGhpcy5pbWFnZS5zcmMgPSBvYmplY3RVUkw7XHJcblxyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbWFnZS5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlckRhdGEgPSBudWxsOyAvLyByZWZyZXNoIHJlbmRlciBkYXRhIG9uIG5leHQgZHJhdyBjYWxsXHJcbiAgICAgICAgICBfcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsICgpID0+IF9yZWplY3QoKSk7XHJcbiAgICAgICAgdGhpcy5pbWFnZS5zcmMgPSBuZXcgVVJMKHRoaXMudXJsLnRvU3RyaW5nKCksIFByb2plY3QuYmFzZVVSTCkudG9TdHJpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFRyYW5zZmVyXHJcbiAgICBwdWJsaWMgc2VyaWFsaXplKCk6IFNlcmlhbGl6YXRpb24ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHVybDogdGhpcy51cmwsXHJcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLCAvLyBzZXJpYWxpemUgZm9yIGVkaXRvciB2aWV3c1xyXG4gICAgICAgIFtzdXBlci5jb25zdHJ1Y3Rvci5uYW1lXTogc3VwZXIuc2VyaWFsaXplKClcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZShfc2VyaWFsaXphdGlvbjogU2VyaWFsaXphdGlvbik6IFByb21pc2U8U2VyaWFsaXphYmxlPiB7XHJcbiAgICAgIGF3YWl0IHN1cGVyLmRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdKTtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkKF9zZXJpYWxpemF0aW9uLnVybCk7XHJcbiAgICAgIC8vIHRoaXMudHlwZSBpcyBhbiBhY2Nlc3NvciBvZiBNdXRhYmxlIGRvZXNuJ3QgbmVlZCB0byBiZSBkZXNlcmlhbGl6ZWRcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG11dGF0ZShfbXV0YXRvcjogTXV0YXRvciwgX3NlbGVjdGlvbjogc3RyaW5nW10gPSBudWxsLCBfZGlzcGF0Y2hNdXRhdGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmIChfbXV0YXRvci51cmwgJiYgX211dGF0b3IudXJsICE9IHRoaXMudXJsLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkKF9tdXRhdG9yLnVybCk7XHJcbiAgICAgIC8vIGV4Y2VwdCB1cmwgZnJvbSBtdXRhdG9yIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgICAgZGVsZXRlIChfbXV0YXRvci51cmwpO1xyXG4gICAgICBhd2FpdCBzdXBlci5tdXRhdGUoX211dGF0b3IsIF9zZWxlY3Rpb24sIF9kaXNwYXRjaE11dGF0ZSk7XHJcbiAgICAgIC8vIFRPRE86IGV4YW1pbmUgbmVjZXNzaXR5IHRvIHJlY29uc3RydWN0LCBpZiBtdXRhdG9yIGlzIGtlcHQgYnkgY2FsbGVyXHJcbiAgICAgIC8vIF9tdXRhdG9yLnVybCA9IHRoaXMudXJsOyBcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGV4dHVyZSBjcmVhdGVkIGZyb20gYSBjYW52YXNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZUJhc2U2NCBleHRlbmRzIFRleHR1cmUge1xyXG4gICAgcHVibGljIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50ID0gbmV3IEltYWdlKCk7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcsIF9iYXNlNjQ6IHN0cmluZywgX21pcG1hcDogTUlQTUFQID0gTUlQTUFQLkNSSVNQLCBfd3JhcDogV1JBUCA9IFdSQVAuUkVQRUFULCBfd2lkdGg/OiBudW1iZXIsIF9oZWlnaHQ/OiBudW1iZXIpIHtcclxuICAgICAgc3VwZXIoX25hbWUpO1xyXG4gICAgICB0aGlzLmltYWdlLnNyYyA9IF9iYXNlNjQ7XHJcbiAgICAgIHRoaXMubWlwbWFwID0gX21pcG1hcDtcclxuICAgICAgdGhpcy53cmFwID0gX3dyYXA7XHJcbiAgICAgIGlmIChfd2lkdGgpXHJcbiAgICAgICAgdGhpcy5pbWFnZS53aWR0aCA9IF93aWR0aDtcclxuICAgICAgaWYgKF9oZWlnaHQpXHJcbiAgICAgICAgdGhpcy5pbWFnZS5oZWlnaHQgPSBfaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4SW1hZ2VTb3VyY2UoKTogSW1hZ2VTb3VyY2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbWFnZTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGV4dHVyZSBjcmVhdGVkIGZyb20gYSBjYW52YXNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGV4dHVyZUNhbnZhcyBleHRlbmRzIFRleHR1cmUge1xyXG4gICAgcHVibGljIGNyYzI6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoX25hbWU6IHN0cmluZywgX2NyYzI6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCkge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMuY3JjMiA9IF9jcmMyO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB0ZXhJbWFnZVNvdXJjZSgpOiBJbWFnZVNvdXJjZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNyYzIuY2FudmFzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGV4dHVyZSBjcmVhdGVkIGZyb20gYSB0ZXh0LiBUZXh0dXJlIHVwYXRlcyB3aGVuIHRoZSB0ZXh0IG9yIGZvbnQgY2hhbmdlcy4gVGhlIHRleHR1cmUgaXMgcmVzaXplZCB0byBmaXQgdGhlIHRleHQuXHJcbiAgICogQGF1dGhvcnMgSm9uYXMgUGxvdHpreSwgSEZVLCAyMDI0XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRleHR1cmVUZXh0IGV4dGVuZHMgVGV4dHVyZSB7XHJcbiAgICBwcm90ZWN0ZWQgY3JjMjogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xyXG4gICAgI3RleHQ6IHN0cmluZztcclxuICAgICNmb250OiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF9uYW1lOiBzdHJpbmcsIF90ZXh0OiBzdHJpbmcgPSBcIlRleHRcIiwgX2ZvbnQ6IHN0cmluZyA9IFwiMjBweCBtb25vc3BhY2VcIikge1xyXG4gICAgICBzdXBlcihfbmFtZSk7XHJcbiAgICAgIHRoaXMuY3JjMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICB0aGlzLnRleHQgPSBfdGV4dDtcclxuICAgICAgdGhpcy5mb250ID0gX2ZvbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0ZXh0KF90ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgdGhpcy4jdGV4dCA9IF90ZXh0O1xyXG4gICAgICB0aGlzLnRleHR1cmVEaXJ0eSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiB0aGlzLiN0ZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZm9udChfZm9udDogc3RyaW5nKSB7XHJcbiAgICAgIHRoaXMuI2ZvbnQgPSBfZm9udDtcclxuICAgICAgZG9jdW1lbnQuZm9udHMubG9hZCh0aGlzLiNmb250KVxyXG4gICAgICAgIC5jYXRjaCgoX2Vycm9yKSA9PiBEZWJ1Zy5lcnJvcihgJHtUZXh0dXJlVGV4dC5uYW1lfTogJHtfZXJyb3J9YCkpXHJcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy50ZXh0dXJlRGlydHkgPSB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGZvbnQoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2ZvbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0ZXhJbWFnZVNvdXJjZSgpOiBJbWFnZVNvdXJjZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbnZhcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbnZhcy53aWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5jYW52YXMuaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaGFzVHJhbnNwYXJlbmN5KCk6IGJvb2xlYW4ge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldCBjYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXMge1xyXG4gICAgICByZXR1cm4gdGhpcy5jcmMyLmNhbnZhcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXNlUmVuZGVyRGF0YShfdGV4dHVyZVVuaXQ/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMudGV4dHVyZURpcnR5KSB7XHJcbiAgICAgICAgdGhpcy5jcmMyLmZvbnQgPSB0aGlzLmZvbnQ7XHJcblxyXG4gICAgICAgIGxldCBtZXRyaWNzOiBUZXh0TWV0cmljcyA9IHRoaXMuY3JjMi5tZWFzdXJlVGV4dCh0aGlzLnRleHQpO1xyXG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gbWV0cmljcy53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXIgPSBtZXRyaWNzLmZvbnRCb3VuZGluZ0JveEFzY2VudCArIG1ldHJpY3MuZm9udEJvdW5kaW5nQm94RGVzY2VudDtcclxuXHJcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aCArIHRoaXMuY3JjMi5tZWFzdXJlVGV4dChcIiAgXCIpLndpZHRoO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIDEuMTsgLy8gcGFkZGluZywgb3RoZXJ3aXNlIG9uIHNvbWUgZ2x5cGhzIG1pZ2h0IGdldCBjdXQgb2ZmXHJcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzLndpZHRoID09IDApXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY3JjMi5mb250ID0gdGhpcy5mb250OyAvLyBUT0RPOiB3YWl0IGZvciBmb250IHRvIGJlIGxvYWRlZCB1c2luZyBkb2N1bWVudC5mb250c1xyXG4gICAgICAgIHRoaXMuY3JjMi50ZXh0QWxpZ24gPSBcImNlbnRlclwiO1xyXG4gICAgICAgIHRoaXMuY3JjMi50ZXh0QmFzZWxpbmUgPSBcIm1pZGRsZVwiO1xyXG4gICAgICAgIHRoaXMuY3JjMi5maWxsU3R5bGUgPSBcIndoaXRlXCI7XHJcbiAgICAgICAgdGhpcy5jcmMyLmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLmNyYzIuZmlsbFRleHQodGhpcy4jdGV4dCwgdGhpcy5jYW52YXMud2lkdGggLyAyLCB0aGlzLmNhbnZhcy5oZWlnaHQgLyAyKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3VwZXIudXNlUmVuZGVyRGF0YShfdGV4dHVyZVVuaXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXJpYWxpemUoKTogU2VyaWFsaXphdGlvbiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgW3N1cGVyLmNvbnN0cnVjdG9yLm5hbWVdOiBzdXBlci5zZXJpYWxpemUoKSxcclxuICAgICAgICB0ZXh0OiB0aGlzLnRleHQsXHJcbiAgICAgICAgZm9udDogdGhpcy5mb250XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGRlc2VyaWFsaXplKF9zZXJpYWxpemF0aW9uOiBTZXJpYWxpemF0aW9uKTogUHJvbWlzZTxTZXJpYWxpemFibGU+IHtcclxuICAgICAgYXdhaXQgc3VwZXIuZGVzZXJpYWxpemUoX3NlcmlhbGl6YXRpb25bc3VwZXIuY29uc3RydWN0b3IubmFtZV0pO1xyXG4gICAgICB0aGlzLnRleHQgPSBfc2VyaWFsaXphdGlvbi50ZXh0O1xyXG4gICAgICB0aGlzLmZvbnQgPSBfc2VyaWFsaXphdGlvbi5mb250O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TXV0YXRvcihfZXh0ZW5kYWJsZT86IGJvb2xlYW4pOiBNdXRhdG9yIHtcclxuICAgICAgbGV0IG11dGF0b3I6IE11dGF0b3IgPSBzdXBlci5nZXRNdXRhdG9yKHRydWUpO1xyXG4gICAgICBtdXRhdG9yLnRleHQgPSB0aGlzLnRleHQ7XHJcbiAgICAgIG11dGF0b3IuZm9udCA9IHRoaXMuZm9udDtcclxuICAgICAgcmV0dXJuIG11dGF0b3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUZXh0dXJlIGNyZWF0ZWQgZnJvbSBhIEZVREdFLVNrZXRjaFxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUZXh0dXJlU2tldGNoIGV4dGVuZHMgVGV4dHVyZUNhbnZhcyB7XHJcbiAgICBwdWJsaWMgZ2V0IHRleEltYWdlU291cmNlKCk6IEltYWdlU291cmNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRleHR1cmUgY3JlYXRlZCBmcm9tIGFuIEhUTUwtcGFnZVxyXG4gICAqL1xyXG4gIGV4cG9ydCBjbGFzcyBUZXh0dXJlSFRNTCBleHRlbmRzIFRleHR1cmVDYW52YXMge1xyXG4gICAgcHVibGljIGdldCB0ZXhJbWFnZVNvdXJjZSgpOiBJbWFnZVNvdXJjZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIGV4cG9ydCBjbGFzcyBUZXh0dXJlRGVmYXVsdCBleHRlbmRzIFRleHR1cmVCYXNlNjQge1xyXG4gICAgcHVibGljIHN0YXRpYyBjb2xvcjogVGV4dHVyZUJhc2U2NCA9IG5ldyBUZXh0dXJlRGVmYXVsdChcIlRleHR1cmVEZWZhdWx0XCIsIFRleHR1cmVEZWZhdWx0LmdldENvbG9yKCksIE1JUE1BUC5NRURJVU0pO1xyXG4gICAgcHVibGljIHN0YXRpYyBub3JtYWw6IFRleHR1cmVCYXNlNjQgPSBuZXcgVGV4dHVyZURlZmF1bHQoXCJUZXh0dXJlTm9ybWFsRGVmYXVsdFwiLCBUZXh0dXJlRGVmYXVsdC5nZXROb3JtYWwoKSwgTUlQTUFQLk1FRElVTSk7XHJcbiAgICBwdWJsaWMgc3RhdGljIHRvb246IFRleHR1cmVCYXNlNjQgPSBuZXcgVGV4dHVyZURlZmF1bHQoXCJUZXh0dXJlVG9vbkRlZmF1bHRcIiwgVGV4dHVyZURlZmF1bHQuZ2V0VG9vbigpLCBNSVBNQVAuU01PT1RILCBXUkFQLkNMQU1QKTtcclxuXHJcbiAgICAvLyBUT0RPOiBtYXliZSBtYWtlIHRoZXNlIGxhenlcclxuICAgIHB1YmxpYyBzdGF0aWMgaWNvbkxpZ2h0OiBUZXh0dXJlQmFzZTY0ID0gbmV3IFRleHR1cmVEZWZhdWx0KFwiSWNvbkRlZmF1bHRMaWdodFwiLCBUZXh0dXJlRGVmYXVsdC5nZXRJY29uTGlnaHQoKSwgTUlQTUFQLkJMVVJSWSwgV1JBUC5DTEFNUCwgMjU2LCAyNTYpO1xyXG4gICAgcHVibGljIHN0YXRpYyBpY29uQ2FtZXJhOiBUZXh0dXJlQmFzZTY0ID0gbmV3IFRleHR1cmVEZWZhdWx0KFwiSWNvbkRlZmF1bHRDYW1lcmFcIiwgVGV4dHVyZURlZmF1bHQuZ2V0SWNvbkNhbWVyYSgpLCBNSVBNQVAuQkxVUlJZLCBXUkFQLkNMQU1QLCAyNTYsIDI1Nik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGljb25BdWRpbzogVGV4dHVyZUJhc2U2NCA9IG5ldyBUZXh0dXJlRGVmYXVsdChcIkljb25EZWZhdWx0QXVkaW9cIiwgVGV4dHVyZURlZmF1bHQuZ2V0SWNvbkF1ZGlvKCksIE1JUE1BUC5CTFVSUlksIFdSQVAuQ0xBTVAsIDI1NiwgMjU2KTtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgaWNvblBhcnRpY2xlczogVGV4dHVyZUJhc2U2NCA9IG5ldyBUZXh0dXJlRGVmYXVsdChcIkljb25EZWZhdWx0UGFydGljbGVcIiwgVGV4dHVyZURlZmF1bHQuZ2V0SWNvblBhcnRpY2xlcygpLCBNSVBNQVAuQkxVUlJZLCAyNTYsIDI1Nik7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q29sb3IoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFaQUFBQUdRQ0FZQUFBQ0F2emJNQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBRFdMU1VSQlZIaGU3ZDBIbkZUbHZmL3hIOXVYWllHbDl5clNSSnBFVWV4WXNKSWJhOFJlNDk4V05jWkViKzQxZXBPSXNXczBOaXl4bTJnMGR1d2Fld083b3FKQ0FHblN0N0gvODMwNEI0ZGxkcGs1WjNiM3pPN256ZXU4NXB3ek04dk1zN1BQYjM1UE82MXFQQlpqclZxMTh2ZmlLZWJGUi9sRlJQbEZRL2xGRS9meXkvRnZBUUJJQ3dFRUFCQUtBUVFBRUFwOUlCSFJoaG9ONVJjTjVSZE5TeWcvL1l6Q3drSnIzYnExTzE2OWVyWGJNb0VBRWhGL3dORlFmdEZRZnRFMDkvTEx6YzIxTGwyNjJFOSs4aE1iUDM2OFZWZFgyK3V2djI3VHAwOTNRU1RxK3llQVJNUWZjRFNVWHpTVVh6VE50Znh5Y25Lc3BLVEVCZzBhWkVjZWVhUWRldWlodG1MRkN2dnNzODlzM3J4NTl2ampqOXZERHo4Y09ST0pIRUNxcXFwczl1elp0bXpaTWx1NWNxVkxsZHExYTJkOSsvWjErMUh4QVl5RzhvdUc4b3VHOG9zbVRQbmw1K2RiOSs3ZGJmZmRkN2RUVHozVjFjWHZ2dnV1dmZ6eXl5NERrVldyVnRtTk45NW9TNVlzY2NkaGhRNGc1ZVhsOXV5eno5cU1HVE5zelpvMS90a2ZLUUlxK3UyOTk5NVdXbHJxbjAwZkg4Qm9LTDlvS0w5b0tMOW8waWsvUGJaTm16YTJ4UlpiMkhISEhXZVRKMCsyaFFzWDJwTlBQbW1MRnkvMkg3WE9mLzd6SDd2MTFsdGRQUjVGcUFDeVlNRUN1K2VlZTFLS1htdlhyclg5OXR2UFJvOGU3WUpLdXZnQVJrUDVSUk9Vbno2NytpS1VsNWRubFpXVnRuejU4bGk4ZGo1LzBUU244bE9UMWI3Nzdtc1hYSENCZGU3YzJWNTc3VFY3ODgwM2s3N0hiNy85MXU2NDR3NnJxS2p3ejRTVGRnQlJ0cUhVSjRob0NoQ2ZmUEtKZmZYVlY2NDlyWDM3OWpaZ3dBQzNCWlF1VFpvMHliYmJianVYWHFXREQyQTBsRjgwUWZsMTdOalJqam5tR092VXFaTjk4ODAzOXNBREQ3Z3ZVazM5K3ZuOFJkT2N5cTlyMTY0MmRlcFUyM3JycmUzUlJ4OTFYM0pFZGJTYXNJcUxpMjNZc0dIdVhLWUNTTm9wZ1hydmcrQ2gvby83N3J2UHZWaTkrSi8vL09kMjlORkgyOUNoUTkwTERHajRtTklsQlptNC84TFFzc3ljT2RNMXhiNzY2cXRKbTJKRjJVZlBuajN0MTcvK3RVMllNTUYyM1hWWE8vYllZMTFRUWZNMWYvNTh1K21tbTF6ZmdmcDQ0MDcxc1Y2elBzdEI4RkE5ckMvOFR6MzFsT3NYeWJTME1wQWZmdmpCcnI3NjZ2VWRNVUVmaUZLbS9mZmYzOHJLeXRhbitNcEdWUGpCWS9YSHFlempyTFBPY3Azc3FlSWJURFNVWC8zKzhJYy91TStyNkV2UVQzLzZVemZzTVNnMzNTcUFxRjM1bVdlZXNXdXZ2ZGFkbDRjZWVzamVlKzg5LzZocDhQbUxwcjd5MDZpbEs2KzgwbFhNMHI5L2Z4czVjcVQ3Z2x4UVVPRE9OYlIweWkvNG9uUEVFVWU0WTQyMGV1ZWRkOXhncHFPT09zcDIzSEZITndwTG1pUUQrZUNERHpib3hYLzc3YmRkeG5IZ2dRZGFuejU5ckczYnRpN2JVSURvMXEyYjYwQVBGQlVWMlhQUFBSZUx0QjlJUm45UUw3MzBVc29kaTdVN0p0RzhxRU42bDExMjhZL012djc2YS92blAvOXBmLzd6biszQkJ4KzBMNy84TWxaMW1acXE1czZkNno3SCtxS2paaXZSKzFEZ0N5WVNabEphQWVTTEw3N3c5OHcrLy94ejk4SVU3ZlROTFZta0hERml4QVlkNTNxODNsVFVubitnSVNqRDFsRDBWQ3VGNE1zVW1pLzFKNmh6V3ArSllGUEdxcVpQVmRTWFhucXB5MHcxMmlrTzlKbFVkckYwNmRMMW4yTk5KbXlvakNubEFLSVg4OTEzMy9sSDVpS2Qyb1BWcnBZWUpCS3BPVXVqQVFMcWdIenJyYmZxYkdzR2dEaFIzVFp1M0xpTjZyaWdjdFlYamxkZWVjVjk0Ny8rK3V2dGpUZmVjSzB6VFNsNGJZMGg1UUNpYjJkQlc2Qm9DSytHNXFwbnZ6N0tUZ0pxMnZyMDAwL0pRQUJrRFRYLzFGY3BCL2VwQTF2OURtcml1dnZ1dSszamp6OXU5bGxxeWdHazlwd1BSVmtOMWQzVXNGd042dzJvajBSRElJTk9Td0NJTzlWaDZVeUdWa0JSRS8rOTk5NXJGMTk4Y1N6N1N6SWw1UUJTT3kxVDc3MEtWdTFyOVVrTU1OcFhsS2J0R0VBMjZkMjdkNTFOOWNrb1dLaGZXRitXUC96d1E5ZGZjdFZWVjdsQkdtck5hUzVTSHNhcjRZb2FnUkM0L1BMTDNXSmMyMjY3cmV2cnFJdFdmbnppaVNmOEk3TXJycmpDRFMzVGtMaFUxTzZjVjJlUVJuekZ4V09QUGVidnhkTmVlKzNsNzhWVFU1V2Z2c3owNnRYTFRid0tNbUxOYWRLb3dqMzMzSFA5T200cVAxVWNtMisrdWQxMjIyMXVHSHRBNCtzMThrV2RyRTJGejE4MHFaYWZScHhxQ0d6VUxDS296M3IwNk9HNkFEUTh2TDQxQTlNWnhsc1hEVXZYY0hYMVFRZkR6ak0xakRmbEFLSXA4WW1GclhhK0YxNTR3VWFOR2xWdlpGYXdlT1NSUi95amRZRkhIVTM2ZzB4RjdRSlVuOG92ZnZFTC93Z0lwME9IRGk1WTZGdGhFRURVNURCOCtIQWJQSGp3QnBtelBvUDZJNXd5WllvYmRSTzQ1WlpiM0VDU1ZEL0xRRzJhM3ZDclgvMnF6anEwMlFTUTJvSGdzc3N1Y3pNZU5hbW12amRaTy9CY2Nza2xibzBXUmQ1VTFQN1phalpMbkYvUzFQUnROYzRTczc4NGFxcnlVMy9jYnJ2dDVyN1FCQUZFNjd0cDNQL1lzV1BYRDN0VStlbVBXeE8wemozM1hKZEJCelJSZHJQTk5uUDNOUlUrZjlHa1duNkxGaTF5UTJNelNhdmthb1NYdnJUVXBka0VFTTA0VjJkUVFETTBsWUVvRU5UM0poVmtOSTFlMVBlaEFLSTNvVzk1cWNoRUFUYWtGSXV2eVZCKzlVdWNpZjczdi8vZHJaUncwRUVIclI5ZHFQSlRQNSthRzFRWlhuUE5OZTY4cUFscnpwdzUvbEhUNFBNWFRhcmxwK1o2MVZ0aHkxdWZJZFYvV3ExanpKZ3h0dVdXVzdvdk1adVNpZkpyeUFDU2NxOVE3WWtvbXRXb1A3eE5GV2ppa04xZ09aUEU1Z0dnS1NYMjM2a3ZRMFBWRXovVCtnUFc4SE5sSmVsMG9xSjUwVVdZMU4rVmpxRHlWeCtIZ29hV1dEL3R0Tk5jczJjcXdTTWJwUHdYVVhzWW0yYVZhOEd1VFJWcTRpSmtXdnBCUDJkVEk3ZUF4cExZZ2FrQW9oRXlpYU1FOVkxUkYrWlI4MVZjWmh1amNlbExoUUpJT3RtQUhqdHc0RUMzekpQNk9EU1lvQ21iT2h0S3lnRWtjVDZINlBqNzc3L2ZZSEpoTW9uckJXa3VpVWErMURkcUMyaE1pU3ZxcWo5RFFTTHhNNjNtckQvOTZVOHUrMGhzd2tYTG9Ua2RtMnBwQ1lLTFZ1WlFzRkRRT095d3c5enk2YzM1QzNQS0FVUnR3b21MY2FtZ3RMUkpmUUZFVFZ4YThpU2c5bUlOd2FVSkMzR2hqc3lBUHRNYXFwazQ1K21QZi95amE0WlZCM3ZVNjBjak8ya3FRckxzSTJqU1ZMMm96dkNUVGpySlRqamhCTGUvcVJVNkdvdGVkenFaVTdwU0RpQXFyTVM1RzVxRnJxbjY5YTFycGRtWFFRZWxhRFZMZFI1cDZCb1FCMXFtSXBGR3hHZytpQmJMMHdTd3A1OStlbjN3VUlkanBrZmlJTjcwSlhuMjdObnJNNUNnUWxZcmloYUwxV0t5WjU5OXRydGdYdUt5VFUxQnIwdGRDNXIwcUMvcXdhYW1zMlJ6bGRTdnJmdjBlSFd3aDVGeUFKRWhRNGI0ZSt1R1Flb0NVWFV0SEtZQzF5SmpBZjBTMUw0OGZ2ejQyRVJuUUovamJiYlp4ajlhOTBWSi9YYi8rTWMvM0ZVSFAvcm9JL2RaMXFKNXQ5OStlMVpjV0FpWm9mNWRqYjVLcEMvUnV0YjRPZWVjNDI1MTNKRGY4Tk9oVEVpWHRMM3p6anZkbktaZ3UrR0dHMnlISFhiWTRIVUdDWUVXZ05Uanp6Ly9mTGZ3YmJydkphMEFvamtmaWYwWG1rU29JYnExVTN2OXdXbUpZdzBWQzJqdWh4NnZTVmMwWVNGT0prNmM2RVphSmN1bVZZa29HOUh3WFYzTFJrTWlBeXpKMDd4cDNUNzE4MnJTcVQ0anYvemxMKzN3d3c5M3JTaHhyTVBVc3FNNlZ2M1RHcTZyUzJkby9wNG1ibXNWRVYxNlBLQmdvU3RycXBWSTEzbFNQODNKSjUrYzlxb0thVjJSVVBTQ0ZKV0RTS1VtS25VK2JyWFZWaTRDcXFOY0x6NXg2WGNkYXd5OUpoOHE1VXZuUmNZbHV0Y2x6ZUpyZEpSZmFuVDFPYTJncW05c0NnejZvcVNNV1g5MHdlVkJkVTd6bDlSTW9NOTNVODhCRVQ1LzBkUlhmcnBQOVprQ1NGTkpwL3hVcnlvcjBrVHI0TXFENmRJOFBXWGJxVW83Z0lqV3ZsZGtUdVhOYVFTREx2MjV4eDU3dUZtL2FtOUxwMUNvQUtPaC9GS25JS0xobWxvOVlkYXNXYTY1U2t2MkpMNUdwZjRxVTUxTGQxNUFRK0R6RjAxekt6OTl1VG40NElQZGFGZjEyYVh6L2pSaVZzMWQ2UWdWUU5Udm9Xd2lTTytTVVdlai9oQzFDSmtXWE5Uak5XczkzU0Z0ZkFDam9melNweVpaWmRZS0VKb0hFbWQ4L3FKcGJ1V254eXNUVVhOVzdUbE5tNkt5U0xjOFFnVVEwYmV6SjU5ODBpMG9welJQelZkNjhmb1dwMGltRkYvWFJUL2trRVBjb25VYXRSVm0vZ2Nmd0dnb3YyZ292MmdvdjJqaVhuNmhBNGpvbTVxQ2hZYno2a3FEU3Y4MUwwU1RzelI4VEIwNjZuVFVTSmRnekhTNitBQkdRL2xGUS9sRlEvbEYwNndEU0VEcHZ0cmJGRHowNDlSTXBWRUtXaVlpYWdId0FZeUc4b3VHOG91Rzhvc203dVdYa1FEU2tQZ0FSa1A1UlVQNVJVUDVSUlAzOGd2WHJnUUFhUEVJSUFDQVVBZ2dBSUJRMU1BVzcwYkFkYThSSVkwZE96YnV2OTlZZSt2dHQvMDloTkVxNW4wTWNSZjMwaU1EQVFDRVFnQUJBSVJDQUFFQWhFSUFBUUNFUWdBQkFJUkNBQUVBaEpLUkFLS3JET3BLWFZ0dnZiVi9CZ0RRM0dVa2dPaHlvQU1IRGd4OVlYWUFRUGFoQ1FzQUVFcEdBa2pjVjdRRUFHUWVHUWdBSUJRQ0NBQWdGQUlJQUNDVWpBYVF1Rjg5Q3dDUU9XUWdBSUJRQ0NBQWdGQXlFa0FZeGdzQUxROFpDQUFnRkFJSUFDQ1VqQVlRUm1FQlFNdEJCZ0lBQ0lVQUFnQUloUUFDQUFnbEl3R0VZYndBMFBLUWdRQUFRaUdBQUFCQ3lXZ0FZUmd2QUxRY1pDQUFnRkFJSUFDQVVBZ2dBSUJRTWhKQUdNWUxBQzBQR1FnQUlCUUNDQUFnbEl3R0VJYnhBa0RMUVFZQ0FBaUZBQUlBQ0lVQUFnQUlKU01CaEdHOEFORHlrSUVBQUVMSlVmWVFkWnMyYlpyN1lVY2RkVlRTKzZOc0FOQlNhV1JybkxlTVpDRDZRUUNBbG9VbUxBQkFLQVFRQUVBb0dRMGc5RmtBUU10QkJnSUFDSVVBQWdBSWhRQUNBQWdsSXdHRVlid0EwUEtRZ1FBQVFpR0FBQUJDeVdnQVlSZ3ZBTFFjWkNBQWdGQUlJQUNBVUFnZ0FJQlFNaEpBR01ZTEFDMFBHUWdBSUJRQ0NBQWdsSXdHRUlieEFrRExRUVlDQUFpRkFBSUFDSVVBQWdBSUpTTUJoR0c4QU5EeWtJRUFBRUloZ0FBQVFzbG9BR0VZTHdDMEhHUWdBSUJRQ0NBQWdGQXlFa0FZaFFVQUxROFpDQUFnRkFJSUFDQVVBZ2dBSUpTTUJoQ0c4UUpBeTBFR0FnQUloUUFDQUFnbEl3R0VZYndBMFBLUWdRQUFRaUdBQUFCQ0lZQUFBRUxKYUFCaEdDOEF0QnpxL1k1YzZ3OGJOc3dPT3VnZysvREREKzMrKysvM3oyYUdGNVIyOW5jUndva25udmljdjRzUWJ2anJEZjRld3FocHhaZktTR0plZkRSaEFRQkN5VWdBQ1pxdUdNNExBQzBIR1FnQUlCUUNDQUFnRkFJSUFDQVVBZ2dBSUJRQ0NBQWdGQUlJQUNDVWpBUVFodkVDUU10REJnSUFDSVVBQWdBSWhRQUNBQWlGQUFJQUNJVUFBZ0FJaFFBQ0FBZ2xJd0dFWWJ3QTBQS1FnUUFBUWlHQUFBQkNJWUFBQUVJaGdBQUFRaUdBQUFCQ0lZQUFBRUxKU0FCaEdDOEF0RHhrSUFDQVVBZ2dBSUJRQ0NBQWdGQUlJQUNBVUFnZ0FJQlFNaEpBR0lVRkFDMFBHUWdBSUJRQ0NBQWdGQUlJQUNBVUFnZ0FJQlFDQ0FBZ0ZBSUlBQ0NVakFRUWh2RUNRTXREQmdJQUNJVUFBZ0FJaFFBQ0FBZ2xSLzBYVWJmSEgzL2MvYkE5OTl3ejZmMVJOZ0JvcWRTdkhPZU5EQVFBRUFvQkJBQVFDZ0VFQUJBS0FRUUFFQW9CQkFBUUNnRUVBQkJLUmdLSWhuTUp3MjRCb09VZ0F3RUFoRUlBQVFDRVFnQUJBSVJDQUFFQWhFSUFBUUNFa3BFQXdpZ3NBR2g1eUVBQUFLRVFRQUFBb1JCQUFBQ2hFRUFBQUtFUVFBQUFvUkJBQUFDaFpDU0FNSXdYQUZvZU1oQUFRQ2dFRUFCQUtBUVFBRUFvQkJBQVFDZ0VFQUJBS0FRUUFFQW9HUWtnRE9NRmdKYUhEQVFBRUVwR0FraHVicTY3cmE2dWRyY0FnT1l2NVFDeVlzVUt1K09PTyt6R0cyKzBlKzY1eDVZdlgrN2ZVNzgzM25qRHBrMmJaamZmZkxOOS9QSEgvbGtBUUxaTE9ZQW95NWc5ZTdiTm5UdlhQdjMwVTd2d3dndnQ4ODgvdDdWcjEvcVAySmd5a21lZmZkYSsrZVliKys2NzcreXFxNjd5N3dFQVpMdVVBMGh4Y2JIMTc5L2ZQekpidlhxMTNYLy8vUzR6Q1FTZDZZRXZ2dmpDeXN2TDNiNkN5Y01QUCt6MkFRRFpMNjAra0ZHalJ2bDdacDA2ZGJMbm5udXUzcWFzbVRObitudG1YMzc1cFMxYnRzdy9BZ0JrdTdRQ3lPREJnOWQzbUl2MlAvdnNNNnVxcXZMUC9Fam5sSUVFUHZyb0l4czNicHgvQkFESWRta0ZrTHk4UEJzeVpJaC90QzZnUFBQTU03WnExU3IvekkvVVB4STBYMVZVVkxoZ01tblNKSGNNQU1oK2FRVVFHVE5takw5bjFxRkRCM3Z0dGRmV0I1REVQcEFQUC96UTN6UFg2VjVRVUdBVEowNzB6d0FBc2wzYUFhUmZ2MzVXV0Zqb0g1bmJuelZybHVza1Y1Q1F5c3BLMTdRVlVERFpmdnZ0clVlUEh2NFpBRUMyU3p1QTVPVGsySlpiYnVrZm1XdlNldkhGRjEyZmg1cTRSTUZEUVVRMFNrdkRlUGZlZTI4ckxTMTE1d0FBMlMvdEFDSmp4NDcxOTh6YXRtMXJNMmJNY1BOQjJyUnA0ODRsTmwrcDg3eXNyTXkyMjI0N054UVlBTkE4cU5NaXJSVVEyN2R2YjZlY2Nvb0xIRUhmeDV0dnZtbTlldld5blhiYXlYYmZmWGU3N3JycjFvL011dUdHRzJ6Ky9QbWhsem1wcWFtNXdOOUZDRjc1LzQrL2l4Qk9QUEVFZnc5aDFOUnNPRGNNNllyM0FyVnBaeUJxa3BvK2Zib05IejdjUDJNMmRPaFFOMHU5VDU4K2JyNUhFRHkrLy81N04zT2ROYklBb1BsSk80QW9PR2haa3NRbFROUjB0V1RKRW12WHJwMGJjUlhRUk1MYXM5TUJBTTFEcUQ0UXpTaC82cW1uM0d6MFFQZnUzZTJERHo2d3I3LysyaDNyMmlEcUd3RUFORStoQW9pYXNUVHlhdENnUWY0WnM4MDMzOXl0dkJzMFg2bEphK25TcFZ4a0NnQ2FxVkFCUk0xWEN4WXNzSVVMRjY1dm9tcmR1clhsNStlN2ZWRTJrcmpzQ1FDZ2VRa1ZRQ1JveHVyWnM2ZC9adDJLdmFJc1JFTjV5VDRBb1BrS0hVQTBoRmZOV0ltejBnT2FTS2psM3V1N1ZnZ0FJTHVGRGlES0x0VFBjZEZGRjduRkVvTmdvZjRSOVlWb3hub3lkWjBIQUdTWHRDY1MxcVoramhFalJyaUFvaUc4YTlhczhlOUpUbzlQWjE2STkzT1pTQmdCRXdtallTSmhORXdraktxWlRTU3NUY0ZBbzYwMEEzMmZmZmJ4ejlhTlNZVUEwRHlrRkVEVXo2SE9jaTFYMHJWcjEvV0xKZ1lVRkVwS1N0eEV3b0NhcXJUY3U1NmpWWGcxU2dzQTBIeWtGRUIwWWFnNWMrYTRHZWhhMXlxWTYxRWY5WWtzWHJ6WVBVZkxtU1M3NkJRQUlIdlJvdzBBQ0NVakFZVDVIZ0RROHBDQkFBQkNJWUFBQUVJaGdBQUFRc2xvQU9IYUh3RFFjcENCQUFCQ0lZQUFBRUxKU0FCaEdDOEF0RHhrSUFDQVVBZ2dBSUJRQ0NBQWdGQXlHa0FZeGdzQUxRY1pDQUFnRkFJSUFDQ1VqQVFRaHZFQ1FNdERCZ0lBQ0lVQUFnQUloUUFDQUFnbG93R0VZYndBMEhLUWdRQUFRaUdBQUFCQ3lVZ0FZUmd2QUxROFpDQUFnRkFJSUFDQVVETGFoTVVvTEFCb09jaEFBQUNoNUNoN2lMcTk4ODQ3N29lTkhqMDY2ZjFSTmdCb3FkU3FFK2VOREFRQUVFcEdBb2dpa1pBeEFFRExRUVlDQUFpRkFBSUFDSVVBQWdBSWhRQUNBQWlGQUFJQUNJVUFBZ0FJSlNNQmhHRzhBTkR5a0lFQUFFSWhnQUFBUWlHQUFBQkNJWUFBQUVJaGdBQUFRaUdBQUFCQ3lVZ0FZUmd2QUxROFpDQUFnRkFJSUFDQVVBZ2dBSUJRQ0NBQWdGQUlJQUNBVURJU1FCaUZCUUF0RHhrSUFDQVVBZ2dBSUJRQ0NBQWdsSXoyZ1FBQVdnNHlFQUJBS0FRUUFFQW9HUTBnRE9NRmdKYUREQVFBRUFvQkJBQVFDZ0VFQUJCS1JnSUl3M2dCb09VaEF3RUFoRUlBQVFDRWt0RUF3akJlQUdnNXlFQUFBS0VRUUFBQW9XUWtnREFLQ3dCYUh0WDhrVHN1T25ic2FLZWVlcW90V3JUSXJyNzZhdjlzWnRUVTFMemc3eUtFdDk5K2UwZC9GeUdNSFR2VzMxdW45cGVsMnYxK1RYMS9iYlVmWDF0RFB4L05HMDFZQUlCUUNDQUFXaHhsVG01YnUzYjlQdEtYa1FCQzRRT0lNOVZSVlpXVnRtRGVkM2Jqbjg2eHZZWVVlRnUrN1RYVXYvVzJzdy9ieVQ1NjkxV3JxQ2kzdFY1Z3dhYVJnUUQxVUI5QTRoWjhXdzIycHI0ZmRWTVFXTEpvZ2IzeTlFTjIwajRqYmQ4dGl1M0lIZnZaUDZaZDV0MjdjZGw5K05iTGR0WWgyOXYrSTByc29LMjcyRDl2djhZV3paOXIxZFZWL2lOUUd3RUVRTE9ob1BIMTV4L2F2WCs5MkFXQm4yL2J3eTQ2NVFENzVvdVAvRWVrWnVXeXBYYjkvNTFoVTNib1l6OGIyOUZ1bnZvYm0vWHhlMTR3cWZZZkFjbG9FNWErSVFGQVkxSS94Z2RlOW5Ebk5SZlp6OGFVMlMrOGJPUFd5ODV6UVNBVHlsZXZ0QWR1dnNST21ieVYrL2wvdS9yMzlzR2JML24zdG14a0lBQ3lSdEIwdDNadHRjMTg4MFdiZHVsNXR0K0lFdnZWWVR0NUZmdi8yaHF2c205STVXdFdlWUhxOS9hcktUdmJ2dDcvZStjMUY5cG5NOTl5bVU5TGJGSlV5aEQ1WFplVmxkbnBwNTl1aXhjdnRxdXV1c28vbXhuZUw0VjVJQkV3RHlTYXVNOEQyWlRhejY5dFV6K3ZvWitmS3YyYzZxb3FtLzNGUnpiOXdkdnR5UWVtMmVxVnkveDdtMTVacDI2MjYrVERiZTlEVDdETzNYdGJUazV1MnIrcmJFUUdBaUNXZ3FBeDUrdlA3ZG9MVHJWamR4OWlwMHdlYXcvZGRtV3Nnb2NzV1RqUEhyanBFanQ2MTBGMitzKzJzVHV2dmNnV2Z6L1AxbFpYWnl5SXhoRUJCRUNzcUtQNmh5VUw3YjRicHRycEI0eTM0L1lZYW8vZWZiMHRtRHZiZjBTOHFiUDl6cXN2c0NOMjZtZm5Iclc3UGYrdmUyemw4aCthWlNBaGdBQ0loVlVybHRrTGo5MW5aeDI2ZzAzWnZyZnJDSi8xOGJ2K3ZRMG5KNmVWNWVYbHV2YjhURkwyTlBPTkYyenEyWWU3ek9TQ1gweTJUOTkvdzhyWHJQWWZrZjFVWnBIREluMGc4VVVmU0RSYmJiV1Z2N2RPN1crUjZmWlpOUFQ5dGRWK2ZHMU4vWHpOc1ZndzV4dTc2OXFMN00wWEhuT1pSME1vTENpd2ZuMTcyRTRUeGxsSlNaRTdwNWRlWEZ4c25UdVZXVjV1cnBWWFZOaXNyNzYxQng2YWJ2TVhMSEtQeVRTVmwvcElkdnV2bzIzUGc0NnhqbDE2YkxJTTQweXZ2UDdmY0FyYXQyOXZaNXh4aGkxWnNzU3V2UEpLLzJ4bWVCOUFBa2dFQkpCb0NDQU44L3pLaW5JMzlQYTZDMCszT2JNL2QzMEZEYVYzejY3MjI3T1BkNEZpVTY5WDFJUTI0OFBQN2ZKcjc3Q1ZLeHN1VzhndktMUytnNGJiS2Y5N3JXMDJiTFRsNXVYNTkyUVBtckFBTkNyMVpSeXoyMkQ3N2RGNzJMZGZmdEtnd1NNL1A4L08rZVV4MXFWemg1U0NoK1I2MmNpb0VZUHQ3Rk9QOU04MERBWFJMejU4eDg0NGNGczdZdWYrOXZGN3IvbjNaQThDQ0lCR05mUFpoMnpOOTNQOG80YlZ5dnRYVlZXMXlVeXFOZ1diRlN0WCtVY05yY2JXTEpwbmoxNzVHLzg0ZXhCQWdIcW80a25jVkxFa2JuRzd2L1pXKy9HMXQyVFBTZHlTUFNkeFMvYWN4QzJaWlF2bldZODJoZGEzcE1DS2MxUExDc0txcUt5MHMzNTdxZDEyMXlQMjNzeFBiZWtQeXplNVVLSmU5OExGUyszTyt4NzF6elFjdmY5K0pmbld5eXNQVmNaMWxWbGM2YmNYK1JYVEJ4SmY5SUZFd3dXbG9qMC9tUWN1T2N0ZXV2K3YvcEhabXFwcVc3aW15bFpWcC8rendpZ3VLclJSV3c2MnpwMDZXTnZTRWlzb3lIZm5TbG9YdTg1ekJacjNQL2pNZjNUREtNbHJaWjBLODZ3d0w5Yy9ZOVpyeUdnNzY5WVhMQ2NuZTc3WGs0RUFhRlJWbFJYKzNqcEZYaVdxYitCOXZXL2lwVjdGMnRCV3J5bTNWOStZWVE4Lzlyejk3ZDVIN1pZN0hySnJiN3pYcGw1NXE5MTI5eU1OR2p6YTV1ZFl2ellGMXJPa2NJUGdJVFZhOVRkRVFHNUtCQkFBamFxNnN0TGYyNUFxMU81ZXhkcmZxMkE3Rkd4WXVXWXpoY1JPaGJrMm9MVEF1clV1c0lMYzVOV3VSbitGeWVpYVVrWUR5S2JTWFNEYjZET2R1T2tQUEhGcjZ2dXpVZTBNcExaOHI0THRXSlJuQTBzTHJZdDNtNjBVQXJzVmUrK2piYUdWRmVaWjNpYWFwckp4MlJNeUVBQ05xcnFxL2dBaUNwYTVPYTJzdlZmeGJ1WlZ3RDFiNTF0K2xudy9MZlplZCsvV2VUYkFlOTF0Qy9Jc3h3LyttMUt6VnNPWkNTQUFVS2RXcmRLcmRsUUJsK1RuV2o4dkkxSC9RWnU4SE5jc0ZDZDZSMlg1T2RhL3RNQjZlNit6T0Q4dnBhQ3hnU3hzd01sSUFNbldWQnBBNDh2TnovZjMwcU1LV2YwSDNiMXNSQlYxcDRKY2E0USs5M29WZURWbzkrSTg3L1VVV3VmV0JaWWZZUVJWdW9FMURyTHZGUU9OS0xHL1Fac3FzY1N0cWUvZjFGYjcrYlczWk05SjNKSTlKM0ZMOXB6RUxabmN2SEFCSktDZnEvNkVzcUk4bDVYMDlnSks2MXp2Ly9QdmIyaXFOTnQ2V1pBNisvdTJLYlRTZ2p6WDNCWlZLKzluMUZWbWNVVUFBZENvb2dhUWdDcGJOVzhWNStkYXo1SUNmL1JXVG9QMWxSUjVGWHhYTDJncCsrbXFQaGt2Rzhwa2hiOHVBeUdBQUVDZGtnV1FiajI2MmVubm5XN0huMzZjamRsNnRCVVVGUGozcE1abEpXNzBWcjZYRlJSWUw2K0NiNU1YUFN0UkUxbDdMeWlwNzZXM3Q3VXR5UFd5amN3R2pvQUxJTmtWUHpJYlFMSXQvUUxRK0pMMWdSeHcrTSs4SU5MVkJtdyt3TnMvd002ZmVwNXR2K3YyL3IycGMxbUpWOEczOXJLUzdxMEwzTnlMTGtXNVZwVG1raW1hOEtjZ3BNRFIyUXRLNm52UnoyN0lPcTZWQWhNWkNOQjhCSlZHc0cycUQ2Q3g3ODlHeVRLUTdqMjcrM3ZyeWp6ZkN6S1RmcnFuL2Z6WVEvMno2ZFBQVWJiUXZqRGZldnROWEpyUXA0N3ZaTnA1UWFOYlVaNXQ1ay80VXhCU01OTFBpYXB6dDg2MjUrUTlYWUNzU3liK244WkdBQUhRcUpJRmtFVUxONzZBa3lyVUxVWnZZV1BIYjdnZVdSZ3VLSGxaUkFjdm0raFhXbVFEdlNEUm96amZ1bm1iT3VFVk5McDZRYU50WVY3RzE2S2FmTWhrTytPOE0yekgzWGF3WTA4OXhyMm5aRnJsNUdaZEVNbElTV1hyTnlFQWpTOVpBUGxrNWlmKzNvWlVvVTdjYTFmL0tIT1VtYlFweUhWOUd1cUViNGdGRFBQeTh1eVlVNDYybjB3WTUvMzhkWUZCLzg5QlJ4N283cXZOWFZDcUpRWVFBRWhWc2dEeXpPUFB1cldna21sWDFzN2FsTGJ4ajdKRFVYR1JuZmsvdjdSQlF3ZHRsRldvZWE1bjM1NytVYUoxelpUWmhBQUMxS04ybjRQK3dCTzN1TjFmZTZ2OStOcGJzdWNrYnNtZWs3Z2xlMDdpbGt4T2tnQlN2cWJjM256bHJhVFAwZi9UdG4xYi95ZzdISGI4WVZiV29jdy8ycERlNC9JZmx2dEgyWTBBQXFCUkZSUzE5dmMyOU05Ny8ybXpaODNlS0lqb2VGV2pYUjB3T21WTEF3ZlYzVm0rY3ZsS1c3eHdzWCtVM1RMYUI2SnZDZ0JRbjZLU1VuOXZZMys5L0FhYi91aDBXN2xpNWZwNlpmYVgzOWpTeFV2ZGZqWVlzc1ZnTjZzOEdWME44WkVIL3VVZlpUOHlFQUNOcXFpay91YW9aeDkvemk3NjlmL1pmNS8rTy92ZEwvL0gvbnJaajFjdmpEMHZib3o2eVNqL1lHUFBQZkc4elhoN2huK1UvUWdnUUQwUzIvdTE2VnR4NHRiVTkyZWowbGFyclgxQmxiZFgvN1hKMWFsZVdaSDg0bE54bFp1VHU4R2Nsb0IrVjdPL25PMnlxNDJ0dFRLdlBJYTNML2VQc3djQkJFQ2pxbHc2MTZzc0syMTR1d29yek1tK2EyRFVwM3B0dGMzNWRxNS90QzV3cU5ucXFVZWV0dXN2cloxSjFWaHBYcldOOUFMSE1LODhjbHRsWHprUVFBQTBxdkpsNnlZTnRpK3NzVEVkSzJ4QVNZWGx1bXlrR1FRUzd5MW9NTUN5SDVhNXdMRncva0tiZHUydDl2eVR6L3NQa0JvcjhnTG4wTGJsTnFLc3d0cWt0K3hYckJCQUFEU3F0UW1YdEZWZmMvZVN0YlpWcDNMcjA3clNXaldEUUxKb3dTSzc1SGVYMk1YL1BkVXV1K2h5KytLVEwveDdhaXkvMVZvYlZGcGhvenRVV0ljaU5WSDZkL215clZreUoyaExqYkxObVRQSC9iQWVQWG9rdlQvS0JqU2w0RE9ZK0ZsVVgwUncyOVQzQjdTZjdGalBTM3h1N2VOQVF6MC9tYlhWRzEvU05zLzdLdHU3VGJWdDFiSGN1aFZWZVlGazQvOGptMVJWVmR1eXBjdThBdE5SalpkaDFkaUFOaFUyMW50L1hZclhXcktKN3pWZXh1SS9ZYjJnSE9PNlpTUUQwUThDbWlOOXRsVmh4dlUyRzYydHFydGp2Q0RYYkdEYkt1OGIraHBybDZlTzl1d09KRG5lNisvdFpWWmpPNjZ4Ymw3Z3lLMm54bDFiV2U0SGtleEJFeFpRajFRcThhYThEVFlkSjU2THkzRXlOUWxOV0hVcHpqTWJYbFpwbzh2V1dFbHU5blcwZXlWZ1hRdlhCWTdlSmRXVzd3VkdyMWpxVmJQV2U1OTFsRmxjRVVDQWVnU1ZZVnh2czlIYTZ0U0c1bnB2MFZybm00M3NVR0Zqdkl4RUhjOTUrWG5XcVVzbjY5Q3BnLytvT05Idm84YmE1MWZaT0M5d0tKTlNScVgza1lxYW11ektQaVNqQVNSYlA5QkFYZXFydk9OeUcrekg4VGlaK3Bxd2t0R1BVVWFpRVZ0bi91bzRPL04zdjdTei8vY3NPL2EwWTlPK2NtSERxYkUyZWRXMmRhYzFia2h1S2hsSGJXcSs4a3JQUDhvT1pDQkFQWUpLTWE2MzJXaHQxYWFic0pKcFhkYkJ5bnIyY2U5ZDIyYURCOXF2THpySGlsb1grWTlvQ212ZFhJNnhYb1kwc2tPbEd3emd2YlJ3YW1qQ0FwcVZWQ3J4cHJ3Tk5oMG5ub3ZMY1RLcE5tSFZWcmxxcFp0YmthaDFTV3M3NG9URC9hUEdGRXdDckxBdE8xUlkwY2FYOTBoYnRuV2dDd0VFcUVkUUdjYjFOaHVsMjRRVnFLb290emt6M3ZLUGZ0UzVZNmtOYlJkMHRqZTBHbXViWDJWYnRsL2pBa2ViZ3N6OURsd0F5YkxmS1FFRXFFY3FsWGhUM3diN2NUeE9waVprQmlJekhyblhsczMvY2FrUVpTVHZQWFNYZFNpc2NaM3R3N3hBMHJxQkFvbUdGWTlvWDI1YnRLKzAwZ2JwZXNtK0x3UXBCWkExYTliWXlwVXIvYVB3RmkxYVZPZFZ4NEE0Q2lyRnVONW1vNXk4OExXdnZxWC9lOXJWTnYvemo2eGl6V3A3Ky81YmJlbTNYN243dkNLeE1pK1FqTm9na0VRdEl6VlZyY3M0Tkt5NHJaZHg2UDlwQ0xvbWVvUDk4QWFTVWdCNTl0bG43WW9ycnJCWFhubGxvemJJVkt4YXRjb2VldWdodSthYWEreVRUNUpmK3hpSW8xUXE4YWE4RFRZZEo1Nkx5M0V5T2ZuUk9yMnJ5dGZZbTNmZGFFOWQvRnViLzhsTS8reVB2UDkrZlNCUnh0Qm0vWVRFVklQSnVzZTJkWUZENjFVcDQ5QjdXM2R2UThuSnpYZGxsMDFTQ2lBREJ3NjBxcW9xbXo1OXVnc2tMNy84c3ExWXNjSy9kOTIzTktuOWdWSEc4Y1FUVDdqbnZQLysrKzV4L2Z2MzkrOEY0aStvRE9ONm00MXlDeHBuMUpSWFJDNWoyTklMQUNQTHlxMTlmclcvUkVwZDVlYVZxN2RwSHNjbzcvRmJORkxnQ0xUS1ZVOThkZ1dRVnQ2SGNKT2ZRbVVkbDF4eWlXdktrdUREMjZsVEordmJ0NjhWRlJXNTdLU3dzTkRHang5dml4Y3Z0cSsrK3NxV0wxOXVPVGs1N3ZtNjNXeXp6ZXpRUXc5MVB5TU5ML2kzQ09IdHQ5L2UwZDlGQ0dQSGp0Mm8wbzdicldoZjRucWM2TTJyVHJDdm5yclpQMm84ZWlscnFzM21yYzYxNzlma1dXV05YcU0yTFhKWVk1MkxxcXhiY2JVVk5WRkxVcnYrSTIyM0s5NzBNaEh2QmZpQ2NveXJsRElRVmY1YmJybWw1ZnB2TFBoUUxGeTQwTjU5OTExNzlkVlgzYkVDeklzdnZtZ3paODUwd1VPQ0ppLzFmWXdjT2RMdEE5bENmOEQ2dk1mMU5odEZiY0lLeXlzeU55R3hmMm0xamVsWWJzUGFsVnZYb2twM3ErTitiYXJkL1hwY1U4ajF5cVZWc2xVV1l5emxWenRxMUtpa0hlQUtFRUdRMElkYSs4aysyTXBPQmc4ZTdCOEIyYUcreWpzT3Q4R200OFJ6Y1RsT3ByQnRSMyt2NldqQ24vcEpObXRiNVc0alRRRE1GTy8vVjlsbGs1UURTUGZ1M2ExangvUi84Zm9RS1hOSnpHQ0FiQkZVaG5HOXpVWWROaC9uN3lGUjY4NTkvTDNza1ZhK05IcjBhUGZCVFljZVQvTVZzbFVxbFhoVDN3YjdjVHhPcHR1WTNhM1g5Z2Y2UjltaGJiZWUxbnYwMXRaM3ErMHN0d0hXMzJvL1lMU05PKzFHL3loN3BCVkFsRVhvdzVFT1BiNWR1M2JXczJkUC93eVFQWUpLTWE2MzJTZ25OOC9HbjNPM2JYSDRSVjRCcDFVRk5icWkwblkyN3VmSDI0VGp6N1NSK3gxaUkvWSt3SGI2ZjcvMTc4Mk1udHY5ekhiOTg4dVczN3JVUDVNOTB2cnRsWmFXdW1HNCt2Q21TaDN3WVRJWElBNVNxY1NiOGpiWWRKeDRMaTdIZGRGamhoMzhHOXZwRDg5WWJuRm1LODc4NGhKcmxZSG1jbVVkTzUzeUcrczZhSmlyeHdLRnJVc3lGdmlHVDduQXR2MzEzWTAydERuVDBpNEZCWU9nMHp3VitoQXBjd0d5VVZBWnh2VTIyM1Vac1lQdGZkTm4xbVhVUlA5TU5Oc2MvZ3ZiNDV5TGJOSnZwOXI0bzA2eGpnTTI5KzlKajVxcGZuTFlDWlpYVU9pZitWSDVxcFZleFpiK2hPcEV1VVVsdHZQRkw5andRODVmTndNOVM2VWRRSVlPSFpyV0d2eTlldld5c3JJeS93aklMcWxVNGsxOUcrekg4VGdWUmUyNjJJNi9mOXpHblBKWC8wdzRIZm9Nc0U1K3dGREcwTEh2UU50bXlrbGVGdkZiS3loSkw4dnBQWHE4RmRieG5NcnkxZjVlT0YxR1RyUjliLzNHT2crZjRKL0pYbWtIa0x5OFBCcytmTGo3QmVtRHNpbktXSUJzRlZTS2NiMXRMalQvWWJNOWo3UDk3cGhyZWNWdC9iUHA2VGx5NDlGZEtxYzJIVHZiMWxOT1RQbWJ2aDQzZU9jOTNYT1RLUzV0NSsrbGI5d1p0OWlPRno1dUJXM2ErMmV5VzZpR1BNMEpVVE5XWFFVY1VKQVpObXlZZndSa24xUXE4YWE4RFRZZEo1Nkx5M0c2aXNxNjJ1UzdGOWpRZzgvemp0THJONjF2ZEZUYnJqMXMyRzc3K1VmMUsrM2FQV25UMVkvUzc4OHQ3VFhFOXIxamp2V2ZlS1FMbHMxRnFIZlNwMDhmTjdLcVB2b1FEUmt5eEMxekFtU3JvREtNNjIxemxKT1hiMXRNdWNBbTNmaXBGWFZJZmZUbTNKbnYrbnNiVTNsMTdMOVpTcFYzYWVmdTd2SEpWSmF2c1ZkdXZ0dy8yclJXdWZtdW8zeVBhOTYzb3ZaZC9iUE5SNmdBb3NMVnZJNjZDbG4wNFdidUI3SmRmWlYzWEc2RC9UZ2VoNlhudHVrMndQYStaWllObUhTaWY3WitTNzc3MnRiV2M3bUlWSmRMWDdGb3Zuc1BpYlNNL1BkZmZXNVBYL0xmdG1MaEF2OXMvVXA3RDdWSmYvM0Vobm5aVkU1ZVhxVHlpS3ZRdVpTQ1ErMUNUcVRNUTRzbkF0a3NxQlRqZXR1YzZUM21ldG5JMkpPdnRZbFh2R0d0dTlXL2tuZmxxaFgyOW4zVDZpeVh2TUpDeTBtaEgrU0hPZC9ZZHpQZXN1cXFTdmV6bHN6NTFwNjU4dmYyK3UxLzhRS1Vsb2F2bjdLT1FmdWY3bVVkNzNsQnNKOTdIODFWU3F2eDF1WEdHMiswdVhOL3ZEcFlRRXVXakJzM3p2YllZdy8vVENTc3hoc0JxL0ZHRS9mVmVBTTZsdUJjWEk0enFXWnR0YjEzOHpuMitiK3VNYTkyOTg5dXJQdXdVVFo4ejhsdUVtQ2lsWXNYMmd2WFhXeHJxellkQkVUTHErY1hGbG1GRjVoUzFXN0FLTnY2N0R1c25aZDlCR1VSUlNaK1JrT0sxSnN6WnN3WWYyOURXcnFFdVI5b0R2UUhyTW93cnJjdGlacWdSaDMzWjV0NDZXdld0dDhXL3RtTi9lZWo5Mno2RmIrM0wxNSsxcW9yMTEwK1YwMWJzLzc5WE1yQlEycThJSlZxOE5BS3d5T08vcFB0ZnVWYjFyN1BNUGY3YVFraVpTRGw1ZVUyZGVyVWpTWVdkdWpRd1U0OTlWVC9LREl5a0FqSVFLTGhlaUNaT2M0ME5TVjk5dEFWTnVPMjg3eUR1b05DYmtHaHRlM2V5OHFYLzJDcnZBeWtJWFFjdHAxdGZlWnQxbVlUVFd4aEJPVVlWNUV5RUMzUnJvbUZpVzlTKzNWbEprQzIwZWRabFdCY2Ixc3FyYWMxK0wvT3NrazNmR3hsbTQzMXoyNnN1cUxjbHN5ZTFTREJROWQyMythY3UyeVhpNTl2a09DUkRTSUZFS205d0tMMlI0d1k0UjhCMlMxWnBSMm4yMkRUY2VLNXVCdzNKUDAvcGQwRzJLNlgvdHUyT2ZjZTEzbmRXSHB0ZjVEdCs3ZTUxbWVIZzczWEVia2F6VnFSMzdsR1dpWE85Umd3WUlDMWJSdHVKaWtRTjBGbEdOZGJyTXRHK2t3NDBQYS9hNEgxMmVrdzcwekROZnZrRlpmYXhDdmZzdkZlNWxIWWhpV2FJZ2NRelRiWHpIUjlvTFV4OXdQTlNTcVZlRlBmQnZ0eFBHNU1CU1Z0Ylp1emI3YzkvakxUOGtzNytHY3pRODFWWTA2NXppYmYvYjExR01qcTRvR001RjdCbkJBRkU4MCtCNXFMb0ZLTTZ5MDIxcTdQVU52L3puazIrSUJmdTRvL0VxK2MydzhjYS92ZnZkQUc3bkc4bXlXUEgyVWtnSFRyMXMyNmR1M3ErajdTV2FrWGlMdFVLdkdtdkEwMkhTZWVpOHR4VTlHRXdaRkgvY0gyOHdKSngyRVRYQ0JJbHk0eHU4c2xMOXR1Vjd5Kzdob2pJWDVHY3hkcEdHOGlEZW5WU3IwTmNOMXpodkZHd0REZWFMYmFhcXYxRldOY2IwWDdFcmZqdUpqMzNqUDI5alVuMmNwNVgvcG42cGJYdXExYnYycnpmVS94M2svVGRwQUg1UmxYR1NzZERlbHRnT0FCTkNsVmhQb2pqdk50c0IvSDQ3am9ObXBYbTNUOVIxNWcrTDNsRnJYeHo5Yml2ZDUrRTQrMi9mODJ6d2J2ZDVwMzJMVEJJeHRRUWtBOWdrb3hycmRJbmZvdmhoOXlucnZteUtEOXovRFByclBaM2lmYjVIc1cyVS9PdU1sTlBrUnFNdGFFMVlCb3dvcUFKcXhvV0FzcjJuR2NWYTVlYm5OZS9hZjFtbkNBNWNYMG11UkJlY1lWR1FoUUQvMEJxektNNnkzQ3l5OHV0WDY3VElsdDhNZ0dDbSt4L2hURy9ZOUVmOGh4UnZsRlEvbEZRL2xGRS9meUl3TUJBSVJDQUFHQUZrRFp6SW9WSzl4V240cUtDbHU2ZEtsVnBiRDBQVTFZRVpFQ1IwUDVSVVA1UmRPY3l1L3h4eCszTjk1NHd6cDM3bXdubjN5eWYzYWRqejc2eUo1ODhrbGJ0bXlaTzlZbE4vYlpaeC9yMy8vSFZZUlhyVnBsLy9yWHYreVRUejV4LzYrbVpXaVpxa21USnRVNVJZTU1CQUN5M0gvKzh4OTc4ODAzcmF5c3pHVVFpV2JQbm0wUFBQQ0E5ZTNiMTA0ODhVUTcvUEREM2FUdnUrKysyMzc0NFFmL1VXYjMzWGVmZSt5QkJ4NW9KNTEwa2syWU1FR2pPRzM2OU9uK0l6WVdPWUFvTW5YczJOSDY5T25qTnIwQkFFRGpVTGJ3NktPUDJyQmh3NnhYcjE3KzJSKzkrT0tMMXE1ZE81czhlYkpiZGtvcnB2LzBweisxeXNwS2UrZWRkOXhqdnY3NmF4YzhkdDk5ZDNlTkp5MU50ZE5PTzltZ1FZUHNyYmZlcXJNNUszUUFVZXBYVWxKaVcyeXhoWjF6empsMnp6MzMySjEzM21tbm5IS0tTNC9pbmhvQ1FIUHcvdnZ2MjRJRkMxemxYNXV1RnF2Z01IRGdRTGZZYlVDQlJKZmQrTzY3Nzl6eGwxK3VXK0pGQVNQUjVwdHY3b0tIZm40eW9RS0kwcDhlUFhxNGlIYkREVGU0dEVqUjdJTVBQbkFaeUhISEhlY2lIZ0NnNFdnTlFqVXg3YkRERGttdnc2UU9jd1VSdFJMVnBycDY1Y3FWYmw5OUk4WEZ4ZGE2ZFd0M0hBaGFsT3JxZUU4cmdDaUM2VVhxa3JYbm4zKytYWEhGRmE3RFJtMXB6ejMzbk0yZlA5KzlFTDJwNnVwcS8xa0FnSWFnZWxmckVJNGZQOTQvczZFZ1FPZ3h0ZW1jT3M1Rmo2dnJNYko2OVdwM1cxdktBVVRCUTJuUGxDbFRiTnEwYVhid3dRZmJ1KysrNjVxdEZEZ1M2VVVwaUFBQUdzYjMzMy92T3M3MzNIUFBUUzVrcXl3a21jVG4xZmVsUC9Jb0xHVWVSeDU1cEYxNDRZVXVtTngyMjIzMjczLy8yLzJuNnNSWnMyYU4vOGgxblRycEREOERBS1JIdzNMVjJkMm1UUnMzQ2t1Yk1nWFZ5ZHBYblJ3MFNTWFd6d0dkVXorMnFQbXFyc2RJOExqYVVnNGd1bENVcm4vKzRZY2YycjMzM3J0KytOZWlSWXRjRTViT0F3QWF4N3g1ODF5Z1VEOTBzSDN4eFJldXYwTDdyNzMybWdzZ0d0QzBjT0ZDLzFucjZBdSt6clZ2Mzk0ZEt3aXBIenVZSnhKUS9TNTE5V21uSEVBVWlUUkpaY2FNR2U1WVRWUlBQLzIwL2VVdmY3SGx5NWZidHR0dTY4NERBQnFlNW1xY2R0cHBHMnlEQncrMjB0SlN0Njk1SFBuNStkYXpaMDhYV0JLSDRzNmFOY3QxTldpVWxXaU9pSHo2NmFmdVZoUmtWTjkzNnRUSmpheE5KdVVBb3Npa29icWEwZmp0dDkrNndQSEtLNis0VHBiamp6L2VaU2NBZ01haHJFR2pwQkkzdFJTcGkwSDdHaTByMjIrL3Zlc2tEMXFLWG4vOWRYdnd3UWRkbjdhbVlZZ0NpWTQxb3V2VlYxOTFqOVBFd3JsejU5ckVpUlBkWTVMUlpJMlVPeXVVQ2dXcFR0QkpydUZoRjExMGtYWHYzdDExcW92R0ZxdVBSSStMS3U1OUtjMXBLWVNtUVBsRlEvbEYwOXpLVHdGQWxmNFJSeHpobjFsSFV5eGVldWtsMXlSVlZGVGtBb1lDUStLd1hUVjlQZlhVVXk1YlVkM2RwVXNYRjN5R0RCbmlQMkpqYVFXUVpQU2ZxR05kMFlzQUVqK1VYelNVWHpTVVh6UnhMNytVbTdBQUFFaEVBQUdBWms3TlVwZGZmcm5yZWxCV2M4c3R0MlJrNUN3QkJBQ2FPUTF5VWovMTg4OC83eFpRVkVlN0ZsK01pZ0FDQUMzQVhudnRaZSs5OTU1Yi9tUy8vZmJMU1A4UEFRUUFXZ0FOOGRXbW1lckJFTitvQ0NBQTBBSm9pTzZJRVNOczVNaVI3dXFGbVVBQUFZQm1UdGNFMGV4ekxmdSs4ODQ3dTZrV3VuUnRWQVFRQUdqbXRCanVVVWNkNVpxd3RIckkwVWNmN1M3RkVSVUJCQUNhQWZWdExGbXlaUDAxUGhKcExTdk5PdGN5Vk5xMFhsYXlpMHlKbG9uLzZxdXZiUEhpeGY2WnVxa2JQdEpVUjJhaU01TTFDc292R3Nvdm11WlVmbG9sWGMxU1dnZExpeWttMHFVM05Qb3FXRkJSbWNnKysremora1FDQ2hqMzMzKy9XK1Uzb0V2aEhuamdnVWt2TmlWa0lBQ1E1VFJSVUN2cDZndDk3YUNqQlhDMWN2bzIyMnhqNTU1N3JwMTY2cW51a3VRUFBmVFErbVhlZGNFcExaWmJVVkhoTGxIK205Lzh4bDJ5WE5kS2YrS0pKOXhqa2trN2dHZ0NTckRwS2xXNnJTdUtiK3ArQUVBMGFycFNKVDl1M0RnWFFHcFQ5cUgramwxMjJjVmxFbXJPMm5mZmZWM1FDRnFOUHYvOGM5ZDB0ZnZ1dTd2V0pHVW9HcTJseVlaYTBsMkJKWm1VQTRnQ2dkYUZIelZxMUFhYmxnTk8xcGFtSzFnTkh6N2N2UWlsUVhvK0FDQ3pkT0VvWFlsUW82dHFVNVBWbkRselhCMmMrRVZlUVVRWGs5SUZxV1QyN05udS9uNzkrcm5qd0lBQkExeWdVWEJKSnVWYVhiMzR4eDU3ckV1RkhudnNzZlhiWFhmZFpUdnV1S09MZ2dGTlVoazZkS2pkZnZ2dDlzZ2pqN2lyWTJrcVBVRUVBREpIMTJsNjRZVVgzTkxzV3FhOU5pM1JMc0dWQnhQcG5LNFRJbnFjT3RscjkzVUVWeUlNSGxkYldobUlzb3IzMzMvZnJyLytlcmRkZDkxMTdzSlMxMXh6emZvckZZcFNvRDMyMk1PMXNkMTAwMDMyNG9zdjJwUXBVMXpQUHdBZ00vU0ZYczFXYWcxS0pxajRrM1dDNjJxRnlseEVqMU96VlczQjg0TEgxWlp5QUZHRVVzYng4Y2NmKzJmU296UW91QWdWQUNDYWI3NzV4cTJvTzJuU3BBMmFweElGclQ2Smw3TU5xTE5kUVVUMHVMb2VJOEhqYWtzNWdLZ1RSUjB1RHp6d2dDMVlzTUJtenB6cGpsUGROSVJNMTFVSEFFU25wVW02ZHUxcVAvendneHRwcFUzN3FxdTF2M1RwMHZWWEhFeFc5eXFyVUt1U0ZCY1hKMzFNTUtkRVY2Sk5SbUVycllIYVNuUFUxcFp1TnFFTUpNeThFTWFSUjBQNVJVUDVSVVA1UlZOZitWMTIyV1cyZlBseS8yaGp1KzY2cXh1Nis4Yy8vdEgxU1I5d3dBSCtQZXZxNDZsVHA3ckwxV3E0cmk2Ris4b3JyN2o1STVwSEV0QmxjSjk5OWxrNzg4d3prM1pCcEIxQUdoc2Z3R2dvdjJnb3YyZ292MmpTTGIrLy8vM3ZiaUwzNmFlZjdwOHhONmxia3dOMUx1aG9WNS8xZ3c4K2FJY2Njb2dOSGp6WXpUelhvQ2NGblFrVEpyakhhR0NVK3JpVm5SeDMzSEh1WEcwTWl3S0Faa3p6UDlTc05XM2FOSmRsYUNYZWh4OSsyQTN0M1h6enpkMWpOSHkzZi8vK3JxdEI5Ny84OHN0Mjg4MDN1eVl4RFlpcUN4bElSSHdEaklieWk0YnlpNmE1bGQrcnI3N3E1bXpvZ2xHSjFPR3VDWVdMRmkxeVdZZ0N4N2JiYnVzbWV3ZlV4YUFtSzYzYXEzMk43dHB1dSszY2xRenJRZ0NKaUQvZ2FDaS9hQ2kvYUNpL2FHakNBZ0NFUWdBQkFJUmc5djhCNGhNT3BJK1hsdHNBQUFBQVNVVk9SSzVDWUlJPVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldE5vcm1hbCgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUJDQUlBQUFDUWQxUGVBQUFGRG1sVVdIUllUVXc2WTI5dExtRmtiMkpsTG5odGNBQUFBQUFBUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRLUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpV0UxUUlFTnZjbVVnTlM0MUxqQWlQZ29nUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0S0lDQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJZ29nSUNBZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJZ29nSUNBZ2VHMXNibk02Y0dodmRHOXphRzl3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzQm9iM1J2YzJodmNDOHhMakF2SWdvZ0lDQWdlRzFzYm5NNlpYaHBaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5bGVHbG1MekV1TUM4aUNpQWdJQ0I0Yld4dWN6cDBhV1ptUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzUnBabVl2TVM0d0x5SUtJQ0FnSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWdvZ0lDQWdlRzFzYm5NNmMzUkZkblE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVVYyWlc1MEl5SUtJQ0FnZUcxd09rTnlaV0YwWlVSaGRHVTlJakl3TWpNdE1EVXRNRFpVTWpJNk1qZzZNRFlyTURJd01DSUtJQ0FnZUcxd09rMXZaR2xtZVVSaGRHVTlJakl3TWpNdE1EVXRNRFpVTWpJNk16QTZNakVyTURJNk1EQWlDaUFnSUhodGNEcE5aWFJoWkdGMFlVUmhkR1U5SWpJd01qTXRNRFV0TURaVU1qSTZNekE2TWpFck1ESTZNREFpQ2lBZ0lIQm9iM1J2YzJodmNEcEVZWFJsUTNKbFlYUmxaRDBpTWpBeU15MHdOUzB3TmxReU1qb3lPRG93Tmlzd01qQXdJZ29nSUNCd2FHOTBiM05vYjNBNlEyOXNiM0pOYjJSbFBTSXpJZ29nSUNCd2FHOTBiM05vYjNBNlNVTkRVSEp2Wm1sc1pUMGljMUpIUWlCSlJVTTJNVGsyTmkweUxqRWlDaUFnSUdWNGFXWTZVR2w0Wld4WVJHbHRaVzV6YVc5dVBTSXhJZ29nSUNCbGVHbG1PbEJwZUdWc1dVUnBiV1Z1YzJsdmJqMGlNU0lLSUNBZ1pYaHBaanBEYjJ4dmNsTndZV05sUFNJeElnb2dJQ0IwYVdabU9rbHRZV2RsVjJsa2RHZzlJakVpQ2lBZ0lIUnBabVk2U1cxaFoyVk1aVzVuZEdnOUlqRWlDaUFnSUhScFptWTZVbVZ6YjJ4MWRHbHZibFZ1YVhROUlqSWlDaUFnSUhScFptWTZXRkpsYzI5c2RYUnBiMjQ5SWpjeUx6RWlDaUFnSUhScFptWTZXVkpsYzI5c2RYUnBiMjQ5SWpjeUx6RWlQZ29nSUNBOGVHMXdUVTA2U0dsemRHOXllVDRLSUNBZ0lEeHlaR1k2VTJWeFBnb2dJQ0FnSUR4eVpHWTZiR2tLSUNBZ0lDQWdjM1JGZG5RNllXTjBhVzl1UFNKd2NtOWtkV05sWkNJS0lDQWdJQ0FnYzNSRmRuUTZjMjltZEhkaGNtVkJaMlZ1ZEQwaVFXWm1hVzVwZEhrZ1VHaHZkRzhnTWlBeUxqQXVOQ0lLSUNBZ0lDQWdjM1JGZG5RNmQyaGxiajBpTWpBeU15MHdOUzB3TmxReU1qb3pNRG95TVNzd01qb3dNQ0l2UGdvZ0lDQWdQQzl5WkdZNlUyVnhQZ29nSUNBOEwzaHRjRTFOT2tocGMzUnZjbmsrQ2lBZ1BDOXlaR1k2UkdWelkzSnBjSFJwYjI0K0NpQThMM0prWmpwU1JFWStDand2ZURwNGJYQnRaWFJoUGdvOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4KzBJZ1Z4QUFBQVlCcFEwTlFjMUpIUWlCSlJVTTJNVGsyTmkweUxqRUFBQ2lSZFpIUEswUlJGTWMvTTM3bVI2TllLQll2RGF1aFFZbU54Y2l2d21LTU10ak12UG1sNW8zWGUyL1NaS3RzRlNVMmZpMzRDOWdxYTZXSWxHeFpFeHYwbk9lcGtjeTVuWHMrOTN2dk9kMTdMbmdqV1ZVenk0T2c1U3dqUEJwU1pxTnpTdFVqRlZUU1JBdSttR3JxazlNakVVcmEydzBlSjE1MU9yVktuL3ZYYWhOSlV3VlB0ZkNncWh1VzhKand4TEtsTzd3cDNLUm1ZZ25oWStHQUlSY1V2bmIwdU10UERxZGQvbkRZaUlTSHdOc2dyS1IvY2Z3WHF4bERFNWFYNDlleWVmWG5QczVMNnBLNW1XbUpiZUt0bUlRWkpZVENPTU1NMFVjM0F6TDMwVWtQWGJLaVJIN3dPMytLSmNsVlpkWXBZTEJJbWd3V0FWSHpVajBwTVNWNlVrYVdndFAvdjMwMVU3MDlidlc2RUZRODJQWkxPMVJ0d09lNmJiL3YyL2JuQVpUZHcxbXVtTCswQi8ydm9xOFhOZjh1K0ZiaDVMeW94YmZnZEEyYTcvU1lFZnVXeXNTOXFSUThIMEY5RkJvdm9XYmU3ZG5QUG9lM0VGbVJyN3FBN1Izb2tQTytoUzgyNFdmUWd4R0NjZ0FBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFBeEpSRUZVQ0psamFHajREd0FEZ3dJQVZialdQd0FBQUFCSlJVNUVya0pnZ2c9PVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldFRvb24oKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFQOEFBQUFCQ0FZQUFBQVJrSGlqQUFBQmhHbERRMUJKUTBNZ2NISnZabWxzWlFBQUtKRjlrVDFJdzBBY3hWL1RTb3RVQk8wZzRwQ2hPdGxGUlJ4TEZZdGdvYlFWV25Vd3VmUUxtalFrS1M2T2dtdkJ3WS9GcW9PTHM2NE9yb0lnK0FIaTdPQ2s2Q0lsL2k4cHRJang0TGdmNys0OTd0NEJRcXZHVkRNUUIxVE5NakxKaEpndnJJckJWd1FSUUJnaERFbk0xRlBaeFJ3OHg5YzlmSHk5aS9FczczTi9qZ0dsYURMQUp4TEhtVzVZeEJ2RXM1dVd6bm1mT01JcWtrSjhUanhwMEFXSkg3a3V1L3pHdWV5d3dETWpSaTR6VHh3aEZzczlMUGN3cXhncThReHhWRkUxeWhmeUxpdWN0emlydFFicjNKTy9NRnpVVnJKY3B6bUdKSmFRUWhvaVpEUlFSUTBXWXJScXBKakkwSDdDd3ovcStOUGtrc2xWQlNQSEF1cFFJVGwrOEQvNDNhMVptcDV5azhJSm9PL0Z0ai9HZ2VBdTBHN2E5dmV4YmJkUEFQOHpjS1YxL2ZVV01QZEplck9yUlkrQXdXM2c0cnFyeVh2QTVRNHc4cVJMaHVSSWZwcENxUVM4bjlFM0ZZRGhXNkIvemUydHM0L1RCeUJIWFMzZkFBZUh3RVNac3RjOTNoM3E3ZTNmTTUzK2ZnQTRPWEtQdC83Sy9nQUFBQVppUzBkRUFQOEFBQUFBTXlkODh3QUFBQWx3U0ZsekFBQXVJd0FBTGlNQmVLVS9kZ0FBQUFkMFNVMUZCK2dIQkF3ZEoxajlXQnNBQUFBWmRFVllkRU52YlcxbGJuUUFRM0psWVhSbFpDQjNhWFJvSUVkSlRWQlhnUTRYQUFBQVZVbEVRVlFvejJOa1lHRDR6ekFLaGg1Z1pXQmc0R0JnWU9CRW8yRnNLSitYazRGQmlwT0JRWm9EUWt0eE1qQ0lzREV3U0hGQU1SZUU1c1ZtRGhjV08xZ1lHQmdZR01sSU52ajBNSTd3WkVpcy82a2JoZ0MwNFFqL3c3L0haZ0FBQUFCSlJVNUVya0pnZ2c9PVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldEljb25MaWdodCgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyBzdGFuZGFsb25lPSdubyclM0YlM0UlM0Nzdmcgdmlld0JveD0nMCAwIDE2IDE2JyB2ZXJzaW9uPScxLjEnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgaWQ9J0xpZ2h0JyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDc3R5bGUlM0UgLnMlN0JmaWxsOiUyM2ZmZjtzdHJva2U6JTIzMDAwO3N0cm9rZS13aWR0aDouMXB4OyU3RCAlM0Mvc3R5bGUlM0UlM0NyZWN0IGNsYXNzPSdzJyB4PScwLjE3MDM5MjkzJyB5PScxMC4wMDI0NDgnIHdpZHRoPSczLjkwMDA1NjgnIGhlaWdodD0nMC45MDAwOTkzNCcgaWQ9J05ORScgdHJhbnNmb3JtPSdyb3RhdGUoLTY3LjUpJyAvJTNFJTNDcmVjdCB4PSc4LjgyOTUwNzgnIHk9JzEwLjAwMjQ0Nycgd2lkdGg9JzMuOTAwMDU2OCcgaGVpZ2h0PScwLjkwMDA5OTM0JyBpZD0nRU5FJyB0cmFuc2Zvcm09J3JvdGF0ZSgtMjIuNSknIGNsYXNzPSdzJyAvJTNFJTNDcmVjdCB4PScxNC45NTI0NjknIHk9JzMuODc5NTcxNycgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nRVNFJyB0cmFuc2Zvcm09J3JvdGF0ZSgyMi41KScgY2xhc3M9J3MnIC8lM0UlM0NyZWN0IHg9JzE0Ljk1MjQ3JyB5PSctNC43Nzk1NDI5JyB3aWR0aD0nMy45MDAwMTM5JyBoZWlnaHQ9JzAuOTAwMDk5ODcnIGlkPSdTU0UnIHRyYW5zZm9ybT0ncm90YXRlKDY3LjUpJyBjbGFzcz0ncycgLyUzRSUzQ3JlY3QgeD0nLTEyLjcyOTU2NScgeT0nMTAuMDAyNDQ3JyB3aWR0aD0nMy45MDAwMTM5JyBoZWlnaHQ9JzAuOTAwMDk5ODcnIGlkPSdTU1cnIHRyYW5zZm9ybT0ncm90YXRlKC02Ny41KScgY2xhc3M9J3MnIC8lM0UlM0NyZWN0IHg9Jy00LjA3MDQ0OTgnIHk9JzEwLjAwMjQ0Nycgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nV1NXJyB0cmFuc2Zvcm09J3JvdGF0ZSgtMjIuNSknIGNsYXNzPSdzJyAvJTNFJTNDcmVjdCB4PScyLjA1MjQ2ODUnIHk9JzMuODc5NTcxNycgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nV05XJyB0cmFuc2Zvcm09J3JvdGF0ZSgyMi41KScgY2xhc3M9J3MnIC8lM0UlM0NyZWN0IHg9JzIuMDUyNDY4NScgeT0nLTQuNzc5NTQyOScgd2lkdGg9JzMuOTAwMDEzOScgaGVpZ2h0PScwLjkwMDA5OTg3JyBpZD0nTk5XJyB0cmFuc2Zvcm09J3JvdGF0ZSg2Ny41KScgY2xhc3M9J3MnIC8lM0UlM0NlbGxpcHNlIGlkPSdDRU5URVInIGN4PSc4LjAwMDA4MicgY3k9JzguMDAwMjU3NScgcng9JzMuNDUwMDgyMycgcnk9JzMuNDUwMjU3MycgY2xhc3M9J3MnIC8lM0UlM0Mvc3ZnJTNFXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0SWNvbkNhbWVyYSgpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyBzdGFuZGFsb25lPSdubyclM0YlM0UlM0NzdmcgaWQ9J0NhbWVyYScgdmlld0JveD0nMCAwIDE2IDE2JyB2ZXJzaW9uPScxLjEnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3N0eWxlIGlkPSdzdHlsZTEnJTNFLnMlN0JmaWxsOiUyM2ZmZjtzdHJva2U6JTIzMDAwO3N0cm9rZS13aWR0aDouMXB4OyU3RCAlM0Mvc3R5bGUlM0UlM0NwYXRoIGNsYXNzPSdzJyBkPSdNIDEzLjg1NzMyMiw4Ljg3NTUyOTcgSCAxMi40MTM0MjQgTCAxMi40MTMsNi43ODcgaCAtMS40MjUzMTEgYyAwLjIyNzAyNiwtMC40NDk0NjkzIDAuMzYzMjQzLC0wLjk0NTM5MTkgMC4zNjMyNDMsLTEuNDg4NTAwOCAwLC0xLjc5Nzg3NzUgLTEuNDA3NTcyNywtMy4yNDkyODkzIC0zLjE1MTE0NjYsLTMuMjQ5Mjg5MyAtMS43NDM1NzQ2LDAgLTMuMTUxMTQ3OSwxLjQ1MTQxMTggLTMuMTUxMTQ3OSwzLjI0OTI4OTMgdiAwLjAyODA5MyBDIDQuNTc2NDE5NCw1LjAzNjMxMTggNC4wMzE1NTI0LDQuODU4Mzk2OCAzLjQ1MDM2MDYsNC44NTgzOTY4IDEuNzA2Nzg2Myw0Ljg2Nzc1NjcgMC4yOTkyMTI5OCw2LjMxOTE3MjMgMC4yOTkyMTI5OCw4LjEwNzY4NiBjIDAsMS43ODg1MTM1IDEuNjY1Mzg1ODIsMy4zMTE3ODkgMy40MjQ1ODUxMiwzLjI0OTI4OSBMIDMuNzMyLDEzLjk3NiBoIDguNjgxIHYgLTIuMTEzMzY4IGggMS40NDQzMjIgeicgaWQ9J3BhdGgxJyAvJTNFJTNDcmVjdCBjbGFzcz0ncycgeD0nMTIuODAzOTEnIHk9JzguMzk3OTY4Mycgd2lkdGg9JzIuODk2ODc2NicgaGVpZ2h0PSczLjg4NjAzNzYnIHJ4PScwJyByeT0nMCcgaWQ9J3JlY3QxJyAvJTNFJTNDL3N2ZyUzRSUwQVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldEljb25BdWRpbygpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyBzdGFuZGFsb25lPSdubyclM0YlM0UlM0NzdmcgaWQ9J0F1ZGlvJyB2aWV3Qm94PScwIDAgMTYgMTYnIHZlcnNpb249JzEuMScgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDc3R5bGUlM0UucyU3QmZpbGw6JTIzZmZmO3N0cm9rZTolMjMwMDA7c3Ryb2tlLXdpZHRoOi4xcHg7JTdEICUzQy9zdHlsZSUzRSUzQ3BhdGggY2xhc3M9J3MnIGQ9J00gOS4xNTYzNTg4LDEuMDgwNDAwNiAzLjY3MjkzNDEsNC42NDIwMTcgSCAwLjU0MzY0OTcxIHYgNi43ODQwMzEgSCAzLjc1OTA2MTIgbCA1LjM5NzI5NzYsMy40OTM3NzYgeicgaWQ9J3BhdGgxJyAvJTNFJTNDcGF0aCBjbGFzcz0ncycgZD0nbSAxMy4zNDc1MTgsMTMuNjc2NjQ1IC0wLjc2NTE1NywtMC41NjM1NjYgYyA0LjIyNzQ4NSwtNS41NjA1MjQxIDAuMjEwNDE4LC05Ljg4MTIwMiAwLjAzODI1LC0xMC4wNTk2NjQ4IGwgMC42OTgyMDQsLTAuNjQ4MTAxOSBjIDAuMDQ3ODIsMC4wNDY5NjQgNC43NTM1Myw1LjA2MjcwNzYgMC4wMzgyNSwxMS4yNzEzMzI3IHonIGlkPSdwYXRoMicgLyUzRSUzQ3BhdGggY2xhc3M9J3MnIGQ9J20gMTEuMzIxODY4LDExLjc5ODA5IC0wLjgyMjU0MSwtMC40NzkwMzIgYyAyLjE0MjQzNCwtMy41Nzg2NDc0IDAuMTE0NzczLC02LjM1ODkxIDAuMDI4NjksLTYuNDcxNjIzMiBsIDAuNzY1MTU2LC0wLjU2MzU2NjYgYyAwLjEwNTIwOCwwLjE0MDg5MTUgMi41MDU4ODMsMy4zODE0MDAxIDAuMDI4NjksNy41MDQ4Mjk4IHonIGlkPSdwYXRoMycgLyUzRSUzQy9zdmclM0UlMEFcIjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHN0YXRpYyBnZXRJY29uUGFydGljbGVzKCk6IHN0cmluZyB7XHJcbiAgICAvLyAgIHJldHVybiBcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnJTNGJTNFJTNDc3ZnIGlkPSdQYXJ0aWtlbF9WMicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTYuMjggMTYuNTInJTNFJTNDZGVmcyUzRSUzQ3N0eWxlJTNFLmNscy0xJTdCZmlsbDolMjNmZmY7c3Ryb2tlOiUyMzAwMDtzdHJva2UtbWl0ZXJsaW1pdDoxNS4xMjtzdHJva2Utd2lkdGg6LjI1cHg7JTdEJTNDL3N0eWxlJTNFJTNDL2RlZnMlM0UlM0NjaXJjbGUgY2xhc3M9J2Nscy0xJyBjeD0nNC43MicgY3k9JzUuNDcnIHI9JzIuNTInLyUzRSUzQ2NpcmNsZSBjbGFzcz0nY2xzLTEnIGN4PScxMS4yNicgY3k9JzguMjgnIHI9JzEuNzUnLyUzRSUzQ2NpcmNsZSBjbGFzcz0nY2xzLTEnIGN4PSc1Ljk1JyBjeT0nMTIuMDUnIHI9JzEuMjknLyUzRSUzQy9zdmclM0VcIjtcclxuICAgIC8vIH1cclxuICB9XHJcbn0iLCIvLyAvPHJlZmVyZW5jZSBwYXRoPVwiLi4vRXZlbnQvRXZlbnQudHNcIi8+XHJcbi8vIC88cmVmZXJlbmNlIHBhdGg9XCIuLi9UaW1lL1RpbWUudHNcIi8+XHJcbm5hbWVzcGFjZSBGdWRnZUNvcmUge1xyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgdGhlIG1vZGUgYSBsb29wIHJ1bnMgaW5cclxuICAgKi9cclxuICBleHBvcnQgZW51bSBMT09QX01PREUge1xyXG4gICAgLyoqIExvb3AgY3ljbGVzIGNvbnRyb2xsZWQgYnkgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAqL1xyXG4gICAgRlJBTUVfUkVRVUVTVCA9IFwiZnJhbWVSZXF1ZXN0XCIsXHJcbiAgICAvKiogTG9vcCBjeWNsZXMgY29udHJvbGxlZCBieSB4clNlc3Npb24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lICovXHJcbiAgICBGUkFNRV9SRVFVRVNUX1hSID0gXCJmcmFtZVJlcXVlc3RYUlwiLFxyXG4gICAgLyoqIExvb3AgY3ljbGVzIHdpdGggdGhlIGdpdmVuIGZyYW1lcmF0ZSBpbiB7QGxpbmsgVGltZS5nYW1lfSAqL1xyXG4gICAgVElNRV9HQU1FID0gXCJ0aW1lR2FtZVwiLFxyXG4gICAgLyoqIExvb3AgY3ljbGVzIHdpdGggdGhlIGdpdmVuIGZyYW1lcmF0ZSBpbiByZWFsdGltZSwgaW5kZXBlbmRlbnQgb2Yge0BsaW5rIFRpbWUuZ2FtZX0gKi9cclxuICAgIFRJTUVfUkVBTCA9IFwidGltZVJlYWxcIlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29yZSBsb29wIG9mIGEgRlVER0UgYXBwbGljYXRpb24uIEluaXRpYWxpemVzIGF1dG9tYXRpY2FsbHkgYW5kIG11c3QgYmUgc3RhcnRlZCBleHBsaWNpdGx5LlxyXG4gICAqIEl0IHRoZW4gZmlyZXMge0BsaW5rIEVWRU5ULkxPT1BfRlJBTUV9IHRvIGFsbCBhZGRlZCBsaXN0ZW5lcnMgYXQgZWFjaCBmcmFtZVxyXG4gICAqIFxyXG4gICAqIEBhdXRob3IgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgTG9vcCBleHRlbmRzIEV2ZW50VGFyZ2V0U3RhdGljIHtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZVN0YXJ0R2FtZTogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZVN0YXJ0UmVhbDogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZUZyYW1lR2FtZTogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZUZyYW1lUmVhbDogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSVGltZUZyYW1lU3RhcnRHYW1lOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgxpJUaW1lRnJhbWVTdGFydFJlYWw6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXRpYyDGklRpbWVMYXN0RnJhbWVHYW1lQXZnOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgxpJUaW1lTGFzdEZyYW1lUmVhbEF2ZzogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIMaSRnJhbWVzOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbW9kZTogTE9PUF9NT0RFID0gTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1Q7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZEludGVydmFsbDogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGlkUmVxdWVzdDogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGZwc0Rlc2lyZWQ6IG51bWJlciA9IDMwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZnJhbWVzVG9BdmVyYWdlOiBudW1iZXIgPSAzMDtcclxuICAgIHByaXZhdGUgc3RhdGljIHN5bmNXaXRoQW5pbWF0aW9uRnJhbWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogVGhlIGdhbWV0aW1lIHRoZSBsb29wIHdhcyBzdGFydGVkLCBvdmVyd3JpdHRlbiBhdCBlYWNoIHN0YXJ0ICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB0aW1lU3RhcnRHYW1lKCk6IG51bWJlciB7IHJldHVybiBMb29wLsaSVGltZVN0YXJ0R2FtZTsgfVxyXG4gICAgLyoqIFRoZSByZWFsdGltZSB0aGUgbG9vcCB3YXMgc3RhcnRlZCwgb3ZlcndyaXR0ZW4gYXQgZWFjaCBzdGFydCAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgdGltZVN0YXJ0UmVhbCgpOiBudW1iZXIgeyByZXR1cm4gTG9vcC7GklRpbWVTdGFydFJlYWw7IH1cclxuICAgIC8qKiBUaGUgZ2FtZXRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBsb29wIGN5Y2xlICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB0aW1lRnJhbWVHYW1lKCk6IG51bWJlciB7IHJldHVybiBMb29wLsaSVGltZUZyYW1lR2FtZTsgfVxyXG4gICAgLyoqIFRoZSByZWFsdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGxvb3AgY3ljbGUgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHRpbWVGcmFtZVJlYWwoKTogbnVtYmVyIHsgcmV0dXJuIExvb3AuxpJUaW1lRnJhbWVSZWFsOyB9XHJcbiAgICAvKiogVGhlIGdhbWV0aW1lIHRoZSBsYXN0IGxvb3AgY3ljbGUgc3RhcnRlZCovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCB0aW1lRnJhbWVTdGFydEdhbWUoKTogbnVtYmVyIHsgcmV0dXJuIExvb3AuxpJUaW1lRnJhbWVTdGFydEdhbWU7IH1cclxuICAgIC8qKiBUaGUgcmVhbHRpbWUgdGhlIGxhc3QgbG9vcCBjeWNsZSBzdGFydGVkKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHRpbWVGcmFtZVN0YXJ0UmVhbCgpOiBudW1iZXIgeyByZXR1cm4gTG9vcC7GklRpbWVGcmFtZVN0YXJ0UmVhbDsgfVxyXG4gICAgLyoqIFRoZSBhdmVyYWdlIG51bWJlciBvZiBmcmFtZXMgcGVyIHNlY29uZCBpbiBnYW1ldGltZSAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgZnBzR2FtZUF2ZXJhZ2UoKTogbnVtYmVyIHsgcmV0dXJuIDEwMDAgLyBMb29wLsaSVGltZUxhc3RGcmFtZUdhbWVBdmc7IH1cclxuICAgIC8qKiBUaGUgYXZlcmFnZSBudW1iZXIgb2YgZnJhbWVzIHBlciBzZWNvbmQgaW4gcmVhbHRpbWUgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGZwc1JlYWxBdmVyYWdlKCk6IG51bWJlciB7IHJldHVybiAxMDAwIC8gTG9vcC7GklRpbWVMYXN0RnJhbWVSZWFsQXZnOyB9XHJcbiAgICAvKiogVGhlIG51bWJlciBvZiBmcmFtZXMgdHJpZ2dlcmVkIHNvIGZhciAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgZnJhbWVzKCk6IG51bWJlciB7IHJldHVybiBMb29wLsaSRnJhbWVzOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgdGhlIGxvb3Agd2l0aCB0aGUgZ2l2ZW4gbW9kZSBhbmQgZnBzLiAgXHJcbiAgICAgKiBUaGUgZGVmYXVsdCBmb3IgX21vZGUgaXMgRlJBTUVfUkVRVUVTVCwgc2VlIHtAbGluayBMT09QX01PREV9LCBob29raW5nIHRoZSBsb29wIHRvIHRoZSBicm93c2VyJ3MgYW5pbWF0aW9uIGZyYW1lLlxyXG4gICAgICogSXMgb25seSBhcHBsaWNhYmxlIGluIFRJTUUtbW9kZXMuXHJcbiAgICAgKiBfc3luY1dpdGhBbmltYXRpb25GcmFtZSBpcyBleHBlcmltZW50YWwgYW5kIG9ubHkgYXBwbGljYWJsZSBpbiBUSU1FLW1vZGVzLCBkZWZlcnJpbmcgdGhlIGxvb3AtY3ljbGUgdW50aWwgdGhlIG5leHQgcG9zc2libGUgYW5pbWF0aW9uIGZyYW1lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0YXJ0KF9tb2RlOiBMT09QX01PREUgPSBMT09QX01PREUuRlJBTUVfUkVRVUVTVCwgX2ZwczogbnVtYmVyID0gNjAsIF9zeW5jV2l0aEFuaW1hdGlvbkZyYW1lOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgTG9vcC5zdG9wKCk7XHJcblxyXG4gICAgICBMb29wLsaSVGltZVN0YXJ0R2FtZSA9IFRpbWUuZ2FtZS5nZXQoKTtcclxuICAgICAgTG9vcC7GklRpbWVTdGFydFJlYWwgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgICAgTG9vcC7GklRpbWVGcmFtZVN0YXJ0R2FtZSA9IExvb3AuxpJUaW1lU3RhcnRHYW1lO1xyXG4gICAgICBMb29wLsaSVGltZUZyYW1lU3RhcnRSZWFsID0gTG9vcC7GklRpbWVTdGFydFJlYWw7XHJcbiAgICAgIExvb3AuZnBzRGVzaXJlZCA9IChfbW9kZSA9PSBMT09QX01PREUuRlJBTUVfUkVRVUVTVCkgPyA2MCA6IF9mcHM7XHJcbiAgICAgIExvb3AuZnJhbWVzVG9BdmVyYWdlID0gTG9vcC5mcHNEZXNpcmVkO1xyXG4gICAgICBMb29wLsaSVGltZUxhc3RGcmFtZUdhbWVBdmcgPSBMb29wLsaSVGltZUxhc3RGcmFtZVJlYWxBdmcgPSAxMDAwIC8gTG9vcC5mcHNEZXNpcmVkO1xyXG4gICAgICBMb29wLm1vZGUgPSBfbW9kZTtcclxuICAgICAgTG9vcC5zeW5jV2l0aEFuaW1hdGlvbkZyYW1lID0gX3N5bmNXaXRoQW5pbWF0aW9uRnJhbWU7XHJcblxyXG4gICAgICBsZXQgbG9nOiBzdHJpbmcgPSBgTG9vcCBzdGFydGluZyBpbiBtb2RlICR7TG9vcC5tb2RlfWA7XHJcbiAgICAgIGlmIChMb29wLm1vZGUgIT0gTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1QpXHJcbiAgICAgICAgbG9nICs9IGAgd2l0aCBhdHRlbXB0ZWQgJHtfZnBzfSBmcHNgO1xyXG4gICAgICBEZWJ1Zy5mdWRnZShsb2cpO1xyXG5cclxuICAgICAgc3dpdGNoIChfbW9kZSkge1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1Q6XHJcbiAgICAgICAgICBMb29wLmxvb3BGcmFtZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBMT09QX01PREUuRlJBTUVfUkVRVUVTVF9YUjpcclxuICAgICAgICAgIExvb3AubG9vcEZyYW1lWFIoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLlRJTUVfUkVBTDpcclxuICAgICAgICAgIExvb3AuaWRJbnRlcnZhbGwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoTG9vcC5sb29wVGltZSwgMTAwMCAvIExvb3AuZnBzRGVzaXJlZCk7XHJcbiAgICAgICAgICBMb29wLmxvb3BUaW1lKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIExPT1BfTU9ERS5USU1FX0dBTUU6XHJcbiAgICAgICAgICBMb29wLmlkSW50ZXJ2YWxsID0gVGltZS5nYW1lLnNldFRpbWVyKDEwMDAgLyBMb29wLmZwc0Rlc2lyZWQsIDAsIExvb3AubG9vcFRpbWUpO1xyXG4gICAgICAgICAgTG9vcC5sb29wVGltZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBMb29wLnJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgdGhlIGxvb3BcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzdG9wKCk6IHZvaWQge1xyXG4gICAgICBpZiAoIUxvb3AucnVubmluZylcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBzd2l0Y2ggKExvb3AubW9kZSkge1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLkZSQU1FX1JFUVVFU1Q6XHJcbiAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoTG9vcC5pZFJlcXVlc3QpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBMT09QX01PREUuRlJBTUVfUkVRVUVTVF9YUjpcclxuICAgICAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5zZXNzaW9uLmNhbmNlbEFuaW1hdGlvbkZyYW1lKExvb3AuaWRSZXF1ZXN0KTtcclxuICAgICAgICAgIFhSVmlld3BvcnQuZGVmYXVsdC5zZXNzaW9uID0gbnVsbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLlRJTUVfUkVBTDpcclxuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKExvb3AuaWRJbnRlcnZhbGwpO1xyXG4gICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKExvb3AuaWRSZXF1ZXN0KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTE9PUF9NT0RFLlRJTUVfR0FNRTpcclxuICAgICAgICAgIFRpbWUuZ2FtZS5kZWxldGVUaW1lcihMb29wLmlkSW50ZXJ2YWxsKTtcclxuICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShMb29wLmlkUmVxdWVzdCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIExvb3AucnVubmluZyA9IGZhbHNlO1xyXG4gICAgICBEZWJ1Zy5mdWRnZShcIkxvb3Agc3RvcHBlZCFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250aW51ZSBydW5uaW5nIHRoZSBsb29wXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY29udGludWUoKTogdm9pZCB7XHJcbiAgICAgIGlmIChMb29wLnJ1bm5pbmcpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgTG9vcC5zdGFydChMb29wLm1vZGUsIExvb3AuZnBzRGVzaXJlZCwgTG9vcC5zeW5jV2l0aEFuaW1hdGlvbkZyYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBsb29wKCk6IHZvaWQge1xyXG4gICAgICBsZXQgdGltZTogbnVtYmVyO1xyXG4gICAgICB0aW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgIExvb3AuxpJUaW1lRnJhbWVSZWFsID0gdGltZSAtIExvb3AuxpJUaW1lRnJhbWVTdGFydFJlYWw7XHJcbiAgICAgIExvb3AuxpJUaW1lRnJhbWVTdGFydFJlYWwgPSB0aW1lO1xyXG5cclxuICAgICAgdGltZSA9IFRpbWUuZ2FtZS5nZXQoKTtcclxuICAgICAgTG9vcC7GklRpbWVGcmFtZUdhbWUgPSB0aW1lIC0gTG9vcC7GklRpbWVGcmFtZVN0YXJ0R2FtZTtcclxuICAgICAgTG9vcC7GklRpbWVGcmFtZVN0YXJ0R2FtZSA9IHRpbWU7XHJcblxyXG4gICAgICBMb29wLsaSVGltZUxhc3RGcmFtZUdhbWVBdmcgPSAoKExvb3AuZnJhbWVzVG9BdmVyYWdlIC0gMSkgKiBMb29wLsaSVGltZUxhc3RGcmFtZUdhbWVBdmcgKyBMb29wLsaSVGltZUZyYW1lR2FtZSkgLyBMb29wLmZyYW1lc1RvQXZlcmFnZTtcclxuICAgICAgTG9vcC7GklRpbWVMYXN0RnJhbWVSZWFsQXZnID0gKChMb29wLmZyYW1lc1RvQXZlcmFnZSAtIDEpICogTG9vcC7GklRpbWVMYXN0RnJhbWVSZWFsQXZnICsgTG9vcC7GklRpbWVGcmFtZVJlYWwpIC8gTG9vcC5mcmFtZXNUb0F2ZXJhZ2U7XHJcblxyXG4gICAgICAvLyBUT0RPOiBjb25zaWRlciBMb29wRXZlbnQgd2hpY2ggY29udmV5cyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRpbWVFbGFwc2VkIGV0Yy4uLlxyXG4gICAgICBMb29wLsaSRnJhbWVzKys7XHJcbiAgICAgIGxldCBldmVudDogRXZlbnQgPSBuZXcgRXZlbnQoRVZFTlQuTE9PUF9GUkFNRSk7XHJcbiAgICAgIExvb3AudGFyZ2V0U3RhdGljLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGxvb3BGcmFtZSgpOiB2b2lkIHtcclxuICAgICAgTG9vcC5sb29wKCk7XHJcbiAgICAgIExvb3AuaWRSZXF1ZXN0ID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShMb29wLmxvb3BGcmFtZSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHN0YXRpYyBsb29wRnJhbWVYUihfdGltZTogbnVtYmVyID0gbnVsbCwgX3hyRnJhbWU6IFhSRnJhbWUgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgIExvb3AubG9vcCgpO1xyXG4gICAgICBYUlZpZXdwb3J0LmRlZmF1bHQuZHJhdyh0cnVlLCBfeHJGcmFtZSk7XHJcbiAgICAgIExvb3AuaWRSZXF1ZXN0ID0gWFJWaWV3cG9ydC5kZWZhdWx0LnNlc3Npb24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKExvb3AubG9vcEZyYW1lWFIpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9vcFRpbWUoKTogdm9pZCB7XHJcbiAgICAgIGlmIChMb29wLnN5bmNXaXRoQW5pbWF0aW9uRnJhbWUpXHJcbiAgICAgICAgTG9vcC5pZFJlcXVlc3QgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKExvb3AubG9vcCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBMb29wLmxvb3AoKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCJuYW1lc3BhY2UgRnVkZ2VDb3JlIHtcclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBUaW1lVW5pdHMge1xyXG4gICAgaG91cnM/OiBudW1iZXI7XHJcbiAgICBtaW51dGVzPzogbnVtYmVyO1xyXG4gICAgc2Vjb25kcz86IG51bWJlcjtcclxuICAgIHRlbnRocz86IG51bWJlcjtcclxuICAgIGh1bmRyZWRzPzogbnVtYmVyO1xyXG4gICAgdGhvdXNhbmRzPzogbnVtYmVyO1xyXG4gICAgZnJhY3Rpb24/OiBudW1iZXI7XHJcbiAgICBhc0hvdXJzPzogbnVtYmVyO1xyXG4gICAgYXNNaW51dGVzPzogbnVtYmVyO1xyXG4gICAgYXNTZWNvbmRzPzogbnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBUaW1lcnMgZXh0ZW5kcyBPYmplY3Qge1xyXG4gICAgW2lkOiBudW1iZXJdOiBUaW1lcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGdlbmVyYXRlIGEgdGltZXN0YW1wIHRoYXQgY29ycmVsYXRlcyB3aXRoIHRoZSB0aW1lIGVsYXBzZWQgc2luY2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGJ1dCBhbGxvd3MgZm9yIHJlc2V0dGluZyBhbmQgc2NhbGluZy4gIFxyXG4gICAqIFN1cHBvcnRzIHtAbGluayBUaW1lcn1zIHNpbWlsYXIgdG8gd2luZG93LnNldEludGVydmFsIGJ1dCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNjYWxlZCB0aW1lLlxyXG4gICAqIEFsbCB0aW1lIHZhbHVlcyBhcmUgZ2l2ZW4gaW4gbWlsbGlzZWNvbmRzXHJcbiAgICogXHJcbiAgICogQGF1dGhvcnMgSmlya2EgRGVsbCdPcm8tRnJpZWRsLCBIRlUsIDIwMTlcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgVGltZSBleHRlbmRzIEV2ZW50VGFyZ2V0VW5pZmllZCB7XHJcbiAgICAvKiogU3RhbmRhcmQgZ2FtZSB0aW1lIHN0YXJ0aW5nIGF1dG9tYXRpY2FsbHkgd2l0aCB0aGUgYXBwbGljYXRpb24gKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZ2FtZTogVGltZSA9IG5ldyBUaW1lKCk7XHJcbiAgICBwcml2YXRlIHN0YXJ0OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHNjYWxlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIG9mZnNldDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBsYXN0Q2FsbFRvRWxhcHNlZDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lcnM6IFRpbWVycyA9IHt9O1xyXG4gICAgcHJpdmF0ZSBpZFRpbWVyQWRkZWRMYXN0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgc3VwZXIoKTtcclxuICAgICAgdGhpcy5zdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICB0aGlzLnNjYWxlID0gMS4wO1xyXG4gICAgICB0aGlzLm9mZnNldCA9IDAuMDtcclxuICAgICAgdGhpcy5sYXN0Q2FsbFRvRWxhcHNlZCA9IDAuMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgcmVwcmVzZW50aW9ucyBvZiB0aGUgdGltZSBnaXZlbiBpbiBtaWxsaXNlY29uZHMgaW4gdmFyaW91cyBmb3JtYXRzIGRlZmluZWQgaW4ge0BsaW5rIFRpbWVVbml0c31cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRVbml0cyhfbWlsbGlzZWNvbmRzOiBudW1iZXIpOiBUaW1lVW5pdHMge1xyXG4gICAgICBsZXQgdW5pdHM6IFRpbWVVbml0cyA9IHt9O1xyXG5cclxuICAgICAgdW5pdHMuYXNTZWNvbmRzID0gX21pbGxpc2Vjb25kcyAvIDEwMDA7XHJcbiAgICAgIHVuaXRzLmFzTWludXRlcyA9IHVuaXRzLmFzU2Vjb25kcyAvIDYwO1xyXG4gICAgICB1bml0cy5hc0hvdXJzID0gdW5pdHMuYXNNaW51dGVzIC8gNjA7XHJcblxyXG4gICAgICB1bml0cy5ob3VycyA9IE1hdGguZmxvb3IodW5pdHMuYXNIb3Vycyk7XHJcbiAgICAgIHVuaXRzLm1pbnV0ZXMgPSBNYXRoLmZsb29yKHVuaXRzLmFzTWludXRlcykgJSA2MDtcclxuICAgICAgdW5pdHMuc2Vjb25kcyA9IE1hdGguZmxvb3IodW5pdHMuYXNTZWNvbmRzKSAlIDYwO1xyXG5cclxuICAgICAgdW5pdHMuZnJhY3Rpb24gPSBfbWlsbGlzZWNvbmRzICUgMTAwMDtcclxuICAgICAgdW5pdHMudGhvdXNhbmRzID0gX21pbGxpc2Vjb25kcyAlIDEwO1xyXG4gICAgICB1bml0cy5odW5kcmVkcyA9IF9taWxsaXNlY29uZHMgJSAxMDAgLSB1bml0cy50aG91c2FuZHM7XHJcbiAgICAgIHVuaXRzLnRlbnRocyA9IHVuaXRzLmZyYWN0aW9uIC0gdW5pdHMuaHVuZHJlZHMgLSB1bml0cy50aG91c2FuZHM7XHJcblxyXG4gICAgICByZXR1cm4gdW5pdHM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIEdldC9TZXQgdGltZSBhbmQgc2NhbGluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2NhbGVkIHRpbWVzdGFtcCBvZiB0aGlzIGluc3RhbmNlIGluIG1pbGxpc2Vjb25kc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0KCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9mZnNldCArIHRoaXMuc2NhbGUgKiAocGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLnN0YXJ0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHJlbWFpbmluZyB0aW1lIHRvIHRoZSBnaXZlbiBwb2ludCBvZiB0aW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSZW1haW5kZXIoX3RvOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gX3RvIC0gdGhpcy5nZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIChSZS0pIFNldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGlzIGluc3RhbmNlXHJcbiAgICAgKiBAcGFyYW0gX3RpbWUgVGhlIHRpbWVzdGFtcCB0byByZXByZXNlbnQgdGhlIGN1cnJlbnQgdGltZSAoZGVmYXVsdCAwLjApXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQoX3RpbWU6IG51bWJlciA9IDApOiB2b2lkIHtcclxuICAgICAgdGhpcy5vZmZzZXQgPSBfdGltZTtcclxuICAgICAgdGhpcy5zdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICB0aGlzLmdldEVsYXBzZWRTaW5jZVByZXZpb3VzQ2FsbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc2NhbGluZyBvZiB0aGlzIHRpbWUsIGFsbG93aW5nIGZvciBzbG93bW90aW9uICg8MSkgb3IgZmFzdGZvcndhcmQgKD4xKSBcclxuICAgICAqIEBwYXJhbSBfc2NhbGUgVGhlIGRlc2lyZWQgc2NhbGluZyAoZGVmYXVsdCAxLjApXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTY2FsZShfc2NhbGU6IG51bWJlciA9IDEuMCk6IHZvaWQge1xyXG4gICAgICB0aGlzLnNldCh0aGlzLmdldCgpKTtcclxuICAgICAgdGhpcy5zY2FsZSA9IF9zY2FsZTtcclxuICAgICAgLy9UT0RPOiBjYXRjaCBzY2FsZT0wXHJcbiAgICAgIHRoaXMucmVzY2FsZUFsbFRpbWVycygpO1xyXG4gICAgICB0aGlzLmdldEVsYXBzZWRTaW5jZVByZXZpb3VzQ2FsbCgpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEVWRU5ULlRJTUVfU0NBTEVEKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2NhbGluZyBvZiB0aGlzIHRpbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNjYWxlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBvZmZzZXQgb2YgdGhpcyB0aW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPZmZzZXQoKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBzY2FsZWQgdGltZSBpbiBtaWxsaXNlY29uZHMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhpcyBtZXRob2RcclxuICAgICAqIEF1dG9tYXRpY2FsbHkgcmVzZXQgYXQgZXZlcnkgY2FsbCB0byBzZXQoLi4uKSBhbmQgc2V0U2NhbGUoLi4uKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RWxhcHNlZFNpbmNlUHJldmlvdXNDYWxsKCk6IG51bWJlciB7XHJcbiAgICAgIGxldCBjdXJyZW50OiBudW1iZXIgPSB0aGlzLmdldCgpO1xyXG4gICAgICBsZXQgZWxhcHNlZDogbnVtYmVyID0gY3VycmVudCAtIHRoaXMubGFzdENhbGxUb0VsYXBzZWQ7XHJcbiAgICAgIHRoaXMubGFzdENhbGxUb0VsYXBzZWQgPSBjdXJyZW50O1xyXG4gICAgICByZXR1cm4gZWxhcHNlZDtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gVGltZXJzXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBQcm9taXNlPHZvaWQ+IHRvIGJlIHJlc29sdmVkIGFmdGVyIHRoZSB0aW1lIGdpdmVuLiBUbyBiZSB1c2VkIHdpdGggYXN5bmMvYXdhaXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGF5KF9sYXBzZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShfcmVzb2x2ZSA9PiB0aGlzLnNldFRpbWVyKF9sYXBzZSwgMSwgKCkgPT4gX3Jlc29sdmUoKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IGV4YW1pbmUgaWYgd2ViLXdvcmtlcnMgd291bGQgZW5oYW5jZSBwZXJmb3JtYW5jZSBoZXJlIVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBhbmQgZGVsZXRlcyBhbGwge0BsaW5rIFRpbWVyfXMgYXR0YWNoZWQuIFNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgVGltZS1vYmplY3QgbGVhdmVzIHNjb3BlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhckFsbFRpbWVycygpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgaWQgaW4gdGhpcy50aW1lcnMpIHtcclxuICAgICAgICB0aGlzLmRlbGV0ZVRpbWVyKE51bWJlcihpZCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIHtAbGluayBUaW1lcn0gZm91bmQgdXNpbmcgdGhlIGludGVybmFsIGlkIG9mIHRoZSBjb25uZWN0ZWQgaW50ZXJ2YWwtb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gX2lkIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlVGltZXJCeUl0c0ludGVybmFsSWQoX2lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgaWQgaW4gdGhpcy50aW1lcnMpIHtcclxuICAgICAgICBsZXQgdGltZXI6IFRpbWVyID0gdGhpcy50aW1lcnNbaWRdO1xyXG4gICAgICAgIGlmICh0aW1lci5pZCA9PSBfaWQpIHtcclxuICAgICAgICAgIHRpbWVyLmNsZWFyKCk7XHJcbiAgICAgICAgICBkZWxldGUgdGhpcy50aW1lcnNbaWRdO1xyXG4gICAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgYW4gZWFybHkgb3V0IGlzIE9LIGhlcmUuLi4gc2hvdWxkIGJlIVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zdGFsbHMgYSB0aW1lciBhdCB0aGlzIHRpbWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gX2xhcHNlIFRoZSBvYmplY3QtdGltZSB0byBlbGFwc2UgYmV0d2VlbiB0aGUgY2FsbHMgdG8gX2NhbGxiYWNrXHJcbiAgICAgKiBAcGFyYW0gX2NvdW50IFRoZSBudW1iZXIgb2YgY2FsbHMgZGVzaXJlZCwgMCA9IEluZmluaXRlXHJcbiAgICAgKiBAcGFyYW0gX2hhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZWFjaCB0aGUgZ2l2ZW4gbGFwc2UgaGFzIGVsYXBzZWRcclxuICAgICAqIEBwYXJhbSBfYXJndW1lbnRzIEFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIGNhbGxiYWNrIGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRUaW1lcihfbGFwc2U6IG51bWJlciwgX2NvdW50OiBudW1iZXIsIF9oYW5kbGVyOiBUaW1lckhhbmRsZXIsIC4uLl9hcmd1bWVudHM6IE9iamVjdFtdKTogbnVtYmVyIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bnVzZWQtZXhwcmVzc2lvblxyXG4gICAgICBuZXcgVGltZXIodGhpcywgX2xhcHNlLCBfY291bnQsIF9oYW5kbGVyLCBfYXJndW1lbnRzKTtcclxuICAgICAgLy90aGlzLmFkZFRpbWVyKHRpbWVyKTtcclxuICAgICAgcmV0dXJuIHRoaXMuaWRUaW1lckFkZGVkTGFzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbnRlcm5hbGx5IGJ5IHtAbGluayBUaW1lfSBhbmQge0BsaW5rIFRpbWVyfSBhbmQgbXVzdCBub3QgYmUgY2FsbGVkIG90aGVyd2lzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkVGltZXIoX3RpbWVyOiBUaW1lcik6IG51bWJlciB7XHJcbiAgICAgIHRoaXMudGltZXJzWysrdGhpcy5pZFRpbWVyQWRkZWRMYXN0XSA9IF90aW1lcjtcclxuICAgICAgcmV0dXJuIHRoaXMuaWRUaW1lckFkZGVkTGFzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZXMgdGhlIHRpbWVyIHdpdGggdGhlIGlkIGdpdmVuIGJ5IHRoaXMgdGltZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZVRpbWVyKF9pZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGxldCB0aW1lcjogVGltZXIgPSB0aGlzLnRpbWVyc1tfaWRdO1xyXG4gICAgICBpZiAoIXRpbWVyKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgdGltZXIuY2xlYXIoKTtcclxuICAgICAgZGVsZXRlIHRoaXMudGltZXJzW19pZF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB0aW1lciB3aXRoIHRoZSBnaXZlbiBpZCBvciBudWxsIGlmIG5vdCBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFRpbWVyKF9pZDogbnVtYmVyKTogVGltZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy50aW1lcnNbX2lkXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0IG9mIHRpbWVycyBjdXJyZW50bHkgaW5zdGFsbGVkIG9uIHRoaXMgdGltZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFRpbWVycygpOiBUaW1lcnMge1xyXG4gICAgICBsZXQgcmVzdWx0OiBUaW1lcnMgPSB7fTtcclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB0aGlzLnRpbWVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIHtAbGluayBUaW1lcnN9IGluc3RhbGxlZCB0byB0aGlzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYXNUaW1lcnMoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiAoT2JqZWN0LmtleXModGhpcy50aW1lcnMpLmxlbmd0aCA+IDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjcmVhdGVzIHtAbGluayBUaW1lcn1zIHdoZW4gc2NhbGluZyBjaGFuZ2VzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVzY2FsZUFsbFRpbWVycygpOiB2b2lkIHtcclxuICAgICAgZm9yIChsZXQgaWQgaW4gdGhpcy50aW1lcnMpIHtcclxuICAgICAgICBsZXQgdGltZXI6IFRpbWVyID0gdGhpcy50aW1lcnNbaWRdO1xyXG4gICAgICAgIHRpbWVyLmNsZWFyKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudGltZXJzW2lkXTtcclxuICAgICAgICBpZiAoIXRoaXMuc2NhbGUpXHJcbiAgICAgICAgICAvLyBUaW1lIGhhcyBzdG9wcGVkLCBubyBuZWVkIHRvIHJlcGxhY2UgY2xlYXJlZCB0aW1lcnNcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvKiB0aGlzLnRpbWVyc1tpZF0gPSAgKi9cclxuICAgICAgICB0aW1lciA9IHRpbWVyLmluc3RhbGxDb3B5KCk7IC8vIHRoZSB0aW1lciBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoaXMgdGltZSBpbnN0YW5jZVxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbWVyc1t0aGlzLmlkVGltZXJBZGRlZExhc3RdOyAvLyByZW1vdmUgdGhlIGNvcHkgYWdhaW4gLi4uXHJcbiAgICAgICAgdGhpcy50aW1lcnNbaWRdID0gdGltZXI7IC8vIC4uLiBhbmQgcGxhY2UgaXQgYXQgdGhlIGlkIG9mIHRoZSBvcmlnaW5hbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59IiwibmFtZXNwYWNlIEZ1ZGdlQ29yZSB7XHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyB0aGUgc2lnbmF0dXJlIG9mIGhhbmRsZXIgZnVuY3Rpb25zIGZvciB7QGxpbmsgRXZlbnRUaW1lcn1zLCB2ZXJ5IHNpbWlsYXIgdG8gdXN1YWwgZXZlbnQgaGFuZGxlclxyXG4gICAqL1xyXG4gIGV4cG9ydCB0eXBlIFRpbWVySGFuZGxlciA9IChfZXZlbnQ6IEV2ZW50VGltZXIpID0+IHZvaWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEge0BsaW5rIFRpbWVyfS1pbnN0YW5jZSBpbnRlcm5hbGx5IHVzZXMgd2luZG93LnNldEludGVydmFsIHRvIGNhbGwgYSBnaXZlbiBoYW5kbGVyIHdpdGggYSBnaXZlbiBmcmVxdWVuY3kgYSBnaXZlbiBudW1iZXIgb2YgdGltZXMsXHJcbiAgICogcGFzc2luZyBhbiB7QGxpbmsgRXZlbnRUaW1lcn0taW5zdGFuY2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFuZCBnaXZlbiBhcmd1bWVudHMuIFxyXG4gICAqIFRoZSBmcmVxdWVuY3kgc2NhbGVzIHdpdGggdGhlIHtAbGluayBUaW1lfS1pbnN0YW5jZSB0aGUge0BsaW5rIFRpbWVyfS1pbnN0YW5jZSBpcyBhdHRhY2hlZCB0by5cclxuICAgKiBcclxuICAgKiBAYXV0aG9yIEppcmthIERlbGwnT3JvLUZyaWVkbCwgSEZVLCAyMDE5XHJcbiAgICovXHJcbiAgZXhwb3J0IGNsYXNzIFRpbWVyIHtcclxuICAgIHB1YmxpYyBhY3RpdmU6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgY291bnQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgaGFuZGxlcjogVGltZXJIYW5kbGVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lOiBUaW1lO1xyXG4gICAgcHJpdmF0ZSBlbGFwc2U6IG51bWJlcjtcclxuICAgIHByaXZhdGUgZXZlbnQ6IEV2ZW50VGltZXI7XHJcbiAgICBwcml2YXRlIHRpbWVvdXRSZWFsOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGlkV2luZG93OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRpbWVyfSBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSBfdGltZSBUaGUge0BsaW5rIFRpbWV9IGluc3RhbmNlLCB0aGUgdGltZXIgYXR0YWNoZXMgdG9cclxuICAgICAqIEBwYXJhbSBfZWxhcHNlIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBlbGFwc2UsIHRvIHRoZSBuZXh0IGNhbGwgb2YgX2hhbmRsZXIsIG1lYXN1cmVkIGluIF90aW1lXHJcbiAgICAgKiBAcGFyYW0gX2NvdW50IFRoZSBkZXNpcmVkIG51bWJlciBvZiBjYWxscyB0byBfaGFuZGxlciwgVGltZXIgZGVpbnN0YWxscyBhdXRvbWF0aWNhbGx5IGFmdGVyIGxhc3QgY2FsbC4gUGFzc2luZyAwIGludm9rZXMgaW5maW5pdGUgY2FsbHNcclxuICAgICAqIEBwYXJhbSBfaGFuZGxlciBUaGUge0BsaW5rIFRpbWVySGFuZGxlcn0gaW5zdGFuY2UgdG8gY2FsbFxyXG4gICAgICogQHBhcmFtIF9hcmd1bWVudHMgQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBfaGFuZGxlclxyXG4gICAgICogXHJcbiAgICAgKiBUT0RPOiBmb3IgcHJvcGVyIGhhbmRsaW5nIGFuZCBkZWxldGlvbiwgdXNlIFRpbWUuc2V0VGltZXIgaW5zdGVhZCBvZiBpbnN0YW50aWF0aW5nIHRpbWVycyB5b3Vyc2VsZi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKF90aW1lOiBUaW1lLCBfZWxhcHNlOiBudW1iZXIsIF9jb3VudDogbnVtYmVyLCBfaGFuZGxlcjogVGltZXJIYW5kbGVyLCAuLi5fYXJndW1lbnRzOiBPYmplY3RbXSkge1xyXG4gICAgICB0aGlzLnRpbWUgPSBfdGltZTtcclxuICAgICAgdGhpcy5lbGFwc2UgPSBfZWxhcHNlO1xyXG4gICAgICB0aGlzLmV2ZW50ID0gbmV3IEV2ZW50VGltZXIodGhpcywgX2FyZ3VtZW50cyk7XHJcbiAgICAgIHRoaXMuaGFuZGxlciA9IF9oYW5kbGVyO1xyXG4gICAgICB0aGlzLmNvdW50ID0gX2NvdW50O1xyXG5cclxuICAgICAgbGV0IHNjYWxlOiBudW1iZXIgPSBNYXRoLmFicyhfdGltZS5nZXRTY2FsZSgpKTtcclxuXHJcbiAgICAgIGlmICghc2NhbGUpIHtcclxuICAgICAgICAvLyBUaW1lIGlzIHN0b3BwZWQsIHRpbWVyIHdvbid0IGJlIGFjdGl2ZVxyXG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnRpbWVvdXRSZWFsID0gdGhpcy5lbGFwc2UgLyBzY2FsZTtcclxuXHJcbiAgICAgIGxldCBjYWxsYmFjazogRnVuY3Rpb24gPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudC5jb3VudCA9IHRoaXMuY291bnQ7XHJcbiAgICAgICAgdGhpcy5ldmVudC5sYXN0Q2FsbCA9ICh0aGlzLmNvdW50ID09IDEpO1xyXG4gICAgICAgIF9oYW5kbGVyKHRoaXMuZXZlbnQpO1xyXG4gICAgICAgIHRoaXMuZXZlbnQuZmlyc3RDYWxsID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvdW50ID4gMClcclxuICAgICAgICAgIGlmICgtLXRoaXMuY291bnQgPT0gMClcclxuICAgICAgICAgICAgX3RpbWUuZGVsZXRlVGltZXJCeUl0c0ludGVybmFsSWQodGhpcy5pZFdpbmRvdyk7XHJcblxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5pZFdpbmRvdyA9IHdpbmRvdy5zZXRJbnRlcnZhbChjYWxsYmFjaywgdGhpcy50aW1lb3V0UmVhbCwgX2FyZ3VtZW50cyk7XHJcbiAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgX3RpbWUuYWRkVGltZXIodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB3aW5kb3ctaWQgb2YgdGhlIHRpbWVyLCB3aGljaCB3YXMgcmV0dXJuZWQgYnkgc2V0SW50ZXJ2YWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5pZFdpbmRvdztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRpbWUtaW50ZXJ2YWxsIGZvciBjYWxscyB0byB0aGUgaGFuZGxlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGxhcHNlKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLmVsYXBzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGFjaGVzIGEgY29weSBvZiB0aGlzIGF0IGl0cyBjdXJyZW50IHN0YXRlIHRvIHRoZSBzYW1lIHtAbGluayBUaW1lfS1pbnN0YW5jZS4gVXNlZCBpbnRlcm5hbGx5IHdoZW4gcmVzY2FsaW5nIHtAbGluayBUaW1lfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5zdGFsbENvcHkoKTogVGltZXIge1xyXG4gICAgICByZXR1cm4gbmV3IFRpbWVyKHRoaXMudGltZSwgdGhpcy5lbGFwc2UsIHRoaXMuY291bnQsIHRoaXMuaGFuZGxlciwgdGhpcy5ldmVudC5hcmd1bWVudHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSB0aW1lciwgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgaW50ZXJ2YWwtdGltZXJzIGhhbmRsZWQgYnkgd2luZG93XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgLy8gaWYgKHRoaXMudHlwZSA9PSBUSU1FUl9UWVBFLlRJTUVPVVQpIHtcclxuICAgICAgLy8gICAgIGlmICh0aGlzLmFjdGl2ZSlcclxuICAgICAgLy8gICAgICAgICAvLyBzYXZlIHJlbWFpbmluZyB0aW1lIHRvIHRpbWVvdXQgYXMgbmV3IHRpbWVvdXQgZm9yIHJlc3RhcnRcclxuICAgICAgLy8gICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aGlzLnRpbWVvdXQgKiAoMSAtIChwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lUmVhbCkgLyB0aGlzLnRpbWVvdXRSZWFsKTtcclxuICAgICAgLy8gICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5pZCk7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gZWxzZVxyXG4gICAgICAvLyBUT0RPOiByZXVzaW5nIHRpbWVyIHN0YXJ0cyBpbnRlcnZhbCBhbmV3LiBTaG91bGQgYmUgcmVtYWluaW5nIGludGVydmFsIGFzIHRpbWVvdXQsIHRoZW4gc3RhcnRpbmcgaW50ZXJ2YWwgYW5ldyBcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5pZFdpbmRvdyk7XHJcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/Source/Core/Component/ComponentMaterial.ts b/Source/Core/Component/ComponentMaterial.ts index 0b7d4d5..db8b645 100644 --- a/Source/Core/Component/ComponentMaterial.ts +++ b/Source/Core/Component/ComponentMaterial.ts @@ -19,13 +19,6 @@ namespace FudgeCore { // this.mutatorCoat = _material.getCoat().getMutatorForComponent(); } - /** - * Returns true if the material has any areas (color or texture) with alpha < 1. - * ⚠️ CAUTION: Computionally expensive for textured materials, see {@link Texture.hasTransparency} - */ - public get hasTransparency(): boolean { - return this.material?.hasTransparency || this.clrPrimary.a < 1; - } //#region Transfer public serialize(): Serialization { diff --git a/Source/Core/Material/Material.ts b/Source/Core/Material/Material.ts index 4992bd5..ecbb92b 100644 --- a/Source/Core/Material/Material.ts +++ b/Source/Core/Material/Material.ts @@ -49,15 +49,6 @@ namespace FudgeCore { this.#coat = _coat; } - /** - * Returns true if the material has any areas (color or texture) with alpha < 1. - * ⚠️ CAUTION: Computionally expensive for textured materials, see {@link Texture.hasTransparency} - */ - public get hasTransparency(): boolean { - let coat: CoatTextured = this.coat; - return coat.color?.a < 1 || coat.texture?.hasTransparency; - } - /** * Creates a new {@link Coat} instance that is valid for the {@link Shader} referenced by this material */ diff --git a/Source/Core/Texture/Texture.ts b/Source/Core/Texture/Texture.ts index a05044c..f57982c 100644 --- a/Source/Core/Texture/Texture.ts +++ b/Source/Core/Texture/Texture.ts @@ -34,8 +34,6 @@ namespace FudgeCore { #mipmap: MIPMAP = MIPMAP.CRISP; #wrap: WRAP = WRAP.REPEAT; - #hasTransparency: boolean; - public constructor(_name: string = "Texture") { super(); this.name = _name; @@ -59,38 +57,6 @@ namespace FudgeCore { return this.#wrap; } - /** - * Returns true if the texture has any texels with alpha < 1. - * ⚠️ CAUTION: Has to be recomputed whenever the texture/image data changes. - */ - public get hasTransparency(): boolean { // Only tested for texImageSource of type HTMLImageElement and HTMLCanvasElement - if (this.#hasTransparency != null) - return this.#hasTransparency; - - let imageData: ImageData; - - if (this.texImageSource instanceof ImageData) { - imageData = this.texImageSource; - } else { - const canvas: HTMLCanvasElement = document.createElement('canvas'); - canvas.width = this.texImageSource.width; - canvas.height = this.texImageSource.height; - const crc2: CanvasRenderingContext2D = canvas.getContext('2d'); - crc2.drawImage(this.texImageSource, 0, 0); - imageData = crc2.getImageData(0, 0, this.texImageSource.width, this.texImageSource.height); - } - - for (let i: number = 0; i < imageData.data.length; i += 4) - if (imageData.data[i + 3] < 255) - return this.#hasTransparency = true; - - return this.#hasTransparency = false; - } - - protected set hasTransparency(_hasTransparency: boolean) { - this.#hasTransparency = _hasTransparency; - } - /** * Returns the image source of this texture. */ @@ -198,7 +164,6 @@ namespace FudgeCore { return new Promise((_resolve, _reject) => { this.image.addEventListener("load", () => { this.renderData = null; // refresh render data on next draw call - this.hasTransparency = null; // reset transparency check _resolve(); }); this.image.addEventListener("error", () => _reject());