schema-shield 0.0.5 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +194 -66
- package/dist/formats.d.ts.map +1 -1
- package/dist/index.d.ts +13 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +705 -348
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +705 -348
- package/dist/keywords/array-keywords.d.ts.map +1 -1
- package/dist/keywords/object-keywords.d.ts.map +1 -1
- package/dist/keywords/other-keywords.d.ts.map +1 -1
- package/dist/keywords/string-keywords.d.ts.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +6 -5
- package/dist/utils.d.ts.map +1 -1
- package/lib/formats.ts +125 -130
- package/lib/index.ts +247 -96
- package/lib/keywords/array-keywords.ts +60 -46
- package/lib/keywords/object-keywords.ts +155 -53
- package/lib/keywords/other-keywords.ts +68 -28
- package/lib/keywords/string-keywords.ts +32 -6
- package/lib/types.ts +1 -13
- package/lib/utils.ts +202 -44
- package/package.json +2 -2
- package/tsconfig.json +4 -4
package/dist/index.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{var e=class extends Error{message;item;keyword;cause;schemaPath="";instancePath="";data;schema;_getCause(t="#",i="#"){let r=`${t}/${this.keyword}`,a=`${i}`;return void 0!==this.item&&("string"==typeof this.item&&this.item in this.schema&&(r+=`/${this.item}`),a+=`/${this.item}`),this.instancePath=a,this.schemaPath=r,this.cause&&this.cause instanceof e?this.cause._getCause(r,a):this}getCause(){return this._getCause()}_getTree(){const e={message:this.message,keyword:this.keyword,item:this.item,schemaPath:this.schemaPath,instancePath:this.instancePath,data:this.data};return this.cause&&(e.cause=this.cause._getTree()),e}getTree(){return this.getCause(),this._getTree()}getPath(){const e=this.getCause();return{schemaPath:e.schemaPath,instancePath:e.instancePath}}};function t(t,i){const r=new e(`Invalid ${t}`);r.keyword=t,r.schema=i;return s(`defineError_${t}`,(e,t={})=>(r.message=e,r.item=t.item,r.cause=t.cause,r.data=t.data,r))}function i(e,t){if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!i(e[r],t[r]))return!1;return!0}if("object"==typeof e&&"object"==typeof t){if(null===e||null===t)return e===t;const r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(const a of r)if(!i(e[a],t[a]))return!1;return!0}return e===t}function r(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function a(e){if(Array.isArray(e)){const t=[];for(let i=0;i<e.length;i++)t[i]=a(e[i]);return t}if(e&&e.constructor&&"Object"!==e.constructor.name)return e;if(r(e)){const t={...e};for(const i in e)t[i]=a(e[i]);return t}return e}function n(e){return r(e)&&"$validate"in e}function s(e,t){return Object.defineProperty(t,"name",{value:e})}var o={"date-time"(e){const t=e.match(/^(\d{4})-(0[0-9]|1[0-2])-(\d{2})T(0[0-9]|1\d|2[0-3]):([0-5]\d):((?:[0-5]\d|60))(?:.\d+)?(?:([+-])(0[0-9]|1\d|2[0-3]):([0-5]\d)|Z)?$/i);if(!t)return!1;let i=Number(t[3]);if("02"===t[2]&&i>29)return!1;const[,r,a,,n,s,o,l,u,f]=t;let d=Number(r),m=Number(a),c=Number(n),p=Number(s),y=Number(o);if("-"===l||"+"===l){const e=Number(u),t=Number(f);if("-"===l?(c+=e,p+=t):"+"===l&&(c-=e,p-=t),p>59?(c+=1,p-=60):p<0&&(c-=1,p+=60),c>23?(i+=1,c-=24):c<0&&(i-=1,c+=24),i>31?(m+=1,i-=31):i<1&&(m-=1,i+=31),m>12?(d+=1,m-=12):m<1&&(d-=1,m+=12),d<0)return!1}return!(i>(2===m?d%4!=0||d%100==0&&d%400!=0?28:29:[31,,31,30,31,30,31,31,30,31,30,31][m-1]))&&(60!==y||59===p&&23===c)},uri:e=>/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/.test(e),email:e=>/^(?!\.)(?!.*\.$)[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,20}(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,21}){0,2}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,60}[a-z0-9])?){0,3}$/i.test(e),ipv4:e=>/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/.test(e),ipv6(e){if("::"===e)return!0;if(-1===e.indexOf(":")||/(?:\s+|:::+|^\w{5,}|\w{5}$|^:{1}\w|\w:{1}$)/.test(e))return!1;const t=-1!==e.indexOf(".");let i=e;if(t){i=e.split(":");const t=i.pop();if(!/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/.test(t))return!1}const r=-1!==e.indexOf("::"),a=t?i.join(":"):e;if(r)return!(a.split("::").length-1>1)&&(!!/^[0-9a-fA-F:.]*$/.test(a)&&/^(?:(?:(?:[0-9a-fA-F]{1,4}(?::|$)){1,6}))|(?:::(?:[0-9a-fA-F]{1,4})){0,5}$/.test(a));const n=/^(?:(?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:))$/.test(a),s=/(?:[0-9a-fA-F]{5,}|\D[0-9a-fA-F]{3}:)/.test(a);return t?n||!s:n&&!s},hostname:e=>/^[a-z0-9][a-z0-9-]{0,62}(?:\.[a-z0-9][a-z0-9-]{0,62})*[a-z0-9]$/i.test(e),date:e=>!1!==/^(\d{4})-(\d{2})-(\d{2})$/.test(e)&&!isNaN(new Date(e).getTime()),regex(e){try{return new RegExp(e),!0}catch(e){return!1}},"json-pointer":e=>""===e||/^\/(?:[^~]|~0|~1)*$/.test(e),"relative-json-pointer":e=>""===e||/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/.test(e),time:e=>/^(\d{2}):(\d{2}):(\d{2})(\.\d+)?(Z|([+-])(\d{2}):(\d{2}))$/.test(e),"uri-reference":e=>!/\\/.test(e)&&/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i.test(e),"uri-template":e=>/^(?:(?:https?:\/\/[\w.-]+)?\/?)?[\w- ;,.\/?%&=]*(?:\{[\w-]+(?::\d+)?\}[\w- ;,.\/?%&=]*)*\/?$/.test(e),duration:!1,uuid:!1,"idn-email":!1,"idn-hostname":!1,iri:!1,"iri-reference":!1},l={object:e=>r(e),array:e=>!!Array.isArray(e)||"object"==typeof e&&null!==e&&"length"in e&&"0"in e&&Object.keys(e).length-1===e.length,string:e=>"string"==typeof e,number:e=>"number"==typeof e,integer:e=>"number"==typeof e&&e%1==0,boolean:e=>"boolean"==typeof e,null:e=>null===e,timestamp:!1,int8:!1,unit8:!1,int16:!1,unit16:!1,int32:!1,unit32:!1,float32:!1,float64:!1},u={...{required(e,t,i){if(r(t))for(let r=0;r<e.required.length;r++){const a=e.required[r];if(!t.hasOwnProperty(a))return i("Required property is missing",{item:a,data:t[a]})}},properties(e,t,i){if(r(t))for(const a of Object.keys(e.properties))if(t.hasOwnProperty(a)){if("boolean"!=typeof e.properties[a]){if("$validate"in e.properties[a]){const r=e.properties[a].$validate(t[a]);if(r)return i("Property is invalid",{item:a,cause:r,data:t[a]})}}else if(!1===e.properties[a])return i("Property is not allowed",{item:a,data:t[a]})}else{const i=e.properties[a];r(i)&&"default"in i&&(t[a]=i.default)}},values(e,t,i){if(!r(t)||!n(e.values))return;const a=Object.keys(t);for(const r of a){const a=e.values.$validate(t[r]);if(a)return i("Property is invalid",{item:r,cause:a,data:t[r]})}},maxProperties(e,t,i){if(r(t)&&!(Object.keys(t).length<=e.maxProperties))return i("Too many properties",{data:t})},minProperties(e,t,i){if(r(t)&&!(Object.keys(t).length>=e.minProperties))return i("Too few properties",{data:t})},additionalProperties(e,t,i){if(!r(t))return;const a=Object.keys(t),s=n(e.additionalProperties);for(const r of a)if(!e.properties||!e.properties.hasOwnProperty(r)){if(e.patternProperties){let t=!1;for(const i in e.patternProperties)if(new RegExp(i,"u").test(r)){t=!0;break}if(t)continue}if(!1===e.additionalProperties)return i("Additional properties are not allowed",{item:r,data:t[r]});if(s){const a=e.additionalProperties.$validate(t[r]);if(a)return i("Additional properties are invalid",{item:r,cause:a,data:t[r]})}}},patternProperties(e,t,i){if(!r(t))return;const a=Object.keys(e.patternProperties);for(const r of a){const a=new RegExp(r,"u");if("boolean"==typeof e.patternProperties[r]){if(!1===e.patternProperties[r])for(const e in t)if(a.test(e))return i("Property is not allowed",{item:e,data:t[e]});continue}const n=Object.keys(t);for(const s of n)if(a.test(s)&&"$validate"in e.patternProperties[r]){const a=e.patternProperties[r].$validate(t[s]);if(a)return i("Property is invalid",{item:s,cause:a,data:t[s]})}}},propertyNames(e,t,i){if(r(t)){if("boolean"==typeof e.propertyNames&&!1===e.propertyNames&&Object.keys(t).length>0)return i("Properties are not allowed",{data:t});if(n(e.propertyNames))for(let r in t){const a=e.propertyNames.$validate(r);if(a)return i("Property name is invalid",{item:r,cause:a,data:t[r]})}}},dependencies(e,t,i){if(r(t))for(const r in e.dependencies){if(r in t==!1)continue;const a=e.dependencies[r];if(Array.isArray(a)){for(let e=0;e<a.length;e++)if(!(a[e]in t))return i("Dependency is not satisfied",{item:e,data:a[e]});continue}if("boolean"==typeof a){if(a)continue;return i("Dependency is not satisfied",{data:a})}if("string"==typeof a){if(a in t)continue;return i("Dependency is not satisfied",{data:a})}const n=a.$validate(t);if(n)return i("Dependency is not satisfied",{cause:n,data:t})}},then:!1,else:!1,default:!1,$ref:!1,definitions:!1,$id:!1,$schema:!1,title:!1,description:!1,$comment:!1,examples:!1,contentMediaType:!1,contentEncoding:!1,discriminator:!1,nullable:!1},...{items(e,t,i){if(!Array.isArray(t))return;const r=e.items,a=t.length;if("boolean"==typeof r)return!1===r&&a>0?i("Array items are not allowed",{data:t}):void 0;if(Array.isArray(r)){const e=r.length,s=Math.min(e,a);for(let e=0;e<s;e++){const a=r[e];if("boolean"!=typeof a){if(n(a)){const r=a.$validate(t[e]);if(r)return i("Array item is invalid",{item:e,cause:r,data:t[e]})}}else if(!1===a&&void 0!==t[e])return i("Array item is not allowed",{item:e,data:t[e]})}}else if(n(r))for(let e=0;e<a;e++){const a=r.$validate(t[e]);if(a)return i("Array item is invalid",{item:e,cause:a,data:t[e]})}},elements(e,t,i){if(Array.isArray(t)&&n(e.elements))for(let r=0;r<t.length;r++){const a=e.elements.$validate(t[r]);if(a)return i("Array item is invalid",{item:r,cause:a,data:t[r]})}},minItems(e,t,i){if(Array.isArray(t)&&!(t.length>=e.minItems))return i("Array is too short",{data:t})},maxItems(e,t,i){if(Array.isArray(t)&&!(t.length<=e.maxItems))return i("Array is too long",{data:t})},additionalItems(e,t,i){if(e.items&&!r(e.items)){if(!1===e.additionalItems)return t.length>e.items.length?i("Array is too long",{data:t}):void 0;if(r(e.additionalItems)){if(n(e.additionalItems)){for(let r=e.items.length;r<t.length;r++){const a=e.additionalItems.$validate(t[r]);if(a)return i("Array item is invalid",{item:r,cause:a,data:t[r]})}return}}else;}},uniqueItems(e,t,i){if(!Array.isArray(t)||!e.uniqueItems)return;const a=new Set;for(const e of t){let t;if(t="string"==typeof e?`s:${e}`:r(e)?`o:${JSON.stringify(Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t))))}`:Array.isArray(e)?JSON.stringify(e):String(e),a.has(t))return i("Array items are not unique",{data:e});a.add(t)}},contains(e,t,i){if(Array.isArray(t)){if("boolean"==typeof e.contains)return e.contains?0===t.length?i("Array must contain at least one item",{data:t}):void 0:i("Array must not contain any items",{data:t});for(let i=0;i<t.length;i++){if(!e.contains.$validate(t[i]))return}return i("Array must contain at least one item",{data:t})}}},...{minLength(e,t,i){if(!("string"!=typeof t||t.length>=e.minLength))return i("Value is shorter than the minimum length",{data:t})},maxLength(e,t,i){if(!("string"!=typeof t||t.length<=e.maxLength))return i("Value is longer than the maximum length",{data:t})},pattern(e,t,i){if("string"!=typeof t)return;const r=new RegExp(e.pattern,"u");return r instanceof RegExp==!1?i("Invalid regular expression",{data:t}):r.test(t)?void 0:i("Value does not match the pattern",{data:t})},format(e,t,i,r){if("string"!=typeof t)return;const a=r.getFormat(e.format);return a&&!a(t)?i("Value does not match the format",{data:t}):void 0}},...{minimum(e,t,i,r){if("number"!=typeof t)return;let a=e.minimum;return"number"==typeof e.exclusiveMinimum?a=e.exclusiveMinimum+1e-15:!0===e.exclusiveMinimum&&(a+=1e-15),t<a?i("Value is less than the minimum",{data:t}):void 0},maximum(e,t,i,r){if("number"!=typeof t)return;let a=e.maximum;return"number"==typeof e.exclusiveMaximum?a=e.exclusiveMaximum-1e-15:!0===e.exclusiveMaximum&&(a-=1e-15),t>a?i("Value is greater than the maximum",{data:t}):void 0},multipleOf(e,t,i,r){if("number"!=typeof t)return;const a=t/e.multipleOf;return isFinite(a)?function(e,t,i=1e-15){return Math.abs(e-t)<=i*Math.max(Math.abs(e),Math.abs(t))}(a,Math.round(a))?void 0:i("Value is not a multiple of the multipleOf",{data:t}):void 0},exclusiveMinimum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMinimum&&!("minimum"in e))return t<=e.exclusiveMinimum+1e-15?i("Value is less than or equal to the exclusiveMinimum"):void 0},exclusiveMaximum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMaximum&&!("maximum"in e))return t>=e.exclusiveMaximum?i("Value is greater than or equal to the exclusiveMaximum",{data:t}):void 0}},...{enum(e,t,r){const a=Array.isArray(t),n="object"==typeof t&&null!==t;for(let r=0;r<e.enum.length;r++){const s=e.enum[r];if(s===t)return;if((a&&Array.isArray(s)||n&&"object"==typeof s&&null!==s)&&i(s,t))return}return r("Value is not one of the allowed values",{data:t})},allOf(e,t,i){for(let a=0;a<e.allOf.length;a++)if(r(e.allOf[a])){if("$validate"in e.allOf[a]){const r=e.allOf[a].$validate(t);if(r)return i("Value is not valid",{cause:r,data:t})}}else if("boolean"!=typeof e.allOf[a]){if(t!==e.allOf[a])return i("Value is not valid",{data:t})}else if(Boolean(t)!==e.allOf[a])return i("Value is not valid",{data:t})},anyOf(e,t,i){for(let i=0;i<e.anyOf.length;i++){if(r(e.anyOf[i])){if("$validate"in e.anyOf[i]){if(!e.anyOf[i].$validate(t))return;continue}return}if("boolean"==typeof e.anyOf[i]&&Boolean(t)===e.anyOf[i])return;if(t===e.anyOf[i])return}return i("Value is not valid",{data:t})},oneOf(e,t,i){let a=0;for(let i=0;i<e.oneOf.length;i++)if(r(e.oneOf[i])){if("$validate"in e.oneOf[i]){e.oneOf[i].$validate(t)||a++;continue}a++}else"boolean"!=typeof e.oneOf[i]?t===e.oneOf[i]&&a++:Boolean(t)===e.oneOf[i]&&a++;if(1!==a)return i("Value is not valid",{data:t})},const(e,t,a){if(!(t===e.const||r(t)&&r(e.const)&&i(t,e.const)||Array.isArray(t)&&Array.isArray(e.const)&&i(t,e.const)))return a("Value is not valid",{data:t})},if(e,t,i){if("then"in e==!1&&"else"in e==!1)return;if("boolean"==typeof e.if){if(e.if){if(n(e.then))return e.then.$validate(t)}else if(n(e.else))return e.else.$validate(t);return}if(!n(e.if))return;return e.if.$validate(t)?n(e.else)?e.else.$validate(t):void 0:n(e.then)?e.then.$validate(t):void 0},not(e,t,i){if("boolean"==typeof e.not)return e.not?i("Value is not valid",{data:t}):void 0;if(r(e.not)){if("$validate"in e.not){const r=e.not.$validate(t);return r?void 0:i("Value is not valid",{cause:r,data:t})}return i("Value is not valid",{data:t})}return i("Value is not valid",{data:t})}}},f={SchemaShield:class{types={};formats={};keywords={};immutable=!1;constructor({immutable:e=!1}={}){this.immutable=e;for(const[e,t]of Object.entries(l))t&&this.addType(e,t);for(const[e,t]of Object.entries(u))this.addKeyword(e,t);for(const[e,t]of Object.entries(o))t&&this.addFormat(e,t)}addType(t,i,r=!1){if(this.types[t]&&!r)throw new e(`Type "${t}" already exists`);this.types[t]=i}getType(e){return this.types[e]}addFormat(t,i,r=!1){if(this.formats[t]&&!r)throw new e(`Format "${t}" already exists`);this.formats[t]=i}getFormat(e){return this.formats[e]}addKeyword(t,i,r=!1){if(this.keywords[t]&&!r)throw new e(`Keyword "${t}" already exists`);this.keywords[t]=i}getKeyword(e){return this.keywords[e]}compile(t){const i=this.compileSchema(t);if(!i.$validate){if(!1===this.isSchemaLike(t))throw new e("Invalid schema");i.$validate=s("any",()=>{})}const r=e=>{const t=this.immutable?a(e):e,r=i.$validate(t);return{data:t,error:r||null,valid:!r}};return r.compiledSchema=i,r}compileSchema(e){r(e)||(e=!0===e?{anyOf:[{}]}:!1===e?{oneOf:[]}:{oneOf:[e]});const i=a(e),n=t("type",e),o=[];let l="";if("type"in e){const t=Array.isArray(e.type)?e.type:e.type.split(",").map(e=>e.trim());for(const e of t){const t=this.getType(e);t&&(o.push(t),l+=(l?"_OR_":"")+t.name)}const r=o.length;if(0===r)throw n("Invalid type for schema",{data:e.type});if(1===r){const e=o[0];i.$validate=s(l,t=>{if(!e(t))return n("Invalid type",{data:t})})}else r>1&&(i.$validate=s(l,e=>{for(let t=0;t<r;t++)if(o[t](e))return;return n("Invalid type",{data:e})}))}for(const a of Object.keys(e)){if("type"===a){i.type=e.type;continue}const n=this.getKeyword(a);if(n){const r=t(a,e[a]);if(i.$validate){const e=i.$validate;l+=`_AND_${n.name}`,i.$validate=s(l,t=>{const a=e(t);return a||n(i,t,r,this)})}else l=n.name,i.$validate=s(l,e=>n(i,e,r,this))}if(r(e[a])){if("properties"===a){for(const t of Object.keys(e[a]))i[a][t]=this.compileSchema(e[a][t]);continue}i[a]=this.compileSchema(e[a])}else Array.isArray(e[a])?i[a]=e[a].map((e,t)=>this.isSchemaLike(e)?this.compileSchema(e):e):i[a]=e[a]}return i}isSchemaLike(e){if(r(e)){if("type"in e)return!0;for(let t in e)if(t in this.keywords)return!0}return!1}}};"undefined"!=typeof module?module.exports=f:self.SchemaShield=f})();//# sourceMappingURL=index.min.js.map
|
|
1
|
+
(()=>{var e=class extends Error{message;item;keyword;cause;schemaPath="";instancePath="";data;schema;_getCause(t="#",i="#"){let r=`${t}/${this.keyword}`,n=`${i}`;return void 0!==this.item&&("string"==typeof this.item&&this.item in this.schema&&(r+=`/${this.item}`),n+=`/${this.item}`),this.instancePath=n,this.schemaPath=r,this.cause&&this.cause instanceof e?this.cause._getCause(r,n):this}getCause(){return this._getCause()}_getTree(){const e={message:this.message,keyword:this.keyword,item:this.item,schemaPath:this.schemaPath,instancePath:this.instancePath,data:this.data};return this.cause&&(e.cause=this.cause._getTree()),e}getTree(){return this.getCause(),this._getTree()}getPath(){const e=this.getCause();return{schemaPath:e.schemaPath,instancePath:e.instancePath}}},t=()=>!0;function i(i,r,n){if(n)return t;const a=new e(`Invalid ${i}`);a.keyword=i,a.schema=r;return o(`defineError_${i}`,(e,t={})=>(a.message=e,a.item=t.item,a.cause=t.cause&&!0!==t.cause?t.cause:void 0,a.data=t.data,a))}function r(e,t){if(Array.isArray(e)){if(!1===Array.isArray(t))return!0;if(e.length!==t.length)return!0;for(let i=0;i<t.length;i++)if(r(e[i],t[i]))return!0;return!1}if("object"==typeof e&&null!==e){if("object"!=typeof t||null===t)return!0;for(const i in t)if(r(e[i],t[i]))return!0;for(const i in e)if(r(e[i],t[i]))return!0;return!1}return!1===Object.is(e,t)}function n(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function a(e,t=!1,i=new WeakMap){if(null==e||"object"!=typeof e)return e;if(i.has(e))return i.get(e);let r;if("function"==typeof structuredClone)return r=structuredClone(e),i.set(e,r),r;switch(!0){case Array.isArray(e):r=[],i.set(e,r);for(let n=0,s=e.length;n<s;n++)r[n]=a(e[n],t,i);return r;case e instanceof Date:return r=new Date(e.getTime()),i.set(e,r),r;case e instanceof RegExp:return r=new RegExp(e.source,e.flags),i.set(e,r),r;case e instanceof Map:r=new Map,i.set(e,r);for(const[n,s]of e.entries())r.set(a(n,t,i),a(s,t,i));return r;case e instanceof Set:r=new Set,i.set(e,r);for(const n of e.values())r.add(a(n,t,i));return r;case e instanceof ArrayBuffer:return r=e.slice(0),i.set(e,r),r;case ArrayBuffer.isView(e):return r=new e.constructor(e.buffer.slice(0)),i.set(e,r),r;case"undefined"!=typeof Buffer&&e instanceof Buffer:return r=Buffer.from(e),i.set(e,r),r;case e instanceof Error:r=new e.constructor(e.message),i.set(e,r);break;case e instanceof Promise||e instanceof WeakMap||e instanceof WeakSet:return r=e,i.set(e,r),r;case e.constructor&&e.constructor!==Object:if(!t)return r=e,i.set(e,r),r;r=Object.create(Object.getPrototypeOf(e)),i.set(e,r);break;default:{r={},i.set(e,r);const n=Reflect.ownKeys(e);for(let s=0,o=n.length;s<o;s++){const o=n[s];r[o]=a(e[o],t,i)}return r}}const n=Object.getOwnPropertyDescriptors(e);for(const e of Reflect.ownKeys(n)){const s=n[e];"value"in s&&(s.value=a(s.value,t,i)),Object.defineProperty(r,e,s)}return r}function s(e){return n(e)&&"$validate"in e}function o(e,t){return Object.defineProperty(t,"name",{value:e})}var f=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,l=/^P(?!$)((\d+Y)?(\d+M)?(\d+W)?(\d+D)?)(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?$/,u=/^(\d{4})-(0[0-9]|1[0-2])-(\d{2})T(0[0-9]|1\d|2[0-3]):([0-5]\d):((?:[0-5]\d|60))(?:.\d+)?(?:([+-])(0[0-9]|1\d|2[0-3]):([0-5]\d)|Z)?$/i,d=/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/,c=/^(?!\.)(?!.*\.$)[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,20}(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,21}){0,2}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,60}[a-z0-9])?){0,3}$/i,m=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/,p=/(?:\s+|:::+|^\w{5,}|\w{5}$|^:{1}\w|\w:{1}$)/,h=/^[0-9a-fA-F:.]*$/,y=/^(?:(?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:))$/,v=/(?:[0-9a-fA-F]{5,}|\D[0-9a-fA-F]{3}:)/,g=/^(?:(?:(?:[0-9a-fA-F]{1,4}(?::|$)){1,6}))|(?:::(?:[0-9a-fA-F]{1,4})){0,5}$/,b=/^[a-z0-9][a-z0-9-]{0,62}(?:\.[a-z0-9][a-z0-9-]{0,62})*[a-z0-9]$/i,$=/^(\d{4})-(\d{2})-(\d{2})$/,A=/^\/(?:[^~]|~0|~1)*$/,O=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/,w=/^([01]\d|2[0-3]):([0-5]\d):([0-5]\d)(\.\d+)?(Z|([+-])([01]\d|2[0-3]):([0-5]\d))$/,x=/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i,P=/^(?:[^{}]|\{[^}]+\})*$/,j=/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/,_=/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i,k=/^[^@\s]+@[^@\s]+\.[^@\s]+$/,V=/^[^\s!@#$%^&*()_+\=\[\]{};':"\\|,<>\/?]+$/,R=/\\/,S=[31,28,31,30,31,30,31,31,30,31,30,31],M={"date-time"(e){const t=e.match(u);if(!t)return!1;const[,i,r,n,a,s,o]=t,f=Number(i),l=Number(r),d=Number(n),c=Number(a),m=Number(s),p=Number(o);if(l<1||l>12)return!1;if(d<1)return!1;const h=2===l?f%4!=0||f%100==0&&f%400!=0?28:29:S[l-1];return!(!h||d>h)&&(60!==p||59===m&&23===c)},uri:e=>d.test(e),email:e=>c.test(e),ipv4:e=>m.test(e),ipv6(e){if("::"===e)return!0;if(-1===e.indexOf(":")||p.test(e))return!1;const t=-1!==e.indexOf(".");let i=e;if(t){i=e.split(":");const t=i.pop();if(!m.test(t))return!1}const r=-1!==e.indexOf("::"),n=t?i.join(":"):e;if(r)return!(n.split("::").length-1>1)&&(!!h.test(n)&&g.test(n));const a=y.test(n),s=v.test(n);return t?a||!s:a&&!s},hostname:e=>b.test(e),date(e){const t=$.exec(e);if(!t)return!1;const[,i,r,n]=t,a=Number(i),s=Number(r),o=Number(n);if(s<1||s>12)return!1;if(o<1)return!1;const f=2===s?a%4!=0||a%100==0&&a%400!=0?28:29:S[s-1];return!!f&&o<=f},regex(e){try{return new RegExp(e),!0}catch(e){return!1}},"json-pointer":e=>""===e||A.test(e),"relative-json-pointer":e=>""===e||O.test(e),time:e=>w.test(e),"uri-reference":e=>!R.test(e)&&x.test(e),"uri-template":e=>P.test(e),duration:e=>l.test(e),uuid:e=>f.test(e),iri:e=>j.test(e),"iri-reference":e=>!R.test(e)&&_.test(e),"idn-email":e=>k.test(e),"idn-hostname":e=>V.test(e)},I={object:e=>n(e),array:e=>Array.isArray(e),string:e=>"string"==typeof e,number:e=>"number"==typeof e,integer:e=>"number"==typeof e&&e%1==0,boolean:e=>"boolean"==typeof e,null:e=>null===e,timestamp:!1,int8:!1,unit8:!1,int16:!1,unit16:!1,int32:!1,unit32:!1,float32:!1,float64:!1},F={...{required(e,t,i){if(n(t))for(let r=0;r<e.required.length;r++){const n=e.required[r];if(!t.hasOwnProperty(n))return i("Required property is missing",{item:n,data:t[n]})}},properties(e,t,i){if(!n(t))return;let r=e._propKeys;r||(r=Object.keys(e.properties||{}),Object.defineProperty(e,"_propKeys",{value:r,enumerable:!1,configurable:!1,writable:!1}));let s=e._requiredKeys;void 0===s&&(s=Array.isArray(e.required)?e.required:null,Object.defineProperty(e,"_requiredKeys",{value:s,enumerable:!1,configurable:!1,writable:!1}));const o=s||[];for(let s=0;s<r.length;s++){const f=r[s],l=e.properties[f];if(Object.prototype.hasOwnProperty.call(t,f)){if("boolean"!=typeof l){if(l&&"$validate"in l){const e=l.$validate(t[f]);if(e)return i("Property is invalid",{item:f,cause:e,data:t[f]})}}else if(!1===l)return i("Property is not allowed",{item:f,data:t[f]})}else if(o.length&&-1!==o.indexOf(f)&&n(l)&&"default"in l){const e=l.$validate(l.default);if(e)return i("Default property is invalid",{item:f,cause:e,data:l.default});t[f]=a(l.default)}}},values(e,t,i){if(!n(t))return;const r=e.values,a=r&&r.$validate;if("function"!=typeof a)return;const s=Object.keys(t);for(let e=0;e<s.length;e++){const r=s[e],n=a(t[r]);if(n)return i("Property is invalid",{item:r,cause:n,data:t[r]})}},maxProperties(e,t,i){if(n(t)&&!(Object.keys(t).length<=e.maxProperties))return i("Too many properties",{data:t})},minProperties(e,t,i){if(n(t)&&!(Object.keys(t).length>=e.minProperties))return i("Too few properties",{data:t})},additionalProperties(e,t,i){if(!n(t))return;const r=Object.keys(t);let a=e._apIsCompiled;void 0===a&&(a=s(e.additionalProperties),Object.defineProperty(e,"_apIsCompiled",{value:a,enumerable:!1}));let o=e._patternPropertiesList;if(e.patternProperties&&!o){o=[];for(const t in e.patternProperties)o.push({regex:new RegExp(t,"u"),key:t});Object.defineProperty(e,"_patternPropertiesList",{value:o,enumerable:!1})}for(let n=0;n<r.length;n++){const f=r[n];if(!e.properties||!e.properties.hasOwnProperty(f)){if(o&&o.length){let e=!1;for(let t=0;t<o.length;t++)if(o[t].regex.test(f)){e=!0;break}if(e)continue}if(!1===e.additionalProperties)return i("Additional properties are not allowed",{item:f,data:t[f]});if(a&&s(e.additionalProperties)){const r=e.additionalProperties.$validate(t[f]);if(r)return i("Additional properties are invalid",{item:f,cause:r,data:t[f]})}}}},patternProperties(e,t,i){if(!n(t))return;let r=e._patternPropertiesList;if(!r){r=[];const t=Object.keys(e.patternProperties||{});for(let e=0;e<t.length;e++){const i=t[e];r.push({regex:new RegExp(i,"u"),key:i})}Object.defineProperty(e,"_patternPropertiesList",{value:r,enumerable:!1})}const a=Object.keys(t);for(let n=0;n<r.length;n++){const{regex:s,key:o}=r[n],f=e.patternProperties[o];if("boolean"!=typeof f){if("$validate"in f)for(let e=0;e<a.length;e++){const r=a[e];if(s.test(r)){const e=f.$validate(t[r]);if(e)return i("Property is invalid",{item:r,cause:e,data:t[r]})}}}else if(!1===f)for(let e=0;e<a.length;e++){const r=a[e];if(s.test(r))return i("Property is not allowed",{item:r,data:t[r]})}}},propertyNames(e,t,i){if(!n(t))return;const r=e.propertyNames;if("boolean"==typeof r)return!1===r&&Object.keys(t).length>0?i("Properties are not allowed",{data:t}):void 0;const a=r&&r.$validate;if("function"==typeof a)for(const e in t){if(!Object.prototype.hasOwnProperty.call(t,e))continue;const r=a(e);if(r)return i("Property name is invalid",{item:e,cause:r,data:t[e]})}},dependencies(e,t,i){if(n(t))for(const r in e.dependencies){if(r in t==!1)continue;const n=e.dependencies[r];if(Array.isArray(n)){for(let e=0;e<n.length;e++)if(!(n[e]in t))return i("Dependency is not satisfied",{item:e,data:n[e]});continue}if("boolean"==typeof n){if(n)continue;return i("Dependency is not satisfied",{data:n})}if("string"==typeof n){if(n in t)continue;return i("Dependency is not satisfied",{data:n})}const a=n.$validate(t);if(a)return i("Dependency is not satisfied",{cause:a,data:t})}},then:!1,else:!1,default:!1,definitions:!1,$id:!1,$schema:!1,title:!1,description:!1,$comment:!1,examples:!1,contentMediaType:!1,contentEncoding:!1,discriminator:!1,nullable:!1},...{items(e,t,i){if(!Array.isArray(t))return;const r=e.items,n=t.length;if("boolean"==typeof r)return!1===r&&n>0?i("Array items are not allowed",{data:t}):void 0;if(Array.isArray(r)){const e=r.length,a=e<n?e:n;for(let e=0;e<a;e++){const n=r[e];if("boolean"==typeof n){if(!1===n&&void 0!==t[e])return i("Array item is not allowed",{item:e,data:t[e]});continue}const a=n&&n.$validate;if("function"==typeof a){const r=a(t[e]);if(r)return i("Array item is invalid",{item:e,cause:r,data:t[e]})}}return}const a=r&&r.$validate;if("function"==typeof a)for(let e=0;e<n;e++){const r=a(t[e]);if(r)return i("Array item is invalid",{item:e,cause:r,data:t[e]})}},elements(e,t,i){if(!Array.isArray(t))return;const r=e.elements,n=r&&r.$validate;if("function"==typeof n)for(let e=0;e<t.length;e++){const r=n(t[e]);if(r)return i("Array item is invalid",{item:e,cause:r,data:t[e]})}},minItems(e,t,i){if(Array.isArray(t)&&!(t.length>=e.minItems))return i("Array is too short",{data:t})},maxItems(e,t,i){if(Array.isArray(t)&&!(t.length<=e.maxItems))return i("Array is too long",{data:t})},additionalItems(e,t,i){if(e.items&&!n(e.items)){if(!1===e.additionalItems)return t.length>e.items.length?i("Array is too long",{data:t}):void 0;if(n(e.additionalItems)){if(s(e.additionalItems)){for(let r=e.items.length;r<t.length;r++){const n=e.additionalItems.$validate(t[r]);if(n)return i("Array item is invalid",{item:r,cause:n,data:t[r]})}return}}else;}},uniqueItems(e,t,i){if(!Array.isArray(t)||!e.uniqueItems)return;const n=t.length;if(n<=1)return;const a=new Set;for(let e=0;e<n;e++){const n=t[e],s=typeof n;if(null!==n&&"string"!==s&&"number"!==s&&"boolean"!==s){if(n&&"object"==typeof n)for(let a=0;a<e;a++){const e=t[a];if(e&&"object"==typeof e&&!r(e,n))return i("Array items are not unique",{data:n})}}else{if(a.has(n))return i("Array items are not unique",{data:n});a.add(n)}}},contains(e,t,i){if(Array.isArray(t)){if("boolean"==typeof e.contains)return e.contains?0===t.length?i("Array must contain at least one item",{data:t}):void 0:i("Array must not contain any items",{data:t});for(let i=0;i<t.length;i++){if(!e.contains.$validate(t[i]))return}return i("Array must contain at least one item",{data:t})}}},...{minLength(e,t,i){if(!("string"!=typeof t||t.length>=e.minLength))return i("Value is shorter than the minimum length",{data:t})},maxLength(e,t,i){if(!("string"!=typeof t||t.length<=e.maxLength))return i("Value is longer than the maximum length",{data:t})},pattern(e,t,i){if("string"!=typeof t)return;let r=e._patternRegexp;if(!r)try{r=new RegExp(e.pattern,"u"),Object.defineProperty(e,"_patternRegexp",{value:r,enumerable:!1,configurable:!1,writable:!1})}catch(e){return i("Invalid regular expression",{data:t,cause:e})}return r.test(t)?void 0:i("Value does not match the pattern",{data:t})},format(e,t,i,r){if("string"!=typeof t)return;let n=e._formatValidate;return void 0===n&&(n=r.getFormat(e.format),Object.defineProperty(e,"_formatValidate",{value:n,enumerable:!1,configurable:!1,writable:!1})),n&&!n(t)?i("Value does not match the format",{data:t}):void 0}},...{minimum(e,t,i,r){if("number"!=typeof t)return;let n=e.minimum;return"number"==typeof e.exclusiveMinimum?n=e.exclusiveMinimum+1e-15:!0===e.exclusiveMinimum&&(n+=1e-15),t<n?i("Value is less than the minimum",{data:t}):void 0},maximum(e,t,i,r){if("number"!=typeof t)return;let n=e.maximum;return"number"==typeof e.exclusiveMaximum?n=e.exclusiveMaximum-1e-15:!0===e.exclusiveMaximum&&(n-=1e-15),t>n?i("Value is greater than the maximum",{data:t}):void 0},multipleOf(e,t,i,r){if("number"!=typeof t)return;const n=t/e.multipleOf;return isFinite(n)?function(e,t,i=1e-15){return Math.abs(e-t)<=i*Math.max(Math.abs(e),Math.abs(t))}(n,Math.round(n))?void 0:i("Value is not a multiple of the multipleOf",{data:t}):void 0},exclusiveMinimum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMinimum&&!("minimum"in e))return t<=e.exclusiveMinimum+1e-15?i("Value is less than or equal to the exclusiveMinimum"):void 0},exclusiveMaximum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMaximum&&!("maximum"in e))return t>=e.exclusiveMaximum?i("Value is greater than or equal to the exclusiveMaximum",{data:t}):void 0}},...{enum(e,t,i){const n=e.enum;for(let e=0;e<n.length;e++){const i=n[e];if(i===t)return;if(null!==i&&null!==t&&"object"==typeof i&&"object"==typeof t&&!r(i,t))return}return i("Value is not one of the allowed values",{data:t})},allOf(e,t,i){for(let r=0;r<e.allOf.length;r++)if(n(e.allOf[r])){if("$validate"in e.allOf[r]){const n=e.allOf[r].$validate(t);if(n)return i("Value is not valid",{cause:n,data:t})}}else if("boolean"!=typeof e.allOf[r]){if(t!==e.allOf[r])return i("Value is not valid",{data:t})}else if(Boolean(t)!==e.allOf[r])return i("Value is not valid",{data:t})},anyOf(e,t,i){for(let i=0;i<e.anyOf.length;i++){if(n(e.anyOf[i])){if("$validate"in e.anyOf[i]){if(!e.anyOf[i].$validate(t))return;continue}return}if("boolean"==typeof e.anyOf[i]&&Boolean(t)===e.anyOf[i])return;if(t===e.anyOf[i])return}return i("Value is not valid",{data:t})},oneOf(e,t,i){const r=e.oneOf;let a=0;for(let e=0;e<r.length;e++){const s=r[e];if(n(s)){if("$validate"in s){if(!s.$validate(t)&&(a++,a>1))return i("Value is not valid",{data:t});continue}if(a++,a>1)return i("Value is not valid",{data:t})}else if("boolean"!=typeof s){if(t===s&&(a++,a>1))return i("Value is not valid",{data:t})}else if(Boolean(t)===s&&(a++,a>1))return i("Value is not valid",{data:t})}if(1!==a)return i("Value is not valid",{data:t})},const(e,t,i){if(t!==e.const&&!(n(t)&&n(e.const)&&!r(t,e.const)||Array.isArray(t)&&Array.isArray(e.const)&&!r(t,e.const)))return i("Value is not valid",{data:t})},if(e,t){if("then"in e==!1&&"else"in e==!1)return;if("boolean"==typeof e.if){if(e.if){if(s(e.then))return e.then.$validate(t)}else if(s(e.else))return e.else.$validate(t);return}if(!s(e.if))return;return e.if.$validate(t)?s(e.else)?e.else.$validate(t):void 0:s(e.then)?e.then.$validate(t):void 0},not(e,t,i){if("boolean"==typeof e.not)return e.not?i("Value is not valid",{data:t}):void 0;if(n(e.not)){if("$validate"in e.not){const r=e.not.$validate(t);return r?void 0:i("Value is not valid",{cause:r,data:t})}return i("Value is not valid",{data:t})}return i("Value is not valid",{data:t})},$ref(e,t,i,r){if(e._resolvedRef)return e._resolvedRef(t);const n=e.$ref;let a=r.getSchemaRef(n);return a||(a=r.getSchemaById(n)),a?a.$validate?(e._resolvedRef=a.$validate,e._resolvedRef(t)):void 0:i(`Missing reference: ${n}`)}}},z={SchemaShield:class{types={};formats={};keywords={};immutable=!1;rootSchema=null;idRegistry=new Map;failFast=!0;constructor({immutable:e=!1,failFast:t=!0}={}){this.immutable=e,this.failFast=t;for(const[e,t]of Object.entries(I))t&&this.addType(e,t);for(const[e,t]of Object.entries(F))this.addKeyword(e,t);for(const[e,t]of Object.entries(M))t&&this.addFormat(e,t)}addType(t,i,r=!1){if(this.types[t]&&!r)throw new e(`Type "${t}" already exists`);this.types[t]=i}getType(e){return this.types[e]}addFormat(t,i,r=!1){if(this.formats[t]&&!r)throw new e(`Format "${t}" already exists`);this.formats[t]=i}getFormat(e){return this.formats[e]}addKeyword(t,i,r=!1){if(this.keywords[t]&&!r)throw new e(`Keyword "${t}" already exists`);this.keywords[t]=i}getKeyword(e){return this.keywords[e]}getSchemaRef(e){if(this.rootSchema)return function(e,t){if(!t||"#"===t)return e;if(t.startsWith("#/")){const i=t.split("/").slice(1);let r=e;for(const e of i){const t=decodeURIComponent(e).replace(/~1/g,"/").replace(/~0/g,"~");if(!r||"object"!=typeof r||!(t in r))return;r=r[t]}return r}if(!t.includes("#")){if(e.definitions&&e.definitions[t])return e.definitions[t];if(e.defs&&e.defs[t])return e.defs[t];if(e.$id&&"string"==typeof e.$id&&(e.$id===t||e.$id.endsWith("/"+t)))return e}}(this.rootSchema,e)}getSchemaById(e){return this.idRegistry.get(e)}compile(t){this.idRegistry.clear();const i=this.compileSchema(t);if(this.rootSchema=i,this.linkReferences(i),!i.$validate){if(!1===this.isSchemaLike(t))throw new e("Invalid schema");i.$validate=o("Validate_Any",()=>{})}const r=e=>{this.rootSchema=i;const t=this.immutable?a(e):e,r=i.$validate(t);return r?{data:t,error:r,valid:!1}:{data:t,error:null,valid:!0}};return r.compiledSchema=i,r}compileSchema(e){n(e)||(e=!0===e?{anyOf:[{}]}:!1===e?{oneOf:[]}:{oneOf:[e]});const t=a(e);if("string"==typeof e.$id&&this.idRegistry.set(e.$id,t),"$ref"in e){const r=this.getKeyword("$ref");if(r){const n=i("$ref",e.$ref,this.failFast);t.$validate=o("Validate_Reference",e=>r(t,e,n,this))}return t}const r=[],s=[];if("type"in e){const t=i("type",e,this.failFast),n=Array.isArray(e.type)?e.type:e.type.split(",").map(e=>e.trim()),a=[],f=[];for(const e of n){const t=this.getType(e);t&&(a.push(t),f.push(t.name))}if(0===a.length)throw i("type",e,this.failFast)("Invalid type for schema",{data:e.type});let l,u="";if(1===a.length){u=f[0];const e=a[0];l=i=>{if(!e(i))return t("Invalid type",{data:i})}}else u=f.join("_OR_"),l=e=>{for(let t=0;t<a.length;t++)if(a[t](e))return;return t("Invalid type",{data:e})};const d=(e,t)=>l(t);r.push({fn:o(u,d),defineError:t}),s.push(u)}const{type:f,$id:l,$ref:u,$validate:d,required:c,...m}=e,p=c?[...Object.keys(m),"required"]:Object.keys(m);for(const t of p){const n=this.getKeyword(t);if(n){const a=i(t,e[t],this.failFast),o=n.name||t;r.push({fn:n,defineError:a}),s.push(o)}}const h=["enum","const","default","examples"];for(const i of p)if(!h.includes(i))if(n(e[i])){if("properties"===i){for(const r of Object.keys(e[i]))t[i][r]=this.compileSchema(e[i][r]);continue}t[i]=this.compileSchema(e[i])}else if(Array.isArray(e[i]))for(let r=0;r<e[i].length;r++)this.isSchemaLike(e[i][r])&&(t[i][r]=this.compileSchema(e[i][r]));else;if(0===r.length)return t;if(1===r.length){const e=r[0];t.$validate=o(s[0],i=>e.fn(t,i,e.defineError,this))}else{const e="Validate_"+s.join("_AND_"),i=e=>{for(let i=0;i<r.length;i++){const n=r[i],a=n.fn(t,e,n.defineError,this);if(a)return a}};t.$validate=o(e,i)}return t}isSchemaLike(e){if(n(e)){if("type"in e)return!0;for(let t in e)if(t in this.keywords)return!0}return!1}linkReferences(e){const t=[e];for(;t.length>0;){const e=t.pop();if(e&&"object"==typeof e){if("string"==typeof e.$ref&&"function"==typeof e.$validate&&"Validate_Reference"===e.$validate.name){const t=e.$ref;let r=this.getSchemaRef(t);if(void 0===r&&(r=this.getSchemaById(t)),"boolean"==typeof r){if(!0===r)e.$validate=o("Validate_Ref_True",()=>{});else{const t=i("$ref",e,this.failFast);e.$validate=o("Validate_Ref_False",e=>t("Value is not valid"))}continue}r&&"function"==typeof r.$validate&&(e.$validate=r.$validate)}for(const i in e){const r=e[i];if(r)if(Array.isArray(r))for(let e=0;e<r.length;e++){const i=r[e];i&&"object"==typeof i&&t.push(i)}else"object"==typeof r&&t.push(r)}}}}},ValidationError:e,deepClone:a};"undefined"!=typeof module?module.exports=z:self.SchemaShield=z})();//# sourceMappingURL=index.min.js.map
|
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwiaW5zdGFuY2VQb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiX2dldFRyZWUiLCJ0cmVlIiwiZ2V0VHJlZSIsImdldFBhdGgiLCJnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleSIsImtleSIsIktleXdvcmRFcnJvciIsImdldE5hbWVkRnVuY3Rpb24iLCJvcHRpb25zIiwiZGVlcEVxdWFsIiwib2JqIiwib3RoZXIiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJpIiwia2V5cyIsIk9iamVjdCIsImlzT2JqZWN0IiwiZGVlcENsb25lIiwicmVzdWx0IiwiY29uc3RydWN0b3IiLCJuYW1lIiwiaXNDb21waWxlZFNjaGVtYSIsInN1YlNjaGVtYSIsImZuIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsIkZvcm1hdHMiLCJtYXRjaCIsImRheSIsIk51bWJlciIsInllYXJTdHIiLCJtb250aFN0ciIsImhvdXJTdHIiLCJtaW51dGVTdHIiLCJzZWNvbmRTdHIiLCJ0aW1lem9uZVNpZ24iLCJ0aW1lem9uZUhvdXJTdHIiLCJ0aW1lem9uZU1pbnV0ZVN0ciIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJ0aW1lem9uZUhvdXIiLCJ0aW1lem9uZU1pbnV0ZSIsInVyaSIsInRlc3QiLCJlbWFpbCIsImlwdjQiLCJpcHY2IiwiaW5kZXhPZiIsImhhc0lwdjQiLCJhZGRyZXNzUGFydHMiLCJzcGxpdCIsImlwdjRQYXJ0IiwicG9wIiwiaXNTaG9ydGVuZWQiLCJpcHY2UGFydCIsImpvaW4iLCJpc0lwdjZWYWxpZCIsImhhc0ludmFsaWRDaGFyIiwiaG9zdG5hbWUiLCJkYXRlIiwiaXNOYU4iLCJEYXRlIiwiZ2V0VGltZSIsInJlZ2V4IiwiUmVnRXhwIiwiZSIsInRpbWUiLCJkdXJhdGlvbiIsInV1aWQiLCJpcmkiLCJUeXBlcyIsIm9iamVjdCIsImFycmF5Iiwic3RyaW5nIiwibnVtYmVyIiwiaW50ZWdlciIsImJvb2xlYW4iLCJudWxsIiwidGltZXN0YW1wIiwiaW50OCIsInVuaXQ4IiwiaW50MTYiLCJ1bml0MTYiLCJpbnQzMiIsInVuaXQzMiIsImZsb2F0MzIiLCJmbG9hdDY0Iiwia2V5d29yZHMiLCJyZXF1aXJlZCIsImRlZmluZUVycm9yIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiZXJyb3IiLCIkdmFsaWRhdGUiLCJzY2hlbWFQcm9wIiwiZGVmYXVsdCIsInZhbHVlcyIsIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJpc0NvbXBpbGVkIiwicGF0dGVyblByb3BlcnRpZXMiLCJwYXR0ZXJuIiwicGF0dGVybnMiLCJwcm9wZXJ0eU5hbWVzIiwiZGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeSIsInRoZW4iLCJlbHNlIiwiJHJlZiIsImRlZmluaXRpb25zIiwiJGlkIiwiJHNjaGVtYSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCIkY29tbWVudCIsImV4YW1wbGVzIiwiY29udGVudE1lZGlhVHlwZSIsImNvbnRlbnRFbmNvZGluZyIsImRpc2NyaW1pbmF0b3IiLCJudWxsYWJsZSIsIml0ZW1zIiwic2NoZW1hSXRlbXMiLCJkYXRhTGVuZ3RoIiwic2NoZW1hSXRlbXNMZW5ndGgiLCJpdGVtc0xlbmd0aCIsIk1hdGgiLCJtaW4iLCJzY2hlbWFJdGVtIiwiZWxlbWVudHMiLCJtaW5JdGVtcyIsIm1heEl0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwidW5pcXVlSXRlbXMiLCJ1bmlxdWUiLCJTZXQiLCJpdGVtU3RyIiwiSlNPTiIsInN0cmluZ2lmeSIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJTdHJpbmciLCJoYXMiLCJhZGQiLCJjb250YWlucyIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsInBhdHRlcm5SZWdleHAiLCJmb3JtYXQiLCJpbnN0YW5jZSIsImZvcm1hdFZhbGlkYXRlIiwiZ2V0Rm9ybWF0IiwibWluaW11bSIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwibWF4IiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImlzRmluaXRlIiwiZXBzaWxvbiIsImFicyIsImFyZUNsb3NlRW5vdWdoIiwicm91bmQiLCJlbnVtIiwiZW51bUl0ZW0iLCJhbGxPZiIsIkJvb2xlYW4iLCJhbnlPZiIsIm9uZU9mIiwidmFsaWRDb3VudCIsImNvbnN0IiwiaWYiLCJub3QiLCJ0eXBlcyIsImZvcm1hdHMiLCJpbW11dGFibGUiLCJ0eXBlIiwidmFsaWRhdG9yIiwiYWRkVHlwZSIsImFkZEtleXdvcmQiLCJhZGRGb3JtYXQiLCJvdmVyd3JpdGUiLCJnZXRUeXBlIiwiZ2V0S2V5d29yZCIsImNvbXBpbGUiLCJjb21waWxlZFNjaGVtYSIsImNvbXBpbGVTY2hlbWEiLCJpc1NjaGVtYUxpa2UiLCJ2YWxpZGF0ZSIsImNsb25lZERhdGEiLCJ2YWxpZCIsImRlZmluZVR5cGVFcnJvciIsInR5cGVWYWxpZGF0aW9ucyIsIm1ldGhvZE5hbWUiLCJtYXAiLCJ0IiwidHJpbSIsInB1c2giLCJ0eXBlVmFsaWRhdGlvbnNMZW5ndGgiLCJ0eXBlVmFsaWRhdGlvbiIsImtleXdvcmRWYWxpZGF0b3IiLCJwcmV2VmFsaWRhdG9yIiwic3ViS2V5IiwiaW5kZXgiXSwic291cmNlcyI6WyIuLi9saWIvdXRpbHMudHMiLCIuLi9saWIvZm9ybWF0cy50cyIsIi4uL2xpYi90eXBlcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvYXJyYXkta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvc3RyaW5nLWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL251bWJlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21waWxlZFNjaGVtYSB9IGZyb20gXCIuL2luZGV4XCI7XG5cbmludGVyZmFjZSBFcnJvclRyZWUge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nO1xuICBpbnN0YW5jZVBhdGg6IHN0cmluZztcbiAgZGF0YT86IGFueTtcbiAgY2F1c2U/OiBFcnJvclRyZWU7XG59XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAga2V5d29yZDogc3RyaW5nO1xuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgaW5zdGFuY2VQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBkYXRhPzogYW55O1xuICBzY2hlbWE/OiBDb21waWxlZFNjaGVtYTtcblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIsIGluc3RhbmNlUG9pbnRlciA9IFwiI1wiKTogVmFsaWRhdGlvbkVycm9yIHtcbiAgICBsZXQgc2NoZW1hUGF0aCA9IGAke3BvaW50ZXJ9LyR7dGhpcy5rZXl3b3JkfWA7XG4gICAgbGV0IGluc3RhbmNlUGF0aCA9IGAke2luc3RhbmNlUG9pbnRlcn1gO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuaXRlbSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLml0ZW0gaW4gdGhpcy5zY2hlbWEpIHtcbiAgICAgICAgc2NoZW1hUGF0aCArPSBgLyR7dGhpcy5pdGVtfWA7XG4gICAgICB9XG4gICAgICBpbnN0YW5jZVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VQYXRoID0gaW5zdGFuY2VQYXRoO1xuICAgIHRoaXMuc2NoZW1hUGF0aCA9IHNjaGVtYVBhdGg7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBjYXVzZSBvciB0aGUgY2F1c2UgaXMgbm90IGEgVmFsaWRhdGlvbkVycm9yLCByZXR1cm4gdGhpc1xuICAgIGlmICghdGhpcy5jYXVzZSB8fCAhKHRoaXMuY2F1c2UgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYXVzZS5fZ2V0Q2F1c2Uoc2NoZW1hUGF0aCwgaW5zdGFuY2VQYXRoKTtcbiAgfVxuXG4gIGdldENhdXNlKCk6IFZhbGlkYXRpb25FcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhdXNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgY29uc3QgdHJlZTogRXJyb3JUcmVlID0ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgaXRlbTogdGhpcy5pdGVtLFxuICAgICAgc2NoZW1hUGF0aDogdGhpcy5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiB0aGlzLmluc3RhbmNlUGF0aCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jYXVzZSkge1xuICAgICAgdHJlZS5jYXVzZSA9IHRoaXMuY2F1c2UuX2dldFRyZWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIGdldFRyZWUoKTogRXJyb3JUcmVlIHtcbiAgICB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRyZWUoKTtcbiAgfVxuXG4gIGdldFBhdGgoKSB7XG4gICAgY29uc3QgY2F1c2UgPSB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtYVBhdGg6IGNhdXNlLnNjaGVtYVBhdGgsXG4gICAgICBpbnN0YW5jZVBhdGg6IGNhdXNlLmluc3RhbmNlUGF0aFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvck9wdGlvbnMge1xuICBpdGVtPzogYW55OyAvLyBGaW5hbCBpdGVtIGluIHRoZSBzY2hlbWFQYXRoXG4gIGNhdXNlPzogVmFsaWRhdGlvbkVycm9yOyAvLyBDYXVzZSBvZiB0aGUgZXJyb3JcbiAgZGF0YT86IGFueTsgLy8gRGF0YSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Jcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvckZ1bmN0aW9uIHtcbiAgKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IERlZmluZUVycm9yT3B0aW9ucyk6IFZhbGlkYXRpb25FcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICBrZXk6IHN0cmluZyxcbiAgc2NoZW1hOiBDb21waWxlZFNjaGVtYVxuKSB7XG4gIGNvbnN0IEtleXdvcmRFcnJvciA9IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgJHtrZXl9YCk7XG4gIEtleXdvcmRFcnJvci5rZXl3b3JkID0ga2V5O1xuICBLZXl3b3JkRXJyb3Iuc2NoZW1hID0gc2NoZW1hO1xuXG4gIGNvbnN0IGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uID0gKG1lc3NhZ2UsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIEtleXdvcmRFcnJvci5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICBLZXl3b3JkRXJyb3IuaXRlbSA9IG9wdGlvbnMuaXRlbTtcbiAgICBLZXl3b3JkRXJyb3IuY2F1c2UgPSBvcHRpb25zLmNhdXNlO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChcbiAgb2JqOiBBcnJheTxhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgb3RoZXI6IEFycmF5PGFueT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSAmJiBBcnJheS5pc0FycmF5KG90aGVyKSkge1xuICAgIGlmIChvYmoubGVuZ3RoICE9PSBvdGhlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwob2JqW2ldLCBvdGhlcltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG90aGVyID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvdGhlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gb3RoZXI7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhvdGhlcikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwob2JqW2tleV0sIG90aGVyW2tleV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmogPT09IG90aGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUNsb3NlRW5vdWdoKGEsIGIsIGVwc2lsb24gPSAxZS0xNSkge1xuICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDw9IGVwc2lsb24gKiBNYXRoLm1heChNYXRoLmFicyhhKSwgTWF0aC5hYnMoYikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVRGMTZMZW5ndGgoc3RyKSB7XG4gIGxldCBsZW5ndGggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGVQb2ludCA9IHN0ci5jb2RlUG9pbnRBdChpKTtcbiAgICBpZiAoY29kZVBvaW50ID4gMHhmZmZmKSB7XG4gICAgICBpKys7XG4gICAgfVxuICAgIGxlbmd0aCsrO1xuICB9XG4gIHJldHVybiBsZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUob2JqOiBhbnkpOiBhbnkge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IGRlZXBDbG9uZShvYmpbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gSXMgY2xhc3MgaW5zdGFuY2Ugb2YgYW55IGtpbmRcbiAgaWYgKG9iaiAmJiBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT09IFwiT2JqZWN0XCIpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KG9iaikpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5vYmpcbiAgICB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwQ2xvbmUob2JqW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGlsZWRTY2hlbWEoc3ViU2NoZW1hOiBhbnkpOiBzdWJTY2hlbWEgaXMgQ29tcGlsZWRTY2hlbWEge1xuICByZXR1cm4gaXNPYmplY3Qoc3ViU2NoZW1hKSAmJiBcIiR2YWxpZGF0ZVwiIGluIHN1YlNjaGVtYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVkRnVuY3Rpb248VD4obmFtZTogc3RyaW5nLCBmbjogVCk6IFQge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBcIm5hbWVcIiwgeyB2YWx1ZTogbmFtZSB9KTtcbn1cbiIsImltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IEZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICBbXCJkYXRlLXRpbWVcIl0oZGF0YSkge1xuICAgIGNvbnN0IG1hdGNoID0gZGF0YS5tYXRjaChcbiAgICAgIC9eKFxcZHs0fSktKDBbMC05XXwxWzAtMl0pLShcXGR7Mn0pVCgwWzAtOV18MVxcZHwyWzAtM10pOihbMC01XVxcZCk6KCg/OlswLTVdXFxkfDYwKSkoPzouXFxkKyk/KD86KFsrLV0pKDBbMC05XXwxXFxkfDJbMC0zXSk6KFswLTVdXFxkKXxaKT8kL2lcbiAgICApO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBkYXkgPSBOdW1iZXIobWF0Y2hbM10pO1xuXG4gICAgaWYgKG1hdGNoWzJdID09PSBcIjAyXCIgJiYgZGF5ID4gMjkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBbXG4gICAgICAsXG4gICAgICB5ZWFyU3RyLFxuICAgICAgbW9udGhTdHIsXG4gICAgICAsXG4gICAgICBob3VyU3RyLFxuICAgICAgbWludXRlU3RyLFxuICAgICAgc2Vjb25kU3RyLFxuICAgICAgdGltZXpvbmVTaWduLFxuICAgICAgdGltZXpvbmVIb3VyU3RyLFxuICAgICAgdGltZXpvbmVNaW51dGVTdHJcbiAgICBdID0gbWF0Y2g7XG5cbiAgICBsZXQgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBsZXQgbW9udGggPSBOdW1iZXIobW9udGhTdHIpO1xuICAgIGxldCBob3VyID0gTnVtYmVyKGhvdXJTdHIpO1xuICAgIGxldCBtaW51dGUgPSBOdW1iZXIobWludXRlU3RyKTtcbiAgICBsZXQgc2Vjb25kID0gTnVtYmVyKHNlY29uZFN0cik7XG5cbiAgICBpZiAodGltZXpvbmVTaWduID09PSBcIi1cIiB8fCB0aW1lem9uZVNpZ24gPT09IFwiK1wiKSB7XG4gICAgICBjb25zdCB0aW1lem9uZUhvdXIgPSBOdW1iZXIodGltZXpvbmVIb3VyU3RyKTtcbiAgICAgIGNvbnN0IHRpbWV6b25lTWludXRlID0gTnVtYmVyKHRpbWV6b25lTWludXRlU3RyKTtcblxuICAgICAgaWYgKHRpbWV6b25lU2lnbiA9PT0gXCItXCIpIHtcbiAgICAgICAgaG91ciArPSB0aW1lem9uZUhvdXI7XG4gICAgICAgIG1pbnV0ZSArPSB0aW1lem9uZU1pbnV0ZTtcbiAgICAgIH0gZWxzZSBpZiAodGltZXpvbmVTaWduID09PSBcIitcIikge1xuICAgICAgICBob3VyIC09IHRpbWV6b25lSG91cjtcbiAgICAgICAgbWludXRlIC09IHRpbWV6b25lTWludXRlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWludXRlID4gNTkpIHtcbiAgICAgICAgaG91ciArPSAxO1xuICAgICAgICBtaW51dGUgLT0gNjA7XG4gICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA8IDApIHtcbiAgICAgICAgaG91ciAtPSAxO1xuICAgICAgICBtaW51dGUgKz0gNjA7XG4gICAgICB9XG5cbiAgICAgIGlmIChob3VyID4gMjMpIHtcbiAgICAgICAgZGF5ICs9IDE7XG4gICAgICAgIGhvdXIgLT0gMjQ7XG4gICAgICB9IGVsc2UgaWYgKGhvdXIgPCAwKSB7XG4gICAgICAgIGRheSAtPSAxO1xuICAgICAgICBob3VyICs9IDI0O1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF5ID4gMzEpIHtcbiAgICAgICAgbW9udGggKz0gMTtcbiAgICAgICAgZGF5IC09IDMxO1xuICAgICAgfSBlbHNlIGlmIChkYXkgPCAxKSB7XG4gICAgICAgIG1vbnRoIC09IDE7XG4gICAgICAgIGRheSArPSAzMTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vbnRoID4gMTIpIHtcbiAgICAgICAgeWVhciArPSAxO1xuICAgICAgICBtb250aCAtPSAxMjtcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAxKSB7XG4gICAgICAgIHllYXIgLT0gMTtcbiAgICAgICAgbW9udGggKz0gMTI7XG4gICAgICB9XG5cbiAgICAgIGlmICh5ZWFyIDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBbMzEsICwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuICAgIGNvbnN0IG1heERheXMgPVxuICAgICAgbW9udGggPT09IDJcbiAgICAgICAgPyB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKVxuICAgICAgICAgID8gMjlcbiAgICAgICAgICA6IDI4XG4gICAgICAgIDogZGF5c0luTW9udGhbbW9udGggLSAxXTtcblxuICAgIGlmIChkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTGVhcCBzZWNvbmRzXG4gICAgaWYgKHNlY29uZCA9PT0gNjAgJiYgKG1pbnV0ZSAhPT0gNTkgfHwgaG91ciAhPT0gMjMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHVyaShkYXRhKSB7XG4gICAgcmV0dXJuIC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC8udGVzdChkYXRhKTtcbiAgfSxcbiAgZW1haWwoZGF0YSkge1xuICAgIHJldHVybiAvXig/IVxcLikoPyEuKlxcLiQpW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjB9KD86XFwuW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjF9KXswLDJ9QFthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyg/OlxcLlthLXowLTldKD86W2EtejAtOS1dezAsNjB9W2EtejAtOV0pPyl7MCwzfSQvaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIGlwdjQoZGF0YSkge1xuICAgIC8vIE1hdGNoZXMgYSBzdHJpbmcgZm9ybWVkIGJ5IDQgbnVtYmVycyBiZXR3ZWVuIDAgYW5kIDI1NSBzZXBhcmF0ZWQgYnkgZG90cyB3aXRob3V0IGxlYWRpbmcgemVyb3NcbiAgICAvLyAvXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC9cbiAgICByZXR1cm4gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKSQvLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcblxuICAvLyBpcHY2OiBpc015SXBWYWxpZCh7IHZlcnNpb246IDYgfSksXG4gIGlwdjYoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIjo6XCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRhdGEuaW5kZXhPZihcIjpcIikgPT09IC0xIHx8XG4gICAgICAvKD86XFxzK3w6OjorfF5cXHd7NSx9fFxcd3s1fSR8Xjp7MX1cXHd8XFx3OnsxfSQpLy50ZXN0KGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzSXB2NCA9IGRhdGEuaW5kZXhPZihcIi5cIikgIT09IC0xO1xuICAgIGxldCBhZGRyZXNzUGFydHMgPSBkYXRhO1xuXG4gICAgaWYgKGhhc0lwdjQpIHtcbiAgICAgIGFkZHJlc3NQYXJ0cyA9IGRhdGEuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgaXB2NFBhcnQgPSBhZGRyZXNzUGFydHMucG9wKCk7XG4gICAgICBpZiAoXG4gICAgICAgICEvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC8udGVzdChcbiAgICAgICAgICBpcHY0UGFydFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2hvcnRlbmVkID0gZGF0YS5pbmRleE9mKFwiOjpcIikgIT09IC0xO1xuICAgIGNvbnN0IGlwdjZQYXJ0ID0gaGFzSXB2NCA/IGFkZHJlc3NQYXJ0cy5qb2luKFwiOlwiKSA6IGRhdGE7XG5cbiAgICBpZiAoaXNTaG9ydGVuZWQpIHtcbiAgICAgIGlmIChpcHY2UGFydC5zcGxpdChcIjo6XCIpLmxlbmd0aCAtIDEgPiAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEvXlswLTlhLWZBLUY6Ll0qJC8udGVzdChpcHY2UGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gL14oPzooPzooPzpbMC05YS1mQS1GXXsxLDR9KD86OnwkKSl7MSw2fSkpfCg/Ojo6KD86WzAtOWEtZkEtRl17MSw0fSkpezAsNX0kLy50ZXN0KFxuICAgICAgICBpcHY2UGFydFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0lwdjZWYWxpZCA9XG4gICAgICAvXig/Oig/OlswLTlhLWZBLUZdezEsNH06KXs3fSg/OlswLTlhLWZBLUZdezEsNH18OikpJC8udGVzdChpcHY2UGFydCk7XG5cbiAgICBjb25zdCBoYXNJbnZhbGlkQ2hhciA9IC8oPzpbMC05YS1mQS1GXXs1LH18XFxEWzAtOWEtZkEtRl17M306KS8udGVzdChcbiAgICAgIGlwdjZQYXJ0XG4gICAgKTtcblxuICAgIGlmIChoYXNJcHY0KSB7XG4gICAgICByZXR1cm4gaXNJcHY2VmFsaWQgfHwgIWhhc0ludmFsaWRDaGFyO1xuICAgIH1cblxuICAgIHJldHVybiBpc0lwdjZWYWxpZCAmJiAhaGFzSW52YWxpZENoYXI7XG4gIH0sXG5cbiAgaG9zdG5hbWUoZGF0YSkge1xuICAgIHJldHVybiAvXlthLXowLTldW2EtejAtOS1dezAsNjJ9KD86XFwuW2EtejAtOV1bYS16MC05LV17MCw2Mn0pKlthLXowLTldJC9pLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgaWYgKC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLy50ZXN0KGRhdGEpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOYU4obmV3IERhdGUoZGF0YSkuZ2V0VGltZSgpKTtcbiAgfSxcbiAgcmVnZXgoZGF0YSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgUmVnRXhwKGRhdGEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgXCJqc29uLXBvaW50ZXJcIihkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAvXlxcLyg/Oltefl18fjB8fjEpKiQvLnRlc3QoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gL14oWzAtOV0rKSgjfFxcLyg/Oltefl18fjB8fjEpKik/JC8udGVzdChkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIC9eKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSkoXFwuXFxkKyk/KFp8KFsrLV0pKFxcZHsyfSk6KFxcZHsyfSkpJC8udGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuICBcInVyaS1yZWZlcmVuY2VcIihkYXRhKSB7XG4gICAgaWYgKC9cXFxcLy50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIygoPyFbXiNdKlxcXFwpW14jXSopKT8vaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIFwidXJpLXRlbXBsYXRlXCIoZGF0YSkge1xuICAgIHJldHVybiAvXig/Oig/Omh0dHBzPzpcXC9cXC9bXFx3Li1dKyk/XFwvPyk/W1xcdy0gOywuXFwvPyUmPV0qKD86XFx7W1xcdy1dKyg/OjpcXGQrKT9cXH1bXFx3LSA7LC5cXC8/JSY9XSopKlxcLz8kLy50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG5cbiAgLy8gTm90IHN1cHBvcnRlZCB5ZXRcbiAgZHVyYXRpb246IGZhbHNlLFxuICB1dWlkOiBmYWxzZSxcbiAgXCJpZG4tZW1haWxcIjogZmFsc2UsXG4gIFwiaWRuLWhvc3RuYW1lXCI6IGZhbHNlLFxuICBpcmk6IGZhbHNlLFxuICBcImlyaS1yZWZlcmVuY2VcIjogZmFsc2Vcbn07XG4iLCJpbXBvcnQgeyBUeXBlRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgVHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgb2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICBkYXRhICE9PSBudWxsICYmXG4gICAgICBcImxlbmd0aFwiIGluIGRhdGEgJiZcbiAgICAgIFwiMFwiIGluIGRhdGEgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCAtIDEgPT09IGRhdGEubGVuZ3RoXG4gICAgKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVuaXQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1bml0MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVuaXQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxuXG5cbn07XG4iLCJpbXBvcnQgeyBBcnJheUtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvYXJyYXkta2V5d29yZHNcIjtcbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5pbXBvcnQgeyBOdW1iZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL251bWJlci1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT2JqZWN0S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHNcIjtcbmltcG9ydCB7IE90aGVyS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgU3RyaW5nS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9zdHJpbmcta2V5d29yZHNcIjtcblxuZXhwb3J0IGNvbnN0IGtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIC4uLk9iamVjdEtleXdvcmRzLFxuICAuLi5BcnJheUtleXdvcmRzLFxuICAuLi5TdHJpbmdLZXl3b3JkcyxcbiAgLi4uTnVtYmVyS2V5d29yZHMsXG4gIC4uLk90aGVyS2V5d29yZHNcbn07XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE9iamVjdEtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIC8vIE9iamVjdFxuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMpKSB7XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYVByb3ApICYmIFwiZGVmYXVsdFwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgICBkYXRhW2tleV0gPSBzY2hlbWFQcm9wLmRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLnByb3BlcnRpZXNba2V5XSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0pIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucHJvcGVydGllc1trZXldLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHZhbHVlcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCAhaXNDb21waWxlZFNjaGVtYShzY2hlbWEudmFsdWVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS52YWx1ZXMuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoIDw9IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVG9vIG1hbnkgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWluUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJUb28gZmV3IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgIGNvbnN0IGlzQ29tcGlsZWQgPSBpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzICYmIHNjaGVtYS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBpbiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICAgICAgICBpZiAobmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIikudGVzdChrZXkpKSB7XG4gICAgICAgICAgICBtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQ29tcGlsZWQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwYXR0ZXJuUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm5zID0gT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgaWYgKFwiJHZhbGlkYXRlXCIgaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5dKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXS4kdmFsaWRhdGUoXG4gICAgICAgICAgICAgIGRhdGFba2V5XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcHJvcGVydHlOYW1lcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNjaGVtYS5wcm9wZXJ0eU5hbWVzID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0eU5hbWVzID09PSBmYWxzZSAmJiBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnRpZXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnByb3BlcnR5TmFtZXMpKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5wcm9wZXJ0eU5hbWVzLiR2YWxpZGF0ZShrZXkpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBuYW1lIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgZGVwZW5kZW5jaWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLmRlcGVuZGVuY2llcykge1xuICAgICAgaWYgKGtleSBpbiBkYXRhID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHNjaGVtYS5kZXBlbmRlbmNpZXNba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlcGVuZGVuY3kpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwZW5kZW5jeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghKGRlcGVuZGVuY3lbaV0gaW4gZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICAgIGRhdGE6IGRlcGVuZGVuY3lbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwgeyBkYXRhOiBkZXBlbmRlbmN5IH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlcGVuZGVuY3kgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvciA9IGRlcGVuZGVuY3kuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7XG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIC8vIFJlcXVpcmVkIGJ5IG90aGVyIGtleXdvcmRzIGJ1dCBub3QgdXNlZCBhcyBhIGZ1bmN0aW9uIGl0c2VsZlxuICB0aGVuOiBmYWxzZSxcbiAgZWxzZTogZmFsc2UsXG4gIGRlZmF1bHQ6IGZhbHNlLFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgJHJlZjogZmFsc2UsXG4gIGRlZmluaXRpb25zOiBmYWxzZSxcbiAgJGlkOiBmYWxzZSxcbiAgJHNjaGVtYTogZmFsc2UsXG5cbiAgLy8gTWV0YWRhdGEga2V5d29yZHMgKG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24pXG4gIHRpdGxlOiBmYWxzZSxcbiAgZGVzY3JpcHRpb246IGZhbHNlLFxuICAkY29tbWVudDogZmFsc2UsXG4gIGV4YW1wbGVzOiBmYWxzZSxcbiAgY29udGVudE1lZGlhVHlwZTogZmFsc2UsXG4gIGNvbnRlbnRFbmNvZGluZzogZmFsc2UsXG5cbiAgLy8gTm90IHN1cHBvcnRlZCBPcGVuIEFQSSBrZXl3b3Jkc1xuICBkaXNjcmltaW5hdG9yOiBmYWxzZSxcbiAgbnVsbGFibGU6IGZhbHNlXG59O1xuIiwiaW1wb3J0IHsgaXNDb21waWxlZFNjaGVtYSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBBcnJheUtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBpdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hSXRlbXMgPSBzY2hlbWEuaXRlbXM7XG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWFJdGVtcyA9PT0gZmFsc2UgJiYgZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYUl0ZW1zKSkge1xuICAgICAgY29uc3Qgc2NoZW1hSXRlbXNMZW5ndGggPSBzY2hlbWFJdGVtcy5sZW5ndGg7XG4gICAgICBjb25zdCBpdGVtc0xlbmd0aCA9IE1hdGgubWluKHNjaGVtYUl0ZW1zTGVuZ3RoLCBkYXRhTGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzY2hlbWFJdGVtID0gc2NoZW1hSXRlbXNbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoc2NoZW1hSXRlbSA9PT0gZmFsc2UgJiYgdHlwZW9mIGRhdGFbaV0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWFJdGVtKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hSXRlbS4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hSXRlbXMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYUl0ZW1zLiR2YWxpZGF0ZShkYXRhW2ldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgZWxlbWVudHMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxlbWVudHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5lbGVtZW50cy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtaW5JdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8IGRhdGEubGVuZ3RoID49IHNjaGVtYS5taW5JdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBzaG9ydFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4SXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA8PSBzY2hlbWEubWF4SXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gbG9uZ1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIXNjaGVtYS5pdGVtcyB8fCBpc09iamVjdChzY2hlbWEuaXRlbXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiBzY2hlbWEuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykpIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzY2hlbWEuaXRlbXMubGVuZ3RoOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxJdGVtcy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgdW5pcXVlSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhc2NoZW1hLnVuaXF1ZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdW5pcXVlID0gbmV3IFNldCgpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEpIHtcbiAgICAgIGxldCBpdGVtU3RyO1xuXG4gICAgICAvLyBDaGFuZ2Ugc3RyaW5nIHRvIFwic3RyaW5nXCIgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzXG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaXRlbVN0ciA9IGBzOiR7aXRlbX1gO1xuICAgICAgICAvLyBTb3J0IG9iamVjdCBrZXlzIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpdGVtKSkge1xuICAgICAgICBpdGVtU3RyID0gYG86JHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhpdGVtKS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgICAgIClcbiAgICAgICAgKX1gO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgIGl0ZW1TdHIgPSBKU09OLnN0cmluZ2lmeShpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1TdHIgPSBTdHJpbmcoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1bmlxdWUuaGFzKGl0ZW1TdHIpKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogaXRlbSB9KTtcbiAgICAgIH1cbiAgICAgIHVuaXF1ZS5hZGQoaXRlbVN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFN0cmluZ0tleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5MZW5ndGgoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluTGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgc2hvcnRlciB0aGFuIHRoZSBtaW5pbXVtIGxlbmd0aFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4TGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgcGF0dGVybihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVyblJlZ2V4cCA9IG5ldyBSZWdFeHAoc2NoZW1hLnBhdHRlcm4sIFwidVwiKTtcblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwIGluc3RhbmNlb2YgUmVnRXhwID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwLnRlc3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBpZiB3ZSByZWNlaXZlIGEgZm9ybWF0IHRoYXQgaXMgbm90IGRlZmluZWQsIHdlXG4gIC8vIHdpbGwgbm90IHRocm93IGFuIGVycm9yLCB3ZSBqdXN0IGlnbm9yZSBpdC5cbiAgZm9ybWF0KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSB8fCBmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBhcmVDbG9zZUVub3VnaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgTnVtYmVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIG1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWluID0gc2NoZW1hLm1pbmltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWluID0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID09PSB0cnVlKSB7XG4gICAgICBtaW4gKz0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPCBtaW4pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWF4ID0gc2NoZW1hLm1heGltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWF4ID0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gLSAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID09PSB0cnVlKSB7XG4gICAgICBtYXggLT0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPiBtYXgpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG11bHRpcGxlT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdW90aWVudCA9IGRhdGEgLyBzY2hlbWEubXVsdGlwbGVPZjtcblxuICAgIGlmICghaXNGaW5pdGUocXVvdGllbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhcmVDbG9zZUVub3VnaChxdW90aWVudCwgTWF0aC5yb3VuZChxdW90aWVudCkpKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgbXVsdGlwbGVPZlwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1pbmltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA8PSBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSArIDFlLTE1KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1pbmltdW1cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1heGltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA+PSBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFxuICAgICAgICBcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZXhjbHVzaXZlTWF4aW11bVwiLFxuICAgICAgICB7IGRhdGEgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBkZWVwRXF1YWwsIGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgT3RoZXJLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgZW51bShzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhbiBhcnJheSBvciBhbiBvYmplY3RcbiAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgICBjb25zdCBpc09iamVjdCA9IHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5lbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnVtSXRlbSA9IHNjaGVtYS5lbnVtW2ldO1xuXG4gICAgICAvLyBTaW1wbGUgZXF1YWxpdHkgY2hlY2tcbiAgICAgIGlmIChlbnVtSXRlbSA9PT0gZGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGRhdGEgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjaGVjayBmb3IgZGVlcCBlcXVhbGl0eVxuICAgICAgaWYgKFxuICAgICAgICAoaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KGVudW1JdGVtKSkgfHxcbiAgICAgICAgKGlzT2JqZWN0ICYmIHR5cGVvZiBlbnVtSXRlbSA9PT0gXCJvYmplY3RcIiAmJiBlbnVtSXRlbSAhPT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBpZiAoZGVlcEVxdWFsKGVudW1JdGVtLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYWxsT2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYWxsT2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFsbE9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFsbE9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSAhPT0gc2NoZW1hLmFsbE9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBhbnlPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYW55T2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYW55T2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFueU9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFueU9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzY2hlbWEuYW55T2ZbaV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLm9uZU9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm9uZU9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5vbmVPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEub25lT2ZbaV0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKEJvb2xlYW4oZGF0YSkgPT09IHNjaGVtYS5vbmVPZltpXSkge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhID09PSBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRDb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgY29uc3Qoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcbiAgICAgIGRhdGEgPT09IHNjaGVtYS5jb25zdCB8fFxuICAgICAgKGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzT2JqZWN0KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShkYXRhKSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgaWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm5vdCkpIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEubm90LiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQge1xuICBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIGRlZXBDbG9uZSxcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIGlzT2JqZWN0XG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7IEZvcm1hdHMgfSBmcm9tIFwiLi9mb3JtYXRzXCI7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHZvaWQgfCBWYWxpZGF0aW9uRXJyb3I7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHsgZGF0YTogYW55OyBlcnJvcjogVmFsaWRhdGlvbkVycm9yIHwgbnVsbDsgdmFsaWQ6IGJvb2xlYW4gfTtcbiAgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hO1xufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hU2hpZWxkIHtcbiAgcHJpdmF0ZSB0eXBlczogUmVjb3JkPHN0cmluZywgVHlwZUZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUgZm9ybWF0czogUmVjb3JkPHN0cmluZywgRm9ybWF0RnVuY3Rpb24gfCBmYWxzZT4gPSB7fTtcbiAgcHJpdmF0ZSBrZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUgaW1tdXRhYmxlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGltbXV0YWJsZSA9IGZhbHNlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICB0aGlzLmltbXV0YWJsZSA9IGltbXV0YWJsZTtcblxuICAgIGZvciAoY29uc3QgW3R5cGUsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoVHlwZXMpKSB7XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYWRkVHlwZSh0eXBlLCB2YWxpZGF0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleXdvcmQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoa2V5d29yZHMpKSB7XG4gICAgICB0aGlzLmFkZEtleXdvcmQoa2V5d29yZCwgdmFsaWRhdG9yIGFzIEtleXdvcmRGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZm9ybWF0LCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKEZvcm1hdHMpKSB7XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYWRkRm9ybWF0KGZvcm1hdCwgdmFsaWRhdG9yIGFzIEZvcm1hdEZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRUeXBlKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBUeXBlRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMudHlwZXNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVHlwZSBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLnR5cGVzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0VHlwZSh0eXBlOiBzdHJpbmcpOiBUeXBlRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZXNbdHlwZV07XG4gIH1cblxuICBhZGRGb3JtYXQobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IEZvcm1hdEZ1bmN0aW9uLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmZvcm1hdHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgRm9ybWF0IFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMuZm9ybWF0c1tuYW1lXSA9IHZhbGlkYXRvcjtcbiAgfVxuXG4gIGdldEZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2Uge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdHNbZm9ybWF0XTtcbiAgfVxuXG4gIGFkZEtleXdvcmQobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IEtleXdvcmRGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5rZXl3b3Jkc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBLZXl3b3JkIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMua2V5d29yZHNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRLZXl3b3JkKGtleXdvcmQ6IHN0cmluZyk6IEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy5rZXl3b3Jkc1trZXl3b3JkXTtcbiAgfVxuXG4gIGNvbXBpbGUoc2NoZW1hOiBhbnkpOiBWYWxpZGF0b3Ige1xuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYSk7XG4gICAgaWYgKCFjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWEpID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiSW52YWxpZCBzY2hlbWFcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgIFwiYW55XCIsXG4gICAgICAgICgpID0+IHt9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICBjb25zdCBjbG9uZWREYXRhID0gdGhpcy5pbW11dGFibGUgPyBkZWVwQ2xvbmUoZGF0YSkgOiBkYXRhO1xuICAgICAgY29uc3QgZXJyb3IgPSBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUoY2xvbmVkRGF0YSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGNsb25lZERhdGEsXG4gICAgICAgIGVycm9yOiBlcnJvciA/IGVycm9yIDogbnVsbCxcbiAgICAgICAgdmFsaWQ6ICFlcnJvclxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuY29tcGlsZWRTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdHJ1ZSkge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgYW55T2Y6IFt7fV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgb25lT2Y6IFtdXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgb25lT2Y6IFtzY2hlbWFdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hID0gZGVlcENsb25lKHNjaGVtYSkgYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgY29uc3QgZGVmaW5lVHlwZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXCJ0eXBlXCIsIHNjaGVtYSk7XG4gICAgY29uc3QgdHlwZVZhbGlkYXRpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuXG4gICAgbGV0IG1ldGhvZE5hbWUgPSBcIlwiO1xuXG4gICAgaWYgKFwidHlwZVwiIGluIHNjaGVtYSkge1xuICAgICAgY29uc3QgdHlwZXMgPSBBcnJheS5pc0FycmF5KHNjaGVtYS50eXBlKVxuICAgICAgICA/IHNjaGVtYS50eXBlXG4gICAgICAgIDogc2NoZW1hLnR5cGUuc3BsaXQoXCIsXCIpLm1hcCgodCkgPT4gdC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZVZhbGlkYXRpb25zLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgICBtZXRob2ROYW1lICs9IChtZXRob2ROYW1lID8gXCJfT1JfXCIgOiBcIlwiKSArIHZhbGlkYXRvci5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9IHR5cGVWYWxpZGF0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGlvbnNMZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlIGZvciBzY2hlbWFcIiwgeyBkYXRhOiBzY2hlbWEudHlwZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0eXBlVmFsaWRhdGlvbiA9IHR5cGVWYWxpZGF0aW9uc1swXTtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR5cGVWYWxpZGF0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZVZhbGlkYXRpb25zTGVuZ3RoID4gMSkge1xuICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZVZhbGlkYXRpb25zTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkpIHtcbiAgICAgIGlmIChrZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLnR5cGUgPSBzY2hlbWEudHlwZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleXdvcmRWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoa2V5KTtcbiAgICAgIGlmIChrZXl3b3JkVmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IGRlZmluZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoa2V5LCBzY2hlbWFba2V5XSk7XG4gICAgICAgIGlmIChjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgICAgICBjb25zdCBwcmV2VmFsaWRhdG9yID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlO1xuICAgICAgICAgIG1ldGhvZE5hbWUgKz0gYF9BTkRfJHtrZXl3b3JkVmFsaWRhdG9yLm5hbWV9YDtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcHJldlZhbGlkYXRvcihkYXRhKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWV0aG9kTmFtZSA9IGtleXdvcmRWYWxpZGF0b3IubmFtZTtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PlxuICAgICAgICAgICAgICAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIC8vIElmIHRoZSBrZXkgaXMgcHJvcGVydGllcyBnbyB0aHJvdWdoIGVhY2ggcHJvcGVydHkgYW5kIHRyeSB0byBjb21waWxlIGl0IGFzIGEgc2NoZW1hXG4gICAgICAgIGlmIChrZXkgPT09IFwicHJvcGVydGllc1wiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdWJLZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoXG4gICAgICAgICAgICAgIHNjaGVtYVtrZXldW3N1YktleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XS5tYXAoKHN1YlNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgdGhpcy5pc1NjaGVtYUxpa2Uoc3ViU2NoZW1hKVxuICAgICAgICAgICAgPyB0aGlzLmNvbXBpbGVTY2hlbWEoc3ViU2NoZW1hKVxuICAgICAgICAgICAgOiBzdWJTY2hlbWFcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGlsZWRTY2hlbWEgYXMgQ29tcGlsZWRTY2hlbWE7XG4gIH1cblxuICBpc1NjaGVtYUxpa2Uoc3ViU2NoZW1hOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoaXNPYmplY3Qoc3ViU2NoZW1hKSkge1xuICAgICAgaWYgKFwidHlwZVwiIGluIHN1YlNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc3ViS2V5IGluIHN1YlNjaGVtYSkge1xuICAgICAgICBpZiAoc3ViS2V5IGluIHRoaXMua2V5d29yZHMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BWU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLFdBQXFCLEdBQ3JCQyxhQUF1QixHQUN2QkMsS0FDQUMsT0FFUUMsVUFBVUMsRUFBVSxJQUFLQyxFQUFrQixLQUNqRCxJQUFJTixFQUFhLEdBQUdLLEtBQVdFLEtBQUtULFVBQ2hDRyxFQUFlLEdBQUdLLElBWXRCLFlBWHlCLElBQWRDLEtBQUtWLE9BQ1csaUJBQWRVLEtBQUtWLE1BQXFCVSxLQUFLVixRQUFRVSxLQUFLSixTQUNyREgsR0FBYyxJQUFJTyxLQUFLVixRQUV6QkksR0FBZ0IsSUFBSU0sS0FBS1YsUUFHM0JVLEtBQUtOLGFBQWVBLEVBQ3BCTSxLQUFLUCxXQUFhQSxFQUdiTyxLQUFLUixPQUFXUSxLQUFLUixpQkFBaUJMLEVBSXBDYSxLQUFLUixNQUFNSyxVQUFVSixFQUFZQyxHQUgvQk0sSUFJWCxDQUVBQyxXQUNFLE9BQU9ELEtBQUtILFdBQ2QsQ0FFUUssV0FDTixNQUFNQyxFQUFrQixDQUN0QmQsUUFBU1csS0FBS1gsUUFDZEUsUUFBU1MsS0FBS1QsUUFDZEQsS0FBTVUsS0FB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
|
|
1
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwiaW5zdGFuY2VQb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiX2dldFRyZWUiLCJ0cmVlIiwiZ2V0VHJlZSIsImdldFBhdGgiLCJGQUlMX0ZBU1RfREVGSU5FX0VSUk9SIiwiZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkiLCJrZXkiLCJmYWlsRmFzdCIsIktleXdvcmRFcnJvciIsImdldE5hbWVkRnVuY3Rpb24iLCJvcHRpb25zIiwiaGFzQ2hhbmdlZCIsInByZXYiLCJjdXJyZW50IiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiaSIsIk9iamVjdCIsImlzIiwiaXNPYmplY3QiLCJkZWVwQ2xvbmUiLCJvYmoiLCJjbG9uZUNsYXNzSW5zdGFuY2VzIiwic2VlbiIsIldlYWtNYXAiLCJoYXMiLCJnZXQiLCJjbG9uZSIsInN0cnVjdHVyZWRDbG9uZSIsInNldCIsImwiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInNvdXJjZSIsImZsYWdzIiwiTWFwIiwidmFsdWUiLCJlbnRyaWVzIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiQXJyYXlCdWZmZXIiLCJzbGljZSIsImlzVmlldyIsImNvbnN0cnVjdG9yIiwiYnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsIlByb21pc2UiLCJXZWFrU2V0IiwiY3JlYXRlIiwiZ2V0UHJvdG90eXBlT2YiLCJrZXlzIiwiUmVmbGVjdCIsIm93bktleXMiLCJkZXNjcmlwdG9ycyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZXNjcmlwdG9yIiwiZGVmaW5lUHJvcGVydHkiLCJpc0NvbXBpbGVkU2NoZW1hIiwic3ViU2NoZW1hIiwibmFtZSIsImZuIiwiVVVJRF9SRUdFWCIsIkRVUkFUSU9OX1JFR0VYIiwiREFURV9USU1FX1JFR0VYIiwiVVJJX1JFR0VYIiwiRU1BSUxfUkVHRVgiLCJJUFY0X1JFR0VYIiwiSVBWNl9SRUdFWCIsIklQVjZfU0hPUlRfUkVHRVgiLCJJUFY2X0ZVTExfUkVHRVgiLCJJUFY2X0lOVkFMSURfQ0hBUl9SRUdFWCIsIklQVjZfRkFTVF9GQUlMX1JFR0VYIiwiSE9TVE5BTUVfUkVHRVgiLCJEQVRFX1JFR0VYIiwiSlNPTl9QT0lOVEVSX1JFR0VYIiwiUkVMQVRJVkVfSlNPTl9QT0lOVEVSX1JFR0VYIiwiVElNRV9SRUdFWCIsIlVSSV9SRUZFUkVOQ0VfUkVHRVgiLCJVUklfVEVNUExBVEVfUkVHRVgiLCJJUklfUkVHRVgiLCJJUklfUkVGRVJFTkNFX1JFR0VYIiwiSUROX0VNQUlMX1JFR0VYIiwiSUROX0hPU1ROQU1FX1JFR0VYIiwiQkFDS19TTEFTSF9SRUdFWCIsIkRBWVNfSU5fTU9OVEgiLCJGb3JtYXRzIiwibWF0Y2giLCJ5ZWFyU3RyIiwibW9udGhTdHIiLCJkYXlTdHIiLCJob3VyU3RyIiwibWludXRlU3RyIiwic2Vjb25kU3RyIiwieWVhciIsIk51bWJlciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1heERheXMiLCJ1cmkiLCJ0ZXN0IiwiZW1haWwiLCJpcHY0IiwiaXB2NiIsImluZGV4T2YiLCJoYXNJcHY0IiwiYWRkcmVzc1BhcnRzIiwic3BsaXQiLCJpcHY0UGFydCIsInBvcCIsImlzU2hvcnRlbmVkIiwiaXB2NlBhcnQiLCJqb2luIiwiaXNJcHY2VmFsaWQiLCJoYXNJbnZhbGlkQ2hhciIsImhvc3RuYW1lIiwiZGF0ZSIsImV4ZWMiLCJyZWdleCIsImUiLCJ0aW1lIiwiZHVyYXRpb24iLCJ1dWlkIiwiaXJpIiwiVHlwZXMiLCJvYmplY3QiLCJhcnJheSIsInN0cmluZyIsIm51bWJlciIsImludGVnZXIiLCJib29sZWFuIiwibnVsbCIsInRpbWVzdGFtcCIsImludDgiLCJ1bml0OCIsImludDE2IiwidW5pdDE2IiwiaW50MzIiLCJ1bml0MzIiLCJmbG9hdDMyIiwiZmxvYXQ2NCIsImtleXdvcmRzIiwicmVxdWlyZWQiLCJkZWZpbmVFcnJvciIsImhhc093blByb3BlcnR5IiwicHJvcGVydGllcyIsInByb3BLZXlzIiwiX3Byb3BLZXlzIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwicmVxdWlyZWRLZXlzIiwiX3JlcXVpcmVkS2V5cyIsInNjaGVtYVByb3AiLCJwcm90b3R5cGUiLCJjYWxsIiwiZXJyb3IiLCIkdmFsaWRhdGUiLCJkZWZhdWx0IiwidmFsdWVTY2hlbWEiLCJ2YWxpZGF0ZSIsIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJhcElzQ29tcGlsZWQiLCJfYXBJc0NvbXBpbGVkIiwicGF0dGVybkxpc3QiLCJfcGF0dGVyblByb3BlcnRpZXNMaXN0IiwicGF0dGVyblByb3BlcnRpZXMiLCJwYXR0ZXJuIiwicHVzaCIsImoiLCJwYXR0ZXJucyIsImRhdGFLZXlzIiwicCIsInBhdHRlcm5LZXkiLCJwcm9wZXJ0eU5hbWVzIiwicG4iLCJkZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmN5IiwidGhlbiIsImVsc2UiLCJkZWZpbml0aW9ucyIsIiRpZCIsIiRzY2hlbWEiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiJGNvbW1lbnQiLCJleGFtcGxlcyIsImNvbnRlbnRNZWRpYVR5cGUiLCJjb250ZW50RW5jb2RpbmciLCJkaXNjcmltaW5hdG9yIiwibnVsbGFibGUiLCJpdGVtcyIsInNjaGVtYUl0ZW1zIiwiZGF0YUxlbmd0aCIsInNjaGVtYUl0ZW1zTGVuZ3RoIiwiaXRlbXNMZW5ndGgiLCJzY2hlbWFJdGVtIiwiZWxlbWVudHMiLCJlbGVtZW50c1NjaGVtYSIsIm1pbkl0ZW1zIiwibWF4SXRlbXMiLCJhZGRpdGlvbmFsSXRlbXMiLCJ1bmlxdWVJdGVtcyIsImxlbiIsInByaW1pdGl2ZVNlZW4iLCJ0eXBlIiwiY29udGFpbnMiLCJtaW5MZW5ndGgiLCJtYXhMZW5ndGgiLCJwYXR0ZXJuUmVnZXhwIiwiX3BhdHRlcm5SZWdleHAiLCJmb3JtYXQiLCJpbnN0YW5jZSIsImZvcm1hdFZhbGlkYXRlIiwiX2Zvcm1hdFZhbGlkYXRlIiwiZ2V0Rm9ybWF0IiwibWluaW11bSIsIm1pbiIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwibWF4IiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImlzRmluaXRlIiwiYSIsImIiLCJlcHNpbG9uIiwiTWF0aCIsImFicyIsImFyZUNsb3NlRW5vdWdoIiwicm91bmQiLCJlbnVtIiwibGlzdCIsImVudW1JdGVtIiwiYWxsT2YiLCJCb29sZWFuIiwiYW55T2YiLCJvbmVPZiIsInZhbGlkQ291bnQiLCJzdWIiLCJjb25zdCIsImlmIiwibm90IiwiJHJlZiIsIl9yZXNvbHZlZFJlZiIsInJlZlBhdGgiLCJ0YXJnZXRTY2hlbWEiLCJnZXRTY2hlbWFSZWYiLCJnZXRTY2hlbWFCeUlkIiwidHlwZXMiLCJmb3JtYXRzIiwiaW1tdXRhYmxlIiwicm9vdFNjaGVtYSIsImlkUmVnaXN0cnkiLCJ2YWxpZGF0b3IiLCJhZGRUeXBlIiwiYWRkS2V5d29yZCIsImFkZEZvcm1hdCIsIm92ZXJ3cml0ZSIsImdldFR5cGUiLCJnZXRLZXl3b3JkIiwicGF0aCIsInJvb3QiLCJzdGFydHNXaXRoIiwicGFydHMiLCJwYXJ0IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwicmVwbGFjZSIsImluY2x1ZGVzIiwiZGVmcyIsImVuZHNXaXRoIiwicmVzb2x2ZVBhdGgiLCJpZCIsImNvbXBpbGUiLCJjbGVhciIsImNvbXBpbGVkU2NoZW1hIiwiY29tcGlsZVNjaGVtYSIsImxpbmtSZWZlcmVuY2VzIiwiaXNTY2hlbWFMaWtlIiwiY2xvbmVkRGF0YSIsInJlcyIsInZhbGlkIiwicmVmVmFsaWRhdG9yIiwidmFsaWRhdG9ycyIsImFjdGl2ZU5hbWVzIiwiZGVmaW5lVHlwZUVycm9yIiwibWFwIiwidCIsInRyaW0iLCJ0eXBlRnVuY3Rpb25zIiwidHlwZU5hbWVzIiwiY29tYmluZWRUeXBlVmFsaWRhdG9yIiwidHlwZU1ldGhvZE5hbWUiLCJzaW5nbGVUeXBlRm4iLCJ0eXBlQWRhcHRlciIsIl9zIiwib3RoZXJLZXlzIiwia2V5T3JkZXIiLCJrZXl3b3JkRm4iLCJmbk5hbWUiLCJsaXRlcmFsS2V5d29yZHMiLCJzdWJLZXkiLCJ2IiwiY29tcG9zaXRlTmFtZSIsIm1hc3RlclZhbGlkYXRvciIsInN0YWNrIiwibm9kZSIsInRhcmdldCIsIl9kYXRhIl0sInNvdXJjZXMiOlsiLi4vbGliL3V0aWxzLnRzIiwiLi4vbGliL2Zvcm1hdHMudHMiLCIuLi9saWIvdHlwZXMudHMiLCIuLi9saWIva2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb2JqZWN0LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL2FycmF5LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb3RoZXIta2V5d29yZHMudHMiLCIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5pbnRlcmZhY2UgRXJyb3JUcmVlIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBrZXl3b3JkOiBzdHJpbmc7XG4gIGl0ZW0/OiBzdHJpbmcgfCBudW1iZXI7XG4gIHNjaGVtYVBhdGg6IHN0cmluZztcbiAgaW5zdGFuY2VQYXRoOiBzdHJpbmc7XG4gIGRhdGE/OiBhbnk7XG4gIGNhdXNlPzogRXJyb3JUcmVlO1xufVxuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGl0ZW0/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgY2F1c2U/OiBWYWxpZGF0aW9uRXJyb3I7XG4gIHNjaGVtYVBhdGg6IHN0cmluZyA9IFwiXCI7XG4gIGluc3RhbmNlUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgZGF0YT86IGFueTtcbiAgc2NoZW1hPzogQ29tcGlsZWRTY2hlbWE7XG5cbiAgcHJpdmF0ZSBfZ2V0Q2F1c2UocG9pbnRlciA9IFwiI1wiLCBpbnN0YW5jZVBvaW50ZXIgPSBcIiNcIik6IFZhbGlkYXRpb25FcnJvciB7XG4gICAgbGV0IHNjaGVtYVBhdGggPSBgJHtwb2ludGVyfS8ke3RoaXMua2V5d29yZH1gO1xuICAgIGxldCBpbnN0YW5jZVBhdGggPSBgJHtpbnN0YW5jZVBvaW50ZXJ9YDtcbiAgICBpZiAodHlwZW9mIHRoaXMuaXRlbSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLml0ZW0gPT09IFwic3RyaW5nXCIgJiYgdGhpcy5pdGVtIGluIHRoaXMuc2NoZW1hKSB7XG4gICAgICAgIHNjaGVtYVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgICAgfVxuICAgICAgaW5zdGFuY2VQYXRoICs9IGAvJHt0aGlzLml0ZW19YDtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RhbmNlUGF0aCA9IGluc3RhbmNlUGF0aDtcbiAgICB0aGlzLnNjaGVtYVBhdGggPSBzY2hlbWFQYXRoO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gY2F1c2Ugb3IgdGhlIGNhdXNlIGlzIG5vdCBhIFZhbGlkYXRpb25FcnJvciwgcmV0dXJuIHRoaXNcbiAgICBpZiAoIXRoaXMuY2F1c2UgfHwgISh0aGlzLmNhdXNlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2F1c2UuX2dldENhdXNlKHNjaGVtYVBhdGgsIGluc3RhbmNlUGF0aCk7XG4gIH1cblxuICBnZXRDYXVzZSgpOiBWYWxpZGF0aW9uRXJyb3Ige1xuICAgIHJldHVybiB0aGlzLl9nZXRDYXVzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VHJlZSgpOiBFcnJvclRyZWUge1xuICAgIGNvbnN0IHRyZWU6IEVycm9yVHJlZSA9IHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIGtleXdvcmQ6IHRoaXMua2V5d29yZCxcbiAgICAgIGl0ZW06IHRoaXMuaXRlbSxcbiAgICAgIHNjaGVtYVBhdGg6IHRoaXMuc2NoZW1hUGF0aCxcbiAgICAgIGluc3RhbmNlUGF0aDogdGhpcy5pbnN0YW5jZVBhdGgsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY2F1c2UpIHtcbiAgICAgIHRyZWUuY2F1c2UgPSB0aGlzLmNhdXNlLl9nZXRUcmVlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyZWU7XG4gIH1cblxuICBnZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgdGhpcy5nZXRDYXVzZSgpO1xuICAgIHJldHVybiB0aGlzLl9nZXRUcmVlKCk7XG4gIH1cblxuICBnZXRQYXRoKCkge1xuICAgIGNvbnN0IGNhdXNlID0gdGhpcy5nZXRDYXVzZSgpO1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWFQYXRoOiBjYXVzZS5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiBjYXVzZS5pbnN0YW5jZVBhdGhcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JPcHRpb25zIHtcbiAgaXRlbT86IGFueTsgLy8gRmluYWwgaXRlbSBpbiB0aGUgc2NoZW1hUGF0aFxuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvciB8IHRydWU7IC8vIENhdXNlIG9mIHRoZSBlcnJvclxuICBkYXRhPzogYW55OyAvLyBEYXRhIHRoYXQgY2F1c2VkIHRoZSBlcnJvclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmluZUVycm9yRnVuY3Rpb24ge1xuICAobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogRGVmaW5lRXJyb3JPcHRpb25zKTpcbiAgICB8IFZhbGlkYXRpb25FcnJvclxuICAgIHwgdm9pZFxuICAgIHwgdHJ1ZTtcbn1cbmNvbnN0IEZBSUxfRkFTVF9ERUZJTkVfRVJST1I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAoKSA9PiB0cnVlO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXG4gIGtleTogc3RyaW5nLFxuICBzY2hlbWE6IENvbXBpbGVkU2NoZW1hLFxuICBmYWlsRmFzdDogYm9vbGVhblxuKSB7XG4gIGlmIChmYWlsRmFzdCkge1xuICAgIHJldHVybiBGQUlMX0ZBU1RfREVGSU5FX0VSUk9SO1xuICB9XG5cbiAgY29uc3QgS2V5d29yZEVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCAke2tleX1gKTtcbiAgS2V5d29yZEVycm9yLmtleXdvcmQgPSBrZXk7XG4gIEtleXdvcmRFcnJvci5zY2hlbWEgPSBzY2hlbWE7XG5cbiAgY29uc3QgZGVmaW5lRXJyb3I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAobWVzc2FnZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgS2V5d29yZEVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIEtleXdvcmRFcnJvci5pdGVtID0gb3B0aW9ucy5pdGVtO1xuICAgIEtleXdvcmRFcnJvci5jYXVzZSA9XG4gICAgICBvcHRpb25zLmNhdXNlICYmIG9wdGlvbnMuY2F1c2UgIT09IHRydWUgPyBvcHRpb25zLmNhdXNlIDogdW5kZWZpbmVkO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0NoYW5nZWQocHJldjogYW55LCBjdXJyZW50OiBhbnkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJldikpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwcmV2Lmxlbmd0aCAhPT0gY3VycmVudC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhhc0NoYW5nZWQocHJldltpXSwgY3VycmVudFtpXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwcmV2ID09PSBcIm9iamVjdFwiICYmIHByZXYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnQgIT09IFwib2JqZWN0XCIgfHwgY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gY3VycmVudCkge1xuICAgICAgaWYgKGhhc0NoYW5nZWQocHJldltrZXldLCBjdXJyZW50W2tleV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHByZXYpIHtcbiAgICAgIGlmIChoYXNDaGFuZ2VkKHByZXZba2V5XSwgY3VycmVudFtrZXldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmlzKHByZXYsIGN1cnJlbnQpID09PSBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVDbG9zZUVub3VnaChhLCBiLCBlcHNpbG9uID0gMWUtMTUpIHtcbiAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSBlcHNpbG9uICogTWF0aC5tYXgoTWF0aC5hYnMoYSksIE1hdGguYWJzKGIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVURjE2TGVuZ3RoKHN0cikge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZW5ndGgrKztcbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcENsb25lPFQ+KFxuICBvYmo6IFQsXG4gIGNsb25lQ2xhc3NJbnN0YW5jZXMgPSBmYWxzZSxcbiAgc2VlbiA9IG5ldyBXZWFrTWFwKClcbik6IFQge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgIHJldHVybiBzZWVuLmdldChvYmopO1xuICB9XG5cbiAgbGV0IGNsb25lOiBhbnk7XG5cbiAgaWYgKHR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNsb25lID0gc3RydWN0dXJlZENsb25lKG9iaik7XG4gICAgc2Vlbi5zZXQob2JqLCBjbG9uZSk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgc3dpdGNoICh0cnVlKSB7XG4gICAgY2FzZSBBcnJheS5pc0FycmF5KG9iaik6IHtcbiAgICAgIGNsb25lID0gW107XG4gICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjbG9uZVtpXSA9IGRlZXBDbG9uZShvYmpbaV0sIGNsb25lQ2xhc3NJbnN0YW5jZXMsIHNlZW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIG9iaiBpbnN0YW5jZW9mIERhdGU6IHtcbiAgICAgIGNsb25lID0gbmV3IERhdGUob2JqLmdldFRpbWUoKSk7XG4gICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY2FzZSBvYmogaW5zdGFuY2VvZiBSZWdFeHA6IHtcbiAgICAgIGNsb25lID0gbmV3IFJlZ0V4cChvYmouc291cmNlLCBvYmouZmxhZ3MpO1xuICAgICAgc2Vlbi5zZXQob2JqLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugb2JqIGluc3RhbmNlb2YgTWFwOiB7XG4gICAgICBjbG9uZSA9IG5ldyBNYXAoKTtcbiAgICAgIHNlZW4uc2V0KG9iaiwgY2xvbmUpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqLmVudHJpZXMoKSkge1xuICAgICAgICBjbG9uZS5zZXQoXG4gICAgICAgICAgZGVlcENsb25lKGtleSwgY2xvbmVDbGFzc0luc3RhbmNlcywgc2VlbiksXG4gICAgICAgICAgZGVlcENsb25lKHZhbHVlLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIG9iaiBpbnN0YW5jZW9mIFNldDoge1xuICAgICAgY2xvbmUgPSBuZXcgU2V0KCk7XG4gICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqLnZhbHVlcygpKSB7XG4gICAgICAgIGNsb25lLmFkZChkZWVwQ2xvbmUodmFsdWUsIGNsb25lQ2xhc3NJbnN0YW5jZXMsIHNlZW4pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY2FzZSBvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjoge1xuICAgICAgY2xvbmUgPSBvYmouc2xpY2UoMCk7XG4gICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgLy8gVHlwZWRBcnJheXMgYW5kIERhdGFWaWV3XG4gICAgY2FzZSBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKToge1xuICAgICAgY2xvbmUgPSBuZXcgKG9iaiBhcyBhbnkpLmNvbnN0cnVjdG9yKG9iai5idWZmZXIuc2xpY2UoMCkpO1xuICAgICAgc2Vlbi5zZXQob2JqLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIE5vZGUuanMgQnVmZmVyXG4gICAgY2FzZSB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIG9iaiBpbnN0YW5jZW9mIEJ1ZmZlcjoge1xuICAgICAgY2xvbmUgPSBCdWZmZXIuZnJvbShvYmogYXMgYW55KTtcbiAgICAgIHNlZW4uc2V0KG9iaiwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIG9iaiBpbnN0YW5jZW9mIEVycm9yOiB7XG4gICAgICBjbG9uZSA9IG5ldyAob2JqIGFzIGFueSkuY29uc3RydWN0b3Iob2JqLm1lc3NhZ2UpO1xuICAgICAgc2Vlbi5zZXQob2JqLCBjbG9uZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm9uIGNsb25hYmxlIG9iamVjdHNcbiAgICBjYXNlIG9iaiBpbnN0YW5jZW9mIFByb21pc2UgfHxcbiAgICAgIG9iaiBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICAgIG9iaiBpbnN0YW5jZW9mIFdlYWtTZXQ6IHtcbiAgICAgIGNsb25lID0gb2JqO1xuICAgICAgc2Vlbi5zZXQob2JqLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIEluc3RhbmNlIG9mIGEgY2xhc3NcbiAgICBjYXNlIG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IgIT09IE9iamVjdDoge1xuICAgICAgaWYgKCFjbG9uZUNsYXNzSW5zdGFuY2VzKSB7XG4gICAgICAgIGNsb25lID0gb2JqO1xuICAgICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgfVxuICAgICAgY2xvbmUgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKTtcbiAgICAgIHNlZW4uc2V0KG9iaiwgY2xvbmUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGxhaW4gb2JqZWN0c1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNsb25lID0ge307XG4gICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcblxuICAgICAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhvYmopO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBjbG9uZVtrZXkgYXMgc3RyaW5nXSA9IGRlZXBDbG9uZShcbiAgICAgICAgICAob2JqIGFzIGFueSlba2V5IGFzIHN0cmluZ10sXG4gICAgICAgICAgY2xvbmVDbGFzc0luc3RhbmNlcyxcbiAgICAgICAgICBzZWVuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoZGVzY3JpcHRvcnMpKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2tleSBhcyBzdHJpbmddO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikge1xuICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGRlZXBDbG9uZShkZXNjcmlwdG9yLnZhbHVlLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb25lLCBrZXksIGRlc2NyaXB0b3IpO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21waWxlZFNjaGVtYShzdWJTY2hlbWE6IGFueSk6IHN1YlNjaGVtYSBpcyBDb21waWxlZFNjaGVtYSB7XG4gIHJldHVybiBpc09iamVjdChzdWJTY2hlbWEpICYmIFwiJHZhbGlkYXRlXCIgaW4gc3ViU2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZWRGdW5jdGlvbjxUPihuYW1lOiBzdHJpbmcsIGZuOiBUKTogVCB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIFwibmFtZVwiLCB7IHZhbHVlOiBuYW1lIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGgocm9vdDogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICBpZiAoIXBhdGggfHwgcGF0aCA9PT0gXCIjXCIpIHtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8vIEpTT04gUG9pbnRlclxuICBpZiAocGF0aC5zdGFydHNXaXRoKFwiIy9cIikpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDEpO1xuICAgIGxldCBjdXJyZW50ID0gcm9vdDtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgY29uc3QgZGVjb2RlZFVyaVBhcnQgPSBkZWNvZGVVUklDb21wb25lbnQocGFydCk7XG4gICAgICBjb25zdCBrZXkgPSBkZWNvZGVkVXJpUGFydC5yZXBsYWNlKC9+MS9nLCBcIi9cIikucmVwbGFjZSgvfjAvZywgXCJ+XCIpO1xuXG4gICAgICBpZiAoY3VycmVudCAmJiB0eXBlb2YgY3VycmVudCA9PT0gXCJvYmplY3RcIiAmJiBrZXkgaW4gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIC8vIFNpbXBsZSBsb29rdXAgYnkgZGVmaW5pdGlvbiBuYW1lIChub24tc3RhbmRhcmQsIGJ1dCB1c2VmdWwpXG4gIGlmICghcGF0aC5pbmNsdWRlcyhcIiNcIikpIHtcbiAgICBpZiAocm9vdC5kZWZpbml0aW9ucyAmJiByb290LmRlZmluaXRpb25zW3BhdGhdKSB7XG4gICAgICByZXR1cm4gcm9vdC5kZWZpbml0aW9uc1twYXRoXTtcbiAgICB9XG4gICAgaWYgKHJvb3QuZGVmcyAmJiByb290LmRlZnNbcGF0aF0pIHtcbiAgICAgIHJldHVybiByb290LmRlZnNbcGF0aF07XG4gICAgfVxuXG4gICAgaWYgKHJvb3QuJGlkICYmIHR5cGVvZiByb290LiRpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKHJvb3QuJGlkID09PSBwYXRoIHx8IHJvb3QuJGlkLmVuZHNXaXRoKFwiL1wiICsgcGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuIiwiaW1wb3J0IHsgRm9ybWF0RnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuXG4vLyBSZWdleCBoZWxwZXJzXG5jb25zdCBVVUlEX1JFR0VYID1cbiAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2k7XG4vLyBJU08gODYwMSBEdXJhdGlvbiAoUDNZNk00RFQxMkgzME01UylcbmNvbnN0IERVUkFUSU9OX1JFR0VYID1cbiAgL15QKD8hJCkoKFxcZCtZKT8oXFxkK00pPyhcXGQrVyk/KFxcZCtEKT8pKFQoPz1cXGQpKFxcZCtIKT8oXFxkK00pPyhcXGQrUyk/KT8kLztcbmNvbnN0IERBVEVfVElNRV9SRUdFWCA9XG4gIC9eKFxcZHs0fSktKDBbMC05XXwxWzAtMl0pLShcXGR7Mn0pVCgwWzAtOV18MVxcZHwyWzAtM10pOihbMC01XVxcZCk6KCg/OlswLTVdXFxkfDYwKSkoPzouXFxkKyk/KD86KFsrLV0pKDBbMC05XXwxXFxkfDJbMC0zXSk6KFswLTVdXFxkKXxaKT8kL2k7XG5jb25zdCBVUklfUkVHRVggPSAvXlthLXpBLVpdW2EtekEtWjAtOStcXC0uXSo6W15cXHNdKiQvO1xuY29uc3QgRU1BSUxfUkVHRVggPVxuICAvXig/IVxcLikoPyEuKlxcLiQpW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjB9KD86XFwuW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjF9KXswLDJ9QFthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyg/OlxcLlthLXowLTldKD86W2EtejAtOS1dezAsNjB9W2EtejAtOV0pPyl7MCwzfSQvaTtcbmNvbnN0IElQVjRfUkVHRVggPVxuICAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC87XG5jb25zdCBJUFY2X1JFR0VYID0gLyg/Olxccyt8Ojo6K3xeXFx3ezUsfXxcXHd7NX0kfF46ezF9XFx3fFxcdzp7MX0kKS87XG5jb25zdCBJUFY2X1NIT1JUX1JFR0VYID0gL15bMC05YS1mQS1GOi5dKiQvO1xuY29uc3QgSVBWNl9GVUxMX1JFR0VYID0gL14oPzooPzpbMC05YS1mQS1GXXsxLDR9Oil7N30oPzpbMC05YS1mQS1GXXsxLDR9fDopKSQvO1xuY29uc3QgSVBWNl9JTlZBTElEX0NIQVJfUkVHRVggPSAvKD86WzAtOWEtZkEtRl17NSx9fFxcRFswLTlhLWZBLUZdezN9OikvO1xuY29uc3QgSVBWNl9GQVNUX0ZBSUxfUkVHRVggPVxuICAvXig/Oig/Oig/OlswLTlhLWZBLUZdezEsNH0oPzo6fCQpKXsxLDZ9KSl8KD86OjooPzpbMC05YS1mQS1GXXsxLDR9KSl7MCw1fSQvO1xuY29uc3QgSE9TVE5BTUVfUkVHRVggPVxuICAvXlthLXowLTldW2EtejAtOS1dezAsNjJ9KD86XFwuW2EtejAtOV1bYS16MC05LV17MCw2Mn0pKlthLXowLTldJC9pO1xuY29uc3QgREFURV9SRUdFWCA9IC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLztcbmNvbnN0IEpTT05fUE9JTlRFUl9SRUdFWCA9IC9eXFwvKD86W15+XXx+MHx+MSkqJC87XG5jb25zdCBSRUxBVElWRV9KU09OX1BPSU5URVJfUkVHRVggPSAvXihbMC05XSspKCN8XFwvKD86W15+XXx+MHx+MSkqKT8kLztcbmNvbnN0IFRJTUVfUkVHRVggPVxuICAvXihbMDFdXFxkfDJbMC0zXSk6KFswLTVdXFxkKTooWzAtNV1cXGQpKFxcLlxcZCspPyhafChbKy1dKShbMDFdXFxkfDJbMC0zXSk6KFswLTVdXFxkKSkkLztcbmNvbnN0IFVSSV9SRUZFUkVOQ0VfUkVHRVggPVxuICAvXigoW146Lz8jXSspOik/KFxcL1xcLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoKD8hW14jXSpcXFxcKVteI10qKSk/L2k7XG5jb25zdCBVUklfVEVNUExBVEVfUkVHRVggPSAvXig/Oltee31dfFxce1tefV0rXFx9KSokLztcbmNvbnN0IElSSV9SRUdFWCA9IC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC87XG5jb25zdCBJUklfUkVGRVJFTkNFX1JFR0VYID1cbiAgL14oKFteOi8/I10rKTopPyhcXC9cXC8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKCg/IVteI10qXFxcXClbXiNdKikpPy9pO1xuY29uc3QgSUROX0VNQUlMX1JFR0VYID0gL15bXkBcXHNdK0BbXkBcXHNdK1xcLlteQFxcc10rJC87XG5jb25zdCBJRE5fSE9TVE5BTUVfUkVHRVggPSAvXlteXFxzIUAjJCVeJiooKV8rXFw9XFxbXFxde307JzpcIlxcXFx8LDw+XFwvP10rJC87XG5jb25zdCBCQUNLX1NMQVNIX1JFR0VYID0gL1xcXFwvO1xuXG5jb25zdCBEQVlTX0lOX01PTlRIID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuXG5leHBvcnQgY29uc3QgRm9ybWF0czogUmVjb3JkPHN0cmluZywgRm9ybWF0RnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIFtcImRhdGUtdGltZVwiXShkYXRhKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBkYXRhLm1hdGNoKERBVEVfVElNRV9SRUdFWCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyXSA9IG1hdGNoO1xuXG4gICAgY29uc3QgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBjb25zdCBtb250aCA9IE51bWJlcihtb250aFN0cik7XG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGRheVN0cik7XG4gICAgY29uc3QgaG91ciA9IE51bWJlcihob3VyU3RyKTtcbiAgICBjb25zdCBtaW51dGUgPSBOdW1iZXIobWludXRlU3RyKTtcbiAgICBjb25zdCBzZWNvbmQgPSBOdW1iZXIoc2Vjb25kU3RyKTtcblxuICAgIC8vIE1lcyAx4oCTMTJcbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRMOtYSA+PSAxXG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIGlmICghbWF4RGF5cyB8fCBkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTGVhcCBzZWNvbmRzIChzaSBxdWllcmVzIHNlZ3VpciBwZXJtaXRpZW5kbyA2MClcbiAgICBpZiAoc2Vjb25kID09PSA2MCAmJiAobWludXRlICE9PSA1OSB8fCBob3VyICE9PSAyMykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgdXJpKGRhdGEpIHtcbiAgICByZXR1cm4gVVJJX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG4gIGVtYWlsKGRhdGEpIHtcbiAgICByZXR1cm4gRU1BSUxfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgaXB2NChkYXRhKSB7XG4gICAgLy8gTWF0Y2hlcyBhIHN0cmluZyBmb3JtZWQgYnkgNCBudW1iZXJzIGJldHdlZW4gMCBhbmQgMjU1IHNlcGFyYXRlZCBieSBkb3RzIHdpdGhvdXQgbGVhZGluZyB6ZXJvc1xuICAgIHJldHVybiBJUFY0X1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgLy8gaXB2NjogaXNNeUlwVmFsaWQoeyB2ZXJzaW9uOiA2IH0pLFxuICBpcHY2KGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gXCI6OlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5pbmRleE9mKFwiOlwiKSA9PT0gLTEgfHwgSVBWNl9SRUdFWC50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzSXB2NCA9IGRhdGEuaW5kZXhPZihcIi5cIikgIT09IC0xO1xuICAgIGxldCBhZGRyZXNzUGFydHMgPSBkYXRhO1xuXG4gICAgaWYgKGhhc0lwdjQpIHtcbiAgICAgIGFkZHJlc3NQYXJ0cyA9IGRhdGEuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgaXB2NFBhcnQgPSBhZGRyZXNzUGFydHMucG9wKCk7XG4gICAgICBpZiAoIUlQVjRfUkVHRVgudGVzdChpcHY0UGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2hvcnRlbmVkID0gZGF0YS5pbmRleE9mKFwiOjpcIikgIT09IC0xO1xuICAgIGNvbnN0IGlwdjZQYXJ0ID0gaGFzSXB2NCA/IGFkZHJlc3NQYXJ0cy5qb2luKFwiOlwiKSA6IGRhdGE7XG5cbiAgICBpZiAoaXNTaG9ydGVuZWQpIHtcbiAgICAgIGlmIChpcHY2UGFydC5zcGxpdChcIjo6XCIpLmxlbmd0aCAtIDEgPiAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFJUFY2X1NIT1JUX1JFR0VYLnRlc3QoaXB2NlBhcnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIElQVjZfRkFTVF9GQUlMX1JFR0VYLnRlc3QoaXB2NlBhcnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzSXB2NlZhbGlkID0gSVBWNl9GVUxMX1JFR0VYLnRlc3QoaXB2NlBhcnQpO1xuICAgIGNvbnN0IGhhc0ludmFsaWRDaGFyID0gSVBWNl9JTlZBTElEX0NIQVJfUkVHRVgudGVzdChpcHY2UGFydCk7XG5cbiAgICBpZiAoaGFzSXB2NCkge1xuICAgICAgcmV0dXJuIGlzSXB2NlZhbGlkIHx8ICFoYXNJbnZhbGlkQ2hhcjtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNJcHY2VmFsaWQgJiYgIWhhc0ludmFsaWRDaGFyO1xuICB9LFxuXG4gIGhvc3RuYW1lKGRhdGEpIHtcbiAgICByZXR1cm4gSE9TVE5BTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBEQVRFX1JFR0VYLmV4ZWMoZGF0YSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHJdID0gbWF0Y2g7XG4gICAgY29uc3QgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBjb25zdCBtb250aCA9IE51bWJlcihtb250aFN0cik7XG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGRheVN0cik7XG5cbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIHJldHVybiAhIW1heERheXMgJiYgZGF5IDw9IG1heERheXM7XG4gIH0sXG4gIHJlZ2V4KGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChkYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFwianNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gSlNPTl9QT0lOVEVSX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gUkVMQVRJVkVfSlNPTl9QT0lOVEVSX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG4gIHRpbWUoZGF0YSkge1xuICAgIHJldHVybiBUSU1FX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG4gIFwidXJpLXJlZmVyZW5jZVwiKGRhdGEpIHtcbiAgICBpZiAoQkFDS19TTEFTSF9SRUdFWC50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVSSV9SRUZFUkVOQ0VfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICBcInVyaS10ZW1wbGF0ZVwiKGRhdGEpIHtcbiAgICByZXR1cm4gVVJJX1RFTVBMQVRFX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgZHVyYXRpb24oZGF0YSkge1xuICAgIHJldHVybiBEVVJBVElPTl9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuXG4gIHV1aWQoZGF0YSkge1xuICAgIHJldHVybiBVVUlEX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgLy8gSVJJIGlzIGxpa2UgVVJJIGJ1dCBhbGxvd3MgVW5pY29kZS4gV2UgcmV1c2UgYSBwZXJtaXNzaXZlIGxvZ2ljLlxuICBpcmkoZGF0YSkge1xuICAgIHJldHVybiBJUklfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICBcImlyaS1yZWZlcmVuY2VcIihkYXRhKSB7XG4gICAgaWYgKEJBQ0tfU0xBU0hfUkVHRVgudGVzdChkYXRhKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gSVJJX1JFRkVSRU5DRV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuXG4gIC8vIEJlc3QtZWZmb3J0IHN0cnVjdHVyYWwgdmFsaWRhdGlvbiBmb3IgSUROIChubyBwdW55Y29kZS90YWJsZXMpXG4gIFwiaWRuLWVtYWlsXCIoZGF0YSkge1xuICAgIHJldHVybiBJRE5fRU1BSUxfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICBcImlkbi1ob3N0bmFtZVwiKGRhdGEpIHtcbiAgICAvLyBBbGxvd3MgdW5pY29kZSwgZm9yYmlkcyBzcGFjZXMgYW5kIHR5cGljYWwgaW52YWxpZCBVUkwgY2hhcnNcbiAgICByZXR1cm4gSUROX0hPU1ROQU1FX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBUeXBlRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgVHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgb2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVuaXQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1bml0MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVuaXQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxufTtcbiIsImltcG9ydCB7IEFycmF5S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IE51bWJlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvbnVtYmVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPYmplY3RLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL29iamVjdC1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT3RoZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL290aGVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBTdHJpbmdLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkc1wiO1xuXG5leHBvcnQgY29uc3Qga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgLi4uT2JqZWN0S2V5d29yZHMsXG4gIC4uLkFycmF5S2V5d29yZHMsXG4gIC4uLlN0cmluZ0tleXdvcmRzLFxuICAuLi5OdW1iZXJLZXl3b3JkcyxcbiAgLi4uT3RoZXJLZXl3b3Jkc1xufTtcbiIsImltcG9ydCB7IGRlZXBDbG9uZSwgaXNDb21waWxlZFNjaGVtYSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHByb3BLZXlzID0gKHNjaGVtYSBhcyBhbnkpLl9wcm9wS2V5cyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXByb3BLZXlzKSB7XG4gICAgICBwcm9wS2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzIHx8IHt9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzY2hlbWEsIFwiX3Byb3BLZXlzXCIsIHtcbiAgICAgICAgdmFsdWU6IHByb3BLZXlzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWlyZWRLZXlzID0gKHNjaGVtYSBhcyBhbnkpLl9yZXF1aXJlZEtleXMgYXNcbiAgICAgIHwgc3RyaW5nW11cbiAgICAgIHwgbnVsbFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcXVpcmVkS2V5cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1aXJlZEtleXMgPSBBcnJheS5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZCkgPyBzY2hlbWEucmVxdWlyZWQgOiBudWxsO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfcmVxdWlyZWRLZXlzXCIsIHtcbiAgICAgICAgdmFsdWU6IHJlcXVpcmVkS2V5cyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWlyZWQgPSByZXF1aXJlZEtleXMgfHwgW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wS2V5c1tpXTtcbiAgICAgIGNvbnN0IHNjaGVtYVByb3AgPSBzY2hlbWEucHJvcGVydGllc1trZXldO1xuXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXF1aXJlZC5sZW5ndGggJiZcbiAgICAgICAgICByZXF1aXJlZC5pbmRleE9mKGtleSkgIT09IC0xICYmXG4gICAgICAgICAgaXNPYmplY3Qoc2NoZW1hUHJvcCkgJiZcbiAgICAgICAgICBcImRlZmF1bHRcIiBpbiBzY2hlbWFQcm9wXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoc2NoZW1hUHJvcC5kZWZhdWx0KTtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlZmF1bHQgcHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBzY2hlbWFQcm9wLmRlZmF1bHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkYXRhW2tleV0gPSBkZWVwQ2xvbmUoc2NoZW1hUHJvcC5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWFQcm9wID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoc2NoZW1hUHJvcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYVByb3AgJiYgXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWFQcm9wKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgdmFsdWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVTY2hlbWEgPSBzY2hlbWEudmFsdWVzO1xuICAgIGNvbnN0IHZhbGlkYXRlID0gdmFsdWVTY2hlbWEgJiYgdmFsdWVTY2hlbWEuJHZhbGlkYXRlO1xuICAgIGlmICh0eXBlb2YgdmFsaWRhdGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoIDw9IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVG9vIG1hbnkgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWluUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJUb28gZmV3IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuXG4gICAgbGV0IGFwSXNDb21waWxlZCA9IChzY2hlbWEgYXMgYW55KS5fYXBJc0NvbXBpbGVkIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFwSXNDb21waWxlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcElzQ29tcGlsZWQgPSBpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9hcElzQ29tcGlsZWRcIiwge1xuICAgICAgICB2YWx1ZTogYXBJc0NvbXBpbGVkLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHBhdHRlcm5MaXN0ID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuUHJvcGVydGllc0xpc3QgYXNcbiAgICAgIHwgeyByZWdleDogUmVnRXhwOyBrZXk6IHN0cmluZyB9W11cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyAmJiAhcGF0dGVybkxpc3QpIHtcbiAgICAgIHBhdHRlcm5MaXN0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIHBhdHRlcm5MaXN0LnB1c2goe1xuICAgICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKHBhdHRlcm4sIFwidVwiKSxcbiAgICAgICAgICBrZXk6IHBhdHRlcm5cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuUHJvcGVydGllc0xpc3RcIiwge1xuICAgICAgICB2YWx1ZTogcGF0dGVybkxpc3QsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcyAmJiBzY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGF0dGVybkxpc3QgJiYgcGF0dGVybkxpc3QubGVuZ3RoKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBhdHRlcm5MaXN0Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHBhdHRlcm5MaXN0W2pdLnJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcElzQ29tcGlsZWQgJiYgaXNDb21waWxlZFNjaGVtYShzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMpKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBZGRpdGlvbmFsIHByb3BlcnRpZXMgYXJlIGludmFsaWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG4gIHBhdHRlcm5Qcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBhdHRlcm5MaXN0ID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuUHJvcGVydGllc0xpc3QgYXNcbiAgICAgIHwgeyByZWdleDogUmVnRXhwOyBrZXk6IHN0cmluZyB9W11cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFwYXR0ZXJuTGlzdCkge1xuICAgICAgcGF0dGVybkxpc3QgPSBbXTtcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzIHx8IHt9KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHBhdHRlcm5zW2ldO1xuICAgICAgICBwYXR0ZXJuTGlzdC5wdXNoKHtcbiAgICAgICAgICByZWdleDogbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIiksXG4gICAgICAgICAga2V5OiBwYXR0ZXJuXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfcGF0dGVyblByb3BlcnRpZXNMaXN0XCIsIHtcbiAgICAgICAgdmFsdWU6IHBhdHRlcm5MaXN0LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcblxuICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcGF0dGVybkxpc3QubGVuZ3RoOyBwKyspIHtcbiAgICAgIGNvbnN0IHsgcmVnZXgsIGtleTogcGF0dGVybktleSB9ID0gcGF0dGVybkxpc3RbcF07XG4gICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5LZXldO1xuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYVByb3AgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChzY2hlbWFQcm9wID09PSBmYWxzZSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGRhdGFLZXlzW2ldO1xuICAgICAgICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGRhdGFLZXlzW2ldO1xuICAgICAgICAgIGlmIChyZWdleC50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG4gIHByb3BlcnR5TmFtZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbiA9IHNjaGVtYS5wcm9wZXJ0eU5hbWVzO1xuXG4gICAgaWYgKHR5cGVvZiBwbiA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChwbiA9PT0gZmFsc2UgJiYgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGUgPSBwbiAmJiBwbi4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoa2V5KTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBuYW1lIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBkZXBlbmRlbmNpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAoa2V5IGluIGRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXBlbmRlbmN5ID0gc2NoZW1hLmRlcGVuZGVuY2llc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCEoZGVwZW5kZW5jeVtpXSBpbiBkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgZGF0YTogZGVwZW5kZW5jeVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSBpbiBkYXRhKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHsgZGF0YTogZGVwZW5kZW5jeSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gZGVwZW5kZW5jeS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgLy8gUmVxdWlyZWQgYnkgb3RoZXIga2V5d29yZHMgYnV0IG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24gaXRzZWxmXG4gIHRoZW46IGZhbHNlLFxuICBlbHNlOiBmYWxzZSxcbiAgZGVmYXVsdDogZmFsc2UsXG5cbiAgLy8gTm90IGltcGxlbWVudGVkIHlldFxuICBkZWZpbml0aW9uczogZmFsc2UsXG4gICRpZDogZmFsc2UsXG4gICRzY2hlbWE6IGZhbHNlLFxuXG4gIC8vIE1ldGFkYXRhIGtleXdvcmRzIChub3QgdXNlZCBhcyBhIGZ1bmN0aW9uKVxuICB0aXRsZTogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgJGNvbW1lbnQ6IGZhbHNlLFxuICBleGFtcGxlczogZmFsc2UsXG4gIGNvbnRlbnRNZWRpYVR5cGU6IGZhbHNlLFxuICBjb250ZW50RW5jb2Rpbmc6IGZhbHNlLFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgT3BlbiBBUEkga2V5d29yZHNcbiAgZGlzY3JpbWluYXRvcjogZmFsc2UsXG4gIG51bGxhYmxlOiBmYWxzZVxufTtcbiIsImltcG9ydCB7IGhhc0NoYW5nZWQsIGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgQXJyYXlLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgLy8gbGliL2tleXdvcmRzL2FycmF5LWtleXdvcmRzLnRzXG4gIGl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWFJdGVtcyA9IHNjaGVtYS5pdGVtcztcbiAgICBjb25zdCBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW1zID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYUl0ZW1zID09PSBmYWxzZSAmJiBkYXRhTGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IGFsbG93ZWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYUl0ZW1zKSkge1xuICAgICAgY29uc3Qgc2NoZW1hSXRlbXNMZW5ndGggPSBzY2hlbWFJdGVtcy5sZW5ndGg7XG4gICAgICBjb25zdCBpdGVtc0xlbmd0aCA9XG4gICAgICAgIHNjaGVtYUl0ZW1zTGVuZ3RoIDwgZGF0YUxlbmd0aCA/IHNjaGVtYUl0ZW1zTGVuZ3RoIDogZGF0YUxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYUl0ZW0gPSBzY2hlbWFJdGVtc1tpXTtcblxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYUl0ZW0gPT09IGZhbHNlICYmIGRhdGFbaV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlID0gc2NoZW1hSXRlbSAmJiBzY2hlbWFJdGVtLiR2YWxpZGF0ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZShkYXRhW2ldKTtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IHNjaGVtYUl0ZW1zICYmIHNjaGVtYUl0ZW1zLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZShkYXRhW2ldKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGVsZW1lbnRzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50c1NjaGVtYSA9IHNjaGVtYS5lbGVtZW50cztcbiAgICBjb25zdCB2YWxpZGF0ZSA9IGVsZW1lbnRzU2NoZW1hICYmIGVsZW1lbnRzU2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtaW5JdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8IGRhdGEubGVuZ3RoID49IHNjaGVtYS5taW5JdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBzaG9ydFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4SXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA8PSBzY2hlbWEubWF4SXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gbG9uZ1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIXNjaGVtYS5pdGVtcyB8fCBpc09iamVjdChzY2hlbWEuaXRlbXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiBzY2hlbWEuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykpIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzY2hlbWEuaXRlbXMubGVuZ3RoOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxJdGVtcy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgdW5pcXVlSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhc2NoZW1hLnVuaXF1ZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gICAgaWYgKGxlbiA8PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJpbWl0aXZlU2VlbiA9IG5ldyBTZXQ8YW55PigpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGRhdGFbaV07XG4gICAgICBjb25zdCB0eXBlID0gdHlwZW9mIGl0ZW07XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSA9PT0gbnVsbCB8fFxuICAgICAgICB0eXBlID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgIHR5cGUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgdHlwZSA9PT0gXCJib29sZWFuXCJcbiAgICAgICkge1xuICAgICAgICBpZiAocHJpbWl0aXZlU2Vlbi5oYXMoaXRlbSkpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJpbWl0aXZlU2Vlbi5hZGQoaXRlbSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGk7IGorKykge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSBkYXRhW2pdO1xuICAgICAgICAgIGlmIChwcmV2ICYmIHR5cGVvZiBwcmV2ID09PSBcIm9iamVjdFwiICYmICFoYXNDaGFuZ2VkKHByZXYsIGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBGb3JtYXRGdW5jdGlvbiwgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgbWluTGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heExlbmd0aChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8IGRhdGEubGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIHBhdHRlcm4oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwYXR0ZXJuUmVnZXhwID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuUmVnZXhwIGFzIFJlZ0V4cCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXBhdHRlcm5SZWdleHApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhdHRlcm5SZWdleHAgPSBuZXcgUmVnRXhwKHNjaGVtYS5wYXR0ZXJuLCBcInVcIik7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzY2hlbWEsIFwiX3BhdHRlcm5SZWdleHBcIiwge1xuICAgICAgICAgIHZhbHVlOiBwYXR0ZXJuUmVnZXhwLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwLnRlc3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBpZiB3ZSByZWNlaXZlIGEgZm9ybWF0IHRoYXQgaXMgbm90IGRlZmluZWQsIHdlXG4gIC8vIHdpbGwgbm90IHRocm93IGFuIGVycm9yLCB3ZSBqdXN0IGlnbm9yZSBpdC5cbiAgZm9ybWF0KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGZvcm1hdFZhbGlkYXRlID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRWYWxpZGF0ZSBhc1xuICAgICAgfCBGb3JtYXRGdW5jdGlvblxuICAgICAgfCBmYWxzZVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZm9ybWF0VmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWxpZGF0ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSB8fCBmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBhcmVDbG9zZUVub3VnaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgTnVtYmVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIG1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWluID0gc2NoZW1hLm1pbmltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWluID0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID09PSB0cnVlKSB7XG4gICAgICBtaW4gKz0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPCBtaW4pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWF4ID0gc2NoZW1hLm1heGltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWF4ID0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gLSAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID09PSB0cnVlKSB7XG4gICAgICBtYXggLT0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPiBtYXgpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG11bHRpcGxlT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdW90aWVudCA9IGRhdGEgLyBzY2hlbWEubXVsdGlwbGVPZjtcblxuICAgIGlmICghaXNGaW5pdGUocXVvdGllbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhcmVDbG9zZUVub3VnaChxdW90aWVudCwgTWF0aC5yb3VuZChxdW90aWVudCkpKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgbXVsdGlwbGVPZlwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1pbmltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA8PSBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSArIDFlLTE1KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1pbmltdW1cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1heGltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA+PSBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFxuICAgICAgICBcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZXhjbHVzaXZlTWF4aW11bVwiLFxuICAgICAgICB7IGRhdGEgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBoYXNDaGFuZ2VkLCBpc0NvbXBpbGVkU2NoZW1hLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE90aGVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIGVudW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGNvbnN0IGxpc3QgPSBzY2hlbWEuZW51bTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZW51bUl0ZW0gPSBsaXN0W2ldO1xuXG4gICAgICBpZiAoZW51bUl0ZW0gPT09IGRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGVudW1JdGVtICE9PSBudWxsICYmXG4gICAgICAgIGRhdGEgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIGVudW1JdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFoYXNDaGFuZ2VkKGVudW1JdGVtLCBkYXRhKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3Qgb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWxsT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmFsbE9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFsbE9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEuYWxsT2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hbGxPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBjYXVzZTogZXJyb3IsIGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5hbGxPZltpXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKEJvb2xlYW4oZGF0YSkgIT09IHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhICE9PSBzY2hlbWEuYWxsT2ZbaV0pIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgYW55T2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmFueU9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFueU9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEuYW55T2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hbnlPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5hbnlPZltpXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEgPT09IHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgb25lT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGNvbnN0IGxpc3QgPSBzY2hlbWEub25lT2Y7XG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWIgPSBsaXN0W2ldO1xuXG4gICAgICBpZiAoaXNPYmplY3Qoc3ViKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzdWIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHN1Yi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzdWIgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzdWIpIHtcbiAgICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgPT09IHN1Yikge1xuICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIGlmICh2YWxpZENvdW50ID4gMSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRDb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgY29uc3Qoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChkYXRhID09PSBzY2hlbWEuY29uc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAoaXNPYmplY3QoZGF0YSkgJiZcbiAgICAgICAgaXNPYmplY3Qoc2NoZW1hLmNvbnN0KSAmJlxuICAgICAgICAhaGFzQ2hhbmdlZChkYXRhLCBzY2hlbWEuY29uc3QpKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShzY2hlbWEuY29uc3QpICYmXG4gICAgICAgICFoYXNDaGFuZ2VkKGRhdGEsIHNjaGVtYS5jb25zdCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgaWYoc2NoZW1hLCBkYXRhKSB7XG4gICAgaWYgKFwidGhlblwiIGluIHNjaGVtYSA9PT0gZmFsc2UgJiYgXCJlbHNlXCIgaW4gc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNjaGVtYS5pZiA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWEuaWYpIHtcbiAgICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnRoZW4pKSB7XG4gICAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5lbHNlKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLmVsc2UuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNDb21waWxlZFNjaGVtYShzY2hlbWEuaWYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuaWYuJHZhbGlkYXRlKGRhdGEpO1xuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLnRoZW4uJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0sXG5cbiAgbm90KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIHNjaGVtYS5ub3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLm5vdCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc09iamVjdChzY2hlbWEubm90KSkge1xuICAgICAgaWYgKFwiJHZhbGlkYXRlXCIgaW4gc2NoZW1hLm5vdCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5ub3QuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICAkcmVmKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHNjaGVtYS5fcmVzb2x2ZWRSZWYpIHtcbiAgICAgIHJldHVybiBzY2hlbWEuX3Jlc29sdmVkUmVmKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZlBhdGggPSBzY2hlbWEuJHJlZjtcbiAgICBsZXQgdGFyZ2V0U2NoZW1hID0gaW5zdGFuY2UuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHRhcmdldFNjaGVtYSA9IGluc3RhbmNlLmdldFNjaGVtYUJ5SWQocmVmUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihgTWlzc2luZyByZWZlcmVuY2U6ICR7cmVmUGF0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlbWEuX3Jlc29sdmVkUmVmID0gdGFyZ2V0U2NoZW1hLiR2YWxpZGF0ZTtcbiAgICByZXR1cm4gc2NoZW1hLl9yZXNvbHZlZFJlZihkYXRhKTtcbiAgfVxufTtcbiIsIi8qKioqKioqKioqKioqKioqKiogUGF0aDogbGliL2luZGV4LnRzICoqKioqKioqKioqKioqKioqKi9cbmltcG9ydCB7XG4gIERlZmluZUVycm9yRnVuY3Rpb24sXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgZGVlcENsb25lLFxuICBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleSxcbiAgZ2V0TmFtZWRGdW5jdGlvbixcbiAgaXNPYmplY3QsXG4gIHJlc29sdmVQYXRoXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7IEZvcm1hdHMgfSBmcm9tIFwiLi9mb3JtYXRzXCI7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzXCI7XG5cbmV4cG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgdHlwZSBSZXN1bHQgPSB2b2lkIHwgVmFsaWRhdGlvbkVycm9yIHwgdHJ1ZTtcblxuZXhwb3J0IGludGVyZmFjZSBLZXl3b3JkRnVuY3Rpb24ge1xuICAoXG4gICAgc2NoZW1hOiBDb21waWxlZFNjaGVtYSxcbiAgICBkYXRhOiBhbnksXG4gICAgZGVmaW5lRXJyb3I6IERlZmluZUVycm9yRnVuY3Rpb24sXG4gICAgaW5zdGFuY2U6IFNjaGVtYVNoaWVsZFxuICApOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZUZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0RnVuY3Rpb24ge1xuICAoZGF0YTogYW55KTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0ZUZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IFJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21waWxlZFNjaGVtYSB7XG4gICR2YWxpZGF0ZT86IFZhbGlkYXRlRnVuY3Rpb247XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0b3Ige1xuICAoZGF0YTogYW55KToge1xuICAgIGRhdGE6IGFueTtcbiAgICBlcnJvcjogVmFsaWRhdGlvbkVycm9yIHwgbnVsbCB8IHRydWU7XG4gICAgdmFsaWQ6IGJvb2xlYW47XG4gIH07XG4gIGNvbXBpbGVkU2NoZW1hOiBDb21waWxlZFNjaGVtYTtcbn1cblxuaW50ZXJmYWNlIFZhbGlkYXRvckl0ZW0ge1xuICBmbjogS2V5d29yZEZ1bmN0aW9uO1xuICBkZWZpbmVFcnJvcjogRGVmaW5lRXJyb3JGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYVNoaWVsZCB7XG4gIHByaXZhdGUgdHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGltbXV0YWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIHJvb3RTY2hlbWE6IENvbXBpbGVkU2NoZW1hIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaWRSZWdpc3RyeTogTWFwPHN0cmluZywgQ29tcGlsZWRTY2hlbWE+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZhaWxGYXN0OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW1tdXRhYmxlID0gZmFsc2UsXG4gICAgZmFpbEZhc3QgPSB0cnVlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIGZhaWxGYXN0PzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5mYWlsRmFzdCA9IGZhaWxGYXN0O1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhUeXBlcykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRUeXBlKHR5cGUsIHZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhrZXl3b3JkcykpIHtcbiAgICAgIHRoaXMuYWRkS2V5d29yZChrZXl3b3JkLCB2YWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmb3JtYXQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoRm9ybWF0cykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtYXQoZm9ybWF0LCB2YWxpZGF0b3IgYXMgRm9ybWF0RnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFR5cGUobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IFR5cGVGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy50eXBlc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBUeXBlIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMudHlwZXNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRUeXBlKHR5cGU6IHN0cmluZyk6IFR5cGVGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy50eXBlc1t0eXBlXTtcbiAgfVxuXG4gIGFkZEZvcm1hdChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogRm9ybWF0RnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0c1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBGb3JtYXQgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtYXRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0Rm9ybWF0KGZvcm1hdDogc3RyaW5nKTogRm9ybWF0RnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgYWRkS2V5d29yZChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogS2V5d29yZEZ1bmN0aW9uLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmtleXdvcmRzW25hbWVdICYmICFvdmVyd3JpdGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEtleXdvcmQgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy5rZXl3b3Jkc1tuYW1lXSA9IHZhbGlkYXRvcjtcbiAgfVxuXG4gIGdldEtleXdvcmQoa2V5d29yZDogc3RyaW5nKTogS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2Uge1xuICAgIHJldHVybiB0aGlzLmtleXdvcmRzW2tleXdvcmRdO1xuICB9XG5cbiAgZ2V0U2NoZW1hUmVmKHBhdGg6IHN0cmluZyk6IENvbXBpbGVkU2NoZW1hIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMucm9vdFNjaGVtYSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZVBhdGgodGhpcy5yb290U2NoZW1hLCBwYXRoKTtcbiAgfVxuXG4gIGdldFNjaGVtYUJ5SWQoaWQ6IHN0cmluZyk6IENvbXBpbGVkU2NoZW1hIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5pZFJlZ2lzdHJ5LmdldChpZCk7XG4gIH1cblxuICBjb21waWxlKHNjaGVtYTogYW55KTogVmFsaWRhdG9yIHtcbiAgICB0aGlzLmlkUmVnaXN0cnkuY2xlYXIoKTtcbiAgICBjb25zdCBjb21waWxlZFNjaGVtYSA9IHRoaXMuY29tcGlsZVNjaGVtYShzY2hlbWEpO1xuICAgIHRoaXMucm9vdFNjaGVtYSA9IGNvbXBpbGVkU2NoZW1hO1xuICAgIHRoaXMubGlua1JlZmVyZW5jZXMoY29tcGlsZWRTY2hlbWEpO1xuXG4gICAgaWYgKCFjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWEpID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiSW52YWxpZCBzY2hlbWFcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgIFwiVmFsaWRhdGVfQW55XCIsXG4gICAgICAgICgpID0+IHt9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJvb3RTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgICAgY29uc3QgY2xvbmVkRGF0YSA9IHRoaXMuaW1tdXRhYmxlID8gZGVlcENsb25lKGRhdGEpIDogZGF0YTtcbiAgICAgIGNvbnN0IHJlcyA9IGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSEoY2xvbmVkRGF0YSk7XG5cbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgZGF0YTogY2xvbmVkRGF0YSwgZXJyb3I6IHJlcywgdmFsaWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGRhdGE6IGNsb25lZERhdGEsIGVycm9yOiBudWxsLCB2YWxpZDogdHJ1ZSB9O1xuICAgIH07XG5cbiAgICB2YWxpZGF0ZS5jb21waWxlZFNjaGVtYSA9IGNvbXBpbGVkU2NoZW1hO1xuICAgIHJldHVybiB2YWxpZGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdHJ1ZSkge1xuICAgICAgICBzY2hlbWEgPSB7IGFueU9mOiBbe31dIH07IC8vIEFsd2F5cyB2YWxpZFxuICAgICAgfSBlbHNlIGlmIChzY2hlbWEgPT09IGZhbHNlKSB7XG4gICAgICAgIHNjaGVtYSA9IHsgb25lT2Y6IFtdIH07IC8vIEFsd2F5cyBpbnZhbGlkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSB7IG9uZU9mOiBbc2NoZW1hXSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hOiBDb21waWxlZFNjaGVtYSA9IGRlZXBDbG9uZShzY2hlbWEpIGFzIENvbXBpbGVkU2NoZW1hO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuJGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmlkUmVnaXN0cnkuc2V0KHNjaGVtYS4kaWQsIGNvbXBpbGVkU2NoZW1hKTtcbiAgICB9XG5cbiAgICBpZiAoXCIkcmVmXCIgaW4gc2NoZW1hKSB7XG4gICAgICBjb25zdCByZWZWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoXCIkcmVmXCIpO1xuICAgICAgaWYgKHJlZlZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwiJHJlZlwiLFxuICAgICAgICAgIHNjaGVtYVtcIiRyZWZcIl0sXG4gICAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIixcbiAgICAgICAgICAoZGF0YSkgPT5cbiAgICAgICAgICAgIChyZWZWYWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgY29tcGlsZWRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGRlZmluZUVycm9yLFxuICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29tcGlsZWRTY2hlbWE7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9ySXRlbVtdID0gW107XG4gICAgY29uc3QgYWN0aXZlTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoXCJ0eXBlXCIgaW4gc2NoZW1hKSB7XG4gICAgICBjb25zdCBkZWZpbmVUeXBlRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGVzID0gQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSlcbiAgICAgICAgPyBzY2hlbWEudHlwZVxuICAgICAgICA6IHNjaGVtYS50eXBlLnNwbGl0KFwiLFwiKS5tYXAoKHQ6IHN0cmluZykgPT4gdC50cmltKCkpO1xuXG4gICAgICBjb25zdCB0eXBlRnVuY3Rpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuICAgICAgY29uc3QgdHlwZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZUZ1bmN0aW9ucy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgICAgdHlwZU5hbWVzLnB1c2godmFsaWRhdG9yLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlRnVuY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgICBcInR5cGVcIixcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgICApKFwiSW52YWxpZCB0eXBlIGZvciBzY2hlbWFcIiwgeyBkYXRhOiBzY2hlbWEudHlwZSB9KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNvbWJpbmVkVHlwZVZhbGlkYXRvcjogVmFsaWRhdGVGdW5jdGlvbjtcbiAgICAgIGxldCB0eXBlTWV0aG9kTmFtZSA9IFwiXCI7XG5cbiAgICAgIGlmICh0eXBlRnVuY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0eXBlTWV0aG9kTmFtZSA9IHR5cGVOYW1lc1swXTtcbiAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoIXNpbmdsZVR5cGVGbihkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSB0eXBlTmFtZXMuam9pbihcIl9PUl9cIik7XG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZUZ1bmN0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlQWRhcHRlcjogS2V5d29yZEZ1bmN0aW9uID0gKF9zLCBkYXRhKSA9PlxuICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IoZGF0YSk7XG5cbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGZuOiBnZXROYW1lZEZ1bmN0aW9uKHR5cGVNZXRob2ROYW1lLCB0eXBlQWRhcHRlciksXG4gICAgICAgIGRlZmluZUVycm9yOiBkZWZpbmVUeXBlRXJyb3JcbiAgICAgIH0pO1xuICAgICAgYWN0aXZlTmFtZXMucHVzaCh0eXBlTWV0aG9kTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlLCAkaWQsICRyZWYsICR2YWxpZGF0ZSwgcmVxdWlyZWQsIC4uLm90aGVyS2V5cyB9ID0gc2NoZW1hOyAvLyBFeGNsdWRlIGhhbmRsZWQga2V5c1xuXG4gICAgLy8gSW4gaGVyZSB3ZSBjcmVhdGUgYW4gYXJyYXkgb2Yga2V5cyBwdXR0aW5nIHRoZSByZXF1aXJlIGtleXdvcmQgbGFzdFxuICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQgYWZ0ZXIgZGVmYXVsdHMgYXJlIGFwcGxpZWRcbiAgICBjb25zdCBrZXlPcmRlciA9IHJlcXVpcmVkXG4gICAgICA/IFsuLi5PYmplY3Qua2V5cyhvdGhlcktleXMpLCBcInJlcXVpcmVkXCJdXG4gICAgICA6IE9iamVjdC5rZXlzKG90aGVyS2V5cyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGtleXdvcmRGbiA9IHRoaXMuZ2V0S2V5d29yZChrZXkpO1xuXG4gICAgICBpZiAoa2V5d29yZEZuKSB7XG4gICAgICAgIGNvbnN0IGRlZmluZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHNjaGVtYVtrZXldLFxuICAgICAgICAgIHRoaXMuZmFpbEZhc3RcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZm5OYW1lID0ga2V5d29yZEZuLm5hbWUgfHwga2V5O1xuXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgICAgZm46IGtleXdvcmRGbiBhcyBLZXl3b3JkRnVuY3Rpb24sXG4gICAgICAgICAgZGVmaW5lRXJyb3JcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYWN0aXZlTmFtZXMucHVzaChmbk5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxpdGVyYWxLZXl3b3JkcyA9IFtcImVudW1cIiwgXCJjb25zdFwiLCBcImRlZmF1bHRcIiwgXCJleGFtcGxlc1wiXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlPcmRlcikge1xuICAgICAgaWYgKGxpdGVyYWxLZXl3b3Jkcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYVtrZXldKSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcInByb3BlcnRpZXNcIikge1xuICAgICAgICAgIGZvciAoY29uc3Qgc3ViS2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYVtrZXldKSkge1xuICAgICAgICAgICAgY29tcGlsZWRTY2hlbWFba2V5XVtzdWJLZXldID0gdGhpcy5jb21waWxlU2NoZW1hKFxuICAgICAgICAgICAgICBzY2hlbWFba2V5XVtzdWJLZXldXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYVtrZXldKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYVtrZXldKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYVtrZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNTY2hlbWFMaWtlKHNjaGVtYVtrZXldW2ldKSkge1xuICAgICAgICAgICAgY29tcGlsZWRTY2hlbWFba2V5XVtpXSA9IHRoaXMuY29tcGlsZVNjaGVtYShzY2hlbWFba2V5XVtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNvbXBpbGVkU2NoZW1hO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0b3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdiA9IHZhbGlkYXRvcnNbMF07XG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKGFjdGl2ZU5hbWVzWzBdLCAoZGF0YSkgPT5cbiAgICAgICAgdi5mbihjb21waWxlZFNjaGVtYSwgZGF0YSwgdi5kZWZpbmVFcnJvciwgdGhpcylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZU5hbWUgPSBcIlZhbGlkYXRlX1wiICsgYWN0aXZlTmFtZXMuam9pbihcIl9BTkRfXCIpO1xuXG4gICAgICBjb25zdCBtYXN0ZXJWYWxpZGF0b3I6IFZhbGlkYXRlRnVuY3Rpb24gPSAoZGF0YSkgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2ID0gdmFsaWRhdG9yc1tpXTtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHYuZm4oY29tcGlsZWRTY2hlbWEsIGRhdGEsIHYuZGVmaW5lRXJyb3IsIHRoaXMpO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9O1xuXG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKFxuICAgICAgICBjb21wb3NpdGVOYW1lLFxuICAgICAgICBtYXN0ZXJWYWxpZGF0b3JcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBpbGVkU2NoZW1hIGFzIENvbXBpbGVkU2NoZW1hO1xuICB9XG5cbiAgaXNTY2hlbWFMaWtlKHN1YlNjaGVtYTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKGlzT2JqZWN0KHN1YlNjaGVtYSkpIHtcbiAgICAgIGlmIChcInR5cGVcIiBpbiBzdWJTY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IHN1YktleSBpbiBzdWJTY2hlbWEpIHtcbiAgICAgICAgaWYgKHN1YktleSBpbiB0aGlzLmtleXdvcmRzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBsaW5rUmVmZXJlbmNlcyhyb290OiBDb21waWxlZFNjaGVtYSkge1xuICAgIGNvbnN0IHN0YWNrOiBhbnlbXSA9IFtyb290XTtcblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCk7XG5cbiAgICAgIGlmICghbm9kZSB8fCB0eXBlb2Ygbm9kZSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIG5vZGUuJHJlZiA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICB0eXBlb2Ygbm9kZS4kdmFsaWRhdGUgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICBub2RlLiR2YWxpZGF0ZS5uYW1lID09PSBcIlZhbGlkYXRlX1JlZmVyZW5jZVwiXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVmUGF0aCA9IG5vZGUuJHJlZiBhcyBzdHJpbmc7XG5cbiAgICAgICAgbGV0IHRhcmdldDogYW55ID0gdGhpcy5nZXRTY2hlbWFSZWYocmVmUGF0aCk7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gdGhpcy5nZXRTY2hlbWFCeUlkKHJlZlBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHRhcmdldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgbm9kZS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKFwiVmFsaWRhdGVfUmVmX1RydWVcIiwgKCkgPT4ge30pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgICAgICBcIiRyZWZcIixcbiAgICAgICAgICAgICAgbm9kZSBhcyBhbnksXG4gICAgICAgICAgICAgIHRoaXMuZmFpbEZhc3RcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIG5vZGUuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbihcbiAgICAgICAgICAgICAgXCJWYWxpZGF0ZV9SZWZfRmFsc2VcIixcbiAgICAgICAgICAgICAgKF9kYXRhOiBhbnkpID0+IGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC4kdmFsaWRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG5vZGUuJHZhbGlkYXRlID0gdGFyZ2V0LiR2YWxpZGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBub2RlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbm9kZVtrZXldO1xuICAgICAgICBpZiAoIXZhbHVlKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdmFsdWVbaV07XG4gICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBzdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiTUFZTyxJQUFNQSxFQUFOLGNBQThCQyxNQUNuQ0MsUUFDQUMsS0FDQUMsUUFDQUMsTUFDQUMsV0FBcUIsR0FDckJDLGFBQXVCLEdBQ3ZCQyxLQUNBQyxPQUVRQyxVQUFVQyxFQUFVLElBQUtDLEVBQWtCLEtBQ2pELElBQUlOLEVBQWEsR0FBR0ssS0FBV0UsS0FBS1QsVUFDaENHLEVBQWUsR0FBR0ssSUFZdEIsWUFYeUIsSUFBZEMsS0FBS1YsT0FDVyxpQkFBZFUsS0FBS1YsTUFBcUJVLEtBQUtWLFFBQVFVLEtBQUtKLFNBQ3JESCxHQUFjLElBQUlPLEtBQUtWLFFBRXpCSSxHQUFnQixJQUFJTSxLQUFLVixRQUczQlUsS0FBS04sYUFBZUEsRUFDcEJNLEtBQUtQLFdBQWFBLEVBR2JPLEtBQUtSLE9BQVdRLEtBQUtSLGlCQUFpQkwsRUFJcENhLEtBQUtSLE1BQU1LLFVBQVVKLEVBQVlDLEdBSC9CTSxJQUlYLENBRUFDLFdBQ0UsT0FBT0QsS0FBS0gsV0FDZCxDQUVRSyxXQUNOLE1BQU1DLEVBQWtCLENBQ3RCZCxRQUFTVyxLQUFLWCxRQUNkRSxRQUFTUyxLQUFLVCxRQUNkRCxLQUFNVSxLQUFLVixLQUNYRyxXQUFZTyxLQUFLUCxXQUNqQkMsYUFBY00sS0FBS04sYUFDbkJDLEtBQU1LLEtBQUtMLE1BT2IsT0FKSUssS0FBS1IsUUFDUFcsRUFBS1gsTUFBUVEsS0FBS1IsTUFBTVUsWUFHbkJDLENBQ1QsQ0FFQUMsVUFFRSxPQURBSixLQUFLQyxXQUNFRCxLQUFLRSxVQUNkLENBRUFHLFVBQ0UsTUFBTWIsRUFBUVEsS0FBS0MsV0FDbkIsTUFBTyxDQUNMUixXQUFZRCxFQUFNQyxXQUNsQkMsYUFBY0YsRUFBTUUs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
|